MoarVM-2015.11/MANIFEST0000644000175000017500000016546512623370261013224 0ustar jnthnjnthnMANIFEST .dir-locals.el .gitignore .gitmodules .travis.yml 3rdparty/README.md 3rdparty/libatomic_ops/AUTHORS 3rdparty/libatomic_ops/COPYING 3rdparty/libatomic_ops/ChangeLog 3rdparty/libatomic_ops/README 3rdparty/libatomic_ops/aclocal.m4 3rdparty/libatomic_ops/autogen.sh 3rdparty/libatomic_ops/compile 3rdparty/libatomic_ops/config.guess 3rdparty/libatomic_ops/config.sub 3rdparty/libatomic_ops/configure 3rdparty/libatomic_ops/configure.ac 3rdparty/libatomic_ops/depcomp 3rdparty/libatomic_ops/doc/LICENSING.txt 3rdparty/libatomic_ops/doc/README.txt 3rdparty/libatomic_ops/doc/README_malloc.txt 3rdparty/libatomic_ops/doc/README_stack.txt 3rdparty/libatomic_ops/doc/README_win32.txt 3rdparty/libatomic_ops/install-sh 3rdparty/libatomic_ops/missing 3rdparty/libatomic_ops/src/Makefile.am 3rdparty/libatomic_ops/src/Makefile.in 3rdparty/libatomic_ops/src/atomic_ops.c 3rdparty/libatomic_ops/src/atomic_ops.h 3rdparty/libatomic_ops/src/atomic_ops/ao_version.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.template 3rdparty/libatomic_ops/src/atomic_ops/generalize-small.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-small.template 3rdparty/libatomic_ops/src/atomic_ops/generalize.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/README 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h 3rdparty/libatomic_ops/src/atomic_ops_sysdeps.S 3rdparty/libatomic_ops/src/config.h.in 3rdparty/libtommath/LICENSE 3rdparty/libtommath/bn_error.c 3rdparty/libtommath/bn_fast_mp_invmod.c 3rdparty/libtommath/bn_fast_mp_montgomery_reduce.c 3rdparty/libtommath/bn_fast_s_mp_mul_digs.c 3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.c 3rdparty/libtommath/bn_fast_s_mp_sqr.c 3rdparty/libtommath/bn_mp_2expt.c 3rdparty/libtommath/bn_mp_abs.c 3rdparty/libtommath/bn_mp_add.c 3rdparty/libtommath/bn_mp_add_d.c 3rdparty/libtommath/bn_mp_addmod.c 3rdparty/libtommath/bn_mp_and.c 3rdparty/libtommath/bn_mp_clamp.c 3rdparty/libtommath/bn_mp_clear.c 3rdparty/libtommath/bn_mp_clear_multi.c 3rdparty/libtommath/bn_mp_cmp.c 3rdparty/libtommath/bn_mp_cmp_d.c 3rdparty/libtommath/bn_mp_cmp_mag.c 3rdparty/libtommath/bn_mp_cnt_lsb.c 3rdparty/libtommath/bn_mp_copy.c 3rdparty/libtommath/bn_mp_count_bits.c 3rdparty/libtommath/bn_mp_div.c 3rdparty/libtommath/bn_mp_div_2.c 3rdparty/libtommath/bn_mp_div_2d.c 3rdparty/libtommath/bn_mp_div_3.c 3rdparty/libtommath/bn_mp_div_d.c 3rdparty/libtommath/bn_mp_dr_is_modulus.c 3rdparty/libtommath/bn_mp_dr_reduce.c 3rdparty/libtommath/bn_mp_dr_setup.c 3rdparty/libtommath/bn_mp_exch.c 3rdparty/libtommath/bn_mp_expt_d.c 3rdparty/libtommath/bn_mp_exptmod.c 3rdparty/libtommath/bn_mp_exptmod_fast.c 3rdparty/libtommath/bn_mp_exteuclid.c 3rdparty/libtommath/bn_mp_fread.c 3rdparty/libtommath/bn_mp_fwrite.c 3rdparty/libtommath/bn_mp_gcd.c 3rdparty/libtommath/bn_mp_get_int.c 3rdparty/libtommath/bn_mp_get_long.c 3rdparty/libtommath/bn_mp_grow.c 3rdparty/libtommath/bn_mp_init.c 3rdparty/libtommath/bn_mp_init_copy.c 3rdparty/libtommath/bn_mp_init_multi.c 3rdparty/libtommath/bn_mp_init_set.c 3rdparty/libtommath/bn_mp_init_set_int.c 3rdparty/libtommath/bn_mp_init_size.c 3rdparty/libtommath/bn_mp_invmod.c 3rdparty/libtommath/bn_mp_invmod_slow.c 3rdparty/libtommath/bn_mp_is_square.c 3rdparty/libtommath/bn_mp_jacobi.c 3rdparty/libtommath/bn_mp_karatsuba_mul.c 3rdparty/libtommath/bn_mp_karatsuba_sqr.c 3rdparty/libtommath/bn_mp_lcm.c 3rdparty/libtommath/bn_mp_lshd.c 3rdparty/libtommath/bn_mp_mod.c 3rdparty/libtommath/bn_mp_mod_2d.c 3rdparty/libtommath/bn_mp_mod_d.c 3rdparty/libtommath/bn_mp_montgomery_calc_normalization.c 3rdparty/libtommath/bn_mp_montgomery_reduce.c 3rdparty/libtommath/bn_mp_montgomery_setup.c 3rdparty/libtommath/bn_mp_mul.c 3rdparty/libtommath/bn_mp_mul_2.c 3rdparty/libtommath/bn_mp_mul_2d.c 3rdparty/libtommath/bn_mp_mul_d.c 3rdparty/libtommath/bn_mp_mulmod.c 3rdparty/libtommath/bn_mp_n_root.c 3rdparty/libtommath/bn_mp_neg.c 3rdparty/libtommath/bn_mp_or.c 3rdparty/libtommath/bn_mp_prime_fermat.c 3rdparty/libtommath/bn_mp_prime_is_divisible.c 3rdparty/libtommath/bn_mp_prime_is_prime.c 3rdparty/libtommath/bn_mp_prime_miller_rabin.c 3rdparty/libtommath/bn_mp_prime_next_prime.c 3rdparty/libtommath/bn_mp_prime_rabin_miller_trials.c 3rdparty/libtommath/bn_mp_prime_random_ex.c 3rdparty/libtommath/bn_mp_radix_size.c 3rdparty/libtommath/bn_mp_radix_smap.c 3rdparty/libtommath/bn_mp_rand.c 3rdparty/libtommath/bn_mp_read_radix.c 3rdparty/libtommath/bn_mp_read_signed_bin.c 3rdparty/libtommath/bn_mp_read_unsigned_bin.c 3rdparty/libtommath/bn_mp_reduce.c 3rdparty/libtommath/bn_mp_reduce_2k.c 3rdparty/libtommath/bn_mp_reduce_2k_l.c 3rdparty/libtommath/bn_mp_reduce_2k_setup.c 3rdparty/libtommath/bn_mp_reduce_2k_setup_l.c 3rdparty/libtommath/bn_mp_reduce_is_2k.c 3rdparty/libtommath/bn_mp_reduce_is_2k_l.c 3rdparty/libtommath/bn_mp_reduce_setup.c 3rdparty/libtommath/bn_mp_rshd.c 3rdparty/libtommath/bn_mp_set.c 3rdparty/libtommath/bn_mp_set_int.c 3rdparty/libtommath/bn_mp_set_long.c 3rdparty/libtommath/bn_mp_shrink.c 3rdparty/libtommath/bn_mp_signed_bin_size.c 3rdparty/libtommath/bn_mp_sqr.c 3rdparty/libtommath/bn_mp_sqrmod.c 3rdparty/libtommath/bn_mp_sqrt.c 3rdparty/libtommath/bn_mp_sub.c 3rdparty/libtommath/bn_mp_sub_d.c 3rdparty/libtommath/bn_mp_submod.c 3rdparty/libtommath/bn_mp_to_signed_bin.c 3rdparty/libtommath/bn_mp_to_signed_bin_n.c 3rdparty/libtommath/bn_mp_to_unsigned_bin.c 3rdparty/libtommath/bn_mp_to_unsigned_bin_n.c 3rdparty/libtommath/bn_mp_toom_mul.c 3rdparty/libtommath/bn_mp_toom_sqr.c 3rdparty/libtommath/bn_mp_toradix.c 3rdparty/libtommath/bn_mp_toradix_n.c 3rdparty/libtommath/bn_mp_unsigned_bin_size.c 3rdparty/libtommath/bn_mp_xor.c 3rdparty/libtommath/bn_mp_zero.c 3rdparty/libtommath/bn_prime_tab.c 3rdparty/libtommath/bn_reverse.c 3rdparty/libtommath/bn_s_mp_add.c 3rdparty/libtommath/bn_s_mp_exptmod.c 3rdparty/libtommath/bn_s_mp_mul_digs.c 3rdparty/libtommath/bn_s_mp_mul_high_digs.c 3rdparty/libtommath/bn_s_mp_sqr.c 3rdparty/libtommath/bn_s_mp_sub.c 3rdparty/libtommath/bncore.c 3rdparty/libtommath/changes.txt 3rdparty/libtommath/tommath.h 3rdparty/libtommath/tommath_class.h 3rdparty/libtommath/tommath_superclass.h 3rdparty/msinttypes/inttypes.h 3rdparty/msinttypes/stdint.h 3rdparty/sha1/sha1.c 3rdparty/sha1/sha1.h 3rdparty/tinymt/LICENSE.txt 3rdparty/tinymt/README.txt 3rdparty/tinymt/tinymt64.c 3rdparty/tinymt/tinymt64.h 3rdparty/uthash.h Artistic2.txt CREDITS Configure.pl LICENSE README.markdown VERSION build/Makefile.in build/README.md build/auto.pm build/check.mk.in build/config.c.in build/config.h.in build/gen.list build/help.txt build/mk-moar-pc.in build/probe.pm build/setup.pm build/test.txt check.todo docs/6model-parametric-extensions.markdown docs/ChangeLog docs/README.md docs/arg-passing.markdown docs/bootstrap.markdown docs/bytecode.markdown docs/exceptions.markdown docs/extops.markdown docs/gc.markdown docs/interpreter.markdown docs/japhb-todo.txt docs/jit.md docs/moar.pod docs/release_guide.md docs/reveal.md docs/strings.markdown lib/MAST/Nodes.nqp lib/MAST/Ops.nqp lib/MAST/Ops.p6 lib/README.md ports/macports/Portfile ports/macports/README src/6model/6model.c src/6model/6model.h src/6model/README.md src/6model/bootstrap.c src/6model/bootstrap.h src/6model/containers.c src/6model/containers.h src/6model/parametric.c src/6model/parametric.h src/6model/reprconv.c src/6model/reprconv.h src/6model/reprs.c src/6model/reprs.h src/6model/reprs/CArray.c src/6model/reprs/CArray.h src/6model/reprs/CPPStruct.c src/6model/reprs/CPPStruct.h src/6model/reprs/CPointer.c src/6model/reprs/CPointer.h src/6model/reprs/CStr.c src/6model/reprs/CStr.h src/6model/reprs/CStruct.c src/6model/reprs/CStruct.h src/6model/reprs/CUnion.c src/6model/reprs/CUnion.h src/6model/reprs/ConcBlockingQueue.c src/6model/reprs/ConcBlockingQueue.h src/6model/reprs/ConditionVariable.c src/6model/reprs/ConditionVariable.h src/6model/reprs/HashAttrStore.c src/6model/reprs/HashAttrStore.h src/6model/reprs/KnowHOWAttributeREPR.c src/6model/reprs/KnowHOWAttributeREPR.h src/6model/reprs/KnowHOWREPR.c src/6model/reprs/KnowHOWREPR.h src/6model/reprs/Lexotic.c src/6model/reprs/Lexotic.h src/6model/reprs/MVMArray.c src/6model/reprs/MVMArray.h src/6model/reprs/MVMAsyncTask.c src/6model/reprs/MVMAsyncTask.h src/6model/reprs/MVMCFunction.c src/6model/reprs/MVMCFunction.h src/6model/reprs/MVMCallCapture.c src/6model/reprs/MVMCallCapture.h src/6model/reprs/MVMCode.c src/6model/reprs/MVMCode.h src/6model/reprs/MVMCompUnit.c src/6model/reprs/MVMCompUnit.h src/6model/reprs/MVMContext.c src/6model/reprs/MVMContext.h src/6model/reprs/MVMContinuation.c src/6model/reprs/MVMContinuation.h src/6model/reprs/MVMDLLSym.c src/6model/reprs/MVMDLLSym.h src/6model/reprs/MVMException.c src/6model/reprs/MVMException.h src/6model/reprs/MVMHash.c src/6model/reprs/MVMHash.h src/6model/reprs/MVMIter.c src/6model/reprs/MVMIter.h src/6model/reprs/MVMMultiCache.c src/6model/reprs/MVMMultiCache.h src/6model/reprs/MVMNull.c src/6model/reprs/MVMNull.h src/6model/reprs/MVMOSHandle.c src/6model/reprs/MVMOSHandle.h src/6model/reprs/MVMStaticFrame.c src/6model/reprs/MVMStaticFrame.h src/6model/reprs/MVMString.c src/6model/reprs/MVMString.h src/6model/reprs/MVMThread.c src/6model/reprs/MVMThread.h src/6model/reprs/MultiDimArray.c src/6model/reprs/MultiDimArray.h src/6model/reprs/NFA.c src/6model/reprs/NFA.h src/6model/reprs/NativeCall.c src/6model/reprs/NativeCall.h src/6model/reprs/NativeRef.c src/6model/reprs/NativeRef.h src/6model/reprs/P6bigint.c src/6model/reprs/P6bigint.h src/6model/reprs/P6int.c src/6model/reprs/P6int.h src/6model/reprs/P6num.c src/6model/reprs/P6num.h src/6model/reprs/P6opaque.c src/6model/reprs/P6opaque.h src/6model/reprs/P6str.c src/6model/reprs/P6str.h src/6model/reprs/README.md src/6model/reprs/ReentrantMutex.c src/6model/reprs/ReentrantMutex.h src/6model/reprs/SCRef.c src/6model/reprs/SCRef.h src/6model/reprs/Semaphore.c src/6model/reprs/Semaphore.h src/6model/reprs/Uninstantiable.c src/6model/reprs/Uninstantiable.h src/6model/sc.c src/6model/sc.h src/6model/serialization.c src/6model/serialization.h src/README.md src/bithacks.h src/core/alloc.h src/core/args.c src/core/args.h src/core/bytecode.c src/core/bytecode.h src/core/bytecodedump.c src/core/bytecodedump.h src/core/callsite.c src/core/callsite.h src/core/coerce.c src/core/coerce.h src/core/compunit.c src/core/compunit.h src/core/continuation.c src/core/continuation.h src/core/dll.c src/core/dll.h src/core/exceptions.c src/core/exceptions.h src/core/ext.c src/core/ext.h src/core/fixedsizealloc.c src/core/fixedsizealloc.h src/core/frame.c src/core/frame.h src/core/hll.c src/core/hll.h src/core/instance.h src/core/intcache.c src/core/intcache.h src/core/interp.c src/core/interp.h src/core/loadbytecode.c src/core/loadbytecode.h src/core/nativecall.c src/core/nativecall.h src/core/nativecall_dyncall.c src/core/nativecall_dyncall.h src/core/nativecall_libffi.c src/core/nativecall_libffi.h src/core/oplabels.h src/core/oplist src/core/ops.c src/core/ops.h src/core/threadcontext.c src/core/threadcontext.h src/core/threads.c src/core/threads.h src/core/validation.c src/core/validation.h src/gc/allocation.c src/gc/allocation.h src/gc/collect.c src/gc/collect.h src/gc/debug.h src/gc/finalize.c src/gc/finalize.h src/gc/gen2.c src/gc/gen2.h src/gc/objectid.c src/gc/objectid.h src/gc/orchestrate.c src/gc/orchestrate.h src/gc/roots.c src/gc/roots.h src/gc/wb.c src/gc/wb.h src/gc/worklist.c src/gc/worklist.h src/gcc_diag.h src/gen/IGNOREME src/instrument/crossthreadwrite.c src/instrument/crossthreadwrite.h src/io/asyncsocket.c src/io/asyncsocket.h src/io/dirops.c src/io/dirops.h src/io/eventloop.c src/io/eventloop.h src/io/fileops.c src/io/fileops.h src/io/filewatchers.c src/io/filewatchers.h src/io/io.c src/io/io.h src/io/procops.c src/io/procops.h src/io/signals.c src/io/signals.h src/io/syncfile.c src/io/syncfile.h src/io/syncpipe.c src/io/syncpipe.h src/io/syncsocket.c src/io/syncsocket.h src/io/syncstream.c src/io/syncstream.h src/io/timers.c src/io/timers.h src/jit/compile.c src/jit/compile.h src/jit/emit.h src/jit/emit_x64.dasc src/jit/graph.c src/jit/graph.h src/jit/log.c src/jit/log.h src/jit/stub.c src/main.c src/mast/compiler.c src/mast/compiler.h src/mast/driver.c src/mast/driver.h src/mast/nodes.h src/math/bigintops.c src/math/bigintops.h src/math/num.c src/math/num.h src/moar.c src/moar.h src/platform/inttypes.h src/platform/io.h src/platform/mmap.h src/platform/posix/mmap.c src/platform/posix/sys.c src/platform/posix/time.c src/platform/setjmp.h src/platform/stdint.h src/platform/sys.h src/platform/threads.h src/platform/time.h src/platform/win32/io.c src/platform/win32/mmap.c src/platform/win32/sys.c src/platform/win32/time.c src/profiler/instrument.c src/profiler/instrument.h src/profiler/log.c src/profiler/log.h src/profiler/profile.c src/profiler/profile.h src/spesh/args.c src/spesh/args.h src/spesh/candidate.c src/spesh/candidate.h src/spesh/codegen.c src/spesh/codegen.h src/spesh/deopt.c src/spesh/deopt.h src/spesh/dump.c src/spesh/dump.h src/spesh/facts.c src/spesh/facts.h src/spesh/graph.c src/spesh/graph.h src/spesh/inline.c src/spesh/inline.h src/spesh/log.c src/spesh/log.h src/spesh/manipulate.c src/spesh/manipulate.h src/spesh/optimize.c src/spesh/optimize.h src/spesh/osr.c src/spesh/osr.h src/spesh/threshold.c src/spesh/threshold.h src/strings/ascii.c src/strings/ascii.h src/strings/decode_stream.c src/strings/decode_stream.h src/strings/iter.h src/strings/latin1.c src/strings/latin1.h src/strings/nfg.c src/strings/nfg.h src/strings/normalize.c src/strings/normalize.h src/strings/ops.c src/strings/ops.h src/strings/unicode.h src/strings/unicode_db.c src/strings/unicode_gen.h src/strings/unicode_ops.c src/strings/utf16.c src/strings/utf16.h src/strings/utf8.c src/strings/utf8.h src/strings/utf8_c8.c src/strings/utf8_c8.h src/strings/windows1252.c src/strings/windows1252.h src/types.h tools/colorize_spesh.p6 tools/count-jit-bail-ops.p6 tools/dynvarcost tools/graph_spesh.p6 tools/interp_backtrace_enhancer.p6 tools/lib/MAST/.empty tools/moar-gdb.py tools/parse_jitgraph.p6 tools/release.sh tools/spesh_diff.p6 tools/ucd2c.pl tools/update_ops.p6 3rdparty/dyncall/.gitignore 3rdparty/dyncall/AUTHORS 3rdparty/dyncall/BUGS 3rdparty/dyncall/CMakeLists.txt 3rdparty/dyncall/ChangeLog 3rdparty/dyncall/LICENSE 3rdparty/dyncall/Makefile.M 3rdparty/dyncall/Makefile.embedded 3rdparty/dyncall/Makefile.generic 3rdparty/dyncall/Nmakefile 3rdparty/dyncall/README 3rdparty/dyncall/ToDo 3rdparty/dyncall/autovar/LICENSE.txt 3rdparty/dyncall/autovar/README.txt 3rdparty/dyncall/autovar/autovar_ABI.h 3rdparty/dyncall/autovar/autovar_ARCH.h 3rdparty/dyncall/autovar/autovar_CC.h 3rdparty/dyncall/autovar/autovar_OS.h 3rdparty/dyncall/autovar/autovar_OSFAMILY.h 3rdparty/dyncall/buildsys/cmake/Modules/FindDynCall.cmake 3rdparty/dyncall/buildsys/cmake/Modules/FindDynCallback.cmake 3rdparty/dyncall/buildsys/cmake/Modules/FindDynLoad.cmake 3rdparty/dyncall/buildsys/cmake/Modules/UseLATEX.cmake 3rdparty/dyncall/buildsys/dynmake/Makefile.base.M 3rdparty/dyncall/buildsys/dynmake/dynmake.bat 3rdparty/dyncall/buildsys/dynmake/dynmake.sh 3rdparty/dyncall/buildsys/lua/Makefile 3rdparty/dyncall/buildsys/lua/README.txt 3rdparty/dyncall/buildsys/lua/bootstrap.sh 3rdparty/dyncall/buildsys/lua/cleanup.sh 3rdparty/dyncall/buildsys/lua/mkfile 3rdparty/dyncall/buildsys/lua/setenv.sh 3rdparty/dyncall/buildsys/mk/app.mk 3rdparty/dyncall/buildsys/mk/dirs.mk 3rdparty/dyncall/buildsys/mk/epilog.mk 3rdparty/dyncall/buildsys/mk/lib.mk 3rdparty/dyncall/buildsys/mk/pcc.mk 3rdparty/dyncall/buildsys/mk/prolog.mk 3rdparty/dyncall/buildsys/nmake/common.nmake 3rdparty/dyncall/buildsys/nmake/epilog.nmake 3rdparty/dyncall/buildsys/nmake/prolog.nmake 3rdparty/dyncall/buildsys/nmake/tool_gcc.nmake 3rdparty/dyncall/buildsys/nmake/tool_msvc.nmake 3rdparty/dyncall/buildsys/scripts/batch-build-linux.sh 3rdparty/dyncall/buildsys/scripts/batch-build-minix.sh 3rdparty/dyncall/buildsys/scripts/batch-build-psp.sh 3rdparty/dyncall/buildsys/scripts/conf-nds.bat 3rdparty/dyncall/buildsys/scripts/setenv-cross-ios.sh 3rdparty/dyncall/buildsys/scripts/setenv-sdk-ios.sh 3rdparty/dyncall/buildsys/vs2005/dyncall/dyncall.vcproj 3rdparty/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj 3rdparty/dyncall/buildsys/vs2005/vs2005.sln 3rdparty/dyncall/configure 3rdparty/dyncall/configure.bat 3rdparty/dyncall/configure.rc 3rdparty/dyncall/doc/Description.txt 3rdparty/dyncall/doc/License.txt 3rdparty/dyncall/doc/Makefile.generic 3rdparty/dyncall/doc/README-Cross.txt 3rdparty/dyncall/doc/README.CMake 3rdparty/dyncall/doc/README.Generic 3rdparty/dyncall/doc/README.MacOSX 3rdparty/dyncall/doc/README.Minix 3rdparty/dyncall/doc/README.NDS 3rdparty/dyncall/doc/README.PSP 3rdparty/dyncall/doc/README.SunOS 3rdparty/dyncall/doc/README.Windows 3rdparty/dyncall/doc/README.embedded 3rdparty/dyncall/doc/README.iOS 3rdparty/dyncall/doc/manual/CMakeLists.txt 3rdparty/dyncall/doc/manual/Makefile.generic 3rdparty/dyncall/doc/manual/Nmakefile 3rdparty/dyncall/doc/manual/callconvs/callconv_arm32.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_arm64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_mips.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_mips64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_ppc32.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_ppc64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_sparc.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_sparc64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_x64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_x86.tex 3rdparty/dyncall/doc/manual/dyncall_logo.eps 3rdparty/dyncall/doc/manual/dyncall_logo.pdf 3rdparty/dyncall/doc/manual/dyncall_logo.svg 3rdparty/dyncall/doc/manual/dyncall_watermark.eps 3rdparty/dyncall/doc/manual/dyncall_watermark.pdf 3rdparty/dyncall/doc/manual/dyncall_watermark.svg 3rdparty/dyncall/doc/manual/manual.tex 3rdparty/dyncall/doc/manual/manual_bindings.tex 3rdparty/dyncall/doc/manual/manual_build.tex 3rdparty/dyncall/doc/manual/manual_cc.tex 3rdparty/dyncall/doc/manual/manual_design.tex 3rdparty/dyncall/doc/manual/manual_devel.tex 3rdparty/dyncall/doc/manual/manual_dyncall_api.tex 3rdparty/dyncall/doc/manual/manual_dyncallback_api.tex 3rdparty/dyncall/doc/manual/manual_dynload_api.tex 3rdparty/dyncall/doc/manual/manual_epilog.tex 3rdparty/dyncall/doc/manual/manual_literature.tex 3rdparty/dyncall/doc/manual/manual_motivation.tex 3rdparty/dyncall/doc/manual/manual_overview.tex 3rdparty/dyncall/doc/manual/manual_tex4ht.cfg 3rdparty/dyncall/doc/manual/manual_title.tex 3rdparty/dyncall/dynMakefile 3rdparty/dyncall/dyncall/CMakeLists.txt 3rdparty/dyncall/dyncall/DynCallConfig.cmake 3rdparty/dyncall/dyncall/Makefile.M 3rdparty/dyncall/dyncall/Makefile.embedded 3rdparty/dyncall/dyncall/Makefile.generic 3rdparty/dyncall/dyncall/Nmakefile 3rdparty/dyncall/dyncall/README-Developer.txt 3rdparty/dyncall/dyncall/README.txt 3rdparty/dyncall/dyncall/TODO 3rdparty/dyncall/dyncall/dynMakefile 3rdparty/dyncall/dyncall/dyncall.3 3rdparty/dyncall/dyncall/dyncall.h 3rdparty/dyncall/dyncall/dyncall_alloc.h 3rdparty/dyncall/dyncall/dyncall_api.c 3rdparty/dyncall/dyncall/dyncall_call.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_apple.s 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s 3rdparty/dyncall/dyncall/dyncall_call_arm64.S 3rdparty/dyncall/dyncall/dyncall_call_arm64.h 3rdparty/dyncall/dyncall/dyncall_call_mips.h 3rdparty/dyncall/dyncall/dyncall_call_mips_eabi.h 3rdparty/dyncall/dyncall/dyncall_call_mips_eabi_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_gas.S 3rdparty/dyncall/dyncall/dyncall_call_mips_n32.h 3rdparty/dyncall/dyncall/dyncall_call_mips_n32_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_n64.h 3rdparty/dyncall/dyncall/dyncall_call_mips_n64_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_o32.h 3rdparty/dyncall/dyncall/dyncall_call_mips_o32_gas.s 3rdparty/dyncall/dyncall/dyncall_call_ppc32.S 3rdparty/dyncall/dyncall/dyncall_call_ppc32.h 3rdparty/dyncall/dyncall/dyncall_call_ppc64.S 3rdparty/dyncall/dyncall/dyncall_call_ppc64.h 3rdparty/dyncall/dyncall/dyncall_call_sparc.S 3rdparty/dyncall/dyncall/dyncall_call_sparc.h 3rdparty/dyncall/dyncall/dyncall_call_sparc64.S 3rdparty/dyncall/dyncall/dyncall_call_sparc64.h 3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.S 3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.h 3rdparty/dyncall/dyncall/dyncall_call_x64-att.S 3rdparty/dyncall/dyncall/dyncall_call_x64.S 3rdparty/dyncall/dyncall/dyncall_call_x64.h 3rdparty/dyncall/dyncall/dyncall_call_x64_generic_masm.asm 3rdparty/dyncall/dyncall/dyncall_call_x86.S 3rdparty/dyncall/dyncall/dyncall_call_x86.h 3rdparty/dyncall/dyncall/dyncall_call_x86_8a.s 3rdparty/dyncall/dyncall/dyncall_call_x86_generic_masm.asm 3rdparty/dyncall/dyncall/dyncall_call_x86_nasm.asm 3rdparty/dyncall/dyncall/dyncall_callf.c 3rdparty/dyncall/dyncall/dyncall_callf.h 3rdparty/dyncall/dyncall/dyncall_callvm.c 3rdparty/dyncall/dyncall/dyncall_callvm.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm64.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm64.h 3rdparty/dyncall/dyncall/dyncall_callvm_base.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n32.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.h 3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.c 3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.h 3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.c 3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.h 3rdparty/dyncall/dyncall/dyncall_callvm_x64.c 3rdparty/dyncall/dyncall/dyncall_callvm_x64.h 3rdparty/dyncall/dyncall/dyncall_callvm_x86.c 3rdparty/dyncall/dyncall/dyncall_callvm_x86.h 3rdparty/dyncall/dyncall/dyncall_config.h 3rdparty/dyncall/dyncall/dyncall_macros.h 3rdparty/dyncall/dyncall/dyncall_signature.h 3rdparty/dyncall/dyncall/dyncall_struct.c 3rdparty/dyncall/dyncall/dyncall_struct.h 3rdparty/dyncall/dyncall/dyncall_types.h 3rdparty/dyncall/dyncall/dyncall_utils.h 3rdparty/dyncall/dyncall/dyncall_value.h 3rdparty/dyncall/dyncall/dyncall_vector.c 3rdparty/dyncall/dyncall/dyncall_vector.h 3rdparty/dyncall/dyncall/gen-masm.sh 3rdparty/dyncall/dyncall/mkfile 3rdparty/dyncall/dyncallback/CMakeLists.txt 3rdparty/dyncall/dyncallback/DynCallbackConfig.cmake 3rdparty/dyncall/dyncallback/Makefile.M 3rdparty/dyncall/dyncallback/Makefile.embedded 3rdparty/dyncall/dyncallback/Makefile.generic 3rdparty/dyncall/dyncallback/Nmakefile 3rdparty/dyncall/dyncallback/README.txt 3rdparty/dyncall/dyncallback/TODO 3rdparty/dyncall/dyncallback/dynMakefile 3rdparty/dyncall/dyncallback/dyncall_alloc_wx.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx.h 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_malloc.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_mmap.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_win32.c 3rdparty/dyncall/dyncallback/dyncall_args.c 3rdparty/dyncall/dyncallback/dyncall_args.h 3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_args_arm64.c 3rdparty/dyncall/dyncallback/dyncall_args_mips.c 3rdparty/dyncall/dyncallback/dyncall_args_mips.h 3rdparty/dyncall/dyncallback/dyncall_args_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_args_ppc32_sysv.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_args_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_args_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_args_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_args_sparc64.h 3rdparty/dyncall/dyncallback/dyncall_args_x64.c 3rdparty/dyncall/dyncallback/dyncall_args_x64.h 3rdparty/dyncall/dyncallback/dyncall_args_x86.c 3rdparty/dyncall/dyncallback/dyncall_args_x86.h 3rdparty/dyncall/dyncallback/dyncall_callback.c 3rdparty/dyncall/dyncallback/dyncall_callback.h 3rdparty/dyncall/dyncallback/dyncall_callback_arch.S 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_gas.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm64.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm64.s 3rdparty/dyncall/dyncallback/dyncall_callback_mips.c 3rdparty/dyncall/dyncallback/dyncall_callback_mips.h 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.S 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.S 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.s 3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.s 3rdparty/dyncall/dyncallback/dyncall_callback_x64.S 3rdparty/dyncall/dyncallback/dyncall_callback_x64.c 3rdparty/dyncall/dyncallback/dyncall_callback_x64.h 3rdparty/dyncall/dyncallback/dyncall_callback_x64_masm.asm 3rdparty/dyncall/dyncallback/dyncall_callback_x86.S 3rdparty/dyncall/dyncallback/dyncall_callback_x86.c 3rdparty/dyncall/dyncallback/dyncall_callback_x86.h 3rdparty/dyncall/dyncallback/dyncall_callback_x86_8a.s 3rdparty/dyncall/dyncallback/dyncall_callback_x86_masm.asm 3rdparty/dyncall/dyncallback/dyncall_thunk.c 3rdparty/dyncall/dyncallback/dyncall_thunk.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_mips.c 3rdparty/dyncall/dyncallback/dyncall_thunk_mips.h 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32_sysv.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_x64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_x64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_x86.c 3rdparty/dyncall/dyncallback/dyncall_thunk_x86.h 3rdparty/dyncall/dyncallback/dyncallback.3 3rdparty/dyncall/dyncallback/gen-masm.sh 3rdparty/dyncall/dyncallback/mkfile 3rdparty/dyncall/dynload/CMakeLists.txt 3rdparty/dyncall/dynload/DynLoadConfig.cmake 3rdparty/dyncall/dynload/Makefile.M 3rdparty/dyncall/dynload/Makefile.embedded 3rdparty/dyncall/dynload/Makefile.generic 3rdparty/dyncall/dynload/Nmakefile 3rdparty/dyncall/dynload/README.txt 3rdparty/dyncall/dynload/TODO 3rdparty/dyncall/dynload/dynMakefile 3rdparty/dyncall/dynload/dynload.3 3rdparty/dyncall/dynload/dynload.c 3rdparty/dyncall/dynload/dynload.h 3rdparty/dyncall/dynload/dynload_alloc.h 3rdparty/dyncall/dynload/dynload_darwin.c 3rdparty/dyncall/dynload/dynload_syms.c 3rdparty/dyncall/dynload/dynload_syms_elf.c 3rdparty/dyncall/dynload/dynload_syms_mach-o.c 3rdparty/dyncall/dynload/dynload_syms_pe.c 3rdparty/dyncall/dynload/dynload_unix.c 3rdparty/dyncall/dynload/dynload_windows.c 3rdparty/dyncall/mkfile 3rdparty/dyncall/portasm/README.txt 3rdparty/dyncall/portasm/gen-masm.sh 3rdparty/dyncall/portasm/portasm-arm.S 3rdparty/dyncall/portasm/portasm-ppc.S 3rdparty/dyncall/portasm/portasm-x64-att.S 3rdparty/dyncall/portasm/portasm-x86.S 3rdparty/dyncall/test/CMakeLists.txt 3rdparty/dyncall/test/Makefile.M 3rdparty/dyncall/test/Makefile.embedded 3rdparty/dyncall/test/Makefile.generic 3rdparty/dyncall/test/Nmakefile 3rdparty/dyncall/test/arm-thumb-interwork/Makefile-default.config 3rdparty/dyncall/test/arm-thumb-interwork/Makefile-thumb.config 3rdparty/dyncall/test/arm-thumb-interwork/README.txt 3rdparty/dyncall/test/arm-thumb-interwork/build.sh 3rdparty/dyncall/test/call_suite/Makefile.M 3rdparty/dyncall/test/call_suite/Makefile.embedded 3rdparty/dyncall/test/call_suite/Makefile.generic 3rdparty/dyncall/test/call_suite/Nmakefile 3rdparty/dyncall/test/call_suite/README.txt 3rdparty/dyncall/test/call_suite/cases.c 3rdparty/dyncall/test/call_suite/cases.h 3rdparty/dyncall/test/call_suite/cases.txt 3rdparty/dyncall/test/call_suite/config.lua 3rdparty/dyncall/test/call_suite/design.txt 3rdparty/dyncall/test/call_suite/dynMakefile 3rdparty/dyncall/test/call_suite/globals.c 3rdparty/dyncall/test/call_suite/globals.h 3rdparty/dyncall/test/call_suite/invoke.c 3rdparty/dyncall/test/call_suite/main.c 3rdparty/dyncall/test/call_suite/mk-cases.lua 3rdparty/dyncall/test/call_suite/mkfile 3rdparty/dyncall/test/call_suite/rand-sig.lua 3rdparty/dyncall/test/callback_plain/CMakeLists.txt 3rdparty/dyncall/test/callback_plain/Makefile.M 3rdparty/dyncall/test/callback_plain/Makefile.embedded 3rdparty/dyncall/test/callback_plain/Makefile.generic 3rdparty/dyncall/test/callback_plain/Nmakefile 3rdparty/dyncall/test/callback_plain/callback_plain.c 3rdparty/dyncall/test/callback_plain/dynMakefile 3rdparty/dyncall/test/callback_plain/mkfile 3rdparty/dyncall/test/callback_suite/CMakeLists.txt 3rdparty/dyncall/test/callback_suite/Makefile.M 3rdparty/dyncall/test/callback_suite/Makefile.embedded 3rdparty/dyncall/test/callback_suite/Makefile.generic 3rdparty/dyncall/test/callback_suite/Nmakefile 3rdparty/dyncall/test/callback_suite/README.txt 3rdparty/dyncall/test/callback_suite/_auto_config.h 3rdparty/dyncall/test/callback_suite/_auto_invoke_macros.h 3rdparty/dyncall/test/callback_suite/_auto_invoke_table.h 3rdparty/dyncall/test/callback_suite/_auto_invokers.h 3rdparty/dyncall/test/callback_suite/_auto_signatures.txt 3rdparty/dyncall/test/callback_suite/_auto_sigstrings.h 3rdparty/dyncall/test/callback_suite/config-random.lua 3rdparty/dyncall/test/callback_suite/config-stress1.lua 3rdparty/dyncall/test/callback_suite/config.lua 3rdparty/dyncall/test/callback_suite/do_test.c 3rdparty/dyncall/test/callback_suite/dynMakefile 3rdparty/dyncall/test/callback_suite/dyncall_value_set.h 3rdparty/dyncall/test/callback_suite/env.c 3rdparty/dyncall/test/callback_suite/env.h 3rdparty/dyncall/test/callback_suite/handler.c 3rdparty/dyncall/test/callback_suite/invokers.c 3rdparty/dyncall/test/callback_suite/invokers.h 3rdparty/dyncall/test/callback_suite/main.c 3rdparty/dyncall/test/callback_suite/make-config.lua 3rdparty/dyncall/test/callback_suite/make-cstrings.lua 3rdparty/dyncall/test/callback_suite/make-invoke-macros.lua 3rdparty/dyncall/test/callback_suite/make-invoke-table.lua 3rdparty/dyncall/test/callback_suite/make-invokers.lua 3rdparty/dyncall/test/callback_suite/make-signatures.lua 3rdparty/dyncall/test/callback_suite/mkfile 3rdparty/dyncall/test/callback_suite/print.c 3rdparty/dyncall/test/callback_suite/print.h 3rdparty/dyncall/test/callback_suite/signature_utils.c 3rdparty/dyncall/test/callback_suite/signature_utils.h 3rdparty/dyncall/test/callback_suite/sigstrings.c 3rdparty/dyncall/test/callback_suite/sigstrings.h 3rdparty/dyncall/test/callback_suite/stress1.cfg 3rdparty/dyncall/test/callf/CMakeLists.txt 3rdparty/dyncall/test/callf/Makefile.M 3rdparty/dyncall/test/callf/Makefile.embedded 3rdparty/dyncall/test/callf/Makefile.generic 3rdparty/dyncall/test/callf/Nmakefile 3rdparty/dyncall/test/callf/dynMakefile 3rdparty/dyncall/test/callf/main.c 3rdparty/dyncall/test/callf/mkfile 3rdparty/dyncall/test/common/platformInit.h 3rdparty/dyncall/test/dynMakefile 3rdparty/dyncall/test/ellipsis/CMakeLists.txt 3rdparty/dyncall/test/ellipsis/Makefile.M 3rdparty/dyncall/test/ellipsis/Makefile.embedded 3rdparty/dyncall/test/ellipsis/Makefile.generic 3rdparty/dyncall/test/ellipsis/Nmakefile 3rdparty/dyncall/test/ellipsis/README.txt 3rdparty/dyncall/test/ellipsis/case.h 3rdparty/dyncall/test/ellipsis/config.h 3rdparty/dyncall/test/ellipsis/dynMakefile 3rdparty/dyncall/test/ellipsis/ellipsis.cc 3rdparty/dyncall/test/ellipsis/main.cc 3rdparty/dyncall/test/ellipsis/mkcase.py 3rdparty/dyncall/test/gen-masm/Makefile 3rdparty/dyncall/test/gen-masm/call_x64.S 3rdparty/dyncall/test/gen-masm/call_x64.masm 3rdparty/dyncall/test/gen-masm/call_x86.S 3rdparty/dyncall/test/gen-masm/call_x86.masm 3rdparty/dyncall/test/gen-masm/gen_masm.sh 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.darwin 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.linux 3rdparty/dyncall/test/hacking-arm-thumb-interwork/README.txt 3rdparty/dyncall/test/hacking-arm-thumb-interwork/arm.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/Makefile 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/diff-generic.sh 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.S 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/test.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/thumb.c 3rdparty/dyncall/test/hacking-mips/Makefile 3rdparty/dyncall/test/hacking-mips/README.txt 3rdparty/dyncall/test/hacking-mips/call.c 3rdparty/dyncall/test/hacking-mips/calls.c 3rdparty/dyncall/test/hacking-mips/common.h 3rdparty/dyncall/test/hacking-mips/dispatch.c 3rdparty/dyncall/test/hacking-mips/f.c 3rdparty/dyncall/test/hacking-mips/f0.c 3rdparty/dyncall/test/hacking-mips/funs.c 3rdparty/dyncall/test/hacking-mips/main.c 3rdparty/dyncall/test/hacking-mips/node.c 3rdparty/dyncall/test/hacking-mips/prolog.c 3rdparty/dyncall/test/hacking-mips/retn.c 3rdparty/dyncall/test/makepkg.sh 3rdparty/dyncall/test/malloc_wx/CMakeLists.txt 3rdparty/dyncall/test/malloc_wx/Makefile.M 3rdparty/dyncall/test/malloc_wx/Makefile.embedded 3rdparty/dyncall/test/malloc_wx/Makefile.generic 3rdparty/dyncall/test/malloc_wx/Nmakefile 3rdparty/dyncall/test/malloc_wx/dynMakefile 3rdparty/dyncall/test/malloc_wx/mkfile 3rdparty/dyncall/test/malloc_wx/test_wx.c 3rdparty/dyncall/test/mkfile 3rdparty/dyncall/test/nm/CMakeLists.txt 3rdparty/dyncall/test/nm/Makefile.M 3rdparty/dyncall/test/nm/Makefile.embedded 3rdparty/dyncall/test/nm/Makefile.generic 3rdparty/dyncall/test/nm/Nmakefile 3rdparty/dyncall/test/nm/dynMakefile 3rdparty/dyncall/test/nm/nm.c 3rdparty/dyncall/test/plain/CMakeLists.txt 3rdparty/dyncall/test/plain/Makefile.M 3rdparty/dyncall/test/plain/Makefile.embedded 3rdparty/dyncall/test/plain/Makefile.generic 3rdparty/dyncall/test/plain/Nmakefile 3rdparty/dyncall/test/plain/dynMakefile 3rdparty/dyncall/test/plain/mkfile 3rdparty/dyncall/test/plain/test_framework.h 3rdparty/dyncall/test/plain/test_main.c 3rdparty/dyncall/test/plain/test_structs.c 3rdparty/dyncall/test/plain_c++/CMakeLists.txt 3rdparty/dyncall/test/plain_c++/Makefile.M 3rdparty/dyncall/test/plain_c++/Makefile.embedded 3rdparty/dyncall/test/plain_c++/Makefile.generic 3rdparty/dyncall/test/plain_c++/Nmakefile 3rdparty/dyncall/test/plain_c++/dynMakefile 3rdparty/dyncall/test/plain_c++/mkfile 3rdparty/dyncall/test/plain_c++/test_framework.h 3rdparty/dyncall/test/plain_c++/test_main.cc 3rdparty/dyncall/test/resolve_self/Makefile.M 3rdparty/dyncall/test/resolve_self/Makefile.embedded 3rdparty/dyncall/test/resolve_self/Makefile.generic 3rdparty/dyncall/test/resolve_self/Nmakefile 3rdparty/dyncall/test/resolve_self/README.txt 3rdparty/dyncall/test/resolve_self/dynMakefile 3rdparty/dyncall/test/resolve_self/main.c 3rdparty/dyncall/test/runalltests.bat 3rdparty/dyncall/test/runalltests.sh 3rdparty/dyncall/test/samples/calls/d16.c 3rdparty/dyncall/test/samples/calls/d20.c 3rdparty/dyncall/test/samples/calls/d40.c 3rdparty/dyncall/test/samples/calls/f16.c 3rdparty/dyncall/test/samples/calls/f20.c 3rdparty/dyncall/test/samples/calls/f40.c 3rdparty/dyncall/test/samples/calls/fd40.c 3rdparty/dyncall/test/samples/calls/i3.c 3rdparty/dyncall/test/samples/calls/i7.c 3rdparty/dyncall/test/samples/calls/id40.c 3rdparty/dyncall/test/samples/calls/l16.c 3rdparty/dyncall/test/samples/calls/many.c 3rdparty/dyncall/test/samples/composite/args.asm 3rdparty/dyncall/test/samples/composite/args.c 3rdparty/dyncall/test/samples/composite/args.s 3rdparty/dyncall/test/samples/composite/build.bat 3rdparty/dyncall/test/samples/composite/makefile 3rdparty/dyncall/test/sharedlib/CMakeLists.txt 3rdparty/dyncall/test/sharedlib/Makefile.embedded 3rdparty/dyncall/test/sharedlib/sharedlib.c 3rdparty/dyncall/test/sign/Makefile.generic 3rdparty/dyncall/test/sign/sign.c 3rdparty/dyncall/test/suite/CMakeLists.txt 3rdparty/dyncall/test/suite/Makefile.M 3rdparty/dyncall/test/suite/Makefile.embedded 3rdparty/dyncall/test/suite/Makefile.generic 3rdparty/dyncall/test/suite/Nmakefile 3rdparty/dyncall/test/suite/README.txt 3rdparty/dyncall/test/suite/case.c 3rdparty/dyncall/test/suite/case.h 3rdparty/dyncall/test/suite/config.h 3rdparty/dyncall/test/suite/dynMakefile 3rdparty/dyncall/test/suite/main.c 3rdparty/dyncall/test/suite/mkcase.py 3rdparty/dyncall/test/suite/mkfile 3rdparty/dyncall/test/suite2/CMakeLists.txt 3rdparty/dyncall/test/suite2/Makefile.M 3rdparty/dyncall/test/suite2/Makefile.embedded 3rdparty/dyncall/test/suite2/Makefile.generic 3rdparty/dyncall/test/suite2/Nmakefile 3rdparty/dyncall/test/suite2/case.cc 3rdparty/dyncall/test/suite2/case.h 3rdparty/dyncall/test/suite2/config.h 3rdparty/dyncall/test/suite2/design.cfg 3rdparty/dyncall/test/suite2/dynMakefile 3rdparty/dyncall/test/suite2/funcinfo.h 3rdparty/dyncall/test/suite2/ints.cfg 3rdparty/dyncall/test/suite2/main.cc 3rdparty/dyncall/test/suite2/mkcase.py 3rdparty/dyncall/test/suite2/rand.py 3rdparty/dyncall/test/suite2/stress1.cfg 3rdparty/dyncall/test/suite2_x86win32fast/CMakeLists.txt 3rdparty/dyncall/test/suite2_x86win32fast/Makefile.M 3rdparty/dyncall/test/suite2_x86win32fast/Makefile.generic 3rdparty/dyncall/test/suite2_x86win32fast/Nmakefile 3rdparty/dyncall/test/suite2_x86win32fast/case.cc 3rdparty/dyncall/test/suite2_x86win32fast/case.h 3rdparty/dyncall/test/suite2_x86win32fast/config.h 3rdparty/dyncall/test/suite2_x86win32fast/design.cfg 3rdparty/dyncall/test/suite2_x86win32fast/dynMakefile 3rdparty/dyncall/test/suite2_x86win32fast/funcinfo.h 3rdparty/dyncall/test/suite2_x86win32fast/main.cc 3rdparty/dyncall/test/suite2_x86win32fast/mkcase.py 3rdparty/dyncall/test/suite2_x86win32fast/rand.py 3rdparty/dyncall/test/suite2_x86win32std/CMakeLists.txt 3rdparty/dyncall/test/suite2_x86win32std/Makefile.M 3rdparty/dyncall/test/suite2_x86win32std/Makefile.generic 3rdparty/dyncall/test/suite2_x86win32std/Nmakefile 3rdparty/dyncall/test/suite2_x86win32std/case.cc 3rdparty/dyncall/test/suite2_x86win32std/case.h 3rdparty/dyncall/test/suite2_x86win32std/config.h 3rdparty/dyncall/test/suite2_x86win32std/design.cfg 3rdparty/dyncall/test/suite2_x86win32std/dynMakefile 3rdparty/dyncall/test/suite2_x86win32std/funcinfo.h 3rdparty/dyncall/test/suite2_x86win32std/main.cc 3rdparty/dyncall/test/suite2_x86win32std/mkcase.py 3rdparty/dyncall/test/suite2_x86win32std/rand.py 3rdparty/dyncall/test/suite3/CMakeLists.txt 3rdparty/dyncall/test/suite3/Makefile.M 3rdparty/dyncall/test/suite3/Makefile.embedded 3rdparty/dyncall/test/suite3/Makefile.generic 3rdparty/dyncall/test/suite3/Nmakefile 3rdparty/dyncall/test/suite3/README.txt 3rdparty/dyncall/test/suite3/case.cc 3rdparty/dyncall/test/suite3/case.h 3rdparty/dyncall/test/suite3/config.h 3rdparty/dyncall/test/suite3/dynMakefile 3rdparty/dyncall/test/suite3/main.cc 3rdparty/dyncall/test/suite3/mkcase.py 3rdparty/dyncall/test/suite_floats/CMakeLists.txt 3rdparty/dyncall/test/suite_floats/Makefile.M 3rdparty/dyncall/test/suite_floats/Makefile.embedded 3rdparty/dyncall/test/suite_floats/Makefile.generic 3rdparty/dyncall/test/suite_floats/Nmakefile 3rdparty/dyncall/test/suite_floats/README.txt 3rdparty/dyncall/test/suite_floats/case.cc 3rdparty/dyncall/test/suite_floats/case.h 3rdparty/dyncall/test/suite_floats/config.h 3rdparty/dyncall/test/suite_floats/dynMakefile 3rdparty/dyncall/test/suite_floats/main.cc 3rdparty/dyncall/test/suite_floats/mkcase.py 3rdparty/dyncall/test/suite_x86win32fast/CMakeLists.txt 3rdparty/dyncall/test/suite_x86win32fast/Makefile.M 3rdparty/dyncall/test/suite_x86win32fast/Makefile.generic 3rdparty/dyncall/test/suite_x86win32fast/Nmakefile 3rdparty/dyncall/test/suite_x86win32fast/README.txt 3rdparty/dyncall/test/suite_x86win32fast/case.cc 3rdparty/dyncall/test/suite_x86win32fast/case.h 3rdparty/dyncall/test/suite_x86win32fast/config.h 3rdparty/dyncall/test/suite_x86win32fast/dynMakefile 3rdparty/dyncall/test/suite_x86win32fast/main.cc 3rdparty/dyncall/test/suite_x86win32fast/mkcase.py 3rdparty/dyncall/test/suite_x86win32std/CMakeLists.txt 3rdparty/dyncall/test/suite_x86win32std/Makefile.M 3rdparty/dyncall/test/suite_x86win32std/Makefile.generic 3rdparty/dyncall/test/suite_x86win32std/Nmakefile 3rdparty/dyncall/test/suite_x86win32std/README.txt 3rdparty/dyncall/test/suite_x86win32std/case.cc 3rdparty/dyncall/test/suite_x86win32std/case.h 3rdparty/dyncall/test/suite_x86win32std/config.h 3rdparty/dyncall/test/suite_x86win32std/dynMakefile 3rdparty/dyncall/test/suite_x86win32std/main.cc 3rdparty/dyncall/test/suite_x86win32std/mkcase.py 3rdparty/dyncall/test/syscall/CMakeLists.txt 3rdparty/dyncall/test/syscall/Makefile.M 3rdparty/dyncall/test/syscall/Makefile.embedded 3rdparty/dyncall/test/syscall/Makefile.generic 3rdparty/dyncall/test/syscall/dynMakefile 3rdparty/dyncall/test/syscall/syscall.c 3rdparty/dyncall/test/thunk/CMakeLists.txt 3rdparty/dyncall/test/thunk/Makefile.M 3rdparty/dyncall/test/thunk/Makefile.embedded 3rdparty/dyncall/test/thunk/Makefile.generic 3rdparty/dyncall/test/thunk/Nmakefile 3rdparty/dyncall/test/thunk/dynMakefile 3rdparty/dyncall/test/thunk/mkfile 3rdparty/dyncall/test/thunk/test_thunk.c 3rdparty/libuv/.gitignore 3rdparty/libuv/.mailmap 3rdparty/libuv/AUTHORS 3rdparty/libuv/CONTRIBUTING.md 3rdparty/libuv/ChangeLog 3rdparty/libuv/LICENSE 3rdparty/libuv/Makefile.am 3rdparty/libuv/Makefile.mingw 3rdparty/libuv/README.md 3rdparty/libuv/android-configure 3rdparty/libuv/autogen.sh 3rdparty/libuv/checksparse.sh 3rdparty/libuv/common.gypi 3rdparty/libuv/configure.ac 3rdparty/libuv/docs/Makefile 3rdparty/libuv/docs/make.bat 3rdparty/libuv/docs/src/async.rst 3rdparty/libuv/docs/src/check.rst 3rdparty/libuv/docs/src/conf.py 3rdparty/libuv/docs/src/design.rst 3rdparty/libuv/docs/src/dll.rst 3rdparty/libuv/docs/src/dns.rst 3rdparty/libuv/docs/src/errors.rst 3rdparty/libuv/docs/src/fs.rst 3rdparty/libuv/docs/src/fs_event.rst 3rdparty/libuv/docs/src/fs_poll.rst 3rdparty/libuv/docs/src/handle.rst 3rdparty/libuv/docs/src/idle.rst 3rdparty/libuv/docs/src/index.rst 3rdparty/libuv/docs/src/loop.rst 3rdparty/libuv/docs/src/migration_010_100.rst 3rdparty/libuv/docs/src/misc.rst 3rdparty/libuv/docs/src/pipe.rst 3rdparty/libuv/docs/src/poll.rst 3rdparty/libuv/docs/src/prepare.rst 3rdparty/libuv/docs/src/process.rst 3rdparty/libuv/docs/src/request.rst 3rdparty/libuv/docs/src/signal.rst 3rdparty/libuv/docs/src/static/architecture.png 3rdparty/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg 3rdparty/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg 3rdparty/libuv/docs/src/static/diagrams.key/Index.zip 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist 3rdparty/libuv/docs/src/static/diagrams.key/preview-micro.jpg 3rdparty/libuv/docs/src/static/diagrams.key/preview-web.jpg 3rdparty/libuv/docs/src/static/diagrams.key/preview.jpg 3rdparty/libuv/docs/src/static/favicon.ico 3rdparty/libuv/docs/src/static/logo.png 3rdparty/libuv/docs/src/static/loop_iteration.png 3rdparty/libuv/docs/src/stream.rst 3rdparty/libuv/docs/src/tcp.rst 3rdparty/libuv/docs/src/threading.rst 3rdparty/libuv/docs/src/threadpool.rst 3rdparty/libuv/docs/src/timer.rst 3rdparty/libuv/docs/src/tty.rst 3rdparty/libuv/docs/src/udp.rst 3rdparty/libuv/gyp_uv.py 3rdparty/libuv/img/banner.png 3rdparty/libuv/img/logos.svg 3rdparty/libuv/include/android-ifaddrs.h 3rdparty/libuv/include/pthread-fixes.h 3rdparty/libuv/include/stdint-msvc2008.h 3rdparty/libuv/include/tree.h 3rdparty/libuv/include/uv-aix.h 3rdparty/libuv/include/uv-bsd.h 3rdparty/libuv/include/uv-darwin.h 3rdparty/libuv/include/uv-errno.h 3rdparty/libuv/include/uv-linux.h 3rdparty/libuv/include/uv-sunos.h 3rdparty/libuv/include/uv-threadpool.h 3rdparty/libuv/include/uv-unix.h 3rdparty/libuv/include/uv-version.h 3rdparty/libuv/include/uv-win.h 3rdparty/libuv/include/uv.h 3rdparty/libuv/libuv.pc.in 3rdparty/libuv/m4/.gitignore 3rdparty/libuv/m4/as_case.m4 3rdparty/libuv/m4/libuv-check-flags.m4 3rdparty/libuv/samples/.gitignore 3rdparty/libuv/samples/socks5-proxy/.gitignore 3rdparty/libuv/samples/socks5-proxy/LICENSE 3rdparty/libuv/samples/socks5-proxy/Makefile 3rdparty/libuv/samples/socks5-proxy/build.gyp 3rdparty/libuv/samples/socks5-proxy/client.c 3rdparty/libuv/samples/socks5-proxy/defs.h 3rdparty/libuv/samples/socks5-proxy/getopt.c 3rdparty/libuv/samples/socks5-proxy/main.c 3rdparty/libuv/samples/socks5-proxy/s5.c 3rdparty/libuv/samples/socks5-proxy/s5.h 3rdparty/libuv/samples/socks5-proxy/server.c 3rdparty/libuv/samples/socks5-proxy/util.c 3rdparty/libuv/src/fs-poll.c 3rdparty/libuv/src/heap-inl.h 3rdparty/libuv/src/inet.c 3rdparty/libuv/src/queue.h 3rdparty/libuv/src/threadpool.c 3rdparty/libuv/src/unix/aix.c 3rdparty/libuv/src/unix/android-ifaddrs.c 3rdparty/libuv/src/unix/async.c 3rdparty/libuv/src/unix/atomic-ops.h 3rdparty/libuv/src/unix/core.c 3rdparty/libuv/src/unix/darwin-proctitle.c 3rdparty/libuv/src/unix/darwin.c 3rdparty/libuv/src/unix/dl.c 3rdparty/libuv/src/unix/freebsd.c 3rdparty/libuv/src/unix/fs.c 3rdparty/libuv/src/unix/fsevents.c 3rdparty/libuv/src/unix/getaddrinfo.c 3rdparty/libuv/src/unix/getnameinfo.c 3rdparty/libuv/src/unix/internal.h 3rdparty/libuv/src/unix/kqueue.c 3rdparty/libuv/src/unix/linux-core.c 3rdparty/libuv/src/unix/linux-inotify.c 3rdparty/libuv/src/unix/linux-syscalls.c 3rdparty/libuv/src/unix/linux-syscalls.h 3rdparty/libuv/src/unix/loop-watcher.c 3rdparty/libuv/src/unix/loop.c 3rdparty/libuv/src/unix/netbsd.c 3rdparty/libuv/src/unix/openbsd.c 3rdparty/libuv/src/unix/pipe.c 3rdparty/libuv/src/unix/poll.c 3rdparty/libuv/src/unix/process.c 3rdparty/libuv/src/unix/proctitle.c 3rdparty/libuv/src/unix/pthread-fixes.c 3rdparty/libuv/src/unix/signal.c 3rdparty/libuv/src/unix/spinlock.h 3rdparty/libuv/src/unix/stream.c 3rdparty/libuv/src/unix/sunos.c 3rdparty/libuv/src/unix/tcp.c 3rdparty/libuv/src/unix/thread.c 3rdparty/libuv/src/unix/timer.c 3rdparty/libuv/src/unix/tty.c 3rdparty/libuv/src/unix/udp.c 3rdparty/libuv/src/unix/uv-dtrace.d 3rdparty/libuv/src/uv-common.c 3rdparty/libuv/src/uv-common.h 3rdparty/libuv/src/version.c 3rdparty/libuv/src/win/async.c 3rdparty/libuv/src/win/atomicops-inl.h 3rdparty/libuv/src/win/core.c 3rdparty/libuv/src/win/dl.c 3rdparty/libuv/src/win/error.c 3rdparty/libuv/src/win/fs-event.c 3rdparty/libuv/src/win/fs.c 3rdparty/libuv/src/win/getaddrinfo.c 3rdparty/libuv/src/win/getnameinfo.c 3rdparty/libuv/src/win/handle-inl.h 3rdparty/libuv/src/win/handle.c 3rdparty/libuv/src/win/internal.h 3rdparty/libuv/src/win/loop-watcher.c 3rdparty/libuv/src/win/pipe.c 3rdparty/libuv/src/win/poll.c 3rdparty/libuv/src/win/process-stdio.c 3rdparty/libuv/src/win/process.c 3rdparty/libuv/src/win/req-inl.h 3rdparty/libuv/src/win/req.c 3rdparty/libuv/src/win/signal.c 3rdparty/libuv/src/win/stream-inl.h 3rdparty/libuv/src/win/stream.c 3rdparty/libuv/src/win/tcp.c 3rdparty/libuv/src/win/thread.c 3rdparty/libuv/src/win/timer.c 3rdparty/libuv/src/win/tty.c 3rdparty/libuv/src/win/udp.c 3rdparty/libuv/src/win/util.c 3rdparty/libuv/src/win/winapi.c 3rdparty/libuv/src/win/winapi.h 3rdparty/libuv/src/win/winsock.c 3rdparty/libuv/src/win/winsock.h 3rdparty/libuv/test/benchmark-async-pummel.c 3rdparty/libuv/test/benchmark-async.c 3rdparty/libuv/test/benchmark-fs-stat.c 3rdparty/libuv/test/benchmark-getaddrinfo.c 3rdparty/libuv/test/benchmark-list.h 3rdparty/libuv/test/benchmark-loop-count.c 3rdparty/libuv/test/benchmark-million-async.c 3rdparty/libuv/test/benchmark-million-timers.c 3rdparty/libuv/test/benchmark-multi-accept.c 3rdparty/libuv/test/benchmark-ping-pongs.c 3rdparty/libuv/test/benchmark-pound.c 3rdparty/libuv/test/benchmark-pump.c 3rdparty/libuv/test/benchmark-sizes.c 3rdparty/libuv/test/benchmark-spawn.c 3rdparty/libuv/test/benchmark-tcp-write-batch.c 3rdparty/libuv/test/benchmark-thread.c 3rdparty/libuv/test/benchmark-udp-pummel.c 3rdparty/libuv/test/blackhole-server.c 3rdparty/libuv/test/dns-server.c 3rdparty/libuv/test/echo-server.c 3rdparty/libuv/test/fixtures/empty_file 3rdparty/libuv/test/fixtures/load_error.node 3rdparty/libuv/test/run-benchmarks.c 3rdparty/libuv/test/run-tests.c 3rdparty/libuv/test/runner-unix.c 3rdparty/libuv/test/runner-unix.h 3rdparty/libuv/test/runner-win.c 3rdparty/libuv/test/runner-win.h 3rdparty/libuv/test/runner.c 3rdparty/libuv/test/runner.h 3rdparty/libuv/test/task.h 3rdparty/libuv/test/test-active.c 3rdparty/libuv/test/test-async-null-cb.c 3rdparty/libuv/test/test-async.c 3rdparty/libuv/test/test-barrier.c 3rdparty/libuv/test/test-callback-order.c 3rdparty/libuv/test/test-callback-stack.c 3rdparty/libuv/test/test-close-fd.c 3rdparty/libuv/test/test-close-order.c 3rdparty/libuv/test/test-condvar.c 3rdparty/libuv/test/test-connection-fail.c 3rdparty/libuv/test/test-cwd-and-chdir.c 3rdparty/libuv/test/test-default-loop-close.c 3rdparty/libuv/test/test-delayed-accept.c 3rdparty/libuv/test/test-dlerror.c 3rdparty/libuv/test/test-embed.c 3rdparty/libuv/test/test-emfile.c 3rdparty/libuv/test/test-error.c 3rdparty/libuv/test/test-fail-always.c 3rdparty/libuv/test/test-fs-event.c 3rdparty/libuv/test/test-fs-poll.c 3rdparty/libuv/test/test-fs.c 3rdparty/libuv/test/test-get-currentexe.c 3rdparty/libuv/test/test-get-loadavg.c 3rdparty/libuv/test/test-get-memory.c 3rdparty/libuv/test/test-getaddrinfo.c 3rdparty/libuv/test/test-getnameinfo.c 3rdparty/libuv/test/test-getsockname.c 3rdparty/libuv/test/test-handle-fileno.c 3rdparty/libuv/test/test-hrtime.c 3rdparty/libuv/test/test-idle.c 3rdparty/libuv/test/test-ip4-addr.c 3rdparty/libuv/test/test-ip6-addr.c 3rdparty/libuv/test/test-ipc-send-recv.c 3rdparty/libuv/test/test-ipc.c 3rdparty/libuv/test/test-list.h 3rdparty/libuv/test/test-loop-alive.c 3rdparty/libuv/test/test-loop-close.c 3rdparty/libuv/test/test-loop-handles.c 3rdparty/libuv/test/test-loop-stop.c 3rdparty/libuv/test/test-loop-time.c 3rdparty/libuv/test/test-multiple-listen.c 3rdparty/libuv/test/test-mutexes.c 3rdparty/libuv/test/test-osx-select.c 3rdparty/libuv/test/test-pass-always.c 3rdparty/libuv/test/test-ping-pong.c 3rdparty/libuv/test/test-pipe-bind-error.c 3rdparty/libuv/test/test-pipe-close-stdout-read-stdin.c 3rdparty/libuv/test/test-pipe-connect-error.c 3rdparty/libuv/test/test-pipe-getsockname.c 3rdparty/libuv/test/test-pipe-sendmsg.c 3rdparty/libuv/test/test-pipe-server-close.c 3rdparty/libuv/test/test-platform-output.c 3rdparty/libuv/test/test-poll-close.c 3rdparty/libuv/test/test-poll-closesocket.c 3rdparty/libuv/test/test-poll.c 3rdparty/libuv/test/test-process-title.c 3rdparty/libuv/test/test-ref.c 3rdparty/libuv/test/test-run-nowait.c 3rdparty/libuv/test/test-run-once.c 3rdparty/libuv/test/test-semaphore.c 3rdparty/libuv/test/test-shutdown-close.c 3rdparty/libuv/test/test-shutdown-eof.c 3rdparty/libuv/test/test-shutdown-twice.c 3rdparty/libuv/test/test-signal-multiple-loops.c 3rdparty/libuv/test/test-signal.c 3rdparty/libuv/test/test-socket-buffer-size.c 3rdparty/libuv/test/test-spawn.c 3rdparty/libuv/test/test-stdio-over-pipes.c 3rdparty/libuv/test/test-tcp-bind-error.c 3rdparty/libuv/test/test-tcp-bind6-error.c 3rdparty/libuv/test/test-tcp-close-accept.c 3rdparty/libuv/test/test-tcp-close-while-connecting.c 3rdparty/libuv/test/test-tcp-close.c 3rdparty/libuv/test/test-tcp-connect-error-after-write.c 3rdparty/libuv/test/test-tcp-connect-error.c 3rdparty/libuv/test/test-tcp-connect-timeout.c 3rdparty/libuv/test/test-tcp-connect6-error.c 3rdparty/libuv/test/test-tcp-flags.c 3rdparty/libuv/test/test-tcp-open.c 3rdparty/libuv/test/test-tcp-read-stop.c 3rdparty/libuv/test/test-tcp-shutdown-after-write.c 3rdparty/libuv/test/test-tcp-try-write.c 3rdparty/libuv/test/test-tcp-unexpected-read.c 3rdparty/libuv/test/test-tcp-write-after-connect.c 3rdparty/libuv/test/test-tcp-write-queue-order.c 3rdparty/libuv/test/test-tcp-write-to-half-open-connection.c 3rdparty/libuv/test/test-tcp-writealot.c 3rdparty/libuv/test/test-thread-equal.c 3rdparty/libuv/test/test-thread.c 3rdparty/libuv/test/test-threadpool-cancel.c 3rdparty/libuv/test/test-threadpool.c 3rdparty/libuv/test/test-timer-again.c 3rdparty/libuv/test/test-timer-from-check.c 3rdparty/libuv/test/test-timer.c 3rdparty/libuv/test/test-tty.c 3rdparty/libuv/test/test-udp-bind.c 3rdparty/libuv/test/test-udp-dgram-too-big.c 3rdparty/libuv/test/test-udp-ipv6.c 3rdparty/libuv/test/test-udp-multicast-interface.c 3rdparty/libuv/test/test-udp-multicast-interface6.c 3rdparty/libuv/test/test-udp-multicast-join.c 3rdparty/libuv/test/test-udp-multicast-join6.c 3rdparty/libuv/test/test-udp-multicast-ttl.c 3rdparty/libuv/test/test-udp-open.c 3rdparty/libuv/test/test-udp-options.c 3rdparty/libuv/test/test-udp-send-and-recv.c 3rdparty/libuv/test/test-udp-send-immediate.c 3rdparty/libuv/test/test-udp-send-unreachable.c 3rdparty/libuv/test/test-udp-try-send.c 3rdparty/libuv/test/test-walk-handles.c 3rdparty/libuv/test/test-watcher-cross-stop.c 3rdparty/libuv/uv.gyp 3rdparty/libuv/vcbuild.bat 3rdparty/dynasm/.gitignore 3rdparty/dynasm/COPYRIGHT 3rdparty/dynasm/dasm_arm.h 3rdparty/dynasm/dasm_arm.lua 3rdparty/dynasm/dasm_mips.h 3rdparty/dynasm/dasm_mips.lua 3rdparty/dynasm/dasm_ppc.h 3rdparty/dynasm/dasm_ppc.lua 3rdparty/dynasm/dasm_proto.h 3rdparty/dynasm/dasm_x64.lua 3rdparty/dynasm/dasm_x86.h 3rdparty/dynasm/dasm_x86.lua 3rdparty/dynasm/dynasm.lua 3rdparty/dynasm/minilua.c MoarVM-2015.11/.dir-locals.el0000644000175000017500000000024712620140151014474 0ustar jnthnjnthn((c-mode . ((c-basic-offset . 4) (c-file-style . "bsd") (fill-column . 80) (indent-tabs-mode . nil) (tab-width . 8)))) MoarVM-2015.11/.gitignore0000644000175000017500000000174412616160672014055 0ustar jnthnjnthn# Editor backups *~ *.bak # Emacs specfic in-use files \#*\# .#* # clangcheck files .clangcheck .gcccheck tools/check.mk # Releases MoarVM-* # Generated files Makefile 3rdparty/libatomic_ops/autom4te.cache/ 3rdparty/libatomic_ops/config.log 3rdparty/libatomic_ops/config.status 3rdparty/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc 3rdparty/libatomic_ops/pkgconfig/atomic_ops.pc 3rdparty/libatomic_ops/src/.deps/ 3rdparty/libatomic_ops/src/config.h 3rdparty/libatomic_ops/src/libatomic_ops.a 3rdparty/libatomic_ops/src/stamp-h1 3rdparty/libatomic_ops/tests/.deps/ 3rdparty/libatomic_ops/tests/list_atomic.i 3rdparty/dyncall/ConfigVars 3rdparty/dyncall/Makefile.config src/gen/ *.la *.obj *.exe *.o *.a *.lib *.dll *.pdb *.exp *.suo *.ilk *.lo *.so *.dylib moar *.vsp *.psess /nmake.cmd UNIDATA/* /src/strings/unicode.c *.class tags install/ pkgconfig/ build/mk-moar-pc.pl # jit files jit-log.txt jit-*.bin # dynasm emitted files src/jit/emit_*.c # generated code tools/lib/MAST/Ops.pm MoarVM-2015.11/.gitmodules0000644000175000017500000000044612520766031014233 0ustar jnthnjnthn[submodule "3rdparty/libuv"] path = 3rdparty/libuv url = https://github.com/joyent/libuv.git [submodule "3rdparty/dyncall"] path = 3rdparty/dyncall url = https://github.com/MoarVM/dyncall.git [submodule "3rdparty/dynasm"] path = 3rdparty/dynasm url = https://github.com/MoarVM/dynasm.git MoarVM-2015.11/.travis.yml0000644000175000017500000000213612554473060014171 0ustar jnthnjnthnlanguage: "perl" perl: - "5.10" install: "echo" before_script: - gcc --version - clang --version - sudo apt-get update -qq - sudo apt-get install -y libffi-dev - git fetch --unshallow - git clone --depth 1 git://github.com/perl6/nqp script: "perl Configure.pl --prefix=/tmp/moar $MVM_OPTIONS --debug --optimize --cc=\"$CC\"; make install; cd nqp; perl Configure.pl --prefix=/tmp/moar --backends=moar; make; make test" branches: only: - master - /smoke-me/ notifications: irc: channels: - "irc.freenode.net#moarvm" on_success: change on_failure: always template: - "MoarVM build %{result}. %{author} '%{commit_message}'" - "%{build_url} %{compare_url}" env: matrix: - MVM_OPTIONS="--no-jit" CC="gcc" - MVM_OPTIONS="" CC="gcc" - MVM_OPTIONS="--no-jit" CC="clang" - MVM_OPTIONS="" CC="clang" - MVM_OPTIONS="--has-libffi --no-jit" CC="gcc" - MVM_OPTIONS="--has-libffi" CC="gcc" - MVM_OPTIONS="--has-libffi --no-jit" CC="clang" - MVM_OPTIONS="--has-libffi" CC="clang" MoarVM-2015.11/3rdparty/README.md0000644000175000017500000000127112456307241015104 0ustar jnthnjnthn## 3rd party libraries These are imported forks of external library projects. Their source redistribution licenses are for the most part as permissive or more permissive than MoarVM's itself. We have imported them here because we needed to make extensive modifications to their capabilities or exposed API, and so couldn't use system packages, or available system packages are too far out of date. Note: you may find that libatomic_ops has some GPL-licensed files in the repo. These are NOT included in any built binaries; they are merely tools for configuring, building, and testing, and should be disregarded when considering the redistributability of MoarVM in source form or binary form. MoarVM-2015.11/3rdparty/libatomic_ops/AUTHORS0000755000175000017500000000273712456307241017534 0ustar jnthnjnthnOriginally written by Hans Boehm, with some platform-dependent code imported from the Boehm-Demers-Weiser GC, where it was contributed by many others. Currently maintained by Ivan Maidanski. Andreas Tobler Andrew Agno Bradley Smith Bruce Mitchener Carlos O'Donell Daniel Grayson Doug Lea Earl Chew Emmanuel Stapf Gilles Talis Gregory Farnum H.J. Lu Hans Boehm Hans-Peter Nilsson Ian Wienand Ivan Maidanski Jeremy Huddleston Jim Marshall Joerg Wagner Linas Vepstas Luca Barbato Maged Michael Manuel Serrano Michael Hope Patrick Marlier Petter Urkedal Philipp Zambelli Ranko Zivojnovic Roger Hoover Sebastian Siewior Takashi Yoshii Thiemo Seufer Thorsten Glaser Tony Mantler Yvan Roux MoarVM-2015.11/3rdparty/libatomic_ops/COPYING0000755000175000017500000004311012456307241017505 0ustar jnthnjnthn GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. MoarVM-2015.11/3rdparty/libatomic_ops/ChangeLog0000755000175000017500000003541012456307241020230 0ustar jnthnjnthn == [7.3alpha4] (development) == * Add and/or/xor entries to list_atomic (tests). * Add char/short/int/AO_double_t and dd_acquire cases to list_atomic (tests). * Add compile-time assertion for size of 'standard' AO_double_t. * Add double_store pthread-based implementation and tests. * Add generalized CAS primitives of char/short/int size. * Add generalized atomic and/or/xor operations for char/short/int types. * Add generalized fetch_and_add_acquire/release (for ARMv6+). * Add generic implementation of double_load primitives. * Add information about AO_ASSUME_VISTA to README_win32. * Add internal header containing only char/short/int/AO_t atomic loads. * Add load/store primitives generalization based on CAS. * Add lock-based implementation of char/short/int_fetch_compare_and_swap. * Add makefile rule to test list_atomic.template syntax (tests). * Add missing 'const' in aligned-atomic XSIZE_load implementation. * Add missing double_compare_and_swap to generalization. * Add missing generalization of no-barrier CAS in template. * Add negative double-CAS test cases to test_atomic_include (tests). * Add test_stack to Makefile.msft (tests). * Adjust fprintf arguments type matching specifier in test_stack (tests). * Adjust included filenames in atomic_ops_malloc and test_stack. * Adjust quotes in echo command of Makefile.msft (Win32). * Always use 'mfence' for nop_full if target CPU supports SSE2 (gcc/x86). * Better document configure THREADDLLIBS variable. * Cast away volatile on dereference in CAS-based generalization primitives. * Define AO_NO_PTHREADS in configure if no pthreads (Win32 and VxWorks). * Define AO_int_X operations for ARM and avr32. * Define double-wide ordered loads/stores for x86. * Define int_and/or/xor primitives in ao_t_is_int header. * Define nop_full as compiler barrier for pre-ARMv6 single-core case. * Do not duplicate BUILT_SOURCES entries in nobase_private_HEADERS (Makefile). * Do not include standard_ao_double_t.h where double-CAS is unimplemented. * Do not report absence of meaningless nop, load and store in test_atomic. * Do not use deprecated AO_T and AO_TS_T (tests). * Eliminate 'missing initializer' warning for AO_stack_t value initializer. * Eliminate 64-bit compiler warnings in atomic_ops_malloc. * Eliminate arithmetic shifts in double-CAS (gcc/arm, msftc/x86). * Eliminate warning for fetch_and_add argument in test_atomic_include (tests). * Enable Makefile.msft for Win64. * Enable build using toolchain without pthreads. * Enable double_compare_and_swap for non-cpp code (msftc/x86.h). * Enable generalization of all variants of CAS via fetch_compare_and_swap. * Enable test_stack for pthreads-w32 and Win32 with native threads. * Fix generalized AO_char/short_compare_and_swap args (missing 'unsigned'). * Fix makefile sed rule for list_atomic (tests). * Fix missing abort() usage in atomic_ops_malloc and tests on WinCE. * Generalize compare_double_and_swap_double using double_compare_and_swap. * Generalize double_load/store for x86_64 (GCC). * Generate ao_t_is_int, 'loadstore' headers from templates. * Generate generalized AO_t load/store/fetch_and_add primitives from template. * Generate ordered_loads/stores_only headers from templates. * Group all X_acquire_release_volatile.h and X_[aligned_]atomic_load_store.h. * Implement and/or/xor, AO_double_load for ARM. * Implement atomic store using direct write by default on ARMv6+. * Implement char/short/int-wide primitives using GCC built-in atomic/sync. * Implement char/short/int_fetch_and_add for msftc/x86[_64] (Win32). * Implement char/short_fetch_and_add, char/short_load for ARMv6+ (GCC). * Implement char/short_store primitives at aligned addresses for ARM. * Implement compare_double_and_swap_double for SunCC/x86. * Implement double_load/store based on guaranteed x86 access atomicity. * Implement double_store for ARMv7 using LDREXD/STREXD. * Implement load/store via simple LDR/STR for ARMv6+ (msftc). * Implement nop_full/write using 'dmb' instruction if available (gcc/arm). * Improve debug printing in test_stack (tests). * Log messages to stdout instead of stderr (tests). * Make AO_ASSUME_VISTA also enables Win98 code in msftc/x86.h (Win32). * Minimize gcc/generic-arithm template by factoring out barriers. * Move 'unsigned' keyword to XCTYPE in generalize-small template. * Move default compiler options to CFLAGS in Makefile.msft (Win32). * Move definitions of ordered loads/stores to inner separate headers. * Move gcc-generic AO_t-wide primitives to generic-small/arithm headers. * Move generalized arithmetical primitives to 'generalize-arithm' template. * Optimize AO_spin manually to minimize compiler influence on its duration. * Parameterize list_atomic template with XSIZE (tests). * Perform only few list reversals in test_malloc if AO based on pthreads. * Remote duplicate definition of test_and_set_acquire in generalize.h. * Remove X_aligned_atomic_load_store headers and template. * Remove duplicate AO_spin and AO_pause definition in atomic_ops_stack. * Remove gcc/x86_64.h eliminating code duplication of gcc/x86.h. * Remove nested AO_USE_PTHREAD_DEFS macro check in atomic_ops.h (gcc/arm). * Remove redundant 'cc' clobber for LDREXD instruction (gcc/arm). * Remove store_full from msftc/arm.h in favor of generalized primitive. * Remove sunc/x86_64.h eliminating code duplication of sunc/x86.h. * Remove unsafe emulation-based implementation of double CAS (SunCC/x86_64). * Remove useless 'perror' call in run_parallel.h (tests). * Reorder AO_double_t union elements for AO_DOUBLE_T_INITIALIZER portability. * Replace atomic_load_store.template with atomic_load and atomic_store ones. * Replace some FIXME items with TODO in atomic_ops.c and sysdeps headers. * Specify fetch_and_add/sub1 result as unused in test_atomic (tests). * Support AArch64 (64-bit ARM) target (GCC). * Support ARMv8 target (gcc/arm). * Test double_compare_and_swap in test_atomic (tests). * Use AO_ prefix for internal functions in arm_v6.h, hppa.h. * Use __atomic GCC built-in to implement generic double-wide CAS. * Use built-in __sync CAS for double-CAS if AO_USE_SYNC_CAS_BUILTIN for x86. * Workaround GCC 4.4.3 warning reported for 'val' of list_atomic.c (tests). == [7.3alpha2] 2012-05-11 == * Add '-no-undefined' to LDFLAGS in src/Makefile.am. * Add AO_and, AO_xor atomic operations. * Add AO_fetch_compare_and_swap primitives. * Add and fill in AUTHORS, TODO files. * Add autogen.sh file. * Adjust AO_..._H macros in public headers. * Code refactoring of gcc/arm.h by introducing AO_ARM_HAVE_x macros. * Define AO macros for libatomic_ops version identification. * Do not define NDEBUG if '--enable-assertions' passed to configure. * Eliminate compiler warnings in various functions and macros. * Generalize AO_compare_and_swap primitives via AO_fetch_compare_and_swap. * Generalize acquire/release/full CAS primitives for MIPS * Implement fetch_and_add, test_and_set primitives for MIPS. * Improve Makefile for MS VC++; pass '-W3' option to MS compiler. * Include ao_t_is_int.h from atomic_ops.h after first generalization pass * Merge all Makefile.am files in src tree. * Minor code refactoring of atomic_ops.c, generic_pthread.h. * Minor configure build improvements (e.g., ensure proper autoconf version). * Place only major per-release changes description to ChangeLog (this file). * Recognize AO_PREFER_GENERALIZED macro to favor generalization over assembly. * Remove all auto-generated files except for generalize-small.h from the repo. * Remove duplicate doc/COPYING and empty NEWS files. * Replace atomic_ops_malloc static mmap-related empty functions with macros. * Replace pointer relational comparisons with non-pointer ones. * Require autoconf 2.61 instead of v2.64. * Show extra compiler warnings (GCC only). * Turn off AO primitives inlining if AO_NO_INLINE defined. * Use __builtin_expect in CAS failure loop condition checks (GCC only). == [7.2e] (candidate) == * Fix (remove) invalid include of read_ordered.h for ARM. * Fix AM_CONFIG_HEADER in configure for autoconf-2.69-1. * Fix AO_pause sleep delay for particular argument values (Win32). * Fix ARMv7 LDREXD/STREXD double-wide operand specification (GCC/Clang). * Fix LDREXD/STREXD use for pre-Clang3.3/arm. * Fix README regarding _acquire_read barrier. * Fix XSIZE_load/store definition order in generalize-small template. * Fix asm constraint of CAS memory operand for gcc/alpha, clang-3.1/mips. * Fix asm constraints of primitives in sunc/x86.h. * Fix cmpxchg16b-based compare_double_and_swap_double for SunCC/x86_64. * Fix compare_double_and_swap_double and double_ptr_storage for gcc/x32. * Fix compare_double_and_swap_double for clang3.0/x86 in PIC mode. * Fix compare_double_and_swap_double_full definition condition in emul_cas. * Fix generalize-small template adding missed CAS-based fetch_and_add. * Fix generalized fetch_and_add function. * Fix missing compiler barrier in nop_full for uniprocessor ARM. * Fix ordered_except_wr header inclusion for s390. * Fix return type of AO_int_X primitives defined in ao_t_is_int header. * Fix return type of char/short/int_load_read() in read_ordered.h. * Fix template-based headers regeneration order in src/Makefile. * Fix typos in ao_t_is_int, atomic_ops.h, generalize.h, msftc/arm.h comments. * Fix variable type to match printf format specifier in test_stack. * Fix visibility and initial value of 'dummy' variable in atomic_ops_stack. * Terminate tests with abort after error reported. == [7.2d] 2012-08-09 == * Fix AO_compare_double_and_swap_double_full for gcc-4.2.1/x86 in PIC mode. * Fix AO_compiler_barrier missing parentheses. * Fix missing 'unsigned' for generalized AO_char/short_fetch_and_add result. == [7.2] 2012-05-11 == * Add atomic_ops.pc.in and atomic_ops-uninstalled.pc.in to pkgconfig folder. * Define and use AO_PTRDIFF_T in tests for casts between pointer and integer. * Fix AO_compare_and_swap return type for s390 and PowerPC. * Fix AO_compare_double_and_swap_double_full for gcc/x86 (PIC mode). * Fix AO_stack_push_release to workaround bug in clang-1.1/x86 compiler. * Fix AO_test_and_setXX in tests/list_atomic.template. * Fix AO_test_and_set_full (gcc/x86[_64].h) to work-around a bug in LLVM v2.7. * Fix AO_test_and_set_full on m68k. * Fix __ARM_ARCH_5__ macro handling for Android NDK (ARMv7). * Fix configure for Cygwin, mingw-w64/32. * Fix configure to define __PIC__ macro explicitly if needed (GCC). * Fix double_ptr_storage definition for GCC pre-v4 (x86_64). * Fix for x32 by removing 'q' suffix in x86-64 instructions. * Fix generalization for IA-64 (regarding AO_or, AO_..._read/write primitives) * Fix generalized AO__fetch_and_add() return type. * Fix test_atomic_include for the case of missing CAS primitive. * Fix test_malloc - allocate less memory in case of missing mmap. * Implement the basic atomic primitives for the hexagon CPU. == [7.2alpha6] 2011-06-14 == * Add missing AO_HAVE_ macros. * Add support of avr32 CPU. * Better support of various models of ARM. * Disable AO_compare_double_and_swap_double_full for SunCC x86 as not working. * Enable ARM Thumb-2 mode. * Fix AO_test_and_set_full for SunCC (x86). * Fix bugs in tests. * Fix clobbers in AO_compare_and_swap_full (x86.h). * Fix typos in identifiers and comments. * Improve AO_sync for PowerPC. * Improve make scripts (configure.ac). * Make get_mmaped() in atomic_ops_malloc.c more portable. * Support Intel compiler. * Support NaCl target. * Suppress compiler warnings in various places. * Test more predefined macros (ARM, PowerPC). * Use assembly code only for MS VC if available (x86_64). * Use built-in __sync_bool_compare_and_swap if available (x86_64). * Workaround bugs in LLVM GCC and SunCC regarding XCHG (x86, x86_64). == [7.2alpha4] 2009-12-02 == * Fix typos in comments, identifiers and documentation. * Implement AO_compare_and_swap_full for SPARC. * Refine ARM-specific code. * Refine code and comments for MS VC. * Regenerate make scripts. * Share common code for all 32-bit CPUs (MS VC). * Support DigitalMars and Watcom compilers. * Support MS VC for ARM (WinCE). * Support SH CPU. * Support win32-pthreads. * Support x86 and x86_64 for SunCC compiler. == [7.2alpha2] 2009-05-27 == * Add MIPS support. * Add better support for m68k. * Add "const" to first parameter of load calls. * Add parentheses around address argument for various macros. * Add some platform-specific documentation to INSTALL. * Add untested 64-bit support for PowerPC. * Fix AO_compare_and_swap_double_acquire. * Fix AO_int_fetch_and_add_full (x86_64). * Fix comments. * Fix s390 include paths. * Fix use of lwz instruction (PowerPC). * Refine clobbers (PowerPC). * Remove outdated info about Windows support in README. * Replace K&R-style function definition with ANSI C one. * add AO_compare_double_and_swap_double for ARMv6. * gcc/powerpc.h: Consider __NO_LWSYNC__. == [7.1] 2008-02-11 == * Add test_and_set, AO_double_compare_and_swap generalizations. * Conditionally add compare_double_and_swap_double (x86). * Conditionally add compare_double_and_swap_double (x86). * Fix AO_compare_double_and_swap_double_full (x86) for PIC mode. * Fix AO_load_acquire for PowerPC. * Fix double-width CAS (x86). * Refine README (add more warnings about data dependencies). * Refine double_ptr_storage type definition. * Support ARMv6+ in GCC. * Support ArmCC compiler. * Use _InterlockedExchangeAdd for MS VC (x86). == [7.0] 2007-06-28 == * Add 64-bit version of AO_load_acquire for PowerPC. * Add support of x86 and x86_64 for MS VC. * Do not assume that "mfence" is always present (x86.h). * Fix ARM AO_test_and_set_full. * Include windows.h (MS VC). * Update README to reflect C++0x effort. == [1.2] 2006-07-11 == * Add prototypes to suppress compiler warnings. * Add simple VxWorks support. * Fix InterlockedCompareExchange proto usage. * Fix typos (ia64). * Include all_acquire_release_volatile.h and all_atomic_load_store.h (ia64). * Initial support for 64-bit targets. * Use "=q" for AO_test_and_set_full (x86). * Use inline assembler to generate "mfence" and byte sized XCHG. * Use new intrinsics available in MSVC 2003 and MSVC 2005. == [1.1] 2005-09-27 == * Add and use read_ordered.h. * Change function naming from "byte" to "char". * Fix AO_test_and_set for ARM; define AO_CAN_EMUL_CAS. == [1.0] 2005-03-21 == * Fix various bugs. * Add atomic_ops primitives for different sized data. * Add compare_double_and_swap_double and compare_and_swap_double. * Add initial support for atomic_ops for VC++/Windows/X86 and HP/UX. * Add minimal support for the Sun SPARC compiler. * Add support for platforms that require out-of-line assembly code. * Add support of int-wide operations on platforms with int-sized pointers. * Added libatomic_ops_gpl library with support for lock-free stack and malloc. * Attempt to support PowerPC. * Change atomic_ops include file structure. * Change most platforms to use byte-wide test-and-set locations. * Install under "atomic_ops" instead of "ao". * Remove compiler_barrier workaround for gcc 3.4+. * Renamed various types to end in _t. * Use autoconf, automake. MoarVM-2015.11/3rdparty/libatomic_ops/README0000755000175000017500000000406212456307241017335 0ustar jnthnjnthn== Synopsis == This package provides semi-portable access to hardware provided atomic memory operations. These might allow you to write code: - That does more interesting things in signal handlers. - Makes more effective use of multiprocessors by allowing you to write clever lock-free code. Note that such code is very difficult to get right, and will unavoidably be less portable than lock-based code. It is also not always faster than lock-based code. But it may occasionally be a large performance win. - To experiment with new and much better thread programming paradigms, etc. For details and licensing restrictions see the files in the doc subdirectory. This is version 7.3alpha3 of libatomic_ops. You might find a more recent version of this at http://www.hpl.hp.com/personal/Hans_Boehm/gc or http://www.hpl.hp.com/research/linux/atomic_ops/ Please address bug reports to gc@linux.hpl.hp.com == Installation and Usage == The configuration and build scripts for this package were generated by Automake/Autoconf. "./configure --prefix=; make; make install" in this directory should work. For a more customized build, see "INSTALL" and the output of "./configure --help". Note that much of the content of this library is in the header files. However, two small libraries are built and installed: - libatomic_ops.a is a support library, which is not needed on some platforms. This is intended to be usable, under some mild restrictions, in free or proprietary code, as are all the header files. See doc/LICENSING.txt. - libatomic_ops_gpl.a contains some higher level facilities. This code is currently covered by the GPL. The contents currently correspond to the headers atomic_ops_stack.h and atomic_ops_malloc.h. == Platform Specific Notes == Win32/64: src/Makefile.msft contains a very simple Makefile for building and running tests and building the gpl library. The core atomic_ops implementation is entirely in header files. HP-UX/PA-RISC: aCC -Ae won't work as a C compiler, since it doesn't support inline assembly code. Use cc. MoarVM-2015.11/3rdparty/libatomic_ops/aclocal.m40000755000175000017500000012647212456307241020327 0ustar jnthnjnthn# generated automatically by aclocal 1.14 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Figure out how to run the assembler. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AS # ---------- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code. AC_REQUIRE([AC_PROG_CC]) test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR MoarVM-2015.11/3rdparty/libatomic_ops/autogen.sh0000755000175000017500000000032712456307241020453 0ustar jnthnjnthn#!/bin/sh set -e # This script creates (or regenerates) configure (as well as aclocal.m4, # config.h.in, Makefile.in, etc.) missing in the source repository. autoreconf -i echo echo "Ready to run './configure'." MoarVM-2015.11/3rdparty/libatomic_ops/compile0000755000175000017500000001624512456307241020036 0ustar jnthnjnthn#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: MoarVM-2015.11/3rdparty/libatomic_ops/config.guess0000755000175000017500000013036112456307241020774 0ustar jnthnjnthn#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: MoarVM-2015.11/3rdparty/libatomic_ops/config.sub0000755000175000017500000010530112456307241020433 0ustar jnthnjnthn#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: MoarVM-2015.11/3rdparty/libatomic_ops/configure0000755000175000017500000056110712456307241020371 0ustar jnthnjnthn#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for libatomic_ops 7.3alpha3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: gc@linux.hpl.hp.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libatomic_ops' PACKAGE_TARNAME='libatomic_ops' PACKAGE_VERSION='7.3alpha3' PACKAGE_STRING='libatomic_ops 7.3alpha3' PACKAGE_BUGREPORT='gc@linux.hpl.hp.com' PACKAGE_URL='' ac_unique_file="src/atomic_ops.c" ac_header_list= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS NEED_ASM_FALSE NEED_ASM_TRUE HAVE_PTHREAD_H_FALSE HAVE_PTHREAD_H_TRUE THREADDLLIBS PICFLAG EGREP GREP CPP RANLIB am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCASFLAGS CCAS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_assertions ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CCAS CCASFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures libatomic_ops 7.3alpha3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libatomic_ops] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libatomic_ops 7.3alpha3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-assertions Assertion checking Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libatomic_ops configure 7.3alpha3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libatomic_ops $as_me 7.3alpha3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libatomic_ops' VERSION='7.3alpha3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers src/config.h" # Checks for programs. DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 $as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for functions. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt # Determine PIC flag. need_asm=false PICFLAG= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PIC compiler flag" >&5 $as_echo_n "checking for PIC compiler flag... " >&6; } if test "$GCC" = yes; then case "$host" in *-*-cygwin* | *-*-mingw*) # Cygwin and Mingw[-w32/64] do not need -fPIC. { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"\"" >&5 $as_echo "\"\"" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5 $as_echo "-fPIC" >&6; } PICFLAG=-fPIC { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc -fPIC causes __PIC__ definition" >&5 $as_echo_n "checking whether gcc -fPIC causes __PIC__ definition... " >&6; } # Workaround: at least GCC 3.4.6 (Solaris) does not define this macro. old_CFLAGS="$CFLAGS" CFLAGS="$PICFLAG $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __PIC__ # error #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_pic_macro=yes else ac_cv_pic_macro=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$old_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pic_macro" >&5 $as_echo "$ac_cv_pic_macro" >&6; } if test "$ac_cv_pic_macro" = yes; then : else PICFLAG="-D__PIC__=1 $PICFLAG" fi ;; esac # Output all warnings. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc -Wextra" >&5 $as_echo_n "checking for gcc -Wextra... " >&6; } old_CFLAGS="$CFLAGS" CFLAGS="-Wextra $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cc_wextra=yes else ac_cv_cc_wextra=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$old_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5 $as_echo "$ac_cv_cc_wextra" >&6; } if test "$ac_cv_cc_wextra" = yes; then : WEXTRA="-Wextra" else WEXTRA="-W" fi CFLAGS="-Wall $WEXTRA $CFLAGS" else case "$host" in *-*-hpux*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"+Z\"" >&5 $as_echo "\"+Z\"" >&6; } PICFLAG="+Z" CFLAGS="+O2 -mt $CFLAGS" ;; *-*-solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: -Kpic" >&5 $as_echo "-Kpic" >&6; } PICFLAG=-Kpic CFLAGS="-O $CFLAGS" need_asm=true ;; *-*-linux*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5 $as_echo "-fPIC" >&6; } PICFLAG=-fPIC # Any Linux compiler had better be gcc compatible. ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"\"" >&5 $as_echo "\"\"" >&6; } ;; esac fi # Check whether --enable-assertions was given. if test "${enable_assertions+set}" = set; then : enableval=$enable_assertions; fi if test "$enable_assertions" != yes; then $as_echo "#define NDEBUG 1" >>confdefs.h fi # These macros are tested in public headers $as_echo "#define _REENTRANT 1" >>confdefs.h # Libraries needed to support threads (if any). have_pthreads=false { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5 $as_echo_n "checking for pthread_self in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_self+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_self=yes else ac_cv_lib_pthread_pthread_self=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5 $as_echo "$ac_cv_lib_pthread_pthread_self" >&6; } if test "x$ac_cv_lib_pthread_pthread_self" = xyes; then : have_pthreads=true fi if test x$have_pthreads = xtrue; then THREADDLLIBS=-lpthread case "$host" in *-*-netbsd*) # Indicates the use of pthreads. $as_echo "#define _PTHREADS 1" >>confdefs.h ;; *-*-openbsd* | *-*-kfreebsd*-gnu | *-*-dgux*) THREADDLLIBS=-pthread ;; *-*-cygwin* | *-*-darwin*) # Cygwin does not have a real libpthread, so Libtool cannot link # against it. THREADDLLIBS= ;; *-*-mingw*) # Use Win32 threads for tests anyway. THREADDLLIBS= # Skip test_atomic_pthreads. have_pthreads=false ;; esac else $as_echo "#define AO_NO_PTHREADS 1" >>confdefs.h # Assume VxWorks or Win32. THREADDLLIBS= fi if test x$have_pthreads = xtrue; then HAVE_PTHREAD_H_TRUE= HAVE_PTHREAD_H_FALSE='#' else HAVE_PTHREAD_H_TRUE='#' HAVE_PTHREAD_H_FALSE= fi if test x$need_asm = xtrue; then NEED_ASM_TRUE= NEED_ASM_FALSE='#' else NEED_ASM_TRUE='#' NEED_ASM_FALSE= fi ac_config_files="$ac_config_files src/Makefile" ac_config_commands="$ac_config_commands default" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PTHREAD_H_TRUE}" && test -z "${HAVE_PTHREAD_H_FALSE}"; then as_fn_error $? "conditional \"HAVE_PTHREAD_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEED_ASM_TRUE}" && test -z "${NEED_ASM_FALSE}"; then as_fn_error $? "conditional \"NEED_ASM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libatomic_ops $as_me 7.3alpha3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ libatomic_ops config.status 7.3alpha3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" PICFLAG="${PICFLAG}" CC="${CC}" DEFS="${DEFS}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default":C) ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi MoarVM-2015.11/3rdparty/libatomic_ops/configure.ac0000755000175000017500000001316712456307241020751 0ustar jnthnjnthn# Process this file with autoconf to produce a configure script. AC_INIT([libatomic_ops],[7.3alpha3],gc@linux.hpl.hp.com) AC_PREREQ(2.61) AC_CANONICAL_TARGET([]) AC_CONFIG_SRCDIR(src/atomic_ops.c) AM_INIT_AUTOMAKE([foreign dist-bzip2 nostdinc]) AM_MAINTAINER_MODE AC_CONFIG_HEADERS([src/config.h]) # Checks for programs. AM_PROG_CC_C_O AM_PROG_AS AC_PROG_RANLIB # Checks for functions. AC_FUNC_MMAP # Determine PIC flag. need_asm=false PICFLAG= AC_MSG_CHECKING(for PIC compiler flag) if test "$GCC" = yes; then case "$host" in *-*-cygwin* | *-*-mingw*) # Cygwin and Mingw[-w32/64] do not need -fPIC. AC_MSG_RESULT("") ;; *) AC_MSG_RESULT(-fPIC) PICFLAG=-fPIC AC_MSG_CHECKING(whether gcc -fPIC causes __PIC__ definition) # Workaround: at least GCC 3.4.6 (Solaris) does not define this macro. old_CFLAGS="$CFLAGS" CFLAGS="$PICFLAG $CFLAGS" AC_TRY_COMPILE([],[ #ifndef __PIC__ # error #endif ], [ac_cv_pic_macro=yes], [ac_cv_pic_macro=no]) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($ac_cv_pic_macro) AS_IF([test "$ac_cv_pic_macro" = yes], [], [PICFLAG="-D__PIC__=1 $PICFLAG"]) ;; esac # Output all warnings. AC_MSG_CHECKING(for gcc -Wextra) old_CFLAGS="$CFLAGS" CFLAGS="-Wextra $CFLAGS" AC_TRY_COMPILE([],[], [ac_cv_cc_wextra=yes], [ac_cv_cc_wextra=no]) CFLAGS="$old_CFLAGS" AC_MSG_RESULT($ac_cv_cc_wextra) AS_IF([test "$ac_cv_cc_wextra" = yes], [WEXTRA="-Wextra"], [WEXTRA="-W"]) CFLAGS="-Wall $WEXTRA $CFLAGS" else case "$host" in *-*-hpux*) AC_MSG_RESULT("+Z") PICFLAG="+Z" CFLAGS="+O2 -mt $CFLAGS" ;; *-*-solaris*) AC_MSG_RESULT(-Kpic) PICFLAG=-Kpic CFLAGS="-O $CFLAGS" need_asm=true ;; *-*-linux*) AC_MSG_RESULT(-fPIC) PICFLAG=-fPIC # Any Linux compiler had better be gcc compatible. ;; *) AC_MSG_RESULT("") ;; esac fi AC_ARG_ENABLE(assertions, [AC_HELP_STRING([--enable-assertions], [Assertion checking])]) if test "$enable_assertions" != yes; then AC_DEFINE([NDEBUG], 1, [Define to disable assertion checking.]) fi AC_SUBST(PICFLAG) AC_SUBST(DEFS) AH_TEMPLATE([_PTHREADS], [Indicates the use of pthreads (NetBSD).]) AH_TEMPLATE([AO_USE_NANOSLEEP], [Use nanosleep() instead of select() (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_USE_NO_SIGNALS], [Do not block signals in compare_and_swap (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_USE_WIN32_PTHREADS], [Use Win32 Sleep() instead of select() (only if atomic operations \ are emulated)]) AH_TEMPLATE([AO_TRACE_MALLOC], [Trace AO_malloc/free calls (for debug only)]) # These macros are tested in public headers AH_TEMPLATE([AO_GENERALIZE_ASM_BOOL_CAS], [Force compare_and_swap definition via fetch_compare_and_swap]) AH_TEMPLATE([AO_PREFER_GENERALIZED], [Prefer generalized definitions to direct assembly-based ones]) AH_TEMPLATE([AO_USE_PTHREAD_DEFS], [Emulate atomic operations via slow and async-signal-unsafe \ pthread locking]) AH_TEMPLATE([AO_ASM_X64_AVAILABLE], [Inline assembly avalable (only VC/x86_64)]) AH_TEMPLATE([AO_ASSUME_VISTA], [Assume Windows Server 2003, Vista or later target (only VC/x86)]) AH_TEMPLATE([AO_ASSUME_WINDOWS98], [Assume hardware compare-and-swap functionality available \ on target (only VC/x86)]) AH_TEMPLATE([AO_CMPXCHG16B_AVAILABLE], [Assume target is not old AMD Opteron chip (only x86_64)]) AH_TEMPLATE([AO_FORCE_USE_SWP], [Force test_and_set to use SWP instruction instead of LDREX/STREX \ (only arm v6+)]) AH_TEMPLATE([AO_NO_SPARC_V9], [Assume target is not sparc v9+ (only sparc)]) AH_TEMPLATE([AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE], [Assume ancient MS VS Win32 headers (only VC/arm v6+, VC/x86)]) AH_TEMPLATE([AO_UNIPROCESSOR], [Assume single-core target (only arm v6+)]) AH_TEMPLATE([AO_USE_INTERLOCKED_INTRINSICS], [Assume Win32 _Interlocked primitives available as intrinsics \ (only VC/arm)]) AH_TEMPLATE([AO_USE_PENTIUM4_INSTRS], [Use Pentium 4 'mfence' instruction (only x86)]) AH_TEMPLATE([AO_USE_SYNC_CAS_BUILTIN], [Prefer GCC built-in CAS intrinsics in favor of inline assembly \ (only gcc/x86, gcc/x86_64)]) AH_TEMPLATE([AO_WEAK_DOUBLE_CAS_EMULATION], [Emulate double-width CAS via pthread locking in case of no hardware \ support (only gcc/x86_64, the emulation is unsafe)]) AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads.]) # Libraries needed to support threads (if any). have_pthreads=false AC_CHECK_LIB(pthread, pthread_self, have_pthreads=true) if test x$have_pthreads = xtrue; then THREADDLLIBS=-lpthread case "$host" in *-*-netbsd*) # Indicates the use of pthreads. AC_DEFINE(_PTHREADS) ;; *-*-openbsd* | *-*-kfreebsd*-gnu | *-*-dgux*) THREADDLLIBS=-pthread ;; *-*-cygwin* | *-*-darwin*) # Cygwin does not have a real libpthread, so Libtool cannot link # against it. THREADDLLIBS= ;; *-*-mingw*) # Use Win32 threads for tests anyway. THREADDLLIBS= # Skip test_atomic_pthreads. have_pthreads=false ;; esac else AC_DEFINE([AO_NO_PTHREADS], 1, [No pthreads library available]) # Assume VxWorks or Win32. THREADDLLIBS= fi AC_SUBST(THREADDLLIBS) AM_CONDITIONAL(HAVE_PTHREAD_H, test x$have_pthreads = xtrue) AM_CONDITIONAL(NEED_ASM, test x$need_asm = xtrue) AC_CONFIG_FILES([ src/Makefile ]) AC_CONFIG_COMMANDS([default],[[]],[[ PICFLAG="${PICFLAG}" CC="${CC}" DEFS="${DEFS}" ]]) AC_OUTPUT MoarVM-2015.11/3rdparty/libatomic_ops/depcomp0000755000175000017500000005601612456307241020035 0ustar jnthnjnthn#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: MoarVM-2015.11/3rdparty/libatomic_ops/doc/LICENSING.txt0000755000175000017500000000536012456307241021300 0ustar jnthnjnthnOur intent is to make it easy to use libatomic_ops, in both free and proprietary software. Hence most code that we expect to be linked into a client application is covered by an MIT-style license. A few library routines are covered by the GNU General Public License. These are put into a separate library, libatomic_ops_gpl.a . The low-level part of the library is mostly covered by the following license: ---------------------------------------- Copyright (c) ... 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. -------------------------------- A few files in the sysdeps directory were inherited in part from the Boehm-Demers-Weiser conservative garbage collector, and are covered by its license, which is similar in spirit: -------------------------------- Copyright (c) ... THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. Permission is hereby granted to use or copy this program for any purpose, provided the above notices are retained on all copies. Permission to modify the code and to distribute modified code is granted, provided the above notices are retained, and a notice that the code was modified is included with the above copyright notice. ---------------------------------- A few files are covered by the GNU General Public License. (See file "COPYING".) This applies only to test code, sample applications, and the libatomic_ops_gpl portion of the library. Thus libatomic_ops_gpl should generally not be linked into proprietary code. (This distinction was motivated by patent considerations.) It is possible that the license of the GPL pieces may be changed for future versions to make them more consistent with the rest of the package. If you submit patches, and have strong preferences about licensing, please express them. MoarVM-2015.11/3rdparty/libatomic_ops/doc/README.txt0000755000175000017500000002720412456307241020723 0ustar jnthnjnthnUsage: 0) If possible, do this on a multiprocessor, especially if you are planning on modifying or enhancing the package. It will work on a uniprocessor, but the tests are much more likely to pass in the presence of serious problems. 1) Type ./configure --prefix=; make; make check in the directory containing unpacked source. The usual GNU build machinery is used, except that only static, but position-independent, libraries are normally built. On Windows, read README_win32.txt instead. 2) Applications should include atomic_ops.h. Nearly all operations are implemented by header files included from it. It is sometimes necessary, and always recommended to also link against libatomic_ops.a. To use the almost non-blocking stack or malloc implementations, see the corresponding README files, and also link against libatomic_gpl.a before linking against libatomic_ops.a. OVERVIEW: Atomic_ops.h defines a large collection of operations, each one of which is a combination of an (optional) atomic memory operation, and a memory barrier. Also defines associated feature-test macros to determine whether a particular operation is available on the current target hardware (either directly or by synthesis). This is an attempt to replace various existing files with similar goals, since they usually do not handle differences in memory barrier styles with sufficient generality. If this is included after defining AO_REQUIRE_CAS, then the package will make an attempt to emulate compare-and-swap in a way that (at least on Linux) should still be async-signal-safe. As a result, most other atomic operations will then be defined using the compare-and-swap emulation. This emulation is slow, since it needs to disable signals. And it needs to block in case of contention. If you care about performance on a platform that can't directly provide compare-and-swap, there are probably better alternatives. But this allows easy ports to some such platforms (e.g. PA_RISC). The option is ignored if compare-and-swap can be implemented directly. If atomic_ops.h is included after defining AO_USE_PTHREAD_DEFS, then all atomic operations will be emulated with pthread locking. This is NOT async-signal-safe. And it is slow. It is intended primarily for debugging of the atomic_ops package itself. Note that the implementation reflects our understanding of real processor behavior. This occasionally diverges from the documented behavior. (E.g. the documented X86 behavior seems to be weak enough that it is impractical to use. Current real implementations appear to be much better behaved.) We of course are in no position to guarantee that future processors (even HPs) will continue to behave this way, though we hope they will. This is a work in progress. Corrections/additions for other platforms are greatly appreciated. It passes rudimentary tests on X86, Itanium, and Alpha. OPERATIONS: Most operations operate on values of type AO_t, which are unsigned integers whose size matches that of pointers on the given architecture. Exceptions are: - AO_test_and_set operates on AO_TS_t, which is whatever size the hardware supports with good performance. In some cases this is the length of a cache line. In some cases it is a byte. In many cases it is equivalent to AO_t. - A few operations are implemented on smaller or larger size integers. Such operations are indicated by the appropriate prefix: AO_char_... Operates on unsigned char values. AO_short_... Operates on unsigned short values. AO_int_... Operates on unsigned int values. (Currently a very limited selection of these is implemented. We're working on it.) The defined operations are all of the form AO_[_](). The component specifies an atomic memory operation. It may be one of the following, where the corresponding argument and result types are also specified: void nop() No atomic operation. The barrier may still be useful. AO_t load(const volatile AO_t * addr) Atomic load of *addr. void store(volatile AO_t * addr, AO_t new_val) Atomically store new_val to *addr. AO_t fetch_and_add(volatile AO_t *addr, AO_t incr) Atomically add incr to *addr, and return the original value of *addr. AO_t fetch_and_add1(volatile AO_t *addr) Equivalent to AO_fetch_and_add(addr, 1). AO_t fetch_and_sub1(volatile AO_t *addr) Equivalent to AO_fetch_and_add(addr, (AO_t)(-1)). void and(volatile AO_t *addr, AO_t value) Atomically 'and' value into *addr. void or(volatile AO_t *addr, AO_t value) Atomically 'or' value into *addr. void xor(volatile AO_t *addr, AO_t value) Atomically 'xor' value into *addr. int compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val) Atomically compare *addr to old_val, and replace *addr by new_val if the first comparison succeeds. Returns nonzero if the comparison succeeded and *addr was updated. AO_t fetch_compare_and_swap(volatile AO_t * addr, AO_t old_val, AO_t new_val) Atomically compare *addr to old_val, and replace *addr by new_val if the first comparison succeeds; returns the original value of *addr. AO_TS_VAL_t test_and_set(volatile AO_TS_t * addr) Atomically read the binary value at *addr, and set it. AO_TS_VAL_t is an enumeration type which includes two values AO_TS_SET and AO_TS_CLEAR. An AO_TS_t location is capable of holding an AO_TS_VAL_t, but may be much larger, as dictated by hardware constraints. Test_and_set logically sets the value to AO_TS_SET. It may be reset to AO_TS_CLEAR with the AO_CLEAR(AO_TS_t *) macro. AO_TS_t locations should be initialized to AO_TS_INITIALIZER. The values of AO_TS_SET and AO_TS_CLEAR are hardware dependent. (On PA-RISC, AO_TS_SET is zero!) Test_and_set is a more limited version of compare_and_swap. Its only advantage is that it is more easily implementable on some hardware. It should thus be used if only binary test-and-set functionality is needed. If available, we also provide compare_and_swap operations that operate on wider values. Since standard data types for double width values may not be available, these explicitly take pairs of arguments for the new and/or old value. Unfortunately, there are two common variants, neither of which can easily and efficiently emulate the other. The first performs a comparison against the entire value being replaced, where the second replaces a double-width replacement, but performs a single-width comparison: int compare_double_and_swap_double(volatile AO_double_t * addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); int compare_and_swap_double(volatile AO_double_t * addr, AO_t old_val1, AO_t new_val1, AO_t new_val2); where AO_double_t is a structure containing AO_val1 and AO_val2 fields, both of type AO_t. For compare_and_swap_double, we compare against the val1 field. AO_double_t exists only if AO_HAVE_double_t is defined. ORDERING CONSTRAINTS: Each operation name also includes a suffix that specifies the associated ordering semantics. The ordering constraint limits reordering of this operation with respect to other atomic operations and ordinary memory references. The current implementation assumes that all memory references are to ordinary cacheable memory; the ordering guarantee is with respect to other threads or processes, not I/O devices. (Whether or not this distinction is important is platform-dependent.) Ordering suffixes are one of the following: : No memory barrier. A plain AO_nop() really does nothing. _release: Earlier operations must become visible to other threads before the atomic operation. _acquire: Later operations must become visible after this operation. _read: Subsequent reads must become visible after reads included in the atomic operation or preceding it. Rarely useful for clients? _write: Earlier writes become visible before writes during or after the atomic operation. Rarely useful for clients? _full: Ordered with respect to both earlier and later memory ops. AO_store_full or AO_nop_full are the normal ways to force a store to be ordered with respect to a later load. _release_write: Ordered with respect to earlier writes. This is normally implemented as either a _write or _release barrier. _acquire_read: Ordered with respect to later reads. This is normally implemented as either a _read or _acquire barrier. _dd_acquire_read: Ordered with respect to later reads that are data dependent on this one. This is needed on a pointer read, which is later dereferenced to read a second value, with the expectation that the second read is ordered after the first one. On most architectures, this is equivalent to no barrier. (This is very hard to define precisely. It should probably be avoided. A major problem is that optimizers tend to try to eliminate dependencies from the generated code, since dependencies force the hardware to execute the code serially.) We assume that if a store is data-dependent on an a previous load, then the two are always implicitly ordered. It is possible to test whether AO_ is available on the current platform by checking whether AO_HAVE__ is defined as a macro. Note that we generally don't implement operations that are either meaningless (e.g. AO_nop_acquire, AO_nop_release) or which appear to have no clear use (e.g. AO_load_release, AO_store_acquire, AO_load_write, AO_store_read). On some platforms (e.g. PA-RISC) many operations will remain undefined unless AO_REQUIRE_CAS is defined before including the package. When typed in the package build directory, the following command will print operations that are unimplemented on the platform: make test_atomic; ./test_atomic The following command generates a file "list_atomic.i" containing the macro expansions of all implemented operations on the platform: make list_atomic.i Future directions: It currently appears that something roughly analogous to this is very likely to become part of the C++0x standard. That effort has pointed out a number of issues that we expect to address there. Since some of the solutions really require compiler support, they may not be completely addressed here. Known issues include: We should be more precise in defining the semantics of the ordering constraints, and if and how we can guarantee sequential consistency. Dd_acquire_read is very hard or impossible to define in a way that cannot be invalidated by reasonably standard compiler transformations. There is probably no good reason to provide operations on standard integer types, since those may have the wrong alignment constraints. Example: If you want to initialize an object, and then "publish" a pointer to it in a global location p, such that other threads reading the new value of p are guaranteed to see an initialized object, it suffices to use AO_release_write(p, ...) to write the pointer to the object, and to retrieve it in other threads with AO_acquire_read(p). Platform notes: All X86: We quietly assume 486 or better. Microsoft compilers: Define AO_ASSUME_WINDOWS98 to get access to hardware compare-and-swap functionality. This relies on the InterlockedCompareExchange() function which was apparently not supported in Windows95. (There may be a better way to get access to this.) Gcc on x86: Define AO_USE_PENTIUM4_INSTRS to use the Pentium 4 mfence instruction. Currently this is appears to be of marginal benefit. MoarVM-2015.11/3rdparty/libatomic_ops/doc/README_malloc.txt0000755000175000017500000000601612456307241022250 0ustar jnthnjnthnThe libatomic_ops_gpl includes a simple almost-lock-free malloc implementation. This is intended as a safe way to allocate memory from a signal handler, or to allocate memory in the context of a library that does not know what thread library it will be used with. In either case locking is impossible. Note that the operations are only guaranteed to be 1-lock-free, i.e. a single blocked thread will not prevent progress, but multiple blocked threads may. To safely use these operations in a signal handler, the handler should be non-reentrant, i.e. it should not be interruptable by another handler using these operations. Furthermore use outside of signal handlers in a multithreaded application should be protected by a lock, so that at most one invocation may be interrupted by a signal. The header will define the macro "AO_MALLOC_IS_LOCK_FREE" on platforms on which malloc is completely lock-free, and hence these restrictions do not apply. In the presence of threads, but absence of contention, the time performance of this package should be as good, or slightly better than, most system malloc implementations. Its space performance is theoretically optimal (to within a constant factor), but probably quite poor in practice. In particular, no attempt is made to coalesce free small memory blocks. Something like Doug Lea's malloc is likely to use significantly less memory for complex applications. Performance on platforms without an efficient compare-and-swap implementation will be poor. This package was not designed for processor-scalability in the face of high allocation rates. If all threads happen to allocate different-sized objects, you might get lucky. Otherwise expect contention and false-sharing problems. If this is an issue, something like Maged Michael's algorithm (PLDI 2004) would be technically a far better choice. If you are concerned only with scalability, and not signal-safety, you might also consider using Hoard instead. We have seen a factor of 3 to 4 slowdown from the standard glibc malloc implementation with contention, even when the performance without contention was faster. (To make the implementation more scalable, one would need to replicate at least the free list headers, so that concurrent access is possible without cache conflicts.) Unfortunately there is no portable async-signal-safe way to obtain large chunks of memory from the OS. Based on reading of the source code, mmap-based allocation appears safe under Linux, and probably BSD variants. It is probably unsafe for operating systems built on Mach, such as Apple's Darwin. Without use of mmap, the allocator is limited to a fixed size, statically preallocated heap (2MB by default), and will fail to allocate objects above a certain size (just under 64K by default). Use of mmap to circumvent these limitations requires an explicit call. The entire interface to the AO_malloc package currently consists of: #include /* includes atomic_ops.h */ void *AO_malloc(size_t sz); void AO_free(void *p); void AO_malloc_enable_mmap(void); MoarVM-2015.11/3rdparty/libatomic_ops/doc/README_stack.txt0000755000175000017500000000766412456307241022120 0ustar jnthnjnthnNote that the AO_stack implementation is licensed under the GPL, unlike the lower level routines. The header file atomic_ops_stack.h defines a linked stack abstraction. Stacks may be accessed by multiple concurrent threads. The implementation is 1-lock-free, i.e. it will continue to make progress if at most one thread becomes inactive while operating on the data structure. (The implementation can be built to be N-lock-free for any given N. But that seems to rarely be useful, especially since larger N involve some slowdown.) This makes it safe to access these data structures from non-reentrant signal handlers, provided at most one non-signal-handler thread is accessing the data structure at once. This latter condition can be ensured by acquiring an ordinary lock around the non-handler accesses to the data structure. For details see: Hans-J. Boehm, "An Almost Non-Blocking Stack", PODC 2004, http://portal.acm.org/citation.cfm?doid=1011767.1011774, or http://www.hpl.hp.com/techreports/2004/HPL-2004-105.html (This is not exactly the implementation described there, since the interface was cleaned up in the interim. But it should perform very similarly.) We use a fully lock-free implementation when the underlying hardware makes that less expensive, i.e. when we have a double-wide compare-and-swap operation available. (The fully lock-free implementation uses an AO_t- sized version count, and assumes it does not wrap during the time any given operation is active. This seems reasonably safe on 32-bit hardware, and very safe on 64-bit hardware.) If a fully lock-free implementation is used, the macro AO_STACK_IS_LOCK_FREE will be defined. The implementation is interesting only because it allows reuse of existing nodes. This is necessary, for example, to implement a memory allocator. Since we want to leave the precise stack node type up to the client, we insist only that each stack node contains a link field of type AO_t. When a new node is pushed on the stack, the push operation expects to be passed the pointer to this link field, which will then be overwritten by this link field. Similarly, the pop operation returns a pointer to the link field of the object that previously was on the top of the stack. The cleanest way to use these routines is probably to define the stack node type with an initial AO_t link field, so that the conversion between the link-field pointer and the stack element pointer is just a compile-time cast. But other possibilities exist. (This would be cleaner in C++ with templates.) A stack is represented by an AO_stack_t structure. (This is normally 2 or 3 times the size of a pointer.) It may be statically initialized by setting it to AO_STACK_INITIALIZER, or dynamically initialized to an empty stack with AO_stack_init. There are only three operations for accessing stacks: void AO_stack_init(AO_stack_t *list); void AO_stack_push_release(AO_stack_t *list, AO_t *new_element); AO_t * AO_stack_pop_acquire(volatile AO_stack_t *list); We require that the objects pushed as list elements remain addressable as long as any push or pop operation are in progress. (It is OK for an object to be "pop"ped off a stack and "deallocated" with a concurrent "pop" on the same stack still in progress, but only if "deallocation" leaves the object addressable. The second "pop" may still read the object, but the value it reads will not matter.) We require that the headers (AO_stack objects) remain allocated and valid as long as any operations on them are still in-flight. We also provide macros AO_REAL_HEAD_PTR that converts an AO_stack_t to a pointer to the link field in the next element, and AO_REAL_NEXT_PTR that converts a link field to a real, dereferencable, pointer to the link field in the next element. This is intended only for debugging, or to traverse the list after modification has ceased. There is otherwise no guarantee that walking a stack using this macro will produce any kind of consistent picture of the data structure. MoarVM-2015.11/3rdparty/libatomic_ops/doc/README_win32.txt0000755000175000017500000000316512456307241021745 0ustar jnthnjnthnMost of the atomic_ops functionality is available under Win32 with the Microsoft tools, but the build process currently is considerably more primitive than on Linux/Unix platforms. To build: 1) Go to the src directory in the distribution. 2) Make sure the Microsoft command-line tools (e.g. nmake) are available. 3) Run "nmake -f Makefile.msft". This should run some tests, which may print warnings about the types of the "Interlocked" functions. I haven't been able to make all versions of VC++ happy. If you know how to, please send a patch. 4) To compile applications, you will need to retain or copy the following pieces from the resulting src directory contents: "atomic_ops.h" - Header file defining low-level primitives. This includes files from: "atomic_ops"- Subdirectory containing implementation header files. "atomic_ops_stack.h" - Header file describing almost lock-free stack. "atomic_ops_malloc.h" - Header file describing almost lock-free malloc. "libatomic_ops_gpl.lib" - Library containing implementation of the above two (plus AO_pause() defined in atomic_ops.c). The atomic_ops.h implementation is entirely in the header files in Win32. Most clients of atomic_ops.h will need to define AO_ASSUME_WINDOWS98 before including it. Compare_and_swap is otherwise not available. Defining AO_ASSUME_VISTA will make compare_double_and_swap_double available as well. Note that the library is covered by the GNU General Public License, while the top 2 of these pieces allow use in proprietary code. MoarVM-2015.11/3rdparty/libatomic_ops/install-sh0000755000175000017500000003325512456307241020464 0ustar jnthnjnthn#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: MoarVM-2015.11/3rdparty/libatomic_ops/missing0000755000175000017500000001533112456307241020052 0ustar jnthnjnthn#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: MoarVM-2015.11/3rdparty/libatomic_ops/src/Makefile.am0000755000175000017500000002345712456307241021311 0ustar jnthnjnthnAM_CFLAGS=@PICFLAG@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src include_HEADERS = atomic_ops.h lib_LIBRARIES = libatomic_ops.a if NEED_ASM libatomic_ops_a_SOURCES = atomic_ops.c atomic_ops_sysdeps.S else libatomic_ops_a_SOURCES = atomic_ops.c endif EXTRA_DIST = atomic_ops/sysdeps/README \ atomic_ops/generalize-arithm.template \ atomic_ops/generalize-small.template \ atomic_ops/sysdeps/ao_t_is_int.template \ atomic_ops/sysdeps/gcc/generic-arithm.template \ atomic_ops/sysdeps/gcc/generic-small.template \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template \ atomic_ops/sysdeps/loadstore/atomic_load.template \ atomic_ops/sysdeps/loadstore/atomic_store.template \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template \ atomic_ops/sysdeps/sunc/sparc.S BUILT_SOURCES = atomic_ops/generalize-arithm.h \ atomic_ops/generalize-small.h \ atomic_ops/sysdeps/ao_t_is_int.h \ atomic_ops/sysdeps/gcc/generic-arithm.h \ atomic_ops/sysdeps/gcc/generic-small.h \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/atomic_load.h \ atomic_ops/sysdeps/loadstore/atomic_store.h \ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/char_atomic_load.h \ atomic_ops/sysdeps/loadstore/char_atomic_store.h \ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/int_atomic_load.h \ atomic_ops/sysdeps/loadstore/int_atomic_store.h \ atomic_ops/sysdeps/loadstore/ordered_loads_only.h \ atomic_ops/sysdeps/loadstore/ordered_stores_only.h \ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/short_atomic_load.h \ atomic_ops/sysdeps/loadstore/short_atomic_store.h #Private Headers privatedir=${includedir}/ nobase_private_HEADERS = atomic_ops/ao_version.h \ atomic_ops/generalize.h \ $(BUILT_SOURCES) \ \ atomic_ops/sysdeps/all_acquire_release_volatile.h \ atomic_ops/sysdeps/all_aligned_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_only_load.h \ atomic_ops/sysdeps/emul_cas.h \ atomic_ops/sysdeps/generic_pthread.h \ atomic_ops/sysdeps/ordered.h \ atomic_ops/sysdeps/ordered_except_wr.h \ atomic_ops/sysdeps/read_ordered.h \ atomic_ops/sysdeps/standard_ao_double_t.h \ atomic_ops/sysdeps/test_and_set_t_is_ao_t.h \ atomic_ops/sysdeps/test_and_set_t_is_char.h \ \ atomic_ops/sysdeps/armcc/arm_v6.h \ \ atomic_ops/sysdeps/gcc/aarch64.h \ atomic_ops/sysdeps/gcc/alpha.h \ atomic_ops/sysdeps/gcc/arm.h \ atomic_ops/sysdeps/gcc/avr32.h \ atomic_ops/sysdeps/gcc/cris.h \ atomic_ops/sysdeps/gcc/generic.h \ atomic_ops/sysdeps/gcc/hexagon.h \ atomic_ops/sysdeps/gcc/hppa.h \ atomic_ops/sysdeps/gcc/ia64.h \ atomic_ops/sysdeps/gcc/m68k.h \ atomic_ops/sysdeps/gcc/mips.h \ atomic_ops/sysdeps/gcc/powerpc.h \ atomic_ops/sysdeps/gcc/s390.h \ atomic_ops/sysdeps/gcc/sh.h \ atomic_ops/sysdeps/gcc/sparc.h \ atomic_ops/sysdeps/gcc/x86.h \ \ atomic_ops/sysdeps/hpc/hppa.h \ atomic_ops/sysdeps/hpc/ia64.h \ \ atomic_ops/sysdeps/ibmc/powerpc.h \ \ atomic_ops/sysdeps/icc/ia64.h \ \ atomic_ops/sysdeps/loadstore/double_atomic_load_store.h \ \ atomic_ops/sysdeps/msftc/arm.h \ atomic_ops/sysdeps/msftc/common32_defs.h \ atomic_ops/sysdeps/msftc/x86.h \ atomic_ops/sysdeps/msftc/x86_64.h \ \ atomic_ops/sysdeps/sunc/sparc.h \ atomic_ops/sysdeps/sunc/x86.h atomic_ops/generalize-small.h: atomic_ops/generalize-small.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/generalize-arithm.h: atomic_ops/generalize-arithm.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/ao_t_is_int.h: atomic_ops/sysdeps/ao_t_is_int.template sed -e s:_XBAR::g $? > $@ sed -e s:XBAR:full:g $? >> $@ sed -e s:XBAR:acquire:g $? >> $@ sed -e s:XBAR:release:g $? >> $@ sed -e s:XBAR:write:g $? >> $@ sed -e s:XBAR:read:g $? >> $@ atomic_ops/sysdeps/gcc/generic-arithm.h: \ atomic_ops/sysdeps/gcc/generic-arithm.template sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/gcc/generic-small.h: \ atomic_ops/sysdeps/gcc/generic-small.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_loads_only.h: \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_stores_only.h: \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ MoarVM-2015.11/3rdparty/libatomic_ops/src/Makefile.in0000755000175000017500000010024512456307241021311 0ustar jnthnjnthn# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/config.h.in $(top_srcdir)/depcomp $(include_HEADERS) \ $(nobase_private_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \ "$(DESTDIR)$(privatedir)" LIBRARIES = $(lib_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libatomic_ops_a_AR = $(AR) $(ARFLAGS) libatomic_ops_a_LIBADD = am__libatomic_ops_a_SOURCES_DIST = atomic_ops.c atomic_ops_sysdeps.S @NEED_ASM_FALSE@am_libatomic_ops_a_OBJECTS = atomic_ops.$(OBJEXT) @NEED_ASM_TRUE@am_libatomic_ops_a_OBJECTS = atomic_ops.$(OBJEXT) \ @NEED_ASM_TRUE@ atomic_ops_sysdeps.$(OBJEXT) libatomic_ops_a_OBJECTS = $(am_libatomic_ops_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) am__v_CPPAS_0 = @echo " CPPAS " $@; am__v_CPPAS_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libatomic_ops_a_SOURCES) DIST_SOURCES = $(am__libatomic_ops_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) $(nobase_private_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PICFLAG = @PICFLAG@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ THREADDLLIBS = @THREADDLLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = @PICFLAG@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src include_HEADERS = atomic_ops.h lib_LIBRARIES = libatomic_ops.a @NEED_ASM_FALSE@libatomic_ops_a_SOURCES = atomic_ops.c @NEED_ASM_TRUE@libatomic_ops_a_SOURCES = atomic_ops.c atomic_ops_sysdeps.S EXTRA_DIST = atomic_ops/sysdeps/README \ atomic_ops/generalize-arithm.template \ atomic_ops/generalize-small.template \ atomic_ops/sysdeps/ao_t_is_int.template \ atomic_ops/sysdeps/gcc/generic-arithm.template \ atomic_ops/sysdeps/gcc/generic-small.template \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template \ atomic_ops/sysdeps/loadstore/atomic_load.template \ atomic_ops/sysdeps/loadstore/atomic_store.template \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template \ atomic_ops/sysdeps/sunc/sparc.S BUILT_SOURCES = atomic_ops/generalize-arithm.h \ atomic_ops/generalize-small.h \ atomic_ops/sysdeps/ao_t_is_int.h \ atomic_ops/sysdeps/gcc/generic-arithm.h \ atomic_ops/sysdeps/gcc/generic-small.h \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/atomic_load.h \ atomic_ops/sysdeps/loadstore/atomic_store.h \ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/char_atomic_load.h \ atomic_ops/sysdeps/loadstore/char_atomic_store.h \ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/int_atomic_load.h \ atomic_ops/sysdeps/loadstore/int_atomic_store.h \ atomic_ops/sysdeps/loadstore/ordered_loads_only.h \ atomic_ops/sysdeps/loadstore/ordered_stores_only.h \ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h \ atomic_ops/sysdeps/loadstore/short_atomic_load.h \ atomic_ops/sysdeps/loadstore/short_atomic_store.h #Private Headers privatedir = ${includedir}/ nobase_private_HEADERS = atomic_ops/ao_version.h \ atomic_ops/generalize.h \ $(BUILT_SOURCES) \ \ atomic_ops/sysdeps/all_acquire_release_volatile.h \ atomic_ops/sysdeps/all_aligned_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_load_store.h \ atomic_ops/sysdeps/all_atomic_only_load.h \ atomic_ops/sysdeps/emul_cas.h \ atomic_ops/sysdeps/generic_pthread.h \ atomic_ops/sysdeps/ordered.h \ atomic_ops/sysdeps/ordered_except_wr.h \ atomic_ops/sysdeps/read_ordered.h \ atomic_ops/sysdeps/standard_ao_double_t.h \ atomic_ops/sysdeps/test_and_set_t_is_ao_t.h \ atomic_ops/sysdeps/test_and_set_t_is_char.h \ \ atomic_ops/sysdeps/armcc/arm_v6.h \ \ atomic_ops/sysdeps/gcc/aarch64.h \ atomic_ops/sysdeps/gcc/alpha.h \ atomic_ops/sysdeps/gcc/arm.h \ atomic_ops/sysdeps/gcc/avr32.h \ atomic_ops/sysdeps/gcc/cris.h \ atomic_ops/sysdeps/gcc/generic.h \ atomic_ops/sysdeps/gcc/hexagon.h \ atomic_ops/sysdeps/gcc/hppa.h \ atomic_ops/sysdeps/gcc/ia64.h \ atomic_ops/sysdeps/gcc/m68k.h \ atomic_ops/sysdeps/gcc/mips.h \ atomic_ops/sysdeps/gcc/powerpc.h \ atomic_ops/sysdeps/gcc/s390.h \ atomic_ops/sysdeps/gcc/sh.h \ atomic_ops/sysdeps/gcc/sparc.h \ atomic_ops/sysdeps/gcc/x86.h \ \ atomic_ops/sysdeps/hpc/hppa.h \ atomic_ops/sysdeps/hpc/ia64.h \ \ atomic_ops/sysdeps/ibmc/powerpc.h \ \ atomic_ops/sysdeps/icc/ia64.h \ \ atomic_ops/sysdeps/loadstore/double_atomic_load_store.h \ \ atomic_ops/sysdeps/msftc/arm.h \ atomic_ops/sysdeps/msftc/common32_defs.h \ atomic_ops/sysdeps/msftc/x86.h \ atomic_ops/sysdeps/msftc/x86_64.h \ \ atomic_ops/sysdeps/sunc/sparc.h \ atomic_ops/sysdeps/sunc/x86.h all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .S .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-libLIBRARIES: $(lib_LIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } @$(POST_INSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ if test -f $$p; then \ $(am__strip_dir) \ echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ else :; fi; \ done uninstall-libLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) clean-libLIBRARIES: -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) libatomic_ops.a: $(libatomic_ops_a_OBJECTS) $(libatomic_ops_a_DEPENDENCIES) $(EXTRA_libatomic_ops_a_DEPENDENCIES) $(AM_V_at)-rm -f libatomic_ops.a $(AM_V_AR)$(libatomic_ops_a_AR) libatomic_ops.a $(libatomic_ops_a_OBJECTS) $(libatomic_ops_a_LIBADD) $(AM_V_at)$(RANLIB) libatomic_ops.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic_ops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic_ops_sysdeps.Po@am__quote@ .S.o: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< .S.obj: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nobase_privateHEADERS: $(nobase_private_HEADERS) @$(NORMAL_INSTALL) @list='$(nobase_private_HEADERS)'; test -n "$(privatedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(privatedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(privatedir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(privatedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(privatedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(privatedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(privatedir)/$$dir" || exit $$?; }; \ done uninstall-nobase_privateHEADERS: @$(NORMAL_UNINSTALL) @list='$(nobase_private_HEADERS)'; test -n "$(privatedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(privatedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) $(HEADERS) config.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(privatedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-nobase_privateHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_privateHEADERS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLIBRARIES install-man \ install-nobase_privateHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-includeHEADERS uninstall-libLIBRARIES \ uninstall-nobase_privateHEADERS atomic_ops/generalize-small.h: atomic_ops/generalize-small.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/generalize-arithm.h: atomic_ops/generalize-arithm.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/ao_t_is_int.h: atomic_ops/sysdeps/ao_t_is_int.template sed -e s:_XBAR::g $? > $@ sed -e s:XBAR:full:g $? >> $@ sed -e s:XBAR:acquire:g $? >> $@ sed -e s:XBAR:release:g $? >> $@ sed -e s:XBAR:write:g $? >> $@ sed -e s:XBAR:read:g $? >> $@ atomic_ops/sysdeps/gcc/generic-arithm.h: \ atomic_ops/sysdeps/gcc/generic-arithm.template sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:_XBAR::g -e s:XGCCBAR:RELAXED:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:acquire:g -e s:XGCCBAR:ACQUIRE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:release:g -e s:XGCCBAR:RELEASE:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XBAR:full:g -e s:XGCCBAR:SEQ_CST:g \ -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/gcc/generic-small.h: \ atomic_ops/sysdeps/gcc/generic-small.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_loads_only.h: \ atomic_ops/sysdeps/loadstore/ordered_loads_only.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/ordered_stores_only.h: \ atomic_ops/sysdeps/loadstore/ordered_stores_only.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? >> $@ sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? >> $@ sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? >> $@ sed -e s:XSIZE:double:g -e s:XCTYPE:AO_double_t:g $? >> $@ atomic_ops/sysdeps/loadstore/acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h: \ atomic_ops/sysdeps/loadstore/acquire_release_volatile.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_load.h: \ atomic_ops/sysdeps/loadstore/atomic_load.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ atomic_ops/sysdeps/loadstore/atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE_::g -e s:XCTYPE:AO_t:g $? > $@ atomic_ops/sysdeps/loadstore/char_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:char:g -e s:XCTYPE:unsigned/**/char:g $? > $@ atomic_ops/sysdeps/loadstore/int_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:int:g -e s:XCTYPE:unsigned:g $? > $@ atomic_ops/sysdeps/loadstore/short_atomic_store.h: \ atomic_ops/sysdeps/loadstore/atomic_store.template sed -e s:XSIZE:short:g -e s:XCTYPE:unsigned/**/short:g $? > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops.c0000755000175000017500000001642612456307241021554 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* * Initialized data and out-of-line functions to support atomic_ops.h * go here. Currently this is needed only for pthread-based atomics * emulation, or for compare-and-swap emulation. * Pthreads emulation isn't useful on a native Windows platform, and * cas emulation is not needed. Thus we skip this on Windows. */ #if defined(HAVE_CONFIG_H) # include "config.h" #endif #if defined(__native_client__) && !defined(AO_USE_NO_SIGNALS) \ && !defined(AO_USE_NANOSLEEP) /* Since NaCl is not recognized by configure yet, we do it here. */ # define AO_USE_NO_SIGNALS # define AO_USE_NANOSLEEP #endif #if defined(AO_USE_WIN32_PTHREADS) && !defined(AO_USE_NO_SIGNALS) # define AO_USE_NO_SIGNALS #endif #undef AO_REQUIRE_CAS #include "atomic_ops.h" /* Without cas emulation! */ #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__BORLANDC__) \ || defined(AO_USE_NO_SIGNALS) #ifndef AO_NO_PTHREADS # include #endif #ifndef AO_USE_NO_SIGNALS # include #endif #ifdef AO_USE_NANOSLEEP /* This requires _POSIX_TIMERS feature. */ # include # include #elif defined(AO_USE_WIN32_PTHREADS) # include /* for Sleep() */ #elif defined(_HPUX_SOURCE) # include #else # include #endif #ifndef AO_HAVE_double_t # include "atomic_ops/sysdeps/standard_ao_double_t.h" #endif /* Lock for pthreads-based implementation. */ #ifndef AO_NO_PTHREADS pthread_mutex_t AO_pt_lock = PTHREAD_MUTEX_INITIALIZER; #endif /* * Out of line compare-and-swap emulation based on test and set. * * We use a small table of locks for different compare_and_swap locations. * Before we update perform a compare-and-swap, we grab the corresponding * lock. Different locations may hash to the same lock, but since we * never acquire more than one lock at a time, this can't deadlock. * We explicitly disable signals while we perform this operation. * * TODO: Probably also support emulation based on Lamport * locks, since we may not have test_and_set either. */ #define AO_HASH_SIZE 16 #define AO_HASH(x) (((unsigned long)(x) >> 12) & (AO_HASH_SIZE-1)) AO_TS_t AO_locks[AO_HASH_SIZE] = { AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, AO_TS_INITIALIZER, }; void AO_pause(int); /* defined below */ static void lock_ool(volatile AO_TS_t *l) { int i = 0; while (AO_test_and_set_acquire(l) == AO_TS_SET) AO_pause(++i); } AO_INLINE void lock(volatile AO_TS_t *l) { if (AO_EXPECT_FALSE(AO_test_and_set_acquire(l) == AO_TS_SET)) lock_ool(l); } AO_INLINE void unlock(volatile AO_TS_t *l) { AO_CLEAR(l); } #ifndef AO_USE_NO_SIGNALS static sigset_t all_sigs; static volatile AO_t initialized = 0; static volatile AO_TS_t init_lock = AO_TS_INITIALIZER; AO_INLINE void block_all_signals(sigset_t *old_sigs_ptr) { if (AO_EXPECT_FALSE(!AO_load_acquire(&initialized))) { lock(&init_lock); if (!initialized) sigfillset(&all_sigs); unlock(&init_lock); AO_store_release(&initialized, 1); } sigprocmask(SIG_BLOCK, &all_sigs, old_sigs_ptr); /* Neither sigprocmask nor pthread_sigmask is 100% */ /* guaranteed to work here. Sigprocmask is not */ /* guaranteed be thread safe, and pthread_sigmask */ /* is not async-signal-safe. Under linuxthreads, */ /* sigprocmask may block some pthreads-internal */ /* signals. So long as we do that for short periods, */ /* we should be OK. */ } #endif /* !AO_USE_NO_SIGNALS */ AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); AO_t fetched_val; # ifndef AO_USE_NO_SIGNALS sigset_t old_sigs; block_all_signals(&old_sigs); # endif lock(my_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; unlock(my_lock); # ifndef AO_USE_NO_SIGNALS sigprocmask(SIG_SETMASK, &old_sigs, NULL); # endif return fetched_val; } int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); int result; # ifndef AO_USE_NO_SIGNALS sigset_t old_sigs; block_all_signals(&old_sigs); # endif lock(my_lock); if (addr -> AO_val1 == old_val1 && addr -> AO_val2 == old_val2) { addr -> AO_val1 = new_val1; addr -> AO_val2 = new_val2; result = 1; } else result = 0; unlock(my_lock); # ifndef AO_USE_NO_SIGNALS sigprocmask(SIG_SETMASK, &old_sigs, NULL); # endif return result; } void AO_store_full_emulation(volatile AO_t *addr, AO_t val) { AO_TS_t *my_lock = AO_locks + AO_HASH(addr); lock(my_lock); *addr = val; unlock(my_lock); } #else /* Non-posix platform */ # include # define AO_USE_WIN32_PTHREADS /* define to use Sleep() */ extern int AO_non_posix_implementation_is_entirely_in_headers; #endif static AO_t spin_dummy = 1; /* Spin for 2**n units. */ static void AO_spin(int n) { AO_t j = AO_load(&spin_dummy); int i = 2 << n; while (i-- > 0) j += (j - 1) << 2; /* Given 'spin_dummy' is initialized to 1, j is 1 after the loop. */ AO_store(&spin_dummy, j); } void AO_pause(int n) { if (n < 12) AO_spin(n); else { # ifdef AO_USE_NANOSLEEP struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = (n > 28 ? 100000 * 1000 : 1 << (n - 2)); nanosleep(&ts, 0); # elif defined(AO_USE_WIN32_PTHREADS) Sleep(n > 28 ? 100 : n < 22 ? 1 : 1 << (n - 22)); /* in millis */ # else struct timeval tv; /* Short async-signal-safe sleep. */ tv.tv_sec = 0; tv.tv_usec = n > 28 ? 100000 : 1 << (n - 12); select(0, 0, 0, 0, &tv); # endif } } MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops.h0000755000175000017500000004456612456307241021567 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ #ifndef AO_ATOMIC_OPS_H #define AO_ATOMIC_OPS_H #include "atomic_ops/ao_version.h" /* Define version numbers here to allow */ /* test on build machines for cross-builds. */ #include #include /* We define various atomic operations on memory in a */ /* machine-specific way. Unfortunately, this is complicated */ /* by the fact that these may or may not be combined with */ /* various memory barriers. Thus the actual operations we */ /* define have the form AO__, for all */ /* plausible combinations of and . */ /* This of course results in a mild combinatorial explosion. */ /* To deal with it, we try to generate derived */ /* definitions for as many of the combinations as we can, as */ /* automatically as possible. */ /* */ /* Our assumption throughout is that the programmer will */ /* specify the least demanding operation and memory barrier */ /* that will guarantee correctness for the implementation. */ /* Our job is to find the least expensive way to implement it */ /* on the applicable hardware. In many cases that will */ /* involve, for example, a stronger memory barrier, or a */ /* combination of hardware primitives. */ /* */ /* Conventions: */ /* "plain" atomic operations are not guaranteed to include */ /* a barrier. The suffix in the name specifies the barrier */ /* type. Suffixes are: */ /* _release: Earlier operations may not be delayed past it. */ /* _acquire: Later operations may not move ahead of it. */ /* _read: Subsequent reads must follow this operation and */ /* preceding reads. */ /* _write: Earlier writes precede both this operation and */ /* later writes. */ /* _full: Ordered with respect to both earlier and later memory */ /* operations. */ /* _release_write: Ordered with respect to earlier writes. */ /* _acquire_read: Ordered with respect to later reads. */ /* */ /* Currently we try to define the following atomic memory */ /* operations, in combination with the above barriers: */ /* AO_nop */ /* AO_load */ /* AO_store */ /* AO_test_and_set (binary) */ /* AO_fetch_and_add */ /* AO_fetch_and_add1 */ /* AO_fetch_and_sub1 */ /* AO_and */ /* AO_or */ /* AO_xor */ /* AO_compare_and_swap */ /* AO_fetch_compare_and_swap */ /* */ /* Note that atomicity guarantees are valid only if both */ /* readers and writers use AO_ operations to access the */ /* shared value, while ordering constraints are intended to */ /* apply all memory operations. If a location can potentially */ /* be accessed simultaneously from multiple threads, and one of */ /* those accesses may be a write access, then all such */ /* accesses to that location should be through AO_ primitives. */ /* However if AO_ operations enforce sufficient ordering to */ /* ensure that a location x cannot be accessed concurrently, */ /* or can only be read concurrently, then x can be accessed */ /* via ordinary references and assignments. */ /* */ /* AO_compare_and_swap takes an address and an expected old */ /* value and a new value, and returns an int. Non-zero result */ /* indicates that it succeeded. */ /* AO_fetch_compare_and_swap takes an address and an expected */ /* old value and a new value, and returns the real old value. */ /* The operation succeeded if and only if the expected old */ /* value matches the old value returned. */ /* */ /* Test_and_set takes an address, atomically replaces it by */ /* AO_TS_SET, and returns the prior value. */ /* An AO_TS_t location can be reset with the */ /* AO_CLEAR macro, which normally uses AO_store_release. */ /* AO_fetch_and_add takes an address and an AO_t increment */ /* value. The AO_fetch_and_add1 and AO_fetch_and_sub1 variants */ /* are provided, since they allow faster implementations on */ /* some hardware. AO_and, AO_or, AO_xor do atomically and, or, */ /* xor (respectively) an AO_t value into a memory location, */ /* but do not provide access to the original. */ /* */ /* We expect this list to grow slowly over time. */ /* */ /* Note that AO_nop_full is a full memory barrier. */ /* */ /* Note that if some data is initialized with */ /* data.x = ...; data.y = ...; ... */ /* AO_store_release_write(&data_is_initialized, 1) */ /* then data is guaranteed to be initialized after the test */ /* if (AO_load_acquire_read(&data_is_initialized)) ... */ /* succeeds. Furthermore, this should generate near-optimal */ /* code on all common platforms. */ /* */ /* All operations operate on unsigned AO_t, which */ /* is the natural word size, and usually unsigned long. */ /* It is possible to check whether a particular operation op */ /* is available on a particular platform by checking whether */ /* AO_HAVE_op is defined. We make heavy use of these macros */ /* internally. */ /* The rest of this file basically has three sections: */ /* */ /* Some utility and default definitions. */ /* */ /* The architecture dependent section: */ /* This defines atomic operations that have direct hardware */ /* support on a particular platform, mostly by including the */ /* appropriate compiler- and hardware-dependent file. */ /* */ /* The synthesis section: */ /* This tries to define other atomic operations in terms of */ /* those that are explicitly available on the platform. */ /* This section is hardware independent. */ /* We make no attempt to synthesize operations in ways that */ /* effectively introduce locks, except for the debugging/demo */ /* pthread-based implementation at the beginning. A more */ /* realistic implementation that falls back to locks could be */ /* added as a higher layer. But that would sacrifice */ /* usability from signal handlers. */ /* The synthesis section is implemented almost entirely in */ /* atomic_ops/generalize.h. */ /* Some common defaults. Overridden for some architectures. */ #define AO_t size_t /* The test_and_set primitive returns an AO_TS_VAL_t value. */ /* AO_TS_t is the type of an in-memory test-and-set location. */ #define AO_TS_INITIALIZER (AO_t)AO_TS_CLEAR /* Platform-dependent stuff: */ #if (defined(__GNUC__) || defined(_MSC_VER) || defined(__INTEL_COMPILER) \ || defined(__DMC__) || defined(__WATCOMC__)) && !defined(AO_NO_INLINE) # define AO_INLINE static __inline #elif defined(__sun) && !defined(AO_NO_INLINE) # define AO_INLINE static inline #else # define AO_INLINE static #endif #if __GNUC__ >= 3 && !defined(LINT2) # define AO_EXPECT_FALSE(expr) __builtin_expect(expr, 0) /* Equivalent to (expr) but predict that usually (expr) == 0. */ #else # define AO_EXPECT_FALSE(expr) (expr) #endif /* !__GNUC__ */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) # define AO_compiler_barrier() __asm__ __volatile__("" : : : "memory") #elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \ || defined(__WATCOMC__) # if defined(_AMD64_) || defined(_M_X64) || _MSC_VER >= 1400 # if defined(_WIN32_WCE) /* # include */ # elif defined(_MSC_VER) # include # endif # pragma intrinsic(_ReadWriteBarrier) # define AO_compiler_barrier() _ReadWriteBarrier() /* We assume this does not generate a fence instruction. */ /* The documentation is a bit unclear. */ # else # define AO_compiler_barrier() __asm { } /* The preceding implementation may be preferable here too. */ /* But the documentation warns about VC++ 2003 and earlier. */ # endif #elif defined(__INTEL_COMPILER) # define AO_compiler_barrier() __memory_barrier() /* FIXME: Too strong? IA64-only? */ #elif defined(_HPUX_SOURCE) # if defined(__ia64) # include # define AO_compiler_barrier() _Asm_sched_fence() # else /* FIXME - We dont know how to do this. This is a guess. */ /* And probably a bad one. */ static volatile int AO_barrier_dummy; # define AO_compiler_barrier() (void)(AO_barrier_dummy = AO_barrier_dummy) # endif #else /* We conjecture that the following usually gives us the right */ /* semantics or an error. */ # define AO_compiler_barrier() asm("") #endif #if defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/generic_pthread.h" #endif /* AO_USE_PTHREAD_DEFS */ #if (defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__GNUC__) \ && !defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/armcc/arm_v6.h" # define AO_GENERALIZE_TWICE #endif #if defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) \ && !defined(__INTEL_COMPILER) # if defined(__i386__) /* We don't define AO_USE_SYNC_CAS_BUILTIN for x86 here because */ /* it might require specifying additional options (like -march) */ /* or additional link libraries (if -march is not specified). */ # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __i386__ */ # if defined(__x86_64__) # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) \ && !defined(AO_USE_SYNC_CAS_BUILTIN) /* It is safe to use __sync CAS built-in on this architecture. */ # define AO_USE_SYNC_CAS_BUILTIN # endif # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __x86_64__ */ # if defined(__ia64__) # include "atomic_ops/sysdeps/gcc/ia64.h" # define AO_GENERALIZE_TWICE # endif /* __ia64__ */ # if defined(__hppa__) # include "atomic_ops/sysdeps/gcc/hppa.h" # define AO_CAN_EMUL_CAS # endif /* __hppa__ */ # if defined(__alpha__) # include "atomic_ops/sysdeps/gcc/alpha.h" # define AO_GENERALIZE_TWICE # endif /* __alpha__ */ # if defined(__s390__) # include "atomic_ops/sysdeps/gcc/s390.h" # endif /* __s390__ */ # if defined(__sparc__) # include "atomic_ops/sysdeps/gcc/sparc.h" # define AO_CAN_EMUL_CAS # endif /* __sparc__ */ # if defined(__m68k__) # include "atomic_ops/sysdeps/gcc/m68k.h" # endif /* __m68k__ */ # if defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \ || defined(__powerpc64__) || defined(__ppc64__) # include "atomic_ops/sysdeps/gcc/powerpc.h" # endif /* __powerpc__ */ # if defined(__aarch64__) # include "atomic_ops/sysdeps/gcc/aarch64.h" # define AO_CAN_EMUL_CAS # endif /* __aarch64__ */ # if defined(__arm__) # include "atomic_ops/sysdeps/gcc/arm.h" # define AO_CAN_EMUL_CAS # endif /* __arm__ */ # if defined(__cris__) || defined(CRIS) # include "atomic_ops/sysdeps/gcc/cris.h" # define AO_GENERALIZE_TWICE # endif # if defined(__mips__) # include "atomic_ops/sysdeps/gcc/mips.h" # endif /* __mips__ */ # if defined(__sh__) || defined(SH4) # include "atomic_ops/sysdeps/gcc/sh.h" # define AO_CAN_EMUL_CAS # endif /* __sh__ */ # if defined(__avr32__) # include "atomic_ops/sysdeps/gcc/avr32.h" # endif # if defined(__hexagon__) # include "atomic_ops/sysdeps/gcc/hexagon.h" # endif #endif /* __GNUC__ && !AO_USE_PTHREAD_DEFS */ #if (defined(__IBMC__) || defined(__IBMCPP__)) && !defined(__GNUC__) \ && !defined(AO_USE_PTHREAD_DEFS) # if defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) \ || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) \ || defined(_ARCH_PWR) # include "atomic_ops/sysdeps/ibmc/powerpc.h" # define AO_GENERALIZE_TWICE # endif #endif #if defined(__INTEL_COMPILER) && !defined(AO_USE_PTHREAD_DEFS) # if defined(__ia64__) # include "atomic_ops/sysdeps/icc/ia64.h" # define AO_GENERALIZE_TWICE # endif # if defined(__GNUC__) /* Intel Compiler in GCC compatible mode */ # if defined(__i386__) # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __i386__ */ # if defined(__x86_64__) # if (__INTEL_COMPILER > 1110) && !defined(AO_USE_SYNC_CAS_BUILTIN) # define AO_USE_SYNC_CAS_BUILTIN # endif # include "atomic_ops/sysdeps/gcc/x86.h" # endif /* __x86_64__ */ # endif #endif #if defined(_HPUX_SOURCE) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) # if defined(__ia64) # include "atomic_ops/sysdeps/hpc/ia64.h" # define AO_GENERALIZE_TWICE # else # include "atomic_ops/sysdeps/hpc/hppa.h" # define AO_CAN_EMUL_CAS # endif #endif #if defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \ || (defined(__WATCOMC__) && defined(__NT__)) # if defined(_AMD64_) || defined(_M_X64) # include "atomic_ops/sysdeps/msftc/x86_64.h" # elif defined(_M_IX86) || defined(x86) # include "atomic_ops/sysdeps/msftc/x86.h" # elif defined(_M_ARM) || defined(ARM) || defined(_ARM_) # include "atomic_ops/sysdeps/msftc/arm.h" # define AO_GENERALIZE_TWICE # endif #endif #if defined(__sun) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) /* Note: use -DAO_USE_PTHREAD_DEFS if Sun CC does not handle inline asm. */ # if defined(__i386) || defined(__x86_64) || defined(__amd64) # include "atomic_ops/sysdeps/sunc/x86.h" # endif #endif #if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) \ && !defined(AO_USE_PTHREAD_DEFS) # include "atomic_ops/sysdeps/sunc/sparc.h" # define AO_CAN_EMUL_CAS #endif #if defined(AO_REQUIRE_CAS) && !defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_fetch_compare_and_swap_acquire) # if defined(AO_CAN_EMUL_CAS) # include "atomic_ops/sysdeps/emul_cas.h" # else # error Cannot implement AO_compare_and_swap_full on this architecture. # endif #endif /* AO_REQUIRE_CAS && !AO_HAVE_compare_and_swap ... */ /* The most common way to clear a test-and-set location */ /* at the end of a critical section. */ #if AO_AO_TS_T && !defined(AO_CLEAR) # define AO_CLEAR(addr) AO_store_release((AO_TS_t *)(addr), AO_TS_CLEAR) #endif #if AO_CHAR_TS_T && !defined(AO_CLEAR) # define AO_CLEAR(addr) AO_char_store_release((AO_TS_t *)(addr), AO_TS_CLEAR) #endif /* The generalization section. */ #if !defined(AO_GENERALIZE_TWICE) && defined(AO_CAN_EMUL_CAS) \ && !defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) # define AO_GENERALIZE_TWICE #endif /* Theoretically we should repeatedly include atomic_ops/generalize.h. */ /* In fact, we observe that this converges after a small fixed number */ /* of iterations, usually one. */ #include "atomic_ops/generalize.h" #if !defined(AO_GENERALIZE_TWICE) \ && defined(AO_HAVE_compare_double_and_swap_double) \ && (!defined(AO_HAVE_double_load) || !defined(AO_HAVE_double_store)) # define AO_GENERALIZE_TWICE #endif #ifdef AO_T_IS_INT /* Included after the first generalization pass. */ # include "atomic_ops/sysdeps/ao_t_is_int.h" # ifndef AO_GENERALIZE_TWICE /* Always generalize again. */ # define AO_GENERALIZE_TWICE # endif #endif /* AO_T_IS_INT */ #ifdef AO_GENERALIZE_TWICE # include "atomic_ops/generalize.h" #endif /* For compatibility with version 0.4 and earlier */ #define AO_TS_T AO_TS_t #define AO_T AO_t #define AO_TS_VAL AO_TS_VAL_t #endif /* !AO_ATOMIC_OPS_H */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/ao_version.h0000755000175000017500000000257712456307241023727 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif /* The version here should match that in configure.ac and README. */ #define AO_VERSION_MAJOR 7 #define AO_VERSION_MINOR 3 #define AO_VERSION_ALPHA 3 /* 7.3alpha3 */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.h0000755000175000017500000037157312456307241025177 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* char_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_char_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_char_compare_and_swap_full) AO_INLINE int AO_char_compare_and_swap_full(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_full #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_compare_and_swap_acquire) AO_INLINE int AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_char_compare_and_swap_release) AO_INLINE int AO_char_compare_and_swap_release(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_release #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_char_compare_and_swap_write) AO_INLINE int AO_char_compare_and_swap_write(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_write #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_char_compare_and_swap_read) AO_INLINE int AO_char_compare_and_swap_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_read #endif #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && !defined(AO_HAVE_char_compare_and_swap) AO_INLINE int AO_char_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_char_compare_and_swap_release_write) AO_INLINE int AO_char_compare_and_swap_release_write(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_release_write #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_char_compare_and_swap_acquire_read) AO_INLINE int AO_char_compare_and_swap_acquire_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_char_compare_and_swap_dd_acquire_read) AO_INLINE int AO_char_compare_and_swap_dd_acquire_read(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return AO_char_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_char_compare_and_swap_dd_acquire_read #endif /* char_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_fetch_and_add_full) AO_INLINE unsigned/**/char AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_full #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_fetch_and_add_acquire) AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_acquire #endif #if defined(AO_HAVE_char_compare_and_swap_release) \ && !defined(AO_HAVE_char_fetch_and_add_release) AO_INLINE unsigned/**/char AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add_release #endif #if defined(AO_HAVE_char_compare_and_swap) \ && !defined(AO_HAVE_char_fetch_and_add) AO_INLINE unsigned/**/char AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_char_fetch_and_add #endif #if defined(AO_HAVE_char_fetch_and_add_full) # if !defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_release # endif # if !defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add_acquire(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_acquire # endif # if !defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add_write(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_write # endif # if !defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add_read(addr, val) \ AO_char_fetch_and_add_full(addr, val) # define AO_HAVE_char_fetch_and_add_read # endif #endif /* AO_HAVE_char_fetch_and_add_full */ #if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add_acquire) AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { unsigned/**/char result = AO_char_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_char_fetch_and_add_acquire #endif #if defined(AO_HAVE_char_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_char_fetch_and_add(addr, incr)) # define AO_HAVE_char_fetch_and_add_release #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_release(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_acquire(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_write(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if !defined(AO_HAVE_char_fetch_and_add) \ && defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add(addr, val) \ AO_char_fetch_and_add_read(addr, val) # define AO_HAVE_char_fetch_and_add #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_char_fetch_and_add_full) # define AO_char_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_char_fetch_and_add_acquire(addr, val)) # define AO_HAVE_char_fetch_and_add_full #endif #if !defined(AO_HAVE_char_fetch_and_add_release_write) \ && defined(AO_HAVE_char_fetch_and_add_write) # define AO_char_fetch_and_add_release_write(addr, val) \ AO_char_fetch_and_add_write(addr, val) # define AO_HAVE_char_fetch_and_add_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add_release_write) \ && defined(AO_HAVE_char_fetch_and_add_release) # define AO_char_fetch_and_add_release_write(addr, val) \ AO_char_fetch_and_add_release(addr, val) # define AO_HAVE_char_fetch_and_add_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add_read) # define AO_char_fetch_and_add_acquire_read(addr, val) \ AO_char_fetch_and_add_read(addr, val) # define AO_HAVE_char_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add_acquire) # define AO_char_fetch_and_add_acquire_read(addr, val) \ AO_char_fetch_and_add_acquire(addr, val) # define AO_HAVE_char_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_add_acquire_read) # define AO_char_fetch_and_add_dd_acquire_read(addr, val) \ AO_char_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_char_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_add) # define AO_char_fetch_and_add_dd_acquire_read(addr, val) \ AO_char_fetch_and_add(addr, val) # define AO_HAVE_char_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_fetch_and_add1 */ #if defined(AO_HAVE_char_fetch_and_add_full) \ && !defined(AO_HAVE_char_fetch_and_add1_full) # define AO_char_fetch_and_add1_full(addr) \ AO_char_fetch_and_add_full(addr, 1) # define AO_HAVE_char_fetch_and_add1_full #endif #if defined(AO_HAVE_char_fetch_and_add_release) \ && !defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release(addr) \ AO_char_fetch_and_add_release(addr, 1) # define AO_HAVE_char_fetch_and_add1_release #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && !defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire(addr) \ AO_char_fetch_and_add_acquire(addr, 1) # define AO_HAVE_char_fetch_and_add1_acquire #endif #if defined(AO_HAVE_char_fetch_and_add_write) \ && !defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_write(addr) \ AO_char_fetch_and_add_write(addr, 1) # define AO_HAVE_char_fetch_and_add1_write #endif #if defined(AO_HAVE_char_fetch_and_add_read) \ && !defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_read(addr) \ AO_char_fetch_and_add_read(addr, 1) # define AO_HAVE_char_fetch_and_add1_read #endif #if defined(AO_HAVE_char_fetch_and_add_release_write) \ && !defined(AO_HAVE_char_fetch_and_add1_release_write) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add_release_write(addr, 1) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_char_fetch_and_add1_acquire_read) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_char_fetch_and_add) \ && !defined(AO_HAVE_char_fetch_and_add1) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add(addr, 1) # define AO_HAVE_char_fetch_and_add1 #endif #if defined(AO_HAVE_char_fetch_and_add1_full) # if !defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_release # endif # if !defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_write(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_write # endif # if !defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_read(addr) \ AO_char_fetch_and_add1_full(addr) # define AO_HAVE_char_fetch_and_add1_read # endif #endif /* AO_HAVE_char_fetch_and_add1_full */ #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_release(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_acquire(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_write(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if !defined(AO_HAVE_char_fetch_and_add1) \ && defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1(addr) AO_char_fetch_and_add1_read(addr) # define AO_HAVE_char_fetch_and_add1 #endif #if defined(AO_HAVE_char_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_add1_full) # define AO_char_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_char_fetch_and_add1_acquire(addr)) # define AO_HAVE_char_fetch_and_add1_full #endif #if !defined(AO_HAVE_char_fetch_and_add1_release_write) \ && defined(AO_HAVE_char_fetch_and_add1_write) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add1_write(addr) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add1_release_write) \ && defined(AO_HAVE_char_fetch_and_add1_release) # define AO_char_fetch_and_add1_release_write(addr) \ AO_char_fetch_and_add1_release(addr) # define AO_HAVE_char_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add1_read) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add1_read(addr) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_add1_acquire) # define AO_char_fetch_and_add1_acquire_read(addr) \ AO_char_fetch_and_add1_acquire(addr) # define AO_HAVE_char_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_add1_acquire_read) # define AO_char_fetch_and_add1_dd_acquire_read(addr) \ AO_char_fetch_and_add1_acquire_read(addr) # define AO_HAVE_char_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_add1) # define AO_char_fetch_and_add1_dd_acquire_read(addr) \ AO_char_fetch_and_add1(addr) # define AO_HAVE_char_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_fetch_and_sub1 */ #if defined(AO_HAVE_char_fetch_and_add_full) \ && !defined(AO_HAVE_char_fetch_and_sub1_full) # define AO_char_fetch_and_sub1_full(addr) \ AO_char_fetch_and_add_full(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_full #endif #if defined(AO_HAVE_char_fetch_and_add_release) \ && !defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release(addr) \ AO_char_fetch_and_add_release(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_release #endif #if defined(AO_HAVE_char_fetch_and_add_acquire) \ && !defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire(addr) \ AO_char_fetch_and_add_acquire(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_char_fetch_and_add_write) \ && !defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_write(addr) \ AO_char_fetch_and_add_write(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_write #endif #if defined(AO_HAVE_char_fetch_and_add_read) \ && !defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_read(addr) \ AO_char_fetch_and_add_read(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_read #endif #if defined(AO_HAVE_char_fetch_and_add_release_write) \ && !defined(AO_HAVE_char_fetch_and_sub1_release_write) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_add_release_write(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_char_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_add_acquire_read(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_char_fetch_and_add) \ && !defined(AO_HAVE_char_fetch_and_sub1) # define AO_char_fetch_and_sub1(addr) \ AO_char_fetch_and_add(addr, (unsigned/**/char)(-1)) # define AO_HAVE_char_fetch_and_sub1 #endif #if defined(AO_HAVE_char_fetch_and_sub1_full) # if !defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_release # endif # if !defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_write(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_write # endif # if !defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_read(addr) \ AO_char_fetch_and_sub1_full(addr) # define AO_HAVE_char_fetch_and_sub1_read # endif #endif /* AO_HAVE_char_fetch_and_sub1_full */ #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_release(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_acquire(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_write(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if !defined(AO_HAVE_char_fetch_and_sub1) \ && defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1(addr) AO_char_fetch_and_sub1_read(addr) # define AO_HAVE_char_fetch_and_sub1 #endif #if defined(AO_HAVE_char_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_and_sub1_full) # define AO_char_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_char_fetch_and_sub1_acquire(addr)) # define AO_HAVE_char_fetch_and_sub1_full #endif #if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \ && defined(AO_HAVE_char_fetch_and_sub1_write) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_sub1_write(addr) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_sub1_release_write) \ && defined(AO_HAVE_char_fetch_and_sub1_release) # define AO_char_fetch_and_sub1_release_write(addr) \ AO_char_fetch_and_sub1_release(addr) # define AO_HAVE_char_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_sub1_read) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_sub1_read(addr) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_char_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_char_fetch_and_sub1_acquire) # define AO_char_fetch_and_sub1_acquire_read(addr) \ AO_char_fetch_and_sub1_acquire(addr) # define AO_HAVE_char_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_and_sub1_acquire_read) # define AO_char_fetch_and_sub1_dd_acquire_read(addr) \ AO_char_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_char_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_and_sub1) # define AO_char_fetch_and_sub1_dd_acquire_read(addr) \ AO_char_fetch_and_sub1(addr) # define AO_HAVE_char_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_and */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_and_full) AO_INLINE void AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_char_and_full #endif #if defined(AO_HAVE_char_and_full) # if !defined(AO_HAVE_char_and_release) # define AO_char_and_release(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_release # endif # if !defined(AO_HAVE_char_and_acquire) # define AO_char_and_acquire(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_acquire # endif # if !defined(AO_HAVE_char_and_write) # define AO_char_and_write(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_write # endif # if !defined(AO_HAVE_char_and_read) # define AO_char_and_read(addr, val) AO_char_and_full(addr, val) # define AO_HAVE_char_and_read # endif #endif /* AO_HAVE_char_and_full */ #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_release) # define AO_char_and(addr, val) AO_char_and_release(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_acquire) # define AO_char_and(addr, val) AO_char_and_acquire(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_write) # define AO_char_and(addr, val) AO_char_and_write(addr, val) # define AO_HAVE_char_and #endif #if !defined(AO_HAVE_char_and) && defined(AO_HAVE_char_and_read) # define AO_char_and(addr, val) AO_char_and_read(addr, val) # define AO_HAVE_char_and #endif #if defined(AO_HAVE_char_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_and_full) # define AO_char_and_full(addr, val) \ (AO_nop_full(), AO_char_and_acquire(addr, val)) # define AO_HAVE_char_and_full #endif #if !defined(AO_HAVE_char_and_release_write) \ && defined(AO_HAVE_char_and_write) # define AO_char_and_release_write(addr, val) AO_char_and_write(addr, val) # define AO_HAVE_char_and_release_write #endif #if !defined(AO_HAVE_char_and_release_write) \ && defined(AO_HAVE_char_and_release) # define AO_char_and_release_write(addr, val) AO_char_and_release(addr, val) # define AO_HAVE_char_and_release_write #endif #if !defined(AO_HAVE_char_and_acquire_read) \ && defined(AO_HAVE_char_and_read) # define AO_char_and_acquire_read(addr, val) AO_char_and_read(addr, val) # define AO_HAVE_char_and_acquire_read #endif #if !defined(AO_HAVE_char_and_acquire_read) \ && defined(AO_HAVE_char_and_acquire) # define AO_char_and_acquire_read(addr, val) AO_char_and_acquire(addr, val) # define AO_HAVE_char_and_acquire_read #endif /* char_or */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_or_full) AO_INLINE void AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_char_or_full #endif #if defined(AO_HAVE_char_or_full) # if !defined(AO_HAVE_char_or_release) # define AO_char_or_release(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_release # endif # if !defined(AO_HAVE_char_or_acquire) # define AO_char_or_acquire(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_acquire # endif # if !defined(AO_HAVE_char_or_write) # define AO_char_or_write(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_write # endif # if !defined(AO_HAVE_char_or_read) # define AO_char_or_read(addr, val) AO_char_or_full(addr, val) # define AO_HAVE_char_or_read # endif #endif /* AO_HAVE_char_or_full */ #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_release) # define AO_char_or(addr, val) AO_char_or_release(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_acquire) # define AO_char_or(addr, val) AO_char_or_acquire(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_write) # define AO_char_or(addr, val) AO_char_or_write(addr, val) # define AO_HAVE_char_or #endif #if !defined(AO_HAVE_char_or) && defined(AO_HAVE_char_or_read) # define AO_char_or(addr, val) AO_char_or_read(addr, val) # define AO_HAVE_char_or #endif #if defined(AO_HAVE_char_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_or_full) # define AO_char_or_full(addr, val) \ (AO_nop_full(), AO_char_or_acquire(addr, val)) # define AO_HAVE_char_or_full #endif #if !defined(AO_HAVE_char_or_release_write) \ && defined(AO_HAVE_char_or_write) # define AO_char_or_release_write(addr, val) AO_char_or_write(addr, val) # define AO_HAVE_char_or_release_write #endif #if !defined(AO_HAVE_char_or_release_write) \ && defined(AO_HAVE_char_or_release) # define AO_char_or_release_write(addr, val) AO_char_or_release(addr, val) # define AO_HAVE_char_or_release_write #endif #if !defined(AO_HAVE_char_or_acquire_read) && defined(AO_HAVE_char_or_read) # define AO_char_or_acquire_read(addr, val) AO_char_or_read(addr, val) # define AO_HAVE_char_or_acquire_read #endif #if !defined(AO_HAVE_char_or_acquire_read) \ && defined(AO_HAVE_char_or_acquire) # define AO_char_or_acquire_read(addr, val) AO_char_or_acquire(addr, val) # define AO_HAVE_char_or_acquire_read #endif /* char_xor */ #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_xor_full) AO_INLINE void AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value) { unsigned/**/char old; do { old = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_char_xor_full #endif #if defined(AO_HAVE_char_xor_full) # if !defined(AO_HAVE_char_xor_release) # define AO_char_xor_release(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_release # endif # if !defined(AO_HAVE_char_xor_acquire) # define AO_char_xor_acquire(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_acquire # endif # if !defined(AO_HAVE_char_xor_write) # define AO_char_xor_write(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_write # endif # if !defined(AO_HAVE_char_xor_read) # define AO_char_xor_read(addr, val) AO_char_xor_full(addr, val) # define AO_HAVE_char_xor_read # endif #endif /* AO_HAVE_char_xor_full */ #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_release) # define AO_char_xor(addr, val) AO_char_xor_release(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_acquire) # define AO_char_xor(addr, val) AO_char_xor_acquire(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_write) # define AO_char_xor(addr, val) AO_char_xor_write(addr, val) # define AO_HAVE_char_xor #endif #if !defined(AO_HAVE_char_xor) && defined(AO_HAVE_char_xor_read) # define AO_char_xor(addr, val) AO_char_xor_read(addr, val) # define AO_HAVE_char_xor #endif #if defined(AO_HAVE_char_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_xor_full) # define AO_char_xor_full(addr, val) \ (AO_nop_full(), AO_char_xor_acquire(addr, val)) # define AO_HAVE_char_xor_full #endif #if !defined(AO_HAVE_char_xor_release_write) \ && defined(AO_HAVE_char_xor_write) # define AO_char_xor_release_write(addr, val) AO_char_xor_write(addr, val) # define AO_HAVE_char_xor_release_write #endif #if !defined(AO_HAVE_char_xor_release_write) \ && defined(AO_HAVE_char_xor_release) # define AO_char_xor_release_write(addr, val) AO_char_xor_release(addr, val) # define AO_HAVE_char_xor_release_write #endif #if !defined(AO_HAVE_char_xor_acquire_read) \ && defined(AO_HAVE_char_xor_read) # define AO_char_xor_acquire_read(addr, val) AO_char_xor_read(addr, val) # define AO_HAVE_char_xor_acquire_read #endif #if !defined(AO_HAVE_char_xor_acquire_read) \ && defined(AO_HAVE_char_xor_acquire) # define AO_char_xor_acquire_read(addr, val) AO_char_xor_acquire(addr, val) # define AO_HAVE_char_xor_acquire_read #endif /* char_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* short_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_short_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_short_compare_and_swap_full) AO_INLINE int AO_short_compare_and_swap_full(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_full #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_compare_and_swap_acquire) AO_INLINE int AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_short_compare_and_swap_release) AO_INLINE int AO_short_compare_and_swap_release(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_release #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_short_compare_and_swap_write) AO_INLINE int AO_short_compare_and_swap_write(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_write #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_short_compare_and_swap_read) AO_INLINE int AO_short_compare_and_swap_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_read #endif #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && !defined(AO_HAVE_short_compare_and_swap) AO_INLINE int AO_short_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_short_compare_and_swap_release_write) AO_INLINE int AO_short_compare_and_swap_release_write(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_release_write #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_short_compare_and_swap_acquire_read) AO_INLINE int AO_short_compare_and_swap_acquire_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_short_compare_and_swap_dd_acquire_read) AO_INLINE int AO_short_compare_and_swap_dd_acquire_read(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return AO_short_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_short_compare_and_swap_dd_acquire_read #endif /* short_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_fetch_and_add_full) AO_INLINE unsigned/**/short AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_full #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_fetch_and_add_acquire) AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_acquire #endif #if defined(AO_HAVE_short_compare_and_swap_release) \ && !defined(AO_HAVE_short_fetch_and_add_release) AO_INLINE unsigned/**/short AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add_release #endif #if defined(AO_HAVE_short_compare_and_swap) \ && !defined(AO_HAVE_short_fetch_and_add) AO_INLINE unsigned/**/short AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_short_fetch_and_add #endif #if defined(AO_HAVE_short_fetch_and_add_full) # if !defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_release # endif # if !defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add_acquire(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_acquire # endif # if !defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add_write(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_write # endif # if !defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add_read(addr, val) \ AO_short_fetch_and_add_full(addr, val) # define AO_HAVE_short_fetch_and_add_read # endif #endif /* AO_HAVE_short_fetch_and_add_full */ #if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add_acquire) AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { unsigned/**/short result = AO_short_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_short_fetch_and_add_acquire #endif #if defined(AO_HAVE_short_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_short_fetch_and_add(addr, incr)) # define AO_HAVE_short_fetch_and_add_release #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_release(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_acquire(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_write(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if !defined(AO_HAVE_short_fetch_and_add) \ && defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add(addr, val) \ AO_short_fetch_and_add_read(addr, val) # define AO_HAVE_short_fetch_and_add #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_short_fetch_and_add_full) # define AO_short_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_short_fetch_and_add_acquire(addr, val)) # define AO_HAVE_short_fetch_and_add_full #endif #if !defined(AO_HAVE_short_fetch_and_add_release_write) \ && defined(AO_HAVE_short_fetch_and_add_write) # define AO_short_fetch_and_add_release_write(addr, val) \ AO_short_fetch_and_add_write(addr, val) # define AO_HAVE_short_fetch_and_add_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add_release_write) \ && defined(AO_HAVE_short_fetch_and_add_release) # define AO_short_fetch_and_add_release_write(addr, val) \ AO_short_fetch_and_add_release(addr, val) # define AO_HAVE_short_fetch_and_add_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add_read) # define AO_short_fetch_and_add_acquire_read(addr, val) \ AO_short_fetch_and_add_read(addr, val) # define AO_HAVE_short_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add_acquire) # define AO_short_fetch_and_add_acquire_read(addr, val) \ AO_short_fetch_and_add_acquire(addr, val) # define AO_HAVE_short_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_add_acquire_read) # define AO_short_fetch_and_add_dd_acquire_read(addr, val) \ AO_short_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_short_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_add) # define AO_short_fetch_and_add_dd_acquire_read(addr, val) \ AO_short_fetch_and_add(addr, val) # define AO_HAVE_short_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_fetch_and_add1 */ #if defined(AO_HAVE_short_fetch_and_add_full) \ && !defined(AO_HAVE_short_fetch_and_add1_full) # define AO_short_fetch_and_add1_full(addr) \ AO_short_fetch_and_add_full(addr, 1) # define AO_HAVE_short_fetch_and_add1_full #endif #if defined(AO_HAVE_short_fetch_and_add_release) \ && !defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release(addr) \ AO_short_fetch_and_add_release(addr, 1) # define AO_HAVE_short_fetch_and_add1_release #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && !defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire(addr) \ AO_short_fetch_and_add_acquire(addr, 1) # define AO_HAVE_short_fetch_and_add1_acquire #endif #if defined(AO_HAVE_short_fetch_and_add_write) \ && !defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_write(addr) \ AO_short_fetch_and_add_write(addr, 1) # define AO_HAVE_short_fetch_and_add1_write #endif #if defined(AO_HAVE_short_fetch_and_add_read) \ && !defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_read(addr) \ AO_short_fetch_and_add_read(addr, 1) # define AO_HAVE_short_fetch_and_add1_read #endif #if defined(AO_HAVE_short_fetch_and_add_release_write) \ && !defined(AO_HAVE_short_fetch_and_add1_release_write) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add_release_write(addr, 1) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_short_fetch_and_add1_acquire_read) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_short_fetch_and_add) \ && !defined(AO_HAVE_short_fetch_and_add1) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add(addr, 1) # define AO_HAVE_short_fetch_and_add1 #endif #if defined(AO_HAVE_short_fetch_and_add1_full) # if !defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_release # endif # if !defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_write(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_write # endif # if !defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_read(addr) \ AO_short_fetch_and_add1_full(addr) # define AO_HAVE_short_fetch_and_add1_read # endif #endif /* AO_HAVE_short_fetch_and_add1_full */ #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_release(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_acquire(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_write(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if !defined(AO_HAVE_short_fetch_and_add1) \ && defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1(addr) AO_short_fetch_and_add1_read(addr) # define AO_HAVE_short_fetch_and_add1 #endif #if defined(AO_HAVE_short_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_add1_full) # define AO_short_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_short_fetch_and_add1_acquire(addr)) # define AO_HAVE_short_fetch_and_add1_full #endif #if !defined(AO_HAVE_short_fetch_and_add1_release_write) \ && defined(AO_HAVE_short_fetch_and_add1_write) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add1_write(addr) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add1_release_write) \ && defined(AO_HAVE_short_fetch_and_add1_release) # define AO_short_fetch_and_add1_release_write(addr) \ AO_short_fetch_and_add1_release(addr) # define AO_HAVE_short_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add1_read) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add1_read(addr) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_add1_acquire) # define AO_short_fetch_and_add1_acquire_read(addr) \ AO_short_fetch_and_add1_acquire(addr) # define AO_HAVE_short_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_add1_acquire_read) # define AO_short_fetch_and_add1_dd_acquire_read(addr) \ AO_short_fetch_and_add1_acquire_read(addr) # define AO_HAVE_short_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_add1) # define AO_short_fetch_and_add1_dd_acquire_read(addr) \ AO_short_fetch_and_add1(addr) # define AO_HAVE_short_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_fetch_and_sub1 */ #if defined(AO_HAVE_short_fetch_and_add_full) \ && !defined(AO_HAVE_short_fetch_and_sub1_full) # define AO_short_fetch_and_sub1_full(addr) \ AO_short_fetch_and_add_full(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_full #endif #if defined(AO_HAVE_short_fetch_and_add_release) \ && !defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release(addr) \ AO_short_fetch_and_add_release(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_release #endif #if defined(AO_HAVE_short_fetch_and_add_acquire) \ && !defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire(addr) \ AO_short_fetch_and_add_acquire(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_short_fetch_and_add_write) \ && !defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_write(addr) \ AO_short_fetch_and_add_write(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_write #endif #if defined(AO_HAVE_short_fetch_and_add_read) \ && !defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_read(addr) \ AO_short_fetch_and_add_read(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_read #endif #if defined(AO_HAVE_short_fetch_and_add_release_write) \ && !defined(AO_HAVE_short_fetch_and_sub1_release_write) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_add_release_write(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_short_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_add_acquire_read(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_short_fetch_and_add) \ && !defined(AO_HAVE_short_fetch_and_sub1) # define AO_short_fetch_and_sub1(addr) \ AO_short_fetch_and_add(addr, (unsigned/**/short)(-1)) # define AO_HAVE_short_fetch_and_sub1 #endif #if defined(AO_HAVE_short_fetch_and_sub1_full) # if !defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_release # endif # if !defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_write(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_write # endif # if !defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_read(addr) \ AO_short_fetch_and_sub1_full(addr) # define AO_HAVE_short_fetch_and_sub1_read # endif #endif /* AO_HAVE_short_fetch_and_sub1_full */ #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_release(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_acquire(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_write(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if !defined(AO_HAVE_short_fetch_and_sub1) \ && defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1(addr) AO_short_fetch_and_sub1_read(addr) # define AO_HAVE_short_fetch_and_sub1 #endif #if defined(AO_HAVE_short_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_and_sub1_full) # define AO_short_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_short_fetch_and_sub1_acquire(addr)) # define AO_HAVE_short_fetch_and_sub1_full #endif #if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \ && defined(AO_HAVE_short_fetch_and_sub1_write) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_sub1_write(addr) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_sub1_release_write) \ && defined(AO_HAVE_short_fetch_and_sub1_release) # define AO_short_fetch_and_sub1_release_write(addr) \ AO_short_fetch_and_sub1_release(addr) # define AO_HAVE_short_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_sub1_read) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_sub1_read(addr) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_short_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_short_fetch_and_sub1_acquire) # define AO_short_fetch_and_sub1_acquire_read(addr) \ AO_short_fetch_and_sub1_acquire(addr) # define AO_HAVE_short_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_and_sub1_acquire_read) # define AO_short_fetch_and_sub1_dd_acquire_read(addr) \ AO_short_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_short_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_and_sub1) # define AO_short_fetch_and_sub1_dd_acquire_read(addr) \ AO_short_fetch_and_sub1(addr) # define AO_HAVE_short_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_and */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_and_full) AO_INLINE void AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_short_and_full #endif #if defined(AO_HAVE_short_and_full) # if !defined(AO_HAVE_short_and_release) # define AO_short_and_release(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_release # endif # if !defined(AO_HAVE_short_and_acquire) # define AO_short_and_acquire(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_acquire # endif # if !defined(AO_HAVE_short_and_write) # define AO_short_and_write(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_write # endif # if !defined(AO_HAVE_short_and_read) # define AO_short_and_read(addr, val) AO_short_and_full(addr, val) # define AO_HAVE_short_and_read # endif #endif /* AO_HAVE_short_and_full */ #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_release) # define AO_short_and(addr, val) AO_short_and_release(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_acquire) # define AO_short_and(addr, val) AO_short_and_acquire(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_write) # define AO_short_and(addr, val) AO_short_and_write(addr, val) # define AO_HAVE_short_and #endif #if !defined(AO_HAVE_short_and) && defined(AO_HAVE_short_and_read) # define AO_short_and(addr, val) AO_short_and_read(addr, val) # define AO_HAVE_short_and #endif #if defined(AO_HAVE_short_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_and_full) # define AO_short_and_full(addr, val) \ (AO_nop_full(), AO_short_and_acquire(addr, val)) # define AO_HAVE_short_and_full #endif #if !defined(AO_HAVE_short_and_release_write) \ && defined(AO_HAVE_short_and_write) # define AO_short_and_release_write(addr, val) AO_short_and_write(addr, val) # define AO_HAVE_short_and_release_write #endif #if !defined(AO_HAVE_short_and_release_write) \ && defined(AO_HAVE_short_and_release) # define AO_short_and_release_write(addr, val) AO_short_and_release(addr, val) # define AO_HAVE_short_and_release_write #endif #if !defined(AO_HAVE_short_and_acquire_read) \ && defined(AO_HAVE_short_and_read) # define AO_short_and_acquire_read(addr, val) AO_short_and_read(addr, val) # define AO_HAVE_short_and_acquire_read #endif #if !defined(AO_HAVE_short_and_acquire_read) \ && defined(AO_HAVE_short_and_acquire) # define AO_short_and_acquire_read(addr, val) AO_short_and_acquire(addr, val) # define AO_HAVE_short_and_acquire_read #endif /* short_or */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_or_full) AO_INLINE void AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_short_or_full #endif #if defined(AO_HAVE_short_or_full) # if !defined(AO_HAVE_short_or_release) # define AO_short_or_release(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_release # endif # if !defined(AO_HAVE_short_or_acquire) # define AO_short_or_acquire(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_acquire # endif # if !defined(AO_HAVE_short_or_write) # define AO_short_or_write(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_write # endif # if !defined(AO_HAVE_short_or_read) # define AO_short_or_read(addr, val) AO_short_or_full(addr, val) # define AO_HAVE_short_or_read # endif #endif /* AO_HAVE_short_or_full */ #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_release) # define AO_short_or(addr, val) AO_short_or_release(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_acquire) # define AO_short_or(addr, val) AO_short_or_acquire(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_write) # define AO_short_or(addr, val) AO_short_or_write(addr, val) # define AO_HAVE_short_or #endif #if !defined(AO_HAVE_short_or) && defined(AO_HAVE_short_or_read) # define AO_short_or(addr, val) AO_short_or_read(addr, val) # define AO_HAVE_short_or #endif #if defined(AO_HAVE_short_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_or_full) # define AO_short_or_full(addr, val) \ (AO_nop_full(), AO_short_or_acquire(addr, val)) # define AO_HAVE_short_or_full #endif #if !defined(AO_HAVE_short_or_release_write) \ && defined(AO_HAVE_short_or_write) # define AO_short_or_release_write(addr, val) AO_short_or_write(addr, val) # define AO_HAVE_short_or_release_write #endif #if !defined(AO_HAVE_short_or_release_write) \ && defined(AO_HAVE_short_or_release) # define AO_short_or_release_write(addr, val) AO_short_or_release(addr, val) # define AO_HAVE_short_or_release_write #endif #if !defined(AO_HAVE_short_or_acquire_read) && defined(AO_HAVE_short_or_read) # define AO_short_or_acquire_read(addr, val) AO_short_or_read(addr, val) # define AO_HAVE_short_or_acquire_read #endif #if !defined(AO_HAVE_short_or_acquire_read) \ && defined(AO_HAVE_short_or_acquire) # define AO_short_or_acquire_read(addr, val) AO_short_or_acquire(addr, val) # define AO_HAVE_short_or_acquire_read #endif /* short_xor */ #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_xor_full) AO_INLINE void AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value) { unsigned/**/short old; do { old = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_short_xor_full #endif #if defined(AO_HAVE_short_xor_full) # if !defined(AO_HAVE_short_xor_release) # define AO_short_xor_release(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_release # endif # if !defined(AO_HAVE_short_xor_acquire) # define AO_short_xor_acquire(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_acquire # endif # if !defined(AO_HAVE_short_xor_write) # define AO_short_xor_write(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_write # endif # if !defined(AO_HAVE_short_xor_read) # define AO_short_xor_read(addr, val) AO_short_xor_full(addr, val) # define AO_HAVE_short_xor_read # endif #endif /* AO_HAVE_short_xor_full */ #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_release) # define AO_short_xor(addr, val) AO_short_xor_release(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_acquire) # define AO_short_xor(addr, val) AO_short_xor_acquire(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_write) # define AO_short_xor(addr, val) AO_short_xor_write(addr, val) # define AO_HAVE_short_xor #endif #if !defined(AO_HAVE_short_xor) && defined(AO_HAVE_short_xor_read) # define AO_short_xor(addr, val) AO_short_xor_read(addr, val) # define AO_HAVE_short_xor #endif #if defined(AO_HAVE_short_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_xor_full) # define AO_short_xor_full(addr, val) \ (AO_nop_full(), AO_short_xor_acquire(addr, val)) # define AO_HAVE_short_xor_full #endif #if !defined(AO_HAVE_short_xor_release_write) \ && defined(AO_HAVE_short_xor_write) # define AO_short_xor_release_write(addr, val) AO_short_xor_write(addr, val) # define AO_HAVE_short_xor_release_write #endif #if !defined(AO_HAVE_short_xor_release_write) \ && defined(AO_HAVE_short_xor_release) # define AO_short_xor_release_write(addr, val) AO_short_xor_release(addr, val) # define AO_HAVE_short_xor_release_write #endif #if !defined(AO_HAVE_short_xor_acquire_read) \ && defined(AO_HAVE_short_xor_read) # define AO_short_xor_acquire_read(addr, val) AO_short_xor_read(addr, val) # define AO_HAVE_short_xor_acquire_read #endif #if !defined(AO_HAVE_short_xor_acquire_read) \ && defined(AO_HAVE_short_xor_acquire) # define AO_short_xor_acquire_read(addr, val) AO_short_xor_acquire(addr, val) # define AO_HAVE_short_xor_acquire_read #endif /* short_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* int_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_int_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) AO_INLINE int AO_int_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_full #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) AO_INLINE int AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_int_compare_and_swap_release) AO_INLINE int AO_int_compare_and_swap_release(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_release #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_int_compare_and_swap_write) AO_INLINE int AO_int_compare_and_swap_write(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_write #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_int_compare_and_swap_read) AO_INLINE int AO_int_compare_and_swap_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_read #endif #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && !defined(AO_HAVE_int_compare_and_swap) AO_INLINE int AO_int_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_int_compare_and_swap_release_write) AO_INLINE int AO_int_compare_and_swap_release_write(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_release_write #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_int_compare_and_swap_acquire_read) AO_INLINE int AO_int_compare_and_swap_acquire_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_int_compare_and_swap_dd_acquire_read) AO_INLINE int AO_int_compare_and_swap_dd_acquire_read(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return AO_int_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_int_compare_and_swap_dd_acquire_read #endif /* int_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_fetch_and_add_full) AO_INLINE unsigned AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_full #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_int_compare_and_swap_release) \ && !defined(AO_HAVE_int_fetch_and_add_release) AO_INLINE unsigned AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add_release #endif #if defined(AO_HAVE_int_compare_and_swap) \ && !defined(AO_HAVE_int_fetch_and_add) AO_INLINE unsigned AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_int_fetch_and_add_full) # if !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_release # endif # if !defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_acquire # endif # if !defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_write(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_write # endif # if !defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_read(addr, val) \ AO_int_fetch_and_add_full(addr, val) # define AO_HAVE_int_fetch_and_add_read # endif #endif /* AO_HAVE_int_fetch_and_add_full */ #if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { unsigned result = AO_int_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_int_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_int_fetch_and_add(addr, incr)) # define AO_HAVE_int_fetch_and_add_release #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_release(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_acquire(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_write(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if !defined(AO_HAVE_int_fetch_and_add) \ && defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add(addr, val) \ AO_int_fetch_and_add_read(addr, val) # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_int_fetch_and_add_full) # define AO_int_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_int_fetch_and_add_acquire(addr, val)) # define AO_HAVE_int_fetch_and_add_full #endif #if !defined(AO_HAVE_int_fetch_and_add_release_write) \ && defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_release_write(addr, val) \ AO_int_fetch_and_add_write(addr, val) # define AO_HAVE_int_fetch_and_add_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add_release_write) \ && defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release_write(addr, val) \ AO_int_fetch_and_add_release(addr, val) # define AO_HAVE_int_fetch_and_add_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_acquire_read(addr, val) \ AO_int_fetch_and_add_read(addr, val) # define AO_HAVE_int_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire_read(addr, val) \ AO_int_fetch_and_add_acquire(addr, val) # define AO_HAVE_int_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_add_acquire_read) # define AO_int_fetch_and_add_dd_acquire_read(addr, val) \ AO_int_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_int_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_add) # define AO_int_fetch_and_add_dd_acquire_read(addr, val) \ AO_int_fetch_and_add(addr, val) # define AO_HAVE_int_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_fetch_and_add1 */ #if defined(AO_HAVE_int_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ AO_int_fetch_and_add_full(addr, 1) # define AO_HAVE_int_fetch_and_add1_full #endif #if defined(AO_HAVE_int_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ AO_int_fetch_and_add_release(addr, 1) # define AO_HAVE_int_fetch_and_add1_release #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ AO_int_fetch_and_add_acquire(addr, 1) # define AO_HAVE_int_fetch_and_add1_acquire #endif #if defined(AO_HAVE_int_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ AO_int_fetch_and_add_write(addr, 1) # define AO_HAVE_int_fetch_and_add1_write #endif #if defined(AO_HAVE_int_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ AO_int_fetch_and_add_read(addr, 1) # define AO_HAVE_int_fetch_and_add1_read #endif #if defined(AO_HAVE_int_fetch_and_add_release_write) \ && !defined(AO_HAVE_int_fetch_and_add1_release_write) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add_release_write(addr, 1) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire_read) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_int_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add(addr, 1) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_int_fetch_and_add1_full) # if !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_release # endif # if !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_write # endif # if !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ AO_int_fetch_and_add1_full(addr) # define AO_HAVE_int_fetch_and_add1_read # endif #endif /* AO_HAVE_int_fetch_and_add1_full */ #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_release(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_acquire(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_write(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if !defined(AO_HAVE_int_fetch_and_add1) \ && defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1(addr) AO_int_fetch_and_add1_read(addr) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_int_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_int_fetch_and_add1_acquire(addr)) # define AO_HAVE_int_fetch_and_add1_full #endif #if !defined(AO_HAVE_int_fetch_and_add1_release_write) \ && defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add1_write(addr) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add1_release_write) \ && defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release_write(addr) \ AO_int_fetch_and_add1_release(addr) # define AO_HAVE_int_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add1_read(addr) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire_read(addr) \ AO_int_fetch_and_add1_acquire(addr) # define AO_HAVE_int_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_add1_acquire_read) # define AO_int_fetch_and_add1_dd_acquire_read(addr) \ AO_int_fetch_and_add1_acquire_read(addr) # define AO_HAVE_int_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1_dd_acquire_read(addr) \ AO_int_fetch_and_add1(addr) # define AO_HAVE_int_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_fetch_and_sub1 */ #if defined(AO_HAVE_int_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ AO_int_fetch_and_add_full(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if defined(AO_HAVE_int_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ AO_int_fetch_and_add_release(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_release #endif #if defined(AO_HAVE_int_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ AO_int_fetch_and_add_acquire(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_int_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ AO_int_fetch_and_add_write(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_write #endif #if defined(AO_HAVE_int_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ AO_int_fetch_and_add_read(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_read #endif #if defined(AO_HAVE_int_fetch_and_add_release_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_release_write) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_add_release_write(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_int_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_add_acquire_read(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_int_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1(addr) \ AO_int_fetch_and_add(addr, (unsigned)(-1)) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_int_fetch_and_sub1_full) # if !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_release # endif # if !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_write # endif # if !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ AO_int_fetch_and_sub1_full(addr) # define AO_HAVE_int_fetch_and_sub1_read # endif #endif /* AO_HAVE_int_fetch_and_sub1_full */ #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_release(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_acquire(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_write(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if !defined(AO_HAVE_int_fetch_and_sub1) \ && defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1(addr) AO_int_fetch_and_sub1_read(addr) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_int_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_int_fetch_and_sub1_acquire(addr)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \ && defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_sub1_write(addr) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_sub1_release_write) \ && defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release_write(addr) \ AO_int_fetch_and_sub1_release(addr) # define AO_HAVE_int_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_sub1_read(addr) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_int_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire_read(addr) \ AO_int_fetch_and_sub1_acquire(addr) # define AO_HAVE_int_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_and_sub1_acquire_read) # define AO_int_fetch_and_sub1_dd_acquire_read(addr) \ AO_int_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_int_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1_dd_acquire_read(addr) \ AO_int_fetch_and_sub1(addr) # define AO_HAVE_int_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_and */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_and_full) AO_INLINE void AO_int_and_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_int_and_full #endif #if defined(AO_HAVE_int_and_full) # if !defined(AO_HAVE_int_and_release) # define AO_int_and_release(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_release # endif # if !defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_acquire # endif # if !defined(AO_HAVE_int_and_write) # define AO_int_and_write(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_write # endif # if !defined(AO_HAVE_int_and_read) # define AO_int_and_read(addr, val) AO_int_and_full(addr, val) # define AO_HAVE_int_and_read # endif #endif /* AO_HAVE_int_and_full */ #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_release) # define AO_int_and(addr, val) AO_int_and_release(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_acquire) # define AO_int_and(addr, val) AO_int_and_acquire(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_write) # define AO_int_and(addr, val) AO_int_and_write(addr, val) # define AO_HAVE_int_and #endif #if !defined(AO_HAVE_int_and) && defined(AO_HAVE_int_and_read) # define AO_int_and(addr, val) AO_int_and_read(addr, val) # define AO_HAVE_int_and #endif #if defined(AO_HAVE_int_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_and_full) # define AO_int_and_full(addr, val) \ (AO_nop_full(), AO_int_and_acquire(addr, val)) # define AO_HAVE_int_and_full #endif #if !defined(AO_HAVE_int_and_release_write) \ && defined(AO_HAVE_int_and_write) # define AO_int_and_release_write(addr, val) AO_int_and_write(addr, val) # define AO_HAVE_int_and_release_write #endif #if !defined(AO_HAVE_int_and_release_write) \ && defined(AO_HAVE_int_and_release) # define AO_int_and_release_write(addr, val) AO_int_and_release(addr, val) # define AO_HAVE_int_and_release_write #endif #if !defined(AO_HAVE_int_and_acquire_read) \ && defined(AO_HAVE_int_and_read) # define AO_int_and_acquire_read(addr, val) AO_int_and_read(addr, val) # define AO_HAVE_int_and_acquire_read #endif #if !defined(AO_HAVE_int_and_acquire_read) \ && defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire_read(addr, val) AO_int_and_acquire(addr, val) # define AO_HAVE_int_and_acquire_read #endif /* int_or */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_or_full) AO_INLINE void AO_int_or_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_int_or_full #endif #if defined(AO_HAVE_int_or_full) # if !defined(AO_HAVE_int_or_release) # define AO_int_or_release(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_release # endif # if !defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_acquire # endif # if !defined(AO_HAVE_int_or_write) # define AO_int_or_write(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_write # endif # if !defined(AO_HAVE_int_or_read) # define AO_int_or_read(addr, val) AO_int_or_full(addr, val) # define AO_HAVE_int_or_read # endif #endif /* AO_HAVE_int_or_full */ #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_release) # define AO_int_or(addr, val) AO_int_or_release(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_acquire) # define AO_int_or(addr, val) AO_int_or_acquire(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_write) # define AO_int_or(addr, val) AO_int_or_write(addr, val) # define AO_HAVE_int_or #endif #if !defined(AO_HAVE_int_or) && defined(AO_HAVE_int_or_read) # define AO_int_or(addr, val) AO_int_or_read(addr, val) # define AO_HAVE_int_or #endif #if defined(AO_HAVE_int_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_or_full) # define AO_int_or_full(addr, val) \ (AO_nop_full(), AO_int_or_acquire(addr, val)) # define AO_HAVE_int_or_full #endif #if !defined(AO_HAVE_int_or_release_write) \ && defined(AO_HAVE_int_or_write) # define AO_int_or_release_write(addr, val) AO_int_or_write(addr, val) # define AO_HAVE_int_or_release_write #endif #if !defined(AO_HAVE_int_or_release_write) \ && defined(AO_HAVE_int_or_release) # define AO_int_or_release_write(addr, val) AO_int_or_release(addr, val) # define AO_HAVE_int_or_release_write #endif #if !defined(AO_HAVE_int_or_acquire_read) && defined(AO_HAVE_int_or_read) # define AO_int_or_acquire_read(addr, val) AO_int_or_read(addr, val) # define AO_HAVE_int_or_acquire_read #endif #if !defined(AO_HAVE_int_or_acquire_read) \ && defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire_read(addr, val) AO_int_or_acquire(addr, val) # define AO_HAVE_int_or_acquire_read #endif /* int_xor */ #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_xor_full) AO_INLINE void AO_int_xor_full(volatile unsigned *addr, unsigned value) { unsigned old; do { old = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_int_xor_full #endif #if defined(AO_HAVE_int_xor_full) # if !defined(AO_HAVE_int_xor_release) # define AO_int_xor_release(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_release # endif # if !defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_acquire # endif # if !defined(AO_HAVE_int_xor_write) # define AO_int_xor_write(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_write # endif # if !defined(AO_HAVE_int_xor_read) # define AO_int_xor_read(addr, val) AO_int_xor_full(addr, val) # define AO_HAVE_int_xor_read # endif #endif /* AO_HAVE_int_xor_full */ #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_release) # define AO_int_xor(addr, val) AO_int_xor_release(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_acquire) # define AO_int_xor(addr, val) AO_int_xor_acquire(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_write) # define AO_int_xor(addr, val) AO_int_xor_write(addr, val) # define AO_HAVE_int_xor #endif #if !defined(AO_HAVE_int_xor) && defined(AO_HAVE_int_xor_read) # define AO_int_xor(addr, val) AO_int_xor_read(addr, val) # define AO_HAVE_int_xor #endif #if defined(AO_HAVE_int_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_xor_full) # define AO_int_xor_full(addr, val) \ (AO_nop_full(), AO_int_xor_acquire(addr, val)) # define AO_HAVE_int_xor_full #endif #if !defined(AO_HAVE_int_xor_release_write) \ && defined(AO_HAVE_int_xor_write) # define AO_int_xor_release_write(addr, val) AO_int_xor_write(addr, val) # define AO_HAVE_int_xor_release_write #endif #if !defined(AO_HAVE_int_xor_release_write) \ && defined(AO_HAVE_int_xor_release) # define AO_int_xor_release_write(addr, val) AO_int_xor_release(addr, val) # define AO_HAVE_int_xor_release_write #endif #if !defined(AO_HAVE_int_xor_acquire_read) \ && defined(AO_HAVE_int_xor_read) # define AO_int_xor_acquire_read(addr, val) AO_int_xor_read(addr, val) # define AO_HAVE_int_xor_acquire_read #endif #if !defined(AO_HAVE_int_xor_acquire_read) \ && defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire_read(addr, val) AO_int_xor_acquire(addr, val) # define AO_HAVE_int_xor_acquire_read #endif /* int_and/or/xor_dd_acquire_read are meaningless. */ /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_full) AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_full #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_compare_and_swap_release) AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_compare_and_swap_write) AO_INLINE int AO_compare_and_swap_write(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_compare_and_swap_read) AO_INLINE int AO_compare_and_swap_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_read #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap) AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap #endif #if defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_compare_and_swap_release_write) AO_INLINE int AO_compare_and_swap_release_write(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_compare_and_swap_acquire_read) AO_INLINE int AO_compare_and_swap_acquire_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_compare_and_swap_dd_acquire_read) AO_INLINE int AO_compare_and_swap_dd_acquire_read(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_dd_acquire_read #endif /* fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_fetch_and_add_full) AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_full #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_fetch_and_add_acquire) AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_acquire #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_fetch_and_add_release) AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add_release #endif #if defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_fetch_and_add) AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add_full) # if !defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_release # endif # if !defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add_acquire(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_acquire # endif # if !defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add_write(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_write # endif # if !defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add_read(addr, val) \ AO_fetch_and_add_full(addr, val) # define AO_HAVE_fetch_and_add_read # endif #endif /* AO_HAVE_fetch_and_add_full */ #if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add_acquire) AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t result = AO_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_fetch_and_add_acquire #endif #if defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_fetch_and_add(addr, incr)) # define AO_HAVE_fetch_and_add_release #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_release(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_acquire(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_write(addr, val) # define AO_HAVE_fetch_and_add #endif #if !defined(AO_HAVE_fetch_and_add) \ && defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add(addr, val) \ AO_fetch_and_add_read(addr, val) # define AO_HAVE_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_fetch_and_add_full) # define AO_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_fetch_and_add_acquire(addr, val)) # define AO_HAVE_fetch_and_add_full #endif #if !defined(AO_HAVE_fetch_and_add_release_write) \ && defined(AO_HAVE_fetch_and_add_write) # define AO_fetch_and_add_release_write(addr, val) \ AO_fetch_and_add_write(addr, val) # define AO_HAVE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_fetch_and_add_release_write) \ && defined(AO_HAVE_fetch_and_add_release) # define AO_fetch_and_add_release_write(addr, val) \ AO_fetch_and_add_release(addr, val) # define AO_HAVE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_fetch_and_add_read) # define AO_fetch_and_add_acquire_read(addr, val) \ AO_fetch_and_add_read(addr, val) # define AO_HAVE_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_fetch_and_add_acquire) # define AO_fetch_and_add_acquire_read(addr, val) \ AO_fetch_and_add_acquire(addr, val) # define AO_HAVE_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_add_acquire_read) # define AO_fetch_and_add_dd_acquire_read(addr, val) \ AO_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_add) # define AO_fetch_and_add_dd_acquire_read(addr, val) \ AO_fetch_and_add(addr, val) # define AO_HAVE_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* fetch_and_add1 */ #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_fetch_and_add1_full) # define AO_fetch_and_add1_full(addr) \ AO_fetch_and_add_full(addr, 1) # define AO_HAVE_fetch_and_add1_full #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release(addr) \ AO_fetch_and_add_release(addr, 1) # define AO_HAVE_fetch_and_add1_release #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire(addr) \ AO_fetch_and_add_acquire(addr, 1) # define AO_HAVE_fetch_and_add1_acquire #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_write(addr) \ AO_fetch_and_add_write(addr, 1) # define AO_HAVE_fetch_and_add1_write #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_read(addr) \ AO_fetch_and_add_read(addr, 1) # define AO_HAVE_fetch_and_add1_read #endif #if defined(AO_HAVE_fetch_and_add_release_write) \ && !defined(AO_HAVE_fetch_and_add1_release_write) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add_release_write(addr, 1) # define AO_HAVE_fetch_and_add1_release_write #endif #if defined(AO_HAVE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_fetch_and_add1_acquire_read) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_fetch_and_add1) # define AO_fetch_and_add1(addr) AO_fetch_and_add(addr, 1) # define AO_HAVE_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_add1_full) # if !defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_release # endif # if !defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_write(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_write # endif # if !defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_read(addr) \ AO_fetch_and_add1_full(addr) # define AO_HAVE_fetch_and_add1_read # endif #endif /* AO_HAVE_fetch_and_add1_full */ #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_release(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_acquire(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_write(addr) # define AO_HAVE_fetch_and_add1 #endif #if !defined(AO_HAVE_fetch_and_add1) \ && defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1(addr) AO_fetch_and_add1_read(addr) # define AO_HAVE_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_add1_full) # define AO_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_fetch_and_add1_acquire(addr)) # define AO_HAVE_fetch_and_add1_full #endif #if !defined(AO_HAVE_fetch_and_add1_release_write) \ && defined(AO_HAVE_fetch_and_add1_write) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add1_write(addr) # define AO_HAVE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_fetch_and_add1_release_write) \ && defined(AO_HAVE_fetch_and_add1_release) # define AO_fetch_and_add1_release_write(addr) \ AO_fetch_and_add1_release(addr) # define AO_HAVE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_fetch_and_add1_read) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add1_read(addr) # define AO_HAVE_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_fetch_and_add1_acquire) # define AO_fetch_and_add1_acquire_read(addr) \ AO_fetch_and_add1_acquire(addr) # define AO_HAVE_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_add1_acquire_read) # define AO_fetch_and_add1_dd_acquire_read(addr) \ AO_fetch_and_add1_acquire_read(addr) # define AO_HAVE_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_add1) # define AO_fetch_and_add1_dd_acquire_read(addr) \ AO_fetch_and_add1(addr) # define AO_HAVE_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* fetch_and_sub1 */ #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_fetch_and_sub1_full) # define AO_fetch_and_sub1_full(addr) \ AO_fetch_and_add_full(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_full #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release(addr) \ AO_fetch_and_add_release(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_release #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire(addr) \ AO_fetch_and_add_acquire(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_write(addr) \ AO_fetch_and_add_write(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_write #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_read(addr) \ AO_fetch_and_add_read(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_read #endif #if defined(AO_HAVE_fetch_and_add_release_write) \ && !defined(AO_HAVE_fetch_and_sub1_release_write) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_add_release_write(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_fetch_and_sub1_acquire_read) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_add_acquire_read(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_fetch_and_sub1) # define AO_fetch_and_sub1(addr) \ AO_fetch_and_add(addr, (AO_t)(-1)) # define AO_HAVE_fetch_and_sub1 #endif #if defined(AO_HAVE_fetch_and_sub1_full) # if !defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_release # endif # if !defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_write(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_write # endif # if !defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_read(addr) \ AO_fetch_and_sub1_full(addr) # define AO_HAVE_fetch_and_sub1_read # endif #endif /* AO_HAVE_fetch_and_sub1_full */ #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_release(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_acquire(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_write(addr) # define AO_HAVE_fetch_and_sub1 #endif #if !defined(AO_HAVE_fetch_and_sub1) \ && defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_read(addr) # define AO_HAVE_fetch_and_sub1 #endif #if defined(AO_HAVE_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_and_sub1_full) # define AO_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_fetch_and_sub1_acquire(addr)) # define AO_HAVE_fetch_and_sub1_full #endif #if !defined(AO_HAVE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_fetch_and_sub1_write) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_sub1_write(addr) # define AO_HAVE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_fetch_and_sub1_release) # define AO_fetch_and_sub1_release_write(addr) \ AO_fetch_and_sub1_release(addr) # define AO_HAVE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_fetch_and_sub1_read) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_sub1_read(addr) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_fetch_and_sub1_acquire) # define AO_fetch_and_sub1_acquire_read(addr) \ AO_fetch_and_sub1_acquire(addr) # define AO_HAVE_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_and_sub1_acquire_read) # define AO_fetch_and_sub1_dd_acquire_read(addr) \ AO_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_and_sub1) # define AO_fetch_and_sub1_dd_acquire_read(addr) \ AO_fetch_and_sub1(addr) # define AO_HAVE_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* and */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_and_full) AO_INLINE void AO_and_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_and_full #endif #if defined(AO_HAVE_and_full) # if !defined(AO_HAVE_and_release) # define AO_and_release(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_release # endif # if !defined(AO_HAVE_and_acquire) # define AO_and_acquire(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_acquire # endif # if !defined(AO_HAVE_and_write) # define AO_and_write(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_write # endif # if !defined(AO_HAVE_and_read) # define AO_and_read(addr, val) AO_and_full(addr, val) # define AO_HAVE_and_read # endif #endif /* AO_HAVE_and_full */ #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_release) # define AO_and(addr, val) AO_and_release(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_acquire) # define AO_and(addr, val) AO_and_acquire(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_write) # define AO_and(addr, val) AO_and_write(addr, val) # define AO_HAVE_and #endif #if !defined(AO_HAVE_and) && defined(AO_HAVE_and_read) # define AO_and(addr, val) AO_and_read(addr, val) # define AO_HAVE_and #endif #if defined(AO_HAVE_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_and_full) # define AO_and_full(addr, val) \ (AO_nop_full(), AO_and_acquire(addr, val)) # define AO_HAVE_and_full #endif #if !defined(AO_HAVE_and_release_write) \ && defined(AO_HAVE_and_write) # define AO_and_release_write(addr, val) AO_and_write(addr, val) # define AO_HAVE_and_release_write #endif #if !defined(AO_HAVE_and_release_write) \ && defined(AO_HAVE_and_release) # define AO_and_release_write(addr, val) AO_and_release(addr, val) # define AO_HAVE_and_release_write #endif #if !defined(AO_HAVE_and_acquire_read) \ && defined(AO_HAVE_and_read) # define AO_and_acquire_read(addr, val) AO_and_read(addr, val) # define AO_HAVE_and_acquire_read #endif #if !defined(AO_HAVE_and_acquire_read) \ && defined(AO_HAVE_and_acquire) # define AO_and_acquire_read(addr, val) AO_and_acquire(addr, val) # define AO_HAVE_and_acquire_read #endif /* or */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_or_full) AO_INLINE void AO_or_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_or_full #endif #if defined(AO_HAVE_or_full) # if !defined(AO_HAVE_or_release) # define AO_or_release(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_release # endif # if !defined(AO_HAVE_or_acquire) # define AO_or_acquire(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_acquire # endif # if !defined(AO_HAVE_or_write) # define AO_or_write(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_write # endif # if !defined(AO_HAVE_or_read) # define AO_or_read(addr, val) AO_or_full(addr, val) # define AO_HAVE_or_read # endif #endif /* AO_HAVE_or_full */ #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_release) # define AO_or(addr, val) AO_or_release(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_acquire) # define AO_or(addr, val) AO_or_acquire(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_write) # define AO_or(addr, val) AO_or_write(addr, val) # define AO_HAVE_or #endif #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_read) # define AO_or(addr, val) AO_or_read(addr, val) # define AO_HAVE_or #endif #if defined(AO_HAVE_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_or_full) # define AO_or_full(addr, val) \ (AO_nop_full(), AO_or_acquire(addr, val)) # define AO_HAVE_or_full #endif #if !defined(AO_HAVE_or_release_write) \ && defined(AO_HAVE_or_write) # define AO_or_release_write(addr, val) AO_or_write(addr, val) # define AO_HAVE_or_release_write #endif #if !defined(AO_HAVE_or_release_write) \ && defined(AO_HAVE_or_release) # define AO_or_release_write(addr, val) AO_or_release(addr, val) # define AO_HAVE_or_release_write #endif #if !defined(AO_HAVE_or_acquire_read) && defined(AO_HAVE_or_read) # define AO_or_acquire_read(addr, val) AO_or_read(addr, val) # define AO_HAVE_or_acquire_read #endif #if !defined(AO_HAVE_or_acquire_read) \ && defined(AO_HAVE_or_acquire) # define AO_or_acquire_read(addr, val) AO_or_acquire(addr, val) # define AO_HAVE_or_acquire_read #endif /* xor */ #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_xor_full) AO_INLINE void AO_xor_full(volatile AO_t *addr, AO_t value) { AO_t old; do { old = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_xor_full #endif #if defined(AO_HAVE_xor_full) # if !defined(AO_HAVE_xor_release) # define AO_xor_release(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_release # endif # if !defined(AO_HAVE_xor_acquire) # define AO_xor_acquire(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_acquire # endif # if !defined(AO_HAVE_xor_write) # define AO_xor_write(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_write # endif # if !defined(AO_HAVE_xor_read) # define AO_xor_read(addr, val) AO_xor_full(addr, val) # define AO_HAVE_xor_read # endif #endif /* AO_HAVE_xor_full */ #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_release) # define AO_xor(addr, val) AO_xor_release(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_acquire) # define AO_xor(addr, val) AO_xor_acquire(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_write) # define AO_xor(addr, val) AO_xor_write(addr, val) # define AO_HAVE_xor #endif #if !defined(AO_HAVE_xor) && defined(AO_HAVE_xor_read) # define AO_xor(addr, val) AO_xor_read(addr, val) # define AO_HAVE_xor #endif #if defined(AO_HAVE_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_xor_full) # define AO_xor_full(addr, val) \ (AO_nop_full(), AO_xor_acquire(addr, val)) # define AO_HAVE_xor_full #endif #if !defined(AO_HAVE_xor_release_write) \ && defined(AO_HAVE_xor_write) # define AO_xor_release_write(addr, val) AO_xor_write(addr, val) # define AO_HAVE_xor_release_write #endif #if !defined(AO_HAVE_xor_release_write) \ && defined(AO_HAVE_xor_release) # define AO_xor_release_write(addr, val) AO_xor_release(addr, val) # define AO_HAVE_xor_release_write #endif #if !defined(AO_HAVE_xor_acquire_read) \ && defined(AO_HAVE_xor_read) # define AO_xor_acquire_read(addr, val) AO_xor_read(addr, val) # define AO_HAVE_xor_acquire_read #endif #if !defined(AO_HAVE_xor_acquire_read) \ && defined(AO_HAVE_xor_acquire) # define AO_xor_acquire_read(addr, val) AO_xor_acquire(addr, val) # define AO_HAVE_xor_acquire_read #endif /* and/or/xor_dd_acquire_read are meaningless. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.template0000755000175000017500000010020312456307241026537 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* XSIZE_compare_and_swap (based on fetch_compare_and_swap) */ #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_full) AO_INLINE int AO_XSIZE_compare_and_swap_full(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_full #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) AO_INLINE int AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release) AO_INLINE int AO_XSIZE_compare_and_swap_release(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_write) AO_INLINE int AO_XSIZE_compare_and_swap_write(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_write #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_read) AO_INLINE int AO_XSIZE_compare_and_swap_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_read #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && !defined(AO_HAVE_XSIZE_compare_and_swap) AO_INLINE int AO_XSIZE_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) AO_INLINE int AO_XSIZE_compare_and_swap_release_write(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_release_write(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) AO_INLINE int AO_XSIZE_compare_and_swap_acquire_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read) AO_INLINE int AO_XSIZE_compare_and_swap_dd_acquire_read(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr, old_val, new_val) == old_val; } # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read #endif /* XSIZE_fetch_and_add */ /* We first try to implement fetch_and_add variants in terms of the */ /* corresponding compare_and_swap variants to minimize adding barriers. */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_full) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_full(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_release) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_release(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) \ && !defined(AO_HAVE_XSIZE_fetch_and_add) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old, old + incr))); return old; } # define AO_HAVE_XSIZE_fetch_and_add #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_full) # if !defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add_acquire(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add_write(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add_read(addr, val) \ AO_XSIZE_fetch_and_add_full(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_add_full */ #if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire) AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_acquire(volatile XCTYPE *addr, XCTYPE incr) { XCTYPE result = AO_XSIZE_fetch_and_add(addr, incr); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_fetch_and_add_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release(addr, incr) \ (AO_nop_full(), AO_XSIZE_fetch_and_add(addr, incr)) # define AO_HAVE_XSIZE_fetch_and_add_release #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_release(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_acquire(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_write(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add) \ && defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add(addr, val) \ AO_XSIZE_fetch_and_add_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_XSIZE_fetch_and_add_full) # define AO_XSIZE_fetch_and_add_full(addr, val) \ (AO_nop_full(), AO_XSIZE_fetch_and_add_acquire(addr, val)) # define AO_HAVE_XSIZE_fetch_and_add_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add_write) # define AO_XSIZE_fetch_and_add_release_write(addr, val) \ AO_XSIZE_fetch_and_add_write(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add_release) # define AO_XSIZE_fetch_and_add_release_write(addr, val) \ AO_XSIZE_fetch_and_add_release(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add_read) # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add_acquire) # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_acquire(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) # define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add_acquire_read(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_add) # define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \ AO_XSIZE_fetch_and_add(addr, val) # define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_fetch_and_add1 */ #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full) # define AO_XSIZE_fetch_and_add1_full(addr) \ AO_XSIZE_fetch_and_add_full(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_full #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release(addr) \ AO_XSIZE_fetch_and_add_release(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_release #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire(addr) \ AO_XSIZE_fetch_and_add_acquire(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_write(addr) \ AO_XSIZE_fetch_and_add_write(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_read(addr) \ AO_XSIZE_fetch_and_add_read(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add_release_write(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add_acquire_read(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add(addr, 1) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_add1_full) # if !defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_write(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_read(addr) \ AO_XSIZE_fetch_and_add1_full(addr) # define AO_HAVE_XSIZE_fetch_and_add1_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_add1_full */ #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_release(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_write(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_add1_full) # define AO_XSIZE_fetch_and_add1_full(addr) \ (AO_nop_full(), AO_XSIZE_fetch_and_add1_acquire(addr)) # define AO_HAVE_XSIZE_fetch_and_add1_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_write) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add1_write(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_release) # define AO_XSIZE_fetch_and_add1_release_write(addr) \ AO_XSIZE_fetch_and_add1_release(addr) # define AO_HAVE_XSIZE_fetch_and_add1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_read) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) # define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_add1_acquire_read(addr) # define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_add1) # define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_add1(addr) # define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_fetch_and_sub1 */ #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # define AO_XSIZE_fetch_and_sub1_full(addr) \ AO_XSIZE_fetch_and_add_full(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_full #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release(addr) \ AO_XSIZE_fetch_and_add_release(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_release #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire(addr) \ AO_XSIZE_fetch_and_add_acquire(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_write(addr) \ AO_XSIZE_fetch_and_add_write(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_read(addr) \ AO_XSIZE_fetch_and_add_read(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_add_release_write(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_add_acquire_read(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #if defined(AO_HAVE_XSIZE_fetch_and_add) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1) # define AO_XSIZE_fetch_and_sub1(addr) \ AO_XSIZE_fetch_and_add(addr, (XCTYPE)(-1)) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_write(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_write # endif # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_read(addr) \ AO_XSIZE_fetch_and_sub1_full(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_read # endif #endif /* AO_HAVE_XSIZE_fetch_and_sub1_full */ #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_release(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_write(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1 #endif #if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full) # define AO_XSIZE_fetch_and_sub1_full(addr) \ (AO_nop_full(), AO_XSIZE_fetch_and_sub1_acquire(addr)) # define AO_HAVE_XSIZE_fetch_and_sub1_full #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_write) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_sub1_write(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_release) # define AO_XSIZE_fetch_and_sub1_release_write(addr) \ AO_XSIZE_fetch_and_sub1_release(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_read) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_acquire(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) # define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1_acquire_read(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_and_sub1) # define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \ AO_XSIZE_fetch_and_sub1(addr) # define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_and */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_and_full) AO_INLINE void AO_XSIZE_and_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old & value))); } # define AO_HAVE_XSIZE_and_full #endif #if defined(AO_HAVE_XSIZE_and_full) # if !defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and_release(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_release # endif # if !defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and_acquire(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_acquire # endif # if !defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and_write(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_write # endif # if !defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and_read(addr, val) AO_XSIZE_and_full(addr, val) # define AO_HAVE_XSIZE_and_read # endif #endif /* AO_HAVE_XSIZE_and_full */ #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_release(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_acquire(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_write(addr, val) # define AO_HAVE_XSIZE_and #endif #if !defined(AO_HAVE_XSIZE_and) && defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and(addr, val) AO_XSIZE_and_read(addr, val) # define AO_HAVE_XSIZE_and #endif #if defined(AO_HAVE_XSIZE_and_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_and_full) # define AO_XSIZE_and_full(addr, val) \ (AO_nop_full(), AO_XSIZE_and_acquire(addr, val)) # define AO_HAVE_XSIZE_and_full #endif #if !defined(AO_HAVE_XSIZE_and_release_write) \ && defined(AO_HAVE_XSIZE_and_write) # define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_write(addr, val) # define AO_HAVE_XSIZE_and_release_write #endif #if !defined(AO_HAVE_XSIZE_and_release_write) \ && defined(AO_HAVE_XSIZE_and_release) # define AO_XSIZE_and_release_write(addr, val) AO_XSIZE_and_release(addr, val) # define AO_HAVE_XSIZE_and_release_write #endif #if !defined(AO_HAVE_XSIZE_and_acquire_read) \ && defined(AO_HAVE_XSIZE_and_read) # define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_read(addr, val) # define AO_HAVE_XSIZE_and_acquire_read #endif #if !defined(AO_HAVE_XSIZE_and_acquire_read) \ && defined(AO_HAVE_XSIZE_and_acquire) # define AO_XSIZE_and_acquire_read(addr, val) AO_XSIZE_and_acquire(addr, val) # define AO_HAVE_XSIZE_and_acquire_read #endif /* XSIZE_or */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_or_full) AO_INLINE void AO_XSIZE_or_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old | value))); } # define AO_HAVE_XSIZE_or_full #endif #if defined(AO_HAVE_XSIZE_or_full) # if !defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or_release(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_release # endif # if !defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or_acquire(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_acquire # endif # if !defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or_write(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_write # endif # if !defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or_read(addr, val) AO_XSIZE_or_full(addr, val) # define AO_HAVE_XSIZE_or_read # endif #endif /* AO_HAVE_XSIZE_or_full */ #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_release(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_acquire(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_write(addr, val) # define AO_HAVE_XSIZE_or #endif #if !defined(AO_HAVE_XSIZE_or) && defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or(addr, val) AO_XSIZE_or_read(addr, val) # define AO_HAVE_XSIZE_or #endif #if defined(AO_HAVE_XSIZE_or_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_or_full) # define AO_XSIZE_or_full(addr, val) \ (AO_nop_full(), AO_XSIZE_or_acquire(addr, val)) # define AO_HAVE_XSIZE_or_full #endif #if !defined(AO_HAVE_XSIZE_or_release_write) \ && defined(AO_HAVE_XSIZE_or_write) # define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_write(addr, val) # define AO_HAVE_XSIZE_or_release_write #endif #if !defined(AO_HAVE_XSIZE_or_release_write) \ && defined(AO_HAVE_XSIZE_or_release) # define AO_XSIZE_or_release_write(addr, val) AO_XSIZE_or_release(addr, val) # define AO_HAVE_XSIZE_or_release_write #endif #if !defined(AO_HAVE_XSIZE_or_acquire_read) && defined(AO_HAVE_XSIZE_or_read) # define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_read(addr, val) # define AO_HAVE_XSIZE_or_acquire_read #endif #if !defined(AO_HAVE_XSIZE_or_acquire_read) \ && defined(AO_HAVE_XSIZE_or_acquire) # define AO_XSIZE_or_acquire_read(addr, val) AO_XSIZE_or_acquire(addr, val) # define AO_HAVE_XSIZE_or_acquire_read #endif /* XSIZE_xor */ #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_xor_full) AO_INLINE void AO_XSIZE_xor_full(volatile XCTYPE *addr, XCTYPE value) { XCTYPE old; do { old = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old, old ^ value))); } # define AO_HAVE_XSIZE_xor_full #endif #if defined(AO_HAVE_XSIZE_xor_full) # if !defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor_release(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_release # endif # if !defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor_acquire(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_acquire # endif # if !defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor_write(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_write # endif # if !defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor_read(addr, val) AO_XSIZE_xor_full(addr, val) # define AO_HAVE_XSIZE_xor_read # endif #endif /* AO_HAVE_XSIZE_xor_full */ #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_release(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_acquire(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_write(addr, val) # define AO_HAVE_XSIZE_xor #endif #if !defined(AO_HAVE_XSIZE_xor) && defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor(addr, val) AO_XSIZE_xor_read(addr, val) # define AO_HAVE_XSIZE_xor #endif #if defined(AO_HAVE_XSIZE_xor_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_xor_full) # define AO_XSIZE_xor_full(addr, val) \ (AO_nop_full(), AO_XSIZE_xor_acquire(addr, val)) # define AO_HAVE_XSIZE_xor_full #endif #if !defined(AO_HAVE_XSIZE_xor_release_write) \ && defined(AO_HAVE_XSIZE_xor_write) # define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_write(addr, val) # define AO_HAVE_XSIZE_xor_release_write #endif #if !defined(AO_HAVE_XSIZE_xor_release_write) \ && defined(AO_HAVE_XSIZE_xor_release) # define AO_XSIZE_xor_release_write(addr, val) AO_XSIZE_xor_release(addr, val) # define AO_HAVE_XSIZE_xor_release_write #endif #if !defined(AO_HAVE_XSIZE_xor_acquire_read) \ && defined(AO_HAVE_XSIZE_xor_read) # define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_read(addr, val) # define AO_HAVE_XSIZE_xor_acquire_read #endif #if !defined(AO_HAVE_XSIZE_xor_acquire_read) \ && defined(AO_HAVE_XSIZE_xor_acquire) # define AO_XSIZE_xor_acquire_read(addr, val) AO_XSIZE_xor_acquire(addr, val) # define AO_HAVE_XSIZE_xor_acquire_read #endif /* XSIZE_and/or/xor_dd_acquire_read are meaningless. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/generalize-small.h0000755000175000017500000030731112456307241025010 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* char_fetch_compare_and_swap */ #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { unsigned/**/char result = AO_char_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_char_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_char_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_char_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_full) # if !defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_char_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap) \ && defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap(addr, old_val, new_val) \ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap #endif #if defined(AO_HAVE_char_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_fetch_compare_and_swap_full) # define AO_char_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_char_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_char_fetch_compare_and_swap_write) # define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_char_fetch_compare_and_swap_release) # define AO_char_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_fetch_compare_and_swap_read) # define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_fetch_compare_and_swap_acquire) # define AO_char_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_fetch_compare_and_swap_acquire_read) # define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_char_fetch_compare_and_swap) # define AO_char_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_char_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_char_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_compare_and_swap */ #if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_acquire) AO_INLINE int AO_char_compare_and_swap_acquire(volatile unsigned/**/char *addr, unsigned/**/char old, unsigned/**/char new_val) { int result = AO_char_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_char_compare_and_swap_acquire #endif #if defined(AO_HAVE_char_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_char_compare_and_swap(addr, old, new_val)) # define AO_HAVE_char_compare_and_swap_release #endif #if defined(AO_HAVE_char_compare_and_swap_full) # if !defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release # endif # if !defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap_acquire(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire # endif # if !defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap_write(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_write # endif # if !defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap_read(addr, old, new_val) \ AO_char_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_read # endif #endif /* AO_HAVE_char_compare_and_swap_full */ #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if !defined(AO_HAVE_char_compare_and_swap) \ && defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap(addr, old, new_val) \ AO_char_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_compare_and_swap_full) # define AO_char_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_char_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_char_compare_and_swap_full #endif #if !defined(AO_HAVE_char_compare_and_swap_release_write) \ && defined(AO_HAVE_char_compare_and_swap_write) # define AO_char_compare_and_swap_release_write(addr, old, new_val) \ AO_char_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_compare_and_swap_release_write) \ && defined(AO_HAVE_char_compare_and_swap_release) # define AO_char_compare_and_swap_release_write(addr, old, new_val) \ AO_char_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_release_write #endif #if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_compare_and_swap_read) # define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_char_compare_and_swap_acquire_read) \ && defined(AO_HAVE_char_compare_and_swap_acquire) # define AO_char_compare_and_swap_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_compare_and_swap_acquire_read) # define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_char_compare_and_swap) # define AO_char_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_char_compare_and_swap(addr, old, new_val) # define AO_HAVE_char_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_load */ #if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_acquire) # define AO_char_load_acquire(addr) AO_char_load_full(addr) # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_load_acquire) && !defined(AO_HAVE_char_load) # define AO_char_load(addr) AO_char_load_acquire(addr) # define AO_HAVE_char_load #endif #if defined(AO_HAVE_char_load_full) && !defined(AO_HAVE_char_load_read) # define AO_char_load_read(addr) AO_char_load_full(addr) # define AO_HAVE_char_load_read #endif #if !defined(AO_HAVE_char_load_acquire_read) \ && defined(AO_HAVE_char_load_acquire) # define AO_char_load_acquire_read(addr) AO_char_load_acquire(addr) # define AO_HAVE_char_load_acquire_read #endif #if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_load_acquire) AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result = AO_char_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_char_load_read) AO_INLINE unsigned/**/char AO_char_load_read(const volatile unsigned/**/char *addr) { unsigned/**/char result = AO_char_load(addr); AO_nop_read(); return result; } # define AO_HAVE_char_load_read #endif #if defined(AO_HAVE_char_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_load_full) # define AO_char_load_full(addr) (AO_nop_full(), AO_char_load_acquire(addr)) # define AO_HAVE_char_load_full #endif #if defined(AO_HAVE_char_compare_and_swap_read) \ && !defined(AO_HAVE_char_load_read) # define AO_char_CAS_BASED_LOAD_READ AO_INLINE unsigned/**/char AO_char_load_read(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_read( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_read #endif #if !defined(AO_HAVE_char_load_acquire_read) \ && defined(AO_HAVE_char_load_read) # define AO_char_load_acquire_read(addr) AO_char_load_read(addr) # define AO_HAVE_char_load_acquire_read #endif #if defined(AO_HAVE_char_load_acquire_read) && !defined(AO_HAVE_char_load) \ && (!defined(AO_char_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_char_compare_and_swap)) # define AO_char_load(addr) AO_char_load_acquire_read(addr) # define AO_HAVE_char_load #endif #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_load_full) AO_INLINE unsigned/**/char AO_char_load_full(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_full #endif #if defined(AO_HAVE_char_compare_and_swap_acquire) \ && !defined(AO_HAVE_char_load_acquire) AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_acquire( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load_acquire #endif #if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_load) AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { unsigned/**/char result; do { result = *(const unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap( (volatile unsigned/**/char *)addr, result, result))); return result; } # define AO_HAVE_char_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_char_load_acquire_read) # define AO_char_load_dd_acquire_read(addr) \ AO_char_load_acquire_read(addr) # define AO_HAVE_char_load_dd_acquire_read # endif #else # if defined(AO_HAVE_char_load) # define AO_char_load_dd_acquire_read(addr) AO_char_load(addr) # define AO_HAVE_char_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* char_store */ #if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_release) # define AO_char_store_release(addr, val) AO_char_store_full(addr, val) # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_store_release) && !defined(AO_HAVE_char_store) # define AO_char_store(addr, val) AO_char_store_release(addr, val) # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_store_full) && !defined(AO_HAVE_char_store_write) # define AO_char_store_write(addr, val) AO_char_store_full(addr, val) # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_store_release) \ && !defined(AO_HAVE_char_store_release_write) # define AO_char_store_release_write(addr, val) \ AO_char_store_release(addr, val) # define AO_HAVE_char_store_release_write #endif #if defined(AO_HAVE_char_store_write) && !defined(AO_HAVE_char_store) # define AO_char_store(addr, val) AO_char_store_write(addr, val) # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_store_release) # define AO_char_store_release(addr, val) \ (AO_nop_full(), AO_char_store(addr, val)) # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_char_store_write) # define AO_char_store_write(addr, val) \ (AO_nop_write(), AO_char_store(addr, val)) # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_compare_and_swap_write) \ && !defined(AO_HAVE_char_store_write) AO_INLINE void AO_char_store_write(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_char_store_write #endif #if defined(AO_HAVE_char_store_write) \ && !defined(AO_HAVE_char_store_release_write) # define AO_char_store_release_write(addr, val) \ AO_char_store_write(addr, val) # define AO_HAVE_char_store_release_write #endif #if defined(AO_HAVE_char_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_char_store_full) # define AO_char_store_full(addr, val) \ (AO_char_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_char_store_full #endif #if defined(AO_HAVE_char_compare_and_swap) && !defined(AO_HAVE_char_store) AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_char_store #endif #if defined(AO_HAVE_char_compare_and_swap_release) \ && !defined(AO_HAVE_char_store_release) AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_char_store_release #endif #if defined(AO_HAVE_char_compare_and_swap_full) \ && !defined(AO_HAVE_char_store_full) AO_INLINE void AO_char_store_full(volatile unsigned/**/char *addr, unsigned/**/char new_val) { unsigned/**/char old_val; do { old_val = *(unsigned/**/char *)addr; } while (AO_EXPECT_FALSE(!AO_char_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_char_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* short_fetch_compare_and_swap */ #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { unsigned/**/short result = AO_short_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_short_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_short_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_short_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_full) # if !defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_short_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap) \ && defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap(addr, old_val, new_val) \ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap #endif #if defined(AO_HAVE_short_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_fetch_compare_and_swap_full) # define AO_short_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_short_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_short_fetch_compare_and_swap_write) # define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_short_fetch_compare_and_swap_release) # define AO_short_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_fetch_compare_and_swap_read) # define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_fetch_compare_and_swap_acquire) # define AO_short_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_fetch_compare_and_swap_acquire_read) # define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_short_fetch_compare_and_swap) # define AO_short_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_short_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_short_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_compare_and_swap */ #if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_acquire) AO_INLINE int AO_short_compare_and_swap_acquire(volatile unsigned/**/short *addr, unsigned/**/short old, unsigned/**/short new_val) { int result = AO_short_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_short_compare_and_swap_acquire #endif #if defined(AO_HAVE_short_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_short_compare_and_swap(addr, old, new_val)) # define AO_HAVE_short_compare_and_swap_release #endif #if defined(AO_HAVE_short_compare_and_swap_full) # if !defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release # endif # if !defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap_acquire(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire # endif # if !defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap_write(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_write # endif # if !defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap_read(addr, old, new_val) \ AO_short_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_read # endif #endif /* AO_HAVE_short_compare_and_swap_full */ #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if !defined(AO_HAVE_short_compare_and_swap) \ && defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap(addr, old, new_val) \ AO_short_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_compare_and_swap_full) # define AO_short_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_short_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_short_compare_and_swap_full #endif #if !defined(AO_HAVE_short_compare_and_swap_release_write) \ && defined(AO_HAVE_short_compare_and_swap_write) # define AO_short_compare_and_swap_release_write(addr, old, new_val) \ AO_short_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_compare_and_swap_release_write) \ && defined(AO_HAVE_short_compare_and_swap_release) # define AO_short_compare_and_swap_release_write(addr, old, new_val) \ AO_short_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_release_write #endif #if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_compare_and_swap_read) # define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_short_compare_and_swap_acquire_read) \ && defined(AO_HAVE_short_compare_and_swap_acquire) # define AO_short_compare_and_swap_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_compare_and_swap_acquire_read) # define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_short_compare_and_swap) # define AO_short_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_short_compare_and_swap(addr, old, new_val) # define AO_HAVE_short_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_load */ #if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_acquire) # define AO_short_load_acquire(addr) AO_short_load_full(addr) # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_load_acquire) && !defined(AO_HAVE_short_load) # define AO_short_load(addr) AO_short_load_acquire(addr) # define AO_HAVE_short_load #endif #if defined(AO_HAVE_short_load_full) && !defined(AO_HAVE_short_load_read) # define AO_short_load_read(addr) AO_short_load_full(addr) # define AO_HAVE_short_load_read #endif #if !defined(AO_HAVE_short_load_acquire_read) \ && defined(AO_HAVE_short_load_acquire) # define AO_short_load_acquire_read(addr) AO_short_load_acquire(addr) # define AO_HAVE_short_load_acquire_read #endif #if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_load_acquire) AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result = AO_short_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_short_load_read) AO_INLINE unsigned/**/short AO_short_load_read(const volatile unsigned/**/short *addr) { unsigned/**/short result = AO_short_load(addr); AO_nop_read(); return result; } # define AO_HAVE_short_load_read #endif #if defined(AO_HAVE_short_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_load_full) # define AO_short_load_full(addr) (AO_nop_full(), AO_short_load_acquire(addr)) # define AO_HAVE_short_load_full #endif #if defined(AO_HAVE_short_compare_and_swap_read) \ && !defined(AO_HAVE_short_load_read) # define AO_short_CAS_BASED_LOAD_READ AO_INLINE unsigned/**/short AO_short_load_read(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_read( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_read #endif #if !defined(AO_HAVE_short_load_acquire_read) \ && defined(AO_HAVE_short_load_read) # define AO_short_load_acquire_read(addr) AO_short_load_read(addr) # define AO_HAVE_short_load_acquire_read #endif #if defined(AO_HAVE_short_load_acquire_read) && !defined(AO_HAVE_short_load) \ && (!defined(AO_short_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_short_compare_and_swap)) # define AO_short_load(addr) AO_short_load_acquire_read(addr) # define AO_HAVE_short_load #endif #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_load_full) AO_INLINE unsigned/**/short AO_short_load_full(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_full #endif #if defined(AO_HAVE_short_compare_and_swap_acquire) \ && !defined(AO_HAVE_short_load_acquire) AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_acquire( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load_acquire #endif #if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_load) AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { unsigned/**/short result; do { result = *(const unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap( (volatile unsigned/**/short *)addr, result, result))); return result; } # define AO_HAVE_short_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_short_load_acquire_read) # define AO_short_load_dd_acquire_read(addr) \ AO_short_load_acquire_read(addr) # define AO_HAVE_short_load_dd_acquire_read # endif #else # if defined(AO_HAVE_short_load) # define AO_short_load_dd_acquire_read(addr) AO_short_load(addr) # define AO_HAVE_short_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* short_store */ #if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_release) # define AO_short_store_release(addr, val) AO_short_store_full(addr, val) # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_store_release) && !defined(AO_HAVE_short_store) # define AO_short_store(addr, val) AO_short_store_release(addr, val) # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_store_full) && !defined(AO_HAVE_short_store_write) # define AO_short_store_write(addr, val) AO_short_store_full(addr, val) # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_store_release) \ && !defined(AO_HAVE_short_store_release_write) # define AO_short_store_release_write(addr, val) \ AO_short_store_release(addr, val) # define AO_HAVE_short_store_release_write #endif #if defined(AO_HAVE_short_store_write) && !defined(AO_HAVE_short_store) # define AO_short_store(addr, val) AO_short_store_write(addr, val) # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_store_release) # define AO_short_store_release(addr, val) \ (AO_nop_full(), AO_short_store(addr, val)) # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_short_store_write) # define AO_short_store_write(addr, val) \ (AO_nop_write(), AO_short_store(addr, val)) # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_compare_and_swap_write) \ && !defined(AO_HAVE_short_store_write) AO_INLINE void AO_short_store_write(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_short_store_write #endif #if defined(AO_HAVE_short_store_write) \ && !defined(AO_HAVE_short_store_release_write) # define AO_short_store_release_write(addr, val) \ AO_short_store_write(addr, val) # define AO_HAVE_short_store_release_write #endif #if defined(AO_HAVE_short_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_short_store_full) # define AO_short_store_full(addr, val) \ (AO_short_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_short_store_full #endif #if defined(AO_HAVE_short_compare_and_swap) && !defined(AO_HAVE_short_store) AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_short_store #endif #if defined(AO_HAVE_short_compare_and_swap_release) \ && !defined(AO_HAVE_short_store_release) AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_short_store_release #endif #if defined(AO_HAVE_short_compare_and_swap_full) \ && !defined(AO_HAVE_short_store_full) AO_INLINE void AO_short_store_full(volatile unsigned/**/short *addr, unsigned/**/short new_val) { unsigned/**/short old_val; do { old_val = *(unsigned/**/short *)addr; } while (AO_EXPECT_FALSE(!AO_short_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_short_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* int_fetch_compare_and_swap */ #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) AO_INLINE unsigned AO_int_fetch_compare_and_swap_acquire(volatile unsigned *addr, unsigned old_val, unsigned new_val) { unsigned result = AO_int_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_int_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_int_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_int_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_full) # if !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_int_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap) \ && defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap(addr, old_val, new_val) \ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap #endif #if defined(AO_HAVE_int_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_full) # define AO_int_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_int_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_fetch_compare_and_swap_acquire_read) # define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_int_fetch_compare_and_swap) # define AO_int_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_int_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_int_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_compare_and_swap */ #if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) AO_INLINE int AO_int_compare_and_swap_acquire(volatile unsigned *addr, unsigned old, unsigned new_val) { int result = AO_int_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_int_compare_and_swap_acquire #endif #if defined(AO_HAVE_int_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_int_compare_and_swap(addr, old, new_val)) # define AO_HAVE_int_compare_and_swap_release #endif #if defined(AO_HAVE_int_compare_and_swap_full) # if !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release # endif # if !defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire # endif # if !defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_write(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_write # endif # if !defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_read(addr, old, new_val) \ AO_int_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_read # endif #endif /* AO_HAVE_int_compare_and_swap_full */ #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if !defined(AO_HAVE_int_compare_and_swap) \ && defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_int_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) # define AO_int_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_int_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_int_compare_and_swap_full #endif #if !defined(AO_HAVE_int_compare_and_swap_release_write) \ && defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_release_write(addr, old, new_val) \ AO_int_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_compare_and_swap_release_write) \ && defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release_write(addr, old, new_val) \ AO_int_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_release_write #endif #if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_int_compare_and_swap_acquire_read) \ && defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_compare_and_swap_acquire_read) # define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_int_compare_and_swap) # define AO_int_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_int_compare_and_swap(addr, old, new_val) # define AO_HAVE_int_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_load */ #if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire(addr) AO_int_load_full(addr) # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_load_acquire) && !defined(AO_HAVE_int_load) # define AO_int_load(addr) AO_int_load_acquire(addr) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_int_load_full) && !defined(AO_HAVE_int_load_read) # define AO_int_load_read(addr) AO_int_load_full(addr) # define AO_HAVE_int_load_read #endif #if !defined(AO_HAVE_int_load_acquire_read) \ && defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire_read(addr) AO_int_load_acquire(addr) # define AO_HAVE_int_load_acquire_read #endif #if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_load_acquire) AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result = AO_int_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_int_load_read) AO_INLINE unsigned AO_int_load_read(const volatile unsigned *addr) { unsigned result = AO_int_load(addr); AO_nop_read(); return result; } # define AO_HAVE_int_load_read #endif #if defined(AO_HAVE_int_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_load_full) # define AO_int_load_full(addr) (AO_nop_full(), AO_int_load_acquire(addr)) # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_int_compare_and_swap_read) \ && !defined(AO_HAVE_int_load_read) # define AO_int_CAS_BASED_LOAD_READ AO_INLINE unsigned AO_int_load_read(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_read( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_read #endif #if !defined(AO_HAVE_int_load_acquire_read) \ && defined(AO_HAVE_int_load_read) # define AO_int_load_acquire_read(addr) AO_int_load_read(addr) # define AO_HAVE_int_load_acquire_read #endif #if defined(AO_HAVE_int_load_acquire_read) && !defined(AO_HAVE_int_load) \ && (!defined(AO_int_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_int_compare_and_swap)) # define AO_int_load(addr) AO_int_load_acquire_read(addr) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_load_full) AO_INLINE unsigned AO_int_load_full(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_int_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_load_acquire) AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_acquire( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_load) AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { unsigned result; do { result = *(const unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap( (volatile unsigned *)addr, result, result))); return result; } # define AO_HAVE_int_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_int_load_acquire_read) # define AO_int_load_dd_acquire_read(addr) \ AO_int_load_acquire_read(addr) # define AO_HAVE_int_load_dd_acquire_read # endif #else # if defined(AO_HAVE_int_load) # define AO_int_load_dd_acquire_read(addr) AO_int_load(addr) # define AO_HAVE_int_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* int_store */ #if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) AO_int_store_full(addr, val) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_store_release) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) AO_int_store_release(addr, val) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_store_full) && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) AO_int_store_full(addr, val) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_store_release) \ && !defined(AO_HAVE_int_store_release_write) # define AO_int_store_release_write(addr, val) \ AO_int_store_release(addr, val) # define AO_HAVE_int_store_release_write #endif #if defined(AO_HAVE_int_store_write) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) AO_int_store_write(addr, val) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) \ (AO_nop_full(), AO_int_store(addr, val)) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) \ (AO_nop_write(), AO_int_store(addr, val)) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_compare_and_swap_write) \ && !defined(AO_HAVE_int_store_write) AO_INLINE void AO_int_store_write(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_int_store_write) \ && !defined(AO_HAVE_int_store_release_write) # define AO_int_store_release_write(addr, val) \ AO_int_store_write(addr, val) # define AO_HAVE_int_store_release_write #endif #if defined(AO_HAVE_int_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_int_store_full) # define AO_int_store_full(addr, val) \ (AO_int_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_int_store_full #endif #if defined(AO_HAVE_int_compare_and_swap) && !defined(AO_HAVE_int_store) AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_int_store #endif #if defined(AO_HAVE_int_compare_and_swap_release) \ && !defined(AO_HAVE_int_store_release) AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_int_compare_and_swap_full) \ && !defined(AO_HAVE_int_store_full) AO_INLINE void AO_int_store_full(volatile unsigned *addr, unsigned new_val) { unsigned old_val; do { old_val = *(unsigned *)addr; } while (AO_EXPECT_FALSE(!AO_int_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_int_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* fetch_compare_and_swap */ #if defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_acquire) AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_full) # if !defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_fetch_compare_and_swap) \ && defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap(addr, old_val, new_val) \ AO_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_fetch_compare_and_swap_full) # define AO_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_fetch_compare_and_swap_write) # define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_fetch_compare_and_swap_release) # define AO_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_fetch_compare_and_swap_read) # define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_fetch_compare_and_swap_acquire) # define AO_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_fetch_compare_and_swap_acquire_read) # define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_fetch_compare_and_swap) # define AO_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* compare_and_swap */ #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { int result = AO_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_compare_and_swap(addr, old, new_val)) # define AO_HAVE_compare_and_swap_release #endif #if defined(AO_HAVE_compare_and_swap_full) # if !defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_release # endif # if !defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap_acquire(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire # endif # if !defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap_write(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_write # endif # if !defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap_read(addr, old, new_val) \ AO_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_compare_and_swap_read # endif #endif /* AO_HAVE_compare_and_swap_full */ #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if !defined(AO_HAVE_compare_and_swap) \ && defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_compare_and_swap #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_full) # define AO_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_compare_and_swap_full #endif #if !defined(AO_HAVE_compare_and_swap_release_write) \ && defined(AO_HAVE_compare_and_swap_write) # define AO_compare_and_swap_release_write(addr, old, new_val) \ AO_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_compare_and_swap_release_write) \ && defined(AO_HAVE_compare_and_swap_release) # define AO_compare_and_swap_release_write(addr, old, new_val) \ AO_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_compare_and_swap_read) # define AO_compare_and_swap_acquire_read(addr, old, new_val) \ AO_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_compare_and_swap_acquire) # define AO_compare_and_swap_acquire_read(addr, old, new_val) \ AO_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_and_swap_acquire_read) # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_and_swap) # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_compare_and_swap(addr, old, new_val) # define AO_HAVE_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* load */ #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_acquire) # define AO_load_acquire(addr) AO_load_full(addr) # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_load) # define AO_load(addr) AO_load_acquire(addr) # define AO_HAVE_load #endif #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_read) # define AO_load_read(addr) AO_load_full(addr) # define AO_HAVE_load_read #endif #if !defined(AO_HAVE_load_acquire_read) \ && defined(AO_HAVE_load_acquire) # define AO_load_acquire_read(addr) AO_load_acquire(addr) # define AO_HAVE_load_acquire_read #endif #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_load_acquire) AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = AO_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_load_read) AO_INLINE AO_t AO_load_read(const volatile AO_t *addr) { AO_t result = AO_load(addr); AO_nop_read(); return result; } # define AO_HAVE_load_read #endif #if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_load_full) # define AO_load_full(addr) (AO_nop_full(), AO_load_acquire(addr)) # define AO_HAVE_load_full #endif #if defined(AO_HAVE_compare_and_swap_read) \ && !defined(AO_HAVE_load_read) # define AO_CAS_BASED_LOAD_READ AO_INLINE AO_t AO_load_read(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_read( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_read #endif #if !defined(AO_HAVE_load_acquire_read) \ && defined(AO_HAVE_load_read) # define AO_load_acquire_read(addr) AO_load_read(addr) # define AO_HAVE_load_acquire_read #endif #if defined(AO_HAVE_load_acquire_read) && !defined(AO_HAVE_load) \ && (!defined(AO_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_compare_and_swap)) # define AO_load(addr) AO_load_acquire_read(addr) # define AO_HAVE_load #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_load_full) AO_INLINE AO_t AO_load_full(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_full #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_load_acquire) AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_acquire( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load_acquire #endif #if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_load) AO_INLINE AO_t AO_load(const volatile AO_t *addr) { AO_t result; do { result = *(const AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap( (volatile AO_t *)addr, result, result))); return result; } # define AO_HAVE_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_load_acquire_read) # define AO_load_dd_acquire_read(addr) \ AO_load_acquire_read(addr) # define AO_HAVE_load_dd_acquire_read # endif #else # if defined(AO_HAVE_load) # define AO_load_dd_acquire_read(addr) AO_load(addr) # define AO_HAVE_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* store */ #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_release) # define AO_store_release(addr, val) AO_store_full(addr, val) # define AO_HAVE_store_release #endif #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store) # define AO_store(addr, val) AO_store_release(addr, val) # define AO_HAVE_store #endif #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_write) # define AO_store_write(addr, val) AO_store_full(addr, val) # define AO_HAVE_store_write #endif #if defined(AO_HAVE_store_release) \ && !defined(AO_HAVE_store_release_write) # define AO_store_release_write(addr, val) \ AO_store_release(addr, val) # define AO_HAVE_store_release_write #endif #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store) # define AO_store(addr, val) AO_store_write(addr, val) # define AO_HAVE_store #endif #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_store_release) # define AO_store_release(addr, val) \ (AO_nop_full(), AO_store(addr, val)) # define AO_HAVE_store_release #endif #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_store_write) # define AO_store_write(addr, val) \ (AO_nop_write(), AO_store(addr, val)) # define AO_HAVE_store_write #endif #if defined(AO_HAVE_compare_and_swap_write) \ && !defined(AO_HAVE_store_write) AO_INLINE void AO_store_write(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_store_write #endif #if defined(AO_HAVE_store_write) \ && !defined(AO_HAVE_store_release_write) # define AO_store_release_write(addr, val) \ AO_store_write(addr, val) # define AO_HAVE_store_release_write #endif #if defined(AO_HAVE_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_store_full) # define AO_store_full(addr, val) \ (AO_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_store_full #endif #if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_store) AO_INLINE void AO_store(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_store #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_store_release) AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_store_release #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_store_full) AO_INLINE void AO_store_full(volatile AO_t *addr, AO_t new_val) { AO_t old_val; do { old_val = *(AO_t *)addr; } while (AO_EXPECT_FALSE(!AO_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_store_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* double_fetch_compare_and_swap */ #if defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_acquire) AO_INLINE AO_double_t AO_double_fetch_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t result = AO_double_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_double_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_double_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_double_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_double_fetch_compare_and_swap_full) # if !defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_double_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap) \ && defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap(addr, old_val, new_val) \ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap #endif #if defined(AO_HAVE_double_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_fetch_compare_and_swap_full) # define AO_double_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_double_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_double_fetch_compare_and_swap_write) # define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_double_fetch_compare_and_swap_release) # define AO_double_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_fetch_compare_and_swap_read) # define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_fetch_compare_and_swap_acquire) # define AO_double_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_fetch_compare_and_swap_acquire_read) # define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_double_fetch_compare_and_swap) # define AO_double_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_double_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_double_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_compare_and_swap */ #if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_acquire) AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old, AO_double_t new_val) { int result = AO_double_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_double_compare_and_swap_acquire #endif #if defined(AO_HAVE_double_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_double_compare_and_swap(addr, old, new_val)) # define AO_HAVE_double_compare_and_swap_release #endif #if defined(AO_HAVE_double_compare_and_swap_full) # if !defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release # endif # if !defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap_acquire(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire # endif # if !defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap_write(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_write # endif # if !defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap_read(addr, old, new_val) \ AO_double_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_read # endif #endif /* AO_HAVE_double_compare_and_swap_full */ #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if !defined(AO_HAVE_double_compare_and_swap) \ && defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap(addr, old, new_val) \ AO_double_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap #endif #if defined(AO_HAVE_double_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_compare_and_swap_full) # define AO_double_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_double_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_double_compare_and_swap_full #endif #if !defined(AO_HAVE_double_compare_and_swap_release_write) \ && defined(AO_HAVE_double_compare_and_swap_write) # define AO_double_compare_and_swap_release_write(addr, old, new_val) \ AO_double_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_compare_and_swap_release_write) \ && defined(AO_HAVE_double_compare_and_swap_release) # define AO_double_compare_and_swap_release_write(addr, old, new_val) \ AO_double_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_release_write #endif #if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_compare_and_swap_read) # define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_double_compare_and_swap_acquire_read) \ && defined(AO_HAVE_double_compare_and_swap_acquire) # define AO_double_compare_and_swap_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_compare_and_swap_acquire_read) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_double_compare_and_swap) # define AO_double_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_double_compare_and_swap(addr, old, new_val) # define AO_HAVE_double_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_load */ #if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_acquire) # define AO_double_load_acquire(addr) AO_double_load_full(addr) # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_load_acquire) && !defined(AO_HAVE_double_load) # define AO_double_load(addr) AO_double_load_acquire(addr) # define AO_HAVE_double_load #endif #if defined(AO_HAVE_double_load_full) && !defined(AO_HAVE_double_load_read) # define AO_double_load_read(addr) AO_double_load_full(addr) # define AO_HAVE_double_load_read #endif #if !defined(AO_HAVE_double_load_acquire_read) \ && defined(AO_HAVE_double_load_acquire) # define AO_double_load_acquire_read(addr) AO_double_load_acquire(addr) # define AO_HAVE_double_load_acquire_read #endif #if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_load_acquire) AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result = AO_double_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_double_load_read) AO_INLINE AO_double_t AO_double_load_read(const volatile AO_double_t *addr) { AO_double_t result = AO_double_load(addr); AO_nop_read(); return result; } # define AO_HAVE_double_load_read #endif #if defined(AO_HAVE_double_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_load_full) # define AO_double_load_full(addr) (AO_nop_full(), AO_double_load_acquire(addr)) # define AO_HAVE_double_load_full #endif #if defined(AO_HAVE_double_compare_and_swap_read) \ && !defined(AO_HAVE_double_load_read) # define AO_double_CAS_BASED_LOAD_READ AO_INLINE AO_double_t AO_double_load_read(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_read( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_read #endif #if !defined(AO_HAVE_double_load_acquire_read) \ && defined(AO_HAVE_double_load_read) # define AO_double_load_acquire_read(addr) AO_double_load_read(addr) # define AO_HAVE_double_load_acquire_read #endif #if defined(AO_HAVE_double_load_acquire_read) && !defined(AO_HAVE_double_load) \ && (!defined(AO_double_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_double_compare_and_swap)) # define AO_double_load(addr) AO_double_load_acquire_read(addr) # define AO_HAVE_double_load #endif #if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_double_load_full) AO_INLINE AO_double_t AO_double_load_full(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_full #endif #if defined(AO_HAVE_double_compare_and_swap_acquire) \ && !defined(AO_HAVE_double_load_acquire) AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_acquire( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load_acquire #endif #if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_load) AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; do { result = *(const AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap( (volatile AO_double_t *)addr, result, result))); return result; } # define AO_HAVE_double_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_double_load_acquire_read) # define AO_double_load_dd_acquire_read(addr) \ AO_double_load_acquire_read(addr) # define AO_HAVE_double_load_dd_acquire_read # endif #else # if defined(AO_HAVE_double_load) # define AO_double_load_dd_acquire_read(addr) AO_double_load(addr) # define AO_HAVE_double_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* double_store */ #if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_release) # define AO_double_store_release(addr, val) AO_double_store_full(addr, val) # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_store_release) && !defined(AO_HAVE_double_store) # define AO_double_store(addr, val) AO_double_store_release(addr, val) # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_store_full) && !defined(AO_HAVE_double_store_write) # define AO_double_store_write(addr, val) AO_double_store_full(addr, val) # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_store_release) \ && !defined(AO_HAVE_double_store_release_write) # define AO_double_store_release_write(addr, val) \ AO_double_store_release(addr, val) # define AO_HAVE_double_store_release_write #endif #if defined(AO_HAVE_double_store_write) && !defined(AO_HAVE_double_store) # define AO_double_store(addr, val) AO_double_store_write(addr, val) # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_store_release) # define AO_double_store_release(addr, val) \ (AO_nop_full(), AO_double_store(addr, val)) # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_double_store_write) # define AO_double_store_write(addr, val) \ (AO_nop_write(), AO_double_store(addr, val)) # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_compare_and_swap_write) \ && !defined(AO_HAVE_double_store_write) AO_INLINE void AO_double_store_write(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_double_store_write #endif #if defined(AO_HAVE_double_store_write) \ && !defined(AO_HAVE_double_store_release_write) # define AO_double_store_release_write(addr, val) \ AO_double_store_write(addr, val) # define AO_HAVE_double_store_release_write #endif #if defined(AO_HAVE_double_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_double_store_full) # define AO_double_store_full(addr, val) \ (AO_double_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_double_store_full #endif #if defined(AO_HAVE_double_compare_and_swap) && !defined(AO_HAVE_double_store) AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_double_store #endif #if defined(AO_HAVE_double_compare_and_swap_release) \ && !defined(AO_HAVE_double_store_release) AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_double_store_release #endif #if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_double_store_full) AO_INLINE void AO_double_store_full(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; do { old_val = *(AO_double_t *)addr; } while (AO_EXPECT_FALSE(!AO_double_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_double_store_full #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/generalize-small.template0000755000175000017500000005025112456307241026372 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* XSIZE_fetch_compare_and_swap */ #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { XCTYPE result = AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ (AO_nop_full(), \ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val)) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_write # endif # if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_read # endif #endif /* AO_HAVE_XSIZE_fetch_compare_and_swap_full */ #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) \ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_full) # define AO_XSIZE_fetch_compare_and_swap_full(addr, old_val, new_val) \ (AO_nop_full(), \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val)) # define AO_HAVE_XSIZE_fetch_compare_and_swap_full #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_write) # define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_write(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_release) # define AO_XSIZE_fetch_compare_and_swap_release_write(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_release(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_read) # define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire) # define AO_XSIZE_fetch_compare_and_swap_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_fetch_compare_and_swap_acquire_read) # define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap_acquire_read(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_fetch_compare_and_swap) # define AO_XSIZE_fetch_compare_and_swap_dd_acquire_read(addr,old_val,new_val) \ AO_XSIZE_fetch_compare_and_swap(addr, old_val, new_val) # define AO_HAVE_XSIZE_fetch_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_compare_and_swap */ #if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) AO_INLINE int AO_XSIZE_compare_and_swap_acquire(volatile XCTYPE *addr, XCTYPE old, XCTYPE new_val) { int result = AO_XSIZE_compare_and_swap(addr, old, new_val); AO_nop_full(); return result; } # define AO_HAVE_XSIZE_compare_and_swap_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ (AO_nop_full(), AO_XSIZE_compare_and_swap(addr, old, new_val)) # define AO_HAVE_XSIZE_compare_and_swap_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) # if !defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_write # endif # if !defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_full(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_read # endif #endif /* AO_HAVE_XSIZE_compare_and_swap_full */ #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap) \ && defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap(addr, old, new_val) \ AO_XSIZE_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_compare_and_swap_full) # define AO_XSIZE_compare_and_swap_full(addr, old, new_val) \ (AO_nop_full(), \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val)) # define AO_HAVE_XSIZE_compare_and_swap_full #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_compare_and_swap_write) # define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_write(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_release_write) \ && defined(AO_HAVE_XSIZE_compare_and_swap_release) # define AO_XSIZE_compare_and_swap_release_write(addr, old, new_val) \ AO_XSIZE_compare_and_swap_release(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_release_write #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_compare_and_swap_read) # define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #if !defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) \ && defined(AO_HAVE_XSIZE_compare_and_swap_acquire) # define AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_compare_and_swap_acquire_read) # define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap_acquire_read(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_compare_and_swap) # define AO_XSIZE_compare_and_swap_dd_acquire_read(addr, old, new_val) \ AO_XSIZE_compare_and_swap(addr, old, new_val) # define AO_HAVE_XSIZE_compare_and_swap_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_load */ #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_acquire) # define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_full(addr) # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_load_acquire) && !defined(AO_HAVE_XSIZE_load) # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire(addr) # define AO_HAVE_XSIZE_load #endif #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_load_read(addr) AO_XSIZE_load_full(addr) # define AO_HAVE_XSIZE_load_read #endif #if !defined(AO_HAVE_XSIZE_load_acquire_read) \ && defined(AO_HAVE_XSIZE_load_acquire) # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_acquire(addr) # define AO_HAVE_XSIZE_load_acquire_read #endif #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_load_acquire) AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result = AO_XSIZE_load(addr); /* Acquire barrier would be useless, since the load could be delayed */ /* beyond it. */ AO_nop_full(); return result; } # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_read) \ && !defined(AO_HAVE_XSIZE_load_read) AO_INLINE XCTYPE AO_XSIZE_load_read(const volatile XCTYPE *addr) { XCTYPE result = AO_XSIZE_load(addr); AO_nop_read(); return result; } # define AO_HAVE_XSIZE_load_read #endif #if defined(AO_HAVE_XSIZE_load_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_load_full) # define AO_XSIZE_load_full(addr) (AO_nop_full(), AO_XSIZE_load_acquire(addr)) # define AO_HAVE_XSIZE_load_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_read) \ && !defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_CAS_BASED_LOAD_READ AO_INLINE XCTYPE AO_XSIZE_load_read(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_read( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_read #endif #if !defined(AO_HAVE_XSIZE_load_acquire_read) \ && defined(AO_HAVE_XSIZE_load_read) # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_read(addr) # define AO_HAVE_XSIZE_load_acquire_read #endif #if defined(AO_HAVE_XSIZE_load_acquire_read) && !defined(AO_HAVE_XSIZE_load) \ && (!defined(AO_XSIZE_CAS_BASED_LOAD_READ) \ || !defined(AO_HAVE_XSIZE_compare_and_swap)) # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire_read(addr) # define AO_HAVE_XSIZE_load #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_load_full) AO_INLINE XCTYPE AO_XSIZE_load_full(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \ && !defined(AO_HAVE_XSIZE_load_acquire) AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_acquire( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load_acquire #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_load) AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { XCTYPE result; do { result = *(const XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap( (volatile XCTYPE *)addr, result, result))); return result; } # define AO_HAVE_XSIZE_load #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_XSIZE_load_acquire_read) # define AO_XSIZE_load_dd_acquire_read(addr) \ AO_XSIZE_load_acquire_read(addr) # define AO_HAVE_XSIZE_load_dd_acquire_read # endif #else # if defined(AO_HAVE_XSIZE_load) # define AO_XSIZE_load_dd_acquire_read(addr) AO_XSIZE_load(addr) # define AO_HAVE_XSIZE_load_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* XSIZE_store */ #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_release) # define AO_XSIZE_store_release(addr, val) AO_XSIZE_store_full(addr, val) # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_store_release) && !defined(AO_HAVE_XSIZE_store) # define AO_XSIZE_store(addr, val) AO_XSIZE_store_release(addr, val) # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_write) # define AO_XSIZE_store_write(addr, val) AO_XSIZE_store_full(addr, val) # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_store_release) \ && !defined(AO_HAVE_XSIZE_store_release_write) # define AO_XSIZE_store_release_write(addr, val) \ AO_XSIZE_store_release(addr, val) # define AO_HAVE_XSIZE_store_release_write #endif #if defined(AO_HAVE_XSIZE_store_write) && !defined(AO_HAVE_XSIZE_store) # define AO_XSIZE_store(addr, val) AO_XSIZE_store_write(addr, val) # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_store_release) # define AO_XSIZE_store_release(addr, val) \ (AO_nop_full(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_write) \ && !defined(AO_HAVE_XSIZE_store_write) # define AO_XSIZE_store_write(addr, val) \ (AO_nop_write(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_write) \ && !defined(AO_HAVE_XSIZE_store_write) AO_INLINE void AO_XSIZE_store_write(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_write(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_write #endif #if defined(AO_HAVE_XSIZE_store_write) \ && !defined(AO_HAVE_XSIZE_store_release_write) # define AO_XSIZE_store_release_write(addr, val) \ AO_XSIZE_store_write(addr, val) # define AO_HAVE_XSIZE_store_release_write #endif #if defined(AO_HAVE_XSIZE_store_release) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_XSIZE_store_full) # define AO_XSIZE_store_full(addr, val) \ (AO_XSIZE_store_release(addr, val), \ AO_nop_full()) # define AO_HAVE_XSIZE_store_full #endif #if defined(AO_HAVE_XSIZE_compare_and_swap) && !defined(AO_HAVE_XSIZE_store) AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_release) \ && !defined(AO_HAVE_XSIZE_store_release) AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_release(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_release #endif #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \ && !defined(AO_HAVE_XSIZE_store_full) AO_INLINE void AO_XSIZE_store_full(volatile XCTYPE *addr, XCTYPE new_val) { XCTYPE old_val; do { old_val = *(XCTYPE *)addr; } while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap_full(addr, old_val, new_val))); } # define AO_HAVE_XSIZE_store_full #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/generalize.h0000755000175000017500000006653412456307241023713 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* * Generalize atomic operations for atomic_ops.h. * Should not be included directly. * * We make no attempt to define useless operations, such as * AO_nop_acquire * AO_nop_release * * We have also so far neglected to define some others, which * do not appear likely to be useful, e.g. stores with acquire * or read barriers. * * This file is sometimes included twice by atomic_ops.h. * All definitions include explicit checks that we are not replacing * an earlier definition. In general, more desirable expansions * appear earlier so that we are more likely to use them. * * We only make safe generalizations, except that by default we define * the ...dd_acquire_read operations to be equivalent to those without * a barrier. On platforms for which this is unsafe, the platform-specific * file must define AO_NO_DD_ORDERING. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif /* Generate test_and_set_full, if necessary and possible. */ #if !defined(AO_HAVE_test_and_set) && !defined(AO_HAVE_test_and_set_release) \ && !defined(AO_HAVE_test_and_set_acquire) \ && !defined(AO_HAVE_test_and_set_read) \ && !defined(AO_HAVE_test_and_set_full) /* Emulate AO_compare_and_swap() via AO_fetch_compare_and_swap(). */ # if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_compare_and_swap) AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap # endif # if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_compare_and_swap_full) AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_full(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_full # endif # if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_compare_and_swap_acquire) AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_acquire(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_acquire # endif # if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_compare_and_swap_release) AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return AO_fetch_compare_and_swap_release(addr, old_val, new_val) == old_val; } # define AO_HAVE_compare_and_swap_release # endif # if AO_CHAR_TS_T # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) \ AO_char_compare_and_swap_full(a,o,n) # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \ AO_char_compare_and_swap_acquire(a,o,n) # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \ AO_char_compare_and_swap_release(a,o,n) # define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_char_compare_and_swap(a,o,n) # endif # if AO_AO_TS_T # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) AO_compare_and_swap_full(a,o,n) # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \ AO_compare_and_swap_acquire(a,o,n) # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \ AO_compare_and_swap_release(a,o,n) # define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_compare_and_swap(a,o,n) # endif # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_full)) \ || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_full)) AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_FULL(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_full # endif /* AO_HAVE_compare_and_swap_full */ # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_acquire)) \ || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_acquire)) AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_ACQUIRE(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_acquire # endif /* AO_HAVE_compare_and_swap_acquire */ # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_release)) \ || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_release)) AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP_RELEASE(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set_release # endif /* AO_HAVE_compare_and_swap_release */ # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap)) \ || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap)) AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { if (AO_TS_COMPARE_AND_SWAP(addr, AO_TS_CLEAR, AO_TS_SET)) return AO_TS_CLEAR; else return AO_TS_SET; } # define AO_HAVE_test_and_set # endif /* AO_HAVE_compare_and_swap */ #endif /* No prior test and set */ /* Nop */ #if !defined(AO_HAVE_nop) AO_INLINE void AO_nop(void) {} # define AO_HAVE_nop #endif #if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full) AO_INLINE void AO_nop_full(void) { AO_TS_t dummy = AO_TS_INITIALIZER; AO_test_and_set_full(&dummy); } # define AO_HAVE_nop_full #endif #if defined(AO_HAVE_nop_acquire) # error AO_nop_acquire is useless: dont define. #endif #if defined(AO_HAVE_nop_release) # error AO_nop_release is useless: dont define. #endif #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_read) # define AO_nop_read() AO_nop_full() # define AO_HAVE_nop_read #endif #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_write) # define AO_nop_write() AO_nop_full() # define AO_HAVE_nop_write #endif /* Test_and_set */ #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release(addr) (AO_nop_full(), AO_test_and_set(addr)) # define AO_HAVE_test_and_set_release #endif #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_acquire) AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_nop_full(); return result; } # define AO_HAVE_test_and_set_acquire #endif #if defined(AO_HAVE_test_and_set_full) # if !defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_release # endif # if !defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set_acquire(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_acquire # endif # if !defined(AO_HAVE_test_and_set_write) # define AO_test_and_set_write(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_write # endif # if !defined(AO_HAVE_test_and_set_read) # define AO_test_and_set_read(addr) AO_test_and_set_full(addr) # define AO_HAVE_test_and_set_read # endif #endif /* AO_HAVE_test_and_set_full */ #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_release) # define AO_test_and_set(addr) AO_test_and_set_release(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set(addr) AO_test_and_set_acquire(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_write) # define AO_test_and_set(addr) AO_test_and_set_write(addr) # define AO_HAVE_test_and_set #endif #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_read) # define AO_test_and_set(addr) AO_test_and_set_read(addr) # define AO_HAVE_test_and_set #endif #if defined(AO_HAVE_test_and_set_acquire) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_test_and_set_full) # define AO_test_and_set_full(addr) \ (AO_nop_full(), AO_test_and_set_acquire(addr)) # define AO_HAVE_test_and_set_full #endif #if !defined(AO_HAVE_test_and_set_release_write) \ && defined(AO_HAVE_test_and_set_write) # define AO_test_and_set_release_write(addr) AO_test_and_set_write(addr) # define AO_HAVE_test_and_set_release_write #endif #if !defined(AO_HAVE_test_and_set_release_write) \ && defined(AO_HAVE_test_and_set_release) # define AO_test_and_set_release_write(addr) AO_test_and_set_release(addr) # define AO_HAVE_test_and_set_release_write #endif #if !defined(AO_HAVE_test_and_set_acquire_read) \ && defined(AO_HAVE_test_and_set_read) # define AO_test_and_set_acquire_read(addr) AO_test_and_set_read(addr) # define AO_HAVE_test_and_set_acquire_read #endif #if !defined(AO_HAVE_test_and_set_acquire_read) \ && defined(AO_HAVE_test_and_set_acquire) # define AO_test_and_set_acquire_read(addr) AO_test_and_set_acquire(addr) # define AO_HAVE_test_and_set_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_test_and_set_acquire_read) # define AO_test_and_set_dd_acquire_read(addr) \ AO_test_and_set_acquire_read(addr) # define AO_HAVE_test_and_set_dd_acquire_read # endif #else # if defined(AO_HAVE_test_and_set) # define AO_test_and_set_dd_acquire_read(addr) AO_test_and_set(addr) # define AO_HAVE_test_and_set_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ #include "generalize-small.h" #include "generalize-arithm.h" /* Compare_double_and_swap_double based on double_compare_and_swap. */ #ifdef AO_HAVE_DOUBLE_PTR_STORAGE # if defined(AO_HAVE_double_compare_and_swap) \ && !defined(AO_HAVE_compare_double_and_swap_double) AO_INLINE int AO_compare_double_and_swap_double(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double # endif # if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_full) AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { AO_double_t old_w; AO_double_t new_w; old_w.AO_val1 = old_val1; old_w.AO_val2 = old_val2; new_w.AO_val1 = new_val1; new_w.AO_val2 = new_val2; return AO_double_compare_and_swap_full(addr, old_w, new_w); } # define AO_HAVE_compare_double_and_swap_double_full # endif #endif /* AO_HAVE_DOUBLE_PTR_STORAGE */ /* Compare_double_and_swap_double */ #if defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_acquire) AO_INLINE int AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr, AO_t o1, AO_t o2, AO_t n1, AO_t n2) { int result = AO_compare_double_and_swap_double(addr, o1, o2, n1, n2); AO_nop_full(); return result; } # define AO_HAVE_compare_double_and_swap_double_acquire #endif #if defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \ (AO_nop_full(), AO_compare_double_and_swap_double(addr,o1,o2,n1,n2)) # define AO_HAVE_compare_double_and_swap_double_release #endif #if defined(AO_HAVE_compare_double_and_swap_double_full) # if !defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release # endif # if !defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire # endif # if !defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_write # endif # if !defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_read # endif #endif /* AO_HAVE_compare_double_and_swap_double_full */ #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if !defined(AO_HAVE_compare_double_and_swap_double) \ && defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_full) # define AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) \ (AO_nop_full(), \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)) # define AO_HAVE_compare_double_and_swap_double_full #endif #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && defined(AO_HAVE_compare_double_and_swap_double_write) # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && defined(AO_HAVE_compare_double_and_swap_double_release) # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_double_and_swap_double_read) # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire_read #endif #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_double_and_swap_double_acquire) # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_double_and_swap_double) # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \ AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read # endif #endif /* !AO_NO_DD_ORDERING */ /* Compare_and_swap_double */ #if defined(AO_HAVE_compare_and_swap_double) && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_acquire) AO_INLINE int AO_compare_and_swap_double_acquire(volatile AO_double_t *addr, AO_t o1, AO_t n1, AO_t n2) { int result = AO_compare_and_swap_double(addr, o1, n1, n2); AO_nop_full(); return result; } # define AO_HAVE_compare_and_swap_double_acquire #endif #if defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \ (AO_nop_full(), AO_compare_and_swap_double(addr,o1,n1,n2)) # define AO_HAVE_compare_and_swap_double_release #endif #if defined(AO_HAVE_compare_and_swap_double_full) # if !defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release # endif # if !defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double_acquire(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire # endif # if !defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_write # endif # if !defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_full(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_read # endif #endif /* AO_HAVE_compare_and_swap_double_full */ #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_release(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_write(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if !defined(AO_HAVE_compare_and_swap_double) \ && defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double(addr,o1,n1,n2) \ AO_compare_and_swap_double_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double #endif #if defined(AO_HAVE_compare_and_swap_double_acquire) \ && defined(AO_HAVE_nop_full) \ && !defined(AO_HAVE_compare_and_swap_double_full) # define AO_compare_and_swap_double_full(addr,o1,n1,n2) \ (AO_nop_full(), AO_compare_and_swap_double_acquire(addr,o1,n1,n2)) # define AO_HAVE_compare_and_swap_double_full #endif #if !defined(AO_HAVE_compare_and_swap_double_release_write) \ && defined(AO_HAVE_compare_and_swap_double_write) # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_write(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_and_swap_double_release_write) \ && defined(AO_HAVE_compare_and_swap_double_release) # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \ AO_compare_and_swap_double_release(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_release_write #endif #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_and_swap_double_read) # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire_read #endif #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \ && defined(AO_HAVE_compare_and_swap_double_acquire) # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_acquire_read #endif #ifdef AO_NO_DD_ORDERING # if defined(AO_HAVE_compare_and_swap_double_acquire_read) # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_dd_acquire_read # endif #else # if defined(AO_HAVE_compare_and_swap_double) # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \ AO_compare_and_swap_double(addr,o1,n1,n2) # define AO_HAVE_compare_and_swap_double_dd_acquire_read # endif #endif /* Convenience functions for AO_double compare-and-swap which types and */ /* reads easier in code. */ #if defined(AO_HAVE_compare_double_and_swap_double) \ && !defined(AO_HAVE_double_compare_and_swap) AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap #endif #if defined(AO_HAVE_compare_double_and_swap_double_release) \ && !defined(AO_HAVE_double_compare_and_swap_release) AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_release(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_release #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \ && !defined(AO_HAVE_double_compare_and_swap_acquire) AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_acquire(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_double_and_swap_double_read) \ && !defined(AO_HAVE_double_compare_and_swap_read) AO_INLINE int AO_double_compare_and_swap_read(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_read(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_read #endif #if defined(AO_HAVE_compare_double_and_swap_double_write) \ && !defined(AO_HAVE_double_compare_and_swap_write) AO_INLINE int AO_double_compare_and_swap_write(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_write(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_write #endif #if defined(AO_HAVE_compare_double_and_swap_double_release_write) \ && !defined(AO_HAVE_double_compare_and_swap_release_write) AO_INLINE int AO_double_compare_and_swap_release_write(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_release_write(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_release_write #endif #if defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \ && !defined(AO_HAVE_double_compare_and_swap_acquire_read) AO_INLINE int AO_double_compare_and_swap_acquire_read(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_acquire_read(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_acquire_read #endif #if defined(AO_HAVE_compare_double_and_swap_double_full) \ && !defined(AO_HAVE_double_compare_and_swap_full) AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return AO_compare_double_and_swap_double_full(addr, old_val.AO_val1, old_val.AO_val2, new_val.AO_val1, new_val.AO_val2); } # define AO_HAVE_double_compare_and_swap_full #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/README0000755000175000017500000000054112456307241023751 0ustar jnthnjnthnThere are two kinds of entities in this directory: - Subdirectories corresponding to specific compilers (or compiler/OS combinations). Each of these includes one or more architecture-specific headers. - More generic header files corresponding to a particular ordering and/or atomicity property that might be shared by multiple hardware platforms. MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h0000755000175000017500000000305412456307241031124 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Describes architectures on which volatile AO_t, unsigned char, */ /* unsigned short, and unsigned int loads and stores have */ /* acquire/release semantics for all normally legal alignments. */ #include "loadstore/acquire_release_volatile.h" #include "loadstore/char_acquire_release_volatile.h" #include "loadstore/short_acquire_release_volatile.h" #include "loadstore/int_acquire_release_volatile.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h0000755000175000017500000000302512456307241031244 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads and stores are atomic but only if data */ /* is suitably aligned. */ #define AO_ACCESS_CHECK_ALIGNED /* Check for char type is a misnomer. */ #define AO_ACCESS_short_CHECK_ALIGNED #define AO_ACCESS_int_CHECK_ALIGNED #include "all_atomic_load_store.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h0000755000175000017500000000303712456307241027564 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads and stores are atomic for all normally */ /* legal alignments. */ #include "all_atomic_only_load.h" #include "loadstore/atomic_store.h" #include "loadstore/char_atomic_store.h" #include "loadstore/short_atomic_store.h" #include "loadstore/int_atomic_store.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h0000755000175000017500000000277012456307241027414 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Describes architectures on which AO_t, unsigned char, unsigned */ /* short, and unsigned int loads are atomic for all normally legal */ /* alignments. */ #include "loadstore/atomic_load.h" #include "loadstore/char_atomic_load.h" #include "loadstore/short_atomic_load.h" #include "loadstore/int_atomic_load.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h0000755000175000017500000005604012456307241025536 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load) && !defined(AO_HAVE_int_load) # define AO_int_load(addr) \ (unsigned)AO_load((const volatile AO_t *)(addr)) # define AO_HAVE_int_load #endif #if defined(AO_HAVE_store) && !defined(AO_HAVE_int_store) # define AO_int_store(addr, val) \ AO_store((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store #endif #if defined(AO_HAVE_fetch_and_add) \ && !defined(AO_HAVE_int_fetch_and_add) # define AO_int_fetch_and_add(addr, incr) \ (unsigned)AO_fetch_and_add((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add #endif #if defined(AO_HAVE_fetch_and_add1) \ && !defined(AO_HAVE_int_fetch_and_add1) # define AO_int_fetch_and_add1(addr) \ (unsigned)AO_fetch_and_add1((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1 #endif #if defined(AO_HAVE_fetch_and_sub1) \ && !defined(AO_HAVE_int_fetch_and_sub1) # define AO_int_fetch_and_sub1(addr) \ (unsigned)AO_fetch_and_sub1((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1 #endif #if defined(AO_HAVE_and) && !defined(AO_HAVE_int_and) # define AO_int_and(addr, val) \ AO_and((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and #endif #if defined(AO_HAVE_or) && !defined(AO_HAVE_int_or) # define AO_int_or(addr, val) \ AO_or((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or #endif #if defined(AO_HAVE_xor) && !defined(AO_HAVE_int_xor) # define AO_int_xor(addr, val) \ AO_xor((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor #endif #if defined(AO_HAVE_fetch_compare_and_swap) \ && !defined(AO_HAVE_int_fetch_compare_and_swap) # define AO_int_fetch_compare_and_swap(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap #endif #if defined(AO_HAVE_compare_and_swap) \ && !defined(AO_HAVE_int_compare_and_swap) # define AO_int_compare_and_swap(addr, old, new_val) \ AO_compare_and_swap((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_int_load_full) # define AO_int_load_full(addr) \ (unsigned)AO_load_full((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_full #endif #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_int_store_full) # define AO_int_store_full(addr, val) \ AO_store_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_full #endif #if defined(AO_HAVE_fetch_and_add_full) \ && !defined(AO_HAVE_int_fetch_and_add_full) # define AO_int_fetch_and_add_full(addr, incr) \ (unsigned)AO_fetch_and_add_full((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_full #endif #if defined(AO_HAVE_fetch_and_add1_full) \ && !defined(AO_HAVE_int_fetch_and_add1_full) # define AO_int_fetch_and_add1_full(addr) \ (unsigned)AO_fetch_and_add1_full((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_full #endif #if defined(AO_HAVE_fetch_and_sub1_full) \ && !defined(AO_HAVE_int_fetch_and_sub1_full) # define AO_int_fetch_and_sub1_full(addr) \ (unsigned)AO_fetch_and_sub1_full((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_full #endif #if defined(AO_HAVE_and_full) && !defined(AO_HAVE_int_and_full) # define AO_int_and_full(addr, val) \ AO_and_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_full #endif #if defined(AO_HAVE_or_full) && !defined(AO_HAVE_int_or_full) # define AO_int_or_full(addr, val) \ AO_or_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_full #endif #if defined(AO_HAVE_xor_full) && !defined(AO_HAVE_int_xor_full) # define AO_int_xor_full(addr, val) \ AO_xor_full((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_full #endif #if defined(AO_HAVE_fetch_compare_and_swap_full) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_full) # define AO_int_fetch_compare_and_swap_full(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_full((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_full #endif #if defined(AO_HAVE_compare_and_swap_full) \ && !defined(AO_HAVE_int_compare_and_swap_full) # define AO_int_compare_and_swap_full(addr, old, new_val) \ AO_compare_and_swap_full((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_full #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_int_load_acquire) # define AO_int_load_acquire(addr) \ (unsigned)AO_load_acquire((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_acquire #endif #if defined(AO_HAVE_store_acquire) && !defined(AO_HAVE_int_store_acquire) # define AO_int_store_acquire(addr, val) \ AO_store_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_acquire #endif #if defined(AO_HAVE_fetch_and_add_acquire) \ && !defined(AO_HAVE_int_fetch_and_add_acquire) # define AO_int_fetch_and_add_acquire(addr, incr) \ (unsigned)AO_fetch_and_add_acquire((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_acquire #endif #if defined(AO_HAVE_fetch_and_add1_acquire) \ && !defined(AO_HAVE_int_fetch_and_add1_acquire) # define AO_int_fetch_and_add1_acquire(addr) \ (unsigned)AO_fetch_and_add1_acquire((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_acquire #endif #if defined(AO_HAVE_fetch_and_sub1_acquire) \ && !defined(AO_HAVE_int_fetch_and_sub1_acquire) # define AO_int_fetch_and_sub1_acquire(addr) \ (unsigned)AO_fetch_and_sub1_acquire((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_acquire #endif #if defined(AO_HAVE_and_acquire) && !defined(AO_HAVE_int_and_acquire) # define AO_int_and_acquire(addr, val) \ AO_and_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_acquire #endif #if defined(AO_HAVE_or_acquire) && !defined(AO_HAVE_int_or_acquire) # define AO_int_or_acquire(addr, val) \ AO_or_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_acquire #endif #if defined(AO_HAVE_xor_acquire) && !defined(AO_HAVE_int_xor_acquire) # define AO_int_xor_acquire(addr, val) \ AO_xor_acquire((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_acquire #endif #if defined(AO_HAVE_fetch_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_acquire) # define AO_int_fetch_compare_and_swap_acquire(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_acquire((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_acquire #endif #if defined(AO_HAVE_compare_and_swap_acquire) \ && !defined(AO_HAVE_int_compare_and_swap_acquire) # define AO_int_compare_and_swap_acquire(addr, old, new_val) \ AO_compare_and_swap_acquire((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_acquire #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_release) && !defined(AO_HAVE_int_load_release) # define AO_int_load_release(addr) \ (unsigned)AO_load_release((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_release #endif #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_int_store_release) # define AO_int_store_release(addr, val) \ AO_store_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_release #endif #if defined(AO_HAVE_fetch_and_add_release) \ && !defined(AO_HAVE_int_fetch_and_add_release) # define AO_int_fetch_and_add_release(addr, incr) \ (unsigned)AO_fetch_and_add_release((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_release #endif #if defined(AO_HAVE_fetch_and_add1_release) \ && !defined(AO_HAVE_int_fetch_and_add1_release) # define AO_int_fetch_and_add1_release(addr) \ (unsigned)AO_fetch_and_add1_release((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_release #endif #if defined(AO_HAVE_fetch_and_sub1_release) \ && !defined(AO_HAVE_int_fetch_and_sub1_release) # define AO_int_fetch_and_sub1_release(addr) \ (unsigned)AO_fetch_and_sub1_release((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_release #endif #if defined(AO_HAVE_and_release) && !defined(AO_HAVE_int_and_release) # define AO_int_and_release(addr, val) \ AO_and_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_release #endif #if defined(AO_HAVE_or_release) && !defined(AO_HAVE_int_or_release) # define AO_int_or_release(addr, val) \ AO_or_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_release #endif #if defined(AO_HAVE_xor_release) && !defined(AO_HAVE_int_xor_release) # define AO_int_xor_release(addr, val) \ AO_xor_release((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_release #endif #if defined(AO_HAVE_fetch_compare_and_swap_release) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_release) # define AO_int_fetch_compare_and_swap_release(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_release((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_release #endif #if defined(AO_HAVE_compare_and_swap_release) \ && !defined(AO_HAVE_int_compare_and_swap_release) # define AO_int_compare_and_swap_release(addr, old, new_val) \ AO_compare_and_swap_release((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_release #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_write) && !defined(AO_HAVE_int_load_write) # define AO_int_load_write(addr) \ (unsigned)AO_load_write((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_write #endif #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_int_store_write) # define AO_int_store_write(addr, val) \ AO_store_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_write #endif #if defined(AO_HAVE_fetch_and_add_write) \ && !defined(AO_HAVE_int_fetch_and_add_write) # define AO_int_fetch_and_add_write(addr, incr) \ (unsigned)AO_fetch_and_add_write((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_write #endif #if defined(AO_HAVE_fetch_and_add1_write) \ && !defined(AO_HAVE_int_fetch_and_add1_write) # define AO_int_fetch_and_add1_write(addr) \ (unsigned)AO_fetch_and_add1_write((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_write #endif #if defined(AO_HAVE_fetch_and_sub1_write) \ && !defined(AO_HAVE_int_fetch_and_sub1_write) # define AO_int_fetch_and_sub1_write(addr) \ (unsigned)AO_fetch_and_sub1_write((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_write #endif #if defined(AO_HAVE_and_write) && !defined(AO_HAVE_int_and_write) # define AO_int_and_write(addr, val) \ AO_and_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_write #endif #if defined(AO_HAVE_or_write) && !defined(AO_HAVE_int_or_write) # define AO_int_or_write(addr, val) \ AO_or_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_write #endif #if defined(AO_HAVE_xor_write) && !defined(AO_HAVE_int_xor_write) # define AO_int_xor_write(addr, val) \ AO_xor_write((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_write #endif #if defined(AO_HAVE_fetch_compare_and_swap_write) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_write) # define AO_int_fetch_compare_and_swap_write(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_write((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_write #endif #if defined(AO_HAVE_compare_and_swap_write) \ && !defined(AO_HAVE_int_compare_and_swap_write) # define AO_int_compare_and_swap_write(addr, old, new_val) \ AO_compare_and_swap_write((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_write #endif /* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_read) && !defined(AO_HAVE_int_load_read) # define AO_int_load_read(addr) \ (unsigned)AO_load_read((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_read #endif #if defined(AO_HAVE_store_read) && !defined(AO_HAVE_int_store_read) # define AO_int_store_read(addr, val) \ AO_store_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_read #endif #if defined(AO_HAVE_fetch_and_add_read) \ && !defined(AO_HAVE_int_fetch_and_add_read) # define AO_int_fetch_and_add_read(addr, incr) \ (unsigned)AO_fetch_and_add_read((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_read #endif #if defined(AO_HAVE_fetch_and_add1_read) \ && !defined(AO_HAVE_int_fetch_and_add1_read) # define AO_int_fetch_and_add1_read(addr) \ (unsigned)AO_fetch_and_add1_read((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_read #endif #if defined(AO_HAVE_fetch_and_sub1_read) \ && !defined(AO_HAVE_int_fetch_and_sub1_read) # define AO_int_fetch_and_sub1_read(addr) \ (unsigned)AO_fetch_and_sub1_read((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_read #endif #if defined(AO_HAVE_and_read) && !defined(AO_HAVE_int_and_read) # define AO_int_and_read(addr, val) \ AO_and_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_read #endif #if defined(AO_HAVE_or_read) && !defined(AO_HAVE_int_or_read) # define AO_int_or_read(addr, val) \ AO_or_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_read #endif #if defined(AO_HAVE_xor_read) && !defined(AO_HAVE_int_xor_read) # define AO_int_xor_read(addr, val) \ AO_xor_read((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_read #endif #if defined(AO_HAVE_fetch_compare_and_swap_read) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_read) # define AO_int_fetch_compare_and_swap_read(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_read((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_read #endif #if defined(AO_HAVE_compare_and_swap_read) \ && !defined(AO_HAVE_int_compare_and_swap_read) # define AO_int_compare_and_swap_read(addr, old, new_val) \ AO_compare_and_swap_read((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_read #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template0000755000175000017500000000751212456307241027122 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* Inclusion of this file signifies that AO_t is in fact int. */ /* Hence any AO_... operation can also serve as AO_int_... operation. */ #if defined(AO_HAVE_load_XBAR) && !defined(AO_HAVE_int_load_XBAR) # define AO_int_load_XBAR(addr) \ (unsigned)AO_load_XBAR((const volatile AO_t *)(addr)) # define AO_HAVE_int_load_XBAR #endif #if defined(AO_HAVE_store_XBAR) && !defined(AO_HAVE_int_store_XBAR) # define AO_int_store_XBAR(addr, val) \ AO_store_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_store_XBAR #endif #if defined(AO_HAVE_fetch_and_add_XBAR) \ && !defined(AO_HAVE_int_fetch_and_add_XBAR) # define AO_int_fetch_and_add_XBAR(addr, incr) \ (unsigned)AO_fetch_and_add_XBAR((volatile AO_t *)(addr), \ (AO_t)(incr)) # define AO_HAVE_int_fetch_and_add_XBAR #endif #if defined(AO_HAVE_fetch_and_add1_XBAR) \ && !defined(AO_HAVE_int_fetch_and_add1_XBAR) # define AO_int_fetch_and_add1_XBAR(addr) \ (unsigned)AO_fetch_and_add1_XBAR((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_add1_XBAR #endif #if defined(AO_HAVE_fetch_and_sub1_XBAR) \ && !defined(AO_HAVE_int_fetch_and_sub1_XBAR) # define AO_int_fetch_and_sub1_XBAR(addr) \ (unsigned)AO_fetch_and_sub1_XBAR((volatile AO_t *)(addr)) # define AO_HAVE_int_fetch_and_sub1_XBAR #endif #if defined(AO_HAVE_and_XBAR) && !defined(AO_HAVE_int_and_XBAR) # define AO_int_and_XBAR(addr, val) \ AO_and_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_and_XBAR #endif #if defined(AO_HAVE_or_XBAR) && !defined(AO_HAVE_int_or_XBAR) # define AO_int_or_XBAR(addr, val) \ AO_or_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_or_XBAR #endif #if defined(AO_HAVE_xor_XBAR) && !defined(AO_HAVE_int_xor_XBAR) # define AO_int_xor_XBAR(addr, val) \ AO_xor_XBAR((volatile AO_t *)(addr), (AO_t)(val)) # define AO_HAVE_int_xor_XBAR #endif #if defined(AO_HAVE_fetch_compare_and_swap_XBAR) \ && !defined(AO_HAVE_int_fetch_compare_and_swap_XBAR) # define AO_int_fetch_compare_and_swap_XBAR(addr, old, new_val) \ (unsigned)AO_fetch_compare_and_swap_XBAR((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_fetch_compare_and_swap_XBAR #endif #if defined(AO_HAVE_compare_and_swap_XBAR) \ && !defined(AO_HAVE_int_compare_and_swap_XBAR) # define AO_int_compare_and_swap_XBAR(addr, old, new_val) \ AO_compare_and_swap_XBAR((volatile AO_t *)(addr), \ (AO_t)(old), (AO_t)(new_val)) # define AO_HAVE_int_compare_and_swap_XBAR #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h0000755000175000017500000001617512456307241025533 0ustar jnthnjnthn/* * Copyright (c) 2007 by NEC LE-IT: All rights reserved. * A transcription of ARMv6 atomic operations for the ARM Realview Toolchain. * This code works with armcc from RVDS 3.1 * This is based on work in gcc/arm.h by * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */ #if __TARGET_ARCH_ARM < 6 Dont use with ARM instruction sets lower than v6 #else #define AO_ACCESS_CHECK_ALIGNED #define AO_ACCESS_short_CHECK_ALIGNED #define AO_ACCESS_int_CHECK_ALIGNED #include "../all_atomic_only_load.h" #include "../standard_ao_double_t.h" /* NEC LE-IT: ARMv6 is the first architecture providing support for simple LL/SC * A data memory barrier must be raised via CP15 command (see documentation). * * ARMv7 is compatible to ARMv6 but has a simpler command for issuing a * memory barrier (DMB). Raising it via CP15 should still work as told me by the * support engineers. If it turns out to be much quicker than we should implement * custom code for ARMv7 using the asm { dmb } command. * * If only a single processor is used, we can define AO_UNIPROCESSOR * and do not need to access CP15 for ensuring a DMB at all. */ AO_INLINE void AO_nop_full(void) { # ifndef AO_UNIPROCESSOR unsigned int dest=0; /* issue an data memory barrier (keeps ordering of memory transactions */ /* before and after this operation) */ __asm { mcr p15,0,dest,c7,c10,5 }; # else AO_compiler_barrier(); # endif } #define AO_HAVE_nop_full /* NEC LE-IT: atomic "store" - according to ARM documentation this is * the only safe way to set variables also used in LL/SC environment. * A direct write won't be recognized by the LL/SC construct in other CPUs. * * HB: Based on subsequent discussion, I think it would be OK to use an * ordinary store here if we knew that interrupt handlers always cleared * the reservation. They should, but there is some doubt that this is * currently always the case for e.g. Linux. */ AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { unsigned long tmp; retry: __asm { ldrex tmp, [addr] strex tmp, value, [addr] teq tmp, #0 bne retry }; } #define AO_HAVE_store /* NEC LE-IT: replace the SWAP as recommended by ARM: "Applies to: ARM11 Cores Though the SWP instruction will still work with ARM V6 cores, it is recommended to use the new V6 synchronization instructions. The SWP instruction produces locked read and write accesses which are atomic, i.e. another operation cannot be done between these locked accesses which ties up external bus (AHB,AXI) bandwidth and can increase worst case interrupt latencies. LDREX,STREX are more flexible, other instructions can be done between the LDREX and STREX accesses. " */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; unsigned long tmp; unsigned long one = 1; retry: __asm { ldrex oldval, [addr] strex tmp, one, [addr] teq tmp, #0 bne retry } return oldval; } #define AO_HAVE_test_and_set AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *p, AO_t incr) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] add tmp, incr, result strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add1(volatile AO_t *p) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] add tmp, result, #1 strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_add1 AO_INLINE AO_t AO_fetch_and_sub1(volatile AO_t *p) { unsigned long tmp,tmp2; AO_t result; retry: __asm { ldrex result, [p] sub tmp, result, #1 strex tmp2, tmp, [p] teq tmp2, #0 bne retry } return result; } #define AO_HAVE_fetch_and_sub1 #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result, tmp; retry: __asm__ { mov result, #2 ldrex tmp, [addr] teq tmp, old_val # ifdef __thumb__ it eq # endif strexeq result, new_val, [addr] teq result, #1 beq retry } return !(result&2); } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val, tmp; retry: __asm__ { mov tmp, #2 ldrex fetched_val, [addr] teq fetched_val, old_val # ifdef __thumb__ it eq # endif strexeq tmp, new_val, [addr] teq tmp, #1 beq retry } return fetched_val; } #define AO_HAVE_fetch_compare_and_swap /* helper functions for the Realview compiler: LDREXD is not usable * with inline assembler, so use the "embedded" assembler as * suggested by ARM Dev. support (June 2008). */ __asm inline double_ptr_storage AO_load_ex(const volatile AO_double_t *addr) { LDREXD r0,r1,[r0] } __asm inline int AO_store_ex(AO_t val1, AO_t val2, volatile AO_double_t *addr) { STREXD r3,r0,r1,[r2] MOV r0,r3 } AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = AO_load_ex(addr); return result; } #define AO_HAVE_double_load AO_INLINE int AO_compare_double_and_swap_double(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { double_ptr_storage old_val = ((double_ptr_storage)old_val2 << 32) | old_val1; double_ptr_storage tmp; int result; while(1) { tmp = AO_load_ex(addr); if(tmp != old_val) return 0; result = AO_store_ex(new_val1, new_val2, addr); if(!result) return 1; } } #define AO_HAVE_compare_double_and_swap_double #endif /* __TARGET_ARCH_ARM >= 6 */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h0000755000175000017500000000642112456307241025035 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ /* * Ensure, if at all possible, that AO_compare_and_swap_full() is * available. The emulation should be brute-force signal-safe, even * though it actually blocks. * Including this file will generate an error if AO_compare_and_swap_full() * cannot be made available. * This will be included from platform-specific atomic_ops files * if appropriate, and if AO_REQUIRE_CAS is defined. It should not be * included directly, especially since it affects the implementation * of other atomic update primitives. * The implementation assumes that only AO_store_XXX and AO_test_and_set_XXX * variants are defined, and that AO_test_and_set_XXX is not used to * operate on compare_and_swap locations. */ #ifndef AO_ATOMIC_OPS_H # error This file should not be included directly. #endif #ifndef AO_HAVE_double_t # include "standard_ao_double_t.h" #endif AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val); int AO_compare_double_and_swap_double_emulation(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); void AO_store_full_emulation(volatile AO_t *addr, AO_t val); #ifndef AO_HAVE_fetch_compare_and_swap_full # define AO_fetch_compare_and_swap_full(addr, old, newval) \ AO_fetch_compare_and_swap_emulation(addr, old, newval) # define AO_HAVE_fetch_compare_and_swap_full #endif #ifndef AO_HAVE_compare_double_and_swap_double_full # define AO_compare_double_and_swap_double_full(addr, old1, old2, \ newval1, newval2) \ AO_compare_double_and_swap_double_emulation(addr, old1, old2, \ newval1, newval2) # define AO_HAVE_compare_double_and_swap_double_full #endif #undef AO_store #undef AO_HAVE_store #undef AO_store_write #undef AO_HAVE_store_write #undef AO_store_release #undef AO_HAVE_store_release #undef AO_store_full #undef AO_HAVE_store_full #define AO_store_full(addr, val) AO_store_full_emulation(addr, val) #define AO_HAVE_store_full MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h0000755000175000017500000001415212456307241025231 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../test_and_set_t_is_ao_t.h" #include "../standard_ao_double_t.h" #ifndef AO_UNIPROCESSOR AO_INLINE void AO_nop_write(void) { __asm__ __volatile__("dmb st" : : : "memory"); } # define AO_HAVE_nop_write #endif /* TODO: Adjust version check on fixing double-wide AO support in GCC. */ #if __GNUC__ == 4 AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; int status; /* Note that STXP cannot be discarded because LD[A]XP is not */ /* single-copy atomic (unlike LDREXD for 32-bit ARM). */ do { __asm__ __volatile__("//AO_double_load\n" " ldxp %0, %1, %3\n" " stxp %w2, %0, %1, %3" : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) : "Q" (*addr)); } while (AO_EXPECT_FALSE(status)); return result; } # define AO_HAVE_double_load AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; int status; do { __asm__ __volatile__("//AO_double_load_acquire\n" " ldaxp %0, %1, %3\n" " stxp %w2, %0, %1, %3" : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) : "Q" (*addr)); } while (AO_EXPECT_FALSE(status)); return result; } # define AO_HAVE_double_load_acquire AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t value) { AO_double_t old_val; int status; do { __asm__ __volatile__("//AO_double_store\n" " ldxp %0, %1, %3\n" " stxp %w2, %4, %5, %3" : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), "=Q" (*addr) : "r" (value.AO_val1), "r" (value.AO_val2)); /* Compared to the arm.h implementation, the 'cc' (flags) are not */ /* clobbered because A64 has no concept of conditional execution. */ } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) { AO_double_t old_val; int status; do { __asm__ __volatile__("//AO_double_store_release\n" " ldxp %0, %1, %3\n" " stlxp %w2, %4, %5, %3" : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), "=Q" (*addr) : "r" (value.AO_val1), "r" (value.AO_val2)); } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store_release AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap\n" " ldxp %0, %1, %2\n" : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( " stxp %w0, %2, %3, %1\n" : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap AO_INLINE int AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_acquire\n" " ldaxp %0, %1, %2\n" : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( " stxp %w0, %2, %3, %1\n" : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_acquire AO_INLINE int AO_double_compare_and_swap_release(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_release\n" " ldxp %0, %1, %2\n" : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( " stlxp %w0, %2, %3, %1\n" : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_release AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { AO_double_t tmp; int result = 1; do { __asm__ __volatile__("//AO_double_compare_and_swap_full\n" " ldaxp %0, %1, %2\n" : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) : "Q" (*addr)); if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) break; __asm__ __volatile__( " stlxp %w0, %2, %3, %1\n" : "=&r" (result), "=Q" (*addr) : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); } while (AO_EXPECT_FALSE(result)); return !result; } # define AO_HAVE_double_compare_and_swap_full #endif /* __GNUC__ == 4 */ #include "generic.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h0000755000175000017500000000400312456307241025060 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../loadstore/atomic_load.h" #include "../loadstore/atomic_store.h" #include "../test_and_set_t_is_ao_t.h" #define AO_NO_DD_ORDERING /* Data dependence does not imply read ordering. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mb" : : : "memory"); } #define AO_HAVE_nop_full AO_INLINE void AO_nop_write(void) { __asm__ __volatile__("wmb" : : : "memory"); } #define AO_HAVE_nop_write /* mb should be used for AO_nop_read(). That's the default. */ /* TODO: implement AO_fetch_and_add explicitly. */ /* We believe that ldq_l ... stq_c does not imply any memory barrier. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { unsigned long was_equal; unsigned long temp; __asm__ __volatile__( "1: ldq_l %0,%1\n" " cmpeq %0,%4,%2\n" " mov %3,%0\n" " beq %2,2f\n" " stq_c %0,%1\n" " beq %0,1b\n" "2:\n" : "=&r" (temp), "+m" (*addr), "=&r" (was_equal) : "r" (new_val), "Ir" (old) :"memory"); return (int)was_equal; } #define AO_HAVE_compare_and_swap /* TODO: implement AO_fetch_compare_and_swap */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h0000755000175000017500000005124012456307241024557 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ #include "../test_and_set_t_is_ao_t.h" /* Probably suboptimal */ #if defined(__thumb__) && !defined(__thumb2__) /* Thumb One mode does not have ARM "mcr", "swp" and some load/store */ /* instructions, so we temporarily switch to ARM mode and go back */ /* afterwards (clobbering "r3" register). */ # define AO_THUMB_GO_ARM \ " adr r3, 4f\n" \ " bx r3\n" \ " .align\n" \ " .arm\n" \ "4:\n" # define AO_THUMB_RESTORE_MODE \ " adr r3, 5f + 1\n" \ " bx r3\n" \ " .thumb\n" \ "5:\n" # define AO_THUMB_SWITCH_CLOBBERS "r3", #else # define AO_THUMB_GO_ARM /* empty */ # define AO_THUMB_RESTORE_MODE /* empty */ # define AO_THUMB_SWITCH_CLOBBERS /* empty */ #endif /* !__thumb__ */ /* NEC LE-IT: gcc has no way to easily check the arm architecture */ /* but it defines only one (or several) of __ARM_ARCH_x__ to be true. */ #if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_3__) \ && !defined(__ARM_ARCH_3M__) && !defined(__ARM_ARCH_4__) \ && !defined(__ARM_ARCH_4T__) \ && ((!defined(__ARM_ARCH_5__) && !defined(__ARM_ARCH_5E__) \ && !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) \ && !defined(__ARM_ARCH_5TEJ__) && !defined(__ARM_ARCH_6M__)) \ || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ || defined(__ARM_ARCH_8A__)) # define AO_ARM_HAVE_LDREX # if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \ && !defined(__ARM_ARCH_6T2__) /* LDREXB/STREXB and LDREXH/STREXH are present in ARMv6K/Z+. */ # define AO_ARM_HAVE_LDREXBH # endif # if !defined(__ARM_ARCH_6__) && !defined(__ARM_ARCH_6J__) \ && !defined(__ARM_ARCH_6T2__) && !defined(__ARM_ARCH_6Z__) \ && !defined(__ARM_ARCH_6ZT2__) # if !defined(__ARM_ARCH_6K__) && !defined(__ARM_ARCH_6ZK__) /* DMB is present in ARMv6M and ARMv7+. */ # define AO_ARM_HAVE_DMB # endif # if (!defined(__thumb__) \ || (defined(__thumb2__) && !defined(__ARM_ARCH_7__) \ && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__))) \ && (!defined(__clang__) || (__clang_major__ > 3) \ || (__clang_major__ == 3 && __clang_minor__ >= 3)) /* LDREXD/STREXD present in ARMv6K/M+ (see gas/config/tc-arm.c). */ /* In the Thumb mode, this works only starting from ARMv7 (except */ /* for the base and 'M' models). Clang3.2 (and earlier) does not */ /* allocate register pairs for LDREXD/STREXD properly (besides, */ /* Clang3.1 does not support "%H" operand specification). */ # define AO_ARM_HAVE_LDREXD # endif /* !thumb || ARMv7A || ARMv7R+ */ # endif /* ARMv7+ */ #endif /* ARMv6+ */ #if !defined(__ARM_ARCH_2__) && !defined(__ARM_ARCH_6M__) \ && !defined(__ARM_ARCH_8A__) && !defined(__thumb2__) # define AO_ARM_HAVE_SWP /* Note: ARMv6M is excluded due to no ARM mode support. */ /* Also, SWP is obsoleted for ARMv8+. */ #endif /* !__thumb2__ */ #ifdef AO_UNIPROCESSOR /* If only a single processor (core) is used, AO_UNIPROCESSOR could */ /* be defined by the client to avoid unnecessary memory barrier. */ AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #elif defined(AO_ARM_HAVE_DMB) /* ARMv7 is compatible to ARMv6 but has a simpler command for issuing */ /* a memory barrier (DMB). Raising it via CP15 should still work */ /* (but slightly less efficient because it requires the use of */ /* a general-purpose register). */ AO_INLINE void AO_nop_full(void) { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("dmb" : : : "memory"); } # define AO_HAVE_nop_full AO_INLINE void AO_nop_write(void) { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("dmb st" : : : "memory"); } # define AO_HAVE_nop_write #elif defined(AO_ARM_HAVE_LDREX) /* ARMv6 is the first architecture providing support for a simple */ /* LL/SC. A data memory barrier must be raised via CP15 command. */ AO_INLINE void AO_nop_full(void) { unsigned dest = 0; /* Issue a data memory barrier (keeps ordering of memory */ /* transactions before and after this operation). */ __asm__ __volatile__("@AO_nop_full\n" AO_THUMB_GO_ARM " mcr p15,0,%0,c7,c10,5\n" AO_THUMB_RESTORE_MODE : "=&r"(dest) : /* empty */ : AO_THUMB_SWITCH_CLOBBERS "memory"); } # define AO_HAVE_nop_full #else /* AO_nop_full() is emulated using AO_test_and_set_full(). */ #endif /* !AO_UNIPROCESSOR && !AO_ARM_HAVE_LDREX */ #ifdef AO_ARM_HAVE_LDREX /* AO_t/char/short/int load is simple reading. */ /* Unaligned accesses are not guaranteed to be atomic. */ # define AO_ACCESS_CHECK_ALIGNED # define AO_ACCESS_short_CHECK_ALIGNED # define AO_ACCESS_int_CHECK_ALIGNED # include "../all_atomic_only_load.h" /* "ARM Architecture Reference Manual" (chapter A3.5.3) says that the */ /* single-copy atomic processor accesses are all byte accesses, all */ /* halfword accesses to halfword-aligned locations, all word accesses */ /* to word-aligned locations. */ /* There is only a single concern related to AO store operations: */ /* a direct write (by STR[B/H] instruction) will not be recognized */ /* by the LL/SC construct on the same CPU (i.e., according to ARM */ /* documentation, e.g., see CortexA8 TRM reference, point 8.5, */ /* atomic "store" (using LDREX/STREX[B/H]) is the only safe way to */ /* set variables also used in LL/SC environment). */ /* This is only a problem if interrupt handlers do not clear the */ /* reservation (by CLREX instruction or a dummy STREX one), as they */ /* almost certainly should (e.g., see restore_user_regs defined in */ /* arch/arm/kernel/entry-header.S of Linux. Nonetheless, there is */ /* a doubt this was properly implemented in some ancient OS releases. */ # ifdef AO_BROKEN_TASKSWITCH_CLREX AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { int flag; __asm__ __volatile__("@AO_store\n" AO_THUMB_GO_ARM "1: ldrex %0, [%2]\n" " strex %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_store # ifdef AO_ARM_HAVE_LDREXBH AO_INLINE void AO_char_store(volatile unsigned char *addr, unsigned char value) { int flag; __asm__ __volatile__("@AO_char_store\n" AO_THUMB_GO_ARM "1: ldrexb %0, [%2]\n" " strexb %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_char_store AO_INLINE void AO_short_store(volatile unsigned short *addr, unsigned short value) { int flag; __asm__ __volatile__("@AO_short_store\n" AO_THUMB_GO_ARM "1: ldrexh %0, [%2]\n" " strexh %0, %3, [%2]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (flag), "+m" (*addr) : "r" (addr), "r" (value) : AO_THUMB_SWITCH_CLOBBERS "cc"); } # define AO_HAVE_short_store # endif /* AO_ARM_HAVE_LDREXBH */ # else # include "../loadstore/atomic_store.h" /* AO_int_store is defined in ao_t_is_int.h. */ # endif /* !AO_BROKEN_TASKSWITCH_CLREX */ # ifndef AO_HAVE_char_store # include "../loadstore/char_atomic_store.h" # include "../loadstore/short_atomic_store.h" # endif /* NEC LE-IT: replace the SWAP as recommended by ARM: "Applies to: ARM11 Cores Though the SWP instruction will still work with ARM V6 cores, it is recommended to use the new V6 synchronization instructions. The SWP instruction produces 'locked' read and write accesses which are atomic, i.e. another operation cannot be done between these locked accesses which ties up external bus (AHB, AXI) bandwidth and can increase worst case interrupt latencies. LDREX, STREX are more flexible, other instructions can be done between the LDREX and STREX accesses." */ #ifndef AO_PREFER_GENERALIZED #if !defined(AO_FORCE_USE_SWP) || !defined(AO_ARM_HAVE_SWP) /* But, on the other hand, there could be a considerable performance */ /* degradation in case of a race. Eg., test_atomic.c executing */ /* test_and_set test on a dual-core ARMv7 processor using LDREX/STREX */ /* showed around 35 times lower performance than that using SWP. */ /* To force use of SWP instruction, use -D AO_FORCE_USE_SWP option */ /* (the latter is ignored if SWP instruction is unsupported). */ AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; int flag; __asm__ __volatile__("@AO_test_and_set\n" AO_THUMB_GO_ARM "1: ldrex %0, [%3]\n" " strex %1, %4, [%3]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(oldval), "=&r"(flag), "+m"(*addr) : "r"(addr), "r"(1) : AO_THUMB_SWITCH_CLOBBERS "cc"); return oldval; } # define AO_HAVE_test_and_set #endif /* !AO_FORCE_USE_SWP */ AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *p, AO_t incr) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_add\n" AO_THUMB_GO_ARM "1: ldrex %0, [%5]\n" /* get original */ " add %2, %0, %4\n" /* sum up in incr */ " strex %1, %2, [%5]\n" /* store them */ " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(flag), "=&r"(tmp), "+m"(*p) /* 0..3 */ : "r"(incr), "r"(p) /* 4..5 */ : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add1(volatile AO_t *p) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_add1\n" AO_THUMB_GO_ARM "1: ldrex %0, [%4]\n" /* get original */ " add %1, %0, #1\n" /* increment */ " strex %2, %1, [%4]\n" /* store them */ " teq %2, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p) : "r"(p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_add1 AO_INLINE AO_t AO_fetch_and_sub1(volatile AO_t *p) { AO_t result, tmp; int flag; __asm__ __volatile__("@AO_fetch_and_sub1\n" AO_THUMB_GO_ARM "1: ldrex %0, [%4]\n" /* get original */ " sub %1, %0, #1\n" /* decrement */ " strex %2, %1, [%4]\n" /* store them */ " teq %2, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "=&r"(flag), "+m"(*p) : "r"(p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return result; } #define AO_HAVE_fetch_and_sub1 AO_INLINE void AO_and(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_and\n" AO_THUMB_GO_ARM "1: ldrex %0, [%4]\n" " and %1, %0, %3\n" " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_and AO_INLINE void AO_or(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_or\n" AO_THUMB_GO_ARM "1: ldrex %0, [%4]\n" " orr %1, %0, %3\n" " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_or AO_INLINE void AO_xor(volatile AO_t *p, AO_t value) { AO_t tmp, result; __asm__ __volatile__("@AO_xor\n" AO_THUMB_GO_ARM "1: ldrex %0, [%4]\n" " eor %1, %0, %3\n" " strex %0, %1, [%4]\n" " teq %0, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (tmp), "=&r" (result), "+m" (*p) : "r" (value), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); } #define AO_HAVE_xor #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_ARM_HAVE_LDREXBH AO_INLINE unsigned char AO_char_fetch_and_add(volatile unsigned char *p, unsigned char incr) { unsigned result, tmp; int flag; __asm__ __volatile__("@AO_char_fetch_and_add\n" AO_THUMB_GO_ARM "1: ldrexb %0, [%5]\n" " add %2, %0, %4\n" " strexb %1, %2, [%5]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p) : "r" ((unsigned)incr), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return (unsigned char)result; } # define AO_HAVE_char_fetch_and_add AO_INLINE unsigned short AO_short_fetch_and_add(volatile unsigned short *p, unsigned short incr) { unsigned result, tmp; int flag; __asm__ __volatile__("@AO_short_fetch_and_add\n" AO_THUMB_GO_ARM "1: ldrexh %0, [%5]\n" " add %2, %0, %4\n" " strexh %1, %2, [%5]\n" " teq %1, #0\n" " bne 1b\n" AO_THUMB_RESTORE_MODE : "=&r" (result), "=&r" (flag), "=&r" (tmp), "+m" (*p) : "r" ((unsigned)incr), "r" (p) : AO_THUMB_SWITCH_CLOBBERS "cc"); return (unsigned short)result; } # define AO_HAVE_short_fetch_and_add #endif /* AO_ARM_HAVE_LDREXBH */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result, tmp; __asm__ __volatile__("@AO_compare_and_swap\n" AO_THUMB_GO_ARM "1: mov %0, #2\n" /* store a flag */ " ldrex %1, [%3]\n" /* get original */ " teq %1, %4\n" /* see if match */ # ifdef __thumb2__ /* TODO: Eliminate warning: it blocks containing wide Thumb */ /* instructions are deprecated in ARMv8. */ " it eq\n" # endif " strexeq %0, %5, [%3]\n" /* store new one if matched */ " teq %0, #1\n" " beq 1b\n" /* if update failed, repeat */ AO_THUMB_RESTORE_MODE : "=&r"(result), "=&r"(tmp), "+m"(*addr) : "r"(addr), "r"(old_val), "r"(new_val) : AO_THUMB_SWITCH_CLOBBERS "cc"); return !(result&2); /* if succeded, return 1, else 0 */ } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; int flag; __asm__ __volatile__("@AO_fetch_compare_and_swap\n" AO_THUMB_GO_ARM "1: mov %0, #2\n" /* store a flag */ " ldrex %1, [%3]\n" /* get original */ " teq %1, %4\n" /* see if match */ # ifdef __thumb2__ " it eq\n" # endif " strexeq %0, %5, [%3]\n" /* store new one if matched */ " teq %0, #1\n" " beq 1b\n" /* if update failed, repeat */ AO_THUMB_RESTORE_MODE : "=&r"(flag), "=&r"(fetched_val), "+m"(*addr) : "r"(addr), "r"(old_val), "r"(new_val) : AO_THUMB_SWITCH_CLOBBERS "cc"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap #ifdef AO_ARM_HAVE_LDREXD # include "../standard_ao_double_t.h" /* "ARM Architecture Reference Manual ARMv7-A/R edition" (chapter */ /* A3.5.3) says that memory accesses caused by LDREXD and STREXD */ /* instructions to doubleword-aligned locations are single-copy */ /* atomic; accesses to 64-bit elements by other instructions might */ /* not be single-copy atomic as they are executed as a sequence of */ /* 32-bit accesses. */ AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_load\n" " ldrexd %0, %H0, [%1]" : "=&r" (result.AO_whole) : "r" (addr) /* : no clobber */); return result; } # define AO_HAVE_double_load AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { AO_double_t old_val; int status; do { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_store\n" " ldrexd %0, %H0, [%3]\n" " strexd %1, %4, %H4, [%3]" : "=&r" (old_val.AO_whole), "=&r" (status), "+m" (*addr) : "r" (addr), "r" (new_val.AO_whole) : "cc"); } while (AO_EXPECT_FALSE(status)); } # define AO_HAVE_double_store AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { double_ptr_storage tmp; int result = 1; do { /* AO_THUMB_GO_ARM is empty. */ __asm__ __volatile__("@AO_double_compare_and_swap\n" " ldrexd %0, %H0, [%1]\n" /* get original to r1 & r2 */ : "=&r"(tmp) : "r"(addr) /* : no clobber */); if (tmp != old_val.AO_whole) break; __asm__ __volatile__( " strexd %0, %3, %H3, [%2]\n" /* store new one if matched */ : "=&r"(result), "+m"(*addr) : "r" (addr), "r" (new_val.AO_whole) : "cc"); } while (AO_EXPECT_FALSE(result)); return !result; /* if succeded, return 1 else 0 */ } # define AO_HAVE_double_compare_and_swap #endif /* AO_ARM_HAVE_LDREXD */ #else /* pre ARMv6 architectures ... */ /* I found a slide set that, if I read it correctly, claims that */ /* Loads followed by either a Load or Store are ordered, but nothing */ /* else is. */ /* It appears that SWP is the only simple memory barrier. */ #include "../all_aligned_atomic_load_store.h" /* The code should run correctly on a multi-core ARMv6+ as well. */ #endif /* !AO_ARM_HAVE_LDREX */ #if !defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_test_and_set) \ && defined (AO_ARM_HAVE_SWP) && (!defined(AO_PREFER_GENERALIZED) \ || !defined(AO_HAVE_fetch_compare_and_swap)) AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; /* SWP on ARM is very similar to XCHG on x86. */ /* The first operand is the result, the second the value */ /* to be stored. Both registers must be different from addr. */ /* Make the address operand an early clobber output so it */ /* doesn't overlap with the other operands. The early clobber */ /* on oldval is necessary to prevent the compiler allocating */ /* them to the same register if they are both unused. */ __asm__ __volatile__("@AO_test_and_set_full\n" AO_THUMB_GO_ARM " swp %0, %2, [%3]\n" /* Ignore GCC "SWP is deprecated for this architecture" */ /* warning here (for ARMv6+). */ AO_THUMB_RESTORE_MODE : "=&r"(oldval), "=&r"(addr) : "r"(1), "1"(addr) : AO_THUMB_SWITCH_CLOBBERS "memory"); return oldval; } # define AO_HAVE_test_and_set_full #endif /* !AO_HAVE_test_and_set[_full] && AO_ARM_HAVE_SWP */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h0000755000175000017500000000461512456307241024741 0ustar jnthnjnthn/* * Copyright (C) 2009 Bradley Smith * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* There are no multiprocessor implementations. */ #include "../test_and_set_t_is_ao_t.h" #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { register long ret; __asm__ __volatile__( "xchg %[oldval], %[mem], %[newval]" : [oldval] "=&r"(ret) : [mem] "r"(addr), [newval] "r"(1) : "memory"); return (AO_TS_VAL_t)ret; } # define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { register long ret; __asm__ __volatile__( "1: ssrf 5\n" " ld.w %[res], %[mem]\n" " eor %[res], %[oldval]\n" " brne 2f\n" " stcond %[mem], %[newval]\n" " brne 1b\n" "2:\n" : [res] "=&r"(ret), [mem] "=m"(*addr) : "m"(*addr), [newval] "r"(new_val), [oldval] "r"(old) : "cc", "memory"); return (int)ret; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h0000755000175000017500000000540012456307241024735 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. * * Most of this code originally comes from Hans-Peter Nilsson. It is included * here with his permission. */ /* FIXME: seems to be untested. */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* There are no multiprocessor implementations. */ #include "../test_and_set_t_is_ao_t.h" /* * The architecture apparently supports an "f" flag which is * set on preemption. This essentially gives us load-locked, * store-conditional primitives, though I'm not quite sure how * this would work on a hypothetical multiprocessor. -HB * * For details, see * http://developer.axis.com/doc/hardware/etrax100lx/prog_man/ * 1_architectural_description.pdf * * Presumably many other primitives (notably CAS, including the double- * width versions) could be implemented in this manner, if someone got * around to it. */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { /* Ripped from linuxthreads/sysdeps/cris/pt-machine.h */ register unsigned long int ret; /* Note the use of a dummy output of *addr to expose the write. The memory barrier is to stop *other* writes being moved past this code. */ __asm__ __volatile__("clearf\n" "0:\n\t" "movu.b [%2],%0\n\t" "ax\n\t" "move.b %3,[%2]\n\t" "bwf 0b\n\t" "clearf" : "=&r" (ret), "=m" (*addr) : "r" (addr), "r" ((int) 1), "m" (*addr) : "memory"); return ret; } #define AO_HAVE_test_and_set_full MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h0000755000175000017500000005362412456307241026706 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/char AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_char_fetch_and_add AO_INLINE void AO_char_and(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_char_and AO_INLINE void AO_char_or(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_char_or AO_INLINE void AO_char_xor(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_char_xor /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/short AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_short_fetch_and_add AO_INLINE void AO_short_and(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_short_and AO_INLINE void AO_short_or(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_short_or AO_INLINE void AO_short_xor(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_short_xor /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_int_fetch_and_add AO_INLINE void AO_int_and(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_int_and AO_INLINE void AO_int_or(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_int_or AO_INLINE void AO_int_xor(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_int_xor /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); } #define AO_HAVE_fetch_and_add AO_INLINE void AO_and(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_and AO_INLINE void AO_or(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_or AO_INLINE void AO_xor(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_xor /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/char AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_fetch_and_add_acquire AO_INLINE void AO_char_and_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_and_acquire AO_INLINE void AO_char_or_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_or_acquire AO_INLINE void AO_char_xor_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_xor_acquire /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/short AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_fetch_and_add_acquire AO_INLINE void AO_short_and_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_and_acquire AO_INLINE void AO_short_or_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_or_acquire AO_INLINE void AO_short_xor_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_xor_acquire /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_fetch_and_add_acquire AO_INLINE void AO_int_and_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_and_acquire AO_INLINE void AO_int_or_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_or_acquire AO_INLINE void AO_int_xor_acquire(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_xor_acquire /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); } #define AO_HAVE_fetch_and_add_acquire AO_INLINE void AO_and_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_and_acquire AO_INLINE void AO_or_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_or_acquire AO_INLINE void AO_xor_acquire(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); } #define AO_HAVE_xor_acquire /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/char AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_char_fetch_and_add_release AO_INLINE void AO_char_and_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_char_and_release AO_INLINE void AO_char_or_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_char_or_release AO_INLINE void AO_char_xor_release(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_char_xor_release /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/short AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_short_fetch_and_add_release AO_INLINE void AO_short_and_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_short_and_release AO_INLINE void AO_short_or_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_short_or_release AO_INLINE void AO_short_xor_release(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_short_xor_release /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_int_fetch_and_add_release AO_INLINE void AO_int_and_release(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_int_and_release AO_INLINE void AO_int_or_release(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_int_or_release AO_INLINE void AO_int_xor_release(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_int_xor_release /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); } #define AO_HAVE_fetch_and_add_release AO_INLINE void AO_and_release(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_and_release AO_INLINE void AO_or_release(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_or_release AO_INLINE void AO_xor_release(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_xor_release /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/char AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_char_fetch_and_add_full AO_INLINE void AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_char_and_full AO_INLINE void AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_char_or_full AO_INLINE void AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_char_xor_full /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/short AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_short_fetch_and_add_full AO_INLINE void AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_short_and_full AO_INLINE void AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_short_or_full AO_INLINE void AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_short_xor_full /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_int_fetch_and_add_full AO_INLINE void AO_int_and_full(volatile unsigned *addr, unsigned value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_int_and_full AO_INLINE void AO_int_or_full(volatile unsigned *addr, unsigned value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_int_or_full AO_INLINE void AO_int_xor_full(volatile unsigned *addr, unsigned value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_int_xor_full /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); } #define AO_HAVE_fetch_and_add_full AO_INLINE void AO_and_full(volatile AO_t *addr, AO_t value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_and_full AO_INLINE void AO_or_full(volatile AO_t *addr, AO_t value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_or_full AO_INLINE void AO_xor_full(volatile AO_t *addr, AO_t value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); } #define AO_HAVE_xor_full MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template0000755000175000017500000000253212456307241030262 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE XCTYPE AO_XSIZE_fetch_and_add_XBAR(volatile XCTYPE *addr, XCTYPE incr) { return __atomic_fetch_add(addr, incr, __ATOMIC_XGCCBAR); } #define AO_HAVE_XSIZE_fetch_and_add_XBAR AO_INLINE void AO_XSIZE_and_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_and_fetch(addr, value, __ATOMIC_XGCCBAR); } #define AO_HAVE_XSIZE_and_XBAR AO_INLINE void AO_XSIZE_or_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_or_fetch(addr, value, __ATOMIC_XGCCBAR); } #define AO_HAVE_XSIZE_or_XBAR AO_INLINE void AO_XSIZE_xor_XBAR(volatile XCTYPE *addr, XCTYPE value) { (void)__atomic_xor_fetch(addr, value, __ATOMIC_XGCCBAR); } #define AO_HAVE_XSIZE_xor_XBAR MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h0000755000175000017500000002217012456307241026522 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_char_load AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_char_load_acquire /* char_load_full is generalized using load and nop_full, so that */ /* char_load_read is defined using load and nop_read. */ /* char_store_full definition is omitted similar to load_full reason. */ AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_char_store AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_char_store_release AO_INLINE unsigned/**/char AO_char_fetch_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } #define AO_HAVE_char_fetch_compare_and_swap /* TODO: Add CAS _acquire/release/full primitives. */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_char_compare_and_swap(volatile unsigned/**/char *addr, unsigned/**/char old_val, unsigned/**/char new_val) { return __sync_bool_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_char_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_short_load AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_short_load_acquire /* short_load_full is generalized using load and nop_full, so that */ /* short_load_read is defined using load and nop_read. */ /* short_store_full definition is omitted similar to load_full reason. */ AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_short_store AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_short_store_release AO_INLINE unsigned/**/short AO_short_fetch_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } #define AO_HAVE_short_fetch_compare_and_swap /* TODO: Add CAS _acquire/release/full primitives. */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_short_compare_and_swap(volatile unsigned/**/short *addr, unsigned/**/short old_val, unsigned/**/short new_val) { return __sync_bool_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_short_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_int_load AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_int_load_acquire /* int_load_full is generalized using load and nop_full, so that */ /* int_load_read is defined using load and nop_read. */ /* int_store_full definition is omitted similar to load_full reason. */ AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_int_store AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_int_store_release AO_INLINE unsigned AO_int_fetch_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } #define AO_HAVE_int_fetch_compare_and_swap /* TODO: Add CAS _acquire/release/full primitives. */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_int_compare_and_swap(volatile unsigned *addr, unsigned old_val, unsigned new_val) { return __sync_bool_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_int_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE AO_t AO_load(const volatile AO_t *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_load AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_load_acquire /* load_full is generalized using load and nop_full, so that */ /* load_read is defined using load and nop_read. */ /* store_full definition is omitted similar to load_full reason. */ AO_INLINE void AO_store(volatile AO_t *addr, AO_t value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_store AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_store_release AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } #define AO_HAVE_fetch_compare_and_swap /* TODO: Add CAS _acquire/release/full primitives. */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return __sync_bool_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template0000755000175000017500000000436112456307241030110 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { return __atomic_load_n(addr, __ATOMIC_RELAXED); } #define AO_HAVE_XSIZE_load AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { return __atomic_load_n(addr, __ATOMIC_ACQUIRE); } #define AO_HAVE_XSIZE_load_acquire /* XSIZE_load_full is generalized using load and nop_full, so that */ /* XSIZE_load_read is defined using load and nop_read. */ /* XSIZE_store_full definition is omitted similar to load_full reason. */ AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE value) { __atomic_store_n(addr, value, __ATOMIC_RELAXED); } #define AO_HAVE_XSIZE_store AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE value) { __atomic_store_n(addr, value, __ATOMIC_RELEASE); } #define AO_HAVE_XSIZE_store_release AO_INLINE XCTYPE AO_XSIZE_fetch_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); } #define AO_HAVE_XSIZE_fetch_compare_and_swap /* TODO: Add CAS _acquire/release/full primitives. */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_XSIZE_compare_and_swap(volatile XCTYPE *addr, XCTYPE old_val, XCTYPE new_val) { return __sync_bool_compare_and_swap(addr, old_val, new_val /* empty protection list */); } # define AO_HAVE_XSIZE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h0000755000175000017500000001063012456307241025412 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* The following implementation assumes GCC 4.7 or later. */ /* For the details, see GNU Manual, chapter 6.52 (Built-in functions */ /* for memory model aware atomic operations). */ /* TODO: Include this file for other targets if gcc 4.7+ */ #ifdef AO_UNIPROCESSOR /* If only a single processor (core) is used, AO_UNIPROCESSOR could */ /* be defined by the client to avoid unnecessary memory barrier. */ AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #else AO_INLINE void AO_nop_read(void) { __atomic_thread_fence(__ATOMIC_ACQUIRE); } # define AO_HAVE_nop_read # ifndef AO_HAVE_nop_write AO_INLINE void AO_nop_write(void) { __atomic_thread_fence(__ATOMIC_RELEASE); } # define AO_HAVE_nop_write # endif AO_INLINE void AO_nop_full(void) { /* __sync_synchronize() could be used instead. */ __atomic_thread_fence(__ATOMIC_SEQ_CST); } # define AO_HAVE_nop_full #endif /* !AO_UNIPROCESSOR */ #include "generic-small.h" #ifndef AO_PREFER_GENERALIZED # include "generic-arithm.h" AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_RELAXED); } # define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_ACQUIRE); } # define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_RELEASE); } # define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_SEQ_CST); } # define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_HAVE_DOUBLE_PTR_STORAGE # ifndef AO_HAVE_double_load AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_RELAXED); return result; } # define AO_HAVE_double_load # endif # ifndef AO_HAVE_double_load_acquire AO_INLINE AO_double_t AO_double_load_acquire(const volatile AO_double_t *addr) { AO_double_t result; result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_ACQUIRE); return result; } # define AO_HAVE_double_load_acquire # endif # ifndef AO_HAVE_double_store AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t value) { __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELAXED); } # define AO_HAVE_double_store # endif # ifndef AO_HAVE_double_store_release AO_INLINE void AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) { __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELEASE); } # define AO_HAVE_double_store_release # endif # ifndef AO_HAVE_double_compare_and_swap AO_INLINE int AO_double_compare_and_swap(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (int)__atomic_compare_exchange_n(&addr->AO_whole, &old_val.AO_whole /* p_expected */, new_val.AO_whole /* desired */, 0 /* is_weak: false */, __ATOMIC_RELAXED /* success */, __ATOMIC_RELAXED /* failure */); } # define AO_HAVE_double_compare_and_swap # endif /* TODO: Add double CAS _acquire/release/full primitives. */ #endif /* AO_HAVE_DOUBLE_PTR_STORAGE */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h0000755000175000017500000001017212456307241025430 0ustar jnthnjnthn/* * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_ao_t.h" /* There's also "isync" and "barrier"; however, for all current CPU */ /* versions, "syncht" should suffice. Likewise, it seems that the */ /* auto-defined versions of *_acquire, *_release or *_full suffice for */ /* all current ISA implementations. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("syncht" : : : "memory"); } #define AO_HAVE_nop_full /* The Hexagon has load-locked, store-conditional primitives, and so */ /* resulting code is very nearly identical to that of PowerPC. */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t oldval; AO_t newval; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%3);\n" /* load and reserve */ " %1 = add (%0,%4);\n" /* increment */ " memw_locked(%3,p1) = %1;\n" /* store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ : "=&r"(oldval), "=&r"(newval), "+m"(*addr) : "r"(addr), "r"(incr) : "memory", "p1"); return oldval; } #define AO_HAVE_fetch_and_add AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { int oldval; int locked_value = 1; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%2);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,#0);\n" /* if load is not zero, */ " if (!p2.new) jump:nt 2f; \n" /* we are done */ " }\n" " memw_locked(%2,p1) = %3;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval), "+m"(*addr) : "r"(addr), "r"(locked_value) : "memory", "p1", "p2"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t __oldval; int result = 0; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%3);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,%4);\n" /* if load is not equal to */ " if (!p2.new) jump:nt 2f; \n" /* old, fail */ " }\n" " memw_locked(%3,p1) = %5;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ " %1 = #1\n" /* success, result = 1 */ "2:\n" : "=&r" (__oldval), "+r" (result), "+m"(*addr) : "r" (addr), "r" (old), "r" (new_val) : "p1", "p2", "memory" ); return result; } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t __oldval; __asm__ __volatile__( "1:\n" " %0 = memw_locked(%2);\n" /* load and reserve */ " {\n" " p2 = cmp.eq(%0,%3);\n" /* if load is not equal to */ " if (!p2.new) jump:nt 2f; \n" /* old_val, fail */ " }\n" " memw_locked(%2,p1) = %4;\n" /* else store conditional */ " if (!p1) jump 1b;\n" /* retry if lost reservation */ "2:\n" : "=&r" (__oldval), "+m"(*addr) : "r" (addr), "r" (old_val), "r" (new_val) : "p1", "p2", "memory" ); return __oldval; } #define AO_HAVE_fetch_compare_and_swap #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h0000755000175000017500000000743512456307241024737 0ustar jnthnjnthn/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" /* Some architecture set descriptions include special "ordered" memory */ /* operations. As far as we can tell, no existing processors actually */ /* require those. Nor does it appear likely that future processors */ /* will. */ #include "../ordered.h" /* GCC will not guarantee the alignment we need, use four lock words */ /* and select the correctly aligned datum. See the glibc 2.3.2 */ /* linuxthread port for the original implementation. */ struct AO_pa_clearable_loc { int data[4]; }; #undef AO_TS_INITIALIZER #define AO_TS_t struct AO_pa_clearable_loc #define AO_TS_INITIALIZER {1,1,1,1} /* Switch meaning of set and clear, since we only have an atomic clear */ /* instruction. */ typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val; #define AO_TS_VAL_t AO_PA_TS_val #define AO_TS_CLEAR AO_PA_TS_clear #define AO_TS_SET AO_PA_TS_set /* The hppa only has one atomic read and modify memory operation, */ /* load and clear, so hppa spinlocks must use zero to signify that */ /* someone is holding the lock. The address used for the ldcw */ /* semaphore must be 16-byte aligned. */ #define AO_ldcw(a, ret) \ __asm__ __volatile__("ldcw 0(%2), %0" \ : "=r" (ret), "=m" (*(a)) : "r" (a)) /* Because malloc only guarantees 8-byte alignment for malloc'd data, */ /* and GCC only guarantees 8-byte alignment for stack locals, we can't */ /* be assured of 16-byte alignment for atomic lock data even if we */ /* specify "__attribute ((aligned(16)))" in the type declaration. So, */ /* we use a struct containing an array of four ints for the atomic lock */ /* type and dynamically select the 16-byte aligned int from the array */ /* for the semaphore. */ #define AO_PA_LDCW_ALIGNMENT 16 #define AO_ldcw_align(addr) \ ((volatile unsigned *)(((unsigned long)(addr) \ + (AO_PA_LDCW_ALIGNMENT - 1)) \ & ~(AO_PA_LDCW_ALIGNMENT - 1))) /* Works on PA 1.1 and PA 2.0 systems */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t * addr) { volatile unsigned int ret; volatile unsigned *a = AO_ldcw_align(addr); AO_ldcw(a, ret); return (AO_TS_VAL_t)ret; } #define AO_HAVE_test_and_set_full AO_INLINE void AO_pa_clear(volatile AO_TS_t * addr) { volatile unsigned *a = AO_ldcw_align(addr); AO_compiler_barrier(); *a = 1; } #define AO_CLEAR(addr) AO_pa_clear(addr) MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h0000755000175000017500000002334112456307241024544 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" #include "../all_acquire_release_volatile.h" #include "../test_and_set_t_is_char.h" #ifdef _ILP32 /* 32-bit HP/UX code. */ /* This requires pointer "swizzling". Pointers need to be expanded */ /* to 64 bits using the addp4 instruction before use. This makes it */ /* hard to share code, but we try anyway. */ # define AO_LEN "4" /* We assume that addr always appears in argument position 1 in asm */ /* code. If it is clobbered due to swizzling, we also need it in */ /* second position. Any later arguments are referenced symbolically, */ /* so that we don't have to worry about their position. This requires*/ /* gcc 3.1, but you shouldn't be using anything older than that on */ /* IA64 anyway. */ /* The AO_MASK macro is a workaround for the fact that HP/UX gcc */ /* appears to otherwise store 64-bit pointers in ar.ccv, i.e. it */ /* doesn't appear to clear high bits in a pointer value we pass into */ /* assembly code, even if it is supposedly of type AO_t. */ # define AO_IN_ADDR "1"(addr) # define AO_OUT_ADDR , "=r"(addr) # define AO_SWIZZLE "addp4 %1=0,%1;;\n" # define AO_MASK(ptr) __asm__ __volatile__("zxt4 %1=%1": "=r"(ptr) : "0"(ptr)) #else # define AO_LEN "8" # define AO_IN_ADDR "r"(addr) # define AO_OUT_ADDR # define AO_SWIZZLE # define AO_MASK(ptr) /* empty */ #endif /* !_ILP32 */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mf" : : : "memory"); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".acq %0=[%1],1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".rel %0=[%1],1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".acq %0=[%1],-1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release (volatile AO_t *addr) { AO_t result; __asm__ __volatile__ (AO_SWIZZLE "fetchadd" AO_LEN ".rel %0=[%1],-1": "=r" (result) AO_OUT_ADDR: AO_IN_ADDR :"memory"); return result; } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t fetched_val; AO_MASK(old); __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN ".acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t fetched_val; AO_MASK(old); __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg" AO_LEN ".rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"(old) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old, unsigned char new_val) { unsigned char fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg1.acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old, unsigned char new_val) { unsigned char fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg1.rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old, unsigned short new_val) { unsigned short fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg2.acq %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old, unsigned short new_val) { unsigned short fetched_val; __asm__ __volatile__(AO_SWIZZLE "mov ar.ccv=%[old] ;; cmpxchg2.rel %0=[%1],%[new_val],ar.ccv" : "=r"(fetched_val) AO_OUT_ADDR : AO_IN_ADDR, [new_val]"r"(new_val), [old]"r"((AO_t)old) : "memory"); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_release #ifdef _ILP32 # define AO_T_IS_INT /* TODO: Add compare_double_and_swap_double for the _ILP32 case. */ #else # ifndef AO_PREFER_GENERALIZED AO_INLINE unsigned int AO_int_fetch_and_add1_acquire(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.acq %0=[%1],1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_add1_acquire AO_INLINE unsigned int AO_int_fetch_and_add1_release(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.rel %0=[%1],1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_add1_release AO_INLINE unsigned int AO_int_fetch_and_sub1_acquire(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.acq %0=[%1],-1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_sub1_acquire AO_INLINE unsigned int AO_int_fetch_and_sub1_release(volatile unsigned int *addr) { unsigned int result; __asm__ __volatile__("fetchadd4.rel %0=[%1],-1" : "=r" (result) : AO_IN_ADDR : "memory"); return result; } # define AO_HAVE_int_fetch_and_sub1_release # endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned int AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr, unsigned int old, unsigned int new_val) { unsigned int fetched_val; __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.acq %0=[%1],%2,ar.ccv" : "=r"(fetched_val) : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old) : "memory"); return fetched_val; } # define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned int AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr, unsigned int old, unsigned int new_val) { unsigned int fetched_val; __asm__ __volatile__("mov ar.ccv=%3 ;; cmpxchg4.rel %0=[%1],%2,ar.ccv" : "=r"(fetched_val) : AO_IN_ADDR, "r"(new_val), "r"((AO_t)old) : "memory"); return fetched_val; } # define AO_HAVE_int_fetch_compare_and_swap_release #endif /* !_ILP32 */ /* TODO: Add compare_and_swap_double as soon as there is widely */ /* available hardware that implements it. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h0000755000175000017500000000421512456307241024565 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* The cas instruction causes an emulation trap for the */ /* 060 with a misaligned pointer, so let's avoid this. */ #undef AO_t typedef unsigned long AO_t __attribute__ ((aligned (4))); /* FIXME. Very incomplete. */ #include "../all_aligned_atomic_load_store.h" /* Are there any m68k multiprocessors still around? */ /* AFAIK, Alliants were sequentially consistent. */ #include "../ordered.h" #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_t oldval; /* The value at addr is semi-phony. */ /* 'tas' sets bit 7 while the return */ /* value pretends all bits were set, */ /* which at least matches AO_TS_SET. */ __asm__ __volatile__( "tas %1; sne %0" : "=d" (oldval), "=m" (*addr) : "m" (*addr) : "memory"); /* This cast works due to the above. */ return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { char result; __asm__ __volatile__( "cas.l %3,%4,%1; seq %0" : "=d" (result), "=m" (*addr) : "m" (*addr), "d" (old), "d" (new_val) : "memory"); return -result; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h0000755000175000017500000001163312456307241024752 0ustar jnthnjnthn/* * Copyright (c) 2005,2007 Thiemo Seufer * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ /* * FIXME: This should probably make finer distinctions. SGI MIPS is * much more strongly ordered, and in fact closer to sequentially * consistent. This is really aimed at modern embedded implementations. * It looks to me like this assumes a 32-bit ABI. -HB */ #include "../all_aligned_atomic_load_store.h" #include "../loadstore/acquire_release_volatile.h" #include "../test_and_set_t_is_ao_t.h" /* Data dependence does not imply read ordering. */ #define AO_NO_DD_ORDERING #ifdef AO_ICE9A1_LLSC_WAR /* ICE9 rev A1 chip (used in very few systems) is reported to */ /* have a low-frequency bug that causes LL to fail. */ /* To workaround, just issue the second 'LL'. */ # define AO_MIPS_LL_FIX(args_str) \ " ll " args_str "\n" #else # define AO_MIPS_LL_FIX(args_str) "" #endif AO_INLINE void AO_nop_full(void) { __asm__ __volatile__( " .set push \n" " .set mips2 \n" " .set noreorder \n" " .set nomacro \n" " sync \n" " .set pop " : : : "memory"); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { register int result; register int temp; __asm__ __volatile__( " .set push\n" " .set mips2\n" " .set noreorder\n" " .set nomacro\n" "1: ll %0, %2\n" AO_MIPS_LL_FIX("%0, %2") " addu %1, %0, %3\n" " sc %1, %2\n" " beqz %1, 1b\n" " nop\n" " .set pop " : "=&r" (result), "=&r" (temp), "+m" (*addr) : "Ir" (incr) : "memory"); return (AO_t)result; } #define AO_HAVE_fetch_and_add AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { register int oldval; register int temp; __asm__ __volatile__( " .set push\n" " .set mips2\n" " .set noreorder\n" " .set nomacro\n" "1: ll %0, %2\n" AO_MIPS_LL_FIX("%0, %2") " move %1, %3\n" " sc %1, %2\n" " beqz %1, 1b\n" " nop\n" " .set pop " : "=&r" (oldval), "=&r" (temp), "+m" (*addr) : "r" (1) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set /* TODO: Implement AO_and/or/xor primitives directly. */ #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { register int was_equal = 0; register int temp; __asm__ __volatile__( " .set push \n" " .set mips2 \n" " .set noreorder \n" " .set nomacro \n" "1: ll %0, %1 \n" AO_MIPS_LL_FIX("%0, %1") " bne %0, %4, 2f \n" " move %0, %3 \n" " sc %0, %1 \n" " .set pop \n" " beqz %0, 1b \n" " li %2, 1 \n" "2: " : "=&r" (temp), "+m" (*addr), "+r" (was_equal) : "r" (new_val), "r" (old) : "memory"); return was_equal; } # define AO_HAVE_compare_and_swap #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { register int fetched_val; register int temp; __asm__ __volatile__( " .set push\n" " .set mips2\n" " .set noreorder\n" " .set nomacro\n" "1: ll %0, %2\n" AO_MIPS_LL_FIX("%0, %2") " bne %0, %4, 2f\n" " move %1, %3\n" " sc %1, %2\n" " beqz %1, 1b\n" " nop\n" " .set pop\n" "2:" : "=&r" (fetched_val), "=&r" (temp), "+m" (*addr) : "r" (new_val), "Jr" (old) : "memory"); return (AO_t)fetched_val; } #define AO_HAVE_fetch_compare_and_swap /* #include "../standard_ao_double_t.h" */ /* TODO: Implement double-wide operations if available. */ /* CAS primitives with acquire, release and full semantics are */ /* generated automatically (and AO_int_... primitives are */ /* defined properly after the first generalization pass). */ /* FIXME: 32-bit ABI is assumed. */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h0000755000175000017500000002775212456307241025472 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* Memory model documented at http://www-106.ibm.com/developerworks/ */ /* eserver/articles/archguide.html and (clearer) */ /* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */ /* There appears to be no implicit ordering between any kind of */ /* independent memory references. */ /* Architecture enforces some ordering based on control dependence. */ /* I don't know if that could help. */ /* Data-dependent loads are always ordered. */ /* Based on the above references, eieio is intended for use on */ /* uncached memory, which we don't support. It does not order loads */ /* from cached memory. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_ao_t.h" /* There seems to be no byte equivalent of lwarx, so this */ /* may really be what we want, at least in the 32-bit case. */ AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("sync" : : : "memory"); } #define AO_HAVE_nop_full /* lwsync apparently works for everything but a StoreLoad barrier. */ AO_INLINE void AO_lwsync(void) { #ifdef __NO_LWSYNC__ __asm__ __volatile__("sync" : : : "memory"); #else __asm__ __volatile__("lwsync" : : : "memory"); #endif } #define AO_nop_write() AO_lwsync() #define AO_HAVE_nop_write #define AO_nop_read() AO_lwsync() #define AO_HAVE_nop_read /* We explicitly specify load_acquire, since it is important, and can */ /* be implemented relatively cheaply. It could be implemented */ /* with an ordinary load followed by a lwsync. But the general wisdom */ /* seems to be that a data dependent branch followed by an isync is */ /* cheaper. And the documentation is fairly explicit that this also */ /* has acquire semantics. */ /* ppc64 uses ld not lwz */ AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result; #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) __asm__ __volatile__ ( "ld%U1%X1 %0,%1\n" "cmpw %0,%0\n" "bne- 1f\n" "1: isync\n" : "=r" (result) : "m"(*addr) : "memory", "cr0"); #else /* FIXME: We should get gcc to allocate one of the condition */ /* registers. I always got "impossible constraint" when I */ /* tried the "y" constraint. */ __asm__ __volatile__ ( "lwz%U1%X1 %0,%1\n" "cmpw %0,%0\n" "bne- 1f\n" "1: isync\n" : "=r" (result) : "m"(*addr) : "memory", "cc"); #endif return result; } #define AO_HAVE_load_acquire /* We explicitly specify store_release, since it relies */ /* on the fact that lwsync is also a LoadStore barrier. */ AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { AO_lwsync(); *addr = value; } #define AO_HAVE_store_release #ifndef AO_PREFER_GENERALIZED /* This is similar to the code in the garbage collector. Deleting */ /* this and having it synthesized from compare_and_swap would probably */ /* only cost us a load immediate instruction. */ AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) /* Completely untested. And we should be using smaller objects anyway. */ unsigned long oldval; unsigned long temp = 1; /* locked value */ __asm__ __volatile__( "1:ldarx %0,0,%1\n" /* load and reserve */ "cmpdi %0, 0\n" /* if load is */ "bne 2f\n" /* non-zero, return already set */ "stdcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval) : "r"(addr), "r"(temp) : "memory", "cr0"); #else int oldval; int temp = 1; /* locked value */ __asm__ __volatile__( "1:lwarx %0,0,%1\n" /* load and reserve */ "cmpwi %0, 0\n" /* if load is */ "bne 2f\n" /* non-zero, return already set */ "stwcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" /* oldval is zero if we set */ : "=&r"(oldval) : "r"(addr), "r"(temp) : "memory", "cr0"); #endif return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { AO_lwsync(); return AO_test_and_set(addr); } #define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; AO_lwsync(); result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ #ifndef AO_GENERALIZE_ASM_BOOL_CAS AO_INLINE int AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t oldval; int result = 0; # if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) __asm__ __volatile__( "1:ldarx %0,0,%2\n" /* load and reserve */ "cmpd %0, %4\n" /* if load is not equal to */ "bne 2f\n" /* old, fail */ "stdcx. %3,0,%2\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "li %1,1\n" /* result = 1; */ "2:\n" : "=&r"(oldval), "=&r"(result) : "r"(addr), "r"(new_val), "r"(old), "1"(result) : "memory", "cr0"); # else __asm__ __volatile__( "1:lwarx %0,0,%2\n" /* load and reserve */ "cmpw %0, %4\n" /* if load is not equal to */ "bne 2f\n" /* old, fail */ "stwcx. %3,0,%2\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "li %1,1\n" /* result = 1; */ "2:\n" : "=&r"(oldval), "=&r"(result) : "r"(addr), "r"(new_val), "r"(old), "1"(result) : "memory", "cr0"); # endif return result; } # define AO_HAVE_compare_and_swap AO_INLINE int AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { int result = AO_compare_and_swap(addr, old, new_val); AO_lwsync(); return result; } # define AO_HAVE_compare_and_swap_acquire AO_INLINE int AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_lwsync(); return AO_compare_and_swap(addr, old, new_val); } # define AO_HAVE_compare_and_swap_release AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { int result; AO_lwsync(); result = AO_compare_and_swap(addr, old, new_val); AO_lwsync(); return result; } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; # if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) __asm__ __volatile__( "1:ldarx %0,0,%1\n" /* load and reserve */ "cmpd %0, %3\n" /* if load is not equal to */ "bne 2f\n" /* old_val, fail */ "stdcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" : "=&r"(fetched_val) : "r"(addr), "r"(new_val), "r"(old_val) : "memory", "cr0"); # else __asm__ __volatile__( "1:lwarx %0,0,%1\n" /* load and reserve */ "cmpw %0, %3\n" /* if load is not equal to */ "bne 2f\n" /* old_val, fail */ "stwcx. %2,0,%1\n" /* else store conditional */ "bne- 1b\n" /* retry if lost reservation */ "2:\n" : "=&r"(fetched_val) : "r"(addr), "r"(new_val), "r"(old_val) : "memory", "cr0"); # endif return fetched_val; } #define AO_HAVE_fetch_compare_and_swap AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_lwsync(); return AO_fetch_compare_and_swap(addr, old_val, new_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result; AO_lwsync(); result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add(volatile AO_t *addr, AO_t incr) { AO_t oldval; AO_t newval; #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) __asm__ __volatile__( "1:ldarx %0,0,%2\n" /* load and reserve */ "add %1,%0,%3\n" /* increment */ "stdcx. %1,0,%2\n" /* store conditional */ "bne- 1b\n" /* retry if lost reservation */ : "=&r"(oldval), "=&r"(newval) : "r"(addr), "r"(incr) : "memory", "cr0"); #else __asm__ __volatile__( "1:lwarx %0,0,%2\n" /* load and reserve */ "add %1,%0,%3\n" /* increment */ "stwcx. %1,0,%2\n" /* store conditional */ "bne- 1b\n" /* retry if lost reservation */ : "=&r"(oldval), "=&r"(newval) : "r"(addr), "r"(incr) : "memory", "cr0"); #endif return oldval; } #define AO_HAVE_fetch_and_add AO_INLINE AO_t AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) { AO_t result = AO_fetch_and_add(addr, incr); AO_lwsync(); return result; } #define AO_HAVE_fetch_and_add_acquire AO_INLINE AO_t AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) { AO_lwsync(); return AO_fetch_and_add(addr, incr); } #define AO_HAVE_fetch_and_add_release AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) { AO_t result; AO_lwsync(); result = AO_fetch_and_add(addr, incr); AO_lwsync(); return result; } #define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) /* Empty */ #else # define AO_T_IS_INT #endif /* TODO: Implement double-wide operations if available. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h0000755000175000017500000000503012456307241024472 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* FIXME: untested. */ /* The relevant documentation appears to be at */ /* http://publibz.boulder.ibm.com/epubs/pdf/dz9zr003.pdf */ /* around page 5-96. Apparently: */ /* - Memory references in general are atomic only for a single */ /* byte. But it appears that the most common load/store */ /* instructions also guarantee atomicity for aligned */ /* operands of standard types. WE FOOLISHLY ASSUME that */ /* compilers only generate those. If that turns out to be */ /* wrong, we need inline assembly code for AO_load and */ /* AO_store. */ /* - A store followed by a load is unordered since the store */ /* may be delayed. Otherwise everything is ordered. */ /* - There is a hardware compare-and-swap (CS) instruction. */ #include "../all_aligned_atomic_load_store.h" #include "../ordered_except_wr.h" #include "../test_and_set_t_is_ao_t.h" /* FIXME: Is there a way to do byte-sized test-and-set? */ /* TODO: AO_nop_full should probably be implemented directly. */ /* It appears that certain BCR instructions have that effect. */ /* Presumably they're cheaper than CS? */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { int retval; __asm__ __volatile__ ( # ifndef __s390x__ " cs %1,%2,0(%3)\n" # else " csg %1,%2,0(%3)\n" # endif " ipm %0\n" " srl %0,28\n" : "=&d" (retval), "+d" (old) : "d" (new_val), "a" (addr) : "cc", "memory"); return retval == 0; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ /* TODO: Add double-wide operations for 32-bit executables. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h0000755000175000017500000000174512456307241024417 0ustar jnthnjnthn/* * Copyright (c) 2009 by Takashi YOSHII. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ #include "../all_atomic_load_store.h" #include "../ordered.h" /* sh has tas.b(byte) only */ #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { int oldval; __asm__ __volatile__( "tas.b @%1; movt %0" : "=r" (oldval) : "r" (addr) : "t", "memory"); return oldval? AO_TS_CLEAR : AO_TS_SET; } #define AO_HAVE_test_and_set_full /* TODO: Very incomplete. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h0000755000175000017500000000504512456307241025112 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* TODO: Very incomplete; Add support for sparc64. */ /* Non-ancient SPARCs provide compare-and-swap (casa). */ #include "../all_atomic_load_store.h" /* Real SPARC code uses TSO: */ #include "../ordered_except_wr.h" /* Test_and_set location is just a byte. */ #include "../test_and_set_t_is_char.h" AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t oldval; __asm__ __volatile__("ldstub %1,%0" : "=r"(oldval), "=m"(*addr) : "m"(*addr) : "memory"); return oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_NO_SPARC_V9 /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { char ret; __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t" # if defined(__arch64__) "casx [%2],%0,%1\n\t" # else "cas [%2],%0,%1\n\t" /* 32-bit version */ # endif "membar #StoreLoad | #StoreStore\n\t" "cmp %0,%1\n\t" "be,a 0f\n\t" "mov 1,%0\n\t"/* one insn after branch always executed */ "clr %0\n\t" "0:\n\t" : "=r" (ret), "+r" (new_val) : "r" (addr), "0" (old) : "memory", "cc"); return (int)ret; } #define AO_HAVE_compare_and_swap_full /* TODO: implement AO_fetch_compare_and_swap. */ #endif /* !AO_NO_SPARC_V9 */ /* TODO: Extend this for SPARC v8 and v9 (V8 also has swap, V9 has CAS, */ /* there are barriers like membar #LoadStore, CASA (32-bit) and */ /* CASXA (64-bit) instructions added in V9). */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h0000755000175000017500000003544512456307241024436 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * * Some of the machine specific code was borrowed from our GC distribution. */ /* The following really assume we have a 486 or better. Unfortunately */ /* gcc doesn't define a suitable feature test macro based on command */ /* line options. */ /* We should perhaps test dynamically. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #if defined(__SSE2__) && !defined(AO_USE_PENTIUM4_INSTRS) /* "mfence" is a part of SSE2 set (introduced on Intel Pentium 4). */ # define AO_USE_PENTIUM4_INSTRS #endif #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm__ __volatile__("mfence" : : : "memory"); } # define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif /* !AO_USE_PENTIUM4_INSTRS */ /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Really only works for 486 and later */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add_full (volatile AO_t *p, AO_t incr) { AO_t result; __asm__ __volatile__ ("lock; xadd %0, %1" : "=r" (result), "=m" (*p) : "0" (incr), "m" (*p) : "memory"); return result; } # define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned char AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr) { unsigned char result; __asm__ __volatile__ ("lock; xaddb %0, %1" : "=q" (result), "=m" (*p) : "0" (incr), "m" (*p) : "memory"); return result; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr) { unsigned short result; __asm__ __volatile__ ("lock; xaddw %0, %1" : "=r" (result), "=m" (*p) : "0" (incr), "m" (*p) : "memory"); return result; } #define AO_HAVE_short_fetch_and_add_full #ifndef AO_PREFER_GENERALIZED /* Really only works for 486 and later */ AO_INLINE void AO_and_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; and %1, %0" : "=m" (*p) : "r" (value), "m" (*p) : "memory"); } # define AO_HAVE_and_full AO_INLINE void AO_or_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; or %1, %0" : "=m" (*p) : "r" (value), "m" (*p) : "memory"); } # define AO_HAVE_or_full AO_INLINE void AO_xor_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; xor %1, %0" : "=m" (*p) : "r" (value), "m" (*p) : "memory"); } # define AO_HAVE_xor_full /* AO_store_full could be implemented directly using "xchg" but it */ /* could be generalized efficiently as an ordinary store accomplished */ /* with AO_nop_full ("mfence" instruction). */ #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { unsigned char oldval; /* Note: the "xchg" instruction does not need a "lock" prefix */ __asm__ __volatile__ ("xchgb %0, %1" : "=q" (oldval), "=m" (*addr) : "0" ((unsigned char)0xff), "m" (*addr) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return (int)__sync_bool_compare_and_swap(addr, old, new_val /* empty protection list */); /* Note: an empty list of variables protected by the */ /* memory barrier should mean all globally accessible */ /* variables are protected. */ # else char result; __asm__ __volatile__ ("lock; cmpxchg %3, %0; setz %1" : "=m" (*addr), "=a" (result) : "m" (*addr), "r" (new_val), "a" (old) : "memory"); return (int)result; # endif } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_USE_SYNC_CAS_BUILTIN return __sync_val_compare_and_swap(addr, old_val, new_val /* empty protection list */); # else AO_t fetched_val; __asm__ __volatile__ ("lock; cmpxchg %3, %4" : "=a" (fetched_val), "=m" (*addr) : "a" (old_val), "r" (new_val), "m" (*addr) : "memory"); return fetched_val; # endif } #define AO_HAVE_fetch_compare_and_swap_full #if !defined(__x86_64__) && !defined(AO_USE_SYNC_CAS_BUILTIN) # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically on at least a Pentium according to */ /* Chapter 8.1.1 of Volume 3A Part 1 of Intel processor manuals. */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* Returns nonzero if the comparison succeeded. */ /* Really requires at least a Pentium. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; # ifdef __PIC__ AO_t saved_ebx; /* If PIC is turned on, we cannot use ebx as it is reserved for the */ /* GOT pointer. We should save and restore ebx. The proposed */ /* solution is not so efficient as the older alternatives using */ /* push ebx or edi as new_val1 (w/o clobbering edi and temporary */ /* local variable usage) but it is more portable (it works even if */ /* ebx is not used as GOT pointer, and it works for the buggy GCC */ /* releases that incorrectly evaluate memory operands offset in the */ /* inline assembly after push). */ # ifdef __OPTIMIZE__ __asm__ __volatile__("mov %%ebx, %2\n\t" /* save ebx */ "lea %0, %%edi\n\t" /* in case addr is in ebx */ "mov %7, %%ebx\n\t" /* load new_val1 */ "lock; cmpxchg8b (%%edi)\n\t" "mov %2, %%ebx\n\t" /* restore ebx */ "setz %1" : "=m" (*addr), "=a" (result), "=m" (saved_ebx) : "m" (*addr), "d" (old_val2), "a" (old_val1), "c" (new_val2), "m" (new_val1) : "%edi", "memory"); # else /* A less-efficient code manually preserving edi if GCC invoked */ /* with -O0 option (otherwise it fails while finding a register */ /* in class 'GENERAL_REGS'). */ AO_t saved_edi; __asm__ __volatile__("mov %%edi, %3\n\t" /* save edi */ "mov %%ebx, %2\n\t" /* save ebx */ "lea %0, %%edi\n\t" /* in case addr is in ebx */ "mov %8, %%ebx\n\t" /* load new_val1 */ "lock; cmpxchg8b (%%edi)\n\t" "mov %2, %%ebx\n\t" /* restore ebx */ "mov %3, %%edi\n\t" /* restore edi */ "setz %1" : "=m" (*addr), "=a" (result), "=m" (saved_ebx), "=m" (saved_edi) : "m" (*addr), "d" (old_val2), "a" (old_val1), "c" (new_val2), "m" (new_val1) : "memory"); # endif # else /* For non-PIC mode, this operation could be simplified (and be */ /* faster) by using ebx as new_val1 (GCC would refuse to compile */ /* such code for PIC mode). */ __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1" : "=m" (*addr), "=a" (result) : "m" (*addr), "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); # endif return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # define AO_T_IS_INT #elif defined(__ILP32__) || !defined(__x86_64__) # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* X32 has native support for 64-bit integer operations (AO_double_t */ /* is a 64-bit integer and we could use 64-bit cmpxchg). */ /* This primitive is used by compare_double_and_swap_double_full. */ AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { /* It is safe to use __sync CAS built-in here. */ return __sync_bool_compare_and_swap(&addr->AO_whole, old_val.AO_whole, new_val.AO_whole /* empty protection list */); } # define AO_HAVE_double_compare_and_swap_full # define AO_T_IS_INT #else /* 64-bit */ AO_INLINE unsigned int AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr) { unsigned int result; __asm__ __volatile__ ("lock; xaddl %0, %1" : "=r" (result), "=m" (*p) : "0" (incr), "m" (*p) : "memory"); return result; } # define AO_HAVE_int_fetch_and_add_full /* The Intel and AMD Architecture Programmer Manuals state roughly */ /* the following: */ /* - CMPXCHG16B (with a LOCK prefix) can be used to perform 16-byte */ /* atomic accesses in 64-bit mode (with certain alignment */ /* restrictions); */ /* - SSE instructions that access data larger than a quadword (like */ /* MOVDQA) may be implemented using multiple memory accesses; */ /* - LOCK prefix causes an invalid-opcode exception when used with */ /* 128-bit media (SSE) instructions. */ /* Thus, currently, the only way to implement lock-free double_load */ /* and double_store on x86_64 is to use CMPXCHG16B (if available). */ /* TODO: Test some gcc macro to detect presence of cmpxchg16b. */ # ifdef AO_CMPXCHG16B_AVAILABLE # include "../standard_ao_double_t.h" /* NEC LE-IT: older AMD Opterons are missing this instruction. */ /* On these machines SIGILL will be thrown. */ /* Define AO_WEAK_DOUBLE_CAS_EMULATION to have an emulated (lock */ /* based) version available. */ /* HB: Changed this to not define either by default. There are */ /* enough machines and tool chains around on which cmpxchg16b */ /* doesn't work. And the emulation is unsafe by our usual rules. */ /* However both are clearly useful in certain cases. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; __asm__ __volatile__("lock; cmpxchg16b %0; setz %1" : "=m"(*addr), "=a"(result) : "m"(*addr), "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # elif defined(AO_WEAK_DOUBLE_CAS_EMULATION) # include "../standard_ao_double_t.h" /* This one provides spinlock based emulation of CAS implemented in */ /* atomic_ops.c. We probably do not want to do this here, since it */ /* is not atomic with respect to other kinds of updates of *addr. */ /* On the other hand, this may be a useful facility on occasion. */ int AO_compare_double_and_swap_double_emulation( volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2); AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { return AO_compare_double_and_swap_double_emulation(addr, old_val1, old_val2, new_val1, new_val2); } # define AO_HAVE_compare_double_and_swap_double_full # endif /* AO_WEAK_DOUBLE_CAS_EMULATION && !AO_CMPXCHG16B_AVAILABLE */ #endif /* x86_64 && !ILP32 */ /* Real X86 implementations, except for some old 32-bit WinChips, */ /* appear to enforce ordering between memory operations, EXCEPT that */ /* a later read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore both the WinChips and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h0000755000175000017500000002576312456307241026402 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ /* The following is useful primarily for debugging and documentation. */ /* We define various atomic operations by acquiring a global pthread */ /* lock. The resulting implementation will perform poorly, but should */ /* be correct unless it is used from signal handlers. */ /* We assume that all pthread operations act like full memory barriers. */ /* (We believe that is the intent of the specification.) */ #include #include "test_and_set_t_is_ao_t.h" /* This is not necessarily compatible with the native */ /* implementation. But those can't be safely mixed anyway. */ /* We define only the full barrier variants, and count on the */ /* generalization section below to fill in the rest. */ extern pthread_mutex_t AO_pt_lock; AO_INLINE void AO_nop_full(void) { pthread_mutex_lock(&AO_pt_lock); pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_nop_full AO_INLINE AO_t AO_load_full(const volatile AO_t *addr) { AO_t result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_load_full AO_INLINE void AO_store_full(volatile AO_t *addr, AO_t val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_store_full AO_INLINE unsigned char AO_char_load_full(const volatile unsigned char *addr) { unsigned char result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_char_load_full AO_INLINE void AO_char_store_full(volatile unsigned char *addr, unsigned char val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_store_full AO_INLINE unsigned short AO_short_load_full(const volatile unsigned short *addr) { unsigned short result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_short_load_full AO_INLINE void AO_short_store_full(volatile unsigned short *addr, unsigned short val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_store_full AO_INLINE unsigned int AO_int_load_full(const volatile unsigned int *addr) { unsigned int result; pthread_mutex_lock(&AO_pt_lock); result = *addr; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_int_load_full AO_INLINE void AO_int_store_full(volatile unsigned int *addr, unsigned int val) { pthread_mutex_lock(&AO_pt_lock); *addr = val; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_store_full AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; pthread_mutex_lock(&AO_pt_lock); result = (AO_TS_VAL_t)(*addr); *addr = AO_TS_SET; pthread_mutex_unlock(&AO_pt_lock); assert(result == AO_TS_SET || result == AO_TS_CLEAR); return result; } #define AO_HAVE_test_and_set_full AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *p, AO_t incr) { AO_t old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_fetch_and_add_full AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { unsigned char old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { unsigned short old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_short_fetch_and_add_full AO_INLINE unsigned int AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr) { unsigned int old_val; pthread_mutex_lock(&AO_pt_lock); old_val = *p; *p = old_val + incr; pthread_mutex_unlock(&AO_pt_lock); return old_val; } #define AO_HAVE_int_fetch_and_add_full AO_INLINE void AO_and_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_and_full AO_INLINE void AO_or_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_or_full AO_INLINE void AO_xor_full(volatile AO_t *p, AO_t value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_xor_full AO_INLINE void AO_char_and_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_and_full AO_INLINE void AO_char_or_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_or_full AO_INLINE void AO_char_xor_full(volatile unsigned char *p, unsigned char value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_char_xor_full AO_INLINE void AO_short_and_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_and_full AO_INLINE void AO_short_or_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_or_full AO_INLINE void AO_short_xor_full(volatile unsigned short *p, unsigned short value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_short_xor_full AO_INLINE void AO_int_and_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p &= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_and_full AO_INLINE void AO_int_or_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p |= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_or_full AO_INLINE void AO_int_xor_full(volatile unsigned *p, unsigned value) { pthread_mutex_lock(&AO_pt_lock); *p ^= value; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_int_xor_full AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_full AO_INLINE unsigned char AO_char_fetch_compare_and_swap_full(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { unsigned char fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_char_fetch_compare_and_swap_full AO_INLINE unsigned short AO_short_fetch_compare_and_swap_full(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { unsigned short fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_short_fetch_compare_and_swap_full AO_INLINE unsigned AO_int_fetch_compare_and_swap_full(volatile unsigned *addr, unsigned old_val, unsigned new_val) { unsigned fetched_val; pthread_mutex_lock(&AO_pt_lock); fetched_val = *addr; if (fetched_val == old_val) *addr = new_val; pthread_mutex_unlock(&AO_pt_lock); return fetched_val; } #define AO_HAVE_int_fetch_compare_and_swap_full /* Unlike real architectures, we define both double-width CAS variants. */ typedef struct { AO_t AO_val1; AO_t AO_val2; } AO_double_t; #define AO_HAVE_double_t #define AO_DOUBLE_T_INITIALIZER { (AO_t)0, (AO_t)0 } AO_INLINE AO_double_t AO_double_load_full(const volatile AO_double_t *addr) { AO_double_t result; pthread_mutex_lock(&AO_pt_lock); result.AO_val1 = addr->AO_val1; result.AO_val2 = addr->AO_val2; pthread_mutex_unlock(&AO_pt_lock); return result; } #define AO_HAVE_double_load_full AO_INLINE void AO_double_store_full(volatile AO_double_t *addr, AO_double_t value) { pthread_mutex_lock(&AO_pt_lock); addr->AO_val1 = value.AO_val1; addr->AO_val2 = value.AO_val2; pthread_mutex_unlock(&AO_pt_lock); } #define AO_HAVE_double_store_full AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old1, AO_t old2, AO_t new1, AO_t new2) { pthread_mutex_lock(&AO_pt_lock); if (addr -> AO_val1 == old1 && addr -> AO_val2 == old2) { addr -> AO_val1 = new1; addr -> AO_val2 = new2; pthread_mutex_unlock(&AO_pt_lock); return 1; } else pthread_mutex_unlock(&AO_pt_lock); return 0; } #define AO_HAVE_compare_double_and_swap_double_full AO_INLINE int AO_compare_and_swap_double_full(volatile AO_double_t *addr, AO_t old1, AO_t new1, AO_t new2) { pthread_mutex_lock(&AO_pt_lock); if (addr -> AO_val1 == old1) { addr -> AO_val1 = new1; addr -> AO_val2 = new2; pthread_mutex_unlock(&AO_pt_lock); return 1; } else pthread_mutex_unlock(&AO_pt_lock); return 0; } #define AO_HAVE_compare_and_swap_double_full /* We can't use hardware loads and stores, since they don't */ /* interact correctly with atomic updates. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h0000755000175000017500000001013712456307241024746 0ustar jnthnjnthn/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * 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. * * Derived from the corresponding header file for gcc. */ #include "../loadstore/atomic_load.h" #include "../loadstore/atomic_store.h" /* Some architecture set descriptions include special "ordered" memory */ /* operations. As far as we can tell, no existing processors actually */ /* require those. Nor does it appear likely that future processors */ /* will. */ /* FIXME: The PA emulator on Itanium may obey weaker restrictions. */ /* There should be a mode in which we don't assume sequential */ /* consistency here. */ #include "../ordered.h" #include /* GCC will not guarantee the alignment we need, use four lock words */ /* and select the correctly aligned datum. See the glibc 2.3.2 */ /* linuxthread port for the original implementation. */ struct AO_pa_clearable_loc { int data[4]; }; #undef AO_TS_INITIALIZER #define AO_TS_t struct AO_pa_clearable_loc #define AO_TS_INITIALIZER {1,1,1,1} /* Switch meaning of set and clear, since we only have an atomic clear */ /* instruction. */ typedef enum {AO_PA_TS_set = 0, AO_PA_TS_clear = 1} AO_PA_TS_val; #define AO_TS_VAL_t AO_PA_TS_val #define AO_TS_CLEAR AO_PA_TS_clear #define AO_TS_SET AO_PA_TS_set /* The hppa only has one atomic read and modify memory operation, */ /* load and clear, so hppa spinlocks must use zero to signify that */ /* someone is holding the lock. The address used for the ldcw */ /* semaphore must be 16-byte aligned. */ #define AO_ldcw(a, ret) \ _LDCWX(0 /* index */, 0 /* s */, a /* base */, ret) /* Because malloc only guarantees 8-byte alignment for malloc'd data, */ /* and GCC only guarantees 8-byte alignment for stack locals, we can't */ /* be assured of 16-byte alignment for atomic lock data even if we */ /* specify "__attribute ((aligned(16)))" in the type declaration. So, */ /* we use a struct containing an array of four ints for the atomic lock */ /* type and dynamically select the 16-byte aligned int from the array */ /* for the semaphore. */ #define AO_PA_LDCW_ALIGNMENT 16 #define AO_ldcw_align(addr) \ ((volatile unsigned *)(((unsigned long)(addr) \ + (AO_PA_LDCW_ALIGNMENT - 1)) \ & ~(AO_PA_LDCW_ALIGNMENT - 1))) /* Works on PA 1.1 and PA 2.0 systems */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t * addr) { register unsigned int ret; register unsigned long a = (unsigned long)AO_ldcw_align(addr); AO_ldcw(a, ret); return (AO_TS_VAL_t)ret; } #define AO_HAVE_test_and_set_full AO_INLINE void AO_pa_clear(volatile AO_TS_t * addr) { volatile unsigned *a = AO_ldcw_align(addr); AO_compiler_barrier(); *a = 1; } #define AO_CLEAR(addr) AO_pa_clear(addr) MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h0000755000175000017500000001162712456307241024566 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* * This file specifies Itanimum primitives for use with the HP compiler * under HP/UX. We use intrinsics instead of the inline assembly code in the * gcc file. */ #include "../all_atomic_load_store.h" #include "../all_acquire_release_volatile.h" #include "../test_and_set_t_is_char.h" #include #ifdef __LP64__ # define AO_T_FASIZE _FASZ_D # define AO_T_SIZE _SZ_D #else # define AO_T_FASIZE _FASZ_W # define AO_T_SIZE _SZ_W #endif AO_INLINE void AO_nop_full(void) { _Asm_mf(); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, 1, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, 1, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_ACQ, p, -1, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release (volatile AO_t *p) { return _Asm_fetchadd(AO_T_FASIZE, _SEM_REL, p, -1, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(AO_T_SIZE, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(AO_T_SIZE, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _DOWN_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_ACQ, addr, new_val, _LDHINT_NONE, _DOWN_MEM_FENCE); } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { _Asm_mov_to_ar(_AREG_CCV, old_val, _UP_MEM_FENCE); return _Asm_cmpxchg(_SZ_B, _SEM_REL, addr, new_val, _LDHINT_NONE, _UP_MEM_FENCE); } #define AO_HAVE_short_fetch_compare_and_swap_release #ifndef __LP64__ # define AO_T_IS_INT #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h0000755000175000017500000000757012456307241025644 0ustar jnthnjnthn/* FIXME. This is only a placeholder for the AIX compiler. */ /* It doesn't work. Please send a patch. */ /* Memory model documented at http://www-106.ibm.com/developerworks/ */ /* eserver/articles/archguide.html and (clearer) */ /* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */ /* There appears to be no implicit ordering between any kind of */ /* independent memory references. */ /* Architecture enforces some ordering based on control dependence. */ /* I don't know if that could help. */ /* Data-dependent loads are always ordered. */ /* Based on the above references, eieio is intended for use on */ /* uncached memory, which we don't support. It does not order loads */ /* from cached memory. */ /* Thanks to Maged Michael, Doug Lea, and Roger Hoover for helping to */ /* track some of this down and correcting my misunderstandings. -HB */ #include "../all_aligned_atomic_load_store.h" void AO_sync(void); #pragma mc_func AO_sync { "7c0004ac" } #ifdef __NO_LWSYNC__ # define AO_lwsync AO_sync #else void AO_lwsync(void); #pragma mc_func AO_lwsync { "7c2004ac" } #endif #define AO_nop_write() AO_lwsync() #define AO_HAVE_nop_write #define AO_nop_read() AO_lwsync() #define AO_HAVE_nop_read /* We explicitly specify load_acquire and store_release, since these */ /* rely on the fact that lwsync is also a LoadStore barrier. */ AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = *addr; AO_lwsync(); return result; } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t value) { AO_lwsync(); *addr = value; } #define AO_HAVE_store_release #ifndef AO_PREFER_GENERALIZED /* This is similar to the code in the garbage collector. Deleting */ /* this and having it synthesized from compare_and_swap would probably */ /* only cost us a load immediate instruction. */ /*AO_INLINE AO_TS_VAL_t AO_test_and_set(volatile AO_TS_t *addr) { # error FIXME Implement me } #define AO_HAVE_test_and_set*/ AO_INLINE AO_TS_VAL_t AO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_acquire AO_INLINE AO_TS_VAL_t AO_test_and_set_release(volatile AO_TS_t *addr) { AO_lwsync(); return AO_test_and_set(addr); } #define AO_HAVE_test_and_set_release AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; AO_lwsync(); result = AO_test_and_set(addr); AO_lwsync(); return result; } #define AO_HAVE_test_and_set_full #endif /* !AO_PREFER_GENERALIZED */ /*AO_INLINE AO_t AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # error FIXME Implement me } #define AO_HAVE_fetch_compare_and_swap*/ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_lwsync(); return AO_fetch_compare_and_swap(addr, old_val, new_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t result; AO_lwsync(); result = AO_fetch_compare_and_swap(addr, old_val, new_val); AO_lwsync(); return result; } #define AO_HAVE_fetch_compare_and_swap_full /* TODO: Implement AO_fetch_and_add, AO_and/or/xor directly. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h0000755000175000017500000001443212456307241024547 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ /* * This file specifies Itanimum primitives for use with the Intel (ecc) * compiler. We use intrinsics instead of the inline assembly code in the * gcc file. */ #include "../all_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #include /* The acquire release semantics of volatile can be turned off. And volatile */ /* operations in icc9 don't imply ordering with respect to other nonvolatile */ /* operations. */ #define AO_INTEL_PTR_t void * AO_INLINE AO_t AO_load_acquire(const volatile AO_t *p) { return (AO_t)(__ld8_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *p, AO_t val) { __st8_rel((AO_INTEL_PTR_t)p, (__int64)val); } #define AO_HAVE_store_release AO_INLINE unsigned char AO_char_load_acquire(const volatile unsigned char *p) { /* A normal volatile load generates an ld.acq */ return (__ld1_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_char_load_acquire AO_INLINE void AO_char_store_release(volatile unsigned char *p, unsigned char val) { __st1_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_char_store_release AO_INLINE unsigned short AO_short_load_acquire(const volatile unsigned short *p) { /* A normal volatile load generates an ld.acq */ return (__ld2_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_short_load_acquire AO_INLINE void AO_short_store_release(volatile unsigned short *p, unsigned short val) { __st2_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_short_store_release AO_INLINE unsigned int AO_int_load_acquire(const volatile unsigned int *p) { /* A normal volatile load generates an ld.acq */ return (__ld4_acq((AO_INTEL_PTR_t)p)); } #define AO_HAVE_int_load_acquire AO_INLINE void AO_int_store_release(volatile unsigned int *p, unsigned int val) { __st4_rel((AO_INTEL_PTR_t)p, val); } #define AO_HAVE_int_store_release AO_INLINE void AO_nop_full(void) { __mf(); } #define AO_HAVE_nop_full #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add1_acquire(volatile AO_t *p) { return __fetchadd8_acq((unsigned __int64 *)p, 1); } #define AO_HAVE_fetch_and_add1_acquire AO_INLINE AO_t AO_fetch_and_add1_release(volatile AO_t *p) { return __fetchadd8_rel((unsigned __int64 *)p, 1); } #define AO_HAVE_fetch_and_add1_release AO_INLINE AO_t AO_fetch_and_sub1_acquire(volatile AO_t *p) { return __fetchadd8_acq((unsigned __int64 *)p, -1); } #define AO_HAVE_fetch_and_sub1_acquire AO_INLINE AO_t AO_fetch_and_sub1_release(volatile AO_t *p) { return __fetchadd8_rel((unsigned __int64 *)p, -1); } #define AO_HAVE_fetch_and_sub1_release #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_acquire(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return _InterlockedCompareExchange64_acq(addr, new_val, old_val); } #define AO_HAVE_fetch_compare_and_swap_acquire AO_INLINE AO_t AO_fetch_compare_and_swap_release(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return _InterlockedCompareExchange64_rel(addr, new_val, old_val); } #define AO_HAVE_fetch_compare_and_swap_release AO_INLINE unsigned char AO_char_fetch_compare_and_swap_acquire(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_acq(addr, new_val, old_val); } #define AO_HAVE_char_fetch_compare_and_swap_acquire AO_INLINE unsigned char AO_char_fetch_compare_and_swap_release(volatile unsigned char *addr, unsigned char old_val, unsigned char new_val) { return _InterlockedCompareExchange8_rel(addr, new_val, old_val); } #define AO_HAVE_char_fetch_compare_and_swap_release AO_INLINE unsigned short AO_short_fetch_compare_and_swap_acquire(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_acq(addr, new_val, old_val); } #define AO_HAVE_short_fetch_compare_and_swap_acquire AO_INLINE unsigned short AO_short_fetch_compare_and_swap_release(volatile unsigned short *addr, unsigned short old_val, unsigned short new_val) { return _InterlockedCompareExchange16_rel(addr, new_val, old_val); } #define AO_HAVE_short_fetch_compare_and_swap_release AO_INLINE unsigned int AO_int_fetch_compare_and_swap_acquire(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_acq(addr, new_val, old_val); } #define AO_HAVE_int_fetch_compare_and_swap_acquire AO_INLINE unsigned int AO_int_fetch_compare_and_swap_release(volatile unsigned int *addr, unsigned int old_val, unsigned int new_val) { return _InterlockedCompareExchange_rel(addr, new_val, old_val); } #define AO_HAVE_int_fetch_compare_and_swap_release MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h0000755000175000017500000000500012456307241032261 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif #endif AO_INLINE AO_t AO_load_acquire(const volatile AO_t *addr) { AO_t result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_load_acquire AO_INLINE void AO_store_release(volatile AO_t *addr, AO_t new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_store_release ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.templateMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.temp0000755000175000017500000000504212456307241033005 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif #endif AO_INLINE XCTYPE AO_XSIZE_load_acquire(const volatile XCTYPE *addr) { XCTYPE result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_XSIZE_load_acquire AO_INLINE void AO_XSIZE_store_release(volatile XCTYPE *addr, XCTYPE new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_XSIZE_store_release MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h0000755000175000017500000000325312456307241027514 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE AO_t AO_load(const volatile AO_t *addr) { # ifdef AO_ACCESS_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const AO_t *)addr; } #define AO_HAVE_load MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template0000755000175000017500000000330312456307241031074 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE XCTYPE AO_XSIZE_load(const volatile XCTYPE *addr) { # ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const XCTYPE *)addr; } #define AO_HAVE_XSIZE_load MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h0000755000175000017500000000305412456307241027730 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_store(volatile AO_t *addr, AO_t new_val) { # ifdef AO_ACCESS_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif *(AO_t *)addr = new_val; } #define AO_HAVE_store MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template0000755000175000017500000000310412456307241031310 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_XSIZE_store(volatile XCTYPE *addr, XCTYPE new_val) { # ifdef AO_ACCESS_XSIZE_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif *(XCTYPE *)addr = new_val; } #define AO_HAVE_XSIZE_store ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.hMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile0000755000175000017500000000512012456307241033033 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif #endif AO_INLINE unsigned/**/char AO_char_load_acquire(const volatile unsigned/**/char *addr) { unsigned/**/char result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_char_load_acquire AO_INLINE void AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_char_store_release MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h0000755000175000017500000000333612456307241030513 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned/**/char AO_char_load(const volatile unsigned/**/char *addr) { # ifdef AO_ACCESS_char_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned/**/char *)addr; } #define AO_HAVE_char_load MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h0000755000175000017500000000313712456307241030727 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char new_val) { # ifdef AO_ACCESS_char_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif *(unsigned/**/char *)addr = new_val; } #define AO_HAVE_char_store MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h0000755000175000017500000000375012456307241032264 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which AO_double_t loads and stores */ /* are atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE AO_double_t AO_double_load(const volatile AO_double_t *addr) { AO_double_t result; # ifdef AO_ACCESS_double_CHECK_ALIGNED assert(((size_t)addr & (sizeof(AO_double_t) - 1)) == 0); # endif /* Cast away the volatile in case it adds fence semantics. */ result.AO_whole = ((const AO_double_t *)addr)->AO_whole; return result; } #define AO_HAVE_double_load AO_INLINE void AO_double_store(volatile AO_double_t *addr, AO_double_t new_val) { # ifdef AO_ACCESS_double_CHECK_ALIGNED assert(((size_t)addr & (sizeof(AO_double_t) - 1)) == 0); # endif ((AO_double_t *)addr)->AO_whole = new_val.AO_whole; } #define AO_HAVE_double_store ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.hMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.0000755000175000017500000000504412456307241032773 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif #endif AO_INLINE unsigned AO_int_load_acquire(const volatile unsigned *addr) { unsigned result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_int_load_acquire AO_INLINE void AO_int_store_release(volatile unsigned *addr, unsigned new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_int_store_release MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h0000755000175000017500000000330312456307241030362 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned AO_int_load(const volatile unsigned *addr) { # ifdef AO_ACCESS_int_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned *)addr; } #define AO_HAVE_int_load MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h0000755000175000017500000000310412456307241030576 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_int_store(volatile unsigned *addr, unsigned new_val) { # ifdef AO_ACCESS_int_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif *(unsigned *)addr = new_val; } #define AO_HAVE_int_store MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h0000755000175000017500000001503512456307241031111 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_char_load /* char_load_read is defined in generalize-small. */ # define AO_char_load_acquire(addr) AO_char_load_read(addr) # define AO_HAVE_char_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_short_load /* short_load_read is defined in generalize-small. */ # define AO_short_load_acquire(addr) AO_short_load_read(addr) # define AO_HAVE_short_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_int_load /* int_load_read is defined in generalize-small. */ # define AO_int_load_acquire(addr) AO_int_load_read(addr) # define AO_HAVE_int_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_load /* load_read is defined in generalize-small. */ # define AO_load_acquire(addr) AO_load_read(addr) # define AO_HAVE_load_acquire #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_double_load /* double_load_read is defined in generalize-small. */ # define AO_double_load_acquire(addr) AO_double_load_read(addr) # define AO_HAVE_double_load_acquire #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template0000755000175000017500000000250112456307241032467 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_XSIZE_load /* XSIZE_load_read is defined in generalize-small. */ # define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_read(addr) # define AO_HAVE_XSIZE_load_acquire #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h0000755000175000017500000001505712456307241031332 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_char_store # define AO_char_store_release(addr, val) \ (AO_nop_write(), AO_char_store(addr, val)) # define AO_HAVE_char_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_short_store # define AO_short_store_release(addr, val) \ (AO_nop_write(), AO_short_store(addr, val)) # define AO_HAVE_short_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_int_store # define AO_int_store_release(addr, val) \ (AO_nop_write(), AO_int_store(addr, val)) # define AO_HAVE_int_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_store # define AO_store_release(addr, val) \ (AO_nop_write(), AO_store(addr, val)) # define AO_HAVE_store_release #endif /* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_double_store # define AO_double_store_release(addr, val) \ (AO_nop_write(), AO_double_store(addr, val)) # define AO_HAVE_double_store_release #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template0000755000175000017500000000250312456307241032706 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ #ifdef AO_HAVE_XSIZE_store # define AO_XSIZE_store_release(addr, val) \ (AO_nop_write(), AO_XSIZE_store(addr, val)) # define AO_HAVE_XSIZE_store_release #endif ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.hMoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatil0000755000175000017500000000513112456307241033112 0ustar jnthnjnthn/* * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file adds definitions appropriate for environments in which */ /* volatile load of a given type has acquire semantics, and volatile */ /* store of a given type has release semantics. This is arguably */ /* supposed to be true with the standard Itanium software conventions. */ /* Empirically gcc/ia64 does some reordering of ordinary operations */ /* around volatiles even when we think it should not. GCC v3.3 and */ /* earlier could reorder a volatile store with another store. As of */ /* March 2005, gcc pre-4 reuses some previously computed common */ /* subexpressions across a volatile load; hence, we now add compiler */ /* barriers for gcc. */ #ifndef AO_GCC_BARRIER /* TODO: Check GCC version (if workaround not needed for modern GCC). */ # if defined(__GNUC__) # define AO_GCC_BARRIER() AO_compiler_barrier() # else # define AO_GCC_BARRIER() (void)0 # endif #endif AO_INLINE unsigned/**/short AO_short_load_acquire(const volatile unsigned/**/short *addr) { unsigned/**/short result = *addr; /* A normal volatile load generates an ld.acq (on IA-64). */ AO_GCC_BARRIER(); return result; } #define AO_HAVE_short_load_acquire AO_INLINE void AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short new_val) { AO_GCC_BARRIER(); /* A normal volatile store generates an st.rel (on IA-64). */ *addr = new_val; } #define AO_HAVE_short_store_release MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h0000755000175000017500000000334412456307241030734 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which loads of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE unsigned/**/short AO_short_load(const volatile unsigned/**/short *addr) { # ifdef AO_ACCESS_short_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif /* Cast away the volatile for architectures like IA64 where */ /* volatile adds barrier (fence) semantics. */ return *(const unsigned/**/short *)addr; } #define AO_HAVE_short_load MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h0000755000175000017500000000314512456307241031150 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* Definitions for architectures on which stores of given type are */ /* atomic (either for suitably aligned data only or for any legal */ /* alignment). */ AO_INLINE void AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short new_val) { # ifdef AO_ACCESS_short_CHECK_ALIGNED assert(((size_t)addr & (sizeof(*addr) - 1)) == 0); # endif *(unsigned/**/short *)addr = new_val; } #define AO_HAVE_short_store MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h0000755000175000017500000000470212456307241025140 0ustar jnthnjnthn/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * 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. */ #ifndef AO_ASSUME_WINDOWS98 /* CAS is always available */ # define AO_ASSUME_WINDOWS98 #endif #include "common32_defs.h" /* FIXME: Do _InterlockedOps really have a full memory barrier? */ /* (MSDN WinCE docs say nothing about it.) */ #include "../test_and_set_t_is_ao_t.h" /* AO_test_and_set_full() is emulated using CAS. */ /* Some ARM slide set, if it has been read correctly, claims that Loads */ /* followed by either a Load or a Store are ordered, but nothing else. */ /* It is assumed that Windows interrupt handlers clear the LL/SC flag. */ /* Unaligned accesses are not guaranteed to be atomic. */ #include "../all_aligned_atomic_load_store.h" /* If only a single processor is used, we can define AO_UNIPROCESSOR. */ #ifdef AO_UNIPROCESSOR AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } # define AO_HAVE_nop_full #else /* AO_nop_full() is emulated using AO_test_and_set_full(). */ #endif #if _M_ARM >= 6 /* ARMv6 is the first architecture providing support for simple LL/SC. */ /* #include "../standard_ao_double_t.h" */ /* TODO: implement double-wide operations (similar to x86). */ #else /* _M_ARM < 6 */ /* TODO: implement AO_test_and_set_full using SWP. */ #endif /* _M_ARM < 6 */ #define AO_T_IS_INT MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h0000755000175000017500000001064612456307241027023 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* This file contains AO primitives based on VC++ built-in intrinsic */ /* functions commonly available across 32-bit architectures. */ /* This file should be included from arch-specific header files. */ /* Define AO_USE_INTERLOCKED_INTRINSICS if _Interlocked primitives */ /* (used below) are available as intrinsic ones for a target arch */ /* (otherwise "Interlocked" functions family is used instead). */ /* Define AO_ASSUME_WINDOWS98 if CAS is available. */ #include /* Seems like over-kill, but that's what MSDN recommends. */ /* And apparently winbase.h is not always self-contained. */ #if _MSC_VER < 1310 || !defined(AO_USE_INTERLOCKED_INTRINSICS) # define _InterlockedIncrement InterlockedIncrement # define _InterlockedDecrement InterlockedDecrement # define _InterlockedExchangeAdd InterlockedExchangeAdd # define _InterlockedCompareExchange InterlockedCompareExchange # define AO_INTERLOCKED_VOLATILE /**/ #else /* elif _MSC_VER >= 1310 */ # if _MSC_VER >= 1400 # ifndef _WIN32_WCE # include # endif # else /* elif _MSC_VER < 1400 */ # ifdef __cplusplus extern "C" { # endif LONG __cdecl _InterlockedIncrement(LONG volatile *); LONG __cdecl _InterlockedDecrement(LONG volatile *); LONG __cdecl _InterlockedExchangeAdd(LONG volatile *, LONG); LONG __cdecl _InterlockedCompareExchange(LONG volatile *, LONG /* Exchange */, LONG /* Comp */); # ifdef __cplusplus } # endif # endif /* _MSC_VER < 1400 */ # if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98) # pragma intrinsic (_InterlockedIncrement) # pragma intrinsic (_InterlockedDecrement) # pragma intrinsic (_InterlockedExchangeAdd) # endif /* !AO_PREFER_GENERALIZED */ # pragma intrinsic (_InterlockedCompareExchange) # define AO_INTERLOCKED_VOLATILE volatile #endif /* _MSC_VER >= 1310 */ #if !defined(AO_PREFER_GENERALIZED) || !defined(AO_ASSUME_WINDOWS98) AO_INLINE AO_t AO_fetch_and_add_full(volatile AO_t *p, AO_t incr) { return _InterlockedExchangeAdd((LONG AO_INTERLOCKED_VOLATILE *)p, (LONG)incr); } #define AO_HAVE_fetch_and_add_full AO_INLINE AO_t AO_fetch_and_add1_full(volatile AO_t *p) { return _InterlockedIncrement((LONG AO_INTERLOCKED_VOLATILE *)p) - 1; } #define AO_HAVE_fetch_and_add1_full AO_INLINE AO_t AO_fetch_and_sub1_full(volatile AO_t *p) { return _InterlockedDecrement((LONG AO_INTERLOCKED_VOLATILE *)p) + 1; } #define AO_HAVE_fetch_and_sub1_full #endif /* !AO_PREFER_GENERALIZED */ #ifdef AO_ASSUME_WINDOWS98 AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { # ifdef AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE return (AO_t)_InterlockedCompareExchange( (PVOID AO_INTERLOCKED_VOLATILE *)addr, (PVOID)new_val, (PVOID)old_val); # else return (AO_t)_InterlockedCompareExchange( (LONG AO_INTERLOCKED_VOLATILE *)addr, (LONG)new_val, (LONG)old_val); # endif } # define AO_HAVE_fetch_compare_and_swap_full #endif /* AO_ASSUME_WINDOWS98 */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h0000755000175000017500000001177012456307241025011 0ustar jnthnjnthn/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * 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. */ /* If AO_ASSUME_WINDOWS98 is defined, we assume Windows 98 or newer. */ /* If AO_ASSUME_VISTA is defined, we assume Windows Server 2003, Vista */ /* or later. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #if defined(AO_ASSUME_VISTA) && !defined(AO_ASSUME_WINDOWS98) # define AO_ASSUME_WINDOWS98 #endif #ifndef AO_USE_INTERLOCKED_INTRINSICS /* _Interlocked primitives (Inc, Dec, Xchg, Add) are always available */ # define AO_USE_INTERLOCKED_INTRINSICS #endif #include "common32_defs.h" /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Unfortunately mfence doesn't exist everywhere. */ /* IsProcessorFeaturePresent(PF_COMPARE_EXCHANGE128) is */ /* probably a conservative test for it? */ #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm { mfence } } #define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif #ifndef AO_NO_ASM_XADD AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { __asm { mov al, incr mov ebx, p lock xadd byte ptr [ebx], al } /* Ignore possible "missing return value" warning here. */ } # define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { __asm { mov ax, incr mov ebx, p lock xadd word ptr [ebx], ax } /* Ignore possible "missing return value" warning here. */ } # define AO_HAVE_short_fetch_and_add_full #endif /* !AO_NO_ASM_XADD */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { __asm { mov eax,0xff ; /* AO_TS_SET */ mov ebx,addr ; xchg byte ptr [ebx],al ; } /* Ignore possible "missing return value" warning here. */ } #define AO_HAVE_test_and_set_full #ifdef _WIN64 # error wrong architecture #endif #ifdef AO_ASSUME_VISTA # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* Whenever we run on a Pentium class machine, we have that certain */ /* function. */ # pragma intrinsic (_InterlockedCompareExchange64) /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_double_compare_and_swap_full(volatile AO_double_t *addr, AO_double_t old_val, AO_double_t new_val) { return (double_ptr_storage)_InterlockedCompareExchange64( (__int64 volatile *)addr, new_val.AO_whole /* exchange */, old_val.AO_whole) == old_val.AO_whole; } # define AO_HAVE_double_compare_and_swap_full #endif /* AO_ASSUME_VISTA */ #define AO_T_IS_INT /* Real X86 implementations, except for some old WinChips, appear */ /* to enforce ordering between memory operations, EXCEPT that a later */ /* read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore both the WinChips, and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h0000755000175000017500000001425012456307241025316 0ustar jnthnjnthn/* * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_aligned_atomic_load_store.h" /* Real X86 implementations appear */ /* to enforce ordering between memory operations, EXCEPT that a later */ /* read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" #ifdef AO_ASM_X64_AVAILABLE # include "../test_and_set_t_is_char.h" #else # include "../test_and_set_t_is_ao_t.h" #endif #include /* Seems like over-kill, but that's what MSDN recommends. */ /* And apparently winbase.h is not always self-contained. */ /* Assume _MSC_VER >= 1400 */ #include #pragma intrinsic (_InterlockedExchangeAdd) #pragma intrinsic (_InterlockedCompareExchange64) #ifndef AO_PREFER_GENERALIZED # pragma intrinsic (_InterlockedIncrement64) # pragma intrinsic (_InterlockedDecrement64) # pragma intrinsic (_InterlockedExchangeAdd64) AO_INLINE AO_t AO_fetch_and_add_full (volatile AO_t *p, AO_t incr) { return _InterlockedExchangeAdd64((LONGLONG volatile *)p, (LONGLONG)incr); } #define AO_HAVE_fetch_and_add_full AO_INLINE AO_t AO_fetch_and_add1_full (volatile AO_t *p) { return _InterlockedIncrement64((LONGLONG volatile *)p) - 1; } #define AO_HAVE_fetch_and_add1_full AO_INLINE AO_t AO_fetch_and_sub1_full (volatile AO_t *p) { return _InterlockedDecrement64((LONGLONG volatile *)p) + 1; } #define AO_HAVE_fetch_and_sub1_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { return (AO_t)_InterlockedCompareExchange64((LONGLONG volatile *)addr, (LONGLONG)new_val, (LONGLONG)old_val); } #define AO_HAVE_fetch_compare_and_swap_full AO_INLINE unsigned int AO_int_fetch_and_add_full(volatile unsigned int *p, unsigned int incr) { return _InterlockedExchangeAdd((LONG volatile *)p, incr); } #define AO_HAVE_int_fetch_and_add_full #ifdef AO_ASM_X64_AVAILABLE AO_INLINE unsigned char AO_char_fetch_and_add_full(volatile unsigned char *p, unsigned char incr) { __asm { mov al, incr mov rbx, p lock xadd byte ptr [rbx], al } } # define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full(volatile unsigned short *p, unsigned short incr) { __asm { mov ax, incr mov rbx, p lock xadd word ptr [rbx], ax } } # define AO_HAVE_short_fetch_and_add_full /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ AO_INLINE void AO_nop_full(void) { /* Note: "mfence" (SSE2) is supported on all x86_64/amd64 chips. */ __asm { mfence } } # define AO_HAVE_nop_full AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { __asm { mov rax,AO_TS_SET ; mov rbx,addr ; xchg byte ptr [rbx],al ; } } # define AO_HAVE_test_and_set_full #endif /* AO_ASM_X64_AVAILABLE */ #ifdef AO_CMPXCHG16B_AVAILABLE /* AO_compare_double_and_swap_double_full needs implementation for Win64. * Also see ../gcc/x86.h for partial old Opteron workaround. */ # if _MSC_VER >= 1500 # include "../standard_ao_double_t.h" # pragma intrinsic (_InterlockedCompareExchange128) AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __int64 comparandResult[2]; comparandResult[0] = old_val1; /* low */ comparandResult[1] = old_val2; /* high */ return _InterlockedCompareExchange128((volatile __int64 *)addr, new_val2 /* high */, new_val1 /* low */, comparandResult); } # define AO_HAVE_compare_double_and_swap_double_full # elif defined(AO_ASM_X64_AVAILABLE) # include "../standard_ao_double_t.h" /* If there is no intrinsic _InterlockedCompareExchange128 then we */ /* need basically what's given below. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { __asm { mov rdx,QWORD PTR [old_val2] ; mov rax,QWORD PTR [old_val1] ; mov rcx,QWORD PTR [new_val2] ; mov rbx,QWORD PTR [new_val1] ; lock cmpxchg16b [addr] ; setz rax ; } } # define AO_HAVE_compare_double_and_swap_double_full # endif /* AO_ASM_X64_AVAILABLE && (_MSC_VER < 1500) */ #endif /* AO_CMPXCHG16B_AVAILABLE */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered.h0000755000175000017500000000257112456307241024673 0ustar jnthnjnthn/* * Copyright (c) 2003 Hewlett-Packard Development Company, L.P. * * 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. */ /* These are common definitions for architectures that provide */ /* processor ordered memory operations. */ #include "ordered_except_wr.h" AO_INLINE void AO_nop_full(void) { AO_compiler_barrier(); } #define AO_HAVE_nop_full MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h0000755000175000017500000000336512456307241026755 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ /* * These are common definitions for architectures that provide processor * ordered memory operations except that a later read may pass an * earlier write. Real x86 implementations seem to be in this category, * except apparently for some IDT WinChips, which we ignore. */ #include "read_ordered.h" AO_INLINE void AO_nop_write(void) { /* AO_nop_write implementation is the same as of AO_nop_read. */ AO_compiler_barrier(); /* sfence according to Intel docs. Pentium 3 and up. */ /* Unnecessary for cached accesses? */ } #define AO_HAVE_nop_write #include "loadstore/ordered_stores_only.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h0000755000175000017500000000303612456307241025663 0ustar jnthnjnthn/* * Copyright (c) 2003 by Hewlett-Packard Company. All rights reserved. * * 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. */ /* * These are common definitions for architectures that provide processor * ordered memory operations except that a later read may pass an * earlier write. Real x86 implementations seem to be in this category, * except apparently for some IDT WinChips, which we ignore. */ AO_INLINE void AO_nop_read(void) { AO_compiler_barrier(); } #define AO_HAVE_nop_read #include "loadstore/ordered_loads_only.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h0000755000175000017500000000543112456307241027401 0ustar jnthnjnthn/* * Copyright (c) 2004-2011 Hewlett-Packard Development Company, L.P. * * 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. */ /* For 64-bit systems, we extend the double type to hold two int64's. */ /* x86-64 (except for x32): __m128 serves as a placeholder which also */ /* requires the compiler to align it on 16-byte boundary (as required */ /* by cmpxchg16). */ /* Similar things could be done for PPC 64-bit using a VMX data type. */ #if ((defined(__x86_64__) && __GNUC__ >= 4) || defined(_WIN64)) \ && !defined(__ILP32__) # include typedef __m128 double_ptr_storage; #elif defined(_WIN32) && !defined(__GNUC__) typedef unsigned __int64 double_ptr_storage; #elif defined(__aarch64__) typedef unsigned __int128 double_ptr_storage; #else typedef unsigned long long double_ptr_storage; #endif # define AO_HAVE_DOUBLE_PTR_STORAGE typedef union { struct { AO_t AO_v1; AO_t AO_v2; } AO_parts; /* Note that AO_v1 corresponds to the low or the high part of */ /* AO_whole depending on the machine endianness. */ double_ptr_storage AO_whole; /* AO_whole is now (starting from v7.3alpha3) the 2nd element */ /* of this union to make AO_DOUBLE_T_INITIALIZER portable */ /* (because __m128 definition could vary from a primitive type */ /* to a structure or array/vector). */ } AO_double_t; #define AO_HAVE_double_t /* Dummy declaration as a compile-time assertion for AO_double_t size. */ struct AO_double_t_size_static_assert { char dummy[sizeof(AO_double_t) == 2 * sizeof(AO_t) ? 1 : -1]; }; #define AO_DOUBLE_T_INITIALIZER { { (AO_t)0, (AO_t)0 } } #define AO_val1 AO_parts.AO_v1 #define AO_val2 AO_parts.AO_v2 MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S0000755000175000017500000000020112456307241025266 0ustar jnthnjnthn .seg "text" .globl AO_test_and_set_full AO_test_and_set_full: retl ldstub [%o0],%o0 MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h0000755000175000017500000000307112456307241025323 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "../all_atomic_load_store.h" /* Real SPARC code uses TSO: */ #include "../ordered_except_wr.h" /* Test_and_set location is just a byte. */ #include "../test_and_set_t_is_char.h" extern AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr); /* Implemented in separate .S file, for now. */ #define AO_HAVE_test_and_set_full /* TODO: Like the gcc version, extend this for V8 and V9. */ MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h0000755000175000017500000001734312456307241024647 0ustar jnthnjnthn/* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * * Permission is hereby granted to use or copy this program * for any purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * * Some of the machine specific code was borrowed from our GC distribution. */ /* The following really assume we have a 486 or better. */ #include "../all_aligned_atomic_load_store.h" #include "../test_and_set_t_is_char.h" #if !defined(AO_USE_PENTIUM4_INSTRS) && !defined(__i386) /* "mfence" (SSE2) is supported on all x86_64/amd64 chips. */ # define AO_USE_PENTIUM4_INSTRS #endif #if defined(AO_USE_PENTIUM4_INSTRS) AO_INLINE void AO_nop_full(void) { __asm__ __volatile__ ("mfence" : : : "memory"); } # define AO_HAVE_nop_full #else /* We could use the cpuid instruction. But that seems to be slower */ /* than the default implementation based on test_and_set_full. Thus */ /* we omit that bit of misinformation here. */ #endif /* !AO_USE_PENTIUM4_INSTRS */ /* As far as we can tell, the lfence and sfence instructions are not */ /* currently needed or useful for cached memory accesses. */ /* Really only works for 486 and later */ #ifndef AO_PREFER_GENERALIZED AO_INLINE AO_t AO_fetch_and_add_full (volatile AO_t *p, AO_t incr) { AO_t result; __asm__ __volatile__ ("lock; xadd %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_fetch_and_add_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE unsigned char AO_char_fetch_and_add_full (volatile unsigned char *p, unsigned char incr) { unsigned char result; __asm__ __volatile__ ("lock; xaddb %0, %1" : "=q" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_char_fetch_and_add_full AO_INLINE unsigned short AO_short_fetch_and_add_full (volatile unsigned short *p, unsigned short incr) { unsigned short result; __asm__ __volatile__ ("lock; xaddw %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } #define AO_HAVE_short_fetch_and_add_full #ifndef AO_PREFER_GENERALIZED /* Really only works for 486 and later */ AO_INLINE void AO_and_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; and %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_and_full AO_INLINE void AO_or_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; or %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_or_full AO_INLINE void AO_xor_full (volatile AO_t *p, AO_t value) { __asm__ __volatile__ ("lock; xor %1, %0" : "+m" (*p) : "r" (value) : "memory"); } # define AO_HAVE_xor_full #endif /* !AO_PREFER_GENERALIZED */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full (volatile AO_TS_t *addr) { AO_TS_t oldval; /* Note: the "xchg" instruction does not need a "lock" prefix */ __asm__ __volatile__ ("xchg %b0, %1" : "=q" (oldval), "+m" (*addr) : "0" (0xff) : "memory"); return (AO_TS_VAL_t)oldval; } #define AO_HAVE_test_and_set_full #ifndef AO_GENERALIZE_ASM_BOOL_CAS /* Returns nonzero if the comparison succeeded. */ AO_INLINE int AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { char result; __asm__ __volatile__ ("lock; cmpxchg %2, %0; setz %1" : "+m" (*addr), "=a" (result) : "r" (new_val), "a" (old) : "memory"); return (int) result; } # define AO_HAVE_compare_and_swap_full #endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ AO_INLINE AO_t AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old_val, AO_t new_val) { AO_t fetched_val; __asm__ __volatile__ ("lock; cmpxchg %2, %0" : "+m" (*addr), "=a" (fetched_val) : "r" (new_val), "a" (old_val) : "memory"); return fetched_val; } #define AO_HAVE_fetch_compare_and_swap_full #if defined(__i386) # ifndef AO_NO_CMPXCHG8B # include "../standard_ao_double_t.h" /* Reading or writing a quadword aligned on a 64-bit boundary is */ /* always carried out atomically (requires at least a Pentium). */ # define AO_ACCESS_double_CHECK_ALIGNED # include "../loadstore/double_atomic_load_store.h" /* Returns nonzero if the comparison succeeded. */ /* Really requires at least a Pentium. */ AO_INLINE int AO_compare_double_and_swap_double_full(volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; __asm__ __volatile__ ("lock; cmpxchg8b %0; setz %1" : "+m" (*addr), "=a" (result) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # endif /* !AO_NO_CMPXCHG8B */ # define AO_T_IS_INT #else /* x64 */ AO_INLINE unsigned int AO_int_fetch_and_add_full (volatile unsigned int *p, unsigned int incr) { unsigned int result; __asm__ __volatile__ ("lock; xaddl %0, %1" : "=r" (result), "+m" (*p) : "0" (incr) : "memory"); return result; } # define AO_HAVE_int_fetch_and_add_full # ifdef AO_CMPXCHG16B_AVAILABLE # include "../standard_ao_double_t.h" /* Older AMD Opterons are missing this instruction (SIGILL should */ /* be thrown in this case). */ AO_INLINE int AO_compare_double_and_swap_double_full (volatile AO_double_t *addr, AO_t old_val1, AO_t old_val2, AO_t new_val1, AO_t new_val2) { char result; __asm__ __volatile__ ("lock; cmpxchg16b %0; setz %1" : "+m" (*addr), "=a" (result) : "d" (old_val2), "a" (old_val1), "c" (new_val2), "b" (new_val1) : "memory"); return (int) result; } # define AO_HAVE_compare_double_and_swap_double_full # endif /* !AO_CMPXCHG16B_AVAILABLE */ #endif /* x64 */ /* Real X86 implementations, except for some old 32-bit WinChips, */ /* appear to enforce ordering between memory operations, EXCEPT that */ /* a later read can pass earlier writes, presumably due to the visible */ /* presence of store buffers. */ /* We ignore both the WinChips and the fact that the official specs */ /* seem to be much weaker (and arguably too weak to be usable). */ #include "../ordered_except_wr.h" MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h0000755000175000017500000000313412456307241027737 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* * These are common definitions for architectures on which test_and_set * operates on pointer-sized quantities, the "clear" value contains * all zeroes, and the "set" value contains only one lowest bit set. * This can be used if test_and_set is synthesized from compare_and_swap. */ typedef enum {AO_TS_clear = 0, AO_TS_set = 1} AO_TS_val; #define AO_TS_VAL_t AO_TS_val #define AO_TS_CLEAR AO_TS_clear #define AO_TS_SET AO_TS_set #define AO_TS_t AO_t #define AO_AO_TS_T 1 MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h0000755000175000017500000000305412456307241027733 0ustar jnthnjnthn/* * Copyright (c) 2004 Hewlett-Packard Development Company, L.P. * * 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. */ /* * These are common definitions for architectures on which test_and_set * operates on byte sized quantities, the "clear" value contains * all zeroes, and the "set" value contains all ones. */ #define AO_TS_t unsigned char typedef enum {AO_BYTE_TS_clear = 0, AO_BYTE_TS_set = 0xff} AO_BYTE_TS_val; #define AO_TS_VAL_t AO_BYTE_TS_val #define AO_TS_CLEAR AO_BYTE_TS_clear #define AO_TS_SET AO_BYTE_TS_set #define AO_CHAR_TS_T 1 MoarVM-2015.11/3rdparty/libatomic_ops/src/atomic_ops_sysdeps.S0000755000175000017500000000046212456307241023277 0ustar jnthnjnthn/* * Include the appropriate system-dependent assembly file, if any. * This is used only if the platform supports neither inline assembly * code, nor appropriate compiler intrinsics. */ #if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) # include "atomic_ops/sysdeps/sunc/sparc.S" #endif MoarVM-2015.11/3rdparty/libatomic_ops/src/config.h.in0000755000175000017500000000752512456307241021276 0ustar jnthnjnthn/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Inline assembly avalable (only VC/x86_64) */ #undef AO_ASM_X64_AVAILABLE /* Assume Windows Server 2003, Vista or later target (only VC/x86) */ #undef AO_ASSUME_VISTA /* Assume hardware compare-and-swap functionality available on target (only VC/x86) */ #undef AO_ASSUME_WINDOWS98 /* Assume target is not old AMD Opteron chip (only x86_64) */ #undef AO_CMPXCHG16B_AVAILABLE /* Force test_and_set to use SWP instruction instead of LDREX/STREX (only arm v6+) */ #undef AO_FORCE_USE_SWP /* Force compare_and_swap definition via fetch_compare_and_swap */ #undef AO_GENERALIZE_ASM_BOOL_CAS /* No pthreads library available */ #undef AO_NO_PTHREADS /* Assume target is not sparc v9+ (only sparc) */ #undef AO_NO_SPARC_V9 /* Assume ancient MS VS Win32 headers (only VC/arm v6+, VC/x86) */ #undef AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE /* Prefer generalized definitions to direct assembly-based ones */ #undef AO_PREFER_GENERALIZED /* Trace AO_malloc/free calls (for debug only) */ #undef AO_TRACE_MALLOC /* Assume single-core target (only arm v6+) */ #undef AO_UNIPROCESSOR /* Assume Win32 _Interlocked primitives available as intrinsics (only VC/arm) */ #undef AO_USE_INTERLOCKED_INTRINSICS /* Use nanosleep() instead of select() (only if atomic operations are emulated) */ #undef AO_USE_NANOSLEEP /* Do not block signals in compare_and_swap (only if atomic operations are emulated) */ #undef AO_USE_NO_SIGNALS /* Use Pentium 4 'mfence' instruction (only x86) */ #undef AO_USE_PENTIUM4_INSTRS /* Emulate atomic operations via slow and async-signal-unsafe pthread locking */ #undef AO_USE_PTHREAD_DEFS /* Prefer GCC built-in CAS intrinsics in favor of inline assembly (only gcc/x86, gcc/x86_64) */ #undef AO_USE_SYNC_CAS_BUILTIN /* Use Win32 Sleep() instead of select() (only if atomic operations are emulated) */ #undef AO_USE_WIN32_PTHREADS /* Emulate double-width CAS via pthread locking in case of no hardware support (only gcc/x86_64, the emulation is unsafe) */ #undef AO_WEAK_DOUBLE_CAS_EMULATION /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to disable assertion checking. */ #undef NDEBUG /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Indicates the use of pthreads (NetBSD). */ #undef _PTHREADS /* Required define if using POSIX threads. */ #undef _REENTRANT MoarVM-2015.11/3rdparty/libtommath/LICENSE0000644000175000017500000000131512456307241016771 0ustar jnthnjnthnLibTomMath is licensed under DUAL licensing terms. Choose and use the license of your needs. [LICENSE #1] LibTomMath is public domain. As should all quality software be. Tom St Denis [/LICENSE #1] [LICENSE #2] DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. [/LICENSE #2] MoarVM-2015.11/3rdparty/libtommath/bn_error.c0000644000175000017500000000220212456307241017734 0ustar jnthnjnthn#include #ifdef BN_ERROR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const struct { int code; const char *msg; } msgs[] = { { MP_OKAY, "Successful" }, { MP_MEM, "Out of heap" }, { MP_VAL, "Value out of range" } }; /* return a char * string for a given code */ const char *mp_error_to_string(int code) { int x; /* scan the lookup table for the given message */ for (x = 0; x < (int)(sizeof(msgs) / sizeof(msgs[0])); x++) { if (msgs[x].code == code) { return msgs[x].msg; } } /* generic reply for invalid code */ return "Invalid error code"; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_fast_mp_invmod.c0000644000175000017500000000642012456307241021616 0ustar jnthnjnthn#include #ifdef BN_FAST_MP_INVMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes the modular inverse via binary extended euclidean algorithm, * that is c = 1/a mod b * * Based on slow invmod except this is optimized for the case where b is * odd as per HAC Note 14.64 on pp. 610 */ int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) { mp_int x, y, u, v, B, D; int res, neg; /* 2. [modified] b must be odd */ if (mp_iseven (b) == 1) { return MP_VAL; } /* init all our temps */ if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { return res; } /* x == modulus, y == value to invert */ if ((res = mp_copy (b, &x)) != MP_OKAY) { goto LBL_ERR; } /* we need y = |a| */ if ((res = mp_mod (a, b, &y)) != MP_OKAY) { goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { goto LBL_ERR; } mp_set (&D, 1); top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { goto LBL_ERR; } /* 4.2 if B is odd then */ if (mp_isodd (&B) == 1) { if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { goto LBL_ERR; } } /* B = B/2 */ if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { goto LBL_ERR; } } /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto LBL_ERR; } /* 5.2 if D is odd then */ if (mp_isodd (&D) == 1) { /* D = (D-x)/2 */ if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { goto LBL_ERR; } } /* D = D/2 */ if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { goto LBL_ERR; } } /* 6. if u >= v then */ if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { goto LBL_ERR; } } else { /* v - v - u, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { goto LBL_ERR; } } /* if not zero goto step 4 */ if (mp_iszero (&u) == 0) { goto top; } /* now a = C, b = D, gcd == g*v */ /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; goto LBL_ERR; } /* b is now the inverse */ neg = a->sign; while (D.sign == MP_NEG) { if ((res = mp_add (&D, b, &D)) != MP_OKAY) { goto LBL_ERR; } } mp_exch (&D, c); c->sign = neg; res = MP_OKAY; LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_fast_mp_montgomery_reduce.c0000644000175000017500000001073612456307241024056 0ustar jnthnjnthn#include #ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes xR**-1 == x (mod N) via Montgomery Reduction * * This is an optimized implementation of montgomery_reduce * which uses the comba method to quickly calculate the columns of the * reduction. * * Based on Algorithm 14.32 on pp.601 of HAC. */ int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) { int ix, res, olduse; mp_word W[MP_WARRAY]; /* get old used count */ olduse = x->used; /* grow a as required */ if (x->alloc < n->used + 1) { if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { return res; } } /* first we have to get the digits of the input into * an array of double precision words W[...] */ { register mp_word *_W; register mp_digit *tmpx; /* alias for the W[] array */ _W = W; /* alias for the digits of x*/ tmpx = x->dp; /* copy the digits of a into W[0..a->used-1] */ for (ix = 0; ix < x->used; ix++) { *_W++ = *tmpx++; } /* zero the high words of W[a->used..m->used*2] */ for (; ix < n->used * 2 + 1; ix++) { *_W++ = 0; } } /* now we proceed to zero successive digits * from the least significant upwards */ for (ix = 0; ix < n->used; ix++) { /* mu = ai * m' mod b * * We avoid a double precision multiplication (which isn't required) * by casting the value down to a mp_digit. Note this requires * that W[ix-1] have the carry cleared (see after the inner loop) */ register mp_digit mu; mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); /* a = a + mu * m * b**i * * This is computed in place and on the fly. The multiplication * by b**i is handled by offseting which columns the results * are added to. * * Note the comba method normally doesn't handle carries in the * inner loop In this case we fix the carry from the previous * column since the Montgomery reduction requires digits of the * result (so far) [see above] to work. This is * handled by fixing up one carry after the inner loop. The * carry fixups are done in order so after these loops the * first m->used words of W[] have the carries fixed */ { register int iy; register mp_digit *tmpn; register mp_word *_W; /* alias for the digits of the modulus */ tmpn = n->dp; /* Alias for the columns set by an offset of ix */ _W = W + ix; /* inner loop */ for (iy = 0; iy < n->used; iy++) { *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); } } /* now fix carry for next digit, W[ix+1] */ W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); } /* now we have to propagate the carries and * shift the words downward [all those least * significant digits we zeroed]. */ { register mp_digit *tmpx; register mp_word *_W, *_W1; /* nox fix rest of carries */ /* alias for current word */ _W1 = W + ix; /* alias for next word, where the carry goes */ _W = W + ++ix; for (; ix <= n->used * 2 + 1; ix++) { *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); } /* copy out, A = A/b**n * * The result is A/b**n but instead of converting from an * array of mp_word to mp_digit than calling mp_rshd * we just copy them in the right order */ /* alias for destination word */ tmpx = x->dp; /* alias for shifted double precision result */ _W = W + n->used; for (ix = 0; ix < n->used + 1; ix++) { *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); } /* zero oldused digits, if the input a was larger than * m->used+1 we'll have to clear the digits */ for (; ix < olduse; ix++) { *tmpx++ = 0; } } /* set the max used and clamp */ x->used = n->used + 1; mp_clamp (x); /* if A >= m then A = A - m */ if (mp_cmp_mag (x, n) != MP_LT) { return s_mp_sub (x, n, x); } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_fast_s_mp_mul_digs.c0000644000175000017500000000527012456307241022451 0ustar jnthnjnthn#include #ifdef BN_FAST_S_MP_MUL_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Fast (comba) multiplier * * This is the fast column-array [comba] multiplier. It is * designed to compute the columns of the product first * then handle the carries afterwards. This has the effect * of making the nested loops that compute the columns very * simple and schedulable on super-scalar processors. * * This has been modified to produce a variable number of * digits of output so if say only a half-product is required * you don't have to compute the upper half (a feature * required for fast Barrett reduction). * * Based on Algorithm 14.12 on pp.595 of HAC. * */ int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY]; register mp_word _W; /* grow the destination as required */ if (c->alloc < digs) { if ((res = mp_grow (c, digs)) != MP_OKAY) { return res; } } /* number of output digits to produce */ pa = MIN(digs, a->used + b->used); /* clear the carry */ _W = 0; for (ix = 0; ix < pa; ix++) { int tx, ty; int iy; mp_digit *tmpx, *tmpy; /* get offsets into the two bignums */ ty = MIN(b->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = b->dp + ty; /* this is the number of times the loop will iterrate, essentially while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* execute loop */ for (iz = 0; iz < iy; ++iz) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* store term */ W[ix] = ((mp_digit)_W) & MP_MASK; /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = c->used; c->used = pa; { register mp_digit *tmpc; tmpc = c->dp; for (ix = 0; ix < pa+1; ix++) { /* now extract the previous digit [below the carry] */ *tmpc++ = W[ix]; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.c0000644000175000017500000000470612456307241023453 0ustar jnthnjnthn#include #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this is a modified version of fast_s_mul_digs that only produces * output digits *above* digs. See the comments for fast_s_mul_digs * to see how it works. * * This is used in the Barrett reduction since for one of the multiplications * only the higher digits were needed. This essentially halves the work. * * Based on Algorithm 14.12 on pp.595 of HAC. */ int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY]; mp_word _W; /* grow the destination as required */ pa = a->used + b->used; if (c->alloc < pa) { if ((res = mp_grow (c, pa)) != MP_OKAY) { return res; } } /* number of output digits to produce */ pa = a->used + b->used; _W = 0; for (ix = digs; ix < pa; ix++) { int tx, ty, iy; mp_digit *tmpx, *tmpy; /* get offsets into the two bignums */ ty = MIN(b->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = b->dp + ty; /* this is the number of times the loop will iterrate, essentially its while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* execute loop */ for (iz = 0; iz < iy; iz++) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* store term */ W[ix] = ((mp_digit)_W) & MP_MASK; /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = c->used; c->used = pa; { register mp_digit *tmpc; tmpc = c->dp + digs; for (ix = digs; ix < pa; ix++) { /* now extract the previous digit [below the carry] */ *tmpc++ = W[ix]; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_fast_s_mp_sqr.c0000644000175000017500000000547312456307241021460 0ustar jnthnjnthn#include #ifdef BN_FAST_S_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* the jist of squaring... * you do like mult except the offset of the tmpx [one that * starts closer to zero] can't equal the offset of tmpy. * So basically you set up iy like before then you min it with * (ty-tx) so that it never happens. You double all those * you add in the inner loop After that loop you do the squares and add them in. */ int fast_s_mp_sqr (mp_int * a, mp_int * b) { int olduse, res, pa, ix, iz; mp_digit W[MP_WARRAY], *tmpx; mp_word W1; /* grow the destination as required */ pa = a->used + a->used; if (b->alloc < pa) { if ((res = mp_grow (b, pa)) != MP_OKAY) { return res; } } /* number of output digits to produce */ W1 = 0; for (ix = 0; ix < pa; ix++) { int tx, ty, iy; mp_word _W; mp_digit *tmpy; /* clear counter */ _W = 0; /* get offsets into the two bignums */ ty = MIN(a->used-1, ix); tx = ix - ty; /* setup temp aliases */ tmpx = a->dp + tx; tmpy = a->dp + ty; /* this is the number of times the loop will iterrate, essentially while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); /* now for squaring tx can never equal ty * we halve the distance since they approach at a rate of 2x * and we have to round because odd cases need to be executed */ iy = MIN(iy, (ty-tx+1)>>1); /* execute loop */ for (iz = 0; iz < iy; iz++) { _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); } /* double the inner product and add carry */ _W = _W + _W + W1; /* even columns have the square term in them */ if ((ix&1) == 0) { _W += ((mp_word)a->dp[ix>>1])*((mp_word)a->dp[ix>>1]); } /* store it */ W[ix] = (mp_digit)(_W & MP_MASK); /* make next carry */ W1 = _W >> ((mp_word)DIGIT_BIT); } /* setup dest */ olduse = b->used; b->used = a->used+a->used; { mp_digit *tmpb; tmpb = b->dp; for (ix = 0; ix < pa; ix++) { *tmpb++ = W[ix] & MP_MASK; } /* clear unused digits [that existed in the old copy of c] */ for (; ix < olduse; ix++) { *tmpb++ = 0; } } mp_clamp (b); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_2expt.c0000644000175000017500000000217412456307241020351 0ustar jnthnjnthn#include #ifdef BN_MP_2EXPT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes a = 2**b * * Simple algorithm which zeroes the int, grows it then just sets one bit * as required. */ int mp_2expt (mp_int * a, int b) { int res; /* zero a as per default */ mp_zero (a); /* grow a to accomodate the single bit */ if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } /* set the used count of where the bit will go */ a->used = b / DIGIT_BIT + 1; /* put the single bit in its place */ a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_abs.c0000644000175000017500000000165112456307241020053 0ustar jnthnjnthn#include #ifdef BN_MP_ABS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = |a| * * Simple function copies the input and fixes the sign to positive */ int mp_abs (mp_int * a, mp_int * b) { int res; /* copy a to b */ if (a != b) { if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } } /* force the sign of b to positive */ b->sign = MP_ZPOS; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_add.c0000644000175000017500000000255012456307241020035 0ustar jnthnjnthn#include #ifdef BN_MP_ADD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level addition (handles signs) */ int mp_add (mp_int * a, mp_int * b, mp_int * c) { int sa, sb, res; /* get sign of both inputs */ sa = a->sign; sb = b->sign; /* handle two cases, not four */ if (sa == sb) { /* both positive or both negative */ /* add their magnitudes, copy the sign */ c->sign = sa; res = s_mp_add (a, b, c); } else { /* one positive, the other negative */ /* subtract the one with the greater magnitude from */ /* the one of the lesser magnitude. The result gets */ /* the sign of the one with the greater magnitude. */ if (mp_cmp_mag (a, b) == MP_LT) { c->sign = sb; res = s_mp_sub (b, a, c); } else { c->sign = sa; res = s_mp_sub (a, b, c); } } return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_add_d.c0000644000175000017500000000452412456307241020343 0ustar jnthnjnthn#include #ifdef BN_MP_ADD_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* single digit addition */ int mp_add_d (mp_int * a, mp_digit b, mp_int * c) { int res, ix, oldused; mp_digit *tmpa, *tmpc, mu; /* grow c as required */ if (c->alloc < a->used + 1) { if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { return res; } } /* if a is negative and |a| >= b, call c = |a| - b */ if (a->sign == MP_NEG && (a->used > 1 || a->dp[0] >= b)) { /* temporarily fix sign of a */ a->sign = MP_ZPOS; /* c = |a| - b */ res = mp_sub_d(a, b, c); /* fix sign */ a->sign = c->sign = MP_NEG; /* clamp */ mp_clamp(c); return res; } /* old number of used digits in c */ oldused = c->used; /* sign always positive */ c->sign = MP_ZPOS; /* source alias */ tmpa = a->dp; /* destination alias */ tmpc = c->dp; /* if a is positive */ if (a->sign == MP_ZPOS) { /* add digit, after this we're propagating * the carry. */ *tmpc = *tmpa++ + b; mu = *tmpc >> DIGIT_BIT; *tmpc++ &= MP_MASK; /* now handle rest of the digits */ for (ix = 1; ix < a->used; ix++) { *tmpc = *tmpa++ + mu; mu = *tmpc >> DIGIT_BIT; *tmpc++ &= MP_MASK; } /* set final carry */ ix++; *tmpc++ = mu; /* setup size */ c->used = a->used + 1; } else { /* a was negative and |a| < b */ c->used = 1; /* the result is a single digit */ if (a->used == 1) { *tmpc++ = b - a->dp[0]; } else { *tmpc++ = b; } /* setup count so the clearing of oldused * can fall through correctly */ ix = 1; } /* now zero to oldused */ while (ix++ < oldused) { *tmpc++ = 0; } mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_addmod.c0000644000175000017500000000164212456307241020536 0ustar jnthnjnthn#include #ifdef BN_MP_ADDMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a + b (mod c) */ int mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_add (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_and.c0000644000175000017500000000230612456307241020046 0ustar jnthnjnthn#include #ifdef BN_MP_AND_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* AND two ints together */ int mp_and (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] &= x->dp[ix]; } /* zero digits above the last from the smallest mp_int */ for (; ix < t.used; ix++) { t.dp[ix] = 0; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_clamp.c0000644000175000017500000000210712456307241020377 0ustar jnthnjnthn#include #ifdef BN_MP_CLAMP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* trim unused digits * * This is used to ensure that leading zero digits are * trimed and the leading "used" digit will be non-zero * Typically very fast. Also fixes the sign if there * are no more leading digits */ void mp_clamp (mp_int * a) { /* decrease used while the most significant digit is * zero. */ while (a->used > 0 && a->dp[a->used - 1] == 0) { --(a->used); } /* reset the sign flag if used == 0 */ if (a->used == 0) { a->sign = MP_ZPOS; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_clear.c0000644000175000017500000000176512456307241020402 0ustar jnthnjnthn#include #ifdef BN_MP_CLEAR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* clear one (frees) */ void mp_clear (mp_int * a) { int i; /* only do anything if a hasn't been freed previously */ if (a->dp != NULL) { /* first zero the digits */ for (i = 0; i < a->used; i++) { a->dp[i] = 0; } /* free ram */ XFREE(a->dp); /* reset members to make debugging easier */ a->dp = NULL; a->alloc = a->used = 0; a->sign = MP_ZPOS; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_clear_multi.c0000644000175000017500000000153612456307241021610 0ustar jnthnjnthn#include #ifdef BN_MP_CLEAR_MULTI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #include void mp_clear_multi(mp_int *mp, ...) { mp_int* next_mp = mp; va_list args; va_start(args, mp); while (next_mp != NULL) { mp_clear(next_mp); next_mp = va_arg(args, mp_int*); } va_end(args); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_cmp.c0000644000175000017500000000176012456307241020066 0ustar jnthnjnthn#include #ifdef BN_MP_CMP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare two ints (signed)*/ int mp_cmp (mp_int * a, mp_int * b) { /* compare based on sign */ if (a->sign != b->sign) { if (a->sign == MP_NEG) { return MP_LT; } else { return MP_GT; } } /* compare digits */ if (a->sign == MP_NEG) { /* if negative compare opposite direction */ return mp_cmp_mag(b, a); } else { return mp_cmp_mag(a, b); } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_cmp_d.c0000644000175000017500000000173312456307241020371 0ustar jnthnjnthn#include #ifdef BN_MP_CMP_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare a digit */ int mp_cmp_d(mp_int * a, mp_digit b) { /* compare based on sign */ if (a->sign == MP_NEG) { return MP_LT; } /* compare based on magnitude */ if (a->used > 1) { return MP_GT; } /* compare the only digit of a to b */ if (a->dp[0] > b) { return MP_GT; } else if (a->dp[0] < b) { return MP_LT; } else { return MP_EQ; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_cmp_mag.c0000644000175000017500000000225512456307241020712 0ustar jnthnjnthn#include #ifdef BN_MP_CMP_MAG_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* compare maginitude of two ints (unsigned) */ int mp_cmp_mag (mp_int * a, mp_int * b) { int n; mp_digit *tmpa, *tmpb; /* compare based on # of non-zero digits */ if (a->used > b->used) { return MP_GT; } if (a->used < b->used) { return MP_LT; } /* alias for a */ tmpa = a->dp + (a->used - 1); /* alias for b */ tmpb = b->dp + (a->used - 1); /* compare based on digits */ for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { if (*tmpa > *tmpb) { return MP_GT; } if (*tmpa < *tmpb) { return MP_LT; } } return MP_EQ; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_cnt_lsb.c0000644000175000017500000000227412456307241020734 0ustar jnthnjnthn#include #ifdef BN_MP_CNT_LSB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const int lnz[16] = { 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a) { int x; mp_digit q, qq; /* easy out */ if (mp_iszero(a) == 1) { return 0; } /* scan lower digits until non-zero */ for (x = 0; x < a->used && a->dp[x] == 0; x++); q = a->dp[x]; x *= DIGIT_BIT; /* now scan this digit until a 1 is found */ if ((q & 1) == 0) { do { qq = q & 15; x += lnz[qq]; q >>= 4; } while (qq == 0); } return x; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_copy.c0000644000175000017500000000251212456307241020255 0ustar jnthnjnthn#include #ifdef BN_MP_COPY_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* copy, b = a */ int mp_copy (mp_int * a, mp_int * b) { int res, n; /* if dst == src do nothing */ if (a == b) { return MP_OKAY; } /* grow dest */ if (b->alloc < a->used) { if ((res = mp_grow (b, a->used)) != MP_OKAY) { return res; } } /* zero b and copy the parameters over */ { register mp_digit *tmpa, *tmpb; /* pointer aliases */ /* source */ tmpa = a->dp; /* destination */ tmpb = b->dp; /* copy all the digits */ for (n = 0; n < a->used; n++) { *tmpb++ = *tmpa++; } /* clear high digits */ for (; n < b->used; n++) { *tmpb++ = 0; } } /* copy used count and sign */ b->used = a->used; b->sign = a->sign; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_count_bits.c0000644000175000017500000000176412456307241021464 0ustar jnthnjnthn#include #ifdef BN_MP_COUNT_BITS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* returns the number of bits in an int */ int mp_count_bits (mp_int * a) { int r; mp_digit q; /* shortcut */ if (a->used == 0) { return 0; } /* get number of digits and add that */ r = (a->used - 1) * DIGIT_BIT; /* take the last digit and count the bits in it */ q = a->dp[a->used - 1]; while (q > ((mp_digit) 0)) { ++r; q >>= ((mp_digit) 1); } return r; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_div.c0000644000175000017500000001550512456307241020073 0ustar jnthnjnthn#include #ifdef BN_MP_DIV_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #ifdef BN_MP_DIV_SMALL /* slower bit-bang division... also smaller */ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) { mp_int ta, tb, tq, q; int res, n, n2; /* is divisor zero ? */ if (mp_iszero (b) == 1) { return MP_VAL; } /* if a < b then q=0, r = a */ if (mp_cmp_mag (a, b) == MP_LT) { if (d != NULL) { res = mp_copy (a, d); } else { res = MP_OKAY; } if (c != NULL) { mp_zero (c); } return res; } /* init our temps */ if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) { return res; } mp_set(&tq, 1); n = mp_count_bits(a) - mp_count_bits(b); if (((res = mp_abs(a, &ta)) != MP_OKAY) || ((res = mp_abs(b, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { goto LBL_ERR; } while (n-- >= 0) { if (mp_cmp(&tb, &ta) != MP_GT) { if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { goto LBL_ERR; } } if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { goto LBL_ERR; } } /* now q == quotient and ta == remainder */ n = a->sign; n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); if (c != NULL) { mp_exch(c, &q); c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; } if (d != NULL) { mp_exch(d, &ta); d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; } LBL_ERR: mp_clear_multi(&ta, &tb, &tq, &q, NULL); return res; } #else /* integer signed division. * c*b + d == a [e.g. a/b, c=quotient, d=remainder] * HAC pp.598 Algorithm 14.20 * * Note that the description in HAC is horribly * incomplete. For example, it doesn't consider * the case where digits are removed from 'x' in * the inner loop. It also doesn't consider the * case that y has fewer than three digits, etc.. * * The overall algorithm is as described as * 14.20 from HAC but fixed to treat these cases. */ int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { mp_int q, x, y, t1, t2; int res, n, t, i, norm, neg; /* is divisor zero ? */ if (mp_iszero (b) == 1) { return MP_VAL; } /* if a < b then q=0, r = a */ if (mp_cmp_mag (a, b) == MP_LT) { if (d != NULL) { res = mp_copy (a, d); } else { res = MP_OKAY; } if (c != NULL) { mp_zero (c); } return res; } if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { return res; } q.used = a->used + 2; if ((res = mp_init (&t1)) != MP_OKAY) { goto LBL_Q; } if ((res = mp_init (&t2)) != MP_OKAY) { goto LBL_T1; } if ((res = mp_init_copy (&x, a)) != MP_OKAY) { goto LBL_T2; } if ((res = mp_init_copy (&y, b)) != MP_OKAY) { goto LBL_X; } /* fix the sign */ neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; x.sign = y.sign = MP_ZPOS; /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ norm = mp_count_bits(&y) % DIGIT_BIT; if (norm < (int)(DIGIT_BIT-1)) { norm = (DIGIT_BIT-1) - norm; if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { goto LBL_Y; } } else { norm = 0; } /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ n = x.used - 1; t = y.used - 1; /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ goto LBL_Y; } while (mp_cmp (&x, &y) != MP_LT) { ++(q.dp[n - t]); if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { goto LBL_Y; } } /* reset y by shifting it back down */ mp_rshd (&y, n - t); /* step 3. for i from n down to (t + 1) */ for (i = n; i >= (t + 1); i--) { if (i > x.used) { continue; } /* step 3.1 if xi == yt then set q{i-t-1} to b-1, * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ if (x.dp[i] == y.dp[t]) { q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); } else { mp_word tmp; tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); tmp |= ((mp_word) x.dp[i - 1]); tmp /= ((mp_word) y.dp[t]); if (tmp > (mp_word) MP_MASK) tmp = MP_MASK; q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); } /* while (q{i-t-1} * (yt * b + y{t-1})) > xi * b**2 + xi-1 * b + xi-2 do q{i-t-1} -= 1; */ q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; do { q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; /* find left hand */ mp_zero (&t1); t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; t1.dp[1] = y.dp[t]; t1.used = 2; if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { goto LBL_Y; } /* find right hand */ t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; t2.dp[2] = x.dp[i]; t2.used = 3; } while (mp_cmp_mag(&t1, &t2) == MP_GT); /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { goto LBL_Y; } /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ if (x.sign == MP_NEG) { if ((res = mp_copy (&y, &t1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { goto LBL_Y; } if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { goto LBL_Y; } q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; } } /* now q is the quotient and x is the remainder * [which we have to normalize] */ /* get sign before writing to c */ x.sign = x.used == 0 ? MP_ZPOS : a->sign; if (c != NULL) { mp_clamp (&q); mp_exch (&q, c); c->sign = neg; } if (d != NULL) { mp_div_2d (&x, norm, &x, NULL); mp_exch (&x, d); } res = MP_OKAY; LBL_Y:mp_clear (&y); LBL_X:mp_clear (&x); LBL_T2:mp_clear (&t2); LBL_T1:mp_clear (&t1); LBL_Q:mp_clear (&q); return res; } #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_div_2.c0000644000175000017500000000275212456307241020314 0ustar jnthnjnthn#include #ifdef BN_MP_DIV_2_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = a/2 */ int mp_div_2(mp_int * a, mp_int * b) { int x, res, oldused; /* copy */ if (b->alloc < a->used) { if ((res = mp_grow (b, a->used)) != MP_OKAY) { return res; } } oldused = b->used; b->used = a->used; { register mp_digit r, rr, *tmpa, *tmpb; /* source alias */ tmpa = a->dp + b->used - 1; /* dest alias */ tmpb = b->dp + b->used - 1; /* carry */ r = 0; for (x = b->used - 1; x >= 0; x--) { /* get the carry for the next iteration */ rr = *tmpa & 1; /* shift the current digit, add in carry and store */ *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); /* forward carry to next iteration */ r = rr; } /* zero excess digits */ tmpb = b->dp + b->used; for (x = b->used; x < oldused; x++) { *tmpb++ = 0; } } b->sign = a->sign; mp_clamp (b); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_div_2d.c0000644000175000017500000000416612456307241020461 0ustar jnthnjnthn#include #ifdef BN_MP_DIV_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift right by a certain bit count (store quotient in c, optional remainder in d) */ int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) { mp_digit D, r, rr; int x, res; mp_int t; /* if the shift count is <= 0 then we do no work */ if (b <= 0) { res = mp_copy (a, c); if (d != NULL) { mp_zero (d); } return res; } if ((res = mp_init (&t)) != MP_OKAY) { return res; } /* get the remainder */ if (d != NULL) { if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } } /* copy */ if ((res = mp_copy (a, c)) != MP_OKAY) { mp_clear (&t); return res; } /* shift by as many digits in the bit count */ if (b >= (int)DIGIT_BIT) { mp_rshd (c, b / DIGIT_BIT); } /* shift any bit count < DIGIT_BIT */ D = (mp_digit) (b % DIGIT_BIT); if (D != 0) { register mp_digit *tmpc, mask, shift; /* mask */ mask = (((mp_digit)1) << D) - 1; /* shift for lsb */ shift = DIGIT_BIT - D; /* alias */ tmpc = c->dp + (c->used - 1); /* carry */ r = 0; for (x = c->used - 1; x >= 0; x--) { /* get the lower bits of this word in a temp */ rr = *tmpc & mask; /* shift the current word and mix in the carry bits from the previous word */ *tmpc = (*tmpc >> D) | (r << shift); --tmpc; /* set the carry to the carry bits of the current word found above */ r = rr; } } mp_clamp (c); if (d != NULL) { mp_exch (&t, d); } mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_div_3.c0000644000175000017500000000337112456307241020313 0ustar jnthnjnthn#include #ifdef BN_MP_DIV_3_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* divide by three (based on routine from MPI and the GMP manual) */ int mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) { mp_int q; mp_word w, t; mp_digit b; int res, ix; /* b = 2**DIGIT_BIT / 3 */ b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { return res; } q.used = a->used; q.sign = a->sign; w = 0; for (ix = a->used - 1; ix >= 0; ix--) { w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); if (w >= 3) { /* multiply w by [1/3] */ t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); /* now subtract 3 * [w/3] from w, to get the remainder */ w -= t+t+t; /* fixup the remainder as required since * the optimization is not exact. */ while (w >= 3) { t += 1; w -= 3; } } else { t = 0; } q.dp[ix] = (mp_digit)t; } /* [optional] store the remainder */ if (d != NULL) { *d = (mp_digit)w; } /* [optional] store the quotient */ if (c != NULL) { mp_clamp(&q); mp_exch(&q, c); } mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_div_d.c0000644000175000017500000000434612456307241020377 0ustar jnthnjnthn#include #ifdef BN_MP_DIV_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static int s_is_power_of_two(mp_digit b, int *p) { int x; /* fast return if no power of two */ if ((b==0) || (b & (b-1))) { return 0; } for (x = 0; x < DIGIT_BIT; x++) { if (b == (((mp_digit)1)<dp[0] & ((((mp_digit)1)<used)) != MP_OKAY) { return res; } q.used = a->used; q.sign = a->sign; w = 0; for (ix = a->used - 1; ix >= 0; ix--) { w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); if (w >= b) { t = (mp_digit)(w / b); w -= ((mp_word)t) * ((mp_word)b); } else { t = 0; } q.dp[ix] = (mp_digit)t; } if (d != NULL) { *d = (mp_digit)w; } if (c != NULL) { mp_clamp(&q); mp_exch(&q, c); } mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_dr_is_modulus.c0000644000175000017500000000200212456307241022145 0ustar jnthnjnthn#include #ifdef BN_MP_DR_IS_MODULUS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if a number is a valid DR modulus */ int mp_dr_is_modulus(mp_int *a) { int ix; /* must be at least two digits */ if (a->used < 2) { return 0; } /* must be of the form b**k - a [a <= b] so all * but the first digit must be equal to -1 (mod b). */ for (ix = 1; ix < a->used; ix++) { if (a->dp[ix] != MP_MASK) { return 0; } } return 1; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_dr_reduce.c0000644000175000017500000000444712456307241021250 0ustar jnthnjnthn#include #ifdef BN_MP_DR_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduce "x" in place modulo "n" using the Diminished Radix algorithm. * * Based on algorithm from the paper * * "Generating Efficient Primes for Discrete Log Cryptosystems" * Chae Hoon Lim, Pil Joong Lee, * POSTECH Information Research Laboratories * * The modulus must be of a special format [see manual] * * Has been modified to use algorithm 7.10 from the LTM book instead * * Input x must be in the range 0 <= x <= (n-1)**2 */ int mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k) { int err, i, m; mp_word r; mp_digit mu, *tmpx1, *tmpx2; /* m = digits in modulus */ m = n->used; /* ensure that "x" has at least 2m digits */ if (x->alloc < m + m) { if ((err = mp_grow (x, m + m)) != MP_OKAY) { return err; } } /* top of loop, this is where the code resumes if * another reduction pass is required. */ top: /* aliases for digits */ /* alias for lower half of x */ tmpx1 = x->dp; /* alias for upper half of x, or x/B**m */ tmpx2 = x->dp + m; /* set carry to zero */ mu = 0; /* compute (x mod B**m) + k * [x/B**m] inline and inplace */ for (i = 0; i < m; i++) { r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; *tmpx1++ = (mp_digit)(r & MP_MASK); mu = (mp_digit)(r >> ((mp_word)DIGIT_BIT)); } /* set final carry */ *tmpx1++ = mu; /* zero words above m */ for (i = m + 1; i < x->used; i++) { *tmpx1++ = 0; } /* clamp, sub and return */ mp_clamp (x); /* if x >= n then subtract and reduce again * Each successive "recursion" makes the input smaller and smaller. */ if (mp_cmp_mag (x, n) != MP_LT) { s_mp_sub(x, n, x); goto top; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_dr_setup.c0000644000175000017500000000160712456307241021134 0ustar jnthnjnthn#include #ifdef BN_MP_DR_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ void mp_dr_setup(mp_int *a, mp_digit *d) { /* the casts are required if DIGIT_BIT is one less than * the number of bits in a mp_digit [e.g. DIGIT_BIT==31] */ *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - ((mp_word)a->dp[0])); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_exch.c0000644000175000017500000000144212456307241020233 0ustar jnthnjnthn#include #ifdef BN_MP_EXCH_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* swap the elements of two integers, for cases where you can't simply swap the * mp_int pointers around */ void mp_exch (mp_int * a, mp_int * b) { mp_int t; t = *a; *a = *b; *b = t; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_expt_d.c0000644000175000017500000000233312456307241020567 0ustar jnthnjnthn#include #ifdef BN_MP_EXPT_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* calculate c = a**b using a square-multiply algorithm */ int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) { int res; mp_int g; if ((res = mp_init_copy (&g, a)) != MP_OKAY) { return res; } /* set initial result */ mp_set (c, 1); while (b > 0) { /* if the bit is set multiply */ if (b & 1) { if ((res = mp_mul (c, &g, c)) != MP_OKAY) { mp_clear (&g); return res; } } /* square */ if (b > 1 && (res = mp_sqr (&g, &g)) != MP_OKAY) { mp_clear (&g); return res; } /* shift to next bit */ b >>= 1; } mp_clear (&g); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_exptmod.c0000644000175000017500000000540712456307241020771 0ustar jnthnjnthn#include #ifdef BN_MP_EXPTMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this is a shell function that calls either the normal or Montgomery * exptmod functions. Originally the call to the montgomery code was * embedded in the normal function but that wasted alot of stack space * for nothing (since 99% of the time the Montgomery code would be called) */ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) { int dr; /* modulus P must be positive */ if (P->sign == MP_NEG) { return MP_VAL; } /* if exponent X is negative we have to recurse */ if (X->sign == MP_NEG) { #ifdef BN_MP_INVMOD_C mp_int tmpG, tmpX; int err; /* first compute 1/G mod P */ if ((err = mp_init(&tmpG)) != MP_OKAY) { return err; } if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { mp_clear(&tmpG); return err; } /* now get |X| */ if ((err = mp_init(&tmpX)) != MP_OKAY) { mp_clear(&tmpG); return err; } if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { mp_clear_multi(&tmpG, &tmpX, NULL); return err; } /* and now compute (1/G)**|X| instead of G**X [X < 0] */ err = mp_exptmod(&tmpG, &tmpX, P, Y); mp_clear_multi(&tmpG, &tmpX, NULL); return err; #else /* no invmod */ return MP_VAL; #endif } /* modified diminished radix reduction */ #if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C) if (mp_reduce_is_2k_l(P) == MP_YES) { return s_mp_exptmod(G, X, P, Y, 1); } #endif #ifdef BN_MP_DR_IS_MODULUS_C /* is it a DR modulus? */ dr = mp_dr_is_modulus(P); #else /* default to no */ dr = 0; #endif #ifdef BN_MP_REDUCE_IS_2K_C /* if not, is it a unrestricted DR modulus? */ if (dr == 0) { dr = mp_reduce_is_2k(P) << 1; } #endif /* if the modulus is odd or dr != 0 use the montgomery method */ #ifdef BN_MP_EXPTMOD_FAST_C if (mp_isodd (P) == 1 || dr != 0) { return mp_exptmod_fast (G, X, P, Y, dr); } else { #endif #ifdef BN_S_MP_EXPTMOD_C /* otherwise use the generic Barrett reduction technique */ return s_mp_exptmod (G, X, P, Y, 0); #else /* no exptmod for evens */ return MP_VAL; #endif #ifdef BN_MP_EXPTMOD_FAST_C } #endif } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_exptmod_fast.c0000644000175000017500000001753312456307241022011 0ustar jnthnjnthn#include #ifdef BN_MP_EXPTMOD_FAST_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 * * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. * The value of k changes based on the size of the exponent. * * Uses Montgomery or Diminished Radix reduction [whichever appropriate] */ #ifdef MP_LOW_MEM #define TAB_SIZE 32 #else #define TAB_SIZE 256 #endif int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { mp_int M[TAB_SIZE], res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; /* use a pointer to the reduction algorithm. This allows us to use * one of many reduction algorithms without modding the guts of * the code with if statements everywhere. */ int (*redux)(mp_int*,mp_int*,mp_digit); /* find window size */ x = mp_count_bits (X); if (x <= 7) { winsize = 2; } else if (x <= 36) { winsize = 3; } else if (x <= 140) { winsize = 4; } else if (x <= 450) { winsize = 5; } else if (x <= 1303) { winsize = 6; } else if (x <= 3529) { winsize = 7; } else { winsize = 8; } #ifdef MP_LOW_MEM if (winsize > 5) { winsize = 5; } #endif /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { return err; } /* now init the second half of the array */ for (x = 1<<(winsize-1); x < (1 << winsize); x++) { if ((err = mp_init(&M[x])) != MP_OKAY) { for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } mp_clear(&M[1]); return err; } } /* determine and setup reduction code */ if (redmode == 0) { #ifdef BN_MP_MONTGOMERY_SETUP_C /* now setup montgomery */ if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { goto LBL_M; } #else err = MP_VAL; goto LBL_M; #endif /* automatically pick the comba one if available (saves quite a few calls/ifs) */ #ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C if (((P->used * 2 + 1) < MP_WARRAY) && P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { redux = fast_mp_montgomery_reduce; } else #endif { #ifdef BN_MP_MONTGOMERY_REDUCE_C /* use slower baseline Montgomery method */ redux = mp_montgomery_reduce; #else err = MP_VAL; goto LBL_M; #endif } } else if (redmode == 1) { #if defined(BN_MP_DR_SETUP_C) && defined(BN_MP_DR_REDUCE_C) /* setup DR reduction for moduli of the form B**k - b */ mp_dr_setup(P, &mp); redux = mp_dr_reduce; #else err = MP_VAL; goto LBL_M; #endif } else { #if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) /* setup DR reduction for moduli of the form 2**k - b */ if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { goto LBL_M; } redux = mp_reduce_2k; #else err = MP_VAL; goto LBL_M; #endif } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { goto LBL_M; } /* create M table * * * The first half of the table is not computed though accept for M[0] and M[1] */ if (redmode == 0) { #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* now we need R mod m */ if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { goto LBL_RES; } #else err = MP_VAL; goto LBL_RES; #endif /* now set M[1] to G * R mod m */ if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { goto LBL_RES; } } else { mp_set(&res, 1); if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { goto LBL_RES; } } /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_RES; } for (x = 0; x < (winsize - 1); x++) { if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { goto LBL_RES; } } /* create upper table */ for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&M[x], P, mp)) != MP_OKAY) { goto LBL_RES; } } /* set initial mode and bit cnt */ mode = 0; bitcnt = 1; buf = 0; digidx = X->used - 1; bitcpy = 0; bitbuf = 0; for (;;) { /* grab next digit as required */ if (--bitcnt == 0) { /* if digidx == -1 we are out of digits so break */ if (digidx == -1) { break; } /* read next digit and reset bitcnt */ buf = X->dp[digidx--]; bitcnt = (int)DIGIT_BIT; } /* grab the next msb from the exponent */ y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; buf <<= (mp_digit)1; /* if the bit is zero and mode == 0 then we ignore it * These represent the leading zero bits before the first 1 bit * in the exponent. Technically this opt is not required but it * does lower the # of trivial squaring/reductions used */ if (mode == 0 && y == 0) { continue; } /* if the bit is zero and mode == 1 then we square */ if (mode == 1 && y == 0) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } continue; } /* else we add it to the window */ bitbuf |= (y << (winsize - ++bitcpy)); mode = 2; if (bitcpy == winsize) { /* ok window is filled so square as required and multiply */ /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } /* empty window and reset */ bitcpy = 0; bitbuf = 0; mode = 1; } } /* if bits remain then square/multiply */ if (mode == 2 && bitcpy > 0) { /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } /* get next bit of the window */ bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } } } if (redmode == 0) { /* fixup result if Montgomery reduction is used * recall that any value in a Montgomery system is * actually multiplied by R mod n. So we have * to reduce one more time to cancel out the factor * of R. */ if ((err = redux(&res, P, mp)) != MP_OKAY) { goto LBL_RES; } } /* swap res with Y */ mp_exch (&res, Y); err = MP_OKAY; LBL_RES:mp_clear (&res); LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_exteuclid.c0000644000175000017500000000611312456307241021272 0ustar jnthnjnthn#include #ifdef BN_MP_EXTEUCLID_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Extended euclidean algorithm of (a, b) produces a*u1 + b*u2 = u3 */ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) { mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; int err; if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { return err; } /* initialize, (u1,u2,u3) = (1,0,a) */ mp_set(&u1, 1); if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } /* initialize, (v1,v2,v3) = (0,1,b) */ mp_set(&v2, 1); if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } /* loop while v3 != 0 */ while (mp_iszero(&v3) == MP_NO) { /* q = u3/v3 */ if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } /* (u1,u2,u3) = (v1,v2,v3) */ if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } /* (v1,v2,v3) = (t1,t2,t3) */ if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } } /* make sure U3 >= 0 */ if (u3.sign == MP_NEG) { mp_neg(&u1, &u1); mp_neg(&u2, &u2); mp_neg(&u3, &u3); } /* copy result out */ if (U1 != NULL) { mp_exch(U1, &u1); } if (U2 != NULL) { mp_exch(U2, &u2); } if (U3 != NULL) { mp_exch(U3, &u3); } err = MP_OKAY; _ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_fread.c0000644000175000017500000000270512456307241020370 0ustar jnthnjnthn#include #ifdef BN_MP_FREAD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read a bigint from a file stream in ASCII */ int mp_fread(mp_int *a, int radix, FILE *stream) { int err, ch, neg, y; /* clear a */ mp_zero(a); /* if first digit is - then set negative */ ch = fgetc(stream); if (ch == '-') { neg = MP_NEG; ch = fgetc(stream); } else { neg = MP_ZPOS; } for (;;) { /* find y in the radix map */ for (y = 0; y < radix; y++) { if (mp_s_rmap[y] == ch) { break; } } if (y == radix) { break; } /* shift up and add */ if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { return err; } if ((err = mp_add_d(a, y, a)) != MP_OKAY) { return err; } ch = fgetc(stream); } if (mp_cmp_d(a, 0) != MP_EQ) { a->sign = neg; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_fwrite.c0000644000175000017500000000217412456307241020607 0ustar jnthnjnthn#include #ifdef BN_MP_FWRITE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ int mp_fwrite(mp_int *a, int radix, FILE *stream) { char *buf; int err, len, x; if ((err = mp_radix_size(a, radix, &len)) != MP_OKAY) { return err; } buf = OPT_CAST(char) XMALLOC (len); if (buf == NULL) { return MP_MEM; } if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { XFREE (buf); return err; } for (x = 0; x < len; x++) { if (fputc(buf[x], stream) == EOF) { XFREE (buf); return MP_VAL; } } XFREE (buf); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_gcd.c0000644000175000017500000000476512456307241020054 0ustar jnthnjnthn#include #ifdef BN_MP_GCD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Greatest Common Divisor using the binary method */ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) { mp_int u, v; int k, u_lsb, v_lsb, res; /* either zero than gcd is the largest */ if (mp_iszero (a) == MP_YES) { return mp_abs (b, c); } if (mp_iszero (b) == MP_YES) { return mp_abs (a, c); } /* get copies of a and b we can modify */ if ((res = mp_init_copy (&u, a)) != MP_OKAY) { return res; } if ((res = mp_init_copy (&v, b)) != MP_OKAY) { goto LBL_U; } /* must be positive for the remainder of the algorithm */ u.sign = v.sign = MP_ZPOS; /* B1. Find the common power of two for u and v */ u_lsb = mp_cnt_lsb(&u); v_lsb = mp_cnt_lsb(&v); k = MIN(u_lsb, v_lsb); if (k > 0) { /* divide the power of two out */ if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { goto LBL_V; } if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { goto LBL_V; } } /* divide any remaining factors of two out */ if (u_lsb != k) { if ((res = mp_div_2d(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { goto LBL_V; } } if (v_lsb != k) { if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { goto LBL_V; } } while (mp_iszero(&v) == 0) { /* make sure v is the largest */ if (mp_cmp_mag(&u, &v) == MP_GT) { /* swap u and v to make sure v is >= u */ mp_exch(&u, &v); } /* subtract smallest from largest */ if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { goto LBL_V; } /* Divide out all factors of two */ if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { goto LBL_V; } } /* multiply by 2**k which we divided out at the beginning */ if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { goto LBL_V; } c->sign = MP_ZPOS; res = MP_OKAY; LBL_V:mp_clear (&u); LBL_U:mp_clear (&v); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_get_int.c0000644000175000017500000000220112456307241020727 0ustar jnthnjnthn#include #ifdef BN_MP_GET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the lower 32-bits of an mp_int */ unsigned long mp_get_int(mp_int * a) { int i; unsigned long res; if (a->used == 0) { return 0; } /* get number of digits of the lsb we have to read */ i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; /* get most significant digit of result */ res = DIGIT(a,i); while (--i >= 0) { res = (res << DIGIT_BIT) | DIGIT(a,i); } /* force result to 32-bits always so it is consistent on non 32-bit platforms */ return res & 0xFFFFFFFFUL; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_get_long.c0000644000175000017500000000201212456307241021074 0ustar jnthnjnthn#include #ifdef BN_MP_GET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the lower unsigned long of an mp_int, platform dependent */ unsigned long mp_get_long(mp_int * a) { int i; unsigned long res; if (a->used == 0) { return 0; } /* get number of digits of the lsb we have to read */ i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; /* get most significant digit of result */ res = DIGIT(a,i); while (--i >= 0) { res = (res << DIGIT_BIT) | DIGIT(a,i); } return res; } #endif MoarVM-2015.11/3rdparty/libtommath/bn_mp_grow.c0000644000175000017500000000272612456307241020270 0ustar jnthnjnthn#include #ifdef BN_MP_GROW_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* grow as required */ int mp_grow (mp_int * a, int size) { int i; mp_digit *tmp; /* if the alloc size is smaller alloc more ram */ if (a->alloc < size) { /* ensure there are always at least MP_PREC digits extra on top */ size += (MP_PREC * 2) - (size % MP_PREC); /* reallocate the array a->dp * * We store the return in a temporary variable * in case the operation failed we don't want * to overwrite the dp member of a. */ tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); if (tmp == NULL) { /* reallocation failed but "a" is still valid [can be freed] */ return MP_MEM; } /* reallocation succeeded so set a->dp */ a->dp = tmp; /* zero excess digits */ i = a->alloc; a->alloc = size; for (; i < a->alloc; i++) { a->dp[i] = 0; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init.c0000644000175000017500000000210612456307241020245 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* init a new mp_int */ int mp_init (mp_int * a) { int i; /* allocate memory required and clear it */ a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); if (a->dp == NULL) { return MP_MEM; } /* set the digits to zero */ for (i = 0; i < MP_PREC; i++) { a->dp[i] = 0; } /* set the used to zero, allocated digits to the default precision * and sign to positive */ a->used = 0; a->alloc = MP_PREC; a->sign = MP_ZPOS; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init_copy.c0000644000175000017500000000143312456307241021301 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_COPY_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* creates "a" then copies b into it */ int mp_init_copy (mp_int * a, mp_int * b) { int res; if ((res = mp_init (a)) != MP_OKAY) { return res; } return mp_copy (b, a); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init_multi.c0000644000175000017500000000331212456307241021457 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_MULTI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #include int mp_init_multi(mp_int *mp, ...) { mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ int n = 0; /* Number of ok inits */ mp_int* cur_arg = mp; va_list args; va_start(args, mp); /* init args to next argument from caller */ while (cur_arg != NULL) { if (mp_init(cur_arg) != MP_OKAY) { /* Oops - error! Back-track and mp_clear what we already succeeded in init-ing, then return error. */ va_list clean_args; /* end the current list */ va_end(args); /* now start cleaning up */ cur_arg = mp; va_start(clean_args, mp); while (n--) { mp_clear(cur_arg); cur_arg = va_arg(clean_args, mp_int*); } va_end(clean_args); res = MP_MEM; break; } n++; cur_arg = va_arg(args, mp_int*); } va_end(args); return res; /* Assumed ok, if error flagged above. */ } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init_set.c0000644000175000017500000000142212456307241021120 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_SET_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* initialize and set a digit */ int mp_init_set (mp_int * a, mp_digit b) { int err; if ((err = mp_init(a)) != MP_OKAY) { return err; } mp_set(a, b); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init_set_int.c0000644000175000017500000000143412456307241021775 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* initialize and set a digit */ int mp_init_set_int (mp_int * a, unsigned long b) { int err; if ((err = mp_init(a)) != MP_OKAY) { return err; } return mp_set_int(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_init_size.c0000644000175000017500000000212512456307241021300 0ustar jnthnjnthn#include #ifdef BN_MP_INIT_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* init an mp_init for a given size */ int mp_init_size (mp_int * a, int size) { int x; /* pad size so there are always extra digits */ size += (MP_PREC * 2) - (size % MP_PREC); /* alloc mem */ a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size); if (a->dp == NULL) { return MP_MEM; } /* set the members */ a->used = 0; a->alloc = size; a->sign = MP_ZPOS; /* zero the digits */ for (x = 0; x < size; x++) { a->dp[x] = 0; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_invmod.c0000644000175000017500000000201712456307241020577 0ustar jnthnjnthn#include #ifdef BN_MP_INVMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* hac 14.61, pp608 */ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) { /* b cannot be negative */ if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } #ifdef BN_FAST_MP_INVMOD_C /* if the modulus is odd we can use a faster routine instead */ if (mp_isodd (b) == 1) { return fast_mp_invmod (a, b, c); } #endif #ifdef BN_MP_INVMOD_SLOW_C return mp_invmod_slow(a, b, c); #endif return MP_VAL; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_invmod_slow.c0000644000175000017500000000776012456307241021655 0ustar jnthnjnthn#include #ifdef BN_MP_INVMOD_SLOW_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* hac 14.61, pp608 */ int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) { mp_int x, y, u, v, A, B, C, D; int res; /* b cannot be negative */ if (b->sign == MP_NEG || mp_iszero(b) == 1) { return MP_VAL; } /* init temps */ if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL)) != MP_OKAY) { return res; } /* x = a, y = b */ if ((res = mp_mod(a, b, &x)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (b, &y)) != MP_OKAY) { goto LBL_ERR; } /* 2. [modified] if x,y are both even then return an error! */ if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { res = MP_VAL; goto LBL_ERR; } /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ if ((res = mp_copy (&x, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy (&y, &v)) != MP_OKAY) { goto LBL_ERR; } mp_set (&A, 1); mp_set (&D, 1); top: /* 4. while u is even do */ while (mp_iseven (&u) == 1) { /* 4.1 u = u/2 */ if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { goto LBL_ERR; } /* 4.2 if A or B is odd then */ if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { /* A = (A+y)/2, B = (B-x)/2 */ if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { goto LBL_ERR; } } /* A = A/2, B = B/2 */ if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { goto LBL_ERR; } } /* 5. while v is even do */ while (mp_iseven (&v) == 1) { /* 5.1 v = v/2 */ if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { goto LBL_ERR; } /* 5.2 if C or D is odd then */ if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { /* C = (C+y)/2, D = (D-x)/2 */ if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { goto LBL_ERR; } } /* C = C/2, D = D/2 */ if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { goto LBL_ERR; } } /* 6. if u >= v then */ if (mp_cmp (&u, &v) != MP_LT) { /* u = u - v, A = A - C, B = B - D */ if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { goto LBL_ERR; } } else { /* v - v - u, C = C - A, D = D - B */ if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { goto LBL_ERR; } } /* if not zero goto step 4 */ if (mp_iszero (&u) == 0) goto top; /* now a = C, b = D, gcd == g*v */ /* if v != 1 then there is no inverse */ if (mp_cmp_d (&v, 1) != MP_EQ) { res = MP_VAL; goto LBL_ERR; } /* if its too low */ while (mp_cmp_d(&C, 0) == MP_LT) { if ((res = mp_add(&C, b, &C)) != MP_OKAY) { goto LBL_ERR; } } /* too big */ while (mp_cmp_mag(&C, b) != MP_LT) { if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { goto LBL_ERR; } } /* C is now the inverse */ mp_exch (&C, c); res = MP_OKAY; LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_is_square.c0000644000175000017500000000617612456307241021310 0ustar jnthnjnthn#include #ifdef BN_MP_IS_SQUARE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Check if remainders are possible squares - fast exclude non-squares */ static const char rem_128[128] = { 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }; static const char rem_105[105] = { 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 }; /* Store non-zero to ret if arg is square, and zero if not */ int mp_is_square(mp_int *arg,int *ret) { int res; mp_digit c; mp_int t; unsigned long r; /* Default to Non-square :) */ *ret = MP_NO; if (arg->sign == MP_NEG) { return MP_VAL; } /* digits used? (TSD) */ if (arg->used == 0) { return MP_OKAY; } /* First check mod 128 (suppose that DIGIT_BIT is at least 7) */ if (rem_128[127 & DIGIT(arg,0)] == 1) { return MP_OKAY; } /* Next check mod 105 (3*5*7) */ if ((res = mp_mod_d(arg,105,&c)) != MP_OKAY) { return res; } if (rem_105[c] == 1) { return MP_OKAY; } if ((res = mp_init_set_int(&t,11L*13L*17L*19L*23L*29L*31L)) != MP_OKAY) { return res; } if ((res = mp_mod(arg,&t,&t)) != MP_OKAY) { goto LBL_ERR; } r = mp_get_int(&t); /* Check for other prime modules, note it's not an ERROR but we must * free "t" so the easiest way is to goto LBL_ERR. We know that res * is already equal to MP_OKAY from the mp_mod call */ if ( (1L<<(r%11)) & 0x5C4L ) goto LBL_ERR; if ( (1L<<(r%13)) & 0x9E4L ) goto LBL_ERR; if ( (1L<<(r%17)) & 0x5CE8L ) goto LBL_ERR; if ( (1L<<(r%19)) & 0x4F50CL ) goto LBL_ERR; if ( (1L<<(r%23)) & 0x7ACCA0L ) goto LBL_ERR; if ( (1L<<(r%29)) & 0xC2EDD0CL ) goto LBL_ERR; if ( (1L<<(r%31)) & 0x6DE2B848L ) goto LBL_ERR; /* Final check - is sqr(sqrt(arg)) == arg ? */ if ((res = mp_sqrt(arg,&t)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sqr(&t,&t)) != MP_OKAY) { goto LBL_ERR; } *ret = (mp_cmp_mag(&t,arg) == MP_EQ) ? MP_YES : MP_NO; LBL_ERR:mp_clear(&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_jacobi.c0000644000175000017500000000435512456307241020541 0ustar jnthnjnthn#include #ifdef BN_MP_JACOBI_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes the jacobi c = (a | n) (or Legendre if n is prime) * HAC pp. 73 Algorithm 2.149 */ int mp_jacobi (mp_int * a, mp_int * p, int *c) { mp_int a1, p1; int k, s, r, res; mp_digit residue; /* if p <= 0 return MP_VAL */ if (mp_cmp_d(p, 0) != MP_GT) { return MP_VAL; } /* step 1. if a == 0, return 0 */ if (mp_iszero (a) == 1) { *c = 0; return MP_OKAY; } /* step 2. if a == 1, return 1 */ if (mp_cmp_d (a, 1) == MP_EQ) { *c = 1; return MP_OKAY; } /* default */ s = 0; /* step 3. write a = a1 * 2**k */ if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { return res; } if ((res = mp_init (&p1)) != MP_OKAY) { goto LBL_A1; } /* divide out larger power of two */ k = mp_cnt_lsb(&a1); if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { goto LBL_P1; } /* step 4. if e is even set s=1 */ if ((k & 1) == 0) { s = 1; } else { /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ residue = p->dp[0] & 7; if (residue == 1 || residue == 7) { s = 1; } else if (residue == 3 || residue == 5) { s = -1; } } /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ if ( ((p->dp[0] & 3) == 3) && ((a1.dp[0] & 3) == 3)) { s = -s; } /* if a1 == 1 we're done */ if (mp_cmp_d (&a1, 1) == MP_EQ) { *c = s; } else { /* n1 = n mod a1 */ if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { goto LBL_P1; } if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { goto LBL_P1; } *c = s * r; } /* done */ res = MP_OKAY; LBL_P1:mp_clear (&p1); LBL_A1:mp_clear (&a1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_karatsuba_mul.c0000644000175000017500000001131112456307241022132 0ustar jnthnjnthn#include #ifdef BN_MP_KARATSUBA_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = |a| * |b| using Karatsuba Multiplication using * three half size multiplications * * Let B represent the radix [e.g. 2**DIGIT_BIT] and * let n represent half of the number of digits in * the min(a,b) * * a = a1 * B**n + a0 * b = b1 * B**n + b0 * * Then, a * b => a1b1 * B**2n + ((a1 + a0)(b1 + b0) - (a0b0 + a1b1)) * B + a0b0 * * Note that a1b1 and a0b0 are used twice and only need to be * computed once. So in total three half size (half # of * digit) multiplications are performed, a0b0, a1b1 and * (a1+b1)(a0+b0) * * Note that a multiplication of half the digits requires * 1/4th the number of single precision multiplications so in * total after one call 25% of the single precision multiplications * are saved. Note also that the call to mp_mul can end up back * in this function if the a0, a1, b0, or b1 are above the threshold. * This is known as divide-and-conquer and leads to the famous * O(N**lg(3)) or O(N**1.584) work which is asymptopically lower than * the standard O(N**2) that the baseline/comba methods use. * Generally though the overhead of this method doesn't pay off * until a certain size (N ~ 80) is reached. */ int mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) { mp_int x0, x1, y0, y1, t1, x0y0, x1y1; int B, err; /* default the return code to an error */ err = MP_MEM; /* min # of digits */ B = MIN (a->used, b->used); /* now divide in two */ B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) goto LBL_ERR; if (mp_init_size (&x1, a->used - B) != MP_OKAY) goto X0; if (mp_init_size (&y0, B) != MP_OKAY) goto X1; if (mp_init_size (&y1, b->used - B) != MP_OKAY) goto Y0; /* init temps */ if (mp_init_size (&t1, B * 2) != MP_OKAY) goto Y1; if (mp_init_size (&x0y0, B * 2) != MP_OKAY) goto T1; if (mp_init_size (&x1y1, B * 2) != MP_OKAY) goto X0Y0; /* now shift the digits */ x0.used = y0.used = B; x1.used = a->used - B; y1.used = b->used - B; { register int x; register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; /* we copy the digits directly instead of using higher level functions * since we also need to shift the digits */ tmpa = a->dp; tmpb = b->dp; tmpx = x0.dp; tmpy = y0.dp; for (x = 0; x < B; x++) { *tmpx++ = *tmpa++; *tmpy++ = *tmpb++; } tmpx = x1.dp; for (x = B; x < a->used; x++) { *tmpx++ = *tmpa++; } tmpy = y1.dp; for (x = B; x < b->used; x++) { *tmpy++ = *tmpb++; } } /* only need to clamp the lower words since by definition the * upper words x1/y1 must have a known number of digits */ mp_clamp (&x0); mp_clamp (&y0); /* now calc the products x0y0 and x1y1 */ /* after this x0 is no longer required, free temp [x0==t2]! */ if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) goto X1Y1; /* x0y0 = x0*y0 */ if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) goto X1Y1; /* x1y1 = x1*y1 */ /* now calc x1+x0 and y1+y0 */ if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = x1 - x0 */ if (s_mp_add (&y1, &y0, &x0) != MP_OKAY) goto X1Y1; /* t2 = y1 - y0 */ if (mp_mul (&t1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = (x1 + x0) * (y1 + y0) */ /* add x0y0 */ if (mp_add (&x0y0, &x1y1, &x0) != MP_OKAY) goto X1Y1; /* t2 = x0y0 + x1y1 */ if (s_mp_sub (&t1, &x0, &t1) != MP_OKAY) goto X1Y1; /* t1 = (x1+x0)*(y1+y0) - (x1y1 + x0y0) */ /* shift by B */ if (mp_lshd (&t1, B) != MP_OKAY) goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< #ifdef BN_MP_KARATSUBA_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Karatsuba squaring, computes b = a*a using three * half size squarings * * See comments of karatsuba_mul for details. It * is essentially the same algorithm but merely * tuned to perform recursive squarings. */ int mp_karatsuba_sqr (mp_int * a, mp_int * b) { mp_int x0, x1, t1, t2, x0x0, x1x1; int B, err; err = MP_MEM; /* min # of digits */ B = a->used; /* now divide in two */ B = B >> 1; /* init copy all the temps */ if (mp_init_size (&x0, B) != MP_OKAY) goto LBL_ERR; if (mp_init_size (&x1, a->used - B) != MP_OKAY) goto X0; /* init temps */ if (mp_init_size (&t1, a->used * 2) != MP_OKAY) goto X1; if (mp_init_size (&t2, a->used * 2) != MP_OKAY) goto T1; if (mp_init_size (&x0x0, B * 2) != MP_OKAY) goto T2; if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) goto X0X0; { register int x; register mp_digit *dst, *src; src = a->dp; /* now shift the digits */ dst = x0.dp; for (x = 0; x < B; x++) { *dst++ = *src++; } dst = x1.dp; for (x = B; x < a->used; x++) { *dst++ = *src++; } } x0.used = B; x1.used = a->used - B; mp_clamp (&x0); /* now calc the products x0*x0 and x1*x1 */ if (mp_sqr (&x0, &x0x0) != MP_OKAY) goto X1X1; /* x0x0 = x0*x0 */ if (mp_sqr (&x1, &x1x1) != MP_OKAY) goto X1X1; /* x1x1 = x1*x1 */ /* now calc (x1+x0)**2 */ if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) goto X1X1; /* t1 = x1 - x0 */ if (mp_sqr (&t1, &t1) != MP_OKAY) goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ /* add x0y0 */ if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) goto X1X1; /* t2 = x0x0 + x1x1 */ if (s_mp_sub (&t1, &t2, &t1) != MP_OKAY) goto X1X1; /* t1 = (x1+x0)**2 - (x0x0 + x1x1) */ /* shift by B */ if (mp_lshd (&t1, B) != MP_OKAY) goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))< #ifdef BN_MP_LCM_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes least common multiple as |a*b|/(a, b) */ int mp_lcm (mp_int * a, mp_int * b, mp_int * c) { int res; mp_int t1, t2; if ((res = mp_init_multi (&t1, &t2, NULL)) != MP_OKAY) { return res; } /* t1 = get the GCD of the two inputs */ if ((res = mp_gcd (a, b, &t1)) != MP_OKAY) { goto LBL_T; } /* divide the smallest by the GCD */ if (mp_cmp_mag(a, b) == MP_LT) { /* store quotient in t2 such that t2 * b is the LCM */ if ((res = mp_div(a, &t1, &t2, NULL)) != MP_OKAY) { goto LBL_T; } res = mp_mul(b, &t2, c); } else { /* store quotient in t2 such that t2 * a is the LCM */ if ((res = mp_div(b, &t1, &t2, NULL)) != MP_OKAY) { goto LBL_T; } res = mp_mul(a, &t2, c); } /* fix the sign to positive */ c->sign = MP_ZPOS; LBL_T: mp_clear_multi (&t1, &t2, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_lshd.c0000644000175000017500000000303512456307241020236 0ustar jnthnjnthn#include #ifdef BN_MP_LSHD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift left a certain amount of digits */ int mp_lshd (mp_int * a, int b) { int x, res; /* if its less than zero return */ if (b <= 0) { return MP_OKAY; } /* grow to fit the new digits */ if (a->alloc < a->used + b) { if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { return res; } } { register mp_digit *top, *bottom; /* increment the used by the shift amount then copy upwards */ a->used += b; /* top */ top = a->dp + a->used - 1; /* base */ bottom = a->dp + a->used - 1 - b; /* much like mp_rshd this is implemented using a sliding window * except the window goes the otherway around. Copying from * the bottom to the top. see bn_mp_rshd.c for more info. */ for (x = a->used - 1; x >= b; x--) { *top-- = *bottom--; } /* zero the lower digits */ top = a->dp; for (x = 0; x < b; x++) { *top++ = 0; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mod.c0000644000175000017500000000200312456307241020055 0ustar jnthnjnthn#include #ifdef BN_MP_MOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = a mod b, 0 <= c < b */ int mp_mod (mp_int * a, mp_int * b, mp_int * c) { mp_int t; int res; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { mp_clear (&t); return res; } if (mp_iszero(&t) || t.sign == b->sign) { res = MP_OKAY; mp_exch (&t, c); } else { res = mp_add (b, &t, c); } mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mod_2d.c0000644000175000017500000000257212456307241020455 0ustar jnthnjnthn#include #ifdef BN_MP_MOD_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* calc a value mod 2**b */ int mp_mod_2d (mp_int * a, int b, mp_int * c) { int x, res; /* if b is <= 0 then zero the int */ if (b <= 0) { mp_zero (c); return MP_OKAY; } /* if the modulus is larger than the value than return */ if (b >= (int) (a->used * DIGIT_BIT)) { res = mp_copy (a, c); return res; } /* copy */ if ((res = mp_copy (a, c)) != MP_OKAY) { return res; } /* zero digits above the last digit of the modulus */ for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { c->dp[x] = 0; } /* clear the digit that is not completely outside/inside the modulus */ c->dp[b / DIGIT_BIT] &= (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mod_d.c0000644000175000017500000000126612456307241020372 0ustar jnthnjnthn#include #ifdef BN_MP_MOD_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ int mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) { return mp_div_d(a, b, NULL, c); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_montgomery_calc_normalization.c0000644000175000017500000000275112456307241025440 0ustar jnthnjnthn#include #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* * shifts with subtractions when the result is greater than b. * * The method is slightly modified to shift B unconditionally upto just under * the leading bit of b. This saves alot of multiple precision shifting. */ int mp_montgomery_calc_normalization (mp_int * a, mp_int * b) { int x, bits, res; /* how many bits of last digit does b use */ bits = mp_count_bits (b) % DIGIT_BIT; if (b->used > 1) { if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { return res; } } else { mp_set(a, 1); bits = 1; } /* now compute C = A * B mod b */ for (x = bits - 1; x < (int)DIGIT_BIT; x++) { if ((res = mp_mul_2 (a, a)) != MP_OKAY) { return res; } if (mp_cmp_mag (a, b) != MP_LT) { if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { return res; } } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_montgomery_reduce.c0000644000175000017500000000574112456307241023041 0ustar jnthnjnthn#include #ifdef BN_MP_MONTGOMERY_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes xR**-1 == x (mod N) via Montgomery Reduction */ int mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) { int ix, res, digs; mp_digit mu; /* can the fast reduction [comba] method be used? * * Note that unlike in mul you're safely allowed *less* * than the available columns [255 per default] since carries * are fixed up in the inner loop. */ digs = n->used * 2 + 1; if ((digs < MP_WARRAY) && n->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_mp_montgomery_reduce (x, n, rho); } /* grow the input as required */ if (x->alloc < digs) { if ((res = mp_grow (x, digs)) != MP_OKAY) { return res; } } x->used = digs; for (ix = 0; ix < n->used; ix++) { /* mu = ai * rho mod b * * The value of rho must be precalculated via * montgomery_setup() such that * it equals -1/n0 mod b this allows the * following inner loop to reduce the * input one digit at a time */ mu = (mp_digit) (((mp_word)x->dp[ix]) * ((mp_word)rho) & MP_MASK); /* a = a + mu * m * b**i */ { register int iy; register mp_digit *tmpn, *tmpx, u; register mp_word r; /* alias for digits of the modulus */ tmpn = n->dp; /* alias for the digits of x [the input] */ tmpx = x->dp + ix; /* set the carry to zero */ u = 0; /* Multiply and add in place */ for (iy = 0; iy < n->used; iy++) { /* compute product and sum */ r = ((mp_word)mu) * ((mp_word)*tmpn++) + ((mp_word) u) + ((mp_word) * tmpx); /* get carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); /* fix digit */ *tmpx++ = (mp_digit)(r & ((mp_word) MP_MASK)); } /* At this point the ix'th digit of x should be zero */ /* propagate carries upwards as required*/ while (u) { *tmpx += u; u = *tmpx >> DIGIT_BIT; *tmpx++ &= MP_MASK; } } } /* at this point the n.used'th least * significant digits of x are all zero * which means we can shift x to the * right by n.used digits and the * residue is unchanged. */ /* x = x/b**n.used */ mp_clamp(x); mp_rshd (x, n->used); /* if x >= n then x = x - n */ if (mp_cmp_mag (x, n) != MP_LT) { return s_mp_sub (x, n, x); } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_montgomery_setup.c0000644000175000017500000000302112456307241022717 0ustar jnthnjnthn#include #ifdef BN_MP_MONTGOMERY_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* setups the montgomery reduction stuff */ int mp_montgomery_setup (mp_int * n, mp_digit * rho) { mp_digit x, b; /* fast inversion mod 2**k * * Based on the fact that * * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) * => 2*X*A - X*X*A*A = 1 * => 2*(1) - (1) = 1 */ b = n->dp[0]; if ((b & 1) == 0) { return MP_VAL; } x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ x *= 2 - b * x; /* here x*a==1 mod 2**8 */ #if !defined(MP_8BIT) x *= 2 - b * x; /* here x*a==1 mod 2**16 */ #endif #if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) x *= 2 - b * x; /* here x*a==1 mod 2**32 */ #endif #ifdef MP_64BIT x *= 2 - b * x; /* here x*a==1 mod 2**64 */ #endif /* rho = -1/m mod b */ *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mul.c0000644000175000017500000000333012456307241020077 0ustar jnthnjnthn#include #ifdef BN_MP_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level multiplication (handles sign) */ int mp_mul (mp_int * a, mp_int * b, mp_int * c) { int res, neg; neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; /* use Toom-Cook? */ #ifdef BN_MP_TOOM_MUL_C if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { res = mp_toom_mul(a, b, c); } else #endif #ifdef BN_MP_KARATSUBA_MUL_C /* use Karatsuba? */ if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { res = mp_karatsuba_mul (a, b, c); } else #endif { /* can we use the fast multiplier? * * The fast multiplier can be used if the output will * have less than MP_WARRAY digits and the number of * digits won't affect carry propagation */ int digs = a->used + b->used + 1; #ifdef BN_FAST_S_MP_MUL_DIGS_C if ((digs < MP_WARRAY) && MIN(a->used, b->used) <= (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { res = fast_s_mp_mul_digs (a, b, c, digs); } else #endif #ifdef BN_S_MP_MUL_DIGS_C res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ #else res = MP_VAL; #endif } c->sign = (c->used > 0) ? neg : MP_ZPOS; return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mul_2.c0000644000175000017500000000354312456307241020326 0ustar jnthnjnthn#include #ifdef BN_MP_MUL_2_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = a*2 */ int mp_mul_2(mp_int * a, mp_int * b) { int x, res, oldused; /* grow to accomodate result */ if (b->alloc < a->used + 1) { if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { return res; } } oldused = b->used; b->used = a->used; { register mp_digit r, rr, *tmpa, *tmpb; /* alias for source */ tmpa = a->dp; /* alias for dest */ tmpb = b->dp; /* carry */ r = 0; for (x = 0; x < a->used; x++) { /* get what will be the *next* carry bit from the * MSB of the current digit */ rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); /* now shift up this digit, add in the carry [from the previous] */ *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; /* copy the carry that would be from the source * digit into the next iteration */ r = rr; } /* new leading digit? */ if (r != 0) { /* add a MSB which is always 1 at this point */ *tmpb = 1; ++(b->used); } /* now zero any excess digits on the destination * that we didn't write to */ tmpb = b->dp + b->used; for (x = b->used; x < oldused; x++) { *tmpb++ = 0; } } b->sign = a->sign; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mul_2d.c0000644000175000017500000000363112456307241020470 0ustar jnthnjnthn#include #ifdef BN_MP_MUL_2D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift left by a certain bit count */ int mp_mul_2d (mp_int * a, int b, mp_int * c) { mp_digit d; int res; /* copy */ if (a != c) { if ((res = mp_copy (a, c)) != MP_OKAY) { return res; } } if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { return res; } } /* shift by as many digits in the bit count */ if (b >= (int)DIGIT_BIT) { if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { return res; } } /* shift any bit count < DIGIT_BIT */ d = (mp_digit) (b % DIGIT_BIT); if (d != 0) { register mp_digit *tmpc, shift, mask, r, rr; register int x; /* bitmask for carries */ mask = (((mp_digit)1) << d) - 1; /* shift for msbs */ shift = DIGIT_BIT - d; /* alias */ tmpc = c->dp; /* carry */ r = 0; for (x = 0; x < c->used; x++) { /* get the higher bits of the current word */ rr = (*tmpc >> shift) & mask; /* shift the current word and OR in the carry */ *tmpc = ((*tmpc << d) | r) & MP_MASK; ++tmpc; /* set the carry to the carry bits of the current word */ r = rr; } /* set final carry */ if (r != 0) { c->dp[(c->used)++] = r; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mul_d.c0000644000175000017500000000340612456307241020406 0ustar jnthnjnthn#include #ifdef BN_MP_MUL_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiply by a digit */ int mp_mul_d (mp_int * a, mp_digit b, mp_int * c) { mp_digit u, *tmpa, *tmpc; mp_word r; int ix, res, olduse; /* make sure c is big enough to hold a*b */ if (c->alloc < a->used + 1) { if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { return res; } } /* get the original destinations used count */ olduse = c->used; /* set the sign */ c->sign = a->sign; /* alias for a->dp [source] */ tmpa = a->dp; /* alias for c->dp [dest] */ tmpc = c->dp; /* zero carry */ u = 0; /* compute columns */ for (ix = 0; ix < a->used; ix++) { /* compute product and carry sum for this term */ r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b); /* mask off higher bits to get a single digit */ *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* send carry into next iteration */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } /* store final carry [if any] and increment ix offset */ *tmpc++ = u; ++ix; /* now zero digits above the top */ while (ix++ < olduse) { *tmpc++ = 0; } /* set used count */ c->used = a->used + 1; mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_mulmod.c0000644000175000017500000000164212456307241020603 0ustar jnthnjnthn#include #ifdef BN_MP_MULMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a * b (mod c) */ int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_mul (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_n_root.c0000644000175000017500000000552612456307241020613 0ustar jnthnjnthn#include #ifdef BN_MP_N_ROOT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* find the n'th root of an integer * * Result found such that (c)**b <= a and (c+1)**b > a * * This algorithm uses Newton's approximation * x[i+1] = x[i] - f(x[i])/f'(x[i]) * which will find the root in log(N) time where * each step involves a fair bit. This is not meant to * find huge roots [square and cube, etc]. */ int mp_n_root (mp_int * a, mp_digit b, mp_int * c) { mp_int t1, t2, t3; int res, neg; /* input must be positive if b is even */ if ((b & 1) == 0 && a->sign == MP_NEG) { return MP_VAL; } if ((res = mp_init (&t1)) != MP_OKAY) { return res; } if ((res = mp_init (&t2)) != MP_OKAY) { goto LBL_T1; } if ((res = mp_init (&t3)) != MP_OKAY) { goto LBL_T2; } /* if a is negative fudge the sign but keep track */ neg = a->sign; a->sign = MP_ZPOS; /* t2 = 2 */ mp_set (&t2, 2); do { /* t1 = t2 */ if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { goto LBL_T3; } /* t2 = t1 - ((t1**b - a) / (b * t1**(b-1))) */ /* t3 = t1**(b-1) */ if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { goto LBL_T3; } /* numerator */ /* t2 = t1**b */ if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { goto LBL_T3; } /* t2 = t1**b - a */ if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { goto LBL_T3; } /* denominator */ /* t3 = t1**(b-1) * b */ if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { goto LBL_T3; } /* t3 = (t1**b - a)/(b * t1**(b-1)) */ if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { goto LBL_T3; } if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { goto LBL_T3; } } while (mp_cmp (&t1, &t2) != MP_EQ); /* result can be off by a few so check */ for (;;) { if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { goto LBL_T3; } if (mp_cmp (&t2, a) == MP_GT) { if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { goto LBL_T3; } } else { break; } } /* reset the sign of a first */ a->sign = neg; /* set the result */ mp_exch (&t1, c); /* set the sign of the result */ c->sign = neg; res = MP_OKAY; LBL_T3:mp_clear (&t3); LBL_T2:mp_clear (&t2); LBL_T1:mp_clear (&t1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_neg.c0000644000175000017500000000161612456307241020060 0ustar jnthnjnthn#include #ifdef BN_MP_NEG_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* b = -a */ int mp_neg (mp_int * a, mp_int * b) { int res; if (a != b) { if ((res = mp_copy (a, b)) != MP_OKAY) { return res; } } if (mp_iszero(b) != MP_YES) { b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; } else { b->sign = MP_ZPOS; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_or.c0000644000175000017500000000212112456307241017717 0ustar jnthnjnthn#include #ifdef BN_MP_OR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* OR two ints together */ int mp_or (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] |= x->dp[ix]; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_fermat.c0000644000175000017500000000265312456307241021763 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_FERMAT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* performs one Fermat test. * * If "a" were prime then b**a == b (mod a) since the order of * the multiplicative sub-group would be phi(a) = a-1. That means * it would be the same as b**(a mod (a-1)) == b**1 == b (mod a). * * Sets result to 1 if the congruence holds, or zero otherwise. */ int mp_prime_fermat (mp_int * a, mp_int * b, int *result) { mp_int t; int err; /* default to composite */ *result = MP_NO; /* ensure b > 1 */ if (mp_cmp_d(b, 1) != MP_GT) { return MP_VAL; } /* init t */ if ((err = mp_init (&t)) != MP_OKAY) { return err; } /* compute t = b**a mod a */ if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { goto LBL_T; } /* is it equal to b? */ if (mp_cmp (&t, b) == MP_EQ) { *result = MP_YES; } err = MP_OKAY; LBL_T:mp_clear (&t); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_is_divisible.c0000644000175000017500000000224412456307241023146 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_IS_DIVISIBLE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if an integers is divisible by one * of the first PRIME_SIZE primes or not * * sets result to 0 if not, 1 if yes */ int mp_prime_is_divisible (mp_int * a, int *result) { int err, ix; mp_digit res; /* default to not */ *result = MP_NO; for (ix = 0; ix < PRIME_SIZE; ix++) { /* what is a mod LBL_prime_tab[ix] */ if ((err = mp_mod_d (a, ltm_prime_tab[ix], &res)) != MP_OKAY) { return err; } /* is the residue zero? */ if (res == 0) { *result = MP_YES; return MP_OKAY; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_is_prime.c0000644000175000017500000000350012456307241022304 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_IS_PRIME_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* performs a variable number of rounds of Miller-Rabin * * Probability of error after t rounds is no more than * * Sets result to 1 if probably prime, 0 otherwise */ int mp_prime_is_prime (mp_int * a, int t, int *result) { mp_int b; int ix, err, res; /* default to no */ *result = MP_NO; /* valid value of t? */ if (t <= 0 || t > PRIME_SIZE) { return MP_VAL; } /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { *result = 1; return MP_OKAY; } } /* first perform trial division */ if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { return err; } /* return if it was trivially divisible */ if (res == MP_YES) { return MP_OKAY; } /* now perform the miller-rabin rounds */ if ((err = mp_init (&b)) != MP_OKAY) { return err; } for (ix = 0; ix < t; ix++) { /* set the prime */ mp_set (&b, ltm_prime_tab[ix]); if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { goto LBL_B; } if (res == MP_NO) { goto LBL_B; } } /* passed the test */ *result = MP_YES; LBL_B:mp_clear (&b); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_miller_rabin.c0000644000175000017500000000451112456307241023137 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_MILLER_RABIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Miller-Rabin test of "a" to the base of "b" as described in * HAC pp. 139 Algorithm 4.24 * * Sets result to 0 if definitely composite or 1 if probably prime. * Randomly the chance of error is no more than 1/4 and often * very much lower. */ int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) { mp_int n1, y, r; int s, j, err; /* default */ *result = MP_NO; /* ensure b > 1 */ if (mp_cmp_d(b, 1) != MP_GT) { return MP_VAL; } /* get n1 = a - 1 */ if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { return err; } if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { goto LBL_N1; } /* set 2**s * r = n1 */ if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { goto LBL_N1; } /* count the number of least significant bits * which are zero */ s = mp_cnt_lsb(&r); /* now divide n - 1 by 2**s */ if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { goto LBL_R; } /* compute y = b**r mod a */ if ((err = mp_init (&y)) != MP_OKAY) { goto LBL_R; } if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { goto LBL_Y; } /* if y != 1 and y != n1 do */ if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { j = 1; /* while j <= s-1 and y != n1 */ while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { goto LBL_Y; } /* if y == 1 then composite */ if (mp_cmp_d (&y, 1) == MP_EQ) { goto LBL_Y; } ++j; } /* if y != n1 then composite */ if (mp_cmp (&y, &n1) != MP_EQ) { goto LBL_Y; } } /* probably prime now */ *result = MP_YES; LBL_Y:mp_clear (&y); LBL_R:mp_clear (&r); LBL_N1:mp_clear (&n1); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_next_prime.c0000644000175000017500000001114412456307241022652 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_NEXT_PRIME_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* finds the next prime after the number "a" using "t" trials * of Miller-Rabin. * * bbs_style = 1 means the prime must be congruent to 3 mod 4 */ int mp_prime_next_prime(mp_int *a, int t, int bbs_style) { int err, res, x, y; mp_digit res_tab[PRIME_SIZE], step, kstep; mp_int b; /* ensure t is valid */ if (t <= 0 || t > PRIME_SIZE) { return MP_VAL; } /* force positive */ a->sign = MP_ZPOS; /* simple algo if a is less than the largest prime in the table */ if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { /* find which prime it is bigger than */ for (x = PRIME_SIZE - 2; x >= 0; x--) { if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { if (bbs_style == 1) { /* ok we found a prime smaller or * equal [so the next is larger] * * however, the prime must be * congruent to 3 mod 4 */ if ((ltm_prime_tab[x + 1] & 3) != 3) { /* scan upwards for a prime congruent to 3 mod 4 */ for (y = x + 1; y < PRIME_SIZE; y++) { if ((ltm_prime_tab[y] & 3) == 3) { mp_set(a, ltm_prime_tab[y]); return MP_OKAY; } } } } else { mp_set(a, ltm_prime_tab[x + 1]); return MP_OKAY; } } } /* at this point a maybe 1 */ if (mp_cmp_d(a, 1) == MP_EQ) { mp_set(a, 2); return MP_OKAY; } /* fall through to the sieve */ } /* generate a prime congruent to 3 mod 4 or 1/3 mod 4? */ if (bbs_style == 1) { kstep = 4; } else { kstep = 2; } /* at this point we will use a combination of a sieve and Miller-Rabin */ if (bbs_style == 1) { /* if a mod 4 != 3 subtract the correct value to make it so */ if ((a->dp[0] & 3) != 3) { if ((err = mp_sub_d(a, (a->dp[0] & 3) + 1, a)) != MP_OKAY) { return err; }; } } else { if (mp_iseven(a) == 1) { /* force odd */ if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { return err; } } } /* generate the restable */ for (x = 1; x < PRIME_SIZE; x++) { if ((err = mp_mod_d(a, ltm_prime_tab[x], res_tab + x)) != MP_OKAY) { return err; } } /* init temp used for Miller-Rabin Testing */ if ((err = mp_init(&b)) != MP_OKAY) { return err; } for (;;) { /* skip to the next non-trivially divisible candidate */ step = 0; do { /* y == 1 if any residue was zero [e.g. cannot be prime] */ y = 0; /* increase step to next candidate */ step += kstep; /* compute the new residue without using division */ for (x = 1; x < PRIME_SIZE; x++) { /* add the step to each residue */ res_tab[x] += kstep; /* subtract the modulus [instead of using division] */ if (res_tab[x] >= ltm_prime_tab[x]) { res_tab[x] -= ltm_prime_tab[x]; } /* set flag if zero */ if (res_tab[x] == 0) { y = 1; } } } while (y == 1 && step < ((((mp_digit)1)<= ((((mp_digit)1)< #ifdef BN_MP_PRIME_RABIN_MILLER_TRIALS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ static const struct { int k, t; } sizes[] = { { 128, 28 }, { 256, 16 }, { 384, 10 }, { 512, 7 }, { 640, 6 }, { 768, 5 }, { 896, 4 }, { 1024, 4 } }; /* returns # of RM trials required for a given bit size */ int mp_prime_rabin_miller_trials(int size) { int x; for (x = 0; x < (int)(sizeof(sizes)/(sizeof(sizes[0]))); x++) { if (sizes[x].k == size) { return sizes[x].t; } else if (sizes[x].k > size) { return (x == 0) ? sizes[0].t : sizes[x - 1].t; } } return sizes[x-1].t + 1; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_prime_random_ex.c0000644000175000017500000000703412456307241022457 0ustar jnthnjnthn#include #ifdef BN_MP_PRIME_RANDOM_EX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* makes a truly random prime of a given size (bits), * * Flags are as follows: * * LTM_PRIME_BBS - make prime congruent to 3 mod 4 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) * LTM_PRIME_2MSB_ON - make the 2nd highest bit one * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * */ /* This is possibly the mother of all prime generation functions, muahahahahaha! */ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat) { unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; int res, err, bsize, maskOR_msb_offset; /* sanity check the input */ if (size <= 1 || t <= 0) { return MP_VAL; } /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ if (flags & LTM_PRIME_SAFE) { flags |= LTM_PRIME_BBS; } /* calc the byte size */ bsize = (size>>3) + ((size&7)?1:0); /* we need a buffer of bsize bytes */ tmp = OPT_CAST(unsigned char) XMALLOC(bsize); if (tmp == NULL) { return MP_MEM; } /* calc the maskAND value for the MSbyte*/ maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); /* calc the maskOR_msb */ maskOR_msb = 0; maskOR_msb_offset = ((size & 7) == 1) ? 1 : 0; if (flags & LTM_PRIME_2MSB_ON) { maskOR_msb |= 0x80 >> ((9 - size) & 7); } /* get the maskOR_lsb */ maskOR_lsb = 1; if (flags & LTM_PRIME_BBS) { maskOR_lsb |= 3; } do { /* read the bytes */ if (cb(tmp, bsize, dat) != bsize) { err = MP_VAL; goto error; } /* work over the MSbyte */ tmp[0] &= maskAND; tmp[0] |= 1 << ((size - 1) & 7); /* mix in the maskORs */ tmp[maskOR_msb_offset] |= maskOR_msb; tmp[bsize-1] |= maskOR_lsb; /* read it in */ if ((err = mp_read_unsigned_bin(a, tmp, bsize)) != MP_OKAY) { goto error; } /* is it prime? */ if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } if (res == MP_NO) { continue; } if (flags & LTM_PRIME_SAFE) { /* see if (a-1)/2 is prime */ if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } /* is it prime? */ if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } } } while (res == MP_NO); if (flags & LTM_PRIME_SAFE) { /* restore a to the original value */ if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } } err = MP_OKAY; error: XFREE(tmp); return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_radix_size.c0000644000175000017500000000325712456307241021453 0ustar jnthnjnthn#include #ifdef BN_MP_RADIX_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* returns size of ASCII reprensentation */ int mp_radix_size (mp_int * a, int radix, int *size) { int res, digs; mp_int t; mp_digit d; *size = 0; /* make sure the radix is in range */ if (radix < 2 || radix > 64) { return MP_VAL; } if (mp_iszero(a) == MP_YES) { *size = 2; return MP_OKAY; } /* special case for binary */ if (radix == 2) { *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; return MP_OKAY; } /* digs is the digit count */ digs = 0; /* if it's negative add one for the sign */ if (a->sign == MP_NEG) { ++digs; } /* init a copy of the input */ if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* force temp to positive */ t.sign = MP_ZPOS; /* fetch out all of the digits */ while (mp_iszero (&t) == MP_NO) { if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } ++digs; } mp_clear (&t); /* return digs + 1, the 1 is for the NULL byte that would be required. */ *size = digs + 1; return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_radix_smap.c0000644000175000017500000000134312456307241021433 0ustar jnthnjnthn#include #ifdef BN_MP_RADIX_SMAP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* chars used in radix conversions */ const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_rand.c0000644000175000017500000000226112456307241020230 0ustar jnthnjnthn#include #ifdef BN_MP_RAND_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* makes a pseudo-random int of a given size */ int mp_rand (mp_int * a, int digits) { int res; mp_digit d; mp_zero (a); if (digits <= 0) { return MP_OKAY; } /* first place a random non-zero digit */ do { d = ((mp_digit) abs (MP_GEN_RANDOM())) & MP_MASK; } while (d == 0); if ((res = mp_add_d (a, d, a)) != MP_OKAY) { return res; } while (--digits > 0) { if ((res = mp_lshd (a, 1)) != MP_OKAY) { return res; } if ((res = mp_add_d (a, ((mp_digit) abs (MP_GEN_RANDOM())), a)) != MP_OKAY) { return res; } } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_read_radix.c0000644000175000017500000000371612456307241021414 0ustar jnthnjnthn#include #ifdef BN_MP_READ_RADIX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read a string [ASCII] in a given radix */ int mp_read_radix (mp_int * a, const char *str, int radix) { int y, res, neg; char ch; /* zero the digit bignum */ mp_zero(a); /* make sure the radix is ok */ if (radix < 2 || radix > 64) { return MP_VAL; } /* if the leading digit is a * minus set the sign to negative. */ if (*str == '-') { ++str; neg = MP_NEG; } else { neg = MP_ZPOS; } /* set the integer to the default of zero */ mp_zero (a); /* process each digit of the string */ while (*str) { /* if the radix < 36 the conversion is case insensitive * this allows numbers like 1AB and 1ab to represent the same value * [e.g. in hex] */ ch = (char) ((radix < 36) ? toupper ((int)*str) : *str); for (y = 0; y < 64; y++) { if (ch == mp_s_rmap[y]) { break; } } /* if the char was found in the map * and is less than the given radix add it * to the number, otherwise exit the loop. */ if (y < radix) { if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { return res; } if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { return res; } } else { break; } ++str; } /* set the sign only if a != 0 */ if (mp_iszero(a) != 1) { a->sign = neg; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_read_signed_bin.c0000644000175000017500000000203012456307241022372 0ustar jnthnjnthn#include #ifdef BN_MP_READ_SIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* read signed bin, big endian, first byte is 0==positive or 1==negative */ int mp_read_signed_bin (mp_int * a, const unsigned char *b, int c) { int res; /* read magnitude */ if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { return res; } /* first byte is 0 for positive, non-zero for negative */ if (b[0] == 0) { a->sign = MP_ZPOS; } else { a->sign = MP_NEG; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_read_unsigned_bin.c0000644000175000017500000000241412456307241022743 0ustar jnthnjnthn#include #ifdef BN_MP_READ_UNSIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reads a unsigned char array, assumes the msb is stored first [big endian] */ int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c) { int res; /* make sure there are at least two digits */ if (a->alloc < 2) { if ((res = mp_grow(a, 2)) != MP_OKAY) { return res; } } /* zero the int */ mp_zero (a); /* read the bytes in */ while (c-- > 0) { if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { return res; } #ifndef MP_8BIT a->dp[0] |= *b++; a->used += 1; #else a->dp[0] = (*b & MP_MASK); a->dp[1] |= ((*b++ >> 7U) & 1); a->used += 2; #endif } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce.c0000644000175000017500000000446512456307241020563 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces x mod m, assumes 0 < x < m**2, mu is * precomputed via mp_reduce_setup. * From HAC pp.604 Algorithm 14.42 */ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) { mp_int q; int res, um = m->used; /* q = x */ if ((res = mp_init_copy (&q, x)) != MP_OKAY) { return res; } /* q1 = x / b**(k-1) */ mp_rshd (&q, um - 1); /* according to HAC this optimization is ok */ if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { goto CLEANUP; } } else { #ifdef BN_S_MP_MUL_HIGH_DIGS_C if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { goto CLEANUP; } #elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { goto CLEANUP; } #else { res = MP_VAL; goto CLEANUP; } #endif } /* q3 = q2 / b**(k+1) */ mp_rshd (&q, um + 1); /* x = x mod b**(k+1), quick (no division) */ if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { goto CLEANUP; } /* q = q * m mod b**(k+1), quick (no division) */ if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { goto CLEANUP; } /* x = x - q */ if ((res = mp_sub (x, &q, x)) != MP_OKAY) { goto CLEANUP; } /* If x < 0, add b**(k+1) to it */ if (mp_cmp_d (x, 0) == MP_LT) { mp_set (&q, 1); if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) goto CLEANUP; if ((res = mp_add (x, &q, x)) != MP_OKAY) goto CLEANUP; } /* Back off if it's too big */ while (mp_cmp (x, m) != MP_LT) { if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { goto CLEANUP; } } CLEANUP: mp_clear (&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_2k.c0000644000175000017500000000246212456307241021152 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_2K_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces a modulo n where n is of the form 2**p - d */ int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) { mp_int q; int p, res; if ((res = mp_init(&q)) != MP_OKAY) { return res; } p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto LBL_ERR; } if (d != 1) { /* q = q * d */ if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { goto LBL_ERR; } } /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto LBL_ERR; } if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } LBL_ERR: mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_2k_l.c0000644000175000017500000000254112456307241021463 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_2K_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reduces a modulo n where n is of the form 2**p - d This differs from reduce_2k since "d" can be larger than a single digit. */ int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) { mp_int q; int p, res; if ((res = mp_init(&q)) != MP_OKAY) { return res; } p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto LBL_ERR; } /* q = q * d */ if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { goto LBL_ERR; } /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto LBL_ERR; } if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } LBL_ERR: mp_clear(&q); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_2k_setup.c0000644000175000017500000000207212456307241022367 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_2K_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ int mp_reduce_2k_setup(mp_int *a, mp_digit *d) { int res, p; mp_int tmp; if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } p = mp_count_bits(a); if ((res = mp_2expt(&tmp, p)) != MP_OKAY) { mp_clear(&tmp); return res; } if ((res = s_mp_sub(&tmp, a, &tmp)) != MP_OKAY) { mp_clear(&tmp); return res; } *d = tmp.dp[0]; mp_clear(&tmp); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_2k_setup_l.c0000644000175000017500000000177112456307241022707 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_2K_SETUP_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines the setup value */ int mp_reduce_2k_setup_l(mp_int *a, mp_int *d) { int res; mp_int tmp; if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { goto LBL_ERR; } if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { goto LBL_ERR; } LBL_ERR: mp_clear(&tmp); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_is_2k.c0000644000175000017500000000233412456307241021643 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_IS_2K_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if mp_reduce_2k can be used */ int mp_reduce_is_2k(mp_int *a) { int ix, iy, iw; mp_digit iz; if (a->used == 0) { return MP_NO; } else if (a->used == 1) { return MP_YES; } else if (a->used > 1) { iy = mp_count_bits(a); iz = 1; iw = 1; /* Test every bit from the second digit up, must be 1 */ for (ix = DIGIT_BIT; ix < iy; ix++) { if ((a->dp[iw] & iz) == 0) { return MP_NO; } iz <<= 1; if (iz > (mp_digit)MP_MASK) { ++iw; iz = 1; } } } return MP_YES; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_is_2k_l.c0000644000175000017500000000211712456307241022155 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_IS_2K_L_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* determines if reduce_2k_l can be used */ int mp_reduce_is_2k_l(mp_int *a) { int ix, iy; if (a->used == 0) { return MP_NO; } else if (a->used == 1) { return MP_YES; } else if (a->used > 1) { /* if more than half of the digits are -1 we're sold */ for (iy = ix = 0; ix < a->used; ix++) { if (a->dp[ix] == MP_MASK) { ++iy; } } return (iy >= (a->used/2)) ? MP_YES : MP_NO; } return MP_NO; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_reduce_setup.c0000644000175000017500000000163512456307241021777 0ustar jnthnjnthn#include #ifdef BN_MP_REDUCE_SETUP_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* pre-calculate the value required for Barrett reduction * For a given modulus "b" it calulates the value required in "a" */ int mp_reduce_setup (mp_int * a, mp_int * b) { int res; if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { return res; } return mp_div (a, b, a, NULL); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_rshd.c0000644000175000017500000000307612456307241020251 0ustar jnthnjnthn#include #ifdef BN_MP_RSHD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shift right a certain amount of digits */ void mp_rshd (mp_int * a, int b) { int x; /* if b <= 0 then ignore it */ if (b <= 0) { return; } /* if b > used then simply zero it and return */ if (a->used <= b) { mp_zero (a); return; } { register mp_digit *bottom, *top; /* shift the digits down */ /* bottom */ bottom = a->dp; /* top [offset into digits] */ top = a->dp + b; /* this is implemented as a sliding window where * the window is b-digits long and digits from * the top of the window are copied to the bottom * * e.g. b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> /\ | ----> \-------------------/ ----> */ for (x = 0; x < (a->used - b); x++) { *bottom++ = *top++; } /* zero the top digits */ for (; x < a->used; x++) { *bottom++ = 0; } } /* remove excess digits */ a->used -= b; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_set.c0000644000175000017500000000134712456307241020103 0ustar jnthnjnthn#include #ifdef BN_MP_SET_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set to a digit */ void mp_set (mp_int * a, mp_digit b) { mp_zero (a); a->dp[0] = b & MP_MASK; a->used = (a->dp[0] != 0) ? 1 : 0; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_set_int.c0000644000175000017500000000217012456307241020750 0ustar jnthnjnthn#include #ifdef BN_MP_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set a 32-bit const */ int mp_set_int (mp_int * a, unsigned long b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < 8; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> 28) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_set_long.c0000644000175000017500000000231012456307241021111 0ustar jnthnjnthn#include #ifdef BN_MP_SET_INT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set a platform dependent unsigned long int */ int mp_set_long (mp_int * a, unsigned long b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < sizeof(unsigned long) * 2; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> ((sizeof(unsigned long)) * 8 - 4)) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp (a); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_shrink.c0000644000175000017500000000165412456307241020607 0ustar jnthnjnthn#include #ifdef BN_MP_SHRINK_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* shrink a bignum */ int mp_shrink (mp_int * a) { mp_digit *tmp; int used = 1; if(a->used > 0) used = a->used; if (a->alloc != used) { if ((tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * used)) == NULL) { return MP_MEM; } a->dp = tmp; a->alloc = used; } return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_signed_bin_size.c0000644000175000017500000000134112456307241022435 0ustar jnthnjnthn#include #ifdef BN_MP_SIGNED_BIN_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the size for an signed equivalent */ int mp_signed_bin_size (mp_int * a) { return 1 + mp_unsigned_bin_size (a); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_sqr.c0000644000175000017500000000246112456307241020113 0ustar jnthnjnthn#include #ifdef BN_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* computes b = a*a */ int mp_sqr (mp_int * a, mp_int * b) { int res; #ifdef BN_MP_TOOM_SQR_C /* use Toom-Cook? */ if (a->used >= TOOM_SQR_CUTOFF) { res = mp_toom_sqr(a, b); /* Karatsuba? */ } else #endif #ifdef BN_MP_KARATSUBA_SQR_C if (a->used >= KARATSUBA_SQR_CUTOFF) { res = mp_karatsuba_sqr (a, b); } else #endif { #ifdef BN_FAST_S_MP_SQR_C /* can we use the fast comba multiplier? */ if ((a->used * 2 + 1) < MP_WARRAY && a->used < (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { res = fast_s_mp_sqr (a, b); } else #endif #ifdef BN_S_MP_SQR_C res = s_mp_sqr (a, b); #else res = MP_VAL; #endif } b->sign = MP_ZPOS; return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_sqrmod.c0000644000175000017500000000162312456307241020612 0ustar jnthnjnthn#include #ifdef BN_MP_SQRMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* c = a * a (mod b) */ int mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_sqr (a, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, b, c); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_sqrt.c0000644000175000017500000000334012456307241020274 0ustar jnthnjnthn#include #ifdef BN_MP_SQRT_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* this function is less generic than mp_n_root, simpler and faster */ int mp_sqrt(mp_int *arg, mp_int *ret) { int res; mp_int t1,t2; /* must be positive */ if (arg->sign == MP_NEG) { return MP_VAL; } /* easy out */ if (mp_iszero(arg) == MP_YES) { mp_zero(ret); return MP_OKAY; } if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) { return res; } if ((res = mp_init(&t2)) != MP_OKAY) { goto E2; } /* First approx. (not very bad for large arg) */ mp_rshd (&t1,t1.used/2); /* t1 > 0 */ if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { goto E1; } if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { goto E1; } if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { goto E1; } /* And now t1 > sqrt(arg) */ do { if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { goto E1; } if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { goto E1; } if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { goto E1; } /* t1 >= sqrt(arg) >= t2 at this point */ } while (mp_cmp_mag(&t1,&t2) == MP_GT); mp_exch(&t1,ret); E1: mp_clear(&t2); E2: mp_clear(&t1); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_sub.c0000644000175000017500000000314712456307241020101 0ustar jnthnjnthn#include #ifdef BN_MP_SUB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* high level subtraction (handles signs) */ int mp_sub (mp_int * a, mp_int * b, mp_int * c) { int sa, sb, res; sa = a->sign; sb = b->sign; if (sa != sb) { /* subtract a negative from a positive, OR */ /* subtract a positive from a negative. */ /* In either case, ADD their magnitudes, */ /* and use the sign of the first number. */ c->sign = sa; res = s_mp_add (a, b, c); } else { /* subtract a positive from a positive, OR */ /* subtract a negative from a negative. */ /* First, take the difference between their */ /* magnitudes, then... */ if (mp_cmp_mag (a, b) != MP_LT) { /* Copy the sign from the first */ c->sign = sa; /* The first has a larger or equal magnitude */ res = s_mp_sub (a, b, c); } else { /* The result has the *opposite* sign from */ /* the first number. */ c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; /* The second has a larger magnitude */ res = s_mp_sub (b, a, c); } } return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_sub_d.c0000644000175000017500000000403212456307241020376 0ustar jnthnjnthn#include #ifdef BN_MP_SUB_D_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* single digit subtraction */ int mp_sub_d (mp_int * a, mp_digit b, mp_int * c) { mp_digit *tmpa, *tmpc, mu; int res, ix, oldused; /* grow c as required */ if (c->alloc < a->used + 1) { if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { return res; } } /* if a is negative just do an unsigned * addition [with fudged signs] */ if (a->sign == MP_NEG) { a->sign = MP_ZPOS; res = mp_add_d(a, b, c); a->sign = c->sign = MP_NEG; /* clamp */ mp_clamp(c); return res; } /* setup regs */ oldused = c->used; tmpa = a->dp; tmpc = c->dp; /* if a <= b simply fix the single digit */ if ((a->used == 1 && a->dp[0] <= b) || a->used == 0) { if (a->used == 1) { *tmpc++ = b - *tmpa; } else { *tmpc++ = b; } ix = 1; /* negative/1digit */ c->sign = MP_NEG; c->used = 1; } else { /* positive/size */ c->sign = MP_ZPOS; c->used = a->used; /* subtract first digit */ *tmpc = *tmpa++ - b; mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); *tmpc++ &= MP_MASK; /* handle rest of the digits */ for (ix = 1; ix < a->used; ix++) { *tmpc = *tmpa++ - mu; mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); *tmpc++ &= MP_MASK; } } /* zero excess digits */ while (ix++ < oldused) { *tmpc++ = 0; } mp_clamp(c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_submod.c0000644000175000017500000000164312456307241020600 0ustar jnthnjnthn#include #ifdef BN_MP_SUBMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* d = a - b (mod c) */ int mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) { int res; mp_int t; if ((res = mp_init (&t)) != MP_OKAY) { return res; } if ((res = mp_sub (a, b, &t)) != MP_OKAY) { mp_clear (&t); return res; } res = mp_mod (&t, c, d); mp_clear (&t); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_to_signed_bin.c0000644000175000017500000000155712456307241022116 0ustar jnthnjnthn#include #ifdef BN_MP_TO_SIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in signed [big endian] format */ int mp_to_signed_bin (mp_int * a, unsigned char *b) { int res; if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { return res; } b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_to_signed_bin_n.c0000644000175000017500000000157212456307241022430 0ustar jnthnjnthn#include #ifdef BN_MP_TO_SIGNED_BIN_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in signed [big endian] format */ int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) { if (*outlen < (unsigned long)mp_signed_bin_size(a)) { return MP_VAL; } *outlen = mp_signed_bin_size(a); return mp_to_signed_bin(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_to_unsigned_bin.c0000644000175000017500000000221712456307241022453 0ustar jnthnjnthn#include #ifdef BN_MP_TO_UNSIGNED_BIN_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in unsigned [big endian] format */ int mp_to_unsigned_bin (mp_int * a, unsigned char *b) { int x, res; mp_int t; if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } x = 0; while (mp_iszero (&t) == 0) { #ifndef MP_8BIT b[x++] = (unsigned char) (t.dp[0] & 255); #else b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); #endif if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { mp_clear (&t); return res; } } bn_reverse (b, x); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_to_unsigned_bin_n.c0000644000175000017500000000160612456307241022771 0ustar jnthnjnthn#include #ifdef BN_MP_TO_UNSIGNED_BIN_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* store in unsigned [big endian] format */ int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) { if (*outlen < (unsigned long)mp_unsigned_bin_size(a)) { return MP_VAL; } *outlen = mp_unsigned_bin_size(a); return mp_to_unsigned_bin(a, b); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_toom_mul.c0000644000175000017500000001617612456307241021151 0ustar jnthnjnthn#include #ifdef BN_MP_TOOM_MUL_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplication using the Toom-Cook 3-way algorithm * * Much more complicated than Karatsuba but has a lower * asymptotic running time of O(N**1.464). This algorithm is * only particularly useful on VERY large inputs * (we're talking 1000s of digits here...). */ int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) { mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; int res, B; /* init temps */ if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { return res; } /* B */ B = MIN(a->used, b->used) / 3; /* a = a2 * B**2 + a1 * B + a0 */ if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy(a, &a1)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&a1, B); mp_mod_2d(&a1, DIGIT_BIT * B, &a1); if ((res = mp_copy(a, &a2)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&a2, B*2); /* b = b2 * B**2 + b1 * B + b0 */ if ((res = mp_mod_2d(b, DIGIT_BIT * B, &b0)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy(b, &b1)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&b1, B); mp_mod_2d(&b1, DIGIT_BIT * B, &b1); if ((res = mp_copy(b, &b2)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&b2, B*2); /* w0 = a0*b0 */ if ((res = mp_mul(&a0, &b0, &w0)) != MP_OKAY) { goto LBL_ERR; } /* w4 = a2 * b2 */ if ((res = mp_mul(&a2, &b2, &w4)) != MP_OKAY) { goto LBL_ERR; } /* w1 = (a2 + 2(a1 + 2a0))(b2 + 2(b1 + 2b0)) */ if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&b0, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp2, &b2, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w1)) != MP_OKAY) { goto LBL_ERR; } /* w3 = (a0 + 2(a1 + 2a2))(b0 + 2(b1 + 2b2)) */ if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&b2, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w3)) != MP_OKAY) { goto LBL_ERR; } /* w2 = (a2 + a1 + a0)(b2 + b1 + b0) */ if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&b2, &b1, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul(&tmp1, &tmp2, &w2)) != MP_OKAY) { goto LBL_ERR; } /* now solve the matrix 0 0 0 0 1 1 2 4 8 16 1 1 1 1 1 16 8 4 2 1 1 0 0 0 0 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication */ /* r1 - r4 */ if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r0 */ if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1/2 */ if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3/2 */ if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r2 - r0 - r4 */ if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { goto LBL_ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1 - 8r0 */ if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - 8r4 */ if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { goto LBL_ERR; } /* 3r2 - r1 - r3 */ if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { goto LBL_ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1/3 */ if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { goto LBL_ERR; } /* r3/3 */ if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { goto LBL_ERR; } /* at this point shift W[n] by B*n */ if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w0, &w1, c)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, c, c)) != MP_OKAY) { goto LBL_ERR; } LBL_ERR: mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &b0, &b1, &b2, &tmp1, &tmp2, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_toom_sqr.c0000644000175000017500000001257712456307241021162 0ustar jnthnjnthn#include #ifdef BN_MP_TOOM_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* squaring using Toom-Cook 3-way algorithm */ int mp_toom_sqr(mp_int *a, mp_int *b) { mp_int w0, w1, w2, w3, w4, tmp1, a0, a1, a2; int res, B; /* init temps */ if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL)) != MP_OKAY) { return res; } /* B */ B = a->used / 3; /* a = a2 * B**2 + a1 * B + a0 */ if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_copy(a, &a1)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&a1, B); mp_mod_2d(&a1, DIGIT_BIT * B, &a1); if ((res = mp_copy(a, &a2)) != MP_OKAY) { goto LBL_ERR; } mp_rshd(&a2, B*2); /* w0 = a0*a0 */ if ((res = mp_sqr(&a0, &w0)) != MP_OKAY) { goto LBL_ERR; } /* w4 = a2 * a2 */ if ((res = mp_sqr(&a2, &w4)) != MP_OKAY) { goto LBL_ERR; } /* w1 = (a2 + 2(a1 + 2a0))**2 */ if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sqr(&tmp1, &w1)) != MP_OKAY) { goto LBL_ERR; } /* w3 = (a0 + 2(a1 + 2a2))**2 */ if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sqr(&tmp1, &w3)) != MP_OKAY) { goto LBL_ERR; } /* w2 = (a2 + a1 + a0)**2 */ if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sqr(&tmp1, &w2)) != MP_OKAY) { goto LBL_ERR; } /* now solve the matrix 0 0 0 0 1 1 2 4 8 16 1 1 1 1 1 16 8 4 2 1 1 0 0 0 0 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication. */ /* r1 - r4 */ if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r0 */ if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1/2 */ if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3/2 */ if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r2 - r0 - r4 */ if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { goto LBL_ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1 - 8r0 */ if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - 8r4 */ if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { goto LBL_ERR; } /* 3r2 - r1 - r3 */ if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { goto LBL_ERR; } /* r1 - r2 */ if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { goto LBL_ERR; } /* r3 - r2 */ if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { goto LBL_ERR; } /* r1/3 */ if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { goto LBL_ERR; } /* r3/3 */ if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { goto LBL_ERR; } /* at this point shift W[n] by B*n */ if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w0, &w1, b)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { goto LBL_ERR; } if ((res = mp_add(&tmp1, b, b)) != MP_OKAY) { goto LBL_ERR; } LBL_ERR: mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL); return res; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_toradix.c0000644000175000017500000000321512456307241020756 0ustar jnthnjnthn#include #ifdef BN_MP_TORADIX_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* stores a bignum as a ASCII string in a given radix (2..64) */ int mp_toradix (mp_int * a, char *str, int radix) { int res, digs; mp_int t; mp_digit d; char *_s = str; /* check range of the radix */ if (radix < 2 || radix > 64) { return MP_VAL; } /* quick out if its zero */ if (mp_iszero(a) == 1) { *str++ = '0'; *str = '\0'; return MP_OKAY; } if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* if it is negative output a - */ if (t.sign == MP_NEG) { ++_s; *str++ = '-'; t.sign = MP_ZPOS; } digs = 0; while (mp_iszero (&t) == 0) { if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points * to the first digit [exluding the sign] of the number] */ bn_reverse ((unsigned char *)_s, digs); /* append a NULL so the string is properly terminated */ *str = '\0'; mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_toradix_n.c0000644000175000017500000000374112456307241021277 0ustar jnthnjnthn#include #ifdef BN_MP_TORADIX_N_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* stores a bignum as a ASCII string in a given radix (2..64) * * Stores upto maxlen-1 chars and always a NULL byte */ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) { int res, digs; mp_int t; mp_digit d; char *_s = str; /* check range of the maxlen, radix */ if (maxlen < 2 || radix < 2 || radix > 64) { return MP_VAL; } /* quick out if its zero */ if (mp_iszero(a) == MP_YES) { *str++ = '0'; *str = '\0'; return MP_OKAY; } if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } /* if it is negative output a - */ if (t.sign == MP_NEG) { /* we have to reverse our digits later... but not the - sign!! */ ++_s; /* store the flag and mark the number as positive */ *str++ = '-'; t.sign = MP_ZPOS; /* subtract a char */ --maxlen; } digs = 0; while (mp_iszero (&t) == 0) { if (--maxlen < 1) { /* no more room */ break; } if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { mp_clear (&t); return res; } *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points * to the first digit [exluding the sign] of the number */ bn_reverse ((unsigned char *)_s, digs); /* append a NULL so the string is properly terminated */ *str = '\0'; mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_unsigned_bin_size.c0000644000175000017500000000142512456307241023003 0ustar jnthnjnthn#include #ifdef BN_MP_UNSIGNED_BIN_SIZE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* get the size for an unsigned equivalent */ int mp_unsigned_bin_size (mp_int * a) { int size = mp_count_bits (a); return (size / 8 + ((size & 7) != 0 ? 1 : 0)); } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_xor.c0000644000175000017500000000212512456307241020113 0ustar jnthnjnthn#include #ifdef BN_MP_XOR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* XOR two ints together */ int mp_xor (mp_int * a, mp_int * b, mp_int * c) { int res, ix, px; mp_int t, *x; if (a->used > b->used) { if ((res = mp_init_copy (&t, a)) != MP_OKAY) { return res; } px = b->used; x = b; } else { if ((res = mp_init_copy (&t, b)) != MP_OKAY) { return res; } px = a->used; x = a; } for (ix = 0; ix < px; ix++) { t.dp[ix] ^= x->dp[ix]; } mp_clamp (&t); mp_exch (c, &t); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_mp_zero.c0000644000175000017500000000143012456307241020260 0ustar jnthnjnthn#include #ifdef BN_MP_ZERO_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* set to zero */ void mp_zero (mp_int * a) { int n; mp_digit *tmp; a->sign = MP_ZPOS; a->used = 0; tmp = a->dp; for (n = 0; n < a->alloc; n++) { *tmp++ = 0; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_prime_tab.c0000644000175000017500000000533512456307241020557 0ustar jnthnjnthn#include #ifdef BN_PRIME_TAB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ const mp_digit ltm_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, #ifndef MP_8BIT 0x0083, 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 #endif }; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_reverse.c0000644000175000017500000000153012456307241020261 0ustar jnthnjnthn#include #ifdef BN_REVERSE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* reverse an array, used for radix code */ void bn_reverse (unsigned char *s, int len) { int ix, iy; unsigned char t; ix = 0; iy = len - 1; while (ix < iy) { t = s[ix]; s[ix] = s[iy]; s[iy] = t; ++ix; --iy; } } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_add.c0000644000175000017500000000451312456307241020360 0ustar jnthnjnthn#include #ifdef BN_S_MP_ADD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level addition, based on HAC pp.594, Algorithm 14.7 */ int s_mp_add (mp_int * a, mp_int * b, mp_int * c) { mp_int *x; int olduse, res, min, max; /* find sizes, we let |a| <= |b| which means we have to sort * them. "x" will point to the input with the most digits */ if (a->used > b->used) { min = b->used; max = a->used; x = a; } else { min = a->used; max = b->used; x = b; } /* init result */ if (c->alloc < max + 1) { if ((res = mp_grow (c, max + 1)) != MP_OKAY) { return res; } } /* get old used digit count and set new one */ olduse = c->used; c->used = max + 1; { register mp_digit u, *tmpa, *tmpb, *tmpc; register int i; /* alias for digit pointers */ /* first input */ tmpa = a->dp; /* second input */ tmpb = b->dp; /* destination */ tmpc = c->dp; /* zero the carry */ u = 0; for (i = 0; i < min; i++) { /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ *tmpc = *tmpa++ + *tmpb++ + u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)DIGIT_BIT); /* take away carry bit from T[i] */ *tmpc++ &= MP_MASK; } /* now copy higher words if any, that is in A+B * if A or B has more digits add those in */ if (min != max) { for (; i < max; i++) { /* T[i] = X[i] + U */ *tmpc = x->dp[i] + u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)DIGIT_BIT); /* take away carry bit from T[i] */ *tmpc++ &= MP_MASK; } } /* add carry */ *tmpc++ = u; /* clear digits above oldused */ for (i = c->used; i < olduse; i++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_exptmod.c0000644000175000017500000001364512456307241021316 0ustar jnthnjnthn#include #ifdef BN_S_MP_EXPTMOD_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ #ifdef MP_LOW_MEM #define TAB_SIZE 32 #else #define TAB_SIZE 256 #endif int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { mp_int M[TAB_SIZE], res, mu; mp_digit buf; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; int (*redux)(mp_int*,mp_int*,mp_int*); /* find window size */ x = mp_count_bits (X); if (x <= 7) { winsize = 2; } else if (x <= 36) { winsize = 3; } else if (x <= 140) { winsize = 4; } else if (x <= 450) { winsize = 5; } else if (x <= 1303) { winsize = 6; } else if (x <= 3529) { winsize = 7; } else { winsize = 8; } #ifdef MP_LOW_MEM if (winsize > 5) { winsize = 5; } #endif /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { return err; } /* now init the second half of the array */ for (x = 1<<(winsize-1); x < (1 << winsize); x++) { if ((err = mp_init(&M[x])) != MP_OKAY) { for (y = 1<<(winsize-1); y < x; y++) { mp_clear (&M[y]); } mp_clear(&M[1]); return err; } } /* create mu, used for Barrett reduction */ if ((err = mp_init (&mu)) != MP_OKAY) { goto LBL_M; } if (redmode == 0) { if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { goto LBL_MU; } redux = mp_reduce; } else { if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) { goto LBL_MU; } redux = mp_reduce_2k_l; } /* create M table * * The M table contains powers of the base, * e.g. M[x] = G**x mod P * * The first half of the table is not * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { goto LBL_MU; } /* compute the value at M[1<<(winsize-1)] by squaring * M[1] (winsize-1) times */ if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } for (x = 0; x < (winsize - 1); x++) { /* square it */ if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { goto LBL_MU; } /* reduce modulo P */ if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { goto LBL_MU; } } /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) */ for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { goto LBL_MU; } if ((err = redux (&M[x], P, &mu)) != MP_OKAY) { goto LBL_MU; } } /* setup result */ if ((err = mp_init (&res)) != MP_OKAY) { goto LBL_MU; } mp_set (&res, 1); /* set initial mode and bit cnt */ mode = 0; bitcnt = 1; buf = 0; digidx = X->used - 1; bitcpy = 0; bitbuf = 0; for (;;) { /* grab next digit as required */ if (--bitcnt == 0) { /* if digidx == -1 we are out of digits */ if (digidx == -1) { break; } /* read next digit and reset the bitcnt */ buf = X->dp[digidx--]; bitcnt = (int) DIGIT_BIT; } /* grab the next msb from the exponent */ y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; buf <<= (mp_digit)1; /* if the bit is zero and mode == 0 then we ignore it * These represent the leading zero bits before the first 1 bit * in the exponent. Technically this opt is not required but it * does lower the # of trivial squaring/reductions used */ if (mode == 0 && y == 0) { continue; } /* if the bit is zero and mode == 1 then we square */ if (mode == 1 && y == 0) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } continue; } /* else we add it to the window */ bitbuf |= (y << (winsize - ++bitcpy)); mode = 2; if (bitcpy == winsize) { /* ok window is filled so square as required and multiply */ /* square first */ for (x = 0; x < winsize; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } } /* then multiply */ if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } /* empty window and reset */ bitcpy = 0; bitbuf = 0; mode = 1; } } /* if bits remain then square/multiply */ if (mode == 2 && bitcpy > 0) { /* square then multiply if the bit is set */ for (x = 0; x < bitcpy; x++) { if ((err = mp_sqr (&res, &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } bitbuf <<= 1; if ((bitbuf & (1 << winsize)) != 0) { /* then multiply */ if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { goto LBL_RES; } if ((err = redux (&res, P, &mu)) != MP_OKAY) { goto LBL_RES; } } } } mp_exch (&res, Y); err = MP_OKAY; LBL_RES:mp_clear (&res); LBL_MU:mp_clear (&mu); LBL_M: mp_clear(&M[1]); for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } return err; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_mul_digs.c0000644000175000017500000000460312456307241021433 0ustar jnthnjnthn#include #ifdef BN_S_MP_MUL_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplies |a| * |b| and only computes upto digs digits of result * HAC pp. 595, Algorithm 14.12 Modified so you can control how * many digits of output are created. */ int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { mp_int t; int res, pa, pb, ix, iy; mp_digit u; mp_word r; mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ if (((digs) < MP_WARRAY) && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_s_mp_mul_digs (a, b, c, digs); } if ((res = mp_init_size (&t, digs)) != MP_OKAY) { return res; } t.used = digs; /* compute the digits of the product directly */ pa = a->used; for (ix = 0; ix < pa; ix++) { /* set the carry to zero */ u = 0; /* limit ourselves to making digs digits of output */ pb = MIN (b->used, digs - ix); /* setup some aliases */ /* copy of the digit from a used within the nested loop */ tmpx = a->dp[ix]; /* an alias for the destination shifted ix places */ tmpt = t.dp + ix; /* an alias for the digits of b */ tmpy = b->dp; /* compute the columns of the output and propagate the carry */ for (iy = 0; iy < pb; iy++) { /* compute the column as a mp_word */ r = ((mp_word)*tmpt) + ((mp_word)tmpx) * ((mp_word)*tmpy++) + ((mp_word) u); /* the new column is the lower part of the result */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* get the carry word from the result */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } /* set carry if it is placed below digs */ if (ix + iy < digs) { *tmpt = u; } } mp_clamp (&t); mp_exch (&t, c); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_mul_high_digs.c0000644000175000017500000000414212456307241022430 0ustar jnthnjnthn#include #ifdef BN_S_MP_MUL_HIGH_DIGS_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* multiplies |a| * |b| and does not compute the lower digs digits * [meant to get the higher part of the product] */ int s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) { mp_int t; int res, pa, pb, ix, iy; mp_digit u; mp_word r; mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C if (((a->used + b->used + 1) < MP_WARRAY) && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_s_mp_mul_high_digs (a, b, c, digs); } #endif if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { return res; } t.used = a->used + b->used + 1; pa = a->used; pb = b->used; for (ix = 0; ix < pa; ix++) { /* clear the carry */ u = 0; /* left hand side of A[ix] * B[iy] */ tmpx = a->dp[ix]; /* alias to the address of where the digits will be stored */ tmpt = &(t.dp[digs]); /* alias for where to read the right hand side from */ tmpy = b->dp + (digs - ix); for (iy = digs - ix; iy < pb; iy++) { /* calculate the double precision result */ r = ((mp_word)*tmpt) + ((mp_word)tmpx) * ((mp_word)*tmpy++) + ((mp_word) u); /* get the lower part */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* carry the carry */ u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); } *tmpt = u; } mp_clamp (&t); mp_exch (&t, c); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_sqr.c0000644000175000017500000000437712456307241020445 0ustar jnthnjnthn#include #ifdef BN_S_MP_SQR_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ int s_mp_sqr (mp_int * a, mp_int * b) { mp_int t; int res, ix, iy, pa; mp_word r; mp_digit u, tmpx, *tmpt; pa = a->used; if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { return res; } /* default used is maximum possible size */ t.used = 2*pa + 1; for (ix = 0; ix < pa; ix++) { /* first calculate the digit at 2*ix */ /* calculate double precision result */ r = ((mp_word) t.dp[2*ix]) + ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); /* store lower part in result */ t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); /* get the carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); /* left hand side of A[ix] * A[iy] */ tmpx = a->dp[ix]; /* alias for where to store the results */ tmpt = t.dp + (2*ix + 1); for (iy = ix + 1; iy < pa; iy++) { /* first calculate the product */ r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); /* now calculate the double precision result, note we use * addition instead of *2 since it's easier to optimize */ r = ((mp_word) *tmpt) + r + r + ((mp_word) u); /* store lower part */ *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); /* get carry */ u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); } /* propagate upwards */ while (u != ((mp_digit) 0)) { r = ((mp_word) *tmpt) + ((mp_word) u); *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); } } mp_clamp (&t); mp_exch (&t, b); mp_clear (&t); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bn_s_mp_sub.c0000644000175000017500000000416412456307241020423 0ustar jnthnjnthn#include #ifdef BN_S_MP_SUB_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ int s_mp_sub (mp_int * a, mp_int * b, mp_int * c) { int olduse, res, min, max; /* find sizes */ min = b->used; max = a->used; /* init result */ if (c->alloc < max) { if ((res = mp_grow (c, max)) != MP_OKAY) { return res; } } olduse = c->used; c->used = max; { register mp_digit u, *tmpa, *tmpb, *tmpc; register int i; /* alias for digit pointers */ tmpa = a->dp; tmpb = b->dp; tmpc = c->dp; /* set carry to zero */ u = 0; for (i = 0; i < min; i++) { /* T[i] = A[i] - B[i] - U */ *tmpc = *tmpa++ - *tmpb++ - u; /* U = carry bit of T[i] * Note this saves performing an AND operation since * if a carry does occur it will propagate all the way to the * MSB. As a result a single shift is enough to get the carry */ u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); /* Clear carry from T[i] */ *tmpc++ &= MP_MASK; } /* now copy higher words if any, e.g. if A has more digits than B */ for (; i < max; i++) { /* T[i] = A[i] - U */ *tmpc = *tmpa++ - u; /* U = carry bit of T[i] */ u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); /* Clear carry from T[i] */ *tmpc++ &= MP_MASK; } /* clear digits above used (since we may not have grown result above) */ for (i = c->used; i < olduse; i++) { *tmpc++ = 0; } } mp_clamp (c); return MP_OKAY; } #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/bncore.c0000644000175000017500000000236212456307241017403 0ustar jnthnjnthn#include #ifdef BNCORE_C /* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */ /* Known optimal configurations CPU /Compiler /MUL CUTOFF/SQR CUTOFF ------------------------------------------------------------- Intel P4 Northwood /GCC v3.4.1 / 88/ 128/LTM 0.32 ;-) AMD Athlon64 /GCC v3.4.4 / 80/ 120/LTM 0.35 */ int KARATSUBA_MUL_CUTOFF = 80, /* Min. number of digits before Karatsuba multiplication is used. */ KARATSUBA_SQR_CUTOFF = 120, /* Min. number of digits before Karatsuba squaring is used. */ TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ TOOM_SQR_CUTOFF = 400; #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/changes.txt0000644000175000017500000006024312456307241020142 0ustar jnthnjnthnJuly 23rd, 2010 v0.42.0 -- Fix for mp_prime_next_prime() bug when checking generated prime -- allow mp_shrink to shrink initialized, but empty MPI's -- Added project and solution files for Visual Studio 2005 and Visual Studio 2008. March 10th, 2007 v0.41 -- Wolfgang Ehrhardt suggested a quick fix to mp_div_d() which makes the detection of powers of two quicker. -- [CRI] Added libtommath.dsp for Visual C++ users. December 24th, 2006 v0.40 -- Updated makefile to properly support LIBNAME -- Fixed bug in fast_s_mp_mul_high_digs() which overflowed (line 83), thanks Valgrind! April 4th, 2006 v0.39 -- Jim Wigginton pointed out my Montgomery examples in figures 6.4 and 6.6 were off by one, k should be 9 not 8 -- Bruce Guenter suggested I use --tag=CC for libtool builds where the compiler may think it's C++. -- "mm" from sci.crypt pointed out that my mp_gcd was sub-optimal (I also updated and corrected the book) -- updated some of the @@ tags in tommath.src to reflect source changes. -- updated email and url info in all source files Jan 26th, 2006 v0.38 -- broken makefile.shared fixed -- removed some carry stores that were not required [updated text] November 18th, 2005 v0.37 -- [Don Porter] reported on a TCL list [HEY SEND ME BUGREPORTS ALREADY!!!] that mp_add_d() would compute -0 with some inputs. Fixed. -- [rinick@gmail.com] reported the makefile.bcc was messed up. Fixed. -- [Kevin Kenny] reported some issues with mp_toradix_n(). Now it doesn't require a min of 3 chars of output. -- Made the make command renamable. Wee August 1st, 2005 v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed. -- [Peter LaDow] found a typo in the XREALLOC macro -- [Peter LaDow] pointed out that mp_read_(un)signed_bin should have "const" on the input -- Ported LTC patch to fix the prime_random_ex() function to get the bitsize correct [and the maskOR flags] -- Kevin Kenny pointed out a stray // -- David Hulton pointed out a typo in the textbook [mp_montgomery_setup() pseudo-code] -- Neal Hamilton (Elliptic Semiconductor) pointed out that my Karatsuba notation was backwards and that I could use unsigned operations in the routine. -- Paul Schmidt pointed out a linking error in mp_exptmod() when BN_S_MP_EXPTMOD_C is undefined (and another for read_radix) -- Updated makefiles to be way more flexible March 12th, 2005 v0.35 -- Stupid XOR function missing line again... oops. -- Fixed bug in invmod not handling negative inputs correctly [Wolfgang Ehrhardt] -- Made exteuclid always give positive u3 output...[ Wolfgang Ehrhardt ] -- [Wolfgang Ehrhardt] Suggested a fix for mp_reduce() which avoided underruns. ;-) -- mp_rand() would emit one too many digits and it was possible to get a 0 out of it ... oops -- Added montgomery to the testing to make sure it handles 1..10 digit moduli correctly -- Fixed bug in comba that would lead to possible erroneous outputs when "pa < digs" -- Fixed bug in mp_toradix_size for "0" [Kevin Kenny] -- Updated chapters 1-5 of the textbook ;-) It now talks about the new comba code! February 12th, 2005 v0.34 -- Fixed two more small errors in mp_prime_random_ex() -- Fixed overflow in mp_mul_d() [Kevin Kenny] -- Added mp_to_(un)signed_bin_n() functions which do bounds checking for ya [and report the size] -- Added "large" diminished radix support. Speeds up things like DSA where the moduli is of the form 2^k - P for some P < 2^(k/2) or so Actually is faster than Montgomery on my AMD64 (and probably much faster on a P4) -- Updated the manual a bit -- Ok so I haven't done the textbook work yet... My current freelance gig has landed me in France till the end of Feb/05. Once I get back I'll have tons of free time and I plan to go to town on the book. As of this release the API will freeze. At least until the book catches up with all the changes. I welcome bug reports but new algorithms will have to wait. December 23rd, 2004 v0.33 -- Fixed "small" variant for mp_div() which would munge with negative dividends... -- Fixed bug in mp_prime_random_ex() which would set the most significant byte to zero when no special flags were set -- Fixed overflow [minor] bug in fast_s_mp_sqr() -- Made the makefiles easier to configure the group/user that ltm will install as -- Fixed "final carry" bug in comba multipliers. (Volkan Ceylan) -- Matt Johnston pointed out a missing semi-colon in mp_exptmod October 29th, 2004 v0.32 -- Added "makefile.shared" for shared object support -- Added more to the build options/configs in the manual -- Started the Depends framework, wrote dep.pl to scan deps and produce "callgraph.txt" ;-) -- Wrote SC_RSA_1 which will enable close to the minimum required to perform RSA on 32-bit [or 64-bit] platforms with LibTomCrypt -- Merged in the small/slower mp_div replacement. You can now toggle which you want to use as your mp_div() at build time. Saves roughly 8KB or so. -- Renamed a few files and changed some comments to make depends system work better. (No changes to function names) -- Merged in new Combas that perform 2 reads per inner loop instead of the older 3reads/2writes per inner loop of the old code. Really though if you want speed learn to use TomsFastMath ;-) August 9th, 2004 v0.31 -- "profiled" builds now :-) new timings for Intel Northwoods -- Added "pretty" build target -- Update mp_init() to actually assign 0's instead of relying on calloc() -- "Wolfgang Ehrhardt" found a bug in mp_mul() where if you multiply a negative by zero you get negative zero as the result. Oops. -- J Harper from PeerSec let me toy with his AMD64 and I got 60-bit digits working properly [this also means that I fixed a bug where if sizeof(int) < sizeof(mp_digit) it would bug] April 11th, 2004 v0.30 -- Added "mp_toradix_n" which stores upto "n-1" least significant digits of an mp_int -- Johan Lindh sent a patch so MSVC wouldn't whine about redefining malloc [in weird dll modes] -- Henrik Goldman spotted a missing OPT_CAST in mp_fwrite() -- Tuned tommath.h so that when MP_LOW_MEM is defined MP_PREC shall be reduced. [I also allow MP_PREC to be externally defined now] -- Sped up mp_cnt_lsb() by using a 4x4 table [e.g. 4x speedup] -- Added mp_prime_random_ex() which is a more versatile prime generator accurate to exact bit lengths (unlike the deprecated but still available mp_prime_random() which is only accurate to byte lengths). See the new LTM_PRIME_* flags ;-) -- Alex Polushin contributed an optimized mp_sqrt() as well as mp_get_int() and mp_is_square(). I've cleaned them all up to be a little more consistent [along with one bug fix] for this release. -- Added mp_init_set and mp_init_set_int to initialize and set small constants with one function call. -- Removed /etclib directory [um LibTomPoly deprecates this]. -- Fixed mp_mod() so the sign of the result agrees with the sign of the modulus. ++ N.B. My semester is almost up so expect updates to the textbook to be posted to the libtomcrypt.org website. Jan 25th, 2004 v0.29 ++ Note: "Henrik" from the v0.28 changelog refers to Henrik Goldman ;-) -- Added fix to mp_shrink to prevent a realloc when used == 0 [e.g. realloc zero bytes???] -- Made the mp_prime_rabin_miller_trials() function internal table smaller and also set the minimum number of tests to two (sounds a bit safer). -- Added a mp_exteuclid() which computes the extended euclidean algorithm. -- Fixed a memory leak in s_mp_exptmod() [called when Barrett reduction is to be used] which would arise if a multiplication or subsequent reduction failed [would not free the temp result]. -- Made an API change to mp_radix_size(). It now returns an error code and stores the required size through an "int star" passed to it. Dec 24th, 2003 v0.28 -- Henrik Goldman suggested I add casts to the montomgery code [stores into mu...] so compilers wouldn't spew [erroneous] diagnostics... fixed. -- Henrik Goldman also spotted two typos. One in mp_radix_size() and another in mp_toradix(). -- Added fix to mp_shrink() to avoid a memory leak. -- Added mp_prime_random() which requires a callback to make truly random primes of a given nature (idea from chat with Niels Ferguson at Crypto'03) -- Picked up a second wind. I'm filled with Gooo. Mission Gooo! -- Removed divisions from mp_reduce_is_2k() -- Sped up mp_div_d() [general case] to use only one division per digit instead of two. -- Added the heap macros from LTC to LTM. Now you can easily [by editing four lines of tommath.h] change the name of the heap functions used in LTM [also compatible with LTC via MPI mode] -- Added bn_prime_rabin_miller_trials() which gives the number of Rabin-Miller trials to achieve a failure rate of less than 2^-96 -- fixed bug in fast_mp_invmod(). The initial testing logic was wrong. An invalid input is not when "a" and "b" are even it's when "b" is even [the algo is for odd moduli only]. -- Started a new manual [finally]. It is incomplete and will be finished as time goes on. I had to stop adding full demos around half way in chapter three so I could at least get a good portion of the manual done. If you really need help using the library you can always email me! -- My Textbook is now included as part of the package [all Public Domain] Sept 19th, 2003 v0.27 -- Removed changes.txt~ which was made by accident since "kate" decided it was a good time to re-enable backups... [kde is fun!] -- In mp_grow() "a->dp" is not overwritten by realloc call [re: memory leak] Now if mp_grow() fails the mp_int is still valid and can be cleared via mp_clear() to reclaim the memory. -- Henrik Goldman found a buffer overflow bug in mp_add_d(). Fixed. -- Cleaned up mp_mul_d() to be much easier to read and follow. Aug 29th, 2003 v0.26 -- Fixed typo that caused warning with GCC 3.2 -- Martin Marcel noticed a bug in mp_neg() that allowed negative zeroes. Also, Martin is the fellow who noted the bugs in mp_gcd() of 0.24/0.25. -- Martin Marcel noticed an optimization [and slight bug] in mp_lcm(). -- Added fix to mp_read_unsigned_bin to prevent a buffer overflow. -- Beefed up the comments in the baseline multipliers [and montgomery] -- Added "mont" demo to the makefile.msvc in etc/ -- Optimized sign compares in mp_cmp from 4 to 2 cases. Aug 4th, 2003 v0.25 -- Fix to mp_gcd again... oops (0,-a) == (-a, 0) == a -- Fix to mp_clear which didn't reset the sign [Greg Rose] -- Added mp_error_to_string() to convert return codes to strings. [Greg Rose] -- Optimized fast_mp_invmod() to do the test for invalid inputs [both even] first so temps don't have to be initialized if it's going to fail. -- Optimized mp_gcd() by removing mp_div_2d calls for when one of the inputs is odd. -- Tons of new comments, some indentation fixups, etc. -- mp_jacobi() returns MP_VAL if the modulus is less than or equal to zero. -- fixed two typos in the header of each file :-) -- LibTomMath is officially Public Domain [see LICENSE] July 15th, 2003 v0.24 -- Optimized mp_add_d and mp_sub_d to not allocate temporary variables -- Fixed mp_gcd() so the gcd of 0,0 is 0. Allows the gcd operation to be chained e.g. (0,0,a) == a [instead of 1] -- Should be one of the last release for a while. Working on LibTomMath book now. -- optimized the pprime demo [/etc/pprime.c] to first make a huge table of single digit primes then it reads them randomly instead of randomly choosing/testing single digit primes. July 12th, 2003 v0.23 -- Optimized mp_prime_next_prime() to not use mp_mod [via is_divisible()] in each iteration. Instead now a smaller table is kept of the residues which can be updated without division. -- Fixed a bug in next_prime() where an input of zero would be treated as odd and have two added to it [to move to the next odd]. -- fixed a bug in prime_fermat() and prime_miller_rabin() which allowed the base to be negative, zero or one. Normally the test is only valid if the base is greater than one. -- changed the next_prime() prototype to accept a new parameter "bbs_style" which will find the next prime congruent to 3 mod 4. The default [bbs_style==0] will make primes which are either congruent to 1 or 3 mod 4. -- fixed mp_read_unsigned_bin() so that it doesn't include both code for the case DIGIT_BIT < 8 and >= 8 -- optimized div_d() to easy out on division by 1 [or if a == 0] and use logical shifts if the divisor is a power of two. -- the default DIGIT_BIT type was not int for non-default builds. Fixed. July 2nd, 2003 v0.22 -- Fixed up mp_invmod so the result is properly in range now [was always congruent to the inverse...] -- Fixed up s_mp_exptmod and mp_exptmod_fast so the lower half of the pre-computed table isn't allocated which makes the algorithm use half as much ram. -- Fixed the install script not to make the book :-) [which isn't included anyways] -- added mp_cnt_lsb() which counts how many of the lsbs are zero -- optimized mp_gcd() to use the new mp_cnt_lsb() to replace multiple divisions by two by a single division. -- applied similar optimization to mp_prime_miller_rabin(). -- Fixed a bug in both mp_invmod() and fast_mp_invmod() which tested for odd via "mp_iseven() == 0" which is not valid [since zero is not even either]. June 19th, 2003 v0.21 -- Fixed bug in mp_mul_d which would not handle sign correctly [would not always forward it] -- Removed the #line lines from gen.pl [was in violation of ISO C] June 8th, 2003 v0.20 -- Removed the book from the package. Added the TDCAL license document. -- This release is officially pure-bred TDCAL again [last officially TDCAL based release was v0.16] June 6th, 2003 v0.19 -- Fixed a bug in mp_montgomery_reduce() which was introduced when I tweaked mp_rshd() in the previous release. Essentially the digits were not trimmed before the compare which cause a subtraction to occur all the time. -- Fixed up etc/tune.c a bit to stop testing new cutoffs after 16 failures [to find more optimal points]. Brute force ho! May 29th, 2003 v0.18 -- Fixed a bug in s_mp_sqr which would handle carries properly just not very elegantly. (e.g. correct result, just bad looking code) -- Fixed bug in mp_sqr which still had a 512 constant instead of MP_WARRAY -- Added Toom-Cook multipliers [needs tuning!] -- Added efficient divide by 3 algorithm mp_div_3 -- Re-wrote mp_div_d to be faster than calling mp_div -- Added in a donated BCC makefile and a single page LTM poster (ahalhabsi@sbcglobal.net) -- Added mp_reduce_2k which reduces an input modulo n = 2**p - k for any single digit k -- Made the exptmod system be aware of the 2k reduction algorithms. -- Rewrote mp_dr_reduce to be smaller, simpler and easier to understand. May 17th, 2003 v0.17 -- Benjamin Goldberg submitted optimized mp_add and mp_sub routines. A new gen.pl as well as several smaller suggestions. Thanks! -- removed call to mp_cmp in inner loop of mp_div and put mp_cmp_mag in its place :-) -- Fixed bug in mp_exptmod that would cause it to fail for odd moduli when DIGIT_BIT != 28 -- mp_exptmod now also returns errors if the modulus is negative and will handle negative exponents -- mp_prime_is_prime will now return true if the input is one of the primes in the prime table -- Damian M Gryski (dgryski@uwaterloo.ca) found a index out of bounds error in the mp_fast_s_mp_mul_high_digs function which didn't come up before. (fixed) -- Refactored the DR reduction code so there is only one function per file. -- Fixed bug in the mp_mul() which would erroneously avoid the faster multiplier [comba] when it was allowed. The bug would not cause the incorrect value to be produced just less efficient (fixed) -- Fixed similar bug in the Montgomery reduction code. -- Added tons of (mp_digit) casts so the 7/15/28/31 bit digit code will work flawlessly out of the box. Also added limited support for 64-bit machines with a 60-bit digit. Both thanks to Tom Wu (tom@arcot.com) -- Added new comments here and there, cleaned up some code [style stuff] -- Fixed a lingering typo in mp_exptmod* that would set bitcnt to zero then one. Very silly stuff :-) -- Fixed up mp_exptmod_fast so it would set "redux" to the comba Montgomery reduction if allowed. This saves quite a few calls and if statements. -- Added etc/mont.c a test of the Montgomery reduction [assuming all else works :-| ] -- Fixed up etc/tune.c to use a wider test range [more appropriate] also added a x86 based addition which uses RDTSC for high precision timing. -- Updated demo/demo.c to remove MPI stuff [won't work anyways], made the tests run for 2 seconds each so its not so insanely slow. Also made the output space delimited [and fixed up various errors] -- Added logs directory, logs/graph.dem which will use gnuplot to make a series of PNG files that go with the pre-made index.html. You have to build [via make timing] and run ltmtest first in the root of the package. -- Fixed a bug in mp_sub and mp_add where "-a - -a" or "-a + a" would produce -0 as the result [obviously invalid]. -- Fixed a bug in mp_rshd. If the count == a.used it should zero/return [instead of shifting] -- Fixed a "off-by-one" bug in mp_mul2d. The initial size check on alloc would be off by one if the residue shifting caused a carry. -- Fixed a bug where s_mp_mul_digs() would not call the Comba based routine if allowed. This made Barrett reduction slower than it had to be. Mar 29th, 2003 v0.16 -- Sped up mp_div by making normalization one shift call -- Sped up mp_mul_2d/mp_div_2d by aliasing pointers :-) -- Cleaned up mp_gcd to use the macros for odd/even detection -- Added comments here and there, mostly there but occasionally here too. Mar 22nd, 2003 v0.15 -- Added series of prime testing routines to lib -- Fixed up etc/tune.c -- Added DR reduction algorithm -- Beefed up the manual more. -- Fixed up demo/demo.c so it doesn't have so many warnings and it does the full series of tests -- Added "pre-gen" directory which will hold a "gen.pl"'ed copy of the entire lib [done at zipup time so its always the latest] -- Added conditional casts for C++ users [boo!] Mar 15th, 2003 v0.14 -- Tons of manual updates -- cleaned up the directory -- added MSVC makefiles -- source changes [that I don't recall] -- Fixed up the lshd/rshd code to use pointer aliasing -- Fixed up the mul_2d and div_2d to not call rshd/lshd unless needed -- Fixed up etc/tune.c a tad -- fixed up demo/demo.c to output comma-delimited results of timing also fixed up timing demo to use a finer granularity for various functions -- fixed up demo/demo.c testing to pause during testing so my Duron won't catch on fire [stays around 31-35C during testing :-)] Feb 13th, 2003 v0.13 -- tons of minor speed-ups in low level add, sub, mul_2 and div_2 which propagate to other functions like mp_invmod, mp_div, etc... -- Sped up mp_exptmod_fast by using new code to find R mod m [e.g. B^n mod m] -- minor fixes Jan 17th, 2003 v0.12 -- re-wrote the majority of the makefile so its more portable and will install via "make install" on most *nix platforms -- Re-packaged all the source as seperate files. Means the library a single file packagage any more. Instead of just adding "bn.c" you have to add libtommath.a -- Renamed "bn.h" to "tommath.h" -- Changes to the manual to reflect all of this -- Used GNU Indent to clean up the source Jan 15th, 2003 v0.11 -- More subtle fixes -- Moved to gentoo linux [hurrah!] so made *nix specific fixes to the make process -- Sped up the montgomery reduction code quite a bit -- fixed up demo so when building timing for the x86 it assumes ELF format now Jan 9th, 2003 v0.10 -- Pekka Riikonen suggested fixes to the radix conversion code. -- Added baseline montgomery and comba montgomery reductions, sped up exptmods [to a point, see bn.h for MONTGOMERY_EXPT_CUTOFF] Jan 6th, 2003 v0.09 -- Updated the manual to reflect recent changes. :-) -- Added Jacobi function (mp_jacobi) to supplement the number theory side of the lib -- Added a Mersenne prime finder demo in ./etc/mersenne.c Jan 2nd, 2003 v0.08 -- Sped up the multipliers by moving the inner loop variables into a smaller scope -- Corrected a bunch of small "warnings" -- Added more comments -- Made "mtest" be able to use /dev/random, /dev/urandom or stdin for RNG data -- Corrected some bugs where error messages were potentially ignored -- add etc/pprime.c program which makes numbers which are provably prime. Jan 1st, 2003 v0.07 -- Removed alot of heap operations from core functions to speed them up -- Added a root finding function [and mp_sqrt macro like from MPI] -- Added more to manual Dec 31st, 2002 v0.06 -- Sped up the s_mp_add, s_mp_sub which inturn sped up mp_invmod, mp_exptmod, etc... -- Cleaned up the header a bit more Dec 30th, 2002 v0.05 -- Builds with MSVC out of the box -- Fixed a bug in mp_invmod w.r.t. even moduli -- Made mp_toradix and mp_read_radix use char instead of unsigned char arrays -- Fixed up exptmod to use fewer multiplications -- Fixed up mp_init_size to use only one heap operation -- Note there is a slight "off-by-one" bug in the library somewhere without the padding (see the source for comment) the library crashes in libtomcrypt. Anyways a reasonable workaround is to pad the numbers which will always correct it since as the numbers grow the padding will still be beyond the end of the number -- Added more to the manual Dec 29th, 2002 v0.04 -- Fixed a memory leak in mp_to_unsigned_bin -- optimized invmod code -- Fixed bug in mp_div -- use exchange instead of copy for results -- added a bit more to the manual Dec 27th, 2002 v0.03 -- Sped up s_mp_mul_high_digs by not computing the carries of the lower digits -- Fixed a bug where mp_set_int wouldn't zero the value first and set the used member. -- fixed a bug in s_mp_mul_high_digs where the limit placed on the result digits was not calculated properly -- fixed bugs in add/sub/mul/sqr_mod functions where if the modulus and dest were the same it wouldn't work -- fixed a bug in mp_mod and mp_mod_d concerning negative inputs -- mp_mul_d didn't preserve sign -- Many many many many fixes -- Works in LibTomCrypt now :-) -- Added iterations to the timing demos... more accurate. -- Tom needs a job. Dec 26th, 2002 v0.02 -- Fixed a few "slips" in the manual. This is "LibTomMath" afterall :-) -- Added mp_cmp_mag, mp_neg, mp_abs and mp_radix_size that were missing. -- Sped up the fast [comba] multipliers more [yahoo!] Dec 25th,2002 v0.01 -- Initial release. Gimme a break. -- Todo list, add details to manual [e.g. algorithms] more comments in code example programs MoarVM-2015.11/3rdparty/libtommath/tommath.h0000644000175000017500000004246712456307241017623 0ustar jnthnjnthn/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com */ #ifndef BN_H_ #define BN_H_ #include #include #include #include #include #include #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif #ifdef __cplusplus extern "C" { /* C++ compilers don't like assigning void * to mp_digit * */ #define OPT_CAST(x) (x *) #else /* C on the other hand doesn't care */ #define OPT_CAST(x) #endif /* detect 64-bit mode if possible */ #if defined(__x86_64__) && !defined(_WIN32) #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) #define MP_64BIT #endif #endif /* some default configurations. * * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits * * At the very least a mp_digit must be able to hold 7 bits * [any size beyond that is ok provided it doesn't overflow the data type] */ #ifdef MP_8BIT typedef unsigned char mp_digit; typedef unsigned short mp_word; #elif defined(MP_16BIT) typedef unsigned short mp_digit; typedef unsigned long mp_word; #elif defined(MP_64BIT) /* for GCC only on supported platforms */ #ifndef CRYPT typedef unsigned long long ulong64; typedef signed long long long64; #endif typedef unsigned long mp_digit __attribute__ ((mode(DI))); typedef unsigned long mp_word __attribute__ ((mode(TI))); #define DIGIT_BIT 60 #else /* this is the default case, 28-bit digits */ /* this is to make porting into LibTomCrypt easier :-) */ #ifndef CRYPT #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 ulong64; typedef signed __int64 long64; #else typedef unsigned long long ulong64; typedef signed long long long64; #endif #endif typedef unsigned long mp_digit; typedef ulong64 mp_word; #ifdef MP_31BIT /* this is an extension that uses 31-bit digits */ #define DIGIT_BIT 31 #else /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ #define DIGIT_BIT 28 #define MP_28BIT #endif #endif /* define heap macros */ #ifndef CRYPT /* default to libc stuff */ #ifndef XMALLOC #define XMALLOC malloc #define XFREE free #define XREALLOC realloc #define XCALLOC calloc #else /* prototypes for our heap functions */ extern void *XMALLOC(size_t n); extern void *XREALLOC(void *p, size_t n); extern void *XCALLOC(size_t n, size_t s); extern void XFREE(void *p); #endif #endif /* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ #ifndef DIGIT_BIT #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */ #endif /* platforms that can use a better rand function */ #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) #define MP_USE_ALT_RAND 1 #endif /* use arc4random on platforms that support it */ #ifdef MP_USE_ALT_RAND #define MP_GEN_RANDOM() arc4random() #else #define MP_GEN_RANDOM() rand() #endif #define MP_DIGIT_BIT DIGIT_BIT #define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) #define MP_DIGIT_MAX MP_MASK /* equalities */ #define MP_LT -1 /* less than */ #define MP_EQ 0 /* equal to */ #define MP_GT 1 /* greater than */ #define MP_ZPOS 0 /* positive integer */ #define MP_NEG 1 /* negative */ #define MP_OKAY 0 /* ok result */ #define MP_MEM -2 /* out of mem */ #define MP_VAL -3 /* invalid input */ #define MP_RANGE MP_VAL #define MP_YES 1 /* yes response */ #define MP_NO 0 /* no response */ /* Primality generation flags */ #define LTM_PRIME_BBS 0x0001 /* BBS style prime */ #define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ #define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ typedef int mp_err; /* you'll have to tune these... */ extern int KARATSUBA_MUL_CUTOFF, KARATSUBA_SQR_CUTOFF, TOOM_MUL_CUTOFF, TOOM_SQR_CUTOFF; /* define this to use lower memory usage routines (exptmods mostly) */ /* #define MP_LOW_MEM */ /* default precision */ #ifndef MP_PREC #ifndef MP_LOW_MEM #define MP_PREC 32 /* default digits of precision */ #else #define MP_PREC 8 /* default digits of precision */ #endif #endif /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ #define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) /* the infamous mp_int structure */ typedef struct { int used, alloc, sign; mp_digit *dp; } mp_int; /* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); #define USED(m) ((m)->used) #define DIGIT(m,k) ((m)->dp[(k)]) #define SIGN(m) ((m)->sign) /* error code to char* string */ const char *mp_error_to_string(int code); /* ---> init and deinit bignum functions <--- */ /* init a bignum */ int mp_init(mp_int *a); /* free a bignum */ void mp_clear(mp_int *a); /* init a null terminated series of arguments */ int mp_init_multi(mp_int *mp, ...); /* clear a null terminated series of arguments */ void mp_clear_multi(mp_int *mp, ...); /* exchange two ints */ void mp_exch(mp_int *a, mp_int *b); /* shrink ram required for a bignum */ int mp_shrink(mp_int *a); /* grow an int to a given size */ int mp_grow(mp_int *a, int size); /* init to a given number of digits */ int mp_init_size(mp_int *a, int size); /* ---> Basic Manipulations <--- */ #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) #define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) #define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) /* set to zero */ void mp_zero(mp_int *a); /* set to a digit */ void mp_set(mp_int *a, mp_digit b); /* set a 32-bit const */ int mp_set_int(mp_int *a, unsigned long b); /* set a platform dependent unsigned long value */ int mp_set_long(mp_int *a, unsigned long b); /* get a 32-bit value */ unsigned long mp_get_int(mp_int * a); /* get a platform dependent unsigned long value */ unsigned long mp_get_long(mp_int * a); /* initialize and set a digit */ int mp_init_set (mp_int * a, mp_digit b); /* initialize and set 32-bit value */ int mp_init_set_int (mp_int * a, unsigned long b); /* copy, b = a */ int mp_copy(mp_int *a, mp_int *b); /* inits and copies, a = b */ int mp_init_copy(mp_int *a, mp_int *b); /* trim unused digits */ void mp_clamp(mp_int *a); /* ---> digit manipulation <--- */ /* right shift by "b" digits */ void mp_rshd(mp_int *a, int b); /* left shift by "b" digits */ int mp_lshd(mp_int *a, int b); /* c = a / 2**b */ int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d); /* b = a/2 */ int mp_div_2(mp_int *a, mp_int *b); /* c = a * 2**b */ int mp_mul_2d(mp_int *a, int b, mp_int *c); /* b = a*2 */ int mp_mul_2(mp_int *a, mp_int *b); /* c = a mod 2**d */ int mp_mod_2d(mp_int *a, int b, mp_int *c); /* computes a = 2**b */ int mp_2expt(mp_int *a, int b); /* Counts the number of lsbs which are zero before the first zero bit */ int mp_cnt_lsb(mp_int *a); /* I Love Earth! */ /* makes a pseudo-random int of a given size */ int mp_rand(mp_int *a, int digits); /* ---> binary operations <--- */ /* c = a XOR b */ int mp_xor(mp_int *a, mp_int *b, mp_int *c); /* c = a OR b */ int mp_or(mp_int *a, mp_int *b, mp_int *c); /* c = a AND b */ int mp_and(mp_int *a, mp_int *b, mp_int *c); /* ---> Basic arithmetic <--- */ /* b = -a */ int mp_neg(mp_int *a, mp_int *b); /* b = |a| */ int mp_abs(mp_int *a, mp_int *b); /* compare a to b */ int mp_cmp(mp_int *a, mp_int *b); /* compare |a| to |b| */ int mp_cmp_mag(mp_int *a, mp_int *b); /* c = a + b */ int mp_add(mp_int *a, mp_int *b, mp_int *c); /* c = a - b */ int mp_sub(mp_int *a, mp_int *b, mp_int *c); /* c = a * b */ int mp_mul(mp_int *a, mp_int *b, mp_int *c); /* b = a*a */ int mp_sqr(mp_int *a, mp_int *b); /* a/b => cb + d == a */ int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* c = a mod b, 0 <= c < b */ int mp_mod(mp_int *a, mp_int *b, mp_int *c); /* ---> single digit functions <--- */ /* compare against a single digit */ int mp_cmp_d(mp_int *a, mp_digit b); /* c = a + b */ int mp_add_d(mp_int *a, mp_digit b, mp_int *c); /* c = a - b */ int mp_sub_d(mp_int *a, mp_digit b, mp_int *c); /* c = a * b */ int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); /* a/b => cb + d == a */ int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); /* a/3 => 3c + d == a */ int mp_div_3(mp_int *a, mp_int *c, mp_digit *d); /* c = a**b */ int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); /* c = a mod b, 0 <= c < b */ int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); /* ---> number theory <--- */ /* d = a + b (mod c) */ int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* d = a - b (mod c) */ int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* d = a * b (mod c) */ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* c = a * a (mod b) */ int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c); /* c = 1/a (mod b) */ int mp_invmod(mp_int *a, mp_int *b, mp_int *c); /* c = (a, b) */ int mp_gcd(mp_int *a, mp_int *b, mp_int *c); /* produces value such that U1*a + U2*b = U3 */ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3); /* c = [a, b] or (a*b)/(a, b) */ int mp_lcm(mp_int *a, mp_int *b, mp_int *c); /* finds one of the b'th root of a, such that |c|**b <= |a| * * returns error if a < 0 and b is even */ int mp_n_root(mp_int *a, mp_digit b, mp_int *c); /* special sqrt algo */ int mp_sqrt(mp_int *arg, mp_int *ret); /* is number a square? */ int mp_is_square(mp_int *arg, int *ret); /* computes the jacobi c = (a | n) (or Legendre if b is prime) */ int mp_jacobi(mp_int *a, mp_int *n, int *c); /* used to setup the Barrett reduction for a given modulus b */ int mp_reduce_setup(mp_int *a, mp_int *b); /* Barrett Reduction, computes a (mod b) with a precomputed value c * * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code]. */ int mp_reduce(mp_int *a, mp_int *b, mp_int *c); /* setups the montgomery reduction */ int mp_montgomery_setup(mp_int *a, mp_digit *mp); /* computes a = B**n mod b without division or multiplication useful for * normalizing numbers in a Montgomery system. */ int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); /* computes x/R == x (mod N) via Montgomery Reduction */ int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); /* returns 1 if a is a valid DR modulus */ int mp_dr_is_modulus(mp_int *a); /* sets the value of "d" required for mp_dr_reduce */ void mp_dr_setup(mp_int *a, mp_digit *d); /* reduces a modulo b using the Diminished Radix method */ int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); /* returns true if a can be reduced with mp_reduce_2k */ int mp_reduce_is_2k(mp_int *a); /* determines k value for 2k reduction */ int mp_reduce_2k_setup(mp_int *a, mp_digit *d); /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); /* returns true if a can be reduced with mp_reduce_2k_l */ int mp_reduce_is_2k_l(mp_int *a); /* determines k value for 2k reduction */ int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); /* d = a**b (mod c) */ int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); /* ---> Primes <--- */ /* number of primes */ #ifdef MP_8BIT #define PRIME_SIZE 31 #else #define PRIME_SIZE 256 #endif /* table of first PRIME_SIZE primes */ extern const mp_digit ltm_prime_tab[]; /* result=1 if a is divisible by one of the first PRIME_SIZE primes */ int mp_prime_is_divisible(mp_int *a, int *result); /* performs one Fermat test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ int mp_prime_fermat(mp_int *a, mp_int *b, int *result); /* performs one Miller-Rabin test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); /* This gives [for a given bit size] the number of trials required * such that Miller-Rabin gives a prob of failure lower than 2^-96 */ int mp_prime_rabin_miller_trials(int size); /* performs t rounds of Miller-Rabin on "a" using the first * t prime bases. Also performs an initial sieve of trial * division. Determines if "a" is prime with probability * of error no more than (1/4)**t. * * Sets result to 1 if probably prime, 0 otherwise */ int mp_prime_is_prime(mp_int *a, int t, int *result); /* finds the next prime after the number "a" using "t" trials * of Miller-Rabin. * * bbs_style = 1 means the prime must be congruent to 3 mod 4 */ int mp_prime_next_prime(mp_int *a, int t, int bbs_style); /* makes a truly random prime of a given size (bytes), * call with bbs = 1 if you want it to be congruent to 3 mod 4 * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * * The prime generated will be larger than 2^(8*size). */ #define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) /* makes a truly random prime of a given size (bits), * * Flags are as follows: * * LTM_PRIME_BBS - make prime congruent to 3 mod 4 * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) * LTM_PRIME_2MSB_ON - make the 2nd highest bit one * * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself * so it can be NULL * */ int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat); /* ---> radix conversion <--- */ int mp_count_bits(mp_int *a); int mp_unsigned_bin_size(mp_int *a); int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c); int mp_to_unsigned_bin(mp_int *a, unsigned char *b); int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); int mp_signed_bin_size(mp_int *a); int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c); int mp_to_signed_bin(mp_int *a, unsigned char *b); int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); int mp_read_radix(mp_int *a, const char *str, int radix); int mp_toradix(mp_int *a, char *str, int radix); int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen); int mp_radix_size(mp_int *a, int radix, int *size); int mp_fread(mp_int *a, int radix, FILE *stream); int mp_fwrite(mp_int *a, int radix, FILE *stream); #define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) #define mp_raw_size(mp) mp_signed_bin_size(mp) #define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) #define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) #define mp_mag_size(mp) mp_unsigned_bin_size(mp) #define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) #define mp_tobinary(M, S) mp_toradix((M), (S), 2) #define mp_tooctal(M, S) mp_toradix((M), (S), 8) #define mp_todecimal(M, S) mp_toradix((M), (S), 10) #define mp_tohex(M, S) mp_toradix((M), (S), 16) /* lowlevel functions, do not call! */ int s_mp_add(mp_int *a, mp_int *b, mp_int *c); int s_mp_sub(mp_int *a, mp_int *b, mp_int *c); #define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); int fast_s_mp_sqr(mp_int *a, mp_int *b); int s_mp_sqr(mp_int *a, mp_int *b); int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c); int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c); int mp_karatsuba_sqr(mp_int *a, mp_int *b); int mp_toom_sqr(mp_int *a, mp_int *b); int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c); int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode); void bn_reverse(unsigned char *s, int len); extern const char *mp_s_rmap; #ifdef __cplusplus } #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/tommath_class.h0000644000175000017500000005073412456307241021004 0ustar jnthnjnthn#if !(defined(LTM1) && defined(LTM2) && defined(LTM3)) #if defined(LTM2) #define LTM3 #endif #if defined(LTM1) #define LTM2 #endif #define LTM1 #if defined(LTM_ALL) #define BN_ERROR_C #define BN_FAST_MP_INVMOD_C #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_FAST_S_MP_MUL_DIGS_C #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_FAST_S_MP_SQR_C #define BN_MP_2EXPT_C #define BN_MP_ABS_C #define BN_MP_ADD_C #define BN_MP_ADD_D_C #define BN_MP_ADDMOD_C #define BN_MP_AND_C #define BN_MP_CLAMP_C #define BN_MP_CLEAR_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_CMP_C #define BN_MP_CMP_D_C #define BN_MP_CMP_MAG_C #define BN_MP_CNT_LSB_C #define BN_MP_COPY_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_C #define BN_MP_DIV_2_C #define BN_MP_DIV_2D_C #define BN_MP_DIV_3_C #define BN_MP_DIV_D_C #define BN_MP_DR_IS_MODULUS_C #define BN_MP_DR_REDUCE_C #define BN_MP_DR_SETUP_C #define BN_MP_EXCH_C #define BN_MP_EXPT_D_C #define BN_MP_EXPTMOD_C #define BN_MP_EXPTMOD_FAST_C #define BN_MP_EXTEUCLID_C #define BN_MP_FREAD_C #define BN_MP_FWRITE_C #define BN_MP_GCD_C #define BN_MP_GET_INT_C #define BN_MP_GROW_C #define BN_MP_INIT_C #define BN_MP_INIT_COPY_C #define BN_MP_INIT_MULTI_C #define BN_MP_INIT_SET_C #define BN_MP_INIT_SET_INT_C #define BN_MP_INIT_SIZE_C #define BN_MP_INVMOD_C #define BN_MP_INVMOD_SLOW_C #define BN_MP_IS_SQUARE_C #define BN_MP_JACOBI_C #define BN_MP_KARATSUBA_MUL_C #define BN_MP_KARATSUBA_SQR_C #define BN_MP_LCM_C #define BN_MP_LSHD_C #define BN_MP_MOD_C #define BN_MP_MOD_2D_C #define BN_MP_MOD_D_C #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C #define BN_MP_MONTGOMERY_REDUCE_C #define BN_MP_MONTGOMERY_SETUP_C #define BN_MP_MUL_C #define BN_MP_MUL_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_MULMOD_C #define BN_MP_N_ROOT_C #define BN_MP_NEG_C #define BN_MP_OR_C #define BN_MP_PRIME_FERMAT_C #define BN_MP_PRIME_IS_DIVISIBLE_C #define BN_MP_PRIME_IS_PRIME_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_PRIME_NEXT_PRIME_C #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C #define BN_MP_PRIME_RANDOM_EX_C #define BN_MP_RADIX_SIZE_C #define BN_MP_RADIX_SMAP_C #define BN_MP_RAND_C #define BN_MP_READ_RADIX_C #define BN_MP_READ_SIGNED_BIN_C #define BN_MP_READ_UNSIGNED_BIN_C #define BN_MP_REDUCE_C #define BN_MP_REDUCE_2K_C #define BN_MP_REDUCE_2K_L_C #define BN_MP_REDUCE_2K_SETUP_C #define BN_MP_REDUCE_2K_SETUP_L_C #define BN_MP_REDUCE_IS_2K_C #define BN_MP_REDUCE_IS_2K_L_C #define BN_MP_REDUCE_SETUP_C #define BN_MP_RSHD_C #define BN_MP_SET_C #define BN_MP_SET_INT_C #define BN_MP_SHRINK_C #define BN_MP_SIGNED_BIN_SIZE_C #define BN_MP_SQR_C #define BN_MP_SQRMOD_C #define BN_MP_SQRT_C #define BN_MP_SUB_C #define BN_MP_SUB_D_C #define BN_MP_SUBMOD_C #define BN_MP_TO_SIGNED_BIN_C #define BN_MP_TO_SIGNED_BIN_N_C #define BN_MP_TO_UNSIGNED_BIN_C #define BN_MP_TO_UNSIGNED_BIN_N_C #define BN_MP_TOOM_MUL_C #define BN_MP_TOOM_SQR_C #define BN_MP_TORADIX_C #define BN_MP_TORADIX_N_C #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_XOR_C #define BN_MP_ZERO_C #define BN_PRIME_TAB_C #define BN_REVERSE_C #define BN_S_MP_ADD_C #define BN_S_MP_EXPTMOD_C #define BN_S_MP_MUL_DIGS_C #define BN_S_MP_MUL_HIGH_DIGS_C #define BN_S_MP_SQR_C #define BN_S_MP_SUB_C #define BNCORE_C #endif #if defined(BN_ERROR_C) #define BN_MP_ERROR_TO_STRING_C #endif #if defined(BN_FAST_MP_INVMOD_C) #define BN_MP_ISEVEN_C #define BN_MP_INIT_MULTI_C #define BN_MP_COPY_C #define BN_MP_MOD_C #define BN_MP_SET_C #define BN_MP_DIV_2_C #define BN_MP_ISODD_C #define BN_MP_SUB_C #define BN_MP_CMP_C #define BN_MP_ISZERO_C #define BN_MP_CMP_D_C #define BN_MP_ADD_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_FAST_MP_MONTGOMERY_REDUCE_C) #define BN_MP_GROW_C #define BN_MP_RSHD_C #define BN_MP_CLAMP_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_FAST_S_MP_MUL_DIGS_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_FAST_S_MP_SQR_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_2EXPT_C) #define BN_MP_ZERO_C #define BN_MP_GROW_C #endif #if defined(BN_MP_ABS_C) #define BN_MP_COPY_C #endif #if defined(BN_MP_ADD_C) #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_ADD_D_C) #define BN_MP_GROW_C #define BN_MP_SUB_D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_ADDMOD_C) #define BN_MP_INIT_C #define BN_MP_ADD_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_AND_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_CLAMP_C) #endif #if defined(BN_MP_CLEAR_C) #endif #if defined(BN_MP_CLEAR_MULTI_C) #define BN_MP_CLEAR_C #endif #if defined(BN_MP_CMP_C) #define BN_MP_CMP_MAG_C #endif #if defined(BN_MP_CMP_D_C) #endif #if defined(BN_MP_CMP_MAG_C) #endif #if defined(BN_MP_CNT_LSB_C) #define BN_MP_ISZERO_C #endif #if defined(BN_MP_COPY_C) #define BN_MP_GROW_C #endif #if defined(BN_MP_COUNT_BITS_C) #endif #if defined(BN_MP_DIV_C) #define BN_MP_ISZERO_C #define BN_MP_CMP_MAG_C #define BN_MP_COPY_C #define BN_MP_ZERO_C #define BN_MP_INIT_MULTI_C #define BN_MP_SET_C #define BN_MP_COUNT_BITS_C #define BN_MP_ABS_C #define BN_MP_MUL_2D_C #define BN_MP_CMP_C #define BN_MP_SUB_C #define BN_MP_ADD_C #define BN_MP_DIV_2D_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_INIT_SIZE_C #define BN_MP_INIT_C #define BN_MP_INIT_COPY_C #define BN_MP_LSHD_C #define BN_MP_RSHD_C #define BN_MP_MUL_D_C #define BN_MP_CLAMP_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DIV_2_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_DIV_2D_C) #define BN_MP_COPY_C #define BN_MP_ZERO_C #define BN_MP_INIT_C #define BN_MP_MOD_2D_C #define BN_MP_CLEAR_C #define BN_MP_RSHD_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_DIV_3_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DIV_D_C) #define BN_MP_ISZERO_C #define BN_MP_COPY_C #define BN_MP_DIV_2D_C #define BN_MP_DIV_3_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_DR_IS_MODULUS_C) #endif #if defined(BN_MP_DR_REDUCE_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_DR_SETUP_C) #endif #if defined(BN_MP_EXCH_C) #endif #if defined(BN_MP_EXPT_D_C) #define BN_MP_INIT_COPY_C #define BN_MP_SET_C #define BN_MP_SQR_C #define BN_MP_CLEAR_C #define BN_MP_MUL_C #endif #if defined(BN_MP_EXPTMOD_C) #define BN_MP_INIT_C #define BN_MP_INVMOD_C #define BN_MP_CLEAR_C #define BN_MP_ABS_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_REDUCE_IS_2K_L_C #define BN_S_MP_EXPTMOD_C #define BN_MP_DR_IS_MODULUS_C #define BN_MP_REDUCE_IS_2K_C #define BN_MP_ISODD_C #define BN_MP_EXPTMOD_FAST_C #endif #if defined(BN_MP_EXPTMOD_FAST_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #define BN_MP_MONTGOMERY_SETUP_C #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_MP_MONTGOMERY_REDUCE_C #define BN_MP_DR_SETUP_C #define BN_MP_DR_REDUCE_C #define BN_MP_REDUCE_2K_SETUP_C #define BN_MP_REDUCE_2K_C #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C #define BN_MP_MULMOD_C #define BN_MP_SET_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_SQR_C #define BN_MP_MUL_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_EXTEUCLID_C) #define BN_MP_INIT_MULTI_C #define BN_MP_SET_C #define BN_MP_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_C #define BN_MP_MUL_C #define BN_MP_SUB_C #define BN_MP_NEG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_FREAD_C) #define BN_MP_ZERO_C #define BN_MP_S_RMAP_C #define BN_MP_MUL_D_C #define BN_MP_ADD_D_C #define BN_MP_CMP_D_C #endif #if defined(BN_MP_FWRITE_C) #define BN_MP_RADIX_SIZE_C #define BN_MP_TORADIX_C #endif #if defined(BN_MP_GCD_C) #define BN_MP_ISZERO_C #define BN_MP_ABS_C #define BN_MP_ZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_S_MP_SUB_C #define BN_MP_MUL_2D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_GET_INT_C) #endif #if defined(BN_MP_GROW_C) #endif #if defined(BN_MP_INIT_C) #endif #if defined(BN_MP_INIT_COPY_C) #define BN_MP_COPY_C #endif #if defined(BN_MP_INIT_MULTI_C) #define BN_MP_ERR_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_INIT_SET_C) #define BN_MP_INIT_C #define BN_MP_SET_C #endif #if defined(BN_MP_INIT_SET_INT_C) #define BN_MP_INIT_C #define BN_MP_SET_INT_C #endif #if defined(BN_MP_INIT_SIZE_C) #define BN_MP_INIT_C #endif #if defined(BN_MP_INVMOD_C) #define BN_MP_ISZERO_C #define BN_MP_ISODD_C #define BN_FAST_MP_INVMOD_C #define BN_MP_INVMOD_SLOW_C #endif #if defined(BN_MP_INVMOD_SLOW_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_ISEVEN_C #define BN_MP_SET_C #define BN_MP_DIV_2_C #define BN_MP_ISODD_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_CMP_C #define BN_MP_CMP_D_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_IS_SQUARE_C) #define BN_MP_MOD_D_C #define BN_MP_INIT_SET_INT_C #define BN_MP_MOD_C #define BN_MP_GET_INT_C #define BN_MP_SQRT_C #define BN_MP_SQR_C #define BN_MP_CMP_MAG_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_JACOBI_C) #define BN_MP_CMP_D_C #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_MOD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_KARATSUBA_MUL_C) #define BN_MP_MUL_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_SUB_C #define BN_MP_ADD_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_KARATSUBA_SQR_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_SQR_C #define BN_MP_SUB_C #define BN_S_MP_ADD_C #define BN_MP_LSHD_C #define BN_MP_ADD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_LCM_C) #define BN_MP_INIT_MULTI_C #define BN_MP_GCD_C #define BN_MP_CMP_MAG_C #define BN_MP_DIV_C #define BN_MP_MUL_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_LSHD_C) #define BN_MP_GROW_C #define BN_MP_RSHD_C #endif #if defined(BN_MP_MOD_C) #define BN_MP_INIT_C #define BN_MP_DIV_C #define BN_MP_CLEAR_C #define BN_MP_ADD_C #define BN_MP_EXCH_C #endif #if defined(BN_MP_MOD_2D_C) #define BN_MP_ZERO_C #define BN_MP_COPY_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MOD_D_C) #define BN_MP_DIV_D_C #endif #if defined(BN_MP_MONTGOMERY_CALC_NORMALIZATION_C) #define BN_MP_COUNT_BITS_C #define BN_MP_2EXPT_C #define BN_MP_SET_C #define BN_MP_MUL_2_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_MONTGOMERY_REDUCE_C) #define BN_FAST_MP_MONTGOMERY_REDUCE_C #define BN_MP_GROW_C #define BN_MP_CLAMP_C #define BN_MP_RSHD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_MONTGOMERY_SETUP_C) #endif #if defined(BN_MP_MUL_C) #define BN_MP_TOOM_MUL_C #define BN_MP_KARATSUBA_MUL_C #define BN_FAST_S_MP_MUL_DIGS_C #define BN_S_MP_MUL_C #define BN_S_MP_MUL_DIGS_C #endif #if defined(BN_MP_MUL_2_C) #define BN_MP_GROW_C #endif #if defined(BN_MP_MUL_2D_C) #define BN_MP_COPY_C #define BN_MP_GROW_C #define BN_MP_LSHD_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MUL_D_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_MULMOD_C) #define BN_MP_INIT_C #define BN_MP_MUL_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_N_ROOT_C) #define BN_MP_INIT_C #define BN_MP_SET_C #define BN_MP_COPY_C #define BN_MP_EXPT_D_C #define BN_MP_MUL_C #define BN_MP_SUB_C #define BN_MP_MUL_D_C #define BN_MP_DIV_C #define BN_MP_CMP_C #define BN_MP_SUB_D_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_NEG_C) #define BN_MP_COPY_C #define BN_MP_ISZERO_C #endif #if defined(BN_MP_OR_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_FERMAT_C) #define BN_MP_CMP_D_C #define BN_MP_INIT_C #define BN_MP_EXPTMOD_C #define BN_MP_CMP_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_IS_DIVISIBLE_C) #define BN_MP_MOD_D_C #endif #if defined(BN_MP_PRIME_IS_PRIME_C) #define BN_MP_CMP_D_C #define BN_MP_PRIME_IS_DIVISIBLE_C #define BN_MP_INIT_C #define BN_MP_SET_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_MILLER_RABIN_C) #define BN_MP_CMP_D_C #define BN_MP_INIT_COPY_C #define BN_MP_SUB_D_C #define BN_MP_CNT_LSB_C #define BN_MP_DIV_2D_C #define BN_MP_EXPTMOD_C #define BN_MP_CMP_C #define BN_MP_SQRMOD_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_NEXT_PRIME_C) #define BN_MP_CMP_D_C #define BN_MP_SET_C #define BN_MP_SUB_D_C #define BN_MP_ISEVEN_C #define BN_MP_MOD_D_C #define BN_MP_INIT_C #define BN_MP_ADD_D_C #define BN_MP_PRIME_MILLER_RABIN_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_PRIME_RABIN_MILLER_TRIALS_C) #endif #if defined(BN_MP_PRIME_RANDOM_EX_C) #define BN_MP_READ_UNSIGNED_BIN_C #define BN_MP_PRIME_IS_PRIME_C #define BN_MP_SUB_D_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2_C #define BN_MP_ADD_D_C #endif #if defined(BN_MP_RADIX_SIZE_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_RADIX_SMAP_C) #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_RAND_C) #define BN_MP_ZERO_C #define BN_MP_ADD_D_C #define BN_MP_LSHD_C #endif #if defined(BN_MP_READ_RADIX_C) #define BN_MP_ZERO_C #define BN_MP_S_RMAP_C #define BN_MP_RADIX_SMAP_C #define BN_MP_MUL_D_C #define BN_MP_ADD_D_C #define BN_MP_ISZERO_C #endif #if defined(BN_MP_READ_SIGNED_BIN_C) #define BN_MP_READ_UNSIGNED_BIN_C #endif #if defined(BN_MP_READ_UNSIGNED_BIN_C) #define BN_MP_GROW_C #define BN_MP_ZERO_C #define BN_MP_MUL_2D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_REDUCE_C) #define BN_MP_REDUCE_SETUP_C #define BN_MP_INIT_COPY_C #define BN_MP_RSHD_C #define BN_MP_MUL_C #define BN_S_MP_MUL_HIGH_DIGS_C #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_MP_MOD_2D_C #define BN_S_MP_MUL_DIGS_C #define BN_MP_SUB_C #define BN_MP_CMP_D_C #define BN_MP_SET_C #define BN_MP_LSHD_C #define BN_MP_ADD_C #define BN_MP_CMP_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_2D_C #define BN_MP_MUL_D_C #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_L_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_DIV_2D_C #define BN_MP_MUL_C #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_2K_SETUP_C) #define BN_MP_INIT_C #define BN_MP_COUNT_BITS_C #define BN_MP_2EXPT_C #define BN_MP_CLEAR_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_REDUCE_2K_SETUP_L_C) #define BN_MP_INIT_C #define BN_MP_2EXPT_C #define BN_MP_COUNT_BITS_C #define BN_S_MP_SUB_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_REDUCE_IS_2K_C) #define BN_MP_REDUCE_2K_C #define BN_MP_COUNT_BITS_C #endif #if defined(BN_MP_REDUCE_IS_2K_L_C) #endif #if defined(BN_MP_REDUCE_SETUP_C) #define BN_MP_2EXPT_C #define BN_MP_DIV_C #endif #if defined(BN_MP_RSHD_C) #define BN_MP_ZERO_C #endif #if defined(BN_MP_SET_C) #define BN_MP_ZERO_C #endif #if defined(BN_MP_SET_INT_C) #define BN_MP_ZERO_C #define BN_MP_MUL_2D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_SHRINK_C) #endif #if defined(BN_MP_SIGNED_BIN_SIZE_C) #define BN_MP_UNSIGNED_BIN_SIZE_C #endif #if defined(BN_MP_SQR_C) #define BN_MP_TOOM_SQR_C #define BN_MP_KARATSUBA_SQR_C #define BN_FAST_S_MP_SQR_C #define BN_S_MP_SQR_C #endif #if defined(BN_MP_SQRMOD_C) #define BN_MP_INIT_C #define BN_MP_SQR_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_SQRT_C) #define BN_MP_N_ROOT_C #define BN_MP_ISZERO_C #define BN_MP_ZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_RSHD_C #define BN_MP_DIV_C #define BN_MP_ADD_C #define BN_MP_DIV_2_C #define BN_MP_CMP_MAG_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_SUB_C) #define BN_S_MP_ADD_C #define BN_MP_CMP_MAG_C #define BN_S_MP_SUB_C #endif #if defined(BN_MP_SUB_D_C) #define BN_MP_GROW_C #define BN_MP_ADD_D_C #define BN_MP_CLAMP_C #endif #if defined(BN_MP_SUBMOD_C) #define BN_MP_INIT_C #define BN_MP_SUB_C #define BN_MP_CLEAR_C #define BN_MP_MOD_C #endif #if defined(BN_MP_TO_SIGNED_BIN_C) #define BN_MP_TO_UNSIGNED_BIN_C #endif #if defined(BN_MP_TO_SIGNED_BIN_N_C) #define BN_MP_SIGNED_BIN_SIZE_C #define BN_MP_TO_SIGNED_BIN_C #endif #if defined(BN_MP_TO_UNSIGNED_BIN_C) #define BN_MP_INIT_COPY_C #define BN_MP_ISZERO_C #define BN_MP_DIV_2D_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_TO_UNSIGNED_BIN_N_C) #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_TO_UNSIGNED_BIN_C #endif #if defined(BN_MP_TOOM_MUL_C) #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_2D_C #define BN_MP_COPY_C #define BN_MP_RSHD_C #define BN_MP_MUL_C #define BN_MP_MUL_2_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_DIV_3_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_TOOM_SQR_C) #define BN_MP_INIT_MULTI_C #define BN_MP_MOD_2D_C #define BN_MP_COPY_C #define BN_MP_RSHD_C #define BN_MP_SQR_C #define BN_MP_MUL_2_C #define BN_MP_ADD_C #define BN_MP_SUB_C #define BN_MP_DIV_2_C #define BN_MP_MUL_2D_C #define BN_MP_MUL_D_C #define BN_MP_DIV_3_C #define BN_MP_LSHD_C #define BN_MP_CLEAR_MULTI_C #endif #if defined(BN_MP_TORADIX_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_TORADIX_N_C) #define BN_MP_ISZERO_C #define BN_MP_INIT_COPY_C #define BN_MP_DIV_D_C #define BN_MP_CLEAR_C #define BN_MP_S_RMAP_C #endif #if defined(BN_MP_UNSIGNED_BIN_SIZE_C) #define BN_MP_COUNT_BITS_C #endif #if defined(BN_MP_XOR_C) #define BN_MP_INIT_COPY_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_MP_ZERO_C) #endif #if defined(BN_PRIME_TAB_C) #endif #if defined(BN_REVERSE_C) #endif #if defined(BN_S_MP_ADD_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BN_S_MP_EXPTMOD_C) #define BN_MP_COUNT_BITS_C #define BN_MP_INIT_C #define BN_MP_CLEAR_C #define BN_MP_REDUCE_SETUP_C #define BN_MP_REDUCE_C #define BN_MP_REDUCE_2K_SETUP_L_C #define BN_MP_REDUCE_2K_L_C #define BN_MP_MOD_C #define BN_MP_COPY_C #define BN_MP_SQR_C #define BN_MP_MUL_C #define BN_MP_SET_C #define BN_MP_EXCH_C #endif #if defined(BN_S_MP_MUL_DIGS_C) #define BN_FAST_S_MP_MUL_DIGS_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_MUL_HIGH_DIGS_C) #define BN_FAST_S_MP_MUL_HIGH_DIGS_C #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_SQR_C) #define BN_MP_INIT_SIZE_C #define BN_MP_CLAMP_C #define BN_MP_EXCH_C #define BN_MP_CLEAR_C #endif #if defined(BN_S_MP_SUB_C) #define BN_MP_GROW_C #define BN_MP_CLAMP_C #endif #if defined(BNCORE_C) #endif #ifdef LTM3 #define LTM_LAST #endif #include #include #else #define LTM_LAST #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/libtommath/tommath_superclass.h0000644000175000017500000000427212456307241022057 0ustar jnthnjnthn/* super class file for PK algos */ /* default ... include all MPI */ #define LTM_ALL /* RSA only (does not support DH/DSA/ECC) */ /* #define SC_RSA_1 */ /* For reference.... On an Athlon64 optimizing for speed... LTM's mpi.o with all functions [striped] is 142KiB in size. */ /* Works for RSA only, mpi.o is 68KiB */ #ifdef SC_RSA_1 #define BN_MP_SHRINK_C #define BN_MP_LCM_C #define BN_MP_PRIME_RANDOM_EX_C #define BN_MP_INVMOD_C #define BN_MP_GCD_C #define BN_MP_MOD_C #define BN_MP_MULMOD_C #define BN_MP_ADDMOD_C #define BN_MP_EXPTMOD_C #define BN_MP_SET_INT_C #define BN_MP_INIT_MULTI_C #define BN_MP_CLEAR_MULTI_C #define BN_MP_UNSIGNED_BIN_SIZE_C #define BN_MP_TO_UNSIGNED_BIN_C #define BN_MP_MOD_D_C #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C #define BN_REVERSE_C #define BN_PRIME_TAB_C /* other modifiers */ #define BN_MP_DIV_SMALL /* Slower division, not critical */ /* here we are on the last pass so we turn things off. The functions classes are still there * but we remove them specifically from the build. This also invokes tweaks in functions * like removing support for even moduli, etc... */ #ifdef LTM_LAST #undef BN_MP_TOOM_MUL_C #undef BN_MP_TOOM_SQR_C #undef BN_MP_KARATSUBA_MUL_C #undef BN_MP_KARATSUBA_SQR_C #undef BN_MP_REDUCE_C #undef BN_MP_REDUCE_SETUP_C #undef BN_MP_DR_IS_MODULUS_C #undef BN_MP_DR_SETUP_C #undef BN_MP_DR_REDUCE_C #undef BN_MP_REDUCE_IS_2K_C #undef BN_MP_REDUCE_2K_SETUP_C #undef BN_MP_REDUCE_2K_C #undef BN_S_MP_EXPTMOD_C #undef BN_MP_DIV_3_C #undef BN_S_MP_MUL_HIGH_DIGS_C #undef BN_FAST_S_MP_MUL_HIGH_DIGS_C #undef BN_FAST_MP_INVMOD_C /* To safely undefine these you have to make sure your RSA key won't exceed the Comba threshold * which is roughly 255 digits [7140 bits for 32-bit machines, 15300 bits for 64-bit machines] * which means roughly speaking you can handle upto 2536-bit RSA keys with these defined without * trouble. */ #undef BN_S_MP_MUL_DIGS_C #undef BN_S_MP_SQR_C #undef BN_MP_MONTGOMERY_REDUCE_C #endif #endif /* $Source$ */ /* $Revision$ */ /* $Date$ */ MoarVM-2015.11/3rdparty/msinttypes/inttypes.h0000644000175000017500000001756312456307241020107 0ustar jnthnjnthn// ISO C9x compliant inttypes.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the product nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_INTTYPES_H_ // [ #define _MSC_INTTYPES_H_ #if _MSC_VER > 1000 #pragma once #endif #include "stdint.h" // 7.8 Format conversion of integer types typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; // 7.8.1 Macros for format specifiers #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 // The fprintf macros for signed integers are: #define PRId8 "d" #define PRIi8 "i" #define PRIdLEAST8 "d" #define PRIiLEAST8 "i" #define PRIdFAST8 "d" #define PRIiFAST8 "i" #define PRId16 "hd" #define PRIi16 "hi" #define PRIdLEAST16 "hd" #define PRIiLEAST16 "hi" #define PRIdFAST16 "hd" #define PRIiFAST16 "hi" #define PRId32 "I32d" #define PRIi32 "I32i" #define PRIdLEAST32 "I32d" #define PRIiLEAST32 "I32i" #define PRIdFAST32 "I32d" #define PRIiFAST32 "I32i" #define PRId64 "I64d" #define PRIi64 "I64i" #define PRIdLEAST64 "I64d" #define PRIiLEAST64 "I64i" #define PRIdFAST64 "I64d" #define PRIiFAST64 "I64i" #define PRIdMAX "I64d" #define PRIiMAX "I64i" #define PRIdPTR "Id" #define PRIiPTR "Ii" // The fprintf macros for unsigned integers are: #define PRIo8 "o" #define PRIu8 "u" #define PRIx8 "x" #define PRIX8 "X" #define PRIoLEAST8 "o" #define PRIuLEAST8 "u" #define PRIxLEAST8 "x" #define PRIXLEAST8 "X" #define PRIoFAST8 "o" #define PRIuFAST8 "u" #define PRIxFAST8 "x" #define PRIXFAST8 "X" #define PRIo16 "ho" #define PRIu16 "hu" #define PRIx16 "hx" #define PRIX16 "hX" #define PRIoLEAST16 "ho" #define PRIuLEAST16 "hu" #define PRIxLEAST16 "hx" #define PRIXLEAST16 "hX" #define PRIoFAST16 "ho" #define PRIuFAST16 "hu" #define PRIxFAST16 "hx" #define PRIXFAST16 "hX" #define PRIo32 "I32o" #define PRIu32 "I32u" #define PRIx32 "I32x" #define PRIX32 "I32X" #define PRIoLEAST32 "I32o" #define PRIuLEAST32 "I32u" #define PRIxLEAST32 "I32x" #define PRIXLEAST32 "I32X" #define PRIoFAST32 "I32o" #define PRIuFAST32 "I32u" #define PRIxFAST32 "I32x" #define PRIXFAST32 "I32X" #define PRIo64 "I64o" #define PRIu64 "I64u" #define PRIx64 "I64x" #define PRIX64 "I64X" #define PRIoLEAST64 "I64o" #define PRIuLEAST64 "I64u" #define PRIxLEAST64 "I64x" #define PRIXLEAST64 "I64X" #define PRIoFAST64 "I64o" #define PRIuFAST64 "I64u" #define PRIxFAST64 "I64x" #define PRIXFAST64 "I64X" #define PRIoMAX "I64o" #define PRIuMAX "I64u" #define PRIxMAX "I64x" #define PRIXMAX "I64X" #define PRIoPTR "Io" #define PRIuPTR "Iu" #define PRIxPTR "Ix" #define PRIXPTR "IX" // The fscanf macros for signed integers are: #define SCNd8 "d" #define SCNi8 "i" #define SCNdLEAST8 "d" #define SCNiLEAST8 "i" #define SCNdFAST8 "d" #define SCNiFAST8 "i" #define SCNd16 "hd" #define SCNi16 "hi" #define SCNdLEAST16 "hd" #define SCNiLEAST16 "hi" #define SCNdFAST16 "hd" #define SCNiFAST16 "hi" #define SCNd32 "ld" #define SCNi32 "li" #define SCNdLEAST32 "ld" #define SCNiLEAST32 "li" #define SCNdFAST32 "ld" #define SCNiFAST32 "li" #define SCNd64 "I64d" #define SCNi64 "I64i" #define SCNdLEAST64 "I64d" #define SCNiLEAST64 "I64i" #define SCNdFAST64 "I64d" #define SCNiFAST64 "I64i" #define SCNdMAX "I64d" #define SCNiMAX "I64i" #ifdef _WIN64 // [ # define SCNdPTR "I64d" # define SCNiPTR "I64i" #else // _WIN64 ][ # define SCNdPTR "ld" # define SCNiPTR "li" #endif // _WIN64 ] // The fscanf macros for unsigned integers are: #define SCNo8 "o" #define SCNu8 "u" #define SCNx8 "x" #define SCNX8 "X" #define SCNoLEAST8 "o" #define SCNuLEAST8 "u" #define SCNxLEAST8 "x" #define SCNXLEAST8 "X" #define SCNoFAST8 "o" #define SCNuFAST8 "u" #define SCNxFAST8 "x" #define SCNXFAST8 "X" #define SCNo16 "ho" #define SCNu16 "hu" #define SCNx16 "hx" #define SCNX16 "hX" #define SCNoLEAST16 "ho" #define SCNuLEAST16 "hu" #define SCNxLEAST16 "hx" #define SCNXLEAST16 "hX" #define SCNoFAST16 "ho" #define SCNuFAST16 "hu" #define SCNxFAST16 "hx" #define SCNXFAST16 "hX" #define SCNo32 "lo" #define SCNu32 "lu" #define SCNx32 "lx" #define SCNX32 "lX" #define SCNoLEAST32 "lo" #define SCNuLEAST32 "lu" #define SCNxLEAST32 "lx" #define SCNXLEAST32 "lX" #define SCNoFAST32 "lo" #define SCNuFAST32 "lu" #define SCNxFAST32 "lx" #define SCNXFAST32 "lX" #define SCNo64 "I64o" #define SCNu64 "I64u" #define SCNx64 "I64x" #define SCNX64 "I64X" #define SCNoLEAST64 "I64o" #define SCNuLEAST64 "I64u" #define SCNxLEAST64 "I64x" #define SCNXLEAST64 "I64X" #define SCNoFAST64 "I64o" #define SCNuFAST64 "I64u" #define SCNxFAST64 "I64x" #define SCNXFAST64 "I64X" #define SCNoMAX "I64o" #define SCNuMAX "I64u" #define SCNxMAX "I64x" #define SCNXMAX "I64X" #ifdef _WIN64 // [ # define SCNoPTR "I64o" # define SCNuPTR "I64u" # define SCNxPTR "I64x" # define SCNXPTR "I64X" #else // _WIN64 ][ # define SCNoPTR "lo" # define SCNuPTR "lu" # define SCNxPTR "lx" # define SCNXPTR "lX" #endif // _WIN64 ] #endif // __STDC_FORMAT_MACROS ] // 7.8.2 Functions for greatest-width integer types // 7.8.2.1 The imaxabs function #define imaxabs _abs64 // 7.8.2.2 The imaxdiv function // This is modified version of div() function from Microsoft's div.c found // in %MSVC.NET%\crt\src\div.c #ifdef STATIC_IMAXDIV // [ static #else // STATIC_IMAXDIV ][ _inline #endif // STATIC_IMAXDIV ] imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) { imaxdiv_t result; result.quot = numer / denom; result.rem = numer % denom; if (numer < 0 && result.rem > 0) { // did division wrong; must fix up ++result.quot; result.rem -= denom; } return result; } // 7.8.2.3 The strtoimax and strtoumax functions #define strtoimax _strtoi64 #define strtoumax _strtoui64 // 7.8.2.4 The wcstoimax and wcstoumax functions #define wcstoimax _wcstoi64 #define wcstoumax _wcstoui64 #endif // _MSC_INTTYPES_H_ ] MoarVM-2015.11/3rdparty/msinttypes/stdint.h0000644000175000017500000001763412456307241017534 0ustar jnthnjnthn// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the product nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #if _MSC_VER >= 1600 // [ #include #else // ] _MSC_VER >= 1600 [ #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants // These #ifndef's are needed to prevent collisions with . // Check out Issue 9 for the details. #ifndef INTMAX_C // [ # define INTMAX_C INT64_C #endif // INTMAX_C ] #ifndef UINTMAX_C // [ # define UINTMAX_C UINT64_C #endif // UINTMAX_C ] #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_VER >= 1600 ] #endif // _MSC_STDINT_H_ ] MoarVM-2015.11/3rdparty/sha1/sha1.c0000644000175000017500000001773412456307241015474 0ustar jnthnjnthn/* SHA-1 in C By Steve Reid 100% Public Domain ----------------- Modified 7/98 By James H. Brown Still 100% Public Domain Corrected a problem which generated improper hash values on 16 bit machines Routine SHA1Update changed from void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) to void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned long len) The 'len' parameter was declared an int which works fine on 32 bit machines. However, on 16 bit machines an int is too small for the shifts being done against it. This caused the hash function to generate incorrect values if len was greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). Since the file IO in main() reads 16K at a time, any file 8K or larger would be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million "a"s). I also changed the declaration of variables i & j in SHA1Update to unsigned long from unsigned int for the same reason. These changes should make no difference to any 32 bit implementations since an int and a long are the same size in those environments. -- I also corrected a few compiler warnings generated by Borland C. 1. Added #include for exit() prototype 2. Removed unused variable 'j' in SHA1Final 3. Changed exit(0) to return(0) at end of main. ALL changes I made can be located by searching for comments containing 'JHB' ----------------- Modified 8/98 By Steve Reid Still 100% public domain 1- Removed #include and used return() instead of exit() 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net ----------------- Modified 4/01 By Saul Kravitz Still 100% PD Modified to run on Compaq Alpha hardware. ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain modified for use with stdint types, autoconf code cleanup, removed attribution comments switched SHA1Final() argument order for consistency use SHA1_ prefix for public api move public api to sha1.h ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain ----------------- Modified 12/2011 By Jonathan Worthington Still 100% public domain Strip out various test code, twiddle digest to ASCII code a bit. */ #include #include #include "sha1.h" void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]); #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ /* I got the idea of expanding during the round function from SSLeay */ /* FIXME: can we do this in an endian-proof way? */ #ifdef WORDS_BIGENDIAN #define blk0(i) block->l[i] #else #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ |(rol(block->l[i],8)&0x00FF00FF)) #endif #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]) { unsigned int a, b, c, d, e; typedef union { unsigned char c[64]; unsigned int l[16]; } CHAR64LONG16; CHAR64LONG16* block; block = (CHAR64LONG16*)buffer; /* Copy context->state[] to working vars */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; /* 4 rounds of 20 operations each. Loop unrolled. */ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); /* Add the working vars back into context.state[] */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; /* Wipe variables */ a = b = c = d = e = 0; } /* SHA1Init - Initialize new context */ void SHA1Init(SHA1Context* context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } /* Run your data through this. */ void SHA1Update(SHA1Context* context, const unsigned char* data, const size_t len) { size_t i, j; j = (context->count[0] >> 3) & 63; if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; context->count[1] += (len >> 29); if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1_Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1_Transform(context->state, data + i); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } /* Add padding and return the message digest. */ void SHA1_Digest(SHA1Context* context, unsigned char digest[SHA1_DIGEST_SIZE]) { unsigned int i; unsigned char finalcount[8]; for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ } SHA1Update(context, (unsigned char *)"\200", 1); while ((context->count[0] & 504) != 448) { SHA1Update(context, (unsigned char *)"\0", 1); } SHA1Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ for (i = 0; i < SHA1_DIGEST_SIZE; i++) { digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } /* Wipe variables */ i = 0; memset(context->buffer, 0, 64); memset(context->state, 0, 20); memset(context->count, 0, 8); memset(finalcount, 0, 8); /* SWR */ } /* Produces a hex output of the digest. */ void SHA1Final(SHA1Context *context, char *output) { unsigned char digest[20]; int i,j; char *c = output; SHA1_Digest(context, digest); for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { for (j = 0; j < 4; j++) { sprintf(c,"%02X", digest[i*4+j]); c += 2; } } } MoarVM-2015.11/3rdparty/sha1/sha1.h0000644000175000017500000000117612456307241015472 0ustar jnthnjnthn/* public api for steve reid's public domain SHA-1 implementation */ /* this file is in the public domain */ #ifndef __SHA1_H #define __SHA1_H #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned int state[5]; unsigned int count[2]; unsigned char buffer[64]; } SHA1Context; #define SHA1_DIGEST_SIZE 20 void SHA1Init(SHA1Context* context); void SHA1Update(SHA1Context* context, const unsigned char* data, const size_t len); void SHA1_Digest(SHA1Context* context, unsigned char digest[SHA1_DIGEST_SIZE]); void SHA1Final(SHA1Context* context, char *output); #ifdef __cplusplus } #endif #endif /* __SHA1_H */ MoarVM-2015.11/3rdparty/tinymt/LICENSE.txt0000644000175000017500000000311112456307241016767 0ustar jnthnjnthnCopyright (c) 2011, 2013 Mutsuo Saito, Makoto Matsumoto, Hiroshima University and The University of Tokyo. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Hiroshima University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MoarVM-2015.11/3rdparty/tinymt/README.txt0000644000175000017500000000051312456307241016645 0ustar jnthnjnthn64-bit version of TinyMT[1] as used by MoarVM[2] Original code published by Mutsuo Saito, (saito@math.sci.hiroshima-u.ac.jp) Hiroshima University Makoto Matsumoto, The University of Tokyo under the 3-clause BSD license. [1] http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/ [2] https://github.com/MoarVM/MoarVM/ MoarVM-2015.11/3rdparty/tinymt/tinymt64.c0000644000175000017500000000701512456307241017015 0ustar jnthnjnthn/** * @file tinymt64.h * * @brief Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (The University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * LICENSE.txt * * @file tinymt64.c * * @brief 64-bit Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (The University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * LICENSE.txt */ #include #include "tinymt64.h" #define TINYMT64_SH0 12 #define TINYMT64_SH1 11 #define TINYMT64_SH8 8 #define TINYMT64_MASK UINT64_C(0x7fffffffffffffff) #define TINYMT64_MUL (1.0 / 18446744073709551616.0) /* * tinymt64 default parameters */ #ifndef TINYMT64_MAT1 # define TINYMT64_MAT1 0x7a840f50 #endif #ifndef TINYMT64_MAT2 # define TINYMT64_MAT2 0xf3d8fcf6 #endif #ifndef TINYMT64_TMAT # define TINYMT64_TMAT 0x9746beffffbffffe #endif /* * Initialization loop */ #define MIN_LOOP 8 static const uint32_t mat1 = TINYMT64_MAT1; static const uint32_t mat2 = TINYMT64_MAT2; static const uint64_t tmat = TINYMT64_TMAT; /** * This function changes internal state of tinymt64. * Users should not call this function directly. * @param random tinymt internal status */ static void tinymt64_next_state(uint64_t * random) { uint64_t x; random[0] &= TINYMT64_MASK; x = random[0] ^ random[1]; x ^= x << TINYMT64_SH0; x ^= x >> 32; x ^= x << 32; x ^= x << TINYMT64_SH1; random[0] = random[1]; random[1] = x; random[0] ^= -((int64_t)(x & 1)) & mat1; random[1] ^= -((int64_t)(x & 1)) & (((uint64_t)mat2) << 32); } /** * This function outputs 64-bit unsigned integer from internal state. * Users should not call this function directly. * @param random tinymt internal status * @return 64-bit unsigned pseudorandom number */ static uint64_t uint64_temper(uint64_t * random) { uint64_t x; x = random[0] + random[1]; x ^= random[0] >> TINYMT64_SH8; x ^= -((int64_t)(x & 1)) & tmat; return x; } /** * This function outputs 64-bit unsigned integer from internal state. * @param random tinymt internal status * @return 64-bit unsigned integer r (0 <= r < 2^64) */ uint64_t tinymt64_generate_uint64(uint64_t * random) { tinymt64_next_state(random); return uint64_temper(random); } /** * This function outputs floating point number from internal state. * This function is implemented using multiplying by 1 / 2^64. * @param random tinymt internal status * @return floating point number r (0.0 <= r < 1.0) */ double tinymt64_generate_double(uint64_t * random) { tinymt64_next_state(random); return uint64_temper(random) * TINYMT64_MUL; } /** * This function initializes the internal state array with a 64-bit * unsigned integer seed. * @param random tinymt state vector. * @param seed a 64-bit unsigned integer used as a seed. */ void tinymt64_init(uint64_t * random, uint64_t seed) { int i; random[0] = seed ^ ((uint64_t)mat1 << 32); random[1] = mat2 ^ tmat; for (i = 1; i < MIN_LOOP; i++) { random[i & 1] ^= i + UINT64_C(6364136223846793005) * (random[(i - 1) & 1] ^ (random[(i - 1) & 1] >> 62)); } } MoarVM-2015.11/3rdparty/tinymt/tinymt64.h0000644000175000017500000000023212456307241017014 0ustar jnthnjnthnvoid tinymt64_init(uint64_t *state, uint64_t seed); uint64_t tinymt64_generate_uint64(uint64_t *state); double tinymt64_generate_double(uint64_t *state); MoarVM-2015.11/3rdparty/uthash.h0000644000175000017500000010233112534320622015264 0ustar jnthnjnthn/* Copyright (c) 2003-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTHASH_H #define UTHASH_H #include /* memcmp,strlen */ #include /* ptrdiff_t */ #include /* exit() */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #ifdef _MSC_VER /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #define DECLTYPE(x) #endif #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #ifdef NO_DECLTYPE #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while(0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while(0) #endif /* a number of the hash function use uint32_t which isn't defined on win32 */ #ifdef _MSC_VER typedef unsigned int uint32_t; typedef unsigned char uint8_t; #else #include /* uint32_t */ #endif #define UTHASH_VERSION 1.9.9 #ifndef uthash_fatal #define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ #endif #ifndef uthash_malloc #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #endif #ifndef uthash_free #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #endif #ifndef uthash_noexpand_fyi #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #endif #ifndef uthash_expand_fyi #define uthash_expand_fyi(tbl) /* can be defined to log expands */ #endif /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 8 /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 3 /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhe */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } while (0) #define HASH_FIND_CACHE(hh,head,keyptr,keylen,cache,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ if (cache) { \ _hf_hashv = cache; \ _hf_bkt = ((_hf_hashv) & (((head)->hh.tbl->num_buckets) - 1)); \ } \ else { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ (cache) = _hf_hashv; \ } \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } while (0) #define HASH_MAKE_TABLE(hh,head) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ sizeof(UT_hash_table)); \ if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl->buckets, 0, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ } while(0) #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_bkt; \ (add)->hh.key = (char*)(keyptr); \ (add)->hh.keylen = (unsigned)(keylen_in); \ if (!(head)) { \ head = (add); \ HASH_MAKE_TABLE(hh,head); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_ADD_KEYPTR_CACHE(hh,head,keyptr,keylen_in,cache,add) \ do { \ unsigned _ha_bkt; \ (add)->hh.key = (char*)keyptr; \ (add)->hh.keylen = (unsigned)keylen_in; \ if (!(head)) { \ head = (add); \ HASH_MAKE_TABLE(hh,head); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ if (cache) { \ (add)->hh.hashv = (cache); \ _ha_bkt = ((cache) & (((head)->hh.tbl->num_buckets) - 1)); \ } \ else { \ HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ (cache) = (add)->hh.hashv; \ } \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_TO_BKT( hashv, num_bkts, bkt ) \ do { \ bkt = ((hashv) & ((num_bkts) - 1)); \ } while(0) /* delete "delptr" from the hash table. * The use of _hd_hh_del below deserves special explanation. * These used to be expressed using (delptr) but that led to a bug * if someone used the same symbol for the head and deletee, like * HASH_DELETE(hh,users,users); * We want that to work, but by changing the head (users) below * we were forfeiting our ability to further refer to the deletee (users) * in the patch-up process. Solution: use scratch space to * copy the deletee pointer, then the latter references are via that * scratch pointer rather than through the repointed (users) symbol. */ #define HASH_DELETE(hh,head,delptr) \ do { \ unsigned _hd_bkt; \ struct UT_hash_handle *_hd_hh_del; \ if ( (head)->hh.tbl->num_items == 1 ) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head) = NULL; \ } else { \ _hd_hh_del = &((delptr)->hh); \ if ((delptr) == (head)) { \ unsigned cur = 0; \ while (cur < (head)->hh.tbl->num_buckets) { \ UT_hash_handle *cand = (head)->hh.tbl->buckets[cur].hh_head; \ while (cand) { \ if (cand && cand != &((delptr)->hh)) { \ DECLTYPE_ASSIGN((head), ELMT_FROM_HH((head)->hh.tbl,cand)); \ goto REPLACED_HEAD; \ } \ cand = cand->hh_next; \ } \ cur++; \ } \ uthash_fatal("Failed to replace deleted head"); \ REPLACED_HEAD: ; \ } \ HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ (head)->hh.tbl->num_items--; \ } \ HASH_FSCK(hh,head); \ } while (0) /* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. */ #ifdef HASH_DEBUG #define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) #define HASH_FSCK(hh,head) \ do { \ unsigned _bkt_i; \ unsigned _count, _bkt_count; \ char *_prev; \ struct UT_hash_handle *_thh; \ if (head) { \ _count = 0; \ for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ _bkt_count = 0; \ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ _prev = NULL; \ while (_thh) { \ if (_prev != (char*)(_thh->hh_prev)) { \ HASH_OOPS("invalid hh_prev %p, actual %p\n", \ _thh->hh_prev, _prev ); \ } \ _bkt_count++; \ _prev = (char*)(_thh); \ _thh = _thh->hh_next; \ } \ _count += _bkt_count; \ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ HASH_OOPS("invalid bucket count %d, actual %d\n", \ (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid hh item count %d, actual %d\n", \ (head)->hh.tbl->num_items, _count ); \ } \ } \ } while (0) #else #define HASH_FSCK(hh,head) #endif /* Use Jenkin's hash as the hash function. */ #define HASH_FCN HASH_JEN #define HASH_JEN_MIX(a,b,c) \ do { \ a -= b; a -= c; a ^= ( c >> 13 ); \ b -= c; b -= a; b ^= ( a << 8 ); \ c -= a; c -= b; c ^= ( b >> 13 ); \ a -= b; a -= c; a ^= ( c >> 12 ); \ b -= c; b -= a; b ^= ( a << 16 ); \ c -= a; c -= b; c ^= ( b >> 5 ); \ a -= b; a -= c; a ^= ( c >> 3 ); \ b -= c; b -= a; b ^= ( a << 10 ); \ c -= a; c -= b; c ^= ( b >> 15 ); \ } while (0) #define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hj_i,_hj_j,_hj_k; \ unsigned char *_hj_key=(unsigned char*)(key); \ hashv = 0xfeedbeef; \ _hj_i = _hj_j = 0x9e3779b9; \ _hj_k = (unsigned)(keylen); \ while (_hj_k >= 12) { \ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + ( (unsigned)_hj_key[2] << 16 ) \ + ( (unsigned)_hj_key[3] << 24 ) ); \ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + ( (unsigned)_hj_key[6] << 16 ) \ + ( (unsigned)_hj_key[7] << 24 ) ); \ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + ( (unsigned)_hj_key[10] << 16 ) \ + ( (unsigned)_hj_key[11] << 24 ) ); \ \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ \ _hj_key += 12; \ _hj_k -= 12; \ } \ hashv += keylen; \ switch ( _hj_k ) { \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ case 5: _hj_j += _hj_key[4]; \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ case 1: _hj_i += _hj_key[0]; \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ bkt = hashv & (num_bkts-1); \ } while(0) /* key comparison function; return 0 if keys equal */ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if ((out)->hh.keylen == keylen_in) { \ if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) break; \ } \ if ((out)->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); \ else out = NULL; \ } \ } while(0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,addhh) \ do { \ head.count++; \ (addhh)->hh_next = head.hh_head; \ (addhh)->hh_prev = NULL; \ if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ (head).hh_head=addhh; \ if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ && (addhh)->tbl->noexpand != 1) { \ HASH_EXPAND_BUCKETS((addhh)->tbl); \ } \ } while(0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(hh,head,hh_del) \ (head).count--; \ if ((head).hh_head == hh_del) { \ (head).hh_head = hh_del->hh_next; \ } \ if (hh_del->hh_prev) { \ hh_del->hh_prev->hh_next = hh_del->hh_next; \ } \ if (hh_del->hh_next) { \ hh_del->hh_next->hh_prev = hh_del->hh_prev; \ } /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(tbl) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ memset(_he_new_buckets, 0, \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ tbl->ideal_chain_maxlen = \ (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ tbl->nonideal_items = 0; \ for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ { \ _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ tbl->nonideal_items++; \ _he_newbkt->expand_mult = _he_newbkt->count / \ tbl->ideal_chain_maxlen; \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ _he_thh; \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ tbl->num_buckets *= 2; \ tbl->log2_num_buckets++; \ tbl->buckets = _he_new_buckets; \ tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ (tbl->ineff_expands+1) : 0; \ if (tbl->ineff_expands > 1) { \ tbl->noexpand=1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } while(0) #define HASH_CLEAR(hh,head) \ do { \ if (head) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)=NULL; \ } \ } while(0) /* obtain a count of items in the hash */ #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ void *key; /* ptr to enclosing struct's key */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; MVM_STATIC_INLINE void * HASH_ITER_FIRST_ITEM( struct UT_hash_table *ht, unsigned *bucket_tmp) { if (!ht) return NULL; while (*bucket_tmp < ht->num_buckets) { struct UT_hash_handle *hh_head = ht->buckets[*bucket_tmp].hh_head; if (hh_head) return ELMT_FROM_HH(ht, hh_head); (*bucket_tmp)++; } return NULL; } MVM_STATIC_INLINE void * HASH_ITER_NEXT_ITEM( struct UT_hash_handle *cur_handle, unsigned *bucket_tmp) { struct UT_hash_table *ht = cur_handle->tbl; if (cur_handle->hh_next) return ELMT_FROM_HH(ht, cur_handle->hh_next); (*bucket_tmp)++; while (*bucket_tmp < ht->num_buckets) { struct UT_hash_handle *hh_head = ht->buckets[*bucket_tmp].hh_head; if (hh_head) return ELMT_FROM_HH(ht, hh_head); (*bucket_tmp)++; } return NULL; } #define HASH_ITER(hh,head,el,tmp,bucket_tmp) \ for((bucket_tmp) = 0, \ (el) = HASH_ITER_FIRST_ITEM((head) ? (head)->hh.tbl : NULL, &(bucket_tmp)), \ (tmp) = ((el) ? HASH_ITER_NEXT_ITEM(&((el)->hh), &(bucket_tmp)) : NULL); \ (el); \ (el) = (tmp), \ (tmp) = ((tmp) ? HASH_ITER_NEXT_ITEM(&((tmp)->hh), &(bucket_tmp)) : NULL)) #endif /* UTHASH_H */ MoarVM-2015.11/Artistic2.txt0000644000175000017500000002130612456307241014463 0ustar jnthnjnthn The Artistic License 2.0 Copyright (c) 2000-2006, The Perl Foundation. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. Definitions "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. "You" and "your" means any person who would like to copy, distribute, or modify the Package. "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. "Source" form means the source code, documentation source, and configuration files for the Package. "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. Permission for Use and Modification Without Distribution (1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. Permissions for Redistribution of the Standard Version (2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. (3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. Distribution of Modified Versions of the Package as Source (4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under (i) the Original License or (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source (5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. (6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. Aggregating or Linking the Package (7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. (8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. Items That are Not Considered Part of a Modified Version (9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. General Provisions (10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. (11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. (12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. (13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MoarVM-2015.11/CREDITS0000644000175000017500000000330712456307241013077 0ustar jnthnjnthnHere is the partial list of people who have contributed to MoarVM. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are: name (N), email (E), web-address (W), description (D) and GitHub username (U). Thanks, The MoarVM Team PS: Yes, this looks remarkably like the Linux CREDITS format PPS: This file is encoded in UTF-8 ---------- N: Andy Dougherty D: Many portability and build improvements N: Brian Gernhardt D: Build system and IO patches N: Carl Mäsak E: cmasak@gmail.com U: masak D: Code cleanups and refactors N: Chris 'BinGOs' Williams D: BSD porting N: Dagur Valberg Johannsson D: Core fixes N: Geoff Broadwell U: japhb E: geoff@broadwell.org D: Big integer support, porting, many code and build improvements N: Gerhard R U: not_gerd D: Extension ops, bytecode validation, cgoto interpreter, RNG, build, and more U: grondilu D: Typo fix N: Jimmy Zhuo D: libuv integration, numerous core contributions and bug fixes N: Jonathan Worthington U: jnthn D: Project co-founder, lead architect, object model, GC, other bits N: Marc Chantreux D: Build tweaks N: Matthew Wilson U: diakopter D: Project co-founder, Unicode, GC, and much more N: Moritz Lenz E: moritz@faui2k3.org U: moritz D: Various build and ops improvements N: Nicholas Clark E: nick@ccl4.org D: Epic GC bug hunting and fixing N: Norbert Buchmuller D: Build fix N: Timo Paulssen U: timo E: timonator@perpetuum-immobile.de D: Various string and big integer fixes N: Tobias Leich U: FROGGS E: email@froggs.de D: Many contributions to core ops, IO, strings, and build system N: Tokuhiro Matsuno D: Documentation patch N: Will "Coke" Coleda U: coke E: will@coleda.com D: Basic Darwin build support MoarVM-2015.11/Configure.pl0000755000175000017500000006337112623370227014347 0ustar jnthnjnthn#!perl use 5.010; use strict; use warnings; use Config; use Getopt::Long; use Pod::Usage; use File::Spec; use build::setup; use build::auto; use build::probe; my $NAME = 'moar'; my $GENLIST = 'build/gen.list'; # configuration logic my $failed = 0; my %args; my %defaults; my %config; my @args = @ARGV; GetOptions(\%args, qw( help|? debug:s optimize:s instrument! os=s shell=s toolchain=s compiler=s ar=s cc=s ld=s make=s has-sha has-libuv static has-libtommath has-libatomic_ops has-dyncall has-libffi build=s host=s big-endian jit! enable-jit lua=s has-dynasm prefix=s bindir=s libdir=s mastdir=s make-install asan), 'no-optimize|nooptimize' => sub { $args{optimize} = 0 }, 'no-debug|nodebug' => sub { $args{debug} = 0 } ) or die "See --help for further information\n"; pod2usage(1) if $args{help}; print "Welcome to MoarVM!\n\n"; $config{prefix} = File::Spec->rel2abs($args{prefix} // 'install'); # don't install to cwd, as this would clash with lib/MAST/*.nqp if (-e 'README.markdown' && -e "$config{prefix}/README.markdown" && -s 'README.markdown' == -s "$config{prefix}/README.markdown") { die <&1}; if ($? >> 8 == 0) { print "OK\n" } else { softfail("git error: $msg") } } # fiddle with flags $args{optimize} = 3 if not defined $args{optimize} or $args{optimize} eq ""; $args{debug} = 3 if defined $args{debug} and $args{debug} eq ""; $args{instrument} //= 0; $args{static} //= 0; $args{'big-endian'} //= 0; $args{'has-libtommath'} //= 0; $args{'has-sha'} //= 0; $args{'has-libuv'} //= 0; $args{'has-libatomic_ops'} //= 0; $args{'has-dynasm'} //= 0; $args{'asan'} //= 0; # jit is default $args{'jit'} //= 1; # fill in C<%defaults> if (exists $args{build} || exists $args{host}) { setup_cross($args{build}, $args{host}); } else { setup_native($args{os} // $^O); } $config{name} = $NAME; $config{perl} = $^X; $config{config} = join ' ', map { / / ? "\"$_\"" : $_ } @args; $config{osname} = $^O; $config{osvers} = $Config{osvers}; $config{lua} = $args{lua} // './3rdparty/dynasm/minilua@exe@'; # set options that take priority over all others my @keys = qw( ar cc ld make ); @config{@keys} = @args{@keys}; for (keys %defaults) { next if /^-/; $config{$_} //= $defaults{$_}; } my $VERSION = '0.0-0'; # get version if (open(my $fh, '<', 'VERSION')) { $VERSION = <$fh>; close($fh); } # .git is a file and not a directory in submodule if (-e '.git' && open(my $GIT, '-|', "git describe --tags")) { $VERSION = <$GIT>; close($GIT); } chomp $VERSION; $config{version} = $VERSION; $config{versionmajor} = $VERSION =~ /^(\d+)/ ? $1 : 0; $config{versionminor} = $VERSION =~ /^\d+\.(\d+)/ ? $1 : 0; $config{versionpatch} = $VERSION =~ /^\d+\.\d+\-(\d+)/ ? $1 : 0; # misc defaults $config{exe} //= ''; $config{defs} //= []; $config{syslibs} //= []; $config{usrlibs} //= []; $config{platform} //= ''; $config{crossconf} //= ''; $config{dllimport} //= ''; $config{dllexport} //= ''; $config{dlllocal} //= ''; # assume the compiler can be used as linker frontend $config{ld} //= $config{cc}; $config{ldout} //= $config{ccout}; $config{ldsys} //= $config{ldusr}; $config{ldmiscflags} //= $config{ccmiscflags}; $config{ldoptiflags} //= $config{ccoptiflags}; $config{lddebugflags} //= $config{ccdebugflags}; $config{ldinstflags} //= $config{ccinstflags}; if ($args{'has-sha'}) { $config{shaincludedir} = '/usr/include/sha'; $defaults{-thirdparty}->{sha} = undef; unshift @{$config{usrlibs}}, 'sha'; } else { $config{shaincludedir} = '3rdparty/sha1' } # After upgrading from libuv from 0.11.18 to 0.11.29 we see very weird erros # when the old libuv files are still around. Running a `make realclean` in # case we spot an old file and the Makefile is already there. if (-e '3rdparty/libuv/src/unix/threadpool' . $defaults{obj} && -e 'Makefile') { print("\nMaking realclean after libuv version upgrade.\n" . "Outdated files were detected.\n"); system($defaults{make}, 'realclean') } # conditionally set include dirs and install rules $config{cincludes} //= ''; $config{install} //= ''; if ($args{'has-libuv'}) { $defaults{-thirdparty}->{uv} = undef; unshift @{$config{usrlibs}}, 'uv'; } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libuv/include' . ' ' . $defaults{ccinc} . '3rdparty/libuv/src'; $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/libuv\n" . "\t\$(CP) 3rdparty/libuv/include/*.h \$(DESTDIR)\$(PREFIX)/include/libuv\n"; } if ($args{'has-libatomic_ops'}) { $defaults{-thirdparty}->{lao} = undef; unshift @{$config{usrlibs}}, 'atomic_ops'; } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libatomic_ops/src'; my $lao = '$(DESTDIR)$(PREFIX)/include/libatomic_ops'; $config{install} .= "\t\$(MKPATH) $lao/atomic_ops/sysdeps/armcc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/gcc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/hpc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/ibmc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/icc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/loadstore\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/msftc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/sunc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/*.h $lao\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/*.h $lao/atomic_ops\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/*.h $lao/atomic_ops/sysdeps\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/*.h $lao/atomic_ops/sysdeps/armcc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/*.h $lao/atomic_ops/sysdeps/gcc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/*.h $lao/atomic_ops/sysdeps/hpc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/*.h $lao/atomic_ops/sysdeps/ibmc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/*.h $lao/atomic_ops/sysdeps/icc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/*.h $lao/atomic_ops/sysdeps/loadstore\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/*.h $lao/atomic_ops/sysdeps/msftc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/*.h $lao/atomic_ops/sysdeps/sunc\n"; } if ($args{'has-libtommath'}) { unshift @{$config{usrlibs}}, 'tommath'; # only this objects are needed to build, if moar is linked together with # the libtommath library from the system $defaults{-thirdparty}->{tom}->{objects} = '3rdparty/libtommath/bn_mp_get_long.o 3rdparty/libtommath/bn_mp_set_long.o'; } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libtommath'; $config{install} .= "\t\$(CP) 3rdparty/libtommath/*.h \$(DESTDIR)\$(PREFIX)/include/libtommath\n"; } if ($args{'has-dynasm'}) { $config{dynasmlua} = '-l dynasm.lua'; $config{cincludes} .= ' ' . $defaults{ccinc} . '/usr/include/luajit-2.0'; } else { $config{dynasmlua} = './3rdparty/dynasm/dynasm.lua'; $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/dynasm'; } if ($args{'has-libffi'}) { $config{nativecall_backend} = 'libffi'; unshift @{$config{usrlibs}}, 'ffi'; push @{$config{defs}}, 'HAVE_LIBFFI'; } elsif ($args{'has-dyncall'}) { unshift @{$config{usrlibs}}, 'dyncall_s', 'dyncallback_s', 'dynload_s'; $defaults{-thirdparty}->{dc} = undef; $defaults{-thirdparty}->{dcb} = undef; $defaults{-thirdparty}->{dl} = undef; $config{nativecall_backend} = 'dyncall'; } else { $config{nativecall_backend} = 'dyncall'; $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/dyncall/dynload' . ' ' . $defaults{ccinc} . '3rdparty/dyncall/dyncall' . ' ' . $defaults{ccinc} . '3rdparty/dyncall/dyncallback'; $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dynload/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dyncall/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dyncallback/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n"; } if ($args{'jit'}) { if ($Config{archname} =~ m/^x86_64|^amd64|^darwin(-thread)?(-multi)?-2level/) { $config{jit} = '$(JIT_POSIX_X64)'; } elsif ($Config{archname} =~ /^MSWin32-x64/) { $config{jit} = '$(JIT_WIN32_X64)'; } else { say "JIT isn't supported on $Config{archname} yet."; } } # fallback $config{jit} //= '$(JIT_STUB)'; # mangle library names $config{ldlibs} = join ' ', (map { sprintf $config{ldusr}, $_; } @{$config{usrlibs}}), (map { sprintf $config{ldsys}, $_; } @{$config{syslibs}}); $config{ldlibs} = ' -lasan ' . $config{ldlibs} if $args{asan}; # macro defs $config{ccdefflags} = join ' ', map { $config{ccdef} . $_ } @{$config{defs}}; $config{ccoptiflags} = sprintf $config{ccoptiflags}, $args{optimize} // 1 if $config{ccoptiflags} =~ /%s/; $config{ccdebugflags} = sprintf $config{ccdebugflags}, $args{debug} // 3 if $config{ccdebugflags} =~ /%s/; $config{ldoptiflags} = sprintf $config{ldoptiflags}, $args{optimize} // 1 if $config{ldoptiflags} =~ /%s/; $config{lddebugflags} = sprintf $config{lddebugflags}, $args{debug} // 3 if $config{lddebugflags} =~ /%s/; # generate CFLAGS my @cflags; push @cflags, $config{ccmiscflags}; push @cflags, $config{ccoptiflags} if $args{optimize}; push @cflags, $config{ccdebugflags} if $args{debug}; push @cflags, $config{ccinstflags} if $args{instrument}; push @cflags, $config{ccwarnflags}; push @cflags, $config{ccdefflags}; push @cflags, $config{ccshared} unless $args{static}; push @cflags, '-fno-omit-frame-pointer -fsanitize=address' if $args{asan}; push @cflags, $ENV{CFLAGS} if $ENV{CFLAGS}; push @cflags, $ENV{CPPFLAGS} if $ENV{CPPFLAGS}; $config{cflags} = join ' ', @cflags; # generate LDFLAGS my @ldflags = ($config{ldmiscflags}); push @ldflags, $config{ldoptiflags} if $args{optimize}; push @ldflags, $config{lddebugflags} if $args{debug}; push @ldflags, $config{ldinstflags} if $args{instrument}; push @ldflags, $config{ldrpath} unless $args{static}; push @ldflags, $^O eq 'darwin' ? '-faddress-sanitizer' : '-fsanitize=address' if $args{asan}; push @ldflags, $ENV{LDFLAGS} if $ENV{LDFLAGS}; $config{ldflags} = join ' ', @ldflags; # setup library names $config{moarlib} = sprintf $config{lib}, $NAME; $config{moardll} = sprintf $config{dll}, $NAME; # setup flags for shared builds unless ($args{static}) { $config{objflags} = '@ccdef@MVM_BUILD_SHARED @ccshared@'; $config{mainflags} = '@ccdef@MVM_SHARED'; $config{moar} = '@moardll@'; $config{impinst} = $config{sharedlib}, $config{mainlibs} = '@lddir@. ' . sprintf($config{ldimp} // $config{ldusr}, $NAME); } else { $config{objflags} = ''; $config{mainflags} = ''; $config{moar} = '@moarlib@'; $config{impinst} = $config{staticlib}; $config{mainlibs} = '@moarlib@ @thirdpartylibs@ $(LDLIBS)'; # Install static library in default location $config{libdir} = '@prefix@/lib' if ! $args{libdir}; } # some toolchains generate garbage my @auxfiles = @{ $defaults{-auxfiles} }; $config{auxclean} = @auxfiles ? '$(RM) ' . join ' ', @auxfiles : '@:'; print "OK\n"; if ($config{crossconf}) { build::auto::detect_cross(\%config, \%defaults); build::probe::static_inline_cross(\%config, \%defaults); build::probe::unaligned_access_cross(\%config, \%defaults); build::probe::ptr_size_cross(\%config, \%defaults); } else { build::auto::detect_native(\%config, \%defaults); build::probe::static_inline_native(\%config, \%defaults); build::probe::unaligned_access(\%config, \%defaults); build::probe::ptr_size_native(\%config, \%defaults); } build::probe::computed_goto(\%config, \%defaults); build::probe::pthread_yield(\%config, \%defaults); my $order = $config{be} ? 'big endian' : 'little endian'; # dump configuration print "\n", <{$_}; my @keys = ( "${_}lib", "${_}objects", "${_}rule", "${_}clean"); # don't build the library (libatomic_ops can be header-only) unless (defined $current) { @config{@keys} = ("__${_}__", '', '@:', '@:'); next; } my ($lib, $objects, $rule, $clean); $lib = sprintf "%s/$config{lib}", $current->{path}, $current->{name}; # C and C can be used to augment all build types $rule = $current->{rule}; $clean = $current->{clean}; # select type of build # dummy build - nothing to do if (exists $current->{dummy}) { $clean //= sprintf '$(RM) %s', $lib; } # use explicit object list elsif (exists $current->{objects}) { $objects = $current->{objects}; $rule //= sprintf '$(AR) $(ARFLAGS) @arout@$@ @%sobjects@', $_; $clean //= sprintf '$(RM) @%slib@ @%sobjects@', $_, $_; } # find *.c files and build objects for those elsif (exists $current->{src}) { my @sources = map { glob "$_/*.c" } @{ $current->{src} }; my $globs = join ' ', map { $_ . '/*@obj@' } @{ $current->{src} }; $objects = join ' ', map { s/\.c$/\@obj\@/; $_ } @sources; $rule //= sprintf '$(AR) $(ARFLAGS) @arout@$@ %s', $globs; $clean //= sprintf '$(RM) %s %s', $lib, $globs; } # use an explicit rule (which has already been set) elsif (exists $current->{rule}) {} # give up else { softfail("no idea how to build '$lib'"); print dots(' continuing anyway'); } @config{@keys} = ($lib, $objects // '', $rule // '@:', $clean // '@:'); push @thirdpartylibs, $config{"${_}lib"}; } $config{thirdpartylibs} = join ' ', @thirdpartylibs; my $thirdpartylibs = join "\n" . ' ' x 12, sort @thirdpartylibs; print "OK\n"; write_backend_config(); # dump 3rdparty libs we need to build print "\n", <) { s/^\s+|\s+$//; next if /^#|^$/; $target = $_, next unless defined $target; generate($target, $_); $target = undef; } close $listfile; # configuration completed if ($args{'enable-jit'}) { print("\nThe --enable-jit flag is obsolete, as jit is enabled by default.\n"); print("You can use --no-jit to build without jit."); } print "\n", $failed ? <{-compiler} }; set_defaults($toolchain, $compiler); } if (exists $args{compiler}) { $compiler = $args{compiler}; hardfail("unsupported compiler '$compiler'") unless exists $::COMPILERS{$compiler}; $compiler = $::COMPILERS{$compiler}; unless (exists $args{toolchain}) { $toolchain = $::TOOLCHAINS{ $compiler->{-toolchain} }; set_defaults($toolchain); } set_defaults($compiler); } my $order = $Config{byteorder}; if ($order eq '1234' || $order eq '12345678') { $defaults{be} = 0; } elsif ($order eq '4321' || $order eq '87654321') { $defaults{be} = 1; } else { ::hardfail("unsupported byte order $order"); } } # fill in defaults for cross builds sub setup_cross { my ($build, $host) = @_; print dots("Configuring cross build environment"); hardfail("both --build and --host need to be specified") unless defined $build && defined $host; my $cc = "$host-gcc"; my $ar = "$host-ar"; my $crossconf = "--build=$build --host=$host"; for (\$build, \$host) { if ($$_ =~ /-(\w+)-\w+$/) { $$_ = $1; if (!exists $::SYSTEMS{$1}) { softfail("unknown OS '$1'"); print dots(" assuming GNU userland"); $$_ = 'posix'; } } else { hardfail("failed to parse triple '$$_'") } } $defaults{os} = $host; $build = $::SYSTEMS{$build}; $host = $::SYSTEMS{$host}; my $shell = $::SHELLS{ $build->[0] }; my $toolchain = $::TOOLCHAINS{gnu}; my $compiler = $::COMPILERS{gcc}; my $overrides = $host->[3]; set_defaults($shell, $toolchain, $compiler, $overrides); $defaults{cc} = $cc; $defaults{ar} = $ar; $defaults{crossconf} = $crossconf; $defaults{be} = $args{'big-endian'}; } # sets C<%defaults> from C<@_> sub set_defaults { # getting the correct 3rdparty information is somewhat tricky my $thirdparty = $defaults{-thirdparty} // \%::THIRDPARTY; @defaults{ keys %$_ } = values %$_ for @_; $defaults{-thirdparty} = { %$thirdparty, map{ %{ $_->{-thirdparty} // {} } } @_ }; } # fill in config values sub configure { my ($template) = @_; while ($template =~ /@(\w+)@/) { my $key = $1; unless (exists $config{$key}) { return (undef, "unknown configuration key '$key'\n known keys: " . join(', ', sort keys %config)); } $template =~ s/@\Q$key\E@/$config{$key}/; } return $template; } # generate files sub generate { my ($dest, $src) = @_; print dots("Generating $dest"); open my $srcfile, '<', $src or hardfail($!); open my $destfile, '>', $dest or hardfail($!); while (<$srcfile>) { my ($line, $error) = configure($_); hardfail($error) unless defined $line; if ($config{sh} eq 'cmd' && $dest =~ /Makefile|config\.c/) { # In-between slashes in makefiles need to be backslashes on Windows. # Double backslashes in config.c, beause these are in qq-strings. my $bs = $dest =~ /Makefile/ ? '\\' : '\\\\'; $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\/(\w|\.|\*)/$1$bs$2/g; $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\\(\w|\.|\*)/$1$bs$2/g if $bs eq '\\\\'; # gmake doesn't like \* $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\\\*/$1\\\\\*/g if $config{make} eq 'gmake'; } print $destfile $line; } close $srcfile; close $destfile; print "OK\n"; } # some dots sub dots { my $message = shift; my $length = shift || 55; return "$message ". '.' x ($length - length $message) . ' '; } # fail but continue sub softfail { my ($msg) = @_; $failed = 1; print "FAIL\n"; warn " $msg\n"; } # fail and don't continue sub hardfail { softfail(@_); die "\nConfiguration PANIC. A Makefile could not be generated.\n"; } sub write_backend_config { $config{backendconfig} = ''; for my $k (sort keys %config) { next if $k eq 'backendconfig'; my $v = $config{$k}; if (ref($v) eq 'ARRAY') { my $i = 0; for (@$v) { $config{backendconfig} .= qq/ add_entry(tc, config, "$k\[$i]", "$_");\n/; $i++; } } elsif (ref($v) eq 'HASH') { # should not be there } else { $v //= ''; $v =~ s/"/\\"/g; $v =~ s/\n/\\\n/g; $config{backendconfig} .= qq/ add_entry(tc, config, "$k", "$v");\n/; } } } __END__ =head1 SYNOPSIS ./Configure.pl -?|--help ./Configure.pl [--os ] [--shell ] [--toolchain ] [--compiler ] [--ar ] [--cc ] [--ld ] [--make ] [--debug] [--optimize] [--instrument] [--static] [--prefix] [--has-libtommath] [--has-sha] [--has-libuv] [--has-libatomic_ops] [--has-dynasm] [--lua ] [--asan] [--no-jit] ./Configure.pl --build --host [--ar ] [--cc ] [--ld ] [--make ] [--debug] [--optimize] [--instrument] [--static] [--big-endian] [--prefix] [--lua ] [--make-install] =head1 OPTIONS =over 4 =item -? =item --help Show this help information. =item --debug =item --no-debug Toggle debugging flags during compile and link. Debugging is off by default. =item --optimize =item --no-optimize Toggle optimization and debug flags during compile and link. If nothing is specified the default is to optimize. =item --instrument =item --no-instrument Toggle extra instrumentation flags during compile and link; for example, turns on Address Sanitizer when compiling with C. Defaults to off. =item --os Set the operating system name which you are compiling to. Currently supported operating systems are C, C, C, C, C, C, C, C, C and C. If not explicitly set, the option will be provided by the Perl runtime. In case of unknown operating systems, a POSIX userland is assumed. =item --shell Currently supported shells are C and C. =item --toolchain Currently supported toolchains are C, C, C and C. =item --compiler Currently supported compilers are C, C and C. =item --ar Explicitly set the archiver without affecting other configuration options. =item --cc Explicitly set the compiler without affecting other configuration options. =item --asan Build with AddressSanitizer (ASAN) support. Requires clang and LLVM 3.1 or newer. See L You can use C to configure ASAN at runtime; for example, to disable memory leak checking (which can make Rakudo fail to build), you can set the following: export ASAN_OPTIONS=detect_leaks=0 A full list of options is displayed if you set C to C. =item --ld Explicitly set the linker without affecting other configuration options. =item --make Explicitly set the make tool without affecting other configuration options. =item --static Build MoarVM as a static library instead of a shared one. =item --build --host Set up cross-compilation. =item --big-endian Set byte order of host system in case of cross compilation. With native builds, the byte order is auto-detected. =item --prefix Install files in subdirectory /bin, /lib and /include of the supplied path. The default prefix is "install" if this option is not passed. =item --bindir Install executable files in the supplied path. The default is "@prefix@/bin" if this option is not passed. =item --libdir Install library in the supplied path. The default is "@prefix@/lib" for POSIX toolchain and "@bindir@" for MSVC if this option is not passed. =item --mastdir Install NQP libraries in the supplied path. The default is "@prefix@/share/nqp/lib/MAST" if this option is not passed. =item --make-install Build and install MoarVM in addition to configuring it. =item --has-libtommath =item --has-sha =item --has-libuv =item --has-libatomic_ops =item --has-dynasm =item --has-dyncall =item --has-libffi =item --no-jit Disable JIT compiler, which is enabled by default to JIT-compile hot frames. =item --lua=path/to/lua/executable Path to a lua executable. (Used during the build when JIT is enabled). =back MoarVM-2015.11/LICENSE0000644000175000017500000000203012520766031013052 0ustar jnthnjnthnSoftware Copyright and License This software is copyright 2012-2015 by Jonathan Worthington and others. The Artistic License 2.0 (see Artistic2.txt) applies to this project, but some portions are redistributed under other licenses and are marked as such. Unofficial summary of the intended application of the Artistic License 2.0: - All the source code is available for anyone to read and to submit patches. - You may "take" and re-use large portions of the source code at will. - There is a "Standard Version" of this software to protect its name and namespace as it's used in redistributions by package maintainers. - "Downstream" package maintainers allow us to use their bug fixes/patches. - You may bundle it with software you sell, or you may link/embed it. - You may fork and release modified builds if you thoroughly rename it. -- 3rdparty/ license information - dynasm MIT - dyncall MIT - libtommath Public Domain - libuv MIT,BSD,ISC - msinttypes MIT - sha1 Public Domain - tinymt MIT - uthash.h MIT MoarVM-2015.11/README.markdown0000644000175000017500000000654612516136714014572 0ustar jnthnjnthn# MoarVM MoarVM (short for Metamodel On A Runtime Virtual Machine) is a runtime built for the 6model object system. It is primarily aimed at running NQP and Rakudo Perl 6, but should be able to serve as a backend for any compilers built using the NQP compiler toolchain. ## Build It [![Build Status](https://travis-ci.org/MoarVM/MoarVM.svg?branch=master)](https://travis-ci.org/MoarVM/MoarVM) Building the VM itself takes just: perl Configure.pl make (Or `nmake` on Windows). Currently it is known to build on Windows with MSVC, with `gcc` and `clang` on Linux & MacOS X. We're expanding this with time. Type `perl Configure.pl --help` to see the configure-time options, as well as some descriptions of the make-time options/targets. ## Building an NQP with MoarVM After installing MoarVM, you can clone the NQP repository or grab a source tarball and use the Configure.pl script in it like so: perl Configure.pl --backend=moar --prefix=where_your_moarvm_install_lives Alternatively, the same Configure.pl script in NQP is able to clone, build and install a copy of MoarVM on its own if you supply the `--gen-moar` flag. ## Building a Rakudo with MoarVM When pointing the `Configure.pl` script in rakudo's repository at a `--prefix` that has an `nqp-m` installed in it, it will automatically detect and configure the MoarVM backend. Alternatively, `--backend=moar,jvm` can be used to force it to build the MoarVM and JVM backends, for example. Just like in the NQP `Configure.pl` script, you have the option to supply a `--gen-moar` flag that will do all the work for you, including creating an `nqp-m`. ## Status MoarVM is currently in development. It can run all of the NQP test suite, all of the Rakudo sanity tests, and passes more spectests than any other Rakudo Perl 6 backend (though some backends pass tests that it does not). Unlike the JVM backend of NQP, the MoarVM repo is not currently planned to be integrated into the main NQP source repo http://github.com/perl6/nqp but instead can be pulled in by `Configure.pl --gen-moar` configure script in the NQP repo, same as it can `--gen-parrot`. ## Feature overview Some key features provided by MoarVM include: * Meta-object programming, using the 6model design * Precise, generational, and parallel GC * Unicode support (Unicode database lookup, encodings, normalization) * First-class code objects, lexical variables and closures * Exceptions * Continuations * Bounded serialization * Code generation from MAST (MoarVM AST) * Runtime loading of code * Big integers * A range of IO and process support, including asynchronous sockets, signals, timers, and processes * Native calling and native pointer manipulation * Threads, mutexes, condition variables, semaphores, and blocking queues * Bytecode specialization by type, and numerous optimizations (including resolution of method calls and multiple dispatch, dead code elimination, inlining, and on stack replacement) * JIT compilation * Instrumentation-based profiling of call frames and allocations ## Contributing Contributions by pull request are accepted. Commit bits are given to those who contribute quality work. If you are interested in contributing, drop by the `#moarvm` channel on freenode.org, or email jnthn@jnthn.net if you're averse to IRC. See the LICENSE file in the root directory for information on the license of the source code in the MoarVM repository. MoarVM-2015.11/VERSION0000644000175000017500000000001012623370227013113 0ustar jnthnjnthn2015.11 MoarVM-2015.11/build/Makefile.in0000644000175000017500000004723112623370227015227 0ustar jnthnjnthnCC = @cc@ LD = @ld@ AR = @ar@ MAKE = @make@ @mkflags@ PERL = @perl@ RM = @rm@ CAT = @cat@ SHELL = @sh@ LUA = @lua@ CP = $(PERL) -MExtUtils::Command -e cp MKPATH = $(PERL) -MExtUtils::Command -e mkpath CHMOD = $(PERL) -MExtUtils::Command -e chmod RM_RF = $(PERL) -MExtUtils::Command -e rm_rf DYNASM = $(LUA) @dynasmlua@ CONFIG = @config@ ADDCONFIG = TRACING = 0 CGOTO = @cancgoto@ NOISY = 0 MSG = @: CMD = NOOUT = NOERR = @mknoisy@ PREFIX = @prefix@ BINDIR = @bindir@ LIBDIR = @libdir@ MASTDIR = @mastdir@ PKGCONFIGDIR = @prefix@/share/pkgconfig CFLAGS = @cflags@ @ccdef@MVM_TRACING=$(TRACING) @ccdef@MVM_CGOTO=$(CGOTO) CINCLUDES = @cincludes@ \ @ccinc@@shaincludedir@ \ @ccinc@3rdparty/tinymt \ @ccinc@3rdparty \ @ccinc@src LDFLAGS = @ldflags@ LDLIBS = @ldlibs@ MAIN_LIBS = @mainlibs@ DLL_LIBS = @thirdpartylibs@ $(LDLIBS) ARFLAGS = @arflags@ PLATFORM_WIN32 = src/platform/win32/mmap@obj@ \ src/platform/win32/time@obj@ \ src/platform/win32/io@obj@ \ src/platform/win32/sys@obj@ PLATFORM_POSIX = src/platform/posix/mmap@obj@ \ src/platform/posix/time@obj@ \ src/platform/posix/sys@obj@ DASM_FLAGS_WIN32 = -D WIN32=1 DASM_FLAGS_POSIX = -D POSIX=1 JIT_WIN32_X64 = src/jit/emit_win32_x64@obj@ JIT_POSIX_X64 = src/jit/emit_posix_x64@obj@ JIT_STUB = src/jit/stub@obj@ MAIN_OBJECTS = src/main@obj@ OBJECTS = src/core/callsite@obj@ \ src/core/args@obj@ \ src/core/exceptions@obj@ \ src/core/interp@obj@ \ src/core/threadcontext@obj@ \ src/core/compunit@obj@ \ src/core/bytecode@obj@ \ src/core/frame@obj@ \ src/core/validation@obj@ \ src/core/bytecodedump@obj@ \ src/core/threads@obj@ \ src/core/ops@obj@ \ src/core/hll@obj@ \ src/core/loadbytecode@obj@ \ src/math/num@obj@ \ src/core/coerce@obj@ \ src/core/dll@obj@ \ src/core/ext@obj@ \ src/core/nativecall@obj@ \ src/core/nativecall_@nativecall_backend@@obj@ \ src/core/continuation@obj@ \ src/core/intcache@obj@ \ src/core/fixedsizealloc@obj@ \ src/gen/config@obj@ \ src/gc/orchestrate@obj@ \ src/gc/allocation@obj@ \ src/gc/worklist@obj@ \ src/gc/roots@obj@ \ src/gc/collect@obj@ \ src/gc/gen2@obj@ \ src/gc/wb@obj@ \ src/gc/objectid@obj@ \ src/gc/finalize@obj@ \ src/io/io@obj@ \ src/io/eventloop@obj@ \ src/io/syncfile@obj@ \ src/io/syncstream@obj@ \ src/io/syncpipe@obj@ \ src/io/syncsocket@obj@ \ src/io/fileops@obj@ \ src/io/dirops@obj@ \ src/io/procops@obj@ \ src/io/timers@obj@ \ src/io/filewatchers@obj@ \ src/io/signals@obj@ \ src/io/asyncsocket@obj@ \ src/6model/reprs@obj@ \ src/6model/reprconv@obj@ \ src/6model/containers@obj@ \ src/6model/parametric@obj@ \ src/6model/reprs/MVMString@obj@ \ src/6model/reprs/MVMArray@obj@ \ src/6model/reprs/MVMHash@obj@ \ src/6model/reprs/MVMCFunction@obj@ \ src/6model/reprs/KnowHOWREPR@obj@ \ src/6model/reprs/KnowHOWAttributeREPR@obj@ \ src/6model/reprs/P6str@obj@ \ src/6model/reprs/P6opaque@obj@ \ src/6model/reprs/MVMCode@obj@ \ src/6model/reprs/MVMOSHandle@obj@ \ src/6model/reprs/MVMCompUnit@obj@ \ src/6model/reprs/MVMStaticFrame@obj@ \ src/6model/reprs/P6int@obj@ \ src/6model/reprs/P6num@obj@ \ src/6model/reprs/Uninstantiable@obj@ \ src/6model/reprs/HashAttrStore@obj@ \ src/6model/reprs/MVMThread@obj@ \ src/6model/reprs/MVMIter@obj@ \ src/6model/reprs/MVMContext@obj@ \ src/6model/reprs/SCRef@obj@ \ src/6model/reprs/Lexotic@obj@ \ src/6model/reprs/MVMCallCapture@obj@ \ src/6model/reprs/P6bigint@obj@ \ src/6model/reprs/NFA@obj@ \ src/6model/reprs/MVMException@obj@ \ src/6model/reprs/MVMDLLSym@obj@ \ src/6model/reprs/MVMMultiCache@obj@ \ src/6model/reprs/MVMContinuation@obj@ \ src/6model/reprs/NativeCall@obj@ \ src/6model/reprs/CPointer@obj@ \ src/6model/reprs/CStr@obj@ \ src/6model/reprs/CArray@obj@ \ src/6model/reprs/CStruct@obj@ \ src/6model/reprs/CUnion@obj@ \ src/6model/reprs/ReentrantMutex@obj@ \ src/6model/reprs/ConditionVariable@obj@ \ src/6model/reprs/Semaphore@obj@ \ src/6model/reprs/ConcBlockingQueue@obj@ \ src/6model/reprs/MVMAsyncTask@obj@ \ src/6model/reprs/MVMNull@obj@ \ src/6model/reprs/CPPStruct@obj@ \ src/6model/reprs/NativeRef@obj@ \ src/6model/reprs/MultiDimArray@obj@ \ src/6model/6model@obj@ \ src/6model/bootstrap@obj@ \ src/6model/sc@obj@ \ src/6model/serialization@obj@ \ src/mast/compiler@obj@ \ src/mast/driver@obj@ \ src/spesh/dump@obj@ \ src/spesh/graph@obj@ \ src/spesh/codegen@obj@ \ src/spesh/candidate@obj@ \ src/spesh/manipulate@obj@ \ src/spesh/args@obj@ \ src/spesh/facts@obj@ \ src/spesh/optimize@obj@ \ src/spesh/deopt@obj@ \ src/spesh/log@obj@ \ src/spesh/threshold@obj@ \ src/spesh/inline@obj@ \ src/spesh/osr@obj@ \ src/jit/graph@obj@ \ src/jit/compile@obj@ \ src/jit/log@obj@ \ src/strings/decode_stream@obj@ \ src/strings/ascii@obj@ \ src/strings/utf8@obj@ \ src/strings/utf8_c8@obj@ \ src/strings/nfg@obj@ \ src/strings/ops@obj@ \ src/strings/unicode@obj@ \ src/strings/normalize@obj@ \ src/strings/latin1@obj@ \ src/strings/utf16@obj@ \ src/strings/windows1252@obj@ \ src/math/bigintops@obj@ \ src/profiler/instrument@obj@ \ src/profiler/log@obj@ \ src/profiler/profile@obj@ \ src/instrument/crossthreadwrite@obj@ \ src/moar@obj@ \ @platform@ \ @jit@ HEADERS = src/moar.h \ src/types.h \ src/bithacks.h \ src/6model/6model.h \ src/core/instance.h \ src/core/threadcontext.h \ src/core/callsite.h \ src/core/args.h \ src/core/exceptions.h \ src/core/interp.h \ src/core/alloc.h \ src/core/frame.h \ src/core/compunit.h \ src/core/bytecode.h \ src/core/ops.h \ src/core/validation.h \ src/core/bytecodedump.h \ src/core/threads.h \ src/core/hll.h \ src/core/loadbytecode.h \ src/math/num.h \ src/core/coerce.h \ src/core/dll.h \ src/core/ext.h \ src/core/nativecall.h \ src/core/continuation.h \ src/core/intcache.h \ src/core/fixedsizealloc.h \ src/io/io.h \ src/io/eventloop.h \ src/io/syncfile.h \ src/io/syncstream.h \ src/io/syncpipe.h \ src/io/syncsocket.h \ src/io/fileops.h \ src/io/dirops.h \ src/io/procops.h \ src/io/timers.h \ src/io/filewatchers.h \ src/io/signals.h \ src/io/asyncsocket.h \ src/gc/orchestrate.h \ src/gc/allocation.h \ src/gc/worklist.h \ src/gc/collect.h \ src/gc/roots.h \ src/gc/gen2.h \ src/gc/wb.h \ src/gc/objectid.h \ src/gc/finalize.h \ src/6model/reprs.h \ src/6model/reprconv.h \ src/6model/bootstrap.h \ src/6model/serialization.h \ src/6model/containers.h \ src/6model/parametric.h \ src/6model/reprs/MVMString.h \ src/6model/reprs/MVMArray.h \ src/6model/reprs/MVMHash.h \ src/6model/reprs/MVMCFunction.h \ src/6model/reprs/KnowHOWREPR.h \ src/6model/reprs/KnowHOWAttributeREPR.h \ src/6model/reprs/P6opaque.h \ src/6model/reprs/MVMCode.h \ src/6model/reprs/P6str.h \ src/6model/reprs/MVMOSHandle.h \ src/6model/reprs/P6int.h \ src/6model/reprs/P6num.h \ src/6model/reprs/Uninstantiable.h \ src/6model/reprs/HashAttrStore.h \ src/6model/reprs/MVMThread.h \ src/6model/reprs/MVMIter.h \ src/6model/reprs/MVMContext.h \ src/6model/reprs/SCRef.h \ src/6model/reprs/Lexotic.h \ src/6model/reprs/MVMCallCapture.h \ src/6model/reprs/P6bigint.h \ src/6model/reprs/NFA.h \ src/6model/reprs/MVMException.h \ src/6model/reprs/MVMCompUnit.h \ src/6model/reprs/MVMDLLSym.h \ src/6model/reprs/MVMMultiCache.h \ src/6model/reprs/MVMContinuation.h \ src/6model/reprs/NativeCall.h \ src/6model/reprs/CPointer.h \ src/6model/reprs/CStr.h \ src/6model/reprs/CArray.h \ src/6model/reprs/CStruct.h \ src/6model/reprs/CUnion.h \ src/6model/reprs/ReentrantMutex.h \ src/6model/reprs/ConditionVariable.h \ src/6model/reprs/Semaphore.h \ src/6model/reprs/ConcBlockingQueue.h \ src/6model/reprs/MVMAsyncTask.h \ src/6model/reprs/MVMNull.h \ src/6model/reprs/CPPStruct.h \ src/6model/reprs/NativeRef.h \ src/6model/reprs/MultiDimArray.h \ src/6model/sc.h \ src/mast/compiler.h \ src/mast/driver.h \ src/mast/nodes.h \ src/spesh/dump.h \ src/spesh/graph.h \ src/spesh/codegen.h \ src/spesh/candidate.h \ src/spesh/manipulate.h \ src/spesh/args.h \ src/spesh/facts.h \ src/spesh/optimize.h \ src/spesh/deopt.h \ src/spesh/log.h \ src/spesh/threshold.h \ src/spesh/inline.h \ src/spesh/osr.h \ src/strings/unicode_gen.h \ src/strings/normalize.h \ src/strings/decode_stream.h \ src/strings/ascii.h \ src/strings/utf8.h \ src/strings/utf8_c8.h \ src/strings/iter.h \ src/strings/nfg.h \ src/strings/ops.h \ src/strings/unicode.h \ src/strings/latin1.h \ src/strings/utf16.h \ src/strings/windows1252.h \ src/math/bigintops.h \ src/profiler/instrument.h \ src/profiler/log.h \ src/profiler/profile.h \ src/platform/mmap.h \ src/platform/time.h \ src/platform/threads.h \ src/platform/io.h \ src/platform/sys.h \ src/platform/setjmp.h \ src/jit/graph.h \ src/jit/compile.h \ src/jit/log.h \ src/instrument/crossthreadwrite.h \ src/gen/config.h \ 3rdparty/uthash.h UV_UNIX = 3rdparty/libuv/src/fs-poll@obj@ \ 3rdparty/libuv/src/inet@obj@ \ 3rdparty/libuv/src/uv-common@obj@ \ 3rdparty/libuv/src/version@obj@ \ 3rdparty/libuv/src/unix/async@obj@ \ 3rdparty/libuv/src/unix/core@obj@ \ 3rdparty/libuv/src/unix/dl@obj@ \ 3rdparty/libuv/src/unix/fs@obj@ \ 3rdparty/libuv/src/unix/getaddrinfo@obj@ \ 3rdparty/libuv/src/unix/loop-watcher@obj@ \ 3rdparty/libuv/src/unix/loop@obj@ \ 3rdparty/libuv/src/unix/pipe@obj@ \ 3rdparty/libuv/src/unix/poll@obj@ \ 3rdparty/libuv/src/unix/process@obj@ \ 3rdparty/libuv/src/unix/signal@obj@ \ 3rdparty/libuv/src/unix/stream@obj@ \ 3rdparty/libuv/src/unix/tcp@obj@ \ 3rdparty/libuv/src/unix/thread@obj@ \ 3rdparty/libuv/src/threadpool@obj@ \ 3rdparty/libuv/src/unix/timer@obj@ \ 3rdparty/libuv/src/unix/tty@obj@ \ 3rdparty/libuv/src/unix/udp@obj@ UV_LINUX = 3rdparty/libuv/src/unix/linux-core@obj@ \ 3rdparty/libuv/src/unix/linux-inotify@obj@ \ 3rdparty/libuv/src/unix/linux-syscalls@obj@ \ 3rdparty/libuv/src/unix/proctitle@obj@ \ $(UV_UNIX) UV_OPENBSD = 3rdparty/libuv/src/unix/openbsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ $(UV_UNIX) UV_NETBSD = 3rdparty/libuv/src/unix/netbsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ $(UV_UNIX) UV_FREEBSD = 3rdparty/libuv/src/unix/freebsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ $(UV_UNIX) UV_DARWIN = 3rdparty/libuv/src/unix/darwin@obj@ \ 3rdparty/libuv/src/unix/darwin-proctitle@obj@ \ 3rdparty/libuv/src/unix/fsevents@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ 3rdparty/libuv/src/unix/proctitle@obj@ \ $(UV_UNIX) UV_SOLARIS = 3rdparty/libuv/src/unix/sunos@obj@ \ $(UV_UNIX) UV_OBJECTS = @uvobjects@ TOM_OBJECTS = @tomobjects@ THIRDPARTY = @thirdpartylibs@ .SUFFIXES: .c @obj@ .i @asm@ all: moar@exe@ pkgconfig/moar.pc install: all $(MKPATH) $(DESTDIR)$(BINDIR) $(CP) moar@exe@ $(DESTDIR)$(BINDIR) $(CHMOD) 755 $(DESTDIR)$(BINDIR)/moar@exe@ $(MKPATH) $(DESTDIR)$(LIBDIR) $(CP) @moar@ @impinst@ $(DESTDIR)$(LIBDIR) $(MKPATH) $(DESTDIR)$(MASTDIR) $(CP) lib/MAST/Nodes.nqp $(DESTDIR)$(MASTDIR) $(CP) lib/MAST/Ops.nqp $(DESTDIR)$(MASTDIR) $(MKPATH) $(DESTDIR)$(PKGCONFIGDIR) $(CP) pkgconfig/moar.pc $(DESTDIR)$(PKGCONFIGDIR) $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar $(CP) src/gen/config.h $(DESTDIR)$(PREFIX)/include/moar $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/6model/reprs $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/core $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/gc $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/gen $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/io $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/mast $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/math $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/platform $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/profiler $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/spesh $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/strings $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/jit $(MKPATH) $(DESTDIR)$(PREFIX)/include/moar/instrument $(CP) 3rdparty/*.h $(DESTDIR)$(PREFIX)/include/moar $(CP) src/*.h $(DESTDIR)$(PREFIX)/include/moar $(CP) src/6model/*.h $(DESTDIR)$(PREFIX)/include/moar/6model $(CP) src/6model/reprs/*.h $(DESTDIR)$(PREFIX)/include/moar/6model/reprs $(CP) src/core/*.h $(DESTDIR)$(PREFIX)/include/moar/core $(CP) src/gc/*.h $(DESTDIR)$(PREFIX)/include/moar/gc $(CP) src/gen/*.h $(DESTDIR)$(PREFIX)/include/moar/gen $(CP) src/io/*.h $(DESTDIR)$(PREFIX)/include/moar/io $(CP) src/mast/*.h $(DESTDIR)$(PREFIX)/include/moar/mast $(CP) src/math/*.h $(DESTDIR)$(PREFIX)/include/moar/math $(CP) src/platform/*.h $(DESTDIR)$(PREFIX)/include/moar/platform $(CP) src/profiler/*.h $(DESTDIR)$(PREFIX)/include/moar/profiler $(CP) src/spesh/*.h $(DESTDIR)$(PREFIX)/include/moar/spesh $(CP) src/strings/*.h $(DESTDIR)$(PREFIX)/include/moar/strings $(CP) src/jit/*.h $(DESTDIR)$(PREFIX)/include/moar/jit $(CP) src/instrument/*.h $(DESTDIR)$(PREFIX)/include/moar/instrument $(MKPATH) $(DESTDIR)$(PREFIX)/include/libuv $(MKPATH) $(DESTDIR)$(PREFIX)/include/libtommath $(MKPATH) $(DESTDIR)$(PREFIX)/include/msinttypes $(MKPATH) $(DESTDIR)$(PREFIX)/include/sha1 $(MKPATH) $(DESTDIR)$(PREFIX)/include/tinymt $(CP) 3rdparty/libuv/include/*.h $(DESTDIR)$(PREFIX)/include/libuv $(CP) 3rdparty/msinttypes/*.h $(DESTDIR)$(PREFIX)/include/msinttypes $(CP) 3rdparty/sha1/*.h $(DESTDIR)$(PREFIX)/include/sha1 $(CP) 3rdparty/tinymt/*.h $(DESTDIR)$(PREFIX)/include/tinymt @install@ lib: @moar@ help: @$(CAT) build/help.txt test: @$(CAT) build/test.txt reconfig: realclean $(MSG) reconfiguring with [ $(CONFIG) $(ADDCONFIG) ] $(CMD)$(PERL) Configure.pl $(CONFIG) $(ADDCONFIG) clangcheck gcccheck: @$(MAKE) --no-print-directory -f tools/check.mk $@ moar@exe@: $(MAIN_OBJECTS) @moar@ $(MSG) linking $@ $(CMD)$(LD) @ldout@$@ $(LDFLAGS) $(MAIN_OBJECTS) $(MAIN_LIBS) @moarlib@: $(OBJECTS) $(THIRDPARTY) $(MSG) linking $@ $(CMD)$(AR) $(ARFLAGS) @arout@$@ $(OBJECTS) $(NOOUT) @moardll@: $(OBJECTS) $(THIRDPARTY) $(MSG) linking $@ $(CMD)$(LD) @ldout@$@ $(LDFLAGS) @ldshared@ @moarshared@ $(OBJECTS) $(DLL_LIBS) libuv: @uvlib@ $(MAIN_OBJECTS) $(OBJECTS): $(HEADERS) tracing: $(MSG) enable tracing dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=1 CGOTO=0 NOISY="$(NOISY)" cgoto: $(MSG) enable computed-goto dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=0 CGOTO=1 NOISY="$(NOISY)" switch no-tracing no-cgoto: $(MSG) enable regular dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=0 CGOTO=0 NOISY="$(NOISY)" # objflags can include -DMVM_BUILD_SHARED which affects pre-processed source .c.i: $(MSG) pre-processing $@ $(CMD)$(CC) @cppswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @cppout@$@ $*.c .c@asm@: $(MSG) generating assembler for $@ $(CMD)$(CC) @asmswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @asmout@$@ $*.c .c@obj@: $(MSG) compiling $@ $(CMD)$(CC) @ccswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @ccout@$@ $*.c src/main@obj@: src/main.c $(MSG) compiling $@ $(CMD)$(CC) @ccswitch@ $(CFLAGS) @mainflags@ $(CINCLUDES) @ccout@$@ $*.c src/strings/unicode.c: src/strings/unicode_db.c src/strings/unicode_ops.c $(MSG) generating $@ $(CMD)$(CAT) src/strings/unicode_db.c src/strings/unicode_ops.c > $@ $(NOERR) 3rdparty/dynasm/minilua@exe@: 3rdparty/dynasm/minilua.c $(CC) $(CFLAGS) $(LDFLAGS) 3rdparty/dynasm/minilua.c -o $@ $(LDLIBS) src/jit/emit_posix_x64.c: $(LUA) src/jit/emit_x64.dasc $(DYNASM) $(DASM_FLAGS_POSIX) -o $@ src/jit/emit_x64.dasc src/jit/emit_win32_x64.c: $(LUA) src/jit/emit_x64.dasc $(DYNASM) $(DASM_FLAGS_WIN32) -o $@ src/jit/emit_x64.dasc dasm_all: src/jit/emit_win32_x64.c src/jit/emit_posix_x64.c @uvlib@: $(UV_OBJECTS) $(MSG) linking $@ $(CMD)@uvrule@ $(NOOUT) @laolib@: $(MSG) linking $@ $(CMD)@laorule@ $(NOOUT) @tomlib@: $(TOM_OBJECTS) $(MSG) linking $@ $(CMD)@tomrule@ $(NOOUT) @shalib@: @shaobjects@ $(MSG) linking $@ $(CMD)@sharule@ $(NOOUT) @mtlib@: @mtobjects@ $(MSG) linking $@ $(CMD)@mtrule@ $(NOOUT) @dclib@: $(MSG) building dyncall... $(CMD)@dcrule@ $(NOOUT) $(MSG) done. @dcblib@ @dllib@: @dclib@ pkgconfig/moar.pc: build/mk-moar-pc.pl $(PERL) build/mk-moar-pc.pl $@ clean: $(MSG) remove build files -$(CMD)$(RM) $(MAIN_OBJECTS) $(OBJECTS) $(NOOUT) $(NOERR) realclean: clean $(MSG) remove auxiliary files -$(CMD)@auxclean@ $(NOOUT) $(NOERR) $(MSG) remove 3rdparty files -$(CMD)@uvclean@ $(NOOUT) $(NOERR) -$(CMD)@laoclean@ $(NOOUT) $(NOERR) -$(CMD)@tomclean@ $(NOOUT) $(NOERR) -$(CMD)@shaclean@ $(NOOUT) $(NOERR) -$(CMD)@mtclean@ $(NOOUT) $(NOERR) -$(CMD)@dcclean@ $(NOOUT) $(NOERR) distclean: realclean $(MSG) remove executable and libraries -$(CMD)$(RM) moar@exe@ @moarlib@ @moardll@ $(NOOUT) $(NOERR) $(MSG) remove configuration and generated files -$(CMD)$(RM) Makefile src/gen/config.h src/gen/config.c src/strings/unicode.c \ tools/check.mk 3rdparty/libatomic_ops/config.log 3rdparty/libatomic_ops/config.status $(NOOUT) $(NOERR) -$(CMD)$(RM_RF) src/jit/emit_posix_x64.c build/mk-moar-pc.pl pkgconfig/ $(NOOUT) $(NOERR) release: [ -n "$(VERSION)" ] || ( echo "\nTry 'make release VERSION=yyyy.mm'\n\n"; exit 1 ) ./tools/release.sh $(VERSION) sandwich: @echo What? Make it yourself. MoarVM-2015.11/build/README.md0000644000175000017500000000024312456307241014431 0ustar jnthnjnthn## Configure- and Build-time Tools and Templates These tools and templates abstract away platform and target differences when it comes to building the software. MoarVM-2015.11/build/auto.pm0000755000175000017500000000266312623370227014473 0ustar jnthnjnthnpackage build::auto; use strict; use warnings; sub detect_native { my ($config, $defaults) = @_; # detect x64 on Windows so we can build the correct dyncall version if ($config->{cc} eq 'cl') { print ::dots(' auto-detecting x64 toolchain'); my $msg = `cl 2>&1`; if (defined $msg) { if ($msg =~ /x64/) { print "YES\n"; $defaults->{-thirdparty}->{dc}->{rule} = 'cd 3rdparty/dyncall && configure.bat /target-x64 && $(MAKE) -f Nmakefile'; } else { print "NO\n" } } else { ::softfail("could not run 'cl'"); print ::dots(' assuming x86'), "OK\n"; } } elsif ($defaults->{os} eq 'mingw32' && $defaults->{-toolchain} eq 'gnu') { print ::dots(' auto-detecting x64 toolchain'); my $cc = $config->{cc}; my $msg = `$cc -dumpmachine 2>&1`; if (defined $msg) { if ($msg =~ /x86_64/) { print "YES\n"; $defaults->{-thirdparty}->{dc}->{rule} = 'cd 3rdparty/dyncall && ./configure.bat /target-x64 /tool-gcc && $(MAKE) COMPILE.C=$$(COMPILE.c) -f Makefile.embedded mingw32'; } else { print "NO\n" } } else { ::softfail("could not run 'cl'"); print ::dots(' assuming x86'), "OK\n"; } } } sub detect_cross {} 42; MoarVM-2015.11/build/check.mk.in0000644000175000017500000000303012520766031015160 0ustar jnthnjnthnCINCLUDES := -Isrc \ -isystem 3rdparty/libuv/include \ -isystem 3rdparty/libatomic_ops/src \ -isystem 3rdparty/libtommath \ -isystem 3rdparty/sha1 \ -isystem 3rdparty/dynasm \ -isystem 3rdparty/dyncall/dynload \ -isystem 3rdparty/dyncall/dyncall \ -isystem 3rdparty/dyncall/dyncallback \ -isystem 3rdparty CFLAGS := @ccdefflags@ -DMVM_TRACING=1 SRCDIRS := src \ src/6model \ src/6model/reprs \ src/core \ src/gc \ src/gen \ src/io \ src/mast \ src/math \ src/platform \ src/platform/posix \ src/platform/win32 \ src/strings SOURCES := $(wildcard $(SRCDIRS:%=%/*.c)) CLANGDIRS := $(SRCDIRS:src%=.clangcheck%/) GCCDIRS := $(SRCDIRS:src%=.gcccheck%/) NOCLANG := c11-extensions padded NOGCC := clangcheck: $(SOURCES:src/%=.clangcheck/%) gcccheck: $(SOURCES:src/%=.gcccheck/%) .clangcheck: $(CLANGDIRS) .gcccheck: $(GCCDIRS) $(CLANGDIRS) $(GCCDIRS): -@cd $(dir $(patsubst %/,%,$@)) && mkdir $(notdir $(patsubst %/,%,$@)) > @nul@ 2>&1 $(SOURCES:src/%=.clangcheck/%): .clangcheck/%: src/% .clangcheck clang -fsyntax-only -Werror -Weverything $(NOCLANG:%=-Wno-%) $(CFLAGS) $(CINCLUDES) $< @@cat@ @nul@ > $@ $(SOURCES:src/%=.gcccheck/%): .gcccheck/%: src/% .gcccheck gcc -fsyntax-only -std=c99 -Werror -Wall -Wextra $(NOGCC:%=-Wno-%) $(CFLAGS) $(CINCLUDES) $< @@cat@ @nul@ > $@ include check.todo MoarVM-2015.11/build/config.c.in0000644000175000017500000000211212573775575015210 0ustar jnthnjnthn/* !!! * If you're looking at config.c and thinking of editing - this is a * generated file. See build/config.c.in, unless you're just twiddling * to get things to work on your platform before updating Configure, * in which case go right ahead. :-) * !!! */ #include "moar.h" #define add_entry(tc, hash, name, value) do { \ MVMString * const key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (name)); \ MVMROOT(tc, key, { \ MVMString * const value_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (value)); \ MVMObject * const boxed_value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, value_str); \ MVM_repr_bind_key_o(tc, hash, key, boxed_value); \ }); \ } while (0) MVMObject *MVM_backend_config(MVMThreadContext *tc) { MVMObject *config = tc->instance->cached_backend_config; if (config) return config; config = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMROOT(tc, config, { @backendconfig@ }); tc->instance->cached_backend_config = config; return config; } MoarVM-2015.11/build/config.h.in0000644000175000017500000000246312520766031015201 0ustar jnthnjnthn/* !!! * If you're looking at config.h and thinking of editing - this is a * generated file. See build/config.h.in, unless you're just twiddling * to get things to work on your platform before updating Configure, * in which case go right ahead. :-) * !!! */ /* Version information. */ #define MVM_VERSION "@version@" #define MVM_VERSION_MAJOR @versionmajor@ #define MVM_VERSION_MINOR @versionminor@ #define MVM_VERSION_PATCH @versionpatch@ /* Various compiler-specific pragmii. */ #define MVM_NO_RETURN @noreturnspecifier@ #define MVM_NO_RETURN_GCC @noreturnattribute@ #define MVM_FORMAT(X, Y, Z) @formatattribute@ /* DLL interface definitions. */ #define MVM_DLL_IMPORT @dllimport@ #define MVM_DLL_EXPORT @dllexport@ #define MVM_DLL_LOCAL @dlllocal@ /* Set in case of big-endian sytems. * The default byte order is little-endian. */ #if @be@ #define MVM_BIGENDIAN @be@ #endif /* pthread_yield() detection */ #if @has_pthread_yield@ #define MVM_HAS_PTHREAD_YIELD @has_pthread_yield@ #endif /* How this compiler does static inline functions. */ #define MVM_STATIC_INLINE @static_inline@ #if @can_unaligned_int32@ #define MVM_CAN_UNALIGNED_INT32 #endif #if @can_unaligned_int64@ #define MVM_CAN_UNALIGNED_INT64 #endif #if @can_unaligned_num64@ #define MVM_CAN_UNALIGNED_NUM64 #endif #define MVM_PTR_SIZE @ptr_size@ MoarVM-2015.11/build/gen.list0000644000175000017500000000025612456307241014624 0ustar jnthnjnthnsrc/gen/config.c build/config.c.in src/gen/config.h build/config.h.in Makefile build/Makefile.in tools/check.mk build/check.mk.in build/mk-moar-pc.pl build/mk-moar-pc.in MoarVM-2015.11/build/help.txt0000644000175000017500000000231412456307241014644 0ustar jnthnjnthnMakefile targets: help display this message all build library and MoarVM executable [default] lib build library only test dummy target ( use the nqp-cc test suite instead ) switch rebuild executable with switch dispatch [default] tracing rebuild executable with tracing dispatch cgoto rebuild executable with computed goto dispatch no-tracing alias for switch no-cgoto alias for switch clean remove build files realclean additionally remove auxiliary and 3rdparty files ( needs to be called when switching between shared and static library builds ) distclean additionally remove executable, library and configuration files ( should remove all generated files ) reconfig calls Configure.pl after doing a realclean ( use CONFIG and ADDCONFIG to control options ) Makefile options: NOISY=1 show actual commands instead of descriptions CONFIG=? passed to Configure.pl by reconfig ADDCONFIG=? passed to Configure.pl by reconfig in addition to the previously passed arguments MoarVM-2015.11/build/mk-moar-pc.in0000644000175000017500000000335012573775575015472 0ustar jnthnjnthn#! @perl@ ## --------------------------------------------------------------------- ## mk-moar-pc.in -- Describe MoarVM configuration ## ## Copyright © 2014 Daniel Dehennin ## ## use 5.010; use strict; use warnings; use File::Basename; use File::Path qw{make_path}; my @args = @ARGV; die "Missing target filename argument" if @args < 1; my $prefix = '@prefix@'; my $bindir = '@bindir@'; my $libdir = '@libdir@'; my $mastdir = '@mastdir@'; my $includedir = "${prefix}/include"; my $package = '@name@'; my $version = '@version@'; my $exeext = '@exe@'; my $moar = "${bindir}/${package}${exeext}"; my $ldopts = '@ldflags@'; my $ldflags = "-L${libdir} -l${package}"; my $libs = "${ldflags}"; my $cflags = "-I${includedir}"; my $static_libs = ''; if ('@config@' =~ m/--static/) { my $static_libs = "${libdir}/lib${package}.a"; } else { my $static_libs = ''; } if ($libdir =~ m{^/(?:usr/)?lib(?:64)?}) { $ldopts = ''; $ldflags = "-l$package"; } else { $ldflags = "${ldopts} ${ldflags}"; } $libs = "${ldflags}"; $cflags = '' if ${includedir} eq "/usr/include"; my $dirname = dirname $args[0]; if ( ! -d $dirname ) { make_path($dirname); } open my $pcfile, '>', "$args[0]" or die "Can not open > $args[0]: $!"; print $pcfile <new(); chdir $probe_dir or die "Can't chir $probe_dir: $!"; return $restore; } sub compile { my ($config, $leaf, $defines, $files) = @_; my $restore = _to_probe_dir(); my $cl_define = join ' ', map {$config->{ccdef} . $_} @$defines; my @objs; foreach my $file ("$leaf.c", @$files) { (my $obj = $file) =~ s/\.c/$config->{obj}/; my $command = "$config->{cc} $cl_define $config->{ccout}$obj $config->{ccswitch} $file >$devnull 2>&1"; system $command and return; push @objs, $obj; } my $command = "$config->{ld} $config->{ldout}$leaf @objs $config->{ldlibs} >$devnull 2>&1"; system $command and return; return 1; } sub _spew { my ($filename, $content) = @_; open my $fh, '>', $filename or die "Can't open $filename: $!"; print $fh $content or die "Can't write to $filename: $!"; close $fh or die "Can't close $filename: $!"; } sub static_inline_native { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include int main(int argc, char **argv) { #ifdef __GNUC__ return EXIT_SUCCESS; #else return EXIT_FAILURE; #endif } EOT print ::dots(' probing whether your compiler thinks that it is gcc'); compile($config, 'try') or die "Can't compile simple gcc probe, so something is badly wrong"; my $gcc = !system './try'; print $gcc ? "YES\n": "NO\n"; print ::dots(' probing how your compiler does static inline'); _spew('inline.c', <<'EOCP'); #include extern int f_via_a(int x); extern int f_via_b(int x); int main(int argc, char **argv) { int y; y = f_via_a(0); #ifdef USE_B y = f_via_b(0); #endif if (y == 42) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } EOCP _spew('a.c', <<'EOCP'); static INLINE int f(int x) { int y; y = x + 42; return y; } int f_via_a(int x) { return f(x); } EOCP _spew('b.c', <<'EOCP'); extern int f(int x); int f_via_b(int x) { return f(x); } EOCP # For gcc, prefer __inline__, which permits the cflags to add -ansi my @try = $gcc ? qw(__inline__ inline __inline _inline) : qw(inline __inline__ __inline _inline); my $s_i; while (my $try = shift @try) { next unless compile($config, 'inline', ["INLINE=$try"], ['a.c']); next if system "./inline"; # Now make sure there is no external linkage of static functions if(!compile($config, 'inline', ["INLINE=$try", "USE_B"], ['a.c', 'b.c']) || system "./inline") { $s_i = "static $try"; last; } } if ($s_i) { print "$s_i\n"; } else { print "none, so falling back to static\n"; $s_i = 'static'; } $config->{static_inline} = $s_i; } sub static_inline_cross { my ($config) = @_; # FIXME. Needs testing, but might be robust enough to do what the native # code does, but just skip the system() to run the executable. Although this # might get confused by link time optimisations that only fail at run time, # which the system test does detect. $config->{static_inline} = 'static'; } sub _gen_unaligned_access { my ($config, $can) = @_; my @align = qw(int32 int64 num64); if ($can eq 'all') { ++$config->{"can_unaligned_$_"} foreach @align; print " your CPU can read unaligned values for all of @align\n"; } else { my %can; ++$can{$_} for split ' ', $can; $config->{"can_unaligned_$_"} = $can{$_} || 0 foreach @align; if ($can) { print " your CPU can read unaligned values for only $can\n"; } else { print " your CPU can't read unaligned values for any of @align\n"; } } } sub unaligned_access { my ($config) = @_; if ($^O eq 'MSWin32') { # Needs FIXME for Windows on ARM, but not sure how to detect that _gen_unaligned_access($config, 'all'); } else { # AIX: # uname -m: 00F84C0C4C00 # uname -p: powerpc # HP/UX # uname -m: 9000/800 # (but will be ia64 on Itanium) # uname -p illegal # Solaris # uname -m: i86pc # uname -p: i386 # FreeBSD # uname -m: amd64 # uname -p: amd64 # NetBSD # uname -m: amd64 # uname -p: x86_64 # OpenBSD # uname -m: amd64 # uname -p: amd64 # Assuming that the 50 other *BSD variants are forks of the 3 above # Linux # uname -p can return 'unknown' my $flag; if ($^O eq 'aix' || $^O eq 'solaris') { $flag = '-p'; } else { $flag = '-m'; } my $command = "uname $flag"; my $arch = `$command`; if (defined $arch) { chomp $arch; if ($arch =~ /^(?:x86_64|amd64|i[0-9]86)$/) { # Don't know alignment constraints for ARMv8 _gen_unaligned_access($config, 'all'); } elsif ($arch =~ /armv(?:6|7)/) { _gen_unaligned_access($config, 'int32'); } else { # ARMv5 and earlier do "interesting" things on unaligned 32 bit # For other architectures, play it safe by default. # Updates welcome. _gen_unaligned_access($config, ''); } } else { print STDERR "Problem running $command, so assuming no unaligned access\n"; } } } sub unaligned_access_cross { my ($config) = @_; _gen_unaligned_access($config, ''); } sub ptr_size_native { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include int main(int argc, char **argv) { printf("%u\n", (unsigned int) sizeof(void *)); return EXIT_SUCCESS; } EOT print ::dots(' probing the size of pointers'); compile($config, 'try') or die "Can't compile simple probe, so something is badly wrong"; my $size = `./try`; die "Unable to run probe, so something is badly wrong" unless defined $size; chomp $size; die "Probe gave nonsensical answer '$size', so something it badly wrong" unless $size =~ /\A[0-9]+\z/; print "$size\n"; $config->{ptr_size} = $size; } # It would be good to find a robust way to do this without needing to *run* the # compiled code. At which point we could also use it for the native build. sub ptr_size_cross { my ($config) = @_; warn "Guessing :-("; $config->{ptr_size} = 4; } sub computed_goto { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include int main(int argc, char **argv) { void *cgoto_ptr; cgoto_ptr = &&cgoto_label; goto *cgoto_ptr; return EXIT_FAILURE; cgoto_label: return EXIT_SUCCESS; } EOT print ::dots(' probing computed goto support'); my $can_cgoto = compile($config, 'try'); unless ($config->{crossconf}) { $can_cgoto &&= !system './try'; } print $can_cgoto ? "YES\n": "NO\n"; $config->{cancgoto} = $can_cgoto || 0 } sub pthread_yield { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include int main(int argc, char **argv) { pthread_yield(); return EXIT_SUCCESS; } EOT print ::dots(' probing pthread_yield support'); my $has_pthread_yield = compile($config, 'try'); print $has_pthread_yield ? "YES\n": "NO\n"; $config->{has_pthread_yield} = $has_pthread_yield || 0 } sub win32_compiler_toolchain { my ($config) = @_; my $has_nmake = 0 == system('nmake /? >NUL 2>&1'); my $has_cl = `cl 2>&1` =~ /Microsoft Corporation/; my $has_gmake = 0 == system('gmake --version >NUL 2>&1'); my $has_gcc = 0 == system('gcc --version >NUL 2>&1'); if ($has_nmake && $has_cl) { $config->{win32_compiler_toolchain} = 'win32'; } elsif ($has_gmake && $has_gcc) { $config->{win32_compiler_toolchain} = 'mingw32'; } else { $config->{win32_compiler_toolchain} = '' } $config->{win32_compiler_toolchain} } '00'; MoarVM-2015.11/build/setup.pm0000755000175000017500000002725712616160672014674 0ustar jnthnjnthnpackage main; use strict; use warnings; use File::Spec::Functions qw(devnull); my $devnull = devnull(); # 3rdparty library configuration our %TP_LAO = ( name => 'atomic_ops', path => '3rdparty/libatomic_ops/src', rule => 'cd 3rdparty/libatomic_ops && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' ./configure @crossconf@ && cd src && $(MAKE) && cd ..', clean => 'cd 3rdparty/libatomic_ops/src && $(MAKE) distclean', ); our %TP_SHA = ( name => 'sha1', path => '3rdparty/sha1', src => [ '3rdparty/sha1' ], ); our %TP_TOM = ( name => 'tommath', path => '3rdparty/libtommath', src => [ '3rdparty/libtommath' ], ); our %TP_MT = ( name => 'tinymt', path => '3rdparty/tinymt', src => [ '3rdparty/tinymt' ], ); our %TP_DC = ( name => 'dyncall_s', path => '3rdparty/dyncall/dyncall', rule => 'cd 3rdparty/dyncall && ./configure && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' $(MAKE) -f Makefile ', clean => 'cd 3rdparty/dyncall && $(MAKE) -f Makefile clean', ); our %TP_DCB = ( name => 'dyncallback_s', path => '3rdparty/dyncall/dyncallback', dummy => 1, # created as part of dyncall build ); our %TP_DL = ( name => 'dynload_s', path => '3rdparty/dyncall/dynload', dummy => 1, # created as part of dyncall build ); our %TP_UVDUMMY = ( name => 'uv', path => '3rdparty/libuv', # no default rule # building libuv is always OS-specific ); our %TP_UV = ( %TP_UVDUMMY, rule => '$(AR) $(ARFLAGS) @arout@$@ $(UV_OBJECTS)', clean => '$(RM) @uvlib@ $(UV_OBJECTS)', # actually insufficient to build libuv # the OS needs to provide a C or C setting ); our %THIRDPARTY = ( lao => { %TP_LAO }, tom => { %TP_TOM }, sha => { %TP_SHA }, mt => { %TP_MT }, dc => { %TP_DC }, dcb => { %TP_DCB }, dl => { %TP_DL }, uv => { %TP_UVDUMMY }, ); # shell configuration # selected by C<--shell> our %SHELLS = ( posix => { sh => '/bin/sh', cat => 'cat', rm => 'rm -f', nul => '/dev/null', }, win32 => { sh => 'cmd', cat => 'type', rm => 'del', nul => 'NUL', }, ); # toolchain configuration # selected by C<--toolchain> our %TC_POSIX = ( -compiler => 'cc', make => 'make', ar => 'ar', ccswitch => '-c', ccout => '-o ', ccinc => '-I', ccdef => '-D', cppswitch => '-E', cppout => '> ', asmswitch => '-S', asmout => '-o ', ldout => undef, lddir => '-L', ldusr => '-l%s', ldsys => undef, ldimp => undef, ccshared => '-fPIC', ldshared => '-shared @ccshared@', moarshared => '', ldrpath => '-Wl,-rpath,@libdir@ -Wl,-rpath,@prefix@/share/perl6/site/lib', arflags => 'rcs', arout => '', mkflags => '', mknoisy => '', obj => '.o', lib => 'lib%s.a', dll => 'lib%s.so', asm => '.s', bindir => '@prefix@/bin', libdir => '@prefix@/lib', mastdir => '@prefix@/share/nqp/lib/MAST', sharedlib => '', staticlib => '', -auxfiles => [], ); our %TC_GNU = ( %TC_POSIX, -compiler => 'gcc', mknoisy => <<'TERM', ifneq ($(NOISY), 1) MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ endif TERM dllimport => '__attribute__ ((visibility ("default")))', dllexport => '__attribute__ ((visibility ("default")))', dlllocal => '__attribute__ ((visibility ("hidden")))', ); our %TC_BSD = ( %TC_POSIX, mknoisy => <<'TERM', .if $(NOISY) != 1 MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ .endif TERM ); our %TC_MSVC = ( -compiler => 'cl', make => 'nmake', ar => 'lib', ccswitch => '/c', ccout => '/Fo', ccinc => '/I', ccdef => '/D', cppswitch => '/P', cppout => '/Fi', asmswitch => '/c /FAs', asmout => '/Fa', ldout => '/out:', lddir => '/libpath:', ldusr => '%s.lib', ldsys => undef, ldimp => '%s.dll.lib', ccshared => '', ldshared => '/dll', moarshared => '/implib:@moardll@.lib', ldrpath => '', arflags => '/nologo', arout => '/out:', mkflags => '/nologo', mknoisy => <<'TERM', !IF $(NOISY) != 1 MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ !ENDIF TERM obj => '.obj', lib => '%s.lib', dll => '%s.dll', asm => '.asm', bindir => '@prefix@/bin', libdir => '@bindir@', mastdir => '@prefix@/share/nqp/lib/MAST', sharedlib => '@moardll@.lib', staticlib => '', -auxfiles => [ qw( @name@.ilk @name@.pdb @moardll@.lib @moardll@.exp vc100.pdb ) ], -thirdparty => { dc => { %TP_DC, name => 'libdyncall_s', rule => 'cd 3rdparty/dyncall && configure.bat /target-x86 && $(MAKE) -f Nmakefile', clean => '$(RM) 3rdparty/dyncall/ConfigVars @dclib@ @dcblib@ @dllib@ 3rdparty/dyncall/dyncall/*@obj@ 3rdparty/dyncall/dyncallback/*@obj@ 3rdparty/dyncall/dynload/*@obj@', }, dcb => { %TP_DCB, name => 'libdyncallback_s' }, dl => { %TP_DL, name => 'libdynload_s' }, }, ); our %TOOLCHAINS = ( posix => { %TC_POSIX }, gnu => { %TC_GNU }, bsd => { %TC_BSD }, msvc => { %TC_MSVC }, ); # compiler configuration # selected by C<--compiler> our %COMPILERS = ( gcc => { -toolchain => 'gnu', cc => 'gcc', ld => undef, ccmiscflags => '-Wdeclaration-after-statement -Werror=declaration-after-statement', ccwarnflags => '', ccoptiflags => '-O%s -DNDEBUG', ccdebugflags => '-g%s', ccinstflags => '-pg', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, noreturnspecifier => '', noreturnattribute => '__attribute__((noreturn))', formatattribute => '__attribute__((format(X, Y, Z)))', }, clang => { -toolchain => 'gnu', cc => 'clang', ld => undef, ccmiscflags => '-fno-omit-frame-pointer -fno-optimize-sibling-calls', ccwarnflags => '-Wno-logical-op-parentheses', ccoptiflags => '-O%s -DNDEBUG', ccdebugflags => '-g%s', ccinstflags => '-fsanitize=address', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, noreturnspecifier => '', noreturnattribute => '__attribute__((noreturn))', formatattribute => '__attribute__((format(X, Y, Z)))', }, cl => { -toolchain => 'msvc', cc => 'cl', ld => 'link', ccmiscflags => '/nologo /MT', ccwarnflags => '', ccoptiflags => '/Ox /GL /DNDEBUG', ccdebugflags => '/Zi', ccinstflags => '', ldmiscflags => '/nologo', ldoptiflags => '/LTCG', lddebugflags => '/debug /pdb:$@.pdb', ldinstflags => '/Profile', noreturnspecifier => '__declspec(noreturn)', noreturnattribute => '', formatattribute => '', # TODO }, cc => { -toolchain => 'posix', cc => 'cc', ld => undef, ccmiscflags => '', ccwarnflags => '', ccoptiflags => '-O -DNDEBUG', ccdebugflags => '-g', ccinstflags => '', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, noreturnspecifier => '', noreturnattribute => '', formatattribute => '', }, ); # OS configuration # selected by C<--os> or taken from C<$^O> our %OS_WIN32 = ( exe => '.exe', defs => [ qw( WIN32 AO_ASSUME_WINDOWS98 ) ], syslibs => [ qw( shell32 ws2_32 mswsock rpcrt4 advapi32 psapi iphlpapi ) ], platform => '$(PLATFORM_WIN32)', dllimport => '__declspec(dllimport)', dllexport => '__declspec(dllexport)', dlllocal => '', -thirdparty => { # header only, no need to build anything lao => undef, uv => { %TP_UVDUMMY, src => [ qw( 3rdparty/libuv/src 3rdparty/libuv/src/win ) ], }, }, ); our %OS_MINGW32 = ( %OS_WIN32, make => 'gmake', defs => [ @{$OS_WIN32{defs}}, qw( _WIN32_WINNT=0x0600 ) ], dll => '%s.dll', ldimp => '-l%s.dll', libdir => '@bindir@', ccshared => '', ldshared => '-shared -Wl,--out-implib,lib$(notdir $@).a', moarshared => '', ldrpath => '', sharedlib => 'lib@moardll@.a', -thirdparty => { %{$OS_WIN32{-thirdparty}}, dc => { %TP_DC, rule => 'cd 3rdparty/dyncall && ./configure.bat /target-x86 /tool-gcc && $(MAKE) -f Makefile.embedded mingw32', clean => $TC_MSVC{-thirdparty}->{dc}->{clean}, }, }, ); our %OS_POSIX = ( defs => [ qw( _REENTRANT _FILE_OFFSET_BITS=64 ) ], syslibs => [ qw( m pthread ) ], platform => '$(PLATFORM_POSIX)', ); our %OS_LINUX = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( rt dl ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_LINUX)' }, }, ); our %OS_OPENBSD = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_OPENBSD)' }, }, ); our %OS_NETBSD = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_NETBSD)' }, }, ); our %OS_FREEBSD = ( %OS_POSIX, cc => (qx!cc -v 2>&1 >$devnull! !~ 'clang') ? 'gcc' : 'clang', syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_FREEBSD)' }, }, ); our %OS_DRAGONFLY = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_FREEBSD)' }, }, ); our %OS_GNUKFREEBSD = ( %OS_FREEBSD, syslibs => [ @{$OS_FREEBSD{syslibs}}, qw( rt dl ) ], ); our %OS_SOLARIS = ( %OS_POSIX, defs => [ qw( _XOPEN_SOURCE=500 _XOPEN_SOURCE_EXTENDED=1 __EXTENSIONS__=1 _REENTRANT _FILE_OFFSET_BITS=64 ) ], syslibs => [ qw( socket sendfile nsl pthread kstat m rt ) ], mknoisy => '', ccmiscflags => '-mt', -thirdparty => { dc => { %TP_DC, rule => 'cd 3rdparty/dyncall && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' $(MAKE) -f Makefile.embedded sun', clean => 'cd 3rdparty/dyncall && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' $(MAKE) -f Makefile.embedded clean', }, uv => { %TP_UVDUMMY, objects => '$(UV_SOLARIS)' }, }, ); our %OS_DARWIN = ( %OS_POSIX, defs => [ qw( _DARWIN_USE_64_BIT_INODE=1 ) ], syslibs => [], usrlibs => [ qw( pthread ) ], dll => 'lib%s.dylib', ccshared => '', ldshared => '-dynamiclib', moarshared => '-install_name @prefix@/lib/libmoar.dylib', sharedlib => 'libmoar.dylib', -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_DARWIN)' }, }, ); our %SYSTEMS = ( posix => [ qw( posix posix cc ), { %OS_POSIX } ], linux => [ qw( posix gnu gcc ), { %OS_LINUX } ], darwin => [ qw( posix gnu clang ), { %OS_DARWIN } ], openbsd => [ qw( posix bsd gcc ), { %OS_OPENBSD} ], netbsd => [ qw( posix bsd gcc ), { %OS_NETBSD } ], dragonfly => [ qw( posix bsd gcc ), { %OS_DRAGONFLY } ], freebsd => [ qw( posix bsd clang ), { %OS_FREEBSD } ], gnukfreebsd => [ qw( posix gnu gcc ), { %OS_GNUKFREEBSD } ], solaris => [ qw( posix posix cc ), { %OS_SOLARIS } ], win32 => [ qw( win32 msvc cl ), { %OS_WIN32 } ], cygwin => [ qw( posix gnu gcc ), { %OS_WIN32 } ], mingw32 => [ qw( win32 gnu gcc ), { %OS_MINGW32 } ], ); 42; MoarVM-2015.11/build/test.txt0000644000175000017500000000015212456307241014671 0ustar jnthnjnthn MoarVM does not come with its own test suite Build NQP with the Moar backend and test from there. MoarVM-2015.11/check.todo0000644000175000017500000000057212456307241014024 0ustar jnthnjnthn.clangcheck/6model/serialization.c: NOCLANG += sign-conversion unused-macros unused-function .clangcheck/6model/bootstrap.c: NOCLANG += sign-conversion unused-variable shorten-64-to-32 .clangcheck/6model/6model.c: NOCLANG += missing-noreturn .clangcheck/6model/reprs.c: NOCLANG += missing-noreturn .gcccheck/6model/bootstrap.c: NOGCC += unused-variable unused-but-set-variable MoarVM-2015.11/docs/6model-parametric-extensions.markdown0000644000175000017500000000626412460010725022261 0ustar jnthnjnthn# 6model parametric extensions in MoarVM ## Overview The 6model parametric extensions add parametric type support at the VM level. A type may configure itself as supporting parameterization. Parameterizations each have a unique key, which is used to intern them. This ensures each of the parameterizations exists only once. In the case that two modules both produce and serialize a parameterization, that from the second module may be freely disregarded, and the existing deserialization of the parameterized type may be used. This ensures unique type objects per parameterization are upheld even in the case of precompilation. Each parameterization will have a unique STable and type object. It is up to the meta-object whether the HOW is shared between parameterizations. For example, parametric roles reify the methods within them with concrete type parameters, so a separate HOW is required. By contrast, CoerceHOW, the meta-object for coercion types, can store all that is distinctive about it within the type's parameters. Since a given parameteriation can be queried for its parameters, it is possible for all Perl 6 coercion types to share a single meta-object. ## STable extensions The mode flags on an STable get two new additions: * Parametric (this type can be parameterized) * Parameterization (this type is the parameterization of some parametric type) A type cannot be both parametric and a parameterization, meaning we can use a union to store parametrics-related data. union { struct { MVMObject *parameterizer; /* Thing to invoke) MVMParameterizationLookup *lookup; /* Known parameterizations */ } parametric; struct { MVMObject *parametric_type; /* The parameterized type */ MVMObject *parameters; /* The parameters. */ } parameterized; } ## New ops The VM op additions match the nqp::op additions for parametric types: ### nqp::setparameterizer(type, parameterizer) Makes a type as being parametric, and configures the code needed to parameterize it. ### nqp::parameterizetype(type, parameter_array) Takes a parameterizable type and an array of parameters. Looks up and returns any existing matching parameterization. If it does not exist, invokes the parameterization producer for the parametric type, installs that in the lookup, and returns it. Note that the array is snapshotted, for the benefits of the type specializer. ### nqp::typeparameterized(type) If the type specified is a parameterization of some other type, then returns that type. Otherwise, returns null. ### nqp::typeparameters(type) Gets the type parameters used to parameterize the type. Throws an exception if the type is not parametric. ### nqp::typeparameterat(type, idx) Equivalent to nqp::atpos(nqp::typeparameters(type), idx), except much easier for type specialization to understand and deal with and avoids an array construction. ## Interaction with spesh Specializations can take place per parameterization of a type. This means that uses of nqp::typeparameterat(...) can become constants at specialization time, which opens up numerous optimization possibilities. ## Deserialize-time interning XXX To define MoarVM-2015.11/docs/ChangeLog0000644000175000017500000011213112623370227014555 0ustar jnthnjnthnNew in 2015.11 + Fix const warnings about pointers to Unicode case table + Elide a few key-values from profiler data for default values + All Latin-1 controls are normalization terminators + NFG now uses Unicode Grapheme Cluster algorithm; "\r\n" is now one grapheme + Fix a canonical composition bug + Fix SEGV on nqp::chars on a null string. + Support multiple line separators on I/O handles + Support multi-grapheme line separators on I/O handles + Include \r\n synthetic in default line separators + Serialization writes string offsets as 2 bytes if possible + Used varints in a few more places in the serialization format + Serialize the STable mode flags in a single byte + Serialize the STABLE boolification_spec mode in 1 byte + Serialize the container and invocation spec flag bits with the bool spec + Implement readlinechomp_fh op, for reading lines without line ending + Fix moar build on DragonFly BSD + Fix join NFG bug when separator is empty + Improve normalizer performance on paths needing canonical combining class + Boost number of fixed size allocation bins, to handle more allocations + Fix encoding/decoding \r\n grapheme in all encodings + Make radix ops not blow up over synthetics + Fix normalizer to never re-normalize what was already considered + Encoders now throw exceptions on unencodeable characters by default + Allow specifying a replacement string for unencodeable characters + New UTF-8 Clean-8bit encoding for strings we exchange with the OS + Make escape handle \r\n properly + Handle files where stat falseley reports 0 bytes size + Provide a way for NFA to be given synthetics, not just codepoints + Teach NFA about ignoremark charrange case + Make MVMMultiCache container aware, including spesh/JIT gurd updates + isrwcont can now be jit-compiled + We can spesh isrwcont into a const now + Document ASAN_OPTIONS + Fix possible SEGV in getlex and bindlex when walking scopes + Release mutex in MVM_load_bytecode on exception + Allow named flattening args to show up amongst named args in callsites + Make later named args that are flattened in override earlier ones + Override setjmp to two-argument version on mingw64 + fix a callsite memory leak + Fix ordfist/ordat JIT + JIT bigint ops or, and, xor, brshift, blshift and bnot + JIT hintfor op + Fix native call struct size calculation bug + Implement istty_fh op New in 2015.10 + Profiling: fix data collection when exiting + Profiling: improve timing calculation + NFG: Strip BOM from UTF-8 + NFG: Implement casefolding + NFG: handle SpecialCasing + JIT: fix devirtualized REPR ops; devirt more ops + JIT: improve logging + Misc: Improve handling of state when spawning child processes + Code: Throw better exceptions in several cases + Code: linting, consting, avoid segfaults, etc. New in 2015.09 + Fix write to null handle on async socket + Add C++ support to native calling functionality + Make thread join force a GC run, preventing start/join loops eating memory + Remove more config and generated files in distclean target + Add MVM_CROSS_THREAD_WRITE_LOG to usage message + Try to get PC on valid instruction for cross thread write logging + JIT continuationreset and continuationcontrol + JIT string comparison ops + Don't devirtualize push_n or unshift_n for now + Async sockets: handle close,close and close,write + Differeniate when nativecasting to intN/uintN + Fix data race in frame reference count handling + Make findcclass and findnotcclass return one past end of string on non-match + Fix buffer overrun in assembler for labelled exception handlers + Free STables in a safer place, fixing a parallel finalization data race + Fix alignment of inlined structs/unions New in 2015.08 + Removed multiple internal data races + Add ctxcode op to get the code object of a context + Inlining in spesh will now check post-optimization size of code + Use a binary search in unicode block lookup + Unicode database file now compilable with newer MSVC + Lots of fixes for problems reported by linter software + Support for parsing Unicode numbers + Some potential segfaults fixed + New control exceptions "await", "emit" and "done" + Trying to unbox a bigint larger than 64 bit now throws + Fix "merge facts at phi" opt in spesh forgetting the first argument + Many memory leaks fixed + Properly close stdin handle when an async process dies + Async processes now have a "ready" callback + Sleep API now split into sleep and nanosleep New in 2015.07 + Support for multi-dimensional arrays + Improved support for pipes + Updated to Unicode 8 + Die when we try to accept() or read() outside an originating thread (used to silently not work) + Instrumentation for findings writes without locks to objects originating from another thread + The profiler will now also show natively called functions + Support for libffi as an alternative to dyncall + exists_pos is no longer part of the REPR API + Accessing an object's HOW is now part of the API + libuv will now autoquote cmdline arguments on windows + Fixed some code object related ops that could segfault + New openpipe implementation that allows to read from and write to stdin/stdout/stderr + spesh will now track facts across BB nodes even through PHI + Fixed numerous memory leaks when C strings were included in exceptions + Implemented "free at next safepoint" mechanism for safely freeing memory from internal data structures in a threaded context, thus fixing NFG table growth in multi-threaded applications + Fix compile on FreeBSD 8.4 and probably earlier by detecting gcc + Fixes for build repeatability + Optimization of can op fixed and fully enabled + Fix async process handle closing + Numerous warning cleanups for various compilers New in 2015.06 + No longer use up a full core in some async situations. + Errors from nativecall include dlerror() output for clarity. + More verbose and aligned output in MVM_SPESH_LOG. + Several ops added to the jit. + Throwing and resuming ops for exceptions supported in the jit. + More places now go through the Int cache. + Support for str attributes in CUnion and CStruct. + Non-characters now correctly considered valid for UTF-8 encoding. + Fix exception handler resolution bug. + Introduced MVM_SPESH_NODELAY to set spesh thresholds very low. + Support for building with gmake and gcc on windows. + Support for GNU/kFreeBSD. New in 2015.05 + Add missing C prototype for MVM_string_windows1252_decodestream + Fix uniname out of range error reporting. + Fix SSA crash when huge number of basic blocks. + Implement normalization buffer grwoth handling. + Add missing frees on invalid UTF-8 decoding. + Integrate NFG with UTF-16 non-stream decode. + Remove linenoise/readline + Give a decode stream a normalizer. + Further integrate normalizer with decode stream. + Fix chr for our brave new NFG world. + Update macportfile to 2015.04 release + Make \n a "normalization terminator". + Ensure concatenation is closed under NFG. + Don't leak synthetics from ord. + Integrate NFG with UTF-8 non-stream decode. + Implement NFG for decode stream case of UTF-8. + Fix use-after-free in open file error reporting. + Display exactly what thread ID was passed. + Release allocated resources before returning + Free resources for **pieces before returning + Release 'signature' before returning from unmarshal_callback() + Free leaked resource `buffer` before returning + Remove fragile assumption about buffer size. + Fix UTF-8 encoder to handle NFG. + More robust NULL string checking. + Ensure we get NULL-terminated strings if needed. + Bytecode file stores Latin-1 when possible. + Optimize temporary root handling. + Cache and mark the backend config hash. + Dual-purpose comp unit string heap as SC one. + Re-order bytecode read struct to be smaller. + Don't repeatedly calculate limit in bytecode read. + Toss some bits of ut_hash we don't use. + Toss hash bloom test bits we don't use. + Optimize at level 3 by default. + Toss even more hash bits we don't use. + Re-implement MVMIter on hashes using buckets. + Toss HASH_FSCK addition order check. + Use a simpler "deleting the last item" check. + Eliminate double-linked-list in hashes. + Fix use-after-free if hash iter block frees nodes. + Be consistent with paren-ing in macro. + Eliminate a single-use macro. + Correct head replacement logic. + Re-implement simple say/print using MoarVM I/O. + Thread ID handling cleanup. + Fix an ABA bug in the fixed size allocator. + At least do a spinlock rather than a mutex. + Factor out code to avoid a "magic value" all over. + Concurrency control on multi-cache additions. + Show line numbers for deopt annotations + Give every BB in the spesh log a line number + Devirtualize bindkey and bindpos ops + Implement MVM_op_elems for devirtualization + Implement getattr_* and getattrs_* devirtualization + Implement pop_* and shift_* for devirt + Implement bindattr and bindattrs ops for devirt + Fix a control flow thinko for logging + When failing from consume_reprop, do it loudly + No longer bail from many unhandled repr ops + Devirtualize setelemspos, existspos and existskey + Implement ordbaseat and eqatim_s ops for ignoremark + Silence warnings about pointer type mismatch + Increase stack space for call arguments. + More compact jit for add, sub, bor, band and bxor + Add lib install dir to rpath + Display "Inlined" flag in the spesh log + Add a missing barrier in multi-dispatch cache + Tweak error reporting of wrong outer frame + Include cuuid of invokee in error message. + Remove the frame pool + Spesh dump shows little words for fact flags + Spesh dump coderefs as filename + line number and "(closure)" + Handle LTM for ignorecase+ignoremark + Fix ref-count management of deserialized contexts. + Provide a "never repossess this" mechanism. + Fix a GC marking bug in parametric type setup. + Implement exception object creation from category. + Emit add, sub, bor, band, bxor with constant if possible + Kill duplicate getspeshslot ins for the same register + Formally bump minimum bytecode version to 5 + JIT - check if constant value fits in 32 bit + Fix format type error in JIT logging + Add MVM_oops() function to panic with backtrace, used in spesh and JIT + Add op for disclaiming all objects of an serialization context (SC) + Check that owning object wasn't disclaimed by an SC. + Add support for CUnion repr to use with NativeCall + Add support for inlined CStructs and CUnions New in 2015.04 + Re-enabled lazy deserialization, decreasing Rakudo startup time and memory + Fix a possible buffer-overrun in MVMArray's existspos + Fix for ARMv5 + Configure: add an option --ar + Mark existspos op as pure to allow better optimization + Tweak dynamic optimization and OSR thresholds to tune startup performance + Implement bounded serialization of parameterized types + Include file names in some deserialization errors + Clean up some unused functions and variables + Add __attribute__((format())) where appropriate + Correct some format strings + Allow nativecast from VMArray e.g. Blob/Buf + Output callsites in spesh log + Implement unsigned int types for native calls + Upgrade Unicode DB to Unicode 7.0 + Include module that asked for stale dependency in error message + Handle 'is rw' params in native calls + Make some hot functions at startup time as always being inlined + Fix exception message when utf8 string is invalid from the start + Implement NFC/NFD/NFKC/NFKD Unicode normalization algorithms + Add op to normalize buffers of codepoints + Remove unused Unicode database script + Support cross-compiling with computed goto + Refactor pthread_yield detection + Add op "getcodelocation"; gets file and line of a MVMCode + Tweak istrue_s; every non-empty string is true now + Bump minimum serialization format version; remove code for old versions + Implement a more efficient varint serialization format + Remove the vestigial serialized 0 that used to be v-table length + Re-order struct MVMCollectable to slightly reduce L1 cache misses + Store the serialized reference type discriminator in 1 byte, not 2 + Add missing IS_CONCRETE checks in serialization + Make unbox int/num/str functions test IS_CONCRETE always + Fix conflict with splice from bits/fcntl-linux.h + Fix missing frees of bytecode annotations + Serialize object headers more compactly + Serialize object references more compactly + Split codepoint iterator from grapheme iterator + Implement grapheme normalization algorithm (aka. "NFG") + Implement encoding of grapheme-level strings to bytes + Implement retrieving codepoints in different normal forms from NFG strings + Fake POSIX exit codes consequently on windows + Remove extra call to uv_run when closing a pipe + Loop over waitpid to get correct exit code for closed pipe + Basic implementation of case change with NFG + Make character class check on NFG synthetic uses base codepoint + Make Unicode property checks on NFG synthetics use base codepoint New in 2015.03 + Add a macports Portfile + Implement nativecallsizeof op + Rewrite MVM_file_copy so it handles files larger than 2GB + Mostly quiet MSVC warnings when compiling the JIT emitter + Chase libuv thread ID API change, and fix thread ID lookup on Windows + Teach profiler about native ref taking ops + Fix allocating an empty (no members) CStruct + JIT compilation for native reference related operations + Implement native register references + Support references to sized int and num lexicals + Fix missing GC rooting of callback object arguments + Fix big endian bug in if/unless optimization + Simplify known value handling in the optimizer + Make graph_spesh.p6 also show the dominance tree + Fix bugs in string_index_from_end + Bump dyncall revision + Fix big endian bug in the P6bigint REPR + Fix system detection in triple for cross compilation + Stop fiddling with slashes in openpipe on Windows + Make index('foo','') return 0, and handle null needle when start > 0 + Type specialization for the bindattrs_s op + Optimize out many set instructions + Add helper functions so embedders won't need to poke into MVMInstance so much + Use CFLAGS, CPPFLAGS, and LDFLAGS from the environment, if set + Re-use allocated PHI node descriptors, to reduce allocations during optimization + Improve optimizer memory allocation block scheme to decrease waste + Allow STable changes in repossessed objects + Fix JIT of bindpos_n + Fix bogus pointer casts and libc name clashes to fix MinGW build + Fix a bug in iter optimization + Better armv6 and v7 detection New in 2015.02 * Fix memory leak in P6bigint * -O2 is now the default optimization level in clang/GCC * Improve performance of SSA form calculation * Dyncall dependency is now at version 0.9 * Better error messages in NativeCall * CArrays are now zero-filled by default * MVMArrays can now be casted and passed to native functions * Addition of readlink and lstat ops, and general symlink compatibility * libuv dependency is now at version 1.0.0 * P6int and P6num can now be "C sized" * Implemented native references to lexicals, attributes, and array elements * Added native_ref container specification * Added iscont_[ins] and decont_[ins] ops * Make multi-dispatch cache aware of native containers * Mixin prefix test in P6opaque now disregards attribute-free parents * Fix buffer overflow when trying to inline calls with many args * Handle argconst_[ins] instructions in inlining * Fix a crash from trying to unbox type objects passed to native args * Decrement usage counts in some optimizations, killing more dead code New in 2015.01 * Decrement usage of class type for setattr ops, enabling wval elimination * Add missing concreteness checks in concurrency ops * First operand of sp_guard* is r(obj) not int16 * Make ReentrantMutex not prevent serialization * Fix various ops that could return real NULL pointers and cause SEGVs * Spesh gethow (can be spesh slot lookup) * Start documenting the parametric 6model design * Implement parametric 6model ops * Avoid calling MVM_callsite_get_common twice in many situations * Use labs instead of abs to avoid truncation on 64-bit values * Fix signed/unsigned warnings in bytecode handling * Big signed/unsigned cleanup in string/buffer handling * Fix leak when join returns early * Fix missing free in args spesh * Tweak fixed size alloc configuration for a small memory saving * Improve missing SC code ref error reporting * Start integrating 6model parametrics with serialization * Don't delete BBs with handler annotations * Handle assigning Str to a CArray[Str] slot (to assign NULL) * Simplify and optimize varint serialization/deserialization New in 2014.12 + Various warnings produced by clang fixed + Fixed ceil_n and floor_n to return n64, not i64 + Pass -faddress-sanitizer when --asan is set + Eliminate various unneeded set instructions + Properly update successors for non-passed optional parameters + Optimize can operations + When bindlex fails, we should report "bindlex", not "getlex" + Mark takeclosure as an popular allocating op in the profiler + Expose callsite interning for extops + JIT randscale_n + Dump lexical names when dumping spesh graph + Only look at MVM_NFA_DEB environment variable once, not every NFA run + Implement longest literal tie-breaker in NFA + JIT cmp_i + JIT isnanorinf + JIT cmp_n + Handle sometimes-allocating ops in the profiler + JIT invokewithcapture + Count allocs in spesh'd/jitted frames separately in profiler + Turn a bunch of can_s ops into can ops instead. + Give graph_spesh.p6 a little introduction text + Avoid a pointer getting outdated on the stack in environment access + Replace quicksort with insertion sort in NFA fate sorting + Fix MVMROOT of a non-collectable in state variable handling + Detect useless SUBRULE edges in NFA, and trap epsilons to 0 + Mark callback Str parameters as not to be freed + Record size of gen2_roots list after each GC when profiling + Do not call srand() if not using rand() + Don't use filename to determine EOFness + Allow passing of length = -1 to MVM_string_utf16_encode_substr + Don't resolve symlinks by hand + Avoid some duplicate work in inter-gen root processing + Fix a use-after-free in openpipe, which occurred quite often on OSX + Don't include PHIs when rendering spesh graph diagrams New in 2014.11 + JIT multicacheadd, multicachefind, radix_I, bindpos_n, bindpos_s, escape, blshift_i, brshift_i, write_fhs, cmp_I + Optimize out a bunch of unnecessary "set" instructions + Turn a bunch of const_s + findmeth_s into cheaper findmeth + Implement nqp::closefh_i which retuns the exit code of a pipe + Allow nativecasting a CStruct to another CStruct + Fix temp register usage in optimize_istrue_isfalse + Fix a regression by eagerly deserializing stables/objects + Added tool to colorize registers in spesh logs and another to turn spesh logs into a data-flow and control-flow graph. + Let update_ops.p6 also write a perl6 module with ops data + Add --bindir, --libdir and --mastdir as Configure options + Create pkgconfig file as pkgconfig/moar.pc New in 2014.10 + Added op nativecallglobal + Update DynASM + [Configure] document --asan option, Implement --has-linenoise, --has-dyncall and --has-dynasm + Build and install libatomic_ops conditionally + Improve usage, include environment variables. + Document bytecode directory environment flag + Add beginnings of a manual page in docs/moar.pod + Don't mark inlined locals for logging frames. + Fix crash upon trying to clone a type object. + Fix concreteness test for the reprconv + Fix handling of command line args on Win32 + Build with jit by default, add --no-jit option + Prettify --enable-jit obsoletion notice + JIT savecapture, usecapture, getobjsc, sin, cos, tan, asin, acos, atan. atan2_n, time_n, pow_n and sqrt_n, nativecallinvoke and numeric negation + Added MVM_calloc function + Make "cannot invoke" errors consistent. + Improve err msg about oob in io_read_bytes + Optimize out non-interned static callsites + Attempt interning the callsites we use in nativecall callbacks + Implement set_separator for syncfiles + Panic if MVM_platform_alloc_pages failed on posix system New in 2014.09 + Add an instrumenting profiler, recording profiling information at routine level and tracking use of specialized/JITted code and inlinings + Support profiling allocations and GC runs + Use arc4random on platforms that support it + Fix numerous warnings + JIT more big integer ops: div_I, div_In, mod_I, gcd_I, coerce_In, and bool_I + Specialization and JIT-compilation of various iteration-related instructions + JIT curcode and getcodeobj + Include filename in spesh log + Fix negative division in JIT + Mark getlexouter as not inlinable + Add mechanism for objects to get a persistent ID, used in Perl 6's .WHICH + Fix regression on PowerPC + Add missing SC write barrier to MVM_repr_bind_attr_* + JIT getattrs_* and bindattrs_* ops + JIT more string operations: indexat, findcclass, and findnotcclass + Add JIT logging of inlines + Cleanly panic if allocation fails, rather than crashing + Fix the build on ARM 32 + gcc 4.8.2 + Better style on arg count errors + Avoid unaligned reads on ARMv7 + Conditionally set include dirs and install rules (e.g. --has-libuv) + Add type finalizer support to the GC + Update libuv from 0.11.18 to 0.11.29 + Base full collections off promotion rate, often reducing full collections + Add force_gc instruction + Set up travis continuous integration + Fix mis-use of libuv: we are not supposed to open a child's pipe to our stdin + Fix pointer to pointer native cast + conditionally use/install our libtommath headers + Don't try to serialize file handles New in 2014.08 + Add support for JIT compilation on x64 (when configured with --enable-jit); supports basic arithmetic and logical operations, branching, method finding, invocation with argument passing, basic parameter handling, boxing/unboxing, attribute access, array and hash access, some big integer operations, some string operations, type checks, and more. Integrated with deoptimization, OSR (On Stack Replacement), extension ops, and exception handling. + Specialize various cases of istrue/isfalse to remove some indirections + Add charrange handling to the NFA evaluator + Update Unicode database generation script with latest string API + Add char name lookup aliases (LF, FF, CR and NEL) as line separators + Update moar-gdb.py for new structure of MVMString + Add Configure support for ASAN + Fix multi cache bug for no positionals, some nameds case + Make spesh dump show numeric literals and lexicals properly + Assorted OSR fixes for frames that deoptimized, then hit OSR points + Fix a number of SSA/dominance memory leaks + Fix memory leak in inlining + Make dead code elimination not cause unrequired guards to be kept + Add an API for extops to be involved in fact discovery and specialization + Add type and no-container facts for bigint ops + Support inlining of frames with handlers + Enable inlining of lexotic (return) handlers + Allow addition of temporary registers when specializing + Specialize boxing and unboxing of args, both named and positional + Avoid repeatedly allocating memory for NFAs + Cache frame index in MAST assembly, to avoid a linear scan + Fix various dynamic variable and inlining interaction bugs + Add a dynamic variable lookup cache + Devirtualize serialization read/write functions + Make full frame deserialization lazy, reducing memory and startup time + Handle static lexical values far more efficiently + Identify MAST nodes in assembler by exact type, cheapening assembly + Specialize smart stringify/numify into simpler ops in some cases + MAST::Label works on identify now, not name matching + Make "allocate in gen2" mode reentrant + Support lazy deserialization of static lexical values, method caches, and meta-objects + Remove some unused fields from STable + Optimize some simple control exceptions into gotos + Don't redo dead instruction elim on inlinees + Make sure inlined args are always marked as used, fixing a bug + Add an int -> str cache for 0..^64 + Add asynchronous process spawning, I/O, and killing + Check dll cache before searching through libpath, saving many stats + Make a better guess at MAST assembly output buffer sizes + Add a mechanism for debugging strand issues + Fix bug in string repeat of an already repeated strand + Complain properly about missing late-bound methods + Clear special return data more eagerly, fixing a double-free + Refactor get_storage_spec + Fix P6bigint unbox portability bug New in 2014.07 + Make default file mode 0666 + Auto-detect computed goto support and enable it when available + Implement On Stack Replacement for hot loops + Fix and enable isconcrete optimization + Use const_i64_16 in spesh-produced code for more compact output + Fix bug where [work|env]_alloc were not cleared, leading to mis-frees + Support inlining frames that use with extops + Add missing decl in header to quiet warnings + Fix logical bug in fixed-size-allocator + Fix capturelex race condition + Add missing MVMROOT in ConditionVariable setup + Don't share cached Lexotics over threads + Re-order code to avoid race on event loop startup + Add a bunch of missing MVMROOTing in asyncsocket + Make exit get out quickly + Close async sockets on event loop thread to avoid corruption + Make --no-optimize and --no-debug work in Configure + Implement (de)serializing of Array[uint] + Specialize getlexperinvtype_o (enables better roles optimization) + Allow pointer math using CPointer repr + Fix typo in CArray.elems error message + Add a cast to get rid of a warning in nativecall.c + Fix merging of inline table entries + Eliminate unused guard instructions at end of specialization + Update uthash to latest version + Correct computation of lexical vivifications + Add nativecallcast operation + Fix use-after-free bug with thread entry callsite + Cope with cross-deopt-point usage analysis + Give ContainerSpec a spesh function, use it for decont + Make various spesh things available publicly, for VM extensions + Significantly overhaul the strings code, fixing many performance issues + Optimize find_cclass and find_not_cclass New in 2014.06 + Correct closure semantics of native callbacks + Add ops for 2-possibility named parameter handling. + Start storing named argument names in callsite objects + Start interning callsites with named arguments + Specializer can turn named arg resolution to indexed lookups + Specializer can optimize named args + Specializer adds facts and guards for named args + Implement cancelling listening on a socket + Implement async bytes reads from sockets + Optimize invocation by pre-selecting callee spesh cand if possible + Pick a spesh threshold by bytecode size rather than a constant + Mark ops that are not suitable for inlining + Add an operand type for spesh slots + Implement basic inlining + Implement deoptimization of inlined calls, which uninlines + Make interp trace output more useful; include op + Have invoke/return end a basic block + Add a thread-safe fixed-size allocator + Use fixed-size allocator for frames/work/env. + Use fixed-size allocator for hash entries + Use fixed-size allocator for named used flags. + Don't refuse to spesh if we've a slurpy positional + Can do coerce_in of literals at spesh-time + Fix spesh frame handler end annotation motion in instruction deletion + Fix spesh fact marking bug New in 2014.05 + Add a libuv-managed event loop thread + Implement timers + Implement nqp::signal; support various signals + Add async read/write sections to IO op table + Implement async socket listen/connect + Implement async read/write ops + Implement chars case of async socket reads + Fix HLL mapping of type objects + Implement file watchers + Add infrastructure for cancellation + Implement cancellation of timers + stat the target of a symlink when we query for filesize + Dump deopt instruction spesh annotations + stat file descriptor in eof() when filename is unset + Serialize CStruct repr_data + Add MVMNull REPR and a singleton VMNull instance + Teach various parts of the VM about VMNull + Lazily allocate lexical containers + Optimize frame allocation + Remove BOM-discarding code from MVM_string_utf8_decode() + MVM_string_utf8_decode() should take a MVMuint8 *, not a char * + P6opaque now handles C structure member alignment, just like CStruct does + Steal P5's unlink magic for Windows; clear readonly flag when needed + Add lexical lookup lifetime hinting ops + Re-organize spesh to have log/specialize phases + Use spesh logging to emit guards into code + getlexstatic_o optimization in spesh + Better error on handler fixup failure in spesh + Implement op execname, which stores the path of the runner + Implement all vs. one deopt + Fix moving of handler annotations + Basic dumping of facts in spesh + Cope with annotations being moved to a phi + Make sure we don't clobber block handler setting in spesh + Iterate to fixed point when finding unused instructions, giving better results + Pre-invalidate all deopt target addresses, to catch fixup failures + Optimize simple calls and multi-dispatch at spesh time if possible + Add Makefile rules to generate pre-processed source + Add Makefile rules to generate assembler + Support for ARMv6. Don't try to read unaligned doubles or long longs + Ensure that MVMCompUnit can correctly free data_start + MVMStaticFrame now supports bytecode pointing to a private malloc()ed copy. + Do proper endian correction on bytecode + Add Ops for 32/16 bit 64 int literals + isnonnull op for use in spesh + turn islist/... into either isnonnull or a literal 0. + Teach spesh_diff.p6 about the new output of spesh dump + Teach spesh_diff.p6 about Facts + improve run time performance of spesh_diff.p6 + Avoid using an uninitialized variable. + Harvest strings in facts discovery process + Specialise can and can_s ops into const_i64 when possible + Change the way we store SCs in object headers to allow faster lookups of indexes + Fix bigint bitops + Ensure spesh_alloc aligns on platforms needing it + Include SC identifiers in bytecode dump + Make dump_backtrace more widely available. + Merge the bodies of MVM_sc_get_{obj,stable}_sc and *_set_* + Change serialization context indexes to be unsigned. Use ~0 as a sentinel. + Add inline functions to wrap accesses to sc.sc_idx and sc.idx + Add struct MVMSerializationIndex to hold large STable indexes + Free any allocated MVMSerializationIndex structs + Add a probe to determine the pointer size + Conditionally compile the MVMSerializationIndex for 32 bit platforms only + Allocate a MVMSerializationIndex if sc_idx would overflow in the union + Specialize getattr_[ins] on P6opaque + Fix bigint upgrade check + Optimize object attribute accesses in spesh + Spesh indirect form of attr ops with known names + Rakudo Bug #121273 fixed - losing a 0 from end of exponent + Re-arrange various structures for memory saving + Add handler infrastructure for supporting labeled loop exceptions New in 2014.04 + Brought thread ops in line with nqp:: op API + No longer inherit caller chain when starting a new thread + Fix a range of parallel garbage collection bugs + Block/unblock threads for GC while sleeping + Implement reentrant mutexes + Implemented semaphores + Implemented concurrent blocking queue support + Implement condition variables + Main thread has ID 1 now + Move nursery corruption check to after inter-thread work passing + Fix a gen2roots compaction optimization bug + Add flag '--has-sha' option to Configure to use a system SHA-1 library + GC orchestration cleanups and extra logging + Compact the gen2 overflows list + Fix decodestream_bytes_to_buf eating too much data + Added some missing MVMROOTs on config setup + Removed duplicate gen2 root cleanup call + Small cleanups to serialization + Avoid an extra level of function call in various REPR allocate functions + Add locking for IO handles + Add the Configure flags '--has-libuv and '--has-libatomic_ops' + Shortcut shr when we have a small lhs but rhs is >= 32 + Add logic to turn bytecode into SSA form, and from SSA back to bytecode + Added infrastructure for "spesh ops", to use in type-specialized bytecode + Start interning positional callsites + Keep a rough call count per static frame + Add bytecdoe specialization infrastructure + Optimize simple positional arg fetch in specialized bytecode + Resolve methods at specialization time when type is known + Add a monomorphic method cache + If MVM_SPESH_LOG is in env, log spesh work to it + Turn known-unrequired decont into set + Make MVM_SPESH_DISABLE env var disable spesh + Add :pure annotations to side-effect-free ops; eliminate dead code + Add a tool for splitting and diffing spesh log output + Add setmultispec mechanism for optimizing away only-star proto + Optimize optional positoin arguments in bytecode specialization + Optimize out istype for a spesh-time-known value or type + Optimize if_i and unless_i for known values + Corrected atan2 op signature. + Implement de-optimization on mixins + Don't lose HLL owner during serialization + Optimize away hllize when possible + Optimize away assertparamcheck when possible + Infrastructure to allow REPRs to participate in spesh + Optimize object creation in common cases with known types + Small fixes to MVM_string_(latin1|windows1252)_encode_substr + Optimize bindattr_o on P6opaque when possible. + Change the way lexotic is handled to avoid the need for allocation + Specialize empty named slurpy args. + Add a way to flag a frame as a "thunk". + Add ctx[outer|caller]skipthunks ops. + Make backtrace generation ignore thunks. + When readline/linenoise see EOF, mark handle EOF + Set hint for invokespec and multispec, improving invocation performance + Improve the VM exit strategy, so non-app-lifetime threads are waited on + Correctly handle temp roots stack in callbacks + add sched_yield for NetBSD + Fix callsite size calculation in tweak_cs + Fix buffer overflow in UTF-16 encoding + Trigger repossession on OP(push_*) + Fake up a final entry off the end of Unicode, fixing some lookup bugs New in 2014.03 + Implement a fast-path for string strand flattening + Fix character lookup by name sometimes giving wrong result + Control and printable now know about Latin-1 control characters + Fix bug in Latin-1 handling + Fix and optimize various character property lookups + Implement lookup of non-boolean Unicode properties + Implement character code to name lookup + Implement lookup of enum/stringy Unicode properties + Fix memory leak of active handlers in continuations + Clear up gen2 memory at exit + Clear up frame pool at exit + Don't leak static frame instruction offsets + Fix memory leak in MVMHash + Simplified/optimized frame reference count handling in continuations + Fixed missing exception resume reference count decrement + Correct "on stack" continuation reference count handling + Add missing cleanup in MAST assembler + Fixed used named args tracking memory leak + Fixed SEGV in eof of non-file-based filehandle + Pass STDIN to subprocess in shell() + Fixed resolution of IPv6 host names + Implemented native calling + Implemented CPointer representation + Implemented CArray representation + Implemented CStruct representation + Improve GDB plug-in string usage analysis + Make GDB plug-in aware of gen2 overflows + Clean-up and optimization of many REPR allocate functions + Fixed over-eager / to \ conversion in nqp::shell on Windows + Implemented native callbacks + Correct copy size of args buffer, avoiding reading unmapped memory + Updated to new liblinenoise and re-instated usage of it + Bump dyncall to latest version + Add --has-libtommath option to Configure for using system libtommath New in 2014.02 + Increased precision of num => str coercion + Mechanism for per-HLL handling of method resolution errors + Gave can the same null-check semantics as findmethod + Fixed various "not found" lexical lookup semantics + Use a more efficient encoding for integers in the serialization blob + Implemented reposession conflict resolution handling for objects + Optimized GC worklist processing to avoid unrequired barriers + Added a GDB plugin to help analyse VM data structures, heap use, etc. + Zeroed memory in a few places, to avoid reading junk and quiet Valgrind + Simplified and fixed UTF-16 encoding + Implemented unsigned native integer array support + Added various missing write barriers on STables + Added openpipe functionality, to support qx/qqx in Perl 6 + Corrected accidental and potentially explosive use of REPR(...) on STables + Switched to using flag bits to mark liveness in GC + GC forwarder pointer used in nursery now overwrites existing object body, saving 4 or 8 bytes on every collectable object + Added various GC sanity checking asserts to aid debugging + Encapsulated all serialization context accesses + Defined NDEBUG in optimized builds + P6bigint no longer uses libtommath for integers fitting within 32 bits + Optimized serialization of P6bigints fitting within 32 bits + Implemented link and symlink + Fixed mod_n op's behavior on negatives + Implemented floating point fallback case of the pow_I op + Fixed srand op to also control rand_I + Initialize the random seed at startup + Properly clean up active handlers that we unwind over + Radix parsing now returns an array of integers, not floating point + Huge refactor of I/O, fixing many bugs and leading to cleaner code + Proper handling of characters split over byte buffer boundaries in I/O + Corrected Latin-1 to be Latin-1, and added Windows-1252 encoding + Added a constant cache for boxing integers 0 through 15 + Properly implemented synchronous client and server TCP socket support + Better estimate and perhaps shrink string memory for UTF-8 decode + Added probing to Configure to learn how the compiler does 'static inline' + Switched many macros over to static inline functions MoarVM-2015.11/docs/README.md0000644000175000017500000000026412456307241014265 0ustar jnthnjnthn## Historical Design Docs These documents are mostly of historical interest for the heavy design phases of MoarVM, but may also be useful for understanding its current operation. MoarVM-2015.11/docs/arg-passing.markdown0000644000175000017500000001155712456307241016774 0ustar jnthnjnthn# Argument Passing Every invocation in MoarVM consists of two pieces: * A static Callsite descriptor (MVMCallsite), which incorporates the number of arguments along with a set of flags about what is being passed. * A contiguous group of MVMRegister, which is a union type. This contains the actual arguments being passed. The static descriptor indicates how to process the registers. As they are registers, they really are just a chunk of the register space in the caller, thus anything that wants the args for a longer period of time must work to keep them. ## Memory management Callsite descriptors are kept at a compilation unit level, and thus their lifetimes are simply that of the compilation unit. (An alternative way would be to keep a global store of these and intern them, fixing up all of the references to them at bytecode loading time.) The argument data itself is more subtle. A simple approach would be to allocate the argument data array per call, but that's too much allocation for the common case. Thus each callframe, along with its working space, also allocates an amount of space equal to that required by the most demanding callsite (that is, the one that implies the most storage). This space is populated with arguments per call, and a pointer passed to the invocation target. This area of memory will clearly never be safe to consider beyond the point that the callee yields control. Control is yielded by: * Returning * Yielding co-routine style * Calling anything that will potentially do co-routine or continuation stuff Typically, though, an argument processor immediately copies what was passed into locals, lexicals and so forth. It may need to make its own copy of the original arguments if: * It wants to keep them around and present them "first class" (a bit like Perl 6 does with Captures, in order to do nextsame et al.) * Part way through processing them, some other code needs to be run in order to obtain default values, build up data structures, etc. A language that doesn't need to worry about such matters will generally be able to avoid any of the copying. A language like NQP will be able to avoid it perhaps entirely, by handling default values after the initial binding. A language like Perl 6 will generally need to default to copying, but a decent optimizer should be able to whitelist routines where it's OK not to. Many simple built-in operators should make the cut, which will take the edge off the cases where compile-time inlining isn't possible. ## Call Code Generation A call looks something like: prepargs callsite # set the callsite argconst_i 0, 42 # set arg slot 0 to native int arg 42 arg_o 1, r0 # set arg slot 1 to object in register 0 call r1 # invoke the object in r1 The bytecode loader will analyse the callsite info, and ensure that between it and the call all of the required slots are given values, and that these are of the correct types. This is verified once when the bytecode is loaded, and at execution time needs no further consideration. Note that there's no reason you can't have things like: prepargs callsite # set the callsite argconst_i 0, 42 # set arg slot 0 to native int arg 42 get_lex_named r0, '$x' # load lexical "$x" by name into register 0 arg_o 1, r0) # set arg slot 1 to object in register 0 call r1 # invoke the object in r1 That is, do lookups or computations of arguments while building the callsite. However, it is NOT allowable to nest prepargs/call sequences in the bytecode. There is only one chunk of memory available to store the arguments. Thus a call like: foo(bar(42)) Will have to store the result of bar(42) in a register, then prepargs..call for foo(...) afterwards. # Parameter Handling While some languages may have their own binding support driven by their own signature objects, the core instruction set provides a mechanism that should handle most needs. Parameter handling may start with a use of the checkarity op, specifying the minimum and maximum number of positional arguments that may be passed. checkarity 1, 1 # require 1 argument checkarity 2, 3 # require 2 arguments, accept up to 3 (1 optional) Required positional arguments can then be obtained by type: param_rp_o r0, 0 # get 1st positional argument, which is an object param_rp_s r1, 1 # get 2nd positional argument, which is a string Optional positional arguments are fetched by a range of similar ops, except that they include a branch offset (that is, a label). If the argument is present, it is put into the register and we jump to the branch offset. If not, the next instruction is executed, which presumably is code to populate the register with a default value. param_op_i r2, 2, L1 const_i64 r2, 0 L1: The handling of named arguments is similar, with both required and optional variants of the ops. MoarVM-2015.11/docs/bootstrap.markdown0000644000175000017500000000323312456307241016566 0ustar jnthnjnthn# 6model Bootstrap (run-time) MoarVM is based around the 6model object system. This must be bootstrapped as pretty much the first thing that the VM does after startup. ## Bootstrap Procedure The bootstrap is done something like this. * Create a type object that will become VMString, the VM's core string type. It will have no meta-object yet, and the STable will not be filled out. It will use the MVMString representation. * Populate the representations table and name to ID hash. This includes setting up all of the representation function tables. We needed the VMString first, as representation function tables contain the representation name in string form. * Create a type object BOOTArray, the VM's core array type. It will have the MVMObjectArray representation. Again, there's no meta-object just yet. * Create a type object BOOTHash, the VM's core hash type. It will have the MVMHash representation. Still no meta-objects. * Create a type object BOOTCCode, the VM's core code type for things implemented inside the VM in C (typically, just a very small number of bootstrap things). It will have the MVMCFunction representation. Still no...yeah, you got it. :-) * At this point, we finally have enough to bootstrap KnowHOW, the most primitive object type. This involves the KnowHOWREPR representation. * Finally, the various BOOT type objects get meta-objects pieced together, which are KnowHOWs. Note that it almost certainly doesn't offer any real functionality; the point is just to get a clean bootstrap with nothing left dangling. Beyond that, there's nothing left to do in the VM core; all other objects are set up from code running atop of the VM. MoarVM-2015.11/docs/bytecode.markdown0000644000175000017500000004365312456307241016361 0ustar jnthnjnthn# Bytecode This document describes the bytecode that the VM interprets or JIT compiles. Note that this is just one part of an input file to the VM; along with it will also be a bunch of serialized objects, and some container. This just describes the way the executable segment of things look. (In a sense, this is the low-level reification of the Actions/World distinction at the level of the compiler). ## Endianness All integer values are stored in little endian format. ## Floats Floating point numbers are represented according to IEEE 754. ## Header The header appears at the start of the MoarVM bytecode file, and indicates what it contains. +---------------------------------------------------------+ | "MOARVM\r\n" | | 8-byte magic string; includes \r\n to catch mangling | | of line endings | +---------------------------------------------------------+ | Version | | 32-bit unsigned integer; since we'll never reach a | | huge number of versions, this also doubles up as a | | check that no weird big/little endian issues keep us | | from reading the bytecode. | +---------------------------------------------------------+ | Offset (from start of file) of the SC dependencies | | table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the SC dependencies table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the extension ops table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the extension ops table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the frames data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of frames we should end up finding in the frames | | data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the callsites data | | segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of callsites we should end up finding in the | | callsites data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the strings heap | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the strings heap | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the SC data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the SC data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the bytecode segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the bytecode segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the annotation segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the annotation segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | HLL Name | | 32-bit unsigned integer index into the string heap, | | providing the name of the HLL this compilation unit | | was compiled from. May be the empty string. | +---------------------------------------------------------+ | Main entry point frame index + 1; 0 if no main frame | | 32-bit unsigned integer | +---------------------------------------------------------+ | Library load frame index + 1; 0 if no load frame | | 32-bit unsigned integer | +---------------------------------------------------------+ | Deserialization frame index + 1; 0 if none | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Strings heap This segment contains a bunch of string data. Each string is laid out as: +---------------------------------------------------------+ | String length in bytes | | 32-bit unsigned integer | +---------------------------------------------------------+ | String data encoded as UTF-8 | | Bunch of bytes, padded at end to 32 bit boundary | +---------------------------------------------------------+ ## SC Dependencies Table This table describes the SCs that the bytecode in this file references objects from. The wval opcode specifies an index in this table and and index in the SC itself. When the bytecode file is first loaded, we look in the known SCs table and resolve all that we can. Then, the deserialize code for the compilation unit is run. Whenever the SC creation opcode is used, we search all known compilation units to see if they have any unresolved SCs, and fill in any gaps that correspond to the newly created SC. By the time the deserialize phase for a compilation unit is over, we expect that all SCs have been resolved. Thus, the lifetime of an SC is equal to the lifetimes of all the compilation units that reference it, since their code depends on it. Note that the primary way an SC is rooted is through a compilation unit, and that these roots are established as soon as it is created, and before it's returned to userspace (which could allocate more) are the way we make sure it isn't collected too early. +---------------------------------------------------------+ | Index into the string heap of the SC unique ID | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Extension ops table +---------------------------------------------------------+ | Index into the string heap of the extension op ID | | 32-bit unsigned integer | +---------------------------------------------------------+ | Operand descriptor | | Bunch of bytes describing a single operand each, | | zero-padded to 8 bytes | +---------------------------------------------------------+ The operand descriptor follows the same format as used by MVMOpInfo. The 8 bytes limit corresponds to MVM_MAX_OPERANDS. ## Frames Data The frames data segment contains data that describes all of the frames in the compilation unit. It also points into the bytecode segment, which contains the bytecode we will execute for this frame. This is stored elsewhere at least partly for the sake of demand paging and CPU cache efficiency; once we processed the static data, it's not very interesting at runtime, so there's no real reason for it to stay in memory, let alone be cached by the CPU. The actual bytecode itself, on the other hand, is (at least until JIT happens) of interest for execution. Each frame starts with the following data. +---------------------------------------------------------+ | Bytecode segment offset | | 32-bit unsigned integer | +---------------------------------------------------------+ | Bytecode length in bytes | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of locals/registers | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of lexicals | | 32-bit unsigned integer | +---------------------------------------------------------+ | Compilation unit unique ID | | 32-bit string heap index | +---------------------------------------------------------+ | Name | | 32-bit string heap index | +---------------------------------------------------------+ | Outer | | 16-bit frame index of the outer frame. For no outer, | | this is set to the current frame index. | +---------------------------------------------------------+ | Annotation segment offset | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of annotations | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of handlers | | 32-bit unsigned integer | +---------------------------------------------------------+ | Frame flag bits | | 16-bit integer | | 1 = frame has an exit handler | | 2 = frame is a thunk | | Remaining values reserved | | [NEW IN VERSION 2] | +---------------------------------------------------------+ | Number of entries in static lexical values table | | 16-bit integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ | Code object SC dependency index + 1; 0 if none | | 32-bit unsigned integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ | SC object index; ignored if above is 0 | | 32-bit unsigned integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ This is followed, for each local, by a number indicating what kind of local it is. These are stored as 16-bit unsigned integers. int8 1 int16 2 int32 3 int64 4 num32 5 num64 6 str 7 obj 8 Lexicals are similar, apart from each entry is preceded by a 32-bit unsigned index into the string heap, which gives the name of the lexical. [Conjectural: a future MoarVM may instead do these in terms of REPRs.] Next comes the handlers table. Each handler has an entry as follows: +---------------------------------------------------------+ | Start of protected region. Inclusive offset from start | | of the frame's bytecode | | 32-bit unsigned integer | +---------------------------------------------------------+ | End of protected region. Exclusive offset from start of | | the frame's bytecode | | 32-bit unsigned integer | +---------------------------------------------------------+ | Handler category mask bitfield | | 32-bit unsigned integer | +---------------------------------------------------------+ | Handler action (see exceptions spec for values) | | 16-bit unsigned integer | +---------------------------------------------------------+ | Register number containing the block to invoke, for a | | block handler. | | 16-bit unsigned integer | +---------------------------------------------------------+ | Handler address to go to, or where to unwind to after | | an invoked handler. Offset from start of the frame's | | bytecode. | | 32-bit unsigned integer | +---------------------------------------------------------+ From version 4 and up, this is followed by a static lexical values table. Each entry is as follows: +---------------------------------------------------------+ | Lexical index | | 16-bit unsigned integer | +---------------------------------------------------------+ | Flag | | 16-bit unsigned integer | | 0 = static lexical value | | 1 = container var (cloned per frame) | | 2 = state var (cloned per closure) | +---------------------------------------------------------+ | SC dependency index | | 32-bit unsigned integer | +---------------------------------------------------------+ | SC object index | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Callsites Data This data blob contains all of the callsite descriptors that are used in the compilation unit. At the point of loading the bytecode, they will be set up, and a table pointing to them created. This means that a callsite descriptor will always be a pointer + offset away. Each callsite consists of a 16-bit unsigned integer indicating the number of argument flags. This is followed by the flags, taking 8 bits each. If the number of argument flags is odd, then an extra padding byte will be written afterwards. Since version 3, this is then followed with one index to the string heap (in the form of a 32-bit integer) for each argument flag that has the `MVM_CALLSITE_ARG_NAMED` bit set. ## Bytecode segment This consists of a sequence of instructions. Instruction codes are always 16 bits in length. The first 8 bits describe an instruction "bank", and the following 8 bits identify the instruction within that bank. Instruction banks 0 through 127 are reserved for MoarVM core ops or future needs. Instruction banks 128 through 255 are mappable per compilation unit, and are used for "plug-in" ops. Opcodes may be followed by zero or more operands. The instruction set will have the needed operands described by the following set of descriptors. r local variable index being read, 16 bits unsigned w local variable index being written, 16 bits unsigned rl lexical variable being read, 16 bits unsigned for the index within a frame and 16 bits for how many frames out to go to locate it wl lexical variable being written, 16 bits unsigned for the index within a frame and 16 bits for how many frames out to go to locate it i16 16-bit integer constant i32 32-bit integer constant i64 64-bit integer constant n32 32-bit floating point constant n64 64-bit floating point constant si Strings table index, 32 bits unsigned sci Serialization Context object table index, 16 bits unsigned csi Callsite table index, 16 bits unsigned ins Instruction offset from frame start (for goto), 32 bits unsigned Note that this ensures we always keep at least 16-bit alignment for ops. Some instructions place demands on the type of value in the register. This is perhaps most noticable when it comes to integers of different sizes; all computations are done on them in full-width (64-bit) form, and loading/storing them to registers representing locals of more constrained sizes needs explict sign extension and truncate ops. Wherever a register is specified, the kind of value in it is also indicated. These are typechecked *once*, either at bytecode load time or (perhaps better) on the first execution. After that, all future interpreter executions can just plow through the instructions without ever having to do checks. The set of ops is listed in src/core/oplist. ## Annotation segment This consists of a number of 10-byte records, composed of: * 32-bit unsigned integer offset into the bytecode segment * 32-bit unsigned integer strings heap index (filename) * 32-bit unsigned integer (line number) MoarVM-2015.11/docs/exceptions.markdown0000644000175000017500000002343712456307241016742 0ustar jnthnjnthn# Exceptions Exceptions in MoarVM need to handle a range of cases. There exist both control exceptions (last/next/redo) where we want to reach the handler in the most expedient way possible, unwinding the stack as we go, and probably just do a goto instruction. In these cases, we don't expect to need any kind of exception object. At the other end of the scale, there are Perl 6 exceptions. These want to run the handler in the dynamic scope of the exception, and potentially resume rather than unwinding. These differences are properties of the handler rather than the exception; a CONTROL is interested in being run on the stack top when a "next" reaches it, whereas a while loop's handler for that just wants control delivered to the appropriate place. ## Handlers Handlers are associated with (static) frames. A handler consists of: * The start of the protected region (an offset from the frame's bytecode start) * The end of the protected region (an offset from the frame's bytecode start) * An exception category filter: * 1 = Catch Exception * 2 = Control Exception * 4 = Next * 8 = Redo * 16 = Last * 32 = Return * 64 = Unwind (triggers if we unwind out of it due to an exception being thrown; normal block exits do not cause this) * A handler action * 0 = Unwind any required frames, then goto the specified address. It is not possible to get any exception object or do any kind of rethrow. * 1 = Unwind any required frames, then goto the specified address. An exception object is available. This kind of handler leaves a handler record active on the stack, which the handler should remove by doing a rethrow or making the exception handled. * 2 = Invoke the specified block, and unwind unless it chooses to resume. Once the block returns, the handler is over. * In the case of a goto address handler, the offset of the handler * In the case of a block handler, the register in the frame that holds the block to invoke. The block should take no parameters. A bitwise `and` between the category filter and the category of the exception being thrown is used to check if the handler is applicable. Note that an Unwind handler is never actually set as the category of an exception; these are just for triggering actions during unwinds due to other exceptions. In the case of an unwind handler, the current exception is thus the one to blame for the unwinding. It is expected that an unwind handler will always rethrow once it's done what is needed. ## Handler representation in MAST The MAST::HandlerScope node indicates the instructions covered by handler and details of the kind of handler it is. See the MAST node definitions for more. ## Handler representation in bytecode Handlers are stored per frame and listed in a table. It is important that more deeply nested handlers appear in the table earlier than those lexically outer to them. This is really a job for the MAST to Bytecode compiler, since the MAST encodes the structure as nested nodes. Really, though, it's just a case of writing an entry into the frame's table after the node has been processed. See the bytecode specification for details. ## Exception Objects Some opcodes exist for creating exception objects and working with them. An exception object is anything with the VMException representation. Note that most HLLs will wish to attach their own objects as the payload. ### exception w(obj) Gets the exception currently being handled. Only valid in the scope of handler. ### handled r(obj) Marks the specified exception as handled. Only valid in the scope of a handler for the specified exception. Also, only required for goto handlers that also include an exception object. ### newexception w(obj) Creates a new exception object, based on the current HLL's configured exception type object or using BOOTException otherwise. By default it has an empty message and a category of 1 (a catch exception). ### bindexmessage r(obj), r(str) Sets the exception object's string message. ### bindexpayload r(obj), r(obj) Sets the exception object's payload (some other object). ### bindexcategory r(obj), r(int64) Sets the exception object's category ### getexmessage w(str), r(obj) Gets the exception object's string message. ### getexpayload W(obj), r(obj) Gets the exception object's payload. ### getexcategory w(int64), r(obj) Gets the exception object's category ## Throwing Exceptions There are various instructions for throwing a new exception object. throwdyn w(obj) r(obj) throwlex w(obj) r(obj) throwlexotic w(obj) r(obj) There are also instructions for throwing a particular category of exception without first creating an exception object. throwcatdyn w(obj) int64 throwcatlex w(obj) int64 throwcatlexotic w(obj) int64 These will only produce an exception object for handlers that need it. The object that is produced will have a null message and payload, so only its category will be of interest. These are mostly intended for control exceptions. Finally, for convenience, there is also: die w(obj) r(str) Which creates a catch exception with a string message and throws it. One may wonder why all of these throw instructions take a register to write into. This is because a handler that invokes in the dynamic scope of the throw has the option to prevent stack unwinding by instead indicating that execution be resumed. When it does so, it specifies an argument for the resumption; this argument is then written into the register should resumption take place. As for the dyn/lex/lexotic difference: * dyn means "search caller" * lex means "search outer", with the caveat that the outer must also be on the caller chain too * lexotic combines the two; for each entry in the dynamic scope, we scan all outers from that point; note that such an outer should also be in the call chain ## Rethrowing Sometimes, a handler may want to look at an exception, see if it's what it expects to handle, and if not pass it along as if the handler never saw it. This is the job of rethrow. A rethrow may only be used on the exception currently being handled. It is a simple instruction: rethrow Since it's always about the exception for the current handler, there's no need to say what should be rethrown. ## Goto handlers that access exception objects and may rethrow A goto handler that is allowed to get the exception object and/or rethrow it must mark the point they consider the handler over in the case they do not rethrow. The op for this is simply: handled r(obj) Note that if, while the handler is active, another exception is thrown and unwinds the stack past this handler, that's fine. ## Overall mechanism A stack of current handlers is maintained. Note that this is handlers we've actually invoked as the result of an exception being thrown (there may be many handler scopes that we are in, but only those that are presently handling exceptions get an entry on the stack). When we search for handlers to invoke, any active handler is automatically skipped, so that a handler can never catch an exception thrown within it. Otherwise, you can easily imagine a mass of hangs. When an exception is thrown, some pieces of information are initially needed: * The category, CAT * The exception object, OBJ * How to search (dyn, lex, lexotic), MODE * The current scope, SCOPE * The curent thread's active handler stack, HSTACK Here is the overall algorithm in pseudo-code. XXX TODO: Finish this up. :-) search_frame_handlers(f, cat): for h in f.handlers if h.category_mask & cat if f.pc >= h.from && f.pc < h.to if !in_handler_stack(HSTACK, h) return h return NULL search_for_handler_from(f, mode, cat) if mode == LEXOTIC while f != NULL h = search_for_handler_from(f, LEX, cat) if h != NULL return h f = f.caller else while f != NULL h = search_frame_handlers(f, cat) if h != NULL return h if mode == DYN f = f.caller else if f == LEX f_maybe = f.outer while f_maybe != NULL && !is_in_caller_chain(f, f_maybe) f_maybe = f_maybe.outer f = f_maybe return NULL run_handler(h, target_scope) if h.mode == 0 unwind_to(target_scope) pc = h.goto return_to_runloop if h.mode == 1 unwind_to(target_scope) pc = h.goto push_handler(h, target_scope) return_to_runloop if h.mode == 2 unwind_to(target_scope) push_handler(h, target_scope) SCOPE.return_special = ... SCOPE.return_special_data = ... invoke(get_reg(target_scope, h.local_idx)) return_to_runloop if h.mode == 3 push_handler(h, target_scope) SCOPE.return_special = ... SCOPE.return_special_data = ... invoke(get_reg(target_scope, h.local_idx)) return_to_runloop panic_unhandled(scope, obj): note "Unahndled exception: " + obj.message note backtrace(scope) exit 1 panic_unhandled_cat(scope, cat): note "Unahndled exception of category " + category_name(cat) note backtrace(scope) exit 1 throw(mode): (h, target_scope) = search_for_handler_from(SCOPE, mode, CAT) if h == NULL panic_unhandled_cat(SCOPE, CAT) run_handler_(h, target_scope, obj) throwcat(mode): (h, target_scope) = search_for_handler_from(SCOPE, mode, CAT) if h == NULL panic_unhandled_cat(SCOPE, CAT) run_handler_(h, target_scope, NULL) handled(): HSTACK.pop() MoarVM-2015.11/docs/extops.markdown0000644000175000017500000003111512456307241016073 0ustar jnthnjnthn### Extensions and Extension Ops [proposed/tentative] #### The MoarVM Opcodes Overview The MoarVM interpreter uses 16-bit opcodes. There are currently around 470 built-in ops, and it'll probably be around 500 once Rakudo's bootstrapped and passing spectest. The interpreter loop currently dispatches by op number, either using switch/case or cgoto where available. Many opcodes are self-contained (they don't call other C functions, and some don't even make system calls), but lots and lots of them do call functions. Since the ./moar binary is statically-linked (mostly), the link-time code generation and optimization by modern compilers should do a pretty good job of making such things optimal [please excuse the truism]. However, in the case of dynamically loaded extensions to the VM that need to dynamically load native libraries with a C ABI (nearly all native libraries have a build that exposes such a thing), the function pointers must be resolved at runtime after the library is loaded. Perl 6's NativeCall module (using dyncall on parrot) can load libraries by name and enumerate/locate entry points and functions by name. I propose to use the dyncall functionality to load MoarVM extensions and resolve function pointers. The following is a draft design/spec doc for how that might look: ---------------------------------------------------------------- #### Representing Extension Op Calls on Disk and in Memory In a table in the .moarvm disk representation of the bytecode, each extension op invoked from that compilation unit has an entry with: 1. a (16-bit) index into the string heap representing the fully-qualified (namespace included) name of the op, and 2. the op signature, a byte for each operand, zer-padded to 8 bytes. In the in-memory (deserialized) representation of the compilation unit, each record also has room to store the cache of the function pointer representing the C function to which the op was resolved. Each distinct op called from that compilation unit is encoded in the executable bytecode as its index in the extension op table plus 1024 (the first 1024 being reserved for MoarVM itself). #### Loading Code That Calls Extension Ops During bytecode validation (on-demand upon first invocation of a frame), when the validator comes across an opcode >= 1024, it subtracts 1024 and checks that the resulting index is less than the number of extension op calls proscribed by the compunit. Then it gets that extop call record (MVMExtOpCall) from the table, and if the record has a function pointer, it calls it with the sole arg (MVMThreadContext tc). If the function call slot is NULL, it means the function pointer hasn't been resolved for this compunit, but also that the signature hasn't yet been validated against the version of that opcode that was loaded by its dependencies (if it was!). First the validator does a hash lookup to check whether the extop has been loaded at all (this requires a mutex protection, unless we're by then using a lock-free HLL hash for this), then if it hasn't, it throws a bytecode validation exception. If it has been loaded (by itself or by a dependency), it compares the signatures of the call in the compunit whose frame is being validated against the signature of the loaded op by that name, and if they don't match, throw a bytecode validation exception: "extension op call signature mismatch - the op's old signature (xxxx) was deprecated? You tried to load a call with signature ." If the signatures matched, operand type validation of the actual passed parameters (register indexes) proceeds normally, using the extop's signature. The validator copies the function pointer from the process-wide registry into the in-memory record of the extop call in that compunit. #### Loading Extensions When a compilation unit is loaded, its "load" entry point routine calls its INIT block (if it has one), which does something like the example below, registering the native function pointers and their signatures with the runtime. It communicates with the runtime via the currently-compiling compiler (as there is generally a World-aware HLL compiler calling ModuleLoader). To start, it simply uses NativeCall to fetch each function pointer (but there are plenty of optimization opportunities there). #### Examples The below example purports to show the contents of a skeleton extension as it would look to a developer. (please excuse incorrect syntax; it's pseudo- code in some places. ;) helper package (part of the MoarVM/NQP runtime) - MoarVM/CustomOps.p6: ```Perl package MoarVM::CustomOps; use NativeCall; # If we're compiling the innermost layer (and not just loading it at INIT time) # at *compile-time* of the compilation unit surrounding the INIT block we # assume we are in, inject the symbol into the innermost World outside of us. # ALSO, do the same thing at INIT-time (using nqp::extop_install) when we have # already been compiled, as well as when we're compiling. sub install_ops($library_file, $c_prefix, $op_prefix, $names_sigs) is export { my $world = nqp::hllcompilerworld; my $opslib = native_lib($library_file); -> $name, $sig { my $fqon = "$op_prefix::$name"; nqp::extop_install($opslib, $fqon, "$c_prefix$name", $sig); $world.extop_compile($fqon, $sig) if $world.is_compiling; } for $names_sigs; } ``` Above, the nqp::hllcompilerworld op simply retrieves an appropriately named dynamic lexical of the current in-flight World object. That class will have an HLL method named extop_compile, detailed below. Notice the helper package uses NativeCall to find the function pointers via the native_function (or whatever it's named) routine. When each function pointer is passed to the extop_compile method of the in-flight World object, that method in the HLL compiler will pass the function pointer to a special internal opcode (nqp::extop_install) that takes the NativeCall library object, the fully qualified name of the op as it will appear in the HLL source code (namespace ::opname), and a string representing the register signature (a la parrot's op signatures), so the bytecode validator knows how to validate its register args. ```Perl class World { # NQP snippet # at *compile-time* of the compilation unit surrounding the INIT block # we assume we are in, inject the symbol into the innermost World outside of # us. method extop_compile($fqon, $addr, $sig) { my $cu := self.current_compunit; my %extops := $cu.extop_calls; nqp::die("op $fqon already installed!") if nqp::has_key(%extops, $fqon); nqp::push($cu.extop_table, $fqon); %extops{$fqon} := $cu.next_extop++; } ``` Since the custom ops are resolved "by name" (sort of) upon bytecode loading, we don't have to worry about Rakudo bootstrapping, since in order to install the custom ops for Rakudo, we can simply rely on the compiler (in NQP) to generate the appropriate loading/installing code. core/bytecode.c excerpt - nqp::extop_install: ```C #include "moar.h" typedef struct _MVMExtOpRecord { /* name of the op, including namespace:: prefix */ MVMString *opname; /* string representing signature */ MVMString *signature; /* the function pointer (see below for signature/macro) */ MVMCustomOp *function_ptr; /* number of bytes the interpreter should advance the cur_op pointer */ MVMint32 op_size; /* (speculative/future) function pointer to the code in C that the JIT can call to generate an AST for the operation, for super-ultra-awesome optimization possibilities (when pigs fly! ;) */ /* MVMCustomOpJITtoMAST * jittomast_ptr; */ /* so the record can be in a hash too (so a compiler or JIT can access the upper code at runtime in order to inline or optimize stuff) */ UT_hash_handle hash_handle; } MVMExtOpRecord; /* Resolve the function pointer and nstall the op at runtime. */ void MVM_bytecode_extop_install(MVMThreadContext *tc, MVMObject *library, MVMString *opname, MVMString *funcname, MVMString *signature) { /* TODO: protect with a mutex */ /* must also grab thread creation mutex b/c we have to update the tc->interp_customops pointer of all the threads */ MVMCustomOp *function_ptr = NULL; MVMExtOpRecord *customops, *customop; MVMuint16 opidx = tc->instance->nextcustomop++; void *kdata; size_t klen; MVM_HASH_EXTRACT_KEY(tc, &kdata, &klen, opname, "bad String"); HASH_FIND(hash_handle, tc->instance->customops_hash, kdata, klen, customop); if (customop) MVM_panic(tc, "already installed custom op by this name"); customops = tc->instance->customops; if (customops == NULL) { customops = tc->instance->customops = calloc( sizeof(MVMExtOpRecord), (tc->instance->customops_size = 256)); } else if (opidx == tc->instance->customops_size) { customops = tc->instance->customops = realloc(tc->instance->customops, (tc->instance->customops_size *= 2)); memset(tc->instance->customops + tc->instance->customops_size/2, 0, tc->instance->customops_size / 2 * sizeof(MVMExtOpRecord)); } customop = customops + opidx; customop->opname = opname; customop->signature = signature; customop->op_size = MVM_bytecode_extop_compute_opsize(tc, signature); /* use the NativeCall API directly to grab the function pointer using the cached library object */ customop->function_ptr = MVM_nativecall_function_ptr(tc, library, funcname); /* the name strings should always be in a string heap already, so don't need GC root */ HASH_ADD_KEYPTR(hash_handle, tc->instance->customops_hash, kdata, klen, customop); } ``` core/interp.c excerpt - the invocation of nqp::customopcall's replacements: ```C MVMExtOpRecord *customops = tc->instance->customops; tc->interp_customops = &customops; #define EXTOP_OFFSET 4096 case MVM_OP_BANK_16: case MVM_OP_BANK_17: ... case MVM_OP_BANK_126: case MVM_OP_BANK_127: { MVMExtOpRecord *op_record = &customops[*(MVMuint16 *)cur_op++ - EXTOP_OFFSET]; MVMCustomOp *function_ptr = op_record->function_ptr; function_ptr(tc); cur_op += op_record->op_size; break; } ``` example extension (loading the rakudo ops dynamically) - Rakudo/Ops.p6 (or NQP): ```Perl package Rakudo::Ops; INIT { use MoarVM::CustomOps; install_ops('rakudo_ops.lib', 'MVM_rakudo_op_', 'rakudo', [ 'additivitation', 'iii', 'concatenationize', 'sss', ]); } # Both at compile-time and run-time of the below code, INIT will have run # and the following ops are installed the right namespaces and such. my $z = rakudo::concatenationize(rakudo::additivitation(44, 66), "blah"); # note: since the types of the custom ops' operands are known to the # HLL compiler, it just does its normal thing of generating code to # auto-coerce the resulting integer from the addition to a string # for the concat custom op. ``` moar.h excerpt (note the injecting of 1 offset if it's not the result reg): ```C #define REG(idx) \ (reg_base[*((MVMuint16 *)(cur_op + ((idx) > 0 ? idx + 1 : 0)))]) ``` Note: The type checks should be compile-time optimized-away by all but the stupidest of C compilers. Though they fail at runtime, I consider that "fail fast" enough, as this is simply a best-effort attempt at a coder convenience type-check, not a rigorous one to actually enforce that the register type signature passed to the runtime opcode installation routine in the HLL code actually matches the one defined/used in the C source code. moar.h excerpt (continued): ```C #define MVM_CUSTOM_OP(opname, block) \ \ void opname(MVMThreadContext *tc) { \ MVMuint8 *cur_op = *tc->interp_cur_op; \ MVMRegister *reg_base = *tc->interp_reg_base; \ MVMCompUnit *cu = *tc->interp_cu; \ block; \ } typedef MVM_CUSTOM_OP((*MVMCustomOp)); ``` rakudo_ops.c ```C #include "moar.h" MVM_CUSTOM_OP(MVM_rakudo_op_additivitation, { REG(0).i = REG(1).i + REG(2).i; }) MVM_CUSTOM_OP(MVM_rakudo_op_concatenationize, { REG(0).s = MVM_string_concatenate(tc, REG(1).s, REG(2).s); }) ``` validation.c excerpt (verify extop arg types and inline the real oprecord offsets): ```C /* similar to the actual interpreter, grab the MVMExtOpRecord, but simply validate each operand type specified for the extop with the types and count of the registers specified in the bytecode, by enumerating each character in the signature. If it hasn't been checked already, compare the signature of the loaded extop by that name against the signature of the extop by that name that was stored in the compilation unit when it was loaded from disk, if it was. Cache the function pointer if it wasn't already. */ ``` MoarVM-2015.11/docs/gc.markdown0000644000175000017500000000603412456307241015144 0ustar jnthnjnthn# Garbage Collection in MoarVM Garbage collection in MoarVM can be characterized as: * Generational (two generations, the young one being know as the nursery) * Parallel (multiple threads may participate in GC) * Semi-space copying (only in the young generation) * Stop the world (all threads are paused while collection takes place) * Precise (we always know what is a pointer and what is not) Finalization calls to free non-garbage-collectable resources happen asynchronously with mutator execution. ## Thread Locality Every thread has its own semi-space nursery and generation 2 size-separated area. This is so it can do bump-pointer allocation and promotion to gen-2 without the need for synchronization during execution, and also as most objects will be thread-local. This doesn't mean objects cannot be accessed by other threads or have their only living reference known just by an object in another thread's memory space. ## How Objects Support Collection Each object has space for flags, some of which are used for GC-related purposes. Additionally, objects all have space for a forwarding pointer, which is used by the GC as it goes about copying. ## How Collection Is Started For collection to begin, all threads must be paused. The thread that wishes to initiate a collection races to set the in_gc flag in the MVM_Instance struct. If it succeeds, it then visits all other threads and flags that they must suspend execution and do a GC run. If it fails, then it was at a GC-safe point anyway, so it just waits for everyone else to be. At each GC-safe point, threads check in their thread-context struct to see if a GC run needs to be started. It indicates that it has paused, and then proceeds to add any relevant thread-local roots to the thread's work list. Note that any roots that could possibly be touched by another thread must NOT be scanned at this point, as another mutator thread could still be running and modify them, creating potential for lost references. Once all threads indicate they have stopped execution, the GC run can go ahead. ## Nursery Collections Processing the worklist involves: * Taking an item from the list * Ensuring it didn't already get copied; if so, ignore it * Racing to write a busy value into the forwarding pointer * If we lose the race, go to the next object in the list * Scanning the object and putting any nursery pointers found and not yet copied into our work list * If it has survived a previous nursery collection, move it into the older generation * Otherwise, copy it to tospace (needs to care if the target tospace is not ours - since we expect most objects not to survive, probably OK to do synchronized operations to bump the tospace pointer) * Finally, update any pointers we discovered that point to the now-moved objects ## Full Collections Every N GC runs will be a full collection, and generation 2 will be collected as well as generation 1. ## Write Barrier All writes into an object in the second generation from an object in the nursery must be added to a remembered set. This is done through a write barrier. MoarVM-2015.11/docs/interpreter.markdown0000644000175000017500000000173712456307241017123 0ustar jnthnjnthn# MoarVM Intepreter ## Ops and Op Banks The interpreter first dispatches on op bank, then on the code within that. For the core and primitive operations, that is done through a switch that is inlined directly inside of the interpreter. The list of ops is held in src/core/oplist. This is processed by the tools/update_ops_h.p6 tool to generate src/core/ops.h and ops.c, which contain all of the metadata about the operations and operation banks. ## Nested Runloops - Just Say No There is no notion of "nested runloop"; any call into C land that wants to call back into the interpreter must persist enough information to allow it to continue its work later. It does this by saving that info into a frame and specifying a callback to resume the work. In essence, it needs to be written out as a state machine. That state machine will be called back into when a C frame is returned to. This is not particularly fun. Nested runloops and continuation barrier issues are even less fun, though. MoarVM-2015.11/docs/japhb-todo.txt0000644000175000017500000000317412456307241015601 0ustar jnthnjnthn* Build improvements + Add a make realclean to cross compiler Makefile to nuke debug files * WIP: gcc warnings cleanup + WIP: -Wall - DONE: -Wparentheses - DONE: -Wreturn-type . All are in src/6model/reprs.c, because of exception-throwing stubs; may have to explicitly ignore this using the second (granular) method of: http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html - -Wpointer-sign . A lot of this is in correct handling of encoded string buffers; use MVMuint8* for this - -Wimplicit-function-declaration . Header fixes? - -Wunused-but-set-variable - -Wunused-function - -Wunused-variable + -Wall -Wextra + -Wall -Wextra -pedantic + Turn on -Werror -pedantic-error * Make sure that all visible names have an MVM or MVM_ prefix, except for those intended to be the same across all NQP backends * Review type checking of MoarVM bytecode validator * Document ops + Write oplist / docs merging program - =op copies oplist info into doc - multiple ops can (e.g. type variants) can have one description - checks for undocumented ops or no-longer-supported ops + Document, document, document .... * Compare interpreter performance v. SSVM: + Original SSVM version: - my $a = 100_000_000; my $b = 3; my $c = 6; while ($a--) { $c += $b }; say $c; - MoarVM is 1.96x -> 4.16x slower at tight loop raw opt dispatch, depending on gcc opt settings (-O3 -> no opt) - compare with and without 'inc' and other SSVM tricks + jnthn++'s 2013-01-28 version: - nqp -e "sub foo() { }; my $i := 0; while $i++ < 100000000 { foo() }; say($i)" MoarVM-2015.11/docs/jit.md0000644000175000017500000000224012456307241014112 0ustar jnthnjnthn# JIT documentation To enable JIT the compiler, run Configure.pl with the option --enable-jit The preprocessor uses *lua* and uses the [http://bitop.luajit.org/](BitOp) module. You shouldn't need to use the preprocessor for compiling JIT support, though. For now, the JIT compiler only works on x64 CPUs, and is frequently tested on linux, windows and sometimes on a mac :-). ## Configuration You can configure the behavior of the JIT compile with some nice environment variables. MVM_JIT_DISABLE=1 Disables the JIT compiler. MVM_JIT_LOG=path/to/logfile.txt Instructs the VM to log JIT actions to the given logfile. MVM_JIT_BYTECODE_DIR=a/dir Instruct the JIT compiler to store the JIT-ed bytecode file. For now, the most recent file is simply stored in a file named "jit-code.bin". I'll work on changing that yet. You can look at what that code means with the following command line (assuming you have gnu objdump): objdump -b binary -D -m i386:x86-64 -M intel jit-code.bin If you find that moarvm crashes where you'd expect the JIT to run, please send me a copy of the output of this command, along with the code (nqp or perl6) that triggered the problem. MoarVM-2015.11/docs/moar.pod0000644000175000017500000000267112554473060014456 0ustar jnthnjnthn=encoding UTF-8 =head1 NAME moar - a runtime for Perl 6 =head1 SYNOPSIS moar --version moar [--dump] [--crash] [--libpath=...] [--full-cleanup] inputfile =head1 DESCRIPTION C is the binary of MoarVM, (short for Metamodel On A Runtime Virtual Machine). It can be used to execute C<.moarvm> bytecode files. =head1 ENVIRONMENT VARIABLES moar respects the following environment variables: =over =item MVM_JIT_DISABLE Disables the just-in-time compiler (JIT). This is ignored if MoarVM was built without JIT support. =item MVM_SPESH_DISABLE Disables the runtime bytecode specializer / optimizer. =item MVM_SPESH_INLINE_DISABLE Disables inlining of call frames inside the bytecode specializer. =item MVM_SPESH_OSR_DISABLE Disables the on-stack replacement feature of the bytecode specializer. =item MVM_CROSS_THREAD_WRITE_LOG Tells MoarVM to insert instrumentation to detect when a thread does a write to an object it didn't allocate and doesn't have a lock for. =item MVM_CROSS_THREAD_WRITE_LOG_INCLUDE_LOCKED Same as MVM_CROSS_THREAD_WRITE_LOG, except objects that are locked are included as well. =back =head1 REPORTING BUGS Please use the issue tracker at L to report bugs. =head1 COPYRIGHT Copyright (C) 2012-2014 by the MoarVM contributors. See the F file for a list of contributors. License: Artistic License 2.0. See the file F for more information. =cut MoarVM-2015.11/docs/release_guide.md0000644000175000017500000000304512554473060016127 0ustar jnthnjnthn# MoarVM Release Guide ## Versions MoarVM currently has a monthly release cycle, with releases made in time for the month's NQP and Rakudo release. Version numbers are simply YYYY.MM. For example, the January 2014 release is 2014.01. If any bugfix releases need to be made, they should be numbered as 2041.01.1, 2041.01.2, etc. ## Making a release 1. Make sure that you are on the MoarVM commit you want to make a release from, and that your status is clean. 2. Ensure that NQP and Rakudo will build and that `make test` in each is clean. Also run `make spectest` in Rakudo; discuss any failures you see with the Rakudo developers. 3. Update docs/ChangeLog with any significant changes since the previous release. 4. Update the VERSION file with the release name. 5. Run `make release VERSION=2014.01`, substituting the correct version name. 6. Take the .tar.gz file generated by step 4, copy it to a separate directory, extract it, and then in that directory do: perl Configure.pl --prefix=install make install install/bin/moar --version 7. Provided step 5 works, you have a release! Tag it: git tag -a 2014.01 8. Upload it, or ask on the MoarVM channel if you don't have access or know how to do that. 9. Optionally, update the ports/macports/Portfile to reflect this latest version, and open a ticket at https://trac.macports.org/newticket to get the macport updated. (For now, just make Coke do it.) 10. Do something fun to celebrate. Like watching nyan cat, or having a beer. Or why not both? MoarVM-2015.11/docs/reveal.md0000644000175000017500000002133112456307241014604 0ustar jnthnjnthn# MoarVM: A virtual machine for NQP and Rakudo Over the course of the last year, we've been working to make both NQP and Rakudo more portable. This has primarily been done to enable the JVM porting work. While the JVM is an important platform to target, and initial work suggests it can give us a faster and more stable Rakudo, there are some use cases, or users, that the JVM will not cater to so well. Startup time will likely remain a little high for one-liners and quick scripts. Other potential users simply don't want to use the JVM, for whatever reason. That's fine: there's more than one way to do it, and our strategy has been to enable that by adding support for the JVM without breaking support for Parrot. Additionally, pmurias will be working on a JavaScript backend for a GSoC project. Today I'd like to introduce some work that, all being well, will lead to an additional "way to do it" arriving over the next several months. A small team, composed of myself, diakopter, japhb and masak, have been quietly working on taking the design of the 6model object system and building a runtime around it. Thus, we've created the "Metamodel On A Runtime" Virtual Machine, or the "MOAR VM", which we've taken to writing as "MoarVM". This is not a release announcement. At present, MoarVM runs neither NQP nor Rakudo, though a cross-compiler exists that allows translating and passing much of the NQP test suite. We're revealing it ahead of YAPC::NA, so it can be openly discussed by the Perl 6 team. The goal from the start has been to run NQP, then run Rakudo. The JVM porting work has established the set of steps that such an effort takes, namely: 1. Build an NQP cross-compiler that targets the desired platform. Make it good enough to compile the MOP, built-ins and the classes at the heart of the regex/grammar engine. Make it pass most of the NQP test suite. 2. Make the cross-compiler good enough to cross-compile NQP itself. 3. Close the bootstrap loop, making NQP self host on the new platform. 4. Do the Rakudo port. At the moment, the JVM work is well into the final step. For MoarVM, we've reached the second step. That is to say, we already have a cross-compiler that compiles a substantial range of NQP language constructs into MoarVM bytecode, including the MOP, built-ins and regex-related classes. Around 51 of the NQP test files (out of a total of 62) pass. Work towards getting the rest of NQP to cross-compile is ongoing. Since anybody who has read this far into the post probably has already got a whole bunch of questions, I'm going to write the rest of it in a question-and-answer style. ## What are the main goals? To create a VM backend for Rakudo Perl 6 that: * Is **lightweight and focused** on doing exactly what Rakudo needs, without any prior technical or domain debt to pay off. * **Supports 6model** and various other needs natively and, hopefully, efficiently. * Is a **quick and easy build**, with few dependencies. I was rather impressed with how quick LuaJIT can be built, and took that as an inspiration. * Enable the **near-term exploration of JIT compilation in 6model** (exploring this through invokedynamic on the JVM is already underway too). ## What's on the inside? So far, MoarVM has: * An **implementation of 6model**. In fact, the VM uses 6model as its core object system. Even strings, arrays and hashes are really 6model objects (which in reality means we have representations for arrays and hashes, which can be re-used by high-level types). This is the first time 6model has been built up from scratch without re-using existing VM data structures. * Enough in place to support **a sizable subset of the `nqp::` op space**. The tests from the NQP test suite that can be translated by the cross-compiler cover a relatively diverse range of features: the boring easy stuff (variables, conditionals, loops, subs), OO stuff (classes, methods, roles, mixins, and, naturally, meta-programming), multiple dispatch, most of grammars (including LTM), and various other bits. * **Unicode strings**, designed with future NFG support in mind. The VM includes the Unicode Character Database, meaning that character name and property lookups, case changing and so forth can be supported without any external dependencies. Encoding of strings takes place only at the point of I/O or when a Buf rather than a Str is requested; the rest of the time, strings are opaque (we're working towards NFG and also ropes). * **Precise, generational GC**. The nursery is managed through semi-space copying, with objects that are seen a second time in the nursery being promoted to a second generation, which is broken up into sized heaps. Allocations in the nursery are thus "bump the pointer", the copying dealing with the resulting fragmentation. * **Bytecode assembly done from an AST**, not from a textual format. MoarVM has no textual assembly language or intermediate language. Of course, there's a way to dump bytecode to something human-readable for debugging, but nothing to go in the opposite direction. This saves us from producing text, only to parse it to produce bytecode. * **IO and other platform stuff** provided by the Apache Portable Runtime, big integer support provided by libtommath, and re-use of existing atomic ops and hash implementations. We will likely replace the APR with libuv in the future. The general principle is to re-use things that we're unlikely to be able to recreate ourselves to the same level of quality or on an acceptable time scale, enabling us to focus on the core domain. ## What does this mean for the Rakudo on JVM work? Relatively little. Being on the JVM is an important goal in its own right. The JVM has a great number of things in its favor: it's a mature, well-optimized, widely deployed technology, and in some organizations the platform of choice ("use what you like, so long as it runs on the JVM"). No matter how well Moar turns out, the JVM still has a couple of decades head start. Additionally, a working NQP on JVM implementation and a fledgling Rakudo on JVM already exist. Work on making Rakudo run, then run fast, on the JVM will continue at the same kind of pace. After all, it's already been taking place concurrently with building MoarVM. :-) ## What does this mean for Rakudo on Parrot? In the short term, until MoarVM runs Rakudo well, this shouldn't really impact Rakudo on Parrot. Beyond that is a more interesting question. The JVM is widely deployed and battle-hardened, and so is interesting in its own right whatever else Rakudo runs on. That's still not the case for Parrot. Provided MoarVM gets to a point where it runs Rakudo more efficiently and is at least as stable and feature complete, it's fairly likely to end up as a more popular choice of backend. There are no plans to break support for Rakudo on Parrot. ## Why do the initial work in private? There were a bunch of reasons for doing so. First and foremost, because it was hard to gauge how long it would take to get anywhere interesting, if indeed it did. As such, it didn't seem constructive to raise expectations or discourage work on other paths that may have led somewhere better, sooner. Secondly, this had to be done on a fairly limited time budget. I certainly didn't have time for every bit of the design to be bikeshedded and rehashed 10 times, which is most certainly a risk when design is done in a very public way. Good designs often come from a single designer. For better or worse, MoarVM gets me. ## Why not keep it private until point X? The most immediate reason for making this work public now is because a large number of Perl 6 core developers will be at YAPC::NA, and I want us to be able to openly discuss MoarVM as part of the larger discussions and planning with regard to Perl 6, NQP and Rakudo. It's not in any sense "ready" for use in the real world yet. The benefits of the work being publicly known just hit the point of outweighing the costs. ## What's the rough timeline? My current aim is to have the MoarVM backend supported in NQP by the July or August release of NQP, with Rakudo support to come in the Rakudo compiler release in August or September. A "Star" distribution release, with modules and tools, would come after that. For now, the NQP cross-compiler lives in the MoarVM repository. After we get Rakudo running and stabilized on MoarVM, the focus will move towards 6model-aware JIT compilation, improving the stability of the threads implementation (the parallel GC exists, but needs some love still), asynchronous IO and full NFG string/rope support. We'll have a bunch of the right people in the same room at YAPC::NA, so we'll work on trying to get a more concrete roadmap together there. ## Where is... * The Git repository: https://github.com/MoarVM/MoarVM * The IRC channel: #moarvm on freenode.org MoarVM-2015.11/docs/strings.markdown0000644000175000017500000000043712456307241016245 0ustar jnthnjnthn# Strings in MoarVM MoarVM implements strings using NFG (Grapheme Normal Form). This is a 32-bit fixed width representation, with negative numbers used to represent graphemes that don't have a Unicode representation, but instead are derived from the combination of multiple code points. MoarVM-2015.11/lib/MAST/Nodes.nqp0000644000175000017500000005163012573775575015206 0ustar jnthnjnthnuse MASTOps; # MoarVM AST nodes # This file contains a set of nodes that are compiled into MoarVM # bytecode. These nodes constitute the official high-level interface # to the VM. At some point, the bytecode itself will be declared # official also. Note that no text-based mapping to/from these nodes # will ever be official, however. # Extension op name/signature registry; keeps track of all the known extension # ops and their signatures. class MAST::ExtOpRegistry { my %extop_sigs; # Registers an extension op, specifying a name and type expected types of # each of the operands. method register_extop($name, *@sig) { if nqp::existskey(%extop_sigs, $name) { nqp::die("MoarVM extension op '$name' already registered"); } my @sig_i := nqp::list_i(); for @sig { nqp::push_i(@sig_i, $_); } %extop_sigs{$name} := @sig_i; } # Checks if an extop is registered. method extop_known($name) { nqp::existskey(%extop_sigs, $name) } # Gets the signature of an extop, which we can rely on to be a list of # native integers. method extop_signature($name) { unless nqp::existskey(%extop_sigs, $name) { nqp::die("MoarVM extension op '$name' is not known"); } %extop_sigs{$name} } } # The extension of base number (everything below is internal). my int $EXTOP_BASE := 1024; # The base class for all nodes. class MAST::Node { method dump($indent = "") { my @lines := nqp::list(); self.dump_lines(@lines, $indent); nqp::join("\n", @lines); } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Node "); } } # Everything lives within a compilation unit. Note that this may # or may not map to a HLL notion of compilation unit; it is always # a set of things that we're going to compile "in one go". The # input to the AST to bytecode convertor should always be one of # these. class MAST::CompUnit is MAST::Node { # The set of frames that make up this compilation unit. has @!frames; # The HLL name. has str $!hll; # The frame for the main entry point, if any. has $!main_frame; # The frame for the library-load entry point, if any. has $!load_frame; # The frame containing the deserialization code, if any. has $!deserialize_frame; # SC handles that we depend on. has @!sc_handles; # Mapping of SC handle names to indexes, for faster lookup. has %!sc_lookup; # List of extops that we are using. For each extop used in this compunit, # this list contains its signature. has @!extop_sigs; # Mapping of extop names to extop signature indexes (in the @!extop_sigs # array). has %!extop_idx; # String list of extop names. has @!extop_names; method add_frame($frame) { my int $idx := nqp::elems(@!frames); $frame.set_index($idx); nqp::push(@!frames, $frame); } method dump_lines(@lines, $indent) { nqp::push(@lines, $_.dump($indent)) for @!frames; } method hll($hll?) { nqp::defined($hll) ?? ($!hll := $hll) !! $!hll } method main_frame($frame?) { nqp::defined($frame) ?? ($!main_frame := $frame) !! $!main_frame } method load_frame($frame?) { nqp::defined($frame) ?? ($!load_frame := $frame) !! $!load_frame } method deserialize_frame($frame?) { nqp::defined($frame) ?? ($!deserialize_frame := $frame) !! $!deserialize_frame } method sc_idx($sc) { my str $handle := nqp::scgethandle($sc); if nqp::existskey(%!sc_lookup, $handle) { nqp::atkey(%!sc_lookup, $handle) } else { my $id := nqp::elems(@!sc_handles); nqp::push(@!sc_handles, $handle); nqp::bindkey(%!sc_lookup, $handle, $id); $id } } # Gets the opcode for an extop in the current compilation unit. If this is # the first use of the extop, gives it an index for this compilation unit. method get_extop_code(str $name) { if nqp::existskey(%!extop_idx, $name) { %!extop_idx{$name} + $EXTOP_BASE } else { my int $idx := +@!extop_sigs; @!extop_names[$idx] := $name; @!extop_sigs[$idx] := MAST::ExtOpRegistry.extop_signature($name); %!extop_idx{$name} := $idx; $idx + $EXTOP_BASE } } } sub get_typename($type) { ["obj","int","num","str"][nqp::objprimspec($type)] } # Represents a frame, which is a unit of invocation. This captures the # static aspects of a frame. class MAST::Frame is MAST::Node { # A compilation-unit unique identifier for the frame. has str $!cuuid; # A name (need not be unique) for the frame. has str $!name; # The set of lexicals that we allocate space for and keep until # nothing references an "instance" of the frame. This is the # list of lexical types, the index being significant. Any type # that has a flattening representation will be "flattened" in to # the frame itself. has @!lexical_types; # Mapping of lexical names to slot indexes. has @!lexical_names; # The set of locals we allocate, but don't need once the frame # has finished executing. This is the set of types. Note that # they do not get a name. has @!local_types; # The instructions for this frame. has @!instructions; # The outer frame, if any. has $!outer; # Mapping of lexical names to lexical index, for lookups. has %!lexical_map; # Flag bits. my int $FRAME_FLAG_EXIT_HANDLER := 1; my int $FRAME_FLAG_IS_THUNK := 2; my int $FRAME_FLAG_HAS_CODE_OBJ := 4; my int $FRAME_FLAG_HAS_INDEX := 32768; # Can go after a rebootstrap. my int $FRAME_FLAG_HAS_SLV := 65536; # Can go after a rebootstrap. has int $!flags; # The frame index in the compilation unit (cached to aid assembly). has int $!frame_idx; # Integer array with 4 entries per static lexical value: # - The lexical index in the frame # - A flag (0 = static, 1 = container var, 2 = state var) # - SC index in this compilation unit # - Index of the object within that SC has @!static_lex_values; # Code object SC dependency index and SC index. has int $!code_obj_sc_dep_idx; has int $!code_obj_sc_idx; my int $cuuid_src := 0; sub fresh_id() { $cuuid_src++; "!MVM_CUUID_$cuuid_src" } method new(:$cuuid = fresh_id(), :$name = '') { my $obj := nqp::create(self); $obj.BUILD($cuuid, $name); $obj } method BUILD($cuuid, $name) { $!cuuid := $cuuid; $!name := $name; @!lexical_types := nqp::list(); @!lexical_names := nqp::list(); @!local_types := nqp::list(); @!instructions := nqp::list(); $!outer := MAST::Node; %!lexical_map := nqp::hash(); @!static_lex_values := nqp::list_i(); } method set_index(int $idx) { $!frame_idx := $idx; $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_INDEX); } method add_lexical($type, $name) { my $index := +@!lexical_types; @!lexical_types[$index] := $type; @!lexical_names[$index] := $name; %!lexical_map{$name} := $index; $index } method lexical_index($name) { nqp::existskey(%!lexical_map, $name) ?? %!lexical_map{$name} !! nqp::die("No such lexical '$name'") } method add_static_lex_value($index, $flags, $sc_idx, $idx) { my @slv := @!static_lex_values; nqp::push_i(@slv, $index); nqp::push_i(@slv, $flags); nqp::push_i(@slv, $sc_idx); nqp::push_i(@slv, $idx); $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_SLV); } method add_local($type) { my $index := +@!local_types; @!local_types[$index] := $type; $index } method instructions() { @!instructions } method set_outer($outer) { if nqp::istype($outer, MAST::Frame) { $!outer := $outer; } else { nqp::die("set_outer expects a MAST::Frame"); } } method cuuid() { $!cuuid } method name() { $!name } method has_exit_handler($value = -1) { if $value > 0 { $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_EXIT_HANDLER); } nqp::bitand_i($!flags, $FRAME_FLAG_EXIT_HANDLER) } method is_thunk($value = -1) { if $value > 0 { $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_IS_THUNK); } nqp::bitand_i($!flags, $FRAME_FLAG_IS_THUNK) } method set_code_object_idxs(int $sc_dep_idx, int $sc_idx) { $!code_obj_sc_dep_idx := $sc_dep_idx; $!code_obj_sc_idx := $sc_idx; $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_CODE_OBJ); } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Frame name<$!name>, cuuid<$!cuuid>"); if !nqp::chars($indent) { my $lex; my $x := 0; my $locals := "$indent Local types: "; $locals := $locals ~ $x++ ~ "<" ~ get_typename($_) ~ ">, " for @!local_types; nqp::push(@lines, $locals); if nqp::elems(@!lexical_types) { $x := 0; $lex := "$indent Lexical types: "; $lex := $lex ~ $x++ ~ "<" ~ get_typename($_) ~ ">, " for @!lexical_types; nqp::push(@lines, $lex); } if nqp::elems(@!lexical_names) { $x := 0; $lex := "$indent Lexical names: "; $lex := $lex ~ $x++ ~ "<$_>, " for @!lexical_names; nqp::push(@lines, $lex); } if nqp::elems(%!lexical_map) { $lex := "$indent Lexical map: "; $lex := "$lex$_" ~ '<' ~ %!lexical_map{$_} ~ '>, ' for %!lexical_map; nqp::push(@lines, $lex); } nqp::push(@lines, "$indent Outer: " ~ ( $!outer && $!outer.cuuid ne $!cuuid ?? "name<" ~ $!outer.name ~ ">, cuuid<"~$!outer.cuuid ~ '>' !! "" )); nqp::push(@lines, "$indent Instructions:"); $x := 0; for @!instructions { my $prefix := $indent ~ ' [' ~ $x++ ~ '] '; nqp::push(@lines, $prefix ~ $_.dump($indent)); } nqp::push(@lines, ''); } } } # An operation to be executed. The operands must be either registers, # literals or labels (depending on what the instruction needs). class MAST::Op is MAST::Node { has int $!op; has @!operands; my %op_codes := MAST::Ops.WHO<%codes>; my @op_names := MAST::Ops.WHO<@names>; method new(str :$op!, *@operands) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Op, '$!op', %op_codes{$op}); nqp::bindattr($obj, MAST::Op, '@!operands', @operands); $obj } method new_with_operand_array(@operands, str :$op!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Op, '$!op', %op_codes{$op}); nqp::bindattr($obj, MAST::Op, '@!operands', @operands); $obj } method op() { $!op } method operands() { @!operands } method dump_lines(@lines, $indent) { my str $opname := nqp::atpos_s(@op_names, $!op); nqp::push(@lines, $indent ~ "MAST::Op $opname"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!operands; } } # An extension operation to be executed. The operands must be either # registers, literals or labels (depending on what the instruction needs). class MAST::ExtOp is MAST::Node { has int $!op; has @!operands; has str $!name; method new(str :$op!, :$cu!, *@operands) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::ExtOp, '$!op', $cu.get_extop_code($op)); nqp::bindattr($obj, MAST::ExtOp, '@!operands', @operands); nqp::bindattr_s($obj, MAST::ExtOp, '$!name', $op); $obj } method new_with_operand_array(@operands, str :$op!, :$cu!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::ExtOp, '$!op', $cu.get_extop_code($op)); nqp::bindattr($obj, MAST::ExtOp, '@!operands', @operands); nqp::bindattr_s($obj, MAST::ExtOp, '$!name', $op); $obj } method op() { $!op } method operands() { @!operands } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent ~ "MAST::ExtOp $!name"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!operands; } } # Literal values. class MAST::SVal is MAST::Node { has str $!value; method new(:$value!) { my $obj := nqp::create(self); nqp::bindattr_s($obj, MAST::SVal, '$!value', $value); $obj } method dump_lines(@lines, $indent) { # XXX: escape line breaks and such... nqp::push(@lines, $indent~"MAST::SVal value<$!value>"); } } class MAST::IVal is MAST::Node { # The integer value. has int $!value; # Size in bits (8, 16, 32, 64). has int $!size; # Whether or not it's signed. has int $!signed; method new(:$value!, :$size = 64, :$signed = 1) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::IVal, '$!value', $value); nqp::bindattr_i($obj, MAST::IVal, '$!size', $size); nqp::bindattr_i($obj, MAST::IVal, '$!signed', $signed); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::IVal value<$!value>, size<$!size>, signed<$!signed>"); } } class MAST::NVal is MAST::Node { # The floating point value. has num $!value; # Size in bits (32, 64). has int $!size; method new(:$value!, :$size = 64) { my $obj := nqp::create(self); nqp::bindattr_n($obj, MAST::NVal, '$!value', $value); nqp::bindattr_i($obj, MAST::NVal, '$!size', $size); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::NVal value<$!value>, size<$!size>"); } } # Labels (used directly in the instruction stream indicates where the # label goes; can also be used as an instruction operand). class MAST::Label is MAST::Node { method new() { nqp::create(self) } method dump_lines(@lines, $indent) { my int $addr := nqp::where(self); nqp::push(@lines, $indent ~ "MAST::Label <$addr>"); } } # A local lookup. class MAST::Local is MAST::Node { has int $!index; method new(:$index!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Local, '$!index', $index); $obj } method index() { $!index } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Local index<$!index>"); } } # A lexical lookup. class MAST::Lexical is MAST::Node { has int $!index; has int $!frames_out; method new(:$index!, :$frames_out = 0) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Lexical, '$!index', $index); nqp::bindattr_i($obj, MAST::Lexical, '$!frames_out', $frames_out); $obj } method index() { $!index } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Lexical index<$!index>, frames_out<$!frames_out>"); } } # Argument flags. module Arg { our $obj := 1; our $int := 2; our $num := 4; our $str := 8; our $named := 32; our $flat := 64; our $flatnamed := 128; } # A call. A register holding the thing to call should be specified, along # with a set of flags describing the call site, followed by the arguments # themselves, which may be constants or come from registers. There is also # a set of flags, describing each argument. Some flags need two actual # arguments, one specifying the name, the next the actual value. class MAST::Call is MAST::Node { has $!target; has @!flags; has @!args; has $!result; method new(:$target!, :@flags!, :$result = MAST::Node, *@args) { sanity_check(@flags, @args); my $obj := nqp::create(self); nqp::bindattr($obj, MAST::Call, '$!target', $target); nqp::bindattr($obj, MAST::Call, '@!flags', @flags); nqp::bindattr($obj, MAST::Call, '@!args', @args); nqp::bindattr($obj, MAST::Call, '$!result', $result); $obj } sub sanity_check(@flags, @args) { my $flag_needed_args := 0; for @flags { $flag_needed_args := $flag_needed_args + ($_ +& $Arg::named ?? 2 !! 1); } if +@args < $flag_needed_args { nqp::die("Flags indicated there should be $flag_needed_args args, but have " ~ +@args); } } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Call"); nqp::push(@lines, "$indent target:"); nqp::push(@lines, $!target.dump($indent ~ ' ')); nqp::push(@lines, "$indent result:"); nqp::push(@lines, $!result.dump($indent ~ ' ')); nqp::push(@lines, "$indent flags:"); for @!flags -> $flag { my $str := "$indent "; if $flag +& $Arg::named { $str := $str ~ " named"; } elsif $flag +& $Arg::flat { $str := $str ~ " flat"; } elsif $flag +& $Arg::flatnamed { $str := $str ~ " flat/named"; } else { $str := $str ~ " positional" ; } $str := $str ~ " obj" if $flag +& $Arg::obj; $str := $str ~ " int" if $flag +& $Arg::int; $str := $str ~ " num" if $flag +& $Arg::num; $str := $str ~ " str" if $flag +& $Arg::str; nqp::push(@lines, $str); } nqp::push(@lines, "$indent args:"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!args; } } # A series of instructions that fall on a particular line in a particular source file class MAST::Annotated is MAST::Node { has str $!file; has int $!line; has @!instructions; method new(:$file = '', :$line!, :@instructions!) { my $obj := nqp::create(self); nqp::bindattr_s($obj, MAST::Annotated, '$!file', $file); nqp::bindattr_i($obj, MAST::Annotated, '$!line', $line); nqp::bindattr($obj, MAST::Annotated, '@!instructions', @instructions); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Annotated: file: $!file, line: $!line, instructions:"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!instructions; } } # Handler constants. module HandlerAction { our $unwind_and_goto := 0; our $unwind_and_goto_obj := 1; our $invoke_and_we'll_see := 2; } # Category constants. module HandlerCategory { our $catch := 1; our $control := 2; our $next := 4; our $redo := 8; our $last := 16; our $return := 32; our $unwind := 64; our $take := 128; our $warn := 256; our $succeed := 512; our $proceed := 1024; our $labeled := 4096; our $await := 8192; our $emit := 16384; our $done := 32768; } # A region with a handler. class MAST::HandlerScope is MAST::Node { has @!instructions; has int $!category_mask; has int $!action; has $!goto_label; has $!block_local; has $!label_local; method new(:@instructions!, :$category_mask!, :$action!, :$goto!, :$block, :$label) { my $obj := nqp::create(self); nqp::bindattr($obj, MAST::HandlerScope, '@!instructions', @instructions); nqp::bindattr_i($obj, MAST::HandlerScope, '$!category_mask', $category_mask); nqp::bindattr_i($obj, MAST::HandlerScope, '$!action', $action); if nqp::istype($goto, MAST::Label) { nqp::bindattr($obj, MAST::HandlerScope, '$!goto_label', $goto); } else { nqp::die("Handler needs a MAST::Label to unwind to"); } if $action == $HandlerAction::invoke_and_we'll_see { if nqp::istype($block, MAST::Local) { nqp::bindattr($obj, MAST::HandlerScope, '$!block_local', $block); } else { nqp::die("Handler action invoke-and-we'll-see needs a MAST::Local to invoke"); } } elsif $action != $HandlerAction::unwind_and_goto && $action != $HandlerAction::unwind_and_goto_obj { nqp::die("Unknown handler action"); } if $category_mask +& $HandlerCategory::labeled { if nqp::istype($label, MAST::Local) { nqp::bindattr($obj, MAST::HandlerScope, '$!label_local', $label); } else { nqp::die("Handler category 'labeled' needs a MAST::Local"); } } $obj } } MoarVM-2015.11/lib/MAST/Ops.nqp0000644000175000017500000015730112623370227014656 0ustar jnthnjnthn# This file is generated from src/core/oplist by tools/update_ops.p6. class MAST::Ops {} BEGIN { MAST::Ops.WHO<@offsets> := nqp::list_i(0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 99, 102, 103, 104, 105, 106, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 150, 152, 153, 154, 155, 156, 159, 162, 165, 167, 170, 173, 176, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 222, 224, 227, 229, 231, 233, 235, 237, 239, 241, 243, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 281, 283, 285, 287, 289, 291, 293, 295, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 317, 320, 323, 326, 328, 330, 332, 334, 337, 340, 343, 346, 348, 349, 351, 353, 354, 356, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, 383, 384, 385, 386, 388, 390, 392, 393, 394, 396, 399, 402, 405, 408, 411, 414, 416, 419, 423, 426, 427, 429, 432, 435, 438, 441, 444, 447, 450, 454, 458, 464, 467, 470, 474, 478, 480, 482, 485, 488, 490, 492, 494, 497, 500, 502, 506, 510, 512, 515, 520, 525, 527, 529, 531, 534, 538, 540, 542, 543, 547, 552, 557, 560, 564, 570, 575, 579, 582, 584, 586, 587, 589, 591, 594, 597, 600, 603, 605, 607, 609, 612, 615, 617, 619, 621, 623, 626, 628, 630, 633, 638, 643, 648, 653, 657, 661, 665, 669, 674, 679, 684, 689, 693, 697, 701, 705, 709, 712, 715, 718, 720, 722, 724, 727, 730, 733, 736, 739, 742, 745, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 784, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 818, 820, 821, 822, 825, 828, 830, 832, 834, 836, 839, 841, 843, 844, 845, 846, 847, 848, 849, 850, 851, 853, 855, 857, 859, 861, 863, 864, 865, 866, 867, 868, 870, 873, 875, 878, 881, 884, 886, 888, 890, 893, 893, 893, 895, 897, 899, 901, 903, 905, 907, 909, 911, 915, 917, 919, 920, 921, 923, 925, 926, 927, 929, 931, 933, 935, 938, 940, 942, 945, 948, 951, 953, 956, 958, 960, 962, 964, 967, 972, 975, 978, 979, 980, 981, 982, 984, 986, 989, 992, 994, 996, 998, 999, 1001, 1003, 1005, 1006, 1007, 1011, 1015, 1019, 1023, 1027, 1030, 1033, 1036, 1039, 1042, 1045, 1048, 1051, 1054, 1058, 1062, 1066, 1069, 1073, 1077, 1082, 1086, 1090, 1095, 1098, 1101, 1103, 1105, 1108, 1111, 1113, 1115, 1118, 1124, 1127, 1129, 1131, 1133, 1134, 1136, 1138, 1140, 1141, 1143, 1145, 1146, 1149, 1150, 1153, 1156, 1159, 1162, 1165, 1168, 1169, 1170, 1172, 1174, 1175, 1176, 1177, 1180, 1182, 1185, 1187, 1189, 1193, 1196, 1198, 1199, 1200, 1202, 1204, 1207, 1209, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1221, 1222, 1223, 1224, 1232, 1233, 1234, 1235, 1237, 1238, 1241, 1242, 1244, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1270, 1271, 1272, 1273, 1281, 1283, 1285, 1287, 1290, 1292, 1295, 1297, 1302, 1303, 1304, 1306, 1308, 1310, 1311, 1312, 1314, 1317, 1321, 1324, 1326, 1330, 1331, 1334, 1334, 1336, 1339, 1342, 1345, 1349, 1355, 1359, 1360, 1361, 1363, 1363, 1364, 1365, 1366, 1367, 1369, 1370, 1373, 1374, 1375, 1376, 1378, 1382, 1384, 1386, 1392, 1393, 1398, 1403, 1409, 1415, 1421, 1427, 1432, 1438, 1440, 1442, 1443, 1445, 1447, 1449, 1452, 1455, 1458, 1461, 1465, 1469, 1473, 1477, 1477, 1481, 1487, 1489, 1490, 1491, 1493, 1495, 1495, 1500, 1502, 1504, 1507, 1509, 1511, 1514, 1516, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1537, 1539, 1541, 1543, 1545, 1547, 1549, 1551, 1553, 1555, 1558, 1561, 1564, 1569, 1574, 1579, 1583, 1587, 1591, 1593, 1597, 1600, 1602, 1605, 1607, 1611, 1614, 1615, 1616, 1617, 1621, 1625, 1629, 1633, 1638, 1643, 1648, 1653, 1656, 1659, 1662, 1665, 1669, 1673, 1677, 1681, 1686, 1691, 1696, 1701, 1704, 1707, 1710, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1729, 1734, 1736, 1738, 1738, 1740, 1742, 1745, 1748, 1751, 1754, 1756, 1758, 1760, 1762, 1764, 1767, 1770, 1773, 1776, 1777, 1779, 1783, 1786, 1789, 1792, 1795, 1798, 1801, 1804, 1807, 1810, 1813, 1816, 1819, 1822, 1825, 1828, 1831, 1835, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, 1861, 1863, 1865, 1867, 1867, 1867, 1868, 1869, 1869, 1870); MAST::Ops.WHO<@counts> := nqp::list_i(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 3, 3, 4, 4, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 4, 4, 2, 3, 5, 5, 2, 2, 2, 3, 4, 2, 2, 1, 4, 5, 5, 3, 4, 6, 5, 4, 3, 2, 2, 1, 2, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 3, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 3, 5, 3, 3, 1, 1, 1, 1, 2, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 3, 2, 2, 3, 3, 2, 2, 3, 6, 3, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 1, 1, 3, 2, 3, 2, 2, 4, 3, 2, 1, 1, 2, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 8, 1, 1, 1, 2, 1, 3, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 3, 2, 1, 1, 1, 1, 8, 2, 2, 2, 3, 2, 3, 2, 5, 1, 1, 2, 2, 2, 1, 1, 2, 3, 4, 3, 2, 4, 1, 3, 0, 2, 3, 3, 3, 4, 6, 4, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 2, 4, 2, 2, 6, 1, 5, 5, 6, 6, 6, 6, 5, 6, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 4, 6, 2, 1, 1, 2, 2, 0, 5, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 5, 5, 5, 4, 4, 4, 2, 4, 3, 2, 3, 2, 4, 3, 1, 1, 1, 4, 4, 4, 4, 5, 5, 5, 5, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 0, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 2, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 0, 0, 1, 1, 0, 1, 2); MAST::Ops.WHO<@values> := nqp::list_i(10, 8, 18, 16, 26, 24, 34, 32, 42, 40, 50, 48, 58, 56, 82, 81, 34, 9, 34, 17, 34, 25, 34, 9, 34, 17, 34, 25, 10, 33, 18, 33, 26, 33, 10, 33, 18, 33, 26, 33, 50, 41, 42, 49, 72, 33, 72, 33, 72, 49, 72, 49, 72, 57, 72, 57, 72, 57, 72, 57, 72, 65, 72, 65, 72, 32, 33, 82, 83, 84, 81, 34, 56, 50, 56, 58, 56, 66, 56, 56, 33, 56, 49, 56, 57, 56, 65, 66, 57, 57, 65, 66, 57, 57, 65, 65, 56, 65, 16, 34, 65, 57, 33, 49, 57, 65, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 34, 34, 34, 34, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 33, 34, 49, 58, 33, 58, 49, 34, 57, 50, 57, 50, 65, 58, 65, 104, 16, 33, 16, 49, 16, 57, 16, 65, 16, 32, 16, 48, 16, 56, 65, 34, 65, 50, 65, 58, 65, 66, 65, 16, 16, 34, 16, 50, 16, 58, 16, 66, 16, 34, 16, 72, 50, 16, 72, 58, 16, 72, 66, 16, 72, 34, 56, 50, 56, 58, 56, 66, 56, 34, 56, 72, 50, 56, 72, 58, 56, 72, 66, 56, 72, 66, 16, 66, 66, 96, 66, 33, 65, 66, 65, 66, 65, 57, 65, 65, 65, 33, 58, 65, 66, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 32, 66, 32, 66, 32, 66, 57, 65, 65, 66, 66, 72, 66, 65, 66, 65, 66, 66, 34, 65, 66, 65, 33, 34, 65, 33, 50, 65, 33, 58, 65, 33, 34, 65, 33, 34, 65, 57, 34, 65, 66, 65, 65, 66, 65, 65, 65, 66, 65, 65, 58, 34, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 33, 34, 57, 57, 33, 34, 57, 33, 33, 57, 33, 58, 57, 57, 58, 57, 33, 58, 57, 33, 33, 34, 57, 57, 33, 34, 57, 34, 57, 34, 57, 33, 34, 57, 33, 58, 57, 58, 57, 58, 57, 66, 57, 57, 58, 57, 65, 34, 57, 57, 33, 56, 72, 57, 33, 56, 72, 34, 57, 34, 33, 57, 34, 57, 33, 33, 33, 34, 57, 33, 16, 16, 34, 57, 58, 33, 34, 57, 34, 57, 33, 34, 57, 57, 33, 58, 57, 58, 57, 57, 34, 33, 57, 33, 34, 33, 57, 33, 33, 34, 33, 57, 33, 33, 66, 65, 65, 66, 65, 57, 33, 65, 57, 33, 65, 65, 65, 66, 33, 57, 33, 33, 66, 57, 57, 65, 58, 65, 57, 34, 57, 34, 57, 66, 34, 65, 65, 72, 66, 65, 56, 66, 65, 57, 34, 65, 56, 34, 65, 57, 66, 65, 66, 65, 34, 65, 66, 65, 65, 34, 65, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 65, 65, 58, 65, 34, 65, 34, 65, 65, 65, 65, 56, 33, 16, 65, 65, 56, 49, 16, 65, 65, 56, 57, 16, 65, 65, 56, 65, 16, 65, 65, 57, 33, 65, 65, 57, 49, 65, 65, 57, 57, 65, 65, 57, 65, 34, 65, 65, 56, 16, 50, 65, 65, 56, 16, 58, 65, 65, 56, 16, 66, 65, 65, 56, 16, 34, 65, 65, 57, 50, 65, 65, 57, 58, 65, 65, 57, 66, 65, 65, 57, 34, 65, 65, 57, 66, 33, 65, 66, 49, 65, 66, 57, 65, 34, 65, 50, 65, 58, 65, 34, 65, 33, 50, 65, 33, 58, 65, 33, 66, 65, 33, 65, 33, 33, 65, 33, 49, 65, 33, 57, 65, 33, 65, 65, 33, 65, 49, 65, 57, 65, 65, 34, 65, 50, 65, 58, 65, 66, 65, 34, 65, 50, 65, 58, 65, 66, 65, 65, 33, 65, 49, 65, 57, 65, 65, 65, 65, 33, 33, 65, 33, 34, 65, 33, 34, 65, 57, 50, 65, 57, 58, 65, 57, 66, 65, 57, 65, 57, 33, 65, 57, 49, 65, 57, 57, 65, 57, 65, 34, 65, 57, 65, 57, 34, 65, 66, 66, 66, 65, 57, 66, 65, 65, 65, 65, 65, 33, 65, 65, 65, 33, 65, 33, 65, 34, 65, 34, 65, 66, 66, 66, 66, 66, 66, 66, 66, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 57, 65, 66, 66, 66, 66, 66, 66, 57, 66, 57, 65, 66, 57, 66, 57, 65, 66, 57, 57, 57, 57, 65, 65, 57, 65, 33, 66, 65, 66, 65, 57, 66, 65, 58, 65, 66, 65, 58, 65, 34, 65, 66, 65, 65, 65, 65, 57, 65, 65, 65, 65, 57, 65, 34, 65, 66, 65, 65, 65, 66, 65, 58, 65, 65, 66, 65, 65, 65, 65, 34, 65, 66, 65, 65, 57, 65, 58, 57, 66, 57, 65, 33, 65, 65, 33, 65, 66, 65, 33, 58, 65, 34, 65, 65, 65, 57, 34, 65, 65, 65, 66, 65, 58, 65, 65, 57, 65, 65, 65, 65, 66, 16, 16, 66, 16, 32, 34, 34, 65, 66, 58, 65, 58, 57, 65, 65, 57, 66, 65, 65, 34, 65, 66, 65, 66, 65, 66, 66, 65, 66, 65, 66, 65, 66, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 33, 65, 66, 65, 33, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 65, 34, 65, 33, 66, 65, 65, 50, 65, 58, 65, 66, 49, 65, 66, 57, 65, 34, 65, 34, 65, 58, 65, 33, 66, 33, 57, 33, 33, 65, 50, 65, 65, 57, 57, 57, 57, 57, 57, 57, 57, 33, 34, 57, 57, 33, 57, 66, 57, 58, 65, 65, 66, 57, 57, 65, 58, 65, 33, 58, 57, 57, 57, 57, 57, 34, 65, 57, 65, 33, 33, 34, 65, 33, 65, 65, 65, 33, 34, 65, 66, 66, 66, 65, 57, 33, 66, 33, 65, 57, 33, 65, 57, 66, 65, 65, 57, 33, 65, 65, 57, 65, 65, 57, 57, 57, 58, 65, 34, 65, 34, 57, 33, 58, 65, 58, 65, 57, 57, 33, 34, 50, 34, 49, 66, 65, 33, 65, 50, 33, 34, 57, 57, 65, 65, 65, 65, 33, 58, 66, 66, 57, 57, 57, 66, 57, 57, 65, 57, 57, 66, 66, 57, 66, 65, 57, 66, 65, 57, 66, 65, 57, 66, 57, 58, 57, 57, 58, 57, 57, 58, 57, 57, 34, 49, 50, 50, 50, 34, 34, 65, 57, 65, 65, 65, 65, 33, 34, 57, 34, 57, 34, 57, 34, 65, 57, 66, 65, 65, 65, 33, 65, 65, 58, 57, 33, 33, 57, 66, 66, 66, 65, 57, 57, 57, 57, 58, 65, 66, 65, 66, 65, 65, 66, 33, 65, 65, 66, 65, 65, 50, 49, 34, 57, 33, 57, 33, 34, 65, 57, 58, 33, 34, 33, 33, 34, 33, 33, 58, 33, 33, 34, 33, 33, 33, 65, 57, 57, 57, 65, 65, 66, 65, 65, 65, 65, 65, 34, 65, 66, 65, 65, 65, 34, 65, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 57, 57, 66, 65, 66, 65, 66, 65, 65, 33, 33, 65, 65, 66, 65, 65, 33, 65, 66, 65, 65, 57, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 65, 57, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 66, 57, 66, 57, 58, 34, 16, 34, 24, 34, 65, 34, 56, 56, 50, 56, 56, 58, 56, 56, 66, 56, 56, 34, 56, 56, 72, 50, 56, 56, 72, 58, 56, 56, 72, 66, 56, 56, 72, 66, 65, 65, 65, 66, 65, 65, 57, 65, 65, 65, 33, 65, 66, 34, 65, 65, 33, 66, 57, 57, 65, 65, 34, 65, 65, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 33, 58, 57, 34, 57, 33, 34, 65, 34, 65, 34, 65, 65, 33, 65, 49, 65, 57, 34, 65, 50, 65, 58, 65, 66, 33, 66, 49, 66, 57, 66, 35, 66, 51, 66, 59, 66, 56, 66, 56, 66, 56, 66, 65, 33, 66, 65, 33, 66, 65, 33, 66, 65, 65, 56, 16, 66, 65, 65, 56, 16, 66, 65, 65, 56, 16, 66, 65, 65, 57, 66, 65, 65, 57, 66, 65, 65, 57, 34, 65, 57, 57, 33, 65, 65, 33, 65, 58, 65, 57, 33, 65, 66, 65, 34, 57, 57, 33, 34, 57, 33, 65, 65, 66, 34, 65, 33, 33, 50, 65, 33, 33, 58, 65, 33, 33, 66, 65, 33, 33, 34, 65, 33, 33, 33, 50, 65, 33, 33, 33, 58, 65, 33, 33, 33, 66, 65, 33, 33, 33, 34, 65, 65, 50, 65, 65, 58, 65, 65, 66, 65, 65, 65, 33, 33, 33, 65, 33, 33, 49, 65, 33, 33, 57, 65, 33, 33, 65, 65, 33, 33, 33, 33, 65, 33, 33, 33, 49, 65, 33, 33, 33, 57, 65, 33, 33, 33, 65, 65, 65, 33, 65, 65, 49, 65, 65, 57, 65, 65, 65, 66, 65, 65, 65, 34, 65, 66, 65, 34, 65, 58, 57, 65, 65, 58, 65, 66, 57, 57, 57, 65, 34, 65, 65, 16, 65, 128, 65, 128, 65, 128, 128, 65, 128, 128, 65, 128, 128, 65, 128, 128, 66, 16, 66, 16, 66, 16, 66, 16, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 66, 65, 16, 16, 66, 128, 66, 65, 56, 128, 66, 16, 128, 66, 65, 16, 34, 65, 16, 34, 65, 16, 34, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 33, 65, 16, 33, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 65, 16, 66, 65, 16, 128, 66, 65, 16, 128, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 34, 65, 34, 65, 34, 65, 128, 65, 65, 65, 16); MAST::Ops.WHO<%codes> := nqp::hash('no_op', 0, 'const_i8', 1, 'const_i16', 2, 'const_i32', 3, 'const_i64', 4, 'const_n32', 5, 'const_n64', 6, 'const_s', 7, 'set', 8, 'extend_u8', 9, 'extend_u16', 10, 'extend_u32', 11, 'extend_i8', 12, 'extend_i16', 13, 'extend_i32', 14, 'trunc_u8', 15, 'trunc_u16', 16, 'trunc_u32', 17, 'trunc_i8', 18, 'trunc_i16', 19, 'trunc_i32', 20, 'extend_n32', 21, 'trunc_n32', 22, 'goto', 23, 'if_i', 24, 'unless_i', 25, 'if_n', 26, 'unless_n', 27, 'if_s', 28, 'unless_s', 29, 'if_s0', 30, 'unless_s0', 31, 'if_o', 32, 'unless_o', 33, 'jumplist', 34, 'getlex', 35, 'bindlex', 36, 'getlex_ni', 37, 'getlex_nn', 38, 'getlex_ns', 39, 'getlex_no', 40, 'bindlex_ni', 41, 'bindlex_nn', 42, 'bindlex_ns', 43, 'bindlex_no', 44, 'getlex_ng', 45, 'bindlex_ng', 46, 'getdynlex', 47, 'binddynlex', 48, 'setlexvalue', 49, 'lexprimspec', 50, 'return_i', 51, 'return_n', 52, 'return_s', 53, 'return_o', 54, 'return', 55, 'eq_i', 56, 'ne_i', 57, 'lt_i', 58, 'le_i', 59, 'gt_i', 60, 'ge_i', 61, 'cmp_i', 62, 'add_i', 63, 'sub_i', 64, 'mul_i', 65, 'div_i', 66, 'div_u', 67, 'mod_i', 68, 'mod_u', 69, 'neg_i', 70, 'abs_i', 71, 'inc_i', 72, 'inc_u', 73, 'dec_i', 74, 'dec_u', 75, 'band_i', 76, 'bor_i', 77, 'bxor_i', 78, 'bnot_i', 79, 'blshift_i', 80, 'brshift_i', 81, 'pow_i', 82, 'not_i', 83, 'gcd_i', 84, 'lcm_i', 85, 'eq_n', 86, 'ne_n', 87, 'lt_n', 88, 'le_n', 89, 'gt_n', 90, 'ge_n', 91, 'cmp_n', 92, 'add_n', 93, 'sub_n', 94, 'mul_n', 95, 'div_n', 96, 'mod_n', 97, 'neg_n', 98, 'abs_n', 99, 'pow_n', 100, 'ceil_n', 101, 'floor_n', 102, 'sin_n', 103, 'asin_n', 104, 'cos_n', 105, 'acos_n', 106, 'tan_n', 107, 'atan_n', 108, 'atan2_n', 109, 'sec_n', 110, 'asec_n', 111, 'sinh_n', 112, 'cosh_n', 113, 'tanh_n', 114, 'sech_n', 115, 'sqrt_n', 116, 'log_n', 117, 'exp_n', 118, 'coerce_in', 119, 'coerce_ni', 120, 'coerce_is', 121, 'coerce_ns', 122, 'coerce_si', 123, 'coerce_sn', 124, 'smrt_numify', 125, 'smrt_strify', 126, 'prepargs', 127, 'arg_i', 128, 'arg_n', 129, 'arg_s', 130, 'arg_o', 131, 'argconst_i', 132, 'argconst_n', 133, 'argconst_s', 134, 'invoke_v', 135, 'invoke_i', 136, 'invoke_n', 137, 'invoke_s', 138, 'invoke_o', 139, 'checkarity', 140, 'param_rp_i', 141, 'param_rp_n', 142, 'param_rp_s', 143, 'param_rp_o', 144, 'param_op_i', 145, 'param_op_n', 146, 'param_op_s', 147, 'param_op_o', 148, 'param_rn_i', 149, 'param_rn_n', 150, 'param_rn_s', 151, 'param_rn_o', 152, 'param_on_i', 153, 'param_on_n', 154, 'param_on_s', 155, 'param_on_o', 156, 'param_sp', 157, 'param_sn', 158, 'getcode', 159, 'caller', 160, 'capturelex', 161, 'takeclosure', 162, 'exception', 163, 'bindexmessage', 164, 'bindexpayload', 165, 'bindexcategory', 166, 'getexmessage', 167, 'getexpayload', 168, 'getexcategory', 169, 'throwdyn', 170, 'throwlex', 171, 'throwlexotic', 172, 'throwcatdyn', 173, 'throwcatlex', 174, 'throwcatlexotic', 175, 'die', 176, 'rethrow', 177, 'resume', 178, 'takehandlerresult', 179, 'newlexotic', 180, 'lexoticresult', 181, 'backtracestrings', 182, 'usecapture', 183, 'savecapture', 184, 'captureposelems', 185, 'captureposarg', 186, 'captureposarg_i', 187, 'captureposarg_n', 188, 'captureposarg_s', 189, 'captureposprimspec', 190, 'captureexistsnamed', 191, 'capturehasnameds', 192, 'invokewithcapture', 193, 'multicacheadd', 194, 'multicachefind', 195, 'null_s', 196, 'isnull_s', 197, 'eq_s', 198, 'ne_s', 199, 'gt_s', 200, 'ge_s', 201, 'lt_s', 202, 'le_s', 203, 'cmp_s', 204, 'eqat_s', 205, 'eqatic_s', 206, 'haveat_s', 207, 'concat_s', 208, 'repeat_s', 209, 'substr_s', 210, 'index_s', 211, 'graphs_s', 212, 'codes_s', 213, 'getcp_s', 214, 'indexcp_s', 215, 'uc', 216, 'lc', 217, 'tc', 218, 'split', 219, 'join', 220, 'getcpbyname', 221, 'indexat', 222, 'indexnat', 223, 'unipropcode', 224, 'unipvalcode', 225, 'hasuniprop', 226, 'hasunipropc', 227, 'chars', 228, 'chr', 229, 'ordfirst', 230, 'ordat', 231, 'rindexfrom', 232, 'escape', 233, 'flip', 234, 'flattenropes', 235, 'iscclass', 236, 'findcclass', 237, 'findnotcclass', 238, 'nfafromstatelist', 239, 'nfarunproto', 240, 'nfarunalt', 241, 'radix', 242, 'encode', 243, 'decode', 244, 'istrue_s', 245, 'isfalse_s', 246, 'null', 247, 'isnull', 248, 'ifnonnull', 249, 'findmeth', 250, 'findmeth_s', 251, 'can', 252, 'can_s', 253, 'create', 254, 'clone', 255, 'isconcrete', 256, 'rebless', 257, 'istype', 258, 'objprimspec', 259, 'gethow', 260, 'getwhat', 261, 'getwho', 262, 'setwho', 263, 'reprname', 264, 'getwhere', 265, 'eqaddr', 266, 'bindattr_i', 267, 'bindattr_n', 268, 'bindattr_s', 269, 'bindattr_o', 270, 'bindattrs_i', 271, 'bindattrs_n', 272, 'bindattrs_s', 273, 'bindattrs_o', 274, 'getattr_i', 275, 'getattr_n', 276, 'getattr_s', 277, 'getattr_o', 278, 'getattrs_i', 279, 'getattrs_n', 280, 'getattrs_s', 281, 'getattrs_o', 282, 'attrinited', 283, 'box_i', 284, 'box_n', 285, 'box_s', 286, 'unbox_i', 287, 'unbox_n', 288, 'unbox_s', 289, 'atpos_i', 290, 'atpos_n', 291, 'atpos_s', 292, 'atpos_o', 293, 'bindpos_i', 294, 'bindpos_n', 295, 'bindpos_s', 296, 'bindpos_o', 297, 'push_i', 298, 'push_n', 299, 'push_s', 300, 'push_o', 301, 'pop_i', 302, 'pop_n', 303, 'pop_s', 304, 'pop_o', 305, 'shift_i', 306, 'shift_n', 307, 'shift_s', 308, 'shift_o', 309, 'unshift_i', 310, 'unshift_n', 311, 'unshift_s', 312, 'unshift_o', 313, 'splice', 314, 'setelemspos', 315, 'existspos', 316, 'atkey_i', 317, 'atkey_n', 318, 'atkey_s', 319, 'atkey_o', 320, 'bindkey_i', 321, 'bindkey_n', 322, 'bindkey_s', 323, 'bindkey_o', 324, 'existskey', 325, 'deletekey', 326, 'elems', 327, 'knowhow', 328, 'knowhowattr', 329, 'newtype', 330, 'composetype', 331, 'setmethcache', 332, 'setmethcacheauth', 333, 'settypecache', 334, 'settypecheckmode', 335, 'setboolspec', 336, 'istrue', 337, 'isfalse', 338, 'bootint', 339, 'bootnum', 340, 'bootstr', 341, 'bootarray', 342, 'bootintarray', 343, 'bootnumarray', 344, 'bootstrarray', 345, 'boothash', 346, 'isint', 347, 'isnum', 348, 'isstr', 349, 'islist', 350, 'ishash', 351, 'sethllconfig', 352, 'hllboxtype_i', 353, 'hllboxtype_n', 354, 'hllboxtype_s', 355, 'hlllist', 356, 'hllhash', 357, 'getcomp', 358, 'bindcomp', 359, 'getcurhllsym', 360, 'bindcurhllsym', 361, 'gethllsym', 362, 'bindhllsym', 363, 'settypehll', 364, 'settypehllrole', 365, 'hllize', 366, 'hllizefor', 367, 'usecompileehllconfig', 368, 'usecompilerhllconfig', 369, 'iter', 370, 'iterkey_s', 371, 'iterval', 372, 'getcodename', 373, 'iscoderef', 374, 'getcodeobj', 375, 'setcodeobj', 376, 'setcodename', 377, 'forceouterctx', 378, 'setinvokespec', 379, 'isinvokable', 380, 'freshcoderef', 381, 'markcodestatic', 382, 'markcodestub', 383, 'getstaticcode', 384, 'getcodecuid', 385, 'setdispatcher', 386, 'takedispatcher', 387, 'assign', 388, 'assignunchecked', 389, 'iscont', 390, 'decont', 391, 'setcontspec', 392, 'sha1', 393, 'createsc', 394, 'scsetobj', 395, 'scsetcode', 396, 'scgetobj', 397, 'scgethandle', 398, 'scgetobjidx', 399, 'scsetdesc', 400, 'scobjcount', 401, 'setobjsc', 402, 'getobjsc', 403, 'serialize', 404, 'deserialize', 405, 'wval', 406, 'wval_wide', 407, 'scwbdisable', 408, 'scwbenable', 409, 'pushcompsc', 410, 'popcompsc', 411, 'scgetdesc', 412, 'loadbytecode', 413, 'masttofile', 414, 'masttocu', 415, 'iscompunit', 416, 'compunitmainline', 417, 'compunitcodes', 418, 'ctx', 419, 'ctxouter', 420, 'ctxcaller', 421, 'ctxlexpad', 422, 'curcode', 423, 'callercode', 424, 'add_I', 425, 'sub_I', 426, 'mul_I', 427, 'div_I', 428, 'mod_I', 429, 'neg_I', 430, 'abs_I', 431, 'cmp_I', 432, 'eq_I', 433, 'ne_I', 434, 'lt_I', 435, 'le_I', 436, 'gt_I', 437, 'ge_I', 438, 'bor_I', 439, 'bxor_I', 440, 'band_I', 441, 'bnot_I', 442, 'blshift_I', 443, 'brshift_I', 444, 'pow_I', 445, 'gcd_I', 446, 'lcm_I', 447, 'expmod_I', 448, 'isprime_I', 449, 'rand_I', 450, 'coerce_In', 451, 'coerce_Is', 452, 'coerce_nI', 453, 'coerce_sI', 454, 'isbig_I', 455, 'bool_I', 456, 'base_I', 457, 'radix_I', 458, 'div_In', 459, 'copy_f', 460, 'append_f', 461, 'rename_f', 462, 'delete_f', 463, 'chmod_f', 464, 'exists_f', 465, 'mkdir', 466, 'rmdir', 467, 'open_dir', 468, 'read_dir', 469, 'close_dir', 470, 'open_fh', 471, 'close_fh', 472, 'read_fhs', 473, 'slurp', 474, 'spew', 475, 'write_fhs', 476, 'seek_fh', 477, 'lock_fh', 478, 'unlock_fh', 479, 'sync_fh', 480, 'trunc_fh', 481, 'eof_fh', 482, 'getstdin', 483, 'getstdout', 484, 'getstderr', 485, 'connect_sk', 486, 'socket', 487, 'bind_sk', 488, 'setinputlinesep_fh', 489, 'accept_sk', 490, 'decodetocodes', 491, 'encodefromcodes', 492, 'setencoding', 493, 'print', 494, 'say', 495, 'readall_fh', 496, 'tell_fh', 497, 'stat', 498, 'readline_fh', 499, 'readlineint_fh', 500, 'chdir', 501, 'srand', 502, 'rand_i', 503, 'rand_n', 504, 'time_i', 505, 'sleep', 506, 'newthread', 507, 'threadjoin', 508, 'time_n', 509, 'exit', 510, 'shell', 511, 'cwd', 512, 'clargs', 513, 'getenvhash', 514, 'loadlib', 515, 'freelib', 516, 'findsym', 517, 'dropsym', 518, 'loadext', 519, 'backendconfig', 520, 'getlexouter', 521, 'getlexrel', 522, 'getlexreldyn', 523, 'getlexrelcaller', 524, 'getlexcaller', 525, 'bitand_s', 526, 'bitor_s', 527, 'bitxor_s', 528, 'isnanorinf', 529, 'inf', 530, 'neginf', 531, 'nan', 532, 'getpid', 533, 'spawn', 534, 'filereadable', 535, 'filewritable', 536, 'fileexecutable', 537, 'say_fhs', 538, 'capturenamedshash', 539, 'read_fhb', 540, 'write_fhb', 541, 'replace', 542, 'newexception', 543, 'DEPRECATED_0', 544, 'backtrace', 545, 'symlink', 546, 'link', 547, 'gethostname', 548, 'exreturnafterunwind', 549, 'continuationclone', 550, 'continuationreset', 551, 'continuationcontrol', 552, 'continuationinvoke', 553, 'randscale_n', 554, 'uniisblock', 555, 'assertparamcheck', 556, 'hintfor', 557, 'paramnamesused', 558, 'getuniname', 559, 'getuniprop_int', 560, 'getuniprop_bool', 561, 'getuniprop_str', 562, 'matchuniprop', 563, 'nativecallbuild', 564, 'nativecallinvoke', 565, 'nativecallrefresh', 566, 'threadrun', 567, 'threadid', 568, 'threadyield', 569, 'currentthread', 570, 'lock', 571, 'unlock', 572, 'semacquire', 573, 'semtryacquire', 574, 'semrelease', 575, 'getlockcondvar', 576, 'condwait', 577, 'condsignalone', 578, 'condsignalall', 579, 'queuepoll', 580, 'setmultispec', 581, 'ctxouterskipthunks', 582, 'ctxcallerskipthunks', 583, 'timer', 584, 'cancel', 585, 'signal', 586, 'watchfile', 587, 'asyncconnect', 588, 'asynclisten', 589, 'asyncwritestr', 590, 'asyncwritebytes', 591, 'asyncreadchars', 592, 'asyncreadbytes', 593, 'getlexstatic_o', 594, 'getlexperinvtype_o', 595, 'execname', 596, 'const_i64_16', 597, 'const_i64_32', 598, 'isnonnull', 599, 'param_rn2_i', 600, 'param_rn2_n', 601, 'param_rn2_s', 602, 'param_rn2_o', 603, 'param_on2_i', 604, 'param_on2_n', 605, 'param_on2_s', 606, 'param_on2_o', 607, 'osrpoint', 608, 'nativecallcast', 609, 'spawnprocasync', 610, 'killprocasync', 611, 'startprofile', 612, 'endprofile', 613, 'objectid', 614, 'settypefinalize', 615, 'force_gc', 616, 'nativecallglobal', 617, 'close_fhi', 618, 'setparameterizer', 619, 'parameterizetype', 620, 'typeparameterized', 621, 'typeparameters', 622, 'typeparameterat', 623, 'readlink', 624, 'lstat', 625, 'iscont_i', 626, 'iscont_n', 627, 'iscont_s', 628, 'assign_i', 629, 'assign_n', 630, 'assign_s', 631, 'decont_i', 632, 'decont_n', 633, 'decont_s', 634, 'getregref_i', 635, 'getregref_n', 636, 'getregref_s', 637, 'getlexref_i', 638, 'getlexref_n', 639, 'getlexref_s', 640, 'getlexref_ni', 641, 'getlexref_nn', 642, 'getlexref_ns', 643, 'atposref_i', 644, 'atposref_n', 645, 'atposref_s', 646, 'getattrref_i', 647, 'getattrref_n', 648, 'getattrref_s', 649, 'getattrsref_i', 650, 'getattrsref_n', 651, 'getattrsref_s', 652, 'nativecallsizeof', 653, 'encodenorm', 654, 'normalizecodes', 655, 'strfromcodes', 656, 'strtocodes', 657, 'getcodelocation', 658, 'eqatim_s', 659, 'ordbaseat', 660, 'neverrepossess', 661, 'scdisclaim', 662, 'syncpipe', 663, 'atpos2d_i', 664, 'atpos2d_n', 665, 'atpos2d_s', 666, 'atpos2d_o', 667, 'atpos3d_i', 668, 'atpos3d_n', 669, 'atpos3d_s', 670, 'atpos3d_o', 671, 'atposnd_i', 672, 'atposnd_n', 673, 'atposnd_s', 674, 'atposnd_o', 675, 'bindpos2d_i', 676, 'bindpos2d_n', 677, 'bindpos2d_s', 678, 'bindpos2d_o', 679, 'bindpos3d_i', 680, 'bindpos3d_n', 681, 'bindpos3d_s', 682, 'bindpos3d_o', 683, 'bindposnd_i', 684, 'bindposnd_n', 685, 'bindposnd_s', 686, 'bindposnd_o', 687, 'dimensions', 688, 'setdimensions', 689, 'numdimensions', 690, 'ctxcode', 691, 'isrwcont', 692, 'fc', 693, 'setinputlineseps_fh', 694, 'readlinechomp_fh', 695, 'encoderep', 696, 'istty_fh', 697, 'sp_log', 698, 'sp_osrfinalize', 699, 'sp_guardconc', 700, 'sp_guardtype', 701, 'sp_guardcontconc', 702, 'sp_guardconttype', 703, 'sp_guardrwconc', 704, 'sp_guardrwtype', 705, 'sp_getarg_o', 706, 'sp_getarg_i', 707, 'sp_getarg_n', 708, 'sp_getarg_s', 709, 'sp_fastinvoke_v', 710, 'sp_fastinvoke_i', 711, 'sp_fastinvoke_n', 712, 'sp_fastinvoke_s', 713, 'sp_fastinvoke_o', 714, 'sp_namedarg_used', 715, 'sp_getspeshslot', 716, 'sp_findmeth', 717, 'sp_fastcreate', 718, 'sp_get_o', 719, 'sp_get_i64', 720, 'sp_get_i32', 721, 'sp_get_i16', 722, 'sp_get_i8', 723, 'sp_get_n', 724, 'sp_get_s', 725, 'sp_bind_o', 726, 'sp_bind_i64', 727, 'sp_bind_i32', 728, 'sp_bind_i16', 729, 'sp_bind_i8', 730, 'sp_bind_n', 731, 'sp_bind_s', 732, 'sp_p6oget_o', 733, 'sp_p6ogetvt_o', 734, 'sp_p6ogetvc_o', 735, 'sp_p6oget_i', 736, 'sp_p6oget_n', 737, 'sp_p6oget_s', 738, 'sp_p6obind_o', 739, 'sp_p6obind_i', 740, 'sp_p6obind_n', 741, 'sp_p6obind_s', 742, 'sp_jit_enter', 743, 'sp_boolify_iter', 744, 'sp_boolify_iter_arr', 745, 'sp_boolify_iter_hash', 746, 'prof_enter', 747, 'prof_enterspesh', 748, 'prof_enterinline', 749, 'prof_enternative', 750, 'prof_exit', 751, 'prof_allocated', 752, 'ctw_check', 753); MAST::Ops.WHO<@names> := nqp::list_s('no_op', 'const_i8', 'const_i16', 'const_i32', 'const_i64', 'const_n32', 'const_n64', 'const_s', 'set', 'extend_u8', 'extend_u16', 'extend_u32', 'extend_i8', 'extend_i16', 'extend_i32', 'trunc_u8', 'trunc_u16', 'trunc_u32', 'trunc_i8', 'trunc_i16', 'trunc_i32', 'extend_n32', 'trunc_n32', 'goto', 'if_i', 'unless_i', 'if_n', 'unless_n', 'if_s', 'unless_s', 'if_s0', 'unless_s0', 'if_o', 'unless_o', 'jumplist', 'getlex', 'bindlex', 'getlex_ni', 'getlex_nn', 'getlex_ns', 'getlex_no', 'bindlex_ni', 'bindlex_nn', 'bindlex_ns', 'bindlex_no', 'getlex_ng', 'bindlex_ng', 'getdynlex', 'binddynlex', 'setlexvalue', 'lexprimspec', 'return_i', 'return_n', 'return_s', 'return_o', 'return', 'eq_i', 'ne_i', 'lt_i', 'le_i', 'gt_i', 'ge_i', 'cmp_i', 'add_i', 'sub_i', 'mul_i', 'div_i', 'div_u', 'mod_i', 'mod_u', 'neg_i', 'abs_i', 'inc_i', 'inc_u', 'dec_i', 'dec_u', 'band_i', 'bor_i', 'bxor_i', 'bnot_i', 'blshift_i', 'brshift_i', 'pow_i', 'not_i', 'gcd_i', 'lcm_i', 'eq_n', 'ne_n', 'lt_n', 'le_n', 'gt_n', 'ge_n', 'cmp_n', 'add_n', 'sub_n', 'mul_n', 'div_n', 'mod_n', 'neg_n', 'abs_n', 'pow_n', 'ceil_n', 'floor_n', 'sin_n', 'asin_n', 'cos_n', 'acos_n', 'tan_n', 'atan_n', 'atan2_n', 'sec_n', 'asec_n', 'sinh_n', 'cosh_n', 'tanh_n', 'sech_n', 'sqrt_n', 'log_n', 'exp_n', 'coerce_in', 'coerce_ni', 'coerce_is', 'coerce_ns', 'coerce_si', 'coerce_sn', 'smrt_numify', 'smrt_strify', 'prepargs', 'arg_i', 'arg_n', 'arg_s', 'arg_o', 'argconst_i', 'argconst_n', 'argconst_s', 'invoke_v', 'invoke_i', 'invoke_n', 'invoke_s', 'invoke_o', 'checkarity', 'param_rp_i', 'param_rp_n', 'param_rp_s', 'param_rp_o', 'param_op_i', 'param_op_n', 'param_op_s', 'param_op_o', 'param_rn_i', 'param_rn_n', 'param_rn_s', 'param_rn_o', 'param_on_i', 'param_on_n', 'param_on_s', 'param_on_o', 'param_sp', 'param_sn', 'getcode', 'caller', 'capturelex', 'takeclosure', 'exception', 'bindexmessage', 'bindexpayload', 'bindexcategory', 'getexmessage', 'getexpayload', 'getexcategory', 'throwdyn', 'throwlex', 'throwlexotic', 'throwcatdyn', 'throwcatlex', 'throwcatlexotic', 'die', 'rethrow', 'resume', 'takehandlerresult', 'newlexotic', 'lexoticresult', 'backtracestrings', 'usecapture', 'savecapture', 'captureposelems', 'captureposarg', 'captureposarg_i', 'captureposarg_n', 'captureposarg_s', 'captureposprimspec', 'captureexistsnamed', 'capturehasnameds', 'invokewithcapture', 'multicacheadd', 'multicachefind', 'null_s', 'isnull_s', 'eq_s', 'ne_s', 'gt_s', 'ge_s', 'lt_s', 'le_s', 'cmp_s', 'eqat_s', 'eqatic_s', 'haveat_s', 'concat_s', 'repeat_s', 'substr_s', 'index_s', 'graphs_s', 'codes_s', 'getcp_s', 'indexcp_s', 'uc', 'lc', 'tc', 'split', 'join', 'getcpbyname', 'indexat', 'indexnat', 'unipropcode', 'unipvalcode', 'hasuniprop', 'hasunipropc', 'chars', 'chr', 'ordfirst', 'ordat', 'rindexfrom', 'escape', 'flip', 'flattenropes', 'iscclass', 'findcclass', 'findnotcclass', 'nfafromstatelist', 'nfarunproto', 'nfarunalt', 'radix', 'encode', 'decode', 'istrue_s', 'isfalse_s', 'null', 'isnull', 'ifnonnull', 'findmeth', 'findmeth_s', 'can', 'can_s', 'create', 'clone', 'isconcrete', 'rebless', 'istype', 'objprimspec', 'gethow', 'getwhat', 'getwho', 'setwho', 'reprname', 'getwhere', 'eqaddr', 'bindattr_i', 'bindattr_n', 'bindattr_s', 'bindattr_o', 'bindattrs_i', 'bindattrs_n', 'bindattrs_s', 'bindattrs_o', 'getattr_i', 'getattr_n', 'getattr_s', 'getattr_o', 'getattrs_i', 'getattrs_n', 'getattrs_s', 'getattrs_o', 'attrinited', 'box_i', 'box_n', 'box_s', 'unbox_i', 'unbox_n', 'unbox_s', 'atpos_i', 'atpos_n', 'atpos_s', 'atpos_o', 'bindpos_i', 'bindpos_n', 'bindpos_s', 'bindpos_o', 'push_i', 'push_n', 'push_s', 'push_o', 'pop_i', 'pop_n', 'pop_s', 'pop_o', 'shift_i', 'shift_n', 'shift_s', 'shift_o', 'unshift_i', 'unshift_n', 'unshift_s', 'unshift_o', 'splice', 'setelemspos', 'existspos', 'atkey_i', 'atkey_n', 'atkey_s', 'atkey_o', 'bindkey_i', 'bindkey_n', 'bindkey_s', 'bindkey_o', 'existskey', 'deletekey', 'elems', 'knowhow', 'knowhowattr', 'newtype', 'composetype', 'setmethcache', 'setmethcacheauth', 'settypecache', 'settypecheckmode', 'setboolspec', 'istrue', 'isfalse', 'bootint', 'bootnum', 'bootstr', 'bootarray', 'bootintarray', 'bootnumarray', 'bootstrarray', 'boothash', 'isint', 'isnum', 'isstr', 'islist', 'ishash', 'sethllconfig', 'hllboxtype_i', 'hllboxtype_n', 'hllboxtype_s', 'hlllist', 'hllhash', 'getcomp', 'bindcomp', 'getcurhllsym', 'bindcurhllsym', 'gethllsym', 'bindhllsym', 'settypehll', 'settypehllrole', 'hllize', 'hllizefor', 'usecompileehllconfig', 'usecompilerhllconfig', 'iter', 'iterkey_s', 'iterval', 'getcodename', 'iscoderef', 'getcodeobj', 'setcodeobj', 'setcodename', 'forceouterctx', 'setinvokespec', 'isinvokable', 'freshcoderef', 'markcodestatic', 'markcodestub', 'getstaticcode', 'getcodecuid', 'setdispatcher', 'takedispatcher', 'assign', 'assignunchecked', 'iscont', 'decont', 'setcontspec', 'sha1', 'createsc', 'scsetobj', 'scsetcode', 'scgetobj', 'scgethandle', 'scgetobjidx', 'scsetdesc', 'scobjcount', 'setobjsc', 'getobjsc', 'serialize', 'deserialize', 'wval', 'wval_wide', 'scwbdisable', 'scwbenable', 'pushcompsc', 'popcompsc', 'scgetdesc', 'loadbytecode', 'masttofile', 'masttocu', 'iscompunit', 'compunitmainline', 'compunitcodes', 'ctx', 'ctxouter', 'ctxcaller', 'ctxlexpad', 'curcode', 'callercode', 'add_I', 'sub_I', 'mul_I', 'div_I', 'mod_I', 'neg_I', 'abs_I', 'cmp_I', 'eq_I', 'ne_I', 'lt_I', 'le_I', 'gt_I', 'ge_I', 'bor_I', 'bxor_I', 'band_I', 'bnot_I', 'blshift_I', 'brshift_I', 'pow_I', 'gcd_I', 'lcm_I', 'expmod_I', 'isprime_I', 'rand_I', 'coerce_In', 'coerce_Is', 'coerce_nI', 'coerce_sI', 'isbig_I', 'bool_I', 'base_I', 'radix_I', 'div_In', 'copy_f', 'append_f', 'rename_f', 'delete_f', 'chmod_f', 'exists_f', 'mkdir', 'rmdir', 'open_dir', 'read_dir', 'close_dir', 'open_fh', 'close_fh', 'read_fhs', 'slurp', 'spew', 'write_fhs', 'seek_fh', 'lock_fh', 'unlock_fh', 'sync_fh', 'trunc_fh', 'eof_fh', 'getstdin', 'getstdout', 'getstderr', 'connect_sk', 'socket', 'bind_sk', 'setinputlinesep_fh', 'accept_sk', 'decodetocodes', 'encodefromcodes', 'setencoding', 'print', 'say', 'readall_fh', 'tell_fh', 'stat', 'readline_fh', 'readlineint_fh', 'chdir', 'srand', 'rand_i', 'rand_n', 'time_i', 'sleep', 'newthread', 'threadjoin', 'time_n', 'exit', 'shell', 'cwd', 'clargs', 'getenvhash', 'loadlib', 'freelib', 'findsym', 'dropsym', 'loadext', 'backendconfig', 'getlexouter', 'getlexrel', 'getlexreldyn', 'getlexrelcaller', 'getlexcaller', 'bitand_s', 'bitor_s', 'bitxor_s', 'isnanorinf', 'inf', 'neginf', 'nan', 'getpid', 'spawn', 'filereadable', 'filewritable', 'fileexecutable', 'say_fhs', 'capturenamedshash', 'read_fhb', 'write_fhb', 'replace', 'newexception', 'DEPRECATED_0', 'backtrace', 'symlink', 'link', 'gethostname', 'exreturnafterunwind', 'continuationclone', 'continuationreset', 'continuationcontrol', 'continuationinvoke', 'randscale_n', 'uniisblock', 'assertparamcheck', 'hintfor', 'paramnamesused', 'getuniname', 'getuniprop_int', 'getuniprop_bool', 'getuniprop_str', 'matchuniprop', 'nativecallbuild', 'nativecallinvoke', 'nativecallrefresh', 'threadrun', 'threadid', 'threadyield', 'currentthread', 'lock', 'unlock', 'semacquire', 'semtryacquire', 'semrelease', 'getlockcondvar', 'condwait', 'condsignalone', 'condsignalall', 'queuepoll', 'setmultispec', 'ctxouterskipthunks', 'ctxcallerskipthunks', 'timer', 'cancel', 'signal', 'watchfile', 'asyncconnect', 'asynclisten', 'asyncwritestr', 'asyncwritebytes', 'asyncreadchars', 'asyncreadbytes', 'getlexstatic_o', 'getlexperinvtype_o', 'execname', 'const_i64_16', 'const_i64_32', 'isnonnull', 'param_rn2_i', 'param_rn2_n', 'param_rn2_s', 'param_rn2_o', 'param_on2_i', 'param_on2_n', 'param_on2_s', 'param_on2_o', 'osrpoint', 'nativecallcast', 'spawnprocasync', 'killprocasync', 'startprofile', 'endprofile', 'objectid', 'settypefinalize', 'force_gc', 'nativecallglobal', 'close_fhi', 'setparameterizer', 'parameterizetype', 'typeparameterized', 'typeparameters', 'typeparameterat', 'readlink', 'lstat', 'iscont_i', 'iscont_n', 'iscont_s', 'assign_i', 'assign_n', 'assign_s', 'decont_i', 'decont_n', 'decont_s', 'getregref_i', 'getregref_n', 'getregref_s', 'getlexref_i', 'getlexref_n', 'getlexref_s', 'getlexref_ni', 'getlexref_nn', 'getlexref_ns', 'atposref_i', 'atposref_n', 'atposref_s', 'getattrref_i', 'getattrref_n', 'getattrref_s', 'getattrsref_i', 'getattrsref_n', 'getattrsref_s', 'nativecallsizeof', 'encodenorm', 'normalizecodes', 'strfromcodes', 'strtocodes', 'getcodelocation', 'eqatim_s', 'ordbaseat', 'neverrepossess', 'scdisclaim', 'syncpipe', 'atpos2d_i', 'atpos2d_n', 'atpos2d_s', 'atpos2d_o', 'atpos3d_i', 'atpos3d_n', 'atpos3d_s', 'atpos3d_o', 'atposnd_i', 'atposnd_n', 'atposnd_s', 'atposnd_o', 'bindpos2d_i', 'bindpos2d_n', 'bindpos2d_s', 'bindpos2d_o', 'bindpos3d_i', 'bindpos3d_n', 'bindpos3d_s', 'bindpos3d_o', 'bindposnd_i', 'bindposnd_n', 'bindposnd_s', 'bindposnd_o', 'dimensions', 'setdimensions', 'numdimensions', 'ctxcode', 'isrwcont', 'fc', 'setinputlineseps_fh', 'readlinechomp_fh', 'encoderep', 'istty_fh', 'sp_log', 'sp_osrfinalize', 'sp_guardconc', 'sp_guardtype', 'sp_guardcontconc', 'sp_guardconttype', 'sp_guardrwconc', 'sp_guardrwtype', 'sp_getarg_o', 'sp_getarg_i', 'sp_getarg_n', 'sp_getarg_s', 'sp_fastinvoke_v', 'sp_fastinvoke_i', 'sp_fastinvoke_n', 'sp_fastinvoke_s', 'sp_fastinvoke_o', 'sp_namedarg_used', 'sp_getspeshslot', 'sp_findmeth', 'sp_fastcreate', 'sp_get_o', 'sp_get_i64', 'sp_get_i32', 'sp_get_i16', 'sp_get_i8', 'sp_get_n', 'sp_get_s', 'sp_bind_o', 'sp_bind_i64', 'sp_bind_i32', 'sp_bind_i16', 'sp_bind_i8', 'sp_bind_n', 'sp_bind_s', 'sp_p6oget_o', 'sp_p6ogetvt_o', 'sp_p6ogetvc_o', 'sp_p6oget_i', 'sp_p6oget_n', 'sp_p6oget_s', 'sp_p6obind_o', 'sp_p6obind_i', 'sp_p6obind_n', 'sp_p6obind_s', 'sp_jit_enter', 'sp_boolify_iter', 'sp_boolify_iter_arr', 'sp_boolify_iter_hash', 'prof_enter', 'prof_enterspesh', 'prof_enterinline', 'prof_enternative', 'prof_exit', 'prof_allocated', 'ctw_check'); } MoarVM-2015.11/lib/MAST/Ops.p60000644000175000017500000014041012554473060014400 0ustar jnthnjnthn# This file is generated from src/core/oplist by tools/update_ops.p6. module MASTOps; our @offsets is export = 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 99, 102, 103, 104, 105, 106, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 150, 152, 153, 154, 155, 156, 159, 162, 165, 167, 170, 173, 176, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 222, 224, 227, 229, 231, 233, 235, 237, 239, 241, 243, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 281, 283, 285, 287, 289, 291, 293, 295, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 317, 320, 323, 326, 328, 330, 332, 334, 337, 340, 343, 346, 348, 349, 351, 353, 354, 356, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, 383, 384, 385, 386, 388, 390, 392, 393, 394, 396, 399, 402, 405, 408, 411, 414, 416, 419, 423, 426, 427, 429, 432, 435, 438, 441, 444, 447, 450, 454, 458, 464, 467, 470, 474, 478, 480, 482, 485, 488, 490, 492, 494, 497, 500, 502, 506, 510, 512, 515, 520, 525, 527, 529, 531, 534, 538, 540, 542, 543, 547, 552, 557, 560, 564, 570, 575, 579, 582, 584, 586, 587, 589, 591, 594, 597, 600, 603, 605, 607, 609, 612, 615, 617, 619, 621, 623, 626, 628, 630, 633, 638, 643, 648, 653, 657, 661, 665, 669, 674, 679, 684, 689, 693, 697, 701, 705, 709, 712, 715, 718, 720, 722, 724, 727, 730, 733, 736, 739, 742, 745, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 784, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 818, 820, 821, 822, 825, 828, 830, 832, 834, 836, 839, 841, 843, 844, 845, 846, 847, 848, 849, 850, 851, 853, 855, 857, 859, 861, 863, 864, 865, 866, 867, 868, 870, 873, 875, 878, 881, 884, 886, 888, 890, 893, 893, 893, 895, 897, 899, 901, 903, 905, 907, 909, 911, 915, 917, 919, 920, 921, 923, 925, 926, 927, 929, 931, 933, 935, 938, 940, 942, 945, 948, 951, 953, 956, 958, 960, 962, 964, 967, 972, 975, 978, 979, 980, 981, 982, 984, 986, 989, 992, 994, 996, 998, 999, 1001, 1003, 1005, 1006, 1007, 1011, 1015, 1019, 1023, 1027, 1030, 1033, 1036, 1039, 1042, 1045, 1048, 1051, 1054, 1058, 1062, 1066, 1069, 1073, 1077, 1082, 1086, 1090, 1095, 1098, 1101, 1103, 1105, 1108, 1111, 1113, 1115, 1118, 1124, 1127, 1129, 1131, 1133, 1134, 1136, 1138, 1140, 1141, 1143, 1145, 1146, 1149, 1150, 1153, 1156, 1159, 1162, 1165, 1168, 1169, 1170, 1172, 1174, 1175, 1176, 1177, 1180, 1182, 1185, 1187, 1189, 1189, 1189, 1191, 1192, 1193, 1195, 1197, 1200, 1202, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1214, 1215, 1216, 1217, 1221, 1222, 1223, 1224, 1226, 1227, 1230, 1231, 1233, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1259, 1260, 1261, 1262, 1266, 1268, 1270, 1272, 1275, 1277, 1280, 1282, 1287, 1288, 1293, 1295, 1297, 1299, 1300, 1301, 1303, 1306, 1310, 1313, 1315, 1319, 1320, 1323, 1323, 1325, 1328, 1331, 1334, 1338, 1344, 1348, 1349, 1350, 1352, 1352, 1353, 1354, 1355, 1356, 1358, 1359, 1362, 1363, 1364, 1365, 1367, 1371, 1373, 1375, 1381, 1382, 1387, 1392, 1398, 1404, 1410, 1416, 1421, 1427, 1429, 1431, 1432, 1434, 1436, 1438, 1441, 1444, 1447, 1450, 1454, 1458, 1462, 1466, 1466, 1470, 1476, 1478, 1479, 1480, 1482, 1484, 1484, 1489, 1491, 1493, 1493, 1495, 1497, 1500, 1503, 1505, 1507, 1509, 1511, 1513, 1516, 1519, 1522, 1525, 1526, 1528, 1532, 1535, 1538, 1541, 1544, 1547, 1550, 1553, 1556, 1559, 1562, 1566, 1570, 1573, 1576, 1579, 1582, 1585, 1588, 1591, 1592, 1594, 1596, 1598, 1598, 1598, 1599, 1599; our @counts = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 3, 3, 4, 4, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 4, 4, 2, 3, 5, 5, 2, 2, 2, 3, 4, 2, 2, 1, 4, 5, 5, 3, 4, 6, 5, 4, 3, 2, 2, 1, 2, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 3, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 3, 5, 3, 3, 1, 1, 1, 1, 2, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 3, 2, 2, 3, 3, 2, 2, 3, 6, 3, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 1, 1, 3, 2, 3, 2, 2, 0, 0, 2, 1, 1, 2, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 2, 1, 3, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 3, 2, 1, 1, 1, 1, 4, 2, 2, 2, 3, 2, 3, 2, 5, 1, 5, 2, 2, 2, 1, 1, 2, 3, 4, 3, 2, 4, 1, 3, 0, 2, 3, 3, 3, 4, 6, 4, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 2, 4, 2, 2, 6, 1, 5, 5, 6, 6, 6, 6, 5, 6, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 4, 6, 2, 1, 1, 2, 2, 0, 5, 2, 2, 0, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 2, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 0, 0, 1, 0, 1; our @values is export = 10, 8, 18, 16, 26, 24, 34, 32, 42, 40, 50, 48, 58, 56, 82, 81, 34, 9, 34, 17, 34, 25, 34, 9, 34, 17, 34, 25, 10, 33, 18, 33, 26, 33, 10, 33, 18, 33, 26, 33, 50, 41, 42, 49, 72, 33, 72, 33, 72, 49, 72, 49, 72, 57, 72, 57, 72, 57, 72, 57, 72, 65, 72, 65, 72, 32, 33, 82, 83, 84, 81, 34, 56, 50, 56, 58, 56, 66, 56, 56, 33, 56, 49, 56, 57, 56, 65, 66, 57, 57, 65, 66, 57, 57, 65, 65, 56, 65, 16, 34, 65, 57, 33, 49, 57, 65, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 34, 34, 34, 34, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 49, 34, 49, 34, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 33, 34, 49, 58, 33, 58, 49, 34, 57, 50, 57, 50, 65, 58, 65, 104, 16, 33, 16, 49, 16, 57, 16, 65, 16, 32, 16, 48, 16, 56, 65, 34, 65, 50, 65, 58, 65, 66, 65, 16, 16, 34, 16, 50, 16, 58, 16, 66, 16, 34, 16, 72, 50, 16, 72, 58, 16, 72, 66, 16, 72, 34, 56, 50, 56, 58, 56, 66, 56, 34, 56, 72, 50, 56, 72, 58, 56, 72, 66, 56, 72, 66, 16, 66, 66, 96, 66, 33, 65, 66, 65, 66, 65, 57, 65, 65, 65, 33, 58, 65, 66, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 32, 66, 32, 66, 32, 66, 57, 65, 65, 66, 66, 72, 66, 65, 66, 65, 66, 66, 34, 65, 66, 65, 33, 34, 65, 33, 50, 65, 33, 58, 65, 33, 34, 65, 33, 34, 65, 57, 34, 65, 66, 65, 65, 66, 65, 65, 65, 66, 65, 65, 58, 34, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 33, 34, 57, 57, 33, 34, 57, 33, 33, 57, 33, 58, 57, 57, 58, 57, 33, 58, 57, 33, 33, 34, 57, 57, 33, 34, 57, 34, 57, 34, 57, 33, 34, 57, 33, 58, 57, 58, 57, 58, 57, 66, 57, 57, 58, 57, 65, 34, 57, 57, 33, 56, 72, 57, 33, 56, 72, 34, 57, 34, 33, 57, 34, 57, 33, 33, 33, 34, 57, 33, 16, 16, 34, 57, 58, 33, 34, 57, 34, 57, 33, 34, 57, 57, 33, 58, 57, 58, 57, 57, 34, 33, 57, 33, 34, 33, 57, 33, 33, 34, 33, 57, 33, 33, 66, 65, 65, 66, 65, 57, 33, 65, 57, 33, 65, 65, 65, 66, 33, 57, 33, 33, 66, 57, 57, 65, 58, 65, 57, 34, 57, 34, 57, 66, 34, 65, 65, 72, 66, 65, 56, 66, 65, 57, 34, 65, 56, 34, 65, 57, 66, 65, 66, 65, 34, 65, 66, 65, 65, 34, 65, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 65, 65, 58, 65, 34, 65, 34, 65, 65, 65, 65, 56, 33, 16, 65, 65, 56, 49, 16, 65, 65, 56, 57, 16, 65, 65, 56, 65, 16, 65, 65, 57, 33, 65, 65, 57, 49, 65, 65, 57, 57, 65, 65, 57, 65, 34, 65, 65, 56, 16, 50, 65, 65, 56, 16, 58, 65, 65, 56, 16, 66, 65, 65, 56, 16, 34, 65, 65, 57, 50, 65, 65, 57, 58, 65, 65, 57, 66, 65, 65, 57, 34, 65, 65, 57, 66, 33, 65, 66, 49, 65, 66, 57, 65, 34, 65, 50, 65, 58, 65, 34, 65, 33, 50, 65, 33, 58, 65, 33, 66, 65, 33, 65, 33, 33, 65, 33, 49, 65, 33, 57, 65, 33, 65, 65, 33, 65, 49, 65, 57, 65, 65, 34, 65, 50, 65, 58, 65, 66, 65, 34, 65, 50, 65, 58, 65, 66, 65, 65, 33, 65, 49, 65, 57, 65, 65, 65, 65, 33, 33, 65, 33, 34, 65, 33, 34, 65, 57, 50, 65, 57, 58, 65, 57, 66, 65, 57, 65, 57, 33, 65, 57, 49, 65, 57, 57, 65, 57, 65, 34, 65, 57, 65, 57, 34, 65, 66, 66, 66, 65, 57, 66, 65, 65, 65, 65, 65, 33, 65, 65, 65, 33, 65, 33, 65, 34, 65, 34, 65, 66, 66, 66, 66, 66, 66, 66, 66, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 57, 65, 66, 66, 66, 66, 66, 66, 57, 66, 57, 65, 66, 57, 66, 57, 65, 66, 57, 57, 57, 57, 65, 65, 57, 65, 33, 66, 65, 66, 65, 57, 66, 65, 58, 65, 66, 65, 58, 65, 34, 65, 66, 65, 65, 65, 65, 57, 65, 65, 65, 65, 57, 65, 34, 65, 66, 65, 65, 65, 66, 65, 58, 65, 65, 66, 65, 65, 65, 65, 34, 65, 66, 65, 65, 57, 65, 58, 57, 66, 57, 65, 33, 65, 65, 33, 65, 66, 65, 33, 58, 65, 34, 65, 65, 65, 57, 34, 65, 65, 65, 66, 65, 58, 65, 65, 57, 65, 65, 65, 65, 66, 16, 16, 66, 16, 32, 34, 34, 65, 66, 58, 65, 58, 57, 65, 65, 57, 66, 65, 65, 34, 65, 66, 65, 66, 65, 66, 66, 65, 66, 65, 66, 65, 66, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 33, 65, 66, 65, 33, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 65, 34, 65, 33, 66, 65, 65, 50, 65, 58, 65, 66, 49, 65, 66, 57, 65, 34, 65, 34, 65, 58, 65, 33, 66, 33, 57, 33, 33, 65, 50, 65, 65, 57, 57, 57, 57, 57, 57, 57, 57, 33, 34, 57, 57, 33, 57, 66, 57, 58, 65, 65, 66, 57, 57, 65, 58, 65, 33, 58, 57, 57, 57, 57, 57, 34, 65, 57, 65, 33, 33, 34, 65, 33, 65, 65, 65, 33, 34, 65, 66, 66, 66, 65, 57, 33, 66, 33, 65, 57, 33, 65, 57, 66, 65, 65, 57, 57, 57, 58, 65, 34, 65, 34, 57, 33, 58, 65, 58, 65, 57, 57, 33, 34, 50, 34, 49, 66, 65, 33, 65, 50, 33, 34, 57, 57, 65, 58, 66, 66, 57, 57, 57, 66, 57, 57, 65, 57, 57, 66, 66, 57, 66, 65, 57, 66, 65, 57, 66, 65, 57, 66, 57, 58, 57, 57, 58, 57, 57, 58, 57, 57, 34, 49, 50, 50, 50, 34, 34, 65, 57, 65, 34, 57, 34, 57, 34, 57, 34, 65, 57, 66, 65, 65, 65, 33, 65, 65, 58, 57, 33, 33, 57, 66, 66, 57, 57, 65, 57, 66, 65, 57, 57, 57, 57, 58, 65, 66, 65, 66, 65, 65, 66, 33, 65, 65, 66, 65, 65, 50, 49, 34, 57, 33, 57, 33, 34, 65, 57, 58, 33, 34, 33, 33, 34, 33, 33, 58, 33, 33, 34, 33, 33, 33, 65, 57, 57, 57, 65, 65, 66, 65, 65, 65, 65, 65, 34, 65, 66, 65, 65, 65, 34, 65, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 57, 57, 66, 65, 66, 65, 66, 65, 65, 33, 33, 65, 65, 66, 65, 65, 33, 65, 66, 65, 65, 57, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 65, 57, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 66, 57, 66, 57, 58, 34, 16, 34, 24, 34, 65, 34, 56, 56, 50, 56, 56, 58, 56, 56, 66, 56, 56, 34, 56, 56, 72, 50, 56, 56, 72, 58, 56, 56, 72, 66, 56, 56, 72, 66, 65, 65, 65, 66, 65, 65, 57, 65, 65, 65, 33, 65, 66, 34, 65, 65, 33, 66, 57, 57, 65, 65, 34, 65, 65, 128, 65, 128, 65, 128, 65, 128, 128, 65, 128, 128, 66, 16, 66, 16, 66, 16, 66, 16, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 66, 65, 16, 16, 66, 128, 66, 65, 56, 128, 66, 16, 128, 66, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 65, 16, 66, 65, 16, 128, 66, 65, 16, 128, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 34, 65, 34, 65, 34, 65, 128, 65; our %codes is export = 'no_op', 0, 'const_i8', 1, 'const_i16', 2, 'const_i32', 3, 'const_i64', 4, 'const_n32', 5, 'const_n64', 6, 'const_s', 7, 'set', 8, 'extend_u8', 9, 'extend_u16', 10, 'extend_u32', 11, 'extend_i8', 12, 'extend_i16', 13, 'extend_i32', 14, 'trunc_u8', 15, 'trunc_u16', 16, 'trunc_u32', 17, 'trunc_i8', 18, 'trunc_i16', 19, 'trunc_i32', 20, 'extend_n32', 21, 'trunc_n32', 22, 'goto', 23, 'if_i', 24, 'unless_i', 25, 'if_n', 26, 'unless_n', 27, 'if_s', 28, 'unless_s', 29, 'if_s0', 30, 'unless_s0', 31, 'if_o', 32, 'unless_o', 33, 'jumplist', 34, 'getlex', 35, 'bindlex', 36, 'getlex_ni', 37, 'getlex_nn', 38, 'getlex_ns', 39, 'getlex_no', 40, 'bindlex_ni', 41, 'bindlex_nn', 42, 'bindlex_ns', 43, 'bindlex_no', 44, 'getlex_ng', 45, 'bindlex_ng', 46, 'getdynlex', 47, 'binddynlex', 48, 'setlexvalue', 49, 'lexprimspec', 50, 'return_i', 51, 'return_n', 52, 'return_s', 53, 'return_o', 54, 'return', 55, 'eq_i', 56, 'ne_i', 57, 'lt_i', 58, 'le_i', 59, 'gt_i', 60, 'ge_i', 61, 'cmp_i', 62, 'add_i', 63, 'sub_i', 64, 'mul_i', 65, 'div_i', 66, 'div_u', 67, 'mod_i', 68, 'mod_u', 69, 'neg_i', 70, 'abs_i', 71, 'inc_i', 72, 'inc_u', 73, 'dec_i', 74, 'dec_u', 75, 'band_i', 76, 'bor_i', 77, 'bxor_i', 78, 'bnot_i', 79, 'blshift_i', 80, 'brshift_i', 81, 'pow_i', 82, 'not_i', 83, 'gcd_i', 84, 'lcm_i', 85, 'eq_n', 86, 'ne_n', 87, 'lt_n', 88, 'le_n', 89, 'gt_n', 90, 'ge_n', 91, 'cmp_n', 92, 'add_n', 93, 'sub_n', 94, 'mul_n', 95, 'div_n', 96, 'mod_n', 97, 'neg_n', 98, 'abs_n', 99, 'pow_n', 100, 'ceil_n', 101, 'floor_n', 102, 'sin_n', 103, 'asin_n', 104, 'cos_n', 105, 'acos_n', 106, 'tan_n', 107, 'atan_n', 108, 'atan2_n', 109, 'sec_n', 110, 'asec_n', 111, 'sinh_n', 112, 'cosh_n', 113, 'tanh_n', 114, 'sech_n', 115, 'sqrt_n', 116, 'log_n', 117, 'exp_n', 118, 'coerce_in', 119, 'coerce_ni', 120, 'coerce_is', 121, 'coerce_ns', 122, 'coerce_si', 123, 'coerce_sn', 124, 'smrt_numify', 125, 'smrt_strify', 126, 'prepargs', 127, 'arg_i', 128, 'arg_n', 129, 'arg_s', 130, 'arg_o', 131, 'argconst_i', 132, 'argconst_n', 133, 'argconst_s', 134, 'invoke_v', 135, 'invoke_i', 136, 'invoke_n', 137, 'invoke_s', 138, 'invoke_o', 139, 'checkarity', 140, 'param_rp_i', 141, 'param_rp_n', 142, 'param_rp_s', 143, 'param_rp_o', 144, 'param_op_i', 145, 'param_op_n', 146, 'param_op_s', 147, 'param_op_o', 148, 'param_rn_i', 149, 'param_rn_n', 150, 'param_rn_s', 151, 'param_rn_o', 152, 'param_on_i', 153, 'param_on_n', 154, 'param_on_s', 155, 'param_on_o', 156, 'param_sp', 157, 'param_sn', 158, 'getcode', 159, 'caller', 160, 'capturelex', 161, 'takeclosure', 162, 'exception', 163, 'bindexmessage', 164, 'bindexpayload', 165, 'bindexcategory', 166, 'getexmessage', 167, 'getexpayload', 168, 'getexcategory', 169, 'throwdyn', 170, 'throwlex', 171, 'throwlexotic', 172, 'throwcatdyn', 173, 'throwcatlex', 174, 'throwcatlexotic', 175, 'die', 176, 'rethrow', 177, 'resume', 178, 'takehandlerresult', 179, 'newlexotic', 180, 'lexoticresult', 181, 'backtracestrings', 182, 'usecapture', 183, 'savecapture', 184, 'captureposelems', 185, 'captureposarg', 186, 'captureposarg_i', 187, 'captureposarg_n', 188, 'captureposarg_s', 189, 'captureposprimspec', 190, 'captureexistsnamed', 191, 'capturehasnameds', 192, 'invokewithcapture', 193, 'multicacheadd', 194, 'multicachefind', 195, 'null_s', 196, 'isnull_s', 197, 'eq_s', 198, 'ne_s', 199, 'gt_s', 200, 'ge_s', 201, 'lt_s', 202, 'le_s', 203, 'cmp_s', 204, 'eqat_s', 205, 'eqatic_s', 206, 'haveat_s', 207, 'concat_s', 208, 'repeat_s', 209, 'substr_s', 210, 'index_s', 211, 'graphs_s', 212, 'codes_s', 213, 'getcp_s', 214, 'indexcp_s', 215, 'uc', 216, 'lc', 217, 'tc', 218, 'split', 219, 'join', 220, 'getcpbyname', 221, 'indexat', 222, 'indexnat', 223, 'unipropcode', 224, 'unipvalcode', 225, 'hasuniprop', 226, 'hasunipropc', 227, 'chars', 228, 'chr', 229, 'ordfirst', 230, 'ordat', 231, 'rindexfrom', 232, 'escape', 233, 'flip', 234, 'flattenropes', 235, 'iscclass', 236, 'findcclass', 237, 'findnotcclass', 238, 'nfafromstatelist', 239, 'nfarunproto', 240, 'nfarunalt', 241, 'radix', 242, 'encode', 243, 'decode', 244, 'istrue_s', 245, 'isfalse_s', 246, 'null', 247, 'isnull', 248, 'ifnonnull', 249, 'findmeth', 250, 'findmeth_s', 251, 'can', 252, 'can_s', 253, 'create', 254, 'clone', 255, 'isconcrete', 256, 'rebless', 257, 'istype', 258, 'objprimspec', 259, 'gethow', 260, 'getwhat', 261, 'getwho', 262, 'setwho', 263, 'reprname', 264, 'getwhere', 265, 'eqaddr', 266, 'bindattr_i', 267, 'bindattr_n', 268, 'bindattr_s', 269, 'bindattr_o', 270, 'bindattrs_i', 271, 'bindattrs_n', 272, 'bindattrs_s', 273, 'bindattrs_o', 274, 'getattr_i', 275, 'getattr_n', 276, 'getattr_s', 277, 'getattr_o', 278, 'getattrs_i', 279, 'getattrs_n', 280, 'getattrs_s', 281, 'getattrs_o', 282, 'attrinited', 283, 'box_i', 284, 'box_n', 285, 'box_s', 286, 'unbox_i', 287, 'unbox_n', 288, 'unbox_s', 289, 'atpos_i', 290, 'atpos_n', 291, 'atpos_s', 292, 'atpos_o', 293, 'bindpos_i', 294, 'bindpos_n', 295, 'bindpos_s', 296, 'bindpos_o', 297, 'push_i', 298, 'push_n', 299, 'push_s', 300, 'push_o', 301, 'pop_i', 302, 'pop_n', 303, 'pop_s', 304, 'pop_o', 305, 'shift_i', 306, 'shift_n', 307, 'shift_s', 308, 'shift_o', 309, 'unshift_i', 310, 'unshift_n', 311, 'unshift_s', 312, 'unshift_o', 313, 'splice', 314, 'setelemspos', 315, 'existspos', 316, 'atkey_i', 317, 'atkey_n', 318, 'atkey_s', 319, 'atkey_o', 320, 'bindkey_i', 321, 'bindkey_n', 322, 'bindkey_s', 323, 'bindkey_o', 324, 'existskey', 325, 'deletekey', 326, 'elems', 327, 'knowhow', 328, 'knowhowattr', 329, 'newtype', 330, 'composetype', 331, 'setmethcache', 332, 'setmethcacheauth', 333, 'settypecache', 334, 'settypecheckmode', 335, 'setboolspec', 336, 'istrue', 337, 'isfalse', 338, 'bootint', 339, 'bootnum', 340, 'bootstr', 341, 'bootarray', 342, 'bootintarray', 343, 'bootnumarray', 344, 'bootstrarray', 345, 'boothash', 346, 'isint', 347, 'isnum', 348, 'isstr', 349, 'islist', 350, 'ishash', 351, 'sethllconfig', 352, 'hllboxtype_i', 353, 'hllboxtype_n', 354, 'hllboxtype_s', 355, 'hlllist', 356, 'hllhash', 357, 'getcomp', 358, 'bindcomp', 359, 'getcurhllsym', 360, 'bindcurhllsym', 361, 'gethllsym', 362, 'bindhllsym', 363, 'settypehll', 364, 'settypehllrole', 365, 'hllize', 366, 'hllizefor', 367, 'usecompileehllconfig', 368, 'usecompilerhllconfig', 369, 'iter', 370, 'iterkey_s', 371, 'iterval', 372, 'getcodename', 373, 'iscoderef', 374, 'getcodeobj', 375, 'setcodeobj', 376, 'setcodename', 377, 'forceouterctx', 378, 'setinvokespec', 379, 'isinvokable', 380, 'freshcoderef', 381, 'markcodestatic', 382, 'markcodestub', 383, 'getstaticcode', 384, 'getcodecuid', 385, 'setdispatcher', 386, 'takedispatcher', 387, 'assign', 388, 'assignunchecked', 389, 'iscont', 390, 'decont', 391, 'setcontspec', 392, 'sha1', 393, 'createsc', 394, 'scsetobj', 395, 'scsetcode', 396, 'scgetobj', 397, 'scgethandle', 398, 'scgetobjidx', 399, 'scsetdesc', 400, 'scobjcount', 401, 'setobjsc', 402, 'getobjsc', 403, 'serialize', 404, 'deserialize', 405, 'wval', 406, 'wval_wide', 407, 'scwbdisable', 408, 'scwbenable', 409, 'pushcompsc', 410, 'popcompsc', 411, 'scgetdesc', 412, 'loadbytecode', 413, 'masttofile', 414, 'masttocu', 415, 'iscompunit', 416, 'compunitmainline', 417, 'compunitcodes', 418, 'ctx', 419, 'ctxouter', 420, 'ctxcaller', 421, 'ctxlexpad', 422, 'curcode', 423, 'callercode', 424, 'add_I', 425, 'sub_I', 426, 'mul_I', 427, 'div_I', 428, 'mod_I', 429, 'neg_I', 430, 'abs_I', 431, 'cmp_I', 432, 'eq_I', 433, 'ne_I', 434, 'lt_I', 435, 'le_I', 436, 'gt_I', 437, 'ge_I', 438, 'bor_I', 439, 'bxor_I', 440, 'band_I', 441, 'bnot_I', 442, 'blshift_I', 443, 'brshift_I', 444, 'pow_I', 445, 'gcd_I', 446, 'lcm_I', 447, 'expmod_I', 448, 'isprime_I', 449, 'rand_I', 450, 'coerce_In', 451, 'coerce_Is', 452, 'coerce_nI', 453, 'coerce_sI', 454, 'isbig_I', 455, 'bool_I', 456, 'base_I', 457, 'radix_I', 458, 'div_In', 459, 'copy_f', 460, 'append_f', 461, 'rename_f', 462, 'delete_f', 463, 'chmod_f', 464, 'exists_f', 465, 'mkdir', 466, 'rmdir', 467, 'open_dir', 468, 'read_dir', 469, 'close_dir', 470, 'open_fh', 471, 'close_fh', 472, 'read_fhs', 473, 'slurp', 474, 'spew', 475, 'write_fhs', 476, 'seek_fh', 477, 'lock_fh', 478, 'unlock_fh', 479, 'sync_fh', 480, 'trunc_fh', 481, 'eof_fh', 482, 'getstdin', 483, 'getstdout', 484, 'getstderr', 485, 'connect_sk', 486, 'socket', 487, 'bind_sk', 488, 'setinputlinesep_fh', 489, 'accept_sk', 490, 'DEPRECATED_1', 491, 'DEPRECATED_2', 492, 'setencoding', 493, 'print', 494, 'say', 495, 'readall_fh', 496, 'tell_fh', 497, 'stat', 498, 'readline_fh', 499, 'readlineint_fh', 500, 'chdir', 501, 'srand', 502, 'rand_i', 503, 'rand_n', 504, 'time_i', 505, 'sleep', 506, 'newthread', 507, 'threadjoin', 508, 'time_n', 509, 'exit', 510, 'shell', 511, 'cwd', 512, 'clargs', 513, 'getenvhash', 514, 'loadlib', 515, 'freelib', 516, 'findsym', 517, 'dropsym', 518, 'loadext', 519, 'backendconfig', 520, 'getlexouter', 521, 'getlexrel', 522, 'getlexreldyn', 523, 'getlexrelcaller', 524, 'getlexcaller', 525, 'bitand_s', 526, 'bitor_s', 527, 'bitxor_s', 528, 'isnanorinf', 529, 'inf', 530, 'neginf', 531, 'nan', 532, 'getpid', 533, 'spawn', 534, 'filereadable', 535, 'filewritable', 536, 'fileexecutable', 537, 'say_fhs', 538, 'capturenamedshash', 539, 'read_fhb', 540, 'write_fhb', 541, 'replace', 542, 'newexception', 543, 'openpipe', 544, 'backtrace', 545, 'symlink', 546, 'link', 547, 'gethostname', 548, 'exreturnafterunwind', 549, 'continuationclone', 550, 'continuationreset', 551, 'continuationcontrol', 552, 'continuationinvoke', 553, 'randscale_n', 554, 'uniisblock', 555, 'assertparamcheck', 556, 'hintfor', 557, 'paramnamesused', 558, 'getuniname', 559, 'getuniprop_int', 560, 'getuniprop_bool', 561, 'getuniprop_str', 562, 'matchuniprop', 563, 'nativecallbuild', 564, 'nativecallinvoke', 565, 'nativecallrefresh', 566, 'threadrun', 567, 'threadid', 568, 'threadyield', 569, 'currentthread', 570, 'lock', 571, 'unlock', 572, 'semacquire', 573, 'semtryacquire', 574, 'semrelease', 575, 'getlockcondvar', 576, 'condwait', 577, 'condsignalone', 578, 'condsignalall', 579, 'queuepoll', 580, 'setmultispec', 581, 'ctxouterskipthunks', 582, 'ctxcallerskipthunks', 583, 'timer', 584, 'cancel', 585, 'signal', 586, 'watchfile', 587, 'asyncconnect', 588, 'asynclisten', 589, 'asyncwritestr', 590, 'asyncwritebytes', 591, 'asyncreadchars', 592, 'asyncreadbytes', 593, 'getlexstatic_o', 594, 'getlexperinvtype_o', 595, 'execname', 596, 'const_i64_16', 597, 'const_i64_32', 598, 'isnonnull', 599, 'param_rn2_i', 600, 'param_rn2_n', 601, 'param_rn2_s', 602, 'param_rn2_o', 603, 'param_on2_i', 604, 'param_on2_n', 605, 'param_on2_s', 606, 'param_on2_o', 607, 'osrpoint', 608, 'nativecallcast', 609, 'spawnprocasync', 610, 'killprocasync', 611, 'startprofile', 612, 'endprofile', 613, 'objectid', 614, 'settypefinalize', 615, 'force_gc', 616, 'nativecallglobal', 617, 'close_fhi', 618, 'sp_log', 619, 'sp_osrfinalize', 620, 'sp_guardconc', 621, 'sp_guardtype', 622, 'sp_guardcontconc', 623, 'sp_guardconttype', 624, 'sp_getarg_o', 625, 'sp_getarg_i', 626, 'sp_getarg_n', 627, 'sp_getarg_s', 628, 'sp_fastinvoke_v', 629, 'sp_fastinvoke_i', 630, 'sp_fastinvoke_n', 631, 'sp_fastinvoke_s', 632, 'sp_fastinvoke_o', 633, 'sp_namedarg_used', 634, 'sp_getspeshslot', 635, 'sp_findmeth', 636, 'sp_fastcreate', 637, 'sp_get_o', 638, 'sp_get_i', 639, 'sp_get_n', 640, 'sp_get_s', 641, 'sp_bind_o', 642, 'sp_bind_i', 643, 'sp_bind_n', 644, 'sp_bind_s', 645, 'sp_p6oget_o', 646, 'sp_p6ogetvt_o', 647, 'sp_p6ogetvc_o', 648, 'sp_p6oget_i', 649, 'sp_p6oget_n', 650, 'sp_p6oget_s', 651, 'sp_p6obind_o', 652, 'sp_p6obind_i', 653, 'sp_p6obind_n', 654, 'sp_p6obind_s', 655, 'sp_jit_enter', 656, 'sp_boolify_iter', 657, 'sp_boolify_iter_arr', 658, 'sp_boolify_iter_hash', 659, 'prof_enter', 660, 'prof_enterspesh', 661, 'prof_enterinline', 662, 'prof_exit', 663, 'prof_allocated', 664; our @names is export = 'no_op', 'const_i8', 'const_i16', 'const_i32', 'const_i64', 'const_n32', 'const_n64', 'const_s', 'set', 'extend_u8', 'extend_u16', 'extend_u32', 'extend_i8', 'extend_i16', 'extend_i32', 'trunc_u8', 'trunc_u16', 'trunc_u32', 'trunc_i8', 'trunc_i16', 'trunc_i32', 'extend_n32', 'trunc_n32', 'goto', 'if_i', 'unless_i', 'if_n', 'unless_n', 'if_s', 'unless_s', 'if_s0', 'unless_s0', 'if_o', 'unless_o', 'jumplist', 'getlex', 'bindlex', 'getlex_ni', 'getlex_nn', 'getlex_ns', 'getlex_no', 'bindlex_ni', 'bindlex_nn', 'bindlex_ns', 'bindlex_no', 'getlex_ng', 'bindlex_ng', 'getdynlex', 'binddynlex', 'setlexvalue', 'lexprimspec', 'return_i', 'return_n', 'return_s', 'return_o', 'return', 'eq_i', 'ne_i', 'lt_i', 'le_i', 'gt_i', 'ge_i', 'cmp_i', 'add_i', 'sub_i', 'mul_i', 'div_i', 'div_u', 'mod_i', 'mod_u', 'neg_i', 'abs_i', 'inc_i', 'inc_u', 'dec_i', 'dec_u', 'band_i', 'bor_i', 'bxor_i', 'bnot_i', 'blshift_i', 'brshift_i', 'pow_i', 'not_i', 'gcd_i', 'lcm_i', 'eq_n', 'ne_n', 'lt_n', 'le_n', 'gt_n', 'ge_n', 'cmp_n', 'add_n', 'sub_n', 'mul_n', 'div_n', 'mod_n', 'neg_n', 'abs_n', 'pow_n', 'ceil_n', 'floor_n', 'sin_n', 'asin_n', 'cos_n', 'acos_n', 'tan_n', 'atan_n', 'atan2_n', 'sec_n', 'asec_n', 'sinh_n', 'cosh_n', 'tanh_n', 'sech_n', 'sqrt_n', 'log_n', 'exp_n', 'coerce_in', 'coerce_ni', 'coerce_is', 'coerce_ns', 'coerce_si', 'coerce_sn', 'smrt_numify', 'smrt_strify', 'prepargs', 'arg_i', 'arg_n', 'arg_s', 'arg_o', 'argconst_i', 'argconst_n', 'argconst_s', 'invoke_v', 'invoke_i', 'invoke_n', 'invoke_s', 'invoke_o', 'checkarity', 'param_rp_i', 'param_rp_n', 'param_rp_s', 'param_rp_o', 'param_op_i', 'param_op_n', 'param_op_s', 'param_op_o', 'param_rn_i', 'param_rn_n', 'param_rn_s', 'param_rn_o', 'param_on_i', 'param_on_n', 'param_on_s', 'param_on_o', 'param_sp', 'param_sn', 'getcode', 'caller', 'capturelex', 'takeclosure', 'exception', 'bindexmessage', 'bindexpayload', 'bindexcategory', 'getexmessage', 'getexpayload', 'getexcategory', 'throwdyn', 'throwlex', 'throwlexotic', 'throwcatdyn', 'throwcatlex', 'throwcatlexotic', 'die', 'rethrow', 'resume', 'takehandlerresult', 'newlexotic', 'lexoticresult', 'backtracestrings', 'usecapture', 'savecapture', 'captureposelems', 'captureposarg', 'captureposarg_i', 'captureposarg_n', 'captureposarg_s', 'captureposprimspec', 'captureexistsnamed', 'capturehasnameds', 'invokewithcapture', 'multicacheadd', 'multicachefind', 'null_s', 'isnull_s', 'eq_s', 'ne_s', 'gt_s', 'ge_s', 'lt_s', 'le_s', 'cmp_s', 'eqat_s', 'eqatic_s', 'haveat_s', 'concat_s', 'repeat_s', 'substr_s', 'index_s', 'graphs_s', 'codes_s', 'getcp_s', 'indexcp_s', 'uc', 'lc', 'tc', 'split', 'join', 'getcpbyname', 'indexat', 'indexnat', 'unipropcode', 'unipvalcode', 'hasuniprop', 'hasunipropc', 'chars', 'chr', 'ordfirst', 'ordat', 'rindexfrom', 'escape', 'flip', 'flattenropes', 'iscclass', 'findcclass', 'findnotcclass', 'nfafromstatelist', 'nfarunproto', 'nfarunalt', 'radix', 'encode', 'decode', 'istrue_s', 'isfalse_s', 'null', 'isnull', 'ifnonnull', 'findmeth', 'findmeth_s', 'can', 'can_s', 'create', 'clone', 'isconcrete', 'rebless', 'istype', 'objprimspec', 'gethow', 'getwhat', 'getwho', 'setwho', 'reprname', 'getwhere', 'eqaddr', 'bindattr_i', 'bindattr_n', 'bindattr_s', 'bindattr_o', 'bindattrs_i', 'bindattrs_n', 'bindattrs_s', 'bindattrs_o', 'getattr_i', 'getattr_n', 'getattr_s', 'getattr_o', 'getattrs_i', 'getattrs_n', 'getattrs_s', 'getattrs_o', 'attrinited', 'box_i', 'box_n', 'box_s', 'unbox_i', 'unbox_n', 'unbox_s', 'atpos_i', 'atpos_n', 'atpos_s', 'atpos_o', 'bindpos_i', 'bindpos_n', 'bindpos_s', 'bindpos_o', 'push_i', 'push_n', 'push_s', 'push_o', 'pop_i', 'pop_n', 'pop_s', 'pop_o', 'shift_i', 'shift_n', 'shift_s', 'shift_o', 'unshift_i', 'unshift_n', 'unshift_s', 'unshift_o', 'splice', 'setelemspos', 'existspos', 'atkey_i', 'atkey_n', 'atkey_s', 'atkey_o', 'bindkey_i', 'bindkey_n', 'bindkey_s', 'bindkey_o', 'existskey', 'deletekey', 'elems', 'knowhow', 'knowhowattr', 'newtype', 'composetype', 'setmethcache', 'setmethcacheauth', 'settypecache', 'settypecheckmode', 'setboolspec', 'istrue', 'isfalse', 'bootint', 'bootnum', 'bootstr', 'bootarray', 'bootintarray', 'bootnumarray', 'bootstrarray', 'boothash', 'isint', 'isnum', 'isstr', 'islist', 'ishash', 'sethllconfig', 'hllboxtype_i', 'hllboxtype_n', 'hllboxtype_s', 'hlllist', 'hllhash', 'getcomp', 'bindcomp', 'getcurhllsym', 'bindcurhllsym', 'gethllsym', 'bindhllsym', 'settypehll', 'settypehllrole', 'hllize', 'hllizefor', 'usecompileehllconfig', 'usecompilerhllconfig', 'iter', 'iterkey_s', 'iterval', 'getcodename', 'iscoderef', 'getcodeobj', 'setcodeobj', 'setcodename', 'forceouterctx', 'setinvokespec', 'isinvokable', 'freshcoderef', 'markcodestatic', 'markcodestub', 'getstaticcode', 'getcodecuid', 'setdispatcher', 'takedispatcher', 'assign', 'assignunchecked', 'iscont', 'decont', 'setcontspec', 'sha1', 'createsc', 'scsetobj', 'scsetcode', 'scgetobj', 'scgethandle', 'scgetobjidx', 'scsetdesc', 'scobjcount', 'setobjsc', 'getobjsc', 'serialize', 'deserialize', 'wval', 'wval_wide', 'scwbdisable', 'scwbenable', 'pushcompsc', 'popcompsc', 'scgetdesc', 'loadbytecode', 'masttofile', 'masttocu', 'iscompunit', 'compunitmainline', 'compunitcodes', 'ctx', 'ctxouter', 'ctxcaller', 'ctxlexpad', 'curcode', 'callercode', 'add_I', 'sub_I', 'mul_I', 'div_I', 'mod_I', 'neg_I', 'abs_I', 'cmp_I', 'eq_I', 'ne_I', 'lt_I', 'le_I', 'gt_I', 'ge_I', 'bor_I', 'bxor_I', 'band_I', 'bnot_I', 'blshift_I', 'brshift_I', 'pow_I', 'gcd_I', 'lcm_I', 'expmod_I', 'isprime_I', 'rand_I', 'coerce_In', 'coerce_Is', 'coerce_nI', 'coerce_sI', 'isbig_I', 'bool_I', 'base_I', 'radix_I', 'div_In', 'copy_f', 'append_f', 'rename_f', 'delete_f', 'chmod_f', 'exists_f', 'mkdir', 'rmdir', 'open_dir', 'read_dir', 'close_dir', 'open_fh', 'close_fh', 'read_fhs', 'slurp', 'spew', 'write_fhs', 'seek_fh', 'lock_fh', 'unlock_fh', 'sync_fh', 'trunc_fh', 'eof_fh', 'getstdin', 'getstdout', 'getstderr', 'connect_sk', 'socket', 'bind_sk', 'setinputlinesep_fh', 'accept_sk', 'DEPRECATED_1', 'DEPRECATED_2', 'setencoding', 'print', 'say', 'readall_fh', 'tell_fh', 'stat', 'readline_fh', 'readlineint_fh', 'chdir', 'srand', 'rand_i', 'rand_n', 'time_i', 'sleep', 'newthread', 'threadjoin', 'time_n', 'exit', 'shell', 'cwd', 'clargs', 'getenvhash', 'loadlib', 'freelib', 'findsym', 'dropsym', 'loadext', 'backendconfig', 'getlexouter', 'getlexrel', 'getlexreldyn', 'getlexrelcaller', 'getlexcaller', 'bitand_s', 'bitor_s', 'bitxor_s', 'isnanorinf', 'inf', 'neginf', 'nan', 'getpid', 'spawn', 'filereadable', 'filewritable', 'fileexecutable', 'say_fhs', 'capturenamedshash', 'read_fhb', 'write_fhb', 'replace', 'newexception', 'openpipe', 'backtrace', 'symlink', 'link', 'gethostname', 'exreturnafterunwind', 'continuationclone', 'continuationreset', 'continuationcontrol', 'continuationinvoke', 'randscale_n', 'uniisblock', 'assertparamcheck', 'hintfor', 'paramnamesused', 'getuniname', 'getuniprop_int', 'getuniprop_bool', 'getuniprop_str', 'matchuniprop', 'nativecallbuild', 'nativecallinvoke', 'nativecallrefresh', 'threadrun', 'threadid', 'threadyield', 'currentthread', 'lock', 'unlock', 'semacquire', 'semtryacquire', 'semrelease', 'getlockcondvar', 'condwait', 'condsignalone', 'condsignalall', 'queuepoll', 'setmultispec', 'ctxouterskipthunks', 'ctxcallerskipthunks', 'timer', 'cancel', 'signal', 'watchfile', 'asyncconnect', 'asynclisten', 'asyncwritestr', 'asyncwritebytes', 'asyncreadchars', 'asyncreadbytes', 'getlexstatic_o', 'getlexperinvtype_o', 'execname', 'const_i64_16', 'const_i64_32', 'isnonnull', 'param_rn2_i', 'param_rn2_n', 'param_rn2_s', 'param_rn2_o', 'param_on2_i', 'param_on2_n', 'param_on2_s', 'param_on2_o', 'osrpoint', 'nativecallcast', 'spawnprocasync', 'killprocasync', 'startprofile', 'endprofile', 'objectid', 'settypefinalize', 'force_gc', 'nativecallglobal', 'close_fhi', 'sp_log', 'sp_osrfinalize', 'sp_guardconc', 'sp_guardtype', 'sp_guardcontconc', 'sp_guardconttype', 'sp_getarg_o', 'sp_getarg_i', 'sp_getarg_n', 'sp_getarg_s', 'sp_fastinvoke_v', 'sp_fastinvoke_i', 'sp_fastinvoke_n', 'sp_fastinvoke_s', 'sp_fastinvoke_o', 'sp_namedarg_used', 'sp_getspeshslot', 'sp_findmeth', 'sp_fastcreate', 'sp_get_o', 'sp_get_i', 'sp_get_n', 'sp_get_s', 'sp_bind_o', 'sp_bind_i', 'sp_bind_n', 'sp_bind_s', 'sp_p6oget_o', 'sp_p6ogetvt_o', 'sp_p6ogetvc_o', 'sp_p6oget_i', 'sp_p6oget_n', 'sp_p6oget_s', 'sp_p6obind_o', 'sp_p6obind_i', 'sp_p6obind_n', 'sp_p6obind_s', 'sp_jit_enter', 'sp_boolify_iter', 'sp_boolify_iter_arr', 'sp_boolify_iter_hash', 'prof_enter', 'prof_enterspesh', 'prof_enterinline', 'prof_exit', 'prof_allocated'; } MoarVM-2015.11/lib/README.md0000644000175000017500000000100212456307241014072 0ustar jnthnjnthn## MAST Libraries (written in NQP) MAST stands for Moar Abstract Syntax Tree, and is akin to the other NQP backends' VM-specific AST systems (PIRT for Parrot VM and JAST for JVM). Nodes.nqp contains the NQP classes that define the AST nodes, which map closely to the various components of MoarVM's bytecode format. Ops.nqp is generated by tools/update_ops.p6 from src/core/oplist. For the bootstrap, it is concatenated with the other MAST-related NQP files to be compiled to a single .moarvm bytecode library. MoarVM-2015.11/ports/macports/Portfile0000644000175000017500000000234012576617433016573 0ustar jnthnjnthn# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4 # $Id$ PortSystem 1.0 name MoarVM version 2015.09 categories lang devel platforms darwin license Artistic-2 MIT BSD ISC public-domain maintainers coleda.com:will description A virtual machine for Perl 6 long_description MoarVM is a virtual machine built especially for \ Rakudo Perl 6 and the NQP Compiler Toolchain. homepage http://moarvm.org/ master_sites http://moarvm.org/releases/ # To find the correct checksums for the given release, use: # openssl dgst -rmd160 # openssl dgst -sha256 checksums rmd160 c74a3ac21b5c1647aaf7451a97709fdc46e567f1 \ sha256 e93d1d2e918764971fd9e9fd68de73ad900abb25d224a5049a105aae54dba7d3 # FIXME: may need ExtUtil::Command if by chance our default perl5 binary # does not match what Apple ships. depends_build port:perl5 # Unsupported by configure.pl. configure.universal_args-delete --disable-dependency-tracking universal_variant yes configure.cmd ${prefix}/bin/perl Configure.pl MoarVM-2015.11/ports/macports/README0000644000175000017500000000252012520766031015730 0ustar jnthnjnthnWhen updating the Portfile to reflect the new release: First, update the portfile 1) update the version 2) remove the revision, if any is currently specified. 3) Recalculate the checksums (commands given in the file for this.) Keep the trailing \ on the first line. Then, test out the portfile locally. 4) Setup a local portfile directory. Edit /opt/local/etc/macports/sources.conf, adding a reference to a local directory, like: file:///Users/bob/sandbox/macports/ 5) In that folder, create a subdir lang/MoarVM 6) copy the updated Portfile to that folder. 7) Reindex to pick up the new portfile: `portindex` 8) From the top level of that folder, verify that we still build with our declared dependencies with, e.g. `port -t build MoarVM@2015.04` 9) Install the port, e.g. `sudo port install MoarVM@2015.04` Finally, open a ticket to update the portfile 10) Create a unified diff from https://trac.macports.org/browser/trunk/dports/lang/MoarVM/Portfile?format=txt to our most recent copy. 11) create an "update" ticket in http://trac.macports.org/ - you'll need a trac account to open the ticket. Be sure to attach the diff, and list "MoarVM" as the port. Additionally, set keywords to "haspatch", and if you're listed as a maintainer, "maintainer" 12) git push the updated Portfile 13) hang out in #macports on freenode and mention the ticket. MoarVM-2015.11/src/6model/6model.c0000644000175000017500000003770012623370227015372 0ustar jnthnjnthn#include "moar.h" /* Gets the HOW (meta-object), which may be lazily deserialized. */ MVMObject * MVM_6model_get_how(MVMThreadContext *tc, MVMSTable *st) { MVMObject *HOW = st->HOW; if (!HOW) st->HOW = HOW = MVM_sc_get_object(tc, st->HOW_sc, st->HOW_idx); return HOW; } /* Gets the HOW (meta-object), which may be lazily deserialized, through the * STable of the passed object. */ MVMObject * MVM_6model_get_how_obj(MVMThreadContext *tc, MVMObject *obj) { return MVM_6model_get_how(tc, STABLE(obj)); } /* Obtains the method cache, lazily deserializing if it needed. */ static MVMObject * get_method_cache(MVMThreadContext *tc, MVMSTable *st) { if (!st->method_cache) MVM_serialization_finish_deserialize_method_cache(tc, st); return st->method_cache; } /* Locates a method by name, checking in the method cache only. */ MVMObject * MVM_6model_find_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *cache = get_method_cache(tc, STABLE(obj)); if (cache && IS_CONCRETE(cache)) return MVM_repr_at_key_o(tc, cache, name); return NULL; } /* Locates a method by name. Returns the method if it exists, or throws an * exception if it can not be found. */ typedef struct { MVMObject *obj; MVMString *name; MVMRegister *res; } FindMethodSRData; static void die_over_missing_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *handler = MVM_hll_current(tc)->method_not_found_error; if (!MVM_is_null(tc, handler)) { MVMCallsite *methnotfound_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_METH_NOT_FOUND); handler = MVM_frame_find_invokee(tc, handler, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, methnotfound_callsite); tc->cur_frame->args[0].o = obj; tc->cur_frame->args[1].s = name; STABLE(handler)->invoke(tc, handler, methnotfound_callsite, tc->cur_frame->args); return; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot find method '%s'", c_name); } } static void late_bound_find_method_return(MVMThreadContext *tc, void *sr_data) { FindMethodSRData *fm = (FindMethodSRData *)sr_data; if (MVM_is_null(tc, fm->res->o) || !IS_CONCRETE(fm->res->o)) { MVMObject *obj = fm->obj; MVMString *name = fm->name; MVM_free(fm); die_over_missing_method(tc, obj, name); } else { MVM_free(fm); } } static void mark_find_method_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { FindMethodSRData *fm = (FindMethodSRData *)frame->special_return_data; MVM_gc_worklist_add(tc, worklist, &fm->obj); MVM_gc_worklist_add(tc, worklist, &fm->name); } void MVM_6model_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res) { MVMObject *cache, *HOW, *find_method, *code; MVMCallsite *findmeth_callsite; if (MVM_is_null(tc, obj)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot call method '%s' on a null object", c_name); } /* First try to find it in the cache. If we find it, we have a result. * If we don't find it, but the cache is authoritative, then error. */ cache = get_method_cache(tc, STABLE(obj)); if (cache && IS_CONCRETE(cache)) { MVMObject *meth = MVM_repr_at_key_o(tc, cache, name); if (!MVM_is_null(tc, meth)) { res->o = meth; return; } if (STABLE(obj)->mode_flags & MVM_METHOD_CACHE_AUTHORITATIVE) { die_over_missing_method(tc, obj, name); return; } } /* Otherwise, need to call the find_method method. We make the assumption * that the invocant's meta-object's type is composed. */ HOW = MVM_6model_get_how(tc, STABLE(obj)); find_method = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.find_method); if (MVM_is_null(tc, find_method)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot find method '%s': no method cache and no .^find_method", c_name); } /* Set up the call, using the result register as the target. */ code = MVM_frame_find_invokee(tc, find_method, NULL); findmeth_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_FIND_METHOD); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, findmeth_callsite); { FindMethodSRData *fm = MVM_malloc(sizeof(FindMethodSRData)); fm->obj = obj; fm->name = name; fm->res = res; tc->cur_frame->special_return = late_bound_find_method_return; tc->cur_frame->special_return_data = fm; tc->cur_frame->mark_special_return_data = mark_find_method_sr_data; } tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].s = name; STABLE(code)->invoke(tc, code, findmeth_callsite, tc->cur_frame->args); } MVMint32 MVM_6model_find_method_spesh(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMint32 ss_idx, MVMRegister *res) { /* Missed mono-morph; try cache-only lookup. */ MVMObject *meth = MVM_6model_find_method_cache_only(tc, obj, name); if (!MVM_is_null(tc, meth)) { /* Got it; cache. Must be careful due to threads * reading, races, etc. */ MVMStaticFrame *sf = tc->cur_frame->static_info; uv_mutex_lock(&tc->instance->mutex_spesh_install); if (!tc->cur_frame->effective_spesh_slots[ss_idx + 1]) { MVM_ASSIGN_REF(tc, &(sf->common.header), tc->cur_frame->effective_spesh_slots[ss_idx + 1], (MVMCollectable *)meth); MVM_barrier(); MVM_ASSIGN_REF(tc, &(sf->common.header), tc->cur_frame->effective_spesh_slots[ss_idx], (MVMCollectable *)STABLE(obj)); } uv_mutex_unlock(&tc->instance->mutex_spesh_install); res->o = meth; return 0; } else { /* Fully late-bound. */ MVM_6model_find_method(tc, obj, name, res); return 1; } } /* Locates a method by name. Returns 1 if it exists; otherwise 0. */ static void late_bound_can_return(MVMThreadContext *tc, void *sr_data) { /* Transform to an integer result. */ MVMRegister *reg = (MVMRegister *)sr_data; reg->i64 = !MVM_is_null(tc, reg->o) && IS_CONCRETE(reg->o) ? 1 : 0; } MVMint64 MVM_6model_can_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *cache; if (MVM_is_null(tc, obj)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot look for method '%s' on a null object", c_name); } /* Consider the method cache. */ cache = get_method_cache(tc, STABLE(obj)); if (cache && IS_CONCRETE(cache)) { MVMObject *meth = MVM_repr_at_key_o(tc, cache, name); if (!MVM_is_null(tc, meth)) { return 1; } if (STABLE(obj)->mode_flags & MVM_METHOD_CACHE_AUTHORITATIVE) { return 0; } } return -1; } void MVM_6model_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res) { MVMObject *HOW, *find_method, *code; MVMCallsite *findmeth_callsite; MVMint64 can_cached = MVM_6model_can_method_cache_only(tc, obj, name); if (can_cached == 0 || can_cached == 1) { res->i64 = can_cached; return; } /* If no method in cache and the cache is not authoritative, need to make * a late-bound call to find_method. */ HOW = MVM_6model_get_how(tc, STABLE(obj)); find_method = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.find_method); if (MVM_is_null(tc, find_method)) { /* This'll count as a "no"... */ res->i64 = 0; return; } /* Set up the call, using the result register as the target. A little bad * as we're really talking about */ code = MVM_frame_find_invokee(tc, find_method, NULL); findmeth_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_FIND_METHOD); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, findmeth_callsite); tc->cur_frame->special_return = late_bound_can_return; tc->cur_frame->special_return_data = res; tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].s = name; STABLE(code)->invoke(tc, code, findmeth_callsite, tc->cur_frame->args); } /* Checks if an object has a given type, delegating to the type_check or * accepts_type methods as needed. */ static void do_accepts_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res) { MVMObject *HOW = MVM_6model_get_how(tc, STABLE(type)); MVMObject *meth = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.accepts_type); if (!MVM_is_null(tc, meth)) { /* Set up the call, using the result register as the target. */ MVMObject *code = MVM_frame_find_invokee(tc, meth, NULL); MVMCallsite *typecheck_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TYPECHECK); MVM_args_setup_thunk(tc, res, MVM_RETURN_INT, typecheck_callsite); tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = type; tc->cur_frame->args[2].o = obj; STABLE(code)->invoke(tc, code, typecheck_callsite, tc->cur_frame->args); return; } else { MVM_exception_throw_adhoc(tc, "Expected 'accepts_type' method, but none found in meta-object"); } } typedef struct { MVMObject *obj; MVMObject *type; MVMRegister *res; } AcceptsTypeSRData; static void accepts_type_sr(MVMThreadContext *tc, void *sr_data) { AcceptsTypeSRData *atd = (AcceptsTypeSRData *)sr_data; MVMObject *obj = atd->obj; MVMObject *type = atd->type; MVMRegister *res = atd->res; MVM_free(atd); if (!res->i64) do_accepts_type_check(tc, obj, type, res); } static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { AcceptsTypeSRData *atd = (AcceptsTypeSRData *)frame->special_return_data; MVM_gc_worklist_add(tc, worklist, &atd->obj); MVM_gc_worklist_add(tc, worklist, &atd->type); } void MVM_6model_istype(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res) { MVMObject **cache; MVMSTable *st; MVMint64 mode; /* Null never type-checks. */ if (MVM_is_null(tc, obj)) { res->i64 = 0; return; } st = STABLE(obj); mode = STABLE(type)->mode_flags & MVM_TYPE_CHECK_CACHE_FLAG_MASK; cache = st->type_check_cache; if (cache) { /* We have the cache, so just look for the type object we * want to be in there. */ MVMint64 elems = STABLE(obj)->type_check_cache_length; MVMint64 i; for (i = 0; i < elems; i++) { if (cache[i] == type) { res->i64 = 1; return; } } /* If the type check cache is definitive, we're done. */ if ((mode & MVM_TYPE_CHECK_CACHE_THEN_METHOD) == 0 && (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) == 0) { res->i64 = 0; return; } } /* If we get here, need to call .^type_check on the value we're * checking, unless it's an accepts check. */ if (!cache || (mode & MVM_TYPE_CHECK_CACHE_THEN_METHOD)) { MVMObject *HOW = MVM_6model_get_how(tc, st); MVMObject *meth = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.type_check); if (!MVM_is_null(tc, meth)) { /* Set up the call, using the result register as the target. */ MVMObject *code = MVM_frame_find_invokee(tc, meth, NULL); MVMCallsite *typecheck_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TYPECHECK); MVM_args_setup_thunk(tc, res, MVM_RETURN_INT, typecheck_callsite); tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].o = type; if (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) { AcceptsTypeSRData *atd = MVM_malloc(sizeof(AcceptsTypeSRData)); atd->obj = obj; atd->type = type; atd->res = res; tc->cur_frame->special_return = accepts_type_sr; tc->cur_frame->special_return_data = atd; tc->cur_frame->mark_special_return_data = mark_sr_data; } STABLE(code)->invoke(tc, code, typecheck_callsite, tc->cur_frame->args); return; } } /* If the flag to call .accepts_type on the target value is set, do so. */ if (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) { do_accepts_type_check(tc, obj, type, res); } else { /* If all else fails... */ res->i64 = 0; } } /* Checks if an object has a given type, using the cache only. */ MVMint64 MVM_6model_istype_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMObject *type) { if (!MVM_is_null(tc, obj)) { MVMuint16 i, elems = STABLE(obj)->type_check_cache_length; MVMObject **cache = STABLE(obj)->type_check_cache; if (cache) for (i = 0; i < elems; i++) { if (cache[i] == type) return 1; } } return 0; } /* Tries to do a type check using the cache. If the type is in the cache, then * result will be set to a true value and a true value will be returned. If it * is not in the cache and the cache is authoritative, then we know the answer * too; result is set to zero and a true value is returned. Otherwise, we can * not tell and a false value is returned and result is undefined. */ MVMint64 MVM_6model_try_cache_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMint32 *result) { if (!MVM_is_null(tc, obj)) { MVMuint16 i, elems = STABLE(obj)->type_check_cache_length; MVMObject **cache = STABLE(obj)->type_check_cache; if (cache) { for (i = 0; i < elems; i++) { if (cache[i] == type) { *result = 1; return 1; } } if ((STABLE(obj)->mode_flags & MVM_TYPE_CHECK_CACHE_THEN_METHOD) == 0 && (STABLE(type)->mode_flags & MVM_TYPE_CHECK_NEEDS_ACCEPTS) == 0) { *result = 0; return 1; } } } return 0; } /* Default invoke function on STables; for non-invokable objects */ void MVM_6model_invoke_default(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object (REPR: %s)", REPR(invokee)->name); } /* Clean up STable memory. */ void MVM_6model_stable_gc_free(MVMThreadContext *tc, MVMSTable *st) { /* First have it free its repr_data if it wants. */ if (st->REPR->gc_free_repr_data) st->REPR->gc_free_repr_data(tc, st); /* free various storage. */ MVM_free(st->type_check_cache); if (st->container_spec && st->container_spec->gc_free_data) st->container_spec->gc_free_data(tc, st); MVM_free(st->invocation_spec); MVM_free(st->boolification_spec); } /* Get the next type cache ID for a newly created STable. */ MVMuint64 MVM_6model_next_type_cache_id(MVMThreadContext *tc) { return (MVMuint64)MVM_add(&tc->instance->cur_type_cache_id, MVM_TYPE_CACHE_ID_INCR) + MVM_TYPE_CACHE_ID_INCR; } void MVM_6model_never_repossess(MVMThreadContext *tc, MVMObject *obj) { obj->header.flags |= MVM_CF_NEVER_REPOSSESS; } MoarVM-2015.11/src/6model/6model.h0000644000175000017500000006512312623370227015377 0ustar jnthnjnthn/* Boolification mode flags. */ #define MVM_BOOL_MODE_CALL_METHOD 0 #define MVM_BOOL_MODE_UNBOX_INT 1 #define MVM_BOOL_MODE_UNBOX_NUM 2 #define MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY 3 #define MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO 4 #define MVM_BOOL_MODE_NOT_TYPE_OBJECT 5 #define MVM_BOOL_MODE_BIGINT 6 #define MVM_BOOL_MODE_ITER 7 #define MVM_BOOL_MODE_HAS_ELEMS 8 /* Controls the way that type checks are performed. By default, if there is * a type check cache we treat it as definitive. However, it's possible to * declare that in the case the type check cache has no entry we should fall * back to asking the .HOW.type_check method (set TYPE_CHECK_CACHE_THEN_METHOD). * While a normal type check asks a value if it supports another type, the * TYPE_CHECK_NEEDS_ACCEPTS flag results in a call to .accepts_type on the * HOW of the thing we're checking the value against, giving it a chance to * decide answer. These are set as the lower bits of mode_flags in MVMSTable. */ #define MVM_TYPE_CHECK_CACHE_DEFINITIVE 0 #define MVM_TYPE_CHECK_CACHE_THEN_METHOD 1 #define MVM_TYPE_CHECK_NEEDS_ACCEPTS 2 #define MVM_TYPE_CHECK_CACHE_FLAG_MASK 3 /* This STable mode flag is set if we consider the method cache authoritative. */ #define MVM_METHOD_CACHE_AUTHORITATIVE 4 /* This STable mode flag is set if the type needs finalization. */ #define MVM_FINALIZE_TYPE 8 /* This STable mode flag is set if the type is parametric (and so can be * parameterized). */ #define MVM_PARAMETRIC_TYPE 16 /* This STable mode flag is set if the type is a parameterization of some * parametric type. */ #define MVM_PARAMETERIZED_TYPE 32 /* HLL type roles. */ #define MVM_HLL_ROLE_NONE 0 #define MVM_HLL_ROLE_INT 1 #define MVM_HLL_ROLE_NUM 2 #define MVM_HLL_ROLE_STR 3 #define MVM_HLL_ROLE_ARRAY 4 #define MVM_HLL_ROLE_HASH 5 #define MVM_HLL_ROLE_CODE 6 /* Hint value to indicate the absence of an attribute lookup or method * dispatch hint. */ #define MVM_NO_HINT -1 /* This data structure describes what storage a given representation * needs if something of that representation is to be embedded in * another place. For any representation that expects to be used * as a kind of reference type, it will just want to be a pointer. * But for other things, they would prefer to be "inlined" into * the object. */ struct MVMStorageSpec { /* 0 if this is to be referenced, anything else otherwise. */ MVMuint16 inlineable; /* For things that want to be inlined, the number of bits of * storage they need and what kind of byte-boundary they want to * be aligned to. Ignored otherwise. */ MVMuint16 bits; MVMuint16 align; /* For things that are inlined, if they are just storage of a * primitive type and can unbox, this says what primitive type * that they unbox to. */ MVMuint16 boxed_primitive; /* The types that this one can box/unbox to. */ MVMuint16 can_box; /* For ints, whether it's an unsigned value. */ MVMuint8 is_unsigned; }; /* Inlined or not. */ #define MVM_STORAGE_SPEC_REFERENCE 0 #define MVM_STORAGE_SPEC_INLINED 1 /* Possible options for boxed primitives. */ #define MVM_STORAGE_SPEC_BP_NONE 0 #define MVM_STORAGE_SPEC_BP_INT 1 #define MVM_STORAGE_SPEC_BP_NUM 2 #define MVM_STORAGE_SPEC_BP_STR 3 /* can_box bit field values. */ #define MVM_STORAGE_SPEC_CAN_BOX_INT 1 #define MVM_STORAGE_SPEC_CAN_BOX_NUM 2 #define MVM_STORAGE_SPEC_CAN_BOX_STR 4 #define MVM_STORAGE_SPEC_CAN_BOX_MASK 7 /* Flags that may be set on any collectable. */ typedef enum { /* Is a type object (and thus not a concrete instance). */ MVM_CF_TYPE_OBJECT = 1, /* Is an STable. */ MVM_CF_STABLE = 2, /* Has already been seen once in GC nursery. */ MVM_CF_NURSERY_SEEN = 4, /* Has been promoted to the old generation. */ MVM_CF_SECOND_GEN = 8, /* Is shared - that is, more than one thread knows about it. */ MVM_CF_SHARED = 16, /* Has already been added to the gen2 aggregates pointing to nursery * objects list. */ MVM_CF_IN_GEN2_ROOT_LIST = 32, /* A full GC run has found this object to be live. */ MVM_CF_GEN2_LIVE = 64, /* This object in fromspace is live with a valid forwarder. */ /* TODO - should be possible to use the same bit for this and GEN2_LIVE. */ MVM_CF_FORWARDER_VALID = 128, /* Have we allocated memory to store a serialization index? */ MVM_CF_SERIALZATION_INDEX_ALLOCATED = 256, /* Have we arranged a persistent object ID for this object? */ MVM_CF_HAS_OBJECT_ID = 512, /* Have we flagged this object as something we must never repossess? */ /* Note: if you're hunting for a flag, some day in the future when we * have used them all, this one is easy enough to eliminate by having the * tiny number of objects marked this way in a remembered set. */ MVM_CF_NEVER_REPOSSESS = 1024 } MVMCollectableFlags; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX struct MVMSerializationIndex { MVMuint32 sc_idx; MVMuint32 idx; }; #endif /* Things that every GC-collectable entity has. These fall into two * categories: * * MVMObject - objects. Almost everything is one of these. * * MVMSTable - shared tables; one per (HOW, REPR) pairing. * Only the first can vary in size, and even then only if it's not a * type object. */ struct MVMCollectable { /* Put this union first, as these pointers/indexes are relatively "cold", whereas "flags" is accessed relatively frequently, as are the fields that follow in the structures into which MVMCollectable is embedded. Shrinking the size of the active part of the structure slightly increases the chance that it fits into the CPU's L1 cache, which is a "free" performance win. */ union { /* Forwarding pointer, for copying/compacting GC purposes. */ MVMCollectable *forwarder; /* Index of the serialization context this collectable lives in, if * any, and then location within that. */ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX struct { MVMuint16 sc_idx; MVMuint16 idx; } sc; struct MVMSerializationIndex *sci; #else struct { MVMuint32 sc_idx; MVMuint32 idx; } sc; #endif /* Used to chain STables queued to be freed. */ MVMSTable *st; } sc_forward_u; /* Identifier of the thread that currently owns the object, if any. If the * object is unshared, then this is always the creating thread. If it is * shared then it's whoever currently holds the mutex on it, or 0 if there * is no held mutex. */ MVMuint32 owner; /* Collectable flags (see MVMCollectableFlags). */ MVMuint16 flags; /* Object size, in bytes. */ MVMuint16 size; }; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX # define MVM_DIRECT_SC_IDX_SENTINEL 0xFFFF #else # define MVM_DIRECT_SC_IDX_SENTINEL ~0 #endif /* The common things every object has. * * NB - the assumption that MVMObject* can be safely cast into * MVMCollectable* is spread throughout the codebase, as well * as used directly in JIT. Thus, nothing may preceed the header! */ struct MVMObject { /* Commonalities that all collectable entities have. */ MVMCollectable header; /* The s-table for the object. */ MVMSTable *st; }; /* An dummy object, mostly used to compute the offset of the data part of * a 6model object. */ struct MVMObjectStooge { MVMObject common; void *data; }; /* This is used to identify an attribute for various types of cache. */ struct MVMAttributeIdentifier { MVMObject *class_handle; /* Class handle */ MVMString *attr_name; /* Name of the attribute. */ MVMint64 hint; /* Hint for use in static/gradual typing. */ }; /* How do we turn something of this type into a boolean? */ struct MVMBoolificationSpec { MVMObject *method; MVMuint32 mode; }; /* Constant for incrementing the type cache ID for new STables. This leaves * the lowest bits free for caches to attach flags (of note, the multi * dispatch cache). */ #define MVM_TYPE_CACHE_ID_INCR 128 /* S-table, representing a meta-object/representation pairing. Note that the * items are grouped in hope that it will pack decently and do decently in * terms of cache lines. */ struct MVMSTable { /* Commonalities that all collectable entities have. */ MVMCollectable header; /* The representation operation table. */ const MVMREPROps *REPR; /* Any data specific to this type that the REPR wants to keep. */ void *REPR_data; /* The size of an object of this type in bytes, including the * header. */ MVMuint32 size; /* The length of the type check cache. */ MVMuint16 type_check_cache_length; /* The type checking mode and method cache mode (see flags for this * above). */ MVMuint16 mode_flags; /* Array of type objects. If this is set, then it is expected to contain * the type objects of all types that this type is equivalent to (e.g. * all the things it isa and all the things it does). */ MVMObject **type_check_cache; /* By-name method dispatch cache. */ MVMObject *method_cache; /* An ID solely for use in caches that last a VM instance. Thus it * should never, ever be serialized and you should NEVER make a * type directory based upon this ID. Otherwise you'll create memory * leaks for anonymous types, and other such screwups. */ MVMuint64 type_cache_id; /* If this is a container, then this contains information needed in * order to fetch the value in it. If not, it'll be null, which can * be taken as a "not a container" indication. */ const MVMContainerSpec *container_spec; /* Data that the container spec may need to function. */ /* Any data specific to this type that the REPR wants to keep. */ void *container_data; /* Information - if any - about how we can turn something of this type * into a boolean. */ MVMBoolificationSpec *boolification_spec; /* The HLL that this type is owned by, if any. */ MVMHLLConfig *hll_owner; /* The role that the type plays in the HLL, if any. */ MVMint64 hll_role; /* Invocation handler. If something tries to invoke this object, * whatever hangs off this function pointer gets invoked to handle * the invocation. If it's a call into C code it may do stuff right * off the bat. However, normally it will do whatever is needed to * arrange for setting up a callframe, twiddle the interpreter's * PC as needed and return. */ void (*invoke) (MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args); /* * If this is invokable, then this contains information needed to * figure out how to invoke it. If not, it'll be null. */ MVMInvocationSpec *invocation_spec; /* The type-object. */ MVMObject *WHAT; /* The underlying package stash. */ MVMObject *WHO; /* The meta-object. */ MVMObject *HOW; /* Parametricity. Mode flags indicate what, if any, of this union is valid. */ union { struct { /* The code object to use to produce a new parameterization. */ MVMObject *parameterizer; /* Lookup table of existing parameterizations. For now, just a VM * array with alternating pairs of [arg array], object. Could in * the future we something lower level or hashy; we've yet to see * how hot-path lookups end up being in reality. */ MVMObject *lookup; } ric; struct { /* The type that we are a parameterization of. */ MVMObject *parametric_type; /* Our type parameters. */ MVMObject *parameters; } erized; } paramet; /* We lazily deserialize HOW; this is the SC and index if needed. */ MVMSerializationContext *HOW_sc; MVMuint32 HOW_idx; /* Also info we need to lazily deserialize the method cache. */ MVMuint32 method_cache_offset; MVMSerializationContext *method_cache_sc; }; /* The representation operations table. Note that representations are not * classes - there's no inheritance, so there's no polymorphism. If you know * a representation statically, you can statically dereference the call to * the representation op in question. In the dynamic case, you have to go * following the pointer, however. */ struct MVMREPROps_Attribute { /* Gets the current value for an attribute and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*get_attribute) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind); /* Binds the given object or value to the specified attribute. The * kind flag specifies the type of value being passed to be bound.*/ void (*bind_attribute) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind); /* Gets the hint for the given attribute ID. */ MVMint64 (*hint_for) (MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name); /* Checks if an attribute has been initialized. */ MVMint64 (*is_attribute_initialized) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint); }; struct MVMREPROps_Boxing { /* Used with boxing. Sets an integer value, for representations that * can hold one. */ void (*set_int) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value); /* Used with boxing. Gets an integer value, for representations that * can hold one. */ MVMint64 (*get_int) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Used with boxing. Sets a floating point value, for representations that * can hold one. */ void (*set_num) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value); /* Used with boxing. Gets a floating point value, for representations that * can hold one. */ MVMnum64 (*get_num) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Used with boxing. Sets a string value, for representations that * can hold one. */ void (*set_str) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value); /* Used with boxing. Gets a string value, for representations that * can hold one. */ MVMString * (*get_str) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Some objects serve primarily as boxes of others, inlining them. This gets * gets the reference to such things, using the representation ID to distinguish * them. */ void * (*get_boxed_ref) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id); }; struct MVMREPROps_Positional { /* Gets the element and the specified index and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*at_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *result, MVMuint16 kind); /* Binds the given object or value to the specified index. The * kind flag specifies the type of value being passed to be bound.*/ void (*bind_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); /* Sets the element count of the array, expanding or shrinking * it as needed. */ void (*set_elems) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count); /* Pushes the specified value onto the array. */ void (*push) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); /* Pops the value at the end of the array off it. */ void (*pop) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); /* Unshifts the value onto the array. */ void (*unshift) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); /* Gets the value at the start of the array, and moves the starting point of * the array so that the next element is element zero. */ void (*shift) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); /* Splices the specified array into this one. Representations may optimize if * they know the type of the passed array, otherwise they should use the REPR * API. */ void (*splice) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems); /* Multi-dimensional array read. */ void (*at_pos_multidim) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *result, MVMuint16 kind); /* Multi-dimensional array write. */ void (*bind_pos_multidim) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind); /* Gets the number of dimensions along with a C-level array of them. The * second two parameters are "out"s. The caller must not mutate dimensions, * nor persist it such that it lasts longer than the next VM safepoint. */ void (*dimensions) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions); /* Sets the number of dimensions. The caller is responsible for freeing * the array passed in dimensions. */ void (*set_dimensions) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions); /* Gets the STable representing the declared element type. */ MVMStorageSpec (*get_elem_storage_spec) (MVMThreadContext *tc, MVMSTable *st); }; struct MVMREPROps_Associative { /* Gets the value at the specified key and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*at_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind); /* Binds the object at the specified address into the hash at the specified * key. */ void (*bind_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); /* Returns a true value of the key exists, and a false one if not. */ MVMint64 (*exists_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); /* Deletes the specified key. */ void (*delete_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); /* Gets the storage spec of the hash value type. */ MVMStorageSpec (*get_value_storage_spec) (MVMThreadContext *tc, MVMSTable *st); }; struct MVMREPROps { /* Creates a new type object of this representation, and * associates it with the given HOW. Also sets up a new * representation instance if needed. */ MVMObject * (*type_object_for) (MVMThreadContext *tc, MVMObject *HOW); /* Allocates a new, but uninitialized object, based on the * specified s-table. */ MVMObject * (*allocate) (MVMThreadContext *tc, MVMSTable *st); /* Used to initialize the body of an object representing the type * describe by the specified s-table. DATA points to the body. It * may recursively call initialize for any flattened objects. */ void (*initialize) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* For the given type, copies the object data from the source memory * location to the destination one. Note that it may actually be more * involved than a straightforward bit of copying; what's important is * that the representation knows about that. Note that it may have to * call copy_to recursively on representations of any flattened objects * within its body. */ void (*copy_to) (MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest); /* Attribute access REPR function table. */ MVMREPROps_Attribute attr_funcs; /* Boxing REPR function table. */ MVMREPROps_Boxing box_funcs; /* Positional indexing REPR function table. */ MVMREPROps_Positional pos_funcs; /* Associative indexing REPR function table. */ MVMREPROps_Associative ass_funcs; /* Gets the number of elements, for any aggregate types. */ MVMuint64 (*elems) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Gets the storage specification for this representation. */ const MVMStorageSpec * (*get_storage_spec) (MVMThreadContext *tc, MVMSTable *st); /* Handles an object changing its type. The representation is responsible * for doing any changes to the underlying data structure, and may reject * changes that it's not willing to do (for example, a representation may * choose to only handle switching to a subclass). It is also left to update * the S-Table pointer as needed; while in theory this could be factored * out, the representation probably knows more about timing issues and * thread safety requirements. */ void (*change_type) (MVMThreadContext *tc, MVMObject *object, MVMObject *new_type); /* Object serialization. Writes the object's body out using the passed * serialization writer. */ void (*serialize) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer); /* Object deserialization. Reads the object's body in using the passed * serialization reader. */ void (*deserialize) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader); /* REPR data serialization. Serializes the per-type representation data that * is attached to the supplied STable. */ void (*serialize_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer); /* REPR data deserialization. Deserializes the per-type representation data and * attaches it to the supplied STable. */ void (*deserialize_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* Deserialization of STable size. */ void (*deserialize_stable_size) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* MoarVM-specific REPR API addition used to mark an object. This involves * adding all pointers it contains to the worklist. */ void (*gc_mark) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist); /* MoarVM-specific REPR API addition used to free an object. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *object); /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ void (*gc_cleanup) (MVMThreadContext *tc, MVMSTable *st, void *data); /* MoarVM-specific REPR API addition used to mark a REPR instance. */ void (*gc_mark_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist); /* MoarVM-specific REPR API addition used to free a REPR instance. */ void (*gc_free_repr_data) (MVMThreadContext *tc, MVMSTable *st); /* Causes the representation to be composed. Composition involves * passing the representation information that it needs in order * to compute memory layout. */ void (*compose) (MVMThreadContext *tc, MVMSTable *st, MVMObject *info); /* Allows the REPR to produce specialized bytecode versions of various * instructions, when we know some of the types involved. */ void (*spesh) (MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); /* The representation's name. */ const char *name; /* The representation's ID. */ MVMuint32 ID; /* Does this representation reference frames (either MVMStaticFrame or * MVMFrame)? */ MVMuint32 refs_frames; }; /* Various handy macros for getting at important stuff. */ #define STABLE(o) (((MVMObject *)(o))->st) #define REPR(o) (STABLE((o))->REPR) #define OBJECT_BODY(o) (&(((MVMObjectStooge *)(o))->data)) /* Macros for getting/setting type-objectness. */ #define IS_CONCRETE(o) (!(((MVMObject *)o)->header.flags & MVM_CF_TYPE_OBJECT)) /* Some functions related to 6model core functionality. */ MVM_PUBLIC MVMObject * MVM_6model_get_how(MVMThreadContext *tc, MVMSTable *st); MVM_PUBLIC MVMObject * MVM_6model_get_how_obj(MVMThreadContext *tc, MVMObject *obj); void MVM_6model_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res); MVM_PUBLIC MVMObject * MVM_6model_find_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name); MVMint32 MVM_6model_find_method_spesh(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMint32 ss_idx, MVMRegister *res); MVMint64 MVM_6model_can_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name); void MVM_6model_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res); void MVM_6model_istype(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res); MVM_PUBLIC MVMint64 MVM_6model_istype_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMObject *type); MVMint64 MVM_6model_try_cache_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMint32 *result); void MVM_6model_invoke_default(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args); void MVM_6model_stable_gc_free(MVMThreadContext *tc, MVMSTable *st); MVMuint64 MVM_6model_next_type_cache_id(MVMThreadContext *tc); void MVM_6model_never_repossess(MVMThreadContext *tc, MVMObject *obj); MoarVM-2015.11/src/6model/README.md0000644000175000017500000000226712456307241015317 0ustar jnthnjnthn## 6model A great introduction to the 6model system is available here: http://jnthn.net/papers/2013-yapceu-moarvm.pdf Here are some highlights from the text on those slides: 6model provides primitives for building an object system. Every object in MoarVM is a 6model object - one object system for the whole VM. By object, we mean what you think of as objects (Arrays, Hashes, Boxed integers, floats, etc., Threads, handles)... ### Inside 6model An object has a header - STable, Flags, owner, slots for GC stuff... Which points to an STable (Shared Table, representing a type). It contains the HOW (Meta-object), REPR, WHAT (type object), WHO (stash), Method cache, and Type check cache..., which are objects important to the type. Which has a "representation" (REPR) that manages the object's body. ### Representations All about the use of memory by an object REPR API has a common part (allocation, GC marking) along with several sub-protocols for different ways of using memory: Attributes Boxing Positional Associative Representations are orthogonal to type (and thus disinterested in method dispatch, type check, etc.) and also non-virtual (if you know the REPR, can inline stuff). MoarVM-2015.11/src/6model/bootstrap.c0000644000175000017500000010124112573775575016234 0ustar jnthnjnthn#include "moar.h" /* This file implements the various steps involved in getting 6model * bootstrapped from the ground up - that is, getting to having a * KnowHOW meta-object type so that userland can start building up * more interesting meta-objects. Mostly it just has to make objects * with some "holes", and later go back and fill them out. This is * due to the circular nature of things. */ /* Creates a stub VMString. Note we didn't initialize the * representation yet, so have to do this somewhat pokily. */ static void create_stub_VMString(MVMThreadContext *tc) { /* Need to create the REPR function table "in advance". */ const MVMREPROps *repr = MVMString_initialize(tc); /* Now we can create a type object; note we have no HOW yet, * though. */ tc->instance->VMString = repr->type_object_for(tc, NULL); } /* KnowHOW.new_type method. Creates a new type with this HOW as its meta-object. */ static void new_type(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *HOW, *type_object, *BOOTHash, *stash; MVMArgInfo repr_arg, name_arg; MVMString *repr_name, *name; const MVMREPROps *repr_to_use; MVMInstance *instance = tc->instance; /* Get arguments. */ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; repr_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.repr, MVM_ARG_OPTIONAL); name_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.name, MVM_ARG_OPTIONAL); MVM_args_proc_cleanup(tc, &arg_ctx); if (REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object with REPR KnowHOWREPR"); /* See if we have a representation name; if not default to P6opaque. */ repr_name = repr_arg.exists ? repr_arg.arg.s : instance->str_consts.P6opaque; repr_to_use = MVM_repr_get_by_name(tc, repr_name); MVM_gc_root_temp_push(tc, (MVMCollectable **)&name_arg); /* We first create a new HOW instance. */ HOW = REPR(self)->allocate(tc, STABLE(self)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&HOW); /* Create a new type object of the desired REPR. (Note that we can't * default to KnowHOWREPR here, since it doesn't know how to actually * store attributes, it's just for bootstrapping knowhow's. */ type_object = repr_to_use->type_object_for(tc, HOW); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_object); /* This may move name_arg.arg.s so do it first: */ REPR(HOW)->initialize(tc, STABLE(HOW), HOW, OBJECT_BODY(HOW)); /* See if we were given a name; put it into the meta-object if so. */ name = name_arg.exists ? name_arg.arg.s : instance->str_consts.anon; MVM_ASSIGN_REF(tc, &(HOW->header), ((MVMKnowHOWREPR *)HOW)->body.name, name); /* Set .WHO to an empty hash. */ BOOTHash = tc->instance->boot_types.BOOTHash; stash = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&stash); MVM_ASSIGN_REF(tc, &(STABLE(type_object)->header), STABLE(type_object)->WHO, stash); /* Return the type object. */ MVM_args_set_result_obj(tc, type_object, MVM_RETURN_CURRENT_FRAME); MVM_gc_root_temp_pop_n(tc, 4); } /* Adds a method. */ static void add_method(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *method, *method_table; MVMString *name; /* Get arguments. */ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 4, 4); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; name = MVM_args_get_pos_str(tc, &arg_ctx, 2, MVM_ARG_REQUIRED).arg.s; method = MVM_args_get_pos_obj(tc, &arg_ctx, 3, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); /* Add to method table. */ method_table = ((MVMKnowHOWREPR *)self)->body.methods; MVM_repr_bind_key_o(tc, method_table, name, method); /* Return added method as result. */ MVM_args_set_result_obj(tc, method, MVM_RETURN_CURRENT_FRAME); } /* Adds an method. */ static void add_attribute(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *attr, *attributes; /* Get arguments. */ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 3, 3); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; attr = MVM_args_get_pos_obj(tc, &arg_ctx, 2, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); /* Ensure we have the required representations. */ if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); if (REPR(attr)->ID != MVM_REPR_ID_KnowHOWAttributeREPR) MVM_exception_throw_adhoc(tc, "KnowHOW attributes must use KnowHOWAttributeREPR"); /* Add to method table. */ attributes = ((MVMKnowHOWREPR *)self)->body.attributes; MVM_repr_push_o(tc, attributes, attr); /* Return added attribute as result. */ MVM_args_set_result_obj(tc, attr, MVM_RETURN_CURRENT_FRAME); } /* Composes the meta-object. */ static void compose(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *type_obj, *method_table, *attributes, *BOOTArray, *BOOTHash, *repr_info_hash, *repr_info, *type_info, *attr_info_list, *parent_info; MVMuint64 num_attrs, i; MVMInstance *instance = tc->instance; /* Get arguments. */ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 2, 2); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; type_obj = MVM_args_get_pos_obj(tc, &arg_ctx, 1, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); /* Fill out STable. */ method_table = ((MVMKnowHOWREPR *)self)->body.methods; MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->method_cache, method_table); STABLE(type_obj)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(type_obj)->type_check_cache_length = 1; STABLE(type_obj)->type_check_cache = MVM_malloc(sizeof(MVMObject *)); MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->type_check_cache[0], type_obj); attributes = ((MVMKnowHOWREPR *)self)->body.attributes; /* Next steps will allocate, so make sure we keep hold of the type * object and ourself. */ MVM_gc_root_temp_push(tc, (MVMCollectable **)&attributes); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_obj); /* Use any attribute information to produce attribute protocol * data. The protocol consists of an array... */ BOOTArray = instance->boot_types.BOOTArray; BOOTHash = instance->boot_types.BOOTHash; MVM_gc_root_temp_push(tc, (MVMCollectable **)&BOOTArray); MVM_gc_root_temp_push(tc, (MVMCollectable **)&BOOTHash); repr_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&repr_info); /* ...which contains an array per MRO entry (just us)... */ type_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_info); MVM_repr_push_o(tc, repr_info, type_info); /* ...which in turn contains this type... */ MVM_repr_push_o(tc, type_info, type_obj); /* ...then an array of hashes per attribute... */ attr_info_list = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_info_list); MVM_repr_push_o(tc, type_info, attr_info_list); num_attrs = REPR(attributes)->elems(tc, STABLE(attributes), attributes, OBJECT_BODY(attributes)); for (i = 0; i < num_attrs; i++) { MVMObject *attr_info = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVMKnowHOWAttributeREPR *attribute = (MVMKnowHOWAttributeREPR *) MVM_repr_at_pos_o(tc, attributes, i); MVMROOT(tc, attr_info, { MVMROOT(tc, attribute, { if (REPR((MVMObject *)attribute)->ID != MVM_REPR_ID_KnowHOWAttributeREPR) MVM_exception_throw_adhoc(tc, "KnowHOW attributes must use KnowHOWAttributeREPR"); MVM_repr_init(tc, attr_info); MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.name, (MVMObject *)attribute->body.name); MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.type, attribute->body.type); if (attribute->body.box_target) { /* Merely having the key serves as a "yes". */ MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.box_target, attr_info); } MVM_repr_push_o(tc, attr_info_list, attr_info); }); }); } /* ...followed by a list of parents (none). */ parent_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&parent_info); MVM_repr_init(tc, parent_info); MVM_repr_push_o(tc, type_info, parent_info); /* Finally, this all goes in a hash under the key 'attribute'. */ repr_info_hash = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&repr_info_hash); MVM_repr_init(tc, repr_info_hash); MVM_repr_bind_key_o(tc, repr_info_hash, instance->str_consts.attribute, repr_info); /* Compose the representation using it. */ MVM_repr_compose(tc, type_obj, repr_info_hash); /* Clear temporary roots. */ MVM_gc_root_temp_pop_n(tc, 9); /* Return type object. */ MVM_args_set_result_obj(tc, type_obj, MVM_RETURN_CURRENT_FRAME); } #define introspect_member(member, set_result, result) \ static void member(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { \ MVMObject *self, *type_obj, *member; \ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; \ MVM_args_proc_init(tc, &arg_ctx, callsite, args); \ MVM_args_checkarity(tc, &arg_ctx, 2, 2); \ self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; \ type_obj = MVM_args_get_pos_obj(tc, &arg_ctx, 1, MVM_ARG_REQUIRED).arg.o; \ MVM_args_proc_cleanup(tc, &arg_ctx); \ if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) \ MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); \ member = (MVMObject *)((MVMKnowHOWREPR *)self)->body.member; \ set_result(tc, result, MVM_RETURN_CURRENT_FRAME); \ } /* Introspects the attributes. For now just hand back real list. */ introspect_member(attributes, MVM_args_set_result_obj, attributes) /* Introspects the methods. */ introspect_member(methods, MVM_args_set_result_obj, methods) /* Introspects the name. */ introspect_member(name, MVM_args_set_result_str, (MVMString *)name) /* Adds a method into the KnowHOW.HOW method table. */ static void add_knowhow_how_method(MVMThreadContext *tc, MVMKnowHOWREPR *knowhow_how, char *name, void (*func) (MVMThreadContext *, MVMCallsite *, MVMRegister *)) { MVMObject *BOOTCCode, *code_obj, *method_table; MVMString *name_str; /* Create string for name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, name); /* Allocate a BOOTCCode and put pointer in. */ BOOTCCode = tc->instance->boot_types.BOOTCCode; code_obj = REPR(BOOTCCode)->allocate(tc, STABLE(BOOTCCode)); ((MVMCFunction *)code_obj)->body.func = func; /* Add into the table. */ method_table = knowhow_how->body.methods; MVM_repr_bind_key_o(tc, method_table, name_str, code_obj); } /* Bootstraps the KnowHOW type. */ static void bootstrap_KnowHOW(MVMThreadContext *tc) { MVMObject *VMString = tc->instance->VMString; /* Create our KnowHOW type object. Note we don't have a HOW just yet, so * pass in NULL. */ const MVMREPROps *REPR = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWREPR); MVMObject *knowhow = REPR->type_object_for(tc, NULL); /* We create a KnowHOW instance that can describe itself. This means * (once we tie the knot) that .HOW.HOW.HOW.HOW etc will always return * that, which closes the model up. Note that the STable for it must * be allocated first, since that holds the allocation size. */ MVMKnowHOWREPR *knowhow_how; MVMSTable *st = MVM_gc_allocate_stable(tc, REPR, NULL); st->WHAT = (MVMObject *)knowhow; st->size = sizeof(MVMKnowHOWREPR); knowhow_how = (MVMKnowHOWREPR *)REPR->allocate(tc, st); st->HOW = (MVMObject *)knowhow_how; knowhow_how->common.st = st; /* Add various methods to the KnowHOW's HOW. */ REPR->initialize(tc, NULL, (MVMObject *)knowhow_how, &knowhow_how->body); add_knowhow_how_method(tc, knowhow_how, "new_type", new_type); add_knowhow_how_method(tc, knowhow_how, "add_method", add_method); add_knowhow_how_method(tc, knowhow_how, "add_attribute", add_attribute); add_knowhow_how_method(tc, knowhow_how, "compose", compose); add_knowhow_how_method(tc, knowhow_how, "attributes", attributes); add_knowhow_how_method(tc, knowhow_how, "methods", methods); add_knowhow_how_method(tc, knowhow_how, "name", name); /* Set name KnowHOW for the KnowHOW's HOW. */ knowhow_how->body.name = MVM_string_ascii_decode_nt(tc, VMString, "KnowHOW"); /* Set this built up HOW as the KnowHOW's HOW. */ STABLE(knowhow)->HOW = (MVMObject *)knowhow_how; /* Give it an authoritative method cache; this in turn will make the * method dispatch bottom out. */ STABLE(knowhow)->method_cache = knowhow_how->body.methods; STABLE(knowhow)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(knowhow_how)->method_cache = knowhow_how->body.methods; STABLE(knowhow_how)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; /* Stash the created KnowHOW. */ tc->instance->KnowHOW = (MVMObject *)knowhow; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->KnowHOW); } /* Takes a stub object that existed before we had bootstrapped things and * gives it a meta-object. */ static void add_meta_object(MVMThreadContext *tc, MVMObject *type_obj, char *name) { MVMObject *meta_obj; MVMString *name_str; /* Create meta-object. */ meta_obj = MVM_repr_alloc_init(tc, STABLE(tc->instance->KnowHOW)->HOW); MVMROOT(tc, meta_obj, { /* Put it in place. */ MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->HOW, meta_obj); /* Set name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, name); MVM_ASSIGN_REF(tc, &(meta_obj->header), ((MVMKnowHOWREPR *)meta_obj)->body.name, name_str); }); } /* Creates a new attribute meta-object. */ static void attr_new(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *obj; MVMArgInfo type_arg, name_arg, bt_arg; const MVMREPROps *repr; MVMInstance *instance = tc->instance; /* Process arguments. */ MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; name_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.name, MVM_ARG_REQUIRED); type_arg = MVM_args_get_named_obj(tc, &arg_ctx, instance->str_consts.type, MVM_ARG_OPTIONAL); bt_arg = MVM_args_get_named_int(tc, &arg_ctx, instance->str_consts.box_target, MVM_ARG_OPTIONAL); MVM_args_proc_cleanup(tc, &arg_ctx); /* Anchor all the things. */ MVM_gc_root_temp_push(tc, (MVMCollectable **)&name_arg); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_arg); /* Allocate attribute object. */ repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWAttributeREPR); obj = repr->allocate(tc, STABLE(self)); /* Populate it. */ MVM_ASSIGN_REF(tc, &(obj->header), ((MVMKnowHOWAttributeREPR *)obj)->body.name, name_arg.arg.s); MVM_ASSIGN_REF(tc, &(obj->header), ((MVMKnowHOWAttributeREPR *)obj)->body.type, type_arg.exists ? type_arg.arg.o : tc->instance->KnowHOW); ((MVMKnowHOWAttributeREPR *)obj)->body.box_target = bt_arg.exists ? bt_arg.arg.i64 : 0; /* Return produced object. */ MVM_gc_root_temp_pop_n(tc, 2); MVM_args_set_result_obj(tc, obj, MVM_RETURN_CURRENT_FRAME); } /* Composes the attribute; actually, nothing to do really. */ static void attr_compose(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); MVM_args_set_result_obj(tc, self, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's name. */ static void attr_name(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMString *name; MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); name = ((MVMKnowHOWAttributeREPR *)self)->body.name; MVM_args_set_result_str(tc, name, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's type. */ static void attr_type(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *type; MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); type = ((MVMKnowHOWAttributeREPR *)self)->body.type; MVM_args_set_result_obj(tc, type, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's box target flag. */ static void attr_box_target(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMint64 box_target; MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; MVM_args_proc_cleanup(tc, &arg_ctx); box_target = ((MVMKnowHOWAttributeREPR *)self)->body.box_target; MVM_args_set_result_int(tc, box_target, MVM_RETURN_CURRENT_FRAME); } /* Creates and installs the KnowHOWAttribute type. */ static void create_KnowHOWAttribute(MVMThreadContext *tc) { MVMObject *meta_obj, *type_obj; MVMString *name_str; const MVMREPROps *repr; /* Create meta-object. */ meta_obj = MVM_repr_alloc_init(tc, STABLE(tc->instance->KnowHOW)->HOW); MVMROOT(tc, meta_obj, { /* Add methods. */ add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "new", attr_new); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "compose", attr_compose); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "name", attr_name); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "type", attr_type); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "box_target", attr_box_target); /* Set name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "KnowHOWAttribute"); MVM_ASSIGN_REF(tc, &(meta_obj->header), ((MVMKnowHOWREPR *)meta_obj)->body.name, name_str); /* Create a new type object with the correct REPR. */ repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWAttributeREPR); type_obj = repr->type_object_for(tc, meta_obj); /* Set up method dispatch cache. */ STABLE(type_obj)->method_cache = ((MVMKnowHOWREPR *)meta_obj)->body.methods; STABLE(type_obj)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; /* Stash the created type object. */ tc->instance->KnowHOWAttribute = (MVMObject *)type_obj; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->KnowHOWAttribute); }); } /* Bootstraps a typed array. */ static MVMObject * boot_typed_array(MVMThreadContext *tc, char *name, MVMObject *type) { MVMBoolificationSpec *bs; MVMObject *repr_info; MVMInstance *instance = tc->instance; const MVMREPROps *repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_MVMArray); MVMObject *array = repr->type_object_for(tc, NULL); MVMROOT(tc, array, { /* Give it a meta-object. */ add_meta_object(tc, array, name); /* Now need to compose it with the specified type. */ repr_info = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMROOT(tc, repr_info, { MVMObject *arr_info = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVM_repr_bind_key_o(tc, arr_info, instance->str_consts.type, type); MVM_repr_bind_key_o(tc, repr_info, instance->str_consts.array, arr_info); MVM_repr_compose(tc, array, repr_info); }); /* Also give it a boolification spec. */ bs = MVM_malloc(sizeof(MVMBoolificationSpec)); bs->mode = MVM_BOOL_MODE_HAS_ELEMS; bs->method = NULL; array->st->boolification_spec = bs; }); return array; } /* Sets up the core serialization context. It is marked as the SC of various * rooted objects, which means in turn it will never be collected. */ static void setup_core_sc(MVMThreadContext *tc) { MVMString *handle = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "__6MODEL_CORE__"); MVMSerializationContext * const sc = (MVMSerializationContext *)MVM_sc_create(tc, handle); MVMint32 obj_index = 0; MVMint32 st_index = 0; #define add_to_sc_with_st(tc, sc, variable) do { \ MVM_sc_set_object(tc, sc, obj_index++, variable); \ MVM_sc_set_obj_sc(tc, variable, sc); \ MVM_sc_set_stable(tc, sc, st_index++, STABLE(variable)); \ MVM_sc_set_stable_sc(tc, STABLE(variable), sc); \ } while (0) #define add_to_sc_with_st_and_mo(tc, sc, variable) do { \ add_to_sc_with_st(tc, sc, variable); \ MVM_sc_set_object(tc, sc, obj_index++, STABLE(variable)->HOW); \ MVM_sc_set_obj_sc(tc, STABLE(variable)->HOW, sc); \ } while (0) /* KnowHOW */ add_to_sc_with_st(tc, sc, tc->instance->KnowHOW); /* KnowHOW.HOW */ add_to_sc_with_st(tc, sc, STABLE(tc->instance->KnowHOW)->HOW); /* KnowHOWAttribute */ add_to_sc_with_st(tc, sc, tc->instance->KnowHOWAttribute); /* BOOT* */ add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTArray); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTHash); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTIter); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTInt); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTNum); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTStr); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTCode); } /* Sets up some string constants. */ static void string_consts(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; /* Set up some strings. */ #define string_creator(variable, name) do { \ instance->str_consts.variable = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (name)); \ MVM_gc_root_add_permanent(tc, (MVMCollectable **)&(instance->str_consts.variable)); \ } while (0) string_creator(empty, ""); string_creator(Str, "Str"); string_creator(Num, "Num"); string_creator(integer, "integer"); string_creator(float_str, "float"); string_creator(bits, "bits"); string_creator(unsigned_str, "unsigned"); string_creator(find_method, "find_method"); string_creator(type_check, "type_check"); string_creator(accepts_type, "accepts_type"); string_creator(name, "name"); string_creator(attribute, "attribute"); string_creator(of, "of"); string_creator(rw, "rw"); string_creator(type, "type"); string_creator(typeobj, "typeobj"); string_creator(free_str, "free_str"); string_creator(callback_args, "callback_args"); string_creator(encoding, "encoding"); string_creator(inlined, "inlined"); string_creator(repr, "repr"); string_creator(anon, ""); string_creator(P6opaque, "P6opaque"); string_creator(box_target, "box_target"); string_creator(array, "array"); string_creator(positional_delegate, "positional_delegate"); string_creator(associative_delegate, "associative_delegate"); string_creator(auto_viv_container, "auto_viv_container"); string_creator(done, "done"); string_creator(error, "error"); string_creator(stdout_chars, "stdout_chars"); string_creator(stdout_bytes, "stdout_bytes"); string_creator(stderr_chars, "stderr_chars"); string_creator(stderr_bytes, "stderr_bytes"); string_creator(buf_type, "buf_type"); string_creator(write, "write"); string_creator(nativeref, "nativeref"); string_creator(refkind, "refkind"); string_creator(positional, "positional"); string_creator(lexical, "lexical"); string_creator(dimensions, "dimensions"); string_creator(ready, "ready"); } /* Drives the overall bootstrap process. */ void MVM_6model_bootstrap(MVMThreadContext *tc) { /* First, we have to get the VMString type to exist; this has to * come even before REPR registry setup because it relies on * being able to create strings. */ create_stub_VMString(tc); /* Set up some string constants commonly used. */ string_consts(tc); /* Now we've enough to actually create the REPR registry. */ MVM_repr_initialize_registry(tc); /* Create stub VMNull, BOOTInt, BOOTNum, BOOTStr, BOOTArray, BOOTHash, * BOOTCCode, BOOTCode, BOOTThread, BOOTIter, BOOTContext, SCRef, Lexotic, * CallCapture, BOOTIO, BOOTException, BOOTQueue, BOOTAsync, * and BOOTReentrantMutex types. */ #define create_stub_boot_type(tc, reprid, slot, makeboolspec, boolspec) do { \ const MVMREPROps *repr = MVM_repr_get_by_id(tc, reprid); \ MVMObject *type = tc->instance->slot = repr->type_object_for(tc, NULL); \ if (makeboolspec) { \ MVMBoolificationSpec *bs; \ bs = MVM_malloc(sizeof(MVMBoolificationSpec)); \ bs->mode = boolspec; \ bs->method = NULL; \ type->st->boolification_spec = bs; \ } \ } while (0) create_stub_boot_type(tc, MVM_REPR_ID_MVMNull, VMNull, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_P6int, boot_types.BOOTInt, 1, MVM_BOOL_MODE_UNBOX_INT); create_stub_boot_type(tc, MVM_REPR_ID_P6num, boot_types.BOOTNum, 1, MVM_BOOL_MODE_UNBOX_NUM); create_stub_boot_type(tc, MVM_REPR_ID_P6str, boot_types.BOOTStr, 1, MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY); create_stub_boot_type(tc, MVM_REPR_ID_MVMArray, boot_types.BOOTArray, 1, MVM_BOOL_MODE_HAS_ELEMS); create_stub_boot_type(tc, MVM_REPR_ID_MVMHash, boot_types.BOOTHash, 1, MVM_BOOL_MODE_HAS_ELEMS); create_stub_boot_type(tc, MVM_REPR_ID_MVMCFunction, boot_types.BOOTCCode, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCode, boot_types.BOOTCode, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMThread, boot_types.BOOTThread, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMIter, boot_types.BOOTIter, 1, MVM_BOOL_MODE_ITER); create_stub_boot_type(tc, MVM_REPR_ID_MVMContext, boot_types.BOOTContext, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_SCRef, SCRef, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_Lexotic, Lexotic, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCallCapture, CallCapture, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMOSHandle, boot_types.BOOTIO, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMException, boot_types.BOOTException, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMStaticFrame, boot_types.BOOTStaticFrame, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCompUnit, boot_types.BOOTCompUnit, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMMultiCache, boot_types.BOOTMultiCache, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMContinuation, boot_types.BOOTContinuation, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMThread, Thread, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_ConcBlockingQueue, boot_types.BOOTQueue, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMAsyncTask, boot_types.BOOTAsync, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_ReentrantMutex, boot_types.BOOTReentrantMutex, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); /* Bootstrap the KnowHOW type, giving it a meta-object. */ bootstrap_KnowHOW(tc); /* Give stub types meta-objects. */ #define meta_objectifier(tc, slot, name) do { \ add_meta_object((tc), (tc)->instance->slot, (name)); \ MVM_gc_root_add_permanent((tc), (MVMCollectable **)&(tc)->instance->slot); \ } while (0) meta_objectifier(tc, VMString, "VMString"); meta_objectifier(tc, VMNull, "VMNull"); meta_objectifier(tc, boot_types.BOOTInt, "BOOTInt"); meta_objectifier(tc, boot_types.BOOTNum, "BOOTNum"); meta_objectifier(tc, boot_types.BOOTStr, "BOOTStr"); meta_objectifier(tc, boot_types.BOOTArray, "BOOTArray"); meta_objectifier(tc, boot_types.BOOTHash, "BOOTHash"); meta_objectifier(tc, boot_types.BOOTCCode, "BOOTCCode"); meta_objectifier(tc, boot_types.BOOTCode, "BOOTCode"); meta_objectifier(tc, boot_types.BOOTThread, "BOOTThread"); meta_objectifier(tc, boot_types.BOOTIter, "BOOTIter"); meta_objectifier(tc, boot_types.BOOTContext, "BOOTContext"); meta_objectifier(tc, SCRef, "SCRef"); meta_objectifier(tc, Lexotic, "Lexotic"); meta_objectifier(tc, CallCapture, "CallCapture"); meta_objectifier(tc, boot_types.BOOTIO, "BOOTIO"); meta_objectifier(tc, boot_types.BOOTException, "BOOTException"); meta_objectifier(tc, boot_types.BOOTStaticFrame, "BOOTStaticFrame"); meta_objectifier(tc, boot_types.BOOTCompUnit, "BOOTCompUnit"); meta_objectifier(tc, boot_types.BOOTMultiCache, "BOOTMultiCache"); meta_objectifier(tc, boot_types.BOOTContinuation, "BOOTContinuation"); meta_objectifier(tc, Thread, "Thread"); meta_objectifier(tc, boot_types.BOOTQueue, "BOOTQueue"); meta_objectifier(tc, boot_types.BOOTAsync, "BOOTAsync"); meta_objectifier(tc, boot_types.BOOTReentrantMutex, "BOOTReentrantMutex"); /* Create the KnowHOWAttribute type. */ create_KnowHOWAttribute(tc); /* Bootstrap typed arrays. */ tc->instance->boot_types.BOOTIntArray = boot_typed_array(tc, "BOOTIntArray", tc->instance->boot_types.BOOTInt); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTIntArray); tc->instance->boot_types.BOOTNumArray = boot_typed_array(tc, "BOOTNumArray", tc->instance->boot_types.BOOTNum); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTNumArray); tc->instance->boot_types.BOOTStrArray = boot_typed_array(tc, "BOOTStrArray", tc->instance->boot_types.BOOTStr); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTStrArray); /* Set up HLL roles. */ STABLE(tc->instance->boot_types.BOOTInt)->hll_role = MVM_HLL_ROLE_INT; STABLE(tc->instance->boot_types.BOOTNum)->hll_role = MVM_HLL_ROLE_NUM; STABLE(tc->instance->boot_types.BOOTStr)->hll_role = MVM_HLL_ROLE_STR; STABLE(tc->instance->boot_types.BOOTArray)->hll_role = MVM_HLL_ROLE_ARRAY; STABLE(tc->instance->boot_types.BOOTHash)->hll_role = MVM_HLL_ROLE_HASH; STABLE(tc->instance->boot_types.BOOTCode)->hll_role = MVM_HLL_ROLE_CODE; /* Get initial __6MODEL_CORE__ serialization context set up. */ setup_core_sc(tc); MVM_6model_containers_setup(tc); MVM_intcache_for(tc, tc->instance->boot_types.BOOTInt); } MoarVM-2015.11/src/6model/bootstrap.h0000644000175000017500000000006112456307241016214 0ustar jnthnjnthnvoid MVM_6model_bootstrap(MVMThreadContext *tc); MoarVM-2015.11/src/6model/containers.c0000644000175000017500000004674712623370227016364 0ustar jnthnjnthn#include "moar.h" MVMint64 MVM_6model_container_iscont_rw(MVMThreadContext *tc, MVMObject *cont) { if (cont && IS_CONCRETE(cont)) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && cs->can_store(tc, cont)) { return 1; } } return 0; } /* *************************************************************************** * CodePair container configuration: container with FETCH/STORE code refs * ***************************************************************************/ typedef struct { MVMObject *fetch_code; MVMObject *store_code; } CodePairContData; static void code_pair_fetch_internal(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res, MVMReturnType res_type) { CodePairContData *data = (CodePairContData *)STABLE(cont)->container_data; MVMObject *code = MVM_frame_find_invokee(tc, data->fetch_code, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res, res_type, inv_arg_callsite); tc->cur_frame->args[0].o = cont; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } static void code_pair_fetch(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_OBJ); } static void code_pair_fetch_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_INT); } static void code_pair_fetch_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_NUM); } static void code_pair_fetch_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_STR); } static void code_pair_store_internal(MVMThreadContext *tc, MVMObject *cont, MVMRegister value, MVMCallsite *cs) { CodePairContData *data = (CodePairContData *)STABLE(cont)->container_data; MVMObject *code = MVM_frame_find_invokee(tc, data->store_code, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, cs); tc->cur_frame->args[0].o = cont; tc->cur_frame->args[1] = value; STABLE(code)->invoke(tc, code, cs, tc->cur_frame->args); } static void code_pair_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *obj) { MVMRegister r; r.o = obj; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ)); } static void code_pair_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { MVMRegister r; r.i64 = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_INT)); } static void code_pair_store_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { MVMRegister r; r.n64 = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_NUM)); } static void code_pair_store_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { MVMRegister r; r.s = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_STR)); } static void code_pair_gc_mark_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_gc_worklist_add(tc, worklist, &data->fetch_code); MVM_gc_worklist_add(tc, worklist, &data->store_code); } static void code_pair_gc_free_data(MVMThreadContext *tc, MVMSTable *st) { CodePairContData *data = (CodePairContData *)st->container_data; if (data) { MVM_free(data); st->container_data = NULL; } } static void code_pair_serialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_serialization_write_ref(tc, writer, data->fetch_code); MVM_serialization_write_ref(tc, writer, data->store_code); } static void code_pair_deserialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_ASSIGN_REF(tc, &(st->header), data->fetch_code, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), data->store_code, MVM_serialization_read_ref(tc, reader)); } static MVMint32 code_pair_can_store(MVMThreadContext *tc, MVMObject *cont) { return 1; } static const MVMContainerSpec code_pair_spec = { "code_pair", code_pair_fetch, code_pair_fetch_i, code_pair_fetch_n, code_pair_fetch_s, code_pair_store, code_pair_store_i, code_pair_store_n, code_pair_store_s, code_pair_store, NULL, /* spesh */ code_pair_gc_mark_data, code_pair_gc_free_data, code_pair_serialize, code_pair_deserialize, code_pair_can_store, 0 }; static void code_pair_set_container_spec(MVMThreadContext *tc, MVMSTable *st) { CodePairContData *data = MVM_malloc(sizeof(CodePairContData)); data->fetch_code = NULL; data->store_code = NULL; st->container_data = data; st->container_spec = &code_pair_spec; } static void code_pair_configure_container_spec(MVMThreadContext *tc, MVMSTable *st, MVMObject *config) { CodePairContData *data = (CodePairContData *)st->container_data; MVMROOT(tc, config, { MVMString *fetch = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "fetch"); MVMString *store; if (!MVM_repr_exists_key(tc, config, fetch)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a fetch"); MVM_ASSIGN_REF(tc, &(st->header), data->fetch_code, MVM_repr_at_key_o(tc, config, fetch)); store = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "store"); if (!MVM_repr_exists_key(tc, config, store)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a store"); MVM_ASSIGN_REF(tc, &(st->header), data->store_code, MVM_repr_at_key_o(tc, config, store)); }); } static const MVMContainerConfigurer CodePairContainerConfigurer = { code_pair_set_container_spec, code_pair_configure_container_spec }; /* *************************************************************************** * Native reference container configuration * ***************************************************************************/ static void native_ref_fetch_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_INT) MVM_exception_throw_adhoc(tc, "This container does not reference a native integer"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: res->i64 = MVM_nativeref_read_reg_or_lex_i(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->i64 = MVM_nativeref_read_attribute_i(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->i64 = MVM_nativeref_read_positional_i(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native int reference kind"); } } static void native_ref_fetch_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_NUM) MVM_exception_throw_adhoc(tc, "This container does not reference a native number"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: res->n64 = MVM_nativeref_read_reg_or_lex_n(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->n64 = MVM_nativeref_read_attribute_n(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->n64 = MVM_nativeref_read_positional_n(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native num reference kind"); } } static void native_ref_fetch_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_STR) MVM_exception_throw_adhoc(tc, "This container does not reference a native string"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: res->s = MVM_nativeref_read_reg_or_lex_s(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->s = MVM_nativeref_read_attribute_s(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->s = MVM_nativeref_read_positional_s(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native str reference kind"); } } static void native_ref_fetch(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; MVMHLLConfig *hll = STABLE(cont)->hll_owner; MVMRegister tmp; if (!hll) hll = MVM_hll_current(tc); switch (repr_data->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: native_ref_fetch_i(tc, cont, &tmp); res->o = MVM_repr_box_int(tc, hll->int_box_type, tmp.i64); break; case MVM_STORAGE_SPEC_BP_NUM: native_ref_fetch_n(tc, cont, &tmp); res->o = MVM_repr_box_num(tc, hll->num_box_type, tmp.n64); break; case MVM_STORAGE_SPEC_BP_STR: native_ref_fetch_s(tc, cont, &tmp); res->o = MVM_repr_box_str(tc, hll->str_box_type, tmp.s); break; default: MVM_exception_throw_adhoc(tc, "Unknown native reference primitive type"); } } static void native_ref_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_INT) MVM_exception_throw_adhoc(tc, "This container does not reference a native integer"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: MVM_nativeref_write_reg_or_lex_i(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_i(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_i(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native int reference kind"); } } static void native_ref_store_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_NUM) MVM_exception_throw_adhoc(tc, "This container does not reference a native number"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: MVM_nativeref_write_reg_or_lex_n(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_n(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_n(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native num reference kind"); } } static void native_ref_store_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_STR) MVM_exception_throw_adhoc(tc, "This container does not reference a native string"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: MVM_nativeref_write_reg_or_lex_s(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_s(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_s(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native str reference kind"); } } static void native_ref_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *obj) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; switch (repr_data->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: native_ref_store_i(tc, cont, MVM_repr_get_int(tc, obj)); break; case MVM_STORAGE_SPEC_BP_NUM: native_ref_store_n(tc, cont, MVM_repr_get_num(tc, obj)); break; case MVM_STORAGE_SPEC_BP_STR: native_ref_store_s(tc, cont, MVM_repr_get_str(tc, obj)); break; default: MVM_exception_throw_adhoc(tc, "Unknown native reference primitive type"); } } static void native_ref_serialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { /* Nothing to do. */ } static void native_ref_deserialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* Nothing to do. */ } static MVMint32 native_ref_can_store(MVMThreadContext *tc, MVMObject *cont) { return 1; } static const MVMContainerSpec native_ref_spec = { "native_ref", native_ref_fetch, native_ref_fetch_i, native_ref_fetch_n, native_ref_fetch_s, native_ref_store, native_ref_store_i, native_ref_store_n, native_ref_store_s, native_ref_store, NULL, /* spesh */ NULL, /* gc_mark_data */ NULL, /* gc_free_data */ native_ref_serialize, native_ref_deserialize, native_ref_can_store, 1 }; static void native_ref_set_container_spec(MVMThreadContext *tc, MVMSTable *st) { st->container_spec = &native_ref_spec; } static void native_ref_configure_container_spec(MVMThreadContext *tc, MVMSTable *st, MVMObject *config) { /* Nothing to do. */ } static const MVMContainerConfigurer NativeRefContainerConfigurer = { native_ref_set_container_spec, native_ref_configure_container_spec }; /* *************************************************************************** * Container registry and configuration * ***************************************************************************/ /* Adds a container configurer to the registry. */ void MVM_6model_add_container_config(MVMThreadContext *tc, MVMString *name, const MVMContainerConfigurer *configurer) { void *kdata; MVMContainerRegistry *entry; size_t klen; MVM_HASH_EXTRACT_KEY(tc, &kdata, &klen, name, "add container config needs concrete string"); uv_mutex_lock(&tc->instance->mutex_container_registry); HASH_FIND(hash_handle, tc->instance->container_registry, kdata, klen, entry); if (!entry) { entry = MVM_malloc(sizeof(MVMContainerRegistry)); entry->name = name; entry->configurer = configurer; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); } HASH_ADD_KEYPTR(hash_handle, tc->instance->container_registry, kdata, klen, entry); uv_mutex_unlock(&tc->instance->mutex_container_registry); } /* Gets a container configurer from the registry. */ const MVMContainerConfigurer * MVM_6model_get_container_config(MVMThreadContext *tc, MVMString *name) { void *kdata; MVMContainerRegistry *entry; size_t klen; MVM_HASH_EXTRACT_KEY(tc, &kdata, &klen, name, "get container config needs concrete string"); HASH_FIND(hash_handle, tc->instance->container_registry, kdata, klen, entry); return entry != NULL ? entry->configurer : NULL; } /* Does initial setup work of the container registry, including registering * the various built-in container types. */ void MVM_6model_containers_setup(MVMThreadContext *tc) { /* Add built-in configurations. */ MVM_6model_add_container_config(tc, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "code_pair"), &CodePairContainerConfigurer); MVM_6model_add_container_config(tc, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "native_ref"), &NativeRefContainerConfigurer); } /* *************************************************************************** * Native container/reference operations * ***************************************************************************/ /* Check if this is a container referencing a given native. */ static MVMint64 get_container_primitive(MVMThreadContext *tc, MVMObject *cont) { if (cont && IS_CONCRETE(cont)) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs == &native_ref_spec && REPR(cont)->ID == MVM_REPR_ID_NativeRef) return ((MVMNativeRefREPRData *)STABLE(cont)->REPR_data)->primitive_type; } return MVM_STORAGE_SPEC_BP_NONE; } MVMint64 MVM_6model_container_iscont_i(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_INT; } MVMint64 MVM_6model_container_iscont_n(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_NUM; } MVMint64 MVM_6model_container_iscont_s(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_STR; } /* If it's a container, do a fetch_i. Otherwise, try to unbox the received * value as a native integer. */ void MVM_6model_container_decont_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_i(tc, cont, res); else res->i64 = MVM_repr_get_int(tc, cont); } /* If it's a container, do a fetch_n. Otherwise, try to unbox the received * value as a native number. */ void MVM_6model_container_decont_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_n(tc, cont, res); else res->n64 = MVM_repr_get_num(tc, cont); } /* If it's a container, do a fetch_s. Otherwise, try to unbox the received * value as a native string. */ void MVM_6model_container_decont_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_s(tc, cont, res); else res->s = MVM_repr_get_str(tc, cont); } /* Checks we have a container, and provided we do, assigns an int into it. */ void MVM_6model_container_assign_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_i(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } /* Checks we have a container, and provided we do, assigns a num into it. */ void MVM_6model_container_assign_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_n(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } /* Checks we have a container, and provided we do, assigns a str into it. */ void MVM_6model_container_assign_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_s(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } MoarVM-2015.11/src/6model/containers.h0000644000175000017500000001070112623370227016346 0ustar jnthnjnthn/* Container specification information, for types that serve as containers. * A container is something that can be assigned into. It may be some kind * of container object (like Perl 6's Scalar) or it may be a reference to a * native lexical or object field. The function table determines the way it * behaves. */ struct MVMContainerSpec { /* Name of this container specification. */ char *name; /* Fetches a value out of a container. Used for decontainerization. */ void (*fetch) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); /* Native value fetches. */ void (*fetch_i) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void (*fetch_n) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void (*fetch_s) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); /* Stores a value in a container. Used for assignment. */ void (*store) (MVMThreadContext *tc, MVMObject *cont, MVMObject *obj); /* Native container stores. */ void (*store_i) (MVMThreadContext *tc, MVMObject *cont, MVMint64 value); void (*store_n) (MVMThreadContext *tc, MVMObject *cont, MVMnum64 value); void (*store_s) (MVMThreadContext *tc, MVMObject *cont, MVMString *value); /* Stores a value in a container, without any checking of it (this * assumes an optimizer or something else already did it). Used for * assignment. */ void (*store_unchecked) (MVMThreadContext *tc, MVMObject *cont, MVMObject *obj); /* Allow the Container Spec to emit better bytecode, for example for * a decont operation. */ void (*spesh) (MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); /* Marks container data, if any. */ void (*gc_mark_data) (MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist); /* Frees container data, if any. */ void (*gc_free_data) (MVMThreadContext *tc, MVMSTable *st); /* Serializes the container data, if any. */ void (*serialize) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer); /* Deserializes the container data, if any. */ void (*deserialize) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* Returns a non-zero value if we can store to the container. */ MVMint32 (*can_store) (MVMThreadContext *tc, MVMObject *cont); /* Set this to a non-zero value if a fetch promises to never invoke any * code. This means the VM knows it can safely decontainerize in places * it would not be safe or practical to return to the interpreter. */ MVMuint8 fetch_never_invokes; }; /* A container configurer knows how to attach a certain type of container * to an STable and configure it. */ struct MVMContainerConfigurer { /* Sets this container spec in place for the specified STable. */ void (*set_container_spec) (MVMThreadContext *tc, MVMSTable *st); /* Configures the container spec with the specified info. */ void (*configure_container_spec) (MVMThreadContext *tc, MVMSTable *st, MVMObject *config); }; /* Container registry is a hash mapping names of container configurations * to function tables. */ struct MVMContainerRegistry { MVMString *name; const MVMContainerConfigurer *configurer; /* Inline handle to the hash in which this is stored. */ UT_hash_handle hash_handle; }; MVM_PUBLIC void MVM_6model_add_container_config(MVMThreadContext *tc, MVMString *name, const MVMContainerConfigurer *configurer); const MVMContainerConfigurer * MVM_6model_get_container_config(MVMThreadContext *tc, MVMString *name); void MVM_6model_containers_setup(MVMThreadContext *tc); MVMint64 MVM_6model_container_iscont_rw(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_i(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_n(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_s(MVMThreadContext *tc, MVMObject *cont); void MVM_6model_container_decont_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_decont_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_decont_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_assign_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value); void MVM_6model_container_assign_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value); void MVM_6model_container_assign_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value); MoarVM-2015.11/src/6model/parametric.c0000644000175000017500000001466312575756521016351 0ustar jnthnjnthn#include "moar.h" /* Takes a type and sets it up as a parametric type, provided it's OK to do so. */ void MVM_6model_parametric_setup(MVMThreadContext *tc, MVMObject *type, MVMObject *parameterizer) { MVMSTable *st = STABLE(type); /* Ensure that the type is not already parametric or parameterized. */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) MVM_exception_throw_adhoc(tc, "This type is already parametric"); if (st->mode_flags & MVM_PARAMETERIZED_TYPE) MVM_exception_throw_adhoc(tc, "Cannot make a parameterized type also be parametric"); /* For now, we use a simple pairwise array, with parameters and the type * that is based on those parameters interleaved. It does make resolution * O(n), so we might like to do some hash in the future. */ MVMROOT(tc, st, { MVMROOT(tc, parameterizer, { MVMObject *lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.lookup, lookup); }); }); /* Store the parameterizer. (Note, we do this after the allocation * above, since the array allocation may cause GC, but we didn't mark * it as a parametric type yet so it wouldn't mark the parameterizer.) */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.parameterizer, parameterizer); /* Mark the type as parameterized. */ st->mode_flags |= MVM_PARAMETRIC_TYPE; } /* Parameterize a type. Re-use an existing parameterization of there is one that * matches. Otherwise, run the parameterization creator. */ typedef struct { MVMObject *parametric_type; MVMObject *parameters; MVMRegister *result; } ParameterizeReturnData; static void finish_parameterizing(MVMThreadContext *tc, void *sr_data) { ParameterizeReturnData *prd = (ParameterizeReturnData *)sr_data; /* Mark parametric and stash required data. */ MVMSTable *new_stable = STABLE(prd->result->o); MVM_ASSIGN_REF(tc, &(new_stable->header), new_stable->paramet.erized.parametric_type, prd->parametric_type); MVM_ASSIGN_REF(tc, &(new_stable->header), new_stable->paramet.erized.parameters, prd->parameters); new_stable->mode_flags |= MVM_PARAMETERIZED_TYPE; /* Add to lookup table. */ /* XXX handle possible race. */ MVM_repr_push_o(tc, prd->parametric_type->st->paramet.ric.lookup, prd->parameters); MVM_repr_push_o(tc, prd->parametric_type->st->paramet.ric.lookup, prd->result->o); } static void mark_parameterize_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { ParameterizeReturnData *prd = (ParameterizeReturnData *)frame->special_return_data; MVM_gc_worklist_add(tc, worklist, &(prd->parametric_type)); MVM_gc_worklist_add(tc, worklist, &(prd->parameters)); } void MVM_6model_parametric_parameterize(MVMThreadContext *tc, MVMObject *type, MVMObject *params, MVMRegister *result) { ParameterizeReturnData *prd; MVMObject *code, *found; /* Ensure we have a parametric type. */ MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETRIC_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parametric"); /* Use an existing parameterization if we have it. */ found = MVM_6model_parametric_try_find_parameterization(tc, st, params); if (found) { result->o = found; return; } /* It wasn't found; run parameterizer. */ code = MVM_frame_find_invokee(tc, st->paramet.ric.parameterizer, NULL); prd = MVM_malloc(sizeof(ParameterizeReturnData)); prd->parametric_type = type; prd->parameters = params; prd->result = result; tc->cur_frame->special_return = finish_parameterizing; tc->cur_frame->special_return_data = prd; tc->cur_frame->mark_special_return_data = mark_parameterize_sr_data; MVM_args_setup_thunk(tc, result, MVM_RETURN_OBJ, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ)); tc->cur_frame->args[0].o = st->WHAT; tc->cur_frame->args[1].o = params; STABLE(code)->invoke(tc, code, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ), tc->cur_frame->args); } /* Try to find an existing parameterization of the specified type and * parameters. If none is found, returns NULL. */ MVMObject * MVM_6model_parametric_try_find_parameterization(MVMThreadContext *tc, MVMSTable *st, MVMObject *params) { MVMint64 i, j, num_lookups, params_elems; num_lookups = MVM_repr_elems(tc, st->paramet.ric.lookup); params_elems = MVM_repr_elems(tc, params); for (i = 0; i < num_lookups; i += 2) { MVMObject *compare = MVM_repr_at_pos_o(tc, st->paramet.ric.lookup, i); MVMint64 compare_elems = MVM_repr_elems(tc, compare); if (params_elems == compare_elems) { MVMint64 match = 1; for (j = 0; j < params_elems; j++) { MVMObject *want = MVM_repr_at_pos_o(tc, params, j); MVMObject *got = MVM_repr_at_pos_o(tc, compare, j); if (want != got) { match = 0; break; } } if (match) return MVM_repr_at_pos_o(tc, st->paramet.ric.lookup, i + 1); } } return NULL; } /* If the passed type is a parameterized type, then returns the parametric * type it is based on. Otherwise, returns null. */ MVMObject * MVM_6model_parametric_type_parameterized(MVMThreadContext *tc, MVMObject *type) { MVMSTable *st = STABLE(type); if (st->mode_flags & MVM_PARAMETERIZED_TYPE) return st->paramet.erized.parametric_type; else return tc->instance->VMNull; } /* Provided this is a parameterized type, returns the array of type parameters. */ MVMObject * MVM_6model_parametric_type_parameters(MVMThreadContext *tc, MVMObject *type) { MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETERIZED_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parameterized"); return st->paramet.erized.parameters; } /* Provided this is a parameterized type, returns the type parameter at the specified index. */ MVMObject * MVM_6model_parametric_type_parameter_at(MVMThreadContext *tc, MVMObject *type, MVMint64 idx) { MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETERIZED_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parameterized"); return MVM_repr_at_pos_o(tc, st->paramet.erized.parameters, idx); } MoarVM-2015.11/src/6model/parametric.h0000644000175000017500000000116512516136714016336 0ustar jnthnjnthnvoid MVM_6model_parametric_setup(MVMThreadContext *tc, MVMObject *type, MVMObject *parameterizer); void MVM_6model_parametric_parameterize(MVMThreadContext *tc, MVMObject *type, MVMObject *params, MVMRegister *result); MVMObject * MVM_6model_parametric_try_find_parameterization(MVMThreadContext *tc, MVMSTable *st, MVMObject *params); MVMObject * MVM_6model_parametric_type_parameterized(MVMThreadContext *tc, MVMObject *type); MVMObject * MVM_6model_parametric_type_parameters(MVMThreadContext *tc, MVMObject *type); MVMObject * MVM_6model_parametric_type_parameter_at(MVMThreadContext *tc, MVMObject *type, MVMint64 idx); MoarVM-2015.11/src/6model/reprconv.c0000644000175000017500000005677712623370227016061 0ustar jnthnjnthn#include "moar.h" /* Representation function convenience accessors. Could potentially be made into * macros in the future, but hopefully the compiler is smart enough to inline * them anyway. */ void MVM_repr_init(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->initialize) REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMObject * MVM_repr_alloc_init(MVMThreadContext *tc, MVMObject *type) { MVMObject *obj = REPR(type)->allocate(tc, STABLE(type)); if (REPR(obj)->initialize) { MVMROOT(tc, obj, { REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); }); } return obj; } MVMObject * MVM_repr_clone(MVMThreadContext *tc, MVMObject *obj) { MVMObject *res; if (IS_CONCRETE(obj)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&obj); res = REPR(obj)->allocate(tc, STABLE(obj)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&res); REPR(obj)->copy_to(tc, STABLE(obj), OBJECT_BODY(obj), res, OBJECT_BODY(res)); MVM_gc_root_temp_pop_n(tc, 2); } else { res = obj; } return res; } void MVM_repr_compose(MVMThreadContext *tc, MVMObject *type, MVMObject *obj) { REPR(type)->compose(tc, STABLE(type), obj); } MVM_PUBLIC void MVM_repr_pos_set_elems(MVMThreadContext *tc, MVMObject *obj, MVMint64 elems) { REPR(obj)->pos_funcs.set_elems(tc, STABLE(obj), obj, OBJECT_BODY(obj), elems); } static void int_array_to_c_array(MVMThreadContext *tc, MVMObject *arr, MVMint64 *elems, MVMint64 **values) { MVMint64 i; *elems = MVM_repr_elems(tc, arr); *values = *elems ? MVM_malloc(*elems * sizeof(MVMint64)) : NULL; for (i = 0; i < *elems; i++) (*values)[i] = MVM_repr_at_pos_i(tc, arr, i); } void MVM_repr_set_dimensions(MVMThreadContext *tc, MVMObject *obj, MVMObject *dims) { if (IS_CONCRETE(obj)) { MVMint64 num_dims, *c_dims; int_array_to_c_array(tc, dims, &num_dims, &c_dims); REPR(obj)->pos_funcs.set_dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_dims, c_dims); MVM_free(c_dims); } else { MVM_exception_throw_adhoc(tc, "Cannot set dimensions on a type object"); } } MVM_PUBLIC void MVM_repr_pos_splice(MVMThreadContext *tc, MVMObject *obj, MVMObject *replacement, MVMint64 offset, MVMint64 count) { REPR(obj)->pos_funcs.splice(tc, STABLE(obj), obj, OBJECT_BODY(obj), replacement, offset, count); } MVM_PUBLIC MVMint64 MVM_repr_exists_pos(MVMThreadContext *tc, MVMObject *obj, MVMint64 index) { MVMint64 elems = REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); if (index < 0) index += elems; return index >= 0 && index < elems && !MVM_is_null(tc, MVM_repr_at_pos_o(tc, obj, index)); } MVMint64 MVM_repr_at_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_at_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_at_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_at_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { if (IS_CONCRETE(obj)) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_obj); return value.o; } return NULL; } static void at_pos_multidim(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMRegister *value, MVMuint16 kind) { MVMint64 num_indices, *c_indices; int_array_to_c_array(tc, indices, &num_indices, &c_indices); REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_indices, c_indices, value, kind); MVM_free(c_indices); } MVMint64 MVM_repr_at_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_obj); return r.o; } static void at_pos_2d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMRegister *value, MVMuint16 kind) { MVMint64 c_indices[2] = { idx1, idx2 }; REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 2, c_indices, value, kind); } MVMint64 MVM_repr_at_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_obj); return r.o; } static void at_pos_3d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMRegister *value, MVMuint16 kind) { MVMint64 c_indices[3] = { idx1, idx2, idx3 }; REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 3, c_indices, value, kind); } MVMint64 MVM_repr_at_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_obj); return r.o; } void MVM_repr_bind_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMint64 value) { MVMRegister val; val.i64 = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_int64); } void MVM_repr_bind_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMnum64 value) { MVMRegister val; val.n64 = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_num64); } void MVM_repr_bind_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMString *value) { MVMRegister val; val.s = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_str); } void MVM_repr_bind_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMObject *value) { MVMRegister val; val.o = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_obj); } static void bind_pos_multidim(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMRegister value, MVMuint16 kind) { MVMint64 num_indices, *c_indices; int_array_to_c_array(tc, indices, &num_indices, &c_indices); REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_indices, c_indices, value, kind); MVM_free(c_indices); } void MVM_repr_bind_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_int64); } void MVM_repr_bind_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_num64); } void MVM_repr_bind_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMString *value) { MVMRegister r; r.s = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_str); } void MVM_repr_bind_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_obj); } static void bind_pos_2d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMRegister value, MVMuint16 kind) { MVMint64 c_indices[2] = { idx1, idx2 }; REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 2, c_indices, value, kind); } void MVM_repr_bind_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_int64); } void MVM_repr_bind_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_num64); } void MVM_repr_bind_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMString *value) { MVMRegister r; r.s = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_str); } void MVM_repr_bind_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_obj); } static void bind_pos_3d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMRegister value, MVMuint16 kind) { MVMint64 c_indices[3] = { idx1, idx2, idx3 }; REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 3, c_indices, value, kind); } void MVM_repr_bind_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_int64); } void MVM_repr_bind_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_num64); } void MVM_repr_bind_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMString *value) { MVMRegister r; r.s = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_str); } void MVM_repr_bind_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_obj); } void MVM_repr_push_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 pushee) { MVMRegister value; value.i64 = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_int64); } void MVM_repr_push_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 pushee) { MVMRegister value; value.n64 = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_num64); } void MVM_repr_push_s(MVMThreadContext *tc, MVMObject *obj, MVMString *pushee) { MVMRegister value; value.s = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_str); } void MVM_repr_push_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *pushee) { MVMRegister value; value.o = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_obj); } void MVM_repr_unshift_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 unshiftee) { MVMRegister value; value.i64 = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_int64); } void MVM_repr_unshift_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 unshiftee) { MVMRegister value; value.n64 = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_num64); } void MVM_repr_unshift_s(MVMThreadContext *tc, MVMObject *obj, MVMString *unshiftee) { MVMRegister value; value.s = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_str); } void MVM_repr_unshift_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *unshiftee) { MVMRegister value; value.o = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_obj); } MVMint64 MVM_repr_pop_i(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_pop_n(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_pop_s(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_pop_o(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_obj); return value.o; } MVMint64 MVM_repr_shift_i(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_shift_n(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_shift_s(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_shift_o(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_obj); return value.o; } MVMint64 MVM_repr_at_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_at_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_at_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_at_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { if (IS_CONCRETE(obj)) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_obj); return value.o; } return NULL; } void MVM_repr_bind_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMint64 val) { MVMRegister value; value.i64 = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_int64); } void MVM_repr_bind_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMnum64 val) { MVMRegister value; value.n64 = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_num64); } void MVM_repr_bind_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMString *val) { MVMRegister value; value.s = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_str); } void MVM_repr_bind_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMObject *val) { MVMRegister value; value.o = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_obj); } MVMint64 MVM_repr_exists_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { return REPR(obj)->ass_funcs.exists_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key); } void MVM_repr_delete_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { REPR(obj)->ass_funcs.delete_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key); } MVMuint64 MVM_repr_elems(MVMThreadContext *tc, MVMObject *obj) { return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMObject * MVM_repr_dimensions(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) { MVMint64 num_dims, i; MVMint64 *dims; MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); REPR(obj)->pos_funcs.dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), &num_dims, &dims); for (i = 0; i < num_dims; i++) MVM_repr_bind_pos_i(tc, result, i, dims[i]); return result; } else { MVM_exception_throw_adhoc(tc, "Cannot get dimensions of a type object"); } } MVMint64 MVM_repr_num_dimensions(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) { MVMint64 num_dims; MVMint64 *_; REPR(obj)->pos_funcs.dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), &num_dims, &_); return num_dims; } else { MVM_exception_throw_adhoc(tc, "Cannot get number of dimensions of a type object"); } } MVMint64 MVM_repr_get_int(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMnum64 MVM_repr_get_num(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); return REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMString * MVM_repr_get_str(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); return REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } void MVM_repr_set_int(MVMThreadContext *tc, MVMObject *obj, MVMint64 val) { REPR(obj)->box_funcs.set_int(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } void MVM_repr_set_num(MVMThreadContext *tc, MVMObject *obj, MVMnum64 val) { REPR(obj)->box_funcs.set_num(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } void MVM_repr_set_str(MVMThreadContext *tc, MVMObject *obj, MVMString *val) { REPR(obj)->box_funcs.set_str(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } MVMObject * MVM_repr_box_int(MVMThreadContext *tc, MVMObject *type, MVMint64 val) { MVMObject *res; res = MVM_intcache_get(tc, type, val); if (res == 0) { res = MVM_repr_alloc_init(tc, type); MVM_repr_set_int(tc, res, val); } return res; } MVMObject * MVM_repr_box_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 val) { MVMObject *res = MVM_repr_alloc_init(tc, type); MVM_repr_set_num(tc, res, val); return res; } MVMObject * MVM_repr_box_str(MVMThreadContext *tc, MVMObject *type, MVMString *val) { MVMObject *res; MVMROOT(tc, val, { res = MVM_repr_alloc_init(tc, type); MVM_repr_set_str(tc, res, val); }); return res; } MVM_PUBLIC MVMint64 MVM_repr_get_attr_i(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_int64); return result_reg.i64; } MVM_PUBLIC MVMnum64 MVM_repr_get_attr_n(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_num64); return result_reg.n64; } MVM_PUBLIC MVMString * MVM_repr_get_attr_s(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_str); return result_reg.s; } MVM_PUBLIC MVMObject * MVM_repr_get_attr_o(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_obj); return result_reg.o; } MVM_PUBLIC void MVM_repr_bind_attr_inso(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint, MVMRegister value_reg, MVMuint16 kind) { if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(object)->attr_funcs.bind_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, value_reg, kind); MVM_SC_WB_OBJ(tc, object); } MVM_PUBLIC MVMint64 MVM_repr_compare_repr_id(MVMThreadContext *tc, MVMObject *object, MVMuint32 REPRId) { return object && REPR(object)->ID == REPRId ? 1 : 0; } MVM_PUBLIC MVMint64 MVM_repr_hint_for(MVMThreadContext *tc, MVMObject *object, MVMString *attrname) { return REPR(object)->attr_funcs.hint_for(tc, STABLE(object), object, attrname); } MoarVM-2015.11/src/6model/reprconv.h0000644000175000017500000002344312623370227016046 0ustar jnthnjnthnvoid MVM_repr_init(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_alloc_init(MVMThreadContext *tc, MVMObject *type); MVM_PUBLIC MVMObject * MVM_repr_clone(MVMThreadContext *tc, MVMObject *obj); void MVM_repr_compose(MVMThreadContext *tc, MVMObject *type, MVMObject *obj); MVM_PUBLIC void MVM_repr_pos_set_elems(MVMThreadContext *tc, MVMObject *obj, MVMint64 elems); MVM_PUBLIC void MVM_repr_set_dimensions(MVMThreadContext *tc, MVMObject *obj, MVMObject *dims); MVM_PUBLIC void MVM_repr_pos_splice(MVMThreadContext *tc, MVMObject *obj, MVMObject *replacement, MVMint64 offset, MVMint64 count); MVM_PUBLIC MVMint64 MVM_repr_at_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMString * MVM_repr_at_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMObject * MVM_repr_at_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMint64 MVM_repr_at_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMString * MVM_repr_at_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMObject * MVM_repr_at_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMint64 MVM_repr_at_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMString * MVM_repr_at_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMObject * MVM_repr_at_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMint64 MVM_repr_at_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMString * MVM_repr_at_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMObject * MVM_repr_at_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMint64 MVM_repr_exists_pos(MVMThreadContext *tc, MVMObject *obj, MVMint64 index); MVM_PUBLIC void MVM_repr_bind_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMObject *value); MVM_PUBLIC void MVM_repr_push_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 pushee); MVM_PUBLIC void MVM_repr_push_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 pushee); MVM_PUBLIC void MVM_repr_push_s(MVMThreadContext *tc, MVMObject *obj, MVMString *pushee); MVM_PUBLIC void MVM_repr_push_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *pushee); MVM_PUBLIC void MVM_repr_unshift_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 unshiftee); MVM_PUBLIC void MVM_repr_unshift_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 unshiftee); MVM_PUBLIC void MVM_repr_unshift_s(MVMThreadContext *tc, MVMObject *obj, MVMString *unshiftee); MVM_PUBLIC void MVM_repr_unshift_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *unshiftee); MVM_PUBLIC MVMint64 MVM_repr_pop_i(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_pop_n(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_pop_s(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_pop_o(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_shift_i(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_shift_n(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_shift_s(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_shift_o(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_at_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMnum64 MVM_repr_at_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMString * MVM_repr_at_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMObject * MVM_repr_at_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC void MVM_repr_bind_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMint64 val); MVM_PUBLIC void MVM_repr_bind_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMnum64 val); MVM_PUBLIC void MVM_repr_bind_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMString *val); MVM_PUBLIC void MVM_repr_bind_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMObject *val); MVM_PUBLIC MVMint64 MVM_repr_exists_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC void MVM_repr_delete_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMuint64 MVM_repr_elems(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_dimensions(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_num_dimensions(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_get_int(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_get_num(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_get_str(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC void MVM_repr_set_int(MVMThreadContext *tc, MVMObject *obj, MVMint64 val); MVM_PUBLIC void MVM_repr_set_num(MVMThreadContext *tc, MVMObject *obj, MVMnum64 val); MVM_PUBLIC void MVM_repr_set_str(MVMThreadContext *tc, MVMObject *obj, MVMString *val); MVM_PUBLIC MVMObject * MVM_repr_box_int(MVMThreadContext *tc, MVMObject *type, MVMint64 val); MVM_PUBLIC MVMObject * MVM_repr_box_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 val); MVM_PUBLIC MVMObject * MVM_repr_box_str(MVMThreadContext *tc, MVMObject *type, MVMString *val); MVM_PUBLIC MVMint64 MVM_repr_get_attr_i(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMnum64 MVM_repr_get_attr_n(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMString * MVM_repr_get_attr_s(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMObject * MVM_repr_get_attr_o(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC void MVM_repr_bind_attr_inso(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint, MVMRegister value_reg, MVMuint16 kind); MVM_PUBLIC MVMint64 MVM_repr_compare_repr_id(MVMThreadContext *tc, MVMObject *object, MVMuint32 REPRId); MVM_PUBLIC MVMint64 MVM_repr_hint_for(MVMThreadContext *tc, MVMObject *object, MVMString *attrname); #define MVM_repr_at_key_int(tc, obj, key) \ MVM_repr_get_int((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_at_key_num(tc, obj, key) \ MVM_repr_get_num((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_at_key_str(tc, obj, key) \ MVM_repr_get_str((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_bind_key_int(tc, obj, key, val) do { \ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->int_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) #define MVM_repr_bind_key_num(tc, obj, key, val) do {\ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->num_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) #define MVM_repr_bind_key_str(tc, obj, key, val) do {\ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->str_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) MoarVM-2015.11/src/6model/reprs.c0000644000175000017500000002672312573775575015365 0ustar jnthnjnthn#include "moar.h" #include "gcc_diag.h" /* Default REPR function handlers. */ GCC_DIAG_OFF(return-type) MVMuint64 MVM_REPR_DEFAULT_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support elems", st->REPR->name); } GCC_DIAG_ON(return-type) MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc, const char *repr_name) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc, const char *repr_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support attribute storage", repr_name); } void MVM_REPR_DEFAULT_GET_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind) { die_no_attrs(tc, st->REPR->name); } void MVM_REPR_DEFAULT_BIND_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind) { die_no_attrs(tc, st->REPR->name); } GCC_DIAG_OFF(return-type) MVMint64 MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc, st->REPR->name); } GCC_DIAG_ON(return-type) MVMint64 MVM_REPR_DEFAULT_HINT_FOR(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } void MVM_REPR_DEFAULT_SET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native int", st->REPR->name); } MVMint64 MVM_REPR_DEFAULT_GET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native int", st->REPR->name); } void MVM_REPR_DEFAULT_SET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native num", st->REPR->name); } MVMnum64 MVM_REPR_DEFAULT_GET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native num", st->REPR->name); } void MVM_REPR_DEFAULT_SET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native string", st->REPR->name); } MVMString * MVM_REPR_DEFAULT_GET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native string", st->REPR->name); } void * MVM_REPR_DEFAULT_GET_BOXED_REF(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to other types", st->REPR->name); } MVM_NO_RETURN static void die_no_pos(MVMThreadContext *tc, const char *repr_name) MVM_NO_RETURN_GCC; static void die_no_pos(MVMThreadContext *tc, const char *repr_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support positional access", repr_name); } void MVM_REPR_DEFAULT_AT_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_BIND_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_SET_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_PUSH(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_POP(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_UNSHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_SHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_AT_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_BIND_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { die_no_pos(tc, st->REPR->name); } void MVM_REPR_DEFAULT_SET_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { die_no_pos(tc, st->REPR->name); } GCC_DIAG_OFF(return-type) MVMStorageSpec MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st) { die_no_pos(tc, st->REPR->name); } GCC_DIAG_ON(return-type) void MVM_REPR_DEFAULT_SPLICE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems) { die_no_pos(tc, st->REPR->name); } MVM_NO_RETURN static void die_no_ass(MVMThreadContext *tc, const char *repr_name) MVM_NO_RETURN_GCC; static void die_no_ass(MVMThreadContext *tc, const char *repr_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support associative access", repr_name); } void MVM_REPR_DEFAULT_AT_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { die_no_ass(tc, st->REPR->name); } void MVM_REPR_DEFAULT_BIND_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { die_no_ass(tc, st->REPR->name); } GCC_DIAG_OFF(return-type) MVMint64 MVM_REPR_DEFAULT_EXISTS_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { die_no_ass(tc, st->REPR->name); } GCC_DIAG_ON(return-type) void MVM_REPR_DEFAULT_DELETE_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { die_no_ass(tc, st->REPR->name); } GCC_DIAG_OFF(return-type) MVMStorageSpec MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st) { die_no_ass(tc, st->REPR->name); } GCC_DIAG_ON(return-type) /* Registers a representation. */ static void register_repr(MVMThreadContext *tc, const MVMREPROps *repr, MVMString *name) { MVMReprRegistry *entry; if (!name) name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, repr->name); /* Fill a registry entry. */ entry = MVM_malloc(sizeof(MVMReprRegistry)); entry->name = name; entry->repr = repr; /* Name should become a permanent GC root. */ MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); /* Enter into registry. */ tc->instance->repr_list[repr->ID] = entry; MVM_string_flatten(tc, name); MVM_HASH_BIND(tc, tc->instance->repr_hash, name, entry); } int MVM_repr_register_dynamic_repr(MVMThreadContext *tc, MVMREPROps *repr) { MVMReprRegistry *entry; MVMString *name; uv_mutex_lock(&tc->instance->mutex_repr_registry); name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, repr->name); MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->repr_hash, name, entry); if (entry) { uv_mutex_unlock(&tc->instance->mutex_repr_registry); return 0; } if (!(tc->instance->num_reprs < MVM_REPR_MAX_COUNT)) { uv_mutex_unlock(&tc->instance->mutex_repr_registry); MVM_exception_throw_adhoc(tc, "Cannot register more than %u representations", MVM_REPR_MAX_COUNT); } repr->ID = tc->instance->num_reprs++; register_repr(tc, repr, name); uv_mutex_unlock(&tc->instance->mutex_repr_registry); return 1; } #define register_core_repr(name) \ register_repr(tc, MVM##name##_initialize(tc), NULL) /* Initializes the representations registry, building up all of the various * representations. */ void MVM_repr_initialize_registry(MVMThreadContext *tc) { tc->instance->repr_list = MVM_malloc( MVM_REPR_MAX_COUNT * sizeof *tc->instance->repr_list); /* Add all core representations. */ register_core_repr(String); register_core_repr(Array); register_core_repr(Hash); register_core_repr(CFunction); register_core_repr(KnowHOWREPR); register_core_repr(P6opaque); register_core_repr(Code); register_core_repr(OSHandle); register_core_repr(P6int); register_core_repr(P6num); register_core_repr(Uninstantiable); register_core_repr(HashAttrStore); register_core_repr(KnowHOWAttributeREPR); register_core_repr(P6str); register_core_repr(Thread); register_core_repr(Iter); register_core_repr(Context); register_core_repr(SCRef); register_core_repr(Lexotic); register_core_repr(CallCapture); register_core_repr(P6bigint); register_core_repr(NFA); register_core_repr(Exception); register_core_repr(StaticFrame); register_core_repr(CompUnit); register_core_repr(DLLSym); register_core_repr(MultiCache); register_core_repr(Continuation); register_core_repr(NativeCall); register_core_repr(CPointer); register_core_repr(CStr); register_core_repr(CArray); register_core_repr(CStruct); register_core_repr(CUnion); register_core_repr(ReentrantMutex); register_core_repr(ConditionVariable); register_core_repr(Semaphore); register_core_repr(ConcBlockingQueue); register_core_repr(AsyncTask); register_core_repr(Null); register_core_repr(CPPStruct); register_core_repr(NativeRef); register_core_repr(MultiDimArray); tc->instance->num_reprs = MVM_REPR_CORE_COUNT; } static MVMReprRegistry * find_repr_by_name(MVMThreadContext *tc, MVMString *name) { MVMReprRegistry *entry; MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->repr_hash, name, entry) if (entry == NULL) { char *c_name = MVM_string_ascii_encode_any(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lookup by name of unknown REPR: %s", c_name); } return entry; } /* Get a representation's ID from its name. Note that the IDs may change so * it's best not to store references to them in e.g. the bytecode stream. */ MVMuint32 MVM_repr_name_to_id(MVMThreadContext *tc, MVMString *name) { return find_repr_by_name(tc, name)->repr->ID; } /* Gets a representation by ID. */ const MVMREPROps * MVM_repr_get_by_id(MVMThreadContext *tc, MVMuint32 id) { if (id >= tc->instance->num_reprs) MVM_exception_throw_adhoc(tc, "REPR lookup by invalid ID %" PRIu32, id); return tc->instance->repr_list[id]->repr; } /* Gets a representation by name. */ const MVMREPROps * MVM_repr_get_by_name(MVMThreadContext *tc, MVMString *name) { return find_repr_by_name(tc, name)->repr; } MoarVM-2015.11/src/6model/reprs.h0000644000175000017500000002413112573775575015361 0ustar jnthnjnthn/* Pull in all of the core REPRs. */ #include "6model/reprs/MVMString.h" #include "6model/reprs/MVMArray.h" #include "6model/reprs/MVMHash.h" #include "6model/reprs/MVMCFunction.h" #include "6model/reprs/KnowHOWREPR.h" #include "6model/reprs/P6opaque.h" #include "6model/reprs/MVMCode.h" #include "6model/reprs/MVMOSHandle.h" #include "6model/reprs/P6int.h" #include "6model/reprs/P6num.h" #include "6model/reprs/Uninstantiable.h" #include "6model/reprs/HashAttrStore.h" #include "6model/reprs/KnowHOWAttributeREPR.h" #include "6model/reprs/P6str.h" #include "6model/reprs/MVMThread.h" #include "6model/reprs/MVMIter.h" #include "6model/reprs/MVMContext.h" #include "6model/reprs/SCRef.h" #include "6model/reprs/Lexotic.h" #include "6model/reprs/MVMCallCapture.h" #include "6model/reprs/P6bigint.h" #include "6model/reprs/NFA.h" #include "6model/reprs/MVMException.h" #include "6model/reprs/MVMStaticFrame.h" #include "6model/reprs/MVMCompUnit.h" #include "6model/reprs/MVMDLLSym.h" #include "6model/reprs/MVMMultiCache.h" #include "6model/reprs/MVMContinuation.h" #include "6model/reprs/NativeCall.h" #include "6model/reprs/CPointer.h" #include "6model/reprs/CStr.h" #include "6model/reprs/CArray.h" #include "6model/reprs/CStruct.h" #include "6model/reprs/CUnion.h" #include "6model/reprs/ReentrantMutex.h" #include "6model/reprs/ConditionVariable.h" #include "6model/reprs/Semaphore.h" #include "6model/reprs/ConcBlockingQueue.h" #include "6model/reprs/MVMAsyncTask.h" #include "6model/reprs/MVMNull.h" #include "6model/reprs/CPPStruct.h" #include "6model/reprs/NativeRef.h" #include "6model/reprs/MultiDimArray.h" /* REPR related functions. */ void MVM_repr_initialize_registry(MVMThreadContext *tc); MVMuint32 MVM_repr_name_to_id(MVMThreadContext *tc, MVMString *name); const MVMREPROps * MVM_repr_get_by_id(MVMThreadContext *tc, MVMuint32 id); const MVMREPROps * MVM_repr_get_by_name(MVMThreadContext *tc, MVMString *name); /* Core representation IDs (determined by the order we add them * to the registery in reprs.c). */ #define MVM_REPR_ID_MVMString 0 #define MVM_REPR_ID_MVMArray 1 #define MVM_REPR_ID_MVMHash 2 #define MVM_REPR_ID_MVMCFunction 3 #define MVM_REPR_ID_KnowHOWREPR 4 #define MVM_REPR_ID_P6opaque 5 #define MVM_REPR_ID_MVMCode 6 #define MVM_REPR_ID_MVMOSHandle 7 #define MVM_REPR_ID_P6int 8 #define MVM_REPR_ID_P6num 9 #define MVM_REPR_ID_Uninstantiable 10 #define MVM_REPR_ID_HashAttrStore 11 #define MVM_REPR_ID_KnowHOWAttributeREPR 12 #define MVM_REPR_ID_P6str 13 #define MVM_REPR_ID_MVMThread 14 #define MVM_REPR_ID_MVMIter 15 #define MVM_REPR_ID_MVMContext 16 #define MVM_REPR_ID_SCRef 17 #define MVM_REPR_ID_Lexotic 18 #define MVM_REPR_ID_MVMCallCapture 19 #define MVM_REPR_ID_P6bigint 20 #define MVM_REPR_ID_NFA 21 #define MVM_REPR_ID_MVMException 22 #define MVM_REPR_ID_MVMStaticFrame 23 #define MVM_REPR_ID_MVMCompUnit 24 #define MVM_REPR_ID_MVMDLLSym 25 #define MVM_REPR_ID_MVMMultiCache 26 #define MVM_REPR_ID_MVMContinuation 27 #define MVM_REPR_ID_MVMNativeCall 28 #define MVM_REPR_ID_MVMCPointer 29 #define MVM_REPR_ID_MVMCStr 30 #define MVM_REPR_ID_MVMCArray 31 #define MVM_REPR_ID_MVMCStruct 32 #define MVM_REPR_ID_ReentrantMutex 33 #define MVM_REPR_ID_ConditionVariable 34 #define MVM_REPR_ID_Semaphore 35 #define MVM_REPR_ID_ConcBlockingQueue 36 #define MVM_REPR_ID_MVMAsyncTask 37 #define MVM_REPR_ID_MVMNull 38 #define MVM_REPR_ID_NativeRef 39 #define MVM_REPR_ID_MVMCUnion 40 #define MVM_REPR_ID_MultiDimArray 41 #define MVM_REPR_ID_MVMCPPStruct 42 #define MVM_REPR_CORE_COUNT 43 #define MVM_REPR_MAX_COUNT 64 /* Default attribute functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_ATTR_FUNCS \ { \ MVM_REPR_DEFAULT_GET_ATTRIBUTE, \ MVM_REPR_DEFAULT_BIND_ATTRIBUTE, \ MVM_REPR_DEFAULT_HINT_FOR, \ MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED \ } /* Default boxing functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_BOX_FUNCS \ { \ MVM_REPR_DEFAULT_SET_INT, \ MVM_REPR_DEFAULT_GET_INT, \ MVM_REPR_DEFAULT_SET_NUM, \ MVM_REPR_DEFAULT_GET_NUM, \ MVM_REPR_DEFAULT_SET_STR, \ MVM_REPR_DEFAULT_GET_STR, \ MVM_REPR_DEFAULT_GET_BOXED_REF \ } /* Default positional functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_POS_FUNCS \ { \ MVM_REPR_DEFAULT_AT_POS, \ MVM_REPR_DEFAULT_BIND_POS, \ MVM_REPR_DEFAULT_SET_ELEMS, \ MVM_REPR_DEFAULT_PUSH, \ MVM_REPR_DEFAULT_POP, \ MVM_REPR_DEFAULT_UNSHIFT, \ MVM_REPR_DEFAULT_SHIFT, \ MVM_REPR_DEFAULT_SPLICE, \ MVM_REPR_DEFAULT_AT_POS_MULTIDIM, \ MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, \ MVM_REPR_DEFAULT_DIMENSIONS, \ MVM_REPR_DEFAULT_SET_DIMENSIONS, \ MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC \ } /* Default associative functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_ASS_FUNCS \ { \ MVM_REPR_DEFAULT_AT_KEY, \ MVM_REPR_DEFAULT_BIND_KEY, \ MVM_REPR_DEFAULT_EXISTS_KEY, \ MVM_REPR_DEFAULT_DELETE_KEY, \ MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC \ } /* Register a representation at runtime, setting repr->ID to a dynamically * assigned value. * * Returns nonzero if the representation has been added successfully and * zero if a representation with the same name is already present. * In that case, the MVMREPROps structure is unused and may be deallocated. */ int MVM_repr_register_dynamic_repr(MVMThreadContext *tc, MVMREPROps *repr); /* Default elems REPR function for a REPR that lacks it. */ MVMuint64 MVM_REPR_DEFAULT_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Default attribute access REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_GET_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind); MVMint64 MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint); MVMint64 MVM_REPR_DEFAULT_HINT_FOR(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name); /* Default boxing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_SET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value); MVMint64 MVM_REPR_DEFAULT_GET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void MVM_REPR_DEFAULT_SET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value); MVMnum64 MVM_REPR_DEFAULT_GET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void MVM_REPR_DEFAULT_SET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value); MVMString * MVM_REPR_DEFAULT_GET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void * MVM_REPR_DEFAULT_GET_BOXED_REF(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id); /* Default positional indexing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_AT_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_SET_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count); void MVM_REPR_DEFAULT_PUSH(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_POP(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_UNSHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_SHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_AT_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions); void MVM_REPR_DEFAULT_SET_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions); MVMStorageSpec MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st); /* Default associative indexing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_SPLICE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems); void MVM_REPR_DEFAULT_AT_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); MVMint64 MVM_REPR_DEFAULT_EXISTS_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); void MVM_REPR_DEFAULT_DELETE_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); MVMStorageSpec MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st); MoarVM-2015.11/src/6model/reprs/CArray.c0000644000175000017500000004452212554473060016522 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCArray); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.array); if (!MVM_is_null(tc, info)) { MVMCArrayREPRData *repr_data = MVM_malloc(sizeof(MVMCArrayREPRData)); MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts.type); const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); st->REPR_data = repr_data; if (ss->boxed_primitive == MVM_STORAGE_SPEC_BP_INT) { if (ss->bits == 8 || ss->bits == 16 || ss->bits == 32 || ss->bits == 64) repr_data->elem_size = ss->bits / 8; else MVM_exception_throw_adhoc(tc, "CArray representation can only have 8, 16, 32 or 64 bit integer elements"); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_NUMERIC; } else if (ss->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM) { if (ss->bits == 32 || ss->bits == 64) repr_data->elem_size = ss->bits / 8; else MVM_exception_throw_adhoc(tc, "CArray representation can only have 32 or 64 bit floating point elements"); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_NUMERIC; } else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { repr_data->elem_size = sizeof(MVMObject *); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_STRING; } else if (type_id == MVM_REPR_ID_MVMCArray) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CARRAY; repr_data->elem_size = sizeof(void *); } else if (type_id == MVM_REPR_ID_MVMCStruct) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CSTRUCT; repr_data->elem_size = sizeof(void *); } else if (type_id == MVM_REPR_ID_MVMCPointer) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CPOINTER; repr_data->elem_size = sizeof(void *); } else { MVM_exception_throw_adhoc(tc, "CArray may only contain native integers and numbers, strings, C Structs or C Pointers"); } } else { MVM_exception_throw_adhoc(tc, "CArray representation requires a typed array"); } } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { /* If we're initialized, presumably we're going to be * managing the memory in this array ourself. */ MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; if (!repr_data) MVM_exception_throw_adhoc(tc, "CArray type must be composed before use"); body->storage = MVM_calloc(4, repr_data->elem_size); body->managed = 1; /* Don't need child_objs for numerics. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) body->child_objs = NULL; else body->child_objs = (MVMObject **) MVM_calloc(4, sizeof(MVMObject *)); body->allocated = 4; body->elems = 0; } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *src_body = (MVMCArrayBody *)src; MVMCArrayBody *dest_body = (MVMCArrayBody *)dest; if (src_body->managed) { MVMint32 alsize = src_body->allocated * repr_data->elem_size; dest_body->storage = MVM_malloc(alsize); memcpy(dest_body->storage, src_body->storage, alsize); } else { dest_body->storage = src_body->storage; } dest_body->managed = src_body->managed; dest_body->allocated = src_body->allocated; dest_body->elems = src_body->elems; } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCArrayBody *body = (MVMCArrayBody *)data; if (body->managed) { MVM_free(body->storage); if (body->child_objs) MVM_free(body->child_objs); } } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCArrayBody *body = (MVMCArrayBody *)data; const MVMint32 elems = body->elems; MVMint32 i; /* Don't traverse child_objs list if there isn't one. */ if (!body->child_objs) return; for (i = 0; i < elems; i++) if (body->child_objs[i]) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; if (repr_data) MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } MVM_NO_RETURN static void die_pos_nyi(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_pos_nyi(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CArray representation does not fully positional storage yet"); } static void expand(MVMThreadContext *tc, MVMCArrayREPRData *repr_data, MVMCArrayBody *body, MVMint32 min_size) { MVMint8 is_complex; MVMint32 next_size = body->allocated? 2 * body->allocated: 4; if (min_size > next_size) next_size = min_size; if (body->managed) { const size_t old_size = body->allocated * repr_data->elem_size; const size_t new_size = next_size * repr_data->elem_size; body->storage = MVM_realloc(body->storage, new_size); memset((char *)body->storage + old_size, 0, new_size - old_size); } is_complex = (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CARRAY || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CPOINTER || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CSTRUCT || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_STRING); if (is_complex) { const size_t old_size = body->allocated * sizeof(MVMObject *); const size_t new_size = next_size * sizeof(MVMObject *); body->child_objs = (MVMObject **) MVM_realloc(body->child_objs, new_size); memset((char *)body->child_objs + old_size, 0, new_size - old_size); } body->allocated = next_size; } static MVMObject * make_wrapper(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_STRING: { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, (char *)data, strlen((char *)data)); return MVM_repr_box_str(tc, repr_data->elem_type, str); } case MVM_CARRAY_ELEM_KIND_CPOINTER: return MVM_nativecall_make_cpointer(tc, repr_data->elem_type, data); case MVM_CARRAY_ELEM_KIND_CARRAY: return MVM_nativecall_make_carray(tc, repr_data->elem_type, data); case MVM_CARRAY_ELEM_KIND_CSTRUCT: return MVM_nativecall_make_cstruct(tc, repr_data->elem_type, data); default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; void *ptr = ((char *)body->storage) + index * repr_data->elem_size; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_NUMERIC: if (kind == MVM_reg_int64) value->i64 = body->managed && index >= body->elems ? 0 : REPR(repr_data->elem_type)->box_funcs.get_int(tc, STABLE(repr_data->elem_type), root, ptr); else if (kind == MVM_reg_num64) value->n64 = body->managed && index >= body->elems ? 0.0 : REPR(repr_data->elem_type)->box_funcs.get_num(tc, STABLE(repr_data->elem_type), root, ptr); else MVM_exception_throw_adhoc(tc, "Wrong kind of access to numeric CArray"); break; case MVM_CARRAY_ELEM_KIND_STRING: case MVM_CARRAY_ELEM_KIND_CPOINTER: case MVM_CARRAY_ELEM_KIND_CARRAY: case MVM_CARRAY_ELEM_KIND_CSTRUCT: { if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Wrong kind of access to object CArray"); if (body->managed) { /* We manage this array. If we're out of range, just use type object. */ if (index >= body->elems) { value->o = repr_data->elem_type; } /* Otherwise we may have a cached object result. */ else if (body->child_objs[index]) { value->o = body->child_objs[index]; } /* If not, we need to produce and cache it. */ else { void **storage = (void **)body->storage; MVMROOT(tc, root, { MVMObject **child_objs = body->child_objs; MVMObject *wrapped = make_wrapper(tc, st, storage[index]); MVM_ASSIGN_REF(tc, &(root->header), child_objs[index], wrapped); value->o = wrapped; }); } } else { void **storage; /* Array comes from C. Enlarge child_objs if needed. */ if (index >= body->allocated) expand(tc, repr_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; storage = (void **)body->storage; /* We've already fetched this object; use cached one. */ if (storage[index] && body->child_objs[index]) { value->o = body->child_objs[index]; } /* No cached object, but non-NULL pointer in array. Construct object, * put it in the cache and return it. */ else if (storage[index]) { MVMROOT(tc, root, { MVMObject **child_objs = body->child_objs; MVMObject *wrapped = make_wrapper(tc, st, storage[index]); MVM_ASSIGN_REF(tc, &(root->header), child_objs[index], wrapped); value->o = wrapped; }); } /* NULL pointer in the array; result is the type object. */ else { value->o = repr_data->elem_type; } } break; } default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void bind_wrapper_and_ptr(MVMThreadContext *tc, MVMObject *root, MVMCArrayBody *body, MVMint64 index, MVMObject *wrapper, void *cptr) { if (index >= body->allocated) expand(tc, STABLE(root)->REPR_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[index], wrapper); ((void **)body->storage)[index] = cptr; } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; void *ptr; if (body->managed && index >= body->allocated) expand(tc, repr_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; ptr = ((char *)body->storage) + index * repr_data->elem_size; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_NUMERIC: if (kind == MVM_reg_int64) REPR(repr_data->elem_type)->box_funcs.set_int(tc, STABLE(repr_data->elem_type), root, ptr, value.i64); else if (kind == MVM_reg_num64) REPR(repr_data->elem_type)->box_funcs.set_num(tc, STABLE(repr_data->elem_type), root, ptr, value.n64); else MVM_exception_throw_adhoc(tc, "Wrong kind of access to numeric CArray"); break; case MVM_CARRAY_ELEM_KIND_STRING: { char *string = IS_CONCRETE(value.o) ? MVM_string_utf8_encode_C_string(tc, MVM_repr_get_str(tc, value.o)) : NULL; bind_wrapper_and_ptr(tc, root, body, index, value.o, string); break; } case MVM_CARRAY_ELEM_KIND_CPOINTER: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "CArray of CPointer passed non-CPointer object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, ((MVMCPointer *)value.o)->body.ptr); break; case MVM_CARRAY_ELEM_KIND_CARRAY: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "CArray of CArray passed non-CArray object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, ((MVMCArray *)value.o)->body.storage); break; case MVM_CARRAY_ELEM_KIND_CSTRUCT: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "CArray of CStruct passed non-CStruct object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, ((MVMCStruct *)value.o)->body.cstruct); break; default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_pos_nyi(tc); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_pos_nyi(tc); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_pos_nyi(tc); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_pos_nyi(tc); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCArrayBody *body = (MVMCArrayBody *)data; if (body->managed) return body->elems; MVM_exception_throw_adhoc(tc, "Don't know how many elements a C array returned from a library"); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCArray); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVM_serialization_write_int(tc, writer, repr_data->elem_size); MVM_serialization_write_ref(tc, writer, repr_data->elem_type); MVM_serialization_write_int(tc, writer, repr_data->elem_kind); } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *) MVM_malloc(sizeof(MVMCArrayREPRData)); repr_data->elem_size = MVM_serialization_read_int(tc, reader); repr_data->elem_type = MVM_serialization_read_ref(tc, reader); repr_data->elem_kind = MVM_serialization_read_int(tc, reader); st->REPR_data = repr_data; } /* Initializes the CArray representation. */ const MVMREPROps * MVMCArray_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, MVM_REPR_DEFAULT_SET_ELEMS, push, pop, unshift, shift, MVM_REPR_DEFAULT_SPLICE, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CArray", /* name */ MVM_REPR_ID_MVMCArray, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CArray.h0000644000175000017500000000270412534320622016514 0ustar jnthnjnthn/* Body of a CArray. */ struct MVMCArrayBody { /* The storage of C-land elements. */ void *storage; /* The storage of Perl-land elements */ MVMObject **child_objs; /* Are we managing the memory for this array ourselves, or does it come * from C? */ MVMint32 managed; /* The number of elements we've allocated. If we do not know, * because the array was returned to us from elsewhere and we * are not managing it's memory, this is 0. */ MVMint32 allocated; /* The number of elements we have, if known. Invalid if we * are not managing the array. */ MVMint32 elems; }; struct MVMCArray { MVMObject common; MVMCArrayBody body; }; /* What kind of element do we have? */ #define MVM_CARRAY_ELEM_KIND_NUMERIC 1 #define MVM_CARRAY_ELEM_KIND_STRING 2 #define MVM_CARRAY_ELEM_KIND_CPOINTER 3 #define MVM_CARRAY_ELEM_KIND_CARRAY 4 #define MVM_CARRAY_ELEM_KIND_CSTRUCT 5 #define MVM_CARRAY_ELEM_KIND_CUNION 6 /* The CArray REPR data contains a little info about the type of array * that we have. */ struct MVMCArrayREPRData { /* The number of bytes in size that an element is. */ MVMint32 elem_size; /* The type of an element. */ MVMObject *elem_type; /* What kind of element is it (lets us quickly know how to handle access * to it). */ MVMint32 elem_kind; }; /* Initializes the CArray REPR. */ const MVMREPROps * MVMCArray_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/CPPStruct.c0000644000175000017500000011122012623370227017154 0ustar jnthnjnthn#include "moar.h" #include "math.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCPPStructREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCPPStructNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter); attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map); } while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } if (attr_map) { MVM_gc_root_temp_pop_n(tc, 2); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation does not support multiple inheritance"); } } MVM_gc_root_temp_pop_n(tc, 4); /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCPPStructNameMap *) MVM_malloc(sizeof(MVMCPPStructNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMObject *repr_info, MVMCPPStructREPRData *repr_data) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* We track the size of the struct, which is what we'll want offsets into. */ MVMint32 cur_size = 0; /* The structure itself will be the multiple of its biggest element in size. * So we keep track of that biggest element. */ MVMint32 multiple_of = 1; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs == 0 ? 1 : num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_IN_STRUCT; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_STRING; repr_data->member_types[i] = type; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CARRAY; repr_data->member_types[i] = type; } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CPPSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CPPSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CUNION; repr_data->member_types[i] = type; if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CPTR; repr_data->member_types[i] = type; } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation only handles int, num, CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CPPStruct only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } /* Do allocation. */ /* C structure needs careful alignment. If cur_size is not aligned * to align bytes (cur_size % align), make sure it is before we * add the next element. */ if (cur_size % align) { cur_size += align - cur_size % align; } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = cur_size; cur_size += bits / 8; if (bits / 8 > multiple_of) multiple_of = bits / 8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ if (multiple_of > sizeof(void *)) multiple_of = sizeof(void *); repr_data->struct_size = ceil((double)cur_size / (double)multiple_of) * multiple_of; if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCPPStructREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCPPStructNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCPPStruct); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCPPStructREPRData *repr_data = MVM_calloc(1, sizeof(MVMCPPStructREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); compute_allocation_strategy(tc, attr_info, repr_data); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCPPStructREPRData * repr_data = (MVMCPPStructREPRData *)st->REPR_data; /* Allocate object body. */ MVMCPPStructBody *body = (MVMCPPStructBody *)data; body->cppstruct = MVM_calloc(1, repr_data->struct_size > 0 ? repr_data->struct_size : 1); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cppstruct + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "cloning a CPPStruct is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CPPStruct representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CPPStruct: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CPPSTRUCT_ATTR_SHIFT; if (type == MVM_CPPSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CPPStruct can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ void *cobj = get_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CPPSTRUCT_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CPPSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CUNION) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CPPStruct: invalid kind in attribute get"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CPPStruct: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_MASK; if (type == MVM_CPPSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CPPStruct can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CPPSTRUCT_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CPPSTRUCT_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CPPStruct"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CPPSTRUCT_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CPPStruct"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CPPSTRUCT_ATTR_CPPSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Can only store CPPStruct attribute in CPPStruct slot in CPPStruct"); cobj = ((MVMCPPStruct *)value)->body.cppstruct; } else if (type == MVM_CPPSTRUCT_ATTR_CUNION) { if (REPR(value)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Can only store CUnion attribute in CUnion slot in CPPStruct"); cobj = ((MVMCUnion *)value)->body.cunion; } else if (type == MVM_CPPSTRUCT_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CPPStruct"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CPPSTRUCT_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CPPStruct: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *) st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCPPStructNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVM_free(repr_data->name_to_index_mapping); MVM_free(repr_data->attribute_locations); MVM_free(repr_data->struct_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->member_types); MVM_free(repr_data->initialize_slots); } MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCPPStructBody *body = (MVMCPPStructBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cppstruct) MVM_free(body->cppstruct);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_varint(tc, writer, repr_data->struct_size); MVM_serialization_write_varint(tc, writer, repr_data->num_attributes); MVM_serialization_write_varint(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_varint(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_varint(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_varint(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_varint(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_varint(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_varint(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *) MVM_malloc(sizeof(MVMCPPStructREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_varint(tc, reader); repr_data->num_attributes = MVM_serialization_read_varint(tc, reader); repr_data->num_child_objs = MVM_serialization_read_varint(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_varint(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_varint(tc, reader); if(MVM_serialization_read_varint(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_varint(tc, reader); repr_data->name_to_index_mapping = (MVMCPPStructNameMap *)MVM_malloc(sizeof(MVMCPPStructNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_varint(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_varint(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCPPStruct); } /* Initializes the representation. */ const MVMREPROps * MVMCPPStruct_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CPPStruct", /* name */ MVM_REPR_ID_MVMCPPStruct, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CPPStruct.h0000644000175000017500000000620612576610375017200 0ustar jnthnjnthn/* Attribute location flags. */ #define MVM_CPPSTRUCT_ATTR_IN_STRUCT 0 #define MVM_CPPSTRUCT_ATTR_CSTRUCT 1 #define MVM_CPPSTRUCT_ATTR_CARRAY 2 #define MVM_CPPSTRUCT_ATTR_CPTR 3 #define MVM_CPPSTRUCT_ATTR_STRING 4 #define MVM_CPPSTRUCT_ATTR_CPPSTRUCT 5 #define MVM_CPPSTRUCT_ATTR_CUNION 6 #define MVM_CPPSTRUCT_ATTR_MASK 7 #define MVM_CPPSTRUCT_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CPPSTRUCT_ATTR_*. */ #define MVM_CPPSTRUCT_ATTR_SHIFT 4 /* The CPPStruct representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CPPStruct REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCPPStructBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cppstruct; }; struct MVMCPPStruct { MVMObject common; MVMCPPStructBody body; }; /* This is used in the name to class mapping. */ struct MVMCPPStructNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CPPStruct REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCPPStructREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCPPStructNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CPPStruct REPR. */ const MVMREPROps * MVMCPPStruct_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/CPointer.c0000644000175000017500000000637012554473060017063 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCPointer); }); return st->WHAT; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCPointerBody *src_body = (MVMCPointerBody *)src; MVMCPointerBody *dest_body = (MVMCPointerBody *)dest; dest_body->ptr = src_body->ptr; } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 body->ptr = (void *)(MVMint32)value; #else body->ptr = (void *)value; #endif } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 return (MVMint64)(MVMint32)body->ptr; #else return (MVMint64)body->ptr; #endif } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCPointer); } /* Initializes the representation. */ const MVMREPROps * MVMCPointer_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "CPointer", /* name */ MVM_REPR_ID_MVMCPointer, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CPointer.h0000644000175000017500000000037712456307241017067 0ustar jnthnjnthn/* Representation for C Pointer. */ struct MVMCPointerBody { void *ptr; }; struct MVMCPointer { MVMObject common; MVMCPointerBody body; }; /* Initializes the CPointer REPR. */ const MVMREPROps * MVMCPointer_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/CStr.c0000644000175000017500000000677012456307241016215 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCStr); }); return st->WHAT; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* TODO: move encoding stuff into here */ } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCPointerBody *src_body = (MVMCPointerBody *)src; MVMCPointerBody *dest_body = (MVMCPointerBody *)dest; dest_body->ptr = src_body->ptr; } static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVMCStrBody *body = (MVMCStrBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->orig, value); body->cstr = MVM_string_utf8_encode_C_string(tc, value); } static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCStrBody *body = (MVMCStrBody *)data; return body->orig; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_STR, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_STR, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCStrBody *body = (MVMCStrBody *)data; MVM_gc_worklist_add(tc, worklist, &body->orig); } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCStr *cstr = (MVMCStr *)obj; if (obj && cstr->body.cstr) MVM_free(cstr->body.cstr); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCStr); } /* Initializes the representation. */ const MVMREPROps * MVMCStr_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, set_str, get_str, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "CStr", /* name */ MVM_REPR_ID_MVMCStr, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CStr.h0000644000175000017500000000040212456307241016204 0ustar jnthnjnthn/* Representation for C Str. */ struct MVMCStrBody { MVMString *orig; char *cstr; }; struct MVMCStr { MVMObject common; MVMCStrBody body; }; /* Initializes the CStr REPR. */ const MVMREPROps * MVMCStr_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/CStruct.c0000644000175000017500000011064612623370227016727 0ustar jnthnjnthn#include "moar.h" #include /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCStructREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCStructNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter); attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map); } while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } if (attr_map) { MVM_gc_root_temp_pop_n(tc, 2); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CStruct representation does not support multiple inheritance"); } } MVM_gc_root_temp_pop_n(tc, 4); /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCStructNameMap *) MVM_malloc(sizeof(MVMCStructNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMObject *repr_info, MVMCStructREPRData *repr_data) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* We track the size of the struct, which is what we'll want offsets into. */ MVMint32 cur_size = 0; /* The structure itself will be the multiple of its biggest element in size. * So we keep track of that biggest element. */ MVMint32 multiple_of = 1; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs == 0 ? 1 : num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_IN_STRUCT; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_STRING; repr_data->member_types[i] = type; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CARRAY; repr_data->member_types[i] = type; } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CPPSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CUNION; repr_data->member_types[i] = type; if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CPTR; repr_data->member_types[i] = type; } else { MVM_exception_throw_adhoc(tc, "CStruct representation only handles int, num, CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CStruct representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CStruct only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } /* Do allocation. */ /* C structure needs careful alignment. If cur_size is not aligned * to align bytes (cur_size % align), make sure it is before we * add the next element. */ if (cur_size % align) { cur_size += align - cur_size % align; } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = cur_size; cur_size += bits / 8; if (bits / 8 > multiple_of) multiple_of = bits / 8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ if (multiple_of > sizeof(void *)) multiple_of = sizeof(void *); repr_data->struct_size = ceil((double)cur_size / (double)multiple_of) * multiple_of; if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCStructREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCStructNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCStruct); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCStructREPRData *repr_data = MVM_calloc(1, sizeof(MVMCStructREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); compute_allocation_strategy(tc, attr_info, repr_data); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCStructREPRData * repr_data = (MVMCStructREPRData *)st->REPR_data; /* Allocate object body. */ MVMCStructBody *body = (MVMCStructBody *)data; body->cstruct = MVM_calloc(1, repr_data->struct_size > 0 ? repr_data->struct_size : 1); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cstruct + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "cloning a CStruct is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CStruct representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CStruct: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CSTRUCT_ATTR_SHIFT; if (type == MVM_CSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CStruct can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ void *cobj = get_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CSTRUCT_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CPPSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CUNION) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CStruct: invalid kind in attribute get"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CStruct: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_MASK; if (type == MVM_CSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CStruct can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CSTRUCT_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CSTRUCT_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CStruct"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CSTRUCT_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CStruct"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CSTRUCT_ATTR_CPPSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Can only store CPPStruct attribute in CPPStruct slot in CStruct"); cobj = ((MVMCPPStruct *)value)->body.cppstruct; } else if (type == MVM_CSTRUCT_ATTR_CUNION) { if (REPR(value)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Can only store CUnion attribute in CUnion slot in CStruct"); cobj = ((MVMCUnion *)value)->body.cunion; } else if (type == MVM_CSTRUCT_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CStruct"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CSTRUCT_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CStruct: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *) st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCStructNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVM_free(repr_data->name_to_index_mapping); MVM_free(repr_data->attribute_locations); MVM_free(repr_data->struct_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->member_types); MVM_free(repr_data->initialize_slots); } MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCStructBody *body = (MVMCStructBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cstruct) MVM_free(body->cstruct);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_varint(tc, writer, repr_data->struct_size); MVM_serialization_write_varint(tc, writer, repr_data->num_attributes); MVM_serialization_write_varint(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_varint(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_varint(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_varint(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_varint(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_varint(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_varint(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *) MVM_malloc(sizeof(MVMCStructREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_varint(tc, reader); repr_data->num_attributes = MVM_serialization_read_varint(tc, reader); repr_data->num_child_objs = MVM_serialization_read_varint(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_varint(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_varint(tc, reader); if(MVM_serialization_read_varint(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_varint(tc, reader); repr_data->name_to_index_mapping = (MVMCStructNameMap *)MVM_malloc(sizeof(MVMCStructNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_varint(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_varint(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCStruct); } /* Initializes the representation. */ const MVMREPROps * MVMCStruct_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CStruct", /* name */ MVM_REPR_ID_MVMCStruct, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CStruct.h0000644000175000017500000000613012576610375016734 0ustar jnthnjnthn/* Attribute location flags. */ #define MVM_CSTRUCT_ATTR_IN_STRUCT 0 #define MVM_CSTRUCT_ATTR_CSTRUCT 1 #define MVM_CSTRUCT_ATTR_CARRAY 2 #define MVM_CSTRUCT_ATTR_CPTR 3 #define MVM_CSTRUCT_ATTR_STRING 4 #define MVM_CSTRUCT_ATTR_CUNION 5 #define MVM_CSTRUCT_ATTR_CPPSTRUCT 6 #define MVM_CSTRUCT_ATTR_MASK 7 #define MVM_CSTRUCT_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CSTRUCT_ATTR_*. */ #define MVM_CSTRUCT_ATTR_SHIFT 4 /* The CStruct representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CStruct REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCStructBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cstruct; }; struct MVMCStruct { MVMObject common; MVMCStructBody body; }; /* This is used in the name to class mapping. */ struct MVMCStructNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CStruct REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCStructREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCStructNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CStruct REPR. */ const MVMREPROps * MVMCStruct_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/CUnion.c0000644000175000017500000010677612623370227016544 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCUnionREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCUnionNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter); attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map); } while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } if (attr_map) { MVM_gc_root_temp_pop_n(tc, 2); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CUnion representation does not support multiple inheritance"); } } MVM_gc_root_temp_pop_n(tc, 4); /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCUnionNameMap *) MVM_malloc(sizeof(MVMCUnionNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMObject *repr_info, MVMCUnionREPRData *repr_data) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* The structure itself will as big as the biggest element. * So we keep track of that biggest element. */ MVMint32 total_size = 0; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs == 0 ? 1 : num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_str_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_IN_STRUCT; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_STRING; repr_data->member_types[i] = type; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CARRAY; repr_data->member_types[i] = type; } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CPPSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CUNION; repr_data->member_types[i] = type; if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CPTR; repr_data->member_types[i] = type; } else { MVM_exception_throw_adhoc(tc, "CUnion representation only handles int, num, CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CUnion representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CUnion only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = 0; if (bits / 8 > total_size) total_size = bits / 8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ repr_data->struct_size = total_size; if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading an int at the specified offset. */ static MVMint32 get_int_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((MVMint32 *)location); } /* Helper for writing an int at the specified offset. */ static void set_int_at_offset(void *data, MVMint32 offset, MVMint32 value) { void *location = (char *)data + offset; *((MVMint32 *)location) = value; } /* Helper for reading a num at the specified offset. */ static MVMnum32 get_num_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((MVMnum32 *)location); } /* Helper for writing a num at the specified offset. */ static void set_num_at_offset(void *data, MVMint32 offset, MVMnum32 value) { void *location = (char *)data + offset; *((MVMnum32 *)location) = value; } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCUnionREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCUnionNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCUnion); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCUnionREPRData *repr_data = MVM_calloc(1, sizeof(MVMCUnionREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); compute_allocation_strategy(tc, attr_info, repr_data); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCUnionREPRData * repr_data = (MVMCUnionREPRData *)st->REPR_data; /* Allocate object body. */ MVMCUnionBody *body = (MVMCUnionBody *)data; body->cunion = MVM_malloc(repr_data->struct_size > 0 ? repr_data->struct_size : 1); memset(body->cunion, 0, repr_data->struct_size); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cunion + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCUnionREPRData * repr_data = (MVMCUnionREPRData *) st->REPR_data; MVMCUnionBody *src_body = (MVMCUnionBody *)src; MVMCUnionBody *dest_body = (MVMCUnionBody *)dest; MVM_exception_throw_adhoc(tc, "cloning a CUnion is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CUnion representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CUnion: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CUNION_ATTR_SHIFT; if (type == MVM_CUNION_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CUnion can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ void *cobj = get_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CUNION_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_INLINED) obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CPPSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_INLINED) obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CUNION) { if (repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_INLINED) obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CUnion: invalid kind in attribute get"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CUnion: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_MASK; if (type == MVM_CUNION_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CUnion can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CUNION_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CUNION_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CUnion"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CUNION_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CUnion"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CUNION_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CUnion"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CUNION_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CUnion: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *) st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCUnionNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCUnionBody *body = (MVMCUnionBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cunion) MVM_free(body->cunion);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_varint(tc, writer, repr_data->struct_size); MVM_serialization_write_varint(tc, writer, repr_data->num_attributes); MVM_serialization_write_varint(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_varint(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_varint(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_varint(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_varint(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_varint(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_varint(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *) MVM_malloc(sizeof(MVMCUnionREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_varint(tc, reader); repr_data->num_attributes = MVM_serialization_read_varint(tc, reader); repr_data->num_child_objs = MVM_serialization_read_varint(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_varint(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_varint(tc, reader); if(MVM_serialization_read_varint(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_varint(tc, reader); repr_data->name_to_index_mapping = (MVMCUnionNameMap *)MVM_malloc(sizeof(MVMCUnionNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_varint(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_varint(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCUnion); } /* Initializes the representation. */ const MVMREPROps * MVMCUnion_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CUnion", /* name */ MVM_REPR_ID_MVMCUnion, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/CUnion.h0000644000175000017500000000610112576610375016536 0ustar jnthnjnthn/* Attribute location flags. */ #define MVM_CUNION_ATTR_IN_STRUCT 0 #define MVM_CUNION_ATTR_CSTRUCT 1 #define MVM_CUNION_ATTR_CARRAY 2 #define MVM_CUNION_ATTR_CPTR 3 #define MVM_CUNION_ATTR_STRING 4 #define MVM_CUNION_ATTR_CUNION 5 #define MVM_CUNION_ATTR_CPPSTRUCT 6 #define MVM_CUNION_ATTR_MASK 7 #define MVM_CUNION_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CUNION_ATTR_*. */ #define MVM_CUNION_ATTR_SHIFT 4 /* The CUnion representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CUnion REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCUnionBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cunion; }; struct MVMCUnion { MVMObject common; MVMCUnionBody body; }; /* This is used in the name to class mapping. */ struct MVMCUnionNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CUnion REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCUnionREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCUnionNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CUnion REPR. */ const MVMREPROps * MVMCUnion_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/ConcBlockingQueue.c0000644000175000017500000002142412554473060020675 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMConcBlockingQueue); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; /* Initialize locks. */ int init_stat; cbq->locks = MVM_calloc(1, sizeof(MVMConcBlockingQueueLocks)); if ((init_stat = uv_mutex_init(&cbq->locks->head_lock)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); if ((init_stat = uv_mutex_init(&cbq->locks->tail_lock)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); if ((init_stat = uv_cond_init(&cbq->locks->head_cond)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize condition variable: %s", uv_strerror(init_stat)); /* Head and tail point to a null node. */ cbq->tail = cbq->head = MVM_calloc(1, sizeof(MVMConcBlockingQueueNode)); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ConcBlockingQueue"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { /* At this point we know the world is stopped, and thus we can safely do a * traversal of the data structure without needing locks. */ MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *cur = cbq->head; while (cur) { MVM_gc_worklist_add(tc, worklist, &cur->value); cur = cur->next; } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMConcBlockingQueue *cbq = (MVMConcBlockingQueue *)obj; /* First, free all the nodes. */ MVMConcBlockingQueueNode *cur = cbq->body.head; while (cur) { MVMConcBlockingQueueNode *next = cur->next; MVM_free(cur); cur = next; } cbq->body.head = cbq->body.tail = NULL; /* Clean up locks. */ uv_mutex_destroy(&cbq->body.locks->head_lock); uv_mutex_destroy(&cbq->body.locks->tail_lock); uv_cond_destroy(&cbq->body.locks->head_cond); MVM_free(cbq->body.locks); cbq->body.locks = NULL; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; if (index != 0) MVM_exception_throw_adhoc(tc, "Can only request (peek) head of a concurrent blocking queue"); if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only get objects from a concurrent blocking queue"); if (MVM_load(&cbq->elems) > 0) { MVMConcBlockingQueueNode *peeked; uv_mutex_lock(&cbq->locks->head_lock); peeked = cbq->head->next; value->o = peeked ? peeked->value : tc->instance->VMNull; uv_mutex_unlock(&cbq->locks->head_lock); } else { value->o = tc->instance->VMNull; } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; return MVM_load(cbq->elems); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *add; AO_t orig_elems; if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only push objects to a concurrent blocking queue"); if (value.o == NULL) MVM_exception_throw_adhoc(tc, "Cannot store a null value in a concurrent blocking queue"); add = MVM_calloc(1, sizeof(MVMConcBlockingQueueNode)); MVM_ASSIGN_REF(tc, &(root->header), add->value, value.o); uv_mutex_lock(&cbq->locks->tail_lock); cbq->tail->next = add; cbq->tail = add; orig_elems = MVM_incr(&cbq->elems); uv_mutex_unlock(&cbq->locks->tail_lock); if (orig_elems == 0) { uv_mutex_lock(&cbq->locks->head_lock); uv_cond_signal(&cbq->locks->head_cond); uv_mutex_unlock(&cbq->locks->head_lock); } } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *taken; if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only shift objects from a ConcBlockingQueue"); uv_mutex_lock(&cbq->locks->head_lock); while (MVM_load(&cbq->elems) == 0) { MVMROOT(tc, root, { MVM_gc_mark_thread_blocked(tc); uv_cond_wait(&cbq->locks->head_cond, &cbq->locks->head_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; }); } taken = cbq->head->next; MVM_free(cbq->head); cbq->head = taken; MVM_barrier(); value->o = taken->value; taken->value = NULL; MVM_barrier(); if (MVM_decr(&cbq->elems) > 1) uv_cond_signal(&cbq->locks->head_cond); uv_mutex_unlock(&cbq->locks->head_lock); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMConcBlockingQueue); } /* Initializes the representation. */ const MVMREPROps * MVMConcBlockingQueue_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, MVM_REPR_DEFAULT_BIND_POS, MVM_REPR_DEFAULT_SET_ELEMS, push, MVM_REPR_DEFAULT_POP, MVM_REPR_DEFAULT_UNSHIFT, shift, MVM_REPR_DEFAULT_SPLICE, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ConcBlockingQueue", /* name */ MVM_REPR_ID_ConcBlockingQueue, 0, /* refs_frames */ }; /* Polls a queue for a value, returning NULL if none is available. */ MVMObject * MVM_concblockingqueue_poll(MVMThreadContext *tc, MVMConcBlockingQueue *queue) { MVMConcBlockingQueue *cbq = (MVMConcBlockingQueue *)queue; MVMConcBlockingQueueNode *taken; MVMObject *result = tc->instance->VMNull; uv_mutex_lock(&cbq->body.locks->head_lock); if (MVM_load(&cbq->body.elems) > 0) { taken = cbq->body.head->next; MVM_free(cbq->body.head); cbq->body.head = taken; MVM_barrier(); result = taken->value; taken->value = NULL; MVM_barrier(); if (MVM_decr(&cbq->body.elems) > 1) uv_cond_signal(&cbq->body.locks->head_cond); } uv_mutex_unlock(&cbq->body.locks->head_lock); return result; } MoarVM-2015.11/src/6model/reprs/ConcBlockingQueue.h0000644000175000017500000000230312456307241020673 0ustar jnthnjnthn/* A single node in the concurrent blocking queue. */ struct MVMConcBlockingQueueNode { MVMObject *value; MVMConcBlockingQueueNode *next; }; /* Memory used for mutexes and cond vars; these can't live in the object body * directly as they are sensitive to being moved, but putting them together in * a single struct means we can malloc a single bit of memory to hold them. */ struct MVMConcBlockingQueueLocks { uv_mutex_t head_lock; uv_mutex_t tail_lock; uv_cond_t head_cond; }; /* Representation used for concurrent blocking queue. */ struct MVMConcBlockingQueueBody { /* Head and tail of the queue. */ MVMConcBlockingQueueNode *head; MVMConcBlockingQueueNode *tail; /* Number of elements currently in the queue. */ AO_t elems; /* Locks and condition variables storage. */ MVMConcBlockingQueueLocks *locks; }; struct MVMConcBlockingQueue { MVMObject common; MVMConcBlockingQueueBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMConcBlockingQueue_initialize(MVMThreadContext *tc); /* Operations on concurrent blocking queues. */ MVMObject * MVM_concblockingqueue_poll(MVMThreadContext *tc, MVMConcBlockingQueue *queue); MoarVM-2015.11/src/6model/reprs/ConditionVariable.c0000644000175000017500000001222212456307241020723 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMConditionVariable); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ConditionVariable"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMConditionVariableBody *cv = (MVMConditionVariableBody *)data; MVM_gc_worklist_add(tc, worklist, &cv->mutex); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMConditionVariable *cv = (MVMConditionVariable *)obj; if (cv->body.condvar) { uv_cond_destroy(cv->body.condvar); MVM_free(cv->body.condvar); cv->body.condvar = NULL; } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMConditionVariable); } /* Initializes the representation. */ const MVMREPROps * MVMConditionVariable_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ConditionVariable", /* name */ MVM_REPR_ID_ConditionVariable, 0, /* refs_frames */ }; /* Given a reentrant mutex, produces an associated condition variable. */ MVMObject * MVM_conditionvariable_from_lock(MVMThreadContext *tc, MVMReentrantMutex *lock, MVMObject *type) { MVMConditionVariable *cv; int init_stat; if (REPR(type)->ID != MVM_REPR_ID_ConditionVariable) MVM_exception_throw_adhoc(tc, "Condition variable must have ConditionVariable REPR"); MVMROOT(tc, lock, { cv = (MVMConditionVariable *)MVM_gc_allocate_object(tc, STABLE(type)); }); cv->body.condvar = MVM_malloc(sizeof(uv_cond_t)); if ((init_stat = uv_cond_init(cv->body.condvar)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize condition variable: %s", uv_strerror(init_stat)); MVM_ASSIGN_REF(tc, &(cv->common.header), cv->body.mutex, (MVMObject *)lock); return (MVMObject *)cv; } /* Adds the current thread to the queue of waiters on the condition variable, * releasing, waiting, and then re-acquiring the lock. */ void MVM_conditionvariable_wait(MVMThreadContext *tc, MVMConditionVariable *cv) { MVMReentrantMutex *rm = (MVMReentrantMutex *)cv->body.mutex; AO_t orig_rec_level; if (MVM_load(&rm->body.holder_id) != tc->thread_id) MVM_exception_throw_adhoc(tc, "Can only wait on a condition variable when holding mutex"); orig_rec_level = MVM_load(&rm->body.lock_count); MVM_store(&rm->body.holder_id, 0); MVM_store(&rm->body.lock_count, 0); MVMROOT(tc, rm, { MVM_gc_mark_thread_blocked(tc); uv_cond_wait(cv->body.condvar, rm->body.mutex); MVM_gc_mark_thread_unblocked(tc); }); MVM_store(&rm->body.holder_id, tc->thread_id); MVM_store(&rm->body.lock_count, orig_rec_level); } /* Signals one thread waiting on the condition. */ void MVM_conditionvariable_signal_one(MVMThreadContext *tc, MVMConditionVariable *cv) { uv_cond_signal(cv->body.condvar); } /* Signals all threads waiting on the condition. */ void MVM_conditionvariable_signal_all(MVMThreadContext *tc, MVMConditionVariable *cv) { uv_cond_broadcast(cv->body.condvar); } MoarVM-2015.11/src/6model/reprs/ConditionVariable.h0000644000175000017500000000166212456307241020736 0ustar jnthnjnthn/* Representation used for condition variables. */ struct MVMConditionVariableBody { /* The ReentrantMutex this condition variable is associated with. */ MVMObject *mutex; /* The condition variable itself, held at a level of indirection to keep * OSes that wouldn't like it moving around happy. */ uv_cond_t *condvar; }; struct MVMConditionVariable { MVMObject common; MVMConditionVariableBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMConditionVariable_initialize(MVMThreadContext *tc); /* Operations on a condition variable. */ MVMObject * MVM_conditionvariable_from_lock(MVMThreadContext *tc, MVMReentrantMutex *lock, MVMObject *type); void MVM_conditionvariable_wait(MVMThreadContext *tc, MVMConditionVariable *cv); void MVM_conditionvariable_signal_one(MVMThreadContext *tc, MVMConditionVariable *cv); void MVM_conditionvariable_signal_all(MVMThreadContext *tc, MVMConditionVariable *cv); MoarVM-2015.11/src/6model/reprs/HashAttrStore.c0000644000175000017500000001465312521400150020056 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMHashAttrStore); }); return st->WHAT; } static void extract_key(MVMThreadContext *tc, void **kdata, size_t *klen, MVMObject *key) { MVM_HASH_EXTRACT_KEY(tc, kdata, klen, key, "HashAttrStore representation requires MVMString keys") } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMHashAttrStoreBody *src_body = (MVMHashAttrStoreBody *)src; MVMHashAttrStoreBody *dest_body = (MVMHashAttrStoreBody *)dest; MVMHashEntry *current, *tmp; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->hash_head, current, tmp, bucket_tmp) { size_t klen; void *kdata; MVMHashEntry *new_entry = MVM_malloc(sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->key, current->key); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->value, current->value); extract_key(tc, &kdata, &klen, new_entry->key); HASH_ADD_KEYPTR(hash_handle, dest_body->hash_head, kdata, klen, new_entry); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->key); MVM_gc_worklist_add(tc, worklist, ¤t->value); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMHashAttrStore *h = (MVMHashAttrStore *)obj; MVM_HASH_DESTROY(hash_handle, MVMHashEntry, h->body.hash_head); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; if (kind == MVM_reg_obj) { extract_key(tc, &kdata, &klen, (MVMObject *)name); HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); result_reg->o = entry != NULL ? entry->value : tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "HashAttrStore representation does not support native attribute storage"); } } static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; if (kind == MVM_reg_obj) { extract_key(tc, &kdata, &klen, (MVMObject *)name); /* first check whether we must update the old entry. */ HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); if (!entry) { entry = MVM_malloc(sizeof(MVMHashEntry)); HASH_ADD_KEYPTR(hash_handle, body->hash_head, kdata, klen, entry); } else entry->hash_handle.key = (void *)kdata; MVM_ASSIGN_REF(tc, &(root->header), entry->key, (MVMObject *)name); MVM_ASSIGN_REF(tc, &(root->header), entry->value, value_reg.o); } else { MVM_exception_throw_adhoc(tc, "HashAttrStore representation does not support native attribute storage"); } } static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; extract_key(tc, &kdata, &klen, (MVMObject *)name); HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); return entry != NULL; } static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMHashAttrStore); } /* Initializes the representation. */ const MVMREPROps * MVMHashAttrStore_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "HashAttrStore", /* name */ MVM_REPR_ID_HashAttrStore, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/HashAttrStore.h0000644000175000017500000000063012456307241020067 0ustar jnthnjnthn/* Representation used by HashAttrStore. */ struct MVMHashAttrStoreBody { /* The head of the hash, or null if the hash is empty. * The UT_HASH macros update this pointer directly. */ MVMHashEntry *hash_head; }; struct MVMHashAttrStore { MVMObject common; MVMHashAttrStoreBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMHashAttrStore_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/KnowHOWAttributeREPR.c0000644000175000017500000000737012456307241021210 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMKnowHOWAttributeREPR); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMKnowHOWAttributeREPRBody *src_body = (MVMKnowHOWAttributeREPRBody *)src; MVMKnowHOWAttributeREPRBody *dest_body = (MVMKnowHOWAttributeREPRBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->type, src_body->type); dest_body->box_target = src_body->box_target; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_gc_worklist_add(tc, worklist, &body->name); MVM_gc_worklist_add(tc, worklist, &body->type); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMKnowHOWAttributeREPR); } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_serialization_write_str(tc, writer, body->name); } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->name, MVM_serialization_read_str(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->type, tc->instance->KnowHOW); } /* Initializes the representation. */ const MVMREPROps * MVMKnowHOWAttributeREPR_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "KnowHOWAttributeREPR", /* name */ MVM_REPR_ID_KnowHOWAttributeREPR, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/KnowHOWAttributeREPR.h0000644000175000017500000000075312456307241021213 0ustar jnthnjnthn/* Representation used for bootstrapping attributes. */ struct MVMKnowHOWAttributeREPRBody { /* The attribute's name. */ MVMString *name; /* The attribute's type. */ MVMObject *type; /* Whether the attribute serves as a box target. */ MVMuint32 box_target; }; struct MVMKnowHOWAttributeREPR { MVMObject common; MVMKnowHOWAttributeREPRBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMKnowHOWAttributeREPR_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/KnowHOWREPR.c0000644000175000017500000001130712456307241017317 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMKnowHOWREPR); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMObject *methods, *attributes, *BOOTArray; MVMObject * const BOOTHash = tc->instance->boot_types.BOOTHash; MVM_gc_root_temp_push(tc, (MVMCollectable **)&root); methods = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&methods); MVM_ASSIGN_REF(tc, &(root->header), ((MVMKnowHOWREPR *)root)->body.methods, methods); BOOTArray = tc->instance->boot_types.BOOTArray; attributes = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), ((MVMKnowHOWREPR *)root)->body.attributes, attributes); MVM_gc_root_temp_pop_n(tc, 2); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMKnowHOWREPRBody *src_body = (MVMKnowHOWREPRBody *)src; MVMKnowHOWREPRBody *dest_body = (MVMKnowHOWREPRBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->methods, src_body->methods); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->attributes, src_body->attributes); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_gc_worklist_add(tc, worklist, &body->methods); MVM_gc_worklist_add(tc, worklist, &body->attributes); MVM_gc_worklist_add(tc, worklist, &body->name); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMKnowHOWREPR); } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_serialization_write_str(tc, writer, body->name); MVM_serialization_write_ref(tc, writer, body->attributes); MVM_serialization_write_ref(tc, writer, body->methods); } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->name, MVM_serialization_read_str(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->attributes, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->methods, MVM_serialization_read_ref(tc, reader)); } /* Initializes the representation. */ const MVMREPROps * MVMKnowHOWREPR_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "KnowHOWREPR", /* name */ MVM_REPR_ID_KnowHOWREPR, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/KnowHOWREPR.h0000644000175000017500000000070112456307241017320 0ustar jnthnjnthn/* Representation used for bootstrapping the KnowHOW type. */ struct MVMKnowHOWREPRBody { /* Methods table; a hash. */ MVMObject *methods; /* Array of attribute meta-objects. */ MVMObject *attributes; /* Name of the type. */ MVMString *name; }; struct MVMKnowHOWREPR { MVMObject common; MVMKnowHOWREPRBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMKnowHOWREPR_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/Lexotic.c0000644000175000017500000000716312456307241016746 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { if (IS_CONCRETE(invokee)) { /* Get argument and set as result. Need to root invokee, as argument * processing may box. */ MVMROOT(tc, invokee, { MVMObject *result; MVMArgProcContext arg_ctx; arg_ctx.named_used = NULL; MVM_args_proc_init(tc, &arg_ctx, callsite, args); result = MVM_args_get_pos_obj(tc, &arg_ctx, 0, MVM_ARG_REQUIRED).arg.o; MVM_ASSIGN_REF(tc, &(invokee->header), ((MVMLexotic *)invokee)->body.result, result); MVM_args_proc_cleanup(tc, &arg_ctx); }); /* Unwind to the lexotic handler. */ { MVMLexotic *lex = (MVMLexotic *)invokee; MVM_exception_gotolexotic(tc, lex->body.handler_idx, lex->body.sf); } } else { MVM_exception_throw_adhoc(tc, "Cannot invoke Lexotic type object"); } } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMLexotic); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation Lexotic"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMLexoticBody *lb = (MVMLexoticBody *)data; MVM_gc_worklist_add(tc, worklist, &lb->sf); MVM_gc_worklist_add(tc, worklist, &lb->result); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMLexotic_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Lexotic", /* name */ MVM_REPR_ID_Lexotic, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/Lexotic.h0000644000175000017500000000072412456307241016747 0ustar jnthnjnthn/* Lexotics are involved in the implementation of control structures such as * return. */ struct MVMLexoticBody { /* The target frame type. */ MVMStaticFrame *sf; /* The result object. */ MVMObject *result; /* Index of the frame handler to use. */ MVMint32 handler_idx; }; struct MVMLexotic { MVMObject common; MVMLexoticBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMLexotic_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMArray.c0000644000175000017500000014226112573775575017017 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMArrayREPRData *repr_data = (MVMArrayREPRData *)MVM_malloc(sizeof(MVMArrayREPRData)); repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); repr_data->elem_type = NULL; MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMArray); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. The result has the space * needed for the current number of elements, which may not be the * entire allocated slot size. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *src_body = (MVMArrayBody *)src; MVMArrayBody *dest_body = (MVMArrayBody *)dest; dest_body->elems = src_body->elems; dest_body->ssize = src_body->elems; dest_body->start = 0; if (dest_body->elems > 0) { size_t mem_size = dest_body->ssize * repr_data->elem_size; size_t start_pos = src_body->start * repr_data->elem_size; char *copy_start = ((char *)src_body->slots.any) + start_pos; dest_body->slots.any = MVM_malloc(mem_size); memcpy(dest_body->slots.any, copy_start, mem_size); } else { dest_body->slots.any = NULL; } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMuint64 elems = body->elems; MVMuint64 start = body->start; MVMuint64 i = 0; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: { MVMObject **slots = body->slots.o; slots += start; while (i < elems) { MVM_gc_worklist_add(tc, worklist, &slots[i]); i++; } break; } case MVM_ARRAY_STR: { MVMString **slots = body->slots.s; slots += start; while (i < elems) { MVM_gc_worklist_add(tc, worklist, &slots[i]); i++; } break; } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMArray *arr = (MVMArray *)obj; MVM_free(arr->body.slots.any); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; if (repr_data == NULL) return; MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* Handle negative indexes. */ if (index < 0) { index += body->elems; if (index < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Index out of bounds"); } /* Go by type. */ switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected object register"); if (index >= body->elems) { value->o = tc->instance->VMNull; } else { MVMObject *found = body->slots.o[body->start + index]; value->o = found ? found : tc->instance->VMNull; } break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected string register"); if (index >= body->elems) value->s = NULL; else value->s = body->slots.s[body->start + index]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i64[body->start + index]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i32[body->start + index]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i16[body->start + index]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i8[body->start + index]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected num register"); if (index >= body->elems) value->n64 = 0.0; else value->n64 = (MVMnum64)body->slots.n64[body->start + index]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected num register"); if (index >= body->elems) value->n64 = 0.0; else value->n64 = (MVMnum64)body->slots.n32[body->start + index]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u64[body->start + index]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u32[body->start + index]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u16[body->start + index]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u8[body->start + index]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } static MVMuint64 zero_slots(MVMThreadContext *tc, MVMArrayBody *body, MVMuint64 elems, MVMuint64 ssize, MVMuint8 slot_type) { switch (slot_type) { case MVM_ARRAY_OBJ: while (elems < ssize) body->slots.o[elems++] = NULL; break; case MVM_ARRAY_STR: while (elems < ssize) body->slots.s[elems++] = NULL; break; case MVM_ARRAY_I64: while (elems < ssize) body->slots.i64[elems++] = 0; break; case MVM_ARRAY_I32: while (elems < ssize) body->slots.i32[elems++] = 0; break; case MVM_ARRAY_I16: while (elems < ssize) body->slots.i16[elems++] = 0; break; case MVM_ARRAY_I8: while (elems < ssize) body->slots.i8[elems++] = 0; break; case MVM_ARRAY_N64: while (elems < ssize) body->slots.n64[elems++] = 0.0; break; case MVM_ARRAY_N32: while (elems < ssize) body->slots.n32[elems++] = 0.0; break; case MVM_ARRAY_U64: while (elems < ssize) body->slots.u64[elems++] = 0; break; case MVM_ARRAY_U32: while (elems < ssize) body->slots.u32[elems++] = 0; break; case MVM_ARRAY_U16: while (elems < ssize) body->slots.u16[elems++] = 0; break; case MVM_ARRAY_U8: while (elems < ssize) body->slots.u8[elems++] = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } return elems; } static void set_size_internal(MVMThreadContext *tc, MVMArrayBody *body, MVMint64 n, MVMArrayREPRData *repr_data) { MVMuint64 elems = body->elems; MVMuint64 start = body->start; MVMuint64 ssize = body->ssize; void *slots = body->slots.any; if (n < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Can't resize to negative elements"); if (n == elems) return; /* if there aren't enough slots at the end, shift off empty slots * from the beginning first */ if (start > 0 && n + start > ssize) { if (elems > 0) memmove(slots, (char *)slots + start * repr_data->elem_size, elems * repr_data->elem_size); body->start = 0; /* fill out any unused slots with NULL pointers or zero values */ elems = zero_slots(tc, body, elems, ssize, repr_data->slot_type); } body->elems = n; if (n <= ssize) { /* we already have n slots available, we can just return */ return; } /* We need more slots. If the current slot size is less * than 8K, use the larger of twice the current slot size * or the actual number of elements needed. Otherwise, * grow the slots to the next multiple of 4096 (0x1000). */ if (ssize < 8192) { ssize *= 2; if (n > ssize) ssize = n; if (ssize < 8) ssize = 8; } else { ssize = (n + 0x1000) & ~0xfff; } /* now allocate the new slot buffer */ slots = (slots) ? MVM_realloc(slots, ssize * repr_data->elem_size) : MVM_malloc(ssize * repr_data->elem_size); /* fill out any unused slots with NULL pointers or zero values */ body->slots.any = slots; zero_slots(tc, body, elems, ssize, repr_data->slot_type); body->ssize = ssize; } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* Handle negative indexes and resizing if needed. */ if (index < 0) { index += body->elems; if (index < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Index out of bounds"); } else if (index >= body->elems) set_size_internal(tc, body, index + 1, repr_data); /* Go by type. */ switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start + index], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start + index], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i64[body->start + index] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i32[body->start + index] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i16[body->start + index] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i8[body->start + index] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected num register"); body->slots.n64[body->start + index] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected num register"); body->slots.n32[body->start + index] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u64[body->start + index] = value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u32[body->start + index] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u16[body->start + index] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u8[body->start + index] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMArrayBody *body = (MVMArrayBody *)data; return body->elems; } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; set_size_internal(tc, body, count, repr_data); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMArrayBody *body = (MVMArrayBody *)data; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; set_size_internal(tc, body, body->elems + 1, repr_data); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: push expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start + body->elems - 1], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: push expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start + body->elems - 1], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i64[body->start + body->elems - 1] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i32[body->start + body->elems - 1] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i16[body->start + body->elems - 1] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i8[body->start + body->elems - 1] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected num register"); body->slots.n64[body->start + body->elems - 1] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected num register"); body->slots.n32[body->start + body->elems - 1] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u64[body->start + body->elems - 1] = (MVMuint64)value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u32[body->start + body->elems - 1] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u16[body->start + body->elems - 1] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u8[body->start + body->elems - 1] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; if (body->elems < 1) MVM_exception_throw_adhoc(tc, "MVMArray: Can't pop from an empty array"); body->elems--; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected object register"); value->o = body->slots.o[body->start + body->elems]; break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected string register"); value->s = body->slots.s[body->start + body->elems]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i64[body->start + body->elems]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i32[body->start + body->elems]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i16[body->start + body->elems]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i8[body->start + body->elems]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected num register"); value->n64 = (MVMnum64)body->slots.n64[body->start + body->elems]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected num register"); value->n64 = (MVMnum64)body->slots.n32[body->start + body->elems]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u64[body->start + body->elems]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u32[body->start + body->elems]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u16[body->start + body->elems]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u8[body->start + body->elems]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* If we don't have room at the beginning of the slots, * make some room (8 slots) for unshifting */ if (body->start < 1) { MVMuint64 n = 8; MVMuint64 elems = body->elems; /* grow the array */ set_size_internal(tc, body, elems + n, repr_data); /* move elements and set start */ memmove( (char *)body->slots.any + n * repr_data->elem_size, body->slots.any, elems * repr_data->elem_size); body->start = n; body->elems = elems; /* clear out beginning elements */ zero_slots(tc, body, 0, n, repr_data->slot_type); } /* Now do the unshift */ body->start--; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i64[body->start] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i32[body->start] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i16[body->start] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i8[body->start] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected num register"); body->slots.n64[body->start] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected num register"); body->slots.n32[body->start] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u64[body->start] = (MVMuint64)value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u32[body->start] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u16[body->start] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u8[body->start] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } body->elems++; } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMArrayBody *body = (MVMArrayBody *)data; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; if (body->elems < 1) MVM_exception_throw_adhoc(tc, "MVMArray: Can't shift from an empty array"); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected object register"); value->o = body->slots.o[body->start]; break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected string register"); value->s = body->slots.s[body->start]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i64[body->start]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i32[body->start]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i16[body->start]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i8[body->start]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected num register"); value->n64 = (MVMnum64)body->slots.n64[body->start]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected num register"); value->n64 = (MVMnum64)body->slots.n32[body->start]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u64[body->start]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u32[body->start]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u16[body->start]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u8[body->start]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } body->start++; body->elems--; } /* This whole splice optimization can be optimized for the case we have two * MVMArray representation objects. */ static void asplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMint64 elems0 = body->elems; MVMint64 elems1 = REPR(from)->elems(tc, STABLE(from), from, OBJECT_BODY(from)); MVMint64 start; MVMint64 tail; /* start from end? */ if (offset < 0) { offset += elems0; if (offset < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Illegal splice offset"); } /* When offset == 0, then we may be able to reduce the memmove * calls and reallocs by adjusting SELF's start, elems0, and * count to better match the incoming splice. In particular, * we're seeking to adjust C to as close to C * as we can. */ if (offset == 0) { MVMint64 n = elems1 - count; start = body->start; if (n > start) n = start; if (n <= -elems0) { elems0 = 0; count = 0; body->start = 0; body->elems = elems0; } else if (n != 0) { elems0 += n; count += n; body->start = start - n; body->elems = elems0; } } /* if count == 0 and elems1 == 0, there's nothing left * to copy or remove, so the splice is done! */ if (count == 0 && elems1 == 0) return; /* number of elements to right of splice (the "tail") */ tail = elems0 - offset - count; if (tail < 0) tail = 0; else if (tail > 0 && count > elems1) { /* We're shrinking the array, so first move the tail left */ start = body->start; memmove( (char *)body->slots.any + (start + offset + elems1) * repr_data->elem_size, (char *)body->slots.any + (start + offset + count) * repr_data->elem_size, tail * repr_data->elem_size); } /* now resize the array */ set_size_internal(tc, body, offset + elems1 + tail, repr_data); start = body->start; if (tail > 0 && count < elems1) { /* The array grew, so move the tail to the right */ memmove( (char *)body->slots.any + (start + offset + elems1) * repr_data->elem_size, (char *)body->slots.any + (start + offset + count) * repr_data->elem_size, tail * repr_data->elem_size); } /* now copy C's elements into SELF */ if (elems1 > 0) { MVMint64 i; MVMuint16 kind; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: kind = MVM_reg_obj; break; case MVM_ARRAY_STR: kind = MVM_reg_str; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: kind = MVM_reg_int64; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: kind = MVM_reg_num64; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: kind = MVM_reg_int64; break; default: abort(); /* never reached, silence compiler warnings */ } for (i = 0; i < elems1; i++) { MVMRegister to_copy; REPR(from)->pos_funcs.at_pos(tc, STABLE(from), from, OBJECT_BODY(from), i, &to_copy, kind); bind_pos(tc, st, root, data, offset + i, to_copy, kind); } } } static void at_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *result, MVMuint16 kind) { if (num_indices != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only be indexed with a single dimension"); at_pos(tc, st, root, data, indices[0], result, kind); } static void bind_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { if (num_indices != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only be indexed with a single dimension"); bind_pos(tc, st, root, data, indices[0], value, kind); } static void dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { MVMArrayBody *body = (MVMArrayBody *)data; *num_dimensions = 1; *dimensions = (MVMint64 *) &(body->elems); } static void set_dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { if (num_dimensions != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only have a single dimension"); set_elems(tc, st, root, data, dimensions[0]); } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMStorageSpec spec; /* initialise storage spec to default values */ spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; switch (repr_data->slot_type) { case MVM_ARRAY_STR: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_STR; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_STR; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec.is_unsigned = 1; break; default: spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; break; } return spec; } /* Compose the representation. */ static void spec_to_repr_data(MVMThreadContext *tc, MVMArrayREPRData *repr_data, const MVMStorageSpec *spec) { switch (spec->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: if (spec->is_unsigned) { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_U64; repr_data->elem_size = sizeof(MVMuint64); break; case 32: repr_data->slot_type = MVM_ARRAY_U32; repr_data->elem_size = sizeof(MVMuint32); break; case 16: repr_data->slot_type = MVM_ARRAY_U16; repr_data->elem_size = sizeof(MVMuint16); break; case 8: repr_data->slot_type = MVM_ARRAY_U8; repr_data->elem_size = sizeof(MVMuint8); break; case 4: repr_data->slot_type = MVM_ARRAY_U4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_U2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_U1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported uint size"); } } else { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_I64; repr_data->elem_size = sizeof(MVMint64); break; case 32: repr_data->slot_type = MVM_ARRAY_I32; repr_data->elem_size = sizeof(MVMint32); break; case 16: repr_data->slot_type = MVM_ARRAY_I16; repr_data->elem_size = sizeof(MVMint16); break; case 8: repr_data->slot_type = MVM_ARRAY_I8; repr_data->elem_size = sizeof(MVMint8); break; case 4: repr_data->slot_type = MVM_ARRAY_I4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_I2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_I1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported int size"); } } break; case MVM_STORAGE_SPEC_BP_NUM: switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_N64; repr_data->elem_size = sizeof(MVMnum64); break; case 32: repr_data->slot_type = MVM_ARRAY_N32; repr_data->elem_size = sizeof(MVMnum32); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported num size"); } break; case MVM_STORAGE_SPEC_BP_STR: repr_data->slot_type = MVM_ARRAY_STR; repr_data->elem_size = sizeof(MVMString *); break; } } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts str_consts = tc->instance->str_consts; MVMArrayREPRData * const repr_data = (MVMArrayREPRData *)st->REPR_data; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.array); if (!MVM_is_null(tc, info)) { MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts.type); if (!MVM_is_null(tc, type)) { const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); spec_to_repr_data(tc, repr_data, spec); } } } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMArray); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVM_serialization_write_ref(tc, writer, repr_data->elem_type); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)MVM_malloc(sizeof(MVMArrayREPRData)); MVMObject *type = MVM_serialization_read_ref(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); st->REPR_data = repr_data; if (type) { const MVMStorageSpec *spec; MVM_serialization_force_stable(tc, reader, STABLE(type)); spec = REPR(type)->get_storage_spec(tc, STABLE(type)); spec_to_repr_data(tc, repr_data, spec); } } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMint64 i; body->elems = MVM_serialization_read_varint(tc, reader); body->ssize = body->elems; if (body->ssize) body->slots.any = MVM_malloc(body->ssize * repr_data->elem_size); for (i = 0; i < body->elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[i], MVM_serialization_read_ref(tc, reader)); break; case MVM_ARRAY_STR: MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[i], MVM_serialization_read_str(tc, reader)); break; case MVM_ARRAY_I64: body->slots.i64[i] = MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I32: body->slots.i32[i] = (MVMint32)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I16: body->slots.i16[i] = (MVMint16)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I8: body->slots.i8[i] = (MVMint8)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U64: body->slots.i64[i] = MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U32: body->slots.i32[i] = (MVMuint32)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U16: body->slots.i16[i] = (MVMuint16)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U8: body->slots.i8[i] = (MVMuint8)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_N64: body->slots.n64[i] = MVM_serialization_read_num(tc, reader); break; case MVM_ARRAY_N32: body->slots.n32[i] = (MVMnum32)MVM_serialization_read_num(tc, reader); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMint64 i; MVM_serialization_write_varint(tc, writer, body->elems); for (i = 0; i < body->elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_serialization_write_ref(tc, writer, body->slots.o[body->start + i]); break; case MVM_ARRAY_STR: MVM_serialization_write_str(tc, writer, body->slots.s[body->start + i]); break; case MVM_ARRAY_I64: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i64[body->start + i]); break; case MVM_ARRAY_I32: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i32[body->start + i]); break; case MVM_ARRAY_I16: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i16[body->start + i]); break; case MVM_ARRAY_I8: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i8[body->start + i]); break; case MVM_ARRAY_U64: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u64[body->start + i]); break; case MVM_ARRAY_U32: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u32[body->start + i]); break; case MVM_ARRAY_U16: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u16[body->start + i]); break; case MVM_ARRAY_U8: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u8[body->start + i]); break; case MVM_ARRAY_N64: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n64[body->start + i]); break; case MVM_ARRAY_N32: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n32[body->start + i]); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } } /* Bytecode specialization for this REPR. */ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { switch (ins->info->opcode) { case MVM_OP_create: { if (!(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = sizeof(MVMArray); ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } } } /* Initializes the representation. */ const MVMREPROps * MVMArray_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, set_elems, push, pop, unshift, shift, asplice, at_pos_multidim, bind_pos_multidim, dimensions, set_dimensions, get_elem_storage_spec }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, spesh, "VMArray", /* name */ MVM_REPR_ID_MVMArray, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMArray.h0000644000175000017500000000323712516136714017002 0ustar jnthnjnthn/* Representation used by VM-level arrays. Adopted from QRPA work by * Patrick Michaud. */ struct MVMArrayBody { /* number of elements (from user's point of view) */ MVMuint64 elems; /* slot index of first element */ MVMuint64 start; /* size of slots array */ MVMuint64 ssize; /* slot array; union of various types of storage we may have. */ union { MVMObject **o; MVMString **s; MVMint64 *i64; MVMint32 *i32; MVMint16 *i16; MVMint8 *i8; MVMnum64 *n64; MVMnum32 *n32; MVMuint64 *u64; MVMuint32 *u32; MVMuint16 *u16; MVMuint8 *u8; void *any; } slots; }; struct MVMArray { MVMObject common; MVMArrayBody body; }; /* Types of things we may be storing. */ #define MVM_ARRAY_OBJ 0 #define MVM_ARRAY_STR 1 #define MVM_ARRAY_I64 2 #define MVM_ARRAY_I32 3 #define MVM_ARRAY_I16 4 #define MVM_ARRAY_I8 5 #define MVM_ARRAY_N64 6 #define MVM_ARRAY_N32 7 #define MVM_ARRAY_U64 8 #define MVM_ARRAY_U32 9 #define MVM_ARRAY_U16 10 #define MVM_ARRAY_U8 11 #define MVM_ARRAY_U4 12 #define MVM_ARRAY_U2 13 #define MVM_ARRAY_U1 14 #define MVM_ARRAY_I4 15 #define MVM_ARRAY_I2 16 #define MVM_ARRAY_I1 17 /* Function for REPR setup. */ const MVMREPROps * MVMArray_initialize(MVMThreadContext *tc); /* Array REPR data specifies the type of array elements we have. */ struct MVMArrayREPRData { /* The size of each element. */ size_t elem_size; /* What type of slots we have. */ MVMuint8 slot_type; /* Type object for the element type. */ MVMObject *elem_type; }; MoarVM-2015.11/src/6model/reprs/MVMAsyncTask.c0000644000175000017500000000615012456307241017612 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMAsyncTask); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with repr MVMAsyncTask"); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMAsyncTask); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMAsyncTaskBody *task = (MVMAsyncTaskBody *)data; MVM_gc_worklist_add(tc, worklist, &task->queue); MVM_gc_worklist_add(tc, worklist, &task->schedulee); if (task->ops && task->ops->gc_mark) task->ops->gc_mark(tc, task->data, worklist); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMAsyncTask *task = (MVMAsyncTask *)obj; if (task->body.ops && task->body.ops->gc_free) task->body.ops->gc_free(tc, obj, task->body.data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMAsyncTask_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "AsyncTask", /* name */ MVM_REPR_ID_MVMAsyncTask, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMAsyncTask.h0000644000175000017500000000103412456307241017613 0ustar jnthnjnthn/* Representation serving as a handle to an asynchronous task. */ struct MVMAsyncTaskBody { /* The queue to schedule a result handler on. */ MVMObject *queue; /* The result handler to schedule. */ MVMObject *schedulee; /* Async task operation table. */ const MVMAsyncTaskOps *ops; /* Data stored by operation type. */ void *data; }; struct MVMAsyncTask { MVMObject common; MVMAsyncTaskBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMAsyncTask_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMCFunction.c0000644000175000017500000000546412456307241017611 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { if (IS_CONCRETE(invokee)) ((MVMCFunction *)invokee)->body.func(tc, callsite, args); else MVM_exception_throw_adhoc(tc, "Cannot invoke C function type object"); } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMCFunction); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCFunctionBody *src_body = (MVMCFunctionBody *)src; MVMCFunctionBody *dest_body = (MVMCFunctionBody *)dest; dest_body->func = src_body->func; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCFunction_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCFunction", /* name */ MVM_REPR_ID_MVMCFunction, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMCFunction.h0000644000175000017500000000103112456307241017600 0ustar jnthnjnthn/* Representation holding a pointer to a C function, which is * passed a callsite descriptor and an argument list as well as * the current thread context. Used for the handful of things * that are implemented as C functions inside the VM. */ struct MVMCFunctionBody { void (*func) (MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args); }; struct MVMCFunction { MVMObject common; MVMCFunctionBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCFunction_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMCallCapture.c0000644000175000017500000001246212623370227020114 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCallCapture); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCallCaptureBody *src_body = (MVMCallCaptureBody *)src; MVMCallCaptureBody *dest_body = (MVMCallCaptureBody *)dest; MVMuint32 arg_size = src_body->apc->arg_count * sizeof(MVMRegister); MVMRegister *args = MVM_malloc(arg_size); memcpy(args, src_body->apc->args, arg_size); dest_body->apc = MVM_malloc(sizeof(MVMArgProcContext)); memset(dest_body->apc, 0, sizeof(MVMArgProcContext)); dest_body->mode = MVM_CALL_CAPTURE_MODE_SAVE; if (src_body->owns_callsite) { dest_body->owns_callsite = 1; dest_body->effective_callsite = MVM_args_copy_callsite(tc, src_body->apc); } else { dest_body->owns_callsite = 0; dest_body->effective_callsite = src_body->effective_callsite; } MVM_args_proc_init(tc, dest_body->apc, dest_body->effective_callsite, args); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { /* Only need to worry about the SAVE case, as the USE case will be marked by * the frame holding the args being marked. */ MVMCallCaptureBody *body = (MVMCallCaptureBody *)data; if (body->mode == MVM_CALL_CAPTURE_MODE_SAVE) { MVMArgProcContext *ctx = body->apc; MVMuint8 *flag_map = ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags; MVMuint16 count = ctx->arg_count; MVMuint16 i, flag; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &ctx->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &ctx->args[i].o); } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCallCapture *ctx = (MVMCallCapture *)obj; if (ctx->body.apc && ctx->body.effective_callsite != ctx->body.apc->callsite) { MVM_free(ctx->body.effective_callsite->arg_flags); MVM_free(ctx->body.effective_callsite); } else if (ctx->body.owns_callsite) { MVM_free(ctx->body.effective_callsite->arg_flags); MVM_free(ctx->body.effective_callsite); } if (ctx->body.mode == MVM_CALL_CAPTURE_MODE_SAVE) { /* We made our own copy of the args buffer and processing context, so * free them both. */ if (ctx->body.apc) { if (ctx->body.apc->named_used) { MVM_fixed_size_free(tc, tc->instance->fsa, ctx->body.apc->named_used_size, ctx->body.apc->named_used); ctx->body.apc->named_used = NULL; } MVM_free(ctx->body.apc->args); MVM_free(ctx->body.apc); } } else { if (ctx->body.use_mode_frame) MVM_frame_dec_ref(tc, ctx->body.use_mode_frame); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCallCapture_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCallCapture", /* name */ MVM_REPR_ID_MVMCallCapture, 1, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMCallCapture.h0000644000175000017500000000204612623370227020116 0ustar jnthnjnthn/* Is this a capture that refers to the args area of an existing frame, or * a saved copy of a frame's args area? */ #define MVM_CALL_CAPTURE_MODE_USE 1 #define MVM_CALL_CAPTURE_MODE_SAVE 2 /* Representation for a context in the VM. Holds an MVMFrame. */ struct MVMCallCaptureBody { /* Argument processing context. For use mode, it points to the context of * the frame in question. For save mode, we allocate a fresh one. */ MVMArgProcContext *apc; /* The frame the ArgProcContext lives in, if we're in use mode. This * ensures the frame stays alive long enough. */ MVMFrame *use_mode_frame; /* The effective MVMCallsite. This may be the original one, but in the * event of flattening will describe the flattened outcome. */ MVMCallsite *effective_callsite; /* Use or save mode? */ MVMuint8 mode; MVMuint8 owns_callsite; }; struct MVMCallCapture { MVMObject common; MVMCallCaptureBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCallCapture_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMCode.c0000644000175000017500000001445412575756521016605 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { if (IS_CONCRETE(invokee)) { MVMCode *code = (MVMCode *)invokee; MVM_frame_invoke(tc, code->body.sf, callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), invokee, -1); } else { MVM_exception_throw_adhoc(tc, "Cannot invoke code type object"); } } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMCode); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCodeBody *src_body = (MVMCodeBody *)src; MVMCodeBody *dest_body = (MVMCodeBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->sf, src_body->sf); if (src_body->outer) dest_body->outer = MVM_frame_acquire_ref(tc, &(src_body->outer)); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); /* Explicitly do *not* copy state vars in a (presumably closure) clone. */ } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCodeBody *body = (MVMCodeBody *)data; MVM_gc_worklist_add_frame(tc, worklist, body->outer); MVM_gc_worklist_add(tc, worklist, &body->code_object); MVM_gc_worklist_add(tc, worklist, &body->sf); MVM_gc_worklist_add(tc, worklist, &body->name); if (body->state_vars) { MVMuint8 *flags = body->sf->body.static_env_flags; MVMuint16 *types = body->sf->body.lexical_types; MVMint64 numlex = body->sf->body.num_lexicals; MVMint64 i; for (i = 0; i < numlex; i++) { if (flags[i] == 2) { if (types[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &body->state_vars[i].o); else if (types[i] == MVM_reg_str) MVM_gc_worklist_add(tc, worklist, &body->state_vars[i].s); } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCode *code_obj = (MVMCode *)obj; if (code_obj->body.outer) code_obj->body.outer = MVM_frame_dec_ref(tc, code_obj->body.outer); MVM_free(code_obj->body.state_vars); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCode_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCode", /* name */ MVM_REPR_ID_MVMCode, 1, /* refs_frames */ }; MVM_PUBLIC MVMObject * MVM_code_location(MVMThreadContext *tc, MVMObject *code) { MVMObject *BOOTHash = tc->instance->boot_types.BOOTHash; MVMCodeBody *body = &((MVMCode*)code)->body; if (REPR(code)->ID != MVM_REPR_ID_MVMCode) { MVM_exception_throw_adhoc(tc, "getcodelocation needs an object of MVMCode REPR, got %s instead", REPR(code)->name); } else { MVMObject * result = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVMBytecodeAnnotation *ann = MVM_bytecode_resolve_annotation(tc, &body->sf->body, 0); MVMCompUnit *cu = body->sf->body.cu; MVMint32 str_idx = ann ? ann->filename_string_heap_index : 0; MVMint32 line_nr = ann ? ann->line_number : 1; MVMString *filename; MVMObject *filename_boxed; MVMObject *linenumber_boxed; MVMString *filename_key, *linenumber_key; MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); filename_key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "file"); MVM_gc_root_temp_push(tc, (MVMCollectable **)&filename_key); linenumber_key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "line"); MVM_gc_root_temp_push(tc, (MVMCollectable **)&linenumber_key); if (ann && str_idx < cu->body.num_strings) { filename = cu->body.strings[str_idx]; } else { filename = cu->body.filename; } MVM_free(ann); filename_boxed = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, filename); MVM_repr_bind_key_o(tc, result, filename_key, filename_boxed); linenumber_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, line_nr); MVM_repr_bind_key_o(tc, result, linenumber_key, linenumber_boxed); MVM_gc_root_temp_pop_n(tc, 3); return result; } return NULL; } MoarVM-2015.11/src/6model/reprs/MVMCode.h0000644000175000017500000000113112516136714016565 0ustar jnthnjnthn/* Representation for code in the VM. Holds an MVMStaticFrame along * with an optional outer pointer if this is a closure. */ struct MVMCodeBody { MVMStaticFrame *sf; MVMFrame *outer; MVMObject *code_object; MVMString *name; MVMRegister *state_vars; MVMuint16 is_static; MVMuint16 is_compiler_stub; }; struct MVMCode { MVMObject common; MVMCodeBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCode_initialize(MVMThreadContext *tc); MVM_PUBLIC MVMObject * MVM_code_location(MVMThreadContext *tc, MVMObject *code); MoarVM-2015.11/src/6model/reprs/MVMCompUnit.c0000644000175000017500000001205012554473060017446 0ustar jnthnjnthn#include "moar.h" #include "platform/mmap.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { MVM_exception_throw_adhoc(tc, "Cannot invoke comp unit object"); } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMCompUnit); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMROOT(tc, root, { MVMObject *rm = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTReentrantMutex); MVM_ASSIGN_REF(tc, &(root->header), ((MVMCompUnit *)root)->body.update_mutex, rm); }); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "this representation (CompUnit) cannot be cloned"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCompUnitBody *body = (MVMCompUnitBody *)data; MVMuint32 i; /* Add code refs and static frames to the worklists. */ for (i = 0; i < body->num_frames; i++) { MVM_gc_worklist_add(tc, worklist, &body->frames[i]); MVM_gc_worklist_add(tc, worklist, &body->coderefs[i]); } /* Add extop names to the worklist. */ for (i = 0; i < body->num_extops; i++) MVM_gc_worklist_add(tc, worklist, &body->extops[i].name); /* Add strings to the worklists. */ for (i = 0; i < body->num_strings; i++) MVM_gc_worklist_add(tc, worklist, &body->strings[i]); /* Add serialization contexts to the worklist. */ for (i = 0; i < body->num_scs; i++) { if (body->scs[i]) { MVM_gc_worklist_add(tc, worklist, &body->scs[i]); } /* Unresolved sc bodies' handles are marked by the GC instance root marking. */ } MVM_gc_worklist_add(tc, worklist, &body->update_mutex); /* Add various other referenced strings, etc. */ MVM_gc_worklist_add(tc, worklist, &body->hll_name); MVM_gc_worklist_add(tc, worklist, &body->filename); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCompUnitBody *body = &((MVMCompUnit *)obj)->body; MVM_free(body->frames); MVM_free(body->coderefs); MVM_free(body->callsites); MVM_free(body->extops); MVM_free(body->strings); MVM_free(body->scs); MVM_free(body->scs_to_resolve); switch (body->deallocate) { case MVM_DEALLOCATE_NOOP: break; case MVM_DEALLOCATE_FREE: MVM_free(body->data_start); break; case MVM_DEALLOCATE_UNMAP: MVM_platform_unmap_file(body->data_start, body->handle, body->data_size); break; default: MVM_panic(MVM_exitcode_NYI, "Invalid deallocate of %u during MVMCompUnit gc_free", body->deallocate); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { /* XXX in the end we'll support inlining of this... */ return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCompUnit_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCompUnit", /* name */ MVM_REPR_ID_MVMCompUnit, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMCompUnit.h0000644000175000017500000000753012456313532017460 0ustar jnthnjnthnstruct MVMExtOpRecord { /* Used to query the extop registry. */ MVMString *name; /* Resolved by the validator. */ MVMOpInfo *info; /* The actual function executed by the interpreter. * Resolved by the validator. */ MVMExtOpFunc *func; /* Tells the interpreter by how much to increment * the instruction pointer. */ MVMuint16 operand_bytes; /* Indicates the JIT should not emit a call to this op, because it needs * to be used in an interpreter context. */ MVMuint16 no_jit; /* Indicates the extop allocates and that its output is some allocated * object. Used by allocation profiling. */ MVMuint16 allocating; /* Read from the bytecode stream. */ MVMuint8 operand_descriptor[MVM_MAX_OPERANDS]; /* Specialization function. */ MVMExtOpSpesh *spesh; /* Discover facts for spesh. */ MVMExtOpFactDiscover *discover; }; /* How to release memory. */ typedef enum { MVM_DEALLOCATE_NOOP, MVM_DEALLOCATE_FREE, MVM_DEALLOCATE_UNMAP } MVMDeallocate; /* Representation for a compilation unit in the VM. */ struct MVMCompUnitBody { /* The start and size of the raw data for this compilation unit. */ MVMuint8 *data_start; MVMuint32 data_size; /* The various static frames in the compilation unit, along with a * code object for each one. */ MVMStaticFrame **frames; MVMObject **coderefs; MVMuint32 num_frames; /* Total, inc. added by inliner. */ MVMuint32 orig_frames; /* Original from loading comp unit. */ /* Special frames. */ MVMStaticFrame *main_frame; MVMStaticFrame *load_frame; MVMStaticFrame *deserialize_frame; /* The callsites in the compilation unit. */ MVMCallsite **callsites; MVMuint32 num_callsites; MVMuint32 orig_callsites; MVMuint16 max_callsite_size; /* The extension ops used by the compilation unit. */ MVMuint16 num_extops; MVMExtOpRecord *extops; /* The string heap and number of strings. */ MVMString **strings; MVMuint32 num_strings; MVMuint32 orig_strings; /* Serialized data, if any. */ MVMint32 serialized_size; MVMuint8 *serialized; /* Array of the resolved serialization contexts, and how many we * have. A null in the list indicates not yet resolved */ MVMSerializationContext **scs; MVMuint32 num_scs; /* How we should deallocate data_start. */ MVMDeallocate deallocate; /* List of serialization contexts in need of resolution. This is an * array of string handles; its length is determined by num_scs above. * once an SC has been resolved, the entry on this list is NULLed. If * all are resolved, this pointer itself becomes NULL. */ MVMSerializationContextBody **scs_to_resolve; /* List of SC handle string indexes. */ MVMint32 *sc_handle_idxs; /* HLL configuration for this compilation unit. */ MVMHLLConfig *hll_config; MVMString *hll_name; /* Filename, if any, that we loaded it from. */ MVMString *filename; /* Handle, if any, associated with a mapped file. */ void *handle; /* MVMReentrantLock to be taken if we want to add extra string, * callsite, or coderef constants to the pools (done during * inlining) or when we finish deserializing a frame, thus * vivifying its lexicals. */ MVMObject *update_mutex; /* Version of the bytecode format we deserialized this comp unit from. */ MVMuint16 bytecode_version; }; struct MVMCompUnit { MVMObject common; MVMCompUnitBody body; }; struct MVMLoadedCompUnitName { /* Loaded filename. */ MVMString *filename; /* Inline handle to the loaded filenames hash (in MVMInstance). */ UT_hash_handle hash_handle; }; /* Function for REPR setup. */ const MVMREPROps * MVMCompUnit_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMContext.c0000644000175000017500000001571412554473060017346 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMContext); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMContext copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMContextBody *body = (MVMContextBody *)data; MVM_gc_worklist_add_frame(tc, worklist, body->context); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMContext *ctx = (MVMContext *)obj; if (ctx->body.context) { ctx->body.context = MVM_frame_dec_ref(tc, ctx->body.context); } } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { MVMString *name = (MVMString *)key; MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; if (!lexical_names) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry); if (!entry) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } if (frame->static_info->body.lexical_types[entry->value] != kind) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has a different type in this frame", c_name); } *result = frame->env[entry->value]; if (kind == MVM_reg_obj && !result->o) result->o = MVM_frame_vivify_lexical(tc, frame, entry->value); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { MVMString *name = (MVMString *)key; MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; if (!lexical_names) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry); if (!entry) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } if (frame->static_info->body.lexical_types[entry->value] != kind) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has a different type in this frame", c_name); } frame->env[entry->value] = value; } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "MVMContext representation does not support elems"); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; MVMString *name = (MVMString *)key; if (!lexical_names) return 0; MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry); return entry ? 1 : 0; } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVM_exception_throw_adhoc(tc, "MVMContext representation does not support delete key"); } static MVMStorageSpec get_value_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMContext_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, { at_key, bind_key, exists_key, delete_key, get_value_storage_spec }, /* ass_funcs */ elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMContext", /* name */ MVM_REPR_ID_MVMContext, 1, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMContext.h0000644000175000017500000000043112456307241017337 0ustar jnthnjnthn/* Representation for a context in the VM. Holds an MVMFrame. */ struct MVMContextBody { MVMFrame *context; }; struct MVMContext { MVMObject common; MVMContextBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMContext_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMContinuation.c0000644000175000017500000000745412516136714020376 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMContinuation); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMContinuation copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMContinuationBody *body = (MVMContinuationBody *)data; MVM_gc_worklist_add_frame(tc, worklist, body->top); MVM_gc_worklist_add_frame(tc, worklist, body->root); if (body->active_handlers) { MVMActiveHandler *cur_ah = body->active_handlers; while (cur_ah != NULL) { MVM_gc_worklist_add(tc, worklist, &cur_ah->ex_obj); cur_ah = cur_ah->next_handler; } } if (body->prof_cont) { MVMuint64 i; for (i = 0; i < body->prof_cont->num_sfs; i++) MVM_gc_worklist_add(tc, worklist, &(body->prof_cont->sfs[i])); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMContinuation *ctx = (MVMContinuation *)obj; if (ctx->body.top) ctx->body.top = MVM_frame_dec_ref(tc, ctx->body.top); if (ctx->body.root) ctx->body.root = MVM_frame_dec_ref(tc, ctx->body.root); if (ctx->body.active_handlers) { MVMActiveHandler *cur_ah = ctx->body.active_handlers; while (cur_ah != NULL) { MVMActiveHandler *next_ah = cur_ah->next_handler; MVM_frame_dec_ref(tc, cur_ah->frame); MVM_free(cur_ah); cur_ah = next_ah; } } if (ctx->body.prof_cont) MVM_free(ctx->body.prof_cont); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMContinuation_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, NULL, /* elems */ get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMContinuation", /* name */ MVM_REPR_ID_MVMContinuation, 1, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMContinuation.h0000644000175000017500000000144412456307241020372 0ustar jnthnjnthn/* Representation for a continuation in the VM. */ struct MVMContinuationBody { /* Top frame of the continuation. */ MVMFrame *top; /* Address to resume execution at when the continuation is invoked. */ MVMuint8 *addr; /* Register to put invoke argument into after resume. */ MVMRegister *res_reg; /* Root of the continuation. */ MVMFrame *root; /* Active exception handler(s) to restore. */ MVMActiveHandler *active_handlers; /* If we're profiling, then data needed to cope with the continuation * being invoked again. */ MVMProfileContinuationData *prof_cont; }; struct MVMContinuation { MVMObject common; MVMContinuationBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMContinuation_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMDLLSym.c0000644000175000017500000000467412456307241017027 0ustar jnthnjnthn#include "moar.h" static const MVMREPROps this_repr; static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMDLLSym); }); return st->WHAT; } static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMDLLSymBody *src_body = src; MVMDLLSymBody *dest_body = dest; *dest_body = *src_body; if (dest_body->dll) MVM_incr(&dest_body->dll->refcount); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* noop */ } const MVMREPROps * MVMDLLSym_initialize(MVMThreadContext *tc) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, NULL); MVMROOT(tc, st, { MVMObject *WHAT = MVM_gc_allocate_type_object(tc, st); tc->instance->raw_types.RawDLLSym = WHAT; MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, WHAT); st->size = sizeof(MVMDLLSym); }); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->raw_types.RawDLLSym); return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMDLLSym", MVM_REPR_ID_MVMDLLSym, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMDLLSym.h0000644000175000017500000000031312456307241017016 0ustar jnthnjnthnstruct MVMDLLSymBody { void *address; MVMDLLRegistry *dll; }; struct MVMDLLSym { MVMObject common; MVMDLLSymBody body; }; const MVMREPROps * MVMDLLSym_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMException.c0000644000175000017500000000572512516136714017661 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMException); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMException copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMExceptionBody *body = (MVMExceptionBody *)data; MVM_gc_worklist_add(tc, worklist, &body->message); MVM_gc_worklist_add(tc, worklist, &body->payload); MVM_gc_worklist_add_frame(tc, worklist, body->origin); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMException *ctx = (MVMException *)obj; if (ctx->body.origin) { ctx->body.origin = MVM_frame_dec_ref(tc, ctx->body.origin); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMException_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMException", /* name */ MVM_REPR_ID_MVMException, 1, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMException.h0000644000175000017500000000133312534320622017646 0ustar jnthnjnthn/* Representation for an exception in MoarVM. */ struct MVMExceptionBody { /* The exception message. */ MVMString *message; /* The payload (object thrown with the exception). */ MVMObject *payload; /* The exception category. */ MVMint32 category; /* Flag indicating if we should return after unwinding. */ MVMuint8 return_after_unwind; /* Where was the exception thrown from? */ MVMFrame *origin; /* Where should we resume to, if it's possible? */ MVMuint8 *resume_addr; void *jit_resume_label; }; struct MVMException { MVMObject common; MVMExceptionBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMException_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMHash.c0000644000175000017500000002017612521412402016566 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMHash); }); return st->WHAT; } MVM_STATIC_INLINE void extract_key(MVMThreadContext *tc, void **kdata, size_t *klen, MVMObject *key) { MVM_HASH_EXTRACT_KEY(tc, kdata, klen, key, "MVMHash representation requires MVMString keys") } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMHashBody *src_body = (MVMHashBody *)src; MVMHashBody *dest_body = (MVMHashBody *)dest; MVMHashEntry *current, *tmp; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->hash_head, current, tmp, bucket_tmp) { size_t klen; void *kdata; MVMHashEntry *new_entry = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->key, current->key); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->value, current->value); extract_key(tc, &kdata, &klen, new_entry->key); HASH_ADD_KEYPTR(hash_handle, dest_body->hash_head, kdata, klen, new_entry); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->key); MVM_gc_worklist_add(tc, worklist, ¤t->value); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMHash *h = (MVMHash *)obj; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, h->body.hash_head, current, tmp, bucket_tmp) { if (current != h->body.hash_head) MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), current); } tmp = h->body.hash_head; HASH_CLEAR(hash_handle, h->body.hash_head); if (tmp) MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), tmp); } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { MVMHashBody *body = (MVMHashBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; extract_key(tc, &kdata, &klen, key); HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); if (kind == MVM_reg_obj) result->o = entry != NULL ? entry->value : tc->instance->VMNull; else MVM_exception_throw_adhoc(tc, "MVMHash representation does not support native type storage"); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { MVMHashBody *body = (MVMHashBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; extract_key(tc, &kdata, &klen, key); /* first check whether we can must update the old entry. */ HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); if (!entry) { entry = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMHashEntry)); HASH_ADD_KEYPTR(hash_handle, body->hash_head, kdata, klen, entry); } else entry->hash_handle.key = (void *)kdata; MVM_ASSIGN_REF(tc, &(root->header), entry->key, key); if (kind == MVM_reg_obj) { MVM_ASSIGN_REF(tc, &(root->header), entry->value, value.o); } else { MVM_exception_throw_adhoc(tc, "MVMHash representation does not support native type storage"); } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMHashBody *body = (MVMHashBody *)data; return HASH_CNT(hash_handle, body->hash_head); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMHashBody *body = (MVMHashBody *)data; void *kdata; MVMHashEntry *entry; size_t klen; extract_key(tc, &kdata, &klen, key); HASH_FIND(hash_handle, body->hash_head, kdata, klen, entry); return entry != NULL; } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *old_entry; size_t klen; void *kdata; extract_key(tc, &kdata, &klen, key); HASH_FIND(hash_handle, body->hash_head, kdata, klen, old_entry); if (old_entry) { HASH_DELETE(hash_handle, body->hash_head, old_entry); MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), old_entry); } } static MVMStorageSpec get_value_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* XXX key and value types will be communicated here */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMHash); } /* Bytecode specialization for this REPR. */ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { switch (ins->info->opcode) { case MVM_OP_create: { if (!(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = sizeof(MVMHash); ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } } } /* Initializes the representation. */ const MVMREPROps * MVMHash_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, { at_key, bind_key, exists_key, delete_key, get_value_storage_spec }, /* ass_funcs */ elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, spesh, "VMHash", /* name */ MVM_REPR_ID_MVMHash, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMHash.h0000644000175000017500000000431712554473060016607 0ustar jnthnjnthn/* Representation used by VM-level hashes. */ struct MVMHashEntry { /* key object (must be MVMString REPR) */ MVMObject *key; /* value object */ MVMObject *value; /* the uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; struct MVMHashBody { /* uthash updates this pointer directly. */ MVMHashEntry *hash_head; }; struct MVMHash { MVMObject common; MVMHashBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMHash_initialize(MVMThreadContext *tc); #define MVM_HASH_ACTION(tc, hash, name, entry, action, member, size) \ action(hash_handle, hash, \ name->body.storage.blob_32, MVM_string_graphs(tc, name) * sizeof(size), entry); \ #define MVM_HASH_ACTION_CACHE(tc, hash, name, entry, action, member, size) \ action(hash_handle, hash, name->body.storage.blob_32, \ MVM_string_graphs(tc, name) * sizeof(size), name->body.cached_hash_code, entry); \ #define MVM_HASH_ACTION_SELECT(tc, hash, name, entry, action) \ MVM_HASH_ACTION(tc, hash, name, entry, action, storage.blob_32, MVMGrapheme32) #define MVM_HASH_ACTION_SELECT_CACHE(tc, hash, name, entry, action) \ MVM_HASH_ACTION_CACHE(tc, hash, name, entry, action, storage.blob_32, MVMGrapheme32) \ #define MVM_HASH_BIND(tc, hash, name, entry) \ MVM_HASH_ACTION_SELECT_CACHE(tc, hash, name, entry, HASH_ADD_KEYPTR_CACHE) #define MVM_HASH_GET(tc, hash, name, entry) \ MVM_HASH_ACTION_SELECT_CACHE(tc, hash, name, entry, HASH_FIND_CACHE) #define MVM_HASH_EXTRACT_KEY(tc, kdata, klen, key, error) \ if (REPR(key)->ID == MVM_REPR_ID_MVMString && IS_CONCRETE(key)) { \ MVM_string_flatten(tc, (MVMString *)key); \ *kdata = ((MVMString *)key)->body.storage.blob_32; \ *klen = ((MVMString *)key)->body.num_graphs * sizeof(MVMGrapheme32); \ } \ else { \ MVM_exception_throw_adhoc(tc, error); \ } #define MVM_HASH_DESTROY(hash_handle, hashentry_type, head_node) do { \ hashentry_type *current, *tmp; \ unsigned bucket_tmp; \ HASH_ITER(hash_handle, head_node, current, tmp, bucket_tmp) { \ if (current != head_node) \ MVM_free(current); \ } \ tmp = head_node; \ HASH_CLEAR(hash_handle, head_node); \ MVM_free(tmp); \ } while (0) MoarVM-2015.11/src/6model/reprs/MVMIter.c0000644000175000017500000003662312613656332016630 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMIter); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation VMIter"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMIterBody *body = (MVMIterBody *)data; MVM_gc_worklist_add(tc, worklist, &body->target); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMIterBody *body = (MVMIterBody *)data; MVMObject *target = body->target; switch (body->mode) { case MVM_ITER_MODE_ARRAY: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); return; case MVM_ITER_MODE_ARRAY_INT: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_int64) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_int64); value->o = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, tmp.i64); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_ARRAY_NUM: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_num64) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_num64); value->o = MVM_repr_box_num(tc, MVM_hll_current(tc)->num_box_type, tmp.n64); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_ARRAY_STR: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_str) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_str); value->o = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, tmp.s); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_HASH: body->hash_state.curr = body->hash_state.next; if (!body->hash_state.curr) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); body->hash_state.next = HASH_ITER_NEXT_ITEM( &(body->hash_state.next->hash_handle), &(body->hash_state.bucket_state)); value->o = root; return; default: MVM_exception_throw_adhoc(tc, "Unknown iteration mode"); } } /* This whole splice optimization can be optimized for the case we have two * MVMIter representation objects. */ static void isplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* XXX element type supplied through this... */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMIter); } /* Initializes the representation. */ const MVMREPROps * MVMIter_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { MVM_REPR_DEFAULT_AT_POS, MVM_REPR_DEFAULT_BIND_POS, MVM_REPR_DEFAULT_SET_ELEMS, MVM_REPR_DEFAULT_PUSH, MVM_REPR_DEFAULT_POP, MVM_REPR_DEFAULT_UNSHIFT, shift, isplice, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, get_elem_storage_spec }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMIter", /* name */ MVM_REPR_ID_MVMIter, 0, /* refs_frames */ }; MVMObject * MVM_iter(MVMThreadContext *tc, MVMObject *target) { MVMIter *iterator; MVMROOT(tc, target, { if (REPR(target)->ID == MVM_REPR_ID_MVMArray) { iterator = (MVMIter *)MVM_repr_alloc_init(tc, MVM_hll_current(tc)->array_iterator_type); iterator->body.array_state.index = -1; iterator->body.array_state.limit = REPR(target)->elems(tc, STABLE(target), target, OBJECT_BODY(target)); MVM_ASSIGN_REF(tc, &(iterator->common.header), iterator->body.target, target); switch (REPR(target)->pos_funcs.get_elem_storage_spec(tc, STABLE(target)).boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: iterator->body.mode = MVM_ITER_MODE_ARRAY_INT; break; case MVM_STORAGE_SPEC_BP_NUM: iterator->body.mode = MVM_ITER_MODE_ARRAY_NUM; break; case MVM_STORAGE_SPEC_BP_STR: iterator->body.mode = MVM_ITER_MODE_ARRAY_STR; break; default: iterator->body.mode = MVM_ITER_MODE_ARRAY; break; } } else if (REPR(target)->ID == MVM_REPR_ID_MVMHash) { iterator = (MVMIter *)MVM_repr_alloc_init(tc, MVM_hll_current(tc)->hash_iterator_type); iterator->body.mode = MVM_ITER_MODE_HASH; iterator->body.hash_state.bucket_state = 0; iterator->body.hash_state.curr = NULL; iterator->body.hash_state.next = HASH_ITER_FIRST_ITEM( ((MVMHash *)target)->body.hash_head ? ((MVMHash *)target)->body.hash_head->hash_handle.tbl : NULL, &(iterator->body.hash_state.bucket_state)); MVM_ASSIGN_REF(tc, &(iterator->common.header), iterator->body.target, target); } else if (REPR(target)->ID == MVM_REPR_ID_MVMContext) { /* Turn the context into a VMHash and then iterate that. */ MVMHLLConfig *hll = MVM_hll_current(tc); MVMObject *ctx_hash = MVM_repr_alloc_init(tc, hll->slurpy_hash_type); MVMROOT(tc, ctx_hash, { MVMContext *ctx = (MVMContext *)target; MVMFrame *frame = ctx->body.context; MVMStaticFrame *sf = frame->static_info; MVMLexicalRegistry **lexreg = sf->body.lexical_names_list; MVMuint32 i; for (i = 0; i < sf->body.num_lexicals; i++) { MVMuint32 idx = lexreg[i]->value; MVMuint16 type = sf->body.lexical_types[idx]; switch (type) { case MVM_reg_obj: { MVMObject *obj = frame->env[idx].o; if (!obj) obj = MVM_frame_vivify_lexical(tc, frame, idx); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, obj); break; } case MVM_reg_str: { MVMObject *bs = MVM_repr_box_str(tc, hll->str_box_type, frame->env[idx].s); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bs); break; } case MVM_reg_int8: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i8); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int16: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i16); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int32: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i32); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int64: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i64); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_num32: { MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type, frame->env[idx].n32); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn); break; } case MVM_reg_num64: { MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type, frame->env[idx].n64); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn); break; } default: MVM_exception_throw_adhoc(tc, "Unknown lexical type encountered while building context iterator"); } } }); /* Call ourselves recursively to get the iterator for this * hash. */ iterator = (MVMIter *)MVM_iter(tc, ctx_hash); } else { MVM_exception_throw_adhoc(tc, "Cannot iterate object with %s representation", REPR(target)->name); } }); return (MVMObject *)iterator; } MVMint64 MVM_iter_istrue(MVMThreadContext *tc, MVMIter *iter) { switch (iter->body.mode) { case MVM_ITER_MODE_ARRAY: case MVM_ITER_MODE_ARRAY_INT: case MVM_ITER_MODE_ARRAY_NUM: case MVM_ITER_MODE_ARRAY_STR: return iter->body.array_state.index + 1 < iter->body.array_state.limit ? 1 : 0; break; case MVM_ITER_MODE_HASH: return iter->body.hash_state.next != NULL ? 1 : 0; break; default: MVM_exception_throw_adhoc(tc, "Invalid iteration mode used"); } } MVMString * MVM_iterkey_s(MVMThreadContext *tc, MVMIter *iterator) { if (REPR(iterator)->ID != MVM_REPR_ID_MVMIter || iterator->body.mode != MVM_ITER_MODE_HASH) MVM_exception_throw_adhoc(tc, "This is not a hash iterator"); if (!iterator->body.hash_state.curr) MVM_exception_throw_adhoc(tc, "You have not advanced to the first item of the hash iterator, or have gone past the end"); return (MVMString *)iterator->body.hash_state.curr->key; } MVMObject * MVM_iterval(MVMThreadContext *tc, MVMIter *iterator) { MVMIterBody *body; MVMObject *target; MVMRegister result; if (REPR(iterator)->ID != MVM_REPR_ID_MVMIter) MVM_exception_throw_adhoc(tc, "This is not an iterator"); if (iterator->body.mode == MVM_ITER_MODE_ARRAY) { body = &iterator->body; if (body->array_state.index == -1) MVM_exception_throw_adhoc(tc, "You have not yet advanced in the array iterator"); target = body->target; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &result, MVM_reg_obj); } else if (iterator->body.mode == MVM_ITER_MODE_HASH) { if (!iterator->body.hash_state.curr) MVM_exception_throw_adhoc(tc, "You have not advanced to the first item of the hash iterator, or have gone past the end"); result.o = iterator->body.hash_state.curr->value; if (!result.o) result.o = tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "Unknown iterator mode in iterval"); } return result.o; } MoarVM-2015.11/src/6model/reprs/MVMIter.h0000644000175000017500000000207512521233546016623 0ustar jnthnjnthn/* Representation used by VM-level iterators. */ #define MVM_ITER_MODE_ARRAY 0 #define MVM_ITER_MODE_ARRAY_INT 1 #define MVM_ITER_MODE_ARRAY_NUM 2 #define MVM_ITER_MODE_ARRAY_STR 3 #define MVM_ITER_MODE_HASH 4 struct MVMIterBody { /* whether hash or array */ MVMuint32 mode; /* array or hash being iterated */ MVMObject *target; /* next hash item to give or next array index */ union { struct { MVMHashEntry *curr, *next; unsigned bucket_state; } hash_state; struct { MVMint64 index; MVMint64 limit; } array_state; }; }; struct MVMIter { MVMObject common; MVMIterBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMIter_initialize(MVMThreadContext *tc); MVMObject * MVM_iter(MVMThreadContext *tc, MVMObject *target); MVMint64 MVM_iter_istrue(MVMThreadContext *tc, MVMIter *iter); MVMString * MVM_iterkey_s(MVMThreadContext *tc, MVMIter *iterator); MVMObject * MVM_iterval(MVMThreadContext *tc, MVMIter *iterator); MoarVM-2015.11/src/6model/reprs/MVMMultiCache.c0000644000175000017500000004366512623370227017744 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMMultiCache); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation MultiCache"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMMultiCacheBody *mc = (MVMMultiCacheBody *)data; MVMint64 i, j; MVM_gc_worklist_add(tc, worklist, &mc->zero_arity); for (i = 0; i < MVM_MULTICACHE_MAX_ARITY; i++) for (j = 0; j < mc->arity_caches[i].num_entries; j++) MVM_gc_worklist_add(tc, worklist, &mc->arity_caches[i].results[j]); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMMultiCache *mc = (MVMMultiCache *)obj; MVMint64 i; for (i = 0; i < MVM_MULTICACHE_MAX_ARITY; i++) { MVM_free(mc->body.arity_caches[i].type_ids); MVM_free(mc->body.arity_caches[i].named_ok); MVM_free(mc->body.arity_caches[i].results); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMMultiCache_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMMultiCache", /* name */ MVM_REPR_ID_MVMMultiCache, 0, /* refs_frames */ }; MVMObject * MVM_multi_cache_add(MVMThreadContext *tc, MVMObject *cache_obj, MVMObject *capture, MVMObject *result) { MVMMultiCacheBody *cache; MVMCallsite *cs; MVMArgProcContext *apc; MVMuint16 num_args, i, entries, ins_type; MVMuint8 has_nameds; MVMuint64 arg_tup[MVM_MULTICACHE_MAX_ARITY]; /* Allocate a cache if needed. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) { MVMROOT(tc, capture, { MVMROOT(tc, result, { cache_obj = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTMultiCache); }); }); } cache = &((MVMMultiCache *)cache_obj)->body; /* Ensure we got a capture in to cache on; bail if unflattened (should * never happen). */ if (REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) { cs = ((MVMCallCapture *)capture)->body.effective_callsite; apc = ((MVMCallCapture *)capture)->body.apc; num_args = apc->num_pos; has_nameds = apc->arg_count != apc->num_pos; if (cs->has_flattening) return cache_obj; } else { MVM_exception_throw_adhoc(tc, "Multi cache addition requires an MVMCallCapture"); } /* If we're in a multi-threaded context, obtain the cache additions * lock, and then do another lookup to ensure nobody beat us to * making this entry. */ if (MVM_instance_have_user_threads(tc)) { uv_mutex_lock(&(tc->instance->mutex_multi_cache_add)); if (MVM_multi_cache_find(tc, cache_obj, capture)) goto DONE; } /* If it's zero arity, just stick it in that slot. */ if (num_args == 0) { /* Can only be added if there are no named args */ if (!has_nameds) MVM_ASSIGN_REF(tc, &(cache_obj->header), cache->zero_arity, result); goto DONE; } /* If there's more args than the maximum, we can't cache it. */ if (num_args > MVM_MULTICACHE_MAX_ARITY) goto DONE; /* If the cache is saturated, don't do anything (we could instead do a random * replacement). */ entries = cache->arity_caches[num_args - 1].num_entries; if (entries == MVM_MULTICACHE_MAX_ENTRIES) goto DONE; /* Create arg tuple. */ for (i = 0; i < num_args; i++) { MVMuint8 arg_type = cs->arg_flags[i] & MVM_CALLSITE_ARG_MASK; if (arg_type == MVM_CALLSITE_ARG_OBJ) { MVMObject *arg = MVM_args_get_pos_obj(tc, apc, i, 1).arg.o; if (arg) { MVMuint8 rwness = 0; MVMContainerSpec const *contspec = STABLE(arg)->container_spec; if (contspec && IS_CONCRETE(arg)) { if (contspec->fetch_never_invokes) { if (REPR(arg)->ID != MVM_REPR_ID_NativeRef) { MVMRegister r; if (contspec->can_store(tc, arg)) rwness = 2; contspec->fetch(tc, arg, &r); arg = r.o; } else { rwness = 2; /* Native refs are always writable. */ } } else { goto DONE; } } arg_tup[i] = STABLE(arg)->type_cache_id | (IS_CONCRETE(arg) ? 1 : 0) | rwness; } else { goto DONE; } } else { arg_tup[i] = (arg_type << 2) | 1; } } /* If there's no entries yet, need to do some allocation. */ if (entries == 0) { cache->arity_caches[num_args - 1].type_ids = MVM_malloc(num_args * sizeof(MVMuint64) * MVM_MULTICACHE_MAX_ENTRIES); cache->arity_caches[num_args - 1].named_ok = MVM_malloc(sizeof(MVMuint8) * MVM_MULTICACHE_MAX_ENTRIES); cache->arity_caches[num_args - 1].results = MVM_malloc(sizeof(MVMObject *) * MVM_MULTICACHE_MAX_ENTRIES); } /* Add entry. */ ins_type = entries * num_args; for (i = 0; i < num_args; i++) cache->arity_caches[num_args - 1].type_ids[ins_type + i] = arg_tup[i]; MVM_ASSIGN_REF(tc, &(cache_obj->header), cache->arity_caches[num_args - 1].results[entries], result); cache->arity_caches[num_args - 1].named_ok[entries] = has_nameds; /* Other threads can read concurrently, so do a memory barrier before we * bump the entry count to ensure all the above writes are done. */ MVM_barrier(); cache->arity_caches[num_args - 1].num_entries = entries + 1; /* Release lock if needed. */ DONE: if (MVM_instance_have_user_threads(tc)) uv_mutex_unlock(&(tc->instance->mutex_multi_cache_add)); /* Hand back the created/updated cache. */ return cache_obj; } /* Does a lookup in a multi-dispatch cache. */ MVMObject * MVM_multi_cache_find(MVMThreadContext *tc, MVMObject *cache_obj, MVMObject *capture) { MVMMultiCacheBody *cache; MVMCallsite *cs; MVMArgProcContext *apc; MVMuint16 num_args, i, j, entries, t_pos; MVMuint8 has_nameds; MVMuint64 arg_tup[MVM_MULTICACHE_MAX_ARITY]; /* If no cache, no result. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) return NULL; cache = &((MVMMultiCache *)cache_obj)->body; /* Ensure we got a capture in to look up; bail if unflattened (should * never happen). */ if (REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) { cs = ((MVMCallCapture *)capture)->body.effective_callsite; apc = ((MVMCallCapture *)capture)->body.apc; num_args = apc->num_pos; has_nameds = apc->arg_count != apc->num_pos; if (cs->has_flattening) return NULL; } else { MVM_exception_throw_adhoc(tc, "Multi cache lookup requires an MVMCallCapture"); } /* If it's zero-arity, return result right off. */ if (num_args == 0) return has_nameds ? NULL : cache->zero_arity; /* If there's more args than the maximum, won't be in the cache. */ if (num_args > MVM_MULTICACHE_MAX_ARITY) return NULL; /* Create arg tuple. */ for (i = 0; i < num_args; i++) { MVMuint8 arg_type = cs->arg_flags[i] & MVM_CALLSITE_ARG_MASK; if (arg_type == MVM_CALLSITE_ARG_OBJ) { MVMObject *arg = MVM_args_get_pos_obj(tc, apc, i, 1).arg.o; if (arg) { MVMuint8 rwness = 0; MVMContainerSpec const *contspec = STABLE(arg)->container_spec; if (contspec && IS_CONCRETE(arg)) { if (contspec->fetch_never_invokes) { if (REPR(arg)->ID != MVM_REPR_ID_NativeRef) { MVMRegister r; if (contspec->can_store(tc, arg)) rwness = 2; contspec->fetch(tc, arg, &r); arg = r.o; } else { rwness = 2; /* Native refs are always writable. */ } } else { return NULL; } } arg_tup[i] = STABLE(arg)->type_cache_id | (IS_CONCRETE(arg) ? 1 : 0) | rwness; } else { return NULL; } } else { arg_tup[i] = (arg_type << 2) | 1; } } /* Look through entries. */ entries = cache->arity_caches[num_args - 1].num_entries; t_pos = 0; for (i = 0; i < entries; i++) { MVMint64 match = 1; for (j = 0; j < num_args; j++) { if (cache->arity_caches[num_args - 1].type_ids[t_pos + j] != arg_tup[j]) { match = 0; break; } } if (match) { MVMuint8 match_nameds = cache->arity_caches[num_args - 1].named_ok[i]; if (has_nameds == match_nameds) return cache->arity_caches[num_args - 1].results[i]; } t_pos += num_args; } return NULL; } /* Does a lookup in the multi-dispatch cache using a callsite and args. Some * code dupe with above; may be nice to factor it out some day. */ MVMObject * MVM_multi_cache_find_callsite_args(MVMThreadContext *tc, MVMObject *cache_obj, MVMCallsite *cs, MVMRegister *args) { MVMMultiCacheBody *cache; MVMuint16 num_args, i, j, entries, t_pos; MVMuint8 has_nameds; MVMuint64 arg_tup[MVM_MULTICACHE_MAX_ARITY]; /* If no cache, no result. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) return NULL; cache = &((MVMMultiCache *)cache_obj)->body; /* Ensure we got a capture in to look up; bail if unflattened. */ if (cs->has_flattening) return NULL; num_args = cs->num_pos; has_nameds = cs->arg_count != cs->num_pos; /* If it's zero-arity, return result right off. */ if (num_args == 0) return has_nameds ? NULL : cache->zero_arity; /* If there's more args than the maximum, won't be in the cache. */ if (num_args > MVM_MULTICACHE_MAX_ARITY) return NULL; /* Create arg tuple. */ for (i = 0; i < num_args; i++) { MVMuint8 arg_type = cs->arg_flags[i] & MVM_CALLSITE_ARG_MASK; if (arg_type == MVM_CALLSITE_ARG_OBJ) { MVMObject *arg = args[i].o; if (arg) { MVMuint8 rwness = 0; MVMContainerSpec const *contspec = STABLE(arg)->container_spec; if (contspec && IS_CONCRETE(arg)) { if (contspec->fetch_never_invokes) { if (REPR(arg)->ID != MVM_REPR_ID_NativeRef) { MVMRegister r; if (contspec->can_store(tc, arg)) rwness = 2; contspec->fetch(tc, arg, &r); arg = r.o; } else { rwness = 2; /* Native refs are always writable. */ } } else { return NULL; } } arg_tup[i] = STABLE(arg)->type_cache_id | (IS_CONCRETE(arg) ? 1 : 0) | rwness; } else { return NULL; } } else { arg_tup[i] = (arg_type << 2) | 1; } } /* Look through entries. */ entries = cache->arity_caches[num_args - 1].num_entries; t_pos = 0; for (i = 0; i < entries; i++) { MVMint64 match = 1; for (j = 0; j < num_args; j++) { if (cache->arity_caches[num_args - 1].type_ids[t_pos + j] != arg_tup[j]) { match = 0; break; } } if (match) { MVMuint8 match_nameds = cache->arity_caches[num_args - 1].named_ok[i]; if (has_nameds == match_nameds) return cache->arity_caches[num_args - 1].results[i]; } t_pos += num_args; } return NULL; } /* Do a multi cache lookup based upon spesh arg facts. */ MVMObject * MVM_multi_cache_find_spesh(MVMThreadContext *tc, MVMObject *cache_obj, MVMSpeshCallInfo *arg_info) { MVMMultiCacheBody *cache; MVMuint16 num_args, i, j, entries, t_pos; MVMuint8 has_nameds; MVMuint64 arg_tup[MVM_MULTICACHE_MAX_ARITY]; /* If no cache, no result. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) return NULL; cache = &((MVMMultiCache *)cache_obj)->body; /* Ensure we got a capture in to look up; bail if unflattened. */ if (arg_info->cs->has_flattening) return NULL; num_args = arg_info->cs->num_pos; has_nameds = arg_info->cs->arg_count != arg_info->cs->num_pos; /* If it's zero-arity, return result right off. */ if (num_args == 0) return has_nameds ? NULL : cache->zero_arity; /* If there's more args than the maximum, won't be in the cache. Also * check against maximum size of spesh call site. */ if (num_args > MVM_MULTICACHE_MAX_ARITY || num_args > MAX_ARGS_FOR_OPT) return NULL; /* Create arg tuple. */ for (i = 0; i < num_args; i++) { MVMuint8 arg_type = arg_info->cs->arg_flags[i] & MVM_CALLSITE_ARG_MASK; if (arg_type == MVM_CALLSITE_ARG_OBJ) { MVMSpeshFacts *facts = arg_info->arg_facts[i]; if (facts) { /* Must know type. */ if (!(facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) return NULL; /* Must know if it's concrete or not. */ if (!(facts->flags & (MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_TYPEOBJ))) return NULL; /* If it's a container, must know what's inside it. Otherwise, * we're already good on type info. */ if ((facts->flags & MVM_SPESH_FACT_CONCRETE) && STABLE(facts->type)->container_spec) { /* Again, need to know type and concreteness. */ if (!(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE)) return NULL; if (!(facts->flags & (MVM_SPESH_FACT_DECONT_CONCRETE | MVM_SPESH_FACT_DECONT_TYPEOBJ))) return NULL; arg_tup[i] = STABLE(facts->decont_type)->type_cache_id | ((facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) ? 1 : 0); if (facts->flags & MVM_SPESH_FACT_RW_CONT) arg_tup[i] |= 2; } else { arg_tup[i] = STABLE(facts->type)->type_cache_id | ((facts->flags & MVM_SPESH_FACT_CONCRETE) ? 1 : 0); } } else { return NULL; } } else { arg_tup[i] = (arg_type << 2) | 1; } } /* Look through entries. */ entries = cache->arity_caches[num_args - 1].num_entries; t_pos = 0; for (i = 0; i < entries; i++) { MVMint64 match = 1; for (j = 0; j < num_args; j++) { if (cache->arity_caches[num_args - 1].type_ids[t_pos + j] != arg_tup[j]) { match = 0; break; } } if (match) { MVMuint8 match_nameds = cache->arity_caches[num_args - 1].named_ok[i]; if (has_nameds == match_nameds) return cache->arity_caches[num_args - 1].results[i]; } t_pos += num_args; } return NULL; } MoarVM-2015.11/src/6model/reprs/MVMMultiCache.h0000644000175000017500000000355212456307241017740 0ustar jnthnjnthn/* Maximum positional arity we cache up to. (Good to make it a power of 2.) */ #define MVM_MULTICACHE_MAX_ARITY 4 /* Maximum entries we cache per arity. (Good to make it a power of 2.) */ #define MVM_MULTICACHE_MAX_ENTRIES 16 /* The cached info that we keep per arity. */ struct MVMMultiArityCache { /* The number of entries in the cache. */ MVMuint8 num_entries; /* This is a bunch of type IDs. We allocate it arity * MAX_ENTRIES * big and go through it in arity sized chunks. */ MVMint64 *type_ids; /* Whether the entry is allowed to have named arguments. Doesn't say * anything about which ones, though. Something that is ambivalent * about named arguments to the degree it doesn't care about them * even tie-breaking (like NQP) can just throw such entries into the * cache. Things that do care should not make such cache entries. */ MVMuint8 *named_ok; /* The results we return from the cache. */ MVMObject **results; }; /* Body of a multi-dispatch cache. */ struct MVMMultiCacheBody { /* Zero-arity cached result. */ MVMObject *zero_arity; /* The per-arity cache. */ MVMMultiArityCache arity_caches[MVM_MULTICACHE_MAX_ARITY]; }; struct MVMMultiCache { MVMObject common; MVMMultiCacheBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMMultiCache_initialize(MVMThreadContext *tc); /* Functions relating to multi-dispatch cache usage. */ MVMObject * MVM_multi_cache_add(MVMThreadContext *tc, MVMObject *cache, MVMObject *capture, MVMObject *result); MVMObject * MVM_multi_cache_find(MVMThreadContext *tc, MVMObject *cache, MVMObject *capture); MVMObject * MVM_multi_cache_find_callsite_args(MVMThreadContext *tc, MVMObject *cache, MVMCallsite *cs, MVMRegister *args); MVMObject * MVM_multi_cache_find_spesh(MVMThreadContext *tc, MVMObject *cache, MVMSpeshCallInfo *arg_info); MoarVM-2015.11/src/6model/reprs/MVMNull.c0000644000175000017500000000521012456307241016620 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNull); }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "Cannot create an instance of null type"); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot clone null type"); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { MVM_exception_throw_adhoc(tc, "Cannot compose null type"); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNull); } /* Initializes the representation. */ const MVMREPROps * MVMNull_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Null", /* name */ MVM_REPR_ID_MVMNull, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMNull.h0000644000175000017500000000053312456307241016630 0ustar jnthnjnthn/* Representation used by the null REPR. */ struct MVMNull { MVMObject common; }; /* Function for REPR setup. */ const MVMREPROps * MVMNull_initialize(MVMThreadContext *tc); /* Macro for VM null checks. */ MVM_STATIC_INLINE MVMint64 MVM_is_null(MVMThreadContext *tc, MVMObject *check) { return !check || check == tc->instance->VMNull; } MoarVM-2015.11/src/6model/reprs/MVMOSHandle.c0000644000175000017500000000717512573775575017402 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMOSHandle); }); return st->WHAT; } /* Initializes the handle with the mutex all handles need. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMOSHandleBody *handle = (MVMOSHandleBody *)data; handle->mutex = MVM_malloc(sizeof(uv_mutex_t)); uv_mutex_init(handle->mutex); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { /* can't be copied because then we could never know when gc_free should * close the handle (unless we did some refcounting on a shared container). * note - 12:25 I mean, Perl 6 will has an attribute which * is the MoarVM handle, so a .clone() on a Perl 6 IO object * won't trigger cloning of the underlying handle. */ MVM_exception_throw_adhoc(tc, "Cannot copy object with repr OSHandle"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMOSHandleBody *handle = (MVMOSHandleBody *)data; if (handle->ops && handle->ops->gc_mark) handle->ops->gc_mark(tc, handle->data, worklist); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMOSHandle *handle = (MVMOSHandle *)obj; if (handle->body.ops && handle->body.ops->gc_free) handle->body.ops->gc_free(tc, obj, handle->body.data); if (handle->body.mutex) { uv_mutex_destroy(handle->body.mutex); MVM_free(handle->body.mutex); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMOSHandle_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMOSHandle", /* name */ MVM_REPR_ID_MVMOSHandle, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMOSHandle.h0000644000175000017500000000106312456307241017352 0ustar jnthnjnthn/* Representation used by VM-level OS handles. */ struct MVMOSHandleBody { /* The function table for this handle, determining how it will process * various kinds of I/O related operations. */ const MVMIOOps *ops; /* Any data a particular set of I/O functions wishes to store. */ void *data; /* Mutex protecting access to this I/O handle. */ uv_mutex_t *mutex; }; struct MVMOSHandle { MVMObject common; MVMOSHandleBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMOSHandle_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMStaticFrame.c0000644000175000017500000002423512573775575020143 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { MVM_exception_throw_adhoc(tc, "Cannot invoke static frame object"); } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMStaticFrame); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMStaticFrameBody *src_body = (MVMStaticFrameBody *)src; MVMStaticFrameBody *dest_body = (MVMStaticFrameBody *)dest; if (!src_body->fully_deserialized) MVM_exception_throw_adhoc(tc, "Can only clone a fully deserialized MVMFrame"); dest_body->orig_bytecode = src_body->orig_bytecode; dest_body->bytecode_size = src_body->bytecode_size; if (src_body->bytecode == src_body->orig_bytecode) { /* Easy - the source MVMStaticFrameBody doesn't own the memory. */ dest_body->bytecode = src_body->bytecode; } else { /* We're going to need to make a copy, in case the source object gets GC'd before we do, and so they free memory we point to. */ /* If this gets to be a resource hog, then implement something more sophisticated. The easiest thing would be to bump the allocated size and value stored in bytecode by sizeof(MVMuint64), and use the extra space to store a reference count. */ dest_body->bytecode = MVM_malloc(src_body->bytecode_size); memcpy(dest_body->bytecode, src_body->bytecode, src_body->bytecode_size); } MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->cu, src_body->cu); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->cuuid, src_body->cuuid); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->static_code, src_body->static_code); dest_body->num_locals = src_body->num_locals; dest_body->num_lexicals = src_body->num_lexicals; { MVMuint16 *local_types = MVM_malloc(sizeof(MVMuint16) * src_body->num_locals); MVMuint16 *lexical_types = MVM_malloc(sizeof(MVMuint16) * src_body->num_lexicals); memcpy(local_types, src_body->local_types, sizeof(MVMuint16) * src_body->num_locals); memcpy(lexical_types, src_body->lexical_types, sizeof(MVMuint16) * src_body->num_lexicals); dest_body->local_types = local_types; dest_body->lexical_types = lexical_types; } { MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->lexical_names, current, tmp, bucket_tmp) { size_t klen; void *kdata; MVMLexicalRegistry *new_entry = MVM_malloc(sizeof(MVMLexicalRegistry)); /* don't need to clone the string */ MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->key, current->key); new_entry->value = current->value; MVM_HASH_EXTRACT_KEY(tc, &kdata, &klen, current->key, "really broken") HASH_ADD_KEYPTR(hash_handle, dest_body->lexical_names, kdata, klen, new_entry); } } /* Static environment needs to be copied, and any objects WB'd. */ if (src_body->env_size) { MVMuint16 *type_map = src_body->lexical_types; MVMuint16 count = src_body->num_lexicals; MVMuint16 i; dest_body->static_env = MVM_malloc(src_body->env_size); memcpy(dest_body->static_env, src_body->static_env, src_body->env_size); dest_body->static_env_flags = MVM_malloc(src_body->num_lexicals); memcpy(dest_body->static_env_flags, src_body->static_env_flags, src_body->num_lexicals); for (i = 0; i < count; i++) { if (type_map[i] == MVM_reg_str) { MVM_gc_write_barrier(tc, (MVMCollectable *)dest_root, (MVMCollectable *)dest_body->static_env[i].s); } else if (type_map[i] == MVM_reg_obj) { MVM_gc_write_barrier(tc, (MVMCollectable *)dest_root, (MVMCollectable *)dest_body->static_env[i].o); } } } dest_body->env_size = src_body->env_size; dest_body->work_size = src_body->work_size; if (src_body->outer) MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->outer, src_body->outer); dest_body->num_handlers = src_body->num_handlers; dest_body->handlers = MVM_malloc(src_body->num_handlers * sizeof(MVMFrameHandler)); memcpy(dest_body->handlers, src_body->handlers, src_body->num_handlers * sizeof(MVMFrameHandler)); dest_body->instrumentation_level = 0; dest_body->pool_index = src_body->pool_index; dest_body->num_annotations = src_body->num_annotations; dest_body->annotations_data = src_body->annotations_data; dest_body->fully_deserialized = 1; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMStaticFrameBody *body = (MVMStaticFrameBody *)data; MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; /* mvmobjects */ MVM_gc_worklist_add(tc, worklist, &body->cu); MVM_gc_worklist_add(tc, worklist, &body->cuuid); MVM_gc_worklist_add(tc, worklist, &body->name); MVM_gc_worklist_add(tc, worklist, &body->outer); MVM_gc_worklist_add(tc, worklist, &body->static_code); /* If it's not fully deserialized, none of the following can apply. */ if (!body->fully_deserialized) return; /* lexical names hash keys */ HASH_ITER(hash_handle, body->lexical_names, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->key); } /* static env */ if (body->static_env) { MVMuint16 *type_map = body->lexical_types; MVMuint16 count = body->num_lexicals; MVMuint16 i; for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &body->static_env[i].o); } /* Spesh slots. */ if (body->num_spesh_candidates) { MVMint32 i, j; for (i = 0; i < body->num_spesh_candidates; i++) { for (j = 0; j < body->spesh_candidates[i].num_guards; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i].guards[j].match); for (j = 0; j < body->spesh_candidates[i].num_spesh_slots; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i].spesh_slots[j]); if (body->spesh_candidates[i].log_slots) for (j = 0; j < body->spesh_candidates[i].num_log_slots * MVM_SPESH_LOG_RUNS; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i].log_slots[j]); for (j = 0; j < body->spesh_candidates[i].num_inlines; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i].inlines[j].code); if (body->spesh_candidates[i].sg) MVM_spesh_graph_mark(tc, body->spesh_candidates[i].sg, worklist); } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMStaticFrame *sf = (MVMStaticFrame *)obj; MVMStaticFrameBody *body = &sf->body; MVMint32 i; if (body->orig_bytecode != body->bytecode) { MVM_free(body->bytecode); body->bytecode = body->orig_bytecode; } /* If it's not fully deserialized, none of the following can apply. */ if (!body->fully_deserialized) return; MVM_free(body->instr_offsets); MVM_free(body->handlers); MVM_free(body->static_env); MVM_free(body->static_env_flags); MVM_free(body->local_types); MVM_free(body->lexical_types); MVM_free(body->lexical_names_list); MVM_HASH_DESTROY(hash_handle, MVMLexicalRegistry, body->lexical_names); for (i = 0; i < body->num_spesh_candidates; i++) MVM_spesh_candidate_destroy(tc, &body->spesh_candidates[i]); MVM_free(body->spesh_candidates); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { /* XXX in the end we'll support inlining of this... */ return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMStaticFrame_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMStaticFrame", /* name */ MVM_REPR_ID_MVMStaticFrame, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMStaticFrame.h0000644000175000017500000001003612456307241020117 0ustar jnthnjnthn/* Representation for static code in the VM. Partially populated on first * call or usage. */ struct MVMStaticFrameBody { /* The start of the stream of bytecode for this routine. */ MVMuint8 *bytecode; /* The compilation unit this frame belongs to. */ MVMCompUnit *cu; /* The list of local types. */ MVMuint16 *local_types; /* The list of lexical types. */ MVMuint16 *lexical_types; /* Lexicals name map. */ MVMLexicalRegistry *lexical_names; MVMLexicalRegistry **lexical_names_list; /* Defaults for lexicals upon new frame creation. */ MVMRegister *static_env; /* Flags for static environment (0 = static, 1 = clone, 2 = state). */ MVMuint8 *static_env_flags; /* If the frame has state variables. */ MVMuint32 has_state_vars; /* Zero if the frame was never invoked. Above zero is the instrumentation * level the VM was atlast time the frame was invoked. See MVMInstance for * the VM instance wide field for this. */ MVMuint32 instrumentation_level; /* Rough call count. May be hit up by multiple threads, and lose the odd * count, but that's fine; it's just a rough indicator, used to make * decisions about optimization. */ MVMuint32 invocations; /* Number of times we should invoke before spesh applies. */ MVMuint32 spesh_threshold; /* Specializations array, if there are any. */ MVMSpeshCandidate *spesh_candidates; MVMuint32 num_spesh_candidates; /* The size in bytes to allocate for the lexical environment. */ MVMuint32 env_size; /* The size in bytes to allocate for the work and arguments area. */ MVMuint32 work_size; /* The size of the bytecode. */ MVMuint32 bytecode_size; /* Count of locals. */ MVMuint32 num_locals; /* Count of lexicals. */ MVMuint32 num_lexicals; /* Frame exception handlers information. */ MVMFrameHandler *handlers; /* The number of exception handlers this frame has. */ MVMuint32 num_handlers; /* The compilation unit unique ID of this frame. */ MVMString *cuuid; /* The name of this frame. */ MVMString *name; /* This frame's static outer frame. */ MVMStaticFrame *outer; /* the static coderef */ MVMCode *static_code; /* Index into each threadcontext's table of frame pools. */ MVMuint32 pool_index; /* Annotation details */ MVMuint32 num_annotations; MVMuint8 *annotations_data; /* Cached instruction offsets */ MVMuint8 *instr_offsets; /* Does the frame have an exit handler we need to run? */ MVMuint8 has_exit_handler; /* Is the frame a thunk, and thus hidden to caller/outer? */ MVMuint8 is_thunk; /* Is the frame full deserialized? */ MVMuint8 fully_deserialized; /* The original bytecode for this frame (before endian swapping). */ MVMuint8 *orig_bytecode; /* The serialized data about this frame, used to set up the things above * marked (lazy). Also, once we've done that, the static lexical wvals * data pos; we may be able to re-use the same slot for these to. */ MVMuint8 *frame_data_pos; MVMuint8 *frame_static_lex_pos; /* Off-by-one SC dependency index (zero indicates invalid) for the code * object, plus the index of it within that SC. This is relevant for the * static_code only. */ MVMint32 code_obj_sc_dep_idx; MVMint32 code_obj_sc_idx; /* Profiling/instrumented version of the bytecode, if we're profiling. * Also, a backup of the uninstrumented bytecode in case we turn off * profiling. Same for handlers. */ MVMuint8 *instrumented_bytecode; MVMuint8 *uninstrumented_bytecode; MVMFrameHandler *instrumented_handlers; MVMFrameHandler *uninstrumented_handlers; MVMuint32 uninstrumented_bytecode_size; MVMuint32 instrumented_bytecode_size; }; struct MVMStaticFrame { MVMObject common; MVMStaticFrameBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMStaticFrame_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMString.c0000644000175000017500000001047512554473060017167 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMString); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMStringBody *src_body = (MVMStringBody *)src; MVMStringBody *dest_body = (MVMStringBody *)dest; dest_body->storage_type = src_body->storage_type; dest_body->num_strands = src_body->num_strands; dest_body->num_graphs = src_body->num_graphs; dest_body->cached_hash_code = src_body->cached_hash_code; switch (dest_body->storage_type) { case MVM_STRING_GRAPHEME_32: if (dest_body->num_graphs) { dest_body->storage.blob_32 = MVM_malloc(dest_body->num_graphs * sizeof(MVMGrapheme32)); memcpy(dest_body->storage.blob_32, src_body->storage.blob_32, dest_body->num_graphs * sizeof(MVMGrapheme32)); } break; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: if (dest_body->num_graphs) { dest_body->storage.blob_8 = MVM_malloc(dest_body->num_graphs); memcpy(dest_body->storage.blob_8, src_body->storage.blob_8, dest_body->num_graphs); } case MVM_STRING_STRAND: dest_body->storage.strands = MVM_malloc(dest_body->num_strands * sizeof(MVMStringStrand)); memcpy(dest_body->storage.strands, src_body->storage.strands, dest_body->num_strands * sizeof(MVMStringStrand)); default: MVM_exception_throw_adhoc(tc, "Internal string corruption"); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMStringBody *body = (MVMStringBody *)data; if (body->storage_type == MVM_STRING_STRAND) { MVMStringStrand *strands = body->storage.strands; MVMuint16 i; for (i = 0; i < body->num_strands; i++) MVM_gc_worklist_add(tc, worklist, &(strands[i].blob_string)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMString *str = (MVMString *)obj; MVM_free(str->body.storage.any); str->body.num_graphs = str->body.num_strands = 0; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMString_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMString", /* name */ MVM_REPR_ID_MVMString, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMString.h0000644000175000017500000000444112456307241017166 0ustar jnthnjnthn/* Representation used by VM-level strings. * * Strings come in one of 3 forms today, with 1 expected future form: * - 32-bit someday-NFG buffer of codepoints, maybe with synthetics * - 8-bit buffer of codepoints that all fall in the ASCII range * - Buffer of strands * - (LATER) 8-bit buffer of codepoints with negatives as synthetics (we * draw out a distinction with the ASCII range buffer because we can do * some I/O simplifications when we know all is in the ASCII range). * * A buffer of strands represents a string made up of other non-strand * strings. That is, there's no recursive strands. This simplifies the * process of iteration enormously. A strand may refer to just part of * another string by specifying offsets. Furthermore, it may specify a * repetition count. */ /* Kinds of grapheme we may hold in a string. */ typedef MVMint32 MVMGrapheme32; typedef MVMint8 MVMGraphemeASCII; typedef MVMint8 MVMGrapheme8; /* Future use */ /* What kind of data is a string storing? */ #define MVM_STRING_GRAPHEME_32 0 #define MVM_STRING_GRAPHEME_ASCII 1 #define MVM_STRING_GRAPHEME_8 2 #define MVM_STRING_STRAND 3 /* String index data type, for when we talk about indexes. */ typedef MVMuint32 MVMStringIndex; /* Data type for a Unicode codepoint. */ typedef MVMint32 MVMCodepoint; /* Maximum number of strands we will have. */ #define MVM_STRING_MAX_STRANDS 64 /* The body of a string. */ struct MVMStringBody { union { MVMGrapheme32 *blob_32; MVMGraphemeASCII *blob_ascii; MVMGrapheme8 *blob_8; MVMStringStrand *strands; void *any; } storage; MVMuint16 storage_type; MVMuint16 num_strands; MVMuint32 num_graphs; MVMint32 cached_hash_code; }; /* A strand of a string. */ struct MVMStringStrand { /* Another string that must some kind of grapheme string. */ MVMString *blob_string; /* Start and end indexes we refer to in the blob string. */ MVMStringIndex start; MVMStringIndex end; /* Number of repetitions. */ MVMuint32 repetitions; }; /* The MVMString, with header and body. */ struct MVMString { MVMObject common; MVMStringBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMString_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MVMThread.c0000644000175000017500000000554112456307241017124 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMThread); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation MVMThread"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMThreadBody *body = (MVMThreadBody *)data; MVM_gc_worklist_add(tc, worklist, &body->invokee); MVM_gc_worklist_add(tc, worklist, &body->next); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { /* The ThreadContext has already been destroyed by the GC. */ MVMThread *thread = (MVMThread *)obj; thread->body.invokee = NULL; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMThread_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMThread", /* name */ MVM_REPR_ID_MVMThread, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MVMThread.h0000644000175000017500000000244512574526172017140 0ustar jnthnjnthn/* Various stages a thread can be in. */ typedef enum { MVM_thread_stage_unstarted = 0, MVM_thread_stage_starting = 1, MVM_thread_stage_waiting = 2, MVM_thread_stage_started = 3, MVM_thread_stage_exited = 4, MVM_thread_stage_clearing_nursery = 5, MVM_thread_stage_destroyed = 6 } MVMThreadStages; /* Representation used for VM thread handles. */ struct MVMThreadBody { /* The code object we will invoke to start the thread.. */ MVMObject *invokee; /* The underlying OS thread handle. */ uv_thread_t thread; /* The thread context for the thread. */ MVMThreadContext *tc; /* Next in tc's threads list. */ MVMThread *next; /* The current stage the thread is in (one of MVMThreadStages). */ AO_t stage; /* Thread's OS-level thread ID. */ MVMint64 native_thread_id; /* Copy of the VM-level thread ID (also stored in the ThreadContext while * the thread is alive). */ MVMuint32 thread_id; /* Non-zero if the thread should not block shutdown of the VM (those with * zero in here will be joined when the main thread ends). */ MVMint32 app_lifetime; }; struct MVMThread { MVMObject common; MVMThreadBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMThread_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/MultiDimArray.c0000644000175000017500000010203012573775575020072 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Computes the flat number of elements from the given dimension list. */ static MVMint64 flat_elements(MVMint64 num_dimensions, MVMint64 *dimensions) { MVMint64 result = dimensions[0]; MVMint64 i; for (i = 1; i < num_dimensions; i++) result *= dimensions[i]; return result; } /* Computes the flat size from representation data. */ static size_t flat_size(MVMMultiDimArrayREPRData *repr_data, MVMint64 *dimensions) { return repr_data->elem_size * flat_elements(repr_data->num_dimensions, dimensions); } /* Takes a number of dimensions, indices we were passed, and dimension sizes. * Computes the offset into flat space. */ MVM_STATIC_INLINE size_t indices_to_flat_index(MVMThreadContext *tc, MVMint64 num_dimensions, MVMint64 *dimensions, MVMint64 *indices) { MVMint64 multiplier = 1; size_t result = 0; MVMint64 i; for (i = num_dimensions - 1; i >= 0; i--) { MVMint64 dim_size = dimensions[i]; MVMint64 index = indices[i]; if (index >= 0 && index < dim_size) { result += index * multiplier; multiplier *= dim_size; } else { MVM_exception_throw_adhoc(tc, "Index %"PRId64" for dimension %"PRId64" out of range (must be 0..%"PRId64")", index, i + 1, dim_size - 1); } } return result; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMMultiDimArray); }); return st->WHAT; } /* Allocates the mutli-dimensional array and sets up its dimensions array with * all zeroes, for later filling. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVMObject *obj = MVM_gc_allocate_object(tc, st); ((MVMMultiDimArray *)obj)->body.dimensions = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, repr_data->num_dimensions * sizeof(MVMint64)); return obj; } else { MVM_exception_throw_adhoc(tc, "Cannot allocate a multi-dim array type before it is composed"); } } /* Composes the representation. */ static void spec_to_repr_data(MVMThreadContext *tc, MVMMultiDimArrayREPRData *repr_data, const MVMStorageSpec *spec) { switch (spec->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: if (spec->is_unsigned) { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_U64; repr_data->elem_size = sizeof(MVMuint64); break; case 32: repr_data->slot_type = MVM_ARRAY_U32; repr_data->elem_size = sizeof(MVMuint32); break; case 16: repr_data->slot_type = MVM_ARRAY_U16; repr_data->elem_size = sizeof(MVMuint16); break; case 8: repr_data->slot_type = MVM_ARRAY_U8; repr_data->elem_size = sizeof(MVMuint8); break; case 4: repr_data->slot_type = MVM_ARRAY_U4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_U2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_U1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported uint size"); } } else { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_I64; repr_data->elem_size = sizeof(MVMint64); break; case 32: repr_data->slot_type = MVM_ARRAY_I32; repr_data->elem_size = sizeof(MVMint32); break; case 16: repr_data->slot_type = MVM_ARRAY_I16; repr_data->elem_size = sizeof(MVMint16); break; case 8: repr_data->slot_type = MVM_ARRAY_I8; repr_data->elem_size = sizeof(MVMint8); break; case 4: repr_data->slot_type = MVM_ARRAY_I4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_I2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_I1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported int size"); } } break; case MVM_STORAGE_SPEC_BP_NUM: switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_N64; repr_data->elem_size = sizeof(MVMnum64); break; case 32: repr_data->slot_type = MVM_ARRAY_N32; repr_data->elem_size = sizeof(MVMnum32); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported num size"); } break; case MVM_STORAGE_SPEC_BP_STR: repr_data->slot_type = MVM_ARRAY_STR; repr_data->elem_size = sizeof(MVMString *); break; default: repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { MVMStringConsts *str_consts = &(tc->instance->str_consts); MVMMultiDimArrayREPRData *repr_data; MVMObject *info = MVM_repr_at_key_o(tc, repr_info, str_consts->array); if (!MVM_is_null(tc, info)) { MVMObject *dims = MVM_repr_at_key_o(tc, info, str_consts->dimensions); MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts->type); MVMint64 dimensions; if (!MVM_is_null(tc, dims)) { dimensions = MVM_repr_get_int(tc, dims); if (dimensions < 1) MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with at least 1 dimension"); repr_data = MVM_calloc(1, sizeof(MVMMultiDimArrayREPRData)); repr_data->num_dimensions = dimensions; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with a number of dimensions"); } if (!MVM_is_null(tc, type)) { const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); spec_to_repr_data(tc, repr_data, spec); } else { repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } st->REPR_data = repr_data; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with array information"); } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *src_body = (MVMMultiDimArrayBody *)src; MVMMultiDimArrayBody *dest_body = (MVMMultiDimArrayBody *)dest; if (src_body->slots.any) { size_t dim_size = repr_data->num_dimensions * sizeof(MVMint64); size_t data_size = flat_size(repr_data, src_body->dimensions); dest_body->dimensions = MVM_fixed_size_alloc(tc, tc->instance->fsa, dim_size); dest_body->slots.any = MVM_fixed_size_alloc(tc, tc->instance->fsa, data_size); memcpy(dest_body->dimensions, src_body->dimensions, dim_size); memcpy(dest_body->slots.any, src_body->slots.any, data_size); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; if (body->slots.any) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMint64 flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); MVMint64 i; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: { MVMObject **slots = body->slots.o; for (i = 0; i < flat_elems; i++) MVM_gc_worklist_add(tc, worklist, &slots[i]); break; } case MVM_ARRAY_STR: { MVMString **slots = body->slots.s; for (i = 0; i < flat_elems; i++) MVM_gc_worklist_add(tc, worklist, &slots[i]); break; } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMMultiDimArray *arr = (MVMMultiDimArray *)obj; MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)STABLE(obj)->REPR_data; if (arr->body.slots.any) MVM_fixed_size_free(tc, tc->instance->fsa, flat_size(repr_data, arr->body.dimensions), arr->body.slots.any); MVM_fixed_size_free(tc, tc->instance->fsa, repr_data->num_dimensions * sizeof(MVMint64), arr->body.dimensions); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data == NULL) return; MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* Gets the storage specification for this representation. */ static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the data held in the array. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; MVMint64 i, flat_elems; /* Write out dimensions. */ for (i = 0; i < repr_data->num_dimensions; i++) MVM_serialization_write_varint(tc, writer, body->dimensions[i]); /* Write out values. */ flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); for (i = 0; i < flat_elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_serialization_write_ref(tc, writer, body->slots.o[i]); break; case MVM_ARRAY_STR: MVM_serialization_write_str(tc, writer, body->slots.s[i]); break; case MVM_ARRAY_I64: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i64[i]); break; case MVM_ARRAY_I32: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i32[i]); break; case MVM_ARRAY_I16: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i16[i]); break; case MVM_ARRAY_I8: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.i8[i]); break; case MVM_ARRAY_U64: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u64[i]); break; case MVM_ARRAY_U32: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u32[i]); break; case MVM_ARRAY_U16: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u16[i]); break; case MVM_ARRAY_U8: MVM_serialization_write_varint(tc, writer, (MVMint64)body->slots.u8[i]); break; case MVM_ARRAY_N64: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n64[i]); break; case MVM_ARRAY_N32: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n32[i]); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unhandled slot type"); } } } /* Deserializes the data held in the array. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; MVMint64 i, flat_elems; size_t size; /* Read in dimensions. */ for (i = 0; i < repr_data->num_dimensions; i++) body->dimensions[i] = MVM_serialization_read_varint(tc, reader); /* Allocate storage. */ body->slots.any = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, flat_size(repr_data, body->dimensions)); /* Read in elements. */ flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); for (i = 0; i < flat_elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[i], MVM_serialization_read_ref(tc, reader)); break; case MVM_ARRAY_STR: MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[i], MVM_serialization_read_str(tc, reader)); break; case MVM_ARRAY_I64: body->slots.i64[i] = MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I32: body->slots.i32[i] = (MVMint32)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I16: body->slots.i16[i] = (MVMint16)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_I8: body->slots.i8[i] = (MVMint8)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U64: body->slots.i64[i] = MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U32: body->slots.i32[i] = (MVMuint32)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U16: body->slots.i16[i] = (MVMuint16)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_U8: body->slots.i8[i] = (MVMuint8)MVM_serialization_read_varint(tc, reader); break; case MVM_ARRAY_N64: body->slots.n64[i] = MVM_serialization_read_num(tc, reader); break; case MVM_ARRAY_N32: body->slots.n32[i] = (MVMnum32)MVM_serialization_read_num(tc, reader); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unhandled slot type"); } } } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVM_serialization_write_int(tc, writer, repr_data->num_dimensions); MVM_serialization_write_ref(tc, writer, repr_data->elem_type); } else { MVM_serialization_write_int(tc, writer, 0); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMint64 num_dims = MVM_serialization_read_int(tc, reader); if (num_dims > 0) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)MVM_malloc(sizeof(MVMMultiDimArrayREPRData)); MVMObject *type; repr_data->num_dimensions = num_dims; type = MVM_serialization_read_ref(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); if (type) { MVM_serialization_force_stable(tc, reader, STABLE(type)); spec_to_repr_data(tc, repr_data, REPR(type)->get_storage_spec(tc, STABLE(type))); } else { repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } st->REPR_data = repr_data; } } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMMultiDimArray); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot push onto a fixed dimension array"); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot pop a fixed dimension array"); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot unshift onto a fixed dimension array"); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot shift a fixed dimension array"); } static void asplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { MVM_exception_throw_adhoc(tc, "Cannot splice a fixed dimension array"); } static void at_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_indices == repr_data->num_dimensions) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t flat_index = indices_to_flat_index(tc, repr_data->num_dimensions, body->dimensions, indices); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind == MVM_reg_obj) { MVMObject *found = body->slots.o[flat_index]; value->o = found ? found : tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected object register"); } break; case MVM_ARRAY_STR: if (kind == MVM_reg_str) value->s = body->slots.s[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected string register"); break; case MVM_ARRAY_I64: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I32: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I16: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i16[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I8: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i8[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_N64: if (kind == MVM_reg_num64) value->n64 = (MVMnum64)body->slots.n64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected num register"); break; case MVM_ARRAY_N32: if (kind == MVM_reg_num64) value->n64 = (MVMnum64)body->slots.n32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected num register"); break; case MVM_ARRAY_U64: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U32: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U16: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u16[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U8: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u8[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; default: MVM_exception_throw_adhoc(tc, "MultiDimArray: Unhandled slot type"); } } else { MVM_exception_throw_adhoc(tc, "Cannot access %"PRId64" dimension array with %"PRId64" indices", repr_data->num_dimensions, num_indices); } } static void bind_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_indices == repr_data->num_dimensions) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t flat_index = indices_to_flat_index(tc, repr_data->num_dimensions, body->dimensions, indices); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind == MVM_reg_obj) { MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[flat_index], value.o); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected object register"); } break; case MVM_ARRAY_STR: if (kind == MVM_reg_str) { MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[flat_index], value.s); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected string register"); } break; case MVM_ARRAY_I64: if (kind == MVM_reg_int64) body->slots.i64[flat_index] = value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I32: if (kind == MVM_reg_int64) body->slots.i32[flat_index] = (MVMint32)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I16: if (kind == MVM_reg_int64) body->slots.i16[flat_index] = (MVMint16)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I8: if (kind == MVM_reg_int64) body->slots.i8[flat_index] = (MVMint8)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_N64: if (kind == MVM_reg_num64) body->slots.n64[flat_index] = value.n64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected num register"); break; case MVM_ARRAY_N32: if (kind == MVM_reg_num64) body->slots.n32[flat_index] = (MVMnum32)value.n64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected num register"); break; case MVM_ARRAY_U64: if (kind == MVM_reg_int64) body->slots.u64[flat_index] = value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U32: if (kind == MVM_reg_int64) body->slots.u32[flat_index] = (MVMuint32)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U16: if (kind == MVM_reg_int64) body->slots.u16[flat_index] = (MVMuint16)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U8: if (kind == MVM_reg_int64) body->slots.u8[flat_index] = (MVMuint8)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; default: MVM_exception_throw_adhoc(tc, "MultiDimArray: Unhandled slot type"); } } else { MVM_exception_throw_adhoc(tc, "Cannot access %"PRId64" dimension array with %"PRId64" indices", repr_data->num_dimensions, num_indices); } } static void dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; *num_dimensions = repr_data->num_dimensions; *dimensions = body->dimensions; } else { MVM_exception_throw_adhoc(tc, "Cannot query a multi-dim array's dimensionality before it is composed"); } } static void set_dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_dimensions == repr_data->num_dimensions) { /* Note that we use an atomic operation at the point of allocation. * This means we can be leak-free and memory safe in the face of * multiple threads competing to set dimensions (unlikely in any * real world use case, but we should ensure the VM is memory safe). */ MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t size = flat_size(repr_data, dimensions); void *storage = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, size); if (MVM_trycas(&(body->slots.any), NULL, storage)) { /* Now memory is in place, safe to un-zero dimensions. */ memcpy(body->dimensions, dimensions, num_dimensions * sizeof(MVMint64)); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: can only set dimensions once"); } } else { MVM_exception_throw_adhoc(tc, "Array type of %"PRId64" dimensions cannot be intialized with %"PRId64" dimensions", repr_data->num_dimensions, num_dimensions); } } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { at_pos_multidim(tc, st, root, data, 1, &index, value, kind); } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { bind_pos_multidim(tc, st, root, data, 1, &index, value, kind); } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { set_dimensions(tc, st, root, data, 1, (MVMint64 *)&count); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMint64 _; MVMint64 *dims; dimensions(tc, st, root, data, &_, &dims); return (MVMuint64)dims[0]; } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMStorageSpec spec; /* initialise storage spec to default values */ spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; switch (repr_data->slot_type) { case MVM_ARRAY_STR: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_STR; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_STR; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec.is_unsigned = 1; break; default: spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; break; } return spec; } /* Initializes the representation. */ const MVMREPROps * MVMMultiDimArray_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, set_elems, push, pop, unshift, shift, asplice, at_pos_multidim, bind_pos_multidim, dimensions, set_dimensions, get_elem_storage_spec }, MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "MultiDimArray", /* name */ MVM_REPR_ID_MultiDimArray, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/MultiDimArray.h0000644000175000017500000000271312554473060020065 0ustar jnthnjnthn/* Body of a multi-dim array is two blobs of memory: one holding the sizes of * the dimensions, and another holding the storage. The number of dimensions * is part of the type. */ struct MVMMultiDimArrayBody { /* The sizes of the dimensions. */ MVMint64 *dimensions; /* 1D array of slots, which is the storage. We do the math on the * dimensions to get a mapping into here. Note that this memory is * fixed in size and never reallocated over the life of the array. */ union { MVMObject **o; MVMString **s; MVMint64 *i64; MVMint32 *i32; MVMint16 *i16; MVMint8 *i8; MVMnum64 *n64; MVMnum32 *n32; MVMuint64 *u64; MVMuint32 *u32; MVMuint16 *u16; MVMuint8 *u8; void *any; } slots; }; struct MVMMultiDimArray { MVMObject common; MVMMultiDimArrayBody body; }; /* REPR data specifies the type of array elements and number of dimensions we * have (the actual size of the dimensions is part of the value). */ struct MVMMultiDimArrayREPRData { /* Number of dimensions we have. */ MVMint64 num_dimensions; /* The size of each element. */ size_t elem_size; /* What type of slots we have. */ MVMuint8 slot_type; /* Type object for the element type. */ MVMObject *elem_type; }; /* Initializes the MultiDimArray REPR. */ const MVMREPROps * MVMMultiDimArray_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/NFA.c0000644000175000017500000010325612623370227015743 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNFA); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation NFA"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNFABody *lb = (MVMNFABody *)data; MVMint64 i, j; MVM_gc_worklist_add(tc, worklist, &lb->fates); for (i = 0; i < lb->num_states; i++) { MVMint64 edges = lb->num_state_edges[i]; for (j = 0; j < edges; j++) { switch (lb->states[i][j].act) { case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_gc_worklist_add(tc, worklist, &lb->states[i][j].arg.s); } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMNFA *nfa = (MVMNFA *)obj; MVMint64 i; for (i = 0; i < nfa->body.num_states; i++) if (nfa->body.num_state_edges[i]) MVM_free(nfa->body.states[i]); MVM_free(nfa->body.states); MVM_free(nfa->body.num_state_edges); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMNFABody *body = (MVMNFABody *)data; MVMint64 i, j; /* Write fates. */ MVM_serialization_write_ref(tc, writer, body->fates); /* Write number of states. */ MVM_serialization_write_varint(tc, writer, body->num_states); /* Write state edge list counts. */ for (i = 0; i < body->num_states; i++) MVM_serialization_write_varint(tc, writer, body->num_state_edges[i]); /* Write state graph. */ for (i = 0; i < body->num_states; i++) { for (j = 0; j < body->num_state_edges[i]; j++) { MVM_serialization_write_varint(tc, writer, body->states[i][j].act); MVM_serialization_write_varint(tc, writer, body->states[i][j].to); switch (body->states[i][j].act & 0xff) { case MVM_NFA_EDGE_FATE: MVM_serialization_write_varint(tc, writer, body->states[i][j].arg.i); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMGrapheme32 g = body->states[i][j].arg.g; if (g >= 0) { /* Non-synthetic. */ MVM_serialization_write_varint(tc, writer, g); } else { /* Synthetic. Write the number of codepoints negated, * and then each of the codepoints. */ MVMNFGSynthetic *si = MVM_nfg_get_synthetic_info(tc, g); MVMint32 k; MVM_serialization_write_varint(tc, writer, -(si->num_combs + 1)); MVM_serialization_write_varint(tc, writer, si->base); for (k = 0; k < si->num_combs; k++) MVM_serialization_write_varint(tc, writer, si->combs[k]); } break; } case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: MVM_serialization_write_varint(tc, writer, body->states[i][j].arg.i); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_serialization_write_str(tc, writer, body->states[i][j].arg.s); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVM_serialization_write_varint(tc, writer, body->states[i][j].arg.uclc.lc); MVM_serialization_write_varint(tc, writer, body->states[i][j].arg.uclc.uc); break; } } } } } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMNFABody *body = (MVMNFABody *)data; MVMint64 i, j; /* Read fates. */ body->fates = MVM_serialization_read_ref(tc, reader); /* Read number of states. */ body->num_states = MVM_serialization_read_varint(tc, reader); if (body->num_states > 0) { /* Read state edge list counts. */ body->num_state_edges = MVM_malloc(body->num_states * sizeof(MVMint64)); for (i = 0; i < body->num_states; i++) body->num_state_edges[i] = MVM_serialization_read_varint(tc, reader); /* Read state graph. */ body->states = MVM_malloc(body->num_states * sizeof(MVMNFAStateInfo *)); for (i = 0; i < body->num_states; i++) { MVMint64 edges = body->num_state_edges[i]; if (edges > 0) body->states[i] = MVM_malloc(edges * sizeof(MVMNFAStateInfo)); for (j = 0; j < edges; j++) { body->states[i][j].act = MVM_serialization_read_varint(tc, reader); body->states[i][j].to = MVM_serialization_read_varint(tc, reader); switch (body->states[i][j].act & 0xff) { case MVM_NFA_EDGE_FATE: body->states[i][j].arg.i = MVM_serialization_read_varint(tc, reader); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMint64 cp_or_synth_count = MVM_serialization_read_varint(tc, reader); if (cp_or_synth_count >= 0) { body->states[i][j].arg.g = (MVMGrapheme32)cp_or_synth_count; } else { MVMint32 num_codes = -cp_or_synth_count; MVMCodepoint *codes = MVM_malloc(num_codes * sizeof(MVMCodepoint)); MVMint32 k; for (k = 0; k < num_codes; k++) codes[k] = (MVMCodepoint)MVM_serialization_read_varint(tc, reader); body->states[i][j].arg.g = MVM_nfg_codes_to_grapheme(tc, codes, num_codes); MVM_free(codes); } break; } case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: body->states[i][j].arg.i = MVM_serialization_read_varint(tc, reader); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_ASSIGN_REF(tc, &(root->header), body->states[i][j].arg.s, MVM_serialization_read_str(tc, reader)); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { body->states[i][j].arg.uclc.lc = MVM_serialization_read_varint(tc, reader); body->states[i][j].arg.uclc.uc = MVM_serialization_read_varint(tc, reader); break; } } } } } } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNFA); } /* Initializes the representation. */ const MVMREPROps * MVMNFA_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "NFA", /* name */ MVM_REPR_ID_NFA, 0, /* refs_frames */ }; /* We may be provided a grapheme as a codepoint for non-synthetics, or as a * 1-char string for synthetics. */ static MVMGrapheme32 get_grapheme(MVMThreadContext *tc, MVMObject *obj) { /* Handle null and non-concrete case. */ if (MVM_is_null(tc, obj) || !IS_CONCRETE(obj)) { MVM_exception_throw_adhoc(tc, "NFA must be provided with a concrete string or integer for graphemes"); } /* Otherwise, guess something appropriate. */ else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) return MVM_string_get_grapheme_at(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)), 0); else MVM_exception_throw_adhoc(tc, "NFA must be provided with a string or integer for graphemes"); } } MVMObject * MVM_nfa_from_statelist(MVMThreadContext *tc, MVMObject *states, MVMObject *nfa_type) { MVMObject *nfa_obj; MVMNFABody *nfa; MVMint64 i, j, num_states; MVMROOT(tc, states, { MVMROOT(tc, nfa_type, { /* Create NFA object. */ nfa_obj = MVM_repr_alloc_init(tc, nfa_type); nfa = (MVMNFABody *)OBJECT_BODY(nfa_obj); /* The first state entry is the fates list. */ nfa->fates = MVM_repr_at_pos_o(tc, states, 0); /* Go over the rest and convert to the NFA. */ num_states = MVM_repr_elems(tc, states) - 1; nfa->num_states = num_states; if (num_states > 0) { nfa->num_state_edges = MVM_malloc(num_states * sizeof(MVMint64)); nfa->states = MVM_malloc(num_states * sizeof(MVMNFAStateInfo *)); } for (i = 0; i < num_states; i++) { MVMObject *edge_info = MVM_repr_at_pos_o(tc, states, i + 1); MVMint64 elems = MVM_repr_elems(tc, edge_info); MVMint64 edges = elems / 3; MVMint64 cur_edge = 0; nfa->num_state_edges[i] = edges; if (edges > 0) nfa->states[i] = MVM_malloc(edges * sizeof(MVMNFAStateInfo)); for (j = 0; j < elems; j += 3) { MVMint64 act = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j)); MVMint64 to = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 2)); nfa->states[i][cur_edge].act = act; nfa->states[i][cur_edge].to = to; switch (act & 0xff) { case MVM_NFA_EDGE_FATE: nfa->states[i][cur_edge].arg.i = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: nfa->states[i][cur_edge].arg.g = get_grapheme(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: nfa->states[i][cur_edge].arg.i = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_ASSIGN_REF(tc, &(nfa_obj->header), nfa->states[i][cur_edge].arg.s, MVM_repr_get_str(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1))); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: /* That is not about uppercase/lowercase here, but lower and upper bounds of our range. */ case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVMObject *arg = MVM_repr_at_pos_o(tc, edge_info, j + 1); nfa->states[i][cur_edge].arg.uclc.lc = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, arg, 0)); nfa->states[i][cur_edge].arg.uclc.uc = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, arg, 1)); break; } } cur_edge++; } } }); }); return nfa_obj; } /* Does a run of the NFA. Produces a list of integers indicating the * chosen ordering. */ static MVMint64 * nqp_nfa_run(MVMThreadContext *tc, MVMNFABody *nfa, MVMString *target, MVMint64 offset, MVMint64 *total_fates_out) { MVMint64 eos = MVM_string_graphs(tc, target); MVMint64 gen = 1; MVMint64 numcur = 0; MVMint64 numnext = 0; MVMint64 *done, *fates, *curst, *nextst, *longlit; MVMint64 i, fate_arr_len, num_states, total_fates, prev_fates, usedlonglit; MVMint64 orig_offset = offset; int nfadeb = tc->instance->nfa_debug_enabled; /* Obtain or (re)allocate "done states", "current states" and "next * states" arrays. */ num_states = nfa->num_states; if (tc->nfa_alloc_states < num_states) { size_t alloc = (num_states + 1) * sizeof(MVMint64); tc->nfa_done = (MVMint64 *)MVM_realloc(tc->nfa_done, alloc); tc->nfa_curst = (MVMint64 *)MVM_realloc(tc->nfa_curst, alloc); tc->nfa_nextst = (MVMint64 *)MVM_realloc(tc->nfa_nextst, alloc); tc->nfa_alloc_states = num_states; } done = tc->nfa_done; curst = tc->nfa_curst; nextst = tc->nfa_nextst; memset(done, 0, (num_states + 1) * sizeof(MVMint64)); /* Allocate fates array. */ fate_arr_len = 1 + MVM_repr_elems(tc, nfa->fates); if (tc->nfa_fates_len < fate_arr_len) { tc->nfa_fates = (MVMint64 *)MVM_realloc(tc->nfa_fates, sizeof(MVMint64) * fate_arr_len); tc->nfa_fates_len = fate_arr_len; } fates = tc->nfa_fates; total_fates = 0; if (nfadeb) fprintf(stderr,"======================================\nStarting with %d fates in %d states\n", (int)fate_arr_len, (int)num_states) ; /* longlit will be updated on a fate whenever NFA passes through final char of a literal. */ /* These edges are specially marked to indicate which fate they influence the fate of. */ if (tc->nfa_longlit_len < fate_arr_len) { tc->nfa_longlit = (MVMint64 *)MVM_realloc(tc->nfa_longlit, sizeof(MVMint64) * fate_arr_len); tc->nfa_longlit_len = fate_arr_len; } longlit = tc->nfa_longlit; usedlonglit = 0; nextst[numnext++] = 1; while (numnext && offset <= eos) { /* Swap next and current */ MVMint64 *temp = curst; curst = nextst; nextst = temp; numcur = numnext; numnext = 0; /* Save how many fates we have before this position is considered. */ prev_fates = total_fates; if (nfadeb) { if (offset < eos) { MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); fprintf(stderr,"%c with %ds target %lx offset %lld\n",cp,(int)numcur, (long)target, offset); } else { fprintf(stderr,"EOS with %ds\n",(int)numcur); } } while (numcur) { MVMNFAStateInfo *edge_info; MVMint64 edge_info_elems; MVMint64 st = curst[--numcur]; if (st <= num_states) { if (done[st] == gen) continue; done[st] = gen; } edge_info = nfa->states[st - 1]; edge_info_elems = nfa->num_state_edges[st - 1]; if (nfadeb) fprintf(stderr,"\t%d\t%d\t",(int)st, (int)edge_info_elems); for (i = 0; i < edge_info_elems; i++) { MVMint64 act = edge_info[i].act; MVMint64 to = edge_info[i].to; /* All the special cases are under one test. */ if (act <= MVM_NFA_EDGE_EPSILON) { if (act < 0) { /* Negative indicates a fate is encoded in the act of the codepoint edge. */ /* These will redispatch to one of the _LL cases below */ act &= 0xff; } else if (act == MVM_NFA_EDGE_FATE) { /* Crossed a fate edge. Check if we already saw this fate, and * if so remove the entry so we can re-add at the new token length. */ MVMint64 arg = edge_info[i].arg.i; MVMint64 j; MVMint64 found_fate = 0; arg &= 0xffffff; /* XXX can go away after rebootstrap */ if (nfadeb) fprintf(stderr, "fate(%016llx) ", (long long unsigned int)arg); for (j = 0; j < total_fates; j++) { if (found_fate) fates[j - found_fate] = fates[j]; if ((fates[j] & 0xffffff) == arg) { found_fate++; if (j < prev_fates) prev_fates--; } } total_fates -= found_fate; if (arg < usedlonglit) arg -= longlit[arg] << 24; if (++total_fates > fate_arr_len) { /* should never happen if nfa->fates is correct and dedup above works right */ fprintf(stderr, "oops adding %016llx to\n", (long long unsigned int)arg); for (j = 0; j < total_fates - 1; j++) { fprintf(stderr, " %016llx\n", (long long unsigned int)fates[j]); } fate_arr_len = total_fates + 10; tc->nfa_fates = (MVMint64 *)MVM_realloc(tc->nfa_fates, sizeof(MVMint64) * fate_arr_len); tc->nfa_fates_len = fate_arr_len; fates = tc->nfa_fates; } /* a small insertion sort */ j = total_fates - 1; while (--j >= prev_fates && fates[j] < arg) { fates[j + 1] = fates[j]; } fates[++j] = arg; continue; } else if (act == MVM_NFA_EDGE_EPSILON && to <= num_states && done[to] != gen) { if (to) curst[numcur++] = to; else if (nfadeb) /* XXX should turn into a "can't happen" after rebootstrap */ fprintf(stderr, " oops, ignoring epsilon to 0\n"); continue; } } if (offset >= eos) { /* Can't match, so drop state. */ continue; } else { switch (act) { case MVM_NFA_EDGE_CODEPOINT_LL: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) == arg) { MVMint64 fate = (edge_info[i].act >> 8) & 0xfffff; nextst[numnext++] = to; while (usedlonglit <= fate) longlit[usedlonglit++] = 0; longlit[fate] = offset - orig_offset + 1; if (nfadeb) fprintf(stderr, "%d->%d ", (int)i, (int)to); } continue; } case MVM_NFA_EDGE_CODEPOINT: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) == arg) { nextst[numnext++] = to; if (nfadeb) fprintf(stderr, "%d->%d ", (int)i, (int)to); } continue; } case MVM_NFA_EDGE_CODEPOINT_NEG: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) != arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARCLASS: { MVMint64 arg = edge_info[i].arg.i; if (MVM_string_is_cclass(tc, arg, target, offset)) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARCLASS_NEG: { MVMint64 arg = edge_info[i].arg.i; if (!MVM_string_is_cclass(tc, arg, target, offset)) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARLIST: { MVMString *arg = edge_info[i].arg.s; MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (MVM_string_index_of_grapheme(tc, arg, cp) >= 0) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARLIST_NEG: { MVMString *arg = edge_info[i].arg.s; MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (MVM_string_index_of_grapheme(tc, arg, cp) < 0) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CODEPOINT_I_LL: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord == lc_arg || ord == uc_arg) { MVMint64 fate = (edge_info[i].act >> 8) & 0xfffff; nextst[numnext++] = to; while (usedlonglit <= fate) longlit[usedlonglit++] = 0; longlit[fate] = offset - orig_offset + 1; } continue; } case MVM_NFA_EDGE_CODEPOINT_I: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord == lc_arg || ord == uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CODEPOINT_I_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord != lc_arg && ord != uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord >= lc_arg && ord <= uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord < lc_arg || ord > uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_SUBRULE: if (nfadeb) fprintf(stderr, "IGNORING SUBRULE\n"); continue; case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMNormalizer norm; MVMint32 ready; MVMGrapheme32 ga = edge_info[i].arg.g; MVMGrapheme32 gb = MVM_string_ord_basechar_at(tc, target, offset); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, ga, &ga); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) ga = MVM_unicode_normalizer_get_grapheme(tc, &norm); if (((act == MVM_NFA_EDGE_CODEPOINT_M) && (ga == gb)) || ((act == MVM_NFA_EDGE_CODEPOINT_M_NEG) && (ga != gb))) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: { MVMNormalizer norm; MVMint32 ready; MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, uc_arg, &uc_arg); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) uc_arg = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, lc_arg, &lc_arg); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) lc_arg = MVM_unicode_normalizer_get_grapheme(tc, &norm); if (((act == MVM_NFA_EDGE_CODEPOINT_IM) && (ord == lc_arg || ord == uc_arg)) || ((act == MVM_NFA_EDGE_CODEPOINT_IM_NEG) && (ord != lc_arg && ord != uc_arg))) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE_M: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); if (ord >= lc_arg && ord <= uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); if (ord < lc_arg || ord > uc_arg) nextst[numnext++] = to; continue; } } } } if (nfadeb) fprintf(stderr,"\n"); } /* Move to next character and generation. */ offset++; gen++; } /* strip any literal lengths, leaving only fates */ if (usedlonglit || nfadeb) { if (nfadeb) fprintf(stderr,"Final\n"); for (i = 0; i < total_fates; i++) { if (nfadeb) fprintf(stderr, " %08llx\n", (long long unsigned int)fates[i]); fates[i] &= 0xffffff; } } *total_fates_out = total_fates; return fates; } /* Takes an NFA, a target string in and an offset. Runs the NFA and returns * the order to try the fates in. */ MVMObject * MVM_nfa_run_proto(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset) { /* Run the NFA. */ MVMint64 total_fates, i; MVMint64 *fates = nqp_nfa_run(tc, (MVMNFABody *)OBJECT_BODY(nfa), target, offset, &total_fates); /* Copy results into an integer array. */ MVMObject *fateres = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); for (i = 0; i < total_fates; i++) MVM_repr_bind_pos_i(tc, fateres, i, fates[i]); return fateres; } /* Takes an NFA, target string and offset. Runs the NFA, and uses the output * to update the bstack with backtracking points to try the alternation * branches in the correct order. The current capture stack is needed for its * height. */ void MVM_nfa_run_alt(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset, MVMObject *bstack, MVMObject *cstack, MVMObject *labels) { /* Run the NFA. */ MVMint64 total_fates, i; MVMint64 *fates = nqp_nfa_run(tc, (MVMNFABody *)OBJECT_BODY(nfa), target, offset, &total_fates); /* Push the results onto the bstack. */ MVMint64 caps = cstack && IS_CONCRETE(cstack) ? MVM_repr_elems(tc, cstack) : 0; for (i = 0; i < total_fates; i++) { MVM_repr_push_i(tc, bstack, MVM_repr_at_pos_i(tc, labels, fates[i])); MVM_repr_push_i(tc, bstack, offset); MVM_repr_push_i(tc, bstack, 0); MVM_repr_push_i(tc, bstack, caps); } } MoarVM-2015.11/src/6model/reprs/NFA.h0000644000175000017500000000375112623370227015747 0ustar jnthnjnthn/* NFA constants. */ #define MVM_NFA_EDGE_FATE 0 #define MVM_NFA_EDGE_EPSILON 1 #define MVM_NFA_EDGE_CODEPOINT 2 #define MVM_NFA_EDGE_CODEPOINT_NEG 3 #define MVM_NFA_EDGE_CHARCLASS 4 #define MVM_NFA_EDGE_CHARCLASS_NEG 5 #define MVM_NFA_EDGE_CHARLIST 6 #define MVM_NFA_EDGE_CHARLIST_NEG 7 #define MVM_NFA_EDGE_SUBRULE 8 #define MVM_NFA_EDGE_CODEPOINT_I 9 #define MVM_NFA_EDGE_CODEPOINT_I_NEG 10 #define MVM_NFA_EDGE_GENERIC_VAR 11 #define MVM_NFA_EDGE_CHARRANGE 12 #define MVM_NFA_EDGE_CHARRANGE_NEG 13 #define MVM_NFA_EDGE_CODEPOINT_LL 14 #define MVM_NFA_EDGE_CODEPOINT_I_LL 15 #define MVM_NFA_EDGE_CODEPOINT_M 16 #define MVM_NFA_EDGE_CODEPOINT_M_NEG 17 #define MVM_NFA_EDGE_CODEPOINT_M_LL 18 #define MVM_NFA_EDGE_CODEPOINT_IM 19 #define MVM_NFA_EDGE_CODEPOINT_IM_NEG 20 #define MVM_NFA_EDGE_CODEPOINT_IM_LL 21 #define MVM_NFA_EDGE_CHARRANGE_M 22 #define MVM_NFA_EDGE_CHARRANGE_M_NEG 23 /* State entry. */ struct MVMNFAStateInfo { MVMint64 act; MVMint64 to; union { MVMGrapheme32 g; MVMint64 i; MVMString *s; struct { MVMGrapheme32 uc; MVMGrapheme32 lc; } uclc; } arg; }; /* Body of an NFA. */ struct MVMNFABody { MVMObject *fates; MVMint64 num_states; MVMint64 *num_state_edges; MVMNFAStateInfo **states; }; struct MVMNFA { MVMObject common; MVMNFABody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMNFA_initialize(MVMThreadContext *tc); /* Other NFA related functions. */ MVMObject * MVM_nfa_from_statelist(MVMThreadContext *tc, MVMObject *states, MVMObject *nfa_type); MVMObject * MVM_nfa_run_proto(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset); void MVM_nfa_run_alt(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset, MVMObject *bstack, MVMObject *cstack, MVMObject *labels); MoarVM-2015.11/src/6model/reprs/NativeCall.c0000644000175000017500000001105112554473060017352 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNativeCall); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMNativeCallBody *src_body = (MVMNativeCallBody *)src; MVMNativeCallBody *dest_body = (MVMNativeCallBody *)dest; /* Need a fresh handle for resource management purposes. */ if (src_body->lib_name) { dest_body->lib_name = MVM_malloc(strlen(src_body->lib_name) + 1); strcpy(dest_body->lib_name, src_body->lib_name); dest_body->lib_handle = MVM_nativecall_load_lib(dest_body->lib_name); } /* Rest is just simple copying. */ dest_body->entry_point = src_body->entry_point; dest_body->convention = src_body->convention; dest_body->num_args = src_body->num_args; if (src_body->arg_types) { dest_body->arg_types = MVM_malloc(sizeof(MVMint16) * (src_body->num_args ? src_body->num_args : 1)); memcpy(dest_body->arg_types, src_body->arg_types, src_body->num_args * sizeof(MVMint16)); } dest_body->ret_type = src_body->ret_type; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMNativeCallBody) * 8, /* bits */ ALIGNOF(MVMNativeCallBody), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* We can't actually serialize the handle, but since this REPR gets inlined * we just do nothing here since it may well have never been opened. Various * more involved approaches are possible. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNativeCall); } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNativeCallBody *body = (MVMNativeCallBody *)data; if (body->arg_info) { MVMint16 i; for (i = 0; i < body->num_args; i++) if (body->arg_info[i]) MVM_gc_worklist_add(tc, worklist, &body->arg_info[i]); } } static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMNativeCallBody *body = (MVMNativeCallBody *)data; if (body->lib_name) MVM_free(body->lib_name); if (body->lib_handle) MVM_nativecall_free_lib(body->lib_handle); if (body->arg_types) MVM_free(body->arg_types); if (body->arg_info) MVM_free(body->arg_info); } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMNativeCall_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, gc_cleanup, NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "NativeCall", /* name */ MVM_REPR_ID_MVMNativeCall, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/NativeCall.h0000644000175000017500000000114512554473060017362 0ustar jnthnjnthn/* Representation for a native callsite. */ struct MVMNativeCallBody { char *lib_name; DLLib *lib_handle; char *sym_name; void *entry_point; #ifdef HAVE_LIBFFI ffi_abi convention; ffi_type **ffi_arg_types; ffi_type *ffi_ret_type; #else MVMint16 convention; #endif MVMint16 num_args; MVMint16 ret_type; MVMint16 *arg_types; MVMObject **arg_info; }; struct MVMNativeCall { MVMObject common; MVMNativeCallBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMNativeCall_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/NativeRef.c0000644000175000017500000005451512554473060017227 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNativeRef); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with repr MVMNativeRef"); } /* Set the size of objects on the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNativeRef); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)st->REPR_data; if (repr_data) { MVM_serialization_write_varint(tc, writer, repr_data->primitive_type); MVM_serialization_write_varint(tc, writer, repr_data->ref_kind); } else { MVM_serialization_write_varint(tc, writer, 0); MVM_serialization_write_varint(tc, writer, 0); } } /* Deserializes REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMNativeRefREPRData *repr_data = MVM_malloc(sizeof(MVMNativeRefREPRData)); repr_data->primitive_type = MVM_serialization_read_varint(tc, reader); repr_data->ref_kind = MVM_serialization_read_varint(tc, reader); st->REPR_data = repr_data; } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNativeRefBody *ref = (MVMNativeRefBody *)data; MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)st->REPR_data; switch (repr_data->ref_kind) { case MVM_NATIVEREF_REG_OR_LEX: MVM_gc_worklist_add_frame(tc, worklist, ref->u.reg_or_lex.frame); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.obj); MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.class_handle); MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.name); break; case MVM_NATIVEREF_POSITIONAL: MVM_gc_worklist_add(tc, worklist, &ref->u.positional.obj); break; } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMNativeRef *ref = (MVMNativeRef *)obj; MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(obj)->REPR_data; if (repr_data->ref_kind == MVM_NATIVEREF_REG_OR_LEX) MVM_frame_dec_ref(tc, ref->body.u.reg_or_lex.frame); } /* Frees the representation data, if any. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* Gets the storage specification for this representation. */ static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts *str_consts = &(tc->instance->str_consts); MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts->nativeref); if (IS_CONCRETE(info)) { MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts->type); MVMuint16 prim = REPR(type)->get_storage_spec(tc, STABLE(type))->boxed_primitive; if (prim != MVM_STORAGE_SPEC_BP_NONE) { MVMObject *refkind = MVM_repr_at_key_o(tc, info, str_consts->refkind); if (IS_CONCRETE(refkind)) { MVMNativeRefREPRData *repr_data; MVMuint16 kind; MVMString *refkind_s = MVM_repr_get_str(tc, refkind); if (MVM_string_equal(tc, refkind_s, str_consts->lexical)) { kind = MVM_NATIVEREF_REG_OR_LEX; } else if (MVM_string_equal(tc, refkind_s, str_consts->attribute)) { kind = MVM_NATIVEREF_ATTRIBUTE; } else if (MVM_string_equal(tc, refkind_s, str_consts->positional)) { kind = MVM_NATIVEREF_POSITIONAL; } else { MVM_exception_throw_adhoc(tc, "NativeRef: invalid refkind in compose"); } repr_data = MVM_malloc(sizeof(MVMNativeRefREPRData)); repr_data->primitive_type = prim; repr_data->ref_kind = kind; st->REPR_data = repr_data; } else { MVM_exception_throw_adhoc(tc, "NativeRef: missing refkind in compose"); } } else { MVM_exception_throw_adhoc(tc, "NativeRef: non-native type supplied in compose"); } } else { MVM_exception_throw_adhoc(tc, "NativeRef: missing nativeref protocol in compose"); } } /* Initializes the representation. */ const MVMREPROps * MVMNativeRef_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, NULL, /* spesh */ "NativeRef", /* name */ MVM_REPR_ID_NativeRef, 1, /* refs_frames */ }; /* Validates the given type is a native reference of the required primitive * type and reference kind. */ void MVM_nativeref_ensure(MVMThreadContext *tc, MVMObject *type, MVMuint16 wantprim, MVMuint16 wantkind, char *guilty) { if (REPR(type)->ID == MVM_REPR_ID_NativeRef) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(type)->REPR_data; if (!repr_data) MVM_exception_throw_adhoc(tc, "%s set to NativeRef that is not yet composed", guilty); if (repr_data->primitive_type != wantprim) MVM_exception_throw_adhoc(tc, "%s set to NativeRef of wrong primitive type", guilty); if (repr_data->ref_kind != wantkind) MVM_exception_throw_adhoc(tc, "%s set to NativeRef of wrong reference kind", guilty); } else { MVM_exception_throw_adhoc(tc, "%s requires a type with REPR NativeRef", guilty); } } /* Creation of native references for registers. */ static MVMObject * reg_or_lex_ref(MVMThreadContext *tc, MVMObject *type, MVMFrame *f, MVMRegister *r, MVMuint16 reg_type) { MVMNativeRef *ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); ref->body.u.reg_or_lex.frame = MVM_frame_inc_ref(tc, f); ref->body.u.reg_or_lex.var = r; ref->body.u.reg_or_lex.type = reg_type; return (MVMObject *)ref; } MVMObject * MVM_nativeref_reg_i(MVMThreadContext *tc, MVMFrame *f, MVMRegister *r) { MVMObject *ref_type = MVM_hll_current(tc)->int_lex_ref; if (ref_type) return reg_or_lex_ref(tc, ref_type, f, r, MVM_reg_int64); MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_reg_n(MVMThreadContext *tc, MVMFrame *f, MVMRegister *r) { MVMObject *ref_type = MVM_hll_current(tc)->num_lex_ref; if (ref_type) return reg_or_lex_ref(tc, ref_type, f, r, MVM_reg_num64); MVM_exception_throw_adhoc(tc, "No num lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_reg_s(MVMThreadContext *tc, MVMFrame *f, MVMRegister *r) { MVMObject *ref_type = MVM_hll_current(tc)->str_lex_ref; if (ref_type) return reg_or_lex_ref(tc, ref_type, f, r, MVM_reg_str); MVM_exception_throw_adhoc(tc, "No str lexical reference type registered for current HLL"); } /* Creation of native references for lexicals. */ static MVMFrame * get_lexical_outer(MVMThreadContext *tc, MVMuint16 outers) { MVMFrame *f = tc->cur_frame; while (outers) { if (!f) MVM_exception_throw_adhoc(tc, "getlexref_*: outer index out of range"); f = f->outer; outers--; } return f; } MVMObject * MVM_nativeref_lex_i(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type = MVM_hll_current(tc)->int_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; MVMuint16 type = lexical_types[idx]; if (type != MVM_reg_int64 && type != MVM_reg_int32 && type != MVM_reg_int16 && type != MVM_reg_int8) MVM_exception_throw_adhoc(tc, "getlexref_i: lexical is not an int"); return reg_or_lex_ref(tc, ref_type, f, &(f->env[idx]), type); } MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_n(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type = MVM_hll_current(tc)->num_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; MVMuint16 type = lexical_types[idx]; if (type != MVM_reg_num64 && type != MVM_reg_num32) MVM_exception_throw_adhoc(tc, "getlexref_n: lexical is not a num"); return reg_or_lex_ref(tc, ref_type, f, &(f->env[idx]), type); } MVM_exception_throw_adhoc(tc, "No num lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_s(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type = MVM_hll_current(tc)->str_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; if (lexical_types[idx] != MVM_reg_str) MVM_exception_throw_adhoc(tc, "getlexref_s: lexical is not a str (%d, %d)", outers, idx); return reg_or_lex_ref(tc, ref_type, f, &(f->env[idx]), MVM_reg_str); } MVM_exception_throw_adhoc(tc, "No str lexical reference type registered for current HLL"); } static MVMObject * lexref_by_name(MVMThreadContext *tc, MVMObject *type, MVMString *name, MVMuint16 kind) { MVMFrame *cur_frame = tc->cur_frame; MVM_string_flatten(tc, name); while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == kind) { return reg_or_lex_ref(tc, type, cur_frame, &cur_frame->env[entry->value], kind); } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } } MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->int_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_int64); MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->num_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_num64); MVM_exception_throw_adhoc(tc, "No num lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_name_s(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->str_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_str); MVM_exception_throw_adhoc(tc, "No str lexical reference type registered for current HLL"); } /* Creation of native references for attributes. */ static MVMObject * attrref(MVMThreadContext *tc, MVMObject *type, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMNativeRef *ref; MVMROOT(tc, obj, { MVMROOT(tc, class_handle, { MVMROOT(tc, name, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.obj, obj); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.class_handle, class_handle); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.name, name); }); }); }); return (MVMObject *)ref; } MVMObject * MVM_nativeref_attr_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->int_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No int attribute reference type registered for current HLL"); } MVMObject * MVM_nativeref_attr_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->num_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No num attribute reference type registered for current HLL"); } MVMObject * MVM_nativeref_attr_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->str_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No str attribute reference type registered for current HLL"); } /* Creation of native references for positionals. */ static MVMObject * posref(MVMThreadContext *tc, MVMObject *type, MVMObject *obj, MVMint64 idx) { MVMNativeRef *ref; MVMROOT(tc, obj, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.positional.obj, obj); ref->body.u.positional.idx = idx; }); return (MVMObject *)ref; } MVMObject * MVM_nativeref_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->int_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No int positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->num_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No num positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->str_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No str positional reference type registered for current HLL"); } /* Reference read functions. These do no checks that the reference is of the * right kind and primitive type, they just go ahead and do the read. Thus * they are more suited to calling from optimized code. The checking path is * in the native ref container implementation, in containers.c; after checks, * they delegate here. */ MVMint64 MVM_nativeref_read_reg_or_lex_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; switch (ref->body.u.reg_or_lex.type) { case MVM_reg_int8: return ref->body.u.reg_or_lex.var->i8; case MVM_reg_int16: return ref->body.u.reg_or_lex.var->i16; case MVM_reg_int32: return ref->body.u.reg_or_lex.var->i32; default: return ref->body.u.reg_or_lex.var->i64; } } MVMnum64 MVM_nativeref_read_reg_or_lex_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; switch (ref->body.u.reg_or_lex.type) { case MVM_reg_num32: return ref->body.u.reg_or_lex.var->n32; default: return ref->body.u.reg_or_lex.var->n64; } } MVMString * MVM_nativeref_read_reg_or_lex_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return ref->body.u.reg_or_lex.var->s; } MVMint64 MVM_nativeref_read_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_i(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMnum64 MVM_nativeref_read_attribute_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_n(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMString * MVM_nativeref_read_attribute_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_s(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMint64 MVM_nativeref_read_positional_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_i(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } MVMnum64 MVM_nativeref_read_positional_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_n(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } MVMString * MVM_nativeref_read_positional_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_s(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } /* Reference write functions. Same (non-checking) rules as the reads above. */ void MVM_nativeref_write_reg_or_lex_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; switch (ref->body.u.reg_or_lex.type) { case MVM_reg_int8: ref->body.u.reg_or_lex.var->i8 = (MVMint8)value; break; case MVM_reg_int16: ref->body.u.reg_or_lex.var->i16 = (MVMint16)value; break; case MVM_reg_int32: ref->body.u.reg_or_lex.var->i32 = (MVMint32)value; break; default: ref->body.u.reg_or_lex.var->i64 = value; break; } } void MVM_nativeref_write_reg_or_lex_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; switch (ref->body.u.reg_or_lex.type) { case MVM_reg_num32: ref->body.u.reg_or_lex.var->n32 = (MVMnum32)value; break; default: ref->body.u.reg_or_lex.var->n64 = value; break; } } void MVM_nativeref_write_reg_or_lex_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; ref->body.u.reg_or_lex.var->s = value; } void MVM_nativeref_write_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.i64 = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_int64); } void MVM_nativeref_write_attribute_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.n64 = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_num64); } void MVM_nativeref_write_attribute_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.s = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_str); } void MVM_nativeref_write_positional_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_i(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } void MVM_nativeref_write_positional_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_n(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } void MVM_nativeref_write_positional_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_s(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } MoarVM-2015.11/src/6model/reprs/NativeRef.h0000644000175000017500000001010612502366742017221 0ustar jnthnjnthn/* Representation of a reference to a native value. */ struct MVMNativeRefBody { union { struct { MVMFrame *frame; MVMRegister *var; MVMuint16 type; } reg_or_lex; struct { MVMObject *obj; MVMObject *class_handle; MVMString *name; } attribute; struct { MVMObject *obj; MVMint64 idx; } positional; } u; }; struct MVMNativeRef { MVMObject common; MVMNativeRefBody body; }; /* Kinds of native reference. */ #define MVM_NATIVEREF_REG_OR_LEX 1 #define MVM_NATIVEREF_ATTRIBUTE 2 #define MVM_NATIVEREF_POSITIONAL 3 /* REPR data for a native reference. */ struct MVMNativeRefREPRData { /* The primitive type of native reference this is (one of the values that * is valid for MVMStorageSpec.boxed_primitive). */ MVMuint16 primitive_type; /* The kind of reference this is. */ MVMuint16 ref_kind; }; /* Function for REPR setup. */ const MVMREPROps * MVMNativeRef_initialize(MVMThreadContext *tc); /* Operations on a nativeref REPR. */ void MVM_nativeref_ensure(MVMThreadContext *tc, MVMObject *val, MVMuint16 wantprim, MVMuint16 wantkind, char *guilty); MVMObject * MVM_nativeref_reg_i(MVMThreadContext *tc, MVMFrame *frame, MVMRegister *reg); MVMObject * MVM_nativeref_reg_n(MVMThreadContext *tc, MVMFrame *frame, MVMRegister *reg); MVMObject * MVM_nativeref_reg_s(MVMThreadContext *tc, MVMFrame *frame, MVMRegister *reg); MVMObject * MVM_nativeref_lex_i(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_n(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_s(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_lex_name_s(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_attr_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_attr_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_attr_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMObject * MVM_nativeref_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMObject * MVM_nativeref_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMint64 MVM_nativeref_read_reg_or_lex_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_reg_or_lex_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_reg_or_lex_s(MVMThreadContext *tc, MVMObject *ref); MVMint64 MVM_nativeref_read_attribute_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_attribute_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_attribute_s(MVMThreadContext *tc, MVMObject *ref); MVMint64 MVM_nativeref_read_positional_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_positional_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_positional_s(MVMThreadContext *tc, MVMObject *ref); void MVM_nativeref_write_reg_or_lex_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_reg_or_lex_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_reg_or_lex_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); void MVM_nativeref_write_attribute_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_attribute_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_attribute_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); void MVM_nativeref_write_positional_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_positional_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_positional_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); MoarVM-2015.11/src/6model/reprs/P6bigint.c0000644000175000017500000001652512573775575017046 0ustar jnthnjnthn#include "moar.h" /* A forced 64-bit version of mp_get_long, since on some platforms long is * not all that long. */ static MVMuint64 mp_get_int64(MVMThreadContext *tc, mp_int * a) { int i, bits; MVMuint64 res; if (a->used == 0) { return 0; } bits = mp_count_bits(a); if (bits > 64) { MVM_exception_throw_adhoc(tc, "Cannot unbox %d bit wide bigint into native integer", bits); } /* get number of digits of the lsb we have to read */ i = MIN(a->used,(int)((sizeof(MVMuint64)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; /* get most significant digit of result */ res = DIGIT(a,i); while (--i >= 0) { res = (res << DIGIT_BIT) | DIGIT(a,i); } return res; } /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6bigint); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; body->u.smallint.flag = MVM_BIGINT_32_FLAG; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6bigintBody *src_body = (MVMP6bigintBody *)src; MVMP6bigintBody *dest_body = (MVMP6bigintBody *)dest; if (MVM_BIGINT_IS_BIG(src_body)) { dest_body->u.bigint = MVM_malloc(sizeof(mp_int)); mp_init_copy(dest_body->u.bigint, src_body->u.bigint); } else { dest_body->u.smallint.flag = src_body->u.smallint.flag; dest_body->u.smallint.value = src_body->u.smallint.value; } } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_IS_32BIT_INT(value)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = (MVMint32)value; } else { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (value >= 0) { MVM_bigint_mp_set_uint64(i, (MVMuint64)value); } else { MVM_bigint_mp_set_uint64(i, (MVMuint64)-value); mp_neg(i, i); } body->u.bigint = i; } } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; if (MP_LT == mp_cmp_d(i, 0)) { MVMint64 ret; mp_neg(i, i); ret = mp_get_int64(tc, i); mp_neg(i, i); return -ret; } else { return mp_get_int64(tc, i); } } else { return body->u.smallint.value; } } static void * get_boxed_ref(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { if (repr_id == MVM_REPR_ID_P6bigint) return data; MVM_exception_throw_adhoc(tc, "P6bigint representation cannot unbox to other types"); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMP6bigintBody) * 8, /* bits */ ALIGNOF(MVMP6bigintBody), /* align */ MVM_STORAGE_SPEC_BP_INT, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_INT, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_clear(body->u.bigint); MVM_free(body->u.bigint); } } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMP6bigintBody *body = &((MVMP6bigint *)obj)->body; if (MVM_BIGINT_IS_BIG(body)) { mp_clear(body->u.bigint); MVM_free(body->u.bigint); } } /* Serializes the bigint. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; int len; char *buf; MVMString *str; mp_radix_size(i, 10, &len); buf = (char *)MVM_malloc(len); mp_toradix(i, buf, 10); /* len - 1 because buf is \0-terminated */ str = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); /* write the "is small" flag */ MVM_serialization_write_varint(tc, writer, 0); MVM_serialization_write_str(tc, writer, str); MVM_free(buf); } else { /* write the "is small" flag */ MVM_serialization_write_varint(tc, writer, 1); MVM_serialization_write_varint(tc, writer, body->u.smallint.value); } } /* Set the size on the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6bigint); } /* Deserializes the bigint. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_serialization_read_varint(tc, reader) == 1) { /* Is it small int? */ body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = MVM_serialization_read_varint(tc, reader); } else { /* big int */ char *buf = MVM_string_ascii_encode(tc, MVM_serialization_read_str(tc, reader), NULL); body->u.bigint = MVM_malloc(sizeof(mp_int)); mp_init(body->u.bigint); mp_read_radix(body->u.bigint, buf, 10); MVM_free(buf); } } /* Initializes the representation. */ const MVMREPROps * MVMP6bigint_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, get_boxed_ref }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, gc_cleanup, NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "P6bigint", /* name */ MVM_REPR_ID_P6bigint, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/P6bigint.h0000644000175000017500000000222012573775575017036 0ustar jnthnjnthn#include "tommath.h" #define MVM_BIGINT_32_FLAG 0xFFFFFFFF #define MVM_BIGINT_IS_BIG(body) ((body)->u.smallint.flag != 0xFFFFFFFF) #define MVM_IS_32BIT_INT(i) (i >= -2147483648LL && i <= 2147483647LL) /* Representation used by big integers; inlined into P6bigint. We store any * values in 32-bit signed range without using the big integer library. */ struct MVMP6bigintBody { union { /* A 32-bit integer and a flag indicating this is not a pointer to a * big integer, but instead the 32-bit value should be read. Stored * so that the flag sets the lower bits of any 64-bit pointer, which * should never happen in a real pointer due to alignment. */ struct { #if defined(MVM_BIGENDIAN) && MVM_PTR_SIZE > 4 MVMint32 value; MVMuint32 flag; #else MVMuint32 flag; MVMint32 value; #endif } smallint; /* Pointer to a libtommath big integer. */ mp_int *bigint; } u; }; struct MVMP6bigint { MVMObject common; MVMP6bigintBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6bigint_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/P6int.c0000644000175000017500000002027712554473060016342 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; static void mk_storage_spec(MVMThreadContext *tc, MVMuint16 bits, MVMuint16 is_unsigned, MVMStorageSpec *spec) { /* create storage spec */ spec->inlineable = MVM_STORAGE_SPEC_INLINED; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec->can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec->bits = bits; spec->is_unsigned = is_unsigned; switch (bits) { case 64: spec->align = ALIGNOF(MVMint64); break; case 32: spec->align = ALIGNOF(MVMint32); break; case 16: spec->align = ALIGNOF(MVMint16); break; default: spec->align = ALIGNOF(MVMint8); break; } } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMP6intREPRData *repr_data = (MVMP6intREPRData *)MVM_malloc(sizeof(MVMP6intREPRData)); repr_data->bits = sizeof(MVMint64) * 8; repr_data->is_unsigned = 0; mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6int); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVMP6intBody *src_body = (MVMP6intBody *)src; MVMP6intBody *dest_body = (MVMP6intBody *)dest; switch (repr_data->bits) { case 64: dest_body->value.i64 = src_body->value.i64; break; case 32: dest_body->value.i32 = src_body->value.i32; break; case 16: dest_body->value.i16 = src_body->value.i16; break; default: dest_body->value.i8 = src_body->value.i8; break; } } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: ((MVMP6intBody *)data)->value.i64 = value; break; case 32: ((MVMP6intBody *)data)->value.i32 = (MVMint32)value; break; case 16: ((MVMP6intBody *)data)->value.i16 = (MVMint16)value; break; default: ((MVMP6intBody *)data)->value.i8 = (MVMint8)value; break; } } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: return ((MVMP6intBody *)data)->value.i64; case 32: return ((MVMP6intBody *)data)->value.i32; case 16: return ((MVMP6intBody *)data)->value.i16; default: return ((MVMP6intBody *)data)->value.i8; } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMint64) * 8, /* bits */ ALIGNOF(MVMint64), /* align */ MVM_STORAGE_SPEC_BP_INT, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_INT, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; if (repr_data && repr_data->bits) return &repr_data->storage_spec; return &default_storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.integer); if (!MVM_is_null(tc, info)) { MVMObject *bits_o = MVM_repr_at_key_o(tc, info, str_consts.bits); MVMObject *is_unsigned_o = MVM_repr_at_key_o(tc, info, str_consts.unsigned_str); if (!MVM_is_null(tc, bits_o)) { repr_data->bits = MVM_repr_get_int(tc, bits_o); switch (repr_data->bits) { case MVM_P6INT_C_TYPE_CHAR: repr_data->bits = 8 * sizeof(char); break; case MVM_P6INT_C_TYPE_SHORT: repr_data->bits = 8 * sizeof(short); break; case MVM_P6INT_C_TYPE_INT: repr_data->bits = 8 * sizeof(int); break; case MVM_P6INT_C_TYPE_LONG: repr_data->bits = 8 * sizeof(long); break; case MVM_P6INT_C_TYPE_LONGLONG: repr_data->bits = 8 * sizeof(long long); break; } if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6int: Unsupported int size (%dbit)", repr_data->bits); } if (!MVM_is_null(tc, is_unsigned_o)) { repr_data->is_unsigned = MVM_repr_get_int(tc, is_unsigned_o); } } if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6int); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVM_serialization_write_varint(tc, writer, repr_data->bits); MVM_serialization_write_varint(tc, writer, repr_data->is_unsigned); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)MVM_malloc(sizeof(MVMP6intREPRData)); repr_data->bits = MVM_serialization_read_varint(tc, reader); repr_data->is_unsigned = MVM_serialization_read_varint(tc, reader); if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6int: Unsupported int size (%dbit)", repr_data->bits); mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); st->REPR_data = repr_data; } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { set_int(tc, st, root, data, MVM_serialization_read_varint(tc, reader)); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_varint(tc, writer, get_int(tc, st, NULL, data)); } /* Initializes the representation. */ const MVMREPROps * MVMP6int_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, NULL, /* spesh */ "P6int", /* name */ MVM_REPR_ID_P6int, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/P6int.h0000644000175000017500000000137312502366742016344 0ustar jnthnjnthn#define MVM_P6INT_C_TYPE_CHAR -1 #define MVM_P6INT_C_TYPE_SHORT -2 #define MVM_P6INT_C_TYPE_INT -3 #define MVM_P6INT_C_TYPE_LONG -4 #define MVM_P6INT_C_TYPE_LONGLONG -5 /* Representation used by P6 native ints. */ struct MVMP6intBody { /* Integer storage slot. */ union { MVMint64 i64; MVMint32 i32; MVMint16 i16; MVMint8 i8; } value; }; struct MVMP6int { MVMObject common; MVMP6intBody body; }; /* The bit width requirement is shared for all instances of the same type. */ struct MVMP6intREPRData { MVMint16 bits; MVMint16 is_unsigned; MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6int_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/P6num.c0000644000175000017500000001566712554473060016356 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; static void mk_storage_spec(MVMThreadContext *tc, MVMuint16 bits, MVMStorageSpec *spec) { spec->bits = bits; spec->inlineable = MVM_STORAGE_SPEC_INLINED; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec->can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; switch (bits) { case 64: spec->align = ALIGNOF(MVMnum64); break; case 32: spec->align = ALIGNOF(MVMnum32); break; default: spec->align = ALIGNOF(MVMnum64); break; } } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMP6numREPRData *repr_data = (MVMP6numREPRData *)MVM_malloc(sizeof(MVMP6numREPRData)); repr_data->bits = sizeof(MVMnum64) * 8; mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6num); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVMP6numBody *src_body = (MVMP6numBody *)src; MVMP6numBody *dest_body = (MVMP6numBody *)dest; switch (repr_data->bits) { case 32: dest_body->value.n32 = src_body->value.n32; break; default: dest_body->value.n64 = src_body->value.n64; break; } } static void set_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; switch (repr_data->bits) { case 32: ((MVMP6numBody *)data)->value.n32 = (MVMnum32)value; break; default: ((MVMP6numBody *)data)->value.n64 = value; break; } } static MVMnum64 get_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; switch (repr_data->bits) { case 32: return ((MVMP6numBody *)data)->value.n32; default: return ((MVMP6numBody *)data)->value.n64; } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMnum64) * 8, /* bits */ ALIGNOF(MVMnum64), /* align */ MVM_STORAGE_SPEC_BP_NUM, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_NUM, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; if (repr_data && repr_data->bits) return &repr_data->storage_spec; return &default_storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.float_str); if (!MVM_is_null(tc, info)) { MVMObject *bits_o = MVM_repr_at_key_o(tc, info, str_consts.bits); if (!MVM_is_null(tc, bits_o)) { repr_data->bits = MVM_repr_get_int(tc, bits_o); switch (repr_data->bits) { case MVM_P6NUM_C_TYPE_FLOAT: repr_data->bits = 8 * sizeof(float); break; case MVM_P6NUM_C_TYPE_DOUBLE: repr_data->bits = 8 * sizeof(double); break; case MVM_P6NUM_C_TYPE_LONGDOUBLE: repr_data->bits = 8 * sizeof(long double); break; } if (repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6num: Unsupported num size (%dbit)", repr_data->bits); } } if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6num); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVM_serialization_write_varint(tc, writer, repr_data->bits); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)MVM_malloc(sizeof(MVMP6numREPRData)); repr_data->bits = MVM_serialization_read_varint(tc, reader); if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6num: Unsupported int size (%dbit)", repr_data->bits); if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); st->REPR_data = repr_data; } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMnum64 value = MVM_serialization_read_num(tc, reader); set_num(tc, st, root, data, value); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_num(tc, writer, get_num(tc, st, NULL, data)); } /* Initializes the representation. */ const MVMREPROps * MVMP6num_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, set_num, get_num, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, NULL, /* spesh */ "P6num", /* name */ MVM_REPR_ID_P6num, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/P6num.h0000644000175000017500000000114112502366742016342 0ustar jnthnjnthn#define MVM_P6NUM_C_TYPE_FLOAT -1 #define MVM_P6NUM_C_TYPE_DOUBLE -2 #define MVM_P6NUM_C_TYPE_LONGDOUBLE -3 /* Representation used by P6 nums. */ struct MVMP6numBody { /* Float storage slot. */ union { MVMnum64 n64; MVMnum32 n32; } value; }; struct MVMP6num { MVMObject common; MVMP6numBody body; }; /* The bit width requirement is shared for all instances of the same type. */ struct MVMP6numREPRData { MVMint16 bits; MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6num_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/P6opaque.c0000644000175000017500000020714312573775575017062 0ustar jnthnjnthn#include "moar.h" #define P6OMAX(x, y) ((y) > (x) ? (y) : (x)) #define REFVAR_VM_HASH_STR_VAR 10 /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Helpers for reading/writing values. */ MVM_STATIC_INLINE MVMObject * get_obj_at_offset(void *data, MVMint64 offset) { void *location = (char *)data + offset; return *((MVMObject **)location); } MVM_STATIC_INLINE void set_obj_at_offset(MVMThreadContext *tc, MVMObject *root, void *data, MVMint64 offset, MVMObject *value) { void *location = (char *)data + offset; MVM_ASSIGN_REF(tc, &(root->header), *((MVMObject **)location), value); } /* Helper for finding a slot number. */ static MVMint64 try_get_slot(MVMThreadContext *tc, MVMP6opaqueREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMint16 i; for (i = 0; i < cur_map_entry->num_attrs; i++) { if (MVM_string_equal(tc, cur_map_entry->names[i], name)) { return cur_map_entry->slots[i]; } } } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = 0; /* Is updated later. */ }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { if (st->size) return MVM_gc_allocate_object(tc, st); else MVM_exception_throw_adhoc(tc, "P6opaque: must compose before allocating"); } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData * repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data) { MVMint64 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint64 offset = repr_data->attribute_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)data + offset); } } else { MVM_exception_throw_adhoc(tc, "P6opaque: must compose before using initialize"); } } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 i; src = MVM_p6opaque_real_data(tc, src); /* Flattened in REPRs need a chance to copy 'emselves. */ for (i = 0; i < repr_data->num_attributes; i++) { MVMSTable *st_copy = repr_data->flattened_stables[i]; MVMuint16 offset = repr_data->attribute_offsets[i]; if (st_copy) { st_copy->REPR->copy_to(tc, st_copy, (char*)src + offset, dest_root, (char*)dest + offset); } else { MVMObject *ref = get_obj_at_offset(src, offset); if (ref) set_obj_at_offset(tc, dest_root, dest, offset, ref); } } } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 i; data = MVM_p6opaque_real_data(tc, data); /* Mark objects. */ for (i = 0; i < repr_data->gc_obj_mark_offsets_count; i++) { MVMuint16 offset = repr_data->gc_obj_mark_offsets[i]; MVM_gc_worklist_add(tc, worklist, (char *)data + offset); } /* Mark any nested reprs that need it. */ for (i = 0; repr_data->gc_mark_slots[i] >= 0; i++) { MVMuint16 offset = repr_data->attribute_offsets[repr_data->gc_mark_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->gc_mark_slots[i]]; st->REPR->gc_mark(tc, st, (char *)data + offset, worklist); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)STABLE(obj)->REPR_data; MVMint64 i; void *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(obj)); /* Cleanup any nested reprs that need it. */ for (i = 0; repr_data->gc_cleanup_slots[i] >= 0; i++) { MVMuint16 offset = repr_data->attribute_offsets[repr_data->gc_cleanup_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->gc_cleanup_slots[i]]; st->REPR->gc_cleanup(tc, st, (char *)data + offset); } /* If we replaced the object body, free the replacement. */ MVM_free(((MVMP6opaque *)obj)->body.replaced); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; /* May not be composed yet. */ if (repr_data == NULL) return; if (repr_data->flattened_stables) { int i; for (i = 0; i < repr_data->num_attributes; i++) if (repr_data->flattened_stables[i]) MVM_gc_worklist_add(tc, worklist, &repr_data->flattened_stables[i]); } if (repr_data->auto_viv_values) { int i; for (i = 0; i < repr_data->num_attributes; i++) if (repr_data->auto_viv_values[i]) MVM_gc_worklist_add(tc, worklist, &repr_data->auto_viv_values[i]); } if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVMint16 i; for (i = 0; i < cur_map_entry->num_attrs; i++) { MVM_gc_worklist_add(tc, worklist, &cur_map_entry->names[i]); } MVM_gc_worklist_add(tc, worklist, &cur_map_entry->class_key); cur_map_entry++; } } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVM_free(cur_map_entry->names); MVM_free(cur_map_entry->slots); cur_map_entry++; } MVM_free(repr_data->name_to_index_mapping); } MVM_free(repr_data->attribute_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->auto_viv_values); MVM_free(repr_data->unbox_slots); MVM_free(repr_data->gc_obj_mark_offsets); MVM_free(repr_data->initialize_slots); MVM_free(repr_data->gc_mark_slots); MVM_free(repr_data->gc_cleanup_slots); MVM_free(st->REPR_data); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { MVMuint64 output_size; char *c_name = MVM_string_ascii_encode(tc, name, &output_size); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "P6opaque: no such attribute '%s'", c_name); } /* Gets the current value for an attribute. */ static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; data = MVM_p6opaque_real_data(tc, data); if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose before using get_attribute"); /* Try the slot allocation first. */ slot = hint >= 0 && !(repr_data->mi) ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { if (!attr_st) { MVMObject *result = get_obj_at_offset(data, repr_data->attribute_offsets[slot]); if (result) { result_reg->o = result; } else { /* Maybe we know how to auto-viv it to a container. */ if (repr_data->auto_viv_values) { MVMObject *value = repr_data->auto_viv_values[slot]; if (value != NULL) { if (IS_CONCRETE(value)) { MVMROOT(tc, value, { MVMROOT(tc, root, { MVMObject *cloned = REPR(value)->allocate(tc, STABLE(value)); /* Ordering here matters. We write the object into the * register before calling copy_to. This is because * if copy_to allocates, obj may have moved after * we called it. This saves us having to put things on * the temporary stack. The GC will know to update it * in the register if it moved. */ result_reg->o = cloned; REPR(value)->copy_to(tc, STABLE(value), OBJECT_BODY(value), cloned, OBJECT_BODY(cloned)); set_obj_at_offset(tc, root, MVM_p6opaque_real_data(tc, OBJECT_BODY(root)), repr_data->attribute_offsets[slot], result_reg->o); }); }); } else { set_obj_at_offset(tc, root, data, repr_data->attribute_offsets[slot], value); result_reg->o = value; } } else { result_reg->o = tc->instance->VMNull; } } else { result_reg->o = tc->instance->VMNull; } } } else { MVMROOT(tc, root, { MVMROOT(tc, attr_st, { /* Need to produce a boxed version of this attribute. */ MVMObject *cloned = attr_st->REPR->allocate(tc, attr_st); /* Ordering here matters too. see comments above */ result_reg->o = cloned; attr_st->REPR->copy_to(tc, attr_st, (char *)MVM_p6opaque_real_data(tc, OBJECT_BODY(root)) + repr_data->attribute_offsets[slot], cloned, OBJECT_BODY(cloned)); }); }); } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native access to object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native access to object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native access to object attribute"); break; } default: { MVM_exception_throw_adhoc(tc, "P6opaque: invalid kind in attribute lookup"); } } } else { /* Otherwise, complain that the attribute doesn't exist. */ no_such_attribute(tc, "get", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; data = MVM_p6opaque_real_data(tc, data); if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose before using bind_attribute_boxed"); /* Try the slot allocation first. */ slot = hint >= 0 && !(repr_data->mi) ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; if (attr_st) { if (attr_st == STABLE(value)) st->REPR->copy_to(tc, attr_st, OBJECT_BODY(value), root, (char *)data + repr_data->attribute_offsets[slot]); else MVM_exception_throw_adhoc(tc, "P6opaque: representation mismatch when storing value to attribute"); } else { set_obj_at_offset(tc, root, data, repr_data->attribute_offsets[slot], value); } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "P6opaque: invalid native binding to object attribute"); break; } default: { MVM_exception_throw_adhoc(tc, "P6opaque: invalid kind in attribute bind"); } } } else { /* Otherwise, complain that the attribute doesn't exist. */ no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot = try_get_slot(tc, repr_data, class_handle, name); data = MVM_p6opaque_real_data(tc, data); if (slot >= 0) return NULL != get_obj_at_offset(data, repr_data->attribute_offsets[slot]); else no_such_attribute(tc, "initializedness check", class_handle, name); return 0; } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_key, MVMString *name) { MVMint64 slot; MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; if (!repr_data) return MVM_NO_HINT; slot = try_get_slot(tc, repr_data, class_key, name); return slot >= 0 ? slot : MVM_NO_HINT; } /* Used with boxing. Sets an integer value, for representations that can hold * one. */ static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; st->REPR->box_funcs.set_int(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native integer"); } } /* Used with boxing. Gets an integer value, for representations that can * hold one. */ static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; return st->REPR->box_funcs.get_int(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native integer"); } } /* Used with boxing. Sets a floating point value, for representations that can * hold one. */ static void set_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_num_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_num_slot]; st->REPR->box_funcs.set_num(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_num_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native number"); } } /* Used with boxing. Gets a floating point value, for representations that can * hold one. */ static MVMnum64 get_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_num_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_num_slot]; return st->REPR->box_funcs.get_num(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_num_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native number"); } } /* Used with boxing. Sets a string value, for representations that can hold * one. */ static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_str_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_str_slot]; st->REPR->box_funcs.set_str(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_str_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native string"); } } /* Used with boxing. Gets a string value, for representations that can hold * one. */ static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_str_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_str_slot]; return st->REPR->box_funcs.get_str(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_str_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native string"); } } static void * get_boxed_ref(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_slots) { int i; for (i = 0; i < repr_data->num_attributes; i++) { if (repr_data->unbox_slots[i].repr_id == repr_id) return (char *)data + repr_data->attribute_offsets[repr_data->unbox_slots[i].slot]; else if (repr_data->unbox_slots[i].repr_id == 0) break; } } MVM_exception_throw_adhoc(tc, "P6opaque: get_boxed_ref could not unbox for the representation '%d'", repr_id); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; if (repr_data) return &repr_data->storage_spec; return &default_storage_spec; } static void mk_storage_spec(MVMThreadContext *tc, MVMP6opaqueREPRData * repr_data, MVMStorageSpec *spec) { spec->inlineable = MVM_STORAGE_SPEC_REFERENCE; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec->can_box = 0; if (repr_data->unbox_int_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_INT; if (repr_data->unbox_num_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_NUM; if (repr_data->unbox_str_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_STR; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMint64 mro_pos, mro_count, num_parents, total_attrs, num_attrs, cur_slot, cur_type, cur_alloc_addr, cur_obj_attr, cur_init_slot, cur_mark_slot, cur_cleanup_slot, cur_unbox_slot, unboxed_type, i; MVMObject *info; MVMStringConsts str_consts = tc->instance->str_consts; MVMString * const str_avc = str_consts.auto_viv_container; MVMString * const str_name = str_consts.name; MVMString * const str_type = str_consts.type; MVMString * const str_ass_del = str_consts.associative_delegate; MVMString * const str_pos_del = str_consts.positional_delegate; MVMString * const str_attribute = str_consts.attribute; MVMString * const str_box_target = str_consts.box_target; /* Allocate the representation data. */ MVMP6opaqueREPRData *repr_data = MVM_malloc(sizeof(MVMP6opaqueREPRData)); memset(repr_data, 0, sizeof(MVMP6opaqueREPRData)); /* Find attribute information. */ info = MVM_repr_at_key_o(tc, info_hash, str_attribute); if (MVM_is_null(tc, info)) MVM_exception_throw_adhoc(tc, "P6opaque: missing attribute protocol in compose"); /* In this first pass, we'll over the MRO entries, looking for if * there is any multiple inheritance and counting the number of * attributes. */ mro_count = REPR(info)->elems(tc, STABLE(info), info, OBJECT_BODY(info)); mro_pos = mro_count; total_attrs = 0; while (mro_pos--) { /* Get info for the class at the current position. */ MVMObject *class_info = MVM_repr_at_pos_o(tc, info, mro_pos); /* Get its list of attributes and parents. */ MVMObject *attr_list = MVM_repr_at_pos_o(tc, class_info, 1); MVMObject *parent_list = MVM_repr_at_pos_o(tc, class_info, 2); /* If there's more than one parent, set the multiple inheritance * flag (this means we have non-linear layout). */ num_parents = REPR(parent_list)->elems(tc, STABLE(parent_list), parent_list, OBJECT_BODY(parent_list)); if (num_parents > 1) repr_data->mi = 1; /* Add attribute count to the running total. */ total_attrs += REPR(attr_list)->elems(tc, STABLE(attr_list), attr_list, OBJECT_BODY(attr_list)); } /* Fill out and allocate other things we now can. */ repr_data->num_attributes = total_attrs; if (total_attrs) { repr_data->attribute_offsets = MVM_malloc(total_attrs * sizeof(MVMuint16)); repr_data->flattened_stables = MVM_malloc(total_attrs * sizeof(MVMSTable *)); repr_data->auto_viv_values = MVM_malloc(total_attrs * sizeof(MVMObject *)); repr_data->gc_obj_mark_offsets = MVM_malloc(total_attrs * sizeof(MVMuint16)); memset(repr_data->flattened_stables, 0, total_attrs * sizeof(MVMSTable *)); memset(repr_data->auto_viv_values, 0, total_attrs * sizeof(MVMObject *)); } repr_data->name_to_index_mapping = MVM_malloc((mro_count + 1) * sizeof(MVMP6opaqueNameMap)); repr_data->initialize_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); repr_data->gc_mark_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); repr_data->gc_cleanup_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); memset(repr_data->name_to_index_mapping, 0, (mro_count + 1) * sizeof(MVMP6opaqueNameMap)); /* -1 indicates no unboxing or delegate possible for a type. */ repr_data->unbox_int_slot = -1; repr_data->unbox_num_slot = -1; repr_data->unbox_str_slot = -1; repr_data->pos_del_slot = -1; repr_data->ass_del_slot = -1; /* Second pass populates the rest of the REPR data. */ mro_pos = mro_count; cur_slot = 0; cur_type = 0; cur_alloc_addr = sizeof(MVMP6opaqueBody); cur_obj_attr = 0; cur_init_slot = 0; cur_mark_slot = 0; cur_cleanup_slot = 0; cur_unbox_slot = 0; while (mro_pos--) { /* Get info for the class at the current position. */ MVMObject *class_info = MVM_repr_at_pos_o(tc, info, mro_pos); MVMObject *type_obj = MVM_repr_at_pos_o(tc, class_info, 0); MVMObject *attr_list = MVM_repr_at_pos_o(tc, class_info, 1); /* Set up name map entry. */ MVMP6opaqueNameMap *name_map = &repr_data->name_to_index_mapping[cur_type]; num_attrs = REPR(attr_list)->elems(tc, STABLE(attr_list), attr_list, OBJECT_BODY(attr_list)); MVM_ASSIGN_REF(tc, &(st->header), name_map->class_key, type_obj); name_map->num_attrs = num_attrs; if (num_attrs) { name_map->names = MVM_malloc(num_attrs * sizeof(MVMString *)); name_map->slots = MVM_malloc(num_attrs * sizeof(MVMuint16)); } /* Go over the attributes. */ for (i = 0; i < num_attrs; i++) { MVMObject *attr_info = MVM_repr_at_pos_o(tc, attr_list, i); /* Extract name, type and if it's a box target. */ MVMObject *name_obj = MVM_repr_at_key_o(tc, attr_info, str_name); MVMObject *type = MVM_repr_at_key_o(tc, attr_info, str_type); MVMint64 is_box_target = REPR(attr_info)->ass_funcs.exists_key(tc, STABLE(attr_info), attr_info, OBJECT_BODY(attr_info), (MVMObject *)str_box_target); MVMint8 inlined = 0; MVMuint32 bits; MVMuint32 align; /* Ensure we have a name. */ if (MVM_is_null(tc, name_obj)) MVM_exception_throw_adhoc(tc, "P6opaque: missing attribute name"); if (REPR(name_obj)->ID == MVM_REPR_ID_MVMString) { MVM_ASSIGN_REF(tc, &(st->header), name_map->names[i], (MVMString *)name_obj); } else { MVM_ASSIGN_REF(tc, &(st->header), name_map->names[i], MVM_repr_get_str(tc, name_obj)); } name_map->slots[i] = cur_slot; /* Consider the type. */ unboxed_type = MVM_STORAGE_SPEC_BP_NONE; bits = sizeof(MVMObject *) * 8; align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* Get the storage spec of the type and see what it wants. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); if (spec->inlineable == MVM_STORAGE_SPEC_INLINED) { /* Yes, it's something we'll flatten. */ unboxed_type = spec->boxed_primitive; bits = spec->bits; align = spec->align; MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[cur_slot], STABLE(type)); inlined = 1; /* Does it need special initialization? */ if (REPR(type)->initialize) { repr_data->initialize_slots[cur_init_slot] = cur_slot; cur_init_slot++; } /* Does it have special GC needs? */ if (REPR(type)->gc_mark) { repr_data->gc_mark_slots[cur_mark_slot] = cur_slot; cur_mark_slot++; } if (REPR(type)->gc_cleanup) { repr_data->gc_cleanup_slots[cur_cleanup_slot] = cur_slot; cur_cleanup_slot++; } /* Is it a target for box/unbox operations? */ if (is_box_target) { /* If it boxes a primitive, note that. */ switch (unboxed_type) { case MVM_STORAGE_SPEC_BP_INT: if (repr_data->unbox_int_slot >= 0) MVM_exception_throw_adhoc(tc, "Duplicate box_target for native int"); repr_data->unbox_int_slot = cur_slot; break; case MVM_STORAGE_SPEC_BP_NUM: if (repr_data->unbox_num_slot >= 0) MVM_exception_throw_adhoc(tc, "Duplicate box_target for native num"); repr_data->unbox_num_slot = cur_slot; break; case MVM_STORAGE_SPEC_BP_STR: if (repr_data->unbox_str_slot >= 0) MVM_exception_throw_adhoc(tc, "Duplicate box_target for native str"); repr_data->unbox_str_slot = cur_slot; break; default: /* nothing, just suppress 'missing default' warning */ break; } /* Also list in the by-repr unbox list. */ if (repr_data->unbox_slots == NULL) repr_data->unbox_slots = (MVMP6opaqueBoxedTypeMap *)MVM_calloc(total_attrs, sizeof(MVMP6opaqueBoxedTypeMap)); repr_data->unbox_slots[cur_unbox_slot].repr_id = REPR(type)->ID; repr_data->unbox_slots[cur_unbox_slot].slot = cur_slot; cur_unbox_slot++; } } } /* C structure needs careful alignment. If cur_alloc_addr is not * aligned to align bytes (cur_alloc_addr % align), make sure it is * before we add the next element. */ if (cur_alloc_addr % align) { cur_alloc_addr += align - cur_alloc_addr % align; } /* Attribute will live at the current position in the object. */ repr_data->attribute_offsets[cur_slot] = cur_alloc_addr; /* Handle object attributes, which need marking and may have auto-viv needs. */ if (!inlined) { repr_data->gc_obj_mark_offsets[cur_obj_attr] = cur_alloc_addr; if (MVM_repr_exists_key(tc, attr_info, str_avc)) MVM_ASSIGN_REF(tc, &(st->header), repr_data->auto_viv_values[cur_slot], MVM_repr_at_key_o(tc, attr_info, str_avc)); cur_obj_attr++; } /* Is it a positional or associative delegate? */ if (MVM_repr_exists_key(tc, attr_info, str_pos_del)) { if (repr_data->pos_del_slot != -1) MVM_exception_throw_adhoc(tc, "Duplicate positional delegate attribute"); if (unboxed_type == MVM_STORAGE_SPEC_BP_NONE) repr_data->pos_del_slot = cur_slot; else MVM_exception_throw_adhoc(tc, "Positional delegate attribute must be a reference type"); } if (MVM_repr_exists_key(tc, attr_info, str_ass_del)) { if (repr_data->ass_del_slot != -1) MVM_exception_throw_adhoc(tc, "Duplicate associative delegate attribute"); if (unboxed_type == MVM_STORAGE_SPEC_BP_NONE) repr_data->ass_del_slot = cur_slot; else MVM_exception_throw_adhoc(tc, "Associative delegate attribute must be a reference type"); } /* Add the required space for this type. */ cur_alloc_addr += bits / 8; /* Increment slot count. */ cur_slot++; } /* Increment name map type index. */ cur_type++; } /* Add allocated amount for body to have total object size. */ st->size = sizeof(MVMP6opaque) + (cur_alloc_addr - sizeof(MVMP6opaqueBody)); /* Add sentinels/counts. */ repr_data->gc_obj_mark_offsets_count = cur_obj_attr; repr_data->initialize_slots[cur_init_slot] = -1; repr_data->gc_mark_slots[cur_mark_slot] = -1; repr_data->gc_cleanup_slots[cur_cleanup_slot] = -1; /* Add storage spec */ mk_storage_spec(tc, repr_data, &repr_data->storage_spec); /* Install representation data. */ st->REPR_data = repr_data; } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* To calculate size, we need number of attributes and to know about * anything flattend in. */ MVMint64 num_attributes = MVM_serialization_read_varint(tc, reader); MVMuint32 cur_offset = sizeof(MVMP6opaque); MVMint64 i; for (i = 0; i < num_attributes; i++) { if (MVM_serialization_read_varint(tc, reader)) { MVMSTable *st = MVM_serialization_read_stable_ref(tc, reader); const MVMStorageSpec *ss = st->REPR->get_storage_spec(tc, st); if (ss->inlineable) { /* TODO: Review if/when we get sub-byte things. */ if (cur_offset % ss->align) { cur_offset += ss->align - cur_offset % ss->align; } cur_offset += ss->bits / 8; } else cur_offset += sizeof(MVMObject *); } else { cur_offset += sizeof(MVMObject *); } } st->size = cur_offset; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 i, num_classes; if (!repr_data->name_to_index_mapping) MVM_exception_throw_adhoc(tc, "Representation must be composed before it can be serialized"); MVM_serialization_write_varint(tc, writer, repr_data->num_attributes); for (i = 0; i < repr_data->num_attributes; i++) { MVM_serialization_write_varint(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); } MVM_serialization_write_varint(tc, writer, repr_data->mi); if (repr_data->auto_viv_values) { MVM_serialization_write_varint(tc, writer, 1); for (i = 0; i < repr_data->num_attributes; i++) MVM_serialization_write_ref(tc, writer, repr_data->auto_viv_values[i]); } else { MVM_serialization_write_varint(tc, writer, 0); } MVM_serialization_write_varint(tc, writer, repr_data->unbox_int_slot); MVM_serialization_write_varint(tc, writer, repr_data->unbox_num_slot); MVM_serialization_write_varint(tc, writer, repr_data->unbox_str_slot); if (repr_data->unbox_slots) { MVM_serialization_write_varint(tc, writer, 1); for (i = 0; i < repr_data->num_attributes; i++) { MVM_serialization_write_varint(tc, writer, repr_data->unbox_slots[i].repr_id); MVM_serialization_write_varint(tc, writer, repr_data->unbox_slots[i].slot); } } else { MVM_serialization_write_varint(tc, writer, 0); } i = 0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_varint(tc, writer, num_classes); for (i = 0; i < num_classes; i++) { const MVMuint32 num_attrs = repr_data->name_to_index_mapping[i].num_attrs; MVMuint32 j; MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_varint(tc, writer, num_attrs); for (j = 0; j < num_attrs; j++) { MVM_serialization_write_str(tc, writer, repr_data->name_to_index_mapping[i].names[j]); MVM_serialization_write_varint(tc, writer, repr_data->name_to_index_mapping[i].slots[j]); } } MVM_serialization_write_varint(tc, writer, repr_data->pos_del_slot); MVM_serialization_write_varint(tc, writer, repr_data->ass_del_slot); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMuint16 i, j, num_classes, cur_offset; MVMint16 cur_initialize_slot, cur_gc_mark_slot, cur_gc_cleanup_slot; MVMP6opaqueREPRData *repr_data = MVM_malloc(sizeof(MVMP6opaqueREPRData)); repr_data->num_attributes = (MVMuint16)MVM_serialization_read_varint(tc, reader); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMSTable *)); for (i = 0; i < repr_data->num_attributes; i++) if (MVM_serialization_read_varint(tc, reader)) { MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->mi = MVM_serialization_read_varint(tc, reader); if (MVM_serialization_read_varint(tc, reader)) { repr_data->auto_viv_values = (MVMObject **)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMObject *)); for (i = 0; i < repr_data->num_attributes; i++) MVM_ASSIGN_REF(tc, &(st->header), repr_data->auto_viv_values[i], MVM_serialization_read_ref(tc, reader)); } else { repr_data->auto_viv_values = NULL; } repr_data->unbox_int_slot = MVM_serialization_read_varint(tc, reader); repr_data->unbox_num_slot = MVM_serialization_read_varint(tc, reader); repr_data->unbox_str_slot = MVM_serialization_read_varint(tc, reader); if (MVM_serialization_read_varint(tc, reader)) { repr_data->unbox_slots = (MVMP6opaqueBoxedTypeMap *)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMP6opaqueBoxedTypeMap)); for (i = 0; i < repr_data->num_attributes; i++) { repr_data->unbox_slots[i].repr_id = MVM_serialization_read_varint(tc, reader); repr_data->unbox_slots[i].slot = MVM_serialization_read_varint(tc, reader); } } else { repr_data->unbox_slots = NULL; } num_classes = (MVMuint16)MVM_serialization_read_varint(tc, reader); repr_data->name_to_index_mapping = (MVMP6opaqueNameMap *)MVM_malloc((num_classes + 1) * sizeof(MVMP6opaqueNameMap)); for (i = 0; i < num_classes; i++) { MVMint32 num_attrs = 0; MVM_ASSIGN_REF(tc, &(st->header), repr_data->name_to_index_mapping[i].class_key, MVM_serialization_read_ref(tc, reader)); num_attrs = MVM_serialization_read_varint(tc, reader); repr_data->name_to_index_mapping[i].names = (MVMString **)MVM_malloc(P6OMAX(num_attrs, 1) * sizeof(MVMString *)); repr_data->name_to_index_mapping[i].slots = (MVMuint16 *)MVM_malloc(P6OMAX(num_attrs, 1) * sizeof(MVMuint16)); for (j = 0; j < num_attrs; j++) { MVM_ASSIGN_REF(tc, &(st->header), repr_data->name_to_index_mapping[i].names[j], MVM_serialization_read_str(tc, reader)); repr_data->name_to_index_mapping[i].slots[j] = (MVMuint16)MVM_serialization_read_varint(tc, reader); } repr_data->name_to_index_mapping[i].num_attrs = num_attrs; } /* set the last one to be NULL */ repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->pos_del_slot = (MVMint16)MVM_serialization_read_varint(tc, reader); repr_data->ass_del_slot = (MVMint16)MVM_serialization_read_varint(tc, reader); /* Re-calculate the remaining info, which is platform specific or * derived information. */ repr_data->attribute_offsets = (MVMuint16 *)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMuint16)); repr_data->gc_obj_mark_offsets = (MVMuint16 *)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMuint16)); repr_data->initialize_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_mark_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_cleanup_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_obj_mark_offsets_count = 0; cur_offset = sizeof(MVMP6opaqueBody); cur_initialize_slot = 0; cur_gc_mark_slot = 0; cur_gc_cleanup_slot = 0; for (i = 0; i < repr_data->num_attributes; i++) { if (repr_data->flattened_stables[i] == NULL) { /* Store position. */ repr_data->attribute_offsets[i] = cur_offset; /* Reference type. Needs marking. */ repr_data->gc_obj_mark_offsets[repr_data->gc_obj_mark_offsets_count] = cur_offset; repr_data->gc_obj_mark_offsets_count++; /* Increment by pointer size. */ cur_offset += sizeof(MVMObject *); } else { /* Store position. */ MVMSTable *cur_st = repr_data->flattened_stables[i]; const MVMStorageSpec *spec = cur_st->REPR->get_storage_spec(tc, cur_st); /* Set up flags for initialization and GC. */ if (cur_st->REPR->initialize) repr_data->initialize_slots[cur_initialize_slot++] = i; if (cur_st->REPR->gc_mark) repr_data->gc_mark_slots[cur_gc_mark_slot++] = i; if (cur_st->REPR->gc_cleanup) repr_data->gc_cleanup_slots[cur_gc_cleanup_slot++] = i; if (cur_offset % spec->align) { cur_offset += spec->align - cur_offset % spec->align; } repr_data->attribute_offsets[i] = cur_offset; /* Increment by size reported by representation. */ cur_offset += spec->bits / 8; } } repr_data->initialize_slots[cur_initialize_slot] = -1; repr_data->gc_mark_slots[cur_gc_mark_slot] = -1; repr_data->gc_cleanup_slots[cur_gc_cleanup_slot] = -1; mk_storage_spec(tc, repr_data, &repr_data->storage_spec); st->REPR_data = repr_data; } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 num_attributes = repr_data->num_attributes; MVMuint16 i; for (i = 0; i < num_attributes; i++) { MVMuint16 a_offset = repr_data->attribute_offsets[i]; MVMSTable *a_st = repr_data->flattened_stables[i]; if (a_st) a_st->REPR->deserialize(tc, a_st, root, (char *)data + a_offset, reader); else set_obj_at_offset(tc, root, data, a_offset, MVM_serialization_read_ref(tc, reader)); } } /* Serializes the object's body. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 num_attributes = repr_data->num_attributes; MVMuint16 i; if (!repr_data->name_to_index_mapping) MVM_exception_throw_adhoc(tc, "Representation must be composed before it can be serialized"); data = MVM_p6opaque_real_data(tc, data); for (i = 0; i < num_attributes; i++) { MVMuint16 a_offset = repr_data->attribute_offsets[i]; MVMSTable *a_st = repr_data->flattened_stables[i]; if (a_st) { if (a_st->REPR->serialize) a_st->REPR->serialize(tc, a_st, (char *)data + a_offset, writer); else MVM_exception_throw_adhoc(tc, "Missing serialize REPR function for REPR %s", a_st->REPR->name); } else MVM_serialization_write_ref(tc, writer, get_obj_at_offset(data, a_offset)); } } /* Performs a change of type, where possible. */ static void change_type(MVMThreadContext *tc, MVMObject *obj, MVMObject *new_type) { MVMP6opaqueREPRData *cur_repr_data = (MVMP6opaqueREPRData *)STABLE(obj)->REPR_data; MVMP6opaqueREPRData *new_repr_data = (MVMP6opaqueREPRData *)STABLE(new_type)->REPR_data; MVMP6opaqueNameMap *cur_map_entry, *new_map_entry; /* Ensure we don't have a type object. */ if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot change the type of a type object"); /* Ensure that the REPR of the new type is also P6opaque. */ if (REPR(new_type)->ID != REPR(obj)->ID) MVM_exception_throw_adhoc(tc, "New type must have a matching representation"); /* Ensure the MRO prefixes match up. */ cur_map_entry = cur_repr_data->name_to_index_mapping; new_map_entry = new_repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL && cur_map_entry->num_attrs == 0) cur_map_entry++; while (new_map_entry->class_key != NULL && new_map_entry->num_attrs == 0) new_map_entry++; while (cur_map_entry->class_key != NULL) { if (new_map_entry->class_key == NULL || new_map_entry->class_key != cur_map_entry->class_key) MVM_exception_throw_adhoc(tc, "Incompatible MROs in P6opaque rebless"); cur_map_entry++; new_map_entry++; } /* Resize if needed. */ if (STABLE(obj)->size != STABLE(new_type)->size) { /* Get current object body. */ MVMP6opaqueBody *body = (MVMP6opaqueBody *)OBJECT_BODY(obj); void *old = body->replaced ? body->replaced : body; /* Allocate new memory. */ size_t new_size = STABLE(new_type)->size - sizeof(MVMObject); void *new = MVM_malloc(new_size); memset((char *)new + (STABLE(obj)->size - sizeof(MVMObject)), 0, new_size - (STABLE(obj)->size - sizeof(MVMObject))); /* Copy existing to new. * XXX Need more care here, as may have to re-barrier pointers. */ memcpy(new, old, STABLE(obj)->size - sizeof(MVMObject)); /* Pointer switch, taking care of existing body issues. */ if (body->replaced) { body->replaced = new; MVM_free(old); } else { body->replaced = new; } } /* Finally, ready to switch over the STable. */ MVM_ASSIGN_REF(tc, &(obj->header), obj->st, STABLE(new_type)); } static void die_no_pos_del(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "This type does not support positional operations"); } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.at_pos(tc, STABLE(del), del, OBJECT_BODY(del), index, value, kind); } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.bind_pos(tc, STABLE(del), del, OBJECT_BODY(del), index, value, kind); } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.set_elems(tc, STABLE(del), del, OBJECT_BODY(del), count); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.push(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.pop(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.unshift(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.shift(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void osplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.splice(tc, STABLE(del), del, OBJECT_BODY(del), target_array, offset, elems); } static void die_no_ass_del(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "This type does not support associative operations"); } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.at_key(tc, STABLE(del), del, OBJECT_BODY(del), key, result, kind); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.bind_key(tc, STABLE(del), del, OBJECT_BODY(del), key, value, kind); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); return REPR(del)->ass_funcs.exists_key(tc, STABLE(del), del, OBJECT_BODY(del), key); } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.delete_key(tc, STABLE(del), del, OBJECT_BODY(del), key); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->pos_del_slot >= 0) { MVMObject *del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); return REPR(del)->elems(tc, STABLE(del), del, OBJECT_BODY(del)); } else if (repr_data->ass_del_slot >= 0) { MVMObject *del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); return REPR(del)->elems(tc, STABLE(del), del, OBJECT_BODY(del)); } else { MVM_exception_throw_adhoc(tc, "This type does not support elems"); } } /* Bytecode specialization for this REPR. */ static MVMString * spesh_attr_name(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o, MVMint32 indirect) { if (indirect) { MVMSpeshFacts *name_facts = MVM_spesh_get_and_use_facts(tc, g, o); if (name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) return name_facts->value.s; else return NULL; } else { return MVM_spesh_get_string(tc, g, o); } } static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMP6opaqueREPRData * repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 opcode = ins->info->opcode; if (!repr_data) return; switch (opcode) { case MVM_OP_create: { /* Create can be optimized if there are no initialization slots. */ if (repr_data->initialize_slots[0] < 0 && !(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = st->size; ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } case MVM_OP_getattr_o: case MVM_OP_getattrs_o: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_o); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && !repr_data->mi && !repr_data->flattened_stables[slot]) { if (repr_data->auto_viv_values && repr_data->auto_viv_values[slot]) { MVMObject *av_value = repr_data->auto_viv_values[slot]; if (IS_CONCRETE(av_value)) { ins->info = MVM_op_get_op(MVM_OP_sp_p6ogetvc_o); } else { ins->info = MVM_op_get_op(MVM_OP_sp_p6ogetvt_o); } if (opcode == MVM_OP_getattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[3].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)av_value); } else { if (opcode == MVM_OP_getattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_o); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_getattr_i: case MVM_OP_getattrs_i: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_i); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6int && flat_ss->bits == 64) { if (opcode == MVM_OP_getattrs_i) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_i); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_getattr_n: case MVM_OP_getattrs_n: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_n); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6num && flat_ss->bits == 64) { if (opcode == MVM_OP_getattrs_n) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_n); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_getattr_s: case MVM_OP_getattrs_s: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_s); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; if (flat_st->REPR->ID == MVM_REPR_ID_P6str) { if (opcode == MVM_OP_getattrs_s) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_s); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_bindattr_o: case MVM_OP_bindattrs_o: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_o); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && !repr_data->flattened_stables[slot]) { if (opcode == MVM_OP_bindattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_o); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } break; } case MVM_OP_bindattr_i: case MVM_OP_bindattrs_i: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_i); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6int && flat_ss->bits == 64) { if (opcode == MVM_OP_bindattrs_i) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_i); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } case MVM_OP_bindattr_n: case MVM_OP_bindattrs_n: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_n); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6num && flat_ss->bits == 64) { if (opcode == MVM_OP_bindattrs_n) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_n); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } case MVM_OP_bindattr_s: case MVM_OP_bindattrs_s: { MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_s); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; if (flat_st->REPR->ID == MVM_REPR_ID_P6str) { if (opcode == MVM_OP_bindattrs_s) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_s); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } } } /* Initializes the representation. */ const MVMREPROps * MVMP6opaque_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, allocate, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized }, /* attr_funcs */ { set_int, get_int, set_num, get_num, set_str, get_str, get_boxed_ref }, /* box_funcs */ { at_pos, bind_pos, set_elems, push, pop, unshift, shift, osplice, NULL }, /* pos_funcs */ { at_key, bind_key, exists_key, delete_key, NULL }, /* ass_funcs */ elems, get_storage_spec, change_type, serialize, deserialize, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, spesh, "P6opaque", /* name */ MVM_REPR_ID_P6opaque, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/P6opaque.h0000644000175000017500000001037312516136714017043 0ustar jnthnjnthn/* This is how an instance with the P6opaque representation starts. However, what * follows on from this depends on the declaration. For object attributes, it will * be a pointer size and point to another MVMObject. For native integers and * numbers, it will be the appropriate sized piece of memory to store them * right there in the object. Note that P6opaque does not do packed storage, so * an int2 gets as much space as an int. */ struct MVMP6opaqueBody { /* If we get mixed into, we may change size. If so, we can't really resize * the object, so instead we hang its post-resize form off this pointer. * In the future, more clever things are possible (like only putting the * new fields into this object). */ void *replaced; }; struct MVMP6opaque { MVMObject common; MVMP6opaqueBody body; }; /* This is used in the name to slot mapping. Indicates the class key that * we have the mappings for, followed by arrays of names and slots. (Yeah, * could use a hash, but much code will resolve these statically to the * slots). */ struct MVMP6opaqueNameMap { MVMObject *class_key; MVMString **names; MVMuint16 *slots; MVMuint32 num_attrs; }; /* This is used in boxed type mappings. */ struct MVMP6opaqueBoxedTypeMap { MVMuint32 repr_id; MVMuint16 slot; }; /* The P6opaque REPR data has the slot mapping, allocation size and * various other bits of info. It hangs off the REPR_data pointer * in the s-table. */ struct MVMP6opaqueREPRData { /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMuint16 num_attributes; /* Slot containing object to delegate for positional things. */ MVMint16 pos_del_slot; /* Slot containing object to delegate for associative things. */ MVMint16 ass_del_slot; /* Flags if we are MI or not. */ MVMuint16 mi; /* Slot to delegate to when we need to unbox to a native integer. */ MVMint16 unbox_int_slot; /* Slot to delegate to when we need to unbox to a native number. */ MVMint16 unbox_num_slot; /* Slot to delegate to when we need to unbox to a native string. */ MVMint16 unbox_str_slot; /* Offsets into the object that are eligible for GC marking, and how * many of them we have. */ MVMuint16 gc_obj_mark_offsets_count; MVMuint16 *gc_obj_mark_offsets; /* Maps attribute position numbers to the byte offset in the object. */ MVMuint16 *attribute_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are just reference types. */ MVMSTable **flattened_stables; /* Instantiated objects are just a blank piece of memory that needs to * be set up. However, in some cases we'd like them to magically turn in * to some container type. */ MVMObject **auto_viv_values; /* If we have any other boxings, this maps repr ID to slot. */ MVMP6opaqueBoxedTypeMap *unbox_slots; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMP6opaqueNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint16 *initialize_slots; /* Slots holding flattened objects that need another REPR to mark them; * terminated with -1. */ MVMint16 *gc_mark_slots; /* Slots holding flattened objects that need another REPR to clean them; * terminated with -1. */ MVMint16 *gc_cleanup_slots; /* Hold the storage spec */ MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6opaque_initialize(MVMThreadContext *tc); /* If an object gets mixed in to, we need to be sure we look at its real body, * which may have been moved to hang off the specified pointer. * * NB: This has been hardcoded into the jit compilation. Thus, consider it * set into stone :-). That is the price you pay for disintermediation. */ MVM_STATIC_INLINE void * MVM_p6opaque_real_data(MVMThreadContext *tc, void *data) { MVMP6opaqueBody *body = (MVMP6opaqueBody *)data; return body->replaced ? body->replaced : data; } MoarVM-2015.11/src/6model/reprs/P6str.c0000644000175000017500000000724312456307241016354 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6str); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6strBody *src_body = (MVMP6strBody *)src; MVMP6strBody *dest_body = (MVMP6strBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->value, src_body->value); } static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVM_ASSIGN_REF(tc, &(root->header), ((MVMP6strBody *)data)->value, value); } static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { return ((MVMP6strBody *)data)->value; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMString*) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_STR, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_STR, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVM_gc_worklist_add(tc, worklist, &((MVMP6strBody *)data)->value); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6str); } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVM_ASSIGN_REF(tc, &(root->header), ((MVMP6strBody *)data)->value, MVM_serialization_read_str(tc, reader)); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_str(tc, writer, ((MVMP6strBody *)data)->value); } /* Initializes the representation. */ const MVMREPROps * MVMP6str_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, set_str, get_str, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "P6str", /* name */ MVM_REPR_ID_P6str, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/P6str.h0000644000175000017500000000037712456307241016362 0ustar jnthnjnthn/* Representation used by P6 native strings. */ struct MVMP6strBody { MVMString *value; }; struct MVMP6str { MVMObject common; MVMP6strBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6str_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/README.md0000644000175000017500000000007112456307241016441 0ustar jnthnjnthn## Representations *summary of each representation here*MoarVM-2015.11/src/6model/reprs/ReentrantMutex.c0000644000175000017500000001166012554473060020323 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Populates the object body with a mutex. */ static void initialize_mutex(MVMThreadContext *tc, MVMReentrantMutexBody *rm) { int init_stat; rm->mutex = MVM_malloc(sizeof(uv_mutex_t)); if ((init_stat = uv_mutex_init(rm->mutex)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMReentrantMutex); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { initialize_mutex(tc, (MVMReentrantMutexBody *)data); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ReentrantMutex"); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { /* The ThreadContext has already been destroyed by the GC. */ MVMReentrantMutex *rm = (MVMReentrantMutex *)obj; uv_mutex_destroy(rm->body.mutex); MVM_free(rm->body.mutex); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMReentrantMutex); } /* Serializing a mutex doesn't save anything; we will re-create it upon * deserialization. Makes data structures that just happen to have a lock in * them serializable. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { initialize_mutex(tc, (MVMReentrantMutexBody *)data); } /* Initializes the representation. */ const MVMREPROps * MVMReentrantMutex_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ReentrantMutex", /* name */ MVM_REPR_ID_ReentrantMutex, 0, /* refs_frames */ }; /* Locks the mutex. */ void MVM_reentrantmutex_lock(MVMThreadContext *tc, MVMReentrantMutex *rm) { if (MVM_load(&rm->body.holder_id) == tc->thread_id) { /* We already hold the lock; bump the count. */ MVM_incr(&rm->body.lock_count); } else { /* Not holding the lock; obtain it. */ MVMROOT(tc, rm, { MVM_gc_mark_thread_blocked(tc); uv_mutex_lock(rm->body.mutex); MVM_gc_mark_thread_unblocked(tc); }); MVM_store(&rm->body.holder_id, tc->thread_id); MVM_store(&rm->body.lock_count, 1); tc->num_locks++; } } /* Unlocks the mutex. */ void MVM_reentrantmutex_unlock(MVMThreadContext *tc, MVMReentrantMutex *rm) { /* Ensure we hold the lock. */ if (MVM_load(&rm->body.holder_id) == tc->thread_id) { if (MVM_decr(&rm->body.lock_count) == 1) { /* Decremented the last recursion count; really unlock. */ MVM_store(&rm->body.holder_id, 0); uv_mutex_unlock(rm->body.mutex); tc->num_locks--; } } else { MVM_exception_throw_adhoc(tc, "Attempt to unlock mutex by thread not holding it"); } } MoarVM-2015.11/src/6model/reprs/ReentrantMutex.h0000644000175000017500000000146212456307241020325 0ustar jnthnjnthn/* Representation used for VM thread handles. */ struct MVMReentrantMutexBody { /* The (non-reentrant) mutex supplied by libuv. Sadly, we have to hold it * at a level of indirection - at least on Windows - because if the object * is moved it causes confusion. */ uv_mutex_t *mutex; /* Who currently holds the mutex, if anyone. */ AO_t holder_id; /* How many times we've taken the lock. */ AO_t lock_count; }; struct MVMReentrantMutex { MVMObject common; MVMReentrantMutexBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMReentrantMutex_initialize(MVMThreadContext *tc); /* Lock and unlock functions. */ void MVM_reentrantmutex_lock(MVMThreadContext *tc, MVMReentrantMutex *rm); void MVM_reentrantmutex_unlock(MVMThreadContext *tc, MVMReentrantMutex *rm); MoarVM-2015.11/src/6model/reprs/SCRef.c0000644000175000017500000001363212554473060016301 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMSerializationContext); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMObject *root_codes, *rep_indexes, *rep_scs, *owned_objects, *rm; MVMInstance *instance = tc->instance; MVMObject *BOOTIntArray = instance->boot_types.BOOTIntArray; MVMSerializationContextBody *sc = ((MVMSerializationContext *)root)->body; MVM_gc_root_temp_push(tc, (MVMCollectable **)&root); rep_indexes = REPR(BOOTIntArray)->allocate(tc, STABLE(BOOTIntArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->rep_indexes, rep_indexes); rm = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTReentrantMutex); MVM_ASSIGN_REF(tc, &(root->header), sc->mutex, rm); root_codes = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->root_codes, root_codes); rep_scs = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->rep_scs, rep_scs); owned_objects = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->owned_objects, owned_objects); MVM_gc_root_temp_pop(tc); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation SCRef"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMSerializationContextBody *sc = ((MVMSerializationContextBody **)data)[0]; MVMuint64 i; MVM_gc_worklist_add(tc, worklist, &sc->handle); MVM_gc_worklist_add(tc, worklist, &sc->description); MVM_gc_worklist_add(tc, worklist, &sc->root_codes); MVM_gc_worklist_add(tc, worklist, &sc->rep_indexes); MVM_gc_worklist_add(tc, worklist, &sc->rep_scs); MVM_gc_worklist_add(tc, worklist, &sc->owned_objects); for (i = 0; i < sc->num_objects; i++) MVM_gc_worklist_add(tc, worklist, &sc->root_objects[i]); for (i = 0; i < sc->num_stables; i++) MVM_gc_worklist_add(tc, worklist, &sc->root_stables[i]); MVM_gc_worklist_add(tc, worklist, &sc->sc); MVM_gc_worklist_add(tc, worklist, &sc->mutex); /* Mark serialization reader, if we have one. */ if (sc->sr) { MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.sc)); for (i = 0; i < sc->sr->root.num_dependencies; i++) MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.dependent_scs[i])); MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.string_heap)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.string_comp_unit)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->codes_list)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->current_object)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMSerializationContext *sc = (MVMSerializationContext *)obj; if (sc->body == NULL) return; /* Remove from weakref lookup hash (which doesn't count as a root). */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); HASH_DELETE(hash_handle, tc->instance->sc_weakhash, sc->body); tc->instance->all_scs[sc->body->sc_idx] = NULL; uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); /* Free manually managed STable list memory. */ MVM_free(sc->body->root_stables); /* If we have a serialization reader, clean that up too. */ if (sc->body->sr) { if (sc->body->sr->data_needs_free) MVM_free(sc->body->sr->data); MVM_free(sc->body->sr->contexts); MVM_free(sc->body->sr); } /* Free body. */ MVM_free(sc->body); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMSCRef_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "SCRef", /* name */ MVM_REPR_ID_SCRef, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/SCRef.h0000644000175000017500000000416012456307241016300 0ustar jnthnjnthn/* A serialization context exists (optionally) per compilation unit. * It contains the declarative objects for the compilation unit, and * they are serialized if code is pre-compiled. */ struct MVMSerializationContextBody { /* The handle of this SC. */ MVMString *handle; /* Description (probably the file name) if any. */ MVMString *description; /* The root set of objects that live in this SC. */ MVMuint64 num_objects; MVMuint64 alloc_objects; MVMObject **root_objects; /* The root set of STables that live in this SC. */ MVMSTable **root_stables; MVMuint64 num_stables; MVMuint64 alloc_stables; /* The root set of code refs that live in this SC. */ MVMObject *root_codes; /* Repossession info. The following lists have matching indexes, each * representing the integer of an object in our root set along with the SC * that the object was originally from. */ MVMObject *rep_indexes; MVMObject *rep_scs; /* Some things we deserialize are not directly in an SC, root set, but * rather are owned by others. This is mostly thanks to Parrot legacy, * where not everything was a 6model object. This is an array in twos, * mapping an object to its owner. */ MVMObject *owned_objects; /* Backlink to the (memory-managed) SC itself. If * this is null, it is unresolved. */ MVMSerializationContext *sc; /* Inline handle to the SCs hash (in MVMInstance). */ UT_hash_handle hash_handle; /* SC's index in the all_scs list in instance. */ MVMuint32 sc_idx; /* Reference to the SerializationReader we'll use to deserialize objects, * if this is an SC that we loaded. */ MVMSerializationReader *sr; /* Reentrant mutex protecting lazy deserialization of the SC. */ MVMObject *mutex; }; struct MVMSerializationContext { /* Normal header. */ MVMObject common; /* Body is a level of indirection away to ease memory management of the * weak hash. */ MVMSerializationContextBody *body; }; /* Function for REPR setup. */ const MVMREPROps * MVMSCRef_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/reprs/Semaphore.c0000644000175000017500000000717412456307241017264 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMSemaphore); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation Semaphore"); } /* Set up the Semaphore with its initial value. */ static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMSemaphoreBody *body = (MVMSemaphoreBody *)data; int r; if ((r = uv_sem_init(&body->sem, (MVMuint32) value)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize Semaphore: %s", uv_strerror(r)); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMSemaphore *sem = (MVMSemaphore *)obj; uv_sem_destroy(&sem->body.sem); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMSemaphore); } /* Initializes the representation. */ const MVMREPROps * MVMSemaphore_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Semaphore", /* name */ MVM_REPR_ID_Semaphore, 0, /* Semaphore */ }; MVMint64 MVM_semaphore_tryacquire(MVMThreadContext *tc, MVMSemaphore *sem) { int r = uv_sem_trywait(&sem->body.sem); return !r; } void MVM_semaphore_acquire(MVMThreadContext *tc, MVMSemaphore *sem) { uv_sem_wait(&sem->body.sem); } void MVM_semaphore_release(MVMThreadContext *tc, MVMSemaphore *sem) { uv_sem_post(&sem->body.sem); } MoarVM-2015.11/src/6model/reprs/Semaphore.h0000644000175000017500000000101012456307241017250 0ustar jnthnjnthn/* Representation used for VM thread handles. */ struct MVMSemaphoreBody { uv_sem_t sem; }; struct MVMSemaphore { MVMObject common; MVMSemaphoreBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMSemaphore_initialize(MVMThreadContext *tc); /* Acquire and release functions. */ MVMint64 MVM_semaphore_tryacquire(MVMThreadContext *tc, MVMSemaphore *sem); void MVM_semaphore_acquire(MVMThreadContext *tc, MVMSemaphore *sem); void MVM_semaphore_release(MVMThreadContext *tc, MVMSemaphore *sem); MoarVM-2015.11/src/6model/reprs/Uninstantiable.c0000644000175000017500000000521212456307241020310 0ustar jnthnjnthn#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMUninstantiable); }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "You cannot create an instance of this type"); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { /* Nothing to copy. */ } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMUninstantiable); } /* Initializes the representation. */ const MVMREPROps * MVMUninstantiable_initialize(MVMThreadContext *tc) { return &this_repr; } static const MVMREPROps this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Uninstantiable", /* name */ MVM_REPR_ID_Uninstantiable, 0, /* refs_frames */ }; MoarVM-2015.11/src/6model/reprs/Uninstantiable.h0000644000175000017500000000031112456307241020310 0ustar jnthnjnthn/* Representation used by Uninstantiables. */ struct MVMUninstantiable { MVMObject common; }; /* Function for REPR setup. */ const MVMREPROps * MVMUninstantiable_initialize(MVMThreadContext *tc); MoarVM-2015.11/src/6model/sc.c0000644000175000017500000004455012554473060014614 0ustar jnthnjnthn#include "moar.h" /* Creates a new serialization context with the specified handle. If any * compilation units are waiting for an SC with this handle, removes it from * their to-resolve list after installing itself in the appropriate slot. */ MVMObject * MVM_sc_create(MVMThreadContext *tc, MVMString *handle) { MVMSerializationContext *sc; MVMSerializationContextBody *scb; /* Allocate. */ MVMROOT(tc, handle, { sc = (MVMSerializationContext *)REPR(tc->instance->SCRef)->allocate(tc, STABLE(tc->instance->SCRef)); MVMROOT(tc, sc, { /* Add to weak lookup hash. */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_string_flatten(tc, handle); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); if (!scb) { sc->body = scb = MVM_calloc(1, sizeof(MVMSerializationContextBody)); MVM_ASSIGN_REF(tc, &(sc->common.header), scb->handle, handle); MVM_HASH_BIND(tc, tc->instance->sc_weakhash, handle, scb); /* Calling repr_init will allocate, BUT if it does so, and we * get unlucky, the GC will try to acquire mutex_sc_weakhash. * This deadlocks. Thus, we force allocation in gen2, which * can never trigger GC. Note that releasing the mutex early * is not a good way to fix this, as it leaves a race to * test/set scb->sc (between the line doing it in this block, * and in the else clauses beneath it). */ MVM_gc_allocate_gen2_default_set(tc); MVM_repr_init(tc, (MVMObject *)sc); MVM_gc_allocate_gen2_default_clear(tc); scb->sc = sc; MVM_sc_add_all_scs_entry(tc, scb); } else if (scb->sc) { /* we lost a race to create it! */ sc = scb->sc; } else { scb->sc = sc; sc->body = scb; MVM_ASSIGN_REF(tc, &(sc->common.header), scb->handle, handle); MVM_repr_init(tc, (MVMObject *)sc); } uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); }); }); return (MVMObject *)sc; } /* Makes an entry in all SCs list, the index of which is used to refer to * SCs in object headers. */ void MVM_sc_add_all_scs_entry(MVMThreadContext *tc, MVMSerializationContextBody *scb) { if (tc->instance->all_scs_next_idx == tc->instance->all_scs_alloc) { tc->instance->all_scs_alloc += 32; if (tc->instance->all_scs_next_idx == 0) { /* First time; allocate, and NULL first slot as it is * the "no SC" sentinel value. */ tc->instance->all_scs = MVM_malloc(tc->instance->all_scs_alloc * sizeof(MVMSerializationContextBody *)); tc->instance->all_scs[0] = NULL; tc->instance->all_scs_next_idx++; } else { tc->instance->all_scs = MVM_realloc(tc->instance->all_scs, tc->instance->all_scs_alloc * sizeof(MVMSerializationContextBody *)); } } scb->sc_idx = tc->instance->all_scs_next_idx; tc->instance->all_scs[tc->instance->all_scs_next_idx] = scb; tc->instance->all_scs_next_idx++; } /* Given an SC, returns its unique handle. */ MVMString * MVM_sc_get_handle(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->handle; } /* Given an SC, returns its description. */ MVMString * MVM_sc_get_description(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->description; } /* Given an SC, sets its description. */ void MVM_sc_set_description(MVMThreadContext *tc, MVMSerializationContext *sc, MVMString *desc) { MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->description, desc); } /* Given an SC, looks up the index of an object that is in its root set. */ MVMint64 MVM_sc_find_object_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMObject **roots; MVMint64 i, count; MVMuint32 cached = MVM_get_idx_in_sc(&obj->header); if (cached != ~0) return cached; roots = sc->body->root_objects; count = sc->body->num_objects; for (i = 0; i < count; i++) if (roots[i] == obj) return i; MVM_exception_throw_adhoc(tc, "Object does not exist in serialization context"); } /* Given an SC, looks up the index of an STable that is in its root set. */ MVMint64 MVM_sc_find_stable_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st) { MVMuint64 i; MVMuint32 cached = MVM_get_idx_in_sc(&st->header); if (cached != ~0) return cached; for (i = 0; i < sc->body->num_stables; i++) if (sc->body->root_stables[i] == st) return i; MVM_exception_throw_adhoc(tc, "STable does not exist in serialization context"); } /* Given an SC, looks up the index of a code ref that is in its root set. */ MVMint64 MVM_sc_find_code_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMObject *roots; MVMint64 i, count; roots = sc->body->root_codes; count = MVM_repr_elems(tc, roots); for (i = 0; i < count; i++) { MVMObject *test = MVM_repr_at_pos_o(tc, roots, i); if (test == obj) return i; } if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { char *c_name = MVM_string_utf8_encode_C_string(tc, ((MVMCode *)obj)->body.name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Code ref '%s' does not exist in serialization context", c_name); } else { MVM_exception_throw_adhoc(tc, "Code ref '' does not exist in serialization context"); } } /* Given a compilation unit and dependency index, returns that SC. */ MVMSerializationContext * MVM_sc_get_sc(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep) { MVMSerializationContext *sc = cu->body.scs[dep]; if (sc == NULL) { MVMSerializationContextBody *scb = cu->body.scs_to_resolve[dep]; if (!scb) MVM_exception_throw_adhoc(tc, "SC resolution: internal error"); sc = scb->sc; if (sc == NULL) return NULL; MVM_ASSIGN_REF(tc, &(cu->common.header), cu->body.scs[dep], sc); } return sc; } /* Checks if an SC is currently in the process of doing deserialization work. */ MVM_STATIC_INLINE MVMint64 sc_working(MVMSerializationContext *sc) { MVMSerializationReader *sr = sc->body->sr; return sr && sr->working; } /* Given an SC and an index, fetch the object stored there. */ MVMObject * MVM_sc_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject **roots = sc->body->root_objects; MVMint64 count = sc->body->num_objects; if (idx >= 0 && idx < count) return roots[idx] && !sc_working(sc) ? roots[idx] : MVM_serialization_demand_object(tc, sc, idx); else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no object at index %"PRId64")", c_description, idx); } } MVMObject * MVM_sc_get_sc_object(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep, MVMint64 idx) { if (dep >= 0 && dep < cu->body.num_scs) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); return MVM_sc_get_object(tc, sc, idx); } else { MVM_exception_throw_adhoc(tc, "Invalid SC index in bytecode stream"); } } /* Given an SC and an index, fetch the object stored there, or return NULL if * there is none. Does not cause lazy deserialization. */ MVMObject * MVM_sc_try_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject **roots = sc->body->root_objects; MVMint64 count = sc->body->num_objects; if (idx > 0 && idx < count) return roots[idx]; else return NULL; } /* Given an SC, an index, and an object, store the object at that index. */ void MVM_sc_set_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *obj) { if (idx < 0) MVM_exception_throw_adhoc(tc, "Invalid (negative) object root index %"PRId64"", idx); if (idx < sc->body->num_objects) { /* Just updating an existing one. */ MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_objects[idx], obj); } else { if (idx >= sc->body->alloc_objects) { MVMint64 orig_size = sc->body->alloc_objects; sc->body->alloc_objects *= 2; if (sc->body->alloc_objects < idx + 1) sc->body->alloc_objects = idx + 1; sc->body->root_objects = MVM_realloc(sc->body->root_objects, sc->body->alloc_objects * sizeof(MVMObject *)); memset(sc->body->root_objects + orig_size, 0, (sc->body->alloc_objects - orig_size) * sizeof(MVMObject *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_objects[idx], obj); sc->body->num_objects = idx + 1; } } /* Given an SC and an index, fetch the STable stored there. */ MVMSTable * MVM_sc_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { if (idx >= 0 && idx < sc->body->num_stables) { MVMSTable *got = sc->body->root_stables[idx]; return got && !sc_working(sc) ? got : MVM_serialization_demand_stable(tc, sc, idx); } else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no STable at index %"PRId64")", c_description, idx); } } /* Given an SC and an index, fetch the STable stored there, or return NULL if there * is none. Does not cause lazy deserialization. */ MVMSTable * MVM_sc_try_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { if (idx >= 0 && idx < sc->body->num_stables) return sc->body->root_stables[idx]; else return NULL; } /* Given an SC, an index, and an STable, store the STable at the index. */ void MVM_sc_set_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMSTable *st) { if (idx < 0) MVM_exception_throw_adhoc(tc, "Invalid (negative) STable index %"PRId64, idx); if (idx < sc->body->num_stables) { /* Just updating an existing one. */ MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); } else { if (idx >= sc->body->alloc_stables) { MVMint64 orig_size = sc->body->alloc_stables; sc->body->alloc_stables += 32; if (sc->body->alloc_stables < idx + 1) sc->body->alloc_stables = idx + 1; sc->body->root_stables = MVM_realloc(sc->body->root_stables, sc->body->alloc_stables * sizeof(MVMSTable *)); memset(sc->body->root_stables + orig_size, 0, (sc->body->alloc_stables - orig_size) * sizeof(MVMSTable *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); sc->body->num_stables = idx + 1; } } /* Given an SC and an STable, pushes the STable to the end of the root list. */ void MVM_sc_push_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st) { MVMint64 idx = sc->body->num_stables; if (idx == sc->body->alloc_stables) { sc->body->alloc_stables += 16; sc->body->root_stables = MVM_realloc(sc->body->root_stables, sc->body->alloc_stables * sizeof(MVMSTable *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); sc->body->num_stables++; } /* Given an SC and an index, fetch the code ref stored there. */ MVMObject * MVM_sc_get_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject *roots = sc->body->root_codes; MVMuint64 count = MVM_repr_elems(tc, roots); if (idx < count) { MVMObject *found = MVM_repr_at_pos_o(tc, roots, idx); return MVM_is_null(tc, found) || sc_working(sc) ? MVM_serialization_demand_code(tc, sc, idx) : found; } else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no code ref at index %"PRId64")", c_description, idx); } } /* Resolves an SC handle using the SC weakhash. */ MVMSerializationContext * MVM_sc_find_by_handle(MVMThreadContext *tc, MVMString *handle) { MVMSerializationContextBody *scb; MVM_string_flatten(tc, handle); uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); return scb && scb->sc ? scb->sc : NULL; } /* Marks all objects, stables and codes that belong to this SC as free to be taken by another. */ void MVM_sc_disclaim(MVMThreadContext *tc, MVMSerializationContext *sc) { MVMObject **root_objects, *root_codes, *obj; MVMSTable **root_stables, *stable; MVMint64 i, count; MVMCollectable *col; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scdisclaim"); root_objects = sc->body->root_objects; count = sc->body->num_objects; for (i = 0; i < count; i++) { obj = root_objects[i]; col = &obj->header; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { struct MVMSerializationIndex *const sci = col->sc_forward_u.sci; col->sc_forward_u.sci = NULL; MVM_free(sci); } col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = 0; #else col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = 0; #endif } sc->body->num_objects = 0; root_stables = sc->body->root_stables; count = sc->body->num_stables; for (i = 0; i < count; i++) { stable = root_stables[i]; col = &stable->header; col->sc_forward_u.sc.sc_idx = 0; } sc->body->num_stables = 0; root_codes = sc->body->root_codes; count = MVM_repr_elems(tc, root_codes); for (i = 0; i < count; i++) { obj = MVM_repr_at_pos_o(tc, root_codes, i); if (MVM_is_null(tc, obj)) obj = MVM_serialization_demand_code(tc, sc, i); col = &obj->header; col->sc_forward_u.sc.sc_idx = 0; } sc->body->root_codes = NULL; } /* Called when an object triggers the SC repossession write barrier. */ void MVM_sc_wb_hit_obj(MVMThreadContext *tc, MVMObject *obj) { MVMSerializationContext *comp_sc; /* If the WB is disabled or we're not compiling, can exit quickly. */ if (tc->sc_wb_disable_depth) return; if (!tc->compiling_scs || !MVM_repr_elems(tc, tc->compiling_scs)) return; /* Same if the object is flagged as one to never repossess. */ if (obj->header.flags & MVM_CF_NEVER_REPOSSESS) return; /* Otherwise, check that the object's SC is different from the SC * of the compilation we're currently in. Repossess if so. */ comp_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, tc->compiling_scs, 0); if (MVM_sc_get_obj_sc(tc, obj) != comp_sc) { /* Get new slot ID. */ MVMint64 new_slot = comp_sc->body->num_objects; /* See if the object is actually owned by another, and it's the * owner we need to repossess. */ if (obj->st->WHAT == tc->instance->boot_types.BOOTArray || obj->st->WHAT == tc->instance->boot_types.BOOTHash) { MVMObject *owned_objects = MVM_sc_get_obj_sc(tc, obj)->body->owned_objects; MVMint64 n = MVM_repr_elems(tc, owned_objects); MVMint64 found = 0; MVMint64 i; for (i = 0; i < n; i += 2) { if (MVM_repr_at_pos_o(tc, owned_objects, i) == obj) { MVMSerializationContext *real_sc; obj = MVM_repr_at_pos_o(tc, owned_objects, i + 1); real_sc = MVM_sc_get_obj_sc(tc, obj); if (!real_sc) return; /* Probably disclaimed. */ if (real_sc == comp_sc) return; found = 1; break; } } if (!found) return; } /* Add to root set. */ MVM_sc_set_object(tc, comp_sc, new_slot, obj); /* Add repossession entry. */ MVM_repr_push_i(tc, comp_sc->body->rep_indexes, new_slot << 1); MVM_repr_push_o(tc, comp_sc->body->rep_scs, (MVMObject *)MVM_sc_get_obj_sc(tc, obj)); /* Update SC of the object, claiming it. */ MVM_sc_set_obj_sc(tc, obj, comp_sc); } } /* Called when an STable triggers the SC repossession write barrier. */ void MVM_sc_wb_hit_st(MVMThreadContext *tc, MVMSTable *st) { MVMSerializationContext *comp_sc; /* If the WB is disabled or we're not compiling, can exit quickly. */ if (tc->sc_wb_disable_depth) return; if (!tc->compiling_scs || !MVM_repr_elems(tc, tc->compiling_scs)) return; /* Otherwise, check that the STable's SC is different from the SC * of the compilation we're currently in. Repossess if so. */ comp_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, tc->compiling_scs, 0); if (MVM_sc_get_stable_sc(tc, st) != comp_sc) { /* Add to root set. */ MVMint64 new_slot = comp_sc->body->num_stables; MVM_sc_push_stable(tc, comp_sc, st); /* Add repossession entry. */ MVM_repr_push_i(tc, comp_sc->body->rep_indexes, (new_slot << 1) | 1); MVM_repr_push_o(tc, comp_sc->body->rep_scs, (MVMObject *)MVM_sc_get_stable_sc(tc, st)); /* Update SC of the STable, claiming it. */ MVM_sc_set_stable_sc(tc, st, comp_sc); } } MoarVM-2015.11/src/6model/sc.h0000644000175000017500000001656612534320622014620 0ustar jnthnjnthn/* SC manipulation functions. */ MVMObject * MVM_sc_create(MVMThreadContext *tc, MVMString *handle); void MVM_sc_add_all_scs_entry(MVMThreadContext *tc, MVMSerializationContextBody *scb); MVMString * MVM_sc_get_handle(MVMThreadContext *tc, MVMSerializationContext *sc); MVMString * MVM_sc_get_description(MVMThreadContext *tc, MVMSerializationContext *sc); void MVM_sc_set_description(MVMThreadContext *tc, MVMSerializationContext *sc, MVMString *desc); MVMint64 MVM_sc_find_object_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj); MVMint64 MVM_sc_find_stable_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st); MVMint64 MVM_sc_find_code_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj); MVMObject * MVM_sc_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMObject * MVM_sc_try_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_sc_set_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *obj); MVMSTable * MVM_sc_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSTable * MVM_sc_try_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_sc_set_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMSTable *st); void MVM_sc_push_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st); MVMObject * MVM_sc_get_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSerializationContext * MVM_sc_find_by_handle(MVMThreadContext *tc, MVMString *handle); MVMSerializationContext * MVM_sc_get_sc(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep); MVMObject * MVM_sc_get_sc_object(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep, MVMint64 idx); void MVM_sc_disclaim(MVMThreadContext *tc, MVMSerializationContext *sc); MVM_STATIC_INLINE MVMuint32 MVM_get_idx_of_sc(MVMCollectable *col) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) return col->sc_forward_u.sci->sc_idx; #endif return col->sc_forward_u.sc.sc_idx; } MVM_STATIC_INLINE MVMuint32 MVM_get_idx_in_sc(MVMCollectable *col) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) return col->sc_forward_u.sci->idx; if (col->sc_forward_u.sc.idx == MVM_DIRECT_SC_IDX_SENTINEL) return ~0; #endif return col->sc_forward_u.sc.idx; } MVM_STATIC_INLINE void MVM_set_idx_in_sc(MVMCollectable *col, MVMuint32 i) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); assert(i >= 0); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { col->sc_forward_u.sci->idx = i; } else if (i >= MVM_DIRECT_SC_IDX_SENTINEL) { struct MVMSerializationIndex *const sci = MVM_malloc(sizeof(struct MVMSerializationIndex)); sci->sc_idx = col->sc_forward_u.sc.sc_idx; sci->idx = i; col->sc_forward_u.sci = sci; col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED; } else #endif { col->sc_forward_u.sc.idx = i; } } /* Gets a collectable's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_collectable_sc(MVMThreadContext *tc, MVMCollectable *col) { MVMuint32 sc_idx; assert(!(col->flags & MVM_CF_GEN2_LIVE)); assert(!(col->flags & MVM_CF_FORWARDER_VALID)); sc_idx = MVM_get_idx_of_sc(col); assert(sc_idx != ~0); return sc_idx > 0 ? tc->instance->all_scs[sc_idx]->sc : NULL; } /* Gets an object's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_obj_sc(MVMThreadContext *tc, MVMObject *obj) { return MVM_sc_get_collectable_sc(tc, &obj->header); } /* Gets an STables's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_stable_sc(MVMThreadContext *tc, MVMSTable *st) { return MVM_sc_get_collectable_sc(tc, &st->header); } /* Sets a collectable's SC. */ MVM_STATIC_INLINE void MVM_sc_set_collectable_sc(MVMThreadContext *tc, MVMCollectable *col, MVMSerializationContext *sc) { assert(!(col->flags & MVM_CF_GEN2_LIVE)); assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { col->sc_forward_u.sci->sc_idx = sc->body->sc_idx; col->sc_forward_u.sci->idx = ~0; } else #endif { col->sc_forward_u.sc.sc_idx = sc->body->sc_idx; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->sc_forward_u.sc.sc_idx != sc->body->sc_idx) { struct MVMSerializationIndex *const sci = MVM_malloc(sizeof(struct MVMSerializationIndex)); sci->sc_idx = sc->body->sc_idx; sci->idx = ~0; col->sc_forward_u.sci = sci; col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED; } else #endif { col->sc_forward_u.sc.idx = MVM_DIRECT_SC_IDX_SENTINEL; } } } /* Sets an object's SC. */ MVM_STATIC_INLINE void MVM_sc_set_obj_sc(MVMThreadContext *tc, MVMObject *obj, MVMSerializationContext *sc) { MVM_sc_set_collectable_sc(tc, &obj->header, sc); } /* Sets an STable's SC. */ MVM_STATIC_INLINE void MVM_sc_set_stable_sc(MVMThreadContext *tc, MVMSTable *st, MVMSerializationContext *sc) { MVM_sc_set_collectable_sc(tc, &st->header, sc); } /* Given an SC, an index and a code ref, store it and the index. */ MVM_STATIC_INLINE void MVM_sc_set_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *code) { MVMObject *roots = sc->body->root_codes; MVM_repr_bind_pos_o(tc, roots, idx, code); if (MVM_get_idx_of_sc(&code->header) == sc->body->sc_idx) MVM_set_idx_in_sc(&code->header, idx); } /* Sets the full list of code refs. */ MVM_STATIC_INLINE void MVM_sc_set_code_list(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *code_list) { MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_codes, code_list); } /* Gets the number of objects in the SC. */ MVM_STATIC_INLINE MVMuint64 MVM_sc_get_object_count(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->num_objects; } /* Given an SC and an object, push it onto the SC. */ MVM_STATIC_INLINE void MVM_sc_push_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMuint32 idx = sc->body->num_objects; MVM_sc_set_object(tc, sc, idx, obj); if (MVM_get_idx_of_sc(&obj->header) == sc->body->sc_idx) MVM_set_idx_in_sc(&obj->header, idx); } /* SC repossession write barriers. */ void MVM_sc_wb_hit_obj(MVMThreadContext *tc, MVMObject *obj); void MVM_sc_wb_hit_st(MVMThreadContext *tc, MVMSTable *st); MVM_STATIC_INLINE void MVM_SC_WB_OBJ(MVMThreadContext *tc, MVMObject *obj) { assert(!(obj->header.flags & MVM_CF_GEN2_LIVE)); assert(!(obj->header.flags & MVM_CF_FORWARDER_VALID)); assert(MVM_get_idx_of_sc(&obj->header) != ~0); if (MVM_get_idx_of_sc(&obj->header) > 0) MVM_sc_wb_hit_obj(tc, obj); } MVM_STATIC_INLINE void MVM_SC_WB_ST(MVMThreadContext *tc, MVMSTable *st) { assert(!(st->header.flags & MVM_CF_GEN2_LIVE)); assert(!(st->header.flags & MVM_CF_FORWARDER_VALID)); assert(MVM_get_idx_of_sc(&st->header) != ~0); if (MVM_get_idx_of_sc(&st->header) > 0) MVM_sc_wb_hit_st(tc, st); } MoarVM-2015.11/src/6model/serialization.c0000644000175000017500000036761012616160672017072 0ustar jnthnjnthn#include #include #ifndef MAX #define MAX(x, y) ((y) > (x) ? (y) : (x)) #endif /* Whether we deserialize lazily or not. */ #define MVM_SERIALIZATION_LAZY 1 /* Version of the serialization format that we are currently at and lowest * version we support. */ #define CURRENT_VERSION 16 #define MIN_VERSION 15 /* Various sizes (in bytes). */ #define HEADER_SIZE (4 * 18) #define DEP_TABLE_ENTRY_SIZE 8 #define STABLES_TABLE_ENTRY_SIZE 12 #define OBJECTS_TABLE_ENTRY_SIZE 8 #define CLOSURES_TABLE_ENTRY_SIZE 24 #define CONTEXTS_TABLE_ENTRY_SIZE 16 #define REPOS_TABLE_ENTRY_SIZE 16 /* Some guesses. */ #define DEFAULT_STABLE_DATA_SIZE 4096 #define STABLES_TABLE_ENTRIES_GUESS 16 #define OBJECT_SIZE_GUESS 8 #define CLOSURES_TABLE_ENTRIES_GUESS 16 #define CONTEXTS_TABLE_ENTRIES_GUESS 4 #define DEFAULT_CONTEXTS_DATA_SIZE 1024 #define DEFAULT_PARAM_INTERNS_DATA_SIZE 128 /* Possible reference types we can serialize. */ #define REFVAR_NULL 1 #define REFVAR_OBJECT 2 #define REFVAR_VM_NULL 3 #define REFVAR_VM_INT 4 #define REFVAR_VM_NUM 5 #define REFVAR_VM_STR 6 #define REFVAR_VM_ARR_VAR 7 #define REFVAR_VM_ARR_STR 8 #define REFVAR_VM_ARR_INT 9 #define REFVAR_VM_HASH_STR_VAR 10 #define REFVAR_STATIC_CODEREF 11 #define REFVAR_CLONED_CODEREF 12 /* For the packed format, for "small" values of si and idx */ #define OBJECTS_TABLE_ENTRY_SC_MASK 0x7FF #define OBJECTS_TABLE_ENTRY_SC_IDX_MASK 0x000FFFFF #define OBJECTS_TABLE_ENTRY_SC_MAX 0x7FE #define OBJECTS_TABLE_ENTRY_SC_IDX_MAX 0x000FFFFF #define OBJECTS_TABLE_ENTRY_SC_SHIFT 20 #define OBJECTS_TABLE_ENTRY_SC_OVERFLOW 0x7FF #define OBJECTS_TABLE_ENTRY_IS_CONCRETE 0x80000000 /* In the main serialization data blobs we have 1 more bit to play with. The format is either 32 bits, with a packed value. or 32 bits with an overflow flag, 32 bits of ID, and 32 bits of index. The packed ID could be in the range 0..4094, the packed index 0..1048575. With these ranges, overflow isn't even needed for compiling the setting. An alternative format would be 8 bits of ID (so 0..254) and then 32 bits of index (0..65535), or 8 bits for an overflow flag, then 32 and 32. For this format, it turns out that currently for the setting, 296046 entries would pack into 3 bytes, and 59757 would overflow and need 9. 296046 * 3 + 59757 * 9 == 1425951 (296046 + 59757) * 4 == 1423212 Hence that format is not quite as space efficient. */ #define PACKED_SC_IDX_MASK 0x000FFFFF #define PACKED_SC_MAX 0xFFE #define PACKED_SC_IDX_MAX 0x000FFFFF #define PACKED_SC_SHIFT 20 #define PACKED_SC_OVERFLOW 0xFFF #define STRING_HEAP_LOC_MAX 0x7FFFFFFF #define STRING_HEAP_LOC_PACKED_MAX 0x00007FFF #define STRING_HEAP_LOC_PACKED_OVERFLOW 0x00008000 #define STRING_HEAP_LOC_PACKED_LOW_MASK 0x0000FFFF #define STRING_HEAP_LOC_PACKED_SHIFT 16 #define STABLE_BOOLIFICATION_SPEC_MODE_MASK 0x0F #define STABLE_HAS_CONTAINER_SPEC 0x10 #define STABLE_HAS_INVOCATION_SPEC 0x20 #define STABLE_HAS_HLL_OWNER 0x40 /* Endian translation (file format is little endian, so on big endian we need * to twiddle. */ #ifdef MVM_BIGENDIAN static void switch_endian(char *bytes, size_t size) { size_t low = 0; size_t high = size - 1; while (high > low) { char tmp = bytes[low]; bytes[low] = bytes[high]; bytes[high] = tmp; low++; high--; } } #endif /* Base64 encoding */ static char * base64_encode(const void *buf, size_t size) { static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* str = (char*) MVM_malloc((size+3)*4/3 + 1); char* p = str; const unsigned char* q = (const unsigned char*) buf; size_t i = 0; while (i < size) { int c = q[i++]; c *= 256; if (i < size) c += q[i]; i++; c *= 256; if (i < size) c += q[i]; i++; *p++ = base64[(c & 0x00fc0000) >> 18]; *p++ = base64[(c & 0x0003f000) >> 12]; if (i > size + 1) *p++ = '='; else *p++ = base64[(c & 0x00000fc0) >> 6]; if (i > size) *p++ = '='; else *p++ = base64[c & 0x0000003f]; } *p = 0; return str; } /* Base64 decoding */ static int POS(char c) { /* XXX TODO: investigate whether enumerating all 256 cases of * this in a switch/case can help the compiler turn it into a * jump table instead of a bunch of comparisons (if it doesn't * already, of course!)... */ if (c>='A' && c<='Z') return c - 'A'; if (c>='a' && c<='z') return c - 'a' + 26; if (c>='0' && c<='9') return c - '0' + 52; if (c == '+') return 62; if (c == '/') return 63; if (c == '=') return -1; return -2; } static void * base64_decode(const char *s, size_t *data_len) { const char *p; unsigned char *q, *data; /* XXX TODO: investigate whether putting these n[4] into 4 * separate locals helps the compiler optimize them better.. */ int n[4] = {-1, -1, -1, -1}; size_t len = strlen(s); if (len % 4) { *data_len = 0; return NULL; } data = (unsigned char*) MVM_malloc(len/4*3); q = (unsigned char*) data; for (p = s; *p; ) { n[0] = POS(*p++); n[1] = POS(*p++); n[2] = POS(*p++); n[3] = POS(*p++); /* XXX TODO: investigate jump table possibility here too, * or at least collapse some of the branches... */ if (n[0] == -2 || n[1] == -2 || n[2] == -2 || n[3] == -2 || n[0] == -1 || n[1] == -1 || (n[2] == -1 && n[3] != -1)) { MVM_free(data); return NULL; } q[0] = (n[0] << 2) + (n[1] >> 4); if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2); if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3]; q += 3; } *data_len = q-data - (n[2]==-1) - (n[3]==-1); return data; } /* *************************************************************************** * Serialization (writing related) * ***************************************************************************/ /* Writes an int64 into a buffer. */ static void write_int64(char *buffer, size_t offset, MVMint64 value) { memcpy(buffer + offset, &value, 8); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 8); #endif } /* Writes an int32 into a buffer. */ static void write_int32(char *buffer, size_t offset, MVMint32 value) { memcpy(buffer + offset, &value, 4); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 4); #endif } /* Writes a uint16 into a buffer. */ static void write_uint16(char *buffer, size_t offset, MVMuint16 value) { memcpy(buffer + offset, &value, 2); #if MVM_BIGENDIAN switch_endian(buffer + offset, 2); #endif } /* Writes an double into a buffer. */ static void write_double(char *buffer, size_t offset, double value) { memcpy(buffer + offset, &value, 8); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 8); #endif } /* Adds an item to the MVMString heap if needed, and returns the index where * it may be found. */ static MVMint32 add_string_to_heap(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *s) { if (s == NULL) { /* We ensured that the first entry in the heap represents the null MVMString, * so can just hand back 0 here. */ return 0; } else if (MVM_repr_exists_key(tc, writer->seen_strings, s)) { return (MVMint32)MVM_repr_at_key_int(tc, writer->seen_strings, s); } else { MVMint64 next_idx = MVM_repr_elems(tc, writer->root.string_heap); MVM_repr_bind_pos_s(tc, writer->root.string_heap, next_idx, s); MVM_repr_bind_key_int(tc, writer->seen_strings, s, next_idx); return (MVMint32)next_idx; } } /* Gets the ID of a serialization context. Returns 0 if it's the current * one, or its dependency table offset (base-1) otherwise. Note that if * it is not yet in the dependency table, it will be added. */ static MVMuint32 get_sc_id(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSerializationContext *sc) { MVMint64 i, num_deps, offset; /* Easy if it's in the current SC. */ if (writer->root.sc == sc) return 0; /* Otherwise, find it in our dependencies list. */ num_deps = writer->root.num_dependencies; for (i = 0; i < num_deps; i++) if (writer->root.dependent_scs[i] == sc) return (MVMuint32)i + 1; /* Otherwise, need to add it to our dependencies list. Ensure there's * space in the dependencies table; grow if not. */ offset = num_deps * DEP_TABLE_ENTRY_SIZE; if (offset + DEP_TABLE_ENTRY_SIZE > writer->dependencies_table_alloc) { writer->dependencies_table_alloc *= 2; writer->root.dependencies_table = (char *)MVM_realloc(writer->root.dependencies_table, writer->dependencies_table_alloc); } /* Add dependency. */ writer->root.dependent_scs = MVM_realloc(writer->root.dependent_scs, sizeof(MVMSerializationContext *) * (writer->root.num_dependencies + 1)); writer->root.dependent_scs[writer->root.num_dependencies] = sc; write_int32(writer->root.dependencies_table, offset, add_string_to_heap(tc, writer, MVM_sc_get_handle(tc, sc))); write_int32(writer->root.dependencies_table, offset + 4, add_string_to_heap(tc, writer, MVM_sc_get_description(tc, sc))); writer->root.num_dependencies++; return writer->root.num_dependencies; /* Deliberately index + 1. */ } #define OBJ_IS_NULL(obj) ((obj) == NULL) /* Takes an STable. If it's already in an SC, returns information on how * to reference it. Otherwise, adds it to the current SC, effectively * placing it onto the work list. */ static void get_stable_ref_info(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st, MVMuint32 *sc, MVMuint32 *sc_idx) { /* Add to this SC if needed. */ if (MVM_sc_get_stable_sc(tc, st) == NULL) { MVM_sc_set_stable_sc(tc, st, writer->root.sc); MVM_sc_push_stable(tc, writer->root.sc, st); } /* Work out SC reference. */ *sc = get_sc_id(tc, writer, MVM_sc_get_stable_sc(tc, st)); *sc_idx = (MVMuint32)MVM_sc_find_stable_idx(tc, MVM_sc_get_stable_sc(tc, st), st); } /* Expands current target storage as needed. */ static void expand_storage_if_needed(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 need) { if (*(writer->cur_write_offset) + need > *(writer->cur_write_limit)) { *(writer->cur_write_limit) *= 2; *(writer->cur_write_buffer) = (char *)MVM_realloc(*(writer->cur_write_buffer), *(writer->cur_write_limit)); } } /* Writing function for native integers. */ void MVM_serialization_write_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value) { expand_storage_if_needed(tc, writer, 8); write_int64(*(writer->cur_write_buffer), *(writer->cur_write_offset), value); *(writer->cur_write_offset) += 8; } /* Writing function for variable sized integers. Writes out a 64 bit value using between 1 and 9 bytes. */ void MVM_serialization_write_varint(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value) { MVMuint8 storage_needed; char *buffer; size_t offset; if (value >= -1 && value <= 126) { storage_needed = 1; } else { const MVMint64 abs_val = value < 0 ? -value - 1 : value; if (abs_val <= 0x7FF) storage_needed = 2; else if (abs_val <= 0x000000000007FFFF) storage_needed = 3; else if (abs_val <= 0x0000000007FFFFFF) storage_needed = 4; else if (abs_val <= 0x00000007FFFFFFFF) storage_needed = 5; else if (abs_val <= 0x000007FFFFFFFFFFLL) storage_needed = 6; else if (abs_val <= 0x0007FFFFFFFFFFFFLL) storage_needed = 7; else if (abs_val <= 0x07FFFFFFFFFFFFFFLL) storage_needed = 8; else storage_needed = 9; } expand_storage_if_needed(tc, writer, storage_needed); buffer = *(writer->cur_write_buffer); offset = *(writer->cur_write_offset); if (storage_needed == 1) { buffer[offset] = 0x80 | (value + 129); } else if (storage_needed == 9) { buffer[offset++] = 0x00; memcpy(buffer + offset, &value, 8); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 8); #endif } else { MVMuint8 rest = storage_needed - 1; MVMint64 nybble = value >> 8 * rest; /* All the other high bits should be the same as the top bit of the nybble we keep. Or we have a bug. */ assert((nybble >> 3) == 0 || (nybble >> 3) == ~(MVMuint64)0); buffer[offset++] = (rest << 4) | (nybble & 0xF); #ifdef MVM_BIGENDIAN memcpy(buffer + offset, (char *)&value + 8 - rest, rest); switch_endian(buffer + offset, rest); #else memcpy(buffer + offset, &value, rest); #endif } *(writer->cur_write_offset) += storage_needed; } /* Writing function for native numbers. */ void MVM_serialization_write_num(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMnum64 value) { expand_storage_if_needed(tc, writer, 8); write_double(*(writer->cur_write_buffer), *(writer->cur_write_offset), value); *(writer->cur_write_offset) += 8; } /* Writing function for native strings. */ void MVM_serialization_write_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *value) { MVMint32 heap_loc = add_string_to_heap(tc, writer, value); /* avoid warnings that heap_loc > STRING_HEAP_LOC_MAX is always false */ if (!(heap_loc >= 0 && heap_loc <= STRING_HEAP_LOC_MAX)) MVM_exception_throw_adhoc(tc, "Serialization error: string offset %d can't be serialized", heap_loc); if (heap_loc <= STRING_HEAP_LOC_PACKED_MAX) { expand_storage_if_needed(tc, writer, 2); write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), heap_loc); *(writer->cur_write_offset) += 2; } else { expand_storage_if_needed(tc, writer, 4); write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), (heap_loc >> STRING_HEAP_LOC_PACKED_SHIFT) | STRING_HEAP_LOC_PACKED_OVERFLOW); *(writer->cur_write_offset) += 2; write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), heap_loc & STRING_HEAP_LOC_PACKED_LOW_MASK); *(writer->cur_write_offset) += 2; } } /* Writes the ID, index pair that identifies an entry in a Serialization context. */ static void write_sc_id_idx(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint32 sc_id, MVMint32 idx) { if (sc_id <= PACKED_SC_MAX && idx <= PACKED_SC_IDX_MAX) { MVMuint32 packed = (sc_id << PACKED_SC_SHIFT) | (idx & PACKED_SC_IDX_MASK); expand_storage_if_needed(tc, writer, 4); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), packed); *(writer->cur_write_offset) += 4; } else { MVMuint32 packed = PACKED_SC_OVERFLOW << PACKED_SC_SHIFT; expand_storage_if_needed(tc, writer, 12); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), packed); *(writer->cur_write_offset) += 4; write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), sc_id); *(writer->cur_write_offset) += 4; write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), idx); *(writer->cur_write_offset) += 4; } } /* Writes an object reference. */ static void write_obj_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref) { MVMint32 sc_id, idx; if (OBJ_IS_NULL(MVM_sc_get_obj_sc(tc, ref))) { /* This object doesn't belong to an SC yet, so it must be serialized as part of * this compilation unit. Add it to the work list. */ MVM_sc_set_obj_sc(tc, ref, writer->root.sc); MVM_sc_push_object(tc, writer->root.sc, ref); } sc_id = get_sc_id(tc, writer, MVM_sc_get_obj_sc(tc, ref)); idx = (MVMint32)MVM_sc_find_object_idx(tc, MVM_sc_get_obj_sc(tc, ref), ref); write_sc_id_idx(tc, writer, sc_id, idx); } /* Writes an array where each item is a variant reference. */ static void write_array_var(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ MVM_serialization_write_varint(tc, writer, elems); /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_ref(tc, writer, MVM_repr_at_pos_o(tc, arr, i)); } /* Writes an array where each item is an integer. */ static void write_array_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ MVM_serialization_write_varint(tc, writer, elems); /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_varint(tc, writer, MVM_repr_at_pos_i(tc, arr, i)); } /* Writes an array where each item is a MVMString. */ static void write_array_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ expand_storage_if_needed(tc, writer, 4); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), elems); *(writer->cur_write_offset) += 4; /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_str(tc, writer, MVM_repr_at_pos_s(tc, arr, i)); } /* Writes a hash where each key is a MVMString and each value a variant reference. */ static void write_hash_str_var(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *hash) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, hash); MVMObject *iter = MVM_iter(tc, hash); /* Write out element count. */ expand_storage_if_needed(tc, writer, 4); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), elems); *(writer->cur_write_offset) += 4; /* Write elements, as key,value,key,value etc. */ while (MVM_iter_istrue(tc, (MVMIter *)iter)) { MVM_repr_shift_o(tc, iter); MVM_serialization_write_str(tc, writer, MVM_iterkey_s(tc, (MVMIter *)iter)); MVM_serialization_write_ref(tc, writer, MVM_iterval(tc, (MVMIter *)iter)); } } /* Writes a reference to a code object in some SC. */ static void write_code_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *code) { MVMSerializationContext *sc = MVM_sc_get_obj_sc(tc, code); MVMint32 sc_id = get_sc_id(tc, writer, sc); MVMint32 idx = (MVMint32)MVM_sc_find_code_idx(tc, sc, code); write_sc_id_idx(tc, writer, sc_id, idx); } /* Given a closure, locate the static code reference it was originally cloned * from. */ static MVMObject * closure_to_static_code_ref(MVMThreadContext *tc, MVMObject *closure, MVMint64 fatal) { MVMObject *scr = (MVMObject *)(((MVMCode *)closure)->body.sf)->body.static_code; if (scr == NULL || MVM_sc_get_obj_sc(tc, scr) == NULL) { if (fatal) { char *c_name = MVM_string_utf8_encode_C_string(tc, (((MVMCode *)closure)->body.sf)->body.name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Serialization Error: missing static code ref for closure '%s'", c_name); } return NULL; } return scr; } /* Takes an outer context that is potentially to be serialized. Checks if it * is of interest, and if so sets it up to be serialized. */ static MVMint32 get_serialized_context_idx(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ctx) { if (OBJ_IS_NULL(MVM_sc_get_obj_sc(tc, ctx))) { /* Make sure we should chase a level down. */ if (OBJ_IS_NULL(closure_to_static_code_ref(tc, ((MVMContext *)ctx)->body.context->code_ref, 0))) { return 0; } else { MVM_repr_push_o(tc, writer->contexts_list, ctx); MVM_sc_set_obj_sc(tc, ctx, writer->root.sc); return (MVMint32)MVM_repr_elems(tc, writer->contexts_list); } } else { MVMint64 i, c; if (MVM_sc_get_obj_sc(tc, ctx) != writer->root.sc) MVM_exception_throw_adhoc(tc, "Serialization Error: reference to context outside of SC"); c = MVM_repr_elems(tc, writer->contexts_list); for (i = 0; i < c; i++) if (MVM_repr_at_pos_o(tc, writer->contexts_list, i) == ctx) return (MVMint32)i + 1; MVM_exception_throw_adhoc(tc, "Serialization Error: could not locate outer context in current SC"); } } /* Takes a closure, that is to be serialized. Checks if it has an outer that is * of interest, and if so sets it up to be serialized. */ static MVMint32 get_serialized_outer_context_idx(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *closure) { if (((MVMCode *)closure)->body.is_compiler_stub) return 0; if (((MVMCode *)closure)->body.outer == NULL) return 0; return get_serialized_context_idx(tc, writer, MVM_frame_context_wrapper(tc, ((MVMCode *)closure)->body.outer)); } /* Takes a closure that needs to be serialized. Makes an entry in the closures * table for it. Also adds it to this SC's code refs set and tags it with the * current SC. */ static void serialize_closure(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *closure) { MVMint32 static_sc_id, static_idx, context_idx; /* Locate the static code object. */ MVMObject *static_code_ref = closure_to_static_code_ref(tc, closure, 1); MVMSerializationContext *static_code_sc = MVM_sc_get_obj_sc(tc, static_code_ref); /* Ensure there's space in the closures table; grow if not. */ MVMint32 offset = writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; if (offset + CLOSURES_TABLE_ENTRY_SIZE > writer->closures_table_alloc) { writer->closures_table_alloc *= 2; writer->root.closures_table = (char *)MVM_realloc(writer->root.closures_table, writer->closures_table_alloc); } /* Get the index of the context (which will add it to the todo list if * needed). */ context_idx = get_serialized_outer_context_idx(tc, writer, closure); /* Add an entry to the closures table. */ static_sc_id = get_sc_id(tc, writer, static_code_sc); static_idx = (MVMint32)MVM_sc_find_code_idx(tc, static_code_sc, static_code_ref); write_int32(writer->root.closures_table, offset, static_sc_id); write_int32(writer->root.closures_table, offset + 4, static_idx); write_int32(writer->root.closures_table, offset + 8, context_idx); /* Check if it has a static code object. */ if (((MVMCode *)closure)->body.code_object) { MVMObject *code_obj = (MVMObject *)((MVMCode *)closure)->body.code_object; write_int32(writer->root.closures_table, offset + 12, 1); if (!MVM_sc_get_obj_sc(tc, code_obj)) { MVM_sc_set_obj_sc(tc, code_obj, writer->root.sc); MVM_sc_push_object(tc, writer->root.sc, code_obj); } write_int32(writer->root.closures_table, offset + 16, get_sc_id(tc, writer, MVM_sc_get_obj_sc(tc, code_obj))); write_int32(writer->root.closures_table, offset + 20, (MVMint32)MVM_sc_find_object_idx(tc, MVM_sc_get_obj_sc(tc, code_obj), code_obj)); } else { write_int32(writer->root.closures_table, offset + 12, 0); } /* Increment count of closures in the table. */ writer->root.num_closures++; /* Add the closure to this SC, and mark it as as being in it. */ MVM_repr_push_o(tc, writer->codes_list, closure); MVM_sc_set_obj_sc(tc, closure, writer->root.sc); } /* Writing function for references to things. */ void MVM_serialization_write_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref) { /* Work out what kind of thing we have and determine the discriminator. */ /* Note, we could use 0xFF as the sentinel value, and 0 as a "valid" value. */ MVMuint8 discrim = 0; if (ref == NULL) { discrim = REFVAR_NULL; } else if (ref == tc->instance->VMNull) { discrim = REFVAR_VM_NULL; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMMultiCache) { discrim = REFVAR_VM_NULL; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMOSHandle) { discrim = REFVAR_VM_NULL; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTInt) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_INT; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTNum) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_NUM; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTStr) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_STR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_VAR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTIntArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_INT; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTStrArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_STR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTHash) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_HASH_STR_VAR; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMCode && IS_CONCRETE(ref)) { if (MVM_sc_get_obj_sc(tc, ref) && ((MVMCode *)ref)->body.is_static) { /* Static code reference. */ discrim = REFVAR_STATIC_CODEREF; } else if (MVM_sc_get_obj_sc(tc, ref)) { /* Closure, but already seen and serialization already handled. */ discrim = REFVAR_CLONED_CODEREF; } else { /* Closure but didn't see it yet. Take care of its serialization, which * gets it marked with this SC. Then it's just a normal code ref that * needs serializing. */ serialize_closure(tc, writer, ref); discrim = REFVAR_CLONED_CODEREF; } } else { discrim = REFVAR_OBJECT; } /* Write the discriminator. */ expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = discrim; ++*(writer->cur_write_offset); /* Now take appropriate action. */ switch (discrim) { case REFVAR_NULL: break; case REFVAR_OBJECT: write_obj_ref(tc, writer, ref); break; case REFVAR_VM_NULL: /* Nothing to do for these. */ break; case REFVAR_VM_INT: MVM_serialization_write_varint(tc, writer, MVM_repr_get_int(tc, ref)); break; case REFVAR_VM_NUM: MVM_serialization_write_num(tc, writer, MVM_repr_get_num(tc, ref)); break; case REFVAR_VM_STR: MVM_serialization_write_str(tc, writer, MVM_repr_get_str(tc, ref)); break; case REFVAR_VM_ARR_VAR: write_array_var(tc, writer, ref); break; case REFVAR_VM_ARR_STR: write_array_str(tc, writer, ref); break; case REFVAR_VM_ARR_INT: write_array_int(tc, writer, ref); break; case REFVAR_VM_HASH_STR_VAR: write_hash_str_var(tc, writer, ref); break; case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: write_code_ref(tc, writer, ref); break; default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in MVM_serialization_read_ref", discrim); } } /* Writing function for references to STables. */ void MVM_serialization_write_stable_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { MVMuint32 sc_id, idx; get_stable_ref_info(tc, writer, st, &sc_id, &idx); write_sc_id_idx(tc, writer, sc_id, idx); } /* Concatenates the various output segments into a single binary MVMString. */ static MVMString * concatenate_outputs(MVMThreadContext *tc, MVMSerializationWriter *writer) { char *output = NULL; char *output_b64 = NULL; MVMint32 output_size = 0; MVMint32 offset = 0; MVMString *result; /* Calculate total size. */ output_size += HEADER_SIZE; output_size += writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE; output_size += writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE; output_size += writer->stables_data_offset; output_size += writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; output_size += writer->objects_data_offset; output_size += writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; output_size += writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; output_size += writer->contexts_data_offset; output_size += writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE; output_size += writer->param_interns_data_offset; /* Allocate a buffer that size. */ output = (char *)MVM_malloc(output_size); /* Write version into header. */ write_int32(output, 0, CURRENT_VERSION); offset += HEADER_SIZE; /* Put dependencies table in place and set location/rows in header. */ write_int32(output, 4, offset); write_int32(output, 8, writer->root.num_dependencies); memcpy(output + offset, writer->root.dependencies_table, writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE); offset += writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE; /* Put STables table in place, and set location/rows in header. */ write_int32(output, 12, offset); write_int32(output, 16, writer->root.num_stables); memcpy(output + offset, writer->root.stables_table, writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE); offset += writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE; /* Put STables data in place. */ write_int32(output, 20, offset); memcpy(output + offset, writer->root.stables_data, writer->stables_data_offset); offset += writer->stables_data_offset; /* Put objects table in place, and set location/rows in header. */ write_int32(output, 24, offset); write_int32(output, 28, writer->root.num_objects); memcpy(output + offset, writer->root.objects_table, writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE); offset += writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; /* Put objects data in place. */ write_int32(output, 32, offset); memcpy(output + offset, writer->root.objects_data, writer->objects_data_offset); offset += writer->objects_data_offset; /* Put closures table in place, and set location/rows in header. */ write_int32(output, 36, offset); write_int32(output, 40, writer->root.num_closures); memcpy(output + offset, writer->root.closures_table, writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE); offset += writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; /* Put contexts table in place, and set location/rows in header. */ write_int32(output, 44, offset); write_int32(output, 48, writer->root.num_contexts); memcpy(output + offset, writer->root.contexts_table, writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE); offset += writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; /* Put contexts data in place. */ write_int32(output, 52, offset); memcpy(output + offset, writer->root.contexts_data, writer->contexts_data_offset); offset += writer->contexts_data_offset; /* Put repossessions table in place, and set location/rows in header. */ write_int32(output, 56, offset); write_int32(output, 60, writer->root.num_repos); memcpy(output + offset, writer->root.repos_table, writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); offset += writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE; /* Put parameterized type intern data in place. */ write_int32(output, 64, offset); write_int32(output, 68, writer->root.num_param_interns); memcpy(output + offset, writer->root.param_interns_data, writer->param_interns_data_offset); offset += writer->param_interns_data_offset; /* Sanity check. */ if (offset != output_size) MVM_exception_throw_adhoc(tc, "Serialization sanity check failed: offset != output_size"); /* If we are compiling at present, then just stash the output for later * incorporation into the bytecode file. */ if (tc->compiling_scs && MVM_repr_elems(tc, tc->compiling_scs) && MVM_repr_at_pos_o(tc, tc->compiling_scs, 0) == (MVMObject *)writer->root.sc) { if (tc->serialized) MVM_free(tc->serialized); tc->serialized = output; tc->serialized_size = output_size; tc->serialized_string_heap = writer->root.string_heap; return NULL; } /* Base 64 encode. */ output_b64 = base64_encode(output, output_size); MVM_free(output); if (output_b64 == NULL) MVM_exception_throw_adhoc(tc, "Serialization error: failed to convert to base64"); /* Make a MVMString containing it. */ result = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, output_b64); MVM_free(output_b64); return result; } /* Serializes the possibly-not-deserialized HOW. */ static void serialize_how_lazy(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { if (st->HOW) { write_obj_ref(tc, writer, st->HOW); } else { MVMint32 sc_id = get_sc_id(tc, writer, st->HOW_sc); write_sc_id_idx(tc, writer, sc_id, st->HOW_idx); } } /* Adds an entry to the parameterized type intern section. */ static void add_param_intern(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *type, MVMObject *ptype, MVMObject *params) { MVMint64 num_params, i; /* Save previous write buffer. */ char **orig_write_buffer = writer->cur_write_buffer; MVMuint32 *orig_write_offset = writer->cur_write_offset; MVMuint32 *orig_write_limit = writer->cur_write_limit; /* Switch to intern data buffer. */ writer->cur_write_buffer = &(writer->root.param_interns_data); writer->cur_write_offset = &(writer->param_interns_data_offset); writer->cur_write_limit = &(writer->param_interns_data_alloc); /* Parametric type object reference. */ write_obj_ref(tc, writer, ptype); /* Indexes in this SC of type object and STable. */ expand_storage_if_needed(tc, writer, 12); if (MVM_sc_get_obj_sc(tc, type) != writer->root.sc) MVM_exception_throw_adhoc(tc, "Serialization error: parameterized type to intern not in current SC"); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), MVM_sc_find_object_idx(tc, writer->root.sc, type)); *(writer->cur_write_offset) += 4; if (MVM_sc_get_stable_sc(tc, STABLE(type)) != writer->root.sc) MVM_exception_throw_adhoc(tc, "Serialization error: STable of parameterized type to intern not in current SC"); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), MVM_sc_find_stable_idx(tc, writer->root.sc, STABLE(type))); *(writer->cur_write_offset) += 4; /* Write parameter count and parameter object refs. */ num_params = MVM_repr_elems(tc, params); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), (MVMint32)num_params); *(writer->cur_write_offset) += 4; for (i = 0; i < num_params; i++) write_obj_ref(tc, writer, MVM_repr_at_pos_o(tc, params, i)); /* Increment number of parameterization interns. */ writer->root.num_param_interns++; /* Restore original output buffer. */ writer->cur_write_buffer = orig_write_buffer; writer->cur_write_offset = orig_write_offset; writer->cur_write_limit = orig_write_limit; } /* This handles the serialization of an STable, and calls off to serialize * its representation data also. */ static void serialize_stable(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { MVMint64 i; MVMuint8 flags; /* Ensure there's space in the STables table; grow if not. */ MVMint32 offset = writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE; if (offset + STABLES_TABLE_ENTRY_SIZE > writer->stables_table_alloc) { writer->stables_table_alloc *= 2; writer->root.stables_table = (char *)MVM_realloc(writer->root.stables_table, writer->stables_table_alloc); } /* Make STables table entry. */ write_int32(writer->root.stables_table, offset, add_string_to_heap(tc, writer, tc->instance->repr_list[st->REPR->ID]->name)); write_int32(writer->root.stables_table, offset + 4, writer->stables_data_offset); /* Increment count of stables in the table. */ writer->root.num_stables++; /* Make sure we're going to write to the correct place. */ writer->cur_write_buffer = &(writer->root.stables_data); writer->cur_write_offset = &(writer->stables_data_offset); writer->cur_write_limit = &(writer->stables_data_alloc); /* Write HOW, WHAT and WHO. */ serialize_how_lazy(tc, writer, st); write_obj_ref(tc, writer, st->WHAT); MVM_serialization_write_ref(tc, writer, st->WHO); /* Method cache and v-table. */ if (!st->method_cache) MVM_serialization_finish_deserialize_method_cache(tc, st); MVM_serialization_write_ref(tc, writer, st->method_cache); /* Type check cache. */ MVM_serialization_write_varint(tc, writer, st->type_check_cache_length); for (i = 0; i < st->type_check_cache_length; i++) MVM_serialization_write_ref(tc, writer, st->type_check_cache[i]); /* Mode flags. These are stored as MVMuint16, but currently only the bottom 6 bits are used. Whilst we could store these as 2 bytes, we don't actually gain any future-proofing from that, because if we start assigning meaning to currently unused bits, then we have to bump the serialisation version *anyway*. If we didn't, older readers would encounter files with the newly used bits, but ignore whatever semantics those bits were meant to convey, and hence show buggy behaviour. And if we're bumping the serialisation version, then we can increase the storage size. */ if (st->mode_flags > 255) { MVM_exception_throw_adhoc(tc, "Serialization error: mode_flags %u out of range and can't be serialized", st->mode_flags); } expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = st->mode_flags; ++*(writer->cur_write_offset); /* Boolification spec. */ /* As this only needs 4 bits, also use the same byte to store various NULL/not-NULL flag bits. */ if (st->boolification_spec) { if (st->boolification_spec->mode >= 0xF) { MVM_exception_throw_adhoc(tc, "Serialization error: boolification spec mode %u out of range and can't be serialized", st->boolification_spec->mode); } flags = st->boolification_spec->mode; } else { flags = 0xF; } if (st->container_spec != NULL) flags |= STABLE_HAS_CONTAINER_SPEC; if (st->invocation_spec != NULL) flags |= STABLE_HAS_INVOCATION_SPEC; if (st->hll_owner != NULL) flags |= STABLE_HAS_HLL_OWNER; expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = flags; ++*(writer->cur_write_offset); if (st->boolification_spec) { MVM_serialization_write_ref(tc, writer, st->boolification_spec->method); } /* Container spec. */ if (st->container_spec) { /* Write container spec name. */ MVM_serialization_write_str(tc, writer, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, st->container_spec->name)); /* Give container spec a chance to serialize any data it wishes. */ st->container_spec->serialize(tc, st, writer); } /* Invocation spec. */ if (st->invocation_spec) { MVM_serialization_write_ref(tc, writer, st->invocation_spec->class_handle); MVM_serialization_write_str(tc, writer, st->invocation_spec->attr_name); MVM_serialization_write_varint(tc, writer, st->invocation_spec->hint); MVM_serialization_write_ref(tc, writer, st->invocation_spec->invocation_handler); MVM_serialization_write_ref(tc, writer, st->invocation_spec->md_class_handle); MVM_serialization_write_str(tc, writer, st->invocation_spec->md_cache_attr_name); MVM_serialization_write_varint(tc, writer, st->invocation_spec->md_cache_hint); MVM_serialization_write_str(tc, writer, st->invocation_spec->md_valid_attr_name); MVM_serialization_write_varint(tc, writer, st->invocation_spec->md_valid_hint); } /* HLL owner. */ if (st->hll_owner) MVM_serialization_write_str(tc, writer, st->hll_owner->name); /* If it's a parametric type, save parameterizer. */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) MVM_serialization_write_ref(tc, writer, st->paramet.ric.parameterizer); /* If it's a parameterized type, we may also need to make an intern table * entry as well as writing out the parameter details. */ if (st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVMint64 i, num_params; /* To deserve an entry in the intern table, we need that both the type * being parameterized and all of the arguments are from an SC other * than the one we're currently serializing. Otherwise, there is no * way the parameterized type in question could have been produced by * another compilation unit. We keep a counter of things, which should * add up to parameters + 1 if we need the intern entry. */ MVMuint32 internability = 0; /* Write a reference to the type being parameterized, and increment the * internability if it's from a different SC (easier to check that after, * as writing the ref will be sure to mark it as being in this one if it * has no SC yet). */ MVMObject *ptype = st->paramet.erized.parametric_type; MVMObject *params = st->paramet.erized.parameters; MVM_serialization_write_ref(tc, writer, ptype); if (MVM_sc_get_obj_sc(tc, ptype) != writer->root.sc) internability++; /* Write the parameters. We write them like an array, but an element at a * time so we can check if an intern table entry is needed. */ num_params = MVM_repr_elems(tc, params); /* This typically seems to have values between 1 and 3: */ MVM_serialization_write_varint(tc, writer, num_params); for (i = 0; i < num_params; i++) { /* Save where we were before writing this parameter. */ size_t pre_write_mark = *(writer->cur_write_offset); /* Write parameter. */ MVMObject *parameter = MVM_repr_at_pos_o(tc, params, i); MVM_serialization_write_ref(tc, writer, parameter); /* If what we write was an object reference and it's from another * SC, add to the internability count. */ if (*(*(writer->cur_write_buffer) + pre_write_mark) == REFVAR_OBJECT) if (MVM_sc_get_obj_sc(tc, parameter) != writer->root.sc) internability++; } /* Make intern table entry if needed. */ if (internability == num_params + 1) add_param_intern(tc, writer, st->WHAT, ptype, params); } /* Store offset we save REPR data at. */ write_int32(writer->root.stables_table, offset + 8, writer->stables_data_offset); /* If the REPR has a function to serialize representation data, call it. */ if (st->REPR->serialize_repr_data) st->REPR->serialize_repr_data(tc, st, writer); } /* This handles the serialization of an object, which largely involves a * delegation to its representation. */ static void serialize_object(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *obj) { MVMint32 offset; /* Get index of SC that holds the STable and its index. */ MVMuint32 sc; MVMuint32 sc_idx; MVMuint32 packed; get_stable_ref_info(tc, writer, STABLE(obj), &sc, &sc_idx); /* Ensure there's space in the objects table; grow if not. */ offset = writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; if (offset + OBJECTS_TABLE_ENTRY_SIZE > writer->objects_table_alloc) { writer->objects_table_alloc *= 2; writer->root.objects_table = (char *)MVM_realloc(writer->root.objects_table, writer->objects_table_alloc); } /* Increment count of objects in the table. */ writer->root.num_objects++; /* Make sure we're going to write repr data to the correct place. */ writer->cur_write_buffer = &(writer->root.objects_data); writer->cur_write_offset = &(writer->objects_data_offset); writer->cur_write_limit = &(writer->objects_data_alloc); packed = IS_CONCRETE(obj) ? OBJECTS_TABLE_ENTRY_IS_CONCRETE : 0; if (sc <= OBJECTS_TABLE_ENTRY_SC_MAX && sc_idx <= OBJECTS_TABLE_ENTRY_SC_IDX_MAX) { packed |= (sc << OBJECTS_TABLE_ENTRY_SC_SHIFT) | sc_idx; } else { packed |= OBJECTS_TABLE_ENTRY_SC_OVERFLOW << OBJECTS_TABLE_ENTRY_SC_SHIFT; expand_storage_if_needed(tc, writer, 8); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), sc); *(writer->cur_write_offset) += 4; write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), sc_idx); *(writer->cur_write_offset) += 4; } /* Make objects table entry. */ write_int32(writer->root.objects_table, offset + 0, packed); write_int32(writer->root.objects_table, offset + 4, writer->objects_data_offset); /* Delegate to its serialization REPR function. */ if (IS_CONCRETE(obj)) { if (REPR(obj)->serialize) REPR(obj)->serialize(tc, STABLE(obj), OBJECT_BODY(obj), writer); else MVM_exception_throw_adhoc(tc, "Missing serialize REPR function for REPR %s", REPR(obj)->name); } } /* This handles the serialization of a context, which means serializing * the stuff in its lexpad. */ static void serialize_context(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ctx) { MVMint32 i, offset, static_sc_id, static_idx; /* Grab lexpad, which we'll serialize later on. */ MVMFrame *frame = ((MVMContext *)ctx)->body.context; MVMStaticFrame *sf = frame->static_info; MVMLexicalRegistry **lexnames = sf->body.lexical_names_list; /* Locate the static code ref this context points to. */ MVMObject *static_code_ref = closure_to_static_code_ref(tc, frame->code_ref, 1); MVMSerializationContext *static_code_sc = MVM_sc_get_obj_sc(tc, static_code_ref); if (OBJ_IS_NULL(static_code_sc)) MVM_exception_throw_adhoc(tc, "Serialization Error: closure outer is a code object not in an SC"); static_sc_id = get_sc_id(tc, writer, static_code_sc); static_idx = (MVMint32)MVM_sc_find_code_idx(tc, static_code_sc, static_code_ref); /* Ensure there's space in the STables table; grow if not. */ offset = writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; if (offset + CONTEXTS_TABLE_ENTRY_SIZE > writer->contexts_table_alloc) { writer->contexts_table_alloc *= 2; writer->root.contexts_table = (char *)MVM_realloc(writer->root.contexts_table, writer->contexts_table_alloc); } /* Make contexts table entry. */ write_int32(writer->root.contexts_table, offset, static_sc_id); write_int32(writer->root.contexts_table, offset + 4, static_idx); write_int32(writer->root.contexts_table, offset + 8, writer->contexts_data_offset); /* See if there's any relevant outer context, and if so set it up to * be serialized. */ if (frame->outer) write_int32(writer->root.contexts_table, offset + 12, get_serialized_context_idx(tc, writer, MVM_frame_context_wrapper(tc, frame->outer))); else write_int32(writer->root.contexts_table, offset + 12, 0); /* Increment count of stables in the table. */ writer->root.num_contexts++; /* Set up writer. */ writer->cur_write_buffer = &(writer->root.contexts_data); writer->cur_write_offset = &(writer->contexts_data_offset); writer->cur_write_limit = &(writer->contexts_data_alloc); /* Serialize lexicals. */ MVM_serialization_write_int(tc, writer, sf->body.num_lexicals); for (i = 0; i < sf->body.num_lexicals; i++) { MVM_serialization_write_str(tc, writer, lexnames[i]->key); switch (sf->body.lexical_types[i]) { case MVM_reg_int8: case MVM_reg_int16: case MVM_reg_int32: MVM_exception_throw_adhoc(tc, "unsupported lexical type"); case MVM_reg_int64: MVM_serialization_write_int(tc, writer, frame->env[i].i64); break; case MVM_reg_num32: MVM_exception_throw_adhoc(tc, "unsupported lexical type"); case MVM_reg_num64: MVM_serialization_write_num(tc, writer, frame->env[i].n64); break; case MVM_reg_str: MVM_serialization_write_str(tc, writer, frame->env[i].s); break; case MVM_reg_obj: MVM_serialization_write_ref(tc, writer, frame->env[i].o); break; default: MVM_exception_throw_adhoc(tc, "unsupported lexical type"); } } MVM_sc_set_obj_sc(tc, ctx, writer->root.sc); } /* Goes through the list of repossessions and serializes them all. */ static void serialize_repossessions(MVMThreadContext *tc, MVMSerializationWriter *writer) { MVMint64 i; /* Obtain list of repossession object indexes and original SCs. */ MVMObject *rep_indexes = writer->root.sc->body->rep_indexes; MVMObject *rep_scs = writer->root.sc->body->rep_scs; /* Allocate table space, provided we've actually something to do. */ writer->root.num_repos = MVM_repr_elems(tc, rep_indexes); if (writer->root.num_repos == 0) return; writer->root.repos_table = (char *)MVM_malloc(writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); /* Make entries. */ for (i = 0; i < writer->root.num_repos; i++) { MVMint32 offset = (MVMint32)(i * REPOS_TABLE_ENTRY_SIZE); MVMint32 obj_idx = (MVMint32)(MVM_repr_at_pos_i(tc, rep_indexes, i) >> 1); MVMint32 is_st = MVM_repr_at_pos_i(tc, rep_indexes, i) & 1; MVMSerializationContext *orig_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, rep_scs, i); /* Work out original object's SC location. */ MVMint32 orig_sc_id = get_sc_id(tc, writer, orig_sc); MVMint32 orig_idx = (MVMint32)(is_st ? MVM_sc_find_stable_idx(tc, orig_sc, writer->root.sc->body->root_stables[obj_idx]) : MVM_sc_find_object_idx(tc, orig_sc, writer->root.sc->body->root_objects[obj_idx])); /* Write table row. */ write_int32(writer->root.repos_table, offset, is_st); write_int32(writer->root.repos_table, offset + 4, obj_idx); write_int32(writer->root.repos_table, offset + 8, orig_sc_id); write_int32(writer->root.repos_table, offset + 12, orig_idx); } } static void serialize(MVMThreadContext *tc, MVMSerializationWriter *writer) { MVMuint32 work_todo; do { /* Current work list sizes. */ MVMuint64 stables_todo = writer->root.sc->body->num_stables; MVMuint64 objects_todo = writer->root.sc->body->num_objects; MVMuint64 contexts_todo = MVM_repr_elems(tc, writer->contexts_list); /* Reset todo flag - if we do some work we'll go round again as it * may have generated more. */ work_todo = 0; /* Serialize any STables on the todo list. */ while (writer->stables_list_pos < stables_todo) { serialize_stable(tc, writer, writer->root.sc->body->root_stables[writer->stables_list_pos]); writer->stables_list_pos++; work_todo = 1; } /* Serialize any objects on the todo list. */ while (writer->objects_list_pos < objects_todo) { serialize_object(tc, writer, writer->root.sc->body->root_objects[writer->objects_list_pos]); writer->objects_list_pos++; work_todo = 1; } /* Serialize any contexts on the todo list. */ while (writer->contexts_list_pos < contexts_todo) { serialize_context(tc, writer, MVM_repr_at_pos_o(tc, writer->contexts_list, writer->contexts_list_pos)); writer->contexts_list_pos++; work_todo = 1; } } while (work_todo); /* Finally, serialize repossessions table (this can't make any more * work, so is done as a separate step here at the end). */ serialize_repossessions(tc, writer); } MVMString * MVM_serialization_serialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *empty_string_heap) { MVMSerializationWriter *writer; MVMString *result = NULL; MVMint32 sc_elems = (MVMint32)sc->body->num_objects; /* We don't sufficiently root things in here for the GC, so enforce gen2 * allocation. */ MVM_gc_allocate_gen2_default_set(tc); /* Set up writer with some initial settings. */ writer = MVM_calloc(1, sizeof(MVMSerializationWriter)); writer->root.version = CURRENT_VERSION; writer->root.sc = sc; writer->codes_list = sc->body->root_codes; writer->contexts_list = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); writer->root.string_heap = empty_string_heap; writer->root.dependent_scs = MVM_malloc(sizeof(MVMSerializationContext *)); writer->seen_strings = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* Allocate initial memory space for storing serialized tables and data. */ writer->dependencies_table_alloc = DEP_TABLE_ENTRY_SIZE * 4; writer->root.dependencies_table = (char *)MVM_malloc(writer->dependencies_table_alloc); writer->stables_table_alloc = STABLES_TABLE_ENTRY_SIZE * STABLES_TABLE_ENTRIES_GUESS; writer->root.stables_table = (char *)MVM_malloc(writer->stables_table_alloc); writer->objects_table_alloc = OBJECTS_TABLE_ENTRY_SIZE * MAX(sc_elems, 1); writer->root.objects_table = (char *)MVM_malloc(writer->objects_table_alloc); writer->stables_data_alloc = DEFAULT_STABLE_DATA_SIZE; writer->root.stables_data = (char *)MVM_malloc(writer->stables_data_alloc); writer->objects_data_alloc = OBJECT_SIZE_GUESS * MAX(sc_elems, 1); writer->root.objects_data = (char *)MVM_malloc(writer->objects_data_alloc); writer->closures_table_alloc = CLOSURES_TABLE_ENTRY_SIZE * CLOSURES_TABLE_ENTRIES_GUESS; writer->root.closures_table = (char *)MVM_malloc(writer->closures_table_alloc); writer->contexts_table_alloc = CONTEXTS_TABLE_ENTRY_SIZE * CONTEXTS_TABLE_ENTRIES_GUESS; writer->root.contexts_table = (char *)MVM_malloc(writer->contexts_table_alloc); writer->contexts_data_alloc = DEFAULT_CONTEXTS_DATA_SIZE; writer->root.contexts_data = (char *)MVM_malloc(writer->contexts_data_alloc); writer->param_interns_data_alloc = DEFAULT_PARAM_INTERNS_DATA_SIZE; writer->root.param_interns_data = (char *)MVM_malloc(writer->param_interns_data_alloc); /* Initialize MVMString heap so first entry is the NULL MVMString. */ MVM_repr_push_s(tc, empty_string_heap, NULL); /* Start serializing. */ serialize(tc, writer); /* Build a single result out of the serialized data; note if we're in the * compiler pipeline this will return null and stash the output to write * to a bytecode file later. */ result = concatenate_outputs(tc, writer); /* Clear up afterwards. */ MVM_free(writer->root.dependencies_table); MVM_free(writer->root.stables_table); MVM_free(writer->root.stables_data); MVM_free(writer->root.objects_table); MVM_free(writer->root.objects_data); MVM_free(writer->root.param_interns_data); MVM_free(writer); /* Exit gen2 allocation. */ MVM_gc_allocate_gen2_default_clear(tc); return result; } /* *************************************************************************** * Deserialization (reading related) * ***************************************************************************/ /* Reads an int64 from a buffer. */ static MVMint64 read_int64(const char *buffer, size_t offset) { MVMint64 value; memcpy(&value, buffer + offset, 8); #ifdef MVM_BIGENDIAN switch_endian(&value, 8); #endif return value; } /* Reads an int32 from a buffer. */ static MVMint32 read_int32(const char *buffer, size_t offset) { MVMint32 value; memcpy(&value, buffer + offset, 4); #ifdef MVM_BIGENDIAN switch_endian(&value, 4); #endif return value; } static MVMuint16 read_uint16(const char *buffer, size_t offset) { MVMuint16 value; memcpy(&value, buffer + offset, 2); #ifdef MVM_BIGENDIAN switch_endian(&value, 2); #endif return value; } /* Reads double from a buffer. */ static MVMnum64 read_double(const char *buffer, size_t offset) { MVMnum64 value; memcpy(&value, buffer + offset, 8); #ifdef MVM_BIGENDIAN switch_endian(&value, 8); #endif return value; } /* If deserialization should fail, cleans up before throwing an exception. */ MVM_NO_RETURN static void fail_deserialize(MVMThreadContext *tc, MVMSerializationReader *reader, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 3, 4); MVM_NO_RETURN static void fail_deserialize(MVMThreadContext *tc, MVMSerializationReader *reader, const char *messageFormat, ...) { va_list args; if (reader->data_needs_free && reader->data) MVM_free(reader->data); if (reader->contexts) MVM_free(reader->contexts); if (reader->root.sc) reader->root.sc->body->sr = NULL; MVM_free(reader); MVM_gc_allocate_gen2_default_clear(tc); va_start(args, messageFormat); MVM_exception_throw_adhoc_va(tc, messageFormat, args); va_end(args); } /* Reads the item from the string heap at the specified index. */ static MVMString * read_string_from_heap(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 idx) { if (reader->root.string_heap) { if (idx < MVM_repr_elems(tc, reader->root.string_heap)) return MVM_repr_at_pos_s(tc, reader->root.string_heap, idx); else fail_deserialize(tc, reader, "Attempt to read past end of string heap (index %d)", idx); } else { MVMCompUnit *cu = reader->root.string_comp_unit; if (idx == 0) return NULL; idx--; if (idx < cu->body.num_strings) return cu->body.strings[idx]; else fail_deserialize(tc, reader, "Attempt to read past end of compilation unit string heap (index %d)", idx); } } /* Locates a serialization context; 0 is the current one, otherwise see the * dependencies table. */ static MVMSerializationContext * locate_sc(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 sc_id) { MVMSerializationContext *sc; if (sc_id == 0) sc = reader->root.sc; else if (sc_id > 0 && sc_id - 1 < reader->root.num_dependencies) sc = reader->root.dependent_scs[sc_id - 1]; else fail_deserialize(tc, reader, "Invalid dependencies table index encountered (index %d)", sc_id); return sc; } /* Ensure that we aren't going to read off the end of the buffer. */ MVM_STATIC_INLINE void assert_can_read(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 amount) { char *read_end = *(reader->cur_read_buffer) + *(reader->cur_read_offset) + amount; if (read_end > *(reader->cur_read_end)) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); } /* Reading function for native integers. */ MVMint64 MVM_serialization_read_int(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint64 result; assert_can_read(tc, reader, 8); result = read_int64(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 8; return result; } /* Reading function for variable-sized integers, using between 1 and 9 bytes of * storage for an int64. * * The format chosen may not be quite the most space efficient for the values * that we store, but the intent it is that close to smallest whilst very * efficient to read. In particular, it doesn't require any looping, and * has at most two length overrun checks. */ MVMint64 MVM_serialization_read_varint(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint64 result; const MVMuint8 *read_at = (MVMuint8 *) *(reader->cur_read_buffer) + *(reader->cur_read_offset); MVMuint8 *const read_end = (MVMuint8 *) *(reader->cur_read_end); MVMuint8 first; MVMuint8 need; if (read_at >= read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); first = *read_at++; /* Top bit set means remaining 7 bits are a value between -1 and 126. (That turns out to be the most common 7 bit range that we serialize.) */ if (first & 0x80) { *(reader->cur_read_offset) += 1; /* Value we have is 128 to 255. Map it back to the range we need: */ return (MVMint64) first - 129; } /* Otherwise next 3 bits indicate how many more bytes follow. */ need = first >> 4; if (!need) { /* Have to read all 8 bytes. Ignore the bottom nybble. In future, we may want to use it to also store 15 possible "common" values. Not clear if that whould be best as a fixed table, a single table sent as part of the serialization blob, or multiple tables for different contexts (int32, int64, nativeint, others?) */ if (read_at + 8 > read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); memcpy(&result, read_at, 8); #ifdef MVM_BIGENDIAN switch_endian(&result, 8); #endif *(reader->cur_read_offset) += 9; return result; } if (read_at + need > read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); /* The bottom nybble of the first byte is the highest byte of the final value with any bits set. Right now the top nybble is garbage, but it gets flushed away with the sign extension shifting later. */ result = (MVMint64)first << 8 * need; /* The remaining 1 to 7 lower bytes follow next in the serialization stream. */ #ifdef MVM_BIGENDIAN { MVMuint8 *write_to = (MVMuint8 *)&result + 8 - need; memcpy(write_to, read_at, need); switch_endian(write_to, need); } #else memcpy(&result, read_at, need); #endif /* Having pieced the (unsigned) value back together, sign extend it: */ result = result << (64 - 4 - 8 * need); result = result >> (64 - 4 - 8 * need); *(reader->cur_read_offset) += need + 1; return result; } /* Reading function for native numbers. */ MVMnum64 MVM_serialization_read_num(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMnum64 result; assert_can_read(tc, reader, 8); result = read_double(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 8; return result; } /* Reading function for native strings. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ MVMString * MVM_serialization_read_str(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 offset; if (reader->root.version <= 15) { assert_can_read(tc, reader, 4); offset = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } else { assert_can_read(tc, reader, 2); offset = read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; if (offset & STRING_HEAP_LOC_PACKED_OVERFLOW) { assert_can_read(tc, reader, 2); offset ^= STRING_HEAP_LOC_PACKED_OVERFLOW; offset <<= STRING_HEAP_LOC_PACKED_SHIFT; offset |= read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; } } return read_string_from_heap(tc, reader, offset); } /* The SC id,idx pair is used in various ways, but common to them all is to look up the SC, then use the index to call some other function. Putting the common parts into one function permits the serialized representation to be changed, but frustratingly it requires two return values, which is a bit of a pain in (real) C. Hence this rather ungainly function. BEWARE - logic in this function is partly duplicated in the skip calculations of deserialize_method_cache_lazy(). See the note before MVM_serialization_read_ref(). */ MVM_STATIC_INLINE MVMSerializationContext *read_locate_sc_and_index(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 *idx) { MVMint32 sc_id; MVMuint32 packed; assert_can_read(tc, reader, 4); packed = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; sc_id = packed >> PACKED_SC_SHIFT; if (sc_id != PACKED_SC_OVERFLOW) { *idx = packed & PACKED_SC_IDX_MASK; } else { assert_can_read(tc, reader, 8); sc_id = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; *idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } return locate_sc(tc, reader, sc_id); } /* Reads in and resolves an object references. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_obj_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); /* sequence point... */ return MVM_sc_get_object(tc, sc, idx); } /* Reads in an array of variant references. */ static MVMObject * read_array_var(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMint32 elems, i; /* Read the element count. */ if (reader->root.version <= 15) { assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } else { elems = MVM_serialization_read_varint(tc, reader); } /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_o(tc, result, i, MVM_serialization_read_ref(tc, reader)); /* Set the SC. */ MVM_sc_set_obj_sc(tc, result, reader->root.sc); return result; } /* Reads in an hash with string keys and variant references. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_hash_str_var(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMint32 elems, i; /* Read the element count. */ assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; /* Read in the elements. */ for (i = 0; i < elems; i++) { MVMString *key = MVM_serialization_read_str(tc, reader); MVM_repr_bind_key_o(tc, result, key, MVM_serialization_read_ref(tc, reader)); } /* Set the SC. */ MVM_sc_set_obj_sc(tc, result, reader->root.sc); return result; } /* Reads in an array of integers. */ static MVMObject * read_array_varint(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); MVMint64 elems, i; /* Read the element count. */ elems = MVM_serialization_read_varint(tc, reader); /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_i(tc, result, i, MVM_serialization_read_varint(tc, reader)); return result; } /* Reads in an array of strings. */ static MVMObject * read_array_str(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStrArray); MVMint32 elems, i; /* Read the element count. */ assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_s(tc, result, i, MVM_serialization_read_str(tc, reader)); return result; } /* Reads in a code reference. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_code_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); return MVM_sc_get_code(tc, sc, idx); } /* Read the reference type discriminator from the buffer. */ MVM_STATIC_INLINE MVMuint8 read_discrim(MVMThreadContext *tc, MVMSerializationReader *reader) { assert_can_read(tc, reader, 1); return *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); } /* Reading function for references. * * BEWARE - logic in this function is partly duplicated in * deserialize_method_cache_lazy(). If you change the format (or sizes) of * things read here (including of course, things read down the calltree) you may * need to update the corresponding skip count logic in * deserialize_method_cache_lazy(). */ MVMObject * MVM_serialization_read_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result; /* Read the discriminator. */ const int discrim_size = 1; const MVMuint8 discrim = read_discrim(tc, reader); *(reader->cur_read_offset) += discrim_size; /* Decide what to do based on it. */ switch (discrim) { case REFVAR_NULL: return NULL; case REFVAR_OBJECT: return read_obj_ref(tc, reader); case REFVAR_VM_NULL: return tc->instance->VMNull; case REFVAR_VM_INT: { MVMint64 value; value = MVM_serialization_read_varint(tc, reader); result = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, value); return result; } case REFVAR_VM_NUM: result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTNum); MVM_repr_set_num(tc, result, MVM_serialization_read_num(tc, reader)); return result; case REFVAR_VM_STR: result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStr); MVM_repr_set_str(tc, result, MVM_serialization_read_str(tc, reader)); return result; case REFVAR_VM_ARR_VAR: result = read_array_var(tc, reader); if (reader->current_object) { MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, result); MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, reader->current_object); } return result; case REFVAR_VM_ARR_STR: return read_array_str(tc, reader); case REFVAR_VM_ARR_INT: return read_array_varint(tc, reader); case REFVAR_VM_HASH_STR_VAR: result = read_hash_str_var(tc, reader); if (reader->current_object) { MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, result); MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, reader->current_object); } return result; case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: return read_code_ref(tc, reader); default: fail_deserialize(tc, reader, "Serialization Error: Unimplemented case of read_ref"); } } /* Reading function for STable references. */ MVMSTable * MVM_serialization_read_stable_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); return MVM_sc_get_stable(tc, sc, idx); } /* Checks the header looks sane and all of the places it points to make sense. * Also dissects the input string into the tables and data segments and populates * the reader data structure more fully. */ static void check_and_dissect_input(MVMThreadContext *tc, MVMSerializationReader *reader, MVMString *data_str) { size_t data_len; size_t header_size; char *data; char *prov_pos; char *data_end; if (data_str) { /* Grab data from string. */ char *data_b64 = (char *)MVM_string_ascii_encode(tc, data_str, NULL); data = (char *)base64_decode(data_b64, &data_len); MVM_free(data_b64); reader->data_needs_free = 1; } else { /* Try to get it from the current compilation unit. */ data = (char *)(*tc->interp_cu)->body.serialized; if (!data) fail_deserialize(tc, reader, "Failed to find deserialization data in compilation unit"); data_len = (*tc->interp_cu)->body.serialized_size; } prov_pos = data; data_end = data + data_len; /* Ensure we got the data. */ if (data == NULL) fail_deserialize(tc, reader, "Failed to decode base64-encoded serialization data"); reader->data = data; /* Ensure that we have enough space to read a version number and check it. */ if (data_len < 4) fail_deserialize(tc, reader, "Serialized data too short to read a version number (< 4 bytes)"); reader->root.version = read_int32(data, 0); if (reader->root.version < MIN_VERSION || reader->root.version > CURRENT_VERSION) fail_deserialize(tc, reader, "Unsupported serialization format version %d (current version is %d)", reader->root.version, CURRENT_VERSION); /* Pick header size by version. */ /* See blame history for the next line if you change the header size: */ header_size = HEADER_SIZE; /* Ensure that the data is at least as long as the header is expected to be. */ if (data_len < header_size) fail_deserialize(tc, reader, "Serialized data shorter than header (< %"MVM_PRSz" bytes)", header_size); prov_pos += header_size; /* Get size and location of dependencies table. */ reader->root.dependencies_table = data + read_int32(data, 4); reader->root.num_dependencies = read_int32(data, 8); if (reader->root.dependencies_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (dependencies table starts before header ends)"); prov_pos = reader->root.dependencies_table + reader->root.num_dependencies * DEP_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (dependencies table overruns end of data)"); /* Get size and location of STables table. */ reader->root.stables_table = data + read_int32(data, 12); reader->root.num_stables = read_int32(data, 16); if (reader->root.stables_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (STables table starts before dependencies table ends)"); prov_pos = reader->root.stables_table + reader->root.num_stables * STABLES_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (STables table overruns end of data)"); /* Get location of STables data. */ reader->root.stables_data = data + read_int32(data, 20); if (reader->root.stables_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (STables data starts before STables table ends)"); prov_pos = reader->root.stables_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (STables data starts after end of data)"); /* Get size and location of objects table. */ reader->root.objects_table = data + read_int32(data, 24); reader->root.num_objects = read_int32(data, 28); if (reader->root.objects_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (objects table starts before STables data ends)"); prov_pos = reader->root.objects_table + reader->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (objects table overruns end of data)"); /* Get location of objects data. */ reader->root.objects_data = data + read_int32(data, 32); if (reader->root.objects_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (objects data starts before objects table ends)"); prov_pos = reader->root.objects_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (objects data starts after end of data)"); /* Get size and location of closures table. */ reader->root.closures_table = data + read_int32(data, 36); reader->root.num_closures = read_int32(data, 40); if (reader->root.closures_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (Closures table starts before objects data ends)"); prov_pos = reader->root.closures_table + reader->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (Closures table overruns end of data)"); /* Get size and location of contexts table. */ reader->root.contexts_table = data + read_int32(data, 44); reader->root.num_contexts = read_int32(data, 48); if (reader->root.contexts_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (contexts table starts before closures table ends)"); prov_pos = reader->root.contexts_table + reader->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (contexts table overruns end of data)"); /* Get location of contexts data. */ reader->root.contexts_data = data + read_int32(data, 52); if (reader->root.contexts_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (contexts data starts before contexts table ends)"); prov_pos = reader->root.contexts_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (contexts data starts after end of data)"); /* Get size and location of repossessions table. */ reader->root.repos_table = data + read_int32(data, 56); reader->root.num_repos = read_int32(data, 60); if (reader->root.repos_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (repossessions table starts before contexts data ends)"); prov_pos = reader->root.repos_table + reader->root.num_repos * REPOS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (repossessions table overruns end of data)"); /* Get location and number of entries in the interns data section. */ reader->root.param_interns_data = data + read_int32(data, 64); reader->root.num_param_interns = read_int32(data, 68); if (reader->root.param_interns_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (parameterization interns data starts before repossessions table ends)"); prov_pos = reader->root.param_interns_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (parameterization interns data overruns end of data)"); /* Set reading limits for data chunks. */ reader->stables_data_end = reader->root.objects_table; reader->objects_data_end = reader->root.closures_table; reader->contexts_data_end = reader->root.repos_table; reader->param_interns_data_end = data_end; } /* Goes through the dependencies table and resolves the dependencies that it * contains to SerializationContexts. */ static void resolve_dependencies(MVMThreadContext *tc, MVMSerializationReader *reader) { char *table_pos = reader->root.dependencies_table; MVMuint32 num_deps = reader->root.num_dependencies; MVMuint32 i; reader->root.dependent_scs = MVM_malloc(MAX(num_deps, 1) * sizeof(MVMSerializationContext *)); for (i = 0; i < num_deps; i++) { MVMString *handle = read_string_from_heap(tc, reader, read_int32(table_pos, 0)); MVMSerializationContext *sc; sc = MVM_sc_find_by_handle(tc, handle); if (sc == NULL) { MVMString *desc = read_string_from_heap(tc, reader, read_int32(table_pos, 4)); if (!desc) desc = handle; fail_deserialize(tc, reader, "Missing or wrong version of dependency '%s' (from '%s')", MVM_string_ascii_encode(tc, desc, NULL), reader->root.sc->body->description ? MVM_string_ascii_encode(tc, reader->root.sc->body->description, NULL) : ""); } reader->root.dependent_scs[i] = sc; table_pos += 8; } } /* Allocates and STables that we need to deserialize, associating it with its * REPR and getting its allocation size set up. */ static void stub_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i) { /* Save last read positions. */ MVMint32 orig_stables_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; char *orig_read_buffer_val = reader->cur_read_buffer ? *(reader->cur_read_buffer) : NULL; MVMint32 orig_read_offset_val = reader->cur_read_offset ? *(reader->cur_read_offset) : 0; char *orig_read_end_val = reader->cur_read_end ? *(reader->cur_read_end) : NULL; /* Calculate location of STable's table row. */ char *st_table_row = reader->root.stables_table + i * STABLES_TABLE_ENTRY_SIZE; /* Check we don't already have the STable (due to repossession). */ MVMSTable *st = MVM_sc_try_get_stable(tc, reader->root.sc, i); if (!st) { /* Read in and look up representation. */ const MVMREPROps *repr = MVM_repr_get_by_name(tc, read_string_from_heap(tc, reader, read_int32(st_table_row, 0))); /* Allocate and store stub STable. */ st = MVM_gc_allocate_stable(tc, repr, NULL); MVM_sc_set_stable(tc, reader->root.sc, i, st); } /* Set the STable's SC. */ MVM_sc_set_stable_sc(tc, st, reader->root.sc); /* Set STable read position, and set current read buffer to the * location of the REPR data. */ reader->stables_data_offset = read_int32(st_table_row, 8); reader->cur_read_buffer = &(reader->root.stables_data); reader->cur_read_offset = &(reader->stables_data_offset); reader->cur_read_end = &(reader->stables_data_end); if (st->REPR->deserialize_stable_size) st->REPR->deserialize_stable_size(tc, st, reader); else fail_deserialize(tc, reader, "Missing deserialize_stable_size"); if (st->size == 0) fail_deserialize(tc, reader, "STable with size zero after deserialization"); /* Restore original read positions. */ reader->stables_data_offset = orig_stables_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; if (reader->cur_read_buffer) { *(reader->cur_read_buffer) = orig_read_buffer_val; *(reader->cur_read_offset) = orig_read_offset_val; *(reader->cur_read_end) = orig_read_end_val; } } /* This is slightly misnamed because it doesn't read objects_data_offset. However, we never need that at the same time as we need the other data, so it makes sense not to over generalise this code. */ static MVMSTable *read_object_table_entry(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i, MVMint32 *concrete) { MVMint32 si; /* The SC in the dependencies table, + 1 */ MVMint32 si_idx; /* The index in that SC */ /* Calculate location of object's table row. */ const char *const obj_table_row = reader->root.objects_table + i * OBJECTS_TABLE_ENTRY_SIZE; const MVMuint32 packed = read_int32(obj_table_row, 0); if (concrete) *concrete = packed & OBJECTS_TABLE_ENTRY_IS_CONCRETE; si = (packed >> OBJECTS_TABLE_ENTRY_SC_SHIFT) & OBJECTS_TABLE_ENTRY_SC_MASK; if (si == OBJECTS_TABLE_ENTRY_SC_OVERFLOW) { const char *const overflow_data = reader->root.objects_data + read_int32(obj_table_row, 4) - 8; si = read_int32(overflow_data, 0); si_idx = read_int32(overflow_data, 4); } else { si_idx = packed & OBJECTS_TABLE_ENTRY_SC_IDX_MASK; } /* Resolve the STable. */ return MVM_sc_get_stable(tc, locate_sc(tc, reader, si), si_idx); } /* Stubs an object we need to deserialize, setting their REPR and type object * flag. */ static void stub_object(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i) { MVMint32 concrete; MVMSTable *st = read_object_table_entry(tc, reader, i, &concrete); /* Allocate and store stub object, unless it's already there due to a * repossession. */ MVMObject *obj = MVM_sc_try_get_object(tc, reader->root.sc, i); if (!obj) { if (concrete) obj = st->REPR->allocate(tc, st); else obj = MVM_gc_allocate_type_object(tc, st); MVM_sc_set_object(tc, reader->root.sc, i, obj); } /* Set the object's SC. */ MVM_sc_set_obj_sc(tc, obj, reader->root.sc); } /* Deserializes a context. */ static void deserialize_context(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 row) { MVMStaticFrame *sf; MVMFrame *f; MVMint64 i, syms; /* Save last read positions. */ MVMint32 orig_contexts_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; /* Calculate location of context's table row. */ char *table_row = reader->root.contexts_table + row * CONTEXTS_TABLE_ENTRY_SIZE; /* Resolve the reference to the static code object this context is for. */ MVMuint32 static_sc_id = read_int32(table_row, 0); MVMuint32 static_idx = read_int32(table_row, 4); MVMuint32 outer_idx = read_int32(table_row, 12); MVMObject *static_code = MVM_sc_get_code(tc, locate_sc(tc, reader, static_sc_id), static_idx); /* Create context. */ sf = ((MVMCode *)static_code)->body.sf; f = MVM_frame_create_context_only(tc, sf, static_code); /* Set context data read position, and set current read buffer to the correct thing. */ reader->contexts_data_offset = read_int32(table_row, 8); reader->cur_read_buffer = &(reader->root.contexts_data); reader->cur_read_offset = &(reader->contexts_data_offset); reader->cur_read_end = &(reader->contexts_data_end); /* Deserialize lexicals. */ syms = MVM_serialization_read_int(tc, reader); for (i = 0; i < syms; i++) { MVMString *sym = MVM_serialization_read_str(tc, reader); MVMRegister *lex = MVM_frame_lexical(tc, f, sym); switch (MVM_frame_lexical_primspec(tc, f, sym)) { case MVM_STORAGE_SPEC_BP_INT: lex->i64 = MVM_serialization_read_int(tc, reader); break; case MVM_STORAGE_SPEC_BP_NUM: lex->n64 = MVM_serialization_read_num(tc, reader); break; case MVM_STORAGE_SPEC_BP_STR: lex->s = MVM_serialization_read_str(tc, reader); break; default: lex->o = MVM_serialization_read_ref(tc, reader); } } /* Put context into contexts array (will be attached in a later pass). */ reader->contexts[row] = f; /* Restore original read positions. */ reader->contexts_data_offset = orig_contexts_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; /* If we have an outer context... */ if (outer_idx) { /* Deserialize it if we don't already have it. */ if (!reader->contexts[outer_idx - 1]) deserialize_context(tc, reader, outer_idx - 1); /* Attach it. */ f->outer = MVM_frame_inc_ref_by_frame(tc, reader->contexts[outer_idx - 1]); } } /* Deserializes a closure, though without attaching outer (that comes in a * later step). */ static void deserialize_closure(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i) { /* Calculate location of closure's table row. */ char *table_row = reader->root.closures_table + i * CLOSURES_TABLE_ENTRY_SIZE; /* Resolve the reference to the static code object. */ MVMuint32 static_sc_id = read_int32(table_row, 0); MVMuint32 static_idx = read_int32(table_row, 4); MVMuint32 context_idx = read_int32(table_row, 8); MVMObject *static_code = MVM_sc_get_code(tc, locate_sc(tc, reader, static_sc_id), static_idx); /* Clone it and add it to the SC's code refs list. */ MVMObject *closure = MVM_repr_clone(tc, static_code); MVM_repr_bind_pos_o(tc, reader->codes_list, reader->num_static_codes + i, closure); /* Tag it as being in this SC. */ MVM_sc_set_obj_sc(tc, closure, reader->root.sc); /* See if there's a code object we need to attach. */ if (read_int32(table_row, 12)) { MVMObject *obj = MVM_sc_get_object(tc, locate_sc(tc, reader, read_int32(table_row, 16)), read_int32(table_row, 20)); MVM_ASSIGN_REF(tc, &(closure->header), ((MVMCode *)closure)->body.code_object, obj); } /* If we have an outer context... */ if (context_idx) { /* Deserialize it if we don't already have it. */ if (!reader->contexts[context_idx - 1]) deserialize_context(tc, reader, context_idx - 1); /* Attach it. */ ((MVMCode *)closure)->body.outer = MVM_frame_inc_ref(tc, reader->contexts[context_idx - 1]); } } /* Reads in what we need to lazily deserialize ->HOW later. */ static void deserialize_how_lazy(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, (MVMint32 *) &st->HOW_idx); MVM_ASSIGN_REF(tc, &(st->header), st->HOW_sc, sc); } /* Stashes what we need to deserialize the method cache lazily later, and then * skips over it. * * This function is cruel and unforgiving if you change other parts of the * serialization format, but don't remember (or realise) that you need to update * its idea of sizes. Its "failure" mode is silent, and everything still passes * tests. Only if you benchmark do you realise that everything takes longer, * because the lazy paths are now no longer taken. */ static void deserialize_method_cache_lazy(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* Peek ahead at the discriminator. */ const int discrim_size = 1; const MVMuint8 discrim = read_discrim(tc, reader); /* We only know how to lazily handle a hash of code refs or code objects; * for anything else, don't do it lazily. */ if (discrim == REFVAR_VM_HASH_STR_VAR) { MVMint32 elems, i, valid; /* Save the offset, then skip past discriminator. */ MVMint32 before = *(reader->cur_read_offset); *(reader->cur_read_offset) += discrim_size; /* Check the elements are as expected. */ assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; valid = 1; for (i = 0; i < elems; i++) { MVMuint32 packed; MVMuint8 inner_discrim; /* Skip string. */ if (reader->root.version <= 15) { assert_can_read(tc, reader, 4); *(reader->cur_read_offset) += 4; } else { MVMint32 offset; assert_can_read(tc, reader, 2); offset = read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; if (offset & STRING_HEAP_LOC_PACKED_OVERFLOW) { assert_can_read(tc, reader, 2); *(reader->cur_read_offset) += 2; } } /* Ensure we've a coderef or code object. */ assert_can_read(tc, reader, discrim_size); inner_discrim = read_discrim(tc, reader); switch (inner_discrim) { case REFVAR_OBJECT: case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: assert_can_read(tc, reader, discrim_size + 4); packed = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset) + discrim_size); if(packed == (PACKED_SC_OVERFLOW << PACKED_SC_SHIFT)) { assert_can_read(tc, reader, discrim_size + 12); *(reader->cur_read_offset) += discrim_size + 12; } else { *(reader->cur_read_offset) += discrim_size + 4; } break; case REFVAR_NULL: case REFVAR_VM_NULL: case REFVAR_VM_INT: case REFVAR_VM_NUM: case REFVAR_VM_STR: case REFVAR_VM_ARR_VAR: case REFVAR_VM_ARR_STR: case REFVAR_VM_ARR_INT: case REFVAR_VM_HASH_STR_VAR: valid = 0; *(reader->cur_read_offset) = before; break; default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in inner loop in deserialize_method_cache_lazy", inner_discrim); } if (!valid) break; } /* If all was valid then just stash what we need for later. */ if (valid) { st->method_cache = NULL; MVM_ASSIGN_REF(tc, &(st->header), st->method_cache_sc, reader->root.sc); st->method_cache_offset = before; return; } } else { switch (discrim) { case REFVAR_OBJECT: case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: case REFVAR_NULL: case REFVAR_VM_NULL: case REFVAR_VM_INT: case REFVAR_VM_NUM: case REFVAR_VM_STR: case REFVAR_VM_ARR_VAR: case REFVAR_VM_ARR_STR: case REFVAR_VM_ARR_INT: case REFVAR_VM_HASH_STR_VAR: break; default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in deserialize_method_cache_lazy", discrim); } } /* If we get here, fall back to eager deserialization. */ MVM_ASSIGN_REF(tc, &(st->header), st->method_cache, MVM_serialization_read_ref(tc, reader)); } /* Deserializes a single STable, along with its REPR data. */ static void deserialize_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i, MVMSTable *st) { /* Save last read positions. */ MVMint32 orig_stables_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; char *orig_read_buffer_val = reader->cur_read_buffer ? *(reader->cur_read_buffer) : NULL; MVMint32 orig_read_offset_val = reader->cur_read_offset ? *(reader->cur_read_offset) : 0; char *orig_read_end_val = reader->cur_read_end ? *(reader->cur_read_end) : NULL; /* Calculate location of STable's table row. */ char *st_table_row = reader->root.stables_table + i * STABLES_TABLE_ENTRY_SIZE; MVMString *hll_name; MVMuint8 flags; /* Set STable read position, and set current read buffer to the correct thing. */ reader->stables_data_offset = read_int32(st_table_row, 4); reader->cur_read_buffer = &(reader->root.stables_data); reader->cur_read_offset = &(reader->stables_data_offset); reader->cur_read_end = &(reader->stables_data_end); /* Read the HOW, WHAT and WHO. */ deserialize_how_lazy(tc, st, reader); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, read_obj_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->WHO, MVM_serialization_read_ref(tc, reader)); /* Method cache. */ deserialize_method_cache_lazy(tc, st, reader); /* Type check cache. */ if (reader->root.version <= 15) { st->type_check_cache_length = MVM_serialization_read_int(tc, reader); } else { st->type_check_cache_length = MVM_serialization_read_varint(tc, reader); } if (st->type_check_cache_length > 0) { st->type_check_cache = (MVMObject **)MVM_malloc(st->type_check_cache_length * sizeof(MVMObject *)); for (i = 0; i < st->type_check_cache_length; i++) MVM_ASSIGN_REF(tc, &(st->header), st->type_check_cache[i], MVM_serialization_read_ref(tc, reader)); } /* Mode flags. */ if (reader->root.version <= 15) { st->mode_flags = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 1); st->mode_flags = *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); *(reader->cur_read_offset) += 1; } if (st->mode_flags & MVM_PARAMETRIC_TYPE && st->mode_flags & MVM_PARAMETERIZED_TYPE) fail_deserialize(tc, reader, "STable mode flags cannot indicate both parametric and parameterized"); /* Boolification spec. */ if (reader->root.version <= 15) { if (MVM_serialization_read_int(tc, reader)) { st->boolification_spec = (MVMBoolificationSpec *)MVM_malloc(sizeof(MVMBoolificationSpec)); st->boolification_spec->mode = MVM_serialization_read_int(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), st->boolification_spec->method, MVM_serialization_read_ref(tc, reader)); } } else { MVMuint8 mode; assert_can_read(tc, reader, 1); flags = *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); *(reader->cur_read_offset) += 1; mode = flags & 0xF; if (mode != 0xF) { st->boolification_spec = (MVMBoolificationSpec *)MVM_malloc(sizeof(MVMBoolificationSpec)); st->boolification_spec->mode = mode; MVM_ASSIGN_REF(tc, &(st->header), st->boolification_spec->method, MVM_serialization_read_ref(tc, reader)); } } /* Container spec. */ if (reader->root.version > 15 ? (flags & STABLE_HAS_CONTAINER_SPEC) : MVM_serialization_read_int(tc, reader)) { const MVMContainerConfigurer *cc = MVM_6model_get_container_config(tc, MVM_serialization_read_str(tc, reader)); cc->set_container_spec(tc, st); st->container_spec->deserialize(tc, st, reader); } /* Invocation spec. */ if (reader->root.version > 15 ? (flags & STABLE_HAS_INVOCATION_SPEC) : MVM_serialization_read_int(tc, reader)) { st->invocation_spec = (MVMInvocationSpec *)MVM_calloc(1, sizeof(MVMInvocationSpec)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->class_handle, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->attr_name, MVM_serialization_read_str(tc, reader)); if (reader->root.version <= 15) { st->invocation_spec->hint = MVM_serialization_read_int(tc, reader); } else { st->invocation_spec->hint = MVM_serialization_read_varint(tc, reader); } MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->invocation_handler, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_class_handle, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_cache_attr_name, MVM_serialization_read_str(tc, reader)); if (reader->root.version <= 15) { st->invocation_spec->md_cache_hint = MVM_serialization_read_int(tc, reader); } else { st->invocation_spec->md_cache_hint = MVM_serialization_read_varint(tc, reader); } MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_valid_attr_name, MVM_serialization_read_str(tc, reader)); if (reader->root.version <= 15) { st->invocation_spec->md_valid_hint = MVM_serialization_read_int(tc, reader); } else { st->invocation_spec->md_valid_hint = MVM_serialization_read_varint(tc, reader); } } /* HLL owner. */ if (reader->root.version <= 15) { hll_name = MVM_serialization_read_str(tc, reader); if (hll_name) st->hll_owner = MVM_hll_get_config_for(tc, hll_name); } else { if (flags & STABLE_HAS_HLL_OWNER) { st->hll_owner = MVM_hll_get_config_for(tc, MVM_serialization_read_str(tc, reader)); } } /* If it's a parametric type... */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) { /* Create empty lookup table, unless we were beat to it. */ if (!st->paramet.ric.lookup) { MVMObject *lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.lookup, lookup); } /* Deserialize parameterizer. */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.parameterizer, MVM_serialization_read_ref(tc, reader)); } /* If it's a parameterized type... */ if (st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVMObject *lookup; /* Deserialize parametric type and parameters. */ MVMObject *ptype = MVM_serialization_read_ref(tc, reader); MVMObject *params = read_array_var(tc, reader); /* Attach them to the STable. */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.erized.parametric_type, ptype); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.erized.parameters, params); /* Add a mapping into the lookup list of the parameteric type. */ lookup = STABLE(ptype)->paramet.ric.lookup; if (!lookup) { lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(STABLE(ptype)->header), STABLE(ptype)->paramet.ric.lookup, lookup); } MVM_repr_push_o(tc, lookup, params); MVM_repr_push_o(tc, lookup, st->WHAT); } /* If the REPR has a function to deserialize representation data, call it. */ if (st->REPR->deserialize_repr_data) st->REPR->deserialize_repr_data(tc, st, reader); /* Restore original read positions. */ reader->stables_data_offset = orig_stables_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; if (reader->cur_read_buffer) { *(reader->cur_read_buffer) = orig_read_buffer_val; *(reader->cur_read_offset) = orig_read_offset_val; *(reader->cur_read_end) = orig_read_end_val; } } /* Deserializes a single object. */ static void deserialize_object(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i, MVMObject *obj) { /* We've no more to do for type objects. */ if (IS_CONCRETE(obj)) { /* Calculate location of object's table row. */ char *obj_table_row = reader->root.objects_table + i * OBJECTS_TABLE_ENTRY_SIZE; /* Set current read buffer to the correct thing. */ reader->cur_read_buffer = &(reader->root.objects_data); reader->cur_read_offset = &(reader->objects_data_offset); reader->cur_read_end = &(reader->objects_data_end); /* Delegate to its deserialization REPR function. */ reader->current_object = obj; reader->objects_data_offset = read_int32(obj_table_row, 4); if (REPR(obj)->deserialize) REPR(obj)->deserialize(tc, STABLE(obj), obj, OBJECT_BODY(obj), reader); else fail_deserialize(tc, reader, "Missing deserialize REPR function for %s", REPR(obj)->name); reader->current_object = NULL; } } /* Worklist manipulation functions. */ static void worklist_add_index(MVMThreadContext *tc, MVMDeserializeWorklist *wl, MVMuint32 index) { if (wl->num_indexes == wl->alloc_indexes) { if (wl->alloc_indexes) wl->alloc_indexes *= 2; else wl->alloc_indexes = 128; wl->indexes = MVM_realloc(wl->indexes, wl->alloc_indexes * sizeof(MVMuint32)); } wl->indexes[wl->num_indexes] = index; wl->num_indexes++; } static MVMuint32 worklist_has_work(MVMThreadContext *tc, MVMDeserializeWorklist *wl) { return wl->num_indexes > 0; } static MVMuint32 worklist_take_index(MVMThreadContext *tc, MVMDeserializeWorklist *wl) { wl->num_indexes--; return wl->indexes[wl->num_indexes]; } /* Evaluates work lists until they are all empty. */ static void work_loop(MVMThreadContext *tc, MVMSerializationReader *sr) { MVMuint32 worked = 1; while (worked) { worked = 0; while (worklist_has_work(tc, &(sr->wl_stables))) { MVMuint32 index = worklist_take_index(tc, &(sr->wl_stables)); deserialize_stable(tc, sr, index, sr->root.sc->body->root_stables[index]); worked = 1; } while (worklist_has_work(tc, &(sr->wl_objects)) && !worklist_has_work(tc, &(sr->wl_stables))) { MVMuint32 index = worklist_take_index(tc, &(sr->wl_objects)); deserialize_object(tc, sr, index, sr->root.sc->body->root_objects[index]); worked = 1; } } } /* Demands that we finish deserializing an object. */ MVMObject * MVM_serialization_demand_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and check we didn't lose a race to deserialize this * object. */ MVMSerializationReader *sr = sc->body->sr; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); if (sc->body->root_objects[idx]) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return sc->body->root_objects[idx]; } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Stub the object. */ stub_object(tc, sr, idx); /* Add to worklist and process as needed. */ worklist_add_index(tc, &(sr->wl_objects), idx); if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) object. */ return sc->body->root_objects[idx]; } /* Demands that we finish deserializing an STable. */ MVMSTable * MVM_serialization_demand_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and ensure we didn't lose a race to deserialize this * STable. */ MVMSerializationReader *sr = sc->body->sr; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); if (sc->body->root_stables[idx]) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return sc->body->root_stables[idx]; } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Stub the STable. */ stub_stable(tc, sr, idx); /* Add to worklist and process as needed. */ worklist_add_index(tc, &(sr->wl_stables), idx); if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) STable. */ return sc->body->root_stables[idx]; } /* Demands that we finish deserializing a coderef. */ MVMObject * MVM_serialization_demand_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and ensure we didn't lose a race to deserialize this * code object. */ MVMSerializationReader *sr = sc->body->sr; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); if (!MVM_is_null(tc, MVM_repr_at_pos_o(tc, sr->codes_list, idx))) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return MVM_repr_at_pos_o(tc, sr->codes_list, idx); } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Deserialize the code object. */ deserialize_closure(tc, sr, idx - sr->num_static_codes); /* Add to worklist and process as needed. */ if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) STable. */ return MVM_repr_at_pos_o(tc, sr->codes_list, idx); } /* Forces us to complete deserialization of a particular STable before work * can go on. */ void MVM_serialization_force_stable(MVMThreadContext *tc, MVMSerializationReader *sr, MVMSTable *st) { /* We'll always have the WHAT if we finished deserializing. */ if (!st->WHAT) { /* Not finished. Try to find the index. */ MVMDeserializeWorklist *wl = &(sr->wl_stables); MVMint32 found = 0; MVMuint32 i; for (i = 0; i < wl->num_indexes; i++) { MVMuint32 index = wl->indexes[i]; if (!found) { if (sr->root.sc->body->root_stables[index] == st) { /* Found it; finish deserialize. */ deserialize_stable(tc, sr, index, sr->root.sc->body->root_stables[index]); found = 1; } } else { /* After the found index; steal from list. */ wl->indexes[i - 1] = index; } } if (found) wl->num_indexes--; } } /* Finishes deserializing the method cache. */ void MVM_serialization_finish_deserialize_method_cache(MVMThreadContext *tc, MVMSTable *st) { MVMSerializationContext *sc = st->method_cache_sc; if (sc && sc->body->sr) { /* Acquire mutex and ensure we didn't lose a race to do this. */ MVMSerializationReader *sr = sc->body->sr; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); if (st->method_cache_sc) { /* Set reader's position. */ sr->stables_data_offset = st->method_cache_offset; sr->cur_read_buffer = &(sr->root.stables_data); sr->cur_read_offset = &(sr->stables_data_offset); sr->cur_read_end = &(sr->stables_data_end); /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Deserialize what we need. */ MVM_ASSIGN_REF(tc, &(st->header), st->method_cache, MVM_serialization_read_ref(tc, sr)); if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; st->method_cache_sc = NULL; } MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); } } /* Repossess an object or STable. Ignores those not matching the specified * type (where 0 = object, 1 = STable). */ static void repossess(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint64 i, MVMObject *repo_conflicts, MVMint32 type) { MVMuint32 slot; /* Calculate location of table row. */ char *table_row = reader->root.repos_table + i * REPOS_TABLE_ENTRY_SIZE; /* Do appropriate type of repossession, provided it matches the type of * thing we're current repossessing. */ MVMint32 repo_type = read_int32(table_row, 0); if (repo_type != type) return; if (repo_type == 0) { MVMSTable *updated_st; /* Get object to repossess. */ MVMSerializationContext *orig_sc = locate_sc(tc, reader, read_int32(table_row, 8)); MVMObject *orig_obj = MVM_sc_get_object(tc, orig_sc, read_int32(table_row, 12)); /* If we have a reposession conflict, make a copy of the original object * and reference it from the conflicts list. Push the original (about to * be overwritten) object reference too. */ if (MVM_sc_get_obj_sc(tc, orig_obj) != orig_sc) { MVMROOT(tc, orig_obj, { MVMObject *backup = NULL; MVMROOT(tc, backup, { if (IS_CONCRETE(orig_obj)) { backup = REPR(orig_obj)->allocate(tc, STABLE(orig_obj)); REPR(orig_obj)->copy_to(tc, STABLE(orig_obj), OBJECT_BODY(orig_obj), backup, OBJECT_BODY(backup)); } else backup = MVM_gc_allocate_type_object(tc, STABLE(orig_obj)); }); MVM_SC_WB_OBJ(tc, backup); MVM_repr_push_o(tc, repo_conflicts, backup); MVM_repr_push_o(tc, repo_conflicts, orig_obj); }); } /* Put it into objects root set at the apporpriate slot. */ slot = read_int32(table_row, 4); MVM_sc_set_object(tc, reader->root.sc, slot, orig_obj); MVM_sc_set_obj_sc(tc, orig_obj, reader->root.sc); /* Clear it up, since we'll re-allocate all the bits inside * it on deserialization. */ if (REPR(orig_obj)->gc_free) REPR(orig_obj)->gc_free(tc, orig_obj); /* The object's STable may have changed as a result of the * repossession (perhaps due to mixing in to it), so put the * STable it should now have in place. */ updated_st = read_object_table_entry(tc, reader, slot, NULL); MVM_ASSIGN_REF(tc, &(orig_obj->header), orig_obj->st, updated_st); /* Put this on the list of things we should deserialize right away. */ worklist_add_index(tc, &(reader->wl_objects), slot); } else if (repo_type == 1) { /* Get STable to repossess. */ MVMSerializationContext *orig_sc = locate_sc(tc, reader, read_int32(table_row, 8)); MVMSTable *orig_st = MVM_sc_get_stable(tc, orig_sc, read_int32(table_row, 12)); /* Make sure we don't have a reposession conflict. */ if (MVM_sc_get_stable_sc(tc, orig_st) != orig_sc) fail_deserialize(tc, reader, "STable conflict detected during deserialization.\n" "(Probable attempt to load two modules that cannot be loaded together)."); /* Put it into STables root set at the apporpriate slot. */ slot = read_int32(table_row, 4); MVM_sc_set_stable(tc, reader->root.sc, slot, orig_st); MVM_sc_set_stable_sc(tc, orig_st, reader->root.sc); /* XXX TODO: consider clearing up STable, however we must do it out of * this repossess routine, since we may depend on original data to do * lazy deserialization of original objects. */ /*if (orig_st->REPR->gc_free_repr_data) orig_st->REPR->gc_free_repr_data(tc, orig_st);*/ /* Put this on the list of things we should deserialize right away. */ worklist_add_index(tc, &(reader->wl_stables), slot); } else { fail_deserialize(tc, reader, "Unknown repossession type"); } } /* This goes through the entries in the parameterized types interning section, * if any. For each, if we already deserialized the parameterization from a * different compilation unit or created it in something we already compiled, * we just use that existing parameterization. */ static void resolve_param_interns(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 iidx; /* Switch to reading the parameterization segment. */ reader->cur_read_buffer = &(reader->root.param_interns_data); reader->cur_read_offset = &(reader->param_interns_data_offset); reader->cur_read_end = &(reader->param_interns_data_end); /* Go over all the interns we have. */ for (iidx = 0; iidx < reader->root.num_param_interns; iidx++) { MVMObject *params, *matching; MVMint32 num_params, i; /* Resolve the parametric type. */ MVMObject *ptype = read_obj_ref(tc, reader); /* Read indexes where type object and STable will get placed if a * matching intern is found. */ MVMint32 type_idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); MVMint32 st_idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset) + 4); *(reader->cur_read_offset) += 8; /* Read parameters and push into array. */ num_params = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; params = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); for (i = 0; i < num_params; i++) MVM_repr_push_o(tc, params, read_obj_ref(tc, reader)); /* Try to find a matching parameterization. */ matching = MVM_6model_parametric_try_find_parameterization(tc, STABLE(ptype), params); if (matching) { MVM_sc_set_object(tc, reader->root.sc, type_idx, matching); MVM_sc_set_stable(tc, reader->root.sc, st_idx, STABLE(matching)); } } } /* Takes serialized data, an empty SerializationContext to deserialize it into, * a strings heap and the set of static code refs for the compilation unit. * Deserializes the data into the required objects and STables. */ void MVM_serialization_deserialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *string_heap, MVMObject *codes_static, MVMObject *repo_conflicts, MVMString *data) { MVMint32 scodes, i; /* Allocate and set up reader. */ MVMSerializationReader *reader = MVM_calloc(1, sizeof(MVMSerializationReader)); reader->root.sc = sc; /* If we've been given a NULL string heap, use that of the current * compilation unit. */ if (MVM_is_null(tc, string_heap)) reader->root.string_comp_unit = *(tc->interp_cu); else reader->root.string_heap = string_heap; /* Store reader inside serialization context; it'll need it for lazy * deserialization. */ sc->body->sr = reader; /* Put code root list into SC. We'll end up mutating it, but that's * probably fine. */ MVM_sc_set_code_list(tc, sc, codes_static); reader->codes_list = codes_static; scodes = (MVMint32)MVM_repr_elems(tc, codes_static); reader->num_static_codes = scodes; /* Mark all the static code refs we've been provided with as static. */ for (i = 0; i < scodes; i++) { MVMObject *scr = MVM_repr_at_pos_o(tc, reader->codes_list, i); ((MVMCode *)scr)->body.is_static = 1; MVM_sc_set_obj_sc(tc, scr, sc); } /* During deserialization, we allocate directly in generation 2. This * is because these objects are almost certainly going to be long lived, * but also because if we know that we won't end up moving the objects * we are working on during a deserialization run, it's a bunch easier * to have those partially constructed objects floating around. */ MVM_gc_allocate_gen2_default_set(tc); /* Read header and dissect the data into its parts. */ check_and_dissect_input(tc, reader, data); /* Resolve the SCs in the dependencies table. */ resolve_dependencies(tc, reader); /* Size objects, STables, and contexts arrays. */ if (sc->body->root_objects) MVM_free(sc->body->root_objects); if (sc->body->root_stables) MVM_free(sc->body->root_stables); sc->body->root_objects = MVM_calloc(1, reader->root.num_objects * sizeof(MVMObject *)); sc->body->num_objects = reader->root.num_objects; sc->body->alloc_objects = reader->root.num_objects; sc->body->root_stables = MVM_calloc(1, reader->root.num_stables * sizeof(MVMSTable *)); sc->body->num_stables = reader->root.num_stables; sc->body->alloc_stables = reader->root.num_stables; reader->contexts = MVM_calloc(reader->root.num_contexts, sizeof(MVMFrame *)); /* Increase size of code refs list to include closures we'll later * deserialize. */ REPR(codes_static)->pos_funcs.set_elems(tc, STABLE(codes_static), codes_static, OBJECT_BODY(codes_static), scodes + reader->root.num_closures); /* Handle any type parameterization interning, menaing we should not * deserialize our own versions of things. */ resolve_param_interns(tc, reader); /* If we're repossessing STables and objects from other SCs, then first * get those raw objects into our root set. Note we do all the STables, * then all the objects, since the objects may, post-repossession, refer * to a repossessed STable. */ for (i = 0; i < reader->root.num_repos; i++) repossess(tc, reader, i, repo_conflicts, 1); for (i = 0; i < reader->root.num_repos; i++) repossess(tc, reader, i, repo_conflicts, 0); /* Enter the work loop to deal with the things we immediately need to * handle in order to complete repossession object deserialization. */ reader->working = 1; work_loop(tc, reader); reader->working = 0; /* Clear serialized data reference in CU. */ if ((*tc->interp_cu)->body.serialized) { (*tc->interp_cu)->body.serialized = NULL; (*tc->interp_cu)->body.serialized_size = 0; } /* If lazy deserialization is disabled, deserialize everything. */ #if !MVM_SERIALIZATION_LAZY for (i = 0; i < sc->body->num_objects; i++) MVM_serialization_demand_object(tc, sc, i); for (i = 0; i < sc->body->num_stables; i++) MVM_serialization_demand_stable(tc, sc, i); #endif /* Restore normal GC allocation. */ MVM_gc_allocate_gen2_default_clear(tc); } /* =item sha1 Computes the SHA-1 hash of string. =cut */ MVMString * MVM_sha1(MVMThreadContext *tc, MVMString *str) { /* Grab the string as a C string. */ char *cstr = MVM_string_utf8_encode_C_string(tc, str); /* Compute its SHA-1 and encode it. */ SHA1Context context; char output[80]; SHA1Init(&context); SHA1Update(&context, (unsigned char*)cstr, strlen(cstr)); SHA1Final(&context, output); /* Free the C-MVMString and put result into a new MVMString. */ MVM_free(cstr); return MVM_string_ascii_decode(tc, tc->instance->VMString, output, 40); } MoarVM-2015.11/src/6model/serialization.h0000644000175000017500000001763112521117722017063 0ustar jnthnjnthn/* This represents the root of the serialization data; everything hangs * off this. In read mode, we don't do much besides populate and then * read this. In write mode, however, the tables and data chunks will be * filled out and grown as needed. */ struct MVMSerializationRoot { /* The version of the serialization format. */ MVMint32 version; /* The SC we're serializing/deserializing. */ MVMSerializationContext *sc; /* List of the serialization context objects that we depend on. */ MVMSerializationContext **dependent_scs; /* The number of dependencies, as well as a pointer to the * dependencies table. */ char *dependencies_table; MVMint32 num_dependencies; /* The number of STables, as well as pointers to the STables * table and data chunk. */ MVMint32 num_stables; char *stables_table; char *stables_data; /* The number of objects, as well as pointers to the objects * table and data chunk. */ char *objects_table; char *objects_data; MVMint32 num_objects; /* The number of closures, as we as a pointer to the closures * table. */ MVMint32 num_closures; char *closures_table; /* The number of contexts (e.g. frames), as well as pointers to * the contexts table and data chunk. */ char *contexts_table; char *contexts_data; MVMint32 num_contexts; /* The number of repossessions and pointer to repossessions table. */ MVMint32 num_repos; char *repos_table; /* The number of parameterized type intern entries, and the data segment * containing them. */ MVMint32 num_param_interns; char *param_interns_data; /* Array of strings making up the string heap we are constructing. If we * are reading, this will either contain a string heap array or be NULL * and the next field will be set. */ MVMObject *string_heap; /* The compilation unit whose string heap we will use to locate strings. * This must be set of string_heap about is set to NULL. */ MVMCompUnit *string_comp_unit; }; /* Indexes the deserializer still has to work on. */ struct MVMDeserializeWorklist { MVMuint32 *indexes; MVMuint32 num_indexes; MVMuint32 alloc_indexes; }; /* Represents the serialization reader and the various functions available * on it. */ struct MVMSerializationReader { /* Serialization root data. */ MVMSerializationRoot root; /* Current offsets for the data chunks (also correspond to the amount of * data written in to them). */ MVMint32 stables_data_offset; MVMint32 objects_data_offset; MVMint32 contexts_data_offset; MVMint32 param_interns_data_offset; /* Limits up to where we can read stables, objects and contexts data. */ char *stables_data_end; char *objects_data_end; char *contexts_data_end; char *param_interns_data_end; /* Where to find details related to the current buffer we're reading from: * the buffer pointer itself, the current offset and the amount that is * allocated. These are all pointers back into this data structure. */ char **cur_read_buffer; MVMint32 *cur_read_offset; char **cur_read_end; /* List of code objects (static first, then all the closures). */ MVMObject *codes_list; /* Number of static code objects. */ MVMuint32 num_static_codes; /* Array of contexts (num_contexts in length). */ MVMFrame **contexts; /* Set of current worklists, for things we need to fully desrialize. When * they are all empty, the current (usually lazy) deserialization work is * done, and we have the required object graph. */ MVMDeserializeWorklist wl_objects; MVMDeserializeWorklist wl_stables; /* Whether we're already working on these worklists. */ MVMuint32 working; /* The current object we're deserializing. */ MVMObject *current_object; /* The data, which we may want to free when the SC goes away; a flag * indicates when it should be. */ char *data; MVMuint32 data_needs_free; }; /* Represents the serialization writer and the various functions available * on it. */ struct MVMSerializationWriter { /* Serialization root data. */ MVMSerializationRoot root; /* The code refs and contexts lists we're working through/adding to. */ MVMObject *codes_list; MVMObject *contexts_list; /* Current position in the stables, objects and contexts lists. */ MVMint64 stables_list_pos; MVMint64 objects_list_pos; MVMint64 contexts_list_pos; /* Hash of strings we've already seen while serializing to the index they * are placed at in the string heap. */ MVMObject *seen_strings; /* Amount of memory allocated for various things. */ MVMuint32 dependencies_table_alloc; MVMuint32 stables_table_alloc; MVMuint32 stables_data_alloc; MVMuint32 objects_table_alloc; MVMuint32 objects_data_alloc; MVMuint32 closures_table_alloc; MVMuint32 contexts_table_alloc; MVMuint32 contexts_data_alloc; MVMuint32 repos_table_alloc; MVMuint32 param_interns_data_alloc; /* Current offsets for the data chunks (also correspond to the amount of * data written in to them). */ MVMuint32 stables_data_offset; MVMuint32 objects_data_offset; MVMuint32 contexts_data_offset; MVMuint32 param_interns_data_offset; /* Where to find details related to the current buffer we're writing in * to: the buffer pointer itself, the current offset and the amount that * is allocated. These are all pointers back into this data structure. */ char **cur_write_buffer; MVMuint32 *cur_write_offset; MVMuint32 *cur_write_limit; }; /* Core serialize and deserialize functions. */ void MVM_serialization_deserialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *string_heap, MVMObject *codes_static, MVMObject *repo_conflicts, MVMString *data); MVMString * MVM_sha1(MVMThreadContext *tc, MVMString *str); MVMString * MVM_serialization_serialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *empty_string_heap); /* Functions for demanding an object/STable/code be made available (that is, * by lazily deserializing it). */ MVMObject * MVM_serialization_demand_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSTable * MVM_serialization_demand_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMObject * MVM_serialization_demand_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_serialization_finish_deserialize_method_cache(MVMThreadContext *tc, MVMSTable *st); /* Reader/writer functions. */ MVMint64 MVM_serialization_read_int(MVMThreadContext *tc, MVMSerializationReader *reader); MVMint64 MVM_serialization_read_varint(MVMThreadContext *tc, MVMSerializationReader *reader); MVMnum64 MVM_serialization_read_num(MVMThreadContext *tc, MVMSerializationReader *reader); MVMString * MVM_serialization_read_str(MVMThreadContext *tc, MVMSerializationReader *reader); MVMObject * MVM_serialization_read_ref(MVMThreadContext *tc, MVMSerializationReader *reader); MVMSTable * MVM_serialization_read_stable_ref(MVMThreadContext *tc, MVMSerializationReader *reader); void MVM_serialization_force_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMSTable *st); void MVM_serialization_write_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value); void MVM_serialization_write_varint(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value); void MVM_serialization_write_num(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMnum64 value); void MVM_serialization_write_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *value); void MVM_serialization_write_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref); void MVM_serialization_write_stable_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st); MoarVM-2015.11/src/README.md0000644000175000017500000000223112456307241014120 0ustar jnthnjnthn## MoarVM Source Code MoarVM is written in C, and is designed to (eventually) have a couple of build targets: a dynamic library (so it can be loaded by other VMs or programs that embed it) with a small executable front-end wrapper, but also a fully statically-built standalone executable that can run .moarvm files only. Another option could be for incorporating programs (such as a perl6 build) to statically link the moar library so it can be self-contained itself. moar.c will contain the main embedding API, and main.c will utilize that API. This is not yet fully realized. It will eventually be compiled to libmoar, or similar. moar.h is the primary header file that embedders should include to gain access to the publicly exported MVM_ routines and macros. It includes all the other .h in the src/ tree. Some individual .c files also include other .h files, but the symbols from those files aren't necessarily intended to be part of MoarVM's public API. main.c is currently compiled to the ./moar executable, which is able to run or dump .moarvm bytecode files only. Use the --help flag to see the options available to the moar (moar.exe on Windows) executable. MoarVM-2015.11/src/bithacks.h0000644000175000017500000000073112456307241014605 0ustar jnthnjnthnstatic MVMuint32 MVM_bithacks_count_bits(MVMuint64 value) { MVMuint32 count; for (count = 0; value; count++) value &= value - 1; return count; } static int MVM_bithacks_is_pow2z(MVMuint64 value) { return (value & (value - 1)) == 0; } static MVMuint64 MVM_bithacks_next_greater_pow2(MVMuint64 value) { enum { BITS = 64 }; int exp; for(exp = 0; (1 << exp) < BITS; exp++) value |= value >> (1 << exp); return value + 1; } MoarVM-2015.11/src/core/alloc.h0000644000175000017500000000125712554473060015045 0ustar jnthnjnthnMVM_STATIC_INLINE void * MVM_malloc(size_t size) { void *ptr = malloc(size); if (!ptr) MVM_panic_allocation_failed(size); return ptr; } MVM_STATIC_INLINE void * MVM_calloc(size_t num, size_t size) { void *ptr = calloc(num, size); if (!ptr) MVM_panic_allocation_failed(num * size); return ptr; } MVM_STATIC_INLINE void * MVM_realloc(void *p, size_t size) { void *ptr = realloc(p, size); if (!ptr && size > 0) MVM_panic_allocation_failed(size); return ptr; } MVM_STATIC_INLINE void MVM_free(void *p) { free(p); } #define MVM_free_null(addr) do { \ MVM_free((void *)(addr)); \ (addr) = NULL; \ } while (0) MoarVM-2015.11/src/core/args.c0000644000175000017500000011177412623370227014706 0ustar jnthnjnthn#include "moar.h" static void init_named_used(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 num) { if (ctx->named_used && ctx->named_used_size >= num) { /* reuse the old one */ memset(ctx->named_used, 0, ctx->named_used_size * sizeof(MVMuint8)); } else { if (ctx->named_used) { MVM_fixed_size_free(tc, tc->instance->fsa, ctx->named_used_size, ctx->named_used); ctx->named_used = NULL; } ctx->named_used_size = num; ctx->named_used = ctx->named_used_size ? MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, num) : NULL; } } /* Initialize arguments processing context. */ void MVM_args_proc_init(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMCallsite *callsite, MVMRegister *args) { /* Stash callsite and argument counts/pointers. */ ctx->callsite = callsite; /* initial counts and values; can be altered by flatteners */ init_named_used(tc, ctx, MVM_callsite_num_nameds(tc, callsite)); ctx->args = args; ctx->num_pos = callsite->num_pos; ctx->arg_count = callsite->arg_count; ctx->arg_flags = NULL; /* will be populated by flattener if needed */ } /* Clean up an arguments processing context for cache. */ void MVM_args_proc_cleanup_for_cache(MVMThreadContext *tc, MVMArgProcContext *ctx) { if (ctx->arg_flags) { /* Free the generated flags. */ MVM_free(ctx->arg_flags); ctx->arg_flags = NULL; /* Free the generated args buffer. */ MVM_free(ctx->args); ctx->args = NULL; } } /* Clean up an arguments processing context. */ void MVM_args_proc_cleanup(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVM_args_proc_cleanup_for_cache(tc, ctx); if (ctx->named_used) { MVM_fixed_size_free(tc, tc->instance->fsa, ctx->named_used_size, ctx->named_used); ctx->named_used = NULL; ctx->named_used_size = 0; } } MVMCallsite * MVM_args_copy_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMCallsite *res = MVM_malloc(sizeof(MVMCallsite)); MVMCallsiteEntry *flags = NULL; MVMCallsiteEntry *src_flags; MVMint32 fsize; if (ctx->arg_flags) { fsize = ctx->flag_count; src_flags = ctx->arg_flags; } else { fsize = ctx->callsite->flag_count; src_flags = ctx->callsite->arg_flags; } if (fsize) { flags = MVM_malloc(fsize); memcpy(flags, src_flags, fsize); } res->flag_count = fsize; res->arg_flags = flags; res->arg_count = ctx->arg_count; res->num_pos = ctx->num_pos; res->has_flattening = 0; res->is_interned = 0; return res; } /* Turn an argument processing context into a callsite. In the case that no * flattening happened, this is the original call site. Otherwise, we make * one up. */ MVMCallsite * MVM_args_proc_to_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint8 *owns_callsite) { if (ctx->arg_flags) { *owns_callsite = 1; return MVM_args_copy_callsite(tc, ctx); } else { *owns_callsite = 0; return ctx->callsite; } } /* Puts the args passed to the specified frame into the current use_capture. */ MVMObject * MVM_args_use_capture(MVMThreadContext *tc, MVMFrame *f) { MVMCallCapture *capture = (MVMCallCapture *)tc->cur_usecapture; if (capture->body.use_mode_frame) MVM_frame_dec_ref(tc, capture->body.use_mode_frame); capture->body.mode = MVM_CALL_CAPTURE_MODE_USE; capture->body.use_mode_frame = MVM_frame_inc_ref(tc, f); capture->body.apc = &f->params; capture->body.effective_callsite = MVM_args_proc_to_callsite(tc, &f->params, &capture->body.owns_callsite); return tc->cur_usecapture; } MVMObject * MVM_args_save_capture(MVMThreadContext *tc, MVMFrame *frame) { MVMObject *cc_obj = MVM_repr_alloc_init(tc, tc->instance->CallCapture); MVMCallCapture *cc = (MVMCallCapture *)cc_obj; /* Copy the arguments. */ MVMuint32 arg_size = frame->params.arg_count * sizeof(MVMRegister); MVMRegister *args = MVM_malloc(arg_size); memcpy(args, frame->params.args, arg_size); /* Create effective callsite. */ cc->body.effective_callsite = MVM_args_proc_to_callsite(tc, &frame->params, &cc->body.owns_callsite); /* Set up the call capture. */ cc->body.mode = MVM_CALL_CAPTURE_MODE_SAVE; cc->body.apc = MVM_malloc(sizeof(MVMArgProcContext)); memset(cc->body.apc, 0, sizeof(MVMArgProcContext)); MVM_args_proc_init(tc, cc->body.apc, cc->body.effective_callsite, args); return cc_obj; } MVMCallsite * MVM_args_prepare(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 callsite_idx) { /* Look up callsite. */ MVMCallsite * cs = cu->body.callsites[callsite_idx]; /* Also need to store it in cur_frame to make sure that * the GC knows how to walk the args buffer, and must * clear it in case we trigger GC while setting it up. */ tc->cur_frame->cur_args_callsite = cs; memset(tc->cur_frame->args, 0, sizeof(MVMRegister) * cu->body.max_callsite_size); return cs; } static void flatten_args(MVMThreadContext *tc, MVMArgProcContext *ctx); /* Checks that the passed arguments fall within the expected arity. */ static void arity_fail(MVMThreadContext *tc, MVMuint16 got, MVMuint16 min, MVMuint16 max) { char *problem = got > max ? "Too many" : "Too few"; if (min == max) MVM_exception_throw_adhoc(tc, "%s positionals passed; expected %d argument%s but got %d", problem, min, (min == 1 ? "" : "s"), got); else if (max == 0xFFFF) MVM_exception_throw_adhoc(tc, "%s positionals passed; expected at least %d arguments but got only %d", problem, min, got); else MVM_exception_throw_adhoc(tc, "%s positionals passed; expected %d %s %d arguments but got %d", problem, min, (min + 1 == max ? "or" : "to"), max, got); } void MVM_args_checkarity(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 min, MVMuint16 max) { MVMuint16 num_pos; flatten_args(tc, ctx); num_pos = ctx->num_pos; if (num_pos < min || num_pos > max) arity_fail(tc, num_pos, min, max); } /* Get positional arguments. */ #define find_pos_arg(ctx, pos, result) do { \ if (pos < ctx->num_pos) { \ result.arg = ctx->args[pos]; \ result.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[pos]; \ result.exists = 1; \ } \ else { \ result.arg.s = NULL; \ result.exists = 0; \ } \ } while (0) static MVMObject * decont_arg(MVMThreadContext *tc, MVMObject *arg) { MVMContainerSpec const *contspec = STABLE(arg)->container_spec; if (contspec) { if (contspec->fetch_never_invokes) { MVMRegister r; contspec->fetch(tc, arg, &r); return r.o; } else { MVM_exception_throw_adhoc(tc, "Cannot auto-decontainerize argument"); } } else { return arg; } } #define autounbox(tc, type_flag, expected, result) do { \ if (result.exists && !(result.flags & type_flag)) { \ if (result.flags & MVM_CALLSITE_ARG_OBJ) { \ MVMObject *obj = decont_arg(tc, result.arg.o); \ switch (type_flag) { \ case MVM_CALLSITE_ARG_INT: \ result.arg.i64 = MVM_repr_get_int(tc, obj); \ result.flags = MVM_CALLSITE_ARG_INT; \ break; \ case MVM_CALLSITE_ARG_NUM: \ result.arg.n64 = MVM_repr_get_num(tc, obj); \ result.flags = MVM_CALLSITE_ARG_NUM; \ break; \ case MVM_CALLSITE_ARG_STR: \ result.arg.s = MVM_repr_get_str(tc, obj); \ result.flags = MVM_CALLSITE_ARG_STR; \ break; \ default: \ MVM_exception_throw_adhoc(tc, "Failed to unbox object to " expected); \ } \ } \ if (!(result.flags & type_flag)) { \ switch (type_flag) { \ case MVM_CALLSITE_ARG_INT: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_NUM: \ MVM_exception_throw_adhoc(tc, "Expected native int argument, but got num"); \ case MVM_CALLSITE_ARG_STR: \ MVM_exception_throw_adhoc(tc, "Expected native int argument, but got str"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 1"); \ } \ break; \ case MVM_CALLSITE_ARG_NUM: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_INT: \ MVM_exception_throw_adhoc(tc, "Expected native num argument, but got int"); \ case MVM_CALLSITE_ARG_STR: \ MVM_exception_throw_adhoc(tc, "Expected native num argument, but got str"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 2"); \ } \ break; \ case MVM_CALLSITE_ARG_STR: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_INT: \ MVM_exception_throw_adhoc(tc, "Expected native str argument, but got int"); \ case MVM_CALLSITE_ARG_NUM: \ MVM_exception_throw_adhoc(tc, "Expected native str argument, but got num"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 3"); \ } \ break; \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 4"); \ } \ } \ } \ } while (0) #define args_get_pos(tc, ctx, pos, required, result) do { \ find_pos_arg(ctx, pos, result); \ if (!result.exists && required) { \ MVM_exception_throw_adhoc(tc, "Not enough positional arguments; needed at least %u", pos + 1); \ } \ } while (0) #define autobox(tc, target, result, box_type_obj, is_object, set_func, dest) do { \ MVMObject *box, *box_type; \ if (is_object) MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); \ box_type = target->static_info->body.cu->body.hll_config->box_type_obj; \ box = REPR(box_type)->allocate(tc, STABLE(box_type)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, OBJECT_BODY(box), result); \ if (is_object) MVM_gc_root_temp_pop_n(tc, 2); \ else MVM_gc_root_temp_pop(tc); \ dest = box; \ } while (0) #define autobox_int(tc, target, result, dest) do { \ MVMObject *box, *box_type; \ MVMint64 result_int = result; \ box_type = target->static_info->body.cu->body.hll_config->int_box_type; \ dest = MVM_intcache_get(tc, box_type, result_int); \ if (!dest) { \ box = REPR(box_type)->allocate(tc, STABLE(box_type)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_int(tc, STABLE(box), box, OBJECT_BODY(box), result_int); \ MVM_gc_root_temp_pop(tc); \ dest = box; \ } \ } while (0) #define autobox_switch(tc, result) do { \ if (result.exists) { \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_OBJ: \ break; \ case MVM_CALLSITE_ARG_INT: \ autobox_int(tc, tc->cur_frame, result.arg.i64, result.arg.o); \ break; \ case MVM_CALLSITE_ARG_NUM: \ autobox(tc, tc->cur_frame, result.arg.n64, num_box_type, 0, set_num, result.arg.o); \ break; \ case MVM_CALLSITE_ARG_STR: \ autobox(tc, tc->cur_frame, result.arg.s, str_box_type, 1, set_str, result.arg.o); \ break; \ default: \ MVM_exception_throw_adhoc(tc, "invalid type flag"); \ } \ } \ } while (0) MVMArgInfo MVM_args_get_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autobox_switch(tc, result); return result; } MVMArgInfo MVM_args_get_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autounbox(tc, MVM_CALLSITE_ARG_INT, "integer", result); return result; } MVMArgInfo MVM_args_get_pos_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autounbox(tc, MVM_CALLSITE_ARG_NUM, "number", result); return result; } MVMArgInfo MVM_args_get_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autounbox(tc, MVM_CALLSITE_ARG_STR, "string", result); return result; } #define args_get_named(tc, ctx, name, required, _type) do { \ \ MVMuint32 flag_pos, arg_pos; \ result.arg.s = NULL; \ result.exists = 0; \ \ for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) { \ if (MVM_string_equal(tc, ctx->args[arg_pos].s, name)) { \ if (ctx->named_used[(arg_pos - ctx->num_pos)/2]) { \ char *c_name = MVM_string_utf8_encode_C_string(tc, name); \ char *waste[] = { c_name, NULL }; \ MVM_exception_throw_adhoc_free(tc, waste, "Named argument '%s' already used", c_name); \ } \ result.arg = ctx->args[arg_pos + 1]; \ result.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[flag_pos]; \ result.exists = 1; \ ctx->named_used[(arg_pos - ctx->num_pos)/2] = 1; \ break; \ } \ } \ if (!result.exists && required) { \ char *c_name = MVM_string_utf8_encode_C_string(tc, name); \ char *waste[] = { c_name, NULL }; \ MVM_exception_throw_adhoc_free(tc, waste, "Required named parameter '%s' not passed", c_name); \ } \ } while (0) MVMArgInfo MVM_args_get_named_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required, "object"); autobox_switch(tc, result); return result; } MVMArgInfo MVM_args_get_named_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required, "integer"); autounbox(tc, MVM_CALLSITE_ARG_INT, "integer", result); return result; } MVMArgInfo MVM_args_get_named_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required, "number"); autounbox(tc, MVM_CALLSITE_ARG_NUM, "number", result); return result; } MVMArgInfo MVM_args_get_named_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required, "string"); autounbox(tc, MVM_CALLSITE_ARG_STR, "string", result); return result; } MVMint64 MVM_args_has_named(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name) { MVMuint32 flag_pos, arg_pos; for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) if (MVM_string_equal(tc, ctx->args[arg_pos].s, name)) return 1; return 0; } void MVM_args_assert_nameds_used(MVMThreadContext *tc, MVMArgProcContext *ctx) { if (ctx->named_used) { MVMuint16 size = (ctx->arg_count - ctx->num_pos) / 2; MVMuint16 i; for (i = 0; i < size; i++) if (!ctx->named_used[i]) { char *c_param = MVM_string_utf8_encode_C_string(tc, ctx->args[ctx->num_pos + 2 * i].s); char *waste[] = { c_param, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unexpected named parameter '%s' passed", c_param); } } } /* Result setting. The frameless flag indicates that the currently * executing code does not have a MVMFrame of its own. */ static MVMObject * decont_result(MVMThreadContext *tc, MVMObject *result) { MVMContainerSpec const *contspec = STABLE(result)->container_spec; if (contspec) { if (contspec->fetch_never_invokes) { MVMRegister r; contspec->fetch(tc, result, &r); return r.o; } else { MVM_exception_throw_adhoc(tc, "Cannot auto-decontainerize return value"); } } else { return result; } } void MVM_args_set_result_obj(MVMThreadContext *tc, MVMObject *result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_OBJ: target->return_value->o = result; break; case MVM_RETURN_INT: target->return_value->i64 = MVM_repr_get_int(tc, decont_result(tc, result)); break; case MVM_RETURN_NUM: target->return_value->n64 = MVM_repr_get_num(tc, decont_result(tc, result)); break; case MVM_RETURN_STR: target->return_value->s = MVM_repr_get_str(tc, decont_result(tc, result)); break; default: MVM_exception_throw_adhoc(tc, "Result return coercion from obj NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_int(MVMThreadContext *tc, MVMint64 result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_INT: target->return_value->i64 = result; break; case MVM_RETURN_NUM: target->return_value->n64 = (MVMnum64)result; break; case MVM_RETURN_OBJ: { autobox(tc, target, result, int_box_type, 0, set_int, target->return_value->o); break; } default: MVM_exception_throw_adhoc(tc, "Result return coercion from int NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_num(MVMThreadContext *tc, MVMnum64 result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_NUM: target->return_value->n64 = result; break; case MVM_RETURN_INT: target->return_value->i64 = (MVMint64)result; break; case MVM_RETURN_OBJ: { autobox(tc, target, result, num_box_type, 0, set_num, target->return_value->o); break; } default: MVM_exception_throw_adhoc(tc, "Result return coercion from num NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_str(MVMThreadContext *tc, MVMString *result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_STR: target->return_value->s = result; break; case MVM_RETURN_OBJ: { autobox(tc, target, result, str_box_type, 1, set_str, target->return_value->o); break; } default: MVM_exception_throw_adhoc(tc, "Result return coercion from str NYI; expects type %u", target->return_type); } } } void MVM_args_assert_void_return_ok(MVMThreadContext *tc, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target && target->return_type != MVM_RETURN_VOID && tc->cur_frame != tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Void return not allowed to context requiring a return value"); } #define box_slurpy_pos(tc, type, result, box, value, reg, box_type_obj, name, set_func) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ reg.o = box; \ REPR(result)->pos_funcs.push(tc, STABLE(result), result, \ OBJECT_BODY(result), reg, MVM_reg_obj); \ } while (0) #define box_slurpy_pos_int(tc, type, result, box, value, reg, box_type_obj, name, set_func) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = MVM_intcache_get(tc, type, value); \ if (!box) { \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ } \ reg.o = box; \ REPR(result)->pos_funcs.push(tc, STABLE(result), result, \ OBJECT_BODY(result), reg, MVM_reg_obj); \ } while (0) MVMObject * MVM_args_slurpy_positional(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 pos) { MVMObject *type = (*(tc->interp_cu))->body.hll_config->slurpy_array_type, *result = NULL, *box = NULL; MVMArgInfo arg_info; MVMRegister reg; if (!type || IS_CONCRETE(type)) { MVM_exception_throw_adhoc(tc, "Missing hll slurpy array type"); } MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); result = REPR(type)->allocate(tc, STABLE(type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); find_pos_arg(ctx, pos, arg_info); pos++; while (arg_info.exists) { if (arg_info.flags & MVM_CALLSITE_ARG_FLAT) { MVM_exception_throw_adhoc(tc, "Arg has not been flattened in slurpy_positional"); } /* XXX theoretically needs to handle native arrays I guess */ switch (arg_info.flags & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_OBJ: { MVM_repr_push_o(tc, result, arg_info.arg.o); break; } case MVM_CALLSITE_ARG_INT:{ box_slurpy_pos_int(tc, type, result, box, arg_info.arg.i64, reg, int_box_type, "int", set_int); break; } case MVM_CALLSITE_ARG_NUM: { box_slurpy_pos(tc, type, result, box, arg_info.arg.n64, reg, num_box_type, "num", set_num); break; } case MVM_CALLSITE_ARG_STR: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&arg_info.arg.s); box_slurpy_pos(tc, type, result, box, arg_info.arg.s, reg, str_box_type, "str", set_str); MVM_gc_root_temp_pop(tc); break; } default: MVM_exception_throw_adhoc(tc, "arg flag is empty in slurpy positional"); } find_pos_arg(ctx, pos, arg_info); pos++; if (pos == 1) break; /* overflow?! */ } MVM_gc_root_temp_pop_n(tc, 3); return result; } #define box_slurpy_named(tc, type, result, box, value, reg, box_type_obj, name, set_func, key) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ reg.o = box; \ REPR(result)->ass_funcs.bind_key(tc, STABLE(result), result, \ OBJECT_BODY(result), (MVMObject *)key, reg, MVM_reg_obj); \ } while (0) MVMObject * MVM_args_slurpy_named(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMObject *type = (*(tc->interp_cu))->body.hll_config->slurpy_hash_type, *result = NULL, *box = NULL; MVMArgInfo arg_info; MVMuint32 flag_pos, arg_pos; MVMRegister reg; arg_info.exists = 0; if (!type || IS_CONCRETE(type)) { MVM_exception_throw_adhoc(tc, "Missing hll slurpy hash type"); } result = REPR(type)->allocate(tc, STABLE(type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) { MVMString *key; if (ctx->named_used[flag_pos - ctx->num_pos]) continue; key = ctx->args[arg_pos].s; if (!key || !IS_CONCRETE(key)) { MVM_exception_throw_adhoc(tc, "slurpy hash needs concrete key"); } arg_info.arg = ctx->args[arg_pos + 1]; arg_info.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[flag_pos]; arg_info.exists = 1; if (arg_info.flags & MVM_CALLSITE_ARG_FLAT) { MVM_exception_throw_adhoc(tc, "Arg has not been flattened in slurpy_named"); } switch (arg_info.flags & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_OBJ: { REPR(result)->ass_funcs.bind_key(tc, STABLE(result), result, OBJECT_BODY(result), (MVMObject *)key, arg_info.arg, MVM_reg_obj); break; } case MVM_CALLSITE_ARG_INT: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); box_slurpy_named(tc, type, result, box, arg_info.arg.i64, reg, int_box_type, "int", set_int, key); MVM_gc_root_temp_pop(tc); break; } case MVM_CALLSITE_ARG_NUM: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); box_slurpy_named(tc, type, result, box, arg_info.arg.n64, reg, num_box_type, "num", set_num, key); MVM_gc_root_temp_pop(tc); break; } case MVM_CALLSITE_ARG_STR: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); MVM_gc_root_temp_push(tc, (MVMCollectable **)&arg_info.arg.s); box_slurpy_named(tc, type, result, box, arg_info.arg.s, reg, str_box_type, "str", set_str, key); MVM_gc_root_temp_pop_n(tc, 2); break; } default: MVM_exception_throw_adhoc(tc, "arg flag is empty in slurpy named"); } } MVM_gc_root_temp_pop_n(tc, 2); return result; } static MVMint32 seen_name(MVMThreadContext *tc, MVMString *name, MVMRegister *new_args, MVMint32 first_named, MVMint32 num_new_args) { MVMint32 j; for (j = first_named; j < num_new_args; j += 2) if (MVM_string_equal(tc, new_args[j].s, name)) return 1; return 0; } static void flatten_args(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMArgInfo arg_info; MVMint32 flag_pos = 0, arg_pos = 0, new_arg_pos = 0, new_arg_flags_size = ctx->arg_count > 0x7FFF ? ctx->arg_count : ctx->arg_count * 2, new_args_size = new_arg_flags_size, i, new_flag_pos = 0, new_num_pos = 0; MVMCallsiteEntry *new_arg_flags; MVMRegister *new_args; if (!ctx->callsite->has_flattening) return; new_arg_flags = MVM_malloc(new_arg_flags_size * sizeof(MVMCallsiteEntry)); new_args = MVM_malloc(new_args_size * sizeof(MVMRegister)); /* First flatten any positionals in amongst any non-flattening * positionals. */ for ( ; arg_pos < ctx->num_pos; arg_pos++) { arg_info.arg = ctx->args[arg_pos]; arg_info.flags = ctx->callsite->arg_flags[arg_pos]; arg_info.exists = 1; /* Skip it if it's not flattening or is null. The bytecode loader * verifies it's a MVM_CALLSITE_ARG_OBJ. */ if ((arg_info.flags & MVM_CALLSITE_ARG_FLAT) && arg_info.arg.o) { MVMObject *list = arg_info.arg.o; MVMint64 count = REPR(list)->elems(tc, STABLE(list), list, OBJECT_BODY(list)); MVMStorageSpec lss = REPR(list)->pos_funcs.get_elem_storage_spec(tc, STABLE(list)); if ((MVMint64)new_arg_pos + count > 0xFFFF) { MVM_exception_throw_adhoc(tc, "Too many arguments in flattening array."); } for (i = 0; i < count; i++) { if (new_arg_pos == new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } switch (lss.inlineable ? lss.boxed_primitive : 0) { case MVM_STORAGE_SPEC_BP_INT: (new_args + new_arg_pos++)->i64 = MVM_repr_at_pos_i(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_INT; break; case MVM_STORAGE_SPEC_BP_NUM: (new_args + new_arg_pos++)->n64 = MVM_repr_at_pos_n(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_NUM; break; case MVM_STORAGE_SPEC_BP_STR: (new_args + new_arg_pos++)->s = MVM_repr_at_pos_s(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_STR; break; default: (new_args + new_arg_pos++)->o = MVM_repr_at_pos_o(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_OBJ; break; } } } else { if (new_arg_pos == new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } *(new_args + new_arg_pos++) = arg_info.arg; new_arg_flags[new_flag_pos++] = arg_info.flags; } } new_num_pos = new_arg_pos; /* Then flatten in any nameds, amongst non-flattening nameds, starting * from the right and skipping duplicates. */ flag_pos = ctx->callsite->flag_count; arg_pos = ctx->arg_count; while (flag_pos > ctx->num_pos) { flag_pos--; if (ctx->callsite->arg_flags[flag_pos] & MVM_CALLSITE_ARG_FLAT_NAMED) { arg_info.flags = ctx->callsite->arg_flags[flag_pos]; arg_pos--; arg_info.arg = ctx->args[arg_pos]; if (arg_info.arg.o && REPR(arg_info.arg.o)->ID == MVM_REPR_ID_MVMHash) { MVMHashBody *body = &((MVMHash *)arg_info.arg.o)->body; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVMString *arg_name = (MVMString *)current->key; if (!seen_name(tc, arg_name, new_args, new_num_pos, new_arg_pos)) { if (new_arg_pos + 1 >= new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } (new_args + new_arg_pos++)->s = arg_name; (new_args + new_arg_pos++)->o = current->value; new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_NAMED | MVM_CALLSITE_ARG_OBJ; } } } else if (arg_info.arg.o) { MVM_exception_throw_adhoc(tc, "flattening of other hash reprs NYI."); } } else { arg_pos -= 2; if (!seen_name(tc, (ctx->args + arg_pos)->s, new_args, new_num_pos, new_arg_pos)) { if (new_arg_pos + 1 >= new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } (new_args + new_arg_pos++)->s = (ctx->args + arg_pos)->s; *(new_args + new_arg_pos++) = *(ctx->args + arg_pos + 1); new_arg_flags[new_flag_pos++] = ctx->callsite->arg_flags[flag_pos]; } } } init_named_used(tc, ctx, (new_arg_pos - new_num_pos) / 2); ctx->args = new_args; ctx->arg_count = new_arg_pos; ctx->num_pos = new_num_pos; ctx->arg_flags = new_arg_flags; ctx->flag_count = new_flag_pos; } /* Does the common setup work when we jump the interpreter into a chosen * call from C-land. */ void MVM_args_setup_thunk(MVMThreadContext *tc, MVMRegister *res_reg, MVMReturnType return_type, MVMCallsite *callsite) { MVMFrame *cur_frame = tc->cur_frame; cur_frame->return_value = res_reg; cur_frame->return_type = return_type; cur_frame->return_address = *(tc->interp_cur_op); cur_frame->cur_args_callsite = callsite; } /* Custom bind failure handling. Invokes the HLL's bind failure handler, with * an argument capture */ static void bind_error_return(MVMThreadContext *tc, void *sr_data) { MVMRegister *r = (MVMRegister *)sr_data; MVMObject *res = r->o; MVM_free(r); if (tc->cur_frame->caller) MVM_args_set_result_obj(tc, res, 0); else MVM_exception_throw_adhoc(tc, "No caller to return to after bind_error"); MVM_frame_try_return(tc); } static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { MVMRegister *r = (MVMRegister *)frame->special_return_data; MVM_gc_worklist_add(tc, worklist, &r->o); } void MVM_args_bind_failed(MVMThreadContext *tc) { MVMObject *bind_error; MVMRegister *res; MVMCallsite *inv_arg_callsite; MVMFrame *cur_frame = tc->cur_frame; /* Create a new call capture object. */ MVMObject *cc_obj = MVM_repr_alloc_init(tc, tc->instance->CallCapture); MVMCallCapture *cc = (MVMCallCapture *)cc_obj; /* Copy the arguments. */ MVMuint32 arg_size = tc->cur_frame->params.arg_count * sizeof(MVMRegister); MVMRegister *args = MVM_malloc(arg_size); memcpy(args, tc->cur_frame->params.args, arg_size); /* Create effective callsite. */ cc->body.effective_callsite = MVM_args_proc_to_callsite(tc, &tc->cur_frame->params, &cc->body.owns_callsite); /* Set up the call capture. */ cc->body.mode = MVM_CALL_CAPTURE_MODE_SAVE; cc->body.apc = MVM_malloc(sizeof(MVMArgProcContext)); memset(cc->body.apc, 0, sizeof(MVMArgProcContext)); MVM_args_proc_init(tc, cc->body.apc, cc->body.effective_callsite, args); /* Invoke the HLL's bind failure handler. */ bind_error = MVM_hll_current(tc)->bind_error; if (!bind_error) MVM_exception_throw_adhoc(tc, "Bind error occurred, but HLL has no handler"); bind_error = MVM_frame_find_invokee(tc, bind_error, NULL); res = MVM_calloc(1, sizeof(MVMRegister)); inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, inv_arg_callsite); cur_frame->special_return = bind_error_return; cur_frame->special_return_data = res; cur_frame->mark_special_return_data = mark_sr_data; cur_frame->args[0].o = cc_obj; STABLE(bind_error)->invoke(tc, bind_error, inv_arg_callsite, cur_frame->args); } MoarVM-2015.11/src/core/args.h0000644000175000017500000001100312623370227014673 0ustar jnthnjnthn/* Argument processing context. */ struct MVMArgProcContext { /* The callsite we're processing. */ MVMCallsite *callsite; /* The set of flags (only set if we flattened, otherwise we use the ones * from callsite). */ MVMCallsiteEntry *arg_flags; /* The arguments. */ MVMRegister *args; /* Bytemap of indexes of used nameds, so the * named slurpy knows which ones not to grab. * XXX cache and free this at the proper times. */ MVMuint8 *named_used; MVMuint16 named_used_size; /* The total argument count (including 2 for each * named arg). */ MVMuint16 arg_count; /* Number of positionals. */ MVMuint16 num_pos; /* The number of arg flags; only valid if arg_flags isn't NULL. */ MVMuint16 flag_count; }; /* Expected return type flags. */ typedef enum { /* Argument is an object. */ MVM_RETURN_VOID = 0, /* Argument is an object. */ MVM_RETURN_OBJ = 1, /* Argument is a native integer, signed. */ MVM_RETURN_INT = 2, /* Argument is a native floating point number. */ MVM_RETURN_NUM = 4, /* Argument is a native NFG string (MVMString REPR). */ MVM_RETURN_STR = 8, } MVMReturnType; /* Struct used for returning information about an argument. */ struct MVMArgInfo { MVMRegister arg; MVMCallsiteEntry flags; MVMuint8 exists; }; /* Argument processing context handling. */ void MVM_args_proc_init(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMCallsite *callsite, MVMRegister *args); void MVM_args_proc_cleanup_for_cache(MVMThreadContext *tc, MVMArgProcContext *ctx); void MVM_args_proc_cleanup(MVMThreadContext *tc, MVMArgProcContext *ctx); void MVM_args_checkarity(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 min, MVMuint16 max); void MVM_args_checkarity_for_jit(MVMThreadContext *tc, MVMuint16 min, MVMuint16 max); MVMCallsite * MVM_args_copy_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx); MVMCallsite * MVM_args_proc_to_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint8 *owns_callsite); MVMCallsite * MVM_args_prepare(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 callsite_idx); MVM_PUBLIC MVMObject * MVM_args_use_capture(MVMThreadContext *tc, MVMFrame *f); MVM_PUBLIC MVMObject * MVM_args_save_capture(MVMThreadContext *tc, MVMFrame *f); /* Argument access by position. */ MVMArgInfo MVM_args_get_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMArgInfo MVM_args_get_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMArgInfo MVM_args_get_pos_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMArgInfo MVM_args_get_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMObject * MVM_args_slurpy_positional(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 pos); /* Argument access by name. */ MVMArgInfo MVM_args_get_named_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMObject * MVM_args_slurpy_named(MVMThreadContext *tc, MVMArgProcContext *ctx); MVMint64 MVM_args_has_named(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name); void MVM_args_assert_nameds_used(MVMThreadContext *tc, MVMArgProcContext *ctx); /* Result setting. */ void MVM_args_set_result_obj(MVMThreadContext *tc, MVMObject *result, MVMint32 frameless); void MVM_args_set_result_int(MVMThreadContext *tc, MVMint64 result, MVMint32 frameless); void MVM_args_set_result_num(MVMThreadContext *tc, MVMnum64 result, MVMint32 frameless); void MVM_args_set_result_str(MVMThreadContext *tc, MVMString *result, MVMint32 frameless); void MVM_args_assert_void_return_ok(MVMThreadContext *tc, MVMint32 frameless); /* Setting up calls from C-land. */ MVM_PUBLIC void MVM_args_setup_thunk(MVMThreadContext *tc, MVMRegister *return_value, MVMReturnType return_type, MVMCallsite *callsite); /* Custom bind failure handling. */ void MVM_args_bind_failed(MVMThreadContext *tc); /* Result setting frame constants. */ #define MVM_RETURN_CALLER_FRAME 0 #define MVM_RETURN_CURRENT_FRAME 1 /* Required/optional constants. */ #define MVM_ARG_OPTIONAL 0 #define MVM_ARG_REQUIRED 1 MoarVM-2015.11/src/core/bytecode.c0000644000175000017500000010560312623370227015542 0ustar jnthnjnthn#include "moar.h" /* Some constants. */ #define HEADER_SIZE 92 #define MIN_BYTECODE_VERSION 5 #define MAX_BYTECODE_VERSION 5 #define FRAME_HEADER_SIZE (11 * 4 + 3 * 2) #define FRAME_HANDLER_SIZE (4 * 4 + 2 * 2) #define FRAME_SLV_SIZE (2 * 2 + 2 * 4) #define SCDEP_HEADER_OFFSET 12 #define EXTOP_HEADER_OFFSET 20 #define FRAME_HEADER_OFFSET 28 #define CALLSITE_HEADER_OFFSET 36 #define STRING_HEADER_OFFSET 44 #define SCDATA_HEADER_OFFSET 52 #define BYTECODE_HEADER_OFFSET 60 #define ANNOTATION_HEADER_OFFSET 68 #define HLL_NAME_HEADER_OFFSET 76 #define SPECIAL_FRAME_HEADER_OFFSET 80 /* Frame flags. */ #define FRAME_FLAG_EXIT_HANDLER 1 #define FRAME_FLAG_IS_THUNK 2 /* Describes the current reader state. */ typedef struct { /* General info. */ MVMuint32 version; /* The string heap. */ MVMuint8 *string_seg; MVMuint32 expected_strings; /* The SC dependencies segment. */ MVMuint32 expected_scs; MVMuint8 *sc_seg; /* The extension ops segment. */ MVMuint8 *extop_seg; MVMuint32 expected_extops; /* The frame segment. */ MVMuint32 expected_frames; MVMuint8 *frame_seg; MVMuint16 *frame_outer_fixups; /* The callsites segment. */ MVMuint8 *callsite_seg; MVMuint32 expected_callsites; /* The bytecode segment. */ MVMuint32 bytecode_size; MVMuint8 *bytecode_seg; /* The annotations segment */ MVMuint8 *annotation_seg; MVMuint32 annotation_size; /* HLL name string index */ MVMuint32 hll_str_idx; /* The limit we can not read beyond. */ MVMuint8 *read_limit; /* Special frame indexes */ MVMuint32 main_frame; MVMuint32 load_frame; MVMuint32 deserialize_frame; } ReaderState; /* copies memory dependent on endianness */ static void memcpy_endian(void *dest, MVMuint8 *src, size_t size) { #ifdef MVM_BIGENDIAN size_t i; MVMuint8 *destbytes = (MVMuint8 *)dest; for (i = 0; i < size; i++) destbytes[size - i - 1] = src[i]; #else memcpy(dest, src, size); #endif } /* Reads a uint32 from a buffer. */ static MVMuint32 read_int32(MVMuint8 *buffer, size_t offset) { MVMuint32 value; memcpy_endian(&value, buffer + offset, 4); return value; } /* Reads an uint16 from a buffer. */ static MVMuint16 read_int16(MVMuint8 *buffer, size_t offset) { MVMuint16 value; memcpy_endian(&value, buffer + offset, 2); return value; } /* Reads an uint8 from a buffer. */ static MVMuint8 read_int8(MVMuint8 *buffer, size_t offset) { return buffer[offset]; } /* Cleans up reader state. */ static void cleanup_all(MVMThreadContext *tc, ReaderState *rs) { if (rs->frame_outer_fixups) { MVM_free(rs->frame_outer_fixups); rs->frame_outer_fixups = NULL; } MVM_free(rs); } /* Ensures we can read a certain amount of bytes without overrunning the end * of the stream. */ MVM_STATIC_INLINE void ensure_can_read(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs, MVMuint8 *pos, MVMuint32 size) { if (pos + size > rs->read_limit) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Read past end of bytecode stream"); } } /* Reads a string index, looks up the string and returns it. Bounds * checks the string heap index too. */ static MVMString * get_heap_string(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs, MVMuint8 *buffer, size_t offset) { MVMCompUnitBody *cu_body = &cu->body; MVMuint32 heap_index = read_int32(buffer, offset); if (heap_index >= cu_body->num_strings) { if (rs) cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } return cu_body->strings[heap_index]; } /* Dissects the bytecode stream and hands back a reader pointing to the * various parts of it. */ static ReaderState * dissect_bytecode(MVMThreadContext *tc, MVMCompUnit *cu) { MVMCompUnitBody *cu_body = &cu->body; ReaderState *rs = NULL; MVMuint32 version, offset, size; /* Sanity checks. */ if (cu_body->data_size < HEADER_SIZE) MVM_exception_throw_adhoc(tc, "Bytecode stream shorter than header"); if (memcmp(cu_body->data_start, "MOARVM\r\n", 8) != 0) MVM_exception_throw_adhoc(tc, "Bytecode stream corrupt (missing magic string)"); version = read_int32(cu_body->data_start, 8); if (version < MIN_BYTECODE_VERSION) MVM_exception_throw_adhoc(tc, "Bytecode stream version too low"); if (version > MAX_BYTECODE_VERSION) MVM_exception_throw_adhoc(tc, "Bytecode stream version too high"); /* Allocate reader state. */ rs = MVM_malloc(sizeof(ReaderState)); memset(rs, 0, sizeof(ReaderState)); rs->version = version; rs->read_limit = cu_body->data_start + cu_body->data_size; cu->body.bytecode_version = version; /* Locate SC dependencies segment. */ offset = read_int32(cu_body->data_start, SCDEP_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Serialization contexts segment starts after end of stream"); } rs->sc_seg = cu_body->data_start + offset; rs->expected_scs = read_int32(cu_body->data_start, SCDEP_HEADER_OFFSET + 4); /* Locate extension ops segment. */ offset = read_int32(cu_body->data_start, EXTOP_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Extension ops segment starts after end of stream"); } rs->extop_seg = cu_body->data_start + offset; rs->expected_extops = read_int32(cu_body->data_start, EXTOP_HEADER_OFFSET + 4); /* Locate frames segment. */ offset = read_int32(cu_body->data_start, FRAME_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frames segment starts after end of stream"); } rs->frame_seg = cu_body->data_start + offset; rs->expected_frames = read_int32(cu_body->data_start, FRAME_HEADER_OFFSET + 4); /* Locate callsites segment. */ offset = read_int32(cu_body->data_start, CALLSITE_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Callsites segment starts after end of stream"); } rs->callsite_seg = cu_body->data_start + offset; rs->expected_callsites = read_int32(cu_body->data_start, CALLSITE_HEADER_OFFSET + 4); /* Locate strings segment. */ offset = read_int32(cu_body->data_start, STRING_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Strings segment starts after end of stream"); } rs->string_seg = cu_body->data_start + offset; rs->expected_strings = read_int32(cu_body->data_start, STRING_HEADER_OFFSET + 4); /* Get SC data, if any. */ offset = read_int32(cu_body->data_start, SCDATA_HEADER_OFFSET); size = read_int32(cu_body->data_start, SCDATA_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Serialized data segment overflows end of stream"); } if (offset) { cu_body->serialized = cu_body->data_start + offset; cu_body->serialized_size = size; } /* Locate bytecode segment. */ offset = read_int32(cu_body->data_start, BYTECODE_HEADER_OFFSET); size = read_int32(cu_body->data_start, BYTECODE_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Bytecode segment overflows end of stream"); } rs->bytecode_seg = cu_body->data_start + offset; rs->bytecode_size = size; /* Locate annotations segment. */ offset = read_int32(cu_body->data_start, ANNOTATION_HEADER_OFFSET); size = read_int32(cu_body->data_start, ANNOTATION_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Annotation segment overflows end of stream"); } rs->annotation_seg = cu_body->data_start + offset; rs->annotation_size = size; /* Locate HLL name */ rs->hll_str_idx = read_int32(cu_body->data_start, HLL_NAME_HEADER_OFFSET); /* Locate special frame indexes. Note, they are 0 for none, and the * index + 1 if there is one. */ rs->main_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET); rs->load_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET + 4); rs->deserialize_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET + 8); if (rs->main_frame > rs->expected_frames || rs->load_frame > rs->expected_frames || rs->deserialize_frame > rs->expected_frames) { MVM_exception_throw_adhoc(tc, "Special frame index out of bounds"); } return rs; } /* Loads the string heap. */ static MVMString ** deserialize_strings(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMString **strings; MVMuint8 *pos; MVMuint32 i, ss; /* Allocate space for strings list. */ if (rs->expected_strings == 0) return NULL; strings = MVM_malloc(sizeof(MVMString *) * rs->expected_strings); /* Load strings. */ pos = rs->string_seg; for (i = 0; i < rs->expected_strings; i++) { MVMint32 decode_utf8 = 1; /* Ensure we can read at least a string size here and do so. */ ensure_can_read(tc, cu, rs, pos, 4); ss = read_int32(pos, 0); pos += 4; /* At high enough bytecode file versions, the LSB on this number * is 1 if we should decode as UTF-8, and 0 if Latin-1 will do. */ if (rs->version >= 5) { decode_utf8 = ss & 1; ss = ss >> 1; } /* Ensure we can read in the string of this size, and decode * it if so. */ ensure_can_read(tc, cu, rs, pos, ss); MVM_ASSIGN_REF(tc, &(cu->common.header), strings[i], decode_utf8 ? MVM_string_utf8_decode(tc, tc->instance->VMString, (char *)pos, ss) : MVM_string_latin1_decode(tc, tc->instance->VMString, (char *)pos, ss)); pos += ss; /* Add alignment. */ pos += ss & 3 ? 4 - (ss & 3) : 0; } return strings; } /* Loads the SC dependencies list. */ static void deserialize_sc_deps(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMCompUnitBody *cu_body = &cu->body; MVMuint32 i, sh_idx; MVMuint8 *pos; /* Allocate SC lists in compilation unit. */ cu_body->scs = MVM_malloc(rs->expected_scs * sizeof(MVMSerializationContext *)); cu_body->scs_to_resolve = MVM_malloc(rs->expected_scs * sizeof(MVMSerializationContextBody *)); cu_body->sc_handle_idxs = MVM_malloc(rs->expected_scs * sizeof(MVMint32)); cu_body->num_scs = rs->expected_scs; /* Resolve all the things. */ pos = rs->sc_seg; for (i = 0; i < rs->expected_scs; i++) { MVMSerializationContextBody *scb; MVMString *handle; /* Grab string heap index. */ ensure_can_read(tc, cu, rs, pos, 4); sh_idx = read_int32(pos, 0); pos += 4; /* Resolve to string. */ if (sh_idx >= cu_body->num_strings) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } cu_body->sc_handle_idxs[i] = sh_idx; handle = cu_body->strings[sh_idx]; /* See if we can resolve it. */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_string_flatten(tc, handle); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); if (scb && scb->sc) { cu_body->scs_to_resolve[i] = NULL; MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->scs[i], scb->sc); } else { if (!scb) { scb = MVM_calloc(1, sizeof(MVMSerializationContextBody)); scb->handle = handle; MVM_HASH_BIND(tc, tc->instance->sc_weakhash, handle, scb); MVM_sc_add_all_scs_entry(tc, scb); } cu_body->scs_to_resolve[i] = scb; cu_body->scs[i] = NULL; } uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); } } /* Loads the extension op records. */ static MVMExtOpRecord * deserialize_extop_records(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMExtOpRecord *extops; MVMuint32 num = rs->expected_extops; MVMuint8 *pos; MVMuint32 i; if (num == 0) return NULL; extops = MVM_calloc(num, sizeof *extops); pos = rs->extop_seg; for (i = 0; i < num; i++) { MVMuint32 name_idx; MVMuint16 operand_bytes = 0; MVMuint8 *operand_descriptor = extops[i].operand_descriptor; /* Read name string index. */ ensure_can_read(tc, cu, rs, pos, 4); name_idx = read_int32(pos, 0); pos += 4; /* Lookup name string. */ if (name_idx >= cu->body.num_strings) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } extops[i].name = cu->body.strings[name_idx]; /* Read operand descriptor. */ ensure_can_read(tc, cu, rs, pos, 8); memcpy(operand_descriptor, pos, 8); pos += 8; /* Validate operand descriptor. * TODO: Unify with validation in MVM_ext_register_extop? */ { MVMuint8 j = 0; for(; j < 8; j++) { MVMuint8 flags = operand_descriptor[j]; if (!flags) break; switch (flags & MVM_operand_rw_mask) { case MVM_operand_literal: goto check_literal; case MVM_operand_read_reg: case MVM_operand_write_reg: operand_bytes += 2; goto check_reg; case MVM_operand_read_lex: case MVM_operand_write_lex: operand_bytes += 4; goto check_reg; default: goto fail; } check_literal: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: operand_bytes += 1; continue; case MVM_operand_int16: operand_bytes += 2; continue; case MVM_operand_int32: operand_bytes += 4; continue; case MVM_operand_int64: operand_bytes += 8; continue; case MVM_operand_num32: operand_bytes += 4; continue; case MVM_operand_num64: operand_bytes += 8; continue; case MVM_operand_str: operand_bytes += 2; continue; case MVM_operand_coderef: operand_bytes += 2; continue; case MVM_operand_ins: case MVM_operand_callsite: default: goto fail; } check_reg: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_obj: case MVM_operand_type_var: continue; default: goto fail; } fail: cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Invalid operand descriptor"); } } extops[i].operand_bytes = operand_bytes; } return extops; } /* Loads the static frame information (what locals we have, bytecode offset, * lexicals, etc.) */ static MVMStaticFrame ** deserialize_frames(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMStaticFrame **frames; MVMuint8 *pos; MVMuint32 bytecode_pos, bytecode_size, i, j; /* Allocate frames array. */ if (rs->expected_frames == 0) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Bytecode file must have at least one frame"); } frames = MVM_malloc(sizeof(MVMStaticFrame *) * rs->expected_frames); /* Allocate outer fixup list for frames. */ rs->frame_outer_fixups = MVM_malloc(sizeof(MVMuint16) * rs->expected_frames); /* Load frames. */ pos = rs->frame_seg; for (i = 0; i < rs->expected_frames; i++) { MVMStaticFrame *static_frame; MVMStaticFrameBody *static_frame_body; /* Ensure we can read a frame here. */ ensure_can_read(tc, cu, rs, pos, FRAME_HEADER_SIZE); /* Allocate frame and get/check bytecode start/length. */ static_frame = (MVMStaticFrame *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStaticFrame); MVM_ASSIGN_REF(tc, &(cu->common.header), frames[i], static_frame); static_frame_body = &static_frame->body; bytecode_pos = read_int32(pos, 0); bytecode_size = read_int32(pos, 4); if (bytecode_pos >= rs->bytecode_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame has invalid bytecode start point"); } if (bytecode_pos + bytecode_size > rs->bytecode_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame bytecode overflows bytecode stream"); } static_frame_body->bytecode = rs->bytecode_seg + bytecode_pos; static_frame_body->bytecode_size = bytecode_size; static_frame_body->orig_bytecode = static_frame_body->bytecode; /* Get number of locals and lexicals. */ static_frame_body->num_locals = read_int32(pos, 8); static_frame_body->num_lexicals = read_int32(pos, 12); /* Get compilation unit unique ID and name. */ MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->cuuid, get_heap_string(tc, cu, rs, pos, 16)); MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->name, get_heap_string(tc, cu, rs, pos, 20)); /* Add frame outer fixup to fixup list. */ rs->frame_outer_fixups[i] = read_int16(pos, 24); /* Get annotations details */ { MVMuint32 annot_offset = read_int32(pos, 26); MVMuint32 num_annotations = read_int32(pos, 30); if (annot_offset + num_annotations * 12 > rs->annotation_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame annotation segment overflows bytecode stream"); } static_frame_body->annotations_data = rs->annotation_seg + annot_offset; static_frame_body->num_annotations = num_annotations; } /* Read number of handlers. */ static_frame_body->num_handlers = read_int32(pos, 34); /* Read exit handler flag (version 2 and higher). */ if (rs->version >= 2) { MVMint16 flags = read_int16(pos, 38); static_frame_body->has_exit_handler = flags & FRAME_FLAG_EXIT_HANDLER; static_frame_body->is_thunk = flags & FRAME_FLAG_IS_THUNK; } /* Read code object SC indexes (version 4 and higher). */ if (rs->version >= 4) { static_frame_body->code_obj_sc_dep_idx = read_int32(pos, 42); static_frame_body->code_obj_sc_idx = read_int32(pos, 46); } /* Associate frame with compilation unit. */ MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->cu, cu); /* Stash position for lazy deserialization of the rest. */ static_frame_body->frame_data_pos = pos; /* Skip over the rest, making sure it's readable. */ { MVMuint32 skip = 2 * static_frame_body->num_locals + 6 * static_frame_body->num_lexicals; MVMuint16 slvs = read_int16(pos, 40); pos += FRAME_HEADER_SIZE; ensure_can_read(tc, cu, rs, pos, skip); pos += skip; for (j = 0; j < static_frame_body->num_handlers; j++) { ensure_can_read(tc, cu, rs, pos, FRAME_HANDLER_SIZE); if (read_int32(pos, 8) & MVM_EX_CAT_LABELED) { pos += FRAME_HANDLER_SIZE; ensure_can_read(tc, cu, rs, pos, 2); pos += 2; } else { pos += FRAME_HANDLER_SIZE; } } ensure_can_read(tc, cu, rs, pos, slvs * FRAME_SLV_SIZE); pos += slvs * FRAME_SLV_SIZE; } } /* Fixup outers. */ for (i = 0; i < rs->expected_frames; i++) { if (rs->frame_outer_fixups[i] != i) { if (rs->frame_outer_fixups[i] < rs->expected_frames) { MVM_ASSIGN_REF(tc, &(frames[i]->common.header), frames[i]->body.outer, frames[rs->frame_outer_fixups[i]]); } else { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Invalid frame outer index; cannot fixup"); } } } return frames; } /* Finishes up reading and exploding of a frame. */ void MVM_bytecode_finish_frame(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMint32 dump_only) { MVMuint32 j; MVMuint8 *pos; MVMuint16 slvs; /* Ensure we've not already done this. */ if (sf->body.fully_deserialized) return; /* Acquire the update mutex on the CompUnit. */ MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.update_mutex); /* Ensure no other thread has done this for us in the mean time. */ if (sf->body.fully_deserialized) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); return; } /* Locate start of frame body. */ pos = sf->body.frame_data_pos; /* Get the number of static lex values we'll need to apply. */ slvs = read_int16(pos, 40); /* Skip past header. */ pos += FRAME_HEADER_SIZE; /* Read the local types. */ if (sf->body.num_locals) { sf->body.local_types = MVM_malloc(sizeof(MVMuint16) * sf->body.num_locals); for (j = 0; j < sf->body.num_locals; j++) sf->body.local_types[j] = read_int16(pos, 2 * j); pos += 2 * sf->body.num_locals; } /* Read the lexical types. */ if (sf->body.num_lexicals) { /* Allocate names hash and types list. */ sf->body.lexical_types = MVM_malloc(sizeof(MVMuint16) * sf->body.num_lexicals); /* Read in data. */ if (sf->body.num_lexicals) { sf->body.lexical_names_list = MVM_malloc(sizeof(MVMLexicalRegistry *) * sf->body.num_lexicals); } for (j = 0; j < sf->body.num_lexicals; j++) { MVMString *name = get_heap_string(tc, cu, NULL, pos, 6 * j + 2); MVMLexicalRegistry *entry = MVM_calloc(1, sizeof(MVMLexicalRegistry)); MVM_ASSIGN_REF(tc, &(sf->common.header), entry->key, name); sf->body.lexical_names_list[j] = entry; entry->value = j; sf->body.lexical_types[j] = read_int16(pos, 6 * j); MVM_string_flatten(tc, name); MVM_HASH_BIND(tc, sf->body.lexical_names, name, entry) } pos += 6 * sf->body.num_lexicals; } /* Read in handlers. */ if (sf->body.num_handlers) { /* Allocate space for handler data. */ sf->body.handlers = MVM_malloc(sf->body.num_handlers * sizeof(MVMFrameHandler)); /* Read each handler. */ for (j = 0; j < sf->body.num_handlers; j++) { sf->body.handlers[j].start_offset = read_int32(pos, 0); sf->body.handlers[j].end_offset = read_int32(pos, 4); sf->body.handlers[j].category_mask = read_int32(pos, 8); sf->body.handlers[j].action = read_int16(pos, 12); sf->body.handlers[j].block_reg = read_int16(pos, 14); sf->body.handlers[j].goto_offset = read_int32(pos, 16); pos += FRAME_HANDLER_SIZE; if (sf->body.handlers[j].category_mask & MVM_EX_CAT_LABELED) { sf->body.handlers[j].label_reg = read_int16(pos, 0); pos += 2; } } } /* Allocate default lexical environment storage. */ sf->body.env_size = sf->body.num_lexicals * sizeof(MVMRegister); sf->body.static_env = MVM_calloc(1, sf->body.env_size); sf->body.static_env_flags = MVM_calloc(1, sf->body.num_lexicals); /* Stash static lexical segment offset, so we can easily locate it to * resolve them later. */ sf->body.frame_static_lex_pos = slvs ? pos : NULL; /* Read in static lexical flags. */ for (j = 0; j < slvs; j++) { MVMuint16 lex_idx = read_int16(pos, 0); MVMuint16 flags = read_int16(pos, 2); sf->body.static_env_flags[lex_idx] = flags; if (flags == 2 && !dump_only) { /* State variable; need to resolve wval immediately. Other kinds * can wait. */ MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, read_int32(pos, 4)); if (sc == NULL) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); } MVM_ASSIGN_REF(tc, &(sf->common.header), sf->body.static_env[lex_idx].o, MVM_sc_get_object(tc, sc, read_int32(pos, 8))); } pos += FRAME_SLV_SIZE; } /* Mark the frame fully deserialized. */ sf->body.fully_deserialized = 1; /* Release the update mutex again */ MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); } /* Gets the SC reference for a given static lexical var for * vivification purposes */ MVMuint8 MVM_bytecode_find_static_lexical_scref(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMuint16 index, MVMint32 *sc, MVMint32 *id) { MVMuint16 slvs, i; MVMuint8 *pos = sf->body.frame_static_lex_pos; if (!pos) return 0; slvs = read_int16(sf->body.frame_data_pos, 40); for (i = 0; i < slvs; i++) { if (read_int16(pos, 0) == index) { *sc = read_int32(pos, 4); *id = read_int32(pos, 8); return 1; } pos += FRAME_SLV_SIZE; } return 0; } /* Loads the callsites. */ static MVMCallsite ** deserialize_callsites(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMCallsite **callsites; MVMuint8 *pos; MVMuint32 i, j, elems; MVMCompUnitBody *cu_body = &cu->body; /* Allocate space for callsites. */ if (rs->expected_callsites == 0) return NULL; callsites = MVM_malloc(sizeof(MVMCallsite *) * rs->expected_callsites); /* Load callsites. */ pos = rs->callsite_seg; for (i = 0; i < rs->expected_callsites; i++) { MVMuint8 has_flattening = 0; MVMuint32 positionals = 0; MVMuint32 nameds_slots = 0; MVMuint32 nameds_non_flattening = 0; /* Ensure we can read at least an element count. */ ensure_can_read(tc, cu, rs, pos, 2); elems = read_int16(pos, 0); pos += 2; /* Allocate space for the callsite. */ callsites[i] = MVM_malloc(sizeof(MVMCallsite)); callsites[i]->flag_count = elems; if (elems) callsites[i]->arg_flags = MVM_malloc(elems); /* Ensure we can read in a callsite of this size, and do so. */ ensure_can_read(tc, cu, rs, pos, elems); for (j = 0; j < elems; j++) callsites[i]->arg_flags[j] = read_int8(pos, j); pos += elems; /* Add alignment. */ pos += elems % 2; /* Count positional arguments, and validate that all positionals come * before all nameds (flattening named counts as named). */ for (j = 0; j < elems; j++) { if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_FLAT) { if (!(callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_OBJ)) MVM_exception_throw_adhoc(tc, "Flattened positional args must be objects"); if (nameds_slots) MVM_exception_throw_adhoc(tc, "Flattened positional args must appear before named args"); has_flattening = 1; positionals++; } else if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_FLAT_NAMED) { if (!(callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_OBJ)) MVM_exception_throw_adhoc(tc, "Flattened named args must be objects"); has_flattening = 1; nameds_slots++; } else if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_NAMED) { nameds_slots += 2; nameds_non_flattening++; } else if (nameds_slots) { MVM_exception_throw_adhoc(tc, "All positional args must appear before named args"); } else { positionals++; } } callsites[i]->num_pos = positionals; callsites[i]->arg_count = positionals + nameds_slots; callsites[i]->has_flattening = has_flattening; callsites[i]->is_interned = 0; callsites[i]->with_invocant = NULL; if (rs->version >= 3 && nameds_non_flattening) { ensure_can_read(tc, cu, rs, pos, nameds_non_flattening * 4); callsites[i]->arg_names = MVM_malloc(nameds_non_flattening * sizeof(MVMString)); for (j = 0; j < nameds_non_flattening; j++) { callsites[i]->arg_names[j] = get_heap_string(tc, cu, rs, pos, 0); pos += 4; } } else { callsites[i]->arg_names = NULL; } /* Track maximum callsite size we've seen. (Used for now, though * in the end we probably should calculate it by frame.) */ if (callsites[i]->arg_count > cu_body->max_callsite_size) cu_body->max_callsite_size = callsites[i]->arg_count; /* Try to intern the callsite (that is, see if it matches one the * VM already knows about). If it does, it will free the memory * associated and replace it with the interned one. Otherwise it * will store this one, provided it meets the interning rules. */ MVM_callsite_try_intern(tc, &(callsites[i])); } /* Add one on to the maximum, to allow space for unshifting an extra * arg in the "supply invoked code object" case. */ cu_body->max_callsite_size++; return callsites; } /* Creates code objects to go with each of the static frames. */ static void create_code_objects(MVMThreadContext *tc, MVMCompUnit *cu) { MVMuint32 i; MVMObject *code_type; MVMCompUnitBody *cu_body = &cu->body; cu_body->coderefs = MVM_malloc(cu_body->num_frames * sizeof(MVMObject *)); code_type = tc->instance->boot_types.BOOTCode; for (i = 0; i < cu_body->num_frames; i++) { MVMCode *coderef = (MVMCode *)REPR(code_type)->allocate(tc, STABLE(code_type)); MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->coderefs[i], coderef); MVM_ASSIGN_REF(tc, &(coderef->common.header), coderef->body.sf, cu_body->frames[i]); MVM_ASSIGN_REF(tc, &(coderef->common.header), coderef->body.name, cu_body->frames[i]->body.name); MVM_ASSIGN_REF(tc, &(cu_body->frames[i]->common.header), cu_body->frames[i]->body.static_code, coderef); } } /* Takes a compilation unit pointing at a bytecode stream (which actually * has more than just the executive bytecode, but also various declarations, * like frames). Unpacks it and populates the compilation unit. */ void MVM_bytecode_unpack(MVMThreadContext *tc, MVMCompUnit *cu) { ReaderState *rs; MVMCompUnitBody *cu_body = &cu->body; /* Allocate directly in generation 2 so the object is not moving around. */ MVM_gc_allocate_gen2_default_set(tc); /* Dissect the bytecode into its parts. */ rs = dissect_bytecode(tc, cu); /* Load the strings heap. */ cu_body->strings = deserialize_strings(tc, cu, rs); cu_body->num_strings = rs->expected_strings; cu_body->orig_strings = rs->expected_strings; /* Load SC dependencies. */ deserialize_sc_deps(tc, cu, rs); /* Load the extension op records. */ cu_body->extops = deserialize_extop_records(tc, cu, rs); cu_body->num_extops = rs->expected_extops; /* Load the static frame info and give each one a code reference. */ cu_body->frames = deserialize_frames(tc, cu, rs); cu_body->num_frames = rs->expected_frames; cu_body->orig_frames = rs->expected_frames; create_code_objects(tc, cu); /* Load callsites. */ cu_body->max_callsite_size = MVM_MIN_CALLSITE_SIZE; cu_body->callsites = deserialize_callsites(tc, cu, rs); cu_body->num_callsites = rs->expected_callsites; cu_body->orig_callsites = rs->expected_callsites; /* Resolve HLL name. */ MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->hll_name, cu_body->strings[rs->hll_str_idx]); /* Resolve special frames. */ if (rs->main_frame) MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->main_frame, cu_body->frames[rs->main_frame - 1]); if (rs->load_frame) MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->load_frame, cu_body->frames[rs->load_frame - 1]); if (rs->deserialize_frame) MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->deserialize_frame, cu_body->frames[rs->deserialize_frame - 1]); /* Clean up reader state. */ cleanup_all(tc, rs); /* Restore normal GC allocation. */ MVM_gc_allocate_gen2_default_clear(tc); } /* returns the annotation for that bytecode offset */ MVMBytecodeAnnotation * MVM_bytecode_resolve_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMuint32 offset) { MVMBytecodeAnnotation *ba = NULL; MVMuint32 i; if (sfb->num_annotations && offset < sfb->bytecode_size) { MVMuint8 *cur_anno = sfb->annotations_data; for (i = 0; i < sfb->num_annotations; i++) { MVMint32 ann_offset = read_int32(cur_anno, 0); if (ann_offset > offset) break; cur_anno += 12; } if (i) cur_anno -= 12; ba = MVM_malloc(sizeof(MVMBytecodeAnnotation)); ba->bytecode_offset = read_int32(cur_anno, 0); ba->filename_string_heap_index = read_int32(cur_anno, 4); ba->line_number = read_int32(cur_anno, 8); } return ba; } MoarVM-2015.11/src/core/bytecode.h0000644000175000017500000000116612456307241015546 0ustar jnthnjnthn/* Bytecode annotation, post-resolution. */ struct MVMBytecodeAnnotation { MVMuint32 bytecode_offset; MVMuint32 filename_string_heap_index; MVMuint32 line_number; }; void MVM_bytecode_unpack(MVMThreadContext *tc, MVMCompUnit *cu); MVMBytecodeAnnotation * MVM_bytecode_resolve_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMuint32 offset); void MVM_bytecode_finish_frame(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMint32 dump_only); MVMuint8 MVM_bytecode_find_static_lexical_scref(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMuint16 index, MVMint32 *sc, MVMint32 *id); MoarVM-2015.11/src/core/bytecodedump.c0000644000175000017500000003575712573775575016467 0ustar jnthnjnthn#include "moar.h" #define line_length 1024 MVM_FORMAT(printf, 4, 5) static void append_string(char **out, MVMuint32 *size, MVMuint32 *length, char *str, ...) { char string[line_length]; MVMuint32 len; va_list args; va_start(args, str); vsnprintf(string, line_length, str, args); va_end(args); len = strlen(string); if (*length + len > *size) { while (*length + len > *size) *size = *size * 2; *out = MVM_realloc(*out, *size); } memcpy(*out + *length, string, len); *length = *length + len; } static const char * get_typename(MVMuint16 type) { switch(type) { case MVM_reg_int8 : return "int8"; case MVM_reg_int16: return "int16"; case MVM_reg_int32: return "int32"; case MVM_reg_int64: return "int"; case MVM_reg_num32: return "num32"; case MVM_reg_num64: return "num"; case MVM_reg_str : return "str"; case MVM_reg_obj : return "obj"; default : return "UNKNOWN"; } } #define a(...) append_string(&o,&s,&l, __VA_ARGS__) /* Macros for getting things from the bytecode stream. */ /* GET_REG is defined differently here from interp.c */ #define GET_I8(pc, idx) *((MVMint8 *)(pc + idx)) #define GET_REG(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I16(pc, idx) *((MVMint16 *)(pc + idx)) #define GET_UI16(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I32(pc, idx) *((MVMint32 *)(pc + idx)) #define GET_UI32(pc, idx) *((MVMuint32 *)(pc + idx)) #define GET_N32(pc, idx) *((MVMnum32 *)(pc + idx)) enum { MVM_val_branch_target = 1, MVM_val_op_boundary = 2 }; char * MVM_bytecode_dump(MVMThreadContext *tc, MVMCompUnit *cu) { MVMuint32 s = 1024; MVMuint32 l = 0; MVMuint32 i, j, k; char *o = MVM_calloc(sizeof(char) * s, 1); char ***frame_lexicals = MVM_malloc(sizeof(char **) * cu->body.num_frames); MVMString *name = MVM_string_utf8_decode(tc, tc->instance->VMString, "", 0); a("\nMoarVM dump of binary compilation unit:\n\n"); for (k = 0; k < cu->body.num_scs; k++) { char *tmpstr = MVM_string_utf8_encode_C_string( tc, cu->body.strings[cu->body.sc_handle_idxs[k]]); a(" SC_%u : %s\n", k, tmpstr); MVM_free(tmpstr); } for (k = 0; k < cu->body.num_callsites; k++) { MVMCallsite *callsite = cu->body.callsites[k]; MVMuint16 arg_count = callsite->arg_count; MVMuint16 nameds_count = 0; a(" Callsite_%u :\n", k); a(" num_pos: %d\n", callsite->num_pos); a(" arg_count: %u\n", arg_count); for (j = 0, i = 0; j < arg_count; j++) { MVMCallsiteEntry csitee = callsite->arg_flags[i++]; a(" Arg %u :", i); if (csitee & MVM_CALLSITE_ARG_NAMED) { if (callsite->arg_names) { char *arg_name = MVM_string_utf8_encode_C_string(tc, callsite->arg_names[nameds_count++]); a(" named(%s)", arg_name); MVM_free(arg_name); } else { a(" named"); } j++; } else if (csitee & MVM_CALLSITE_ARG_FLAT_NAMED) { a(" flatnamed"); } else if (csitee & MVM_CALLSITE_ARG_FLAT) { a(" flat"); } else a(" positional"); if (csitee & MVM_CALLSITE_ARG_OBJ) a(" obj"); else if (csitee & MVM_CALLSITE_ARG_INT) a(" int"); else if (csitee & MVM_CALLSITE_ARG_NUM) a(" num"); else if (csitee & MVM_CALLSITE_ARG_STR) a(" str"); if (csitee & MVM_CALLSITE_ARG_FLAT) a(" flat"); a("\n"); } } for (k = 0; k < cu->body.num_frames; k++) MVM_bytecode_finish_frame(tc, cu, cu->body.frames[k], 1); for (k = 0; k < cu->body.num_frames; k++) { MVMStaticFrame *frame = cu->body.frames[k]; MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; char **lexicals; if (!frame->body.fully_deserialized) { MVM_bytecode_finish_frame(tc, cu, frame, 1); } lexicals = (char **)MVM_malloc(sizeof(char *) * frame->body.num_lexicals); frame_lexicals[k] = lexicals; HASH_ITER(hash_handle, frame->body.lexical_names, current, tmp, bucket_tmp) { name->body.storage.blob_32 = (MVMint32 *)current->hash_handle.key; name->body.num_graphs = (MVMuint32)current->hash_handle.keylen / sizeof(MVMGrapheme32); lexicals[current->value] = MVM_string_utf8_encode_C_string(tc, name); } } for (k = 0; k < cu->body.num_frames; k++) { MVMStaticFrame *frame = cu->body.frames[k]; char *cuuid; char *fname; cuuid = MVM_string_utf8_encode_C_string(tc, frame->body.cuuid); fname = MVM_string_utf8_encode_C_string(tc, frame->body.name); a(" Frame_%u :\n", k); a(" cuuid : %s\n", cuuid); MVM_free(cuuid); a(" name : %s\n", fname); MVM_free(fname); for (j = 0; j < cu->body.num_frames; j++) { if (cu->body.frames[j] == frame->body.outer) a(" outer : Frame_%u\n", j); } for (j = 0; j < frame->body.num_locals; j++) { if (!j) a(" Locals :\n"); a(" %6u: loc_%u_%s\n", j, j, get_typename(frame->body.local_types[j])); } for (j = 0; j < frame->body.num_lexicals; j++) { if (!j) a(" Lexicals :\n"); a(" %6u: lex_Frame_%u_%s_%s\n", j, k, frame_lexicals[k][j], get_typename(frame->body.lexical_types[j])); } a(" Instructions :\n"); { /* mostly stolen from validation.c */ MVMStaticFrame *static_frame = frame; MVMuint32 bytecode_size = static_frame->body.bytecode_size; MVMuint8 *bytecode_start = static_frame->body.bytecode; MVMuint8 *bytecode_end = bytecode_start + bytecode_size; /* current position in the bytestream */ MVMuint8 *cur_op = bytecode_start; /* positions in the bytestream that are starts of ops and goto targets */ MVMuint8 *labels = MVM_calloc(bytecode_size, 1); MVMuint32 *jumps = MVM_calloc(sizeof(MVMuint32) * bytecode_size, 1); char **lines = MVM_malloc(sizeof(char *) * bytecode_size); MVMuint32 *linelocs = MVM_malloc(bytecode_size); MVMuint32 lineno = 0; MVMuint32 lineloc; MVMuint16 op_num; const MVMOpInfo *op_info; MVMuint32 operand_size = 0; unsigned char op_rw; unsigned char op_type; unsigned char op_flags; MVMOpInfo tmp_extop_info; /* stash the outer output buffer */ MVMuint32 sP = s; MVMuint32 lP = l; char *oP = o; char *tmpstr; while (cur_op < bytecode_end - 1) { /* allocate a line buffer */ s = 200; l = 0; o = MVM_calloc(sizeof(char) * s, 1); lineloc = cur_op - bytecode_start; /* mark that this line starts at this point in the bytestream */ linelocs[lineno] = lineloc; /* mark that this point in the bytestream is an op boundary */ labels[lineloc] |= MVM_val_op_boundary; op_num = *((MVMint16 *)cur_op); cur_op += 2; if (op_num < MVM_OP_EXT_BASE) { op_info = MVM_op_get_op(op_num); a("%-12s ", op_info->name); } else { MVMint16 ext_op_num = op_num - MVM_OP_EXT_BASE; if (ext_op_num < cu->body.num_extops) { MVMExtOpRecord r = cu->body.extops[ext_op_num]; MVMuint8 j; memset(&tmp_extop_info, 0, sizeof(MVMOpInfo)); tmp_extop_info.name = MVM_string_utf8_encode_C_string(tc, r.name); memcpy(tmp_extop_info.operands, r.operand_descriptor, 8); for (j = 0; j < 8; j++) if (tmp_extop_info.operands[j]) tmp_extop_info.num_operands++; else break; op_info = &tmp_extop_info; a("%-12s ", tmp_extop_info.name); MVM_free((void *)tmp_extop_info.name); tmp_extop_info.name = NULL; } else { MVM_exception_throw_adhoc(tc, "Extension op %d out of range", (int)op_num); } } for (i = 0; i < op_info->num_operands; i++) { if (i) a(", "); op_flags = op_info->operands[i]; op_rw = op_flags & MVM_operand_rw_mask; op_type = op_flags & MVM_operand_type_mask; if (op_rw == MVM_operand_literal) { switch (op_type) { case MVM_operand_int8: operand_size = 1; a("%"PRId8, GET_I8(cur_op, 0)); break; case MVM_operand_int16: operand_size = 2; a("%"PRId16, GET_I16(cur_op, 0)); break; case MVM_operand_int32: operand_size = 4; a("%"PRId32, GET_I32(cur_op, 0)); break; case MVM_operand_int64: operand_size = 8; a("%"PRId64, MVM_BC_get_I64(cur_op, 0)); break; case MVM_operand_num32: operand_size = 4; a("%f", GET_N32(cur_op, 0)); break; case MVM_operand_num64: operand_size = 8; a("%f", MVM_BC_get_N64(cur_op, 0)); break; case MVM_operand_callsite: operand_size = 2; a("Callsite_%"PRIu16, GET_UI16(cur_op, 0)); break; case MVM_operand_coderef: operand_size = 2; a("Frame_%"PRIu16, GET_UI16(cur_op, 0)); break; case MVM_operand_str: operand_size = 4; tmpstr = MVM_string_utf8_encode_C_string( tc, cu->body.strings[GET_UI32(cur_op, 0)]); /* XXX C-string-literal escape the \ and ' and line breaks and non-ascii someday */ a("'%s'", tmpstr); MVM_free(tmpstr); break; case MVM_operand_ins: operand_size = 4; /* luckily all the ins operands are at the end of op operands, so I can wait to resolve the label to the end. */ labels[GET_UI32(cur_op, 0)] |= MVM_val_branch_target; jumps[lineno] = GET_UI32(cur_op, 0); break; case MVM_operand_obj: /* not sure what a literal object is */ operand_size = 4; break; default: abort(); /* never reached, silence compiler warnings */ } } else if (op_rw == MVM_operand_read_reg || op_rw == MVM_operand_write_reg) { /* register operand */ operand_size = 2; a("loc_%u_%s", GET_REG(cur_op, 0), get_typename(frame->body.local_types[GET_REG(cur_op, 0)])); } else if (op_rw == MVM_operand_read_lex || op_rw == MVM_operand_write_lex) { /* lexical operand */ MVMuint16 idx, frames, m; MVMStaticFrame *applicable_frame = static_frame; operand_size = 4; idx = GET_UI16(cur_op, 0); frames = GET_UI16(cur_op, 2); m = frames; while (m > 0) { applicable_frame = applicable_frame->body.outer; m--; } /* inefficient, I know. should use a hash. */ for (m = 0; m < cu->body.num_frames; m++) { if (cu->body.frames[m] == applicable_frame) { a("lex_Frame_%u_%s_%s", m, frame_lexicals[m][idx], get_typename(applicable_frame->body.lexical_types[idx])); } } } cur_op += operand_size; } lines[lineno++] = o; } { MVMuint32 *linelabels = MVM_calloc(lineno, sizeof(MVMuint32)); MVMuint32 byte_offset = 0; MVMuint32 line_number = 0; MVMuint32 label_number = 1; MVMuint32 *annotations = MVM_calloc(lineno, sizeof(MVMuint32)); for (; byte_offset < bytecode_size; byte_offset++) { if (labels[byte_offset] & MVM_val_branch_target) { /* found a byte_offset where a label should be. now crawl up through the lines to find which line starts there */ while (linelocs[line_number] != byte_offset) line_number++; linelabels[line_number] = label_number++; } } o = oP; l = lP; s = sP; i = 0; /* resolve annotation line numbers */ for (j = 0; j < frame->body.num_annotations; j++) { MVMuint32 ann_offset = GET_UI32(frame->body.annotations_data, j*12); for (; i < lineno; i++) { if (linelocs[i] == ann_offset) { annotations[i] = j + 1; break; } } } for (j = 0; j < lineno; j++) { if (annotations[j]) { MVMuint16 shi = GET_UI16(frame->body.annotations_data + 4, (annotations[j] - 1)*12); tmpstr = MVM_string_utf8_encode_C_string( tc, cu->body.strings[ shi < cu->body.num_strings ? shi : 0 ]); a(" annotation: %s:%u\n", tmpstr, GET_UI32(frame->body.annotations_data, (annotations[j] - 1)*12 + 8)); MVM_free(tmpstr); } if (linelabels[j]) a(" label_%u:\n", linelabels[j]); a("%05d %s", j, lines[j]); MVM_free(lines[j]); if (jumps[j]) { /* horribly inefficient for large frames. again, should use a hash */ line_number = 0; while (linelocs[line_number] != jumps[j]) line_number++; a("label_%u(%05u)", linelabels[line_number], line_number); } a("\n"); } MVM_free(lines); MVM_free(jumps); MVM_free(linelocs); MVM_free(linelabels); MVM_free(labels); MVM_free(annotations); } } } for (k = 0; k < cu->body.num_frames; k++) { for (j = 0; j < cu->body.frames[k]->body.num_lexicals; j++) { MVM_free(frame_lexicals[k][j]); } MVM_free(frame_lexicals[k]); } MVM_free(frame_lexicals); return o; } MoarVM-2015.11/src/core/bytecodedump.h0000644000175000017500000000010212456307241016421 0ustar jnthnjnthn char * MVM_bytecode_dump(MVMThreadContext *tc, MVMCompUnit *cu); MoarVM-2015.11/src/core/callsite.c0000644000175000017500000001340012623370227015535 0ustar jnthnjnthn#include "moar.h" /* Checks if two callsiates are equal. */ static MVMint32 callsites_equal(MVMThreadContext *tc, MVMCallsite *cs1, MVMCallsite *cs2, MVMint32 num_flags, MVMint32 num_nameds) { MVMint32 i; if (memcmp(cs1->arg_flags, cs2->arg_flags, num_flags)) return 0; for (i = 0; i < num_nameds; i++) if (!MVM_string_equal(tc, cs1->arg_names[i], cs2->arg_names[i])) return 0; return 1; } static MVMCallsite null_args_callsite = { NULL, 0, 0, 0, 0, 0, 0, 0 }; static MVMCallsiteEntry obj_arg_flags[] = { MVM_CALLSITE_ARG_OBJ }; static MVMCallsite inv_arg_callsite = { obj_arg_flags, 1, 1, 1, 0, 0, 0, 0 }; static MVMCallsiteEntry two_obj_arg_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ }; static MVMCallsite two_args_callsite = { two_obj_arg_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry mnfe_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite methnotfound_callsite = { mnfe_flags, 2, 2, 2, 0 }; static MVMCallsiteEntry fm_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite findmeth_callsite = { fm_flags, 3, 3, 3, 0 }; static MVMCallsiteEntry tc_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ }; static MVMCallsite typecheck_callsite = { tc_flags, 3, 3, 3, 0 }; static MVMCallsiteEntry obj_int_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_INT }; static MVMCallsite obj_int_callsite = { obj_int_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry obj_num_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_NUM }; static MVMCallsite obj_num_callsite = { obj_num_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry obj_str_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite obj_str_callsite = { obj_str_flags, 2, 2, 2, 0, 0, 0 }; MVM_PUBLIC MVMCallsite *MVM_callsite_get_common(MVMThreadContext *tc, MVMCommonCallsiteID id) { switch (id) { case MVM_CALLSITE_ID_NULL_ARGS: return &null_args_callsite; case MVM_CALLSITE_ID_INV_ARG: return &inv_arg_callsite; case MVM_CALLSITE_ID_TWO_OBJ: return &two_args_callsite; case MVM_CALLSITE_ID_METH_NOT_FOUND: return &methnotfound_callsite; case MVM_CALLSITE_ID_FIND_METHOD: return &findmeth_callsite; case MVM_CALLSITE_ID_TYPECHECK: return &typecheck_callsite; case MVM_CALLSITE_ID_OBJ_INT: return &obj_int_callsite; case MVM_CALLSITE_ID_OBJ_NUM: return &obj_num_callsite; case MVM_CALLSITE_ID_OBJ_STR: return &obj_str_callsite; default: MVM_exception_throw_adhoc(tc, "get_common_callsite: id %d unknown", id); return NULL; } } void MVM_callsite_initialize_common(MVMThreadContext *tc) { MVMCallsite *ptr; ptr = &inv_arg_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &null_args_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &methnotfound_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &two_args_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &findmeth_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &typecheck_callsite; MVM_callsite_try_intern(tc, &ptr); } /* Tries to intern the callsite, freeing and updating the one passed in and * replacing it with an already interned one if we find it. */ MVM_PUBLIC void MVM_callsite_try_intern(MVMThreadContext *tc, MVMCallsite **cs_ptr) { MVMCallsiteInterns *interns = tc->instance->callsite_interns; MVMCallsite *cs = *cs_ptr; MVMint32 num_flags = cs->flag_count; MVMint32 num_nameds = MVM_callsite_num_nameds(tc, cs); MVMint32 i, found; /* Can't intern anything with flattening. */ if (cs->has_flattening) return; /* Also can't intern past the max arity. */ if (num_flags >= MVM_INTERN_ARITY_LIMIT) return; /* Can intern things with nameds, provided we know the names. */ if (num_nameds > 0 && !cs->arg_names) return; /* Obtain mutex protecting interns store. */ uv_mutex_lock(&tc->instance->mutex_callsite_interns); /* Search for a match. */ found = 0; for (i = 0; i < interns->num_by_arity[num_flags]; i++) { if (callsites_equal(tc, interns->by_arity[num_flags][i], cs, num_flags, num_nameds)) { /* Got a match! Free the one we were passed and replace it with * the interned one. */ if (num_flags) MVM_free(cs->arg_flags); MVM_free(cs); *cs_ptr = interns->by_arity[num_flags][i]; found = 1; break; } } /* If it wasn't found, store it for the future. */ if (!found) { if (interns->num_by_arity[num_flags] % 8 == 0) { if (interns->num_by_arity[num_flags]) interns->by_arity[num_flags] = MVM_realloc( interns->by_arity[num_flags], sizeof(MVMCallsite *) * (interns->num_by_arity[num_flags] + 8)); else interns->by_arity[num_flags] = MVM_malloc(sizeof(MVMCallsite *) * 8); } interns->by_arity[num_flags][interns->num_by_arity[num_flags]++] = cs; cs->is_interned = 1; } /* Finally, release mutex. */ uv_mutex_unlock(&tc->instance->mutex_callsite_interns); } MoarVM-2015.11/src/core/callsite.h0000644000175000017500000001005612623370227015546 0ustar jnthnjnthn/* Callsite argument flags. */ #define MVM_CALLSITE_ARG_MASK 31 typedef enum { /* Argument is an object. */ MVM_CALLSITE_ARG_OBJ = 1, /* Argument is a native integer, signed. */ MVM_CALLSITE_ARG_INT = 2, /* Argument is a native floating point number. */ MVM_CALLSITE_ARG_NUM = 4, /* Argument is a native NFG string (MVMString REPR). */ MVM_CALLSITE_ARG_STR = 8, /* Argument is named. The name is placed in the MVMCallsite. */ MVM_CALLSITE_ARG_NAMED = 32, /* Argument is flattened. What this means is up to the target. */ MVM_CALLSITE_ARG_FLAT = 64, /* Argument is flattened and named. */ MVM_CALLSITE_ARG_FLAT_NAMED = 128 } MVMCallsiteFlags; typedef enum { /* Zero argument callsite. */ MVM_CALLSITE_ID_NULL_ARGS, /* Dummy, invocant-arg callsite. Taken from coerce.c; * OBJ */ MVM_CALLSITE_ID_INV_ARG, /* Callsite for container store. Taken from containers.c; * OBJ, OBJ */ MVM_CALLSITE_ID_TWO_OBJ, /* Callsite for method not found errors. Taken from 6model.c; * OBJ, STR */ MVM_CALLSITE_ID_METH_NOT_FOUND, /* Callsite for finding methods. Taken from 6model.c; * OBJ, OBJ, STR */ MVM_CALLSITE_ID_FIND_METHOD, /* Callsite for typechecks. Taken from 6model.c; * OBJ, OBJ, OBJ */ MVM_CALLSITE_ID_TYPECHECK, /* Callsite OBJ, INT */ MVM_CALLSITE_ID_OBJ_INT, /* Callsite OBJ, INT */ MVM_CALLSITE_ID_OBJ_NUM, /* Callsite OBJ, STR */ MVM_CALLSITE_ID_OBJ_STR, } MVMCommonCallsiteID; /* A callsite entry is just one of the above flags. */ typedef MVMuint8 MVMCallsiteEntry; /* A callsite is an argument count, a bunch of flags, and names of named * arguments (excluding any flattening ones). Note that it does not contain * the argument values; this is the *statically known* things about the * callsite and is immutable. It describes how to process the callsite * memory buffer. */ struct MVMCallsite { /* The set of flags. */ MVMCallsiteEntry *arg_flags; /* The number of arg flags. */ MVMuint16 flag_count; /* The total argument count (including 2 for each named arg). */ MVMuint16 arg_count; /* Number of positionals, including flattening positionals but * excluding named positionals. */ MVMuint16 num_pos; /* Whether it has any flattening args. */ MVMuint8 has_flattening; /* Whether it has been interned (which means it is suitable for using in * specialization). */ MVMuint8 is_interned; /* Cached version of this callsite with an extra invocant arg. */ MVMCallsite *with_invocant; /* Names of named arguments, in the order that they are passed (and thus * matching the flags). Note that named flattening args do not have an * entry here, even though they come in the nameds section. */ MVMString **arg_names; }; /* Minimum callsite size is due to certain things internally expecting us to * have that many slots available (e.g. find_method(how, obj, name)). */ #define MVM_MIN_CALLSITE_SIZE 3 /* Maximum arity + 1 that we'll intern callsites by. */ #define MVM_INTERN_ARITY_LIMIT 8 /* Interned callsites data structure. */ struct MVMCallsiteInterns { /* Array of callsites, by arity. */ MVMCallsite **by_arity[MVM_INTERN_ARITY_LIMIT]; /* Number of callsites we have interned by arity. */ MVMint32 num_by_arity[MVM_INTERN_ARITY_LIMIT]; }; /* Initialize the "common" callsites */ void MVM_callsite_initialize_common(MVMThreadContext *tc); /* Get any of the "common" callsites */ MVM_PUBLIC MVMCallsite *MVM_callsite_get_common(MVMThreadContext *tc, MVMCommonCallsiteID id); /* Callsite interning function. */ MVM_PUBLIC void MVM_callsite_try_intern(MVMThreadContext *tc, MVMCallsite **cs); /* Count the number of nameds (excluding flattening). */ MVM_STATIC_INLINE MVMuint16 MVM_callsite_num_nameds(MVMThreadContext *tc, MVMCallsite *cs) { MVMuint16 i = cs->num_pos; MVMuint16 nameds = 0; while (i < cs->flag_count) { if (!(cs->arg_flags[i] & MVM_CALLSITE_ARG_FLAT_NAMED)) nameds++; i++; } return nameds; } MoarVM-2015.11/src/core/coerce.c0000644000175000017500000004325612617121315015204 0ustar jnthnjnthn#include "moar.h" #if defined(_MSC_VER) #define strtoll _strtoi64 #define snprintf _snprintf #endif /* Special return structure for boolification handling. */ typedef struct { MVMuint8 *true_addr; MVMuint8 *false_addr; MVMuint8 flip; MVMRegister res_reg; } BoolMethReturnData; MVMint64 MVM_coerce_istrue_s(MVMThreadContext *tc, MVMString *str) { return str == NULL || !IS_CONCRETE(str) || MVM_string_graphs(tc, str) == 0 ? 0 : 1; } /* Tries to do the boolification. It may be that a method call is needed. In * this case, a return hook is set up to handle doing the right thing. The * result register to put the result in should be indicated in res_reg, or * alternatively the true/false addresses to set the PC to should be set. * In the register case, expects that the current PC is already at the * next instruction before this is called. */ static void boolify_return(MVMThreadContext *tc, void *sr_data); static void flip_return(MVMThreadContext *tc, void *sr_data); void MVM_coerce_istrue(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg, MVMuint8 *true_addr, MVMuint8 *false_addr, MVMuint8 flip) { MVMint64 result = 0; if (!MVM_is_null(tc, obj)) { MVMBoolificationSpec *bs = obj->st->boolification_spec; switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_CALL_METHOD: { MVMObject *code = MVM_frame_find_invokee(tc, bs->method, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); if (res_reg) { /* We need to do the invocation, and set this register * the result. Then we just do the call. For the flip * case, just set up special return handler to flip * the register. */ MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_INT, inv_arg_callsite); tc->cur_frame->args[0].o = obj; if (flip) { tc->cur_frame->special_return = flip_return; tc->cur_frame->special_return_data = res_reg; } STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { /* Need to set up special return hook. */ BoolMethReturnData *data = MVM_malloc(sizeof(BoolMethReturnData)); data->true_addr = true_addr; data->false_addr = false_addr; data->flip = flip; tc->cur_frame->special_return = boolify_return; tc->cur_frame->special_return_data = data; MVM_args_setup_thunk(tc, &data->res_reg, MVM_RETURN_INT, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } return; } case MVM_BOOL_MODE_UNBOX_INT: result = !IS_CONCRETE(obj) || REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)) == 0 ? 0 : 1; break; case MVM_BOOL_MODE_UNBOX_NUM: result = !IS_CONCRETE(obj) || REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)) == 0.0 ? 0 : 1; break; case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY: { MVMString *str; if (!IS_CONCRETE(obj)) { result = 0; break; } str = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); result = MVM_coerce_istrue_s(tc, str); break; } case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO: { MVMString *str; if (!IS_CONCRETE(obj)) { result = 0; break; } str = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); result = str == NULL || !IS_CONCRETE(str) || (MVM_string_graphs(tc, str) == 1 && MVM_string_get_grapheme_at_nocheck(tc, str, 0) == 48) ? 0 : 1; break; } case MVM_BOOL_MODE_NOT_TYPE_OBJECT: result = !IS_CONCRETE(obj) ? 0 : 1; break; case MVM_BOOL_MODE_BIGINT: result = IS_CONCRETE(obj) ? MVM_bigint_bool(tc, obj) : 0; break; case MVM_BOOL_MODE_ITER: result = IS_CONCRETE(obj) ? MVM_iter_istrue(tc, (MVMIter *)obj) : 0; break; case MVM_BOOL_MODE_HAS_ELEMS: result = IS_CONCRETE(obj) ? MVM_repr_elems(tc, obj) != 0 : 0; break; default: MVM_exception_throw_adhoc(tc, "Invalid boolification spec mode used"); } } if (flip) result = result ? 0 : 1; if (res_reg) { res_reg->i64 = result; } else { if (result) *(tc->interp_cur_op) = true_addr; else *(tc->interp_cur_op) = false_addr; } } /* Callback after running boolification method. */ static void boolify_return(MVMThreadContext *tc, void *sr_data) { BoolMethReturnData *data = (BoolMethReturnData *)sr_data; MVMint64 result = data->res_reg.i64; if (data->flip) result = result ? 0 : 1; if (result) *(tc->interp_cur_op) = data->true_addr; else *(tc->interp_cur_op) = data->false_addr; MVM_free(data); } /* Callback to flip result. */ static void flip_return(MVMThreadContext *tc, void *sr_data) { MVMRegister *r = (MVMRegister *)sr_data; r->i64 = r->i64 ? 0 : 1; } MVMString * MVM_coerce_i_s(MVMThreadContext *tc, MVMint64 i) { char buffer[64]; int len; /* See if we can hit the cache. */ int cache = i >= 0 && i < MVM_INT_TO_STR_CACHE_SIZE; if (cache) { MVMString *cached = tc->instance->int_to_str_cache[i]; if (cached) return cached; } /* Otherwise, need to do the work; cache it if in range. */ len = snprintf(buffer, 64, "%lld", (long long int)i); if (len >= 0) { MVMString *result = MVM_string_ascii_decode(tc, tc->instance->VMString, buffer, len); if (cache) tc->instance->int_to_str_cache[i] = result; return result; } else { MVM_exception_throw_adhoc(tc, "Could not stringify integer"); } } MVMString * MVM_coerce_n_s(MVMThreadContext *tc, MVMnum64 n) { if (n == MVM_num_posinf(tc)) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "Inf"); } else if (n == MVM_num_neginf(tc)) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "-Inf"); } else if (n != n) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "NaN"); } else { char buf[64]; int i; if (snprintf(buf, 64, "%.15g", n) < 0) MVM_exception_throw_adhoc(tc, "Could not stringify number"); if (strstr(buf, ".")) { MVMint64 is_not_scientific = !strstr(buf, "e"); i = strlen(buf); while (i > 1 && ((buf[--i] == '0' && is_not_scientific) || buf[i] == ' ')) buf[i] = '\0'; if (buf[i] == '.') buf[i] = '\0'; } return MVM_string_ascii_decode(tc, tc->instance->VMString, buf, strlen(buf)); } } void MVM_coerce_smart_stringify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg) { MVMObject *strmeth; const MVMStorageSpec *ss; /* Handle null case. */ if (MVM_is_null(tc, obj)) { res_reg->s = tc->instance->str_consts.empty; return; } /* If it can unbox as a string, that wins right off. */ ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR && IS_CONCRETE(obj)) { res_reg->s = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); return; } /* Check if there is a Str method. */ strmeth = MVM_6model_find_method_cache_only(tc, obj, tc->instance->str_consts.Str); if (!MVM_is_null(tc, strmeth)) { /* We need to do the invocation; just set it up with our result reg as * the one for the call. */ MVMObject *code = MVM_frame_find_invokee(tc, strmeth, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_STR, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); return; } /* Otherwise, guess something appropriate. */ if (!IS_CONCRETE(obj)) res_reg->s = tc->instance->str_consts.empty; else { if (REPR(obj)->ID == MVM_REPR_ID_MVMException) res_reg->s = ((MVMException *)obj)->body.message; else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) res_reg->s = MVM_coerce_i_s(tc, REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) res_reg->s = MVM_coerce_n_s(tc, REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else MVM_exception_throw_adhoc(tc, "cannot stringify this"); } } MVMint64 MVM_coerce_s_i(MVMThreadContext *tc, MVMString *s) { char *enc = MVM_string_ascii_encode(tc, s, NULL); MVMint64 i = strtoll(enc, NULL, 10); MVM_free(enc); return i; } MVMnum64 MVM_coerce_s_n(MVMThreadContext *tc, MVMString *s) { char *enc = MVM_string_ascii_encode(tc, s, NULL); MVMnum64 n; if (strcmp(enc, "NaN") == 0) n = MVM_num_nan(tc); else if (strcmp(enc, "Inf") == 0) n = MVM_num_posinf(tc); else if (strcmp(enc, "+Inf") == 0) n = MVM_num_posinf(tc); else if (strcmp(enc, "-Inf") == 0) n = MVM_num_neginf(tc); else n = atof(enc); MVM_free(enc); return n; } void MVM_coerce_smart_numify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg) { MVMObject *nummeth; /* Handle null case. */ if (MVM_is_null(tc, obj)) { res_reg->n64 = 0.0; return; } /* Check if there is a Num method. */ nummeth = MVM_6model_find_method_cache_only(tc, obj, tc->instance->str_consts.Num); if (!MVM_is_null(tc, nummeth)) { /* We need to do the invocation; just set it up with our result reg as * the one for the call. */ MVMObject *code = MVM_frame_find_invokee(tc, nummeth, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_NUM, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); return; } /* Otherwise, guess something appropriate. */ if (!IS_CONCRETE(obj)) { res_reg->n64 = 0.0; } else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) res_reg->n64 = (MVMnum64)REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) res_reg->n64 = REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) res_reg->n64 = MVM_coerce_s_n(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (REPR(obj)->ID == MVM_REPR_ID_MVMArray) res_reg->n64 = (MVMnum64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (REPR(obj)->ID == MVM_REPR_ID_MVMHash) res_reg->n64 = (MVMnum64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else MVM_exception_throw_adhoc(tc, "cannot numify this"); } } MVMint64 MVM_coerce_simple_intify(MVMThreadContext *tc, MVMObject *obj) { /* Handle null and non-concrete case. */ if (MVM_is_null(tc, obj) || !IS_CONCRETE(obj)) { return 0; } /* Otherwise, guess something appropriate. */ else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) return (MVMint64)REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) return MVM_coerce_s_i(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (REPR(obj)->ID == MVM_REPR_ID_MVMArray) return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (REPR(obj)->ID == MVM_REPR_ID_MVMHash) return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else MVM_exception_throw_adhoc(tc, "cannot intify this"); } } /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) MVMObject * MVM_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag) { MVMObject *result; MVMint64 zvalue = 0; MVMint64 zbase = 1; MVMint64 chars = MVM_string_graphs(tc, str); MVMint64 value = zvalue; MVMint64 base = zbase; MVMint64 pos = -1; MVMuint16 neg = 0; MVMint64 ch; if (radix > 36) { MVM_exception_throw_adhoc(tc, "Cannot convert radix of %"PRId64" (max 36)", radix); } ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; if ((flag & 0x02) && (ch == '+' || ch == '-')) { neg = (ch == '-'); offset++; ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; } while (offset < chars) { if (ch >= '0' && ch <= '9') ch = ch - '0'; /* fast-path for ASCII 0..9 */ else if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 10; else if (ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 10; else if (ch >= 0xFF21 && ch <= 0xFF3A) ch = ch - 0xFF21 + 10; /* uppercase fullwidth */ else if (ch >= 0xFF41 && ch <= 0xFF5A) ch = ch - 0xFF41 + 10; /* lowercase fullwidth */ else if (ch > 0 && MVM_unicode_codepoint_has_property_value(tc, ch, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Nd")))) { /* As of Unicode 6.0.0, we know that Nd category numerals are within * the range 0..9 */ /* the string returned for NUMERIC_VALUE contains a floating point * value, so atoi will stop on the . in the string. This is fine * though, since we'd have to truncate the float regardless. */ ch = atoi(MVM_unicode_codepoint_get_property_cstr(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_VALUE)); } else break; if (ch >= radix) break; zvalue = zvalue * radix + ch; zbase = zbase * radix; offset++; pos = offset; if (ch != 0 || !(flag & 0x04)) { value=zvalue; base=zbase; } if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); if (ch != '_') continue; offset++; if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); } if (neg || flag & 0x01) { value = -value; } /* initialize the object */ result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVMROOT(tc, result, { MVMObject *box_type = MVM_hll_current(tc)->int_box_type; MVMROOT(tc, box_type, { MVMObject *boxed = MVM_repr_box_int(tc, box_type, value); MVM_repr_push_o(tc, result, boxed); boxed = MVM_repr_box_int(tc, box_type, base); MVM_repr_push_o(tc, result, boxed); boxed = MVM_repr_box_int(tc, box_type, pos); MVM_repr_push_o(tc, result, boxed); }); }); return result; } void MVM_box_int(MVMThreadContext *tc, MVMint64 value, MVMObject *type, MVMRegister * dst) { MVMObject *box = MVM_intcache_get(tc, type, value); if (box == 0) { box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_int(tc, STABLE(box), box, OBJECT_BODY(box), value); } dst->o = box; } void MVM_box_num(MVMThreadContext *tc, MVMnum64 value, MVMObject *type, MVMRegister * dst) { MVMObject *box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_num(tc, STABLE(box), box, OBJECT_BODY(box), value); dst->o = box; } void MVM_box_str(MVMThreadContext *tc, MVMString *value, MVMObject *type, MVMRegister * dst) { MVMObject *box; MVMROOT(tc, value, { box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_str(tc, STABLE(box), box, OBJECT_BODY(box), value); dst->o = box; }); } MoarVM-2015.11/src/core/coerce.h0000644000175000017500000000241412456307241015205 0ustar jnthnjnthn/* Boolification. */ MVMint64 MVM_coerce_istrue_s(MVMThreadContext *tc, MVMString *str); void MVM_coerce_istrue(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg, MVMuint8 *true_addr, MVMuint8 *false_addr, MVMuint8 flip); /* Stringification. */ MVMString * MVM_coerce_i_s(MVMThreadContext *tc, MVMint64 i); MVMString * MVM_coerce_n_s(MVMThreadContext *tc, MVMnum64 n); void MVM_coerce_smart_stringify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg); /* Numification. */ MVMint64 MVM_coerce_s_i(MVMThreadContext *tc, MVMString *s); MVMnum64 MVM_coerce_s_n(MVMThreadContext *tc, MVMString *s); void MVM_coerce_smart_numify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg); MVMint64 MVM_coerce_simple_intify(MVMThreadContext *tc, MVMObject *obj); MVMObject* MVM_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag); /* Size of the int to string coercion cache (we cache 0 ..^ this). */ #define MVM_INT_TO_STR_CACHE_SIZE 64 /* Objification */ void MVM_box_int(MVMThreadContext *tc, MVMint64 value, MVMObject *type, MVMRegister *dst); void MVM_box_num(MVMThreadContext *tc, MVMnum64 value, MVMObject *type, MVMRegister *dst); void MVM_box_str(MVMThreadContext *tc, MVMString *value, MVMObject *type, MVMRegister *dst);MoarVM-2015.11/src/core/compunit.c0000644000175000017500000001027012456307241015575 0ustar jnthnjnthn#include "moar.h" #include "platform/mmap.h" #ifdef _WIN32 #include #define O_RDONLY _O_RDONLY #endif /* Creates a compilation unit from a byte array. */ MVMCompUnit * MVM_cu_from_bytes(MVMThreadContext *tc, MVMuint8 *bytes, MVMuint32 size) { /* Create compilation unit data structure. Allocate it in gen2 always, so * it will never move (the JIT relies on this). */ MVMCompUnit *cu; MVM_gc_allocate_gen2_default_set(tc); cu = (MVMCompUnit *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTCompUnit); cu->body.data_start = bytes; cu->body.data_size = size; MVM_gc_allocate_gen2_default_clear(tc); /* Process the input. */ MVMROOT(tc, cu, { MVM_bytecode_unpack(tc, cu); }); /* Resolve HLL config. It may contain nursery pointers, so fire write * barrier on it. */ cu->body.hll_config = MVM_hll_get_config_for(tc, cu->body.hll_name); MVM_gc_write_barrier_hit(tc, (MVMCollectable *)cu); return cu; } /* Loads a compilation unit from a bytecode file, mapping it into memory. */ MVMCompUnit * MVM_cu_map_from_file(MVMThreadContext *tc, const char *filename) { MVMCompUnit *cu = NULL; void *block = NULL; void *handle = NULL; uv_file fd; MVMuint64 size; uv_fs_t req; /* Ensure the file exists, and get its size. */ if (uv_fs_stat(tc->loop, &req, filename, NULL) < 0) { MVM_exception_throw_adhoc(tc, "While looking for '%s': %s", filename, uv_strerror(req.result)); } size = req.statbuf.st_size; /* Map the bytecode file into memory. */ if ((fd = uv_fs_open(tc->loop, &req, filename, O_RDONLY, 0, NULL)) < 0) { MVM_exception_throw_adhoc(tc, "While trying to open '%s': %s", filename, uv_strerror(req.result)); } if ((block = MVM_platform_map_file(fd, &handle, (size_t)size, 0)) == NULL) { /* FIXME: check errno or GetLastError() */ MVM_exception_throw_adhoc(tc, "Could not map file '%s' into memory: %s", filename, "FIXME"); } if (uv_fs_close(tc->loop, &req, fd, NULL) < 0) { MVM_exception_throw_adhoc(tc, "Failed to close filehandle: %s", uv_strerror(req.result)); } /* Turn it into a compilation unit. */ cu = MVM_cu_from_bytes(tc, (MVMuint8 *)block, (MVMuint32)size); cu->body.handle = handle; cu->body.deallocate = MVM_DEALLOCATE_UNMAP; return cu; } /* Adds an extra callsite, needed due to an inlining, and returns its index. */ MVMuint16 MVM_cu_callsite_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMCallsite *cs) { MVMuint16 found = 0; MVMuint16 idx; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.update_mutex); /* See if we already know this callsite. */ for (idx = 0; idx < cu->body.num_callsites; idx++) if (cu->body.callsites[idx] == cs) { found = 1; break; } if (!found) { /* Not known; let's add it. */ idx = cu->body.num_callsites; cu->body.callsites = MVM_realloc(cu->body.callsites, (idx + 1) * sizeof(MVMCallsite *)); cu->body.callsites[idx] = cs; cu->body.num_callsites++; } MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); return idx; } /* Adds an extra string, needed due to an inlining, and returns its index. */ MVMuint32 MVM_cu_string_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMString *str) { MVMuint32 found = 0; MVMuint32 idx; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.update_mutex); /* See if we already know this string; only consider those added already by * inline, since we don't intern and don't want this to be costly to hunt. */ for (idx = cu->body.orig_strings; idx < cu->body.num_strings; idx++) if (cu->body.strings[idx] == str) { found = 1; break; } if (!found) { /* Not known; let's add it. */ idx = cu->body.num_strings; cu->body.strings = MVM_realloc(cu->body.strings, (idx + 1) * sizeof(MVMString *)); cu->body.strings[idx] = str; cu->body.num_strings++; } MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); return idx; } MoarVM-2015.11/src/core/compunit.h0000644000175000017500000000052312456307241015602 0ustar jnthnjnthnMVMCompUnit * MVM_cu_from_bytes(MVMThreadContext *tc, MVMuint8 *bytes, MVMuint32 size); MVMCompUnit * MVM_cu_map_from_file(MVMThreadContext *tc, const char *filename); MVMuint16 MVM_cu_callsite_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMCallsite *cs); MVMuint32 MVM_cu_string_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMString *str); MoarVM-2015.11/src/core/continuation.c0000644000175000017500000002220412456310506016447 0ustar jnthnjnthn#include "moar.h" static void clear_tag(MVMThreadContext *tc, void *sr_data) { MVMContinuationTag **update = &tc->cur_frame->continuation_tags; while (*update) { if (*update == sr_data) { *update = (*update)->next; MVM_free(sr_data); return; } update = &((*update)->next); } MVM_exception_throw_adhoc(tc, "Internal error: failed to clear continuation tag"); } void MVM_continuation_reset(MVMThreadContext *tc, MVMObject *tag, MVMObject *code, MVMRegister *res_reg) { /* Save the tag. */ MVMContinuationTag *tag_record = MVM_malloc(sizeof(MVMContinuationTag)); tag_record->tag = tag; tag_record->active_handlers = tc->active_handlers; tag_record->next = tc->cur_frame->continuation_tags; tc->cur_frame->continuation_tags = tag_record; /* Were we passed code or a continuation? */ if (REPR(code)->ID == MVM_REPR_ID_MVMContinuation) { /* Continuation; invoke it. */ MVM_continuation_invoke(tc, (MVMContinuation *)code, NULL, res_reg); } else { /* Run the passed code. */ MVMCallsite *null_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS); code = MVM_frame_find_invokee(tc, code, NULL); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, null_args_callsite); tc->cur_frame->special_return = clear_tag; tc->cur_frame->special_return_data = tag_record; STABLE(code)->invoke(tc, code, null_args_callsite, tc->cur_frame->args); } } void MVM_continuation_control(MVMThreadContext *tc, MVMint64 protect, MVMObject *tag, MVMObject *code, MVMRegister *res_reg) { MVMObject *cont; MVMCallsite *inv_arg_callsite; /* Hunt the tag on the stack; mark frames as being incorporated into a * continuation as we go to avoid a second pass. */ MVMFrame *jump_frame = tc->cur_frame; MVMFrame *root_frame = NULL; MVMContinuationTag *tag_record = NULL; while (jump_frame) { jump_frame->in_continuation = 1; tag_record = jump_frame->continuation_tags; while (tag_record) { if (MVM_is_null(tc, tag) || tag_record->tag == tag) break; tag_record = tag_record->next; } if (tag_record) break; root_frame = jump_frame; jump_frame = jump_frame->caller; } if (!tag_record) MVM_exception_throw_adhoc(tc, "No matching continuation reset found"); if (!root_frame) MVM_exception_throw_adhoc(tc, "No continuation root frame found"); /* Create continuation. */ MVMROOT(tc, code, { cont = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContinuation); ((MVMContinuation *)cont)->body.top = MVM_frame_inc_ref(tc, tc->cur_frame); ((MVMContinuation *)cont)->body.addr = *tc->interp_cur_op; ((MVMContinuation *)cont)->body.res_reg = res_reg; ((MVMContinuation *)cont)->body.root = MVM_frame_inc_ref(tc, root_frame); if (tc->instance->profiling) ((MVMContinuation *)cont)->body.prof_cont = MVM_profile_log_continuation_control(tc, root_frame); }); /* Save and clear any active exception handler(s) added since reset. */ if (tc->active_handlers != tag_record->active_handlers) { MVMActiveHandler *ah = tc->active_handlers; while (ah) { if (ah->next_handler == tag_record->active_handlers) { /* Found the handler at the point of reset. Slice off the more * recent ones. */ ((MVMContinuation *)cont)->body.active_handlers = tc->active_handlers; tc->active_handlers = ah->next_handler; ah->next_handler = NULL; break; } ah = ah->next_handler; } } /* Move back to the frame with the reset in it (which is already on the * call stack, so has a "I'm running" ref count already). Frames from the * current one through to the root are no longer running, so get their * reference count decremented by 1 as a result. */ while (tc->cur_frame != jump_frame) { MVM_frame_dec_ref(tc, tc->cur_frame); tc->cur_frame = tc->cur_frame->caller; } *(tc->interp_cur_op) = tc->cur_frame->return_address; *(tc->interp_bytecode_start) = tc->cur_frame->effective_bytecode; *(tc->interp_reg_base) = tc->cur_frame->work; *(tc->interp_cu) = tc->cur_frame->static_info->body.cu; /* Clear special return handler, given we didn't just fall out of the * reset. */ tc->cur_frame->special_return = NULL; tc->cur_frame->special_return_data = NULL; /* If we're not protecting the follow-up call, remove the tag record. */ if (!protect) clear_tag(tc, tag_record); /* Invoke specified code, passing the continuation. We return to * interpreter to run this, which then returns control to the * original reset or invoke. */ code = MVM_frame_find_invokee(tc, code, NULL); inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, tc->cur_frame->return_value, tc->cur_frame->return_type, inv_arg_callsite); tc->cur_frame->args[0].o = cont; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } void MVM_continuation_invoke(MVMThreadContext *tc, MVMContinuation *cont, MVMObject *code, MVMRegister *res_reg) { /* Switch caller of the root to current invoker. */ MVMFrame *orig_caller = cont->body.root->caller; cont->body.root->caller = MVM_frame_inc_ref(tc, tc->cur_frame); MVM_frame_dec_ref(tc, orig_caller); /* Set up current frame to receive result. */ tc->cur_frame->return_value = res_reg; tc->cur_frame->return_type = MVM_RETURN_OBJ; tc->cur_frame->return_address = *(tc->interp_cur_op); /* Switch to the target frame; bump ref count of all frames we just added * back into the call chain as they are active again. */ tc->cur_frame = cont->body.top; { MVMFrame *cur = tc->cur_frame; MVMFrame *stop = cont->body.root->caller; while (cur != stop) { MVM_frame_inc_ref(tc, cur); cur = cur->caller; } } *(tc->interp_cur_op) = cont->body.addr; *(tc->interp_bytecode_start) = tc->cur_frame->effective_bytecode; *(tc->interp_reg_base) = tc->cur_frame->work; *(tc->interp_cu) = tc->cur_frame->static_info->body.cu; /* Put saved active handlers list in place. */ /* TODO: if we really need to support double-shot, this needs a re-visit. * As it is, Rakudo's gather/take only needs single-invoke continuations, * so we'll punt on the issue for now. */ if (cont->body.active_handlers) { MVMActiveHandler *ah = cont->body.active_handlers; while (ah->next_handler) ah = ah->next_handler; ah->next_handler = tc->active_handlers; tc->active_handlers = cont->body.active_handlers; cont->body.active_handlers = NULL; } /* If we're profiling, get it back in sync. */ if (cont->body.prof_cont && tc->instance->profiling) MVM_profile_log_continuation_invoke(tc, cont->body.prof_cont); /* Provided we have it, invoke the specified code, putting its result in * the specified result register. Otherwise, put a NULL there. */ if (MVM_is_null(tc, code)) { cont->body.res_reg->o = tc->instance->VMNull; } else { MVMCallsite *null_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS); code = MVM_frame_find_invokee(tc, code, NULL); MVM_args_setup_thunk(tc, cont->body.res_reg, MVM_RETURN_OBJ, null_args_callsite); STABLE(code)->invoke(tc, code, null_args_callsite, tc->cur_frame->args); } } MVMContinuation * MVM_continuation_clone(MVMThreadContext *tc, MVMContinuation *cont) { MVMContinuation *result; MVMFrame *cur_to_clone = NULL; MVMFrame *last_clone = NULL; MVMFrame *cloned_top = NULL; MVMFrame *cloned_root = NULL; /* Allocate resulting continuation. We do this before cloning frames, as * doing it after could cause them to contain stale memory addresses. */ MVMROOT(tc, cont, { result = (MVMContinuation *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContinuation); }); /* Clone all the frames. */ cur_to_clone = cont->body.top; while (!cloned_root) { MVMFrame *clone = MVM_frame_clone(tc, cur_to_clone); if (!cloned_top) cloned_top = clone; if (cur_to_clone == cont->body.root) cloned_root = clone; if (last_clone) last_clone->caller = clone; last_clone = clone; cur_to_clone = cur_to_clone->caller; } /* Increment ref-count of caller of root, since there's now an extra * frame pointing at it. */ MVM_frame_inc_ref(tc, cloned_root->caller); /* Set up the new continuation. */ result->body.top = cloned_top; result->body.addr = cont->body.addr; result->body.res_reg = cont->body.res_reg; result->body.root = cloned_root; return result; } MoarVM-2015.11/src/core/continuation.h0000644000175000017500000000104612456307241016457 0ustar jnthnjnthnvoid MVM_continuation_reset(MVMThreadContext *tc, MVMObject *tag, MVMObject *code, MVMRegister *res_reg); void MVM_continuation_control(MVMThreadContext *tc, MVMint64 protect, MVMObject *tag, MVMObject *code, MVMRegister *res_reg); void MVM_continuation_invoke(MVMThreadContext *tc, MVMContinuation *cont, MVMObject *code, MVMRegister *res_reg); MVMContinuation * MVM_continuation_clone(MVMThreadContext *tc, MVMContinuation *cont); MoarVM-2015.11/src/core/dll.c0000644000175000017500000000726312623370227014522 0ustar jnthnjnthn#include "moar.h" int MVM_dll_load(MVMThreadContext *tc, MVMString *name, MVMString *path) { MVMDLLRegistry *entry; char *cpath; DLLib *lib; MVM_string_flatten(tc, name); uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_HASH_GET(tc, tc->instance->dll_registry, name, entry); /* already loaded */ if (entry && entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 0; } MVMROOT(tc, name, { MVMROOT(tc, path, { path = MVM_file_in_libpath(tc, path); }); }); cpath = MVM_string_utf8_c8_encode_C_string(tc, path); lib = MVM_nativecall_load_lib(cpath); if (!lib) { char *waste[] = { cpath, NULL }; uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc_free(tc, waste, "failed to load library '%s'", cpath); } MVM_free(cpath); if (!entry) { entry = MVM_malloc(sizeof *entry); entry->name = name; entry->refcount = 0; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); MVM_HASH_BIND(tc, tc->instance->dll_registry, name, entry); } entry->lib = lib; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 1; } int MVM_dll_free(MVMThreadContext *tc, MVMString *name) { MVMDLLRegistry *entry; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->dll_registry, name, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot free non-existent library"); } /* already freed */ if (!entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 0; } if (entry->refcount > 0) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot free in-use library"); } MVM_nativecall_free_lib(entry->lib); entry->lib = NULL; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 1; } MVMObject * MVM_dll_find_symbol(MVMThreadContext *tc, MVMString *lib, MVMString *sym) { MVMDLLRegistry *entry; MVMDLLSym *obj; char *csym; void *address; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_string_flatten(tc, lib); MVM_HASH_GET(tc, tc->instance->dll_registry, lib, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot find symbol in non-existent library"); } if (!entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot find symbol in unloaded library"); } csym = MVM_string_utf8_c8_encode_C_string(tc, sym); address = MVM_nativecall_find_sym(entry->lib, csym); MVM_free(csym); if (!address) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return NULL; } obj = (MVMDLLSym *)MVM_repr_alloc_init(tc, tc->instance->raw_types.RawDLLSym); obj->body.address = address; obj->body.dll = entry; entry->refcount++; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return (MVMObject *)obj; } void MVM_dll_drop_symbol(MVMThreadContext *tc, MVMObject *obj) { MVMDLLSym *sym; MVMDLLRegistry *dll; if (REPR(obj)->ID != MVM_REPR_ID_MVMDLLSym) MVM_exception_throw_adhoc(tc, "unexpected object with REPR other than MVMDLLSym"); sym = (MVMDLLSym *)obj; dll = sym->body.dll; if (!dll) return; MVM_decr(&dll->refcount); sym->body.address = NULL; sym->body.dll = NULL; } MoarVM-2015.11/src/core/dll.h0000644000175000017500000000061612456307241014522 0ustar jnthnjnthnstruct MVMDLLRegistry { DLLib *lib; MVMString *name; AO_t refcount; UT_hash_handle hash_handle; }; int MVM_dll_load(MVMThreadContext *tc, MVMString *name, MVMString *path); int MVM_dll_free(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_dll_find_symbol(MVMThreadContext *tc, MVMString *lib, MVMString *sym); void MVM_dll_drop_symbol(MVMThreadContext *tc, MVMObject *obj); MoarVM-2015.11/src/core/exceptions.c0000644000175000017500000007611512573775575016155 0ustar jnthnjnthn#include "moar.h" #include #ifdef _MSC_VER #define snprintf _snprintf #define vsnprintf _vsnprintf #endif static int crash_on_error = 0; /* Maps ID of exception category to its name. */ static const char * cat_name(MVMThreadContext *tc, MVMint32 cat) { switch (cat) { case MVM_EX_CAT_CATCH: return "catch"; case MVM_EX_CAT_CONTROL: return "control"; case MVM_EX_CAT_NEXT: return "next"; case MVM_EX_CAT_REDO: return "redo"; case MVM_EX_CAT_LAST: return "last"; case MVM_EX_CAT_RETURN: return "return"; case MVM_EX_CAT_TAKE: return "take"; case MVM_EX_CAT_WARN: return "warn"; case MVM_EX_CAT_SUCCEED: return "succeed"; case MVM_EX_CAT_PROCEED: return "proceed"; case MVM_EX_CAT_NEXT | MVM_EX_CAT_LABELED: return "next_label"; case MVM_EX_CAT_REDO | MVM_EX_CAT_LABELED: return "redo_label"; case MVM_EX_CAT_LAST | MVM_EX_CAT_LABELED: return "last_label"; default: return "unknown"; } } /* Checks if an exception handler is already on the active handler stack, * so we don't re-trigger the same exception handler. Note: We have static * handlers that get reused, so also check for the same handler being in * the same frame, otherwise we consider the handler as being another one. */ static MVMuint8 in_handler_stack(MVMThreadContext *tc, MVMFrameHandler *fh, MVMFrame *f) { if (tc->active_handlers) { MVMActiveHandler *ah = tc->active_handlers; while (ah) { if (ah->handler == fh && ah->frame == f) return 1; ah = ah->next_handler; } } return 0; } /* Checks if a frame is still active. Naively, we could scan the call stack * for it, but we can use the same thing the GC uses to know if to scan the * work area. */ static MVMuint8 in_caller_chain(MVMThreadContext *tc, MVMFrame *f_maybe) { return f_maybe->tc ? 1 : 0; } /* Information about a located handler. */ typedef struct { MVMFrame *frame; MVMFrameHandler *handler; MVMJitHandler *jit_handler; } LocatedHandler; static MVMint32 handler_can_handle(MVMFrame *f, MVMFrameHandler *fh, MVMint32 cat, MVMObject *payload) { MVMuint32 category_mask = fh->category_mask; MVMuint64 block_has_label = category_mask & MVM_EX_CAT_LABELED; MVMuint64 block_label = block_has_label ? (MVMuint64)(f->work[fh->label_reg].o) : 0; MVMuint64 thrown_label = payload ? (MVMuint64)payload : 0; MVMuint64 identical_label_found = thrown_label == block_label; return ((cat & category_mask) == cat && (!(cat & MVM_EX_CAT_LABELED) || identical_label_found)) || ((category_mask & MVM_EX_CAT_CONTROL) && cat != MVM_EX_CAT_CATCH); } /* Looks through the handlers of a particular scope, and sees if one will * match what we're looking for. Returns 1 to it if so; if not, * returns 0. */ static MVMint32 search_frame_handlers(MVMThreadContext *tc, MVMFrame *f, MVMuint32 cat, MVMObject *payload, LocatedHandler *lh) { MVMuint32 i; if (f->spesh_cand && f->spesh_cand->jitcode && f->jit_entry_label) { MVMJitHandler *jhs = f->spesh_cand->jitcode->handlers; MVMFrameHandler *fhs = f->effective_handlers; MVMint32 num_handlers = f->spesh_cand->jitcode->num_handlers; void **labels = f->spesh_cand->jitcode->labels; void *cur_label = f->jit_entry_label; for (i = 0; i < num_handlers; i++) { if (!handler_can_handle(f, &fhs[i], cat, payload)) continue; if (cur_label >= labels[jhs[i].start_label] && cur_label <= labels[jhs[i].end_label] && !in_handler_stack(tc, &fhs[i], f)) { lh->handler = &fhs[i]; lh->jit_handler = &jhs[i]; return 1; } } } else { MVMint32 num_handlers = f->spesh_cand ? f->spesh_cand->num_handlers : f->static_info->body.num_handlers; MVMint32 pc; if (f == tc->cur_frame) pc = (MVMuint32)(*tc->interp_cur_op - *tc->interp_bytecode_start); else pc = (MVMuint32)(f->return_address - f->effective_bytecode); for (i = 0; i < num_handlers; i++) { MVMFrameHandler *fh = &f->effective_handlers[i]; if (!handler_can_handle(f, fh, cat, payload)) continue; if (pc >= fh->start_offset && pc <= fh->end_offset && !in_handler_stack(tc, fh, f)) { lh->handler = fh; return 1; } } } return 0; } /* Searches for a handler of the specified category, relative to the given * starting frame, searching according to the chosen mode. */ static LocatedHandler search_for_handler_from(MVMThreadContext *tc, MVMFrame *f, MVMuint8 mode, MVMuint32 cat, MVMObject *payload) { LocatedHandler lh; lh.frame = NULL; lh.handler = NULL; lh.jit_handler = NULL; if (mode == MVM_EX_THROW_LEXOTIC) { while (f != NULL) { lh = search_for_handler_from(tc, f, MVM_EX_THROW_LEX, cat, payload); if (lh.frame != NULL) return lh; f = f->caller; } } else { while (f != NULL) { if (search_frame_handlers(tc, f, cat, payload, &lh)) { lh.frame = f; return lh; } if (mode == MVM_EX_THROW_DYN) { f = f->caller; } else { MVMFrame *f_maybe = f->outer; while (f_maybe != NULL && !in_caller_chain(tc, f_maybe)) f_maybe = f_maybe->outer; f = f_maybe; } } } return lh; } /* Runs an exception handler (which really means updating interpreter state * so that when we return to the runloop, we're in the handler). If there is * an exception object already, it will be used; NULL can be passed if there * is not one, meaning it will be created if needed (based on the category * parameter; if ex_obj is passed, the category is not used). */ static void unwind_after_handler(MVMThreadContext *tc, void *sr_data); static void cleanup_active_handler(MVMThreadContext *tc, void *sr_data); static void run_handler(MVMThreadContext *tc, LocatedHandler lh, MVMObject *ex_obj, MVMuint32 category) { switch (lh.handler->action) { case MVM_EX_ACTION_GOTO: if (lh.jit_handler) { void **labels = lh.frame->spesh_cand->jitcode->labels; MVMuint8 *pc = lh.frame->spesh_cand->jitcode->bytecode; lh.frame->jit_entry_label = labels[lh.jit_handler->goto_label]; MVM_frame_unwind_to(tc, lh.frame, pc, 0, NULL); } else { MVM_frame_unwind_to(tc, lh.frame, NULL, lh.handler->goto_offset, NULL); } break; case MVM_EX_ACTION_INVOKE: { /* Create active handler record. */ MVMActiveHandler *ah = MVM_malloc(sizeof(MVMActiveHandler)); MVMFrame *cur_frame = tc->cur_frame; MVMObject *handler_code; /* Ensure we have an exception object. */ if (ex_obj == NULL) { ex_obj = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); ((MVMException *)ex_obj)->body.category = category; } /* Find frame to invoke. */ handler_code = MVM_frame_find_invokee(tc, lh.frame->work[lh.handler->block_reg].o, NULL); /* Install active handler record. */ ah->frame = MVM_frame_inc_ref(tc, lh.frame); ah->handler = lh.handler; ah->jit_handler = lh.jit_handler; ah->ex_obj = ex_obj; ah->next_handler = tc->active_handlers; tc->active_handlers = ah; /* Set up special return to unwinding after running the * handler. */ cur_frame->return_value = (MVMRegister *)&tc->last_handler_result; cur_frame->return_type = MVM_RETURN_OBJ; cur_frame->special_return = unwind_after_handler; cur_frame->special_unwind = cleanup_active_handler; cur_frame->special_return_data = ah; /* Invoke the handler frame and return to runloop. */ STABLE(handler_code)->invoke(tc, handler_code, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), cur_frame->args); break; } default: MVM_panic(1, "Unimplemented handler action"); } } /* Unwinds after a handler. */ static void unwind_after_handler(MVMThreadContext *tc, void *sr_data) { MVMFrame *frame; MVMException *exception; MVMuint32 goto_offset; MVMuint8 *abs_address; /* Get active handler; sanity check (though it's possible other cases * should be supported). */ MVMActiveHandler *ah = (MVMActiveHandler *)sr_data; if (tc->active_handlers != ah) MVM_panic(1, "Trying to unwind from wrong handler"); /* Grab info we'll need to unwind. */ frame = ah->frame; exception = (MVMException *)ah->ex_obj; if (ah->jit_handler) { void **labels = frame->spesh_cand->jitcode->labels; frame->jit_entry_label = labels[ah->jit_handler->goto_label]; abs_address = frame->spesh_cand->jitcode->bytecode; goto_offset = 0; } else { goto_offset = ah->handler->goto_offset; abs_address = NULL; } /* Clean up. */ tc->active_handlers = ah->next_handler; MVM_frame_dec_ref(tc, ah->frame); MVM_free(ah); /* Do the unwinding as needed. */ if (exception && exception->body.return_after_unwind) { MVM_frame_unwind_to(tc, frame->caller, NULL, 0, tc->last_handler_result); } else { MVM_frame_unwind_to(tc, frame, abs_address, goto_offset, NULL); } } /* Cleans up an active handler record if we unwind over it. */ static void cleanup_active_handler(MVMThreadContext *tc, void *sr_data) { /* Get active handler; sanity check (though it's possible other cases * should be supported). */ MVMActiveHandler *ah = (MVMActiveHandler *)sr_data; if (tc->active_handlers != ah) MVM_panic(1, "Trying to unwind over wrong handler"); /* Clean up. */ tc->active_handlers = ah->next_handler; MVM_frame_dec_ref(tc, ah->frame); MVM_free(ah); } char * MVM_exception_backtrace_line(MVMThreadContext *tc, MVMFrame *cur_frame, MVMuint16 not_top) { MVMString *filename = cur_frame->static_info->body.cu->body.filename; MVMString *name = cur_frame->static_info->body.name; /* XXX TODO: make the caller pass in a char ** and a length pointer so * we can update it if necessary, and the caller can cache it. */ char *o = MVM_malloc(1024); MVMuint8 *cur_op = not_top ? cur_frame->return_address : cur_frame->throw_address; MVMuint32 offset = cur_op - cur_frame->effective_bytecode; MVMuint32 instr = MVM_bytecode_offset_to_instr_idx(tc, cur_frame->static_info, offset); MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &cur_frame->static_info->body, offset > 0 ? offset - 1 : 0); MVMuint32 line_number = annot ? annot->line_number : 1; MVMuint16 string_heap_index = annot ? annot->filename_string_heap_index : 0; char *tmp1 = annot && string_heap_index < cur_frame->static_info->body.cu->body.num_strings ? MVM_string_utf8_encode_C_string(tc, cur_frame->static_info->body.cu->body.strings[string_heap_index]) : NULL; char *filename_c = filename ? MVM_string_utf8_encode_C_string(tc, filename) : ""; char *name_c = name ? MVM_string_utf8_encode_C_string(tc, name) : ""; /* We may be mid-instruction if exception was thrown at an unfortunate * point; try to cope with that. */ if (instr == MVM_BC_ILLEGAL_OFFSET && offset >= 2) instr = MVM_bytecode_offset_to_instr_idx(tc, cur_frame->static_info, offset - 2); snprintf(o, 1024, " %s %s:%u (%s:%s:%u)", not_top ? "from" : " at", tmp1 ? tmp1 : "", line_number, filename_c, name_c, instr ); if (filename) MVM_free(filename_c); if (name) MVM_free(name_c); if (tmp1) MVM_free(tmp1); if (annot) MVM_free(annot); return o; } /* Returns a list of hashes containing file, line, sub and annotations. */ MVMObject * MVM_exception_backtrace(MVMThreadContext *tc, MVMObject *ex_obj) { MVMFrame *cur_frame; MVMObject *arr = NULL, *annotations = NULL, *row = NULL, *value = NULL; MVMuint32 count = 0; MVMString *k_file = NULL, *k_line = NULL, *k_sub = NULL, *k_anno = NULL; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) cur_frame = ((MVMException *)ex_obj)->body.origin; else MVM_exception_throw_adhoc(tc, "Op 'backtrace' needs an exception object"); MVM_gc_root_temp_push(tc, (MVMCollectable **)&arr); MVM_gc_root_temp_push(tc, (MVMCollectable **)&annotations); MVM_gc_root_temp_push(tc, (MVMCollectable **)&row); MVM_gc_root_temp_push(tc, (MVMCollectable **)&value); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_file); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_line); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_sub); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_anno); k_file = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "file"); k_line = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "line"); k_sub = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "sub"); k_anno = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "annotations"); arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); while (cur_frame != NULL) { MVMuint8 *cur_op = count ? cur_frame->return_address : cur_frame->throw_address; MVMuint32 offset = cur_op - cur_frame->effective_bytecode; MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &cur_frame->static_info->body, offset > 0 ? offset - 1 : 0); MVMint32 fshi = annot ? (MVMint32)annot->filename_string_heap_index : -1; char *line_number = MVM_malloc(16); snprintf(line_number, 16, "%d", annot ? annot->line_number : 1); /* annotations hash will contain "file" and "line" */ annotations = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* file */ if (fshi >= 0 && fshi < cur_frame->static_info->body.cu->body.num_strings) value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, cur_frame->static_info->body.cu->body.strings[fshi]); else value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, cur_frame->static_info->body.cu->body.filename); MVM_repr_bind_key_o(tc, annotations, k_file, value); /* line */ value = (MVMObject *)MVM_string_ascii_decode_nt(tc, tc->instance->VMString, line_number); value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, (MVMString *)value); MVM_repr_bind_key_o(tc, annotations, k_line, value); MVM_free(line_number); /* row will contain "sub" and "annotations" */ row = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVM_repr_bind_key_o(tc, row, k_sub, cur_frame->code_ref); MVM_repr_bind_key_o(tc, row, k_anno, annotations); MVM_repr_push_o(tc, arr, row); MVM_free(annot); cur_frame = cur_frame->caller; while (cur_frame && cur_frame->static_info->body.is_thunk) cur_frame = cur_frame->caller; count++; } MVM_gc_root_temp_pop_n(tc, 8); return arr; } /* Returns the lines (backtrace) of an exception-object as an array. */ MVMObject * MVM_exception_backtrace_strings(MVMThreadContext *tc, MVMObject *ex_obj) { MVMException *ex; MVMFrame *cur_frame; MVMObject *arr; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Op 'backtracestrings' needs an exception object"); cur_frame = ex->body.origin; arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMROOT(tc, arr, { MVMuint32 count = 0; while (cur_frame != NULL) { char *line = MVM_exception_backtrace_line(tc, cur_frame, count++); MVMString *line_str = MVM_string_utf8_decode(tc, tc->instance->VMString, line, strlen(line)); MVMObject *line_obj = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, line_str); MVM_repr_push_o(tc, arr, line_obj); cur_frame = cur_frame->caller; MVM_free(line); } }); return arr; } /* Dumps a backtrace relative to the current frame to stderr. */ void MVM_dump_backtrace(MVMThreadContext *tc) { MVMFrame *cur_frame = tc->cur_frame; MVMuint32 count = 0; while (cur_frame != NULL) { char *line = MVM_exception_backtrace_line(tc, cur_frame, count++); fprintf(stderr, "%s\n", line); MVM_free(line); cur_frame = cur_frame->caller; } } /* Panic over an unhandled exception throw by category. */ static void panic_unhandled_cat(MVMThreadContext *tc, MVMuint32 cat) { /* If it's a control exception, try promoting it to a catch one. */ if (cat != MVM_EX_CAT_CATCH) { MVM_exception_throw_adhoc(tc, "No exception handler located for %s", cat_name(tc, cat)); } else { fprintf(stderr, "No exception handler located for %s\n", cat_name(tc, cat)); MVM_dump_backtrace(tc); if (crash_on_error) abort(); else exit(1); } } /* Panic over an unhandled exception object. */ static void panic_unhandled_ex(MVMThreadContext *tc, MVMException *ex) { char *backtrace; /* If it's a control exception, try promoting it to a catch one; use * the category name. */ if (ex->body.category != MVM_EX_CAT_CATCH) panic_unhandled_cat(tc, ex->body.category); /* If there's no message, fall back to category also. */ if (!ex->body.message) panic_unhandled_cat(tc, ex->body.category); /* Otherwise, dump message and a backtrace. */ backtrace = MVM_string_utf8_encode_C_string(tc, ex->body.message); fprintf(stderr, "Unhandled exception: %s\n", backtrace); MVM_free(backtrace); MVM_dump_backtrace(tc); if (crash_on_error) abort(); else exit(1); } /* Throws an exception by category, searching for a handler according to * the specified mode. If the handler resumes, the resumption result will * be put into resume_result. Leaves the interpreter in a state where it * will next run the instruction of the handler. If there is no handler, * it will panic and exit with a backtrace. */ void MVM_exception_throwcat(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMRegister *resume_result) { LocatedHandler lh = search_for_handler_from(tc, tc->cur_frame, mode, cat, NULL); if (lh.frame == NULL) panic_unhandled_cat(tc, cat); run_handler(tc, lh, NULL, cat); } void MVM_exception_die(MVMThreadContext *tc, MVMString *str, MVMRegister *rr) { MVMException *ex = (MVMException *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); ex->body.category = MVM_EX_CAT_CATCH; MVM_ASSIGN_REF(tc, &(ex->common.header), ex->body.message, str); MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, (MVMObject *)ex, rr); } /* Throws the specified exception object, taking the category from it. If * the handler resumes, the resumption result will be put into resume_result. * Leaves the interpreter in a state where it will next run the instruction of * the handler. If there is no handler, it will panic and exit with a backtrace. */ void MVM_exception_throwobj(MVMThreadContext *tc, MVMuint8 mode, MVMObject *ex_obj, MVMRegister *resume_result) { LocatedHandler lh; MVMException *ex; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Can only throw an exception object"); if (!ex->body.category) ex->body.category = MVM_EX_CAT_CATCH; if (resume_result) { ex->body.resume_addr = *tc->interp_cur_op; /* Ensure that the jit resume label is stored. The throwish * control guard should ensure that the jit entry label point to * a position just after throwing. */ ex->body.jit_resume_label = tc->cur_frame->jit_entry_label; } lh = search_for_handler_from(tc, tc->cur_frame, mode, ex->body.category, ex->body.payload); if (lh.frame == NULL) panic_unhandled_ex(tc, ex); if (!ex->body.origin) { ex->body.origin = MVM_frame_inc_ref(tc, tc->cur_frame); tc->cur_frame->throw_address = *(tc->interp_cur_op); tc->cur_frame->keep_caller = 1; } run_handler(tc, lh, ex_obj, 0); } void MVM_exception_resume(MVMThreadContext *tc, MVMObject *ex_obj) { MVMException *ex; MVMFrame *target; MVMActiveHandler *ah; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Can only resume an exception object"); /* Check that everything is in place to do the resumption. */ if (!ex->body.resume_addr) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); target = ex->body.origin; if (!target) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); if (target->special_return != unwind_after_handler) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); if (!target->tc) MVM_exception_throw_adhoc(tc, "Too late to resume this exception"); /* Check that this is the exception we're currently handling. */ if (!tc->active_handlers) MVM_exception_throw_adhoc(tc, "Can only resume an exception in its handler"); if (tc->active_handlers->ex_obj != ex_obj) MVM_exception_throw_adhoc(tc, "Can only resume the current exception"); /* Clear special return handler; we'll do its work here. */ target->special_return = NULL; target->special_unwind = NULL; /* Clear the current active handler. */ ah = tc->active_handlers; tc->active_handlers = ah->next_handler; MVM_frame_dec_ref(tc, ah->frame); MVM_free(ah); /* Unwind to the thrower of the exception; set PC and jit entry label. */ target->jit_entry_label = ex->body.jit_resume_label; MVM_frame_unwind_to(tc, target, ex->body.resume_addr, 0, NULL); } static MVMObject* get_lexotic_for_handler_idx(MVMThreadContext *tc, MVMint32 handler_idx) { MVMLexotic *lexotic; MVMStaticFrame *sf = tc->cur_frame->static_info; /* See if we've got this lexotic cached; return it if so. */ if (sf->body.pool_index < tc->lexotic_cache_size) { lexotic = tc->lexotic_cache[sf->body.pool_index]; if (lexotic && lexotic->body.handler_idx == handler_idx) return (MVMObject *)lexotic; } /* Allocate lexotic object, set it up, and cache it. */ MVMROOT(tc, sf, { lexotic = (MVMLexotic *)MVM_repr_alloc_init(tc, tc->instance->Lexotic); }); lexotic->body.handler_idx = handler_idx; MVM_ASSIGN_REF(tc, &(lexotic->common.header), lexotic->body.sf, sf); if (sf->body.pool_index >= tc->lexotic_cache_size) { MVMuint32 orig_size = tc->lexotic_cache_size; tc->lexotic_cache_size = sf->body.pool_index + 1; tc->lexotic_cache = orig_size ? MVM_realloc(tc->lexotic_cache, tc->lexotic_cache_size * sizeof(MVMLexotic *)) : MVM_malloc(tc->lexotic_cache_size * sizeof(MVMLexotic *)); memset(tc->lexotic_cache + orig_size, 0, (tc->lexotic_cache_size - orig_size) * sizeof(MVMLexotic *)); } if (!tc->lexotic_cache[sf->body.pool_index]) tc->lexotic_cache[sf->body.pool_index] = lexotic; return (MVMObject *)lexotic; } /* Creates a new lexotic. */ MVMObject * MVM_exception_newlexotic(MVMThreadContext *tc, MVMuint32 offset) { /* Locate handler associated with the specified label. */ MVMFrame *f = tc->cur_frame; MVMStaticFrame *sf = f->static_info; MVMint32 handler_idx = -1; MVMint32 num_handlers = f->spesh_cand ? f->spesh_cand->num_handlers : sf->body.num_handlers; MVMuint32 i; for (i = 0; i < num_handlers; i++) { if (f->effective_handlers[i].action == MVM_EX_ACTION_GOTO && f->effective_handlers[i].goto_offset == offset) { handler_idx = i; break; } } if (handler_idx < 0) MVM_exception_throw_adhoc(tc, "Label with no handler passed to newlexotic"); return get_lexotic_for_handler_idx(tc, handler_idx); } /* Creates a new lexotic from the JIT. The JIT doesn't have access to * the offset, so we can't find it from within there. */ MVMObject * MVM_exception_newlexotic_from_jit(MVMThreadContext *tc, MVMint32 label) { /* Locate handler associated with the specified label. */ MVMFrame *f = tc->cur_frame; MVMint32 handler_idx = -1; MVMint32 num_handlers = f->spesh_cand->jitcode->num_handlers; MVMJitHandler *handlers = f->spesh_cand->jitcode->handlers; MVMuint32 i; for (i = 0; i < num_handlers; i++) { if (f->effective_handlers[i].action == MVM_EX_ACTION_GOTO && handlers[i].goto_label == label) { handler_idx = i; break; } } if (handler_idx < 0) MVM_exception_throw_adhoc(tc, "Label with no handler passed to newlexotic"); return get_lexotic_for_handler_idx(tc, handler_idx); } /* Unwinds to a lexotic captured handler. */ void MVM_exception_gotolexotic(MVMThreadContext *tc, MVMint32 handler_idx, MVMStaticFrame *sf) { MVMFrame *f, *search; f = NULL; search = tc->cur_frame; while (search) { f = search; while (f) { if (f->static_info == sf) break; f = f->outer; } if (f) break; search = search->caller; } if (f && in_caller_chain(tc, f)) { LocatedHandler lh; lh.frame = f; lh.handler = &(f->effective_handlers[handler_idx]); if (f->spesh_cand && f->spesh_cand->jitcode) lh.jit_handler = &(f->spesh_cand->jitcode->handlers[handler_idx]); else lh.jit_handler = NULL; run_handler(tc, lh, NULL, MVM_EX_CAT_RETURN); } else { MVM_exception_throw_adhoc(tc, "Too late to invoke lexotic return"); } } /* Panics and shuts down the VM. Don't do this unless it's something quite * unrecoverable. * TODO: Some hook for embedders. */ MVM_NO_RETURN void MVM_panic(MVMint32 exitCode, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); vfprintf(stderr, messageFormat, args); va_end(args); fwrite("\n", 1, 1, stderr); if (crash_on_error) abort(); else exit(exitCode); } MVM_NO_RETURN void MVM_panic_allocation_failed(size_t len) { MVM_panic(1, "Memory allocation failed; could not allocate %"MVM_PRSz" bytes", len); } /* A kinder MVM_panic() that doesn't assume our memory is corrupted (but does kill the * process to indicate that we've made an error */ MVM_NO_RETURN void MVM_oops(MVMThreadContext *tc, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); vfprintf(stderr, messageFormat, args); va_end(args); fprintf(stderr, "\n"); MVM_dump_backtrace(tc); fprintf(stderr, "\n"); exit(1); } /* Throws an ad-hoc (untyped) exception. */ MVM_NO_RETURN void MVM_exception_throw_adhoc(MVMThreadContext *tc, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); MVM_exception_throw_adhoc_free_va(tc, NULL, messageFormat, args); va_end(args); } /* Throws an ad-hoc (untyped) exception. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_va(MVMThreadContext *tc, const char *messageFormat, va_list args) { MVM_exception_throw_adhoc_free_va(tc, NULL, messageFormat, args); } /* Throws an ad-hoc (untyped) exception, taking a NULL-terminated array of * char pointers to deallocate after message construction. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_free(MVMThreadContext *tc, char **waste, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); MVM_exception_throw_adhoc_free_va(tc, waste, messageFormat, args); va_end(args); } /* Throws an ad-hoc (untyped) exception, taking a NULL-terminated array of * char pointers to deallocate after message construction. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_free_va(MVMThreadContext *tc, char **waste, const char *messageFormat, va_list args) { LocatedHandler lh; /* Create and set up an exception object. */ MVMException *ex = (MVMException *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); MVMROOT(tc, ex, { char *c_message = MVM_malloc(1024); int bytes = vsnprintf(c_message, 1024, messageFormat, args); MVMString *message = MVM_string_utf8_decode(tc, tc->instance->VMString, c_message, bytes); MVM_free(c_message); /* Clean up after ourselves to avoid leaking C strings. */ if (waste) { while(*waste) MVM_free(*waste++); } MVM_ASSIGN_REF(tc, &(ex->common.header), ex->body.message, message); if (tc->cur_frame) { ex->body.origin = MVM_frame_inc_ref(tc, tc->cur_frame); tc->cur_frame->throw_address = *(tc->interp_cur_op); tc->cur_frame->keep_caller = 1; } else { ex->body.origin = NULL; } ex->body.category = MVM_EX_CAT_CATCH; }); /* Try to locate a handler, so long as we're in the interpreter. */ if (tc->interp_cur_op) lh = search_for_handler_from(tc, tc->cur_frame, MVM_EX_THROW_DYN, ex->body.category, NULL); else lh.frame = NULL; /* Do we have a handler to unwind to? */ if (lh.frame == NULL) { /* No handler. Should we crash on these? */ if (crash_on_error) { /* Yes, abort. */ vfprintf(stderr, messageFormat, args); fwrite("\n", 1, 1, stderr); MVM_dump_backtrace(tc); abort(); } else { /* No, just the usual panic. */ panic_unhandled_ex(tc, ex); } } /* Run the handler, which doesn't actually run it but rather sets up the * interpreter so that when we return to it, we'll be at the handler. */ run_handler(tc, lh, (MVMObject *)ex, MVM_EX_CAT_CATCH); /* Clear any C stack temporaries that code may have pushed before throwing * the exception, and release any needed mutex. */ MVM_gc_root_temp_pop_all(tc); MVM_tc_release_ex_release_mutex(tc); /* Jump back into the interpreter. */ longjmp(tc->interp_jump, 1); } void MVM_crash_on_error(void) { crash_on_error = 1; } MoarVM-2015.11/src/core/exceptions.h0000644000175000017500000001050512573775575016151 0ustar jnthnjnthn/* Exception handler actions. */ #define MVM_EX_ACTION_GOTO 0 #define MVM_EX_ACTION_GOTO_OBJ 1 #define MVM_EX_ACTION_INVOKE 2 /* Exception categories. */ #define MVM_EX_CAT_CATCH 1 #define MVM_EX_CAT_CONTROL 2 #define MVM_EX_CAT_NEXT 4 #define MVM_EX_CAT_REDO 8 #define MVM_EX_CAT_LAST 16 #define MVM_EX_CAT_RETURN 32 #define MVM_EX_CAT_UNWIND 64 #define MVM_EX_CAT_TAKE 128 #define MVM_EX_CAT_WARN 256 #define MVM_EX_CAT_SUCCEED 512 #define MVM_EX_CAT_PROCEED 1024 #define MVM_EX_CAT_LABELED 4096 #define MVM_EX_CAT_AWAIT 8192 #define MVM_EX_CAT_EMIT 16384 #define MVM_EX_CAT_DONE 32768 /* Ways to throw an exception. */ #define MVM_EX_THROW_DYN 0 #define MVM_EX_THROW_LEX 1 #define MVM_EX_THROW_LEXOTIC 2 /* Information associated with an exception handler. */ struct MVMFrameHandler { /* Start offset into the frame's bytecode for the handler, inclusive. */ MVMuint32 start_offset; /* End offset into the frame's bytecode for the handler, exclusive. */ MVMuint32 end_offset; /* Category mask. */ MVMuint32 category_mask; /* The kind of handler it is. */ MVMuint16 action; /* Register containing block to invoke, for invokey handlers. */ MVMuint16 block_reg; /* Offset into the frame's bytecode of the handler, for goto handlers. */ MVMuint32 goto_offset; /* Register containing a label in case we have a labeled loop. We need to * be able to check for its identity when handling e.g. `next LABEL`. */ MVMuint16 label_reg; }; /* An active (currently executing) exception handler. */ struct MVMActiveHandler { /* The frame the handler was found in. */ MVMFrame *frame; /* The handler information itself. */ MVMFrameHandler *handler; /* Handler information for a JITted handler */ MVMJitHandler *jit_handler; /* The exception object. */ MVMObject *ex_obj; /* The next active handler in the chain. */ MVMActiveHandler *next_handler; }; /* Exception related functions. */ MVMObject * MVM_exception_backtrace(MVMThreadContext *tc, MVMObject *ex_obj); MVMObject * MVM_exception_backtrace_strings(MVMThreadContext *tc, MVMObject *exObj); void MVM_dump_backtrace(MVMThreadContext *tc); void MVM_exception_throwcat(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMRegister *resume_result); void MVM_exception_die(MVMThreadContext *tc, MVMString *str, MVMRegister *rr); void MVM_exception_throwobj(MVMThreadContext *tc, MVMuint8 mode, MVMObject *exObj, MVMRegister *resume_result); void MVM_exception_resume(MVMThreadContext *tc, MVMObject *exObj); MVMObject * MVM_exception_newlexotic(MVMThreadContext *tc, MVMuint32 offset); MVMObject * MVM_exception_newlexotic_from_jit(MVMThreadContext *tc, MVMint32 label); void MVM_exception_gotolexotic(MVMThreadContext *tc, MVMint32 handler_idx, MVMStaticFrame *sf); MVM_PUBLIC MVM_NO_RETURN void MVM_panic_allocation_failed(size_t len) MVM_NO_RETURN_GCC; MVM_PUBLIC MVM_NO_RETURN void MVM_panic(MVMint32 exitCode, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_PUBLIC MVM_NO_RETURN void MVM_oops(MVMThreadContext *tc, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_PUBLIC MVM_NO_RETURN void MVM_exception_throw_adhoc(MVMThreadContext *tc, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_NO_RETURN void MVM_exception_throw_adhoc_va(MVMThreadContext *tc, const char *messageFormat, va_list args) MVM_NO_RETURN_GCC; MVM_PUBLIC MVM_NO_RETURN void MVM_exception_throw_adhoc_free(MVMThreadContext *tc, char **waste, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 3, 4); MVM_NO_RETURN void MVM_exception_throw_adhoc_free_va(MVMThreadContext *tc, char **waste, const char *messageFormat, va_list args) MVM_NO_RETURN_GCC; MVM_PUBLIC void MVM_crash_on_error(void); char * MVM_exception_backtrace_line(MVMThreadContext *tc, MVMFrame *cur_frame, MVMuint16 not_top); /* Exit codes for panic. */ #define MVM_exitcode_NYI 12 #define MVM_exitcode_compunit 13 #define MVM_exitcode_invalidopcode 14 #define MVM_exitcode_gcalloc 15 #define MVM_exitcode_gcroots 16 #define MVM_exitcode_gcnursery 17 #define MVM_exitcode_threads 18 #define MVM_exitcode_gcorch 19 MoarVM-2015.11/src/core/ext.c0000644000175000017500000001451012456307241014540 0ustar jnthnjnthn#include "moar.h" int MVM_ext_load(MVMThreadContext *tc, MVMString *lib, MVMString *ext) { MVMString *colon, *prefix, *name; MVMExtRegistry *entry; MVMDLLSym *sym; void (*init)(MVMThreadContext *); MVMROOT(tc, lib, { MVMROOT(tc, ext, { colon = MVM_string_ascii_decode_nt( tc, tc->instance->VMString, ":"); prefix = MVM_string_concatenate(tc, lib, colon); name = MVM_string_concatenate(tc, prefix, ext); }); }); uv_mutex_lock(&tc->instance->mutex_ext_registry); MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->ext_registry, name, entry); /* Extension already loaded. */ if (entry) { uv_mutex_unlock(&tc->instance->mutex_ext_registry); return 0; } MVMROOT(tc, name, { sym = (MVMDLLSym *)MVM_dll_find_symbol(tc, lib, ext); }); if (!sym) { uv_mutex_unlock(&tc->instance->mutex_ext_registry); MVM_exception_throw_adhoc(tc, "extension symbol not found"); } entry = MVM_malloc(sizeof *entry); entry->sym = sym; entry->name = name; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); MVM_HASH_BIND(tc, tc->instance->ext_registry, name, entry); uv_mutex_unlock(&tc->instance->mutex_ext_registry); /* Call extension's initializer */ init = (void (*)(MVMThreadContext *))sym->body.address; init(tc); return 1; } int MVM_ext_register_extop(MVMThreadContext *tc, const char *cname, MVMExtOpFunc func, MVMuint8 num_operands, MVMuint8 operands[], MVMExtOpSpesh *spesh, MVMExtOpFactDiscover *discover, MVMuint32 flags) { MVMExtOpRegistry *entry; MVMString *name = MVM_string_ascii_decode_nt( tc, tc->instance->VMString, cname); uv_mutex_lock(&tc->instance->mutex_extop_registry); MVM_string_flatten(tc, name); MVM_HASH_GET(tc, tc->instance->extop_registry, name, entry); /* Op already registered, so just verify its signature. */ if (entry) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); if (num_operands != entry->info.num_operands || memcmp(operands, entry->info.operands, num_operands) != 0) MVM_exception_throw_adhoc(tc, "signature mismatch when re-registering extension op %s", cname); return 0; } /* Sanity-check signature. */ if (num_operands > MVM_MAX_OPERANDS) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); MVM_exception_throw_adhoc(tc, "cannot register extension op with more than %u operands", MVM_MAX_OPERANDS); } { MVMuint8 i = 0; for(; i < num_operands; i++) { MVMuint8 flags = operands[i]; switch (flags & MVM_operand_rw_mask) { case MVM_operand_literal: goto check_literal; case MVM_operand_read_reg: case MVM_operand_write_reg: case MVM_operand_read_lex: case MVM_operand_write_lex: goto check_reg; default: goto fail; } check_literal: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_coderef: continue; case MVM_operand_ins: case MVM_operand_callsite: default: goto fail; } check_reg: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_obj: case MVM_operand_type_var: continue; default: goto fail; } fail: uv_mutex_unlock(&tc->instance->mutex_extop_registry); MVM_exception_throw_adhoc(tc, "extension op %s has illegal signature", cname); } } entry = MVM_malloc(sizeof *entry); entry->name = name; entry->func = func; entry->info.name = cname; entry->info.opcode = (MVMuint16)-1; entry->info.mark[0] = '.'; entry->info.mark[1] = 'x'; entry->info.num_operands = num_operands; entry->info.pure = flags & MVM_EXTOP_PURE; entry->info.deopt_point = 0; entry->info.no_inline = flags & MVM_EXTOP_NOINLINE; entry->info.jittivity = (flags & MVM_EXTOP_INVOKISH) ? MVM_JIT_INFO_INVOKISH : 0; memcpy(entry->info.operands, operands, num_operands); memset(entry->info.operands + num_operands, 0, MVM_MAX_OPERANDS - num_operands); entry->spesh = spesh; entry->discover = discover; entry->no_jit = flags & MVM_EXTOP_NO_JIT; entry->allocating = flags & MVM_EXTOP_ALLOCATING; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); MVM_HASH_BIND(tc, tc->instance->extop_registry, name, entry); uv_mutex_unlock(&tc->instance->mutex_extop_registry); return 1; } const MVMOpInfo * MVM_ext_resolve_extop_record(MVMThreadContext *tc, MVMExtOpRecord *record) { MVMExtOpRegistry *entry; /* Already resolved. */ if (record->info) return record->info; uv_mutex_lock(&tc->instance->mutex_extop_registry); MVM_string_flatten(tc, record->name); MVM_HASH_GET(tc, tc->instance->extop_registry, record->name, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); return NULL; } /* Resolve record. */ record->info = &entry->info; record->func = entry->func; record->spesh = entry->spesh; record->discover = entry->discover; record->no_jit = entry->no_jit; record->allocating = entry->allocating; uv_mutex_unlock(&tc->instance->mutex_extop_registry); return record->info; } MoarVM-2015.11/src/core/ext.h0000644000175000017500000000234112456307241014544 0ustar jnthnjnthntypedef void MVMExtOpFunc(MVMThreadContext *tc, MVMuint8 *cur_op); typedef void MVMExtOpSpesh(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); typedef void MVMExtOpFactDiscover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins); /* Flags we might put on an extension op to indicate its properties. */ #define MVM_EXTOP_PURE 1 #define MVM_EXTOP_NOINLINE 2 #define MVM_EXTOP_INVOKISH 4 #define MVM_EXTOP_NO_JIT 8 #define MVM_EXTOP_ALLOCATING 16 struct MVMExtRegistry { MVMDLLSym *sym; MVMString *name; UT_hash_handle hash_handle; }; struct MVMExtOpRegistry { MVMString *name; MVMExtOpFunc *func; MVMOpInfo info; MVMExtOpSpesh *spesh; MVMExtOpFactDiscover *discover; MVMuint32 no_jit; MVMuint32 allocating; UT_hash_handle hash_handle; }; int MVM_ext_load(MVMThreadContext *tc, MVMString *lib, MVMString *ext); MVM_PUBLIC int MVM_ext_register_extop(MVMThreadContext *tc, const char *cname, MVMExtOpFunc func, MVMuint8 num_operands, MVMuint8 operands[], MVMExtOpSpesh *spesh, MVMExtOpFactDiscover *discover, MVMuint32 flags); const MVMOpInfo * MVM_ext_resolve_extop_record(MVMThreadContext *tc, MVMExtOpRecord *record); MoarVM-2015.11/src/core/fixedsizealloc.c0000644000175000017500000002622312576610374016760 0ustar jnthnjnthn#include "moar.h" /* The fixed size allocator provides a thread-safe mechanism for getting and * releasing fixed-size chunks of memory. Requests larger blocks from the * operating system, and then allocates out of them. Can certainly be further * improved. The free list works like a stack, so you get the most recently * freed piece of memory of a given size, which should give good cache * behavior. */ /* Turn this on to switch to a mode where we debug by size. */ #define FSA_SIZE_DEBUG 0 #if FSA_SIZE_DEBUG typedef struct { MVMuint64 alloc_size; void *memory; } MVMFixedSizeAllocDebug; #endif /* Creates the allocator data structure with bins. */ MVMFixedSizeAlloc * MVM_fixed_size_create(MVMThreadContext *tc) { int init_stat; MVMFixedSizeAlloc *al = MVM_malloc(sizeof(MVMFixedSizeAlloc)); al->size_classes = MVM_calloc(MVM_FSA_BINS, sizeof(MVMFixedSizeAllocSizeClass)); if ((init_stat = uv_mutex_init(&(al->complex_alloc_mutex))) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); al->freelist_spin = 0; al->free_at_next_safepoint_overflows = NULL; return al; } /* Determine the bin. If we hit a bin exactly then it's off-by-one, * since the bins list is base-0. Otherwise we've some extra bits, * which round us up to the next bin, but that's a no-op. */ static MVMuint32 bin_for(size_t bytes) { MVMuint32 bin = (MVMuint32)(bytes >> MVM_FSA_BIN_BITS); if ((bytes & MVM_FSA_BIN_MASK) == 0) bin--; return bin; } /* Sets up a size class bin in the second generation. */ static void setup_bin(MVMFixedSizeAlloc *al, MVMuint32 bin) { /* Work out page size we want. */ MVMuint32 page_size = MVM_FSA_PAGE_ITEMS * ((bin + 1) << MVM_FSA_BIN_BITS); /* We'll just allocate a single page to start off with. */ al->size_classes[bin].num_pages = 1; al->size_classes[bin].pages = MVM_malloc(sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[0] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[0]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; } /* Adds a new page to a size class bin. */ static void add_page(MVMFixedSizeAlloc *al, MVMuint32 bin) { /* Work out page size. */ MVMuint32 page_size = MVM_FSA_PAGE_ITEMS * ((bin + 1) << MVM_FSA_BIN_BITS); /* Add the extra page. */ MVMuint32 cur_page = al->size_classes[bin].num_pages; al->size_classes[bin].num_pages++; al->size_classes[bin].pages = MVM_realloc(al->size_classes[bin].pages, sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[cur_page] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[cur_page]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* set the cur_page to a proper value */ al->size_classes[bin].cur_page = cur_page; } /* Allocates a piece of memory of the specified size, using the FSA. */ static void * alloc_slow_path(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMuint32 bin) { void *result; /* Lock, unless single-threaded. */ MVMint32 lock = MVM_instance_have_user_threads(tc); if (lock) uv_mutex_lock(&(al->complex_alloc_mutex)); /* If we've no pages yet, never encountered this bin; set it up. */ if (al->size_classes[bin].pages == NULL) setup_bin(al, bin); /* If we're at the page limit, add a new page. */ if (al->size_classes[bin].alloc_pos == al->size_classes[bin].alloc_limit) add_page(al, bin); /* Now we can allocate. */ result = (void *)al->size_classes[bin].alloc_pos; al->size_classes[bin].alloc_pos += (bin + 1) << MVM_FSA_BIN_BITS; /* Unlock if we locked. */ if (lock) uv_mutex_unlock(&(al->complex_alloc_mutex)); return result; } void * MVM_fixed_size_alloc(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = MVM_malloc(bytes + sizeof(MVMuint64)); dbg->alloc_size = bytes; return &(dbg->memory); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Try and take from the free list (fast path). */ MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *fle; if (MVM_instance_have_user_threads(tc)) { /* Multi-threaded; take a lock. Note that the lock is needed in * addition to the atomic operations: the atomics allow us to add * to the free list in a lock-free way, and the lock allows us to * avoid the ABA issue we'd have with only the atomics. */ while (!MVM_trycas(&(al->freelist_spin), 0, 1)) { MVMint32 i = 0; while (i < 1024) i++; } do { fle = bin_ptr->free_list; if (!fle) break; } while (!MVM_trycas(&(bin_ptr->free_list), fle, fle->next)); MVM_barrier(); al->freelist_spin = 0; } else { /* Single-threaded; just take it. */ fle = bin_ptr->free_list; if (fle) bin_ptr->free_list = fle->next; } if (fle) return (void *)fle; /* Failed to take from free list; slow path with the lock. */ return alloc_slow_path(tc, al, bin); } else { return MVM_malloc(bytes); } #endif } /* Allocates a piece of memory of the specified size, using the FSA. Promises * it will be zeroed. */ void * MVM_fixed_size_alloc_zeroed(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes) { void *allocd = MVM_fixed_size_alloc(tc, al, bytes); memset(allocd, 0, bytes); return allocd; } /* Frees a piece of memory of the specified size, using the FSA. */ static void add_to_bin_freelist(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMint32 bin, void *to_free) { /* Came from a bin; put into free list. */ MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *to_add = (MVMFixedSizeAllocFreeListEntry *)to_free; MVMFixedSizeAllocFreeListEntry *orig; if (MVM_instance_have_user_threads(tc)) { /* Multi-threaded; race to add it. */ do { orig = bin_ptr->free_list; to_add->next = orig; } while (!MVM_trycas(&(bin_ptr->free_list), orig, to_add)); } else { /* Single-threaded; just add it. */ to_add->next = bin_ptr->free_list; bin_ptr->free_list = to_add; } } void MVM_fixed_size_free(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes, void *to_free) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = (MVMFixedSizeAllocDebug *)((char *)to_free - 8); if (dbg->alloc_size != bytes) MVM_panic(1, "Fixed size allocator: wrong size in free"); MVM_free(dbg); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Add to freelist chained through a bin. */ add_to_bin_freelist(tc, al, bin, to_free); } else { /* Was malloc'd due to being oversize, so just free it. */ MVM_free(to_free); } #endif } /* Race to add to the "free at next safe point" overflows list. */ static void add_to_overflows_safepoint_free_list(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void *to_free) { MVMFixedSizeAllocSafepointFreeListEntry *orig; MVMFixedSizeAllocSafepointFreeListEntry *to_add = MVM_fixed_size_alloc( tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry)); to_add->to_free = to_free; do { orig = al->free_at_next_safepoint_overflows; to_add->next = orig; } while (!MVM_trycas(&(al->free_at_next_safepoint_overflows), orig, to_add)); } /* Queues a piece of memory of the specified size to be freed at the next * global safe point, using the FSA. A global safe point is defined as one in * which all threads, since we requested the freeing of the memory, have * reached a safe point. */ void MVM_fixed_size_free_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes, void *to_free) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = (MVMFixedSizeAllocDebug *)((char *)to_free - 8); if (dbg->alloc_size != bytes) MVM_panic(1, "Fixed size allocator: wrong size in free"); if (MVM_instance_have_user_threads(tc)) add_to_overflows_safepoint_free_list(tc, al, dbg); else MVM_free(dbg); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Came from a bin; put into free list. */ MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *to_add = (MVMFixedSizeAllocFreeListEntry *)to_free; if (MVM_instance_have_user_threads(tc)) { /* Multi-threaded; race to add it to the "free at next safe point" * list. */ MVMFixedSizeAllocSafepointFreeListEntry *orig; MVMFixedSizeAllocSafepointFreeListEntry *to_add = MVM_fixed_size_alloc( tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry)); to_add->to_free = to_free; do { orig = bin_ptr->free_at_next_safepoint_list; to_add->next = orig; } while (!MVM_trycas(&(bin_ptr->free_at_next_safepoint_list), orig, to_add)); } else { /* Single-threaded, so no global safepoint issues to care for; put * it on the free list right away. */ MVMFixedSizeAllocFreeListEntry *to_add = (MVMFixedSizeAllocFreeListEntry *)to_free; to_add->next = bin_ptr->free_list; bin_ptr->free_list = to_add; } } else { /* Was malloc'd due to being oversize. */ if (MVM_instance_have_user_threads(tc)) add_to_overflows_safepoint_free_list(tc, al, to_free); else MVM_free(to_free); } #endif } /* Called when we're at a safepoint, to free everything queued up to be freed * at the next safepoint. Assumes that it is only called on one thread at a * time, while the world is stopped. */ void MVM_fixed_size_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al) { /* Go through bins and process any safepoint free lists. */ MVMFixedSizeAllocSafepointFreeListEntry *cur, *next; MVMint32 bin; for (bin = 0; bin < MVM_FSA_BINS; bin++) { cur = al->size_classes[bin].free_at_next_safepoint_list; while (cur) { next = cur->next; add_to_bin_freelist(tc, al, bin, cur->to_free); MVM_fixed_size_free(tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry), cur); cur = next; } al->size_classes[bin].free_at_next_safepoint_list = NULL; } /* Free overflows. */ cur = al->free_at_next_safepoint_overflows; while (cur) { next = cur->next; MVM_free(cur->to_free); MVM_fixed_size_free(tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry), cur); cur = next; } al->free_at_next_safepoint_overflows = NULL; } MoarVM-2015.11/src/core/fixedsizealloc.h0000644000175000017500000000637212617121315016754 0ustar jnthnjnthn/* The top-level data structure for the fixed size allocator. */ struct MVMFixedSizeAlloc { /* Size classes for the fixed size allocator. Each one represents a bunch * of objects of the same size. The allocated sizes are rounded and then * one of these buckets is used (more size classes are allocated if a * need arises). */ MVMFixedSizeAllocSizeClass *size_classes; /* Spin lock used for reading from the free list, to avoid ABA. */ AO_t freelist_spin; /* Mutex for when we can't do a cheap/simple allocation. */ uv_mutex_t complex_alloc_mutex; /* Head of the "free at next safepoint" list of overflows (that is, * items that don't fit in a fixed size allocator bin). */ MVMFixedSizeAllocSafepointFreeListEntry *free_at_next_safepoint_overflows; }; /* Free list entry. Must be no bigger than the smallest size class. */ struct MVMFixedSizeAllocFreeListEntry { void *next; }; /* Entry in the "free at next safe point" linked list. */ struct MVMFixedSizeAllocSafepointFreeListEntry { void *to_free; MVMFixedSizeAllocSafepointFreeListEntry *next; }; /* Pages of objects of a particular size class. */ struct MVMFixedSizeAllocSizeClass { /* Each page holds allocated chunks of memory. */ char **pages; /* Head of the free list. */ MVMFixedSizeAllocFreeListEntry *free_list; /* The current allocation position if we've nothing on the * free list. */ char *alloc_pos; /* The current page allocation limit (once we hit this, we need * to go to the next page) Also just used when no free list. */ char *alloc_limit; /* The current page number that we're allocating in. */ MVMuint32 cur_page; /* The number of pages allocated. */ MVMuint32 num_pages; /* Head of the "free at next safepoint" list. */ MVMFixedSizeAllocSafepointFreeListEntry *free_at_next_safepoint_list; }; /* The number of bits we discard from the requested size when binning * the allocation request into a size class. For example, if this is * 3 bits then: * Request for 2 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 4 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 8 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 12 bytes ==> bin 1 (objects 9 - 16 bytes) * Request for 16 bytes ==> bin 1 (objects 9 - 16 bytes) */ #define MVM_FSA_BIN_BITS 3 /* Mask used to know if we hit a size class exactly or have to round up. */ #define MVM_FSA_BIN_MASK ((1 << MVM_FSA_BIN_BITS) - 1) /* Number of bins in the FSA. Beyond this, we just degrade to malloc/free. */ #define MVM_FSA_BINS 96 /* The number of items that go into each page. */ #define MVM_FSA_PAGE_ITEMS 128 /* Functions. */ MVMFixedSizeAlloc * MVM_fixed_size_create(MVMThreadContext *tc); void * MVM_fixed_size_alloc(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes); void * MVM_fixed_size_alloc_zeroed(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes); void MVM_fixed_size_free(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes, void *free); void MVM_fixed_size_free_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes, void *free); void MVM_fixed_size_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al); MoarVM-2015.11/src/core/frame.c0000644000175000017500000020720112623370227015033 0ustar jnthnjnthn#include "moar.h" /* Takes a static frame and does various one-off calculations about what * space it shall need. Also triggers bytecode verification of the frame's * bytecode. */ static void prepare_and_verify_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame) { MVMStaticFrameBody *static_frame_body = &static_frame->body; MVMCompUnit *cu = static_frame_body->cu; /* Ensure the frame is fully deserialized. */ if (!static_frame_body->fully_deserialized) MVM_bytecode_finish_frame(tc, cu, static_frame, 0); /* Take compilation unit lock, to make sure we don't race to do the * frame preparation/verification work. */ MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.update_mutex); if (static_frame->body.instrumentation_level == 0) { /* Work size is number of locals/registers plus size of the maximum * call site argument list. */ static_frame_body->work_size = sizeof(MVMRegister) * (static_frame_body->num_locals + static_frame_body->cu->body.max_callsite_size); /* Validate the bytecode. */ MVM_validate_static_frame(tc, static_frame); /* Obtain an index to each threadcontext's lexotic pool table */ static_frame_body->pool_index = MVM_incr(&tc->instance->num_frames_run); /* Check if we have any state var lexicals. */ if (static_frame_body->static_env_flags) { MVMuint8 *flags = static_frame_body->static_env_flags; MVMint64 numlex = static_frame_body->num_lexicals; MVMint64 i; for (i = 0; i < numlex; i++) if (flags[i] == 2) { static_frame_body->has_state_vars = 1; break; } } /* Set its spesh threshold. */ static_frame_body->spesh_threshold = MVM_spesh_threshold(tc, static_frame); } /* Unlock, now we're finished. */ MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.update_mutex); } /* When we don't match the current instrumentation level, we hit this. It may * simply be that we never invoked the frame, in which case we prepare and * verify it. It may also be because we need to instrument the code for * profiling. */ static void instrumentation_level_barrier(MVMThreadContext *tc, MVMStaticFrame *static_frame) { /* Prepare and verify if needed. */ if (static_frame->body.instrumentation_level == 0) prepare_and_verify_static_frame(tc, static_frame); /* Mark frame as being at the current instrumentation level. */ static_frame->body.instrumentation_level = tc->instance->instrumentation_level; /* Add profiling instrumentation if needed. */ if (tc->instance->profiling) MVM_profile_instrument(tc, static_frame); else if (tc->instance->cross_thread_write_logging) MVM_cross_thread_write_instrument(tc, static_frame); else MVM_profile_ensure_uninstrumented(tc, static_frame); } /* Increases the reference count of a frame, and marks it as having been * referenced by a garbage collectable object. Can only safely be used * if you know the frame is referenced by at least one other frame or by * being on the stack top. If there's a chance it may be referenced only * by an object, use MVM_frame_acquire_ref to avoid races. */ MVMFrame * MVM_frame_inc_ref(MVMThreadContext *tc, MVMFrame *frame) { frame->refd_by_object = 1; MVM_incr(&frame->ref_count); return frame; } /* Increases the reference count of a frame. Can only safely be used when * the thing that will refer to the frame is another frame, and when you * know the frame is referenced by at least one other frame or by being on * the stack top. If there's a chance it may be referenced only by an object, * use MVM_frame_acquire_ref to avoid races. */ MVMFrame * MVM_frame_inc_ref_by_frame(MVMThreadContext *tc, MVMFrame *frame) { MVM_incr(&frame->ref_count); return frame; } /* Takes a pointer to a location that points to an MVMFrame, and safely * obtains a reference to the frame. If the frame should die while we * try to do so, then it will dereference the frame pointer afresh and * try again. */ MVMFrame * MVM_frame_acquire_ref(MVMThreadContext *tc, MVMFrame **frame) { while (1) { MVMFrame *try = (MVMFrame *)MVM_load(frame); if (try) { AO_t ref_count = MVM_load(&(try->ref_count)); if (ref_count > 0) if (MVM_trycas(&(try->ref_count), ref_count, ref_count + 1)) return try; } else { return NULL; } } } /* Decreases the reference count of a frame. If it hits zero, then we can * free it. Returns null for convenience. */ MVMFrame * MVM_frame_dec_ref(MVMThreadContext *tc, MVMFrame *frame) { /* MVM_dec returns what the count was before it decremented it * to zero, so we look for 1 here. */ while (MVM_decr(&frame->ref_count) == 1) { MVMFrame *outer_to_decr = frame->outer; /* If there's a caller pointer, decrement that. */ if (frame->caller) frame->caller = MVM_frame_dec_ref(tc, frame->caller); /* Destroy the frame. If it was referenced by an object, we need to * free it at the next safe point; the 0'd ref count must remain * readable until then since we use it as a sentinel value to avoid * anything acquiring a reference to a dead frame. */ if (frame->work) { MVM_args_proc_cleanup(tc, &frame->params); MVM_fixed_size_free(tc, tc->instance->fsa, frame->allocd_work, frame->work); } if (frame->env) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, frame->allocd_env, frame->env); if (frame->refd_by_object) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, sizeof(MVMFrame), frame); else MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMFrame), frame); /* Decrement any outer. */ if (outer_to_decr) frame = outer_to_decr; /* and loop */ else break; } return NULL; } /* Creates a frame for usage as a context only, possibly forcing all of the * static lexicals to be deserialized if it's used for auto-close purposes. */ static MVMFrame * create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref, MVMint32 autoclose) { MVMFrame *frame; /* If the frame was never invoked before, need initial calculations * and verification. */ if (static_frame->body.instrumentation_level == 0) instrumentation_level_barrier(tc, static_frame); frame = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, sizeof(MVMFrame)); /* Copy thread context into the frame. */ frame->tc = tc; /* Set static frame. */ frame->static_info = static_frame; /* Store the code ref. */ frame->code_ref = code_ref; /* Allocate space for lexicals, copying the default lexical environment * into place and, if we're auto-closing, making sure anything we'd clone * is vivified to prevent the clone (which is what creates the correct * BEGIN/INIT semantics). */ if (static_frame->body.env_size) { frame->env = MVM_fixed_size_alloc(tc, tc->instance->fsa, static_frame->body.env_size); frame->allocd_env = static_frame->body.env_size; if (autoclose) { MVMuint16 i; for (i = 0; i < static_frame->body.num_lexicals; i++) { if (!static_frame->body.static_env[i].o && static_frame->body.static_env_flags[i] == 1) { MVMint32 scid, objid; if (MVM_bytecode_find_static_lexical_scref(tc, static_frame->body.cu, static_frame, i, &scid, &objid)) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, static_frame->body.cu, scid); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame->body.static_env[i].o, MVM_sc_get_object(tc, sc, objid)); } } } } memcpy(frame->env, static_frame->body.static_env, static_frame->body.env_size); } /* Initial reference count is 0; leave referencing it to the caller (it * varies between deserialization, autoclose, etc.) */ return frame; } /* Creates a frame that is suitable for deserializing a context into. Starts * with a ref count of 1 due to being held by an SC. */ MVMFrame * MVM_frame_create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref) { MVMFrame *f = create_context_only(tc, static_frame, code_ref, 0); f->ref_count = 1; return f; } /* Provides auto-close functionality, for the handful of cases where we have * not ever been in the outer frame of something we're invoking. In this case, * we fake up a frame based on the static lexical environment. */ static MVMFrame * autoclose(MVMThreadContext *tc, MVMStaticFrame *needed) { MVMFrame *result; /* First, see if we can find one on the call stack; return it if so. */ MVMFrame *candidate = tc->cur_frame; while (candidate) { if (candidate->static_info->body.bytecode == needed->body.bytecode) return candidate; candidate = candidate->caller; } /* If not, fake up a frame See if it also needs an outer. */ result = create_context_only(tc, needed, (MVMObject *)needed->body.static_code, 1); if (needed->body.outer) { /* See if the static code object has an outer. */ MVMCode *outer_code = needed->body.outer->body.static_code; if (outer_code->body.outer && outer_code->body.outer->static_info->body.bytecode == needed->body.bytecode) { /* Yes, just take it. */ result->outer = MVM_frame_acquire_ref(tc, &(outer_code->body.outer)); } else { /* Otherwise, recursively auto-close. */ result->outer = MVM_frame_inc_ref_by_frame(tc, autoclose(tc, needed->body.outer)); } } return result; } /* Obtains memory for a frame. */ static MVMFrame * allocate_frame(MVMThreadContext *tc, MVMStaticFrameBody *static_frame_body, MVMSpeshCandidate *spesh_cand) { MVMFrame *frame = NULL; MVMint32 env_size, work_size; /* Allocate the frame. */ frame = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMFrame)); frame->params.named_used = NULL; frame->refd_by_object = 0; /* Ensure special return pointers, continuation tags, dynlex cache, * and return address are null. */ frame->special_return = NULL; frame->special_unwind = NULL; frame->continuation_tags = NULL; frame->dynlex_cache_name = NULL; frame->return_address = NULL; frame->jit_entry_label = NULL; /* Allocate space for lexicals and work area, copying the default lexical * environment into place. */ env_size = spesh_cand ? spesh_cand->env_size : static_frame_body->env_size; if (env_size) { frame->env = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, env_size); frame->allocd_env = env_size; } else { frame->env = NULL; frame->allocd_env = 0; } work_size = spesh_cand ? spesh_cand->work_size : static_frame_body->work_size; if (work_size) { frame->work = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, work_size); frame->allocd_work = work_size; } else { frame->work = NULL; frame->allocd_work = 0; } /* Calculate args buffer position and make sure current call site starts * empty. */ frame->args = work_size ? frame->work + (spesh_cand ? spesh_cand->num_locals : static_frame_body->num_locals) : NULL; frame->cur_args_callsite = NULL; return frame; } /* This exists to reduce the amount of pointer-fiddling that has to be * done by the JIT */ void MVM_frame_invoke_code(MVMThreadContext *tc, MVMCode *code, MVMCallsite *callsite, MVMint32 spesh_cand) { MVM_frame_invoke(tc, code->body.sf, callsite, tc->cur_frame->args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject*)code, spesh_cand); } /* Takes a static frame and a thread context. Invokes the static frame. */ void MVM_frame_invoke(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMFrame *outer, MVMObject *code_ref, MVMint32 spesh_cand) { MVMFrame *frame; MVMuint32 found_spesh; MVMStaticFrameBody *static_frame_body = &static_frame->body; /* If the frame was never invoked before, or never before at the current * instrumentation level, we need to trigger the instrumentation level * barrier. */ if (static_frame_body->instrumentation_level != tc->instance->instrumentation_level) instrumentation_level_barrier(tc, static_frame); /* See if any specializations apply. */ found_spesh = 0; if (spesh_cand >= 0 && spesh_cand < static_frame_body->num_spesh_candidates) { MVMSpeshCandidate *chosen_cand = &static_frame_body->spesh_candidates[spesh_cand]; if (!chosen_cand->sg) { frame = allocate_frame(tc, static_frame_body, chosen_cand); frame->effective_bytecode = chosen_cand->bytecode; frame->effective_handlers = chosen_cand->handlers; frame->effective_spesh_slots = chosen_cand->spesh_slots; frame->spesh_cand = chosen_cand; frame->spesh_log_idx = -1; found_spesh = 1; } } if (!found_spesh && ++static_frame_body->invocations >= static_frame_body->spesh_threshold && callsite->is_interned) { /* Look for specialized bytecode. */ MVMint32 num_spesh = static_frame_body->num_spesh_candidates; MVMSpeshCandidate *chosen_cand = NULL; MVMint32 i, j; for (i = 0; i < num_spesh; i++) { MVMSpeshCandidate *cand = &static_frame_body->spesh_candidates[i]; if (cand->cs == callsite) { MVMint32 match = 1; for (j = 0; j < cand->num_guards; j++) { MVMint32 pos = cand->guards[j].slot; MVMSTable *st = (MVMSTable *)cand->guards[j].match; MVMObject *arg = args[pos].o; if (!arg) { match = 0; break; } switch (cand->guards[j].kind) { case MVM_SPESH_GUARD_CONC: if (!IS_CONCRETE(arg) || STABLE(arg) != st) match = 0; break; case MVM_SPESH_GUARD_TYPE: if (IS_CONCRETE(arg) || STABLE(arg) != st) match = 0; break; case MVM_SPESH_GUARD_DC_CONC: { MVMRegister dc; STABLE(arg)->container_spec->fetch(tc, arg, &dc); if (!dc.o || !IS_CONCRETE(dc.o) || STABLE(dc.o) != st) match = 0; break; } case MVM_SPESH_GUARD_DC_TYPE: { MVMRegister dc; STABLE(arg)->container_spec->fetch(tc, arg, &dc); if (!dc.o || IS_CONCRETE(dc.o) || STABLE(dc.o) != st) match = 0; break; } case MVM_SPESH_GUARD_DC_CONC_RW: { if (STABLE(arg)->container_spec->can_store(tc, arg)) { MVMRegister dc; STABLE(arg)->container_spec->fetch(tc, arg, &dc); if (!dc.o || !IS_CONCRETE(dc.o) || STABLE(dc.o) != st) match = 0; } else { match = 0; } break; } case MVM_SPESH_GUARD_DC_TYPE_RW: { if (STABLE(arg)->container_spec->can_store(tc, arg)) { MVMRegister dc; STABLE(arg)->container_spec->fetch(tc, arg, &dc); if (!dc.o || IS_CONCRETE(dc.o) || STABLE(dc.o) != st) match = 0; } else { match = 0; } break; } } if (!match) break; } if (match) { chosen_cand = cand; break; } } } /* If we didn't find any, and we're below the limit, can set up a * specialization. */ if (!chosen_cand && num_spesh < MVM_SPESH_LIMIT && tc->instance->spesh_enabled) chosen_cand = MVM_spesh_candidate_setup(tc, static_frame, callsite, args, 0); /* Now try to use specialized bytecode. We may need to compete to * be a logging run of it. */ if (chosen_cand) { if (chosen_cand->sg) { /* In the logging phase. Try to get a logging index; ensure it * is not being used as an OSR logging candidate elsewhere. */ AO_t cur_idx = MVM_load(&(chosen_cand->log_enter_idx)); if (!chosen_cand->osr_logging && cur_idx < MVM_SPESH_LOG_RUNS) { if (MVM_cas(&(chosen_cand->log_enter_idx), cur_idx, cur_idx + 1) == cur_idx) { /* We get to log. */ frame = allocate_frame(tc, static_frame_body, chosen_cand); frame->effective_bytecode = chosen_cand->bytecode; frame->effective_handlers = chosen_cand->handlers; frame->effective_spesh_slots = chosen_cand->spesh_slots; frame->spesh_log_slots = chosen_cand->log_slots; frame->spesh_cand = chosen_cand; frame->spesh_log_idx = (MVMint8)cur_idx; found_spesh = 1; } } } else { /* In the post-specialize phase; can safely used the code. */ frame = allocate_frame(tc, static_frame_body, chosen_cand); if (chosen_cand->jitcode) { frame->effective_bytecode = chosen_cand->jitcode->bytecode; frame->jit_entry_label = chosen_cand->jitcode->labels[0]; } else { frame->effective_bytecode = chosen_cand->bytecode; } frame->effective_handlers = chosen_cand->handlers; frame->effective_spesh_slots = chosen_cand->spesh_slots; frame->spesh_cand = chosen_cand; frame->spesh_log_idx = -1; found_spesh = 1; } } } if (!found_spesh) { frame = allocate_frame(tc, static_frame_body, NULL); frame->effective_bytecode = static_frame_body->bytecode; frame->effective_handlers = static_frame_body->handlers; frame->spesh_cand = NULL; } /* Copy thread context (back?) into the frame. */ frame->tc = tc; /* Set static frame. */ frame->static_info = static_frame; /* Store the code ref (NULL at the top-level). */ frame->code_ref = code_ref; /* Outer. */ if (outer) { /* We were provided with an outer frame and it will already have had * its reference count incremented; just ensure that it is based on the * correct static frame (compare on bytecode address to cope with * nqp::freshcoderef). */ if (outer->static_info->body.orig_bytecode == static_frame_body->outer->body.orig_bytecode) frame->outer = outer; else { char *frame_cuuid = MVM_string_utf8_encode_C_string(tc, static_frame_body->cuuid); char *frame_name; char *outer_cuuid = MVM_string_utf8_encode_C_string(tc, outer->static_info->body.cuuid); char *outer_name; char *frame_outer_cuuid = MVM_string_utf8_encode_C_string(tc, static_frame_body->outer->body.cuuid); char *frame_outer_name; char *waste[7] = { frame_cuuid, outer_cuuid, frame_outer_cuuid, NULL, NULL, NULL, NULL }; int waste_counter = 3; if (static_frame_body->name) { frame_name = MVM_string_utf8_encode_C_string(tc, static_frame_body->name); waste[waste_counter++] = frame_name; } else { frame_name = ""; } if (outer->static_info->body.name) { outer_name = MVM_string_utf8_encode_C_string(tc, outer->static_info->body.name); waste[waste_counter++] = outer_name; } else { outer_name = ""; } if (static_frame_body->outer->body.name) { frame_outer_name = MVM_string_utf8_encode_C_string(tc, static_frame_body->outer->body.name); waste[waste_counter++] = frame_outer_name; } else { frame_outer_name = ""; } MVM_exception_throw_adhoc_free(tc, waste, "When invoking %s '%s', provided outer frame %p (%s '%s') does not match expected static frame %p (%s '%s')", frame_cuuid, frame_name, outer->static_info, outer_cuuid, outer_name, static_frame_body->outer, frame_outer_cuuid, frame_outer_name); } } else if (static_frame_body->static_code) { MVMCode *static_code = static_frame_body->static_code; if (static_code->body.outer) { /* We're lacking an outer, but our static code object may have one. * This comes up in the case of cloned protoregexes, for example. */ frame->outer = MVM_frame_inc_ref_by_frame(tc, static_code->body.outer); } else if (static_frame_body->outer) { /* Auto-close, and cache it in the static frame. */ frame->outer = MVM_frame_inc_ref_by_frame(tc, autoclose(tc, static_frame_body->outer)); static_code->body.outer = MVM_frame_inc_ref(tc, frame->outer); } else { frame->outer = NULL; } } else { frame->outer = NULL; } /* Caller is current frame in the thread context. */ if (tc->cur_frame) frame->caller = MVM_frame_inc_ref_by_frame(tc, tc->cur_frame); else frame->caller = NULL; frame->keep_caller = 0; frame->in_continuation = 0; /* Initial reference count is 1 by virtue of it being the currently * executing frame. */ frame->ref_count = 1; frame->gc_seq_number = 0; /* Initialize argument processing. */ MVM_args_proc_init(tc, &frame->params, callsite, args); /* Make sure there's no frame context pointer and special return data. */ frame->context_object = NULL; frame->special_return_data = NULL; frame->mark_special_return_data = NULL; /* Clear frame flags. */ frame->flags = 0; /* Initialize OSR counter. */ frame->osr_counter = 0; /* Update interpreter and thread context, so next execution will use this * frame. */ tc->cur_frame = frame; *(tc->interp_cur_op) = frame->effective_bytecode; *(tc->interp_bytecode_start) = frame->effective_bytecode; *(tc->interp_reg_base) = frame->work; *(tc->interp_cu) = static_frame_body->cu; /* If we need to do so, make clones of things in the lexical environment * that need it. Note that we do this after tc->cur_frame became the * current frame, to make sure these new objects will certainly get * marked if GC is triggered along the way. */ if (static_frame_body->has_state_vars) { /* Drag everything out of static_frame_body before we start, * as GC action may invalidate it. */ MVMRegister *env = static_frame_body->static_env; MVMuint8 *flags = static_frame_body->static_env_flags; MVMint64 numlex = static_frame_body->num_lexicals; MVMRegister *state = NULL; MVMint64 state_act = 0; /* 0 = none so far, 1 = first time, 2 = later */ MVMint64 i; for (i = 0; i < numlex; i++) { if (flags[i] == 2) { redo_state: switch (state_act) { case 0: if (!frame->code_ref) MVM_exception_throw_adhoc(tc, "Frame must have code-ref to have state variables"); state = ((MVMCode *)frame->code_ref)->body.state_vars; if (state) { /* Already have state vars; pull them from this. */ state_act = 2; } else { /* Allocate storage for state vars. */ state = MVM_malloc(frame->static_info->body.env_size); memset(state, 0, frame->static_info->body.env_size); ((MVMCode *)frame->code_ref)->body.state_vars = state; state_act = 1; /* Note that this frame should run state init code. */ frame->flags |= MVM_FRAME_FLAG_STATE_INIT; } goto redo_state; case 1: frame->env[i].o = MVM_repr_clone(tc, env[i].o); MVM_ASSIGN_REF(tc, &(frame->code_ref->header), state[i].o, frame->env[i].o); break; case 2: frame->env[i].o = state[i].o; break; } } } } } /* Creates a frame for de-optimization purposes. */ MVMFrame * MVM_frame_create_for_deopt(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCode *code_ref) { MVMFrame *frame = allocate_frame(tc, &(static_frame->body), NULL); frame->effective_bytecode = static_frame->body.bytecode; frame->effective_handlers = static_frame->body.handlers; frame->spesh_cand = NULL; frame->tc = tc; frame->static_info = static_frame; frame->code_ref = (MVMObject *)code_ref; frame->caller = NULL; /* Set up by deopt-er. */ frame->keep_caller = 0; frame->in_continuation = 0; frame->ref_count = 1; /* It'll be on the "stack". */ frame->gc_seq_number = 0; frame->context_object = NULL; frame->special_return_data = NULL; frame->mark_special_return_data = NULL; frame->flags = 0; frame->params.callsite = NULL; /* We only ever deopt after args handling. */ frame->params.arg_flags = NULL; frame->params.named_used = NULL; if (code_ref->body.outer) frame->outer = MVM_frame_acquire_ref(tc, &(code_ref->body.outer)); else frame->outer = NULL; return frame; } /* Removes a single frame, as part of a return or unwind. Done after any exit * handler has already been run. */ static MVMuint64 remove_one_frame(MVMThreadContext *tc, MVMuint8 unwind) { MVMFrame *returner = tc->cur_frame; MVMFrame *caller = returner->caller; /* See if we were in a logging spesh frame, and need to complete the * specialization. */ if (returner->spesh_cand && returner->spesh_log_idx >= 0) { if (returner->spesh_cand->osr_logging) { /* Didn't achieve enough log entries to complete the OSR, but * clearly hot, so specialize anyway. This also avoids races * when the candidate is called again later and still has * sp_osrfinalize instructions in it. */ returner->spesh_cand->osr_logging = 0; MVM_spesh_candidate_specialize(tc, returner->static_info, returner->spesh_cand); } else if (MVM_decr(&(returner->spesh_cand->log_exits_remaining)) == 1) { MVM_spesh_candidate_specialize(tc, returner->static_info, returner->spesh_cand); } } /* Some cleanup we only need do if we're not a frame involved in a * continuation (otherwise we need to allow for multi-shot * re-invocation). */ if (!returner->in_continuation) { /* Arguments buffer no longer in use (saves GC visiting it). */ returner->cur_args_callsite = NULL; /* Clear up argument processing leftovers, if any. */ if (returner->work) { MVM_args_proc_cleanup_for_cache(tc, &returner->params); } /* Clear up any continuation tags. */ if (returner->continuation_tags) { MVMContinuationTag *tag = returner->continuation_tags; while (tag) { MVMContinuationTag *next = tag->next; MVM_free(tag); tag = next; } returner->continuation_tags = NULL; } /* Signal to the GC to ignore ->work */ returner->tc = NULL; /* Unless we need to keep the caller chain in place, clear it up. */ if (caller) { if (!returner->keep_caller) { MVM_frame_dec_ref(tc, caller); returner->caller = NULL; } else if (unwind) { caller->keep_caller = 1; } } } /* Decrement the frame's ref-count by the 1 it got by virtue of being the * currently executing frame. */ MVM_frame_dec_ref(tc, returner); /* Switch back to the caller frame if there is one. */ if (caller && returner != tc->thread_entry_frame) { tc->cur_frame = caller; *(tc->interp_cur_op) = caller->return_address; *(tc->interp_bytecode_start) = caller->effective_bytecode; *(tc->interp_reg_base) = caller->work; *(tc->interp_cu) = caller->static_info->body.cu; /* Handle any special return hooks. */ if (caller->special_return || caller->special_unwind) { MVMSpecialReturn sr = caller->special_return; MVMSpecialReturn su = caller->special_unwind; void *srd = caller->special_return_data; caller->special_return = NULL; caller->special_unwind = NULL; caller->special_return_data = NULL; caller->mark_special_return_data = NULL; if (unwind && su) su(tc, srd); else if (!unwind && sr) sr(tc, srd); } return 1; } else { tc->cur_frame = NULL; return 0; } } /* Attempt to return from the current frame. Returns non-zero if we can, * and zero if there is nowhere to return to (which would signal the exit * of the interpreter). */ static void remove_after_handler(MVMThreadContext *tc, void *sr_data) { remove_one_frame(tc, 0); } MVMuint64 MVM_frame_try_return(MVMThreadContext *tc) { MVMFrame *cur_frame = tc->cur_frame; if (cur_frame->static_info->body.has_exit_handler && !(cur_frame->flags & MVM_FRAME_FLAG_EXIT_HAND_RUN)) { /* Set us up to run exit handler, and make it so we'll really exit the * frame when that has been done. */ MVMFrame *caller = cur_frame->caller; MVMHLLConfig *hll = MVM_hll_current(tc); MVMObject *handler; MVMObject *result; MVMCallsite *two_args_callsite; if (!caller) MVM_exception_throw_adhoc(tc, "Entry point frame cannot have an exit handler"); if (tc->cur_frame == tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Thread entry point frame cannot have an exit handler"); switch (caller->return_type) { case MVM_RETURN_OBJ: result = caller->return_value->o; break; case MVM_RETURN_INT: result = MVM_repr_box_int(tc, hll->int_box_type, caller->return_value->i64); break; case MVM_RETURN_NUM: result = MVM_repr_box_num(tc, hll->num_box_type, caller->return_value->n64); break; case MVM_RETURN_STR: result = MVM_repr_box_str(tc, hll->str_box_type, caller->return_value->s); break; default: result = NULL; } handler = MVM_frame_find_invokee(tc, hll->exit_handler, NULL); two_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, two_args_callsite); cur_frame->args[0].o = cur_frame->code_ref; cur_frame->args[1].o = result; cur_frame->special_return = remove_after_handler; cur_frame->flags |= MVM_FRAME_FLAG_EXIT_HAND_RUN; STABLE(handler)->invoke(tc, handler, two_args_callsite, cur_frame->args); return 1; } else { /* No exit handler, so a straight return. */ return remove_one_frame(tc, 0); } } /* Try a return from the current frame; skip running any exit handlers. */ MVMuint64 MVM_frame_try_return_no_exit_handlers(MVMThreadContext *tc) { return remove_one_frame(tc, 0); } /* Unwinds execution state to the specified frame, placing control flow at either * an absolute or relative (to start of target frame) address and optionally * setting a returned result. */ typedef struct { MVMFrame *frame; MVMuint8 *abs_addr; MVMuint32 rel_addr; } MVMUnwindData; static void continue_unwind(MVMThreadContext *tc, void *sr_data) { MVMUnwindData *ud = (MVMUnwindData *)sr_data; MVMFrame *frame = ud->frame; MVMuint8 *abs_addr = ud->abs_addr; MVMuint32 rel_addr = ud->rel_addr; MVM_free(sr_data); MVM_frame_unwind_to(tc, frame, abs_addr, rel_addr, NULL); } void MVM_frame_unwind_to(MVMThreadContext *tc, MVMFrame *frame, MVMuint8 *abs_addr, MVMuint32 rel_addr, MVMObject *return_value) { while (tc->cur_frame != frame) { MVMFrame *cur_frame = tc->cur_frame; if (cur_frame->static_info->body.has_exit_handler && !(cur_frame->flags & MVM_FRAME_FLAG_EXIT_HAND_RUN)) { /* We're unwinding a frame with an exit handler. Thus we need to * pause the unwind, run the exit handler, and keep enough info * around in order to finish up the unwind afterwards. */ MVMFrame *caller = cur_frame->caller; MVMHLLConfig *hll = MVM_hll_current(tc); MVMObject *handler; MVMCallsite *two_args_callsite; if (!caller) MVM_exception_throw_adhoc(tc, "Entry point frame cannot have an exit handler"); if (cur_frame == tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Thread entry point frame cannot have an exit handler"); handler = MVM_frame_find_invokee(tc, hll->exit_handler, NULL); two_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, two_args_callsite); cur_frame->args[0].o = cur_frame->code_ref; cur_frame->args[1].o = NULL; cur_frame->special_return = continue_unwind; { MVMUnwindData *ud = MVM_malloc(sizeof(MVMUnwindData)); ud->frame = frame; ud->abs_addr = abs_addr; ud->rel_addr = rel_addr; if (return_value) MVM_exception_throw_adhoc(tc, "return_value + exit_handler case NYI"); cur_frame->special_return_data = ud; } cur_frame->flags |= MVM_FRAME_FLAG_EXIT_HAND_RUN; STABLE(handler)->invoke(tc, handler, two_args_callsite, cur_frame->args); return; } else { /* If we're profiling, log an exit. */ if (tc->instance->profiling) MVM_profile_log_unwind(tc); /* No exit handler, so just remove the frame. */ if (!remove_one_frame(tc, 1)) MVM_panic(1, "Internal error: Unwound entire stack and missed handler"); } } if (abs_addr) *tc->interp_cur_op = abs_addr; else if (rel_addr) *tc->interp_cur_op = *tc->interp_bytecode_start + rel_addr; if (return_value) MVM_args_set_result_obj(tc, return_value, 1); } /* Gets a code object for a frame, lazily deserializing it if needed. */ MVMObject * MVM_frame_get_code_object(MVMThreadContext *tc, MVMCode *code) { if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "getcodeobj needs a code ref"); if (!code->body.code_object) { MVMStaticFrame *sf = code->body.sf; if (sf->body.code_obj_sc_dep_idx > 0) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, sf->body.cu, sf->body.code_obj_sc_dep_idx - 1); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); MVM_ASSIGN_REF(tc, &(code->common.header), code->body.code_object, MVM_sc_get_object(tc, sc, sf->body.code_obj_sc_idx)); } } return code->body.code_object; } /* Given the specified code object, sets its outer to the current scope. */ void MVM_frame_capturelex(MVMThreadContext *tc, MVMObject *code) { MVMCode *code_obj = (MVMCode *)code; if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "Can only perform capturelex on object with representation MVMCode"); /* Increment current frame reference. */ MVM_frame_inc_ref(tc, tc->cur_frame); /* Try to replace outer; retry on failure (should hopefully be highly * rare). */ do { MVMFrame *orig_outer = code_obj->body.outer; if (MVM_trycas(&(code_obj->body.outer), orig_outer, tc->cur_frame)) { /* Success; decrement any original outer and we're done. */ if (orig_outer) MVM_frame_dec_ref(tc, orig_outer); return; } } while (1); } /* Given the specified code object, copies it and returns a copy which * captures a closure over the current scope. */ MVMObject * MVM_frame_takeclosure(MVMThreadContext *tc, MVMObject *code) { MVMCode *closure; if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "Can only perform takeclosure on object with representation MVMCode"); MVMROOT(tc, code, { closure = (MVMCode *)REPR(code)->allocate(tc, STABLE(code)); }); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.sf, ((MVMCode *)code)->body.sf); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.name, ((MVMCode *)code)->body.name); closure->body.outer = MVM_frame_inc_ref(tc, tc->cur_frame); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.code_object, ((MVMCode *)code)->body.code_object); return (MVMObject *)closure; } /* Vivifies a lexical in a frame. */ MVMObject * MVM_frame_vivify_lexical(MVMThreadContext *tc, MVMFrame *f, MVMuint16 idx) { MVMuint8 *flags; MVMint16 flag; MVMRegister *static_env; MVMuint16 effective_idx; MVMStaticFrame *effective_sf; if (idx < f->static_info->body.num_lexicals) { flags = f->static_info->body.static_env_flags; static_env = f->static_info->body.static_env; effective_idx = idx; effective_sf = f->static_info; } else if (f->spesh_cand) { MVMint32 i; flags = NULL; for (i = 0; i < f->spesh_cand->num_inlines; i++) { MVMStaticFrame *isf = f->spesh_cand->inlines[i].code->body.sf; effective_idx = idx - f->spesh_cand->inlines[i].lexicals_start; if (effective_idx < isf->body.num_lexicals) { flags = isf->body.static_env_flags; static_env = isf->body.static_env; effective_sf = isf; break; } } } else { flags = NULL; } flag = flags ? flags[effective_idx] : -1; if (flag != -1 && static_env[effective_idx].o == NULL) { MVMStaticFrameBody *static_frame_body = &(f->static_info->body); MVMint32 scid, objid; if (MVM_bytecode_find_static_lexical_scref(tc, effective_sf->body.cu, effective_sf, effective_idx, &scid, &objid)) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, effective_sf->body.cu, scid); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); MVM_ASSIGN_REF(tc, &(f->static_info->common.header), static_frame_body->static_env[effective_idx].o, MVM_sc_get_object(tc, sc, objid)); } } if (flag == 0) { MVMObject *viv = static_env[effective_idx].o; return f->env[idx].o = viv ? viv : tc->instance->VMNull; } else if (flag == 1) { MVMObject *viv = static_env[effective_idx].o; return f->env[idx].o = MVM_repr_clone(tc, viv); } else { return tc->instance->VMNull; } } /* Looks up the address of the lexical with the specified name and the * specified type. Non-existing object lexicals produce NULL, expected * (for better or worse) by various things. Otherwise, an error is thrown * if it does not exist. Incorrect type always throws. */ MVMRegister * MVM_frame_find_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type) { MVMFrame *cur_frame = tc->cur_frame; MVM_string_flatten(tc, name); while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == type) { MVMRegister *result = &cur_frame->env[entry->value]; if (type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } if (type != MVM_reg_obj) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } return NULL; } /* Finds a lexical in the outer frame, throwing if it's not there. */ MVMObject * MVM_frame_find_lexical_by_name_outer(MVMThreadContext *tc, MVMString *name) { MVMRegister *r = MVM_frame_find_lexical_by_name_rel(tc, name, tc->cur_frame->outer); if (r) return r->o; else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } } /* Looks up the address of the lexical with the specified name, starting with * the specified frame. Only works if it's an object lexical. */ MVMRegister * MVM_frame_find_lexical_by_name_rel(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame) { MVM_string_flatten(tc, name); while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == MVM_reg_obj) { MVMRegister *result = &cur_frame->env[entry->value]; if (!result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } return NULL; } /* Looks up the address of the lexical with the specified name, starting with * the specified frame. It checks all outer frames of the caller frame chain. */ MVMRegister * MVM_frame_find_lexical_by_name_rel_caller(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_caller_frame) { MVM_string_flatten(tc, name); while (cur_caller_frame != NULL) { MVMFrame *cur_frame = cur_caller_frame; while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == MVM_reg_obj) { MVMRegister *result = &cur_frame->env[entry->value]; if (!result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } cur_caller_frame = cur_caller_frame->caller; } return NULL; } /* Looks up the address of the lexical with the specified name and the * specified type. Returns null if it does not exist. */ static void try_cache_dynlex(MVMThreadContext *tc, MVMFrame *from, MVMFrame *to, MVMString *name, MVMRegister *reg, MVMuint16 type, MVMuint32 fcost, MVMuint32 icost) { MVMint32 next = 0; MVMint32 frames = 0; MVMuint32 desperation = 0; if (fcost+icost > 20) desperation = 1; while (from && from != to) { frames++; if (frames >= next) { if (!from->dynlex_cache_name || (desperation && frames > 1)) { from->dynlex_cache_name = name; from->dynlex_cache_reg = reg; from->dynlex_cache_type = type; if (desperation && next == 3) { next = fcost / 2; } else { if (next) return; next = 3; } } } from = from->caller; } } MVMRegister * MVM_frame_find_contextual_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 *type, MVMFrame *cur_frame, MVMint32 vivify) { FILE *dlog = tc->instance->dynvar_log_fh; MVMuint32 fcost = 0; /* frames traversed */ MVMuint32 icost = 0; /* inlines traversed */ MVMuint32 ecost = 0; /* frames traversed with empty cache */ MVMuint32 xcost = 0; /* frames traversed with wrong name */ char *c_name; MVMuint64 start_time; MVMuint64 last_time; MVMFrame *initial_frame = cur_frame; if (!name) MVM_exception_throw_adhoc(tc, "Contextual name cannot be null"); if (dlog) { c_name = MVM_string_utf8_encode_C_string(tc, name); start_time = uv_hrtime(); last_time = tc->instance->dynvar_log_lasttime; } MVM_string_flatten(tc, name); while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names; MVMSpeshCandidate *cand = cur_frame->spesh_cand; /* See if we are inside an inline. Note that this isn't actually * correct for a leaf frame, but those aren't inlined and don't * use getdynlex for their own lexicals since the compiler already * knows where to find them */ if (cand && cand->num_inlines) { if (cand->jitcode) { void **labels = cand->jitcode->labels; void *return_label = cur_frame->jit_entry_label; MVMJitInline *inls = cand->jitcode->inlines; MVMint32 i; for (i = 0; i < cand->jitcode->num_inlines; i++) { icost++; if (return_label >= labels[inls[i].start_label] && return_label <= labels[inls[i].end_label]) { MVMStaticFrame *isf = cand->inlines[i].code->body.sf; if ((lexical_names = isf->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry); if (entry) { MVMuint16 lexidx = cand->inlines[i].lexicals_start + entry->value; MVMRegister *result = &cur_frame->env[lexidx]; *type = cand->lexical_types[lexidx]; if (vivify && *type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, cur_frame, lexidx); if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "I %s %d %d %d %d %llu %llu %llu\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } return result; } } } } } else { MVMint32 ret_offset = cur_frame->return_address - cur_frame->effective_bytecode; MVMint32 i; for (i = 0; i < cand->num_inlines; i++) { icost++; if (ret_offset >= cand->inlines[i].start && ret_offset < cand->inlines[i].end) { MVMStaticFrame *isf = cand->inlines[i].code->body.sf; if ((lexical_names = isf->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry); if (entry) { MVMuint16 lexidx = cand->inlines[i].lexicals_start + entry->value; MVMRegister *result = &cur_frame->env[lexidx]; *type = cand->lexical_types[lexidx]; if (vivify && *type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, cur_frame, lexidx); if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "I %s %d %d %d %d %llu %llu %llu\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } return result; } } } } } } /* See if we've got it cached at this level. */ if (cur_frame->dynlex_cache_name) { if (MVM_string_equal(tc, name, cur_frame->dynlex_cache_name)) { MVMRegister *result = cur_frame->dynlex_cache_reg; *type = cur_frame->dynlex_cache_type; if (fcost+icost > 5) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "C %s %d %d %d %d %llu %llu %llu\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } return result; } else xcost++; } else ecost++; /* Now look in the frame itself. */ if ((lexical_names = cur_frame->static_info->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { MVMRegister *result = &cur_frame->env[entry->value]; *type = cur_frame->static_info->body.lexical_types[entry->value]; if (vivify && *type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); if (dlog) { fprintf(dlog, "F %s %d %d %d %d %llu %llu %llu\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); return result; } } fcost++; cur_frame = cur_frame->caller; } if (dlog) { fprintf(dlog, "N %s %d %d %d %d %llu %llu %llu\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } return NULL; } MVMObject * MVM_frame_getdynlex(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame) { MVMuint16 type; MVMRegister *lex_reg = MVM_frame_find_contextual_by_name(tc, name, &type, cur_frame, 1); MVMObject *result = NULL, *result_type = NULL; if (lex_reg) { switch (type) { case MVM_reg_int64: result_type = (*tc->interp_cu)->body.hll_config->int_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing int box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_int(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->i64); MVM_gc_root_temp_pop(tc); break; case MVM_reg_num64: result_type = (*tc->interp_cu)->body.hll_config->num_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing num box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_num(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->n64); MVM_gc_root_temp_pop(tc); break; case MVM_reg_str: result_type = (*tc->interp_cu)->body.hll_config->str_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing str box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_str(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->s); MVM_gc_root_temp_pop(tc); break; case MVM_reg_obj: result = lex_reg->o; break; default: MVM_exception_throw_adhoc(tc, "invalid register type in getdynlex"); } } return result; } void MVM_frame_binddynlex(MVMThreadContext *tc, MVMString *name, MVMObject *value, MVMFrame *cur_frame) { MVMuint16 type; MVMRegister *lex_reg = MVM_frame_find_contextual_by_name(tc, name, &type, cur_frame, 0); if (!lex_reg) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No contextual found with name '%s'", c_name); } switch (type) { case MVM_reg_int64: lex_reg->i64 = REPR(value)->box_funcs.get_int(tc, STABLE(value), value, OBJECT_BODY(value)); break; case MVM_reg_num64: lex_reg->n64 = REPR(value)->box_funcs.get_num(tc, STABLE(value), value, OBJECT_BODY(value)); break; case MVM_reg_str: lex_reg->s = REPR(value)->box_funcs.get_str(tc, STABLE(value), value, OBJECT_BODY(value)); break; case MVM_reg_obj: lex_reg->o = value; break; default: MVM_exception_throw_adhoc(tc, "invalid register type in binddynlex"); } } /* Returns the storage unit for the lexical in the specified frame. Does not * try to vivify anything - gets exactly what is there. */ MVMRegister * MVM_frame_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) return &f->env[entry->value]; } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Frame has no lexical with name '%s'", c_name); } } /* Returns the storage unit for the lexical in the specified frame. */ MVMRegister * MVM_frame_try_get_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name, MVMuint16 type) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry) if (entry && f->static_info->body.lexical_types[entry->value] == type) { MVMRegister *result = &f->env[entry->value]; if (type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, f, entry->value); return result; } } return NULL; } /* Returns the primitive type specification for a lexical. */ MVMuint16 MVM_frame_lexical_primspec(MVMThreadContext *tc, MVMFrame *f, MVMString *name) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_string_flatten(tc, name); MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { switch (f->static_info->body.lexical_types[entry->value]) { case MVM_reg_int64: return MVM_STORAGE_SPEC_BP_INT; case MVM_reg_num64: return MVM_STORAGE_SPEC_BP_NUM; case MVM_reg_str: return MVM_STORAGE_SPEC_BP_STR; case MVM_reg_obj: return MVM_STORAGE_SPEC_BP_NONE; default: { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unhandled lexical type in lexprimspec for '%s'", c_name); } } } } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Frame has no lexical with name '%s'", c_name); } } static MVMObject * find_invokee_internal(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMInvocationSpec *is) { if (!MVM_is_null(tc, is->class_handle)) { MVMRegister dest; if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); code = dest.o; } else { /* Need to tweak the callsite and args to include the code object * being invoked. */ if (tweak_cs) { MVMCallsite *orig = *tweak_cs; if (orig->with_invocant) { *tweak_cs = orig->with_invocant; } else { MVMCallsite *new = MVM_malloc(sizeof(MVMCallsite)); MVMint32 fsize = orig->flag_count; new->flag_count = fsize + 1; new->arg_flags = MVM_malloc(new->flag_count * sizeof(MVMCallsiteEntry)); new->arg_flags[0] = MVM_CALLSITE_ARG_OBJ; memcpy(new->arg_flags + 1, orig->arg_flags, fsize); new->arg_count = orig->arg_count + 1; new->num_pos = orig->num_pos + 1; new->has_flattening = orig->has_flattening; new->is_interned = 0; new->with_invocant = NULL; *tweak_cs = orig->with_invocant = new; } memmove(tc->cur_frame->args + 1, tc->cur_frame->args, orig->arg_count * sizeof(MVMRegister)); tc->cur_frame->args[0].o = code; tc->cur_frame->cur_args_callsite = *tweak_cs; /* Keep in sync. */ } else { MVM_exception_throw_adhoc(tc, "Cannot invoke object with invocation handler in this context"); } code = is->invocation_handler; } return code; } MVMObject * MVM_frame_find_invokee(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs) { if (MVM_is_null(tc, code)) MVM_exception_throw_adhoc(tc, "Cannot invoke null object"); if (STABLE(code)->invoke == MVM_6model_invoke_default) { MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!is) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object (REPR: %s)", REPR(code)->name); } code = find_invokee_internal(tc, code, tweak_cs, is); } return code; } MVM_USED_BY_JIT MVMObject * MVM_frame_find_invokee_multi_ok(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMRegister *args) { if (!code) MVM_exception_throw_adhoc(tc, "Cannot invoke null object"); if (STABLE(code)->invoke == MVM_6model_invoke_default) { MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!is) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object"); } if (!MVM_is_null(tc, is->md_class_handle)) { /* We might be able to dig straight into the multi cache and not * have to invoke the proto. */ MVMRegister dest; if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_valid_attr_name, is->md_valid_hint, &dest, MVM_reg_int64); if (dest.i64) { REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_cache_attr_name, is->md_cache_hint, &dest, MVM_reg_obj); if (!MVM_is_null(tc, dest.o)) { MVMObject *result = MVM_multi_cache_find_callsite_args(tc, dest.o, *tweak_cs, args); if (result) return MVM_frame_find_invokee(tc, result, tweak_cs); } } } code = find_invokee_internal(tc, code, tweak_cs, is); } return code; } MVMObject * MVM_frame_context_wrapper(MVMThreadContext *tc, MVMFrame *f) { MVMObject *ctx = (MVMObject *)MVM_load(&f->context_object); if (!ctx) { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, f); if (MVM_casptr(&f->context_object, NULL, ctx) != NULL) { ((MVMContext *)ctx)->body.context = MVM_frame_dec_ref(tc, f); ctx = (MVMObject *)MVM_load(&f->context_object); } } return ctx; } /* Creates a shallow clone of a frame. Used by continuations. We rely on this * not allocating with the GC; update continuation clone code if it comes to * do so. */ MVMFrame * MVM_frame_clone(MVMThreadContext *tc, MVMFrame *f) { /* First, just grab a copy of everything. */ MVMFrame *clone = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMFrame)); memcpy(clone, f, sizeof(MVMFrame)); /* Need fresh env and work. */ if (f->static_info->body.env_size) { clone->env = MVM_fixed_size_alloc(tc, tc->instance->fsa, f->static_info->body.env_size); clone->allocd_env = f->static_info->body.env_size; memcpy(clone->env, f->env, f->static_info->body.env_size); } if (f->static_info->body.work_size) { clone->work = MVM_malloc(f->static_info->body.work_size); memcpy(clone->work, f->work, f->static_info->body.work_size); clone->args = clone->work + f->static_info->body.num_locals; } /* Ref-count of the clone is 1. */ clone->ref_count = 1; /* If there's an outer, there's now an extra frame pointing at it. */ if (clone->outer) MVM_frame_inc_ref(tc, clone->outer); return clone; } MoarVM-2015.11/src/core/frame.h0000644000175000017500000002322012575756521015050 0ustar jnthnjnthn/* Frame flags; provide some HLLs can alias. */ #define MVM_FRAME_FLAG_STATE_INIT 1 << 0 #define MVM_FRAME_FLAG_EXIT_HAND_RUN 1 << 1 #define MVM_FRAME_FLAG_HLL_1 1 << 3 #define MVM_FRAME_FLAG_HLL_2 1 << 4 #define MVM_FRAME_FLAG_HLL_3 1 << 5 #define MVM_FRAME_FLAG_HLL_4 1 << 6 /* Lexical hash entry for ->lexical_names on a frame. */ struct MVMLexicalRegistry { /* key string */ MVMString *key; /* index of the lexical entry. */ MVMuint32 value; /* the uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* Entry in the linked list of continuation tags for the frame. */ struct MVMContinuationTag { /* The tag itself. */ MVMObject *tag; /* The active exception handler at the point the tag was taken. */ MVMActiveHandler *active_handlers; /* The next continuation tag entry. */ MVMContinuationTag *next; }; /* Function pointer type of special return handler. These are used to allow * return to be intercepted in some way, for things that need to do multiple * calls into the runloop in some C-managed process. Essentially, instead of * nested runloops, you just re-work the C code in question into CPS. */ typedef void (* MVMSpecialReturn)(MVMThreadContext *tc, void *data); /* Function pointer for marking the special return handler data. */ typedef void (* MVMSpecialReturnDataMark)(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist); /* This represents an active call frame. */ struct MVMFrame { /* The thread that is executing, or executed, this frame. */ MVMThreadContext *tc; /* The environment for this frame, which lives beyond its execution. * Has space for, for instance, lexicals. */ MVMRegister *env; /* The temporary work space for this frame. After a call is over, this * can be freed up. Must be NULLed out when this happens. */ MVMRegister *work; /* The args buffer. Actually a pointer into an area inside of *work, to * decrease number of allocations. */ MVMRegister *args; /* Callsite that indicates how the current args buffer is being used, if * it is. */ MVMCallsite *cur_args_callsite; /* The outer frame, thus forming the static chain. */ MVMFrame *outer; /* The caller frame, thus forming the dynamic chain. */ MVMFrame *caller; /* The static frame information. Holds all we statically know about * this kind of frame, including information needed to GC-trace it. */ MVMStaticFrame *static_info; /* The code ref object for this frame. */ MVMObject *code_ref; /* Parameters received by this frame. */ MVMArgProcContext params; /* Reference count for the frame. */ AO_t ref_count; /* Is the frame referenced by a garbage-collectable object? */ MVMint32 refd_by_object; /* Effective bytecode for the frame (either the original bytecode or a * specialization of it). */ MVMuint8 *effective_bytecode; /* Effective set of frame handlers (to go with the effective bytecode). */ MVMFrameHandler *effective_handlers; /* Effective set of spesh slots, if any. */ MVMCollectable **effective_spesh_slots; /* Effective set of spesh logging slots, if any. */ MVMCollectable **spesh_log_slots; /* The spesh candidate information, if we're in one. */ MVMSpeshCandidate *spesh_cand; /* Address of the next op to execute if we return to this frame. */ MVMuint8 *return_address; /* The register we should store the return value in, if any. */ MVMRegister *return_value; /* The type of return value that is expected. */ MVMReturnType return_type; /* If we want to invoke a special handler upon a return to this * frame, this function pointer is set. */ MVMSpecialReturn special_return; /* If we want to invoke a special handler upon unwinding past a * frame, this function pointer is set. */ MVMSpecialReturn special_unwind; /* Data slot for the special return handler function. */ void *special_return_data; /* Flag for if special_return_data need to be GC marked. */ MVMSpecialReturnDataMark mark_special_return_data; /* GC run sequence number that we last saw this frame during. */ AO_t gc_seq_number; /* Address of the last op executed that threw an exeption; used just * for error reporting. */ MVMuint8 *throw_address; /* Linked list of any continuation tags we have. */ MVMContinuationTag *continuation_tags; /* Linked MVMContext object, so we can track the * serialization context and such. */ /* note: used atomically */ MVMObject *context_object; /* Cache for dynlex lookup; if the name is non-null, the cache is valid * and the register can be accessed directly to find the contextual. */ MVMString *dynlex_cache_name; MVMRegister *dynlex_cache_reg; MVMuint16 dynlex_cache_type; /* The allocated work/env sizes. */ MVMuint16 allocd_work; MVMuint16 allocd_env; /* Flags that the caller chain should be kept in place after return or * unwind; used to make sure we can get a backtrace after an exception. */ MVMuint8 keep_caller; /* Flags that the frame has been captured in a continuation, and as * such we should keep everything in place for multiple invocations. */ MVMuint8 in_continuation; /* Assorted frame flags. */ MVMuint8 flags; /* If we're in a logging spesh run, the index to log at in this * invocation. -1 if we're not in a logging spesh run, junk if no * spesh_cand is set in this frame at all. */ MVMint8 spesh_log_idx; /* On Stack Replacement iteration counter; incremented in loops, and will * trigger if the limit is hit. */ MVMuint8 osr_counter; /* The 'entry label' is a sort of indirect return address for the JIT */ void * jit_entry_label; }; /* How do we invoke this thing? Specifies either an attribute to look at for * an invokable thing, a method to call, and maybe a multi-dispatch cache to * look in first for an answer. */ struct MVMInvocationSpec { /* Class handle, name and hint for attribute holding code to invoke. */ MVMObject *class_handle; MVMString *attr_name; MVMint64 hint; /* Thing that handles invocation. */ MVMObject *invocation_handler; /* Multi-dispatch info class handle, and name/hint of attribute that * holds the cache itself and a flag to check if it's allowed to * consider the cache. */ MVMObject *md_class_handle; MVMString *md_cache_attr_name; MVMint64 md_cache_hint; MVMint64 md_valid_hint; MVMString *md_valid_attr_name; }; void MVM_frame_invoke_code(MVMThreadContext *tc, MVMCode *code, MVMCallsite *callsite, MVMint32 spesh_cand); void MVM_frame_invoke(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMFrame *outer, MVMObject *code_ref, MVMint32 spesh_cand); MVMFrame * MVM_frame_create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref); MVMFrame * MVM_frame_create_for_deopt(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCode *code_ref); MVM_PUBLIC MVMuint64 MVM_frame_try_return(MVMThreadContext *tc); MVM_PUBLIC MVMuint64 MVM_frame_try_return_no_exit_handlers(MVMThreadContext *tc); void MVM_frame_unwind_to(MVMThreadContext *tc, MVMFrame *frame, MVMuint8 *abs_addr, MVMuint32 rel_addr, MVMObject *return_value); MVM_PUBLIC MVMFrame * MVM_frame_inc_ref(MVMThreadContext *tc, MVMFrame *frame); MVM_PUBLIC MVMFrame * MVM_frame_inc_ref_by_frame(MVMThreadContext *tc, MVMFrame *frame); MVM_PUBLIC MVMFrame * MVM_frame_acquire_ref(MVMThreadContext *tc, MVMFrame **frame); MVM_PUBLIC MVMFrame * MVM_frame_dec_ref(MVMThreadContext *tc, MVMFrame *frame); MVM_PUBLIC MVMObject * MVM_frame_get_code_object(MVMThreadContext *tc, MVMCode *code); MVM_PUBLIC void MVM_frame_capturelex(MVMThreadContext *tc, MVMObject *code); MVM_PUBLIC MVMObject * MVM_frame_takeclosure(MVMThreadContext *tc, MVMObject *code); MVM_PUBLIC MVMObject * MVM_frame_vivify_lexical(MVMThreadContext *tc, MVMFrame *f, MVMuint16 idx); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type); MVMObject * MVM_frame_find_lexical_by_name_outer(MVMThreadContext *tc, MVMString *name); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name_rel(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name_rel_caller(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_caller_frame); MVM_PUBLIC MVMRegister * MVM_frame_find_contextual_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 *type, MVMFrame *cur_frame, MVMint32 vivify); MVMObject * MVM_frame_getdynlex(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame); void MVM_frame_binddynlex(MVMThreadContext *tc, MVMString *name, MVMObject *value, MVMFrame *cur_frame); MVMRegister * MVM_frame_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name); MVM_PUBLIC MVMRegister * MVM_frame_try_get_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name, MVMuint16 type); MVMuint16 MVM_frame_lexical_primspec(MVMThreadContext *tc, MVMFrame *f, MVMString *name); MVM_PUBLIC MVMObject * MVM_frame_find_invokee(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs); MVMObject * MVM_frame_find_invokee_multi_ok(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMRegister *args); MVMObject * MVM_frame_context_wrapper(MVMThreadContext *tc, MVMFrame *f); MVMFrame * MVM_frame_clone(MVMThreadContext *tc, MVMFrame *f); MoarVM-2015.11/src/core/hll.c0000644000175000017500000003235012502366742014524 0ustar jnthnjnthn#include "moar.h" MVMHLLConfig *MVM_hll_get_config_for(MVMThreadContext *tc, MVMString *name) { void *kdata; MVMHLLConfig *entry; size_t klen; MVM_HASH_EXTRACT_KEY(tc, &kdata, &klen, name, "get hll config needs concrete string"); uv_mutex_lock(&tc->instance->mutex_hllconfigs); if (tc->instance->hll_compilee_depth) HASH_FIND(hash_handle, tc->instance->compilee_hll_configs, kdata, klen, entry); else HASH_FIND(hash_handle, tc->instance->compiler_hll_configs, kdata, klen, entry); if (!entry) { entry = MVM_calloc(sizeof(MVMHLLConfig), 1); entry->name = name; entry->int_box_type = tc->instance->boot_types.BOOTInt; entry->num_box_type = tc->instance->boot_types.BOOTNum; entry->str_box_type = tc->instance->boot_types.BOOTStr; entry->slurpy_array_type = tc->instance->boot_types.BOOTArray; entry->slurpy_hash_type = tc->instance->boot_types.BOOTHash; entry->array_iterator_type = tc->instance->boot_types.BOOTIter; entry->hash_iterator_type = tc->instance->boot_types.BOOTIter; entry->foreign_type_int = tc->instance->boot_types.BOOTInt; entry->foreign_type_num = tc->instance->boot_types.BOOTNum; entry->foreign_type_str = tc->instance->boot_types.BOOTStr; if (tc->instance->hll_compilee_depth) HASH_ADD_KEYPTR(hash_handle, tc->instance->compilee_hll_configs, kdata, klen, entry); else HASH_ADD_KEYPTR(hash_handle, tc->instance->compiler_hll_configs, kdata, klen, entry); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->int_box_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->num_box_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->str_box_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->slurpy_array_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->slurpy_hash_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->array_iterator_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->hash_iterator_type); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_type_int); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_type_num); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_type_str); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_transform_array); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_transform_hash); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->foreign_transform_code); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->null_value); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->exit_handler); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->finalize_handler); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->bind_error); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->method_not_found_error); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->int_lex_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->num_lex_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->str_lex_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->int_attr_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->num_attr_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->str_attr_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->int_pos_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->num_pos_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->str_pos_ref); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&entry->name); } uv_mutex_unlock(&tc->instance->mutex_hllconfigs); return entry; } #define check_config_key(tc, hash, name, member, config) do { \ MVMString *key = MVM_string_utf8_decode((tc), (tc)->instance->VMString, (name), strlen((name))); \ MVMObject *val = MVM_repr_at_key_o((tc), (hash), key); \ if (!MVM_is_null(tc, val)) (config)->member = val; \ } while (0) #define check_config_key_reftype(tc, hash, name, member, config, wantprim, wantkind) do { \ MVMString *key = MVM_string_utf8_decode((tc), (tc)->instance->VMString, (name), strlen((name))); \ MVMObject *val = MVM_repr_at_key_o((tc), (hash), key); \ if (!MVM_is_null(tc, val)) { \ MVM_nativeref_ensure(tc, val, wantprim, wantkind, name); \ (config)->member = val; \ }\ } while (0) MVMObject * MVM_hll_set_config(MVMThreadContext *tc, MVMString *name, MVMObject *config_hash) { MVMHLLConfig *config; config = MVM_hll_get_config_for(tc, name); if (!config_hash || REPR(config_hash)->ID != MVM_REPR_ID_MVMHash || !IS_CONCRETE(config_hash)) { MVM_exception_throw_adhoc(tc, "set hll config needs concrete hash"); } /* MVM_string_utf8_decode() can potentially allocate, and hence gc. */ MVMROOT(tc, config_hash, { check_config_key(tc, config_hash, "int_box", int_box_type, config); check_config_key(tc, config_hash, "num_box", num_box_type, config); check_config_key(tc, config_hash, "str_box", str_box_type, config); check_config_key(tc, config_hash, "slurpy_array", slurpy_array_type, config); check_config_key(tc, config_hash, "slurpy_hash", slurpy_hash_type, config); check_config_key(tc, config_hash, "array_iter", array_iterator_type, config); check_config_key(tc, config_hash, "hash_iter", hash_iterator_type, config); check_config_key(tc, config_hash, "foreign_type_int", foreign_type_int, config); check_config_key(tc, config_hash, "foreign_type_num", foreign_type_num, config); check_config_key(tc, config_hash, "foreign_type_str", foreign_type_str, config); check_config_key(tc, config_hash, "foreign_transform_array", foreign_transform_array, config); check_config_key(tc, config_hash, "foreign_transform_hash", foreign_transform_hash, config); check_config_key(tc, config_hash, "foreign_transform_code", foreign_transform_code, config); check_config_key(tc, config_hash, "null_value", null_value, config); check_config_key(tc, config_hash, "exit_handler", exit_handler, config); check_config_key(tc, config_hash, "finalize_handler", finalize_handler, config); check_config_key(tc, config_hash, "bind_error", bind_error, config); check_config_key(tc, config_hash, "method_not_found_error", method_not_found_error, config); check_config_key_reftype(tc, config_hash, "int_lex_ref", int_lex_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_REG_OR_LEX); check_config_key_reftype(tc, config_hash, "num_lex_ref", num_lex_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_REG_OR_LEX); check_config_key_reftype(tc, config_hash, "str_lex_ref", str_lex_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_REG_OR_LEX); check_config_key_reftype(tc, config_hash, "int_attr_ref", int_attr_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "num_attr_ref", num_attr_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "str_attr_ref", str_attr_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "int_pos_ref", int_pos_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_POSITIONAL); check_config_key_reftype(tc, config_hash, "num_pos_ref", num_pos_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_POSITIONAL); check_config_key_reftype(tc, config_hash, "str_pos_ref", str_pos_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_POSITIONAL); }); MVM_intcache_for(tc, config->int_box_type); return config_hash; } /* Gets the current HLL configuration. */ MVMHLLConfig *MVM_hll_current(MVMThreadContext *tc) { return (*tc->interp_cu)->body.hll_config; } /* Enter a level of compilee HLL configuration mode. */ void MVM_hll_enter_compilee_mode(MVMThreadContext *tc) { uv_mutex_lock(&tc->instance->mutex_hllconfigs); tc->instance->hll_compilee_depth++; uv_mutex_unlock(&tc->instance->mutex_hllconfigs); } /* Leave a level of compilee HLL configuration mode. */ void MVM_hll_leave_compilee_mode(MVMThreadContext *tc) { uv_mutex_lock(&tc->instance->mutex_hllconfigs); tc->instance->hll_compilee_depth--; uv_mutex_unlock(&tc->instance->mutex_hllconfigs); } /* Checks if an object belongs to the correct HLL, and does a type mapping * of it if not. */ void MVM_hll_map(MVMThreadContext *tc, MVMObject *obj, MVMHLLConfig *hll, MVMRegister *res_reg) { /* Null objects get mapped to null_value. */ if (MVM_is_null(tc, obj)) { res_reg->o = hll->null_value; } /* If the object belongs to the current HLL, we're done. */ else if (STABLE(obj)->hll_owner == hll) { res_reg->o = obj; } /* Otherwise, need to try a mapping. */ else { switch (STABLE(obj)->hll_role) { case MVM_HLL_ROLE_INT: if (hll->foreign_type_int) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_int(tc, hll->foreign_type_int, MVM_repr_get_int(tc, obj)) : hll->foreign_type_int; else res_reg->o = obj; break; case MVM_HLL_ROLE_NUM: if (hll->foreign_type_num) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_num(tc, hll->foreign_type_num, MVM_repr_get_num(tc, obj)) : hll->foreign_type_num; else res_reg->o = obj; break; case MVM_HLL_ROLE_STR: if (hll->foreign_type_str) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_str(tc, hll->foreign_type_str, MVM_repr_get_str(tc, obj)) : hll->foreign_type_str; else res_reg->o = obj; break; case MVM_HLL_ROLE_ARRAY: if (hll->foreign_transform_array) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_array, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; case MVM_HLL_ROLE_HASH: if (hll->foreign_transform_hash) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_hash, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; case MVM_HLL_ROLE_CODE: if (hll->foreign_transform_code) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_code, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; default: res_reg->o = obj; } } } /* Looks up an object in the HLL symbols stash. */ MVMObject * MVM_hll_sym_get(MVMThreadContext *tc, MVMString *hll, MVMString *sym) { MVMObject *syms = tc->instance->hll_syms, *hash, *result; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll); if (MVM_is_null(tc, hash)) { MVMROOT(tc, hll, { MVMROOT(tc, syms, { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); }); }); MVM_repr_bind_key_o(tc, syms, hll, hash); result = tc->instance->VMNull; } else { result = MVM_repr_at_key_o(tc, hash, sym); } uv_mutex_unlock(&tc->instance->mutex_hll_syms); return result; } MoarVM-2015.11/src/core/hll.h0000644000175000017500000000473212502366742014534 0ustar jnthnjnthn/* The configuration for a particular High Level Language. Of note, this * indicates the types to use in various situations. */ struct MVMHLLConfig { /* The types the language wishes to get things boxed as. */ MVMObject *int_box_type; MVMObject *num_box_type; MVMObject *str_box_type; /* The type to use for slurpy arrays. */ MVMObject *slurpy_array_type; /* The type to use for slurpy hashes. */ MVMObject *slurpy_hash_type; /* The type to use for array iteration (should have VMIter REPR). */ MVMObject *array_iterator_type; /* The type to use for hash iteration (should have VMIter REPR). */ MVMObject *hash_iterator_type; /* HLL mapping types for cross-HLL boundary for int/num/str. */ MVMObject *foreign_type_int; MVMObject *foreign_type_num; MVMObject *foreign_type_str; /* HLL mapping transforms for array/hash/code. */ MVMObject *foreign_transform_array; MVMObject *foreign_transform_hash; MVMObject *foreign_transform_code; /* The value to substitute for null. */ MVMObject *null_value; /* Language's handler to run at a block's exit time, if needed. */ MVMObject *exit_handler; /* Language's object finalize handler, which can take a list of objects * which need to have a finalizer run. */ MVMObject *finalize_handler; /* Language's handler for various errors, if needed. */ MVMObject *bind_error; MVMObject *method_not_found_error; /* Native reference types. */ MVMObject *int_lex_ref; MVMObject *num_lex_ref; MVMObject *str_lex_ref; MVMObject *int_attr_ref; MVMObject *num_attr_ref; MVMObject *str_attr_ref; MVMObject *int_pos_ref; MVMObject *num_pos_ref; MVMObject *str_pos_ref; /* Array of types to pass to compiler.c */ MVMObject *mast_types; /* HLL name. */ MVMString *name; /* Inline handle to the hash in which this is stored. */ UT_hash_handle hash_handle; }; MVMHLLConfig * MVM_hll_get_config_for(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_hll_set_config(MVMThreadContext *tc, MVMString *name, MVMObject *config_hash); MVM_PUBLIC MVMHLLConfig * MVM_hll_current(MVMThreadContext *tc); void MVM_hll_enter_compilee_mode(MVMThreadContext *tc); void MVM_hll_leave_compilee_mode(MVMThreadContext *tc); void MVM_hll_map(MVMThreadContext *tc, MVMObject *obj, MVMHLLConfig *hll, MVMRegister *res_reg); MVM_PUBLIC MVMObject * MVM_hll_sym_get(MVMThreadContext *tc, MVMString *hll, MVMString *sym); MoarVM-2015.11/src/core/instance.h0000644000175000017500000002676312613656332015571 0ustar jnthnjnthn/* The various "bootstrap" types, based straight off of some core * representations. They are used during the 6model bootstrap. */ struct MVMBootTypes { MVMObject *BOOTInt; MVMObject *BOOTNum; MVMObject *BOOTStr; MVMObject *BOOTArray; MVMObject *BOOTHash; MVMObject *BOOTCCode; MVMObject *BOOTCode; MVMObject *BOOTThread; MVMObject *BOOTIter; MVMObject *BOOTContext; MVMObject *BOOTIntArray; MVMObject *BOOTNumArray; MVMObject *BOOTStrArray; MVMObject *BOOTIO; MVMObject *BOOTException; MVMObject *BOOTStaticFrame; MVMObject *BOOTCompUnit; MVMObject *BOOTMultiCache; MVMObject *BOOTContinuation; MVMObject *BOOTQueue; MVMObject *BOOTAsync; MVMObject *BOOTReentrantMutex; }; /* Various raw types that don't need a HOW */ typedef struct { MVMObject *RawDLLSym; } MVMRawTypes; /* Various common string constants. */ struct MVMStringConsts { MVMString *empty; MVMString *Str; MVMString *Num; MVMString *integer; MVMString *float_str; MVMString *bits; MVMString *unsigned_str; MVMString *find_method; MVMString *type_check; MVMString *accepts_type; MVMString *name; MVMString *attribute; MVMString *of; MVMString *rw; MVMString *type; MVMString *typeobj; MVMString *free_str; MVMString *callback_args; MVMString *encoding; MVMString *inlined; MVMString *repr; MVMString *anon; MVMString *P6opaque; MVMString *array; MVMString *box_target; MVMString *positional_delegate; MVMString *associative_delegate; MVMString *auto_viv_container; MVMString *done; MVMString *error; MVMString *stdout_chars; MVMString *stdout_bytes; MVMString *stderr_chars; MVMString *stderr_bytes; MVMString *buf_type; MVMString *write; MVMString *nativeref; MVMString *refkind; MVMString *positional; MVMString *lexical; MVMString *dimensions; MVMString *ready; }; /* An entry in the representations registry. */ struct MVMReprRegistry { /* name of the REPR */ MVMString *name; /* the REPR vtable */ const MVMREPROps *repr; /* the uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* An entry in the persistent object IDs hash, used to give still-movable * objects a lifetime-unique ID. */ struct MVMObjectId { /* The current object address. */ MVMObject *current; /* Then gen2 address that forms the persistent ID, and where we'll move * the object to if it lives long enough. */ MVMCollectable *gen2_addr; /* Hash handle. */ UT_hash_handle hash_handle; }; /* Represents a MoarVM instance. */ struct MVMInstance { /* The main thread. */ MVMThreadContext *main_thread; /* The ID to allocate the next-created thread. */ AO_t next_user_thread_id; /* The number of active user threads. */ MVMuint16 num_user_threads; /* The event loop thread, a mutex to avoid start-races, a concurrent * queue of tasks that need to be processed by the event loop thread * and an array of active tasks, for the purpose of keeping them GC * marked. */ MVMThreadContext *event_loop_thread; uv_mutex_t mutex_event_loop_start; uv_sem_t sem_event_loop_started; MVMObject *event_loop_todo_queue; MVMObject *event_loop_cancel_queue; MVMObject *event_loop_active; uv_async_t *event_loop_wakeup; /* The VM null object. */ MVMObject *VMNull; /* The KnowHOW meta-object; all other meta-objects (which are * built in user-space) are built out of this. */ MVMObject *KnowHOW; /* The KnowHOWAttribute meta-object; used for declaring attributes * on a KnowHOW. */ MVMObject *KnowHOWAttribute; /* The VM's native string type, using MVMString. Note that this is a * native string, not an object boxing one. */ MVMObject *VMString; /* Serialization context type (known as SCRef, but it's actually the * serialization context itself). */ MVMObject *SCRef; /* Lexotic type, used in implementing return handling. */ MVMObject *Lexotic; /* CallCapture type, used by custom dispatchers. */ MVMObject *CallCapture; /* Thread type, representing a VM-level thread. */ MVMObject *Thread; /* Set of bootstrapping types. */ MVMBootTypes boot_types; /* Set of raw types. */ MVMRawTypes raw_types; /* Set of string constants. */ MVMStringConsts str_consts; /* int -> str cache */ MVMString **int_to_str_cache; /* Multi-dispatch cache and specialization installation mutexes * (global, as the additions are quite low contention, so no * real motivation to have it more fine-grained at present). */ uv_mutex_t mutex_multi_cache_add; uv_mutex_t mutex_spesh_install; /* Log file for specializations, if we're to log them. */ FILE *spesh_log_fh; /* Log file for dynamic var performance, if we're to log it. */ FILE *dynvar_log_fh; MVMint64 dynvar_log_lasttime; /* Flag for if spesh (and certain spesh features) are enabled. */ MVMint8 spesh_enabled; MVMint8 spesh_inline_enabled; MVMint8 spesh_osr_enabled; MVMint8 spesh_nodelay; /* Flag for if NFA debugging is enabled. */ MVMint8 nfa_debug_enabled; /* Flag for if jit is enabled */ MVMint32 jit_enabled; /* File for JIT logging */ FILE *jit_log_fh; /* Directory name for JIT bytecode dumps */ char *jit_bytecode_dir; /* File for map of frame information for bytecode dumps */ FILE *jit_bytecode_map; /* sequence number for JIT compiled frames */ AO_t jit_seq_nr; /* Number of representations registered so far. */ MVMuint32 num_reprs; /* An array mapping representation IDs to registry entries. */ MVMReprRegistry **repr_list; /* A hash mapping representation names to registry entries. */ MVMReprRegistry *repr_hash; /* Mutex for REPR registration. */ uv_mutex_t mutex_repr_registry; /* Number of permanent GC roots we've got, allocated space for, and * a list of the addresses to them. The mutex controls writing to the * list, just in case multiple threads somehow end up doing so. Note * that during a GC the world is stopped so reading is safe. */ MVMuint32 num_permroots; MVMuint32 alloc_permroots; MVMCollectable ***permroots; uv_mutex_t mutex_permroots; /* The current GC run sequence number. May wrap around over time; that * is fine since only equality ever matters. */ AO_t gc_seq_number; /* The number of threads that vote for starting GC. */ AO_t gc_start; /* The number of threads that still need to vote for considering GC done. */ AO_t gc_finish; /* Whether the coordinator considers all in-trays clear. */ AO_t gc_intrays_clearing; /* The number of threads that have yet to acknowledge the finish. */ AO_t gc_ack; /* Linked list (via forwarder) of STables to free. */ MVMSTable *stables_to_free; /* How many bytes of data have we promoted from the nursery to gen2 * since we last did a full collection? */ AO_t gc_promoted_bytes_since_last_full; /* Persistent object ID hash, used to give nursery objects a lifetime * unique ID. Plus a lock to protect it. */ MVMObjectId *object_ids; uv_mutex_t mutex_object_ids; /* MVMThreads completed starting, running, and/or exited. */ /* note: used atomically */ MVMThread *threads; /* raw command line args from APR */ char **raw_clargs; /* Number of passed command-line args */ MVMint64 num_clargs; /* executable name */ const char *exec_name; /* program name; becomes first clargs entry */ const char *prog_name; /* cached parsed command line args */ MVMObject *clargs; /* Any --libpath=... options, to prefix in loadbytecode lookups. */ const char *lib_path[8]; /* Hashes of HLLConfig objects. compiler_hll_configs is those for the * running compiler, and the default. compilee_hll_configs is used if * hll_compilee_depth is > 0. */ MVMHLLConfig *compiler_hll_configs; MVMHLLConfig *compilee_hll_configs; MVMint64 hll_compilee_depth; uv_mutex_t mutex_hllconfigs; /* By far the most common integers are between 0 and 8, but we cache up to 15 * so that it lines up properly. */ MVMIntConstCache *int_const_cache; uv_mutex_t mutex_int_const_cache; /* Atomically-incremented counter of newly invoked frames, used for * lexotic caching. */ AO_t num_frames_run; /* Hash of compiler objects keyed by name */ MVMObject *compiler_registry; uv_mutex_t mutex_compiler_registry; /* Hash of hashes of symbol tables per hll. */ MVMObject *hll_syms; uv_mutex_t mutex_hll_syms; MVMContainerRegistry *container_registry; /* Container registry */ uv_mutex_t mutex_container_registry; /* mutex for container registry */ /* Hash of all loaded DLLs. */ MVMDLLRegistry *dll_registry; uv_mutex_t mutex_dll_registry; /* Hash of all loaded extensions. */ MVMExtRegistry *ext_registry; uv_mutex_t mutex_ext_registry; /* Hash of all registered extension ops. */ MVMExtOpRegistry *extop_registry; uv_mutex_t mutex_extop_registry; /* Hash of all known serialization contexts. Marked for GC iff * the item is unresolved. Also, array of all SCs, used for the * index stored in object headers. When an SC goes away this is * simply nulled. That makes it a small memory leak if a lot of * SCs are created and go away over time. */ MVMSerializationContextBody *sc_weakhash; uv_mutex_t mutex_sc_weakhash; MVMSerializationContextBody **all_scs; MVMuint32 all_scs_next_idx; MVMuint32 all_scs_alloc; /* Hash of filenames of compunits loaded from disk. */ MVMLoadedCompUnitName *loaded_compunits; uv_mutex_t mutex_loaded_compunits; /* Interned callsites. */ MVMCallsiteInterns *callsite_interns; uv_mutex_t mutex_callsite_interns; /* Standard file handles. */ MVMObject *stdin_handle; MVMObject *stdout_handle; MVMObject *stderr_handle; /* Fixed size allocator. */ MVMFixedSizeAlloc *fsa; /* Normal Form Grapheme state (synthetics table, lookup, etc.). */ MVMNFGState *nfg; /* Next type cache ID, to go in STable. */ AO_t cur_type_cache_id; /* The current instrumentation level. Each time we turn on/off some kind * of instrumentation, such as profiling, this is incremented. The next * entry to a frame then knows it should instrument or switch back to an * uninstrumented version. As a special case, when we start up this is set * to 1 which also triggers frame verification. */ MVMuint32 instrumentation_level; /* Whether profiling is turned on or not. */ MVMuint32 profiling; /* Whether cross-thread write logging is turned on or not, and an output * mutex for it. */ MVMuint32 cross_thread_write_logging; MVMuint32 cross_thread_write_logging_include_locked; uv_mutex_t mutex_cross_thread_write_logging; /* Cached backend config hash. */ MVMObject *cached_backend_config; }; /* Returns a true value if we have created user threads (and so are running a * multi-threaded application). */ MVM_STATIC_INLINE MVMint32 MVM_instance_have_user_threads(MVMThreadContext *tc) { return tc->instance->next_user_thread_id != 2; } MoarVM-2015.11/src/core/intcache.c0000644000175000017500000000331012534320622015505 0ustar jnthnjnthn#include "moar.h" void MVM_intcache_for(MVMThreadContext *tc, MVMObject *type) { int type_index; int right_slot = -1; uv_mutex_lock(&tc->instance->mutex_int_const_cache); for (type_index = 0; type_index < 4; type_index++) { if (tc->instance->int_const_cache->types[type_index] == NULL) { right_slot = type_index; break; } else if (tc->instance->int_const_cache->types[type_index] == type) { uv_mutex_unlock(&tc->instance->mutex_int_const_cache); return; } } if (right_slot != -1) { int val; for (val = -1; val < 15; val++) { MVMObject *obj; obj = MVM_repr_alloc_init(tc, type); MVM_repr_set_int(tc, obj, val); tc->instance->int_const_cache->cache[type_index][val + 1] = obj; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->int_const_cache->cache[type_index][val + 1]); } tc->instance->int_const_cache->types[type_index] = type; MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->int_const_cache->types[type_index]); } uv_mutex_unlock(&tc->instance->mutex_int_const_cache); } MVMObject *MVM_intcache_get(MVMThreadContext *tc, MVMObject *type, MVMint64 value) { int type_index; int right_slot = -1; if (value < -1 || value >= 15) return NULL; for (type_index = 0; type_index < 4; type_index++) { if (tc->instance->int_const_cache->types[type_index] == type) { right_slot = type_index; break; } } if (right_slot != -1) { return tc->instance->int_const_cache->cache[right_slot][value + 1]; } return NULL; } MoarVM-2015.11/src/core/intcache.h0000644000175000017500000000034612456307241015525 0ustar jnthnjnthnstruct MVMIntConstCache { MVMObject *types[4]; MVMObject *cache[4][16]; }; void MVM_intcache_for(MVMThreadContext *tc, MVMObject *type); MVMObject *MVM_intcache_get(MVMThreadContext *tc, MVMObject *type, MVMint64 value); MoarVM-2015.11/src/core/interp.c0000644000175000017500000070207212623370227015250 0ustar jnthnjnthn#include "moar.h" #include #include "platform/time.h" /* Macros for getting things from the bytecode stream. */ #define GET_REG(pc, idx) reg_base[*((MVMuint16 *)(pc + idx))] #define GET_LEX(pc, idx, f) f->env[*((MVMuint16 *)(pc + idx))] #define GET_I16(pc, idx) *((MVMint16 *)(pc + idx)) #define GET_UI16(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I32(pc, idx) *((MVMint32 *)(pc + idx)) #define GET_UI32(pc, idx) *((MVMuint32 *)(pc + idx)) #define GET_N32(pc, idx) *((MVMnum32 *)(pc + idx)) #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) #if MVM_CGOTO #define DISPATCH(op) #define OP(name) OP_ ## name #define NEXT *LABELS[NEXT_OP] #else #define DISPATCH(op) switch (op) #define OP(name) case MVM_OP_ ## name #define NEXT runloop #endif static int tracing_enabled = 0; /* This is the interpreter run loop. We have one of these per thread. */ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data) { #if MVM_CGOTO #include "oplabels.h" #endif /* Points to the current opcode. */ MVMuint8 *cur_op = NULL; /* The current frame's bytecode start. */ MVMuint8 *bytecode_start = NULL; /* Points to the base of the current register set for the frame we * are presently in. */ MVMRegister *reg_base = NULL; /* Points to the current compilation unit. */ MVMCompUnit *cu = NULL; /* The current call site we're constructing. */ MVMCallsite *cur_callsite = NULL; /* Stash addresses of current op, register base and SC deref base * in the TC; this will be used by anything that needs to switch * the current place we're interpreting. */ tc->interp_cur_op = &cur_op; tc->interp_bytecode_start = &bytecode_start; tc->interp_reg_base = ®_base; tc->interp_cu = &cu; /* With everything set up, do the initial invocation (exactly what this does * varies depending on if this is starting a new thread or is the top-level * program entry point). */ initial_invoke(tc, invoke_data); /* Set jump point, for if we arrive back in the interpreter from an * exception thrown from C code. */ setjmp(tc->interp_jump); /* Enter runloop. */ runloop: { MVMuint16 op; #if MVM_TRACING if (tracing_enabled) { char *trace_line; tc->cur_frame->throw_address = cur_op; trace_line = MVM_exception_backtrace_line(tc, tc->cur_frame, 0); fprintf(stderr, "Op %d%s\n", (int)*((MVMuint16 *)cur_op), trace_line); /* slow tracing is slow. Feel free to speed it. */ MVM_free(trace_line); } #endif DISPATCH(NEXT_OP) { OP(no_op): goto NEXT; OP(goto): cur_op = bytecode_start + GET_UI32(cur_op, 0); GC_SYNC_POINT(tc); goto NEXT; OP(if_i): if (GET_REG(cur_op, 0).i64) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; OP(unless_i): if (GET_REG(cur_op, 0).i64) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(if_n): if (GET_REG(cur_op, 0).n64 != 0.0) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; OP(unless_n): if (GET_REG(cur_op, 0).n64 != 0.0) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(if_s): { MVMString *str = GET_REG(cur_op, 0).s; if (!str || MVM_string_graphs(tc, str) == 0) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; } OP(unless_s): { MVMString *str = GET_REG(cur_op, 0).s; if (!str || MVM_string_graphs(tc, str) == 0) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; } OP(if_s0): { MVMString *str = GET_REG(cur_op, 0).s; if (!MVM_coerce_istrue_s(tc, str)) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; } OP(unless_s0): { MVMString *str = GET_REG(cur_op, 0).s; if (!MVM_coerce_istrue_s(tc, str)) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; } OP(if_o): GC_SYNC_POINT(tc); MVM_coerce_istrue(tc, GET_REG(cur_op, 0).o, NULL, bytecode_start + GET_UI32(cur_op, 2), cur_op + 6, 0); goto NEXT; OP(unless_o): GC_SYNC_POINT(tc); MVM_coerce_istrue(tc, GET_REG(cur_op, 0).o, NULL, bytecode_start + GET_UI32(cur_op, 2), cur_op + 6, 1); goto NEXT; OP(extend_u8): OP(extend_u16): OP(extend_u32): OP(extend_i8): OP(extend_i16): OP(extend_i32): OP(trunc_u8): OP(trunc_u16): OP(trunc_u32): OP(trunc_i8): OP(trunc_i16): OP(trunc_i32): OP(extend_n32): OP(trunc_n32): MVM_exception_throw_adhoc(tc, "extend/trunc NYI"); OP(set): GET_REG(cur_op, 0) = GET_REG(cur_op, 2); cur_op += 4; goto NEXT; OP(getlex): { MVMFrame *f = tc->cur_frame; MVMuint16 outers = GET_UI16(cur_op, 4); MVMRegister found; while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } GET_REG(cur_op, 0) = found = GET_LEX(cur_op, 2, f); if (found.o == NULL) { MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; if (lexical_types[idx] == MVM_reg_obj) GET_REG(cur_op, 0).o = MVM_frame_vivify_lexical(tc, f, idx); } cur_op += 6; goto NEXT; } OP(bindlex): { MVMFrame *f = tc->cur_frame; MVMuint16 outers = GET_UI16(cur_op, 2); while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "bindlex: outer index out of range"); f = f->outer; outers--; } GET_LEX(cur_op, 0, f) = GET_REG(cur_op, 4); cur_op += 6; goto NEXT; } OP(getlex_ni): GET_REG(cur_op, 0).i64 = MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 2)], MVM_reg_int64)->i64; cur_op += 6; goto NEXT; OP(getlex_nn): GET_REG(cur_op, 0).n64 = MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 2)], MVM_reg_num64)->n64; cur_op += 6; goto NEXT; OP(getlex_ns): GET_REG(cur_op, 0).s = MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 2)], MVM_reg_str)->s; cur_op += 6; goto NEXT; OP(getlex_no): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 2)], MVM_reg_obj); GET_REG(cur_op, 0).o = found ? found->o : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(bindlex_ni): MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 0)], MVM_reg_int64)->i64 = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bindlex_nn): MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 0)], MVM_reg_num64)->n64 = GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(bindlex_ns): MVM_frame_find_lexical_by_name(tc, cu->body.strings[GET_UI32(cur_op, 0)], MVM_reg_str)->s = GET_REG(cur_op, 4).s; cur_op += 6; goto NEXT; OP(bindlex_no): { MVMString *str = cu->body.strings[GET_UI32(cur_op, 0)]; MVMRegister *r = MVM_frame_find_lexical_by_name(tc, str, MVM_reg_obj); if (r) r->o = GET_REG(cur_op, 4).o; else { char *c_str = MVM_string_utf8_encode_C_string(tc, str); char *waste[] = { c_str, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot bind to non-existing object lexical '%s'", c_str); } cur_op += 6; goto NEXT; } OP(getlex_ng): OP(bindlex_ng): MVM_exception_throw_adhoc(tc, "get/bindlex_ng NYI"); OP(return_i): MVM_args_set_result_int(tc, GET_REG(cur_op, 0).i64, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_n): MVM_args_set_result_num(tc, GET_REG(cur_op, 0).n64, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_s): MVM_args_set_result_str(tc, GET_REG(cur_op, 0).s, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_o): MVM_args_set_result_obj(tc, GET_REG(cur_op, 0).o, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return): MVM_args_assert_void_return_ok(tc, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(const_i8): OP(const_i16): OP(const_i32): MVM_exception_throw_adhoc(tc, "const_iX NYI"); OP(const_i64): GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); cur_op += 10; goto NEXT; OP(const_n32): MVM_exception_throw_adhoc(tc, "const_n32 NYI"); OP(const_n64): GET_REG(cur_op, 0).n64 = MVM_BC_get_N64(cur_op, 2); cur_op += 10; goto NEXT; OP(const_s): GET_REG(cur_op, 0).s = cu->body.strings[GET_UI32(cur_op, 2)]; cur_op += 6; goto NEXT; OP(add_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 + GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(sub_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 - GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(mul_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 * GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(div_i): { int num = GET_REG(cur_op, 2).i64; int denom = GET_REG(cur_op, 4).i64; // if we have a negative result, make sure we floor rather // than rounding towards zero. if (denom == 0) MVM_exception_throw_adhoc(tc, "Division by zero"); if ((num < 0) ^ (denom < 0)) { if ((num % denom) != 0) { GET_REG(cur_op, 0).i64 = num / denom - 1; } else { GET_REG(cur_op, 0).i64 = num / denom; } } else { GET_REG(cur_op, 0).i64 = num / denom; } cur_op += 6; goto NEXT; } OP(div_u): GET_REG(cur_op, 0).ui64 = GET_REG(cur_op, 2).ui64 / GET_REG(cur_op, 4).ui64; cur_op += 6; goto NEXT; OP(mod_i): { MVMint64 numer = GET_REG(cur_op, 2).i64; MVMint64 denom = GET_REG(cur_op, 4).i64; if (denom == 0) MVM_exception_throw_adhoc(tc, "Modulation by zero"); GET_REG(cur_op, 0).i64 = numer % denom; cur_op += 6; goto NEXT; } OP(mod_u): GET_REG(cur_op, 0).ui64 = GET_REG(cur_op, 2).ui64 % GET_REG(cur_op, 4).ui64; cur_op += 6; goto NEXT; OP(neg_i): GET_REG(cur_op, 0).i64 = -GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(abs_i): { MVMint64 v = GET_REG(cur_op, 2).i64, mask = v >> 63; GET_REG(cur_op, 0).i64 = (v + mask) ^ mask; cur_op += 4; goto NEXT; } OP(inc_i): GET_REG(cur_op, 0).i64++; cur_op += 2; goto NEXT; OP(inc_u): GET_REG(cur_op, 0).ui64++; cur_op += 2; goto NEXT; OP(dec_i): GET_REG(cur_op, 0).i64--; cur_op += 2; goto NEXT; OP(dec_u): GET_REG(cur_op, 0).ui64--; cur_op += 2; goto NEXT; OP(getcode): GET_REG(cur_op, 0).o = cu->body.coderefs[GET_UI16(cur_op, 2)]; cur_op += 4; goto NEXT; OP(prepargs): cur_callsite = MVM_args_prepare(tc, cu, GET_UI16(cur_op, 0)); cur_op += 2; goto NEXT; OP(arg_i): tc->cur_frame->args[GET_UI16(cur_op, 0)].i64 = GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(arg_n): tc->cur_frame->args[GET_UI16(cur_op, 0)].n64 = GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(arg_s): tc->cur_frame->args[GET_UI16(cur_op, 0)].s = GET_REG(cur_op, 2).s; cur_op += 4; goto NEXT; OP(arg_o): tc->cur_frame->args[GET_UI16(cur_op, 0)].o = GET_REG(cur_op, 2).o; cur_op += 4; goto NEXT; OP(invoke_v): { MVMObject *code = GET_REG(cur_op, 0).o; MVMRegister *args = tc->cur_frame->args; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args); tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; cur_op += 2; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_i): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_INT; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_n): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_NUM; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_s): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_STR; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_o): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(add_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 + GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(sub_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 - GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(mul_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 * GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(div_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 / GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(mod_n): { MVMnum64 a = GET_REG(cur_op, 2).n64; MVMnum64 b = GET_REG(cur_op, 4).n64; GET_REG(cur_op, 0).n64 = b == 0 ? a : a - b * floor(a / b); cur_op += 6; goto NEXT; } OP(neg_n): GET_REG(cur_op, 0).n64 = -GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(abs_n): { MVMnum64 num = GET_REG(cur_op, 2).n64; if (num < 0) num = num * -1; GET_REG(cur_op, 0).n64 = num; cur_op += 4; } goto NEXT; OP(eq_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 == GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(ne_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 != GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(lt_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 < GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(le_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 <= GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(gt_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 > GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(ge_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 >= GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(eq_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 == GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(ne_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 != GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(lt_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 < GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(le_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 <= GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(gt_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 > GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(ge_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 >= GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(argconst_i): tc->cur_frame->args[GET_UI16(cur_op, 0)].i64 = MVM_BC_get_I64(cur_op, 2); cur_op += 10; goto NEXT; OP(argconst_n): tc->cur_frame->args[GET_UI16(cur_op, 0)].n64 = MVM_BC_get_N64(cur_op, 2); cur_op += 10; goto NEXT; OP(argconst_s): tc->cur_frame->args[GET_UI16(cur_op, 0)].s = cu->body.strings[GET_UI32(cur_op, 2)]; cur_op += 6; goto NEXT; OP(checkarity): MVM_args_checkarity(tc, &tc->cur_frame->params, GET_UI16(cur_op, 0), GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_rp_i): GET_REG(cur_op, 0).i64 = MVM_args_get_pos_int(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.i64; cur_op += 4; goto NEXT; OP(param_rp_n): GET_REG(cur_op, 0).n64 = MVM_args_get_pos_num(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.n64; cur_op += 4; goto NEXT; OP(param_rp_s): GET_REG(cur_op, 0).s = MVM_args_get_pos_str(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.s; cur_op += 4; goto NEXT; OP(param_rp_o): GET_REG(cur_op, 0).o = MVM_args_get_pos_obj(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.o; cur_op += 4; goto NEXT; OP(param_op_i): { MVMArgInfo param = MVM_args_get_pos_int(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_n): { MVMArgInfo param = MVM_args_get_pos_num(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_s): { MVMArgInfo param = MVM_args_get_pos_str(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_o): { MVMArgInfo param = MVM_args_get_pos_obj(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_rn_i): GET_REG(cur_op, 0).i64 = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_REQUIRED).arg.i64; cur_op += 6; goto NEXT; OP(param_rn_n): GET_REG(cur_op, 0).n64 = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_REQUIRED).arg.n64; cur_op += 6; goto NEXT; OP(param_rn_s): GET_REG(cur_op, 0).s = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_REQUIRED).arg.s; cur_op += 6; goto NEXT; OP(param_rn_o): GET_REG(cur_op, 0).o = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_REQUIRED).arg.o; cur_op += 6; goto NEXT; OP(param_on_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(coerce_in): GET_REG(cur_op, 0).n64 = (MVMnum64)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(coerce_ni): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(band_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 & GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bor_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 | GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bxor_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 ^ GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bnot_i): GET_REG(cur_op, 0).i64 = ~GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(blshift_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 << GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(brshift_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 >> GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(pow_i): { MVMint64 base = GET_REG(cur_op, 2).i64; MVMint64 exp = GET_REG(cur_op, 4).i64; MVMint64 result = 1; /* "Exponentiation by squaring" */ if (exp < 0) { result = 0; /* because 1/base**-exp is between 0 and 1 */ } else { while (exp) { if (exp & 1) result *= base; exp >>= 1; base *= base; } } GET_REG(cur_op, 0).i64 = result; } cur_op += 6; goto NEXT; OP(pow_n): GET_REG(cur_op, 0).n64 = pow(GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(capturelex): MVM_frame_capturelex(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(takeclosure): GET_REG(cur_op, 0).o = MVM_frame_takeclosure(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(jumplist): { MVMint64 num_labels = MVM_BC_get_I64(cur_op, 0); MVMint64 input = GET_REG(cur_op, 8).i64; cur_op += 10; /* the goto ops are guaranteed valid/existent by validation.c */ if (input < 0 || input >= num_labels) { /* implicitly covers num_labels == 0 */ /* skip the entire goto list block */ cur_op += (6 /* size of each goto op */) * num_labels; } else { /* delve directly into the selected goto op */ cur_op = bytecode_start + GET_UI32(cur_op, input * (6 /* size of each goto op */) + (2 /* size of the goto instruction itself */)); } GC_SYNC_POINT(tc); goto NEXT; } OP(caller): { MVMFrame *caller = tc->cur_frame; MVMint64 depth = GET_REG(cur_op, 2).i64; while (caller && depth-- > 0) /* keep the > 0. */ caller = caller->caller; GET_REG(cur_op, 0).o = caller ? caller->code_ref : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(getdynlex): { GET_REG(cur_op, 0).o = MVM_frame_getdynlex(tc, GET_REG(cur_op, 2).s, tc->cur_frame->caller); cur_op += 4; goto NEXT; } OP(binddynlex): { MVM_frame_binddynlex(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).o, tc->cur_frame->caller); cur_op += 4; goto NEXT; } OP(coerce_is): { GET_REG(cur_op, 0).s = MVM_coerce_i_s(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(coerce_ns): { GET_REG(cur_op, 0).s = MVM_coerce_n_s(tc, GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(coerce_si): GET_REG(cur_op, 0).i64 = MVM_coerce_s_i(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(coerce_sn): GET_REG(cur_op, 0).n64 = MVM_coerce_s_n(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(smrt_numify): { /* Increment PC before calling coercer, as it may make * a method call to get the result. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_smart_numify(tc, obj, res); goto NEXT; } OP(smrt_strify): { /* Increment PC before calling coercer, as it may make * a method call to get the result. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_smart_stringify(tc, obj, res); goto NEXT; } OP(param_sp): GET_REG(cur_op, 0).o = MVM_args_slurpy_positional(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_sn): GET_REG(cur_op, 0).o = MVM_args_slurpy_named(tc, &tc->cur_frame->params); cur_op += 2; goto NEXT; OP(ifnonnull): if (MVM_is_null(tc, GET_REG(cur_op, 0).o)) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(cmp_i): { MVMint64 a = GET_REG(cur_op, 2).i64, b = GET_REG(cur_op, 4).i64; GET_REG(cur_op, 0).i64 = (a > b) - (a < b); cur_op += 6; goto NEXT; } OP(cmp_n): { MVMnum64 a = GET_REG(cur_op, 2).n64, b = GET_REG(cur_op, 4).n64; GET_REG(cur_op, 0).i64 = (a > b) - (a < b); cur_op += 6; goto NEXT; } OP(not_i): { GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 ? 0 : 1; cur_op += 4; goto NEXT; } OP(setlexvalue): { MVMObject *code = GET_REG(cur_op, 0).o; MVMString *name = cu->body.strings[GET_UI32(cur_op, 2)]; MVMObject *val = GET_REG(cur_op, 6).o; MVMint16 flag = GET_I16(cur_op, 8); if (flag < 0 || flag > 2) MVM_exception_throw_adhoc(tc, "setlexvalue provided with invalid flag"); if (IS_CONCRETE(code) && REPR(code)->ID == MVM_REPR_ID_MVMCode) { MVMStaticFrame *sf = ((MVMCode *)code)->body.sf; MVMuint8 found = 0; if (!sf->body.fully_deserialized) MVM_bytecode_finish_frame(tc, sf->body.cu, sf, 0); MVM_string_flatten(tc, name); if (sf->body.lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, sf->body.lexical_names, name, entry); if (entry && sf->body.lexical_types[entry->value] == MVM_reg_obj) { MVM_ASSIGN_REF(tc, &(sf->common.header), sf->body.static_env[entry->value].o, val); sf->body.static_env_flags[entry->value] = (MVMuint8)flag; found = 1; } } if (!found) MVM_exception_throw_adhoc(tc, "setstaticlex given invalid lexical name"); } else { MVM_exception_throw_adhoc(tc, "setstaticlex needs a code ref"); } cur_op += 10; goto NEXT; } OP(exception): GET_REG(cur_op, 0).o = tc->active_handlers ? tc->active_handlers->ex_obj : tc->instance->VMNull; cur_op += 2; goto NEXT; OP(bindexmessage): { MVMObject *ex = GET_REG(cur_op, 0).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) { MVM_ASSIGN_REF(tc, &(ex->header), ((MVMException *)ex)->body.message, GET_REG(cur_op, 2).s); } else { MVM_exception_throw_adhoc(tc, "bindexmessage needs a VMException"); } cur_op += 4; goto NEXT; } OP(bindexpayload): { MVMObject *ex = GET_REG(cur_op, 0).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) { MVM_ASSIGN_REF(tc, &(ex->header), ((MVMException *)ex)->body.payload, GET_REG(cur_op, 2).o); } else { MVM_exception_throw_adhoc(tc, "bindexpayload needs a VMException"); } cur_op += 4; goto NEXT; } OP(bindexcategory): { MVMObject *ex = GET_REG(cur_op, 0).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) ((MVMException *)ex)->body.category = GET_REG(cur_op, 2).i64; else MVM_exception_throw_adhoc(tc, "bindexcategory needs a VMException"); cur_op += 4; goto NEXT; } OP(getexmessage): { MVMObject *ex = GET_REG(cur_op, 2).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) GET_REG(cur_op, 0).s = ((MVMException *)ex)->body.message; else MVM_exception_throw_adhoc(tc, "getexmessage needs a VMException"); cur_op += 4; goto NEXT; } OP(getexpayload): { MVMObject *ex = GET_REG(cur_op, 2).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) GET_REG(cur_op, 0).o = ((MVMException *)ex)->body.payload; else MVM_exception_throw_adhoc(tc, "getexpayload needs a VMException"); cur_op += 4; goto NEXT; } OP(getexcategory): { MVMObject *ex = GET_REG(cur_op, 2).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) GET_REG(cur_op, 0).i64 = ((MVMException *)ex)->body.category; else MVM_exception_throw_adhoc(tc, "getexcategory needs a VMException"); cur_op += 4; goto NEXT; } OP(throwdyn): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, ex_obj, rr); goto NEXT; } OP(throwlex): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_LEX, ex_obj, rr); goto NEXT; } OP(throwlexotic): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_LEXOTIC, ex_obj, rr); goto NEXT; } OP(throwcatdyn): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_DYN, cat, rr); goto NEXT; } OP(throwcatlex): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_LEX, cat, rr); goto NEXT; } OP(throwcatlexotic): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_LEXOTIC, cat, rr); goto NEXT; } OP(die): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMString *str = GET_REG(cur_op, 2).s; cur_op += 4; MVM_exception_die(tc, str, rr); goto NEXT; } OP(takehandlerresult): { GET_REG(cur_op, 0).o = tc->last_handler_result ? tc->last_handler_result : tc->instance->VMNull; tc->last_handler_result = NULL; cur_op += 2; goto NEXT; } OP(newlexotic): { GET_REG(cur_op, 0).o = MVM_exception_newlexotic(tc, GET_UI32(cur_op, 2)); cur_op += 6; goto NEXT; } OP(lexoticresult): { MVMObject *lex = GET_REG(cur_op, 2).o; if (IS_CONCRETE(lex) && REPR(lex)->ID == MVM_REPR_ID_Lexotic) GET_REG(cur_op, 0).o = ((MVMLexotic *)lex)->body.result; else MVM_exception_throw_adhoc(tc, "lexoticresult needs a Lexotic"); cur_op += 4; goto NEXT; } OP(usecapture): GET_REG(cur_op, 0).o = MVM_args_use_capture(tc, tc->cur_frame); cur_op += 2; goto NEXT; OP(savecapture): { /* Create a new call capture object. */ GET_REG(cur_op, 0).o = MVM_args_save_capture(tc, tc->cur_frame); cur_op += 2; goto NEXT; } OP(captureposelems): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = cc->body.apc->num_pos; } else { MVM_exception_throw_adhoc(tc, "captureposelems needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(captureposarg): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).o = MVM_args_get_pos_obj(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64, MVM_ARG_REQUIRED).arg.o; } else { MVM_exception_throw_adhoc(tc, "captureposarg needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = MVM_args_get_pos_int(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64, MVM_ARG_REQUIRED).arg.i64; } else { MVM_exception_throw_adhoc(tc, "captureposarg_i needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).n64 = MVM_args_get_pos_num(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64, MVM_ARG_REQUIRED).arg.n64; } else { MVM_exception_throw_adhoc(tc, "captureposarg_n needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).s = MVM_args_get_pos_str(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64, MVM_ARG_REQUIRED).arg.s; } else { MVM_exception_throw_adhoc(tc, "captureposarg_s needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposprimspec): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMint64 i = GET_REG(cur_op, 4).i64; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; if (i >= 0 && i < cc->body.apc->num_pos) { MVMCallsiteEntry *arg_flags = cc->body.apc->arg_flags ? cc->body.apc->arg_flags : cc->body.apc->callsite->arg_flags; switch (arg_flags[i] & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_INT: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_INT; break; case MVM_CALLSITE_ARG_NUM: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_NUM; break; case MVM_CALLSITE_ARG_STR: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_STR; break; default: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_NONE; break; } } else { MVM_exception_throw_adhoc(tc, "Bad argument index given to captureposprimspec"); } } else { MVM_exception_throw_adhoc(tc, "captureposprimspec needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(invokewithcapture): { MVMObject *cobj = GET_REG(cur_op, 4).o; if (IS_CONCRETE(cobj) && REPR(cobj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMObject *code = GET_REG(cur_op, 2).o; MVMCallCapture *cc = (MVMCallCapture *)cobj; code = MVM_frame_find_invokee(tc, code, NULL); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 6; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cc->body.effective_callsite, cc->body.apc->args); goto NEXT; } else { MVM_exception_throw_adhoc(tc, "invokewithcapture needs a MVMCallCapture"); } } OP(multicacheadd): GET_REG(cur_op, 0).o = MVM_multi_cache_add(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(multicachefind): GET_REG(cur_op, 0).o = MVM_multi_cache_find(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(lexprimspec): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "lexprimspec needs a context"); GET_REG(cur_op, 0).i64 = MVM_frame_lexical_primspec(tc, ((MVMContext *)ctx)->body.context, name); cur_op += 6; goto NEXT; } OP(ceil_n):{ GET_REG(cur_op, 0).n64 = ceil(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(floor_n): { GET_REG(cur_op, 0).n64 = floor(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(assign): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 2).o; const MVMContainerSpec *spec = STABLE(cont)->container_spec; cur_op += 4; if (spec) { spec->store(tc, cont, obj); } else { MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } goto NEXT; } OP(assignunchecked): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 2).o; const MVMContainerSpec *spec = STABLE(cont)->container_spec; cur_op += 4; if (spec) { spec->store_unchecked(tc, cont, obj); } else { MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } goto NEXT; } OP(objprimspec): { MVMObject *type = GET_REG(cur_op, 2).o; if (type) { const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive; } else { GET_REG(cur_op, 0).i64 = 0; } cur_op += 4; goto NEXT; } OP(backtracestrings): GET_REG(cur_op, 0).o = MVM_exception_backtrace_strings(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(masttofile): MVM_mast_to_file(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(masttocu): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMObject *node = GET_REG(cur_op, 2).o; MVMObject *types = GET_REG(cur_op, 4).o; MVMRegister *result_reg = &GET_REG(cur_op, 0); cur_op += 6; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_mast_to_cu(tc, node, types, result_reg); goto NEXT; } OP(iscompunit): { MVMObject *maybe_cu = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit; cur_op += 4; goto NEXT; } OP(compunitmainline): { MVMObject *maybe_cu = GET_REG(cur_op, 2).o; if (REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit) { MVMCompUnit *cu = (MVMCompUnit *)maybe_cu; GET_REG(cur_op, 0).o = cu->body.coderefs[0]; } else { MVM_exception_throw_adhoc(tc, "compunitmainline requires an MVMCompUnit"); } cur_op += 4; goto NEXT; } OP(compunitcodes): { MVMObject * const result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVMCompUnit * const maybe_cu = (MVMCompUnit *)GET_REG(cur_op, 2).o; if (REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit) { const MVMuint32 num_frames = maybe_cu->body.num_frames; MVMObject ** const coderefs = maybe_cu->body.coderefs; MVMuint32 i; for (i = 0; i < num_frames; i++) { MVM_repr_push_o(tc, result, coderefs[i]); } GET_REG(cur_op, 0).o = result; } else { MVM_exception_throw_adhoc(tc, "compunitcodes requires an MVMCompUnit"); } cur_op += 4; goto NEXT; } OP(sleep): { MVM_gc_mark_thread_blocked(tc); MVM_platform_sleep(GET_REG(cur_op, 0).n64); MVM_gc_mark_thread_unblocked(tc); cur_op += 2; goto NEXT; } OP(concat_s): GET_REG(cur_op, 0).s = MVM_string_concatenate(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(repeat_s): GET_REG(cur_op, 0).s = MVM_string_repeat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(substr_s): GET_REG(cur_op, 0).s = MVM_string_substring(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(index_s): GET_REG(cur_op, 0).i64 = MVM_string_index(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(graphs_s): GET_REG(cur_op, 0).i64 = MVM_string_graphs(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(codes_s): GET_REG(cur_op, 0).i64 = MVM_string_codes(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(eq_s): GET_REG(cur_op, 0).i64 = MVM_string_equal(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(ne_s): GET_REG(cur_op, 0).i64 = (MVMint64)(MVM_string_equal(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s)? 0 : 1); cur_op += 6; goto NEXT; OP(eqat_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(haveat_s): GET_REG(cur_op, 0).i64 = MVM_string_have_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s, GET_REG(cur_op, 10).i64); cur_op += 12; goto NEXT; OP(getcp_s): GET_REG(cur_op, 0).i64 = MVM_string_get_grapheme_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(indexcp_s): GET_REG(cur_op, 0).i64 = MVM_string_index_of_grapheme(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(uc): GET_REG(cur_op, 0).s = MVM_string_uc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(lc): GET_REG(cur_op, 0).s = MVM_string_lc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(tc): GET_REG(cur_op, 0).s = MVM_string_tc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(split): GET_REG(cur_op, 0).o = MVM_string_split(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(join): GET_REG(cur_op, 0).s = MVM_string_join(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(replace): GET_REG(cur_op, 0).s = MVM_string_replace(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s); cur_op += 10; goto NEXT; OP(getcpbyname): GET_REG(cur_op, 0).i64 = MVM_unicode_lookup_by_name(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(indexat): /* branches on *failure* to match in the constant string, to save an instruction in regexes */ if (MVM_string_char_at_in_string(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64, cu->body.strings[GET_UI32(cur_op, 4)]) >= 0) cur_op += 12; else cur_op = bytecode_start + GET_UI32(cur_op, 8); GC_SYNC_POINT(tc); goto NEXT; OP(indexnat): /* branches on *failure* to match in the constant string, to save an instruction in regexes */ if (MVM_string_char_at_in_string(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64, cu->body.strings[GET_UI32(cur_op, 4)]) == -1) cur_op += 12; else cur_op = bytecode_start + GET_UI32(cur_op, 8); GC_SYNC_POINT(tc); goto NEXT; OP(unipropcode): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_name_to_property_code(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(unipvalcode): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_name_to_property_value_code(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(hasuniprop): GET_REG(cur_op, 0).i64 = MVM_string_offset_has_unicode_property_value(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(hasunipropc): GET_REG(cur_op, 0).i64 = MVM_string_offset_has_unicode_property_value(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, (MVMint64)GET_UI16(cur_op, 6), (MVMint64)GET_UI16(cur_op, 8)); cur_op += 10; goto NEXT; OP(getuniprop_bool): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_get_property_bool(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getuniprop_int): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_get_property_int(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getuniprop_str): GET_REG(cur_op, 0).s = MVM_unicode_codepoint_get_property_str(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(matchuniprop): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_has_property_value(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(getuniname): { GET_REG(cur_op, 0).s = MVM_unicode_get_name(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(chars): GET_REG(cur_op, 0).i64 = MVM_string_graphs(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(chr): GET_REG(cur_op, 0).s = MVM_string_chr(tc, (MVMCodepoint)GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(ordfirst): { MVMString *s = GET_REG(cur_op, 2).s; MVMGrapheme32 g = MVM_string_get_grapheme_at(tc, s, 0); GET_REG(cur_op, 0).i64 = g >= 0 ? g : MVM_nfg_get_synthetic_info(tc, g)->base; cur_op += 4; goto NEXT; } OP(ordat): { MVMString *s = GET_REG(cur_op, 2).s; MVMGrapheme32 g = MVM_string_get_grapheme_at(tc, s, GET_REG(cur_op, 4).i64); GET_REG(cur_op, 0).i64 = g >= 0 ? g : MVM_nfg_get_synthetic_info(tc, g)->base; cur_op += 6; goto NEXT; } OP(rindexfrom): GET_REG(cur_op, 0).i64 = MVM_string_index_from_end(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(escape): GET_REG(cur_op, 0).s = MVM_string_escape(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(flip): GET_REG(cur_op, 0).s = MVM_string_flip(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(iscclass): GET_REG(cur_op, 0).i64 = MVM_string_is_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(findcclass): GET_REG(cur_op, 0).i64 = MVM_string_find_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(findnotcclass): GET_REG(cur_op, 0).i64 = MVM_string_find_not_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(nfafromstatelist): GET_REG(cur_op, 0).o = MVM_nfa_from_statelist(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(nfarunproto): GET_REG(cur_op, 0).o = MVM_nfa_run_proto(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(nfarunalt): MVM_nfa_run_alt(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(flattenropes): MVM_string_flatten(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(gt_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) == 1; cur_op += 6; goto NEXT; OP(ge_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) >= 0; cur_op += 6; goto NEXT; OP(lt_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) == -1; cur_op += 6; goto NEXT; OP(le_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) <= 0; cur_op += 6; goto NEXT; OP(cmp_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(radix): GET_REG(cur_op, 0).o = MVM_radix(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(eqatic_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at_ignore_case(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(sin_n): GET_REG(cur_op, 0).n64 = sin(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(asin_n): GET_REG(cur_op, 0).n64 = asin(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(cos_n): GET_REG(cur_op, 0).n64 = cos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(acos_n): GET_REG(cur_op, 0).n64 = acos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(tan_n): GET_REG(cur_op, 0).n64 = tan(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(atan_n): GET_REG(cur_op, 0).n64 = atan(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(atan2_n): GET_REG(cur_op, 0).n64 = atan2(GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(sec_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = 1.0 / cos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(asec_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = acos(1.0 / GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sinh_n): GET_REG(cur_op, 0).n64 = sinh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(cosh_n): GET_REG(cur_op, 0).n64 = cosh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(tanh_n): GET_REG(cur_op, 0).n64 = tanh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sech_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = 1.0 / cosh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sqrt_n): GET_REG(cur_op, 0).n64 = sqrt(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(gcd_i): { MVMint64 a = labs(GET_REG(cur_op, 2).i64), b = labs(GET_REG(cur_op, 4).i64), c; while ( b != 0 ) { c = a % b; a = b; b = c; } GET_REG(cur_op, 0).i64 = a; cur_op += 6; goto NEXT; } OP(lcm_i): { MVMint64 a = GET_REG(cur_op, 2).i64, b = GET_REG(cur_op, 4).i64, c, a_ = a, b_ = b; while ( b != 0 ) { c = a % b; a = b; b = c; } c = a; GET_REG(cur_op, 0).i64 = a_ / c * b_; cur_op += 6; goto NEXT; } OP(abs_I): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_abs(tc, result, GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).o = result; cur_op += 6; goto NEXT; } OP(neg_I): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_neg(tc, result, GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).o = result; cur_op += 6; goto NEXT; } OP(bool_I): GET_REG(cur_op, 0).i64 = MVM_bigint_bool(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(add_I): GET_REG(cur_op, 0).o = MVM_bigint_add(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(sub_I): GET_REG(cur_op, 0).o = MVM_bigint_sub(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(mul_I): GET_REG(cur_op, 0).o = MVM_bigint_mul(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(div_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_div(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(mod_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_mod(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(expmod_I): { MVMObject * const type = GET_REG(cur_op, 8).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_expmod(tc, result, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); GET_REG(cur_op, 0).o = result; cur_op += 10; goto NEXT; } OP(gcd_I): { GET_REG(cur_op, 0).o = MVM_bigint_gcd(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(lcm_I): GET_REG(cur_op, 0).o = MVM_bigint_lcm(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(bor_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_or(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(bxor_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_xor(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(band_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_and(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(bnot_I): { MVMObject * const type = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).o = MVM_bigint_not(tc, type, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; } OP(blshift_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_shl(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 8; goto NEXT; } OP(brshift_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_shr(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 8; goto NEXT; } OP(pow_I): GET_REG(cur_op, 0).o = MVM_bigint_pow(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(cmp_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(eq_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_EQ == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(ne_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_EQ != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(lt_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_LT == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(le_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_GT != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(gt_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_GT == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(ge_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_LT != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(isprime_I): { MVMObject *a = GET_REG(cur_op, 2).o; MVMint64 b = GET_REG(cur_op, 4).i64; GET_REG(cur_op, 0).i64 = MVM_bigint_is_prime(tc, a, b); cur_op += 6; goto NEXT; } OP(rand_I): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const rnd = MVM_repr_alloc_init(tc, type); MVM_bigint_rand(tc, rnd, GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).o = rnd; cur_op += 6; goto NEXT; } OP(coerce_nI): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_from_num(tc, result, GET_REG(cur_op, 2).n64); GET_REG(cur_op, 0).o = result; cur_op += 6; goto NEXT; } OP(coerce_sI): { MVMString *s = GET_REG(cur_op, 2).s; MVMObject *type = GET_REG(cur_op, 4).o; char *buf = MVM_string_ascii_encode(tc, s, NULL); MVMObject *a = MVM_repr_alloc_init(tc, type); MVM_bigint_from_str(tc, a, buf); MVM_free(buf); GET_REG(cur_op, 0).o = a; cur_op += 6; goto NEXT; } OP(coerce_In): { MVMObject *a = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).n64 = MVM_bigint_to_num(tc, a); cur_op += 4; goto NEXT; } OP(coerce_Is): { GET_REG(cur_op, 0).s = MVM_bigint_to_str(tc, GET_REG(cur_op, 2).o, 10); cur_op += 4; goto NEXT; } OP(isbig_I): { GET_REG(cur_op, 0).i64 = MVM_bigint_is_big(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(base_I): { GET_REG(cur_op, 0).s = MVM_bigint_to_str(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; } OP(radix_I): GET_REG(cur_op, 0).o = MVM_bigint_radix(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(div_In): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).n64 = MVM_bigint_div_num(tc, a, b); cur_op += 6; goto NEXT; } OP(log_n): GET_REG(cur_op, 0).n64 = log(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(exp_n): GET_REG(cur_op, 0).n64 = exp(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(knowhow): GET_REG(cur_op, 0).o = tc->instance->KnowHOW; cur_op += 2; goto NEXT; OP(findmeth): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = cu->body.strings[GET_UI32(cur_op, 4)]; cur_op += 8; MVM_6model_find_method(tc, obj, name, res); goto NEXT; } OP(findmeth_s): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; cur_op += 6; MVM_6model_find_method(tc, obj, name, res); goto NEXT; } OP(can): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = cu->body.strings[GET_UI32(cur_op, 4)]; cur_op += 8; MVM_6model_can_method(tc, obj, name, res); goto NEXT; } OP(can_s): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; cur_op += 6; MVM_6model_can_method(tc, obj, name, res); goto NEXT; } OP(create): { /* Ordering here matters. We write the object into the * register before calling initialize. This is because * if initialize allocates, obj may have moved after * we called it. Note that type is never used after * the initial allocate call also. This saves us having * to put things on the temporary stack. The GC will * know to update it in the register if it moved. */ MVMObject *type = GET_REG(cur_op, 2).o; MVMObject *obj = REPR(type)->allocate(tc, STABLE(type)); GET_REG(cur_op, 0).o = obj; if (REPR(obj)->initialize) REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(gethow): GET_REG(cur_op, 0).o = MVM_6model_get_how(tc, STABLE(GET_REG(cur_op, 2).o)); cur_op += 4; goto NEXT; OP(getwhat): GET_REG(cur_op, 0).o = STABLE(GET_REG(cur_op, 2).o)->WHAT; cur_op += 4; goto NEXT; OP(atkey_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 6; goto NEXT; } OP(atkey_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 6; goto NEXT; } OP(atkey_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 6; goto NEXT; } OP(atkey_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj)) REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_obj); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(bindkey_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(existskey): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(obj)->ass_funcs.exists_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(deletekey): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.delete_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(getwhere): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).o; cur_op += 4; goto NEXT; OP(eqaddr): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).o == GET_REG(cur_op, 4).o ? 1 : 0; cur_op += 6; goto NEXT; OP(reprname): { const MVMREPROps *repr = REPR(GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).s = tc->instance->repr_list[repr->ID]->name; cur_op += 4; goto NEXT; } OP(isconcrete): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && IS_CONCRETE(obj) ? 1 : 0; cur_op += 4; goto NEXT; } OP(atpos_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 6; goto NEXT; } OP(atpos_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 6; goto NEXT; } OP(atpos_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 6; goto NEXT; } OP(atpos_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj)) REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_obj); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(bindpos_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(push_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(push_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(push_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(push_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(pop_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(pop_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(pop_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 4; goto NEXT; } OP(pop_o): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(unshift_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(unshift_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(unshift_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_str); cur_op += 4; goto NEXT; } OP(unshift_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(shift_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(shift_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(shift_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 4; goto NEXT; } OP(shift_o): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(splice): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.splice(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; } OP(setelemspos): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.set_elems(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(box_i): { MVM_box_int(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(box_n): { MVM_box_num(tc, GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(box_s): { MVM_box_str(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(unbox_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); GET_REG(cur_op, 0).i64 = REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(unbox_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); GET_REG(cur_op, 0).n64 = REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(unbox_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); GET_REG(cur_op, 0).s = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(bindattr_i): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, cu->body.strings[GET_UI32(cur_op, 4)], GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_n): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, cu->body.strings[GET_UI32(cur_op, 4)], GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_s): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, cu->body.strings[GET_UI32(cur_op, 4)], GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_o): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, cu->body.strings[GET_UI32(cur_op, 4)], GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattrs_i): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_n): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_s): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_o): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a type object"); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(getattr_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)], GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 12; goto NEXT; } OP(getattr_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)], GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 12; goto NEXT; } OP(getattr_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)], GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 12; goto NEXT; } OP(getattr_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)], GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 12; goto NEXT; } OP(getattrs_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 8; goto NEXT; } OP(getattrs_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 8; goto NEXT; } OP(getattrs_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 8; goto NEXT; } OP(getattrs_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 8; goto NEXT; } OP(hintfor): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(obj)->attr_funcs.hint_for(tc, STABLE(obj), obj, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(isnull): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = MVM_is_null(tc, obj); cur_op += 4; goto NEXT; } OP(knowhowattr): GET_REG(cur_op, 0).o = tc->instance->KnowHOWAttribute; cur_op += 2; goto NEXT; OP(iscoderef): GET_REG(cur_op, 0).i64 = !GET_REG(cur_op, 2).o || STABLE(GET_REG(cur_op, 2).o)->invoke == MVM_6model_invoke_default ? 0 : 1; cur_op += 4; goto NEXT; OP(null): GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 2; goto NEXT; OP(clone): { MVMObject *value = GET_REG(cur_op, 2).o; if (IS_CONCRETE(value)) { MVMROOT(tc, value, { MVMObject *cloned = REPR(value)->allocate(tc, STABLE(value)); /* Ordering here matters. We write the object into the * register before calling copy_to. This is because * if copy_to allocates, obj may have moved after * we called it. This saves us having to put things on * the temporary stack. The GC will know to update it * in the register if it moved. */ GET_REG(cur_op, 0).o = cloned; REPR(value)->copy_to(tc, STABLE(value), OBJECT_BODY(value), cloned, OBJECT_BODY(cloned)); }); } else { GET_REG(cur_op, 0).o = value; } cur_op += 4; goto NEXT; } OP(isnull_s): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).s ? 0 : 1; cur_op += 4; goto NEXT; OP(bootint): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTInt; cur_op += 2; goto NEXT; OP(bootnum): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTNum; cur_op += 2; goto NEXT; OP(bootstr): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTStr; cur_op += 2; goto NEXT; OP(bootarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTArray; cur_op += 2; goto NEXT; OP(boothash): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTHash; cur_op += 2; goto NEXT; OP(sethllconfig): MVM_hll_set_config(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(hllboxtype_i): GET_REG(cur_op, 0).o = cu->body.hll_config->int_box_type; cur_op += 2; goto NEXT; OP(hllboxtype_n): GET_REG(cur_op, 0).o = cu->body.hll_config->num_box_type; cur_op += 2; goto NEXT; OP(hllboxtype_s): GET_REG(cur_op, 0).o = cu->body.hll_config->str_box_type; cur_op += 2; goto NEXT; OP(elems): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = (MVMint64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(null_s): GET_REG(cur_op, 0).s = NULL; cur_op += 2; goto NEXT; OP(newtype): { MVMObject *how = GET_REG(cur_op, 2).o; MVMString *repr_name = GET_REG(cur_op, 4).s; const MVMREPROps *repr = MVM_repr_get_by_name(tc, repr_name); GET_REG(cur_op, 0).o = repr->type_object_for(tc, how); cur_op += 6; goto NEXT; } OP(isint): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6int ? 1 : 0; cur_op += 4; goto NEXT; } OP(isnum): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6num ? 1 : 0; cur_op += 4; goto NEXT; } OP(isstr): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6str ? 1 : 0; cur_op += 4; goto NEXT; } OP(islist): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_MVMArray ? 1 : 0; cur_op += 4; goto NEXT; } OP(ishash): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_MVMHash ? 1 : 0; cur_op += 4; goto NEXT; } OP(iter): { GET_REG(cur_op, 0).o = MVM_iter(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(iterkey_s): { GET_REG(cur_op, 0).s = MVM_iterkey_s(tc, (MVMIter *)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(iterval): { GET_REG(cur_op, 0).o = MVM_iterval(tc, (MVMIter *)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(getcodename): { MVMObject *co = GET_REG(cur_op, 2).o; if (REPR(co)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(co)) MVM_exception_throw_adhoc(tc, "getcodename requires a concrete code object"); GET_REG(cur_op, 0).s = ((MVMCode *)co)->body.name; cur_op += 4; goto NEXT; } OP(composetype): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->compose(tc, STABLE(obj), GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; cur_op += 6; goto NEXT; } OP(setmethcache): { MVMObject *iter = MVM_iter(tc, GET_REG(cur_op, 2).o); MVMObject *cache; MVMSTable *stable; MVMROOT(tc, iter, { cache = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); }); while (MVM_iter_istrue(tc, (MVMIter *)iter)) { MVMRegister result; REPR(iter)->pos_funcs.shift(tc, STABLE(iter), iter, OBJECT_BODY(iter), &result, MVM_reg_obj); MVM_repr_bind_key_o(tc, cache, MVM_iterkey_s(tc, (MVMIter *)iter), MVM_iterval(tc, (MVMIter *)iter)); } stable = STABLE(GET_REG(cur_op, 0).o); MVM_ASSIGN_REF(tc, &(stable->header), stable->method_cache, cache); stable->method_cache_sc = NULL; MVM_SC_WB_ST(tc, stable); cur_op += 4; goto NEXT; } OP(setmethcacheauth): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMint64 new_flags = STABLE(obj)->mode_flags & (~MVM_METHOD_CACHE_AUTHORITATIVE); MVMint64 flag = GET_REG(cur_op, 2).i64; if (flag != 0) new_flags |= MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(obj)->mode_flags = new_flags; MVM_SC_WB_ST(tc, STABLE(obj)); cur_op += 4; goto NEXT; } OP(settypecache): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *types = GET_REG(cur_op, 2).o; MVMSTable *st = STABLE(obj); MVMint64 i, elems = REPR(types)->elems(tc, STABLE(types), types, OBJECT_BODY(types)); MVMObject **cache = MVM_malloc(sizeof(MVMObject *) * elems); for (i = 0; i < elems; i++) { MVM_ASSIGN_REF(tc, &(st->header), cache[i], MVM_repr_at_pos_o(tc, types, i)); } /* technically this free isn't thread safe */ if (st->type_check_cache) MVM_free(st->type_check_cache); st->type_check_cache = cache; st->type_check_cache_length = (MVMuint16)elems; MVM_SC_WB_ST(tc, st); cur_op += 4; goto NEXT; } OP(setinvokespec): { MVMObject *obj = GET_REG(cur_op, 0).o, *ch = GET_REG(cur_op, 2).o, *invocation_handler = GET_REG(cur_op, 6).o; MVMString *name = GET_REG(cur_op, 4).s; MVMInvocationSpec *is = MVM_calloc(1, sizeof(MVMInvocationSpec)); MVMSTable *st = STABLE(obj); MVM_ASSIGN_REF(tc, &(st->header), is->class_handle, ch); MVM_ASSIGN_REF(tc, &(st->header), is->attr_name, name); if (ch && name) is->hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, name); MVM_ASSIGN_REF(tc, &(st->header), is->invocation_handler, invocation_handler); /* XXX not thread safe, but this should occur on non-shared objects anyway... */ if (st->invocation_spec) MVM_free(st->invocation_spec); st->invocation_spec = is; cur_op += 8; goto NEXT; } OP(isinvokable): { MVMSTable *st = STABLE(GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).i64 = st->invoke == MVM_6model_invoke_default ? (st->invocation_spec ? 1 : 0) : 1; cur_op += 4; goto NEXT; } OP(iscont): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = MVM_is_null(tc, obj) || STABLE(obj)->container_spec == NULL ? 0 : 1; cur_op += 4; goto NEXT; } OP(decont): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; if (obj && IS_CONCRETE(obj) && STABLE(obj)->container_spec) STABLE(obj)->container_spec->fetch(tc, obj, r); else r->o = obj; goto NEXT; } OP(setboolspec): { MVMSTable *st = GET_REG(cur_op, 0).o->st; MVMBoolificationSpec *bs = MVM_malloc(sizeof(MVMBoolificationSpec)); bs->mode = (MVMuint32)GET_REG(cur_op, 2).i64; MVM_ASSIGN_REF(tc, &(st->header), bs->method, GET_REG(cur_op, 4).o); st->boolification_spec = bs; cur_op += 6; goto NEXT; } OP(istrue): { /* Increment PC first then call coerce, since it may want to * do an invocation. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_istrue(tc, obj, res, NULL, NULL, 0); goto NEXT; } OP(isfalse): { /* Increment PC first then call coerce, since it may want to * do an invocation. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_istrue(tc, obj, res, NULL, NULL, 1); goto NEXT; } OP(istrue_s): GET_REG(cur_op, 0).i64 = MVM_coerce_istrue_s(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(isfalse_s): GET_REG(cur_op, 0).i64 = MVM_coerce_istrue_s(tc, GET_REG(cur_op, 2).s) ? 0 : 1; cur_op += 4; goto NEXT; OP(getcodeobj): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).o = MVM_frame_get_code_object(tc, (MVMCode *)obj); cur_op += 4; goto NEXT; } OP(setcodeobj): { MVMObject *obj = GET_REG(cur_op, 0).o; if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { MVM_ASSIGN_REF(tc, &(obj->header), ((MVMCode *)obj)->body.code_object, GET_REG(cur_op, 2).o); } else { MVM_exception_throw_adhoc(tc, "setcodeobj needs a code ref"); } cur_op += 4; goto NEXT; } OP(setcodename): { MVMObject *obj = GET_REG(cur_op, 0).o; if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { MVM_ASSIGN_REF(tc, &(obj->header), ((MVMCode *)obj)->body.name, GET_REG(cur_op, 2).s); } else { MVM_exception_throw_adhoc(tc, "setcodename needs a code ref"); } cur_op += 4; goto NEXT; } OP(forceouterctx): { MVMObject *obj = GET_REG(cur_op, 0).o, *ctx = GET_REG(cur_op, 2).o; MVMFrame *orig; MVMFrame *context; MVMStaticFrame *sf; if (REPR(obj)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(obj)) { MVM_exception_throw_adhoc(tc, "forceouterctx needs a code ref"); } if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) { MVM_exception_throw_adhoc(tc, "forceouterctx needs a context"); } orig = ((MVMCode *)obj)->body.outer; sf = ((MVMCode *)obj)->body.sf; context = ((MVMContext *)ctx)->body.context; MVM_ASSIGN_REF(tc, &(((MVMObject *)sf)->header), sf->body.outer, context->static_info); if (orig != context) { ((MVMCode *)obj)->body.outer = context; MVM_frame_inc_ref(tc, context); if (orig) { MVM_frame_dec_ref(tc, orig); } } cur_op += 4; goto NEXT; } OP(getcomp): { MVMObject *obj = tc->instance->compiler_registry; uv_mutex_lock(&tc->instance->mutex_compiler_registry); GET_REG(cur_op, 0).o = MVM_repr_at_key_o(tc, obj, GET_REG(cur_op, 2).s); uv_mutex_unlock(&tc->instance->mutex_compiler_registry); cur_op += 4; goto NEXT; } OP(bindcomp): { MVMObject *obj = tc->instance->compiler_registry; uv_mutex_lock(&tc->instance->mutex_compiler_registry); REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_obj); uv_mutex_unlock(&tc->instance->mutex_compiler_registry); GET_REG(cur_op, 0).o = GET_REG(cur_op, 4).o; cur_op += 6; goto NEXT; } OP(getcurhllsym): { MVMString *hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; GET_REG(cur_op, 0).o = MVM_hll_sym_get(tc, hll_name, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; } OP(bindcurhllsym): { MVMObject *syms = tc->instance->hll_syms, *hash; MVMString *hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll_name); if (MVM_is_null(tc, hash)) { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* must re-get syms in case it moved */ syms = tc->instance->hll_syms; hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; MVM_repr_bind_key_o(tc, syms, hll_name, hash); } MVM_repr_bind_key_o(tc, hash, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 4).o; uv_mutex_unlock(&tc->instance->mutex_hll_syms); cur_op += 6; goto NEXT; } OP(getwho): { MVMObject *who = STABLE(GET_REG(cur_op, 2).o)->WHO; GET_REG(cur_op, 0).o = who ? who : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(setwho): { MVMSTable *st = STABLE(GET_REG(cur_op, 2).o); MVM_ASSIGN_REF(tc, &(st->header), st->WHO, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; cur_op += 6; goto NEXT; } OP(rebless): if (!REPR(GET_REG(cur_op, 2).o)->change_type) { MVM_exception_throw_adhoc(tc, "This REPR cannot change type"); } REPR(GET_REG(cur_op, 2).o)->change_type(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 6; MVM_spesh_deopt_all(tc); goto NEXT; OP(istype): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMObject *type = GET_REG(cur_op, 4).o; cur_op += 6; MVM_6model_istype(tc, obj, type, res); goto NEXT; } OP(ctx): { MVMObject *ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, tc->cur_frame); GET_REG(cur_op, 0).o = ctx; cur_op += 2; goto NEXT; } OP(ctxouter): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxouter needs an MVMContext"); } if ((frame = ((MVMContext *)this_ctx)->body.context->outer)) { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, frame); GET_REG(cur_op, 0).o = ctx; } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 4; goto NEXT; } OP(ctxcaller): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx = NULL; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxcaller needs an MVMContext"); } if ((frame = ((MVMContext *)this_ctx)->body.context->caller)) { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, frame); } GET_REG(cur_op, 0).o = ctx ? ctx : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(ctxlexpad): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxlexpad needs an MVMContext"); } GET_REG(cur_op, 0).o = this_ctx; cur_op += 4; goto NEXT; } OP(curcode): GET_REG(cur_op, 0).o = tc->cur_frame->code_ref; cur_op += 2; goto NEXT; OP(callercode): { GET_REG(cur_op, 0).o = tc->cur_frame->caller ? tc->cur_frame->caller->code_ref : tc->instance->VMNull; cur_op += 2; goto NEXT; } OP(bootintarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTIntArray; cur_op += 2; goto NEXT; OP(bootnumarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTNumArray; cur_op += 2; goto NEXT; OP(bootstrarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTStrArray; cur_op += 2; goto NEXT; OP(hlllist): GET_REG(cur_op, 0).o = cu->body.hll_config->slurpy_array_type; cur_op += 2; goto NEXT; OP(hllhash): GET_REG(cur_op, 0).o = cu->body.hll_config->slurpy_hash_type; cur_op += 2; goto NEXT; OP(attrinited): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a type object"); GET_REG(cur_op, 0).i64 = REPR(obj)->attr_funcs.is_attribute_initialized(tc, STABLE(obj), OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, MVM_NO_HINT); cur_op += 8; goto NEXT; } OP(setcontspec): { MVMSTable *st = STABLE(GET_REG(cur_op, 0).o); MVMString *name = GET_REG(cur_op, 2).s; const MVMContainerConfigurer *cc = MVM_6model_get_container_config(tc, name); if (cc == NULL) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot use unknown container spec %s", c_name); } if (st->container_spec) MVM_exception_throw_adhoc(tc, "Cannot change a type's container specification"); cc->set_container_spec(tc, st); cc->configure_container_spec(tc, st, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; } OP(existspos): GET_REG(cur_op, 0).i64 = MVM_repr_exists_pos(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(gethllsym): GET_REG(cur_op, 0).o = MVM_hll_sym_get(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(freshcoderef): { MVMObject * const cr = GET_REG(cur_op, 2).o; MVMCode *ncr; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "freshcoderef requires a coderef"); ncr = (MVMCode *)(GET_REG(cur_op, 0).o = MVM_repr_clone(tc, cr)); MVMROOT(tc, ncr, { MVMStaticFrame *nsf; if (!ncr->body.sf->body.fully_deserialized) MVM_bytecode_finish_frame(tc, ncr->body.sf->body.cu, ncr->body.sf, 0); nsf = (MVMStaticFrame *)MVM_repr_clone(tc, (MVMObject *)ncr->body.sf); MVM_ASSIGN_REF(tc, &(ncr->common.header), ncr->body.sf, nsf); MVM_ASSIGN_REF(tc, &(ncr->common.header), ncr->body.sf->body.static_code, ncr); }); cur_op += 4; goto NEXT; } OP(markcodestatic): { MVMObject * const cr = GET_REG(cur_op, 0).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "markcodestatic requires a coderef"); ((MVMCode *)cr)->body.is_static = 1; cur_op += 2; goto NEXT; } OP(markcodestub): { MVMObject * const cr = GET_REG(cur_op, 0).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "markcodestub requires a coderef"); ((MVMCode *)cr)->body.is_compiler_stub = 1; cur_op += 2; goto NEXT; } OP(getstaticcode): { MVMObject * const cr = GET_REG(cur_op, 2).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "getstaticcode requires a static coderef"); GET_REG(cur_op, 0).o = (MVMObject *)((MVMCode *)cr)->body.sf->body.static_code; cur_op += 4; goto NEXT; } OP(getcodecuid): { MVMObject * const cr = GET_REG(cur_op, 2).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(cr)) MVM_exception_throw_adhoc(tc, "getcodecuid requires a static coderef"); GET_REG(cur_op, 0).s = ((MVMCode *)cr)->body.sf->body.cuuid; cur_op += 4; goto NEXT; } OP(copy_f): MVM_file_copy(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(append_f): MVM_exception_throw_adhoc(tc, "append is not supported"); goto NEXT; OP(rename_f): MVM_file_rename(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(delete_f): MVM_file_delete(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(chmod_f): MVM_file_chmod(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(exists_f): GET_REG(cur_op, 0).i64 = MVM_file_exists(tc, GET_REG(cur_op, 2).s, 0); cur_op += 4; goto NEXT; OP(mkdir): MVM_dir_mkdir(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(rmdir): MVM_dir_rmdir(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(open_dir): GET_REG(cur_op, 0).o = MVM_dir_open(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(read_dir): GET_REG(cur_op, 0).s = MVM_dir_read(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(close_dir): MVM_dir_close(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(open_fh): GET_REG(cur_op, 0).o = MVM_file_open_fh(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(close_fh): MVM_io_close(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(read_fhs): GET_REG(cur_op, 0).s = MVM_io_read_string(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(slurp): GET_REG(cur_op, 0).s = MVM_file_slurp(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(spew): MVM_file_spew(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(write_fhs): GET_REG(cur_op, 0).i64 = MVM_io_write_string(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, 0); cur_op += 6; goto NEXT; OP(seek_fh): MVM_io_seek(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(lock_fh): GET_REG(cur_op, 0).i64 = MVM_io_lock(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(unlock_fh): MVM_io_unlock(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(sync_fh): MVM_io_flush(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(trunc_fh): MVM_io_truncate(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(eof_fh): GET_REG(cur_op, 0).i64 = MVM_io_eof(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(getstdin): if (MVM_is_null(tc, tc->instance->stdin_handle)) MVM_exception_throw_adhoc(tc, "STDIN filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stdin_handle; cur_op += 2; goto NEXT; OP(getstdout): if (MVM_is_null(tc, tc->instance->stdout_handle)) MVM_exception_throw_adhoc(tc, "STDOUT filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stdout_handle; cur_op += 2; goto NEXT; OP(getstderr): if (MVM_is_null(tc, tc->instance->stderr_handle)) MVM_exception_throw_adhoc(tc, "STDERR filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stderr_handle; cur_op += 2; goto NEXT; OP(connect_sk): MVM_io_connect(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(socket): GET_REG(cur_op, 0).o = MVM_io_socket_create(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(bind_sk): MVM_io_bind(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(setinputlinesep_fh): MVM_io_set_separator(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(accept_sk): GET_REG(cur_op, 0).o = MVM_io_accept(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(decodetocodes): OP(encodefromcodes): MVM_exception_throw_adhoc(tc, "NYI"); OP(setencoding): MVM_io_set_encoding(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(print): MVM_string_print(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(say): MVM_string_say(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(readall_fh): GET_REG(cur_op, 0).s = MVM_io_slurp(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(tell_fh): GET_REG(cur_op, 0).i64 = MVM_io_tell(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(stat): GET_REG(cur_op, 0).i64 = MVM_file_stat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 0); cur_op += 6; goto NEXT; OP(readline_fh): GET_REG(cur_op, 0).s = MVM_io_readline(tc, GET_REG(cur_op, 2).o, 0); cur_op += 4; goto NEXT; OP(readlineint_fh): cur_op += 6; goto NEXT; OP(chdir): MVM_dir_chdir(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(rand_i): GET_REG(cur_op, 0).i64 = MVM_proc_rand_i(tc); cur_op += 2; goto NEXT; OP(rand_n): GET_REG(cur_op, 0).n64 = MVM_proc_rand_n(tc); cur_op += 2; goto NEXT; OP(srand): MVM_proc_seed(tc, GET_REG(cur_op, 0).i64); cur_op += 2; goto NEXT; OP(time_i): GET_REG(cur_op, 0).i64 = MVM_proc_time_i(tc); cur_op += 2; goto NEXT; OP(clargs): GET_REG(cur_op, 0).o = MVM_proc_clargs(tc); cur_op += 2; goto NEXT; OP(newthread): GET_REG(cur_op, 0).o = MVM_thread_new(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(threadjoin): MVM_thread_join(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(time_n): GET_REG(cur_op, 0).n64 = MVM_proc_time_n(tc); cur_op += 2; goto NEXT; OP(exit): { MVMint64 exit_code = GET_REG(cur_op, 0).i64; exit(exit_code); } OP(loadbytecode): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMString *filename = GET_REG(cur_op, 2).s; GET_REG(cur_op, 0).s = filename; cur_op += 4; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_load_bytecode(tc, filename); goto NEXT; } OP(getenvhash): GET_REG(cur_op, 0).o = MVM_proc_getenvhash(tc); cur_op += 2; goto NEXT; OP(shell): GET_REG(cur_op, 0).i64 = MVM_proc_shell(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o, GET_REG(cur_op, 12).o, GET_REG(cur_op, 14).i64); cur_op += 16; goto NEXT; OP(cwd): GET_REG(cur_op, 0).s = MVM_dir_cwd(tc); cur_op += 2; goto NEXT; OP(sha1): GET_REG(cur_op, 0).s = MVM_sha1(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(createsc): GET_REG(cur_op, 0).o = MVM_sc_create(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(scsetobj): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetobj"); MVM_sc_set_object(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 2).i64, obj); if (MVM_sc_get_stable_sc(tc, STABLE(obj)) == NULL) { /* Need to claim the SC also; typical case for new type objects. */ MVMSTable *st = STABLE(obj); MVM_sc_set_stable_sc(tc, st, (MVMSerializationContext *)sc); MVM_sc_push_stable(tc, (MVMSerializationContext *)sc, st); } cur_op += 6; goto NEXT; } OP(scsetcode): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMObject *code = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetcode"); MVM_sc_set_code(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 2).i64, code); MVM_sc_set_obj_sc(tc, code, (MVMSerializationContext *)sc); cur_op += 6; goto NEXT; } OP(scgetobj): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetobj"); GET_REG(cur_op, 0).o = MVM_sc_get_object(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; } OP(scgethandle): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgethandle"); GET_REG(cur_op, 0).s = MVM_sc_get_handle(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(scgetobjidx): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetobjidx"); GET_REG(cur_op, 0).i64 = MVM_sc_find_object_idx(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; } OP(scsetdesc): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMString *desc = GET_REG(cur_op, 2).s; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetdesc"); MVM_sc_set_description(tc, (MVMSerializationContext *)sc, desc); cur_op += 4; goto NEXT; } OP(scobjcount): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scobjcount"); GET_REG(cur_op, 0).i64 = MVM_sc_get_object_count(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(setobjsc): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to setobjsc"); MVM_sc_set_obj_sc(tc, obj, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(getobjsc): GET_REG(cur_op, 0).o = (MVMObject *)MVM_sc_get_obj_sc(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(serialize): { MVMObject *sc = GET_REG(cur_op, 2).o; MVMObject *obj = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to serialize"); GET_REG(cur_op, 0).s = MVM_serialization_serialize(tc, (MVMSerializationContext *)sc, obj); cur_op += 6; goto NEXT; } OP(deserialize): { MVMString *blob = GET_REG(cur_op, 0).s; MVMObject *sc = GET_REG(cur_op, 2).o; MVMObject *sh = GET_REG(cur_op, 4).o; MVMObject *cr = GET_REG(cur_op, 6).o; MVMObject *conf = GET_REG(cur_op, 8).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to deserialize"); MVM_serialization_deserialize(tc, (MVMSerializationContext *)sc, sh, cr, conf, blob); cur_op += 10; goto NEXT; } OP(wval): { MVMint16 dep = GET_I16(cur_op, 2); MVMint16 idx = GET_I16(cur_op, 4); GET_REG(cur_op, 0).o = MVM_sc_get_sc_object(tc, cu, dep, idx); cur_op += 6; goto NEXT; } OP(wval_wide): { MVMint16 dep = GET_I16(cur_op, 2); MVMint64 idx = MVM_BC_get_I64(cur_op, 4); GET_REG(cur_op, 0).o = MVM_sc_get_sc_object(tc, cu, dep, idx); cur_op += 12; goto NEXT; } OP(scwbdisable): GET_REG(cur_op, 0).i64 = ++tc->sc_wb_disable_depth; cur_op += 2; goto NEXT; OP(scwbenable): GET_REG(cur_op, 0).i64 = --tc->sc_wb_disable_depth; cur_op += 2; goto NEXT; OP(pushcompsc): { MVMObject * const sc = GET_REG(cur_op, 0).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Can only push an SCRef with pushcompsc"); if (MVM_is_null(tc, tc->compiling_scs)) { MVMROOT(tc, sc, { tc->compiling_scs = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); }); } MVM_repr_unshift_o(tc, tc->compiling_scs, sc); cur_op += 2; goto NEXT; } OP(popcompsc): { MVMObject * const scs = tc->compiling_scs; if (MVM_is_null(tc, scs) || MVM_repr_elems(tc, scs) == 0) MVM_exception_throw_adhoc(tc, "No current compiling SC"); GET_REG(cur_op, 0).o = MVM_repr_shift_o(tc, tc->compiling_scs); cur_op += 2; goto NEXT; } OP(scgetdesc): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetdesc"); GET_REG(cur_op, 0).s = MVM_sc_get_description(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(rethrow): { MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, GET_REG(cur_op, 0).o, NULL); goto NEXT; } OP(resume): /* Expect that resume will set the PC, so don't update cur_op * here. */ MVM_exception_resume(tc, GET_REG(cur_op, 0).o); goto NEXT; OP(settypehll): STABLE(GET_REG(cur_op, 0).o)->hll_owner = MVM_hll_get_config_for(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(settypehllrole): STABLE(GET_REG(cur_op, 0).o)->hll_role = GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(usecompileehllconfig): MVM_hll_enter_compilee_mode(tc); goto NEXT; OP(usecompilerhllconfig): MVM_hll_leave_compilee_mode(tc); goto NEXT; OP(encode): MVM_string_encode_to_buf(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, NULL); GET_REG(cur_op, 0).o = GET_REG(cur_op, 6).o; cur_op += 8; goto NEXT; OP(decode): GET_REG(cur_op, 0).s = MVM_string_decode_from_buf(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bindhllsym): { MVMObject *syms = tc->instance->hll_syms; MVMString *hll_name = GET_REG(cur_op, 0).s; MVMObject *hash; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll_name); if (MVM_is_null(tc, hash)) { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* must re-get syms and HLL name in case it moved */ syms = tc->instance->hll_syms; hll_name = GET_REG(cur_op, 0).s; MVM_repr_bind_key_o(tc, syms, hll_name, hash); } MVM_repr_bind_key_o(tc, hash, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); uv_mutex_unlock(&tc->instance->mutex_hll_syms); cur_op += 6; goto NEXT; } OP(hllize): { /* Increment PC before mapping, as it may invoke. */ MVMRegister *res_reg = &GET_REG(cur_op, 0); MVMObject *mapee = GET_REG(cur_op, 2).o; cur_op += 4; MVM_hll_map(tc, mapee, MVM_hll_current(tc), res_reg); goto NEXT; } OP(hllizefor): { /* Increment PC before mapping, as it may invoke. */ MVMRegister *res_reg = &GET_REG(cur_op, 0); MVMObject *mapee = GET_REG(cur_op, 2).o; MVMString *hll = GET_REG(cur_op, 4).s; cur_op += 6; MVM_hll_map(tc, mapee, MVM_hll_get_config_for(tc, hll), res_reg); goto NEXT; } OP(loadlib): { MVMString *name = GET_REG(cur_op, 0).s; MVMString *path = GET_REG(cur_op, 2).s; MVM_dll_load(tc, name, path); cur_op += 4; goto NEXT; } OP(freelib): { MVMString *name = GET_REG(cur_op, 0).s; MVM_dll_free(tc, name); cur_op += 2; goto NEXT; } OP(findsym): { MVMString *lib = GET_REG(cur_op, 2).s; MVMString *sym = GET_REG(cur_op, 4).s; MVMObject *obj = MVM_dll_find_symbol(tc, lib, sym); if (MVM_is_null(tc, obj)) MVM_exception_throw_adhoc(tc, "symbol not found in DLL"); GET_REG(cur_op, 0).o = obj; cur_op += 6; goto NEXT; } OP(dropsym): { MVM_dll_drop_symbol(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; } OP(loadext): { MVMString *lib = GET_REG(cur_op, 0).s; MVMString *ext = GET_REG(cur_op, 2).s; MVM_ext_load(tc, lib, ext); cur_op += 4; goto NEXT; } OP(settypecheckmode): { MVMSTable *st = STABLE(GET_REG(cur_op, 0).o); st->mode_flags = GET_REG(cur_op, 2).i64 | (st->mode_flags & (~MVM_TYPE_CHECK_CACHE_FLAG_MASK)); MVM_SC_WB_ST(tc, st); cur_op += 4; goto NEXT; } OP(setdispatcher): tc->cur_dispatcher = GET_REG(cur_op, 0).o; cur_op += 2; goto NEXT; OP(takedispatcher): GET_REG(cur_op, 0).o = tc->cur_dispatcher ? tc->cur_dispatcher : tc->instance->VMNull; tc->cur_dispatcher = NULL; cur_op += 2; goto NEXT; OP(captureexistsnamed): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = MVM_args_has_named(tc, cc->body.apc, GET_REG(cur_op, 4).s); } else { MVM_exception_throw_adhoc(tc, "captureexistsnamed needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(capturehasnameds): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { /* If positionals count doesn't match arg count, we must * have some named args. */ MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = cc->body.apc->arg_count != cc->body.apc->num_pos; } else { MVM_exception_throw_adhoc(tc, "capturehasnameds needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(backendconfig): GET_REG(cur_op, 0).o = MVM_backend_config(tc); cur_op += 2; goto NEXT; OP(getlexouter): { GET_REG(cur_op, 0).o = MVM_frame_find_lexical_by_name_outer(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; } OP(getlexrel): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMRegister *r; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexrel needs a context"); r = MVM_frame_find_lexical_by_name_rel(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); GET_REG(cur_op, 0).o = r ? r->o : NULL; cur_op += 6; goto NEXT; } OP(getlexreldyn): { MVMObject *ctx = GET_REG(cur_op, 2).o; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexreldyn needs a context"); GET_REG(cur_op, 0).o = MVM_frame_getdynlex(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); cur_op += 6; goto NEXT; } OP(getlexrelcaller): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMRegister *res; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexrelcaller needs a context"); res = MVM_frame_find_lexical_by_name_rel_caller(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); GET_REG(cur_op, 0).o = res ? res->o : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(getlexcaller): { MVMRegister *res = MVM_frame_find_lexical_by_name_rel_caller(tc, GET_REG(cur_op, 2).s, tc->cur_frame->caller); GET_REG(cur_op, 0).o = res ? res->o : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(bitand_s): GET_REG(cur_op, 0).s = MVM_string_bitand(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bitor_s): GET_REG(cur_op, 0).s = MVM_string_bitor(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bitxor_s): GET_REG(cur_op, 0).s = MVM_string_bitxor(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(isnanorinf): GET_REG(cur_op, 0).i64 = MVM_num_isnanorinf(tc, GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(inf): GET_REG(cur_op, 0).n64 = MVM_num_posinf(tc); cur_op += 2; goto NEXT; OP(neginf): GET_REG(cur_op, 0).n64 = MVM_num_neginf(tc); cur_op += 2; goto NEXT; OP(nan): GET_REG(cur_op, 0).n64 = MVM_num_nan(tc); cur_op += 2; goto NEXT; OP(getpid): GET_REG(cur_op, 0).i64 = MVM_proc_getpid(tc); cur_op += 2; goto NEXT; OP(spawn): GET_REG(cur_op, 0).i64 = MVM_proc_spawn(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o, GET_REG(cur_op, 12).o, GET_REG(cur_op, 14).i64); cur_op += 16; goto NEXT; OP(filereadable): GET_REG(cur_op, 0).i64 = MVM_file_isreadable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(filewritable): GET_REG(cur_op, 0).i64 = MVM_file_iswritable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(fileexecutable): GET_REG(cur_op, 0).i64 = MVM_file_isexecutable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(say_fhs): GET_REG(cur_op, 0).i64 = MVM_io_write_string(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, 1); cur_op += 6; goto NEXT; OP(capturenamedshash): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).o = MVM_args_slurpy_named(tc, cc->body.apc); } else { MVM_exception_throw_adhoc(tc, "capturehasnameds needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(read_fhb): MVM_io_read_bytes(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(write_fhb): MVM_io_write_bytes(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(newexception): GET_REG(cur_op, 0).o = (MVMObject *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); cur_op += 2; goto NEXT; OP(DEPRECATED_0): cur_op += 2; goto NEXT; OP(backtrace): GET_REG(cur_op, 0).o = MVM_exception_backtrace(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(symlink): MVM_file_symlink(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(link): MVM_file_link(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(gethostname): GET_REG(cur_op, 0).s = MVM_io_get_hostname(tc); cur_op += 2; goto NEXT; OP(exreturnafterunwind): { MVMObject *ex = GET_REG(cur_op, 0).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) ((MVMException *)ex)->body.return_after_unwind = 1; else MVM_exception_throw_adhoc(tc, "exreturnafterunwind needs a VMException"); cur_op += 2; goto NEXT; } OP(continuationclone): { MVMObject *cont = GET_REG(cur_op, 2).o; if (REPR(cont)->ID == MVM_REPR_ID_MVMContinuation) GET_REG(cur_op, 0).o = (MVMObject *)MVM_continuation_clone(tc, (MVMContinuation *)cont); else MVM_exception_throw_adhoc(tc, "continuationclone expects an MVMContinuation"); cur_op += 4; goto NEXT; } OP(continuationreset): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *tag = GET_REG(cur_op, 2).o; MVMObject *code = GET_REG(cur_op, 4).o; cur_op += 6; MVM_continuation_reset(tc, tag, code, res); goto NEXT; } OP(continuationcontrol): { MVMRegister *res = &GET_REG(cur_op, 0); MVMint64 protect = GET_REG(cur_op, 2).i64; MVMObject *tag = GET_REG(cur_op, 4).o; MVMObject *code = GET_REG(cur_op, 6).o; cur_op += 8; MVM_continuation_control(tc, protect, tag, code, res); goto NEXT; } OP(continuationinvoke): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *cont = GET_REG(cur_op, 2).o; MVMObject *code = GET_REG(cur_op, 4).o; cur_op += 6; if (REPR(cont)->ID == MVM_REPR_ID_MVMContinuation) MVM_continuation_invoke(tc, (MVMContinuation *)cont, code, res); else MVM_exception_throw_adhoc(tc, "continuationinvoke expects an MVMContinuation"); goto NEXT; } OP(randscale_n): GET_REG(cur_op, 0).n64 = MVM_proc_rand_n(tc) * GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(uniisblock): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_is_in_block(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(assertparamcheck): { MVMint64 ok = GET_REG(cur_op, 0).i64; cur_op += 2; if (!ok) MVM_args_bind_failed(tc); goto NEXT; } OP(paramnamesused): { MVMArgProcContext *ctx = &tc->cur_frame->params; if (ctx->callsite->num_pos != ctx->callsite->arg_count) MVM_args_assert_nameds_used(tc, ctx); goto NEXT; } OP(nativecallbuild): MVM_nativecall_build(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(nativecallinvoke): GET_REG(cur_op, 0).o = MVM_nativecall_invoke(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(nativecallrefresh): MVM_nativecall_refresh(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(threadrun): MVM_thread_run(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(threadid): GET_REG(cur_op, 0).i64 = MVM_thread_id(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(threadyield): MVM_thread_yield(tc); goto NEXT; OP(currentthread): GET_REG(cur_op, 0).o = MVM_thread_current(tc); cur_op += 2; goto NEXT; OP(lock): { MVMObject *lock = GET_REG(cur_op, 0).o; if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)lock); else MVM_exception_throw_adhoc(tc, "lock requires a concrete object with REPR ReentrantMutex"); cur_op += 2; goto NEXT; } OP(unlock): { MVMObject *lock = GET_REG(cur_op, 0).o; if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)lock); else MVM_exception_throw_adhoc(tc, "lock requires a concrete object with REPR ReentrantMutex"); cur_op += 2; goto NEXT; } OP(semacquire): { MVMObject *sem = GET_REG(cur_op, 0).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) MVM_semaphore_acquire(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semacquire requires a concrete object with REPR Semaphore"); cur_op += 2; goto NEXT; } OP(semtryacquire): { MVMObject *sem = GET_REG(cur_op, 2).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) GET_REG(cur_op, 0).i64 = MVM_semaphore_tryacquire(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semtryacquire requires a concrete object with REPR Semaphore"); cur_op += 4; goto NEXT; } OP(semrelease): { MVMObject *sem = GET_REG(cur_op, 0).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) MVM_semaphore_release(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semrelease requires a concrete object with REPR Semaphore"); cur_op += 2; goto NEXT; } OP(getlockcondvar): { MVMObject *lock = GET_REG(cur_op, 2).o; if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) GET_REG(cur_op, 0).o = MVM_conditionvariable_from_lock(tc, (MVMReentrantMutex *)lock, GET_REG(cur_op, 4).o); else MVM_exception_throw_adhoc(tc, "getlockcondvar requires a concrete object with REPR ReentrantMutex"); cur_op += 6; goto NEXT; } OP(condwait): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_wait(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condwait requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(condsignalone): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_signal_one(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condsignalone requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(condsignalall): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_signal_all(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condsignalall requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(queuepoll): { MVMObject *queue = GET_REG(cur_op, 2).o; if (REPR(queue)->ID == MVM_REPR_ID_ConcBlockingQueue && IS_CONCRETE(queue)) GET_REG(cur_op, 0).o = MVM_concblockingqueue_poll(tc, (MVMConcBlockingQueue *)queue); else MVM_exception_throw_adhoc(tc, "queuepoll requires a concrete object with REPR ConcBlockingQueue"); cur_op += 4; goto NEXT; } OP(setmultispec): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *ch = GET_REG(cur_op, 2).o; MVMString *valid_attr = GET_REG(cur_op, 4).s; MVMString *cache_attr = GET_REG(cur_op, 6).s; MVMSTable *st = STABLE(obj); MVMInvocationSpec *is = st->invocation_spec; if (!is) MVM_exception_throw_adhoc(tc, "Can only use setmultispec after setinvokespec"); MVM_ASSIGN_REF(tc, &(st->header), is->md_class_handle, ch); MVM_ASSIGN_REF(tc, &(st->header), is->md_valid_attr_name, valid_attr); MVM_ASSIGN_REF(tc, &(st->header), is->md_cache_attr_name, cache_attr); is->md_valid_hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, valid_attr); is->md_cache_hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, cache_attr); cur_op += 8; goto NEXT; } OP(ctxouterskipthunks): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxouter needs an MVMContext"); } frame = ((MVMContext *)this_ctx)->body.context->outer; while (frame && frame->static_info->body.is_thunk) frame = frame->caller; if (frame) { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, frame); GET_REG(cur_op, 0).o = ctx; } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 4; goto NEXT; } OP(ctxcallerskipthunks): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx = NULL; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxcaller needs an MVMContext"); } frame = ((MVMContext *)this_ctx)->body.context->caller; while (frame && frame->static_info->body.is_thunk) frame = frame->caller; if (frame) { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); ((MVMContext *)ctx)->body.context = MVM_frame_inc_ref(tc, frame); } GET_REG(cur_op, 0).o = ctx ? ctx : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(timer): GET_REG(cur_op, 0).o = MVM_io_timer_create(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(cancel): MVM_io_eventloop_cancel_work(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(signal): GET_REG(cur_op, 0).o = MVM_io_signal_handle(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(watchfile): GET_REG(cur_op, 0).o = MVM_io_file_watch(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(asyncconnect): GET_REG(cur_op, 0).o = MVM_io_socket_connect_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asynclisten): GET_REG(cur_op, 0).o = MVM_io_socket_listen_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asyncwritestr): GET_REG(cur_op, 0).o = MVM_io_write_string_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).s, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asyncwritebytes): GET_REG(cur_op, 0).o = MVM_io_write_bytes_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asyncreadchars): GET_REG(cur_op, 0).o = MVM_io_read_chars_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(asyncreadbytes): GET_REG(cur_op, 0).o = MVM_io_read_bytes_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(getlexstatic_o): OP(getlexperinvtype_o): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, GET_REG(cur_op, 2).s, MVM_reg_obj); GET_REG(cur_op, 0).o = found ? found->o : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(execname): GET_REG(cur_op, 0).s = MVM_executable_name(tc); cur_op += 2; goto NEXT; OP(const_i64_16): GET_REG(cur_op, 0).i64 = GET_I16(cur_op, 2); cur_op += 4; goto NEXT; OP(const_i64_32): GET_REG(cur_op, 0).i64 = GET_I32(cur_op, 2); cur_op += 6; goto NEXT; OP(isnonnull): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = !MVM_is_null(tc, obj); cur_op += 4; goto NEXT; } OP(param_rn2_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).i64 = param.arg.i64; else GET_REG(cur_op, 0).i64 = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_REQUIRED).arg.i64; cur_op += 10; goto NEXT; } OP(param_rn2_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).n64 = param.arg.n64; else GET_REG(cur_op, 0).n64 = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_REQUIRED).arg.n64; cur_op += 10; goto NEXT; } OP(param_rn2_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).s = param.arg.s; else GET_REG(cur_op, 0).s = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_REQUIRED).arg.s; cur_op += 10; goto NEXT; } OP(param_rn2_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).o = param.arg.o; else GET_REG(cur_op, 0).o = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_REQUIRED).arg.o; cur_op += 10; goto NEXT; } OP(param_on2_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_int(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_num(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_str(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 2)], MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, cu->body.strings[GET_UI32(cur_op, 6)], MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(osrpoint): if (++(tc->cur_frame->osr_counter) == MVM_OSR_THRESHOLD) MVM_spesh_osr(tc); goto NEXT; OP(nativecallcast): GET_REG(cur_op, 0).o = MVM_nativecall_cast(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(spawnprocasync): GET_REG(cur_op, 0).o = MVM_proc_spawn_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(killprocasync): MVM_proc_kill_async(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(startprofile): MVM_profile_start(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(endprofile): GET_REG(cur_op, 0).o = MVM_profile_end(tc); cur_op += 2; goto NEXT; OP(objectid): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_gc_object_id(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(settypefinalize): MVM_gc_finalize_set(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(force_gc): MVM_gc_enter_from_allocator(tc); goto NEXT; OP(nativecallglobal): GET_REG(cur_op, 0).o = MVM_nativecall_global(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(close_fhi): GET_REG(cur_op, 0).i64 = MVM_io_close(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(setparameterizer): MVM_6model_parametric_setup(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(parameterizetype): { MVMObject *type = GET_REG(cur_op, 2).o; MVMObject *params = GET_REG(cur_op, 4).o; MVMRegister *result = &(GET_REG(cur_op, 0)); cur_op += 6; MVM_6model_parametric_parameterize(tc, type, params, result); goto NEXT; } OP(typeparameterized): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameterized(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(typeparameters): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameters(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(typeparameterat): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameter_at(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(readlink): GET_REG(cur_op, 0).s = MVM_file_readlink(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(lstat): GET_REG(cur_op, 0).i64 = MVM_file_stat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 1); cur_op += 6; goto NEXT; OP(iscont_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_i(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(iscont_n): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_n(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(iscont_s): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_s(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(assign_i): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMint64 value = GET_REG(cur_op, 2).i64; cur_op += 4; MVM_6model_container_assign_i(tc, cont, value); goto NEXT; } OP(assign_n): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMnum64 value = GET_REG(cur_op, 2).n64; cur_op += 4; MVM_6model_container_assign_n(tc, cont, value); goto NEXT; } OP(assign_s): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMString *value = GET_REG(cur_op, 2).s; cur_op += 4; MVM_6model_container_assign_s(tc, cont, value); goto NEXT; } OP(decont_i): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_i(tc, obj, r); goto NEXT; } OP(decont_n): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_n(tc, obj, r); goto NEXT; } OP(decont_s): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_s(tc, obj, r); goto NEXT; } OP(getregref_i): GET_REG(cur_op, 0).o = MVM_nativeref_reg_i(tc, tc->cur_frame, &GET_REG(cur_op, 2)); cur_op += 4; goto NEXT; OP(getregref_n): GET_REG(cur_op, 0).o = MVM_nativeref_reg_n(tc, tc->cur_frame, &GET_REG(cur_op, 2)); cur_op += 4; goto NEXT; OP(getregref_s): GET_REG(cur_op, 0).o = MVM_nativeref_reg_s(tc, tc->cur_frame, &GET_REG(cur_op, 2)); cur_op += 4; goto NEXT; OP(getlexref_i): GET_REG(cur_op, 0).o = MVM_nativeref_lex_i(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_n): GET_REG(cur_op, 0).o = MVM_nativeref_lex_n(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_s): GET_REG(cur_op, 0).o = MVM_nativeref_lex_s(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_ni): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_i(tc, cu->body.strings[GET_UI32(cur_op, 2)]); cur_op += 6; goto NEXT; OP(getlexref_nn): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_n(tc, cu->body.strings[GET_UI32(cur_op, 2)]); cur_op += 6; goto NEXT; OP(getlexref_ns): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_s(tc, cu->body.strings[GET_UI32(cur_op, 2)]); cur_op += 6; goto NEXT; OP(atposref_i): GET_REG(cur_op, 0).o = MVM_nativeref_pos_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atposref_n): GET_REG(cur_op, 0).o = MVM_nativeref_pos_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atposref_s): GET_REG(cur_op, 0).o = MVM_nativeref_pos_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getattrref_i): GET_REG(cur_op, 0).o = MVM_nativeref_attr_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)]); cur_op += 12; goto NEXT; OP(getattrref_n): GET_REG(cur_op, 0).o = MVM_nativeref_attr_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)]); cur_op += 12; goto NEXT; OP(getattrref_s): GET_REG(cur_op, 0).o = MVM_nativeref_attr_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, cu->body.strings[GET_UI32(cur_op, 6)]); cur_op += 12; goto NEXT; OP(getattrsref_i): GET_REG(cur_op, 0).o = MVM_nativeref_attr_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(getattrsref_n): GET_REG(cur_op, 0).o = MVM_nativeref_attr_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(getattrsref_s): GET_REG(cur_op, 0).o = MVM_nativeref_attr_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(nativecallsizeof): GET_REG(cur_op, 0).i64 = MVM_nativecall_sizeof(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(encodenorm): MVM_exception_throw_adhoc(tc, "NYI"); OP(normalizecodes): MVM_unicode_normalize_codepoints(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 4).o, MVN_unicode_normalizer_form(tc, GET_REG(cur_op, 2).i64)); cur_op += 6; goto NEXT; OP(strfromcodes): GET_REG(cur_op, 0).s = MVM_unicode_codepoints_to_nfg_string(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(strtocodes): MVM_unicode_string_to_codepoints(tc, GET_REG(cur_op, 0).s, MVN_unicode_normalizer_form(tc, GET_REG(cur_op, 2).i64), GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(getcodelocation): GET_REG(cur_op, 0).o = MVM_code_location(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(eqatim_s): if (MVM_string_graphs(tc, GET_REG(cur_op, 2).s) <= GET_REG(cur_op, 6).i64) GET_REG(cur_op, 0).i64 = 0; else GET_REG(cur_op, 0).i64 = MVM_string_ord_basechar_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 6).i64) == MVM_string_ord_basechar_at(tc, GET_REG(cur_op, 4).s, 0) ? 1 : 0; cur_op += 8; goto NEXT; OP(ordbaseat): GET_REG(cur_op, 0).i64 = MVM_string_ord_basechar_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(neverrepossess): MVM_6model_never_repossess(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(scdisclaim): MVM_sc_disclaim(tc, (MVMSerializationContext *)GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(syncpipe): GET_REG(cur_op, 0).o = MVM_io_syncpipe(tc); cur_op += 2; goto NEXT; OP(atpos2d_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_2d_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_2d_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_2d_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_2d_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos3d_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_3d_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_3d_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_3d_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_3d_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atposnd_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_multidim_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_multidim_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_multidim_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_multidim_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(bindpos2d_i): MVM_repr_bind_pos_2d_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(bindpos2d_n): MVM_repr_bind_pos_2d_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).n64); cur_op += 8; goto NEXT; OP(bindpos2d_s): MVM_repr_bind_pos_2d_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(bindpos2d_o): MVM_repr_bind_pos_2d_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(bindpos3d_i): MVM_repr_bind_pos_3d_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(bindpos3d_n): MVM_repr_bind_pos_3d_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).n64); cur_op += 10; goto NEXT; OP(bindpos3d_s): MVM_repr_bind_pos_3d_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s); cur_op += 10; goto NEXT; OP(bindpos3d_o): MVM_repr_bind_pos_3d_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(bindposnd_i): MVM_repr_bind_pos_multidim_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(bindposnd_n): MVM_repr_bind_pos_multidim_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(bindposnd_s): MVM_repr_bind_pos_multidim_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bindposnd_o): MVM_repr_bind_pos_multidim_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(dimensions): GET_REG(cur_op, 0).o = MVM_repr_dimensions(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(setdimensions): MVM_repr_set_dimensions(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(numdimensions): GET_REG(cur_op, 0).i64 = MVM_repr_num_dimensions(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(ctxcode): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) MVM_exception_throw_adhoc(tc, "ctxcode needs an MVMContext"); GET_REG(cur_op, 0).o = ((MVMContext *)this_ctx)->body.context->code_ref; cur_op += 4; goto NEXT; } OP(isrwcont): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMint64 is_rw = 0; if (!MVM_is_null(tc, obj)) { const MVMContainerSpec *cs = STABLE(obj)->container_spec; is_rw = cs && cs->can_store(tc, obj); } GET_REG(cur_op, 0).i64 = is_rw; cur_op += 4; goto NEXT; } OP(fc): GET_REG(cur_op, 0).s = MVM_string_fc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(setinputlineseps_fh): MVM_io_set_separators(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(readlinechomp_fh): GET_REG(cur_op, 0).s = MVM_io_readline(tc, GET_REG(cur_op, 2).o, 1); cur_op += 4; goto NEXT; OP(encoderep): MVM_string_encode_to_buf(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 6).s); GET_REG(cur_op, 0).o = GET_REG(cur_op, 8).o; cur_op += 10; goto NEXT; OP(istty_fh): GET_REG(cur_op, 0).i64 = MVM_io_is_tty(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(sp_log): if (tc->cur_frame->spesh_log_idx >= 0) { MVM_ASSIGN_REF(tc, &(tc->cur_frame->static_info->common.header), tc->cur_frame->spesh_log_slots[ GET_UI16(cur_op, 2) * MVM_SPESH_LOG_RUNS + tc->cur_frame->spesh_log_idx ], GET_REG(cur_op, 0).o); } cur_op += 4; goto NEXT; OP(sp_osrfinalize): { MVMSpeshCandidate *cand = tc->cur_frame->spesh_cand; if (cand) { tc->cur_frame->spesh_log_idx = cand->log_enter_idx; cand->log_enter_idx++; if (cand->log_enter_idx >= MVM_SPESH_LOG_RUNS) MVM_spesh_osr_finalize(tc); } goto NEXT; } OP(sp_guardconc): { MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 4; if (!check || !IS_CONCRETE(check) || STABLE(check) != want) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_guardtype): { MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 4; if (!check || IS_CONCRETE(check) || STABLE(check) != want) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_guardcontconc): { MVMint32 ok = 0; MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want_c = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; MVMSTable *want_v = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 4)]; cur_op += 6; if (check && IS_CONCRETE(check) && STABLE(check) == want_c) { MVMContainerSpec const *contspec = STABLE(check)->container_spec; MVMRegister r; contspec->fetch(tc, check, &r); if (r.o && IS_CONCRETE(r.o) && STABLE(r.o) == want_v) ok = 1; } if (!ok) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_guardconttype): { MVMint32 ok = 0; MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want_c = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; MVMSTable *want_v = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 4)]; cur_op += 6; if (check && IS_CONCRETE(check) && STABLE(check) == want_c) { MVMContainerSpec const *contspec = STABLE(check)->container_spec; MVMRegister r; contspec->fetch(tc, check, &r); if (r.o && !IS_CONCRETE(r.o) && STABLE(r.o) == want_v) ok = 1; } if (!ok) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_guardrwconc): { MVMint32 ok = 0; MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want_c = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; MVMSTable *want_v = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 4)]; cur_op += 6; if (check && IS_CONCRETE(check) && STABLE(check) == want_c) { MVMContainerSpec const *contspec = STABLE(check)->container_spec; if (contspec->can_store(tc, check)) { MVMRegister r; contspec->fetch(tc, check, &r); if (r.o && IS_CONCRETE(r.o) && STABLE(r.o) == want_v) ok = 1; } } if (!ok) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_guardrwtype): { MVMint32 ok = 0; MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want_c = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; MVMSTable *want_v = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 4)]; cur_op += 6; if (check && IS_CONCRETE(check) && STABLE(check) == want_c) { MVMContainerSpec const *contspec = STABLE(check)->container_spec; if (contspec->can_store(tc, check)) { MVMRegister r; contspec->fetch(tc, check, &r); if (r.o && !IS_CONCRETE(r.o) && STABLE(r.o) == want_v) ok = 1; } } if (!ok) MVM_spesh_deopt_one(tc); goto NEXT; } OP(sp_getarg_o): GET_REG(cur_op, 0).o = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].o; cur_op += 4; goto NEXT; OP(sp_getarg_i): GET_REG(cur_op, 0).i64 = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].i64; cur_op += 4; goto NEXT; OP(sp_getarg_n): GET_REG(cur_op, 0).n64 = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].n64; cur_op += 4; goto NEXT; OP(sp_getarg_s): GET_REG(cur_op, 0).s = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].s; cur_op += 4; goto NEXT; OP(sp_fastinvoke_v): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 0).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 2); tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; cur_op += 4; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_i): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_INT; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_n): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_NUM; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_s): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_STR; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_o): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, MVM_frame_acquire_ref(tc, &(code->body.outer)), (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_namedarg_used): tc->cur_frame->params.named_used[GET_UI16(cur_op, 0)] = 1; cur_op += 2; goto NEXT; OP(sp_getspeshslot): GET_REG(cur_op, 0).o = (MVMObject *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 4; goto NEXT; OP(sp_findmeth): { /* Obtain object and cache index; see if we get a match. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMuint16 idx = GET_UI16(cur_op, 8); if ((MVMSTable *)tc->cur_frame->effective_spesh_slots[idx] == STABLE(obj)) { GET_REG(cur_op, 0).o = (MVMObject *)tc->cur_frame->effective_spesh_slots[idx + 1]; cur_op += 10; } else { /* May invoke, so pre-increment op counter */ MVMString *name = cu->body.strings[GET_UI32(cur_op, 4)]; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 10; MVM_6model_find_method_spesh(tc, obj, name, idx, res); } goto NEXT; } OP(sp_fastcreate): { /* Assume we're in normal code, so doing a nursery allocation. * Also, that there is no initialize. */ MVMuint16 size = GET_UI16(cur_op, 2); MVMObject *obj = MVM_gc_allocate_zeroed(tc, size); obj->st = (MVMSTable *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 4)]; obj->header.size = size; obj->header.owner = tc->thread_id; GET_REG(cur_op, 0).o = obj; cur_op += 6; goto NEXT; } OP(sp_get_i64): GET_REG(cur_op, 0).i64 = *((MVMint64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i32): GET_REG(cur_op, 0).i64 = *((MVMint32 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i16): GET_REG(cur_op, 0).i64 = *((MVMint16 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i8): GET_REG(cur_op, 0).i64 = *((MVMint8 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_n): GET_REG(cur_op, 0).n64 = *((MVMnum64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_s): GET_REG(cur_op, 0).s = ((MVMString *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_o): { MVMObject *val = ((MVMObject *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); GET_REG(cur_op, 0).o = val ? val : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(sp_bind_o): { MVMObject *o = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 4).o; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)((char *)o + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_bind_s): { MVMObject *o = GET_REG(cur_op, 0).o; MVMString *value = GET_REG(cur_op, 4).s; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)((char *)o + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_bind_i64): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i32): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint32 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i16): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint16 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i8): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint8 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_n): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMnum64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; } OP(sp_p6oget_o): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVMObject *val = *((MVMObject **)(data + GET_UI16(cur_op, 4))); GET_REG(cur_op, 0).o = val ? val : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(sp_p6ogetvt_o): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVMObject *val = *((MVMObject **)(data + GET_UI16(cur_op, 4))); if (!val) { val = (MVMObject *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 6)]; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 4))), val); } GET_REG(cur_op, 0).o = val; cur_op += 8; goto NEXT; } OP(sp_p6ogetvc_o): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVMObject *val = *((MVMObject **)(data + GET_UI16(cur_op, 4))); if (!val) { /* Clone might allocate, so re-fetch things after it. */ val = MVM_repr_clone(tc, (MVMObject *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 6)]); o = GET_REG(cur_op, 2).o; data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 4))), val); } GET_REG(cur_op, 0).o = val; cur_op += 8; goto NEXT; } OP(sp_p6oget_i): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).i64 = *((MVMint64 *)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6oget_n): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).n64 = *((MVMnum64 *)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6oget_s): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).s = *((MVMString **)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6obind_o): { MVMObject *o = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 4).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_p6obind_i): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); *((MVMint64 *)(data + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_p6obind_n): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); *((MVMnum64 *)(data + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; } OP(sp_p6obind_s): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMString **)(data + GET_UI16(cur_op, 2))), GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(sp_jit_enter): { if (tc->cur_frame->spesh_cand->jitcode == NULL) { MVM_exception_throw_adhoc(tc, "Try to enter NULL jitcode"); } // trampoline back to this opcode cur_op -= 2; if (MVM_jit_enter_code(tc, cu, tc->cur_frame->spesh_cand->jitcode)) { if (MVM_frame_try_return(tc) == 0) goto return_label; } goto NEXT; } OP(sp_boolify_iter): { GET_REG(cur_op, 0).i64 = MVM_iter_istrue(tc, (MVMIter*)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(sp_boolify_iter_arr): { MVMIter *iter = (MVMIter *)GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = iter->body.array_state.index + 1 < iter->body.array_state.limit ? 1 : 0; cur_op += 4; goto NEXT; } OP(sp_boolify_iter_hash): { MVMIter *iter = (MVMIter *)GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = iter->body.hash_state.next != NULL ? 1 : 0; cur_op += 4; goto NEXT; } OP(prof_enter): MVM_profile_log_enter(tc, tc->cur_frame->static_info, MVM_PROFILE_ENTER_NORMAL); goto NEXT; OP(prof_enterspesh): MVM_profile_log_enter(tc, tc->cur_frame->static_info, MVM_PROFILE_ENTER_SPESH); goto NEXT; OP(prof_enterinline): MVM_profile_log_enter(tc, (MVMStaticFrame *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 0)], MVM_PROFILE_ENTER_SPESH_INLINE); cur_op += 2; goto NEXT; OP(prof_enternative): MVM_profile_log_enter_native(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(prof_exit): MVM_profile_log_exit(tc); goto NEXT; OP(prof_allocated): MVM_profile_log_allocated(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(ctw_check): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMint16 blame = GET_I16(cur_op, 2); cur_op += 4; MVM_cross_thread_write_check(tc, obj, blame); goto NEXT; } #if MVM_CGOTO OP_CALL_EXTOP: { /* Bounds checking? Never heard of that. */ MVMuint8 *op_before = cur_op; MVMExtOpRecord *record = &cu->body.extops[op - MVM_OP_EXT_BASE]; record->func(tc, cur_op); if (op_before == cur_op) cur_op += record->operand_bytes; goto NEXT; } #else default: { if (op >= MVM_OP_EXT_BASE && (op - MVM_OP_EXT_BASE) < cu->body.num_extops) { MVMuint8 *op_before = cur_op; MVMExtOpRecord *record = &cu->body.extops[op - MVM_OP_EXT_BASE]; record->func(tc, cur_op); if (op_before == cur_op) cur_op += record->operand_bytes; goto NEXT; } MVM_panic(MVM_exitcode_invalidopcode, "Invalid opcode executed (corrupt bytecode stream?) opcode %u", op); } #endif } } return_label: /* Need to clear these pointer pointers since they may be rooted * by some GC procedure. */ tc->interp_cur_op = NULL; tc->interp_bytecode_start = NULL; tc->interp_reg_base = NULL; tc->interp_cu = NULL; MVM_barrier(); } void MVM_interp_enable_tracing() { tracing_enabled = 1; } MoarVM-2015.11/src/core/interp.h0000644000175000017500000000664612520766031015257 0ustar jnthnjnthn/* A GC sync point is a point where we can check if we're being signalled * to stop to do a GC run. This is placed at points where it is safe to * do such a thing, and hopefully so that it happens often enough; note * that every call down to the allocator is also a sync point, so this * really only means we need to do this enough to make sure tight native * loops trigger it. */ /* Don't use a MVM_load(&tc->gc_status) here for performance, it's okay * if the interrupt is delayed a bit. */ #define GC_SYNC_POINT(tc) \ if (tc->gc_status) { \ MVM_gc_enter_from_interrupt(tc); \ } /* Different views of a register. */ union MVMRegister { MVMObject *o; MVMString *s; MVMint8 i8; MVMuint8 ui8; MVMint16 i16; MVMuint16 ui16; MVMint32 i32; MVMuint32 ui32; MVMint64 i64; MVMuint64 ui64; MVMnum32 n32; MVMnum64 n64; }; /* Most operands an operation will have. */ #define MVM_MAX_OPERANDS 8 /* Kind of de-opt mark. */ #define MVM_DEOPT_MARK_ONE 1 #define MVM_DEOPT_MARK_ALL 2 #define MVM_DEOPT_MARK_OSR 4 /* Information about an opcode. */ struct MVMOpInfo { MVMuint16 opcode; const char *name; char mark[2]; MVMuint16 num_operands; MVMuint8 pure; MVMuint8 deopt_point; MVMuint8 no_inline; MVMuint8 jittivity; MVMuint8 operands[MVM_MAX_OPERANDS]; }; /* Operand read/write/literal flags. */ #define MVM_operand_literal 0 #define MVM_operand_read_reg 1 #define MVM_operand_write_reg 2 #define MVM_operand_read_lex 3 #define MVM_operand_write_lex 4 #define MVM_operand_rw_mask 7 /* Register data types. */ #define MVM_reg_int8 1 #define MVM_reg_int16 2 #define MVM_reg_int32 3 #define MVM_reg_int64 4 #define MVM_reg_num32 5 #define MVM_reg_num64 6 #define MVM_reg_str 7 #define MVM_reg_obj 8 /* Operand data types. */ #define MVM_operand_int8 (MVM_reg_int8 << 3) #define MVM_operand_int16 (MVM_reg_int16 << 3) #define MVM_operand_int32 (MVM_reg_int32 << 3) #define MVM_operand_int64 (MVM_reg_int64 << 3) #define MVM_operand_num32 (MVM_reg_num32 << 3) #define MVM_operand_num64 (MVM_reg_num64 << 3) #define MVM_operand_str (MVM_reg_str << 3) #define MVM_operand_obj (MVM_reg_obj << 3) #define MVM_operand_ins (9 << 3) #define MVM_operand_type_var (10 << 3) #define MVM_operand_coderef (12 << 3) #define MVM_operand_callsite (13 << 3) #define MVM_operand_spesh_slot (16 << 3) #define MVM_operand_type_mask (31 << 3) /* Functions. */ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data); MVM_PUBLIC void MVM_interp_enable_tracing(); MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { const MVMuint8 *const where = cur_op + offset; #ifdef MVM_CAN_UNALIGNED_INT64 return *(MVMint64 *)where; #else MVMint64 temp; memmove(&temp, where, sizeof(MVMint64)); return temp; #endif } MVM_STATIC_INLINE MVMnum64 MVM_BC_get_N64(const MVMuint8 *cur_op, int offset) { const MVMuint8 *const where = cur_op + offset; #ifdef MVM_CAN_UNALIGNED_NUM64 return *(MVMnum64 *)where; #else MVMnum64 temp; memmove(&temp, cur_op + offset, sizeof(MVMnum64)); return temp; #endif } MoarVM-2015.11/src/core/loadbytecode.c0000644000175000017500000000657712623370227016414 0ustar jnthnjnthn#include "moar.h" /* Handles loading of bytecode, including triggering the deserialize and load * special frames. Takes place in two steps, with a callback between them which * is triggered by the special_return mechanism. */ static void run_load(MVMThreadContext *tc, void *sr_data); static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { MVM_gc_worklist_add(tc, worklist, &frame->special_return_data); } void MVM_load_bytecode(MVMThreadContext *tc, MVMString *filename) { MVMCompUnit *cu; MVMLoadedCompUnitName *loaded_name; /* Work out actual filename to use, taking --libpath into account. */ filename = MVM_file_in_libpath(tc, filename); /* See if we already loaded this. */ uv_mutex_lock(&tc->instance->mutex_loaded_compunits); MVM_tc_set_ex_release_mutex(tc, &tc->instance->mutex_loaded_compunits); MVM_string_flatten(tc, filename); MVM_HASH_GET(tc, tc->instance->loaded_compunits, filename, loaded_name); if (loaded_name) { /* already loaded */ goto LEAVE; } /* Otherwise, load from disk. */ MVMROOT(tc, filename, { char *c_filename = MVM_string_utf8_c8_encode_C_string(tc, filename); /* XXX any exception from MVM_cu_map_from_file needs to be handled * and c_filename needs to be freed */ cu = MVM_cu_map_from_file(tc, c_filename); MVM_free(c_filename); cu->body.filename = filename; /* If there's a deserialization frame, need to run that. */ if (cu->body.deserialize_frame) { /* Set up special return to delegate to running the load frame, * if any. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; tc->cur_frame->special_return = run_load; tc->cur_frame->special_return_data = cu; tc->cur_frame->mark_special_return_data = mark_sr_data; /* Invoke the deserialization frame and return to the runloop. */ MVM_frame_invoke(tc, cu->body.deserialize_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } else { /* No deserialize frame, so do load frame instead. */ run_load(tc, cu); } loaded_name = MVM_calloc(1, sizeof(MVMLoadedCompUnitName)); loaded_name->filename = filename; MVM_HASH_BIND(tc, tc->instance->loaded_compunits, filename, loaded_name); }); LEAVE: MVM_tc_clear_ex_release_mutex(tc); uv_mutex_unlock(&tc->instance->mutex_loaded_compunits); } /* Callback after running deserialize code to run the load code. */ static void run_load(MVMThreadContext *tc, void *sr_data) { MVMCompUnit *cu = (MVMCompUnit *)sr_data; /* If there's a load frame, need to run that. If not, we're done. */ if (cu->body.load_frame) { /* Make sure the call happens in void context. No special return * handler here; we want to go back to the place that used the * loadbytecode op in the first place. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; /* Invoke the load frame and return to the runloop. */ MVM_frame_invoke(tc, cu->body.load_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } } MoarVM-2015.11/src/core/loadbytecode.h0000644000175000017500000000010312456307241016374 0ustar jnthnjnthnvoid MVM_load_bytecode(MVMThreadContext *tc, MVMString *filename); MoarVM-2015.11/src/core/nativecall.c0000644000175000017500000010451312623370227016065 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include #endif /* Grabs a NativeCall body. */ MVMNativeCallBody * MVM_nativecall_get_nc_body(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->ID == MVM_REPR_ID_MVMNativeCall) return (MVMNativeCallBody *)OBJECT_BODY(obj); else return (MVMNativeCallBody *)REPR(obj)->box_funcs.get_boxed_ref(tc, STABLE(obj), obj, OBJECT_BODY(obj), MVM_REPR_ID_MVMNativeCall); } /* Gets the flag for whether to free a string after a call or not. */ static MVMint16 get_str_free_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.free_str; if (MVM_repr_exists_key(tc, info, flag)) if (!MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_NO_FREE_STR; return MVM_NATIVECALL_ARG_FREE_STR; } /* Gets the flag for whether to free a string after a call or not. */ static MVMint16 get_rw_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.rw; if (MVM_repr_exists_key(tc, info, flag)) { if (MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_RW; } return MVM_NATIVECALL_ARG_NO_RW; } /* Takes a hash describing a type hands back an argument type code. */ MVMint16 MVM_nativecall_get_arg_type(MVMThreadContext *tc, MVMObject *info, MVMint16 is_return) { MVMString *typename = MVM_repr_get_str(tc, MVM_repr_at_key_o(tc, info, tc->instance->str_consts.type)); char *ctypename = MVM_string_utf8_encode_C_string(tc, typename); MVMint16 result; if (strcmp(ctypename, "void") == 0) { if (!is_return) { MVM_free(ctypename); MVM_exception_throw_adhoc(tc, "Cannot use 'void' type except for on native call return values"); } result = MVM_NATIVECALL_ARG_VOID; } else if (strcmp(ctypename, "char") == 0) result = MVM_NATIVECALL_ARG_CHAR | get_rw_flag(tc, info); else if (strcmp(ctypename, "short") == 0) result = MVM_NATIVECALL_ARG_SHORT | get_rw_flag(tc, info); else if (strcmp(ctypename, "int") == 0) result = MVM_NATIVECALL_ARG_INT | get_rw_flag(tc, info); else if (strcmp(ctypename, "long") == 0) result = MVM_NATIVECALL_ARG_LONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "longlong") == 0) result = MVM_NATIVECALL_ARG_LONGLONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "uchar") == 0) result = MVM_NATIVECALL_ARG_UCHAR | get_rw_flag(tc, info); else if (strcmp(ctypename, "ushort") == 0) result = MVM_NATIVECALL_ARG_USHORT | get_rw_flag(tc, info); else if (strcmp(ctypename, "uint") == 0) result = MVM_NATIVECALL_ARG_UINT | get_rw_flag(tc, info); else if (strcmp(ctypename, "ulong") == 0) result = MVM_NATIVECALL_ARG_ULONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "ulonglong") == 0) result = MVM_NATIVECALL_ARG_ULONGLONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "float") == 0) result = MVM_NATIVECALL_ARG_FLOAT | get_rw_flag(tc, info); else if (strcmp(ctypename, "double") == 0) result = MVM_NATIVECALL_ARG_DOUBLE | get_rw_flag(tc, info); else if (strcmp(ctypename, "asciistr") == 0) result = MVM_NATIVECALL_ARG_ASCIISTR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "utf8str") == 0) result = MVM_NATIVECALL_ARG_UTF8STR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "utf16str") == 0) result = MVM_NATIVECALL_ARG_UTF16STR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "cstruct") == 0) result = MVM_NATIVECALL_ARG_CSTRUCT; else if (strcmp(ctypename, "cppstruct") == 0) result = MVM_NATIVECALL_ARG_CPPSTRUCT; else if (strcmp(ctypename, "cpointer") == 0) result = MVM_NATIVECALL_ARG_CPOINTER; else if (strcmp(ctypename, "carray") == 0) result = MVM_NATIVECALL_ARG_CARRAY; else if (strcmp(ctypename, "cunion") == 0) result = MVM_NATIVECALL_ARG_CUNION; else if (strcmp(ctypename, "vmarray") == 0) result = MVM_NATIVECALL_ARG_VMARRAY; else if (strcmp(ctypename, "callback") == 0) result = MVM_NATIVECALL_ARG_CALLBACK; else { char *waste[] = { ctypename, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown type '%s' used for native call", ctypename); } MVM_free(ctypename); return result; } MVMObject * MVM_nativecall_make_int(MVMThreadContext *tc, MVMObject *type, MVMint64 value) { return type ? MVM_repr_box_int(tc, type, value) : NULL; } MVMObject * MVM_nativecall_make_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 value) { return type ? MVM_repr_box_int(tc, type, (MVMint64)value) : NULL; } MVMObject * MVM_nativecall_make_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 value) { return type ? MVM_repr_box_num(tc, type, value) : NULL; } MVMObject * MVM_nativecall_make_str(MVMThreadContext *tc, MVMObject *type, MVMint16 ret_type, char *cstring) { MVMObject *result = type; if (cstring && type) { MVMString *value; MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_ASCIISTR: value = MVM_string_ascii_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; case MVM_NATIVECALL_ARG_UTF8STR: value = MVM_string_utf8_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; case MVM_NATIVECALL_ARG_UTF16STR: value = MVM_string_utf16_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled encoding"); } MVM_gc_root_temp_pop(tc); result = MVM_repr_box_str(tc, type, value); if (ret_type & MVM_NATIVECALL_ARG_FREE_STR) MVM_free(cstring); } return result; } /* Constructs a boxed result using a CStruct REPR type. */ MVMObject * MVM_nativecall_make_cstruct(MVMThreadContext *tc, MVMObject *type, void *cstruct) { MVMObject *result = type; if (cstruct && type) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Native call expected return type with CStruct representation, but got a %s", REPR(type)->name); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCStruct *)result)->body.cstruct = cstruct; if (repr_data->num_child_objs) ((MVMCStruct *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } /* Constructs a boxed result using a CUnion REPR type. */ MVMObject * MVM_nativecall_make_cunion(MVMThreadContext *tc, MVMObject *type, void *cunion) { MVMObject *result = type; if (cunion && type) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Native call expected return type with CUnion representation, but got a %s", REPR(type)->name); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCUnion *)result)->body.cunion = cunion; if (repr_data->num_child_objs) ((MVMCUnion *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } MVMObject * MVM_nativecall_make_cppstruct(MVMThreadContext *tc, MVMObject *type, void *cppstruct) { MVMObject *result = type; if (cppstruct && type) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Native call expected return type with CPPStruct representation, but got a %s", REPR(type)->name); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCPPStruct *)result)->body.cppstruct = cppstruct; if (repr_data->num_child_objs) ((MVMCPPStruct *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } /* Constructs a boxed result using a CPointer REPR type. */ MVMObject * MVM_nativecall_make_cpointer(MVMThreadContext *tc, MVMObject *type, void *ptr) { MVMObject *result = type; if (ptr && type) { if (REPR(type)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer representation, but got a %s", REPR(type)->name); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCPointer *)result)->body.ptr = ptr; } return result; } /* Constructs a boxed result using a CArray REPR type. */ MVMObject * MVM_nativecall_make_carray(MVMThreadContext *tc, MVMObject *type, void *carray) { MVMObject *result = type; if (carray && type) { if (REPR(type)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Native call expected return type with CArray representation, but got a %s", REPR(type)->name); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCArray *)result)->body.storage = carray; } return result; } signed char MVM_nativecall_unmarshal_char(MVMThreadContext *tc, MVMObject *value) { return (signed char)MVM_repr_get_int(tc, value); } signed short MVM_nativecall_unmarshal_short(MVMThreadContext *tc, MVMObject *value) { return (signed short)MVM_repr_get_int(tc, value); } signed int MVM_nativecall_unmarshal_int(MVMThreadContext *tc, MVMObject *value) { return (signed int)MVM_repr_get_int(tc, value); } signed long MVM_nativecall_unmarshal_long(MVMThreadContext *tc, MVMObject *value) { return (signed long)MVM_repr_get_int(tc, value); } signed long long MVM_nativecall_unmarshal_longlong(MVMThreadContext *tc, MVMObject *value) { return (signed long long)MVM_repr_get_int(tc, value); } unsigned char MVM_nativecall_unmarshal_uchar(MVMThreadContext *tc, MVMObject *value) { return (unsigned char)MVM_repr_get_int(tc, value); } unsigned short MVM_nativecall_unmarshal_ushort(MVMThreadContext *tc, MVMObject *value) { return (unsigned short)MVM_repr_get_int(tc, value); } unsigned int MVM_nativecall_unmarshal_uint(MVMThreadContext *tc, MVMObject *value) { return (unsigned int)MVM_repr_get_int(tc, value); } unsigned long MVM_nativecall_unmarshal_ulong(MVMThreadContext *tc, MVMObject *value) { return (unsigned long)MVM_repr_get_int(tc, value); } unsigned long long MVM_nativecall_unmarshal_ulonglong(MVMThreadContext *tc, MVMObject *value) { return (unsigned long long)MVM_repr_get_int(tc, value); } float MVM_nativecall_unmarshal_float(MVMThreadContext *tc, MVMObject *value) { return (float)MVM_repr_get_num(tc, value); } double MVM_nativecall_unmarshal_double(MVMThreadContext *tc, MVMObject *value) { return (double)MVM_repr_get_num(tc, value); } char * MVM_nativecall_unmarshal_string(MVMThreadContext *tc, MVMObject *value, MVMint16 type, MVMint16 *free) { if (IS_CONCRETE(value)) { MVMString *value_str = MVM_repr_get_str(tc, value); /* Encode string. */ char *str; switch (type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_ASCIISTR: str = MVM_string_ascii_encode_any(tc, value_str); break; case MVM_NATIVECALL_ARG_UTF16STR: str = MVM_string_utf16_encode(tc, value_str); break; default: str = MVM_string_utf8_encode_C_string(tc, value_str); } /* Set whether to free it or not. */ if (free) { if (REPR(value)->ID == MVM_REPR_ID_MVMCStr) *free = 0; /* Manually managed. */ else if (free && type & MVM_NATIVECALL_ARG_FREE_STR_MASK) *free = 1; else *free = 0; } return str; } else { return NULL; } } void * MVM_nativecall_unmarshal_cstruct(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCStruct) return ((MVMCStruct *)value)->body.cstruct; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CStruct representation, but got a %s", REPR(value)->name); } void * MVM_nativecall_unmarshal_cppstruct(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCPPStruct) return ((MVMCPPStruct *)value)->body.cppstruct; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPPStruct representation, but got a %s", REPR(value)->name); } void * MVM_nativecall_unmarshal_cpointer(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCPointer) return ((MVMCPointer *)value)->body.ptr; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer representation, but got a %s", REPR(value)->name); } void * MVM_nativecall_unmarshal_carray(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCArray) return ((MVMCArray *)value)->body.storage; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CArray representation, but got a %s", REPR(value)->name); } void * MVM_nativecall_unmarshal_vmarray(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMArray) { MVMArrayBody *body = &((MVMArray *)value)->body; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)STABLE(value)->REPR_data; size_t start_pos = body->start * repr_data->elem_size; return ((char *)body->slots.any) + start_pos; } else MVM_exception_throw_adhoc(tc, "Native call expected object with Array representation, but got a %s", REPR(value)->name); } void * MVM_nativecall_unmarshal_cunion(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCUnion) return ((MVMCUnion *)value)->body.cunion; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CUnion representation, but got a %s", REPR(value)->name); } #ifdef _WIN32 static const char *dlerror(void) { static char buf[32]; DWORD dw = GetLastError(); if (dw == 0) return NULL; sprintf(buf, "error 0x%x", (unsigned int)dw); return buf; } #endif /* Builds up a native call site out of the supplied arguments. */ void MVM_nativecall_build(MVMThreadContext *tc, MVMObject *site, MVMString *lib, MVMString *sym, MVMString *conv, MVMObject *arg_info, MVMObject *ret_info) { char *lib_name = MVM_string_utf8_c8_encode_C_string(tc, lib); char *sym_name = MVM_string_utf8_c8_encode_C_string(tc, sym); MVMint16 i; /* Initialize the object; grab native call part of its body. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); /* Try to load the library. */ body->lib_name = lib_name; body->lib_handle = MVM_nativecall_load_lib(strlen(lib_name) ? lib_name : NULL); if (!body->lib_handle) { char *waste[] = { lib_name, NULL }; MVM_free(sym_name); MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate native library '%s': %s", lib_name, dlerror()); } /* Try to locate the symbol. */ body->entry_point = MVM_nativecall_find_sym(body->lib_handle, sym_name); if (!body->entry_point) { char *waste[] = { sym_name, lib_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate symbol '%s' in native library '%s'", sym_name, lib_name); } body->sym_name = sym_name; /* Set calling convention, if any. */ body->convention = MVM_nativecall_get_calling_convention(tc, conv); /* Transform each of the args info structures into a flag. */ body->num_args = MVM_repr_elems(tc, arg_info); body->arg_types = MVM_malloc(sizeof(MVMint16) * (body->num_args ? body->num_args : 1)); body->arg_info = MVM_malloc(sizeof(MVMObject *) * (body->num_args ? body->num_args : 1)); #ifdef HAVE_LIBFFI body->ffi_arg_types = MVM_malloc(sizeof(ffi_type *) * (body->num_args ? body->num_args : 1)); #endif for (i = 0; i < body->num_args; i++) { MVMObject *info = MVM_repr_at_pos_o(tc, arg_info, i); body->arg_types[i] = MVM_nativecall_get_arg_type(tc, info, 0); #ifdef HAVE_LIBFFI body->ffi_arg_types[i] = MVM_nativecall_get_ffi_type(tc, body->arg_types[i]); #endif if(body->arg_types[i] == MVM_NATIVECALL_ARG_CALLBACK) { MVM_ASSIGN_REF(tc, &(site->header), body->arg_info[i], MVM_repr_at_key_o(tc, info, tc->instance->str_consts.callback_args)); } else { body->arg_info[i] = NULL; } } /* Transform return argument type info a flag. */ body->ret_type = MVM_nativecall_get_arg_type(tc, ret_info, 1); #ifdef HAVE_LIBFFI body->ffi_ret_type = MVM_nativecall_get_ffi_type(tc, body->ret_type); #endif } static MVMObject * nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *target_type, void *cpointer_body) { MVMObject *result = NULL; MVMROOT(tc, target_spec, { MVMROOT(tc, target_type, { switch (REPR(target_type)->ID) { case MVM_REPR_ID_P6opaque: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) { MVMint64 value = 0; if (ss->is_unsigned) switch(ss->bits) { case 8: value = *(MVMuint8 *)cpointer_body; break; case 16: value = *(MVMuint16 *)cpointer_body; break; case 32: value = *(MVMuint32 *)cpointer_body; break; case 64: default: value = *(MVMuint64 *)cpointer_body; } else switch(ss->bits) { case 8: value = *(MVMint8 *)cpointer_body; break; case 16: value = *(MVMint16 *)cpointer_body; break; case 32: value = *(MVMint32 *)cpointer_body; break; case 64: default: value = *(MVMint64 *)cpointer_body; } result = MVM_nativecall_make_int(tc, target_type, value); } else if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) { MVMnum64 value; switch(ss->bits) { case 32: value = *(MVMnum32 *)cpointer_body; break; case 64: default: value = *(MVMnum64 *)cpointer_body; } result = MVM_nativecall_make_num(tc, target_type, value); } else if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { result = MVM_nativecall_make_str(tc, target_type, MVM_NATIVECALL_ARG_UTF8STR, (char *)cpointer_body); } break; } case MVM_REPR_ID_P6int: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); MVMint64 value; if (ss->is_unsigned) switch(ss->bits) { case 8: value = *(MVMuint8 *)cpointer_body; break; case 16: value = *(MVMuint16 *)cpointer_body; break; case 32: value = *(MVMuint32 *)cpointer_body; break; case 64: default: value = *(MVMuint64 *)cpointer_body; } else switch(ss->bits) { case 8: value = *(MVMint8 *)cpointer_body; break; case 16: value = *(MVMint16 *)cpointer_body; break; case 32: value = *(MVMint32 *)cpointer_body; break; case 64: default: value = *(MVMint64 *)cpointer_body; } result = MVM_nativecall_make_int(tc, target_type, value); break; } case MVM_REPR_ID_P6num: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); MVMnum64 value; switch(ss->bits) { case 32: value = *(MVMnum32 *)cpointer_body; break; case 64: default: value = *(MVMnum64 *)cpointer_body; } result = MVM_nativecall_make_num(tc, target_type, value); break; } case MVM_REPR_ID_MVMCStr: case MVM_REPR_ID_P6str: result = MVM_nativecall_make_str(tc, target_type, MVM_NATIVECALL_ARG_UTF8STR, (char *)cpointer_body); break; case MVM_REPR_ID_MVMCStruct: result = MVM_nativecall_make_cstruct(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCUnion: result = MVM_nativecall_make_cunion(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCPointer: result = MVM_nativecall_make_cpointer(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCArray: { result = MVM_nativecall_make_carray(tc, target_type, (void *)cpointer_body); break; } default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled target type"); } }); }); return result; } MVMObject * MVM_nativecall_global(MVMThreadContext *tc, MVMString *lib, MVMString *sym, MVMObject *target_spec, MVMObject *target_type) { char *lib_name = MVM_string_utf8_c8_encode_C_string(tc, lib); char *sym_name = MVM_string_utf8_c8_encode_C_string(tc, sym); DLLib *lib_handle; void *entry_point; MVMObject *ret = NULL; /* Try to load the library. */ lib_handle = MVM_nativecall_load_lib(strlen(lib_name) ? lib_name : NULL); if (!lib_handle) { char *waste[] = { lib_name, NULL }; MVM_free(sym_name); MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate native library '%s': %s", lib_name, dlerror()); } /* Try to locate the symbol. */ entry_point = MVM_nativecall_find_sym(lib_handle, sym_name); if (!entry_point) { char *waste[] = { sym_name, lib_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate symbol '%s' in native library '%s'", sym_name, lib_name); } MVM_free(sym_name); MVM_free(lib_name); if (REPR(target_type)->ID == MVM_REPR_ID_MVMCStr || REPR(target_type)->ID == MVM_REPR_ID_P6str || (REPR(target_type)->ID == MVM_REPR_ID_P6opaque && REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec))->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR)) { entry_point = *(void **)entry_point; } ret = nativecall_cast(tc, target_spec, target_type, entry_point); MVM_nativecall_free_lib(lib_handle); return ret; } MVMObject * MVM_nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *target_type, MVMObject *source) { void *data_body; if (!source) return target_type; if (REPR(source)->ID == MVM_REPR_ID_MVMCStruct) data_body = MVM_nativecall_unmarshal_cstruct(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCPPStruct) data_body = MVM_nativecall_unmarshal_cppstruct(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCUnion) data_body = MVM_nativecall_unmarshal_cunion(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCPointer) data_body = MVM_nativecall_unmarshal_cpointer(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCArray) data_body = MVM_nativecall_unmarshal_carray(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMArray) data_body = MVM_nativecall_unmarshal_vmarray(tc, source); else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer, CStruct, CArray, or VMArray representation, but got a %s", REPR(source)->name); return nativecall_cast(tc, target_spec, target_type, data_body); } MVMint64 MVM_nativecall_sizeof(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->ID == MVM_REPR_ID_MVMCStruct) return ((MVMCStructREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCPPStruct) return ((MVMCPPStructREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCUnion) return ((MVMCUnionREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_P6int) return ((MVMP6intREPRData *)STABLE(obj)->REPR_data)->bits / 8; else if (REPR(obj)->ID == MVM_REPR_ID_P6num) return ((MVMP6numREPRData *)STABLE(obj)->REPR_data)->bits / 8; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCPointer || REPR(obj)->ID == MVM_REPR_ID_MVMCArray || REPR(obj)->ID == MVM_REPR_ID_MVMCStr || REPR(obj)->ID == MVM_REPR_ID_P6str) return sizeof(void *); else MVM_exception_throw_adhoc(tc, "NativeCall op sizeof expected type with CPointer, CStruct, CArray, P6int or P6num representation, but got a %s", REPR(obj)->name); } /* Write-barriers a dyncall object so that delayed changes to the C-side of * objects are propagated to the HLL side. All CArray and CStruct arguments to * C functions are write-barriered automatically, so this should be necessary * only in the rarest of cases. */ void MVM_nativecall_refresh(MVMThreadContext *tc, MVMObject *cthingy) { if (!IS_CONCRETE(cthingy)) return; if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCArray) { MVMCArrayBody *body = (MVMCArrayBody *)OBJECT_BODY(cthingy); MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)STABLE(cthingy)->REPR_data; void **storage = (void **) body->storage; MVMint64 i; /* No need to check for numbers. They're stored directly in the array. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) return; for (i = 0; i < body->elems; i++) { void *cptr; /* The pointer in the C storage. */ void *objptr; /* The pointer in the object representing the C object. */ /* Ignore elements where we haven't generated an object. */ if (!body->child_objs[i]) continue; cptr = storage[i]; if (IS_CONCRETE(body->child_objs[i])) { switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[i]))->storage; break; case MVM_CARRAY_ELEM_KIND_CPOINTER: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[i]))->ptr; break; case MVM_CARRAY_ELEM_KIND_CSTRUCT: objptr = ((MVMCStructBody *)OBJECT_BODY(body->child_objs[i]))->cstruct; break; case MVM_CARRAY_ELEM_KIND_CUNION: objptr = ((MVMCUnionBody *)OBJECT_BODY(body->child_objs[i]))->cunion; break; case MVM_CARRAY_ELEM_KIND_STRING: objptr = NULL; /* TODO */ break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad elem_kind (%d) in CArray write barrier", repr_data->elem_kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[i] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[i]); } } else if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCStruct) { MVMCStructBody *body = (MVMCStructBody *)OBJECT_BODY(cthingy); MVMCStructREPRData *repr_data = (MVMCStructREPRData *)STABLE(cthingy)->REPR_data; char *storage = (char *) body->cstruct; MVMint64 i; for (i = 0; i < repr_data->num_attributes; i++) { MVMint32 kind = repr_data->attribute_locations[i] & MVM_CSTRUCT_ATTR_MASK; MVMint32 slot = repr_data->attribute_locations[i] >> MVM_CSTRUCT_ATTR_SHIFT; void *cptr; /* The pointer in the C storage. */ void *objptr; /* The pointer in the object representing the C object. */ if (kind == MVM_CSTRUCT_ATTR_IN_STRUCT || !body->child_objs[slot]) continue; cptr = *((void **)(storage + repr_data->struct_offsets[i])); if (IS_CONCRETE(body->child_objs[slot])) { switch (kind) { case MVM_CSTRUCT_ATTR_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[slot]))->storage; break; case MVM_CSTRUCT_ATTR_CPTR: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[slot]))->ptr; break; case MVM_CSTRUCT_ATTR_CSTRUCT: objptr = (MVMCStructBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CSTRUCT_ATTR_CUNION: objptr = (MVMCUnionBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CSTRUCT_ATTR_STRING: objptr = NULL; break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad kind (%d) in CStruct write barrier", kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[slot] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[slot]); } } else if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCPPStruct) { MVMCPPStructBody *body = (MVMCPPStructBody *)OBJECT_BODY(cthingy); MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(cthingy)->REPR_data; char *storage = (char *) body->cppstruct; MVMint64 i; for (i = 0; i < repr_data->num_attributes; i++) { MVMint32 kind = repr_data->attribute_locations[i] & MVM_CPPSTRUCT_ATTR_MASK; MVMint32 slot = repr_data->attribute_locations[i] >> MVM_CPPSTRUCT_ATTR_SHIFT; void *cptr; /* The pointer in the C storage. */ void *objptr; /* The pointer in the object representing the C object. */ if (kind == MVM_CPPSTRUCT_ATTR_IN_STRUCT || !body->child_objs[slot]) continue; cptr = *((void **)(storage + repr_data->struct_offsets[i])); if (IS_CONCRETE(body->child_objs[slot])) { switch (kind) { case MVM_CPPSTRUCT_ATTR_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[slot]))->storage; break; case MVM_CPPSTRUCT_ATTR_CPTR: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[slot]))->ptr; break; case MVM_CPPSTRUCT_ATTR_CSTRUCT: objptr = (MVMCStructBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CPPSTRUCT_ATTR_STRING: objptr = NULL; break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad kind (%d) in CPPStruct write barrier", kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[slot] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[slot]); } } } MoarVM-2015.11/src/core/nativecall.h0000644000175000017500000001422412573775575016114 0ustar jnthnjnthn/* The various native call argument types. */ #define MVM_NATIVECALL_ARG_VOID 0 #define MVM_NATIVECALL_ARG_CHAR 2 #define MVM_NATIVECALL_ARG_SHORT 4 #define MVM_NATIVECALL_ARG_INT 6 #define MVM_NATIVECALL_ARG_LONG 8 #define MVM_NATIVECALL_ARG_LONGLONG 10 #define MVM_NATIVECALL_ARG_FLOAT 12 #define MVM_NATIVECALL_ARG_DOUBLE 14 #define MVM_NATIVECALL_ARG_ASCIISTR 16 #define MVM_NATIVECALL_ARG_UTF8STR 18 #define MVM_NATIVECALL_ARG_UTF16STR 20 #define MVM_NATIVECALL_ARG_CSTRUCT 22 #define MVM_NATIVECALL_ARG_CARRAY 24 #define MVM_NATIVECALL_ARG_CALLBACK 26 #define MVM_NATIVECALL_ARG_CPOINTER 28 #define MVM_NATIVECALL_ARG_VMARRAY 30 #define MVM_NATIVECALL_ARG_UCHAR 32 #define MVM_NATIVECALL_ARG_USHORT 34 #define MVM_NATIVECALL_ARG_UINT 36 #define MVM_NATIVECALL_ARG_ULONG 38 #define MVM_NATIVECALL_ARG_ULONGLONG 40 #define MVM_NATIVECALL_ARG_CUNION 42 #define MVM_NATIVECALL_ARG_CPPSTRUCT 44 #define MVM_NATIVECALL_ARG_TYPE_MASK 62 /* Flag for whether we should free a string after passing it or not. */ #define MVM_NATIVECALL_ARG_NO_FREE_STR 0 #define MVM_NATIVECALL_ARG_FREE_STR 1 #define MVM_NATIVECALL_ARG_FREE_STR_MASK 1 #define MVM_NATIVECALL_ARG_NO_RW 0 #define MVM_NATIVECALL_ARG_RW 256 #define MVM_NATIVECALL_ARG_RW_MASK 256 /* Native callback entry. Hung off MVMNativeCallbackCacheHead, which is * a hash owned by the ThreadContext. All MVMNativeCallbacks in a linked * list have the same cuid, which is the key to the CacheHead hash. */ struct MVMNativeCallback { /* The dyncall/libffi callback object. */ void *cb; /* The routine that we will call. */ MVMObject *target; /* Thread context we expect to run the callback on. */ MVMThreadContext *tc; /* Return and argument type flags. */ MVMint16 *typeinfos; /* Return and argument types themselves. */ MVMObject **types; /* The number of entries in typeinfos/types. */ MVMint32 num_types; /* The MoarVM callsite object for this call. */ MVMCallsite *cs; #ifdef HAVE_LIBFFI ffi_abi convention; ffi_type **ffi_arg_types; ffi_type *ffi_ret_type; #endif /* The next entry in the linked list */ MVMNativeCallback *next; }; /* A hash of nativecall callbacks. Each entry is a linked * list of MVMNativeCallback sharing the same cuid. * Multiple callbacks with the same cuid get created when * closures are taken and need to be differentiated. */ struct MVMNativeCallbackCacheHead { MVMNativeCallback *head; /* The uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* Functions for working with native callsites. */ MVMNativeCallBody * MVM_nativecall_get_nc_body(MVMThreadContext *tc, MVMObject *obj); MVMint16 MVM_nativecall_get_arg_type(MVMThreadContext *tc, MVMObject *info, MVMint16 is_return); void MVM_nativecall_build(MVMThreadContext *tc, MVMObject *site, MVMString *lib, MVMString *sym, MVMString *conv, MVMObject *arg_spec, MVMObject *ret_spec); MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args); MVMObject * MVM_nativecall_global(MVMThreadContext *tc, MVMString *lib, MVMString *sym, MVMObject *target_spec, MVMObject *target_type); MVMObject * MVM_nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *res_type, MVMObject *obj); MVMint64 MVM_nativecall_sizeof(MVMThreadContext *tc, MVMObject *obj); void MVM_nativecall_refresh(MVMThreadContext *tc, MVMObject *cthingy); MVMObject * MVM_nativecall_make_cstruct(MVMThreadContext *tc, MVMObject *type, void *cstruct); MVMObject * MVM_nativecall_make_cppstruct(MVMThreadContext *tc, MVMObject *type, void *cppstruct); MVMObject * MVM_nativecall_make_cunion(MVMThreadContext *tc, MVMObject *type, void *cunion); MVMObject * MVM_nativecall_make_cpointer(MVMThreadContext *tc, MVMObject *type, void *ptr); MVMObject * MVM_nativecall_make_carray(MVMThreadContext *tc, MVMObject *type, void *carray); MVMObject * MVM_nativecall_make_int(MVMThreadContext *tc, MVMObject *type, MVMint64 value); MVMObject * MVM_nativecall_make_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 value); MVMObject * MVM_nativecall_make_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 value); MVMObject * MVM_nativecall_make_str(MVMThreadContext *tc, MVMObject *type, MVMint16 ret_type, char *cstring); signed char MVM_nativecall_unmarshal_char(MVMThreadContext *tc, MVMObject *value); signed short MVM_nativecall_unmarshal_short(MVMThreadContext *tc, MVMObject *value); signed int MVM_nativecall_unmarshal_int(MVMThreadContext *tc, MVMObject *value); signed long MVM_nativecall_unmarshal_long(MVMThreadContext *tc, MVMObject *value); signed long long MVM_nativecall_unmarshal_longlong(MVMThreadContext *tc, MVMObject *value); unsigned char MVM_nativecall_unmarshal_uchar(MVMThreadContext *tc, MVMObject *value); unsigned short MVM_nativecall_unmarshal_ushort(MVMThreadContext *tc, MVMObject *value); unsigned int MVM_nativecall_unmarshal_uint(MVMThreadContext *tc, MVMObject *value); unsigned long MVM_nativecall_unmarshal_ulong(MVMThreadContext *tc, MVMObject *value); unsigned long long MVM_nativecall_unmarshal_ulonglong(MVMThreadContext *tc, MVMObject *value); float MVM_nativecall_unmarshal_float(MVMThreadContext *tc, MVMObject *value); double MVM_nativecall_unmarshal_double(MVMThreadContext *tc, MVMObject *value); char * MVM_nativecall_unmarshal_string(MVMThreadContext *tc, MVMObject *value, MVMint16 type, MVMint16 *free); void * MVM_nativecall_unmarshal_cstruct(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cppstruct(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cpointer(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_carray(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_vmarray(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cunion(MVMThreadContext *tc, MVMObject *value); MoarVM-2015.11/src/core/nativecall_dyncall.c0000644000175000017500000007534412623370227017604 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include #endif /* Maps a calling convention name to an ID. */ MVMint16 MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name) { MVMint16 result = DC_CALL_C_DEFAULT; if (name && MVM_string_graphs(tc, name) > 0) { char *cname = MVM_string_utf8_encode_C_string(tc, name); if (strcmp(cname, "cdecl") == 0) result = DC_CALL_C_X86_CDECL; else if (strcmp(cname, "stdcall") == 0) result = DC_CALL_C_X86_WIN32_STD; else if (strcmp(cname, "thisgnu") == 0) result = DC_CALL_C_X86_WIN32_THIS_GNU; else if (strcmp(cname, "thisms") == 0) result = DC_CALL_C_X86_WIN32_THIS_MS; else if (strcmp(cname, "stdcall") == 0) result = DC_CALL_C_X64_WIN64; else { char *waste[] = { cname, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown calling convention '%s' used for native call", cname); } MVM_free(cname); } return result; } /* Map argument type ID to dyncall character ID. */ static char get_signature_char(MVMint16 type_id) { if ( (type_id & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) return 'p'; switch (type_id & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: return 'v'; case MVM_NATIVECALL_ARG_CHAR: return 'c'; case MVM_NATIVECALL_ARG_SHORT: return 's'; case MVM_NATIVECALL_ARG_INT: return 'i'; case MVM_NATIVECALL_ARG_LONG: return 'j'; case MVM_NATIVECALL_ARG_LONGLONG: return 'l'; case MVM_NATIVECALL_ARG_FLOAT: return 'f'; case MVM_NATIVECALL_ARG_DOUBLE: return 'd'; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: case MVM_NATIVECALL_ARG_CSTRUCT: case MVM_NATIVECALL_ARG_CPOINTER: case MVM_NATIVECALL_ARG_CARRAY: case MVM_NATIVECALL_ARG_CUNION: case MVM_NATIVECALL_ARG_VMARRAY: case MVM_NATIVECALL_ARG_CALLBACK: return 'p'; case MVM_NATIVECALL_ARG_UCHAR: return 'C'; case MVM_NATIVECALL_ARG_USHORT: return 'S'; case MVM_NATIVECALL_ARG_UINT: return 'I'; case MVM_NATIVECALL_ARG_ULONG: return 'J'; case MVM_NATIVECALL_ARG_ULONGLONG: return 'L'; default: return '\0'; } } /* Sets up a callback, caching the information to avoid duplicate work. */ static char callback_handler(DCCallback *cb, DCArgs *args, DCValue *result, MVMNativeCallback *data); static void * unmarshal_callback(MVMThreadContext *tc, MVMObject *callback, MVMObject *sig_info) { MVMNativeCallbackCacheHead *callback_data_head = NULL; MVMNativeCallback **callback_data_handle; MVMString *cuid; if (!IS_CONCRETE(callback)) return NULL; /* Try to locate existing cached callback info. */ callback = MVM_frame_find_invokee(tc, callback, NULL); cuid = ((MVMCode *)callback)->body.sf->body.cuuid; MVM_string_flatten(tc, cuid); MVM_HASH_GET(tc, tc->native_callback_cache, cuid, callback_data_head); if (!callback_data_head) { callback_data_head = MVM_malloc(sizeof(MVMNativeCallbackCacheHead)); callback_data_head->head = NULL; MVM_HASH_BIND(tc, tc->native_callback_cache, cuid, callback_data_head); } callback_data_handle = &(callback_data_head->head); while (*callback_data_handle) { if ((*callback_data_handle)->target == callback) /* found it, break */ break; callback_data_handle = &((*callback_data_handle)->next); } if (!*callback_data_handle) { /* First, build the MVMNativeCallback */ MVMCallsite *cs; char *signature; MVMObject *typehash; MVMint64 num_info, i; MVMNativeCallback *callback_data; num_info = MVM_repr_elems(tc, sig_info); callback_data = MVM_malloc(sizeof(MVMNativeCallback)); callback_data->num_types = num_info; callback_data->typeinfos = MVM_malloc(num_info * sizeof(MVMint16)); callback_data->types = MVM_malloc(num_info * sizeof(MVMObject *)); callback_data->next = NULL; /* A dyncall signature looks like this: xxx)x * Argument types before the ) and return type after it. Thus, * num_info+1 must be NULL (zero-terminated string) and num_info-1 * must be the ). */ signature = MVM_malloc(num_info + 2); signature[num_info + 1] = '\0'; signature[num_info - 1] = ')'; /* We'll also build up a MoarVM callsite as we go. */ cs = MVM_malloc(sizeof(MVMCallsite)); cs->flag_count = num_info - 1; cs->arg_flags = MVM_malloc(num_info * sizeof(MVMCallsiteEntry)); cs->arg_count = num_info - 1; cs->num_pos = num_info - 1; cs->has_flattening = 0; cs->is_interned = 0; cs->with_invocant = NULL; typehash = MVM_repr_at_pos_o(tc, sig_info, 0); callback_data->types[0] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[0] = MVM_nativecall_get_arg_type(tc, typehash, 1); signature[num_info] = get_signature_char(callback_data->typeinfos[0]); for (i = 1; i < num_info; i++) { typehash = MVM_repr_at_pos_o(tc, sig_info, i); callback_data->types[i] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[i] = MVM_nativecall_get_arg_type(tc, typehash, 0) & ~MVM_NATIVECALL_ARG_FREE_STR; signature[i - 1] = get_signature_char(callback_data->typeinfos[i]); switch (callback_data->typeinfos[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: case MVM_NATIVECALL_ARG_SHORT: case MVM_NATIVECALL_ARG_INT: case MVM_NATIVECALL_ARG_LONG: case MVM_NATIVECALL_ARG_LONGLONG: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_UCHAR: case MVM_NATIVECALL_ARG_USHORT: case MVM_NATIVECALL_ARG_UINT: case MVM_NATIVECALL_ARG_ULONG: case MVM_NATIVECALL_ARG_ULONGLONG: /* TODO: should probably be UINT, when we can support that. */ cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_FLOAT: case MVM_NATIVECALL_ARG_DOUBLE: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_NUM; break; default: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_OBJ; break; } } MVM_callsite_try_intern(tc, &cs); callback_data->tc = tc; callback_data->cs = cs; callback_data->target = callback; callback_data->cb = dcbNewCallback(signature, (DCCallbackHandler *)callback_handler, callback_data); /* Now insert the MVMCallback into the linked list. */ *callback_data_handle = callback_data; MVM_free(signature); } return (*callback_data_handle)->cb; } /* Called to handle a callback. */ typedef struct { MVMObject *invokee; MVMRegister *args; MVMCallsite *cs; } CallbackInvokeData; static void callback_invoke(MVMThreadContext *tc, void *data) { /* Invoke the coderef, to set up the nested interpreter. */ CallbackInvokeData *cid = (CallbackInvokeData *)data; STABLE(cid->invokee)->invoke(tc, cid->invokee, cid->cs, cid->args); /* Ensure we exit interp after callback. */ tc->thread_entry_frame = tc->cur_frame; } static char callback_handler(DCCallback *cb, DCArgs *cb_args, DCValue *cb_result, MVMNativeCallback *data) { CallbackInvokeData cid; MVMint32 num_roots, i; MVMRegister res; /* Build a callsite and arguments buffer. */ MVMThreadContext *tc = data->tc; MVMRegister *args = MVM_malloc(data->num_types * sizeof(MVMRegister)); num_roots = 0; for (i = 1; i < data->num_types; i++) { MVMObject *type = data->types[i]; MVMint16 typeinfo = data->typeinfos[i]; switch (typeinfo & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: args[i - 1].i64 = dcbArgChar(cb_args); break; case MVM_NATIVECALL_ARG_SHORT: args[i - 1].i64 = dcbArgShort(cb_args); break; case MVM_NATIVECALL_ARG_INT: args[i - 1].i64 = dcbArgInt(cb_args); break; case MVM_NATIVECALL_ARG_LONG: args[i - 1].i64 = dcbArgLong(cb_args); break; case MVM_NATIVECALL_ARG_LONGLONG: args[i - 1].i64 = dcbArgLongLong(cb_args); break; case MVM_NATIVECALL_ARG_FLOAT: args[i - 1].n64 = dcbArgFloat(cb_args); break; case MVM_NATIVECALL_ARG_DOUBLE: args[i - 1].n64 = dcbArgDouble(cb_args); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo, (char *)dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CSTRUCT: args[i - 1].o = MVM_nativecall_make_cstruct(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CPOINTER: args[i - 1].o = MVM_nativecall_make_cpointer(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CARRAY: args[i - 1].o = MVM_nativecall_make_carray(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CUNION: args[i - 1].o = MVM_nativecall_make_cunion(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ dcbArgPointer(cb_args); args[i - 1].o = type; MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_UCHAR: args[i - 1].i64 = dcbArgUChar(cb_args); break; case MVM_NATIVECALL_ARG_USHORT: args[i - 1].i64 = dcbArgUShort(cb_args); break; case MVM_NATIVECALL_ARG_UINT: args[i - 1].i64 = dcbArgUInt(cb_args); break; case MVM_NATIVECALL_ARG_ULONG: args[i - 1].i64 = dcbArgULong(cb_args); break; case MVM_NATIVECALL_ARG_ULONGLONG: args[i - 1].i64 = dcbArgULongLong(cb_args); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall callback argument type"); } } /* Call into a nested interpreter (since we already are in one). Need to * save a bunch of state around each side of this. */ cid.invokee = data->target; cid.args = args; cid.cs = data->cs; { MVMuint8 **backup_interp_cur_op = tc->interp_cur_op; MVMuint8 **backup_interp_bytecode_start = tc->interp_bytecode_start; MVMRegister **backup_interp_reg_base = tc->interp_reg_base; MVMCompUnit **backup_interp_cu = tc->interp_cu; MVMFrame *backup_cur_frame = tc->cur_frame; MVMFrame *backup_thread_entry_frame = tc->thread_entry_frame; MVMuint32 backup_mark = MVM_gc_root_temp_mark(tc); jmp_buf backup_interp_jump; memcpy(backup_interp_jump, tc->interp_jump, sizeof(jmp_buf)); tc->cur_frame->return_value = &res; tc->cur_frame->return_type = MVM_RETURN_OBJ; MVM_interp_run(tc, callback_invoke, &cid); tc->interp_cur_op = backup_interp_cur_op; tc->interp_bytecode_start = backup_interp_bytecode_start; tc->interp_reg_base = backup_interp_reg_base; tc->interp_cu = backup_interp_cu; tc->cur_frame = backup_cur_frame; tc->thread_entry_frame = backup_thread_entry_frame; memcpy(tc->interp_jump, backup_interp_jump, sizeof(jmp_buf)); MVM_gc_root_temp_mark_reset(tc, backup_mark); } /* Handle return value. */ if (res.o) { MVMContainerSpec const *contspec = STABLE(res.o)->container_spec; if (contspec && contspec->fetch_never_invokes) contspec->fetch(data->tc, res.o, &res); } switch (data->typeinfos[0] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: break; case MVM_NATIVECALL_ARG_CHAR: cb_result->c = MVM_nativecall_unmarshal_char(data->tc, res.o); break; case MVM_NATIVECALL_ARG_SHORT: cb_result->s = MVM_nativecall_unmarshal_short(data->tc, res.o); break; case MVM_NATIVECALL_ARG_INT: cb_result->i = MVM_nativecall_unmarshal_int(data->tc, res.o); break; case MVM_NATIVECALL_ARG_LONG: cb_result->j = MVM_nativecall_unmarshal_long(data->tc, res.o); break; case MVM_NATIVECALL_ARG_LONGLONG: cb_result->l = MVM_nativecall_unmarshal_longlong(data->tc, res.o); break; case MVM_NATIVECALL_ARG_FLOAT: cb_result->f = MVM_nativecall_unmarshal_float(data->tc, res.o); break; case MVM_NATIVECALL_ARG_DOUBLE: cb_result->d = MVM_nativecall_unmarshal_double(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: cb_result->Z = MVM_nativecall_unmarshal_string(data->tc, res.o, data->typeinfos[0], NULL); break; case MVM_NATIVECALL_ARG_CSTRUCT: cb_result->p = MVM_nativecall_unmarshal_cstruct(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CPOINTER: cb_result->p = MVM_nativecall_unmarshal_cpointer(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CARRAY: cb_result->p = MVM_nativecall_unmarshal_carray(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CUNION: cb_result->p = MVM_nativecall_unmarshal_cunion(data->tc, res.o); break; case MVM_NATIVECALL_ARG_VMARRAY: cb_result->p = MVM_nativecall_unmarshal_vmarray(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CALLBACK: cb_result->p = unmarshal_callback(data->tc, res.o, data->types[0]); break; case MVM_NATIVECALL_ARG_UCHAR: cb_result->c = MVM_nativecall_unmarshal_uchar(data->tc, res.o); break; case MVM_NATIVECALL_ARG_USHORT: cb_result->s = MVM_nativecall_unmarshal_ushort(data->tc, res.o); break; case MVM_NATIVECALL_ARG_UINT: cb_result->i = MVM_nativecall_unmarshal_uint(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ULONG: cb_result->j = MVM_nativecall_unmarshal_ulong(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ULONGLONG: cb_result->l = MVM_nativecall_unmarshal_ulonglong(data->tc, res.o); break; default: MVM_exception_throw_adhoc(data->tc, "Internal error: unhandled dyncall callback return type"); } /* Clean up. */ MVM_gc_root_temp_pop_n(tc, num_roots); MVM_free(args); /* Indicate what we're producing as a result. */ return get_signature_char(data->typeinfos[0]); } #define handle_arg(what, cont_X, dc_type, reg_slot, dc_fun, unmarshal_fun) do { \ MVMRegister r; \ if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { \ if (MVM_6model_container_is ## cont_X(tc, value)) { \ dc_type *rw = (dc_type *)MVM_malloc(sizeof(dc_type *)); \ MVM_6model_container_de ## cont_X(tc, value, &r); \ *rw = (dc_type)r. reg_slot ; \ if (!free_rws) \ free_rws = (void **)MVM_malloc(num_args * sizeof(void *)); \ free_rws[num_rws] = rw; \ num_rws++; \ dcArgPointer(vm, rw); \ } \ else \ MVM_exception_throw_adhoc(tc, \ "Native call expected argument that references a native %s, but got %s", \ what, REPR(value)->name); \ } \ else { \ if (value && IS_CONCRETE(value) && STABLE(value)->container_spec) { \ STABLE(value)->container_spec->fetch(tc, value, &r); \ dc_fun(vm, unmarshal_fun(tc, r.o)); \ } \ else { \ dc_fun(vm, unmarshal_fun(tc, value)); \ } \ } \ } while (0) MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args) { MVMObject *result = NULL; char **free_strs = NULL; void **free_rws = NULL; MVMint16 num_strs = 0; MVMint16 num_rws = 0; MVMint16 i; /* Get native call body, so we can locate the call info. Read out all we * shall need, since later we may allocate a result and and move it. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); MVMint16 num_args = body->num_args; MVMint16 *arg_types = body->arg_types; MVMint16 ret_type = body->ret_type; void *entry_point = body->entry_point; void *ptr = NULL; /* Create and set up call VM. */ DCCallVM *vm = dcNewCallVM(8192); dcMode(vm, body->convention); /* Process arguments. */ for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: handle_arg("integer", cont_i, DCchar, i64, dcArgChar, MVM_nativecall_unmarshal_char); break; case MVM_NATIVECALL_ARG_SHORT: handle_arg("integer", cont_i, DCshort, i64, dcArgShort, MVM_nativecall_unmarshal_short); break; case MVM_NATIVECALL_ARG_INT: handle_arg("integer", cont_i, DCint, i64, dcArgInt, MVM_nativecall_unmarshal_int); break; case MVM_NATIVECALL_ARG_LONG: handle_arg("integer", cont_i, DClong, i64, dcArgLong, MVM_nativecall_unmarshal_long); break; case MVM_NATIVECALL_ARG_LONGLONG: handle_arg("integer", cont_i, DClonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_longlong); break; case MVM_NATIVECALL_ARG_FLOAT: handle_arg("number", cont_n, DCfloat, n64, dcArgFloat, MVM_nativecall_unmarshal_float); break; case MVM_NATIVECALL_ARG_DOUBLE: handle_arg("number", cont_n, DCdouble, n64, dcArgDouble, MVM_nativecall_unmarshal_double); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { MVMint16 free = 0; char *str = MVM_nativecall_unmarshal_string(tc, value, arg_types[i], &free); if (free) { if (!free_strs) free_strs = (char**)MVM_malloc(num_args * sizeof(char *)); free_strs[num_strs] = str; num_strs++; } dcArgPointer(vm, str); } break; case MVM_NATIVECALL_ARG_CSTRUCT: dcArgPointer(vm, MVM_nativecall_unmarshal_cstruct(tc, value)); break; case MVM_NATIVECALL_ARG_CPPSTRUCT: { /* We need to allocate the struct (THIS) for C++ constructor before passing it along. */ if (i == 0 && !IS_CONCRETE(value)) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(res_type)->REPR_data; /* Allocate a full byte aligned area where the C++ structure fits into. */ ptr = MVM_malloc(repr_data->struct_size > 0 ? repr_data->struct_size : 1); result = MVM_nativecall_make_cppstruct(tc, res_type, ptr); dcArgPointer(vm, ptr); } else { dcArgPointer(vm, MVM_nativecall_unmarshal_cppstruct(tc, value)); } } break; case MVM_NATIVECALL_ARG_CPOINTER: dcArgPointer(vm, MVM_nativecall_unmarshal_cpointer(tc, value)); break; case MVM_NATIVECALL_ARG_CARRAY: dcArgPointer(vm, MVM_nativecall_unmarshal_carray(tc, value)); break; case MVM_NATIVECALL_ARG_CUNION: dcArgPointer(vm, MVM_nativecall_unmarshal_cunion(tc, value)); break; case MVM_NATIVECALL_ARG_VMARRAY: dcArgPointer(vm, MVM_nativecall_unmarshal_vmarray(tc, value)); break; case MVM_NATIVECALL_ARG_CALLBACK: dcArgPointer(vm, unmarshal_callback(tc, value, body->arg_info[i])); break; case MVM_NATIVECALL_ARG_UCHAR: handle_arg("integer", cont_i, DCuchar, i64, dcArgChar, MVM_nativecall_unmarshal_uchar); break; case MVM_NATIVECALL_ARG_USHORT: handle_arg("integer", cont_i, DCushort, i64, dcArgShort, MVM_nativecall_unmarshal_ushort); break; case MVM_NATIVECALL_ARG_UINT: handle_arg("integer", cont_i, DCuint, i64, dcArgInt, MVM_nativecall_unmarshal_uint); break; case MVM_NATIVECALL_ARG_ULONG: handle_arg("integer", cont_i, DCulong, i64, dcArgLong, MVM_nativecall_unmarshal_ulong); break; case MVM_NATIVECALL_ARG_ULONGLONG: handle_arg("integer", cont_i, DCulonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_ulonglong); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall argument type"); } } if (result) { /* We are calling a C++ constructor so we hand back the invocant (THIS) we recorded earlier. */ dcCallVoid(vm, body->entry_point); } else { /* Call and process return values. */ MVMROOT(tc, args, { MVMROOT(tc, res_type, { switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: dcCallVoid(vm, entry_point); result = res_type; break; case MVM_NATIVECALL_ARG_CHAR: result = MVM_nativecall_make_int(tc, res_type, dcCallChar(vm, entry_point)); break; case MVM_NATIVECALL_ARG_SHORT: result = MVM_nativecall_make_int(tc, res_type, dcCallShort(vm, entry_point)); break; case MVM_NATIVECALL_ARG_INT: result = MVM_nativecall_make_int(tc, res_type, dcCallInt(vm, entry_point)); break; case MVM_NATIVECALL_ARG_LONG: result = MVM_nativecall_make_int(tc, res_type, dcCallLong(vm, entry_point)); break; case MVM_NATIVECALL_ARG_LONGLONG: result = MVM_nativecall_make_int(tc, res_type, dcCallLongLong(vm, entry_point)); break; case MVM_NATIVECALL_ARG_FLOAT: result = MVM_nativecall_make_num(tc, res_type, dcCallFloat(vm, entry_point)); break; case MVM_NATIVECALL_ARG_DOUBLE: result = MVM_nativecall_make_num(tc, res_type, dcCallDouble(vm, entry_point)); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: result = MVM_nativecall_make_str(tc, res_type, body->ret_type, (char *)dcCallPointer(vm, entry_point)); break; case MVM_NATIVECALL_ARG_CSTRUCT: result = MVM_nativecall_make_cstruct(tc, res_type, dcCallPointer(vm, body->entry_point)); break; case MVM_NATIVECALL_ARG_CPPSTRUCT: result = MVM_nativecall_make_cppstruct(tc, res_type, dcCallPointer(vm, body->entry_point)); break; case MVM_NATIVECALL_ARG_CPOINTER: result = MVM_nativecall_make_cpointer(tc, res_type, dcCallPointer(vm, body->entry_point)); break; case MVM_NATIVECALL_ARG_CARRAY: result = MVM_nativecall_make_carray(tc, res_type, dcCallPointer(vm, body->entry_point)); break; case MVM_NATIVECALL_ARG_CUNION: result = MVM_nativecall_make_cunion(tc, res_type, dcCallPointer(vm, body->entry_point)); break; case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ dcCallPointer(vm, body->entry_point); result = res_type; break; case MVM_NATIVECALL_ARG_UCHAR: result = MVM_nativecall_make_uint(tc, res_type, (DCuchar)dcCallChar(vm, entry_point)); break; case MVM_NATIVECALL_ARG_USHORT: result = MVM_nativecall_make_uint(tc, res_type, (DCushort)dcCallShort(vm, entry_point)); break; case MVM_NATIVECALL_ARG_UINT: result = MVM_nativecall_make_uint(tc, res_type, (DCuint)dcCallInt(vm, entry_point)); break; case MVM_NATIVECALL_ARG_ULONG: result = MVM_nativecall_make_uint(tc, res_type, (DCulong)dcCallLong(vm, entry_point)); break; case MVM_NATIVECALL_ARG_ULONGLONG: result = MVM_nativecall_make_uint(tc, res_type, (DCulonglong)dcCallLongLong(vm, entry_point)); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall return type"); } }); }); } num_rws = 0; for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCchar *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_SHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCshort *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_INT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCint *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_LONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DClong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_LONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DClonglong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_FLOAT: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(DCfloat *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_DOUBLE: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(DCdouble *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_UCHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCuchar *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_USHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCushort *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_UINT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCuint *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_ULONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCulong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_ULONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCulonglong *)free_rws[num_rws]); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall argument type"); } num_rws++; } /* Perform CArray/CStruct write barriers. */ MVM_nativecall_refresh(tc, value); } /* Free any memory that we need to. */ if (free_strs) { for (i = 0; i < num_strs; i++) MVM_free(free_strs[i]); MVM_free(free_strs); } if (free_rws) { for (i = 0; i < num_rws; i++) MVM_free(free_rws[i]); MVM_free(free_rws); } /* Finally, free call VM. */ dcFree(vm); return result; } MoarVM-2015.11/src/core/nativecall_dyncall.h0000644000175000017500000000043212554473060017575 0ustar jnthnjnthnMVMint16 MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name); #define MVM_nativecall_load_lib(path) dlLoadLibrary(path) #define MVM_nativecall_free_lib(lib) dlFreeLibrary(lib) #define MVM_nativecall_find_sym(lib, name) dlFindSymbol(lib, name) MoarVM-2015.11/src/core/nativecall_libffi.c0000644000175000017500000007741712623370227017414 0ustar jnthnjnthn#include "moar.h" //~ ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id, void **values, MVMuint64 offset) { ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id) { if ((type_id & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) return &ffi_type_pointer; switch (type_id & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: return &ffi_type_schar; case MVM_NATIVECALL_ARG_SHORT: return &ffi_type_sshort; case MVM_NATIVECALL_ARG_INT: return &ffi_type_sint; case MVM_NATIVECALL_ARG_LONG: return &ffi_type_slong; case MVM_NATIVECALL_ARG_LONGLONG: return &ffi_type_sint64; /* XXX ffi_type_slonglong not defined */ case MVM_NATIVECALL_ARG_FLOAT: return &ffi_type_float; case MVM_NATIVECALL_ARG_DOUBLE: return &ffi_type_double; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: case MVM_NATIVECALL_ARG_CSTRUCT: case MVM_NATIVECALL_ARG_CPOINTER: case MVM_NATIVECALL_ARG_CARRAY: case MVM_NATIVECALL_ARG_CUNION: case MVM_NATIVECALL_ARG_VMARRAY: case MVM_NATIVECALL_ARG_CALLBACK: return &ffi_type_pointer; case MVM_NATIVECALL_ARG_UCHAR: return &ffi_type_uchar; case MVM_NATIVECALL_ARG_USHORT: return &ffi_type_ushort; case MVM_NATIVECALL_ARG_UINT: return &ffi_type_uint; case MVM_NATIVECALL_ARG_ULONG: return &ffi_type_ulong; case MVM_NATIVECALL_ARG_ULONGLONG: return &ffi_type_uint64; /* XXX ffi_type_ulonglong not defined */ default: return &ffi_type_void; } } /* Maps a calling convention name to an ID. */ ffi_abi MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name) { ffi_abi result = FFI_DEFAULT_ABI; //~ if (name && MVM_string_graphs(tc, name) > 0) { //~ char *cname = MVM_string_utf8_encode_C_string(tc, name); //~ if (strcmp(cname, "cdecl") == 0) //~ result = DC_CALL_C_X86_CDECL; //~ else if (strcmp(cname, "stdcall") == 0) //~ result = DC_CALL_C_X86_WIN32_STD; //~ else if (strcmp(cname, "stdcall") == 0) //~ result = DC_CALL_C_X64_WIN64; //~ else { //~ char *waste[] = { cname, NULL }; //~ MVM_exception_throw_adhoc_free(tc, waste, //~ "Unknown calling convention '%s' used for native call", cname); //~ } //~ MVM_free(cname); //~ } return result; } /* Sets up a callback, caching the information to avoid duplicate work. */ //~ static char callback_handler(DCCallback *cb, DCArgs *args, DCValue *result, MVMNativeCallback *data); static void callback_handler(ffi_cif *cif, void *cb_result, void **cb_args, void *data); static void * unmarshal_callback(MVMThreadContext *tc, MVMObject *callback, MVMObject *sig_info) { MVMNativeCallbackCacheHead *callback_data_head = NULL; MVMNativeCallback **callback_data_handle; MVMString *cuid; if (!IS_CONCRETE(callback)) return NULL; /* Try to locate existing cached callback info. */ callback = MVM_frame_find_invokee(tc, callback, NULL); cuid = ((MVMCode *)callback)->body.sf->body.cuuid; MVM_string_flatten(tc, cuid); MVM_HASH_GET(tc, tc->native_callback_cache, cuid, callback_data_head); if (!callback_data_head) { callback_data_head = MVM_malloc(sizeof(MVMNativeCallbackCacheHead)); callback_data_head->head = NULL; MVM_HASH_BIND(tc, tc->native_callback_cache, cuid, callback_data_head); } callback_data_handle = &(callback_data_head->head); while (*callback_data_handle) { if ((*callback_data_handle)->target == callback) /* found it, break */ break; callback_data_handle = &((*callback_data_handle)->next); } if (!*callback_data_handle) { /* First, build the MVMNativeCallback */ MVMCallsite *cs; MVMObject *typehash; MVMint64 num_info, i; MVMNativeCallback *callback_data; /* cb is a piece of executable memory we obtain from libffi. */ void *cb; ffi_cif *cif; ffi_closure *closure; ffi_status status; num_info = MVM_repr_elems(tc, sig_info); /* We'll also build up a MoarVM callsite as we go. */ cs = MVM_malloc(sizeof(MVMCallsite)); cs->flag_count = num_info - 1; cs->arg_flags = MVM_malloc(num_info * sizeof(MVMCallsiteEntry)); cs->arg_count = num_info - 1; cs->num_pos = num_info - 1; cs->has_flattening = 0; cs->is_interned = 0; cs->with_invocant = NULL; callback_data = MVM_malloc(sizeof(MVMNativeCallback)); callback_data->num_types = num_info; callback_data->typeinfos = MVM_malloc(num_info * sizeof(MVMint16)); callback_data->types = MVM_malloc(num_info * sizeof(MVMObject *)); callback_data->next = NULL; cif = (ffi_cif *)MVM_malloc(sizeof(ffi_cif)); callback_data->convention = FFI_DEFAULT_ABI; callback_data->ffi_arg_types = MVM_malloc(sizeof(ffi_type *) * (cs->arg_count ? cs->arg_count : 1)); /* Collect information about the return type. */ typehash = MVM_repr_at_pos_o(tc, sig_info, 0); callback_data->types[0] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[0] = MVM_nativecall_get_arg_type(tc, typehash, 1); callback_data->ffi_ret_type = MVM_nativecall_get_ffi_type(tc, callback_data->typeinfos[0]); for (i = 1; i < num_info; i++) { typehash = MVM_repr_at_pos_o(tc, sig_info, i); callback_data->types[i] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[i] = MVM_nativecall_get_arg_type(tc, typehash, 0) & ~MVM_NATIVECALL_ARG_FREE_STR; callback_data->ffi_arg_types[i - 1] = MVM_nativecall_get_ffi_type(tc, callback_data->typeinfos[i]); switch (callback_data->typeinfos[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: case MVM_NATIVECALL_ARG_SHORT: case MVM_NATIVECALL_ARG_INT: case MVM_NATIVECALL_ARG_LONG: case MVM_NATIVECALL_ARG_LONGLONG: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_UCHAR: case MVM_NATIVECALL_ARG_USHORT: case MVM_NATIVECALL_ARG_UINT: case MVM_NATIVECALL_ARG_ULONG: case MVM_NATIVECALL_ARG_ULONGLONG: /* TODO: should probably be UINT, when we can support that. */ cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_FLOAT: case MVM_NATIVECALL_ARG_DOUBLE: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_NUM; break; default: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_OBJ; break; } } MVM_callsite_try_intern(tc, &cs); callback_data->tc = tc; callback_data->cs = cs; callback_data->target = callback; status = ffi_prep_cif(cif, callback_data->convention, (unsigned int)cs->arg_count, callback_data->ffi_ret_type, callback_data->ffi_arg_types); closure = ffi_closure_alloc(sizeof(ffi_closure), &cb); ffi_prep_closure_loc(closure, cif, callback_handler, callback_data, cb); callback_data->cb = cb; /* Now insert the MVMCallback into the linked list. */ *callback_data_handle = callback_data; } return (*callback_data_handle)->cb; } /* Called to handle a callback. */ typedef struct { MVMObject *invokee; MVMRegister *args; MVMCallsite *cs; } CallbackInvokeData; static void callback_invoke(MVMThreadContext *tc, void *data) { /* Invoke the coderef, to set up the nested interpreter. */ CallbackInvokeData *cid = (CallbackInvokeData *)data; STABLE(cid->invokee)->invoke(tc, cid->invokee, cid->cs, cid->args); /* Ensure we exit interp after callback. */ tc->thread_entry_frame = tc->cur_frame; } static void callback_handler(ffi_cif *cif, void *cb_result, void **cb_args, void *cb_data) { CallbackInvokeData cid; MVMint32 num_roots, i; MVMRegister res; MVMNativeCallback *data = (MVMNativeCallback *)cb_data; void **values = MVM_malloc(sizeof(void *) * (data->cs->arg_count ? data->cs->arg_count : 1)); /* Build a callsite and arguments buffer. */ MVMThreadContext *tc = data->tc; MVMRegister *args = MVM_malloc(data->num_types * sizeof(MVMRegister)); num_roots = 0; for (i = 1; i < data->num_types; i++) { MVMObject *type = data->types[i]; MVMint16 typeinfo = data->typeinfos[i]; switch (typeinfo & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: args[i - 1].i64 = *(signed char *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_SHORT: args[i - 1].i64 = *(signed short *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_INT: args[i - 1].i64 = *(signed int *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_LONG: args[i - 1].i64 = *(signed long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_LONGLONG: args[i - 1].i64 = *(signed long long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_FLOAT: args[i - 1].n64 = *(float *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_DOUBLE: args[i - 1].n64 = *(double *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo, *(char **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CSTRUCT: args[i - 1].o = MVM_nativecall_make_cstruct(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CPOINTER: args[i - 1].o = MVM_nativecall_make_cpointer(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CARRAY: args[i - 1].o = MVM_nativecall_make_carray(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CUNION: args[i - 1].o = MVM_nativecall_make_cunion(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ /* XXX do something with the function pointer: *(void **)cb_args[i - 1] */ args[i - 1].o = type; MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; case MVM_NATIVECALL_ARG_UCHAR: args[i - 1].i64 = *(unsigned char *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_USHORT: args[i - 1].i64 = *(unsigned short *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_UINT: args[i - 1].i64 = *(unsigned int *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ULONG: args[i - 1].i64 = *(unsigned long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ULONGLONG: args[i - 1].i64 = *(unsigned long long *)cb_args[i - 1]; break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi callback argument type"); } } /* Call into a nested interpreter (since we already are in one). Need to * save a bunch of state around each side of this. */ cid.invokee = data->target; cid.args = args; cid.cs = data->cs; { MVMuint8 **backup_interp_cur_op = tc->interp_cur_op; MVMuint8 **backup_interp_bytecode_start = tc->interp_bytecode_start; MVMRegister **backup_interp_reg_base = tc->interp_reg_base; MVMCompUnit **backup_interp_cu = tc->interp_cu; MVMFrame *backup_cur_frame = tc->cur_frame; MVMFrame *backup_thread_entry_frame = tc->thread_entry_frame; MVMuint32 backup_mark = MVM_gc_root_temp_mark(tc); jmp_buf backup_interp_jump; memcpy(backup_interp_jump, tc->interp_jump, sizeof(jmp_buf)); tc->cur_frame->return_value = &res; tc->cur_frame->return_type = MVM_RETURN_OBJ; MVM_interp_run(tc, callback_invoke, &cid); tc->interp_cur_op = backup_interp_cur_op; tc->interp_bytecode_start = backup_interp_bytecode_start; tc->interp_reg_base = backup_interp_reg_base; tc->interp_cu = backup_interp_cu; tc->cur_frame = backup_cur_frame; tc->thread_entry_frame = backup_thread_entry_frame; memcpy(tc->interp_jump, backup_interp_jump, sizeof(jmp_buf)); MVM_gc_root_temp_mark_reset(tc, backup_mark); } /* Handle return value. */ if (res.o) { MVMContainerSpec const *contspec = STABLE(res.o)->container_spec; if (contspec && contspec->fetch_never_invokes) contspec->fetch(data->tc, res.o, &res); } switch (data->typeinfos[0] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: break; case MVM_NATIVECALL_ARG_CHAR: *(signed char *)cb_result = MVM_nativecall_unmarshal_char(data->tc, res.o); break; case MVM_NATIVECALL_ARG_SHORT: *(signed short *)cb_result = MVM_nativecall_unmarshal_short(data->tc, res.o); break; case MVM_NATIVECALL_ARG_INT: *(signed int *)cb_result = MVM_nativecall_unmarshal_int(data->tc, res.o); break; case MVM_NATIVECALL_ARG_LONG: *(signed long *)cb_result = MVM_nativecall_unmarshal_long(data->tc, res.o); break; case MVM_NATIVECALL_ARG_LONGLONG: *(signed long long *)cb_result = MVM_nativecall_unmarshal_longlong(data->tc, res.o); break; case MVM_NATIVECALL_ARG_FLOAT: *(float *)cb_result = MVM_nativecall_unmarshal_float(data->tc, res.o); break; case MVM_NATIVECALL_ARG_DOUBLE: *(double *)cb_result = MVM_nativecall_unmarshal_double(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: *(void **)cb_result = MVM_nativecall_unmarshal_string(data->tc, res.o, data->typeinfos[0], NULL); break; case MVM_NATIVECALL_ARG_CSTRUCT: *(void **)cb_result = MVM_nativecall_unmarshal_cstruct(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CPOINTER: *(void **)cb_result = MVM_nativecall_unmarshal_cpointer(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CARRAY: *(void **)cb_result = MVM_nativecall_unmarshal_carray(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CUNION: *(void **)cb_result = MVM_nativecall_unmarshal_cunion(data->tc, res.o); break; case MVM_NATIVECALL_ARG_VMARRAY: *(void **)cb_result = MVM_nativecall_unmarshal_vmarray(data->tc, res.o); break; case MVM_NATIVECALL_ARG_CALLBACK: *(void **)cb_result = unmarshal_callback(data->tc, res.o, data->types[0]); break; case MVM_NATIVECALL_ARG_UCHAR: *(unsigned char *)cb_result = MVM_nativecall_unmarshal_uchar(data->tc, res.o); break; case MVM_NATIVECALL_ARG_USHORT: *(unsigned short *)cb_result = MVM_nativecall_unmarshal_ushort(data->tc, res.o); break; case MVM_NATIVECALL_ARG_UINT: *(unsigned int *)cb_result = MVM_nativecall_unmarshal_uint(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ULONG: *(unsigned long *)cb_result = MVM_nativecall_unmarshal_ulong(data->tc, res.o); break; case MVM_NATIVECALL_ARG_ULONGLONG: *(unsigned long long *)cb_result = MVM_nativecall_unmarshal_ulonglong(data->tc, res.o); break; default: MVM_exception_throw_adhoc(data->tc, "Internal error: unhandled libffi callback return type"); } /* Clean up. */ MVM_gc_root_temp_pop_n(tc, num_roots); MVM_free(args); MVM_free(cif); } #define handle_arg(what, cont_X, dc_type, reg_slot, unmarshal_fun) do { \ MVMRegister r; \ if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { \ if (MVM_6model_container_is ## cont_X(tc, value)) { \ MVM_6model_container_de ## cont_X(tc, value, &r); \ values[i] = MVM_malloc(sizeof(void *)); \ *(void **)values[i] = MVM_malloc(sizeof(dc_type)); \ *(dc_type *)*(void **)values[i] = (dc_type)r. reg_slot ; \ } \ else \ MVM_exception_throw_adhoc(tc, \ "Native call expected argument that references a native %s, but got %s", \ what, REPR(value)->name); \ } \ else { \ values[i] = MVM_malloc(sizeof(dc_type)); \ if (value && IS_CONCRETE(value) && STABLE(value)->container_spec) { \ STABLE(value)->container_spec->fetch(tc, value, &r); \ *(dc_type *)values[i] = unmarshal_fun(tc, r.o); \ } \ else { \ *(dc_type *)values[i] = unmarshal_fun(tc, value); \ } \ } \ } while (0) MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args) { MVMObject *result = NULL; char **free_strs = NULL; MVMint16 num_strs = 0; MVMint16 i; /* Get native call body, so we can locate the call info. Read out all we * shall need, since later we may allocate a result and and move it. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); MVMint16 num_args = body->num_args; MVMint16 *arg_types = body->arg_types; MVMint16 ret_type = body->ret_type; void *entry_point = body->entry_point; void **values = MVM_malloc(sizeof(void *) * (num_args ? num_args : 1)); ffi_cif cif; ffi_status status = ffi_prep_cif(&cif, body->convention, (unsigned int)num_args, body->ffi_ret_type, body->ffi_arg_types); /* Process arguments. */ for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: handle_arg("integer", cont_i, signed char, i64, MVM_nativecall_unmarshal_char); break; case MVM_NATIVECALL_ARG_SHORT: handle_arg("integer", cont_i, signed short, i64, MVM_nativecall_unmarshal_short); break; case MVM_NATIVECALL_ARG_INT: handle_arg("integer", cont_i, signed int, i64, MVM_nativecall_unmarshal_int); break; case MVM_NATIVECALL_ARG_LONG: handle_arg("integer", cont_i, signed long, i64, MVM_nativecall_unmarshal_long); break; case MVM_NATIVECALL_ARG_LONGLONG: handle_arg("integer", cont_i, signed long long, i64, MVM_nativecall_unmarshal_longlong); break; case MVM_NATIVECALL_ARG_FLOAT: handle_arg("number", cont_n, float, n64, MVM_nativecall_unmarshal_float); break; case MVM_NATIVECALL_ARG_DOUBLE: handle_arg("number", cont_n, double, n64, MVM_nativecall_unmarshal_double); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { MVMint16 free = 0; char *str = MVM_nativecall_unmarshal_string(tc, value, arg_types[i], &free); if (free) { if (!free_strs) free_strs = (char**)MVM_malloc(num_args * sizeof(char *)); free_strs[num_strs] = str; num_strs++; } values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = str; break; } case MVM_NATIVECALL_ARG_CSTRUCT: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cstruct(tc, value); break; case MVM_NATIVECALL_ARG_CPOINTER: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cpointer(tc, value); break; case MVM_NATIVECALL_ARG_CARRAY: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_carray(tc, value); break; case MVM_NATIVECALL_ARG_CUNION: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cunion(tc, value); break; case MVM_NATIVECALL_ARG_VMARRAY: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_vmarray(tc, value); break; case MVM_NATIVECALL_ARG_CALLBACK: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = unmarshal_callback(tc, value, body->arg_info[i]); break; case MVM_NATIVECALL_ARG_UCHAR: handle_arg("integer", cont_i, unsigned char, i64, MVM_nativecall_unmarshal_uchar); break; case MVM_NATIVECALL_ARG_USHORT: handle_arg("integer", cont_i, unsigned short, i64, MVM_nativecall_unmarshal_ushort); break; case MVM_NATIVECALL_ARG_UINT: handle_arg("integer", cont_i, unsigned int, i64, MVM_nativecall_unmarshal_uint); break; case MVM_NATIVECALL_ARG_ULONG: handle_arg("integer", cont_i, unsigned long, i64, MVM_nativecall_unmarshal_ulong); break; case MVM_NATIVECALL_ARG_ULONGLONG: handle_arg("integer", cont_i, unsigned long long, i64, MVM_nativecall_unmarshal_ulonglong); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi argument type"); } } /* Process return values. */ MVMROOT(tc, args, { MVMROOT(tc, res_type, { switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: ffi_call(&cif, entry_point, values[body->num_args], values); result = res_type; break; case MVM_NATIVECALL_ARG_CHAR: { signed char ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_SHORT: { signed short ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_INT: { signed int ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_LONG: { signed long ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_LONGLONG: { signed long long ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_FLOAT: { float ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_num(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_DOUBLE: { double ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_num(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { char *ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_str(tc, res_type, body->ret_type, ret); break; } case MVM_NATIVECALL_ARG_CSTRUCT: { void *ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_cstruct(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_CPOINTER: { void *ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_cpointer(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_CARRAY: { void *ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_carray(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_CUNION: { void *ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_cunion(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_CALLBACK: { /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ void *ret; ffi_call(&cif, entry_point, &ret, values); /* XXX do something with the function pointer: ret */ result = res_type; break; } case MVM_NATIVECALL_ARG_UCHAR: { unsigned char ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_USHORT: { unsigned short ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_UINT: { unsigned int ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_ULONG: { unsigned long ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_ULONGLONG: { unsigned long long ret; ffi_call(&cif, entry_point, &ret, values); result = MVM_nativecall_make_int(tc, res_type, ret); break; } default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi return type"); } }); }); for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed char *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_SHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed short *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_INT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed int *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_LONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_LONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed long long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_FLOAT: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(float *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_DOUBLE: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(double *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_UCHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned char *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_USHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned short *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_UINT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned int *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_ULONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_ULONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned long long *)*(void **)values[i]); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi argument type"); } } /* Perform CArray/CStruct write barriers. */ MVM_nativecall_refresh(tc, value); } /* Free any memory that we need to. */ if (free_strs) { for (i = 0; i < num_strs; i++) MVM_free(free_strs[i]); MVM_free(free_strs); } if (values) MVM_free(values); return result; } MoarVM-2015.11/src/core/nativecall_libffi.h0000644000175000017500000000065712554473060017413 0ustar jnthnjnthn#include typedef void DLLib; ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id); ffi_abi MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name); #define MVM_nativecall_load_lib(path) dlopen(path, RTLD_NOW|RTLD_GLOBAL) #define MVM_nativecall_free_lib(lib) do { if(lib) dlclose(lib); } while (0) #define MVM_nativecall_find_sym(lib, name) dlsym(lib, name) MoarVM-2015.11/src/core/oplabels.h0000644000175000017500000011503512623370227015552 0ustar jnthnjnthn/* This file is generated from src/core/oplist by tools/update_ops.p6. */ static const void * const LABELS[] = { &&OP_no_op, &&OP_const_i8, &&OP_const_i16, &&OP_const_i32, &&OP_const_i64, &&OP_const_n32, &&OP_const_n64, &&OP_const_s, &&OP_set, &&OP_extend_u8, &&OP_extend_u16, &&OP_extend_u32, &&OP_extend_i8, &&OP_extend_i16, &&OP_extend_i32, &&OP_trunc_u8, &&OP_trunc_u16, &&OP_trunc_u32, &&OP_trunc_i8, &&OP_trunc_i16, &&OP_trunc_i32, &&OP_extend_n32, &&OP_trunc_n32, &&OP_goto, &&OP_if_i, &&OP_unless_i, &&OP_if_n, &&OP_unless_n, &&OP_if_s, &&OP_unless_s, &&OP_if_s0, &&OP_unless_s0, &&OP_if_o, &&OP_unless_o, &&OP_jumplist, &&OP_getlex, &&OP_bindlex, &&OP_getlex_ni, &&OP_getlex_nn, &&OP_getlex_ns, &&OP_getlex_no, &&OP_bindlex_ni, &&OP_bindlex_nn, &&OP_bindlex_ns, &&OP_bindlex_no, &&OP_getlex_ng, &&OP_bindlex_ng, &&OP_getdynlex, &&OP_binddynlex, &&OP_setlexvalue, &&OP_lexprimspec, &&OP_return_i, &&OP_return_n, &&OP_return_s, &&OP_return_o, &&OP_return, &&OP_eq_i, &&OP_ne_i, &&OP_lt_i, &&OP_le_i, &&OP_gt_i, &&OP_ge_i, &&OP_cmp_i, &&OP_add_i, &&OP_sub_i, &&OP_mul_i, &&OP_div_i, &&OP_div_u, &&OP_mod_i, &&OP_mod_u, &&OP_neg_i, &&OP_abs_i, &&OP_inc_i, &&OP_inc_u, &&OP_dec_i, &&OP_dec_u, &&OP_band_i, &&OP_bor_i, &&OP_bxor_i, &&OP_bnot_i, &&OP_blshift_i, &&OP_brshift_i, &&OP_pow_i, &&OP_not_i, &&OP_gcd_i, &&OP_lcm_i, &&OP_eq_n, &&OP_ne_n, &&OP_lt_n, &&OP_le_n, &&OP_gt_n, &&OP_ge_n, &&OP_cmp_n, &&OP_add_n, &&OP_sub_n, &&OP_mul_n, &&OP_div_n, &&OP_mod_n, &&OP_neg_n, &&OP_abs_n, &&OP_pow_n, &&OP_ceil_n, &&OP_floor_n, &&OP_sin_n, &&OP_asin_n, &&OP_cos_n, &&OP_acos_n, &&OP_tan_n, &&OP_atan_n, &&OP_atan2_n, &&OP_sec_n, &&OP_asec_n, &&OP_sinh_n, &&OP_cosh_n, &&OP_tanh_n, &&OP_sech_n, &&OP_sqrt_n, &&OP_log_n, &&OP_exp_n, &&OP_coerce_in, &&OP_coerce_ni, &&OP_coerce_is, &&OP_coerce_ns, &&OP_coerce_si, &&OP_coerce_sn, &&OP_smrt_numify, &&OP_smrt_strify, &&OP_prepargs, &&OP_arg_i, &&OP_arg_n, &&OP_arg_s, &&OP_arg_o, &&OP_argconst_i, &&OP_argconst_n, &&OP_argconst_s, &&OP_invoke_v, &&OP_invoke_i, &&OP_invoke_n, &&OP_invoke_s, &&OP_invoke_o, &&OP_checkarity, &&OP_param_rp_i, &&OP_param_rp_n, &&OP_param_rp_s, &&OP_param_rp_o, &&OP_param_op_i, &&OP_param_op_n, &&OP_param_op_s, &&OP_param_op_o, &&OP_param_rn_i, &&OP_param_rn_n, &&OP_param_rn_s, &&OP_param_rn_o, &&OP_param_on_i, &&OP_param_on_n, &&OP_param_on_s, &&OP_param_on_o, &&OP_param_sp, &&OP_param_sn, &&OP_getcode, &&OP_caller, &&OP_capturelex, &&OP_takeclosure, &&OP_exception, &&OP_bindexmessage, &&OP_bindexpayload, &&OP_bindexcategory, &&OP_getexmessage, &&OP_getexpayload, &&OP_getexcategory, &&OP_throwdyn, &&OP_throwlex, &&OP_throwlexotic, &&OP_throwcatdyn, &&OP_throwcatlex, &&OP_throwcatlexotic, &&OP_die, &&OP_rethrow, &&OP_resume, &&OP_takehandlerresult, &&OP_newlexotic, &&OP_lexoticresult, &&OP_backtracestrings, &&OP_usecapture, &&OP_savecapture, &&OP_captureposelems, &&OP_captureposarg, &&OP_captureposarg_i, &&OP_captureposarg_n, &&OP_captureposarg_s, &&OP_captureposprimspec, &&OP_captureexistsnamed, &&OP_capturehasnameds, &&OP_invokewithcapture, &&OP_multicacheadd, &&OP_multicachefind, &&OP_null_s, &&OP_isnull_s, &&OP_eq_s, &&OP_ne_s, &&OP_gt_s, &&OP_ge_s, &&OP_lt_s, &&OP_le_s, &&OP_cmp_s, &&OP_eqat_s, &&OP_eqatic_s, &&OP_haveat_s, &&OP_concat_s, &&OP_repeat_s, &&OP_substr_s, &&OP_index_s, &&OP_graphs_s, &&OP_codes_s, &&OP_getcp_s, &&OP_indexcp_s, &&OP_uc, &&OP_lc, &&OP_tc, &&OP_split, &&OP_join, &&OP_getcpbyname, &&OP_indexat, &&OP_indexnat, &&OP_unipropcode, &&OP_unipvalcode, &&OP_hasuniprop, &&OP_hasunipropc, &&OP_chars, &&OP_chr, &&OP_ordfirst, &&OP_ordat, &&OP_rindexfrom, &&OP_escape, &&OP_flip, &&OP_flattenropes, &&OP_iscclass, &&OP_findcclass, &&OP_findnotcclass, &&OP_nfafromstatelist, &&OP_nfarunproto, &&OP_nfarunalt, &&OP_radix, &&OP_encode, &&OP_decode, &&OP_istrue_s, &&OP_isfalse_s, &&OP_null, &&OP_isnull, &&OP_ifnonnull, &&OP_findmeth, &&OP_findmeth_s, &&OP_can, &&OP_can_s, &&OP_create, &&OP_clone, &&OP_isconcrete, &&OP_rebless, &&OP_istype, &&OP_objprimspec, &&OP_gethow, &&OP_getwhat, &&OP_getwho, &&OP_setwho, &&OP_reprname, &&OP_getwhere, &&OP_eqaddr, &&OP_bindattr_i, &&OP_bindattr_n, &&OP_bindattr_s, &&OP_bindattr_o, &&OP_bindattrs_i, &&OP_bindattrs_n, &&OP_bindattrs_s, &&OP_bindattrs_o, &&OP_getattr_i, &&OP_getattr_n, &&OP_getattr_s, &&OP_getattr_o, &&OP_getattrs_i, &&OP_getattrs_n, &&OP_getattrs_s, &&OP_getattrs_o, &&OP_attrinited, &&OP_box_i, &&OP_box_n, &&OP_box_s, &&OP_unbox_i, &&OP_unbox_n, &&OP_unbox_s, &&OP_atpos_i, &&OP_atpos_n, &&OP_atpos_s, &&OP_atpos_o, &&OP_bindpos_i, &&OP_bindpos_n, &&OP_bindpos_s, &&OP_bindpos_o, &&OP_push_i, &&OP_push_n, &&OP_push_s, &&OP_push_o, &&OP_pop_i, &&OP_pop_n, &&OP_pop_s, &&OP_pop_o, &&OP_shift_i, &&OP_shift_n, &&OP_shift_s, &&OP_shift_o, &&OP_unshift_i, &&OP_unshift_n, &&OP_unshift_s, &&OP_unshift_o, &&OP_splice, &&OP_setelemspos, &&OP_existspos, &&OP_atkey_i, &&OP_atkey_n, &&OP_atkey_s, &&OP_atkey_o, &&OP_bindkey_i, &&OP_bindkey_n, &&OP_bindkey_s, &&OP_bindkey_o, &&OP_existskey, &&OP_deletekey, &&OP_elems, &&OP_knowhow, &&OP_knowhowattr, &&OP_newtype, &&OP_composetype, &&OP_setmethcache, &&OP_setmethcacheauth, &&OP_settypecache, &&OP_settypecheckmode, &&OP_setboolspec, &&OP_istrue, &&OP_isfalse, &&OP_bootint, &&OP_bootnum, &&OP_bootstr, &&OP_bootarray, &&OP_bootintarray, &&OP_bootnumarray, &&OP_bootstrarray, &&OP_boothash, &&OP_isint, &&OP_isnum, &&OP_isstr, &&OP_islist, &&OP_ishash, &&OP_sethllconfig, &&OP_hllboxtype_i, &&OP_hllboxtype_n, &&OP_hllboxtype_s, &&OP_hlllist, &&OP_hllhash, &&OP_getcomp, &&OP_bindcomp, &&OP_getcurhllsym, &&OP_bindcurhllsym, &&OP_gethllsym, &&OP_bindhllsym, &&OP_settypehll, &&OP_settypehllrole, &&OP_hllize, &&OP_hllizefor, &&OP_usecompileehllconfig, &&OP_usecompilerhllconfig, &&OP_iter, &&OP_iterkey_s, &&OP_iterval, &&OP_getcodename, &&OP_iscoderef, &&OP_getcodeobj, &&OP_setcodeobj, &&OP_setcodename, &&OP_forceouterctx, &&OP_setinvokespec, &&OP_isinvokable, &&OP_freshcoderef, &&OP_markcodestatic, &&OP_markcodestub, &&OP_getstaticcode, &&OP_getcodecuid, &&OP_setdispatcher, &&OP_takedispatcher, &&OP_assign, &&OP_assignunchecked, &&OP_iscont, &&OP_decont, &&OP_setcontspec, &&OP_sha1, &&OP_createsc, &&OP_scsetobj, &&OP_scsetcode, &&OP_scgetobj, &&OP_scgethandle, &&OP_scgetobjidx, &&OP_scsetdesc, &&OP_scobjcount, &&OP_setobjsc, &&OP_getobjsc, &&OP_serialize, &&OP_deserialize, &&OP_wval, &&OP_wval_wide, &&OP_scwbdisable, &&OP_scwbenable, &&OP_pushcompsc, &&OP_popcompsc, &&OP_scgetdesc, &&OP_loadbytecode, &&OP_masttofile, &&OP_masttocu, &&OP_iscompunit, &&OP_compunitmainline, &&OP_compunitcodes, &&OP_ctx, &&OP_ctxouter, &&OP_ctxcaller, &&OP_ctxlexpad, &&OP_curcode, &&OP_callercode, &&OP_add_I, &&OP_sub_I, &&OP_mul_I, &&OP_div_I, &&OP_mod_I, &&OP_neg_I, &&OP_abs_I, &&OP_cmp_I, &&OP_eq_I, &&OP_ne_I, &&OP_lt_I, &&OP_le_I, &&OP_gt_I, &&OP_ge_I, &&OP_bor_I, &&OP_bxor_I, &&OP_band_I, &&OP_bnot_I, &&OP_blshift_I, &&OP_brshift_I, &&OP_pow_I, &&OP_gcd_I, &&OP_lcm_I, &&OP_expmod_I, &&OP_isprime_I, &&OP_rand_I, &&OP_coerce_In, &&OP_coerce_Is, &&OP_coerce_nI, &&OP_coerce_sI, &&OP_isbig_I, &&OP_bool_I, &&OP_base_I, &&OP_radix_I, &&OP_div_In, &&OP_copy_f, &&OP_append_f, &&OP_rename_f, &&OP_delete_f, &&OP_chmod_f, &&OP_exists_f, &&OP_mkdir, &&OP_rmdir, &&OP_open_dir, &&OP_read_dir, &&OP_close_dir, &&OP_open_fh, &&OP_close_fh, &&OP_read_fhs, &&OP_slurp, &&OP_spew, &&OP_write_fhs, &&OP_seek_fh, &&OP_lock_fh, &&OP_unlock_fh, &&OP_sync_fh, &&OP_trunc_fh, &&OP_eof_fh, &&OP_getstdin, &&OP_getstdout, &&OP_getstderr, &&OP_connect_sk, &&OP_socket, &&OP_bind_sk, &&OP_setinputlinesep_fh, &&OP_accept_sk, &&OP_decodetocodes, &&OP_encodefromcodes, &&OP_setencoding, &&OP_print, &&OP_say, &&OP_readall_fh, &&OP_tell_fh, &&OP_stat, &&OP_readline_fh, &&OP_readlineint_fh, &&OP_chdir, &&OP_srand, &&OP_rand_i, &&OP_rand_n, &&OP_time_i, &&OP_sleep, &&OP_newthread, &&OP_threadjoin, &&OP_time_n, &&OP_exit, &&OP_shell, &&OP_cwd, &&OP_clargs, &&OP_getenvhash, &&OP_loadlib, &&OP_freelib, &&OP_findsym, &&OP_dropsym, &&OP_loadext, &&OP_backendconfig, &&OP_getlexouter, &&OP_getlexrel, &&OP_getlexreldyn, &&OP_getlexrelcaller, &&OP_getlexcaller, &&OP_bitand_s, &&OP_bitor_s, &&OP_bitxor_s, &&OP_isnanorinf, &&OP_inf, &&OP_neginf, &&OP_nan, &&OP_getpid, &&OP_spawn, &&OP_filereadable, &&OP_filewritable, &&OP_fileexecutable, &&OP_say_fhs, &&OP_capturenamedshash, &&OP_read_fhb, &&OP_write_fhb, &&OP_replace, &&OP_newexception, &&OP_DEPRECATED_0, &&OP_backtrace, &&OP_symlink, &&OP_link, &&OP_gethostname, &&OP_exreturnafterunwind, &&OP_continuationclone, &&OP_continuationreset, &&OP_continuationcontrol, &&OP_continuationinvoke, &&OP_randscale_n, &&OP_uniisblock, &&OP_assertparamcheck, &&OP_hintfor, &&OP_paramnamesused, &&OP_getuniname, &&OP_getuniprop_int, &&OP_getuniprop_bool, &&OP_getuniprop_str, &&OP_matchuniprop, &&OP_nativecallbuild, &&OP_nativecallinvoke, &&OP_nativecallrefresh, &&OP_threadrun, &&OP_threadid, &&OP_threadyield, &&OP_currentthread, &&OP_lock, &&OP_unlock, &&OP_semacquire, &&OP_semtryacquire, &&OP_semrelease, &&OP_getlockcondvar, &&OP_condwait, &&OP_condsignalone, &&OP_condsignalall, &&OP_queuepoll, &&OP_setmultispec, &&OP_ctxouterskipthunks, &&OP_ctxcallerskipthunks, &&OP_timer, &&OP_cancel, &&OP_signal, &&OP_watchfile, &&OP_asyncconnect, &&OP_asynclisten, &&OP_asyncwritestr, &&OP_asyncwritebytes, &&OP_asyncreadchars, &&OP_asyncreadbytes, &&OP_getlexstatic_o, &&OP_getlexperinvtype_o, &&OP_execname, &&OP_const_i64_16, &&OP_const_i64_32, &&OP_isnonnull, &&OP_param_rn2_i, &&OP_param_rn2_n, &&OP_param_rn2_s, &&OP_param_rn2_o, &&OP_param_on2_i, &&OP_param_on2_n, &&OP_param_on2_s, &&OP_param_on2_o, &&OP_osrpoint, &&OP_nativecallcast, &&OP_spawnprocasync, &&OP_killprocasync, &&OP_startprofile, &&OP_endprofile, &&OP_objectid, &&OP_settypefinalize, &&OP_force_gc, &&OP_nativecallglobal, &&OP_close_fhi, &&OP_setparameterizer, &&OP_parameterizetype, &&OP_typeparameterized, &&OP_typeparameters, &&OP_typeparameterat, &&OP_readlink, &&OP_lstat, &&OP_iscont_i, &&OP_iscont_n, &&OP_iscont_s, &&OP_assign_i, &&OP_assign_n, &&OP_assign_s, &&OP_decont_i, &&OP_decont_n, &&OP_decont_s, &&OP_getregref_i, &&OP_getregref_n, &&OP_getregref_s, &&OP_getlexref_i, &&OP_getlexref_n, &&OP_getlexref_s, &&OP_getlexref_ni, &&OP_getlexref_nn, &&OP_getlexref_ns, &&OP_atposref_i, &&OP_atposref_n, &&OP_atposref_s, &&OP_getattrref_i, &&OP_getattrref_n, &&OP_getattrref_s, &&OP_getattrsref_i, &&OP_getattrsref_n, &&OP_getattrsref_s, &&OP_nativecallsizeof, &&OP_encodenorm, &&OP_normalizecodes, &&OP_strfromcodes, &&OP_strtocodes, &&OP_getcodelocation, &&OP_eqatim_s, &&OP_ordbaseat, &&OP_neverrepossess, &&OP_scdisclaim, &&OP_syncpipe, &&OP_atpos2d_i, &&OP_atpos2d_n, &&OP_atpos2d_s, &&OP_atpos2d_o, &&OP_atpos3d_i, &&OP_atpos3d_n, &&OP_atpos3d_s, &&OP_atpos3d_o, &&OP_atposnd_i, &&OP_atposnd_n, &&OP_atposnd_s, &&OP_atposnd_o, &&OP_bindpos2d_i, &&OP_bindpos2d_n, &&OP_bindpos2d_s, &&OP_bindpos2d_o, &&OP_bindpos3d_i, &&OP_bindpos3d_n, &&OP_bindpos3d_s, &&OP_bindpos3d_o, &&OP_bindposnd_i, &&OP_bindposnd_n, &&OP_bindposnd_s, &&OP_bindposnd_o, &&OP_dimensions, &&OP_setdimensions, &&OP_numdimensions, &&OP_ctxcode, &&OP_isrwcont, &&OP_fc, &&OP_setinputlineseps_fh, &&OP_readlinechomp_fh, &&OP_encoderep, &&OP_istty_fh, &&OP_sp_log, &&OP_sp_osrfinalize, &&OP_sp_guardconc, &&OP_sp_guardtype, &&OP_sp_guardcontconc, &&OP_sp_guardconttype, &&OP_sp_guardrwconc, &&OP_sp_guardrwtype, &&OP_sp_getarg_o, &&OP_sp_getarg_i, &&OP_sp_getarg_n, &&OP_sp_getarg_s, &&OP_sp_fastinvoke_v, &&OP_sp_fastinvoke_i, &&OP_sp_fastinvoke_n, &&OP_sp_fastinvoke_s, &&OP_sp_fastinvoke_o, &&OP_sp_namedarg_used, &&OP_sp_getspeshslot, &&OP_sp_findmeth, &&OP_sp_fastcreate, &&OP_sp_get_o, &&OP_sp_get_i64, &&OP_sp_get_i32, &&OP_sp_get_i16, &&OP_sp_get_i8, &&OP_sp_get_n, &&OP_sp_get_s, &&OP_sp_bind_o, &&OP_sp_bind_i64, &&OP_sp_bind_i32, &&OP_sp_bind_i16, &&OP_sp_bind_i8, &&OP_sp_bind_n, &&OP_sp_bind_s, &&OP_sp_p6oget_o, &&OP_sp_p6ogetvt_o, &&OP_sp_p6ogetvc_o, &&OP_sp_p6oget_i, &&OP_sp_p6oget_n, &&OP_sp_p6oget_s, &&OP_sp_p6obind_o, &&OP_sp_p6obind_i, &&OP_sp_p6obind_n, &&OP_sp_p6obind_s, &&OP_sp_jit_enter, &&OP_sp_boolify_iter, &&OP_sp_boolify_iter_arr, &&OP_sp_boolify_iter_hash, &&OP_prof_enter, &&OP_prof_enterspesh, &&OP_prof_enterinline, &&OP_prof_enternative, &&OP_prof_exit, &&OP_prof_allocated, &&OP_ctw_check, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP }; MoarVM-2015.11/src/core/oplist0000644000175000017500000010732212623370227015035 0ustar jnthnjnthn# This is the authoritative list of MoarVM instructions. # # Changes to this file need to be followed by a call to # tools/update_ops.p6 to update various auto-generated files. # # IMPORTANT NOTE: MoarVM is meant to be able to read bytecode files # from some number of versions back. This means that new ops should, # in general, always be added *at the end* of this file, so they get # new numbers. Similarly, do not remove an op; rename it DEPCRATED_n # (where n is unique for each one). Otherwise the numbering of those # after it will be broken. The alternative is writing a bunch of very # boring mapping code and rendering old bytecode impossible to simply # run from the mmap'd file. # # The exception to this rule is the spesh ops, which must come at the # very end of the file, and since they are never emitted into bytecode # files (the specializer inserts them) can be renumbered any time. # # Each entry specifies an opname, an optional annotation used by the # bytecode validator as well as the op arguments: # # [opname] [annotation?] [args...] # # A basic annotation is a single char prefixed by '.', eg '.r' # for return ops. # # Using a ':' marks the beginning of an op sequence that is followed # by several '.' annoted ops, eg ':j' for a jumplist that is followed # by '.j' annotated goto ops. # # Using a '+' marks the beginning and '-' the end of a block that may # only contain matching '*' annotated ops, eg '+a' for prepargs and # '-a' for invoke_o with ops like arg_i or arg_o annotated as '*a' # inbetween. Note that '*' ops must not appear outside such blocks. # # Some operations may have no side-effects, and so if their result is # never used they can be tossed. Such operations may be marked with # :pure. no_op const_i8 w(int8) int8 :pure const_i16 w(int16) int16 :pure const_i32 w(int32) int32 :pure const_i64 w(int64) int64 :pure const_n32 w(num32) num32 :pure const_n64 w(num64) num64 :pure const_s w(str) str :pure set w(`1) r(`1) :pure extend_u8 w(int64) r(int8) :pure extend_u16 w(int64) r(int16) :pure extend_u32 w(int64) r(int32) :pure extend_i8 w(int64) r(int8) :pure extend_i16 w(int64) r(int16) :pure extend_i32 w(int64) r(int32) :pure trunc_u8 w(int8) r(int64) :pure trunc_u16 w(int16) r(int64) :pure trunc_u32 w(int32) r(int64) :pure trunc_i8 w(int8) r(int64) :pure trunc_i16 w(int16) r(int64) :pure trunc_i32 w(int32) r(int64) :pure extend_n32 w(num64) r(num32) :pure trunc_n32 w(num32) r(num64) :pure goto .j ins if_i r(int64) ins unless_i r(int64) ins if_n r(num64) ins unless_n r(num64) ins if_s r(str) ins unless_s r(str) ins if_s0 r(str) ins unless_s0 r(str) ins if_o r(obj) ins unless_o r(obj) ins jumplist :j int64 r(int64) getlex w(`1) rl(`1) :pure :deoptonepoint bindlex wl(`1) r(`1) getlex_ni w(int64) str :pure :noinline getlex_nn w(num64) str :pure :noinline getlex_ns w(str) str :pure :noinline getlex_no w(obj) str :pure :deoptonepoint :noinline bindlex_ni str r(int64) :noinline bindlex_nn str r(num64) :noinline bindlex_ns str r(str) :noinline bindlex_no str r(obj) :noinline getlex_ng w(obj) r(str) :pure :noinline bindlex_ng r(str) r(obj) :noinline getdynlex w(obj) r(str) :pure :noinline binddynlex r(str) r(obj) :noinline setlexvalue r(obj) str r(obj) int16 lexprimspec w(int64) r(obj) r(str) :pure return_i .r r(int64) return_n .r r(num64) return_s .r r(str) return_o .r r(obj) return .r eq_i w(int64) r(int64) r(int64) :pure ne_i w(int64) r(int64) r(int64) :pure lt_i w(int64) r(int64) r(int64) :pure le_i w(int64) r(int64) r(int64) :pure gt_i w(int64) r(int64) r(int64) :pure ge_i w(int64) r(int64) r(int64) :pure cmp_i w(int64) r(int64) r(int64) :pure add_i w(int64) r(int64) r(int64) :pure sub_i w(int64) r(int64) r(int64) :pure mul_i w(int64) r(int64) r(int64) :pure div_i w(int64) r(int64) r(int64) :pure div_u w(int64) r(int64) r(int64) :pure mod_i w(int64) r(int64) r(int64) :pure mod_u w(int64) r(int64) r(int64) :pure neg_i w(int64) r(int64) :pure abs_i w(int64) r(int64) :pure inc_i w(int64) inc_u w(int64) dec_i w(int64) dec_u w(int64) band_i w(int64) r(int64) r(int64) :pure bor_i w(int64) r(int64) r(int64) :pure bxor_i w(int64) r(int64) r(int64) :pure bnot_i w(int64) r(int64) :pure blshift_i w(int64) r(int64) r(int64) :pure brshift_i w(int64) r(int64) r(int64) :pure pow_i w(int64) r(int64) r(int64) :pure not_i w(int64) r(int64) :pure gcd_i w(int64) r(int64) r(int64) :pure lcm_i w(int64) r(int64) r(int64) :pure eq_n w(int64) r(num64) r(num64) :pure ne_n w(int64) r(num64) r(num64) :pure lt_n w(int64) r(num64) r(num64) :pure le_n w(int64) r(num64) r(num64) :pure gt_n w(int64) r(num64) r(num64) :pure ge_n w(int64) r(num64) r(num64) :pure cmp_n w(int64) r(num64) r(num64) :pure add_n w(num64) r(num64) r(num64) :pure sub_n w(num64) r(num64) r(num64) :pure mul_n w(num64) r(num64) r(num64) :pure div_n w(num64) r(num64) r(num64) :pure mod_n w(num64) r(num64) r(num64) :pure neg_n w(num64) r(num64) :pure abs_n w(num64) r(num64) :pure pow_n w(num64) r(num64) r(num64) :pure ceil_n w(num64) r(num64) :pure floor_n w(num64) r(num64) :pure sin_n w(num64) r(num64) :pure asin_n w(num64) r(num64) :pure cos_n w(num64) r(num64) :pure acos_n w(num64) r(num64) :pure tan_n w(num64) r(num64) :pure atan_n w(num64) r(num64) :pure atan2_n w(num64) r(num64) r(num64) :pure sec_n w(num64) r(num64) :pure asec_n w(num64) r(num64) :pure sinh_n w(num64) r(num64) :pure cosh_n w(num64) r(num64) :pure tanh_n w(num64) r(num64) :pure sech_n w(num64) r(num64) :pure sqrt_n w(num64) r(num64) :pure log_n w(num64) r(num64) :pure exp_n w(num64) r(num64) :pure coerce_in w(num64) r(int64) :pure coerce_ni w(int64) r(num64) :pure coerce_is w(str) r(int64) :pure coerce_ns w(str) r(num64) :pure coerce_si w(int64) r(str) :pure coerce_sn w(num64) r(str) :pure smrt_numify w(num64) r(obj) :pure :invokish smrt_strify w(str) r(obj) :pure :invokish prepargs +a callsite arg_i *a int16 r(int64) arg_n *a int16 r(num64) arg_s *a int16 r(str) arg_o *a int16 r(obj) argconst_i *a int16 int64 argconst_n *a int16 num64 argconst_s *a int16 str invoke_v -a r(obj) :deoptallpoint invoke_i -a w(int64) r(obj) :deoptallpoint invoke_n -a w(num64) r(obj) :deoptallpoint invoke_s -a w(str) r(obj) :deoptallpoint invoke_o -a w(obj) r(obj) :deoptallpoint :deoptonepoint checkarity int16 int16 param_rp_i w(int64) int16 :pure :noinline param_rp_n w(num64) int16 :pure :noinline param_rp_s w(str) int16 :pure :noinline param_rp_o w(obj) int16 :pure :noinline param_op_i w(int64) int16 ins :pure :noinline param_op_n w(num64) int16 ins :pure :noinline param_op_s w(str) int16 ins :pure :noinline param_op_o w(obj) int16 ins :pure :noinline param_rn_i w(int64) str :noinline param_rn_n w(num64) str :noinline param_rn_s w(str) str :noinline param_rn_o w(obj) str :noinline param_on_i w(int64) str ins :noinline param_on_n w(num64) str ins :noinline param_on_s w(str) str ins :noinline param_on_o w(obj) str ins :noinline param_sp w(obj) int16 :pure :noinline param_sn w(obj) :noinline getcode w(obj) coderef :pure caller w(obj) r(int64) :pure :noinline capturelex r(obj) :noinline takeclosure w(obj) r(obj) :noinline exception w(obj) bindexmessage r(obj) r(str) bindexpayload r(obj) r(obj) bindexcategory r(obj) r(int64) getexmessage w(str) r(obj) :pure getexpayload w(obj) r(obj) :pure getexcategory w(int64) r(obj) :pure throwdyn w(obj) r(obj) :throwish throwlex w(obj) r(obj) :throwish throwlexotic w(obj) r(obj) :throwish throwcatdyn w(obj) int64 :throwish throwcatlex w(obj) int64 :throwish throwcatlexotic w(obj) int64 :throwish die w(obj) r(str) :throwish rethrow r(obj) :throwish resume r(obj) :throwish takehandlerresult w(obj) newlexotic w(obj) ins lexoticresult w(obj) r(obj) backtracestrings w(obj) r(obj) :pure usecapture w(obj) :noinline savecapture w(obj) :noinline captureposelems w(int64) r(obj) :pure captureposarg w(obj) r(obj) r(int64) :pure captureposarg_i w(int64) r(obj) r(int64) :pure captureposarg_n w(num64) r(obj) r(int64) :pure captureposarg_s w(str) r(obj) r(int64) :pure captureposprimspec w(int64) r(obj) r(int64) :pure captureexistsnamed w(int64) r(obj) r(str) :pure capturehasnameds w(int64) r(obj) :pure invokewithcapture w(obj) r(obj) r(obj) :invokish multicacheadd w(obj) r(obj) r(obj) r(obj) multicachefind w(obj) r(obj) r(obj) null_s w(str) :pure isnull_s w(int64) r(str) :pure eq_s w(int64) r(str) r(str) :pure ne_s w(int64) r(str) r(str) :pure gt_s w(int64) r(str) r(str) :pure ge_s w(int64) r(str) r(str) :pure lt_s w(int64) r(str) r(str) :pure le_s w(int64) r(str) r(str) :pure cmp_s w(int64) r(str) r(str) :pure eqat_s w(int64) r(str) r(str) r(int64) :pure eqatic_s w(int64) r(str) r(str) r(int64) :pure haveat_s w(int64) r(str) r(int64) r(int64) r(str) r(int64) :pure concat_s w(str) r(str) r(str) :pure repeat_s w(str) r(str) r(int64) :pure substr_s w(str) r(str) r(int64) r(int64) :pure index_s w(int64) r(str) r(str) r(int64) :pure graphs_s w(int64) r(str) :pure codes_s w(int64) r(str) :pure getcp_s w(int64) r(str) r(int64) :pure indexcp_s w(int64) r(str) r(int64) :pure uc w(str) r(str) :pure lc w(str) r(str) :pure tc w(str) r(str) :pure split w(obj) r(str) r(str) :pure join w(str) r(str) r(obj) :pure getcpbyname w(int64) r(str) :pure indexat r(str) r(int64) str ins indexnat r(str) r(int64) str ins unipropcode w(int64) r(str) :pure unipvalcode w(int64) r(int64) r(str) :pure hasuniprop w(int64) r(str) r(int64) r(int64) r(int64) :pure hasunipropc w(int64) r(str) r(int64) int16 int16 :pure chars w(int64) r(str) :pure chr w(str) r(int64) :pure ordfirst w(int64) r(str) :pure ordat w(int64) r(str) r(int64) :pure rindexfrom w(int64) r(str) r(str) r(int64) :pure escape w(str) r(str) :pure flip w(str) r(str) :pure flattenropes r(str) iscclass w(int64) r(int64) r(str) r(int64) :pure findcclass w(int64) r(int64) r(str) r(int64) r(int64) :pure findnotcclass w(int64) r(int64) r(str) r(int64) r(int64) :pure nfafromstatelist w(obj) r(obj) r(obj) nfarunproto w(obj) r(obj) r(str) r(int64) nfarunalt r(obj) r(str) r(int64) r(obj) r(obj) r(obj) radix w(obj) r(int64) r(str) r(int64) r(int64) encode w(obj) r(str) r(str) r(obj) decode w(str) r(obj) r(str) istrue_s w(int64) r(str) :pure isfalse_s w(int64) r(str) :pure null w(obj) :pure isnull w(int64) r(obj) :pure ifnonnull r(obj) ins findmeth w(obj) r(obj) str :pure :invokish findmeth_s w(obj) r(obj) r(str) :pure :invokish can w(int64) r(obj) str :pure :invokish can_s w(int64) r(obj) r(str) :pure :invokish create w(obj) r(obj) :pure clone w(obj) r(obj) :pure isconcrete w(int64) r(obj) :pure rebless w(obj) r(obj) r(obj) istype w(int64) r(obj) r(obj) :pure :invokish objprimspec w(int64) r(obj) :pure gethow w(obj) r(obj) :pure getwhat w(obj) r(obj) :pure getwho w(obj) r(obj) :pure setwho w(obj) r(obj) r(obj) reprname w(str) r(obj) :pure getwhere w(int64) r(obj) :pure eqaddr w(int64) r(obj) r(obj) :pure bindattr_i r(obj) r(obj) str r(int64) int16 bindattr_n r(obj) r(obj) str r(num64) int16 bindattr_s r(obj) r(obj) str r(str) int16 bindattr_o r(obj) r(obj) str r(obj) int16 bindattrs_i r(obj) r(obj) r(str) r(int64) bindattrs_n r(obj) r(obj) r(str) r(num64) bindattrs_s r(obj) r(obj) r(str) r(str) bindattrs_o r(obj) r(obj) r(str) r(obj) getattr_i w(int64) r(obj) r(obj) str int16 getattr_n w(num64) r(obj) r(obj) str int16 getattr_s w(str) r(obj) r(obj) str int16 getattr_o w(obj) r(obj) r(obj) str int16 :deoptonepoint getattrs_i w(int64) r(obj) r(obj) r(str) getattrs_n w(num64) r(obj) r(obj) r(str) getattrs_s w(str) r(obj) r(obj) r(str) getattrs_o w(obj) r(obj) r(obj) r(str) :deoptonepoint attrinited w(int64) r(obj) r(obj) r(str) box_i w(obj) r(int64) r(obj) :pure box_n w(obj) r(num64) r(obj) :pure box_s w(obj) r(str) r(obj) :pure unbox_i w(int64) r(obj) :pure unbox_n w(num64) r(obj) :pure unbox_s w(str) r(obj) :pure atpos_i w(int64) r(obj) r(int64) atpos_n w(num64) r(obj) r(int64) atpos_s w(str) r(obj) r(int64) atpos_o w(obj) r(obj) r(int64) bindpos_i r(obj) r(int64) r(int64) bindpos_n r(obj) r(int64) r(num64) bindpos_s r(obj) r(int64) r(str) bindpos_o r(obj) r(int64) r(obj) push_i r(obj) r(int64) push_n r(obj) r(num64) push_s r(obj) r(str) push_o r(obj) r(obj) pop_i w(int64) r(obj) pop_n w(num64) r(obj) pop_s w(str) r(obj) pop_o w(obj) r(obj) shift_i w(int64) r(obj) shift_n w(num64) r(obj) shift_s w(str) r(obj) shift_o w(obj) r(obj) unshift_i r(obj) r(int64) unshift_n r(obj) r(num64) unshift_s r(obj) r(str) unshift_o r(obj) r(obj) splice r(obj) r(obj) r(int64) r(int64) setelemspos r(obj) r(int64) existspos w(int64) r(obj) r(int64) :pure atkey_i w(int64) r(obj) r(str) atkey_n w(num64) r(obj) r(str) atkey_s w(str) r(obj) r(str) atkey_o w(obj) r(obj) r(str) bindkey_i r(obj) r(str) r(int64) bindkey_n r(obj) r(str) r(num64) bindkey_s r(obj) r(str) r(str) bindkey_o r(obj) r(str) r(obj) existskey w(int64) r(obj) r(str) :pure deletekey r(obj) r(str) elems w(int64) r(obj) :pure knowhow w(obj) :pure knowhowattr w(obj) :pure newtype w(obj) r(obj) r(str) composetype w(obj) r(obj) r(obj) setmethcache r(obj) r(obj) setmethcacheauth r(obj) r(int64) settypecache r(obj) r(obj) settypecheckmode r(obj) r(int64) setboolspec r(obj) r(int64) r(obj) istrue w(int64) r(obj) :invokish isfalse w(int64) r(obj) :invokish bootint w(obj) :pure bootnum w(obj) :pure bootstr w(obj) :pure bootarray w(obj) :pure bootintarray w(obj) :pure bootnumarray w(obj) :pure bootstrarray w(obj) :pure boothash w(obj) :pure isint w(int64) r(obj) :pure isnum w(int64) r(obj) :pure isstr w(int64) r(obj) :pure islist w(int64) r(obj) :pure ishash w(int64) r(obj) :pure sethllconfig r(str) r(obj) hllboxtype_i w(obj) :pure hllboxtype_n w(obj) :pure hllboxtype_s w(obj) :pure hlllist w(obj) :pure hllhash w(obj) :pure getcomp w(obj) r(str) :pure bindcomp w(obj) r(str) r(obj) getcurhllsym w(obj) r(str) :pure bindcurhllsym w(obj) r(str) r(obj) gethllsym w(obj) r(str) r(str) :pure bindhllsym r(str) r(str) r(obj) settypehll r(obj) r(str) settypehllrole r(obj) r(int64) hllize w(obj) r(obj) :pure :invokish hllizefor w(obj) r(obj) r(str) :pure :invokish usecompileehllconfig usecompilerhllconfig iter w(obj) r(obj) :pure iterkey_s w(str) r(obj) :pure iterval w(obj) r(obj) :pure getcodename w(str) r(obj) :pure iscoderef w(int64) r(obj) :pure getcodeobj w(obj) r(obj) :pure setcodeobj r(obj) r(obj) setcodename r(obj) r(str) forceouterctx r(obj) r(obj) setinvokespec r(obj) r(obj) r(str) r(obj) isinvokable w(int64) r(obj) :pure freshcoderef w(obj) r(obj) markcodestatic r(obj) markcodestub r(obj) getstaticcode w(obj) r(obj) :pure getcodecuid w(str) r(obj) :pure setdispatcher r(obj) takedispatcher w(obj) assign r(obj) r(obj) :invokish assignunchecked r(obj) r(obj) :invokish iscont w(int64) r(obj) :pure decont w(obj) r(obj) :pure :invokish setcontspec r(obj) r(str) r(obj) sha1 w(str) r(str) :pure createsc w(obj) r(str) scsetobj r(obj) r(int64) r(obj) scsetcode r(obj) r(int64) r(obj) scgetobj w(obj) r(obj) r(int64) scgethandle w(str) r(obj) scgetobjidx w(int64) r(obj) r(obj) scsetdesc r(obj) r(str) scobjcount w(int64) r(obj) setobjsc r(obj) r(obj) getobjsc w(obj) r(obj) serialize w(str) r(obj) r(obj) deserialize r(str) r(obj) r(obj) r(obj) r(obj) wval w(obj) int16 int16 :pure wval_wide w(obj) int16 int64 :pure scwbdisable w(int64) scwbenable w(int64) pushcompsc r(obj) popcompsc w(obj) scgetdesc w(str) r(obj) loadbytecode w(str) r(str) masttofile r(obj) r(obj) r(str) masttocu w(obj) r(obj) r(obj) iscompunit w(int64) r(obj) :pure compunitmainline w(obj) r(obj) compunitcodes w(obj) r(obj) ctx w(obj) :noinline ctxouter w(obj) r(obj) ctxcaller w(obj) r(obj) ctxlexpad w(obj) r(obj) curcode w(obj) :noinline callercode w(obj) :noinline add_I w(obj) r(obj) r(obj) r(obj) :pure sub_I w(obj) r(obj) r(obj) r(obj) :pure mul_I w(obj) r(obj) r(obj) r(obj) :pure div_I w(obj) r(obj) r(obj) r(obj) :pure mod_I w(obj) r(obj) r(obj) r(obj) :pure neg_I w(obj) r(obj) r(obj) :pure abs_I w(obj) r(obj) r(obj) :pure cmp_I w(int64) r(obj) r(obj) :pure eq_I w(int64) r(obj) r(obj) :pure ne_I w(int64) r(obj) r(obj) :pure lt_I w(int64) r(obj) r(obj) :pure le_I w(int64) r(obj) r(obj) :pure gt_I w(int64) r(obj) r(obj) :pure ge_I w(int64) r(obj) r(obj) :pure bor_I w(obj) r(obj) r(obj) r(obj) :pure bxor_I w(obj) r(obj) r(obj) r(obj) :pure band_I w(obj) r(obj) r(obj) r(obj) :pure bnot_I w(obj) r(obj) r(obj) :pure blshift_I w(obj) r(obj) r(int64) r(obj) :pure brshift_I w(obj) r(obj) r(int64) r(obj) :pure pow_I w(obj) r(obj) r(obj) r(obj) r(obj) :pure gcd_I w(obj) r(obj) r(obj) r(obj) :pure lcm_I w(obj) r(obj) r(obj) r(obj) :pure expmod_I w(obj) r(obj) r(obj) r(obj) r(obj) :pure isprime_I w(int64) r(obj) r(int64) :pure rand_I w(obj) r(obj) r(obj) :pure coerce_In w(num64) r(obj) :pure coerce_Is w(str) r(obj) :pure coerce_nI w(obj) r(num64) r(obj) :pure coerce_sI w(obj) r(str) r(obj) :pure isbig_I w(int64) r(obj) :pure bool_I w(int64) r(obj) :pure base_I w(str) r(obj) r(int64) :pure radix_I w(obj) r(int64) r(str) r(int64) r(int64) r(obj) :pure div_In w(num64) r(obj) r(obj) :pure copy_f r(str) r(str) append_f r(str) r(str) rename_f r(str) r(str) delete_f r(str) chmod_f r(str) r(int64) exists_f w(int64) r(str) mkdir r(str) r(int64) rmdir r(str) open_dir w(obj) r(str) read_dir w(str) r(obj) close_dir r(obj) open_fh w(obj) r(str) r(str) close_fh r(obj) read_fhs w(str) r(obj) r(int64) slurp w(str) r(str) r(str) spew r(str) r(str) r(str) write_fhs w(int64) r(obj) r(str) seek_fh r(obj) r(int64) r(int64) lock_fh w(int64) r(obj) r(int64) unlock_fh r(obj) sync_fh r(obj) trunc_fh r(obj) r(int64) eof_fh w(int64) r(obj) getstdin w(obj) :pure getstdout w(obj) :pure getstderr w(obj) :pure connect_sk r(obj) r(str) r(int64) socket w(obj) r(int64) bind_sk r(obj) r(str) r(int64) setinputlinesep_fh r(obj) r(str) accept_sk w(obj) r(obj) decodetocodes r(obj) r(str) r(int64) r(obj) encodefromcodes r(obj) r(str) r(obj) setencoding r(obj) r(str) print r(str) say r(str) readall_fh w(str) r(obj) tell_fh w(int64) r(obj) stat w(int64) r(str) r(int64) readline_fh w(str) r(obj) readlineint_fh w(str) r(obj) r(str) chdir r(str) srand r(int64) rand_i w(int64) rand_n w(num64) time_i w(int64) sleep r(num64) newthread w(obj) r(obj) r(int64) threadjoin r(obj) time_n w(num64) exit r(int64) shell w(int64) r(str) r(str) r(obj) r(obj) r(obj) r(obj) r(int64) cwd w(str) clargs w(obj) getenvhash w(obj) loadlib r(str) r(str) freelib r(str) findsym w(obj) r(str) r(str) dropsym r(obj) loadext r(str) r(str) backendconfig w(obj) getlexouter w(obj) r(str) :pure :noinline getlexrel w(obj) r(obj) r(str) :pure getlexreldyn w(obj) r(obj) r(str) :pure getlexrelcaller w(obj) r(obj) r(str) :pure getlexcaller w(obj) r(str) :pure bitand_s w(str) r(str) r(str) :pure bitor_s w(str) r(str) r(str) :pure bitxor_s w(str) r(str) r(str) :pure isnanorinf w(int64) r(num64) :pure inf w(num64) :pure neginf w(num64) :pure nan w(num64) :pure getpid w(int64) :pure spawn w(int64) r(obj) r(str) r(obj) r(obj) r(obj) r(obj) r(int64) filereadable w(int64) r(str) filewritable w(int64) r(str) fileexecutable w(int64) r(str) say_fhs w(int64) r(obj) r(str) capturenamedshash w(obj) r(obj) :pure read_fhb r(obj) r(obj) r(int64) write_fhb r(obj) r(obj) replace w(str) r(str) r(int64) r(int64) r(str) newexception w(obj) DEPRECATED_0 w(obj) backtrace w(obj) r(obj) symlink r(str) r(str) link r(str) r(str) gethostname w(str) exreturnafterunwind r(obj) continuationclone w(obj) r(obj) continuationreset w(obj) r(obj) r(obj) :invokish # this op isn't actually invokish, but it requires the cur_op to be set before doing its work continuationcontrol w(obj) r(int64) r(obj) r(obj) :invokish continuationinvoke w(obj) r(obj) r(obj) randscale_n w(num64) r(num64) :pure uniisblock w(int64) r(str) r(int64) r(str) :pure assertparamcheck r(int64) :noinline :invokish hintfor w(int64) r(obj) r(str) paramnamesused :noinline getuniname w(str) r(int64) getuniprop_int w(int64) r(int64) r(int64) getuniprop_bool w(int64) r(int64) r(int64) getuniprop_str w(str) r(int64) r(int64) matchuniprop w(int64) r(int64) r(int64) r(int64) nativecallbuild r(obj) r(str) r(str) r(str) r(obj) r(obj) nativecallinvoke w(obj) r(obj) r(obj) r(obj) nativecallrefresh r(obj) threadrun r(obj) threadid w(int64) r(obj) threadyield currentthread w(obj) lock r(obj) unlock r(obj) semacquire r(obj) semtryacquire w(int64) r(obj) semrelease r(obj) getlockcondvar w(obj) r(obj) r(obj) condwait r(obj) condsignalone r(obj) condsignalall r(obj) queuepoll w(obj) r(obj) setmultispec r(obj) r(obj) r(str) r(str) ctxouterskipthunks w(obj) r(obj) :noinline ctxcallerskipthunks w(obj) r(obj) :noinline timer w(obj) r(obj) r(obj) r(int64) r(int64) r(obj) cancel r(obj) signal w(obj) r(obj) r(obj) r(int64) r(obj) watchfile w(obj) r(obj) r(obj) r(str) r(obj) asyncconnect w(obj) r(obj) r(obj) r(str) r(int64) r(obj) asynclisten w(obj) r(obj) r(obj) r(str) r(int64) r(obj) asyncwritestr w(obj) r(obj) r(obj) r(obj) r(str) r(obj) asyncwritebytes w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) asyncreadchars w(obj) r(obj) r(obj) r(obj) r(obj) asyncreadbytes w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) getlexstatic_o w(obj) r(str) :pure :noinline getlexperinvtype_o w(obj) r(str) :pure :noinline execname w(str) const_i64_16 w(int64) int16 :pure const_i64_32 w(int64) int32 :pure isnonnull w(int64) r(obj) :pure param_rn2_i w(int64) str str :noinline param_rn2_n w(num64) str str :noinline param_rn2_s w(str) str str :noinline param_rn2_o w(obj) str str :noinline param_on2_i w(int64) str str ins :noinline param_on2_n w(num64) str str ins :noinline param_on2_s w(str) str str ins :noinline param_on2_o w(obj) str str ins :noinline osrpoint :osrpoint nativecallcast w(obj) r(obj) r(obj) r(obj) spawnprocasync w(obj) r(obj) r(obj) r(str) r(obj) r(obj) killprocasync r(obj) r(int64) startprofile r(obj) endprofile w(obj) objectid w(int64) r(obj) settypefinalize r(obj) r(int64) force_gc nativecallglobal w(obj) r(str) r(str) r(obj) r(obj) close_fhi w(int64) r(obj) setparameterizer r(obj) r(obj) parameterizetype w(obj) r(obj) r(obj) typeparameterized w(obj) r(obj) typeparameters w(obj) r(obj) typeparameterat w(obj) r(obj) r(int64) readlink w(str) r(str) lstat w(int64) r(str) r(int64) iscont_i w(int64) r(obj) :pure iscont_n w(int64) r(obj) :pure iscont_s w(int64) r(obj) :pure assign_i r(obj) r(int64) :invokish assign_n r(obj) r(num64) :invokish assign_s r(obj) r(str) :invokish decont_i w(int64) r(obj) :pure :invokish decont_n w(num64) r(obj) :pure :invokish decont_s w(str) r(obj) :pure :invokish getregref_i w(obj) r(int64) :pure :noinline getregref_n w(obj) r(num64) :pure :noinline getregref_s w(obj) r(str) :pure :noinline getlexref_i w(obj) rl(int64) :pure :noinline getlexref_n w(obj) rl(num64) :pure :noinline getlexref_s w(obj) rl(str) :pure :noinline getlexref_ni w(obj) str :pure :noinline getlexref_nn w(obj) str :pure :noinline getlexref_ns w(obj) str :pure :noinline atposref_i w(obj) r(obj) r(int64) :pure atposref_n w(obj) r(obj) r(int64) :pure atposref_s w(obj) r(obj) r(int64) :pure getattrref_i w(obj) r(obj) r(obj) str int16 :pure getattrref_n w(obj) r(obj) r(obj) str int16 :pure getattrref_s w(obj) r(obj) r(obj) str int16 :pure getattrsref_i w(obj) r(obj) r(obj) r(str) :pure getattrsref_n w(obj) r(obj) r(obj) r(str) :pure getattrsref_s w(obj) r(obj) r(obj) r(str) :pure nativecallsizeof w(int64) r(obj) encodenorm r(str) r(str) r(int64) r(obj) normalizecodes r(obj) r(int64) r(obj) strfromcodes w(str) r(obj) strtocodes r(str) r(int64) r(obj) getcodelocation w(obj) r(obj) :pure eqatim_s w(int64) r(str) r(str) r(int64) :pure ordbaseat w(int64) r(str) r(int64) :pure neverrepossess r(obj) scdisclaim r(obj) syncpipe w(obj) atpos2d_i w(int64) r(obj) r(int64) r(int64) :pure atpos2d_n w(num64) r(obj) r(int64) r(int64) :pure atpos2d_s w(str) r(obj) r(int64) r(int64) :pure atpos2d_o w(obj) r(obj) r(int64) r(int64) :pure atpos3d_i w(int64) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_n w(num64) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_s w(str) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_o w(obj) r(obj) r(int64) r(int64) r(int64) :pure atposnd_i w(int64) r(obj) r(obj) :pure atposnd_n w(num64) r(obj) r(obj) :pure atposnd_s w(str) r(obj) r(obj) :pure atposnd_o w(obj) r(obj) r(obj) :pure bindpos2d_i r(obj) r(int64) r(int64) r(int64) bindpos2d_n r(obj) r(int64) r(int64) r(num64) bindpos2d_s r(obj) r(int64) r(int64) r(str) bindpos2d_o r(obj) r(int64) r(int64) r(obj) bindpos3d_i r(obj) r(int64) r(int64) r(int64) r(int64) bindpos3d_n r(obj) r(int64) r(int64) r(int64) r(num64) bindpos3d_s r(obj) r(int64) r(int64) r(int64) r(str) bindpos3d_o r(obj) r(int64) r(int64) r(int64) r(obj) bindposnd_i r(obj) r(obj) r(int64) bindposnd_n r(obj) r(obj) r(num64) bindposnd_s r(obj) r(obj) r(str) bindposnd_o r(obj) r(obj) r(obj) dimensions w(obj) r(obj) setdimensions r(obj) r(obj) numdimensions w(int64) r(obj) ctxcode w(obj) r(obj) isrwcont w(int64) r(obj) fc w(str) r(str) :pure setinputlineseps_fh r(obj) r(obj) readlinechomp_fh w(str) r(obj) encoderep w(obj) r(str) r(str) r(str) r(obj) istty_fh w(int64) r(obj) :pure # Spesh ops. Naming convention: start with sp_. Must all be marked .s, which # is how the validator knows to exclude them. # Used for logging what objects we saw during execution, which is used to do # speculative optimizations. sp_log .s r(obj) int16 # If we're doing OSR, the logging phase replaces the osrpoint with this op, to # trigger the finalization of the optimization process once we do enough loops # to gather logging information. sp_osrfinalize .s # Guard operations. Trigger de-optimization if the guard is violated. # guardconc = guard on concrete type; index is spesh slot with type # guardtype = guard on type object; index is spesh slot with type # guardcontconc = guard on container holding concrete type; indexes are # spesh slots with container type and then value type # guardconttype = guard on container holding type object; indexes are # spesh slots with container type and then value type # guardrwconc = guard on rw container holding concrete type; indexes are # spesh slots with container type and then value type # guardrwtype = guard on rw container holding type object; indexes are # spesh slots with container type and then value type sp_guardconc .s r(obj) sslot sp_guardtype .s r(obj) sslot sp_guardcontconc .s r(obj) sslot sslot sp_guardconttype .s r(obj) sslot sslot sp_guardrwconc .s r(obj) sslot sslot sp_guardrwtype .s r(obj) sslot sslot # Following are for fast, unchecked grabbing of args from the arg buffer. sp_getarg_o .s w(obj) int16 :pure sp_getarg_i .s w(obj) int16 :pure sp_getarg_n .s w(obj) int16 :pure sp_getarg_s .s w(obj) int16 :pure # Fast invocation. sp_fastinvoke_v .s r(obj) int16 sp_fastinvoke_i .s w(int64) r(obj) int16 sp_fastinvoke_n .s w(num64) r(obj) int16 sp_fastinvoke_s .s w(str) r(obj) int16 sp_fastinvoke_o .s w(obj) r(obj) int16 # Marking named params used. sp_namedarg_used .s int16 # Look up a spesh slot. sp_getspeshslot .s w(obj) sslot :pure # Find method, using spesh slot and the one after it as a cache. # Isn't marked invokish, since the check is implemented directly sp_findmeth .s w(obj) r(obj) str sslot :pure # Create an object with the first int16's number of bytes size and then # set its STable to the STable in the spesh slot. sp_fastcreate .s w(obj) int16 sslot :pure # Retrieve or store a value by pointer offset. sp_get_o .s w(obj) r(obj) int16 :pure sp_get_i64 .s w(int64) r(obj) int16 :pure sp_get_i32 .s w(int64) r(obj) int16 :pure sp_get_i16 .s w(int64) r(obj) int16 :pure sp_get_i8 .s w(int64) r(obj) int16 :pure sp_get_n .s w(num64) r(obj) int16 :pure sp_get_s .s w(str) r(obj) int16 :pure sp_bind_o .s r(obj) int16 r(obj) sp_bind_i64 .s r(obj) int16 r(int64) sp_bind_i32 .s r(obj) int16 r(int64) sp_bind_i16 .s r(obj) int16 r(int64) sp_bind_i8 .s r(obj) int16 r(int64) sp_bind_n .s r(obj) int16 r(num64) sp_bind_s .s r(obj) int16 r(str) # Same as above, but for p6opaques, handling the NULL sentinel and the # real_data thing for mixins. The vt variant vivifies a NULL with a # type object; the vc does it with a clone. sp_p6oget_o .s w(obj) r(obj) int16 :pure sp_p6ogetvt_o .s w(obj) r(obj) int16 sslot sp_p6ogetvc_o .s w(obj) r(obj) int16 sslot sp_p6oget_i .s w(int64) r(obj) int16 :pure sp_p6oget_n .s w(num64) r(obj) int16 :pure sp_p6oget_s .s w(str) r(obj) int16 :pure sp_p6obind_o .s r(obj) int16 r(obj) sp_p6obind_i .s r(obj) int16 r(int64) sp_p6obind_n .s r(obj) int16 r(num64) sp_p6obind_s .s r(obj) int16 r(str) # Enter the JIT sp_jit_enter .s w(obj) # we boolify iter objects all the time, but we have no op for it. until now! sp_boolify_iter .s w(int64) r(obj) :pure sp_boolify_iter_arr .s w(int64) r(obj) :pure sp_boolify_iter_hash .s w(int64) r(obj) :pure # Profiler recording ops. Naming convention: start with prof_. Must all be # marked .s, which is how the validator knows to exclude them. (For that # purpose, we treat them as a kind of spesh op). # Entry of various forms. The inline one passes along the static frame of the # inlinee. prof_enter .s prof_enterspesh .s prof_enterinline .s sslot prof_enternative .s r(obj) # Normal exit (exception throw and unwind is handled separately). Will always # be what we last entered, so no need for separate versions like above. prof_exit # Recording of allocated types (may not give full picture of allocations, but # is at least enough to get a picture). prof_allocated .s r(obj) # Cross-thread write analysis logging instruction. ctw_check .s r(obj) int16 MoarVM-2015.11/src/core/ops.c0000644000175000017500000053447112623370227014556 0ustar jnthnjnthn#include "moar.h" /* This file is generated from src/core/oplist by tools/update_ops.p6. */ static const MVMOpInfo MVM_op_infos[] = { { MVM_OP_no_op, "no_op", " ", 0, 0, 0, 0, 0, }, { MVM_OP_const_i8, "const_i8", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int8, MVM_operand_int8 } }, { MVM_OP_const_i16, "const_i16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_const_i32, "const_i32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int32, MVM_operand_int32 } }, { MVM_OP_const_i64, "const_i64", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int64 } }, { MVM_OP_const_n32, "const_n32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num32, MVM_operand_num32 } }, { MVM_OP_const_n64, "const_n64", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_num64 } }, { MVM_OP_const_s, "const_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_set, "set", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_read_reg | MVM_operand_type_var } }, { MVM_OP_extend_u8, "extend_u8", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int8 } }, { MVM_OP_extend_u16, "extend_u16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_extend_u32, "extend_u32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int32 } }, { MVM_OP_extend_i8, "extend_i8", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int8 } }, { MVM_OP_extend_i16, "extend_i16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_extend_i32, "extend_i32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int32 } }, { MVM_OP_trunc_u8, "trunc_u8", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int8, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_u16, "trunc_u16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_u32, "trunc_u32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int32, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_i8, "trunc_i8", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int8, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_i16, "trunc_i16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_i32, "trunc_i32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int32, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_extend_n32, "extend_n32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num32 } }, { MVM_OP_trunc_n32, "trunc_n32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num32, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_goto, "goto", ".j", 1, 0, 0, 0, 0, { MVM_operand_ins } }, { MVM_OP_if_i, "if_i", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64, MVM_operand_ins } }, { MVM_OP_unless_i, "unless_i", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64, MVM_operand_ins } }, { MVM_OP_if_n, "if_n", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64, MVM_operand_ins } }, { MVM_OP_unless_n, "unless_n", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64, MVM_operand_ins } }, { MVM_OP_if_s, "if_s", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unless_s, "unless_s", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_if_s0, "if_s0", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unless_s0, "unless_s0", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_if_o, "if_o", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_unless_o, "unless_o", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_jumplist, "jumplist", ":j", 2, 0, 0, 0, 0, { MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getlex, "getlex", " ", 2, 1, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_read_lex | MVM_operand_type_var } }, { MVM_OP_bindlex, "bindlex", " ", 2, 0, 0, 0, 0, { MVM_operand_write_lex | MVM_operand_type_var, MVM_operand_read_reg | MVM_operand_type_var } }, { MVM_OP_getlex_ni, "getlex_ni", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str } }, { MVM_OP_getlex_nn, "getlex_nn", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str } }, { MVM_OP_getlex_ns, "getlex_ns", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_getlex_no, "getlex_no", " ", 2, 1, 1, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_bindlex_ni, "bindlex_ni", " ", 2, 0, 0, 1, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindlex_nn, "bindlex_nn", " ", 2, 0, 0, 1, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindlex_ns, "bindlex_ns", " ", 2, 0, 0, 1, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindlex_no, "bindlex_no", " ", 2, 0, 0, 1, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlex_ng, "getlex_ng", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindlex_ng, "bindlex_ng", " ", 2, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getdynlex, "getdynlex", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_binddynlex, "binddynlex", " ", 2, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setlexvalue, "setlexvalue", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_lexprimspec, "lexprimspec", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_return_i, "return_i", ".r", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_return_n, "return_n", ".r", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_return_s, "return_s", ".r", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_return_o, "return_o", ".r", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_return, "return", ".r", 0, 0, 0, 0, 0, }, { MVM_OP_eq_i, "eq_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ne_i, "ne_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lt_i, "lt_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_le_i, "le_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_gt_i, "gt_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ge_i, "ge_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_cmp_i, "cmp_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_add_i, "add_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sub_i, "sub_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_mul_i, "mul_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_div_i, "div_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_div_u, "div_u", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_mod_i, "mod_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_mod_u, "mod_u", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_neg_i, "neg_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_abs_i, "abs_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_inc_i, "inc_i", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_inc_u, "inc_u", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_dec_i, "dec_i", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_dec_u, "dec_u", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_band_i, "band_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bor_i, "bor_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bxor_i, "bxor_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bnot_i, "bnot_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_blshift_i, "blshift_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_brshift_i, "brshift_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_pow_i, "pow_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_not_i, "not_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_gcd_i, "gcd_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lcm_i, "lcm_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eq_n, "eq_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ne_n, "ne_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_lt_n, "lt_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_le_n, "le_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_gt_n, "gt_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ge_n, "ge_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cmp_n, "cmp_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_add_n, "add_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sub_n, "sub_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_mul_n, "mul_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_div_n, "div_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_mod_n, "mod_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_neg_n, "neg_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_abs_n, "abs_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_pow_n, "pow_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ceil_n, "ceil_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_floor_n, "floor_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sin_n, "sin_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_asin_n, "asin_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cos_n, "cos_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_acos_n, "acos_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_tan_n, "tan_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_atan_n, "atan_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_atan2_n, "atan2_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sec_n, "sec_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_asec_n, "asec_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sinh_n, "sinh_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cosh_n, "cosh_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_tanh_n, "tanh_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sech_n, "sech_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sqrt_n, "sqrt_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_log_n, "log_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_exp_n, "exp_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_in, "coerce_in", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_coerce_ni, "coerce_ni", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_is, "coerce_is", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_coerce_ns, "coerce_ns", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_si, "coerce_si", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_coerce_sn, "coerce_sn", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_smrt_numify, "smrt_numify", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_smrt_strify, "smrt_strify", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prepargs, "prepargs", "+a", 1, 0, 0, 0, 0, { MVM_operand_callsite } }, { MVM_OP_arg_i, "arg_i", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_arg_n, "arg_n", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_arg_s, "arg_s", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_arg_o, "arg_o", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_argconst_i, "argconst_i", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_int64 } }, { MVM_OP_argconst_n, "argconst_n", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_num64 } }, { MVM_OP_argconst_s, "argconst_s", "*a", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_str } }, { MVM_OP_invoke_v, "invoke_v", "-a", 1, 0, 2, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_i, "invoke_i", "-a", 2, 0, 2, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_n, "invoke_n", "-a", 2, 0, 2, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_s, "invoke_s", "-a", 2, 0, 2, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_o, "invoke_o", "-a", 2, 0, 3, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_checkarity, "checkarity", " ", 2, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_param_rp_i, "param_rp_i", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_param_rp_n, "param_rp_n", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_int16 } }, { MVM_OP_param_rp_s, "param_rp_s", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_param_rp_o, "param_rp_o", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_param_op_i, "param_op_i", " ", 3, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_n, "param_op_n", " ", 3, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_s, "param_op_s", " ", 3, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_o, "param_op_o", " ", 3, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_rn_i, "param_rn_i", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str } }, { MVM_OP_param_rn_n, "param_rn_n", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str } }, { MVM_OP_param_rn_s, "param_rn_s", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn_o, "param_rn_o", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_param_on_i, "param_on_i", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_n, "param_on_n", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_s, "param_on_s", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_o, "param_on_o", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_sp, "param_sp", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_param_sn, "param_sn", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getcode, "getcode", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_coderef } }, { MVM_OP_caller, "caller", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_capturelex, "capturelex", " ", 1, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takeclosure, "takeclosure", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_exception, "exception", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bindexmessage, "bindexmessage", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindexpayload, "bindexpayload", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindexcategory, "bindexcategory", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getexmessage, "getexmessage", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getexpayload, "getexpayload", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getexcategory, "getexcategory", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwdyn, "throwdyn", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwlex, "throwlex", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwlexotic, "throwlexotic", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwcatdyn, "throwcatdyn", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_throwcatlex, "throwcatlex", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_throwcatlexotic, "throwcatlexotic", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_die, "die", " ", 2, 0, 0, 0, 2, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_rethrow, "rethrow", " ", 1, 0, 0, 0, 2, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_resume, "resume", " ", 1, 0, 0, 0, 2, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takehandlerresult, "takehandlerresult", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_newlexotic, "newlexotic", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_lexoticresult, "lexoticresult", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_backtracestrings, "backtracestrings", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_usecapture, "usecapture", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_savecapture, "savecapture", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_captureposelems, "captureposelems", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_captureposarg, "captureposarg", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_i, "captureposarg_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_n, "captureposarg_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_s, "captureposarg_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposprimspec, "captureposprimspec", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureexistsnamed, "captureexistsnamed", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_capturehasnameds, "capturehasnameds", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invokewithcapture, "invokewithcapture", " ", 3, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multicacheadd, "multicacheadd", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multicachefind, "multicachefind", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_null_s, "null_s", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_isnull_s, "isnull_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_eq_s, "eq_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ne_s, "ne_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_gt_s, "gt_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ge_s, "ge_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lt_s, "lt_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_le_s, "le_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_cmp_s, "cmp_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_eqat_s, "eqat_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eqatic_s, "eqatic_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_haveat_s, "haveat_s", " ", 6, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_concat_s, "concat_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_repeat_s, "repeat_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_substr_s, "substr_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_index_s, "index_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_graphs_s, "graphs_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_codes_s, "codes_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getcp_s, "getcp_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_indexcp_s, "indexcp_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_uc, "uc", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lc, "lc", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_tc, "tc", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_split, "split", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_join, "join", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcpbyname, "getcpbyname", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_indexat, "indexat", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_indexnat, "indexnat", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unipropcode, "unipropcode", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_unipvalcode, "unipvalcode", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_hasuniprop, "hasuniprop", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hasunipropc, "hasunipropc", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_chars, "chars", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chr, "chr", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ordfirst, "ordfirst", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ordat, "ordat", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rindexfrom, "rindexfrom", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_escape, "escape", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_flip, "flip", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_flattenropes, "flattenropes", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_iscclass, "iscclass", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_findcclass, "findcclass", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_findnotcclass, "findnotcclass", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nfafromstatelist, "nfafromstatelist", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nfarunproto, "nfarunproto", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nfarunalt, "nfarunalt", " ", 6, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_radix, "radix", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_encode, "encode", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decode, "decode", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_istrue_s, "istrue_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_isfalse_s, "isfalse_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_null, "null", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_isnull, "isnull", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ifnonnull, "ifnonnull", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_findmeth, "findmeth", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_findmeth_s, "findmeth_s", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_can, "can", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_can_s, "can_s", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_create, "create", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_clone, "clone", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isconcrete, "isconcrete", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_rebless, "rebless", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istype, "istype", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_objprimspec, "objprimspec", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gethow, "gethow", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwhat, "getwhat", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwho, "getwho", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setwho, "setwho", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_reprname, "reprname", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwhere, "getwhere", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eqaddr, "eqaddr", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindattr_i, "bindattr_i", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_bindattr_n, "bindattr_n", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_int16 } }, { MVM_OP_bindattr_s, "bindattr_s", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_bindattr_o, "bindattr_o", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_bindattrs_i, "bindattrs_i", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindattrs_n, "bindattrs_n", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindattrs_s, "bindattrs_s", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindattrs_o, "bindattrs_o", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getattr_i, "getattr_i", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_n, "getattr_n", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_s, "getattr_s", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_o, "getattr_o", " ", 5, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrs_i, "getattrs_i", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_n, "getattrs_n", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_s, "getattrs_s", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_o, "getattrs_o", " ", 4, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_attrinited, "attrinited", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_box_i, "box_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_box_n, "box_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_box_s, "box_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_i, "unbox_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_n, "unbox_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_s, "unbox_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atpos_i, "atpos_i", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_n, "atpos_n", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_s, "atpos_s", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_o, "atpos_o", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos_i, "bindpos_i", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos_n, "bindpos_n", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos_s, "bindpos_s", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos_o, "bindpos_o", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_push_i, "push_i", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_push_n, "push_n", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_push_s, "push_s", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_push_o, "push_o", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_i, "pop_i", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_n, "pop_n", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_s, "pop_s", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_o, "pop_o", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_i, "shift_i", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_n, "shift_n", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_s, "shift_s", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_o, "shift_o", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unshift_i, "unshift_i", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_unshift_n, "unshift_n", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_unshift_s, "unshift_s", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_unshift_o, "unshift_o", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_splice, "splice", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setelemspos, "setelemspos", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_existspos, "existspos", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atkey_i, "atkey_i", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_n, "atkey_n", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_s, "atkey_s", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_o, "atkey_o", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindkey_i, "bindkey_i", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindkey_n, "bindkey_n", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindkey_s, "bindkey_s", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindkey_o, "bindkey_o", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_existskey, "existskey", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_deletekey, "deletekey", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_elems, "elems", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_knowhow, "knowhow", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_knowhowattr, "knowhowattr", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_newtype, "newtype", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_composetype, "composetype", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmethcache, "setmethcache", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmethcacheauth, "setmethcacheauth", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_settypecache, "settypecache", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypecheckmode, "settypecheckmode", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setboolspec, "setboolspec", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istrue, "istrue", " ", 2, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isfalse, "isfalse", " ", 2, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bootint, "bootint", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootnum, "bootnum", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootstr, "bootstr", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootarray, "bootarray", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootintarray, "bootintarray", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootnumarray, "bootnumarray", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootstrarray, "bootstrarray", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_boothash, "boothash", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_isint, "isint", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isnum, "isnum", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isstr, "isstr", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_islist, "islist", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ishash, "ishash", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sethllconfig, "sethllconfig", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_i, "hllboxtype_i", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_n, "hllboxtype_n", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_s, "hllboxtype_s", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hlllist, "hlllist", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllhash, "hllhash", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getcomp, "getcomp", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindcomp, "bindcomp", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcurhllsym, "getcurhllsym", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindcurhllsym, "bindcurhllsym", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gethllsym, "gethllsym", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindhllsym, "bindhllsym", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypehll, "settypehll", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_settypehllrole, "settypehllrole", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hllize, "hllize", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_hllizefor, "hllizefor", " ", 3, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_usecompileehllconfig, "usecompileehllconfig", " ", 0, 0, 0, 0, 0, }, { MVM_OP_usecompilerhllconfig, "usecompilerhllconfig", " ", 0, 0, 0, 0, 0, }, { MVM_OP_iter, "iter", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iterkey_s, "iterkey_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iterval, "iterval", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodename, "getcodename", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscoderef, "iscoderef", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodeobj, "getcodeobj", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcodeobj, "setcodeobj", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcodename, "setcodename", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_forceouterctx, "forceouterctx", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setinvokespec, "setinvokespec", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isinvokable, "isinvokable", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_freshcoderef, "freshcoderef", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_markcodestatic, "markcodestatic", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_markcodestub, "markcodestub", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getstaticcode, "getstaticcode", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodecuid, "getcodecuid", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setdispatcher, "setdispatcher", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takedispatcher, "takedispatcher", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_assign, "assign", " ", 2, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_assignunchecked, "assignunchecked", " ", 2, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont, "iscont", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont, "decont", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcontspec, "setcontspec", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sha1, "sha1", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_createsc, "createsc", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_scsetobj, "scsetobj", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scsetcode, "scsetcode", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scgetobj, "scgetobj", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_scgethandle, "scgethandle", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scgetobjidx, "scgetobjidx", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scsetdesc, "scsetdesc", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_scobjcount, "scobjcount", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setobjsc, "setobjsc", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getobjsc, "getobjsc", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_serialize, "serialize", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_deserialize, "deserialize", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_wval, "wval", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_wval_wide, "wval_wide", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_int64 } }, { MVM_OP_scwbdisable, "scwbdisable", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_scwbenable, "scwbenable", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_pushcompsc, "pushcompsc", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_popcompsc, "popcompsc", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_scgetdesc, "scgetdesc", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_loadbytecode, "loadbytecode", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_masttofile, "masttofile", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_masttocu, "masttocu", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscompunit, "iscompunit", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_compunitmainline, "compunitmainline", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_compunitcodes, "compunitcodes", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctx, "ctx", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_ctxouter, "ctxouter", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcaller, "ctxcaller", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxlexpad, "ctxlexpad", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_curcode, "curcode", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_callercode, "callercode", " ", 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_add_I, "add_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sub_I, "sub_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_mul_I, "mul_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_div_I, "div_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_mod_I, "mod_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_neg_I, "neg_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_abs_I, "abs_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cmp_I, "cmp_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eq_I, "eq_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ne_I, "ne_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_lt_I, "lt_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_le_I, "le_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gt_I, "gt_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ge_I, "ge_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bor_I, "bor_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bxor_I, "bxor_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_band_I, "band_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bnot_I, "bnot_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_blshift_I, "blshift_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_brshift_I, "brshift_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pow_I, "pow_I", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gcd_I, "gcd_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_lcm_I, "lcm_I", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_expmod_I, "expmod_I", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isprime_I, "isprime_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rand_I, "rand_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_In, "coerce_In", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_Is, "coerce_Is", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_nI, "coerce_nI", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_sI, "coerce_sI", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isbig_I, "isbig_I", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bool_I, "bool_I", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_base_I, "base_I", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_radix_I, "radix_I", " ", 6, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_div_In, "div_In", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_copy_f, "copy_f", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_append_f, "append_f", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_rename_f, "rename_f", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_delete_f, "delete_f", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chmod_f, "chmod_f", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_exists_f, "exists_f", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_mkdir, "mkdir", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rmdir, "rmdir", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_open_dir, "open_dir", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_read_dir, "read_dir", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_close_dir, "close_dir", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_open_fh, "open_fh", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_close_fh, "close_fh", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_read_fhs, "read_fhs", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_slurp, "slurp", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_spew, "spew", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_write_fhs, "write_fhs", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_seek_fh, "seek_fh", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lock_fh, "lock_fh", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_unlock_fh, "unlock_fh", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sync_fh, "sync_fh", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_trunc_fh, "trunc_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eof_fh, "eof_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getstdin, "getstdin", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getstdout, "getstdout", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getstderr, "getstderr", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_connect_sk, "connect_sk", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_socket, "socket", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bind_sk, "bind_sk", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setinputlinesep_fh, "setinputlinesep_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_accept_sk, "accept_sk", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodetocodes, "decodetocodes", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encodefromcodes, "encodefromcodes", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setencoding, "setencoding", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_print, "print", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_say, "say", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_readall_fh, "readall_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_tell_fh, "tell_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_stat, "stat", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_readline_fh, "readline_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_readlineint_fh, "readlineint_fh", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chdir, "chdir", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_srand, "srand", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rand_i, "rand_i", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_rand_n, "rand_n", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_time_i, "time_i", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_sleep, "sleep", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_newthread, "newthread", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_threadjoin, "threadjoin", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_time_n, "time_n", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_exit, "exit", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_shell, "shell", " ", 8, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_cwd, "cwd", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_clargs, "clargs", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getenvhash, "getenvhash", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_loadlib, "loadlib", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_freelib, "freelib", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_findsym, "findsym", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_dropsym, "dropsym", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_loadext, "loadext", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_backendconfig, "backendconfig", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getlexouter, "getlexouter", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexrel, "getlexrel", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexreldyn, "getlexreldyn", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexrelcaller, "getlexrelcaller", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexcaller, "getlexcaller", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitand_s, "bitand_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitor_s, "bitor_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitxor_s, "bitxor_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_isnanorinf, "isnanorinf", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_inf, "inf", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_neginf, "neginf", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_nan, "nan", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_getpid, "getpid", " ", 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_spawn, "spawn", " ", 8, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_filereadable, "filereadable", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_filewritable, "filewritable", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_fileexecutable, "fileexecutable", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_say_fhs, "say_fhs", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_capturenamedshash, "capturenamedshash", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_read_fhb, "read_fhb", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_write_fhb, "write_fhb", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_replace, "replace", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_newexception, "newexception", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_0, "DEPRECATED_0", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_backtrace, "backtrace", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_symlink, "symlink", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_link, "link", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_gethostname, "gethostname", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_exreturnafterunwind, "exreturnafterunwind", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationclone, "continuationclone", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationreset, "continuationreset", " ", 3, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationcontrol, "continuationcontrol", " ", 4, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationinvoke, "continuationinvoke", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_randscale_n, "randscale_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_uniisblock, "uniisblock", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_assertparamcheck, "assertparamcheck", " ", 1, 0, 0, 1, 1, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hintfor, "hintfor", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_paramnamesused, "paramnamesused", " ", 0, 0, 0, 1, 0, }, { MVM_OP_getuniname, "getuniname", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_int, "getuniprop_int", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_bool, "getuniprop_bool", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_str, "getuniprop_str", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_matchuniprop, "matchuniprop", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nativecallbuild, "nativecallbuild", " ", 6, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativecallinvoke, "nativecallinvoke", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativecallrefresh, "nativecallrefresh", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadrun, "threadrun", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadid, "threadid", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadyield, "threadyield", " ", 0, 0, 0, 0, 0, }, { MVM_OP_currentthread, "currentthread", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_lock, "lock", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unlock, "unlock", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semacquire, "semacquire", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semtryacquire, "semtryacquire", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semrelease, "semrelease", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlockcondvar, "getlockcondvar", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condwait, "condwait", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condsignalone, "condsignalone", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condsignalall, "condsignalall", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_queuepoll, "queuepoll", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmultispec, "setmultispec", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ctxouterskipthunks, "ctxouterskipthunks", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcallerskipthunks, "ctxcallerskipthunks", " ", 2, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_timer, "timer", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cancel, "cancel", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_signal, "signal", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_watchfile, "watchfile", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncconnect, "asyncconnect", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asynclisten, "asynclisten", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncwritestr, "asyncwritestr", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncwritebytes, "asyncwritebytes", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncreadchars, "asyncreadchars", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncreadbytes, "asyncreadbytes", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlexstatic_o, "getlexstatic_o", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexperinvtype_o, "getlexperinvtype_o", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_execname, "execname", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_const_i64_16, "const_i64_16", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_const_i64_32, "const_i64_32", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int32 } }, { MVM_OP_isnonnull, "isnonnull", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_param_rn2_i, "param_rn2_i", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_n, "param_rn2_n", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_s, "param_rn2_s", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_o, "param_rn2_o", " ", 3, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_on2_i, "param_on2_i", " ", 4, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_n, "param_on2_n", " ", 4, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_s, "param_on2_s", " ", 4, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_o, "param_on2_o", " ", 4, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_osrpoint, "osrpoint", " ", 0, 0, 4, 0, 0, }, { MVM_OP_nativecallcast, "nativecallcast", " ", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_spawnprocasync, "spawnprocasync", " ", 6, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_killprocasync, "killprocasync", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_startprofile, "startprofile", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_endprofile, "endprofile", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_objectid, "objectid", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypefinalize, "settypefinalize", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_force_gc, "force_gc", " ", 0, 0, 0, 0, 0, }, { MVM_OP_nativecallglobal, "nativecallglobal", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_close_fhi, "close_fhi", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setparameterizer, "setparameterizer", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_parameterizetype, "parameterizetype", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameterized, "typeparameterized", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameters, "typeparameters", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameterat, "typeparameterat", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_readlink, "readlink", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lstat, "lstat", " ", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_iscont_i, "iscont_i", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont_n, "iscont_n", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont_s, "iscont_s", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_assign_i, "assign_i", " ", 2, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_assign_n, "assign_n", " ", 2, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_assign_s, "assign_s", " ", 2, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_decont_i, "decont_i", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont_n, "decont_n", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont_s, "decont_s", " ", 2, 1, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getregref_i, "getregref_i", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getregref_n, "getregref_n", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_getregref_s, "getregref_s", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexref_i, "getlexref_i", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_int64 } }, { MVM_OP_getlexref_n, "getlexref_n", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_num64 } }, { MVM_OP_getlexref_s, "getlexref_s", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_str } }, { MVM_OP_getlexref_ni, "getlexref_ni", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_getlexref_nn, "getlexref_nn", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_getlexref_ns, "getlexref_ns", " ", 2, 1, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_atposref_i, "atposref_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposref_n, "atposref_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposref_s, "atposref_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getattrref_i, "getattrref_i", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrref_n, "getattrref_n", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrref_s, "getattrref_s", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrsref_i, "getattrsref_i", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrsref_n, "getattrsref_n", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrsref_s, "getattrsref_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_nativecallsizeof, "nativecallsizeof", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encodenorm, "encodenorm", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_normalizecodes, "normalizecodes", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_strfromcodes, "strfromcodes", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_strtocodes, "strtocodes", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodelocation, "getcodelocation", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eqatim_s, "eqatim_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ordbaseat, "ordbaseat", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_neverrepossess, "neverrepossess", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scdisclaim, "scdisclaim", " ", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_syncpipe, "syncpipe", " ", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_atpos2d_i, "atpos2d_i", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_n, "atpos2d_n", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_s, "atpos2d_s", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_o, "atpos2d_o", " ", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_i, "atpos3d_i", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_n, "atpos3d_n", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_s, "atpos3d_s", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_o, "atpos3d_o", " ", 5, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposnd_i, "atposnd_i", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_n, "atposnd_n", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_s, "atposnd_s", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_o, "atposnd_o", " ", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindpos2d_i, "bindpos2d_i", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos2d_n, "bindpos2d_n", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos2d_s, "bindpos2d_s", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos2d_o, "bindpos2d_o", " ", 4, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindpos3d_i, "bindpos3d_i", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos3d_n, "bindpos3d_n", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos3d_s, "bindpos3d_s", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos3d_o, "bindpos3d_o", " ", 5, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindposnd_i, "bindposnd_i", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindposnd_n, "bindposnd_n", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindposnd_s, "bindposnd_s", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindposnd_o, "bindposnd_o", " ", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_dimensions, "dimensions", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setdimensions, "setdimensions", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_numdimensions, "numdimensions", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcode, "ctxcode", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isrwcont, "isrwcont", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_fc, "fc", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_setinputlineseps_fh, "setinputlineseps_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_readlinechomp_fh, "readlinechomp_fh", " ", 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encoderep, "encoderep", " ", 5, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istty_fh, "istty_fh", " ", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_log, "sp_log", ".s", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_osrfinalize, "sp_osrfinalize", ".s", 0, 0, 0, 0, 0, }, { MVM_OP_sp_guardconc, "sp_guardconc", ".s", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot } }, { MVM_OP_sp_guardtype, "sp_guardtype", ".s", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot } }, { MVM_OP_sp_guardcontconc, "sp_guardcontconc", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_spesh_slot } }, { MVM_OP_sp_guardconttype, "sp_guardconttype", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_spesh_slot } }, { MVM_OP_sp_guardrwconc, "sp_guardrwconc", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_spesh_slot } }, { MVM_OP_sp_guardrwtype, "sp_guardrwtype", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_spesh_slot } }, { MVM_OP_sp_getarg_o, "sp_getarg_o", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_i, "sp_getarg_i", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_n, "sp_getarg_n", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_s, "sp_getarg_s", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_v, "sp_fastinvoke_v", ".s", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_i, "sp_fastinvoke_i", ".s", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_n, "sp_fastinvoke_n", ".s", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_s, "sp_fastinvoke_s", ".s", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_o, "sp_fastinvoke_o", ".s", 3, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_namedarg_used, "sp_namedarg_used", ".s", 1, 0, 0, 0, 0, { MVM_operand_int16 } }, { MVM_OP_sp_getspeshslot, "sp_getspeshslot", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_spesh_slot } }, { MVM_OP_sp_findmeth, "sp_findmeth", ".s", 4, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_spesh_slot } }, { MVM_OP_sp_fastcreate, "sp_fastcreate", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_get_o, "sp_get_o", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i64, "sp_get_i64", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i32, "sp_get_i32", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i16, "sp_get_i16", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i8, "sp_get_i8", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_n, "sp_get_n", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_s, "sp_get_s", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_bind_o, "sp_bind_o", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_bind_i64, "sp_bind_i64", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i32, "sp_bind_i32", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i16, "sp_bind_i16", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i8, "sp_bind_i8", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_n, "sp_bind_n", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sp_bind_s, "sp_bind_s", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_sp_p6oget_o, "sp_p6oget_o", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6ogetvt_o, "sp_p6ogetvt_o", ".s", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_p6ogetvc_o, "sp_p6ogetvc_o", ".s", 4, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_p6oget_i, "sp_p6oget_i", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6oget_n, "sp_p6oget_n", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6oget_s, "sp_p6oget_s", ".s", 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6obind_o, "sp_p6obind_o", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_p6obind_i, "sp_p6obind_i", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_p6obind_n, "sp_p6obind_n", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sp_p6obind_s, "sp_p6obind_s", ".s", 3, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_sp_jit_enter, "sp_jit_enter", ".s", 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter, "sp_boolify_iter", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter_arr, "sp_boolify_iter_arr", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter_hash, "sp_boolify_iter_hash", ".s", 2, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prof_enter, "prof_enter", ".s", 0, 0, 0, 0, 0, }, { MVM_OP_prof_enterspesh, "prof_enterspesh", ".s", 0, 0, 0, 0, 0, }, { MVM_OP_prof_enterinline, "prof_enterinline", ".s", 1, 0, 0, 0, 0, { MVM_operand_spesh_slot } }, { MVM_OP_prof_enternative, "prof_enternative", ".s", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prof_exit, "prof_exit", " ", 0, 0, 0, 0, 0, }, { MVM_OP_prof_allocated, "prof_allocated", ".s", 1, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctw_check, "ctw_check", ".s", 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, }; static const unsigned short MVM_op_counts = 754; MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op) { if (op >= MVM_op_counts) return NULL; return &MVM_op_infos[op]; } MoarVM-2015.11/src/core/ops.h0000644000175000017500000005302212623370227014547 0ustar jnthnjnthn/* This file is generated from src/core/oplist by tools/update_ops.p6. */ /* Op name defines. */ #define MVM_OP_no_op 0 #define MVM_OP_const_i8 1 #define MVM_OP_const_i16 2 #define MVM_OP_const_i32 3 #define MVM_OP_const_i64 4 #define MVM_OP_const_n32 5 #define MVM_OP_const_n64 6 #define MVM_OP_const_s 7 #define MVM_OP_set 8 #define MVM_OP_extend_u8 9 #define MVM_OP_extend_u16 10 #define MVM_OP_extend_u32 11 #define MVM_OP_extend_i8 12 #define MVM_OP_extend_i16 13 #define MVM_OP_extend_i32 14 #define MVM_OP_trunc_u8 15 #define MVM_OP_trunc_u16 16 #define MVM_OP_trunc_u32 17 #define MVM_OP_trunc_i8 18 #define MVM_OP_trunc_i16 19 #define MVM_OP_trunc_i32 20 #define MVM_OP_extend_n32 21 #define MVM_OP_trunc_n32 22 #define MVM_OP_goto 23 #define MVM_OP_if_i 24 #define MVM_OP_unless_i 25 #define MVM_OP_if_n 26 #define MVM_OP_unless_n 27 #define MVM_OP_if_s 28 #define MVM_OP_unless_s 29 #define MVM_OP_if_s0 30 #define MVM_OP_unless_s0 31 #define MVM_OP_if_o 32 #define MVM_OP_unless_o 33 #define MVM_OP_jumplist 34 #define MVM_OP_getlex 35 #define MVM_OP_bindlex 36 #define MVM_OP_getlex_ni 37 #define MVM_OP_getlex_nn 38 #define MVM_OP_getlex_ns 39 #define MVM_OP_getlex_no 40 #define MVM_OP_bindlex_ni 41 #define MVM_OP_bindlex_nn 42 #define MVM_OP_bindlex_ns 43 #define MVM_OP_bindlex_no 44 #define MVM_OP_getlex_ng 45 #define MVM_OP_bindlex_ng 46 #define MVM_OP_getdynlex 47 #define MVM_OP_binddynlex 48 #define MVM_OP_setlexvalue 49 #define MVM_OP_lexprimspec 50 #define MVM_OP_return_i 51 #define MVM_OP_return_n 52 #define MVM_OP_return_s 53 #define MVM_OP_return_o 54 #define MVM_OP_return 55 #define MVM_OP_eq_i 56 #define MVM_OP_ne_i 57 #define MVM_OP_lt_i 58 #define MVM_OP_le_i 59 #define MVM_OP_gt_i 60 #define MVM_OP_ge_i 61 #define MVM_OP_cmp_i 62 #define MVM_OP_add_i 63 #define MVM_OP_sub_i 64 #define MVM_OP_mul_i 65 #define MVM_OP_div_i 66 #define MVM_OP_div_u 67 #define MVM_OP_mod_i 68 #define MVM_OP_mod_u 69 #define MVM_OP_neg_i 70 #define MVM_OP_abs_i 71 #define MVM_OP_inc_i 72 #define MVM_OP_inc_u 73 #define MVM_OP_dec_i 74 #define MVM_OP_dec_u 75 #define MVM_OP_band_i 76 #define MVM_OP_bor_i 77 #define MVM_OP_bxor_i 78 #define MVM_OP_bnot_i 79 #define MVM_OP_blshift_i 80 #define MVM_OP_brshift_i 81 #define MVM_OP_pow_i 82 #define MVM_OP_not_i 83 #define MVM_OP_gcd_i 84 #define MVM_OP_lcm_i 85 #define MVM_OP_eq_n 86 #define MVM_OP_ne_n 87 #define MVM_OP_lt_n 88 #define MVM_OP_le_n 89 #define MVM_OP_gt_n 90 #define MVM_OP_ge_n 91 #define MVM_OP_cmp_n 92 #define MVM_OP_add_n 93 #define MVM_OP_sub_n 94 #define MVM_OP_mul_n 95 #define MVM_OP_div_n 96 #define MVM_OP_mod_n 97 #define MVM_OP_neg_n 98 #define MVM_OP_abs_n 99 #define MVM_OP_pow_n 100 #define MVM_OP_ceil_n 101 #define MVM_OP_floor_n 102 #define MVM_OP_sin_n 103 #define MVM_OP_asin_n 104 #define MVM_OP_cos_n 105 #define MVM_OP_acos_n 106 #define MVM_OP_tan_n 107 #define MVM_OP_atan_n 108 #define MVM_OP_atan2_n 109 #define MVM_OP_sec_n 110 #define MVM_OP_asec_n 111 #define MVM_OP_sinh_n 112 #define MVM_OP_cosh_n 113 #define MVM_OP_tanh_n 114 #define MVM_OP_sech_n 115 #define MVM_OP_sqrt_n 116 #define MVM_OP_log_n 117 #define MVM_OP_exp_n 118 #define MVM_OP_coerce_in 119 #define MVM_OP_coerce_ni 120 #define MVM_OP_coerce_is 121 #define MVM_OP_coerce_ns 122 #define MVM_OP_coerce_si 123 #define MVM_OP_coerce_sn 124 #define MVM_OP_smrt_numify 125 #define MVM_OP_smrt_strify 126 #define MVM_OP_prepargs 127 #define MVM_OP_arg_i 128 #define MVM_OP_arg_n 129 #define MVM_OP_arg_s 130 #define MVM_OP_arg_o 131 #define MVM_OP_argconst_i 132 #define MVM_OP_argconst_n 133 #define MVM_OP_argconst_s 134 #define MVM_OP_invoke_v 135 #define MVM_OP_invoke_i 136 #define MVM_OP_invoke_n 137 #define MVM_OP_invoke_s 138 #define MVM_OP_invoke_o 139 #define MVM_OP_checkarity 140 #define MVM_OP_param_rp_i 141 #define MVM_OP_param_rp_n 142 #define MVM_OP_param_rp_s 143 #define MVM_OP_param_rp_o 144 #define MVM_OP_param_op_i 145 #define MVM_OP_param_op_n 146 #define MVM_OP_param_op_s 147 #define MVM_OP_param_op_o 148 #define MVM_OP_param_rn_i 149 #define MVM_OP_param_rn_n 150 #define MVM_OP_param_rn_s 151 #define MVM_OP_param_rn_o 152 #define MVM_OP_param_on_i 153 #define MVM_OP_param_on_n 154 #define MVM_OP_param_on_s 155 #define MVM_OP_param_on_o 156 #define MVM_OP_param_sp 157 #define MVM_OP_param_sn 158 #define MVM_OP_getcode 159 #define MVM_OP_caller 160 #define MVM_OP_capturelex 161 #define MVM_OP_takeclosure 162 #define MVM_OP_exception 163 #define MVM_OP_bindexmessage 164 #define MVM_OP_bindexpayload 165 #define MVM_OP_bindexcategory 166 #define MVM_OP_getexmessage 167 #define MVM_OP_getexpayload 168 #define MVM_OP_getexcategory 169 #define MVM_OP_throwdyn 170 #define MVM_OP_throwlex 171 #define MVM_OP_throwlexotic 172 #define MVM_OP_throwcatdyn 173 #define MVM_OP_throwcatlex 174 #define MVM_OP_throwcatlexotic 175 #define MVM_OP_die 176 #define MVM_OP_rethrow 177 #define MVM_OP_resume 178 #define MVM_OP_takehandlerresult 179 #define MVM_OP_newlexotic 180 #define MVM_OP_lexoticresult 181 #define MVM_OP_backtracestrings 182 #define MVM_OP_usecapture 183 #define MVM_OP_savecapture 184 #define MVM_OP_captureposelems 185 #define MVM_OP_captureposarg 186 #define MVM_OP_captureposarg_i 187 #define MVM_OP_captureposarg_n 188 #define MVM_OP_captureposarg_s 189 #define MVM_OP_captureposprimspec 190 #define MVM_OP_captureexistsnamed 191 #define MVM_OP_capturehasnameds 192 #define MVM_OP_invokewithcapture 193 #define MVM_OP_multicacheadd 194 #define MVM_OP_multicachefind 195 #define MVM_OP_null_s 196 #define MVM_OP_isnull_s 197 #define MVM_OP_eq_s 198 #define MVM_OP_ne_s 199 #define MVM_OP_gt_s 200 #define MVM_OP_ge_s 201 #define MVM_OP_lt_s 202 #define MVM_OP_le_s 203 #define MVM_OP_cmp_s 204 #define MVM_OP_eqat_s 205 #define MVM_OP_eqatic_s 206 #define MVM_OP_haveat_s 207 #define MVM_OP_concat_s 208 #define MVM_OP_repeat_s 209 #define MVM_OP_substr_s 210 #define MVM_OP_index_s 211 #define MVM_OP_graphs_s 212 #define MVM_OP_codes_s 213 #define MVM_OP_getcp_s 214 #define MVM_OP_indexcp_s 215 #define MVM_OP_uc 216 #define MVM_OP_lc 217 #define MVM_OP_tc 218 #define MVM_OP_split 219 #define MVM_OP_join 220 #define MVM_OP_getcpbyname 221 #define MVM_OP_indexat 222 #define MVM_OP_indexnat 223 #define MVM_OP_unipropcode 224 #define MVM_OP_unipvalcode 225 #define MVM_OP_hasuniprop 226 #define MVM_OP_hasunipropc 227 #define MVM_OP_chars 228 #define MVM_OP_chr 229 #define MVM_OP_ordfirst 230 #define MVM_OP_ordat 231 #define MVM_OP_rindexfrom 232 #define MVM_OP_escape 233 #define MVM_OP_flip 234 #define MVM_OP_flattenropes 235 #define MVM_OP_iscclass 236 #define MVM_OP_findcclass 237 #define MVM_OP_findnotcclass 238 #define MVM_OP_nfafromstatelist 239 #define MVM_OP_nfarunproto 240 #define MVM_OP_nfarunalt 241 #define MVM_OP_radix 242 #define MVM_OP_encode 243 #define MVM_OP_decode 244 #define MVM_OP_istrue_s 245 #define MVM_OP_isfalse_s 246 #define MVM_OP_null 247 #define MVM_OP_isnull 248 #define MVM_OP_ifnonnull 249 #define MVM_OP_findmeth 250 #define MVM_OP_findmeth_s 251 #define MVM_OP_can 252 #define MVM_OP_can_s 253 #define MVM_OP_create 254 #define MVM_OP_clone 255 #define MVM_OP_isconcrete 256 #define MVM_OP_rebless 257 #define MVM_OP_istype 258 #define MVM_OP_objprimspec 259 #define MVM_OP_gethow 260 #define MVM_OP_getwhat 261 #define MVM_OP_getwho 262 #define MVM_OP_setwho 263 #define MVM_OP_reprname 264 #define MVM_OP_getwhere 265 #define MVM_OP_eqaddr 266 #define MVM_OP_bindattr_i 267 #define MVM_OP_bindattr_n 268 #define MVM_OP_bindattr_s 269 #define MVM_OP_bindattr_o 270 #define MVM_OP_bindattrs_i 271 #define MVM_OP_bindattrs_n 272 #define MVM_OP_bindattrs_s 273 #define MVM_OP_bindattrs_o 274 #define MVM_OP_getattr_i 275 #define MVM_OP_getattr_n 276 #define MVM_OP_getattr_s 277 #define MVM_OP_getattr_o 278 #define MVM_OP_getattrs_i 279 #define MVM_OP_getattrs_n 280 #define MVM_OP_getattrs_s 281 #define MVM_OP_getattrs_o 282 #define MVM_OP_attrinited 283 #define MVM_OP_box_i 284 #define MVM_OP_box_n 285 #define MVM_OP_box_s 286 #define MVM_OP_unbox_i 287 #define MVM_OP_unbox_n 288 #define MVM_OP_unbox_s 289 #define MVM_OP_atpos_i 290 #define MVM_OP_atpos_n 291 #define MVM_OP_atpos_s 292 #define MVM_OP_atpos_o 293 #define MVM_OP_bindpos_i 294 #define MVM_OP_bindpos_n 295 #define MVM_OP_bindpos_s 296 #define MVM_OP_bindpos_o 297 #define MVM_OP_push_i 298 #define MVM_OP_push_n 299 #define MVM_OP_push_s 300 #define MVM_OP_push_o 301 #define MVM_OP_pop_i 302 #define MVM_OP_pop_n 303 #define MVM_OP_pop_s 304 #define MVM_OP_pop_o 305 #define MVM_OP_shift_i 306 #define MVM_OP_shift_n 307 #define MVM_OP_shift_s 308 #define MVM_OP_shift_o 309 #define MVM_OP_unshift_i 310 #define MVM_OP_unshift_n 311 #define MVM_OP_unshift_s 312 #define MVM_OP_unshift_o 313 #define MVM_OP_splice 314 #define MVM_OP_setelemspos 315 #define MVM_OP_existspos 316 #define MVM_OP_atkey_i 317 #define MVM_OP_atkey_n 318 #define MVM_OP_atkey_s 319 #define MVM_OP_atkey_o 320 #define MVM_OP_bindkey_i 321 #define MVM_OP_bindkey_n 322 #define MVM_OP_bindkey_s 323 #define MVM_OP_bindkey_o 324 #define MVM_OP_existskey 325 #define MVM_OP_deletekey 326 #define MVM_OP_elems 327 #define MVM_OP_knowhow 328 #define MVM_OP_knowhowattr 329 #define MVM_OP_newtype 330 #define MVM_OP_composetype 331 #define MVM_OP_setmethcache 332 #define MVM_OP_setmethcacheauth 333 #define MVM_OP_settypecache 334 #define MVM_OP_settypecheckmode 335 #define MVM_OP_setboolspec 336 #define MVM_OP_istrue 337 #define MVM_OP_isfalse 338 #define MVM_OP_bootint 339 #define MVM_OP_bootnum 340 #define MVM_OP_bootstr 341 #define MVM_OP_bootarray 342 #define MVM_OP_bootintarray 343 #define MVM_OP_bootnumarray 344 #define MVM_OP_bootstrarray 345 #define MVM_OP_boothash 346 #define MVM_OP_isint 347 #define MVM_OP_isnum 348 #define MVM_OP_isstr 349 #define MVM_OP_islist 350 #define MVM_OP_ishash 351 #define MVM_OP_sethllconfig 352 #define MVM_OP_hllboxtype_i 353 #define MVM_OP_hllboxtype_n 354 #define MVM_OP_hllboxtype_s 355 #define MVM_OP_hlllist 356 #define MVM_OP_hllhash 357 #define MVM_OP_getcomp 358 #define MVM_OP_bindcomp 359 #define MVM_OP_getcurhllsym 360 #define MVM_OP_bindcurhllsym 361 #define MVM_OP_gethllsym 362 #define MVM_OP_bindhllsym 363 #define MVM_OP_settypehll 364 #define MVM_OP_settypehllrole 365 #define MVM_OP_hllize 366 #define MVM_OP_hllizefor 367 #define MVM_OP_usecompileehllconfig 368 #define MVM_OP_usecompilerhllconfig 369 #define MVM_OP_iter 370 #define MVM_OP_iterkey_s 371 #define MVM_OP_iterval 372 #define MVM_OP_getcodename 373 #define MVM_OP_iscoderef 374 #define MVM_OP_getcodeobj 375 #define MVM_OP_setcodeobj 376 #define MVM_OP_setcodename 377 #define MVM_OP_forceouterctx 378 #define MVM_OP_setinvokespec 379 #define MVM_OP_isinvokable 380 #define MVM_OP_freshcoderef 381 #define MVM_OP_markcodestatic 382 #define MVM_OP_markcodestub 383 #define MVM_OP_getstaticcode 384 #define MVM_OP_getcodecuid 385 #define MVM_OP_setdispatcher 386 #define MVM_OP_takedispatcher 387 #define MVM_OP_assign 388 #define MVM_OP_assignunchecked 389 #define MVM_OP_iscont 390 #define MVM_OP_decont 391 #define MVM_OP_setcontspec 392 #define MVM_OP_sha1 393 #define MVM_OP_createsc 394 #define MVM_OP_scsetobj 395 #define MVM_OP_scsetcode 396 #define MVM_OP_scgetobj 397 #define MVM_OP_scgethandle 398 #define MVM_OP_scgetobjidx 399 #define MVM_OP_scsetdesc 400 #define MVM_OP_scobjcount 401 #define MVM_OP_setobjsc 402 #define MVM_OP_getobjsc 403 #define MVM_OP_serialize 404 #define MVM_OP_deserialize 405 #define MVM_OP_wval 406 #define MVM_OP_wval_wide 407 #define MVM_OP_scwbdisable 408 #define MVM_OP_scwbenable 409 #define MVM_OP_pushcompsc 410 #define MVM_OP_popcompsc 411 #define MVM_OP_scgetdesc 412 #define MVM_OP_loadbytecode 413 #define MVM_OP_masttofile 414 #define MVM_OP_masttocu 415 #define MVM_OP_iscompunit 416 #define MVM_OP_compunitmainline 417 #define MVM_OP_compunitcodes 418 #define MVM_OP_ctx 419 #define MVM_OP_ctxouter 420 #define MVM_OP_ctxcaller 421 #define MVM_OP_ctxlexpad 422 #define MVM_OP_curcode 423 #define MVM_OP_callercode 424 #define MVM_OP_add_I 425 #define MVM_OP_sub_I 426 #define MVM_OP_mul_I 427 #define MVM_OP_div_I 428 #define MVM_OP_mod_I 429 #define MVM_OP_neg_I 430 #define MVM_OP_abs_I 431 #define MVM_OP_cmp_I 432 #define MVM_OP_eq_I 433 #define MVM_OP_ne_I 434 #define MVM_OP_lt_I 435 #define MVM_OP_le_I 436 #define MVM_OP_gt_I 437 #define MVM_OP_ge_I 438 #define MVM_OP_bor_I 439 #define MVM_OP_bxor_I 440 #define MVM_OP_band_I 441 #define MVM_OP_bnot_I 442 #define MVM_OP_blshift_I 443 #define MVM_OP_brshift_I 444 #define MVM_OP_pow_I 445 #define MVM_OP_gcd_I 446 #define MVM_OP_lcm_I 447 #define MVM_OP_expmod_I 448 #define MVM_OP_isprime_I 449 #define MVM_OP_rand_I 450 #define MVM_OP_coerce_In 451 #define MVM_OP_coerce_Is 452 #define MVM_OP_coerce_nI 453 #define MVM_OP_coerce_sI 454 #define MVM_OP_isbig_I 455 #define MVM_OP_bool_I 456 #define MVM_OP_base_I 457 #define MVM_OP_radix_I 458 #define MVM_OP_div_In 459 #define MVM_OP_copy_f 460 #define MVM_OP_append_f 461 #define MVM_OP_rename_f 462 #define MVM_OP_delete_f 463 #define MVM_OP_chmod_f 464 #define MVM_OP_exists_f 465 #define MVM_OP_mkdir 466 #define MVM_OP_rmdir 467 #define MVM_OP_open_dir 468 #define MVM_OP_read_dir 469 #define MVM_OP_close_dir 470 #define MVM_OP_open_fh 471 #define MVM_OP_close_fh 472 #define MVM_OP_read_fhs 473 #define MVM_OP_slurp 474 #define MVM_OP_spew 475 #define MVM_OP_write_fhs 476 #define MVM_OP_seek_fh 477 #define MVM_OP_lock_fh 478 #define MVM_OP_unlock_fh 479 #define MVM_OP_sync_fh 480 #define MVM_OP_trunc_fh 481 #define MVM_OP_eof_fh 482 #define MVM_OP_getstdin 483 #define MVM_OP_getstdout 484 #define MVM_OP_getstderr 485 #define MVM_OP_connect_sk 486 #define MVM_OP_socket 487 #define MVM_OP_bind_sk 488 #define MVM_OP_setinputlinesep_fh 489 #define MVM_OP_accept_sk 490 #define MVM_OP_decodetocodes 491 #define MVM_OP_encodefromcodes 492 #define MVM_OP_setencoding 493 #define MVM_OP_print 494 #define MVM_OP_say 495 #define MVM_OP_readall_fh 496 #define MVM_OP_tell_fh 497 #define MVM_OP_stat 498 #define MVM_OP_readline_fh 499 #define MVM_OP_readlineint_fh 500 #define MVM_OP_chdir 501 #define MVM_OP_srand 502 #define MVM_OP_rand_i 503 #define MVM_OP_rand_n 504 #define MVM_OP_time_i 505 #define MVM_OP_sleep 506 #define MVM_OP_newthread 507 #define MVM_OP_threadjoin 508 #define MVM_OP_time_n 509 #define MVM_OP_exit 510 #define MVM_OP_shell 511 #define MVM_OP_cwd 512 #define MVM_OP_clargs 513 #define MVM_OP_getenvhash 514 #define MVM_OP_loadlib 515 #define MVM_OP_freelib 516 #define MVM_OP_findsym 517 #define MVM_OP_dropsym 518 #define MVM_OP_loadext 519 #define MVM_OP_backendconfig 520 #define MVM_OP_getlexouter 521 #define MVM_OP_getlexrel 522 #define MVM_OP_getlexreldyn 523 #define MVM_OP_getlexrelcaller 524 #define MVM_OP_getlexcaller 525 #define MVM_OP_bitand_s 526 #define MVM_OP_bitor_s 527 #define MVM_OP_bitxor_s 528 #define MVM_OP_isnanorinf 529 #define MVM_OP_inf 530 #define MVM_OP_neginf 531 #define MVM_OP_nan 532 #define MVM_OP_getpid 533 #define MVM_OP_spawn 534 #define MVM_OP_filereadable 535 #define MVM_OP_filewritable 536 #define MVM_OP_fileexecutable 537 #define MVM_OP_say_fhs 538 #define MVM_OP_capturenamedshash 539 #define MVM_OP_read_fhb 540 #define MVM_OP_write_fhb 541 #define MVM_OP_replace 542 #define MVM_OP_newexception 543 #define MVM_OP_DEPRECATED_0 544 #define MVM_OP_backtrace 545 #define MVM_OP_symlink 546 #define MVM_OP_link 547 #define MVM_OP_gethostname 548 #define MVM_OP_exreturnafterunwind 549 #define MVM_OP_continuationclone 550 #define MVM_OP_continuationreset 551 #define MVM_OP_continuationcontrol 552 #define MVM_OP_continuationinvoke 553 #define MVM_OP_randscale_n 554 #define MVM_OP_uniisblock 555 #define MVM_OP_assertparamcheck 556 #define MVM_OP_hintfor 557 #define MVM_OP_paramnamesused 558 #define MVM_OP_getuniname 559 #define MVM_OP_getuniprop_int 560 #define MVM_OP_getuniprop_bool 561 #define MVM_OP_getuniprop_str 562 #define MVM_OP_matchuniprop 563 #define MVM_OP_nativecallbuild 564 #define MVM_OP_nativecallinvoke 565 #define MVM_OP_nativecallrefresh 566 #define MVM_OP_threadrun 567 #define MVM_OP_threadid 568 #define MVM_OP_threadyield 569 #define MVM_OP_currentthread 570 #define MVM_OP_lock 571 #define MVM_OP_unlock 572 #define MVM_OP_semacquire 573 #define MVM_OP_semtryacquire 574 #define MVM_OP_semrelease 575 #define MVM_OP_getlockcondvar 576 #define MVM_OP_condwait 577 #define MVM_OP_condsignalone 578 #define MVM_OP_condsignalall 579 #define MVM_OP_queuepoll 580 #define MVM_OP_setmultispec 581 #define MVM_OP_ctxouterskipthunks 582 #define MVM_OP_ctxcallerskipthunks 583 #define MVM_OP_timer 584 #define MVM_OP_cancel 585 #define MVM_OP_signal 586 #define MVM_OP_watchfile 587 #define MVM_OP_asyncconnect 588 #define MVM_OP_asynclisten 589 #define MVM_OP_asyncwritestr 590 #define MVM_OP_asyncwritebytes 591 #define MVM_OP_asyncreadchars 592 #define MVM_OP_asyncreadbytes 593 #define MVM_OP_getlexstatic_o 594 #define MVM_OP_getlexperinvtype_o 595 #define MVM_OP_execname 596 #define MVM_OP_const_i64_16 597 #define MVM_OP_const_i64_32 598 #define MVM_OP_isnonnull 599 #define MVM_OP_param_rn2_i 600 #define MVM_OP_param_rn2_n 601 #define MVM_OP_param_rn2_s 602 #define MVM_OP_param_rn2_o 603 #define MVM_OP_param_on2_i 604 #define MVM_OP_param_on2_n 605 #define MVM_OP_param_on2_s 606 #define MVM_OP_param_on2_o 607 #define MVM_OP_osrpoint 608 #define MVM_OP_nativecallcast 609 #define MVM_OP_spawnprocasync 610 #define MVM_OP_killprocasync 611 #define MVM_OP_startprofile 612 #define MVM_OP_endprofile 613 #define MVM_OP_objectid 614 #define MVM_OP_settypefinalize 615 #define MVM_OP_force_gc 616 #define MVM_OP_nativecallglobal 617 #define MVM_OP_close_fhi 618 #define MVM_OP_setparameterizer 619 #define MVM_OP_parameterizetype 620 #define MVM_OP_typeparameterized 621 #define MVM_OP_typeparameters 622 #define MVM_OP_typeparameterat 623 #define MVM_OP_readlink 624 #define MVM_OP_lstat 625 #define MVM_OP_iscont_i 626 #define MVM_OP_iscont_n 627 #define MVM_OP_iscont_s 628 #define MVM_OP_assign_i 629 #define MVM_OP_assign_n 630 #define MVM_OP_assign_s 631 #define MVM_OP_decont_i 632 #define MVM_OP_decont_n 633 #define MVM_OP_decont_s 634 #define MVM_OP_getregref_i 635 #define MVM_OP_getregref_n 636 #define MVM_OP_getregref_s 637 #define MVM_OP_getlexref_i 638 #define MVM_OP_getlexref_n 639 #define MVM_OP_getlexref_s 640 #define MVM_OP_getlexref_ni 641 #define MVM_OP_getlexref_nn 642 #define MVM_OP_getlexref_ns 643 #define MVM_OP_atposref_i 644 #define MVM_OP_atposref_n 645 #define MVM_OP_atposref_s 646 #define MVM_OP_getattrref_i 647 #define MVM_OP_getattrref_n 648 #define MVM_OP_getattrref_s 649 #define MVM_OP_getattrsref_i 650 #define MVM_OP_getattrsref_n 651 #define MVM_OP_getattrsref_s 652 #define MVM_OP_nativecallsizeof 653 #define MVM_OP_encodenorm 654 #define MVM_OP_normalizecodes 655 #define MVM_OP_strfromcodes 656 #define MVM_OP_strtocodes 657 #define MVM_OP_getcodelocation 658 #define MVM_OP_eqatim_s 659 #define MVM_OP_ordbaseat 660 #define MVM_OP_neverrepossess 661 #define MVM_OP_scdisclaim 662 #define MVM_OP_syncpipe 663 #define MVM_OP_atpos2d_i 664 #define MVM_OP_atpos2d_n 665 #define MVM_OP_atpos2d_s 666 #define MVM_OP_atpos2d_o 667 #define MVM_OP_atpos3d_i 668 #define MVM_OP_atpos3d_n 669 #define MVM_OP_atpos3d_s 670 #define MVM_OP_atpos3d_o 671 #define MVM_OP_atposnd_i 672 #define MVM_OP_atposnd_n 673 #define MVM_OP_atposnd_s 674 #define MVM_OP_atposnd_o 675 #define MVM_OP_bindpos2d_i 676 #define MVM_OP_bindpos2d_n 677 #define MVM_OP_bindpos2d_s 678 #define MVM_OP_bindpos2d_o 679 #define MVM_OP_bindpos3d_i 680 #define MVM_OP_bindpos3d_n 681 #define MVM_OP_bindpos3d_s 682 #define MVM_OP_bindpos3d_o 683 #define MVM_OP_bindposnd_i 684 #define MVM_OP_bindposnd_n 685 #define MVM_OP_bindposnd_s 686 #define MVM_OP_bindposnd_o 687 #define MVM_OP_dimensions 688 #define MVM_OP_setdimensions 689 #define MVM_OP_numdimensions 690 #define MVM_OP_ctxcode 691 #define MVM_OP_isrwcont 692 #define MVM_OP_fc 693 #define MVM_OP_setinputlineseps_fh 694 #define MVM_OP_readlinechomp_fh 695 #define MVM_OP_encoderep 696 #define MVM_OP_istty_fh 697 #define MVM_OP_sp_log 698 #define MVM_OP_sp_osrfinalize 699 #define MVM_OP_sp_guardconc 700 #define MVM_OP_sp_guardtype 701 #define MVM_OP_sp_guardcontconc 702 #define MVM_OP_sp_guardconttype 703 #define MVM_OP_sp_guardrwconc 704 #define MVM_OP_sp_guardrwtype 705 #define MVM_OP_sp_getarg_o 706 #define MVM_OP_sp_getarg_i 707 #define MVM_OP_sp_getarg_n 708 #define MVM_OP_sp_getarg_s 709 #define MVM_OP_sp_fastinvoke_v 710 #define MVM_OP_sp_fastinvoke_i 711 #define MVM_OP_sp_fastinvoke_n 712 #define MVM_OP_sp_fastinvoke_s 713 #define MVM_OP_sp_fastinvoke_o 714 #define MVM_OP_sp_namedarg_used 715 #define MVM_OP_sp_getspeshslot 716 #define MVM_OP_sp_findmeth 717 #define MVM_OP_sp_fastcreate 718 #define MVM_OP_sp_get_o 719 #define MVM_OP_sp_get_i64 720 #define MVM_OP_sp_get_i32 721 #define MVM_OP_sp_get_i16 722 #define MVM_OP_sp_get_i8 723 #define MVM_OP_sp_get_n 724 #define MVM_OP_sp_get_s 725 #define MVM_OP_sp_bind_o 726 #define MVM_OP_sp_bind_i64 727 #define MVM_OP_sp_bind_i32 728 #define MVM_OP_sp_bind_i16 729 #define MVM_OP_sp_bind_i8 730 #define MVM_OP_sp_bind_n 731 #define MVM_OP_sp_bind_s 732 #define MVM_OP_sp_p6oget_o 733 #define MVM_OP_sp_p6ogetvt_o 734 #define MVM_OP_sp_p6ogetvc_o 735 #define MVM_OP_sp_p6oget_i 736 #define MVM_OP_sp_p6oget_n 737 #define MVM_OP_sp_p6oget_s 738 #define MVM_OP_sp_p6obind_o 739 #define MVM_OP_sp_p6obind_i 740 #define MVM_OP_sp_p6obind_n 741 #define MVM_OP_sp_p6obind_s 742 #define MVM_OP_sp_jit_enter 743 #define MVM_OP_sp_boolify_iter 744 #define MVM_OP_sp_boolify_iter_arr 745 #define MVM_OP_sp_boolify_iter_hash 746 #define MVM_OP_prof_enter 747 #define MVM_OP_prof_enterspesh 748 #define MVM_OP_prof_enterinline 749 #define MVM_OP_prof_enternative 750 #define MVM_OP_prof_exit 751 #define MVM_OP_prof_allocated 752 #define MVM_OP_ctw_check 753 #define MVM_OP_EXT_BASE 1024 #define MVM_OP_EXT_CU_LIMIT 1024 MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op); MoarVM-2015.11/src/core/threadcontext.c0000644000175000017500000000571412554473060016624 0ustar jnthnjnthn#include "moar.h" #include "platform/time.h" /* Initializes a new thread context. Note that this doesn't set up a * thread itself, it just creates the data structure that exists in * MoarVM per thread. */ MVMThreadContext * MVM_tc_create(MVMInstance *instance) { MVMThreadContext *tc = MVM_calloc(1, sizeof(MVMThreadContext)); /* Associate with VM instance. */ tc->instance = instance; /* Set up GC nursery. */ tc->nursery_fromspace = MVM_calloc(1, MVM_NURSERY_SIZE); tc->nursery_tospace = MVM_calloc(1, MVM_NURSERY_SIZE); tc->nursery_alloc = tc->nursery_tospace; tc->nursery_alloc_limit = (char *)tc->nursery_alloc + MVM_NURSERY_SIZE; /* Set up temporary root handling. */ tc->num_temproots = 0; tc->alloc_temproots = MVM_TEMP_ROOT_BASE_ALLOC; tc->temproots = MVM_malloc(sizeof(MVMCollectable **) * tc->alloc_temproots); /* Set up intergenerational root handling. */ tc->num_gen2roots = 0; tc->alloc_gen2roots = 64; tc->gen2roots = MVM_malloc(sizeof(MVMCollectable *) * tc->alloc_gen2roots); /* Set up the second generation allocator. */ tc->gen2 = MVM_gc_gen2_create(instance); /* Use default loop for main thread; create a new one for others. */ tc->loop = instance->main_thread ? uv_loop_new() : uv_default_loop(); /* Initialize random number generator state. */ MVM_proc_seed(tc, (MVM_platform_now() / 10000) * MVM_proc_getpid(tc)); return tc; } /* Destroys a given thread context. This will also free the nursery. * This means that it must no longer be in use, at all; this can be * ensured by a GC run at thread exit that forces evacuation of all * objects from this nursery to the second generation. Only after * that is true should this be called. */ void MVM_tc_destroy(MVMThreadContext *tc) { /* We run once again (non-blocking) to eventually close filehandles. */ uv_run(tc->loop, UV_RUN_NOWAIT); /* Free the nursery. */ MVM_free(tc->nursery_fromspace); MVM_free(tc->nursery_tospace); /* Destroy the second generation allocator. */ MVM_gc_gen2_destroy(tc->instance, tc->gen2); /* Free the thread-specific storage */ MVM_free(tc->gc_work); MVM_free(tc->temproots); MVM_free(tc->gen2roots); /* Destroy the libuv event loop */ uv_loop_delete(tc->loop); /* Free the thread context itself. */ memset(tc, 0, sizeof(MVMThreadContext)); MVM_free(tc); } /* Setting and clearing mutex to release on exception throw. */ void MVM_tc_set_ex_release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex) { if (tc->ex_release_mutex) MVM_exception_throw_adhoc(tc, "Internal error: multiple ex_release_mutex"); tc->ex_release_mutex = mutex; } void MVM_tc_release_ex_release_mutex(MVMThreadContext *tc) { if (tc->ex_release_mutex) uv_mutex_unlock(tc->ex_release_mutex); tc->ex_release_mutex = NULL; } void MVM_tc_clear_ex_release_mutex(MVMThreadContext *tc) { tc->ex_release_mutex = NULL; } MoarVM-2015.11/src/core/threadcontext.h0000644000175000017500000001717412554473060016634 0ustar jnthnjnthn/* Possible values for the thread execution interrupt flag. */ typedef enum { /* Indicates that the thread is currently executing, and should * continue to do so. */ MVMGCStatus_NONE = 0, /* Set when another thread decides it wants to do a GC run. The * current thread, on detecting this condition at a safe point, * should join in with the current GC run. */ MVMGCStatus_INTERRUPT = 1, /* Set by a thread when it is unable to do any GC work because it * is currently blocked waiting on an operation in the outside * world (such as, waiting for another thread to join, or for * some I/O to complete). */ MVMGCStatus_UNABLE = 2, /* Indicates that, while the thread was in unable status, a GC * run was triggered and the scanning work was stolen. A thread * that becomes unblocked upon seeing this will wait for the GC * run to be done. */ MVMGCStatus_STOLEN = 3 } MVMGCStatus; /* To manage memory more efficiently, we cache MVMFrame instances. * The initial frame pool table size sets the initial guess at the * number of different types of frame (that is, an MVMStaticFrame) * that we'll encounter and cache. If we do deep recursion, we run * the risk of caching an enormous number of frames, so the length * limit sets how many frames of a given static frame type we will * keep around. */ #define MVMInitialFramePoolTableSize 64 #define MVMFramePoolLengthLimit 64 /* Information associated with an executing thread. */ struct MVMThreadContext { /* The current allocation pointer, where the next object to be allocated * should be placed. */ void *nursery_alloc; /* The end of the space we're allowed to allocate to. */ void *nursery_alloc_limit; /* This thread's GC status. */ AO_t gc_status; /* Non-zero is we should allocate in gen2; incremented/decremented as we * enter/leave a region wanting gen2 allocation. */ MVMuint32 allocate_in_gen2; /* Internal ID of the thread. */ MVMuint32 thread_id; /* Thread object representing the thread. */ MVMThread *thread_obj; /* The frame lying at the base of the current thread. */ MVMFrame *thread_entry_frame; /* Pointer to where the interpreter's current opcode is stored. */ MVMuint8 **interp_cur_op; /* Pointer to where the interpreter's bytecode start pointer is stored. */ MVMuint8 **interp_bytecode_start; /* Pointer to where the interpreter's base of the current register * set is stored. */ MVMRegister **interp_reg_base; /* Pointer to where the interpreter's current compilation unit pointer * is stored. */ MVMCompUnit **interp_cu; /* The frame we're currently executing. */ MVMFrame *cur_frame; /* libuv event loop */ uv_loop_t *loop; /* The usecapture op can, without allocating, have a way to talk about the * arguments of the current call. This is the (pre-thread) object that is * used by that op. */ MVMObject *cur_usecapture; /* Linked list of exception handlers that we're currently executing, topmost * one first in the list. */ MVMActiveHandler *active_handlers; /* Result object of the last-run exception handler. */ MVMObject *last_handler_result; /* Mutex that must be released if we throw an exception. Used in places * like I/O, which grab a mutex but may throw an exception. */ uv_mutex_t *ex_release_mutex; /* The VM instance that this thread belongs to. */ MVMInstance *instance; /* Start of fromspace, the place we're copying objects from during a * copying collection or processing dead objects that need to do extra * resource release afterwards. */ void *nursery_fromspace; /* Where we evacuate objects to when collecting this thread's nursery, or * allocate new ones. */ void *nursery_tospace; /* The second GC generation allocator. */ MVMGen2Allocator *gen2; /* Number of bytes promoted to gen2 in current GC run. */ MVMuint32 gc_promoted_bytes; /* Memory buffer pointing to the last thing we serialized, intended to go * into the next compilation unit we write. Also the serialized string * heap, which will be used to seed the compilation unit string heap. */ MVMint32 serialized_size; char *serialized; MVMObject *serialized_string_heap; /* Temporarily rooted objects. This is generally used by code written in * C that wants to keep references to objects. Since those may change * if the code in question also allocates, there is a need to register * them; this ensures the GC will not swallow them but also that they * will get updated if a GC run happens. Note that this is used as a * stack and is also thread-local, so it's cheap to push/pop. */ MVMuint32 num_temproots; MVMuint32 mark_temproots; MVMuint32 alloc_temproots; MVMCollectable ***temproots; /* Nursery collectables (maybe STables) rooted because something in * generation 2 is pointing at them. */ MVMuint32 num_gen2roots; MVMuint32 alloc_gen2roots; MVMCollectable **gen2roots; /* Finalize queue objects, which need to have a finalizer invoked once * they are no longer referenced from anywhere except this queue. */ MVMuint32 num_finalize; MVMuint32 alloc_finalize; MVMObject **finalize; /* List of objects we're in the process of finalizing. */ MVMuint32 num_finalizing; MVMuint32 alloc_finalizing; MVMObject **finalizing; /* The GC's cross-thread in-tray of processing work. */ MVMGCPassedWork *gc_in_tray; /* Threads we will do GC work for this run (ourself plus any that we stole * work from because they were blocked). */ MVMWorkThread *gc_work; MVMuint32 gc_work_size; MVMuint32 gc_work_count; /* Pool of Lexotics for various static frames, held per thread since the * result being returned is per thread. */ MVMLexotic **lexotic_cache; MVMuint32 lexotic_cache_size; /* Serialization context write barrier disabled depth (anything non-zero * means disabled). */ MVMint32 sc_wb_disable_depth; /* Any serialization contexts we are compiling. The current one is at * index 0. */ MVMObject *compiling_scs; /* Dispatcher set for next invocation to take. */ MVMObject *cur_dispatcher; /* Cache of native code callback data. */ MVMNativeCallbackCacheHead *native_callback_cache; /* Random number generator state. */ MVMuint64 rand_state[2]; /* Jump buffer, used when an exception is thrown from C-land and we need * to fall back into the interpreter. These things are huge, so put it * near the end to keep the hotter stuff on the same cacheline. */ jmp_buf interp_jump; /* NFA evaluator memory cache, to avoid many allocations; see NFA.c. */ MVMint64 *nfa_done; MVMint64 *nfa_curst; MVMint64 *nfa_nextst; MVMint64 nfa_alloc_states; MVMint64 *nfa_fates; MVMint64 nfa_fates_len; MVMint64 *nfa_longlit; MVMint64 nfa_longlit_len; /* The number of locks the thread is holding. */ MVMint64 num_locks; /* Profiling data collected for this thread, if profiling is on. */ MVMProfileThreadData *prof_data; }; MVMThreadContext * MVM_tc_create(MVMInstance *instance); void MVM_tc_destroy(MVMThreadContext *tc); void MVM_tc_set_ex_release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex); void MVM_tc_release_ex_release_mutex(MVMThreadContext *tc); void MVM_tc_clear_ex_release_mutex(MVMThreadContext *tc); MoarVM-2015.11/src/core/threads.c0000644000175000017500000002254312574526172015406 0ustar jnthnjnthn#include "moar.h" #include /* Temporary structure for passing data to thread start. */ typedef struct { MVMThreadContext *tc; MVMObject *thread_obj; } ThreadStart; /* Creates a new thread handle with the MVMThread representation. Does not * actually start execution of the thread, but does give it its unique ID. */ MVMObject * MVM_thread_new(MVMThreadContext *tc, MVMObject *invokee, MVMint64 app_lifetime) { MVMThread *thread; MVMThreadContext *child_tc; /* Create the Thread object and stash code to run and lifetime. */ MVMROOT(tc, invokee, { thread = (MVMThread *)MVM_repr_alloc_init(tc, tc->instance->Thread); }); thread->body.stage = MVM_thread_stage_unstarted; MVM_ASSIGN_REF(tc, &(thread->common.header), thread->body.invokee, invokee); thread->body.app_lifetime = app_lifetime; /* Create a new thread context and set it up a little. */ child_tc = MVM_tc_create(tc->instance); child_tc->thread_obj = thread; child_tc->thread_id = 1 + MVM_incr(&tc->instance->next_user_thread_id); /* Add one, since MVM_incr returns original. */ thread->body.tc = child_tc; /* Also make a copy of the thread ID in the thread object itself, so it * is available once the thread dies and its ThreadContext is gone. */ thread->body.thread_id = child_tc->thread_id; return (MVMObject *)thread; } /* This callback is passed to the interpreter code. It takes care of making * the initial invocation of the thread code. */ static void thread_initial_invoke(MVMThreadContext *tc, void *data) { /* The passed data is simply the code object to invoke. */ ThreadStart *ts = (ThreadStart *)data; MVMThread *thread = (MVMThread *)ts->thread_obj; MVMObject *invokee = thread->body.invokee; thread->body.invokee = NULL; /* Set up the cached current usecapture CallCapture (done here so * we allocate it on the correct thread, and once the thread is * active). */ MVMROOT(tc, invokee, { tc->cur_usecapture = MVM_repr_alloc_init(tc, tc->instance->CallCapture); }); /* Create initial frame, which sets up all of the interpreter state also. */ invokee = MVM_frame_find_invokee(tc, invokee, NULL); STABLE(invokee)->invoke(tc, invokee, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL); /* This frame should be marked as the thread entry frame, so that any * return from it will cause us to drop out of the interpreter and end * the thread. */ tc->thread_entry_frame = tc->cur_frame; } /* This callback handles starting execution of a thread. */ static void start_thread(void *data) { ThreadStart *ts = (ThreadStart *)data; MVMThreadContext *tc = ts->tc; /* Stash thread ID. */ tc->thread_obj->body.native_thread_id = MVM_platform_thread_id(); /* wait for the GC to finish if it's not finished stealing us. */ MVM_gc_mark_thread_unblocked(tc); tc->thread_obj->body.stage = MVM_thread_stage_started; /* Enter the interpreter, to run code. */ MVM_interp_run(tc, thread_initial_invoke, ts); /* mark as exited, so the GC will know to clear our stuff. */ tc->thread_obj->body.stage = MVM_thread_stage_exited; /* Mark ourselves as dying, so that another thread will take care * of GC-ing our objects and cleaning up our thread context. */ MVM_gc_mark_thread_blocked(tc); /* hopefully pop the ts->thread_obj temp */ MVM_gc_root_temp_pop(tc); MVM_free(ts); /* Exit the thread, now it's completed. */ MVM_platform_thread_exit(NULL); } /* Begins execution of a thread. */ void MVM_thread_run(MVMThreadContext *tc, MVMObject *thread_obj) { MVMThread *child = (MVMThread *)thread_obj; int status; ThreadStart *ts; if (REPR(child)->ID == MVM_REPR_ID_MVMThread) { MVMThread * volatile *threads; MVMThreadContext *child_tc = child->body.tc; /* Move thread to starting stage. */ child->body.stage = MVM_thread_stage_starting; /* Create thread state, to pass to the thread start callback. */ ts = MVM_malloc(sizeof(ThreadStart)); ts->tc = child_tc; ts->thread_obj = thread_obj; /* Push this to the *child* tc's temp roots. */ MVM_gc_root_temp_push(child_tc, (MVMCollectable **)&ts->thread_obj); /* Mark thread as GC blocked until the thread actually starts. */ MVM_gc_mark_thread_blocked(child_tc); /* Push to starting threads list */ threads = &tc->instance->threads; do { MVMThread *curr = *threads; MVM_ASSIGN_REF(tc, &(child->common.header), child->body.next, curr); } while (MVM_casptr(threads, child->body.next, child) != child->body.next); /* Do the actual thread creation. */ status = uv_thread_create(&child->body.thread, start_thread, ts); if (status < 0) MVM_panic(MVM_exitcode_compunit, "Could not spawn thread: errorcode %d", status); } else { MVM_exception_throw_adhoc(tc, "Thread handle passed to run must have representation MVMThread"); } } /* Waits for a thread to finish. */ static int try_join(MVMThreadContext *tc, MVMThread *thread) { /* Join the thread, marking ourselves as unable to GC while we wait. */ int status; MVM_gc_root_temp_push(tc, (MVMCollectable **)&thread); MVM_gc_mark_thread_blocked(tc); if (thread->body.stage < MVM_thread_stage_exited) { status = uv_thread_join(&thread->body.thread); } else { /* the target already ended */ status = 0; } MVM_gc_mark_thread_unblocked(tc); MVM_gc_root_temp_pop(tc); /* After a thread has been joined, we trigger a GC run to clean up after * it. This avoids problems where a program spawns threads and joins them * in a loop gobbling a load of memory and other resources because we do * not ever trigger a GC run to clean up the thread. */ MVM_gc_enter_from_allocator(tc); return status; } void MVM_thread_join(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread) { int status = try_join(tc, (MVMThread *)thread_obj); if (status < 0) MVM_panic(MVM_exitcode_compunit, "Could not join thread: errorcode %d", status); } else { MVM_exception_throw_adhoc(tc, "Thread handle passed to join must have representation MVMThread"); } } /* Gets the (VM-level) ID of a thread. */ MVMint64 MVM_thread_id(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread) return ((MVMThread *)thread_obj)->body.thread_id; else MVM_exception_throw_adhoc(tc, "Thread handle passed to threadid must have representation MVMThread"); } /* Gets the native OS ID of a thread. If it's not yet available because * the thread was not yet started, this will return 0. */ MVMint64 MVM_thread_native_id(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread) return ((MVMThread *)thread_obj)->body.native_thread_id; else MVM_exception_throw_adhoc(tc, "Thread handle passed to threadnativeid must have representation MVMThread"); } /* Yields control to another thread. */ void MVM_thread_yield(MVMThreadContext *tc) { MVM_platform_thread_yield(); } /* Gets the object representing the current thread. */ MVMObject * MVM_thread_current(MVMThreadContext *tc) { return (MVMObject *)tc->thread_obj; } void MVM_thread_cleanup_threads_list(MVMThreadContext *tc, MVMThread **head) { /* Assumed to be the only thread accessing the list. * must set next on every item. */ MVMThread *new_list = NULL, *this = *head, *next; *head = NULL; while (this) { next = this->body.next; switch (this->body.stage) { case MVM_thread_stage_starting: case MVM_thread_stage_waiting: case MVM_thread_stage_started: case MVM_thread_stage_exited: case MVM_thread_stage_clearing_nursery: /* push it to the new starting list */ this->body.next = new_list; new_list = this; break; case MVM_thread_stage_destroyed: /* don't put in a list */ this->body.next = NULL; break; default: MVM_panic(MVM_exitcode_threads, "Thread in unknown stage: %"MVM_PRSz"\n", this->body.stage); } this = next; } *head = new_list; } /* Goes through all non-app-lifetime threads and joins them. */ void MVM_thread_join_foreground(MVMThreadContext *tc) { MVMint64 work = 1; while (work) { MVMThread *cur_thread = tc->instance->threads; work = 0; while (cur_thread) { if (cur_thread->body.tc != tc->instance->main_thread) { if (!cur_thread->body.app_lifetime) { if (MVM_load(&cur_thread->body.stage) < MVM_thread_stage_exited) { /* Join may trigger GC and invalidate cur_thread, so we * just set work to 1 and do another trip around the main * loop. */ try_join(tc, cur_thread); work = 1; break; } } } cur_thread = cur_thread->body.next; } } } MoarVM-2015.11/src/core/threads.h0000644000175000017500000000121312534320622015366 0ustar jnthnjnthnMVMObject * MVM_thread_new(MVMThreadContext *tc, MVMObject *invokee, MVMint64 app_lifetime); void MVM_thread_run(MVMThreadContext *tc, MVMObject *thread); void MVM_thread_join(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_id(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_native_id(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_current_os_thread_id(MVMThreadContext *tc); void MVM_thread_yield(MVMThreadContext *tc); MVMObject * MVM_thread_current(MVMThreadContext *tc); void MVM_thread_cleanup_threads_list(MVMThreadContext *tc, MVMThread **head); void MVM_thread_join_foreground(MVMThreadContext *tc); MoarVM-2015.11/src/core/validation.c0000644000175000017500000004543512623370227016104 0ustar jnthnjnthn#include "moar.h" /* TODO: validate * - args of prepargs, getcode * - any cu->strings index (28 currently) * - cur_frame->args indexes */ /* Macros for getting things from the bytecode stream. */ /* GET_REG is defined differently here from interp.c */ #define GET_REG(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I16(pc, idx) *((MVMint16 *)(pc + idx)) #define GET_UI16(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I32(pc, idx) *((MVMint32 *)(pc + idx)) #define GET_UI32(pc, idx) *((MVMuint32 *)(pc + idx)) #define GET_N32(pc, idx) *((MVMnum32 *)(pc + idx)) #define MSG(val, msg) "Bytecode validation error at offset %" PRIu32 \ ", instruction %" PRIu32 ":\n" msg, \ (MVMuint32)((val)->cur_op - (val)->bc_start), (val)->cur_instr enum { MARK_regular = ' ', MARK_special = '.', MARK_sequence = ':', MARK_head = '+', MARK_body = '*', MARK_tail = '-' }; typedef struct { MVMThreadContext *tc; MVMCompUnit *cu; MVMStaticFrame *frame; MVMuint32 loc_count; MVMuint16 *loc_types; MVMuint32 bc_size; MVMuint8 *bc_start; MVMuint8 *bc_end; MVMuint8 *src_cur_op; MVMuint8 *src_bc_end; MVMuint8 *labels; MVMuint8 *cur_op; const MVMOpInfo *cur_info; const char *cur_mark; MVMuint32 cur_instr; MVMCallsite *cur_call; MVMuint16 cur_arg; MVMCallsiteEntry expected_named_arg; MVMuint16 remaining_args; MVMuint16 remaining_positionals; MVMuint32 remaining_jumplabels; MVMuint32 reg_type_var; } Validator; MVM_NO_RETURN static void fail(Validator *val, const char *msg, ...) MVM_FORMAT(printf, 2, 3) MVM_NO_RETURN_GCC; static void fail(Validator *val, const char *msg, ...) { va_list args; va_start(args, msg); MVM_free(val->labels); MVM_exception_throw_adhoc_va(val->tc, msg, args); va_end(args); } static void fail_illegal_mark(Validator *val) { fail(val, MSG(val, "illegal op mark '%.2s'"), val->cur_mark); } static void ensure_bytes(Validator *val, MVMuint32 count) { if (val->src_cur_op + count > val->src_bc_end) fail(val, MSG(val, "truncated stream")); #ifdef MVM_BIGENDIAN /* Endian swap equivalent of memcpy(val->cur_op, val->src_cur_op, count); */ { MVMuint8 *d = val->cur_op + count; while (count--) { *--d = *val->src_cur_op++; } } #else val->src_cur_op += count; #endif } static void ensure_op(Validator *val, MVMuint16 opcode) { if (val->cur_info->opcode != opcode) { fail(val, MSG(val, "expected op %s but got %s"), MVM_op_get_op(opcode)->name, val->cur_info->name); } } static void ensure_no_remaining_jumplabels(Validator *val) { if (val->remaining_jumplabels != 0) fail(val, MSG(val, "%" PRIu32 " jumplist labels missing their goto ops"), val->remaining_jumplabels); } static void ensure_no_remaining_positionals(Validator *val) { if (val->remaining_positionals != 0) fail(val, MSG(val, "callsite expects %" PRIu16 " more positionals"), val->remaining_positionals); } static void ensure_no_remaining_args(Validator *val) { if (val->remaining_args != 0) fail(val, MSG(val, "callsite expects %" PRIu16 " more args"), val->remaining_args); } MVM_STATIC_INLINE const MVMOpInfo * get_info(Validator *val, MVMuint16 opcode) { const MVMOpInfo *info; if (opcode < MVM_OP_EXT_BASE) { info = MVM_op_get_op(opcode); if (!info) fail(val, MSG(val, "invalid opcode %u"), opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record; if (index >= val->cu->body.num_extops) fail(val, MSG(val, "invalid extension opcode %u - should be less than %u"), opcode, MVM_OP_EXT_BASE + val->cu->body.num_extops); record = &val->cu->body.extops[index]; info = MVM_ext_resolve_extop_record(val->tc, record); if (!info) fail(val, MSG(val, "extension op '%s' not registered"), MVM_string_utf8_encode_C_string(val->tc, record->name)); } return info; } MVM_STATIC_INLINE void read_op(Validator *val) { MVMuint16 opcode; const MVMOpInfo *info; MVMuint32 pos; ensure_bytes(val, 2); opcode = *(MVMuint16 *)val->cur_op; info = get_info(val, opcode); pos = val->cur_op - val->bc_start; #if 0 MVM_string_print(val->tc, val->cu->body.filename); printf(" %u %s %.2s\n", val->cur_instr, info->name, info->mark); #endif val->labels[pos] |= MVM_BC_op_boundary; val->cur_info = info; val->cur_mark = info->mark; val->cur_op += 2; val->cur_instr += 1; } static void unread_op(Validator *val) { val->src_cur_op -= 2; val->cur_op -= 2; val->cur_instr -= 1; } static void validate_branch_targets(Validator *val) { MVMuint32 pos, instr; for (pos = 0, instr = (MVMuint32)-1; pos < val->bc_size; pos++) { MVMuint32 flag = val->labels[pos]; if (flag & MVM_BC_op_boundary) instr++; if ((flag & MVM_BC_branch_target) && !(flag & MVM_BC_op_boundary)) fail(val, MSG(val, "branch targets offset %" PRIu32 "within instruction %" PRIu32), pos, instr); } } static void validate_final_return(Validator *val) { if (!val->bc_size || val->cur_mark[1] != 'r') fail(val, MSG(val, "missing final return instruction")); } static void validate_literal_operand(Validator *val, MVMuint32 flags) { MVMuint32 type = flags & MVM_operand_type_mask; MVMuint32 size; switch (type) { case MVM_operand_int8: size = 1; break; case MVM_operand_int16: size = 2; break; case MVM_operand_int32: size = 4; break; case MVM_operand_int64: size = 8; break; case MVM_operand_num32: size = 4; break; case MVM_operand_num64: size = 8; break; case MVM_operand_callsite: size = 2; break; case MVM_operand_coderef: size = 2; break; case MVM_operand_str: size = 4; break; case MVM_operand_ins: size = 4; break; case MVM_operand_obj: case MVM_operand_type_var: fail(val, MSG(val, "operand type %i can't be a literal"), type); default: fail(val, MSG(val, "unknown operand type %i"), type); } ensure_bytes(val, size); switch (type) { case MVM_operand_callsite: { MVMuint16 index = GET_UI16(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_callsites; if (index >= count) fail(val, MSG(val, "callsite index %" PRIu16 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_coderef: { MVMuint16 index = GET_UI16(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_frames; if (index >= count) fail(val, MSG(val, "coderef index %" PRIu16 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_str: { MVMuint32 index = GET_UI32(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_strings; if (index >= count) fail(val, MSG(val, "string index %" PRIu32 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_ins: { MVMuint32 offset = GET_UI32(val->cur_op, 0); if (offset >= val->bc_size) fail(val, MSG(val, "branch instruction offset %" PRIu32 " out of range 0..%" PRIu32), offset, val->bc_size - 1); val->labels[offset] |= MVM_BC_branch_target; } } val->cur_op += size; } static void validate_reg_operand(Validator *val, MVMuint32 flags) { MVMuint32 operand_type = flags & MVM_operand_type_mask; MVMuint32 reg_type; MVMuint16 reg; ensure_bytes(val, 2); reg = GET_REG(val->cur_op, 0); if (reg >= val->loc_count) fail(val, MSG(val, "register operand index %" PRIu16 " out of range 0..%" PRIu32), reg, val->loc_count - 1); reg_type = val->loc_types[reg] << 3; if (operand_type == MVM_operand_type_var) { if (!val->reg_type_var) { val->reg_type_var = reg_type; goto next_operand; } operand_type = val->reg_type_var; } if (reg_type != operand_type) fail(val, MSG(val, "operand type %i does not match register type %i"), operand_type, reg_type); next_operand: val->cur_op += 2; } static void validate_lex_operand(Validator *val, MVMuint32 flags) { MVMuint16 lex_index, frame_index, i; MVMuint32 lex_count; MVMStaticFrame *frame = val->frame; /* Two steps forward, two steps back to keep the error reporting happy, and to make the endian conversion within ensure_bytes correct. (Both are using val->cur_op, and want it to have different values.) */ ensure_bytes(val, 2); lex_index = GET_UI16(val->cur_op, 0); val->cur_op += 2; ensure_bytes(val, 2); val->cur_op -= 2; frame_index = GET_UI16(val->cur_op, 2); for (i = frame_index; i; i--) { frame = frame->body.outer; if (!frame) fail(val, MSG(val, "lexical operand requires %" PRIu16 " more enclosing scopes"), i); } lex_count = frame->body.num_lexicals; if (lex_index >= lex_count) fail(val, MSG(val, "lexical operand index %" PRIu16 " out of range 0.. %" PRIu32), lex_index, lex_count - 1); val->cur_op += 4; } static void validate_operand(Validator *val, MVMuint32 flags) { MVMuint32 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_literal: validate_literal_operand(val, flags); break; case MVM_operand_read_reg: case MVM_operand_write_reg: validate_reg_operand(val, flags); break; case MVM_operand_read_lex: case MVM_operand_write_lex: validate_lex_operand(val, flags); break; default: fail(val, MSG(val, "invalid instruction rw flag %i"), rw); } } static void validate_operands(Validator *val) { const MVMuint8 *operands = val->cur_info->operands; val->reg_type_var = 0; switch (val->cur_info->opcode) { case MVM_OP_jumplist: { MVMint64 count; validate_literal_operand(val, operands[0]); count = MVM_BC_get_I64(val->cur_op, -8); if (count < 0 || count > UINT32_MAX) fail(val, MSG(val, "illegal jumplist label count %" PRIi64), count); validate_reg_operand(val, operands[1]); break; } default: { int i; for (i = 0; i < val->cur_info->num_operands; i++) validate_operand(val, val->cur_info->operands[i]); } } } static void validate_sequence(Validator *val) { int seq_id = val->cur_mark[1]; switch (seq_id) { case 'j': { ensure_op(val, MVM_OP_jumplist); validate_operands(val); val->remaining_jumplabels = (MVMuint32)MVM_BC_get_I64(val->cur_op, -10); break; } default: fail(val, MSG(val, "unknown instruction sequence '%c'"), seq_id); } while (val->cur_op < val->bc_end) { int type, id; read_op(val); type = val->cur_mark[0]; id = val->cur_mark[1]; switch (type) { case MARK_special: if (id == seq_id) break; else; /* fallthrough */ case MARK_regular: case MARK_sequence: case MARK_head: unread_op(val); goto terminate_seq; default: fail_illegal_mark(val); } switch (seq_id) { case 'j': ensure_op(val, MVM_OP_goto); validate_operands(val); val->remaining_jumplabels--; if (val->remaining_jumplabels == 0) goto terminate_seq; break; } } terminate_seq: switch (seq_id) { case 'j': ensure_no_remaining_jumplabels(val); break; } } static void validate_arg(Validator *val) { MVMCallsiteEntry flags; val->remaining_args--; if (val->expected_named_arg) { flags = val->expected_named_arg; val->expected_named_arg = 0; } else { MVMuint16 index = val->cur_arg++; MVMuint16 count = val->cur_call->arg_count; if (index >= count) fail (val, MSG(val, "argument index %" PRIu16 " not in range 0..%" PRIu32), index, count - 1); flags = val->cur_call->arg_flags[index]; switch (flags & ~MVM_CALLSITE_ARG_MASK) { case 0: /* positionals */ case MVM_CALLSITE_ARG_FLAT: val->remaining_positionals--; break; case MVM_CALLSITE_ARG_FLAT_NAMED: /* Nothing to do for this case. */ break; case MVM_CALLSITE_ARG_NAMED: val->expected_named_arg = flags & MVM_CALLSITE_ARG_MASK; goto named_arg; default: fail(val, MSG(val, "invalid argument flags (%i) at index %" PRIu16), (int)(flags & ~MVM_CALLSITE_ARG_MASK), index); } } goto regular_arg; named_arg: if (val->cur_info->opcode != MVM_OP_argconst_s) fail(val, MSG(val, "expected instruction 'argconst_s' but got '%s'"), val->cur_info->name); return; regular_arg: switch (val->cur_info->opcode) { case MVM_OP_arg_o: if(!(flags & MVM_CALLSITE_ARG_OBJ)) goto fail_arg; break; case MVM_OP_arg_s: if(!(flags & MVM_CALLSITE_ARG_STR)) goto fail_arg; break; case MVM_OP_argconst_s: if(!(flags & MVM_CALLSITE_ARG_STR)) goto fail_arg; break; case MVM_OP_arg_i: if(!(flags & MVM_CALLSITE_ARG_INT)) goto fail_arg; break; case MVM_OP_arg_n: if(!(flags & MVM_CALLSITE_ARG_NUM)) goto fail_arg; break; default: fail(val, MSG(val, "unexpected instruction '%s' during argument preparation"), val->cur_info->name); fail_arg: fail(val, MSG(val, "invalid argument (%i) for instruction %s"), (int)flags, val->cur_info->name); } } static void validate_block(Validator *val) { int block_id = val->cur_mark[1]; switch (block_id) { case 'a': { MVMuint16 index; ensure_op(val, MVM_OP_prepargs); validate_operands(val); index = GET_UI16(val->cur_op, -2); val->cur_call = val->cu->body.callsites[index]; val->cur_arg = 0; val->expected_named_arg = 0; val->remaining_args = val->cur_call->arg_count; val->remaining_positionals = val->cur_call->num_pos; break; } default: fail(val, MSG(val, "unknown instruction block '%c'"), block_id); } while (val->cur_op < val->bc_end) { int type, id; read_op(val); type = val->cur_mark[0]; id = val->cur_mark[1]; if (id != block_id) fail(val, MSG(val, "expected instruction marked '%c' but got '%c'"), block_id, id); switch (type) { case MARK_body: break; case MARK_tail: goto terminate_block; default: fail_illegal_mark(val); } switch (block_id) { case 'a': validate_operands(val); validate_arg(val); break; } } terminate_block: switch (block_id) { case 'a': validate_operands(val); ensure_no_remaining_positionals(val); break; } } /* Validate that a static frame's bytecode is executable by the interpreter. */ void MVM_validate_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame) { MVMStaticFrameBody *fb = &static_frame->body; Validator val[1]; val->tc = tc; val->cu = fb->cu; val->frame = static_frame; val->loc_count = fb->num_locals; val->loc_types = fb->local_types; val->bc_size = fb->bytecode_size; val->src_cur_op = fb->bytecode; val->src_bc_end = fb->bytecode + fb->bytecode_size; val->labels = MVM_calloc(fb->bytecode_size, 1); val->cur_info = NULL; val->cur_mark = NULL; val->cur_instr = 0; val->cur_call = NULL; val->cur_arg = 0; val->expected_named_arg = 0; val->remaining_positionals = 0; val->remaining_jumplabels = 0; val->reg_type_var = 0; #ifdef MVM_BIGENDIAN assert(fb->bytecode == fb->orig_bytecode); val->bc_start = MVM_malloc(fb->bytecode_size); memset(val->bc_start, 0xDB, fb->bytecode_size); fb->bytecode = val->bc_start; #else val->bc_start = fb->bytecode; #endif val->bc_end = val->bc_start + fb->bytecode_size; val->cur_op = val->bc_start; while (val->cur_op < val->bc_end) { read_op(val); if (val->cur_mark && val->cur_mark[0] == 's') fail(val, MSG(val, "Illegal appearance of spesh op")); switch (val->cur_mark[0]) { case MARK_regular: case MARK_special: validate_operands(val); break; case MARK_sequence: validate_sequence(val); break; case MARK_head: validate_block(val); break; default: fail_illegal_mark(val); } } validate_branch_targets(val); validate_final_return(val); /* Validation successful. Cache the located instruction offsets. */ fb->instr_offsets = val->labels; } /* Returns MVM_BC_ILLEGAL_OFFSET if the offset is out of range or does not * point to an op boundary. */ MVMuint32 MVM_bytecode_offset_to_instr_idx(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMuint32 offset) { MVMuint8 *labels = static_frame->body.instr_offsets; MVMuint32 i, idx = 0; if (offset >= static_frame->body.bytecode_size || (labels[offset] & MVM_BC_op_boundary) == 0) return MVM_BC_ILLEGAL_OFFSET; for (i = 0; i < offset; i++) { if (labels[i] & MVM_BC_op_boundary) idx++; } return idx; } MoarVM-2015.11/src/core/validation.h0000644000175000017500000000051612456307241016100 0ustar jnthnjnthn#define MVM_BC_ILLEGAL_OFFSET ((MVMuint32)-1) enum { MVM_BC_branch_target = 1 << 0, MVM_BC_op_boundary = 1 << 1, }; void MVM_validate_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame); MVMuint32 MVM_bytecode_offset_to_instr_idx(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMuint32 offset); MoarVM-2015.11/src/gc/allocation.c0000644000175000017500000001034712456307241015532 0ustar jnthnjnthn/* Allocation of managed memory - that is, from the memory space that is * managed by the garbage collector. Memory that is in turn owned by a * GC-able object will be allocated separately and freed explicitly by * its REPR gc_free routine. */ #include "moar.h" /* Allocate the specified amount of memory from the nursery. Will * trigger a GC run if there is not enough. */ void * MVM_gc_allocate_nursery(MVMThreadContext *tc, size_t size) { void *allocated; /* Before an allocation is a GC safe-point and thus a good GC sync point * also; check if we've been signalled to collect. */ /* Don't use a MVM_load(&tc->gc_status) here for performance, it's okay * if the interrupt is delayed a bit. */ if (tc->gc_status) MVM_gc_enter_from_interrupt(tc); /* Guard against 0-byte allocation. */ if (size > 0) { /* Do a GC run if this allocation won't fit in what we have * left in the nursery. Note this is a loop to handle a * pathological case: all the objects in the nursery are very * young and thus survive in the nursery, meaning that no space * actually gets freed up. The next run will promote them to the * second generation. Note that this circumstance is exceptionally * unlikely in any non-contrived situation. */ while ((char *)tc->nursery_alloc + size >= (char *)tc->nursery_alloc_limit) { if (size > MVM_NURSERY_SIZE) MVM_panic(MVM_exitcode_gcalloc, "Attempt to allocate more than the maximum nursery size"); MVM_gc_enter_from_allocator(tc); } /* Allocate (just bump the pointer). */ allocated = tc->nursery_alloc; tc->nursery_alloc = (char *)tc->nursery_alloc + size; } else { MVM_panic(MVM_exitcode_gcalloc, "Cannot allocate 0 bytes of memory in the nursery"); } return allocated; } /* Same as MVM_gc_allocate, but promises that the memory will be zeroed. */ void * MVM_gc_allocate_zeroed(MVMThreadContext *tc, size_t size) { /* At present, MVM_gc_allocate always returns zeroed memory. */ return MVM_gc_allocate(tc, size); } /* Allocates a new STable, based on the specified thread context, REPR * and meta-object. */ MVMSTable * MVM_gc_allocate_stable(MVMThreadContext *tc, const MVMREPROps *repr, MVMObject *how) { MVMSTable *st; MVMROOT(tc, how, { st = MVM_gc_allocate_zeroed(tc, sizeof(MVMSTable)); st->header.flags |= MVM_CF_STABLE; st->header.size = sizeof(MVMSTable); st->header.owner = tc->thread_id; st->REPR = repr; st->invoke = MVM_6model_invoke_default; st->type_cache_id = MVM_6model_next_type_cache_id(tc); MVM_ASSIGN_REF(tc, &(st->header), st->HOW, how); }); return st; } /* Allocates a new type object. */ MVMObject * MVM_gc_allocate_type_object(MVMThreadContext *tc, MVMSTable *st) { MVMObject *obj; MVMROOT(tc, st, { obj = MVM_gc_allocate_zeroed(tc, sizeof(MVMObject)); obj->header.flags |= MVM_CF_TYPE_OBJECT; obj->header.size = sizeof(MVMObject); obj->header.owner = tc->thread_id; MVM_ASSIGN_REF(tc, &(obj->header), obj->st, st); }); return obj; } /* Allocates a new object, and points it at the specified STable. */ MVMObject * MVM_gc_allocate_object(MVMThreadContext *tc, MVMSTable *st) { MVMObject *obj; MVMROOT(tc, st, { obj = MVM_gc_allocate_zeroed(tc, st->size); obj->header.size = (MVMuint16)st->size; obj->header.owner = tc->thread_id; MVM_ASSIGN_REF(tc, &(obj->header), obj->st, st); if ((obj->header.flags & MVM_CF_SECOND_GEN)) if (REPR(obj)->refs_frames) MVM_gc_root_gen2_add(tc, (MVMCollectable *)obj); if (st->mode_flags & MVM_FINALIZE_TYPE) MVM_gc_finalize_add_to_queue(tc, obj); }); return obj; } /* Sets allocate for this thread to be from the second generation by * default. */ void MVM_gc_allocate_gen2_default_set(MVMThreadContext *tc) { tc->allocate_in_gen2++; } /* Sets allocation for this thread to be from the nursery by default. */ void MVM_gc_allocate_gen2_default_clear(MVMThreadContext *tc) { tc->allocate_in_gen2--; } MoarVM-2015.11/src/gc/allocation.h0000644000175000017500000000131612534320622015526 0ustar jnthnjnthnvoid * MVM_gc_allocate_nursery(MVMThreadContext *tc, size_t size); void * MVM_gc_allocate_zeroed(MVMThreadContext *tc, size_t size); MVMSTable * MVM_gc_allocate_stable(MVMThreadContext *tc, const MVMREPROps *repr, MVMObject *how); MVMObject * MVM_gc_allocate_type_object(MVMThreadContext *tc, MVMSTable *st); MVMObject * MVM_gc_allocate_object(MVMThreadContext *tc, MVMSTable *st); void MVM_gc_allocate_gen2_default_set(MVMThreadContext *tc); void MVM_gc_allocate_gen2_default_clear(MVMThreadContext *tc); MVM_STATIC_INLINE void * MVM_gc_allocate(MVMThreadContext *tc, size_t size) { return tc->allocate_in_gen2 ? MVM_gc_gen2_allocate_zeroed(tc->gen2, size) : MVM_gc_allocate_nursery(tc, size); } MoarVM-2015.11/src/gc/collect.c0000644000175000017500000010443112573775575015053 0ustar jnthnjnthn#include "moar.h" /* Combines a piece of work that will be passed to another thread with the * ID of the target thread to pass it to. */ typedef struct { MVMuint32 target; MVMGCPassedWork *work; } ThreadWork; /* Current chunks of work we're building up to pass. */ typedef struct { MVMuint32 num_target_threads; ThreadWork *target_work; } WorkToPass; /* Forward decls. */ static void process_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, WorkToPass *wtp, MVMuint8 gen); static void pass_work_item(MVMThreadContext *tc, WorkToPass *wtp, MVMCollectable **item_ptr); static void pass_leftover_work(MVMThreadContext *tc, WorkToPass *wtp); static void add_in_tray_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); /* Does a garbage collection run. Exactly what it does is configured by the * couple of arguments that it takes. * * The what_to_do argument specifies where it should look for things to add * to the worklist: everywhere, just at thread local stuff, or just in the * thread's in-tray. * * The gen argument specifies whether to collect the nursery or both of the * generations. Nursery collection is done by semi-space copying. Once an * object is seen/copied once in the nursery (may be tuned in the future to * twice or so - we'll see) then it is not copied to tospace, but instead * promoted to the second generation. If we are collecting generation 2 also, * then objects that are alive in the second generation are simply marked. * Since the second generation is managed as a set of sized pools, there is * much less motivation for any kind of copying/compaction; the internal * fragmentation that makes finding a right-sized gap problematic will not * happen. * * Note that it adds the roots and processes them in phases, to try to avoid * building up a huge worklist. */ void MVM_gc_collect(MVMThreadContext *tc, MVMuint8 what_to_do, MVMuint8 gen) { /* Create a GC worklist. */ MVMGCWorklist *worklist = MVM_gc_worklist_create(tc, gen != MVMGCGenerations_Nursery); /* Initialize work passing data structure. */ WorkToPass wtp; wtp.num_target_threads = 0; wtp.target_work = NULL; /* See what we need to work on this time. */ if (what_to_do == MVMGCWhatToDo_InTray) { /* We just need to process anything in the in-tray. */ add_in_tray_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from in tray \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } else if (what_to_do == MVMGCWhatToDo_Finalizing) { /* Need to process the finalizing queue. */ MVMuint32 i; for (i = 0; i < tc->num_finalizing; i++) MVM_gc_worklist_add(tc, worklist, &(tc->finalizing[i])); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from finalizing \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } else { /* Main collection run. Swap fromspace and tospace. */ void * fromspace = tc->nursery_tospace; void * tospace = tc->nursery_fromspace; tc->nursery_fromspace = fromspace; tc->nursery_tospace = tospace; /* Reset nursery allocation pointers to the new tospace. */ tc->nursery_alloc = tospace; tc->nursery_alloc_limit = (char *)tc->nursery_alloc + MVM_NURSERY_SIZE; MVM_gc_worklist_add(tc, worklist, &tc->thread_obj); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from thread_obj\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Add permanent roots and process them; only one thread will do * this, since they are instance-wide. */ if (what_to_do != MVMGCWhatToDo_NoInstance) { MVM_gc_root_add_permanents_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from instance permanents\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); MVM_gc_root_add_instance_roots_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from instance roots\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Add per-thread state to worklist and process it. */ MVM_gc_root_add_tc_roots_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from TC objects\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Add current frame to worklist. */ MVM_gc_worklist_add_frame(tc, worklist, tc->cur_frame); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from current frame\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Add temporary roots and process them (these are per-thread). */ MVM_gc_root_add_temps_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from thread temps\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Add things that are roots for the first generation because they are * pointed to by objects in the second generation and process them * (also per-thread). Note we need not do this if we're doing a full * collection anyway (in fact, we must not for correctness, otherwise * the gen2 rooting keeps them alive forever). */ if (gen == MVMGCGenerations_Nursery) { MVM_gc_root_add_gen2s_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from gen2 \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Find roots in frames and process them. */ if (tc->cur_frame) { MVM_gc_worklist_add_frame(tc, worklist, tc->cur_frame); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from cur_frame \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Process anything in the in-tray. */ add_in_tray_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from in tray \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* At this point, we have probably done most of the work we will * need to (only get more if another thread passes us more); zero * out the remaining tospace. */ memset(tc->nursery_alloc, 0, (char *)tc->nursery_alloc_limit - (char *)tc->nursery_alloc); } /* Destroy the worklist. */ MVM_gc_worklist_destroy(tc, worklist); /* Pass any work for other threads we accumulated but that didn't trigger * the work passing threshold, then cleanup work passing list. */ if (wtp.num_target_threads) { pass_leftover_work(tc, &wtp); MVM_free(wtp.target_work); } } /* Processes the current worklist. */ static void process_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, WorkToPass *wtp, MVMuint8 gen) { MVMGen2Allocator *gen2; MVMCollectable **item_ptr; MVMCollectable *new_addr; MVMuint32 gen2count; /* Grab the second generation allocator; we may move items into the * old generation. */ gen2 = tc->gen2; MVM_gc_worklist_mark_frame_roots(tc, worklist); while ((item_ptr = MVM_gc_worklist_get(tc, worklist))) { /* Dereference the object we're considering. */ MVMCollectable *item = *item_ptr; MVMuint8 item_gen2; MVMuint8 to_gen2 = 0; /* If the item is NULL, that's fine - it's just a null reference and * thus we've no object to consider. */ if (item == NULL) continue; /* If it's in the second generation and we're only doing a nursery, * collection, we have nothing to do. */ item_gen2 = item->flags & MVM_CF_SECOND_GEN; if (item_gen2) { if (gen == MVMGCGenerations_Nursery) continue; if (item->flags & MVM_CF_GEN2_LIVE) { /* gen2 and marked as live. */ continue; } } else if (item->flags & MVM_CF_FORWARDER_VALID) { /* If the item was already seen and copied, then it will have a * forwarding address already. Just update this pointer to the * new address and we're done. */ assert(*item_ptr != item->sc_forward_u.forwarder); if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT)) { if (*item_ptr != item->sc_forward_u.forwarder) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : updating handle %p from %p to forwarder %p\n", item_ptr, item, item->sc_forward_u.forwarder); } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : already visited handle %p to forwarder %p\n", item_ptr, item->sc_forward_u.forwarder); } } *item_ptr = item->sc_forward_u.forwarder; continue; } else { /* If the pointer is already into tospace (the bit we've already copied into), we already updated it, so we're done. */ if (item >= (MVMCollectable *)tc->nursery_tospace && item < (MVMCollectable *)tc->nursery_alloc) { continue; } } /* If it's owned by a different thread, we need to pass it over to * the owning thread. */ if (item->owner != tc->thread_id) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : sending a handle %p to object %p to thread %d\n", item_ptr, item, item->owner); pass_work_item(tc, wtp, item_ptr); continue; } /* If it's in to-space but *ahead* of our copy offset then it's an out-of-date pointer and we have some kind of corruption. */ if (item >= (MVMCollectable *)tc->nursery_alloc && item < (MVMCollectable *)tc->nursery_alloc_limit) MVM_panic(1, "Heap corruption detected: pointer %p to past fromspace", item); /* At this point, we didn't already see the object, which means we * need to take some action. Go on the generation... */ if (item_gen2) { assert(!(item->flags & MVM_CF_FORWARDER_VALID)); /* It's in the second generation. We'll just mark it. */ new_addr = item; if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : handle %p was already %p\n", item_ptr, new_addr); } item->flags |= MVM_CF_GEN2_LIVE; assert(*item_ptr == new_addr); } else { /* Catch NULL stable (always sign of trouble) in debug mode. */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && !STABLE(item)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : found a zeroed handle %p to object %p\n", item_ptr, item); printf("%d", ((MVMCollectable *)1)->owner); } /* Did we see it in the nursery before, or should we move it to * gen2 anyway since it a persistent ID was requested? */ if (item->flags & (MVM_CF_NURSERY_SEEN | MVM_CF_HAS_OBJECT_ID)) { /* Yes; we should move it to the second generation. Allocate * space in the second generation. */ to_gen2 = 1; new_addr = item->flags & MVM_CF_HAS_OBJECT_ID ? MVM_gc_object_id_use_allocation(tc, item) : MVM_gc_gen2_allocate(gen2, item->size); /* Add on to the promoted amount (used by profiler). */ tc->gc_promoted_bytes += item->size; /* Copy the object to the second generation and mark it as * living there. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : copying an object %p of size %d to gen2 %p\n", item, item->size, new_addr); memcpy(new_addr, item, item->size); new_addr->flags ^= MVM_CF_NURSERY_SEEN; new_addr->flags |= MVM_CF_SECOND_GEN; /* If it references frames or static frames, we need to keep * on visiting it. */ if (!(new_addr->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { MVMObject *new_obj_addr = (MVMObject *)new_addr; if (REPR(new_obj_addr)->refs_frames) MVM_gc_root_gen2_add(tc, (MVMCollectable *)new_obj_addr); } /* If we're going to sweep the second generation, also need * to mark it as live. */ if (gen == MVMGCGenerations_Both) new_addr->flags |= MVM_CF_GEN2_LIVE; } else { /* No, so it will live in the nursery for another GC * iteration. Allocate space in the nursery. */ new_addr = (MVMCollectable *)tc->nursery_alloc; tc->nursery_alloc = (char *)tc->nursery_alloc + item->size; GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : copying an object %p (reprid %d) of size %d to tospace %p\n", item, REPR(item)->ID, item->size, new_addr); /* Copy the object to tospace and mark it as seen in the * nursery (so the next time around it will move to the * older generation, if it survives). */ memcpy(new_addr, item, item->size); new_addr->flags |= MVM_CF_NURSERY_SEEN; } /* Store the forwarding pointer and update the original * reference. */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && new_addr != item) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : updating handle %p from referent %p (reprid %d) to %p\n", item_ptr, item, REPR(item)->ID, new_addr); } *item_ptr = new_addr; item->sc_forward_u.forwarder = new_addr; /* Set the flag on the copy of item *in fromspace* to mark that the forwarder pointer is valid. */ item->flags |= MVM_CF_FORWARDER_VALID; } /* make sure any rooted frames mark their stuff */ MVM_gc_worklist_mark_frame_roots(tc, worklist); /* Finally, we need to mark the collectable (at its moved address). * Track how many items we had before we mark it, in case we need * to write barrier them post-move to uphold the generational * invariant. */ gen2count = worklist->items; MVM_gc_mark_collectable(tc, worklist, new_addr); /* make sure any rooted frames mark their stuff */ MVM_gc_worklist_mark_frame_roots(tc, worklist); /* In moving an object to generation 2, we may have left it pointing * to nursery objects. If so, make sure it's in the gen2 roots. */ if (to_gen2) { MVMCollectable **j; MVMuint32 max = worklist->items, k; for (k = gen2count; k < max; k++) { j = worklist->list[k]; if (*j) MVM_gc_write_barrier(tc, new_addr, *j); } } } } /* Marks a collectable item (object, type object, STable). */ void MVM_gc_mark_collectable(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable *new_addr) { MVMuint16 i; MVMuint32 sc_idx; assert(!(new_addr->flags & MVM_CF_FORWARDER_VALID)); /*assert(REPR(new_addr));*/ sc_idx = MVM_get_idx_of_sc(new_addr); if (sc_idx > 0) MVM_gc_worklist_add(tc, worklist, &(tc->instance->all_scs[sc_idx]->sc)); if (!(new_addr->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { /* Need to view it as an object in here. */ MVMObject *new_addr_obj = (MVMObject *)new_addr; /* Add the STable to the worklist. */ MVM_gc_worklist_add(tc, worklist, &new_addr_obj->st); /* If needed, mark it. This will add addresses to the worklist * that will need updating. Note that we are passing the address * of the object *after* copying it since those are the addresses * we care about updating; the old chunk of memory is now dead! */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && !STABLE(new_addr_obj)) MVM_panic(MVM_exitcode_gcnursery, "Found an outdated reference to address %p", new_addr); if (REPR(new_addr_obj)->gc_mark) REPR(new_addr_obj)->gc_mark(tc, STABLE(new_addr_obj), OBJECT_BODY(new_addr_obj), worklist); } else if (new_addr->flags & MVM_CF_TYPE_OBJECT) { /* Add the STable to the worklist. */ MVM_gc_worklist_add(tc, worklist, &((MVMObject *)new_addr)->st); } else if (new_addr->flags & MVM_CF_STABLE) { /* Add all references in the STable to the work list. */ MVMSTable *new_addr_st = (MVMSTable *)new_addr; MVM_gc_worklist_add(tc, worklist, &new_addr_st->method_cache); for (i = 0; i < new_addr_st->type_check_cache_length; i++) MVM_gc_worklist_add(tc, worklist, &new_addr_st->type_check_cache[i]); if (new_addr_st->container_spec) if (new_addr_st->container_spec->gc_mark_data) new_addr_st->container_spec->gc_mark_data(tc, new_addr_st, worklist); if (new_addr_st->boolification_spec) MVM_gc_worklist_add(tc, worklist, &new_addr_st->boolification_spec->method); if (new_addr_st->invocation_spec) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->class_handle); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->attr_name); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->invocation_handler); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_class_handle); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_cache_attr_name); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_valid_attr_name); } MVM_gc_worklist_add(tc, worklist, &new_addr_st->WHO); MVM_gc_worklist_add(tc, worklist, &new_addr_st->WHAT); MVM_gc_worklist_add(tc, worklist, &new_addr_st->HOW); MVM_gc_worklist_add(tc, worklist, &new_addr_st->HOW_sc); MVM_gc_worklist_add(tc, worklist, &new_addr_st->method_cache_sc); if (new_addr_st->mode_flags & MVM_PARAMETRIC_TYPE) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.ric.parameterizer); MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.ric.lookup); } else if (new_addr_st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.erized.parametric_type); MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.erized.parameters); } /* If it needs to have its REPR data marked, do that. */ if (new_addr_st->REPR->gc_mark_repr_data) new_addr_st->REPR->gc_mark_repr_data(tc, new_addr_st, worklist); } else { MVM_panic(MVM_exitcode_gcnursery, "Internal error: impossible case encountered in GC marking"); } } /* Adds a chunk of work to another thread's in-tray. */ static void push_work_to_thread_in_tray(MVMThreadContext *tc, MVMuint32 target, MVMGCPassedWork *work) { MVMGCPassedWork * volatile *target_tray; /* Locate the thread to pass the work to. */ MVMThreadContext *target_tc = NULL; if (target == 1) { /* It's going to the main thread. */ target_tc = tc->instance->main_thread; } else { MVMThread *t = (MVMThread *)MVM_load(&tc->instance->threads); do { if (t->body.tc && t->body.tc->thread_id == target) { target_tc = t->body.tc; break; } } while ((t = t->body.next)); if (!target_tc) MVM_panic(MVM_exitcode_gcnursery, "Internal error: invalid thread ID %d in GC work pass", target); } /* Pass the work, chaining any other in-tray entries for the thread * after us. */ target_tray = &target_tc->gc_in_tray; while (1) { MVMGCPassedWork *orig = *target_tray; work->next = orig; if (MVM_casptr(target_tray, orig, work) == orig) return; } } /* Adds work to list of items to pass over to another thread, and if we * reach the pass threshold then does the passing. */ static void pass_work_item(MVMThreadContext *tc, WorkToPass *wtp, MVMCollectable **item_ptr) { ThreadWork *target_info = NULL; MVMuint32 target = (*item_ptr)->owner; MVMuint32 j; /* Find any existing thread work passing list for the target. */ if (target == 0) MVM_panic(MVM_exitcode_gcnursery, "Internal error: zeroed target thread ID in work pass"); for (j = 0; j < wtp->num_target_threads; j++) { if (wtp->target_work[j].target == target) { target_info = &wtp->target_work[j]; break; } } /* If there's no entry for this target, create one. */ if (target_info == NULL) { wtp->num_target_threads++; wtp->target_work = MVM_realloc(wtp->target_work, wtp->num_target_threads * sizeof(ThreadWork)); target_info = &wtp->target_work[wtp->num_target_threads - 1]; target_info->target = target; target_info->work = NULL; } /* See if there's a currently active list; create it if not. */ if (!target_info->work) { target_info->work = MVM_calloc(sizeof(MVMGCPassedWork), 1); } /* Add this item to the work list. */ target_info->work->items[target_info->work->num_items] = item_ptr; target_info->work->num_items++; /* If we've hit the limit, pass this work to the target thread. */ if (target_info->work->num_items == MVM_GC_PASS_WORK_SIZE) { push_work_to_thread_in_tray(tc, target, target_info->work); target_info->work = NULL; } } /* Passes all work for other threads that we've got left in our to-pass list. */ static void pass_leftover_work(MVMThreadContext *tc, WorkToPass *wtp) { MVMuint32 j; for (j = 0; j < wtp->num_target_threads; j++) if (wtp->target_work[j].work) push_work_to_thread_in_tray(tc, wtp->target_work[j].target, wtp->target_work[j].work); } /* Takes work in a thread's in-tray, if any, and adds it to the worklist. */ static void add_in_tray_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMGCPassedWork * volatile *in_tray = &tc->gc_in_tray; MVMGCPassedWork *head; /* Get work to process. */ while (1) { /* See if there's anything in the in-tray; if not, we're done. */ head = *in_tray; if (head == NULL) return; /* Otherwise, try to take it. */ if (MVM_casptr(in_tray, head, NULL) == head) break; } /* Go through list, adding to worklist. */ while (head) { MVMGCPassedWork *next = head->next; MVMuint32 i; for (i = 0; i < head->num_items; i++) MVM_gc_worklist_add(tc, worklist, head->items[i]); MVM_free(head); head = next; } } /* Save dead STable pointers to delete later.. */ static void MVM_gc_collect_enqueue_stable_for_deletion(MVMThreadContext *tc, MVMSTable *st) { MVMSTable *old_head; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX assert(!(st->header.flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED)); #endif do { old_head = tc->instance->stables_to_free; st->header.sc_forward_u.st = old_head; } while (!MVM_trycas(&tc->instance->stables_to_free, old_head, st)); } /* Some objects, having been copied, need no further attention. Others * need to do some additional freeing, however. This goes through the * fromspace and does any needed work to free uncopied things (this may * run in parallel with the mutator, which will be operating on tospace). */ void MVM_gc_collect_free_nursery_uncopied(MVMThreadContext *tc, void *limit) { /* We start scanning the fromspace, and keep going until we hit * the end of the area allocated in it. */ void *scan = tc->nursery_fromspace; while (scan < limit) { /* The object here is dead if it never got a forwarding pointer * written in to it. */ MVMCollectable *item = (MVMCollectable *)scan; MVMuint8 dead = !(item->flags & MVM_CF_FORWARDER_VALID); if (!dead) assert(item->sc_forward_u.forwarder != NULL); /* Now go by collectable type. */ if (!(item->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { /* Object instance. If dead, call gc_free if needed. Scan is * incremented by object size. */ MVMObject *obj = (MVMObject *)item; GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : collecting an object %p in the nursery with reprid %d\n", item, REPR(obj)->ID); if (dead && REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (dead && item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(item->sc_forward_u.sci); #endif if (dead && item->flags & MVM_CF_HAS_OBJECT_ID) MVM_gc_object_id_clear(tc, item); } else if (item->flags & MVM_CF_TYPE_OBJECT) { /* Type object */ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (dead && item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(item->sc_forward_u.sci); #endif if (dead && item->flags & MVM_CF_HAS_OBJECT_ID) MVM_gc_object_id_clear(tc, item); } else if (item->flags & MVM_CF_STABLE) { MVMSTable *st = (MVMSTable *)item; if (dead) { /* GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : enqueuing an STable %d in the nursery to be freed\n", item);*/ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { MVM_free(item->sc_forward_u.sci); /* Arguably we don't need to do this, if we're always consistent about what we put on the stable queue. */ item->flags &= ~MVM_CF_SERIALZATION_INDEX_ALLOCATED; } #endif MVM_gc_collect_enqueue_stable_for_deletion(tc, st); } } else { printf("item flags: %d\n", item->flags); MVM_panic(MVM_exitcode_gcnursery, "Internal error: impossible case encountered in GC free"); } /* Go to the next item. */ scan = (char *)scan + item->size; } } /* Free STables (in any thread/generation!) queued to be freed. */ void MVM_gc_collect_free_stables(MVMThreadContext *tc) { MVMSTable *st = tc->instance->stables_to_free; while (st) { MVMSTable *st_to_free = st; st = st_to_free->header.sc_forward_u.st; st_to_free->header.sc_forward_u.st = NULL; MVM_6model_stable_gc_free(tc, st_to_free); } tc->instance->stables_to_free = NULL; } /* Goes through the unmarked objects in the second generation heap and builds * free lists out of them. Also does any required finalization. */ void MVM_gc_collect_free_gen2_unmarked(MVMThreadContext *tc, MVMint32 global_destruction) { /* Visit each of the size class bins. */ MVMGen2Allocator *gen2 = tc->gen2; MVMuint32 bin, obj_size, page, i; char ***freelist_insert_pos; for (bin = 0; bin < MVM_GEN2_BINS; bin++) { /* If we've nothing allocated in this size class, skip it. */ if (gen2->size_classes[bin].pages == NULL) continue; /* Calculate object size for this bin. */ obj_size = (bin + 1) << MVM_GEN2_BIN_BITS; /* freelist_insert_pos is a pointer to a memory location that * stores the address of the last traversed free list node (char **). */ /* Initialize freelist insertion position to free list head. */ freelist_insert_pos = &gen2->size_classes[bin].free_list; /* Visit each page. */ for (page = 0; page < gen2->size_classes[bin].num_pages; page++) { /* Visit all the objects, looking for dead ones and reset the * mark for each of them. */ char *cur_ptr = gen2->size_classes[bin].pages[page]; char *end_ptr = page + 1 == gen2->size_classes[bin].num_pages ? gen2->size_classes[bin].alloc_pos : cur_ptr + obj_size * MVM_GEN2_PAGE_ITEMS; while (cur_ptr < end_ptr) { MVMCollectable *col = (MVMCollectable *)cur_ptr; /* Is this already a free list slot? If so, it becomes the * new free list insert position. */ if (*freelist_insert_pos == (char **)cur_ptr) { freelist_insert_pos = (char ***)cur_ptr; } /* Otherwise, it must be a collectable of some kind. Is it * live? */ else if (col->flags & MVM_CF_GEN2_LIVE) { /* Yes; clear the mark. */ col->flags &= ~MVM_CF_GEN2_LIVE; } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : collecting an object %p in the gen2\n", col); /* No, it's dead. Do any cleanup. */ if (!(col->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { /* Object instance; call gc_free if needed. */ MVMObject *obj = (MVMObject *)col; if (STABLE(obj) && REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } else if (col->flags & MVM_CF_TYPE_OBJECT) { #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } else if (col->flags & MVM_CF_STABLE) { if ( #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX !(col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) && #endif col->sc_forward_u.sc.sc_idx == 0 && col->sc_forward_u.sc.idx == MVM_DIRECT_SC_IDX_SENTINEL) { /* We marked it dead last time, kill it. */ MVM_6model_stable_gc_free(tc, (MVMSTable *)col); } else { #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { /* Whatever happens next, we can free this memory immediately, because no-one will be serializing a dead STable. */ assert(!(col->sc_forward_u.sci->sc_idx == 0 && col->sc_forward_u.sci->idx == MVM_DIRECT_SC_IDX_SENTINEL)); MVM_free(col->sc_forward_u.sci); col->flags &= ~MVM_CF_SERIALZATION_INDEX_ALLOCATED; } #endif if (global_destruction) { /* We're in global destruction, so enqueue to the end * like we do in the nursery */ MVM_gc_collect_enqueue_stable_for_deletion(tc, (MVMSTable *)col); } else { /* There will definitely be another gc run, so mark it as "died last time". */ col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = MVM_DIRECT_SC_IDX_SENTINEL; } /* Skip the freelist updating. */ cur_ptr += obj_size; continue; } } else { printf("item flags: %d\n", col->flags); MVM_panic(MVM_exitcode_gcnursery, "Internal error: impossible case encountered in gen2 GC free"); } /* Chain in to the free list. */ *((char **)cur_ptr) = (char *)*freelist_insert_pos; *freelist_insert_pos = (char **)cur_ptr; /* Update the pointer to the insert position to point to us */ freelist_insert_pos = (char ***)cur_ptr; } /* Move to the next object. */ cur_ptr += obj_size; } } } /* Also need to consider overflows. */ for (i = 0; i < gen2->num_overflows; i++) { if (gen2->overflows[i]) { MVMCollectable *col = gen2->overflows[i]; if (col->flags & MVM_CF_GEN2_LIVE) { /* A living over-sized object; just clear the mark. */ col->flags &= ~MVM_CF_GEN2_LIVE; } else { /* Dead over-sized object. We know if it's this big it cannot * be a type object or STable, so only need handle the simple * object case. */ if (!(col->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { MVMObject *obj = (MVMObject *)col; if (REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } else { MVM_panic(MVM_exitcode_gcnursery, "Internal error: gen2 overflow contains non-object"); } MVM_free(col); gen2->overflows[i] = NULL; } } } /* And finally compact the overflow list */ MVM_gc_gen2_compact_overflows(gen2); } MoarVM-2015.11/src/gc/collect.h0000644000175000017500000000417612573775575015065 0ustar jnthnjnthn/* How big is the nursery area? Note that since it's semi-space copying, we * actually have double this amount allocated. Also it is per thread. (In * the future, we'll make this adaptive rather than a constant.) */ #define MVM_NURSERY_SIZE 4194304 /* How many bytes should have been promoted into gen2 before we decide to * do a full GC run? The numbers below are used as a base amount plus an * extra amount per extra thread we have running. */ #define MVM_GC_GEN2_THRESHOLD_BASE (30 * 1024 * 1024) #define MVM_GC_GEN2_THRESHOLD_THREAD (2 * 1024 * 1024) /* What things should be processed in this GC run? */ typedef enum { /* Everything, including the instance-wide roots. If we have many * active threads, only one thread will be set to do this. */ MVMGCWhatToDo_All = 0, /* Everything except the instance-wide roots. */ MVMGCWhatToDo_NoInstance = 1, /* Only process the in-tray of work given by other threads. */ MVMGCWhatToDo_InTray = 2, /* Only process the finalizing list. */ MVMGCWhatToDo_Finalizing = 4 } MVMGCWhatToDo; /* What generation(s) to collect? */ typedef enum { /* Only the nursery. */ MVMGCGenerations_Nursery = 0, /* Both the nursery and generation 2. */ MVMGCGenerations_Both = 1 } MVMGCGenerations; /* The number of items we must reach in a bucket of work before passing it * off to the next thread. (Power of 2, minus 2, is a decent choice.) */ #define MVM_GC_PASS_WORK_SIZE 62 /* Represents a piece of work (some addresses to visit) that have been passed * from one thread doing GC to another thread doing GC. */ struct MVMGCPassedWork { MVMCollectable **items[MVM_GC_PASS_WORK_SIZE]; MVMGCPassedWork *next; MVMint32 num_items; }; /* Functions. */ void MVM_gc_collect(MVMThreadContext *tc, MVMuint8 what_to_do, MVMuint8 gen); void MVM_gc_collect_free_nursery_uncopied(MVMThreadContext *tc, void *limit); void MVM_gc_collect_free_gen2_unmarked(MVMThreadContext *tc, MVMint32 global_destruction); void MVM_gc_mark_collectable(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable *item); void MVM_gc_collect_free_stables(MVMThreadContext *tc); MoarVM-2015.11/src/gc/debug.h0000644000175000017500000000055712456307241014502 0ustar jnthnjnthn/* Include this file after moar.h in a source file to get some help with GC * debugging. */ #define MVM_ASSERT_NOT_FROMSPACE(tc, c) do { \ if ((char *)(c) >= (char *)tc->nursery_fromspace && \ (char *)(c) < (char *)tc->nursery_fromspace + MVM_NURSERY_SIZE) \ MVM_exception_throw_adhoc(tc, "Collectable in fromspace accessed"); \ } while (0) MoarVM-2015.11/src/gc/finalize.c0000644000175000017500000001071212456310506015200 0ustar jnthnjnthn#include "moar.h" /* Turns finalization on or off for a type. */ void MVM_gc_finalize_set(MVMThreadContext *tc, MVMObject *type, MVMint64 finalize) { MVMSTable *st = STABLE(type); MVMint64 new_flags = st->mode_flags & (~MVM_FINALIZE_TYPE); if (finalize) new_flags |= MVM_FINALIZE_TYPE; st->mode_flags = new_flags; MVM_SC_WB_ST(tc, st); } /* Adds an object we've just allocated to the queue of those with finalizers * that will need calling upon collection. */ void MVM_gc_finalize_add_to_queue(MVMThreadContext *tc, MVMObject *obj) { if (tc->num_finalize == tc->alloc_finalize) { if (tc->alloc_finalize) tc->alloc_finalize *= 2; else tc->alloc_finalize = 64; tc->finalize = MVM_realloc(tc->finalize, sizeof(MVMCollectable **) * tc->alloc_finalize); } tc->finalize[tc->num_finalize] = obj; tc->num_finalize++; } /* Sets the passed thread context's thread up so that we'll run a finalize * handler on it in the near future. */ static void finalize_handler_caller(MVMThreadContext *tc, void *sr_data) { MVMObject *handler = MVM_hll_current(tc)->finalize_handler; if (handler) { MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); /* Drain the finalizing queue to an array. */ MVMObject *drain = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); while (tc->num_finalizing > 0) MVM_repr_push_o(tc, drain, tc->finalizing[--tc->num_finalizing]); /* Invoke the handler. */ handler = MVM_frame_find_invokee(tc, handler, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, inv_arg_callsite); tc->cur_frame->args[0].o = drain; STABLE(handler)->invoke(tc, handler, inv_arg_callsite, tc->cur_frame->args); } } static void setup_finalize_handler_call(MVMThreadContext *tc) { MVMFrame *install_on = tc->cur_frame; while (install_on) { if (!install_on->special_return) if (install_on->static_info->body.cu->body.hll_config) break; install_on = install_on->caller; } if (install_on) install_on->special_return = finalize_handler_caller; } /* Walks through the per-thread finalize queues, identifying objects that * should be finalized, pushing them onto a finalize list, and then marking * that list entry. Assumes the world is stopped. */ static void add_to_finalizing(MVMThreadContext *tc, MVMObject *obj) { if (tc->num_finalizing == tc->alloc_finalizing) { if (tc->alloc_finalizing) tc->alloc_finalizing *= 2; else tc->alloc_finalizing = 64; tc->finalizing = MVM_realloc(tc->finalizing, sizeof(MVMCollectable **) * tc->alloc_finalizing); } tc->finalizing[tc->num_finalizing] = obj; tc->num_finalizing++; } static void walk_thread_finalize_queue(MVMThreadContext *tc, MVMuint8 gen) { MVMuint32 collapse_pos = 0; MVMuint32 i; for (i = 0; i < tc->num_finalize; i++) { /* See if it's dead, taking which generation we've marked into * account. */ MVMuint32 flags = tc->finalize[i]->header.flags; MVMuint32 in_gen2 = flags & MVM_CF_SECOND_GEN; if (gen == MVMGCGenerations_Both || !in_gen2) { MVMuint32 live = flags & (MVM_CF_GEN2_LIVE | MVM_CF_FORWARDER_VALID); if (live) { /* Alive, so just leave it in finalized queue, taking updated * address if needed. */ tc->finalize[collapse_pos++] = flags & MVM_CF_FORWARDER_VALID ? (MVMObject *)tc->finalize[i]->header.sc_forward_u.forwarder : tc->finalize[i]; } else { /* Dead; needs finalizing, so pop it on the finalizing list. */ add_to_finalizing(tc, tc->finalize[i]); } } } tc->num_finalize = collapse_pos; } void MVM_finalize_walk_queues(MVMThreadContext *tc, MVMuint8 gen) { MVMThread *cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); while (cur_thread) { if (cur_thread->body.tc) { walk_thread_finalize_queue(cur_thread->body.tc, gen); if (cur_thread->body.tc->num_finalizing > 0) { MVM_gc_collect(cur_thread->body.tc, MVMGCWhatToDo_Finalizing, gen); setup_finalize_handler_call(cur_thread->body.tc); } } cur_thread = cur_thread->body.next; } } MoarVM-2015.11/src/gc/finalize.h0000644000175000017500000000034012456307241015203 0ustar jnthnjnthnvoid MVM_gc_finalize_set(MVMThreadContext *tc, MVMObject *type, MVMint64 finalize); void MVM_gc_finalize_add_to_queue(MVMThreadContext *tc, MVMObject *obj); void MVM_finalize_walk_queues(MVMThreadContext *tc, MVMuint8 gen); MoarVM-2015.11/src/gc/gen2.c0000644000175000017500000002501712456307241014240 0ustar jnthnjnthn#include "moar.h" /* Creates a new second generation allocator. */ MVMGen2Allocator * MVM_gc_gen2_create(MVMInstance *i) { /* Create allocator data structure. */ MVMGen2Allocator *al = MVM_malloc(sizeof(MVMGen2Allocator)); /* Create empty size classes array data structure. */ al->size_classes = MVM_malloc(sizeof(MVMGen2SizeClass) * MVM_GEN2_BINS); memset(al->size_classes, 0, sizeof(MVMGen2SizeClass) * MVM_GEN2_BINS); /* Set up overflows area. */ al->alloc_overflows = MVM_GEN2_OVERFLOWS; al->num_overflows = 0; al->overflows = MVM_malloc(al->alloc_overflows * sizeof(MVMCollectable *)); return al; } /* Sets up a size class bin in the second generation. */ static void setup_bin(MVMGen2Allocator *al, MVMuint32 bin) { /* Work out page size we want. */ MVMuint32 page_size = MVM_GEN2_PAGE_ITEMS * ((bin + 1) << MVM_GEN2_BIN_BITS); /* We'll just allocate a single page to start off with. */ al->size_classes[bin].num_pages = 1; al->size_classes[bin].pages = MVM_malloc(sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[0] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[0]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* Free list is empty until GC run (and we just do page by page allocation). */ al->size_classes[bin].free_list = NULL; } /* Adds a new page to a size class bin. */ static void add_page(MVMGen2Allocator *al, MVMuint32 bin) { /* Work out page size. */ MVMuint32 page_size = MVM_GEN2_PAGE_ITEMS * ((bin + 1) << MVM_GEN2_BIN_BITS); /* Add the extra page. */ MVMuint32 cur_page = al->size_classes[bin].num_pages; al->size_classes[bin].num_pages++; al->size_classes[bin].pages = MVM_realloc(al->size_classes[bin].pages, sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[cur_page] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[cur_page]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* set the cur_page to a proper value */ al->size_classes[bin].cur_page = cur_page; } /* Allocates space using the second generation allocator and returns * a pointer to the allocated space. Does not zero the space or set * it up in any way. */ void * MVM_gc_gen2_allocate(MVMGen2Allocator *al, MVMuint32 size) { void *result; /* Determine the bin. If we hit a bin exactly then it's off-by-one, * since the bins list is base-0. Otherwise we've some extra bits, * which round us up to the next bin, but that's a no-op. */ MVMuint32 bin = (size >> MVM_GEN2_BIN_BITS); if ((size & MVM_GEN2_BIN_MASK) == 0) bin--; /* If the selected bin is in range... */ if (bin < MVM_GEN2_BINS) { /* If we've no pages yet, never encountered this bin; set it up. */ if (al->size_classes[bin].pages == NULL) setup_bin(al, bin); /* If there's a free list entry, use that. */ if (al->size_classes[bin].free_list) { result = (void *)al->size_classes[bin].free_list; al->size_classes[bin].free_list = (char **)*(al->size_classes[bin].free_list); } else { /* If we're at the page limit, add a new page. */ if (al->size_classes[bin].alloc_pos == al->size_classes[bin].alloc_limit) add_page(al, bin); /* Now we can allocate. */ result = al->size_classes[bin].alloc_pos; al->size_classes[bin].alloc_pos += (bin + 1) << MVM_GEN2_BIN_BITS; } } else { /* We're beyond the size class bins, so resort to malloc. */ result = MVM_malloc(size); /* Add to overflows list. */ if (al->num_overflows == al->alloc_overflows) { al->alloc_overflows *= 2; al->overflows = MVM_realloc(al->overflows, al->alloc_overflows * sizeof(MVMCollectable *)); } al->overflows[al->num_overflows++] = result; } return result; } /* Allocates space using the second generation allocator and returns * a pointer to the allocated space. Promises the memory will be * zeroed, except that the MVMCollectable gen 2 flag will get set. */ void * MVM_gc_gen2_allocate_zeroed(MVMGen2Allocator *al, MVMuint32 size) { void *a = MVM_gc_gen2_allocate(al, size); memset(a, 0, size); ((MVMCollectable *)a)->flags = MVM_CF_SECOND_GEN; return a; } /* Frees all memory associated with the second generation. */ void MVM_gc_gen2_destroy(MVMInstance *i, MVMGen2Allocator *al) { MVMint32 j, k; /* Remove all pages. */ for (j = 0; j < MVM_GEN2_BINS; j++) { for (k = 0; k < al->size_classes[j].num_pages; k++) MVM_free(al->size_classes[j].pages[k]); MVM_free(al->size_classes[j].pages); } /* Free any allocated overflows. */ for (j = 0; j < al->num_overflows; j++) if (al->overflows[j]) MVM_free(al->overflows[j]); /* Clean up allocator data structure. */ MVM_free(al->size_classes); al->size_classes = NULL; MVM_free(al->overflows); al->overflows = NULL; MVM_free(al); } /* blindly move pages from one gen2 to another */ void MVM_gc_gen2_transfer(MVMThreadContext *src, MVMThreadContext *dest) { MVMGen2Allocator *gen2 = src->gen2, *dest_gen2 = dest->gen2; MVMuint32 bin, obj_size, page; char ***freelist_insert_pos; for (bin = 0; bin < MVM_GEN2_BINS; bin++) { MVMuint32 orig_dest_num_pages = dest_gen2->size_classes[bin].num_pages; char *cur_ptr, *end_ptr; /* If we've nothing allocated in this size class, skip it. */ if (gen2->size_classes[bin].pages == NULL) continue; if (dest_gen2->size_classes[bin].pages == NULL) dest_gen2->size_classes[bin].free_list = NULL; /* Calculate object size for this bin. */ obj_size = (bin + 1) << MVM_GEN2_BIN_BITS; /* freelist_insert_pos is a pointer to a memory location that * stores the address of the last traversed free list node (char **). */ /* Initialize freelist insertion position to free list head. */ freelist_insert_pos = &gen2->size_classes[bin].free_list; if (dest_gen2->size_classes[bin].pages == NULL) { dest_gen2->size_classes[bin].pages = MVM_malloc(sizeof(void *) * gen2->size_classes[bin].num_pages); dest_gen2->size_classes[bin].num_pages = gen2->size_classes[bin].num_pages; } else { dest_gen2->size_classes[bin].num_pages += gen2->size_classes[bin].num_pages; dest_gen2->size_classes[bin].pages = MVM_realloc(dest_gen2->size_classes[bin].pages, sizeof(void *) * dest_gen2->size_classes[bin].num_pages); } /* Visit each page in the source. */ for (page = 0; page < gen2->size_classes[bin].num_pages; page++) { /* Visit all the objects, looking for dead ones and swap the * owner for each of them. */ cur_ptr = gen2->size_classes[bin].pages[page]; end_ptr = page + 1 == gen2->size_classes[bin].num_pages ? gen2->size_classes[bin].alloc_pos : cur_ptr + obj_size * MVM_GEN2_PAGE_ITEMS; while (cur_ptr < end_ptr) { if (cur_ptr == (char *)freelist_insert_pos) { /* skip */ } else if (cur_ptr == (char *)*freelist_insert_pos) { /* printf("found a free list slot in bin %d page %d: %d with value %d and start %d and limit %d\n", bin, page, cur_ptr, *(void **)cur_ptr, gen2->size_classes[bin].pages[page], dest_gen2->size_classes[bin].alloc_limit);*/ freelist_insert_pos = (char ***)cur_ptr; } else { /* note: we don't have tests that exercise this path yet. */ /* printf("updating an owner from %d to %d\n", ((MVMCollectable *)cur_ptr)->owner, dest->thread_id);*/ ((MVMCollectable *)cur_ptr)->owner = dest->thread_id; } /* Move to the next object. */ cur_ptr += obj_size; } dest_gen2->size_classes[bin].pages[page + orig_dest_num_pages] = gen2->size_classes[bin].pages[page]; } freelist_insert_pos = &dest_gen2->size_classes[bin].free_list; while (*freelist_insert_pos) { freelist_insert_pos = (char ***)*freelist_insert_pos; } /* chain the destination's freelist through any remaining unallocated area */ if (dest_gen2->size_classes[bin].alloc_pos) { cur_ptr = dest_gen2->size_classes[bin].alloc_pos; end_ptr = dest_gen2->size_classes[bin].alloc_limit; while (cur_ptr < end_ptr) { *freelist_insert_pos = (char **)cur_ptr; freelist_insert_pos = (char ***)cur_ptr; cur_ptr += obj_size; } } /* link to the new pages, if any */ *freelist_insert_pos = gen2->size_classes[bin].free_list; dest_gen2->size_classes[bin].alloc_pos = gen2->size_classes[bin].alloc_pos; dest_gen2->size_classes[bin].alloc_limit = gen2->size_classes[bin].alloc_limit; MVM_free(gen2->size_classes[bin].pages); gen2->size_classes[bin].pages = NULL; gen2->size_classes[bin].num_pages = 0; } { /* copy the roots... */ MVMuint32 i, n = src->num_gen2roots; for ( i = 0; i < n; i++) { MVM_gc_root_gen2_add(dest, src->gen2roots[i]); } src->num_gen2roots = 0; src->alloc_gen2roots = 0; MVM_free(src->gen2roots); src->gen2roots = NULL; } } void MVM_gc_gen2_compact_overflows(MVMGen2Allocator *al) { /* compact the overflow list to prevent it from growing without bounds */ MVMCollectable **overflows = al->overflows; const MVMuint32 num_overflows = al->num_overflows; MVMuint32 cursor = 0; MVMuint32 live; /* Find the first NULL object. */ while (cursor < num_overflows && overflows[cursor]) cursor++; live = cursor; /* Slide others back so the alive ones are at the start of the list. */ while (cursor < num_overflows) { if (overflows[cursor]) { overflows[live++] = overflows[cursor]; } cursor++; } al->num_overflows = live; } MoarVM-2015.11/src/gc/gen2.h0000644000175000017500000000525312456307241014245 0ustar jnthnjnthn/* Represents the objects for a particular size class. */ struct MVMGen2SizeClass { /* Each page holds a certain number of collectables. We know * nothing of the size statically, so we'll work in bytes. */ char **pages; /* Head of the free list. */ char **free_list; /* The current allocation position if we've nothing on the * free list. */ char *alloc_pos; /* The current page allocation limit (once we hit this, we need * to go to the next page) Also just used when no free list. */ char *alloc_limit; /* The current page number that we're allocating in. */ MVMuint32 cur_page; /* The number of pages allocated. */ MVMuint32 num_pages; }; /* An "instance" of the fixed size allocator. */ struct MVMGen2Allocator { /* Size classes for the fixed size allocator. Each one represents * a bunch of objects of the same size. The allocated sizes are * rounded and then one of these buckets is used, unless it is * past the limit. */ MVMGen2SizeClass *size_classes; /* Array of objects that were malloc'd instead, because they did * not fit in a size class due to being too large. */ MVMCollectable **overflows; /* The number of objects in the overflow array. */ MVMuint32 num_overflows; /* The amount of space allocated in the overflow array. */ MVMuint32 alloc_overflows; }; /* The number of bits we discard from the requested size when binning * the allocation request into a size class. For example, if this is * 3 bits then: * Request for 2 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 4 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 8 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 12 bytes ==> bin 1 (objects 9 - 16 bytes) * Request for 16 bytes ==> bin 1 (objects 9 - 16 bytes) */ #define MVM_GEN2_BIN_BITS 3 /* Mask used to know if we hit a size class exactly or have to round up. */ #define MVM_GEN2_BIN_MASK ((1 << MVM_GEN2_BIN_BITS) - 1) /* Number of bins in the FSA. Beyond this, we just degrade to malloc/free. */ #define MVM_GEN2_BINS 32 /* Default overflow list size. */ #define MVM_GEN2_OVERFLOWS 32 /* The number of items that go into each page. */ #define MVM_GEN2_PAGE_ITEMS 256 /* Functions. */ MVMGen2Allocator * MVM_gc_gen2_create(MVMInstance *i); void * MVM_gc_gen2_allocate(MVMGen2Allocator *al, MVMuint32 size); void * MVM_gc_gen2_allocate_zeroed(MVMGen2Allocator *al, MVMuint32 size); void MVM_gc_gen2_destroy(MVMInstance *i, MVMGen2Allocator *allocator); void MVM_gc_gen2_transfer(MVMThreadContext *src, MVMThreadContext *dest); void MVM_gc_gen2_compact_overflows(MVMGen2Allocator *allocator); MoarVM-2015.11/src/gc/objectid.c0000644000175000017500000000511212456307241015162 0ustar jnthnjnthn#include "moar.h" /* Gets a stable identifier for an object, which will not change even if the * GC moves the object. */ MVMuint64 MVM_gc_object_id(MVMThreadContext *tc, MVMObject *obj) { MVMuint64 id; /* If it's already in the old generation, just use memory address, as * gen2 objects never move. */ if (obj->header.flags & MVM_CF_SECOND_GEN) { id = (MVMuint64)obj; } /* Otherwise, see if we already have a persistent object ID. */ else { MVMObjectId *entry; uv_mutex_lock(&tc->instance->mutex_object_ids); if (obj->header.flags & MVM_CF_HAS_OBJECT_ID) { /* Has one, so just look up by address in the hash ID hash. */ HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&obj, sizeof(MVMObject *), entry); } else { /* Hasn't got one; allocate it a place in gen2 and make an entry * in the persistent object ID hash. */ entry = MVM_calloc(1, sizeof(MVMObjectId)); entry->current = obj; entry->gen2_addr = MVM_gc_gen2_allocate_zeroed(tc->gen2, obj->header.size); HASH_ADD_KEYPTR(hash_handle, tc->instance->object_ids, &(entry->current), sizeof(MVMObject *), entry); obj->header.flags |= MVM_CF_HAS_OBJECT_ID; } id = (MVMuint64)entry->gen2_addr; uv_mutex_unlock(&tc->instance->mutex_object_ids); } return id; } /* If an object with an entry here lives long enough to be promoted to gen2, * this removes the hash entry for it and returns the pre-allocated gen2 * address. */ void * MVM_gc_object_id_use_allocation(MVMThreadContext *tc, MVMCollectable *item) { MVMObjectId *entry; void *addr; uv_mutex_lock(&tc->instance->mutex_object_ids); HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&item, sizeof(MVMObject *), entry); addr = entry->gen2_addr; HASH_DELETE(hash_handle, tc->instance->object_ids, entry); MVM_free(entry); item->flags ^= MVM_CF_HAS_OBJECT_ID; uv_mutex_unlock(&tc->instance->mutex_object_ids); return addr; } /* Clears hash entry for a persistent object ID when an object dies in the * nursery. */ void MVM_gc_object_id_clear(MVMThreadContext *tc, MVMCollectable *item) { MVMObjectId *entry; uv_mutex_lock(&tc->instance->mutex_object_ids); HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&item, sizeof(MVMObject *), entry); HASH_DELETE(hash_handle, tc->instance->object_ids, entry); MVM_free(entry); uv_mutex_unlock(&tc->instance->mutex_object_ids); } MoarVM-2015.11/src/gc/objectid.h0000644000175000017500000000033712456307241015173 0ustar jnthnjnthnMVMuint64 MVM_gc_object_id(MVMThreadContext *tc, MVMObject *obj); void * MVM_gc_object_id_use_allocation(MVMThreadContext *tc, MVMCollectable *item); void MVM_gc_object_id_clear(MVMThreadContext *tc, MVMCollectable *item); MoarVM-2015.11/src/gc/orchestrate.c0000644000175000017500000005413612576610375015744 0ustar jnthnjnthn#include "moar.h" #include /* If we have the job of doing GC for a thread, we add it to our work * list. */ static void add_work(MVMThreadContext *tc, MVMThreadContext *stolen) { MVMint32 i; for (i = 0; i < tc->gc_work_count; i++) if (tc->gc_work[i].tc == stolen) return; if (tc->gc_work == NULL) { tc->gc_work_size = 16; tc->gc_work = MVM_malloc(tc->gc_work_size * sizeof(MVMWorkThread)); } else if (tc->gc_work_count == tc->gc_work_size) { tc->gc_work_size *= 2; tc->gc_work = MVM_realloc(tc->gc_work, tc->gc_work_size * sizeof(MVMWorkThread)); } tc->gc_work[tc->gc_work_count++].tc = stolen; } /* Goes through all threads but the current one and notifies them that a * GC run is starting. Those that are blocked are considered excluded from * the run, and are not counted. Returns the count of threads that should be * added to the finished countdown. */ static MVMuint32 signal_one_thread(MVMThreadContext *tc, MVMThreadContext *to_signal) { /* Loop here since we may not succeed first time (e.g. the status of the * thread may change between the two ways we try to twiddle it). */ while (1) { switch (MVM_load(&to_signal->gc_status)) { case MVMGCStatus_NONE: /* Try to set it from running to interrupted - the common case. */ if (MVM_cas(&to_signal->gc_status, MVMGCStatus_NONE, MVMGCStatus_INTERRUPT) == MVMGCStatus_NONE) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Signalled thread %d to interrupt\n", to_signal->thread_id); return 1; } break; case MVMGCStatus_INTERRUPT: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : thread %d already interrupted\n", to_signal->thread_id); return 0; case MVMGCStatus_UNABLE: /* Otherwise, it's blocked; try to set it to work Stolen. */ if (MVM_cas(&to_signal->gc_status, MVMGCStatus_UNABLE, MVMGCStatus_STOLEN) == MVMGCStatus_UNABLE) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : A blocked thread %d spotted; work stolen\n", to_signal->thread_id); add_work(tc, to_signal); return 0; } break; /* this case occurs if a child thread is Stolen by its parent * before we get to it in the chain. */ case MVMGCStatus_STOLEN: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : thread %d already stolen (it was a spawning child)\n", to_signal->thread_id); return 0; default: MVM_panic(MVM_exitcode_gcorch, "invalid status %"MVM_PRSz" in GC orchestrate\n", MVM_load(&to_signal->gc_status)); return 0; } } } static MVMuint32 signal_all_but(MVMThreadContext *tc, MVMThread *t, MVMThread *tail) { MVMuint32 count = 0; MVMThread *next; if (!t) { return 0; } do { next = t->body.next; switch (MVM_load(&t->body.stage)) { case MVM_thread_stage_starting: case MVM_thread_stage_waiting: case MVM_thread_stage_started: if (t->body.tc != tc) { count += signal_one_thread(tc, t->body.tc); } break; case MVM_thread_stage_exited: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : queueing to clear nursery of thread %d\n", t->body.tc->thread_id); add_work(tc, t->body.tc); break; case MVM_thread_stage_clearing_nursery: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : queueing to destroy thread %d\n", t->body.tc->thread_id); /* last GC run for this thread */ add_work(tc, t->body.tc); break; case MVM_thread_stage_destroyed: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : found a destroyed thread\n"); /* will be cleaned up (removed from the lists) shortly */ break; default: MVM_panic(MVM_exitcode_gcorch, "Corrupted MVMThread or running threads list: invalid thread stage %"MVM_PRSz"", MVM_load(&t->body.stage)); } } while (next && (t = next)); if (tail) MVM_gc_write_barrier(tc, (MVMCollectable *)t, (MVMCollectable *)tail); t->body.next = tail; return count; } /* Does work in a thread's in-tray, if any. Returns a non-zero value if work * was found and done, and zero otherwise. */ static int process_in_tray(MVMThreadContext *tc, MVMuint8 gen) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Considering extra work\n"); if (MVM_load(&tc->gc_in_tray)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Was given extra work by another thread; doing it\n"); MVM_gc_collect(tc, MVMGCWhatToDo_InTray, gen); return 1; } return 0; } /* Called by a thread when it thinks it is done with GC. It may get some more * work yet, though. */ static void clear_intrays(MVMThreadContext *tc, MVMuint8 gen) { MVMuint32 did_work = 1; while (did_work) { MVMThread *cur_thread; did_work = 0; cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); while (cur_thread) { if (cur_thread->body.tc) did_work += process_in_tray(cur_thread->body.tc, gen); cur_thread = cur_thread->body.next; } } } static void finish_gc(MVMThreadContext *tc, MVMuint8 gen, MVMuint8 is_coordinator) { MVMuint32 i, did_work; /* Do any extra work that we have been passed. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : doing any work in thread in-trays\n"); did_work = 1; while (did_work) { did_work = 0; for (i = 0; i < tc->gc_work_count; i++) did_work += process_in_tray(tc->gc_work[i].tc, gen); } /* Decrement gc_finish to say we're done, and wait for termination. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Voting to finish\n"); MVM_decr(&tc->instance->gc_finish); while (MVM_load(&tc->instance->gc_finish)) { for (i = 0; i < 1000; i++) ; /* XXX Something HT-efficienter. */ /* XXX Here we can look to see if we got passed any work, and if so * try to un-vote. */ } GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Termination agreed\n"); /* Co-ordinator should do final check over all the in-trays, and trigger * collection until all is settled. Rest should wait. Additionally, after * in-trays are settled, coordinator walks threads looking for anything * that needs adding to the finalize queue. It then will make another * iteration over in-trays to handle cross-thread references to objects * needing finalization. For full collections, collected objects are then * cleaned from all inter-generational sets, and finally any objects to * be freed at the fixed size allocator's next safepoint are freed. */ if (is_coordinator) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling in-tray clearing completion\n"); clear_intrays(tc, gen); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling finalizers\n"); MVM_finalize_walk_queues(tc, gen); clear_intrays(tc, gen); if (gen == MVMGCGenerations_Both) { MVMThread *cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling inter-gen root cleanup\n"); while (cur_thread) { if (cur_thread->body.tc) MVM_gc_root_gen2_cleanup(cur_thread->body.tc); cur_thread = cur_thread->body.next; } } GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling fixed-size allocator safepoint frees\n"); MVM_fixed_size_safepoint(tc, tc->instance->fsa); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator signalling in-trays clear\n"); MVM_store(&tc->instance->gc_intrays_clearing, 0); } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Waiting for in-tray clearing completion\n"); while (MVM_load(&tc->instance->gc_intrays_clearing)) for (i = 0; i < 1000; i++) ; /* XXX Something HT-efficienter. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Got in-tray clearing complete notice\n"); } /* Reset GC status flags. This is also where thread destruction happens, * and it needs to happen before we acknowledge this GC run is finished. */ for (i = 0; i < tc->gc_work_count; i++) { MVMThreadContext *other = tc->gc_work[i].tc; MVMThread *thread_obj = other->thread_obj; if (MVM_load(&thread_obj->body.stage) == MVM_thread_stage_clearing_nursery) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : transferring gen2 of thread %d\n", other->thread_id); MVM_gc_gen2_transfer(other, tc); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : destroying thread %d\n", other->thread_id); MVM_tc_destroy(other); tc->gc_work[i].tc = thread_obj->body.tc = NULL; MVM_store(&thread_obj->body.stage, MVM_thread_stage_destroyed); } else { if (MVM_load(&thread_obj->body.stage) == MVM_thread_stage_exited) { /* Don't bother freeing gen2; we'll do it next time */ MVM_store(&thread_obj->body.stage, MVM_thread_stage_clearing_nursery); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : set thread %d clearing nursery stage to %d\n", other->thread_id, (int)MVM_load(&thread_obj->body.stage)); } MVM_cas(&other->gc_status, MVMGCStatus_STOLEN, MVMGCStatus_UNABLE); MVM_cas(&other->gc_status, MVMGCStatus_INTERRUPT, MVMGCStatus_NONE); } } /* Signal acknowledgement of completing the cleanup, * except for STables, and if we're the final to do * so, free the STables, which have been linked. */ if (MVM_decr(&tc->instance->gc_ack) == 2) { /* Set it to zero (we're guaranteed the only ones trying to write to * it here). Actual STable free in MVM_gc_enter_from_allocator. */ MVM_store(&tc->instance->gc_ack, 0); } } /* Called by a thread to indicate it is about to enter a blocking operation. * This tells any thread that is coordinating a GC run that this thread will * be unable to participate. */ void MVM_gc_mark_thread_blocked(MVMThreadContext *tc) { /* This may need more than one attempt. */ while (1) { /* Try to set it from running to unable - the common case. */ if (MVM_cas(&tc->gc_status, MVMGCStatus_NONE, MVMGCStatus_UNABLE) == MVMGCStatus_NONE) return; /* The only way this can fail is if another thread just decided we're to * participate in a GC run. */ if (MVM_load(&tc->gc_status) == MVMGCStatus_INTERRUPT) MVM_gc_enter_from_interrupt(tc); else MVM_panic(MVM_exitcode_gcorch, "Invalid GC status observed; aborting"); } } /* Called by a thread to indicate it has completed a block operation and is * thus able to particpate in a GC run again. Note that this case needs some * special handling if it comes out of this mode when a GC run is taking place. */ void MVM_gc_mark_thread_unblocked(MVMThreadContext *tc) { /* Try to set it from unable to running. */ while (MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE, MVMGCStatus_NONE) != MVMGCStatus_UNABLE) { /* We can't, presumably because a GC run is going on. We should wait * for that to finish before we go on, but without chewing CPU. */ MVM_platform_thread_yield(); } } static MVMint32 is_full_collection(MVMThreadContext *tc) { MVMuint64 threshold = MVM_GC_GEN2_THRESHOLD_BASE + ((MVMuint64)tc->instance->num_user_threads * MVM_GC_GEN2_THRESHOLD_THREAD); return MVM_load(&tc->instance->gc_promoted_bytes_since_last_full) > threshold; } static void run_gc(MVMThreadContext *tc, MVMuint8 what_to_do) { MVMuint8 gen; MVMuint32 i, n; /* Decide nursery or full collection. */ gen = is_full_collection(tc) ? MVMGCGenerations_Both : MVMGCGenerations_Nursery; /* Do GC work for ourselves and any work threads. */ for (i = 0, n = tc->gc_work_count ; i < n; i++) { MVMThreadContext *other = tc->gc_work[i].tc; tc->gc_work[i].limit = other->nursery_alloc; GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : starting collection for thread %d\n", other->thread_id); other->gc_promoted_bytes = 0; MVM_gc_collect(other, (other == tc ? what_to_do : MVMGCWhatToDo_NoInstance), gen); } /* Wait for everybody to agree we're done. */ finish_gc(tc, gen, what_to_do == MVMGCWhatToDo_All); /* Now we're all done, it's safe to finalize any objects that need it. */ /* XXX TODO explore the feasability of doing this in a background * finalizer/destructor thread and letting the main thread(s) continue * on their merry way(s). */ for (i = 0, n = tc->gc_work_count ; i < n; i++) { MVMThreadContext *other = tc->gc_work[i].tc; /* The thread might've been destroyed */ if (!other) continue; /* Contribute this thread's promoted bytes. */ MVM_add(&tc->instance->gc_promoted_bytes_since_last_full, other->gc_promoted_bytes); /* Collect nursery and gen2 as needed. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : collecting nursery uncopied of thread %d\n", other->thread_id); MVM_gc_collect_free_nursery_uncopied(other, tc->gc_work[i].limit); if (gen == MVMGCGenerations_Both) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : freeing gen2 of thread %d\n", other->thread_id); MVM_gc_collect_free_gen2_unmarked(other, 0); } } } /* This is called when the allocator finds it has run out of memory and wants * to trigger a GC run. In this case, it's possible (probable, really) that it * will need to do that triggering, notifying other running threads that the * time has come to GC. */ void MVM_gc_enter_from_allocator(MVMThreadContext *tc) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entered from allocate\n"); /* Try to start the GC run. */ if (MVM_trycas(&tc->instance->gc_start, 0, 1)) { MVMThread *last_starter = NULL; MVMuint32 num_threads = 0; MVMuint32 is_full; /* Need to wait for other threads to reset their gc_status. */ while (MVM_load(&tc->instance->gc_ack)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : waiting for other thread's gc_ack\n"); MVM_platform_thread_yield(); } /* We are the winner of the GC starting race. This gives us some * extra responsibilities as well as doing the usual things. * First, increment GC sequence number. */ MVM_incr(&tc->instance->gc_seq_number); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC thread elected coordinator: starting gc seq %d\n", (int)MVM_load(&tc->instance->gc_seq_number)); /* Decide if it will be a full collection. */ is_full = is_full_collection(tc); /* If profiling, record that GC is starting. */ if (tc->instance->profiling) MVM_profiler_log_gc_start(tc, is_full); /* Ensure our stolen list is empty. */ tc->gc_work_count = 0; /* Flag that we didn't agree on this run that all the in-trays are * cleared (a responsibility of the co-ordinator. */ MVM_store(&tc->instance->gc_intrays_clearing, 1); /* We'll take care of our own work. */ add_work(tc, tc); /* Find other threads, and signal or steal. */ do { MVMThread *threads = (MVMThread *)MVM_load(&tc->instance->threads); if (threads && threads != last_starter) { MVMThread *head = threads; MVMuint32 add; while ((threads = (MVMThread *)MVM_casptr(&tc->instance->threads, head, NULL)) != head) { head = threads; } add = signal_all_but(tc, head, last_starter); last_starter = head; if (add) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Found %d other threads\n", add); MVM_add(&tc->instance->gc_start, add); num_threads += add; } } /* If there's an event loop thread, wake it up to participate. */ if (tc->instance->event_loop_wakeup) uv_async_send(tc->instance->event_loop_wakeup); } while (MVM_load(&tc->instance->gc_start) > 1); /* Sanity checks. */ if (!MVM_trycas(&tc->instance->threads, NULL, last_starter)) MVM_panic(MVM_exitcode_gcorch, "threads list corrupted\n"); if (MVM_load(&tc->instance->gc_finish) != 0) MVM_panic(MVM_exitcode_gcorch, "Finish votes was %"MVM_PRSz"\n", MVM_load(&tc->instance->gc_finish)); /* gc_ack gets an extra so the final acknowledger * can also free the STables. */ MVM_store(&tc->instance->gc_finish, num_threads + 1); MVM_store(&tc->instance->gc_ack, num_threads + 2); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : finish votes is %d\n", (int)MVM_load(&tc->instance->gc_finish)); /* Now we're ready to start, zero promoted since last full collection * counter if this is a full collect. */ if (is_full) MVM_store(&tc->instance->gc_promoted_bytes_since_last_full, 0); /* This is a safe point for us to free any STables that have been marked * for deletion in the previous collection (since we let finalization - * which appends to this list - happen after we set threads on their * way again, it's not safe to do it in the previous collection). */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Freeing STables if needed\n"); MVM_gc_collect_free_stables(tc); /* Signal to the rest to start */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : coordinator signalling start\n"); if (MVM_decr(&tc->instance->gc_start) != 1) MVM_panic(MVM_exitcode_gcorch, "Start votes was %"MVM_PRSz"\n", MVM_load(&tc->instance->gc_start)); /* Start collecting. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : coordinator entering run_gc\n"); run_gc(tc, MVMGCWhatToDo_All); /* If profiling, record that GC is over. */ if (tc->instance->profiling) MVM_profiler_log_gc_end(tc); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC complete (cooridnator)\n"); } else { /* Another thread beat us to starting the GC sync process. Thus, act as * if we were interrupted to GC. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Lost coordinator election\n"); MVM_gc_enter_from_interrupt(tc); } } /* This is called when a thread hits an interrupt at a GC safe point. This means * that another thread is already trying to start a GC run, so we don't need to * try and do that, just enlist in the run. */ void MVM_gc_enter_from_interrupt(MVMThreadContext *tc) { AO_t curr; GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entered from interrupt\n"); /* If profiling, record that GC is starting. */ if (tc->instance->profiling) MVM_profiler_log_gc_start(tc, is_full_collection(tc)); /* We'll certainly take care of our own work. */ tc->gc_work_count = 0; add_work(tc, tc); /* Indicate that we're ready to GC. Only want to decrement it if it's 2 or * greater (0 should never happen; 1 means the coordinator is still counting * up how many threads will join in, so we should wait until it decides to * decrement.) */ while ((curr = MVM_load(&tc->instance->gc_start)) < 2 || !MVM_trycas(&tc->instance->gc_start, curr, curr - 1)) { /* MVM_platform_thread_yield();*/ } /* Wait for all threads to indicate readiness to collect. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Waiting for other threads\n"); while (MVM_load(&tc->instance->gc_start)) { /* MVM_platform_thread_yield();*/ } GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entering run_gc\n"); run_gc(tc, MVMGCWhatToDo_NoInstance); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC complete\n"); /* If profiling, record that GC is over. */ if (tc->instance->profiling) MVM_profiler_log_gc_end(tc); } /* Run the global destruction phase. */ void MVM_gc_global_destruction(MVMThreadContext *tc) { char *nursery_tmp; /* Must wait until we're the only thread... */ while (tc->instance->num_user_threads) { GC_SYNC_POINT(tc); MVM_platform_thread_yield(); } /* Fake a nursery collection run by swapping the semi- * space nurseries. */ nursery_tmp = tc->nursery_fromspace; tc->nursery_fromspace = tc->nursery_tospace; tc->nursery_tospace = nursery_tmp; /* Run the objects' finalizers */ MVM_gc_collect_free_nursery_uncopied(tc, tc->nursery_alloc); MVM_gc_root_gen2_cleanup(tc); MVM_gc_collect_free_gen2_unmarked(tc, 1); MVM_gc_collect_free_stables(tc); } MoarVM-2015.11/src/gc/orchestrate.h0000644000175000017500000000345712456307241015741 0ustar jnthnjnthnvoid MVM_gc_enter_from_allocator(MVMThreadContext *tc); void MVM_gc_enter_from_interrupt(MVMThreadContext *tc); void MVM_gc_mark_thread_blocked(MVMThreadContext *tc); void MVM_gc_mark_thread_unblocked(MVMThreadContext *tc); void MVM_gc_global_destruction(MVMThreadContext *tc); struct MVMWorkThread { MVMThreadContext *tc; void *limit; }; typedef enum { MVM_GC_DEBUG_ORCHESTRATE = 1, MVM_GC_DEBUG_COLLECT = 2, /* MVM_GC_DEBUG_ = 4, MVM_GC_DEBUG_ = 8, MVM_GC_DEBUG_ = 16, MVM_GC_DEBUG_ = 32, MVM_GC_DEBUG_ = 64, MVM_GC_DEBUG_ = 128, MVM_GC_DEBUG_ = 256, MVM_GC_DEBUG_ = 512, MVM_GC_DEBUG_ = 1024, MVM_GC_DEBUG_ = 2048, MVM_GC_DEBUG_ = 4096, MVM_GC_DEBUG_ = 8192, MVM_GC_DEBUG_ = 16384, MVM_GC_DEBUG_ = 32768, MVM_GC_DEBUG_ = 65536, MVM_GC_DEBUG_ = 131072, MVM_GC_DEBUG_ = 262144, MVM_GC_DEBUG_ = 524288, MVM_GC_DEBUG_ = 1048576, MVM_GC_DEBUG_ = 2097152, MVM_GC_DEBUG_ = 4194304, MVM_GC_DEBUG_ = 8388608, MVM_GC_DEBUG_ = 16777216, MVM_GC_DEBUG_ = 33554432, MVM_GC_DEBUG_ = 67108864, MVM_GC_DEBUG_ = 134217728*/ } MVMGCDebugLogFlags; /* OR together the flags you want to require, or redefine * MVM_GC_DEBUG_ENABLED(flags) if you want something more * complicated. */ #define MVM_GC_DEBUG_LOG_FLAGS \ 0 #define MVM_GC_DEBUG_ENABLED(flags) \ ((MVM_GC_DEBUG_LOG_FLAGS) & (flags)) #ifdef _MSC_VER # define GCDEBUG_LOG(tc, flags, msg, ...) \ if (MVM_GC_DEBUG_ENABLED(flags)) \ printf((msg), (tc)->thread_id, \ MVM_load(&(tc)->instance->gc_seq_number), __VA_ARGS__) #else # define GCDEBUG_LOG(tc, flags, msg, ...) \ if (MVM_GC_DEBUG_ENABLED(flags)) \ printf((msg), (tc)->thread_id, \ (int)MVM_load(&(tc)->instance->gc_seq_number) , ##__VA_ARGS__) #endif MoarVM-2015.11/src/gc/roots.c0000644000175000017500000003613512521400150014540 0ustar jnthnjnthn#include "moar.h" static void scan_registers(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame); /* Adds a location holding a collectable object to the permanent list of GC * roots, so that it will always be marked and never die. Note that the * address of the collectable must be passed, since it will need to be * updated. */ void MVM_gc_root_add_permanent(MVMThreadContext *tc, MVMCollectable **obj_ref) { if (obj_ref == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null object address as a permanent root"); uv_mutex_lock(&tc->instance->mutex_permroots); /* Allocate extra permanent root space if needed. */ if (tc->instance->num_permroots == tc->instance->alloc_permroots) { tc->instance->alloc_permroots *= 2; tc->instance->permroots = MVM_realloc(tc->instance->permroots, sizeof(MVMCollectable **) * tc->instance->alloc_permroots); } /* Add this one to the list. */ tc->instance->permroots[tc->instance->num_permroots] = obj_ref; tc->instance->num_permroots++; uv_mutex_unlock(&tc->instance->mutex_permroots); } /* Adds the set of permanently registered roots to a GC worklist. */ void MVM_gc_root_add_permanents_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMuint32 i, num_roots; MVMCollectable ***permroots; num_roots = tc->instance->num_permroots; permroots = tc->instance->permroots; for (i = 0; i < num_roots; i++) MVM_gc_worklist_add(tc, worklist, permroots[i]); } /* Adds anything that is a root thanks to being referenced by instance, * but that isn't permanent. */ void MVM_gc_root_add_instance_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMSerializationContextBody *current, *tmp; MVMLoadedCompUnitName *current_lcun, *tmp_lcun; unsigned bucket_tmp; MVMString **int_to_str_cache; MVMuint32 i; MVM_gc_worklist_add(tc, worklist, &tc->instance->threads); MVM_gc_worklist_add(tc, worklist, &tc->instance->compiler_registry); MVM_gc_worklist_add(tc, worklist, &tc->instance->hll_syms); MVM_gc_worklist_add(tc, worklist, &tc->instance->clargs); MVM_gc_worklist_add(tc, worklist, &tc->instance->event_loop_todo_queue); MVM_gc_worklist_add(tc, worklist, &tc->instance->event_loop_cancel_queue); MVM_gc_worklist_add(tc, worklist, &tc->instance->event_loop_active); int_to_str_cache = tc->instance->int_to_str_cache; for (i = 0; i < MVM_INT_TO_STR_CACHE_SIZE; i++) MVM_gc_worklist_add(tc, worklist, &(int_to_str_cache[i])); /* okay, so this makes the weak hash slightly less weak.. for certain * keys of it anyway... */ HASH_ITER(hash_handle, tc->instance->sc_weakhash, current, tmp, bucket_tmp) { /* mark the string handle pointer iff it hasn't yet been resolved */ if (!current->sc) MVM_gc_worklist_add(tc, worklist, ¤t->handle); } HASH_ITER(hash_handle, tc->instance->loaded_compunits, current_lcun, tmp_lcun, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t_lcun->filename); } MVM_gc_worklist_add(tc, worklist, &tc->instance->cached_backend_config); } /* Adds anything that is a root thanks to being referenced by a thread, * context, but that isn't permanent. */ void MVM_gc_root_add_tc_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMNativeCallbackCacheHead *current_cbceh, *tmp_cbceh; unsigned bucket_tmp; /* Any active exception handlers. */ MVMActiveHandler *cur_ah = tc->active_handlers; while (cur_ah != NULL) { MVM_gc_worklist_add(tc, worklist, &cur_ah->ex_obj); cur_ah = cur_ah->next_handler; } /* Any exception handler result. */ MVM_gc_worklist_add(tc, worklist, &tc->last_handler_result); /* The usecapture object. */ MVM_gc_worklist_add(tc, worklist, &tc->cur_usecapture); /* List of SCs currently being compiled. */ MVM_gc_worklist_add(tc, worklist, &tc->compiling_scs); /* compunit variable pointer (and be null if thread finished) */ if (tc->interp_cu) MVM_gc_worklist_add(tc, worklist, tc->interp_cu); /* Lexotics cache. */ if (tc->lexotic_cache_size) { MVMuint32 i; for (i = 0; i < tc->lexotic_cache_size; i++) if (tc->lexotic_cache[i]) MVM_gc_worklist_add(tc, worklist, &(tc->lexotic_cache[i])); } /* Current dispatcher. */ MVM_gc_worklist_add(tc, worklist, &tc->cur_dispatcher); /* Callback cache. */ HASH_ITER(hash_handle, tc->native_callback_cache, current_cbceh, tmp_cbceh, bucket_tmp) { MVMint32 i; MVMNativeCallback *entry = current_cbceh->head; while (entry) { for (i = 0; i < entry->num_types; i++) MVM_gc_worklist_add(tc, worklist, &(entry->types[i])); MVM_gc_worklist_add(tc, worklist, &(entry->target)); entry = entry->next; } } /* Profiling data. */ MVM_profile_mark_data(tc, worklist); /* Serialized string heap, if any. */ MVM_gc_worklist_add(tc, worklist, &tc->serialized_string_heap); } /* Pushes a temporary root onto the thread-local roots list. */ void MVM_gc_root_temp_push_slow(MVMThreadContext *tc, MVMCollectable **obj_ref) { /* Allocate extra temporary root space if needed. */ if (tc->num_temproots == tc->alloc_temproots) { tc->alloc_temproots *= 2; tc->temproots = MVM_realloc(tc->temproots, sizeof(MVMCollectable **) * tc->alloc_temproots); } /* Add this one to the list. */ tc->temproots[tc->num_temproots] = obj_ref; tc->num_temproots++; } /* Marks the temporary root stack at its current height as the limit for * removing all roots. This is done so that in nested interpreter runs * (at present, just nativecall callbacks) we don't clear things that * are pushed by the native call itself. */ MVMuint32 MVM_gc_root_temp_mark(MVMThreadContext *tc) { MVMint32 current = tc->mark_temproots; tc->mark_temproots = tc->num_temproots; return current; } /* Resets the temporary root stack mark to the provided height. */ void MVM_gc_root_temp_mark_reset(MVMThreadContext *tc, MVMuint32 mark) { tc->mark_temproots = mark; } /* Pops all temporary roots off the thread-local roots list. */ void MVM_gc_root_temp_pop_all(MVMThreadContext *tc) { tc->num_temproots = tc->mark_temproots; } /* Adds the set of thread-local temporary roots to a GC worklist. */ void MVM_gc_root_add_temps_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMuint32 i, num_roots; MVMCollectable ***temproots; num_roots = tc->num_temproots; temproots = tc->temproots; for (i = 0; i < num_roots; i++) MVM_gc_worklist_add(tc, worklist, temproots[i]); } /* Pushes a collectable that is in generation 2, but now references a nursery * collectable, into the gen2 root set. */ void MVM_gc_root_gen2_add(MVMThreadContext *tc, MVMCollectable *c) { /* Ensure the collectable is not null. */ if (c == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null collectable address as an inter-generational root"); assert(!(c->flags & MVM_CF_FORWARDER_VALID)); /* Allocate extra gen2 aggregate space if needed. */ if (tc->num_gen2roots == tc->alloc_gen2roots) { tc->alloc_gen2roots *= 2; tc->gen2roots = MVM_realloc(tc->gen2roots, sizeof(MVMCollectable **) * tc->alloc_gen2roots); } /* Add this one to the list. */ tc->gen2roots[tc->num_gen2roots] = c; tc->num_gen2roots++; /* Flag it as added, so we don't add it multiple times. */ c->flags |= MVM_CF_IN_GEN2_ROOT_LIST; } /* Adds the set of thread-local inter-generational roots to a GC worklist. As * a side-effect, removes gen2 roots that no longer point to any nursery * items (usually because all the referenced objects also got promoted). */ void MVM_gc_root_add_gen2s_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMCollectable **gen2roots = tc->gen2roots; MVMuint32 num_roots = tc->num_gen2roots; MVMuint32 i; /* We'll remove some entries from this list. The algorithm is simply to * slide all that stay towards the start of the array. */ MVMuint32 insert_pos = 0; /* Guess that we'll end up with around num_roots entries, to avoid some * worklist growth reallocations. */ MVM_gc_worklist_presize_for(tc, worklist, num_roots); /* Visit each gen2 root and... */ for (i = 0; i < num_roots; i++) { /* Count items on worklist before we mark it. */ MVMuint32 items_before_mark = worklist->items; MVMuint32 frames_before_mark = worklist->frames; /* Put things it references into the worklist; since the worklist will * be set not to include gen2 things, only nursery things will make it * in. */ assert(!(gen2roots[i]->flags & MVM_CF_FORWARDER_VALID)); MVM_gc_mark_collectable(tc, worklist, gen2roots[i]); /* If we added any nursery objects or frames, or if we are marked as * referencing frames, then we need to stay in this list. */ if (worklist->items != items_before_mark || worklist->frames != frames_before_mark || (!(gen2roots[i]->flags & MVM_CF_STABLE) && REPR(gen2roots[i])->refs_frames)) { gen2roots[insert_pos] = gen2roots[i]; insert_pos++; } /* Otherwise, clear the "in gen2 root list" flag. */ else { gen2roots[i]->flags ^= MVM_CF_IN_GEN2_ROOT_LIST; } } /* New number of entries after sliding is the final insert position. */ tc->num_gen2roots = insert_pos; } /* Visits all of the roots in the gen2 list and removes those that have been * collected. Applied after a full collection. */ void MVM_gc_root_gen2_cleanup(MVMThreadContext *tc) { MVMCollectable **gen2roots = tc->gen2roots; MVMuint32 num_roots = tc->num_gen2roots; MVMuint32 i = 0; MVMuint32 cur_survivor; /* Find the first collected object. */ while (i < num_roots && gen2roots[i]->flags & MVM_CF_GEN2_LIVE) i++; cur_survivor = i; /* Slide others back so the alive ones are at the start of the list. */ while (i < num_roots) { if (gen2roots[i]->flags & MVM_CF_GEN2_LIVE) { assert(!(gen2roots[i]->flags & MVM_CF_FORWARDER_VALID)); gen2roots[cur_survivor++] = gen2roots[i]; } i++; } tc->num_gen2roots = cur_survivor; } /* Walks frames and compilation units. Adds the roots it finds into the * GC worklist. */ void MVM_gc_root_add_frame_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *start_frame) { MVMFrame *cur_frame = start_frame; MVMuint32 cur_seq_number = MVM_load(&tc->instance->gc_seq_number); /* If we already saw the frame this run, skip it. */ MVMuint32 orig_seq = MVM_load(&cur_frame->gc_seq_number); if (orig_seq == cur_seq_number) return; if (MVM_cas(&cur_frame->gc_seq_number, orig_seq, cur_seq_number) != orig_seq) return; /* Add caller and outer to frames work list. */ MVM_gc_worklist_add_frame(tc, worklist, cur_frame->caller); MVM_gc_worklist_add_frame(tc, worklist, cur_frame->outer); /* add code_ref to work list unless we're the top-level frame. */ if (cur_frame->code_ref) MVM_gc_worklist_add(tc, worklist, &cur_frame->code_ref); MVM_gc_worklist_add(tc, worklist, &cur_frame->static_info); /* Add any context object. */ if (cur_frame->context_object) MVM_gc_worklist_add(tc, worklist, &cur_frame->context_object); /* Mark special return data, if needed. */ if (cur_frame->special_return_data && cur_frame->mark_special_return_data) cur_frame->mark_special_return_data(tc, cur_frame, worklist); /* Mark any continuation tags. */ if (cur_frame->continuation_tags) { MVMContinuationTag *tag = cur_frame->continuation_tags; while (tag) { MVM_gc_worklist_add(tc, worklist, &tag->tag); tag = tag->next; } } /* Mark any dyn lex cache. */ if (cur_frame->dynlex_cache_name) MVM_gc_worklist_add(tc, worklist, &cur_frame->dynlex_cache_name); /* Scan the registers. */ scan_registers(tc, worklist, cur_frame); } /* Takes a frame, scans its registers and adds them to the roots. */ static void scan_registers(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame) { MVMuint16 i, count, flag; MVMuint16 *type_map; MVMuint8 *flag_map; /* Scan locals. */ if (frame->work && frame->tc) { if (frame->spesh_cand && frame->spesh_log_idx == -1 && frame->spesh_cand->local_types) { type_map = frame->spesh_cand->local_types; count = frame->spesh_cand->num_locals; } else { type_map = frame->static_info->body.local_types; count = frame->static_info->body.num_locals; } for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &frame->work[i].o); } /* Scan arg buffer if needed. */ if (frame->args && frame->cur_args_callsite) { flag_map = frame->cur_args_callsite->arg_flags; count = frame->cur_args_callsite->arg_count; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &frame->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &frame->args[i].o); } } /* Scan lexicals. */ if (frame->env) { if (frame->spesh_cand && frame->spesh_log_idx == -1 && frame->spesh_cand->lexical_types) { type_map = frame->spesh_cand->lexical_types; count = frame->spesh_cand->num_lexicals; } else { type_map = frame->static_info->body.lexical_types; count = frame->static_info->body.num_lexicals; } for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &frame->env[i].o); } /* Scan arguments in case there was a flattening. Don't need to if * there wasn't a flattening because orig args is a subset of locals. */ if (frame->params.arg_flags && frame->params.callsite->has_flattening) { MVMArgProcContext *ctx = &frame->params; flag_map = ctx->arg_flags; count = ctx->arg_count; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &ctx->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &ctx->args[i].o); } } } MoarVM-2015.11/src/gc/roots.h0000644000175000017500000000565412521002331014546 0ustar jnthnjnthn/* Set this flag to debug temporary root pushes/pops. */ #define MVM_TEMP_ROOT_DEBUG 0 /* The number of temp roots we start out with per thread (and so can rely on * always having). */ #define MVM_TEMP_ROOT_BASE_ALLOC 16 /* Temp root push slow-path case. */ MVM_PUBLIC void MVM_gc_root_temp_push_slow(MVMThreadContext *tc, MVMCollectable **obj_ref); /* Fast-path case of pushing a root onto the per-thread temporary roots. */ MVM_STATIC_INLINE void MVM_gc_root_temp_push(MVMThreadContext *tc, MVMCollectable **obj_ref) { /* If debugging, ensure the root is not null. */ #ifdef MVM_TEMP_ROOT_DEBUG if (obj_ref == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null object address as a temporary root"); #endif /* If less than the number of always-allocated roots, just add. */ if (tc->num_temproots < MVM_TEMP_ROOT_BASE_ALLOC) { tc->temproots[tc->num_temproots] = obj_ref; tc->num_temproots++; } /* Otherwise call the slow path. */ else { MVM_gc_root_temp_push_slow(tc, obj_ref); } } /* Pop top root from the per-thread temporary roots stack. */ MVM_STATIC_INLINE void MVM_gc_root_temp_pop(MVMThreadContext *tc) { #if MVM_TEMP_ROOT_DEBUG if (tc->num_temproots <= 0) MVM_panic(1, "Illegal attempt to pop empty temporary root stack"); #endif tc->num_temproots--; } /* Pop top n roots from the per-thread temporary roots stack. */ MVM_STATIC_INLINE void MVM_gc_root_temp_pop_n(MVMThreadContext *tc, MVMuint32 n) { #if MVM_TEMP_ROOT_DEBUG if (tc->num_temproots < n) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to pop insufficiently large temporary root stack"); #endif tc->num_temproots -= n; } /* Other functions related to roots. */ MVM_PUBLIC void MVM_gc_root_add_permanent(MVMThreadContext *tc, MVMCollectable **obj_ref); void MVM_gc_root_add_permanents_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_root_add_instance_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_root_add_tc_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); MVMuint32 MVM_gc_root_temp_mark(MVMThreadContext *tc); void MVM_gc_root_temp_mark_reset(MVMThreadContext *tc, MVMuint32 mark); void MVM_gc_root_temp_pop_all(MVMThreadContext *tc); void MVM_gc_root_add_temps_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_root_gen2_add(MVMThreadContext *tc, MVMCollectable *c); void MVM_gc_root_add_gen2s_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_root_gen2_cleanup(MVMThreadContext *tc); void MVM_gc_root_add_frame_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *start_frame); /* Macros related to rooting objects into the temporaries list, and * unrooting them afterwards. */ #define MVMROOT(tc, obj_ref, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref)); \ block \ MVM_gc_root_temp_pop(tc); \ } while (0) MoarVM-2015.11/src/gc/wb.c0000644000175000017500000000121012456307241014002 0ustar jnthnjnthn#include /* Called when the write barrier macro detects we need to trigger * the write barrier. Arguments are the same as to the barrier macro * itself (updating is the object that we're about to write a pointer * into, and referenced is the object that the pointer references). * This barrier forces a re-scan of the object's contents during a GC * run - even a nursery only one - since somewhere it has references * to a nursery object. */ void MVM_gc_write_barrier_hit(MVMThreadContext *tc, MVMCollectable *update_root) { if (!(update_root->flags & MVM_CF_IN_GEN2_ROOT_LIST)) MVM_gc_root_gen2_add(tc, update_root); } MoarVM-2015.11/src/gc/wb.h0000644000175000017500000000204412456307241014015 0ustar jnthnjnthn/* Functions for if the write barriers are hit. */ MVM_PUBLIC void MVM_gc_write_barrier_hit(MVMThreadContext *tc, MVMCollectable *update_root); /* Ensures that if a generation 2 object comes to hold a reference to a * nursery object, then the generation 2 object becomes an inter-generational * root. */ MVM_STATIC_INLINE void MVM_gc_write_barrier(MVMThreadContext *tc, MVMCollectable *update_root, const MVMCollectable *referenced) { if (((update_root->flags & MVM_CF_SECOND_GEN) && referenced && !(referenced->flags & MVM_CF_SECOND_GEN))) MVM_gc_write_barrier_hit(tc, update_root); } /* Does an assignment, but makes sure the write barrier MVM_WB is applied * first. Takes the root object, the address within it we're writing to, and * the thing we're writing. Note that update_addr is not involved in the * write barrier. */ #define MVM_ASSIGN_REF(tc, update_root, update_addr, referenced) \ { \ void *_r = referenced; \ MVM_gc_write_barrier(tc, update_root, (MVMCollectable *)_r); \ update_addr = _r; \ } MoarVM-2015.11/src/gc/worklist.c0000644000175000017500000000455112456307241015263 0ustar jnthnjnthn#include "moar.h" /* Allocates a new GC worklist. */ MVMGCWorklist * MVM_gc_worklist_create(MVMThreadContext *tc, MVMuint8 include_gen2) { MVMGCWorklist *worklist = MVM_malloc(sizeof(MVMGCWorklist)); worklist->items = 0; worklist->frames = 0; worklist->alloc = MVM_GC_WORKLIST_START_SIZE; worklist->frames_alloc = MVM_GC_WORKLIST_START_SIZE; worklist->list = MVM_malloc(worklist->alloc * sizeof(MVMCollectable **)); worklist->frames_list = MVM_malloc(worklist->frames_alloc * sizeof(MVMFrame *)); worklist->include_gen2 = include_gen2; return worklist; } /* Adds an item to the worklist, expanding it if needed. */ void MVM_gc_worklist_add_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable **item) { if (worklist->items == worklist->alloc) { worklist->alloc *= 2; worklist->list = MVM_realloc(worklist->list, worklist->alloc * sizeof(MVMCollectable **)); } worklist->list[worklist->items++] = item; } /* Adds an item to the worklist, expanding it if needed. */ void MVM_gc_worklist_add_frame_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame) { if (worklist->frames == worklist->frames_alloc) { worklist->frames_alloc *= 2; worklist->frames_list = MVM_realloc(worklist->frames_list, worklist->frames_alloc * sizeof(MVMFrame *)); } worklist->frames_list[worklist->frames++] = frame; } /* Pre-sizes the worklist in expectation a certain number of items is about to be * added. */ void MVM_gc_worklist_presize_for(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMint32 items) { if (worklist->items + items >= worklist->alloc) { worklist->alloc = worklist->items + items; worklist->list = MVM_realloc(worklist->list, worklist->alloc * sizeof(MVMCollectable **)); } } /* Free a worklist. */ void MVM_gc_worklist_destroy(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVM_free(worklist->list); worklist->list = NULL; MVM_free(worklist->frames_list); worklist->frames_list = NULL; MVM_free(worklist); } /* Move things from the frames worklist to the object worklist. */ void MVM_gc_worklist_mark_frame_roots(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMFrame *cur_frame; while ((cur_frame = MVM_gc_worklist_get_frame((tc), (worklist)))) MVM_gc_root_add_frame_roots_to_worklist((tc), (worklist), cur_frame); } MoarVM-2015.11/src/gc/worklist.h0000644000175000017500000001066512456307241015273 0ustar jnthnjnthn/* A worklist holds the current set of pointers we have got in the queue * to scan. We hide away the details of it behind this abstraction since * the order in which we hand things back from it can have a big influence * on locality in the copied/compacted heap, and thus mutator performance. * * For the time being, we do the simplest possible thing: just make it a * stack. This actually has reasonable properties if we scan objects right * after they are copied/moved, since an object's children will then come * right after the object itself - unless they were copied/moved earlier. * But things aren't quite so rosy for deeply nested data structures, where * two siblings may thus end up far apart. Lots of stuff in the literature * on these issues, but for now this is probably less bad than some of the * other options. */ struct MVMGCWorklist { /* The worklist itself. An array of addresses which hold pointers to * collectables (yes, two levels of indirection, since we need to * update addresses in copying/moving algorithms.) */ MVMCollectable ***list; MVMFrame **frames_list; /* The number of items on the worklist. */ MVMuint32 items; MVMuint32 frames; /* The number of items the work list is allocated to hold. */ MVMuint32 alloc; MVMuint32 frames_alloc; /* Whether we should include gen2 entries. */ MVMuint8 include_gen2; }; /* Turn this on to define a worklist addition that panics if it spots * something untoward with an object being added to a worklist. */ #define MVM_GC_WORKLIST_DEBUG_ADD 0 /* Some macros for doing stuff fast with worklists, defined to look like * functions since perhaps they become them in the future if needed. */ #if MVM_GC_WORKLIST_DEBUG_ADD #define MVM_gc_worklist_add(tc, worklist, item) \ do { \ MVMCollectable **item_to_add = (MVMCollectable **)(item);\ if (*item_to_add) { \ if ((*item_to_add)->owner == 0) \ MVM_panic(1, "Zeroed owner in item added to GC worklist"); \ if ((*item_to_add)->flags & MVM_CF_STABLE == 0 && !STABLE(*item_to_add)) \ MVM_panic(1, "NULL STable in time added to GC worklist"); \ } \ if (*item_to_add && (worklist->include_gen2 || !((*item_to_add)->flags & MVM_CF_SECOND_GEN))) { \ if (worklist->items == worklist->alloc) \ MVM_gc_worklist_add_slow(tc, worklist, item_to_add); \ else \ worklist->list[worklist->items++] = item_to_add; \ } \ } while (0) #else #define MVM_gc_worklist_add(tc, worklist, item) \ do { \ MVMCollectable **item_to_add = (MVMCollectable **)(item);\ if (*item_to_add && (worklist->include_gen2 || !((*item_to_add)->flags & MVM_CF_SECOND_GEN))) { \ if (worklist->items == worklist->alloc) \ MVM_gc_worklist_add_slow(tc, worklist, item_to_add); \ else \ worklist->list[worklist->items++] = item_to_add; \ } \ } while (0) #endif #define MVM_gc_worklist_add_frame(tc, worklist, frame) \ do { \ if ((frame) && MVM_load(&(tc)->instance->gc_seq_number) != MVM_load(&(frame)->gc_seq_number)) { \ if (worklist->frames == worklist->frames_alloc) \ MVM_gc_worklist_add_frame_slow(tc, worklist, (frame)); \ else \ worklist->frames_list[worklist->frames++] = (frame); \ } \ } while (0) #define MVM_gc_worklist_get(tc, worklist) \ (worklist->items ? \ worklist->list[--worklist->items] : \ NULL) #define MVM_gc_worklist_get_frame(tc, worklist) \ (worklist->frames ? \ worklist->frames_list[--worklist->frames] : \ NULL) /* Various functions for worklist manipulation. */ MVMGCWorklist * MVM_gc_worklist_create(MVMThreadContext *tc, MVMuint8 include_gen2); MVM_PUBLIC void MVM_gc_worklist_add_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable **item); MVM_PUBLIC void MVM_gc_worklist_add_frame_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame); void MVM_gc_worklist_presize_for(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMint32 items); void MVM_gc_worklist_destroy(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_worklist_mark_frame_roots(MVMThreadContext *tc, MVMGCWorklist *worklist); /* The number of pointers we assume the list may need to hold initially; * it will be resized as needed. */ #define MVM_GC_WORKLIST_START_SIZE 256 MoarVM-2015.11/src/gcc_diag.h0000644000175000017500000000144012456307241014533 0ustar jnthnjnthn/* GCC diagnostics control macros courtesy of: * http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html */ #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402 # define GCC_DIAG_STR(s) #s # define GCC_DIAG_JOINSTR(x,y) GCC_DIAG_STR(x ## y) # define GCC_DIAG_DO_PRAGMA(x) _Pragma (#x) # define GCC_DIAG_PRAGMA(x) GCC_DIAG_DO_PRAGMA(GCC diagnostic x) # if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 # define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(push) \ GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x)) # define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(pop) # else # define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x)) # define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(warning GCC_DIAG_JOINSTR(-W,x)) # endif #else # define GCC_DIAG_OFF(x) # define GCC_DIAG_ON(x) #endif MoarVM-2015.11/src/gen/IGNOREME0000644000175000017500000000000012456307241014532 0ustar jnthnjnthnMoarVM-2015.11/src/instrument/crossthreadwrite.c0000644000175000017500000002007112574526172020622 0ustar jnthnjnthn#include "moar.h" /* Walk graph and insert write check instructions. */ static void prepend_ctw_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *before_ins, MVMSpeshOperand check_reg, MVMint16 guilty) { MVMSpeshIns *ctw_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ctw_ins->info = MVM_op_get_op(MVM_OP_ctw_check); ctw_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); ctw_ins->operands[0] = check_reg; ctw_ins->operands[1].lit_i16 = guilty; MVM_spesh_manipulate_insert_ins(tc, bb, before_ins->prev, ctw_ins); } static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *bb = g->entry->linear_next; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_rebless: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_REBLESS); case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_ATTR); break; case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_POS); break; case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_PUSH); break; case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[1], MVM_CTW_POP); break; case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[1], MVM_CTW_SHIFT); break; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_UNSHIFT); break; case MVM_OP_splice: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_SPLICE); break; case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_KEY); break; case MVM_OP_deletekey: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_DELETE_KEY); break; case MVM_OP_assign: case MVM_OP_assignunchecked: case MVM_OP_assign_i: case MVM_OP_assign_n: case MVM_OP_assign_s: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_ASSIGN); break; case MVM_OP_bindpos2d_i: case MVM_OP_bindpos2d_n: case MVM_OP_bindpos2d_s: case MVM_OP_bindpos2d_o: case MVM_OP_bindpos3d_i: case MVM_OP_bindpos3d_n: case MVM_OP_bindpos3d_s: case MVM_OP_bindpos3d_o: case MVM_OP_bindposnd_i: case MVM_OP_bindposnd_n: case MVM_OP_bindposnd_s: case MVM_OP_bindposnd_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_POS); break; } ins = ins->next; } bb = bb->linear_next; } } /* Adds instrumented version of the unspecialized bytecode. */ static void add_instrumentation(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshCode *sc; MVMSpeshGraph *sg = MVM_spesh_graph_create(tc, sf, 1); instrument_graph(tc, sg); sc = MVM_spesh_codegen(tc, sg); sf->body.instrumented_bytecode = sc->bytecode; sf->body.instrumented_handlers = sc->handlers; sf->body.instrumented_bytecode_size = sc->bytecode_size; sf->body.uninstrumented_bytecode = sf->body.bytecode; sf->body.uninstrumented_handlers = sf->body.handlers; sf->body.uninstrumented_bytecode_size = sf->body.bytecode_size; MVM_spesh_graph_destroy(tc, sg); MVM_free(sc); } /* Instruments code with detection and reporting of cross-thread writes. */ void MVM_cross_thread_write_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { if (sf->body.bytecode != sf->body.instrumented_bytecode) { /* Handle main, non-specialized, bytecode. */ if (!sf->body.instrumented_bytecode) add_instrumentation(tc, sf); sf->body.bytecode = sf->body.instrumented_bytecode; sf->body.handlers = sf->body.instrumented_handlers; sf->body.bytecode_size = sf->body.instrumented_bytecode_size; /* Throw away any specializations; we'll need to reproduce them as * instrumented versions. */ sf->body.num_spesh_candidates = 0; sf->body.spesh_candidates = NULL; } } /* Filter out some special cases to reduce noise. */ static MVMint64 filtered_out(MVMThreadContext *tc, MVMObject *written) { /* If we're holding locks, exclude by default (unless we were asked to * also include these). */ if (tc->num_locks && !tc->instance->cross_thread_write_logging_include_locked) return 1; /* Operations on a concurrent queue are fine 'cus it's concurrent. */ if (REPR(written)->ID == MVM_REPR_ID_ConcBlockingQueue) return 1; /* Otherwise, may be relevant. */ return 0; } /* Squeal if the target of the write wasn't allocated by us. */ void MVM_cross_thread_write_check(MVMThreadContext *tc, MVMObject *written, MVMint16 guilty) { if (written->header.owner != tc->thread_id && !filtered_out(tc, written)) { char *guilty_desc = "did something to"; switch (guilty) { case MVM_CTW_BIND_ATTR: guilty_desc = "bound to an attribute of"; break; case MVM_CTW_BIND_POS: guilty_desc = "bound to an array slot of"; break; case MVM_CTW_PUSH: guilty_desc = "pushed to"; break; case MVM_CTW_POP: guilty_desc = "popped"; break; case MVM_CTW_SHIFT: guilty_desc = "shifted"; break; case MVM_CTW_UNSHIFT: guilty_desc = "unshifted to"; break; case MVM_CTW_SPLICE: guilty_desc = "spliced"; break; case MVM_CTW_BIND_KEY: guilty_desc = "bound to a hash key of"; break; case MVM_CTW_DELETE_KEY: guilty_desc = "deleted a hash key of"; break; case MVM_CTW_ASSIGN: guilty_desc = "assigned to"; break; case MVM_CTW_REBLESS: guilty_desc = "reblessed"; break; } uv_mutex_lock(&(tc->instance->mutex_cross_thread_write_logging)); fprintf(stderr, "Thread %d %s an object allocated by thread %d\n", tc->thread_id, guilty_desc, written->header.owner); MVM_dump_backtrace(tc); fprintf(stderr, "\n"); uv_mutex_unlock(&(tc->instance->mutex_cross_thread_write_logging)); } } MoarVM-2015.11/src/instrument/crossthreadwrite.h0000644000175000017500000000117612554473060020627 0ustar jnthnjnthnvoid MVM_cross_thread_write_instrument(MVMThreadContext *tc, MVMStaticFrame *static_frame); void MVM_cross_thread_write_check(MVMThreadContext *tc, MVMObject *written, MVMint16 guilty); /* Mutating operations one thread may do on an object it didn't create. */ #define MVM_CTW_BIND_ATTR 1 #define MVM_CTW_BIND_POS 2 #define MVM_CTW_PUSH 3 #define MVM_CTW_POP 4 #define MVM_CTW_SHIFT 5 #define MVM_CTW_UNSHIFT 6 #define MVM_CTW_SPLICE 7 #define MVM_CTW_BIND_KEY 8 #define MVM_CTW_DELETE_KEY 9 #define MVM_CTW_ASSIGN 10 #define MVM_CTW_REBLESS 11 MoarVM-2015.11/src/io/asyncsocket.c0000644000175000017500000007173612623370227015762 0ustar jnthnjnthn#include "moar.h" /* Number of bytes we accept per read. */ #define CHUNK_SIZE 65536 /* Data that we keep for an asynchronous socket handle. */ typedef struct { /* The libuv handle to the socket. */ uv_stream_t *handle; /* Decode stream, for turning bytes into strings. */ MVMDecodeStream *ds; } MVMIOAsyncSocketData; /* Info we convey about a read task. */ typedef struct { MVMOSHandle *handle; MVMDecodeStream *ds; MVMObject *buf_type; int seq_number; MVMThreadContext *tc; int work_idx; } ReadInfo; /* Allocates a buffer of the suggested size. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { size_t size = suggested_size > 0 ? suggested_size : 4; buf->base = MVM_malloc(size); buf->len = size; } /* Read handler. */ static void on_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { ReadInfo *ri = (ReadInfo *)handle->data; MVMThreadContext *tc = ri->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, ri->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (nread > 0) { MVMROOT(tc, t, { MVMROOT(tc, arr, { /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number++); MVM_repr_push_o(tc, arr, seq_boxed); /* Either need to produce a buffer or decode characters. */ if (ri->ds) { MVMString *str; MVMObject *boxed_str; MVM_string_decodestream_add_bytes(tc, ri->ds, buf->base, nread); str = MVM_string_decodestream_get_all(tc, ri->ds); boxed_str = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, str); MVM_repr_push_o(tc, arr, boxed_str); } else { MVMArray *res_buf = (MVMArray *)MVM_repr_alloc_init(tc, ri->buf_type); res_buf->body.slots.i8 = (MVMint8 *)buf->base; res_buf->body.start = 0; res_buf->body.ssize = nread; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); } /* Finally, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); } else if (nread == UV_EOF) { MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMObject *minus_one = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, -1); MVM_repr_push_o(tc, arr, minus_one); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); if (buf->base) MVM_free(buf->base); uv_read_stop(handle); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(nread)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); if (buf->base) MVM_free(buf->base); uv_read_stop(handle); } MVM_repr_push_o(tc, t->body.queue, arr); } /* Does setup work for setting up asynchronous reads. */ static void read_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncSocketData *handle_data; int r; /* Add to work in progress. */ ReadInfo *ri = (ReadInfo *)data; ri->tc = tc; ri->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Start reading the stream. */ handle_data = (MVMIOAsyncSocketData *)ri->handle->body.data; handle_data->handle->data = data; if ((r = uv_read_start(handle_data->handle, on_alloc, on_read)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } } /* Marks objects for a read task. */ static void read_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { ReadInfo *ri = (ReadInfo *)data; MVM_gc_worklist_add(tc, worklist, &ri->buf_type); MVM_gc_worklist_add(tc, worklist, &ri->handle); } /* Frees info for a read task. */ static void read_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { ReadInfo *ri = (ReadInfo *)data; if (ri->ds) MVM_string_decodestream_destory(tc, ri->ds); MVM_free(data); } } /* Operations table for async read task. */ static const MVMAsyncTaskOps read_op_table = { read_setup, NULL, read_gc_mark, read_gc_free }; static MVMAsyncTask * read_chars(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *async_type) { MVMAsyncTask *task; ReadInfo *ri; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncreadchars target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncreadchars result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &read_op_table; ri = MVM_calloc(1, sizeof(ReadInfo)); ri->ds = MVM_string_decodestream_create(tc, MVM_encoding_type_utf8, 0); MVM_ASSIGN_REF(tc, &(task->common.header), ri->handle, h); task->body.data = ri; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } static MVMAsyncTask * read_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type) { MVMAsyncTask *task; ReadInfo *ri; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncreadbytes target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncreadbytes result type must have REPR AsyncTask"); if (REPR(buf_type)->ID == MVM_REPR_ID_MVMArray) { MVMint32 slot_type = ((MVMArrayREPRData *)STABLE(buf_type)->REPR_data)->slot_type; if (slot_type != MVM_ARRAY_U8 && slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array of uint8 or int8"); } else { MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array"); } /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { MVMROOT(tc, buf_type, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &read_op_table; ri = MVM_calloc(1, sizeof(ReadInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), ri->buf_type, buf_type); MVM_ASSIGN_REF(tc, &(task->common.header), ri->handle, h); task->body.data = ri; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } /* Info we convey about a write task. */ typedef struct { MVMOSHandle *handle; MVMString *str_data; MVMObject *buf_data; uv_write_t *req; uv_buf_t buf; MVMThreadContext *tc; int work_idx; } WriteInfo; /* Completion handler for an asynchronous write. */ static void on_write(uv_write_t *req, int status) { WriteInfo *wi = (WriteInfo *)req->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMObject *bytes_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, wi->buf.len); MVM_repr_push_o(tc, arr, bytes_box); }); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); } MVM_repr_push_o(tc, t->body.queue, arr); if (wi->str_data) MVM_free(wi->buf.base); MVM_free(wi->req); } /* Does setup work for an asynchronous write. */ static void write_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncSocketData *handle_data; char *output; int output_size, r; /* Add to work in progress. */ WriteInfo *wi = (WriteInfo *)data; wi->tc = tc; wi->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Encode the string, or extract buf data. */ if (wi->str_data) { MVMuint64 output_size_64; output = MVM_string_utf8_encode(tc, wi->str_data, &output_size_64); output_size = (int)output_size_64; } else { MVMArray *buffer = (MVMArray *)wi->buf_data; output = (char *)(buffer->body.slots.i8 + buffer->body.start); output_size = (int)buffer->body.elems; } /* Create and initialize write request. */ wi->req = MVM_malloc(sizeof(uv_write_t)); wi->buf = uv_buf_init(output, output_size); wi->req->data = data; handle_data = (MVMIOAsyncSocketData *)wi->handle->body.data; if (uv_is_closing((uv_handle_t *)handle_data->handle)) MVM_exception_throw_adhoc(tc, "cannot write to a closed socket"); if ((r = uv_write(wi->req, handle_data->handle, &(wi->buf), 1, on_write)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handle. */ MVM_free(wi->req); wi->req = NULL; } } /* Marks objects for a write task. */ static void write_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { WriteInfo *wi = (WriteInfo *)data; MVM_gc_worklist_add(tc, worklist, &wi->handle); MVM_gc_worklist_add(tc, worklist, &wi->str_data); MVM_gc_worklist_add(tc, worklist, &wi->buf_data); } /* Frees info for a write task. */ static void write_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async write task. */ static const MVMAsyncTaskOps write_op_table = { write_setup, NULL, write_gc_mark, write_gc_free }; static MVMAsyncTask * write_str(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMString *s, MVMObject *async_type) { MVMAsyncTask *task; WriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritestr target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritestr result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { MVMROOT(tc, s, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(WriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->str_data, s); task->body.data = wi; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } static MVMAsyncTask * write_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMAsyncTask *task; WriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritebytes target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritebytes result type must have REPR AsyncTask"); if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array of uint8 or int8"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { MVMROOT(tc, buffer, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(WriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->buf_data, buffer); task->body.data = wi; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } /* Does an asynchronous close (since it must run on the event loop). */ static void close_cb(uv_handle_t *handle) { MVM_free(handle); } static void close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { uv_handle_t *handle = (uv_handle_t *)data; if (uv_is_closing(handle)) MVM_exception_throw_adhoc(tc, "cannot close a closed socket"); uv_close(handle, close_cb); } /* Operations table for async close task. */ static const MVMAsyncTaskOps close_op_table = { close_perform, NULL, NULL, NULL }; static MVMint64 close_socket(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOAsyncSocketData *data = (MVMIOAsyncSocketData *)h->body.data; MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &close_op_table; task->body.data = data->handle; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return 0; } static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOAsyncSocketData *data = (MVMIOAsyncSocketData *)d; if (data->ds) { MVM_string_decodestream_destory(tc, data->ds); data->ds = NULL; } } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { close_socket }; static const MVMIOAsyncReadable async_readable = { read_chars, read_bytes }; static const MVMIOAsyncWritable async_writable = { write_str, write_bytes }; static const MVMIOOps op_table = { &closable, NULL, NULL, NULL, &async_readable, &async_writable, NULL, NULL, NULL, NULL, NULL, NULL, gc_free }; /* Info we convey about a connection attempt task. */ typedef struct { struct sockaddr *dest; uv_tcp_t *socket; uv_connect_t *connect; MVMThreadContext *tc; int work_idx; } ConnectInfo; /* When a connection takes place, need to keep the appropriate promise. */ static void on_connect(uv_connect_t* req, int status) { ConnectInfo *ci = (ConnectInfo *)req->data; MVMThreadContext *tc = ci->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, ci->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { /* Allocate and set up handle. */ MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMOSHandle *result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOAsyncSocketData *data = MVM_calloc(1, sizeof(MVMIOAsyncSocketData)); data->handle = (uv_stream_t *)ci->socket; result->body.ops = &op_table; result->body.data = data; MVM_repr_push_o(tc, arr, (MVMObject *)result); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); } MVM_repr_push_o(tc, t->body.queue, arr); MVM_free(req); } /* Initilalize the connection on the event loop. */ static void connect_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { int r; /* Add to work in progress. */ ConnectInfo *ci = (ConnectInfo *)data; ci->tc = tc; ci->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Create and initialize socket and connection. */ ci->socket = MVM_malloc(sizeof(uv_tcp_t)); ci->connect = MVM_malloc(sizeof(uv_connect_t)); ci->connect->data = data; if ((r = uv_tcp_init(loop, ci->socket)) < 0 || (r = uv_tcp_connect(ci->connect, ci->socket, ci->dest, on_connect)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handles. */ MVM_free(ci->socket); ci->socket = NULL; MVM_free(ci->connect); ci->connect = NULL; } } /* Frees info for a connection task. */ static void connect_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { ConnectInfo *ci = (ConnectInfo *)data; if (ci->dest) MVM_free(ci->dest); MVM_free(ci); } } /* Operations table for async connect task. */ static const MVMAsyncTaskOps connect_op_table = { connect_setup, NULL, NULL, connect_gc_free }; /* Sets off an asynchronous socket connection. */ MVMObject * MVM_io_socket_connect_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type) { MVMAsyncTask *task; ConnectInfo *ci; /* Resolve hostname. (Could be done asynchronously too.) */ struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncconnect target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncconnect result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &connect_op_table; ci = MVM_calloc(1, sizeof(ConnectInfo)); ci->dest = dest; task->body.data = ci; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)task; } /* Info we convey about a socket listen task. */ typedef struct { struct sockaddr *dest; uv_tcp_t *socket; MVMThreadContext *tc; int work_idx; } ListenInfo; /* Handles an incoming connection. */ static void on_connection(uv_stream_t *server, int status) { ListenInfo *li = (ListenInfo *)server->data; MVMThreadContext *tc = li->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, li->work_idx); uv_tcp_t *client = MVM_malloc(sizeof(uv_tcp_t)); int r; uv_tcp_init(tc->loop, client); MVM_repr_push_o(tc, arr, t->body.schedulee); if ((r = uv_accept(server, (uv_stream_t *)client)) == 0) { /* Allocate and set up handle. */ MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMOSHandle *result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOAsyncSocketData *data = MVM_calloc(1, sizeof(MVMIOAsyncSocketData)); data->handle = (uv_stream_t *)client; result->body.ops = &op_table; result->body.data = data; MVM_repr_push_o(tc, arr, (MVMObject *)result); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); } else { uv_close((uv_handle_t*)client, NULL); MVM_free(client); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); } MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets up a socket listener. */ static void listen_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { int r; /* Add to work in progress. */ ListenInfo *li = (ListenInfo *)data; li->tc = tc; li->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Create and initialize socket and connection. */ li->socket = MVM_malloc(sizeof(uv_tcp_t)); li->socket->data = data; if ((r = uv_tcp_init(loop, li->socket)) < 0 || (r = uv_tcp_bind(li->socket, li->dest, 0)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); MVM_free(li->socket); li->socket = NULL; return; } /* Start listening. */ uv_listen((uv_stream_t *)li->socket, 128, on_connection); } /* Stops listening. */ static void listen_cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { ListenInfo *li = (ListenInfo *)data; uv_close((uv_handle_t *)li->socket, NULL); } /* Frees info for a listen task. */ static void listen_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { ListenInfo *li = (ListenInfo *)data; if (li->dest) MVM_free(li->dest); MVM_free(li); } } /* Operations table for async listen task. */ static const MVMAsyncTaskOps listen_op_table = { listen_setup, listen_cancel, NULL, listen_gc_free }; /* Initiates an async socket listener. */ MVMObject * MVM_io_socket_listen_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type) { MVMAsyncTask *task; ListenInfo *li; /* Resolve hostname. (Could be done asynchronously too.) */ struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asynclisten target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asynclisten result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &listen_op_table; li = MVM_calloc(1, sizeof(ListenInfo)); li->dest = dest; task->body.data = li; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)task; } MoarVM-2015.11/src/io/asyncsocket.h0000644000175000017500000000050312456307241015747 0ustar jnthnjnthnMVMObject * MVM_io_socket_connect_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type); MVMObject * MVM_io_socket_listen_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type); MoarVM-2015.11/src/io/dirops.c0000644000175000017500000002551212623370227014723 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include #endif #ifdef _WIN32 # define IS_SLASH(c) ((c) == L'\\' || (c) == L'/') # define IS_NOT_SLASH(c) ((c) != L'\\' && (c) != L'/') #else # define IS_SLASH(c) ((c) == '/') # define IS_NOT_SLASH(c) ((c) != '/') #endif #ifdef _WIN32 static wchar_t * UTF8ToUnicode(char *str) { const int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, str, -1, result, len); return result; } static char * UnicodeToUTF8(const wchar_t *str) { const int len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); char * const result = (char *)MVM_malloc(len * sizeof(char)); WideCharToMultiByte(CP_UTF8, 0, str, -1, result, len, NULL, NULL); return result; } static int mkdir_p(wchar_t *pathname, MVMint64 mode) { size_t len = wcslen(pathname); #else static int mkdir_p(char *pathname, MVMint64 mode) { size_t len = strlen(pathname); #endif ssize_t r; char tmp; while (len > 0 && IS_SLASH(pathname[len - 1])) len--; tmp = pathname[len]; pathname[len] = '\0'; #ifdef _WIN32 r = CreateDirectoryW(pathname, NULL); if (!r && GetLastError() == ERROR_PATH_NOT_FOUND) #else r = mkdir(pathname, mode); if (r == -1 && errno == ENOENT) #endif { ssize_t _len = len - 1; char _tmp; while (_len >= 0 && IS_NOT_SLASH(pathname[_len])) _len--; _tmp = pathname[_len]; pathname[_len] = '\0'; r = mkdir_p(pathname, mode); pathname[_len] = _tmp; #ifdef _WIN32 if(r) { r = CreateDirectoryW(pathname, NULL); } #else if(r == 0) { r = mkdir(pathname, mode); } #endif } pathname[len] = tmp; return r; } /* Create a directory recursively. */ void MVM_dir_mkdir(MVMThreadContext *tc, MVMString *path, MVMint64 mode) { char * const pathname = MVM_string_utf8_c8_encode_C_string(tc, path); #ifdef _WIN32 /* Must using UTF8ToUnicode for supporting CJK Windows file name. */ wchar_t *wpathname = UTF8ToUnicode(pathname); int str_len = wcslen(wpathname); if (str_len > MAX_PATH) { wchar_t abs_dirname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wpathname, 4096, abs_dirname, &lpp_part)) { MVM_exception_throw_adhoc(tc, "Directory path is wrong: %d", GetLastError()); } MVM_free(wpathname); str_len = wcslen(abs_dirname); wpathname = (wchar_t *)MVM_malloc((str_len + 4) * sizeof(wchar_t)); wcscpy(wpathname, L"\\\\?\\"); wcscat(wpathname, abs_dirname); } if (!mkdir_p(wpathname, mode)) { DWORD error = GetLastError(); if (error != ERROR_ALREADY_EXISTS) { MVM_free(pathname); MVM_free(wpathname); MVM_exception_throw_adhoc(tc, "Failed to mkdir: %d", error); } } MVM_free(wpathname); #else if (mkdir_p(pathname, mode) == -1 && errno != EEXIST) { MVM_free(pathname); MVM_exception_throw_adhoc(tc, "Failed to mkdir: %d", errno); } #endif MVM_free(pathname); } /* Remove a directory recursively. */ void MVM_dir_rmdir(MVMThreadContext *tc, MVMString *path) { char * const pathname = MVM_string_utf8_c8_encode_C_string(tc, path); uv_fs_t req; if(uv_fs_rmdir(tc->loop, &req, pathname, NULL) < 0 ) { MVM_free(pathname); MVM_exception_throw_adhoc(tc, "Failed to rmdir: %s", uv_strerror(req.result)); } MVM_free(pathname); } /* Get the current working directory. */ MVMString * MVM_dir_cwd(MVMThreadContext *tc) { #ifdef _WIN32 char path[MAX_PATH]; size_t max_path = MAX_PATH; int r; #else char path[PATH_MAX]; size_t max_path = PATH_MAX; int r; #endif if ((r = uv_cwd(path, (size_t *)&max_path)) < 0) { MVM_exception_throw_adhoc(tc, "chdir failed: %s", uv_strerror(r)); } return MVM_string_utf8_c8_decode(tc, tc->instance->VMString, path, strlen(path)); } /* Change directory. */ void MVM_dir_chdir(MVMThreadContext *tc, MVMString *dir) { char * const dirstring = MVM_string_utf8_c8_encode_C_string(tc, dir); if (uv_chdir((const char *)dirstring) != 0) { MVM_free(dirstring); MVM_exception_throw_adhoc(tc, "chdir failed: %s", uv_strerror(errno)); } MVM_free(dirstring); } /* Structure to keep track of directory iteration state. */ typedef struct { #ifdef _WIN32 wchar_t *dir_name; HANDLE dir_handle; #else DIR *dir_handle; #endif MVMuint8 encoding; } MVMIODirIter; /* Sets the encoding used for reading the directory listing. */ static void set_encoding(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding) { MVMIODirIter *data = (MVMIODirIter *)h->body.data; data->encoding = encoding; } /* Frees data associated with the directory handle. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIODirIter *data = (MVMIODirIter *)d; if (data) { #ifdef _WIN32 if (data->dir_name) MVM_free(data->dir_name); if (data->dir_handle) FindClose(data->dir_handle); #else if (data->dir_handle) closedir(data->dir_handle); #endif MVM_free(data); } } /* Ops table for directory iterator; it all works off special ops, so almost * no entries. */ static const MVMIOEncodable encodable = { set_encoding }; static const MVMIOOps op_table = { NULL, &encodable, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gc_free }; /* Open a filehandle, returning a handle. */ MVMObject * MVM_dir_open(MVMThreadContext *tc, MVMString *dirname) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIODirIter * const data = MVM_calloc(1, sizeof(MVMIODirIter)); #ifdef _WIN32 char *name; int str_len; wchar_t *wname; wchar_t *dir_name; name = MVM_string_utf8_c8_encode_C_string(tc, dirname); wname = UTF8ToUnicode(name); MVM_free(name); str_len = wcslen(wname); if (str_len > MAX_PATH - 2) { // the length of later appended '\*' is 2 wchar_t abs_dirname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wname, 4096, abs_dirname, &lpp_part)) { MVM_free(wname); MVM_exception_throw_adhoc(tc, "Directory path is wrong: %d", GetLastError()); } MVM_free(wname); str_len = wcslen(abs_dirname); dir_name = (wchar_t *)MVM_malloc((str_len + 7) * sizeof(wchar_t)); wcscpy(dir_name, L"\\\\?\\"); wcscat(dir_name, abs_dirname); } else { dir_name = (wchar_t *)MVM_malloc((str_len + 3) * sizeof(wchar_t)); wcscpy(dir_name, wname); MVM_free(wname); } wcscat(dir_name, L"\\*"); /* Three characters are for the "\*" plus NULL appended. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx */ data->dir_name = dir_name; data->dir_handle = INVALID_HANDLE_VALUE; #else char * const dir_name = MVM_string_utf8_c8_encode_C_string(tc, dirname); DIR * const dir_handle = opendir(dir_name); MVM_free(dir_name); if (!dir_handle) MVM_exception_throw_adhoc(tc, "Failed to open dir: %d", errno); data->dir_handle = dir_handle; #endif data->encoding = MVM_encoding_type_utf8; result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } /* Casts to a handle, checking it's a directory handle along the way. */ static MVMOSHandle * get_dirhandle(MVMThreadContext *tc, MVMObject *oshandle, const char *msg) { MVMOSHandle *handle = (MVMOSHandle *)oshandle; if (REPR(oshandle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle", msg); if (handle->body.ops != &op_table) MVM_exception_throw_adhoc(tc, "%s got incorrect kind of handle", msg); return handle; } /* Reads a directory entry from a directory. */ MVMString * MVM_dir_read(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = get_dirhandle(tc, oshandle, "readdir"); MVMIODirIter *data = (MVMIODirIter *)handle->body.data; #ifdef _WIN32 MVMString *result; TCHAR dir[MAX_PATH]; WIN32_FIND_DATAW ffd; char *dir_str; if (data->dir_handle == INVALID_HANDLE_VALUE) { HANDLE hFind = FindFirstFileW(data->dir_name, &ffd); if (hFind == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "read from dirhandle failed: %d", GetLastError()); } data->dir_handle = hFind; dir_str = UnicodeToUTF8(ffd.cFileName); result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, dir_str, strlen(dir_str)); MVM_free(dir_str); return result; } else if (FindNextFileW(data->dir_handle, &ffd) != 0) { dir_str = UnicodeToUTF8(ffd.cFileName); result = MVM_string_decode(tc, tc->instance->VMString, dir_str, strlen(dir_str), data->encoding); MVM_free(dir_str); return result; } else { return tc->instance->str_consts.empty; } #else struct dirent entry; struct dirent *result; int ret; ret = readdir_r(data->dir_handle, &entry, &result); if (ret == 0) { if (result == NULL) return tc->instance->str_consts.empty; return MVM_string_decode(tc, tc->instance->VMString, entry.d_name, strlen(entry.d_name), data->encoding); } MVM_exception_throw_adhoc(tc, "Failed to read dirhandle: %d", errno); #endif } void MVM_dir_close(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = get_dirhandle(tc, oshandle, "readdir"); MVMIODirIter *data = (MVMIODirIter *)handle->body.data; #ifdef _WIN32 if (data->dir_name) { MVM_free(data->dir_name); data->dir_name = NULL; } if (!FindClose(data->dir_handle)) MVM_exception_throw_adhoc(tc, "Failed to close dirhandle: %d", GetLastError()); data->dir_handle = NULL; #else if (closedir(data->dir_handle) == -1) MVM_exception_throw_adhoc(tc, "Failed to close dirhandle: %d", errno); data->dir_handle = NULL; #endif } MoarVM-2015.11/src/io/dirops.h0000644000175000017500000000066612456307241014733 0ustar jnthnjnthnvoid MVM_dir_mkdir(MVMThreadContext *tc, MVMString *path, MVMint64 mode); void MVM_dir_rmdir(MVMThreadContext *tc, MVMString *path); MVMObject * MVM_dir_open(MVMThreadContext *tc, MVMString *dirname); MVMString * MVM_dir_read(MVMThreadContext *tc, MVMObject *oshandle); void MVM_dir_close(MVMThreadContext *tc, MVMObject *oshandle); MVMString * MVM_dir_cwd(MVMThreadContext *tc); void MVM_dir_chdir(MVMThreadContext *tc, MVMString *dir); MoarVM-2015.11/src/io/eventloop.c0000644000175000017500000001324112536002531015423 0ustar jnthnjnthn#include "moar.h" /* Asynchronous I/O, timers, file system notifications and signal handlers * have their callbacks processed by this event loop. Its job is mostly to * fire off work, receive the callbacks, and put stuff into the concurrent * work queue of some scheduler or other. It's backed by a thread that is * started in the usual way, but never actually ends up in interpreter; * instead, it enters a libuv event loop "forever", until program exit. * * Work is sent to the event loop by */ /* Sets up an async task to be done on the loop. */ static MVMint64 setup_work(MVMThreadContext *tc) { MVMConcBlockingQueue *queue = (MVMConcBlockingQueue *)tc->instance->event_loop_todo_queue; MVMint64 setup = 0; MVMObject *task_obj; while (!MVM_is_null(tc, task_obj = MVM_concblockingqueue_poll(tc, queue))) { MVMAsyncTask *task = (MVMAsyncTask *)task_obj; task->body.ops->setup(tc, tc->loop, task_obj, task->body.data); setup = 1; } return setup; } /* Performs an async cancellation on the loop. */ static MVMint64 cancel_work(MVMThreadContext *tc) { MVMConcBlockingQueue *queue = (MVMConcBlockingQueue *)tc->instance->event_loop_cancel_queue; MVMint64 cancelled = 0; MVMObject *task_obj; while (!MVM_is_null(tc, task_obj = MVM_concblockingqueue_poll(tc, queue))) { MVMAsyncTask *task = (MVMAsyncTask *)task_obj; if (task->body.ops->cancel) task->body.ops->cancel(tc, tc->loop, task_obj, task->body.data); cancelled = 1; } return cancelled; } /* Fired whenever we were signalled that there is a new task or a new * cancellation for the event loop to process. */ static void async_handler(uv_async_t *handle) { MVMThreadContext *tc = (MVMThreadContext *)handle->data; GC_SYNC_POINT(tc); setup_work(tc); cancel_work(tc); } /* Enters the event loop. */ static void enter_loop(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { uv_async_t *async; uv_prepare_t prep; uv_check_t check; int r; /* Set up async handler so we can be woken up when there's new tasks. */ async = MVM_malloc(sizeof(uv_async_t)); if (uv_async_init(tc->loop, async, async_handler) != 0) MVM_panic(1, "Unable to initialize async wake-up handle for event loop"); async->data = tc; tc->instance->event_loop_wakeup = async; /* Signal that the event loop is ready for processing. */ uv_sem_post(&(tc->instance->sem_event_loop_started)); /* Enter event loop; should never leave it. */ uv_run(tc->loop, UV_RUN_DEFAULT); MVM_panic(1, "Supposedly unending event loop thread ended"); } /* Sees if we have an event loop processing thread set up already, and * sets it up if not. */ static uv_loop_t *get_or_vivify_loop(MVMThreadContext *tc) { MVMInstance *instance = tc->instance; if (!instance->event_loop_thread) { /* Grab starting mutex and ensure we didn't lose the race. */ uv_mutex_lock(&instance->mutex_event_loop_start); if (!instance->event_loop_thread) { MVMObject *thread, *loop_runner; int r; /* Create various bits of state the async event loop thread needs. */ instance->event_loop_todo_queue = MVM_repr_alloc_init(tc, instance->boot_types.BOOTQueue); instance->event_loop_cancel_queue = MVM_repr_alloc_init(tc, instance->boot_types.BOOTQueue); instance->event_loop_active = MVM_repr_alloc_init(tc, instance->boot_types.BOOTArray); /* We need to wait until we know the event loop has started; we'll * use a semaphore for this purpose. */ if ((r = uv_sem_init(&(instance->sem_event_loop_started), 0)) < 0) { uv_mutex_unlock(&instance->mutex_event_loop_start); MVM_exception_throw_adhoc(tc, "Failed to initialize event loop start semaphore: %s", uv_strerror(r)); } /* Start the event loop thread, which will call a C function that * sits in the uv loop, never leaving. */ loop_runner = MVM_repr_alloc_init(tc, instance->boot_types.BOOTCCode); ((MVMCFunction *)loop_runner)->body.func = enter_loop; thread = MVM_thread_new(tc, loop_runner, 1); MVMROOT(tc, thread, { MVM_thread_run(tc, thread); /* Block until we know it's fully started and initialized. */ uv_sem_wait(&(instance->sem_event_loop_started)); uv_sem_destroy(&(instance->sem_event_loop_started)); /* Make the started event loop thread visible to others. */ instance->event_loop_thread = ((MVMThread *)thread)->body.tc; }); } uv_mutex_unlock(&instance->mutex_event_loop_start); } return instance->event_loop_thread->loop; } /* Adds a work item into the event loop work queue. */ void MVM_io_eventloop_queue_work(MVMThreadContext *tc, MVMObject *work) { MVMROOT(tc, work, { get_or_vivify_loop(tc); MVM_repr_push_o(tc, tc->instance->event_loop_todo_queue, work); uv_async_send(tc->instance->event_loop_wakeup); }); } /* Cancels a piece of async work. */ void MVM_io_eventloop_cancel_work(MVMThreadContext *tc, MVMObject *task_obj) { if (REPR(task_obj)->ID == MVM_REPR_ID_MVMAsyncTask) { MVMROOT(tc, task_obj, { get_or_vivify_loop(tc); MVM_repr_push_o(tc, tc->instance->event_loop_cancel_queue, task_obj); uv_async_send(tc->instance->event_loop_wakeup); }); } else { MVM_exception_throw_adhoc(tc, "Can only cancel an AsyncTask handle"); } } MoarVM-2015.11/src/io/eventloop.h0000644000175000017500000000145212456307241015440 0ustar jnthnjnthn/* Operations table for a certain type of asynchronous task that can be run on * the event loop. */ struct MVMAsyncTaskOps { /* How to set work up on the event loop. */ void (*setup) (MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); /* How to cancel, if possible. */ void (*cancel) (MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); /* How to mark the task's data, if needed. */ void (*gc_mark) (MVMThreadContext *tc, void *data, MVMGCWorklist *worklist); /* How to free the task's data, if needed. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *t, void *data); }; void MVM_io_eventloop_queue_work(MVMThreadContext *tc, MVMObject *work); void MVM_io_eventloop_cancel_work(MVMThreadContext *tc, MVMObject *task_obj); MoarVM-2015.11/src/io/fileops.c0000644000175000017500000004113012623370227015056 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include #include #define DEFAULT_MODE 0x01B6 #else #include #define O_CREAT _O_CREAT #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_TRUNC _O_TRUNC #define DEFAULT_MODE _S_IWRITE /* work around sucky libuv defaults */ #endif static uv_stat_t file_info(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, filename); uv_fs_t req; if ((use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to stat file: %s", uv_strerror(req.result)); } MVM_free(a); return req.statbuf; } MVMint64 MVM_file_stat(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat) { MVMint64 r = -1; switch (status) { case MVM_STAT_EXISTS: r = MVM_file_exists(tc, filename, use_lstat); break; case MVM_STAT_FILESIZE: { char * const a = MVM_string_utf8_c8_encode_C_string(tc, filename); uv_fs_t req; if ((use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to stat file: %s", uv_strerror(req.result)); } MVM_free(a); r = req.statbuf.st_size; break; } case MVM_STAT_ISDIR: r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFDIR; break; case MVM_STAT_ISREG: r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFREG; break; case MVM_STAT_ISDEV: { const int mode = file_info(tc, filename, use_lstat).st_mode; #ifdef _WIN32 r = mode & S_IFMT == S_IFCHR; #else r = (mode & S_IFMT) == S_IFCHR || (mode & S_IFMT) == S_IFBLK; #endif break; } case MVM_STAT_CREATETIME: r = file_info(tc, filename, use_lstat).st_ctim.tv_sec; break; case MVM_STAT_ACCESSTIME: r = file_info(tc, filename, use_lstat).st_atim.tv_sec; break; case MVM_STAT_MODIFYTIME: r = file_info(tc, filename, use_lstat).st_mtim.tv_sec; break; case MVM_STAT_CHANGETIME: r = file_info(tc, filename, use_lstat).st_ctim.tv_sec; break; /* case MVM_STAT_BACKUPTIME: r = -1; break; */ case MVM_STAT_UID: r = file_info(tc, filename, use_lstat).st_uid; break; case MVM_STAT_GID: r = file_info(tc, filename, use_lstat).st_gid; break; case MVM_STAT_ISLNK: r = (file_info(tc, filename, 1).st_mode & S_IFMT) == S_IFLNK; break; case MVM_STAT_PLATFORM_DEV: r = file_info(tc, filename, use_lstat).st_dev; break; case MVM_STAT_PLATFORM_INODE: r = file_info(tc, filename, use_lstat).st_ino; break; case MVM_STAT_PLATFORM_MODE: r = file_info(tc, filename, use_lstat).st_mode; break; case MVM_STAT_PLATFORM_NLINKS: r = file_info(tc, filename, use_lstat).st_nlink; break; case MVM_STAT_PLATFORM_DEVTYPE: r = file_info(tc, filename, use_lstat).st_rdev; break; case MVM_STAT_PLATFORM_BLOCKSIZE: r = file_info(tc, filename, use_lstat).st_blksize; break; case MVM_STAT_PLATFORM_BLOCKS: r = file_info(tc, filename, use_lstat).st_blocks; break; default: break; } return r; } /* copy a file from one to another */ void MVM_file_copy(MVMThreadContext *tc, MVMString *src, MVMString * dest) { /* TODO: on Windows we can use the CopyFile API, which is probaly more efficient, not to mention easier to use. */ uv_fs_t req; char * a, * b; uv_file in_fd = -1, out_fd = -1; MVMuint64 size, offset; a = MVM_string_utf8_c8_encode_C_string(tc, src); b = MVM_string_utf8_c8_encode_C_string(tc, dest); /* If the file cannot be stat(), there is little point in going any further. */ if (uv_fs_stat(tc->loop, &req, a, NULL) < 0) goto failure; size = req.statbuf.st_size; in_fd = uv_fs_open(tc->loop, &req, (const char *)a, O_RDONLY, 0, NULL); if (in_fd < 0) { goto failure; } out_fd = uv_fs_open(tc->loop, &req, (const char *)b, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_MODE, NULL); if (out_fd < 0) { goto failure; } offset = 0; do { /* sendfile() traditionally takes offset as a pointer argument * used a both input and output. libuv deviates by making * offset an integer and returning the number of bytes * sent. So it is necessary to add these explicitly. */ MVMint64 sent = uv_fs_sendfile(tc->loop, &req, out_fd, in_fd, offset, size - offset, NULL); if (sent < 0) { goto failure; } offset += sent; } while (offset < size); /* Cleanup */ if(uv_fs_close(tc->loop, &req, in_fd, NULL) < 0) { goto failure; } in_fd = -1; if (uv_fs_close(tc->loop, &req, out_fd, NULL) < 0) { goto failure; } MVM_free(b); MVM_free(a); return; failure: { /* First get the error, since it may be overwritten further on. */ const char * error = uv_strerror(req.result); /* Basic premise: dealing with all failure cases is hard. * So to simplify, a and b are allocated in all conditions. * Also to simplify, in_fd are nonnegative if open, negative * otherwise. */ MVM_free(b); MVM_free(a); /* If any of these fail there is nothing * further to do, since we're already failing */ if (in_fd >= 0) uv_fs_close(tc->loop, &req, in_fd, NULL); if (out_fd >= 0) uv_fs_close(tc->loop, &req, out_fd, NULL); /* This function only throws adhoc errors, so the message is for * progammer eyes only */ MVM_exception_throw_adhoc(tc, "Failed to copy file: %s", error); } } /* rename one file to another. */ void MVM_file_rename(MVMThreadContext *tc, MVMString *src, MVMString *dest) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, src); char * const b = MVM_string_utf8_c8_encode_C_string(tc, dest); uv_fs_t req; if(uv_fs_rename(tc->loop, &req, a, b, NULL) < 0 ) { MVM_free(a); MVM_free(b); MVM_exception_throw_adhoc(tc, "Failed to rename file: %s", uv_strerror(req.result)); } MVM_free(a); MVM_free(b); } void MVM_file_delete(MVMThreadContext *tc, MVMString *f) { uv_fs_t req; char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); #ifdef _WIN32 const int r = MVM_platform_unlink(a); if( r < 0 && r != ENOENT) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to delete file: %d", errno); } #else const int r = uv_fs_unlink(tc->loop, &req, a, NULL); if( r < 0 && r != UV_ENOENT) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to delete file: %s", uv_strerror(req.result)); } #endif MVM_free(a); } void MVM_file_chmod(MVMThreadContext *tc, MVMString *f, MVMint64 flag) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); uv_fs_t req; if(uv_fs_chmod(tc->loop, &req, a, flag, NULL) < 0 ) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to set permissions on path: %s", uv_strerror(req.result)); } MVM_free(a); } MVMint64 MVM_file_exists(MVMThreadContext *tc, MVMString *f, MVMint32 use_lstat) { uv_fs_t req; char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); const MVMint64 result = (use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0 ? 0 : 1; MVM_free(a); return result; } #ifdef _WIN32 #define FILE_IS(name, rwx) \ MVMint64 MVM_file_is ## name (MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { \ if (!MVM_file_exists(tc, filename, use_lstat)) \ return 0; \ else { \ uv_stat_t statbuf = file_info(tc, filename, use_lstat); \ MVMint64 r = (statbuf.st_mode & S_I ## rwx ); \ return r ? 1 : 0; \ } \ } FILE_IS(readable, READ) FILE_IS(writable, WRITE) MVMint64 MVM_file_isexecutable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { if (!MVM_file_exists(tc, filename, use_lstat)) return 0; else { MVMint64 r = 0; uv_stat_t statbuf = file_info(tc, filename, use_lstat); if ((statbuf.st_mode & S_IFMT) == S_IFDIR) return 1; else { // true if fileext is in PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC MVMString *dot = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "."); MVMROOT(tc, dot, { MVMint64 n = MVM_string_index_from_end(tc, filename, dot, 0); if (n >= 0) { MVMString *fileext = MVM_string_substring(tc, filename, n, -1); char *ext = MVM_string_utf8_c8_encode_C_string(tc, fileext); char *pext = getenv("PATHEXT"); int plen = strlen(pext); int i; for (i = 0; i < plen; i++) { if (0 == stricmp(ext, pext++)) { r = 1; break; } } MVM_free(ext); MVM_free(pext); } }); } return r; } } #else #define FILE_IS(name, rwx) \ MVMint64 MVM_file_is ## name (MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { \ if (!MVM_file_exists(tc, filename, use_lstat)) \ return 0; \ else { \ uv_stat_t statbuf = file_info(tc, filename, use_lstat); \ MVMint64 r = (statbuf.st_mode & S_I ## rwx ## OTH) \ || (statbuf.st_uid == geteuid() && (statbuf.st_mode & S_I ## rwx ## USR)) \ || (statbuf.st_uid == getegid() && (statbuf.st_mode & S_I ## rwx ## GRP)); \ return r ? 1 : 0; \ } \ } FILE_IS(readable, R) FILE_IS(writable, W) FILE_IS(executable, X) #endif /* Read all of a file into a string. */ MVMString * MVM_file_slurp(MVMThreadContext *tc, MVMString *filename, MVMString *encoding) { MVMString *mode = MVM_string_utf8_decode(tc, tc->instance->VMString, "r", 1); MVMObject *oshandle = (MVMObject *)MVM_file_open_fh(tc, filename, mode); MVMString *result; MVM_io_set_encoding(tc, oshandle, encoding); result = MVM_io_slurp(tc, oshandle); MVM_io_close(tc, oshandle); return result; } /* Writes a string to a file, overwriting it if necessary */ void MVM_file_spew(MVMThreadContext *tc, MVMString *output, MVMString *filename, MVMString *encoding) { MVMString *mode = MVM_string_utf8_decode(tc, tc->instance->VMString, "w", 1); MVMObject *fh = MVM_file_open_fh(tc, filename, mode); MVM_io_set_encoding(tc, fh, encoding); MVM_io_write_string(tc, fh, output, 0); MVM_io_close(tc, fh); } /* return an OSHandle representing one of the standard streams */ MVMObject * MVM_file_get_stdstream(MVMThreadContext *tc, MVMuint8 type, MVMuint8 readable) { switch(uv_guess_handle(type)) { case UV_TTY: { uv_tty_t * const handle = MVM_malloc(sizeof(uv_tty_t)); uv_tty_init(tc->loop, handle, type, readable); #ifdef _WIN32 uv_stream_set_blocking((uv_stream_t *)handle, 1); #else ((uv_stream_t *)handle)->flags = 0x80; /* UV_STREAM_BLOCKING */ #endif return MVM_io_syncstream_from_uvstream(tc, (uv_stream_t *)handle, 1); } case UV_FILE: return MVM_file_handle_from_fd(tc, type); case UV_NAMED_PIPE: { uv_pipe_t * const handle = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, handle, 0); #ifdef _WIN32 uv_stream_set_blocking((uv_stream_t *)handle, 1); #else ((uv_stream_t *)handle)->flags = 0x80; /* UV_STREAM_BLOCKING */ #endif uv_pipe_open(handle, type); return MVM_io_syncstream_from_uvstream(tc, (uv_stream_t *)handle, 0); } default: MVM_exception_throw_adhoc(tc, "get_stream failed, unsupported std handle"); } } /* Takes a filename and prepends any --libpath value we have, if it's not an * absolute path. */ MVMString * MVM_file_in_libpath(MVMThreadContext *tc, MVMString *orig) { const char **lib_path = tc->instance->lib_path; MVM_gc_root_temp_push(tc, (MVMCollectable **)&orig); if (lib_path) { /* We actually have a lib_path to consider. See if the filename is * absolute (XXX wants a platform abstraction, and doing better). */ char *orig_cstr = MVM_string_utf8_c8_encode_C_string(tc, orig); int absolute = orig_cstr[0] == '/' || orig_cstr[0] == '\\' || (orig_cstr[1] == ':' && orig_cstr[2] == '\\'); if (absolute) { /* Nothing more to do; we have an absolute path. */ MVM_free(orig_cstr); MVM_gc_root_temp_pop(tc); /* orig */ return orig; } else { MVMString *result = NULL; int lib_path_i = 0; MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); while (lib_path[lib_path_i]) { /* Concatenate libpath with filename. */ size_t lib_path_len = strlen(lib_path[lib_path_i]); size_t orig_len = strlen(orig_cstr); int need_sep = lib_path[lib_path_i][lib_path_len - 1] != '/' && lib_path[lib_path_i][lib_path_len - 1] != '\\'; int new_len = lib_path_len + (need_sep ? 1 : 0) + orig_len; char * new_path = MVM_malloc(new_len); memcpy(new_path, lib_path[lib_path_i], lib_path_len); if (need_sep) { new_path[lib_path_len] = '/'; memcpy(new_path + lib_path_len + 1, orig_cstr, orig_len); } else { memcpy(new_path + lib_path_len, orig_cstr, orig_len); } result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, new_path, new_len); MVM_free(new_path); if (!MVM_file_exists(tc, result, 1)) result = orig; else { MVM_free(orig_cstr); MVM_gc_root_temp_pop_n(tc, 2); /* orig and result */ return result; } lib_path_i++; } if (!result || !MVM_file_exists(tc, result, 1)) result = orig; MVM_free(orig_cstr); MVM_gc_root_temp_pop_n(tc, 2); /* orig and result */ return result; } } else { /* No libpath, so just hand back the original name. */ MVM_gc_root_temp_pop(tc); /* orig */ return orig; } } void MVM_file_link(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath) { uv_fs_t req; char * const oldpath_s = MVM_string_utf8_c8_encode_C_string(tc, oldpath); char * const newpath_s = MVM_string_utf8_c8_encode_C_string(tc, newpath); if (uv_fs_link(tc->loop, &req, oldpath_s, newpath_s, NULL)) { MVM_free(oldpath_s); MVM_free(newpath_s); MVM_exception_throw_adhoc(tc, "Failed to link file: %s", uv_strerror(req.result)); } MVM_free(oldpath_s); MVM_free(newpath_s); } void MVM_file_symlink(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath) { uv_fs_t req; char * const oldpath_s = MVM_string_utf8_c8_encode_C_string(tc, oldpath); char * const newpath_s = MVM_string_utf8_c8_encode_C_string(tc, newpath); if (uv_fs_symlink(tc->loop, &req, oldpath_s, newpath_s, 0, NULL)) { MVM_free(oldpath_s); MVM_free(newpath_s); MVM_exception_throw_adhoc(tc, "Failed to symlink file: %s", uv_strerror(req.result)); } MVM_free(oldpath_s); MVM_free(newpath_s); } MVMString * MVM_file_readlink(MVMThreadContext *tc, MVMString *path) { uv_fs_t req; MVMString *result; char * const path_s = MVM_string_utf8_c8_encode_C_string(tc, path); if (uv_fs_readlink(tc->loop, &req, path_s, NULL) < 0) { MVM_free(path_s); MVM_exception_throw_adhoc(tc, "Failed to readlink file: %s", uv_strerror(req.result)); } MVM_free(path_s); result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, req.ptr, strlen(req.ptr)); MVM_free(req.ptr); return result; } MoarVM-2015.11/src/io/fileops.h0000644000175000017500000000467412520766031015075 0ustar jnthnjnthn#define MVM_FILE_FLOCK_SHARED 1 /* Shared lock. Read lock */ #define MVM_FILE_FLOCK_EXCLUSIVE 2 /* Exclusive lock. Write lock. */ #define MVM_FILE_FLOCK_TYPEMASK 0x000F /* a mask of lock type */ #define MVM_FILE_FLOCK_NONBLOCK 0x0010 /* asynchronous block during * locking the file */ #define MVM_STAT_EXISTS 0 #define MVM_STAT_FILESIZE 1 #define MVM_STAT_ISDIR 2 #define MVM_STAT_ISREG 3 #define MVM_STAT_ISDEV 4 #define MVM_STAT_CREATETIME 5 #define MVM_STAT_ACCESSTIME 6 #define MVM_STAT_MODIFYTIME 7 #define MVM_STAT_CHANGETIME 8 #define MVM_STAT_BACKUPTIME 9 #define MVM_STAT_UID 10 #define MVM_STAT_GID 11 #define MVM_STAT_ISLNK 12 #define MVM_STAT_PLATFORM_DEV -1 #define MVM_STAT_PLATFORM_INODE -2 #define MVM_STAT_PLATFORM_MODE -3 #define MVM_STAT_PLATFORM_NLINKS -4 #define MVM_STAT_PLATFORM_DEVTYPE -5 #define MVM_STAT_PLATFORM_BLOCKSIZE -6 #define MVM_STAT_PLATFORM_BLOCKS -7 MVMint64 MVM_file_stat(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat); void MVM_file_copy(MVMThreadContext *tc, MVMString *src, MVMString *dest); void MVM_file_rename(MVMThreadContext *tc, MVMString *src, MVMString *dest); void MVM_file_delete(MVMThreadContext *tc, MVMString *f); void MVM_file_chmod(MVMThreadContext *tc, MVMString *f, MVMint64 flag); MVMint64 MVM_file_exists(MVMThreadContext *tc, MVMString *f, MVMint32 use_lstat); MVMint64 MVM_file_isreadable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMint64 MVM_file_iswritable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMint64 MVM_file_isexecutable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMString * MVM_file_slurp(MVMThreadContext *tc, MVMString *filename, MVMString *encoding); void MVM_file_spew(MVMThreadContext *tc, MVMString *output, MVMString *filename, MVMString *encoding); MVMObject * MVM_file_get_stdstream(MVMThreadContext *tc, MVMuint8 type, MVMuint8 readable); MVMString * MVM_file_in_libpath(MVMThreadContext *tc, MVMString *orig); void MVM_file_link(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath); void MVM_file_symlink(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath); MVMString * MVM_file_readlink(MVMThreadContext *tc, MVMString *path); MoarVM-2015.11/src/io/filewatchers.c0000644000175000017500000001072312623370227016101 0ustar jnthnjnthn#include "moar.h" /* Info we convey about a file watcher. */ typedef struct { char *path; uv_fs_event_t handle; MVMThreadContext *tc; int work_idx; } WatchInfo; static void on_changed(uv_fs_event_t *handle, const char *filename, int events, int status) { WatchInfo *wi = (WatchInfo *)handle->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMObject *filename_boxed; MVMObject *rename_boxed; if (filename) { MVMString *filename_str = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, filename, strlen(filename)); filename_boxed = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, filename_str); } else { filename_boxed = tc->instance->boot_types.BOOTStr; } MVM_repr_push_o(tc, arr, filename_boxed); rename_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, events == UV_RENAME ? 1 : 0); MVM_repr_push_o(tc, arr, rename_boxed); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets the signal handler up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { WatchInfo *wi = (WatchInfo *)data; int r; /* Add task to active list. */ wi->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); wi->tc = tc; wi->handle.data = wi; MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Start watching. */ uv_fs_event_init(loop, &wi->handle); if ((r = uv_fs_event_start(&wi->handle, on_changed, wi->path, 0)) != 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } } /* Frees data associated with a file watcher task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for a file watcher task. */ static const MVMAsyncTaskOps op_table = { setup, NULL, NULL, gc_free }; MVMObject * MVM_io_file_watch(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *path, MVMObject *async_type) { MVMAsyncTask *task; WatchInfo *watch_info; /* Encode path. */ char *c_path = MVM_string_utf8_c8_encode_C_string(tc, path); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "file watch target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "file watch result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; watch_info = MVM_malloc(sizeof(WatchInfo)); watch_info->path = c_path; task->body.data = watch_info; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)task; } MoarVM-2015.11/src/io/filewatchers.h0000644000175000017500000000021112456307241016075 0ustar jnthnjnthnMVMObject * MVM_io_file_watch(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *path, MVMObject *async_type); MoarVM-2015.11/src/io/io.c0000644000175000017500000003755612623370227014045 0ustar jnthnjnthn#include "moar.h" /* Delegatory functions that assert we have a capable handle, then delegate * through the IO table to the correct operation. */ static MVMOSHandle * verify_is_handle(MVMThreadContext *tc, MVMObject *oshandle, const char *op) { if (REPR(oshandle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle", op); return (MVMOSHandle *)oshandle; } static uv_mutex_t * acquire_mutex(MVMThreadContext *tc, MVMOSHandle *handle) { uv_mutex_t *mutex = handle->body.mutex; uv_mutex_lock(mutex); MVM_tc_set_ex_release_mutex(tc, mutex); return mutex; } static void release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex) { uv_mutex_unlock(mutex); MVM_tc_clear_ex_release_mutex(tc); } MVMint64 MVM_io_close(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "close"); if (handle->body.ops->closable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 ret = handle->body.ops->closable->close(tc, handle); release_mutex(tc, mutex); return ret; } else MVM_exception_throw_adhoc(tc, "Cannot close this kind of handle"); } MVMint64 MVM_io_is_tty(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "istty"); if (handle->body.ops->possibly_tty) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 ret = handle->body.ops->possibly_tty->is_tty(tc, handle); release_mutex(tc, mutex); return ret; } else { return 0; } } void MVM_io_set_encoding(MVMThreadContext *tc, MVMObject *oshandle, MVMString *encoding_name) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "set encoding"); MVMROOT(tc, handle, { const MVMuint8 encoding_flag = MVM_string_find_encoding(tc, encoding_name); if (handle->body.ops->encodable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->encodable->set_encoding(tc, handle, encoding_flag); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot set encoding on this kind of handle"); }); } void MVM_io_seek(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset, MVMint64 flag) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "seek"); if (handle->body.ops->seekable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->seekable->seek(tc, handle, offset, flag); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot seek this kind of handle"); } MVMint64 MVM_io_tell(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "tell"); if (handle->body.ops->seekable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 result = handle->body.ops->seekable->tell(tc, handle); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot tell this kind of handle"); } void MVM_io_set_separator(MVMThreadContext *tc, MVMObject *oshandle, MVMString *sep) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "set separator"); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_readable->set_separator(tc, handle, &sep, 1); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot set a separator on this kind of handle"); } void MVM_io_set_separators(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *seps) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "set separators"); if (handle->body.ops->sync_readable) { MVMint32 is_str_array = REPR(seps)->pos_funcs.get_elem_storage_spec(tc, STABLE(seps)).boxed_primitive == MVM_STORAGE_SPEC_BP_STR; if (is_str_array) { uv_mutex_t *mutex; MVMString **c_seps; MVMuint64 i; MVMuint64 num_seps = MVM_repr_elems(tc, seps); if (num_seps > 0xFFFFFF) MVM_exception_throw_adhoc(tc, "Too many line separators"); c_seps = MVM_malloc((num_seps ? num_seps : 1) * sizeof(MVMString *)); for (i = 0; i < num_seps; i++) c_seps[i] = MVM_repr_at_pos_s(tc, seps, i); mutex = acquire_mutex(tc, handle); handle->body.ops->sync_readable->set_separator(tc, handle, c_seps, (MVMint32)num_seps); release_mutex(tc, mutex); MVM_free(c_seps); } else { MVM_exception_throw_adhoc(tc, "Set separators requires a native string array"); } } else { MVM_exception_throw_adhoc(tc, "Cannot set separators on this kind of handle"); } } MVMString * MVM_io_readline(MVMThreadContext *tc, MVMObject *oshandle, MVMint32 chomp) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "readline"); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMString *result = handle->body.ops->sync_readable->read_line(tc, handle, chomp); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot read lines from this kind of handle"); } MVMString * MVM_io_read_string(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 chars) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read string"); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMString *result = handle->body.ops->sync_readable->read_chars(tc, handle, chars); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot read characters from this kind of handle"); } void MVM_io_read_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *result, MVMint64 length) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read bytes"); MVMint64 bytes_read; char *buf; /* Ensure the target is in the correct form. */ if (!IS_CONCRETE(result) || REPR(result)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "read_fhb requires a native array to write to"); if (((MVMArrayREPRData *)STABLE(result)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(result)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "read_fhb requires a native array of uint8 or int8"); if (length < 1 || length > 99999999) MVM_exception_throw_adhoc(tc, "Out of range: attempted to read %"PRId64" bytes from filehandle", length); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); bytes_read = handle->body.ops->sync_readable->read_bytes(tc, handle, &buf, length); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot read characters from this kind of handle"); /* Stash the data in the VMArray. */ ((MVMArray *)result)->body.slots.i8 = (MVMint8 *)buf; ((MVMArray *)result)->body.start = 0; ((MVMArray *)result)->body.ssize = bytes_read; ((MVMArray *)result)->body.elems = bytes_read; } MVMString * MVM_io_slurp(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "slurp"); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMString *result = handle->body.ops->sync_readable->slurp(tc, handle); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot slurp this kind of handle"); } MVMint64 MVM_io_write_string(MVMThreadContext *tc, MVMObject *oshandle, MVMString *str, MVMint8 addnl) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write string"); if (str == NULL) MVM_exception_throw_adhoc(tc, "Failed to write to filehandle: NULL string given"); if (handle->body.ops->sync_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 result = handle->body.ops->sync_writable->write_str(tc, handle, str, addnl); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot write a string to this kind of handle"); } void MVM_io_write_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *buffer) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write bytes"); char *output; MVMint64 output_size; /* Ensure the target is in the correct form. */ if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "write_fhb requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "write_fhb requires a native array of uint8 or int8"); output = (char *)(((MVMArray *)buffer)->body.slots.i8 + ((MVMArray *)buffer)->body.start); output_size = ((MVMArray *)buffer)->body.elems; if (handle->body.ops->sync_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->write_bytes(tc, handle, output, output_size); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot write bytes to this kind of handle"); } MVMObject * MVM_io_read_chars_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read chars asynchronously"); if (handle->body.ops->async_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMObject *result = (MVMObject *)handle->body.ops->async_readable->read_chars(tc, handle, queue, schedulee, async_type); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot read chars asynchronously from this kind of handle"); } MVMObject * MVM_io_read_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read bytes asynchronously"); if (handle->body.ops->async_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMObject *result = (MVMObject *)handle->body.ops->async_readable->read_bytes(tc, handle, queue, schedulee, buf_type, async_type); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot read bytes asynchronously from this kind of handle"); } MVMObject * MVM_io_write_string_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMString *str, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write string asynchronously"); if (str == NULL) MVM_exception_throw_adhoc(tc, "Failed to write to filehandle: NULL string given"); if (handle->body.ops->async_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMObject *result = (MVMObject *)handle->body.ops->async_writable->write_str(tc, handle, queue, schedulee, str, async_type); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot write a string asynchronously to this kind of handle"); } MVMObject * MVM_io_write_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write buffer asynchronously"); if (buffer == NULL) MVM_exception_throw_adhoc(tc, "Failed to write to filehandle: NULL buffer given"); if (handle->body.ops->async_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMObject *result = (MVMObject *)handle->body.ops->async_writable->write_bytes(tc, handle, queue, schedulee, buffer, async_type); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot write bytes asynchronously to this kind of handle"); } MVMint64 MVM_io_eof(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "eof"); if (handle->body.ops->sync_readable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 result = handle->body.ops->sync_readable->eof(tc, handle); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot eof this kind of handle"); } MVMint64 MVM_io_lock(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 flag) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "lock"); if (handle->body.ops->lockable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMint64 result = handle->body.ops->lockable->lock(tc, handle, flag); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot lock this kind of handle"); } void MVM_io_unlock(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "unlock"); if (handle->body.ops->lockable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->lockable->unlock(tc, handle); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot unlock this kind of handle"); } void MVM_io_flush(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "flush"); if (handle->body.ops->sync_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->flush(tc, handle); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot flush this kind of handle"); } void MVM_io_truncate(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "truncate"); if (handle->body.ops->sync_writable) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->truncate(tc, handle, offset); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot truncate this kind of handle"); } void MVM_io_connect(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "connect"); if (handle->body.ops->sockety) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sockety->connect(tc, handle, host, port); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot connect this kind of handle"); } void MVM_io_bind(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "bind"); if (handle->body.ops->sockety) { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sockety->bind(tc, handle, host, port); release_mutex(tc, mutex); } else MVM_exception_throw_adhoc(tc, "Cannot bind this kind of handle"); } MVMObject * MVM_io_accept(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "accept"); if (handle->body.ops->sockety) { uv_mutex_t *mutex = acquire_mutex(tc, handle); MVMObject *result = handle->body.ops->sockety->accept(tc, handle); release_mutex(tc, mutex); return result; } else MVM_exception_throw_adhoc(tc, "Cannot accept this kind of handle"); } MoarVM-2015.11/src/io/io.h0000644000175000017500000001472312623370227014041 0ustar jnthnjnthn/* Operation table for I/O. A given handle type may implement any number of * these sections. */ struct MVMIOOps { /* The various sections that may be implemented. */ const MVMIOClosable *closable; const MVMIOEncodable *encodable; const MVMIOSyncReadable *sync_readable; const MVMIOSyncWritable *sync_writable; const MVMIOAsyncReadable *async_readable; const MVMIOAsyncWritable *async_writable; const MVMIOSeekable *seekable; const MVMIOSockety *sockety; const MVMIOPipeable *pipeable; const MVMIOLockable *lockable; const MVMIOPossiblyTTY *possibly_tty; /* How to mark the handle's data, if needed. */ void (*gc_mark) (MVMThreadContext *tc, void *data, MVMGCWorklist *worklist); /* How to free the handle's data. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *h, void *data); }; /* I/O operations on handles that can be closed. */ struct MVMIOClosable { MVMint64 (*close) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can do encoding to/from MVMString. */ struct MVMIOEncodable { void (*set_encoding) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding); }; /* I/O operations on handles that can do synchronous reading. */ struct MVMIOSyncReadable { void (*set_separator) (MVMThreadContext *tc, MVMOSHandle *h, MVMString **seps, MVMint32 num_seps); MVMString * (*read_line) (MVMThreadContext *tc, MVMOSHandle *h, MVMint32 chomp); MVMString * (*slurp) (MVMThreadContext *tc, MVMOSHandle *h); MVMString * (*read_chars) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 chars); MVMint64 (*read_bytes) (MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes); MVMint64 (*eof) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can do synchronous writing. */ struct MVMIOSyncWritable { MVMint64 (*write_str) (MVMThreadContext *tc, MVMOSHandle *h, MVMString *s, MVMint64 newline); MVMint64 (*write_bytes) (MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes); void (*flush) (MVMThreadContext *tc, MVMOSHandle *h); void (*truncate) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes); }; /* I/O operations on handles that can do asynchronous reading. */ struct MVMIOAsyncReadable { MVMAsyncTask * (*read_chars) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *async_type); MVMAsyncTask * (*read_bytes) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type); }; /* I/O operations on handles that can do asynchronous writing. */ struct MVMIOAsyncWritable { MVMAsyncTask * (*write_str) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMString *s, MVMObject *async_type); MVMAsyncTask * (*write_bytes) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type); }; /* I/O operations on handles that can seek/tell. */ struct MVMIOSeekable { void (*seek) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence); MVMint64 (*tell) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that do socket-y things (connect, bind, accept). */ struct MVMIOSockety { void (*connect) (MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port); void (*bind) (MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port); MVMObject * (*accept) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can lock/unlock. */ struct MVMIOLockable { MVMint64 (*lock) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 flag); void (*unlock) (MVMThreadContext *tc, MVMOSHandle *h); }; /* Checking if a handle is a tty, when it's NULL we assume a handle is not a tty. */ struct MVMIOPossiblyTTY { MVMint64 (*is_tty) (MVMThreadContext *tc, MVMOSHandle *h); }; /* Operations aiding process spawning and I/O handling. */ struct MVMIOPipeable { void (*bind_stdio_handle) (MVMThreadContext *tc, MVMOSHandle *h, uv_stdio_container_t *stdio, uv_process_t *process); }; MVMint64 MVM_io_close(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_is_tty(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_set_encoding(MVMThreadContext *tc, MVMObject *oshandle, MVMString *encoding_name); void MVM_io_seek(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset, MVMint64 flag); MVMint64 MVM_io_tell(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_set_separator(MVMThreadContext *tc, MVMObject *oshandle, MVMString *sep); void MVM_io_set_separators(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *seps); MVMString * MVM_io_readline(MVMThreadContext *tc, MVMObject *oshandle, MVMint32 chomp); MVMString * MVM_io_read_string(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 length); void MVM_io_read_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *result, MVMint64 length); MVMString * MVM_io_slurp(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_write_string(MVMThreadContext *tc, MVMObject *oshandle, MVMString *str, MVMint8 addnl); void MVM_io_write_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *buffer); MVMObject * MVM_io_read_chars_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *async_type); MVMObject * MVM_io_read_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type); MVMObject * MVM_io_write_string_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMString *s, MVMObject *async_type); MVMObject * MVM_io_write_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type); MVMint64 MVM_io_eof(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_lock(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 flag); void MVM_io_unlock(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_flush(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_truncate(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset); void MVM_io_connect(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port); void MVM_io_bind(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port); MVMObject * MVM_io_accept(MVMThreadContext *tc, MVMObject *oshandle); MoarVM-2015.11/src/io/procops.c0000644000175000017500000012717012623370227015113 0ustar jnthnjnthn#include "moar.h" #include "platform/time.h" #include "tinymt64.h" /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) /* MSVC compilers know about environ, * see http://msdn.microsoft.com/en-us//library/vstudio/stxk41x1.aspx */ #ifndef _WIN32 #include # ifdef __APPLE_CC__ # include # define environ (*_NSGetEnviron()) # else extern char **environ; # endif #else # include #endif #ifdef _WIN32 static wchar_t * ANSIToUnicode(MVMuint16 acp, const char *str) { const int len = MultiByteToWideChar(acp, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(acp, 0, str, -1, (LPWSTR)result, len); return result; } static char * UnicodeToUTF8(const wchar_t *str) { const int len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); char * const result = (char *)MVM_malloc(len * sizeof(char)); WideCharToMultiByte(CP_UTF8, 0, str, -1, result, len, NULL, NULL); return result; } static char * ANSIToUTF8(MVMuint16 acp, const char * str) { wchar_t * const wstr = ANSIToUnicode(acp, str); char * const result = UnicodeToUTF8(wstr); MVM_free(wstr); return result; } #endif MVMObject * MVM_proc_getenvhash(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; MVMObject * env_hash; #ifdef _WIN32 const MVMuint16 acp = GetACP(); /* We should get ACP at runtime. */ #endif MVMuint32 pos = 0; MVMString *needle = MVM_string_ascii_decode(tc, instance->VMString, STR_WITH_LEN("=")); char *env; MVM_gc_root_temp_push(tc, (MVMCollectable **)&needle); env_hash = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&env_hash); while ((env = environ[pos++]) != NULL) { #ifndef _WIN32 MVMString *str = MVM_string_utf8_c8_decode(tc, instance->VMString, env, strlen(env)); #else char * const _env = ANSIToUTF8(acp, env); MVMString *str = MVM_string_utf8_c8_decode(tc, instance->VMString, _env, strlen(_env)); #endif MVMuint32 index = MVM_string_index(tc, str, needle, 0); MVMString *key, *val; MVMObject *box; #ifdef _WIN32 MVM_free(_env); #endif MVM_gc_root_temp_push(tc, (MVMCollectable **)&str); key = MVM_string_substring(tc, str, 0, index); MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); val = MVM_string_substring(tc, str, index + 1, -1); box = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, val); MVM_repr_bind_key_o(tc, env_hash, key, box); MVM_gc_root_temp_pop_n(tc, 2); } MVM_gc_root_temp_pop_n(tc, 2); return env_hash; } #define INIT_ENV() do { \ MVMROOT(tc, iter, { \ MVMString * const equal = MVM_string_ascii_decode(tc, tc->instance->VMString, STR_WITH_LEN("=")); \ MVMROOT(tc, equal, { \ MVMString *env_str = NULL; \ MVMObject *iterval = NULL; \ i = 0; \ while(MVM_iter_istrue(tc, iter)) { \ MVM_repr_shift_o(tc, (MVMObject *)iter); \ env_str = MVM_string_concatenate(tc, MVM_iterkey_s(tc, iter), equal); \ iterval = MVM_iterval(tc, iter); \ env_str = MVM_string_concatenate(tc, env_str, MVM_repr_get_str(tc, iterval)); \ _env[i++] = MVM_string_utf8_c8_encode_C_string(tc, env_str); \ } \ _env[size] = NULL; \ }); \ }); \ } while (0) #define FREE_ENV() do { \ i = 0; \ while(_env[i]) \ MVM_free(_env[i++]); \ MVM_free(_env); \ } while (0) static void spawn_on_exit(uv_process_t *req, MVMint64 exit_status, int term_signal) { if (req->data) *(MVMint64 *)req->data = (exit_status << 8) | term_signal; uv_unref((uv_handle_t *)req); uv_close((uv_handle_t *)req, NULL); } static void setup_process_stdio(MVMThreadContext *tc, MVMObject *handle, uv_process_t *process, uv_stdio_container_t *stdio, int fd, MVMint64 flags, const char *op) { if (flags & MVM_PIPE_CAPTURE) { MVMIOSyncPipeData *pipedata; if (REPR(handle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle", op); pipedata = (MVMIOSyncPipeData *)((MVMOSHandle *)handle)->body.data; pipedata->process = process; stdio->flags = UV_CREATE_PIPE | (fd == 0 ? UV_READABLE_PIPE : UV_WRITABLE_PIPE); stdio->data.stream = pipedata->ss.handle; } else if (flags & MVM_PIPE_INHERIT) { if (handle == tc->instance->VMNull) { stdio->flags = UV_INHERIT_FD; stdio->data.fd = fd; } else { MVMOSHandleBody body = ((MVMOSHandle *)handle)->body; if (REPR(handle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle", op); body.ops->pipeable->bind_stdio_handle(tc, ((MVMOSHandle *)handle), stdio, process); } } else stdio->flags = UV_IGNORE; } MVMint64 MVM_proc_shell(MVMThreadContext *tc, MVMString *cmd, MVMString *cwd, MVMObject *env, MVMObject *in, MVMObject *out, MVMObject *err, MVMint64 flags) { MVMint64 result = 0, spawn_result; uv_process_t *process = MVM_calloc(1, sizeof(uv_process_t)); uv_process_options_t process_options = {0}; uv_stdio_container_t process_stdio[3]; int i; char * const cmdin = MVM_string_utf8_c8_encode_C_string(tc, cmd); char * const _cwd = MVM_string_utf8_c8_encode_C_string(tc, cwd); const MVMuint64 size = MVM_repr_elems(tc, env); MVMIter * const iter = (MVMIter *)MVM_iter(tc, env); char **_env = MVM_malloc((size + 1) * sizeof(char *)); #ifdef _WIN32 const MVMuint16 acp = GetACP(); /* We should get ACP at runtime. */ char * const _cmd = ANSIToUTF8(acp, getenv("ComSpec")); char *args[3]; args[0] = "/c"; args[1] = cmdin; args[2] = NULL; #else char * const _cmd = "/bin/sh"; char *args[4]; args[0] = "/bin/sh"; args[1] = "-c"; args[2] = cmdin; args[3] = NULL; #endif INIT_ENV(); setup_process_stdio(tc, in, process, &process_stdio[0], 0, flags, "shell"); setup_process_stdio(tc, out, process, &process_stdio[1], 1, flags >> 3, "shell"); setup_process_stdio(tc, err, process, &process_stdio[2], 2, flags >> 6, "shell"); process_options.stdio = process_stdio; process_options.file = _cmd; process_options.args = args; process_options.cwd = _cwd; process_options.flags = UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | UV_PROCESS_WINDOWS_HIDE; process_options.env = _env; process_options.stdio_count = 3; process_options.exit_cb = spawn_on_exit; if (flags & (MVM_PIPE_CAPTURE_IN | MVM_PIPE_CAPTURE_OUT | MVM_PIPE_CAPTURE_ERR)) { process->data = MVM_calloc(1, sizeof(MVMint64)); uv_ref((uv_handle_t *)process); spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) result = spawn_result; } else { process->data = &result; uv_ref((uv_handle_t *)process); spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) result = spawn_result; else uv_run(tc->loop, UV_RUN_DEFAULT); } FREE_ENV(); MVM_free(_cwd); #ifdef _WIN32 MVM_free(_cmd); #endif MVM_free(cmdin); uv_unref((uv_handle_t *)process); return result; } MVMint64 MVM_proc_spawn(MVMThreadContext *tc, MVMObject *argv, MVMString *cwd, MVMObject *env, MVMObject *in, MVMObject *out, MVMObject *err, MVMint64 flags) { MVMint64 result = 0, spawn_result; uv_process_t *process = MVM_calloc(1, sizeof(uv_process_t)); uv_process_options_t process_options = {0}; uv_stdio_container_t process_stdio[3]; int i; char * const _cwd = MVM_string_utf8_c8_encode_C_string(tc, cwd); const MVMuint64 size = MVM_repr_elems(tc, env); MVMIter * const iter = (MVMIter *)MVM_iter(tc, env); char **_env = MVM_malloc((size + 1) * sizeof(char *)); const MVMuint64 arg_size = MVM_repr_elems(tc, argv); char **args = MVM_malloc((arg_size + 1) * sizeof(char *)); MVMRegister reg; i = 0; while(i < arg_size) { REPR(argv)->pos_funcs.at_pos(tc, STABLE(argv), argv, OBJECT_BODY(argv), i, ®, MVM_reg_obj); args[i++] = MVM_string_utf8_c8_encode_C_string(tc, MVM_repr_get_str(tc, reg.o)); } args[arg_size] = NULL; INIT_ENV(); setup_process_stdio(tc, in, process, &process_stdio[0], 0, flags, "spawn"); setup_process_stdio(tc, out, process, &process_stdio[1], 1, flags >> 3, "spawn"); setup_process_stdio(tc, err, process, &process_stdio[2], 2, flags >> 6, "spawn"); process_options.stdio = process_stdio; process_options.file = arg_size ? args[0] : NULL; process_options.args = args; process_options.cwd = _cwd; process_options.flags = UV_PROCESS_WINDOWS_HIDE; process_options.env = _env; process_options.stdio_count = 3; process_options.exit_cb = spawn_on_exit; if (flags & (MVM_PIPE_CAPTURE_IN | MVM_PIPE_CAPTURE_OUT | MVM_PIPE_CAPTURE_ERR)) { process->data = MVM_calloc(1, sizeof(MVMint64)); uv_ref((uv_handle_t *)process); spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) result = spawn_result; } else { process->data = &result; uv_ref((uv_handle_t *)process); spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) result = spawn_result; else uv_run(tc->loop, UV_RUN_DEFAULT); } FREE_ENV(); MVM_free(_cwd); uv_unref((uv_handle_t *)process); i = 0; while(args[i]) MVM_free(args[i++]); MVM_free(args); return result; } /* Data that we keep for an asynchronous process handle. */ typedef struct { /* The libuv handle to the process. */ uv_process_t *handle; /* The async task handle, provided we're running. */ MVMObject *async_task; /* The exit signal to send, if any. */ MVMint64 signal; } MVMIOAsyncProcessData; typedef enum { STATE_UNSTARTED, STATE_STARTED, STATE_DONE } ProcessState; /* Info we convey about an async spawn task. */ typedef struct { MVMThreadContext *tc; int work_idx; MVMObject *handle; MVMObject *callbacks; char *prog; char *cwd; char **env; char **args; MVMDecodeStream *ds_stdout; MVMDecodeStream *ds_stderr; MVMuint32 seq_stdout; MVMuint32 seq_stderr; uv_stream_t *stdin_handle; ProcessState state; } SpawnInfo; /* Info we convey about a write task. */ typedef struct { MVMOSHandle *handle; MVMString *str_data; MVMObject *buf_data; uv_write_t *req; uv_buf_t buf; MVMThreadContext *tc; int work_idx; } SpawnWriteInfo; /* Completion handler for an asynchronous write. */ static void on_write(uv_write_t *req, int status) { SpawnWriteInfo *wi = (SpawnWriteInfo *)req->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMObject *bytes_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, wi->buf.len); MVM_repr_push_o(tc, arr, bytes_box); }); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); } MVM_repr_push_o(tc, t->body.queue, arr); if (wi->str_data) MVM_free(wi->buf.base); MVM_free(wi->req); } /* Does setup work for an asynchronous write. */ static void write_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncProcessData *handle_data; MVMAsyncTask *spawn_task; SpawnInfo *si; char *output; int output_size, r; /* Add to work in progress. */ SpawnWriteInfo *wi = (SpawnWriteInfo *)data; wi->tc = tc; wi->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Encode the string, or extract buf data. */ if (wi->str_data) { MVMuint64 output_size_64; output = MVM_string_utf8_encode(tc, wi->str_data, &output_size_64); output_size = (int)output_size_64; } else { MVMArray *buffer = (MVMArray *)wi->buf_data; output = (char *)(buffer->body.slots.i8 + buffer->body.start); output_size = (int)buffer->body.elems; } /* Create and initialize write request. */ wi->req = MVM_malloc(sizeof(uv_write_t)); wi->buf = uv_buf_init(output, output_size); wi->req->data = data; handle_data = (MVMIOAsyncProcessData *)wi->handle->body.data; spawn_task = (MVMAsyncTask *)handle_data->async_task; si = spawn_task ? (SpawnInfo *)spawn_task->body.data : NULL; if (!si || !si->stdin_handle || (r = uv_write(wi->req, si->stdin_handle, &(wi->buf), 1, on_write)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (si && si->stdin_handle ? uv_strerror(r) : "This process is not opened for write")); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handle. */ MVM_free(wi->req); wi->req = NULL; } } /* Marks objects for a write task. */ static void write_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { SpawnWriteInfo *wi = (SpawnWriteInfo *)data; MVM_gc_worklist_add(tc, worklist, &wi->handle); MVM_gc_worklist_add(tc, worklist, &wi->str_data); MVM_gc_worklist_add(tc, worklist, &wi->buf_data); } /* Frees info for a write task. */ static void write_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async write task. */ static const MVMAsyncTaskOps write_op_table = { write_setup, NULL, write_gc_mark, write_gc_free }; static MVMAsyncTask * write_str(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMString *s, MVMObject *async_type) { MVMAsyncTask *task; SpawnWriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritestr target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritestr result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { MVMROOT(tc, s, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(SpawnWriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->str_data, s); task->body.data = wi; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } static MVMAsyncTask * write_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMAsyncTask *task; SpawnWriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritebytes target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritebytes result type must have REPR AsyncTask"); if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array of uint8 or int8"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { MVMROOT(tc, h, { MVMROOT(tc, buffer, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(SpawnWriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->buf_data, buffer); task->body.data = wi; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return task; } /* Marks an async handle. */ static void proc_async_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)data; if (data) MVM_gc_worklist_add(tc, worklist, &(apd->async_task)); } /* Does an asynchronous close (since it must run on the event loop). */ static void close_cb(uv_handle_t *handle) { MVM_free(handle); } static void close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { uv_close((uv_handle_t *)data, close_cb); } /* Operations table for async close task. */ static const MVMAsyncTaskOps close_op_table = { close_perform, NULL, NULL, NULL }; static void deferred_close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); static const MVMAsyncTaskOps deferred_close_op_table = { deferred_close_perform, NULL, NULL, NULL }; static MVMint64 close_stdin(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOAsyncProcessData *handle_data = (MVMIOAsyncProcessData *)h->body.data; MVMAsyncTask *spawn_task = (MVMAsyncTask *)handle_data->async_task; SpawnInfo *si = spawn_task ? (SpawnInfo *)spawn_task->body.data : NULL; if (si && si->state == STATE_UNSTARTED) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &deferred_close_op_table; task->body.data = si; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return 0; } if (si && si->stdin_handle) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &close_op_table; task->body.data = si->stdin_handle; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); si->stdin_handle = NULL; } return 0; } static void deferred_close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { SpawnInfo *si = (SpawnInfo *) data; MVMOSHandle *h = (MVMOSHandle *) si->handle; if (si->state == STATE_UNSTARTED) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &deferred_close_op_table; task->body.data = si; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return; } if (si->stdin_handle) { close_stdin(tc, h); } } /* IO ops table, for async process, populated with functions. */ static const MVMIOAsyncWritable proc_async_writable = { write_str, write_bytes }; static const MVMIOClosable closable = { close_stdin }; static const MVMIOOps proc_op_table = { &closable, NULL, NULL, NULL, NULL, &proc_async_writable, NULL, NULL, NULL, NULL, NULL, proc_async_gc_mark, NULL }; static void spawn_async_close(uv_handle_t *handle) { MVM_free(handle); } static void async_spawn_on_exit(uv_process_t *req, MVMint64 exit_status, int term_signal) { /* Check we've got a callback to fire. */ SpawnInfo *si = (SpawnInfo *)req->data; MVMThreadContext *tc = si->tc; MVMObject *done_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.done); MVMOSHandle *os_handle; if (!MVM_is_null(tc, done_cb)) { MVMROOT(tc, done_cb, { /* Get status. */ MVMint64 status = (exit_status << 8) | term_signal; /* Get what we'll need to build and convey the result. */ MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, si->work_idx); /* Box and send along status. */ MVM_repr_push_o(tc, arr, done_cb); MVMROOT(tc, arr, { MVMROOT(tc, t, { MVMObject *result_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, status); MVM_repr_push_o(tc, arr, result_box); }); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } /* when invoked via MVMIOOps, close_stdin is already wrapped in a mutex */ os_handle = (MVMOSHandle *) si->handle; uv_mutex_lock(os_handle->body.mutex); si->state = STATE_DONE; close_stdin(tc, os_handle); uv_mutex_unlock(os_handle->body.mutex); /* Close handle. */ uv_close((uv_handle_t *)req, spawn_async_close); ((MVMIOAsyncProcessData *)((MVMOSHandle *)si->handle)->body.data)->handle = NULL; } /* Allocates a buffer of the suggested size. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { size_t size = suggested_size > 0 ? suggested_size : 4; buf->base = MVM_malloc(size); buf->len = size; } /* Read functions for stdout/stderr. */ static void async_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf, SpawnInfo *si, MVMObject *callback, MVMDecodeStream *ds, MVMuint32 seq_number) { MVMThreadContext *tc = si->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, si->work_idx); MVM_repr_push_o(tc, arr, callback); if (nread > 0) { MVMROOT(tc, t, { MVMROOT(tc, arr, { /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, seq_number); MVM_repr_push_o(tc, arr, seq_boxed); /* Either need to produce a buffer or decode characters. */ if (ds) { MVMString *str; MVMObject *boxed_str; MVM_string_decodestream_add_bytes(tc, ds, buf->base, nread); str = MVM_string_decodestream_get_all(tc, ds); boxed_str = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, str); MVM_repr_push_o(tc, arr, boxed_str); } else { MVMObject *buf_type = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.buf_type); MVMArray *res_buf = (MVMArray *)MVM_repr_alloc_init(tc, buf_type); res_buf->body.slots.i8 = (MVMint8 *)buf->base; res_buf->body.start = 0; res_buf->body.ssize = nread; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); } /* Finally, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); } else if (nread == UV_EOF) { MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMObject *minus_one = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, -1); MVM_repr_push_o(tc, arr, minus_one); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); }); if (buf->base) MVM_free(buf->base); uv_close((uv_handle_t *) handle, NULL); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(nread)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); }); if (buf->base) MVM_free(buf->base); uv_close((uv_handle_t *) handle, NULL); } MVM_repr_push_o(tc, t->body.queue, arr); } static void async_spawn_stdout_chars_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stdout_chars); async_read(handle, nread, buf, si, cb, si->ds_stdout, si->seq_stdout++); } static void async_spawn_stdout_bytes_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stdout_bytes); async_read(handle, nread, buf, si, cb, NULL, si->seq_stdout++); } static void async_spawn_stderr_chars_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stderr_chars); async_read(handle, nread, buf, si, cb, si->ds_stderr, si->seq_stderr++); } static void async_spawn_stderr_bytes_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stderr_bytes); async_read(handle, nread, buf, si, cb, NULL, si->seq_stderr++); } /* Actually spawns an async task. This runs in the event loop thread. */ static void spawn_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMint64 spawn_result; /* Process info setup. */ uv_process_t *process = MVM_calloc(1, sizeof(uv_process_t)); uv_process_options_t process_options = {0}; uv_stdio_container_t process_stdio[3]; uv_pipe_t *stdout_pipe = NULL; uv_pipe_t *stderr_pipe = NULL; uv_read_cb stdout_cb, stderr_cb; /* Add to work in progress. */ SpawnInfo *si = (SpawnInfo *)data; si->tc = tc; si->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); /* Create input/output handles as needed. */ if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.write)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; process_stdio[0].data.stream = (uv_stream_t *)pipe; si->stdin_handle = (uv_stream_t *)pipe; } else { process_stdio[0].flags = UV_INHERIT_FD; process_stdio[0].data.fd = 0; } if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stdout_chars)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[1].data.stream = (uv_stream_t *)pipe; si->ds_stdout = MVM_string_decodestream_create(tc, MVM_encoding_type_utf8, 0); stdout_pipe = pipe; stdout_cb = async_spawn_stdout_chars_read; } else if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stdout_bytes)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[1].data.stream = (uv_stream_t *)pipe; stdout_pipe = pipe; stdout_cb = async_spawn_stdout_bytes_read; } else { process_stdio[1].flags = UV_INHERIT_FD; process_stdio[1].data.fd = 1; } if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stderr_chars)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[2].data.stream = (uv_stream_t *)pipe; si->ds_stderr = MVM_string_decodestream_create(tc, MVM_encoding_type_utf8, 0); stderr_pipe = pipe; stderr_cb = async_spawn_stderr_chars_read; } else if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stderr_bytes)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[2].data.stream = (uv_stream_t *)pipe; stderr_pipe = pipe; stderr_cb = async_spawn_stderr_bytes_read; } else { process_stdio[2].flags = UV_INHERIT_FD; process_stdio[2].data.fd = 2; } /* Set up process start info. */ process_options.stdio = process_stdio; process_options.file = si->prog; process_options.args = si->args; process_options.cwd = si->cwd; process_options.flags = UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | UV_PROCESS_WINDOWS_HIDE; process_options.env = si->env; process_options.stdio_count = 3; process_options.exit_cb = async_spawn_on_exit; /* Attach data, spawn, report any error. */ process->data = si; spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) { MVMObject *error_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.error); si->state = STATE_DONE; if (!MVM_is_null(tc, error_cb)) { MVMROOT(tc, error_cb, { MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_repr_push_o(tc, arr, error_cb); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(spawn_result)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); }); }); } } else { MVMOSHandle *handle = (MVMOSHandle *)si->handle; MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)handle->body.data; MVMObject *ready_cb; apd->handle = process; ready_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.ready); si->state = STATE_STARTED; if (!MVM_is_null(tc, ready_cb)) { MVMROOT(tc, ready_cb, { MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_repr_push_o(tc, arr, ready_cb); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); }); }); } } /* Start any output readers. */ if (stdout_pipe) uv_read_start((uv_stream_t *)stdout_pipe, on_alloc, stdout_cb); if (stderr_pipe) uv_read_start((uv_stream_t *)stderr_pipe, on_alloc, stderr_cb); } /* On cancel, kill the process. */ static void spawn_cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { /* Locate handle. */ SpawnInfo *si = (SpawnInfo *)data; MVMOSHandle *handle = (MVMOSHandle *)si->handle; MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)handle->body.data; uv_process_t *phandle = apd->handle; /* If it didn't already end, try to kill it. exit_cb will clean up phandle * should the signal lead to process exit. */ if (phandle) { #ifdef _WIN32 /* On Windows, make sure we use a signal that will actually work. */ if (apd->signal != SIGTERM && apd->signal != SIGKILL && apd->signal != SIGINT) apd->signal = SIGKILL; #endif uv_process_kill(phandle, (int)apd->signal); } } /* Marks objects for a spawn task. */ static void spawn_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { SpawnInfo *si = (SpawnInfo *)data; MVM_gc_worklist_add(tc, worklist, &si->handle); MVM_gc_worklist_add(tc, worklist, &si->callbacks); } /* Frees info for a spawn task. */ static void spawn_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { SpawnInfo *si = (SpawnInfo *)data; if (si->cwd) { MVM_free(si->cwd); si->cwd = NULL; } if (si->env) { MVMuint32 i; char **_env = si->env; FREE_ENV(); si->env = NULL; } if (si->args) { MVMuint32 i = 0; while (si->args[i]) MVM_free(si->args[i++]); MVM_free(si->args); si->args = NULL; } if (si->ds_stdout) { MVM_string_decodestream_destory(tc, si->ds_stdout); si->ds_stdout = NULL; } if (si->ds_stderr) { MVM_string_decodestream_destory(tc, si->ds_stderr); si->ds_stderr = NULL; } MVM_free(si); } } /* Operations table for async connect task. */ static const MVMAsyncTaskOps spawn_op_table = { spawn_setup, spawn_cancel, spawn_gc_mark, spawn_gc_free }; /* Spawn a process asynchronously. */ MVMObject * MVM_proc_spawn_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *argv, MVMString *cwd, MVMObject *env, MVMObject *callbacks) { MVMAsyncTask *task; MVMOSHandle *handle; SpawnInfo *si; char *prog, *_cwd, **_env, **args; MVMuint64 size, arg_size, i; MVMIter *iter; MVMRegister reg; /* Validate queue REPR. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "spawnprocasync target queue must have ConcBlockingQueue REPR"); /* Encode arguments, taking first as program name. */ arg_size = MVM_repr_elems(tc, argv); if (arg_size < 1) MVM_exception_throw_adhoc(tc, "spawnprocasync must have first arg for program"); args = MVM_malloc((arg_size + 1) * sizeof(char *)); for (i = 0; i < arg_size; i++) { REPR(argv)->pos_funcs.at_pos(tc, STABLE(argv), argv, OBJECT_BODY(argv), i, ®, MVM_reg_obj); args[i] = MVM_string_utf8_c8_encode_C_string(tc, MVM_repr_get_str(tc, reg.o)); } args[arg_size] = NULL; prog = args[0]; /* Encode CWD. */ _cwd = MVM_string_utf8_c8_encode_C_string(tc, cwd); MVMROOT(tc, queue, { MVMROOT(tc, env, { MVMROOT(tc, callbacks, { MVMIOAsyncProcessData *data; /* Encode environment. */ size = MVM_repr_elems(tc, env); iter = (MVMIter *)MVM_iter(tc, env); _env = MVM_malloc((size + 1) * sizeof(char *)); INIT_ENV(); /* Create handle. */ data = MVM_calloc(1, sizeof(MVMIOAsyncProcessData)); handle = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); handle->body.ops = &proc_op_table; handle->body.data = data; /* Create async task handle. */ MVMROOT(tc, handle, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); task->body.ops = &spawn_op_table; si = MVM_calloc(1, sizeof(SpawnInfo)); si->prog = prog; si->cwd = _cwd; si->env = _env; si->args = args; si->state = STATE_UNSTARTED; MVM_ASSIGN_REF(tc, &(task->common.header), si->handle, handle); MVM_ASSIGN_REF(tc, &(task->common.header), si->callbacks, callbacks); task->body.data = si; MVM_ASSIGN_REF(tc, &(handle->common.header), data->async_task, task); }); }); }); /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)handle; } /* Kills an asynchronously spawned process. */ void MVM_proc_kill_async(MVMThreadContext *tc, MVMObject *handle_obj, MVMint64 signal) { /* Ensure it's a handle for a process. */ if (REPR(handle_obj)->ID == MVM_REPR_ID_MVMOSHandle) { MVMOSHandle *handle = (MVMOSHandle *)handle_obj; if (handle->body.ops == &proc_op_table) { /* It's fine; send the kill by cancelling the task. */ MVMIOAsyncProcessData *data = (MVMIOAsyncProcessData *)handle->body.data; data->signal = signal; MVM_io_eventloop_cancel_work(tc, data->async_task); return; } } MVM_exception_throw_adhoc(tc, "killprocasync requires a process handle"); } /* Get the current process ID. */ MVMint64 MVM_proc_getpid(MVMThreadContext *tc) { #ifdef _WIN32 return _getpid(); #else return getpid(); #endif } /* generates a random int64 */ MVMint64 MVM_proc_rand_i(MVMThreadContext *tc) { MVMuint64 result = tinymt64_generate_uint64(tc->rand_state); return *(MVMint64 *)&result; } /* generates a number between 0 and 1 */ MVMnum64 MVM_proc_rand_n(MVMThreadContext *tc) { return tinymt64_generate_double(tc->rand_state); } MVMnum64 MVM_proc_randscale_n(MVMThreadContext *tc, MVMnum64 scale) { return tinymt64_generate_double(tc->rand_state) * scale; } /* seed random number generator */ void MVM_proc_seed(MVMThreadContext *tc, MVMint64 seed) { /* Seed our one, plus the normal C srand for libtommath. */ tinymt64_init(tc->rand_state, (MVMuint64)seed); /* do not call srand if we are not using rand */ #ifndef MP_USE_ALT_RAND srand((MVMuint32)seed); #endif } /* gets the system time since the epoch truncated to integral seconds */ MVMint64 MVM_proc_time_i(MVMThreadContext *tc) { return (MVMint64)(MVM_platform_now() / 1000000000); } /* gets the system time since the epoch as floating point seconds */ MVMnum64 MVM_proc_time_n(MVMThreadContext *tc) { return (MVMnum64)MVM_platform_now() / 1000000000.0; } MVMString * MVM_executable_name(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; if (instance->exec_name) return MVM_string_utf8_c8_decode(tc, instance->VMString, instance->exec_name, strlen(instance->exec_name)); else return tc->instance->str_consts.empty; } MVMObject * MVM_proc_clargs(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; MVMObject *clargs = instance->clargs; if (!clargs) { clargs = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); #ifndef _WIN32 MVMROOT(tc, clargs, { const MVMint64 num_clargs = instance->num_clargs; MVMint64 count; MVMString *prog_string = MVM_string_utf8_c8_decode(tc, instance->VMString, instance->prog_name, strlen(instance->prog_name)); MVMObject *boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, prog_string); MVM_repr_push_o(tc, clargs, boxed_str); for (count = 0; count < num_clargs; count++) { char *raw_clarg = instance->raw_clargs[count]; MVMString *string = MVM_string_utf8_c8_decode(tc, instance->VMString, raw_clarg, strlen(raw_clarg)); boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, string); MVM_repr_push_o(tc, clargs, boxed_str); } }); #else MVMROOT(tc, clargs, { const MVMuint16 acp = GetACP(); const MVMint64 num_clargs = instance->num_clargs; MVMint64 count; MVMString *prog_string = MVM_string_utf8_c8_decode(tc, instance->VMString, instance->prog_name, strlen(instance->prog_name)); MVMObject *boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, prog_string); MVM_repr_push_o(tc, clargs, boxed_str); for (count = 0; count < num_clargs; count++) { char *raw_clarg = instance->raw_clargs[count]; char * const _tmp = ANSIToUTF8(acp, raw_clarg); MVMString *string = MVM_string_utf8_c8_decode(tc, instance->VMString, _tmp, strlen(_tmp)); MVM_free(_tmp); boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, string); MVM_repr_push_o(tc, clargs, boxed_str); } }); #endif instance->clargs = clargs; } return clargs; } MoarVM-2015.11/src/io/procops.h0000644000175000017500000000274312554473060015120 0ustar jnthnjnthn#define MVM_PIPE_INHERIT 1 #define MVM_PIPE_IGNORE 2 #define MVM_PIPE_CAPTURE 4 #define MVM_PIPE_INHERIT_IN 1 #define MVM_PIPE_IGNORE_IN 2 #define MVM_PIPE_CAPTURE_IN 4 #define MVM_PIPE_INHERIT_OUT 8 #define MVM_PIPE_IGNORE_OUT 16 #define MVM_PIPE_CAPTURE_OUT 32 #define MVM_PIPE_INHERIT_ERR 64 #define MVM_PIPE_IGNORE_ERR 128 #define MVM_PIPE_CAPTURE_ERR 256 MVMObject * MVM_proc_getenvhash(MVMThreadContext *tc); MVMint64 MVM_proc_shell(MVMThreadContext *tc, MVMString *cmd, MVMString *cwd, MVMObject *env, MVMObject *in, MVMObject *out, MVMObject *err, MVMint64 flags); MVMint64 MVM_proc_spawn(MVMThreadContext *tc, MVMObject *argv, MVMString *cwd, MVMObject *env, MVMObject *in, MVMObject *out, MVMObject *err, MVMint64 flags); MVMObject * MVM_proc_spawn_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *args, MVMString *cwd, MVMObject *env, MVMObject *callbacks); void MVM_proc_kill_async(MVMThreadContext *tc, MVMObject *handle, MVMint64 signal); MVMint64 MVM_proc_getpid(MVMThreadContext *tc); MVMint64 MVM_proc_rand_i(MVMThreadContext *tc); MVMnum64 MVM_proc_rand_n(MVMThreadContext *tc); MVMnum64 MVM_proc_randscale_n(MVMThreadContext *tc, MVMnum64 scale); void MVM_proc_seed(MVMThreadContext *tc, MVMint64 seed); MVMint64 MVM_proc_time_i(MVMThreadContext *tc); MVMObject * MVM_proc_clargs(MVMThreadContext *tc); MVMnum64 MVM_proc_time_n(MVMThreadContext *tc); MVMString * MVM_executable_name(MVMThreadContext *tc); MoarVM-2015.11/src/io/signals.c0000644000175000017500000001353112456307241015061 0ustar jnthnjnthn#include "moar.h" #include #ifdef _WIN32 #define SIGHUP 1 #define SIGKILL 9 #define SIGWINCH 28 #endif /* Info we convey about a signal handler. */ typedef struct { int signum; uv_signal_t handle; MVMThreadContext *tc; int work_idx; } SignalInfo; /* Signal callback; dispatches schedulee to the queue. */ static void signal_cb(uv_signal_t *handle, int sig_num) { SignalInfo *si = (SignalInfo *)handle->data; MVMThreadContext *tc = si->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, si->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT(tc, t, { MVMROOT(tc, arr, { MVMObject *sig_num_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, sig_num); MVM_repr_push_o(tc, arr, sig_num_boxed); }); }); MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets the signal handler up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { SignalInfo *si = (SignalInfo *)data; uv_signal_init(loop, &si->handle); si->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); si->tc = tc; si->handle.data = si; MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); uv_signal_start(&si->handle, signal_cb, si->signum); } /* Frees data associated with a timer async task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async timer task. */ static const MVMAsyncTaskOps op_table = { setup, NULL, NULL, gc_free }; /* Creates a new timer. */ MVMObject * MVM_io_signal_handle(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 signal, MVMObject *async_type) { MVMAsyncTask *task; SignalInfo *signal_info; int signum; /* Transform the signal number. */ switch (signal) { case MVM_SIG_HUP: signum = SIGHUP; break; case MVM_SIG_INT: signum = SIGINT; break; #ifdef SIGQUIT case MVM_SIG_QUIT: signum = SIGQUIT; break; #endif #ifdef SIGILL case MVM_SIG_ILL: signum = SIGILL; break; #endif #ifdef SIGTRAP case MVM_SIG_TRAP: signum = SIGTRAP; break; #endif #ifdef SIGABRT case MVM_SIG_ABRT: signum = SIGABRT; break; #endif #ifdef SIGEMT case MVM_SIG_EMT: signum = SIGEMT; break; #endif #ifdef SIGFPE case MVM_SIG_FPE: signum = SIGFPE; break; #endif #ifdef SIGKILL case MVM_SIG_KILL: signum = SIGKILL; break; #endif #ifdef SIGBUS case MVM_SIG_BUS: signum = SIGBUS; break; #endif #ifdef SIGSEGV case MVM_SIG_SEGV: signum = SIGSEGV; break; #endif #ifdef SIGSYS case MVM_SIG_SYS: signum = SIGSYS; break; #endif #ifdef SIGPIPE case MVM_SIG_PIPE: signum = SIGPIPE; break; #endif #ifdef SIGALRM case MVM_SIG_ALRM: signum = SIGALRM; break; #endif #ifdef SIGTERM case MVM_SIG_TERM: signum = SIGTERM; break; #endif #ifdef SIGURG case MVM_SIG_URG: signum = SIGURG; break; #endif #ifdef SIGSTOP case MVM_SIG_STOP: signum = SIGSTOP; break; /* hammer time */ #endif #ifdef SIGTSTP case MVM_SIG_TSTP: signum = SIGTSTP; break; #endif #ifdef SIGCONT case MVM_SIG_CONT: signum = SIGCONT; break; #endif #ifdef SIGCHLD case MVM_SIG_CHLD: signum = SIGCHLD; break; #endif #ifdef SIGTTIN case MVM_SIG_TTIN: signum = SIGTTIN; break; #endif #ifdef SIGTTOU case MVM_SIG_TTOU: signum = SIGTTOU; break; #endif #ifdef SIGIO case MVM_SIG_IO: signum = SIGIO; break; #endif #ifdef SIGXCPU case MVM_SIG_XCPU: signum = SIGXCPU; break; #endif #ifdef SIGXFSZ case MVM_SIG_XFSZ: signum = SIGXFSZ; break; #endif #ifdef SIGVTALRM case MVM_SIG_VTALRM: signum = SIGVTALRM; break; #endif #ifdef SIGPROF case MVM_SIG_PROF: signum = SIGPROF; break; #endif #ifdef SIGWINCH case MVM_SIG_WINCH: signum = SIGWINCH; break; #endif #ifdef SIGINFO case MVM_SIG_INFO: signum = SIGINFO; break; #endif #ifdef SIGUSR1 case MVM_SIG_USR1: signum = SIGUSR1; break; #endif #ifdef SIGUSR2 case MVM_SIG_USR2: signum = SIGUSR2; break; #endif #ifdef SIGTHR case MVM_SIG_THR: signum = SIGTHR; break; #endif #ifdef SIGSTKFLT case MVM_SIG_STKFLT: signum = SIGSTKFLT; break; #endif #ifdef SIGPWR case MVM_SIG_PWR: signum = SIGPWR; break; #endif #ifdef SIGBREAK case MVM_SIG_BREAK: signum = SIGBREAK; break; #endif default: MVM_exception_throw_adhoc(tc, "Unsupported signal handler %d", (int)signal); } /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "signal target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "signal result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; signal_info = MVM_malloc(sizeof(SignalInfo)); signal_info->signum = signum; task->body.data = signal_info; /* Hand the task off to the event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)task; } MoarVM-2015.11/src/io/signals.h0000644000175000017500000000232312456307241015063 0ustar jnthnjnthn/* MoarVM platform-independent signal values. */ /* these match the BSD/Darwin values */ #define MVM_SIG_HUP 1 #define MVM_SIG_INT 2 #define MVM_SIG_QUIT 3 #define MVM_SIG_ILL 4 #define MVM_SIG_TRAP 5 #define MVM_SIG_ABRT 6 #define MVM_SIG_EMT 7 #define MVM_SIG_FPE 8 #define MVM_SIG_KILL 9 #define MVM_SIG_BUS 10 #define MVM_SIG_SEGV 11 #define MVM_SIG_SYS 12 #define MVM_SIG_PIPE 13 #define MVM_SIG_ALRM 14 #define MVM_SIG_TERM 15 #define MVM_SIG_URG 16 #define MVM_SIG_STOP 17 /* hammer time */ #define MVM_SIG_TSTP 18 #define MVM_SIG_CONT 19 #define MVM_SIG_CHLD 20 #define MVM_SIG_TTIN 21 #define MVM_SIG_TTOU 22 #define MVM_SIG_IO 23 #define MVM_SIG_XCPU 24 #define MVM_SIG_XFSZ 25 #define MVM_SIG_VTALRM 26 #define MVM_SIG_PROF 27 #define MVM_SIG_WINCH 28 #define MVM_SIG_INFO 29 #define MVM_SIG_USR1 30 #define MVM_SIG_USR2 31 #define MVM_SIG_THR 32 /* linux overloads */ #define MVM_SIG_STKFLT 116 #define MVM_SIG_PWR 130 /* windows overloads */ #define MVM_SIG_BREAK 221 MVMObject * MVM_io_signal_handle(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 signal, MVMObject *async_type); MoarVM-2015.11/src/io/syncfile.c0000644000175000017500000004110712623370227015235 0ustar jnthnjnthn#include "moar.h" #include "platform/io.h" /* Here we implement synchronous file I/O. It's done using libuv's file I/O * functions, without specifying callbacks, thus easily giving synchronous * behavior. */ #ifndef _WIN32 #include #include #define DEFAULT_MODE 0x01B6 #else #include #define O_CREAT _O_CREAT #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_TRUNC _O_TRUNC #define O_EXCL _O_EXCL #define O_RDWR _O_RDWR #define DEFAULT_MODE _S_IWRITE /* work around sucky libuv defaults */ #endif /* Number of bytes we pull in at a time to the buffer. */ #define CHUNK_SIZE 32768 /* Data that we keep for a file-based handle. */ typedef struct { /* libuv file descriptor. */ uv_file fd; /* The filename we opened, as a C string. */ char *filename; /* The encoding we're using. */ MVMint64 encoding; /* Decode stream, for turning bytes from disk into strings. */ MVMDecodeStream *ds; /* Current separator specification for line-by-line reading. */ MVMDecodeStreamSeparators sep_spec; } MVMIOFileData; /* Closes the file. */ static MVMint64 closefh(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; uv_fs_t req; if (data->ds) { MVM_string_decodestream_destory(tc, data->ds); data->ds = NULL; } if (uv_fs_close(tc->loop, &req, data->fd, NULL) < 0) { data->fd = -1; MVM_exception_throw_adhoc(tc, "Failed to close filehandle: %s", uv_strerror(req.result)); } data->fd = -1; return 0; } /* Checks if the file is a TTY. */ static MVMint64 is_tty(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; return (uv_guess_handle(data->fd) == UV_TTY); } /* Sets the encoding used for string-based I/O. */ static void set_encoding(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (data->ds) MVM_exception_throw_adhoc(tc, "Too late to change handle encoding"); data->encoding = encoding; } /* Seek to the specified position in the file. */ static void seek(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; MVMint64 r; if (data->ds) { /* We'll start over from a new position. */ MVM_string_decodestream_destory(tc, data->ds); data->ds = NULL; } /* Seek, then get absolute position for new decodestream. */ if (MVM_platform_lseek(data->fd, offset, whence) == -1) MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: %d", errno); if ((r = MVM_platform_lseek(data->fd, 0, SEEK_CUR)) == -1) MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: %d", errno); data->ds = MVM_string_decodestream_create(tc, data->encoding, r); } /* Get curernt position in the file. */ static MVMint64 mvm_tell(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; return data->ds ? MVM_string_decodestream_tell_bytes(tc, data->ds) : 0; } /* Set the line separator. */ static void set_separator(MVMThreadContext *tc, MVMOSHandle *h, MVMString **seps, MVMint32 num_seps) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; MVM_string_decode_stream_sep_from_strings(tc, &(data->sep_spec), seps, num_seps); } /* Read a bunch of bytes into the current decode stream. */ static MVMint32 read_to_buffer(MVMThreadContext *tc, MVMIOFileData *data, MVMint32 bytes) { char *buf = MVM_malloc(bytes); uv_buf_t read_buf = uv_buf_init(buf, bytes); uv_fs_t req; MVMint32 read; if ((read = uv_fs_read(tc->loop, &req, data->fd, &read_buf, 1, -1, NULL)) < 0) { MVM_free(buf); MVM_exception_throw_adhoc(tc, "Reading from filehandle failed: %s", uv_strerror(req.result)); } MVM_string_decodestream_add_bytes(tc, data->ds, buf, read); return read; } /* Ensures we have a decode stream, creating it if we're missing one. */ static void ensure_decode_stream(MVMThreadContext *tc, MVMIOFileData *data) { if (!data->ds) data->ds = MVM_string_decodestream_create(tc, data->encoding, 0); } /* Reads a single line from the file handle. May serve it from a buffer, if we * already read enough data. */ static MVMString * read_line(MVMThreadContext *tc, MVMOSHandle *h, MVMint32 chomp) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; ensure_decode_stream(tc, data); /* Pull data until we can read a line. */ do { MVMString *line = MVM_string_decodestream_get_until_sep(tc, data->ds, &(data->sep_spec), chomp); if (line != NULL) return line; } while (read_to_buffer(tc, data, CHUNK_SIZE) > 0); /* Reached end of file, or last (non-termianted) line. */ return MVM_string_decodestream_get_until_sep_eof(tc, data->ds, &(data->sep_spec), chomp); } /* Reads the file from the current position to the end into a string. */ static MVMString * slurp(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; uv_fs_t req; ensure_decode_stream(tc, data); /* Typically we're slurping an entire file, so just request the bytes * until the end; repeat to ensure we get 'em all. */ if (uv_fs_fstat(tc->loop, &req, data->fd, NULL) < 0) { MVM_exception_throw_adhoc(tc, "slurp from filehandle failed: %s", uv_strerror(req.result)); } /* Sometimes - usually for special files like those in /proc - the file * size comes up 0, even though the S_ISREG test succeeds. So in that case * we try a small read and switch to a "read chunks until EOF" impl. * Otherwise we just read the exact size of the file. */ if (req.statbuf.st_size == 0) { if (read_to_buffer(tc, data, 32) > 0) { while (read_to_buffer(tc, data, 4096) > 0) ; } } else { while (read_to_buffer(tc, data, req.statbuf.st_size) > 0) ; } return MVM_string_decodestream_get_all(tc, data->ds); } /* Gets the specified number of characters from the file. */ static MVMString * read_chars(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 chars) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; ensure_decode_stream(tc, data); /* Pull data until we can read the chars we want. */ do { MVMString *result = MVM_string_decodestream_get_chars(tc, data->ds, chars); if (result != NULL) return result; } while (read_to_buffer(tc, data, CHUNK_SIZE) > 0); /* Reached end of file, so just take what we have. */ return MVM_string_decodestream_get_all(tc, data->ds); } /* Reads the specified number of bytes into a the supplied buffer, returing * the number actually read. */ static MVMint64 read_bytes(MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; ensure_decode_stream(tc, data); /* Keep requesting bytes until we have enough in the buffer or we hit * end of file. */ while (!MVM_string_decodestream_have_bytes(tc, data->ds, bytes)) { if (read_to_buffer(tc, data, bytes) <= 0) break; } /* Read as many as we can, up to the limit. */ return MVM_string_decodestream_bytes_to_buf(tc, data->ds, buf, bytes); } /* Checks if the end of file has been reached. */ static MVMint64 mvm_eof(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; MVMint64 seek_pos; uv_fs_t req; if (data->ds && !MVM_string_decodestream_is_empty(tc, data->ds)) return 0; if (uv_fs_fstat(tc->loop, &req, data->fd, NULL) == -1) { MVM_exception_throw_adhoc(tc, "Failed to stat file descriptor: %s", uv_strerror(req.result)); } if ((seek_pos = MVM_platform_lseek(data->fd, 0, SEEK_CUR)) == -1) MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: %d", errno); return req.statbuf.st_size == seek_pos; } /* Writes the specified string to the file handle, maybe with a newline. */ static MVMint64 write_str(MVMThreadContext *tc, MVMOSHandle *h, MVMString *str, MVMint64 newline) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; MVMuint64 output_size; MVMint64 bytes_written; char *output = MVM_string_encode(tc, str, 0, -1, &output_size, data->encoding, NULL); uv_buf_t write_buf = uv_buf_init(output, output_size); uv_fs_t req; bytes_written = uv_fs_write(tc->loop, &req, data->fd, &write_buf, 1, -1, NULL); if (bytes_written < 0) { MVM_free(output); MVM_exception_throw_adhoc(tc, "Failed to write bytes to filehandle: %s", uv_strerror(req.result)); } MVM_free(output); if (newline) { uv_buf_t nl = uv_buf_init("\n", 1); if (uv_fs_write(tc->loop, &req, data->fd, &nl, 1, -1, NULL) < 0) MVM_exception_throw_adhoc(tc, "Failed to write newline to filehandle: %s", uv_strerror(req.result)); bytes_written++; } return bytes_written; } /* Writes the specified bytes to the file handle. */ static MVMint64 write_bytes(MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; uv_buf_t write_buf = uv_buf_init(buf, bytes); uv_fs_t req; MVMint64 bytes_written; bytes_written = uv_fs_write(tc->loop, &req, data->fd, &write_buf, 1, -1, NULL); if (bytes_written < 0) MVM_exception_throw_adhoc(tc, "Failed to write bytes to filehandle: %s", uv_strerror(req.result)); return bytes_written; } /* Flushes the file handle. */ static void flush(MVMThreadContext *tc, MVMOSHandle *h){ MVMIOFileData *data = (MVMIOFileData *)h->body.data; uv_fs_t req; if (uv_fs_fsync(tc->loop, &req, data->fd, NULL) < 0 ) MVM_exception_throw_adhoc(tc, "Failed to flush filehandle: %s", uv_strerror(req.result)); } /* Truncates the file handle. */ static void truncatefh(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; uv_fs_t req; if(uv_fs_ftruncate(tc->loop, &req, data->fd, bytes, NULL) < 0 ) MVM_exception_throw_adhoc(tc, "Failed to truncate filehandle: %s", uv_strerror(req.result)); } /* Operations aiding process spawning and I/O handling. */ static void bind_stdio_handle(MVMThreadContext *tc, MVMOSHandle *h, uv_stdio_container_t *stdio, uv_process_t *process) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; stdio->flags = UV_INHERIT_FD; stdio->data.fd = data->fd; } /* Locks a file. */ static MVMint64 lock(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 flag) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; #ifdef _WIN32 const DWORD len = 0xffffffff; const HANDLE hf = (HANDLE)_get_osfhandle(data->fd); OVERLAPPED offset; if (hf == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: bad file descriptor"); } flag = ((flag & MVM_FILE_FLOCK_NONBLOCK) ? LOCKFILE_FAIL_IMMEDIATELY : 0) + ((flag & MVM_FILE_FLOCK_TYPEMASK) == MVM_FILE_FLOCK_SHARED ? 0 : LOCKFILE_EXCLUSIVE_LOCK); memset (&offset, 0, sizeof(offset)); if (LockFileEx(hf, flag, 0, len, len, &offset)) { return 1; } MVM_exception_throw_adhoc(tc, "Failed to lock filehandle: %d", GetLastError()); return 0; #else struct flock l; ssize_t r; int fc; const int fd = data->fd; l.l_whence = SEEK_SET; l.l_start = 0; l.l_len = 0; if ((flag & MVM_FILE_FLOCK_TYPEMASK) == MVM_FILE_FLOCK_SHARED) l.l_type = F_RDLCK; else l.l_type = F_WRLCK; fc = (flag & MVM_FILE_FLOCK_NONBLOCK) ? F_SETLK : F_SETLKW; do { r = fcntl(fd, fc, &l); } while (r == -1 && errno == EINTR); if (r == -1) { MVM_exception_throw_adhoc(tc, "Failed to lock filehandle: %d", errno); } return 1; #endif } /* Unlocks a file. */ static void unlock(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; #ifdef _WIN32 const DWORD len = 0xffffffff; const HANDLE hf = (HANDLE)_get_osfhandle(data->fd); OVERLAPPED offset; if (hf == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: bad file descriptor"); } memset (&offset, 0, sizeof(offset)); if (UnlockFileEx(hf, 0, len, len, &offset)) { return; } MVM_exception_throw_adhoc(tc, "Failed to unlock filehandle: %d", GetLastError()); #else struct flock l; ssize_t r; const int fd = data->fd; l.l_whence = SEEK_SET; l.l_start = 0; l.l_len = 0; l.l_type = F_UNLCK; do { r = fcntl(fd, F_SETLKW, &l); } while (r == -1 && errno == EINTR); if (r == -1) { MVM_exception_throw_adhoc(tc, "Failed to unlock filehandle: %d", errno); } #endif } /* Frees data associated with the handle. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOFileData *data = (MVMIOFileData *)d; if (data) { if (data->ds) MVM_string_decodestream_destory(tc, data->ds); if (data->filename) MVM_free(data->filename); MVM_free(data); } } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { closefh }; static const MVMIOEncodable encodable = { set_encoding }; static const MVMIOSyncReadable sync_readable = { set_separator, read_line, slurp, read_chars, read_bytes, mvm_eof }; static const MVMIOSyncWritable sync_writable = { write_str, write_bytes, flush, truncatefh }; static const MVMIOSeekable seekable = { seek, mvm_tell }; static const MVMIOPipeable pipeable = { bind_stdio_handle }; static const MVMIOLockable lockable = { lock, unlock }; static const MVMIOPossiblyTTY possibly_tty = { is_tty }; static const MVMIOOps op_table = { &closable, &encodable, &sync_readable, &sync_writable, NULL, NULL, &seekable, NULL, &pipeable, &lockable, &possibly_tty, NULL, gc_free }; /* Builds POSIX flag from mode string. */ static int resolve_open_mode(int *flag, const char *cp) { switch (*cp++) { case 'r': *flag = O_RDONLY; break; case '-': *flag = O_WRONLY; break; case '+': *flag = O_RDWR; break; /* alias for "-c" or "-ct" if by itself */ case 'w': *flag = *cp ? O_WRONLY | O_CREAT : O_WRONLY | O_CREAT | O_TRUNC; break; default: return 0; } for (;;) switch (*cp++) { case 0: return 1; case 'a': *flag |= O_APPEND; break; case 'c': *flag |= O_CREAT; break; case 't': *flag |= O_TRUNC; break; case 'x': *flag |= O_EXCL; break; default: return 0; } } /* Opens a file, returning a synchronous file handle. */ MVMObject * MVM_file_open_fh(MVMThreadContext *tc, MVMString *filename, MVMString *mode) { char * const fname = MVM_string_utf8_c8_encode_C_string(tc, filename); char * const fmode = MVM_string_utf8_encode_C_string(tc, mode); MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOFileData * const data = MVM_calloc(1, sizeof(MVMIOFileData)); uv_fs_t req; uv_file fd; /* Resolve mode description to flags. */ int flag; if (!resolve_open_mode(&flag, fmode)) { char *waste[] = { fmode, NULL }; MVM_free(fname); MVM_exception_throw_adhoc_free(tc, waste, "Invalid open mode: %s", fmode); } MVM_free(fmode); /* Try to open the file. */ if ((fd = uv_fs_open(tc->loop, &req, (const char *)fname, flag, DEFAULT_MODE, NULL)) < 0) { char *waste[] = { fname, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Failed to open file %s: %s", fname, uv_strerror(req.result)); } /* Set up handle. */ data->fd = fd; data->filename = fname; data->encoding = MVM_encoding_type_utf8; MVM_string_decode_stream_sep_default(tc, &(data->sep_spec)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } /* Opens a file, returning a synchronous file handle. */ MVMObject * MVM_file_handle_from_fd(MVMThreadContext *tc, uv_file fd) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOFileData * const data = MVM_calloc(1, sizeof(MVMIOFileData)); data->fd = fd; data->encoding = MVM_encoding_type_utf8; result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } MoarVM-2015.11/src/io/syncfile.h0000644000175000017500000000024112620140151015220 0ustar jnthnjnthnMVMObject * MVM_file_open_fh(MVMThreadContext *tc, MVMString *filename, MVMString *mode); MVMObject * MVM_file_handle_from_fd(MVMThreadContext *tc, uv_file fd); MoarVM-2015.11/src/io/syncpipe.c0000644000175000017500000001026512623370227015254 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include #endif /* This heavily re-uses the logic from syncstream, but with different close * and gc_free semantics. */ /* Closes the pipe. */ static MVMint64 do_close(MVMThreadContext *tc, MVMIOSyncPipeData *data) { #ifdef _WIN32 DWORD status = 0; #else int status = 0; #endif if (data->ss.handle == NULL || uv_is_closing((uv_handle_t*)data->ss.handle)) return 0; /* closing the in-/output std filehandle will shutdown the child process. */ uv_unref((uv_handle_t*)data->ss.handle); uv_close((uv_handle_t*)data->ss.handle, NULL); if (data->process) { #ifdef _WIN32 if (!uv_is_closing((uv_handle_t*)data->process)) uv_process_close(tc->loop, data->process); GetExitCodeProcess(data->process->process_handle, &status); status = status << 8; #else pid_t wpid; do wpid = waitpid(data->process->pid, &status, 0); while (wpid == -1 && errno == EINTR); #endif } if (!status && data->process->data) { status = *(MVMint64*)data->process->data; MVM_free(data->process->data); data->process->data = NULL; } uv_unref((uv_handle_t *)data->process); uv_run(tc->loop, UV_RUN_DEFAULT); data->process = NULL; data->ss.handle = NULL; if (data->ss.ds) { MVM_string_decodestream_destory(tc, data->ss.ds); data->ss.ds = NULL; } return (MVMint64)status; } static MVMint64 closefh(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncPipeData *data = (MVMIOSyncPipeData *)h->body.data; return do_close(tc, data); } /* Operations aiding process spawning and I/O handling. */ static void bind_stdio_handle(MVMThreadContext *tc, MVMOSHandle *h, uv_stdio_container_t *stdio, uv_process_t *process) { MVMIOSyncPipeData *data = (MVMIOSyncPipeData *)h->body.data; data->process = process; stdio->flags = UV_INHERIT_STREAM; stdio->data.stream = data->ss.handle; } /* Frees data associated with the pipe, closing it if needed. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOSyncPipeData *data = (MVMIOSyncPipeData *)d; do_close(tc, data); } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { closefh }; static const MVMIOEncodable encodable = { MVM_io_syncstream_set_encoding }; static const MVMIOSyncReadable sync_readable = { MVM_io_syncstream_set_separator, MVM_io_syncstream_read_line, MVM_io_syncstream_slurp, MVM_io_syncstream_read_chars, MVM_io_syncstream_read_bytes, MVM_io_syncstream_eof }; static const MVMIOSyncWritable sync_writable = { MVM_io_syncstream_write_str, MVM_io_syncstream_write_bytes, MVM_io_syncstream_flush, MVM_io_syncstream_truncate }; static const MVMIOSeekable seekable = { MVM_io_syncstream_seek, MVM_io_syncstream_tell }; static const MVMIOPipeable pipeable = { bind_stdio_handle }; static const MVMIOOps op_table = { &closable, &encodable, &sync_readable, &sync_writable, NULL, NULL, &seekable, NULL, &pipeable, NULL, NULL, NULL, gc_free }; /* Creates a sync pipe handle. */ MVMObject * MVM_io_syncpipe(MVMThreadContext *tc) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncPipeData * const data = MVM_calloc(1, sizeof(MVMIOSyncPipeData)); uv_pipe_t *handle = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, handle, 0); data->ss.handle = (uv_stream_t *)handle; data->ss.encoding = MVM_encoding_type_utf8; MVM_string_decode_stream_sep_default(tc, &(data->ss.sep_spec)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } MoarVM-2015.11/src/io/syncpipe.h0000644000175000017500000000051512554473060015260 0ustar jnthnjnthn/* Data that we keep for a pipe-based handle. */ struct MVMIOSyncPipeData { /* Start with same fields as a sync stream, since we will re-use most * of its logic. */ MVMIOSyncStreamData ss; /* Also need to keep hold of the process */ uv_process_t *process; }; MVMObject * MVM_io_syncpipe(MVMThreadContext *tc); MoarVM-2015.11/src/io/syncsocket.c0000644000175000017500000002174012623370227015607 0ustar jnthnjnthn#include "moar.h" #ifndef _WIN32 #include "unistd.h" #endif #if defined(_MSC_VER) #define snprintf _snprintf #endif /* Data that we keep for a socket-based handle. */ typedef struct { /* Start with same fields as a sync stream, since we will re-use most * of its logic. */ MVMIOSyncStreamData ss; /* Details of next connection to accept; NULL if none. */ uv_stream_t *accept_server; int accept_status; } MVMIOSyncSocketData; static MVMint64 do_close(MVMThreadContext *tc, MVMIOSyncSocketData *data) { if (data->ss.handle) { uv_close((uv_handle_t *)data->ss.handle, NULL); data->ss.handle = NULL; } if (data->ss.ds) { MVM_string_decodestream_destory(tc, data->ss.ds); data->ss.ds = NULL; } return 0; } static MVMint64 close_socket(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; return do_close(tc, data); } static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)d; do_close(tc, data); } /* Actually, it may return sockaddr_in6 as well; it's not a problem for us, because we just * pass is straight to uv, and the first thing it does is it looks at the address family, * but it's a thing to remember if someone feels like peeking inside the returned struct. */ struct sockaddr * MVM_io_resolve_host_name(MVMThreadContext *tc, MVMString *host, MVMint64 port) { char *host_cstr = MVM_string_utf8_encode_C_string(tc, host); struct sockaddr *dest; struct addrinfo *result; int error; char port_cstr[8]; snprintf(port_cstr, 8, "%d", (int)port); error = getaddrinfo(host_cstr, port_cstr, NULL, &result); MVM_free(host_cstr); if (error == 0) { if (result->ai_addr->sa_family == AF_INET6) { dest = MVM_malloc(sizeof(struct sockaddr_in6)); memcpy(dest, result->ai_addr, sizeof(struct sockaddr_in6)); } else { dest = MVM_malloc(sizeof(struct sockaddr)); memcpy(dest, result->ai_addr, sizeof(struct sockaddr)); } } else { MVM_exception_throw_adhoc(tc, "Failed to resolve host name"); } freeaddrinfo(result); return dest; } static void on_connect(uv_connect_t* req, int status) { uv_unref((uv_handle_t *)req->handle); if (status < 0) { MVMThreadContext *tc = ((MVMIOSyncSocketData *)req->data)->ss.cur_tc; MVM_free(req); MVM_exception_throw_adhoc(tc, "Failed to connect: %s", uv_strerror(status)); } } static void socket_connect(MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; if (!data->ss.handle) { struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); uv_tcp_t *socket = MVM_malloc(sizeof(uv_tcp_t)); uv_connect_t *connect = MVM_malloc(sizeof(uv_connect_t)); int r; data->ss.cur_tc = tc; connect->data = data; if ((r = uv_tcp_init(tc->loop, socket)) < 0 || (r = uv_tcp_connect(connect, socket, dest, on_connect)) < 0) { MVM_free(socket); MVM_free(connect); MVM_free(dest); MVM_exception_throw_adhoc(tc, "Failed to connect: %s", uv_strerror(r)); } uv_ref((uv_handle_t *)socket); uv_run(tc->loop, UV_RUN_DEFAULT); data->ss.handle = (uv_stream_t *)socket; MVM_free(connect); MVM_free(dest); } else { MVM_exception_throw_adhoc(tc, "Socket is already bound or connected"); } } static void on_connection(uv_stream_t *server, int status) { /* Stash data for a later accept call (safe as we specify a queue of just * one connection). Decrement reference count also. */ MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)server->data; data->accept_server = server; data->accept_status = status; uv_unref((uv_handle_t *)server); } static void socket_bind(MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; if (!data->ss.handle) { struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); uv_tcp_t *socket = MVM_malloc(sizeof(uv_tcp_t)); int r; if ((r = uv_tcp_init(tc->loop, socket)) != 0 || (r = uv_tcp_bind(socket, dest, 0)) != 0) { MVM_free(socket); MVM_free(dest); MVM_exception_throw_adhoc(tc, "Failed to bind: %s", uv_strerror(r)); } MVM_free(dest); /* Start listening, but unref the socket so it won't get in the way of * other things we want to do on this event loop. */ socket->data = data; if ((r = uv_listen((uv_stream_t *)socket, 1, on_connection)) != 0) { MVM_free(socket); MVM_exception_throw_adhoc(tc, "Failed to listen: %s", uv_strerror(r)); } uv_unref((uv_handle_t *)socket); data->ss.handle = (uv_stream_t *)socket; } else { MVM_exception_throw_adhoc(tc, "Socket is already bound or connected"); } } static MVMObject * socket_accept(MVMThreadContext *tc, MVMOSHandle *h); /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { close_socket }; static const MVMIOEncodable encodable = { MVM_io_syncstream_set_encoding }; static const MVMIOSyncReadable sync_readable = { MVM_io_syncstream_set_separator, MVM_io_syncstream_read_line, MVM_io_syncstream_slurp, MVM_io_syncstream_read_chars, MVM_io_syncstream_read_bytes, MVM_io_syncstream_eof }; static const MVMIOSyncWritable sync_writable = { MVM_io_syncstream_write_str, MVM_io_syncstream_write_bytes, MVM_io_syncstream_flush, MVM_io_syncstream_truncate }; static const MVMIOSeekable seekable = { MVM_io_syncstream_seek, MVM_io_syncstream_tell }; static const MVMIOSockety sockety = { socket_connect, socket_bind, socket_accept }; static const MVMIOOps op_table = { &closable, &encodable, &sync_readable, &sync_writable, NULL, NULL, &seekable, &sockety, NULL, NULL, NULL, NULL, gc_free }; static MVMObject * socket_accept(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; while (!data->accept_server) { if (tc->loop != data->ss.handle->loop) { MVM_exception_throw_adhoc(tc, "Tried to accept() on a socket from outside its originating thread"); } uv_ref((uv_handle_t *)data->ss.handle); uv_run(tc->loop, UV_RUN_DEFAULT); } /* Check the accept worked out. */ if (data->accept_status < 0) { MVM_exception_throw_adhoc(tc, "Failed to listen: unknown error"); } else { uv_tcp_t *client = MVM_malloc(sizeof(uv_tcp_t)); uv_stream_t *server = data->accept_server; int r; uv_tcp_init(tc->loop, client); data->accept_server = NULL; if ((r = uv_accept(server, (uv_stream_t *)client)) == 0) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncSocketData * const data = MVM_calloc(1, sizeof(MVMIOSyncSocketData)); data->ss.handle = (uv_stream_t *)client; data->ss.encoding = MVM_encoding_type_utf8; MVM_string_decode_stream_sep_default(tc, &(data->ss.sep_spec)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } else { uv_close((uv_handle_t*)client, NULL); MVM_free(client); MVM_exception_throw_adhoc(tc, "Failed to accept: %s", uv_strerror(r)); } } } MVMObject * MVM_io_socket_create(MVMThreadContext *tc, MVMint64 listen) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncSocketData * const data = MVM_calloc(1, sizeof(MVMIOSyncSocketData)); data->ss.handle = NULL; data->ss.encoding = MVM_encoding_type_utf8; MVM_string_decode_stream_sep_default(tc, &(data->ss.sep_spec)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } MVMString * MVM_io_get_hostname(MVMThreadContext *tc) { char hostname[65]; gethostname(hostname, 65); return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, hostname); } MoarVM-2015.11/src/io/syncsocket.h0000644000175000017500000000034212456307241015607 0ustar jnthnjnthnMVMObject * MVM_io_socket_create(MVMThreadContext *tc, MVMint64 listen); struct sockaddr * MVM_io_resolve_host_name(MVMThreadContext *tc, MVMString *host, MVMint64 port); MVMString * MVM_io_get_hostname(MVMThreadContext *tc); MoarVM-2015.11/src/io/syncstream.c0000644000175000017500000003156412623370227015617 0ustar jnthnjnthn#include "moar.h" /* We only get asynchronous forms of various kinds of I/O with libuv, yet we * also need to provide synchronous I/O on those. Here we do the work of that * adaptation. Since many things are exposed as streams in libuv, the code in * here is used to implement synchronous handling of TTYs, pipes, and sockets. * TTYs and (libuv) pipes use this directly; (real) pipes and sockets use many * of the functions, but have their own tables. */ /* Number of bytes we pull in at a time to the buffer. */ #define CHUNK_SIZE 65536 /* Sets the encoding used for string-based I/O. */ void MVM_io_syncstream_set_encoding(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; if (data->ds) { if (data->ds->chars_head) MVM_exception_throw_adhoc(tc, "Too late to change handle encoding"); data->ds->encoding = encoding; } data->encoding = encoding; } /* Cannot seek a TTY of named pipe (could fake the forward case, probably). */ void MVM_io_syncstream_seek(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence) { MVM_exception_throw_adhoc(tc, "Cannot seek this kind of handle"); } /* If we've been reading, the total number of bytes read. Otherwise, the total * number of bytes we've written. */ MVMint64 MVM_io_syncstream_tell(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; return data->ds ? MVM_string_decodestream_tell_bytes(tc, data->ds) : data->total_bytes_written; } /* Set the line separator. */ void MVM_io_syncstream_set_separator(MVMThreadContext *tc, MVMOSHandle *h, MVMString **seps, MVMint32 num_seps) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; MVM_string_decode_stream_sep_from_strings(tc, &(data->sep_spec), seps, num_seps); } /* Read a bunch of bytes into the current decode stream. Returns true if we * read some data, and false if we hit EOF. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { size_t size = suggested_size > 0 ? suggested_size : 4; buf->base = MVM_malloc(size); buf->len = size; } static void on_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)handle->data; if (nread > 0) { MVM_string_decodestream_add_bytes(data->cur_tc, data->ds, buf->base, nread); } else if (nread == UV_EOF) { data->eof = 1; if (buf->base) MVM_free(buf->base); } uv_read_stop(handle); uv_unref((uv_handle_t*)handle); } static MVMint32 read_to_buffer(MVMThreadContext *tc, MVMIOSyncStreamData *data, MVMint32 bytes) { /* Don't try and read again if we already saw EOF. */ if (!data->eof) { int r; data->handle->data = data; data->cur_tc = tc; if ((r = uv_read_start(data->handle, on_alloc, on_read)) < 0) MVM_exception_throw_adhoc(tc, "Reading from stream failed: %s", uv_strerror(r)); uv_ref((uv_handle_t *)data->handle); if (tc->loop != data->handle->loop) { MVM_exception_throw_adhoc(tc, "Tried to read() on a socket from outside its originating thread"); } uv_run(tc->loop, UV_RUN_DEFAULT); return 1; } else { return 0; } } /* Ensures we have a decode stream, creating it if we're missing one. */ static void ensure_decode_stream(MVMThreadContext *tc, MVMIOSyncStreamData *data) { if (!data->ds) data->ds = MVM_string_decodestream_create(tc, data->encoding, 0); } /* Reads a single line from the stream. May serve it from a buffer, if we * already read enough data. */ MVMString * MVM_io_syncstream_read_line(MVMThreadContext *tc, MVMOSHandle *h, MVMint32 chomp) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; ensure_decode_stream(tc, data); /* Pull data until we can read a line. */ do { MVMString *line = MVM_string_decodestream_get_until_sep(tc, data->ds, &(data->sep_spec), chomp); if (line != NULL) return line; } while (read_to_buffer(tc, data, CHUNK_SIZE) > 0); /* Reached end of stream, or last (non-termianted) line. */ return MVM_string_decodestream_get_until_sep_eof(tc, data->ds, &(data->sep_spec), chomp); } /* Reads the stream from the current position to the end into a string, * fetching as much data is available. */ MVMString * MVM_io_syncstream_slurp(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; ensure_decode_stream(tc, data); /* Fetch as much data as we can (XXX this can be more efficient, by * passing on down that we want to get many buffers from libuv). */ while (read_to_buffer(tc, data, CHUNK_SIZE)) ; return MVM_string_decodestream_get_all(tc, data->ds); } /* Gets the specified number of characters from the stream. */ MVMString * MVM_io_syncstream_read_chars(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 chars) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; MVMString *result; ensure_decode_stream(tc, data); /* Do we already have the chars available? */ result = MVM_string_decodestream_get_chars(tc, data->ds, chars); if (result) { return result; } else { /* No; read and try again. */ read_to_buffer(tc, data, CHUNK_SIZE); result = MVM_string_decodestream_get_chars(tc, data->ds, chars); if (result != NULL) return result; } /* Fetched all we immediately can, so just take what we have. */ return MVM_string_decodestream_get_all(tc, data->ds); } /* Reads the specified number of bytes into a the supplied buffer, returing * the number actually read. */ MVMint64 MVM_io_syncstream_read_bytes(MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; ensure_decode_stream(tc, data); /* See if we've already enough; if not, try and grab more. */ if (!MVM_string_decodestream_have_bytes(tc, data->ds, bytes)) read_to_buffer(tc, data, bytes > CHUNK_SIZE ? bytes : CHUNK_SIZE); /* Read as many as we can, up to the limit. */ return MVM_string_decodestream_bytes_to_buf(tc, data->ds, buf, bytes); } /* Checks if the end of stream has been reached. */ MVMint64 MVM_io_syncstream_eof(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; /* If we still have stuff in the buffer, certainly not the end (even if * data->eof is set; that just means we read all we can from libuv, not * that we processed it all). */ if (data->ds && !MVM_string_decodestream_is_empty(tc, data->ds)) return 0; /* Otherwise, go on the EOF flag from the underlying stream. */ return data->eof; } /* Writes the specified string to the stream, maybe with a newline. */ static void write_cb(uv_write_t* req, int status) { uv_unref((uv_handle_t *)req->handle); MVM_free(req); } MVMint64 MVM_io_syncstream_write_str(MVMThreadContext *tc, MVMOSHandle *h, MVMString *str, MVMint64 newline) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; char *output; MVMuint64 output_size; uv_write_t *req; uv_buf_t write_buf; int r; output = MVM_string_encode(tc, str, 0, -1, &output_size, data->encoding, NULL); if (newline) { output = (char *)MVM_realloc(output, ++output_size); output[output_size - 1] = '\n'; } req = MVM_malloc(sizeof(uv_write_t)); write_buf = uv_buf_init(output, output_size); uv_ref((uv_handle_t *)data->handle); if ((r = uv_write(req, data->handle, &write_buf, 1, write_cb)) < 0) { uv_unref((uv_handle_t *)data->handle); MVM_free(req); MVM_free(output); MVM_exception_throw_adhoc(tc, "Failed to write string to stream: %s", uv_strerror(r)); } else { uv_run(tc->loop, UV_RUN_DEFAULT); MVM_free(output); } data->total_bytes_written += output_size; return output_size; } /* Writes the specified bytes to the stream. */ MVMint64 MVM_io_syncstream_write_bytes(MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; uv_write_t *req = MVM_malloc(sizeof(uv_write_t)); uv_buf_t write_buf = uv_buf_init(buf, bytes); int r; uv_ref((uv_handle_t *)data->handle); if ((r = uv_write(req, data->handle, &write_buf, 1, write_cb)) < 0) { uv_unref((uv_handle_t *)data->handle); MVM_free(req); MVM_exception_throw_adhoc(tc, "Failed to write bytes to stream: %s", uv_strerror(r)); } else { uv_run(tc->loop, UV_RUN_DEFAULT); } data->total_bytes_written += bytes; return bytes; } /* No flush available for stream. */ void MVM_io_syncstream_flush(MVMThreadContext *tc, MVMOSHandle *h){ } /* Cannot truncate a stream. */ void MVM_io_syncstream_truncate(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes) { MVM_exception_throw_adhoc(tc, "Cannot truncate this kind of handle"); } /* A close function for the case when we simply have a handle. */ static MVMint64 not_std_handle(MVMThreadContext *tc, MVMObject *h) { return h != tc->instance->stdin_handle && h != tc->instance->stdout_handle && h != tc->instance->stderr_handle; } static MVMint64 closefh(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; if (data->handle && not_std_handle(tc, (MVMObject *)h)) { uv_close((uv_handle_t *)data->handle, NULL); data->handle = NULL; if (data->ds) { MVM_string_decodestream_destory(tc, data->ds); data->ds = NULL; } } return 0; } static MVMint64 is_tty(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; return data->is_tty; } /* Operations aiding process spawning and I/O handling. */ static void bind_stdio_handle(MVMThreadContext *tc, MVMOSHandle *h, uv_stdio_container_t *stdio, uv_process_t *process) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)h->body.data; stdio->flags = UV_INHERIT_STREAM; stdio->data.stream = data->handle; } /* Frees data associated with the handle, closing it if needed. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOSyncStreamData *data = (MVMIOSyncStreamData *)d; if (data) { if (data->handle && not_std_handle(tc, h)) { uv_close((uv_handle_t *)data->handle, NULL); data->handle = NULL; } if (data->ds) { MVM_string_decodestream_destory(tc, data->ds); data->ds = NULL; } MVM_free(data); } } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { closefh }; static const MVMIOEncodable encodable = { MVM_io_syncstream_set_encoding }; static const MVMIOSyncReadable sync_readable = { MVM_io_syncstream_set_separator, MVM_io_syncstream_read_line, MVM_io_syncstream_slurp, MVM_io_syncstream_read_chars, MVM_io_syncstream_read_bytes, MVM_io_syncstream_eof }; static const MVMIOSyncWritable sync_writable = { MVM_io_syncstream_write_str, MVM_io_syncstream_write_bytes, MVM_io_syncstream_flush, MVM_io_syncstream_truncate }; static const MVMIOSeekable seekable = { MVM_io_syncstream_seek, MVM_io_syncstream_tell }; static const MVMIOPipeable pipeable = { bind_stdio_handle }; static const MVMIOPossiblyTTY possibly_tty = { is_tty }; static const MVMIOOps op_table = { &closable, &encodable, &sync_readable, &sync_writable, NULL, NULL, &seekable, NULL, &pipeable, NULL, &possibly_tty, NULL, gc_free }; /* Wraps a libuv stream (likely, libuv pipe or TTY) up in a sync stream. */ MVMObject * MVM_io_syncstream_from_uvstream(MVMThreadContext *tc, uv_stream_t *handle, MVMint8 is_tty) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncStreamData * const data = MVM_calloc(1, sizeof(MVMIOSyncStreamData)); data->handle = handle; data->encoding = MVM_encoding_type_utf8; data->is_tty = is_tty; MVM_string_decode_stream_sep_default(tc, &(data->sep_spec)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } MoarVM-2015.11/src/io/syncstream.h0000644000175000017500000000364212623370227015620 0ustar jnthnjnthn/* Data that we keep for a stream-based handle. */ struct MVMIOSyncStreamData { /* is it a TTY? */ MVMint8 is_tty; /* The libuv handle to the stream-readable thingy. */ uv_stream_t *handle; /* The encoding we're using. */ MVMint64 encoding; /* Did we reach EOF yet? */ MVMint64 eof; /* Decode stream, for turning bytes into strings. */ MVMDecodeStream *ds; /* The thread that is doing reading. */ MVMThreadContext *cur_tc; /* Total bytes we've written. */ MVMint64 total_bytes_written; /* Current separator specification for line-by-line reading. */ MVMDecodeStreamSeparators sep_spec; }; void MVM_io_syncstream_set_encoding(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 encoding); void MVM_io_syncstream_seek(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence); MVMint64 MVM_io_syncstream_tell(MVMThreadContext *tc, MVMOSHandle *h); void MVM_io_syncstream_set_separator(MVMThreadContext *tc, MVMOSHandle *h, MVMString **sep, MVMint32 num_seps); MVMString * MVM_io_syncstream_read_line(MVMThreadContext *tc, MVMOSHandle *h, MVMint32 chomp); MVMString * MVM_io_syncstream_slurp(MVMThreadContext *tc, MVMOSHandle *h); MVMString * MVM_io_syncstream_read_chars(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 chars); MVMint64 MVM_io_syncstream_read_bytes(MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes); MVMint64 MVM_io_syncstream_eof(MVMThreadContext *tc, MVMOSHandle *h); MVMint64 MVM_io_syncstream_write_str(MVMThreadContext *tc, MVMOSHandle *h, MVMString *str, MVMint64 newline); MVMint64 MVM_io_syncstream_write_bytes(MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes); void MVM_io_syncstream_flush(MVMThreadContext *tc, MVMOSHandle *h); void MVM_io_syncstream_truncate(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes); MVMObject * MVM_io_syncstream_from_uvstream(MVMThreadContext *tc, uv_stream_t *handle, MVMint8 is_tty); MoarVM-2015.11/src/io/timers.c0000644000175000017500000000551712456307241014731 0ustar jnthnjnthn#include "moar.h" /* Info we convey about a timer. */ typedef struct { int timeout; int repeat; uv_timer_t handle; MVMThreadContext *tc; int work_idx; } TimerInfo; /* Timer callback; dispatches schedulee to the queue. */ static void timer_cb(uv_timer_t *handle) { TimerInfo *ti = (TimerInfo *)handle->data; MVMThreadContext *tc = ti->tc; MVMAsyncTask *t = (MVMAsyncTask *)MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, ti->work_idx); MVM_repr_push_o(tc, t->body.queue, t->body.schedulee); } /* Sets the timer up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { TimerInfo *ti = (TimerInfo *)data; uv_timer_init(loop, &ti->handle); ti->work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); ti->tc = tc; ti->handle.data = ti; MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); uv_timer_start(&ti->handle, timer_cb, ti->timeout, ti->repeat); } /* Stops the timer. */ static void cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { TimerInfo *ti = (TimerInfo *)data; uv_timer_stop(&ti->handle); } /* Frees data associated with a timer async task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async timer task. */ static const MVMAsyncTaskOps op_table = { setup, cancel, NULL, gc_free }; /* Creates a new timer. */ MVMObject * MVM_io_timer_create(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 timeout, MVMint64 repeat, MVMObject *async_type) { MVMAsyncTask *task; TimerInfo *timer_info; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "timer target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "timer result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT(tc, queue, { MVMROOT(tc, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; timer_info = MVM_malloc(sizeof(TimerInfo)); timer_info->timeout = timeout; timer_info->repeat = repeat; task->body.data = timer_info; /* Hand the task off to the event loop, which will set up the timer on the * event loop. */ MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return (MVMObject *)task; } MoarVM-2015.11/src/io/timers.h0000644000175000017500000000023512456307241014726 0ustar jnthnjnthnMVMObject * MVM_io_timer_create(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 timeout, MVMint64 repeat, MVMObject *async_type); MoarVM-2015.11/src/jit/compile.c0000644000175000017500000001073312613656332015234 0ustar jnthnjnthn#include "moar.h" #include "dasm_proto.h" #include "platform/mmap.h" #include "emit.h" #define COPY_ARRAY(a, n, t) memcpy(MVM_malloc(n * sizeof(t)), a, n * sizeof(t)) static const MVMuint16 MAGIC_BYTECODE[] = { MVM_OP_sp_jit_enter, 0 }; MVMJitCode * MVM_jit_compile_graph(MVMThreadContext *tc, MVMJitGraph *jg) { dasm_State *state; char * memory; size_t codesize; /* Space for globals */ MVMint32 num_globals = MVM_jit_num_globals(); void ** dasm_globals = MVM_malloc(num_globals * sizeof(void*)); MVMJitNode * node = jg->first_node; MVMJitCode * code; MVMint32 i; MVM_jit_log(tc, "Starting compilation\n"); /* setup dasm */ dasm_init(&state, 1); dasm_setupglobal(&state, dasm_globals, num_globals); dasm_setup(&state, MVM_jit_actions()); dasm_growpc(&state, jg->num_labels); /* generate code */ MVM_jit_emit_prologue(tc, jg, &state); while (node) { switch(node->type) { case MVM_JIT_NODE_LABEL: MVM_jit_emit_label(tc, jg, &node->u.label, &state); break; case MVM_JIT_NODE_PRIMITIVE: MVM_jit_emit_primitive(tc, jg, &node->u.prim, &state); break; case MVM_JIT_NODE_BRANCH: MVM_jit_emit_branch(tc, jg, &node->u.branch, &state); break; case MVM_JIT_NODE_CALL_C: MVM_jit_emit_call_c(tc, jg, &node->u.call, &state); break; case MVM_JIT_NODE_GUARD: MVM_jit_emit_guard(tc, jg, &node->u.guard, &state); break; case MVM_JIT_NODE_INVOKE: MVM_jit_emit_invoke(tc, jg, &node->u.invoke, &state); break; case MVM_JIT_NODE_JUMPLIST: MVM_jit_emit_jumplist(tc, jg, &node->u.jumplist, &state); break; case MVM_JIT_NODE_CONTROL: MVM_jit_emit_control(tc, jg, &node->u.control, &state); break; } node = node->next; } MVM_jit_emit_epilogue(tc, jg, &state); /* compile the function */ dasm_link(&state, &codesize); memory = MVM_platform_alloc_pages(codesize, MVM_PAGE_READ|MVM_PAGE_WRITE); dasm_encode(&state, memory); /* set memory readable + executable */ MVM_platform_set_page_mode(memory, codesize, MVM_PAGE_READ|MVM_PAGE_EXEC); MVM_jit_log(tc, "Bytecode size: %"MVM_PRSz"\n", codesize); /* Create code segment */ code = MVM_malloc(sizeof(MVMJitCode)); code->func_ptr = (MVMJitFunc)memory; code->size = codesize; code->bytecode = (MVMuint8*)MAGIC_BYTECODE; code->sf = jg->sg->sf; /* Get the basic block labels */ code->num_labels = jg->num_labels; code->labels = MVM_malloc(sizeof(void*) * code->num_labels); for (i = 0; i < code->num_labels; i++) { MVMint32 offset = dasm_getpclabel(&state, i); if (offset < 0) MVM_jit_log(tc, "Got negative offset for dynamic label %d\n", i); code->labels[i] = memory + offset; } /* Copy the deopts, inlines, and handlers. Because these use the label index * rather than the direct pointer, no fixup is necessary */ code->num_bbs = jg->num_bbs; code->bb_labels = COPY_ARRAY(jg->bb_labels, jg->num_bbs, MVMint32); code->num_deopts = jg->num_deopts; code->deopts = code->num_deopts ? COPY_ARRAY(jg->deopts, jg->num_deopts, MVMJitDeopt) : NULL; code->num_handlers = jg->num_handlers; code->handlers = code->num_handlers ? COPY_ARRAY(jg->handlers, jg->num_handlers, MVMJitHandler) : NULL; code->num_inlines = jg->num_inlines; code->inlines = code->num_inlines ? COPY_ARRAY(jg->inlines, jg->num_inlines, MVMJitInline) : NULL; /* clear up the assembler */ dasm_free(&state); MVM_free(dasm_globals); code->seq_nr = MVM_incr(&tc->instance->jit_seq_nr); if (tc->instance->jit_bytecode_dir) { MVM_jit_log_bytecode(tc, code); } if (tc->instance->jit_log_fh) fflush(tc->instance->jit_log_fh); return code; } void MVM_jit_destroy_code(MVMThreadContext *tc, MVMJitCode *code) { MVM_platform_free_pages(code->func_ptr, code->size); MVM_free(code); } /* Returns 1 if we should return from the frame, the function, 0 otherwise */ MVMint32 MVM_jit_enter_code(MVMThreadContext *tc, MVMCompUnit *cu, MVMJitCode *code) { /* The actual JIT code returns 0 if it went through to the exit */ void *label = tc->cur_frame->jit_entry_label; MVMint32 ctrl = code->func_ptr(tc, cu, label); return ctrl ? 0 : 1; } MoarVM-2015.11/src/jit/compile.h0000644000175000017500000000220212613656332015231 0ustar jnthnjnthntypedef MVMint32 (*MVMJitFunc)(MVMThreadContext *tc, MVMCompUnit *cu, void * label); struct MVMJitCode { MVMJitFunc func_ptr; size_t size; MVMuint8 *bytecode; MVMStaticFrame *sf; /* The basic idea here is that /all/ label names are indexes into * the single labels array. This isn't particularly efficient at * runtime (because we need a second dereference to figure the * labels out), but very simple for me now, and super-easy to * optimise at a later date */ MVMint32 num_labels; void **labels; MVMint32 num_bbs; MVMint32 *bb_labels; MVMint32 num_deopts; MVMJitDeopt *deopts; MVMint32 num_inlines; MVMJitInline *inlines; MVMint32 num_handlers; MVMJitHandler *handlers; MVMint32 seq_nr; }; MVMJitCode* MVM_jit_compile_graph(MVMThreadContext *tc, MVMJitGraph *graph); void MVM_jit_destroy_code(MVMThreadContext *tc, MVMJitCode *code); MVMint32 MVM_jit_enter_code(MVMThreadContext *tc, MVMCompUnit *cu, MVMJitCode * code); #define MVM_JIT_CTRL_DEOPT -1 #define MVM_JIT_CTRL_NORMAL 0 MoarVM-2015.11/src/jit/emit.h0000644000175000017500000000262412573775575014567 0ustar jnthnjnthn/* Declarations for architecture-specific codegen stuff */ const unsigned char * MVM_jit_actions(void); const unsigned int MVM_jit_num_globals(void); void MVM_jit_emit_prologue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst); void MVM_jit_emit_epilogue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst); void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitPrimitive *prim, dasm_State **Dst); void MVM_jit_emit_call_c(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallC *call_spec, dasm_State **Dst); void MVM_jit_emit_branch(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitBranch *branc_spec, dasm_State **Dst); void MVM_jit_emit_label(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitLabel *label, dasm_State **Dst); void MVM_jit_emit_guard(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitGuard *guard, dasm_State **Dst); void MVM_jit_emit_invoke(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitInvoke *invoke, dasm_State **Dst); void MVM_jit_emit_jumplist(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitJumpList *jumplist, dasm_State **Dst); void MVM_jit_emit_control(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitControl *ctrl, dasm_State **Dst); MoarVM-2015.11/src/jit/emit_x64.dasc0000644000175000017500000021741012623370227015731 0ustar jnthnjnthn#include "moar.h" #include #include #include "emit.h" #ifdef _MSC_VER #pragma warning( disable : 4129 ) #endif |.arch x64 |.actionlist actions |.section code |.globals MVM_JIT_LABEL_ /* type declarations */ |.type REGISTER, MVMRegister |.type ARGCTX, MVMArgProcContext |.type CAPTURE, MVMCallCapture |.type STATICFRAME, MVMStaticFrame |.type P6OPAQUE, MVMP6opaque |.type P6OBODY, MVMP6opaqueBody |.type MVMITER, MVMIter |.type MVMINSTANCE, MVMInstance |.type MVMACTIVEHANDLERS, MVMActiveHandler |.type OBJECT, MVMObject |.type STOOGE, MVMObjectStooge |.type COLLECTABLE, MVMCollectable |.type STABLE, MVMSTable |.type REPR, MVMREPROps |.type LEXOTIC, MVMLexotic |.type STRING, MVMString* |.type OBJECTPTR, MVMObject* |.type CONTAINERSPEC, MVMContainerSpec |.type STORAGESPEC, MVMStorageSpec |.type HLLCONFIG, MVMHLLConfig; |.type SCREFBODY, MVMSerializationContextBody |.type NFGSYNTH, MVMNFGSynthetic |.type U8, MVMuint8 |.type U16, MVMuint16 |.type U32, MVMuint32 |.type U64, MVMuint64 /* Static allocation of relevant types to registers. I pick * callee-save registers for efficiency. It is likely we'll be calling * quite a C functions, and this saves us the trouble of storing * them. Moreover, C compilers preferentially do not use callee-saved * registers, and so in most cases, these won't be touched at all. */ |.type TC, MVMThreadContext, r14 /* Alternative base pointer. I'll be using this often, so picking rbx * here rather than the extended registers will lead to smaller * bytecode */ |.type WORK, MVMRegister, rbx |.type FRAME, MVMFrame, r12 |.type CU, MVMCompUnit, r13 const MVMint32 MVM_jit_support(void) { return 1; } const unsigned char * MVM_jit_actions(void) { return actions; } const unsigned int MVM_jit_num_globals(void) { return MVM_JIT_LABEL__MAX; } /* C Call argument registers */ |.if WIN32 |.define ARG1, rcx |.define ARG2, rdx |.define ARG3, r8 |.define ARG4, r9 |.else |.define ARG1, rdi |.define ARG2, rsi |.define ARG3, rdx |.define ARG4, rcx |.define ARG5, r8 |.define ARG6, r9 |.endif /* C call argument registers for floating point */ |.if WIN32 |.define ARG1F, xmm0 |.define ARG2F, xmm1 |.define ARG3F, xmm2 |.define ARG4F, xmm3 |.else |.define ARG1F, xmm0 |.define ARG2F, xmm1 |.define ARG3F, xmm2 |.define ARG4F, xmm3 |.define ARG5F, xmm4 |.define ARG6F, xmm5 |.define ARG7F, xmm6 |.define ARG8F, xmm7 |.endif /* Special register for the function to be invoked * (chosen because it isn't involved in argument passing * and volatile) */ |.define FUNCTION, r10 /* all-purpose temporary registers */ |.define TMP1, rcx |.define TMP2, rdx |.define TMP3, r8 |.define TMP4, r9 |.define TMP5, r10 |.define TMP6, r11 /* same, but 32 bits wide */ |.define TMP1d, ecx |.define TMP2d, edx |.define TMP3d, r8d |.define TMP4d, r9d |.define TMP5d, r10d |.define TMP6d, r11d /* and 16 bits wide */ |.define TMP1w, cx |.define TMP2w, dx |.define TMP3w, r8w |.define TMP4w, r9w |.define TMP5w, r10w |.define TMP6w, r11w /* and 8 bits for good measure */ |.define TMP1b, cl |.define TMP2b, dl |.define TMP3b, r8b |.define TMP4b, r9b |.define TMP5b, r10b |.define TMP6b, r11b /* return value */ |.define RV, rax |.define RVd, eax |.define RVF, xmm0 |.macro callp, funcptr | mov64 FUNCTION, (uintptr_t)funcptr | call FUNCTION |.endmacro |.macro check_wb, root, ref; | test word COLLECTABLE:root->flags, MVM_CF_SECOND_GEN; | setnz al; | cmp ref, 0x0; | setne ah; | test ah, al; | setnz al; | test word COLLECTABLE:ref->flags, MVM_CF_SECOND_GEN; | setz ah; | test ah, al; |.endmacro; |.macro hit_wb, obj | mov ARG1, TC; | mov ARG2, obj; | callp &MVM_gc_write_barrier_hit; |.endmacro |.macro get_spesh_slot, reg, idx; | mov reg, FRAME->effective_spesh_slots; | mov reg, OBJECTPTR:reg[idx]; |.endmacro |.macro get_vmnull, reg | mov reg, TC->instance; | mov reg, MVMINSTANCE:reg->VMNull; |.endmacro |.macro get_cur_op, reg | mov reg, TC->interp_cur_op | mov reg, [reg] |.endmacro |.macro get_string, reg, idx | mov reg, CU->body.strings; | mov reg, STRING:reg[idx]; |.endmacro |.macro is_type_object, reg | test word OBJECT:reg->header.flags, MVM_CF_TYPE_OBJECT |.endmacro |.macro gc_sync_point | cmp qword TC->gc_status, 0; | je >1; | mov ARG1, TC; | callp &MVM_gc_enter_from_interrupt; |1: |.endmacro |.macro throw_adhoc, msg | mov ARG1, TC; | mov64 ARG2, (uintptr_t)(msg); | callp &MVM_exception_throw_adhoc; |.endmacro /* A function prologue is always the same in x86 / x64, becuase * we do not provide variable arguments, instead arguments are provided * via a frame. All JIT entry points receive a prologue. */ void MVM_jit_emit_prologue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst) { /* Setup stack */ | push rbp; // nb, this aligns the stack to 16 bytes again | mov rbp, rsp; /* allocate stack space: 0x100 bytes = 256 bytes * * layout: [ a: 0x20 | b: 0x40 | c: 0xa0 | d: 0x20 ] * a: space for 4 callee-save registers * b: small scratch space * c: space for stack arguments to c calls * d: reserve space for GPR registers to c calls (win64) or more space for * stack arguments (posix) */ | sub rsp, 0x100; /* save callee-save registers */ | mov [rbp-0x8], TC; | mov [rbp-0x10], CU; | mov [rbp-0x18], FRAME; | mov [rbp-0x20], WORK; /* setup special frame variables */ | mov TC, ARG1; | mov CU, ARG2; | mov FRAME, TC->cur_frame; | mov WORK, FRAME->work; /* ARG3 contains our 'entry label' */ | jmp ARG3 } /* And a function epilogue is also always the same */ void MVM_jit_emit_epilogue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst) { | ->exit: | mov RV, 0; | ->out: /* restore callee-save registers */ | mov TC, [rbp-0x8]; | mov CU, [rbp-0x10]; | mov FRAME, [rbp-0x18]; | mov WORK, [rbp-0x20]; /* Restore stack */ | mov rsp, rbp; | pop rbp; | ret; } static MVMuint64 try_emit_gen2_ref(MVMThreadContext *tc, MVMJitGraph *jg, MVMObject *obj, MVMint16 reg, dasm_State **Dst) { if (!(obj->header.flags & MVM_CF_SECOND_GEN)) return 0; | mov64 TMP1, (uintptr_t)obj; | mov WORK[reg], TMP1; return 1; } static MVMint64 fits_in_32_bit(MVMint64 number) { /* Used to determine if a 64 bit integer can be safely used as a * 32 bit constant for immediate mode access */ return (number >= INT32_MIN) && (number <= INT32_MAX); } /* compile per instruction, can't really do any better yet */ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitPrimitive * prim, dasm_State **Dst) { MVMSpeshIns *ins = prim->ins; MVMuint16 op = ins->info->opcode; MVM_jit_log(tc, "emit opcode: <%s>\n", ins->info->name); /* Quite a few of these opcodes are copies. Ultimately, I want to * move copies to their own node (MVMJitCopy or such), and reduce * the number of copies (and thereby increase the efficiency), but * currently that isn't really feasible. */ switch (op) { case MVM_OP_const_i64_16: case MVM_OP_const_i64_32: { MVMint32 reg = ins->operands[0].reg.orig; /* Upgrade to 64 bit */ MVMint64 val = (op == MVM_OP_const_i64_16 ? (MVMint64)ins->operands[1].lit_i16 : (MVMint64)ins->operands[1].lit_i32); | mov qword WORK[reg], val; break; } case MVM_OP_const_i64: { MVMint32 reg = ins->operands[0].reg.orig; MVMint64 val = ins->operands[1].lit_i64; | mov64 TMP1, val; | mov WORK[reg], TMP1; break; } case MVM_OP_const_n64: { MVMint16 reg = ins->operands[0].reg.orig; MVMint64 valbytes = ins->operands[1].lit_i64; MVM_jit_log(tc, "store const %f\n", ins->operands[1].lit_n64); | mov64 TMP1, valbytes; | mov WORK[reg], TMP1; break; } case MVM_OP_inf: case MVM_OP_neginf: case MVM_OP_nan: { MVMint16 reg = ins->operands[0].reg.orig; MVMRegister tmp; if (op == MVM_OP_nan) tmp.n64 = MVM_num_nan(tc); else if (op == MVM_OP_inf) tmp.n64 = MVM_num_posinf(tc); else if (op == MVM_OP_neginf) tmp.n64 = MVM_num_neginf(tc); | mov64 TMP1, tmp.i64; | mov WORK[reg], TMP1; break; } case MVM_OP_const_s: { MVMint16 reg = ins->operands[0].reg.orig; MVMuint32 idx = ins->operands[1].lit_str_idx; MVMStaticFrame *sf = jg->sg->sf; MVMString * s = sf->body.cu->body.strings[idx]; if (!try_emit_gen2_ref(tc, jg, (MVMObject*)s, reg, Dst)) { | get_string TMP1, idx; | mov WORK[reg], TMP1; } break; } case MVM_OP_null: { MVMint16 reg = ins->operands[0].reg.orig; | get_vmnull TMP1; | mov WORK[reg], TMP1; break; } case MVM_OP_getwhat: case MVM_OP_getwho: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | mov TMP1, OBJECT:TMP1->st; if (op == MVM_OP_getwho) { | mov TMP1, STABLE:TMP1->WHO; | get_vmnull TMP2; | test TMP1, TMP1; | cmovz TMP1, TMP2; } else { | mov TMP1, STABLE:TMP1->WHAT; } | mov WORK[dst], TMP1; break; } case MVM_OP_getlex: { MVMuint16 *lexical_types; MVMStaticFrame * sf = jg->sg->sf; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 idx = ins->operands[1].lex.idx; MVMint16 out = ins->operands[1].lex.outers; MVMint16 i; | mov TMP6, FRAME; for (i = 0; i < out; i++) { /* I'm going to skip compiling the check whether the outer * node really exists, because if the code has run N times * correctly, then the outer frame must have existed then, * and since this chain is static, it should still exist * now. If it doesn't exist, that means we crash. * * NB: inlining /might/ make this all wrong! But, if that * happens, the interpreter will panic even without JIT */ | mov TMP6, FRAME:TMP6->outer; sf = sf->body.outer; } /* get array of lexicals */ | mov TMP5, FRAME:TMP6->env; /* read value */ | mov TMP5, REGISTER:TMP5[idx]; /* it seems that if at runtime, if the outer frame has been inlined, * this /could/ be wrong. But if that is so, the interpreted instruction * would also be wrong, because it'd refer to the wrong lexical. */ lexical_types = (!out && jg->sg->lexical_types ? jg->sg->lexical_types : sf->body.lexical_types); MVM_jit_log(tc, "Lexical type of register: %d\n", lexical_types[idx]); if (lexical_types[idx] == MVM_reg_obj) { MVM_jit_log(tc, "Emit lex vifivy check\n"); /* if it is zero, check if we need to auto-vivify */ | test TMP5, TMP5; | jnz >1; /* setup args */ | mov ARG1, TC; | mov ARG2, TMP6; | mov ARG3, idx; | callp &MVM_frame_vivify_lexical; /* use return value for the result */ | mov TMP5, RV; |1: } /* store the value */ | mov WORK[dst], TMP5; break; } case MVM_OP_getlex_no: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint32 idx = ins->operands[1].lit_str_idx; | mov ARG1, TC; | get_string ARG2, idx; | mov ARG3, MVM_reg_obj; | callp &MVM_frame_find_lexical_by_name; | test RV, RV; | jz >1; | mov RV, [RV]; |1: | mov WORK[dst], RV; break; } case MVM_OP_bindlex: { MVMint16 idx = ins->operands[0].lex.idx; MVMint16 out = ins->operands[0].lex.outers; MVMint16 src = ins->operands[1].reg.orig; MVMint16 i; | mov TMP1, FRAME; for (i = 0; i < out; i++) { | mov TMP1, FRAME:TMP1->outer; } | mov TMP1, FRAME:TMP1->env; | mov TMP2, WORK[src]; | mov REGISTER:TMP1[idx], TMP2; break; } case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: case MVM_OP_sp_getarg_i: { MVMint32 reg = ins->operands[0].reg.orig; MVMuint16 idx = ins->operands[1].callsite_idx; | mov TMP1, FRAME->params.args; | mov TMP1, REGISTER:TMP1[idx]; | mov WORK[reg], TMP1; break; } case MVM_OP_sp_p6oget_i: case MVM_OP_sp_p6oget_n: case MVM_OP_sp_p6oget_s: case MVM_OP_sp_p6oget_o: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_sp_p6ogetvt_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; MVMint16 body = offsetof(MVMP6opaque, body); /* load address and object */ | mov TMP1, WORK[obj]; | lea TMP2, [TMP1 + (offset + body)]; | mov TMP4, P6OPAQUE:TMP1->body.replaced; | lea TMP5, [TMP4 + offset]; | test TMP4, TMP4; | cmovnz TMP2, TMP5; /* TMP2 now contains address of item */ if (op == MVM_OP_sp_p6oget_o) { | mov TMP3, [TMP2]; | test TMP3, TMP3; /* Check if object doesn't point to NULL */ | jnz >3; /* Otherwise load VMNull */ | get_vmnull TMP3; |3: } else if (op == MVM_OP_sp_p6ogetvt_o) { /* vivify as type object */ MVMint16 spesh_idx = ins->operands[3].lit_i16; | mov TMP3, [TMP2]; /* check for null */ | test TMP3, TMP3; | jnz >4; /* if null, vivify as type object from spesh slot */ | get_spesh_slot TMP3, spesh_idx; /* need to hit write barrier? */ | check_wb TMP1, TMP3; | jz >3; | mov qword [rbp-0x28], TMP2; // address | mov qword [rbp-0x30], TMP3; // value | hit_wb WORK[obj]; // write barrier for header | mov TMP3, qword [rbp-0x30]; | mov TMP2, qword [rbp-0x28]; |3: /* store vivified type value in memory location */ | mov qword [TMP2], TMP3; |4: } else if (op == MVM_OP_sp_p6ogetvc_o) { MVMint16 spesh_idx = ins->operands[3].lit_i16; | mov TMP3, [TMP2]; | test TMP3, TMP3; | jnz >4; /* vivify as clone */ | mov ARG1, TC; | get_spesh_slot ARG2, spesh_idx; | callp &MVM_repr_clone; | mov TMP3, RV; /* reload object and address */ | mov TMP1, WORK[obj]; | lea TMP2, [TMP1 + (offset + body)]; | mov TMP4, P6OPAQUE:TMP1->body.replaced; | lea TMP5, [TMP4 + offset]; | test TMP4, TMP4; | cmovnz TMP2, TMP5; /* assign with write barrier */ | check_wb TMP1, TMP3; | jz >3; | mov qword [rbp-0x28], TMP2; // address | mov qword [rbp-0x30], TMP3; // value | hit_wb WORK[obj]; // write barrier for header | mov TMP3, qword [rbp-0x30]; | mov TMP2, qword [rbp-0x28]; |3: | mov qword [TMP2], TMP3; /* done */ |4: } else { /* the regular case */ | mov TMP3, [TMP2]; } /* store in local register */ | mov WORK[dst], TMP3; break; } case MVM_OP_sp_bind_i64: case MVM_OP_sp_bind_n: case MVM_OP_sp_bind_s: case MVM_OP_sp_bind_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 offset = ins->operands[1].lit_i16; MVMint16 val = ins->operands[2].reg.orig; | mov TMP1, WORK[obj]; // object | mov TMP2, WORK[val]; // value if (op == MVM_OP_sp_bind_o || op == MVM_OP_sp_bind_s) { /* check if we should hit write barrier */ | check_wb TMP1, TMP2; /* note: it is uneccesary to store pointers, because they can just be loaded from memory */ | jz >2; | hit_wb WORK[obj]; | mov TMP1, aword WORK[obj]; // reload object | mov TMP2, aword WORK[val]; // reload value |2: // done } | mov qword [TMP1+offset], TMP2; // store value into body break; } case MVM_OP_sp_get_i64: case MVM_OP_sp_get_n: case MVM_OP_sp_get_s: case MVM_OP_sp_get_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; | mov TMP1, WORK[obj]; // object | mov TMP2, qword [TMP1+offset]; // get value from body | mov WORK[dst], TMP2; break; } case MVM_OP_sp_p6obind_i: case MVM_OP_sp_p6obind_n: case MVM_OP_sp_p6obind_s: case MVM_OP_sp_p6obind_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 offset = ins->operands[1].lit_i16; MVMint16 val = ins->operands[2].reg.orig; | mov TMP1, WORK[obj]; // object | mov TMP2, WORK[val]; // value | lea TMP3, P6OPAQUE:TMP1->body; // body | cmp qword P6OBODY:TMP3->replaced, 0; | je >1; | mov TMP3, P6OBODY:TMP3->replaced; // replaced object body |1: if (op == MVM_OP_sp_p6obind_o || op == MVM_OP_sp_p6obind_s) { /* check if we should hit write barrier */ | check_wb TMP1, TMP2; | jz >2; | mov qword [rbp-0x28], TMP2; // store value | mov qword [rbp-0x30], TMP3; // store body pointer | hit_wb WORK[obj]; | mov TMP3, qword [rbp-0x30]; // restore body pointer | mov TMP2, qword [rbp-0x28]; // restore value |2: // done } | mov [TMP3+offset], TMP2; // store value into body break; } case MVM_OP_getwhere: case MVM_OP_set: { MVMint32 reg1 = ins->operands[0].reg.orig; MVMint32 reg2 = ins->operands[1].reg.orig; | mov TMP1, WORK[reg2]; | mov WORK[reg1], TMP1; break; } case MVM_OP_sp_getspeshslot: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 spesh_idx = ins->operands[1].lit_i16; | get_spesh_slot TMP1, spesh_idx; | mov WORK[dst], TMP1; break; } case MVM_OP_setdispatcher: { MVMint16 src = ins->operands[0].reg.orig; | mov TMP1, aword WORK[src]; | mov aword TC->cur_dispatcher, TMP1; break; } case MVM_OP_takedispatcher: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword TC->cur_dispatcher; | mov aword WORK[dst], TMP1; | mov aword TC->cur_dispatcher, NULL; break; } case MVM_OP_curcode: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword FRAME->code_ref; | mov aword WORK[dst], TMP1; break; } case MVM_OP_getcode: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 idx = ins->operands[1].coderef_idx; | mov TMP1, aword CU->body.coderefs; | mov TMP1, aword OBJECTPTR:TMP1[idx]; | mov aword WORK[dst], TMP1; break; } case MVM_OP_callercode: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword FRAME->caller; | test TMP1, TMP1; | jz >1; | mov TMP1, aword FRAME:TMP1->code_ref; |1: | mov aword WORK[dst], TMP1; break; } case MVM_OP_hllboxtype_n: case MVM_OP_hllboxtype_s: case MVM_OP_hllboxtype_i: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, CU->body.hll_config; if (op == MVM_OP_hllboxtype_n) { | mov TMP1, aword HLLCONFIG:TMP1->num_box_type; } else if (op == MVM_OP_hllboxtype_s) { | mov TMP1, aword HLLCONFIG:TMP1->str_box_type; } else { | mov TMP1, aword HLLCONFIG:TMP1->int_box_type; } | mov aword WORK[dst], TMP1; break; } case MVM_OP_null_s: { MVMint16 dst = ins->operands[0].reg.orig; | mov qword WORK[dst], 0; break; } case MVM_OP_isnull_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | test TMP1, TMP1; | setz TMP2b; | movzx TMP2, TMP2b; | mov qword WORK[dst], TMP2; break; } case MVM_OP_add_i: case MVM_OP_sub_i: case MVM_OP_bor_i: case MVM_OP_band_i: case MVM_OP_bxor_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; MVMSpeshFacts *operand_facts = MVM_spesh_get_facts(tc, jg->sg, ins->operands[2]); if (reg_a == reg_b) { if (operand_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && fits_in_32_bit(operand_facts->value.i)) { MVMint64 value = operand_facts->value.i; MVM_jit_log(tc, "accumulator for %s stayed in memory and " " constant value %"PRId64" used\n", ins->info->name, value); switch(ins->info->opcode) { case MVM_OP_add_i: | add qword WORK[reg_a], qword value; break; case MVM_OP_sub_i: | sub qword WORK[reg_a], qword value; break; case MVM_OP_bor_i: | or qword WORK[reg_a], qword value; break; case MVM_OP_band_i: | and qword WORK[reg_a], qword value; break; case MVM_OP_bxor_i: | xor qword WORK[reg_a], qword value; break; } } else { MVM_jit_log(tc, "accumulator for %s stayed in memory\n", ins->info->name); | mov rax, WORK[reg_c]; switch(ins->info->opcode) { case MVM_OP_add_i: | add WORK[reg_a], rax; break; case MVM_OP_sub_i: | sub WORK[reg_a], rax; break; case MVM_OP_bor_i: | or WORK[reg_a], rax; break; case MVM_OP_band_i: | and WORK[reg_a], rax; break; case MVM_OP_bxor_i: | xor WORK[reg_a], rax; break; } } } else { if (operand_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && fits_in_32_bit(operand_facts->value.i)) { MVMint64 value = operand_facts->value.i; MVM_jit_log(tc, "constant value %"PRId64" used for %s\n", value, ins->info->name); | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_i: | add rax, qword value; break; case MVM_OP_sub_i: | sub rax, qword value; break; case MVM_OP_bor_i: | or rax, qword value; break; case MVM_OP_band_i: | and rax, qword value; break; case MVM_OP_bxor_i: | xor rax, qword value; break; } | mov WORK[reg_a], rax; } else { | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_i: | add rax, WORK[reg_c]; break; case MVM_OP_sub_i: | sub rax, WORK[reg_c]; break; case MVM_OP_bor_i: | or rax, WORK[reg_c]; break; case MVM_OP_band_i: | and rax, WORK[reg_c]; break; case MVM_OP_bxor_i: | xor rax, WORK[reg_c]; break; } | mov WORK[reg_a], rax; } } break; } case MVM_OP_mul_i: case MVM_OP_blshift_i: case MVM_OP_brshift_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_mul_i: | imul rax, WORK[reg_c]; break; case MVM_OP_blshift_i: | mov cl, byte WORK[reg_c]; | shl rax, cl; break; case MVM_OP_brshift_i: | mov cl, byte WORK[reg_c]; | shr rax, cl; break; } | mov WORK[reg_a], rax; break; } case MVM_OP_div_i: case MVM_OP_mod_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; | mov rcx, WORK[b]; | test rcx, rcx; | jnz >1; | throw_adhoc "Division by zero"; |1: // division is safe, proceed | mov rax, WORK[a]; | cqo; // convert quadword to octoword. look it up :-) | idiv rcx; // rcx was the denominator if (op == MVM_OP_div_i) { | mov TMP3, rax; | sub TMP3, 1; | cmp rax, 0; // quotient < 0 | setl ch; | test rdx, rdx; // remainder != 0 | setnz cl; | test ch, cl; | cmovnz rax, TMP3; | mov WORK[dst], rax; } else { | mov WORK[dst], rdx; } break; } case MVM_OP_inc_i: { MVMint32 reg = ins->operands[0].reg.orig; | add qword WORK[reg], 1; break; } case MVM_OP_dec_i: { MVMint32 reg = ins->operands[0].reg.orig; | sub qword WORK[reg], 1; break; } case MVM_OP_bnot_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | not TMP1; | mov WORK[dst], TMP1; break; } case MVM_OP_neg_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | neg TMP1; | mov WORK[dst], TMP1; break; } case MVM_OP_add_n: case MVM_OP_sub_n: case MVM_OP_mul_n: case MVM_OP_div_n: { MVMint16 reg_a = ins->operands[0].reg.orig; MVMint16 reg_b = ins->operands[1].reg.orig; MVMint16 reg_c = ins->operands[2].reg.orig; /* Copying data to xmm (floating point) registers requires * a special move instruction */ | movsd xmm0, qword WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_n: | addsd xmm0, qword WORK[reg_c]; break; case MVM_OP_sub_n: | subsd xmm0, qword WORK[reg_c]; break; case MVM_OP_mul_n: | mulsd xmm0, qword WORK[reg_c]; break; case MVM_OP_div_n: | divsd xmm0, qword WORK[reg_c]; break; } | movsd qword WORK[reg_a], xmm0; break; } case MVM_OP_coerce_in: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; /* convert simple integer to double precision */ | cvtsi2sd xmm0, qword WORK[src]; | movsd qword WORK[dst], xmm0; break; } case MVM_OP_coerce_ni: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; /* convert double precision to simple intege */ | cvttsd2si rax, qword WORK[src]; | mov WORK[dst], rax; break; } case MVM_OP_neg_n: { /* Negation is xor-ing the highest byte. Pretty simple right */ MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, 1; | sal TMP1, 63; | mov TMP2, qword WORK[src]; | xor TMP2, TMP1; | mov qword WORK[dst], TMP2; break; } case MVM_OP_eq_i: case MVM_OP_eqaddr: case MVM_OP_ne_i: case MVM_OP_lt_i: case MVM_OP_le_i: case MVM_OP_gt_i: case MVM_OP_ge_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov rax, WORK[reg_b]; /* comparison result in the setting bits in the rflags register */ | cmp rax, WORK[reg_c]; /* copy the right comparison bit to the lower byte of the rax register */ switch(ins->info->opcode) { case MVM_OP_eqaddr: case MVM_OP_eq_i: | sete al; break; case MVM_OP_ne_i: | setne al; break; case MVM_OP_lt_i: | setl al; break; case MVM_OP_le_i: | setle al; break; case MVM_OP_gt_i: | setg al; break; case MVM_OP_ge_i: | setge al; break; } /* zero extend al (lower byte) to rax (whole register) */ | movzx rax, al; | mov WORK[reg_a], rax; break; } case MVM_OP_cmp_i : { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov TMP1, WORK[reg_b]; /* comparison result in the setting bits in the rflags register */ | cmp TMP1, WORK[reg_c]; /* copy the right comparison bit to the lower byte of the rax register */ | setg TMP2b; | movzx TMP2, TMP2b; | setl TMP3b; | movzx TMP3, TMP3b; | sub TMP2, TMP3; | mov WORK[reg_a], TMP2; break; } case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: { /* src/jit/graph.c already put a call to the MVM_string_compare function into the graph, so here we just have to deal with the returned integers. */ MVMint32 reg = ins->operands[0].reg.orig; switch(ins->info->opcode) { case MVM_OP_gt_s: | mov TMP2, 1; break; case MVM_OP_lt_s: | mov TMP2, -1; break; case MVM_OP_ge_s: case MVM_OP_le_s: | mov TMP2, 0; break; } | cmp TMP2, WORK[reg]; /* Mind the reversedness of the constant and the value as compared to * interp.c */ switch(ins->info->opcode) { case MVM_OP_gt_s: | sete al; break; case MVM_OP_ge_s: | setl al; break; case MVM_OP_lt_s: | sete al; break; case MVM_OP_le_s: | setg al; break; } | movzx rax, al; | mov WORK[reg], rax; break; } case MVM_OP_not_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | test TMP1, TMP1; | setz TMP2b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_eq_n: case MVM_OP_ne_n: case MVM_OP_le_n: case MVM_OP_lt_n: case MVM_OP_ge_n: case MVM_OP_gt_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; if (op == MVM_OP_eq_n) { | mov TMP1, 0; } else if (op == MVM_OP_ne_n) { | mov TMP1, 1; } if (op == MVM_OP_lt_n || op == MVM_OP_le_n) { | movsd xmm0, qword WORK[b]; | ucomisd xmm0, qword WORK[a]; } else { | movsd xmm0, qword WORK[a]; | ucomisd xmm0, qword WORK[b]; } if (op == MVM_OP_le_n || op == MVM_OP_ge_n) { | setae TMP1b; } else if (op == MVM_OP_eq_n) { | setnp TMP2b; // zero if either is NaN, 1 otherwise | cmove TMP1, TMP2; // if equal, overwrite 0 with 1 } else if (op == MVM_OP_ne_n) { | setp TMP2b; // 1 if either is NaN (in which case they can't be equal) | cmove TMP1, TMP2; // if equal, overwrite 1 with IsNan(a) | IsNaN(b) } else { | seta TMP1b; } | movzx TMP1, TMP1b; | mov WORK[dst], TMP1; break; } case MVM_OP_cmp_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; | movsd xmm0, qword WORK[a]; | movsd xmm1, qword WORK[b]; | ucomisd xmm0, xmm1 | seta TMP1b; | movzx rax, TMP1b; | ucomisd xmm1, xmm0 | seta TMP1b; | movzx TMP1, TMP1b; | sub rax, TMP1; | mov WORK[dst], rax; break; } case MVM_OP_eq_I: case MVM_OP_ne_I: case MVM_OP_lt_I: case MVM_OP_le_I: case MVM_OP_gt_I: case MVM_OP_ge_I: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; /* Call the bigint comparison function. */ | mov ARG1, tc; | mov ARG2, WORK[reg_b]; | mov ARG3, WORK[reg_c]; | callp &MVM_bigint_cmp; /* Handle result by opcode. */ switch(ins->info->opcode) { case MVM_OP_eq_I: | cmp RV, MP_EQ | sete al; break; case MVM_OP_ne_I: | cmp RV, MP_EQ | setne al; break; case MVM_OP_lt_I: | cmp RV, MP_LT | sete al; break; case MVM_OP_le_I: | cmp RV, MP_GT | setne al; break; case MVM_OP_gt_I: | cmp RV, MP_GT | sete al; break; case MVM_OP_ge_I: | cmp RV, MP_LT | setne al; break; } /* zero extend al (lower byte) to rax (whole register) */ | movzx rax, al; | mov WORK[reg_a], rax; break; } case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: case MVM_OP_islist: case MVM_OP_ishash: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 reprid = op == MVM_OP_isint ? MVM_REPR_ID_P6int : op == MVM_OP_isnum ? MVM_REPR_ID_P6num : op == MVM_OP_isstr ? MVM_REPR_ID_P6str : op == MVM_OP_islist ? MVM_REPR_ID_MVMArray : /* op == MVM_OP_ishash */ MVM_REPR_ID_MVMHash; | mov TMP1, aword WORK[obj]; | test TMP1, TMP1; | jz >1; | mov TMP1, OBJECT:TMP1->st; | mov TMP1, STABLE:TMP1->REPR; | cmp qword REPR:TMP1->ID, reprid; | jne >1; | mov qword WORK[dst], 1; | jmp >2; |1: | mov qword WORK[dst], 0; |2: break; } case MVM_OP_sp_boolify_iter_arr: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2, MVMITER:TMP1->body.array_state.index; | add TMP2, 1; | mov TMP3, MVMITER:TMP1->body.array_state.limit; /* index - limit will give a carry flag when index < limit */ | cmp TMP2, TMP3; | setl TMP1b; | movzx TMP1, TMP1b; | mov aword WORK[dst], TMP1; break; } case MVM_OP_sp_boolify_iter_hash: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2, MVMITER:TMP1->body.hash_state.next; | test TMP2, TMP2; | setnz TMP2b; | movzx TMP2, TMP2b; | mov aword WORK[dst], TMP2; break; } case MVM_OP_objprimspec: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 type = ins->operands[1].reg.orig; | mov TMP6, aword WORK[type]; | test TMP6, TMP6; | jz >1; | mov TMP6, OBJECT:TMP6->st; | mov FUNCTION, STABLE:TMP6->REPR; | mov FUNCTION, REPR:FUNCTION->get_storage_spec; | mov ARG1, TC; | mov ARG2, TMP6; | call FUNCTION; | mov TMP6w, word STORAGESPEC:RV->boxed_primitive; | movzx TMP6, TMP6w; |1: | mov aword WORK[dst], TMP6; break; } case MVM_OP_isnonnull: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | setnz TMP2b; | get_vmnull TMP3; | cmp TMP1, TMP3; | setne TMP3b; | and TMP2b, TMP3b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_isnull: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | setz TMP2b; | get_vmnull TMP3; | cmp TMP1, TMP3; | sete TMP3b; | or TMP2b, TMP3b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_sp_fastcreate: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 size = ins->operands[1].lit_i16; MVMint16 spesh_idx = ins->operands[2].lit_i16; | mov ARG1, TC; | mov ARG2, size; | callp &MVM_gc_allocate_zeroed; | get_spesh_slot TMP1, spesh_idx; | mov aword OBJECT:RV->st, TMP1; // st is 64 bit (pointer) | mov word OBJECT:RV->header.size, size; // object size is 16 bit | mov TMP1d, dword TC->thread_id; // thread id is 32 bit | mov dword OBJECT:RV->header.owner, TMP1d; // does this even work? | mov aword WORK[dst], RV; // store in local register break; } case MVM_OP_decont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP5, WORK[src]; | test TMP5, TMP5; // obj is null | jz >1; | is_type_object TMP5; // object is type object (not concrete) | jnz >1; | mov TMP6, OBJECT:TMP5->st; | mov TMP6, STABLE:TMP6->container_spec; | test TMP6, TMP6; // container spec is zero | jz >1; | mov ARG1, TC; | mov ARG2, TMP5; // object | lea ARG3, WORK[dst]; // destination register | mov FUNCTION, CONTAINERSPEC:TMP6->fetch; // get function pointer | call FUNCTION; | jmp >2; |1: // otherwise just move the object into the register | mov WORK[dst], TMP5; |2: break; } case MVM_OP_iscont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | test TMP1, TMP1; | jz >1; | mov TMP1, OBJECT:TMP1->st; | mov TMP1, STABLE:TMP1->container_spec; | test TMP1, TMP1; |1: | setnz TMP1b; | movzx TMP1, TMP1b; | mov qword WORK[dst], TMP1; break; } case MVM_OP_sp_namedarg_used: { MVMuint16 param = ins->operands[0].lit_i16; | mov TMP1, FRAME->params.named_used; | mov byte U8:TMP1[param], 1; break; } case MVM_OP_sp_findmeth: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 str_idx = ins->operands[2].lit_str_idx; MVMuint16 ss_idx = ins->operands[3].lit_i16; | get_spesh_slot TMP1, ss_idx; | mov TMP2, WORK[obj]; | mov TMP2, OBJECT:TMP2->st; | cmp TMP1, TMP2; | jne >1; | get_spesh_slot TMP3, ss_idx + 1; | mov WORK[dst], TMP3; | jmp >2; |1: | mov ARG1, TC; | mov ARG2, WORK[obj]; | get_string ARG3, str_idx; | mov ARG4, ss_idx; | lea TMP6, WORK[dst]; |.if WIN32; | mov qword [rsp+0x20], TMP6; |.else; | mov ARG5, TMP6; |.endif | callp &MVM_6model_find_method_spesh; | test RV, RV; | jz >2; /* invokish, fall out to the interpreter */ | mov RV, 1; | lea TMP1, [>2]; | mov aword FRAME->jit_entry_label, TMP1; | jmp ->out; |2: break; } case MVM_OP_isconcrete: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov qword WORK[dst], 1; | jmp >2; |1: | mov qword WORK[dst], 0; |2: break; } case MVM_OP_takehandlerresult: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword TC->last_handler_result; | mov aword WORK[dst], TMP1; | mov aword TC->last_handler_result, 0; break; } case MVM_OP_lexoticresult: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword WORK[src]; | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov TMP2, aword OBJECT:TMP1->st; | mov TMP2, aword STABLE:TMP2->REPR; | cmp aword REPR:TMP2->ID, MVM_REPR_ID_Lexotic; | jnz >1; | mov TMP2, aword LEXOTIC:TMP1->body.result; | mov WORK[dst], TMP2; | jmp >2; |1: /* throw an exception */ | throw_adhoc "lexoticresult needs a Lexotic"; /* we never return from an adhoc exception, so no need to deal with that */ |2: break; } case MVM_OP_exception: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, TC->active_handlers; | test TMP1, TMP1; | jz >1; | mov TMP1, [TMP1]; | mov TMP1, MVMACTIVEHANDLERS:TMP1->ex_obj; | mov WORK[dst], TMP1; | jmp >2; |1: | get_vmnull TMP1; | mov WORK[dst], TMP1; |2: break; } case MVM_OP_scwbdisable: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1d, dword TC->sc_wb_disable_depth; | add TMP1d, 1; | mov dword TC->sc_wb_disable_depth, TMP1d; | mov qword WORK[dst], TMP1; break; } case MVM_OP_scwbenable: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1d, dword TC->sc_wb_disable_depth; // should do zero-extension | sub TMP1d, 1; | mov dword TC->sc_wb_disable_depth, TMP1d; | mov qword WORK[dst], TMP1; break; } case MVM_OP_assign: case MVM_OP_assignunchecked: { MVMint16 cont = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov ARG2, aword WORK[cont]; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->container_spec; | test FUNCTION, FUNCTION; | jnz >1; | throw_adhoc "Cannot assign to an immutable value"; |1: | mov ARG1, TC; | mov ARG3, aword WORK[obj]; if (op == MVM_OP_assign) { | mov FUNCTION, CONTAINERSPEC:FUNCTION->store; } else { | mov FUNCTION, CONTAINERSPEC:FUNCTION->store_unchecked; } | call FUNCTION; break; } case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[name]; | mov ARG3, MVM_reg_obj; | callp &MVM_frame_find_lexical_by_name; | test RV, RV; | jz >1; | mov RV, [RV]; |1: | mov WORK[dst], RV; break; } case MVM_OP_paramnamesused: | lea ARG2, FRAME->params; | mov TMP5w, word ARGCTX:ARG2->num_pos; | cmp TMP5w, word ARGCTX:ARG2->arg_count; | je >1; | mov ARG1, TC; | callp &MVM_args_assert_nameds_used; |1: break; case MVM_OP_assertparamcheck: { MVMint16 ok = ins->operands[0].reg.orig; | mov TMP1, qword WORK[ok]; | test TMP1, TMP1; | jnz >1; | mov ARG1, TC; | callp &MVM_args_bind_failed; |1: break; } case MVM_OP_prof_enterspesh: | mov ARG1, TC; | mov ARG2, aword FRAME->static_info; | mov ARG3, aword MVM_PROFILE_ENTER_JIT; | callp &MVM_profile_log_enter; break; case MVM_OP_prof_enterinline: { MVMint16 spesh_idx = ins->operands[0].lit_i16; | mov ARG1, TC; | get_spesh_slot ARG2, spesh_idx; | mov ARG3, aword MVM_PROFILE_ENTER_JIT_INLINE; | callp &MVM_profile_log_enter; break; } case MVM_OP_getobjsc: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2d, dword COLLECTABLE:TMP1->sc_forward_u.sc.sc_idx; | xor TMP3, TMP3; | cmp TMP2d, 0; | jle >1; | mov TMP3, aword TC->instance; | mov TMP3, aword MVMINSTANCE:TMP3->all_scs; | mov TMP3, aword [TMP3 + TMP2d * 8]; | mov TMP3, SCREFBODY:TMP3->sc; |1: | mov aword WORK[dst], TMP3; break; } case MVM_OP_invokewithcapture: { MVMint16 dest = ins->operands[0].reg.orig; MVMint16 code = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; | mov TMP1, aword WORK[capture]; /* if (IS_CONCRETE(capture) && REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) */ | is_type_object TMP1; | jnz >1; | mov TMP2, OBJECT:TMP1->st; | mov TMP2, STABLE:TMP2->REPR; | cmp dword REPR:TMP2->ID, MVM_REPR_ID_MVMCallCapture; | je >2; |1: /* else throw */ | throw_adhoc "invokewithcapture needs a MVMCallCapture"; |2: /* code = MVM_frame_find_invokee(tc, code, NULL) */ | mov ARG1, TC; | mov ARG2, WORK[code]; | xor ARG3, ARG3; | callp &MVM_frame_find_invokee; | mov ARG2, RV; // ARG2 = code /* tc->cur_frame->return_value = &GET_REG(cur_op, 2) */ | lea ARG1, WORK[dest]; // ARG1 is used as scratch space | mov aword FRAME->return_value, ARG1; /* tc->cur_frame->return_type = MVM_RETURN_OBJ */ | mov dword FRAME->return_type, MVM_RETURN_OBJ; /* tc->cur_frame->return_address = cur_op */ | get_cur_op ARG1; | mov aword FRAME->return_address, ARG1; /* STABLE(code)->invoke(tc, code, capture->body.effective_callsite, capture->body.apc->arg) */ | mov ARG1, TC; | mov ARG3, WORK[capture]; | mov ARG4, aword CAPTURE:ARG3->body.apc; | mov ARG4, aword ARGCTX:ARG4->args; | mov ARG3, aword CAPTURE:ARG3->body.effective_callsite; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->invoke; | call FUNCTION; /* jumping out is handled by invokish */ break; } case MVM_OP_ordat: case MVM_OP_ordfirst: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 str = ins->operands[1].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[str]; if (op == MVM_OP_ordat) { MVMint16 idx = ins->operands[2].reg.orig; | mov ARG3, qword WORK[idx]; } else { | mov ARG3, 0; } | callp &MVM_string_get_grapheme_at; | cmp RV, 0; | jge >1; /* NB - I see no reason why this should be incorrect, but I haven't been able to trigger it yet. */ | mov ARG1, TC; | mov ARG2, RV; | callp &MVM_nfg_get_synthetic_info; /* base is only 32 bit wide */ | mov RVd, dword NFGSYNTH:RV->base; |1: | mov qword WORK[dst], RV; break; } default: MVM_panic(1, "Can't JIT opcode <%s>", ins->info->name); } } /* Call argument decoder */ static void load_call_arg(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallArg arg, dasm_State **Dst) { switch(arg.type) { case MVM_JIT_INTERP_VAR: switch (arg.v.ivar) { case MVM_JIT_INTERP_TC: | mov TMP6, TC; break; case MVM_JIT_INTERP_CU: | mov TMP6, CU; break; case MVM_JIT_INTERP_FRAME: | mov TMP6, FRAME; break; case MVM_JIT_INTERP_PARAMS: | lea TMP6, FRAME->params; break; case MVM_JIT_INTERP_CALLER: | mov TMP6, aword FRAME->caller; break; } break; case MVM_JIT_REG_VAL: | mov TMP6, qword WORK[arg.v.reg]; break; case MVM_JIT_REG_VAL_F: | mov TMP6, qword WORK[arg.v.reg]; break; case MVM_JIT_REG_ADDR: | lea TMP6, WORK[arg.v.reg]; break; case MVM_JIT_STR_IDX: | get_string TMP6, arg.v.lit_i64; break; case MVM_JIT_LITERAL: | mov TMP6, arg.v.lit_i64; break; case MVM_JIT_LITERAL_64: case MVM_JIT_LITERAL_PTR: case MVM_JIT_LITERAL_F: | mov64 TMP6, arg.v.lit_i64; break; case MVM_JIT_REG_STABLE: | mov TMP6, qword WORK[arg.v.reg]; | mov TMP6, OBJECT:TMP6->st; break; case MVM_JIT_REG_OBJBODY: | mov TMP6, qword WORK[arg.v.reg]; | lea TMP6, STOOGE:TMP6->data; break; } } static void emit_gpr_arg(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 i, dasm_State **Dst) { switch (i) { case 0: | mov ARG1, TMP6; break; case 1: | mov ARG2, TMP6; break; case 2: | mov ARG3, TMP6; break; case 3: | mov ARG4, TMP6; break; |.if POSIX || case 4: | mov ARG5, TMP6; || break; || case 5: | mov ARG6, TMP6; || break; |.endif default: MVM_oops(tc, "JIT: can't store %d arguments in GPR", i); } } static void emit_sse_arg(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 i, dasm_State **Dst) { switch (i) { case 0: | movd ARG1F, TMP6; break; case 1: | movd ARG2F, TMP6; break; case 2: | movd ARG3F, TMP6; break; case 3: | movd ARG4F, TMP6; break; |.if POSIX || case 4: | movd ARG5F, TMP6; || break; || case 5: | movd ARG6F, TMP6; || break; || case 6: | movd ARG7F, TMP6; || break; || case 7: | movd ARG8F, TMP6; || break; |.endif default: MVM_oops(tc, "JIT: can't put %d arguments in SSE", i); } } static void emit_stack_arg(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 arg_size, MVMint32 pos, dasm_State **Dst) { /* basically, stack arguments are passed in right-to-left order on both POSIX and W64 backends, it seems. Thus the most logical thing to do is to count from the stack top upwards. */ if (pos + arg_size > 160) { MVM_oops(tc, "JIT: trying to pass arguments " " in local space (stack top offset:" " %d, size: %d)", pos, arg_size); } switch(arg_size) { case 1: | mov byte [rsp+pos], TMP6b; break; case 2: | mov word [rsp+pos], TMP6w; break; case 4: | mov dword [rsp+pos], TMP6d; break; case 8: | mov qword [rsp+pos], TMP6; break; default: MVM_oops(tc, "JIT: can't pass arguments size %d bytes", arg_size); } } static void emit_posix_callargs(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallArg args[], MVMint32 num_args, dasm_State **Dst) { MVMint32 num_gpr = 0, num_fpr = 0, num_stack = 0, i; MVMJitCallArg in_gpr[6], in_fpr[8], *on_stack = NULL; if (num_args > 6) on_stack = MVM_malloc(sizeof(MVMJitCallArg) * (num_args - 6)); /* divide in gpr, fpr, stack values */ for (i = 0; i < num_args; i++) { switch (args[i].type) { case MVM_JIT_INTERP_VAR: case MVM_JIT_REG_VAL: case MVM_JIT_REG_ADDR: case MVM_JIT_REG_OBJBODY: case MVM_JIT_REG_STABLE: case MVM_JIT_STR_IDX: case MVM_JIT_LITERAL: case MVM_JIT_LITERAL_64: case MVM_JIT_LITERAL_PTR: if (num_gpr < 6) { in_gpr[num_gpr++] = args[i]; } else { on_stack[num_stack++] = args[i]; } break; case MVM_JIT_REG_VAL_F: case MVM_JIT_LITERAL_F: if (num_fpr < 8) { in_fpr[num_fpr++] = args[i]; } else { on_stack[num_stack++] = args[i]; } break; } } for (i = 0; i < num_gpr; i++) { load_call_arg(tc, jg, in_gpr[i], Dst); emit_gpr_arg(tc, jg, i, Dst); } for (i = 0; i < num_fpr; i++) { load_call_arg(tc, jg, in_fpr[i], Dst); emit_sse_arg(tc, jg, i, Dst); } /* push right-to-left */ for (i = 0; i < num_stack; i++) { load_call_arg(tc, jg, on_stack[i], Dst); // I'm not sure this is correct, btw emit_stack_arg(tc, jg, 8, i*8, Dst); } if (on_stack) MVM_free(on_stack); } static void emit_win64_callargs(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallArg args[], MVMint32 num_args, dasm_State **Dst) { MVMint32 i; MVMint32 num_reg_args = (num_args > 4 ? 4 : num_args); for (i = 0; i < num_reg_args; i++) { load_call_arg(tc, jg, args[i], Dst); if (args[i].type == MVM_JIT_REG_VAL_F || args[i].type == MVM_JIT_LITERAL_F) { emit_sse_arg(tc, jg, i, Dst); } else { emit_gpr_arg(tc, jg, i, Dst); } } for (; i < num_args; i++) { load_call_arg(tc, jg, args[i], Dst); emit_stack_arg(tc, jg, 8, i * 8, Dst); } } void MVM_jit_emit_call_c(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallC * call_spec, dasm_State **Dst) { MVM_jit_log(tc, "emit c call <%d args>\n", call_spec->num_args); if (call_spec->has_vargs) { MVM_oops(tc, "JIT can't handle varargs yet"); } |.if WIN32; || emit_win64_callargs(tc, jg, call_spec->args, call_spec->num_args, Dst); |.else; || emit_posix_callargs(tc, jg, call_spec->args, call_spec->num_args, Dst); |.endif /* Emit the call. I think we should be able to do something smarter than * store the constant into the bytecode, like a data segment. But I'm * not sure. */ | callp call_spec->func_ptr; /* right, now determine what to do with the return value */ switch(call_spec->rv_mode) { case MVM_JIT_RV_VOID: break; case MVM_JIT_RV_INT: case MVM_JIT_RV_PTR: | mov WORK[call_spec->rv_idx], RV; break; case MVM_JIT_RV_NUM: | movsd qword WORK[call_spec->rv_idx], RVF; break; case MVM_JIT_RV_DEREF: | mov TMP1, [RV]; | mov WORK[call_spec->rv_idx], TMP1; break; case MVM_JIT_RV_ADDR: /* store local at address */ | mov TMP1, WORK[call_spec->rv_idx]; | mov [RV], TMP1; break; } } void MVM_jit_emit_branch(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitBranch * branch, dasm_State **Dst) { MVMSpeshIns *ins = branch->ins; MVMint32 name = branch->dest; /* move gc sync point to the front so as to not have * awkward dispatching issues */ | gc_sync_point; if (ins == NULL || ins->info->opcode == MVM_OP_goto) { MVM_jit_log(tc, "emit jump to label %d\n", name); if (name == MVM_JIT_BRANCH_EXIT) { | jmp ->exit } else { | jmp =>(name) } } else { MVMint16 val = ins->operands[0].reg.orig; MVM_jit_log(tc, "emit branch <%s> to label %d\n", ins->info->name, name); switch(ins->info->opcode) { case MVM_OP_if_i: | mov rax, WORK[val]; | test rax, rax; | jnz =>(name); // jump to dynamic label break; case MVM_OP_unless_i: | mov rax, WORK[val]; | test rax, rax; | jz =>(name); break; case MVM_OP_if_n: | movd xmm0, qword WORK[val]; | xorpd xmm1, xmm1; // make it zero | ucomisd xmm0, xmm1; | jp =>(name); // is NaN? | jne =>(name); // not equal to zero? we're golden break; case MVM_OP_unless_n: | movd xmm0, qword WORK[val]; | xorpd xmm1, xmm1; // make it zero | ucomisd xmm0, xmm1; | jp >1; // is NaN | jne >1; // is not zero | jmp =>(name); // it is zero yay! |1: break; case MVM_OP_if_s0: case MVM_OP_unless_s0: | mov ARG1, TC; | mov ARG2, WORK[val]; | callp &MVM_coerce_istrue_s; | test RV, RV; if (ins->info->opcode == MVM_OP_unless_s0) | jz =>(name); else | jnz =>(name); break; case MVM_OP_ifnonnull: | mov TMP1, WORK[val]; | test TMP1, TMP1; | jz >1; | get_vmnull TMP2; | cmp TMP1, TMP2; | je >1; | jmp =>(name); |1: break; case MVM_OP_indexat: case MVM_OP_indexnat: { MVMint16 offset = ins->operands[1].reg.orig; MVMuint32 str_idx = ins->operands[2].lit_str_idx; | mov ARG1, TC; | mov ARG2, WORK[val]; | mov ARG3, WORK[offset]; | get_string ARG4, str_idx; | callp &MVM_string_char_at_in_string; /* This subtlety is due to the value being overloaded to * -2 if it is out of bounds. Note that -1 is passed as a * 32 bit integer, but this magically works in a 64 bit * comparison because 32 bit values are sign-extended */ | cmp RV, -1; if (ins->info->opcode == MVM_OP_indexat) | jle =>(name); else { | jne =>(name); } break; } default: MVM_panic(1, "JIT: Can't handle conditional <%s>", ins->info->name); } } } void MVM_jit_emit_label(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitLabel *label, dasm_State **Dst) { | =>(label->name): } void MVM_jit_emit_guard(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitGuard *guard, dasm_State **Dst) { MVMint16 op = guard->ins->info->opcode; MVMint16 obj = guard->ins->operands[0].reg.orig; MVMint16 spesh_idx = guard->ins->operands[1].lit_i16; MVM_jit_log(tc, "emit guard <%s>\n", guard->ins->info->name); /* load object and spesh slot value */ | mov TMP1, WORK[obj]; | get_spesh_slot TMP2, spesh_idx; if (op == MVM_OP_sp_guardtype) { /* object in queston should be a type object, so it shouldn't * be zero, should not be concrete, and the STABLE should be * equal to the value in the spesh slot */ /* check for null */ | test TMP1, TMP1; | jz >1; /* check if type object (not concrete) */ | is_type_object TMP1; /* if zero, this is a concrete object, and we should deopt */ | jz >1; /* get stable and compare */ | cmp TMP2, OBJECT:TMP1->st; | jne >1; /* we're good, no need to deopt */ } else if (op == MVM_OP_sp_guardconc) { /* object should be a non-null concrete (non-type) object */ | test TMP1, TMP1; | jz >1; /* shouldn't be type object */ | is_type_object TMP1; | jnz >1; /* should have our stable */ | cmp TMP2, OBJECT:TMP1->st; | jne >1; } else if (op == MVM_OP_sp_guardcontconc) { MVMint16 val_spesh_idx = guard->ins->operands[2].lit_i16; | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov FUNCTION, OBJECT:TMP1->st; | cmp TMP2, FUNCTION; | jne >1; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->fetch; | mov ARG2, TMP1; | mov ARG1, TC; | lea ARG3, [rbp-0x28]; // hurray for scratch space | call FUNCTION; | mov TMP3, aword [rbp-0x28]; | test TMP3, TMP3; | jz >1; | is_type_object TMP3; | jnz >1; | mov TMP2, OBJECT:TMP3->st; | get_spesh_slot TMP1, val_spesh_idx; | cmp TMP1, TMP2; | jne >1; } else if (op == MVM_OP_sp_guardconttype) { MVMint16 val_spesh_idx = guard->ins->operands[2].lit_i16; | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov FUNCTION, OBJECT:TMP1->st; | cmp TMP2, FUNCTION; | jne >1; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->fetch; | mov ARG2, TMP1; | mov ARG1, TC; | lea ARG3, [rbp-0x28]; // hurray for scratch space | call FUNCTION; | mov TMP3, aword [rbp-0x28]; | test TMP3, TMP3; | jz >1; | is_type_object TMP3; // all of this is the same as for guardcontconc, but this time // we want to have a type object instead of a concrete object. | jz >1; | mov TMP2, OBJECT:TMP3->st; | get_spesh_slot TMP1, val_spesh_idx; | cmp TMP1, TMP2; | jne >1; } else if (op == MVM_OP_sp_guardrwconc) { MVMint16 val_spesh_idx = guard->ins->operands[2].lit_i16; /* if (check && IS_CONCRETE(check) */ | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; /* && STABLE(check) == (want_c = cur_frame->effective_spesh_slots[GET_UI16(cur_op,2)] */ | mov FUNCTION, OBJECT:TMP1->st; | cmp TMP2, FUNCTION; | jne >1; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->can_store; | mov ARG2, TMP1; | mov ARG1, TC; | call FUNCTION; /* if (constspec->can_store(tc, check) */ | test RV, RV; | jz >1; /* restore TMP1 */ | mov TMP1, WORK[obj]; | mov FUNCTION, OBJECT:TMP1->st; // restore FUNCTION to the st as before | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->fetch; /* constpec->fetch(tc, check, &r) */ | mov ARG2, TMP1; | mov ARG1, TC; | lea ARG3, [rbp-0x28]; // hurray for scratch space | call FUNCTION; /* if (r.o && IS_CONCRETE(r.o) && STABLE(r.o) == want_v) */ | mov TMP3, aword [rbp-0x28]; | test TMP3, TMP3; | jz >1; | is_type_object TMP3; | jnz >1; | mov TMP2, OBJECT:TMP3->st; | get_spesh_slot TMP1, val_spesh_idx; | cmp TMP1, TMP2; | jne >1; } else if (op == MVM_OP_sp_guardrwtype) { MVMint16 val_spesh_idx = guard->ins->operands[2].lit_i16; /* if (check && IS_CONCRETE(check) && STABLE(check) == want_c) */ | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov FUNCTION, OBJECT:TMP1->st; | cmp TMP2, FUNCTION; | jne >1; /* if (constpect->can_store(tc, check)) */ | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->can_store; | mov ARG2, TMP1; | mov ARG1, TC; | call FUNCTION; | test RV, RV; | jz >1; | mov TMP1, WORK[obj]; | mov FUNCTION, OBJECT:TMP1->st; // restore FUNCTION to the st as before | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->fetch; | mov ARG2, TMP1; | mov ARG1, TC; | lea ARG3, [rbp-0x28]; /* contspec->fetch(tc, check, &r); */ | call FUNCTION; | mov TMP3, aword [rbp-0x28]; /* if (r.o && !IS_CONCRETE(r.o) && STABLE(r.o) == want_v) */ | test TMP3, TMP3; | jz >1; | is_type_object TMP3; | jz >1; | mov TMP2, OBJECT:TMP3->st; | get_spesh_slot TMP1, val_spesh_idx; | cmp TMP1, TMP2; | jne >1; } /* if we're here, we didn't jump to deopt, so skip it */ | jmp >2; |1: /* emit deopt */ | mov ARG1, TC; | mov ARG2, guard->deopt_offset; | mov ARG3, guard->deopt_target; | callp &MVM_spesh_deopt_one_direct; /* tell jit driver we're deopting */ | mov RV, MVM_JIT_CTRL_DEOPT | jmp ->out; |2: } void MVM_jit_emit_invoke(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitInvoke *invoke, dasm_State **Dst) { MVMint16 i; MVM_jit_log(tc, "Emit invoke (%d args)\n", invoke->arg_count); /* setup the callsite */ | mov ARG1, TC; | mov ARG2, CU; | mov ARG3, invoke->callsite_idx; | callp &MVM_args_prepare; | mov TMP6, RV; // store callsite in tmp6, which we don't use until the end /* Store arguments in the buffer. I use TMP5 as it never conflicts * with argument passing (like TMP6, but unlike other TMP regs) */ | mov TMP5, FRAME->args; for (i = 0; i < invoke->arg_count; i++) { MVMSpeshIns *ins = invoke->arg_ins[i]; switch (ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_s: case MVM_OP_arg_n: case MVM_OP_arg_o: { MVMint16 dst = ins->operands[0].lit_i16; MVMint16 src = ins->operands[1].reg.orig; | mov TMP4, WORK[src]; | mov REGISTER:TMP5[dst], TMP4; break; } case MVM_OP_argconst_n: case MVM_OP_argconst_i: { MVMint16 dst = ins->operands[0].lit_i16; MVMint64 val = ins->operands[1].lit_i64; | mov64 TMP4, val; | mov REGISTER:TMP5[dst], TMP4; break; } case MVM_OP_argconst_s: { MVMint16 dst = ins->operands[0].lit_i16; MVMint32 idx = ins->operands[1].lit_str_idx; | get_string TMP4, idx; | mov REGISTER:TMP5[dst], TMP4; break; } default: MVM_panic(1, "JIT invoke: Can't add arg <%s>", ins->info->name); } } /* Setup the frame for returning to our current position */ if (sizeof(MVMReturnType) == 4) { | mov dword FRAME->return_type, invoke->return_type; } else { MVM_panic(1, "JIT: MVMReturnType has unexpected size"); } /* The register for our return value */ if (invoke->return_type == MVM_RETURN_VOID) { | mov aword FRAME->return_value, NULL; } else { | lea TMP2, WORK[invoke->return_register]; | mov aword FRAME->return_value, TMP2; } /* The return address for the interpreter */ | get_cur_op TMP2; | mov aword FRAME->return_address, TMP2; /* The re-entry label for the JIT, so that we continue in the next BB */ | lea TMP2, [=>(invoke->reentry_label)]; | mov aword FRAME->jit_entry_label, TMP2; /* if we're not fast, then we should get the code from multi resolution */ if (!invoke->is_fast) { /* first, save callsite and args */ | mov qword [rbp-0x28], TMP5; // args | mov qword [rbp-0x30], TMP6; // callsite /* setup call MVM_frame_multi_ok(tc, code, &cur_callsite, args); */ | mov ARG1, TC; | mov ARG2, WORK[invoke->code_register]; // code object | lea ARG3, [rbp-0x30]; // &cur_callsite | mov ARG4, TMP5; // args | callp &MVM_frame_find_invokee_multi_ok; /* restore callsite, args, RV now holds code object */ | mov TMP6, [rbp-0x30]; // callsite | mov TMP5, [rbp-0x28]; // args /* setup args for call to invoke(tc, code, cur_callsite, args) */ | mov ARG1, TC; | mov ARG2, RV; // code object | mov ARG3, TMP6; // callsite | mov ARG4, TMP5; // args /* get the actual function */ | mov FUNCTION, OBJECT:RV->st; | mov FUNCTION, STABLE:FUNCTION->invoke; | call FUNCTION; } else { /* call MVM_frame_invoke_code */ | mov ARG1, TC; | mov ARG2, WORK[invoke->code_register]; | mov ARG3, TMP6; // this is the callsite object | mov ARG4, invoke->spesh_cand; | callp &MVM_frame_invoke_code; } /* Almost done. jump out into the interprete */ | mov RV, 1; | jmp ->out; } void MVM_jit_emit_jumplist(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitJumpList *jumplist, dasm_State **Dst) { MVMint32 i; MVM_jit_log(tc, "Emit jumplist (%"PRId64" labels)\n", jumplist->num_labels); | mov TMP1, WORK[jumplist->reg]; | cmp TMP1, 0; | jl >2; | cmp TMP1, jumplist->num_labels; | jge >2; | imul TMP1, 0x8; // 8 bytes per goto | lea TMP2, [>1]; | add TMP2, TMP1; | jmp TMP2; |.align 8; |1: for (i = 0; i < jumplist->num_labels; i++) { |=>(jumplist->in_labels[i]): | jmp =>(jumplist->out_labels[i]); |.align 8; } |2: } void MVM_jit_emit_control(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitControl *ctrl, dasm_State **Dst) { if (ctrl->type == MVM_JIT_CONTROL_INVOKISH) { MVM_jit_log(tc, "Emit invokish control guard\n"); | cmp FRAME, aword TC->cur_frame; | je >1; | lea TMP1, [>1]; | mov aword FRAME->jit_entry_label, TMP1; | mov RV, 1; | jmp ->out; |1: } else if (ctrl->type == MVM_JIT_CONTROL_DYNAMIC_LABEL) { MVM_jit_log(tc, "Emit throwish control guard\n"); /* This pre-loads a label for the next op, so that throwish * operators will know where we're throwing from - NB, I'm not * totally sure this is still necessary now */ | lea TMP1, [>1]; | mov aword FRAME->jit_entry_label, TMP1; |1: } else if (ctrl->type == MVM_JIT_CONTROL_THROWISH_PRE) { /* Store a reference to the 9 label below. I assume this label * isn't used in the intermediate instructions, which is * basically valid throughout this codebase. */ | lea TMP1, [>9]; | mov aword FRAME->jit_entry_label, TMP1; } else if (ctrl->type == MVM_JIT_CONTROL_THROWISH_POST) { /* check if our current frame is the same as it was */ | cmp FRAME, aword TC->cur_frame; | jne >8; /* if it is, we may still be in a goto-handler, so in that * case the throwing machinery should have ensured that * jit_entry_label now points to the correct label. If not, it * still points to 9:. */ | jmp aword FRAME->jit_entry_label; /* if not the same frame, trampoline to interpreter */ |8: | mov RV, 1; | jmp ->out; /* I assume we *never* use a local label 9 in the code between * pre-and-post throwish */ |9: } else if (ctrl->type == MVM_JIT_CONTROL_BREAKPOINT) { /* brrts evil testing purposes breakpoint */ | int 3; } else { MVM_panic(1, "Unknown conrtol code: <%s>", ctrl->ins->info->name); } } MoarVM-2015.11/src/jit/graph.c0000644000175000017500000035153012623370227014705 0ustar jnthnjnthn#include "moar.h" #include "math.h" typedef struct { MVMSpeshGraph *sg; MVMSpeshBB *cur_bb; MVMSpeshIns *cur_ins; MVMJitNode *first_node; MVMJitNode *last_node; MVMint32 num_labels; void **labeleds; MVMint32 num_bbs; MVMint32 *bb_labels; MVMint32 num_deopts; MVMint32 alloc_deopts; MVMJitDeopt *deopts; MVMint32 num_handlers; MVMJitHandler *handlers; MVMint32 num_inlines; MVMJitInline *inlines; } JitGraphBuilder; static void jgb_append_node(JitGraphBuilder *jgb, MVMJitNode *node) { if (jgb->last_node) { jgb->last_node->next = node; jgb->last_node = node; } else { jgb->first_node = node; jgb->last_node = node; } node->next = NULL; } static void jgb_append_primitive(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshIns * ins) { MVMJitNode * node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_PRIMITIVE; node->u.prim.ins = ins; jgb_append_node(jgb, node); } static void jgb_append_call_c(MVMThreadContext *tc, JitGraphBuilder *jgb, void * func_ptr, MVMint16 num_args, MVMJitCallArg *call_args, MVMJitRVMode rv_mode, MVMint16 rv_idx) { MVMJitNode * node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); size_t args_size = num_args * sizeof(MVMJitCallArg); node->type = MVM_JIT_NODE_CALL_C; node->u.call.func_ptr = func_ptr; node->u.call.num_args = num_args; node->u.call.has_vargs = 0; // don't support them yet /* Call argument array is typically stack allocated, * so they need to be copied */ node->u.call.args = MVM_spesh_alloc(tc, jgb->sg, args_size); memcpy(node->u.call.args, call_args, args_size); node->u.call.rv_mode = rv_mode; node->u.call.rv_idx = rv_idx; jgb_append_node(jgb, node); } static MVMint32 get_label_for_obj(MVMThreadContext *tc, JitGraphBuilder *jgb, void * obj) { MVMint32 i; for (i = 0; i < jgb->num_labels; i++) { if (!jgb->labeleds[i]) break; if (jgb->labeleds[i] == obj) return i; } if (i == jgb->num_labels) { void **lblds = MVM_spesh_alloc(tc, jgb->sg, sizeof(void*) * jgb->num_labels * 2); memcpy(lblds, jgb->labeleds, jgb->num_labels * sizeof(void*)); jgb->labeleds = lblds; jgb->num_labels *= 2; } jgb->labeleds[i] = obj; return i; } static MVMint32 get_label_for_bb(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb) { MVMint32 label = get_label_for_obj(tc, jgb, bb); jgb->bb_labels[bb->idx] = label; return label; } /* This is the label that is appended at the very end */ static MVMint32 get_label_for_graph(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshGraph *sg) { return get_label_for_obj(tc, jgb, sg); } /* The idea here is that labels are always - in principle - meant before a target. */ static MVMint32 get_label_for_ins(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 post) { if (!post) { /* Disregard PHI ops */ while (ins->prev && ins->prev->info->opcode == MVM_SSA_PHI) ins = ins->prev; if (ins == bb->first_ins) { return get_label_for_obj(tc, jgb, bb); } return get_label_for_obj(tc, jgb, ins); } else { if (ins->next) { return get_label_for_obj(tc, jgb, ins->next); } else if (bb->linear_next) { return get_label_for_obj(tc, jgb, bb->linear_next); } else { /* end of graph label is identified by the graph itself */ return get_label_for_graph(tc, jgb, jgb->sg); } } } static void add_deopt_idx(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMint32 label_name, MVMint32 deopt_idx) { if (jgb->num_deopts == jgb->alloc_deopts) { MVMJitDeopt *deopts = MVM_spesh_alloc(tc, jgb->sg, jgb->alloc_deopts * 2 * sizeof(MVMJitDeopt)); memcpy(deopts, jgb->deopts, jgb->num_deopts * sizeof(MVMJitDeopt)); jgb->deopts = deopts; jgb->alloc_deopts *= 2; } jgb->deopts[jgb->num_deopts].label = label_name; jgb->deopts[jgb->num_deopts].idx = deopt_idx; jgb->num_deopts++; } static void jgb_append_branch(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMint32 name, MVMSpeshIns *ins) { MVMJitNode * node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_BRANCH; if (ins == NULL) { node->u.branch.ins = NULL; node->u.branch.dest = name; } else { MVMSpeshBB *bb; node->u.branch.ins = ins; if (ins->info->opcode == MVM_OP_goto) { bb = ins->operands[0].ins_bb; } else if (ins->info->opcode == MVM_OP_indexat || ins->info->opcode == MVM_OP_indexnat) { bb = ins->operands[3].ins_bb; } else { bb = ins->operands[1].ins_bb; } node->u.branch.dest = get_label_for_bb(tc, jgb, bb); } jgb_append_node(jgb, node); } static void jgb_append_label(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMint32 name) { MVMJitNode *node; if (jgb->last_node && jgb->last_node->type == MVM_JIT_NODE_LABEL && jgb->last_node->u.label.name == name) return; /* don't double-add labels, even if it may be harmless */ node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_LABEL; node->u.label.name = name; jgb_append_node(jgb, node); MVM_jit_log(tc, "append label: %d\n", node->u.label.name); } static void * op_to_func(MVMThreadContext *tc, MVMint16 opcode) { switch(opcode) { case MVM_OP_checkarity: return MVM_args_checkarity; case MVM_OP_say: return MVM_string_say; case MVM_OP_print: return MVM_string_print; case MVM_OP_isnull: return MVM_is_null; case MVM_OP_capturelex: return MVM_frame_capturelex; case MVM_OP_takeclosure: return MVM_frame_takeclosure; case MVM_OP_newlexotic: return MVM_exception_newlexotic_from_jit; case MVM_OP_usecapture: return MVM_args_use_capture; case MVM_OP_savecapture: return MVM_args_save_capture; case MVM_OP_return: return MVM_args_assert_void_return_ok; case MVM_OP_return_i: return MVM_args_set_result_int; case MVM_OP_return_s: return MVM_args_set_result_str; case MVM_OP_return_o: return MVM_args_set_result_obj; case MVM_OP_return_n: return MVM_args_set_result_num; case MVM_OP_coerce_is: return MVM_coerce_i_s; case MVM_OP_coerce_ns: return MVM_coerce_n_s; case MVM_OP_coerce_si: return MVM_coerce_s_i; case MVM_OP_coerce_sn: return MVM_coerce_s_n; case MVM_OP_coerce_In: return MVM_bigint_to_num; case MVM_OP_iterkey_s: return MVM_iterkey_s; case MVM_OP_iter: return MVM_iter; case MVM_OP_iterval: return MVM_iterval; case MVM_OP_die: return MVM_exception_die; case MVM_OP_throwdyn: case MVM_OP_throwlex: case MVM_OP_throwlexotic: case MVM_OP_rethrow: return MVM_exception_throwobj; case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: return MVM_exception_throwcat; case MVM_OP_resume: return MVM_exception_resume; case MVM_OP_continuationreset: return MVM_continuation_reset; case MVM_OP_continuationcontrol: return MVM_continuation_control; case MVM_OP_smrt_numify: return MVM_coerce_smart_numify; case MVM_OP_smrt_strify: return MVM_coerce_smart_stringify; case MVM_OP_write_fhs: return MVM_io_write_string; case MVM_OP_gethow: return MVM_6model_get_how_obj; case MVM_OP_box_i: return MVM_box_int; case MVM_OP_box_s: return MVM_box_str; case MVM_OP_box_n: return MVM_box_num; case MVM_OP_unbox_i: return MVM_repr_get_int; case MVM_OP_unbox_s: return MVM_repr_get_str; case MVM_OP_unbox_n: return MVM_repr_get_num; case MVM_OP_istrue: case MVM_OP_isfalse: return MVM_coerce_istrue; case MVM_OP_istype: return MVM_6model_istype; case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: // continued case MVM_OP_islist: case MVM_OP_ishash: return MVM_repr_compare_repr_id; case MVM_OP_wval: case MVM_OP_wval_wide: return MVM_sc_get_sc_object; case MVM_OP_getdynlex: return MVM_frame_getdynlex; case MVM_OP_binddynlex: return MVM_frame_binddynlex; case MVM_OP_getlexouter: return MVM_frame_find_lexical_by_name_outer; case MVM_OP_findmeth: case MVM_OP_findmeth_s: return MVM_6model_find_method; case MVM_OP_multicacheadd: return MVM_multi_cache_add; case MVM_OP_multicachefind: return MVM_multi_cache_find; case MVM_OP_can: case MVM_OP_can_s: return MVM_6model_can_method; case MVM_OP_push_i: return MVM_repr_push_i; case MVM_OP_push_n: return MVM_repr_push_n; case MVM_OP_push_s: return MVM_repr_push_s; case MVM_OP_push_o: return MVM_repr_push_o; case MVM_OP_unshift_i: return MVM_repr_unshift_i; case MVM_OP_unshift_n: return MVM_repr_unshift_n; case MVM_OP_unshift_s: return MVM_repr_unshift_s; case MVM_OP_unshift_o: return MVM_repr_unshift_o; case MVM_OP_pop_i: return MVM_repr_pop_i; case MVM_OP_pop_n: return MVM_repr_pop_n; case MVM_OP_pop_s: return MVM_repr_pop_s; case MVM_OP_pop_o: return MVM_repr_pop_o; case MVM_OP_shift_i: return MVM_repr_shift_i; case MVM_OP_shift_n: return MVM_repr_shift_n; case MVM_OP_shift_s: return MVM_repr_shift_s; case MVM_OP_shift_o: return MVM_repr_shift_o; case MVM_OP_setelemspos: return MVM_repr_pos_set_elems; case MVM_OP_splice: return MVM_repr_pos_splice; case MVM_OP_existskey: return MVM_repr_exists_key; case MVM_OP_deletekey: return MVM_repr_delete_key; case MVM_OP_atpos_i: return MVM_repr_at_pos_i; case MVM_OP_atpos_n: return MVM_repr_at_pos_n; case MVM_OP_atpos_s: return MVM_repr_at_pos_s; case MVM_OP_atpos_o: return MVM_repr_at_pos_o; case MVM_OP_existspos: return MVM_repr_exists_pos; case MVM_OP_atkey_i: return MVM_repr_at_key_i; case MVM_OP_atkey_n: return MVM_repr_at_key_n; case MVM_OP_atkey_s: return MVM_repr_at_key_s; case MVM_OP_atkey_o: return MVM_repr_at_key_o; case MVM_OP_bindpos_i: return MVM_repr_bind_pos_i; case MVM_OP_bindpos_n: return MVM_repr_bind_pos_n; case MVM_OP_bindpos_s: return MVM_repr_bind_pos_s; case MVM_OP_bindpos_o: return MVM_repr_bind_pos_o; case MVM_OP_bindkey_i: return MVM_repr_bind_key_i; case MVM_OP_bindkey_n: return MVM_repr_bind_key_n; case MVM_OP_bindkey_s: return MVM_repr_bind_key_s; case MVM_OP_bindkey_o: return MVM_repr_bind_key_o; case MVM_OP_getattr_s: return MVM_repr_get_attr_s; case MVM_OP_getattr_n: return MVM_repr_get_attr_n; case MVM_OP_getattr_i: return MVM_repr_get_attr_i; case MVM_OP_getattr_o: return MVM_repr_get_attr_o; case MVM_OP_getattrs_s: return MVM_repr_get_attr_s; case MVM_OP_getattrs_n: return MVM_repr_get_attr_n; case MVM_OP_getattrs_i: return MVM_repr_get_attr_i; case MVM_OP_getattrs_o: return MVM_repr_get_attr_o; case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: return MVM_repr_bind_attr_inso; case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: return MVM_repr_bind_attr_inso; case MVM_OP_hintfor: return MVM_repr_hint_for; case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: case MVM_OP_cmp_s: return MVM_string_compare; case MVM_OP_elems: return MVM_repr_elems; case MVM_OP_flattenropes: return MVM_string_flatten; case MVM_OP_concat_s: return MVM_string_concatenate; case MVM_OP_repeat_s: return MVM_string_repeat; case MVM_OP_flip: return MVM_string_flip; case MVM_OP_split: return MVM_string_split; case MVM_OP_escape: return MVM_string_escape; case MVM_OP_uc: return MVM_string_uc; case MVM_OP_tc: return MVM_string_tc; case MVM_OP_lc: return MVM_string_lc; case MVM_OP_eq_s: return MVM_string_equal; case MVM_OP_eqat_s: return MVM_string_equal_at; case MVM_OP_chars: case MVM_OP_graphs_s: return MVM_string_graphs; case MVM_OP_codes_s: return MVM_string_codes; case MVM_OP_index_s: return MVM_string_index; case MVM_OP_substr_s: return MVM_string_substring; case MVM_OP_join: return MVM_string_join; case MVM_OP_iscclass: return MVM_string_is_cclass; case MVM_OP_findcclass: return MVM_string_find_cclass; case MVM_OP_findnotcclass: return MVM_string_find_not_cclass; case MVM_OP_nfarunalt: return MVM_nfa_run_alt; case MVM_OP_nfarunproto: return MVM_nfa_run_proto; case MVM_OP_nfafromstatelist: return MVM_nfa_from_statelist; case MVM_OP_hllize: return MVM_hll_map; case MVM_OP_clone: return MVM_repr_clone; case MVM_OP_getcodeobj: return MVM_frame_get_code_object; case MVM_OP_isbig_I: return MVM_bigint_is_big; case MVM_OP_cmp_I: return MVM_bigint_cmp; case MVM_OP_add_I: return MVM_bigint_add; case MVM_OP_sub_I: return MVM_bigint_sub; case MVM_OP_mul_I: return MVM_bigint_mul; case MVM_OP_div_I: return MVM_bigint_div; case MVM_OP_bor_I: return MVM_bigint_or; case MVM_OP_band_I: return MVM_bigint_and; case MVM_OP_bxor_I: return MVM_bigint_xor; case MVM_OP_mod_I: return MVM_bigint_mod; case MVM_OP_lcm_I: return MVM_bigint_lcm; case MVM_OP_gcd_I: return MVM_bigint_gcd; case MVM_OP_bool_I: return MVM_bigint_bool; case MVM_OP_brshift_I: return MVM_bigint_shr; case MVM_OP_blshift_I: return MVM_bigint_shl; case MVM_OP_bnot_I: return MVM_bigint_not; case MVM_OP_div_In: return MVM_bigint_div_num; case MVM_OP_coerce_Is: case MVM_OP_base_I: return MVM_bigint_to_str; case MVM_OP_radix_I: return MVM_bigint_radix; case MVM_OP_sqrt_n: return sqrt; case MVM_OP_sin_n: return sin; case MVM_OP_cos_n: return cos; case MVM_OP_tan_n: return tan; case MVM_OP_asin_n: return asin; case MVM_OP_acos_n: return acos; case MVM_OP_atan_n: return atan; case MVM_OP_atan2_n: return atan2; case MVM_OP_pow_n: return pow; case MVM_OP_time_n: return MVM_proc_time_n; case MVM_OP_randscale_n: return MVM_proc_randscale_n; case MVM_OP_isnanorinf: return MVM_num_isnanorinf; case MVM_OP_nativecallinvoke: return MVM_nativecall_invoke; case MVM_OP_iscont_i: return MVM_6model_container_iscont_i; case MVM_OP_iscont_n: return MVM_6model_container_iscont_n; case MVM_OP_iscont_s: return MVM_6model_container_iscont_s; case MVM_OP_isrwcont: return MVM_6model_container_iscont_rw; case MVM_OP_assign_i: return MVM_6model_container_assign_i; case MVM_OP_assign_n: return MVM_6model_container_assign_n; case MVM_OP_assign_s: return MVM_6model_container_assign_s; case MVM_OP_decont_i: return MVM_6model_container_decont_i; case MVM_OP_decont_n: return MVM_6model_container_decont_n; case MVM_OP_decont_s: return MVM_6model_container_decont_s; case MVM_OP_getlexref_i: return MVM_nativeref_lex_i; case MVM_OP_getlexref_n: return MVM_nativeref_lex_n; case MVM_OP_getlexref_s: return MVM_nativeref_lex_s; case MVM_OP_getattrref_i: return MVM_nativeref_attr_i; case MVM_OP_getattrref_n: return MVM_nativeref_attr_n; case MVM_OP_getattrref_s: return MVM_nativeref_attr_s; case MVM_OP_getattrsref_i: return MVM_nativeref_attr_i; case MVM_OP_getattrsref_n: return MVM_nativeref_attr_n; case MVM_OP_getattrsref_s: return MVM_nativeref_attr_s; case MVM_OP_sp_boolify_iter: return MVM_iter_istrue; case MVM_OP_prof_allocated: return MVM_profile_log_allocated; case MVM_OP_prof_exit: return MVM_profile_log_exit; default: MVM_oops(tc, "JIT: No function for op %d in op_to_func.", opcode); } } static void jgb_append_guard(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshIns *ins) { MVMSpeshAnn *ann = ins->annotations; MVMJitNode *node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); MVMint32 deopt_idx; node->type = MVM_JIT_NODE_GUARD; node->u.guard.ins = ins; while (ann) { if (ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS || ann->type == MVM_SPESH_ANN_DEOPT_INLINE) { deopt_idx = ann->data.deopt_idx; break; } ann = ann->next; } if (!ann) { MVM_oops(tc, "Can't find deopt idx annotation" " on spesh ins <%s>", ins->info->name); } node->u.guard.deopt_target = jgb->sg->deopt_addrs[2 * deopt_idx]; node->u.guard.deopt_offset = jgb->sg->deopt_addrs[2 * deopt_idx + 1]; jgb_append_node(jgb, node); } static MVMint32 jgb_consume_invoke(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshIns *ins) { MVMCompUnit *cu = jgb->sg->sf->body.cu; MVMint16 callsite_idx = ins->operands[0].callsite_idx; MVMCallsite *cs = cu->body.callsites[callsite_idx]; MVMSpeshIns **arg_ins = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMSpeshIns*) * cs->arg_count); MVMint16 i = 0; MVMJitNode *node; MVMint32 reentry_label; MVMReturnType return_type; MVMint16 return_register; MVMint16 code_register; MVMint16 spesh_cand; MVMint16 is_fast; while ((ins = ins->next)) { switch(ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: case MVM_OP_argconst_i: case MVM_OP_argconst_n: case MVM_OP_argconst_s: MVM_jit_log(tc, "Invoke arg: <%s>\n", ins->info->name); arg_ins[i++] = ins; break; case MVM_OP_invoke_v: return_type = MVM_RETURN_VOID; return_register = -1; code_register = ins->operands[0].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_i: return_type = MVM_RETURN_INT; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_n: return_type = MVM_RETURN_NUM; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_s: return_type = MVM_RETURN_STR; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_o: return_type = MVM_RETURN_OBJ; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_sp_fastinvoke_v: return_type = MVM_RETURN_VOID; return_register = -1; code_register = ins->operands[0].reg.orig; spesh_cand = ins->operands[1].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_o: return_type = MVM_RETURN_OBJ; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_s: return_type = MVM_RETURN_STR; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_i: return_type = MVM_RETURN_INT; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_n: return_type = MVM_RETURN_NUM; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; default: MVM_jit_log(tc, "Unexpected opcode in invoke sequence: <%s>\n", ins->info->name); return 0; } } checkargs: if (!ins || i < cs->arg_count) { MVM_jit_log(tc, "Could not find invoke opcode or enough arguments\n" "BAIL: op <%s>, expected args: %d, num of args: %d\n", ins? ins->info->name : "NULL", i, cs->arg_count); return 0; } MVM_jit_log(tc, "Invoke instruction: <%s>\n", ins->info->name); /* get label /after/ current (invoke) ins, where we'll need to reenter the JIT */ reentry_label = get_label_for_ins(tc, jgb, jgb->cur_bb, ins, 1); /* create invoke node */ node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_INVOKE; node->u.invoke.callsite_idx = callsite_idx; node->u.invoke.arg_count = cs->arg_count; node->u.invoke.arg_ins = arg_ins; node->u.invoke.return_type = return_type; node->u.invoke.return_register = return_register; node->u.invoke.code_register = code_register; node->u.invoke.spesh_cand = spesh_cand; node->u.invoke.reentry_label = reentry_label; node->u.invoke.is_fast = is_fast; jgb_append_node(jgb, node); /* append reentry label */ jgb_append_label(tc, jgb, reentry_label); /* move forward to invoke ins */ jgb->cur_ins = ins; return 1; } static void jgb_append_control(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshIns *ins, MVMJitControlType ctrl) { MVMJitNode *node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_CONTROL; node->u.control.ins = ins; node->u.control.type = ctrl; jgb_append_node(jgb, node); } static MVMint32 jgb_consume_jumplist(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshIns *ins) { MVMint64 num_labels = ins->operands[0].lit_i64; MVMint16 idx_reg = ins->operands[1].reg.orig; MVMint32 *in_labels = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMint32) * num_labels); MVMint32 *out_labels = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMint32) * num_labels); MVMSpeshBB *bb = jgb->cur_bb; MVMJitNode *node; MVMint64 i; for (i = 0; i < num_labels; i++) { bb = bb->linear_next; // take the next basic block if (!bb || bb->first_ins != bb->last_ins) return 0; // which must exist ins = bb->first_ins; // and it's first and only entry if (ins->info->opcode != MVM_OP_goto) // which must be a goto return 0; in_labels[i] = get_label_for_bb(tc, jgb, bb); out_labels[i] = get_label_for_bb(tc, jgb, ins->operands[0].ins_bb); } /* build the node */ node = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_JUMPLIST; node->u.jumplist.num_labels = num_labels; node->u.jumplist.reg = idx_reg; node->u.jumplist.in_labels = in_labels; node->u.jumplist.out_labels = out_labels; jgb_append_node(jgb, node); /* set cur_bb and cur_ins to the end of our jumplist */ jgb->cur_bb = bb; jgb->cur_ins = ins; return 1; } static MVMuint16 * try_fake_extop_regs(MVMThreadContext *tc, MVMSpeshIns *ins) { /* XXX Need to be able to clear these up, some day. */ MVMuint16 *regs = MVM_calloc(ins->info->num_operands, sizeof(MVMuint16)); MVMuint16 i; for (i = 0; i < ins->info->num_operands; i++) { switch (ins->info->operands[i] & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: regs[i] = ins->operands[i].reg.orig; break; default: MVM_free(regs); return NULL; } } return regs; } static void log_inline(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMint32 inline_idx, MVMint32 is_entry) { MVMStaticFrame *sf = sg->inlines[inline_idx].code->body.sf; char *name = MVM_string_utf8_encode_C_string(tc, sf->body.name); char *cuuid = MVM_string_utf8_encode_C_string(tc, sf->body.cuuid); MVM_jit_log(tc, "%s inline %d (name: %s, cuuid: %s)\n", is_entry ? "Entering" : "Leaving", inline_idx, name, cuuid); MVM_free(name); MVM_free(cuuid); } static void jgb_before_ins(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshAnn *ann = ins->annotations; /* Search annotations for stuff that may need a label. */ while (ann) { switch(ann->type) { case MVM_SPESH_ANN_DEOPT_OSR: { /* get label before our instruction */ MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 0); jgb_append_label(tc, jgb, label); add_deopt_idx(tc, jgb, label, ann->data.deopt_idx); break; } case MVM_SPESH_ANN_FH_START: { MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 0); jgb_append_label(tc, jgb, label); jgb->handlers[ann->data.frame_handler_index].start_label = label; /* Load the current position into the jit entry label, so that * when throwing we'll know which handler to use */ jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_DYNAMIC_LABEL); break; } case MVM_SPESH_ANN_FH_END: { MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 0); jgb_append_label(tc, jgb, label); jgb->handlers[ann->data.frame_handler_index].end_label = label; /* Same as above. Note that the dynamic label control * actually loads a position a few bytes away from the * label appended above. This is in this case intentional * because the frame handler end is exclusive; once it is * passed we should not use the same handler again. If we * loaded the exact same position, we would not be able to * distinguish between the end of the basic block to which * the handler applies and the start of the basic block to * which it doesn't. */ jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_DYNAMIC_LABEL); break; } case MVM_SPESH_ANN_FH_GOTO: { MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 0); jgb_append_label(tc, jgb, label); jgb->handlers[ann->data.frame_handler_index].goto_label = label; break; } case MVM_SPESH_ANN_INLINE_START: { MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 0); jgb_append_label(tc, jgb, label); jgb->inlines[ann->data.inline_idx].start_label = label; if (tc->instance->jit_log_fh) log_inline(tc, jgb->sg, ann->data.inline_idx, 1); break; } } /* switch */ ann = ann->next; } if (ins->info->jittivity & MVM_JIT_INFO_THROWISH) { jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_THROWISH_PRE); } } static void jgb_after_ins(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshAnn *ann; /* If we've consumed an (or throwish) op, we should append a guard */ if (ins->info->jittivity & MVM_JIT_INFO_INVOKISH) { MVM_jit_log(tc, "append invokish control guard\n"); jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_INVOKISH); } else if (ins->info->jittivity & MVM_JIT_INFO_THROWISH) { jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_THROWISH_POST); } /* This order of processing is necessary to ensure that a label * calculated by one of the control guards as well as the labels * calculated below point to the exact same instruction. This is a * relatively fragile construction! One could argue that the * control guards should in fact use the same (dynamic) labels. */ ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_INLINE_END) { MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 1); jgb_append_label(tc, jgb, label); jgb->inlines[ann->data.inline_idx].end_label = label; if (tc->instance->jit_log_fh) log_inline(tc, jgb->sg, ann->data.inline_idx, 0); } else if (ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS /* || ann->type == MVM_SPESH_ANN_DEOPT_INLINE */) { /* An underlying assumption here is that this instruction * will in fact set the jit_entry_label to a correct * value. This is clearly true for invoking ops as well * as invokish ops, and in fact there is no other way * to get a deopt_all_ins annotation. Still, be warned. */ MVMint32 label = get_label_for_ins(tc, jgb, bb, ins, 1); jgb_append_label(tc, jgb, label); add_deopt_idx(tc, jgb, label, ann->data.deopt_idx); } ann = ann->next; } } static MVMint32 jgb_consume_reprop(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMint16 op = ins->info->opcode; MVMSpeshOperand type_operand; MVMSpeshFacts *type_facts = 0; MVMint32 alternative = 0; switch (op) { case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_deletekey: case MVM_OP_setelemspos: case MVM_OP_splice: type_operand = ins->operands[0]; break; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_elems: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_hintfor: type_operand = ins->operands[1]; break; case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: type_operand = ins->operands[2]; break; default: MVM_jit_log(tc, "devirt: couldn't figure out type operand for op %s\n", ins->info->name); return 0; } type_facts = MVM_spesh_get_facts(tc, jgb->sg, type_operand); if (type_facts && type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && type_facts->type) { switch(op) { case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: alternative = 1; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: { /* atpos_i w(int64) r(obj) r(int64) */ /* atkey_i w(int64) r(obj) r(str)*/ /*void (*at_pos) (MVMThreadContext *tc, MVMSTable *st, * MVMObject *root, void *data, MVMint64 index, * MVMRegister *result, MVMuint16 kind);*/ /*REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), * idx, &value, MVM_reg_int64);*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.at_key : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.at_pos; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_atpos_i || op == MVM_OP_atkey_i ? MVM_reg_int64 : op == MVM_OP_atpos_n || op == MVM_OP_atkey_n ? MVM_reg_num64 : op == MVM_OP_atpos_s || op == MVM_OP_atkey_s ? MVM_reg_str : MVM_reg_obj } }; jgb_append_call_c(tc, jgb, function, 7, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted an %s via jgb_consume_reprop\n", ins->info->name); return 1; } case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: alternative = 1; case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: { /*bindpos_i r(obj) r(int64) r(int64)*/ /*bindkey_i r(obj) r(str) r(int64)*/ /* void (*bind_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); */ /* void (*bind_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); */ MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.bind_key : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.bind_pos; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, key }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_bindpos_i || op == MVM_OP_bindkey_i ? MVM_reg_int64 : op == MVM_OP_bindpos_n || op == MVM_OP_bindkey_n ? MVM_reg_num64 : op == MVM_OP_bindpos_s || op == MVM_OP_bindkey_s ? MVM_reg_str : MVM_reg_obj } }; jgb_append_call_c(tc, jgb, function, 7, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); return 1; } case MVM_OP_elems: { /*elems w(int64) r(obj) :pure*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->elems; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant } }; jgb_append_call_c(tc, jgb, function, 4, args, MVM_JIT_RV_INT, dst); MVM_jit_log(tc, "devirt: emitted an elems via jgb_consume_reprop\n"); return 1; } case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: { /*getattr_i w(int64) r(obj) r(obj) str int16*/ /*getattrs_i w(int64) r(obj) r(obj) r(str)*/ /*static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root,*/ /* void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint,*/ /* MVMRegister *result_reg, MVMuint16 kind) {*/ /* reprconv and interp.c check for concreteness, so we'd either * have to emit a bit of code to check and throw or just rely * on a concreteness fact */ MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, jgb->sg, ins->operands[1]); if (object_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint32 is_name_direct = ins->info->num_operands == 5; MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMint32 attrname = is_name_direct ? ins->operands[3].lit_str_idx : ins->operands[3].reg.orig; MVMint32 attrhint = is_name_direct ? ins->operands[4].lit_i16 : -1; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.get_attribute; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, type }, { is_name_direct ? MVM_JIT_STR_IDX : MVM_JIT_REG_VAL, attrname }, { MVM_JIT_LITERAL, attrhint }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_getattr_i || op == MVM_OP_getattrs_i ? MVM_reg_int64 : op == MVM_OP_getattr_n || op == MVM_OP_getattrs_n ? MVM_reg_num64 : op == MVM_OP_getattr_s || op == MVM_OP_getattrs_s ? MVM_reg_str : MVM_reg_obj } }; MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); jgb_append_call_c(tc, jgb, function, 9, args, MVM_JIT_RV_VOID, -1); return 1; } else { MVM_jit_log(tc, "devirt: couldn't %s; concreteness not sure\n", ins->info->name); break; } } case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: { /*bindattr_n r(obj) r(obj) str r(num64) int16*/ /*bindattrs_n r(obj) r(obj) r(str) r(num64)*/ /* static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, * void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, * MVMRegister value_reg, MVMuint16 kind) */ /* reprconv and interp.c check for concreteness, so we'd either * have to emit a bit of code to check and throw or just rely * on a concreteness fact */ MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, jgb->sg, ins->operands[1]); if (object_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint32 is_name_direct = ins->info->num_operands == 5; MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = is_name_direct ? ins->operands[2].lit_str_idx : ins->operands[2].reg.orig; MVMint32 attrhint = is_name_direct ? ins->operands[4].lit_i16 : -1; MVMint32 value = ins->operands[3].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.bind_attribute; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, type }, { is_name_direct ? MVM_JIT_STR_IDX : MVM_JIT_REG_VAL, attrname }, { MVM_JIT_LITERAL, attrhint }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_bindattr_i || op == MVM_OP_bindattrs_i ? MVM_reg_int64 : op == MVM_OP_bindattr_n || op == MVM_OP_bindattrs_n ? MVM_reg_num64 : op == MVM_OP_bindattr_s || op == MVM_OP_bindattrs_s ? MVM_reg_str : MVM_reg_obj } }; MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); jgb_append_call_c(tc, jgb, function, 9, args, MVM_JIT_RV_VOID, -1); return 1; } else { MVM_jit_log(tc, "devirt: couldn't %s; concreteness not sure\n", ins->info->name); break; } } case MVM_OP_hintfor: { /* * MVMint64 (*hint_for) (MVMThreadContext *tc, MVMSTable *st, * MVMObject *class_handle, MVMString *name); */ MVMint32 result = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = ins->operands[2].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.hint_for; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, type }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname } }; MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); jgb_append_call_c(tc, jgb, function, 4, args, MVM_JIT_RV_INT, result); return 1; break; } case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: alternative = 1; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.push : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.unshift; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_push_i || op == MVM_OP_unshift_i ? MVM_reg_int64 : op == MVM_OP_push_n || op == MVM_OP_unshift_n ? MVM_reg_num64 : op == MVM_OP_push_s || op == MVM_OP_unshift_s ? MVM_reg_str : MVM_reg_obj } }; jgb_append_call_c(tc, jgb, function, 6, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); return 1; } case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: alternative = 1; case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: { MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.pop : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.shift; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_pop_i || op == MVM_OP_shift_i ? MVM_reg_int64 : op == MVM_OP_pop_n || op == MVM_OP_shift_n ? MVM_reg_num64 : op == MVM_OP_pop_s || op == MVM_OP_shift_s ? MVM_reg_str : MVM_reg_obj } }; jgb_append_call_c(tc, jgb, function, 6, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); return 1; } case MVM_OP_setelemspos: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 amount = ins->operands[1].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->pos_funcs.set_elems; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, amount } }; jgb_append_call_c(tc, jgb, function, 5, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); return 1; } case MVM_OP_existskey: { /*existskey w(int64) r(obj) r(str) :pure*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 keyidx = ins->operands[2].reg.orig; void *function = (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.exists_key; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, keyidx } }; jgb_append_call_c(tc, jgb, function, 5, args, MVM_JIT_RV_INT, dst); MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); return 1; } default: MVM_jit_log(tc, "devirt: please implement emitting repr op %s\n", ins->info->name); } } else { MVM_jit_log(tc, "devirt: repr op %s couldn't be devirtualized: type unknown\n", ins->info->name); } skipdevirt: switch(op) { case MVM_OP_push_i: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_unshift_i: case MVM_OP_unshift_s: case MVM_OP_unshift_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, value } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_unshift_n: case MVM_OP_push_n: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL_F, value } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_shift_s: case MVM_OP_pop_s: case MVM_OP_shift_o: case MVM_OP_pop_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_shift_i: case MVM_OP_pop_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_shift_n: case MVM_OP_pop_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_deletekey: case MVM_OP_setelemspos: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key_or_val = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key_or_val } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_existskey: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 key = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_splice: { MVMint16 invocant = ins->operands[0].reg.orig; MVMint16 source = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].reg.orig; MVMint16 count = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, source }, { MVM_JIT_REG_VAL, offset }, { MVM_JIT_REG_VAL, count } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_existspos: case MVM_OP_atkey_i: case MVM_OP_atpos_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_atkey_n: case MVM_OP_atpos_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_atpos_o: case MVM_OP_atkey_o: case MVM_OP_atkey_s: case MVM_OP_atpos_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key_pos = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key_pos }, { op == MVM_OP_bindpos_n || op == MVM_OP_bindkey_n ? MVM_JIT_REG_VAL_F : MVM_JIT_REG_VAL, value } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: { MVMuint16 kind = op == MVM_OP_getattr_i ? MVM_JIT_RV_INT : op == MVM_OP_getattr_n ? MVM_JIT_RV_NUM : op == MVM_OP_getattr_s ? MVM_JIT_RV_PTR : /* MVM_OP_getattr_o ? */ MVM_JIT_RV_PTR; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMuint32 str_idx = ins->operands[3].lit_str_idx; MVMint16 hint = ins->operands[4].lit_i16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_STR_IDX, str_idx }, { MVM_JIT_LITERAL, hint }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 5, args, kind, dst); break; } case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: { MVMuint16 kind = op == MVM_OP_getattrs_i ? MVM_JIT_RV_INT : op == MVM_OP_getattrs_n ? MVM_JIT_RV_NUM : op == MVM_OP_getattrs_s ? MVM_JIT_RV_PTR : /* MVM_OP_getattrs_o ? */ MVM_JIT_RV_PTR; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMint16 str = ins->operands[3].reg.orig; MVMint16 hint = -1; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_REG_VAL, str }, { MVM_JIT_LITERAL, hint }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 5, args, kind, dst); break; } case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[1].reg.orig; MVMuint32 str_idx = ins->operands[2].lit_str_idx; MVMint16 val = ins->operands[3].reg.orig; MVMint16 hint = ins->operands[4].lit_i16; MVMuint16 kind = op == MVM_OP_bindattr_i ? MVM_reg_int64 : op == MVM_OP_bindattr_n ? MVM_reg_num64 : op == MVM_OP_bindattr_s ? MVM_reg_str : /* MVM_OP_bindattr_o ? */ MVM_reg_obj; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_STR_IDX, str_idx }, { MVM_JIT_LITERAL, hint }, { op == MVM_OP_bindattr_n ? MVM_JIT_REG_VAL_F : MVM_JIT_REG_VAL, val }, { MVM_JIT_LITERAL, kind } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[1].reg.orig; MVMint16 str = ins->operands[2].reg.orig; MVMint16 val = ins->operands[3].reg.orig; MVMint16 hint = -1; MVMuint16 kind = op == MVM_OP_bindattrs_i ? MVM_reg_int64 : op == MVM_OP_bindattrs_n ? MVM_reg_num64 : op == MVM_OP_bindattrs_s ? MVM_reg_str : /* MVM_OP_bindattrs_o ? */ MVM_reg_obj; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_REG_VAL, str }, { MVM_JIT_LITERAL, hint }, { op == MVM_OP_bindattrs_n ? MVM_JIT_REG_VAL_F : MVM_JIT_REG_VAL, val }, { MVM_JIT_LITERAL, kind } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_hintfor: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_elems: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } default: return 0; } return 1; } static MVMint32 jgb_consume_ins(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMint16 op = ins->info->opcode; MVM_jit_log(tc, "append_ins: <%s>\n", ins->info->name); switch(op) { case MVM_SSA_PHI: case MVM_OP_no_op: break; /* arithmetic */ case MVM_OP_add_i: case MVM_OP_sub_i: case MVM_OP_mul_i: case MVM_OP_div_i: case MVM_OP_mod_i: case MVM_OP_inc_i: case MVM_OP_dec_i: case MVM_OP_neg_i: case MVM_OP_band_i: case MVM_OP_bor_i: case MVM_OP_bxor_i: case MVM_OP_bnot_i: case MVM_OP_blshift_i: case MVM_OP_brshift_i: case MVM_OP_add_n: case MVM_OP_sub_n: case MVM_OP_mul_n: case MVM_OP_div_n: case MVM_OP_neg_n: /* number coercion */ case MVM_OP_coerce_ni: case MVM_OP_coerce_in: /* comparison (integer) */ case MVM_OP_eq_i: case MVM_OP_ne_i: case MVM_OP_lt_i: case MVM_OP_le_i: case MVM_OP_gt_i: case MVM_OP_ge_i: case MVM_OP_cmp_i: /* comparison (numbers) */ case MVM_OP_eq_n: case MVM_OP_ne_n: case MVM_OP_ge_n: case MVM_OP_gt_n: case MVM_OP_lt_n: case MVM_OP_le_n: case MVM_OP_cmp_n: /* comparison (objects) */ case MVM_OP_eqaddr: case MVM_OP_isconcrete: /* comparison (big integer) */ case MVM_OP_eq_I: case MVM_OP_ne_I: case MVM_OP_lt_I: case MVM_OP_le_I: case MVM_OP_gt_I: case MVM_OP_ge_I: /* constants */ case MVM_OP_const_i64_16: case MVM_OP_const_i64_32: case MVM_OP_const_i64: case MVM_OP_const_n64: case MVM_OP_nan: case MVM_OP_const_s: case MVM_OP_null: /* argument reading */ case MVM_OP_sp_getarg_i: case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: /* accessors */ case MVM_OP_sp_p6oget_o: case MVM_OP_sp_p6oget_s: case MVM_OP_sp_p6oget_i: case MVM_OP_sp_p6oget_n: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_sp_p6ogetvt_o: case MVM_OP_sp_p6obind_i: case MVM_OP_sp_p6obind_n: case MVM_OP_sp_p6obind_s: case MVM_OP_sp_p6obind_o: case MVM_OP_sp_bind_i64: case MVM_OP_sp_bind_n: case MVM_OP_sp_bind_s: case MVM_OP_sp_bind_o: case MVM_OP_sp_get_i64: case MVM_OP_sp_get_n: case MVM_OP_sp_get_s: case MVM_OP_sp_get_o: case MVM_OP_set: case MVM_OP_getlex: case MVM_OP_getlex_no: case MVM_OP_bindlex: case MVM_OP_getwhat: case MVM_OP_getwho: case MVM_OP_getwhere: case MVM_OP_sp_getspeshslot: case MVM_OP_takedispatcher: case MVM_OP_setdispatcher: case MVM_OP_curcode: case MVM_OP_getcode: case MVM_OP_callercode: case MVM_OP_sp_fastcreate: case MVM_OP_iscont: case MVM_OP_decont: case MVM_OP_sp_namedarg_used: case MVM_OP_sp_findmeth: case MVM_OP_hllboxtype_i: case MVM_OP_hllboxtype_n: case MVM_OP_hllboxtype_s: case MVM_OP_null_s: case MVM_OP_isnull_s: case MVM_OP_not_i: case MVM_OP_isnull: case MVM_OP_isnonnull: case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: case MVM_OP_islist: case MVM_OP_ishash: case MVM_OP_sp_boolify_iter_arr: case MVM_OP_sp_boolify_iter_hash: case MVM_OP_objprimspec: case MVM_OP_takehandlerresult: case MVM_OP_lexoticresult: case MVM_OP_exception: case MVM_OP_scwbdisable: case MVM_OP_scwbenable: case MVM_OP_assign: case MVM_OP_assignunchecked: case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: case MVM_OP_paramnamesused: case MVM_OP_assertparamcheck: case MVM_OP_getobjsc: case MVM_OP_ordat: case MVM_OP_ordfirst: /* Profiling */ case MVM_OP_prof_enterspesh: case MVM_OP_prof_enterinline: case MVM_OP_invokewithcapture: jgb_append_primitive(tc, jgb, ins); break; /* branches */ case MVM_OP_goto: case MVM_OP_if_i: case MVM_OP_unless_i: case MVM_OP_if_n: case MVM_OP_unless_n: case MVM_OP_ifnonnull: case MVM_OP_indexat: case MVM_OP_indexnat: case MVM_OP_if_s0: case MVM_OP_unless_s0: jgb_append_branch(tc, jgb, 0, ins); break; case MVM_OP_if_o: case MVM_OP_unless_o: { /* Very special / funky branches. The function involved in * making this decision - namely, MVM_coerse_istrue - expects * to take a return register address /or/ two bytecode * addresses. This is a reasonable decision with regards to * invocation nesting in the interpreter, but not for the * JIT. Hence, we will transform this into the istrue / * isfalse primitive combined with the if_i branch. A special * problem is that there really isn't any 'real' work space * available to store the result. Instead, we'll use the * args space to store and read the result */ MVMint16 obj = ins->operands[0].reg.orig; /* Assign the very last register allocated */ MVMint16 dst = jgb->sg->num_locals + jgb->sg->sf->body.cu->body.max_callsite_size - 1; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } }, // destination register (in args space) { MVM_JIT_LITERAL, { 0 } }, // true code { MVM_JIT_LITERAL, { 0 } }, // false code { MVM_JIT_LITERAL, { op == MVM_OP_unless_o } }}; // switch MVMSpeshIns * branch = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMSpeshIns)); if (dst + 1 <= jgb->sg->num_locals) { MVM_oops(tc, "JIT: no space in args buffer to store" " temporary result for <%s>", ins->info->name); } jgb_append_call_c(tc, jgb, op_to_func(tc, MVM_OP_istrue), 6, args, MVM_JIT_RV_VOID, -1); /* guard the potential invoke */ jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_INVOKISH); /* branch if true (switch is done by coercion) */ branch->info = MVM_op_get_op(MVM_OP_if_i); branch->operands = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMSpeshOperand) * 2); branch->operands[0].reg.orig = dst; branch->operands[1].ins_bb = ins->operands[1].ins_bb; jgb_append_branch(tc, jgb, 0, branch); break; } /* some functions */ case MVM_OP_gethow: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_istype: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_ADDR, { dst } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_checkarity: { MVMuint16 min = ins->operands[0].lit_i16; MVMuint16 max = ins->operands[1].lit_i16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_PARAMS } }, { MVM_JIT_LITERAL, { min } }, { MVM_JIT_LITERAL, { max } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_say: case MVM_OP_print: { MVMint32 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_wval: case MVM_OP_wval_wide: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 dep = ins->operands[1].lit_i16; MVMint64 idx = op == MVM_OP_wval ? ins->operands[2].lit_i16 : ins->operands[2].lit_i64; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CU } }, { MVM_JIT_LITERAL, { dep } }, { MVM_JIT_LITERAL, { idx } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_throwdyn: case MVM_OP_throwlex: case MVM_OP_throwlexotic: { MVMint16 regi = ins->operands[0].reg.orig; MVMint16 object = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { op == MVM_OP_throwlexotic ? MVM_EX_THROW_LEXOTIC : op == MVM_OP_throwlex ? MVM_EX_THROW_LEX : MVM_EX_THROW_DYN } }, { MVM_JIT_REG_VAL, { object } }, { MVM_JIT_REG_ADDR, { regi } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_rethrow: { MVMint16 obj = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { MVM_EX_THROW_DYN } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_LITERAL, { 0 } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: { MVMint16 regi = ins->operands[0].reg.orig; MVMint32 category = (MVMuint32)ins->operands[1].lit_i64; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { op == MVM_OP_throwcatdyn ? MVM_EX_THROW_DYN : op == MVM_OP_throwcatlex ? MVM_EX_THROW_LEX : MVM_EX_THROW_LEXOTIC } }, { MVM_JIT_LITERAL, { category } }, { MVM_JIT_REG_ADDR, { regi } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_resume: { MVMint16 exc = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { exc } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_die: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 str = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_REG_ADDR, { dst } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getdynlex: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CALLER } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_binddynlex: { MVMint16 name = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }, { MVM_JIT_REG_VAL, { val } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CALLER } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getlexouter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_isfalse: case MVM_OP_istrue: { MVMint16 obj = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } }, { MVM_JIT_LITERAL, { 0 } }, { MVM_JIT_LITERAL, { 0 } }, { MVM_JIT_LITERAL, { op == MVM_OP_isfalse } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 6, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_capturelex: { MVMint16 code = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { code } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_takeclosure: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_newlexotic: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 label = get_label_for_bb(tc, jgb, ins->operands[1].ins_bb); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { label } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_usecapture: case MVM_OP_savecapture: { MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_FRAME } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: case MVM_OP_cmp_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { a } }, { MVM_JIT_REG_VAL, { b } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); /* We rely on an implementation of the comparisons against -1, 0 and 1 * in emit.dasc */ if (op != MVM_OP_cmp_s) jgb_append_primitive(tc, jgb, ins); break; } case MVM_OP_flattenropes: { MVMint32 target = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_hllize: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMHLLConfig *hll_config = jgb->sg->sf->body.cu->body.hll_config; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_LITERAL_PTR, { (MVMint64)hll_config } }, { MVM_JIT_REG_ADDR, { dst } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_clone: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } /* repr ops */ case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_deletekey: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_setelemspos: case MVM_OP_splice: case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: case MVM_OP_hintfor: case MVM_OP_elems: if (!jgb_consume_reprop(tc, jgb, bb, ins)) { MVM_jit_log(tc, "BAIL: op <%s> (devirt attempted)\n", ins->info->name); return 0; } break; case MVM_OP_iterkey_s: case MVM_OP_iterval: case MVM_OP_iter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { invocant } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_continuationreset: { MVMint16 reg = ins->operands[0].reg.orig; MVMint16 tag = ins->operands[1].reg.orig; MVMint16 code = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { tag } }, { MVM_JIT_REG_VAL, { code } }, { MVM_JIT_REG_ADDR, { reg } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_continuationcontrol: { MVMint16 reg = ins->operands[0].reg.orig; MVMint16 protect = ins->operands[1].reg.orig; MVMint16 tag = ins->operands[2].reg.orig; MVMint16 code = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { protect } }, { MVM_JIT_REG_VAL, { tag } }, { MVM_JIT_REG_VAL, { code } }, { MVM_JIT_REG_ADDR, { reg } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_sp_boolify_iter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_findmeth: case MVM_OP_findmeth_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 name = (op == MVM_OP_findmeth_s ? ins->operands[2].reg.orig : ins->operands[2].lit_str_idx); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { (op == MVM_OP_findmeth_s ? MVM_JIT_REG_VAL : MVM_JIT_STR_IDX), { name } }, { MVM_JIT_REG_ADDR, { dst } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_multicachefind: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cache = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cache } }, { MVM_JIT_REG_VAL, { capture } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_multicacheadd: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cache = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; MVMint16 result = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cache } }, { MVM_JIT_REG_VAL, { capture } }, { MVM_JIT_REG_VAL, { result } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_can: case MVM_OP_can_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 name = (op == MVM_OP_can_s ? ins->operands[2].reg.orig : ins->operands[2].lit_str_idx); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { (op == MVM_OP_can_s ? MVM_JIT_REG_VAL : MVM_JIT_STR_IDX), { name } }, { MVM_JIT_REG_ADDR, { dst } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } /* coercion */ case MVM_OP_coerce_sn: case MVM_OP_coerce_ns: case MVM_OP_coerce_si: case MVM_OP_coerce_is: case MVM_OP_coerce_In: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; MVMJitRVMode rv_mode = ((op == MVM_OP_coerce_sn || op == MVM_OP_coerce_In) ? MVM_JIT_RV_NUM : op == MVM_OP_coerce_si ? MVM_JIT_RV_INT : MVM_JIT_RV_PTR); if (op == MVM_OP_coerce_ns) { args[1].type = MVM_JIT_REG_VAL_F; } jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, rv_mode, dst); break; } case MVM_OP_smrt_strify: case MVM_OP_smrt_numify: { MVMint16 obj = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_write_fhs: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 fho = ins->operands[1].reg.orig; MVMint16 str = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { fho } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_LITERAL, { 0 } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_box_n: case MVM_OP_box_s: case MVM_OP_box_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { op == MVM_OP_box_n ? MVM_JIT_REG_VAL_F : MVM_JIT_REG_VAL, { val } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_ADDR, { dst } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_unbox_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_unbox_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_unbox_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } /* string ops */ case MVM_OP_repeat_s: case MVM_OP_split: case MVM_OP_concat_s: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_escape: case MVM_OP_uc: case MVM_OP_lc: case MVM_OP_tc: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 string = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { string } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_ne_s: case MVM_OP_eq_s: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, MVM_OP_eq_s), 3, args, MVM_JIT_RV_INT, dst); if (op == MVM_OP_ne_s) { /* append not_i to negate ne_s */ MVMSpeshIns *not_i = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMSpeshIns)); not_i->info = MVM_op_get_op(MVM_OP_not_i); not_i->operands = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMSpeshOperand) * 2); not_i->operands[0].reg.orig = dst; not_i->operands[1].reg.orig = dst; jgb_append_primitive(tc, jgb, not_i); } break; } case MVM_OP_eqat_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { offset } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_chars: case MVM_OP_graphs_s: case MVM_OP_codes_s: case MVM_OP_flip: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; MVMJitRVMode rv_mode = (op == MVM_OP_flip ? MVM_JIT_RV_PTR : MVM_JIT_RV_INT); jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, rv_mode, dst); break; } case MVM_OP_join: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 sep = ins->operands[1].reg.orig; MVMint16 input = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { sep } }, { MVM_JIT_REG_VAL, { input } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_substr_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 string = ins->operands[1].reg.orig; MVMint16 start = ins->operands[2].reg.orig; MVMint16 length = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { string } }, { MVM_JIT_REG_VAL, { start } }, { MVM_JIT_REG_VAL, { length } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_index_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 haystack = ins->operands[1].reg.orig; MVMint16 needle = ins->operands[2].reg.orig; MVMint16 start = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { haystack } }, { MVM_JIT_REG_VAL, { needle } }, { MVM_JIT_REG_VAL, { start } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_iscclass: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cclass = ins->operands[1].reg.orig; MVMint16 str = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cclass } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_REG_VAL, { offset } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_findcclass: case MVM_OP_findnotcclass: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cclass = ins->operands[1].reg.orig; MVMint16 target = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMint16 count = ins->operands[4].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cclass } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { count } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 5, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_nfarunalt: { MVMint16 nfa = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].reg.orig; MVMint16 bstack = ins->operands[3].reg.orig; MVMint16 cstack = ins->operands[4].reg.orig; MVMint16 labels = ins->operands[5].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { nfa } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { bstack } }, { MVM_JIT_REG_VAL, { cstack } }, { MVM_JIT_REG_VAL, { labels } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_nfarunproto: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 nfa = ins->operands[1].reg.orig; MVMint16 target = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { nfa } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_nfafromstatelist: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 states = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { states } }, { MVM_JIT_REG_VAL, { type } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } /* bigint ops */ case MVM_OP_isbig_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_cmp_I: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: case MVM_OP_bor_I: case MVM_OP_band_I: case MVM_OP_bxor_I: case MVM_OP_lcm_I: case MVM_OP_gcd_I: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 type = ins->operands[3].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_div_In: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_brshift_I: case MVM_OP_blshift_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMint16 shift = ins->operands[2].reg.orig; MVMint16 type = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_REG_VAL, { shift } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_coerce_Is: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_LITERAL, { 10 } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_radix_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 radix = ins->operands[1].reg.orig; MVMint16 string = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMint16 flag = ins->operands[4].reg.orig; MVMint16 type = ins->operands[5].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { radix } }, { MVM_JIT_REG_VAL, { string } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { flag } }, { MVM_JIT_REG_VAL, { type } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 6, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_base_I: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 base = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_REG_VAL, { base } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_bool_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_bnot_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getcodeobj: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_sqrt_n: case MVM_OP_sin_n: case MVM_OP_cos_n: case MVM_OP_tan_n: case MVM_OP_asin_n: case MVM_OP_acos_n: case MVM_OP_atan_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_REG_VAL_F, { src } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 1, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_pow_n: case MVM_OP_atan2_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_REG_VAL_F, { a } }, { MVM_JIT_REG_VAL_F, { b } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_time_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 1, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_randscale_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 scale = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL_F, { scale } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_isnanorinf: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL_F, { src } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_nativecallinvoke: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 restype = ins->operands[1].reg.orig; MVMint16 site = ins->operands[2].reg.orig; MVMint16 cargs = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { restype } }, { MVM_JIT_REG_VAL, { site } }, { MVM_JIT_REG_VAL, { cargs } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } /* native references (as simple function calls for now) */ case MVM_OP_iscont_i: case MVM_OP_iscont_n: case MVM_OP_iscont_s: case MVM_OP_isrwcont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_assign_i: case MVM_OP_assign_n: case MVM_OP_assign_s: { MVMint16 target = ins->operands[0].reg.orig; MVMint16 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { value } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_decont_i: case MVM_OP_decont_n: case MVM_OP_decont_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getlexref_i: case MVM_OP_getlexref_n: case MVM_OP_getlexref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 outers = ins->operands[1].lex.outers; MVMuint16 idx = ins->operands[1].lex.idx; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { outers } }, { MVM_JIT_LITERAL, { idx } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getattrref_i: case MVM_OP_getattrref_n: case MVM_OP_getattrref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 class = ins->operands[2].reg.orig; MVMint16 name = ins->operands[3].lit_str_idx; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { class } }, { MVM_JIT_STR_IDX, { name } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getattrsref_i: case MVM_OP_getattrsref_n: case MVM_OP_getattrsref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 class = ins->operands[2].reg.orig; MVMint16 name = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { class } }, { MVM_JIT_REG_VAL, { name } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } /* profiling */ case MVM_OP_prof_allocated: { MVMint16 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_prof_exit: { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } } }; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 1, args, MVM_JIT_RV_VOID, -1); break; } /* special jumplist branch */ case MVM_OP_jumplist: { return jgb_consume_jumplist(tc, jgb, ins); } /* returning */ case MVM_OP_return: { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { 0 } }}; jgb_append_call_c(tc, jgb, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); jgb_append_branch(tc, jgb, MVM_JIT_BRANCH_EXIT, NULL); break; } case MVM_OP_return_o: case MVM_OP_return_s: case MVM_OP_return_n: case MVM_OP_return_i: { MVMint16 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } }, { MVM_JIT_LITERAL, { 0 } } }; if (op == MVM_OP_return_n) { args[1].type = MVM_JIT_REG_VAL_F; } jgb_append_call_c(tc, jgb, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); jgb_append_branch(tc, jgb, MVM_JIT_BRANCH_EXIT, NULL); break; } case MVM_OP_sp_guardconc: case MVM_OP_sp_guardtype: case MVM_OP_sp_guardcontconc: case MVM_OP_sp_guardconttype: case MVM_OP_sp_guardrwconc: case MVM_OP_sp_guardrwtype: jgb_append_guard(tc, jgb, ins); break; case MVM_OP_prepargs: { return jgb_consume_invoke(tc, jgb, ins); } default: { /* Check if it's an extop. */ MVMint32 emitted_extop = 0; if (ins->info->opcode == (MVMuint16)-1) { MVMExtOpRecord *extops = jgb->sg->sf->body.cu->body.extops; MVMuint16 num_extops = jgb->sg->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { MVMuint16 *fake_regs; if (!extops[i].no_jit && (fake_regs = try_fake_extop_regs(tc, ins))) { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL_PTR, { (MVMint64)fake_regs } }}; jgb_append_call_c(tc, jgb, extops[i].func, 2, args, MVM_JIT_RV_VOID, -1); if (ins->info->jittivity & MVM_JIT_INFO_INVOKISH) jgb_append_control(tc, jgb, ins, MVM_JIT_CONTROL_INVOKISH); MVM_jit_log(tc, "append extop: <%s>\n", ins->info->name); emitted_extop = 1; } break; } } } if (!emitted_extop) { MVM_jit_log(tc, "BAIL: op <%s>\n", ins->info->name); return 0; } } } return 1; } static MVMint32 jgb_consume_bb(MVMThreadContext *tc, JitGraphBuilder *jgb, MVMSpeshBB *bb) { MVMint32 label = get_label_for_bb(tc, jgb, bb); jgb->cur_bb = bb; jgb_append_label(tc, jgb, label); /* We always append a label update at the start of a basic block for now. * This may be more than is actually needed, but it's safe. The problem is * that a jump can move us out of the scope of an exception hander, and so * we need a location update. This came to light in the case that we left * an inline (which is a jump) and came back to a region where a handler * should be in force, and it failed to be. */ jgb_append_control(tc, jgb, bb->first_ins, MVM_JIT_CONTROL_DYNAMIC_LABEL); jgb->cur_ins = bb->first_ins; while (jgb->cur_ins) { jgb_before_ins(tc, jgb, jgb->cur_bb, jgb->cur_ins); if(!jgb_consume_ins(tc, jgb, jgb->cur_bb, jgb->cur_ins)) return 0; jgb_after_ins(tc, jgb, jgb->cur_bb, jgb->cur_ins); jgb->cur_ins = jgb->cur_ins->next; } return 1; } static MVMJitGraph *jgb_build(MVMThreadContext *tc, JitGraphBuilder *jgb) { MVMint32 i; MVMJitGraph * jg = MVM_spesh_alloc(tc, jgb->sg, sizeof(MVMJitGraph)); jg->sg = jgb->sg; jg->first_node = jgb->first_node; jg->last_node = jgb->last_node; /* find the last assigned label */ for (i = 0; i < jgb->num_labels; i++) if (jgb->labeleds[i] == NULL) break; jg->num_labels = i; jg->num_bbs = jgb->num_bbs; jg->bb_labels = jgb->bb_labels; jg->num_deopts = jgb->num_deopts; jg->deopts = jgb->deopts; jg->num_inlines = jgb->num_inlines; jg->inlines = jgb->inlines; jg->num_handlers = jgb->num_handlers; jg->handlers = jgb->handlers; return jg; } MVMJitGraph * MVM_jit_try_make_graph(MVMThreadContext *tc, MVMSpeshGraph *sg) { JitGraphBuilder jgb; if (!MVM_jit_support()) { return NULL; } if (tc->instance->jit_log_fh) { char *cuuid = MVM_string_utf8_encode_C_string(tc, sg->sf->body.cuuid); char *name = MVM_string_utf8_encode_C_string(tc, sg->sf->body.name); MVM_jit_log(tc, "Constructing JIT graph (cuuid: %s, name: '%s')\n", cuuid, name); MVM_free(cuuid); MVM_free(name); } jgb.sg = sg; /* ignore first BB, which always contains a NOP */ jgb.cur_bb = sg->entry->linear_next; jgb.cur_ins = jgb.cur_bb->first_ins; jgb.first_node = jgb.last_node = NULL; /* Total (expected) number of labels. May grow if there are more than 4 * deopt labels (OSR deopt labels or deopt_all labels). */ jgb.num_labels = sg->num_bbs + (sg->num_handlers * 3) + 4; /* The objects that are labeled (spesh ins or spesh bbs). May grow */ jgb.labeleds = MVM_spesh_alloc(tc, sg, sizeof(void*) * jgb.num_labels); /* bb labels are indexed by bb index (much wow) */ jgb.num_bbs = sg->num_bbs; jgb.bb_labels = MVM_spesh_alloc(tc, sg, sizeof(MVMint32) * sg->num_bbs); /* deopt points may grow */ jgb.num_deopts = 0; jgb.alloc_deopts = 2; jgb.deopts = MVM_spesh_alloc(tc, sg, sizeof(MVMJitDeopt) * 2); /* jit handlers are indexed by.. handler index (also much wow) */ jgb.num_handlers = sg->num_handlers; jgb.handlers = sg->num_handlers ? MVM_spesh_alloc(tc, sg, sizeof(MVMJitHandler) * sg->num_handlers) : NULL; /* guess what inlines are indexed by */ jgb.num_inlines = sg->num_inlines; jgb.inlines = sg->num_inlines ? MVM_spesh_alloc(tc, sg, sizeof(MVMJitInline) * sg->num_inlines) : NULL; /* loop over basic blocks, adding one after the other */ while (jgb.cur_bb) { if (!jgb_consume_bb(tc, &jgb, jgb.cur_bb)) return NULL; jgb.cur_bb = jgb.cur_bb->linear_next; } /* Check if we've added a instruction at all */ if (!jgb.first_node) return NULL; /* append the end-of-graph label */ jgb_append_label(tc, &jgb, get_label_for_graph(tc, &jgb, sg)); return jgb_build(tc, &jgb); } MoarVM-2015.11/src/jit/graph.h0000644000175000017500000001017512534320622014702 0ustar jnthnjnthn/* The MVMJitGraph is - for now - really a linked list of instructions. * It's likely I'll add complexity when it's needed */ struct MVMJitGraph { MVMSpeshGraph *sg; MVMJitNode *first_node; MVMJitNode *last_node; /* total number of labels, including deopt labels, handler labels, and inline start-stops labels */ MVMint32 num_labels; /* bb labels are all basic block label numbers, indexed by basic block number */ MVMint32 num_bbs; MVMint32 *bb_labels; MVMint32 num_deopts; MVMJitDeopt *deopts; MVMint32 num_handlers; MVMJitHandler *handlers; MVMint32 num_inlines; MVMJitInline *inlines; }; struct MVMJitDeopt { MVMint32 idx; MVMint32 label; }; struct MVMJitHandler { MVMint32 start_label; MVMint32 end_label; MVMint32 goto_label; }; struct MVMJitInline { MVMint32 start_label; MVMint32 end_label; }; /* A label (no more than a number) */ struct MVMJitLabel { MVMint32 name; }; struct MVMJitPrimitive { MVMSpeshIns * ins; }; struct MVMJitGuard { MVMSpeshIns * ins; MVMint32 deopt_target; MVMint32 deopt_offset; }; #define MVM_JIT_INFO_INVOKISH 1 #define MVM_JIT_INFO_THROWISH 2 typedef enum { MVM_JIT_CONTROL_INVOKISH, MVM_JIT_CONTROL_DYNAMIC_LABEL, MVM_JIT_CONTROL_THROWISH_PRE, MVM_JIT_CONTROL_THROWISH_POST, MVM_JIT_CONTROL_BREAKPOINT, } MVMJitControlType; struct MVMJitControl { MVMSpeshIns *ins; MVMJitControlType type; }; /* Special branch target for the exit */ #define MVM_JIT_BRANCH_EXIT -1 #define MVM_JIT_BRANCH_OUT -2 /* What does a branch need? a label to go to, an instruction to read */ struct MVMJitBranch { MVMint32 dest; MVMSpeshIns *ins; }; typedef enum { MVM_JIT_INTERP_TC, MVM_JIT_INTERP_CU, MVM_JIT_INTERP_FRAME, MVM_JIT_INTERP_PARAMS, MVM_JIT_INTERP_CALLER, } MVMJitInterpVar; typedef enum { MVM_JIT_INTERP_VAR, MVM_JIT_REG_VAL, MVM_JIT_REG_VAL_F, MVM_JIT_REG_ADDR, MVM_JIT_STR_IDX, MVM_JIT_LITERAL, MVM_JIT_LITERAL_F, MVM_JIT_LITERAL_64, MVM_JIT_LITERAL_PTR, MVM_JIT_REG_STABLE, MVM_JIT_REG_OBJBODY, } MVMJitArgType; struct MVMJitCallArg { MVMJitArgType type; union { MVMint64 lit_i64; MVMnum64 lit_n64; MVMJitInterpVar ivar; MVMint16 reg; void *ptr; } v; }; typedef enum { MVM_JIT_RV_VOID, /* ptr and int are mostly the same, but they might not be on all platforms */ MVM_JIT_RV_INT, MVM_JIT_RV_PTR, /* floats aren't */ MVM_JIT_RV_NUM, /* dereference and store */ MVM_JIT_RV_DEREF, /* store local at address */ MVM_JIT_RV_ADDR } MVMJitRVMode; struct MVMJitCallC { void *func_ptr; MVMJitCallArg *args; MVMuint16 num_args; MVMuint16 has_vargs; MVMJitRVMode rv_mode; MVMint16 rv_idx; }; struct MVMJitInvoke { MVMint16 callsite_idx; MVMint16 arg_count; MVMSpeshIns **arg_ins; MVMReturnType return_type; MVMint16 return_register; MVMint16 code_register; MVMint16 spesh_cand; MVMint8 is_fast; MVMint32 reentry_label; }; struct MVMJitJumpList { MVMint64 num_labels; MVMint16 reg; // labels of the goto's / jump instructions themselves MVMint32 *in_labels; // labels the goto's jump to MVMint32 *out_labels; }; /* Node types */ typedef enum { MVM_JIT_NODE_PRIMITIVE, MVM_JIT_NODE_CALL_C, MVM_JIT_NODE_BRANCH, MVM_JIT_NODE_LABEL, MVM_JIT_NODE_GUARD, MVM_JIT_NODE_INVOKE, MVM_JIT_NODE_JUMPLIST, MVM_JIT_NODE_CONTROL, } MVMJitNodeType; struct MVMJitNode { MVMJitNode * next; // linked list MVMJitNodeType type; // tag union { MVMJitPrimitive prim; MVMJitCallC call; MVMJitBranch branch; MVMJitLabel label; MVMJitGuard guard; MVMJitInvoke invoke; MVMJitJumpList jumplist; MVMJitControl control; } u; }; MVMJitGraph* MVM_jit_try_make_graph(MVMThreadContext *tc, MVMSpeshGraph *sg); MoarVM-2015.11/src/jit/log.c0000644000175000017500000000304712613656332014365 0ustar jnthnjnthn#include "moar.h" /* inline this? maybe */ void MVM_jit_log(MVMThreadContext *tc, const char * fmt, ...) { va_list args; va_start(args, fmt); if (tc->instance->jit_log_fh) { vfprintf(tc->instance->jit_log_fh, fmt, args); } va_end(args); } void MVM_jit_log_bytecode(MVMThreadContext *tc, MVMJitCode *code) { /* Filename format: moar-jit-%d.bin. number can consume at most 10 * bytes, moar-jit-.bin is 13 bytes, one byte for the zero at the * end, one byte for the directory separator is 25 bytes, plus the * length of the bytecode directory itself */ char * filename = MVM_malloc(strlen(tc->instance->jit_bytecode_dir) + 25); FILE * out; sprintf(filename, "%s/moar-jit-%04d.bin", tc->instance->jit_bytecode_dir, code->seq_nr); out = fopen(filename, "w"); if (out) { fwrite(code->func_ptr, sizeof(char), code->size, out); fclose(out); if (tc->instance->jit_bytecode_map) { char *frame_name = MVM_string_utf8_encode_C_string(tc, code->sf->body.name); char *frame_cuuid = MVM_string_utf8_encode_C_string(tc, code->sf->body.cuuid); /* I'd like to add linenumber and filename information, but it's really a lot of work at this point */ fprintf(tc->instance->jit_bytecode_map, "%s\t%s\t%s\n", filename, frame_name, frame_cuuid); MVM_free(frame_name); MVM_free(frame_cuuid); } } else { MVM_jit_log(tc, "ERROR: could dump bytecode in %s\n", filename); } MVM_free(filename); } MoarVM-2015.11/src/jit/log.h0000644000175000017500000000023212516136714014362 0ustar jnthnjnthnvoid MVM_jit_log(MVMThreadContext *tc, const char *fmt, ...) MVM_FORMAT(printf, 2, 3); void MVM_jit_log_bytecode(MVMThreadContext *tc, MVMJitCode *code); MoarVM-2015.11/src/jit/stub.c0000644000175000017500000000324112456307241014552 0ustar jnthnjnthn#include "moar.h" #include "dasm_proto.h" #include "dasm_x86.h" #include "emit.h" /* Stub file to mark our lack of support for this architecture. We should probably stub dasm, too, rather than include x86 */ const MVMint32 MVM_jit_support(void) { return 0; } const unsigned char * MVM_jit_actions(void) { return NULL; } const unsigned int MVM_jit_num_globals(void) { return 0; } void MVM_jit_emit_prologue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst) {} void MVM_jit_emit_epilogue(MVMThreadContext *tc, MVMJitGraph *jg, dasm_State **Dst) {} void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitPrimitive *prim, dasm_State **Dst) {} void MVM_jit_emit_call_c(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitCallC *call_spec, dasm_State **Dst) {} void MVM_jit_emit_branch(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitBranch *branch_spec, dasm_State **Dst) {} void MVM_jit_emit_label(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitLabel *label, dasm_State **Dst) {} void MVM_jit_emit_guard(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitGuard *guard, dasm_State **Dst) {} void MVM_jit_emit_invoke(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitInvoke *invoke, dasm_State **Dst) {} void MVM_jit_emit_jumplist(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitJumpList *jumplist, dasm_State **Dst) {} void MVM_jit_emit_control(MVMThreadContext *tc, MVMJitGraph *jg, MVMJitControl *ctrl, dasm_State **Dst) {} MoarVM-2015.11/src/main.c0000644000175000017500000001307012574526172013743 0ustar jnthnjnthn#include #include #include #include #if MVM_TRACING # define TRACING_OPT "[--tracing] " # define TRACING_USAGE "\n --tracing output a line to stderr on every interpreter instr" #else # define TRACING_OPT "" # define TRACING_USAGE "" #endif /* flags need to be sorted alphabetically */ enum { NOT_A_FLAG = -2, UNKNOWN_FLAG = -1, FLAG_CRASH, FLAG_DUMP, FLAG_FULL_CLEANUP, FLAG_HELP, FLAG_TRACING, FLAG_VERSION, OPT_EXECNAME, OPT_LIBPATH }; static const char *const FLAGS[] = { "--crash", "--dump", "--full-cleanup", "--help", "--tracing", "--version", }; static const char USAGE[] = "\ USAGE: moar [--crash] [--libpath=...] " TRACING_OPT "input.moarvm [program args]\n\ moar --dump input.moarvm\n\ moar --help\n\ \n\ --help display this message\n\ --dump dump the bytecode to stdout instead of executing\n\ --full-cleanup try to free all memory and exit cleanly\n\ --crash abort instead of exiting on unhandled exception\n\ --libpath specify path loadbytecode should search in\n\ --version show version information" TRACING_USAGE "\n\ \n\ The following environment variables are respected:\n\ \n\ MVM_SPESH_DISABLE Disables all dynamic optimization\n\ MVM_SPESH_NODELAY Run dynamic optimization even for cold frames\n\ MVM_SPESH_INLINE_DISABLE Disables inlining\n\ MVM_SPESH_OSR_DISABLE Disables on-stack replacement\n\ MVM_JIT_DISABLE Disables JITting to machine code\n\ MVM_SPESH_LOG Specifies a dynamic optimizer log file\n\ MVM_JIT_LOG Specifies a JIT-compiler log file\n\ MVM_JIT_BYTECODE_DIR Specifies a directory for JIT bytecode dumps\n\ MVM_CROSS_THREAD_WRITE_LOG Log unprotected cross-thread object writes to stderr\n\ "; static int cmp_flag(const void *key, const void *value) { return strcmp(key, *(char **)value); } static int starts_with(const char *str, const char *want) { size_t str_len = strlen(str); size_t want_len = strlen(want); return str_len < want_len ? 0 : strncmp(str, want, want_len) == 0; } static int parse_flag(const char *arg) { const char *const *found; if (!arg || arg[0] != '-') return NOT_A_FLAG; found = bsearch(arg, FLAGS, sizeof FLAGS / sizeof *FLAGS, sizeof *FLAGS, cmp_flag); if (found) return (int)(found - FLAGS); else if (starts_with(arg, "--libpath=")) return OPT_LIBPATH; else if (starts_with(arg, "--execname=")) return OPT_EXECNAME; else return UNKNOWN_FLAG; } int main(int argc, char *argv[]) { MVMInstance *instance; const char *input_file; const char *executable_name = NULL; const char *lib_path[8]; int dump = 0; int full_cleanup = 0; int argi = 1; int lib_path_i = 0; int flag; for (; (flag = parse_flag(argv[argi])) != NOT_A_FLAG; ++argi) { switch (flag) { case FLAG_CRASH: MVM_crash_on_error(); continue; case FLAG_DUMP: dump = 1; continue; case FLAG_FULL_CLEANUP: full_cleanup = 1; continue; case FLAG_HELP: puts(USAGE); return EXIT_SUCCESS; #if MVM_TRACING case FLAG_TRACING: MVM_interp_enable_tracing(); continue; #endif case OPT_EXECNAME: executable_name = argv[argi] + strlen("--execname="); continue; case OPT_LIBPATH: if (lib_path_i == 7) { /* 0..7 == 8 */ fprintf(stderr, "ERROR: Only up to eight --libpath options are allowed.\n"); return EXIT_FAILURE; } lib_path[lib_path_i++] = argv[argi] + strlen("--libpath="); continue; case FLAG_VERSION: { char *spesh_disable; char *jit_disable; printf("This is MoarVM version %s", MVM_VERSION); if (MVM_jit_support()) { printf(" built with JIT support"); spesh_disable = getenv("MVM_SPESH_DISABLE"); jit_disable = getenv("MVM_JIT_DISABLE"); if (spesh_disable && strlen(spesh_disable) != 0) { printf(" (disabled via MVM_SPESH_DISABLE)"); } else if (jit_disable && strlen(jit_disable) != 0) { printf(" (disabled via MVM_JIT_DISABLE)"); } } printf("\n"); return EXIT_SUCCESS; } default: fprintf(stderr, "ERROR: Unknown flag %s.\n\n%s\n", argv[argi], USAGE); return EXIT_FAILURE; } } lib_path[lib_path_i] = NULL; if (argi >= argc) { fprintf(stderr, "ERROR: Missing input file.\n\n%s\n", USAGE); return EXIT_FAILURE; } instance = MVM_vm_create_instance(); input_file = argv[argi++]; /* stash the rest of the raw command line args in the instance */ MVM_vm_set_clargs(instance, argc - argi, argv + argi); MVM_vm_set_prog_name(instance, input_file); MVM_vm_set_exec_name(instance, executable_name); MVM_vm_set_lib_path(instance, lib_path_i, lib_path); if (dump) MVM_vm_dump_file(instance, input_file); else MVM_vm_run_file(instance, input_file); if (full_cleanup) { MVM_vm_destroy_instance(instance); return EXIT_SUCCESS; } else { MVM_vm_exit(instance); } } MoarVM-2015.11/src/mast/compiler.c0000644000175000017500000017313212616160672015577 0ustar jnthnjnthn#include "moar.h" #include "nodes.h" /* Some constants. */ #define HEADER_SIZE 92 #define BYTECODE_VERSION 5 #define FRAME_HEADER_SIZE (11 * 4 + 3 * 2) #define FRAME_HANDLER_SIZE (4 * 4 + 2 * 2) #define FRAME_SLV_SIZE (2 * 2 + 2 * 4) #define SC_DEP_SIZE 4 #define EXTOP_SIZE (4 + 8) #define SCDEP_HEADER_OFFSET 12 #define EXTOP_HEADER_OFFSET 20 #define FRAME_HEADER_OFFSET 28 #define CALLSITE_HEADER_OFFSET 36 #define STRING_HEADER_OFFSET 44 #define SCDATA_HEADER_OFFSET 52 #define BYTECODE_HEADER_OFFSET 60 #define ANNOTATION_HEADER_OFFSET 68 #define HLL_NAME_HEADER_OFFSET 76 #define SPECIAL_FRAME_HEADER_OFFSET 80 #define EXTOP_BASE 1024 /* Frame flags. */ #define FRAME_FLAG_EXIT_HANDLER 1 #define FRAME_FLAG_IS_THUNK 2 #define FRAME_FLAG_HAS_CODE_OBJ 4 #define FRAME_FLAG_HAS_INDEX 32768 #define FRAME_FLAG_HAS_SLV 65536 typedef struct { /* callsite ID */ unsigned short callsite_id; /* the uthash hash handle. */ UT_hash_handle hash_handle; } CallsiteReuseEntry; /* Information about a handler. */ typedef struct { /* Offset of start of protected region from frame start. */ unsigned int start_offset; /* Offset of end of protected region, exclusive, from frame start. */ unsigned int end_offset; /* Exception categry mask. */ unsigned int category_mask; /* Handler action. */ unsigned short action; /* Local holding block to invoke, if invokey handler. */ unsigned short local; /* Label, which will need resolving. */ MASTNode *label; /* Local holding a label in case we have a labeled loop. */ unsigned short label_reg; } FrameHandler; /* Handler actions. */ #define HANDLER_UNWIND_GOTO 0 #define HANDLER_UNWIND_GOTO_OBJ 1 #define HANDLER_INVOKE 2 /* Information about a label. */ typedef struct { MAST_Label *label; MVMint32 offset; /* Negative if unknown. */ MVMuint16 num_resolve; MVMuint16 alloc_resolve; MVMuint32 *resolve; } LabelInfo; /* Describes the state for the frame we're currently compiling. */ typedef struct { /* Position of start of bytecode. */ unsigned int bytecode_start; /* Position of start of frame entry. */ unsigned int frame_start; /* Types of locals and lexicals, with counts. */ unsigned short *local_types; unsigned short *lexical_types; unsigned int num_locals; unsigned int num_lexicals; /* Number of annotations. */ unsigned int num_annotations; /* Handlers count and list. */ unsigned int num_handlers; FrameHandler *handlers; /* Labels we have so far (either through finding them or finding a need * to fix them up). */ LabelInfo *labels; unsigned int num_labels; unsigned int alloc_labels; /* Number of unresolved labels. */ unsigned int unresolved_labels; } FrameState; /* Describes the current writer state for the compilation unit as a whole. */ typedef struct { /* The set of node types. */ MASTNodeTypes *types; /* The current frame and frame count. */ FrameState *cur_frame; unsigned int num_frames; /* String heap and seen hash mapping known strings to indexes. */ MASTNode *strings; MASTNode *seen_strings; /* The SC dependencies segment; we know the size up front. */ char *scdep_seg; unsigned int scdep_bytes; /* The extension ops segment; we know the size ahead of time. */ char *extops_seg; unsigned int extops_bytes; unsigned int num_extops; /* The frame segment. */ char *frame_seg; unsigned int frame_pos; unsigned int frame_alloc; /* The callsite segment and number of callsites. */ char *callsite_seg; unsigned int callsite_pos; unsigned int callsite_alloc; unsigned int num_callsites; /* The bytecode segment. */ char *bytecode_seg; unsigned int bytecode_pos; unsigned int bytecode_alloc; /* The annotation segment. */ char *annotation_seg; unsigned int annotation_pos; unsigned int annotation_alloc; /* Current instruction info */ const MVMOpInfo *current_op_info; /* Zero-based index of current frame */ unsigned int current_frame_idx; /* Zero-based index of MAST instructions */ unsigned int current_ins_idx; /* Zero-based index of current operand */ unsigned int current_operand_idx; /* The compilation unit we're compiling. */ MAST_CompUnit *cu; /* Hash for callsite descriptor strings to callsite IDs */ CallsiteReuseEntry *callsite_reuse_head; /* Last Annotated node, for error reporting */ MAST_Annotated *last_annotated; } WriterState; static unsigned int umax(unsigned int a, unsigned int b); static void memcpy_endian(char *dest, const void *src, size_t size); static void write_int64(char *buffer, size_t offset, unsigned long long value); static void write_int32(char *buffer, size_t offset, unsigned int value); static void write_int16(char *buffer, size_t offset, unsigned short value); static void write_int8(char *buffer, size_t offset, unsigned char value); static void write_double(char *buffer, size_t offset, double value); static void ensure_space(VM, char **buffer, unsigned int *alloc, unsigned int pos, unsigned int need); static void cleanup_frame(VM, FrameState *fs); static void cleanup_all(VM, WriterState *ws); static unsigned int get_string_heap_index(VM, WriterState *ws, VMSTR *strval); static unsigned short get_frame_index(VM, WriterState *ws, MASTNode *frame); static unsigned short type_to_local_type(VM, WriterState *ws, MASTNode *type); static void compile_operand(VM, WriterState *ws, unsigned char op_flags, MASTNode *operand); static unsigned short get_callsite_id(VM, WriterState *ws, MASTNode *flags, MASTNode *args); static void compile_instruction(VM, WriterState *ws, MASTNode *node); static void compile_frame(VM, WriterState *ws, MASTNode *node, unsigned short idx); static char * form_string_heap(VM, WriterState *ws, unsigned int *string_heap_size); static char * form_bytecode_output(VM, WriterState *ws, unsigned int *bytecode_size); char * MVM_mast_compile(VM, MASTNode *node, MASTNodeTypes *types, unsigned int *size); static unsigned int umax(unsigned int a, unsigned int b) { return a > b ? a : b; } /* copies memory dependent on endianness */ static void memcpy_endian(char *dest, const void *src, size_t size) { #ifdef MVM_BIGENDIAN size_t i; char *srcbytes = (char *)src; for (i = 0; i < size; i++) dest[size - i - 1] = srcbytes[i]; #else memcpy(dest, src, size); #endif } /* Writes an int64 into a buffer. */ static void write_int64(char *buffer, size_t offset, unsigned long long value) { memcpy_endian(buffer + offset, &value, 8); } /* Writes an int32 into a buffer. */ static void write_int32(char *buffer, size_t offset, unsigned int value) { memcpy_endian(buffer + offset, &value, 4); } /* Writes an int16 into a buffer. */ static void write_int16(char *buffer, size_t offset, unsigned short value) { memcpy_endian(buffer + offset, &value, 2); } /* Writes an int8 into a buffer. */ static void write_int8(char *buffer, size_t offset, unsigned char value) { memcpy(buffer + offset, &value, 1); } /* Writes an double into a buffer. */ static void write_double(char *buffer, size_t offset, double value) { memcpy_endian(buffer + offset, &value, 8); } /* Ensures the specified buffer has enough space and expands it if so. */ static void ensure_space(VM, char **buffer, unsigned int *alloc, unsigned int pos, unsigned int need) { if (pos + need > *alloc) { do { *alloc = *alloc * 2; } while (pos + need > *alloc); *buffer = (char *)MVM_realloc(*buffer, *alloc); } } /* Cleans up all allocated memory related to a frame. */ static void cleanup_frame(VM, FrameState *fs) { if (fs->local_types) MVM_free(fs->local_types); if (fs->lexical_types) MVM_free(fs->lexical_types); if (fs->handlers) MVM_free(fs->handlers); if (fs->labels) { MVMuint32 i; for (i = 0; i < fs->num_labels; i++) if (fs->labels[i].alloc_resolve) MVM_free(fs->labels[i].resolve); MVM_free(fs->labels); } MVM_free(fs); } /* Cleans up all allocated memory related to this compilation. */ static void cleanup_all(VM, WriterState *ws) { if (ws->cur_frame) cleanup_frame(vm, ws->cur_frame); if (ws->scdep_seg) MVM_free(ws->scdep_seg); if (ws->extops_seg) MVM_free(ws->extops_seg); if (ws->frame_seg) MVM_free(ws->frame_seg); if (ws->callsite_seg) MVM_free(ws->callsite_seg); if (ws->bytecode_seg) MVM_free(ws->bytecode_seg); if (ws->annotation_seg) MVM_free(ws->annotation_seg); MVM_HASH_DESTROY(hash_handle, CallsiteReuseEntry, ws->callsite_reuse_head); MVM_free(ws); } /* Gets the index of a string already in the string heap, or * adds it to the heap if it's not already there. */ static unsigned int get_string_heap_index(VM, WriterState *ws, VMSTR *strval) { if (EXISTSKEY(vm, ws->seen_strings, strval)) { return (unsigned int)ATKEY_I(vm, ws->seen_strings, strval); } else { unsigned int index = (unsigned int)ELEMS(vm, ws->strings); if (index >= 0x7FFFFFFF) { cleanup_all(vm, ws); DIE(vm, "Too many strings in compilation unit"); } BINDPOS_S(vm, ws->strings, index, strval); BINDKEY_I(vm, ws->seen_strings, strval, index); return index; } } /* Locates the index of a frame. */ static unsigned short get_frame_index(VM, WriterState *ws, MASTNode *frame) { if (((MAST_Frame *)frame)->flags & FRAME_FLAG_HAS_INDEX) { return (short)((MAST_Frame *)frame)->index; } else { int num_frames = ELEMS(vm, ws->cu->frames); unsigned short i; for (i = 0; i < num_frames; i++) if (ATPOS(vm, ws->cu->frames, i) == frame) return i; cleanup_all(vm, ws); DIE(vm, "MAST::Frame passed for code ref not found in compilation unit"); } } /* Takes a 6model object type and turns it into a local/lexical type flag. */ static unsigned short type_to_local_type(VM, WriterState *ws, MASTNode *type) { const MVMStorageSpec *ss; if (VM_OBJ_IS_NULL(type)) return MVM_reg_obj; ss = REPR(type)->get_storage_spec(vm, STABLE(type)); if (ss->inlineable) { switch (ss->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: switch (ss->bits) { case 8: return MVM_reg_int8; case 16: return MVM_reg_int16; case 32: return MVM_reg_int32; case 64: return MVM_reg_int64; default: cleanup_all(vm, ws); DIE(vm, "Invalid int size for local/lexical"); } break; case MVM_STORAGE_SPEC_BP_NUM: switch (ss->bits) { case 32: return MVM_reg_num32; case 64: return MVM_reg_num64; default: cleanup_all(vm, ws); DIE(vm, "Invalid num size for local/lexical"); } break; case MVM_STORAGE_SPEC_BP_STR: return MVM_reg_str; default: cleanup_all(vm, ws); DIE(vm, "Type used for local/lexical has invalid boxed primitive in storage spec"); } } else { return MVM_reg_obj; } } /* Grows label storage. */ static void add_label(VM, FrameState *fs, MAST_Label *l, MVMint32 offset) { if (fs->num_labels == fs->alloc_labels) { if (fs->alloc_labels) fs->alloc_labels *= 2; else fs->alloc_labels = 8; fs->labels = MVM_realloc(fs->labels, fs->alloc_labels * sizeof(LabelInfo)); } fs->labels[fs->num_labels].label = l; fs->labels[fs->num_labels].offset = offset; fs->labels[fs->num_labels].resolve = NULL; fs->labels[fs->num_labels].num_resolve = 0; fs->labels[fs->num_labels].alloc_resolve = 0; fs->num_labels++; } /* Takes a label and either writes its offset if we already saw it, or writes * a zero and records that a fixups is needed. */ static void write_label_or_add_fixup(VM, WriterState *ws, MAST_Label *l) { FrameState *fs = ws->cur_frame; LabelInfo *info = NULL; MVMuint32 i; /* Ensure we've space to write an offset. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); /* Look for the label. */ for (i = 0; i < fs->num_labels; i++) { if (fs->labels[i].label == l) { /* Found it. If we know its offset, write and we're done. */ MVMint32 offset = fs->labels[i].offset; if (offset >= 0) { write_int32(ws->bytecode_seg, ws->bytecode_pos, offset); ws->bytecode_pos += 4; return; } /* Otherwise, note this label to add the resolve need to. */ info = &(fs->labels[i]); break; } } /* If we don't have an entry for this label yet, add it. */ if (!info) { add_label(vm, fs, l, -1); info = &(fs->labels[fs->num_labels - 1]); } if (info->num_resolve == info->alloc_resolve) { if (info->alloc_resolve) info->alloc_resolve *= 2; else info->alloc_resolve = 8; info->resolve = MVM_realloc(info->resolve, info->alloc_resolve * sizeof(MVMuint32)); } info->resolve[info->num_resolve] = ws->bytecode_pos; info->num_resolve++; fs->unresolved_labels++; /* Write zero, to be fixed up later. */ write_int32(ws->bytecode_seg, ws->bytecode_pos, 0); ws->bytecode_pos += 4; } /* Takes a label, and either adds it to the labels collection or, if it's been * seen already, resolves its fixups. */ static void add_label_and_resolve_fixups(VM, WriterState *ws, MAST_Label *l) { FrameState *fs = ws->cur_frame; MVMuint32 offset = ws->bytecode_pos - ws->cur_frame->bytecode_start; MVMuint32 i, j; /* See if it has an existing entry. */ for (i = 0; i < fs->num_labels; i++) { if (fs->labels[i].label == l) { /* Found it. Must not already have an offset, or it's a dupe. */ if (fs->labels[i].offset < 0) { /* Fix up existing usages. */ MVMuint32 *resolve = fs->labels[i].resolve; MVMuint32 nr = fs->labels[i].num_resolve; for (j = 0; j < nr; j++) write_int32(ws->bytecode_seg, resolve[j], offset); fs->labels[i].offset = offset; fs->labels[i].alloc_resolve = 0; fs->labels[i].num_resolve = 0; fs->unresolved_labels -= nr; MVM_free(fs->labels[i].resolve); } else { cleanup_all(vm, ws); DIE(vm, "Duplicate label"); } return; } } /* If we get here, no entry; create one. */ add_label(vm, fs, l, offset); } /* Rreturns a label's offset, dying if it's not possible. */ static MVMuint32 demand_label_offset(VM, WriterState *ws, MAST_Label *l, const char *error) { FrameState *fs = ws->cur_frame; MVMuint32 nl = fs->num_labels; MVMuint32 i; for (i = 0; i < nl; i++) { if (fs->labels[i].label == l) { if (fs->labels[i].offset >= 0) return fs->labels[i].offset; break; } } cleanup_all(vm, ws); DIE(vm, "%s", error); } /* Compiles the operand to an instruction; this involves checking * that we have a node of the correct type for it and writing out * the appropriate thing to the bytecode stream. */ static void compile_operand(VM, WriterState *ws, unsigned char op_flags, MASTNode *operand) { unsigned char op_rw = op_flags & MVM_operand_rw_mask; unsigned char op_type = op_flags & MVM_operand_type_mask; unsigned short int local_type; if (op_rw == MVM_operand_literal) { /* Literal; go by type. */ switch (op_type) { case MVM_operand_int64: { if (ISTYPE(vm, operand, ws->types->IVal)) { MAST_IVal *iv = GET_IVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 8); write_int64(ws->bytecode_seg, ws->bytecode_pos, iv->value); ws->bytecode_pos += 8; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::IVal, but didn't get one"); } break; } case MVM_operand_int16: { if (ISTYPE(vm, operand, ws->types->IVal)) { MAST_IVal *iv = GET_IVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); if (iv->value > 32767 || iv->value < -32768) { cleanup_all(vm, ws); DIE(vm, "Value outside range of 16-bit MAST::IVal"); } write_int16(ws->bytecode_seg, ws->bytecode_pos, (short)iv->value); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::IVal, but didn't get one"); } break; } case MVM_operand_num64: { if (ISTYPE(vm, operand, ws->types->NVal)) { MAST_NVal *nv = GET_NVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 8); write_double(ws->bytecode_seg, ws->bytecode_pos, nv->value); ws->bytecode_pos += 8; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::NVal, but didn't get one"); } break; } case MVM_operand_str: { if (ISTYPE(vm, operand, ws->types->SVal)) { MAST_SVal *sv = GET_SVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int32(ws->bytecode_seg, ws->bytecode_pos, get_string_heap_index(vm, ws, sv->value)); ws->bytecode_pos += 4; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::SVal, but didn't get one"); } break; } case MVM_operand_ins: { if (ISTYPE(vm, operand, ws->types->Label)) { write_label_or_add_fixup(vm, ws, GET_Label(operand)); } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Label, but didn't get one"); } break; } case MVM_operand_coderef: { if (ISTYPE(vm, operand, ws->types->Frame)) { /* Find the frame index in the compilation unit. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, get_frame_index(vm, ws, operand)); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Frame, but didn't get one"); } break; } default: cleanup_all(vm, ws); DIE(vm, "Unhandled literal type in MAST compiler"); } } else if (op_rw == MVM_operand_read_reg || op_rw == MVM_operand_write_reg) { /* The operand node had best be a MAST::Local. */ if (ISTYPE(vm, operand, ws->types->Local)) { MAST_Local *l = GET_Local(operand); /* Ensure it's within the set of known locals. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range"); } /* Check the type matches. */ local_type = ws->cur_frame->local_types[l->index]; if (op_type != local_type << 3 && op_type != MVM_operand_type_var) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; unsigned int current_operand_idx = ws->current_operand_idx; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s', operand %u, " "MAST::Local of wrong type (%u) specified; expected %u", current_frame_idx, current_ins_idx, name, current_operand_idx, local_type, (op_type >> 3)); } /* Write the operand type. */ if (l->index < 0 || l->index > 32768) DIE(vm, "Frame %u local access out of range", ws->current_frame_idx); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->index); ws->bytecode_pos += 2; } else { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; unsigned int current_operand_idx = ws->current_operand_idx; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s', operand %u, expected MAST::Local, but didn't get one", current_frame_idx, current_ins_idx, name, current_operand_idx); } } else if (op_rw == MVM_operand_read_lex || op_rw == MVM_operand_write_lex) { /* The operand node should be a MAST::Lexical. */ if (ISTYPE(vm, operand, ws->types->Lexical)) { MAST_Lexical *l = GET_Lexical(operand); /* Write the index, then the frame count. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->index); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->frames_out); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Lexical, but didn't get one"); } } else { cleanup_all(vm, ws); DIE(vm, "Unknown operand type cannot be compiled"); } ws->current_operand_idx++; } /* Takes a set of flags describing a callsite. Writes out a callsite * descriptor and returns the index of it. */ static unsigned short get_callsite_id(VM, WriterState *ws, MASTNode *flag_node, MASTNode *args) { unsigned int num_nameds = 0; unsigned short i, identifier_len; unsigned char *flags, *identifier; unsigned int *named_idxs; CallsiteReuseEntry *entry = NULL; /* Get callsite elements and work out if a padding byte will be needed. */ unsigned short elems = (unsigned short)ELEMS(vm, flag_node); unsigned short align = elems % 2; /* See if the callsite has any named args, and get string pool entries * for them if so. */ flags = (unsigned char *)MVM_malloc(elems); named_idxs = (unsigned int *)MVM_malloc(elems * sizeof(int)); for (i = 0; i < elems; i++) { flags[i] = (unsigned char)ATPOS_I_C(vm, flag_node, i); if (flags[i] & (MVM_CALLSITE_ARG_NAMED)) { MASTNode *argname = ATPOS(vm, args, i + num_nameds); if (ISTYPE(vm, argname, ws->types->SVal)) { named_idxs[num_nameds] = get_string_heap_index(vm, ws, ((MAST_SVal *)argname)->value); num_nameds++; } else { DIE(vm, "Malformed callsite args: missing MAST::SVal for argument name"); } } } /* See if we already know this callsite. */ identifier_len = elems + num_nameds * sizeof(int); identifier = MVM_malloc(identifier_len); memcpy(identifier, flags, elems); memcpy(identifier + elems, named_idxs, identifier_len - elems); HASH_FIND(hash_handle, ws->callsite_reuse_head, identifier, identifier_len, entry); if (entry) { MVM_free(flags); MVM_free(named_idxs); MVM_free(identifier); return entry->callsite_id; } entry = (CallsiteReuseEntry *)MVM_malloc(sizeof(CallsiteReuseEntry)); entry->callsite_id = (unsigned short)ws->num_callsites; HASH_ADD_KEYPTR(hash_handle, ws->callsite_reuse_head, identifier, identifier_len, entry); /* Emit callsite; be sure to pad if there's uneven number of flags. */ ensure_space(vm, &ws->callsite_seg, &ws->callsite_alloc, ws->callsite_pos, 2 + elems + align); write_int16(ws->callsite_seg, ws->callsite_pos, elems); ws->callsite_pos += 2; for (i = 0; i < elems; i++) write_int8(ws->callsite_seg, ws->callsite_pos++, flags[i]); if (align) write_int8(ws->callsite_seg, ws->callsite_pos++, 0); /* Emit any nameds. */ if (num_nameds) { ensure_space(vm, &ws->callsite_seg, &ws->callsite_alloc, ws->callsite_pos, 4 * num_nameds); for (i = 0; i < num_nameds; i++) { write_int32(ws->callsite_seg, ws->callsite_pos, named_idxs[i]); ws->callsite_pos += 4; } } MVM_free(flags); MVM_free(named_idxs); return (unsigned short)ws->num_callsites++; } #define OVERRIDE_WITH_32 1 #define OVERRIDE_WITH_16 2 /* Compiles an instruction (which may actaully be any of the * nodes valid directly in a Frame's instruction list, which * means labels are valid too). */ static void compile_instruction(VM, WriterState *ws, MASTNode *node) { if (ISTYPE(vm, node, ws->types->Op)) { MAST_Op *o = GET_Op(node); const MVMOpInfo *info; int i; unsigned char override_second_argument = 0; /* Look up opcode and get argument info. */ unsigned short op = o->op; info = MVM_op_get_op(op); if (!info) DIE(vm, "Invalid op specified in instruction %d", op); ws->current_op_info = info; ws->current_operand_idx = 0; /* Ensure argument count matches up. */ if (info->num_operands != 0 && ELEMS(vm, o->operands) != info->num_operands) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s' has invalid number (%u) of operands; needs %u.", current_frame_idx, current_ins_idx, name, ELEMS(vm, o->operands), info->num_operands); } /* If we're outputting a const_i64 instruction, we may want to */ /* turn it into a const_i64_32 or const_i64_16 instead if it fits */ if (op == MVM_OP_const_i64) { MASTNode *operand = ATPOS(vm, o->operands, 1); MAST_IVal *iv = GET_IVal(operand); if (INT16_MIN <= iv->value && iv->value <= INT16_MAX) { override_second_argument = OVERRIDE_WITH_16; } else if (INT32_MIN <= iv->value && iv->value <= INT32_MAX) { override_second_argument = OVERRIDE_WITH_32; } } /* Write opcode. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); if (override_second_argument == 0) write_int16(ws->bytecode_seg, ws->bytecode_pos, op); else if (override_second_argument == OVERRIDE_WITH_16) write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_const_i64_16); else if (override_second_argument == OVERRIDE_WITH_32) write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_const_i64_32); ws->bytecode_pos += 2; /* Write operands. */ for (i = 0; i < info->num_operands; i++) { if (i == 1 && override_second_argument) { MASTNode *operand = ATPOS(vm, o->operands, 1); MAST_IVal *iv = GET_IVal(operand); if (override_second_argument == OVERRIDE_WITH_32) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int32(ws->bytecode_seg, ws->bytecode_pos, (MVMint32)iv->value); ws->bytecode_pos += 4; } else { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, (MVMint16)iv->value); ws->bytecode_pos += 2; } } else { compile_operand(vm, ws, info->operands[i], ATPOS(vm, o->operands, i)); } } } else if (ISTYPE(vm, node, ws->types->ExtOp)) { MAST_ExtOp *o = GET_ExtOp(node); MASTNode *operands; int i, num_operands; /* Look up opcode and get argument info. */ unsigned short op = o->op; if (op < EXTOP_BASE || (op - EXTOP_BASE) >= ELEMS(vm, ws->cu->extop_sigs)) DIE(vm, "Invalid extension op %d specified", op); operands = ATPOS(vm, ws->cu->extop_sigs, op - EXTOP_BASE); if (VM_OBJ_IS_NULL(operands)) DIE(vm, "Missing extension op operand array for instruction %d", op); ws->current_op_info = NULL; ws->current_operand_idx = 0; /* Ensure argument count matches up. */ num_operands = ELEMS(vm, operands); if (ELEMS(vm, o->operands) != num_operands) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; char *c_name = VM_STRING_TO_C_STRING(vm, o->name); char *waste[] = { c_name, NULL }; cleanup_all(vm, ws); DIE_FREE(vm, waste, "At Frame %u, Instruction %u, op '%s' has invalid number (%u) of operands; needs %u.", current_frame_idx, current_ins_idx, c_name, ELEMS(vm, o->operands), num_operands); } /* Write opcode. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, op); ws->bytecode_pos += 2; /* Write operands. */ for (i = 0; i < num_operands; i++) compile_operand(vm, ws, ATPOS_I(vm, operands, i), ATPOS(vm, o->operands, i)); } else if (ISTYPE(vm, node, ws->types->Label)) { add_label_and_resolve_fixups(vm, ws, GET_Label(node)); } else if (ISTYPE(vm, node, ws->types->Call)) { MAST_Call *c = GET_Call(node); unsigned char call_op = MVM_OP_invoke_v; unsigned char res_type = 0; unsigned short num_flags, flag_pos, arg_pos; /* Emit callsite (may re-use existing one) and emit loading of it. */ unsigned short callsite_id = get_callsite_id(vm, ws, c->flags, c->args); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_prepargs); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, callsite_id); ws->bytecode_pos += 2; /* for errors */ ws->current_op_info = MVM_op_get_op(MVM_OP_prepargs); ws->current_operand_idx = 0; /* Set up args. */ num_flags = (unsigned short)ELEMS(vm, c->flags); arg_pos = 0; for (flag_pos = 0; flag_pos < num_flags; flag_pos++) { /* Handle any special flags. */ unsigned char flag = (unsigned char)ATPOS_I_C(vm, c->flags, flag_pos); if (flag & MVM_CALLSITE_ARG_NAMED) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 6); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_argconst_s); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_str, ATPOS(vm, c->args, arg_pos)); arg_pos++; } else if (flag & MVM_CALLSITE_ARG_FLAT) { /* don't need to do anything special */ } /* Now go by flag type. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 6); if (flag & MVM_CALLSITE_ARG_OBJ) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_o); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_obj, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_STR) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_s); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_str, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_INT) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_i); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_int64, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_NUM) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_n); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_num64, ATPOS(vm, c->args, arg_pos)); } else { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; cleanup_all(vm, ws); /* DIE(vm, "At Frame %u, Instruction %u, op '%s', " "file %s, line %u, unhandled arg type %u.", current_frame_idx, current_ins_idx, name, ws->last_annotated ? VM_STRING_TO_C_STRING(vm, ws->last_annotated->file) : "", ws->last_annotated ? ws->last_annotated->line : 0, flag); */ DIE(vm, "At Frame %u, Instruction %u, op '%s', unhandled arg type %u.", current_frame_idx, current_ins_idx, name, flag); } arg_pos++; } /* Select operation based on return type. */ if (ISTYPE(vm, c->result, ws->types->Local)) { MAST_Local *l = GET_Local(c->result); /* Ensure it's within the set of known locals. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range"); } /* Go by type. */ switch (ws->cur_frame->local_types[l->index]) { case MVM_reg_int64: call_op = MVM_OP_invoke_i; res_type = MVM_operand_int64; break; case MVM_reg_num64: call_op = MVM_OP_invoke_n; res_type = MVM_operand_num64; break; case MVM_reg_str: call_op = MVM_OP_invoke_s; res_type = MVM_operand_str; break; case MVM_reg_obj: call_op = MVM_OP_invoke_o; res_type = MVM_operand_obj; break; default: cleanup_all(vm, ws); DIE(vm, "Invalid MAST::Local type for return value"); } } /* Emit the invocation op. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 6); write_int16(ws->bytecode_seg, ws->bytecode_pos, call_op); ws->bytecode_pos += 2; if (call_op != MVM_OP_invoke_v) compile_operand(vm, ws, MVM_operand_read_reg | res_type, c->result); compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_obj, c->target); } else if (ISTYPE(vm, node, ws->types->Annotated)) { MAST_Annotated *a = GET_Annotated(node); unsigned int i; unsigned int num_ins = ELEMS(vm, a->instructions); unsigned int offset = ws->bytecode_pos - ws->cur_frame->bytecode_start; ws->last_annotated = a; ensure_space(vm, &ws->annotation_seg, &ws->annotation_alloc, ws->annotation_pos, 12); write_int32(ws->annotation_seg, ws->annotation_pos, offset); write_int32(ws->annotation_seg, ws->annotation_pos + 4, get_string_heap_index(vm, ws, a->file)); write_int32(ws->annotation_seg, ws->annotation_pos + 8, (unsigned int)a->line); ws->annotation_pos += 12; ws->cur_frame->num_annotations++; for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, ATPOS(vm, a->instructions, i)); } else if (ISTYPE(vm, node, ws->types->HandlerScope)) { MAST_HandlerScope *hs = GET_HandlerScope(node); unsigned int i; unsigned int num_ins = ELEMS(vm, hs->instructions); unsigned int start = ws->bytecode_pos - ws->cur_frame->bytecode_start; unsigned int end; for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, ATPOS(vm, hs->instructions, i)); end = ws->bytecode_pos - ws->cur_frame->bytecode_start; ws->cur_frame->num_handlers++; if (ws->cur_frame->handlers) ws->cur_frame->handlers = (FrameHandler *)MVM_realloc(ws->cur_frame->handlers, ws->cur_frame->num_handlers * sizeof(FrameHandler)); else ws->cur_frame->handlers = (FrameHandler *)MVM_malloc( ws->cur_frame->num_handlers * sizeof(FrameHandler)); i = ws->cur_frame->num_handlers - 1; ws->cur_frame->handlers[i].start_offset = start; ws->cur_frame->handlers[i].end_offset = end; ws->cur_frame->handlers[i].category_mask = (unsigned int)hs->category_mask; ws->cur_frame->handlers[i].action = (unsigned short)hs->action; if (ws->cur_frame->handlers[i].category_mask & MVM_EX_CAT_LABELED) { if (ISTYPE(vm, hs->label_local, ws->types->Local)) { MAST_Local *l = GET_Local(hs->label_local); /* Ensure it's within the set of known locals and an object. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range in HandlerScope"); } if (ws->cur_frame->local_types[l->index] != MVM_reg_obj) { cleanup_all(vm, ws); DIE(vm, "MAST::Local for HandlerScope must be an object"); } /* Stash local index. */ ws->cur_frame->handlers[i].label_reg = (unsigned short)l->index; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Local required for HandlerScope with loop label"); } } /* Ensure we have a label. */ if (ISTYPE(vm, hs->goto_label, ws->types->Label)) { ws->cur_frame->handlers[i].label = hs->goto_label; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Label required for HandlerScope goto"); } /* May need a block also. */ if (hs->action == HANDLER_INVOKE) { if (ISTYPE(vm, hs->block_local, ws->types->Local)) { MAST_Local *l = GET_Local(hs->block_local); /* Ensure it's within the set of known locals and an object. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range in HandlerScope"); } if (ws->cur_frame->local_types[l->index] != MVM_reg_obj) { cleanup_all(vm, ws); DIE(vm, "MAST::Local for HandlerScope must be an object"); } /* Stash local index. */ ws->cur_frame->handlers[i].local = (unsigned short)l->index; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Local required for HandlerScope invoke action"); } } else if (hs->action == HANDLER_UNWIND_GOTO || hs->action == HANDLER_UNWIND_GOTO_OBJ) { ws->cur_frame->handlers[i].local = 0; } else { cleanup_all(vm, ws); DIE(vm, "Invalid action code for handler scope"); } } else { cleanup_all(vm, ws); DIE(vm, "Invalid MAST node in instruction list (must be Op, ExtOp, Call, Label, or Annotated)"); } ws->current_ins_idx++; } /* Compiles a frame. */ static void compile_frame(VM, WriterState *ws, MASTNode *node, unsigned short idx) { MAST_Frame *f; FrameState *fs; unsigned int i, num_ins, instructions_start; MASTNode *last_inst = NULL; MVMuint16 num_slvs; /* Ensure we have a node of the right type. */ if (!ISTYPE(vm, node, ws->types->Frame)) { cleanup_all(vm, ws); DIE(vm, "Child of CompUnit must be a Frame"); } f = GET_Frame(node); /* Allocate frame state. */ fs = ws->cur_frame = (FrameState *)MVM_malloc(sizeof(FrameState)); fs->bytecode_start = ws->bytecode_pos; fs->frame_start = ws->frame_pos; fs->labels = NULL; fs->num_labels = 0; fs->alloc_labels = 0; fs->unresolved_labels = 0; /* Count locals and lexicals. */ fs->num_locals = ELEMS(vm, f->local_types); fs->num_lexicals = ELEMS(vm, f->lexical_types); if (fs->num_locals > (1 << 16)) { cleanup_all(vm, ws); DIE(vm, "Too many locals in this frame."); } if (ELEMS(vm, f->lexical_names) != fs->num_lexicals) { cleanup_all(vm, ws); DIE(vm, "Lexical types list and lexical names list have unequal length"); } /* initialize number of annotation */ fs->num_annotations = 0; /* initialize number of handlers and handlers pointer */ fs->num_handlers = 0; fs->handlers = NULL; /* Ensure space is available to write frame entry, and write the * header, apart from the bytecode length, which we'll fill in * later. */ ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_HEADER_SIZE + fs->num_locals * 2 + fs->num_lexicals * 6); write_int32(ws->frame_seg, ws->frame_pos, fs->bytecode_start); write_int32(ws->frame_seg, ws->frame_pos + 4, 0); /* Filled in later. */ write_int32(ws->frame_seg, ws->frame_pos + 8, fs->num_locals); write_int32(ws->frame_seg, ws->frame_pos + 12, fs->num_lexicals); write_int32(ws->frame_seg, ws->frame_pos + 16, get_string_heap_index(vm, ws, f->cuuid)); write_int32(ws->frame_seg, ws->frame_pos + 20, get_string_heap_index(vm, ws, f->name)); /* Handle outer. The current index means "no outer". */ if (ISTYPE(vm, f->outer, ws->types->Frame)) { /* First, see if we have the index cached. If not, go hunting. */ if (((MAST_Frame *)f->outer)->flags & FRAME_FLAG_HAS_INDEX) { write_int16(ws->frame_seg, ws->frame_pos + 24, ((MAST_Frame *)f->outer)->index); } else { unsigned short j, found, num_frames; found = 0; num_frames = (unsigned short)ELEMS(vm, ws->cu->frames); for (j = 0; j < num_frames; j++) { if (ATPOS(vm, ws->cu->frames, j) == f->outer) { write_int16(ws->frame_seg, ws->frame_pos + 24, j); found = 1; break; } } if (!found) { cleanup_all(vm, ws); DIE(vm, "Could not locate outer frame in frame list"); } } } else { write_int16(ws->frame_seg, ws->frame_pos + 24, idx); } write_int32(ws->frame_seg, ws->frame_pos + 26, ws->annotation_pos); write_int32(ws->frame_seg, ws->frame_pos + 30, 0); /* number of annotation; fill in later */ write_int32(ws->frame_seg, ws->frame_pos + 34, 0); /* number of handlers; fill in later */ write_int16(ws->frame_seg, ws->frame_pos + 38, (MVMint16)f->flags); num_slvs = f->flags & FRAME_FLAG_HAS_SLV ? (MVMuint16)ELEMS(vm, f->static_lex_values) / 4 : 0; write_int16(ws->frame_seg, ws->frame_pos + 40, num_slvs); if (f->flags & FRAME_FLAG_HAS_CODE_OBJ) { write_int32(ws->frame_seg, ws->frame_pos + 42, f->code_obj_sc_dep_idx + 1); write_int32(ws->frame_seg, ws->frame_pos + 46, f->code_obj_sc_idx); } else { write_int32(ws->frame_seg, ws->frame_pos + 42, 0); write_int32(ws->frame_seg, ws->frame_pos + 46, 0); } ws->frame_pos += FRAME_HEADER_SIZE; /* Write locals, as well as collecting our own array of type info. */ fs->local_types = (short unsigned int *)MVM_malloc(sizeof(unsigned short) * fs->num_locals); for (i = 0; i < fs->num_locals; i++) { unsigned short local_type = type_to_local_type(vm, ws, ATPOS(vm, f->local_types, i)); fs->local_types[i] = local_type; write_int16(ws->frame_seg, ws->frame_pos, local_type); ws->frame_pos += 2; } /* Write lexicals. */ fs->lexical_types = (short unsigned int *)MVM_malloc(sizeof(unsigned short) * fs->num_lexicals); for (i = 0; i < fs->num_lexicals; i++) { unsigned short lexical_type = type_to_local_type(vm, ws, ATPOS(vm, f->lexical_types, i)); fs->lexical_types[i] = lexical_type; write_int16(ws->frame_seg, ws->frame_pos, lexical_type); ws->frame_pos += 2; write_int32(ws->frame_seg, ws->frame_pos, get_string_heap_index(vm, ws, ATPOS_S_C(vm, f->lexical_names, i))); ws->frame_pos += 4; } /* Save the location of the start of instructions */ instructions_start = ws->bytecode_pos; /* Compile the instructions. */ ws->current_ins_idx = 0; num_ins = ELEMS(vm, f->instructions); for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, last_inst = ATPOS(vm, f->instructions, i)); /* Fixup frames that don't have a return instruction, so * we don't have to check against bytecode length every * time through the runloop. */ if (!last_inst || !ISTYPE(vm, last_inst, ws->types->Op) || ( GET_Op(last_inst)->op != MVM_OP_return && GET_Op(last_inst)->op != MVM_OP_return_i && GET_Op(last_inst)->op != MVM_OP_return_n && GET_Op(last_inst)->op != MVM_OP_return_s && GET_Op(last_inst)->op != MVM_OP_return_o )) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_return); ws->bytecode_pos += 2; } /* Fill in bytecode length. */ write_int32(ws->frame_seg, fs->frame_start + 4, ws->bytecode_pos - instructions_start); /* Fill in number of annotations. */ write_int32(ws->frame_seg, fs->frame_start + 30, fs->num_annotations); /* Fill in number of handlers. */ write_int32(ws->frame_seg, fs->frame_start + 34, fs->num_handlers); /* Write handlers. */ for (i = 0; i < fs->num_handlers; i++) { ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_HANDLER_SIZE); write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].start_offset); ws->frame_pos += 4; write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].end_offset); ws->frame_pos += 4; write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].category_mask); ws->frame_pos += 4; write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].action); ws->frame_pos += 2; write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].local); ws->frame_pos += 2; if (ws->cur_frame->handlers[i].label) write_int32(ws->frame_seg, ws->frame_pos, demand_label_offset(vm, ws, GET_Label(fs->handlers[i].label), "HandlerScope uses unresolved label")); else write_int32(ws->frame_seg, ws->frame_pos, 0); ws->frame_pos += 4; if (fs->handlers[i].category_mask & MVM_EX_CAT_LABELED) { ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, 2); write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].label_reg); ws->frame_pos += 2; } } /* Write static lex values. */ ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_SLV_SIZE * num_slvs); for (i = 0; i < num_slvs; i++) { write_int16(ws->frame_seg, ws->frame_pos, (MVMuint16)ATPOS_I(vm, f->static_lex_values, 4 * i)); write_int16(ws->frame_seg, ws->frame_pos + 2, (MVMuint16)ATPOS_I(vm, f->static_lex_values, 4 * i + 1)); write_int32(ws->frame_seg, ws->frame_pos + 4, (MVMuint32)ATPOS_I(vm, f->static_lex_values, 4 * i + 2)); write_int32(ws->frame_seg, ws->frame_pos + 8, (MVMuint32)ATPOS_I(vm, f->static_lex_values, 4 * i + 3)); ws->frame_pos += FRAME_SLV_SIZE; } /* Any leftover labels? */ if (fs->unresolved_labels) { cleanup_all(vm, ws); DIE(vm, "Frame has %u unresolved labels", fs->unresolved_labels); } /* Free the frame state. */ cleanup_frame(vm, fs); ws->cur_frame = NULL; /* Increment frame count. */ ws->num_frames++; } /* Takes all of the strings and joins them into a heap, encoding them as * UTF-8. */ static char * form_string_heap(VM, WriterState *ws, unsigned int *string_heap_size) { char *heap; unsigned int i, num_strings, heap_size, heap_alloc; /* If we've nothing to do, just return immediately. */ num_strings = ELEMS(vm, ws->strings); if (num_strings == 0) { *string_heap_size = 0; return NULL; } /* Allocate heap starting point (just a guess). */ heap_size = 0; heap_alloc = num_strings * 32; heap = (char *)MVM_malloc(heap_alloc); /* Add each string to the heap. */ for (i = 0; i < num_strings; i++) { MVMuint64 bytelen; char *encoded; MVMGraphemeIter gi; unsigned short align; unsigned int need; /* Decide if we can get away with Latin-1 with an assumption of the * string already being in NFG. Latin-1 is except \r, which we also * check for here. */ MVMint32 need_utf8 = 0; MVMString *str = ATPOS_S(vm, ws->strings, i); MVM_string_gi_init(tc, &gi, str); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (g < 0 || g >= 0xFF || g == 0x0D) { need_utf8 = 1; break; } } /* Encode it with the chosen algorithm. */ encoded = need_utf8 ? MVM_string_utf8_encode(tc, str, &bytelen) : MVM_string_latin1_encode(tc, str, &bytelen); if (bytelen > 0x3FFFFFFF) { cleanup_all(vm, ws); DIE(vm, "String too long for string constants segment"); } /* Ensure we have space. */ align = bytelen & 3 ? 4 - (bytelen & 3) : 0; need = 4 + bytelen + align; if (heap_size + need >= heap_alloc) { heap_alloc = umax(heap_alloc * 2, heap_size + need); heap = (char *)MVM_realloc(heap, heap_alloc); } /* Write byte length and UTF-8 flag into heap. */ write_int32(heap, heap_size, (bytelen << 1) | need_utf8); heap_size += 4; /* Write string. */ memcpy(heap + heap_size, encoded, bytelen); MVM_free(encoded); heap_size += bytelen; /* Add alignment. Whilst we never read this memory, it's useful to ensure it is initialised, otherwise valgrind (and similar tools) will rightly complain that we're writing garbage to disk. */ if (align) { memset(heap + heap_size, 0, align); heap_size += align; } } *string_heap_size = heap_size; return heap; } /* Takes all the pieces and forms the bytecode output. */ static char * form_bytecode_output(VM, WriterState *ws, unsigned int *bytecode_size) { unsigned int size = 0; unsigned int pos = 0; char *output; unsigned int string_heap_size; char *string_heap; unsigned int hll_str_idx; /* Store HLL name string, if any. */ if (!VM_STRING_IS_NULL(ws->cu->hll)) hll_str_idx = get_string_heap_index(vm, ws, ws->cu->hll); else hll_str_idx = get_string_heap_index(vm, ws, EMPTY_STRING(vm)); /* Build string heap. */ string_heap = form_string_heap(vm, ws, &string_heap_size); /* Work out total size. */ size += HEADER_SIZE; size += string_heap_size; size += ws->scdep_bytes; size += ws->extops_bytes; size += ws->frame_pos; size += ws->callsite_pos; size += ws->bytecode_pos; size += ws->annotation_pos; if (vm->serialized) size += vm->serialized_size; /* Allocate space for the bytecode output. */ output = (char *)MVM_malloc(size); memset(output, 0, size); /* Generate start of header. */ memcpy(output, "MOARVM\r\n", 8); write_int32(output, 8, BYTECODE_VERSION); pos += HEADER_SIZE; /* Add SC dependencies section and its header entries. */ write_int32(output, SCDEP_HEADER_OFFSET, pos); write_int32(output, SCDEP_HEADER_OFFSET + 4, ELEMS(vm, ws->cu->sc_handles)); memcpy(output + pos, ws->scdep_seg, ws->scdep_bytes); pos += ws->scdep_bytes; /* Add extension ops section and its header entries. */ write_int32(output, EXTOP_HEADER_OFFSET, pos); write_int32(output, EXTOP_HEADER_OFFSET + 4, ws->num_extops); memcpy(output + pos, ws->extops_seg, ws->extops_bytes); pos += ws->extops_bytes; /* Add frames section and its header entries. */ write_int32(output, FRAME_HEADER_OFFSET, pos); write_int32(output, FRAME_HEADER_OFFSET + 4, ws->num_frames); memcpy(output + pos, ws->frame_seg, ws->frame_pos); pos += ws->frame_pos; /* Add callsites section and its header entries. */ write_int32(output, CALLSITE_HEADER_OFFSET, pos); write_int32(output, CALLSITE_HEADER_OFFSET + 4, ws->num_callsites); memcpy(output + pos, ws->callsite_seg, ws->callsite_pos); pos += ws->callsite_pos; /* Add strings heap section and its header entries. */ write_int32(output, STRING_HEADER_OFFSET, pos); write_int32(output, STRING_HEADER_OFFSET + 4, ELEMS(vm, ws->strings)); memcpy(output + pos, string_heap, string_heap_size); pos += string_heap_size; if (string_heap) { MVM_free(string_heap); string_heap = NULL; } /* SC data. Write it if we have it. */ if (vm->serialized) { write_int32(output, SCDATA_HEADER_OFFSET, pos); write_int32(output, SCDATA_HEADER_OFFSET + 4, vm->serialized_size); memcpy(output + pos, vm->serialized, vm->serialized_size); pos += vm->serialized_size; MVM_free(vm->serialized); vm->serialized = NULL; vm->serialized_size = 0; } /* Add bytecode section and its header entries (offset, length). */ write_int32(output, BYTECODE_HEADER_OFFSET, pos); write_int32(output, BYTECODE_HEADER_OFFSET + 4, ws->bytecode_pos); memcpy(output + pos, ws->bytecode_seg, ws->bytecode_pos); pos += ws->bytecode_pos; /* Add annotation section and its header entries (offset, length). */ write_int32(output, ANNOTATION_HEADER_OFFSET, pos); write_int32(output, ANNOTATION_HEADER_OFFSET + 4, ws->annotation_pos); memcpy(output + pos, ws->annotation_seg, ws->annotation_pos); pos += ws->annotation_pos; /* Add HLL and special frame indexes. */ write_int32(output, HLL_NAME_HEADER_OFFSET, hll_str_idx); if (VM_OBJ_IS_NULL(ws->cu->main_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET, 1 + get_frame_index(vm, ws, ws->cu->main_frame)); if (VM_OBJ_IS_NULL(ws->cu->load_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 4, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 4, 1 + get_frame_index(vm, ws, ws->cu->load_frame)); if (VM_OBJ_IS_NULL(ws->cu->deserialize_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 8, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 8, 1 + get_frame_index(vm, ws, ws->cu->deserialize_frame)); /* Sanity...should never fail. */ if (pos != size) DIE(vm, "Bytecode generated did not match expected size"); *bytecode_size = size; return output; } /* Main entry point to the MAST to bytecode compiler. */ char * MVM_mast_compile(VM, MASTNode *node, MASTNodeTypes *types, unsigned int *size) { MAST_CompUnit *cu; WriterState *ws; char *bytecode; unsigned short i, num_depscs, num_frames; unsigned int bytecode_size; /* Ensure we have a compilation unit. */ if (!ISTYPE(vm, node, types->CompUnit)) DIE(vm, "Top-level MAST node must be a CompUnit"); cu = GET_CompUnit(node); /* Initialize the writer state structure. */ ws = (WriterState *)MVM_malloc(sizeof(WriterState)); ws->types = types; ws->strings = NEWLIST_S(vm); ws->seen_strings = NEWHASH(vm); ws->cur_frame = NULL; ws->scdep_bytes = ELEMS(vm, cu->sc_handles) * SC_DEP_SIZE; ws->scdep_seg = ws->scdep_bytes ? (char *)MVM_malloc(ws->scdep_bytes) : NULL; ws->num_extops = ELEMS(vm, cu->extop_names); ws->extops_bytes = ws->num_extops * EXTOP_SIZE; ws->extops_seg = (char *)MVM_malloc(ws->extops_bytes); ws->frame_pos = 0; ws->frame_alloc = 192 * ELEMS(vm, cu->frames); ws->frame_seg = (char *)MVM_malloc(ws->frame_alloc); ws->num_frames = 0; ws->callsite_pos = 0; ws->callsite_alloc = 4096; ws->callsite_seg = (char *)MVM_malloc(ws->callsite_alloc); ws->num_callsites = 0; ws->bytecode_pos = 0; ws->bytecode_alloc = 128 * ELEMS(vm, cu->frames); ws->bytecode_seg = (char *)MVM_malloc(ws->bytecode_alloc); ws->annotation_pos = 0; ws->annotation_alloc = 64 * ELEMS(vm, cu->frames); ws->annotation_seg = (char *)MVM_malloc(ws->annotation_alloc); ws->cu = cu; ws->current_frame_idx= 0; /* If we have any strings from serializing, then we'll seed our own string * heap with them. This means the compilation unit string heap will align * perfectly with what the serialization blob needs, and thus we can use * it in deserialization. Note we use get_string_heap_index for its side * effects only here. Start from 1, as 0 means NULL string. */ if (vm->serialized_string_heap) { MVMint64 elems = ELEMS(vm, vm->serialized_string_heap); for (i = 1; i < elems; i++) (void)get_string_heap_index(vm, ws, ATPOS_S(vm, vm->serialized_string_heap, i)); vm->serialized_string_heap = NULL; } /* Initialize callsite reuse cache */ ws->callsite_reuse_head = NULL; /* Store each of the dependent SCs. */ num_depscs = ELEMS(vm, ws->cu->sc_handles); for (i = 0; i < num_depscs; i++) write_int32(ws->scdep_seg, i * SC_DEP_SIZE, get_string_heap_index(vm, ws, ATPOS_S_C(vm, ws->cu->sc_handles, i))); /* Store each of the extop names and signatures. */ for (i = 0; i < ws->num_extops; i++) { MASTNode *sig_array; int num_operands, j; write_int32(ws->extops_seg, i * EXTOP_SIZE, get_string_heap_index(vm, ws, ATPOS_S_C(vm, ws->cu->extop_names, i))); sig_array = ATPOS(vm, ws->cu->extop_sigs, i); num_operands = ELEMS(vm, sig_array); for (j = 0; j < 8; j++) write_int8(ws->extops_seg, i * EXTOP_SIZE + 4 + j, j < num_operands ? ATPOS_I(vm, sig_array, j) : 0); } /* Visit and compile each of the frames. */ num_frames = (unsigned short)ELEMS(vm, cu->frames); for (i = 0; i < num_frames; i++) compile_frame(vm, ws, ATPOS(vm, cu->frames, i), ws->current_frame_idx = i); /* Join all the pieces into a bytecode file. */ bytecode = form_bytecode_output(vm, ws, &bytecode_size); /* Cleanup and hand back result. */ cleanup_all(vm, ws); *size = bytecode_size; return bytecode; } MoarVM-2015.11/src/mast/compiler.h0000644000175000017500000000015612456307241015574 0ustar jnthnjnthnchar * MVM_mast_compile(MVMThreadContext *tc, MVMObject *node, MASTNodeTypes *types, unsigned int *size); MoarVM-2015.11/src/mast/driver.c0000644000175000017500000000743112623370227015253 0ustar jnthnjnthn#include "moar.h" #include "nodes.h" #include "compiler.h" /* Takes a hash of types and produces a MASTNodeTypes structure. */ #define grab_type(name) do { \ MVMString *key = MVM_string_utf8_decode(tc, tc->instance->VMString, #name, strlen(#name)); \ result->name = MVM_repr_at_key_o(tc, types, key); \ } while (0) static MASTNodeTypes * node_types_struct(MVMThreadContext *tc, MVMObject *types) { MASTNodeTypes *result = MVM_malloc(sizeof(MASTNodeTypes)); MVMROOT(tc, types, { grab_type(CompUnit); grab_type(Frame); grab_type(Op); grab_type(ExtOp); grab_type(SVal); grab_type(IVal); grab_type(NVal); grab_type(Label); grab_type(Local); grab_type(Lexical); grab_type(Call); grab_type(Annotated); grab_type(HandlerScope); }); return result; } /* Compiles MAST down to bytecode, then loads it as a compilation unit, * running deserialize and load frames as appropriate. */ void MVM_mast_to_cu(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMRegister *res) { MVMCompUnit *loaded; MVMROOT(tc, mast, { /* Get node types into struct. */ MASTNodeTypes *mnt = node_types_struct(tc, types); /* Turn the MAST tree into bytecode. Switch to gen2 GC allocation to be * sure nothing moves, though we'd really rather not have compiler * temporaries live longer. */ unsigned int size; char *bytecode; MVM_gc_allocate_gen2_default_set(tc); bytecode = MVM_mast_compile(tc, mast, mnt, &size); MVM_free(mnt); MVM_gc_allocate_gen2_default_clear(tc); /* Load it as a compilation unit; it is a kind of MVMObject, so cast * it to that. */ loaded = MVM_cu_from_bytes(tc, (MVMuint8 *)bytecode, (MVMuint32)size); loaded->body.deallocate = MVM_DEALLOCATE_FREE; }); /* Stash loaded comp unit in result register. */ res->o = (MVMObject *)loaded; /* If there's a deserialization frame, need to run that. */ if (loaded->body.deserialize_frame) { /* Set up special return to delegate to running the load frame, * if any. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; /* Invoke the deserialization frame and return to the runloop. */ MVM_frame_invoke(tc, loaded->body.deserialize_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } } /* Compiles MAST down to bytecode, then writes it to disk. */ void MVM_mast_to_file(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMString *filename) { MVMROOT(tc, mast, { FILE *fh; char *c_filename; /* Get node types into struct. */ MASTNodeTypes *mnt = node_types_struct(tc, types); /* Turn the MAST tree into bytecode. */ unsigned int size; char *bytecode; MVM_gc_allocate_gen2_default_set(tc); bytecode = MVM_mast_compile(tc, mast, mnt, &size); MVM_free(mnt); MVM_gc_allocate_gen2_default_clear(tc); /* Write it out to a file. (Not using VM-level IO for this right now; * may want to do that, but really we just want to shove the bytes out * to disk, without having to go via string subsystem, etc. */ c_filename = MVM_string_utf8_c8_encode_C_string(tc, filename); if ((fh = fopen(c_filename, "wb+"))) { fwrite(bytecode, 1, size, fh); fclose(fh); MVM_free(c_filename); } else { char *waste[2]; waste[0] = c_filename; waste[1] = NULL; MVM_exception_throw_adhoc_free(tc, waste, "Unable to write bytecode to '%s'", c_filename); } }); } MoarVM-2015.11/src/mast/driver.h0000644000175000017500000000030512456307241015251 0ustar jnthnjnthnvoid MVM_mast_to_cu(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMRegister *res); void MVM_mast_to_file(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMString *filename); MoarVM-2015.11/src/mast/nodes.h0000644000175000017500000001341412554473060015075 0ustar jnthnjnthn/* MAST::CompUnit */ typedef struct { MVMP6opaque p6o_header; MVMObject *frames; MVMString *hll; MVMObject *main_frame; MVMObject *load_frame; MVMObject *deserialize_frame; MVMObject *sc_handles; MVMObject *sc_lookup; MVMObject *extop_sigs; MVMObject *extop_idx; MVMObject *extop_names; } MAST_CompUnit; /* MAST::Frame */ typedef struct { MVMP6opaque p6o_header; MVMString *cuuid; MVMString *name; MVMObject *lexical_types; MVMObject *lexical_names; MVMObject *local_types; MVMObject *instructions; MVMObject *outer; MVMObject *lexical_map; MVMint64 flags; MVMint64 index; MVMObject *static_lex_values; MVMint64 code_obj_sc_dep_idx; MVMint64 code_obj_sc_idx; } MAST_Frame; /* MAST::Op */ typedef struct { MVMP6opaque p6o_header; MVMint64 op; MVMObject *operands; } MAST_Op; /* MAST::ExtOp */ typedef struct { MVMP6opaque p6o_header; MVMint64 op; MVMObject *operands; MVMString *name; } MAST_ExtOp; /* MAST::SVal */ typedef struct { MVMP6opaque p6o_header; MVMString *value; } MAST_SVal; /* MAST::IVal */ typedef struct { MVMP6opaque p6o_header; MVMint64 value; } MAST_IVal; /* MAST::NVal */ typedef struct { MVMP6opaque p6o_header; MVMnum64 value; } MAST_NVal; /* MAST::Label */ typedef struct { MVMP6opaque p6o_header; } MAST_Label; /* MAST::Local */ typedef struct { MVMP6opaque p6o_header; MVMint64 index; } MAST_Local; /* MAST::Lexical */ typedef struct { MVMP6opaque p6o_header; MVMint64 index; MVMint64 frames_out; } MAST_Lexical; /* MAST::Call */ typedef struct { MVMP6opaque p6o_header; MVMObject *target; MVMObject *flags; MVMObject *args; MVMObject *result; } MAST_Call; /* MAST::Annotated */ typedef struct { MVMP6opaque p6o_header; MVMString *file; MVMint64 line; MVMObject *instructions; } MAST_Annotated; /* MAST::HandlerScope */ typedef struct { MVMP6opaque p6o_header; MVMObject *instructions; MVMint64 category_mask; MVMint64 action; MVMObject *goto_label; MVMObject *block_local; MVMObject *label_local; } MAST_HandlerScope; /* Node types structure. */ typedef struct _MASTNodeTypes { MVMObject *CompUnit; MVMObject *Frame; MVMObject *Op; MVMObject *ExtOp; MVMObject *SVal; MVMObject *IVal; MVMObject *NVal; MVMObject *Label; MVMObject *Local; MVMObject *Lexical; MVMObject *Call; MVMObject *Annotated; MVMObject *HandlerScope; } MASTNodeTypes; /* This means we can talk about MASTNode in the compiler, not MVMObject. */ typedef MVMObject MASTNode; /* Similar for strings. */ typedef MVMString VMSTR; /* Way of talking about the interpreter. */ #define VM MVMThreadContext *tc #define vm tc /* Some macros for getting at and examining nodes data. */ #define ISTYPE(VM, s, t) (STABLE(s) == STABLE(t)) #define DIE(vm, msg, ...) MVM_exception_throw_adhoc(tc, msg, ## __VA_ARGS__) #define GET_CompUnit(n) ((MAST_CompUnit *)n) #define GET_Frame(n) ((MAST_Frame *)n) #define GET_Op(n) ((MAST_Op *)n) #define GET_ExtOp(n) ((MAST_ExtOp *)n) #define GET_Label(n) ((MAST_Label *)n) #define GET_Local(n) ((MAST_Local *)n) #define GET_Lexical(n) ((MAST_Lexical *)n) #define GET_IVal(n) ((MAST_IVal *)n) #define GET_NVal(n) ((MAST_NVal *)n) #define GET_SVal(n) ((MAST_SVal *)n) #define GET_Call(n) ((MAST_Call *)n) #define GET_Annotated(n) ((MAST_Annotated *)n) #define GET_HandlerScope(n) ((MAST_HandlerScope *)n) #define NEWLIST_I(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray)) #define NEWLIST_S(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStrArray)) #define ELEMS(vm, arr) ((unsigned int )MVM_repr_elems(vm, arr)) #define ATPOS(vm, arr, i) (MVM_repr_at_pos_o(vm, arr, i)) #define ATPOS_I(vm, arr, i) (MVM_repr_at_pos_i(vm, arr, i)) #define ATPOS_S(vm, arr, i) (MVM_repr_at_pos_s(vm, arr, i)) #define ATPOS_I_C(vm, arr, i) (MVM_repr_get_int(vm, MVM_repr_at_pos_o(vm, arr, i))) #define ATPOS_S_C(vm, arr, i) (MVM_repr_get_str(vm, MVM_repr_at_pos_o(vm, arr, i))) #define BINDPOS(vm, arr, i, v) (MVM_repr_bind_pos_o(vm, arr, i, v)) #define BINDPOS_I(vm, arr, i, v) (MVM_repr_bind_pos_i(vm, arr, i, v)) #define BINDPOS_S(vm, arr, i, v) (MVM_repr_bind_pos_s(vm, arr, i, v)) #define NEWHASH(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash)) #define HASHELEMS(vm, hash) ((unsigned int )MVM_repr_elems(vm, hash)) #define ATKEY(vm, hash, k) (MVM_repr_at_key_o(vm, hash, k)) #define ATKEY_I(vm, hash, k) (MVM_repr_get_int(tc, MVM_repr_at_key_o(vm, hash, k))) #define BINDKEY(vm, hash, k, v) (MVM_repr_bind_key_o(vm, hash, k, v)) #define BINDKEY_I(vm, hash, k, v) do { \ MVMObject *boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, v); \ MVM_repr_bind_key_o(vm, hash, k, boxed); \ } while (0) #define EXISTSKEY(vm, hash, k) (MVM_repr_exists_key(vm, hash, k)) #define DELETEKEY(vm, hash, k) (MVM_repr_delete_key(vm, hash, k)) #define EMPTY_STRING(vm) (tc->instance->str_consts.empty) #define VM_STRING_IS_NULL(s) (s == NULL) #define VM_OBJ_IS_NULL(o) (o == NULL) #define VM_STRING_TO_C_STRING(vm, s) (MVM_string_ascii_encode_any(tc, s)) #define DIE_FREE(vm, waste, msg, ...) MVM_exception_throw_adhoc_free(tc, waste, msg, ## __VA_ARGS__) MoarVM-2015.11/src/math/bigintops.c0000644000175000017500000010046312623370227015742 0ustar jnthnjnthn#include "moar.h" #include /* Taken from mp_set_long, but portably accepts a 64-bit number. */ int MVM_bigint_mp_set_uint64(mp_int * a, MVMuint64 b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < sizeof(MVMuint64) * 2; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> ((sizeof(MVMuint64)) * 8 - 4)) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp(a); return MP_OKAY; } static MVMnum64 mp_get_double(mp_int *a) { MVMnum64 d = 0.0; MVMnum64 sign = SIGN(a) == MP_NEG ? -1.0 : 1.0; int i; if (USED(a) == 0) return d; if (USED(a) == 1) return sign * (MVMnum64) DIGIT(a, 0); mp_clamp(a); i = USED(a) - 1; d = (MVMnum64) DIGIT(a, i); i--; if (i == -1) { return sign * d; } d *= pow(2.0, DIGIT_BIT); d += (MVMnum64) DIGIT(a, i); if (USED(a) > 2) { i--; d *= pow(2.0, DIGIT_BIT); d += (MVMnum64) DIGIT(a, i); } d *= pow(2.0, DIGIT_BIT * i); return sign * d; } static void from_num(MVMnum64 d, mp_int *a) { MVMnum64 d_digit = pow(2, DIGIT_BIT); MVMnum64 da = fabs(d); MVMnum64 upper; MVMnum64 lower; MVMnum64 lowest; MVMnum64 rest; int digits = 0; mp_zero(a); while (da > d_digit * d_digit * d_digit) {; da /= d_digit; digits++; } mp_grow(a, digits + 3); /* populate the top 3 digits */ upper = da / (d_digit*d_digit); rest = fmod(da, d_digit*d_digit); lower = rest / d_digit; lowest = fmod(rest,d_digit ); if (upper >= 1) { mp_set_long(a, (unsigned long) upper); mp_mul_2d(a, DIGIT_BIT , a); DIGIT(a, 0) = (mp_digit) lower; mp_mul_2d(a, DIGIT_BIT , a); } else { if (lower >= 1) { mp_set_long(a, (unsigned long) lower); mp_mul_2d(a, DIGIT_BIT , a); a->used = 2; } else { a->used = 1; } } DIGIT(a, 0) = (mp_digit) lowest; /* shift the rest */ mp_mul_2d(a, DIGIT_BIT * digits, a); if (d < 0) mp_neg(a, a); mp_clamp(a); mp_shrink(a); } /* Returns the body of a P6bigint, containing the bigint/smallint union, for * operations that want to explicitly handle the two. */ static MVMP6bigintBody * get_bigint_body(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) return (MVMP6bigintBody *)REPR(obj)->box_funcs.get_boxed_ref(tc, STABLE(obj), obj, OBJECT_BODY(obj), MVM_REPR_ID_P6bigint); else MVM_exception_throw_adhoc(tc, "Can only perform big integer operations on concrete objects"); } /* Checks if a bigint can be stored small. */ static int can_be_smallint(const mp_int *i) { if (USED(i) != 1) return 0; return MVM_IS_32BIT_INT(DIGIT(i, 0)); } /* Forces a bigint, even if we only have a smallint. Takes a parameter that * indicates where to allocate a temporary mp_int if needed. */ static mp_int * force_bigint(const MVMP6bigintBody *body, mp_int **tmp) { if (MVM_BIGINT_IS_BIG(body)) { return body->u.bigint; } else { MVMint32 value = body->u.smallint.value; mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (value >= 0) { mp_set_long(i, value); } else { mp_set_long(i, -value); mp_neg(i, i); } while (*tmp) tmp++; *tmp = i; return i; } } /* Clears an array that may contain tempory big ints. */ static void clear_temp_bigints(mp_int *const *ints, MVMint32 n) { MVMint32 i; for (i = 0; i < n; i++) if (ints[i]) { mp_clear(ints[i]); MVM_free(ints[i]); } } /* Stores an int64 in a bigint result body, either as a 32-bit smallint if it * is in range, or a big integer if not. */ static void store_int64_result(MVMP6bigintBody *body, MVMint64 result) { if (MVM_IS_32BIT_INT(result)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = (MVMint32)result; } else { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (result >= 0) { MVM_bigint_mp_set_uint64(i, (MVMuint64)result); } else { MVM_bigint_mp_set_uint64(i, (MVMuint64)-result); mp_neg(i, i); } body->u.bigint = i; } } /* Stores an bigint in a bigint result body, either as a 32-bit smallint if it * is in range, or a big integer if not. Clears and frees the passed bigint if * it is not being used. */ static void store_bigint_result(MVMP6bigintBody *body, mp_int *i) { if (can_be_smallint(i)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = SIGN(i) ? -DIGIT(i, 0) : DIGIT(i, 0); mp_clear(i); MVM_free(i); } else { body->u.bigint = i; } } /* Bitops on libtomath (no 2s compliment API) are horrendously inefficient and * really should be hand-coded to work DIGIT-by-DIGIT with in-loop carry * handling. For now we have these fixups. * * The following inverts the bits of a negative bigint, adds 1 to that, and * appends sign-bit extension DIGITs to it to give us a 2s compliment * representation in memory. Do not call it on positive bigints. */ static void grow_and_negate(const mp_int *a, int size, mp_int *b) { int i; /* Always add an extra DIGIT so we can tell positive values * with a one in the highest bit apart from negative values. */ int actual_size = MAX(size, USED(a)) + 1; SIGN(b) = MP_ZPOS; mp_grow(b, actual_size); USED(b) = actual_size; for (i = 0; i < USED(a); i++) { DIGIT(b, i) = (~DIGIT(a, i)) & MP_MASK; } for (; i < actual_size; i++) { DIGIT(b, i) = MP_MASK; } /* Note: This add cannot cause another grow assuming nobody ever * tries to use tommath -0 for anything, and nobody tries to use * this on positive bigints. */ mp_add_d(b, 1, b); } static void two_complement_bitop(mp_int *a, mp_int *b, mp_int *c, int (*mp_bitop)(mp_int *, mp_int *, mp_int *)) { mp_int d; mp_int e; mp_int *f; mp_int *g; f = a; g = b; if (MP_NEG == SIGN(a)) { mp_init(&d); grow_and_negate(a, USED(b), &d); f = &d; } if (MP_NEG == SIGN(b)) { mp_init(&e); grow_and_negate(b, USED(a), &e); g = &e; } /* f and g now guaranteed to each point to positive bigints containing * a 2s compliment representation of the values in a and b. If either * a or b was negative, the representation is one tomath "digit" longer * than it need be and sign extended. */ mp_bitop(f, g, c); if (f == &d) mp_clear(&d); if (g == &e) mp_clear(&e); /* Use the fact that tomath clamps to detect results that should be * signed. If we created extra tomath "digits" and they resulted in * sign bits of 0, they have been clamped away. If the resulting sign * bits were 1, they remain, and c will have more digits than either of * original operands. Note this only works because we do not * support NOR/NAND/NXOR, and so two zero sign bits can never create 1s. */ if (USED(c) > MAX(USED(a),USED(b))) { int i; for (i = 0; i < USED(c); i++) { DIGIT(c, i) = (~DIGIT(c, i)) & MP_MASK; } mp_add_d(c, 1, c); mp_neg(c, c); } } static void two_complement_shl(mp_int *result, mp_int *value, MVMint64 count) { if (count >= 0) { mp_mul_2d(value, count, result); } else if (MP_NEG == SIGN(value)) { /* fake two's complement semantics on top of sign-magnitude * algorithm appears to work [citation needed] */ mp_add_d(value, 1, result); mp_div_2d(result, -count, result, NULL); mp_sub_d(result, 1, result); } else { mp_div_2d(value, -count, result, NULL); } } #define MVM_BIGINT_UNARY_OP(opname, SMALLINT_OP) \ void MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result, MVMObject *source) { \ MVMP6bigintBody *bb = get_bigint_body(tc, result); \ if (!IS_CONCRETE(source)) { \ store_int64_result(bb, 0); \ } \ else { \ MVMP6bigintBody *ba = get_bigint_body(tc, source); \ if (MVM_BIGINT_IS_BIG(ba)) { \ mp_int *ia = ba->u.bigint; \ mp_int *ib = MVM_malloc(sizeof(mp_int)); \ mp_init(ib); \ mp_##opname(ia, ib); \ store_bigint_result(bb, ib); \ } \ else { \ MVMint64 sb; \ MVMint64 sa = ba->u.smallint.value; \ SMALLINT_OP; \ store_int64_result(bb, sb); \ } \ } \ } #define MVM_BIGINT_BINARY_OP(opname) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba, *bb, *bc; \ MVMObject *result; \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia, *ib, *ic; \ MVMROOT(tc, a, { \ MVMROOT(tc, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ }); \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ bc = get_bigint_body(tc, result); \ ia = force_bigint(ba, tmp); \ ib = force_bigint(bb, tmp); \ ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ mp_##opname(ia, ib, ic); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ return result; \ } #define MVM_BIGINT_BINARY_OP_SIMPLE(opname, SMALLINT_OP) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba, *bb, *bc; \ MVMObject *result; \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia, *ib, *ic; \ MVMROOT(tc, a, { \ MVMROOT(tc, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ }); \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ bc = get_bigint_body(tc, result); \ ia = force_bigint(ba, tmp); \ ib = force_bigint(bb, tmp); \ ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ mp_##opname(ia, ib, ic); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ } \ else { \ MVMint64 sc; \ MVMint64 sa = ba->u.smallint.value; \ MVMint64 sb = bb->u.smallint.value; \ SMALLINT_OP; \ result = MVM_intcache_get(tc, result_type, sc); \ if (result) \ return result; \ result = MVM_repr_alloc_init(tc, result_type);\ bc = get_bigint_body(tc, result); \ store_int64_result(bc, sc); \ } \ return result; \ } #define MVM_BIGINT_BINARY_OP_2(opname, SMALLINT_OP) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba = get_bigint_body(tc, a); \ MVMP6bigintBody *bb = get_bigint_body(tc, b); \ MVMP6bigintBody *bc; \ MVMObject *result; \ MVMROOT(tc, a, { \ MVMROOT(tc, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ }); \ bc = get_bigint_body(tc, result); \ if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia = force_bigint(ba, tmp); \ mp_int *ib = force_bigint(bb, tmp); \ mp_int *ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ two_complement_bitop(ia, ib, ic, mp_##opname); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ } \ else { \ MVMint64 sc; \ MVMint64 sa = ba->u.smallint.value; \ MVMint64 sb = bb->u.smallint.value; \ SMALLINT_OP; \ store_int64_result(bc, sc); \ } \ return result; \ } MVM_BIGINT_UNARY_OP(abs, { sb = labs(sa); }) MVM_BIGINT_UNARY_OP(neg, { sb = -sa; }) /* unused */ /* MVM_BIGINT_UNARY_OP(sqrt) */ MVM_BIGINT_BINARY_OP_SIMPLE(add, { sc = sa + sb; }) MVM_BIGINT_BINARY_OP_SIMPLE(sub, { sc = sa - sb; }) MVM_BIGINT_BINARY_OP_SIMPLE(mul, { sc = sa * sb; }) MVM_BIGINT_BINARY_OP(lcm) MVMObject *MVM_bigint_gcd(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; MVMObject *result; MVMROOT(tc, a, { MVMROOT(tc, b, { result = MVM_repr_alloc_init(tc, result_type); }); }); bc = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = MVM_malloc(sizeof(mp_int)); mp_init(ic); mp_gcd(ia, ib, ic); store_bigint_result(bc, ic); clear_temp_bigints(tmp, 2); } else { MVMint32 sa = ba->u.smallint.value; MVMint32 sb = bb->u.smallint.value; MVMint32 t; sa = abs(sa); sb = abs(sb); while (sb != 0) { t = sb; sb = sa % sb; sa = t; } store_int64_result(bc, sa); } return result; } MVM_BIGINT_BINARY_OP_2(or , { sc = sa | sb; }) MVM_BIGINT_BINARY_OP_2(xor, { sc = sa ^ sb; }) MVM_BIGINT_BINARY_OP_2(and, { sc = sa & sb; }) MVMint64 MVM_bigint_cmp(MVMThreadContext *tc, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); MVMint64 r = (MVMint64)mp_cmp(ia, ib); clear_temp_bigints(tmp, 2); return r; } else { MVMint64 sa = ba->u.smallint.value; MVMint64 sb = bb->u.smallint.value; return sa == sb ? 0 : sa < sb ? -1 : 1; } } MVMObject * MVM_bigint_mod(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; MVMObject *result; MVMROOT(tc, a, { MVMROOT(tc, b, { result = MVM_repr_alloc_init(tc, result_type); }); }); bc = get_bigint_body(tc, result); // XXX the behavior of C's mod operator is not correct // for our purposes. So we rely on mp_mod for all our modulus // calculations for now. if (1 || MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = MVM_malloc(sizeof(mp_int)); int mp_result; mp_init(ic); mp_result = mp_mod(ia, ib, ic); clear_temp_bigints(tmp, 2); if (mp_result == MP_VAL) { MVM_exception_throw_adhoc(tc, "Division by zero"); } store_bigint_result(bc, ic); } else { store_int64_result(bc, ba->u.smallint.value % bb->u.smallint.value); } return result; } MVMObject *MVM_bigint_div(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; mp_int *ia, *ib, *ic; int cmp_a; int cmp_b; mp_int remainder; mp_int intermediate; MVMObject *result; int mp_result; MVMROOT(tc, a, { MVMROOT(tc, b, { result = MVM_repr_alloc_init(tc, result_type); }); }); bc = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba)) { cmp_a = mp_cmp_d(ba->u.bigint, 0); } else { // we only care about MP_LT or !MP_LT, so we give MP_GT even for 0. cmp_a = ba->u.smallint.value < 0 ? MP_LT : MP_GT; } if (MVM_BIGINT_IS_BIG(bb)) { cmp_b = mp_cmp_d(bb->u.bigint, 0); } else { cmp_b = bb->u.smallint.value < 0 ? MP_LT : MP_GT; } if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; ia = force_bigint(ba, tmp); ib = force_bigint(bb, tmp); ic = MVM_malloc(sizeof(mp_int)); mp_init(ic); // if we do a div with a negative, we need to make sure // the result is floored rather than rounded towards // zero, like C and libtommath would do. if ((cmp_a == MP_LT) ^ (cmp_b == MP_LT)) { mp_init(&remainder); mp_init(&intermediate); mp_result = mp_div(ia, ib, &intermediate, &remainder); if (mp_result == MP_VAL) { mp_clear(&remainder); mp_clear(&intermediate); clear_temp_bigints(tmp, 2); MVM_exception_throw_adhoc(tc, "Division by zero"); } if (mp_iszero(&remainder) == 0) { mp_sub_d(&intermediate, 1, ic); } else { mp_copy(&intermediate, ic); } mp_clear(&remainder); mp_clear(&intermediate); } else { mp_result = mp_div(ia, ib, ic, NULL); if (mp_result == MP_VAL) { clear_temp_bigints(tmp, 2); MVM_exception_throw_adhoc(tc, "Division by zero"); } } store_bigint_result(bc, ic); clear_temp_bigints(tmp, 2); } else { MVMint32 num = ba->u.smallint.value; MVMint32 denom = bb->u.smallint.value; MVMint32 value; if ((cmp_a == MP_LT) ^ (cmp_b == MP_LT)) { if (denom == 0) { MVM_exception_throw_adhoc(tc, "Division by zero"); } if ((num % denom) != 0) { value = num / denom - 1; } else { value = num / denom; } } else { value = num / denom; } store_int64_result(bc, value); } return result; } MVMObject * MVM_bigint_pow(MVMThreadContext *tc, MVMObject *a, MVMObject *b, MVMObject *num_type, MVMObject *int_type) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMObject *r = NULL; mp_int *tmp[2] = { NULL, NULL }; mp_int *base = force_bigint(ba, tmp); mp_int *exponent = force_bigint(bb, tmp); mp_digit exponent_d = 0; int cmp = mp_cmp_d(exponent, 0); if ((cmp == MP_EQ) || (MP_EQ == mp_cmp_d(base, 1))) { r = MVM_repr_box_int(tc, int_type, 1); } else if (cmp == MP_GT) { mp_int *ic = MVM_malloc(sizeof(mp_int)); mp_init(ic); exponent_d = mp_get_int(exponent); if ((MP_GT == mp_cmp_d(exponent, exponent_d))) { cmp = mp_cmp_d(base, 0); if ((MP_EQ == cmp) || (MP_EQ == mp_cmp_d(base, 1))) { mp_copy(base, ic); } else { MVMnum64 ZERO = 0.0; if (MP_GT == cmp) { mp_set_int(ic, (MVMnum64)1.0 / ZERO); } else { mp_set_int(ic, (MVMnum64)(-1.0) / ZERO); } } } else { mp_expt_d(base, exponent_d, ic); } r = MVM_repr_alloc_init(tc, int_type); store_bigint_result(get_bigint_body(tc, r), ic); } else { MVMnum64 f_base = mp_get_double(base); MVMnum64 f_exp = mp_get_double(exponent); r = MVM_repr_box_num(tc, num_type, pow(f_base, f_exp)); } clear_temp_bigints(tmp, 2); return r; } MVMObject *MVM_bigint_shl(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMint64 n) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || n >= 31) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); two_complement_shl(ib, ia, n); store_bigint_result(bb, ib); clear_temp_bigints(tmp, 1); } else { MVMint64 value; if (n < 0) value = ((MVMint64)ba->u.smallint.value) >> -n; else value = ((MVMint64)ba->u.smallint.value) << n; store_int64_result(bb, value); } return result; } MVMObject *MVM_bigint_shr(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMint64 n) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || n < 0) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); two_complement_shl(ib, ia, -n); store_bigint_result(bb, ib); clear_temp_bigints(tmp, 1); } else if (n >= 32) { store_int64_result(bb, 0); } else { MVMint32 value = ba->u.smallint.value; value = value >> n; store_int64_result(bb, value); } return result; } MVMObject *MVM_bigint_not(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *ia = ba->u.bigint; mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); /* two's complement not: add 1 and negate */ mp_add_d(ia, 1, ib); mp_neg(ib, ib); store_bigint_result(bb, ib); } else { MVMint32 value = ba->u.smallint.value; value = ~value; store_int64_result(bb, value); } return result; } void MVM_bigint_expmod(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b, MVMObject *c) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc = get_bigint_body(tc, c); MVMP6bigintBody *bd = get_bigint_body(tc, result); mp_int *tmp[3] = { NULL, NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = force_bigint(bc, tmp); mp_int *id = MVM_malloc(sizeof(mp_int)); mp_init(id); mp_exptmod(ia, ib, ic, id); store_bigint_result(bd, id); clear_temp_bigints(tmp, 3); } void MVM_bigint_from_str(MVMThreadContext *tc, MVMObject *a, const char *buf) { MVMP6bigintBody *body = get_bigint_body(tc, a); mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); mp_read_radix(i, buf, 10); if (can_be_smallint(i)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = SIGN(i) ? -DIGIT(i, 0) : DIGIT(i, 0); mp_clear(i); MVM_free(i); } else { body->u.bigint = i; } } MVMString * MVM_bigint_to_str(MVMThreadContext *tc, MVMObject *a, int base) { MVMP6bigintBody *body = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; int len; char *buf; MVMString *result; mp_radix_size(i, base, &len); buf = (char *) MVM_malloc(len); mp_toradix_n(i, buf, base, len); result = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); MVM_free(buf); return result; } else { if (base == 10) { return MVM_coerce_i_s(tc, body->u.smallint.value); } else { /* It's small, but shove it through bigint lib, as it knows how to * get other bases right. */ mp_int i; int len; char *buf; MVMString *result; MVMint32 value = body->u.smallint.value; mp_init(&i); if (value >= 0) { mp_set_long(&i, value); } else { mp_set_long(&i, -value); mp_neg(&i, &i); } mp_radix_size(&i, base, &len); buf = (char *) MVM_malloc(len); mp_toradix_n(&i, buf, base, len); result = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); MVM_free(buf); mp_clear(&i); return result; } } } MVMnum64 MVM_bigint_to_num(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *ia = ba->u.bigint; return mp_get_double(ia); } else { return (double)ba->u.smallint.value; } } void MVM_bigint_from_num(MVMThreadContext *tc, MVMObject *a, MVMnum64 n) { MVMP6bigintBody *ba = get_bigint_body(tc, a); mp_int *ia = MVM_malloc(sizeof(mp_int)); mp_init(ia); from_num(n, ia); store_bigint_result(ba, ia); } MVMnum64 MVM_bigint_div_num(MVMThreadContext *tc, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMnum64 c; if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); int max_size = DIGIT_BIT * MAX(USED(ia), USED(ib)); if (max_size > 1023) { mp_int reduced_a, reduced_b; mp_init(&reduced_a); mp_init(&reduced_b); mp_div_2d(ia, max_size - 1023, &reduced_a, NULL); mp_div_2d(ib, max_size - 1023, &reduced_b, NULL); c = mp_get_double(&reduced_a) / mp_get_double(&reduced_b); mp_clear(&reduced_a); mp_clear(&reduced_b); } else { c = mp_get_double(ia) / mp_get_double(ib); } clear_temp_bigints(tmp, 2); } else { c = (double)ba->u.smallint.value / (double)bb->u.smallint.value; } return c; } void MVM_bigint_rand(MVMThreadContext *tc, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); mp_int *tmp[1] = { NULL }; mp_int *rnd = MVM_malloc(sizeof(mp_int)); mp_int *max = force_bigint(bb, tmp); mp_init(rnd); mp_rand(rnd, USED(max) + 1); mp_mod(rnd, max, rnd); store_bigint_result(ba, rnd); clear_temp_bigints(tmp, 1); } MVMint64 MVM_bigint_is_prime(MVMThreadContext *tc, MVMObject *a, MVMint64 b) { /* mp_prime_is_prime returns True for 1, and I think * it's worth special-casing this particular number :-) */ MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba) || ba->u.smallint.value != 1) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); if (mp_cmp_d(ia, 1) == MP_EQ) { clear_temp_bigints(tmp, 1); return 0; } else { int result; mp_prime_is_prime(ia, b, &result); clear_temp_bigints(tmp, 1); return result; } } else { // we only reach this if we have a smallint that's equal to 1. // which we define as not-prime. return 0; } } /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) MVMObject * MVM_bigint_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag, MVMObject *type) { MVMObject *result; MVMint64 chars = MVM_string_graphs(tc, str); MVMuint16 neg = 0; MVMint64 ch; mp_int zvalue; mp_int zbase; MVMObject *value_obj; mp_int *value; MVMP6bigintBody *bvalue; MVMObject *base_obj; mp_int *base; MVMP6bigintBody *bbase; MVMObject *pos_obj; MVMint64 pos = -1; if (radix > 36) { MVM_exception_throw_adhoc(tc, "Cannot convert radix of %"PRId64" (max 36)", radix); } MVM_gc_root_temp_push(tc, (MVMCollectable **)&str); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); /* initialize the object */ result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); mp_init(&zvalue); mp_init(&zbase); mp_set_int(&zbase, 1); value_obj = MVM_repr_alloc_init(tc, type); MVM_repr_push_o(tc, result, value_obj); MVM_gc_root_temp_push(tc, (MVMCollectable **)&value_obj); base_obj = MVM_repr_alloc_init(tc, type); MVM_repr_push_o(tc, result, base_obj); bvalue = get_bigint_body(tc, value_obj); bbase = get_bigint_body(tc, base_obj); value = MVM_malloc(sizeof(mp_int)); base = MVM_malloc(sizeof(mp_int)); mp_init(value); mp_init(base); mp_set_int(base, 1); ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; if ((flag & 0x02) && (ch == '+' || ch == '-')) { neg = (ch == '-'); offset++; ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; } while (offset < chars) { if (ch >= '0' && ch <= '9') ch = ch - '0'; /* fast-path for ASCII 0..9 */ else if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 10; else if (ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 10; else if (ch >= 0xFF21 && ch <= 0xFF3A) ch = ch - 0xFF21 + 10; /* uppercase fullwidth */ else if (ch >= 0xFF41 && ch <= 0xFF5A) ch = ch - 0xFF41 + 10; /* lowercase fullwidth */ else if (ch > 0 && MVM_unicode_codepoint_has_property_value(tc, ch, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Nd")))) { /* as of Unicode 6.0.0, characters with the 'de' Numeric Type (and are * thus also of General Category Nd, since 4.0.0) are contiguous * sequences of 10 chars whose Numeric Values ascend from 0 through 9. */ /* the string returned for NUMERIC_VALUE contains a floating point * value, so atoi will stop on the . in the string. This is fine * though, since we'd have to truncate the float regardless. */ ch = atoi(MVM_unicode_codepoint_get_property_cstr(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_VALUE)); } else break; if (ch >= radix) break; mp_mul_d(&zvalue, radix, &zvalue); mp_add_d(&zvalue, ch, &zvalue); mp_mul_d(&zbase, radix, &zbase); offset++; pos = offset; if (ch != 0 || !(flag & 0x04)) { mp_copy(&zvalue, value); mp_copy(&zbase, base); } if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); if (ch != '_') continue; offset++; if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); } mp_clear(&zvalue); mp_clear(&zbase); if (neg || flag & 0x01) { mp_neg(value, value); } store_bigint_result(bvalue, value); store_bigint_result(bbase, base); pos_obj = MVM_repr_box_int(tc, type, pos); MVM_repr_push_o(tc, result, pos_obj); MVM_gc_root_temp_pop_n(tc, 4); return result; } /* returns 1 if a is too large to fit into an INTVAL without loss of information */ MVMint64 MVM_bigint_is_big(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *b = ba->u.bigint; MVMint64 is_big = b->used > 1; /* XXX somebody please check that on a 32 bit platform */ if ( sizeof(MVMint64) * 8 > DIGIT_BIT && is_big == 0 && DIGIT(b, 0) & ~0x7FFFFFFFUL) is_big = 1; return is_big; } else { // if it's in a smallint, it's 32 bits big at most and fits into an INTVAL easily. return 0; } } MVMint64 MVM_bigint_bool(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *body = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(body)) return !mp_iszero(body->u.bigint); else return body->u.smallint.value != 0; } MoarVM-2015.11/src/math/bigintops.h0000644000175000017500000000512712623370227015750 0ustar jnthnjnthnint MVM_bigint_mp_set_uint64(mp_int * a, MVMuint64 b); void MVM_bigint_abs(MVMThreadContext *tc, MVMObject *result, MVMObject *a); void MVM_bigint_neg(MVMThreadContext *tc, MVMObject *result, MVMObject *a); MVMObject * MVM_bigint_not(MVMThreadContext *tc, MVMObject *result, MVMObject *a); /* unused */ /* void MVM_bigint_sqrt(MVMObject *b, MVMObject *a); */ MVMObject * MVM_bigint_add(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_sub(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_mul(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_div(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_mod(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_pow(MVMThreadContext *tc, MVMObject *a, MVMObject *b, MVMObject *num_type, MVMObject *int_type); MVMObject * MVM_bigint_gcd(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_lcm(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_or(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_xor(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_and(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_shl(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMint64 n); MVMObject * MVM_bigint_shr(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMint64 n); void MVM_bigint_expmod(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b, MVMObject *c); MVMint64 MVM_bigint_cmp(MVMThreadContext *tc, MVMObject *a, MVMObject *b); void MVM_bigint_from_str(MVMThreadContext *tc, MVMObject *a, const char *buf); MVMString * MVM_bigint_to_str(MVMThreadContext *tc, MVMObject *a, int base); MVMnum64 MVM_bigint_to_num(MVMThreadContext *tc, MVMObject *a); void MVM_bigint_from_num(MVMThreadContext *tc, MVMObject *a, MVMnum64 n); MVMnum64 MVM_bigint_div_num(MVMThreadContext *tc, MVMObject *a, MVMObject *b); void MVM_bigint_rand(MVMThreadContext *tc, MVMObject *a, MVMObject *b); MVMint64 MVM_bigint_is_prime(MVMThreadContext *tc, MVMObject *a, MVMint64 b); MVMObject * MVM_bigint_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag, MVMObject *type); MVMint64 MVM_bigint_is_big(MVMThreadContext *tc, MVMObject *a); MVMint64 MVM_bigint_bool(MVMThreadContext *tc, MVMObject *a); MoarVM-2015.11/src/math/num.c0000644000175000017500000000172012613656332014542 0ustar jnthnjnthn#include "moar.h" #include #ifdef _WIN32 #include #endif #ifdef INFINITY static const MVMnum64 MVM_NUM_POSINF = INFINITY; static const MVMnum64 MVM_NUM_NEGINF = -INFINITY; #else #ifdef _MSC_VER #define MVM_NUM_POSINF (DBL_MAX+DBL_MAX) #define MVM_NUM_NEGINF -(DBL_MAX+DBL_MAX) #else static const MVMnum64 MVM_NUM_POSINF = 1.0 / 0.0; static const MVMnum64 MVM_NUM_NEGINF = -1.0 / 0.0; #endif #endif #ifdef NAN static const MVMnum64 MVM_NUM_NAN = NAN; #else #ifdef _MSC_VER #define MVM_NUM_NAN (MVM_NUM_POSINF-MVM_NUM_POSINF) #else static const MVMnum64 MVM_NUM_NAN = 0.0 / 0.0; #endif #endif MVMint64 MVM_num_isnanorinf(MVMThreadContext *tc, MVMnum64 n) { return n == MVM_NUM_POSINF || n == MVM_NUM_NEGINF || n != n; } MVMnum64 MVM_num_posinf(MVMThreadContext *tc) { return MVM_NUM_POSINF; } MVMnum64 MVM_num_neginf(MVMThreadContext *tc) { return MVM_NUM_NEGINF; } MVMnum64 MVM_num_nan(MVMThreadContext *tc) { return MVM_NUM_NAN; } MoarVM-2015.11/src/math/num.h0000644000175000017500000000031112456307241014537 0ustar jnthnjnthnMVMint64 MVM_num_isnanorinf(MVMThreadContext *tc, MVMnum64 n); MVMnum64 MVM_num_posinf(MVMThreadContext *tc); MVMnum64 MVM_num_neginf(MVMThreadContext *tc); MVMnum64 MVM_num_nan(MVMThreadContext *tc); MoarVM-2015.11/src/moar.c0000644000175000017500000003652512623370227013760 0ustar jnthnjnthn#include "moar.h" #include #define init_mutex(loc, name) do { \ if ((init_stat = uv_mutex_init(&loc)) < 0) { \ fprintf(stderr, "MoarVM: Initialization of " name " mutex failed\n %s\n", \ uv_strerror(init_stat)); \ exit(1); \ } \ } while (0) static void setup_std_handles(MVMThreadContext *tc); /* Create a new instance of the VM. */ MVMInstance * MVM_vm_create_instance(void) { MVMInstance *instance; char *spesh_log, *spesh_nodelay, *spesh_disable, *spesh_inline_disable, *spesh_osr_disable; char *jit_log, *jit_disable, *jit_bytecode_dir; char *dynvar_log; int init_stat; /* Set up instance data structure. */ instance = MVM_calloc(1, sizeof(MVMInstance)); /* Create the main thread's ThreadContext and stash it. */ instance->main_thread = MVM_tc_create(instance); instance->main_thread->thread_id = 1; /* No user threads when we start, and next thread to be created gets ID 2 * (the main thread got ID 1). */ instance->num_user_threads = 0; MVM_store(&instance->next_user_thread_id, 2); /* Set up the permanent roots storage. */ instance->num_permroots = 0; instance->alloc_permroots = 16; instance->permroots = MVM_malloc(sizeof(MVMCollectable **) * instance->alloc_permroots); init_mutex(instance->mutex_permroots, "permanent roots"); /* Create fixed size allocator. */ instance->fsa = MVM_fixed_size_create(instance->main_thread); /* Set up REPR registry mutex. */ init_mutex(instance->mutex_repr_registry, "REPR registry"); /* Set up HLL config mutex. */ init_mutex(instance->mutex_hllconfigs, "hll configs"); /* Set up DLL registry mutex. */ init_mutex(instance->mutex_dll_registry, "REPR registry"); /* Set up extension registry mutex. */ init_mutex(instance->mutex_ext_registry, "extension registry"); /* Set up extension op registry mutex. */ init_mutex(instance->mutex_extop_registry, "extension op registry"); /* Set up weak reference hash mutex. */ init_mutex(instance->mutex_sc_weakhash, "sc weakhash"); /* Set up loaded compunits hash mutex. */ init_mutex(instance->mutex_loaded_compunits, "loaded compunits"); /* Set up container registry mutex. */ init_mutex(instance->mutex_container_registry, "container registry"); /* Set up persistent object ID hash mutex. */ init_mutex(instance->mutex_object_ids, "object ID hash"); /* Allocate all things during following setup steps directly in gen2, as * they will have program lifetime. */ MVM_gc_allocate_gen2_default_set(instance->main_thread); init_mutex(instance->mutex_int_const_cache, "int constant cache"); instance->int_const_cache = MVM_calloc(1, sizeof(MVMIntConstCache)); /* Bootstrap 6model. It is assumed the GC will not be called during this. */ MVM_6model_bootstrap(instance->main_thread); /* Fix up main thread's usecapture. */ instance->main_thread->cur_usecapture = MVM_repr_alloc_init(instance->main_thread, instance->CallCapture); /* Initialize event loop thread starting mutex. */ init_mutex(instance->mutex_event_loop_start, "event loop thread start"); /* Create main thread object, and also make it the start of the all threads * linked list. */ MVM_store(&instance->threads, (instance->main_thread->thread_obj = (MVMThread *) REPR(instance->boot_types.BOOTThread)->allocate( instance->main_thread, STABLE(instance->boot_types.BOOTThread)))); instance->threads->body.stage = MVM_thread_stage_started; instance->threads->body.tc = instance->main_thread; instance->threads->body.native_thread_id = MVM_platform_thread_id(); instance->threads->body.thread_id = instance->main_thread->thread_id; /* Create compiler registry */ instance->compiler_registry = MVM_repr_alloc_init(instance->main_thread, instance->boot_types.BOOTHash); /* Set up compiler registr mutex. */ init_mutex(instance->mutex_compiler_registry, "compiler registry"); /* Create hll symbol tables */ instance->hll_syms = MVM_repr_alloc_init(instance->main_thread, instance->boot_types.BOOTHash); /* Set up hll symbol tables mutex. */ init_mutex(instance->mutex_hll_syms, "hll syms"); /* Initialize string cclass handling. */ MVM_string_cclass_init(instance->main_thread); /* Create callsite intern pool. */ instance->callsite_interns = MVM_calloc(1, sizeof(MVMCallsiteInterns)); init_mutex(instance->mutex_callsite_interns, "callsite interns"); /* Allocate int to str cache. */ instance->int_to_str_cache = MVM_calloc(MVM_INT_TO_STR_CACHE_SIZE, sizeof(MVMString *)); /* There's some callsites we statically use all over the place. Intern * them, so that spesh may end up optimizing more "internal" stuff. */ MVM_callsite_initialize_common(instance->main_thread); /* Multi-cache additions mutex. */ init_mutex(instance->mutex_multi_cache_add, "multi-cache addition"); /* Current instrumentation level starts at 1; used to trigger all frames * to be verified before their first run. */ instance->instrumentation_level = 1; /* Mutex for spesh installations, and check if we've a file we * should log specializations to. */ init_mutex(instance->mutex_spesh_install, "spesh installations"); spesh_log = getenv("MVM_SPESH_LOG"); if (spesh_log && strlen(spesh_log)) instance->spesh_log_fh = fopen(spesh_log, "w"); spesh_disable = getenv("MVM_SPESH_DISABLE"); if (!spesh_disable || strlen(spesh_disable) == 0) { instance->spesh_enabled = 1; spesh_inline_disable = getenv("MVM_SPESH_INLINE_DISABLE"); if (!spesh_inline_disable || strlen(spesh_inline_disable) == 0) instance->spesh_inline_enabled = 1; spesh_osr_disable = getenv("MVM_SPESH_OSR_DISABLE"); if (!spesh_osr_disable || strlen(spesh_osr_disable) == 0) instance->spesh_osr_enabled = 1; } /* Should we specialize without warm up delays? Used to find bugs in the * specializer and JIT. */ spesh_nodelay = getenv("MVM_SPESH_NODELAY"); if (spesh_nodelay && strlen(spesh_nodelay)) { instance->spesh_nodelay = 1; } /* JIT environment/logging setup. */ jit_disable = getenv("MVM_JIT_DISABLE"); if (!jit_disable || strlen(jit_disable) == 0) instance->jit_enabled = 1; jit_log = getenv("MVM_JIT_LOG"); if (jit_log && strlen(jit_log)) instance->jit_log_fh = fopen(jit_log, "w"); jit_bytecode_dir = getenv("MVM_JIT_BYTECODE_DIR"); if (jit_bytecode_dir && strlen(jit_bytecode_dir)) { char *bytecode_map_name = MVM_malloc(strlen(jit_bytecode_dir) + strlen("/jit-map.txt") + 1); sprintf(bytecode_map_name, "%s/jit-map.txt", jit_bytecode_dir); instance->jit_bytecode_map = fopen(bytecode_map_name, "w"); instance->jit_bytecode_dir = jit_bytecode_dir; MVM_free(bytecode_map_name); } instance->jit_seq_nr = 0; /* Various kinds of debugging that can be enabled. */ dynvar_log = getenv("MVM_DYNVAR_LOG"); if (dynvar_log && strlen(dynvar_log)) { instance->dynvar_log_fh = fopen(dynvar_log, "w"); fprintf(instance->dynvar_log_fh, "+ x 0 0 0 0 0 %llu\n", uv_hrtime()); fflush(instance->dynvar_log_fh); instance->dynvar_log_lasttime = uv_hrtime(); } else instance->dynvar_log_fh = NULL; instance->nfa_debug_enabled = getenv("MVM_NFA_DEB") ? 1 : 0; if (getenv("MVM_CROSS_THREAD_WRITE_LOG")) { instance->cross_thread_write_logging = 1; instance->cross_thread_write_logging_include_locked = getenv("MVM_CROSS_THREAD_WRITE_LOG_INCLUDE_LOCKED") ? 1 : 0; instance->instrumentation_level++; init_mutex(instance->mutex_cross_thread_write_logging, "cross thread write logging output"); } else { instance->cross_thread_write_logging = 0; } /* Set up NFG state mutation mutex. */ instance->nfg = calloc(1, sizeof(MVMNFGState)); init_mutex(instance->nfg->update_mutex, "NFG update mutex"); /* Create std[in/out/err]. */ setup_std_handles(instance->main_thread); /* Back to nursery allocation, now we're set up. */ MVM_gc_allocate_gen2_default_clear(instance->main_thread); return instance; } /* Set up some standard file handles. */ static void setup_std_handles(MVMThreadContext *tc) { tc->instance->stdin_handle = MVM_file_get_stdstream(tc, 0, 1); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->stdin_handle); tc->instance->stdout_handle = MVM_file_get_stdstream(tc, 1, 0); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->stdout_handle); tc->instance->stderr_handle = MVM_file_get_stdstream(tc, 2, 0); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&tc->instance->stderr_handle); } /* This callback is passed to the interpreter code. It takes care of making * the initial invocation. */ static void toplevel_initial_invoke(MVMThreadContext *tc, void *data) { /* Create initial frame, which sets up all of the interpreter state also. */ MVM_frame_invoke(tc, (MVMStaticFrame *)data, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } /* Loads bytecode from the specified file name and runs it. */ void MVM_vm_run_file(MVMInstance *instance, const char *filename) { MVMStaticFrame *start_frame; /* Map the compilation unit into memory and dissect it. */ MVMThreadContext *tc = instance->main_thread; MVMCompUnit *cu = MVM_cu_map_from_file(tc, filename); MVMROOT(tc, cu, { /* The call to MVM_string_utf8_decode() may allocate, invalidating the location cu->body.filename */ MVMString *const str = MVM_string_utf8_c8_decode(tc, instance->VMString, filename, strlen(filename)); cu->body.filename = str; /* Run deserialization frame, if there is one. */ if (cu->body.deserialize_frame) { MVM_interp_run(tc, toplevel_initial_invoke, cu->body.deserialize_frame); } }); /* Run the frame marked main, or if there is none then fall back to the * first frame. */ start_frame = cu->body.main_frame ? cu->body.main_frame : cu->body.frames[0]; MVM_interp_run(tc, toplevel_initial_invoke, start_frame); } /* Loads bytecode from the specified file name and dumps it. */ void MVM_vm_dump_file(MVMInstance *instance, const char *filename) { /* Map the compilation unit into memory and dissect it. */ MVMThreadContext *tc = instance->main_thread; MVMCompUnit *cu = MVM_cu_map_from_file(tc, filename); char *dump = MVM_bytecode_dump(tc, cu); printf("%s", dump); MVM_free(dump); } /* Exits the process as quickly as is gracefully possible, respecting that * foreground threads should join first. Leaves all cleanup to the OS, as it * will be able to do it much more swiftly than we could. This is typically * not the right thing for embedding; see MVM_vm_destroy_instance for that. */ void MVM_vm_exit(MVMInstance *instance) { /* Join any foreground threads. */ MVM_thread_join_foreground(instance->main_thread); /* Close any spesh or jit log. */ if (instance->spesh_log_fh) fclose(instance->spesh_log_fh); if (instance->jit_log_fh) fclose(instance->jit_log_fh); if (instance->jit_bytecode_map) fclose(instance->jit_bytecode_map); if (instance->dynvar_log_fh) { fprintf(instance->dynvar_log_fh, "- x 0 0 0 0 %lld %llu %llu\n", instance->dynvar_log_lasttime, uv_hrtime(), uv_hrtime()); fclose(instance->dynvar_log_fh); } /* And, we're done. */ exit(0); } /* Destroys a VM instance. This must be called only from the main thread. It * should clear up all resources and free all memory; in practice, it falls * short of this goal at the moment. */ void MVM_vm_destroy_instance(MVMInstance *instance) { /* Join any foreground threads. */ MVM_thread_join_foreground(instance->main_thread); /* Run the GC global destruction phase. After this, * no 6model object pointers should be accessed. */ MVM_gc_global_destruction(instance->main_thread); /* Cleanup REPR registry */ uv_mutex_destroy(&instance->mutex_repr_registry); MVM_HASH_DESTROY(hash_handle, MVMReprRegistry, instance->repr_hash); MVM_free(instance->repr_list); /* Clean up GC permanent roots related resources. */ uv_mutex_destroy(&instance->mutex_permroots); MVM_free(instance->permroots); /* Clean up Hash of HLLConfig. */ uv_mutex_destroy(&instance->mutex_hllconfigs); MVM_HASH_DESTROY(hash_handle, MVMHLLConfig, instance->compiler_hll_configs); MVM_HASH_DESTROY(hash_handle, MVMHLLConfig, instance->compilee_hll_configs); /* Clean up Hash of DLLs. */ uv_mutex_destroy(&instance->mutex_dll_registry); MVM_HASH_DESTROY(hash_handle, MVMDLLRegistry, instance->dll_registry); /* Clean up Hash of extensions. */ uv_mutex_destroy(&instance->mutex_ext_registry); MVM_HASH_DESTROY(hash_handle, MVMExtRegistry, instance->ext_registry); /* Clean up Hash of extension ops. */ uv_mutex_destroy(&instance->mutex_extop_registry); MVM_HASH_DESTROY(hash_handle, MVMExtOpRegistry, instance->extop_registry); /* Clean up Hash of all known serialization contexts. */ uv_mutex_destroy(&instance->mutex_sc_weakhash); MVM_HASH_DESTROY(hash_handle, MVMSerializationContextBody, instance->sc_weakhash); /* Clean up Hash of filenames of compunits loaded from disk. */ uv_mutex_destroy(&instance->mutex_loaded_compunits); MVM_HASH_DESTROY(hash_handle, MVMLoadedCompUnitName, instance->loaded_compunits); /* Clean up Container registry. */ uv_mutex_destroy(&instance->mutex_container_registry); MVM_HASH_DESTROY(hash_handle, MVMContainerRegistry, instance->container_registry); /* Clean up Hash of compiler objects keyed by name. */ uv_mutex_destroy(&instance->mutex_compiler_registry); /* Clean up Hash of hashes of symbol tables per hll. */ uv_mutex_destroy(&instance->mutex_hll_syms); /* Clean up multi cache addition mutex. */ uv_mutex_destroy(&instance->mutex_multi_cache_add); /* Clean up spesh install mutex and close any log. */ uv_mutex_destroy(&instance->mutex_spesh_install); if (instance->spesh_log_fh) fclose(instance->spesh_log_fh); if (instance->jit_log_fh) fclose(instance->jit_log_fh); /* Clean up event loop starting mutex. */ uv_mutex_destroy(&instance->mutex_event_loop_start); /* Destroy main thread contexts. */ MVM_tc_destroy(instance->main_thread); /* Clear up VM instance memory. */ MVM_free(instance); } void MVM_vm_set_clargs(MVMInstance *instance, int argc, char **argv) { instance->num_clargs = argc; instance->raw_clargs = argv; } void MVM_vm_set_exec_name(MVMInstance *instance, const char *exec_name) { instance->exec_name = exec_name; } void MVM_vm_set_prog_name(MVMInstance *instance, const char *prog_name) { instance->prog_name = prog_name; } void MVM_vm_set_lib_path(MVMInstance *instance, int count, const char **lib_path) { enum { MAX_COUNT = sizeof instance->lib_path / sizeof *instance->lib_path }; int i = 0; if (count > MAX_COUNT) MVM_panic(1, "Cannot set more than %i library paths", MAX_COUNT); for (; i < count; ++i) instance->lib_path[i] = lib_path[i]; /* Clear remainder to allow repeated calls */ for (; i < MAX_COUNT; ++i) instance->lib_path[i] = NULL; } MoarVM-2015.11/src/moar.h0000644000175000017500000001436112623370227013757 0ustar jnthnjnthn#include #include #include #include #include /* Configuration. */ #include "gen/config.h" /* Standard integer types. */ #include /* platform-specific setjmp override */ #include /* stuff for uthash */ #define uthash_fatal(msg) MVM_exception_throw_adhoc(tc, "internal hash error: " msg) #include /* libuv * must precede atomic_ops.h so we get the ordering of Winapi headers right */ #include /* libatomic_ops */ #define AO_REQUIRE_CAS #include /* libffi or dynload/dyncall/dyncallback */ #ifdef HAVE_LIBFFI #include #else #include #include #include #endif /* forward declarations */ #include "types.h" /* Sized types. */ typedef int8_t MVMint8; typedef uint8_t MVMuint8; typedef int16_t MVMint16; typedef uint16_t MVMuint16; typedef int32_t MVMint32; typedef uint32_t MVMuint32; typedef int64_t MVMint64; typedef uint64_t MVMuint64; typedef float MVMnum32; typedef double MVMnum64; /* Alignment. */ #if HAVE_ALIGNOF /* A GCC extension. */ #define ALIGNOF(t) __alignof__(t) #elif defined _MSC_VER /* MSVC extension. */ #define ALIGNOF(t) __alignof(t) #else /* Alignment by measuring structure padding. */ #define ALIGNOF(t) ((char *)(&((struct { char c; t _h; } *)0)->_h) - (char *)0) #endif #if defined MVM_BUILD_SHARED # define MVM_PUBLIC MVM_DLL_EXPORT # define MVM_PRIVATE MVM_DLL_LOCAL #elif defined MVM_SHARED # define MVM_PUBLIC MVM_DLL_IMPORT # define MVM_PRIVATE MVM_DLL_LOCAL #else # define MVM_PUBLIC # define MVM_PRIVATE #endif #if MVM_PTR_SIZE < 8 # define MVM_USE_OVERFLOW_SERIALIZATION_INDEX #endif #if defined _MSC_VER # define MVM_USED_BY_JIT __pragma(optimize( "g", off )) #else # define MVM_USED_BY_JIT #endif MVM_PUBLIC const MVMint32 MVM_jit_support(void); /* Headers for various other data structures and APIs. */ #include "6model/6model.h" #include "gc/wb.h" #include "core/threadcontext.h" #include "core/instance.h" #include "core/interp.h" #include "core/callsite.h" #include "core/args.h" #include "core/exceptions.h" #include "core/alloc.h" #include "core/frame.h" #include "core/validation.h" #include "core/compunit.h" #include "core/bytecode.h" #include "core/bytecodedump.h" #include "core/ops.h" #include "core/threads.h" #include "core/hll.h" #include "core/loadbytecode.h" #include "math/num.h" #include "core/coerce.h" #include "core/ext.h" #ifdef HAVE_LIBFFI #include "core/nativecall_libffi.h" #else #include "core/nativecall_dyncall.h" #endif #include "core/nativecall.h" #include "core/dll.h" #include "core/continuation.h" #include "6model/reprs.h" #include "6model/reprconv.h" #include "6model/bootstrap.h" #include "6model/containers.h" #include "6model/sc.h" #include "6model/serialization.h" #include "6model/parametric.h" #include "gc/gen2.h" #include "gc/allocation.h" #include "gc/worklist.h" #include "gc/collect.h" #include "gc/orchestrate.h" #include "gc/roots.h" #include "gc/objectid.h" #include "gc/finalize.h" #include "spesh/dump.h" #include "spesh/graph.h" #include "spesh/codegen.h" #include "spesh/candidate.h" #include "spesh/manipulate.h" #include "spesh/args.h" #include "spesh/facts.h" #include "spesh/optimize.h" #include "spesh/deopt.h" #include "spesh/log.h" #include "spesh/threshold.h" #include "spesh/inline.h" #include "spesh/osr.h" #include "strings/normalize.h" #include "strings/decode_stream.h" #include "strings/ascii.h" #include "strings/utf8.h" #include "strings/utf8_c8.h" #include "strings/utf16.h" #include "strings/nfg.h" #include "strings/iter.h" #include "strings/ops.h" #include "strings/unicode_gen.h" #include "strings/unicode.h" #include "strings/latin1.h" #include "strings/windows1252.h" #include "io/io.h" #include "io/eventloop.h" #include "io/syncfile.h" #include "io/syncstream.h" #include "io/syncpipe.h" #include "io/syncsocket.h" #include "io/fileops.h" #include "io/dirops.h" #include "io/procops.h" #include "io/timers.h" #include "io/filewatchers.h" #include "io/signals.h" #include "io/asyncsocket.h" #include "math/bigintops.h" #include "mast/driver.h" #include "core/intcache.h" #include "core/fixedsizealloc.h" #include "jit/graph.h" #include "jit/compile.h" #include "jit/log.h" #include "profiler/instrument.h" #include "profiler/log.h" #include "profiler/profile.h" #include "instrument/crossthreadwrite.h" MVMObject *MVM_backend_config(MVMThreadContext *tc); /* Top level VM API functions. */ MVM_PUBLIC MVMInstance * MVM_vm_create_instance(void); MVM_PUBLIC void MVM_vm_run_file(MVMInstance *instance, const char *filename); MVM_PUBLIC void MVM_vm_dump_file(MVMInstance *instance, const char *filename); MVM_PUBLIC MVM_NO_RETURN void MVM_vm_exit(MVMInstance *instance) MVM_NO_RETURN_GCC; MVM_PUBLIC void MVM_vm_destroy_instance(MVMInstance *instance); MVM_PUBLIC void MVM_vm_set_clargs(MVMInstance *instance, int argc, char **argv); MVM_PUBLIC void MVM_vm_set_exec_name(MVMInstance *instance, const char *exec_name); MVM_PUBLIC void MVM_vm_set_prog_name(MVMInstance *instance, const char *prog_name); MVM_PUBLIC void MVM_vm_set_lib_path(MVMInstance *instance, int count, const char **lib_path); /* Returns original. Use only on AO_t-sized values (including pointers). */ #define MVM_incr(addr) AO_fetch_and_add1_full((volatile AO_t *)(addr)) #define MVM_decr(addr) AO_fetch_and_sub1_full((volatile AO_t *)(addr)) #define MVM_add(addr, add) AO_fetch_and_add_full((volatile AO_t *)(addr), (AO_t)(add)) /* Returns non-zero for success. Use for both AO_t numbers and pointers. */ #define MVM_trycas(addr, old, new) AO_compare_and_swap_full((volatile AO_t *)(addr), (AO_t)(old), (AO_t)(new)) /* Returns the old value dereferenced at addr. */ #define MVM_cas(addr, old, new) AO_fetch_compare_and_swap_full((addr), (old), (new)) /* Returns the old pointer value dereferenced at addr. Provided for a tiny bit of type safety. */ #define MVM_casptr(addr, old, new) ((void *)MVM_cas((AO_t *)(addr), (AO_t)(old), (AO_t)(new))) /* Full memory barrier. */ #define MVM_barrier() AO_nop_full() /* Need to use these to assign to or read from any memory locations on * which the other atomic operation macros are used... */ #define MVM_store(addr, new) AO_store_full((volatile AO_t *)(addr), (AO_t)(new)) #define MVM_load(addr) AO_load_full((volatile AO_t *)(addr)) MoarVM-2015.11/src/platform/inttypes.h0000644000175000017500000000024512516136714016522 0ustar jnthnjnthn#ifdef _MSC_VER #include /* Print size_t values. */ #define MVM_PRSz "Iu" #else #include #define MVM_PRSz "zu" /* C99 */ #endif MoarVM-2015.11/src/platform/io.h0000644000175000017500000000033212620140151015231 0ustar jnthnjnthn#if defined _WIN32 MVMint64 MVM_platform_lseek(int fd, MVMint64 offset, int origin); MVMint64 MVM_platform_unlink(const char *pathname); #else #define MVM_platform_lseek lseek #define MVM_platform_unlink unlink #endif MoarVM-2015.11/src/platform/mmap.h0000644000175000017500000000063112456307241015572 0ustar jnthnjnthn#define MVM_PAGE_READ 1 #define MVM_PAGE_WRITE 2 #define MVM_PAGE_EXEC 4 void *MVM_platform_alloc_pages(size_t size, int mode); int MVM_platform_set_page_mode(void * block, size_t size, int mode); int MVM_platform_free_pages(void *block, size_t size); void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable); int MVM_platform_unmap_file(void *block, void *handle, size_t size); MoarVM-2015.11/src/platform/posix/mmap.c0000644000175000017500000000376012613656332016740 0ustar jnthnjnthn#include #include #include "moar.h" #include "platform/mmap.h" #include /* MAP_ANONYMOUS is Linux, MAP_ANON is BSD */ #ifndef MVM_MAP_ANON #if defined(MAP_ANONYMOUS) #define MVM_MAP_ANON MAP_ANONYMOUS #elif defined(MAP_ANON) #define MVM_MAP_ANON MAP_ANON #else #error "Anonymous mmap() not supported. You need to define MVM_MAP_ANON manually if it is." #endif #endif static int page_mode_to_prot_mode(int page_mode) { switch (page_mode) { case MVM_PAGE_READ: return PROT_READ; case MVM_PAGE_WRITE: return PROT_WRITE; case (MVM_PAGE_READ|MVM_PAGE_WRITE): return PROT_READ|PROT_WRITE; case MVM_PAGE_EXEC: return PROT_EXEC; case (MVM_PAGE_READ|MVM_PAGE_EXEC): return PROT_READ|PROT_EXEC; case (MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PROT_WRITE|PROT_EXEC; case (MVM_PAGE_READ|MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PROT_READ|PROT_WRITE|PROT_EXEC; default: return PROT_NONE; } } void *MVM_platform_alloc_pages(size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); void *block = mmap(NULL, size, prot_mode, MVM_MAP_ANON | MAP_PRIVATE, -1, 0); if (block == MAP_FAILED) MVM_panic(1, "MVM_platform_alloc_pages failed: %d", errno); return block; } int MVM_platform_set_page_mode(void * block, size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); return mprotect(block, size, prot_mode) == 0; } int MVM_platform_free_pages(void *block, size_t size) { return munmap(block, size) == 0; } void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable) { void *block = mmap(NULL, size, writable ? PROT_READ | PROT_WRITE : PROT_READ, writable ? MAP_SHARED : MAP_PRIVATE, fd, 0); (void)handle; return block != MAP_FAILED ? block : NULL; } int MVM_platform_unmap_file(void *block, void *handle, size_t size) { (void)handle; return munmap(block, size) == 0; } MoarVM-2015.11/src/platform/posix/sys.c0000644000175000017500000000221012613656332016611 0ustar jnthnjnthn#define _GNU_SOURCE #include "moar.h" #include "platform/sys.h" #if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 6) || defined(__FreeBSD_kernel__) #include #if defined _SC_NPROCESSORS_ONLN # define SYSCONF_ARG _SC_NPROCESSORS_ONLN #elif defined _SC_NPROC_ONLN # define SYSCONF_ARG _SC_NPROC_ONLN #else # include # if defined HW_AVAILCPU # define SYSCTL_ARG HW_AVAILCPU # elif defined HW_NCPU # define SYSCTL_ARG HW_NCPU # endif #endif #if defined SYSCONF_ARG MVMuint32 MVM_platform_cpu_count(void) { long count = sysconf(SYSCONF_ARG); if (count < 0) return 0; return (MVMuint32)count; } #elif defined SYSCTL_ARG MVMuint32 MVM_platform_cpu_count(void) { int mib[2] = { CTL_HW, SYSCTL_ARG }; int count; int size = sizeof count; if (sysctl(mib, 2, &count, &size, NULL, 0) != 0) return 0; return (MVMuint32)count; } #else #error "Unsupported platform" #endif #else MVMuint32 MVM_platform_cpu_count(void) { cpu_set_t set; if (pthread_getaffinity_np(pthread_self(), sizeof set, &set) != 0) return 0; return CPU_COUNT(&set); } #endif MoarVM-2015.11/src/platform/posix/time.c0000644000175000017500000000164512613656332016744 0ustar jnthnjnthn#include "moar.h" #include "platform/time.h" #include #include #define E9 1000000000 #define E9F 1000000000.0f MVMuint64 MVM_platform_now(void) { #ifdef CLOCK_REALTIME struct timespec ts; if (clock_gettime(CLOCK_REALTIME, &ts) != 0) return 0; return (MVMuint64)ts.tv_sec * E9 + ts.tv_nsec; #else struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return 0; return (MVMuint64)tv.tv_sec * E9 + tv.tv_usec * 1000; #endif } void MVM_platform_sleep(MVMnum64 second) { struct timespec timeout; timeout.tv_sec = (time_t)second; timeout.tv_nsec = (long)((second - timeout.tv_sec) * E9F); while (nanosleep(&timeout, &timeout) && errno == EINTR); } void MVM_platform_nanosleep(MVMuint64 nanos) { struct timespec timeout; timeout.tv_sec = nanos / E9; timeout.tv_nsec = nanos % E9; while (nanosleep(&timeout, &timeout) && errno == EINTR); } MoarVM-2015.11/src/platform/setjmp.h0000644000175000017500000000105612623370227016144 0ustar jnthnjnthn/* MinGW x64 BUGFIX: Pass a NULL argument instead of the frame pointer to the * setjmp implementation to make the JIT not choke on exceptions on MinGW. * cygx++ for fix */ #ifdef __MINGW32__ # ifndef USE_NO_MINGW_SETJMP_TWO_ARGS # undef setjmp # ifndef _INC_SETJMPEX # ifdef _WIN64 # define setjmp(BUF) _setjmp((BUF), NULL) # else # define setjmp(BUF) _setjmp3((BUF), NULL) # endif # else # define setjmp(BUF) _setjmpex((BUF), NULL) # define setjmpex(BUF) _setjmpex((BUF), NULL) # endif # endif #endif MoarVM-2015.11/src/platform/stdint.h0000644000175000017500000000012012456307241016136 0ustar jnthnjnthn#ifdef _MSC_VER #include #else #include #endif MoarVM-2015.11/src/platform/sys.h0000755000175000017500000000022112456307241015454 0ustar jnthnjnthn/* Tries to determine the number of logical CPUs available to the process. * May return 0 on error. */ MVMuint32 MVM_platform_cpu_count(void); MoarVM-2015.11/src/platform/threads.h0000644000175000017500000000101512516136714016271 0ustar jnthnjnthn#if defined _WIN32 #define MVM_platform_thread_yield SwitchToThread #elif defined MVM_HAS_PTHREAD_YIELD #include #define MVM_platform_thread_yield pthread_yield #else #include #define MVM_platform_thread_yield sched_yield #endif #if defined _WIN32 #define MVM_platform_thread_exit(status) ExitThread(0) #define MVM_platform_thread_id() (MVMint64)GetCurrentThreadId() #else #define MVM_platform_thread_exit(status) pthread_exit(status) #define MVM_platform_thread_id() (MVMint64)uv_thread_self() #endif MoarVM-2015.11/src/platform/time.h0000644000175000017500000000043712573775575015625 0ustar jnthnjnthn/* Gets time since the epoch in nanoseconds. * In principle, may return 0 on error. */ MVMuint64 MVM_platform_now(void); /* Tries to sleep for at least the requested number * of nanoseconds. */ void MVM_platform_sleep(MVMnum64 second); void MVM_platform_nanosleep(MVMuint64 nanos); MoarVM-2015.11/src/platform/win32/io.c0000644000175000017500000000537612620140151016203 0ustar jnthnjnthn#include #include /* undocumented, so check if these really hold */ #if SEEK_SET != FILE_BEGIN || \ SEEK_CUR != FILE_CURRENT || \ SEEK_END != FILE_END #error "Standard and WinAPI seek modes not compatible" #endif static wchar_t * UTF8ToUnicode(const char *str) { const int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, str, -1, result, len); return result; } MVMint64 MVM_platform_lseek(int fd, MVMint64 offset, int origin) { HANDLE hf; LARGE_INTEGER li; hf = (HANDLE)_get_osfhandle(fd); if (hf == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } li.QuadPart = offset; li.LowPart = SetFilePointer(hf, li.LowPart, &li.HighPart, origin); if (li.LowPart == INVALID_SET_FILE_POINTER) { errno = ESPIPE; return -1; } return li.QuadPart; } MVMint64 MVM_platform_unlink(const char *pathname) { /* Must using UTF8ToUnicode for supporting CJK Windows file name. */ wchar_t *wpathname = UTF8ToUnicode(pathname); int str_len = wcslen(wpathname); int r; DWORD attrs; if (str_len > MAX_PATH) { wchar_t abs_wpathname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wpathname, 4096, abs_wpathname, &lpp_part)) { errno = ENOENT; return -1; } MVM_free(wpathname); str_len = wcslen(abs_wpathname); wpathname = (wchar_t *)MVM_malloc((str_len + 4) * sizeof(wchar_t)); wcscpy(wpathname, L"\\\\?\\"); wcscat(wpathname, abs_wpathname); } attrs = GetFileAttributesW(wpathname); if (attrs == INVALID_FILE_ATTRIBUTES) { MVM_free(wpathname); errno = ENOENT; return -1; } else if (attrs & FILE_ATTRIBUTE_READONLY) { (void)SetFileAttributesW(wpathname, attrs & ~FILE_ATTRIBUTE_READONLY); r = DeleteFileW(wpathname); if (r == 0) { (void)SetFileAttributesW(wpathname, attrs); } } else { r = DeleteFileW(wpathname); } if (r == 0) { DWORD LastError = GetLastError(); MVM_free(wpathname); if (LastError == ERROR_FILE_NOT_FOUND) { errno = ENOENT; } else if (LastError == ERROR_ACCESS_DENIED) { errno = EACCES; } return -1; } MVM_free(wpathname); return 0; } MoarVM-2015.11/src/platform/win32/mmap.c0000644000175000017500000000422012502366742016530 0ustar jnthnjnthn#include #include #include "platform/mmap.h" static int page_mode_to_prot_mode(int page_mode) { switch (page_mode) { case MVM_PAGE_READ: return PAGE_READONLY; case MVM_PAGE_WRITE: case (MVM_PAGE_WRITE | MVM_PAGE_READ): return PAGE_READWRITE; case MVM_PAGE_EXEC: return PAGE_EXECUTE; case (MVM_PAGE_READ|MVM_PAGE_EXEC): return PAGE_EXECUTE_READ; case (MVM_PAGE_WRITE|MVM_PAGE_EXEC): case (MVM_PAGE_READ|MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PAGE_EXECUTE_READWRITE; } /* I pity the fools that enter an invalid mode */ return PAGE_NOACCESS; } void *MVM_platform_alloc_pages(size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); void * allocd = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, prot_mode); if (!allocd) MVM_panic(1, "MVM_platform_alloc_pages failed: %d", GetLastError()); return allocd; } int MVM_platform_set_page_mode(void * pages, size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); DWORD oldMode; return VirtualProtect(pages, size, prot_mode, &oldMode); } int MVM_platform_free_pages(void *pages, size_t size) { (void)size; return VirtualFree(pages, 0, MEM_RELEASE); } void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable) { HANDLE fh, mapping; LARGE_INTEGER li; void *block; fh = (HANDLE)_get_osfhandle(fd); if (fh == INVALID_HANDLE_VALUE) return NULL; li.QuadPart = size; mapping = CreateFileMapping(fh, NULL, writable ? PAGE_READWRITE : PAGE_READONLY, li.HighPart, li.LowPart, NULL); if(mapping == NULL) return NULL; block = MapViewOfFile(mapping, writable ? FILE_MAP_READ | FILE_MAP_WRITE : FILE_MAP_READ, 0, 0, size); if (block == NULL) { CloseHandle(mapping); return NULL; } if (handle) *handle = mapping; return block; } int MVM_platform_unmap_file(void *block, void *handle, size_t size) { BOOL unmapped = UnmapViewOfFile(block); BOOL closed = !handle || CloseHandle(handle); (void)size; return unmapped && closed; } MoarVM-2015.11/src/platform/win32/sys.c0000644000175000017500000000046712456307241016422 0ustar jnthnjnthn#include "moar.h" #include "bithacks.h" #include "platform/sys.h" #include MVMuint32 MVM_platform_cpu_count(void) { DWORD_PTR proc_mask, sys_mask; if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_mask, &sys_mask)) return 0; return MVM_bithacks_count_bits(proc_mask); } MoarVM-2015.11/src/platform/win32/time.c0000644000175000017500000000143012573775575016554 0ustar jnthnjnthn#include "moar.h" #include "platform/time.h" #include /* see http://support.microsoft.com/kb/167296 */ #define OFFSET 116444736000000000 #define E6 1000000 MVMuint64 MVM_platform_now(void) { union { FILETIME ft; MVMuint64 u; } now; GetSystemTimeAsFileTime(&now.ft); return (now.u - OFFSET) * 100; } void MVM_platform_sleep(MVMnum64 second) { DWORD millis = (DWORD)(second * 1000); Sleep(millis); } void MVM_platform_nanosleep(MVMuint64 nanos) { MVMuint64 now; DWORD millis; const MVMuint64 end = MVM_platform_now() + nanos; millis = (DWORD)((nanos + E6 - 1) / E6); while(1) { Sleep(millis); now = MVM_platform_now(); if (now >= end) break; millis = (DWORD)((end - now) / E6); } } MoarVM-2015.11/src/profiler/instrument.c0000644000175000017500000002140112613656332017042 0ustar jnthnjnthn#include "moar.h" /* Adds an instruction to log an allocation. */ static void add_allocation_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshIns *alloc_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); alloc_ins->info = MVM_op_get_op(MVM_OP_prof_allocated); alloc_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); alloc_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_insert_ins(tc, bb, ins, alloc_ins); } static void add_nativecall_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshIns *enter_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); MVMSpeshIns *exit_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); enter_ins->info = MVM_op_get_op(MVM_OP_prof_enternative); enter_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); enter_ins->operands[0] = ins->operands[2]; MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, enter_ins); exit_ins->info = MVM_op_get_op(MVM_OP_prof_exit); MVM_spesh_manipulate_insert_ins(tc, bb, ins, exit_ins); } static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Insert entry instruction. */ MVMSpeshBB *bb = g->entry->linear_next; MVMSpeshIns *enter_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); enter_ins->info = MVM_op_get_op(MVM_OP_prof_enter); MVM_spesh_manipulate_insert_ins(tc, bb, NULL, enter_ins); /* Walk the code and insert profile logging instructions as needed. */ while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_return_i: case MVM_OP_return_n: case MVM_OP_return_s: case MVM_OP_return_o: case MVM_OP_return: { /* Log a normal exit prior to returning. */ MVMSpeshIns *exit_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); exit_ins->info = MVM_op_get_op(MVM_OP_prof_exit); MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, exit_ins); /* If the return instruction is a goto target, move to the * instrumentation instruction. */ if (ins->annotations) { MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *prev_ann = NULL; while (ann) { if (ann->type == MVM_SPESH_ANN_FH_GOTO) { if (prev_ann) prev_ann->next = ann->next; else ins->annotations = ann->next; exit_ins->annotations = ann; ann->next = NULL; break; } prev_ann = ann; ann = ann->next; } } break; } case MVM_OP_newexception: case MVM_OP_takeclosure: case MVM_OP_getattr_o: case MVM_OP_getattrs_o: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_create: case MVM_OP_sp_fastcreate: case MVM_OP_clone: case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: case MVM_OP_iter: case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: case MVM_OP_neg_I: case MVM_OP_abs_I: case MVM_OP_bor_I: case MVM_OP_bxor_I: case MVM_OP_band_I: case MVM_OP_bnot_I: case MVM_OP_blshift_I: case MVM_OP_brshift_I: case MVM_OP_pow_I: case MVM_OP_gcd_I: case MVM_OP_lcm_I: case MVM_OP_expmod_I: case MVM_OP_rand_I: case MVM_OP_coerce_nI: case MVM_OP_coerce_sI: case MVM_OP_radix_I: { add_allocation_logging(tc, g, bb, ins); break; } case MVM_OP_getlex: case MVM_OP_getlex_no: case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: case MVM_OP_getlexouter: case MVM_OP_getlexrel: case MVM_OP_getlexreldyn: case MVM_OP_getlexrelcaller: case MVM_OP_getlexcaller: { /* We have to check if the target register is actually * an object register. */ if ((g->local_types && g->local_types[ins->operands[0].reg.orig] == MVM_reg_obj) || (!g->local_types && g->sf->body.local_types[ins->operands[0].reg.orig] == MVM_reg_obj)) add_allocation_logging(tc, g, bb, ins); break; } case MVM_OP_getregref_i: case MVM_OP_getregref_n: case MVM_OP_getregref_s: case MVM_OP_getlexref_i: case MVM_OP_getlexref_n: case MVM_OP_getlexref_s: case MVM_OP_getlexref_ni: case MVM_OP_getlexref_nn: case MVM_OP_getlexref_ns: case MVM_OP_atposref_i: case MVM_OP_atposref_n: case MVM_OP_atposref_s: case MVM_OP_getattrref_i: case MVM_OP_getattrref_n: case MVM_OP_getattrref_s: case MVM_OP_getattrsref_i: case MVM_OP_getattrsref_n: case MVM_OP_getattrsref_s: add_allocation_logging(tc, g, bb, ins); break; case MVM_OP_nativecallinvoke: add_nativecall_logging(tc, g, bb, ins); break; default: /* See if it's an allocating extop. */ if (ins->info->opcode == (MVMuint16)-1) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { if (extops[i].allocating && extops[i].info->num_operands >= 1) add_allocation_logging(tc, g, bb, ins); break; } } } break; } ins = ins->next; } bb = bb->linear_next; } } /* Adds instrumented versions of the unspecialized bytecode. */ static void add_instrumentation(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshCode *sc; MVMSpeshGraph *sg = MVM_spesh_graph_create(tc, sf, 1); instrument_graph(tc, sg); sc = MVM_spesh_codegen(tc, sg); sf->body.instrumented_bytecode = sc->bytecode; sf->body.instrumented_handlers = sc->handlers; sf->body.instrumented_bytecode_size = sc->bytecode_size; sf->body.uninstrumented_bytecode = sf->body.bytecode; sf->body.uninstrumented_handlers = sf->body.handlers; sf->body.uninstrumented_bytecode_size = sf->body.bytecode_size; MVM_spesh_graph_destroy(tc, sg); MVM_free(sc); } /* Instruments a static frame for profiling, or uses an existing * instrumentation if it exists. */ void MVM_profile_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { if (sf->body.bytecode != sf->body.instrumented_bytecode) { /* Handle main, non-specialized, bytecode. */ if (!sf->body.instrumented_bytecode) add_instrumentation(tc, sf); sf->body.bytecode = sf->body.instrumented_bytecode; sf->body.handlers = sf->body.instrumented_handlers; sf->body.bytecode_size = sf->body.instrumented_bytecode_size; /* Throw away any specializations; we'll need to reproduce them as * instrumented versions. */ sf->body.num_spesh_candidates = 0; sf->body.spesh_candidates = NULL; } } /* Ensures we're no longer in instrumented code. */ void MVM_profile_ensure_uninstrumented(MVMThreadContext *tc, MVMStaticFrame *sf) { if (sf->body.bytecode == sf->body.instrumented_bytecode) { /* Switch to uninstrumented code. */ sf->body.bytecode = sf->body.uninstrumented_bytecode; sf->body.handlers = sf->body.uninstrumented_handlers; sf->body.bytecode_size = sf->body.uninstrumented_bytecode_size; /* Throw away specializations, which may also be instrumented. */ sf->body.num_spesh_candidates = 0; sf->body.spesh_candidates = NULL; /* XXX For now, due to bugs, disable spesh here. */ tc->instance->spesh_enabled = 0; } } MoarVM-2015.11/src/profiler/instrument.h0000644000175000017500000000023112456307241017042 0ustar jnthnjnthnvoid MVM_profile_instrument(MVMThreadContext *tc, MVMStaticFrame *sf); void MVM_profile_ensure_uninstrumented(MVMThreadContext *tc, MVMStaticFrame *sf); MoarVM-2015.11/src/profiler/log.c0000644000175000017500000003301112613656332015413 0ustar jnthnjnthn#include "moar.h" /* Gets the current thread's profiling data structure, creating it if needed. */ static MVMProfileThreadData * get_thread_data(MVMThreadContext *tc) { if (!tc->prof_data) { tc->prof_data = MVM_calloc(1, sizeof(MVMProfileThreadData)); tc->prof_data->start_time = uv_hrtime(); } return tc->prof_data; } /* Log that we're entering a new frame. */ void MVM_profile_log_enter(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint64 mode) { MVMProfileThreadData *ptd = get_thread_data(tc); /* Try to locate the entry node, if it's in the call graph already. */ MVMProfileCallNode *pcn = NULL; MVMuint32 i; if (ptd->current_call) for (i = 0; i < ptd->current_call->num_succ; i++) if (ptd->current_call->succ[i]->sf == sf) pcn = ptd->current_call->succ[i]; /* If we didn't find a call graph node, then create one and add it to the * graph. */ if (!pcn) { pcn = MVM_calloc(1, sizeof(MVMProfileCallNode)); pcn->sf = sf; if (ptd->current_call) { MVMProfileCallNode *pred = ptd->current_call; pcn->pred = pred; if (pred->num_succ == pred->alloc_succ) { pred->alloc_succ += 8; pred->succ = MVM_realloc(pred->succ, pred->alloc_succ * sizeof(MVMProfileCallNode *)); } pred->succ[pred->num_succ] = pcn; pred->num_succ++; } else { if (!ptd->call_graph) ptd->call_graph = pcn; } } /* Increment entry counts. */ pcn->total_entries++; switch (mode) { case MVM_PROFILE_ENTER_SPESH: pcn->specialized_entries++; break; case MVM_PROFILE_ENTER_SPESH_INLINE: pcn->specialized_entries++; pcn->inlined_entries++; break; case MVM_PROFILE_ENTER_JIT: pcn->jit_entries++; break; case MVM_PROFILE_ENTER_JIT_INLINE: pcn->jit_entries++; pcn->inlined_entries++; break; } pcn->entry_mode = mode; /* Log entry time; clear skip time. */ pcn->cur_entry_time = uv_hrtime(); pcn->cur_skip_time = 0; /* The current call graph node becomes this one. */ ptd->current_call = pcn; } /* Log that we've entered a native routine */ void MVM_profile_log_enter_native(MVMThreadContext *tc, MVMObject *nativecallsite) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = NULL; MVMNativeCallBody *callbody; MVMuint32 i; /* We locate the right call node by looking at sf being NULL and the * native_target_name matching our intended target. */ callbody = MVM_nativecall_get_nc_body(tc, nativecallsite); if (ptd->current_call) for (i = 0; i < ptd->current_call->num_succ; i++) if (ptd->current_call->succ[i]->sf == NULL) if (strcmp(callbody->sym_name, ptd->current_call->succ[i]->native_target_name) == 0) { pcn = ptd->current_call->succ[i]; break; } /* If we didn't find a call graph node, then create one and add it to the * graph. */ if (!pcn) { pcn = MVM_calloc(1, sizeof(MVMProfileCallNode)); pcn->native_target_name = callbody->sym_name; if (ptd->current_call) { MVMProfileCallNode *pred = ptd->current_call; pcn->pred = pred; if (pred->num_succ == pred->alloc_succ) { pred->alloc_succ += 8; pred->succ = MVM_realloc(pred->succ, pred->alloc_succ * sizeof(MVMProfileCallNode *)); } pred->succ[pred->num_succ] = pcn; pred->num_succ++; } else { if (!ptd->call_graph) ptd->call_graph = pcn; } } /* Increment entry counts. */ pcn->total_entries++; pcn->entry_mode = 0; /* Log entry time; clear skip time. */ pcn->cur_entry_time = uv_hrtime(); pcn->cur_skip_time = 0; /* The current call graph node becomes this one. */ ptd->current_call = pcn; } /* Frame exit handler, used for unwind and normal exit. */ static void log_exit(MVMThreadContext *tc, MVMuint32 unwind) { MVMProfileThreadData *ptd = get_thread_data(tc); /* Ensure we've a current frame. */ MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) { if (tc->instance->profiling) { /* No frame but still profiling; corruption. */ MVM_dump_backtrace(tc); MVM_panic(1, "Profiler lost sequence"); } else { /* We already finished profiling. */ return; } } /* Add to total time. */ pcn->total_time += (uv_hrtime() - pcn->cur_entry_time) - pcn->cur_skip_time; /* Move back to predecessor in call graph. */ ptd->current_call = pcn->pred; } /* Log that we're exiting a frame normally. */ void MVM_profile_log_exit(MVMThreadContext *tc) { log_exit(tc, 0); } /* Called when we unwind. Since we're also potentially leaving some inlined * frames, we need to exit until we hit the target one. */ void MVM_profile_log_unwind(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *lpcn; do { MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) return; lpcn = pcn; log_exit(tc, 1); } while (lpcn->sf != tc->cur_frame->static_info); } /* Called when we take a continuation. Leaves the static frames from the point * of view of the profiler, and saves each of them. */ MVMProfileContinuationData * MVM_profile_log_continuation_control(MVMThreadContext *tc, const MVMFrame *root_frame) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileContinuationData *cd = MVM_malloc(sizeof(MVMProfileContinuationData)); MVMStaticFrame **sfs = NULL; MVMuint64 *modes = NULL; MVMFrame *cur_frame = tc->cur_frame; MVMuint64 alloc_sfs = 0; MVMuint64 num_sfs = 0; MVMFrame *last_frame; do { MVMProfileCallNode *lpcn; do { MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) MVM_panic(1, "Profiler lost sequence in continuation control"); if (num_sfs == alloc_sfs) { alloc_sfs += 16; sfs = MVM_realloc(sfs, alloc_sfs * sizeof(MVMStaticFrame *)); modes = MVM_realloc(modes, alloc_sfs * sizeof(MVMuint64)); } sfs[num_sfs] = pcn->sf; modes[num_sfs] = pcn->entry_mode; num_sfs++; lpcn = pcn; log_exit(tc, 1); } while (lpcn->sf != cur_frame->static_info); last_frame = cur_frame; cur_frame = cur_frame->caller; } while (last_frame != root_frame); cd->sfs = sfs; cd->num_sfs = num_sfs; cd->modes = modes; return cd; } /* Called when we invoke a continuation. Enters all the static frames we left * at the point we took the continuation. */ void MVM_profile_log_continuation_invoke(MVMThreadContext *tc, const MVMProfileContinuationData *cd) { MVMuint64 i = cd->num_sfs; while (i--) MVM_profile_log_enter(tc, cd->sfs[i], cd->modes[i]); } /* Log that we've just allocated the passed object (just log the type). */ void MVM_profile_log_allocated(MVMThreadContext *tc, MVMObject *obj) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) { /* First, let's see if the allocation is actually at the end of the * nursery; we may have generated some "allocated" log instructions * after operations that may or may not allocate what they return. */ MVMuint32 distance = ((MVMuint64)tc->nursery_alloc - (MVMuint64)obj); if (!obj) { return; } /* Since some ops first allocate, then call something else that may * also allocate, we may have to allow for a bit of grace distance. */ if ((MVMuint64)obj > (MVMuint64)tc->nursery_tospace && distance <= obj->header.size && obj != ptd->last_counted_allocation) { /* See if there's an existing node to update. */ MVMObject *what = STABLE(obj)->WHAT; MVMuint32 i; MVMuint8 allocation_target; if (pcn->entry_mode == MVM_PROFILE_ENTER_SPESH || pcn->entry_mode == MVM_PROFILE_ENTER_SPESH_INLINE) { allocation_target = 1; } else if (pcn->entry_mode == MVM_PROFILE_ENTER_JIT || pcn->entry_mode == MVM_PROFILE_ENTER_JIT_INLINE) { allocation_target = 2; } else { allocation_target = 0; } for (i = 0; i < pcn->num_alloc; i++) { if (pcn->alloc[i].type == what) { if (allocation_target == 0) pcn->alloc[i].allocations_interp++; else if (allocation_target == 1) pcn->alloc[i].allocations_spesh++; else if (allocation_target == 2) pcn->alloc[i].allocations_jit++; ptd->last_counted_allocation = obj; return; } } /* No entry; create one. */ if (pcn->num_alloc == pcn->alloc_alloc) { pcn->alloc_alloc += 8; pcn->alloc = MVM_realloc(pcn->alloc, pcn->alloc_alloc * sizeof(MVMProfileAllocationCount)); } pcn->alloc[pcn->num_alloc].type = what; pcn->alloc[pcn->num_alloc].allocations_interp = allocation_target == 0; pcn->alloc[pcn->num_alloc].allocations_spesh = allocation_target == 1; pcn->alloc[pcn->num_alloc].allocations_jit = allocation_target == 2; ptd->last_counted_allocation = obj; pcn->num_alloc++; } } } /* Logs the start of a GC run. */ void MVM_profiler_log_gc_start(MVMThreadContext *tc, MVMuint32 full) { MVMProfileThreadData *ptd = get_thread_data(tc); /* Make a new entry in the GCs. We use the cleared_bytes to store the * maximum that could be cleared, and after GC is done will subtract * retained bytes and promoted bytes. */ if (ptd->num_gcs == ptd->alloc_gcs) { ptd->alloc_gcs += 16; ptd->gcs = MVM_realloc(ptd->gcs, ptd->alloc_gcs * sizeof(MVMProfileGC)); } ptd->gcs[ptd->num_gcs].full = full; ptd->gcs[ptd->num_gcs].cleared_bytes = (char *)tc->nursery_alloc - (char *)tc->nursery_tospace; /* Record start time. */ ptd->cur_gc_start_time = uv_hrtime(); } /* Logs the end of a GC run. */ void MVM_profiler_log_gc_end(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; MVMuint64 gc_time; MVMint32 retained_bytes; /* Record time spent. */ gc_time = uv_hrtime() - ptd->cur_gc_start_time; ptd->gcs[ptd->num_gcs].time = gc_time; /* Record retained and promoted bytes. */ retained_bytes = (char *)tc->nursery_alloc - (char *)tc->nursery_tospace; ptd->gcs[ptd->num_gcs].promoted_bytes = tc->gc_promoted_bytes; ptd->gcs[ptd->num_gcs].retained_bytes = retained_bytes; /* Tweak cleared bytes count. */ ptd->gcs[ptd->num_gcs].cleared_bytes -= (retained_bytes + tc->gc_promoted_bytes); /* Record number of gen 2 roots (from gen2 to nursery) */ ptd->gcs[ptd->num_gcs].num_gen2roots = tc->num_gen2roots; /* Increment the number of GCs we've done. */ ptd->num_gcs++; /* Discount GC time from all active frames. */ while (pcn) { pcn->cur_skip_time += gc_time; pcn = pcn->pred; } } /* Log that we're starting some work on bytecode specialization or JIT. */ void MVM_profiler_log_spesh_start(MVMThreadContext *tc) { /* Record start time. */ MVMProfileThreadData *ptd = get_thread_data(tc); ptd->cur_spesh_start_time = uv_hrtime(); } /* Log that we've finished doing bytecode specialization or JIT. */ void MVM_profiler_log_spesh_end(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; MVMuint64 spesh_time; /* Record time spent. */ spesh_time = uv_hrtime() - ptd->cur_spesh_start_time; ptd->spesh_time += spesh_time; /* Discount spesh time from all active frames. */ while (pcn) { pcn->cur_skip_time += spesh_time; pcn = pcn->pred; } } /* Log that an on stack replacement took place. */ void MVM_profiler_log_osr(MVMThreadContext *tc, MVMuint64 jitted) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) { pcn->osr_count++; if (jitted) pcn->jit_entries++; else pcn->specialized_entries++; } } /* Log that local deoptimization took pace. */ void MVM_profiler_log_deopt_one(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) pcn->deopt_one_count++; } /* Log that full-stack deoptimization took pace. */ void MVM_profiler_log_deopt_all(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) pcn->deopt_all_count++; } MoarVM-2015.11/src/profiler/log.h0000644000175000017500000001207412613656332015426 0ustar jnthnjnthn/* Per-thread profiling data. */ struct MVMProfileThreadData { /* The root of the call graph. */ MVMProfileCallNode *call_graph; /* The current call graph node we're in. */ MVMProfileCallNode *current_call; /* The time we started profiling. */ MVMuint64 start_time; /* The time we finished profiling, if we got there already. */ MVMuint64 end_time; /* Garbage collection time measurements. */ MVMProfileGC *gcs; MVMuint32 num_gcs; MVMuint32 alloc_gcs; /* Amount of time spent in spesh. */ MVMuint64 spesh_time; /* Current spesh work start time, if any. */ MVMuint64 cur_spesh_start_time; /* Current GC start time, if any. */ MVMuint64 cur_gc_start_time; /* We have to make sure to not count the newest allocation infinitely * often if there's a conditionally-allocating operation (like getlex) * that gets called multiple times with no actual allocations in between */ MVMObject *last_counted_allocation; }; /* Information collected about a GC run. */ struct MVMProfileGC { /* How long the collection took. */ MVMuint64 time; /* Was it a full collection? */ MVMuint32 full; /* Nursery statistics. */ MVMuint32 cleared_bytes; MVMuint32 retained_bytes; MVMuint32 promoted_bytes; /* Inter-generation links count */ MVMuint32 num_gen2roots; }; /* Call graph node, which is kept per thread. */ struct MVMProfileCallNode { /* The frame this data is for. * If this CallNode is for a native call, this is NULL. */ MVMStaticFrame *sf; /* If the static frame is NULL, we're collecting data on a native call */ char *native_target_name; /* The timestamp when we entered the node. */ MVMuint64 cur_entry_time; /* Time we should skip since cur_entry_time because execution was * suspended due to GC or spesh. */ MVMuint64 cur_skip_time; /* The node in the profiling call graph that we came from. */ MVMProfileCallNode *pred; /* Successor nodes so far. */ MVMProfileCallNode **succ; /* Number of successors we have, and have allocated space for. */ MVMuint32 num_succ; MVMuint32 alloc_succ; /* Allocations of different types, and the number of allocation * counts we have so far. */ MVMProfileAllocationCount *alloc; MVMuint32 num_alloc; MVMuint32 alloc_alloc; /* The total inclusive time so far spent in this node. */ MVMuint64 total_time; /* The total number of times this node was entered. */ MVMuint64 total_entries; /* Entries that were to specialized bytecode. */ MVMuint64 specialized_entries; /* Entries that were inlined. */ MVMuint64 inlined_entries; /* Entries that were to JITted code. */ MVMuint64 jit_entries; /* Number of times OSR took place. */ MVMuint64 osr_count; /* Number of times deopt_one happened. */ MVMuint64 deopt_one_count; /* Number of times deopt_all happened. */ MVMuint64 deopt_all_count; /* Entry mode, persisted for the sake of continuations. */ MVMuint64 entry_mode; }; /* Allocation counts for a call node. */ struct MVMProfileAllocationCount { /* The type we're counting allocations of. */ MVMObject *type; /* The number of allocations we've counted. */ /* a) in regularly interpreted code */ MVMuint64 allocations_interp; /* b) in spesh'd code */ MVMuint64 allocations_spesh; /* c) in jitted code */ MVMuint64 allocations_jit; }; /* When a continuation is taken, we attach one of these to it. It carries the * data needed to restore profiler state if the continuation is invoked. */ struct MVMProfileContinuationData { /* List of static frames we should restore, in reverse order. */ MVMStaticFrame **sfs; /* Entry modes to restore also. */ MVMuint64 *modes; /* Number of static frames in the list. */ MVMuint64 num_sfs; }; /* Ways we might enter a frame. */ #define MVM_PROFILE_ENTER_NORMAL 0 #define MVM_PROFILE_ENTER_SPESH 1 #define MVM_PROFILE_ENTER_SPESH_INLINE 2 #define MVM_PROFILE_ENTER_JIT 3 #define MVM_PROFILE_ENTER_JIT_INLINE 4 /* Logging functions. */ void MVM_profile_log_enter(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint64 mode); void MVM_profile_log_enter_native(MVMThreadContext *tc, MVMObject *nativecallsite); void MVM_profile_log_exit(MVMThreadContext *tc); void MVM_profile_log_unwind(MVMThreadContext *tc); MVMProfileContinuationData * MVM_profile_log_continuation_control(MVMThreadContext *tc, const MVMFrame *root_frame); void MVM_profile_log_continuation_invoke(MVMThreadContext *tc, const MVMProfileContinuationData *cd); void MVM_profile_log_allocated(MVMThreadContext *tc, MVMObject *obj); void MVM_profiler_log_gc_start(MVMThreadContext *tc, MVMuint32 full); void MVM_profiler_log_gc_end(MVMThreadContext *tc); void MVM_profiler_log_spesh_start(MVMThreadContext *tc); void MVM_profiler_log_spesh_end(MVMThreadContext *tc); void MVM_profiler_log_osr(MVMThreadContext *tc, MVMuint64 jitted); void MVM_profiler_log_deopt_one(MVMThreadContext *tc); void MVM_profiler_log_deopt_all(MVMThreadContext *tc); MoarVM-2015.11/src/profiler/profile.c0000644000175000017500000003011712623370227016273 0ustar jnthnjnthn#include "moar.h" /* Simple allocation functions. */ static MVMObject * new_array(MVMThreadContext *tc) { return MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); } static MVMObject * new_hash(MVMThreadContext *tc) { return MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); } static MVMObject * box_i(MVMThreadContext *tc, MVMint64 i) { return MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, i); } static MVMObject * box_s(MVMThreadContext *tc, MVMString *s) { return MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, s); } static MVMString * str(MVMThreadContext *tc, const char *buf) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, buf); } /* String constants we'll reuse. */ typedef struct { MVMString *total_time; MVMString *call_graph; MVMString *name; MVMString *id; MVMString *file; MVMString *line; MVMString *entries; MVMString *spesh_entries; MVMString *jit_entries; MVMString *inlined_entries; MVMString *inclusive_time; MVMString *exclusive_time; MVMString *callees; MVMString *allocations; MVMString *spesh; MVMString *jit; MVMString *type; MVMString *count; MVMString *gcs; MVMString *time; MVMString *full; MVMString *cleared_bytes; MVMString *retained_bytes; MVMString *promoted_bytes; MVMString *gen2_roots; MVMString *osr; MVMString *deopt_one; MVMString *deopt_all; MVMString *spesh_time; MVMString *native_lib; } ProfDumpStrs; /* Dumps a call graph node. */ static MVMObject * dump_call_graph_node(MVMThreadContext *tc, ProfDumpStrs *pds, const MVMProfileCallNode *pcn) { MVMObject *node_hash = new_hash(tc); MVMuint32 i; /* Let's see if we're dealing with a native call or a regular moar call */ if (pcn->sf) { /* Try to resolve the code filename and line number. */ MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &(pcn->sf->body), 0); MVMint32 fshi = annot ? (MVMint32)annot->filename_string_heap_index : -1; /* Add name of code object. */ MVM_repr_bind_key_o(tc, node_hash, pds->name, box_s(tc, pcn->sf->body.name)); /* Add line number and file name. */ if (fshi >= 0 && fshi < pcn->sf->body.cu->body.num_strings) MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, pcn->sf->body.cu->body.strings[fshi])); else if (pcn->sf->body.cu->body.filename) MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, pcn->sf->body.cu->body.filename)); else MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, tc->instance->str_consts.empty)); MVM_repr_bind_key_o(tc, node_hash, pds->line, box_i(tc, annot ? (MVMint32)annot->line_number : -1)); MVM_free(annot); /* Use static frame memory address to get a unique ID. */ MVM_repr_bind_key_o(tc, node_hash, pds->id, box_i(tc, (MVMint64)pcn->sf)); } else { MVMString *function_name_string = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, pcn->native_target_name, strlen(pcn->native_target_name)); MVM_repr_bind_key_o(tc, node_hash, pds->name, box_s(tc, function_name_string)); MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, pds->native_lib)); MVM_repr_bind_key_o(tc, node_hash, pds->line, box_i(tc, -2)); /* Use the address of the name string as unique ID. a hack, but oh well. */ MVM_repr_bind_key_o(tc, node_hash, pds->id, box_i(tc, (MVMint64)pcn->native_target_name)); } /* Entry counts. */ if (pcn->total_entries) MVM_repr_bind_key_o(tc, node_hash, pds->entries, box_i(tc, pcn->total_entries)); if (pcn->specialized_entries) MVM_repr_bind_key_o(tc, node_hash, pds->spesh_entries, box_i(tc, pcn->specialized_entries)); if (pcn->jit_entries) MVM_repr_bind_key_o(tc, node_hash, pds->jit_entries, box_i(tc, pcn->jit_entries)); if (pcn->inlined_entries) MVM_repr_bind_key_o(tc, node_hash, pds->inlined_entries, box_i(tc, pcn->inlined_entries)); /* Total (inclusive) time. */ MVM_repr_bind_key_o(tc, node_hash, pds->inclusive_time, box_i(tc, pcn->total_time / 1000)); /* OSR and deopt counts. */ if (pcn->osr_count) MVM_repr_bind_key_o(tc, node_hash, pds->osr, box_i(tc, pcn->osr_count)); if (pcn->deopt_one_count) MVM_repr_bind_key_o(tc, node_hash, pds->deopt_one, box_i(tc, pcn->deopt_one_count)); if (pcn->deopt_all_count) MVM_repr_bind_key_o(tc, node_hash, pds->deopt_all, box_i(tc, pcn->deopt_all_count)); /* Visit successors in the call graph, dumping them and working out the * exclusive time. */ if (pcn->num_succ) { MVMObject *callees = new_array(tc); MVMuint64 exclusive_time = pcn->total_time; for (i = 0; i < pcn->num_succ; i++) { MVM_repr_push_o(tc, callees, dump_call_graph_node(tc, pds, pcn->succ[i])); exclusive_time -= pcn->succ[i]->total_time; } MVM_repr_bind_key_o(tc, node_hash, pds->exclusive_time, box_i(tc, exclusive_time / 1000)); MVM_repr_bind_key_o(tc, node_hash, pds->callees, callees); } else { MVM_repr_bind_key_o(tc, node_hash, pds->exclusive_time, box_i(tc, pcn->total_time / 1000)); } if (pcn->num_alloc) { /* Emit allocations. */ MVMObject *alloc_list = new_array(tc); MVM_repr_bind_key_o(tc, node_hash, pds->allocations, alloc_list); for (i = 0; i < pcn->num_alloc; i++) { MVMObject *alloc_info = new_hash(tc); MVMProfileAllocationCount *alloc = &pcn->alloc[i]; MVMObject *type = pcn->alloc[i].type; MVM_repr_bind_key_o(tc, alloc_info, pds->id, box_i(tc, (MVMint64)type)); MVM_repr_bind_key_o(tc, alloc_info, pds->type, type); if (alloc->allocations_spesh) MVM_repr_bind_key_o(tc, alloc_info, pds->spesh, box_i(tc, alloc->allocations_spesh)); if (alloc->allocations_jit) MVM_repr_bind_key_o(tc, alloc_info, pds->jit, box_i(tc, alloc->allocations_jit)); MVM_repr_bind_key_o(tc, alloc_info, pds->count, box_i(tc, alloc->allocations_interp + alloc->allocations_spesh + alloc->allocations_jit)); MVM_repr_push_o(tc, alloc_list, alloc_info); } } return node_hash; } /* Dumps data from a single thread. */ static MVMObject * dump_thread_data(MVMThreadContext *tc, ProfDumpStrs *pds, const MVMProfileThreadData *ptd) { MVMObject *thread_hash = new_hash(tc); MVMObject *thread_gcs = new_array(tc); MVMuint32 i; /* Add time. */ MVM_repr_bind_key_o(tc, thread_hash, pds->total_time, box_i(tc, (ptd->end_time - ptd->start_time) / 1000)); /* Add call graph. */ if (ptd->call_graph) MVM_repr_bind_key_o(tc, thread_hash, pds->call_graph, dump_call_graph_node(tc, pds, ptd->call_graph)); /* Add GCs. */ for (i = 0; i < ptd->num_gcs; i++) { MVMObject *gc_hash = new_hash(tc); MVM_repr_bind_key_o(tc, gc_hash, pds->time, box_i(tc, ptd->gcs[i].time / 1000)); MVM_repr_bind_key_o(tc, gc_hash, pds->full, box_i(tc, ptd->gcs[i].full)); MVM_repr_bind_key_o(tc, gc_hash, pds->cleared_bytes, box_i(tc, ptd->gcs[i].cleared_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->retained_bytes, box_i(tc, ptd->gcs[i].retained_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->promoted_bytes, box_i(tc, ptd->gcs[i].promoted_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->gen2_roots, box_i(tc, ptd->gcs[i].num_gen2roots)); MVM_repr_push_o(tc, thread_gcs, gc_hash); } MVM_repr_bind_key_o(tc, thread_hash, pds->gcs, thread_gcs); /* Add spesh time. */ MVM_repr_bind_key_o(tc, thread_hash, pds->spesh_time, box_i(tc, ptd->spesh_time / 1000)); return thread_hash; } /* Dumps data from all threads into an array of per-thread data. */ static MVMObject * dump_data(MVMThreadContext *tc) { MVMObject *threads_array; ProfDumpStrs pds; /* We'll allocate the data in gen2, but as we want to keep it, but to be * sure we don't trigger a GC run. */ MVM_gc_allocate_gen2_default_set(tc); /* Some string constants to re-use. */ pds.total_time = str(tc, "total_time"); pds.call_graph = str(tc, "call_graph"); pds.name = str(tc, "name"); pds.id = str(tc, "id"); pds.file = str(tc, "file"); pds.line = str(tc, "line"); pds.entries = str(tc, "entries"); pds.spesh_entries = str(tc, "spesh_entries"); pds.jit_entries = str(tc, "jit_entries"); pds.inlined_entries = str(tc, "inlined_entries"); pds.inclusive_time = str(tc, "inclusive_time"); pds.exclusive_time = str(tc, "exclusive_time"); pds.callees = str(tc, "callees"); pds.allocations = str(tc, "allocations"); pds.type = str(tc, "type"); pds.count = str(tc, "count"); pds.spesh = str(tc, "spesh"); pds.jit = str(tc, "jit"); pds.gcs = str(tc, "gcs"); pds.time = str(tc, "time"); pds.full = str(tc, "full"); pds.cleared_bytes = str(tc, "cleared_bytes"); pds.retained_bytes = str(tc, "retained_bytes"); pds.promoted_bytes = str(tc, "promoted_bytes"); pds.gen2_roots = str(tc, "gen2_roots"); pds.osr = str(tc, "osr"); pds.deopt_one = str(tc, "deopt_one"); pds.deopt_all = str(tc, "deopt_all"); pds.spesh_time = str(tc, "spesh_time"); pds.native_lib = str(tc, "native library"); /* Build up threads array. */ /* XXX Only main thread for now. */ threads_array = new_array(tc); if (tc->prof_data) MVM_repr_push_o(tc, threads_array, dump_thread_data(tc, &pds, tc->prof_data)); /* Switch back to default allocation and return result; */ MVM_gc_allocate_gen2_default_clear(tc); return threads_array; } /* Starts profiling with the specified configuration. */ void MVM_profile_start(MVMThreadContext *tc, MVMObject *config) { /* Enable profiling. */ if (tc->instance->profiling) MVM_exception_throw_adhoc(tc, "Profiling is already started"); tc->instance->profiling = 1; tc->instance->instrumentation_level++; } /* Ends profiling, builds the result data structure, and returns it. */ MVMObject * MVM_profile_end(MVMThreadContext *tc) { /* If we have any call frames still on the profile stack, exit them. */ while (tc->prof_data->current_call) MVM_profile_log_exit(tc); /* Disable profiling. */ /* XXX Needs to account for multiple threads. */ if (!tc->instance->profiling) MVM_exception_throw_adhoc(tc, "Cannot end profiling if not profiling"); tc->instance->profiling = 0; tc->instance->instrumentation_level++; /* Record end time. */ if (tc->prof_data) tc->prof_data->end_time = uv_hrtime(); /* Build and return result data structure. */ return dump_data(tc); } /* Marks objects held in the profiling graph. */ static void mark_call_graph_node(MVMThreadContext *tc, MVMProfileCallNode *node, MVMGCWorklist *worklist) { MVMuint32 i; MVM_gc_worklist_add(tc, worklist, &(node->sf)); for (i = 0; i < node->num_alloc; i++) MVM_gc_worklist_add(tc, worklist, &(node->alloc[i].type)); for (i = 0; i < node->num_succ; i++) mark_call_graph_node(tc, node->succ[i], worklist); } void MVM_profile_mark_data(MVMThreadContext *tc, MVMGCWorklist *worklist) { if (tc->prof_data) mark_call_graph_node(tc, tc->prof_data->call_graph, worklist); } MoarVM-2015.11/src/profiler/profile.h0000644000175000017500000000027712456307241016304 0ustar jnthnjnthnvoid MVM_profile_start(MVMThreadContext *tc, MVMObject *config); MVMObject * MVM_profile_end(MVMThreadContext *tc); void MVM_profile_mark_data(MVMThreadContext *tc, MVMGCWorklist *worklist); MoarVM-2015.11/src/spesh/args.c0000644000175000017500000007637712623370227015111 0ustar jnthnjnthn#include "moar.h" /* Maximum number of positional args we'll consider for optimization purposes. */ #define MAX_POS_ARGS 8 /* Maximum number of named args we'll consider for optimization purposes. */ #define MAX_NAMED_ARGS 8 /* Adds guards and facts for an object arg. */ static void add_guards_and_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 slot, MVMObject *arg, MVMSpeshIns *arg_ins) { /* Grab type and concreteness. */ MVMObject *type = STABLE(arg)->WHAT; MVMint32 concrete = IS_CONCRETE(arg); MVMint32 is_cont = 0; /* Add appropriate facts from arg itself. */ MVMint16 orig = arg_ins->operands[0].reg.orig; MVMint16 i = arg_ins->operands[0].reg.i; g->facts[orig][i].type = type; g->facts[orig][i].flags |= MVM_SPESH_FACT_KNOWN_TYPE; if (concrete) { g->facts[orig][i].flags |= MVM_SPESH_FACT_CONCRETE; if (!STABLE(type)->container_spec) g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONTED; else is_cont = 1; } else { g->facts[orig][i].flags |= MVM_SPESH_FACT_TYPEOBJ | MVM_SPESH_FACT_DECONTED; } /* Add guard record for the arg type. */ g->arg_guards[g->num_arg_guards].slot = slot; g->arg_guards[g->num_arg_guards].match = (MVMCollectable *)STABLE(type); if (concrete) g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_CONC; else g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_TYPE; g->num_arg_guards++; /* If we know it's a container, might be able to look inside it to * further optimize. */ if (is_cont && STABLE(type)->container_spec->fetch_never_invokes) { /* See if it's an rw container. */ MVMint32 is_rw = STABLE(type)->container_spec->can_store(tc, arg); /* Fetch argument from the container. */ MVMRegister r; STABLE(type)->container_spec->fetch(tc, arg, &r); arg = r.o; if (!arg) return; /* Add facts about it. */ type = STABLE(arg)->WHAT; concrete = IS_CONCRETE(arg); g->facts[orig][i].decont_type = type; g->facts[orig][i].flags |= MVM_SPESH_FACT_KNOWN_DECONT_TYPE; if (concrete) g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONT_CONCRETE; else g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; if (is_rw) g->facts[orig][i].flags |= MVM_SPESH_FACT_RW_CONT; /* Add guard for contained value. */ g->arg_guards[g->num_arg_guards].slot = slot; g->arg_guards[g->num_arg_guards].match = (MVMCollectable *)STABLE(type); if (is_rw) { if (concrete) g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_DC_CONC_RW; else g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_DC_TYPE_RW; } else { if (concrete) g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_DC_CONC; else g->arg_guards[g->num_arg_guards].kind = MVM_SPESH_GUARD_DC_TYPE; } g->num_arg_guards++; } } /* Adds an instruction marking a name arg as being used (if we turned its * fetching into a positional). */ static MVMSpeshIns * add_named_used_ins(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 idx) { MVMSpeshIns *inserted_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand )); inserted_ins->info = MVM_op_get_op(MVM_OP_sp_namedarg_used); inserted_ins->operands = operands; operands[0].lit_i16 = (MVMint16)idx; MVM_spesh_manipulate_insert_ins(tc, bb, ins, inserted_ins); return inserted_ins; } /* Handles a pos arg that needs unboxing. */ static void pos_unbox(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, const MVMOpInfo *unbox_op) { MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); MVMSpeshIns *unbox = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); unbox->info = unbox_op; unbox->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); unbox->operands[0] = ins->operands[0]; unbox->operands[1] = temp; ins->info = MVM_op_get_op(MVM_OP_sp_getarg_o); ins->operands[0] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, unbox); MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } /* Handles a pos arg that needs boxing. */ static void pos_box(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, const MVMOpInfo *hlltype_op, const MVMOpInfo *box_op, const MVMOpInfo *arg_op, MVMuint8 kind) { MVMSpeshOperand temp_bt, temp_arg; MVMSpeshIns *hlltype, *box; /* Add HLL type op. */ temp_bt = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); hlltype = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); hlltype->info = hlltype_op; hlltype->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); hlltype->operands[0] = temp_bt; MVM_spesh_manipulate_insert_ins(tc, bb, ins, hlltype); /* Add box op. */ temp_arg = MVM_spesh_manipulate_get_temp_reg(tc, g, kind); box = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); box->info = box_op; box->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); box->operands[0] = ins->operands[0]; box->operands[1] = temp_arg; box->operands[2] = temp_bt; MVM_spesh_manipulate_insert_ins(tc, bb, hlltype, box); /* Update instruction to receive unboxed arg. */ ins->info = arg_op; ins->operands[0] = temp_arg; /* Release temporary registers. */ MVM_spesh_manipulate_release_temp_reg(tc, g, temp_bt); MVM_spesh_manipulate_release_temp_reg(tc, g, temp_arg); } /* Gets the primitive boxed by a type. */ static MVMuint16 prim_spec(MVMThreadContext *tc, MVMObject *type) { return type ? REPR(type)->get_storage_spec(tc, STABLE(type))->boxed_primitive : 0; } /* Takes information about the incoming callsite and arguments, and performs * various optimizations based on that information. */ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs, MVMRegister *args) { /* We need to identify the various arg-related instructions in the graph, * then manipulate them as a whole. */ MVMSpeshIns *checkarity_ins = NULL; MVMSpeshBB *checkarity_bb = NULL; MVMSpeshIns *paramnamesused_ins = NULL; MVMSpeshBB *paramnamesused_bb = NULL; MVMSpeshIns *param_sn_ins = NULL; MVMSpeshIns **pos_ins = MVM_calloc(MAX_POS_ARGS, sizeof(MVMSpeshIns *)); MVMSpeshBB **pos_bb = MVM_calloc(MAX_POS_ARGS, sizeof(MVMSpeshBB *)); MVMuint8 *pos_added = MVM_calloc(MAX_POS_ARGS, sizeof(MVMuint8)); MVMSpeshIns **named_ins = MVM_calloc(MAX_NAMED_ARGS, sizeof(MVMSpeshIns *)); MVMSpeshBB **named_bb = MVM_calloc(MAX_NAMED_ARGS, sizeof(MVMSpeshBB *)); MVMSpeshIns **used_ins = MVM_calloc(MAX_NAMED_ARGS, sizeof(MVMSpeshIns *)); MVMint32 req_max = -1; MVMint32 opt_min = -1; MVMint32 opt_max = -1; MVMint32 num_named = 0; MVMint32 named_used = 0; MVMint32 got_named = cs->num_pos != cs->arg_count; MVMSpeshBB *bb = g->entry; g->cs = cs; /* Walk through the graph, looking for arg related instructions. */ while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_checkarity: if (checkarity_ins) goto cleanup; /* Dupe; weird; bail out! */ checkarity_ins = ins; checkarity_bb = bb; break; case MVM_OP_param_rp_i: case MVM_OP_param_rp_n: case MVM_OP_param_rp_s: case MVM_OP_param_rp_o: { /* Required positional. */ MVMint16 idx = ins->operands[1].lit_i16; if (idx < 0 || idx >= MAX_POS_ARGS) goto cleanup; if (pos_ins[idx]) /* Dupe; weird. */ goto cleanup; pos_ins[idx] = ins; pos_bb[idx] = bb; if (idx > req_max) req_max = idx; break; } case MVM_OP_param_op_i: case MVM_OP_param_op_n: case MVM_OP_param_op_s: case MVM_OP_param_op_o: { /* Optional Positional int/num/string/object */ MVMint16 idx = ins->operands[1].lit_i16; if (idx < 0 || idx >= MAX_POS_ARGS) goto cleanup; if (pos_ins[idx]) /* Dupe; weird. */ goto cleanup; pos_ins[idx] = ins; pos_bb[idx] = bb; if (idx > opt_max) opt_max = idx; if (opt_min == -1 || idx < opt_min) opt_min = idx; break; } case MVM_OP_param_on_i: case MVM_OP_param_on_n: case MVM_OP_param_on_s: case MVM_OP_param_on_o: case MVM_OP_param_rn_i: case MVM_OP_param_rn_n: case MVM_OP_param_rn_s: case MVM_OP_param_rn_o: /* Named (optional or required). */ if (num_named == MAX_NAMED_ARGS) goto cleanup; named_ins[num_named] = ins; named_bb[num_named] = bb; num_named++; break; case MVM_OP_param_sp: break; case MVM_OP_param_sn: param_sn_ins = ins; break; case MVM_OP_usecapture: case MVM_OP_savecapture: /* Require full args processing context for now; bail. */ goto cleanup; case MVM_OP_paramnamesused: if (paramnamesused_ins) goto cleanup; /* Dupe; weird; bail out! */ paramnamesused_ins = ins; paramnamesused_bb = bb; break; default: break; } ins = ins->next; } bb = bb->linear_next; } /* If we didn't find a checkarity instruction, bail. */ if (!checkarity_ins) goto cleanup; /* If required and optional aren't contiguous, bail. */ if (opt_min >= 0 && req_max + 1 != opt_min) goto cleanup; /* If the number of passed args is in range... */ if (cs->num_pos >= req_max + 1 && (opt_max < 0 || cs->num_pos <= opt_max + 1)) { /* Ensure we've got all the arg fetch instructions we need, and that * types match or it's a box/unbox. */ MVMint32 i; for (i = 0; i < cs->num_pos; i++) { MVMCallsiteEntry arg_flag = cs->arg_flags[i]; if (!pos_ins[i]) goto cleanup; switch (pos_ins[i]->info->opcode) { case MVM_OP_param_rp_i: case MVM_OP_param_op_i: if (arg_flag != MVM_CALLSITE_ARG_INT) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, args[i].o) != MVM_STORAGE_SPEC_BP_INT) goto cleanup; break; case MVM_OP_param_rp_n: case MVM_OP_param_op_n: if (arg_flag != MVM_CALLSITE_ARG_NUM) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, args[i].o) != MVM_STORAGE_SPEC_BP_NUM) goto cleanup; break; case MVM_OP_param_rp_s: case MVM_OP_param_op_s: if (arg_flag != MVM_CALLSITE_ARG_STR) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, args[i].o) != MVM_STORAGE_SPEC_BP_STR) goto cleanup; break; case MVM_OP_param_rp_o: case MVM_OP_param_op_o: if (arg_flag != MVM_CALLSITE_ARG_OBJ && arg_flag != MVM_CALLSITE_ARG_INT && arg_flag != MVM_CALLSITE_ARG_NUM && arg_flag != MVM_CALLSITE_ARG_STR) goto cleanup; break; default: break; } } /* If we know there's no incoming nameds we can always turn param_sn into a * simple hash creation. This will typically be further lowered in optimize. */ if (param_sn_ins && !got_named) { MVMObject *hash_type = g->sf->body.cu->body.hll_config->slurpy_hash_type; if (REPR(hash_type)->ID == MVM_REPR_ID_MVMHash) { MVMSpeshOperand target = param_sn_ins->operands[0]; param_sn_ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); param_sn_ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); param_sn_ins->operands[0] = target; param_sn_ins->operands[1].lit_i16 = sizeof(MVMHash); param_sn_ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)STABLE(hash_type)); } else { goto cleanup; } } /* We can optimize. Toss checkarity. */ MVM_spesh_manipulate_delete_ins(tc, g, checkarity_bb, checkarity_ins); /* Re-write the passed required positionals to spesh ops, and store * any gurads. */ if (cs->arg_count) g->arg_guards = MVM_malloc(2 * cs->arg_count * sizeof(MVMSpeshGuard)); for (i = 0; i < cs->num_pos; i++) { MVMCallsiteEntry arg_flag = cs->arg_flags[i]; switch (pos_ins[i]->info->opcode) { case MVM_OP_param_rp_i: case MVM_OP_param_op_i: if (arg_flag == MVM_CALLSITE_ARG_INT) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); pos_added[i]++; if (args[i].o) add_guards_and_facts(tc, g, i, args[i].o, pos_ins[i]); } break; case MVM_OP_param_rp_n: case MVM_OP_param_op_n: if (arg_flag == MVM_CALLSITE_ARG_NUM) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); pos_added[i]++; if (args[i].o) add_guards_and_facts(tc, g, i, args[i].o, pos_ins[i]); } break; case MVM_OP_param_rp_s: case MVM_OP_param_op_s: if (arg_flag == MVM_CALLSITE_ARG_STR) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); pos_added[i]++; if (args[i].o) add_guards_and_facts(tc, g, i, args[i].o, pos_ins[i]); } break; case MVM_OP_param_rp_o: case MVM_OP_param_op_o: if (arg_flag == MVM_CALLSITE_ARG_OBJ) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); if (args[i].o) add_guards_and_facts(tc, g, i, args[i].o, pos_ins[i]); } else if (arg_flag == MVM_CALLSITE_ARG_INT) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); pos_added[i] += 2; } else if (arg_flag == MVM_CALLSITE_ARG_NUM) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); pos_added[i] += 2; } else if (arg_flag == MVM_CALLSITE_ARG_STR) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); pos_added[i] += 2; } break; default: break; } pos_ins[i]->operands[1].lit_i16 = (MVMint16)i; } /* Now consider any optionals. */ if (opt_min >= 0) { for (i = opt_min; i <= opt_max; i++) { MVMuint8 passed = i < cs->num_pos; if (passed) { /* If we know the argument has been passed, then add a goto * to the "passed" code. */ MVMSpeshIns *after = pos_ins[i]; while (pos_added[i]--) after = after->next; MVM_spesh_manipulate_insert_goto(tc, g, pos_bb[i], after, pos_ins[i]->operands[2].ins_bb); /* Inserting an unconditional goto makes the linear_next BB * unreachable, so we remove it from the succ list. */ MVM_spesh_manipulate_remove_successor(tc, pos_bb[i], pos_bb[i]->linear_next); } else { /* If we didn't pass this, just fall through the original * operation and we'll get the default value set. */ MVM_spesh_manipulate_delete_ins(tc, g, pos_bb[i], pos_ins[i]); MVM_spesh_manipulate_remove_successor(tc, pos_bb[i], pos_ins[i]->operands[2].ins_bb); } } } /* Now consider any nameds. */ for (i = 0; i < num_named; i++) { /* See if the arg was passed. */ MVMString *arg_name = MVM_spesh_get_string(tc, g, named_ins[i]->operands[1]); MVMint32 passed_nameds = (cs->arg_count - cs->num_pos) / 2; MVMint32 cs_flags = cs->num_pos + passed_nameds; MVMint32 cur_idx = 0; MVMint32 cur_named = 0; MVMuint8 found_flag = 0; MVMint32 found_idx = -1; MVMint32 j; for (j = 0; j < cs_flags; j++) { if (cs->arg_flags[j] & MVM_CALLSITE_ARG_NAMED) { if (MVM_string_equal(tc, arg_name, cs->arg_names[cur_named])) { /* Found it. */ found_flag = cs->arg_flags[j]; found_idx = cur_idx; break; } cur_idx += 2; cur_named++; } else { cur_idx++; } } /* Now go by instruction. */ switch (named_ins[i]->info->opcode) { case MVM_OP_param_rn_i: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_INT) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); named_ins[i]->operands[1].lit_i16 = found_idx + 1; used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_INT) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); } named_used++; break; case MVM_OP_param_rn_n: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_NUM) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); named_ins[i]->operands[1].lit_i16 = found_idx + 1; used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_NUM) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); } named_used++; break; case MVM_OP_param_rn_s: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_STR) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); named_ins[i]->operands[1].lit_i16 = found_idx + 1; used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_STR) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); } named_used++; break; case MVM_OP_param_rn_o: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_OBJ) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); named_ins[i]->operands[1].lit_i16 = arg_idx; used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); if (args[arg_idx].o) add_guards_and_facts(tc, g, arg_idx, args[arg_idx].o, named_ins[i]); } else if (found_flag & (MVM_CALLSITE_ARG_INT | MVM_CALLSITE_ARG_NUM | MVM_CALLSITE_ARG_STR)) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->operands[1].lit_i16 = arg_idx; if (found_flag & MVM_CALLSITE_ARG_INT) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); else if (found_flag & MVM_CALLSITE_ARG_NUM) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); else if (found_flag & MVM_CALLSITE_ARG_STR) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next->next, cur_named); } named_used++; break; case MVM_OP_param_on_i: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_INT) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_INT) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); named_used++; } break; case MVM_OP_param_on_n: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_NUM) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_NUM) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); named_used++; } break; case MVM_OP_param_on_s: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_STR) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, args[found_idx].o) == MVM_STORAGE_SPEC_BP_STR) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next, cur_named); named_used++; } break; case MVM_OP_param_on_o: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_OBJ) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); named_ins[i]->operands[1].lit_i16 = arg_idx; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i], cur_named); if (args[arg_idx].o) add_guards_and_facts(tc, g, arg_idx, args[arg_idx].o, named_ins[i]); named_used++; } else if (found_flag & (MVM_CALLSITE_ARG_INT | MVM_CALLSITE_ARG_NUM | MVM_CALLSITE_ARG_STR)) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->operands[1].lit_i16 = arg_idx; if (found_flag & MVM_CALLSITE_ARG_INT) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); else if (found_flag & MVM_CALLSITE_ARG_NUM) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); else if (found_flag & MVM_CALLSITE_ARG_STR) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next->next, named_ins[i]->operands[2].ins_bb); used_ins[i] = add_named_used_ins(tc, g, named_bb[i], named_ins[i]->next->next, cur_named); named_used++; } break; default: break; } } /* If we had no nameds or we used them all, can toss namesused, and we * don't need to mark used after all. */ if (paramnamesused_ins && num_named == named_used) { MVM_spesh_manipulate_delete_ins(tc, g, paramnamesused_bb, paramnamesused_ins); for (i = 0; i < num_named; i++) if (used_ins[i]) MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], used_ins[i]); } } cleanup: MVM_free(pos_ins); MVM_free(pos_bb); MVM_free(pos_added); MVM_free(named_ins); MVM_free(named_bb); MVM_free(used_ins); } MoarVM-2015.11/src/spesh/args.h0000644000175000017500000000014112456307241015066 0ustar jnthnjnthnvoid MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs, MVMRegister *args); MoarVM-2015.11/src/spesh/candidate.c0000644000175000017500000002354512573775575016101 0ustar jnthnjnthn#include "moar.h" /* Calculates the work and env sizes based on the number of locals and * lexicals. */ static void calculate_work_env_sizes(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *c) { c->work_size = (c->num_locals + sf->body.cu->body.max_callsite_size) * sizeof(MVMRegister); c->env_size = c->num_lexicals * sizeof(MVMRegister); } /* Tries to set up a specialization of the bytecode for a given arg tuple. * Doesn't do the actual optimizations, just works out the guards and does * any simple argument transformations, and then inserts logging to record * what we see. Produces bytecode with those transformations and the logging * instructions. */ MVMSpeshCandidate * MVM_spesh_candidate_setup(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMint32 osr) { MVMSpeshCandidate *result; MVMSpeshGuard *guards; MVMSpeshCode *sc; MVMint32 num_spesh_slots, num_log_slots, num_guards, *deopts, num_deopts; MVMuint16 num_locals, num_lexicals, used; MVMCollectable **spesh_slots, **log_slots; char *before = 0; char *after = 0; MVMSpeshGraph *sg; /* If we're profiling, log we're starting spesh work. */ if (tc->instance->profiling) MVM_profiler_log_spesh_start(tc); /* Do initial generation of the specialization, working out the argument * guards and adding logging. */ sg = MVM_spesh_graph_create(tc, static_frame, 0); if (tc->instance->spesh_log_fh) before = MVM_spesh_dump(tc, sg); MVM_spesh_args(tc, sg, callsite, args); MVM_spesh_log_add_logging(tc, sg, osr); if (tc->instance->spesh_log_fh) after = MVM_spesh_dump(tc, sg); sc = MVM_spesh_codegen(tc, sg); num_guards = sg->num_arg_guards; guards = sg->arg_guards; num_deopts = sg->num_deopt_addrs; deopts = sg->deopt_addrs; num_spesh_slots = sg->num_spesh_slots; spesh_slots = sg->spesh_slots; num_log_slots = sg->num_log_slots; log_slots = sg->log_slots; num_locals = sg->num_locals; num_lexicals = sg->num_lexicals; /* Now try to add it. Note there's a slim chance another thread beat us * to doing so. Also other threads can read the specializations without * lock, so make absolutely sure we increment the count of them after we * add the new one. */ result = NULL; used = 0; uv_mutex_lock(&tc->instance->mutex_spesh_install); if (static_frame->body.num_spesh_candidates < MVM_SPESH_LIMIT) { MVMint32 num_spesh = static_frame->body.num_spesh_candidates; MVMint32 i; for (i = 0; i < num_spesh; i++) { MVMSpeshCandidate *compare = &static_frame->body.spesh_candidates[i]; if (compare->cs == callsite && compare->num_guards == num_guards && memcmp(compare->guards, guards, num_guards * sizeof(MVMSpeshGuard)) == 0) { /* Beaten! */ result = osr ? NULL : &static_frame->body.spesh_candidates[i]; break; } } if (!result) { if (!static_frame->body.spesh_candidates) static_frame->body.spesh_candidates = MVM_calloc( MVM_SPESH_LIMIT, sizeof(MVMSpeshCandidate)); result = &static_frame->body.spesh_candidates[num_spesh]; result->cs = callsite; result->num_guards = num_guards; result->guards = guards; result->bytecode = sc->bytecode; result->bytecode_size = sc->bytecode_size; result->handlers = sc->handlers; result->num_handlers = sg->num_handlers; result->num_spesh_slots = num_spesh_slots; result->spesh_slots = spesh_slots; result->num_deopts = num_deopts; result->deopts = deopts; result->num_log_slots = num_log_slots; result->log_slots = log_slots; result->num_locals = num_locals; result->num_lexicals = num_lexicals; result->local_types = sg->local_types; result->lexical_types = sg->lexical_types; result->sg = sg; result->log_enter_idx = 0; result->log_exits_remaining = MVM_SPESH_LOG_RUNS; calculate_work_env_sizes(tc, static_frame, result); if (osr) result->osr_logging = 1; MVM_barrier(); static_frame->body.num_spesh_candidates++; if (static_frame->common.header.flags & MVM_CF_SECOND_GEN) MVM_gc_write_barrier_hit(tc, (MVMCollectable *)static_frame); if (tc->instance->spesh_log_fh) { char *c_name = MVM_string_utf8_encode_C_string(tc, static_frame->body.name); char *c_cuid = MVM_string_utf8_encode_C_string(tc, static_frame->body.cuuid); fprintf(tc->instance->spesh_log_fh, "Inserting logging for specialization of '%s' (cuid: %s)\n\n", c_name, c_cuid); fprintf(tc->instance->spesh_log_fh, "Before:\n%s\nAfter:\n%s\n\n========\n\n", before, after); fflush(tc->instance->spesh_log_fh); MVM_free(c_name); MVM_free(c_cuid); } used = 1; } } MVM_free(after); MVM_free(before); if (result && !used) { MVM_free(sc->bytecode); if (sc->handlers) MVM_free(sc->handlers); MVM_spesh_graph_destroy(tc, sg); } uv_mutex_unlock(&tc->instance->mutex_spesh_install); /* If we're profiling, log we've finished spesh work. */ if (tc->instance->profiling) MVM_profiler_log_spesh_end(tc); MVM_free(sc); return result; } /* Called at the point we have the finished logging for a specialization and * so are ready to do the specialization work for it. We can be sure this * will only be called once, and when nothing is running the logging version * of the code. */ void MVM_spesh_candidate_specialize(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMSpeshCandidate *candidate) { MVMSpeshCode *sc; MVMSpeshGraph *sg; MVMJitGraph *jg = NULL; /* If we're profiling, log we're starting spesh work. */ if (tc->instance->profiling) MVM_profiler_log_spesh_start(tc); /* Obtain the graph, add facts, and do optimization work. */ sg = candidate->sg; MVM_spesh_facts_discover(tc, sg); MVM_spesh_optimize(tc, sg); /* Dump updated graph if needed. */ if (tc->instance->spesh_log_fh) { char *c_name = MVM_string_utf8_encode_C_string(tc, static_frame->body.name); char *c_cuid = MVM_string_utf8_encode_C_string(tc, static_frame->body.cuuid); char *dump = MVM_spesh_dump(tc, sg); fprintf(tc->instance->spesh_log_fh, "Finished specialization of '%s' (cuid: %s)\n\n", c_name, c_cuid); fprintf(tc->instance->spesh_log_fh, "%s\n\n========\n\n", dump); fflush(tc->instance->spesh_log_fh); MVM_free(dump); MVM_free(c_name); MVM_free(c_cuid); } /* Generate code, and replace that in the candidate. */ sc = MVM_spesh_codegen(tc, sg); MVM_free(candidate->bytecode); if (candidate->handlers) MVM_free(candidate->handlers); candidate->bytecode = sc->bytecode; candidate->bytecode_size = sc->bytecode_size; candidate->handlers = sc->handlers; candidate->num_handlers = sg->num_handlers; candidate->num_deopts = sg->num_deopt_addrs; candidate->deopts = sg->deopt_addrs; candidate->num_locals = sg->num_locals; candidate->num_lexicals = sg->num_lexicals; candidate->num_inlines = sg->num_inlines; candidate->inlines = sg->inlines; candidate->local_types = sg->local_types; candidate->lexical_types = sg->lexical_types; calculate_work_env_sizes(tc, static_frame, candidate); MVM_free(sc); /* Try to JIT compile the optimised graph. The JIT graph hangs from * the spesh graph and can safely be deleted with it. */ if (tc->instance->jit_enabled) { jg = MVM_jit_try_make_graph(tc, sg); if (jg != NULL) candidate->jitcode = MVM_jit_compile_graph(tc, jg); } /* Update spesh slots. */ candidate->num_spesh_slots = sg->num_spesh_slots; candidate->spesh_slots = sg->spesh_slots; /* May now be referencing nursery objects, so barrier just in case. */ if (static_frame->common.header.flags & MVM_CF_SECOND_GEN) MVM_gc_write_barrier_hit(tc, (MVMCollectable *)static_frame); /* Destory spesh graph, and finally clear point to it in the candidate, * which unblocks use of the specialization. */ if (candidate->num_inlines) { MVMint32 i; for (i = 0; i < candidate->num_inlines; i++) if (candidate->inlines[i].g) { MVM_spesh_graph_destroy(tc, candidate->inlines[i].g); candidate->inlines[i].g = NULL; } } MVM_spesh_graph_destroy(tc, sg); MVM_barrier(); candidate->sg = NULL; /* If we're profiling, log we've finished spesh work. */ if (tc->instance->profiling) MVM_profiler_log_spesh_end(tc); } void MVM_spesh_candidate_destroy(MVMThreadContext *tc, MVMSpeshCandidate *candidate) { MVM_free(candidate->guards); MVM_free(candidate->bytecode); MVM_free(candidate->handlers); MVM_free(candidate->spesh_slots); MVM_free(candidate->deopts); MVM_free(candidate->log_slots); MVM_free(candidate->inlines); MVM_free(candidate->local_types); MVM_free(candidate->lexical_types); if (candidate->jitcode) MVM_jit_destroy_code(tc, candidate->jitcode); } MoarVM-2015.11/src/spesh/candidate.h0000644000175000017500000000772712623370227016067 0ustar jnthnjnthn/* A specialization candidate. */ struct MVMSpeshCandidate { /* The callsite we should have for a match. */ MVMCallsite *cs; /* Guards on incoming args. */ MVMSpeshGuard *guards; /* Number of guards we have. */ MVMuint32 num_guards; /* Length of the specialized bytecode in bytes. */ MVMuint32 bytecode_size; /* The specialized bytecode. */ MVMuint8 *bytecode; /* Frame handlers for this specialization. */ MVMFrameHandler *handlers; /* Spesh slots, used to hold information for fast access. */ MVMCollectable **spesh_slots; /* Number of spesh slots. */ MVMuint32 num_spesh_slots; /* The number of deoptimization mappings we have. */ MVMuint32 num_deopts; /* Deoptimization mappings. */ MVMint32 *deopts; /* Atomic integer for the number of times we've entered the code so far * for the purpose of logging, in the trace phase. We used this as an * index into the log slots when running logging code. Once it hits the * limit on number of log attempts it increments no further. */ AO_t log_enter_idx; /* Atomic integer for the number of times we need to exit the logging * version of the code. When this hits zero, we know we were the last * run, that there are no remaining runs, and so we should finalize * the specialization. */ AO_t log_exits_remaining; /* The spesh graph, if we're still in the process of producing a * specialization for this candidate. NULL afterwards. */ MVMSpeshGraph *sg; /* Logging slots, used when we're in the log phase of producing * a specialization. */ MVMCollectable **log_slots; /* Number of logging slots. */ MVMuint32 num_log_slots; /* Number of inlines and inlines table; see graph.h for description of * the table format. */ MVMint32 num_inlines; MVMSpeshInline *inlines; /* The list of local types (only set up if we do inlines). */ MVMuint16 *local_types; /* The list of lexical types (only set up if we do inlines). */ MVMuint16 *lexical_types; /* Number of locals the specialized code has (may be different from the * original frame thanks to inlining). */ MVMuint16 num_locals; /* Number of lexicals the specialized code has. */ MVMuint16 num_lexicals; /* Memory sizes to allocate for work/env, taking into account inlining. */ MVMuint32 work_size; MVMuint32 env_size; /* Number of handlers. */ MVMuint32 num_handlers; /* Whether this is a candidate we're in the process of doing OSR logging * on. */ MVMuint32 osr_logging; /* JIT-code structure */ MVMJitCode *jitcode; }; /* The number of specializations we'll allow per static frame. */ #define MVM_SPESH_LIMIT 4 /* A specialization guard. */ struct MVMSpeshGuard { /* The kind of guard this is. */ MVMint32 kind; /* The incoming argument slot it applies to. */ MVMint32 slot; /* Object we might be wanting to match against. */ MVMCollectable *match; }; /* Kinds of guard we have. */ #define MVM_SPESH_GUARD_CONC 1 /* Value is concrete with match type. */ #define MVM_SPESH_GUARD_TYPE 2 /* Value is type object with match type. */ #define MVM_SPESH_GUARD_DC_CONC 3 /* Decont'd value is concrete with match type. */ #define MVM_SPESH_GUARD_DC_TYPE 4 /* Decont'd value is type object with match type. */ #define MVM_SPESH_GUARD_DC_CONC_RW 5 /* Decont'd value is concrete with match type; rw cont. */ #define MVM_SPESH_GUARD_DC_TYPE_RW 6 /* Decont'd value is type object with match type; rw cont. */ /* Functions for generating a specialization. */ MVMSpeshCandidate * MVM_spesh_candidate_setup(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMint32 osr); void MVM_spesh_candidate_specialize(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMSpeshCandidate *candidate); void MVM_spesh_candidate_destroy(MVMThreadContext *tc, MVMSpeshCandidate *candidate); MoarVM-2015.11/src/spesh/codegen.c0000644000175000017500000002772312536002531015541 0ustar jnthnjnthn#include "moar.h" /* Here we turn a spesh tree back into MoarVM bytecode, after optimizations * have been applied to it. */ /* Writer state. */ typedef struct { /* Bytecode output buffer. */ MVMuint8 *bytecode; MVMuint32 bytecode_pos; MVMuint32 bytecode_alloc; /* Offsets where basic blocks are. */ MVMint32 *bb_offsets; /* Fixups we need to do by basic block. */ MVMint32 *fixup_locations; MVMSpeshBB **fixup_bbs; MVMint32 num_fixups; MVMint32 alloc_fixups; /* Copied frame handlers (which we'll update offsets of). */ MVMFrameHandler *handlers; } SpeshWriterState; /* Write functions; all native endian. */ static void ensure_space(SpeshWriterState *ws, int bytes) { if (ws->bytecode_pos + bytes >= ws->bytecode_alloc) { ws->bytecode_alloc *= 2; ws->bytecode = MVM_realloc(ws->bytecode, ws->bytecode_alloc); } } static void write_int64(SpeshWriterState *ws, MVMuint64 value) { ensure_space(ws, 8); memcpy(ws->bytecode + ws->bytecode_pos, &value, 8); ws->bytecode_pos += 8; } static void write_int32(SpeshWriterState *ws, MVMuint32 value) { ensure_space(ws, 4); memcpy(ws->bytecode + ws->bytecode_pos, &value, 4); ws->bytecode_pos += 4; } static void write_int16(SpeshWriterState *ws, MVMuint16 value) { ensure_space(ws, 2); memcpy(ws->bytecode + ws->bytecode_pos, &value, 2); ws->bytecode_pos += 2; } static void write_int8(SpeshWriterState *ws, MVMuint8 value) { ensure_space(ws, 1); memcpy(ws->bytecode + ws->bytecode_pos, &value, 1); ws->bytecode_pos++; } static void write_num32(SpeshWriterState *ws, MVMnum32 value) { ensure_space(ws, 4); memcpy(ws->bytecode + ws->bytecode_pos, &value, 4); ws->bytecode_pos += 4; } static void write_num64(SpeshWriterState *ws, MVMnum64 value) { ensure_space(ws, 8); memcpy(ws->bytecode + ws->bytecode_pos, &value, 8); ws->bytecode_pos += 8; } /* Writes instructions within a basic block boundary. */ static void write_instructions(MVMThreadContext *tc, MVMSpeshGraph *g, SpeshWriterState *ws, MVMSpeshBB *bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMint32 i; /* Process any annotations. */ MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *deopt_one_ann = NULL; MVMSpeshAnn *deopt_all_ann = NULL; MVMSpeshAnn *deopt_inline_ann = NULL; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: ws->handlers[ann->data.frame_handler_index].start_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_FH_END: ws->handlers[ann->data.frame_handler_index].end_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_FH_GOTO: ws->handlers[ann->data.frame_handler_index].goto_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_DEOPT_ONE_INS: deopt_one_ann = ann; break; case MVM_SPESH_ANN_DEOPT_ALL_INS: deopt_all_ann = ann; break; case MVM_SPESH_ANN_INLINE_START: g->inlines[ann->data.inline_idx].start = ws->bytecode_pos; break; case MVM_SPESH_ANN_INLINE_END: g->inlines[ann->data.inline_idx].end = ws->bytecode_pos; break; case MVM_SPESH_ANN_DEOPT_INLINE: deopt_inline_ann = ann; break; case MVM_SPESH_ANN_DEOPT_OSR: g->deopt_addrs[2 * ann->data.deopt_idx + 1] = ws->bytecode_pos; break; } ann = ann->next; } if (ins->info->opcode != MVM_SSA_PHI) { /* Real instruction, not a phi. Emit opcode. */ if (ins->info->opcode == (MVMuint16)-1) { /* Ext op; resolve. */ MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMint32 found = 0; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { write_int16(ws, MVM_OP_EXT_BASE + i); found = 1; break; } } if (!found) MVM_oops(tc, "Spesh: failed to resolve extop in code-gen"); } else { /* Core op. */ write_int16(ws, ins->info->opcode); } /* Write out operands. */ for (i = 0; i < ins->info->num_operands; i++) { MVMuint8 flags = ins->info->operands[i]; MVMuint8 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_read_reg: case MVM_operand_write_reg: write_int16(ws, ins->operands[i].reg.orig); break; case MVM_operand_read_lex: case MVM_operand_write_lex: write_int16(ws, ins->operands[i].lex.idx); write_int16(ws, ins->operands[i].lex.outers); break; case MVM_operand_literal: { MVMuint8 type = flags & MVM_operand_type_mask; switch (type) { case MVM_operand_int8: write_int8(ws, ins->operands[i].lit_i8); break; case MVM_operand_int16: write_int16(ws, ins->operands[i].lit_i16); break; case MVM_operand_int32: write_int32(ws, ins->operands[i].lit_i32); break; case MVM_operand_int64: write_int64(ws, ins->operands[i].lit_i64); break; case MVM_operand_num32: write_num32(ws, ins->operands[i].lit_n32); break; case MVM_operand_num64: write_num64(ws, ins->operands[i].lit_n64); break; case MVM_operand_callsite: write_int16(ws, ins->operands[i].callsite_idx); break; case MVM_operand_coderef: write_int16(ws, ins->operands[i].coderef_idx); break; case MVM_operand_str: write_int32(ws, ins->operands[i].lit_str_idx); break; case MVM_operand_ins: { MVMint32 offset = ws->bb_offsets[ins->operands[i].ins_bb->idx]; if (offset >= 0) { /* Already know where it is, so just write it. */ write_int32(ws, offset); } else { /* Need to fix it up. */ if (ws->num_fixups == ws->alloc_fixups) { ws->alloc_fixups *= 2; ws->fixup_locations = MVM_realloc(ws->fixup_locations, ws->alloc_fixups * sizeof(MVMint32)); ws->fixup_bbs = MVM_realloc(ws->fixup_bbs, ws->alloc_fixups * sizeof(MVMSpeshBB *)); } ws->fixup_locations[ws->num_fixups] = ws->bytecode_pos; ws->fixup_bbs[ws->num_fixups] = ins->operands[i].ins_bb; write_int32(ws, 0); ws->num_fixups++; } break; } case MVM_operand_spesh_slot: write_int16(ws, ins->operands[i].lit_i16); break; default: MVM_oops(tc, "Spesh: unknown operand type %d in codegen (op %s)", (int)type, ins->info->name); } } break; default: MVM_oops(tc, "Spesh: unknown operand type in codegen"); } } } /* If there was a deopt point annotation, update table. */ if (deopt_one_ann) g->deopt_addrs[2 * deopt_one_ann->data.deopt_idx + 1] = ws->bytecode_pos; if (deopt_all_ann) g->deopt_addrs[2 * deopt_all_ann->data.deopt_idx + 1] = ws->bytecode_pos; if (deopt_inline_ann) g->deopt_addrs[2 * deopt_inline_ann->data.deopt_idx + 1] = ws->bytecode_pos; ins = ins->next; } } /* Generate bytecode from a spesh graph. */ MVMSpeshCode * MVM_spesh_codegen(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshCode *res; MVMSpeshBB *bb; MVMint32 i, hanlen; /* Initialize writer state. */ SpeshWriterState *ws = MVM_malloc(sizeof(SpeshWriterState)); ws->bytecode_pos = 0; ws->bytecode_alloc = 1024; ws->bytecode = MVM_malloc(ws->bytecode_alloc); ws->bb_offsets = MVM_malloc(g->num_bbs * sizeof(MVMint32)); ws->num_fixups = 0; ws->alloc_fixups = 64; ws->fixup_locations = MVM_malloc(ws->alloc_fixups * sizeof(MVMint32)); ws->fixup_bbs = MVM_malloc(ws->alloc_fixups * sizeof(MVMSpeshBB *)); for (i = 0; i < g->num_bbs; i++) ws->bb_offsets[i] = -1; /* Create copy of handlers, and -1 all offsets so we can catch missing * updates. */ hanlen = g->num_handlers * sizeof(MVMFrameHandler); if (hanlen) { ws->handlers = MVM_malloc(hanlen); memcpy(ws->handlers, g->handlers, hanlen); for (i = 0; i < g->num_handlers; i++) { ws->handlers[i].start_offset = -1; ws->handlers[i].end_offset = -1; ws->handlers[i].goto_offset = -1; } } else { ws->handlers = NULL; } /* -1 all the deopt targets, so we'll easily catch those that don't get * mapped if we try to use them. Same for inlines. */ for (i = 0; i < g->num_deopt_addrs; i++) g->deopt_addrs[i * 2 + 1] = -1; for (i = 0; i < g->num_inlines; i++) { g->inlines[i].start = -1; g->inlines[i].end = -1; } /* Write out each of the basic blocks, in linear order. Skip the first, * dummy, block. */ bb = g->entry->linear_next; while (bb) { ws->bb_offsets[bb->idx] = ws->bytecode_pos; write_instructions(tc, g, ws, bb); bb = bb->linear_next; } /* Fixup labels we were too early for. */ for (i = 0; i < ws->num_fixups; i++) *((MVMuint32 *)(ws->bytecode + ws->fixup_locations[i])) = ws->bb_offsets[ws->fixup_bbs[i]->idx]; /* Ensure all handlers got fixed up. */ for (i = 0; i < g->num_handlers; i++) { if (ws->handlers[i].start_offset == -1 || ws->handlers[i].end_offset == -1 || ws->handlers[i].goto_offset == -1) MVM_oops(tc, "Spesh: failed to fix up handlers (%d, %d, %d)", (int)ws->handlers[i].start_offset, (int)ws->handlers[i].end_offset, (int)ws->handlers[i].goto_offset); } /* Ensure all inlines got fixed up. */ for (i = 0; i < g->num_inlines; i++) if (g->inlines[i].start == -1 || g->inlines[i].end == -1) MVM_oops(tc, "Spesh: failed to fix up inline %d", i); /* Produce result data structure. */ res = MVM_malloc(sizeof(MVMSpeshCode)); res->bytecode = ws->bytecode; res->bytecode_size = ws->bytecode_pos; res->handlers = ws->handlers; /* Cleanup. */ MVM_free(ws->bb_offsets); MVM_free(ws->fixup_locations); MVM_free(ws->fixup_bbs); MVM_free(ws); return res; } MoarVM-2015.11/src/spesh/codegen.h0000644000175000017500000000055212456307241015544 0ustar jnthnjnthn/* The result produced from specializing bytecode. */ struct MVMSpeshCode { /* The specialized bytecode. */ MVMuint8 *bytecode; /* The size of the produced bytecode. */ MVMuint32 bytecode_size; /* Updated set of frame handlers. */ MVMFrameHandler *handlers; }; MVMSpeshCode * MVM_spesh_codegen(MVMThreadContext *tc, MVMSpeshGraph *g); MoarVM-2015.11/src/spesh/deopt.c0000644000175000017500000003354712575756521015273 0ustar jnthnjnthn#include "moar.h" /* In some cases, we may have specialized bytecode "on the stack" and need to * back out of it, because some assumption it made has been invalidated. This * file contains implementations of those various forms of de-opt. */ /* If we have to deopt inside of a frame containing inlines, and we're in * an inlined frame at the point we hit deopt, we need to undo the inlining * by switching all levels of inlined frame out for a bunch of frames that * are running the de-optimized code. We may, of course, be in the original, * non-inline, bit of the code - in which case we've nothing to do. */ static void uninline(MVMThreadContext *tc, MVMFrame *f, MVMSpeshCandidate *cand, MVMint32 offset, MVMint32 deopt_offset, MVMFrame *callee) { MVMFrame *last_uninlined = NULL; MVMuint16 last_res_reg; MVMReturnType last_res_type; MVMuint32 last_return_deopt_idx; MVMint32 i; for (i = 0; i < cand->num_inlines; i++) { if (offset >= cand->inlines[i].start && offset < cand->inlines[i].end) { /* Create the frame. */ MVMCode *ucode = cand->inlines[i].code; MVMStaticFrame *usf = ucode->body.sf; MVMFrame *uf = MVM_frame_create_for_deopt(tc, usf, ucode); /*fprintf(stderr, "Recreated frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, usf->body.name), MVM_string_utf8_encode_C_string(tc, usf->body.cuuid));*/ /* Copy the locals and lexicals into place. */ memcpy(uf->work, f->work + cand->inlines[i].locals_start, usf->body.num_locals * sizeof(MVMRegister)); memcpy(uf->env, f->env + cand->inlines[i].lexicals_start, usf->body.num_lexicals * sizeof(MVMRegister)); /* Did we already uninline a frame? */ if (last_uninlined) { /* Yes; multi-level un-inline. Switch it back to deopt'd * code. */ uf->effective_bytecode = uf->static_info->body.bytecode; uf->effective_handlers = uf->static_info->body.handlers; uf->effective_spesh_slots = NULL; uf->spesh_cand = NULL; /* Set up the return location. */ uf->return_address = uf->static_info->body.bytecode + cand->deopts[2 * last_return_deopt_idx]; /* Set result type and register. */ uf->return_type = last_res_type; if (last_res_type == MVM_RETURN_VOID) uf->return_value = NULL; else uf->return_value = uf->work + last_res_reg; /* Set up last uninlined's caller to us. */ last_uninlined->caller = MVM_frame_inc_ref_by_frame(tc, uf); } else { /* First uninlined frame. Are we in the middle of the call * stack (and thus in deopt_all)? */ if (callee) { /* Tweak the callee's caller to the uninlined frame, not * the frame holding the inlinings. */ MVMFrame *orig_caller = callee->caller; callee->caller = MVM_frame_inc_ref_by_frame(tc, uf); MVM_frame_dec_ref(tc, orig_caller); /* Copy over the return location. */ uf->return_address = uf->effective_bytecode + deopt_offset; /* Set result type and register. */ uf->return_type = f->return_type; if (uf->return_type == MVM_RETURN_VOID) { uf->return_value = NULL; } else { MVMuint16 orig_reg = (MVMuint16)(f->return_value - f->work); MVMuint16 ret_reg = orig_reg - cand->inlines[i].locals_start; uf->return_value = uf->work + ret_reg; } } else { /* No, it's the deopt_one case, so this is where we'll point * the interpreter. */ tc->cur_frame = uf; *(tc->interp_cur_op) = uf->effective_bytecode + deopt_offset; *(tc->interp_bytecode_start) = uf->effective_bytecode; *(tc->interp_reg_base) = uf->work; *(tc->interp_cu) = usf->body.cu; } } /* Update tracking variables for last uninline. Note that we know * an inline ends with a goto, which is how we're able to find a * return address offset. */ last_uninlined = uf; last_res_reg = cand->inlines[i].res_reg; last_res_type = cand->inlines[i].res_type; last_return_deopt_idx = cand->inlines[i].return_deopt_idx; } } if (last_uninlined) { /* Set return address, which we need to resolve to the deopt'd one. */ f->return_address = f->static_info->body.bytecode + cand->deopts[2 * last_return_deopt_idx]; /* Set result type and register. */ f->return_type = last_res_type; if (last_res_type == MVM_RETURN_VOID) f->return_value = NULL; else f->return_value = f->work + last_res_reg; /* Set up inliner as the caller, given we now have a direct inline. */ last_uninlined->caller = MVM_frame_inc_ref_by_frame(tc, f); } else { /* Weren't in an inline after all. What kind of deopt? */ if (callee) { /* Deopt all. Move return address. */ f->return_address = f->effective_bytecode + deopt_offset; } else { /* Deopt one. Move interpreter. */ *(tc->interp_cur_op) = f->static_info->body.bytecode + deopt_offset; *(tc->interp_bytecode_start) = f->static_info->body.bytecode; } } } static MVMint32 find_deopt_target(MVMThreadContext *tc, MVMFrame *f, MVMint32 deopt_offset) { MVMint32 i; for (i = 0; i < f->spesh_cand->num_deopts * 2; i += 2) { if (f->spesh_cand->deopts[i + 1] == deopt_offset) { return f->spesh_cand->deopts[i]; } } MVM_oops(tc, "find_deopt_target failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } static void deopt_frame(MVMThreadContext *tc, MVMFrame *f, MVMint32 deopt_offset, MVMint32 deopt_target) { /* Found it; are we in an inline? */ MVMSpeshInline *inlines = f->spesh_cand->inlines; if (inlines) { /* Yes, going to have to re-create the frames; uninline * moves the interpreter, so we can just tweak the last * frame. */ uninline(tc, f, f->spesh_cand, deopt_offset, deopt_target, NULL); f->effective_bytecode = f->static_info->body.bytecode; f->effective_handlers = f->static_info->body.handlers; f->effective_spesh_slots = NULL; f->spesh_cand = NULL; /*fprintf(stderr, "Completed deopt_one in '%s' (cuid '%s'), idx = %i, with uninlining\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid), i / 2);*/ } else { /* No inlining; simple case. Switch back to the original code. */ f->effective_bytecode = f->static_info->body.bytecode; f->effective_handlers = f->static_info->body.handlers; *(tc->interp_cur_op) = f->effective_bytecode + deopt_target; *(tc->interp_bytecode_start) = f->effective_bytecode; f->effective_spesh_slots = NULL; f->spesh_cand = NULL; /*fprintf(stderr, "Completed deopt_one in '%s' (cuid '%s'), idx = %i\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid), i / 2);*/ } } /* De-optimizes the currently executing frame, provided it is specialized and * at a valid de-optimization point. Typically used when a guard fails. */ void MVM_spesh_deopt_one(MVMThreadContext *tc) { MVMFrame *f = tc->cur_frame; if (tc->instance->profiling) MVM_profiler_log_deopt_one(tc); /*fprintf(stderr, "deopt_one requested in frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid));*/ if (f->effective_bytecode != f->static_info->body.bytecode) { MVMint32 deopt_offset = *(tc->interp_cur_op) - f->effective_bytecode; MVMint32 deopt_target = find_deopt_target(tc, f, deopt_offset); deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_oops(tc, "deopt_one failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } } /* De-optimizes the current frame by directly specifying the addresses */ void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMint32 deopt_offset, MVMint32 deopt_target) { MVMFrame *f = tc->cur_frame; if (tc->instance->profiling) MVM_profiler_log_deopt_one(tc); if (f->effective_bytecode != f->static_info->body.bytecode) { deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_oops(tc, "deopt_one_direct failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } } /* De-optimizes all specialized frames on the call stack. Used when a change * is made the could invalidate all kinds of assumptions all over the place * (such as a mix-in). */ void MVM_spesh_deopt_all(MVMThreadContext *tc) { /* Walk frames looking for any callers in specialized bytecode. */ MVMFrame *l = tc->cur_frame; MVMFrame *f = tc->cur_frame->caller; if (tc->instance->profiling) MVM_profiler_log_deopt_all(tc); while (f) { if (f->effective_bytecode != f->static_info->body.bytecode && f->spesh_log_idx < 0) { /* Found one. Is it JITted code? */ if (f->spesh_cand->jitcode && f->jit_entry_label) { MVMint32 num_deopts = f->spesh_cand->jitcode->num_deopts; MVMJitDeopt *deopts = f->spesh_cand->jitcode->deopts; void **labels = f->spesh_cand->jitcode->labels; MVMint32 i; for (i = 0; i < num_deopts; i++) { if (labels[deopts[i].label] == f->jit_entry_label) { /* fprintf(stderr, "Found deopt label for JIT (%d) (label %d idx %d)\n", i, deopts[i].label, deopts[i].idx); */ /* Resolve offset and target. */ MVMint32 deopt_idx = deopts[i].idx; MVMint32 deopt_offset = f->spesh_cand->deopts[2 * deopt_idx + 1]; MVMint32 deopt_target = f->spesh_cand->deopts[2 * deopt_idx]; /* Switch frame itself back to the original code. */ f->effective_bytecode = f->static_info->body.bytecode; f->effective_handlers = f->static_info->body.handlers; /* Re-create any frames needed if we're in an inline; if not, * just update return address. */ if (f->spesh_cand->inlines) uninline(tc, f, f->spesh_cand, deopt_offset, deopt_target, l); else f->return_address = f->effective_bytecode + deopt_target; /* No spesh cand/slots needed now. */ f->effective_spesh_slots = NULL; f->spesh_cand = NULL; f->jit_entry_label = NULL; break; } } /* if (i == num_deopts) fprintf(stderr, "JIT: can't find deopt all idx"); */ } else { /* Not JITted; see if we can find the return address in the deopt table. */ MVMint32 ret_offset = f->return_address - f->effective_bytecode; MVMint32 i; for (i = 0; i < f->spesh_cand->num_deopts * 2; i += 2) { if (f->spesh_cand->deopts[i + 1] == ret_offset) { /* Switch frame itself back to the original code. */ f->effective_bytecode = f->static_info->body.bytecode; f->effective_handlers = f->static_info->body.handlers; /* Re-create any frames needed if we're in an inline; if not, * just update return address. */ if (f->spesh_cand->inlines) uninline(tc, f, f->spesh_cand, ret_offset, f->spesh_cand->deopts[i], l); else f->return_address = f->effective_bytecode + f->spesh_cand->deopts[i]; /* No spesh cand/slots needed now. */ f->effective_spesh_slots = NULL; f->spesh_cand = NULL; break; } } } } l = f; f = f->caller; } } MoarVM-2015.11/src/spesh/deopt.h0000644000175000017500000000034512456307241015253 0ustar jnthnjnthnvoid MVM_spesh_deopt_all(MVMThreadContext *tc); void MVM_spesh_deopt_one(MVMThreadContext *tc); void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMint32 deopt_offset, MVMint32 deopt_target); MoarVM-2015.11/src/spesh/dump.c0000644000175000017500000005074712623370227015113 0ustar jnthnjnthn#include "moar.h" /* Auto-growing buffer. */ typedef struct { char *buffer; size_t alloc; size_t pos; } DumpStr; static void append(DumpStr *ds, char *to_add) { size_t len = strlen(to_add); if (ds->pos + len >= ds->alloc) { ds->alloc *= 4; if (ds->pos + len >= ds->alloc) ds->alloc += len; ds->buffer = MVM_realloc(ds->buffer, ds->alloc); } memcpy(ds->buffer + ds->pos, to_add, len); ds->pos += len; } static size_t tell_ds(DumpStr *ds) { return ds->pos; } static void rewind_ds(DumpStr *ds, size_t target) { if (ds->pos > target) { ds->pos = target; ds->buffer[ds->pos + 1] = '\0'; } } /* Formats a string and then appends it. */ MVM_FORMAT(printf, 2, 3) static void appendf(DumpStr *ds, const char *fmt, ...) { char *c_message = MVM_malloc(1024); va_list args; va_start(args, fmt); c_message[vsnprintf(c_message, 1023, fmt, args)] = 0; append(ds, c_message); MVM_free(c_message); va_end(args); } /* Turns a MoarVM string into a C string and appends it. */ static void append_str(MVMThreadContext *tc, DumpStr *ds, MVMString *s) { char *cs = MVM_string_utf8_encode_C_string(tc, s); append(ds, cs); MVM_free(cs); } /* Appends a null at the end. */ static void append_null(DumpStr *ds) { append(ds, " "); /* Delegate realloc if we're really unlucky. */ ds->buffer[ds->pos - 1] = '\0'; } /* Dumps a basic block. */ static void dump_bb(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g, MVMSpeshBB *bb) { MVMSpeshIns *cur_ins; MVMint64 i; /* Heading. */ appendf(ds, " BB %d (%p):\n", bb->idx, bb); if (bb->inlined) { append(ds, " Inlined\n"); } { /* Also, we have a line number */ MVMBytecodeAnnotation *bbba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, bb->initial_pc); MVMuint32 line_number; if (bbba) { line_number = bbba->line_number; MVM_free(bbba); } else { line_number = -1; } appendf(ds, " line: %d (pc %d)\n", line_number, bb->initial_pc); } /* Instructions. */ append(ds, " Instructions:\n"); cur_ins = bb->first_ins; while (cur_ins) { MVMSpeshAnn *ann = cur_ins->annotations; MVMuint32 line_number; while (ann) { /* These four annotations carry a deopt index that we can find a * corresponding line number for */ if (ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS || ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS || ann->type == MVM_SPESH_ANN_DEOPT_INLINE || ann->type == MVM_SPESH_ANN_DEOPT_OSR) { MVMBytecodeAnnotation *ba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, g->deopt_addrs[2 * ann->data.deopt_idx]); if (ba) { line_number = ba->line_number; MVM_free(ba); } else { line_number = -1; } } switch (ann->type) { case MVM_SPESH_ANN_FH_START: appendf(ds, " [Annotation: FH Start (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_FH_END: appendf(ds, " [Annotation: FH End (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_FH_GOTO: appendf(ds, " [Annotation: FH Goto (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_DEOPT_ONE_INS: appendf(ds, " [Annotation: INS Deopt One (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_DEOPT_ALL_INS: appendf(ds, " [Annotation: INS Deopt All (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_INLINE_START: appendf(ds, " [Annotation: Inline Start (%d)]\n", ann->data.inline_idx); break; case MVM_SPESH_ANN_INLINE_END: appendf(ds, " [Annotation: Inline End (%d)]\n", ann->data.inline_idx); break; case MVM_SPESH_ANN_DEOPT_INLINE: appendf(ds, " [Annotation: INS Deopt Inline (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_DEOPT_OSR: appendf(ds, " [Annotation: INS Deopt OSR (idx %d -> pc %d); line %d]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; default: appendf(ds, " [Annotation: %d (unknown)]\n", ann->type); } ann = ann->next; } appendf(ds, " %-15s ", cur_ins->info->name); if (cur_ins->info->opcode == MVM_SSA_PHI) { for (i = 0; i < cur_ins->info->num_operands; i++) { MVMint16 orig = cur_ins->operands[i].reg.orig; MVMint16 regi = cur_ins->operands[i].reg.i; if (i) append(ds, ", "); if (orig < 10) append(ds, " "); if (regi < 10) append(ds, " "); appendf(ds, "r%d(%d)", orig, regi); } } else { for (i = 0; i < cur_ins->info->num_operands; i++) { if (i) append(ds, ", "); switch (cur_ins->info->operands[i] & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: { MVMint16 orig = cur_ins->operands[i].reg.orig; MVMint16 regi = cur_ins->operands[i].reg.i; if (orig < 10) append(ds, " "); if (regi < 10) append(ds, " "); appendf(ds, "r%d(%d)", orig, regi); break; } case MVM_operand_read_lex: case MVM_operand_write_lex: { MVMStaticFrameBody *cursor = &g->sf->body; MVMuint32 ascension; appendf(ds, "lex(idx=%d,outers=%d", cur_ins->operands[i].lex.idx, cur_ins->operands[i].lex.outers); for (ascension = 0; ascension < cur_ins->operands[i].lex.outers; ascension++, cursor = &cursor->outer->body) { }; if (cursor->fully_deserialized) { if (cur_ins->operands[i].lex.idx < cursor->num_lexicals) { char *cstr = MVM_string_utf8_encode_C_string(tc, cursor->lexical_names_list[cur_ins->operands[i].lex.idx]->key); appendf(ds, ",%s)", cstr); MVM_free(cstr); } else { append(ds, ",)"); } } else { append(ds, ",)"); } break; } case MVM_operand_literal: { MVMuint32 type = cur_ins->info->operands[i] & MVM_operand_type_mask; switch (type) { case MVM_operand_ins: { MVMint32 bb_idx = cur_ins->operands[i].ins_bb->idx; if (bb_idx < 100) append(ds, " "); if (bb_idx < 10) append(ds, " "); appendf(ds, "BB(%d)", bb_idx); break; } case MVM_operand_int8: appendf(ds, "liti8(%"PRId8")", cur_ins->operands[i].lit_i8); break; case MVM_operand_int16: appendf(ds, "liti16(%"PRId16")", cur_ins->operands[i].lit_i16); break; case MVM_operand_int32: appendf(ds, "liti32(%"PRId32")", cur_ins->operands[i].lit_i32); break; case MVM_operand_int64: appendf(ds, "liti64(%"PRId64")", cur_ins->operands[i].lit_i64); break; case MVM_operand_num32: appendf(ds, "litn32(%f)", cur_ins->operands[i].lit_n32); break; case MVM_operand_num64: appendf(ds, "litn64(%g)", cur_ins->operands[i].lit_n64); break; case MVM_operand_str: { char *cstr = MVM_string_utf8_encode_C_string(tc, g->sf->body.cu->body.strings[cur_ins->operands[i].lit_str_idx]); appendf(ds, "lits(%s)", cstr); MVM_free(cstr); break; } case MVM_operand_callsite: { MVMCallsite *callsite = g->sf->body.cu->body.callsites[cur_ins->operands[i].callsite_idx]; appendf(ds, "callsite(%p, %d arg, %d pos, %s, %s)", callsite, callsite->arg_count, callsite->num_pos, callsite->has_flattening ? "flattening" : "nonflattening", callsite->is_interned ? "interned" : "noninterned"); break; } case MVM_operand_spesh_slot: appendf(ds, "sslot(%"PRId16")", cur_ins->operands[i].lit_i16); break; case MVM_operand_coderef: { MVMCodeBody *body = &((MVMCode*)g->sf->body.cu->body.coderefs[cur_ins->operands[i].coderef_idx])->body; MVMBytecodeAnnotation *anno = MVM_bytecode_resolve_annotation(tc, &body->sf->body, 0); append(ds, "coderef("); if (anno) { char *filestr = MVM_string_utf8_encode_C_string(tc, g->sf->body.cu->body.strings[anno->filename_string_heap_index]); appendf(ds, "%s:%d%s)", filestr, anno->line_number, body->outer ? " (closure)" : ""); MVM_free(filestr); } else { append(ds, "??\?)"); } MVM_free(anno); break; } default: append(ds, ""); } break; } default: append(ds, ""); } } } append(ds, "\n"); cur_ins = cur_ins->next; } /* Predecessors and successors. */ append(ds, " Successors: "); for (i = 0; i < bb->num_succ; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->succ[i]->idx); append(ds, "\n Predeccessors: "); for (i = 0; i < bb->num_pred; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->pred[i]->idx); append(ds, "\n Dominance children: "); for (i = 0; i < bb->num_children; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->children[i]->idx); append(ds, "\n\n"); } /* Dumps the facts table. */ static void dump_facts(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMuint16 i, j, num_locals, num_facts; num_locals = g->num_locals; for (i = 0; i < num_locals; i++) { num_facts = g->fact_counts[i]; for (j = 0; j < num_facts; j++) { MVMint32 usages = g->facts[i][j].usages; MVMint32 flags = g->facts[i][j].flags; if (i < 10) append(ds, " "); if (j < 10) append(ds, " "); appendf(ds, " r%d(%d): usages=%d, flags=%-5d", i, j, usages, flags); if (flags & 1) { append(ds, " KnTyp"); } if (flags & 2) { append(ds, " KnVal"); } if (flags & 4) { append(ds, " Dcntd"); } if (flags & 8) { append(ds, " Concr"); } if (flags & 16) { append(ds, " TyObj"); } if (flags & 32) { append(ds, " KnDcT"); } if (flags & 64) { append(ds, " DCncr"); } if (flags & 128) { append(ds, " DcTyO"); } if (flags & 256) { append(ds, " LogGd"); } if (flags & 512) { append(ds, " HashI"); } if (flags & 1024) { append(ds, " ArrIt"); } if (flags & 2048) { append(ds, " KBxSr"); } if (flags & 4096) { append(ds, " MgWLG"); } if (g->facts[i][j].writer && g->facts[i][j].writer->info->opcode == MVM_SSA_PHI) { appendf(ds, " (merged from %d regs)", g->facts[i][j].writer->info->num_operands - 1); } append(ds, "\n"); } } } /* Dumps a table of all logged values */ static void dump_log_values(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMint16 log_index; MVMint16 seen_table_size = g->num_log_slots * MVM_SPESH_LOG_RUNS; size_t ds_pos_before = tell_ds(ds); MVMint16 interesting = 0; MVMCollectable **seen_table = alloca(sizeof(MVMCollectable *) *seen_table_size); memset(seen_table, 0, sizeof(MVMCollectable *) * seen_table_size); append(ds, "Logged values:\n"); for (log_index = 0; log_index < g->num_log_slots; log_index++) { MVMint16 run_index; appendf(ds, " % 3d ", log_index); for (run_index = 0; run_index < MVM_SPESH_LOG_RUNS; run_index++) { MVMuint16 log_slot = log_index * MVM_SPESH_LOG_RUNS + run_index; MVMCollectable *log_obj = g->log_slots[log_slot]; MVMint16 log_obj_idx; if (log_obj) { for (log_obj_idx = 0; log_obj_idx < seen_table_size; log_obj_idx++) { if (seen_table[log_obj_idx] == log_obj) { break; } else if (seen_table[log_obj_idx] == 0) { seen_table[log_obj_idx] = log_obj; break; } } appendf(ds, "% 4d ", log_obj_idx + 1); interesting = 1; } else { appendf(ds, "%4s ", "_"); } } append(ds, "\n"); } append(ds, "\n"); for (log_index = 0; log_index < seen_table_size && seen_table[log_index]; log_index++) { appendf(ds, " %d: %p", log_index + 1, seen_table[log_index]); if (STABLE(seen_table[log_index])->REPR->ID == MVM_REPR_ID_P6int) { if (IS_CONCRETE(seen_table[log_index])) appendf(ds, " P6int(%"PRId64")", MVM_repr_get_int(tc, (MVMObject*)seen_table[log_index])); else append(ds, " P6int(type object)"); } else { append(ds, " "); append(ds, (char *)STABLE(seen_table[log_index])->REPR->name); if (!IS_CONCRETE(seen_table[log_index])) append(ds, "(type object)"); } append(ds, "\n"); } append(ds, "\n"); if (!interesting) { rewind_ds(ds, ds_pos_before); } } static void dump_callsite(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMuint16 i; appendf(ds, "Callsite %p (%d args, %d pos)\n", g->cs, g->cs->arg_count, g->cs->num_pos); for (i = 0; i < (g->cs->arg_count - g->cs->num_pos) / 2; i++) { if (g->cs->arg_names[i]) { char * argname_utf8 = MVM_string_utf8_encode_C_string(tc, g->cs->arg_names[i]); appendf(ds, " - %s\n", argname_utf8); MVM_free(argname_utf8); } } if (g->cs->num_pos) append(ds, "Positional flags: "); for (i = 0; i < g->cs->num_pos; i++) { MVMCallsiteEntry arg_flag = g->cs->arg_flags[i]; if (i) append(ds, ", "); if (arg_flag == MVM_CALLSITE_ARG_OBJ) { append(ds, "obj"); } else if (arg_flag == MVM_CALLSITE_ARG_INT) { append(ds, "int"); } else if (arg_flag == MVM_CALLSITE_ARG_NUM) { append(ds, "num"); } else if (arg_flag == MVM_CALLSITE_ARG_STR) { append(ds, "str"); } } if (g->cs->num_pos) append(ds, "\n"); append(ds, "\n"); } static void dump_arg_guards(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMuint16 i; appendf(ds, "%d argument guards\n", g->num_arg_guards); for (i = 0; i < g->num_arg_guards; i++) { MVMSpeshGuard *guard = &g->arg_guards[i]; switch (guard->kind) { case MVM_SPESH_GUARD_CONC: appendf(ds, " concrete(%d)\n", guard->slot); break; case MVM_SPESH_GUARD_TYPE: appendf(ds, " type(%d, %p)\n", guard->slot, guard->match); break; case MVM_SPESH_GUARD_DC_CONC: appendf(ds, " deconted_concrete(%d)\n", guard->slot); break; case MVM_SPESH_GUARD_DC_TYPE: appendf(ds, " deconted_type(%d, %p)\n", guard->slot, guard->match); break; case MVM_SPESH_GUARD_DC_CONC_RW: appendf(ds, " deconted_concrete_rw(%d)\n", guard->slot); break; case MVM_SPESH_GUARD_DC_TYPE_RW: appendf(ds, " deconted_type_rw(%d, %p)\n", guard->slot, guard->match); break; } } append(ds, "\n"); } static void dump_fileinfo(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMBytecodeAnnotation *ann = MVM_bytecode_resolve_annotation(tc, &g->sf->body, 0); MVMCompUnit *cu = g->sf->body.cu; MVMint32 str_idx = ann ? ann->filename_string_heap_index : 0; MVMint32 line_nr = ann ? ann->line_number : 1; MVMString *filename = cu->body.filename; char *filename_utf8 = ""; if (ann && str_idx < cu->body.num_strings) { filename = cu->body.strings[str_idx]; } if (filename) filename_utf8 = MVM_string_utf8_encode_C_string(tc, filename); appendf(ds, "%s:%d", filename_utf8, line_nr); if (filename) MVM_free(filename_utf8); MVM_free(ann); } /* Dump a spesh graph into string form, for debugging purposes. */ char * MVM_spesh_dump(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *cur_bb; /* Allocate buffer. */ DumpStr ds; ds.alloc = 8192; ds.buffer = MVM_malloc(ds.alloc); ds.pos = 0; /* Dump name and CUID. */ append(&ds, "Spesh of '"); append_str(tc, &ds, g->sf->body.name); append(&ds, "' (cuid: "); append_str(tc, &ds, g->sf->body.cuuid); append(&ds, ", file: "); dump_fileinfo(tc, &ds, g); append(&ds, ")\n"); if (g->cs) dump_callsite(tc, &ds, g); if (g->num_arg_guards) dump_arg_guards(tc, &ds, g); if (!g->cs && !g->num_arg_guards) append(&ds, "\n"); /* Go over all the basic blocks and dump them. */ cur_bb = g->entry; while (cur_bb) { dump_bb(tc, &ds, g, cur_bb); cur_bb = cur_bb->linear_next; } /* Dump facts. */ append(&ds, "\nFacts:\n"); dump_facts(tc, &ds, g); if (g->num_spesh_slots || g->num_log_slots) { append(&ds, "\nStats:\n"); appendf(&ds, " %d spesh slots\n", g->num_spesh_slots); appendf(&ds, " %d log slots\n", g->num_log_slots); } if (g->num_log_slots) { dump_log_values(tc, &ds, g); } append(&ds, "\n"); append_null(&ds); return ds.buffer; } MoarVM-2015.11/src/spesh/dump.h0000644000175000017500000000011212456307241015075 0ustar jnthnjnthnMVM_PUBLIC char * MVM_spesh_dump(MVMThreadContext *tc, MVMSpeshGraph *g); MoarVM-2015.11/src/spesh/facts.c0000644000175000017500000005442012623370227015236 0ustar jnthnjnthn#include "moar.h" /* The code in this file walks the spesh graph, recording facts we discover * about each version of each local variable, and propagating the info as it * can. */ /* Copies facts from one var to another. */ static void copy_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 to_orig, MVMuint16 to_i, MVMuint16 from_orig, MVMuint16 from_i) { MVMSpeshFacts *tfacts = &g->facts[to_orig][to_i]; MVMSpeshFacts *ffacts = &g->facts[from_orig][from_i]; tfacts->flags = ffacts->flags; tfacts->type = ffacts->type; tfacts->decont_type = ffacts->decont_type; tfacts->value = ffacts->value; tfacts->log_guard = ffacts->log_guard; } /* Called when one set of facts depend on another, allowing any log guard * that is to thank to be marked used as needed later on. */ static void depend(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *target, MVMSpeshFacts *source) { if (source->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) { target->flags |= MVM_SPESH_FACT_FROM_LOG_GUARD; target->log_guard = source->log_guard; } } /* Handles object-creating instructions. */ static void create_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 obj_orig, MVMuint16 obj_i, MVMuint16 type_orig, MVMuint16 type_i) { MVMSpeshFacts *type_facts = &(g->facts[type_orig][type_i]); MVMSpeshFacts *obj_facts = &(g->facts[obj_orig][obj_i]); /* The type is carried. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { obj_facts->type = type_facts->type; obj_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; depend(tc, g, obj_facts, type_facts); } /* We know it's a concrete object. */ obj_facts->flags |= MVM_SPESH_FACT_CONCRETE; /* If we know the type object, then we can check to see if * it's a container type. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMObject *type = type_facts->type; if (type && !STABLE(type)->container_spec) obj_facts->flags |= MVM_SPESH_FACT_DECONTED; } } static void create_facts_with_type(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 obj_orig, MVMuint16 obj_i, MVMObject *type) { MVMSpeshFacts *obj_facts = &(g->facts[obj_orig][obj_i]); /* The type is carried. */ obj_facts->type = type; obj_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; /* We know it's a concrete object. */ obj_facts->flags |= MVM_SPESH_FACT_CONCRETE; /* If we know the type object, then we can check to see if * it's a container type. */ if (type && !STABLE(type)->container_spec) obj_facts->flags |= MVM_SPESH_FACT_DECONTED; } /* Adds facts from knowing the exact value being put into an object local. */ static void object_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 tgt_orig, MVMuint16 tgt_i, MVMObject *obj) { /* Ensure it's non-null. */ if (!obj) return; /* Set the value itself. */ g->facts[tgt_orig][tgt_i].value.o = obj; g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_KNOWN_VALUE; /* We also know the type. */ g->facts[tgt_orig][tgt_i].type = STABLE(obj)->WHAT; g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_KNOWN_TYPE; /* Set concreteness and decontainerized flags. */ if (IS_CONCRETE(obj)) { g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_CONCRETE; if (!STABLE(obj)->container_spec) g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_DECONTED; } else { g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_TYPEOBJ | MVM_SPESH_FACT_DECONTED; } } /* Propagates information relating to decontainerization. */ static void decont_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 out_orig, MVMuint16 out_i, MVMuint16 in_orig, MVMuint16 in_i) { MVMSpeshFacts *out_facts = &(g->facts[out_orig][out_i]); MVMSpeshFacts *in_facts = &(g->facts[in_orig][in_i]); /* If we know the original is decontainerized already, just copy its * info. */ MVMint32 in_flags = in_facts->flags; if (in_flags & MVM_SPESH_FACT_DECONTED) copy_facts(tc, g, out_orig, out_i, in_orig, in_i); /* We know the result is decontainerized. */ out_facts->flags |= MVM_SPESH_FACT_DECONTED; /* We may also know the original was containerized, and have some facts * about its contents. */ if (in_flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { out_facts->type = in_facts->decont_type; out_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; } if (in_flags & MVM_SPESH_FACT_DECONT_CONCRETE) out_facts->flags |= MVM_SPESH_FACT_CONCRETE; else if (in_flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) out_facts->flags |= MVM_SPESH_FACT_TYPEOBJ; if (in_flags & (MVM_SPESH_FACT_KNOWN_DECONT_TYPE | MVM_SPESH_FACT_DECONT_CONCRETE | MVM_SPESH_FACT_DECONT_TYPEOBJ)) depend(tc, g, out_facts, in_facts); } /* Looks up a wval and adds information based on it. */ static void wval_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 tgt_orig, MVMuint16 tgt_i, MVMuint16 dep, MVMint64 idx) { MVMCompUnit *cu = g->sf->body.cu; if (dep < cu->body.num_scs) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc) object_facts(tc, g, tgt_orig, tgt_i, MVM_sc_get_object(tc, sc, idx)); } } /* Let's figure out what exact type of iter we'll get from an iter op */ static void iter_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 out_orig, MVMuint16 out_i, MVMuint16 in_orig, MVMuint16 in_i) { MVMSpeshFacts *out_facts = &(g->facts[out_orig][out_i]); MVMSpeshFacts *in_facts = &(g->facts[in_orig][in_i]); if (in_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { switch (REPR(in_facts->type)->ID) { case MVM_REPR_ID_MVMArray: out_facts->type = g->sf->body.cu->body.hll_config->array_iterator_type; out_facts->flags |= MVM_SPESH_FACT_ARRAY_ITER; break; case MVM_REPR_ID_MVMHash: case MVM_REPR_ID_MVMContext: out_facts->type = g->sf->body.cu->body.hll_config->hash_iterator_type; out_facts->flags |= MVM_SPESH_FACT_HASH_ITER; break; default: return; } out_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE; } } /* constant ops on literals give us a specialize-time-known value */ static void literal_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *tgt_facts = &g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]; switch (ins->info->opcode) { case MVM_OP_const_i64: tgt_facts->value.i = ins->operands[1].lit_i64; break; case MVM_OP_const_i32: tgt_facts->value.i = ins->operands[1].lit_i32; break; case MVM_OP_const_i16: tgt_facts->value.i = ins->operands[1].lit_i16; break; case MVM_OP_const_i8: tgt_facts->value.i = ins->operands[1].lit_i8; break; case MVM_OP_const_n32: tgt_facts->value.n = ins->operands[1].lit_n32; break; case MVM_OP_const_n64: tgt_facts->value.n = ins->operands[1].lit_n64; break; case MVM_OP_const_i64_32: tgt_facts->value.i = ins->operands[1].lit_i32; break; case MVM_OP_const_i64_16: tgt_facts->value.i = ins->operands[1].lit_i16; break; case MVM_OP_const_s: tgt_facts->value.s = g->sf->body.cu->body.strings[ins->operands[1].lit_str_idx]; break; default: return; } tgt_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; } /* Discover facts from extops. */ static void discover_extop(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { /* Found op; call its discovery function, if any. */ if (extops[i].discover) extops[i].discover(tc, g, ins); return; } } } /* Allocates space for keeping track of guards inserted from logging, and * their usage. */ static void allocate_log_guard_table(MVMThreadContext *tc, MVMSpeshGraph *g) { g->log_guards = MVM_spesh_alloc(tc, g, g->num_log_slots * sizeof(MVMSpeshLogGuard)); } /* Check for stability of what was logged, and if it looks sane then add facts * and turn the log instruction into a */ static void log_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMObject *stable_value = NULL; MVMObject *stable_cont = NULL; MVMSpeshFacts *facts; /* See if all the recorded facts match up; a NULL means there was a code * path that never reached making a log entry. */ MVMuint16 log_start = ins->operands[1].lit_i16 * MVM_SPESH_LOG_RUNS; MVMuint16 i; for (i = log_start; i < log_start + MVM_SPESH_LOG_RUNS; i++) { MVMObject *consider = (MVMObject *)g->log_slots[i]; if (consider) { if (!stable_value) { stable_value = consider; } else if (STABLE(stable_value) != STABLE(consider) || IS_CONCRETE(stable_value) != IS_CONCRETE(consider)) { stable_value = NULL; break; } } } if (!stable_value) return; /* If the value is a container type, need to look inside of it. */ if (STABLE(stable_value)->container_spec && IS_CONCRETE(stable_value)) { MVMContainerSpec const *contspec = STABLE(stable_value)->container_spec; if (!contspec->fetch_never_invokes) return; stable_cont = stable_value; stable_value = NULL; for (i = log_start; i < log_start + MVM_SPESH_LOG_RUNS; i++) { MVMRegister r; contspec->fetch(tc, stable_cont, &r); if (r.o) { if (!stable_value) { stable_value = r.o; } else if (STABLE(stable_value) != STABLE(r.o) || IS_CONCRETE(stable_value) != IS_CONCRETE(r.o)) { stable_value = NULL; break; } } } if (!stable_value) return; } /* Produce a guard op and set facts. */ if (stable_cont) { MVMSpeshOperand reg = ins->operands[0]; facts = &g->facts[reg.reg.orig][reg.reg.i]; facts->type = STABLE(stable_cont)->WHAT; facts->flags |= (MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_KNOWN_DECONT_TYPE); facts->decont_type = STABLE(stable_value)->WHAT; if (STABLE(stable_cont)->container_spec->can_store(tc, stable_cont)) { /* We could do stability testing on rw-ness too, but it's quite * unlikely we'll have codepaths with a mix of readable and * writable containers. */ facts->flags |= MVM_SPESH_FACT_RW_CONT; if (IS_CONCRETE(stable_value)) { facts->flags |= MVM_SPESH_FACT_DECONT_CONCRETE; ins->info = MVM_op_get_op(MVM_OP_sp_guardrwconc); } else { facts->flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; ins->info = MVM_op_get_op(MVM_OP_sp_guardrwtype); } } else { if (IS_CONCRETE(stable_value)) { facts->flags |= MVM_SPESH_FACT_DECONT_CONCRETE; ins->info = MVM_op_get_op(MVM_OP_sp_guardcontconc); } else { facts->flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; ins->info = MVM_op_get_op(MVM_OP_sp_guardconttype); } } ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = reg; ins->operands[1].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)STABLE(stable_cont)); ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)STABLE(stable_value)); } else { facts = &g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]; facts->type = STABLE(stable_value)->WHAT; facts->flags |= (MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_DECONTED); if (IS_CONCRETE(stable_value)) { facts->flags |= MVM_SPESH_FACT_CONCRETE; ins->info = MVM_op_get_op(MVM_OP_sp_guardconc); } else { facts->flags |= MVM_SPESH_FACT_TYPEOBJ; ins->info = MVM_op_get_op(MVM_OP_sp_guardtype); } ins->operands[1].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)STABLE(stable_value)); } /* Add entry in log guards table, and mark facts as depending on it. */ g->log_guards[g->num_log_guards].ins = ins; g->log_guards[g->num_log_guards].bb = bb; facts->flags |= MVM_SPESH_FACT_FROM_LOG_GUARD; facts->log_guard = g->num_log_guards; g->num_log_guards++; } /* Visits the blocks in dominator tree order, recursively. */ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMint32 cur_deopt_idx) { MVMint32 i, is_phi; /* Look for instructions that provide or propagate facts. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { /* See if there's a deopt annotation, and sync cur_deopt_idx. */ MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS || ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS) { cur_deopt_idx = ann->data.deopt_idx; break; } ann = ann->next; } /* Look through operands for reads and writes. */ is_phi = ins->info->opcode == MVM_SSA_PHI; for (i = 0; i < ins->info->num_operands; i++) { /* Reads need usage tracking; if the read is after a deopt point * relative to the write then give it an extra usage bump. */ if ((is_phi && i > 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg)) { MVMSpeshFacts *facts = &(g->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i]); facts->usages += facts->deopt_idx == cur_deopt_idx ? 1 : 2; } /* Writes need the current deopt index and the writing instruction * to be specified. */ if ((is_phi && i == 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg)) { MVMSpeshFacts *facts = &(g->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i]); facts->deopt_idx = cur_deopt_idx; facts->writer = ins; } } /* Look for ops that are fact-interesting. */ switch (ins->info->opcode) { case MVM_OP_inc_i: case MVM_OP_inc_u: case MVM_OP_dec_i: case MVM_OP_dec_u: /* These all read as well as write a value, so bump usages. */ g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i - 1].usages++; break; case MVM_OP_set: copy_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_create: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_box_s: case MVM_OP_box_i: case MVM_OP_box_n: { MVMSpeshFacts *target_facts = &(g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]); create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[2].reg.orig, ins->operands[2].reg.i); target_facts->flags |= MVM_SPESH_FACT_KNOWN_BOX_SRC; break; } case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[3].reg.orig, ins->operands[3].reg.i); break; case MVM_OP_neg_I: case MVM_OP_abs_I: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[2].reg.orig, ins->operands[2].reg.i); break; case MVM_OP_bootint: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTInt); break; case MVM_OP_bootnum: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTNum); break; case MVM_OP_bootstr: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTStr); break; case MVM_OP_bootarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTArray); break; case MVM_OP_bootintarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTIntArray); break; case MVM_OP_bootnumarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTNumArray); break; case MVM_OP_bootstrarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTStrArray); break; case MVM_OP_boothash: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTHash); break; case MVM_OP_hllboxtype_i: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->int_box_type); break; case MVM_OP_hllboxtype_n: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->num_box_type); break; case MVM_OP_hllboxtype_s: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->str_box_type); break; case MVM_OP_hlllist: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->slurpy_array_type); break; case MVM_OP_hllhash: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->slurpy_hash_type); break; case MVM_OP_decont: decont_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_wval: wval_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].lit_i16, ins->operands[2].lit_i16); break; case MVM_OP_wval_wide: wval_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].lit_i16, ins->operands[2].lit_i64); break; case MVM_OP_iter: iter_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_newexception: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTException); break; case MVM_OP_const_i64: case MVM_OP_const_i32: case MVM_OP_const_i16: case MVM_OP_const_i8: case MVM_OP_const_n64: case MVM_OP_const_n32: case MVM_OP_const_i64_32: case MVM_OP_const_i64_16: case MVM_OP_const_s: literal_facts(tc, g, ins); break; case MVM_OP_sp_log: { MVMuint16 po = ins->prev ? ins->prev->info->opcode : bb->pred[0]->last_ins->info->opcode; if (po != MVM_OP_getlexstatic_o && po != MVM_OP_getlexperinvtype_o) log_facts(tc, g, bb, ins); break; } default: if (ins->info->opcode == (MVMuint16)-1) discover_extop(tc, g, ins); } ins = ins->next; } /* Visit children. */ for (i = 0; i < bb->num_children; i++) add_bb_facts(tc, g, bb->children[i], cur_deopt_idx); } /* Exception handlers that use a block to store the handler must not have the * instructions that install the block eliminated. This tweaks the usage of * them. */ static void tweak_block_handler_usage(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMint32 i; for (i = 0; i < g->sf->body.num_handlers; i++) { if (g->sf->body.handlers[i].action == MVM_EX_ACTION_INVOKE) g->facts[g->sf->body.handlers[i].block_reg][1].usages++; } } /* Kicks off fact discovery from the top of the (dominator) tree. */ void MVM_spesh_facts_discover(MVMThreadContext *tc, MVMSpeshGraph *g) { allocate_log_guard_table(tc, g); add_bb_facts(tc, g, g->entry, -1); tweak_block_handler_usage(tc, g); } MoarVM-2015.11/src/spesh/facts.h0000644000175000017500000000455412623370227015246 0ustar jnthnjnthn/* Facts we might have about a local. */ struct MVMSpeshFacts { /* Flags indicating things we know. */ MVMint32 flags; /* The number of usages it has. */ MVMint32 usages; /* Known type, if any. */ MVMObject *type; /* Known type post-decontainerization, if any. */ MVMObject *decont_type; /* Known value, if any. */ union { MVMObject *o; MVMint64 i; MVMnum64 n; MVMString *s; } value; /* The instruction that writes the register (noting we're in SSA form, so * this is unique). */ MVMSpeshIns *writer; /* The deoptimization index in effect at the point of declaration, or -1 * if none yet. */ MVMint32 deopt_idx; /* The log guard the facts depend on, if any. */ MVMuint32 log_guard; }; /* Various fact flags. */ #define MVM_SPESH_FACT_KNOWN_TYPE 1 /* Has a known type. */ #define MVM_SPESH_FACT_KNOWN_VALUE 2 /* Has a known value. */ #define MVM_SPESH_FACT_DECONTED 4 /* Know it's decontainerized. */ #define MVM_SPESH_FACT_CONCRETE 8 /* Know it's a concrete object. */ #define MVM_SPESH_FACT_TYPEOBJ 16 /* Know it's a type object. */ #define MVM_SPESH_FACT_KNOWN_DECONT_TYPE 32 /* Has a known type after decont. */ #define MVM_SPESH_FACT_DECONT_CONCRETE 64 /* Is concrete after decont. */ #define MVM_SPESH_FACT_DECONT_TYPEOBJ 128 /* Is a type object after decont. */ #define MVM_SPESH_FACT_FROM_LOG_GUARD 256 /* Depends on a guard being met. */ #define MVM_SPESH_FACT_HASH_ITER 512 /* Is an iter over hashes. */ #define MVM_SPESH_FACT_ARRAY_ITER 1024 /* Is an iter over arrays (mutually exclusive with HASH_ITER, but neither of them is necessarily set) */ #define MVM_SPESH_FACT_KNOWN_BOX_SRC 2048 /* We know what register this value was boxed from */ #define MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD 4096 /* These facts were merged at a PHI node, but at least one of the incoming facts had a "from log guard" flag set, so we'll have to look for that fact and increment its uses if we use this here fact. */ #define MVM_SPESH_FACT_RW_CONT 8192 /* Known to be an rw container */ /* Discovers spesh facts and builds up information about them. */ void MVM_spesh_facts_discover(MVMThreadContext *tc, MVMSpeshGraph *g); MoarVM-2015.11/src/spesh/graph.c0000644000175000017500000013417512613656332015250 0ustar jnthnjnthn#include "moar.h" /* This is where the spesh stuff all begins. The logic in here takes bytecode * and builds a spesh graph from it. This is a CFG in SSA form. Transforming * to SSA involves computing dominance frontiers, done by the algorithm found * in http://www.cs.rice.edu/~keith/EMBED/dom.pdf. The SSA algorithm itself is * from http://www.cs.utexas.edu/~pingali/CS380C/2010/papers/ssaCytron.pdf. */ #define GET_I8(pc, idx) *((MVMint8 *)((pc) + (idx))) #define GET_UI8(pc, idx) *((MVMuint8 *)((pc) + (idx))) #define GET_I16(pc, idx) *((MVMint16 *)((pc) + (idx))) #define GET_UI16(pc, idx) *((MVMuint16 *)((pc) + (idx))) #define GET_I32(pc, idx) *((MVMint32 *)((pc) + (idx))) #define GET_UI32(pc, idx) *((MVMuint32 *)((pc) + (idx))) #define GET_N32(pc, idx) *((MVMnum32 *)((pc) + (idx))) /* Allocate a piece of memory from the spesh graph's buffer. Deallocated when * the spesh graph is. */ void * MVM_spesh_alloc(MVMThreadContext *tc, MVMSpeshGraph *g, size_t bytes) { char *result = NULL; #if !defined(MVM_CAN_UNALIGNED_INT64) || !defined(MVM_CAN_UNALIGNED_NUM64) /* Round up size to next multiple of 8, to ensure alignment. */ bytes = (bytes + 7) & ~7; #endif if (g->mem_block) { MVMSpeshMemBlock *block = g->mem_block; if (block->alloc + bytes < block->limit) { result = block->alloc; block->alloc += bytes; } } if (!result) { /* No block, or block was full. Add another. */ MVMSpeshMemBlock *block = MVM_malloc(sizeof(MVMSpeshMemBlock)); size_t buffer_size = g->mem_block ? MVM_SPESH_MEMBLOCK_SIZE : MVM_SPESH_FIRST_MEMBLOCK_SIZE; if (buffer_size < bytes) buffer_size = bytes; block->buffer = MVM_calloc(buffer_size, 1); block->alloc = block->buffer; block->limit = block->buffer + buffer_size; block->prev = g->mem_block; g->mem_block = block; /* Now allocate out of it. */ result = block->alloc; block->alloc += bytes; } return result; } /* Looks up op info; doesn't sanity check, since we should be working on code * that already pass validation. */ static const MVMOpInfo * get_op_info(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint16 opcode) { if (opcode < MVM_OP_EXT_BASE) { return MVM_op_get_op(opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record = &cu->body.extops[index]; return MVM_ext_resolve_extop_record(tc, record); } } /* Records a de-optimization annotation and mapping pair. */ static void add_deopt_annotation(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins_node, MVMuint8 *pc, MVMint32 type) { /* Add an the annotations. */ MVMSpeshAnn *ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); ann->type = type; ann->data.deopt_idx = g->num_deopt_addrs; ann->next = ins_node->annotations; ins_node->annotations = ann; /* Record PC in the deopt entries table. */ if (g->num_deopt_addrs == g->alloc_deopt_addrs) { g->alloc_deopt_addrs += 4; if (g->deopt_addrs) g->deopt_addrs = MVM_realloc(g->deopt_addrs, g->alloc_deopt_addrs * sizeof(MVMint32) * 2); else g->deopt_addrs = MVM_malloc(g->alloc_deopt_addrs * sizeof(MVMint32) * 2); } g->deopt_addrs[2 * g->num_deopt_addrs] = pc - g->bytecode; g->num_deopt_addrs++; } /* Finds the linearly previous basic block (not cheap, but uncommon). */ MVMSpeshBB * MVM_spesh_graph_linear_prev(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *search) { MVMSpeshBB *bb = g->entry; while (bb) { if (bb->linear_next == search) return bb; bb = bb->linear_next; } return NULL; } /* Builds the control flow graph, populating the passed spesh graph structure * with it. This also makes nodes for all of the instruction. */ #define MVM_CFG_BB_START 1 #define MVM_CFG_BB_END 2 static void build_cfg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMStaticFrame *sf, MVMint32 *existing_deopts, MVMint32 num_existing_deopts) { MVMSpeshBB *cur_bb, *prev_bb; MVMSpeshIns *last_ins; MVMint64 i; MVMint32 bb_idx; /* Temporary array of all MVMSpeshIns we create (one per instruction). * Overestimate at size. Has the flat view, matching the bytecode. */ MVMSpeshIns **ins_flat = MVM_calloc(g->bytecode_size / 2, sizeof(MVMSpeshIns *)); /* Temporary array where each byte in the input bytecode gets a 32-bit * integer. This is used for two things: * A) When we make the MVMSpeshIns for an instruction starting at the * byte, we put the instruction index (into ins_flat) in the slot, * shifting it by 2 bits to the left. We will use this to do fixups. * B) The first bit is "I have an incoming branch" - that is, start of * a basic block. The second bit is "I can branch" - that is, end of * a basic block. It's possible to have both bits set. * Anything that's just a zero has no instruction starting there. */ MVMuint32 *byte_to_ins_flags = MVM_calloc(g->bytecode_size, sizeof(MVMuint32)); /* Instruction to basic block mapping. Initialized later. */ MVMSpeshBB **ins_to_bb = NULL; /* Make first pass through the bytecode. In this pass, we make MVMSpeshIns * nodes for each instruction and set the start/end of block bits. Also * set handler targets as basic block starters. */ MVMCompUnit *cu = sf->body.cu; MVMuint8 *pc = g->bytecode; MVMuint8 *end = g->bytecode + g->bytecode_size; MVMuint32 ins_idx = 0; MVMuint8 next_bbs = 1; /* Next iteration (here, first) starts a BB. */ for (i = 0; i < g->num_handlers; i++) byte_to_ins_flags[g->handlers[i].goto_offset] |= MVM_CFG_BB_START; while (pc < end) { /* Look up op info. */ MVMuint16 opcode = *(MVMuint16 *)pc; MVMuint8 *args = pc + 2; MVMuint8 arg_size = 0; const MVMOpInfo *info = get_op_info(tc, cu, opcode); /* Create an instruction node, add it, and record its position. */ MVMSpeshIns *ins_node = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ins_flat[ins_idx] = ins_node; byte_to_ins_flags[pc - g->bytecode] |= ins_idx << 2; /* Did previous instruction end a basic block? */ if (next_bbs) { byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_START; next_bbs = 0; } /* Also check we're not already a BB start due to being a branch * target, in which case we should ensure our prior is marked as * a BB end. */ else { if (byte_to_ins_flags[pc - g->bytecode] & MVM_CFG_BB_START) { MVMuint32 hunt = pc - g->bytecode; while (!byte_to_ins_flags[--hunt]); byte_to_ins_flags[hunt] |= MVM_CFG_BB_END; } } /* Store opcode */ ins_node->info = info; /* Go over operands. */ ins_node->operands = MVM_spesh_alloc(tc, g, info->num_operands * sizeof(MVMSpeshOperand)); for (i = 0; i < info->num_operands; i++) { MVMuint8 flags = info->operands[i]; MVMuint8 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_read_reg: case MVM_operand_write_reg: ins_node->operands[i].reg.orig = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_read_lex: case MVM_operand_write_lex: ins_node->operands[i].lex.idx = GET_UI16(args, arg_size); ins_node->operands[i].lex.outers = GET_UI16(args, arg_size + 2); arg_size += 4; break; case MVM_operand_literal: { MVMuint32 type = flags & MVM_operand_type_mask; switch (type) { case MVM_operand_int8: ins_node->operands[i].lit_i8 = GET_I8(args, arg_size); arg_size += 1; break; case MVM_operand_int16: ins_node->operands[i].lit_i16 = GET_I16(args, arg_size); arg_size += 2; break; case MVM_operand_int32: ins_node->operands[i].lit_i32 = GET_I32(args, arg_size); arg_size += 4; break; case MVM_operand_int64: ins_node->operands[i].lit_i64 = MVM_BC_get_I64(args, arg_size); arg_size += 8; break; case MVM_operand_num32: ins_node->operands[i].lit_n32 = GET_N32(args, arg_size); arg_size += 4; break; case MVM_operand_num64: ins_node->operands[i].lit_n64 = MVM_BC_get_N64(args, arg_size); arg_size += 8; break; case MVM_operand_callsite: ins_node->operands[i].callsite_idx = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_coderef: ins_node->operands[i].coderef_idx = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_str: ins_node->operands[i].lit_str_idx = GET_UI32(args, arg_size); arg_size += 4; break; case MVM_operand_ins: { /* Stash instruction offset. */ MVMuint32 target = GET_UI32(args, arg_size); ins_node->operands[i].ins_offset = target; /* This is a branching instruction, so it's a BB end. */ byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; /* Its target is a BB start, and any previous instruction * we already passed needs marking as a BB end. */ byte_to_ins_flags[target] |= MVM_CFG_BB_START; if (target > 0 && target < pc - g->bytecode) { while (!byte_to_ins_flags[--target]); byte_to_ins_flags[target] |= MVM_CFG_BB_END; } /* Next instruction is also a BB start. */ next_bbs = 1; arg_size += 4; break; } case MVM_operand_spesh_slot: ins_node->operands[i].lit_i16 = GET_I16(args, arg_size); arg_size += 2; break; default: MVM_oops(tc, "Spesh: unknown operand type %d in graph building (op %s)", (int)type, ins_node->info->name); } break; default: break; } } } /* We specially handle the jumplist case, which needs to mark all of * the possible places we could jump to in the following instructions * as starts of basic blocks. It is, in itself, the end of one. Note * we jump to the instruction after the n jump points if none match, * so that is marked too. */ if (opcode == MVM_OP_jumplist) { MVMint64 n = MVM_BC_get_I64(args, 0); for (i = 0; i <= n; i++) byte_to_ins_flags[(pc - g->bytecode) + 12 + i * 6] |= MVM_CFG_BB_START; byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; } /* Invocations, returns, and throws are basic block ends. */ switch (opcode) { case MVM_OP_invoke_v: case MVM_OP_invoke_i: case MVM_OP_invoke_n: case MVM_OP_invoke_s: case MVM_OP_invoke_o: case MVM_OP_return_i: case MVM_OP_return_n: case MVM_OP_return_s: case MVM_OP_return_o: case MVM_OP_return: case MVM_OP_throwdyn: case MVM_OP_throwlex: case MVM_OP_throwlexotic: case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: case MVM_OP_die: case MVM_OP_rethrow: case MVM_OP_resume: byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; next_bbs = 1; break; default: break; } /* Final instruction is basic block end. */ if (pc + 2 + arg_size == end) byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; /* Caculate next instruction's PC. */ pc += 2 + arg_size; /* If this is a deopt point opcode... */ if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_ONE)) add_deopt_annotation(tc, g, ins_node, pc, MVM_SPESH_ANN_DEOPT_ONE_INS); if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_ALL)) add_deopt_annotation(tc, g, ins_node, pc, MVM_SPESH_ANN_DEOPT_ALL_INS); if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_OSR)) add_deopt_annotation(tc, g, ins_node, pc, MVM_SPESH_ANN_DEOPT_OSR); /* Go to next instruction. */ ins_idx++; } /* Annotate instructions that are handler-significant. */ for (i = 0; i < g->num_handlers; i++) { MVMSpeshIns *start_ins = ins_flat[byte_to_ins_flags[g->handlers[i].start_offset] >> 2]; MVMSpeshIns *end_ins = ins_flat[byte_to_ins_flags[g->handlers[i].end_offset] >> 2]; MVMSpeshIns *goto_ins = ins_flat[byte_to_ins_flags[g->handlers[i].goto_offset] >> 2]; MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshAnn *goto_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); start_ann->next = start_ins->annotations; start_ann->type = MVM_SPESH_ANN_FH_START; start_ann->data.frame_handler_index = i; start_ins->annotations = start_ann; end_ann->next = end_ins->annotations; end_ann->type = MVM_SPESH_ANN_FH_END; end_ann->data.frame_handler_index = i; end_ins->annotations = end_ann; goto_ann->next = goto_ins->annotations; goto_ann->type = MVM_SPESH_ANN_FH_GOTO; goto_ann->data.frame_handler_index = i; goto_ins->annotations = goto_ann; } /* Annotate instructions that are inline start/end points. */ for (i = 0; i < g->num_inlines; i++) { MVMSpeshIns *start_ins = ins_flat[byte_to_ins_flags[g->inlines[i].start] >> 2]; MVMSpeshIns *end_ins = ins_flat[byte_to_ins_flags[g->inlines[i].end] >> 2]; MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); start_ann->next = start_ins->annotations; start_ann->type = MVM_SPESH_ANN_INLINE_START; start_ann->data.inline_idx = i; start_ins->annotations = start_ann; end_ann->next = end_ins->annotations; end_ann->type = MVM_SPESH_ANN_INLINE_END; end_ann->data.inline_idx = i; end_ins->annotations = end_ann; } /* Now for the second pass, where we assemble the basic blocks. Also we * build a lookup table of instructions that start a basic block to that * basic block, for the final CFG construction. We make the entry block a * special one, containing a noop; it will have any exception handler * targets linked from it, so they show up in the graph. */ g->entry = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB)); g->entry->first_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); g->entry->first_ins->info = get_op_info(tc, cu, 0); g->entry->last_ins = g->entry->first_ins; g->entry->idx = 0; cur_bb = NULL; prev_bb = g->entry; last_ins = NULL; ins_to_bb = MVM_calloc(ins_idx, sizeof(MVMSpeshBB *)); ins_idx = 0; bb_idx = 1; for (i = 0; i < g->bytecode_size; i++) { MVMSpeshIns *cur_ins; /* Skip zeros; no instruction here. */ if (!byte_to_ins_flags[i]) continue; /* Get current instruction. */ cur_ins = ins_flat[byte_to_ins_flags[i] >> 2]; /* Start of a basic block? */ if (byte_to_ins_flags[i] & MVM_CFG_BB_START) { /* Should not already be in a basic block. */ if (cur_bb) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: confused during basic block analysis (in block)"); } /* Create it, and set first instruction and index. */ cur_bb = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB)); cur_bb->first_ins = cur_ins; cur_bb->idx = bb_idx; cur_bb->initial_pc = i; bb_idx++; /* Record instruction -> BB start mapping. */ ins_to_bb[ins_idx] = cur_bb; /* Link it to the previous one. */ prev_bb->linear_next = cur_bb; } /* Should always be in a BB at this point. */ if (!cur_bb) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: confused during basic block analysis (no block)"); } /* Add instruction into double-linked per-block instruction list. */ if (last_ins) { last_ins->next = cur_ins; cur_ins->prev = last_ins; } last_ins = cur_ins; /* End of a basic block? */ if (byte_to_ins_flags[i] & MVM_CFG_BB_END) { cur_bb->last_ins = cur_ins; prev_bb = cur_bb; cur_bb = NULL; last_ins = NULL; } ins_idx++; } g->num_bbs = bb_idx; /* Finally, link the basic blocks up to form a CFG. Along the way, any of * the instruction operands get the target BB stored. */ cur_bb = g->entry; while (cur_bb) { /* If it's the first block, it's a special case; successors are the * real successor and all exception handlers. */ if (cur_bb == g->entry) { cur_bb->num_succ = 1 + g->num_handlers; cur_bb->succ = MVM_spesh_alloc(tc, g, cur_bb->num_succ * sizeof(MVMSpeshBB *)); cur_bb->succ[0] = cur_bb->linear_next; for (i = 0; i < g->num_handlers; i++) { MVMuint32 offset = g->handlers[i].goto_offset; cur_bb->succ[i + 1] = ins_to_bb[byte_to_ins_flags[offset] >> 2]; } } /* Otherwise, consider the last instruction, to see how we leave the BB. */ else { switch (cur_bb->last_ins->info->opcode) { case MVM_OP_jumplist: { /* Jumplist, so successors are next N+1 basic blocks. */ MVMint64 num_bbs = cur_bb->last_ins->operands[0].lit_i64 + 1; MVMSpeshBB *bb_to_add = cur_bb->linear_next; cur_bb->succ = MVM_spesh_alloc(tc, g, num_bbs * sizeof(MVMSpeshBB *)); for (i = 0; i < num_bbs; i++) { cur_bb->succ[i] = bb_to_add; bb_to_add = bb_to_add->linear_next; } cur_bb->num_succ = num_bbs; } break; case MVM_OP_goto: { /* Unconditional branch, so one successor. */ MVMuint32 offset = cur_bb->last_ins->operands[0].ins_offset; MVMSpeshBB *tgt = ins_to_bb[byte_to_ins_flags[offset] >> 2]; cur_bb->succ = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); cur_bb->succ[0] = tgt; cur_bb->num_succ = 1; cur_bb->last_ins->operands[0].ins_bb = tgt; } break; default: { /* Probably conditional branch, so two successors: one from * the instruction, another from fall-through. Or may just be * a non-branch that exits for other reasons. */ cur_bb->succ = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshBB *)); for (i = 0; i < cur_bb->last_ins->info->num_operands; i++) { if (cur_bb->last_ins->info->operands[i] == MVM_operand_ins) { MVMuint32 offset = cur_bb->last_ins->operands[i].ins_offset; cur_bb->succ[0] = ins_to_bb[byte_to_ins_flags[offset] >> 2]; cur_bb->num_succ++; cur_bb->last_ins->operands[i].ins_bb = cur_bb->succ[0]; } } if (cur_bb->num_succ > 1) { /* If we ever get instructions with multiple targets, this * area of the code needs an update. */ MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: unhandled multi-target branch"); } if (cur_bb->linear_next) { cur_bb->succ[cur_bb->num_succ] = cur_bb->linear_next; cur_bb->num_succ++; } } break; } } /* Move on to next block. */ cur_bb = cur_bb->linear_next; } /* If we're building the graph for optimized bytecode, insert existing * deopt points. */ if (existing_deopts) { for (i = 0; i < num_existing_deopts; i ++) { if (existing_deopts[2 * i + 1] >= 0) { MVMSpeshIns *post_ins = ins_flat[byte_to_ins_flags[existing_deopts[2 * i + 1]] >> 2]; MVMSpeshIns *deopt_ins = post_ins->prev ? post_ins->prev : MVM_spesh_graph_linear_prev(tc, g, ins_to_bb[byte_to_ins_flags[existing_deopts[2 * i + 1]] >> 2])->last_ins; MVMSpeshAnn *deopt_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); deopt_ann->next = deopt_ins->annotations; deopt_ann->type = MVM_SPESH_ANN_DEOPT_INLINE; deopt_ann->data.deopt_idx = i; deopt_ins->annotations = deopt_ann; } } } /* Clear up the temporary arrays. */ MVM_free(byte_to_ins_flags); MVM_free(ins_flat); MVM_free(ins_to_bb); } /* Eliminates any unreachable basic blocks (that is, dead code). Not having * to consider them any further simplifies all that follows. */ static void eliminate_dead(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Iterate to fixed point. */ MVMint8 *seen = MVM_malloc(g->num_bbs); MVMint32 orig_bbs = g->num_bbs; MVMint8 death = 1; while (death) { /* First pass: mark every basic block that is the entry point or the * successor of some other block. */ MVMSpeshBB *cur_bb = g->entry; memset(seen, 0, g->num_bbs); seen[0] = 1; while (cur_bb) { MVMuint16 i; for (i = 0; i < cur_bb->num_succ; i++) seen[cur_bb->succ[i]->idx] = 1; cur_bb = cur_bb->linear_next; } /* Second pass: eliminate dead BBs from consideration. */ death = 0; cur_bb = g->entry; while (cur_bb->linear_next) { if (!seen[cur_bb->linear_next->idx]) { cur_bb->linear_next = cur_bb->linear_next->linear_next; g->num_bbs--; death = 1; } cur_bb = cur_bb->linear_next; } } MVM_free(seen); /* If we removed some, need to re-number so they're consecutive, for the * post-order and dominance calcs to be happy. */ if (g->num_bbs != orig_bbs) { MVMint32 new_idx = 0; MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { cur_bb->idx = new_idx; new_idx++; cur_bb = cur_bb->linear_next; } } } /* Annotates the control flow graph with predecessors. */ static void add_predecessors(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { MVMuint16 i; for (i = 0; i < cur_bb->num_succ; i++) { MVMSpeshBB *tgt = cur_bb->succ[i]; MVMSpeshBB **new_pred = MVM_spesh_alloc(tc, g, (tgt->num_pred + 1) * sizeof(MVMSpeshBB *)); memcpy(new_pred, tgt->pred, tgt->num_pred * sizeof(MVMSpeshBB *)); new_pred[tgt->num_pred] = cur_bb; tgt->pred = new_pred; tgt->num_pred++; } cur_bb = cur_bb->linear_next; } } /* Produces an array of the basic blocks, sorted in reverse postorder from * the entry point. */ static void dfs(MVMSpeshBB **rpo, MVMint32 *insert_pos, MVMuint8 *seen, MVMSpeshBB *bb) { MVMint32 i; seen[bb->idx] = 1; for (i = 0; i < bb->num_succ; i++) { MVMSpeshBB *succ = bb->succ[i]; if (!seen[succ->idx]) dfs(rpo, insert_pos, seen, succ); } rpo[*insert_pos] = bb; bb->rpo_idx = *insert_pos; (*insert_pos)--; } static MVMSpeshBB ** reverse_postorder(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB **rpo = MVM_calloc(g->num_bbs, sizeof(MVMSpeshBB *)); MVMuint8 *seen = MVM_calloc(g->num_bbs, 1); MVMint32 ins = g->num_bbs - 1; dfs(rpo, &ins, seen, g->entry); MVM_free(seen); if (ins != -1) { char *dump_msg = MVM_spesh_dump(tc, g); printf("%s", dump_msg); MVM_free(dump_msg); MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: reverse postorder calculation failed"); } return rpo; } /* 2-finger intersection algorithm, to find new immediate dominator. */ static void iter_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms, MVMint32 iters) { if (iters > 100000) { #ifdef NDEBUG MVMint32 k; char *dump_msg = MVM_spesh_dump(tc, g); printf("%s", dump_msg); MVM_free(dump_msg); printf("RPO: "); for (k = 0; k < g->num_bbs; k++) printf("%d, ", rpo[k]->idx); printf("\n"); printf("Doms: "); for (k = 0; k < g->num_bbs; k++) printf("%d (%d), ", doms[k], doms[k] >= 0 ? rpo[doms[k]]->idx : -1); printf("\n"); #endif MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: dominator intersection went infinite"); } } static MVMint32 intersect(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms, MVMint32 finger1, MVMint32 finger2) { MVMint32 iters = 0; while (finger1 != finger2) { while (finger1 > finger2) { iter_check(tc, g, rpo, doms, iters++); finger1 = doms[finger1]; } while (finger2 > finger1) { iter_check(tc, g, rpo, doms, iters++); finger2 = doms[finger2]; } } return finger1; } /* Computes dominator information about the basic blocks. */ static MVMint32 * compute_dominators(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo) { MVMint32 i, j, changed; /* Create result list, with all initialized to undefined (use -1, as it's * not a valid basic block index). Start node dominates itself. */ MVMint32 *doms = MVM_malloc(g->num_bbs * sizeof(MVMint32)); doms[0] = 0; for (i = 1; i < g->num_bbs; i++) doms[i] = -1; /* Iterate to fixed point. */ changed = 1; while (changed) { changed = 0; /* Visit all except the start node in reverse postorder. */ for (i = 1; i < g->num_bbs; i++) { MVMSpeshBB *b = rpo[i]; /* See if there's a better dominator. */ MVMint32 chosen_pred = -1; MVMint32 new_idom; for (j = 0; j < b->num_pred; j++) { new_idom = b->pred[j]->rpo_idx; if (doms[new_idom] != -1) { chosen_pred = j; break; } } if (chosen_pred == -1) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: could not find processed initial dominator"); } for (j = 0; j < b->num_pred; j++) { if (j != chosen_pred) { MVMint32 p_idx = b->pred[j]->rpo_idx; if (doms[p_idx] != -1) new_idom = intersect(tc, g, rpo, doms, p_idx, new_idom); } } if (doms[i] != new_idom) { doms[i] = new_idom; changed = 1; } } } return doms; } /* Builds the dominance tree children lists for each node. */ static void add_child(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *target, MVMSpeshBB *to_add) { MVMSpeshBB **new_children; MVMint32 i; /* Already in the child list? */ for (i = 0; i < target->num_children; i++) if (target->children[i] == to_add) return; /* Nope, so insert. */ new_children = MVM_spesh_alloc(tc, g, (target->num_children + 1) * sizeof(MVMSpeshBB *)); memcpy(new_children, target->children, target->num_children * sizeof(MVMSpeshBB *)); new_children[target->num_children] = to_add; target->children = new_children; target->num_children++; } static void add_children(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms) { MVMint32 i; for (i = 0; i < g->num_bbs; i++) { MVMSpeshBB *bb = rpo[i]; MVMint32 idom = doms[i]; if (idom != i) add_child(tc, g, rpo[idom], bb); } } /* Builds the dominance frontier set for each node. */ static void add_to_frontier_set(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *target, MVMSpeshBB *to_add) { MVMSpeshBB **new_df; MVMint32 i; /* Already in the set? */ for (i = 0; i < target->num_df; i++) if (target->df[i] == to_add) return; /* Nope, so insert. */ new_df = MVM_spesh_alloc(tc, g, (target->num_df + 1) * sizeof(MVMSpeshBB *)); memcpy(new_df, target->df, target->num_df * sizeof(MVMSpeshBB *)); new_df[target->num_df] = to_add; target->df = new_df; target->num_df++; } static void add_dominance_frontiers(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms) { MVMint32 j; MVMSpeshBB *b = g->entry; while (b) { if (b->num_pred >= 2) { /* Thus it's a join point */ for (j = 0; j < b->num_pred; j++) { MVMint32 runner = b->pred[j]->rpo_idx; MVMint32 finish_line = doms[b->rpo_idx]; while (runner != finish_line) { add_to_frontier_set(tc, g, rpo[runner], b); runner = doms[runner]; } } } b = b->linear_next; } } /* Per-local SSA info. */ typedef struct { /* Nodes that assign to the variable. */ MVMSpeshBB **ass_nodes; MVMuint16 num_ass_nodes; /* Count of processed assignments aka. C(V). */ MVMint32 count; /* Stack of integers aka. S(V). */ MVMint32 *stack; MVMint32 stack_top; MVMint32 stack_alloc; } SSAVarInfo; /* Creates an SSAVarInfo for each local, initializing it with a list of nodes * that assign to the local. */ static SSAVarInfo * initialize_ssa_var_info(MVMThreadContext *tc, MVMSpeshGraph *g) { SSAVarInfo *var_info = MVM_calloc(sizeof(SSAVarInfo), g->num_locals); MVMint32 i; /* Visit all instructions, looking for local writes. */ MVMSpeshBB *bb = g->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { for (i = 0; i < ins->info->num_operands; i++) { if ((ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 written = ins->operands[i].reg.orig; MVMint32 found = 0; MVMint32 j; for (j = 0; j < var_info[written].num_ass_nodes; j++) if (var_info[written].ass_nodes[j] == bb) { found = 1; break; } if (!found) { if (var_info[written].num_ass_nodes % 8 == 0) { MVMint32 new_size = var_info[written].num_ass_nodes + 8; var_info[written].ass_nodes = MVM_realloc( var_info[written].ass_nodes, new_size * sizeof(MVMSpeshBB *)); } var_info[written].ass_nodes[var_info[written].num_ass_nodes] = bb; var_info[written].num_ass_nodes++; } } } ins = ins->next; } bb = bb->linear_next; } /* Set stack top to -1 sentinel for all nodes, and count = 1 (as we may * read the default value of a register). */ for (i = 0; i < g->num_locals; i++) { var_info[i].count = 1; var_info[i].stack_top = -1; } return var_info; } MVMOpInfo *get_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint32 nrargs) { MVMOpInfo *result = NULL; /* Check number of args to phi isn't huge. */ if (nrargs > 0xFFFF) MVM_panic(1, "Spesh: SSA calculation failed; cannot allocate enormous PHI node"); /* Up to 64 args, almost every number is represented, but after that * we have a sparse array through which we must search */ if (nrargs - 2 < MVMPhiNodeCacheSparseBegin) { result = &g->phi_infos[nrargs - 2]; } else { MVMint32 cache_idx; for (cache_idx = MVMPhiNodeCacheSparseBegin; !result && cache_idx < MVMPhiNodeCacheSize; cache_idx++) { if (g->phi_infos[cache_idx].opcode == MVM_SSA_PHI) { if (g->phi_infos[cache_idx].num_operands == nrargs) { result = &g->phi_infos[cache_idx]; } } else { result = &g->phi_infos[cache_idx]; } } } if (result == NULL) { result = MVM_spesh_alloc(tc, g, sizeof(MVMOpInfo)); result->opcode = 0; } if (result->opcode != MVM_SSA_PHI) { result->opcode = MVM_SSA_PHI; result->name = "PHI"; result->num_operands = nrargs; } return result; } /* Inserts SSA phi functions at the required places in the graph. */ static void place_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMint32 n, MVMuint16 var) { MVMint32 i; MVMOpInfo *phi_op = get_phi(tc, g, n + 1); MVMSpeshIns *ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ins->info = phi_op; ins->operands = MVM_spesh_alloc(tc, g, phi_op->num_operands * sizeof(MVMSpeshOperand)); for (i = 0; i < phi_op->num_operands; i++) ins->operands[i].reg.orig = var; ins->next = bb->first_ins; bb->first_ins->prev = ins; bb->first_ins = ins; } static void insert_phi_functions(MVMThreadContext *tc, MVMSpeshGraph *g, SSAVarInfo *var_info) { MVMint32 *has_already = MVM_calloc(g->num_bbs, sizeof(MVMint32)); MVMint32 *work = MVM_calloc(g->num_bbs, sizeof(MVMint32)); MVMSpeshBB **worklist = MVM_calloc(g->num_bbs, sizeof(MVMSpeshBB *)); MVMint32 worklist_top = 0; MVMint32 iter_count = 0; /* Go over all locals. */ MVMint32 var, i, j, found; for (var = 0; var < g->num_locals; var++) { /* Move to next iteration. */ iter_count++; /* Add blocks assigning to this variable to the worklist. */ for (i = 0; i < var_info[var].num_ass_nodes; i++) { MVMSpeshBB *bb = var_info[var].ass_nodes[i]; work[bb->idx] = iter_count; worklist[worklist_top++] = bb; /* Algo unions, but ass_nodes unique */ } /* Process the worklist. */ while (worklist_top) { MVMSpeshBB *x = worklist[--worklist_top]; for (i = 0; i < x->num_df; i++) { MVMSpeshBB *y = x->df[i]; if (has_already[y->idx] < iter_count) { /* Place phi function, and mark we have. */ place_phi(tc, g, y, y->num_pred, var); has_already[y->idx] = iter_count; /* Add this block to worklist if needed. */ if (work[y->idx] < iter_count) { work[y->idx] = iter_count; found = 0; for (j = 0; j < worklist_top; j++) if (worklist[j] == y) { found = 1; break; } if (!found) worklist[worklist_top++] = y; } } } } } MVM_free(has_already); MVM_free(work); MVM_free(worklist); } /* Renames the local variables such that we end up with SSA form. */ static MVMint32 which_pred(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *y, MVMSpeshBB *x) { MVMint32 i; for (i = 0; i < y->num_pred; i++) if (y->pred[i] == x) return i; MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: which_pred failed to find x"); } static void rename_locals(MVMThreadContext *tc, MVMSpeshGraph *g, SSAVarInfo *var_info, MVMSpeshBB *x) { MVMint32 i; /* Visit instructions and do renames in normal (non-phi) instructions. */ MVMSpeshIns *a = x->first_ins; while (a) { /* Rename reads, provided it's not a PHI. */ MVMint32 is_phi = a->info->opcode == MVM_SSA_PHI; if (!is_phi) { for (i = 0; i < a->info->num_operands; i++) { if ((a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg) { MVMuint16 orig = a->operands[i].reg.orig; MVMint32 st = var_info[orig].stack_top; if (st >= 0) a->operands[i].reg.i = var_info[orig].stack[st]; else a->operands[i].reg.i = 0; } } } /* Rename writes. */ for (i = 0; i < a->info->num_operands; i++) { if (is_phi || (a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 orig = a->operands[i].reg.orig; MVMint32 reg_i = var_info[orig].count; a->operands[i].reg.i = reg_i; if (var_info[orig].stack_top + 1 >= var_info[orig].stack_alloc) { if (var_info[orig].stack_alloc) var_info[orig].stack_alloc *= 2; else var_info[orig].stack_alloc = 8; var_info[orig].stack = MVM_realloc(var_info[orig].stack, var_info[orig].stack_alloc * sizeof(MVMint32)); } var_info[orig].stack[++var_info[orig].stack_top] = reg_i; var_info[orig].count++; } if (is_phi) break; } a = a->next; } /* Visit successors and update their phi functions. */ for (i = 0; i < x->num_succ; i++) { MVMSpeshBB *y = x->succ[i]; MVMint32 j = which_pred(tc, g, y, x); MVMSpeshIns *p = y->first_ins; while (p && p->info->opcode == MVM_SSA_PHI) { MVMuint16 orig = p->operands[j + 1].reg.orig; MVMint32 st = var_info[orig].stack_top; if (st >= 0) p->operands[j + 1].reg.i = var_info[orig].stack[st]; else p->operands[j + 1].reg.i = 0; p = p->next; } } /* Rename for all the children in the dominator tree. */ for (i = 0; i < x->num_children; i++) rename_locals(tc, g, var_info, x->children[i]); /* Go over assignments and pop new variable names. */ a = x->first_ins; while (a) { MVMint32 is_phi = a->info->opcode == MVM_SSA_PHI; for (i = 0; i < a->info->num_operands; i++) { if (is_phi || (a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 orig = a->operands[i].reg.orig; var_info[orig].stack_top--; } if (is_phi) break; } a = a->next; } } /* Transforms a spesh graph into SSA form. After this, the graph will have all * register accesses given an SSA "version", and phi instructions inserted as * needed. */ static void ssa(MVMThreadContext *tc, MVMSpeshGraph *g) { SSAVarInfo *var_info; MVMint32 i, num_locals; /* Compute dominance frontiers. */ MVMSpeshBB **rpo = reverse_postorder(tc, g); MVMint32 *doms = compute_dominators(tc, g, rpo); add_children(tc, g, rpo, doms); add_dominance_frontiers(tc, g, rpo, doms); MVM_free(rpo); MVM_free(doms); /* Initialize per-local data for SSA analysis. */ var_info = initialize_ssa_var_info(tc, g); /* Compute SSA itself. */ insert_phi_functions(tc, g, var_info); rename_locals(tc, g, var_info, g->entry); /* Allocate space for spesh facts for each local; clean up stacks while * we're at it. */ num_locals = g->num_locals; g->facts = MVM_spesh_alloc(tc, g, num_locals * sizeof(MVMSpeshFacts *)); g->fact_counts = MVM_spesh_alloc(tc, g, num_locals * sizeof(MVMuint16)); for (i = 0; i < num_locals; i++) { g->fact_counts[i] = var_info[i].count; g->facts[i] = MVM_spesh_alloc(tc, g, var_info[i].count * sizeof(MVMSpeshFacts)); if (var_info[i].stack_alloc) { MVM_free(var_info[i].stack); MVM_free(var_info[i].ass_nodes); } } MVM_free(var_info); } /* Takes a static frame and creates a spesh graph for it. */ MVMSpeshGraph * MVM_spesh_graph_create(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint32 cfg_only) { /* Create top-level graph object. */ MVMSpeshGraph *g = MVM_calloc(1, sizeof(MVMSpeshGraph)); g->sf = sf; g->bytecode = sf->body.bytecode; g->bytecode_size = sf->body.bytecode_size; g->handlers = sf->body.handlers; g->num_handlers = sf->body.num_handlers; g->num_locals = sf->body.num_locals; g->num_lexicals = sf->body.num_lexicals; g->phi_infos = MVM_spesh_alloc(tc, g, MVMPhiNodeCacheSize * sizeof(MVMOpInfo)); /* Ensure the frame is validated, since we'll rely on this. */ if (sf->body.instrumentation_level == 0) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: cannot build CFG from unvalidated frame"); } /* Build the CFG out of the static frame, and transform it to SSA. */ build_cfg(tc, g, sf, NULL, 0); if (!cfg_only) { eliminate_dead(tc, g); add_predecessors(tc, g); ssa(tc, g); } /* Hand back the completed graph. */ return g; } /* Takes a static frame and creates a spesh graph for it. */ MVMSpeshGraph * MVM_spesh_graph_create_from_cand(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *cand, MVMuint32 cfg_only) { /* Create top-level graph object. */ MVMSpeshGraph *g = MVM_calloc(1, sizeof(MVMSpeshGraph)); g->sf = sf; g->bytecode = cand->bytecode; g->bytecode_size = cand->bytecode_size; g->handlers = cand->handlers; g->num_handlers = sf->body.num_handlers; g->num_locals = cand->num_locals; g->num_lexicals = cand->num_lexicals; g->inlines = cand->inlines; g->num_inlines = cand->num_inlines; g->deopt_addrs = cand->deopts; g->num_deopt_addrs = cand->num_deopts; g->alloc_deopt_addrs = cand->num_deopts; g->local_types = cand->local_types; g->lexical_types = cand->lexical_types; g->spesh_slots = cand->spesh_slots; g->num_spesh_slots = cand->num_spesh_slots; g->phi_infos = MVM_spesh_alloc(tc, g, MVMPhiNodeCacheSize * sizeof(MVMOpInfo)); /* Ensure the frame is validated, since we'll rely on this. */ if (sf->body.instrumentation_level == 0) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: cannot build CFG from unvalidated frame"); } /* Build the CFG out of the static frame, and transform it to SSA. */ build_cfg(tc, g, sf, cand->deopts, cand->num_deopts); if (!cfg_only) { eliminate_dead(tc, g); add_predecessors(tc, g); ssa(tc, g); } /* Hand back the completed graph. */ return g; } /* Marks GCables held in a spesh graph. */ void MVM_spesh_graph_mark(MVMThreadContext *tc, MVMSpeshGraph *g, MVMGCWorklist *worklist) { MVMuint16 i, j, num_locals, num_facts, *local_types; /* Mark static frame. */ MVM_gc_worklist_add(tc, worklist, &g->sf); /* Mark facts. */ num_locals = g->num_locals; local_types = g->local_types ? g->local_types : g->sf->body.local_types; for (i = 0; i < num_locals; i++) { num_facts = g->fact_counts[i]; for (j = 0; j < num_facts; j++) { MVMint32 flags = g->facts[i][j].flags; if (flags & MVM_SPESH_FACT_KNOWN_TYPE) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].type)); if (flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].decont_type)); if (flags & MVM_SPESH_FACT_KNOWN_VALUE) { if (local_types[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].value.o)); else if (local_types[i] == MVM_reg_str) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].value.s)); } } } } /* Destroys a spesh graph, deallocating all its associated memory. */ void MVM_spesh_graph_destroy(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Free all of the allocated node memory. */ MVMSpeshMemBlock *cur_block = g->mem_block; while (cur_block) { MVMSpeshMemBlock *prev = cur_block->prev; MVM_free(cur_block->buffer); MVM_free(cur_block); cur_block = prev; } /* Free the graph itself. */ MVM_free(g); } MoarVM-2015.11/src/spesh/graph.h0000644000175000017500000002010212534320622015225 0ustar jnthnjnthn#define MVMPhiNodeCacheSize 48 #define MVMPhiNodeCacheSparseBegin 32 /* Top level of a spesh graph, representing a particular static frame (and * potentially having others inlined into it). */ struct MVMSpeshGraph { /* The static frame this is the spesh graph for. */ MVMStaticFrame *sf; /* The callsite this spesh graph has been tailored to. */ MVMCallsite *cs; /* The bytecode we're building the graph out of. */ MVMuint8 *bytecode; /* Exception handler map for that bytecode. */ MVMFrameHandler *handlers; /* The size of the bytecode we're building the graph out of. */ MVMuint32 bytecode_size; /* Number of exception handlers. */ MVMuint32 num_handlers; /* The entry basic block. */ MVMSpeshBB *entry; /* Gathered facts about each version of a local (top-level array is per * local, then array hanging off it is per version). */ MVMSpeshFacts **facts; /* Number of fact entries per local. */ MVMuint16 *fact_counts; /* Argument guards added. */ MVMSpeshGuard *arg_guards; /* Number of argument guards we have. */ MVMint32 num_arg_guards; /* Log-based guards added. */ MVMSpeshLogGuard *log_guards; /* Number of log-based guards we have. */ MVMint32 num_log_guards; /* Memory blocks we allocate to store spesh nodes, and which we free along * with the graph. Contains a link to previous blocks. */ MVMSpeshMemBlock *mem_block; /* Values placed in spesh slots. */ MVMCollectable **spesh_slots; /* Number of spesh slots we have used and allocated. */ MVMint32 num_spesh_slots; MVMint32 alloc_spesh_slots; /* De-opt indexes, as pairs of integers. The first integer, set when we * build the graph, is the return address in the original bytecode. The * code-gen phase for the specialized bytecode will fill in the second * integers afterwards, which are the return address in the specialized * bytecode. */ MVMint32 *deopt_addrs; MVMint32 num_deopt_addrs; MVMint32 alloc_deopt_addrs; /* Table of information about inlines, laid out in order of nesting * depth. Thus, going through the table in order and finding when we * are within the bounds will show up each call frame that needs to * be created in deopt. */ MVMSpeshInline *inlines; MVMint32 num_inlines; /* Logging slots, along with the number of them. */ MVMint32 num_log_slots; MVMCollectable **log_slots; /* Number of basic blocks we have. */ MVMint32 num_bbs; /* The list of local types (only set up if we do inlines). */ MVMuint16 *local_types; /* The list of lexical types (only set up if we do inlines). */ MVMuint16 *lexical_types; /* The total number of locals, accounting for any inlining done and * added temporaries. */ MVMuint16 num_locals; /* The total number of lexicals, accounting for any inlining done. */ MVMuint16 num_lexicals; /* Temporary local registers added to aid transformations, along with a * count of the number we have and have allocated space for so far. */ MVMuint16 num_temps; MVMuint16 alloc_temps; MVMSpeshTemporary *temps; /* We need to create new MVMOpInfo structs for each number of * arguments a PHI node can take. We cache them here, so that we * allocate fewer of them across our spesh alloc blocks. */ MVMOpInfo *phi_infos; }; /* The default allocation chunk size for memory blocks used to store spesh * graph nodes. Power of two is best; we start small also. */ #define MVM_SPESH_FIRST_MEMBLOCK_SIZE 32768 #define MVM_SPESH_MEMBLOCK_SIZE 8192 /* A block of bump-pointer allocated memory. */ struct MVMSpeshMemBlock { /* The memory buffer itself. */ char *buffer; /* Current allocation position. */ char *alloc; /* Allocation limit. */ char *limit; /* Previous, now full, memory block. */ MVMSpeshMemBlock *prev; }; /* A temporary register, added to support transformations. */ struct MVMSpeshTemporary { /* The number of the local along with the current SSA index. */ MVMuint16 orig; MVMuint16 i; /* What kind of register is it? */ MVMuint16 kind; /* Is it currently in use? */ MVMuint16 in_use; }; /* A basic block in the graph (sequences of instructions where control will * always enter at the start and leave at the end). */ struct MVMSpeshBB { /* Head/tail of doubly linked list of instructions. */ MVMSpeshIns *first_ins; MVMSpeshIns *last_ins; /* Basic blocks we may go to after this one. */ MVMSpeshBB **succ; /* Basic blocks that we may arrive into this one from. */ MVMSpeshBB **pred; /* Children in the dominator tree. */ MVMSpeshBB **children; /* Dominance frontier set. */ MVMSpeshBB **df; /* Counts for the above, grouped together to avoid alignment holes. */ MVMuint16 num_succ; MVMuint16 num_pred; MVMuint16 num_children; MVMuint16 num_df; /* The next basic block in original linear code order. */ MVMSpeshBB *linear_next; /* Index (just an ascending integer along the linear_next chain), used as * the block identifier in dominance computation and for debug output. */ MVMint32 idx; /* The block's reverse post-order index, assinged when computing * dominance. */ MVMint32 rpo_idx; /* We cache the instruction pointer of the very first instruction so that * we can output a line number for every BB */ MVMuint32 initial_pc; /* Is this block an inlining of another one? */ MVMint32 inlined; }; /* The SSA phi instruction. */ #define MVM_SSA_PHI 32767 /* An instruction in the spesh graph. */ struct MVMSpeshIns { /* Instruction information. */ const MVMOpInfo *info; /* Operand information. */ MVMSpeshOperand *operands; /* Previous and next instructions, within a basic block boundary. */ MVMSpeshIns *prev; MVMSpeshIns *next; /* Any annotations on the instruction. */ MVMSpeshAnn *annotations; }; /* Union type of operands in a spesh instruction; the op info and phase of the * optimizer we're in determines which of these we look at. */ union MVMSpeshOperand { MVMint64 lit_i64; MVMint32 lit_i32; MVMint16 lit_i16; MVMint8 lit_i8; MVMnum64 lit_n64; MVMnum32 lit_n32; MVMuint32 lit_str_idx; MVMuint16 callsite_idx; MVMuint16 coderef_idx; MVMuint32 ins_offset; MVMSpeshBB *ins_bb; struct { MVMuint16 idx; MVMuint16 outers; } lex; struct { MVMint32 i; /* SSA-computed version. */ MVMuint16 orig; /* Original register number. */ } reg; }; /* Annotations base. */ struct MVMSpeshAnn { /* The next annotation in the chain, if any. */ MVMSpeshAnn *next; /* The type of annotation we have. */ MVMint32 type; /* Data (meaning depends on type). */ union { MVMint32 frame_handler_index; MVMint32 deopt_idx; MVMint32 inline_idx; } data; }; /* Annotation types. */ #define MVM_SPESH_ANN_FH_START 1 #define MVM_SPESH_ANN_FH_END 2 #define MVM_SPESH_ANN_FH_GOTO 3 #define MVM_SPESH_ANN_DEOPT_ONE_INS 4 #define MVM_SPESH_ANN_DEOPT_ALL_INS 5 #define MVM_SPESH_ANN_INLINE_START 6 #define MVM_SPESH_ANN_INLINE_END 7 #define MVM_SPESH_ANN_DEOPT_INLINE 8 #define MVM_SPESH_ANN_DEOPT_OSR 9 /* Functions to create/destory the spesh graph. */ MVMSpeshGraph * MVM_spesh_graph_create(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint32 cfg_only); MVMSpeshGraph * MVM_spesh_graph_create_from_cand(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *cand, MVMuint32 cfg_only); MVMSpeshBB * MVM_spesh_graph_linear_prev(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *search); void MVM_spesh_graph_mark(MVMThreadContext *tc, MVMSpeshGraph *g, MVMGCWorklist *worklist); void MVM_spesh_graph_destroy(MVMThreadContext *tc, MVMSpeshGraph *g); MVM_PUBLIC void * MVM_spesh_alloc(MVMThreadContext *tc, MVMSpeshGraph *g, size_t bytes); MVMOpInfo *get_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint32 nrargs); MoarVM-2015.11/src/spesh/inline.c0000644000175000017500000011173412573775575015441 0ustar jnthnjnthn#include "moar.h" /* Ensures that a given compilation unit has access to the specified extop. */ static void demand_extop(MVMThreadContext *tc, MVMCompUnit *target_cu, MVMCompUnit *source_cu, const MVMOpInfo *info) { MVMExtOpRecord *extops; MVMuint16 i, num_extops; MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)target_cu->body.update_mutex); /* See if the target compunit already has the extop. */ extops = target_cu->body.extops; num_extops = target_cu->body.num_extops; for (i = 0; i < num_extops; i++) if (extops[i].info == info) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)target_cu->body.update_mutex); return; } /* If not, need to add it. Locate it in the source CU. */ extops = source_cu->body.extops; num_extops = source_cu->body.num_extops; for (i = 0; i < num_extops; i++) { if (extops[i].info == info) { MVMuint32 size = (target_cu->body.num_extops + 1) * sizeof(MVMExtOpRecord); target_cu->body.extops = target_cu->body.extops ? MVM_realloc(target_cu->body.extops, size) : MVM_malloc(size); memcpy(&target_cu->body.extops[target_cu->body.num_extops], &extops[i], sizeof(MVMExtOpRecord)); target_cu->body.num_extops++; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)target_cu->body.update_mutex); return; } } /* Didn't find it; should be impossible. */ MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)target_cu->body.update_mutex); MVM_oops(tc, "Spesh: inline failed to find source CU extop entry"); } /* Sees if it will be possible to inline the target code ref, given we could * already identify a spesh candidate. Returns NULL if no inlining is possible * or a graph ready to be merged if it will be possible. */ MVMSpeshGraph * MVM_spesh_inline_try_get_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMCode *target, MVMSpeshCandidate *cand) { MVMSpeshGraph *ig; MVMSpeshBB *bb; /* Check inlining is enabled. */ if (!tc->instance->spesh_inline_enabled) return NULL; /* Check bytecode size is within the inline limit. */ if (cand->bytecode_size > MVM_SPESH_MAX_INLINE_SIZE) return NULL; /* Ensure that this isn't a recursive inlining. */ if (target->body.sf == inliner->sf) return NULL; /* Ensure the candidate isn't still logging. */ if (cand->sg) return NULL; /* Build graph from the already-specialized bytecode. */ ig = MVM_spesh_graph_create_from_cand(tc, target->body.sf, cand, 0); /* Traverse graph, looking for anything that might prevent inlining and * also building usage counts up. */ bb = ig->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { /* Track usages. */ MVMint32 opcode = ins->info->opcode; MVMint32 is_phi = opcode == MVM_SSA_PHI; MVMuint8 i; for (i = 0; i < ins->info->num_operands; i++) if ((is_phi && i > 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg)) ig->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i].usages++; if (opcode == MVM_OP_inc_i || opcode == MVM_OP_inc_u || opcode == MVM_OP_dec_i || opcode == MVM_OP_dec_u) ig->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i - 1].usages++; /* Instruction may be marked directly as not being inlinable, in * which case we're done. */ if (!is_phi && ins->info->no_inline) goto not_inlinable; /* If we have lexical access, make sure it's within the frame. */ if (ins->info->opcode == MVM_OP_getlex) { if (ins->operands[1].lex.outers > 0) goto not_inlinable; } else if (ins->info->opcode == MVM_OP_bindlex) { if (ins->operands[0].lex.outers > 0) goto not_inlinable; } /* Check we don't have too many args for inlining to work out. */ if (ins->info->opcode == MVM_OP_sp_getarg_o || ins->info->opcode == MVM_OP_sp_getarg_i || ins->info->opcode == MVM_OP_sp_getarg_n || ins->info->opcode == MVM_OP_sp_getarg_s) { if (ins->operands[1].lit_i16 >= MAX_ARGS_FOR_OPT) goto not_inlinable; } /* Ext-ops need special care in inter-comp-unit inlines. */ if (ins->info->opcode == (MVMuint16)-1) { MVMCompUnit *target_cu = inliner->sf->body.cu; MVMCompUnit *source_cu = target->body.sf->body.cu; if (source_cu != target_cu) demand_extop(tc, target_cu, source_cu, ins->info); } ins = ins->next; } bb = bb->linear_next; } /* If we found nothing we can't inline, inlining is fine. */ return ig; /* If we can't find a way to inline, we end up here. */ not_inlinable: MVM_spesh_graph_destroy(tc, ig); return NULL; } /* Finds the deopt index of the return. */ static MVMint32 return_deopt_idx(MVMThreadContext *tc, MVMSpeshIns *invoke_ins) { MVMSpeshAnn *ann = invoke_ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS) return ann->data.deopt_idx; ann = ann->next; } MVM_oops(tc, "Spesh inline: return_deopt_idx failed"); } /* The following routines fix references to per-compilation-unit things * that would be broken by inlining. */ static void fix_callsite(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { to_fix->callsite_idx = MVM_cu_callsite_add(tc, inliner->sf->body.cu, inlinee->sf->body.cu->body.callsites[to_fix->callsite_idx]); } static void fix_coderef(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { MVM_oops(tc, "Spesh inline: fix_coderef NYI"); } static void fix_str(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { to_fix->lit_str_idx = MVM_cu_string_add(tc, inliner->sf->body.cu, inlinee->sf->body.cu->body.strings[to_fix->lit_str_idx]); } static void fix_wval(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshIns *to_fix) { /* Resolve object, then just put it into a spesh slot. (Could do some * smarter things like trying to see if the SC is referenced by both * compilation units, too.) */ MVMCompUnit *cu = inlinee->sf->body.cu; MVMint16 dep = to_fix->operands[1].lit_i16; MVMint64 idx = to_fix->info->opcode == MVM_OP_wval ? to_fix->operands[2].lit_i16 : to_fix->operands[2].lit_i64; if (dep >= 0 && dep < cu->body.num_scs) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc) { MVMObject *obj = MVM_sc_get_object(tc, sc, idx); MVMint16 ss = MVM_spesh_add_spesh_slot(tc, inliner, (MVMCollectable *)obj); to_fix->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); to_fix->operands[1].lit_i16 = ss; } else { MVM_oops(tc, "Spesh inline: SC not yet resolved; lookup failed"); } } else { MVM_oops(tc, "Spesh inline: invalid SC index found"); } } /* Resizes the handlers table, making a copy if needed. */ static void resize_handlers_table(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMuint32 new_handler_count) { if (inliner->handlers == inliner->sf->body.handlers) { /* Original handlers table; need a copy. */ MVMFrameHandler *new_handlers = MVM_malloc(new_handler_count * sizeof(MVMFrameHandler)); memcpy(new_handlers, inliner->handlers, inliner->num_handlers * sizeof(MVMFrameHandler)); inliner->handlers = new_handlers; } else { /* Probably already did some inlines into this frame; resize. */ inliner->handlers = MVM_realloc(inliner->handlers, new_handler_count * sizeof(MVMFrameHandler)); } } /* Merges the inlinee's spesh graph into the inliner. */ static void merge_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMCode *inlinee_code, MVMSpeshIns *invoke_ins) { MVMSpeshFacts **merged_facts; MVMuint16 *merged_fact_counts; MVMint32 i, total_inlines, orig_deopt_addrs; MVMSpeshBB *inlinee_first_bb = NULL, *inlinee_last_bb = NULL; MVMint32 active_handlers_at_invoke = 0; /* If the inliner and inlinee are from different compilation units, we * potentially have to fix up extra things. */ MVMint32 same_comp_unit = inliner->sf->body.cu == inlinee->sf->body.cu; /* Renumber the locals, lexicals, and basic blocks of the inlinee; also * re-write any indexes in annotations that need it. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; MVMSpeshAnn *ann = ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: case MVM_SPESH_ANN_FH_END: case MVM_SPESH_ANN_FH_GOTO: ann->data.frame_handler_index += inliner->num_handlers; break; case MVM_SPESH_ANN_DEOPT_INLINE: ann->data.deopt_idx += inliner->num_deopt_addrs; break; case MVM_SPESH_ANN_INLINE_START: case MVM_SPESH_ANN_INLINE_END: ann->data.inline_idx += inliner->num_inlines; break; } ann = ann->next; } if (opcode == MVM_SSA_PHI) { for (i = 0; i < ins->info->num_operands; i++) ins->operands[i].reg.orig += inliner->num_locals; } else { for (i = 0; i < ins->info->num_operands; i++) { MVMuint8 flags = ins->info->operands[i]; switch (flags & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: ins->operands[i].reg.orig += inliner->num_locals; break; case MVM_operand_read_lex: case MVM_operand_write_lex: ins->operands[i].lex.idx += inliner->num_lexicals; break; default: { MVMuint32 type = flags & MVM_operand_type_mask; if (type == MVM_operand_spesh_slot) { ins->operands[i].lit_i16 += inliner->num_spesh_slots; } else if (type == MVM_operand_callsite) { if (!same_comp_unit) fix_callsite(tc, inliner, inlinee, &(ins->operands[i])); } else if (type == MVM_operand_coderef) { if (!same_comp_unit) fix_coderef(tc, inliner, inlinee, &(ins->operands[i])); } else if (type == MVM_operand_str) { if (!same_comp_unit) fix_str(tc, inliner, inlinee, &(ins->operands[i])); } break; } } } } ins = ins->next; } bb->idx += inliner->num_bbs - 1; /* -1 as we won't include entry */ bb->inlined = 1; if (!bb->linear_next) inlinee_last_bb = bb; bb = bb->linear_next; } /* Incorporate the basic blocks by concatening them onto the end of the * linear_next chain of the inliner; skip the inlinee's fake entry BB. */ bb = inliner->entry; while (bb) { if (!bb->linear_next) { /* Found the end; insert and we're done. */ bb->linear_next = inlinee_first_bb = inlinee->entry->linear_next; bb = NULL; } else { bb = bb->linear_next; } } /* Merge facts. */ merged_facts = MVM_spesh_alloc(tc, inliner, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMSpeshFacts *)); memcpy(merged_facts, inliner->facts, inliner->num_locals * sizeof(MVMSpeshFacts *)); memcpy(merged_facts + inliner->num_locals, inlinee->facts, inlinee->num_locals * sizeof(MVMSpeshFacts *)); inliner->facts = merged_facts; merged_fact_counts = MVM_spesh_alloc(tc, inliner, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMuint16)); memcpy(merged_fact_counts, inliner->fact_counts, inliner->num_locals * sizeof(MVMuint16)); memcpy(merged_fact_counts + inliner->num_locals, inlinee->fact_counts, inlinee->num_locals * sizeof(MVMuint16)); inliner->fact_counts = merged_fact_counts; /* Copy over spesh slots. */ for (i = 0; i < inlinee->num_spesh_slots; i++) MVM_spesh_add_spesh_slot(tc, inliner, inlinee->spesh_slots[i]); /* If they are from separate compilation units, make another pass through * to fix up on wvals. Note we can't do this in the first pass as we must * not modify the spesh slots once we've got started with the rewrites. * Now we've resolved all that, we're good to map wvals elsewhere into * some extra spesh slots. */ if (!same_comp_unit) { bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; if (opcode == MVM_OP_wval || opcode == MVM_OP_wval_wide) fix_wval(tc, inliner, inlinee, ins); ins = ins->next; } bb = bb->linear_next; } } /* Merge de-opt tables, if needed. */ orig_deopt_addrs = inliner->num_deopt_addrs; if (inlinee->num_deopt_addrs) { assert(inlinee->deopt_addrs != inliner->deopt_addrs); inliner->alloc_deopt_addrs += inlinee->alloc_deopt_addrs; if (inliner->deopt_addrs) inliner->deopt_addrs = MVM_realloc(inliner->deopt_addrs, inliner->alloc_deopt_addrs * sizeof(MVMint32) * 2); else inliner->deopt_addrs = MVM_malloc(inliner->alloc_deopt_addrs * sizeof(MVMint32) * 2); memcpy(inliner->deopt_addrs + inliner->num_deopt_addrs * 2, inlinee->deopt_addrs, inlinee->alloc_deopt_addrs * sizeof(MVMint32) * 2); inliner->num_deopt_addrs += inlinee->num_deopt_addrs; } /* Merge inlines table, and add us an entry too. */ total_inlines = inliner->num_inlines + inlinee->num_inlines + 1; inliner->inlines = inliner->num_inlines ? MVM_realloc(inliner->inlines, total_inlines * sizeof(MVMSpeshInline)) : MVM_malloc(total_inlines * sizeof(MVMSpeshInline)); memcpy(inliner->inlines + inliner->num_inlines, inlinee->inlines, inlinee->num_inlines * sizeof(MVMSpeshInline)); for (i = inliner->num_inlines; i < total_inlines - 1; i++) { inliner->inlines[i].locals_start += inliner->num_locals; inliner->inlines[i].lexicals_start += inliner->num_lexicals; inliner->inlines[i].return_deopt_idx += orig_deopt_addrs; } inliner->inlines[total_inlines - 1].code = inlinee_code; inliner->inlines[total_inlines - 1].g = inlinee; inliner->inlines[total_inlines - 1].locals_start = inliner->num_locals; inliner->inlines[total_inlines - 1].lexicals_start = inliner->num_lexicals; switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_VOID; break; case MVM_OP_invoke_o: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_OBJ; break; case MVM_OP_invoke_i: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_INT; break; case MVM_OP_invoke_n: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_NUM; break; case MVM_OP_invoke_s: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_STR; break; default: MVM_oops(tc, "Spesh inline: unknown invoke instruction"); } inliner->inlines[total_inlines - 1].return_deopt_idx = return_deopt_idx(tc, invoke_ins); inliner->num_inlines = total_inlines; /* Create/update per-specialization local and lexical type maps. */ if (!inliner->local_types) { MVMint32 local_types_size = inliner->num_locals * sizeof(MVMuint16); inliner->local_types = MVM_malloc(local_types_size); memcpy(inliner->local_types, inliner->sf->body.local_types, local_types_size); } inliner->local_types = MVM_realloc(inliner->local_types, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMuint16)); memcpy(inliner->local_types + inliner->num_locals, inlinee->local_types ? inlinee->local_types : inlinee->sf->body.local_types, inlinee->num_locals * sizeof(MVMuint16)); if (!inliner->lexical_types) { MVMint32 lexical_types_size = inliner->num_lexicals * sizeof(MVMuint16); inliner->lexical_types = MVM_malloc(lexical_types_size); memcpy(inliner->lexical_types, inliner->sf->body.lexical_types, lexical_types_size); } inliner->lexical_types = MVM_realloc(inliner->lexical_types, (inliner->num_lexicals + inlinee->num_lexicals) * sizeof(MVMuint16)); memcpy(inliner->lexical_types + inliner->num_lexicals, inlinee->lexical_types ? inlinee->lexical_types : inlinee->sf->body.lexical_types, inlinee->num_lexicals * sizeof(MVMuint16)); /* Merge handlers from inlinee. */ if (inlinee->num_handlers) { MVMuint32 total_handlers = inliner->num_handlers + inlinee->num_handlers; resize_handlers_table(tc, inliner, total_handlers); memcpy(inliner->handlers + inliner->num_handlers, inlinee->handlers, inlinee->num_handlers * sizeof(MVMFrameHandler)); for (i = inliner->num_handlers; i < total_handlers; i++) { inliner->handlers[i].block_reg += inliner->num_locals; inliner->handlers[i].label_reg += inliner->num_locals; } } /* If the inliner has handlers in effect at the point of the call that we * are inlining, then we duplicate those and place them surrounding the * inlinee, but with the goto still pointing to the original location. * This means that we can still do a linear scan when searching for an * exception handler, and don't have to try the (costly and fiddly) matter * of trying to traverse the post-inlined call chain. */ if (inliner->sf->body.num_handlers) { /* Walk inliner looking for handlers in effect at the point we hit the * invoke instruction we're currently inlining; also record all of the * instructions where the handler "goto" annotation lives. */ MVMuint32 orig_handlers = inliner->sf->body.num_handlers; MVMuint8 *active = MVM_spesh_alloc(tc, inliner, orig_handlers); MVMSpeshIns **handler_goto_ins = MVM_spesh_alloc(tc, inliner, orig_handlers * sizeof(MVMSpeshIns *)); MVMint32 found_invoke = 0; bb = inliner->entry; while (bb && !bb->inlined) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_FH_GOTO) { if (ann->data.frame_handler_index < orig_handlers) handler_goto_ins[ann->data.frame_handler_index] = ins; } else if (!found_invoke) { /* Only update these to the point we found the invoke * being inlined, so it serves as a snapshot of what * is active. */ if (ann->type == MVM_SPESH_ANN_FH_START) active[ann->data.frame_handler_index] = 1; else if (ann->type == MVM_SPESH_ANN_FH_END) active[ann->data.frame_handler_index] = 0; } ann = ann->next; } if (ins == invoke_ins) { /* Found it; see if we have any handlers active. If so, we * will continue walking to collect goto annotations. */ found_invoke = 1; for (i = 0; i < orig_handlers; i++) active_handlers_at_invoke += active[i]; if (!active_handlers_at_invoke) break; } ins = ins->next; } if (found_invoke && !active_handlers_at_invoke) break; bb = bb->linear_next; } /* If we found handlers active at the point of invoke, duplicate them * in the handlers table and add annotations. */ if (active_handlers_at_invoke) { MVMuint32 insert_pos = inliner->num_handlers + inlinee->num_handlers; resize_handlers_table(tc, inliner, insert_pos + active_handlers_at_invoke); for (i = orig_handlers - 1; i >= 0; i--) { if (active[i]) { /* Add handler start annotation to first inlinee instruction. */ MVMSpeshAnn *new_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); new_ann->type = MVM_SPESH_ANN_FH_START; new_ann->data.frame_handler_index = insert_pos; new_ann->next = inlinee_first_bb->first_ins->annotations; inlinee_first_bb->first_ins->annotations = new_ann; /* Add handler end annotation to last inlinee instruction. */ new_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); new_ann->type = MVM_SPESH_ANN_FH_END; new_ann->data.frame_handler_index = insert_pos; new_ann->next = inlinee_last_bb->last_ins->annotations; inlinee_last_bb->last_ins->annotations = new_ann; /* Add handler goto annotation to original target in inliner. */ new_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); new_ann->type = MVM_SPESH_ANN_FH_GOTO; new_ann->data.frame_handler_index = insert_pos; new_ann->next = handler_goto_ins[i]->annotations; handler_goto_ins[i]->annotations = new_ann; /* Copy handler entry to new slot. */ memcpy(inliner->handlers + insert_pos, inliner->handlers + i, sizeof(MVMFrameHandler)); insert_pos++; } } } } /* Update total locals, lexicals, basic blocks, and handlers of the * inliner. */ inliner->num_bbs += inlinee->num_bbs - 1; inliner->num_locals += inlinee->num_locals; inliner->num_lexicals += inlinee->num_lexicals; inliner->num_handlers += inlinee->num_handlers + active_handlers_at_invoke; } /* Tweak the successor of a BB, also updating the target BBs pred. */ static void tweak_succ(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshBB *new_succ) { if (bb->num_succ == 0) { bb->succ = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); bb->num_succ = 1; } if (bb->num_succ == 1) bb->succ[0] = new_succ; else MVM_oops(tc, "Spesh inline: unexpected num_succ"); if (new_succ->num_pred == 0) { new_succ->pred = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); new_succ->num_pred = 1; new_succ->pred[0] = bb; } else { MVMint32 found = 0; MVMint32 i; for (i = 0; i < new_succ->num_pred; i++) if (new_succ->pred[i]->idx + 1 == new_succ->idx) { new_succ->pred[i] = bb; found = 1; break; } if (!found) MVM_oops(tc, "Spesh inline: could not find appropriate pred to update\n"); } } /* Finds return instructions and re-writes them into gotos, doing any needed * boxing or unboxing. */ static void return_to_set(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *return_ins, MVMSpeshOperand target) { MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); operands[0] = target; operands[1] = return_ins->operands[0]; return_ins->info = MVM_op_get_op(MVM_OP_set); return_ins->operands = operands; } static void return_to_box(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshOperand target, MVMuint16 box_type_op, MVMuint16 box_op) { /* Create and insert boxing instruction after current return instruction. */ MVMSpeshIns *box_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); MVMSpeshOperand *box_operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); box_ins->info = MVM_op_get_op(box_op); box_ins->operands = box_operands; box_operands[0] = target; box_operands[1] = return_ins->operands[0]; box_operands[2] = target; MVM_spesh_manipulate_insert_ins(tc, return_bb, return_ins, box_ins); /* Now turn return instruction node into lookup of appropraite box * type. */ return_ins->info = MVM_op_get_op(box_type_op); return_ins->operands[0] = target; } static void rewrite_int_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_i: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_i, MVM_OP_box_i); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_i"); } } static void rewrite_num_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_n: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_n, MVM_OP_box_n); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_n"); } } static void rewrite_str_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_s: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_s, MVM_OP_box_s); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_s"); } } static void rewrite_obj_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_o: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_o"); } } static void rewrite_returns(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { /* Locate return instructions. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; switch (opcode) { case MVM_OP_return: if (invoke_ins->info->opcode == MVM_OP_invoke_v) { MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); } else { MVM_oops(tc, "Spesh inline: return_v/invoke_[!v] mismatch"); } break; case MVM_OP_return_i: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_int_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_n: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_num_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_s: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_str_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_o: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_obj_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; } ins = ins->next; } bb = bb->linear_next; } } /* Re-writes argument passing and parameter taking instructions to simple * register set operations. */ static void rewrite_args(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshBB *invoke_bb, MVMSpeshCallInfo *call_info) { /* Look for param-taking instructions. Track what arg instructions we * use in the process. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; MVMSpeshIns *next = ins->next; switch (opcode) { case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_i: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: { MVMuint16 idx = ins->operands[1].lit_i16; MVMSpeshIns *arg_ins = call_info->arg_ins[idx]; switch (arg_ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: /* Arg passer just becomes a set instruction; delete the * parameter-taking instruction. */ arg_ins->info = MVM_op_get_op(MVM_OP_set); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; case MVM_OP_argconst_i: arg_ins->info = MVM_op_get_op(MVM_OP_const_i64); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; case MVM_OP_argconst_n: arg_ins->info = MVM_op_get_op(MVM_OP_const_n64); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; case MVM_OP_argconst_s: arg_ins->info = MVM_op_get_op(MVM_OP_const_s); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; default: MVM_oops(tc, "Spesh inline: unhandled arg instruction %d", arg_ins->info->opcode); } break; } } ins = next; } bb = bb->linear_next; } /* Delete the prepargs instruction. */ MVM_spesh_manipulate_delete_ins(tc, inliner, invoke_bb, call_info->prepargs_ins); } /* Annotates first and last instruction in post-processed inlinee with start * and end inline annotations. */ static void annotate_inline_start_end(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMint32 idx) { /* Annotate first instruction. */ MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); MVMSpeshBB *bb = inlinee->entry->succ[0]; start_ann->next = bb->first_ins->annotations; start_ann->type = MVM_SPESH_ANN_INLINE_START; start_ann->data.inline_idx = idx; bb->first_ins->annotations = start_ann; /* Now look for last instruction and annotate it. */ while (bb) { if (!bb->linear_next) { MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); end_ann->next = bb->last_ins->annotations; end_ann->type = MVM_SPESH_ANN_INLINE_END; end_ann->data.inline_idx = idx; bb->last_ins->annotations = end_ann; } bb = bb->linear_next; } } /* Drives the overall inlining process. */ void MVM_spesh_inline(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshCallInfo *call_info, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins, MVMSpeshGraph *inlinee, MVMCode *inlinee_code) { /* Merge inlinee's graph into the inliner. */ merge_graph(tc, inliner, inlinee, inlinee_code, invoke_ins); /* If we're profiling, note it's an inline. */ if (inlinee->entry->linear_next->first_ins->info->opcode == MVM_OP_prof_enterspesh) { MVMSpeshIns *profenter = inlinee->entry->linear_next->first_ins; profenter->info = MVM_op_get_op(MVM_OP_prof_enterinline); profenter->operands = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshOperand)); profenter->operands[0].lit_i16 = MVM_spesh_add_spesh_slot(tc, inliner, (MVMCollectable *)inlinee->sf); } /* Re-write returns to a set and goto. */ rewrite_returns(tc, inliner, inlinee, invoke_bb, invoke_ins); /* Re-write the argument passing instructions to poke values into the * appropriate slots. */ rewrite_args(tc, inliner, inlinee, invoke_bb, call_info); /* Annotate first and last instruction with inline table annotations. */ annotate_inline_start_end(tc, inliner, inlinee, inliner->num_inlines - 1); /* Finally, turn the invoke instruction into a goto. */ invoke_ins->info = MVM_op_get_op(MVM_OP_goto); invoke_ins->operands[0].ins_bb = inlinee->entry->linear_next; tweak_succ(tc, inliner, invoke_bb, inlinee->entry->linear_next); } MoarVM-2015.11/src/spesh/inline.h0000644000175000017500000000215312456307241015415 0ustar jnthnjnthn/* Maximum size of bytecode we'll inline. */ #define MVM_SPESH_MAX_INLINE_SIZE 256 /* Inline table entry. The data is primarily used in deopt. */ struct MVMSpeshInline { /* Start and end position in the bytecode where we're inside of this * inline. */ MVMuint32 start; MVMuint32 end; /* The inlined code ref. */ MVMCode *code; /* Start position of the locals and lexicals, so we can extract them * to the new frame. */ MVMuint16 locals_start; MVMuint16 lexicals_start; /* Result register and result type. */ MVMuint16 res_reg; MVMReturnType res_type; /* Deopt index used to find return address. */ MVMuint32 return_deopt_idx; /* Inlinee's spesh graph, so we can free it up after code-gen. */ MVMSpeshGraph *g; }; MVMSpeshGraph * MVM_spesh_inline_try_get_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMCode *target, MVMSpeshCandidate *cand); void MVM_spesh_inline(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshCallInfo *call_info, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke, MVMSpeshGraph *inlinee, MVMCode *inlinee_code); MoarVM-2015.11/src/spesh/log.c0000644000175000017500000000612312456307241014714 0ustar jnthnjnthn#include "moar.h" /* In order to collect more information to use during specialization, we * make a pass through the code inserting logging instructions after a * range of insturctions that obtain data we can't reason about easily * statically. After a number of logging runs, the collected data is * used as an additional "fact" source while specializing. */ static void insert_log(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 next_bb) { /* Add the entry. */ MVMSpeshIns *log_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); log_ins->info = MVM_op_get_op(MVM_OP_sp_log); log_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); log_ins->operands[0].reg = ins->operands[0].reg; log_ins->operands[1].lit_i16 = g->num_log_slots; if (next_bb) MVM_spesh_manipulate_insert_ins(tc, bb->succ[0], NULL, log_ins); else MVM_spesh_manipulate_insert_ins(tc, bb, ins, log_ins); g->num_log_slots++; /* Steal the de-opt annotation into the log instruction, if it exists. */ if (ins->annotations) { MVMSpeshAnn *prev_ann = NULL; MVMSpeshAnn *cur_ann = ins->annotations; while (cur_ann) { if (cur_ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS) { if (prev_ann) prev_ann->next = cur_ann->next; else ins->annotations = cur_ann->next; cur_ann->next = NULL; log_ins->annotations = cur_ann; break; } prev_ann = cur_ann; cur_ann = cur_ann->next; } } } void MVM_spesh_log_add_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 osr) { MVMSpeshBB *bb; /* We've no log slots so far. */ g->num_log_slots = 0; /* Work through the code, adding logging instructions where needed. */ bb = g->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_getlex: if (g->sf->body.local_types[ins->operands[0].reg.orig] == MVM_reg_obj) insert_log(tc, g, bb, ins, 0); break; case MVM_OP_getlex_no: case MVM_OP_getattr_o: case MVM_OP_getattrs_o: case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: insert_log(tc, g, bb, ins, 0); break; case MVM_OP_invoke_o: insert_log(tc, g, bb, ins, 1); break; case MVM_OP_osrpoint: if (osr) ins->info = MVM_op_get_op(MVM_OP_sp_osrfinalize); else MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); break; } ins = ins->next; } bb = bb->linear_next; } /* Allocate space for logging storage. */ g->log_slots = g->num_log_slots ? MVM_calloc(g->num_log_slots * MVM_SPESH_LOG_RUNS, sizeof(MVMCollectable *)) : NULL; } MoarVM-2015.11/src/spesh/log.h0000644000175000017500000000064712456307241014726 0ustar jnthnjnthn/* The number of runs we do to log what we see. */ #define MVM_SPESH_LOG_RUNS 8 /* Information about an inserted guard instruction due to logging. */ struct MVMSpeshLogGuard { /* Instruction and containing basic block. */ MVMSpeshIns *ins; MVMSpeshBB *bb; /* Have we made use of the gurad? */ MVMuint32 used; }; void MVM_spesh_log_add_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 osr); MoarVM-2015.11/src/spesh/manipulate.c0000644000175000017500000001663712534320622016300 0ustar jnthnjnthn#include "moar.h" /* This file contains various routines for manipulating a spesh graph, such * as adding/removing/replacing instructions. */ void MVM_spesh_manipulate_delete_ins(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* Remove it from the double linked list. */ MVMSpeshIns *prev = ins->prev; MVMSpeshIns *next = ins->next; if (prev) prev->next = next; else bb->first_ins = next; if (next) next->prev = prev; else bb->last_ins = prev; /* Move it's annotations. */ while (ins->annotations) { MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *ann_next = ann->next; switch (ann->type) { case MVM_SPESH_ANN_FH_START: case MVM_SPESH_ANN_FH_GOTO: case MVM_SPESH_ANN_INLINE_START: case MVM_SPESH_ANN_DEOPT_OSR: if (!next && bb->linear_next) next = bb->linear_next->first_ins; if (next) { ann->next = next->annotations; next->annotations = ann; } break; case MVM_SPESH_ANN_FH_END: case MVM_SPESH_ANN_DEOPT_ONE_INS: if (!prev) { MVMSpeshBB *prev_bb = MVM_spesh_graph_linear_prev(tc, g, bb); if (prev_bb) prev = prev_bb->last_ins; } if (prev) { ann->next = prev->annotations; prev->annotations = ann; } break; } ins->annotations = ann_next; } } void MVM_spesh_manipulate_insert_ins(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshIns *previous, MVMSpeshIns *to_insert) { MVMSpeshIns *next; if (previous) { next = previous->next; previous->next = to_insert; } else { next = bb->first_ins; bb->first_ins = to_insert; } to_insert->next = next; if (next) { next->prev = to_insert; } else { bb->last_ins = to_insert; } to_insert->prev = previous; } /* Inserts a goto. */ void MVM_spesh_manipulate_insert_goto(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshBB *target) { MVMSpeshIns *inserted_goto = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand )); inserted_goto->info = MVM_op_get_op(MVM_OP_goto); inserted_goto->operands = operands; operands[0].ins_bb = target; MVM_spesh_manipulate_insert_ins(tc, bb, ins, inserted_goto); } void MVM_spesh_manipulate_remove_successor(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshBB *succ) { MVMSpeshBB ** const bb_succ = bb->succ; MVMSpeshBB ** const succ_pred = succ->pred; const MVMuint16 bb_num_succ = --bb->num_succ; const MVMuint16 succ_num_pred = --succ->num_pred; MVMuint16 i, k; for (i = 0; i <= bb_num_succ; i++) { if (bb_succ[i] == succ) { break; } } if (bb_succ[i] != succ) { MVM_oops(tc, "Didn't find the successor to remove from a Spesh Basic Block"); } /* Remove the succ from the list, shuffle other successors back in place */ for (k = i; k < bb_num_succ; k++) { bb_succ[k] = bb_succ[k + 1]; } bb_succ[bb_num_succ] = NULL; /* Now hunt the bb in the succ's pred, so that we remove all traces of the connection */ for (i = 0; i <= succ_num_pred; i++) { if (succ_pred[i] == bb) { break; } } if (succ_pred[i] != bb) { MVM_oops(tc, "Didn't find the predecessor to remove from a Spesh Basic Block"); } for (k = i; k < succ_num_pred; k++) { succ_pred[k] = succ_pred[k + 1]; } succ_pred[succ_num_pred] = NULL; } /* Gets a temporary register of the specified kind to use in some transform. * Will only actaully extend the frame if needed; if an existing temproary * was requested and then released, then it will just use a new version of * that. */ MVMSpeshOperand MVM_spesh_manipulate_get_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 kind) { MVMSpeshOperand result; MVMSpeshFacts **new_facts; MVMuint16 *new_fact_counts; MVMuint16 i; /* First, see if we can find an existing free temporary; use it if so. */ for (i = 0; i < g->num_temps; i++) { if (g->temps[i].kind == kind && !g->temps[i].in_use) { /* Add new facts slot. */ MVMuint16 orig = g->temps[i].orig; MVMSpeshFacts *new_fact_row = MVM_spesh_alloc(tc, g, (g->fact_counts[orig] + 1) * sizeof(MVMSpeshFacts)); memcpy(new_fact_row, g->facts[orig], g->fact_counts[orig] * sizeof(MVMSpeshFacts)); g->facts[orig] = new_fact_row; g->fact_counts[orig]++; /* Mark it in use an add extra version. */ g->temps[i].in_use++; g->temps[i].i++; /* Produce and return result. */ result.reg.orig = orig; result.reg.i = g->temps[i].i; return result; } } /* Make sure we've space in the temporaries store. */ if (g->num_temps == g->alloc_temps) { MVMSpeshTemporary *new_temps; g->alloc_temps += 4; new_temps = MVM_spesh_alloc(tc, g, g->alloc_temps * sizeof(MVMSpeshTemporary)); if (g->num_temps) memcpy(new_temps, g->temps, g->num_temps * sizeof(MVMSpeshTemporary)); g->temps = new_temps; } /* Allocate temporary and set up result. */ g->temps[g->num_temps].orig = result.reg.orig = g->num_locals; g->temps[g->num_temps].i = result.reg.i = 0; g->temps[g->num_temps].kind = kind; g->temps[g->num_temps].in_use = 1; g->num_temps++; /* Add locals table entry. */ if (!g->local_types) { MVMint32 local_types_size = g->num_locals * sizeof(MVMuint16); g->local_types = MVM_malloc(local_types_size); memcpy(g->local_types, g->sf->body.local_types, local_types_size); } g->local_types = MVM_realloc(g->local_types, (g->num_locals + 1) * sizeof(MVMuint16)); g->local_types[g->num_locals] = kind; /* Add facts table entry. */ new_facts = MVM_spesh_alloc(tc, g, (g->num_locals + 1) * sizeof(MVMSpeshFacts *)); new_fact_counts = MVM_spesh_alloc(tc, g, (g->num_locals + 1) * sizeof(MVMuint16)); memcpy(new_facts, g->facts, g->num_locals * sizeof(MVMSpeshFacts *)); memcpy(new_fact_counts, g->fact_counts, g->num_locals * sizeof(MVMuint16)); new_facts[g->num_locals] = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshFacts)); new_fact_counts[g->num_locals] = 1; g->facts = new_facts; g->fact_counts = new_fact_counts; /* Increment number of locals. */ g->num_locals++; return result; } /* Releases a temporary register, so it can be used again later. */ void MVM_spesh_manipulate_release_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand temp) { MVMuint16 i; for (i = 0; i < g->num_temps; i++) { if (g->temps[i].orig == temp.reg.orig && g->temps[i].i == temp.reg.i) { if (g->temps[i].in_use) g->temps[i].in_use = 0; else MVM_oops(tc, "Spesh: releasing temp not in use"); return; } } MVM_oops(tc, "Spesh: releasing non-existing temp"); } MoarVM-2015.11/src/spesh/manipulate.h0000644000175000017500000000131212456307241016272 0ustar jnthnjnthnMVM_PUBLIC void MVM_spesh_manipulate_delete_ins(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); MVM_PUBLIC void MVM_spesh_manipulate_insert_ins(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshIns *previous, MVMSpeshIns *to_insert); MVM_PUBLIC void MVM_spesh_manipulate_insert_goto(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshBB *target); void MVM_spesh_manipulate_remove_successor(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshBB *succ); MVMSpeshOperand MVM_spesh_manipulate_get_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 kind); void MVM_spesh_manipulate_release_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand temp); MoarVM-2015.11/src/spesh/optimize.c0000644000175000017500000023134312623370227015777 0ustar jnthnjnthn#include "moar.h" /* This is where the main optimization work on a spesh graph takes place, * using facts discovered during analysis. */ /* Obtains facts for an operand, just directly accessing them without * inferring any kind of usage. */ static MVMSpeshFacts * get_facts_direct(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return &g->facts[o.reg.orig][o.reg.i]; } /* Obtains facts for an operand, indicating they are being used. */ MVMSpeshFacts * MVM_spesh_get_and_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { MVMSpeshFacts *facts = get_facts_direct(tc, g, o); MVM_spesh_use_facts(tc, g, facts); return facts; } /* Obtains facts for an operand, but doesn't (yet) indicate usefulness */ MVMSpeshFacts * MVM_spesh_get_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return get_facts_direct(tc, g, o); } /* Mark facts for an operand as being relied upon */ void MVM_spesh_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *facts) { if (facts->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) g->log_guards[facts->log_guard].used = 1; if (facts->flags & MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD) { MVMSpeshIns *thePHI = facts->writer; MVMuint32 op_i; for (op_i = 1; op_i < thePHI->info->num_operands; op_i++) { MVM_spesh_get_and_use_facts(tc, g, thePHI->operands[op_i]); } } } /* Obtains a string constant. */ MVMString * MVM_spesh_get_string(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return g->sf->body.cu->body.strings[o.lit_str_idx]; } /* Copy facts between two register operands. */ static void copy_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand to, MVMSpeshOperand from) { MVMSpeshFacts *tfacts = get_facts_direct(tc, g, to); MVMSpeshFacts *ffacts = get_facts_direct(tc, g, from); tfacts->flags = ffacts->flags; tfacts->type = ffacts->type; tfacts->decont_type = ffacts->decont_type; tfacts->value = ffacts->value; tfacts->log_guard = ffacts->log_guard; } /* Adds a value into a spesh slot and returns its index. * If a spesh slot already holds this value, return that instead */ MVMint16 MVM_spesh_add_spesh_slot_try_reuse(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c) { MVMint16 prev_slot; for (prev_slot = 0; prev_slot < g->num_spesh_slots; prev_slot++) { if (g->spesh_slots[prev_slot] == c) return prev_slot; } return MVM_spesh_add_spesh_slot(tc, g, c); } /* Adds a value into a spesh slot and returns its index. */ MVMint16 MVM_spesh_add_spesh_slot(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c) { if (g->num_spesh_slots >= g->alloc_spesh_slots) { g->alloc_spesh_slots += 8; if (g->spesh_slots) g->spesh_slots = MVM_realloc(g->spesh_slots, g->alloc_spesh_slots * sizeof(MVMCollectable *)); else g->spesh_slots = MVM_malloc(g->alloc_spesh_slots * sizeof(MVMCollectable *)); } g->spesh_slots[g->num_spesh_slots] = c; return g->num_spesh_slots++; } static void optimize_repr_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 type_operand); static void optimize_findmeth_s_perhaps_constant(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *name_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); if (name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { if (name_facts->writer && name_facts->writer->info->opcode == MVM_OP_const_s) { name_facts->usages--; ins->info = MVM_op_get_op(MVM_OP_findmeth); ins->operands[2].lit_i64 = 0; ins->operands[2].lit_str_idx = name_facts->writer->operands[1].lit_str_idx; MVM_spesh_use_facts(tc, g, name_facts); } } } /* Performs optimization on a method lookup. If we know the type that we'll * be dispatching on, resolve it right off. If not, add a cache. */ static void optimize_method_lookup(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { /* See if we can resolve the method right off due to knowing the type. */ MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMint32 resolved = 0; if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { /* Try to resolve. */ MVMString *name = MVM_spesh_get_string(tc, g, ins->operands[2]); MVMObject *meth = MVM_6model_find_method_cache_only(tc, obj_facts->type, name); if (!MVM_is_null(tc, meth)) { /* Could compile-time resolve the method. Add it in a spesh slot. */ MVMint16 ss = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)meth); /* Tweak facts for the target, given we know the method. */ MVMSpeshFacts *meth_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); meth_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; meth_facts->value.o = meth; /* Update the instruction to grab the spesh slot. */ ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = ss; resolved = 1; MVM_spesh_use_facts(tc, g, obj_facts); obj_facts->usages--; } } /* If not, add space to cache a single type/method pair, to save hash * lookups in the (common) monomorphic case, and rewrite to caching * version of the instruction. */ if (!resolved) { MVMSpeshOperand *orig_o = ins->operands; ins->info = MVM_op_get_op(MVM_OP_sp_findmeth); ins->operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); memcpy(ins->operands, orig_o, 3 * sizeof(MVMSpeshOperand)); ins->operands[3].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, NULL); MVM_spesh_add_spesh_slot(tc, g, NULL); } } /* Sees if we can resolve an istype at compile time. */ static void optimize_istype(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMSpeshFacts *type_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); MVMSpeshFacts *result_facts; if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMint32 result; if (!MVM_6model_try_cache_type_check(tc, obj_facts->type, type_facts->type, &result)) return; ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; ins->operands[1].lit_i16 = result; result_facts->value.i = result; obj_facts->usages--; type_facts->usages--; MVM_spesh_use_facts(tc, g, obj_facts); MVM_spesh_use_facts(tc, g, type_facts); } } static void optimize_is_reprid(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMuint32 wanted_repr_id; MVMuint64 result_value; if (!(obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) { return; } switch (ins->info->opcode) { case MVM_OP_islist: wanted_repr_id = MVM_REPR_ID_MVMArray; break; case MVM_OP_ishash: wanted_repr_id = MVM_REPR_ID_MVMHash; break; case MVM_OP_isint: wanted_repr_id = MVM_REPR_ID_P6int; break; case MVM_OP_isnum: wanted_repr_id = MVM_REPR_ID_P6num; break; case MVM_OP_isstr: wanted_repr_id = MVM_REPR_ID_P6str; break; default: return; } MVM_spesh_use_facts(tc, g, obj_facts); result_value = REPR(obj_facts->type)->ID == wanted_repr_id; if (result_value == 0) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); ins->operands[1].lit_i16 = 0; result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = 0; } else { ins->info = MVM_op_get_op(MVM_OP_isnonnull); } } static void optimize_gethow(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMObject *how_obj = NULL; if (obj_facts->flags & (MVM_SPESH_FACT_KNOWN_TYPE)) { how_obj = MVM_6model_get_how(tc, STABLE(obj_facts->type)); } /* There may be other valid ways to get the facts (known value?) */ if (how_obj) { MVMSpeshFacts *how_facts; /* Transform gethow lookup to spesh slot lookup */ MVMint16 spesh_slot = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable*)how_obj); MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = spesh_slot; /* Store facts about the value in the write operand */ how_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); how_facts->flags |= (MVM_SPESH_FACT_KNOWN_VALUE | MVM_SPESH_FACT_KNOWN_TYPE); how_facts->value.o = how_obj; how_facts->type = STABLE(how_obj)->WHAT; } } /* Sees if we can resolve an isconcrete at compile time. */ static void optimize_isconcrete(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & (MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_TYPEOBJ)) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = obj_facts->flags & MVM_SPESH_FACT_CONCRETE ? 1 : 0; ins->operands[1].lit_i16 = result_facts->value.i; MVM_spesh_use_facts(tc, g, obj_facts); obj_facts->usages--; } } static void optimize_exception_ops(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMuint16 op = ins->info->opcode; if (op == MVM_OP_newexception) { MVMSpeshOperand target = ins->operands[0]; MVMObject *type = tc->instance->boot_types.BOOTException; MVMSTable *st = STABLE(type); ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = st->size; ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); } else { MVMSpeshFacts *target_facts; /* XXX This currently still causes problems. */ return; /* switch (op) { case MVM_OP_bindexmessage: case MVM_OP_bindexpayload: { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand value = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(op == MVM_OP_bindexmessage ? MVM_OP_sp_bind_s : MVM_OP_sp_bind_o); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = op == MVM_OP_bindexmessage ? offsetof(MVMException, body.message) : offsetof(MVMException, body.payload); ins->operands[2] = value; break; } case MVM_OP_bindexcategory: { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand category = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(MVM_OP_sp_bind_i32); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = offsetof(MVMException, body.category); ins->operands[2] = category; break; } case MVM_OP_getexmessage: case MVM_OP_getexpayload: { MVMSpeshOperand destination = ins->operands[0]; MVMSpeshOperand target = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(op == MVM_OP_getexmessage ? MVM_OP_sp_get_s : MVM_OP_sp_get_o); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = destination; ins->operands[1] = target; ins->operands[2].lit_i16 = op == MVM_OP_getexmessage ? offsetof(MVMException, body.message) : offsetof(MVMException, body.payload); break; } case MVM_OP_getexcategory: { MVMSpeshOperand destination = ins->operands[0]; MVMSpeshOperand target = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(MVM_OP_sp_get_i32); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = destination; ins->operands[1] = target; ins->operands[2].lit_i16 = offsetof(MVMException, body.category); break; } } */ } } /* iffy ops that operate on a known value register can turn into goto * or be dropped. */ static void optimize_iffy(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMSpeshBB *bb) { MVMSpeshFacts *flag_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); MVMuint8 negated_op; MVMuint8 truthvalue; switch (ins->info->opcode) { case MVM_OP_if_i: case MVM_OP_if_s: case MVM_OP_if_n: case MVM_OP_if_o: case MVM_OP_ifnonnull: negated_op = 0; break; case MVM_OP_unless_i: case MVM_OP_unless_s: case MVM_OP_unless_n: case MVM_OP_unless_o: negated_op = 1; break; default: return; } if (flag_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { switch (ins->info->opcode) { case MVM_OP_if_i: case MVM_OP_unless_i: truthvalue = flag_facts->value.i; break; case MVM_OP_if_o: case MVM_OP_unless_o: { MVMObject *objval = flag_facts->value.o; MVMBoolificationSpec *bs = objval->st->boolification_spec; MVMRegister resultreg; switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_UNBOX_INT: case MVM_BOOL_MODE_UNBOX_NUM: case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY: case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO: case MVM_BOOL_MODE_BIGINT: case MVM_BOOL_MODE_ITER: case MVM_BOOL_MODE_HAS_ELEMS: case MVM_BOOL_MODE_NOT_TYPE_OBJECT: MVM_coerce_istrue(tc, objval, &resultreg, NULL, NULL, 0); truthvalue = resultreg.i64; break; case MVM_BOOL_MODE_CALL_METHOD: default: return; } break; } case MVM_OP_if_n: case MVM_OP_unless_n: truthvalue = flag_facts->value.n != 0.0; break; default: return; } MVM_spesh_use_facts(tc, g, flag_facts); flag_facts->usages--; truthvalue = truthvalue ? 1 : 0; if (truthvalue != negated_op) { /* this conditional can be turned into an unconditional jump */ ins->info = MVM_op_get_op(MVM_OP_goto); ins->operands[0] = ins->operands[1]; /* since we have an unconditional jump now, we can remove the successor * that's in the linear_next */ MVM_spesh_manipulate_remove_successor(tc, bb, bb->linear_next); } else { /* this conditional can be dropped completely */ MVM_spesh_manipulate_remove_successor(tc, bb, ins->operands[1].ins_bb); MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } return; } /* Sometimes our code-gen ends up boxing an integer and immediately * calling if_o or unless_o on it. If we if_i/unless_i/... instead, * we can get rid of the unboxing and perhaps the boxing as well. */ if ((ins->info->opcode == MVM_OP_if_o || ins->info->opcode == MVM_OP_unless_o) && flag_facts->flags & MVM_SPESH_FACT_KNOWN_BOX_SRC && flag_facts->writer) { /* We may have to go through several layers of set instructions to find * the proper writer. */ MVMSpeshIns *cur = flag_facts->writer; while (cur && cur->info->opcode == MVM_OP_set) { cur = MVM_spesh_get_facts(tc, g, cur->operands[1])->writer; } if (cur) { MVMSpeshIns *safety_cur; MVMuint8 orig_operand_type = cur->info->operands[1] & MVM_operand_type_mask; MVMuint8 succ = 0; /* now we have to be extra careful. any operation that writes to * our "unboxed flag" register (in any register version) will be * trouble. Also, we'd have to take more care with PHI nodes, * which we'll just consider immediate failure for now. */ safety_cur = ins; while (safety_cur) { if (safety_cur == cur) { /* If we've made it to here without finding anything * dangerous, we can consider this optimization * a winner. */ break; } if (safety_cur->info->opcode == MVM_SSA_PHI) { /* Oh dear god in heaven! A PHI! */ safety_cur = NULL; break; } if (((safety_cur->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg) && (safety_cur->operands[0].reg.orig == cur->operands[1].reg.orig)) { /* Someone's clobbering our register between the boxing and * our attempt to unbox it. we shall give up. * Maybe in the future we can be clever/sneaky and use * some other register for bridging the gap? */ safety_cur = NULL; break; } safety_cur = safety_cur->prev; } if (safety_cur) { switch (orig_operand_type) { case MVM_operand_int64: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_i : MVM_OP_if_i); succ = 1; break; case MVM_operand_num64: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_n : MVM_OP_if_n); succ = 1; break; case MVM_operand_str: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_s : MVM_OP_if_s); succ = 1; break; } if (succ) { ins->operands[0] = cur->operands[1]; flag_facts->usages--; MVM_spesh_get_and_use_facts(tc, g, cur->operands[1])->usages++; optimize_iffy(tc, g, ins, bb); return; } } } } if (flag_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && flag_facts->type) { if (ins->info->opcode == MVM_OP_if_o || ins->info->opcode == MVM_OP_unless_o) { MVMObject *type = flag_facts->type; MVMBoolificationSpec *bs = type->st->boolification_spec; MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMuint8 guaranteed_concrete = flag_facts->flags & MVM_SPESH_FACT_CONCRETE; switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_ITER: if (!guaranteed_concrete) return; if (flag_facts->flags & MVM_SPESH_FACT_ARRAY_ITER) { new_ins->info = MVM_op_get_op(MVM_OP_sp_boolify_iter_arr); } else if (flag_facts->flags & MVM_SPESH_FACT_HASH_ITER) { new_ins->info = MVM_op_get_op(MVM_OP_sp_boolify_iter_hash); } else { new_ins->info = MVM_op_get_op(MVM_OP_sp_boolify_iter); } break; case MVM_BOOL_MODE_UNBOX_INT: if (!guaranteed_concrete) return; new_ins->info = MVM_op_get_op(MVM_OP_unbox_i); break; /* we need to change the register type for our temporary register for this. case MVM_BOOL_MODE_UNBOX_NUM: new_ins->info = MVM_op_get_op(MVM_OP_unbox_i); break; */ case MVM_BOOL_MODE_BIGINT: if (!guaranteed_concrete) return; new_ins->info = MVM_op_get_op(MVM_OP_bool_I); break; case MVM_BOOL_MODE_HAS_ELEMS: if (!guaranteed_concrete) return; new_ins->info = MVM_op_get_op(MVM_OP_elems); break; case MVM_BOOL_MODE_NOT_TYPE_OBJECT: new_ins->info = MVM_op_get_op(MVM_OP_isconcrete); break; default: return; } operands[0] = temp; operands[1] = ins->operands[0]; new_ins->operands = operands; ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_i : MVM_OP_if_i); ins->operands[0] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, new_ins); MVM_spesh_get_facts(tc, g, temp)->usages++; MVM_spesh_use_facts(tc, g, flag_facts); MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } else { return; } } else { return; } } /* objprimspec can be done at spesh-time if we know the type of something. * Another thing is, that if we rely on the type being known, we'll be assured * we'll have a guard that promises the object in question to be non-null. */ static void optimize_objprimspec(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = REPR(obj_facts->type)->get_storage_spec(tc, STABLE(obj_facts->type))->boxed_primitive; ins->operands[1].lit_i16 = result_facts->value.i; MVM_spesh_use_facts(tc, g, obj_facts); obj_facts->usages--; } } /* Optimizes a hllize instruction away if the type is known and already in the * right HLL, by turning it into a set. */ static void optimize_hllize(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { if (STABLE(obj_facts->type)->hll_owner == g->sf->body.cu->body.hll_config) { ins->info = MVM_op_get_op(MVM_OP_set); MVM_spesh_use_facts(tc, g, obj_facts); copy_facts(tc, g, ins->operands[0], ins->operands[1]); } } } /* Turns a decont into a set, if we know it's not needed. Also make sure we * propagate any needed information. */ static void optimize_decont(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & (MVM_SPESH_FACT_DECONTED | MVM_SPESH_FACT_TYPEOBJ)) { ins->info = MVM_op_get_op(MVM_OP_set); MVM_spesh_use_facts(tc, g, obj_facts); copy_facts(tc, g, ins->operands[0], ins->operands[1]); } else { MVMSpeshFacts *res_facts; if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { MVMSTable *stable = STABLE(obj_facts->type); MVMContainerSpec const *contspec = stable->container_spec; if (contspec && contspec->fetch_never_invokes && contspec->spesh) { contspec->spesh(tc, stable, g, bb, ins); } } MVM_spesh_use_facts(tc, g, obj_facts); res_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { res_facts->type = obj_facts->decont_type; res_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; } if (obj_facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) res_facts->flags |= MVM_SPESH_FACT_CONCRETE; else if (obj_facts->flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) res_facts->flags |= MVM_SPESH_FACT_TYPEOBJ; } } /* Checks like iscont, iscont_[ins] and isrwcont can be done at spesh time */ static void optimize_container_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { if (ins->info->opcode == MVM_OP_isrwcont) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (facts->flags & MVM_SPESH_FACT_RW_CONT) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = 1; ins->operands[1].lit_i16 = 1; MVM_spesh_use_facts(tc, g, facts); facts->usages--; } } } /* Optimize away assertparamcheck if we know it will pass. */ static void optimize_assertparamcheck(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); if (facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && facts->value.i) { MVM_spesh_use_facts(tc, g, facts); facts->usages--; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } } static void optimize_can_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* This used to cause problems, Spesh: failed to fix up handlers (-1, 110, 110) */ MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMString *method_name; MVMint64 can_result; if (ins->info->opcode == MVM_OP_can_s) { MVMSpeshFacts *name_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); if (!(name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE)) { return; } method_name = name_facts->value.s; name_facts->usages--; ins->info = MVM_op_get_op(MVM_OP_can); ins->operands[2].lit_str_idx = name_facts->writer->operands[1].lit_str_idx; } else { method_name = MVM_spesh_get_string(tc, g, ins->operands[2]); } if (!(obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !obj_facts->type) { return; } if (MVM_is_null(tc, obj_facts->type)) can_result = 0; /* VMNull can't have any methods. */ else can_result = MVM_6model_can_method_cache_only(tc, obj_facts->type, method_name); if (can_result == -1) { return; } else { MVMSpeshFacts *result_facts; if (ins->info->opcode == MVM_OP_can_s) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; ins->operands[1].lit_i16 = can_result; result_facts->value.i = can_result; obj_facts->usages--; MVM_spesh_use_facts(tc, g, obj_facts); } } /* If we have a const_i and a coerce_in, we can emit a const_n instead. */ static void optimize_coerce(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); MVMnum64 result = facts->value.i; MVM_spesh_use_facts(tc, g, facts); facts->usages--; ins->info = MVM_op_get_op(MVM_OP_const_n64); ins->operands[1].lit_n64 = result; result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.n = result; } } /* If we know the type of a significant operand, we might try to specialize by * representation. */ static void optimize_repr_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 type_operand) { /* Immediately mark guards as used, as the JIT would like to devirtualize * repr ops later and we don't want guards to be thrown out before that */ MVMSpeshFacts *facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[type_operand]); if (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && facts->type) if (REPR(facts->type)->spesh) { REPR(facts->type)->spesh(tc, STABLE(facts->type), g, bb, ins); MVM_spesh_use_facts(tc, g, facts); } } /* smrt_strify and smrt_numify can turn into unboxes, but at least * for smrt_numify it's "complicated". Also, later when we know how * to put new invocations into spesh'd code, we could make direct * invoke calls to the .Str and .Num methods. */ static void optimize_smart_coerce(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMuint16 is_strify = ins->info->opcode == MVM_OP_smrt_strify; if (facts->flags & (MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE) && facts->type) { const MVMStorageSpec *ss; MVMint64 can_result; ss = REPR(facts->type)->get_storage_spec(tc, STABLE(facts->type)); if (is_strify && ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { MVM_spesh_use_facts(tc, g, facts); ins->info = MVM_op_get_op(MVM_OP_unbox_s); /* And now that we have a repr op, we can try to optimize * it even further. */ optimize_repr_op(tc, g, bb, ins, 1); return; } can_result = MVM_6model_can_method_cache_only(tc, facts->type, is_strify ? tc->instance->str_consts.Str : tc->instance->str_consts.Num); if (can_result == -1) { /* Couldn't safely figure out if the type has a Str method or not. */ return; } else if (can_result == 0) { MVM_spesh_use_facts(tc, g, facts); /* We can't .Str this object, so we'll duplicate the "guessing" * logic from smrt_strify here to remove indirection. */ if (is_strify && REPR(facts->type)->ID == MVM_REPR_ID_MVMException) { MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 3); MVMSpeshOperand *old_opers = ins->operands; ins->info = MVM_op_get_op(MVM_OP_sp_get_s); ins->operands = operands; operands[0] = old_opers[0]; operands[1] = old_opers[1]; operands[2].lit_i16 = offsetof( MVMException, body.message ); } else if(ss->can_box & (MVM_STORAGE_SPEC_CAN_BOX_NUM | MVM_STORAGE_SPEC_CAN_BOX_INT)) { MVMuint16 register_type = ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT ? MVM_reg_int64 : MVM_reg_num64; MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, register_type); MVMSpeshOperand orig_dst = ins->operands[0]; ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_unbox_n : MVM_OP_unbox_i); ins->operands[0] = temp; if (is_strify) new_ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_coerce_ns : MVM_OP_coerce_is); else new_ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_set : MVM_OP_coerce_in); new_ins->operands = operands; operands[0] = orig_dst; operands[1] = temp; /* We can directly "eliminate" a set instruction here. */ if (new_ins->info->opcode != MVM_OP_set) { MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); MVM_spesh_get_facts(tc, g, temp)->usages++; } else { ins->operands[0] = orig_dst; } /* Finally, let's try to optimize the unboxing REPROp. */ optimize_repr_op(tc, g, bb, ins, 1); /* And as a last clean-up step, we release the temporary register. */ MVM_spesh_manipulate_release_temp_reg(tc, g, temp); return; } else if (!is_strify && (REPR(facts->type)->ID == MVM_REPR_ID_MVMArray || (REPR(facts->type)->ID == MVM_REPR_ID_MVMHash))) { /* A smrt_numify on an array or hash can be replaced by an * elems operation, that can then be optimized by our * versatile and dilligent friend optimize_repr_op. */ MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); MVMSpeshOperand orig_dst = ins->operands[0]; ins->info = MVM_op_get_op(MVM_OP_elems); ins->operands[0] = temp; new_ins->info = MVM_op_get_op(MVM_OP_coerce_in); new_ins->operands = operands; operands[0] = orig_dst; operands[1] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); optimize_repr_op(tc, g, bb, ins, 1); MVM_spesh_get_facts(tc, g, temp)->usages++; MVM_spesh_manipulate_release_temp_reg(tc, g, temp); return; } } else if (can_result == 1) { /* When we know how to generate additional callsites, we could * make an invocation to .Str or .Num here and perhaps have it * in-lined. */ } } } /* boolification has a major indirection, which we can spesh away. * Afterwards, we may be able to spesh even further, so we defer * to other optimization methods. */ static void optimize_istrue_isfalse(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMuint8 negated_op; MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (ins->info->opcode == MVM_OP_istrue) { negated_op = 0; } else if (ins->info->opcode == MVM_OP_isfalse) { negated_op = 1; } else { return; } /* Let's try to figure out the boolification spec. */ if (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMBoolificationSpec *bs = STABLE(facts->type)->boolification_spec; MVMSpeshOperand orig = ins->operands[0]; MVMSpeshOperand temp; if (negated_op) temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_UNBOX_INT: /* We can just unbox the int and pretend it's a bool. */ ins->info = MVM_op_get_op(MVM_OP_unbox_i); if (negated_op) ins->operands[0] = temp; /* And then we might be able to optimize this even further. */ optimize_repr_op(tc, g, bb, ins, 1); break; case MVM_BOOL_MODE_NOT_TYPE_OBJECT: /* This is the same as isconcrete. */ ins->info = MVM_op_get_op(MVM_OP_isconcrete); if (negated_op) ins->operands[0] = temp; /* And now defer another bit of optimization */ optimize_isconcrete(tc, g, ins); break; /* TODO implement MODE_UNBOX_NUM and the string ones */ default: return; } /* Now we can take care of the negation. */ if (negated_op) { MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMSpeshFacts *res_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); /* This is a bit naughty with regards to the SSA form, but * we'll hopefully get away with it until we have a proper * way to get new registers crammed in the middle of things */ new_ins->info = MVM_op_get_op(MVM_OP_not_i); new_ins->operands = operands; operands[0] = orig; operands[1] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); MVM_spesh_get_facts(tc, g, temp)->usages++; /* If there's a known value, update the fact. */ if (res_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) res_facts->value.i = !res_facts->value.i; MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } MVM_spesh_use_facts(tc, g, facts); } } /* Checks if we have specialized on the invocant - useful to know for some * optimizations. */ static MVMint32 specialized_on_invocant(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMint32 i; for (i = 0; i < g->num_arg_guards; i++) if (g->arg_guards[i].slot == 0) return 1; return 0; } /* Optimizes away a lexical lookup when we know the value won't change from * the logged one. */ static void optimize_getlex_known(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* Ensure we have a log instruction following this one. */ if (ins->next && ins->next->info->opcode == MVM_OP_sp_log) { /* Locate logged object. */ MVMuint16 log_slot = ins->next->operands[1].lit_i16 * MVM_SPESH_LOG_RUNS; MVMCollectable *log_obj = g->log_slots[log_slot]; if (log_obj) { MVMSpeshFacts *facts; /* Place in a spesh slot. */ MVMuint16 ss = MVM_spesh_add_spesh_slot_try_reuse(tc, g, log_obj); /* Delete logging instruction. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins->next); /* Transform lookup instruction into spesh slot read. */ MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = ss; /* Set up facts. */ facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_KNOWN_VALUE; facts->type = STABLE(log_obj)->WHAT; facts->value.o = (MVMObject *)log_obj; if (IS_CONCRETE(log_obj)) { facts->flags |= MVM_SPESH_FACT_CONCRETE; if (!STABLE(log_obj)->container_spec) facts->flags |= MVM_SPESH_FACT_DECONTED; } else { facts->flags |= MVM_SPESH_FACT_TYPEOBJ; } } } } /* Determines if there's a matching spesh candidate for a callee and a given * set of argument info. */ static MVMint32 try_find_spesh_candidate(MVMThreadContext *tc, MVMCode *code, MVMSpeshCallInfo *arg_info) { MVMStaticFrameBody *sfb = &(code->body.sf->body); MVMint32 num_spesh = sfb->num_spesh_candidates; MVMint32 i, j; for (i = 0; i < num_spesh; i++) { MVMSpeshCandidate *cand = &sfb->spesh_candidates[i]; if (cand->cs == arg_info->cs) { /* Matching callsite, now see if we have enough information to * test the guards. */ MVMint32 guard_failed = 0; for (j = 0; j < cand->num_guards; j++) { MVMint32 slot = cand->guards[j].slot; MVMSpeshFacts *facts = slot < MAX_ARGS_FOR_OPT ? arg_info->arg_facts[slot] : NULL; MVMSTable *want_st = (MVMSTable *)cand->guards[j].match; if (!facts) { guard_failed = 1; break; } switch (cand->guards[j].kind) { case MVM_SPESH_GUARD_CONC: if (!(facts->flags & MVM_SPESH_FACT_CONCRETE) || !(facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || STABLE(facts->type) != want_st) guard_failed = 1; break; case MVM_SPESH_GUARD_TYPE: if (!(facts->flags & MVM_SPESH_FACT_TYPEOBJ) || !(facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || STABLE(facts->type) != want_st) guard_failed = 1; break; case MVM_SPESH_GUARD_DC_CONC: if (!(facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) || !(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) || STABLE(facts->decont_type) != want_st) guard_failed = 1; break; case MVM_SPESH_GUARD_DC_TYPE: if (!(facts->flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) || !(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) || STABLE(facts->decont_type) != want_st) guard_failed = 1; break; case MVM_SPESH_GUARD_DC_CONC_RW: if (!(facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) || !(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) || STABLE(facts->decont_type) != want_st || !(facts->flags & MVM_SPESH_FACT_RW_CONT)) guard_failed = 1; break; case MVM_SPESH_GUARD_DC_TYPE_RW: if (!(facts->flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) || !(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) || STABLE(facts->decont_type) != want_st || !(facts->flags & MVM_SPESH_FACT_RW_CONT)) guard_failed = 1; break; default: guard_failed = 1; break; } if (guard_failed) break; } if (!guard_failed) return i; } } return -1; } /* Drives optimization of a call. */ static void optimize_call(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 callee_idx, MVMSpeshCallInfo *arg_info) { /* Ensure we know what we're going to be invoking. */ MVMSpeshFacts *callee_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[callee_idx]); if (callee_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { MVMObject *code = callee_facts->value.o; MVMObject *target = NULL; if (REPR(code)->ID == MVM_REPR_ID_MVMCode) { /* Already have a code object we know we'll call. */ target = code; } else if (STABLE(code)->invocation_spec) { /* What kind of invocation will it be? */ MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!MVM_is_null(tc, is->md_class_handle)) { /* Multi-dispatch. Check if this is a dispatch where we can * use the cache directly. */ MVMRegister dest; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_valid_attr_name, is->md_valid_hint, &dest, MVM_reg_int64); if (dest.i64) { /* Yes. Try to obtain the cache. */ REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_cache_attr_name, is->md_cache_hint, &dest, MVM_reg_obj); if (!MVM_is_null(tc, dest.o)) { MVMObject *found = MVM_multi_cache_find_spesh(tc, dest.o, arg_info); if (found) { /* Found it. Is it a code object already, or do we * have futher unpacking to do? */ if (REPR(found)->ID == MVM_REPR_ID_MVMCode) { target = found; } else if (STABLE(found)->invocation_spec) { MVMInvocationSpec *m_is = STABLE(found)->invocation_spec; if (!MVM_is_null(tc, m_is->class_handle)) { REPR(found)->attr_funcs.get_attribute(tc, STABLE(found), found, OBJECT_BODY(found), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); if (REPR(dest.o)->ID == MVM_REPR_ID_MVMCode) target = dest.o; } } } } } } else if (!MVM_is_null(tc, is->class_handle)) { /* Single dispatch; retrieve the code object. */ MVMRegister dest; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); if (REPR(dest.o)->ID == MVM_REPR_ID_MVMCode) target = dest.o; } } /* If we resolved to something better than the code object, then add * the resolved item in a spesh slot and insert a lookup. */ if (target && target != code && !((MVMCode *)target)->body.is_compiler_stub) { MVMSpeshIns *pa_ins = arg_info->prepargs_ins; MVMSpeshIns *ss_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ss_ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ss_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); ss_ins->operands[0] = ins->operands[callee_idx]; ss_ins->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)target); /* Basically, we're inserting between arg* and invoke_*. * Since invoke_* directly uses the code in the register, * the register must have held the code during the arg* * instructions as well, because none of {prepargs, arg*} * can manipulate the register that holds the code. * * To make a long story very short, I think it should be * safe to move the sp_getspeshslot to /before/ the * prepargs instruction. And this is very convenient for * me, as it allows me to treat set of prepargs, arg*, * invoke, as a /single node/, and this greatly simplifies * invoke JIT compilation */ MVM_spesh_manipulate_insert_ins(tc, bb, pa_ins->prev, ss_ins); /* XXX TODO: Do this differently so we can eliminate the original * lookup of the enclosing code object also. */ } /* See if we can point the call at a particular specialization. */ if (target && ((MVMCode *)target)->body.sf->body.instrumentation_level == tc->instance->instrumentation_level) { MVMCode *target_code = (MVMCode *)target; MVMint32 spesh_cand = try_find_spesh_candidate(tc, target_code, arg_info); if (spesh_cand >= 0) { /* Yes. Will we be able to inline? */ MVMSpeshGraph *inline_graph = MVM_spesh_inline_try_get_graph(tc, g, target_code, &target_code->body.sf->body.spesh_candidates[spesh_cand]); if (inline_graph) { /* Yes, have inline graph, so go ahead and do it. */ /*char *c_name_i = MVM_string_utf8_encode_C_string(tc, target_code->body.sf->body.name); char *c_cuid_i = MVM_string_utf8_encode_C_string(tc, target_code->body.sf->body.cuuid); char *c_name_t = MVM_string_utf8_encode_C_string(tc, g->sf->body.name); char *c_cuid_t = MVM_string_utf8_encode_C_string(tc, g->sf->body.cuuid); printf("Can inline %s (%s) into %s (%s)\n", c_name_i, c_cuid_i, c_name_t, c_cuid_t); MVM_free(c_name_i); MVM_free(c_cuid_i); MVM_free(c_name_t); MVM_free(c_cuid_t);*/ MVM_spesh_inline(tc, g, arg_info, bb, ins, inline_graph, target_code); } else { /* Can't inline, so just identify candidate. */ MVMSpeshOperand *new_operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); if (ins->info->opcode == MVM_OP_invoke_v) { new_operands[0] = ins->operands[0]; new_operands[1].lit_i16 = spesh_cand; ins->operands = new_operands; ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_v); } else { new_operands[0] = ins->operands[0]; new_operands[1] = ins->operands[1]; new_operands[2].lit_i16 = spesh_cand; ins->operands = new_operands; switch (ins->info->opcode) { case MVM_OP_invoke_i: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_i); break; case MVM_OP_invoke_n: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_n); break; case MVM_OP_invoke_s: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_s); break; case MVM_OP_invoke_o: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_o); break; default: MVM_oops(tc, "Spesh: unhandled invoke instruction"); } } } } } } } /* Optimizes an extension op. */ static void optimize_extop(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { /* Found op; call its spesh function, if any. */ if (extops[i].spesh) extops[i].spesh(tc, g, bb, ins); return; } } } /* Tries to optimize a throwcat instruction. Note that within a given frame * (we don't consider inlines here) the throwcat instructions all have the * same semantics. */ static void optimize_throwcat(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* First, see if we have any goto handlers for this category. */ MVMint32 *handlers_found = MVM_malloc(g->sf->body.num_handlers * sizeof(MVMint32)); MVMint32 num_found = 0; MVMuint32 category = (MVMuint32)ins->operands[1].lit_i64; MVMint32 i; for (i = 0; i < g->sf->body.num_handlers; i++) if (g->sf->body.handlers[i].action == MVM_EX_ACTION_GOTO) if (g->sf->body.handlers[i].category_mask & category) handlers_found[num_found++] = i; /* If we found any appropriate handlers, we'll now do a scan through the * graph to see if we're in the scope of any of them. Note we can't keep * track of this in optimize_bb as it walks the dominance children, but * we need a linear view. */ if (num_found) { MVMint32 *in_handlers = MVM_calloc(g->sf->body.num_handlers, sizeof(MVMint32)); MVMSpeshBB **goto_bbs = MVM_calloc(g->sf->body.num_handlers, sizeof(MVMSpeshBB *)); MVMSpeshBB *search_bb = g->entry; MVMint32 picked = -1; while (search_bb && !search_bb->inlined) { MVMSpeshIns *search_ins = search_bb->first_ins; while (search_ins) { /* Track handlers. */ MVMSpeshAnn *ann = search_ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: in_handlers[ann->data.frame_handler_index] = 1; break; case MVM_SPESH_ANN_FH_END: in_handlers[ann->data.frame_handler_index] = 0; break; case MVM_SPESH_ANN_FH_GOTO: if (ann->data.frame_handler_index < g->sf->body.num_handlers) { goto_bbs[ann->data.frame_handler_index] = search_bb; if (picked >= 0 && ann->data.frame_handler_index == picked) goto search_over; } break; } ann = ann->next; } /* Is this instruction the one we're trying to optimize? */ if (search_ins == ins) { /* See if we're in any acceptable handler (rely on the * table being pre-sorted by nesting depth here, just like * normal exception handler search does). */ for (i = 0; i < num_found; i++) { if (in_handlers[handlers_found[i]]) { /* Got it! If we already found its goto target, we * can finish the search. */ picked = handlers_found[i]; if (goto_bbs[picked]) goto search_over; break; } } } search_ins = search_ins->next; } search_bb = search_bb->linear_next; } search_over: /* If we picked a handler and know where it should goto, we can do the * rewrite into a goto. */ if (picked >=0 && goto_bbs[picked]) { ins->info = MVM_op_get_op(MVM_OP_goto); ins->operands[0].ins_bb = goto_bbs[picked]; bb->succ[0] = goto_bbs[picked]; } MVM_free(in_handlers); MVM_free(goto_bbs); } MVM_free(handlers_found); } static void analyze_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint32 operand; MVMint32 common_flags; MVMObject *common_type; MVMObject *common_decont_type; MVMuint32 needs_merged_with_log_guard = 0; MVMSpeshFacts *target_facts = get_facts_direct(tc, g, ins->operands[0]); common_flags = get_facts_direct(tc, g, ins->operands[1])->flags; common_type = get_facts_direct(tc, g, ins->operands[1])->type; common_decont_type = get_facts_direct(tc, g, ins->operands[1])->decont_type; needs_merged_with_log_guard = common_flags & MVM_SPESH_FACT_FROM_LOG_GUARD; for(operand = 2; operand < ins->info->num_operands; operand++) { common_flags = common_flags & get_facts_direct(tc, g, ins->operands[operand])->flags; common_type = common_type == get_facts_direct(tc, g, ins->operands[operand])->type && common_type ? common_type : NULL; common_decont_type = common_decont_type == get_facts_direct(tc, g, ins->operands[operand])->decont_type && common_decont_type ? common_decont_type : NULL; /* We have to be a bit more careful if one or more of the facts we're * merging came from a log guard, as that means we'll have to propagate * the information what guards have been relied upon back "outwards" * through the PHI node we've merged stuff with. */ if (get_facts_direct(tc, g, ins->operands[operand])->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) needs_merged_with_log_guard = 1; } if (common_flags) { /*fprintf(stderr, "at a PHI node of %d operands: ", ins->info->num_operands);*/ if (common_flags & MVM_SPESH_FACT_KNOWN_TYPE) { /*fprintf(stderr, "type ");*/ if (common_type) { /*fprintf(stderr, "(same type) ");*/ target_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; target_facts->type = common_type; } /*else fprintf(stderr, "(diverging type) ");*/ } /*if (common_flags & MVM_SPESH_FACT_KNOWN_VALUE) fprintf(stderr, "value ");*/ if (common_flags & MVM_SPESH_FACT_DECONTED) { /*fprintf(stderr, "deconted ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONTED; } if (common_flags & MVM_SPESH_FACT_CONCRETE) { /*fprintf(stderr, "concrete ");*/ target_facts->flags |= MVM_SPESH_FACT_CONCRETE; } if (common_flags & MVM_SPESH_FACT_TYPEOBJ) { /*fprintf(stderr, "type_object ");*/ } if (common_flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { /*fprintf(stderr, "decont_type ");*/ if (common_decont_type) { /*fprintf(stderr, "(same type) ");*/ target_facts->flags |= MVM_SPESH_FACT_KNOWN_DECONT_TYPE; target_facts->decont_type = common_decont_type; } /*else fprintf(stderr, "(diverging type) ");*/ } if (common_flags & MVM_SPESH_FACT_DECONT_CONCRETE) { /*fprintf(stderr, "decont_concrete ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONT_CONCRETE; } if (common_flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) { /*fprintf(stderr, "decont_typeobj ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; } if (common_flags & MVM_SPESH_FACT_RW_CONT) { /*fprintf(stderr, "rw_cont ");*/ target_facts->flags |= MVM_SPESH_FACT_RW_CONT; } /*if (common_flags & MVM_SPESH_FACT_FROM_LOG_GUARD) fprintf(stderr, "from_log_guard ");*/ /*if (common_flags & MVM_SPESH_FACT_HASH_ITER) fprintf(stderr, "hash_iter ");*/ /*if (common_flags & MVM_SPESH_FACT_ARRAY_ITER) fprintf(stderr, "array_iter ");*/ /*if (common_flags & MVM_SPESH_FACT_KNOWN_BOX_SRC) fprintf(stderr, "box_source ");*/ /*fprintf(stderr, "\n");*/ if (needs_merged_with_log_guard) { target_facts->flags |= MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD; } } else { /*fprintf(stderr, "a PHI node of %d operands had no intersecting flags\n", ins->info->num_operands);*/ return; } } /* Visits the blocks in dominator tree order, recursively. */ static void optimize_bb(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb) { MVMSpeshCallInfo arg_info; MVMint32 i; /* Look for instructions that are interesting to optimize. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_SSA_PHI: analyze_phi(tc, g, ins); break; case MVM_OP_set: copy_facts(tc, g, ins->operands[0], ins->operands[1]); break; case MVM_OP_istrue: case MVM_OP_isfalse: optimize_istrue_isfalse(tc, g, bb, ins); break; case MVM_OP_if_i: case MVM_OP_unless_i: case MVM_OP_if_n: case MVM_OP_unless_n: case MVM_OP_if_o: case MVM_OP_unless_o: optimize_iffy(tc, g, ins, bb); break; case MVM_OP_prepargs: arg_info.cs = g->sf->body.cu->body.callsites[ins->operands[0].callsite_idx]; arg_info.prepargs_ins = ins; break; case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: { MVMint16 idx = ins->operands[0].lit_i16; if (idx < MAX_ARGS_FOR_OPT) { arg_info.arg_is_const[idx] = 0; arg_info.arg_facts[idx] = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); arg_info.arg_ins[idx] = ins; } break; } case MVM_OP_argconst_i: case MVM_OP_argconst_n: case MVM_OP_argconst_s: { MVMint16 idx = ins->operands[0].lit_i16; if (idx < MAX_ARGS_FOR_OPT) { arg_info.arg_is_const[idx] = 1; arg_info.arg_ins[idx] = ins; } break; } case MVM_OP_coerce_in: optimize_coerce(tc, g, bb, ins); break; case MVM_OP_smrt_numify: case MVM_OP_smrt_strify: optimize_smart_coerce(tc, g, bb, ins); break; case MVM_OP_invoke_v: optimize_call(tc, g, bb, ins, 0, &arg_info); break; case MVM_OP_invoke_i: case MVM_OP_invoke_n: case MVM_OP_invoke_s: case MVM_OP_invoke_o: optimize_call(tc, g, bb, ins, 1, &arg_info); break; case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: optimize_throwcat(tc, g, bb, ins); break; case MVM_OP_islist: case MVM_OP_ishash: case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: optimize_is_reprid(tc, g, ins); break; case MVM_OP_findmeth_s: optimize_findmeth_s_perhaps_constant(tc, g, ins); if (ins->info->opcode == MVM_OP_findmeth_s) break; case MVM_OP_findmeth: optimize_method_lookup(tc, g, ins); break; case MVM_OP_can: case MVM_OP_can_s: optimize_can_op(tc, g, bb, ins); break; case MVM_OP_gethow: optimize_gethow(tc, g, ins); break; case MVM_OP_isconcrete: optimize_isconcrete(tc, g, ins); break; case MVM_OP_istype: optimize_istype(tc, g, ins); break; case MVM_OP_objprimspec: optimize_objprimspec(tc, g, ins); break; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_deletekey: case MVM_OP_setelemspos: case MVM_OP_splice: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: optimize_repr_op(tc, g, bb, ins, 0); break; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_elems: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_create: optimize_repr_op(tc, g, bb, ins, 1); break; case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: optimize_repr_op(tc, g, bb, ins, 2); break; case MVM_OP_newexception: case MVM_OP_bindexmessage: case MVM_OP_bindexpayload: case MVM_OP_getexmessage: case MVM_OP_getexpayload: optimize_exception_ops(tc, g, bb, ins); break; case MVM_OP_hllize: optimize_hllize(tc, g, ins); break; case MVM_OP_decont: optimize_decont(tc, g, bb, ins); break; case MVM_OP_assertparamcheck: optimize_assertparamcheck(tc, g, bb, ins); break; case MVM_OP_getlexstatic_o: optimize_getlex_known(tc, g, bb, ins); break; case MVM_OP_getlexperinvtype_o: if (specialized_on_invocant(tc, g)) optimize_getlex_known(tc, g, bb, ins); break; case MVM_OP_isrwcont: optimize_container_check(tc, g, bb, ins); break; case MVM_OP_sp_log: case MVM_OP_sp_osrfinalize: /* Left-over log instruction that didn't become a guard, or OSR * finalize instruction; just delete it. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); break; case MVM_OP_prof_enter: /* Profiling entered from spesh should indicate so. */ ins->info = MVM_op_get_op(MVM_OP_prof_enterspesh); break; default: if (ins->info->opcode == (MVMuint16)-1) optimize_extop(tc, g, bb, ins); } ins = ins->next; } /* Visit children. */ for (i = 0; i < bb->num_children; i++) optimize_bb(tc, g, bb->children[i]); } /* Eliminates any unused instructions. */ static void eliminate_dead_ins(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Keep eliminating to a fixed point. */ MVMint8 death = 1; while (death) { MVMSpeshBB *bb = g->entry; death = 0; while (bb && !bb->inlined) { MVMSpeshIns *ins = bb->last_ins; while (ins) { MVMSpeshIns *prev = ins->prev; if (ins->info->opcode == MVM_SSA_PHI) { MVMSpeshFacts *facts = get_facts_direct(tc, g, ins->operands[0]); if (facts->usages == 0) { /* Propagate non-usage. */ MVMint32 i; for (i = 1; i < ins->info->num_operands; i++) get_facts_direct(tc, g, ins->operands[i])->usages--; /* Remove this phi. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); death = 1; } } else if (ins->info->pure) { /* Sanity check to make sure it's a write reg as first operand. */ if ((ins->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMSpeshFacts *facts = get_facts_direct(tc, g, ins->operands[0]); if (facts->usages == 0) { /* Propagate non-usage. */ MVMint32 i; for (i = 1; i < ins->info->num_operands; i++) if ((ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg) get_facts_direct(tc, g, ins->operands[i])->usages--; /* Remove this instruction. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); death = 1; } } } ins = prev; } bb = bb->linear_next; } } } static void second_pass(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb) { MVMint32 i; /* Look for instructions that are interesting to optimize. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { if (ins->prev && ins->info->opcode == MVM_OP_set) { /* We may have turned some complex instruction into a simple set * in the big switch/case up there, but we wouldn't have called * "copy_facts" on the registers yet, so we have to do it here * unless we want to lose some important facts */ copy_facts(tc, g, ins->operands[0], ins->operands[1]); /* Due to shoddy code-gen followed by spesh discarding lots of ops, * we get quite a few redundant set instructions. * They are not costly, but we can easily kick them out. */ if (ins->operands[0].reg.orig == ins->operands[1].reg.orig) { MVMSpeshIns *previous = ins->prev; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); ins = previous; } else if (ins->prev->info->opcode == MVM_OP_set) { if (ins->operands[0].reg.i == ins->prev->operands[1].reg.i + 1 && ins->operands[0].reg.orig == ins->prev->operands[1].reg.orig && ins->operands[1].reg.i == ins->prev->operands[0].reg.i && ins->operands[1].reg.orig == ins->prev->operands[0].reg.orig) { MVMSpeshIns *previous = ins->prev; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); ins = previous; } } else if ((ins->prev->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg && ins->prev->operands[0].reg.orig == ins->operands[1].reg.orig && ins->prev->operands[0].reg.i == ins->operands[1].reg.i) { /* If a regular operation is immediately followed by a set, * we have to look at the usages of the intermediate register * and make sure it's only ever read by the set, and not, for * example, required by a deopt barrier to have a copy of the * value. */ MVMSpeshFacts *facts = get_facts_direct(tc, g, ins->operands[1]); if (facts->usages <= 1) { /* Cool, we can move the register into the original ins * and throw out the set instruction. */ MVMSpeshIns *previous = ins->prev; ins->prev->operands[0].reg = ins->operands[0].reg; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); ins = previous; facts->usages--; } } } else if (ins->prev && ins->info->opcode == MVM_OP_sp_getspeshslot && ins->prev->info->opcode == ins->info->opcode) { /* Sometimes we emit two getspeshslots in a row that write into the * exact same register. that's clearly wasteful and we can save a * tiny shred of code size here. * However, since spesh slots are also involved in GC, we can also * null the spesh slot that we throw out. */ if (ins->operands[0].reg.orig == ins->prev->operands[0].reg.orig) { g->spesh_slots[ins->prev->operands[1].lit_i16] = NULL; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins->prev); } } ins = ins->next; } /* Visit children. */ for (i = 0; i < bb->num_children; i++) second_pass(tc, g, bb->children[i]); } /* Eliminates any unreachable basic blocks (that is, dead code). Not having * to consider them any further simplifies all that follows. */ static MVMint64 has_handler_anns(MVMThreadContext *tc, MVMSpeshBB *bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: case MVM_SPESH_ANN_FH_END: case MVM_SPESH_ANN_FH_GOTO: return 1; } ann = ann->next; } ins = ins->next; } return 0; } static void eliminate_dead_bbs(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Iterate to fixed point. */ MVMint8 *seen = MVM_malloc(g->num_bbs); MVMint32 orig_bbs = g->num_bbs; MVMint8 death = 1; while (death) { /* First pass: mark every basic block that is the entry point or the * successor of some other block. */ MVMSpeshBB *cur_bb = g->entry; memset(seen, 0, g->num_bbs); seen[0] = 1; while (cur_bb) { MVMuint16 i; for (i = 0; i < cur_bb->num_succ; i++) seen[cur_bb->succ[i]->idx] = 1; cur_bb = cur_bb->linear_next; } /* Second pass: eliminate dead BBs from consideration. Do not get * rid of any that are from inlines or that contain handler related * annotations. */ death = 0; cur_bb = g->entry; while (cur_bb->linear_next) { MVMSpeshBB *death_cand = cur_bb->linear_next; if (!seen[death_cand->idx]) { if (!death_cand->inlined && !has_handler_anns(tc, death_cand)) { cur_bb->linear_next = cur_bb->linear_next->linear_next; g->num_bbs--; death = 1; } } cur_bb = cur_bb->linear_next; } } MVM_free(seen); if (g->num_bbs != orig_bbs) { MVMint32 new_idx = 0; MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { cur_bb->idx = new_idx; new_idx++; cur_bb = cur_bb->linear_next; } } } /* Goes through the various log-based guard instructions and removes any that * are not being made use of. */ static void eliminate_unused_log_guards(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMint32 i; for (i = 0; i < g->num_log_guards; i++) if (!g->log_guards[i].used) MVM_spesh_manipulate_delete_ins(tc, g, g->log_guards[i].bb, g->log_guards[i].ins); } /* Drives the overall optimization work taking place on a spesh graph. */ void MVM_spesh_optimize(MVMThreadContext *tc, MVMSpeshGraph *g) { optimize_bb(tc, g, g->entry); eliminate_dead_ins(tc, g); eliminate_dead_bbs(tc, g); eliminate_unused_log_guards(tc, g); second_pass(tc, g, g->entry); } MoarVM-2015.11/src/spesh/optimize.h0000644000175000017500000000201512456307241015774 0ustar jnthnjnthn/* Maximum args a call can take for us to consider it for optimization. */ #define MAX_ARGS_FOR_OPT 4 /* Information we've gathered about the current call we're optimizing, and the * arguments it will take. */ struct MVMSpeshCallInfo { MVMCallsite *cs; MVMint8 arg_is_const[MAX_ARGS_FOR_OPT]; MVMSpeshFacts *arg_facts[MAX_ARGS_FOR_OPT]; MVMSpeshIns *prepargs_ins; MVMSpeshIns *arg_ins[MAX_ARGS_FOR_OPT]; }; void MVM_spesh_optimize(MVMThreadContext *tc, MVMSpeshGraph *g); MVM_PUBLIC MVMint16 MVM_spesh_add_spesh_slot(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c); MVM_PUBLIC MVMSpeshFacts * MVM_spesh_get_and_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MVM_PUBLIC MVMSpeshFacts * MVM_spesh_get_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MVM_PUBLIC void MVM_spesh_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *f); MVM_PUBLIC MVMString * MVM_spesh_get_string(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MoarVM-2015.11/src/spesh/osr.c0000644000175000017500000001412712534320622014734 0ustar jnthnjnthn#include "moar.h" /* Locates deopt index matching OSR point. */ static MVMint32 get_osr_deopt_index(MVMThreadContext *tc, MVMSpeshCandidate *cand) { /* Calculate offset. */ MVMint32 offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)); /* Locate it in the deopt table. */ MVMint32 i; for (i = 0; i < cand->num_deopts; i++) if (cand->deopts[2 * i] == offset) return i; /* If we couldn't locate it, something is really very wrong. */ MVM_oops(tc, "Spesh: get_osr_deopt_index failed"); } /* Locates deopt index matching OSR finalize point. */ static MVMint32 get_osr_deopt_finalize_index(MVMThreadContext *tc, MVMSpeshCandidate *cand) { /* Calculate offset. */ MVMint32 offset = ((*(tc->interp_cur_op) - *(tc->interp_bytecode_start))) - 2; /* Locate it in the deopt table. */ MVMint32 i; for (i = 0; i < cand->num_deopts; i++) if (cand->deopts[2 * i + 1] == offset) return i; /* If we couldn't locate it, something is really very wrong. */ MVM_oops(tc, "Spesh: get_osr_deopt_finalize_index failed"); } /* Called to start OSR. Switches us over to logging runs of spesh'd code, to * collect extra type info. */ void MVM_spesh_osr(MVMThreadContext *tc) { MVMSpeshCandidate *specialized; MVMint32 osr_index; /* Check OSR is enabled. */ if (!tc->instance->spesh_osr_enabled) return; /* Ensure that we are in a position to specialize. */ if (!tc->cur_frame->caller) return; if (!tc->cur_frame->params.callsite->is_interned) return; if (tc->cur_frame->static_info->body.num_spesh_candidates == MVM_SPESH_LIMIT) return; /* Produce logging spesh candidate. */ specialized = MVM_spesh_candidate_setup(tc, tc->cur_frame->static_info, tc->cur_frame->params.callsite, tc->cur_frame->params.args, 1); if (specialized) { /* Set up frame to point to specialized logging code. */ tc->cur_frame->effective_bytecode = specialized->bytecode; tc->cur_frame->effective_handlers = specialized->handlers; tc->cur_frame->effective_spesh_slots = specialized->spesh_slots; tc->cur_frame->spesh_log_slots = specialized->log_slots; tc->cur_frame->spesh_cand = specialized; tc->cur_frame->spesh_log_idx = 0; specialized->log_enter_idx = 1; /* Work out deopt index that applies, and move interpreter into the * logging version of the code. */ osr_index = get_osr_deopt_index(tc, specialized); *(tc->interp_bytecode_start) = specialized->bytecode; *(tc->interp_cur_op) = specialized->bytecode + specialized->deopts[2 * osr_index + 1] + 2; /* Pass over sp_osrfianlize this first time */; } } /* Finalizes OSR. */ void MVM_spesh_osr_finalize(MVMThreadContext *tc) { /* Find deopt index using existing deopt table, for entering the updated * code later. */ MVMSpeshCandidate *specialized = tc->cur_frame->spesh_cand; MVMint32 osr_index = get_osr_deopt_finalize_index(tc, specialized); MVMJitCode *jc; /* Finish up the specialization. */ MVM_spesh_candidate_specialize(tc, tc->cur_frame->static_info, specialized); /* Resize work area if needed. */ if (specialized->num_locals > tc->cur_frame->static_info->body.num_locals) { /* Resize work area. */ MVMRegister *new_work = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, specialized->work_size); memcpy(new_work, tc->cur_frame->work, tc->cur_frame->static_info->body.num_locals * sizeof(MVMRegister)); MVM_fixed_size_free(tc, tc->instance->fsa, tc->cur_frame->allocd_work, tc->cur_frame->work); tc->cur_frame->work = new_work; tc->cur_frame->allocd_work = specialized->work_size; tc->cur_frame->args = tc->cur_frame->work + specialized->num_locals; } /* Resize environment if needed. */ if (specialized->num_lexicals > tc->cur_frame->static_info->body.num_lexicals) { MVMRegister *new_env = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, specialized->env_size); if (tc->cur_frame->allocd_env) { memcpy(new_env, tc->cur_frame->env, tc->cur_frame->static_info->body.num_lexicals * sizeof(MVMRegister)); MVM_fixed_size_free(tc, tc->instance->fsa, tc->cur_frame->allocd_env, tc->cur_frame->env); } tc->cur_frame->env = new_env; tc->cur_frame->allocd_env = specialized->env_size; } /* Sync frame with updates. */ tc->cur_frame->effective_bytecode = specialized->bytecode; tc->cur_frame->effective_handlers = specialized->handlers; tc->cur_frame->effective_spesh_slots = specialized->spesh_slots; tc->cur_frame->spesh_log_slots = NULL; tc->cur_frame->spesh_log_idx = -1; /* Sync interpreter with updates. */ jc = specialized->jitcode; if (jc && jc->num_deopts) { MVMint32 i; *(tc->interp_bytecode_start) = specialized->jitcode->bytecode; *(tc->interp_cur_op) = specialized->jitcode->bytecode; for (i = 0; i < jc->num_deopts; i++) { if (jc->deopts[i].idx == osr_index) { tc->cur_frame->jit_entry_label = jc->labels[jc->deopts[i].label]; break; } } if (i == jc->num_deopts) MVM_oops(tc, "JIT: Could not find OSR label"); if (tc->instance->profiling) MVM_profiler_log_osr(tc, 1); } else { *(tc->interp_bytecode_start) = specialized->bytecode; *(tc->interp_cur_op) = specialized->bytecode + specialized->deopts[2 * osr_index + 1]; if (tc->instance->profiling) MVM_profiler_log_osr(tc, 0); } *(tc->interp_reg_base) = tc->cur_frame->work; /* Tweak frame invocation count so future invocations will use the code * produced by OSR. */ tc->cur_frame->static_info->body.invocations += tc->cur_frame->static_info->body.spesh_threshold; } MoarVM-2015.11/src/spesh/osr.h0000644000175000017500000000041212516136714014740 0ustar jnthnjnthn/* How many iterations we must do in a loop to trigger OSR. */ #define MVM_OSR_THRESHOLD 200 /* Functions called when OSR is triggered, and after logging runs are done. */ void MVM_spesh_osr(MVMThreadContext *tc); void MVM_spesh_osr_finalize(MVMThreadContext *tc); MoarVM-2015.11/src/spesh/threshold.c0000644000175000017500000000070412536002531016117 0ustar jnthnjnthn#include "moar.h" /* Choose the threshold for a given static frame before we start applying * specialization to it. */ MVMuint32 MVM_spesh_threshold(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMuint32 bs = sf->body.bytecode_size; if (tc->instance->spesh_nodelay) return 1; if (bs <= 256) return 150; else if (bs <= 512) return 200; else if (bs <= 2048) return 250; else return 300; } MoarVM-2015.11/src/spesh/threshold.h0000644000175000017500000000011112456307241016123 0ustar jnthnjnthnMVMuint32 MVM_spesh_threshold(MVMThreadContext *tc, MVMStaticFrame *sf); MoarVM-2015.11/src/strings/ascii.c0000644000175000017500000001730412623370227015575 0ustar jnthnjnthn#include "moar.h" /* Decodes the specified number of bytes of ASCII into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_ascii_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t i, result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes); result_graphs = 0; for (i = 0; i < bytes; i++) { if (ascii[i] == '\r' && i + 1 < bytes && ascii[i + 1] == '\n') { result->body.storage.blob_32[result_graphs++] = MVM_nfg_crlf_grapheme(tc); i++; } else if (ascii[i] >= 0) { result->body.storage.blob_32[result_graphs++] = ascii[i]; } else { MVM_exception_throw_adhoc(tc, "Will not decode invalid ASCII (code point > 127 found)"); } } result->body.num_graphs = result_graphs; return result; } /* Decodes a NULL-terminated ASCII string into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_ascii_decode_nt(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii) { return MVM_string_ascii_decode(tc, result_type, ascii, strlen(ascii)); } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ void MVM_string_ascii_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return; /* Take length of head buffer as initial guess. */ bufsize = ds->bytes_head->length; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; char *bytes = cur_bytes->bytes; while (pos < cur_bytes->length) { MVMCodepoint codepoint = bytes[pos++]; MVMGrapheme32 graph; if (codepoint > 127) MVM_exception_throw_adhoc(tc, "Will not decode invalid ASCII (code point > 127 found)"); if (last_was_cr) { if (codepoint == '\n') { graph = MVM_nfg_crlf_grapheme(tc); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) goto done; } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); } /* Encodes the specified substring to ASCII. Anything outside of ASCII range * will become replaced with the supplied replacement, or an exception will be * thrown if there isn't one. The result string is NULL terminated, but the * specified size is the non-null part. */ char * MVM_string_ascii_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { /* ASCII is a single byte encoding, but \r\n is a 2-byte grapheme, so we * may have to resize as we go. */ MVMuint32 startu = (MVMuint32)start; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - startu : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_ascii_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint ord = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } if (ord >= 0 && ord <= 127) { result[i] = (MVMuint8)ord; i++; } else if (replacement) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding ASCII string: could not encode codepoint %d", ord); } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to ASCII. */ char * MVM_string_ascii_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size) { return MVM_string_ascii_encode_substr(tc, str, output_size, 0, -1, NULL); } /* Encodes the specified string to ASCII not returning length. */ char * MVM_string_ascii_encode_any(MVMThreadContext *tc, MVMString *str) { return MVM_string_ascii_encode(tc, str, NULL); } MoarVM-2015.11/src/strings/ascii.h0000644000175000017500000000136512620140151015566 0ustar jnthnjnthnMVM_PUBLIC MVMString * MVM_string_ascii_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii, size_t bytes); MVM_PUBLIC MVMString * MVM_string_ascii_decode_nt(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii); MVM_PUBLIC void MVM_string_ascii_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); MVM_PUBLIC char * MVM_string_ascii_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); MVM_PUBLIC char * MVM_string_ascii_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size); char * MVM_string_ascii_encode_any(MVMThreadContext *tc, MVMString *str); MoarVM-2015.11/src/strings/decode_stream.c0000644000175000017500000004760212623370227017307 0ustar jnthnjnthn#include "moar.h" /* A decode stream represents an on-going decoding process, from bytes into * characters. Bytes can be contributed to the decode stream, and chars can be * obtained. Byte buffers and decoded char buffers are kept in linked lists. * Note that characters may start at the end of one byte buffer and finish in * the next, which is taken care of by the logic in here and the decoders * themselves. Additionally, normalization may be applied using the normalizer * in the decode stream, at the discretion of the encoding in question (some, * such as ASCII and Latin-1, are normalized by definition). */ /* Creates a new decoding stream. */ MVMDecodeStream * MVM_string_decodestream_create(MVMThreadContext *tc, MVMint32 encoding, MVMint64 abs_byte_pos) { MVMDecodeStream *ds = MVM_calloc(1, sizeof(MVMDecodeStream)); ds->encoding = encoding; ds->abs_byte_pos = abs_byte_pos; MVM_unicode_normalizer_init(tc, &(ds->norm), MVM_NORMALIZE_NFG); return ds; } /* Adds another byte buffer into the decoding stream. */ void MVM_string_decodestream_add_bytes(MVMThreadContext *tc, MVMDecodeStream *ds, char *bytes, MVMint32 length) { if (length > 0) { MVMDecodeStreamBytes *new_bytes = MVM_calloc(1, sizeof(MVMDecodeStreamBytes)); new_bytes->bytes = bytes; new_bytes->length = length; if (ds->bytes_tail) ds->bytes_tail->next = new_bytes; ds->bytes_tail = new_bytes; if (!ds->bytes_head) ds->bytes_head = new_bytes; } } /* Adds another char result buffer into the decoding stream. */ void MVM_string_decodestream_add_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMGrapheme32 *chars, MVMint32 length) { MVMDecodeStreamChars *new_chars = MVM_calloc(1, sizeof(MVMDecodeStreamChars)); new_chars->chars = chars; new_chars->length = length; if (ds->chars_tail) ds->chars_tail->next = new_chars; ds->chars_tail = new_chars; if (!ds->chars_head) ds->chars_head = new_chars; } /* Throws away byte buffers no longer needed. */ void MVM_string_decodestream_discard_to(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMDecodeStreamBytes *bytes, MVMint32 pos) { while (ds->bytes_head != bytes) { MVMDecodeStreamBytes *discard = ds->bytes_head; ds->abs_byte_pos += discard->length - ds->bytes_head_pos; ds->bytes_head = discard->next; ds->bytes_head_pos = 0; MVM_free(discard->bytes); MVM_free(discard); } if (!ds->bytes_head && pos == 0) return; if (ds->bytes_head->length == pos) { /* We ate all of the new head buffer too; also free it. */ MVMDecodeStreamBytes *discard = ds->bytes_head; ds->abs_byte_pos += discard->length - ds->bytes_head_pos; ds->bytes_head = discard->next; ds->bytes_head_pos = 0; MVM_free(discard->bytes); MVM_free(discard); if (ds->bytes_head == NULL) ds->bytes_tail = NULL; } else { ds->abs_byte_pos += pos - ds->bytes_head_pos; ds->bytes_head_pos = pos; } } /* Does a decode run, selected by encoding. Returns non-zero if we actually * decoded more chars. */ static MVMint32 run_decode(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *sep_spec) { MVMDecodeStreamChars *prev_chars_tail = ds->chars_tail; switch (ds->encoding) { case MVM_encoding_type_utf8: MVM_string_utf8_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_ascii: MVM_string_ascii_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_latin1: MVM_string_latin1_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_windows1252: MVM_string_windows1252_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_utf8_c8: MVM_string_utf8_c8_decodestream(tc, ds, stopper_chars, sep_spec); break; default: MVM_exception_throw_adhoc(tc, "Streaming decode NYI for encoding %d", (int)ds->encoding); } return ds->chars_tail != prev_chars_tail; } /* Gets the specified number of characters. If we are not yet able to decode * that many, returns NULL. This may mean more input buffers are needed. The * exclude parameter specifies a number of chars that should be taken from the * input buffer, but not included in the result string (for chomping a line * separator). */ static MVMint32 missing_chars(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 wanted) { MVMint32 got = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars && got < wanted) { if (cur_chars == ds->chars_head) got += cur_chars->length - ds->chars_head_pos; else got += cur_chars->length; cur_chars = cur_chars->next; } return got >= wanted ? 0 : wanted - got; } static MVMString * take_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars, MVMint32 exclude) { MVMString *result; MVMint32 found = 0; MVMint32 result_found = 0; MVMint32 result_chars = chars - exclude; if (result_chars < 0) MVM_exception_throw_adhoc(tc, "DecodeStream take_chars: chars - exclude < 0 should never happen"); result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.storage.blob_32 = MVM_malloc(result_chars * sizeof(MVMGrapheme32)); result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = result_chars; while (found < chars) { MVMDecodeStreamChars *cur_chars = ds->chars_head; MVMint32 available = cur_chars->length - ds->chars_head_pos; if (available <= chars - found) { /* We need all that's left in this buffer and likely * more. */ MVMDecodeStreamChars *next_chars = cur_chars->next; if (available <= result_chars - result_found) { memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, available * sizeof(MVMGrapheme32)); result_found += available; } else { MVMint32 to_copy = result_chars - result_found; memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, to_copy * sizeof(MVMGrapheme32)); result_found += to_copy; } found += available; MVM_free(cur_chars->chars); MVM_free(cur_chars); ds->chars_head = next_chars; ds->chars_head_pos = 0; if (ds->chars_head == NULL) ds->chars_tail = NULL; } else { /* There's enough in this buffer to satisfy us, and we'll leave * some behind. */ MVMint32 take = chars - found; MVMint32 to_copy = result_chars - result_found; memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, to_copy * sizeof(MVMGrapheme32)); result_found += to_copy; found += take; ds->chars_head_pos += take; } } return result; } MVMString * MVM_string_decodestream_get_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars) { MVMint32 missing; /* If we request nothing, give empty string. */ if (chars == 0) return tc->instance->str_consts.empty; /* If we don't already have enough chars, try and decode more. */ missing = missing_chars(tc, ds, chars); if (missing) run_decode(tc, ds, &missing, NULL); /* If we've got enough, assemble a string. Otherwise, give up. */ if (missing_chars(tc, ds, chars) == 0) return take_chars(tc, ds, chars, 0); else return NULL; } /* Gets characters up until one of the specified separators is encountered. If * we do not encounter it, returns 9. This may mean more input buffers are needed * or that we reached the end of the stream. */ static MVMint32 have_separator(MVMThreadContext *tc, MVMDecodeStreamChars *start_chars, MVMint32 start_pos, MVMDecodeStreamSeparators *sep_spec, MVMint32 sep_idx, MVMint32 sep_graph_pos) { MVMint32 sep_pos = 1; MVMint32 sep_length = sep_spec->sep_lengths[sep_idx]; MVMDecodeStreamChars *cur_chars = start_chars; while (cur_chars) { MVMint32 start = cur_chars == start_chars ? start_pos : 0; MVMint32 i; for (i = start; i < cur_chars->length; i++) { if (cur_chars->chars[i] != sep_spec->sep_graphemes[sep_graph_pos]) return 0; sep_pos++; if (sep_pos == sep_length) return 1; sep_graph_pos++; } cur_chars = cur_chars->next; } return 0; } static MVMint32 find_separator(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 *sep_length) { MVMint32 sep_loc = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars) { MVMint32 start = cur_chars == ds->chars_head ? ds->chars_head_pos : 0; MVMint32 i, j; for (i = start; i < cur_chars->length; i++) { MVMint32 sep_graph_pos = 0; MVMGrapheme32 cur_char = cur_chars->chars[i]; sep_loc++; for (j = 0; j < sep_spec->num_seps; j++) { if (sep_spec->sep_graphemes[sep_graph_pos] == cur_char) { if (sep_spec->sep_lengths[j] == 1) { *sep_length = 1; return sep_loc; } else if (have_separator(tc, cur_chars, i + 1, sep_spec, j, sep_graph_pos + 1)) { *sep_length = sep_spec->sep_lengths[j]; sep_loc += sep_spec->sep_lengths[j] - 1; return sep_loc; } } sep_graph_pos += sep_spec->sep_lengths[j]; } } cur_chars = cur_chars->next; } return 0; } MVMString * MVM_string_decodestream_get_until_sep(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp) { MVMint32 sep_loc, sep_length; /* Look for separator, trying more decoding if it fails. We get the place * just beyond the separator, so can use take_chars to get what's need. * Note that decoders are only responsible for finding the final char of * the separator, so we may need to loop a few times around this. */ sep_loc = find_separator(tc, ds, sep_spec, &sep_length); while (!sep_loc) { if (!run_decode(tc, ds, NULL, sep_spec)) break; sep_loc = find_separator(tc, ds, sep_spec, &sep_length); } if (sep_loc) return take_chars(tc, ds, sep_loc, chomp ? sep_length : 0); else return NULL; } /* In situations where we have hit EOF, we need to decode what's left and flush * the normalization buffer also. */ static void reached_eof(MVMThreadContext *tc, MVMDecodeStream *ds) { /* Decode all the things. */ if (ds->bytes_head) run_decode(tc, ds, NULL, NULL); /* If there's some things left in the normalization buffer, take them. */ MVM_unicode_normalizer_eof(tc, &(ds->norm)); if (MVM_unicode_normalizer_available(tc, &(ds->norm))) { MVMint32 ready = MVM_unicode_normalizer_available(tc, &(ds->norm)); MVMGrapheme32 *buffer = MVM_malloc(ready * sizeof(MVMGrapheme32)); MVMint32 count = 0; while (ready--) buffer[count++] = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); MVM_string_decodestream_add_chars(tc, ds, buffer, count); } } /* Variant of MVM_string_decodestream_get_until_sep that is called when we * reach EOF. Trims the final separator if there is one, or returns the last * line without the EOF marker. */ MVMString * MVM_string_decodestream_get_until_sep_eof(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp) { MVMint32 sep_loc, sep_length; /* Decode anything remaining and flush normalization buffer. */ reached_eof(tc, ds); /* Look for separator, which should by now be at the end, and chomp it * off if needed. */ sep_loc = find_separator(tc, ds, sep_spec, &sep_length); if (sep_loc) return take_chars(tc, ds, sep_loc, chomp ? sep_length : 0); /* Otherwise, take all remaining chars. */ return MVM_string_decodestream_get_all(tc, ds); } /* Decodes all the buffers, producing a string containing all the decoded * characters. */ MVMString * MVM_string_decodestream_get_all(MVMThreadContext *tc, MVMDecodeStream *ds) { MVMString *result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.storage_type = MVM_STRING_GRAPHEME_32; /* Decode anything remaining and flush normalization buffer. */ reached_eof(tc, ds); /* If there's no codepoint buffer, then return the empty string. */ if (!ds->chars_head) { result->body.storage.blob_32 = NULL; result->body.num_graphs = 0; } /* If there's exactly one resulting codepoint buffer and we swallowed none * of it, just use it. */ else if (ds->chars_head == ds->chars_tail && ds->chars_head_pos == 0) { /* Set up result string. */ result->body.storage.blob_32 = ds->chars_head->chars; result->body.num_graphs = ds->chars_head->length; /* Don't free the buffer's memory itself, just the holder, as we * stole that for the buffer into the string above. */ MVM_free(ds->chars_head); ds->chars_head = ds->chars_tail = NULL; } /* Otherwise, need to assemble all the things. */ else { /* Calculate length. */ MVMint32 length = 0, pos = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars) { if (cur_chars == ds->chars_head) length += cur_chars->length - ds->chars_head_pos; else length += cur_chars->length; cur_chars = cur_chars->next; } /* Allocate a result buffer of the right size. */ result->body.storage.blob_32 = MVM_malloc(length * sizeof(MVMGrapheme32)); result->body.num_graphs = length; /* Copy all the things into the target, freeing as we go. */ cur_chars = ds->chars_head; while (cur_chars) { if (cur_chars == ds->chars_head) { MVMint32 to_copy = ds->chars_head->length - ds->chars_head_pos; memcpy(result->body.storage.blob_32 + pos, cur_chars->chars + ds->chars_head_pos, cur_chars->length * sizeof(MVMGrapheme32)); pos += to_copy; } else { memcpy(result->body.storage.blob_32 + pos, cur_chars->chars, cur_chars->length * sizeof(MVMGrapheme32)); pos += cur_chars->length; } cur_chars = cur_chars->next; } ds->chars_head = ds->chars_tail = NULL; } return result; } /* Checks if we have the number of bytes requested. */ MVMint64 MVM_string_decodestream_have_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 bytes) { MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMint32 found = 0; while (cur_bytes) { found += cur_bytes == ds->bytes_head ? cur_bytes->length - ds->bytes_head_pos : cur_bytes->length; if (found >= bytes) return 1; cur_bytes = cur_bytes->next; } return 0; } /* Copies up to the requested number of bytes into the supplied buffer, and * returns the number of bytes we actually copied. Takes from from the start * of the stream. */ MVMint64 MVM_string_decodestream_bytes_to_buf(MVMThreadContext *tc, MVMDecodeStream *ds, char **buf, MVMint32 bytes) { MVMint32 taken = 0; *buf = NULL; while (taken < bytes && ds->bytes_head) { /* Take what we can. */ MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMint32 required = bytes - taken; MVMint32 available = cur_bytes->length - ds->bytes_head_pos; if (available <= required) { /* Take everything in this buffer and remove it. */ if (!*buf) *buf = MVM_malloc(cur_bytes->next ? bytes : available); memcpy(*buf + taken, cur_bytes->bytes + ds->bytes_head_pos, available); taken += available; ds->bytes_head = cur_bytes->next; ds->bytes_head_pos = 0; MVM_free(cur_bytes->bytes); MVM_free(cur_bytes); } else { /* Just take what we need. */ if (!*buf) *buf = MVM_malloc(required); memcpy(*buf + taken, cur_bytes->bytes + ds->bytes_head_pos, required); taken += required; ds->bytes_head_pos += required; } } if (ds->bytes_head == NULL) ds->bytes_tail = NULL; ds->abs_byte_pos += taken; return taken; } /* Gets the absolute byte offset (the amount we started with plus what we've * chewed and handed back in decoded characters). */ MVMint64 MVM_string_decodestream_tell_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds) { return ds->abs_byte_pos; } /* Checks if the decode stream is empty. */ MVMint32 MVM_string_decodestream_is_empty(MVMThreadContext *tc, MVMDecodeStream *ds) { return !(ds->bytes_head || ds->chars_head || MVM_unicode_normalizer_available(tc, &(ds->norm))); } /* Destroys a decoding stream, freeing all associated memory (including the * buffers). */ void MVM_string_decodestream_destory(MVMThreadContext *tc, MVMDecodeStream *ds) { MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; while (cur_bytes) { MVMDecodeStreamBytes *next_bytes = cur_bytes->next; MVM_free(cur_bytes->bytes); MVM_free(cur_bytes); cur_bytes = next_bytes; } MVM_unicode_normalizer_cleanup(tc, &(ds->norm)); MVM_free(ds); } /* Sets a decode stream separator to its default value. */ void MVM_string_decode_stream_sep_default(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec) { sep_spec->num_seps = 2; sep_spec->sep_lengths = MVM_malloc(sep_spec->num_seps * sizeof(MVMint32)); sep_spec->sep_graphemes = MVM_malloc(sep_spec->num_seps * sizeof(MVMGrapheme32)); sep_spec->sep_lengths[0] = 1; sep_spec->sep_graphemes[0] = '\n'; sep_spec->sep_lengths[1] = 1; sep_spec->sep_graphemes[1] = MVM_nfg_crlf_grapheme(tc); } /* Takes a string and sets it up as a decode stream separator. */ void MVM_string_decode_stream_sep_from_strings(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMString **seps, MVMint32 num_seps) { MVMGraphemeIter gi; MVMint32 i, graph_length, graph_pos; if (num_seps > 0xFFF) MVM_exception_throw_adhoc(tc, "Too many line separators"); MVM_free(sep_spec->sep_lengths); MVM_free(sep_spec->sep_graphemes); sep_spec->num_seps = num_seps; sep_spec->sep_lengths = MVM_malloc(num_seps * sizeof(MVMint32)); graph_length = 0; for (i = 0; i < num_seps; i++) { MVMuint32 num_graphs = MVM_string_graphs(tc, seps[i]); if (num_graphs > 0xFFFF) MVM_exception_throw_adhoc(tc, "Line separator too long"); sep_spec->sep_lengths[i] = num_graphs; graph_length += num_graphs; } sep_spec->sep_graphemes = MVM_malloc(graph_length * sizeof(MVMGrapheme32)); graph_pos = 0; for (i = 0; i < num_seps; i++) { MVM_string_gi_init(tc, &gi, seps[i]); while (MVM_string_gi_has_more(tc, &gi)) sep_spec->sep_graphemes[graph_pos++] = MVM_string_gi_get_grapheme(tc, &gi); } } MoarVM-2015.11/src/strings/decode_stream.h0000644000175000017500000000771412617121315017307 0ustar jnthnjnthn/* Represents a bytes => chars decoding stream. */ struct MVMDecodeStream { /* Head and tail of the input byte buffers. */ MVMDecodeStreamBytes *bytes_head; MVMDecodeStreamBytes *bytes_tail; /* Head and tail of the output char buffers. */ MVMDecodeStreamChars *chars_head; MVMDecodeStreamChars *chars_tail; /* The byte position (for tell). */ MVMint64 abs_byte_pos; /* How far we've eaten into the current head bytes buffer. */ MVMint32 bytes_head_pos; /* How far we've eaten into the current head char buffer. */ MVMint32 chars_head_pos; /* The encoding we're using. */ MVMint32 encoding; /* Normalizer. */ MVMNormalizer norm; }; /* A single bunch of bytes added to a decode stream, with a link to the next * one, if any. */ struct MVMDecodeStreamBytes { char *bytes; MVMint32 length; MVMDecodeStreamBytes *next; }; /* A bunch of characters already decoded, with a link to the next bunch. */ struct MVMDecodeStreamChars { MVMGrapheme32 *chars; MVMint32 length; MVMDecodeStreamChars *next; }; /* For situations where we need to decode up to some separators, this data * structure holds the information about them. */ struct MVMDecodeStreamSeparators { /* The lengths of the separators, in graphemes. */ MVMint32 *sep_lengths; /* The grapehemes themselves, in a single array (use sep_lengths to find * out how many there are in each separator). */ MVMGrapheme32 *sep_graphemes; /* The number of separators we have. */ MVMint32 num_seps; }; /* Checks if we may have encountered one of the separators. This just looks to * see if we hit the final grapheme of any of the separators, which is all we * demand the actual encodings themselves work out (multi-grapheme separators * are handled in the decode stream logic itself). */ MVM_STATIC_INLINE MVMint32 MVM_string_decode_stream_maybe_sep(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMGrapheme32 g) { if (sep_spec) { MVMint32 cur_graph = -1; MVMint32 i; for (i = 0; i < sep_spec->num_seps; i++) { cur_graph += sep_spec->sep_lengths[i]; if (sep_spec->sep_graphemes[cur_graph] == g) return 1; } } return 0; } MVMDecodeStream * MVM_string_decodestream_create(MVMThreadContext *tc, MVMint32 encoding, MVMint64 abs_byte_pos); void MVM_string_decodestream_add_bytes(MVMThreadContext *tc, MVMDecodeStream *ds, char *bytes, MVMint32 length); void MVM_string_decodestream_add_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMGrapheme32 *chars, MVMint32 length); void MVM_string_decodestream_discard_to(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMDecodeStreamBytes *bytes, MVMint32 pos); MVMString * MVM_string_decodestream_get_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars); MVMString * MVM_string_decodestream_get_until_sep(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *seps, MVMint32 chomp); MVMString * MVM_string_decodestream_get_until_sep_eof(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp); MVMString * MVM_string_decodestream_get_all(MVMThreadContext *tc, MVMDecodeStream *ds); MVMint64 MVM_string_decodestream_have_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 bytes); MVMint64 MVM_string_decodestream_bytes_to_buf(MVMThreadContext *tc, MVMDecodeStream *ds, char **buf, MVMint32 bytes); MVMint64 MVM_string_decodestream_tell_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds); MVMint32 MVM_string_decodestream_is_empty(MVMThreadContext *tc, MVMDecodeStream *ds); void MVM_string_decodestream_destory(MVMThreadContext *tc, MVMDecodeStream *ds); void MVM_string_decode_stream_sep_default(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec); void MVM_string_decode_stream_sep_from_strings(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMString **seps, MVMint32 num_seps); MoarVM-2015.11/src/strings/iter.h0000644000175000017500000001760212516136714015460 0ustar jnthnjnthn/* Grapheme iterator structure; iterates through graphemes in a string. */ struct MVMGraphemeIter { /* The blob we're currently iterating over. */ union { MVMGrapheme32 *blob_32; MVMGraphemeASCII *blob_ascii; MVMGrapheme8 *blob_8; void *any; } active_blob; /* The type of blob we have. */ MVMuint16 blob_type; /* The number of strands remaining, if any. */ MVMuint16 strands_remaining; /* The current position, and the end position. */ MVMStringIndex pos; MVMStringIndex end; /* Repetition count, and the start index in the blob (only needed if we're * doing an iteration over a repetition). */ MVMStringIndex start; MVMuint32 repetitions; /* The next strand, if we're doing a strand-based iteration. */ MVMStringStrand *next_strand; }; /* Initializes a grapheme iterator. */ MVM_STATIC_INLINE void MVM_string_gi_init(MVMThreadContext *tc, MVMGraphemeIter *gi, MVMString *s) { if (s->body.storage_type == MVM_STRING_STRAND) { MVMStringStrand *strands = s->body.storage.strands; MVMString *first = strands[0].blob_string; gi->active_blob.any = first->body.storage.any; gi->blob_type = first->body.storage_type; gi->strands_remaining = s->body.num_strands - 1; gi->pos = strands[0].start; gi->end = strands[0].end; gi->start = strands[0].start; gi->repetitions = strands[0].repetitions; gi->next_strand = strands + 1; } else { gi->active_blob.any = s->body.storage.any; gi->blob_type = s->body.storage_type; gi->strands_remaining = 0; gi->pos = 0; gi->end = s->body.num_graphs; gi->repetitions = 0; } }; /* Sets the position of the iterator. (Can be optimized in many ways in the * repetitions and strands branches.) */ MVM_STATIC_INLINE void MVM_string_gi_move_to(MVMThreadContext *tc, MVMGraphemeIter *gi, MVMuint32 pos) { MVMuint32 remaining = pos; MVMuint32 strand_graphs; /* Find the appropriate strand. */ while (remaining > (strand_graphs = (gi->end - gi->pos) * (gi->repetitions + 1))) { MVMStringStrand *next = gi->next_strand; if (!gi->strands_remaining) MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); gi->active_blob.any = next->blob_string->body.storage.any; gi->blob_type = next->blob_string->body.storage_type; gi->pos = next->start; gi->end = next->end; gi->start = next->start; gi->repetitions = next->repetitions; gi->strands_remaining--; gi->next_strand++; remaining -= strand_graphs; } /* Now look within the strand. */ while (1) { if (remaining == 0) { return; } if (gi->pos < gi->end) { if (gi->pos + remaining <= gi->end) { gi->pos += remaining; return; } remaining -= gi->end - gi->pos; gi->pos = gi->end; } else if (gi->repetitions) { MVMuint32 rep_graphs = gi->end - gi->start; MVMuint32 remaining_reps = remaining / rep_graphs; if (remaining_reps > gi->repetitions) remaining_reps = gi->repetitions; gi->repetitions -= remaining_reps; remaining -= remaining_reps * rep_graphs; if (gi->repetitions) gi->pos = gi->start; } else { MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); } } } /* Checks if there is more to read from a grapheme iterator. */ MVM_STATIC_INLINE MVMint32 MVM_string_gi_has_more(MVMThreadContext *tc, MVMGraphemeIter *gi) { return gi->pos < gi->end || gi->repetitions || gi->strands_remaining; } /* Gets the next grapheme. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_string_gi_get_grapheme(MVMThreadContext *tc, MVMGraphemeIter *gi) { while (1) { if (gi->pos < gi->end) { switch (gi->blob_type) { case MVM_STRING_GRAPHEME_32: return gi->active_blob.blob_32[gi->pos++]; case MVM_STRING_GRAPHEME_ASCII: return gi->active_blob.blob_ascii[gi->pos++]; case MVM_STRING_GRAPHEME_8: return gi->active_blob.blob_8[gi->pos++]; } } else if (gi->repetitions) { gi->pos = gi->start; gi->repetitions--; } else if (gi->strands_remaining) { MVMStringStrand *next = gi->next_strand; gi->active_blob.any = next->blob_string->body.storage.any; gi->blob_type = next->blob_string->body.storage_type; gi->pos = next->start; gi->end = next->end; gi->start = next->start; gi->repetitions = next->repetitions; gi->strands_remaining--; gi->next_strand++; } else { MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); } } } /* Code point iterator. Uses the grapheme iterator, and adds some extra bits * in order to iterate the code points in synthetics. */ struct MVMCodepointIter { /* The grapheme iterator. */ MVMGraphemeIter gi; /* The codes of the current synthetic we're walking through, if any, with * the number of combiners we returned so far, and the total number of * combiners there are. */ MVMCodepoint *synth_codes; MVMint32 visited_synth_codes; MVMint32 total_synth_codes; }; /* Initializes a code point iterator. */ MVM_STATIC_INLINE void MVM_string_ci_init(MVMThreadContext *tc, MVMCodepointIter *ci, MVMString *s) { /* Initialize our underlying grapheme iterator. */ MVM_string_gi_init(tc, &(ci->gi), s); /* We've no currently active synthetic codepoint (and other fields are * unused until we do, so leave them alone for now). */ ci->synth_codes = NULL; }; /* Checks if there is more to read from a code point iterator; this is the * case if we're still walking through a synthetic or we have more things * available from the underlying grapheme iterator. */ MVM_STATIC_INLINE MVMint32 MVM_string_ci_has_more(MVMThreadContext *tc, MVMCodepointIter *ci) { return ci->synth_codes || MVM_string_gi_has_more(tc, &(ci->gi)); } /* Gets the next code point. */ MVM_STATIC_INLINE MVMCodepoint MVM_string_ci_get_codepoint(MVMThreadContext *tc, MVMCodepointIter *ci) { MVMCodepoint result; /* Do we have combiners from a synthetic to return? */ if (ci->synth_codes) { /* Take the current combiner as the result. */ result = ci->synth_codes[ci->visited_synth_codes]; /* If we've seen all of the synthetics, clear up so we'll take another * grapheme next time around. */ ci->visited_synth_codes++; if (ci->visited_synth_codes == ci->total_synth_codes) ci->synth_codes = NULL; } /* Otherwise, proceed to the next grapheme. */ else { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &(ci->gi)); if (g >= 0) { /* It's not a synthetic, so we're done. */ result = (MVMCodepoint)g; } else { /* It's a synthetic. Look it up. */ MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); /* Set up the iterator so in the next iteration we will start to * hand back combiners. */ ci->synth_codes = synth->combs; ci->visited_synth_codes = 0; ci->total_synth_codes = synth->num_combs; /* Result is the base character of the grapheme. */ result = synth->base; } } return result; } MoarVM-2015.11/src/strings/latin1.c0000644000175000017500000001571212623370227015676 0ustar jnthnjnthn#include "moar.h" /* Decodes the specified number of bytes of latin1 into an NFG string, * creating a result of the specified type. The type must have the MVMString * REPR. */ MVMString * MVM_string_latin1_decode(MVMThreadContext *tc, const MVMObject *result_type, char *latin1_c, size_t bytes) { MVMuint8 *latin1 = (MVMuint8 *)latin1_c; MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t i, result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMint32) * bytes); result_graphs = 0; for (i = 0; i < bytes; i++) { if (latin1[i] == '\r' && i + 1 < bytes && latin1[i + 1] == '\n') { result->body.storage.blob_32[result_graphs++] = MVM_nfg_crlf_grapheme(tc); i++; } else { result->body.storage.blob_32[result_graphs++] = latin1[i]; } } result->body.num_graphs = result_graphs; return result; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ void MVM_string_latin1_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return; /* Take length of head buffer as initial guess. */ bufsize = ds->bytes_head->length; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; unsigned char *bytes = (unsigned char *)cur_bytes->bytes; while (pos < cur_bytes->length) { MVMCodepoint codepoint = bytes[pos++]; MVMGrapheme32 graph; if (last_was_cr) { if (codepoint == '\n') { graph = MVM_nfg_crlf_grapheme(tc); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) goto done; } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); } /* Encodes the specified substring to latin-1. Anything outside of latin-1 range * will become a ?. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_latin1_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { /* Latin-1 is a single byte encoding, but \r\n is a 2-byte grapheme, so we * may have to resize as we go. */ MVMuint32 startu = (MVMuint32)start; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - startu : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_latin1_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint ord = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } if (ord >= 0 && ord <= 255) { result[i] = (MVMuint8)ord; i++; } else if (replacement) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding Latin-1 string: could not encode codepoint %d", ord); } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to latin-1. Anything outside of latin-1 range * will become a ?. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_latin1_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size) { return MVM_string_latin1_encode_substr(tc, str, output_size, 0, -1, NULL); } MoarVM-2015.11/src/strings/latin1.h0000644000175000017500000000101712620140151015660 0ustar jnthnjnthnMVMString * MVM_string_latin1_decode(MVMThreadContext *tc, const MVMObject *result_type, char *latin1, size_t bytes); MVM_PUBLIC void MVM_string_latin1_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); char * MVM_string_latin1_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); char * MVM_string_latin1_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size); MoarVM-2015.11/src/strings/nfg.c0000644000175000017500000004123512623370227015257 0ustar jnthnjnthn#include "moar.h" /* Number of extra elements we add to the synthetics table each time we need * to grow it. */ #define MVM_SYNTHETIC_GROW_ELEMS 32 /* Finds the index of a given codepoint within a trie node. Returns it if * there is one, or negative if there is not (note 0 is a valid index). */ static MVMint32 find_child_node_idx(MVMThreadContext *tc, const MVMNFGTrieNode *node, MVMCodepoint cp) { if (node) { /* TODO: update this to do a binary search later on. */ MVMint32 i; for (i = 0; i < node->num_entries; i++) if (node->next_codes[i].code == cp) return i; } return -1; } /* Does a lookup in the trie for a synthetic for the specified codepoints. */ MVMNFGTrieNode * find_child_node(MVMThreadContext *tc, const MVMNFGTrieNode *node, MVMCodepoint cp) { MVMint32 idx = find_child_node_idx(tc, node, cp); return idx >= 0 ? node->next_codes[idx].node : NULL; } static MVMGrapheme32 lookup_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { MVMNFGTrieNode *cur_node = tc->instance->nfg->grapheme_lookup; MVMCodepoint *cur_code = codes; MVMint32 codes_remaining = num_codes; while (cur_node && codes_remaining) { cur_node = find_child_node(tc, cur_node, *cur_code); cur_code++; codes_remaining--; } return cur_node ? cur_node->graph : 0; } /* Recursive algorithm to add to the trie. Descends existing trie nodes so far * as we have them following the code points, then passes on a NULL for the * levels of current below that do not exist. Once we bottom out, makes a copy * of or creates a node for the synthetic. As we walk back up we create or * copy+tweak nodes until we have produced a new trie, re-using what we can of * the existing one. */ static MVMNFGTrieNode * twiddle_trie_node(MVMThreadContext *tc, MVMNFGTrieNode *current, MVMCodepoint *cur_code, MVMint32 codes_remaining, MVMGrapheme32 synthetic) { /* Make a new empty node, which we'll maybe copy some things from the * current node into. */ MVMNFGTrieNode *new_node = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMNFGTrieNode)); /* If we've more codes remaining... */ if (codes_remaining > 0) { /* Recurse, to get a new child node. */ MVMint32 idx = find_child_node_idx(tc, current, *cur_code); MVMNFGTrieNode *new_child = twiddle_trie_node(tc, idx >= 0 ? current->next_codes[idx].node : NULL, cur_code + 1, codes_remaining - 1, synthetic); /* If we had an existing child node... */ if (idx >= 0) { /* Make a copy of the next_codes list. */ size_t the_size = current->num_entries * sizeof(MVMNGFTrieNodeEntry); MVMNGFTrieNodeEntry *new_next_codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, the_size); memcpy(new_next_codes, current->next_codes, the_size); /* Update the copy to point to the new child. */ new_next_codes[idx].node = new_child; /* Install the new next_codes list in the new node, and free the * existing child list at the next safe point. */ new_node->num_entries = current->num_entries; new_node->next_codes = new_next_codes; MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, the_size, current->next_codes); } /* Otherwise, we're going to need to insert the new child into a * (possibly existing) child list. */ else { /* Calculate new child node list size and allocate it. */ MVMint32 orig_entries = current ? current->num_entries : 0; MVMint32 new_entries = orig_entries + 1; size_t new_size = new_entries * sizeof(MVMNGFTrieNodeEntry); MVMNGFTrieNodeEntry *new_next_codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); /* Go through original entries, copying those that are for a lower * code point than the one we're inserting a child for. */ MVMint32 insert_pos = 0; MVMint32 orig_pos = 0; while (orig_pos < orig_entries && current->next_codes[orig_pos].code < *cur_code) new_next_codes[insert_pos++] = current->next_codes[orig_pos++]; /* Insert the new child. */ new_next_codes[insert_pos].code = *cur_code; new_next_codes[insert_pos].node = new_child; insert_pos++; /* Copy the rest. */ while (orig_pos < orig_entries) new_next_codes[insert_pos++] = current->next_codes[orig_pos++]; /* Install the new next_codes list in the new node, and free any * existing child list at the next safe point. */ new_node->num_entries = new_entries; new_node->next_codes = new_next_codes; if (orig_entries) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_entries * sizeof(MVMNGFTrieNodeEntry), current->next_codes); } /* Always need to copy synthetic set on the existing node also; * otherwise make sure to clear it. */ new_node->graph = current ? current->graph : 0; } /* Otherwise, we reached the point where we need to install the synthetic. * If we already had a node here, we re-use the children of it. */ else { new_node->graph = synthetic; if (current) { new_node->num_entries = current->num_entries; new_node->next_codes = current->next_codes; } else { new_node->num_entries = 0; new_node->next_codes = NULL; } } /* Free any existing node at next safe point, return the new one. */ if (current) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, sizeof(MVMNGFTrieNodeEntry), current); return new_node; } static void add_synthetic_to_trie(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMGrapheme32 synthetic) { MVMNFGState *nfg = tc->instance->nfg; MVMNFGTrieNode *new_trie = twiddle_trie_node(tc, nfg->grapheme_lookup, codes, num_codes, synthetic); MVM_barrier(); nfg->grapheme_lookup = new_trie; } /* Assumes that we are holding the lock that serializes updates, and already * checked that the synthetic does not exist. Adds it to the lookup trie and * synthetics table, making sure to do enough copy/free-at-safe-point work to * not upset other threads possibly doing concurrent reads. */ static MVMGrapheme32 add_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMint32 utf8_c8) { MVMNFGState *nfg = tc->instance->nfg; MVMNFGSynthetic *synth; MVMGrapheme32 result; size_t comb_size; /* Grow the synthetics table if needed. */ if (nfg->num_synthetics % MVM_SYNTHETIC_GROW_ELEMS == 0) { size_t orig_size = nfg->num_synthetics * sizeof(MVMNFGSynthetic); size_t new_size = (nfg->num_synthetics + MVM_SYNTHETIC_GROW_ELEMS) * sizeof(MVMNFGSynthetic); MVMNFGSynthetic *new_synthetics = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); if (orig_size) { memcpy(new_synthetics, nfg->synthetics, orig_size); MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, nfg->synthetics); } nfg->synthetics = new_synthetics; } /* Set up the new synthetic entry. */ synth = &(nfg->synthetics[nfg->num_synthetics]); synth->base = *codes; synth->num_combs = num_codes - 1; comb_size = synth->num_combs * sizeof(MVMCodepoint); synth->combs = MVM_fixed_size_alloc(tc, tc->instance->fsa, comb_size); memcpy(synth->combs, codes + 1, comb_size); synth->case_uc = 0; synth->case_lc = 0; synth->case_tc = 0; synth->case_fc = 0; synth->is_utf8_c8 = utf8_c8; /* Memory barrier to make sure the synthetic is fully in place before we * bump the count. */ MVM_barrier(); nfg->num_synthetics++; /* Give the synthetic an ID by negating the new number of synthetics. */ result = -nfg->num_synthetics; /* Make an entry in the lookup trie for the new synthetic, so we can use * it in the future when seeing the same codepoint sequence. */ add_synthetic_to_trie(tc, codes, num_codes, result); return result; } /* Does a lookup of a synthetic in the trie. If we find one, returns it. If * not, acquires the update lock, re-checks that we really are missing the * synthetic, and then adds it. */ static MVMGrapheme32 lookup_or_add_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMint32 utf8_c8) { MVMGrapheme32 result = lookup_synthetic(tc, codes, num_codes); if (!result) { uv_mutex_lock(&tc->instance->nfg->update_mutex); result = lookup_synthetic(tc, codes, num_codes); if (!result) result = add_synthetic(tc, codes, num_codes, utf8_c8); uv_mutex_unlock(&tc->instance->nfg->update_mutex); } return result; } /* Takes one or more code points. If only one code point is passed, it is * returned as the grapheme. Otherwise, resolves it to a synthetic - either an * already existing one if we saw it before, or a new one if not. Assumes * that the code points are already in NFC, and as such canonical ordering has * been applied. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else return lookup_or_add_synthetic(tc, codes, num_codes, 0); } /* Does the same as MVM_nfg_codes_to_grapheme, but flags the added grapheme as * being an UTF8-C8 synthetic. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme_utf8_c8(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else return lookup_or_add_synthetic(tc, codes, num_codes, 1); } /* Gets the \r\n synthetic. */ MVMGrapheme32 MVM_nfg_crlf_grapheme(MVMThreadContext *tc) { MVMCodepoint codes[2] = { '\r', '\n' }; return lookup_or_add_synthetic(tc, codes, 2, 0); } /* Does a lookup of information held about a synthetic. The synth parameter * must be a synthetic codepoint (that is, negative). The memory returned is * not to be freed by the caller; it also is only valid until the next GC * safe point. */ MVMNFGSynthetic * MVM_nfg_get_synthetic_info(MVMThreadContext *tc, MVMGrapheme32 synth) { MVMNFGState *nfg = tc->instance->nfg; MVMint32 synth_idx = -synth - 1; if (synth >= 0) MVM_panic(1, "MVM_nfg_get_synthetic_info illegally called on codepoint >= 0"); if (synth_idx >= nfg->num_synthetics) MVM_panic(1, "MVM_nfg_get_synthetic_info called with out-of-range synthetic"); return &(nfg->synthetics[synth_idx]); } /* Gets the cached case change if we already computed it, or computes it if * this is the first time we're using it. */ static MVMGrapheme32 CASE_UNCHANGED[1] = {0}; static void compute_case_change(MVMThreadContext *tc, MVMGrapheme32 synth, MVMNFGSynthetic *synth_info, MVMint32 case_) { MVMGrapheme32 *result; MVMint32 num_result_graphs; /* Transform the base character. */ const MVMCodepoint *result_cps; MVMuint32 num_result_cps = MVM_unicode_get_case_change(tc, synth_info->base, case_, &result_cps); if (num_result_cps == 0 || *result_cps == synth_info->base) { /* Base character does not change, so grapheme stays the same. We * install a non-null sentinel for this case, and set the result * grapheme count to zero, which indicates no change. */ result = CASE_UNCHANGED; num_result_graphs = 0; } else { /* We can potentially get multiple graphemes back. We may also get * into situations where we case change the base and suddenly we * can normalize the whole thing to a non-synthetic. So, we take * a trip through the normalizer. Note we push the first thing * we get back from the case change, then our combiners, and * finally anything else the case change produced. This should * do about the right thing for both case changes that produce a * base and a combiner, and those that produce a base and a base, * since the normalizer applies Unicode canonical sorting. */ MVMNormalizer norm; MVMint32 i; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps, 1); MVM_unicode_normalizer_push_codepoints(tc, &norm, synth_info->combs, synth_info->num_combs); if (num_result_cps > 1) MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps + 1, num_result_cps - 1); MVM_unicode_normalizer_eof(tc, &norm); num_result_graphs = MVM_unicode_normalizer_available(tc, &norm); result = MVM_malloc(num_result_graphs * sizeof(MVMGrapheme32)); for (i = 0; i < num_result_graphs; i++) result[i] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); } switch (case_) { case MVM_unicode_case_change_type_upper: synth_info->case_uc = result; synth_info->case_uc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_lower: synth_info->case_lc = result; synth_info->case_lc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_title: synth_info->case_tc = result; synth_info->case_tc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_fold: synth_info->case_fc = result; synth_info->case_fc_graphs = num_result_graphs; break; default: MVM_panic(1, "NFG: invalid case change %d", case_); } } MVMuint32 MVM_nfg_get_case_change(MVMThreadContext *tc, MVMGrapheme32 synth, MVMint32 case_, MVMGrapheme32 **result) { MVMNFGSynthetic *synth_info = MVM_nfg_get_synthetic_info(tc, synth); switch (case_) { case MVM_unicode_case_change_type_upper: if (!synth_info->case_uc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_uc; return synth_info->case_uc_graphs; case MVM_unicode_case_change_type_lower: if (!synth_info->case_lc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_lc; return synth_info->case_lc_graphs; case MVM_unicode_case_change_type_title: if (!synth_info->case_tc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_tc; return synth_info->case_tc_graphs; case MVM_unicode_case_change_type_fold: if (!synth_info->case_fc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_fc; return synth_info->case_fc_graphs; default: MVM_panic(1, "NFG: invalid case change %d", case_); } } /* Returns non-zero if the result of concatenating the two strings will freely * leave us in NFG without any further effort. */ static MVMint32 passes_quickcheck_and_zero_ccc(MVMThreadContext *tc, MVMCodepoint cp) { const char *qc_str = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_NFG_QC); const char *ccc_str = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS); return qc_str && qc_str[0] == 'Y' && (!ccc_str || strlen(ccc_str) > 3 || (strlen(ccc_str) == 1 && ccc_str[0] == 0)); } MVMint32 MVM_nfg_is_concat_stable(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMGrapheme32 last_a; MVMGrapheme32 first_b; /* If either string is empty, we're good. */ if (a->body.num_graphs == 0 || b->body.num_graphs == 0) return 1; /* Get first and last graphemes of the strings. */ last_a = MVM_string_get_grapheme_at_nocheck(tc, a, a->body.num_graphs - 1); first_b = MVM_string_get_grapheme_at_nocheck(tc, b, 0); /* If either is synthetic, assume we'll have to re-normalize (this is an * over-estimate, most likely). Note if you optimize this that it serves * as a guard for what follows. */ if (last_a < 0 || first_b < 0) return 0; /* If both less than the first significant char for NFC, and the first is * not \r, we're good. */ if (last_a != 0x0D && last_a < MVM_NORMALIZE_FIRST_SIG_NFC && first_b < MVM_NORMALIZE_FIRST_SIG_NFC) return 1; /* If either fail quickcheck or have ccc > 0, have to re-normalize. */ return passes_quickcheck_and_zero_ccc(tc, last_a) && passes_quickcheck_and_zero_ccc(tc, first_b); } MoarVM-2015.11/src/strings/nfg.h0000644000175000017500000000562612623370227015270 0ustar jnthnjnthn/* State kept around for implementing Normal Form Grapheme. The design is such * that we can always do lookups without needing to acquire a look. When we * do additions of new synthetics, we must acquire the lock before doing so, * and be sure to validate nothing changed. We also must do sufficient copying * to ensure that we never break another thread doing a read. Memory to be * freed is thus done at a global safe point, which means we never have one * thread reading memory freed by another. */ struct MVMNFGState { /* Table of information about synthetic graphemes. Given some (negative) * synthetic S, we look up in this table with (-S - 1). */ MVMNFGSynthetic *synthetics; /* Trie used to do lookups by codepoints (already in NFC) to an (NFG) * grapheme. */ MVMNFGTrieNode *grapheme_lookup; /* Mutex used when we wish to do updates to the grapheme table. */ uv_mutex_t update_mutex; /* Number of synthetics we have. */ MVMint32 num_synthetics; }; /* State held about a synthetic. */ struct MVMNFGSynthetic { /* The base (non-combining) grapheme. */ MVMCodepoint base; /* The number of combiners we have. */ MVMint32 num_combs; /* Array of combiners. */ MVMCodepoint *combs; /* Cached case transforms, NULL if not calculated. */ MVMGrapheme32 *case_uc; MVMGrapheme32 *case_lc; MVMGrapheme32 *case_tc; MVMGrapheme32 *case_fc; /* Grapheme counts of cached case transforms. */ MVMint32 case_uc_graphs; MVMint32 case_lc_graphs; MVMint32 case_tc_graphs; MVMint32 case_fc_graphs; /* Is this a UTF-8 C-8 synthetic? */ MVMint32 is_utf8_c8; }; /* A node in the NFG trie. */ struct MVMNFGTrieNode { /* Set of entries for further traversal, sorted ascending on codepoint * so we can find an entry using binary search. */ MVMNGFTrieNodeEntry *next_codes; /* Number of entries in next_cps. */ MVMint32 num_entries; /* Non-zero if we reach a result at this node (and will always be negative * since it's an NFG synthetic). */ MVMGrapheme32 graph; }; /* An entry in the list of next possible codepoints in the NFG trie. */ struct MVMNGFTrieNodeEntry { /* The codepoint. */ MVMCodepoint code; /* Trie node to traverse to if we find this node. */ MVMNFGTrieNode *node; }; /* Functions related to grapheme handling. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes); MVMGrapheme32 MVM_nfg_codes_to_grapheme_utf8_c8(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes); MVMGrapheme32 MVM_nfg_crlf_grapheme(MVMThreadContext *tc); MVMNFGSynthetic * MVM_nfg_get_synthetic_info(MVMThreadContext *tc, MVMGrapheme32 synth); MVMuint32 MVM_nfg_get_case_change(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint32 case_, MVMGrapheme32 **result); MVMint32 MVM_nfg_is_concat_stable(MVMThreadContext *tc, MVMString *a, MVMString *b); MoarVM-2015.11/src/strings/normalize.c0000644000175000017500000007260512617121315016505 0ustar jnthnjnthn#include "moar.h" /* Maps outside-world normalization form codes to our internal set, validating * that we got something valid. */ MVMNormalization MVN_unicode_normalizer_form(MVMThreadContext *tc, MVMint64 form_in) { switch (form_in) { case 1: return MVM_NORMALIZE_NFC; case 2: return MVM_NORMALIZE_NFD; case 3: return MVM_NORMALIZE_NFKC; case 4: return MVM_NORMALIZE_NFKD; default: MVM_exception_throw_adhoc(tc, "Invalid normalization form %d", (int)form_in); } } /* Takes two objects, which must be of VMArray representation and holding * 32-bit integers. Performs normalization to the specified form. */ static void assert_codepoint_array(MVMThreadContext *tc, const MVMObject *arr, char *error) { if (IS_CONCRETE(arr) && REPR(arr)->ID == MVM_REPR_ID_MVMArray) { MVMuint8 slot_type = ((MVMArrayREPRData *)STABLE(arr)->REPR_data)->slot_type; if (slot_type == MVM_ARRAY_I32 || slot_type == MVM_ARRAY_U32) return; } MVM_exception_throw_adhoc(tc, "%s", error); } MVM_STATIC_INLINE void maybe_grow_result(MVMCodepoint **result, MVMint64 *result_alloc, MVMint64 needed) { if (needed >= *result_alloc) { while (needed >= *result_alloc) *result_alloc += 32; *result = MVM_realloc(*result, *result_alloc * sizeof(MVMCodepoint)); } } void MVM_unicode_normalize_codepoints(MVMThreadContext *tc, const MVMObject *in, MVMObject *out, MVMNormalization form) { MVMNormalizer norm; MVMCodepoint *input; MVMCodepoint *result; MVMint64 input_pos, input_codes, result_pos, result_alloc; MVMint32 ready; /* Validate input/output array. */ assert_codepoint_array(tc, in, "Normalization input must be native array of 32-bit integers"); assert_codepoint_array(tc, out, "Normalization output must be native array of 32-bit integers"); /* Get input array; if it's empty, we're done already. */ input = (MVMCodepoint *)((MVMArray *)in)->body.slots.u32 + ((MVMArray *)in)->body.start; input_codes = ((MVMArray *)in)->body.elems; if (input_codes == 0) return; /* Guess output size based on input size. */ result_alloc = input_codes; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); /* Perform normalization. */ MVM_unicode_normalizer_init(tc, &norm, form); input_pos = 0; result_pos = 0; while (input_pos < input_codes) { MVMCodepoint cp; ready = MVM_unicode_normalizer_process_codepoint(tc, &norm, input[input_pos], &cp); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = cp; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } input_pos++; } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* Put result into array body. */ ((MVMArray *)out)->body.slots.u32 = (MVMuint32 *) result; ((MVMArray *)out)->body.start = 0; ((MVMArray *)out)->body.elems = result_pos; } /* Takes an object, which must be of VMArray representation and holding * 32-bit integers. Treats them as Unicode codepoints, normalizes them at * Grapheme level, and returns the resulting NFG string. */ MVMString * MVM_unicode_codepoints_to_nfg_string(MVMThreadContext *tc, const MVMObject *codes) { MVMNormalizer norm; MVMCodepoint *input; MVMGrapheme32 *result; MVMint64 input_pos, input_codes, result_pos, result_alloc; MVMint32 ready; MVMString *str; /* Get input array; if it's empty, we're done already. */ assert_codepoint_array(tc, codes, "Code points to string input must be native array of 32-bit integers"); input = (MVMCodepoint *)((MVMArray *)codes)->body.slots.u32 + ((MVMArray *)codes)->body.start; input_codes = ((MVMArray *)codes)->body.elems; if (input_codes == 0) return tc->instance->str_consts.empty; /* Guess output size based on input size. */ result_alloc = input_codes; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); /* Perform normalization at grapheme level. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); input_pos = 0; result_pos = 0; while (input_pos < input_codes) { MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, input[input_pos], &g); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = g; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } input_pos++; } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* Produce an MVMString of the result. */ str = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); str->body.storage.blob_32 = result; str->body.storage_type = MVM_STRING_GRAPHEME_32; str->body.num_graphs = result_pos; return str; } /* Takes an NFG string and populates the array out, which must be a 32-bit * integer array, with codepoints normalized according to the specified * normalization form. */ void MVM_unicode_string_to_codepoints(MVMThreadContext *tc, MVMString *s, MVMNormalization form, MVMObject *out) { MVMCodepoint *result; MVMint64 result_pos, result_alloc; MVMCodepointIter ci; /* Validate output array and set up result storage. */ assert_codepoint_array(tc, out, "Normalization output must be native array of 32-bit integers"); result_alloc = s->body.num_graphs; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); result_pos = 0; /* Create codepoint iterator. */ MVM_string_ci_init(tc, &ci, s); /* If we want NFC, just iterate, since NFG is constructed out of NFC. */ if (form == MVM_NORMALIZE_NFC) { while (MVM_string_ci_has_more(tc, &ci)) { maybe_grow_result(&result, &result_alloc, result_pos + 1); result[result_pos++] = MVM_string_ci_get_codepoint(tc, &ci); } } /* Otherwise, need to feed it through a normalizer. */ else { MVMNormalizer norm; MVMint32 ready; MVM_unicode_normalizer_init(tc, &norm, form); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint cp; ready = MVM_unicode_normalizer_process_codepoint(tc, &norm, MVM_string_ci_get_codepoint(tc, &ci), &cp); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = cp; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); } /* Put result into array body. */ ((MVMArray *)out)->body.slots.u32 = (MVMuint32 *)result; ((MVMArray *)out)->body.start = 0; ((MVMArray *)out)->body.elems = result_pos; } /* Initialize the MVMNormalizer pointed to to perform the specified kind of * normalization. */ void MVM_unicode_normalizer_init(MVMThreadContext *tc, MVMNormalizer *n, MVMNormalization form) { n->form = form; n->buffer_size = 32; n->buffer = MVM_malloc(n->buffer_size * sizeof(MVMCodepoint)); n->buffer_start = 0; n->buffer_end = 0; n->buffer_norm_end = 0; switch (n->form) { case MVM_NORMALIZE_NFD: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFD; n->quick_check_property = MVM_UNICODE_PROPERTY_NFD_QC; break; case MVM_NORMALIZE_NFKD: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFKD; n->quick_check_property = MVM_UNICODE_PROPERTY_NFKD_QC; break; case MVM_NORMALIZE_NFC: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFC; n->quick_check_property = MVM_UNICODE_PROPERTY_NFC_QC; break; case MVM_NORMALIZE_NFKC: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFKC; n->quick_check_property = MVM_UNICODE_PROPERTY_NFKC_QC; break; case MVM_NORMALIZE_NFG: n->quick_check_property = MVM_UNICODE_PROPERTY_NFG_QC; n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFC; break; default: abort(); } } /* Cleanup an MVMNormalization once we're done normalizing. */ void MVM_unicode_normalizer_cleanup(MVMThreadContext *tc, MVMNormalizer *n) { free(n->buffer); } /* Adds a codepoint into the buffer, making sure there's space. */ static void add_codepoint_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint cp) { if (n->buffer_end == n->buffer_size) { if (n->buffer_start != 0) { MVMint32 shuffle = n->buffer_start; MVMint32 to_move = n->buffer_end - n->buffer_start; memmove(n->buffer, n->buffer + n->buffer_start, to_move * sizeof(MVMCodepoint)); n->buffer_start = 0; n->buffer_end -= shuffle; n->buffer_norm_end -= shuffle; } else { n->buffer_size *= 2; n->buffer = MVM_realloc(n->buffer, n->buffer_size * sizeof(MVMCodepoint)); } } n->buffer[n->buffer_end++] = cp; } /* Hangul-related constants from Unicode spec 3.12, following naming * convention from spec. */ static const int SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28, NCount = 588, /* VCount * TCount */ SCount = 11172; /* LCount * NCount */ /* Decomposes a Hangul codepoint and add it into the buffer. */ static void decomp_hangul_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint s) { /* Algorithm from Unicode spec 3.12, following naming convention from spec. */ int SIndex = s - SBase; if (SIndex < 0 || SIndex >= SCount) { add_codepoint_to_buffer(tc, n, s); } else { int L = LBase + SIndex / NCount; int V = VBase + (SIndex % NCount) / TCount; int T = TBase + SIndex % TCount; add_codepoint_to_buffer(tc, n, (MVMCodepoint)L); add_codepoint_to_buffer(tc, n, (MVMCodepoint)V); if (T != TBase) add_codepoint_to_buffer(tc, n, (MVMCodepoint)T); } } /* Decompose the codepoint and add it into the buffer. */ static void decomp_codepoint_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint cp) { /* See if we actually need to decompose (can skip if the decomposition * type is None, or we're only doing Canonical decomposition and it is * anything except Canonical). */ const char *type = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE); MVMint64 decompose = 1; if (!type) decompose = 0; else if (strcmp(type, "None") == 0) decompose = 0; else if (!MVM_NORMALIZE_COMPAT_DECOMP(n->form) && strcmp(type, "Canonical") != 0) decompose = 0; if (decompose) { /* We need to decompose. Get the decomp spec and go over the things in * it; things without a decomp spec are presumably Hangul and need the * algorithmic treatment. */ char *spec = (char *)MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_DECOMP_SPEC); if (spec && spec[0]) { char *end = spec + strlen(spec); while (spec < end) { /* Parse hex character code, and then recurse to do any further * decomposition on it; this recursion terminates when we find a * non-decomposable thing and add it to the buffer. */ MVMCodepoint decomp_char = (MVMCodepoint)strtol(spec, &spec, 16); decomp_codepoint_to_buffer(tc, n, decomp_char); } } else { decomp_hangul_to_buffer(tc, n, cp); } } else { /* Don't need to decompose; add it right into the buffer. */ add_codepoint_to_buffer(tc, n, cp); } } /* Checks if the specified character answers "yes" on the appropriate quick check. */ static MVMint64 passes_quickcheck(MVMThreadContext *tc, const MVMNormalizer *n, MVMCodepoint cp) { const char *pval = MVM_unicode_codepoint_get_property_cstr(tc, cp, n->quick_check_property); return pval && pval[0] == 'Y'; } /* Gets the canonical combining class for a codepoint. */ static MVMint64 ccc(MVMThreadContext *tc, MVMCodepoint cp) { if (cp < MVM_NORMALIZE_FIRST_NONZERO_CCC) { return 0; } else { const char *ccc_str = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS); return !ccc_str || strlen(ccc_str) > 3 ? 0 : atoi(ccc_str); } } /* Checks if the thing we have is a control character (for the definition in * the Unicode Standard Annex #29). Assumes it doesn't have to care about any * of the controls in the Latin-1 range, because those were already covered in * a fast path. */ static MVMint32 is_control_beyond_latin1(MVMThreadContext *tc, MVMCodepoint in) { /* U+200C ZERO WIDTH NON-JOINER and U+200D ZERO WIDTH JOINER are excluded. */ if (in != 0x200C && in != 0x200D) { /* Consider general property. */ const char *genprop = MVM_unicode_codepoint_get_property_cstr(tc, in, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY); if (genprop[0] == 'Z') { /* Line_Separator and Paragraph_Separator are controls. */ return genprop[1] == 'l' || genprop[1] == 'p'; } if (genprop[0] == 'C') { /* Control, Surrogate, and Format are controls. */ if (genprop[1] == 'c' || genprop[1] == 's' || genprop[1] == 'f') { return 1; } /* Unassigned is, but only for Default_Ignorable_Code_Point. */ if (genprop[1] == 'n') { return MVM_unicode_codepoint_get_property_int(tc, in, MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT) != 0; } } } return 0; } /* Implements the Unicode Canonical Ordering algorithm (3.11, D109). */ static void canonical_sort(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { /* Yes, this is the simplest possible thing. Key thing if you decide to * replace it with something more optimal: it must not re-order code * points with equal CCC. */ MVMint32 reordered = 1; while (reordered) { MVMint32 i = from; reordered = 0; while (i < to - 1) { MVMint64 cccA = ccc(tc, n->buffer[i]); MVMint64 cccB = ccc(tc, n->buffer[i + 1]); if (cccA > cccB && cccB > 0) { MVMCodepoint tmp = n->buffer[i]; n->buffer[i] = n->buffer[i + 1]; n->buffer[i + 1] = tmp; reordered = 1; } i++; } } } /* Implements the Unicode Canonical Composition algorithm (3.11, D117). */ static void canonical_composition(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { MVMint32 c_idx = from + 1; while (c_idx < to) { /* Search for the last non-blocked starter. */ MVMint32 ss_idx = c_idx - 1; MVMint32 c_ccc = ccc(tc, n->buffer[c_idx]); while (ss_idx >= from) { /* Make sure we don't go past a code point that blocks a starter * from the current character we're considering. */ MVMint32 ss_ccc = ccc(tc, n->buffer[ss_idx]); if (ss_ccc >= c_ccc && ss_ccc != 0) break; /* Have we found a starter? */ if (ss_ccc == 0) { /* See if there's a primary composite for the starter and the * current code point under consideration. */ MVMCodepoint pc = MVM_unicode_find_primary_composite(tc, n->buffer[ss_idx], n->buffer[c_idx]); if (pc > 0) { /* Replace the starter with the primary composite. */ n->buffer[ss_idx] = pc; /* Move the rest of the buffer back one position. */ memmove(n->buffer + c_idx, n->buffer + c_idx + 1, (n->buffer_end - (c_idx + 1)) * sizeof(MVMCodepoint)); n->buffer_end--; /* Sync cc_idx and to with the change. */ c_idx--; to--; } /* Don't look back beyond this starter; covers the ccc(B) = 0 * case of D105. */ break; } ss_idx--; } /* Move on to the next character. */ c_idx++; } /* Make another pass for the Hangul special case. (A future optimization * may be to incorporate this into the above loop.) */ c_idx = from; while (c_idx < to - 1) { /* Do we have a potential LPart? */ MVMCodepoint LPart = n->buffer[c_idx]; if (LPart >= LBase && LPart <= (LBase + LCount)) { /* Yes, now see if it's followed by a VPart (always safe to look * due to "to - 1" in loop condition above). */ MVMCodepoint LIndex = LPart - LBase; MVMCodepoint VPart = n->buffer[c_idx + 1]; if (VPart >= VBase && VPart <= (VBase + VCount)) { /* Certainly something to compose; compute that. */ MVMCodepoint VIndex = VPart - VBase; MVMCodepoint LVIndex = LIndex * NCount + VIndex * TCount; MVMCodepoint s = SBase + LVIndex; MVMint32 composed = 1; /* Is there a TPart too? */ if (c_idx < to - 2) { MVMCodepoint TPart = n->buffer[c_idx + 2]; if (TPart >= TBase && TPart <= (TBase + TCount)) { /* We need to compose 3 things. */ MVMCodepoint TIndex = TPart - TBase; s += TIndex; composed = 2; } } /* Put composed codepoint into the buffer. */ n->buffer[c_idx] = s; /* Shuffle codepoints after this in the buffer back. */ memmove(n->buffer + c_idx + 1, n->buffer + c_idx + 1 + composed, (n->buffer_end - (c_idx + 1 + composed)) * sizeof(MVMCodepoint)); n->buffer_end -= composed; /* Sync to with updated buffer size. */ to -= composed; } } c_idx++; } } /* Performs grapheme composition (to get Normal Form Grapheme) on the range of * codepoints provided. This follows the algorithm in the Unicode Standard * Annex #29 on grapheme cluster boundaries. Note that we have already done * the handling of breaking around controls much earlier, so don't have to * consider that case. */ static MVMint32 maybe_hangul(MVMCodepoint cp) { return cp >= 0x1100 && cp < 0x1200 || cp >= 0xA960 && cp < 0xD7FC; } static MVMint32 is_regional_indicator(MVMCodepoint cp) { /* U+1F1E6 REGIONAL INDICATOR SYMBOL LETTER A * .. * U+1F1FF REGIONAL INDICATOR SYMBOL LETTER Z */ return cp >= 0x1F1E6 && cp <= 0x1F1FF; } static MVMint32 is_grapheme_extend(MVMThreadContext *tc, MVMCodepoint cp) { return MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND); } static MVMint32 is_spacing_mark(MVMThreadContext *tc, MVMCodepoint cp) { const char *genprop = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY); if (genprop[0] == 'M' && genprop[1] == 'c') { const char *gcb = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK); return strcmp(gcb, "Extend") != 0; } else { /* Special cases outside of Mc: * U+0E33 THAI CHARACTER SARA AM * U+0EB3 LAO VOWEL SIGN AM */ return cp == 0x0E33 || cp == 0x0EB3; } } static MVMint32 should_break(MVMThreadContext *tc, MVMCodepoint a, MVMCodepoint b) { /* Don't break between \r and \n, but otherwise break around \r. */ if (a == 0x0D && b == 0x0A) return 0; if (a == 0x0D || b == 0x0D) return 1; /* Hangul. Avoid property lookup with a couple of quick range checks. */ if (maybe_hangul(a) && maybe_hangul(b)) { const char *hst_a = MVM_unicode_codepoint_get_property_cstr(tc, a, MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE); const char *hst_b = MVM_unicode_codepoint_get_property_cstr(tc, b, MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE); if (strcmp(hst_a, "L") == 0) return !(strcmp(hst_b, "L") == 0 || strcmp(hst_b, "V") == 0 || strcmp(hst_b, "LV") == 0 || strcmp(hst_b, "LVT") == 0); else if (strcmp(hst_a, "LV") == 0 || strcmp(hst_a, "V") == 0) return !(strcmp(hst_b, "V") == 0 || strcmp(hst_b, "T") == 0); else if (strcmp(hst_a, "LVT") == 0 || strcmp(hst_a, "T") == 0) return !(strcmp(hst_b, "T") == 0); } /* Don't break between regional indicators. */ if (is_regional_indicator(a) && is_regional_indicator(b)) return 0; /* Don't break before extenders. */ if (is_grapheme_extend(tc, b)) return 0; /* Don't break before spacing marks. (In the Unicode version at the time * of implementing, there were no Prepend characters, so we don't worry * about that rule for now). */ if (is_spacing_mark(tc, b)) return 0; /* Otherwise break. */ return 1; } static void grapheme_composition(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { if (to - from >= 2) { MVMint32 starterish = from; MVMint32 insert_pos = from; MVMint32 pos = from; while (pos < to) { MVMint32 next_pos = pos + 1; if (next_pos == to || should_break(tc, n->buffer[pos], n->buffer[next_pos])) { /* Last in buffer or next code point is a non-starter; turn * sequence into a synthetic. */ MVMGrapheme32 g = MVM_nfg_codes_to_grapheme(tc, n->buffer + starterish, next_pos - starterish); n->buffer[insert_pos++] = g; /* The next code point is our new starterish (harmless if we * are already at the end of the buffer). */ starterish = next_pos; } pos++; } memmove(n->buffer + insert_pos, n->buffer + to, (n->buffer_end - to) * sizeof(MVMCodepoint)); n->buffer_end -= to - insert_pos; } } /* Called when the very fast case of normalization fails (that is, when we get * any two codepoints in a row where at least one is greater than the first * significant codepoint identified by a quick check for the target form). We * may find the quick check itself is enough; if not, we have to do real work * compute the normalization. */ MVMint32 MVM_unicode_normalizer_process_codepoint_full(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out) { MVMint64 qc_in, ccc_in; /* If it's a control character (outside of the range we checked in the * fast path) then it's a normalization terminator. */ if (in > 0xFF && is_control_beyond_latin1(tc, in)) return MVM_unicode_normalizer_process_codepoint_norm_terminator(tc, n, in, out); /* Do a quickcheck on the codepoint we got in and get its CCC. */ qc_in = passes_quickcheck(tc, n, in); ccc_in = ccc(tc, in); /* Fast cases when we pass quick check and what we got in has CCC = 0. */ if (qc_in && ccc_in == 0) { if (MVM_NORMALIZE_COMPOSE(n->form)) { /* We're composing. If we have exactly one thing in the buffer and * it also passes the quick check, and both it and the thing in the * buffer have a CCC of zero, we can hand back the first of the * two - effectively replacing what's in the buffer with the new * codepoint coming in. Note that the NFG quick-check property * factors in grapheme extenders that don't have a CCC of zero, * so we're safe. */ if (n->buffer_end - n->buffer_start == 1) { MVMCodepoint maybe_result = n->buffer[n->buffer_start]; if (passes_quickcheck(tc, n, maybe_result) && ccc(tc, maybe_result) == 0) { *out = n->buffer[n->buffer_start]; n->buffer[n->buffer_start] = in; return 1; } } } else { /* We're only decomposing. There should probably be nothing in the * buffer in this case; if so we can simply return the codepoint. */ if (n->buffer_start == n->buffer_end) { *out = in; return 1; } } } /* If we didn't pass quick check... */ if (!qc_in) { /* If we're composing, then decompose the last thing placed in the * buffer, if any. We need to do this since it may have passed * quickcheck, but having seen some character that does pass then we * must make sure we decomposed the prior passing one too. */ if (MVM_NORMALIZE_COMPOSE(n->form) && n->buffer_end != n->buffer_norm_end) { MVMCodepoint decomp = n->buffer[n->buffer_end - 1]; n->buffer_end--; decomp_codepoint_to_buffer(tc, n, decomp); } /* Decompose this new character into the buffer. We'll need to see * more before we can go any further. */ decomp_codepoint_to_buffer(tc, n, in); return 0; } /* Since anything we have at this point does pass quick check, add it to * the buffer directly. */ add_codepoint_to_buffer(tc, n, in); /* If the codepoint has a CCC that is non-zero, it's not a starter so we * should see more before normalizing. */ if (ccc_in > 0) return 0; /* If we don't have at least one codepoint in the buffer, it's too early * to hand anything back. */ if (n->buffer_end - n->buffer_start <= 1) return 0; /* Perform canonical sorting on everything from the start of the not yet * normalized things in the buffer, up to but excluding the quick-check * passing thing we just added. */ canonical_sort(tc, n, n->buffer_norm_end, n->buffer_end - 1); /* Perform canonical composition and grapheme composition if needed. */ if (MVM_NORMALIZE_COMPOSE(n->form)) { canonical_composition(tc, n, n->buffer_norm_end, n->buffer_end - 1); if (MVM_NORMALIZE_GRAPHEME(n->form)) grapheme_composition(tc, n, n->buffer_norm_end, n->buffer_end - 1); } /* We've now normalized all except the latest, quick-check-passing * codepoint. */ n->buffer_norm_end = n->buffer_end - 1; /* Hand back a codepoint, and flag how many more are available. */ *out = n->buffer[n->buffer_start]; return n->buffer_norm_end - n->buffer_start++; } /* Push a number of codepoints into the "to normalize" buffer. */ void MVM_unicode_normalizer_push_codepoints(MVMThreadContext *tc, MVMNormalizer *n, const MVMCodepoint *in, MVMint32 num_codepoints) { MVMint32 i; for (i = 0; i < num_codepoints; i++) decomp_codepoint_to_buffer(tc, n, in[i]); } /* Processes a codepoint that we regard as a "normalization terminator". These * never have a decomposition, and for all practical purposes will not have a * combiner on them. We treat them specially so we don't, during I/O, block on * seeing a codepoint after them, which for things like REPLs that need to see * input right after a \n makes for problems. */ MVMint32 MVM_unicode_normalizer_process_codepoint_norm_terminator(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out) { /* Add the codepoint into the buffer. */ add_codepoint_to_buffer(tc, n, in); /* Treat this as an "eof", which really means "normalize what ya got". */ MVM_unicode_normalizer_eof(tc, n); /* Hand back a normalized codepoint, and the number available (have to * compensate for the one we steal for *out). */ *out = MVM_unicode_normalizer_get_codepoint(tc, n); return 1 + MVM_unicode_normalizer_available(tc, n); } /* Called when we are expecting no more codepoints. */ void MVM_unicode_normalizer_eof(MVMThreadContext *tc, MVMNormalizer *n) { /* Perform canonical ordering and, if needed, canonical composition on * what remains. */ canonical_sort(tc, n, n->buffer_norm_end, n->buffer_end); if (MVM_NORMALIZE_COMPOSE(n->form)) { canonical_composition(tc, n, n->buffer_norm_end, n->buffer_end); if (MVM_NORMALIZE_GRAPHEME(n->form)) grapheme_composition(tc, n, n->buffer_norm_end, n->buffer_end); } /* We've now normalized all that remains. */ n->buffer_norm_end = n->buffer_end; } MoarVM-2015.11/src/strings/normalize.h0000644000175000017500000001750412617121315016507 0ustar jnthnjnthn/* Normalization modes. Numbers picked so that: * - The LSB tells us whether to do canonical or compatibility normalization * - The second bit tells us whether to do canonical normalization * - The third bit tells us to go a step further and create synthetic codes * for graphemes. */ typedef enum { MVM_NORMALIZE_NFD = 0, MVM_NORMALIZE_NFKD = 1, MVM_NORMALIZE_NFC = 2, MVM_NORMALIZE_NFKC = 3, MVM_NORMALIZE_NFG = 6 } MVMNormalization; /* Ways of checking various properties of the normalization form. */ #define MVM_NORMALIZE_COMPAT_DECOMP(form) (form & 1) #define MVM_NORMALIZE_COMPOSE(form) (form & 2) #define MVM_NORMALIZE_GRAPHEME(form) (form & 4) /* First codepoint where we have to actually do a real check and maybe some * work when normalizing. */ #define MVM_NORMALIZE_FIRST_SIG_NFD 0x00C0 #define MVM_NORMALIZE_FIRST_SIG_NFC 0x0300 #define MVM_NORMALIZE_FIRST_SIG_NFKD 0x00A0 #define MVM_NORMALIZE_FIRST_SIG_NFKC 0x00A0 /* First codepoint with a non-zero canonical combining class. */ #define MVM_NORMALIZE_FIRST_NONZERO_CCC 0x300 /* Streaming Unicode normalizer structure. */ struct MVMNormalizer { /* What form of normalization are we doing? */ MVMNormalization form; /* Current buffer of codepoints we're working to normalize. */ MVMCodepoint *buffer; /* Size of the normalization buffer. */ MVMint32 buffer_size; /* Start offset in the buffer where we're still processing. */ MVMint32 buffer_start; /* End offset in the buffer, and where to add the next thing to process. */ MVMint32 buffer_end; /* End offset in the buffer for things we've normalized and so can return. */ MVMint32 buffer_norm_end; /* The first significant codepoint in this normalization form that we may * have to do something with. If we see two things beneath the limit in a * row then we know the first one below it is good to spit out. */ MVMCodepoint first_significant; /* The quickcheck property for the normalization form in question. */ MVMint32 quick_check_property; }; /* Guts-y functions, called by the API level ones below. */ MVMint32 MVM_unicode_normalizer_process_codepoint_full(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out); MVMint32 MVM_unicode_normalizer_process_codepoint_norm_terminator(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out); /* Takes a codepoint to process for normalization as the "in" parameter. If we * are able to produce one or more normalized codepoints right off, then we * put it into the location pointed to by "out", and return the number of * codepoints now available including the one we just passed out. If we can't * produce a normalized codepoint right now, we return a 0. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_process_codepoint(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out) { /* Control characters in the Latin-1 range are normalization terminators - * that is, we know we can spit out whatever codepoints we have seen so * far in normalized form without having to consider them into the * normalization process. The exception is if we're computing NFG, and * we got \r, which can form a grapheme in the case of \r\n. */ if (in < 0x20 || in >= 0x7F && in <= 0x9F || in == 0xAD) if (!(MVM_NORMALIZE_GRAPHEME(n->form) && in == 0x0D)) return MVM_unicode_normalizer_process_codepoint_norm_terminator(tc, n, in, out); /* Fast-paths apply when the codepoint to consider is too low to have any * interesting properties in the target normalization form. */ if (in < n->first_significant) { if (MVM_NORMALIZE_COMPOSE(n->form)) { /* For the composition fast path we always have to know that we've * seen two codepoints in a row that are below those needing a full * check. Then we can spit out the first one. Exception: we are * normalizing to graphemes and see \r. */ if (!(MVM_NORMALIZE_GRAPHEME(n->form) && in == 0x0D)) { if (n->buffer_end - n->buffer_start == 1) { if (n->buffer[n->buffer_start] < n->first_significant) { *out = n->buffer[n->buffer_start]; n->buffer[n->buffer_start] = in; return 1; } } } } else { /* For decomposition fast-path, the buffer should be empty. In * that case, we just hand back what we got. */ if (n->buffer_start == n->buffer_end) { *out = in; return 1; } } } /* Fall back to slow path. */ return MVM_unicode_normalizer_process_codepoint_full(tc, n, in, out); } /* Grapheme version of the above. Note that this exists mostly for API clarity * rather than adding any semantics; the normalizer must be configured to * produce NFG to get synthetics out. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_process_codepoint_to_grapheme(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMGrapheme32 *out) { assert(sizeof(MVMCodepoint) == sizeof(MVMGrapheme32)); return MVM_unicode_normalizer_process_codepoint(tc, n, in, (MVMGrapheme32 *)out); } /* Push a number of codepoints into the "to normalize" buffer. */ void MVM_unicode_normalizer_push_codepoints(MVMThreadContext *tc, MVMNormalizer *n, const MVMCodepoint *in, MVMint32 num_codepoints); /* Get the number of codepoints/graphemes ready to fetch. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_available(MVMThreadContext *tc, MVMNormalizer *n) { return n->buffer_norm_end - n->buffer_start; } /* Indicate that we've reached the end of the input stream. Any codepoints * left to normalize now can be. */ void MVM_unicode_normalizer_eof(MVMThreadContext *tc, MVMNormalizer *n); /* Get a normalized codepoint; should only ever be called if there are some * known to be available, either because normalize_to_codepoint returned a * value greater than 1, or normalize_available returned a non-zero value. */ MVM_STATIC_INLINE MVMCodepoint MVM_unicode_normalizer_get_codepoint(MVMThreadContext *tc, MVMNormalizer *n) { if (n->buffer_norm_end == n->buffer_start) MVM_exception_throw_adhoc(tc, "Normalization: illegal call to get codepoint"); return n->buffer[n->buffer_start++]; } /* Grapheme version of the above. Note that this exists mostly for API clarity * rather than adding any semantics; the normalizer must be configured to * produce NFG to get synthetics out. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_unicode_normalizer_get_grapheme(MVMThreadContext *tc, MVMNormalizer *n) { assert(sizeof(MVMCodepoint) == sizeof(MVMGrapheme32)); if (n->buffer_norm_end == n->buffer_start) MVM_exception_throw_adhoc(tc, "Normalization: illegal call to get grapheme"); return (MVMGrapheme32)n->buffer[n->buffer_start++]; } /* Setup and teardown of the MVMNormalizer struct. */ MVMNormalization MVN_unicode_normalizer_form(MVMThreadContext *tc, MVMint64 form_in); void MVM_unicode_normalizer_init(MVMThreadContext *tc, MVMNormalizer *n, MVMNormalization norm); void MVM_unicode_normalizer_cleanup(MVMThreadContext *tc, MVMNormalizer *n); /* High-level normalize implementation, working from an input array of * codepoints and producing an output array of codepoints. */ void MVM_unicode_normalize_codepoints(MVMThreadContext *tc, const MVMObject *in, MVMObject *out, MVMNormalization form); /* High-level function to produces an NFG string from an input array of * codepoints. */ MVMString * MVM_unicode_codepoints_to_nfg_string(MVMThreadContext *tc,const MVMObject *codes); /* High-level function to produce an array of codepoints from a string. */ void MVM_unicode_string_to_codepoints(MVMThreadContext *tc, MVMString *s, MVMNormalization form, MVMObject *out); MoarVM-2015.11/src/strings/ops.c0000644000175000017500000020562412623370227015312 0ustar jnthnjnthn#include "moar.h" #define MVM_DEBUG_STRANDS 0 #if MVM_DEBUG_STRANDS static void check_strand_sanity(MVMThreadContext *tc, MVMString *s) { MVMGraphemeIter gi; MVMuint32 len; MVM_string_gi_init(tc, &gi, s); len = 0; while (MVM_string_gi_has_more(tc, &gi)) { MVM_string_gi_get_grapheme(tc, &gi); len++; } if (len != MVM_string_graphs(tc, s)) MVM_exception_throw_adhoc(tc, "Strand sanity check failed (stand length %d != num_graphs %d)", len, MVM_string_graphs(tc, s)); } #define STRAND_CHECK(tc, s) check_strand_sanity(tc, s); #else #define STRAND_CHECK(tc, s) #endif /* Allocates strand storage. */ static MVMStringStrand * allocate_strands(MVMThreadContext *tc, MVMuint16 num_strands) { return MVM_malloc(num_strands * sizeof(MVMStringStrand)); } /* Copies strands from one strand string to another. */ static void copy_strands(MVMThreadContext *tc, const MVMString *from, MVMuint16 from_offset, MVMString *to, MVMuint16 to_offset, MVMuint16 num_strands) { assert(from->body.storage_type == MVM_STRING_STRAND); assert(to->body.storage_type == MVM_STRING_STRAND); memcpy( to->body.storage.strands + to_offset, from->body.storage.strands + from_offset, num_strands * sizeof(MVMStringStrand)); } /* Collapses a bunch of strands into a single blob string. */ static MVMString * collapse_strands(MVMThreadContext *tc, MVMString *orig) { MVMString *result; MVMStringIndex i; MVMuint32 ographs; MVMGraphemeIter gi; MVMROOT(tc, orig, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); }); ographs = MVM_string_graphs(tc, orig); result->body.num_graphs = ographs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(ographs * sizeof(MVMGrapheme32)); MVM_string_gi_init(tc, &gi, orig); for (i = 0; i < ographs; i++) result->body.storage.blob_32[i] = MVM_string_gi_get_grapheme(tc, &gi); return result; } /* Takes a string that is no longer in NFG form after some concatenation-style * operation, and returns a new string that is in NFG. Note that we could do a * much, much, smarter thing in the future that doesn't involve all of this * copying and allocation and re-doing the whole string, but cases like this * should be fairly rare anyway, so go with simplicity for now. */ static MVMString * re_nfg(MVMThreadContext *tc, MVMString *in) { MVMNormalizer norm; MVMCodepointIter ci; MVMint32 ready; MVMString *out; /* Create output buffer; it'll never be longer than the initial estimate * since the most we'll do is collapse two things into one in places. */ MVMGrapheme32 *out_buffer = MVM_malloc(in->body.num_graphs * sizeof(MVMGrapheme32)); MVMint64 out_pos = 0; /* Iterate codepoints and normalizer. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); MVM_string_ci_init(tc, &ci, in); while (MVM_string_ci_has_more(tc, &ci)) { MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, MVM_string_ci_get_codepoint(tc, &ci), &g); if (ready) { out_buffer[out_pos++] = g; while (--ready > 0) out_buffer[out_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); while (ready--) out_buffer[out_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* Build result string. */ out = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); out->body.storage.blob_32 = out_buffer; out->body.storage_type = MVM_STRING_GRAPHEME_32; out->body.num_graphs = out_pos; return out; } /* Returns nonzero if two substrings are equal, doesn't check bounds */ MVMint64 MVM_string_substrings_equal_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb) { MVMGraphemeIter gia; MVMGraphemeIter gib; MVMint64 i; /* Fast paths when storage types are identical. */ switch (a->body.storage_type) { case MVM_STRING_GRAPHEME_32: if (b->body.storage_type == MVM_STRING_GRAPHEME_32) return 0 == memcmp( a->body.storage.blob_32 + starta, b->body.storage.blob_32 + startb, length * sizeof(MVMGrapheme32)); break; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: if (b->body.storage_type == MVM_STRING_GRAPHEME_ASCII || b->body.storage_type == MVM_STRING_GRAPHEME_8) return 0 == memcmp( a->body.storage.blob_8 + starta, b->body.storage.blob_8 + startb, length); break; } /* Normal path, for the rest of the time. */ MVM_string_gi_init(tc, &gia, a); MVM_string_gi_init(tc, &gib, b); MVM_string_gi_move_to(tc, &gia, starta); MVM_string_gi_move_to(tc, &gib, startb); for (i = 0; i < length; i++) if (MVM_string_gi_get_grapheme(tc, &gia) != MVM_string_gi_get_grapheme(tc, &gib)) return 0; return 1; } /* Returns the codepoint without doing checks, for internal VM use only. */ MVMGrapheme32 MVM_string_get_grapheme_at_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 index) { switch (a->body.storage_type) { case MVM_STRING_GRAPHEME_32: return a->body.storage.blob_32[index]; case MVM_STRING_GRAPHEME_ASCII: return a->body.storage.blob_ascii[index]; case MVM_STRING_GRAPHEME_8: return a->body.storage.blob_8[index]; case MVM_STRING_STRAND: { MVMGraphemeIter gi; MVM_string_gi_init(tc, &gi, a); MVM_string_gi_move_to(tc, &gi, index); return MVM_string_gi_get_grapheme(tc, &gi); } default: MVM_exception_throw_adhoc(tc, "String corruption detected: bad storage type"); } } /* Returns the location of one string in another or -1 */ MVMint64 MVM_string_index(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start) { MVMint64 result = -1; size_t index = (size_t)start; MVMStringIndex hgraphs = MVM_string_graphs(tc, haystack), ngraphs = MVM_string_graphs(tc, needle); MVM_string_check_arg(tc, haystack, "index search target"); MVM_string_check_arg(tc, needle, "index search term"); if (!ngraphs) return start <= hgraphs ? start : -1; /* the empty string is in any other string */ if (!hgraphs) return -1; if (start < 0 || start >= hgraphs) return -1; if (ngraphs > hgraphs || ngraphs < 1) return -1; /* brute force for now. horrible, yes. halp. */ while (index <= hgraphs - ngraphs) { if (MVM_string_substrings_equal_nocheck(tc, needle, 0, ngraphs, haystack, index)) { result = (MVMint64)index; break; } index++; } return result; } /* Returns the location of one string in another or -1 */ MVMint64 MVM_string_index_from_end(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start) { MVMint64 result = -1; size_t index; MVMStringIndex hgraphs = MVM_string_graphs(tc, haystack), ngraphs = MVM_string_graphs(tc, needle); MVM_string_check_arg(tc, haystack, "rindex search target"); MVM_string_check_arg(tc, needle, "rindex search term"); if (!ngraphs) { if (start >= 0) return start <= hgraphs ? start : -1; /* the empty string is in any other string */ else return hgraphs; /* no start, so return end */ } if (!hgraphs) return -1; if (ngraphs > hgraphs || ngraphs < 1) return -1; if (start == -1) start = hgraphs - ngraphs; if (start < 0 || start >= hgraphs) /* maybe return -1 instead? */ MVM_exception_throw_adhoc(tc, "index start offset out of range"); index = start; if (index + ngraphs > hgraphs) { index = hgraphs - ngraphs; } /* brute force for now. horrible, yes. halp. */ do { if (MVM_string_substrings_equal_nocheck(tc, needle, 0, ngraphs, haystack, index)) { result = (MVMint64)index; break; } } while (index-- > 0); return result; } /* Returns a substring of the given string */ MVMString * MVM_string_substring(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMint64 length) { MVMString *result; MVMint64 start_pos, end_pos; /* convert to signed to avoid implicit arithmetic conversions */ MVMint64 agraphs = (MVMint64)MVM_string_graphs(tc, a); MVM_string_check_arg(tc, a, "substring"); /* -1 signifies go to the end of the string; anything less is a bug */ if (length < -1) MVM_exception_throw_adhoc(tc, "Substring length (%"PRId64") cannot be negative", length); /* negative offsets count from the end */ start_pos = offset < 0 ? offset + agraphs : offset; end_pos = length == -1 ? agraphs : start_pos + length; /* return an empty string if start_pos is out of bounds but positive */ if (start_pos > agraphs) { start_pos = 0; end_pos = 0; } if (end_pos < 0) MVM_exception_throw_adhoc(tc, "Substring end (%"PRId64") cannot be less than 0", end_pos); /* Ensure we're within bounds. */ if (start_pos < 0) start_pos = 0; if (end_pos > agraphs) end_pos = agraphs; /* Check trivial cases: empty string and whole string. */ if (start_pos == end_pos) return tc->instance->str_consts.empty; if (start_pos == 0 && end_pos == agraphs) return a; /* Construct a result; how we efficiently do so will vary based on the * input string. */ MVMROOT(tc, a, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = end_pos - start_pos; if (a->body.storage_type != MVM_STRING_STRAND) { /* It's some kind of buffer. Construct a strand view into it. */ result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); result->body.num_strands = 1; result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = start_pos; result->body.storage.strands[0].end = end_pos; result->body.storage.strands[0].repetitions = 0; } else if (a->body.num_strands == 1 && a->body.storage.strands[0].repetitions == 0) { /* Single strand string; quite possibly already a substring. We'll * just produce an updated view. */ MVMStringStrand *orig_strand = &(a->body.storage.strands[0]); result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); result->body.num_strands = 1; result->body.storage.strands[0].blob_string = orig_strand->blob_string; result->body.storage.strands[0].start = orig_strand->start + start_pos; result->body.storage.strands[0].end = orig_strand->start + end_pos; result->body.storage.strands[0].repetitions = 0; } else { /* Produce a new blob string, collapsing the strands. */ MVMGraphemeIter gi; MVMint32 i; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(result->body.num_graphs * sizeof(MVMGrapheme32)); MVM_string_gi_init(tc, &gi, a); MVM_string_gi_move_to(tc, &gi, start_pos); for (i = 0; i < result->body.num_graphs; i++) result->body.storage.blob_32[i] = MVM_string_gi_get_grapheme(tc, &gi); } }); STRAND_CHECK(tc, result); return result; } MVMString * MVM_string_replace(MVMThreadContext *tc, MVMString *original, MVMint64 start, MVMint64 count, MVMString *replacement) { /* XXX this could probably be done more efficiently directly. */ MVMString *first_part; MVMString *rest_part; MVMString *result; MVM_gc_root_temp_push(tc, (MVMCollectable **)&replacement); MVM_gc_root_temp_push(tc, (MVMCollectable **)&original); first_part = MVM_string_substring(tc, original, 0, start); MVM_gc_root_temp_push(tc, (MVMCollectable **)&first_part); rest_part = MVM_string_substring(tc, original, start + count, -1); rest_part = MVM_string_concatenate(tc, replacement, rest_part); result = MVM_string_concatenate(tc, first_part, rest_part); MVM_gc_root_temp_pop_n(tc, 3); STRAND_CHECK(tc, result); return result; } /* Append one string to another. */ static MVMint32 final_strand_matches(MVMThreadContext *tc, MVMString *a, MVMString *b) { if (a->body.storage_type == MVM_STRING_STRAND) { MVMStringStrand *ss = &(a->body.storage.strands[a->body.num_strands - 1]); if (ss->end - ss->start == MVM_string_graphs(tc, b)) if (MVM_string_equal_at(tc, ss->blob_string, b, ss->start)) return 1; } return 0; } MVMString * MVM_string_concatenate(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *result; MVMuint32 agraphs, bgraphs; MVM_string_check_arg(tc, a, "concatenate"); MVM_string_check_arg(tc, b, "concatenate"); /* Simple empty-string cases. */ agraphs = MVM_string_graphs(tc, a); if (agraphs == 0) return b; bgraphs = MVM_string_graphs(tc, b); if (bgraphs == 0) return a; /* Otherwise, we'll assemble a result string. */ MVMROOT(tc, a, { MVMROOT(tc, b, { /* Allocate it. */ result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); /* Total graphemes is trivial; just total up inputs. */ result->body.num_graphs = agraphs + bgraphs; /* Result string will be made of strands. */ result->body.storage_type = MVM_STRING_STRAND; /* Detect the wonderful case where we're repeatedly concating the same * string again and again, and thus can just bump a repetition. */ if (final_strand_matches(tc, a, b)) { /* We have it; just copy the strands to a new string and bump the * repetitions count of the last one. */ result->body.storage.strands = allocate_strands(tc, a->body.num_strands); copy_strands(tc, a, 0, result, 0, a->body.num_strands); result->body.storage.strands[a->body.num_strands - 1].repetitions++; result->body.num_strands = a->body.num_strands; } /* Otherwise, construct a new strand string. */ else { /* See if we have too many strands between the two. If so, we will * collapse the biggest side. */ MVMuint16 strands_a = a->body.storage_type == MVM_STRING_STRAND ? a->body.num_strands : 1; MVMuint16 strands_b = b->body.storage_type == MVM_STRING_STRAND ? b->body.num_strands : 1; MVMString *effective_a = a; MVMString *effective_b = b; if (strands_a + strands_b > MVM_STRING_MAX_STRANDS) { if (strands_a >= strands_b) { effective_a = collapse_strands(tc, effective_a); strands_a = 1; } else { effective_b = collapse_strands(tc, effective_b); strands_b = 1; } } /* Assemble the result. */ result->body.num_strands = strands_a + strands_b; result->body.storage.strands = allocate_strands(tc, strands_a + strands_b); if (effective_a->body.storage_type == MVM_STRING_STRAND) { copy_strands(tc, effective_a, 0, result, 0, strands_a); } else { MVMStringStrand *ss = &(result->body.storage.strands[0]); ss->blob_string = effective_a; ss->start = 0; ss->end = effective_a->body.num_graphs; ss->repetitions = 0; } if (effective_b->body.storage_type == MVM_STRING_STRAND) { copy_strands(tc, effective_b, 0, result, strands_a, strands_b); } else { MVMStringStrand *ss = &(result->body.storage.strands[strands_a]); ss->blob_string = effective_b; ss->start = 0; ss->end = effective_b->body.num_graphs; ss->repetitions = 0; } } }); }); STRAND_CHECK(tc, result); return MVM_nfg_is_concat_stable(tc, a, b) ? result : re_nfg(tc, result); } MVMString * MVM_string_repeat(MVMThreadContext *tc, MVMString *a, MVMint64 count) { MVMString *result; MVMuint32 agraphs; MVM_string_check_arg(tc, a, "repeat"); /* Validate count; handle common cases. */ if (count == 0) return tc->instance->str_consts.empty; if (count == 1) return a; if (count < 0) MVM_exception_throw_adhoc(tc, "repeat count (%"PRId64") cannot be negative", count); if (count > (1 << 30)) MVM_exception_throw_adhoc(tc, "repeat count > %d arbitrarily unsupported...", (1 << 30)); /* If input string is empty, repeating it is empty. */ agraphs = MVM_string_graphs(tc, a); if (agraphs == 0) return tc->instance->str_consts.empty; /* Now build a result string with the repetition set. */ MVMROOT(tc, a, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = agraphs * count; result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); result->body.num_strands = 1; if (a->body.storage_type == MVM_STRING_STRAND) { if (a->body.num_strands == 1 && a->body.storage.strands[0].repetitions == 0) { copy_strands(tc, a, 0, result, 0, 1); } else { MVMROOT(tc, result, { a = collapse_strands(tc, a); }); result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = 0; result->body.storage.strands[0].end = agraphs; } } else { result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = 0; result->body.storage.strands[0].end = agraphs; } result->body.storage.strands[0].repetitions = count - 1; }); STRAND_CHECK(tc, result); return result; } void MVM_string_say(MVMThreadContext *tc, MVMString *a) { MVM_string_check_arg(tc, a, "say"); MVM_io_write_string(tc, tc->instance->stdout_handle, a, 1); } void MVM_string_print(MVMThreadContext *tc, MVMString *a) { MVM_string_check_arg(tc, a, "print"); MVM_io_write_string(tc, tc->instance->stdout_handle, a, 0); } /* Tests whether one string a has the other string b as a substring at that index */ MVMint64 MVM_string_equal_at(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset) { MVMStringIndex agraphs, bgraphs; MVM_string_check_arg(tc, a, "equal_at"); MVM_string_check_arg(tc, b, "equal_at"); agraphs = MVM_string_graphs(tc, a); bgraphs = MVM_string_graphs(tc, b); if (offset < 0) { offset += agraphs; if (offset < 0) offset = 0; /* XXX I think this is the right behavior here */ } if (agraphs - offset < bgraphs) return 0; return MVM_string_substrings_equal_nocheck(tc, a, offset, bgraphs, b, 0); } MVMint64 MVM_string_equal_at_ignore_case(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset) { MVMString *lca; MVMString *lcb; MVMROOT(tc, b, { lca = MVM_string_lc(tc, a); MVMROOT(tc, lca, { lcb = MVM_string_lc(tc, b); }); }); return MVM_string_equal_at(tc, lca, lcb, offset); } MVMGrapheme32 MVM_string_ord_basechar_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset) { MVMGrapheme32 g = MVM_string_get_grapheme_at(tc, s, offset); MVMNormalizer norm; MVMint32 ready; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, g, &g); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) g = MVM_unicode_normalizer_get_grapheme(tc, &norm); return g; } /* Compares two strings for equality. */ MVMint64 MVM_string_equal(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVM_string_check_arg(tc, a, "equal"); MVM_string_check_arg(tc, b, "equal"); if (a == b) return 1; if (MVM_string_graphs(tc, a) != MVM_string_graphs(tc, b)) return 0; return MVM_string_equal_at(tc, a, b, 0); } /* more general form of has_at; compares two substrings for equality */ MVMint64 MVM_string_have_at(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb) { MVM_string_check_arg(tc, a, "have_at"); MVM_string_check_arg(tc, b, "have_at"); if (starta < 0 || startb < 0) return 0; if (length == 0) return 1; if (starta + length > MVM_string_graphs(tc, a) || startb + length > MVM_string_graphs(tc, b)) return 0; return MVM_string_substrings_equal_nocheck(tc, a, starta, length, b, startb); } /* Returns the grapheme at a given index of the string */ MVMint64 MVM_string_get_grapheme_at(MVMThreadContext *tc, MVMString *a, MVMint64 index) { MVMStringIndex agraphs; MVM_string_check_arg(tc, a, "grapheme_at"); agraphs = MVM_string_graphs(tc, a); if (index < 0 || index >= agraphs) MVM_exception_throw_adhoc(tc, "Invalid string index: max %"PRId32", got %"PRId64, agraphs - 1, index); return (MVMint64)MVM_string_get_grapheme_at_nocheck(tc, a, index); } /* Finds the location of a grapheme in a string. Useful for small character class lookup */ MVMint64 MVM_string_index_of_grapheme(MVMThreadContext *tc, MVMString *a, MVMGrapheme32 grapheme) { size_t index = -1; MVMGraphemeIter gi; MVM_string_check_arg(tc, a, "string_index_of_grapheme"); MVM_string_gi_init(tc, &gi, a); while (MVM_string_gi_has_more(tc, &gi)) { index++; if (MVM_string_gi_get_grapheme(tc, &gi) == grapheme) return index; } return -1; } /* Case change functions. */ static MVMint64 grapheme_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMGrapheme32 g); static MVMString * do_case_change(MVMThreadContext *tc, MVMString *s, MVMint32 type, char *error) { MVMint64 sgraphs; MVM_string_check_arg(tc, s, error); sgraphs = MVM_string_graphs(tc, s); if (sgraphs) { MVMString *result; MVMGraphemeIter gi; MVMint64 result_graphs = sgraphs; MVMGrapheme32 *result_buf = MVM_malloc(result_graphs * sizeof(MVMGrapheme32)); MVMint32 changed = 0; MVMint64 i = 0; MVM_string_gi_init(tc, &gi, s); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); peeked: if (g == 0x03A3) { /* Greek sigma needs special handling when lowercased. */ switch (type) { case MVM_unicode_case_change_type_upper: case MVM_unicode_case_change_type_title: result_buf[i++] = g; break; case MVM_unicode_case_change_type_lower: changed = 1; if (i == 0) { /* Start of string, so not final. */ result_buf[i++] = 0x03C3; } else if (!grapheme_is_cclass(tc, MVM_CCLASS_ALPHABETIC, result_buf[i - 1])) { /* Previous char is not a letter; not final (as has * to be at end of a word and not only thing in a * word). */ result_buf[i++] = 0x03C3; } else if (!MVM_string_gi_has_more(tc, &gi)) { /* End of string. We only reach here if we have a * letter before us, so it must be final. */ result_buf[i++] = 0x03C2; } else { /* Letter before us, something ahead of us. Need to * peek ahead to see if it's a letter, to decide if * we have final sigma or not. */ g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, MVM_CCLASS_ALPHABETIC, g)) result_buf[i++] = 0x03C3; else result_buf[i++] = 0x03C2; goto peeked; } break; case MVM_unicode_case_change_type_fold: result_buf[i++] = 0x03C3; changed = 1; break; } } else if (g >= 0) { const MVMCodepoint *result_cps; MVMuint32 num_result_cps = MVM_unicode_get_case_change(tc, g, type, &result_cps); if (num_result_cps == 0) { result_buf[i++] = g; } else if (num_result_cps == 1) { result_buf[i++] = *result_cps; changed = 1; } else { /* To maintain NFG, we need to re-normalize when we get an * expansion. */ MVMNormalizer norm; MVMint32 num_result_graphs; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps, num_result_cps); MVM_unicode_normalizer_eof(tc, &norm); num_result_graphs = MVM_unicode_normalizer_available(tc, &norm); /* Make space for any extra graphemes. */ if (num_result_graphs > 1) { result_graphs += num_result_graphs - 1; result_buf = MVM_realloc(result_buf, result_graphs * sizeof(MVMGrapheme32)); } /* Copy resulting graphemes. */ while (num_result_graphs > 0) { result_buf[i++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); num_result_graphs--; } changed = 1; /* Clean up normalizer (we could init one per transform * and keep it around in the future, if we find it's a * worthwhile gain). */ MVM_unicode_normalizer_cleanup(tc, &norm); } } else { MVMGrapheme32 *transformed; MVMint32 num_transformed = MVM_nfg_get_case_change(tc, g, type, &transformed); if (num_transformed == 0) { result_buf[i++] = g; } else if (num_transformed == 1) { result_buf[i++] = *transformed; changed = 1; } else { MVMuint32 j; result_graphs += num_transformed - 1; result_buf = MVM_realloc(result_buf, result_graphs * sizeof(MVMGrapheme32)); for (j = 0; j < num_transformed; j++) result_buf[i++] = transformed[j]; changed = 1; } } } if (changed) { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = result_buf; return result; } else { MVM_free(result_buf); } } STRAND_CHECK(tc, s); return s; } MVMString * MVM_string_uc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_upper, "uc"); } MVMString * MVM_string_lc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_lower, "lc"); } MVMString * MVM_string_tc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_title, "tc"); } MVMString * MVM_string_fc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_fold, "fc"); } /* Decodes a C buffer to an MVMString, dependent on the encoding type flag. */ MVMString * MVM_string_decode(MVMThreadContext *tc, const MVMObject *type_object, char *Cbuf, MVMint64 byte_length, MVMint64 encoding_flag) { switch(encoding_flag) { case MVM_encoding_type_utf8: return MVM_string_utf8_decode_strip_bom(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_ascii: return MVM_string_ascii_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_latin1: return MVM_string_latin1_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_utf16: return MVM_string_utf16_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_windows1252: return MVM_string_windows1252_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_utf8_c8: return MVM_string_utf8_c8_decode(tc, type_object, Cbuf, byte_length); default: MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %"PRId64, encoding_flag); } } /* Encodes an MVMString to a C buffer, dependent on the encoding type flag */ char * MVM_string_encode(MVMThreadContext *tc, MVMString *s, MVMint64 start, MVMint64 length, MVMuint64 *output_size, MVMint64 encoding_flag, MVMString *replacement) { switch(encoding_flag) { case MVM_encoding_type_utf8: return MVM_string_utf8_encode_substr(tc, s, output_size, start, length, replacement); case MVM_encoding_type_ascii: return MVM_string_ascii_encode_substr(tc, s, output_size, start, length, replacement); case MVM_encoding_type_latin1: return MVM_string_latin1_encode_substr(tc, s, output_size, start, length, replacement); case MVM_encoding_type_utf16: return MVM_string_utf16_encode_substr(tc, s, output_size, start, length, replacement); case MVM_encoding_type_windows1252: return MVM_string_windows1252_encode_substr(tc, s, output_size, start, length, replacement); case MVM_encoding_type_utf8_c8: return MVM_string_utf8_c8_encode_substr(tc, s, output_size, start, length, replacement); default: MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %"PRId64, encoding_flag); } } /* Encodes a string, and writes the encoding string into the supplied Buf * instance, which should be an integer array with MVMArray REPR. */ void MVM_string_encode_to_buf(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement) { MVMuint64 output_size; MVMuint8 *encoded; MVMArrayREPRData *buf_rd; MVMuint8 elem_size = 0; /* Ensure the target is in the correct form. */ MVM_string_check_arg(tc, s, "encode"); if (!IS_CONCRETE(buf) || REPR(buf)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "encode requires a native array to write into"); buf_rd = (MVMArrayREPRData *)STABLE(buf)->REPR_data; if (buf_rd) { switch (buf_rd->slot_type) { case MVM_ARRAY_I64: elem_size = 8; break; case MVM_ARRAY_I32: elem_size = 4; break; case MVM_ARRAY_I16: elem_size = 2; break; case MVM_ARRAY_I8: elem_size = 1; break; case MVM_ARRAY_U64: elem_size = 8; break; case MVM_ARRAY_U32: elem_size = 4; break; case MVM_ARRAY_U16: elem_size = 2; break; case MVM_ARRAY_U8: elem_size = 1; break; } } if (!elem_size) MVM_exception_throw_adhoc(tc, "encode requires a native int array"); if (((MVMArray *)buf)->body.slots.any) MVM_exception_throw_adhoc(tc, "encode requires an empty array"); /* At least find_encoding may allocate on first call, so root just * in case. */ MVMROOT(tc, buf, { MVMROOT(tc, s, { const MVMuint8 encoding_flag = MVM_string_find_encoding(tc, enc_name); encoded = (MVMuint8 *)MVM_string_encode(tc, s, 0, MVM_string_graphs(tc, s), &output_size, encoding_flag, replacement); }); }); /* Stash the encoded data in the VMArray. */ ((MVMArray *)buf)->body.slots.i8 = (MVMint8 *)encoded; ((MVMArray *)buf)->body.start = 0; ((MVMArray *)buf)->body.ssize = output_size / elem_size; ((MVMArray *)buf)->body.elems = output_size / elem_size; } /* Decodes a string using the data from the specified Buf. */ MVMString * MVM_string_decode_from_buf(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name) { MVMArrayREPRData *buf_rd; MVMuint8 encoding_flag; MVMuint8 elem_size = 0; /* Ensure the source is in the correct form. */ if (!IS_CONCRETE(buf) || REPR(buf)->ID != MVM_REPR_ID_MVMArray) MVM_exception_throw_adhoc(tc, "decode requires a native array to read from"); buf_rd = (MVMArrayREPRData *)STABLE(buf)->REPR_data; if (buf_rd) { switch (buf_rd->slot_type) { case MVM_ARRAY_I64: elem_size = 8; break; case MVM_ARRAY_I32: elem_size = 4; break; case MVM_ARRAY_I16: elem_size = 2; break; case MVM_ARRAY_I8: elem_size = 1; break; case MVM_ARRAY_U64: elem_size = 8; break; case MVM_ARRAY_U32: elem_size = 4; break; case MVM_ARRAY_U16: elem_size = 2; break; case MVM_ARRAY_U8: elem_size = 1; break; } } if (!elem_size) MVM_exception_throw_adhoc(tc, "encode requires a native int array"); /* Decode. */ MVMROOT(tc, buf, { encoding_flag = MVM_string_find_encoding(tc, enc_name); }); return MVM_string_decode(tc, tc->instance->VMString, (char *)(((MVMArray *)buf)->body.slots.i8 + ((MVMArray *)buf)->body.start), ((MVMArray *)buf)->body.elems * elem_size, encoding_flag); } MVMObject * MVM_string_split(MVMThreadContext *tc, MVMString *separator, MVMString *input) { MVMObject *result; MVMStringIndex start, end, sep_length; MVMHLLConfig *hll = MVM_hll_current(tc); MVM_string_check_arg(tc, separator, "split separator"); MVM_string_check_arg(tc, input, "split input"); MVMROOT(tc, input, { MVMROOT(tc, separator, { result = MVM_repr_alloc_init(tc, hll->slurpy_array_type); MVMROOT(tc, result, { start = 0; end = MVM_string_graphs(tc, input); sep_length = MVM_string_graphs(tc, separator); while (start < end) { MVMString *portion; MVMStringIndex index; MVMStringIndex length; /* XXX make this use the dual-traverse iterator, but such that it can reset the index of what it's comparing... */ index = MVM_string_index(tc, input, separator, start); length = sep_length ? (index == -1 ? end : index) - start : 1; if (length > 0 || (sep_length && length == 0)) { portion = MVM_string_substring(tc, input, start, length); MVMROOT(tc, portion, { MVMObject *pobj = MVM_repr_alloc_init(tc, hll->str_box_type); MVM_repr_set_str(tc, pobj, portion); MVM_repr_push_o(tc, result, pobj); }); } start += length + sep_length; /* Gather an empty string if the delimiter is found at the end. */ if (sep_length && start == end) { MVMObject *pobj = MVM_repr_alloc_init(tc, hll->str_box_type); MVM_repr_set_str(tc, pobj, tc->instance->str_consts.empty); MVM_repr_push_o(tc, result, pobj); } } }); }); }); return result; } MVMString * MVM_string_join(MVMThreadContext *tc, MVMString *separator, MVMObject *input) { MVMString *result; MVMString **pieces; MVMint64 elems, num_pieces, sgraphs, i, is_str_array, total_graphs; MVMuint16 sstrands, total_strands; MVMint32 concats_stable = 1; MVM_string_check_arg(tc, separator, "join separator"); if (!IS_CONCRETE(input)) MVM_exception_throw_adhoc(tc, "join needs a concrete array to join"); /* See how many things we have to join; if the answer is "none" then we * can make a hasty escape. */ elems = MVM_repr_elems(tc, input); if (elems == 0) return tc->instance->str_consts.empty; is_str_array = REPR(input)->pos_funcs.get_elem_storage_spec(tc, STABLE(input)).boxed_primitive == MVM_STORAGE_SPEC_BP_STR; /* Allocate result. */ MVMROOT(tc, separator, { MVMROOT(tc, input, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); }); }); /* Take a first pass through the string, counting up length and the total * number of strands we encounter as well as building a flat array of the * strings (to we only have to do the indirect calls once). */ sgraphs = MVM_string_graphs(tc, separator); if (sgraphs) sstrands = separator->body.storage_type == MVM_STRING_STRAND ? separator->body.num_strands : 1; else sstrands = 1; pieces = MVM_malloc(elems * sizeof(MVMString *)); num_pieces = 0; total_graphs = 0; total_strands = 0; for (i = 0; i < elems; i++) { /* Get piece of the string. */ MVMString *piece; MVMint64 piece_graphs; if (is_str_array) { piece = MVM_repr_at_pos_s(tc, input, i); if (!piece) continue; } else { MVMObject *item = MVM_repr_at_pos_o(tc, input, i); if (!item || !IS_CONCRETE(item)) continue; piece = MVM_repr_get_str(tc, item); } /* If it wasn't the first piece, add separator here. */ if (num_pieces) { total_strands += sstrands; total_graphs += sgraphs; } /* Add on the piece's strands and graphs. */ piece_graphs = MVM_string_graphs(tc, piece); if (piece_graphs) { total_strands += piece->body.storage_type == MVM_STRING_STRAND ? piece->body.num_strands : 1; total_graphs += piece_graphs; } /* Store piece. */ pieces[num_pieces++] = piece; } /* We now know the total eventual number of graphemes. */ if (total_graphs == 0) { free(pieces); return tc->instance->str_consts.empty; } result->body.num_graphs = total_graphs; /* If we just collect all the things as strands, are we within bounds, and * will be come out ahead? */ if (total_strands < MVM_STRING_MAX_STRANDS && total_graphs / total_strands >= 16) { /* XXX TODO: Implement this, conditionalize branch thing below. */ } /*else {*/ if (1) { /* We'll produce a single, flat string. */ MVMint64 position = 0; MVMGraphemeIter gi; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(total_graphs * sizeof(MVMGrapheme32)); for (i = 0; i < num_pieces; i++) { /* Get piece. */ MVMString *piece = pieces[i]; /* Add separator if needed. */ if (i > 0) { if (sgraphs) { if (!concats_stable) /* Already stable; no more checks. */; else if (!MVM_nfg_is_concat_stable(tc, pieces[i - 1], separator)) concats_stable = 0; else if (!MVM_nfg_is_concat_stable(tc, separator, piece)) concats_stable = 0; switch (separator->body.storage_type) { case MVM_STRING_GRAPHEME_32: memcpy( result->body.storage.blob_32 + position, separator->body.storage.blob_32, sgraphs * sizeof(MVMGrapheme32)); position += sgraphs; break; /* XXX Can special-case 8-bit NFG and ASCII here too. */ default: MVM_string_gi_init(tc, &gi, separator); while (MVM_string_gi_has_more(tc, &gi)) result->body.storage.blob_32[position++] = MVM_string_gi_get_grapheme(tc, &gi); break; } } else { /* Separator has no graphemes, so NFG stability check * should consider pieces. */ if (!concats_stable) /* Already stable; no more checks. */; else if (!MVM_nfg_is_concat_stable(tc, pieces[i - 1], piece)) concats_stable = 0; } } /* Add piece. */ switch (piece->body.storage_type) { case MVM_STRING_GRAPHEME_32: { MVMint64 pgraphs = MVM_string_graphs(tc, piece); memcpy( result->body.storage.blob_32 + position, piece->body.storage.blob_32, pgraphs * sizeof(MVMGrapheme32)); position += pgraphs; break; } /* XXX Can special-case 8-bit NFG and ASCII here too. */ default: MVM_string_gi_init(tc, &gi, piece); while (MVM_string_gi_has_more(tc, &gi)) result->body.storage.blob_32[position++] = MVM_string_gi_get_grapheme(tc, &gi); break; } } } MVM_free(pieces); STRAND_CHECK(tc, result); return concats_stable ? result : re_nfg(tc, result); } /* Returning nonzero means it found the char at the position specified in 'a' in 'b'. * For character enumerations in regexes. */ MVMint64 MVM_string_char_at_in_string(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMString *b) { MVMuint32 bgraphs; MVMGrapheme32 search; MVM_string_check_arg(tc, a, "char_at_in_string"); MVM_string_check_arg(tc, b, "char_at_in_string"); /* We return -2 here only to be able to distinguish between "out of bounds" and "not in string". */ if (offset < 0 || offset >= MVM_string_graphs(tc, a)) return -2; search = MVM_string_get_grapheme_at_nocheck(tc, a, offset); bgraphs = MVM_string_graphs(tc, b); switch (b->body.storage_type) { case MVM_STRING_GRAPHEME_32: { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_32[i] == search) return i; break; } case MVM_STRING_GRAPHEME_ASCII: if (search >= 0 && search <= 127) { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_ascii[i] == search) return i; } break; case MVM_STRING_GRAPHEME_8: if (search >= -128 && search <= 127) { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_8[i] == search) return i; } break; case MVM_STRING_STRAND: { MVMGraphemeIter gi; MVMStringIndex i; MVM_string_gi_init(tc, &gi, b); for (i = 0; i < bgraphs; i++) if (MVM_string_gi_get_grapheme(tc, &gi) == search) return i; } } return -1; } MVMint64 MVM_string_offset_has_unicode_property_value(MVMThreadContext *tc, MVMString *s, MVMint64 offset, MVMint64 property_code, MVMint64 property_value_code) { MVMGrapheme32 g; MVMCodepoint cp; MVM_string_check_arg(tc, s, "uniprop"); if (offset < 0 || offset >= MVM_string_graphs(tc, s)) return 0; g = MVM_string_get_grapheme_at_nocheck(tc, s, offset); if (g >= 0) cp = (MVMCodepoint)g; else cp = MVM_nfg_get_synthetic_info(tc, g)->base; return MVM_unicode_codepoint_has_property_value(tc, cp, property_code, property_value_code); } /* Normalizes a string to a flat MVMGrapheme32 buffer, for the benefit of * hashing. Would rather not have to do this eventually. */ void MVM_string_flatten(MVMThreadContext *tc, MVMString *s) { MVM_string_check_arg(tc, s, "flatten"); switch (s->body.storage_type) { case MVM_STRING_GRAPHEME_32: return; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: { MVMuint32 length = MVM_string_graphs(tc, s); MVMGrapheme32 *flat = MVM_malloc(length * sizeof(MVMGrapheme32)); MVMGrapheme8 *orig = s->body.storage.blob_8; MVMuint32 i; for (i = 0; i < length; i++) flat[i] = orig[i]; s->body.storage.blob_32 = flat; s->body.storage_type = MVM_STRING_GRAPHEME_32; MVM_free(orig); break; } case MVM_STRING_STRAND: { MVMGrapheme32 *flat = MVM_malloc(MVM_string_graphs(tc, s) * sizeof(MVMGrapheme32)); MVMStringStrand *orig = s->body.storage.strands; MVMuint32 i = 0; MVMGraphemeIter gi; MVM_string_gi_init(tc, &gi, s); while (MVM_string_gi_has_more(tc, &gi)) flat[i++] = MVM_string_gi_get_grapheme(tc, &gi); s->body.storage.blob_32 = flat; s->body.storage_type = MVM_STRING_GRAPHEME_32; MVM_free(orig); break; } } } /* Escapes a string, replacing various chars like \n with \\n. Can no doubt be * further optimized. */ MVMString * MVM_string_escape(MVMThreadContext *tc, MVMString *s) { MVMString *res = NULL; MVMStringIndex spos = 0; MVMStringIndex bpos = 0; MVMStringIndex sgraphs, balloc; MVMGrapheme32 *buffer; MVMGrapheme32 crlf; MVM_string_check_arg(tc, s, "escape"); sgraphs = MVM_string_graphs(tc, s); balloc = sgraphs; buffer = MVM_malloc(sizeof(MVMGrapheme32) * balloc); crlf = MVM_nfg_crlf_grapheme(tc); for (; spos < sgraphs; spos++) { MVMGrapheme32 graph = MVM_string_get_grapheme_at_nocheck(tc, s, spos); MVMGrapheme32 esc = 0; switch (graph) { case '\\': esc = '\\'; break; case 7: esc = 'a'; break; case '\b': esc = 'b'; break; case '\n': esc = 'n'; break; case '\r': esc = 'r'; break; case '\t': esc = 't'; break; case '\f': esc = 'f'; break; case '"': esc = '"'; break; case 27: esc = 'e'; break; } if (esc) { if (bpos + 2 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } buffer[bpos++] = '\\'; buffer[bpos++] = esc; } else if (graph == crlf) { if (bpos + 4 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } buffer[bpos++] = '\\'; buffer[bpos++] = 'r'; buffer[bpos++] = '\\'; buffer[bpos++] = 'n'; } else { if (bpos + 1 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } buffer[bpos++] = graph; } } res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = bpos; STRAND_CHECK(tc, res); return res; } /* Takes a string and reverses its characters. */ MVMString * MVM_string_flip(MVMThreadContext *tc, MVMString *s) { MVMString *res = NULL; MVMStringIndex spos = 0; MVMStringIndex sgraphs; MVMGrapheme32 *rbuffer; MVMStringIndex rpos; MVM_string_check_arg(tc, s, "flip"); sgraphs = MVM_string_graphs(tc, s); rbuffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); rpos = sgraphs; for (; spos < sgraphs; spos++) rbuffer[--rpos] = MVM_string_get_grapheme_at_nocheck(tc, s, spos); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = rbuffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Compares two strings, returning -1, 0 or 1 to indicate less than, * equal or greater than. */ MVMint64 MVM_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMStringIndex alen, blen, i, scanlen; MVM_string_check_arg(tc, a, "compare"); MVM_string_check_arg(tc, b, "compare"); /* Simple cases when one or both are zero length. */ alen = MVM_string_graphs(tc, a); blen = MVM_string_graphs(tc, b); if (alen == 0) return blen == 0 ? 0 : -1; if (blen == 0) return 1; /* Otherwise, need to scan them. */ scanlen = alen > blen ? blen : alen; for (i = 0; i < scanlen; i++) { MVMGrapheme32 ai = MVM_string_get_grapheme_at_nocheck(tc, a, i); MVMGrapheme32 bi = MVM_string_get_grapheme_at_nocheck(tc, b, i); if (ai != bi) return ai < bi ? -1 : 1; } /* All shared chars equal, so go on length. */ return alen < blen ? -1 : alen > blen ? 1 : 0 ; } /* Takes two strings and AND's their characters. */ MVMString * MVM_string_bitand(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res; MVMGrapheme32 *buffer; MVMStringIndex i, alen, blen, sgraphs; MVM_string_check_arg(tc, a, "bitwise and"); MVM_string_check_arg(tc, b, "bitwise and"); alen = MVM_string_graphs(tc, a); blen = MVM_string_graphs(tc, b); sgraphs = alen < blen ? alen : blen; buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* Binary-and up to the length of the shortest string. */ for (i = 0; i < sgraphs; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) & MVM_string_get_grapheme_at_nocheck(tc, b, i)); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Takes two strings and OR's their characters. */ MVMString * MVM_string_bitor(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res; MVMGrapheme32 *buffer; MVMStringIndex alen, blen, sgraphs, i, scanlen; MVM_string_check_arg(tc, a, "bitwise or"); MVM_string_check_arg(tc, b, "bitwise or"); alen = MVM_string_graphs(tc, a); blen = MVM_string_graphs(tc, b); sgraphs = (alen > blen ? alen : blen); buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* First, binary-or up to the length of the shortest string. */ scanlen = alen > blen ? blen : alen; for (i = 0; i < scanlen; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) | MVM_string_get_grapheme_at_nocheck(tc, b, i)); /* Second pass, fill with characters of the longest string. */ if (alen > blen) for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, a, i); else for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, b, i); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Takes two strings and XOR's their characters. */ MVMString * MVM_string_bitxor(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res; MVMGrapheme32 *buffer; MVMStringIndex alen, blen, sgraphs, i, scanlen; MVM_string_check_arg(tc, a, "bitwise xor"); MVM_string_check_arg(tc, b, "bitwise xor"); alen = MVM_string_graphs(tc, a); blen = MVM_string_graphs(tc, b); sgraphs = (alen > blen ? alen : blen); buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* First, binary-xor up to the length of the shorter string. */ scanlen = alen > blen ? blen : alen; for (i = 0; i < scanlen; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) ^ MVM_string_get_grapheme_at_nocheck(tc, b, i)); /* Second pass, fill with characters of the longest string. */ if (alen > blen) for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, a, i); else for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, b, i); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* The following statics hold on to various unicode property values we will * resolve once so we don't have to do it repeatedly. */ static MVMint64 UPV_Nd = 0; static MVMint64 UPV_Lu = 0; static MVMint64 UPV_Ll = 0; static MVMint64 UPV_Lt = 0; static MVMint64 UPV_Lm = 0; static MVMint64 UPV_Lo = 0; static MVMint64 UPV_Zs = 0; static MVMint64 UPV_Zl = 0; static MVMint64 UPV_Pc = 0; static MVMint64 UPV_Pd = 0; static MVMint64 UPV_Ps = 0; static MVMint64 UPV_Pe = 0; static MVMint64 UPV_Pi = 0; static MVMint64 UPV_Pf = 0; static MVMint64 UPV_Po = 0; /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) /* Resolves various unicode property values that we'll need. */ void MVM_string_cclass_init(MVMThreadContext *tc) { UPV_Nd = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Nd")); UPV_Lu = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lu")); UPV_Ll = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Ll")); UPV_Lt = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lt")); UPV_Lm = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lm")); UPV_Lo = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lo")); UPV_Zs = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Zs")); UPV_Zl = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Zl")); UPV_Pc = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pc")); UPV_Pd = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pd")); UPV_Ps = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Ps")); UPV_Pe = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pe")); UPV_Pi = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pi")); UPV_Pf = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pf")); UPV_Po = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Po")); } /* Checks if the specified grapheme is in the given character class. */ static MVMint64 grapheme_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMGrapheme32 g) { /* If it's a synthetic, then grab the base codepoint. */ MVMCodepoint cp; if (g >= 0) cp = (MVMCodepoint)g; else cp = MVM_nfg_get_synthetic_info(tc, g)->base; switch (cclass) { case MVM_CCLASS_ANY: return 1; case MVM_CCLASS_UPPERCASE: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lu); case MVM_CCLASS_LOWERCASE: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ll); case MVM_CCLASS_WORD: if (cp <= 'z') { /* short circuit common case */ if (cp >= 'a' || cp == '_' || (cp >= 'A' && cp <= 'Z') || (cp >= '0' && cp <= '9')) return 1; else return 0; } /* Deliberate fall-through; word is _ or digit or alphabetic. */ case MVM_CCLASS_ALPHANUMERIC: if (cp <= '9' && cp >= '0') /* short circuit common case */ return 1; if (MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Nd)) return 1; /* Deliberate fall-through; alphanumeric is digit or alphabetic. */ case MVM_CCLASS_ALPHABETIC: if (cp <= 'z') { /* short circuit common case */ if (cp >= 'a' || (cp >= 'A' && cp <= 'Z')) return 1; else return 0; } return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lo) /* lots of CJK chars */ || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ll) /* (ascii handled above) */ || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lu) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lt) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lm); case MVM_CCLASS_NUMERIC: if (cp <= '9' && cp >= '0') /* short circuit common case */ return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Nd); case MVM_CCLASS_HEXADECIMAL: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT, 1); case MVM_CCLASS_WHITESPACE: if (cp <= '~') { if (cp == ' ' || (cp <= 13 && cp >= 9)) return 1; else return 0; } return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_WHITE_SPACE, 1); case MVM_CCLASS_BLANK: if (cp == '\t') return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Zs); case MVM_CCLASS_CONTROL: { return (cp >= 0 && cp < 32) || (cp >= 127 && cp < 160); } case MVM_CCLASS_PRINTING: { return !((cp >= 0 && cp < 32) || (cp >= 127 && cp < 160)); } case MVM_CCLASS_PUNCTUATION: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pc) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pd) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ps) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pe) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pi) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pf) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Po); case MVM_CCLASS_NEWLINE: { if (cp == '\n' || cp == 0x0b || cp == 0x0c || cp == '\r' || cp == 0x85 || cp == 0x2028 || cp == 0x2029) return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Zl); } default: return 0; } } /* Checks if the character at the specified offset is a member of the * indicated character class. */ MVMint64 MVM_string_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset) { MVMGrapheme32 g; MVM_string_check_arg(tc, s, "is_cclass"); if (offset < 0 || offset >= MVM_string_graphs(tc, s)) return 0; g = MVM_string_get_grapheme_at_nocheck(tc, s, offset); return grapheme_is_cclass(tc, cclass, g); } /* Searches for the next char that is in the specified character class. */ MVMint64 MVM_string_find_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count) { MVMGraphemeIter gi; MVMint64 length, end, pos; MVM_string_check_arg(tc, s, "find_cclass"); length = MVM_string_graphs(tc, s); end = offset + count; end = length < end ? length : end; if (offset < 0 || offset >= length) return end; MVM_string_gi_init(tc, &gi, s); MVM_string_gi_move_to(tc, &gi, offset); for (pos = offset; pos < end; pos++) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, cclass, g) > 0) return pos; } return end; } /* Searches for the next char that is not in the specified character class. */ MVMint64 MVM_string_find_not_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count) { MVMGraphemeIter gi; MVMint64 length, end, pos; MVM_string_check_arg(tc, s, "find_not_cclass"); length = MVM_string_graphs(tc, s); end = offset + count; end = length < end ? length : end; if (offset < 0 || offset >= length) return end; MVM_string_gi_init(tc, &gi, s); MVM_string_gi_move_to(tc, &gi, offset); for (pos = offset; pos < end; pos++) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, cclass, g) == 0) return pos; } return end; } static MVMint16 encoding_name_init = 0; static MVMString *encoding_utf8_name = NULL; static MVMString *encoding_ascii_name = NULL; static MVMString *encoding_latin1_name = NULL; static MVMString *encoding_utf16_name = NULL; static MVMString *encoding_windows1252_name = NULL; static MVMString *encoding_utf8_c8_name = NULL; MVMuint8 MVM_string_find_encoding(MVMThreadContext *tc, MVMString *name) { MVM_string_check_arg(tc, name, "find encoding"); if (!encoding_name_init) { MVM_gc_allocate_gen2_default_set(tc); encoding_utf8_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf8"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_utf8_name); encoding_ascii_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "ascii"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_ascii_name); encoding_latin1_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "iso-8859-1"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_latin1_name); encoding_utf16_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf16"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_utf16_name); encoding_windows1252_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "windows-1252"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_windows1252_name); encoding_utf8_c8_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf8-c8"); MVM_gc_root_add_permanent(tc, (MVMCollectable **)&encoding_utf8_c8_name); encoding_name_init = 1; MVM_gc_allocate_gen2_default_clear(tc); } if (MVM_string_equal(tc, name, encoding_utf8_name)) { return MVM_encoding_type_utf8; } else if (MVM_string_equal(tc, name, encoding_ascii_name)) { return MVM_encoding_type_ascii; } else if (MVM_string_equal(tc, name, encoding_latin1_name)) { return MVM_encoding_type_latin1; } else if (MVM_string_equal(tc, name, encoding_windows1252_name)) { return MVM_encoding_type_windows1252; } else if (MVM_string_equal(tc, name, encoding_utf16_name)) { return MVM_encoding_type_utf16; } else if (MVM_string_equal(tc, name, encoding_utf8_c8_name)) { return MVM_encoding_type_utf8_c8; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown string encoding: '%s'", c_name); } } /* Turns a codepoint into a string. Uses the normalizer to ensure that we get * a valid NFG string (NFG is a superset of NFC, and singleton decompositions * exist). */ MVMString * MVM_string_chr(MVMThreadContext *tc, MVMCodepoint cp) { MVMString *s; MVMGrapheme32 g; MVMNormalizer norm; if (cp < 0) MVM_exception_throw_adhoc(tc, "chr codepoint cannot be negative"); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); if (!MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, cp, &g)) { MVM_unicode_normalizer_eof(tc, &norm); g = MVM_unicode_normalizer_get_grapheme(tc, &norm); } MVM_unicode_normalizer_cleanup(tc, &norm); s = (MVMString *)REPR(tc->instance->VMString)->allocate(tc, STABLE(tc->instance->VMString)); s->body.storage_type = MVM_STRING_GRAPHEME_32; s->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32)); s->body.storage.blob_32[0] = g; s->body.num_graphs = 1; return s; } MoarVM-2015.11/src/strings/ops.h0000644000175000017500000001435612623370227015317 0ustar jnthnjnthn/* Encoding types and encoding validity check. */ #define MVM_encoding_type_MIN 1 #define MVM_encoding_type_utf8 1 #define MVM_encoding_type_ascii 2 #define MVM_encoding_type_latin1 3 #define MVM_encoding_type_utf16 4 #define MVM_encoding_type_windows1252 5 #define MVM_encoding_type_utf8_c8 6 #define MVM_encoding_type_MAX 6 #define ENCODING_VALID(enc) \ (((enc) >= MVM_encoding_type_MIN && (enc) <= MVM_encoding_type_MAX) \ || (MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %d", (enc)),1)) /* Character class constants (map to nqp::const::CCLASS_* values). */ #define MVM_CCLASS_ANY 65535 #define MVM_CCLASS_UPPERCASE 1 #define MVM_CCLASS_LOWERCASE 2 #define MVM_CCLASS_ALPHABETIC 4 #define MVM_CCLASS_NUMERIC 8 #define MVM_CCLASS_HEXADECIMAL 16 #define MVM_CCLASS_WHITESPACE 32 #define MVM_CCLASS_PRINTING 64 #define MVM_CCLASS_BLANK 256 #define MVM_CCLASS_CONTROL 512 #define MVM_CCLASS_PUNCTUATION 1024 #define MVM_CCLASS_ALPHANUMERIC 2048 #define MVM_CCLASS_NEWLINE 4096 #define MVM_CCLASS_WORD 8192 /* Checks a string is not null or non-concrete and throws if so. */ MVM_STATIC_INLINE void MVM_string_check_arg(MVMThreadContext *tc, const MVMString *s, const char *operation) { if (!s || !IS_CONCRETE(s)) MVM_exception_throw_adhoc(tc, "%s requires a concrete string, but got %s", operation, s ? "a type object" : "null"); } MVM_STATIC_INLINE MVMuint32 MVM_string_graphs(MVMThreadContext *tc, MVMString *s) { MVM_string_check_arg(tc, s, "chars"); return s->body.num_graphs; } MVM_STATIC_INLINE MVMuint32 MVM_string_codes(MVMThreadContext *tc, MVMString *s) { MVM_string_check_arg(tc, s, "codes"); return s->body.num_graphs; /* Don't do NFG yet; this will do us. */ } MVMGrapheme32 MVM_string_get_grapheme_at_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 index); MVMint64 MVM_string_equal(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMint64 MVM_string_index(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMint64 MVM_string_index_from_end(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMString * MVM_string_concatenate(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_repeat(MVMThreadContext *tc, MVMString *a, MVMint64 count); MVMString * MVM_string_substring(MVMThreadContext *tc, MVMString *a, MVMint64 start, MVMint64 length); MVMString * MVM_string_replace(MVMThreadContext *tc, MVMString *a, MVMint64 start, MVMint64 length, MVMString *replacement); void MVM_string_say(MVMThreadContext *tc, MVMString *a); void MVM_string_print(MVMThreadContext *tc, MVMString *a); MVMint64 MVM_string_equal_at(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset); MVMint64 MVM_string_equal_at_ignore_case(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset); MVMGrapheme32 MVM_string_ord_basechar_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset); MVMint64 MVM_string_have_at(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb); MVMint64 MVM_string_get_grapheme_at(MVMThreadContext *tc, MVMString *a, MVMint64 index); MVMint64 MVM_string_index_of_grapheme(MVMThreadContext *tc, MVMString *a, MVMGrapheme32 codepoint); MVMString * MVM_string_uc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_lc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_tc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_fc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_decode(MVMThreadContext *tc, const MVMObject *type_object, char *Cbuf, MVMint64 byte_length, MVMint64 encoding_flag); char * MVM_string_encode(MVMThreadContext *tc, MVMString *s, MVMint64 start, MVMint64 length, MVMuint64 *output_size, MVMint64 encoding_flag, MVMString *replacement); void MVM_string_encode_to_buf(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement); MVMString * MVM_string_decode_from_buf(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name); MVMObject * MVM_string_split(MVMThreadContext *tc, MVMString *separator, MVMString *input); MVMString * MVM_string_join(MVMThreadContext *tc, MVMString *separator, MVMObject *input); MVMint64 MVM_string_char_at_in_string(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMString *b); MVMint64 MVM_string_offset_has_unicode_property_value(MVMThreadContext *tc, MVMString *s, MVMint64 offset, MVMint64 property_code, MVMint64 property_value_code); MVMint64 MVM_unicode_codepoint_has_property_value(MVMThreadContext *tc, MVMGrapheme32 grapheme, MVMint64 property_code, MVMint64 property_value_code); MVMString * MVM_unicode_codepoint_get_property_str(MVMThreadContext *tc, MVMGrapheme32 grapheme, MVMint64 property_code); const char * MVM_unicode_codepoint_get_property_cstr(MVMThreadContext *tc, MVMGrapheme32 grapheme, MVMint64 property_code); MVMint64 MVM_unicode_codepoint_get_property_int(MVMThreadContext *tc, MVMGrapheme32 grapheme, MVMint64 property_code); MVMint64 MVM_unicode_codepoint_get_property_bool(MVMThreadContext *tc, MVMGrapheme32 grapheme, MVMint64 property_code); MVMString * MVM_unicode_get_name(MVMThreadContext *tc, MVMint64 grapheme); void MVM_string_flatten(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_escape(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_flip(MVMThreadContext *tc, MVMString *s); MVMint64 MVM_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitand(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitor(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitxor(MVMThreadContext *tc, MVMString *a, MVMString *b); void MVM_string_cclass_init(MVMThreadContext *tc); MVMint64 MVM_string_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset); MVMint64 MVM_string_find_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count); MVMint64 MVM_string_find_not_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count); MVMuint8 MVM_string_find_encoding(MVMThreadContext *tc, MVMString *name); MVMString * MVM_string_chr(MVMThreadContext *tc, MVMCodepoint cp); MoarVM-2015.11/src/strings/unicode.h0000644000175000017500000000206612616160670016140 0ustar jnthnjnthnMVMint32 MVM_unicode_lookup_by_name(MVMThreadContext *tc, MVMString *name); MVMint64 MVM_unicode_has_property_value(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code, MVMint64 property_value_code); MVMuint32 MVM_unicode_get_case_change(MVMThreadContext *tc, MVMCodepoint codepoint, MVMint32 case_, const MVMCodepoint **result); MVMint32 MVM_unicode_name_to_property_code(MVMThreadContext *tc, MVMString *name); MVMint32 MVM_unicode_name_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, MVMString *name); MVMint32 MVM_unicode_cname_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, const char *cname, size_t cname_length); MVMCodepoint MVM_unicode_find_primary_composite(MVMThreadContext *tc, MVMCodepoint l, MVMCodepoint c); #define MVM_unicode_case_change_type_upper 0 #define MVM_unicode_case_change_type_lower 1 #define MVM_unicode_case_change_type_title 2 #define MVM_unicode_case_change_type_fold 3 struct MVMUnicodeNameRegistry { char *name; MVMGrapheme32 codepoint; UT_hash_handle hash_handle; }; MoarVM-2015.11/src/strings/unicode_db.c0000644000175000017500002035727412616160672016622 0ustar jnthnjnthn /* DO NOT MODIFY THIS FILE! YOU WILL LOSE YOUR CHANGES! This file is generated by ucd2c.pl from the Unicode database. from http://unicode.org/copyright.html#Exhibit1 on 2012-07-20: COPYRIGHT AND PERMISSION NOTICE Copyright ?1991-2012 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. */ #include "moar.h" static const MVMint32 CaseFolding_grows_table[105][3] = { {0x0,0x0,0x0}, {0x0073,0x0073,0x0},{0x0069,0x0307,0x0},{0x02BC,0x006E,0x0},{0x006A,0x030C,0x0},{0x03B9,0x0308,0x0301}, {0x03C5,0x0308,0x0301},{0x0565,0x0582,0x0},{0x0068,0x0331,0x0},{0x0074,0x0308,0x0},{0x0077,0x030A,0x0}, {0x0079,0x030A,0x0},{0x0061,0x02BE,0x0},{0x0073,0x0073,0x0},{0x03C5,0x0313,0x0},{0x03C5,0x0313,0x0300}, {0x03C5,0x0313,0x0301},{0x03C5,0x0313,0x0342},{0x1F00,0x03B9,0x0},{0x1F01,0x03B9,0x0},{0x1F02,0x03B9,0x0}, {0x1F03,0x03B9,0x0},{0x1F04,0x03B9,0x0},{0x1F05,0x03B9,0x0},{0x1F06,0x03B9,0x0},{0x1F07,0x03B9,0x0},{0x1F00,0x03B9,0x0}, {0x1F01,0x03B9,0x0},{0x1F02,0x03B9,0x0},{0x1F03,0x03B9,0x0},{0x1F04,0x03B9,0x0},{0x1F05,0x03B9,0x0},{0x1F06,0x03B9,0x0}, {0x1F07,0x03B9,0x0},{0x1F20,0x03B9,0x0},{0x1F21,0x03B9,0x0},{0x1F22,0x03B9,0x0},{0x1F23,0x03B9,0x0},{0x1F24,0x03B9,0x0}, {0x1F25,0x03B9,0x0},{0x1F26,0x03B9,0x0},{0x1F27,0x03B9,0x0},{0x1F20,0x03B9,0x0},{0x1F21,0x03B9,0x0},{0x1F22,0x03B9,0x0}, {0x1F23,0x03B9,0x0},{0x1F24,0x03B9,0x0},{0x1F25,0x03B9,0x0},{0x1F26,0x03B9,0x0},{0x1F27,0x03B9,0x0},{0x1F60,0x03B9,0x0}, {0x1F61,0x03B9,0x0},{0x1F62,0x03B9,0x0},{0x1F63,0x03B9,0x0},{0x1F64,0x03B9,0x0},{0x1F65,0x03B9,0x0},{0x1F66,0x03B9,0x0}, {0x1F67,0x03B9,0x0},{0x1F60,0x03B9,0x0},{0x1F61,0x03B9,0x0},{0x1F62,0x03B9,0x0},{0x1F63,0x03B9,0x0},{0x1F64,0x03B9,0x0}, {0x1F65,0x03B9,0x0},{0x1F66,0x03B9,0x0},{0x1F67,0x03B9,0x0},{0x1F70,0x03B9,0x0},{0x03B1,0x03B9,0x0},{0x03AC,0x03B9,0x0}, {0x03B1,0x0342,0x0},{0x03B1,0x0342,0x03B9},{0x03B1,0x03B9,0x0},{0x1F74,0x03B9,0x0},{0x03B7,0x03B9,0x0}, {0x03AE,0x03B9,0x0},{0x03B7,0x0342,0x0},{0x03B7,0x0342,0x03B9},{0x03B7,0x03B9,0x0},{0x03B9,0x0308,0x0300}, {0x03B9,0x0308,0x0301},{0x03B9,0x0342,0x0},{0x03B9,0x0308,0x0342},{0x03C5,0x0308,0x0300},{0x03C5,0x0308,0x0301}, {0x03C1,0x0313,0x0},{0x03C5,0x0342,0x0},{0x03C5,0x0308,0x0342},{0x1F7C,0x03B9,0x0},{0x03C9,0x03B9,0x0}, {0x03CE,0x03B9,0x0},{0x03C9,0x0342,0x0},{0x03C9,0x0342,0x03B9},{0x03C9,0x03B9,0x0},{0x0066,0x0066,0x0}, {0x0066,0x0069,0x0},{0x0066,0x006C,0x0},{0x0066,0x0066,0x0069},{0x0066,0x0066,0x006C},{0x0073,0x0074,0x0}, {0x0073,0x0074,0x0},{0x0574,0x0576,0x0},{0x0574,0x0565,0x0},{0x0574,0x056B,0x0},{0x057E,0x0576,0x0},{0x0574,0x056D,0x0} }; static const MVMint32 CaseFolding_simple_table[1218] = { 0x0, 0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071, 0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x03BC,0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6, 0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F8, 0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x0101,0x0103,0x0105,0x0107,0x0109,0x010B,0x010D,0x010F,0x0111,0x0113,0x0115, 0x0117,0x0119,0x011B,0x011D,0x011F,0x0121,0x0123,0x0125,0x0127,0x0129,0x012B,0x012D,0x012F,0x0133,0x0135,0x0137,0x013A, 0x013C,0x013E,0x0140,0x0142,0x0144,0x0146,0x0148,0x014B,0x014D,0x014F,0x0151,0x0153,0x0155,0x0157,0x0159,0x015B,0x015D, 0x015F,0x0161,0x0163,0x0165,0x0167,0x0169,0x016B,0x016D,0x016F,0x0171,0x0173,0x0175,0x0177,0x00FF,0x017A,0x017C,0x017E, 0x0073,0x0253,0x0183,0x0185,0x0254,0x0188,0x0256,0x0257,0x018C,0x01DD,0x0259,0x025B,0x0192,0x0260,0x0263,0x0269,0x0268, 0x0199,0x026F,0x0272,0x0275,0x01A1,0x01A3,0x01A5,0x0280,0x01A8,0x0283,0x01AD,0x0288,0x01B0,0x028A,0x028B,0x01B4,0x01B6, 0x0292,0x01B9,0x01BD,0x01C6,0x01C6,0x01C9,0x01C9,0x01CC,0x01CC,0x01CE,0x01D0,0x01D2,0x01D4,0x01D6,0x01D8,0x01DA,0x01DC, 0x01DF,0x01E1,0x01E3,0x01E5,0x01E7,0x01E9,0x01EB,0x01ED,0x01EF,0x01F3,0x01F3,0x01F5,0x0195,0x01BF,0x01F9,0x01FB,0x01FD, 0x01FF,0x0201,0x0203,0x0205,0x0207,0x0209,0x020B,0x020D,0x020F,0x0211,0x0213,0x0215,0x0217,0x0219,0x021B,0x021D,0x021F, 0x019E,0x0223,0x0225,0x0227,0x0229,0x022B,0x022D,0x022F,0x0231,0x0233,0x2C65,0x023C,0x019A,0x2C66,0x0242,0x0180,0x0289, 0x028C,0x0247,0x0249,0x024B,0x024D,0x024F,0x03B9,0x0371,0x0373,0x0377,0x03F3,0x03AC,0x03AD,0x03AE,0x03AF,0x03CC,0x03CD, 0x03CE,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x03CA,0x03CB,0x03C3,0x03D7,0x03B2,0x03B8,0x03C6,0x03C0,0x03D9, 0x03DB,0x03DD,0x03DF,0x03E1,0x03E3,0x03E5,0x03E7,0x03E9,0x03EB,0x03ED,0x03EF,0x03BA,0x03C1,0x03B8,0x03B5,0x03F8,0x03F2, 0x03FB,0x037B,0x037C,0x037D,0x0450,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045A,0x045B,0x045C, 0x045D,0x045E,0x045F,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, 0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, 0x044F,0x0461,0x0463,0x0465,0x0467,0x0469,0x046B,0x046D,0x046F,0x0471,0x0473,0x0475,0x0477,0x0479,0x047B,0x047D,0x047F, 0x0481,0x048B,0x048D,0x048F,0x0491,0x0493,0x0495,0x0497,0x0499,0x049B,0x049D,0x049F,0x04A1,0x04A3,0x04A5,0x04A7,0x04A9, 0x04AB,0x04AD,0x04AF,0x04B1,0x04B3,0x04B5,0x04B7,0x04B9,0x04BB,0x04BD,0x04BF,0x04CF,0x04C2,0x04C4,0x04C6,0x04C8,0x04CA, 0x04CC,0x04CE,0x04D1,0x04D3,0x04D5,0x04D7,0x04D9,0x04DB,0x04DD,0x04DF,0x04E1,0x04E3,0x04E5,0x04E7,0x04E9,0x04EB,0x04ED, 0x04EF,0x04F1,0x04F3,0x04F5,0x04F7,0x04F9,0x04FB,0x04FD,0x04FF,0x0501,0x0503,0x0505,0x0507,0x0509,0x050B,0x050D,0x050F, 0x0511,0x0513,0x0515,0x0517,0x0519,0x051B,0x051D,0x051F,0x0521,0x0523,0x0525,0x0527,0x0529,0x052B,0x052D,0x052F,0x0561, 0x0562,0x0563,0x0564,0x0565,0x0566,0x0567,0x0568,0x0569,0x056A,0x056B,0x056C,0x056D,0x056E,0x056F,0x0570,0x0571,0x0572, 0x0573,0x0574,0x0575,0x0576,0x0577,0x0578,0x0579,0x057A,0x057B,0x057C,0x057D,0x057E,0x057F,0x0580,0x0581,0x0582,0x0583, 0x0584,0x0585,0x0586,0x2D00,0x2D01,0x2D02,0x2D03,0x2D04,0x2D05,0x2D06,0x2D07,0x2D08,0x2D09,0x2D0A,0x2D0B,0x2D0C,0x2D0D, 0x2D0E,0x2D0F,0x2D10,0x2D11,0x2D12,0x2D13,0x2D14,0x2D15,0x2D16,0x2D17,0x2D18,0x2D19,0x2D1A,0x2D1B,0x2D1C,0x2D1D,0x2D1E, 0x2D1F,0x2D20,0x2D21,0x2D22,0x2D23,0x2D24,0x2D25,0x2D27,0x2D2D,0x13F0,0x13F1,0x13F2,0x13F3,0x13F4,0x13F5,0x1E01,0x1E03, 0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25, 0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47, 0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69, 0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B, 0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E61,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5, 0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7, 0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, 0x1EFB,0x1EFD,0x1EFF,0x1F00,0x1F01,0x1F02,0x1F03,0x1F04,0x1F05,0x1F06,0x1F07,0x1F10,0x1F11,0x1F12,0x1F13,0x1F14,0x1F15, 0x1F20,0x1F21,0x1F22,0x1F23,0x1F24,0x1F25,0x1F26,0x1F27,0x1F30,0x1F31,0x1F32,0x1F33,0x1F34,0x1F35,0x1F36,0x1F37,0x1F40, 0x1F41,0x1F42,0x1F43,0x1F44,0x1F45,0x1F51,0x1F53,0x1F55,0x1F57,0x1F60,0x1F61,0x1F62,0x1F63,0x1F64,0x1F65,0x1F66,0x1F67, 0x1FB0,0x1FB1,0x1F70,0x1F71,0x03B9,0x1F72,0x1F73,0x1F74,0x1F75,0x1FD0,0x1FD1,0x1F76,0x1F77,0x1FE0,0x1FE1,0x1F7A,0x1F7B, 0x1FE5,0x1F78,0x1F79,0x1F7C,0x1F7D,0x03C9,0x006B,0x00E5,0x214E,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177, 0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F,0x2184,0x24D0,0x24D1,0x24D2,0x24D3,0x24D4,0x24D5,0x24D6,0x24D7, 0x24D8,0x24D9,0x24DA,0x24DB,0x24DC,0x24DD,0x24DE,0x24DF,0x24E0,0x24E1,0x24E2,0x24E3,0x24E4,0x24E5,0x24E6,0x24E7,0x24E8, 0x24E9,0x2C30,0x2C31,0x2C32,0x2C33,0x2C34,0x2C35,0x2C36,0x2C37,0x2C38,0x2C39,0x2C3A,0x2C3B,0x2C3C,0x2C3D,0x2C3E,0x2C3F, 0x2C40,0x2C41,0x2C42,0x2C43,0x2C44,0x2C45,0x2C46,0x2C47,0x2C48,0x2C49,0x2C4A,0x2C4B,0x2C4C,0x2C4D,0x2C4E,0x2C4F,0x2C50, 0x2C51,0x2C52,0x2C53,0x2C54,0x2C55,0x2C56,0x2C57,0x2C58,0x2C59,0x2C5A,0x2C5B,0x2C5C,0x2C5D,0x2C5E,0x2C61,0x026B,0x1D7D, 0x027D,0x2C68,0x2C6A,0x2C6C,0x0251,0x0271,0x0250,0x0252,0x2C73,0x2C76,0x023F,0x0240,0x2C81,0x2C83,0x2C85,0x2C87,0x2C89, 0x2C8B,0x2C8D,0x2C8F,0x2C91,0x2C93,0x2C95,0x2C97,0x2C99,0x2C9B,0x2C9D,0x2C9F,0x2CA1,0x2CA3,0x2CA5,0x2CA7,0x2CA9,0x2CAB, 0x2CAD,0x2CAF,0x2CB1,0x2CB3,0x2CB5,0x2CB7,0x2CB9,0x2CBB,0x2CBD,0x2CBF,0x2CC1,0x2CC3,0x2CC5,0x2CC7,0x2CC9,0x2CCB,0x2CCD, 0x2CCF,0x2CD1,0x2CD3,0x2CD5,0x2CD7,0x2CD9,0x2CDB,0x2CDD,0x2CDF,0x2CE1,0x2CE3,0x2CEC,0x2CEE,0x2CF3,0xA641,0xA643,0xA645, 0xA647,0xA649,0xA64B,0xA64D,0xA64F,0xA651,0xA653,0xA655,0xA657,0xA659,0xA65B,0xA65D,0xA65F,0xA661,0xA663,0xA665,0xA667, 0xA669,0xA66B,0xA66D,0xA681,0xA683,0xA685,0xA687,0xA689,0xA68B,0xA68D,0xA68F,0xA691,0xA693,0xA695,0xA697,0xA699,0xA69B, 0xA723,0xA725,0xA727,0xA729,0xA72B,0xA72D,0xA72F,0xA733,0xA735,0xA737,0xA739,0xA73B,0xA73D,0xA73F,0xA741,0xA743,0xA745, 0xA747,0xA749,0xA74B,0xA74D,0xA74F,0xA751,0xA753,0xA755,0xA757,0xA759,0xA75B,0xA75D,0xA75F,0xA761,0xA763,0xA765,0xA767, 0xA769,0xA76B,0xA76D,0xA76F,0xA77A,0xA77C,0x1D79,0xA77F,0xA781,0xA783,0xA785,0xA787,0xA78C,0x0265,0xA791,0xA793,0xA797, 0xA799,0xA79B,0xA79D,0xA79F,0xA7A1,0xA7A3,0xA7A5,0xA7A7,0xA7A9,0x0266,0x025C,0x0261,0x026C,0x029E,0x0287,0x029D,0xAB53, 0xA7B5,0xA7B7,0x13A0,0x13A1,0x13A2,0x13A3,0x13A4,0x13A5,0x13A6,0x13A7,0x13A8,0x13A9,0x13AA,0x13AB,0x13AC,0x13AD,0x13AE, 0x13AF,0x13B0,0x13B1,0x13B2,0x13B3,0x13B4,0x13B5,0x13B6,0x13B7,0x13B8,0x13B9,0x13BA,0x13BB,0x13BC,0x13BD,0x13BE,0x13BF, 0x13C0,0x13C1,0x13C2,0x13C3,0x13C4,0x13C5,0x13C6,0x13C7,0x13C8,0x13C9,0x13CA,0x13CB,0x13CC,0x13CD,0x13CE,0x13CF,0x13D0, 0x13D1,0x13D2,0x13D3,0x13D4,0x13D5,0x13D6,0x13D7,0x13D8,0x13D9,0x13DA,0x13DB,0x13DC,0x13DD,0x13DE,0x13DF,0x13E0,0x13E1, 0x13E2,0x13E3,0x13E4,0x13E5,0x13E6,0x13E7,0x13E8,0x13E9,0x13EA,0x13EB,0x13EC,0x13ED,0x13EE,0x13EF,0xFF41,0xFF42,0xFF43, 0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54, 0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x10428,0x10429,0x1042A,0x1042B,0x1042C,0x1042D,0x1042E,0x1042F,0x10430,0x10431, 0x10432,0x10433,0x10434,0x10435,0x10436,0x10437,0x10438,0x10439,0x1043A,0x1043B,0x1043C,0x1043D,0x1043E,0x1043F,0x10440, 0x10441,0x10442,0x10443,0x10444,0x10445,0x10446,0x10447,0x10448,0x10449,0x1044A,0x1044B,0x1044C,0x1044D,0x1044E,0x1044F, 0x10CC0,0x10CC1,0x10CC2,0x10CC3,0x10CC4,0x10CC5,0x10CC6,0x10CC7,0x10CC8,0x10CC9,0x10CCA,0x10CCB,0x10CCC,0x10CCD,0x10CCE, 0x10CCF,0x10CD0,0x10CD1,0x10CD2,0x10CD3,0x10CD4,0x10CD5,0x10CD6,0x10CD7,0x10CD8,0x10CD9,0x10CDA,0x10CDB,0x10CDC,0x10CDD, 0x10CDE,0x10CDF,0x10CE0,0x10CE1,0x10CE2,0x10CE3,0x10CE4,0x10CE5,0x10CE6,0x10CE7,0x10CE8,0x10CE9,0x10CEA,0x10CEB,0x10CEC, 0x10CED,0x10CEE,0x10CEF,0x10CF0,0x10CF1,0x10CF2,0x118C0,0x118C1,0x118C2,0x118C3,0x118C4,0x118C5,0x118C6,0x118C7,0x118C8, 0x118C9,0x118CA,0x118CB,0x118CC,0x118CD,0x118CE,0x118CF,0x118D0,0x118D1,0x118D2,0x118D3,0x118D4,0x118D5,0x118D6,0x118D7, 0x118D8,0x118D9,0x118DA,0x118DB,0x118DC,0x118DD,0x118DE,0x118DF }; static const MVMint32 SpecialCasing_table[104][3][3] = { {0x0,0x0,0x0}, { { 0x0053, 0x0053, 0x0 }, { 0x00DF, 0x0, 0x0 }, { 0x0053, 0x0073, 0x0 } }, { { 0x0130, 0x0, 0x0 }, { 0x0069, 0x0307, 0x0 }, { 0x0130, 0x0, 0x0 } }, { { 0x0046, 0x0046, 0x0 }, { 0xFB00, 0x0, 0x0 }, { 0x0046, 0x0066, 0x0 } }, { { 0x0046, 0x0049, 0x0 }, { 0xFB01, 0x0, 0x0 }, { 0x0046, 0x0069, 0x0 } }, { { 0x0046, 0x004C, 0x0 }, { 0xFB02, 0x0, 0x0 }, { 0x0046, 0x006C, 0x0 } }, { { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0x0, 0x0 }, { 0x0046, 0x0066, 0x0069 } }, { { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0x0, 0x0 }, { 0x0046, 0x0066, 0x006C } }, { { 0x0053, 0x0054, 0x0 }, { 0xFB05, 0x0, 0x0 }, { 0x0053, 0x0074, 0x0 } }, { { 0x0053, 0x0054, 0x0 }, { 0xFB06, 0x0, 0x0 }, { 0x0053, 0x0074, 0x0 } }, { { 0x0535, 0x0552, 0x0 }, { 0x0587, 0x0, 0x0 }, { 0x0535, 0x0582, 0x0 } }, { { 0x0544, 0x0546, 0x0 }, { 0xFB13, 0x0, 0x0 }, { 0x0544, 0x0576, 0x0 } }, { { 0x0544, 0x0535, 0x0 }, { 0xFB14, 0x0, 0x0 }, { 0x0544, 0x0565, 0x0 } }, { { 0x0544, 0x053B, 0x0 }, { 0xFB15, 0x0, 0x0 }, { 0x0544, 0x056B, 0x0 } }, { { 0x054E, 0x0546, 0x0 }, { 0xFB16, 0x0, 0x0 }, { 0x054E, 0x0576, 0x0 } }, { { 0x0544, 0x053D, 0x0 }, { 0xFB17, 0x0, 0x0 }, { 0x0544, 0x056D, 0x0 } }, { { 0x02BC, 0x004E, 0x0 }, { 0x0149, 0x0, 0x0 }, { 0x02BC, 0x004E, 0x0 } }, { { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0301 } }, { { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0301 } }, { { 0x004A, 0x030C, 0x0 }, { 0x01F0, 0x0, 0x0 }, { 0x004A, 0x030C, 0x0 } }, { { 0x0048, 0x0331, 0x0 }, { 0x1E96, 0x0, 0x0 }, { 0x0048, 0x0331, 0x0 } }, { { 0x0054, 0x0308, 0x0 }, { 0x1E97, 0x0, 0x0 }, { 0x0054, 0x0308, 0x0 } }, { { 0x0057, 0x030A, 0x0 }, { 0x1E98, 0x0, 0x0 }, { 0x0057, 0x030A, 0x0 } }, { { 0x0059, 0x030A, 0x0 }, { 0x1E99, 0x0, 0x0 }, { 0x0059, 0x030A, 0x0 } }, { { 0x0041, 0x02BE, 0x0 }, { 0x1E9A, 0x0, 0x0 }, { 0x0041, 0x02BE, 0x0 } }, { { 0x03A5, 0x0313, 0x0 }, { 0x1F50, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0 } }, { { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0300 } }, { { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0301 } }, { { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0342 } }, { { 0x0391, 0x0342, 0x0 }, { 0x1FB6, 0x0, 0x0 }, { 0x0391, 0x0342, 0x0 } }, { { 0x0397, 0x0342, 0x0 }, { 0x1FC6, 0x0, 0x0 }, { 0x0397, 0x0342, 0x0 } }, { { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0300 } }, { { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0301 } }, { { 0x0399, 0x0342, 0x0 }, { 0x1FD6, 0x0, 0x0 }, { 0x0399, 0x0342, 0x0 } }, { { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0342 } }, { { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0300 } }, { { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0301 } }, { { 0x03A1, 0x0313, 0x0 }, { 0x1FE4, 0x0, 0x0 }, { 0x03A1, 0x0313, 0x0 } }, { { 0x03A5, 0x0342, 0x0 }, { 0x1FE6, 0x0, 0x0 }, { 0x03A5, 0x0342, 0x0 } }, { { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0342 } }, { { 0x03A9, 0x0342, 0x0 }, { 0x1FF6, 0x0, 0x0 }, { 0x03A9, 0x0342, 0x0 } }, { { 0x1F08, 0x0399, 0x0 }, { 0x1F80, 0x0, 0x0 }, { 0x1F88, 0x0, 0x0 } }, { { 0x1F09, 0x0399, 0x0 }, { 0x1F81, 0x0, 0x0 }, { 0x1F89, 0x0, 0x0 } }, { { 0x1F0A, 0x0399, 0x0 }, { 0x1F82, 0x0, 0x0 }, { 0x1F8A, 0x0, 0x0 } }, { { 0x1F0B, 0x0399, 0x0 }, { 0x1F83, 0x0, 0x0 }, { 0x1F8B, 0x0, 0x0 } }, { { 0x1F0C, 0x0399, 0x0 }, { 0x1F84, 0x0, 0x0 }, { 0x1F8C, 0x0, 0x0 } }, { { 0x1F0D, 0x0399, 0x0 }, { 0x1F85, 0x0, 0x0 }, { 0x1F8D, 0x0, 0x0 } }, { { 0x1F0E, 0x0399, 0x0 }, { 0x1F86, 0x0, 0x0 }, { 0x1F8E, 0x0, 0x0 } }, { { 0x1F0F, 0x0399, 0x0 }, { 0x1F87, 0x0, 0x0 }, { 0x1F8F, 0x0, 0x0 } }, { { 0x1F08, 0x0399, 0x0 }, { 0x1F80, 0x0, 0x0 }, { 0x1F88, 0x0, 0x0 } }, { { 0x1F09, 0x0399, 0x0 }, { 0x1F81, 0x0, 0x0 }, { 0x1F89, 0x0, 0x0 } }, { { 0x1F0A, 0x0399, 0x0 }, { 0x1F82, 0x0, 0x0 }, { 0x1F8A, 0x0, 0x0 } }, { { 0x1F0B, 0x0399, 0x0 }, { 0x1F83, 0x0, 0x0 }, { 0x1F8B, 0x0, 0x0 } }, { { 0x1F0C, 0x0399, 0x0 }, { 0x1F84, 0x0, 0x0 }, { 0x1F8C, 0x0, 0x0 } }, { { 0x1F0D, 0x0399, 0x0 }, { 0x1F85, 0x0, 0x0 }, { 0x1F8D, 0x0, 0x0 } }, { { 0x1F0E, 0x0399, 0x0 }, { 0x1F86, 0x0, 0x0 }, { 0x1F8E, 0x0, 0x0 } }, { { 0x1F0F, 0x0399, 0x0 }, { 0x1F87, 0x0, 0x0 }, { 0x1F8F, 0x0, 0x0 } }, { { 0x1F28, 0x0399, 0x0 }, { 0x1F90, 0x0, 0x0 }, { 0x1F98, 0x0, 0x0 } }, { { 0x1F29, 0x0399, 0x0 }, { 0x1F91, 0x0, 0x0 }, { 0x1F99, 0x0, 0x0 } }, { { 0x1F2A, 0x0399, 0x0 }, { 0x1F92, 0x0, 0x0 }, { 0x1F9A, 0x0, 0x0 } }, { { 0x1F2B, 0x0399, 0x0 }, { 0x1F93, 0x0, 0x0 }, { 0x1F9B, 0x0, 0x0 } }, { { 0x1F2C, 0x0399, 0x0 }, { 0x1F94, 0x0, 0x0 }, { 0x1F9C, 0x0, 0x0 } }, { { 0x1F2D, 0x0399, 0x0 }, { 0x1F95, 0x0, 0x0 }, { 0x1F9D, 0x0, 0x0 } }, { { 0x1F2E, 0x0399, 0x0 }, { 0x1F96, 0x0, 0x0 }, { 0x1F9E, 0x0, 0x0 } }, { { 0x1F2F, 0x0399, 0x0 }, { 0x1F97, 0x0, 0x0 }, { 0x1F9F, 0x0, 0x0 } }, { { 0x1F28, 0x0399, 0x0 }, { 0x1F90, 0x0, 0x0 }, { 0x1F98, 0x0, 0x0 } }, { { 0x1F29, 0x0399, 0x0 }, { 0x1F91, 0x0, 0x0 }, { 0x1F99, 0x0, 0x0 } }, { { 0x1F2A, 0x0399, 0x0 }, { 0x1F92, 0x0, 0x0 }, { 0x1F9A, 0x0, 0x0 } }, { { 0x1F2B, 0x0399, 0x0 }, { 0x1F93, 0x0, 0x0 }, { 0x1F9B, 0x0, 0x0 } }, { { 0x1F2C, 0x0399, 0x0 }, { 0x1F94, 0x0, 0x0 }, { 0x1F9C, 0x0, 0x0 } }, { { 0x1F2D, 0x0399, 0x0 }, { 0x1F95, 0x0, 0x0 }, { 0x1F9D, 0x0, 0x0 } }, { { 0x1F2E, 0x0399, 0x0 }, { 0x1F96, 0x0, 0x0 }, { 0x1F9E, 0x0, 0x0 } }, { { 0x1F2F, 0x0399, 0x0 }, { 0x1F97, 0x0, 0x0 }, { 0x1F9F, 0x0, 0x0 } }, { { 0x1F68, 0x0399, 0x0 }, { 0x1FA0, 0x0, 0x0 }, { 0x1FA8, 0x0, 0x0 } }, { { 0x1F69, 0x0399, 0x0 }, { 0x1FA1, 0x0, 0x0 }, { 0x1FA9, 0x0, 0x0 } }, { { 0x1F6A, 0x0399, 0x0 }, { 0x1FA2, 0x0, 0x0 }, { 0x1FAA, 0x0, 0x0 } }, { { 0x1F6B, 0x0399, 0x0 }, { 0x1FA3, 0x0, 0x0 }, { 0x1FAB, 0x0, 0x0 } }, { { 0x1F6C, 0x0399, 0x0 }, { 0x1FA4, 0x0, 0x0 }, { 0x1FAC, 0x0, 0x0 } }, { { 0x1F6D, 0x0399, 0x0 }, { 0x1FA5, 0x0, 0x0 }, { 0x1FAD, 0x0, 0x0 } }, { { 0x1F6E, 0x0399, 0x0 }, { 0x1FA6, 0x0, 0x0 }, { 0x1FAE, 0x0, 0x0 } }, { { 0x1F6F, 0x0399, 0x0 }, { 0x1FA7, 0x0, 0x0 }, { 0x1FAF, 0x0, 0x0 } }, { { 0x1F68, 0x0399, 0x0 }, { 0x1FA0, 0x0, 0x0 }, { 0x1FA8, 0x0, 0x0 } }, { { 0x1F69, 0x0399, 0x0 }, { 0x1FA1, 0x0, 0x0 }, { 0x1FA9, 0x0, 0x0 } }, { { 0x1F6A, 0x0399, 0x0 }, { 0x1FA2, 0x0, 0x0 }, { 0x1FAA, 0x0, 0x0 } }, { { 0x1F6B, 0x0399, 0x0 }, { 0x1FA3, 0x0, 0x0 }, { 0x1FAB, 0x0, 0x0 } }, { { 0x1F6C, 0x0399, 0x0 }, { 0x1FA4, 0x0, 0x0 }, { 0x1FAC, 0x0, 0x0 } }, { { 0x1F6D, 0x0399, 0x0 }, { 0x1FA5, 0x0, 0x0 }, { 0x1FAD, 0x0, 0x0 } }, { { 0x1F6E, 0x0399, 0x0 }, { 0x1FA6, 0x0, 0x0 }, { 0x1FAE, 0x0, 0x0 } }, { { 0x1F6F, 0x0399, 0x0 }, { 0x1FA7, 0x0, 0x0 }, { 0x1FAF, 0x0, 0x0 } }, { { 0x0391, 0x0399, 0x0 }, { 0x1FB3, 0x0, 0x0 }, { 0x1FBC, 0x0, 0x0 } }, { { 0x0391, 0x0399, 0x0 }, { 0x1FB3, 0x0, 0x0 }, { 0x1FBC, 0x0, 0x0 } }, { { 0x0397, 0x0399, 0x0 }, { 0x1FC3, 0x0, 0x0 }, { 0x1FCC, 0x0, 0x0 } }, { { 0x0397, 0x0399, 0x0 }, { 0x1FC3, 0x0, 0x0 }, { 0x1FCC, 0x0, 0x0 } }, { { 0x03A9, 0x0399, 0x0 }, { 0x1FF3, 0x0, 0x0 }, { 0x1FFC, 0x0, 0x0 } }, { { 0x03A9, 0x0399, 0x0 }, { 0x1FF3, 0x0, 0x0 }, { 0x1FFC, 0x0, 0x0 } }, { { 0x1FBA, 0x0399, 0x0 }, { 0x1FB2, 0x0, 0x0 }, { 0x1FBA, 0x0345, 0x0 } }, { { 0x0386, 0x0399, 0x0 }, { 0x1FB4, 0x0, 0x0 }, { 0x0386, 0x0345, 0x0 } }, { { 0x1FCA, 0x0399, 0x0 }, { 0x1FC2, 0x0, 0x0 }, { 0x1FCA, 0x0345, 0x0 } }, { { 0x0389, 0x0399, 0x0 }, { 0x1FC4, 0x0, 0x0 }, { 0x0389, 0x0345, 0x0 } }, { { 0x1FFA, 0x0399, 0x0 }, { 0x1FF2, 0x0, 0x0 }, { 0x1FFA, 0x0345, 0x0 } }, { { 0x038F, 0x0399, 0x0 }, { 0x1FF4, 0x0, 0x0 }, { 0x038F, 0x0345, 0x0 } }, { { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0x0, 0x0 }, { 0x0391, 0x0342, 0x0345 } }, { { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0x0, 0x0 }, { 0x0397, 0x0342, 0x0345 } }, { { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0x0, 0x0 }, { 0x03A9, 0x0342, 0x0345 } } }; static const MVMint32 case_changes[2471][3] = { {0x0,0x0,0x0}, /*1*/{0x0,0x0061,0x0}/* 0041 */,/*2*/{0x0,0x0062,0x0}/* 0042 */,/*3*/{0x0,0x0063,0x0}/* 0043 */, /*4*/{0x0,0x0064,0x0}/* 0044 */,/*5*/{0x0,0x0065,0x0}/* 0045 */,/*6*/{0x0,0x0066,0x0}/* 0046 */, /*7*/{0x0,0x0067,0x0}/* 0047 */,/*8*/{0x0,0x0068,0x0}/* 0048 */,/*9*/{0x0,0x0069,0x0}/* 0049 */, /*10*/{0x0,0x006A,0x0}/* 004A */,/*11*/{0x0,0x006B,0x0}/* 004B */,/*12*/{0x0,0x006C,0x0}/* 004C */, /*13*/{0x0,0x006D,0x0}/* 004D */,/*14*/{0x0,0x006E,0x0}/* 004E */,/*15*/{0x0,0x006F,0x0}/* 004F */, /*16*/{0x0,0x0070,0x0}/* 0050 */,/*17*/{0x0,0x0071,0x0}/* 0051 */,/*18*/{0x0,0x0072,0x0}/* 0052 */, /*19*/{0x0,0x0073,0x0}/* 0053 */,/*20*/{0x0,0x0074,0x0}/* 0054 */,/*21*/{0x0,0x0075,0x0}/* 0055 */, /*22*/{0x0,0x0076,0x0}/* 0056 */,/*23*/{0x0,0x0077,0x0}/* 0057 */,/*24*/{0x0,0x0078,0x0}/* 0058 */, /*25*/{0x0,0x0079,0x0}/* 0059 */,/*26*/{0x0,0x007A,0x0}/* 005A */,/*27*/{0x0041,0x0,0x0041}/* 0061 */, /*28*/{0x0042,0x0,0x0042}/* 0062 */,/*29*/{0x0043,0x0,0x0043}/* 0063 */,/*30*/{0x0044,0x0,0x0044}/* 0064 */, /*31*/{0x0045,0x0,0x0045}/* 0065 */,/*32*/{0x0046,0x0,0x0046}/* 0066 */,/*33*/{0x0047,0x0,0x0047}/* 0067 */, /*34*/{0x0048,0x0,0x0048}/* 0068 */,/*35*/{0x0049,0x0,0x0049}/* 0069 */,/*36*/{0x004A,0x0,0x004A}/* 006A */, /*37*/{0x004B,0x0,0x004B}/* 006B */,/*38*/{0x004C,0x0,0x004C}/* 006C */,/*39*/{0x004D,0x0,0x004D}/* 006D */, /*40*/{0x004E,0x0,0x004E}/* 006E */,/*41*/{0x004F,0x0,0x004F}/* 006F */,/*42*/{0x0050,0x0,0x0050}/* 0070 */, /*43*/{0x0051,0x0,0x0051}/* 0071 */,/*44*/{0x0052,0x0,0x0052}/* 0072 */,/*45*/{0x0053,0x0,0x0053}/* 0073 */, /*46*/{0x0054,0x0,0x0054}/* 0074 */,/*47*/{0x0055,0x0,0x0055}/* 0075 */,/*48*/{0x0056,0x0,0x0056}/* 0076 */, /*49*/{0x0057,0x0,0x0057}/* 0077 */,/*50*/{0x0058,0x0,0x0058}/* 0078 */,/*51*/{0x0059,0x0,0x0059}/* 0079 */, /*52*/{0x005A,0x0,0x005A}/* 007A */,/*53*/{0x039C,0x0,0x039C}/* 00B5 */,/*54*/{0x0,0x00E0,0x0}/* 00C0 */, /*55*/{0x0,0x00E1,0x0}/* 00C1 */,/*56*/{0x0,0x00E2,0x0}/* 00C2 */,/*57*/{0x0,0x00E3,0x0}/* 00C3 */, /*58*/{0x0,0x00E4,0x0}/* 00C4 */,/*59*/{0x0,0x00E5,0x0}/* 00C5 */,/*60*/{0x0,0x00E6,0x0}/* 00C6 */, /*61*/{0x0,0x00E7,0x0}/* 00C7 */,/*62*/{0x0,0x00E8,0x0}/* 00C8 */,/*63*/{0x0,0x00E9,0x0}/* 00C9 */, /*64*/{0x0,0x00EA,0x0}/* 00CA */,/*65*/{0x0,0x00EB,0x0}/* 00CB */,/*66*/{0x0,0x00EC,0x0}/* 00CC */, /*67*/{0x0,0x00ED,0x0}/* 00CD */,/*68*/{0x0,0x00EE,0x0}/* 00CE */,/*69*/{0x0,0x00EF,0x0}/* 00CF */, /*70*/{0x0,0x00F0,0x0}/* 00D0 */,/*71*/{0x0,0x00F1,0x0}/* 00D1 */,/*72*/{0x0,0x00F2,0x0}/* 00D2 */, /*73*/{0x0,0x00F3,0x0}/* 00D3 */,/*74*/{0x0,0x00F4,0x0}/* 00D4 */,/*75*/{0x0,0x00F5,0x0}/* 00D5 */, /*76*/{0x0,0x00F6,0x0}/* 00D6 */,/*77*/{0x0,0x00F8,0x0}/* 00D8 */,/*78*/{0x0,0x00F9,0x0}/* 00D9 */, /*79*/{0x0,0x00FA,0x0}/* 00DA */,/*80*/{0x0,0x00FB,0x0}/* 00DB */,/*81*/{0x0,0x00FC,0x0}/* 00DC */, /*82*/{0x0,0x00FD,0x0}/* 00DD */,/*83*/{0x0,0x00FE,0x0}/* 00DE */,/*84*/{0x00C0,0x0,0x00C0}/* 00E0 */, /*85*/{0x00C1,0x0,0x00C1}/* 00E1 */,/*86*/{0x00C2,0x0,0x00C2}/* 00E2 */,/*87*/{0x00C3,0x0,0x00C3}/* 00E3 */, /*88*/{0x00C4,0x0,0x00C4}/* 00E4 */,/*89*/{0x00C5,0x0,0x00C5}/* 00E5 */,/*90*/{0x00C6,0x0,0x00C6}/* 00E6 */, /*91*/{0x00C7,0x0,0x00C7}/* 00E7 */,/*92*/{0x00C8,0x0,0x00C8}/* 00E8 */,/*93*/{0x00C9,0x0,0x00C9}/* 00E9 */, /*94*/{0x00CA,0x0,0x00CA}/* 00EA */,/*95*/{0x00CB,0x0,0x00CB}/* 00EB */,/*96*/{0x00CC,0x0,0x00CC}/* 00EC */, /*97*/{0x00CD,0x0,0x00CD}/* 00ED */,/*98*/{0x00CE,0x0,0x00CE}/* 00EE */,/*99*/{0x00CF,0x0,0x00CF}/* 00EF */, /*100*/{0x00D0,0x0,0x00D0}/* 00F0 */,/*101*/{0x00D1,0x0,0x00D1}/* 00F1 */,/*102*/{0x00D2,0x0,0x00D2}/* 00F2 */, /*103*/{0x00D3,0x0,0x00D3}/* 00F3 */,/*104*/{0x00D4,0x0,0x00D4}/* 00F4 */,/*105*/{0x00D5,0x0,0x00D5}/* 00F5 */, /*106*/{0x00D6,0x0,0x00D6}/* 00F6 */,/*107*/{0x00D8,0x0,0x00D8}/* 00F8 */,/*108*/{0x00D9,0x0,0x00D9}/* 00F9 */, /*109*/{0x00DA,0x0,0x00DA}/* 00FA */,/*110*/{0x00DB,0x0,0x00DB}/* 00FB */,/*111*/{0x00DC,0x0,0x00DC}/* 00FC */, /*112*/{0x00DD,0x0,0x00DD}/* 00FD */,/*113*/{0x00DE,0x0,0x00DE}/* 00FE */,/*114*/{0x0178,0x0,0x0178}/* 00FF */, /*115*/{0x0,0x0101,0x0}/* 0100 */,/*116*/{0x0100,0x0,0x0100}/* 0101 */,/*117*/{0x0,0x0103,0x0}/* 0102 */, /*118*/{0x0102,0x0,0x0102}/* 0103 */,/*119*/{0x0,0x0105,0x0}/* 0104 */,/*120*/{0x0104,0x0,0x0104}/* 0105 */, /*121*/{0x0,0x0107,0x0}/* 0106 */,/*122*/{0x0106,0x0,0x0106}/* 0107 */,/*123*/{0x0,0x0109,0x0}/* 0108 */, /*124*/{0x0108,0x0,0x0108}/* 0109 */,/*125*/{0x0,0x010B,0x0}/* 010A */,/*126*/{0x010A,0x0,0x010A}/* 010B */, /*127*/{0x0,0x010D,0x0}/* 010C */,/*128*/{0x010C,0x0,0x010C}/* 010D */,/*129*/{0x0,0x010F,0x0}/* 010E */, /*130*/{0x010E,0x0,0x010E}/* 010F */,/*131*/{0x0,0x0111,0x0}/* 0110 */,/*132*/{0x0110,0x0,0x0110}/* 0111 */, /*133*/{0x0,0x0113,0x0}/* 0112 */,/*134*/{0x0112,0x0,0x0112}/* 0113 */,/*135*/{0x0,0x0115,0x0}/* 0114 */, /*136*/{0x0114,0x0,0x0114}/* 0115 */,/*137*/{0x0,0x0117,0x0}/* 0116 */,/*138*/{0x0116,0x0,0x0116}/* 0117 */, /*139*/{0x0,0x0119,0x0}/* 0118 */,/*140*/{0x0118,0x0,0x0118}/* 0119 */,/*141*/{0x0,0x011B,0x0}/* 011A */, /*142*/{0x011A,0x0,0x011A}/* 011B */,/*143*/{0x0,0x011D,0x0}/* 011C */,/*144*/{0x011C,0x0,0x011C}/* 011D */, /*145*/{0x0,0x011F,0x0}/* 011E */,/*146*/{0x011E,0x0,0x011E}/* 011F */,/*147*/{0x0,0x0121,0x0}/* 0120 */, /*148*/{0x0120,0x0,0x0120}/* 0121 */,/*149*/{0x0,0x0123,0x0}/* 0122 */,/*150*/{0x0122,0x0,0x0122}/* 0123 */, /*151*/{0x0,0x0125,0x0}/* 0124 */,/*152*/{0x0124,0x0,0x0124}/* 0125 */,/*153*/{0x0,0x0127,0x0}/* 0126 */, /*154*/{0x0126,0x0,0x0126}/* 0127 */,/*155*/{0x0,0x0129,0x0}/* 0128 */,/*156*/{0x0128,0x0,0x0128}/* 0129 */, /*157*/{0x0,0x012B,0x0}/* 012A */,/*158*/{0x012A,0x0,0x012A}/* 012B */,/*159*/{0x0,0x012D,0x0}/* 012C */, /*160*/{0x012C,0x0,0x012C}/* 012D */,/*161*/{0x0,0x012F,0x0}/* 012E */,/*162*/{0x012E,0x0,0x012E}/* 012F */, /*163*/{0x0,0x0069,0x0}/* 0130 */,/*164*/{0x0049,0x0,0x0049}/* 0131 */,/*165*/{0x0,0x0133,0x0}/* 0132 */, /*166*/{0x0132,0x0,0x0132}/* 0133 */,/*167*/{0x0,0x0135,0x0}/* 0134 */,/*168*/{0x0134,0x0,0x0134}/* 0135 */, /*169*/{0x0,0x0137,0x0}/* 0136 */,/*170*/{0x0136,0x0,0x0136}/* 0137 */,/*171*/{0x0,0x013A,0x0}/* 0139 */, /*172*/{0x0139,0x0,0x0139}/* 013A */,/*173*/{0x0,0x013C,0x0}/* 013B */,/*174*/{0x013B,0x0,0x013B}/* 013C */, /*175*/{0x0,0x013E,0x0}/* 013D */,/*176*/{0x013D,0x0,0x013D}/* 013E */,/*177*/{0x0,0x0140,0x0}/* 013F */, /*178*/{0x013F,0x0,0x013F}/* 0140 */,/*179*/{0x0,0x0142,0x0}/* 0141 */,/*180*/{0x0141,0x0,0x0141}/* 0142 */, /*181*/{0x0,0x0144,0x0}/* 0143 */,/*182*/{0x0143,0x0,0x0143}/* 0144 */,/*183*/{0x0,0x0146,0x0}/* 0145 */, /*184*/{0x0145,0x0,0x0145}/* 0146 */,/*185*/{0x0,0x0148,0x0}/* 0147 */,/*186*/{0x0147,0x0,0x0147}/* 0148 */, /*187*/{0x0,0x014B,0x0}/* 014A */,/*188*/{0x014A,0x0,0x014A}/* 014B */,/*189*/{0x0,0x014D,0x0}/* 014C */, /*190*/{0x014C,0x0,0x014C}/* 014D */,/*191*/{0x0,0x014F,0x0}/* 014E */,/*192*/{0x014E,0x0,0x014E}/* 014F */, /*193*/{0x0,0x0151,0x0}/* 0150 */,/*194*/{0x0150,0x0,0x0150}/* 0151 */,/*195*/{0x0,0x0153,0x0}/* 0152 */, /*196*/{0x0152,0x0,0x0152}/* 0153 */,/*197*/{0x0,0x0155,0x0}/* 0154 */,/*198*/{0x0154,0x0,0x0154}/* 0155 */, /*199*/{0x0,0x0157,0x0}/* 0156 */,/*200*/{0x0156,0x0,0x0156}/* 0157 */,/*201*/{0x0,0x0159,0x0}/* 0158 */, /*202*/{0x0158,0x0,0x0158}/* 0159 */,/*203*/{0x0,0x015B,0x0}/* 015A */,/*204*/{0x015A,0x0,0x015A}/* 015B */, /*205*/{0x0,0x015D,0x0}/* 015C */,/*206*/{0x015C,0x0,0x015C}/* 015D */,/*207*/{0x0,0x015F,0x0}/* 015E */, /*208*/{0x015E,0x0,0x015E}/* 015F */,/*209*/{0x0,0x0161,0x0}/* 0160 */,/*210*/{0x0160,0x0,0x0160}/* 0161 */, /*211*/{0x0,0x0163,0x0}/* 0162 */,/*212*/{0x0162,0x0,0x0162}/* 0163 */,/*213*/{0x0,0x0165,0x0}/* 0164 */, /*214*/{0x0164,0x0,0x0164}/* 0165 */,/*215*/{0x0,0x0167,0x0}/* 0166 */,/*216*/{0x0166,0x0,0x0166}/* 0167 */, /*217*/{0x0,0x0169,0x0}/* 0168 */,/*218*/{0x0168,0x0,0x0168}/* 0169 */,/*219*/{0x0,0x016B,0x0}/* 016A */, /*220*/{0x016A,0x0,0x016A}/* 016B */,/*221*/{0x0,0x016D,0x0}/* 016C */,/*222*/{0x016C,0x0,0x016C}/* 016D */, /*223*/{0x0,0x016F,0x0}/* 016E */,/*224*/{0x016E,0x0,0x016E}/* 016F */,/*225*/{0x0,0x0171,0x0}/* 0170 */, /*226*/{0x0170,0x0,0x0170}/* 0171 */,/*227*/{0x0,0x0173,0x0}/* 0172 */,/*228*/{0x0172,0x0,0x0172}/* 0173 */, /*229*/{0x0,0x0175,0x0}/* 0174 */,/*230*/{0x0174,0x0,0x0174}/* 0175 */,/*231*/{0x0,0x0177,0x0}/* 0176 */, /*232*/{0x0176,0x0,0x0176}/* 0177 */,/*233*/{0x0,0x00FF,0x0}/* 0178 */,/*234*/{0x0,0x017A,0x0}/* 0179 */, /*235*/{0x0179,0x0,0x0179}/* 017A */,/*236*/{0x0,0x017C,0x0}/* 017B */,/*237*/{0x017B,0x0,0x017B}/* 017C */, /*238*/{0x0,0x017E,0x0}/* 017D */,/*239*/{0x017D,0x0,0x017D}/* 017E */,/*240*/{0x0053,0x0,0x0053}/* 017F */, /*241*/{0x0243,0x0,0x0243}/* 0180 */,/*242*/{0x0,0x0253,0x0}/* 0181 */,/*243*/{0x0,0x0183,0x0}/* 0182 */, /*244*/{0x0182,0x0,0x0182}/* 0183 */,/*245*/{0x0,0x0185,0x0}/* 0184 */,/*246*/{0x0184,0x0,0x0184}/* 0185 */, /*247*/{0x0,0x0254,0x0}/* 0186 */,/*248*/{0x0,0x0188,0x0}/* 0187 */,/*249*/{0x0187,0x0,0x0187}/* 0188 */, /*250*/{0x0,0x0256,0x0}/* 0189 */,/*251*/{0x0,0x0257,0x0}/* 018A */,/*252*/{0x0,0x018C,0x0}/* 018B */, /*253*/{0x018B,0x0,0x018B}/* 018C */,/*254*/{0x0,0x01DD,0x0}/* 018E */,/*255*/{0x0,0x0259,0x0}/* 018F */, /*256*/{0x0,0x025B,0x0}/* 0190 */,/*257*/{0x0,0x0192,0x0}/* 0191 */,/*258*/{0x0191,0x0,0x0191}/* 0192 */, /*259*/{0x0,0x0260,0x0}/* 0193 */,/*260*/{0x0,0x0263,0x0}/* 0194 */,/*261*/{0x01F6,0x0,0x01F6}/* 0195 */, /*262*/{0x0,0x0269,0x0}/* 0196 */,/*263*/{0x0,0x0268,0x0}/* 0197 */,/*264*/{0x0,0x0199,0x0}/* 0198 */, /*265*/{0x0198,0x0,0x0198}/* 0199 */,/*266*/{0x023D,0x0,0x023D}/* 019A */,/*267*/{0x0,0x026F,0x0}/* 019C */, /*268*/{0x0,0x0272,0x0}/* 019D */,/*269*/{0x0220,0x0,0x0220}/* 019E */,/*270*/{0x0,0x0275,0x0}/* 019F */, /*271*/{0x0,0x01A1,0x0}/* 01A0 */,/*272*/{0x01A0,0x0,0x01A0}/* 01A1 */,/*273*/{0x0,0x01A3,0x0}/* 01A2 */, /*274*/{0x01A2,0x0,0x01A2}/* 01A3 */,/*275*/{0x0,0x01A5,0x0}/* 01A4 */,/*276*/{0x01A4,0x0,0x01A4}/* 01A5 */, /*277*/{0x0,0x0280,0x0}/* 01A6 */,/*278*/{0x0,0x01A8,0x0}/* 01A7 */,/*279*/{0x01A7,0x0,0x01A7}/* 01A8 */, /*280*/{0x0,0x0283,0x0}/* 01A9 */,/*281*/{0x0,0x01AD,0x0}/* 01AC */,/*282*/{0x01AC,0x0,0x01AC}/* 01AD */, /*283*/{0x0,0x0288,0x0}/* 01AE */,/*284*/{0x0,0x01B0,0x0}/* 01AF */,/*285*/{0x01AF,0x0,0x01AF}/* 01B0 */, /*286*/{0x0,0x028A,0x0}/* 01B1 */,/*287*/{0x0,0x028B,0x0}/* 01B2 */,/*288*/{0x0,0x01B4,0x0}/* 01B3 */, /*289*/{0x01B3,0x0,0x01B3}/* 01B4 */,/*290*/{0x0,0x01B6,0x0}/* 01B5 */,/*291*/{0x01B5,0x0,0x01B5}/* 01B6 */, /*292*/{0x0,0x0292,0x0}/* 01B7 */,/*293*/{0x0,0x01B9,0x0}/* 01B8 */,/*294*/{0x01B8,0x0,0x01B8}/* 01B9 */, /*295*/{0x0,0x01BD,0x0}/* 01BC */,/*296*/{0x01BC,0x0,0x01BC}/* 01BD */,/*297*/{0x01F7,0x0,0x01F7}/* 01BF */, /*298*/{0x0,0x01C6,0x01C5}/* 01C4 */,/*299*/{0x01C4,0x01C6,0x01C5}/* 01C5 */,/*300*/{0x01C4,0x0,0x01C5}/* 01C6 */, /*301*/{0x0,0x01C9,0x01C8}/* 01C7 */,/*302*/{0x01C7,0x01C9,0x01C8}/* 01C8 */,/*303*/{0x01C7,0x0,0x01C8}/* 01C9 */, /*304*/{0x0,0x01CC,0x01CB}/* 01CA */,/*305*/{0x01CA,0x01CC,0x01CB}/* 01CB */,/*306*/{0x01CA,0x0,0x01CB}/* 01CC */, /*307*/{0x0,0x01CE,0x0}/* 01CD */,/*308*/{0x01CD,0x0,0x01CD}/* 01CE */,/*309*/{0x0,0x01D0,0x0}/* 01CF */, /*310*/{0x01CF,0x0,0x01CF}/* 01D0 */,/*311*/{0x0,0x01D2,0x0}/* 01D1 */,/*312*/{0x01D1,0x0,0x01D1}/* 01D2 */, /*313*/{0x0,0x01D4,0x0}/* 01D3 */,/*314*/{0x01D3,0x0,0x01D3}/* 01D4 */,/*315*/{0x0,0x01D6,0x0}/* 01D5 */, /*316*/{0x01D5,0x0,0x01D5}/* 01D6 */,/*317*/{0x0,0x01D8,0x0}/* 01D7 */,/*318*/{0x01D7,0x0,0x01D7}/* 01D8 */, /*319*/{0x0,0x01DA,0x0}/* 01D9 */,/*320*/{0x01D9,0x0,0x01D9}/* 01DA */,/*321*/{0x0,0x01DC,0x0}/* 01DB */, /*322*/{0x01DB,0x0,0x01DB}/* 01DC */,/*323*/{0x018E,0x0,0x018E}/* 01DD */,/*324*/{0x0,0x01DF,0x0}/* 01DE */, /*325*/{0x01DE,0x0,0x01DE}/* 01DF */,/*326*/{0x0,0x01E1,0x0}/* 01E0 */,/*327*/{0x01E0,0x0,0x01E0}/* 01E1 */, /*328*/{0x0,0x01E3,0x0}/* 01E2 */,/*329*/{0x01E2,0x0,0x01E2}/* 01E3 */,/*330*/{0x0,0x01E5,0x0}/* 01E4 */, /*331*/{0x01E4,0x0,0x01E4}/* 01E5 */,/*332*/{0x0,0x01E7,0x0}/* 01E6 */,/*333*/{0x01E6,0x0,0x01E6}/* 01E7 */, /*334*/{0x0,0x01E9,0x0}/* 01E8 */,/*335*/{0x01E8,0x0,0x01E8}/* 01E9 */,/*336*/{0x0,0x01EB,0x0}/* 01EA */, /*337*/{0x01EA,0x0,0x01EA}/* 01EB */,/*338*/{0x0,0x01ED,0x0}/* 01EC */,/*339*/{0x01EC,0x0,0x01EC}/* 01ED */, /*340*/{0x0,0x01EF,0x0}/* 01EE */,/*341*/{0x01EE,0x0,0x01EE}/* 01EF */,/*342*/{0x0,0x01F3,0x01F2}/* 01F1 */, /*343*/{0x01F1,0x01F3,0x01F2}/* 01F2 */,/*344*/{0x01F1,0x0,0x01F2}/* 01F3 */,/*345*/{0x0,0x01F5,0x0}/* 01F4 */, /*346*/{0x01F4,0x0,0x01F4}/* 01F5 */,/*347*/{0x0,0x0195,0x0}/* 01F6 */,/*348*/{0x0,0x01BF,0x0}/* 01F7 */, /*349*/{0x0,0x01F9,0x0}/* 01F8 */,/*350*/{0x01F8,0x0,0x01F8}/* 01F9 */,/*351*/{0x0,0x01FB,0x0}/* 01FA */, /*352*/{0x01FA,0x0,0x01FA}/* 01FB */,/*353*/{0x0,0x01FD,0x0}/* 01FC */,/*354*/{0x01FC,0x0,0x01FC}/* 01FD */, /*355*/{0x0,0x01FF,0x0}/* 01FE */,/*356*/{0x01FE,0x0,0x01FE}/* 01FF */,/*357*/{0x0,0x0201,0x0}/* 0200 */, /*358*/{0x0200,0x0,0x0200}/* 0201 */,/*359*/{0x0,0x0203,0x0}/* 0202 */,/*360*/{0x0202,0x0,0x0202}/* 0203 */, /*361*/{0x0,0x0205,0x0}/* 0204 */,/*362*/{0x0204,0x0,0x0204}/* 0205 */,/*363*/{0x0,0x0207,0x0}/* 0206 */, /*364*/{0x0206,0x0,0x0206}/* 0207 */,/*365*/{0x0,0x0209,0x0}/* 0208 */,/*366*/{0x0208,0x0,0x0208}/* 0209 */, /*367*/{0x0,0x020B,0x0}/* 020A */,/*368*/{0x020A,0x0,0x020A}/* 020B */,/*369*/{0x0,0x020D,0x0}/* 020C */, /*370*/{0x020C,0x0,0x020C}/* 020D */,/*371*/{0x0,0x020F,0x0}/* 020E */,/*372*/{0x020E,0x0,0x020E}/* 020F */, /*373*/{0x0,0x0211,0x0}/* 0210 */,/*374*/{0x0210,0x0,0x0210}/* 0211 */,/*375*/{0x0,0x0213,0x0}/* 0212 */, /*376*/{0x0212,0x0,0x0212}/* 0213 */,/*377*/{0x0,0x0215,0x0}/* 0214 */,/*378*/{0x0214,0x0,0x0214}/* 0215 */, /*379*/{0x0,0x0217,0x0}/* 0216 */,/*380*/{0x0216,0x0,0x0216}/* 0217 */,/*381*/{0x0,0x0219,0x0}/* 0218 */, /*382*/{0x0218,0x0,0x0218}/* 0219 */,/*383*/{0x0,0x021B,0x0}/* 021A */,/*384*/{0x021A,0x0,0x021A}/* 021B */, /*385*/{0x0,0x021D,0x0}/* 021C */,/*386*/{0x021C,0x0,0x021C}/* 021D */,/*387*/{0x0,0x021F,0x0}/* 021E */, /*388*/{0x021E,0x0,0x021E}/* 021F */,/*389*/{0x0,0x019E,0x0}/* 0220 */,/*390*/{0x0,0x0223,0x0}/* 0222 */, /*391*/{0x0222,0x0,0x0222}/* 0223 */,/*392*/{0x0,0x0225,0x0}/* 0224 */,/*393*/{0x0224,0x0,0x0224}/* 0225 */, /*394*/{0x0,0x0227,0x0}/* 0226 */,/*395*/{0x0226,0x0,0x0226}/* 0227 */,/*396*/{0x0,0x0229,0x0}/* 0228 */, /*397*/{0x0228,0x0,0x0228}/* 0229 */,/*398*/{0x0,0x022B,0x0}/* 022A */,/*399*/{0x022A,0x0,0x022A}/* 022B */, /*400*/{0x0,0x022D,0x0}/* 022C */,/*401*/{0x022C,0x0,0x022C}/* 022D */,/*402*/{0x0,0x022F,0x0}/* 022E */, /*403*/{0x022E,0x0,0x022E}/* 022F */,/*404*/{0x0,0x0231,0x0}/* 0230 */,/*405*/{0x0230,0x0,0x0230}/* 0231 */, /*406*/{0x0,0x0233,0x0}/* 0232 */,/*407*/{0x0232,0x0,0x0232}/* 0233 */,/*408*/{0x0,0x2C65,0x0}/* 023A */, /*409*/{0x0,0x023C,0x0}/* 023B */,/*410*/{0x023B,0x0,0x023B}/* 023C */,/*411*/{0x0,0x019A,0x0}/* 023D */, /*412*/{0x0,0x2C66,0x0}/* 023E */,/*413*/{0x2C7E,0x0,0x2C7E}/* 023F */,/*414*/{0x2C7F,0x0,0x2C7F}/* 0240 */, /*415*/{0x0,0x0242,0x0}/* 0241 */,/*416*/{0x0241,0x0,0x0241}/* 0242 */,/*417*/{0x0,0x0180,0x0}/* 0243 */, /*418*/{0x0,0x0289,0x0}/* 0244 */,/*419*/{0x0,0x028C,0x0}/* 0245 */,/*420*/{0x0,0x0247,0x0}/* 0246 */, /*421*/{0x0246,0x0,0x0246}/* 0247 */,/*422*/{0x0,0x0249,0x0}/* 0248 */,/*423*/{0x0248,0x0,0x0248}/* 0249 */, /*424*/{0x0,0x024B,0x0}/* 024A */,/*425*/{0x024A,0x0,0x024A}/* 024B */,/*426*/{0x0,0x024D,0x0}/* 024C */, /*427*/{0x024C,0x0,0x024C}/* 024D */,/*428*/{0x0,0x024F,0x0}/* 024E */,/*429*/{0x024E,0x0,0x024E}/* 024F */, /*430*/{0x2C6F,0x0,0x2C6F}/* 0250 */,/*431*/{0x2C6D,0x0,0x2C6D}/* 0251 */,/*432*/{0x2C70,0x0,0x2C70}/* 0252 */, /*433*/{0x0181,0x0,0x0181}/* 0253 */,/*434*/{0x0186,0x0,0x0186}/* 0254 */,/*435*/{0x0189,0x0,0x0189}/* 0256 */, /*436*/{0x018A,0x0,0x018A}/* 0257 */,/*437*/{0x018F,0x0,0x018F}/* 0259 */,/*438*/{0x0190,0x0,0x0190}/* 025B */, /*439*/{0xA7AB,0x0,0xA7AB}/* 025C */,/*440*/{0x0193,0x0,0x0193}/* 0260 */,/*441*/{0xA7AC,0x0,0xA7AC}/* 0261 */, /*442*/{0x0194,0x0,0x0194}/* 0263 */,/*443*/{0xA78D,0x0,0xA78D}/* 0265 */,/*444*/{0xA7AA,0x0,0xA7AA}/* 0266 */, /*445*/{0x0197,0x0,0x0197}/* 0268 */,/*446*/{0x0196,0x0,0x0196}/* 0269 */,/*447*/{0x2C62,0x0,0x2C62}/* 026B */, /*448*/{0xA7AD,0x0,0xA7AD}/* 026C */,/*449*/{0x019C,0x0,0x019C}/* 026F */,/*450*/{0x2C6E,0x0,0x2C6E}/* 0271 */, /*451*/{0x019D,0x0,0x019D}/* 0272 */,/*452*/{0x019F,0x0,0x019F}/* 0275 */,/*453*/{0x2C64,0x0,0x2C64}/* 027D */, /*454*/{0x01A6,0x0,0x01A6}/* 0280 */,/*455*/{0x01A9,0x0,0x01A9}/* 0283 */,/*456*/{0xA7B1,0x0,0xA7B1}/* 0287 */, /*457*/{0x01AE,0x0,0x01AE}/* 0288 */,/*458*/{0x0244,0x0,0x0244}/* 0289 */,/*459*/{0x01B1,0x0,0x01B1}/* 028A */, /*460*/{0x01B2,0x0,0x01B2}/* 028B */,/*461*/{0x0245,0x0,0x0245}/* 028C */,/*462*/{0x01B7,0x0,0x01B7}/* 0292 */, /*463*/{0xA7B2,0x0,0xA7B2}/* 029D */,/*464*/{0xA7B0,0x0,0xA7B0}/* 029E */,/*465*/{0x0399,0x0,0x0399}/* 0345 */, /*466*/{0x0,0x0371,0x0}/* 0370 */,/*467*/{0x0370,0x0,0x0370}/* 0371 */,/*468*/{0x0,0x0373,0x0}/* 0372 */, /*469*/{0x0372,0x0,0x0372}/* 0373 */,/*470*/{0x0,0x0377,0x0}/* 0376 */,/*471*/{0x0376,0x0,0x0376}/* 0377 */, /*472*/{0x03FD,0x0,0x03FD}/* 037B */,/*473*/{0x03FE,0x0,0x03FE}/* 037C */,/*474*/{0x03FF,0x0,0x03FF}/* 037D */, /*475*/{0x0,0x03F3,0x0}/* 037F */,/*476*/{0x0,0x03AC,0x0}/* 0386 */,/*477*/{0x0,0x03AD,0x0}/* 0388 */, /*478*/{0x0,0x03AE,0x0}/* 0389 */,/*479*/{0x0,0x03AF,0x0}/* 038A */,/*480*/{0x0,0x03CC,0x0}/* 038C */, /*481*/{0x0,0x03CD,0x0}/* 038E */,/*482*/{0x0,0x03CE,0x0}/* 038F */,/*483*/{0x0,0x03B1,0x0}/* 0391 */, /*484*/{0x0,0x03B2,0x0}/* 0392 */,/*485*/{0x0,0x03B3,0x0}/* 0393 */,/*486*/{0x0,0x03B4,0x0}/* 0394 */, /*487*/{0x0,0x03B5,0x0}/* 0395 */,/*488*/{0x0,0x03B6,0x0}/* 0396 */,/*489*/{0x0,0x03B7,0x0}/* 0397 */, /*490*/{0x0,0x03B8,0x0}/* 0398 */,/*491*/{0x0,0x03B9,0x0}/* 0399 */,/*492*/{0x0,0x03BA,0x0}/* 039A */, /*493*/{0x0,0x03BB,0x0}/* 039B */,/*494*/{0x0,0x03BC,0x0}/* 039C */,/*495*/{0x0,0x03BD,0x0}/* 039D */, /*496*/{0x0,0x03BE,0x0}/* 039E */,/*497*/{0x0,0x03BF,0x0}/* 039F */,/*498*/{0x0,0x03C0,0x0}/* 03A0 */, /*499*/{0x0,0x03C1,0x0}/* 03A1 */,/*500*/{0x0,0x03C3,0x0}/* 03A3 */,/*501*/{0x0,0x03C4,0x0}/* 03A4 */, /*502*/{0x0,0x03C5,0x0}/* 03A5 */,/*503*/{0x0,0x03C6,0x0}/* 03A6 */,/*504*/{0x0,0x03C7,0x0}/* 03A7 */, /*505*/{0x0,0x03C8,0x0}/* 03A8 */,/*506*/{0x0,0x03C9,0x0}/* 03A9 */,/*507*/{0x0,0x03CA,0x0}/* 03AA */, /*508*/{0x0,0x03CB,0x0}/* 03AB */,/*509*/{0x0386,0x0,0x0386}/* 03AC */,/*510*/{0x0388,0x0,0x0388}/* 03AD */, /*511*/{0x0389,0x0,0x0389}/* 03AE */,/*512*/{0x038A,0x0,0x038A}/* 03AF */,/*513*/{0x0391,0x0,0x0391}/* 03B1 */, /*514*/{0x0392,0x0,0x0392}/* 03B2 */,/*515*/{0x0393,0x0,0x0393}/* 03B3 */,/*516*/{0x0394,0x0,0x0394}/* 03B4 */, /*517*/{0x0395,0x0,0x0395}/* 03B5 */,/*518*/{0x0396,0x0,0x0396}/* 03B6 */,/*519*/{0x0397,0x0,0x0397}/* 03B7 */, /*520*/{0x0398,0x0,0x0398}/* 03B8 */,/*521*/{0x0399,0x0,0x0399}/* 03B9 */,/*522*/{0x039A,0x0,0x039A}/* 03BA */, /*523*/{0x039B,0x0,0x039B}/* 03BB */,/*524*/{0x039C,0x0,0x039C}/* 03BC */,/*525*/{0x039D,0x0,0x039D}/* 03BD */, /*526*/{0x039E,0x0,0x039E}/* 03BE */,/*527*/{0x039F,0x0,0x039F}/* 03BF */,/*528*/{0x03A0,0x0,0x03A0}/* 03C0 */, /*529*/{0x03A1,0x0,0x03A1}/* 03C1 */,/*530*/{0x03A3,0x0,0x03A3}/* 03C2 */,/*531*/{0x03A3,0x0,0x03A3}/* 03C3 */, /*532*/{0x03A4,0x0,0x03A4}/* 03C4 */,/*533*/{0x03A5,0x0,0x03A5}/* 03C5 */,/*534*/{0x03A6,0x0,0x03A6}/* 03C6 */, /*535*/{0x03A7,0x0,0x03A7}/* 03C7 */,/*536*/{0x03A8,0x0,0x03A8}/* 03C8 */,/*537*/{0x03A9,0x0,0x03A9}/* 03C9 */, /*538*/{0x03AA,0x0,0x03AA}/* 03CA */,/*539*/{0x03AB,0x0,0x03AB}/* 03CB */,/*540*/{0x038C,0x0,0x038C}/* 03CC */, /*541*/{0x038E,0x0,0x038E}/* 03CD */,/*542*/{0x038F,0x0,0x038F}/* 03CE */,/*543*/{0x0,0x03D7,0x0}/* 03CF */, /*544*/{0x0392,0x0,0x0392}/* 03D0 */,/*545*/{0x0398,0x0,0x0398}/* 03D1 */,/*546*/{0x03A6,0x0,0x03A6}/* 03D5 */, /*547*/{0x03A0,0x0,0x03A0}/* 03D6 */,/*548*/{0x03CF,0x0,0x03CF}/* 03D7 */,/*549*/{0x0,0x03D9,0x0}/* 03D8 */, /*550*/{0x03D8,0x0,0x03D8}/* 03D9 */,/*551*/{0x0,0x03DB,0x0}/* 03DA */,/*552*/{0x03DA,0x0,0x03DA}/* 03DB */, /*553*/{0x0,0x03DD,0x0}/* 03DC */,/*554*/{0x03DC,0x0,0x03DC}/* 03DD */,/*555*/{0x0,0x03DF,0x0}/* 03DE */, /*556*/{0x03DE,0x0,0x03DE}/* 03DF */,/*557*/{0x0,0x03E1,0x0}/* 03E0 */,/*558*/{0x03E0,0x0,0x03E0}/* 03E1 */, /*559*/{0x0,0x03E3,0x0}/* 03E2 */,/*560*/{0x03E2,0x0,0x03E2}/* 03E3 */,/*561*/{0x0,0x03E5,0x0}/* 03E4 */, /*562*/{0x03E4,0x0,0x03E4}/* 03E5 */,/*563*/{0x0,0x03E7,0x0}/* 03E6 */,/*564*/{0x03E6,0x0,0x03E6}/* 03E7 */, /*565*/{0x0,0x03E9,0x0}/* 03E8 */,/*566*/{0x03E8,0x0,0x03E8}/* 03E9 */,/*567*/{0x0,0x03EB,0x0}/* 03EA */, /*568*/{0x03EA,0x0,0x03EA}/* 03EB */,/*569*/{0x0,0x03ED,0x0}/* 03EC */,/*570*/{0x03EC,0x0,0x03EC}/* 03ED */, /*571*/{0x0,0x03EF,0x0}/* 03EE */,/*572*/{0x03EE,0x0,0x03EE}/* 03EF */,/*573*/{0x039A,0x0,0x039A}/* 03F0 */, /*574*/{0x03A1,0x0,0x03A1}/* 03F1 */,/*575*/{0x03F9,0x0,0x03F9}/* 03F2 */,/*576*/{0x037F,0x0,0x037F}/* 03F3 */, /*577*/{0x0,0x03B8,0x0}/* 03F4 */,/*578*/{0x0395,0x0,0x0395}/* 03F5 */,/*579*/{0x0,0x03F8,0x0}/* 03F7 */, /*580*/{0x03F7,0x0,0x03F7}/* 03F8 */,/*581*/{0x0,0x03F2,0x0}/* 03F9 */,/*582*/{0x0,0x03FB,0x0}/* 03FA */, /*583*/{0x03FA,0x0,0x03FA}/* 03FB */,/*584*/{0x0,0x037B,0x0}/* 03FD */,/*585*/{0x0,0x037C,0x0}/* 03FE */, /*586*/{0x0,0x037D,0x0}/* 03FF */,/*587*/{0x0,0x0450,0x0}/* 0400 */,/*588*/{0x0,0x0451,0x0}/* 0401 */, /*589*/{0x0,0x0452,0x0}/* 0402 */,/*590*/{0x0,0x0453,0x0}/* 0403 */,/*591*/{0x0,0x0454,0x0}/* 0404 */, /*592*/{0x0,0x0455,0x0}/* 0405 */,/*593*/{0x0,0x0456,0x0}/* 0406 */,/*594*/{0x0,0x0457,0x0}/* 0407 */, /*595*/{0x0,0x0458,0x0}/* 0408 */,/*596*/{0x0,0x0459,0x0}/* 0409 */,/*597*/{0x0,0x045A,0x0}/* 040A */, /*598*/{0x0,0x045B,0x0}/* 040B */,/*599*/{0x0,0x045C,0x0}/* 040C */,/*600*/{0x0,0x045D,0x0}/* 040D */, /*601*/{0x0,0x045E,0x0}/* 040E */,/*602*/{0x0,0x045F,0x0}/* 040F */,/*603*/{0x0,0x0430,0x0}/* 0410 */, /*604*/{0x0,0x0431,0x0}/* 0411 */,/*605*/{0x0,0x0432,0x0}/* 0412 */,/*606*/{0x0,0x0433,0x0}/* 0413 */, /*607*/{0x0,0x0434,0x0}/* 0414 */,/*608*/{0x0,0x0435,0x0}/* 0415 */,/*609*/{0x0,0x0436,0x0}/* 0416 */, /*610*/{0x0,0x0437,0x0}/* 0417 */,/*611*/{0x0,0x0438,0x0}/* 0418 */,/*612*/{0x0,0x0439,0x0}/* 0419 */, /*613*/{0x0,0x043A,0x0}/* 041A */,/*614*/{0x0,0x043B,0x0}/* 041B */,/*615*/{0x0,0x043C,0x0}/* 041C */, /*616*/{0x0,0x043D,0x0}/* 041D */,/*617*/{0x0,0x043E,0x0}/* 041E */,/*618*/{0x0,0x043F,0x0}/* 041F */, /*619*/{0x0,0x0440,0x0}/* 0420 */,/*620*/{0x0,0x0441,0x0}/* 0421 */,/*621*/{0x0,0x0442,0x0}/* 0422 */, /*622*/{0x0,0x0443,0x0}/* 0423 */,/*623*/{0x0,0x0444,0x0}/* 0424 */,/*624*/{0x0,0x0445,0x0}/* 0425 */, /*625*/{0x0,0x0446,0x0}/* 0426 */,/*626*/{0x0,0x0447,0x0}/* 0427 */,/*627*/{0x0,0x0448,0x0}/* 0428 */, /*628*/{0x0,0x0449,0x0}/* 0429 */,/*629*/{0x0,0x044A,0x0}/* 042A */,/*630*/{0x0,0x044B,0x0}/* 042B */, /*631*/{0x0,0x044C,0x0}/* 042C */,/*632*/{0x0,0x044D,0x0}/* 042D */,/*633*/{0x0,0x044E,0x0}/* 042E */, /*634*/{0x0,0x044F,0x0}/* 042F */,/*635*/{0x0410,0x0,0x0410}/* 0430 */,/*636*/{0x0411,0x0,0x0411}/* 0431 */, /*637*/{0x0412,0x0,0x0412}/* 0432 */,/*638*/{0x0413,0x0,0x0413}/* 0433 */,/*639*/{0x0414,0x0,0x0414}/* 0434 */, /*640*/{0x0415,0x0,0x0415}/* 0435 */,/*641*/{0x0416,0x0,0x0416}/* 0436 */,/*642*/{0x0417,0x0,0x0417}/* 0437 */, /*643*/{0x0418,0x0,0x0418}/* 0438 */,/*644*/{0x0419,0x0,0x0419}/* 0439 */,/*645*/{0x041A,0x0,0x041A}/* 043A */, /*646*/{0x041B,0x0,0x041B}/* 043B */,/*647*/{0x041C,0x0,0x041C}/* 043C */,/*648*/{0x041D,0x0,0x041D}/* 043D */, /*649*/{0x041E,0x0,0x041E}/* 043E */,/*650*/{0x041F,0x0,0x041F}/* 043F */,/*651*/{0x0420,0x0,0x0420}/* 0440 */, /*652*/{0x0421,0x0,0x0421}/* 0441 */,/*653*/{0x0422,0x0,0x0422}/* 0442 */,/*654*/{0x0423,0x0,0x0423}/* 0443 */, /*655*/{0x0424,0x0,0x0424}/* 0444 */,/*656*/{0x0425,0x0,0x0425}/* 0445 */,/*657*/{0x0426,0x0,0x0426}/* 0446 */, /*658*/{0x0427,0x0,0x0427}/* 0447 */,/*659*/{0x0428,0x0,0x0428}/* 0448 */,/*660*/{0x0429,0x0,0x0429}/* 0449 */, /*661*/{0x042A,0x0,0x042A}/* 044A */,/*662*/{0x042B,0x0,0x042B}/* 044B */,/*663*/{0x042C,0x0,0x042C}/* 044C */, /*664*/{0x042D,0x0,0x042D}/* 044D */,/*665*/{0x042E,0x0,0x042E}/* 044E */,/*666*/{0x042F,0x0,0x042F}/* 044F */, /*667*/{0x0400,0x0,0x0400}/* 0450 */,/*668*/{0x0401,0x0,0x0401}/* 0451 */,/*669*/{0x0402,0x0,0x0402}/* 0452 */, /*670*/{0x0403,0x0,0x0403}/* 0453 */,/*671*/{0x0404,0x0,0x0404}/* 0454 */,/*672*/{0x0405,0x0,0x0405}/* 0455 */, /*673*/{0x0406,0x0,0x0406}/* 0456 */,/*674*/{0x0407,0x0,0x0407}/* 0457 */,/*675*/{0x0408,0x0,0x0408}/* 0458 */, /*676*/{0x0409,0x0,0x0409}/* 0459 */,/*677*/{0x040A,0x0,0x040A}/* 045A */,/*678*/{0x040B,0x0,0x040B}/* 045B */, /*679*/{0x040C,0x0,0x040C}/* 045C */,/*680*/{0x040D,0x0,0x040D}/* 045D */,/*681*/{0x040E,0x0,0x040E}/* 045E */, /*682*/{0x040F,0x0,0x040F}/* 045F */,/*683*/{0x0,0x0461,0x0}/* 0460 */,/*684*/{0x0460,0x0,0x0460}/* 0461 */, /*685*/{0x0,0x0463,0x0}/* 0462 */,/*686*/{0x0462,0x0,0x0462}/* 0463 */,/*687*/{0x0,0x0465,0x0}/* 0464 */, /*688*/{0x0464,0x0,0x0464}/* 0465 */,/*689*/{0x0,0x0467,0x0}/* 0466 */,/*690*/{0x0466,0x0,0x0466}/* 0467 */, /*691*/{0x0,0x0469,0x0}/* 0468 */,/*692*/{0x0468,0x0,0x0468}/* 0469 */,/*693*/{0x0,0x046B,0x0}/* 046A */, /*694*/{0x046A,0x0,0x046A}/* 046B */,/*695*/{0x0,0x046D,0x0}/* 046C */,/*696*/{0x046C,0x0,0x046C}/* 046D */, /*697*/{0x0,0x046F,0x0}/* 046E */,/*698*/{0x046E,0x0,0x046E}/* 046F */,/*699*/{0x0,0x0471,0x0}/* 0470 */, /*700*/{0x0470,0x0,0x0470}/* 0471 */,/*701*/{0x0,0x0473,0x0}/* 0472 */,/*702*/{0x0472,0x0,0x0472}/* 0473 */, /*703*/{0x0,0x0475,0x0}/* 0474 */,/*704*/{0x0474,0x0,0x0474}/* 0475 */,/*705*/{0x0,0x0477,0x0}/* 0476 */, /*706*/{0x0476,0x0,0x0476}/* 0477 */,/*707*/{0x0,0x0479,0x0}/* 0478 */,/*708*/{0x0478,0x0,0x0478}/* 0479 */, /*709*/{0x0,0x047B,0x0}/* 047A */,/*710*/{0x047A,0x0,0x047A}/* 047B */,/*711*/{0x0,0x047D,0x0}/* 047C */, /*712*/{0x047C,0x0,0x047C}/* 047D */,/*713*/{0x0,0x047F,0x0}/* 047E */,/*714*/{0x047E,0x0,0x047E}/* 047F */, /*715*/{0x0,0x0481,0x0}/* 0480 */,/*716*/{0x0480,0x0,0x0480}/* 0481 */,/*717*/{0x0,0x048B,0x0}/* 048A */, /*718*/{0x048A,0x0,0x048A}/* 048B */,/*719*/{0x0,0x048D,0x0}/* 048C */,/*720*/{0x048C,0x0,0x048C}/* 048D */, /*721*/{0x0,0x048F,0x0}/* 048E */,/*722*/{0x048E,0x0,0x048E}/* 048F */,/*723*/{0x0,0x0491,0x0}/* 0490 */, /*724*/{0x0490,0x0,0x0490}/* 0491 */,/*725*/{0x0,0x0493,0x0}/* 0492 */,/*726*/{0x0492,0x0,0x0492}/* 0493 */, /*727*/{0x0,0x0495,0x0}/* 0494 */,/*728*/{0x0494,0x0,0x0494}/* 0495 */,/*729*/{0x0,0x0497,0x0}/* 0496 */, /*730*/{0x0496,0x0,0x0496}/* 0497 */,/*731*/{0x0,0x0499,0x0}/* 0498 */,/*732*/{0x0498,0x0,0x0498}/* 0499 */, /*733*/{0x0,0x049B,0x0}/* 049A */,/*734*/{0x049A,0x0,0x049A}/* 049B */,/*735*/{0x0,0x049D,0x0}/* 049C */, /*736*/{0x049C,0x0,0x049C}/* 049D */,/*737*/{0x0,0x049F,0x0}/* 049E */,/*738*/{0x049E,0x0,0x049E}/* 049F */, /*739*/{0x0,0x04A1,0x0}/* 04A0 */,/*740*/{0x04A0,0x0,0x04A0}/* 04A1 */,/*741*/{0x0,0x04A3,0x0}/* 04A2 */, /*742*/{0x04A2,0x0,0x04A2}/* 04A3 */,/*743*/{0x0,0x04A5,0x0}/* 04A4 */,/*744*/{0x04A4,0x0,0x04A4}/* 04A5 */, /*745*/{0x0,0x04A7,0x0}/* 04A6 */,/*746*/{0x04A6,0x0,0x04A6}/* 04A7 */,/*747*/{0x0,0x04A9,0x0}/* 04A8 */, /*748*/{0x04A8,0x0,0x04A8}/* 04A9 */,/*749*/{0x0,0x04AB,0x0}/* 04AA */,/*750*/{0x04AA,0x0,0x04AA}/* 04AB */, /*751*/{0x0,0x04AD,0x0}/* 04AC */,/*752*/{0x04AC,0x0,0x04AC}/* 04AD */,/*753*/{0x0,0x04AF,0x0}/* 04AE */, /*754*/{0x04AE,0x0,0x04AE}/* 04AF */,/*755*/{0x0,0x04B1,0x0}/* 04B0 */,/*756*/{0x04B0,0x0,0x04B0}/* 04B1 */, /*757*/{0x0,0x04B3,0x0}/* 04B2 */,/*758*/{0x04B2,0x0,0x04B2}/* 04B3 */,/*759*/{0x0,0x04B5,0x0}/* 04B4 */, /*760*/{0x04B4,0x0,0x04B4}/* 04B5 */,/*761*/{0x0,0x04B7,0x0}/* 04B6 */,/*762*/{0x04B6,0x0,0x04B6}/* 04B7 */, /*763*/{0x0,0x04B9,0x0}/* 04B8 */,/*764*/{0x04B8,0x0,0x04B8}/* 04B9 */,/*765*/{0x0,0x04BB,0x0}/* 04BA */, /*766*/{0x04BA,0x0,0x04BA}/* 04BB */,/*767*/{0x0,0x04BD,0x0}/* 04BC */,/*768*/{0x04BC,0x0,0x04BC}/* 04BD */, /*769*/{0x0,0x04BF,0x0}/* 04BE */,/*770*/{0x04BE,0x0,0x04BE}/* 04BF */,/*771*/{0x0,0x04CF,0x0}/* 04C0 */, /*772*/{0x0,0x04C2,0x0}/* 04C1 */,/*773*/{0x04C1,0x0,0x04C1}/* 04C2 */,/*774*/{0x0,0x04C4,0x0}/* 04C3 */, /*775*/{0x04C3,0x0,0x04C3}/* 04C4 */,/*776*/{0x0,0x04C6,0x0}/* 04C5 */,/*777*/{0x04C5,0x0,0x04C5}/* 04C6 */, /*778*/{0x0,0x04C8,0x0}/* 04C7 */,/*779*/{0x04C7,0x0,0x04C7}/* 04C8 */,/*780*/{0x0,0x04CA,0x0}/* 04C9 */, /*781*/{0x04C9,0x0,0x04C9}/* 04CA */,/*782*/{0x0,0x04CC,0x0}/* 04CB */,/*783*/{0x04CB,0x0,0x04CB}/* 04CC */, /*784*/{0x0,0x04CE,0x0}/* 04CD */,/*785*/{0x04CD,0x0,0x04CD}/* 04CE */,/*786*/{0x04C0,0x0,0x04C0}/* 04CF */, /*787*/{0x0,0x04D1,0x0}/* 04D0 */,/*788*/{0x04D0,0x0,0x04D0}/* 04D1 */,/*789*/{0x0,0x04D3,0x0}/* 04D2 */, /*790*/{0x04D2,0x0,0x04D2}/* 04D3 */,/*791*/{0x0,0x04D5,0x0}/* 04D4 */,/*792*/{0x04D4,0x0,0x04D4}/* 04D5 */, /*793*/{0x0,0x04D7,0x0}/* 04D6 */,/*794*/{0x04D6,0x0,0x04D6}/* 04D7 */,/*795*/{0x0,0x04D9,0x0}/* 04D8 */, /*796*/{0x04D8,0x0,0x04D8}/* 04D9 */,/*797*/{0x0,0x04DB,0x0}/* 04DA */,/*798*/{0x04DA,0x0,0x04DA}/* 04DB */, /*799*/{0x0,0x04DD,0x0}/* 04DC */,/*800*/{0x04DC,0x0,0x04DC}/* 04DD */,/*801*/{0x0,0x04DF,0x0}/* 04DE */, /*802*/{0x04DE,0x0,0x04DE}/* 04DF */,/*803*/{0x0,0x04E1,0x0}/* 04E0 */,/*804*/{0x04E0,0x0,0x04E0}/* 04E1 */, /*805*/{0x0,0x04E3,0x0}/* 04E2 */,/*806*/{0x04E2,0x0,0x04E2}/* 04E3 */,/*807*/{0x0,0x04E5,0x0}/* 04E4 */, /*808*/{0x04E4,0x0,0x04E4}/* 04E5 */,/*809*/{0x0,0x04E7,0x0}/* 04E6 */,/*810*/{0x04E6,0x0,0x04E6}/* 04E7 */, /*811*/{0x0,0x04E9,0x0}/* 04E8 */,/*812*/{0x04E8,0x0,0x04E8}/* 04E9 */,/*813*/{0x0,0x04EB,0x0}/* 04EA */, /*814*/{0x04EA,0x0,0x04EA}/* 04EB */,/*815*/{0x0,0x04ED,0x0}/* 04EC */,/*816*/{0x04EC,0x0,0x04EC}/* 04ED */, /*817*/{0x0,0x04EF,0x0}/* 04EE */,/*818*/{0x04EE,0x0,0x04EE}/* 04EF */,/*819*/{0x0,0x04F1,0x0}/* 04F0 */, /*820*/{0x04F0,0x0,0x04F0}/* 04F1 */,/*821*/{0x0,0x04F3,0x0}/* 04F2 */,/*822*/{0x04F2,0x0,0x04F2}/* 04F3 */, /*823*/{0x0,0x04F5,0x0}/* 04F4 */,/*824*/{0x04F4,0x0,0x04F4}/* 04F5 */,/*825*/{0x0,0x04F7,0x0}/* 04F6 */, /*826*/{0x04F6,0x0,0x04F6}/* 04F7 */,/*827*/{0x0,0x04F9,0x0}/* 04F8 */,/*828*/{0x04F8,0x0,0x04F8}/* 04F9 */, /*829*/{0x0,0x04FB,0x0}/* 04FA */,/*830*/{0x04FA,0x0,0x04FA}/* 04FB */,/*831*/{0x0,0x04FD,0x0}/* 04FC */, /*832*/{0x04FC,0x0,0x04FC}/* 04FD */,/*833*/{0x0,0x04FF,0x0}/* 04FE */,/*834*/{0x04FE,0x0,0x04FE}/* 04FF */, /*835*/{0x0,0x0501,0x0}/* 0500 */,/*836*/{0x0500,0x0,0x0500}/* 0501 */,/*837*/{0x0,0x0503,0x0}/* 0502 */, /*838*/{0x0502,0x0,0x0502}/* 0503 */,/*839*/{0x0,0x0505,0x0}/* 0504 */,/*840*/{0x0504,0x0,0x0504}/* 0505 */, /*841*/{0x0,0x0507,0x0}/* 0506 */,/*842*/{0x0506,0x0,0x0506}/* 0507 */,/*843*/{0x0,0x0509,0x0}/* 0508 */, /*844*/{0x0508,0x0,0x0508}/* 0509 */,/*845*/{0x0,0x050B,0x0}/* 050A */,/*846*/{0x050A,0x0,0x050A}/* 050B */, /*847*/{0x0,0x050D,0x0}/* 050C */,/*848*/{0x050C,0x0,0x050C}/* 050D */,/*849*/{0x0,0x050F,0x0}/* 050E */, /*850*/{0x050E,0x0,0x050E}/* 050F */,/*851*/{0x0,0x0511,0x0}/* 0510 */,/*852*/{0x0510,0x0,0x0510}/* 0511 */, /*853*/{0x0,0x0513,0x0}/* 0512 */,/*854*/{0x0512,0x0,0x0512}/* 0513 */,/*855*/{0x0,0x0515,0x0}/* 0514 */, /*856*/{0x0514,0x0,0x0514}/* 0515 */,/*857*/{0x0,0x0517,0x0}/* 0516 */,/*858*/{0x0516,0x0,0x0516}/* 0517 */, /*859*/{0x0,0x0519,0x0}/* 0518 */,/*860*/{0x0518,0x0,0x0518}/* 0519 */,/*861*/{0x0,0x051B,0x0}/* 051A */, /*862*/{0x051A,0x0,0x051A}/* 051B */,/*863*/{0x0,0x051D,0x0}/* 051C */,/*864*/{0x051C,0x0,0x051C}/* 051D */, /*865*/{0x0,0x051F,0x0}/* 051E */,/*866*/{0x051E,0x0,0x051E}/* 051F */,/*867*/{0x0,0x0521,0x0}/* 0520 */, /*868*/{0x0520,0x0,0x0520}/* 0521 */,/*869*/{0x0,0x0523,0x0}/* 0522 */,/*870*/{0x0522,0x0,0x0522}/* 0523 */, /*871*/{0x0,0x0525,0x0}/* 0524 */,/*872*/{0x0524,0x0,0x0524}/* 0525 */,/*873*/{0x0,0x0527,0x0}/* 0526 */, /*874*/{0x0526,0x0,0x0526}/* 0527 */,/*875*/{0x0,0x0529,0x0}/* 0528 */,/*876*/{0x0528,0x0,0x0528}/* 0529 */, /*877*/{0x0,0x052B,0x0}/* 052A */,/*878*/{0x052A,0x0,0x052A}/* 052B */,/*879*/{0x0,0x052D,0x0}/* 052C */, /*880*/{0x052C,0x0,0x052C}/* 052D */,/*881*/{0x0,0x052F,0x0}/* 052E */,/*882*/{0x052E,0x0,0x052E}/* 052F */, /*883*/{0x0,0x0561,0x0}/* 0531 */,/*884*/{0x0,0x0562,0x0}/* 0532 */,/*885*/{0x0,0x0563,0x0}/* 0533 */, /*886*/{0x0,0x0564,0x0}/* 0534 */,/*887*/{0x0,0x0565,0x0}/* 0535 */,/*888*/{0x0,0x0566,0x0}/* 0536 */, /*889*/{0x0,0x0567,0x0}/* 0537 */,/*890*/{0x0,0x0568,0x0}/* 0538 */,/*891*/{0x0,0x0569,0x0}/* 0539 */, /*892*/{0x0,0x056A,0x0}/* 053A */,/*893*/{0x0,0x056B,0x0}/* 053B */,/*894*/{0x0,0x056C,0x0}/* 053C */, /*895*/{0x0,0x056D,0x0}/* 053D */,/*896*/{0x0,0x056E,0x0}/* 053E */,/*897*/{0x0,0x056F,0x0}/* 053F */, /*898*/{0x0,0x0570,0x0}/* 0540 */,/*899*/{0x0,0x0571,0x0}/* 0541 */,/*900*/{0x0,0x0572,0x0}/* 0542 */, /*901*/{0x0,0x0573,0x0}/* 0543 */,/*902*/{0x0,0x0574,0x0}/* 0544 */,/*903*/{0x0,0x0575,0x0}/* 0545 */, /*904*/{0x0,0x0576,0x0}/* 0546 */,/*905*/{0x0,0x0577,0x0}/* 0547 */,/*906*/{0x0,0x0578,0x0}/* 0548 */, /*907*/{0x0,0x0579,0x0}/* 0549 */,/*908*/{0x0,0x057A,0x0}/* 054A */,/*909*/{0x0,0x057B,0x0}/* 054B */, /*910*/{0x0,0x057C,0x0}/* 054C */,/*911*/{0x0,0x057D,0x0}/* 054D */,/*912*/{0x0,0x057E,0x0}/* 054E */, /*913*/{0x0,0x057F,0x0}/* 054F */,/*914*/{0x0,0x0580,0x0}/* 0550 */,/*915*/{0x0,0x0581,0x0}/* 0551 */, /*916*/{0x0,0x0582,0x0}/* 0552 */,/*917*/{0x0,0x0583,0x0}/* 0553 */,/*918*/{0x0,0x0584,0x0}/* 0554 */, /*919*/{0x0,0x0585,0x0}/* 0555 */,/*920*/{0x0,0x0586,0x0}/* 0556 */,/*921*/{0x0531,0x0,0x0531}/* 0561 */, /*922*/{0x0532,0x0,0x0532}/* 0562 */,/*923*/{0x0533,0x0,0x0533}/* 0563 */,/*924*/{0x0534,0x0,0x0534}/* 0564 */, /*925*/{0x0535,0x0,0x0535}/* 0565 */,/*926*/{0x0536,0x0,0x0536}/* 0566 */,/*927*/{0x0537,0x0,0x0537}/* 0567 */, /*928*/{0x0538,0x0,0x0538}/* 0568 */,/*929*/{0x0539,0x0,0x0539}/* 0569 */,/*930*/{0x053A,0x0,0x053A}/* 056A */, /*931*/{0x053B,0x0,0x053B}/* 056B */,/*932*/{0x053C,0x0,0x053C}/* 056C */,/*933*/{0x053D,0x0,0x053D}/* 056D */, /*934*/{0x053E,0x0,0x053E}/* 056E */,/*935*/{0x053F,0x0,0x053F}/* 056F */,/*936*/{0x0540,0x0,0x0540}/* 0570 */, /*937*/{0x0541,0x0,0x0541}/* 0571 */,/*938*/{0x0542,0x0,0x0542}/* 0572 */,/*939*/{0x0543,0x0,0x0543}/* 0573 */, /*940*/{0x0544,0x0,0x0544}/* 0574 */,/*941*/{0x0545,0x0,0x0545}/* 0575 */,/*942*/{0x0546,0x0,0x0546}/* 0576 */, /*943*/{0x0547,0x0,0x0547}/* 0577 */,/*944*/{0x0548,0x0,0x0548}/* 0578 */,/*945*/{0x0549,0x0,0x0549}/* 0579 */, /*946*/{0x054A,0x0,0x054A}/* 057A */,/*947*/{0x054B,0x0,0x054B}/* 057B */,/*948*/{0x054C,0x0,0x054C}/* 057C */, /*949*/{0x054D,0x0,0x054D}/* 057D */,/*950*/{0x054E,0x0,0x054E}/* 057E */,/*951*/{0x054F,0x0,0x054F}/* 057F */, /*952*/{0x0550,0x0,0x0550}/* 0580 */,/*953*/{0x0551,0x0,0x0551}/* 0581 */,/*954*/{0x0552,0x0,0x0552}/* 0582 */, /*955*/{0x0553,0x0,0x0553}/* 0583 */,/*956*/{0x0554,0x0,0x0554}/* 0584 */,/*957*/{0x0555,0x0,0x0555}/* 0585 */, /*958*/{0x0556,0x0,0x0556}/* 0586 */,/*959*/{0x0,0x2D00,0x0}/* 10A0 */,/*960*/{0x0,0x2D01,0x0}/* 10A1 */, /*961*/{0x0,0x2D02,0x0}/* 10A2 */,/*962*/{0x0,0x2D03,0x0}/* 10A3 */,/*963*/{0x0,0x2D04,0x0}/* 10A4 */, /*964*/{0x0,0x2D05,0x0}/* 10A5 */,/*965*/{0x0,0x2D06,0x0}/* 10A6 */,/*966*/{0x0,0x2D07,0x0}/* 10A7 */, /*967*/{0x0,0x2D08,0x0}/* 10A8 */,/*968*/{0x0,0x2D09,0x0}/* 10A9 */,/*969*/{0x0,0x2D0A,0x0}/* 10AA */, /*970*/{0x0,0x2D0B,0x0}/* 10AB */,/*971*/{0x0,0x2D0C,0x0}/* 10AC */,/*972*/{0x0,0x2D0D,0x0}/* 10AD */, /*973*/{0x0,0x2D0E,0x0}/* 10AE */,/*974*/{0x0,0x2D0F,0x0}/* 10AF */,/*975*/{0x0,0x2D10,0x0}/* 10B0 */, /*976*/{0x0,0x2D11,0x0}/* 10B1 */,/*977*/{0x0,0x2D12,0x0}/* 10B2 */,/*978*/{0x0,0x2D13,0x0}/* 10B3 */, /*979*/{0x0,0x2D14,0x0}/* 10B4 */,/*980*/{0x0,0x2D15,0x0}/* 10B5 */,/*981*/{0x0,0x2D16,0x0}/* 10B6 */, /*982*/{0x0,0x2D17,0x0}/* 10B7 */,/*983*/{0x0,0x2D18,0x0}/* 10B8 */,/*984*/{0x0,0x2D19,0x0}/* 10B9 */, /*985*/{0x0,0x2D1A,0x0}/* 10BA */,/*986*/{0x0,0x2D1B,0x0}/* 10BB */,/*987*/{0x0,0x2D1C,0x0}/* 10BC */, /*988*/{0x0,0x2D1D,0x0}/* 10BD */,/*989*/{0x0,0x2D1E,0x0}/* 10BE */,/*990*/{0x0,0x2D1F,0x0}/* 10BF */, /*991*/{0x0,0x2D20,0x0}/* 10C0 */,/*992*/{0x0,0x2D21,0x0}/* 10C1 */,/*993*/{0x0,0x2D22,0x0}/* 10C2 */, /*994*/{0x0,0x2D23,0x0}/* 10C3 */,/*995*/{0x0,0x2D24,0x0}/* 10C4 */,/*996*/{0x0,0x2D25,0x0}/* 10C5 */, /*997*/{0x0,0x2D27,0x0}/* 10C7 */,/*998*/{0x0,0x2D2D,0x0}/* 10CD */,/*999*/{0x0,0xAB70,0x0}/* 13A0 */, /*1000*/{0x0,0xAB71,0x0}/* 13A1 */,/*1001*/{0x0,0xAB72,0x0}/* 13A2 */,/*1002*/{0x0,0xAB73,0x0}/* 13A3 */, /*1003*/{0x0,0xAB74,0x0}/* 13A4 */,/*1004*/{0x0,0xAB75,0x0}/* 13A5 */,/*1005*/{0x0,0xAB76,0x0}/* 13A6 */, /*1006*/{0x0,0xAB77,0x0}/* 13A7 */,/*1007*/{0x0,0xAB78,0x0}/* 13A8 */,/*1008*/{0x0,0xAB79,0x0}/* 13A9 */, /*1009*/{0x0,0xAB7A,0x0}/* 13AA */,/*1010*/{0x0,0xAB7B,0x0}/* 13AB */,/*1011*/{0x0,0xAB7C,0x0}/* 13AC */, /*1012*/{0x0,0xAB7D,0x0}/* 13AD */,/*1013*/{0x0,0xAB7E,0x0}/* 13AE */,/*1014*/{0x0,0xAB7F,0x0}/* 13AF */, /*1015*/{0x0,0xAB80,0x0}/* 13B0 */,/*1016*/{0x0,0xAB81,0x0}/* 13B1 */,/*1017*/{0x0,0xAB82,0x0}/* 13B2 */, /*1018*/{0x0,0xAB83,0x0}/* 13B3 */,/*1019*/{0x0,0xAB84,0x0}/* 13B4 */,/*1020*/{0x0,0xAB85,0x0}/* 13B5 */, /*1021*/{0x0,0xAB86,0x0}/* 13B6 */,/*1022*/{0x0,0xAB87,0x0}/* 13B7 */,/*1023*/{0x0,0xAB88,0x0}/* 13B8 */, /*1024*/{0x0,0xAB89,0x0}/* 13B9 */,/*1025*/{0x0,0xAB8A,0x0}/* 13BA */,/*1026*/{0x0,0xAB8B,0x0}/* 13BB */, /*1027*/{0x0,0xAB8C,0x0}/* 13BC */,/*1028*/{0x0,0xAB8D,0x0}/* 13BD */,/*1029*/{0x0,0xAB8E,0x0}/* 13BE */, /*1030*/{0x0,0xAB8F,0x0}/* 13BF */,/*1031*/{0x0,0xAB90,0x0}/* 13C0 */,/*1032*/{0x0,0xAB91,0x0}/* 13C1 */, /*1033*/{0x0,0xAB92,0x0}/* 13C2 */,/*1034*/{0x0,0xAB93,0x0}/* 13C3 */,/*1035*/{0x0,0xAB94,0x0}/* 13C4 */, /*1036*/{0x0,0xAB95,0x0}/* 13C5 */,/*1037*/{0x0,0xAB96,0x0}/* 13C6 */,/*1038*/{0x0,0xAB97,0x0}/* 13C7 */, /*1039*/{0x0,0xAB98,0x0}/* 13C8 */,/*1040*/{0x0,0xAB99,0x0}/* 13C9 */,/*1041*/{0x0,0xAB9A,0x0}/* 13CA */, /*1042*/{0x0,0xAB9B,0x0}/* 13CB */,/*1043*/{0x0,0xAB9C,0x0}/* 13CC */,/*1044*/{0x0,0xAB9D,0x0}/* 13CD */, /*1045*/{0x0,0xAB9E,0x0}/* 13CE */,/*1046*/{0x0,0xAB9F,0x0}/* 13CF */,/*1047*/{0x0,0xABA0,0x0}/* 13D0 */, /*1048*/{0x0,0xABA1,0x0}/* 13D1 */,/*1049*/{0x0,0xABA2,0x0}/* 13D2 */,/*1050*/{0x0,0xABA3,0x0}/* 13D3 */, /*1051*/{0x0,0xABA4,0x0}/* 13D4 */,/*1052*/{0x0,0xABA5,0x0}/* 13D5 */,/*1053*/{0x0,0xABA6,0x0}/* 13D6 */, /*1054*/{0x0,0xABA7,0x0}/* 13D7 */,/*1055*/{0x0,0xABA8,0x0}/* 13D8 */,/*1056*/{0x0,0xABA9,0x0}/* 13D9 */, /*1057*/{0x0,0xABAA,0x0}/* 13DA */,/*1058*/{0x0,0xABAB,0x0}/* 13DB */,/*1059*/{0x0,0xABAC,0x0}/* 13DC */, /*1060*/{0x0,0xABAD,0x0}/* 13DD */,/*1061*/{0x0,0xABAE,0x0}/* 13DE */,/*1062*/{0x0,0xABAF,0x0}/* 13DF */, /*1063*/{0x0,0xABB0,0x0}/* 13E0 */,/*1064*/{0x0,0xABB1,0x0}/* 13E1 */,/*1065*/{0x0,0xABB2,0x0}/* 13E2 */, /*1066*/{0x0,0xABB3,0x0}/* 13E3 */,/*1067*/{0x0,0xABB4,0x0}/* 13E4 */,/*1068*/{0x0,0xABB5,0x0}/* 13E5 */, /*1069*/{0x0,0xABB6,0x0}/* 13E6 */,/*1070*/{0x0,0xABB7,0x0}/* 13E7 */,/*1071*/{0x0,0xABB8,0x0}/* 13E8 */, /*1072*/{0x0,0xABB9,0x0}/* 13E9 */,/*1073*/{0x0,0xABBA,0x0}/* 13EA */,/*1074*/{0x0,0xABBB,0x0}/* 13EB */, /*1075*/{0x0,0xABBC,0x0}/* 13EC */,/*1076*/{0x0,0xABBD,0x0}/* 13ED */,/*1077*/{0x0,0xABBE,0x0}/* 13EE */, /*1078*/{0x0,0xABBF,0x0}/* 13EF */,/*1079*/{0x0,0x13F8,0x0}/* 13F0 */,/*1080*/{0x0,0x13F9,0x0}/* 13F1 */, /*1081*/{0x0,0x13FA,0x0}/* 13F2 */,/*1082*/{0x0,0x13FB,0x0}/* 13F3 */,/*1083*/{0x0,0x13FC,0x0}/* 13F4 */, /*1084*/{0x0,0x13FD,0x0}/* 13F5 */,/*1085*/{0x13F0,0x0,0x13F0}/* 13F8 */,/*1086*/{0x13F1,0x0,0x13F1}/* 13F9 */, /*1087*/{0x13F2,0x0,0x13F2}/* 13FA */,/*1088*/{0x13F3,0x0,0x13F3}/* 13FB */,/*1089*/{0x13F4,0x0,0x13F4}/* 13FC */, /*1090*/{0x13F5,0x0,0x13F5}/* 13FD */,/*1091*/{0xA77D,0x0,0xA77D}/* 1D79 */,/*1092*/{0x2C63,0x0,0x2C63}/* 1D7D */, /*1093*/{0x0,0x1E01,0x0}/* 1E00 */,/*1094*/{0x1E00,0x0,0x1E00}/* 1E01 */,/*1095*/{0x0,0x1E03,0x0}/* 1E02 */, /*1096*/{0x1E02,0x0,0x1E02}/* 1E03 */,/*1097*/{0x0,0x1E05,0x0}/* 1E04 */,/*1098*/{0x1E04,0x0,0x1E04}/* 1E05 */, /*1099*/{0x0,0x1E07,0x0}/* 1E06 */,/*1100*/{0x1E06,0x0,0x1E06}/* 1E07 */,/*1101*/{0x0,0x1E09,0x0}/* 1E08 */, /*1102*/{0x1E08,0x0,0x1E08}/* 1E09 */,/*1103*/{0x0,0x1E0B,0x0}/* 1E0A */,/*1104*/{0x1E0A,0x0,0x1E0A}/* 1E0B */, /*1105*/{0x0,0x1E0D,0x0}/* 1E0C */,/*1106*/{0x1E0C,0x0,0x1E0C}/* 1E0D */,/*1107*/{0x0,0x1E0F,0x0}/* 1E0E */, /*1108*/{0x1E0E,0x0,0x1E0E}/* 1E0F */,/*1109*/{0x0,0x1E11,0x0}/* 1E10 */,/*1110*/{0x1E10,0x0,0x1E10}/* 1E11 */, /*1111*/{0x0,0x1E13,0x0}/* 1E12 */,/*1112*/{0x1E12,0x0,0x1E12}/* 1E13 */,/*1113*/{0x0,0x1E15,0x0}/* 1E14 */, /*1114*/{0x1E14,0x0,0x1E14}/* 1E15 */,/*1115*/{0x0,0x1E17,0x0}/* 1E16 */,/*1116*/{0x1E16,0x0,0x1E16}/* 1E17 */, /*1117*/{0x0,0x1E19,0x0}/* 1E18 */,/*1118*/{0x1E18,0x0,0x1E18}/* 1E19 */,/*1119*/{0x0,0x1E1B,0x0}/* 1E1A */, /*1120*/{0x1E1A,0x0,0x1E1A}/* 1E1B */,/*1121*/{0x0,0x1E1D,0x0}/* 1E1C */,/*1122*/{0x1E1C,0x0,0x1E1C}/* 1E1D */, /*1123*/{0x0,0x1E1F,0x0}/* 1E1E */,/*1124*/{0x1E1E,0x0,0x1E1E}/* 1E1F */,/*1125*/{0x0,0x1E21,0x0}/* 1E20 */, /*1126*/{0x1E20,0x0,0x1E20}/* 1E21 */,/*1127*/{0x0,0x1E23,0x0}/* 1E22 */,/*1128*/{0x1E22,0x0,0x1E22}/* 1E23 */, /*1129*/{0x0,0x1E25,0x0}/* 1E24 */,/*1130*/{0x1E24,0x0,0x1E24}/* 1E25 */,/*1131*/{0x0,0x1E27,0x0}/* 1E26 */, /*1132*/{0x1E26,0x0,0x1E26}/* 1E27 */,/*1133*/{0x0,0x1E29,0x0}/* 1E28 */,/*1134*/{0x1E28,0x0,0x1E28}/* 1E29 */, /*1135*/{0x0,0x1E2B,0x0}/* 1E2A */,/*1136*/{0x1E2A,0x0,0x1E2A}/* 1E2B */,/*1137*/{0x0,0x1E2D,0x0}/* 1E2C */, /*1138*/{0x1E2C,0x0,0x1E2C}/* 1E2D */,/*1139*/{0x0,0x1E2F,0x0}/* 1E2E */,/*1140*/{0x1E2E,0x0,0x1E2E}/* 1E2F */, /*1141*/{0x0,0x1E31,0x0}/* 1E30 */,/*1142*/{0x1E30,0x0,0x1E30}/* 1E31 */,/*1143*/{0x0,0x1E33,0x0}/* 1E32 */, /*1144*/{0x1E32,0x0,0x1E32}/* 1E33 */,/*1145*/{0x0,0x1E35,0x0}/* 1E34 */,/*1146*/{0x1E34,0x0,0x1E34}/* 1E35 */, /*1147*/{0x0,0x1E37,0x0}/* 1E36 */,/*1148*/{0x1E36,0x0,0x1E36}/* 1E37 */,/*1149*/{0x0,0x1E39,0x0}/* 1E38 */, /*1150*/{0x1E38,0x0,0x1E38}/* 1E39 */,/*1151*/{0x0,0x1E3B,0x0}/* 1E3A */,/*1152*/{0x1E3A,0x0,0x1E3A}/* 1E3B */, /*1153*/{0x0,0x1E3D,0x0}/* 1E3C */,/*1154*/{0x1E3C,0x0,0x1E3C}/* 1E3D */,/*1155*/{0x0,0x1E3F,0x0}/* 1E3E */, /*1156*/{0x1E3E,0x0,0x1E3E}/* 1E3F */,/*1157*/{0x0,0x1E41,0x0}/* 1E40 */,/*1158*/{0x1E40,0x0,0x1E40}/* 1E41 */, /*1159*/{0x0,0x1E43,0x0}/* 1E42 */,/*1160*/{0x1E42,0x0,0x1E42}/* 1E43 */,/*1161*/{0x0,0x1E45,0x0}/* 1E44 */, /*1162*/{0x1E44,0x0,0x1E44}/* 1E45 */,/*1163*/{0x0,0x1E47,0x0}/* 1E46 */,/*1164*/{0x1E46,0x0,0x1E46}/* 1E47 */, /*1165*/{0x0,0x1E49,0x0}/* 1E48 */,/*1166*/{0x1E48,0x0,0x1E48}/* 1E49 */,/*1167*/{0x0,0x1E4B,0x0}/* 1E4A */, /*1168*/{0x1E4A,0x0,0x1E4A}/* 1E4B */,/*1169*/{0x0,0x1E4D,0x0}/* 1E4C */,/*1170*/{0x1E4C,0x0,0x1E4C}/* 1E4D */, /*1171*/{0x0,0x1E4F,0x0}/* 1E4E */,/*1172*/{0x1E4E,0x0,0x1E4E}/* 1E4F */,/*1173*/{0x0,0x1E51,0x0}/* 1E50 */, /*1174*/{0x1E50,0x0,0x1E50}/* 1E51 */,/*1175*/{0x0,0x1E53,0x0}/* 1E52 */,/*1176*/{0x1E52,0x0,0x1E52}/* 1E53 */, /*1177*/{0x0,0x1E55,0x0}/* 1E54 */,/*1178*/{0x1E54,0x0,0x1E54}/* 1E55 */,/*1179*/{0x0,0x1E57,0x0}/* 1E56 */, /*1180*/{0x1E56,0x0,0x1E56}/* 1E57 */,/*1181*/{0x0,0x1E59,0x0}/* 1E58 */,/*1182*/{0x1E58,0x0,0x1E58}/* 1E59 */, /*1183*/{0x0,0x1E5B,0x0}/* 1E5A */,/*1184*/{0x1E5A,0x0,0x1E5A}/* 1E5B */,/*1185*/{0x0,0x1E5D,0x0}/* 1E5C */, /*1186*/{0x1E5C,0x0,0x1E5C}/* 1E5D */,/*1187*/{0x0,0x1E5F,0x0}/* 1E5E */,/*1188*/{0x1E5E,0x0,0x1E5E}/* 1E5F */, /*1189*/{0x0,0x1E61,0x0}/* 1E60 */,/*1190*/{0x1E60,0x0,0x1E60}/* 1E61 */,/*1191*/{0x0,0x1E63,0x0}/* 1E62 */, /*1192*/{0x1E62,0x0,0x1E62}/* 1E63 */,/*1193*/{0x0,0x1E65,0x0}/* 1E64 */,/*1194*/{0x1E64,0x0,0x1E64}/* 1E65 */, /*1195*/{0x0,0x1E67,0x0}/* 1E66 */,/*1196*/{0x1E66,0x0,0x1E66}/* 1E67 */,/*1197*/{0x0,0x1E69,0x0}/* 1E68 */, /*1198*/{0x1E68,0x0,0x1E68}/* 1E69 */,/*1199*/{0x0,0x1E6B,0x0}/* 1E6A */,/*1200*/{0x1E6A,0x0,0x1E6A}/* 1E6B */, /*1201*/{0x0,0x1E6D,0x0}/* 1E6C */,/*1202*/{0x1E6C,0x0,0x1E6C}/* 1E6D */,/*1203*/{0x0,0x1E6F,0x0}/* 1E6E */, /*1204*/{0x1E6E,0x0,0x1E6E}/* 1E6F */,/*1205*/{0x0,0x1E71,0x0}/* 1E70 */,/*1206*/{0x1E70,0x0,0x1E70}/* 1E71 */, /*1207*/{0x0,0x1E73,0x0}/* 1E72 */,/*1208*/{0x1E72,0x0,0x1E72}/* 1E73 */,/*1209*/{0x0,0x1E75,0x0}/* 1E74 */, /*1210*/{0x1E74,0x0,0x1E74}/* 1E75 */,/*1211*/{0x0,0x1E77,0x0}/* 1E76 */,/*1212*/{0x1E76,0x0,0x1E76}/* 1E77 */, /*1213*/{0x0,0x1E79,0x0}/* 1E78 */,/*1214*/{0x1E78,0x0,0x1E78}/* 1E79 */,/*1215*/{0x0,0x1E7B,0x0}/* 1E7A */, /*1216*/{0x1E7A,0x0,0x1E7A}/* 1E7B */,/*1217*/{0x0,0x1E7D,0x0}/* 1E7C */,/*1218*/{0x1E7C,0x0,0x1E7C}/* 1E7D */, /*1219*/{0x0,0x1E7F,0x0}/* 1E7E */,/*1220*/{0x1E7E,0x0,0x1E7E}/* 1E7F */,/*1221*/{0x0,0x1E81,0x0}/* 1E80 */, /*1222*/{0x1E80,0x0,0x1E80}/* 1E81 */,/*1223*/{0x0,0x1E83,0x0}/* 1E82 */,/*1224*/{0x1E82,0x0,0x1E82}/* 1E83 */, /*1225*/{0x0,0x1E85,0x0}/* 1E84 */,/*1226*/{0x1E84,0x0,0x1E84}/* 1E85 */,/*1227*/{0x0,0x1E87,0x0}/* 1E86 */, /*1228*/{0x1E86,0x0,0x1E86}/* 1E87 */,/*1229*/{0x0,0x1E89,0x0}/* 1E88 */,/*1230*/{0x1E88,0x0,0x1E88}/* 1E89 */, /*1231*/{0x0,0x1E8B,0x0}/* 1E8A */,/*1232*/{0x1E8A,0x0,0x1E8A}/* 1E8B */,/*1233*/{0x0,0x1E8D,0x0}/* 1E8C */, /*1234*/{0x1E8C,0x0,0x1E8C}/* 1E8D */,/*1235*/{0x0,0x1E8F,0x0}/* 1E8E */,/*1236*/{0x1E8E,0x0,0x1E8E}/* 1E8F */, /*1237*/{0x0,0x1E91,0x0}/* 1E90 */,/*1238*/{0x1E90,0x0,0x1E90}/* 1E91 */,/*1239*/{0x0,0x1E93,0x0}/* 1E92 */, /*1240*/{0x1E92,0x0,0x1E92}/* 1E93 */,/*1241*/{0x0,0x1E95,0x0}/* 1E94 */,/*1242*/{0x1E94,0x0,0x1E94}/* 1E95 */, /*1243*/{0x1E60,0x0,0x1E60}/* 1E9B */,/*1244*/{0x0,0x00DF,0x0}/* 1E9E */,/*1245*/{0x0,0x1EA1,0x0}/* 1EA0 */, /*1246*/{0x1EA0,0x0,0x1EA0}/* 1EA1 */,/*1247*/{0x0,0x1EA3,0x0}/* 1EA2 */,/*1248*/{0x1EA2,0x0,0x1EA2}/* 1EA3 */, /*1249*/{0x0,0x1EA5,0x0}/* 1EA4 */,/*1250*/{0x1EA4,0x0,0x1EA4}/* 1EA5 */,/*1251*/{0x0,0x1EA7,0x0}/* 1EA6 */, /*1252*/{0x1EA6,0x0,0x1EA6}/* 1EA7 */,/*1253*/{0x0,0x1EA9,0x0}/* 1EA8 */,/*1254*/{0x1EA8,0x0,0x1EA8}/* 1EA9 */, /*1255*/{0x0,0x1EAB,0x0}/* 1EAA */,/*1256*/{0x1EAA,0x0,0x1EAA}/* 1EAB */,/*1257*/{0x0,0x1EAD,0x0}/* 1EAC */, /*1258*/{0x1EAC,0x0,0x1EAC}/* 1EAD */,/*1259*/{0x0,0x1EAF,0x0}/* 1EAE */,/*1260*/{0x1EAE,0x0,0x1EAE}/* 1EAF */, /*1261*/{0x0,0x1EB1,0x0}/* 1EB0 */,/*1262*/{0x1EB0,0x0,0x1EB0}/* 1EB1 */,/*1263*/{0x0,0x1EB3,0x0}/* 1EB2 */, /*1264*/{0x1EB2,0x0,0x1EB2}/* 1EB3 */,/*1265*/{0x0,0x1EB5,0x0}/* 1EB4 */,/*1266*/{0x1EB4,0x0,0x1EB4}/* 1EB5 */, /*1267*/{0x0,0x1EB7,0x0}/* 1EB6 */,/*1268*/{0x1EB6,0x0,0x1EB6}/* 1EB7 */,/*1269*/{0x0,0x1EB9,0x0}/* 1EB8 */, /*1270*/{0x1EB8,0x0,0x1EB8}/* 1EB9 */,/*1271*/{0x0,0x1EBB,0x0}/* 1EBA */,/*1272*/{0x1EBA,0x0,0x1EBA}/* 1EBB */, /*1273*/{0x0,0x1EBD,0x0}/* 1EBC */,/*1274*/{0x1EBC,0x0,0x1EBC}/* 1EBD */,/*1275*/{0x0,0x1EBF,0x0}/* 1EBE */, /*1276*/{0x1EBE,0x0,0x1EBE}/* 1EBF */,/*1277*/{0x0,0x1EC1,0x0}/* 1EC0 */,/*1278*/{0x1EC0,0x0,0x1EC0}/* 1EC1 */, /*1279*/{0x0,0x1EC3,0x0}/* 1EC2 */,/*1280*/{0x1EC2,0x0,0x1EC2}/* 1EC3 */,/*1281*/{0x0,0x1EC5,0x0}/* 1EC4 */, /*1282*/{0x1EC4,0x0,0x1EC4}/* 1EC5 */,/*1283*/{0x0,0x1EC7,0x0}/* 1EC6 */,/*1284*/{0x1EC6,0x0,0x1EC6}/* 1EC7 */, /*1285*/{0x0,0x1EC9,0x0}/* 1EC8 */,/*1286*/{0x1EC8,0x0,0x1EC8}/* 1EC9 */,/*1287*/{0x0,0x1ECB,0x0}/* 1ECA */, /*1288*/{0x1ECA,0x0,0x1ECA}/* 1ECB */,/*1289*/{0x0,0x1ECD,0x0}/* 1ECC */,/*1290*/{0x1ECC,0x0,0x1ECC}/* 1ECD */, /*1291*/{0x0,0x1ECF,0x0}/* 1ECE */,/*1292*/{0x1ECE,0x0,0x1ECE}/* 1ECF */,/*1293*/{0x0,0x1ED1,0x0}/* 1ED0 */, /*1294*/{0x1ED0,0x0,0x1ED0}/* 1ED1 */,/*1295*/{0x0,0x1ED3,0x0}/* 1ED2 */,/*1296*/{0x1ED2,0x0,0x1ED2}/* 1ED3 */, /*1297*/{0x0,0x1ED5,0x0}/* 1ED4 */,/*1298*/{0x1ED4,0x0,0x1ED4}/* 1ED5 */,/*1299*/{0x0,0x1ED7,0x0}/* 1ED6 */, /*1300*/{0x1ED6,0x0,0x1ED6}/* 1ED7 */,/*1301*/{0x0,0x1ED9,0x0}/* 1ED8 */,/*1302*/{0x1ED8,0x0,0x1ED8}/* 1ED9 */, /*1303*/{0x0,0x1EDB,0x0}/* 1EDA */,/*1304*/{0x1EDA,0x0,0x1EDA}/* 1EDB */,/*1305*/{0x0,0x1EDD,0x0}/* 1EDC */, /*1306*/{0x1EDC,0x0,0x1EDC}/* 1EDD */,/*1307*/{0x0,0x1EDF,0x0}/* 1EDE */,/*1308*/{0x1EDE,0x0,0x1EDE}/* 1EDF */, /*1309*/{0x0,0x1EE1,0x0}/* 1EE0 */,/*1310*/{0x1EE0,0x0,0x1EE0}/* 1EE1 */,/*1311*/{0x0,0x1EE3,0x0}/* 1EE2 */, /*1312*/{0x1EE2,0x0,0x1EE2}/* 1EE3 */,/*1313*/{0x0,0x1EE5,0x0}/* 1EE4 */,/*1314*/{0x1EE4,0x0,0x1EE4}/* 1EE5 */, /*1315*/{0x0,0x1EE7,0x0}/* 1EE6 */,/*1316*/{0x1EE6,0x0,0x1EE6}/* 1EE7 */,/*1317*/{0x0,0x1EE9,0x0}/* 1EE8 */, /*1318*/{0x1EE8,0x0,0x1EE8}/* 1EE9 */,/*1319*/{0x0,0x1EEB,0x0}/* 1EEA */,/*1320*/{0x1EEA,0x0,0x1EEA}/* 1EEB */, /*1321*/{0x0,0x1EED,0x0}/* 1EEC */,/*1322*/{0x1EEC,0x0,0x1EEC}/* 1EED */,/*1323*/{0x0,0x1EEF,0x0}/* 1EEE */, /*1324*/{0x1EEE,0x0,0x1EEE}/* 1EEF */,/*1325*/{0x0,0x1EF1,0x0}/* 1EF0 */,/*1326*/{0x1EF0,0x0,0x1EF0}/* 1EF1 */, /*1327*/{0x0,0x1EF3,0x0}/* 1EF2 */,/*1328*/{0x1EF2,0x0,0x1EF2}/* 1EF3 */,/*1329*/{0x0,0x1EF5,0x0}/* 1EF4 */, /*1330*/{0x1EF4,0x0,0x1EF4}/* 1EF5 */,/*1331*/{0x0,0x1EF7,0x0}/* 1EF6 */,/*1332*/{0x1EF6,0x0,0x1EF6}/* 1EF7 */, /*1333*/{0x0,0x1EF9,0x0}/* 1EF8 */,/*1334*/{0x1EF8,0x0,0x1EF8}/* 1EF9 */,/*1335*/{0x0,0x1EFB,0x0}/* 1EFA */, /*1336*/{0x1EFA,0x0,0x1EFA}/* 1EFB */,/*1337*/{0x0,0x1EFD,0x0}/* 1EFC */,/*1338*/{0x1EFC,0x0,0x1EFC}/* 1EFD */, /*1339*/{0x0,0x1EFF,0x0}/* 1EFE */,/*1340*/{0x1EFE,0x0,0x1EFE}/* 1EFF */,/*1341*/{0x1F08,0x0,0x1F08}/* 1F00 */, /*1342*/{0x1F09,0x0,0x1F09}/* 1F01 */,/*1343*/{0x1F0A,0x0,0x1F0A}/* 1F02 */,/*1344*/{0x1F0B,0x0,0x1F0B}/* 1F03 */, /*1345*/{0x1F0C,0x0,0x1F0C}/* 1F04 */,/*1346*/{0x1F0D,0x0,0x1F0D}/* 1F05 */,/*1347*/{0x1F0E,0x0,0x1F0E}/* 1F06 */, /*1348*/{0x1F0F,0x0,0x1F0F}/* 1F07 */,/*1349*/{0x0,0x1F00,0x0}/* 1F08 */,/*1350*/{0x0,0x1F01,0x0}/* 1F09 */, /*1351*/{0x0,0x1F02,0x0}/* 1F0A */,/*1352*/{0x0,0x1F03,0x0}/* 1F0B */,/*1353*/{0x0,0x1F04,0x0}/* 1F0C */, /*1354*/{0x0,0x1F05,0x0}/* 1F0D */,/*1355*/{0x0,0x1F06,0x0}/* 1F0E */,/*1356*/{0x0,0x1F07,0x0}/* 1F0F */, /*1357*/{0x1F18,0x0,0x1F18}/* 1F10 */,/*1358*/{0x1F19,0x0,0x1F19}/* 1F11 */,/*1359*/{0x1F1A,0x0,0x1F1A}/* 1F12 */, /*1360*/{0x1F1B,0x0,0x1F1B}/* 1F13 */,/*1361*/{0x1F1C,0x0,0x1F1C}/* 1F14 */,/*1362*/{0x1F1D,0x0,0x1F1D}/* 1F15 */, /*1363*/{0x0,0x1F10,0x0}/* 1F18 */,/*1364*/{0x0,0x1F11,0x0}/* 1F19 */,/*1365*/{0x0,0x1F12,0x0}/* 1F1A */, /*1366*/{0x0,0x1F13,0x0}/* 1F1B */,/*1367*/{0x0,0x1F14,0x0}/* 1F1C */,/*1368*/{0x0,0x1F15,0x0}/* 1F1D */, /*1369*/{0x1F28,0x0,0x1F28}/* 1F20 */,/*1370*/{0x1F29,0x0,0x1F29}/* 1F21 */,/*1371*/{0x1F2A,0x0,0x1F2A}/* 1F22 */, /*1372*/{0x1F2B,0x0,0x1F2B}/* 1F23 */,/*1373*/{0x1F2C,0x0,0x1F2C}/* 1F24 */,/*1374*/{0x1F2D,0x0,0x1F2D}/* 1F25 */, /*1375*/{0x1F2E,0x0,0x1F2E}/* 1F26 */,/*1376*/{0x1F2F,0x0,0x1F2F}/* 1F27 */,/*1377*/{0x0,0x1F20,0x0}/* 1F28 */, /*1378*/{0x0,0x1F21,0x0}/* 1F29 */,/*1379*/{0x0,0x1F22,0x0}/* 1F2A */,/*1380*/{0x0,0x1F23,0x0}/* 1F2B */, /*1381*/{0x0,0x1F24,0x0}/* 1F2C */,/*1382*/{0x0,0x1F25,0x0}/* 1F2D */,/*1383*/{0x0,0x1F26,0x0}/* 1F2E */, /*1384*/{0x0,0x1F27,0x0}/* 1F2F */,/*1385*/{0x1F38,0x0,0x1F38}/* 1F30 */,/*1386*/{0x1F39,0x0,0x1F39}/* 1F31 */, /*1387*/{0x1F3A,0x0,0x1F3A}/* 1F32 */,/*1388*/{0x1F3B,0x0,0x1F3B}/* 1F33 */,/*1389*/{0x1F3C,0x0,0x1F3C}/* 1F34 */, /*1390*/{0x1F3D,0x0,0x1F3D}/* 1F35 */,/*1391*/{0x1F3E,0x0,0x1F3E}/* 1F36 */,/*1392*/{0x1F3F,0x0,0x1F3F}/* 1F37 */, /*1393*/{0x0,0x1F30,0x0}/* 1F38 */,/*1394*/{0x0,0x1F31,0x0}/* 1F39 */,/*1395*/{0x0,0x1F32,0x0}/* 1F3A */, /*1396*/{0x0,0x1F33,0x0}/* 1F3B */,/*1397*/{0x0,0x1F34,0x0}/* 1F3C */,/*1398*/{0x0,0x1F35,0x0}/* 1F3D */, /*1399*/{0x0,0x1F36,0x0}/* 1F3E */,/*1400*/{0x0,0x1F37,0x0}/* 1F3F */,/*1401*/{0x1F48,0x0,0x1F48}/* 1F40 */, /*1402*/{0x1F49,0x0,0x1F49}/* 1F41 */,/*1403*/{0x1F4A,0x0,0x1F4A}/* 1F42 */,/*1404*/{0x1F4B,0x0,0x1F4B}/* 1F43 */, /*1405*/{0x1F4C,0x0,0x1F4C}/* 1F44 */,/*1406*/{0x1F4D,0x0,0x1F4D}/* 1F45 */,/*1407*/{0x0,0x1F40,0x0}/* 1F48 */, /*1408*/{0x0,0x1F41,0x0}/* 1F49 */,/*1409*/{0x0,0x1F42,0x0}/* 1F4A */,/*1410*/{0x0,0x1F43,0x0}/* 1F4B */, /*1411*/{0x0,0x1F44,0x0}/* 1F4C */,/*1412*/{0x0,0x1F45,0x0}/* 1F4D */,/*1413*/{0x1F59,0x0,0x1F59}/* 1F51 */, /*1414*/{0x1F5B,0x0,0x1F5B}/* 1F53 */,/*1415*/{0x1F5D,0x0,0x1F5D}/* 1F55 */,/*1416*/{0x1F5F,0x0,0x1F5F}/* 1F57 */, /*1417*/{0x0,0x1F51,0x0}/* 1F59 */,/*1418*/{0x0,0x1F53,0x0}/* 1F5B */,/*1419*/{0x0,0x1F55,0x0}/* 1F5D */, /*1420*/{0x0,0x1F57,0x0}/* 1F5F */,/*1421*/{0x1F68,0x0,0x1F68}/* 1F60 */,/*1422*/{0x1F69,0x0,0x1F69}/* 1F61 */, /*1423*/{0x1F6A,0x0,0x1F6A}/* 1F62 */,/*1424*/{0x1F6B,0x0,0x1F6B}/* 1F63 */,/*1425*/{0x1F6C,0x0,0x1F6C}/* 1F64 */, /*1426*/{0x1F6D,0x0,0x1F6D}/* 1F65 */,/*1427*/{0x1F6E,0x0,0x1F6E}/* 1F66 */,/*1428*/{0x1F6F,0x0,0x1F6F}/* 1F67 */, /*1429*/{0x0,0x1F60,0x0}/* 1F68 */,/*1430*/{0x0,0x1F61,0x0}/* 1F69 */,/*1431*/{0x0,0x1F62,0x0}/* 1F6A */, /*1432*/{0x0,0x1F63,0x0}/* 1F6B */,/*1433*/{0x0,0x1F64,0x0}/* 1F6C */,/*1434*/{0x0,0x1F65,0x0}/* 1F6D */, /*1435*/{0x0,0x1F66,0x0}/* 1F6E */,/*1436*/{0x0,0x1F67,0x0}/* 1F6F */,/*1437*/{0x1FBA,0x0,0x1FBA}/* 1F70 */, /*1438*/{0x1FBB,0x0,0x1FBB}/* 1F71 */,/*1439*/{0x1FC8,0x0,0x1FC8}/* 1F72 */,/*1440*/{0x1FC9,0x0,0x1FC9}/* 1F73 */, /*1441*/{0x1FCA,0x0,0x1FCA}/* 1F74 */,/*1442*/{0x1FCB,0x0,0x1FCB}/* 1F75 */,/*1443*/{0x1FDA,0x0,0x1FDA}/* 1F76 */, /*1444*/{0x1FDB,0x0,0x1FDB}/* 1F77 */,/*1445*/{0x1FF8,0x0,0x1FF8}/* 1F78 */,/*1446*/{0x1FF9,0x0,0x1FF9}/* 1F79 */, /*1447*/{0x1FEA,0x0,0x1FEA}/* 1F7A */,/*1448*/{0x1FEB,0x0,0x1FEB}/* 1F7B */,/*1449*/{0x1FFA,0x0,0x1FFA}/* 1F7C */, /*1450*/{0x1FFB,0x0,0x1FFB}/* 1F7D */,/*1451*/{0x1F88,0x0,0x1F88}/* 1F80 */,/*1452*/{0x1F89,0x0,0x1F89}/* 1F81 */, /*1453*/{0x1F8A,0x0,0x1F8A}/* 1F82 */,/*1454*/{0x1F8B,0x0,0x1F8B}/* 1F83 */,/*1455*/{0x1F8C,0x0,0x1F8C}/* 1F84 */, /*1456*/{0x1F8D,0x0,0x1F8D}/* 1F85 */,/*1457*/{0x1F8E,0x0,0x1F8E}/* 1F86 */,/*1458*/{0x1F8F,0x0,0x1F8F}/* 1F87 */, /*1459*/{0x0,0x1F80,0x0}/* 1F88 */,/*1460*/{0x0,0x1F81,0x0}/* 1F89 */,/*1461*/{0x0,0x1F82,0x0}/* 1F8A */, /*1462*/{0x0,0x1F83,0x0}/* 1F8B */,/*1463*/{0x0,0x1F84,0x0}/* 1F8C */,/*1464*/{0x0,0x1F85,0x0}/* 1F8D */, /*1465*/{0x0,0x1F86,0x0}/* 1F8E */,/*1466*/{0x0,0x1F87,0x0}/* 1F8F */,/*1467*/{0x1F98,0x0,0x1F98}/* 1F90 */, /*1468*/{0x1F99,0x0,0x1F99}/* 1F91 */,/*1469*/{0x1F9A,0x0,0x1F9A}/* 1F92 */,/*1470*/{0x1F9B,0x0,0x1F9B}/* 1F93 */, /*1471*/{0x1F9C,0x0,0x1F9C}/* 1F94 */,/*1472*/{0x1F9D,0x0,0x1F9D}/* 1F95 */,/*1473*/{0x1F9E,0x0,0x1F9E}/* 1F96 */, /*1474*/{0x1F9F,0x0,0x1F9F}/* 1F97 */,/*1475*/{0x0,0x1F90,0x0}/* 1F98 */,/*1476*/{0x0,0x1F91,0x0}/* 1F99 */, /*1477*/{0x0,0x1F92,0x0}/* 1F9A */,/*1478*/{0x0,0x1F93,0x0}/* 1F9B */,/*1479*/{0x0,0x1F94,0x0}/* 1F9C */, /*1480*/{0x0,0x1F95,0x0}/* 1F9D */,/*1481*/{0x0,0x1F96,0x0}/* 1F9E */,/*1482*/{0x0,0x1F97,0x0}/* 1F9F */, /*1483*/{0x1FA8,0x0,0x1FA8}/* 1FA0 */,/*1484*/{0x1FA9,0x0,0x1FA9}/* 1FA1 */,/*1485*/{0x1FAA,0x0,0x1FAA}/* 1FA2 */, /*1486*/{0x1FAB,0x0,0x1FAB}/* 1FA3 */,/*1487*/{0x1FAC,0x0,0x1FAC}/* 1FA4 */,/*1488*/{0x1FAD,0x0,0x1FAD}/* 1FA5 */, /*1489*/{0x1FAE,0x0,0x1FAE}/* 1FA6 */,/*1490*/{0x1FAF,0x0,0x1FAF}/* 1FA7 */,/*1491*/{0x0,0x1FA0,0x0}/* 1FA8 */, /*1492*/{0x0,0x1FA1,0x0}/* 1FA9 */,/*1493*/{0x0,0x1FA2,0x0}/* 1FAA */,/*1494*/{0x0,0x1FA3,0x0}/* 1FAB */, /*1495*/{0x0,0x1FA4,0x0}/* 1FAC */,/*1496*/{0x0,0x1FA5,0x0}/* 1FAD */,/*1497*/{0x0,0x1FA6,0x0}/* 1FAE */, /*1498*/{0x0,0x1FA7,0x0}/* 1FAF */,/*1499*/{0x1FB8,0x0,0x1FB8}/* 1FB0 */,/*1500*/{0x1FB9,0x0,0x1FB9}/* 1FB1 */, /*1501*/{0x1FBC,0x0,0x1FBC}/* 1FB3 */,/*1502*/{0x0,0x1FB0,0x0}/* 1FB8 */,/*1503*/{0x0,0x1FB1,0x0}/* 1FB9 */, /*1504*/{0x0,0x1F70,0x0}/* 1FBA */,/*1505*/{0x0,0x1F71,0x0}/* 1FBB */,/*1506*/{0x0,0x1FB3,0x0}/* 1FBC */, /*1507*/{0x0399,0x0,0x0399}/* 1FBE */,/*1508*/{0x1FCC,0x0,0x1FCC}/* 1FC3 */,/*1509*/{0x0,0x1F72,0x0}/* 1FC8 */, /*1510*/{0x0,0x1F73,0x0}/* 1FC9 */,/*1511*/{0x0,0x1F74,0x0}/* 1FCA */,/*1512*/{0x0,0x1F75,0x0}/* 1FCB */, /*1513*/{0x0,0x1FC3,0x0}/* 1FCC */,/*1514*/{0x1FD8,0x0,0x1FD8}/* 1FD0 */,/*1515*/{0x1FD9,0x0,0x1FD9}/* 1FD1 */, /*1516*/{0x0,0x1FD0,0x0}/* 1FD8 */,/*1517*/{0x0,0x1FD1,0x0}/* 1FD9 */,/*1518*/{0x0,0x1F76,0x0}/* 1FDA */, /*1519*/{0x0,0x1F77,0x0}/* 1FDB */,/*1520*/{0x1FE8,0x0,0x1FE8}/* 1FE0 */,/*1521*/{0x1FE9,0x0,0x1FE9}/* 1FE1 */, /*1522*/{0x1FEC,0x0,0x1FEC}/* 1FE5 */,/*1523*/{0x0,0x1FE0,0x0}/* 1FE8 */,/*1524*/{0x0,0x1FE1,0x0}/* 1FE9 */, /*1525*/{0x0,0x1F7A,0x0}/* 1FEA */,/*1526*/{0x0,0x1F7B,0x0}/* 1FEB */,/*1527*/{0x0,0x1FE5,0x0}/* 1FEC */, /*1528*/{0x1FFC,0x0,0x1FFC}/* 1FF3 */,/*1529*/{0x0,0x1F78,0x0}/* 1FF8 */,/*1530*/{0x0,0x1F79,0x0}/* 1FF9 */, /*1531*/{0x0,0x1F7C,0x0}/* 1FFA */,/*1532*/{0x0,0x1F7D,0x0}/* 1FFB */,/*1533*/{0x0,0x1FF3,0x0}/* 1FFC */, /*1534*/{0x0,0x03C9,0x0}/* 2126 */,/*1535*/{0x0,0x006B,0x0}/* 212A */,/*1536*/{0x0,0x00E5,0x0}/* 212B */, /*1537*/{0x0,0x214E,0x0}/* 2132 */,/*1538*/{0x2132,0x0,0x2132}/* 214E */,/*1539*/{0x0,0x2170,0x0}/* 2160 */, /*1540*/{0x0,0x2171,0x0}/* 2161 */,/*1541*/{0x0,0x2172,0x0}/* 2162 */,/*1542*/{0x0,0x2173,0x0}/* 2163 */, /*1543*/{0x0,0x2174,0x0}/* 2164 */,/*1544*/{0x0,0x2175,0x0}/* 2165 */,/*1545*/{0x0,0x2176,0x0}/* 2166 */, /*1546*/{0x0,0x2177,0x0}/* 2167 */,/*1547*/{0x0,0x2178,0x0}/* 2168 */,/*1548*/{0x0,0x2179,0x0}/* 2169 */, /*1549*/{0x0,0x217A,0x0}/* 216A */,/*1550*/{0x0,0x217B,0x0}/* 216B */,/*1551*/{0x0,0x217C,0x0}/* 216C */, /*1552*/{0x0,0x217D,0x0}/* 216D */,/*1553*/{0x0,0x217E,0x0}/* 216E */,/*1554*/{0x0,0x217F,0x0}/* 216F */, /*1555*/{0x2160,0x0,0x2160}/* 2170 */,/*1556*/{0x2161,0x0,0x2161}/* 2171 */,/*1557*/{0x2162,0x0,0x2162}/* 2172 */, /*1558*/{0x2163,0x0,0x2163}/* 2173 */,/*1559*/{0x2164,0x0,0x2164}/* 2174 */,/*1560*/{0x2165,0x0,0x2165}/* 2175 */, /*1561*/{0x2166,0x0,0x2166}/* 2176 */,/*1562*/{0x2167,0x0,0x2167}/* 2177 */,/*1563*/{0x2168,0x0,0x2168}/* 2178 */, /*1564*/{0x2169,0x0,0x2169}/* 2179 */,/*1565*/{0x216A,0x0,0x216A}/* 217A */,/*1566*/{0x216B,0x0,0x216B}/* 217B */, /*1567*/{0x216C,0x0,0x216C}/* 217C */,/*1568*/{0x216D,0x0,0x216D}/* 217D */,/*1569*/{0x216E,0x0,0x216E}/* 217E */, /*1570*/{0x216F,0x0,0x216F}/* 217F */,/*1571*/{0x0,0x2184,0x0}/* 2183 */,/*1572*/{0x2183,0x0,0x2183}/* 2184 */, /*1573*/{0x0,0x24D0,0x0}/* 24B6 */,/*1574*/{0x0,0x24D1,0x0}/* 24B7 */,/*1575*/{0x0,0x24D2,0x0}/* 24B8 */, /*1576*/{0x0,0x24D3,0x0}/* 24B9 */,/*1577*/{0x0,0x24D4,0x0}/* 24BA */,/*1578*/{0x0,0x24D5,0x0}/* 24BB */, /*1579*/{0x0,0x24D6,0x0}/* 24BC */,/*1580*/{0x0,0x24D7,0x0}/* 24BD */,/*1581*/{0x0,0x24D8,0x0}/* 24BE */, /*1582*/{0x0,0x24D9,0x0}/* 24BF */,/*1583*/{0x0,0x24DA,0x0}/* 24C0 */,/*1584*/{0x0,0x24DB,0x0}/* 24C1 */, /*1585*/{0x0,0x24DC,0x0}/* 24C2 */,/*1586*/{0x0,0x24DD,0x0}/* 24C3 */,/*1587*/{0x0,0x24DE,0x0}/* 24C4 */, /*1588*/{0x0,0x24DF,0x0}/* 24C5 */,/*1589*/{0x0,0x24E0,0x0}/* 24C6 */,/*1590*/{0x0,0x24E1,0x0}/* 24C7 */, /*1591*/{0x0,0x24E2,0x0}/* 24C8 */,/*1592*/{0x0,0x24E3,0x0}/* 24C9 */,/*1593*/{0x0,0x24E4,0x0}/* 24CA */, /*1594*/{0x0,0x24E5,0x0}/* 24CB */,/*1595*/{0x0,0x24E6,0x0}/* 24CC */,/*1596*/{0x0,0x24E7,0x0}/* 24CD */, /*1597*/{0x0,0x24E8,0x0}/* 24CE */,/*1598*/{0x0,0x24E9,0x0}/* 24CF */,/*1599*/{0x24B6,0x0,0x24B6}/* 24D0 */, /*1600*/{0x24B7,0x0,0x24B7}/* 24D1 */,/*1601*/{0x24B8,0x0,0x24B8}/* 24D2 */,/*1602*/{0x24B9,0x0,0x24B9}/* 24D3 */, /*1603*/{0x24BA,0x0,0x24BA}/* 24D4 */,/*1604*/{0x24BB,0x0,0x24BB}/* 24D5 */,/*1605*/{0x24BC,0x0,0x24BC}/* 24D6 */, /*1606*/{0x24BD,0x0,0x24BD}/* 24D7 */,/*1607*/{0x24BE,0x0,0x24BE}/* 24D8 */,/*1608*/{0x24BF,0x0,0x24BF}/* 24D9 */, /*1609*/{0x24C0,0x0,0x24C0}/* 24DA */,/*1610*/{0x24C1,0x0,0x24C1}/* 24DB */,/*1611*/{0x24C2,0x0,0x24C2}/* 24DC */, /*1612*/{0x24C3,0x0,0x24C3}/* 24DD */,/*1613*/{0x24C4,0x0,0x24C4}/* 24DE */,/*1614*/{0x24C5,0x0,0x24C5}/* 24DF */, /*1615*/{0x24C6,0x0,0x24C6}/* 24E0 */,/*1616*/{0x24C7,0x0,0x24C7}/* 24E1 */,/*1617*/{0x24C8,0x0,0x24C8}/* 24E2 */, /*1618*/{0x24C9,0x0,0x24C9}/* 24E3 */,/*1619*/{0x24CA,0x0,0x24CA}/* 24E4 */,/*1620*/{0x24CB,0x0,0x24CB}/* 24E5 */, /*1621*/{0x24CC,0x0,0x24CC}/* 24E6 */,/*1622*/{0x24CD,0x0,0x24CD}/* 24E7 */,/*1623*/{0x24CE,0x0,0x24CE}/* 24E8 */, /*1624*/{0x24CF,0x0,0x24CF}/* 24E9 */,/*1625*/{0x0,0x2C30,0x0}/* 2C00 */,/*1626*/{0x0,0x2C31,0x0}/* 2C01 */, /*1627*/{0x0,0x2C32,0x0}/* 2C02 */,/*1628*/{0x0,0x2C33,0x0}/* 2C03 */,/*1629*/{0x0,0x2C34,0x0}/* 2C04 */, /*1630*/{0x0,0x2C35,0x0}/* 2C05 */,/*1631*/{0x0,0x2C36,0x0}/* 2C06 */,/*1632*/{0x0,0x2C37,0x0}/* 2C07 */, /*1633*/{0x0,0x2C38,0x0}/* 2C08 */,/*1634*/{0x0,0x2C39,0x0}/* 2C09 */,/*1635*/{0x0,0x2C3A,0x0}/* 2C0A */, /*1636*/{0x0,0x2C3B,0x0}/* 2C0B */,/*1637*/{0x0,0x2C3C,0x0}/* 2C0C */,/*1638*/{0x0,0x2C3D,0x0}/* 2C0D */, /*1639*/{0x0,0x2C3E,0x0}/* 2C0E */,/*1640*/{0x0,0x2C3F,0x0}/* 2C0F */,/*1641*/{0x0,0x2C40,0x0}/* 2C10 */, /*1642*/{0x0,0x2C41,0x0}/* 2C11 */,/*1643*/{0x0,0x2C42,0x0}/* 2C12 */,/*1644*/{0x0,0x2C43,0x0}/* 2C13 */, /*1645*/{0x0,0x2C44,0x0}/* 2C14 */,/*1646*/{0x0,0x2C45,0x0}/* 2C15 */,/*1647*/{0x0,0x2C46,0x0}/* 2C16 */, /*1648*/{0x0,0x2C47,0x0}/* 2C17 */,/*1649*/{0x0,0x2C48,0x0}/* 2C18 */,/*1650*/{0x0,0x2C49,0x0}/* 2C19 */, /*1651*/{0x0,0x2C4A,0x0}/* 2C1A */,/*1652*/{0x0,0x2C4B,0x0}/* 2C1B */,/*1653*/{0x0,0x2C4C,0x0}/* 2C1C */, /*1654*/{0x0,0x2C4D,0x0}/* 2C1D */,/*1655*/{0x0,0x2C4E,0x0}/* 2C1E */,/*1656*/{0x0,0x2C4F,0x0}/* 2C1F */, /*1657*/{0x0,0x2C50,0x0}/* 2C20 */,/*1658*/{0x0,0x2C51,0x0}/* 2C21 */,/*1659*/{0x0,0x2C52,0x0}/* 2C22 */, /*1660*/{0x0,0x2C53,0x0}/* 2C23 */,/*1661*/{0x0,0x2C54,0x0}/* 2C24 */,/*1662*/{0x0,0x2C55,0x0}/* 2C25 */, /*1663*/{0x0,0x2C56,0x0}/* 2C26 */,/*1664*/{0x0,0x2C57,0x0}/* 2C27 */,/*1665*/{0x0,0x2C58,0x0}/* 2C28 */, /*1666*/{0x0,0x2C59,0x0}/* 2C29 */,/*1667*/{0x0,0x2C5A,0x0}/* 2C2A */,/*1668*/{0x0,0x2C5B,0x0}/* 2C2B */, /*1669*/{0x0,0x2C5C,0x0}/* 2C2C */,/*1670*/{0x0,0x2C5D,0x0}/* 2C2D */,/*1671*/{0x0,0x2C5E,0x0}/* 2C2E */, /*1672*/{0x2C00,0x0,0x2C00}/* 2C30 */,/*1673*/{0x2C01,0x0,0x2C01}/* 2C31 */,/*1674*/{0x2C02,0x0,0x2C02}/* 2C32 */, /*1675*/{0x2C03,0x0,0x2C03}/* 2C33 */,/*1676*/{0x2C04,0x0,0x2C04}/* 2C34 */,/*1677*/{0x2C05,0x0,0x2C05}/* 2C35 */, /*1678*/{0x2C06,0x0,0x2C06}/* 2C36 */,/*1679*/{0x2C07,0x0,0x2C07}/* 2C37 */,/*1680*/{0x2C08,0x0,0x2C08}/* 2C38 */, /*1681*/{0x2C09,0x0,0x2C09}/* 2C39 */,/*1682*/{0x2C0A,0x0,0x2C0A}/* 2C3A */,/*1683*/{0x2C0B,0x0,0x2C0B}/* 2C3B */, /*1684*/{0x2C0C,0x0,0x2C0C}/* 2C3C */,/*1685*/{0x2C0D,0x0,0x2C0D}/* 2C3D */,/*1686*/{0x2C0E,0x0,0x2C0E}/* 2C3E */, /*1687*/{0x2C0F,0x0,0x2C0F}/* 2C3F */,/*1688*/{0x2C10,0x0,0x2C10}/* 2C40 */,/*1689*/{0x2C11,0x0,0x2C11}/* 2C41 */, /*1690*/{0x2C12,0x0,0x2C12}/* 2C42 */,/*1691*/{0x2C13,0x0,0x2C13}/* 2C43 */,/*1692*/{0x2C14,0x0,0x2C14}/* 2C44 */, /*1693*/{0x2C15,0x0,0x2C15}/* 2C45 */,/*1694*/{0x2C16,0x0,0x2C16}/* 2C46 */,/*1695*/{0x2C17,0x0,0x2C17}/* 2C47 */, /*1696*/{0x2C18,0x0,0x2C18}/* 2C48 */,/*1697*/{0x2C19,0x0,0x2C19}/* 2C49 */,/*1698*/{0x2C1A,0x0,0x2C1A}/* 2C4A */, /*1699*/{0x2C1B,0x0,0x2C1B}/* 2C4B */,/*1700*/{0x2C1C,0x0,0x2C1C}/* 2C4C */,/*1701*/{0x2C1D,0x0,0x2C1D}/* 2C4D */, /*1702*/{0x2C1E,0x0,0x2C1E}/* 2C4E */,/*1703*/{0x2C1F,0x0,0x2C1F}/* 2C4F */,/*1704*/{0x2C20,0x0,0x2C20}/* 2C50 */, /*1705*/{0x2C21,0x0,0x2C21}/* 2C51 */,/*1706*/{0x2C22,0x0,0x2C22}/* 2C52 */,/*1707*/{0x2C23,0x0,0x2C23}/* 2C53 */, /*1708*/{0x2C24,0x0,0x2C24}/* 2C54 */,/*1709*/{0x2C25,0x0,0x2C25}/* 2C55 */,/*1710*/{0x2C26,0x0,0x2C26}/* 2C56 */, /*1711*/{0x2C27,0x0,0x2C27}/* 2C57 */,/*1712*/{0x2C28,0x0,0x2C28}/* 2C58 */,/*1713*/{0x2C29,0x0,0x2C29}/* 2C59 */, /*1714*/{0x2C2A,0x0,0x2C2A}/* 2C5A */,/*1715*/{0x2C2B,0x0,0x2C2B}/* 2C5B */,/*1716*/{0x2C2C,0x0,0x2C2C}/* 2C5C */, /*1717*/{0x2C2D,0x0,0x2C2D}/* 2C5D */,/*1718*/{0x2C2E,0x0,0x2C2E}/* 2C5E */,/*1719*/{0x0,0x2C61,0x0}/* 2C60 */, /*1720*/{0x2C60,0x0,0x2C60}/* 2C61 */,/*1721*/{0x0,0x026B,0x0}/* 2C62 */,/*1722*/{0x0,0x1D7D,0x0}/* 2C63 */, /*1723*/{0x0,0x027D,0x0}/* 2C64 */,/*1724*/{0x023A,0x0,0x023A}/* 2C65 */,/*1725*/{0x023E,0x0,0x023E}/* 2C66 */, /*1726*/{0x0,0x2C68,0x0}/* 2C67 */,/*1727*/{0x2C67,0x0,0x2C67}/* 2C68 */,/*1728*/{0x0,0x2C6A,0x0}/* 2C69 */, /*1729*/{0x2C69,0x0,0x2C69}/* 2C6A */,/*1730*/{0x0,0x2C6C,0x0}/* 2C6B */,/*1731*/{0x2C6B,0x0,0x2C6B}/* 2C6C */, /*1732*/{0x0,0x0251,0x0}/* 2C6D */,/*1733*/{0x0,0x0271,0x0}/* 2C6E */,/*1734*/{0x0,0x0250,0x0}/* 2C6F */, /*1735*/{0x0,0x0252,0x0}/* 2C70 */,/*1736*/{0x0,0x2C73,0x0}/* 2C72 */,/*1737*/{0x2C72,0x0,0x2C72}/* 2C73 */, /*1738*/{0x0,0x2C76,0x0}/* 2C75 */,/*1739*/{0x2C75,0x0,0x2C75}/* 2C76 */,/*1740*/{0x0,0x023F,0x0}/* 2C7E */, /*1741*/{0x0,0x0240,0x0}/* 2C7F */,/*1742*/{0x0,0x2C81,0x0}/* 2C80 */,/*1743*/{0x2C80,0x0,0x2C80}/* 2C81 */, /*1744*/{0x0,0x2C83,0x0}/* 2C82 */,/*1745*/{0x2C82,0x0,0x2C82}/* 2C83 */,/*1746*/{0x0,0x2C85,0x0}/* 2C84 */, /*1747*/{0x2C84,0x0,0x2C84}/* 2C85 */,/*1748*/{0x0,0x2C87,0x0}/* 2C86 */,/*1749*/{0x2C86,0x0,0x2C86}/* 2C87 */, /*1750*/{0x0,0x2C89,0x0}/* 2C88 */,/*1751*/{0x2C88,0x0,0x2C88}/* 2C89 */,/*1752*/{0x0,0x2C8B,0x0}/* 2C8A */, /*1753*/{0x2C8A,0x0,0x2C8A}/* 2C8B */,/*1754*/{0x0,0x2C8D,0x0}/* 2C8C */,/*1755*/{0x2C8C,0x0,0x2C8C}/* 2C8D */, /*1756*/{0x0,0x2C8F,0x0}/* 2C8E */,/*1757*/{0x2C8E,0x0,0x2C8E}/* 2C8F */,/*1758*/{0x0,0x2C91,0x0}/* 2C90 */, /*1759*/{0x2C90,0x0,0x2C90}/* 2C91 */,/*1760*/{0x0,0x2C93,0x0}/* 2C92 */,/*1761*/{0x2C92,0x0,0x2C92}/* 2C93 */, /*1762*/{0x0,0x2C95,0x0}/* 2C94 */,/*1763*/{0x2C94,0x0,0x2C94}/* 2C95 */,/*1764*/{0x0,0x2C97,0x0}/* 2C96 */, /*1765*/{0x2C96,0x0,0x2C96}/* 2C97 */,/*1766*/{0x0,0x2C99,0x0}/* 2C98 */,/*1767*/{0x2C98,0x0,0x2C98}/* 2C99 */, /*1768*/{0x0,0x2C9B,0x0}/* 2C9A */,/*1769*/{0x2C9A,0x0,0x2C9A}/* 2C9B */,/*1770*/{0x0,0x2C9D,0x0}/* 2C9C */, /*1771*/{0x2C9C,0x0,0x2C9C}/* 2C9D */,/*1772*/{0x0,0x2C9F,0x0}/* 2C9E */,/*1773*/{0x2C9E,0x0,0x2C9E}/* 2C9F */, /*1774*/{0x0,0x2CA1,0x0}/* 2CA0 */,/*1775*/{0x2CA0,0x0,0x2CA0}/* 2CA1 */,/*1776*/{0x0,0x2CA3,0x0}/* 2CA2 */, /*1777*/{0x2CA2,0x0,0x2CA2}/* 2CA3 */,/*1778*/{0x0,0x2CA5,0x0}/* 2CA4 */,/*1779*/{0x2CA4,0x0,0x2CA4}/* 2CA5 */, /*1780*/{0x0,0x2CA7,0x0}/* 2CA6 */,/*1781*/{0x2CA6,0x0,0x2CA6}/* 2CA7 */,/*1782*/{0x0,0x2CA9,0x0}/* 2CA8 */, /*1783*/{0x2CA8,0x0,0x2CA8}/* 2CA9 */,/*1784*/{0x0,0x2CAB,0x0}/* 2CAA */,/*1785*/{0x2CAA,0x0,0x2CAA}/* 2CAB */, /*1786*/{0x0,0x2CAD,0x0}/* 2CAC */,/*1787*/{0x2CAC,0x0,0x2CAC}/* 2CAD */,/*1788*/{0x0,0x2CAF,0x0}/* 2CAE */, /*1789*/{0x2CAE,0x0,0x2CAE}/* 2CAF */,/*1790*/{0x0,0x2CB1,0x0}/* 2CB0 */,/*1791*/{0x2CB0,0x0,0x2CB0}/* 2CB1 */, /*1792*/{0x0,0x2CB3,0x0}/* 2CB2 */,/*1793*/{0x2CB2,0x0,0x2CB2}/* 2CB3 */,/*1794*/{0x0,0x2CB5,0x0}/* 2CB4 */, /*1795*/{0x2CB4,0x0,0x2CB4}/* 2CB5 */,/*1796*/{0x0,0x2CB7,0x0}/* 2CB6 */,/*1797*/{0x2CB6,0x0,0x2CB6}/* 2CB7 */, /*1798*/{0x0,0x2CB9,0x0}/* 2CB8 */,/*1799*/{0x2CB8,0x0,0x2CB8}/* 2CB9 */,/*1800*/{0x0,0x2CBB,0x0}/* 2CBA */, /*1801*/{0x2CBA,0x0,0x2CBA}/* 2CBB */,/*1802*/{0x0,0x2CBD,0x0}/* 2CBC */,/*1803*/{0x2CBC,0x0,0x2CBC}/* 2CBD */, /*1804*/{0x0,0x2CBF,0x0}/* 2CBE */,/*1805*/{0x2CBE,0x0,0x2CBE}/* 2CBF */,/*1806*/{0x0,0x2CC1,0x0}/* 2CC0 */, /*1807*/{0x2CC0,0x0,0x2CC0}/* 2CC1 */,/*1808*/{0x0,0x2CC3,0x0}/* 2CC2 */,/*1809*/{0x2CC2,0x0,0x2CC2}/* 2CC3 */, /*1810*/{0x0,0x2CC5,0x0}/* 2CC4 */,/*1811*/{0x2CC4,0x0,0x2CC4}/* 2CC5 */,/*1812*/{0x0,0x2CC7,0x0}/* 2CC6 */, /*1813*/{0x2CC6,0x0,0x2CC6}/* 2CC7 */,/*1814*/{0x0,0x2CC9,0x0}/* 2CC8 */,/*1815*/{0x2CC8,0x0,0x2CC8}/* 2CC9 */, /*1816*/{0x0,0x2CCB,0x0}/* 2CCA */,/*1817*/{0x2CCA,0x0,0x2CCA}/* 2CCB */,/*1818*/{0x0,0x2CCD,0x0}/* 2CCC */, /*1819*/{0x2CCC,0x0,0x2CCC}/* 2CCD */,/*1820*/{0x0,0x2CCF,0x0}/* 2CCE */,/*1821*/{0x2CCE,0x0,0x2CCE}/* 2CCF */, /*1822*/{0x0,0x2CD1,0x0}/* 2CD0 */,/*1823*/{0x2CD0,0x0,0x2CD0}/* 2CD1 */,/*1824*/{0x0,0x2CD3,0x0}/* 2CD2 */, /*1825*/{0x2CD2,0x0,0x2CD2}/* 2CD3 */,/*1826*/{0x0,0x2CD5,0x0}/* 2CD4 */,/*1827*/{0x2CD4,0x0,0x2CD4}/* 2CD5 */, /*1828*/{0x0,0x2CD7,0x0}/* 2CD6 */,/*1829*/{0x2CD6,0x0,0x2CD6}/* 2CD7 */,/*1830*/{0x0,0x2CD9,0x0}/* 2CD8 */, /*1831*/{0x2CD8,0x0,0x2CD8}/* 2CD9 */,/*1832*/{0x0,0x2CDB,0x0}/* 2CDA */,/*1833*/{0x2CDA,0x0,0x2CDA}/* 2CDB */, /*1834*/{0x0,0x2CDD,0x0}/* 2CDC */,/*1835*/{0x2CDC,0x0,0x2CDC}/* 2CDD */,/*1836*/{0x0,0x2CDF,0x0}/* 2CDE */, /*1837*/{0x2CDE,0x0,0x2CDE}/* 2CDF */,/*1838*/{0x0,0x2CE1,0x0}/* 2CE0 */,/*1839*/{0x2CE0,0x0,0x2CE0}/* 2CE1 */, /*1840*/{0x0,0x2CE3,0x0}/* 2CE2 */,/*1841*/{0x2CE2,0x0,0x2CE2}/* 2CE3 */,/*1842*/{0x0,0x2CEC,0x0}/* 2CEB */, /*1843*/{0x2CEB,0x0,0x2CEB}/* 2CEC */,/*1844*/{0x0,0x2CEE,0x0}/* 2CED */,/*1845*/{0x2CED,0x0,0x2CED}/* 2CEE */, /*1846*/{0x0,0x2CF3,0x0}/* 2CF2 */,/*1847*/{0x2CF2,0x0,0x2CF2}/* 2CF3 */,/*1848*/{0x10A0,0x0,0x10A0}/* 2D00 */, /*1849*/{0x10A1,0x0,0x10A1}/* 2D01 */,/*1850*/{0x10A2,0x0,0x10A2}/* 2D02 */,/*1851*/{0x10A3,0x0,0x10A3}/* 2D03 */, /*1852*/{0x10A4,0x0,0x10A4}/* 2D04 */,/*1853*/{0x10A5,0x0,0x10A5}/* 2D05 */,/*1854*/{0x10A6,0x0,0x10A6}/* 2D06 */, /*1855*/{0x10A7,0x0,0x10A7}/* 2D07 */,/*1856*/{0x10A8,0x0,0x10A8}/* 2D08 */,/*1857*/{0x10A9,0x0,0x10A9}/* 2D09 */, /*1858*/{0x10AA,0x0,0x10AA}/* 2D0A */,/*1859*/{0x10AB,0x0,0x10AB}/* 2D0B */,/*1860*/{0x10AC,0x0,0x10AC}/* 2D0C */, /*1861*/{0x10AD,0x0,0x10AD}/* 2D0D */,/*1862*/{0x10AE,0x0,0x10AE}/* 2D0E */,/*1863*/{0x10AF,0x0,0x10AF}/* 2D0F */, /*1864*/{0x10B0,0x0,0x10B0}/* 2D10 */,/*1865*/{0x10B1,0x0,0x10B1}/* 2D11 */,/*1866*/{0x10B2,0x0,0x10B2}/* 2D12 */, /*1867*/{0x10B3,0x0,0x10B3}/* 2D13 */,/*1868*/{0x10B4,0x0,0x10B4}/* 2D14 */,/*1869*/{0x10B5,0x0,0x10B5}/* 2D15 */, /*1870*/{0x10B6,0x0,0x10B6}/* 2D16 */,/*1871*/{0x10B7,0x0,0x10B7}/* 2D17 */,/*1872*/{0x10B8,0x0,0x10B8}/* 2D18 */, /*1873*/{0x10B9,0x0,0x10B9}/* 2D19 */,/*1874*/{0x10BA,0x0,0x10BA}/* 2D1A */,/*1875*/{0x10BB,0x0,0x10BB}/* 2D1B */, /*1876*/{0x10BC,0x0,0x10BC}/* 2D1C */,/*1877*/{0x10BD,0x0,0x10BD}/* 2D1D */,/*1878*/{0x10BE,0x0,0x10BE}/* 2D1E */, /*1879*/{0x10BF,0x0,0x10BF}/* 2D1F */,/*1880*/{0x10C0,0x0,0x10C0}/* 2D20 */,/*1881*/{0x10C1,0x0,0x10C1}/* 2D21 */, /*1882*/{0x10C2,0x0,0x10C2}/* 2D22 */,/*1883*/{0x10C3,0x0,0x10C3}/* 2D23 */,/*1884*/{0x10C4,0x0,0x10C4}/* 2D24 */, /*1885*/{0x10C5,0x0,0x10C5}/* 2D25 */,/*1886*/{0x10C7,0x0,0x10C7}/* 2D27 */,/*1887*/{0x10CD,0x0,0x10CD}/* 2D2D */, /*1888*/{0x0,0xA641,0x0}/* A640 */,/*1889*/{0xA640,0x0,0xA640}/* A641 */,/*1890*/{0x0,0xA643,0x0}/* A642 */, /*1891*/{0xA642,0x0,0xA642}/* A643 */,/*1892*/{0x0,0xA645,0x0}/* A644 */,/*1893*/{0xA644,0x0,0xA644}/* A645 */, /*1894*/{0x0,0xA647,0x0}/* A646 */,/*1895*/{0xA646,0x0,0xA646}/* A647 */,/*1896*/{0x0,0xA649,0x0}/* A648 */, /*1897*/{0xA648,0x0,0xA648}/* A649 */,/*1898*/{0x0,0xA64B,0x0}/* A64A */,/*1899*/{0xA64A,0x0,0xA64A}/* A64B */, /*1900*/{0x0,0xA64D,0x0}/* A64C */,/*1901*/{0xA64C,0x0,0xA64C}/* A64D */,/*1902*/{0x0,0xA64F,0x0}/* A64E */, /*1903*/{0xA64E,0x0,0xA64E}/* A64F */,/*1904*/{0x0,0xA651,0x0}/* A650 */,/*1905*/{0xA650,0x0,0xA650}/* A651 */, /*1906*/{0x0,0xA653,0x0}/* A652 */,/*1907*/{0xA652,0x0,0xA652}/* A653 */,/*1908*/{0x0,0xA655,0x0}/* A654 */, /*1909*/{0xA654,0x0,0xA654}/* A655 */,/*1910*/{0x0,0xA657,0x0}/* A656 */,/*1911*/{0xA656,0x0,0xA656}/* A657 */, /*1912*/{0x0,0xA659,0x0}/* A658 */,/*1913*/{0xA658,0x0,0xA658}/* A659 */,/*1914*/{0x0,0xA65B,0x0}/* A65A */, /*1915*/{0xA65A,0x0,0xA65A}/* A65B */,/*1916*/{0x0,0xA65D,0x0}/* A65C */,/*1917*/{0xA65C,0x0,0xA65C}/* A65D */, /*1918*/{0x0,0xA65F,0x0}/* A65E */,/*1919*/{0xA65E,0x0,0xA65E}/* A65F */,/*1920*/{0x0,0xA661,0x0}/* A660 */, /*1921*/{0xA660,0x0,0xA660}/* A661 */,/*1922*/{0x0,0xA663,0x0}/* A662 */,/*1923*/{0xA662,0x0,0xA662}/* A663 */, /*1924*/{0x0,0xA665,0x0}/* A664 */,/*1925*/{0xA664,0x0,0xA664}/* A665 */,/*1926*/{0x0,0xA667,0x0}/* A666 */, /*1927*/{0xA666,0x0,0xA666}/* A667 */,/*1928*/{0x0,0xA669,0x0}/* A668 */,/*1929*/{0xA668,0x0,0xA668}/* A669 */, /*1930*/{0x0,0xA66B,0x0}/* A66A */,/*1931*/{0xA66A,0x0,0xA66A}/* A66B */,/*1932*/{0x0,0xA66D,0x0}/* A66C */, /*1933*/{0xA66C,0x0,0xA66C}/* A66D */,/*1934*/{0x0,0xA681,0x0}/* A680 */,/*1935*/{0xA680,0x0,0xA680}/* A681 */, /*1936*/{0x0,0xA683,0x0}/* A682 */,/*1937*/{0xA682,0x0,0xA682}/* A683 */,/*1938*/{0x0,0xA685,0x0}/* A684 */, /*1939*/{0xA684,0x0,0xA684}/* A685 */,/*1940*/{0x0,0xA687,0x0}/* A686 */,/*1941*/{0xA686,0x0,0xA686}/* A687 */, /*1942*/{0x0,0xA689,0x0}/* A688 */,/*1943*/{0xA688,0x0,0xA688}/* A689 */,/*1944*/{0x0,0xA68B,0x0}/* A68A */, /*1945*/{0xA68A,0x0,0xA68A}/* A68B */,/*1946*/{0x0,0xA68D,0x0}/* A68C */,/*1947*/{0xA68C,0x0,0xA68C}/* A68D */, /*1948*/{0x0,0xA68F,0x0}/* A68E */,/*1949*/{0xA68E,0x0,0xA68E}/* A68F */,/*1950*/{0x0,0xA691,0x0}/* A690 */, /*1951*/{0xA690,0x0,0xA690}/* A691 */,/*1952*/{0x0,0xA693,0x0}/* A692 */,/*1953*/{0xA692,0x0,0xA692}/* A693 */, /*1954*/{0x0,0xA695,0x0}/* A694 */,/*1955*/{0xA694,0x0,0xA694}/* A695 */,/*1956*/{0x0,0xA697,0x0}/* A696 */, /*1957*/{0xA696,0x0,0xA696}/* A697 */,/*1958*/{0x0,0xA699,0x0}/* A698 */,/*1959*/{0xA698,0x0,0xA698}/* A699 */, /*1960*/{0x0,0xA69B,0x0}/* A69A */,/*1961*/{0xA69A,0x0,0xA69A}/* A69B */,/*1962*/{0x0,0xA723,0x0}/* A722 */, /*1963*/{0xA722,0x0,0xA722}/* A723 */,/*1964*/{0x0,0xA725,0x0}/* A724 */,/*1965*/{0xA724,0x0,0xA724}/* A725 */, /*1966*/{0x0,0xA727,0x0}/* A726 */,/*1967*/{0xA726,0x0,0xA726}/* A727 */,/*1968*/{0x0,0xA729,0x0}/* A728 */, /*1969*/{0xA728,0x0,0xA728}/* A729 */,/*1970*/{0x0,0xA72B,0x0}/* A72A */,/*1971*/{0xA72A,0x0,0xA72A}/* A72B */, /*1972*/{0x0,0xA72D,0x0}/* A72C */,/*1973*/{0xA72C,0x0,0xA72C}/* A72D */,/*1974*/{0x0,0xA72F,0x0}/* A72E */, /*1975*/{0xA72E,0x0,0xA72E}/* A72F */,/*1976*/{0x0,0xA733,0x0}/* A732 */,/*1977*/{0xA732,0x0,0xA732}/* A733 */, /*1978*/{0x0,0xA735,0x0}/* A734 */,/*1979*/{0xA734,0x0,0xA734}/* A735 */,/*1980*/{0x0,0xA737,0x0}/* A736 */, /*1981*/{0xA736,0x0,0xA736}/* A737 */,/*1982*/{0x0,0xA739,0x0}/* A738 */,/*1983*/{0xA738,0x0,0xA738}/* A739 */, /*1984*/{0x0,0xA73B,0x0}/* A73A */,/*1985*/{0xA73A,0x0,0xA73A}/* A73B */,/*1986*/{0x0,0xA73D,0x0}/* A73C */, /*1987*/{0xA73C,0x0,0xA73C}/* A73D */,/*1988*/{0x0,0xA73F,0x0}/* A73E */,/*1989*/{0xA73E,0x0,0xA73E}/* A73F */, /*1990*/{0x0,0xA741,0x0}/* A740 */,/*1991*/{0xA740,0x0,0xA740}/* A741 */,/*1992*/{0x0,0xA743,0x0}/* A742 */, /*1993*/{0xA742,0x0,0xA742}/* A743 */,/*1994*/{0x0,0xA745,0x0}/* A744 */,/*1995*/{0xA744,0x0,0xA744}/* A745 */, /*1996*/{0x0,0xA747,0x0}/* A746 */,/*1997*/{0xA746,0x0,0xA746}/* A747 */,/*1998*/{0x0,0xA749,0x0}/* A748 */, /*1999*/{0xA748,0x0,0xA748}/* A749 */,/*2000*/{0x0,0xA74B,0x0}/* A74A */,/*2001*/{0xA74A,0x0,0xA74A}/* A74B */, /*2002*/{0x0,0xA74D,0x0}/* A74C */,/*2003*/{0xA74C,0x0,0xA74C}/* A74D */,/*2004*/{0x0,0xA74F,0x0}/* A74E */, /*2005*/{0xA74E,0x0,0xA74E}/* A74F */,/*2006*/{0x0,0xA751,0x0}/* A750 */,/*2007*/{0xA750,0x0,0xA750}/* A751 */, /*2008*/{0x0,0xA753,0x0}/* A752 */,/*2009*/{0xA752,0x0,0xA752}/* A753 */,/*2010*/{0x0,0xA755,0x0}/* A754 */, /*2011*/{0xA754,0x0,0xA754}/* A755 */,/*2012*/{0x0,0xA757,0x0}/* A756 */,/*2013*/{0xA756,0x0,0xA756}/* A757 */, /*2014*/{0x0,0xA759,0x0}/* A758 */,/*2015*/{0xA758,0x0,0xA758}/* A759 */,/*2016*/{0x0,0xA75B,0x0}/* A75A */, /*2017*/{0xA75A,0x0,0xA75A}/* A75B */,/*2018*/{0x0,0xA75D,0x0}/* A75C */,/*2019*/{0xA75C,0x0,0xA75C}/* A75D */, /*2020*/{0x0,0xA75F,0x0}/* A75E */,/*2021*/{0xA75E,0x0,0xA75E}/* A75F */,/*2022*/{0x0,0xA761,0x0}/* A760 */, /*2023*/{0xA760,0x0,0xA760}/* A761 */,/*2024*/{0x0,0xA763,0x0}/* A762 */,/*2025*/{0xA762,0x0,0xA762}/* A763 */, /*2026*/{0x0,0xA765,0x0}/* A764 */,/*2027*/{0xA764,0x0,0xA764}/* A765 */,/*2028*/{0x0,0xA767,0x0}/* A766 */, /*2029*/{0xA766,0x0,0xA766}/* A767 */,/*2030*/{0x0,0xA769,0x0}/* A768 */,/*2031*/{0xA768,0x0,0xA768}/* A769 */, /*2032*/{0x0,0xA76B,0x0}/* A76A */,/*2033*/{0xA76A,0x0,0xA76A}/* A76B */,/*2034*/{0x0,0xA76D,0x0}/* A76C */, /*2035*/{0xA76C,0x0,0xA76C}/* A76D */,/*2036*/{0x0,0xA76F,0x0}/* A76E */,/*2037*/{0xA76E,0x0,0xA76E}/* A76F */, /*2038*/{0x0,0xA77A,0x0}/* A779 */,/*2039*/{0xA779,0x0,0xA779}/* A77A */,/*2040*/{0x0,0xA77C,0x0}/* A77B */, /*2041*/{0xA77B,0x0,0xA77B}/* A77C */,/*2042*/{0x0,0x1D79,0x0}/* A77D */,/*2043*/{0x0,0xA77F,0x0}/* A77E */, /*2044*/{0xA77E,0x0,0xA77E}/* A77F */,/*2045*/{0x0,0xA781,0x0}/* A780 */,/*2046*/{0xA780,0x0,0xA780}/* A781 */, /*2047*/{0x0,0xA783,0x0}/* A782 */,/*2048*/{0xA782,0x0,0xA782}/* A783 */,/*2049*/{0x0,0xA785,0x0}/* A784 */, /*2050*/{0xA784,0x0,0xA784}/* A785 */,/*2051*/{0x0,0xA787,0x0}/* A786 */,/*2052*/{0xA786,0x0,0xA786}/* A787 */, /*2053*/{0x0,0xA78C,0x0}/* A78B */,/*2054*/{0xA78B,0x0,0xA78B}/* A78C */,/*2055*/{0x0,0x0265,0x0}/* A78D */, /*2056*/{0x0,0xA791,0x0}/* A790 */,/*2057*/{0xA790,0x0,0xA790}/* A791 */,/*2058*/{0x0,0xA793,0x0}/* A792 */, /*2059*/{0xA792,0x0,0xA792}/* A793 */,/*2060*/{0x0,0xA797,0x0}/* A796 */,/*2061*/{0xA796,0x0,0xA796}/* A797 */, /*2062*/{0x0,0xA799,0x0}/* A798 */,/*2063*/{0xA798,0x0,0xA798}/* A799 */,/*2064*/{0x0,0xA79B,0x0}/* A79A */, /*2065*/{0xA79A,0x0,0xA79A}/* A79B */,/*2066*/{0x0,0xA79D,0x0}/* A79C */,/*2067*/{0xA79C,0x0,0xA79C}/* A79D */, /*2068*/{0x0,0xA79F,0x0}/* A79E */,/*2069*/{0xA79E,0x0,0xA79E}/* A79F */,/*2070*/{0x0,0xA7A1,0x0}/* A7A0 */, /*2071*/{0xA7A0,0x0,0xA7A0}/* A7A1 */,/*2072*/{0x0,0xA7A3,0x0}/* A7A2 */,/*2073*/{0xA7A2,0x0,0xA7A2}/* A7A3 */, /*2074*/{0x0,0xA7A5,0x0}/* A7A4 */,/*2075*/{0xA7A4,0x0,0xA7A4}/* A7A5 */,/*2076*/{0x0,0xA7A7,0x0}/* A7A6 */, /*2077*/{0xA7A6,0x0,0xA7A6}/* A7A7 */,/*2078*/{0x0,0xA7A9,0x0}/* A7A8 */,/*2079*/{0xA7A8,0x0,0xA7A8}/* A7A9 */, /*2080*/{0x0,0x0266,0x0}/* A7AA */,/*2081*/{0x0,0x025C,0x0}/* A7AB */,/*2082*/{0x0,0x0261,0x0}/* A7AC */, /*2083*/{0x0,0x026C,0x0}/* A7AD */,/*2084*/{0x0,0x029E,0x0}/* A7B0 */,/*2085*/{0x0,0x0287,0x0}/* A7B1 */, /*2086*/{0x0,0x029D,0x0}/* A7B2 */,/*2087*/{0x0,0xAB53,0x0}/* A7B3 */,/*2088*/{0x0,0xA7B5,0x0}/* A7B4 */, /*2089*/{0xA7B4,0x0,0xA7B4}/* A7B5 */,/*2090*/{0x0,0xA7B7,0x0}/* A7B6 */,/*2091*/{0xA7B6,0x0,0xA7B6}/* A7B7 */, /*2092*/{0xA7B3,0x0,0xA7B3}/* AB53 */,/*2093*/{0x13A0,0x0,0x13A0}/* AB70 */,/*2094*/{0x13A1,0x0,0x13A1}/* AB71 */, /*2095*/{0x13A2,0x0,0x13A2}/* AB72 */,/*2096*/{0x13A3,0x0,0x13A3}/* AB73 */,/*2097*/{0x13A4,0x0,0x13A4}/* AB74 */, /*2098*/{0x13A5,0x0,0x13A5}/* AB75 */,/*2099*/{0x13A6,0x0,0x13A6}/* AB76 */,/*2100*/{0x13A7,0x0,0x13A7}/* AB77 */, /*2101*/{0x13A8,0x0,0x13A8}/* AB78 */,/*2102*/{0x13A9,0x0,0x13A9}/* AB79 */,/*2103*/{0x13AA,0x0,0x13AA}/* AB7A */, /*2104*/{0x13AB,0x0,0x13AB}/* AB7B */,/*2105*/{0x13AC,0x0,0x13AC}/* AB7C */,/*2106*/{0x13AD,0x0,0x13AD}/* AB7D */, /*2107*/{0x13AE,0x0,0x13AE}/* AB7E */,/*2108*/{0x13AF,0x0,0x13AF}/* AB7F */,/*2109*/{0x13B0,0x0,0x13B0}/* AB80 */, /*2110*/{0x13B1,0x0,0x13B1}/* AB81 */,/*2111*/{0x13B2,0x0,0x13B2}/* AB82 */,/*2112*/{0x13B3,0x0,0x13B3}/* AB83 */, /*2113*/{0x13B4,0x0,0x13B4}/* AB84 */,/*2114*/{0x13B5,0x0,0x13B5}/* AB85 */,/*2115*/{0x13B6,0x0,0x13B6}/* AB86 */, /*2116*/{0x13B7,0x0,0x13B7}/* AB87 */,/*2117*/{0x13B8,0x0,0x13B8}/* AB88 */,/*2118*/{0x13B9,0x0,0x13B9}/* AB89 */, /*2119*/{0x13BA,0x0,0x13BA}/* AB8A */,/*2120*/{0x13BB,0x0,0x13BB}/* AB8B */,/*2121*/{0x13BC,0x0,0x13BC}/* AB8C */, /*2122*/{0x13BD,0x0,0x13BD}/* AB8D */,/*2123*/{0x13BE,0x0,0x13BE}/* AB8E */,/*2124*/{0x13BF,0x0,0x13BF}/* AB8F */, /*2125*/{0x13C0,0x0,0x13C0}/* AB90 */,/*2126*/{0x13C1,0x0,0x13C1}/* AB91 */,/*2127*/{0x13C2,0x0,0x13C2}/* AB92 */, /*2128*/{0x13C3,0x0,0x13C3}/* AB93 */,/*2129*/{0x13C4,0x0,0x13C4}/* AB94 */,/*2130*/{0x13C5,0x0,0x13C5}/* AB95 */, /*2131*/{0x13C6,0x0,0x13C6}/* AB96 */,/*2132*/{0x13C7,0x0,0x13C7}/* AB97 */,/*2133*/{0x13C8,0x0,0x13C8}/* AB98 */, /*2134*/{0x13C9,0x0,0x13C9}/* AB99 */,/*2135*/{0x13CA,0x0,0x13CA}/* AB9A */,/*2136*/{0x13CB,0x0,0x13CB}/* AB9B */, /*2137*/{0x13CC,0x0,0x13CC}/* AB9C */,/*2138*/{0x13CD,0x0,0x13CD}/* AB9D */,/*2139*/{0x13CE,0x0,0x13CE}/* AB9E */, /*2140*/{0x13CF,0x0,0x13CF}/* AB9F */,/*2141*/{0x13D0,0x0,0x13D0}/* ABA0 */,/*2142*/{0x13D1,0x0,0x13D1}/* ABA1 */, /*2143*/{0x13D2,0x0,0x13D2}/* ABA2 */,/*2144*/{0x13D3,0x0,0x13D3}/* ABA3 */,/*2145*/{0x13D4,0x0,0x13D4}/* ABA4 */, /*2146*/{0x13D5,0x0,0x13D5}/* ABA5 */,/*2147*/{0x13D6,0x0,0x13D6}/* ABA6 */,/*2148*/{0x13D7,0x0,0x13D7}/* ABA7 */, /*2149*/{0x13D8,0x0,0x13D8}/* ABA8 */,/*2150*/{0x13D9,0x0,0x13D9}/* ABA9 */,/*2151*/{0x13DA,0x0,0x13DA}/* ABAA */, /*2152*/{0x13DB,0x0,0x13DB}/* ABAB */,/*2153*/{0x13DC,0x0,0x13DC}/* ABAC */,/*2154*/{0x13DD,0x0,0x13DD}/* ABAD */, /*2155*/{0x13DE,0x0,0x13DE}/* ABAE */,/*2156*/{0x13DF,0x0,0x13DF}/* ABAF */,/*2157*/{0x13E0,0x0,0x13E0}/* ABB0 */, /*2158*/{0x13E1,0x0,0x13E1}/* ABB1 */,/*2159*/{0x13E2,0x0,0x13E2}/* ABB2 */,/*2160*/{0x13E3,0x0,0x13E3}/* ABB3 */, /*2161*/{0x13E4,0x0,0x13E4}/* ABB4 */,/*2162*/{0x13E5,0x0,0x13E5}/* ABB5 */,/*2163*/{0x13E6,0x0,0x13E6}/* ABB6 */, /*2164*/{0x13E7,0x0,0x13E7}/* ABB7 */,/*2165*/{0x13E8,0x0,0x13E8}/* ABB8 */,/*2166*/{0x13E9,0x0,0x13E9}/* ABB9 */, /*2167*/{0x13EA,0x0,0x13EA}/* ABBA */,/*2168*/{0x13EB,0x0,0x13EB}/* ABBB */,/*2169*/{0x13EC,0x0,0x13EC}/* ABBC */, /*2170*/{0x13ED,0x0,0x13ED}/* ABBD */,/*2171*/{0x13EE,0x0,0x13EE}/* ABBE */,/*2172*/{0x13EF,0x0,0x13EF}/* ABBF */, /*2173*/{0x0,0xFF41,0x0}/* FF21 */,/*2174*/{0x0,0xFF42,0x0}/* FF22 */,/*2175*/{0x0,0xFF43,0x0}/* FF23 */, /*2176*/{0x0,0xFF44,0x0}/* FF24 */,/*2177*/{0x0,0xFF45,0x0}/* FF25 */,/*2178*/{0x0,0xFF46,0x0}/* FF26 */, /*2179*/{0x0,0xFF47,0x0}/* FF27 */,/*2180*/{0x0,0xFF48,0x0}/* FF28 */,/*2181*/{0x0,0xFF49,0x0}/* FF29 */, /*2182*/{0x0,0xFF4A,0x0}/* FF2A */,/*2183*/{0x0,0xFF4B,0x0}/* FF2B */,/*2184*/{0x0,0xFF4C,0x0}/* FF2C */, /*2185*/{0x0,0xFF4D,0x0}/* FF2D */,/*2186*/{0x0,0xFF4E,0x0}/* FF2E */,/*2187*/{0x0,0xFF4F,0x0}/* FF2F */, /*2188*/{0x0,0xFF50,0x0}/* FF30 */,/*2189*/{0x0,0xFF51,0x0}/* FF31 */,/*2190*/{0x0,0xFF52,0x0}/* FF32 */, /*2191*/{0x0,0xFF53,0x0}/* FF33 */,/*2192*/{0x0,0xFF54,0x0}/* FF34 */,/*2193*/{0x0,0xFF55,0x0}/* FF35 */, /*2194*/{0x0,0xFF56,0x0}/* FF36 */,/*2195*/{0x0,0xFF57,0x0}/* FF37 */,/*2196*/{0x0,0xFF58,0x0}/* FF38 */, /*2197*/{0x0,0xFF59,0x0}/* FF39 */,/*2198*/{0x0,0xFF5A,0x0}/* FF3A */,/*2199*/{0xFF21,0x0,0xFF21}/* FF41 */, /*2200*/{0xFF22,0x0,0xFF22}/* FF42 */,/*2201*/{0xFF23,0x0,0xFF23}/* FF43 */,/*2202*/{0xFF24,0x0,0xFF24}/* FF44 */, /*2203*/{0xFF25,0x0,0xFF25}/* FF45 */,/*2204*/{0xFF26,0x0,0xFF26}/* FF46 */,/*2205*/{0xFF27,0x0,0xFF27}/* FF47 */, /*2206*/{0xFF28,0x0,0xFF28}/* FF48 */,/*2207*/{0xFF29,0x0,0xFF29}/* FF49 */,/*2208*/{0xFF2A,0x0,0xFF2A}/* FF4A */, /*2209*/{0xFF2B,0x0,0xFF2B}/* FF4B */,/*2210*/{0xFF2C,0x0,0xFF2C}/* FF4C */,/*2211*/{0xFF2D,0x0,0xFF2D}/* FF4D */, /*2212*/{0xFF2E,0x0,0xFF2E}/* FF4E */,/*2213*/{0xFF2F,0x0,0xFF2F}/* FF4F */,/*2214*/{0xFF30,0x0,0xFF30}/* FF50 */, /*2215*/{0xFF31,0x0,0xFF31}/* FF51 */,/*2216*/{0xFF32,0x0,0xFF32}/* FF52 */,/*2217*/{0xFF33,0x0,0xFF33}/* FF53 */, /*2218*/{0xFF34,0x0,0xFF34}/* FF54 */,/*2219*/{0xFF35,0x0,0xFF35}/* FF55 */,/*2220*/{0xFF36,0x0,0xFF36}/* FF56 */, /*2221*/{0xFF37,0x0,0xFF37}/* FF57 */,/*2222*/{0xFF38,0x0,0xFF38}/* FF58 */,/*2223*/{0xFF39,0x0,0xFF39}/* FF59 */, /*2224*/{0xFF3A,0x0,0xFF3A}/* FF5A */,/*2225*/{0x0,0x10428,0x0}/* 10400 */,/*2226*/{0x0,0x10429,0x0}/* 10401 */, /*2227*/{0x0,0x1042A,0x0}/* 10402 */,/*2228*/{0x0,0x1042B,0x0}/* 10403 */,/*2229*/{0x0,0x1042C,0x0}/* 10404 */, /*2230*/{0x0,0x1042D,0x0}/* 10405 */,/*2231*/{0x0,0x1042E,0x0}/* 10406 */,/*2232*/{0x0,0x1042F,0x0}/* 10407 */, /*2233*/{0x0,0x10430,0x0}/* 10408 */,/*2234*/{0x0,0x10431,0x0}/* 10409 */,/*2235*/{0x0,0x10432,0x0}/* 1040A */, /*2236*/{0x0,0x10433,0x0}/* 1040B */,/*2237*/{0x0,0x10434,0x0}/* 1040C */,/*2238*/{0x0,0x10435,0x0}/* 1040D */, /*2239*/{0x0,0x10436,0x0}/* 1040E */,/*2240*/{0x0,0x10437,0x0}/* 1040F */,/*2241*/{0x0,0x10438,0x0}/* 10410 */, /*2242*/{0x0,0x10439,0x0}/* 10411 */,/*2243*/{0x0,0x1043A,0x0}/* 10412 */,/*2244*/{0x0,0x1043B,0x0}/* 10413 */, /*2245*/{0x0,0x1043C,0x0}/* 10414 */,/*2246*/{0x0,0x1043D,0x0}/* 10415 */,/*2247*/{0x0,0x1043E,0x0}/* 10416 */, /*2248*/{0x0,0x1043F,0x0}/* 10417 */,/*2249*/{0x0,0x10440,0x0}/* 10418 */,/*2250*/{0x0,0x10441,0x0}/* 10419 */, /*2251*/{0x0,0x10442,0x0}/* 1041A */,/*2252*/{0x0,0x10443,0x0}/* 1041B */,/*2253*/{0x0,0x10444,0x0}/* 1041C */, /*2254*/{0x0,0x10445,0x0}/* 1041D */,/*2255*/{0x0,0x10446,0x0}/* 1041E */,/*2256*/{0x0,0x10447,0x0}/* 1041F */, /*2257*/{0x0,0x10448,0x0}/* 10420 */,/*2258*/{0x0,0x10449,0x0}/* 10421 */,/*2259*/{0x0,0x1044A,0x0}/* 10422 */, /*2260*/{0x0,0x1044B,0x0}/* 10423 */,/*2261*/{0x0,0x1044C,0x0}/* 10424 */,/*2262*/{0x0,0x1044D,0x0}/* 10425 */, /*2263*/{0x0,0x1044E,0x0}/* 10426 */,/*2264*/{0x0,0x1044F,0x0}/* 10427 */,/*2265*/{0x10400,0x0,0x10400}/* 10428 */, /*2266*/{0x10401,0x0,0x10401}/* 10429 */,/*2267*/{0x10402,0x0,0x10402}/* 1042A */, /*2268*/{0x10403,0x0,0x10403}/* 1042B */,/*2269*/{0x10404,0x0,0x10404}/* 1042C */, /*2270*/{0x10405,0x0,0x10405}/* 1042D */,/*2271*/{0x10406,0x0,0x10406}/* 1042E */, /*2272*/{0x10407,0x0,0x10407}/* 1042F */,/*2273*/{0x10408,0x0,0x10408}/* 10430 */, /*2274*/{0x10409,0x0,0x10409}/* 10431 */,/*2275*/{0x1040A,0x0,0x1040A}/* 10432 */, /*2276*/{0x1040B,0x0,0x1040B}/* 10433 */,/*2277*/{0x1040C,0x0,0x1040C}/* 10434 */, /*2278*/{0x1040D,0x0,0x1040D}/* 10435 */,/*2279*/{0x1040E,0x0,0x1040E}/* 10436 */, /*2280*/{0x1040F,0x0,0x1040F}/* 10437 */,/*2281*/{0x10410,0x0,0x10410}/* 10438 */, /*2282*/{0x10411,0x0,0x10411}/* 10439 */,/*2283*/{0x10412,0x0,0x10412}/* 1043A */, /*2284*/{0x10413,0x0,0x10413}/* 1043B */,/*2285*/{0x10414,0x0,0x10414}/* 1043C */, /*2286*/{0x10415,0x0,0x10415}/* 1043D */,/*2287*/{0x10416,0x0,0x10416}/* 1043E */, /*2288*/{0x10417,0x0,0x10417}/* 1043F */,/*2289*/{0x10418,0x0,0x10418}/* 10440 */, /*2290*/{0x10419,0x0,0x10419}/* 10441 */,/*2291*/{0x1041A,0x0,0x1041A}/* 10442 */, /*2292*/{0x1041B,0x0,0x1041B}/* 10443 */,/*2293*/{0x1041C,0x0,0x1041C}/* 10444 */, /*2294*/{0x1041D,0x0,0x1041D}/* 10445 */,/*2295*/{0x1041E,0x0,0x1041E}/* 10446 */, /*2296*/{0x1041F,0x0,0x1041F}/* 10447 */,/*2297*/{0x10420,0x0,0x10420}/* 10448 */, /*2298*/{0x10421,0x0,0x10421}/* 10449 */,/*2299*/{0x10422,0x0,0x10422}/* 1044A */, /*2300*/{0x10423,0x0,0x10423}/* 1044B */,/*2301*/{0x10424,0x0,0x10424}/* 1044C */, /*2302*/{0x10425,0x0,0x10425}/* 1044D */,/*2303*/{0x10426,0x0,0x10426}/* 1044E */, /*2304*/{0x10427,0x0,0x10427}/* 1044F */,/*2305*/{0x0,0x10CC0,0x0}/* 10C80 */,/*2306*/{0x0,0x10CC1,0x0}/* 10C81 */, /*2307*/{0x0,0x10CC2,0x0}/* 10C82 */,/*2308*/{0x0,0x10CC3,0x0}/* 10C83 */,/*2309*/{0x0,0x10CC4,0x0}/* 10C84 */, /*2310*/{0x0,0x10CC5,0x0}/* 10C85 */,/*2311*/{0x0,0x10CC6,0x0}/* 10C86 */,/*2312*/{0x0,0x10CC7,0x0}/* 10C87 */, /*2313*/{0x0,0x10CC8,0x0}/* 10C88 */,/*2314*/{0x0,0x10CC9,0x0}/* 10C89 */,/*2315*/{0x0,0x10CCA,0x0}/* 10C8A */, /*2316*/{0x0,0x10CCB,0x0}/* 10C8B */,/*2317*/{0x0,0x10CCC,0x0}/* 10C8C */,/*2318*/{0x0,0x10CCD,0x0}/* 10C8D */, /*2319*/{0x0,0x10CCE,0x0}/* 10C8E */,/*2320*/{0x0,0x10CCF,0x0}/* 10C8F */,/*2321*/{0x0,0x10CD0,0x0}/* 10C90 */, /*2322*/{0x0,0x10CD1,0x0}/* 10C91 */,/*2323*/{0x0,0x10CD2,0x0}/* 10C92 */,/*2324*/{0x0,0x10CD3,0x0}/* 10C93 */, /*2325*/{0x0,0x10CD4,0x0}/* 10C94 */,/*2326*/{0x0,0x10CD5,0x0}/* 10C95 */,/*2327*/{0x0,0x10CD6,0x0}/* 10C96 */, /*2328*/{0x0,0x10CD7,0x0}/* 10C97 */,/*2329*/{0x0,0x10CD8,0x0}/* 10C98 */,/*2330*/{0x0,0x10CD9,0x0}/* 10C99 */, /*2331*/{0x0,0x10CDA,0x0}/* 10C9A */,/*2332*/{0x0,0x10CDB,0x0}/* 10C9B */,/*2333*/{0x0,0x10CDC,0x0}/* 10C9C */, /*2334*/{0x0,0x10CDD,0x0}/* 10C9D */,/*2335*/{0x0,0x10CDE,0x0}/* 10C9E */,/*2336*/{0x0,0x10CDF,0x0}/* 10C9F */, /*2337*/{0x0,0x10CE0,0x0}/* 10CA0 */,/*2338*/{0x0,0x10CE1,0x0}/* 10CA1 */,/*2339*/{0x0,0x10CE2,0x0}/* 10CA2 */, /*2340*/{0x0,0x10CE3,0x0}/* 10CA3 */,/*2341*/{0x0,0x10CE4,0x0}/* 10CA4 */,/*2342*/{0x0,0x10CE5,0x0}/* 10CA5 */, /*2343*/{0x0,0x10CE6,0x0}/* 10CA6 */,/*2344*/{0x0,0x10CE7,0x0}/* 10CA7 */,/*2345*/{0x0,0x10CE8,0x0}/* 10CA8 */, /*2346*/{0x0,0x10CE9,0x0}/* 10CA9 */,/*2347*/{0x0,0x10CEA,0x0}/* 10CAA */,/*2348*/{0x0,0x10CEB,0x0}/* 10CAB */, /*2349*/{0x0,0x10CEC,0x0}/* 10CAC */,/*2350*/{0x0,0x10CED,0x0}/* 10CAD */,/*2351*/{0x0,0x10CEE,0x0}/* 10CAE */, /*2352*/{0x0,0x10CEF,0x0}/* 10CAF */,/*2353*/{0x0,0x10CF0,0x0}/* 10CB0 */,/*2354*/{0x0,0x10CF1,0x0}/* 10CB1 */, /*2355*/{0x0,0x10CF2,0x0}/* 10CB2 */,/*2356*/{0x10C80,0x0,0x10C80}/* 10CC0 */,/*2357*/{0x10C81,0x0,0x10C81}/* 10CC1 */, /*2358*/{0x10C82,0x0,0x10C82}/* 10CC2 */,/*2359*/{0x10C83,0x0,0x10C83}/* 10CC3 */, /*2360*/{0x10C84,0x0,0x10C84}/* 10CC4 */,/*2361*/{0x10C85,0x0,0x10C85}/* 10CC5 */, /*2362*/{0x10C86,0x0,0x10C86}/* 10CC6 */,/*2363*/{0x10C87,0x0,0x10C87}/* 10CC7 */, /*2364*/{0x10C88,0x0,0x10C88}/* 10CC8 */,/*2365*/{0x10C89,0x0,0x10C89}/* 10CC9 */, /*2366*/{0x10C8A,0x0,0x10C8A}/* 10CCA */,/*2367*/{0x10C8B,0x0,0x10C8B}/* 10CCB */, /*2368*/{0x10C8C,0x0,0x10C8C}/* 10CCC */,/*2369*/{0x10C8D,0x0,0x10C8D}/* 10CCD */, /*2370*/{0x10C8E,0x0,0x10C8E}/* 10CCE */,/*2371*/{0x10C8F,0x0,0x10C8F}/* 10CCF */, /*2372*/{0x10C90,0x0,0x10C90}/* 10CD0 */,/*2373*/{0x10C91,0x0,0x10C91}/* 10CD1 */, /*2374*/{0x10C92,0x0,0x10C92}/* 10CD2 */,/*2375*/{0x10C93,0x0,0x10C93}/* 10CD3 */, /*2376*/{0x10C94,0x0,0x10C94}/* 10CD4 */,/*2377*/{0x10C95,0x0,0x10C95}/* 10CD5 */, /*2378*/{0x10C96,0x0,0x10C96}/* 10CD6 */,/*2379*/{0x10C97,0x0,0x10C97}/* 10CD7 */, /*2380*/{0x10C98,0x0,0x10C98}/* 10CD8 */,/*2381*/{0x10C99,0x0,0x10C99}/* 10CD9 */, /*2382*/{0x10C9A,0x0,0x10C9A}/* 10CDA */,/*2383*/{0x10C9B,0x0,0x10C9B}/* 10CDB */, /*2384*/{0x10C9C,0x0,0x10C9C}/* 10CDC */,/*2385*/{0x10C9D,0x0,0x10C9D}/* 10CDD */, /*2386*/{0x10C9E,0x0,0x10C9E}/* 10CDE */,/*2387*/{0x10C9F,0x0,0x10C9F}/* 10CDF */, /*2388*/{0x10CA0,0x0,0x10CA0}/* 10CE0 */,/*2389*/{0x10CA1,0x0,0x10CA1}/* 10CE1 */, /*2390*/{0x10CA2,0x0,0x10CA2}/* 10CE2 */,/*2391*/{0x10CA3,0x0,0x10CA3}/* 10CE3 */, /*2392*/{0x10CA4,0x0,0x10CA4}/* 10CE4 */,/*2393*/{0x10CA5,0x0,0x10CA5}/* 10CE5 */, /*2394*/{0x10CA6,0x0,0x10CA6}/* 10CE6 */,/*2395*/{0x10CA7,0x0,0x10CA7}/* 10CE7 */, /*2396*/{0x10CA8,0x0,0x10CA8}/* 10CE8 */,/*2397*/{0x10CA9,0x0,0x10CA9}/* 10CE9 */, /*2398*/{0x10CAA,0x0,0x10CAA}/* 10CEA */,/*2399*/{0x10CAB,0x0,0x10CAB}/* 10CEB */, /*2400*/{0x10CAC,0x0,0x10CAC}/* 10CEC */,/*2401*/{0x10CAD,0x0,0x10CAD}/* 10CED */, /*2402*/{0x10CAE,0x0,0x10CAE}/* 10CEE */,/*2403*/{0x10CAF,0x0,0x10CAF}/* 10CEF */, /*2404*/{0x10CB0,0x0,0x10CB0}/* 10CF0 */,/*2405*/{0x10CB1,0x0,0x10CB1}/* 10CF1 */, /*2406*/{0x10CB2,0x0,0x10CB2}/* 10CF2 */,/*2407*/{0x0,0x118C0,0x0}/* 118A0 */,/*2408*/{0x0,0x118C1,0x0}/* 118A1 */, /*2409*/{0x0,0x118C2,0x0}/* 118A2 */,/*2410*/{0x0,0x118C3,0x0}/* 118A3 */,/*2411*/{0x0,0x118C4,0x0}/* 118A4 */, /*2412*/{0x0,0x118C5,0x0}/* 118A5 */,/*2413*/{0x0,0x118C6,0x0}/* 118A6 */,/*2414*/{0x0,0x118C7,0x0}/* 118A7 */, /*2415*/{0x0,0x118C8,0x0}/* 118A8 */,/*2416*/{0x0,0x118C9,0x0}/* 118A9 */,/*2417*/{0x0,0x118CA,0x0}/* 118AA */, /*2418*/{0x0,0x118CB,0x0}/* 118AB */,/*2419*/{0x0,0x118CC,0x0}/* 118AC */,/*2420*/{0x0,0x118CD,0x0}/* 118AD */, /*2421*/{0x0,0x118CE,0x0}/* 118AE */,/*2422*/{0x0,0x118CF,0x0}/* 118AF */,/*2423*/{0x0,0x118D0,0x0}/* 118B0 */, /*2424*/{0x0,0x118D1,0x0}/* 118B1 */,/*2425*/{0x0,0x118D2,0x0}/* 118B2 */,/*2426*/{0x0,0x118D3,0x0}/* 118B3 */, /*2427*/{0x0,0x118D4,0x0}/* 118B4 */,/*2428*/{0x0,0x118D5,0x0}/* 118B5 */,/*2429*/{0x0,0x118D6,0x0}/* 118B6 */, /*2430*/{0x0,0x118D7,0x0}/* 118B7 */,/*2431*/{0x0,0x118D8,0x0}/* 118B8 */,/*2432*/{0x0,0x118D9,0x0}/* 118B9 */, /*2433*/{0x0,0x118DA,0x0}/* 118BA */,/*2434*/{0x0,0x118DB,0x0}/* 118BB */,/*2435*/{0x0,0x118DC,0x0}/* 118BC */, /*2436*/{0x0,0x118DD,0x0}/* 118BD */,/*2437*/{0x0,0x118DE,0x0}/* 118BE */,/*2438*/{0x0,0x118DF,0x0}/* 118BF */, /*2439*/{0x118A0,0x0,0x118A0}/* 118C0 */,/*2440*/{0x118A1,0x0,0x118A1}/* 118C1 */, /*2441*/{0x118A2,0x0,0x118A2}/* 118C2 */,/*2442*/{0x118A3,0x0,0x118A3}/* 118C3 */, /*2443*/{0x118A4,0x0,0x118A4}/* 118C4 */,/*2444*/{0x118A5,0x0,0x118A5}/* 118C5 */, /*2445*/{0x118A6,0x0,0x118A6}/* 118C6 */,/*2446*/{0x118A7,0x0,0x118A7}/* 118C7 */, /*2447*/{0x118A8,0x0,0x118A8}/* 118C8 */,/*2448*/{0x118A9,0x0,0x118A9}/* 118C9 */, /*2449*/{0x118AA,0x0,0x118AA}/* 118CA */,/*2450*/{0x118AB,0x0,0x118AB}/* 118CB */, /*2451*/{0x118AC,0x0,0x118AC}/* 118CC */,/*2452*/{0x118AD,0x0,0x118AD}/* 118CD */, /*2453*/{0x118AE,0x0,0x118AE}/* 118CE */,/*2454*/{0x118AF,0x0,0x118AF}/* 118CF */, /*2455*/{0x118B0,0x0,0x118B0}/* 118D0 */,/*2456*/{0x118B1,0x0,0x118B1}/* 118D1 */, /*2457*/{0x118B2,0x0,0x118B2}/* 118D2 */,/*2458*/{0x118B3,0x0,0x118B3}/* 118D3 */, /*2459*/{0x118B4,0x0,0x118B4}/* 118D4 */,/*2460*/{0x118B5,0x0,0x118B5}/* 118D5 */, /*2461*/{0x118B6,0x0,0x118B6}/* 118D6 */,/*2462*/{0x118B7,0x0,0x118B7}/* 118D7 */, /*2463*/{0x118B8,0x0,0x118B8}/* 118D8 */,/*2464*/{0x118B9,0x0,0x118B9}/* 118D9 */, /*2465*/{0x118BA,0x0,0x118BA}/* 118DA */,/*2466*/{0x118BB,0x0,0x118BB}/* 118DB */, /*2467*/{0x118BC,0x0,0x118BC}/* 118DC */,/*2468*/{0x118BD,0x0,0x118BD}/* 118DD */, /*2469*/{0x118BE,0x0,0x118BE}/* 118DE */,/*2470*/{0x118BF,0x0,0x118BF}/* 118DF */ }; static const MVMuint16 codepoint_bitfield_indexes[49764] = { /*0*/1/* 0000 */,/*1*/1/* 0001 */,/*2*/1/* 0002 */,/*3*/1/* 0003 */,/*4*/1/* 0004 */,/*5*/1/* 0005 */,/*6*/1/* 0006 */, /*7*/1/* 0007 */,/*8*/1/* 0008 */,/*9*/2/* 0009 */,/*10*/3/* 000A */,/*11*/4/* 000B */,/*12*/5/* 000C */, /*13*/6/* 000D */,/*14*/1/* 000E */,/*15*/1/* 000F */,/*16*/1/* 0010 */,/*17*/1/* 0011 */,/*18*/1/* 0012 */, /*19*/1/* 0013 */,/*20*/1/* 0014 */,/*21*/1/* 0015 */,/*22*/1/* 0016 */,/*23*/1/* 0017 */,/*24*/1/* 0018 */, /*25*/1/* 0019 */,/*26*/1/* 001A */,/*27*/1/* 001B */,/*28*/7/* 001C */,/*29*/7/* 001D */,/*30*/7/* 001E */, /*31*/8/* 001F */,/*32*/9/* 0020 */,/*33*/10/* 0021 */,/*34*/11/* 0022 */,/*35*/12/* 0023 */,/*36*/13/* 0024 */, /*37*/12/* 0025 */,/*38*/14/* 0026 */,/*39*/15/* 0027 */,/*40*/16/* 0028 */,/*41*/17/* 0029 */,/*42*/14/* 002A */, /*43*/18/* 002B */,/*44*/19/* 002C */,/*45*/20/* 002D */,/*46*/21/* 002E */,/*47*/22/* 002F */,/*48*/23/* 0030 */, /*49*/24/* 0031 */,/*50*/25/* 0032 */,/*51*/26/* 0033 */,/*52*/27/* 0034 */,/*53*/28/* 0035 */,/*54*/29/* 0036 */, /*55*/30/* 0037 */,/*56*/31/* 0038 */,/*57*/32/* 0039 */,/*58*/33/* 003A */,/*59*/34/* 003B */,/*60*/35/* 003C */, /*61*/36/* 003D */,/*62*/37/* 003E */,/*63*/10/* 003F */,/*64*/14/* 0040 */,/*65*/38/* 0041 */,/*66*/39/* 0042 */, /*67*/40/* 0043 */,/*68*/41/* 0044 */,/*69*/42/* 0045 */,/*70*/43/* 0046 */,/*71*/44/* 0047 */,/*72*/45/* 0048 */, /*73*/46/* 0049 */,/*74*/47/* 004A */,/*75*/48/* 004B */,/*76*/49/* 004C */,/*77*/50/* 004D */,/*78*/51/* 004E */, /*79*/52/* 004F */,/*80*/53/* 0050 */,/*81*/54/* 0051 */,/*82*/55/* 0052 */,/*83*/56/* 0053 */,/*84*/57/* 0054 */, /*85*/58/* 0055 */,/*86*/59/* 0056 */,/*87*/60/* 0057 */,/*88*/61/* 0058 */,/*89*/62/* 0059 */,/*90*/63/* 005A */, /*91*/64/* 005B */,/*92*/14/* 005C */,/*93*/65/* 005D */,/*94*/66/* 005E */,/*95*/67/* 005F */,/*96*/68/* 0060 */, /*97*/69/* 0061 */,/*98*/70/* 0062 */,/*99*/71/* 0063 */,/*100*/72/* 0064 */,/*101*/73/* 0065 */,/*102*/74/* 0066 */, /*103*/75/* 0067 */,/*104*/76/* 0068 */,/*105*/77/* 0069 */,/*106*/78/* 006A */,/*107*/79/* 006B */,/*108*/80/* 006C */, /*109*/81/* 006D */,/*110*/82/* 006E */,/*111*/83/* 006F */,/*112*/84/* 0070 */,/*113*/85/* 0071 */,/*114*/86/* 0072 */, /*115*/87/* 0073 */,/*116*/88/* 0074 */,/*117*/89/* 0075 */,/*118*/90/* 0076 */,/*119*/91/* 0077 */,/*120*/92/* 0078 */, /*121*/93/* 0079 */,/*122*/94/* 007A */,/*123*/95/* 007B */,/*124*/36/* 007C */,/*125*/96/* 007D */,/*126*/36/* 007E */, /*127*/1/* 007F */,/*128*/97/* 0080 */,/*129*/97/*0081 */,/*130*/97/* 0082 */,/*131*/97/* 0083 */,/*132*/97/* 0084 */, /*133*/98/* 0085 */,/*134*/97/* 0086 */,/*135*/97/* 0087 */,/*136*/97/* 0088 */,/*137*/97/* 0089 */,/*138*/97/* 008A */, /*139*/97/* 008B */,/*140*/97/* 008C */,/*141*/97/* 008D */,/*142*/97/* 008E */,/*143*/97/* 008F */,/*144*/97/* 0090 */, /*145*/97/* 0091 */,/*146*/97/* 0092 */,/*147*/97/* 0093 */,/*148*/97/* 0094 */,/*149*/97/* 0095 */,/*150*/97/* 0096 */, /*151*/97/* 0097 */,/*152*/97/* 0098 */,/*153*/97/* 0099 */,/*154*/97/* 009A */,/*155*/97/* 009B */,/*156*/97/* 009C */, /*157*/97/* 009D */,/*158*/97/* 009E */,/*159*/97/* 009F */,/*160*/99/* 00A0 */,/*161*/100/* 00A1 */, /*162*/101/* 00A2 */,/*163*/101/* 00A3 */,/*164*/101/* 00A4 */,/*165*/101/* 00A5 */,/*166*/102/* 00A6 */, /*167*/100/* 00A7 */,/*168*/103/* 00A8 */,/*169*/102/* 00A9 */,/*170*/104/* 00AA */,/*171*/105/* 00AB */, /*172*/106/* 00AC */,/*173*/107/* 00AD */,/*174*/102/* 00AE */,/*175*/108/* 00AF */,/*176*/109/* 00B0 */, /*177*/110/* 00B1 */,/*178*/111/* 00B2 */,/*179*/112/* 00B3 */,/*180*/113/* 00B4 */,/*181*/114/* 00B5 */, /*182*/100/* 00B6 */,/*183*/115/* 00B7 */,/*184*/116/* 00B8 */,/*185*/117/* 00B9 */,/*186*/118/* 00BA */, /*187*/119/* 00BB */,/*188*/120/* 00BC */,/*189*/121/* 00BD */,/*190*/122/* 00BE */,/*191*/100/* 00BF */, /*192*/123/* 00C0 */,/*193*/124/* 00C1 */,/*194*/125/* 00C2 */,/*195*/126/* 00C3 */,/*196*/127/* 00C4 */, /*197*/128/* 00C5 */,/*198*/129/* 00C6 */,/*199*/130/* 00C7 */,/*200*/131/* 00C8 */,/*201*/132/* 00C9 */, /*202*/133/* 00CA */,/*203*/134/* 00CB */,/*204*/135/* 00CC */,/*205*/136/* 00CD */,/*206*/137/* 00CE */, /*207*/138/* 00CF */,/*208*/139/* 00D0 */,/*209*/140/* 00D1 */,/*210*/141/* 00D2 */,/*211*/142/* 00D3 */, /*212*/143/* 00D4 */,/*213*/144/* 00D5 */,/*214*/145/* 00D6 */,/*215*/106/* 00D7 */,/*216*/146/* 00D8 */, /*217*/147/* 00D9 */,/*218*/148/* 00DA */,/*219*/149/* 00DB */,/*220*/150/* 00DC */,/*221*/151/* 00DD */, /*222*/152/* 00DE */,/*223*/153/* 00DF */,/*224*/154/* 00E0 */,/*225*/155/* 00E1 */,/*226*/156/* 00E2 */, /*227*/157/* 00E3 */,/*228*/158/* 00E4 */,/*229*/159/* 00E5 */,/*230*/160/* 00E6 */,/*231*/161/* 00E7 */, /*232*/162/* 00E8 */,/*233*/163/* 00E9 */,/*234*/164/* 00EA */,/*235*/165/* 00EB */,/*236*/166/* 00EC */, /*237*/167/* 00ED */,/*238*/168/* 00EE */,/*239*/169/* 00EF */,/*240*/170/* 00F0 */,/*241*/171/* 00F1 */, /*242*/172/* 00F2 */,/*243*/173/* 00F3 */,/*244*/174/* 00F4 */,/*245*/175/* 00F5 */,/*246*/176/* 00F6 */, /*247*/106/* 00F7 */,/*248*/177/* 00F8 */,/*249*/178/* 00F9 */,/*250*/179/* 00FA */,/*251*/180/* 00FB */, /*252*/181/* 00FC */,/*253*/182/* 00FD */,/*254*/183/* 00FE */,/*255*/184/* 00FF */,/*256*/185/* 0100 */, /*257*/186/* 0101 */,/*258*/187/* 0102 */,/*259*/188/* 0103 */,/*260*/189/* 0104 */,/*261*/190/* 0105 */, /*262*/191/* 0106 */,/*263*/192/* 0107 */,/*264*/193/* 0108 */,/*265*/194/* 0109 */,/*266*/195/* 010A */, /*267*/196/* 010B */,/*268*/197/* 010C */,/*269*/198/* 010D */,/*270*/199/* 010E */,/*271*/200/* 010F */, /*272*/201/* 0110 */,/*273*/202/* 0111 */,/*274*/203/* 0112 */,/*275*/204/* 0113 */,/*276*/205/* 0114 */, /*277*/206/* 0115 */,/*278*/207/* 0116 */,/*279*/208/* 0117 */,/*280*/209/* 0118 */,/*281*/210/* 0119 */, /*282*/211/* 011A */,/*283*/212/* 011B */,/*284*/213/* 011C */,/*285*/214/* 011D */,/*286*/215/* 011E */, /*287*/216/* 011F */,/*288*/217/* 0120 */,/*289*/218/* 0121 */,/*290*/219/* 0122 */,/*291*/220/* 0123 */, /*292*/221/* 0124 */,/*293*/222/* 0125 */,/*294*/223/* 0126 */,/*295*/224/* 0127 */,/*296*/225/* 0128 */, /*297*/226/* 0129 */,/*298*/227/* 012A */,/*299*/228/* 012B */,/*300*/229/* 012C */,/*301*/230/* 012D */, /*302*/231/* 012E */,/*303*/232/* 012F */,/*304*/233/* 0130 */,/*305*/234/* 0131 */,/*306*/235/* 0132 */, /*307*/236/* 0133 */,/*308*/237/* 0134 */,/*309*/238/* 0135 */,/*310*/239/* 0136 */,/*311*/240/* 0137 */, /*312*/241/* 0138 */,/*313*/242/* 0139 */,/*314*/243/* 013A */,/*315*/244/* 013B */,/*316*/245/* 013C */, /*317*/246/* 013D */,/*318*/247/* 013E */,/*319*/248/* 013F */,/*320*/249/* 0140 */,/*321*/250/* 0141 */, /*322*/251/* 0142 */,/*323*/252/* 0143 */,/*324*/253/* 0144 */,/*325*/254/* 0145 */,/*326*/255/* 0146 */, /*327*/256/* 0147 */,/*328*/257/* 0148 */,/*329*/258/* 0149 */,/*330*/259/* 014A */,/*331*/260/* 014B */, /*332*/261/* 014C */,/*333*/262/* 014D */,/*334*/263/* 014E */,/*335*/264/* 014F */,/*336*/265/* 0150 */, /*337*/266/* 0151 */,/*338*/267/* 0152 */,/*339*/268/* 0153 */,/*340*/269/* 0154 */,/*341*/270/* 0155 */, /*342*/271/* 0156 */,/*343*/272/* 0157 */,/*344*/273/* 0158 */,/*345*/274/* 0159 */,/*346*/275/* 015A */, /*347*/276/* 015B */,/*348*/277/* 015C */,/*349*/278/* 015D */,/*350*/279/* 015E */,/*351*/280/* 015F */, /*352*/281/* 0160 */,/*353*/282/* 0161 */,/*354*/283/* 0162 */,/*355*/284/* 0163 */,/*356*/285/* 0164 */, /*357*/286/* 0165 */,/*358*/287/* 0166 */,/*359*/288/* 0167 */,/*360*/289/* 0168 */,/*361*/290/* 0169 */, /*362*/291/* 016A */,/*363*/292/* 016B */,/*364*/293/* 016C */,/*365*/294/* 016D */,/*366*/295/* 016E */, /*367*/296/* 016F */,/*368*/297/* 0170 */,/*369*/298/* 0171 */,/*370*/299/* 0172 */,/*371*/300/* 0173 */, /*372*/301/* 0174 */,/*373*/302/* 0175 */,/*374*/303/* 0176 */,/*375*/304/* 0177 */,/*376*/305/* 0178 */, /*377*/306/* 0179 */,/*378*/307/* 017A */,/*379*/308/* 017B */,/*380*/309/* 017C */,/*381*/310/* 017D */, /*382*/311/* 017E */,/*383*/312/* 017F */,/*384*/313/* 0180 */,/*385*/314/* 0181 */,/*386*/315/* 0182 */, /*387*/316/* 0183 */,/*388*/317/* 0184 */,/*389*/318/* 0185 */,/*390*/319/* 0186 */,/*391*/320/* 0187 */, /*392*/321/* 0188 */,/*393*/322/* 0189 */,/*394*/323/* 018A */,/*395*/324/* 018B */,/*396*/325/* 018C */, /*397*/326/* 018D */,/*398*/327/* 018E */,/*399*/328/* 018F */,/*400*/329/* 0190 */,/*401*/330/* 0191 */, /*402*/331/* 0192 */,/*403*/332/* 0193 */,/*404*/333/* 0194 */,/*405*/334/* 0195 */,/*406*/335/* 0196 */, /*407*/336/* 0197 */,/*408*/337/* 0198 */,/*409*/338/* 0199 */,/*410*/339/* 019A */,/*411*/326/* 019B */, /*412*/340/* 019C */,/*413*/341/* 019D */,/*414*/342/* 019E */,/*415*/343/* 019F */,/*416*/344/* 01A0 */, /*417*/345/* 01A1 */,/*418*/346/* 01A2 */,/*419*/347/* 01A3 */,/*420*/348/* 01A4 */,/*421*/349/* 01A5 */, /*422*/350/* 01A6 */,/*423*/351/* 01A7 */,/*424*/352/* 01A8 */,/*425*/353/* 01A9 */,/*426*/326/* 01AA */, /*427*/326/* 01AB */,/*428*/354/* 01AC */,/*429*/355/* 01AD */,/*430*/356/* 01AE */,/*431*/357/* 01AF */, /*432*/358/* 01B0 */,/*433*/359/* 01B1 */,/*434*/360/* 01B2 */,/*435*/361/* 01B3 */,/*436*/362/* 01B4 */, /*437*/363/* 01B5 */,/*438*/364/* 01B6 */,/*439*/365/* 01B7 */,/*440*/366/* 01B8 */,/*441*/367/* 01B9 */, /*442*/326/* 01BA */,/*443*/368/* 01BB */,/*444*/369/* 01BC */,/*445*/370/* 01BD */,/*446*/326/* 01BE */, /*447*/371/* 01BF */,/*448*/368/* 01C0 */,/*449*/368/* 01C1 */,/*450*/368/* 01C2 */,/*451*/368/* 01C3 */, /*452*/372/* 01C4 */,/*453*/373/* 01C5 */,/*454*/374/* 01C6 */,/*455*/375/* 01C7 */,/*456*/376/* 01C8 */, /*457*/377/* 01C9 */,/*458*/378/* 01CA */,/*459*/379/* 01CB */,/*460*/380/* 01CC */,/*461*/381/* 01CD */, /*462*/382/* 01CE */,/*463*/383/* 01CF */,/*464*/384/* 01D0 */,/*465*/385/* 01D1 */,/*466*/386/* 01D2 */, /*467*/387/* 01D3 */,/*468*/388/* 01D4 */,/*469*/389/* 01D5 */,/*470*/390/* 01D6 */,/*471*/391/* 01D7 */, /*472*/392/* 01D8 */,/*473*/393/* 01D9 */,/*474*/394/* 01DA */,/*475*/395/* 01DB */,/*476*/396/* 01DC */, /*477*/397/* 01DD */,/*478*/398/* 01DE */,/*479*/399/* 01DF */,/*480*/400/* 01E0 */,/*481*/401/* 01E1 */, /*482*/402/* 01E2 */,/*483*/403/* 01E3 */,/*484*/404/* 01E4 */,/*485*/405/* 01E5 */,/*486*/406/* 01E6 */, /*487*/407/* 01E7 */,/*488*/408/* 01E8 */,/*489*/409/* 01E9 */,/*490*/410/* 01EA */,/*491*/411/* 01EB */, /*492*/412/* 01EC */,/*493*/413/* 01ED */,/*494*/414/* 01EE */,/*495*/415/* 01EF */,/*496*/416/* 01F0 */, /*497*/417/* 01F1 */,/*498*/418/* 01F2 */,/*499*/419/* 01F3 */,/*500*/420/* 01F4 */,/*501*/421/* 01F5 */, /*502*/422/* 01F6 */,/*503*/423/* 01F7 */,/*504*/424/* 01F8 */,/*505*/425/* 01F9 */,/*506*/426/* 01FA */, /*507*/427/* 01FB */,/*508*/428/* 01FC */,/*509*/429/* 01FD */,/*510*/430/* 01FE */,/*511*/431/* 01FF */, /*512*/432/* 0200 */,/*513*/433/* 0201 */,/*514*/434/* 0202 */,/*515*/435/* 0203 */,/*516*/436/* 0204 */, /*517*/437/* 0205 */,/*518*/438/* 0206 */,/*519*/439/* 0207 */,/*520*/440/* 0208 */,/*521*/441/* 0209 */, /*522*/442/* 020A */,/*523*/443/* 020B */,/*524*/444/* 020C */,/*525*/445/* 020D */,/*526*/446/* 020E */, /*527*/447/* 020F */,/*528*/448/* 0210 */,/*529*/449/* 0211 */,/*530*/450/* 0212 */,/*531*/451/* 0213 */, /*532*/452/* 0214 */,/*533*/453/* 0215 */,/*534*/454/* 0216 */,/*535*/455/* 0217 */,/*536*/456/* 0218 */, /*537*/457/* 0219 */,/*538*/458/* 021A */,/*539*/459/* 021B */,/*540*/460/* 021C */,/*541*/461/* 021D */, /*542*/462/* 021E */,/*543*/463/* 021F */,/*544*/464/* 0220 */,/*545*/465/* 0221 */,/*546*/466/* 0222 */, /*547*/467/* 0223 */,/*548*/468/* 0224 */,/*549*/469/* 0225 */,/*550*/470/* 0226 */,/*551*/471/* 0227 */, /*552*/472/* 0228 */,/*553*/473/* 0229 */,/*554*/474/* 022A */,/*555*/475/* 022B */,/*556*/476/* 022C */, /*557*/477/* 022D */,/*558*/478/* 022E */,/*559*/479/* 022F */,/*560*/480/* 0230 */,/*561*/481/* 0231 */, /*562*/482/* 0232 */,/*563*/483/* 0233 */,/*564*/465/* 0234 */,/*565*/465/* 0235 */,/*566*/465/* 0236 */, /*567*/484/* 0237 */,/*568*/484/* 0238 */,/*569*/484/* 0239 */,/*570*/485/* 023A */,/*571*/486/* 023B */, /*572*/487/* 023C */,/*573*/488/* 023D */,/*574*/489/* 023E */,/*575*/490/* 023F */,/*576*/491/* 0240 */, /*577*/492/* 0241 */,/*578*/493/* 0242 */,/*579*/494/* 0243 */,/*580*/495/* 0244 */,/*581*/496/* 0245 */, /*582*/497/* 0246 */,/*583*/498/* 0247 */,/*584*/499/* 0248 */,/*585*/500/* 0249 */,/*586*/501/* 024A */, /*587*/502/* 024B */,/*588*/503/* 024C */,/*589*/504/* 024D */,/*590*/505/* 024E */,/*591*/506/* 024F */, /*592*/507/* 0250 */,/*593*/508/* 0251 */,/*594*/509/* 0252 */,/*595*/510/* 0253 */,/*596*/511/* 0254 */, /*597*/512/* 0255 */,/*598*/513/* 0256 */,/*599*/514/* 0257 */,/*600*/512/* 0258 */,/*601*/515/* 0259 */, /*602*/512/* 025A */,/*603*/516/* 025B */,/*604*/517/* 025C */,/*605*/512/* 025D */,/*606*/512/* 025E */, /*607*/512/* 025F */,/*608*/518/* 0260 */,/*609*/519/* 0261 */,/*610*/512/* 0262 */,/*611*/520/* 0263 */, /*612*/512/* 0264 */,/*613*/521/* 0265 */,/*614*/522/* 0266 */,/*615*/512/* 0267 */,/*616*/523/* 0268 */, /*617*/524/* 0269 */,/*618*/512/* 026A */,/*619*/525/* 026B */,/*620*/526/* 026C */,/*621*/512/* 026D */, /*622*/512/* 026E */,/*623*/527/* 026F */,/*624*/512/* 0270 */,/*625*/528/* 0271 */,/*626*/529/* 0272 */, /*627*/512/* 0273 */,/*628*/512/* 0274 */,/*629*/530/* 0275 */,/*630*/512/* 0276 */,/*631*/512/* 0277 */, /*632*/512/* 0278 */,/*633*/512/* 0279 */,/*634*/512/* 027A */,/*635*/512/* 027B */,/*636*/512/* 027C */, /*637*/531/* 027D */,/*638*/512/* 027E */,/*639*/512/* 027F */,/*640*/532/* 0280 */,/*641*/512/* 0281 */, /*642*/512/* 0282 */,/*643*/533/* 0283 */,/*644*/512/* 0284 */,/*645*/512/* 0285 */,/*646*/512/* 0286 */, /*647*/534/* 0287 */,/*648*/535/* 0288 */,/*649*/536/* 0289 */,/*650*/537/* 028A */,/*651*/538/* 028B */, /*652*/539/* 028C */,/*653*/512/* 028D */,/*654*/512/* 028E */,/*655*/512/* 028F */,/*656*/512/* 0290 */, /*657*/512/* 0291 */,/*658*/540/* 0292 */,/*659*/512/* 0293 */,/*660*/541/* 0294 */,/*661*/512/* 0295 */, /*662*/512/* 0296 */,/*663*/512/* 0297 */,/*664*/512/* 0298 */,/*665*/512/* 0299 */,/*666*/512/* 029A */, /*667*/512/* 029B */,/*668*/512/* 029C */,/*669*/542/* 029D */,/*670*/543/* 029E */,/*671*/512/* 029F */, /*672*/512/* 02A0 */,/*673*/512/* 02A1 */,/*674*/512/* 02A2 */,/*675*/512/* 02A3 */,/*676*/512/* 02A4 */, /*677*/512/* 02A5 */,/*678*/512/* 02A6 */,/*679*/512/* 02A7 */,/*680*/512/* 02A8 */,/*681*/544/* 02A9 */, /*682*/544/* 02AA */,/*683*/544/* 02AB */,/*684*/544/* 02AC */,/*685*/544/* 02AD */,/*686*/545/* 02AE */, /*687*/545/* 02AF */,/*688*/546/* 02B0 */,/*689*/547/* 02B1 */,/*690*/548/* 02B2 */,/*691*/549/* 02B3 */, /*692*/550/* 02B4 */,/*693*/551/* 02B5 */,/*694*/552/* 02B6 */,/*695*/553/* 02B7 */,/*696*/554/* 02B8 */, /*697*/555/* 02B9 */,/*698*/555/* 02BA */,/*699*/556/* 02BB */,/*700*/556/* 02BC */,/*701*/556/* 02BD */, /*702*/556/* 02BE */,/*703*/556/* 02BF */,/*704*/557/* 02C0 */,/*705*/557/* 02C1 */,/*706*/558/* 02C2 */, /*707*/558/* 02C3 */,/*708*/558/* 02C4 */,/*709*/558/* 02C5 */,/*710*/555/* 02C6 */,/*711*/555/* 02C7 */, /*712*/555/* 02C8 */,/*713*/555/* 02C9 */,/*714*/555/* 02CA */,/*715*/555/* 02CB */,/*716*/555/* 02CC */, /*717*/555/* 02CD */,/*718*/555/* 02CE */,/*719*/555/* 02CF */,/*720*/559/* 02D0 */,/*721*/559/* 02D1 */, /*722*/558/* 02D2 */,/*723*/558/* 02D3 */,/*724*/558/* 02D4 */,/*725*/558/* 02D5 */,/*726*/558/* 02D6 */, /*727*/560/* 02D7 */,/*728*/561/* 02D8 */,/*729*/562/* 02D9 */,/*730*/563/* 02DA */,/*731*/564/* 02DB */, /*732*/565/* 02DC */,/*733*/566/* 02DD */,/*734*/558/* 02DE */,/*735*/567/* 02DF */,/*736*/568/* 02E0 */, /*737*/569/* 02E1 */,/*738*/570/* 02E2 */,/*739*/571/* 02E3 */,/*740*/572/* 02E4 */,/*741*/558/* 02E5 */, /*742*/558/* 02E6 */,/*743*/558/* 02E7 */,/*744*/558/* 02E8 */,/*745*/558/* 02E9 */,/*746*/573/* 02EA */, /*747*/573/* 02EB */,/*748*/574/* 02EC */,/*749*/567/* 02ED */,/*750*/575/* 02EE */,/*751*/576/* 02EF */, /*752*/576/* 02F0 */,/*753*/576/* 02F1 */,/*754*/576/* 02F2 */,/*755*/576/* 02F3 */,/*756*/576/* 02F4 */, /*757*/576/* 02F5 */,/*758*/576/* 02F6 */,/*759*/576/* 02F7 */,/*760*/576/* 02F8 */,/*761*/576/* 02F9 */, /*762*/576/* 02FA */,/*763*/576/* 02FB */,/*764*/576/* 02FC */,/*765*/576/* 02FD */,/*766*/576/* 02FE */, /*767*/576/* 02FF */,/*768*/577/* 0300 */,/*769*/577/* 0301 */,/*770*/577/* 0302 */,/*771*/577/* 0303 */, /*772*/577/* 0304 */,/*773*/578/* 0305 */,/*774*/577/* 0306 */,/*775*/577/* 0307 */,/*776*/577/* 0308 */, /*777*/577/* 0309 */,/*778*/577/* 030A */,/*779*/577/* 030B */,/*780*/577/* 030C */,/*781*/578/* 030D */, /*782*/578/* 030E */,/*783*/577/* 030F */,/*784*/578/* 0310 */,/*785*/577/* 0311 */,/*786*/578/* 0312 */, /*787*/577/* 0313 */,/*788*/577/* 0314 */,/*789*/579/* 0315 */,/*790*/580/* 0316 */,/*791*/580/* 0317 */, /*792*/580/* 0318 */,/*793*/580/* 0319 */,/*794*/579/* 031A */,/*795*/581/* 031B */,/*796*/580/* 031C */, /*797*/580/* 031D */,/*798*/580/* 031E */,/*799*/580/* 031F */,/*800*/580/* 0320 */,/*801*/582/* 0321 */, /*802*/582/* 0322 */,/*803*/583/* 0323 */,/*804*/583/* 0324 */,/*805*/583/* 0325 */,/*806*/583/* 0326 */, /*807*/584/* 0327 */,/*808*/584/* 0328 */,/*809*/580/* 0329 */,/*810*/580/* 032A */,/*811*/580/* 032B */, /*812*/580/* 032C */,/*813*/583/* 032D */,/*814*/583/* 032E */,/*815*/580/* 032F */,/*816*/583/* 0330 */, /*817*/583/* 0331 */,/*818*/580/* 0332 */,/*819*/580/* 0333 */,/*820*/585/* 0334 */,/*821*/585/* 0335 */, /*822*/585/* 0336 */,/*823*/585/* 0337 */,/*824*/586/* 0338 */,/*825*/580/* 0339 */,/*826*/580/* 033A */, /*827*/580/* 033B */,/*828*/580/* 033C */,/*829*/578/* 033D */,/*830*/578/* 033E */,/*831*/578/* 033F */, /*832*/587/* 0340 */,/*833*/588/* 0341 */,/*834*/577/* 0342 */,/*835*/589/* 0343 */,/*836*/590/* 0344 */, /*837*/591/* 0345 */,/*838*/592/* 0346 */,/*839*/593/* 0347 */,/*840*/593/* 0348 */,/*841*/593/* 0349 */, /*842*/592/* 034A */,/*843*/592/* 034B */,/*844*/592/* 034C */,/*845*/593/* 034D */,/*846*/593/* 034E */, /*847*/594/* 034F */,/*848*/595/* 0350 */,/*849*/595/* 0351 */,/*850*/595/* 0352 */,/*851*/596/* 0353 */, /*852*/596/* 0354 */,/*853*/596/* 0355 */,/*854*/596/* 0356 */,/*855*/595/* 0357 */,/*856*/597/* 0358 */, /*857*/598/* 0359 */,/*858*/598/* 035A */,/*859*/599/* 035B */,/*860*/600/* 035C */,/*861*/601/* 035D */, /*862*/601/* 035E */,/*863*/602/* 035F */,/*864*/603/* 0360 */,/*865*/603/* 0361 */,/*866*/604/* 0362 */, /*867*/605/* 0363 */,/*868*/605/* 0364 */,/*869*/605/* 0365 */,/*870*/605/* 0366 */,/*871*/605/* 0367 */, /*872*/605/* 0368 */,/*873*/605/* 0369 */,/*874*/605/* 036A */,/*875*/605/* 036B */,/*876*/605/* 036C */, /*877*/605/* 036D */,/*878*/605/* 036E */,/*879*/605/* 036F */,/*880*/606/* 0370 */,/*881*/607/* 0371 */, /*882*/608/* 0372 */,/*883*/609/* 0373 */,/*884*/610/* 0374 */,/*885*/611/* 0375 */,/*886*/612/* 0376 */, /*887*/613/* 0377 */,0,0,/*890*/614/* 037A */,/*891*/615/* 037B */,/*892*/616/* 037C */,/*893*/617/* 037D */, /*894*/618/* 037E */,/*895*/619/* 037F */,0,0,0,0,/*900*/620/* 0384 */,/*901*/621/* 0385 */,/*902*/622/* 0386 */, /*903*/623/* 0387 */,/*904*/624/* 0388 */,/*905*/625/* 0389 */,/*906*/626/* 038A */,0,/*908*/627/* 038C */,0, /*910*/628/* 038E */,/*911*/629/* 038F */,/*912*/630/* 0390 */,/*913*/631/* 0391 */,/*914*/632/* 0392 */, /*915*/633/* 0393 */,/*916*/634/* 0394 */,/*917*/635/* 0395 */,/*918*/636/* 0396 */,/*919*/637/* 0397 */, /*920*/638/* 0398 */,/*921*/639/* 0399 */,/*922*/640/* 039A */,/*923*/641/* 039B */,/*924*/642/* 039C */, /*925*/643/* 039D */,/*926*/644/* 039E */,/*927*/645/* 039F */,/*928*/646/* 03A0 */,/*929*/647/* 03A1 */,0, /*931*/648/* 03A3 */,/*932*/649/* 03A4 */,/*933*/650/* 03A5 */,/*934*/651/* 03A6 */,/*935*/652/* 03A7 */, /*936*/653/* 03A8 */,/*937*/654/* 03A9 */,/*938*/655/* 03AA */,/*939*/656/* 03AB */,/*940*/657/* 03AC */, /*941*/658/* 03AD */,/*942*/659/* 03AE */,/*943*/660/* 03AF */,/*944*/661/* 03B0 */,/*945*/662/* 03B1 */, /*946*/663/* 03B2 */,/*947*/664/* 03B3 */,/*948*/665/* 03B4 */,/*949*/666/* 03B5 */,/*950*/667/* 03B6 */, /*951*/668/* 03B7 */,/*952*/669/* 03B8 */,/*953*/670/* 03B9 */,/*954*/671/* 03BA */,/*955*/672/* 03BB */, /*956*/673/* 03BC */,/*957*/674/* 03BD */,/*958*/675/* 03BE */,/*959*/676/* 03BF */,/*960*/677/* 03C0 */, /*961*/678/* 03C1 */,/*962*/679/* 03C2 */,/*963*/680/* 03C3 */,/*964*/681/* 03C4 */,/*965*/682/* 03C5 */, /*966*/683/* 03C6 */,/*967*/684/* 03C7 */,/*968*/685/* 03C8 */,/*969*/686/* 03C9 */,/*970*/687/* 03CA */, /*971*/688/* 03CB */,/*972*/689/* 03CC */,/*973*/690/* 03CD */,/*974*/691/* 03CE */,/*975*/692/* 03CF */, /*976*/693/* 03D0 */,/*977*/694/* 03D1 */,/*978*/695/* 03D2 */,/*979*/696/* 03D3 */,/*980*/697/* 03D4 */, /*981*/698/* 03D5 */,/*982*/699/* 03D6 */,/*983*/700/* 03D7 */,/*984*/701/* 03D8 */,/*985*/702/* 03D9 */, /*986*/703/* 03DA */,/*987*/704/* 03DB */,/*988*/705/* 03DC */,/*989*/706/* 03DD */,/*990*/707/* 03DE */, /*991*/708/* 03DF */,/*992*/709/* 03E0 */,/*993*/710/* 03E1 */,/*994*/711/* 03E2 */,/*995*/712/* 03E3 */, /*996*/713/* 03E4 */,/*997*/714/* 03E5 */,/*998*/715/* 03E6 */,/*999*/716/* 03E7 */,/*1000*/717/* 03E8 */, /*1001*/718/* 03E9 */,/*1002*/719/* 03EA */,/*1003*/720/* 03EB */,/*1004*/721/* 03EC */,/*1005*/722/* 03ED */, /*1006*/723/* 03EE */,/*1007*/724/* 03EF */,/*1008*/725/* 03F0 */,/*1009*/726/* 03F1 */,/*1010*/727/* 03F2 */, /*1011*/728/* 03F3 */,/*1012*/729/* 03F4 */,/*1013*/730/* 03F5 */,/*1014*/731/* 03F6 */,/*1015*/732/* 03F7 */, /*1016*/733/* 03F8 */,/*1017*/734/* 03F9 */,/*1018*/735/* 03FA */,/*1019*/736/* 03FB */,/*1020*/737/* 03FC */, /*1021*/738/* 03FD */,/*1022*/739/* 03FE */,/*1023*/740/* 03FF */,/*1024*/741/* 0400 */,/*1025*/742/* 0401 */, /*1026*/743/* 0402 */,/*1027*/744/* 0403 */,/*1028*/745/* 0404 */,/*1029*/746/* 0405 */,/*1030*/747/* 0406 */, /*1031*/748/* 0407 */,/*1032*/749/* 0408 */,/*1033*/750/* 0409 */,/*1034*/751/* 040A */,/*1035*/752/* 040B */, /*1036*/753/* 040C */,/*1037*/754/* 040D */,/*1038*/755/* 040E */,/*1039*/756/* 040F */,/*1040*/757/* 0410 */, /*1041*/758/* 0411 */,/*1042*/759/* 0412 */,/*1043*/760/* 0413 */,/*1044*/761/* 0414 */,/*1045*/762/* 0415 */, /*1046*/763/* 0416 */,/*1047*/764/* 0417 */,/*1048*/765/* 0418 */,/*1049*/766/* 0419 */,/*1050*/767/* 041A */, /*1051*/768/* 041B */,/*1052*/769/* 041C */,/*1053*/770/* 041D */,/*1054*/771/* 041E */,/*1055*/772/* 041F */, /*1056*/773/* 0420 */,/*1057*/774/* 0421 */,/*1058*/775/* 0422 */,/*1059*/776/* 0423 */,/*1060*/777/* 0424 */, /*1061*/778/* 0425 */,/*1062*/779/* 0426 */,/*1063*/780/* 0427 */,/*1064*/781/* 0428 */,/*1065*/782/* 0429 */, /*1066*/783/* 042A */,/*1067*/784/* 042B */,/*1068*/785/* 042C */,/*1069*/786/* 042D */,/*1070*/787/* 042E */, /*1071*/788/* 042F */,/*1072*/789/* 0430 */,/*1073*/790/* 0431 */,/*1074*/791/* 0432 */,/*1075*/792/* 0433 */, /*1076*/793/* 0434 */,/*1077*/794/* 0435 */,/*1078*/795/* 0436 */,/*1079*/796/* 0437 */,/*1080*/797/* 0438 */, /*1081*/798/* 0439 */,/*1082*/799/* 043A */,/*1083*/800/* 043B */,/*1084*/801/* 043C */,/*1085*/802/* 043D */, /*1086*/803/* 043E */,/*1087*/804/* 043F */,/*1088*/805/* 0440 */,/*1089*/806/* 0441 */,/*1090*/807/* 0442 */, /*1091*/808/* 0443 */,/*1092*/809/* 0444 */,/*1093*/810/* 0445 */,/*1094*/811/* 0446 */,/*1095*/812/* 0447 */, /*1096*/813/* 0448 */,/*1097*/814/* 0449 */,/*1098*/815/* 044A */,/*1099*/816/* 044B */,/*1100*/817/* 044C */, /*1101*/818/* 044D */,/*1102*/819/* 044E */,/*1103*/820/* 044F */,/*1104*/821/* 0450 */,/*1105*/822/* 0451 */, /*1106*/823/* 0452 */,/*1107*/824/* 0453 */,/*1108*/825/* 0454 */,/*1109*/826/* 0455 */,/*1110*/827/* 0456 */, /*1111*/828/* 0457 */,/*1112*/829/* 0458 */,/*1113*/830/* 0459 */,/*1114*/831/* 045A */,/*1115*/832/* 045B */, /*1116*/833/* 045C */,/*1117*/834/* 045D */,/*1118*/835/* 045E */,/*1119*/836/* 045F */,/*1120*/837/* 0460 */, /*1121*/838/* 0461 */,/*1122*/839/* 0462 */,/*1123*/840/* 0463 */,/*1124*/841/* 0464 */,/*1125*/842/* 0465 */, /*1126*/843/* 0466 */,/*1127*/844/* 0467 */,/*1128*/845/* 0468 */,/*1129*/846/* 0469 */,/*1130*/847/* 046A */, /*1131*/848/* 046B */,/*1132*/849/* 046C */,/*1133*/850/* 046D */,/*1134*/851/* 046E */,/*1135*/852/* 046F */, /*1136*/853/* 0470 */,/*1137*/854/* 0471 */,/*1138*/855/* 0472 */,/*1139*/856/* 0473 */,/*1140*/857/* 0474 */, /*1141*/858/* 0475 */,/*1142*/859/* 0476 */,/*1143*/860/* 0477 */,/*1144*/861/* 0478 */,/*1145*/862/* 0479 */, /*1146*/863/* 047A */,/*1147*/864/* 047B */,/*1148*/865/* 047C */,/*1149*/866/* 047D */,/*1150*/867/* 047E */, /*1151*/868/* 047F */,/*1152*/869/* 0480 */,/*1153*/870/* 0481 */,/*1154*/871/* 0482 */,/*1155*/872/* 0483 */, /*1156*/872/* 0484 */,/*1157*/873/* 0485 */,/*1158*/873/* 0486 */,/*1159*/874/* 0487 */,/*1160*/875/* 0488 */, /*1161*/875/* 0489 */,/*1162*/876/* 048A */,/*1163*/877/* 048B */,/*1164*/878/* 048C */,/*1165*/879/* 048D */, /*1166*/880/* 048E */,/*1167*/881/* 048F */,/*1168*/882/* 0490 */,/*1169*/883/* 0491 */,/*1170*/884/* 0492 */, /*1171*/885/* 0493 */,/*1172*/886/* 0494 */,/*1173*/887/* 0495 */,/*1174*/888/* 0496 */,/*1175*/889/* 0497 */, /*1176*/890/* 0498 */,/*1177*/891/* 0499 */,/*1178*/892/* 049A */,/*1179*/893/* 049B */,/*1180*/894/* 049C */, /*1181*/895/* 049D */,/*1182*/896/* 049E */,/*1183*/897/* 049F */,/*1184*/898/* 04A0 */,/*1185*/899/* 04A1 */, /*1186*/900/* 04A2 */,/*1187*/901/* 04A3 */,/*1188*/902/* 04A4 */,/*1189*/903/* 04A5 */,/*1190*/904/* 04A6 */, /*1191*/905/* 04A7 */,/*1192*/906/* 04A8 */,/*1193*/907/* 04A9 */,/*1194*/908/* 04AA */,/*1195*/909/* 04AB */, /*1196*/910/* 04AC */,/*1197*/911/* 04AD */,/*1198*/912/* 04AE */,/*1199*/913/* 04AF */,/*1200*/914/* 04B0 */, /*1201*/915/* 04B1 */,/*1202*/916/* 04B2 */,/*1203*/917/* 04B3 */,/*1204*/918/* 04B4 */,/*1205*/919/* 04B5 */, /*1206*/920/* 04B6 */,/*1207*/921/* 04B7 */,/*1208*/922/* 04B8 */,/*1209*/923/* 04B9 */,/*1210*/924/* 04BA */, /*1211*/925/* 04BB */,/*1212*/926/* 04BC */,/*1213*/927/* 04BD */,/*1214*/928/* 04BE */,/*1215*/929/* 04BF */, /*1216*/930/* 04C0 */,/*1217*/931/* 04C1 */,/*1218*/932/* 04C2 */,/*1219*/933/* 04C3 */,/*1220*/934/* 04C4 */, /*1221*/935/* 04C5 */,/*1222*/936/* 04C6 */,/*1223*/937/* 04C7 */,/*1224*/938/* 04C8 */,/*1225*/939/* 04C9 */, /*1226*/940/* 04CA */,/*1227*/941/* 04CB */,/*1228*/942/* 04CC */,/*1229*/943/* 04CD */,/*1230*/944/* 04CE */, /*1231*/945/* 04CF */,/*1232*/946/* 04D0 */,/*1233*/947/* 04D1 */,/*1234*/948/* 04D2 */,/*1235*/949/* 04D3 */, /*1236*/950/* 04D4 */,/*1237*/951/* 04D5 */,/*1238*/952/* 04D6 */,/*1239*/953/* 04D7 */,/*1240*/954/* 04D8 */, /*1241*/955/* 04D9 */,/*1242*/956/* 04DA */,/*1243*/957/* 04DB */,/*1244*/958/* 04DC */,/*1245*/959/* 04DD */, /*1246*/960/* 04DE */,/*1247*/961/* 04DF */,/*1248*/962/* 04E0 */,/*1249*/963/* 04E1 */,/*1250*/964/* 04E2 */, /*1251*/965/* 04E3 */,/*1252*/966/* 04E4 */,/*1253*/967/* 04E5 */,/*1254*/968/* 04E6 */,/*1255*/969/* 04E7 */, /*1256*/970/* 04E8 */,/*1257*/971/* 04E9 */,/*1258*/972/* 04EA */,/*1259*/973/* 04EB */,/*1260*/974/* 04EC */, /*1261*/975/* 04ED */,/*1262*/976/* 04EE */,/*1263*/977/* 04EF */,/*1264*/978/* 04F0 */,/*1265*/979/* 04F1 */, /*1266*/980/* 04F2 */,/*1267*/981/* 04F3 */,/*1268*/982/* 04F4 */,/*1269*/983/* 04F5 */,/*1270*/984/* 04F6 */, /*1271*/985/* 04F7 */,/*1272*/986/* 04F8 */,/*1273*/987/* 04F9 */,/*1274*/988/* 04FA */,/*1275*/989/* 04FB */, /*1276*/990/* 04FC */,/*1277*/991/* 04FD */,/*1278*/992/* 04FE */,/*1279*/993/* 04FF */,/*1280*/994/* 0500 */, /*1281*/995/* 0501 */,/*1282*/996/* 0502 */,/*1283*/997/* 0503 */,/*1284*/998/* 0504 */,/*1285*/999/* 0505 */, /*1286*/1000/* 0506 */,/*1287*/1001/* 0507 */,/*1288*/1002/* 0508 */,/*1289*/1003/* 0509 */,/*1290*/1004/* 050A */, /*1291*/1005/* 050B */,/*1292*/1006/* 050C */,/*1293*/1007/* 050D */,/*1294*/1008/* 050E */,/*1295*/1009/* 050F */, /*1296*/1010/* 0510 */,/*1297*/1011/* 0511 */,/*1298*/1012/* 0512 */,/*1299*/1013/* 0513 */,/*1300*/1014/* 0514 */, /*1301*/1015/* 0515 */,/*1302*/1016/* 0516 */,/*1303*/1017/* 0517 */,/*1304*/1018/* 0518 */,/*1305*/1019/* 0519 */, /*1306*/1020/* 051A */,/*1307*/1021/* 051B */,/*1308*/1022/* 051C */,/*1309*/1023/* 051D */,/*1310*/1024/* 051E */, /*1311*/1025/* 051F */,/*1312*/1026/* 0520 */,/*1313*/1027/* 0521 */,/*1314*/1028/* 0522 */,/*1315*/1029/* 0523 */, /*1316*/1030/* 0524 */,/*1317*/1031/* 0525 */,/*1318*/1032/* 0526 */,/*1319*/1033/* 0527 */,/*1320*/1034/* 0528 */, /*1321*/1035/* 0529 */,/*1322*/1036/* 052A */,/*1323*/1037/* 052B */,/*1324*/1038/* 052C */,/*1325*/1039/* 052D */, /*1326*/1040/* 052E */,/*1327*/1041/* 052F */,0,/*1329*/1042/* 0531 */,/*1330*/1043/* 0532 */,/*1331*/1044/* 0533 */, /*1332*/1045/* 0534 */,/*1333*/1046/* 0535 */,/*1334*/1047/* 0536 */,/*1335*/1048/* 0537 */,/*1336*/1049/* 0538 */, /*1337*/1050/* 0539 */,/*1338*/1051/* 053A */,/*1339*/1052/* 053B */,/*1340*/1053/* 053C */,/*1341*/1054/* 053D */, /*1342*/1055/* 053E */,/*1343*/1056/* 053F */,/*1344*/1057/* 0540 */,/*1345*/1058/* 0541 */,/*1346*/1059/* 0542 */, /*1347*/1060/* 0543 */,/*1348*/1061/* 0544 */,/*1349*/1062/* 0545 */,/*1350*/1063/* 0546 */,/*1351*/1064/* 0547 */, /*1352*/1065/* 0548 */,/*1353*/1066/* 0549 */,/*1354*/1067/* 054A */,/*1355*/1068/* 054B */,/*1356*/1069/* 054C */, /*1357*/1070/* 054D */,/*1358*/1071/* 054E */,/*1359*/1072/* 054F */,/*1360*/1073/* 0550 */,/*1361*/1074/* 0551 */, /*1362*/1075/* 0552 */,/*1363*/1076/* 0553 */,/*1364*/1077/* 0554 */,/*1365*/1078/* 0555 */,/*1366*/1079/* 0556 */,0,0, /*1369*/1080/* 0559 */,/*1370*/1081/* 055A */,/*1371*/1081/* 055B */,/*1372*/1081/* 055C */,/*1373*/1082/* 055D */, /*1374*/1081/* 055E */,/*1375*/1081/* 055F */,0,/*1377*/1083/* 0561 */,/*1378*/1084/* 0562 */,/*1379*/1085/* 0563 */, /*1380*/1086/* 0564 */,/*1381*/1087/* 0565 */,/*1382*/1088/* 0566 */,/*1383*/1089/* 0567 */,/*1384*/1090/* 0568 */, /*1385*/1091/* 0569 */,/*1386*/1092/* 056A */,/*1387*/1093/* 056B */,/*1388*/1094/* 056C */,/*1389*/1095/* 056D */, /*1390*/1096/* 056E */,/*1391*/1097/* 056F */,/*1392*/1098/* 0570 */,/*1393*/1099/* 0571 */,/*1394*/1100/* 0572 */, /*1395*/1101/* 0573 */,/*1396*/1102/* 0574 */,/*1397*/1103/* 0575 */,/*1398*/1104/* 0576 */,/*1399*/1105/* 0577 */, /*1400*/1106/* 0578 */,/*1401*/1107/* 0579 */,/*1402*/1108/* 057A */,/*1403*/1109/* 057B */,/*1404*/1110/* 057C */, /*1405*/1111/* 057D */,/*1406*/1112/* 057E */,/*1407*/1113/* 057F */,/*1408*/1114/* 0580 */,/*1409*/1115/* 0581 */, /*1410*/1116/* 0582 */,/*1411*/1117/* 0583 */,/*1412*/1118/* 0584 */,/*1413*/1119/* 0585 */,/*1414*/1120/* 0586 */, /*1415*/1121/* 0587 */,0,/*1417*/1122/* 0589 */,/*1418*/1123/* 058A */,0,0,/*1421*/1124/* 058D */,/*1422*/1124/* 058E */, /*1423*/1125/* 058F */,0,/*1425*/1126/* 0591 */,/*1426*/1127/* 0592 */,/*1427*/1127/* 0593 */,/*1428*/1127/* 0594 */, /*1429*/1127/* 0595 */,/*1430*/1126/* 0596 */,/*1431*/1127/* 0597 */,/*1432*/1127/* 0598 */,/*1433*/1127/* 0599 */, /*1434*/1128/* 059A */,/*1435*/1126/* 059B */,/*1436*/1127/* 059C */,/*1437*/1127/* 059D */,/*1438*/1127/* 059E */, /*1439*/1127/* 059F */,/*1440*/1127/* 05A0 */,/*1441*/1127/* 05A1 */,/*1442*/1129/* 05A2 */,/*1443*/1126/* 05A3 */, /*1444*/1126/* 05A4 */,/*1445*/1126/* 05A5 */,/*1446*/1126/* 05A6 */,/*1447*/1126/* 05A7 */,/*1448*/1127/* 05A8 */, /*1449*/1127/* 05A9 */,/*1450*/1126/* 05AA */,/*1451*/1127/* 05AB */,/*1452*/1127/* 05AC */,/*1453*/1128/* 05AD */, /*1454*/1130/* 05AE */,/*1455*/1127/* 05AF */,/*1456*/1131/* 05B0 */,/*1457*/1132/* 05B1 */,/*1458*/1133/* 05B2 */, /*1459*/1134/* 05B3 */,/*1460*/1135/* 05B4 */,/*1461*/1136/* 05B5 */,/*1462*/1137/* 05B6 */,/*1463*/1138/* 05B7 */, /*1464*/1139/* 05B8 */,/*1465*/1140/* 05B9 */,/*1466*/1141/* 05BA */,/*1467*/1142/* 05BB */,/*1468*/1143/* 05BC */, /*1469*/1144/* 05BD */,/*1470*/1145/* 05BE */,/*1471*/1146/* 05BF */,/*1472*/1147/* 05C0 */,/*1473*/1148/* 05C1 */, /*1474*/1149/* 05C2 */,/*1475*/1150/* 05C3 */,/*1476*/1151/* 05C4 */,/*1477*/1152/* 05C5 */,/*1478*/1153/* 05C6 */, /*1479*/1154/* 05C7 */,0,0,0,0,0,0,0,0,/*1488*/1155/* 05D0 */,/*1489*/1155/* 05D1 */,/*1490*/1155/* 05D2 */, /*1491*/1155/* 05D3 */,/*1492*/1155/* 05D4 */,/*1493*/1155/* 05D5 */,/*1494*/1155/* 05D6 */,/*1495*/1155/* 05D7 */, /*1496*/1155/* 05D8 */,/*1497*/1155/* 05D9 */,/*1498*/1155/* 05DA */,/*1499*/1155/* 05DB */,/*1500*/1155/* 05DC */, /*1501*/1155/* 05DD */,/*1502*/1155/* 05DE */,/*1503*/1155/* 05DF */,/*1504*/1155/* 05E0 */,/*1505*/1155/* 05E1 */, /*1506*/1155/* 05E2 */,/*1507*/1155/* 05E3 */,/*1508*/1155/* 05E4 */,/*1509*/1155/* 05E5 */,/*1510*/1155/* 05E6 */, /*1511*/1155/* 05E7 */,/*1512*/1155/* 05E8 */,/*1513*/1155/* 05E9 */,/*1514*/1155/* 05EA */,0,0,0,0,0, /*1520*/1155/* 05F0 */,/*1521*/1155/* 05F1 */,/*1522*/1155/* 05F2 */,/*1523*/1156/* 05F3 */,/*1524*/1157/* 05F4 */,0,0,0, 0,0,0,0,0,0,0,0,/*1536*/1158/* 0600 */,/*1537*/1158/* 0601 */,/*1538*/1158/* 0602 */,/*1539*/1158/* 0603 */, /*1540*/1159/* 0604 */,/*1541*/1160/* 0605 */,/*1542*/1161/* 0606 */,/*1543*/1161/* 0607 */,/*1544*/1162/* 0608 */, /*1545*/1163/* 0609 */,/*1546*/1163/* 060A */,/*1547*/1164/* 060B */,/*1548*/1165/* 060C */,/*1549*/1166/* 060D */, /*1550*/1167/* 060E */,/*1551*/1167/* 060F */,/*1552*/1168/* 0610 */,/*1553*/1168/* 0611 */,/*1554*/1168/* 0612 */, /*1555*/1168/* 0613 */,/*1556*/1168/* 0614 */,/*1557*/1168/* 0615 */,/*1558*/1169/* 0616 */,/*1559*/1169/* 0617 */, /*1560*/1170/* 0618 */,/*1561*/1171/* 0619 */,/*1562*/1172/* 061A */,/*1563*/1173/* 061B */,/*1564*/1174/* 061C */,0, /*1566*/1175/* 061E */,/*1567*/1176/* 061F */,/*1568*/1177/* 0620 */,/*1569*/1178/* 0621 */,/*1570*/1179/* 0622 */, /*1571*/1180/* 0623 */,/*1572*/1181/* 0624 */,/*1573*/1182/* 0625 */,/*1574*/1183/* 0626 */,/*1575*/1184/* 0627 */, /*1576*/1185/* 0628 */,/*1577*/1186/* 0629 */,/*1578*/1185/* 062A */,/*1579*/1185/* 062B */,/*1580*/1187/* 062C */, /*1581*/1187/* 062D */,/*1582*/1187/* 062E */,/*1583*/1188/* 062F */,/*1584*/1188/* 0630 */,/*1585*/1189/* 0631 */, /*1586*/1189/* 0632 */,/*1587*/1190/* 0633 */,/*1588*/1190/* 0634 */,/*1589*/1191/* 0635 */,/*1590*/1191/* 0636 */, /*1591*/1192/* 0637 */,/*1592*/1192/* 0638 */,/*1593*/1193/* 0639 */,/*1594*/1193/* 063A */,/*1595*/1194/* 063B */, /*1596*/1194/* 063C */,/*1597*/1195/* 063D */,/*1598*/1195/* 063E */,/*1599*/1195/* 063F */,/*1600*/1196/* 0640 */, /*1601*/1197/* 0641 */,/*1602*/1198/* 0642 */,/*1603*/1199/* 0643 */,/*1604*/1200/* 0644 */,/*1605*/1201/* 0645 */, /*1606*/1202/* 0646 */,/*1607*/1203/* 0647 */,/*1608*/1204/* 0648 */,/*1609*/1205/* 0649 */,/*1610*/1205/* 064A */, /*1611*/1206/* 064B */,/*1612*/1207/* 064C */,/*1613*/1208/* 064D */,/*1614*/1209/* 064E */,/*1615*/1210/* 064F */, /*1616*/1211/* 0650 */,/*1617*/1212/* 0651 */,/*1618*/1213/* 0652 */,/*1619*/1214/* 0653 */,/*1620*/1214/* 0654 */, /*1621*/1215/* 0655 */,/*1622*/1216/* 0656 */,/*1623*/1217/* 0657 */,/*1624*/1218/* 0658 */,/*1625*/1219/* 0659 */, /*1626*/1219/* 065A */,/*1627*/1219/* 065B */,/*1628*/1220/* 065C */,/*1629*/1219/* 065D */,/*1630*/1219/* 065E */, /*1631*/1221/* 065F */,/*1632*/1222/* 0660 */,/*1633*/1223/* 0661 */,/*1634*/1224/* 0662 */,/*1635*/1225/* 0663 */, /*1636*/1226/* 0664 */,/*1637*/1227/* 0665 */,/*1638*/1228/* 0666 */,/*1639*/1229/* 0667 */,/*1640*/1230/* 0668 */, /*1641*/1231/* 0669 */,/*1642*/1232/* 066A */,/*1643*/1233/* 066B */,/*1644*/1234/* 066C */,/*1645*/1235/* 066D */, /*1646*/1236/* 066E */,/*1647*/1237/* 066F */,/*1648*/1238/* 0670 */,/*1649*/1184/* 0671 */,/*1650*/1184/* 0672 */, /*1651*/1239/* 0673 */,/*1652*/1178/* 0674 */,/*1653*/1240/* 0675 */,/*1654*/1241/* 0676 */,/*1655*/1242/* 0677 */, /*1656*/1243/* 0678 */,/*1657*/1185/* 0679 */,/*1658*/1185/* 067A */,/*1659*/1185/* 067B */,/*1660*/1185/* 067C */, /*1661*/1185/* 067D */,/*1662*/1185/* 067E */,/*1663*/1185/* 067F */,/*1664*/1185/* 0680 */,/*1665*/1187/* 0681 */, /*1666*/1187/* 0682 */,/*1667*/1187/* 0683 */,/*1668*/1187/* 0684 */,/*1669*/1187/* 0685 */,/*1670*/1187/* 0686 */, /*1671*/1187/* 0687 */,/*1672*/1188/* 0688 */,/*1673*/1188/* 0689 */,/*1674*/1188/* 068A */,/*1675*/1188/* 068B */, /*1676*/1188/* 068C */,/*1677*/1188/* 068D */,/*1678*/1188/* 068E */,/*1679*/1188/* 068F */,/*1680*/1188/* 0690 */, /*1681*/1189/* 0691 */,/*1682*/1189/* 0692 */,/*1683*/1189/* 0693 */,/*1684*/1189/* 0694 */,/*1685*/1189/* 0695 */, /*1686*/1189/* 0696 */,/*1687*/1189/* 0697 */,/*1688*/1189/* 0698 */,/*1689*/1189/* 0699 */,/*1690*/1190/* 069A */, /*1691*/1190/* 069B */,/*1692*/1190/* 069C */,/*1693*/1191/* 069D */,/*1694*/1191/* 069E */,/*1695*/1192/* 069F */, /*1696*/1193/* 06A0 */,/*1697*/1197/* 06A1 */,/*1698*/1197/* 06A2 */,/*1699*/1197/* 06A3 */,/*1700*/1197/* 06A4 */, /*1701*/1197/* 06A5 */,/*1702*/1197/* 06A6 */,/*1703*/1198/* 06A7 */,/*1704*/1198/* 06A8 */,/*1705*/1244/* 06A9 */, /*1706*/1245/* 06AA */,/*1707*/1244/* 06AB */,/*1708*/1199/* 06AC */,/*1709*/1199/* 06AD */,/*1710*/1199/* 06AE */, /*1711*/1244/* 06AF */,/*1712*/1244/* 06B0 */,/*1713*/1244/* 06B1 */,/*1714*/1244/* 06B2 */,/*1715*/1244/* 06B3 */, /*1716*/1244/* 06B4 */,/*1717*/1200/* 06B5 */,/*1718*/1200/* 06B6 */,/*1719*/1200/* 06B7 */,/*1720*/1246/* 06B8 */, /*1721*/1247/* 06B9 */,/*1722*/1202/* 06BA */,/*1723*/1202/* 06BB */,/*1724*/1202/* 06BC */,/*1725*/1248/* 06BD */, /*1726*/1249/* 06BE */,/*1727*/1250/* 06BF */,/*1728*/1251/* 06C0 */,/*1729*/1252/* 06C1 */,/*1730*/1253/* 06C2 */, /*1731*/1254/* 06C3 */,/*1732*/1204/* 06C4 */,/*1733*/1204/* 06C5 */,/*1734*/1204/* 06C6 */,/*1735*/1204/* 06C7 */, /*1736*/1204/* 06C8 */,/*1737*/1204/* 06C9 */,/*1738*/1204/* 06CA */,/*1739*/1204/* 06CB */,/*1740*/1255/* 06CC */, /*1741*/1256/* 06CD */,/*1742*/1255/* 06CE */,/*1743*/1257/* 06CF */,/*1744*/1205/* 06D0 */,/*1745*/1205/* 06D1 */, /*1746*/1258/* 06D2 */,/*1747*/1259/* 06D3 */,/*1748*/1260/* 06D4 */,/*1749*/1186/* 06D5 */,/*1750*/1261/* 06D6 */, /*1751*/1261/* 06D7 */,/*1752*/1261/* 06D8 */,/*1753*/1261/* 06D9 */,/*1754*/1261/* 06DA */,/*1755*/1261/* 06DB */, /*1756*/1261/* 06DC */,/*1757*/1262/* 06DD */,/*1758*/1263/* 06DE */,/*1759*/1264/* 06DF */,/*1760*/1264/* 06E0 */, /*1761*/1261/* 06E1 */,/*1762*/1261/* 06E2 */,/*1763*/1265/* 06E3 */,/*1764*/1261/* 06E4 */,/*1765*/1266/* 06E5 */, /*1766*/1266/* 06E6 */,/*1767*/1261/* 06E7 */,/*1768*/1261/* 06E8 */,/*1769*/1263/* 06E9 */,/*1770*/1267/* 06EA */, /*1771*/1264/* 06EB */,/*1772*/1264/* 06EC */,/*1773*/1265/* 06ED */,/*1774*/1268/* 06EE */,/*1775*/1269/* 06EF */, /*1776*/1270/* 06F0 */,/*1777*/1271/* 06F1 */,/*1778*/1272/* 06F2 */,/*1779*/1273/* 06F3 */,/*1780*/1274/* 06F4 */, /*1781*/1275/* 06F5 */,/*1782*/1276/* 06F6 */,/*1783*/1277/* 06F7 */,/*1784*/1278/* 06F8 */,/*1785*/1279/* 06F9 */, /*1786*/1280/* 06FA */,/*1787*/1281/* 06FB */,/*1788*/1282/* 06FC */,/*1789*/1283/* 06FD */,/*1790*/1283/* 06FE */, /*1791*/1284/* 06FF */,/*1792*/1285/* 0700 */,/*1793*/1285/* 0701 */,/*1794*/1285/* 0702 */,/*1795*/1286/* 0703 */, /*1796*/1286/* 0704 */,/*1797*/1286/* 0705 */,/*1798*/1286/* 0706 */,/*1799*/1286/* 0707 */,/*1800*/1286/* 0708 */, /*1801*/1286/* 0709 */,/*1802*/1286/* 070A */,/*1803*/1287/* 070B */,/*1804*/1286/* 070C */,/*1805*/1287/* 070D */,0, /*1807*/1288/* 070F */,/*1808*/1289/* 0710 */,/*1809*/1290/* 0711 */,/*1810*/1291/* 0712 */,/*1811*/1292/* 0713 */, /*1812*/1292/* 0714 */,/*1813*/1293/* 0715 */,/*1814*/1293/* 0716 */,/*1815*/1294/* 0717 */,/*1816*/1295/* 0718 */, /*1817*/1296/* 0719 */,/*1818*/1297/* 071A */,/*1819*/1298/* 071B */,/*1820*/1298/* 071C */,/*1821*/1299/* 071D */, /*1822*/1300/* 071E */,/*1823*/1301/* 071F */,/*1824*/1302/* 0720 */,/*1825*/1303/* 0721 */,/*1826*/1304/* 0722 */, /*1827*/1305/* 0723 */,/*1828*/1306/* 0724 */,/*1829*/1307/* 0725 */,/*1830*/1308/* 0726 */,/*1831*/1309/* 0727 */, /*1832*/1310/* 0728 */,/*1833*/1311/* 0729 */,/*1834*/1293/* 072A */,/*1835*/1312/* 072B */,/*1836*/1313/* 072C */, /*1837*/1314/* 072D */,/*1838*/1315/* 072E */,/*1839*/1316/* 072F */,/*1840*/1317/* 0730 */,/*1841*/1318/* 0731 */, /*1842*/1317/* 0732 */,/*1843*/1317/* 0733 */,/*1844*/1318/* 0734 */,/*1845*/1317/* 0735 */,/*1846*/1317/* 0736 */, /*1847*/1318/* 0737 */,/*1848*/1318/* 0738 */,/*1849*/1318/* 0739 */,/*1850*/1317/* 073A */,/*1851*/1318/* 073B */, /*1852*/1318/* 073C */,/*1853*/1317/* 073D */,/*1854*/1318/* 073E */,/*1855*/1317/* 073F */,/*1856*/1319/* 0740 */, /*1857*/1319/* 0741 */,/*1858*/1320/* 0742 */,/*1859*/1319/* 0743 */,/*1860*/1320/* 0744 */,/*1861*/1319/* 0745 */, /*1862*/1320/* 0746 */,/*1863*/1319/* 0747 */,/*1864*/1320/* 0748 */,/*1865*/1319/* 0749 */,/*1866*/1319/* 074A */,0,0, /*1869*/1321/* 074D */,/*1870*/1322/* 074E */,/*1871*/1323/* 074F */,/*1872*/1324/* 0750 */,/*1873*/1324/* 0751 */, /*1874*/1324/* 0752 */,/*1875*/1324/* 0753 */,/*1876*/1324/* 0754 */,/*1877*/1324/* 0755 */,/*1878*/1324/* 0756 */, /*1879*/1325/* 0757 */,/*1880*/1325/* 0758 */,/*1881*/1326/* 0759 */,/*1882*/1326/* 075A */,/*1883*/1327/* 075B */, /*1884*/1328/* 075C */,/*1885*/1329/* 075D */,/*1886*/1329/* 075E */,/*1887*/1329/* 075F */,/*1888*/1330/* 0760 */, /*1889*/1330/* 0761 */,/*1890*/1331/* 0762 */,/*1891*/1331/* 0763 */,/*1892*/1331/* 0764 */,/*1893*/1332/* 0765 */, /*1894*/1332/* 0766 */,/*1895*/1333/* 0767 */,/*1896*/1333/* 0768 */,/*1897*/1333/* 0769 */,/*1898*/1334/* 076A */, /*1899*/1327/* 076B */,/*1900*/1327/* 076C */,/*1901*/1328/* 076D */,/*1902*/1335/* 076E */,/*1903*/1335/* 076F */, /*1904*/1336/* 0770 */,/*1905*/1337/* 0771 */,/*1906*/1335/* 0772 */,/*1907*/1338/* 0773 */,/*1908*/1338/* 0774 */, /*1909*/1339/* 0775 */,/*1910*/1339/* 0776 */,/*1911*/1340/* 0777 */,/*1912*/1341/* 0778 */,/*1913*/1341/* 0779 */, /*1914*/1342/* 077A */,/*1915*/1342/* 077B */,/*1916*/1335/* 077C */,/*1917*/1336/* 077D */,/*1918*/1336/* 077E */, /*1919*/1343/* 077F */,/*1920*/1344/* 0780 */,/*1921*/1344/* 0781 */,/*1922*/1344/* 0782 */,/*1923*/1344/* 0783 */, /*1924*/1344/* 0784 */,/*1925*/1344/* 0785 */,/*1926*/1344/* 0786 */,/*1927*/1344/* 0787 */,/*1928*/1344/* 0788 */, /*1929*/1344/* 0789 */,/*1930*/1344/* 078A */,/*1931*/1344/* 078B */,/*1932*/1344/* 078C */,/*1933*/1344/* 078D */, /*1934*/1344/* 078E */,/*1935*/1344/* 078F */,/*1936*/1344/* 0790 */,/*1937*/1344/* 0791 */,/*1938*/1344/* 0792 */, /*1939*/1344/* 0793 */,/*1940*/1344/* 0794 */,/*1941*/1344/* 0795 */,/*1942*/1344/* 0796 */,/*1943*/1344/* 0797 */, /*1944*/1344/* 0798 */,/*1945*/1344/* 0799 */,/*1946*/1344/* 079A */,/*1947*/1344/* 079B */,/*1948*/1344/* 079C */, /*1949*/1344/* 079D */,/*1950*/1344/* 079E */,/*1951*/1344/* 079F */,/*1952*/1344/* 07A0 */,/*1953*/1344/* 07A1 */, /*1954*/1344/* 07A2 */,/*1955*/1344/* 07A3 */,/*1956*/1344/* 07A4 */,/*1957*/1344/* 07A5 */,/*1958*/1345/* 07A6 */, /*1959*/1345/* 07A7 */,/*1960*/1345/* 07A8 */,/*1961*/1345/* 07A9 */,/*1962*/1345/* 07AA */,/*1963*/1345/* 07AB */, /*1964*/1345/* 07AC */,/*1965*/1345/* 07AD */,/*1966*/1345/* 07AE */,/*1967*/1345/* 07AF */,/*1968*/1345/* 07B0 */, /*1969*/1346/* 07B1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*1984*/1347/* 07C0 */,/*1985*/1348/* 07C1 */,/*1986*/1349/* 07C2 */, /*1987*/1350/* 07C3 */,/*1988*/1351/* 07C4 */,/*1989*/1352/* 07C5 */,/*1990*/1353/* 07C6 */,/*1991*/1354/* 07C7 */, /*1992*/1355/* 07C8 */,/*1993*/1356/* 07C9 */,/*1994*/1357/* 07CA */,/*1995*/1357/* 07CB */,/*1996*/1357/* 07CC */, /*1997*/1357/* 07CD */,/*1998*/1357/* 07CE */,/*1999*/1357/* 07CF */,/*2000*/1357/* 07D0 */,/*2001*/1357/* 07D1 */, /*2002*/1357/* 07D2 */,/*2003*/1357/* 07D3 */,/*2004*/1357/* 07D4 */,/*2005*/1357/* 07D5 */,/*2006*/1357/* 07D6 */, /*2007*/1357/* 07D7 */,/*2008*/1357/* 07D8 */,/*2009*/1357/* 07D9 */,/*2010*/1357/* 07DA */,/*2011*/1357/* 07DB */, /*2012*/1357/* 07DC */,/*2013*/1357/* 07DD */,/*2014*/1357/* 07DE */,/*2015*/1357/* 07DF */,/*2016*/1357/* 07E0 */, /*2017*/1357/* 07E1 */,/*2018*/1357/* 07E2 */,/*2019*/1357/* 07E3 */,/*2020*/1357/* 07E4 */,/*2021*/1357/* 07E5 */, /*2022*/1357/* 07E6 */,/*2023*/1357/* 07E7 */,/*2024*/1357/* 07E8 */,/*2025*/1357/* 07E9 */,/*2026*/1357/* 07EA */, /*2027*/1358/* 07EB */,/*2028*/1358/* 07EC */,/*2029*/1358/* 07ED */,/*2030*/1358/* 07EE */,/*2031*/1358/* 07EF */, /*2032*/1358/* 07F0 */,/*2033*/1358/* 07F1 */,/*2034*/1359/* 07F2 */,/*2035*/1358/* 07F3 */,/*2036*/1360/* 07F4 */, /*2037*/1360/* 07F5 */,/*2038*/1361/* 07F6 */,/*2039*/1362/* 07F7 */,/*2040*/1363/* 07F8 */,/*2041*/1364/* 07F9 */, /*2042*/1365/* 07FA */,0,0,0,0,0,/*2048*/1366/* 0800 */,/*2049*/1366/* 0801 */,/*2050*/1366/* 0802 */, /*2051*/1366/* 0803 */,/*2052*/1366/* 0804 */,/*2053*/1366/* 0805 */,/*2054*/1366/* 0806 */,/*2055*/1366/* 0807 */, /*2056*/1366/* 0808 */,/*2057*/1366/* 0809 */,/*2058*/1366/* 080A */,/*2059*/1366/* 080B */,/*2060*/1366/* 080C */, /*2061*/1366/* 080D */,/*2062*/1366/* 080E */,/*2063*/1366/* 080F */,/*2064*/1366/* 0810 */,/*2065*/1366/* 0811 */, /*2066*/1366/* 0812 */,/*2067*/1366/* 0813 */,/*2068*/1366/* 0814 */,/*2069*/1366/* 0815 */,/*2070*/1367/* 0816 */, /*2071*/1367/* 0817 */,/*2072*/1368/* 0818 */,/*2073*/1368/* 0819 */,/*2074*/1369/* 081A */,/*2075*/1367/* 081B */, /*2076*/1367/* 081C */,/*2077*/1367/* 081D */,/*2078*/1367/* 081E */,/*2079*/1367/* 081F */,/*2080*/1367/* 0820 */, /*2081*/1367/* 0821 */,/*2082*/1367/* 0822 */,/*2083*/1367/* 0823 */,/*2084*/1369/* 0824 */,/*2085*/1367/* 0825 */, /*2086*/1367/* 0826 */,/*2087*/1367/* 0827 */,/*2088*/1369/* 0828 */,/*2089*/1367/* 0829 */,/*2090*/1367/* 082A */, /*2091*/1367/* 082B */,/*2092*/1367/* 082C */,/*2093*/1370/* 082D */,0,0,/*2096*/1371/* 0830 */,/*2097*/1371/* 0831 */, /*2098*/1371/* 0832 */,/*2099*/1371/* 0833 */,/*2100*/1371/* 0834 */,/*2101*/1371/* 0835 */,/*2102*/1371/* 0836 */, /*2103*/1371/* 0837 */,/*2104*/1371/* 0838 */,/*2105*/1371/* 0839 */,/*2106*/1371/* 083A */,/*2107*/1371/* 083B */, /*2108*/1371/* 083C */,/*2109*/1371/* 083D */,/*2110*/1371/* 083E */,0,/*2112*/1372/* 0840 */,/*2113*/1373/* 0841 */, /*2114*/1373/* 0842 */,/*2115*/1373/* 0843 */,/*2116*/1373/* 0844 */,/*2117*/1373/* 0845 */,/*2118*/1372/* 0846 */, /*2119*/1372/* 0847 */,/*2120*/1373/* 0848 */,/*2121*/1372/* 0849 */,/*2122*/1373/* 084A */,/*2123*/1373/* 084B */, /*2124*/1373/* 084C */,/*2125*/1373/* 084D */,/*2126*/1373/* 084E */,/*2127*/1373/* 084F */,/*2128*/1373/* 0850 */, /*2129*/1373/* 0851 */,/*2130*/1373/* 0852 */,/*2131*/1373/* 0853 */,/*2132*/1372/* 0854 */,/*2133*/1373/* 0855 */, /*2134*/1374/* 0856 */,/*2135*/1374/* 0857 */,/*2136*/1374/* 0858 */,/*2137*/1375/* 0859 */,/*2138*/1375/* 085A */, /*2139*/1375/* 085B */,0,0,/*2142*/1376/* 085E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*2208*/1377/* 08A0 */,/*2209*/1378/* 08A1 */, /*2210*/1379/* 08A2 */,/*2211*/1380/* 08A3 */,/*2212*/1381/* 08A4 */,/*2213*/1382/* 08A5 */,/*2214*/1383/* 08A6 */, /*2215*/1384/* 08A7 */,/*2216*/1385/* 08A8 */,/*2217*/1385/* 08A9 */,/*2218*/1386/* 08AA */,/*2219*/1387/* 08AB */, /*2220*/1388/* 08AC */,/*2221*/1389/* 08AD */,/*2222*/1390/* 08AE */,/*2223*/1391/* 08AF */,/*2224*/1392/* 08B0 */, /*2225*/1393/* 08B1 */,/*2226*/1394/* 08B2 */,/*2227*/1395/* 08B3 */,/*2228*/1396/* 08B4 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*2275*/1397/* 08E3 */,/*2276*/1398/* 08E4 */, /*2277*/1398/* 08E5 */,/*2278*/1399/* 08E6 */,/*2279*/1398/* 08E7 */,/*2280*/1398/* 08E8 */,/*2281*/1399/* 08E9 */, /*2282*/1400/* 08EA */,/*2283*/1400/* 08EB */,/*2284*/1400/* 08EC */,/*2285*/1401/* 08ED */,/*2286*/1401/* 08EE */, /*2287*/1401/* 08EF */,/*2288*/1402/* 08F0 */,/*2289*/1403/* 08F1 */,/*2290*/1404/* 08F2 */,/*2291*/1398/* 08F3 */, /*2292*/1398/* 08F4 */,/*2293*/1398/* 08F5 */,/*2294*/1399/* 08F6 */,/*2295*/1398/* 08F7 */,/*2296*/1398/* 08F8 */, /*2297*/1399/* 08F9 */,/*2298*/1399/* 08FA */,/*2299*/1398/* 08FB */,/*2300*/1398/* 08FC */,/*2301*/1398/* 08FD */, /*2302*/1398/* 08FE */,/*2303*/1405/* 08FF */,/*2304*/1406/* 0900 */,/*2305*/1407/* 0901 */,/*2306*/1407/* 0902 */, /*2307*/1408/* 0903 */,/*2308*/1409/* 0904 */,/*2309*/1410/* 0905 */,/*2310*/1410/* 0906 */,/*2311*/1410/* 0907 */, /*2312*/1410/* 0908 */,/*2313*/1410/* 0909 */,/*2314*/1410/* 090A */,/*2315*/1410/* 090B */,/*2316*/1410/* 090C */, /*2317*/1410/* 090D */,/*2318*/1410/* 090E */,/*2319*/1410/* 090F */,/*2320*/1410/* 0910 */,/*2321*/1410/* 0911 */, /*2322*/1410/* 0912 */,/*2323*/1410/* 0913 */,/*2324*/1410/* 0914 */,/*2325*/1410/* 0915 */,/*2326*/1410/* 0916 */, /*2327*/1410/* 0917 */,/*2328*/1410/* 0918 */,/*2329*/1410/* 0919 */,/*2330*/1410/* 091A */,/*2331*/1410/* 091B */, /*2332*/1410/* 091C */,/*2333*/1410/* 091D */,/*2334*/1410/* 091E */,/*2335*/1410/* 091F */,/*2336*/1410/* 0920 */, /*2337*/1410/* 0921 */,/*2338*/1410/* 0922 */,/*2339*/1410/* 0923 */,/*2340*/1410/* 0924 */,/*2341*/1410/* 0925 */, /*2342*/1410/* 0926 */,/*2343*/1410/* 0927 */,/*2344*/1410/* 0928 */,/*2345*/1411/* 0929 */,/*2346*/1410/* 092A */, /*2347*/1410/* 092B */,/*2348*/1410/* 092C */,/*2349*/1410/* 092D */,/*2350*/1410/* 092E */,/*2351*/1410/* 092F */, /*2352*/1410/* 0930 */,/*2353*/1412/* 0931 */,/*2354*/1410/* 0932 */,/*2355*/1410/* 0933 */,/*2356*/1413/* 0934 */, /*2357*/1410/* 0935 */,/*2358*/1410/* 0936 */,/*2359*/1410/* 0937 */,/*2360*/1410/* 0938 */,/*2361*/1410/* 0939 */, /*2362*/1414/* 093A */,/*2363*/1415/* 093B */,/*2364*/1416/* 093C */,/*2365*/1410/* 093D */,/*2366*/1408/* 093E */, /*2367*/1408/* 093F */,/*2368*/1408/* 0940 */,/*2369*/1407/* 0941 */,/*2370*/1407/* 0942 */,/*2371*/1407/* 0943 */, /*2372*/1407/* 0944 */,/*2373*/1407/* 0945 */,/*2374*/1407/* 0946 */,/*2375*/1407/* 0947 */,/*2376*/1407/* 0948 */, /*2377*/1408/* 0949 */,/*2378*/1408/* 094A */,/*2379*/1408/* 094B */,/*2380*/1408/* 094C */,/*2381*/1417/* 094D */, /*2382*/1418/* 094E */,/*2383*/1415/* 094F */,/*2384*/1410/* 0950 */,/*2385*/1419/* 0951 */,/*2386*/1420/* 0952 */, /*2387*/1421/* 0953 */,/*2388*/1421/* 0954 */,/*2389*/1406/* 0955 */,/*2390*/1414/* 0956 */,/*2391*/1414/* 0957 */, /*2392*/1422/* 0958 */,/*2393*/1423/* 0959 */,/*2394*/1424/* 095A */,/*2395*/1425/* 095B */,/*2396*/1426/* 095C */, /*2397*/1427/* 095D */,/*2398*/1428/* 095E */,/*2399*/1429/* 095F */,/*2400*/1410/* 0960 */,/*2401*/1410/* 0961 */, /*2402*/1407/* 0962 */,/*2403*/1407/* 0963 */,/*2404*/1430/* 0964 */,/*2405*/1430/* 0965 */,/*2406*/1431/* 0966 */, /*2407*/1432/* 0967 */,/*2408*/1433/* 0968 */,/*2409*/1434/* 0969 */,/*2410*/1435/* 096A */,/*2411*/1436/* 096B */, /*2412*/1437/* 096C */,/*2413*/1438/* 096D */,/*2414*/1439/* 096E */,/*2415*/1440/* 096F */,/*2416*/1441/* 0970 */, /*2417*/1442/* 0971 */,/*2418*/1443/* 0972 */,/*2419*/1444/* 0973 */,/*2420*/1444/* 0974 */,/*2421*/1444/* 0975 */, /*2422*/1444/* 0976 */,/*2423*/1444/* 0977 */,/*2424*/1445/* 0978 */,/*2425*/1446/* 0979 */,/*2426*/1446/* 097A */, /*2427*/1447/* 097B */,/*2428*/1447/* 097C */,/*2429*/1448/* 097D */,/*2430*/1447/* 097E */,/*2431*/1447/* 097F */, /*2432*/1449/* 0980 */,/*2433*/1450/* 0981 */,/*2434*/1451/* 0982 */,/*2435*/1451/* 0983 */,0,/*2437*/1452/* 0985 */, /*2438*/1452/* 0986 */,/*2439*/1452/* 0987 */,/*2440*/1452/* 0988 */,/*2441*/1452/* 0989 */,/*2442*/1452/* 098A */, /*2443*/1452/* 098B */,/*2444*/1452/* 098C */,0,0,/*2447*/1452/* 098F */,/*2448*/1452/* 0990 */,0,0, /*2451*/1452/* 0993 */,/*2452*/1452/* 0994 */,/*2453*/1452/* 0995 */,/*2454*/1452/* 0996 */,/*2455*/1452/* 0997 */, /*2456*/1452/* 0998 */,/*2457*/1452/* 0999 */,/*2458*/1452/* 099A */,/*2459*/1452/* 099B */,/*2460*/1452/* 099C */, /*2461*/1452/* 099D */,/*2462*/1452/* 099E */,/*2463*/1452/* 099F */,/*2464*/1452/* 09A0 */,/*2465*/1452/* 09A1 */, /*2466*/1452/* 09A2 */,/*2467*/1452/* 09A3 */,/*2468*/1452/* 09A4 */,/*2469*/1452/* 09A5 */,/*2470*/1452/* 09A6 */, /*2471*/1452/* 09A7 */,/*2472*/1452/* 09A8 */,0,/*2474*/1452/* 09AA */,/*2475*/1452/* 09AB */,/*2476*/1452/* 09AC */, /*2477*/1452/* 09AD */,/*2478*/1452/* 09AE */,/*2479*/1452/* 09AF */,/*2480*/1452/* 09B0 */,0,/*2482*/1452/* 09B2 */,0,0, 0,/*2486*/1452/* 09B6 */,/*2487*/1452/* 09B7 */,/*2488*/1452/* 09B8 */,/*2489*/1452/* 09B9 */,0,0,/*2492*/1453/* 09BC */, /*2493*/1454/* 09BD */,/*2494*/1455/* 09BE */,/*2495*/1451/* 09BF */,/*2496*/1451/* 09C0 */,/*2497*/1450/* 09C1 */, /*2498*/1450/* 09C2 */,/*2499*/1450/* 09C3 */,/*2500*/1450/* 09C4 */,0,0,/*2503*/1451/* 09C7 */,/*2504*/1451/* 09C8 */,0, 0,/*2507*/1456/* 09CB */,/*2508*/1457/* 09CC */,/*2509*/1458/* 09CD */,/*2510*/1459/* 09CE */,0,0,0,0,0,0,0,0, /*2519*/1455/* 09D7 */,0,0,0,0,/*2524*/1460/* 09DC */,/*2525*/1461/* 09DD */,0,/*2527*/1462/* 09DF */, /*2528*/1452/* 09E0 */,/*2529*/1452/* 09E1 */,/*2530*/1450/* 09E2 */,/*2531*/1450/* 09E3 */,0,0,/*2534*/1463/* 09E6 */, /*2535*/1464/* 09E7 */,/*2536*/1465/* 09E8 */,/*2537*/1466/* 09E9 */,/*2538*/1467/* 09EA */,/*2539*/1468/* 09EB */, /*2540*/1469/* 09EC */,/*2541*/1470/* 09ED */,/*2542*/1471/* 09EE */,/*2543*/1472/* 09EF */,/*2544*/1452/* 09F0 */, /*2545*/1452/* 09F1 */,/*2546*/1473/* 09F2 */,/*2547*/1473/* 09F3 */,/*2548*/1474/* 09F4 */,/*2549*/1475/* 09F5 */, /*2550*/1476/* 09F6 */,/*2551*/1477/* 09F7 */,/*2552*/1478/* 09F8 */,/*2553*/1479/* 09F9 */,/*2554*/1480/* 09FA */, /*2555*/1481/* 09FB */,0,0,0,0,0,/*2561*/1482/* 0A01 */,/*2562*/1483/* 0A02 */,/*2563*/1484/* 0A03 */,0, /*2565*/1485/* 0A05 */,/*2566*/1485/* 0A06 */,/*2567*/1485/* 0A07 */,/*2568*/1485/* 0A08 */,/*2569*/1485/* 0A09 */, /*2570*/1485/* 0A0A */,0,0,0,0,/*2575*/1485/* 0A0F */,/*2576*/1485/* 0A10 */,0,0,/*2579*/1485/* 0A13 */, /*2580*/1485/* 0A14 */,/*2581*/1485/* 0A15 */,/*2582*/1485/* 0A16 */,/*2583*/1485/* 0A17 */,/*2584*/1485/* 0A18 */, /*2585*/1485/* 0A19 */,/*2586*/1485/* 0A1A */,/*2587*/1485/* 0A1B */,/*2588*/1485/* 0A1C */,/*2589*/1485/* 0A1D */, /*2590*/1485/* 0A1E */,/*2591*/1485/* 0A1F */,/*2592*/1485/* 0A20 */,/*2593*/1485/* 0A21 */,/*2594*/1485/* 0A22 */, /*2595*/1485/* 0A23 */,/*2596*/1485/* 0A24 */,/*2597*/1485/* 0A25 */,/*2598*/1485/* 0A26 */,/*2599*/1485/* 0A27 */, /*2600*/1485/* 0A28 */,0,/*2602*/1485/* 0A2A */,/*2603*/1485/* 0A2B */,/*2604*/1485/* 0A2C */,/*2605*/1485/* 0A2D */, /*2606*/1485/* 0A2E */,/*2607*/1485/* 0A2F */,/*2608*/1485/* 0A30 */,0,/*2610*/1485/* 0A32 */,/*2611*/1486/* 0A33 */,0, /*2613*/1485/* 0A35 */,/*2614*/1487/* 0A36 */,0,/*2616*/1485/* 0A38 */,/*2617*/1485/* 0A39 */,0,0,/*2620*/1488/* 0A3C */, 0,/*2622*/1489/* 0A3E */,/*2623*/1489/* 0A3F */,/*2624*/1489/* 0A40 */,/*2625*/1483/* 0A41 */,/*2626*/1483/* 0A42 */,0,0, 0,0,/*2631*/1483/* 0A47 */,/*2632*/1483/* 0A48 */,0,0,/*2635*/1483/* 0A4B */,/*2636*/1483/* 0A4C */, /*2637*/1490/* 0A4D */,0,0,0,/*2641*/1491/* 0A51 */,0,0,0,0,0,0,0,/*2649*/1492/* 0A59 */,/*2650*/1493/* 0A5A */, /*2651*/1494/* 0A5B */,/*2652*/1485/* 0A5C */,0,/*2654*/1495/* 0A5E */,0,0,0,0,0,0,0,/*2662*/1496/* 0A66 */, /*2663*/1497/* 0A67 */,/*2664*/1498/* 0A68 */,/*2665*/1499/* 0A69 */,/*2666*/1500/* 0A6A */,/*2667*/1501/* 0A6B */, /*2668*/1502/* 0A6C */,/*2669*/1503/* 0A6D */,/*2670*/1504/* 0A6E */,/*2671*/1505/* 0A6F */,/*2672*/1483/* 0A70 */, /*2673*/1483/* 0A71 */,/*2674*/1485/* 0A72 */,/*2675*/1485/* 0A73 */,/*2676*/1485/* 0A74 */,/*2677*/1491/* 0A75 */,0,0,0, 0,0,0,0,0,0,0,0,/*2689*/1506/* 0A81 */,/*2690*/1506/* 0A82 */,/*2691*/1507/* 0A83 */,0,/*2693*/1508/* 0A85 */, /*2694*/1508/* 0A86 */,/*2695*/1508/* 0A87 */,/*2696*/1508/* 0A88 */,/*2697*/1508/* 0A89 */,/*2698*/1508/* 0A8A */, /*2699*/1508/* 0A8B */,/*2700*/1509/* 0A8C */,/*2701*/1508/* 0A8D */,0,/*2703*/1508/* 0A8F */,/*2704*/1508/* 0A90 */, /*2705*/1508/* 0A91 */,0,/*2707*/1508/* 0A93 */,/*2708*/1508/* 0A94 */,/*2709*/1508/* 0A95 */,/*2710*/1508/* 0A96 */, /*2711*/1508/* 0A97 */,/*2712*/1508/* 0A98 */,/*2713*/1508/* 0A99 */,/*2714*/1508/* 0A9A */,/*2715*/1508/* 0A9B */, /*2716*/1508/* 0A9C */,/*2717*/1508/* 0A9D */,/*2718*/1508/* 0A9E */,/*2719*/1508/* 0A9F */,/*2720*/1508/* 0AA0 */, /*2721*/1508/* 0AA1 */,/*2722*/1508/* 0AA2 */,/*2723*/1508/* 0AA3 */,/*2724*/1508/* 0AA4 */,/*2725*/1508/* 0AA5 */, /*2726*/1508/* 0AA6 */,/*2727*/1508/* 0AA7 */,/*2728*/1508/* 0AA8 */,0,/*2730*/1508/* 0AAA */,/*2731*/1508/* 0AAB */, /*2732*/1508/* 0AAC */,/*2733*/1508/* 0AAD */,/*2734*/1508/* 0AAE */,/*2735*/1508/* 0AAF */,/*2736*/1508/* 0AB0 */,0, /*2738*/1508/* 0AB2 */,/*2739*/1508/* 0AB3 */,0,/*2741*/1508/* 0AB5 */,/*2742*/1508/* 0AB6 */,/*2743*/1508/* 0AB7 */, /*2744*/1508/* 0AB8 */,/*2745*/1508/* 0AB9 */,0,0,/*2748*/1510/* 0ABC */,/*2749*/1508/* 0ABD */,/*2750*/1507/* 0ABE */, /*2751*/1507/* 0ABF */,/*2752*/1507/* 0AC0 */,/*2753*/1506/* 0AC1 */,/*2754*/1506/* 0AC2 */,/*2755*/1506/* 0AC3 */, /*2756*/1506/* 0AC4 */,/*2757*/1506/* 0AC5 */,0,/*2759*/1506/* 0AC7 */,/*2760*/1506/* 0AC8 */,/*2761*/1507/* 0AC9 */,0, /*2763*/1507/* 0ACB */,/*2764*/1507/* 0ACC */,/*2765*/1511/* 0ACD */,0,0,/*2768*/1508/* 0AD0 */,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,/*2784*/1508/* 0AE0 */,/*2785*/1509/* 0AE1 */,/*2786*/1512/* 0AE2 */,/*2787*/1512/* 0AE3 */,0,0, /*2790*/1513/* 0AE6 */,/*2791*/1514/* 0AE7 */,/*2792*/1515/* 0AE8 */,/*2793*/1516/* 0AE9 */,/*2794*/1517/* 0AEA */, /*2795*/1518/* 0AEB */,/*2796*/1519/* 0AEC */,/*2797*/1520/* 0AED */,/*2798*/1521/* 0AEE */,/*2799*/1522/* 0AEF */, /*2800*/1523/* 0AF0 */,/*2801*/1524/* 0AF1 */,0,0,0,0,0,0,0,/*2809*/1525/* 0AF9 */,0,0,0,0,0,0,0,/*2817*/1526/* 0B01 */, /*2818*/1527/* 0B02 */,/*2819*/1527/* 0B03 */,0,/*2821*/1528/* 0B05 */,/*2822*/1528/* 0B06 */,/*2823*/1528/* 0B07 */, /*2824*/1528/* 0B08 */,/*2825*/1528/* 0B09 */,/*2826*/1528/* 0B0A */,/*2827*/1528/* 0B0B */,/*2828*/1528/* 0B0C */,0,0, /*2831*/1528/* 0B0F */,/*2832*/1528/* 0B10 */,0,0,/*2835*/1528/* 0B13 */,/*2836*/1528/* 0B14 */,/*2837*/1528/* 0B15 */, /*2838*/1528/* 0B16 */,/*2839*/1528/* 0B17 */,/*2840*/1528/* 0B18 */,/*2841*/1528/* 0B19 */,/*2842*/1528/* 0B1A */, /*2843*/1528/* 0B1B */,/*2844*/1528/* 0B1C */,/*2845*/1528/* 0B1D */,/*2846*/1528/* 0B1E */,/*2847*/1528/* 0B1F */, /*2848*/1528/* 0B20 */,/*2849*/1528/* 0B21 */,/*2850*/1528/* 0B22 */,/*2851*/1528/* 0B23 */,/*2852*/1528/* 0B24 */, /*2853*/1528/* 0B25 */,/*2854*/1528/* 0B26 */,/*2855*/1528/* 0B27 */,/*2856*/1528/* 0B28 */,0,/*2858*/1528/* 0B2A */, /*2859*/1528/* 0B2B */,/*2860*/1528/* 0B2C */,/*2861*/1528/* 0B2D */,/*2862*/1528/* 0B2E */,/*2863*/1528/* 0B2F */, /*2864*/1528/* 0B30 */,0,/*2866*/1528/* 0B32 */,/*2867*/1528/* 0B33 */,0,/*2869*/1529/* 0B35 */,/*2870*/1528/* 0B36 */, /*2871*/1528/* 0B37 */,/*2872*/1528/* 0B38 */,/*2873*/1528/* 0B39 */,0,0,/*2876*/1530/* 0B3C */,/*2877*/1528/* 0B3D */, /*2878*/1531/* 0B3E */,/*2879*/1526/* 0B3F */,/*2880*/1527/* 0B40 */,/*2881*/1526/* 0B41 */,/*2882*/1526/* 0B42 */, /*2883*/1526/* 0B43 */,/*2884*/1532/* 0B44 */,0,0,/*2887*/1527/* 0B47 */,/*2888*/1533/* 0B48 */,0,0, /*2891*/1534/* 0B4B */,/*2892*/1535/* 0B4C */,/*2893*/1536/* 0B4D */,0,0,0,0,0,0,0,0,/*2902*/1537/* 0B56 */, /*2903*/1531/* 0B57 */,0,0,0,0,/*2908*/1538/* 0B5C */,/*2909*/1539/* 0B5D */,0,/*2911*/1528/* 0B5F */, /*2912*/1528/* 0B60 */,/*2913*/1528/* 0B61 */,/*2914*/1532/* 0B62 */,/*2915*/1532/* 0B63 */,0,0,/*2918*/1540/* 0B66 */, /*2919*/1541/* 0B67 */,/*2920*/1542/* 0B68 */,/*2921*/1543/* 0B69 */,/*2922*/1544/* 0B6A */,/*2923*/1545/* 0B6B */, /*2924*/1546/* 0B6C */,/*2925*/1547/* 0B6D */,/*2926*/1548/* 0B6E */,/*2927*/1549/* 0B6F */,/*2928*/1550/* 0B70 */, /*2929*/1529/* 0B71 */,/*2930*/1551/* 0B72 */,/*2931*/1552/* 0B73 */,/*2932*/1553/* 0B74 */,/*2933*/1554/* 0B75 */, /*2934*/1555/* 0B76 */,/*2935*/1556/* 0B77 */,0,0,0,0,0,0,0,0,0,0,/*2946*/1557/* 0B82 */,/*2947*/1558/* 0B83 */,0, /*2949*/1558/* 0B85 */,/*2950*/1558/* 0B86 */,/*2951*/1558/* 0B87 */,/*2952*/1558/* 0B88 */,/*2953*/1558/* 0B89 */, /*2954*/1558/* 0B8A */,0,0,0,/*2958*/1558/* 0B8E */,/*2959*/1558/* 0B8F */,/*2960*/1558/* 0B90 */,0, /*2962*/1558/* 0B92 */,/*2963*/1558/* 0B93 */,/*2964*/1559/* 0B94 */,/*2965*/1558/* 0B95 */,0,0,0,/*2969*/1558/* 0B99 */, /*2970*/1558/* 0B9A */,0,/*2972*/1558/* 0B9C */,0,/*2974*/1558/* 0B9E */,/*2975*/1558/* 0B9F */,0,0,0, /*2979*/1558/* 0BA3 */,/*2980*/1558/* 0BA4 */,0,0,0,/*2984*/1558/* 0BA8 */,/*2985*/1558/* 0BA9 */,/*2986*/1558/* 0BAA */, 0,0,0,/*2990*/1558/* 0BAE */,/*2991*/1558/* 0BAF */,/*2992*/1558/* 0BB0 */,/*2993*/1558/* 0BB1 */,/*2994*/1558/* 0BB2 */, /*2995*/1558/* 0BB3 */,/*2996*/1558/* 0BB4 */,/*2997*/1558/* 0BB5 */,/*2998*/1560/* 0BB6 */,/*2999*/1558/* 0BB7 */, /*3000*/1558/* 0BB8 */,/*3001*/1558/* 0BB9 */,0,0,0,0,/*3006*/1561/* 0BBE */,/*3007*/1562/* 0BBF */, /*3008*/1557/* 0BC0 */,/*3009*/1562/* 0BC1 */,/*3010*/1562/* 0BC2 */,0,0,0,/*3014*/1562/* 0BC6 */,/*3015*/1562/* 0BC7 */, /*3016*/1562/* 0BC8 */,0,/*3018*/1563/* 0BCA */,/*3019*/1564/* 0BCB */,/*3020*/1565/* 0BCC */,/*3021*/1566/* 0BCD */,0,0, /*3024*/1567/* 0BD0 */,0,0,0,0,0,0,/*3031*/1561/* 0BD7 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3046*/1568/* 0BE6 */, /*3047*/1569/* 0BE7 */,/*3048*/1570/* 0BE8 */,/*3049*/1571/* 0BE9 */,/*3050*/1572/* 0BEA */,/*3051*/1573/* 0BEB */, /*3052*/1574/* 0BEC */,/*3053*/1575/* 0BED */,/*3054*/1576/* 0BEE */,/*3055*/1577/* 0BEF */,/*3056*/1578/* 0BF0 */, /*3057*/1579/* 0BF1 */,/*3058*/1580/* 0BF2 */,/*3059*/1581/* 0BF3 */,/*3060*/1581/* 0BF4 */,/*3061*/1581/* 0BF5 */, /*3062*/1581/* 0BF6 */,/*3063*/1581/* 0BF7 */,/*3064*/1581/* 0BF8 */,/*3065*/1582/* 0BF9 */,/*3066*/1581/* 0BFA */,0,0,0, 0,0,/*3072*/1583/* 0C00 */,/*3073*/1584/* 0C01 */,/*3074*/1584/* 0C02 */,/*3075*/1584/* 0C03 */,0,/*3077*/1585/* 0C05 */, /*3078*/1585/* 0C06 */,/*3079*/1585/* 0C07 */,/*3080*/1585/* 0C08 */,/*3081*/1585/* 0C09 */,/*3082*/1585/* 0C0A */, /*3083*/1585/* 0C0B */,/*3084*/1585/* 0C0C */,0,/*3086*/1585/* 0C0E */,/*3087*/1585/* 0C0F */,/*3088*/1585/* 0C10 */,0, /*3090*/1585/* 0C12 */,/*3091*/1585/* 0C13 */,/*3092*/1585/* 0C14 */,/*3093*/1585/* 0C15 */,/*3094*/1585/* 0C16 */, /*3095*/1585/* 0C17 */,/*3096*/1585/* 0C18 */,/*3097*/1585/* 0C19 */,/*3098*/1585/* 0C1A */,/*3099*/1585/* 0C1B */, /*3100*/1585/* 0C1C */,/*3101*/1585/* 0C1D */,/*3102*/1585/* 0C1E */,/*3103*/1585/* 0C1F */,/*3104*/1585/* 0C20 */, /*3105*/1585/* 0C21 */,/*3106*/1585/* 0C22 */,/*3107*/1585/* 0C23 */,/*3108*/1585/* 0C24 */,/*3109*/1585/* 0C25 */, /*3110*/1585/* 0C26 */,/*3111*/1585/* 0C27 */,/*3112*/1585/* 0C28 */,0,/*3114*/1585/* 0C2A */,/*3115*/1585/* 0C2B */, /*3116*/1585/* 0C2C */,/*3117*/1585/* 0C2D */,/*3118*/1585/* 0C2E */,/*3119*/1585/* 0C2F */,/*3120*/1585/* 0C30 */, /*3121*/1585/* 0C31 */,/*3122*/1585/* 0C32 */,/*3123*/1585/* 0C33 */,/*3124*/1586/* 0C34 */,/*3125*/1585/* 0C35 */, /*3126*/1585/* 0C36 */,/*3127*/1585/* 0C37 */,/*3128*/1585/* 0C38 */,/*3129*/1585/* 0C39 */,0,0,0,/*3133*/1587/* 0C3D */, /*3134*/1588/* 0C3E */,/*3135*/1588/* 0C3F */,/*3136*/1588/* 0C40 */,/*3137*/1584/* 0C41 */,/*3138*/1584/* 0C42 */, /*3139*/1584/* 0C43 */,/*3140*/1584/* 0C44 */,0,/*3142*/1588/* 0C46 */,/*3143*/1588/* 0C47 */,/*3144*/1589/* 0C48 */,0, /*3146*/1588/* 0C4A */,/*3147*/1588/* 0C4B */,/*3148*/1588/* 0C4C */,/*3149*/1590/* 0C4D */,0,0,0,0,0,0,0, /*3157*/1591/* 0C55 */,/*3158*/1592/* 0C56 */,0,/*3160*/1587/* 0C58 */,/*3161*/1587/* 0C59 */,/*3162*/1593/* 0C5A */,0,0, 0,0,0,/*3168*/1585/* 0C60 */,/*3169*/1585/* 0C61 */,/*3170*/1594/* 0C62 */,/*3171*/1594/* 0C63 */,0,0, /*3174*/1595/* 0C66 */,/*3175*/1596/* 0C67 */,/*3176*/1597/* 0C68 */,/*3177*/1598/* 0C69 */,/*3178*/1599/* 0C6A */, /*3179*/1600/* 0C6B */,/*3180*/1601/* 0C6C */,/*3181*/1602/* 0C6D */,/*3182*/1603/* 0C6E */,/*3183*/1604/* 0C6F */,0,0,0, 0,0,0,0,0,/*3192*/1605/* 0C78 */,/*3193*/1606/* 0C79 */,/*3194*/1607/* 0C7A */,/*3195*/1608/* 0C7B */, /*3196*/1606/* 0C7C */,/*3197*/1607/* 0C7D */,/*3198*/1608/* 0C7E */,/*3199*/1609/* 0C7F */,0,/*3201*/1610/* 0C81 */, /*3202*/1611/* 0C82 */,/*3203*/1611/* 0C83 */,0,/*3205*/1612/* 0C85 */,/*3206*/1612/* 0C86 */,/*3207*/1612/* 0C87 */, /*3208*/1612/* 0C88 */,/*3209*/1612/* 0C89 */,/*3210*/1612/* 0C8A */,/*3211*/1612/* 0C8B */,/*3212*/1612/* 0C8C */,0, /*3214*/1612/* 0C8E */,/*3215*/1612/* 0C8F */,/*3216*/1612/* 0C90 */,0,/*3218*/1612/* 0C92 */,/*3219*/1612/* 0C93 */, /*3220*/1612/* 0C94 */,/*3221*/1612/* 0C95 */,/*3222*/1612/* 0C96 */,/*3223*/1612/* 0C97 */,/*3224*/1612/* 0C98 */, /*3225*/1612/* 0C99 */,/*3226*/1612/* 0C9A */,/*3227*/1612/* 0C9B */,/*3228*/1612/* 0C9C */,/*3229*/1612/* 0C9D */, /*3230*/1612/* 0C9E */,/*3231*/1612/* 0C9F */,/*3232*/1612/* 0CA0 */,/*3233*/1612/* 0CA1 */,/*3234*/1612/* 0CA2 */, /*3235*/1612/* 0CA3 */,/*3236*/1612/* 0CA4 */,/*3237*/1612/* 0CA5 */,/*3238*/1612/* 0CA6 */,/*3239*/1612/* 0CA7 */, /*3240*/1612/* 0CA8 */,0,/*3242*/1612/* 0CAA */,/*3243*/1612/* 0CAB */,/*3244*/1612/* 0CAC */,/*3245*/1612/* 0CAD */, /*3246*/1612/* 0CAE */,/*3247*/1612/* 0CAF */,/*3248*/1612/* 0CB0 */,/*3249*/1612/* 0CB1 */,/*3250*/1612/* 0CB2 */, /*3251*/1612/* 0CB3 */,0,/*3253*/1612/* 0CB5 */,/*3254*/1612/* 0CB6 */,/*3255*/1612/* 0CB7 */,/*3256*/1612/* 0CB8 */, /*3257*/1612/* 0CB9 */,0,0,/*3260*/1613/* 0CBC */,/*3261*/1614/* 0CBD */,/*3262*/1611/* 0CBE */,/*3263*/1615/* 0CBF */, /*3264*/1616/* 0CC0 */,/*3265*/1611/* 0CC1 */,/*3266*/1617/* 0CC2 */,/*3267*/1611/* 0CC3 */,/*3268*/1611/* 0CC4 */,0, /*3270*/1615/* 0CC6 */,/*3271*/1618/* 0CC7 */,/*3272*/1619/* 0CC8 */,0,/*3274*/1620/* 0CCA */,/*3275*/1621/* 0CCB */, /*3276*/1622/* 0CCC */,/*3277*/1623/* 0CCD */,0,0,0,0,0,0,0,/*3285*/1617/* 0CD5 */,/*3286*/1617/* 0CD6 */,0,0,0,0,0,0,0, /*3294*/1612/* 0CDE */,0,/*3296*/1612/* 0CE0 */,/*3297*/1612/* 0CE1 */,/*3298*/1624/* 0CE2 */,/*3299*/1624/* 0CE3 */,0,0, /*3302*/1625/* 0CE6 */,/*3303*/1626/* 0CE7 */,/*3304*/1627/* 0CE8 */,/*3305*/1628/* 0CE9 */,/*3306*/1629/* 0CEA */, /*3307*/1630/* 0CEB */,/*3308*/1631/* 0CEC */,/*3309*/1632/* 0CED */,/*3310*/1633/* 0CEE */,/*3311*/1634/* 0CEF */,0, /*3313*/1635/* 0CF1 */,/*3314*/1635/* 0CF2 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3329*/1636/* 0D01 */,/*3330*/1637/* 0D02 */, /*3331*/1637/* 0D03 */,0,/*3333*/1638/* 0D05 */,/*3334*/1638/* 0D06 */,/*3335*/1638/* 0D07 */,/*3336*/1638/* 0D08 */, /*3337*/1638/* 0D09 */,/*3338*/1638/* 0D0A */,/*3339*/1638/* 0D0B */,/*3340*/1638/* 0D0C */,0,/*3342*/1638/* 0D0E */, /*3343*/1638/* 0D0F */,/*3344*/1638/* 0D10 */,0,/*3346*/1638/* 0D12 */,/*3347*/1638/* 0D13 */,/*3348*/1638/* 0D14 */, /*3349*/1638/* 0D15 */,/*3350*/1638/* 0D16 */,/*3351*/1638/* 0D17 */,/*3352*/1638/* 0D18 */,/*3353*/1638/* 0D19 */, /*3354*/1638/* 0D1A */,/*3355*/1638/* 0D1B */,/*3356*/1638/* 0D1C */,/*3357*/1638/* 0D1D */,/*3358*/1638/* 0D1E */, /*3359*/1638/* 0D1F */,/*3360*/1638/* 0D20 */,/*3361*/1638/* 0D21 */,/*3362*/1638/* 0D22 */,/*3363*/1638/* 0D23 */, /*3364*/1638/* 0D24 */,/*3365*/1638/* 0D25 */,/*3366*/1638/* 0D26 */,/*3367*/1638/* 0D27 */,/*3368*/1638/* 0D28 */, /*3369*/1639/* 0D29 */,/*3370*/1638/* 0D2A */,/*3371*/1638/* 0D2B */,/*3372*/1638/* 0D2C */,/*3373*/1638/* 0D2D */, /*3374*/1638/* 0D2E */,/*3375*/1638/* 0D2F */,/*3376*/1638/* 0D30 */,/*3377*/1638/* 0D31 */,/*3378*/1638/* 0D32 */, /*3379*/1638/* 0D33 */,/*3380*/1638/* 0D34 */,/*3381*/1638/* 0D35 */,/*3382*/1638/* 0D36 */,/*3383*/1638/* 0D37 */, /*3384*/1638/* 0D38 */,/*3385*/1638/* 0D39 */,/*3386*/1639/* 0D3A */,0,0,/*3389*/1640/* 0D3D */,/*3390*/1641/* 0D3E */, /*3391*/1637/* 0D3F */,/*3392*/1637/* 0D40 */,/*3393*/1642/* 0D41 */,/*3394*/1642/* 0D42 */,/*3395*/1642/* 0D43 */, /*3396*/1643/* 0D44 */,0,/*3398*/1637/* 0D46 */,/*3399*/1637/* 0D47 */,/*3400*/1637/* 0D48 */,0,/*3402*/1644/* 0D4A */, /*3403*/1645/* 0D4B */,/*3404*/1646/* 0D4C */,/*3405*/1647/* 0D4D */,/*3406*/1639/* 0D4E */,0,0,0,0,0,0,0,0, /*3415*/1641/* 0D57 */,0,0,0,0,0,0,0,/*3423*/1648/* 0D5F */,/*3424*/1638/* 0D60 */,/*3425*/1638/* 0D61 */, /*3426*/1643/* 0D62 */,/*3427*/1643/* 0D63 */,0,0,/*3430*/1649/* 0D66 */,/*3431*/1650/* 0D67 */,/*3432*/1651/* 0D68 */, /*3433*/1652/* 0D69 */,/*3434*/1653/* 0D6A */,/*3435*/1654/* 0D6B */,/*3436*/1655/* 0D6C */,/*3437*/1656/* 0D6D */, /*3438*/1657/* 0D6E */,/*3439*/1658/* 0D6F */,/*3440*/1659/* 0D70 */,/*3441*/1660/* 0D71 */,/*3442*/1661/* 0D72 */, /*3443*/1662/* 0D73 */,/*3444*/1663/* 0D74 */,/*3445*/1664/* 0D75 */,0,0,0,/*3449*/1665/* 0D79 */,/*3450*/1640/* 0D7A */, /*3451*/1640/* 0D7B */,/*3452*/1640/* 0D7C */,/*3453*/1640/* 0D7D */,/*3454*/1640/* 0D7E */,/*3455*/1640/* 0D7F */,0,0, /*3458*/1666/* 0D82 */,/*3459*/1666/* 0D83 */,0,/*3461*/1667/* 0D85 */,/*3462*/1667/* 0D86 */,/*3463*/1667/* 0D87 */, /*3464*/1667/* 0D88 */,/*3465*/1667/* 0D89 */,/*3466*/1667/* 0D8A */,/*3467*/1667/* 0D8B */,/*3468*/1667/* 0D8C */, /*3469*/1667/* 0D8D */,/*3470*/1667/* 0D8E */,/*3471*/1667/* 0D8F */,/*3472*/1667/* 0D90 */,/*3473*/1667/* 0D91 */, /*3474*/1667/* 0D92 */,/*3475*/1667/* 0D93 */,/*3476*/1667/* 0D94 */,/*3477*/1667/* 0D95 */,/*3478*/1667/* 0D96 */,0,0,0, /*3482*/1667/* 0D9A */,/*3483*/1667/* 0D9B */,/*3484*/1667/* 0D9C */,/*3485*/1667/* 0D9D */,/*3486*/1667/* 0D9E */, /*3487*/1667/* 0D9F */,/*3488*/1667/* 0DA0 */,/*3489*/1667/* 0DA1 */,/*3490*/1667/* 0DA2 */,/*3491*/1667/* 0DA3 */, /*3492*/1667/* 0DA4 */,/*3493*/1667/* 0DA5 */,/*3494*/1667/* 0DA6 */,/*3495*/1667/* 0DA7 */,/*3496*/1667/* 0DA8 */, /*3497*/1667/* 0DA9 */,/*3498*/1667/* 0DAA */,/*3499*/1667/* 0DAB */,/*3500*/1667/* 0DAC */,/*3501*/1667/* 0DAD */, /*3502*/1667/* 0DAE */,/*3503*/1667/* 0DAF */,/*3504*/1667/* 0DB0 */,/*3505*/1667/* 0DB1 */,0,/*3507*/1667/* 0DB3 */, /*3508*/1667/* 0DB4 */,/*3509*/1667/* 0DB5 */,/*3510*/1667/* 0DB6 */,/*3511*/1667/* 0DB7 */,/*3512*/1667/* 0DB8 */, /*3513*/1667/* 0DB9 */,/*3514*/1667/* 0DBA */,/*3515*/1667/* 0DBB */,0,/*3517*/1667/* 0DBD */,0,0,/*3520*/1667/* 0DC0 */, /*3521*/1667/* 0DC1 */,/*3522*/1667/* 0DC2 */,/*3523*/1667/* 0DC3 */,/*3524*/1667/* 0DC4 */,/*3525*/1667/* 0DC5 */, /*3526*/1667/* 0DC6 */,0,0,0,/*3530*/1668/* 0DCA */,0,0,0,0,/*3535*/1669/* 0DCF */,/*3536*/1666/* 0DD0 */, /*3537*/1666/* 0DD1 */,/*3538*/1670/* 0DD2 */,/*3539*/1670/* 0DD3 */,/*3540*/1670/* 0DD4 */,0,/*3542*/1670/* 0DD6 */,0, /*3544*/1666/* 0DD8 */,/*3545*/1666/* 0DD9 */,/*3546*/1671/* 0DDA */,/*3547*/1666/* 0DDB */,/*3548*/1672/* 0DDC */, /*3549*/1673/* 0DDD */,/*3550*/1674/* 0DDE */,/*3551*/1669/* 0DDF */,0,0,0,0,0,0,/*3558*/1675/* 0DE6 */, /*3559*/1676/* 0DE7 */,/*3560*/1677/* 0DE8 */,/*3561*/1678/* 0DE9 */,/*3562*/1679/* 0DEA */,/*3563*/1680/* 0DEB */, /*3564*/1681/* 0DEC */,/*3565*/1682/* 0DED */,/*3566*/1683/* 0DEE */,/*3567*/1684/* 0DEF */,0,0,/*3570*/1666/* 0DF2 */, /*3571*/1666/* 0DF3 */,/*3572*/1685/* 0DF4 */,0,0,0,0,0,0,0,0,0,0,0,0,/*3585*/1686/* 0E01 */,/*3586*/1686/* 0E02 */, /*3587*/1686/* 0E03 */,/*3588*/1686/* 0E04 */,/*3589*/1686/* 0E05 */,/*3590*/1686/* 0E06 */,/*3591*/1686/* 0E07 */, /*3592*/1686/* 0E08 */,/*3593*/1686/* 0E09 */,/*3594*/1686/* 0E0A */,/*3595*/1686/* 0E0B */,/*3596*/1686/* 0E0C */, /*3597*/1686/* 0E0D */,/*3598*/1686/* 0E0E */,/*3599*/1686/* 0E0F */,/*3600*/1686/* 0E10 */,/*3601*/1686/* 0E11 */, /*3602*/1686/* 0E12 */,/*3603*/1686/* 0E13 */,/*3604*/1686/* 0E14 */,/*3605*/1686/* 0E15 */,/*3606*/1686/* 0E16 */, /*3607*/1686/* 0E17 */,/*3608*/1686/* 0E18 */,/*3609*/1686/* 0E19 */,/*3610*/1686/* 0E1A */,/*3611*/1686/* 0E1B */, /*3612*/1686/* 0E1C */,/*3613*/1686/* 0E1D */,/*3614*/1686/* 0E1E */,/*3615*/1686/* 0E1F */,/*3616*/1686/* 0E20 */, /*3617*/1686/* 0E21 */,/*3618*/1686/* 0E22 */,/*3619*/1686/* 0E23 */,/*3620*/1686/* 0E24 */,/*3621*/1686/* 0E25 */, /*3622*/1686/* 0E26 */,/*3623*/1686/* 0E27 */,/*3624*/1686/* 0E28 */,/*3625*/1686/* 0E29 */,/*3626*/1686/* 0E2A */, /*3627*/1686/* 0E2B */,/*3628*/1686/* 0E2C */,/*3629*/1686/* 0E2D */,/*3630*/1686/* 0E2E */,/*3631*/1686/* 0E2F */, /*3632*/1686/* 0E30 */,/*3633*/1687/* 0E31 */,/*3634*/1686/* 0E32 */,/*3635*/1688/* 0E33 */,/*3636*/1687/* 0E34 */, /*3637*/1687/* 0E35 */,/*3638*/1687/* 0E36 */,/*3639*/1687/* 0E37 */,/*3640*/1689/* 0E38 */,/*3641*/1689/* 0E39 */, /*3642*/1690/* 0E3A */,0,0,0,0,/*3647*/1691/* 0E3F */,/*3648*/1692/* 0E40 */,/*3649*/1692/* 0E41 */, /*3650*/1692/* 0E42 */,/*3651*/1692/* 0E43 */,/*3652*/1692/* 0E44 */,/*3653*/1686/* 0E45 */,/*3654*/1693/* 0E46 */, /*3655*/1694/* 0E47 */,/*3656*/1695/* 0E48 */,/*3657*/1695/* 0E49 */,/*3658*/1695/* 0E4A */,/*3659*/1695/* 0E4B */, /*3660*/1694/* 0E4C */,/*3661*/1687/* 0E4D */,/*3662*/1694/* 0E4E */,/*3663*/1696/* 0E4F */,/*3664*/1697/* 0E50 */, /*3665*/1698/* 0E51 */,/*3666*/1699/* 0E52 */,/*3667*/1700/* 0E53 */,/*3668*/1701/* 0E54 */,/*3669*/1702/* 0E55 */, /*3670*/1703/* 0E56 */,/*3671*/1704/* 0E57 */,/*3672*/1705/* 0E58 */,/*3673*/1706/* 0E59 */,/*3674*/1707/* 0E5A */, /*3675*/1707/* 0E5B */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3713*/1708/* 0E81 */, /*3714*/1708/* 0E82 */,0,/*3716*/1708/* 0E84 */,0,0,/*3719*/1708/* 0E87 */,/*3720*/1708/* 0E88 */,0, /*3722*/1708/* 0E8A */,0,0,/*3725*/1708/* 0E8D */,0,0,0,0,0,0,/*3732*/1708/* 0E94 */,/*3733*/1708/* 0E95 */, /*3734*/1708/* 0E96 */,/*3735*/1708/* 0E97 */,0,/*3737*/1708/* 0E99 */,/*3738*/1708/* 0E9A */,/*3739*/1708/* 0E9B */, /*3740*/1708/* 0E9C */,/*3741*/1708/* 0E9D */,/*3742*/1708/* 0E9E */,/*3743*/1708/* 0E9F */,0,/*3745*/1708/* 0EA1 */, /*3746*/1708/* 0EA2 */,/*3747*/1708/* 0EA3 */,0,/*3749*/1708/* 0EA5 */,0,/*3751*/1708/* 0EA7 */,0,0, /*3754*/1708/* 0EAA */,/*3755*/1708/* 0EAB */,0,/*3757*/1708/* 0EAD */,/*3758*/1708/* 0EAE */,/*3759*/1708/* 0EAF */, /*3760*/1708/* 0EB0 */,/*3761*/1709/* 0EB1 */,/*3762*/1708/* 0EB2 */,/*3763*/1710/* 0EB3 */,/*3764*/1709/* 0EB4 */, /*3765*/1709/* 0EB5 */,/*3766*/1709/* 0EB6 */,/*3767*/1709/* 0EB7 */,/*3768*/1711/* 0EB8 */,/*3769*/1711/* 0EB9 */,0, /*3771*/1709/* 0EBB */,/*3772*/1709/* 0EBC */,/*3773*/1708/* 0EBD */,0,0,/*3776*/1712/* 0EC0 */,/*3777*/1712/* 0EC1 */, /*3778*/1712/* 0EC2 */,/*3779*/1712/* 0EC3 */,/*3780*/1712/* 0EC4 */,0,/*3782*/1713/* 0EC6 */,0,/*3784*/1714/* 0EC8 */, /*3785*/1714/* 0EC9 */,/*3786*/1714/* 0ECA */,/*3787*/1714/* 0ECB */,/*3788*/1715/* 0ECC */,/*3789*/1709/* 0ECD */,0,0, /*3792*/1716/* 0ED0 */,/*3793*/1717/* 0ED1 */,/*3794*/1718/* 0ED2 */,/*3795*/1719/* 0ED3 */,/*3796*/1720/* 0ED4 */, /*3797*/1721/* 0ED5 */,/*3798*/1722/* 0ED6 */,/*3799*/1723/* 0ED7 */,/*3800*/1724/* 0ED8 */,/*3801*/1725/* 0ED9 */,0,0, /*3804*/1726/* 0EDC */,/*3805*/1727/* 0EDD */,/*3806*/1728/* 0EDE */,/*3807*/1728/* 0EDF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3840*/1729/* 0F00 */,/*3841*/1730/* 0F01 */,/*3842*/1730/* 0F02 */, /*3843*/1730/* 0F03 */,/*3844*/1731/* 0F04 */,/*3845*/1731/* 0F05 */,/*3846*/1731/* 0F06 */,/*3847*/1731/* 0F07 */, /*3848*/1732/* 0F08 */,/*3849*/1731/* 0F09 */,/*3850*/1731/* 0F0A */,/*3851*/1731/* 0F0B */,/*3852*/1733/* 0F0C */, /*3853*/1734/* 0F0D */,/*3854*/1734/* 0F0E */,/*3855*/1734/* 0F0F */,/*3856*/1734/* 0F10 */,/*3857*/1734/* 0F11 */, /*3858*/1732/* 0F12 */,/*3859*/1730/* 0F13 */,/*3860*/1731/* 0F14 */,/*3861*/1730/* 0F15 */,/*3862*/1730/* 0F16 */, /*3863*/1730/* 0F17 */,/*3864*/1735/* 0F18 */,/*3865*/1735/* 0F19 */,/*3866*/1730/* 0F1A */,/*3867*/1730/* 0F1B */, /*3868*/1730/* 0F1C */,/*3869*/1730/* 0F1D */,/*3870*/1730/* 0F1E */,/*3871*/1730/* 0F1F */,/*3872*/1736/* 0F20 */, /*3873*/1737/* 0F21 */,/*3874*/1738/* 0F22 */,/*3875*/1739/* 0F23 */,/*3876*/1740/* 0F24 */,/*3877*/1741/* 0F25 */, /*3878*/1742/* 0F26 */,/*3879*/1743/* 0F27 */,/*3880*/1744/* 0F28 */,/*3881*/1745/* 0F29 */,/*3882*/1746/* 0F2A */, /*3883*/1747/* 0F2B */,/*3884*/1748/* 0F2C */,/*3885*/1749/* 0F2D */,/*3886*/1750/* 0F2E */,/*3887*/1751/* 0F2F */, /*3888*/1752/* 0F30 */,/*3889*/1753/* 0F31 */,/*3890*/1754/* 0F32 */,/*3891*/1755/* 0F33 */,/*3892*/1730/* 0F34 */, /*3893*/1735/* 0F35 */,/*3894*/1730/* 0F36 */,/*3895*/1735/* 0F37 */,/*3896*/1730/* 0F38 */,/*3897*/1756/* 0F39 */, /*3898*/1757/* 0F3A */,/*3899*/1758/* 0F3B */,/*3900*/1759/* 0F3C */,/*3901*/1760/* 0F3D */,/*3902*/1761/* 0F3E */, /*3903*/1761/* 0F3F */,/*3904*/1729/* 0F40 */,/*3905*/1729/* 0F41 */,/*3906*/1729/* 0F42 */,/*3907*/1762/* 0F43 */, /*3908*/1729/* 0F44 */,/*3909*/1729/* 0F45 */,/*3910*/1729/* 0F46 */,/*3911*/1729/* 0F47 */,0,/*3913*/1729/* 0F49 */, /*3914*/1729/* 0F4A */,/*3915*/1729/* 0F4B */,/*3916*/1729/* 0F4C */,/*3917*/1763/* 0F4D */,/*3918*/1729/* 0F4E */, /*3919*/1729/* 0F4F */,/*3920*/1729/* 0F50 */,/*3921*/1729/* 0F51 */,/*3922*/1764/* 0F52 */,/*3923*/1729/* 0F53 */, /*3924*/1729/* 0F54 */,/*3925*/1729/* 0F55 */,/*3926*/1729/* 0F56 */,/*3927*/1765/* 0F57 */,/*3928*/1729/* 0F58 */, /*3929*/1729/* 0F59 */,/*3930*/1729/* 0F5A */,/*3931*/1729/* 0F5B */,/*3932*/1766/* 0F5C */,/*3933*/1729/* 0F5D */, /*3934*/1729/* 0F5E */,/*3935*/1729/* 0F5F */,/*3936*/1729/* 0F60 */,/*3937*/1729/* 0F61 */,/*3938*/1729/* 0F62 */, /*3939*/1729/* 0F63 */,/*3940*/1729/* 0F64 */,/*3941*/1729/* 0F65 */,/*3942*/1729/* 0F66 */,/*3943*/1729/* 0F67 */, /*3944*/1729/* 0F68 */,/*3945*/1767/* 0F69 */,/*3946*/1768/* 0F6A */,/*3947*/1769/* 0F6B */,/*3948*/1769/* 0F6C */,0,0,0, 0,/*3953*/1770/* 0F71 */,/*3954*/1771/* 0F72 */,/*3955*/1772/* 0F73 */,/*3956*/1773/* 0F74 */,/*3957*/1774/* 0F75 */, /*3958*/1775/* 0F76 */,/*3959*/1776/* 0F77 */,/*3960*/1777/* 0F78 */,/*3961*/1778/* 0F79 */,/*3962*/1771/* 0F7A */, /*3963*/1771/* 0F7B */,/*3964*/1771/* 0F7C */,/*3965*/1771/* 0F7D */,/*3966*/1779/* 0F7E */,/*3967*/1780/* 0F7F */, /*3968*/1771/* 0F80 */,/*3969*/1781/* 0F81 */,/*3970*/1782/* 0F82 */,/*3971*/1782/* 0F83 */,/*3972*/1783/* 0F84 */, /*3973*/1731/* 0F85 */,/*3974*/1782/* 0F86 */,/*3975*/1782/* 0F87 */,/*3976*/1729/* 0F88 */,/*3977*/1729/* 0F89 */, /*3978*/1729/* 0F8A */,/*3979*/1729/* 0F8B */,/*3980*/1784/* 0F8C */,/*3981*/1785/* 0F8D */,/*3982*/1785/* 0F8E */, /*3983*/1785/* 0F8F */,/*3984*/1779/* 0F90 */,/*3985*/1779/* 0F91 */,/*3986*/1779/* 0F92 */,/*3987*/1786/* 0F93 */, /*3988*/1779/* 0F94 */,/*3989*/1779/* 0F95 */,/*3990*/1787/* 0F96 */,/*3991*/1779/* 0F97 */,0,/*3993*/1779/* 0F99 */, /*3994*/1779/* 0F9A */,/*3995*/1779/* 0F9B */,/*3996*/1779/* 0F9C */,/*3997*/1788/* 0F9D */,/*3998*/1779/* 0F9E */, /*3999*/1779/* 0F9F */,/*4000*/1779/* 0FA0 */,/*4001*/1779/* 0FA1 */,/*4002*/1789/* 0FA2 */,/*4003*/1779/* 0FA3 */, /*4004*/1779/* 0FA4 */,/*4005*/1779/* 0FA5 */,/*4006*/1779/* 0FA6 */,/*4007*/1790/* 0FA7 */,/*4008*/1779/* 0FA8 */, /*4009*/1779/* 0FA9 */,/*4010*/1779/* 0FAA */,/*4011*/1779/* 0FAB */,/*4012*/1791/* 0FAC */,/*4013*/1779/* 0FAD */, /*4014*/1787/* 0FAE */,/*4015*/1787/* 0FAF */,/*4016*/1787/* 0FB0 */,/*4017*/1779/* 0FB1 */,/*4018*/1779/* 0FB2 */, /*4019*/1779/* 0FB3 */,/*4020*/1779/* 0FB4 */,/*4021*/1779/* 0FB5 */,/*4022*/1779/* 0FB6 */,/*4023*/1779/* 0FB7 */, /*4024*/1787/* 0FB8 */,/*4025*/1792/* 0FB9 */,/*4026*/1787/* 0FBA */,/*4027*/1787/* 0FBB */,/*4028*/1787/* 0FBC */,0, /*4030*/1793/* 0FBE */,/*4031*/1793/* 0FBF */,/*4032*/1793/* 0FC0 */,/*4033*/1793/* 0FC1 */,/*4034*/1793/* 0FC2 */, /*4035*/1793/* 0FC3 */,/*4036*/1793/* 0FC4 */,/*4037*/1793/* 0FC5 */,/*4038*/1794/* 0FC6 */,/*4039*/1793/* 0FC7 */, /*4040*/1793/* 0FC8 */,/*4041*/1793/* 0FC9 */,/*4042*/1793/* 0FCA */,/*4043*/1793/* 0FCB */,/*4044*/1793/* 0FCC */,0, /*4046*/1795/* 0FCE */,/*4047*/1793/* 0FCF */,/*4048*/1796/* 0FD0 */,/*4049*/1796/* 0FD1 */,/*4050*/1797/* 0FD2 */, /*4051*/1797/* 0FD3 */,/*4052*/1797/* 0FD4 */,/*4053*/1798/* 0FD5 */,/*4054*/1798/* 0FD6 */,/*4055*/1798/* 0FD7 */, /*4056*/1798/* 0FD8 */,/*4057*/1799/* 0FD9 */,/*4058*/1799/* 0FDA */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*4096*/1800/* 1000 */,/*4097*/1800/* 1001 */,/*4098*/1800/* 1002 */,/*4099*/1800/* 1003 */, /*4100*/1800/* 1004 */,/*4101*/1800/* 1005 */,/*4102*/1800/* 1006 */,/*4103*/1800/* 1007 */,/*4104*/1800/* 1008 */, /*4105*/1800/* 1009 */,/*4106*/1800/* 100A */,/*4107*/1800/* 100B */,/*4108*/1800/* 100C */,/*4109*/1800/* 100D */, /*4110*/1800/* 100E */,/*4111*/1800/* 100F */,/*4112*/1800/* 1010 */,/*4113*/1800/* 1011 */,/*4114*/1800/* 1012 */, /*4115*/1800/* 1013 */,/*4116*/1800/* 1014 */,/*4117*/1800/* 1015 */,/*4118*/1800/* 1016 */,/*4119*/1800/* 1017 */, /*4120*/1800/* 1018 */,/*4121*/1800/* 1019 */,/*4122*/1800/* 101A */,/*4123*/1800/* 101B */,/*4124*/1800/* 101C */, /*4125*/1800/* 101D */,/*4126*/1800/* 101E */,/*4127*/1800/* 101F */,/*4128*/1800/* 1020 */,/*4129*/1800/* 1021 */, /*4130*/1801/* 1022 */,/*4131*/1800/* 1023 */,/*4132*/1800/* 1024 */,/*4133*/1800/* 1025 */,/*4134*/1802/* 1026 */, /*4135*/1800/* 1027 */,/*4136*/1801/* 1028 */,/*4137*/1800/* 1029 */,/*4138*/1800/* 102A */,/*4139*/1803/* 102B */, /*4140*/1804/* 102C */,/*4141*/1805/* 102D */,/*4142*/1806/* 102E */,/*4143*/1805/* 102F */,/*4144*/1805/* 1030 */, /*4145*/1807/* 1031 */,/*4146*/1805/* 1032 */,/*4147*/1808/* 1033 */,/*4148*/1808/* 1034 */,/*4149*/1808/* 1035 */, /*4150*/1805/* 1036 */,/*4151*/1809/* 1037 */,/*4152*/1804/* 1038 */,/*4153*/1810/* 1039 */,/*4154*/1811/* 103A */, /*4155*/1812/* 103B */,/*4156*/1812/* 103C */,/*4157*/1808/* 103D */,/*4158*/1808/* 103E */,/*4159*/1801/* 103F */, /*4160*/1813/* 1040 */,/*4161*/1814/* 1041 */,/*4162*/1815/* 1042 */,/*4163*/1816/* 1043 */,/*4164*/1817/* 1044 */, /*4165*/1818/* 1045 */,/*4166*/1819/* 1046 */,/*4167*/1820/* 1047 */,/*4168*/1821/* 1048 */,/*4169*/1822/* 1049 */, /*4170*/1823/* 104A */,/*4171*/1823/* 104B */,/*4172*/1824/* 104C */,/*4173*/1824/* 104D */,/*4174*/1824/* 104E */, /*4175*/1824/* 104F */,/*4176*/1800/* 1050 */,/*4177*/1800/* 1051 */,/*4178*/1800/* 1052 */,/*4179*/1800/* 1053 */, /*4180*/1800/* 1054 */,/*4181*/1800/* 1055 */,/*4182*/1807/* 1056 */,/*4183*/1807/* 1057 */,/*4184*/1805/* 1058 */, /*4185*/1805/* 1059 */,/*4186*/1801/* 105A */,/*4187*/1801/* 105B */,/*4188*/1801/* 105C */,/*4189*/1801/* 105D */, /*4190*/1808/* 105E */,/*4191*/1808/* 105F */,/*4192*/1808/* 1060 */,/*4193*/1801/* 1061 */,/*4194*/1803/* 1062 */, /*4195*/1825/* 1063 */,/*4196*/1825/* 1064 */,/*4197*/1801/* 1065 */,/*4198*/1801/* 1066 */,/*4199*/1803/* 1067 */, /*4200*/1803/* 1068 */,/*4201*/1825/* 1069 */,/*4202*/1825/* 106A */,/*4203*/1825/* 106B */,/*4204*/1825/* 106C */, /*4205*/1825/* 106D */,/*4206*/1801/* 106E */,/*4207*/1801/* 106F */,/*4208*/1801/* 1070 */,/*4209*/1808/* 1071 */, /*4210*/1808/* 1072 */,/*4211*/1808/* 1073 */,/*4212*/1808/* 1074 */,/*4213*/1801/* 1075 */,/*4214*/1801/* 1076 */, /*4215*/1801/* 1077 */,/*4216*/1801/* 1078 */,/*4217*/1801/* 1079 */,/*4218*/1801/* 107A */,/*4219*/1801/* 107B */, /*4220*/1801/* 107C */,/*4221*/1801/* 107D */,/*4222*/1801/* 107E */,/*4223*/1801/* 107F */,/*4224*/1801/* 1080 */, /*4225*/1801/* 1081 */,/*4226*/1808/* 1082 */,/*4227*/1803/* 1083 */,/*4228*/1812/* 1084 */,/*4229*/1808/* 1085 */, /*4230*/1808/* 1086 */,/*4231*/1826/* 1087 */,/*4232*/1826/* 1088 */,/*4233*/1826/* 1089 */,/*4234*/1826/* 108A */, /*4235*/1826/* 108B */,/*4236*/1826/* 108C */,/*4237*/1827/* 108D */,/*4238*/1801/* 108E */,/*4239*/1826/* 108F */, /*4240*/1828/* 1090 */,/*4241*/1829/* 1091 */,/*4242*/1830/* 1092 */,/*4243*/1831/* 1093 */,/*4244*/1832/* 1094 */, /*4245*/1833/* 1095 */,/*4246*/1834/* 1096 */,/*4247*/1835/* 1097 */,/*4248*/1836/* 1098 */,/*4249*/1837/* 1099 */, /*4250*/1838/* 109A */,/*4251*/1838/* 109B */,/*4252*/1839/* 109C */,/*4253*/1840/* 109D */,/*4254*/1841/* 109E */, /*4255*/1841/* 109F */,/*4256*/1842/* 10A0 */,/*4257*/1843/* 10A1 */,/*4258*/1844/* 10A2 */,/*4259*/1845/* 10A3 */, /*4260*/1846/* 10A4 */,/*4261*/1847/* 10A5 */,/*4262*/1848/* 10A6 */,/*4263*/1849/* 10A7 */,/*4264*/1850/* 10A8 */, /*4265*/1851/* 10A9 */,/*4266*/1852/* 10AA */,/*4267*/1853/* 10AB */,/*4268*/1854/* 10AC */,/*4269*/1855/* 10AD */, /*4270*/1856/* 10AE */,/*4271*/1857/* 10AF */,/*4272*/1858/* 10B0 */,/*4273*/1859/* 10B1 */,/*4274*/1860/* 10B2 */, /*4275*/1861/* 10B3 */,/*4276*/1862/* 10B4 */,/*4277*/1863/* 10B5 */,/*4278*/1864/* 10B6 */,/*4279*/1865/* 10B7 */, /*4280*/1866/* 10B8 */,/*4281*/1867/* 10B9 */,/*4282*/1868/* 10BA */,/*4283*/1869/* 10BB */,/*4284*/1870/* 10BC */, /*4285*/1871/* 10BD */,/*4286*/1872/* 10BE */,/*4287*/1873/* 10BF */,/*4288*/1874/* 10C0 */,/*4289*/1875/* 10C1 */, /*4290*/1876/* 10C2 */,/*4291*/1877/* 10C3 */,/*4292*/1878/* 10C4 */,/*4293*/1879/* 10C5 */,0,/*4295*/1880/* 10C7 */,0,0, 0,0,0,/*4301*/1881/* 10CD */,0,0,/*4304*/1882/* 10D0 */,/*4305*/1882/* 10D1 */,/*4306*/1882/* 10D2 */, /*4307*/1882/* 10D3 */,/*4308*/1882/* 10D4 */,/*4309*/1882/* 10D5 */,/*4310*/1882/* 10D6 */,/*4311*/1882/* 10D7 */, /*4312*/1882/* 10D8 */,/*4313*/1882/* 10D9 */,/*4314*/1882/* 10DA */,/*4315*/1882/* 10DB */,/*4316*/1882/* 10DC */, /*4317*/1882/* 10DD */,/*4318*/1882/* 10DE */,/*4319*/1882/* 10DF */,/*4320*/1882/* 10E0 */,/*4321*/1882/* 10E1 */, /*4322*/1882/* 10E2 */,/*4323*/1882/* 10E3 */,/*4324*/1882/* 10E4 */,/*4325*/1882/* 10E5 */,/*4326*/1882/* 10E6 */, /*4327*/1882/* 10E7 */,/*4328*/1882/* 10E8 */,/*4329*/1882/* 10E9 */,/*4330*/1882/* 10EA */,/*4331*/1882/* 10EB */, /*4332*/1882/* 10EC */,/*4333*/1882/* 10ED */,/*4334*/1882/* 10EE */,/*4335*/1882/* 10EF */,/*4336*/1882/* 10F0 */, /*4337*/1882/* 10F1 */,/*4338*/1882/* 10F2 */,/*4339*/1882/* 10F3 */,/*4340*/1882/* 10F4 */,/*4341*/1882/* 10F5 */, /*4342*/1882/* 10F6 */,/*4343*/1883/* 10F7 */,/*4344*/1883/* 10F8 */,/*4345*/1884/* 10F9 */,/*4346*/1884/* 10FA */, /*4347*/1885/* 10FB */,/*4348*/1886/* 10FC */,/*4349*/1887/* 10FD */,/*4350*/1887/* 10FE */,/*4351*/1887/* 10FF */, /*4352*/1888/* 1100 */,/*4353*/1888/* 1101 */,/*4354*/1888/* 1102 */,/*4355*/1888/* 1103 */,/*4356*/1888/* 1104 */, /*4357*/1888/* 1105 */,/*4358*/1888/* 1106 */,/*4359*/1888/* 1107 */,/*4360*/1888/* 1108 */,/*4361*/1888/* 1109 */, /*4362*/1888/* 110A */,/*4363*/1888/* 110B */,/*4364*/1888/* 110C */,/*4365*/1888/* 110D */,/*4366*/1888/* 110E */, /*4367*/1888/* 110F */,/*4368*/1888/* 1110 */,/*4369*/1888/* 1111 */,/*4370*/1888/* 1112 */,/*4371*/1888/* 1113 */, /*4372*/1888/* 1114 */,/*4373*/1888/* 1115 */,/*4374*/1888/* 1116 */,/*4375*/1888/* 1117 */,/*4376*/1888/* 1118 */, /*4377*/1888/* 1119 */,/*4378*/1888/* 111A */,/*4379*/1888/* 111B */,/*4380*/1888/* 111C */,/*4381*/1888/* 111D */, /*4382*/1888/* 111E */,/*4383*/1888/* 111F */,/*4384*/1888/* 1120 */,/*4385*/1888/* 1121 */,/*4386*/1888/* 1122 */, /*4387*/1888/* 1123 */,/*4388*/1888/* 1124 */,/*4389*/1888/* 1125 */,/*4390*/1888/* 1126 */,/*4391*/1888/* 1127 */, /*4392*/1888/* 1128 */,/*4393*/1888/* 1129 */,/*4394*/1888/* 112A */,/*4395*/1888/* 112B */,/*4396*/1888/* 112C */, /*4397*/1888/* 112D */,/*4398*/1888/* 112E */,/*4399*/1888/* 112F */,/*4400*/1888/* 1130 */,/*4401*/1888/* 1131 */, /*4402*/1888/* 1132 */,/*4403*/1888/* 1133 */,/*4404*/1888/* 1134 */,/*4405*/1888/* 1135 */,/*4406*/1888/* 1136 */, /*4407*/1888/* 1137 */,/*4408*/1888/* 1138 */,/*4409*/1888/* 1139 */,/*4410*/1888/* 113A */,/*4411*/1888/* 113B */, /*4412*/1888/* 113C */,/*4413*/1888/* 113D */,/*4414*/1888/* 113E */,/*4415*/1888/* 113F */,/*4416*/1888/* 1140 */, /*4417*/1888/* 1141 */,/*4418*/1888/* 1142 */,/*4419*/1888/* 1143 */,/*4420*/1888/* 1144 */,/*4421*/1888/* 1145 */, /*4422*/1888/* 1146 */,/*4423*/1888/* 1147 */,/*4424*/1888/* 1148 */,/*4425*/1888/* 1149 */,/*4426*/1888/* 114A */, /*4427*/1888/* 114B */,/*4428*/1888/* 114C */,/*4429*/1888/* 114D */,/*4430*/1888/* 114E */,/*4431*/1888/* 114F */, /*4432*/1888/* 1150 */,/*4433*/1888/* 1151 */,/*4434*/1888/* 1152 */,/*4435*/1888/* 1153 */,/*4436*/1888/* 1154 */, /*4437*/1888/* 1155 */,/*4438*/1888/* 1156 */,/*4439*/1888/* 1157 */,/*4440*/1888/* 1158 */,/*4441*/1888/* 1159 */, /*4442*/1889/* 115A */,/*4443*/1889/* 115B */,/*4444*/1889/* 115C */,/*4445*/1889/* 115D */,/*4446*/1889/* 115E */, /*4447*/1890/* 115F */,/*4448*/1891/* 1160 */,/*4449*/1892/* 1161 */,/*4450*/1892/* 1162 */,/*4451*/1892/* 1163 */, /*4452*/1892/* 1164 */,/*4453*/1892/* 1165 */,/*4454*/1892/* 1166 */,/*4455*/1892/* 1167 */,/*4456*/1892/* 1168 */, /*4457*/1892/* 1169 */,/*4458*/1892/* 116A */,/*4459*/1892/* 116B */,/*4460*/1892/* 116C */,/*4461*/1892/* 116D */, /*4462*/1892/* 116E */,/*4463*/1892/* 116F */,/*4464*/1892/* 1170 */,/*4465*/1892/* 1171 */,/*4466*/1892/* 1172 */, /*4467*/1892/* 1173 */,/*4468*/1892/* 1174 */,/*4469*/1892/* 1175 */,/*4470*/1893/* 1176 */,/*4471*/1893/* 1177 */, /*4472*/1893/* 1178 */,/*4473*/1893/* 1179 */,/*4474*/1893/* 117A */,/*4475*/1893/* 117B */,/*4476*/1893/* 117C */, /*4477*/1893/* 117D */,/*4478*/1893/* 117E */,/*4479*/1893/* 117F */,/*4480*/1893/* 1180 */,/*4481*/1893/* 1181 */, /*4482*/1893/* 1182 */,/*4483*/1893/* 1183 */,/*4484*/1893/* 1184 */,/*4485*/1893/* 1185 */,/*4486*/1893/* 1186 */, /*4487*/1893/* 1187 */,/*4488*/1893/* 1188 */,/*4489*/1893/* 1189 */,/*4490*/1893/* 118A */,/*4491*/1893/* 118B */, /*4492*/1893/* 118C */,/*4493*/1893/* 118D */,/*4494*/1893/* 118E */,/*4495*/1893/* 118F */,/*4496*/1893/* 1190 */, /*4497*/1893/* 1191 */,/*4498*/1893/* 1192 */,/*4499*/1893/* 1193 */,/*4500*/1893/* 1194 */,/*4501*/1893/* 1195 */, /*4502*/1893/* 1196 */,/*4503*/1893/* 1197 */,/*4504*/1893/* 1198 */,/*4505*/1893/* 1199 */,/*4506*/1893/* 119A */, /*4507*/1893/* 119B */,/*4508*/1893/* 119C */,/*4509*/1893/* 119D */,/*4510*/1893/* 119E */,/*4511*/1893/* 119F */, /*4512*/1893/* 11A0 */,/*4513*/1893/* 11A1 */,/*4514*/1893/* 11A2 */,/*4515*/1894/* 11A3 */,/*4516*/1894/* 11A4 */, /*4517*/1894/* 11A5 */,/*4518*/1894/* 11A6 */,/*4519*/1894/* 11A7 */,/*4520*/1895/* 11A8 */,/*4521*/1895/* 11A9 */, /*4522*/1895/* 11AA */,/*4523*/1895/* 11AB */,/*4524*/1895/* 11AC */,/*4525*/1895/* 11AD */,/*4526*/1895/* 11AE */, /*4527*/1895/* 11AF */,/*4528*/1895/* 11B0 */,/*4529*/1895/* 11B1 */,/*4530*/1895/* 11B2 */,/*4531*/1895/* 11B3 */, /*4532*/1895/* 11B4 */,/*4533*/1895/* 11B5 */,/*4534*/1895/* 11B6 */,/*4535*/1895/* 11B7 */,/*4536*/1895/* 11B8 */, /*4537*/1895/* 11B9 */,/*4538*/1895/* 11BA */,/*4539*/1895/* 11BB */,/*4540*/1895/* 11BC */,/*4541*/1895/* 11BD */, /*4542*/1895/* 11BE */,/*4543*/1895/* 11BF */,/*4544*/1895/* 11C0 */,/*4545*/1895/* 11C1 */,/*4546*/1895/* 11C2 */, /*4547*/1896/* 11C3 */,/*4548*/1896/* 11C4 */,/*4549*/1896/* 11C5 */,/*4550*/1896/* 11C6 */,/*4551*/1896/* 11C7 */, /*4552*/1896/* 11C8 */,/*4553*/1896/* 11C9 */,/*4554*/1896/* 11CA */,/*4555*/1896/* 11CB */,/*4556*/1896/* 11CC */, /*4557*/1896/* 11CD */,/*4558*/1896/* 11CE */,/*4559*/1896/* 11CF */,/*4560*/1896/* 11D0 */,/*4561*/1896/* 11D1 */, /*4562*/1896/* 11D2 */,/*4563*/1896/* 11D3 */,/*4564*/1896/* 11D4 */,/*4565*/1896/* 11D5 */,/*4566*/1896/* 11D6 */, /*4567*/1896/* 11D7 */,/*4568*/1896/* 11D8 */,/*4569*/1896/* 11D9 */,/*4570*/1896/* 11DA */,/*4571*/1896/* 11DB */, /*4572*/1896/* 11DC */,/*4573*/1896/* 11DD */,/*4574*/1896/* 11DE */,/*4575*/1896/* 11DF */,/*4576*/1896/* 11E0 */, /*4577*/1896/* 11E1 */,/*4578*/1896/* 11E2 */,/*4579*/1896/* 11E3 */,/*4580*/1896/* 11E4 */,/*4581*/1896/* 11E5 */, /*4582*/1896/* 11E6 */,/*4583*/1896/* 11E7 */,/*4584*/1896/* 11E8 */,/*4585*/1896/* 11E9 */,/*4586*/1896/* 11EA */, /*4587*/1896/* 11EB */,/*4588*/1896/* 11EC */,/*4589*/1896/* 11ED */,/*4590*/1896/* 11EE */,/*4591*/1896/* 11EF */, /*4592*/1896/* 11F0 */,/*4593*/1896/* 11F1 */,/*4594*/1896/* 11F2 */,/*4595*/1896/* 11F3 */,/*4596*/1896/* 11F4 */, /*4597*/1896/* 11F5 */,/*4598*/1896/* 11F6 */,/*4599*/1896/* 11F7 */,/*4600*/1896/* 11F8 */,/*4601*/1896/* 11F9 */, /*4602*/1897/* 11FA */,/*4603*/1897/* 11FB */,/*4604*/1897/* 11FC */,/*4605*/1897/* 11FD */,/*4606*/1897/* 11FE */, /*4607*/1897/* 11FF */,/*4608*/1898/* 1200 */,/*4609*/1898/* 1201 */,/*4610*/1898/* 1202 */,/*4611*/1898/* 1203 */, /*4612*/1898/* 1204 */,/*4613*/1898/* 1205 */,/*4614*/1898/* 1206 */,/*4615*/1899/* 1207 */,/*4616*/1898/* 1208 */, /*4617*/1898/* 1209 */,/*4618*/1898/* 120A */,/*4619*/1898/* 120B */,/*4620*/1898/* 120C */,/*4621*/1898/* 120D */, /*4622*/1898/* 120E */,/*4623*/1898/* 120F */,/*4624*/1898/* 1210 */,/*4625*/1898/* 1211 */,/*4626*/1898/* 1212 */, /*4627*/1898/* 1213 */,/*4628*/1898/* 1214 */,/*4629*/1898/* 1215 */,/*4630*/1898/* 1216 */,/*4631*/1898/* 1217 */, /*4632*/1898/* 1218 */,/*4633*/1898/* 1219 */,/*4634*/1898/* 121A */,/*4635*/1898/* 121B */,/*4636*/1898/* 121C */, /*4637*/1898/* 121D */,/*4638*/1898/* 121E */,/*4639*/1898/* 121F */,/*4640*/1898/* 1220 */,/*4641*/1898/* 1221 */, /*4642*/1898/* 1222 */,/*4643*/1898/* 1223 */,/*4644*/1898/* 1224 */,/*4645*/1898/* 1225 */,/*4646*/1898/* 1226 */, /*4647*/1898/* 1227 */,/*4648*/1898/* 1228 */,/*4649*/1898/* 1229 */,/*4650*/1898/* 122A */,/*4651*/1898/* 122B */, /*4652*/1898/* 122C */,/*4653*/1898/* 122D */,/*4654*/1898/* 122E */,/*4655*/1898/* 122F */,/*4656*/1898/* 1230 */, /*4657*/1898/* 1231 */,/*4658*/1898/* 1232 */,/*4659*/1898/* 1233 */,/*4660*/1898/* 1234 */,/*4661*/1898/* 1235 */, /*4662*/1898/* 1236 */,/*4663*/1898/* 1237 */,/*4664*/1898/* 1238 */,/*4665*/1898/* 1239 */,/*4666*/1898/* 123A */, /*4667*/1898/* 123B */,/*4668*/1898/* 123C */,/*4669*/1898/* 123D */,/*4670*/1898/* 123E */,/*4671*/1898/* 123F */, /*4672*/1898/* 1240 */,/*4673*/1898/* 1241 */,/*4674*/1898/* 1242 */,/*4675*/1898/* 1243 */,/*4676*/1898/* 1244 */, /*4677*/1898/* 1245 */,/*4678*/1898/* 1246 */,/*4679*/1899/* 1247 */,/*4680*/1898/* 1248 */,0,/*4682*/1898/* 124A */, /*4683*/1898/* 124B */,/*4684*/1898/* 124C */,/*4685*/1898/* 124D */,0,0,/*4688*/1898/* 1250 */,/*4689*/1898/* 1251 */, /*4690*/1898/* 1252 */,/*4691*/1898/* 1253 */,/*4692*/1898/* 1254 */,/*4693*/1898/* 1255 */,/*4694*/1898/* 1256 */,0, /*4696*/1898/* 1258 */,0,/*4698*/1898/* 125A */,/*4699*/1898/* 125B */,/*4700*/1898/* 125C */,/*4701*/1898/* 125D */,0,0, /*4704*/1898/* 1260 */,/*4705*/1898/* 1261 */,/*4706*/1898/* 1262 */,/*4707*/1898/* 1263 */,/*4708*/1898/* 1264 */, /*4709*/1898/* 1265 */,/*4710*/1898/* 1266 */,/*4711*/1898/* 1267 */,/*4712*/1898/* 1268 */,/*4713*/1898/* 1269 */, /*4714*/1898/* 126A */,/*4715*/1898/* 126B */,/*4716*/1898/* 126C */,/*4717*/1898/* 126D */,/*4718*/1898/* 126E */, /*4719*/1898/* 126F */,/*4720*/1898/* 1270 */,/*4721*/1898/* 1271 */,/*4722*/1898/* 1272 */,/*4723*/1898/* 1273 */, /*4724*/1898/* 1274 */,/*4725*/1898/* 1275 */,/*4726*/1898/* 1276 */,/*4727*/1898/* 1277 */,/*4728*/1898/* 1278 */, /*4729*/1898/* 1279 */,/*4730*/1898/* 127A */,/*4731*/1898/* 127B */,/*4732*/1898/* 127C */,/*4733*/1898/* 127D */, /*4734*/1898/* 127E */,/*4735*/1898/* 127F */,/*4736*/1898/* 1280 */,/*4737*/1898/* 1281 */,/*4738*/1898/* 1282 */, /*4739*/1898/* 1283 */,/*4740*/1898/* 1284 */,/*4741*/1898/* 1285 */,/*4742*/1898/* 1286 */,/*4743*/1899/* 1287 */, /*4744*/1898/* 1288 */,0,/*4746*/1898/* 128A */,/*4747*/1898/* 128B */,/*4748*/1898/* 128C */,/*4749*/1898/* 128D */,0,0, /*4752*/1898/* 1290 */,/*4753*/1898/* 1291 */,/*4754*/1898/* 1292 */,/*4755*/1898/* 1293 */,/*4756*/1898/* 1294 */, /*4757*/1898/* 1295 */,/*4758*/1898/* 1296 */,/*4759*/1898/* 1297 */,/*4760*/1898/* 1298 */,/*4761*/1898/* 1299 */, /*4762*/1898/* 129A */,/*4763*/1898/* 129B */,/*4764*/1898/* 129C */,/*4765*/1898/* 129D */,/*4766*/1898/* 129E */, /*4767*/1898/* 129F */,/*4768*/1898/* 12A0 */,/*4769*/1898/* 12A1 */,/*4770*/1898/* 12A2 */,/*4771*/1898/* 12A3 */, /*4772*/1898/* 12A4 */,/*4773*/1898/* 12A5 */,/*4774*/1898/* 12A6 */,/*4775*/1898/* 12A7 */,/*4776*/1898/* 12A8 */, /*4777*/1898/* 12A9 */,/*4778*/1898/* 12AA */,/*4779*/1898/* 12AB */,/*4780*/1898/* 12AC */,/*4781*/1898/* 12AD */, /*4782*/1898/* 12AE */,/*4783*/1899/* 12AF */,/*4784*/1898/* 12B0 */,0,/*4786*/1898/* 12B2 */,/*4787*/1898/* 12B3 */, /*4788*/1898/* 12B4 */,/*4789*/1898/* 12B5 */,0,0,/*4792*/1898/* 12B8 */,/*4793*/1898/* 12B9 */,/*4794*/1898/* 12BA */, /*4795*/1898/* 12BB */,/*4796*/1898/* 12BC */,/*4797*/1898/* 12BD */,/*4798*/1898/* 12BE */,0,/*4800*/1898/* 12C0 */,0, /*4802*/1898/* 12C2 */,/*4803*/1898/* 12C3 */,/*4804*/1898/* 12C4 */,/*4805*/1898/* 12C5 */,0,0,/*4808*/1898/* 12C8 */, /*4809*/1898/* 12C9 */,/*4810*/1898/* 12CA */,/*4811*/1898/* 12CB */,/*4812*/1898/* 12CC */,/*4813*/1898/* 12CD */, /*4814*/1898/* 12CE */,/*4815*/1899/* 12CF */,/*4816*/1898/* 12D0 */,/*4817*/1898/* 12D1 */,/*4818*/1898/* 12D2 */, /*4819*/1898/* 12D3 */,/*4820*/1898/* 12D4 */,/*4821*/1898/* 12D5 */,/*4822*/1898/* 12D6 */,0,/*4824*/1898/* 12D8 */, /*4825*/1898/* 12D9 */,/*4826*/1898/* 12DA */,/*4827*/1898/* 12DB */,/*4828*/1898/* 12DC */,/*4829*/1898/* 12DD */, /*4830*/1898/* 12DE */,/*4831*/1898/* 12DF */,/*4832*/1898/* 12E0 */,/*4833*/1898/* 12E1 */,/*4834*/1898/* 12E2 */, /*4835*/1898/* 12E3 */,/*4836*/1898/* 12E4 */,/*4837*/1898/* 12E5 */,/*4838*/1898/* 12E6 */,/*4839*/1898/* 12E7 */, /*4840*/1898/* 12E8 */,/*4841*/1898/* 12E9 */,/*4842*/1898/* 12EA */,/*4843*/1898/* 12EB */,/*4844*/1898/* 12EC */, /*4845*/1898/* 12ED */,/*4846*/1898/* 12EE */,/*4847*/1899/* 12EF */,/*4848*/1898/* 12F0 */,/*4849*/1898/* 12F1 */, /*4850*/1898/* 12F2 */,/*4851*/1898/* 12F3 */,/*4852*/1898/* 12F4 */,/*4853*/1898/* 12F5 */,/*4854*/1898/* 12F6 */, /*4855*/1898/* 12F7 */,/*4856*/1898/* 12F8 */,/*4857*/1898/* 12F9 */,/*4858*/1898/* 12FA */,/*4859*/1898/* 12FB */, /*4860*/1898/* 12FC */,/*4861*/1898/* 12FD */,/*4862*/1898/* 12FE */,/*4863*/1898/* 12FF */,/*4864*/1898/* 1300 */, /*4865*/1898/* 1301 */,/*4866*/1898/* 1302 */,/*4867*/1898/* 1303 */,/*4868*/1898/* 1304 */,/*4869*/1898/* 1305 */, /*4870*/1898/* 1306 */,/*4871*/1898/* 1307 */,/*4872*/1898/* 1308 */,/*4873*/1898/* 1309 */,/*4874*/1898/* 130A */, /*4875*/1898/* 130B */,/*4876*/1898/* 130C */,/*4877*/1898/* 130D */,/*4878*/1898/* 130E */,/*4879*/1899/* 130F */, /*4880*/1898/* 1310 */,0,/*4882*/1898/* 1312 */,/*4883*/1898/* 1313 */,/*4884*/1898/* 1314 */,/*4885*/1898/* 1315 */,0,0, /*4888*/1898/* 1318 */,/*4889*/1898/* 1319 */,/*4890*/1898/* 131A */,/*4891*/1898/* 131B */,/*4892*/1898/* 131C */, /*4893*/1898/* 131D */,/*4894*/1898/* 131E */,/*4895*/1899/* 131F */,/*4896*/1898/* 1320 */,/*4897*/1898/* 1321 */, /*4898*/1898/* 1322 */,/*4899*/1898/* 1323 */,/*4900*/1898/* 1324 */,/*4901*/1898/* 1325 */,/*4902*/1898/* 1326 */, /*4903*/1898/* 1327 */,/*4904*/1898/* 1328 */,/*4905*/1898/* 1329 */,/*4906*/1898/* 132A */,/*4907*/1898/* 132B */, /*4908*/1898/* 132C */,/*4909*/1898/* 132D */,/*4910*/1898/* 132E */,/*4911*/1898/* 132F */,/*4912*/1898/* 1330 */, /*4913*/1898/* 1331 */,/*4914*/1898/* 1332 */,/*4915*/1898/* 1333 */,/*4916*/1898/* 1334 */,/*4917*/1898/* 1335 */, /*4918*/1898/* 1336 */,/*4919*/1898/* 1337 */,/*4920*/1898/* 1338 */,/*4921*/1898/* 1339 */,/*4922*/1898/* 133A */, /*4923*/1898/* 133B */,/*4924*/1898/* 133C */,/*4925*/1898/* 133D */,/*4926*/1898/* 133E */,/*4927*/1898/* 133F */, /*4928*/1898/* 1340 */,/*4929*/1898/* 1341 */,/*4930*/1898/* 1342 */,/*4931*/1898/* 1343 */,/*4932*/1898/* 1344 */, /*4933*/1898/* 1345 */,/*4934*/1898/* 1346 */,/*4935*/1899/* 1347 */,/*4936*/1898/* 1348 */,/*4937*/1898/* 1349 */, /*4938*/1898/* 134A */,/*4939*/1898/* 134B */,/*4940*/1898/* 134C */,/*4941*/1898/* 134D */,/*4942*/1898/* 134E */, /*4943*/1898/* 134F */,/*4944*/1898/* 1350 */,/*4945*/1898/* 1351 */,/*4946*/1898/* 1352 */,/*4947*/1898/* 1353 */, /*4948*/1898/* 1354 */,/*4949*/1898/* 1355 */,/*4950*/1898/* 1356 */,/*4951*/1898/* 1357 */,/*4952*/1898/* 1358 */, /*4953*/1898/* 1359 */,/*4954*/1898/* 135A */,0,0,/*4957*/1900/* 135D */,/*4958*/1900/* 135E */,/*4959*/1901/* 135F */, /*4960*/1902/* 1360 */,/*4961*/1903/* 1361 */,/*4962*/1904/* 1362 */,/*4963*/1903/* 1363 */,/*4964*/1903/* 1364 */, /*4965*/1903/* 1365 */,/*4966*/1903/* 1366 */,/*4967*/1904/* 1367 */,/*4968*/1904/* 1368 */,/*4969*/1905/* 1369 */, /*4970*/1906/* 136A */,/*4971*/1907/* 136B */,/*4972*/1908/* 136C */,/*4973*/1909/* 136D */,/*4974*/1910/* 136E */, /*4975*/1911/* 136F */,/*4976*/1912/* 1370 */,/*4977*/1913/* 1371 */,/*4978*/1914/* 1372 */,/*4979*/1915/* 1373 */, /*4980*/1916/* 1374 */,/*4981*/1917/* 1375 */,/*4982*/1918/* 1376 */,/*4983*/1919/* 1377 */,/*4984*/1920/* 1378 */, /*4985*/1921/* 1379 */,/*4986*/1922/* 137A */,/*4987*/1923/* 137B */,/*4988*/1924/* 137C */,0,0,0,/*4992*/1925/* 1380 */, /*4993*/1925/* 1381 */,/*4994*/1925/* 1382 */,/*4995*/1925/* 1383 */,/*4996*/1925/* 1384 */,/*4997*/1925/* 1385 */, /*4998*/1925/* 1386 */,/*4999*/1925/* 1387 */,/*5000*/1925/* 1388 */,/*5001*/1925/* 1389 */,/*5002*/1925/* 138A */, /*5003*/1925/* 138B */,/*5004*/1925/* 138C */,/*5005*/1925/* 138D */,/*5006*/1925/* 138E */,/*5007*/1925/* 138F */, /*5008*/1926/* 1390 */,/*5009*/1926/* 1391 */,/*5010*/1926/* 1392 */,/*5011*/1926/* 1393 */,/*5012*/1926/* 1394 */, /*5013*/1926/* 1395 */,/*5014*/1926/* 1396 */,/*5015*/1926/* 1397 */,/*5016*/1926/* 1398 */,/*5017*/1926/* 1399 */,0,0,0, 0,0,0,/*5024*/1927/* 13A0 */,/*5025*/1928/* 13A1 */,/*5026*/1929/* 13A2 */,/*5027*/1930/* 13A3 */,/*5028*/1931/* 13A4 */, /*5029*/1932/* 13A5 */,/*5030*/1933/* 13A6 */,/*5031*/1934/* 13A7 */,/*5032*/1935/* 13A8 */,/*5033*/1936/* 13A9 */, /*5034*/1937/* 13AA */,/*5035*/1938/* 13AB */,/*5036*/1939/* 13AC */,/*5037*/1940/* 13AD */,/*5038*/1941/* 13AE */, /*5039*/1942/* 13AF */,/*5040*/1943/* 13B0 */,/*5041*/1944/* 13B1 */,/*5042*/1945/* 13B2 */,/*5043*/1946/* 13B3 */, /*5044*/1947/* 13B4 */,/*5045*/1948/* 13B5 */,/*5046*/1949/* 13B6 */,/*5047*/1950/* 13B7 */,/*5048*/1951/* 13B8 */, /*5049*/1952/* 13B9 */,/*5050*/1953/* 13BA */,/*5051*/1954/* 13BB */,/*5052*/1955/* 13BC */,/*5053*/1956/* 13BD */, /*5054*/1957/* 13BE */,/*5055*/1958/* 13BF */,/*5056*/1959/* 13C0 */,/*5057*/1960/* 13C1 */,/*5058*/1961/* 13C2 */, /*5059*/1962/* 13C3 */,/*5060*/1963/* 13C4 */,/*5061*/1964/* 13C5 */,/*5062*/1965/* 13C6 */,/*5063*/1966/* 13C7 */, /*5064*/1967/* 13C8 */,/*5065*/1968/* 13C9 */,/*5066*/1969/* 13CA */,/*5067*/1970/* 13CB */,/*5068*/1971/* 13CC */, /*5069*/1972/* 13CD */,/*5070*/1973/* 13CE */,/*5071*/1974/* 13CF */,/*5072*/1975/* 13D0 */,/*5073*/1976/* 13D1 */, /*5074*/1977/* 13D2 */,/*5075*/1978/* 13D3 */,/*5076*/1979/* 13D4 */,/*5077*/1980/* 13D5 */,/*5078*/1981/* 13D6 */, /*5079*/1982/* 13D7 */,/*5080*/1983/* 13D8 */,/*5081*/1984/* 13D9 */,/*5082*/1985/* 13DA */,/*5083*/1986/* 13DB */, /*5084*/1987/* 13DC */,/*5085*/1988/* 13DD */,/*5086*/1989/* 13DE */,/*5087*/1990/* 13DF */,/*5088*/1991/* 13E0 */, /*5089*/1992/* 13E1 */,/*5090*/1993/* 13E2 */,/*5091*/1994/* 13E3 */,/*5092*/1995/* 13E4 */,/*5093*/1996/* 13E5 */, /*5094*/1997/* 13E6 */,/*5095*/1998/* 13E7 */,/*5096*/1999/* 13E8 */,/*5097*/2000/* 13E9 */,/*5098*/2001/* 13EA */, /*5099*/2002/* 13EB */,/*5100*/2003/* 13EC */,/*5101*/2004/* 13ED */,/*5102*/2005/* 13EE */,/*5103*/2006/* 13EF */, /*5104*/2007/* 13F0 */,/*5105*/2008/* 13F1 */,/*5106*/2009/* 13F2 */,/*5107*/2010/* 13F3 */,/*5108*/2011/* 13F4 */, /*5109*/2012/* 13F5 */,0,0,/*5112*/2013/* 13F8 */,/*5113*/2014/* 13F9 */,/*5114*/2015/* 13FA */,/*5115*/2016/* 13FB */, /*5116*/2017/* 13FC */,/*5117*/2018/* 13FD */,0,0,/*5120*/2019/* 1400 */,/*5121*/2020/* 1401 */,/*5122*/2020/* 1402 */, /*5123*/2020/* 1403 */,/*5124*/2020/* 1404 */,/*5125*/2020/* 1405 */,/*5126*/2020/* 1406 */,/*5127*/2020/* 1407 */, /*5128*/2020/* 1408 */,/*5129*/2020/* 1409 */,/*5130*/2020/* 140A */,/*5131*/2020/* 140B */,/*5132*/2020/* 140C */, /*5133*/2020/* 140D */,/*5134*/2020/* 140E */,/*5135*/2020/* 140F */,/*5136*/2020/* 1410 */,/*5137*/2020/* 1411 */, /*5138*/2020/* 1412 */,/*5139*/2020/* 1413 */,/*5140*/2020/* 1414 */,/*5141*/2020/* 1415 */,/*5142*/2020/* 1416 */, /*5143*/2020/* 1417 */,/*5144*/2020/* 1418 */,/*5145*/2020/* 1419 */,/*5146*/2020/* 141A */,/*5147*/2020/* 141B */, /*5148*/2020/* 141C */,/*5149*/2020/* 141D */,/*5150*/2020/* 141E */,/*5151*/2020/* 141F */,/*5152*/2020/* 1420 */, /*5153*/2020/* 1421 */,/*5154*/2020/* 1422 */,/*5155*/2020/* 1423 */,/*5156*/2020/* 1424 */,/*5157*/2020/* 1425 */, /*5158*/2020/* 1426 */,/*5159*/2020/* 1427 */,/*5160*/2020/* 1428 */,/*5161*/2020/* 1429 */,/*5162*/2020/* 142A */, /*5163*/2020/* 142B */,/*5164*/2020/* 142C */,/*5165*/2020/* 142D */,/*5166*/2020/* 142E */,/*5167*/2020/* 142F */, /*5168*/2020/* 1430 */,/*5169*/2020/* 1431 */,/*5170*/2020/* 1432 */,/*5171*/2020/* 1433 */,/*5172*/2020/* 1434 */, /*5173*/2020/* 1435 */,/*5174*/2020/* 1436 */,/*5175*/2020/* 1437 */,/*5176*/2020/* 1438 */,/*5177*/2020/* 1439 */, /*5178*/2020/* 143A */,/*5179*/2020/* 143B */,/*5180*/2020/* 143C */,/*5181*/2020/* 143D */,/*5182*/2020/* 143E */, /*5183*/2020/* 143F */,/*5184*/2020/* 1440 */,/*5185*/2020/* 1441 */,/*5186*/2020/* 1442 */,/*5187*/2020/* 1443 */, /*5188*/2020/* 1444 */,/*5189*/2020/* 1445 */,/*5190*/2020/* 1446 */,/*5191*/2020/* 1447 */,/*5192*/2020/* 1448 */, /*5193*/2020/* 1449 */,/*5194*/2020/* 144A */,/*5195*/2020/* 144B */,/*5196*/2020/* 144C */,/*5197*/2020/* 144D */, /*5198*/2020/* 144E */,/*5199*/2020/* 144F */,/*5200*/2020/* 1450 */,/*5201*/2020/* 1451 */,/*5202*/2020/* 1452 */, /*5203*/2020/* 1453 */,/*5204*/2020/* 1454 */,/*5205*/2020/* 1455 */,/*5206*/2020/* 1456 */,/*5207*/2020/* 1457 */, /*5208*/2020/* 1458 */,/*5209*/2020/* 1459 */,/*5210*/2020/* 145A */,/*5211*/2020/* 145B */,/*5212*/2020/* 145C */, /*5213*/2020/* 145D */,/*5214*/2020/* 145E */,/*5215*/2020/* 145F */,/*5216*/2020/* 1460 */,/*5217*/2020/* 1461 */, /*5218*/2020/* 1462 */,/*5219*/2020/* 1463 */,/*5220*/2020/* 1464 */,/*5221*/2020/* 1465 */,/*5222*/2020/* 1466 */, /*5223*/2020/* 1467 */,/*5224*/2020/* 1468 */,/*5225*/2020/* 1469 */,/*5226*/2020/* 146A */,/*5227*/2020/* 146B */, /*5228*/2020/* 146C */,/*5229*/2020/* 146D */,/*5230*/2020/* 146E */,/*5231*/2020/* 146F */,/*5232*/2020/* 1470 */, /*5233*/2020/* 1471 */,/*5234*/2020/* 1472 */,/*5235*/2020/* 1473 */,/*5236*/2020/* 1474 */,/*5237*/2020/* 1475 */, /*5238*/2020/* 1476 */,/*5239*/2020/* 1477 */,/*5240*/2020/* 1478 */,/*5241*/2020/* 1479 */,/*5242*/2020/* 147A */, /*5243*/2020/* 147B */,/*5244*/2020/* 147C */,/*5245*/2020/* 147D */,/*5246*/2020/* 147E */,/*5247*/2020/* 147F */, /*5248*/2020/* 1480 */,/*5249*/2020/* 1481 */,/*5250*/2020/* 1482 */,/*5251*/2020/* 1483 */,/*5252*/2020/* 1484 */, /*5253*/2020/* 1485 */,/*5254*/2020/* 1486 */,/*5255*/2020/* 1487 */,/*5256*/2020/* 1488 */,/*5257*/2020/* 1489 */, /*5258*/2020/* 148A */,/*5259*/2020/* 148B */,/*5260*/2020/* 148C */,/*5261*/2020/* 148D */,/*5262*/2020/* 148E */, /*5263*/2020/* 148F */,/*5264*/2020/* 1490 */,/*5265*/2020/* 1491 */,/*5266*/2020/* 1492 */,/*5267*/2020/* 1493 */, /*5268*/2020/* 1494 */,/*5269*/2020/* 1495 */,/*5270*/2020/* 1496 */,/*5271*/2020/* 1497 */,/*5272*/2020/* 1498 */, /*5273*/2020/* 1499 */,/*5274*/2020/* 149A */,/*5275*/2020/* 149B */,/*5276*/2020/* 149C */,/*5277*/2020/* 149D */, /*5278*/2020/* 149E */,/*5279*/2020/* 149F */,/*5280*/2020/* 14A0 */,/*5281*/2020/* 14A1 */,/*5282*/2020/* 14A2 */, /*5283*/2020/* 14A3 */,/*5284*/2020/* 14A4 */,/*5285*/2020/* 14A5 */,/*5286*/2020/* 14A6 */,/*5287*/2020/* 14A7 */, /*5288*/2020/* 14A8 */,/*5289*/2020/* 14A9 */,/*5290*/2020/* 14AA */,/*5291*/2020/* 14AB */,/*5292*/2020/* 14AC */, /*5293*/2020/* 14AD */,/*5294*/2020/* 14AE */,/*5295*/2020/* 14AF */,/*5296*/2020/* 14B0 */,/*5297*/2020/* 14B1 */, /*5298*/2020/* 14B2 */,/*5299*/2020/* 14B3 */,/*5300*/2020/* 14B4 */,/*5301*/2020/* 14B5 */,/*5302*/2020/* 14B6 */, /*5303*/2020/* 14B7 */,/*5304*/2020/* 14B8 */,/*5305*/2020/* 14B9 */,/*5306*/2020/* 14BA */,/*5307*/2020/* 14BB */, /*5308*/2020/* 14BC */,/*5309*/2020/* 14BD */,/*5310*/2020/* 14BE */,/*5311*/2020/* 14BF */,/*5312*/2020/* 14C0 */, /*5313*/2020/* 14C1 */,/*5314*/2020/* 14C2 */,/*5315*/2020/* 14C3 */,/*5316*/2020/* 14C4 */,/*5317*/2020/* 14C5 */, /*5318*/2020/* 14C6 */,/*5319*/2020/* 14C7 */,/*5320*/2020/* 14C8 */,/*5321*/2020/* 14C9 */,/*5322*/2020/* 14CA */, /*5323*/2020/* 14CB */,/*5324*/2020/* 14CC */,/*5325*/2020/* 14CD */,/*5326*/2020/* 14CE */,/*5327*/2020/* 14CF */, /*5328*/2020/* 14D0 */,/*5329*/2020/* 14D1 */,/*5330*/2020/* 14D2 */,/*5331*/2020/* 14D3 */,/*5332*/2020/* 14D4 */, /*5333*/2020/* 14D5 */,/*5334*/2020/* 14D6 */,/*5335*/2020/* 14D7 */,/*5336*/2020/* 14D8 */,/*5337*/2020/* 14D9 */, /*5338*/2020/* 14DA */,/*5339*/2020/* 14DB */,/*5340*/2020/* 14DC */,/*5341*/2020/* 14DD */,/*5342*/2020/* 14DE */, /*5343*/2020/* 14DF */,/*5344*/2020/* 14E0 */,/*5345*/2020/* 14E1 */,/*5346*/2020/* 14E2 */,/*5347*/2020/* 14E3 */, /*5348*/2020/* 14E4 */,/*5349*/2020/* 14E5 */,/*5350*/2020/* 14E6 */,/*5351*/2020/* 14E7 */,/*5352*/2020/* 14E8 */, /*5353*/2020/* 14E9 */,/*5354*/2020/* 14EA */,/*5355*/2020/* 14EB */,/*5356*/2020/* 14EC */,/*5357*/2020/* 14ED */, /*5358*/2020/* 14EE */,/*5359*/2020/* 14EF */,/*5360*/2020/* 14F0 */,/*5361*/2020/* 14F1 */,/*5362*/2020/* 14F2 */, /*5363*/2020/* 14F3 */,/*5364*/2020/* 14F4 */,/*5365*/2020/* 14F5 */,/*5366*/2020/* 14F6 */,/*5367*/2020/* 14F7 */, /*5368*/2020/* 14F8 */,/*5369*/2020/* 14F9 */,/*5370*/2020/* 14FA */,/*5371*/2020/* 14FB */,/*5372*/2020/* 14FC */, /*5373*/2020/* 14FD */,/*5374*/2020/* 14FE */,/*5375*/2020/* 14FF */,/*5376*/2020/* 1500 */,/*5377*/2020/* 1501 */, /*5378*/2020/* 1502 */,/*5379*/2020/* 1503 */,/*5380*/2020/* 1504 */,/*5381*/2020/* 1505 */,/*5382*/2020/* 1506 */, /*5383*/2020/* 1507 */,/*5384*/2020/* 1508 */,/*5385*/2020/* 1509 */,/*5386*/2020/* 150A */,/*5387*/2020/* 150B */, /*5388*/2020/* 150C */,/*5389*/2020/* 150D */,/*5390*/2020/* 150E */,/*5391*/2020/* 150F */,/*5392*/2020/* 1510 */, /*5393*/2020/* 1511 */,/*5394*/2020/* 1512 */,/*5395*/2020/* 1513 */,/*5396*/2020/* 1514 */,/*5397*/2020/* 1515 */, /*5398*/2020/* 1516 */,/*5399*/2020/* 1517 */,/*5400*/2020/* 1518 */,/*5401*/2020/* 1519 */,/*5402*/2020/* 151A */, /*5403*/2020/* 151B */,/*5404*/2020/* 151C */,/*5405*/2020/* 151D */,/*5406*/2020/* 151E */,/*5407*/2020/* 151F */, /*5408*/2020/* 1520 */,/*5409*/2020/* 1521 */,/*5410*/2020/* 1522 */,/*5411*/2020/* 1523 */,/*5412*/2020/* 1524 */, /*5413*/2020/* 1525 */,/*5414*/2020/* 1526 */,/*5415*/2020/* 1527 */,/*5416*/2020/* 1528 */,/*5417*/2020/* 1529 */, /*5418*/2020/* 152A */,/*5419*/2020/* 152B */,/*5420*/2020/* 152C */,/*5421*/2020/* 152D */,/*5422*/2020/* 152E */, /*5423*/2020/* 152F */,/*5424*/2020/* 1530 */,/*5425*/2020/* 1531 */,/*5426*/2020/* 1532 */,/*5427*/2020/* 1533 */, /*5428*/2020/* 1534 */,/*5429*/2020/* 1535 */,/*5430*/2020/* 1536 */,/*5431*/2020/* 1537 */,/*5432*/2020/* 1538 */, /*5433*/2020/* 1539 */,/*5434*/2020/* 153A */,/*5435*/2020/* 153B */,/*5436*/2020/* 153C */,/*5437*/2020/* 153D */, /*5438*/2020/* 153E */,/*5439*/2020/* 153F */,/*5440*/2020/* 1540 */,/*5441*/2020/* 1541 */,/*5442*/2020/* 1542 */, /*5443*/2020/* 1543 */,/*5444*/2020/* 1544 */,/*5445*/2020/* 1545 */,/*5446*/2020/* 1546 */,/*5447*/2020/* 1547 */, /*5448*/2020/* 1548 */,/*5449*/2020/* 1549 */,/*5450*/2020/* 154A */,/*5451*/2020/* 154B */,/*5452*/2020/* 154C */, /*5453*/2020/* 154D */,/*5454*/2020/* 154E */,/*5455*/2020/* 154F */,/*5456*/2020/* 1550 */,/*5457*/2020/* 1551 */, /*5458*/2020/* 1552 */,/*5459*/2020/* 1553 */,/*5460*/2020/* 1554 */,/*5461*/2020/* 1555 */,/*5462*/2020/* 1556 */, /*5463*/2020/* 1557 */,/*5464*/2020/* 1558 */,/*5465*/2020/* 1559 */,/*5466*/2020/* 155A */,/*5467*/2020/* 155B */, /*5468*/2020/* 155C */,/*5469*/2020/* 155D */,/*5470*/2020/* 155E */,/*5471*/2020/* 155F */,/*5472*/2020/* 1560 */, /*5473*/2020/* 1561 */,/*5474*/2020/* 1562 */,/*5475*/2020/* 1563 */,/*5476*/2020/* 1564 */,/*5477*/2020/* 1565 */, /*5478*/2020/* 1566 */,/*5479*/2020/* 1567 */,/*5480*/2020/* 1568 */,/*5481*/2020/* 1569 */,/*5482*/2020/* 156A */, /*5483*/2020/* 156B */,/*5484*/2020/* 156C */,/*5485*/2020/* 156D */,/*5486*/2020/* 156E */,/*5487*/2020/* 156F */, /*5488*/2020/* 1570 */,/*5489*/2020/* 1571 */,/*5490*/2020/* 1572 */,/*5491*/2020/* 1573 */,/*5492*/2020/* 1574 */, /*5493*/2020/* 1575 */,/*5494*/2020/* 1576 */,/*5495*/2020/* 1577 */,/*5496*/2020/* 1578 */,/*5497*/2020/* 1579 */, /*5498*/2020/* 157A */,/*5499*/2020/* 157B */,/*5500*/2020/* 157C */,/*5501*/2020/* 157D */,/*5502*/2020/* 157E */, /*5503*/2020/* 157F */,/*5504*/2020/* 1580 */,/*5505*/2020/* 1581 */,/*5506*/2020/* 1582 */,/*5507*/2020/* 1583 */, /*5508*/2020/* 1584 */,/*5509*/2020/* 1585 */,/*5510*/2020/* 1586 */,/*5511*/2020/* 1587 */,/*5512*/2020/* 1588 */, /*5513*/2020/* 1589 */,/*5514*/2020/* 158A */,/*5515*/2020/* 158B */,/*5516*/2020/* 158C */,/*5517*/2020/* 158D */, /*5518*/2020/* 158E */,/*5519*/2020/* 158F */,/*5520*/2020/* 1590 */,/*5521*/2020/* 1591 */,/*5522*/2020/* 1592 */, /*5523*/2020/* 1593 */,/*5524*/2020/* 1594 */,/*5525*/2020/* 1595 */,/*5526*/2020/* 1596 */,/*5527*/2020/* 1597 */, /*5528*/2020/* 1598 */,/*5529*/2020/* 1599 */,/*5530*/2020/* 159A */,/*5531*/2020/* 159B */,/*5532*/2020/* 159C */, /*5533*/2020/* 159D */,/*5534*/2020/* 159E */,/*5535*/2020/* 159F */,/*5536*/2020/* 15A0 */,/*5537*/2020/* 15A1 */, /*5538*/2020/* 15A2 */,/*5539*/2020/* 15A3 */,/*5540*/2020/* 15A4 */,/*5541*/2020/* 15A5 */,/*5542*/2020/* 15A6 */, /*5543*/2020/* 15A7 */,/*5544*/2020/* 15A8 */,/*5545*/2020/* 15A9 */,/*5546*/2020/* 15AA */,/*5547*/2020/* 15AB */, /*5548*/2020/* 15AC */,/*5549*/2020/* 15AD */,/*5550*/2020/* 15AE */,/*5551*/2020/* 15AF */,/*5552*/2020/* 15B0 */, /*5553*/2020/* 15B1 */,/*5554*/2020/* 15B2 */,/*5555*/2020/* 15B3 */,/*5556*/2020/* 15B4 */,/*5557*/2020/* 15B5 */, /*5558*/2020/* 15B6 */,/*5559*/2020/* 15B7 */,/*5560*/2020/* 15B8 */,/*5561*/2020/* 15B9 */,/*5562*/2020/* 15BA */, /*5563*/2020/* 15BB */,/*5564*/2020/* 15BC */,/*5565*/2020/* 15BD */,/*5566*/2020/* 15BE */,/*5567*/2020/* 15BF */, /*5568*/2020/* 15C0 */,/*5569*/2020/* 15C1 */,/*5570*/2020/* 15C2 */,/*5571*/2020/* 15C3 */,/*5572*/2020/* 15C4 */, /*5573*/2020/* 15C5 */,/*5574*/2020/* 15C6 */,/*5575*/2020/* 15C7 */,/*5576*/2020/* 15C8 */,/*5577*/2020/* 15C9 */, /*5578*/2020/* 15CA */,/*5579*/2020/* 15CB */,/*5580*/2020/* 15CC */,/*5581*/2020/* 15CD */,/*5582*/2020/* 15CE */, /*5583*/2020/* 15CF */,/*5584*/2020/* 15D0 */,/*5585*/2020/* 15D1 */,/*5586*/2020/* 15D2 */,/*5587*/2020/* 15D3 */, /*5588*/2020/* 15D4 */,/*5589*/2020/* 15D5 */,/*5590*/2020/* 15D6 */,/*5591*/2020/* 15D7 */,/*5592*/2020/* 15D8 */, /*5593*/2020/* 15D9 */,/*5594*/2020/* 15DA */,/*5595*/2020/* 15DB */,/*5596*/2020/* 15DC */,/*5597*/2020/* 15DD */, /*5598*/2020/* 15DE */,/*5599*/2020/* 15DF */,/*5600*/2020/* 15E0 */,/*5601*/2020/* 15E1 */,/*5602*/2020/* 15E2 */, /*5603*/2020/* 15E3 */,/*5604*/2020/* 15E4 */,/*5605*/2020/* 15E5 */,/*5606*/2020/* 15E6 */,/*5607*/2020/* 15E7 */, /*5608*/2020/* 15E8 */,/*5609*/2020/* 15E9 */,/*5610*/2020/* 15EA */,/*5611*/2020/* 15EB */,/*5612*/2020/* 15EC */, /*5613*/2020/* 15ED */,/*5614*/2020/* 15EE */,/*5615*/2020/* 15EF */,/*5616*/2020/* 15F0 */,/*5617*/2020/* 15F1 */, /*5618*/2020/* 15F2 */,/*5619*/2020/* 15F3 */,/*5620*/2020/* 15F4 */,/*5621*/2020/* 15F5 */,/*5622*/2020/* 15F6 */, /*5623*/2020/* 15F7 */,/*5624*/2020/* 15F8 */,/*5625*/2020/* 15F9 */,/*5626*/2020/* 15FA */,/*5627*/2020/* 15FB */, /*5628*/2020/* 15FC */,/*5629*/2020/* 15FD */,/*5630*/2020/* 15FE */,/*5631*/2020/* 15FF */,/*5632*/2020/* 1600 */, /*5633*/2020/* 1601 */,/*5634*/2020/* 1602 */,/*5635*/2020/* 1603 */,/*5636*/2020/* 1604 */,/*5637*/2020/* 1605 */, /*5638*/2020/* 1606 */,/*5639*/2020/* 1607 */,/*5640*/2020/* 1608 */,/*5641*/2020/* 1609 */,/*5642*/2020/* 160A */, /*5643*/2020/* 160B */,/*5644*/2020/* 160C */,/*5645*/2020/* 160D */,/*5646*/2020/* 160E */,/*5647*/2020/* 160F */, /*5648*/2020/* 1610 */,/*5649*/2020/* 1611 */,/*5650*/2020/* 1612 */,/*5651*/2020/* 1613 */,/*5652*/2020/* 1614 */, /*5653*/2020/* 1615 */,/*5654*/2020/* 1616 */,/*5655*/2020/* 1617 */,/*5656*/2020/* 1618 */,/*5657*/2020/* 1619 */, /*5658*/2020/* 161A */,/*5659*/2020/* 161B */,/*5660*/2020/* 161C */,/*5661*/2020/* 161D */,/*5662*/2020/* 161E */, /*5663*/2020/* 161F */,/*5664*/2020/* 1620 */,/*5665*/2020/* 1621 */,/*5666*/2020/* 1622 */,/*5667*/2020/* 1623 */, /*5668*/2020/* 1624 */,/*5669*/2020/* 1625 */,/*5670*/2020/* 1626 */,/*5671*/2020/* 1627 */,/*5672*/2020/* 1628 */, /*5673*/2020/* 1629 */,/*5674*/2020/* 162A */,/*5675*/2020/* 162B */,/*5676*/2020/* 162C */,/*5677*/2020/* 162D */, /*5678*/2020/* 162E */,/*5679*/2020/* 162F */,/*5680*/2020/* 1630 */,/*5681*/2020/* 1631 */,/*5682*/2020/* 1632 */, /*5683*/2020/* 1633 */,/*5684*/2020/* 1634 */,/*5685*/2020/* 1635 */,/*5686*/2020/* 1636 */,/*5687*/2020/* 1637 */, /*5688*/2020/* 1638 */,/*5689*/2020/* 1639 */,/*5690*/2020/* 163A */,/*5691*/2020/* 163B */,/*5692*/2020/* 163C */, /*5693*/2020/* 163D */,/*5694*/2020/* 163E */,/*5695*/2020/* 163F */,/*5696*/2020/* 1640 */,/*5697*/2020/* 1641 */, /*5698*/2020/* 1642 */,/*5699*/2020/* 1643 */,/*5700*/2020/* 1644 */,/*5701*/2020/* 1645 */,/*5702*/2020/* 1646 */, /*5703*/2020/* 1647 */,/*5704*/2020/* 1648 */,/*5705*/2020/* 1649 */,/*5706*/2020/* 164A */,/*5707*/2020/* 164B */, /*5708*/2020/* 164C */,/*5709*/2020/* 164D */,/*5710*/2020/* 164E */,/*5711*/2020/* 164F */,/*5712*/2020/* 1650 */, /*5713*/2020/* 1651 */,/*5714*/2020/* 1652 */,/*5715*/2020/* 1653 */,/*5716*/2020/* 1654 */,/*5717*/2020/* 1655 */, /*5718*/2020/* 1656 */,/*5719*/2020/* 1657 */,/*5720*/2020/* 1658 */,/*5721*/2020/* 1659 */,/*5722*/2020/* 165A */, /*5723*/2020/* 165B */,/*5724*/2020/* 165C */,/*5725*/2020/* 165D */,/*5726*/2020/* 165E */,/*5727*/2020/* 165F */, /*5728*/2020/* 1660 */,/*5729*/2020/* 1661 */,/*5730*/2020/* 1662 */,/*5731*/2020/* 1663 */,/*5732*/2020/* 1664 */, /*5733*/2020/* 1665 */,/*5734*/2020/* 1666 */,/*5735*/2020/* 1667 */,/*5736*/2020/* 1668 */,/*5737*/2020/* 1669 */, /*5738*/2020/* 166A */,/*5739*/2020/* 166B */,/*5740*/2020/* 166C */,/*5741*/2021/* 166D */,/*5742*/2022/* 166E */, /*5743*/2020/* 166F */,/*5744*/2020/* 1670 */,/*5745*/2020/* 1671 */,/*5746*/2020/* 1672 */,/*5747*/2020/* 1673 */, /*5748*/2020/* 1674 */,/*5749*/2020/* 1675 */,/*5750*/2020/* 1676 */,/*5751*/2023/* 1677 */,/*5752*/2023/* 1678 */, /*5753*/2023/* 1679 */,/*5754*/2023/* 167A */,/*5755*/2023/* 167B */,/*5756*/2023/* 167C */,/*5757*/2023/* 167D */, /*5758*/2023/* 167E */,/*5759*/2023/* 167F */,/*5760*/2024/* 1680 */,/*5761*/2025/* 1681 */,/*5762*/2025/* 1682 */, /*5763*/2025/* 1683 */,/*5764*/2025/* 1684 */,/*5765*/2025/* 1685 */,/*5766*/2025/* 1686 */,/*5767*/2025/* 1687 */, /*5768*/2025/* 1688 */,/*5769*/2025/* 1689 */,/*5770*/2025/* 168A */,/*5771*/2025/* 168B */,/*5772*/2025/* 168C */, /*5773*/2025/* 168D */,/*5774*/2025/* 168E */,/*5775*/2025/* 168F */,/*5776*/2025/* 1690 */,/*5777*/2025/* 1691 */, /*5778*/2025/* 1692 */,/*5779*/2025/* 1693 */,/*5780*/2025/* 1694 */,/*5781*/2025/* 1695 */,/*5782*/2025/* 1696 */, /*5783*/2025/* 1697 */,/*5784*/2025/* 1698 */,/*5785*/2025/* 1699 */,/*5786*/2025/* 169A */,/*5787*/2026/* 169B */, /*5788*/2027/* 169C */,0,0,0,/*5792*/2028/* 16A0 */,/*5793*/2028/* 16A1 */,/*5794*/2028/* 16A2 */,/*5795*/2028/* 16A3 */, /*5796*/2028/* 16A4 */,/*5797*/2028/* 16A5 */,/*5798*/2028/* 16A6 */,/*5799*/2028/* 16A7 */,/*5800*/2028/* 16A8 */, /*5801*/2028/* 16A9 */,/*5802*/2028/* 16AA */,/*5803*/2028/* 16AB */,/*5804*/2028/* 16AC */,/*5805*/2028/* 16AD */, /*5806*/2028/* 16AE */,/*5807*/2028/* 16AF */,/*5808*/2028/* 16B0 */,/*5809*/2028/* 16B1 */,/*5810*/2028/* 16B2 */, /*5811*/2028/* 16B3 */,/*5812*/2028/* 16B4 */,/*5813*/2028/* 16B5 */,/*5814*/2028/* 16B6 */,/*5815*/2028/* 16B7 */, /*5816*/2028/* 16B8 */,/*5817*/2028/* 16B9 */,/*5818*/2028/* 16BA */,/*5819*/2028/* 16BB */,/*5820*/2028/* 16BC */, /*5821*/2028/* 16BD */,/*5822*/2028/* 16BE */,/*5823*/2028/* 16BF */,/*5824*/2028/* 16C0 */,/*5825*/2028/* 16C1 */, /*5826*/2028/* 16C2 */,/*5827*/2028/* 16C3 */,/*5828*/2028/* 16C4 */,/*5829*/2028/* 16C5 */,/*5830*/2028/* 16C6 */, /*5831*/2028/* 16C7 */,/*5832*/2028/* 16C8 */,/*5833*/2028/* 16C9 */,/*5834*/2028/* 16CA */,/*5835*/2028/* 16CB */, /*5836*/2028/* 16CC */,/*5837*/2028/* 16CD */,/*5838*/2028/* 16CE */,/*5839*/2028/* 16CF */,/*5840*/2028/* 16D0 */, /*5841*/2028/* 16D1 */,/*5842*/2028/* 16D2 */,/*5843*/2028/* 16D3 */,/*5844*/2028/* 16D4 */,/*5845*/2028/* 16D5 */, /*5846*/2028/* 16D6 */,/*5847*/2028/* 16D7 */,/*5848*/2028/* 16D8 */,/*5849*/2028/* 16D9 */,/*5850*/2028/* 16DA */, /*5851*/2028/* 16DB */,/*5852*/2028/* 16DC */,/*5853*/2028/* 16DD */,/*5854*/2028/* 16DE */,/*5855*/2028/* 16DF */, /*5856*/2028/* 16E0 */,/*5857*/2028/* 16E1 */,/*5858*/2028/* 16E2 */,/*5859*/2028/* 16E3 */,/*5860*/2028/* 16E4 */, /*5861*/2028/* 16E5 */,/*5862*/2028/* 16E6 */,/*5863*/2028/* 16E7 */,/*5864*/2028/* 16E8 */,/*5865*/2028/* 16E9 */, /*5866*/2028/* 16EA */,/*5867*/2029/* 16EB */,/*5868*/2029/* 16EC */,/*5869*/2029/* 16ED */,/*5870*/2030/* 16EE */, /*5871*/2031/* 16EF */,/*5872*/2032/* 16F0 */,/*5873*/2033/* 16F1 */,/*5874*/2033/* 16F2 */,/*5875*/2033/* 16F3 */, /*5876*/2033/* 16F4 */,/*5877*/2033/* 16F5 */,/*5878*/2033/* 16F6 */,/*5879*/2033/* 16F7 */,/*5880*/2033/* 16F8 */,0,0,0, 0,0,0,0,/*5888*/2034/* 1700 */,/*5889*/2034/* 1701 */,/*5890*/2034/* 1702 */,/*5891*/2034/* 1703 */, /*5892*/2034/* 1704 */,/*5893*/2034/* 1705 */,/*5894*/2034/* 1706 */,/*5895*/2034/* 1707 */,/*5896*/2034/* 1708 */, /*5897*/2034/* 1709 */,/*5898*/2034/* 170A */,/*5899*/2034/* 170B */,/*5900*/2034/* 170C */,0,/*5902*/2034/* 170E */, /*5903*/2034/* 170F */,/*5904*/2034/* 1710 */,/*5905*/2034/* 1711 */,/*5906*/2035/* 1712 */,/*5907*/2035/* 1713 */, /*5908*/2036/* 1714 */,0,0,0,0,0,0,0,0,0,0,0,/*5920*/2037/* 1720 */,/*5921*/2037/* 1721 */,/*5922*/2037/* 1722 */, /*5923*/2037/* 1723 */,/*5924*/2037/* 1724 */,/*5925*/2037/* 1725 */,/*5926*/2037/* 1726 */,/*5927*/2037/* 1727 */, /*5928*/2037/* 1728 */,/*5929*/2037/* 1729 */,/*5930*/2037/* 172A */,/*5931*/2037/* 172B */,/*5932*/2037/* 172C */, /*5933*/2037/* 172D */,/*5934*/2037/* 172E */,/*5935*/2037/* 172F */,/*5936*/2037/* 1730 */,/*5937*/2037/* 1731 */, /*5938*/2038/* 1732 */,/*5939*/2038/* 1733 */,/*5940*/2039/* 1734 */,/*5941*/2040/* 1735 */,/*5942*/2040/* 1736 */,0,0,0, 0,0,0,0,0,0,/*5952*/2041/* 1740 */,/*5953*/2041/* 1741 */,/*5954*/2041/* 1742 */,/*5955*/2041/* 1743 */, /*5956*/2041/* 1744 */,/*5957*/2041/* 1745 */,/*5958*/2041/* 1746 */,/*5959*/2041/* 1747 */,/*5960*/2041/* 1748 */, /*5961*/2041/* 1749 */,/*5962*/2041/* 174A */,/*5963*/2041/* 174B */,/*5964*/2041/* 174C */,/*5965*/2041/* 174D */, /*5966*/2041/* 174E */,/*5967*/2041/* 174F */,/*5968*/2041/* 1750 */,/*5969*/2041/* 1751 */,/*5970*/2042/* 1752 */, /*5971*/2042/* 1753 */,0,0,0,0,0,0,0,0,0,0,0,0,/*5984*/2043/* 1760 */,/*5985*/2043/* 1761 */,/*5986*/2043/* 1762 */, /*5987*/2043/* 1763 */,/*5988*/2043/* 1764 */,/*5989*/2043/* 1765 */,/*5990*/2043/* 1766 */,/*5991*/2043/* 1767 */, /*5992*/2043/* 1768 */,/*5993*/2043/* 1769 */,/*5994*/2043/* 176A */,/*5995*/2043/* 176B */,/*5996*/2043/* 176C */,0, /*5998*/2043/* 176E */,/*5999*/2043/* 176F */,/*6000*/2043/* 1770 */,0,/*6002*/2044/* 1772 */,/*6003*/2044/* 1773 */,0,0, 0,0,0,0,0,0,0,0,0,0,/*6016*/2045/* 1780 */,/*6017*/2045/* 1781 */,/*6018*/2045/* 1782 */,/*6019*/2045/* 1783 */, /*6020*/2045/* 1784 */,/*6021*/2045/* 1785 */,/*6022*/2045/* 1786 */,/*6023*/2045/* 1787 */,/*6024*/2045/* 1788 */, /*6025*/2045/* 1789 */,/*6026*/2045/* 178A */,/*6027*/2045/* 178B */,/*6028*/2045/* 178C */,/*6029*/2045/* 178D */, /*6030*/2045/* 178E */,/*6031*/2045/* 178F */,/*6032*/2045/* 1790 */,/*6033*/2045/* 1791 */,/*6034*/2045/* 1792 */, /*6035*/2045/* 1793 */,/*6036*/2045/* 1794 */,/*6037*/2045/* 1795 */,/*6038*/2045/* 1796 */,/*6039*/2045/* 1797 */, /*6040*/2045/* 1798 */,/*6041*/2045/* 1799 */,/*6042*/2045/* 179A */,/*6043*/2045/* 179B */,/*6044*/2045/* 179C */, /*6045*/2045/* 179D */,/*6046*/2045/* 179E */,/*6047*/2045/* 179F */,/*6048*/2045/* 17A0 */,/*6049*/2045/* 17A1 */, /*6050*/2045/* 17A2 */,/*6051*/2046/* 17A3 */,/*6052*/2046/* 17A4 */,/*6053*/2045/* 17A5 */,/*6054*/2045/* 17A6 */, /*6055*/2045/* 17A7 */,/*6056*/2045/* 17A8 */,/*6057*/2045/* 17A9 */,/*6058*/2045/* 17AA */,/*6059*/2045/* 17AB */, /*6060*/2045/* 17AC */,/*6061*/2045/* 17AD */,/*6062*/2045/* 17AE */,/*6063*/2045/* 17AF */,/*6064*/2045/* 17B0 */, /*6065*/2045/* 17B1 */,/*6066*/2045/* 17B2 */,/*6067*/2045/* 17B3 */,/*6068*/2047/* 17B4 */,/*6069*/2047/* 17B5 */, /*6070*/2048/* 17B6 */,/*6071*/2049/* 17B7 */,/*6072*/2049/* 17B8 */,/*6073*/2049/* 17B9 */,/*6074*/2049/* 17BA */, /*6075*/2049/* 17BB */,/*6076*/2049/* 17BC */,/*6077*/2049/* 17BD */,/*6078*/2048/* 17BE */,/*6079*/2048/* 17BF */, /*6080*/2048/* 17C0 */,/*6081*/2048/* 17C1 */,/*6082*/2048/* 17C2 */,/*6083*/2048/* 17C3 */,/*6084*/2048/* 17C4 */, /*6085*/2048/* 17C5 */,/*6086*/2049/* 17C6 */,/*6087*/2048/* 17C7 */,/*6088*/2048/* 17C8 */,/*6089*/2050/* 17C9 */, /*6090*/2050/* 17CA */,/*6091*/2050/* 17CB */,/*6092*/2050/* 17CC */,/*6093*/2050/* 17CD */,/*6094*/2050/* 17CE */, /*6095*/2050/* 17CF */,/*6096*/2050/* 17D0 */,/*6097*/2050/* 17D1 */,/*6098*/2051/* 17D2 */,/*6099*/2050/* 17D3 */, /*6100*/2052/* 17D4 */,/*6101*/2052/* 17D5 */,/*6102*/2052/* 17D6 */,/*6103*/2053/* 17D7 */,/*6104*/2054/* 17D8 */, /*6105*/2054/* 17D9 */,/*6106*/2052/* 17DA */,/*6107*/2055/* 17DB */,/*6108*/2045/* 17DC */,/*6109*/2056/* 17DD */,0,0, /*6112*/2057/* 17E0 */,/*6113*/2058/* 17E1 */,/*6114*/2059/* 17E2 */,/*6115*/2060/* 17E3 */,/*6116*/2061/* 17E4 */, /*6117*/2062/* 17E5 */,/*6118*/2063/* 17E6 */,/*6119*/2064/* 17E7 */,/*6120*/2065/* 17E8 */,/*6121*/2066/* 17E9 */,0,0,0, 0,0,0,/*6128*/2067/* 17F0 */,/*6129*/2068/* 17F1 */,/*6130*/2069/* 17F2 */,/*6131*/2070/* 17F3 */,/*6132*/2071/* 17F4 */, /*6133*/2072/* 17F5 */,/*6134*/2073/* 17F6 */,/*6135*/2074/* 17F7 */,/*6136*/2075/* 17F8 */,/*6137*/2076/* 17F9 */,0,0,0, 0,0,0,/*6144*/2077/* 1800 */,/*6145*/2077/* 1801 */,/*6146*/2078/* 1802 */,/*6147*/2079/* 1803 */,/*6148*/2080/* 1804 */, /*6149*/2081/* 1805 */,/*6150*/2082/* 1806 */,/*6151*/2083/* 1807 */,/*6152*/2084/* 1808 */,/*6153*/2085/* 1809 */, /*6154*/2086/* 180A */,/*6155*/2087/* 180B */,/*6156*/2087/* 180C */,/*6157*/2087/* 180D */,/*6158*/2088/* 180E */,0, /*6160*/2089/* 1810 */,/*6161*/2090/* 1811 */,/*6162*/2091/* 1812 */,/*6163*/2092/* 1813 */,/*6164*/2093/* 1814 */, /*6165*/2094/* 1815 */,/*6166*/2095/* 1816 */,/*6167*/2096/* 1817 */,/*6168*/2097/* 1818 */,/*6169*/2098/* 1819 */,0,0,0, 0,0,0,/*6176*/2099/* 1820 */,/*6177*/2099/* 1821 */,/*6178*/2099/* 1822 */,/*6179*/2099/* 1823 */,/*6180*/2099/* 1824 */, /*6181*/2099/* 1825 */,/*6182*/2099/* 1826 */,/*6183*/2099/* 1827 */,/*6184*/2099/* 1828 */,/*6185*/2099/* 1829 */, /*6186*/2099/* 182A */,/*6187*/2099/* 182B */,/*6188*/2099/* 182C */,/*6189*/2099/* 182D */,/*6190*/2099/* 182E */, /*6191*/2099/* 182F */,/*6192*/2099/* 1830 */,/*6193*/2099/* 1831 */,/*6194*/2099/* 1832 */,/*6195*/2099/* 1833 */, /*6196*/2099/* 1834 */,/*6197*/2099/* 1835 */,/*6198*/2099/* 1836 */,/*6199*/2099/* 1837 */,/*6200*/2099/* 1838 */, /*6201*/2099/* 1839 */,/*6202*/2099/* 183A */,/*6203*/2099/* 183B */,/*6204*/2099/* 183C */,/*6205*/2099/* 183D */, /*6206*/2099/* 183E */,/*6207*/2099/* 183F */,/*6208*/2099/* 1840 */,/*6209*/2099/* 1841 */,/*6210*/2099/* 1842 */, /*6211*/2100/* 1843 */,/*6212*/2099/* 1844 */,/*6213*/2099/* 1845 */,/*6214*/2099/* 1846 */,/*6215*/2099/* 1847 */, /*6216*/2099/* 1848 */,/*6217*/2099/* 1849 */,/*6218*/2099/* 184A */,/*6219*/2099/* 184B */,/*6220*/2099/* 184C */, /*6221*/2099/* 184D */,/*6222*/2099/* 184E */,/*6223*/2099/* 184F */,/*6224*/2099/* 1850 */,/*6225*/2099/* 1851 */, /*6226*/2099/* 1852 */,/*6227*/2099/* 1853 */,/*6228*/2099/* 1854 */,/*6229*/2099/* 1855 */,/*6230*/2099/* 1856 */, /*6231*/2099/* 1857 */,/*6232*/2099/* 1858 */,/*6233*/2099/* 1859 */,/*6234*/2099/* 185A */,/*6235*/2099/* 185B */, /*6236*/2099/* 185C */,/*6237*/2099/* 185D */,/*6238*/2099/* 185E */,/*6239*/2099/* 185F */,/*6240*/2099/* 1860 */, /*6241*/2099/* 1861 */,/*6242*/2099/* 1862 */,/*6243*/2099/* 1863 */,/*6244*/2099/* 1864 */,/*6245*/2099/* 1865 */, /*6246*/2099/* 1866 */,/*6247*/2099/* 1867 */,/*6248*/2099/* 1868 */,/*6249*/2099/* 1869 */,/*6250*/2099/* 186A */, /*6251*/2099/* 186B */,/*6252*/2099/* 186C */,/*6253*/2099/* 186D */,/*6254*/2099/* 186E */,/*6255*/2099/* 186F */, /*6256*/2099/* 1870 */,/*6257*/2099/* 1871 */,/*6258*/2099/* 1872 */,/*6259*/2099/* 1873 */,/*6260*/2099/* 1874 */, /*6261*/2099/* 1875 */,/*6262*/2099/* 1876 */,/*6263*/2099/* 1877 */,0,0,0,0,0,0,0,0,/*6272*/2101/* 1880 */, /*6273*/2101/* 1881 */,/*6274*/2101/* 1882 */,/*6275*/2101/* 1883 */,/*6276*/2101/* 1884 */,/*6277*/2101/* 1885 */, /*6278*/2101/* 1886 */,/*6279*/2099/* 1887 */,/*6280*/2099/* 1888 */,/*6281*/2099/* 1889 */,/*6282*/2099/* 188A */, /*6283*/2099/* 188B */,/*6284*/2099/* 188C */,/*6285*/2099/* 188D */,/*6286*/2099/* 188E */,/*6287*/2099/* 188F */, /*6288*/2099/* 1890 */,/*6289*/2099/* 1891 */,/*6290*/2099/* 1892 */,/*6291*/2099/* 1893 */,/*6292*/2099/* 1894 */, /*6293*/2099/* 1895 */,/*6294*/2099/* 1896 */,/*6295*/2099/* 1897 */,/*6296*/2099/* 1898 */,/*6297*/2099/* 1899 */, /*6298*/2099/* 189A */,/*6299*/2099/* 189B */,/*6300*/2099/* 189C */,/*6301*/2099/* 189D */,/*6302*/2099/* 189E */, /*6303*/2099/* 189F */,/*6304*/2099/* 18A0 */,/*6305*/2099/* 18A1 */,/*6306*/2099/* 18A2 */,/*6307*/2099/* 18A3 */, /*6308*/2099/* 18A4 */,/*6309*/2099/* 18A5 */,/*6310*/2099/* 18A6 */,/*6311*/2099/* 18A7 */,/*6312*/2099/* 18A8 */, /*6313*/2102/* 18A9 */,/*6314*/2103/* 18AA */,0,0,0,0,0,/*6320*/2104/* 18B0 */,/*6321*/2104/* 18B1 */, /*6322*/2104/* 18B2 */,/*6323*/2104/* 18B3 */,/*6324*/2104/* 18B4 */,/*6325*/2104/* 18B5 */,/*6326*/2104/* 18B6 */, /*6327*/2104/* 18B7 */,/*6328*/2104/* 18B8 */,/*6329*/2104/* 18B9 */,/*6330*/2104/* 18BA */,/*6331*/2104/* 18BB */, /*6332*/2104/* 18BC */,/*6333*/2104/* 18BD */,/*6334*/2104/* 18BE */,/*6335*/2104/* 18BF */,/*6336*/2104/* 18C0 */, /*6337*/2104/* 18C1 */,/*6338*/2104/* 18C2 */,/*6339*/2104/* 18C3 */,/*6340*/2104/* 18C4 */,/*6341*/2104/* 18C5 */, /*6342*/2104/* 18C6 */,/*6343*/2104/* 18C7 */,/*6344*/2104/* 18C8 */,/*6345*/2104/* 18C9 */,/*6346*/2104/* 18CA */, /*6347*/2104/* 18CB */,/*6348*/2104/* 18CC */,/*6349*/2104/* 18CD */,/*6350*/2104/* 18CE */,/*6351*/2104/* 18CF */, /*6352*/2104/* 18D0 */,/*6353*/2104/* 18D1 */,/*6354*/2104/* 18D2 */,/*6355*/2104/* 18D3 */,/*6356*/2104/* 18D4 */, /*6357*/2104/* 18D5 */,/*6358*/2104/* 18D6 */,/*6359*/2104/* 18D7 */,/*6360*/2104/* 18D8 */,/*6361*/2104/* 18D9 */, /*6362*/2104/* 18DA */,/*6363*/2104/* 18DB */,/*6364*/2104/* 18DC */,/*6365*/2104/* 18DD */,/*6366*/2104/* 18DE */, /*6367*/2104/* 18DF */,/*6368*/2104/* 18E0 */,/*6369*/2104/* 18E1 */,/*6370*/2104/* 18E2 */,/*6371*/2104/* 18E3 */, /*6372*/2104/* 18E4 */,/*6373*/2104/* 18E5 */,/*6374*/2104/* 18E6 */,/*6375*/2104/* 18E7 */,/*6376*/2104/* 18E8 */, /*6377*/2104/* 18E9 */,/*6378*/2104/* 18EA */,/*6379*/2104/* 18EB */,/*6380*/2104/* 18EC */,/*6381*/2104/* 18ED */, /*6382*/2104/* 18EE */,/*6383*/2104/* 18EF */,/*6384*/2104/* 18F0 */,/*6385*/2104/* 18F1 */,/*6386*/2104/* 18F2 */, /*6387*/2104/* 18F3 */,/*6388*/2104/* 18F4 */,/*6389*/2104/* 18F5 */,0,0,0,0,0,0,0,0,0,0,/*6400*/2105/* 1900 */, /*6401*/2105/* 1901 */,/*6402*/2105/* 1902 */,/*6403*/2105/* 1903 */,/*6404*/2105/* 1904 */,/*6405*/2105/* 1905 */, /*6406*/2105/* 1906 */,/*6407*/2105/* 1907 */,/*6408*/2105/* 1908 */,/*6409*/2105/* 1909 */,/*6410*/2105/* 190A */, /*6411*/2105/* 190B */,/*6412*/2105/* 190C */,/*6413*/2105/* 190D */,/*6414*/2105/* 190E */,/*6415*/2105/* 190F */, /*6416*/2105/* 1910 */,/*6417*/2105/* 1911 */,/*6418*/2105/* 1912 */,/*6419*/2105/* 1913 */,/*6420*/2105/* 1914 */, /*6421*/2105/* 1915 */,/*6422*/2105/* 1916 */,/*6423*/2105/* 1917 */,/*6424*/2105/* 1918 */,/*6425*/2105/* 1919 */, /*6426*/2105/* 191A */,/*6427*/2105/* 191B */,/*6428*/2105/* 191C */,/*6429*/2106/* 191D */,/*6430*/2106/* 191E */,0, /*6432*/2107/* 1920 */,/*6433*/2107/* 1921 */,/*6434*/2107/* 1922 */,/*6435*/2108/* 1923 */,/*6436*/2108/* 1924 */, /*6437*/2108/* 1925 */,/*6438*/2108/* 1926 */,/*6439*/2107/* 1927 */,/*6440*/2107/* 1928 */,/*6441*/2108/* 1929 */, /*6442*/2108/* 192A */,/*6443*/2108/* 192B */,0,0,0,0,/*6448*/2108/* 1930 */,/*6449*/2108/* 1931 */, /*6450*/2107/* 1932 */,/*6451*/2108/* 1933 */,/*6452*/2108/* 1934 */,/*6453*/2108/* 1935 */,/*6454*/2108/* 1936 */, /*6455*/2108/* 1937 */,/*6456*/2108/* 1938 */,/*6457*/2109/* 1939 */,/*6458*/2110/* 193A */,/*6459*/2111/* 193B */,0,0,0, 0,/*6464*/2112/* 1940 */,0,0,0,/*6468*/2113/* 1944 */,/*6469*/2113/* 1945 */,/*6470*/2114/* 1946 */, /*6471*/2115/* 1947 */,/*6472*/2116/* 1948 */,/*6473*/2117/* 1949 */,/*6474*/2118/* 194A */,/*6475*/2119/* 194B */, /*6476*/2120/* 194C */,/*6477*/2121/* 194D */,/*6478*/2122/* 194E */,/*6479*/2123/* 194F */,/*6480*/2124/* 1950 */, /*6481*/2124/* 1951 */,/*6482*/2124/* 1952 */,/*6483*/2124/* 1953 */,/*6484*/2124/* 1954 */,/*6485*/2124/* 1955 */, /*6486*/2124/* 1956 */,/*6487*/2124/* 1957 */,/*6488*/2124/* 1958 */,/*6489*/2124/* 1959 */,/*6490*/2124/* 195A */, /*6491*/2124/* 195B */,/*6492*/2124/* 195C */,/*6493*/2124/* 195D */,/*6494*/2124/* 195E */,/*6495*/2124/* 195F */, /*6496*/2124/* 1960 */,/*6497*/2124/* 1961 */,/*6498*/2124/* 1962 */,/*6499*/2124/* 1963 */,/*6500*/2124/* 1964 */, /*6501*/2124/* 1965 */,/*6502*/2124/* 1966 */,/*6503*/2124/* 1967 */,/*6504*/2124/* 1968 */,/*6505*/2124/* 1969 */, /*6506*/2124/* 196A */,/*6507*/2124/* 196B */,/*6508*/2124/* 196C */,/*6509*/2124/* 196D */,0,0,/*6512*/2124/* 1970 */, /*6513*/2124/* 1971 */,/*6514*/2124/* 1972 */,/*6515*/2124/* 1973 */,/*6516*/2124/* 1974 */,0,0,0,0,0,0,0,0,0,0,0, /*6528*/2125/* 1980 */,/*6529*/2125/* 1981 */,/*6530*/2125/* 1982 */,/*6531*/2125/* 1983 */,/*6532*/2125/* 1984 */, /*6533*/2125/* 1985 */,/*6534*/2125/* 1986 */,/*6535*/2125/* 1987 */,/*6536*/2125/* 1988 */,/*6537*/2125/* 1989 */, /*6538*/2125/* 198A */,/*6539*/2125/* 198B */,/*6540*/2125/* 198C */,/*6541*/2125/* 198D */,/*6542*/2125/* 198E */, /*6543*/2125/* 198F */,/*6544*/2125/* 1990 */,/*6545*/2125/* 1991 */,/*6546*/2125/* 1992 */,/*6547*/2125/* 1993 */, /*6548*/2125/* 1994 */,/*6549*/2125/* 1995 */,/*6550*/2125/* 1996 */,/*6551*/2125/* 1997 */,/*6552*/2125/* 1998 */, /*6553*/2125/* 1999 */,/*6554*/2125/* 199A */,/*6555*/2125/* 199B */,/*6556*/2125/* 199C */,/*6557*/2125/* 199D */, /*6558*/2125/* 199E */,/*6559*/2125/* 199F */,/*6560*/2125/* 19A0 */,/*6561*/2125/* 19A1 */,/*6562*/2125/* 19A2 */, /*6563*/2125/* 19A3 */,/*6564*/2125/* 19A4 */,/*6565*/2125/* 19A5 */,/*6566*/2125/* 19A6 */,/*6567*/2125/* 19A7 */, /*6568*/2125/* 19A8 */,/*6569*/2125/* 19A9 */,/*6570*/2126/* 19AA */,/*6571*/2126/* 19AB */,0,0,0,0, /*6576*/2125/* 19B0 */,/*6577*/2125/* 19B1 */,/*6578*/2125/* 19B2 */,/*6579*/2125/* 19B3 */,/*6580*/2125/* 19B4 */, /*6581*/2127/* 19B5 */,/*6582*/2127/* 19B6 */,/*6583*/2127/* 19B7 */,/*6584*/2125/* 19B8 */,/*6585*/2125/* 19B9 */, /*6586*/2127/* 19BA */,/*6587*/2125/* 19BB */,/*6588*/2125/* 19BC */,/*6589*/2125/* 19BD */,/*6590*/2125/* 19BE */, /*6591*/2125/* 19BF */,/*6592*/2125/* 19C0 */,/*6593*/2125/* 19C1 */,/*6594*/2125/* 19C2 */,/*6595*/2125/* 19C3 */, /*6596*/2125/* 19C4 */,/*6597*/2125/* 19C5 */,/*6598*/2125/* 19C6 */,/*6599*/2125/* 19C7 */,/*6600*/2125/* 19C8 */, /*6601*/2125/* 19C9 */,0,0,0,0,0,0,/*6608*/2128/* 19D0 */,/*6609*/2129/* 19D1 */,/*6610*/2130/* 19D2 */, /*6611*/2131/* 19D3 */,/*6612*/2132/* 19D4 */,/*6613*/2133/* 19D5 */,/*6614*/2134/* 19D6 */,/*6615*/2135/* 19D7 */, /*6616*/2136/* 19D8 */,/*6617*/2137/* 19D9 */,/*6618*/2138/* 19DA */,0,0,0,/*6622*/2139/* 19DE */,/*6623*/2139/* 19DF */, /*6624*/2140/* 19E0 */,/*6625*/2140/* 19E1 */,/*6626*/2140/* 19E2 */,/*6627*/2140/* 19E3 */,/*6628*/2140/* 19E4 */, /*6629*/2140/* 19E5 */,/*6630*/2140/* 19E6 */,/*6631*/2140/* 19E7 */,/*6632*/2140/* 19E8 */,/*6633*/2140/* 19E9 */, /*6634*/2140/* 19EA */,/*6635*/2140/* 19EB */,/*6636*/2140/* 19EC */,/*6637*/2140/* 19ED */,/*6638*/2140/* 19EE */, /*6639*/2140/* 19EF */,/*6640*/2140/* 19F0 */,/*6641*/2140/* 19F1 */,/*6642*/2140/* 19F2 */,/*6643*/2140/* 19F3 */, /*6644*/2140/* 19F4 */,/*6645*/2140/* 19F5 */,/*6646*/2140/* 19F6 */,/*6647*/2140/* 19F7 */,/*6648*/2140/* 19F8 */, /*6649*/2140/* 19F9 */,/*6650*/2140/* 19FA */,/*6651*/2140/* 19FB */,/*6652*/2140/* 19FC */,/*6653*/2140/* 19FD */, /*6654*/2140/* 19FE */,/*6655*/2140/* 19FF */,/*6656*/2141/* 1A00 */,/*6657*/2141/* 1A01 */,/*6658*/2141/* 1A02 */, /*6659*/2141/* 1A03 */,/*6660*/2141/* 1A04 */,/*6661*/2141/* 1A05 */,/*6662*/2141/* 1A06 */,/*6663*/2141/* 1A07 */, /*6664*/2141/* 1A08 */,/*6665*/2141/* 1A09 */,/*6666*/2141/* 1A0A */,/*6667*/2141/* 1A0B */,/*6668*/2141/* 1A0C */, /*6669*/2141/* 1A0D */,/*6670*/2141/* 1A0E */,/*6671*/2141/* 1A0F */,/*6672*/2141/* 1A10 */,/*6673*/2141/* 1A11 */, /*6674*/2141/* 1A12 */,/*6675*/2141/* 1A13 */,/*6676*/2141/* 1A14 */,/*6677*/2141/* 1A15 */,/*6678*/2141/* 1A16 */, /*6679*/2142/* 1A17 */,/*6680*/2143/* 1A18 */,/*6681*/2144/* 1A19 */,/*6682*/2144/* 1A1A */,/*6683*/2145/* 1A1B */,0,0, /*6686*/2146/* 1A1E */,/*6687*/2146/* 1A1F */,/*6688*/2147/* 1A20 */,/*6689*/2147/* 1A21 */,/*6690*/2147/* 1A22 */, /*6691*/2147/* 1A23 */,/*6692*/2147/* 1A24 */,/*6693*/2147/* 1A25 */,/*6694*/2147/* 1A26 */,/*6695*/2147/* 1A27 */, /*6696*/2147/* 1A28 */,/*6697*/2147/* 1A29 */,/*6698*/2147/* 1A2A */,/*6699*/2147/* 1A2B */,/*6700*/2147/* 1A2C */, /*6701*/2147/* 1A2D */,/*6702*/2147/* 1A2E */,/*6703*/2147/* 1A2F */,/*6704*/2147/* 1A30 */,/*6705*/2147/* 1A31 */, /*6706*/2147/* 1A32 */,/*6707*/2147/* 1A33 */,/*6708*/2147/* 1A34 */,/*6709*/2147/* 1A35 */,/*6710*/2147/* 1A36 */, /*6711*/2147/* 1A37 */,/*6712*/2147/* 1A38 */,/*6713*/2147/* 1A39 */,/*6714*/2147/* 1A3A */,/*6715*/2147/* 1A3B */, /*6716*/2147/* 1A3C */,/*6717*/2147/* 1A3D */,/*6718*/2147/* 1A3E */,/*6719*/2147/* 1A3F */,/*6720*/2147/* 1A40 */, /*6721*/2147/* 1A41 */,/*6722*/2147/* 1A42 */,/*6723*/2147/* 1A43 */,/*6724*/2147/* 1A44 */,/*6725*/2147/* 1A45 */, /*6726*/2147/* 1A46 */,/*6727*/2147/* 1A47 */,/*6728*/2147/* 1A48 */,/*6729*/2147/* 1A49 */,/*6730*/2147/* 1A4A */, /*6731*/2147/* 1A4B */,/*6732*/2147/* 1A4C */,/*6733*/2147/* 1A4D */,/*6734*/2147/* 1A4E */,/*6735*/2147/* 1A4F */, /*6736*/2147/* 1A50 */,/*6737*/2147/* 1A51 */,/*6738*/2147/* 1A52 */,/*6739*/2147/* 1A53 */,/*6740*/2147/* 1A54 */, /*6741*/2148/* 1A55 */,/*6742*/2149/* 1A56 */,/*6743*/2148/* 1A57 */,/*6744*/2149/* 1A58 */,/*6745*/2149/* 1A59 */, /*6746*/2149/* 1A5A */,/*6747*/2149/* 1A5B */,/*6748*/2149/* 1A5C */,/*6749*/2149/* 1A5D */,/*6750*/2149/* 1A5E */,0, /*6752*/2150/* 1A60 */,/*6753*/2151/* 1A61 */,/*6754*/2149/* 1A62 */,/*6755*/2151/* 1A63 */,/*6756*/2151/* 1A64 */, /*6757*/2149/* 1A65 */,/*6758*/2149/* 1A66 */,/*6759*/2149/* 1A67 */,/*6760*/2149/* 1A68 */,/*6761*/2149/* 1A69 */, /*6762*/2149/* 1A6A */,/*6763*/2149/* 1A6B */,/*6764*/2149/* 1A6C */,/*6765*/2148/* 1A6D */,/*6766*/2148/* 1A6E */, /*6767*/2148/* 1A6F */,/*6768*/2148/* 1A70 */,/*6769*/2148/* 1A71 */,/*6770*/2148/* 1A72 */,/*6771*/2149/* 1A73 */, /*6772*/2149/* 1A74 */,/*6773*/2152/* 1A75 */,/*6774*/2152/* 1A76 */,/*6775*/2152/* 1A77 */,/*6776*/2152/* 1A78 */, /*6777*/2152/* 1A79 */,/*6778*/2152/* 1A7A */,/*6779*/2152/* 1A7B */,/*6780*/2152/* 1A7C */,0,0,/*6783*/2153/* 1A7F */, /*6784*/2154/* 1A80 */,/*6785*/2155/* 1A81 */,/*6786*/2156/* 1A82 */,/*6787*/2157/* 1A83 */,/*6788*/2158/* 1A84 */, /*6789*/2159/* 1A85 */,/*6790*/2160/* 1A86 */,/*6791*/2161/* 1A87 */,/*6792*/2162/* 1A88 */,/*6793*/2163/* 1A89 */,0,0,0, 0,0,0,/*6800*/2154/* 1A90 */,/*6801*/2155/* 1A91 */,/*6802*/2156/* 1A92 */,/*6803*/2157/* 1A93 */,/*6804*/2158/* 1A94 */, /*6805*/2159/* 1A95 */,/*6806*/2160/* 1A96 */,/*6807*/2161/* 1A97 */,/*6808*/2162/* 1A98 */,/*6809*/2163/* 1A99 */,0,0,0, 0,0,0,/*6816*/2164/* 1AA0 */,/*6817*/2164/* 1AA1 */,/*6818*/2164/* 1AA2 */,/*6819*/2164/* 1AA3 */,/*6820*/2164/* 1AA4 */, /*6821*/2164/* 1AA5 */,/*6822*/2164/* 1AA6 */,/*6823*/2165/* 1AA7 */,/*6824*/2166/* 1AA8 */,/*6825*/2166/* 1AA9 */, /*6826*/2166/* 1AAA */,/*6827*/2166/* 1AAB */,/*6828*/2164/* 1AAC */,/*6829*/2164/* 1AAD */,0,0,/*6832*/2167/* 1AB0 */, /*6833*/2167/* 1AB1 */,/*6834*/2167/* 1AB2 */,/*6835*/2167/* 1AB3 */,/*6836*/2167/* 1AB4 */,/*6837*/2168/* 1AB5 */, /*6838*/2168/* 1AB6 */,/*6839*/2168/* 1AB7 */,/*6840*/2168/* 1AB8 */,/*6841*/2168/* 1AB9 */,/*6842*/2168/* 1ABA */, /*6843*/2167/* 1ABB */,/*6844*/2167/* 1ABC */,/*6845*/2168/* 1ABD */,/*6846*/2169/* 1ABE */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*6912*/2170/* 1B00 */,/*6913*/2170/* 1B01 */,/*6914*/2170/* 1B02 */,/*6915*/2170/* 1B03 */,/*6916*/2171/* 1B04 */, /*6917*/2172/* 1B05 */,/*6918*/2173/* 1B06 */,/*6919*/2172/* 1B07 */,/*6920*/2174/* 1B08 */,/*6921*/2172/* 1B09 */, /*6922*/2175/* 1B0A */,/*6923*/2172/* 1B0B */,/*6924*/2176/* 1B0C */,/*6925*/2172/* 1B0D */,/*6926*/2177/* 1B0E */, /*6927*/2172/* 1B0F */,/*6928*/2172/* 1B10 */,/*6929*/2172/* 1B11 */,/*6930*/2178/* 1B12 */,/*6931*/2172/* 1B13 */, /*6932*/2172/* 1B14 */,/*6933*/2172/* 1B15 */,/*6934*/2172/* 1B16 */,/*6935*/2172/* 1B17 */,/*6936*/2172/* 1B18 */, /*6937*/2172/* 1B19 */,/*6938*/2172/* 1B1A */,/*6939*/2172/* 1B1B */,/*6940*/2172/* 1B1C */,/*6941*/2172/* 1B1D */, /*6942*/2172/* 1B1E */,/*6943*/2172/* 1B1F */,/*6944*/2172/* 1B20 */,/*6945*/2172/* 1B21 */,/*6946*/2172/* 1B22 */, /*6947*/2172/* 1B23 */,/*6948*/2172/* 1B24 */,/*6949*/2172/* 1B25 */,/*6950*/2172/* 1B26 */,/*6951*/2172/* 1B27 */, /*6952*/2172/* 1B28 */,/*6953*/2172/* 1B29 */,/*6954*/2172/* 1B2A */,/*6955*/2172/* 1B2B */,/*6956*/2172/* 1B2C */, /*6957*/2172/* 1B2D */,/*6958*/2172/* 1B2E */,/*6959*/2172/* 1B2F */,/*6960*/2172/* 1B30 */,/*6961*/2172/* 1B31 */, /*6962*/2172/* 1B32 */,/*6963*/2172/* 1B33 */,/*6964*/2179/* 1B34 */,/*6965*/2180/* 1B35 */,/*6966*/2170/* 1B36 */, /*6967*/2170/* 1B37 */,/*6968*/2170/* 1B38 */,/*6969*/2170/* 1B39 */,/*6970*/2170/* 1B3A */,/*6971*/2181/* 1B3B */, /*6972*/2170/* 1B3C */,/*6973*/2182/* 1B3D */,/*6974*/2171/* 1B3E */,/*6975*/2171/* 1B3F */,/*6976*/2183/* 1B40 */, /*6977*/2184/* 1B41 */,/*6978*/2170/* 1B42 */,/*6979*/2185/* 1B43 */,/*6980*/2186/* 1B44 */,/*6981*/2172/* 1B45 */, /*6982*/2172/* 1B46 */,/*6983*/2172/* 1B47 */,/*6984*/2172/* 1B48 */,/*6985*/2172/* 1B49 */,/*6986*/2172/* 1B4A */, /*6987*/2172/* 1B4B */,0,0,0,0,/*6992*/2187/* 1B50 */,/*6993*/2188/* 1B51 */,/*6994*/2189/* 1B52 */, /*6995*/2190/* 1B53 */,/*6996*/2191/* 1B54 */,/*6997*/2192/* 1B55 */,/*6998*/2193/* 1B56 */,/*6999*/2194/* 1B57 */, /*7000*/2195/* 1B58 */,/*7001*/2196/* 1B59 */,/*7002*/2197/* 1B5A */,/*7003*/2197/* 1B5B */,/*7004*/2198/* 1B5C */, /*7005*/2199/* 1B5D */,/*7006*/2197/* 1B5E */,/*7007*/2197/* 1B5F */,/*7008*/2198/* 1B60 */,/*7009*/2200/* 1B61 */, /*7010*/2200/* 1B62 */,/*7011*/2200/* 1B63 */,/*7012*/2200/* 1B64 */,/*7013*/2200/* 1B65 */,/*7014*/2200/* 1B66 */, /*7015*/2200/* 1B67 */,/*7016*/2200/* 1B68 */,/*7017*/2200/* 1B69 */,/*7018*/2200/* 1B6A */,/*7019*/2201/* 1B6B */, /*7020*/2202/* 1B6C */,/*7021*/2201/* 1B6D */,/*7022*/2201/* 1B6E */,/*7023*/2201/* 1B6F */,/*7024*/2201/* 1B70 */, /*7025*/2201/* 1B71 */,/*7026*/2201/* 1B72 */,/*7027*/2201/* 1B73 */,/*7028*/2200/* 1B74 */,/*7029*/2200/* 1B75 */, /*7030*/2200/* 1B76 */,/*7031*/2200/* 1B77 */,/*7032*/2200/* 1B78 */,/*7033*/2200/* 1B79 */,/*7034*/2200/* 1B7A */, /*7035*/2200/* 1B7B */,/*7036*/2200/* 1B7C */,0,0,0,/*7040*/2203/* 1B80 */,/*7041*/2203/* 1B81 */,/*7042*/2204/* 1B82 */, /*7043*/2205/* 1B83 */,/*7044*/2205/* 1B84 */,/*7045*/2205/* 1B85 */,/*7046*/2205/* 1B86 */,/*7047*/2205/* 1B87 */, /*7048*/2205/* 1B88 */,/*7049*/2205/* 1B89 */,/*7050*/2205/* 1B8A */,/*7051*/2205/* 1B8B */,/*7052*/2205/* 1B8C */, /*7053*/2205/* 1B8D */,/*7054*/2205/* 1B8E */,/*7055*/2205/* 1B8F */,/*7056*/2205/* 1B90 */,/*7057*/2205/* 1B91 */, /*7058*/2205/* 1B92 */,/*7059*/2205/* 1B93 */,/*7060*/2205/* 1B94 */,/*7061*/2205/* 1B95 */,/*7062*/2205/* 1B96 */, /*7063*/2205/* 1B97 */,/*7064*/2205/* 1B98 */,/*7065*/2205/* 1B99 */,/*7066*/2205/* 1B9A */,/*7067*/2205/* 1B9B */, /*7068*/2205/* 1B9C */,/*7069*/2205/* 1B9D */,/*7070*/2205/* 1B9E */,/*7071*/2205/* 1B9F */,/*7072*/2205/* 1BA0 */, /*7073*/2204/* 1BA1 */,/*7074*/2203/* 1BA2 */,/*7075*/2203/* 1BA3 */,/*7076*/2203/* 1BA4 */,/*7077*/2203/* 1BA5 */, /*7078*/2204/* 1BA6 */,/*7079*/2204/* 1BA7 */,/*7080*/2203/* 1BA8 */,/*7081*/2203/* 1BA9 */,/*7082*/2206/* 1BAA */, /*7083*/2207/* 1BAB */,/*7084*/2208/* 1BAC */,/*7085*/2208/* 1BAD */,/*7086*/2205/* 1BAE */,/*7087*/2205/* 1BAF */, /*7088*/2209/* 1BB0 */,/*7089*/2210/* 1BB1 */,/*7090*/2211/* 1BB2 */,/*7091*/2212/* 1BB3 */,/*7092*/2213/* 1BB4 */, /*7093*/2214/* 1BB5 */,/*7094*/2215/* 1BB6 */,/*7095*/2216/* 1BB7 */,/*7096*/2217/* 1BB8 */,/*7097*/2218/* 1BB9 */, /*7098*/2219/* 1BBA */,/*7099*/2219/* 1BBB */,/*7100*/2219/* 1BBC */,/*7101*/2219/* 1BBD */,/*7102*/2219/* 1BBE */, /*7103*/2219/* 1BBF */,/*7104*/2220/* 1BC0 */,/*7105*/2220/* 1BC1 */,/*7106*/2220/* 1BC2 */,/*7107*/2220/* 1BC3 */, /*7108*/2220/* 1BC4 */,/*7109*/2220/* 1BC5 */,/*7110*/2220/* 1BC6 */,/*7111*/2220/* 1BC7 */,/*7112*/2220/* 1BC8 */, /*7113*/2220/* 1BC9 */,/*7114*/2220/* 1BCA */,/*7115*/2220/* 1BCB */,/*7116*/2220/* 1BCC */,/*7117*/2220/* 1BCD */, /*7118*/2220/* 1BCE */,/*7119*/2220/* 1BCF */,/*7120*/2220/* 1BD0 */,/*7121*/2220/* 1BD1 */,/*7122*/2220/* 1BD2 */, /*7123*/2220/* 1BD3 */,/*7124*/2220/* 1BD4 */,/*7125*/2220/* 1BD5 */,/*7126*/2220/* 1BD6 */,/*7127*/2220/* 1BD7 */, /*7128*/2220/* 1BD8 */,/*7129*/2220/* 1BD9 */,/*7130*/2220/* 1BDA */,/*7131*/2220/* 1BDB */,/*7132*/2220/* 1BDC */, /*7133*/2220/* 1BDD */,/*7134*/2220/* 1BDE */,/*7135*/2220/* 1BDF */,/*7136*/2220/* 1BE0 */,/*7137*/2220/* 1BE1 */, /*7138*/2220/* 1BE2 */,/*7139*/2220/* 1BE3 */,/*7140*/2220/* 1BE4 */,/*7141*/2220/* 1BE5 */,/*7142*/2221/* 1BE6 */, /*7143*/2222/* 1BE7 */,/*7144*/2223/* 1BE8 */,/*7145*/2223/* 1BE9 */,/*7146*/2222/* 1BEA */,/*7147*/2222/* 1BEB */, /*7148*/2222/* 1BEC */,/*7149*/2223/* 1BED */,/*7150*/2222/* 1BEE */,/*7151*/2223/* 1BEF */,/*7152*/2223/* 1BF0 */, /*7153*/2223/* 1BF1 */,/*7154*/2224/* 1BF2 */,/*7155*/2224/* 1BF3 */,0,0,0,0,0,0,0,0,/*7164*/2225/* 1BFC */, /*7165*/2225/* 1BFD */,/*7166*/2225/* 1BFE */,/*7167*/2225/* 1BFF */,/*7168*/2226/* 1C00 */,/*7169*/2226/* 1C01 */, /*7170*/2226/* 1C02 */,/*7171*/2226/* 1C03 */,/*7172*/2226/* 1C04 */,/*7173*/2226/* 1C05 */,/*7174*/2226/* 1C06 */, /*7175*/2226/* 1C07 */,/*7176*/2226/* 1C08 */,/*7177*/2226/* 1C09 */,/*7178*/2226/* 1C0A */,/*7179*/2226/* 1C0B */, /*7180*/2226/* 1C0C */,/*7181*/2226/* 1C0D */,/*7182*/2226/* 1C0E */,/*7183*/2226/* 1C0F */,/*7184*/2226/* 1C10 */, /*7185*/2226/* 1C11 */,/*7186*/2226/* 1C12 */,/*7187*/2226/* 1C13 */,/*7188*/2226/* 1C14 */,/*7189*/2226/* 1C15 */, /*7190*/2226/* 1C16 */,/*7191*/2226/* 1C17 */,/*7192*/2226/* 1C18 */,/*7193*/2226/* 1C19 */,/*7194*/2226/* 1C1A */, /*7195*/2226/* 1C1B */,/*7196*/2226/* 1C1C */,/*7197*/2226/* 1C1D */,/*7198*/2226/* 1C1E */,/*7199*/2226/* 1C1F */, /*7200*/2226/* 1C20 */,/*7201*/2226/* 1C21 */,/*7202*/2226/* 1C22 */,/*7203*/2226/* 1C23 */,/*7204*/2227/* 1C24 */, /*7205*/2227/* 1C25 */,/*7206*/2227/* 1C26 */,/*7207*/2227/* 1C27 */,/*7208*/2227/* 1C28 */,/*7209*/2227/* 1C29 */, /*7210*/2227/* 1C2A */,/*7211*/2227/* 1C2B */,/*7212*/2228/* 1C2C */,/*7213*/2228/* 1C2D */,/*7214*/2228/* 1C2E */, /*7215*/2228/* 1C2F */,/*7216*/2228/* 1C30 */,/*7217*/2228/* 1C31 */,/*7218*/2228/* 1C32 */,/*7219*/2228/* 1C33 */, /*7220*/2227/* 1C34 */,/*7221*/2227/* 1C35 */,/*7222*/2229/* 1C36 */,/*7223*/2230/* 1C37 */,0,0,0,/*7227*/2231/* 1C3B */, /*7228*/2231/* 1C3C */,/*7229*/2232/* 1C3D */,/*7230*/2232/* 1C3E */,/*7231*/2232/* 1C3F */,/*7232*/2233/* 1C40 */, /*7233*/2234/* 1C41 */,/*7234*/2235/* 1C42 */,/*7235*/2236/* 1C43 */,/*7236*/2237/* 1C44 */,/*7237*/2238/* 1C45 */, /*7238*/2239/* 1C46 */,/*7239*/2240/* 1C47 */,/*7240*/2241/* 1C48 */,/*7241*/2242/* 1C49 */,0,0,0,/*7245*/2226/* 1C4D */, /*7246*/2226/* 1C4E */,/*7247*/2226/* 1C4F */,/*7248*/2243/* 1C50 */,/*7249*/2244/* 1C51 */,/*7250*/2245/* 1C52 */, /*7251*/2246/* 1C53 */,/*7252*/2247/* 1C54 */,/*7253*/2248/* 1C55 */,/*7254*/2249/* 1C56 */,/*7255*/2250/* 1C57 */, /*7256*/2251/* 1C58 */,/*7257*/2252/* 1C59 */,/*7258*/2253/* 1C5A */,/*7259*/2253/* 1C5B */,/*7260*/2253/* 1C5C */, /*7261*/2253/* 1C5D */,/*7262*/2253/* 1C5E */,/*7263*/2253/* 1C5F */,/*7264*/2253/* 1C60 */,/*7265*/2253/* 1C61 */, /*7266*/2253/* 1C62 */,/*7267*/2253/* 1C63 */,/*7268*/2253/* 1C64 */,/*7269*/2253/* 1C65 */,/*7270*/2253/* 1C66 */, /*7271*/2253/* 1C67 */,/*7272*/2253/* 1C68 */,/*7273*/2253/* 1C69 */,/*7274*/2253/* 1C6A */,/*7275*/2253/* 1C6B */, /*7276*/2253/* 1C6C */,/*7277*/2253/* 1C6D */,/*7278*/2253/* 1C6E */,/*7279*/2253/* 1C6F */,/*7280*/2253/* 1C70 */, /*7281*/2253/* 1C71 */,/*7282*/2253/* 1C72 */,/*7283*/2253/* 1C73 */,/*7284*/2253/* 1C74 */,/*7285*/2253/* 1C75 */, /*7286*/2253/* 1C76 */,/*7287*/2253/* 1C77 */,/*7288*/2254/* 1C78 */,/*7289*/2254/* 1C79 */,/*7290*/2254/* 1C7A */, /*7291*/2255/* 1C7B */,/*7292*/2254/* 1C7C */,/*7293*/2254/* 1C7D */,/*7294*/2256/* 1C7E */,/*7295*/2256/* 1C7F */,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*7360*/2257/* 1CC0 */,/*7361*/2257/* 1CC1 */,/*7362*/2257/* 1CC2 */,/*7363*/2257/* 1CC3 */,/*7364*/2257/* 1CC4 */, /*7365*/2257/* 1CC5 */,/*7366*/2257/* 1CC6 */,/*7367*/2257/* 1CC7 */,0,0,0,0,0,0,0,0,/*7376*/2258/* 1CD0 */, /*7377*/2258/* 1CD1 */,/*7378*/2258/* 1CD2 */,/*7379*/2259/* 1CD3 */,/*7380*/2260/* 1CD4 */,/*7381*/2261/* 1CD5 */, /*7382*/2261/* 1CD6 */,/*7383*/2261/* 1CD7 */,/*7384*/2261/* 1CD8 */,/*7385*/2261/* 1CD9 */,/*7386*/2258/* 1CDA */, /*7387*/2258/* 1CDB */,/*7388*/2261/* 1CDC */,/*7389*/2261/* 1CDD */,/*7390*/2261/* 1CDE */,/*7391*/2261/* 1CDF */, /*7392*/2258/* 1CE0 */,/*7393*/2262/* 1CE1 */,/*7394*/2260/* 1CE2 */,/*7395*/2260/* 1CE3 */,/*7396*/2260/* 1CE4 */, /*7397*/2260/* 1CE5 */,/*7398*/2260/* 1CE6 */,/*7399*/2260/* 1CE7 */,/*7400*/2260/* 1CE8 */,/*7401*/2263/* 1CE9 */, /*7402*/2263/* 1CEA */,/*7403*/2263/* 1CEB */,/*7404*/2263/* 1CEC */,/*7405*/2261/* 1CED */,/*7406*/2263/* 1CEE */, /*7407*/2263/* 1CEF */,/*7408*/2263/* 1CF0 */,/*7409*/2263/* 1CF1 */,/*7410*/2264/* 1CF2 */,/*7411*/2265/* 1CF3 */, /*7412*/2266/* 1CF4 */,/*7413*/2267/* 1CF5 */,/*7414*/2267/* 1CF6 */,0,/*7416*/2268/* 1CF8 */,/*7417*/2268/* 1CF9 */,0,0, 0,0,0,0,/*7424*/2269/* 1D00 */,/*7425*/2269/* 1D01 */,/*7426*/2269/* 1D02 */,/*7427*/2269/* 1D03 */, /*7428*/2269/* 1D04 */,/*7429*/2269/* 1D05 */,/*7430*/2269/* 1D06 */,/*7431*/2269/* 1D07 */,/*7432*/2269/* 1D08 */, /*7433*/2269/* 1D09 */,/*7434*/2269/* 1D0A */,/*7435*/2269/* 1D0B */,/*7436*/2269/* 1D0C */,/*7437*/2269/* 1D0D */, /*7438*/2269/* 1D0E */,/*7439*/2269/* 1D0F */,/*7440*/2269/* 1D10 */,/*7441*/2269/* 1D11 */,/*7442*/2269/* 1D12 */, /*7443*/2269/* 1D13 */,/*7444*/2269/* 1D14 */,/*7445*/2269/* 1D15 */,/*7446*/2269/* 1D16 */,/*7447*/2269/* 1D17 */, /*7448*/2269/* 1D18 */,/*7449*/2269/* 1D19 */,/*7450*/2269/* 1D1A */,/*7451*/2269/* 1D1B */,/*7452*/2269/* 1D1C */, /*7453*/2269/* 1D1D */,/*7454*/2269/* 1D1E */,/*7455*/2269/* 1D1F */,/*7456*/2269/* 1D20 */,/*7457*/2269/* 1D21 */, /*7458*/2269/* 1D22 */,/*7459*/2269/* 1D23 */,/*7460*/2269/* 1D24 */,/*7461*/2269/* 1D25 */,/*7462*/2270/* 1D26 */, /*7463*/2270/* 1D27 */,/*7464*/2270/* 1D28 */,/*7465*/2270/* 1D29 */,/*7466*/2270/* 1D2A */,/*7467*/2271/* 1D2B */, /*7468*/2272/* 1D2C */,/*7469*/2273/* 1D2D */,/*7470*/2274/* 1D2E */,/*7471*/2275/* 1D2F */,/*7472*/2276/* 1D30 */, /*7473*/2277/* 1D31 */,/*7474*/2278/* 1D32 */,/*7475*/2279/* 1D33 */,/*7476*/2280/* 1D34 */,/*7477*/2281/* 1D35 */, /*7478*/2282/* 1D36 */,/*7479*/2283/* 1D37 */,/*7480*/2284/* 1D38 */,/*7481*/2285/* 1D39 */,/*7482*/2286/* 1D3A */, /*7483*/2275/* 1D3B */,/*7484*/2287/* 1D3C */,/*7485*/2288/* 1D3D */,/*7486*/2289/* 1D3E */,/*7487*/2290/* 1D3F */, /*7488*/2291/* 1D40 */,/*7489*/2292/* 1D41 */,/*7490*/2293/* 1D42 */,/*7491*/2294/* 1D43 */,/*7492*/2295/* 1D44 */, /*7493*/2296/* 1D45 */,/*7494*/2297/* 1D46 */,/*7495*/2298/* 1D47 */,/*7496*/2299/* 1D48 */,/*7497*/2300/* 1D49 */, /*7498*/2301/* 1D4A */,/*7499*/2302/* 1D4B */,/*7500*/2303/* 1D4C */,/*7501*/2304/* 1D4D */,/*7502*/2275/* 1D4E */, /*7503*/2305/* 1D4F */,/*7504*/2306/* 1D50 */,/*7505*/2307/* 1D51 */,/*7506*/2308/* 1D52 */,/*7507*/2309/* 1D53 */, /*7508*/2310/* 1D54 */,/*7509*/2311/* 1D55 */,/*7510*/2312/* 1D56 */,/*7511*/2313/* 1D57 */,/*7512*/2314/* 1D58 */, /*7513*/2315/* 1D59 */,/*7514*/2316/* 1D5A */,/*7515*/2317/* 1D5B */,/*7516*/2318/* 1D5C */,/*7517*/2319/* 1D5D */, /*7518*/2320/* 1D5E */,/*7519*/2321/* 1D5F */,/*7520*/2322/* 1D60 */,/*7521*/2323/* 1D61 */,/*7522*/2324/* 1D62 */, /*7523*/2325/* 1D63 */,/*7524*/2326/* 1D64 */,/*7525*/2327/* 1D65 */,/*7526*/2328/* 1D66 */,/*7527*/2329/* 1D67 */, /*7528*/2330/* 1D68 */,/*7529*/2331/* 1D69 */,/*7530*/2332/* 1D6A */,/*7531*/2269/* 1D6B */,/*7532*/2333/* 1D6C */, /*7533*/2333/* 1D6D */,/*7534*/2333/* 1D6E */,/*7535*/2333/* 1D6F */,/*7536*/2333/* 1D70 */,/*7537*/2333/* 1D71 */, /*7538*/2333/* 1D72 */,/*7539*/2333/* 1D73 */,/*7540*/2333/* 1D74 */,/*7541*/2333/* 1D75 */,/*7542*/2333/* 1D76 */, /*7543*/2333/* 1D77 */,/*7544*/2334/* 1D78 */,/*7545*/2335/* 1D79 */,/*7546*/2333/* 1D7A */,/*7547*/2333/* 1D7B */, /*7548*/2333/* 1D7C */,/*7549*/2336/* 1D7D */,/*7550*/2333/* 1D7E */,/*7551*/2333/* 1D7F */,/*7552*/2337/* 1D80 */, /*7553*/2337/* 1D81 */,/*7554*/2337/* 1D82 */,/*7555*/2337/* 1D83 */,/*7556*/2337/* 1D84 */,/*7557*/2337/* 1D85 */, /*7558*/2337/* 1D86 */,/*7559*/2337/* 1D87 */,/*7560*/2337/* 1D88 */,/*7561*/2337/* 1D89 */,/*7562*/2337/* 1D8A */, /*7563*/2337/* 1D8B */,/*7564*/2337/* 1D8C */,/*7565*/2337/* 1D8D */,/*7566*/2337/* 1D8E */,/*7567*/2337/* 1D8F */, /*7568*/2337/* 1D90 */,/*7569*/2337/* 1D91 */,/*7570*/2337/* 1D92 */,/*7571*/2337/* 1D93 */,/*7572*/2337/* 1D94 */, /*7573*/2337/* 1D95 */,/*7574*/2338/* 1D96 */,/*7575*/2337/* 1D97 */,/*7576*/2337/* 1D98 */,/*7577*/2337/* 1D99 */, /*7578*/2337/* 1D9A */,/*7579*/2339/* 1D9B */,/*7580*/2340/* 1D9C */,/*7581*/2341/* 1D9D */,/*7582*/2342/* 1D9E */, /*7583*/2343/* 1D9F */,/*7584*/2344/* 1DA0 */,/*7585*/2345/* 1DA1 */,/*7586*/2346/* 1DA2 */,/*7587*/2347/* 1DA3 */, /*7588*/2348/* 1DA4 */,/*7589*/2349/* 1DA5 */,/*7590*/2350/* 1DA6 */,/*7591*/2351/* 1DA7 */,/*7592*/2352/* 1DA8 */, /*7593*/2353/* 1DA9 */,/*7594*/2354/* 1DAA */,/*7595*/2355/* 1DAB */,/*7596*/2356/* 1DAC */,/*7597*/2357/* 1DAD */, /*7598*/2358/* 1DAE */,/*7599*/2359/* 1DAF */,/*7600*/2360/* 1DB0 */,/*7601*/2361/* 1DB1 */,/*7602*/2362/* 1DB2 */, /*7603*/2363/* 1DB3 */,/*7604*/2364/* 1DB4 */,/*7605*/2365/* 1DB5 */,/*7606*/2366/* 1DB6 */,/*7607*/2367/* 1DB7 */, /*7608*/2368/* 1DB8 */,/*7609*/2369/* 1DB9 */,/*7610*/2370/* 1DBA */,/*7611*/2371/* 1DBB */,/*7612*/2372/* 1DBC */, /*7613*/2373/* 1DBD */,/*7614*/2374/* 1DBE */,/*7615*/2375/* 1DBF */,/*7616*/2376/* 1DC0 */,/*7617*/2376/* 1DC1 */, /*7618*/2377/* 1DC2 */,/*7619*/2376/* 1DC3 */,/*7620*/2378/* 1DC4 */,/*7621*/2378/* 1DC5 */,/*7622*/2378/* 1DC6 */, /*7623*/2378/* 1DC7 */,/*7624*/2378/* 1DC8 */,/*7625*/2378/* 1DC9 */,/*7626*/2379/* 1DCA */,/*7627*/2380/* 1DCB */, /*7628*/2380/* 1DCC */,/*7629*/2381/* 1DCD */,/*7630*/2382/* 1DCE */,/*7631*/2383/* 1DCF */,/*7632*/2384/* 1DD0 */, /*7633*/2385/* 1DD1 */,/*7634*/2385/* 1DD2 */,/*7635*/2385/* 1DD3 */,/*7636*/2385/* 1DD4 */,/*7637*/2385/* 1DD5 */, /*7638*/2385/* 1DD6 */,/*7639*/2385/* 1DD7 */,/*7640*/2385/* 1DD8 */,/*7641*/2385/* 1DD9 */,/*7642*/2385/* 1DDA */, /*7643*/2385/* 1DDB */,/*7644*/2385/* 1DDC */,/*7645*/2385/* 1DDD */,/*7646*/2385/* 1DDE */,/*7647*/2385/* 1DDF */, /*7648*/2385/* 1DE0 */,/*7649*/2385/* 1DE1 */,/*7650*/2385/* 1DE2 */,/*7651*/2385/* 1DE3 */,/*7652*/2385/* 1DE4 */, /*7653*/2385/* 1DE5 */,/*7654*/2385/* 1DE6 */,/*7655*/2386/* 1DE7 */,/*7656*/2386/* 1DE8 */,/*7657*/2386/* 1DE9 */, /*7658*/2386/* 1DEA */,/*7659*/2386/* 1DEB */,/*7660*/2386/* 1DEC */,/*7661*/2386/* 1DED */,/*7662*/2386/* 1DEE */, /*7663*/2386/* 1DEF */,/*7664*/2386/* 1DF0 */,/*7665*/2386/* 1DF1 */,/*7666*/2386/* 1DF2 */,/*7667*/2386/* 1DF3 */, /*7668*/2386/* 1DF4 */,/*7669*/2387/* 1DF5 */,0,0,0,0,0,0,/*7676*/2388/* 1DFC */,/*7677*/2389/* 1DFD */, /*7678*/2378/* 1DFE */,/*7679*/2379/* 1DFF */,/*7680*/2390/* 1E00 */,/*7681*/2391/* 1E01 */,/*7682*/2392/* 1E02 */, /*7683*/2393/* 1E03 */,/*7684*/2394/* 1E04 */,/*7685*/2395/* 1E05 */,/*7686*/2396/* 1E06 */,/*7687*/2397/* 1E07 */, /*7688*/2398/* 1E08 */,/*7689*/2399/* 1E09 */,/*7690*/2400/* 1E0A */,/*7691*/2401/* 1E0B */,/*7692*/2402/* 1E0C */, /*7693*/2403/* 1E0D */,/*7694*/2404/* 1E0E */,/*7695*/2405/* 1E0F */,/*7696*/2406/* 1E10 */,/*7697*/2407/* 1E11 */, /*7698*/2408/* 1E12 */,/*7699*/2409/* 1E13 */,/*7700*/2410/* 1E14 */,/*7701*/2411/* 1E15 */,/*7702*/2412/* 1E16 */, /*7703*/2413/* 1E17 */,/*7704*/2414/* 1E18 */,/*7705*/2415/* 1E19 */,/*7706*/2416/* 1E1A */,/*7707*/2417/* 1E1B */, /*7708*/2418/* 1E1C */,/*7709*/2419/* 1E1D */,/*7710*/2420/* 1E1E */,/*7711*/2421/* 1E1F */,/*7712*/2422/* 1E20 */, /*7713*/2423/* 1E21 */,/*7714*/2424/* 1E22 */,/*7715*/2425/* 1E23 */,/*7716*/2426/* 1E24 */,/*7717*/2427/* 1E25 */, /*7718*/2428/* 1E26 */,/*7719*/2429/* 1E27 */,/*7720*/2430/* 1E28 */,/*7721*/2431/* 1E29 */,/*7722*/2432/* 1E2A */, /*7723*/2433/* 1E2B */,/*7724*/2434/* 1E2C */,/*7725*/2435/* 1E2D */,/*7726*/2436/* 1E2E */,/*7727*/2437/* 1E2F */, /*7728*/2438/* 1E30 */,/*7729*/2439/* 1E31 */,/*7730*/2440/* 1E32 */,/*7731*/2441/* 1E33 */,/*7732*/2442/* 1E34 */, /*7733*/2443/* 1E35 */,/*7734*/2444/* 1E36 */,/*7735*/2445/* 1E37 */,/*7736*/2446/* 1E38 */,/*7737*/2447/* 1E39 */, /*7738*/2448/* 1E3A */,/*7739*/2449/* 1E3B */,/*7740*/2450/* 1E3C */,/*7741*/2451/* 1E3D */,/*7742*/2452/* 1E3E */, /*7743*/2453/* 1E3F */,/*7744*/2454/* 1E40 */,/*7745*/2455/* 1E41 */,/*7746*/2456/* 1E42 */,/*7747*/2457/* 1E43 */, /*7748*/2458/* 1E44 */,/*7749*/2459/* 1E45 */,/*7750*/2460/* 1E46 */,/*7751*/2461/* 1E47 */,/*7752*/2462/* 1E48 */, /*7753*/2463/* 1E49 */,/*7754*/2464/* 1E4A */,/*7755*/2465/* 1E4B */,/*7756*/2466/* 1E4C */,/*7757*/2467/* 1E4D */, /*7758*/2468/* 1E4E */,/*7759*/2469/* 1E4F */,/*7760*/2470/* 1E50 */,/*7761*/2471/* 1E51 */,/*7762*/2472/* 1E52 */, /*7763*/2473/* 1E53 */,/*7764*/2474/* 1E54 */,/*7765*/2475/* 1E55 */,/*7766*/2476/* 1E56 */,/*7767*/2477/* 1E57 */, /*7768*/2478/* 1E58 */,/*7769*/2479/* 1E59 */,/*7770*/2480/* 1E5A */,/*7771*/2481/* 1E5B */,/*7772*/2482/* 1E5C */, /*7773*/2483/* 1E5D */,/*7774*/2484/* 1E5E */,/*7775*/2485/* 1E5F */,/*7776*/2486/* 1E60 */,/*7777*/2487/* 1E61 */, /*7778*/2488/* 1E62 */,/*7779*/2489/* 1E63 */,/*7780*/2490/* 1E64 */,/*7781*/2491/* 1E65 */,/*7782*/2492/* 1E66 */, /*7783*/2493/* 1E67 */,/*7784*/2494/* 1E68 */,/*7785*/2495/* 1E69 */,/*7786*/2496/* 1E6A */,/*7787*/2497/* 1E6B */, /*7788*/2498/* 1E6C */,/*7789*/2499/* 1E6D */,/*7790*/2500/* 1E6E */,/*7791*/2501/* 1E6F */,/*7792*/2502/* 1E70 */, /*7793*/2503/* 1E71 */,/*7794*/2504/* 1E72 */,/*7795*/2505/* 1E73 */,/*7796*/2506/* 1E74 */,/*7797*/2507/* 1E75 */, /*7798*/2508/* 1E76 */,/*7799*/2509/* 1E77 */,/*7800*/2510/* 1E78 */,/*7801*/2511/* 1E79 */,/*7802*/2512/* 1E7A */, /*7803*/2513/* 1E7B */,/*7804*/2514/* 1E7C */,/*7805*/2515/* 1E7D */,/*7806*/2516/* 1E7E */,/*7807*/2517/* 1E7F */, /*7808*/2518/* 1E80 */,/*7809*/2519/* 1E81 */,/*7810*/2520/* 1E82 */,/*7811*/2521/* 1E83 */,/*7812*/2522/* 1E84 */, /*7813*/2523/* 1E85 */,/*7814*/2524/* 1E86 */,/*7815*/2525/* 1E87 */,/*7816*/2526/* 1E88 */,/*7817*/2527/* 1E89 */, /*7818*/2528/* 1E8A */,/*7819*/2529/* 1E8B */,/*7820*/2530/* 1E8C */,/*7821*/2531/* 1E8D */,/*7822*/2532/* 1E8E */, /*7823*/2533/* 1E8F */,/*7824*/2534/* 1E90 */,/*7825*/2535/* 1E91 */,/*7826*/2536/* 1E92 */,/*7827*/2537/* 1E93 */, /*7828*/2538/* 1E94 */,/*7829*/2539/* 1E95 */,/*7830*/2540/* 1E96 */,/*7831*/2541/* 1E97 */,/*7832*/2542/* 1E98 */, /*7833*/2543/* 1E99 */,/*7834*/2544/* 1E9A */,/*7835*/2545/* 1E9B */,/*7836*/2546/* 1E9C */,/*7837*/2546/* 1E9D */, /*7838*/2547/* 1E9E */,/*7839*/2546/* 1E9F */,/*7840*/2548/* 1EA0 */,/*7841*/2549/* 1EA1 */,/*7842*/2550/* 1EA2 */, /*7843*/2551/* 1EA3 */,/*7844*/2552/* 1EA4 */,/*7845*/2553/* 1EA5 */,/*7846*/2554/* 1EA6 */,/*7847*/2555/* 1EA7 */, /*7848*/2556/* 1EA8 */,/*7849*/2557/* 1EA9 */,/*7850*/2558/* 1EAA */,/*7851*/2559/* 1EAB */,/*7852*/2560/* 1EAC */, /*7853*/2561/* 1EAD */,/*7854*/2562/* 1EAE */,/*7855*/2563/* 1EAF */,/*7856*/2564/* 1EB0 */,/*7857*/2565/* 1EB1 */, /*7858*/2566/* 1EB2 */,/*7859*/2567/* 1EB3 */,/*7860*/2568/* 1EB4 */,/*7861*/2569/* 1EB5 */,/*7862*/2570/* 1EB6 */, /*7863*/2571/* 1EB7 */,/*7864*/2572/* 1EB8 */,/*7865*/2573/* 1EB9 */,/*7866*/2574/* 1EBA */,/*7867*/2575/* 1EBB */, /*7868*/2576/* 1EBC */,/*7869*/2577/* 1EBD */,/*7870*/2578/* 1EBE */,/*7871*/2579/* 1EBF */,/*7872*/2580/* 1EC0 */, /*7873*/2581/* 1EC1 */,/*7874*/2582/* 1EC2 */,/*7875*/2583/* 1EC3 */,/*7876*/2584/* 1EC4 */,/*7877*/2585/* 1EC5 */, /*7878*/2586/* 1EC6 */,/*7879*/2587/* 1EC7 */,/*7880*/2588/* 1EC8 */,/*7881*/2589/* 1EC9 */,/*7882*/2590/* 1ECA */, /*7883*/2591/* 1ECB */,/*7884*/2592/* 1ECC */,/*7885*/2593/* 1ECD */,/*7886*/2594/* 1ECE */,/*7887*/2595/* 1ECF */, /*7888*/2596/* 1ED0 */,/*7889*/2597/* 1ED1 */,/*7890*/2598/* 1ED2 */,/*7891*/2599/* 1ED3 */,/*7892*/2600/* 1ED4 */, /*7893*/2601/* 1ED5 */,/*7894*/2602/* 1ED6 */,/*7895*/2603/* 1ED7 */,/*7896*/2604/* 1ED8 */,/*7897*/2605/* 1ED9 */, /*7898*/2606/* 1EDA */,/*7899*/2607/* 1EDB */,/*7900*/2608/* 1EDC */,/*7901*/2609/* 1EDD */,/*7902*/2610/* 1EDE */, /*7903*/2611/* 1EDF */,/*7904*/2612/* 1EE0 */,/*7905*/2613/* 1EE1 */,/*7906*/2614/* 1EE2 */,/*7907*/2615/* 1EE3 */, /*7908*/2616/* 1EE4 */,/*7909*/2617/* 1EE5 */,/*7910*/2618/* 1EE6 */,/*7911*/2619/* 1EE7 */,/*7912*/2620/* 1EE8 */, /*7913*/2621/* 1EE9 */,/*7914*/2622/* 1EEA */,/*7915*/2623/* 1EEB */,/*7916*/2624/* 1EEC */,/*7917*/2625/* 1EED */, /*7918*/2626/* 1EEE */,/*7919*/2627/* 1EEF */,/*7920*/2628/* 1EF0 */,/*7921*/2629/* 1EF1 */,/*7922*/2630/* 1EF2 */, /*7923*/2631/* 1EF3 */,/*7924*/2632/* 1EF4 */,/*7925*/2633/* 1EF5 */,/*7926*/2634/* 1EF6 */,/*7927*/2635/* 1EF7 */, /*7928*/2636/* 1EF8 */,/*7929*/2637/* 1EF9 */,/*7930*/2638/* 1EFA */,/*7931*/2639/* 1EFB */,/*7932*/2640/* 1EFC */, /*7933*/2641/* 1EFD */,/*7934*/2642/* 1EFE */,/*7935*/2643/* 1EFF */,/*7936*/2644/* 1F00 */,/*7937*/2645/* 1F01 */, /*7938*/2646/* 1F02 */,/*7939*/2647/* 1F03 */,/*7940*/2648/* 1F04 */,/*7941*/2649/* 1F05 */,/*7942*/2650/* 1F06 */, /*7943*/2651/* 1F07 */,/*7944*/2652/* 1F08 */,/*7945*/2653/* 1F09 */,/*7946*/2654/* 1F0A */,/*7947*/2655/* 1F0B */, /*7948*/2656/* 1F0C */,/*7949*/2657/* 1F0D */,/*7950*/2658/* 1F0E */,/*7951*/2659/* 1F0F */,/*7952*/2660/* 1F10 */, /*7953*/2661/* 1F11 */,/*7954*/2662/* 1F12 */,/*7955*/2663/* 1F13 */,/*7956*/2664/* 1F14 */,/*7957*/2665/* 1F15 */,0,0, /*7960*/2666/* 1F18 */,/*7961*/2667/* 1F19 */,/*7962*/2668/* 1F1A */,/*7963*/2669/* 1F1B */,/*7964*/2670/* 1F1C */, /*7965*/2671/* 1F1D */,0,0,/*7968*/2672/* 1F20 */,/*7969*/2673/* 1F21 */,/*7970*/2674/* 1F22 */,/*7971*/2675/* 1F23 */, /*7972*/2676/* 1F24 */,/*7973*/2677/* 1F25 */,/*7974*/2678/* 1F26 */,/*7975*/2679/* 1F27 */,/*7976*/2680/* 1F28 */, /*7977*/2681/* 1F29 */,/*7978*/2682/* 1F2A */,/*7979*/2683/* 1F2B */,/*7980*/2684/* 1F2C */,/*7981*/2685/* 1F2D */, /*7982*/2686/* 1F2E */,/*7983*/2687/* 1F2F */,/*7984*/2688/* 1F30 */,/*7985*/2689/* 1F31 */,/*7986*/2690/* 1F32 */, /*7987*/2691/* 1F33 */,/*7988*/2692/* 1F34 */,/*7989*/2693/* 1F35 */,/*7990*/2694/* 1F36 */,/*7991*/2695/* 1F37 */, /*7992*/2696/* 1F38 */,/*7993*/2697/* 1F39 */,/*7994*/2698/* 1F3A */,/*7995*/2699/* 1F3B */,/*7996*/2700/* 1F3C */, /*7997*/2701/* 1F3D */,/*7998*/2702/* 1F3E */,/*7999*/2703/* 1F3F */,/*8000*/2704/* 1F40 */,/*8001*/2705/* 1F41 */, /*8002*/2706/* 1F42 */,/*8003*/2707/* 1F43 */,/*8004*/2708/* 1F44 */,/*8005*/2709/* 1F45 */,0,0,/*8008*/2710/* 1F48 */, /*8009*/2711/* 1F49 */,/*8010*/2712/* 1F4A */,/*8011*/2713/* 1F4B */,/*8012*/2714/* 1F4C */,/*8013*/2715/* 1F4D */,0,0, /*8016*/2716/* 1F50 */,/*8017*/2717/* 1F51 */,/*8018*/2718/* 1F52 */,/*8019*/2719/* 1F53 */,/*8020*/2720/* 1F54 */, /*8021*/2721/* 1F55 */,/*8022*/2722/* 1F56 */,/*8023*/2723/* 1F57 */,0,/*8025*/2724/* 1F59 */,0,/*8027*/2725/* 1F5B */,0, /*8029*/2726/* 1F5D */,0,/*8031*/2727/* 1F5F */,/*8032*/2728/* 1F60 */,/*8033*/2729/* 1F61 */,/*8034*/2730/* 1F62 */, /*8035*/2731/* 1F63 */,/*8036*/2732/* 1F64 */,/*8037*/2733/* 1F65 */,/*8038*/2734/* 1F66 */,/*8039*/2735/* 1F67 */, /*8040*/2736/* 1F68 */,/*8041*/2737/* 1F69 */,/*8042*/2738/* 1F6A */,/*8043*/2739/* 1F6B */,/*8044*/2740/* 1F6C */, /*8045*/2741/* 1F6D */,/*8046*/2742/* 1F6E */,/*8047*/2743/* 1F6F */,/*8048*/2744/* 1F70 */,/*8049*/2745/* 1F71 */, /*8050*/2746/* 1F72 */,/*8051*/2747/* 1F73 */,/*8052*/2748/* 1F74 */,/*8053*/2749/* 1F75 */,/*8054*/2750/* 1F76 */, /*8055*/2751/* 1F77 */,/*8056*/2752/* 1F78 */,/*8057*/2753/* 1F79 */,/*8058*/2754/* 1F7A */,/*8059*/2755/* 1F7B */, /*8060*/2756/* 1F7C */,/*8061*/2757/* 1F7D */,0,0,/*8064*/2758/* 1F80 */,/*8065*/2759/* 1F81 */,/*8066*/2760/* 1F82 */, /*8067*/2761/* 1F83 */,/*8068*/2762/* 1F84 */,/*8069*/2763/* 1F85 */,/*8070*/2764/* 1F86 */,/*8071*/2765/* 1F87 */, /*8072*/2766/* 1F88 */,/*8073*/2767/* 1F89 */,/*8074*/2768/* 1F8A */,/*8075*/2769/* 1F8B */,/*8076*/2770/* 1F8C */, /*8077*/2771/* 1F8D */,/*8078*/2772/* 1F8E */,/*8079*/2773/* 1F8F */,/*8080*/2774/* 1F90 */,/*8081*/2775/* 1F91 */, /*8082*/2776/* 1F92 */,/*8083*/2777/* 1F93 */,/*8084*/2778/* 1F94 */,/*8085*/2779/* 1F95 */,/*8086*/2780/* 1F96 */, /*8087*/2781/* 1F97 */,/*8088*/2782/* 1F98 */,/*8089*/2783/* 1F99 */,/*8090*/2784/* 1F9A */,/*8091*/2785/* 1F9B */, /*8092*/2786/* 1F9C */,/*8093*/2787/* 1F9D */,/*8094*/2788/* 1F9E */,/*8095*/2789/* 1F9F */,/*8096*/2790/* 1FA0 */, /*8097*/2791/* 1FA1 */,/*8098*/2792/* 1FA2 */,/*8099*/2793/* 1FA3 */,/*8100*/2794/* 1FA4 */,/*8101*/2795/* 1FA5 */, /*8102*/2796/* 1FA6 */,/*8103*/2797/* 1FA7 */,/*8104*/2798/* 1FA8 */,/*8105*/2799/* 1FA9 */,/*8106*/2800/* 1FAA */, /*8107*/2801/* 1FAB */,/*8108*/2802/* 1FAC */,/*8109*/2803/* 1FAD */,/*8110*/2804/* 1FAE */,/*8111*/2805/* 1FAF */, /*8112*/2806/* 1FB0 */,/*8113*/2807/* 1FB1 */,/*8114*/2808/* 1FB2 */,/*8115*/2809/* 1FB3 */,/*8116*/2810/* 1FB4 */,0, /*8118*/2811/* 1FB6 */,/*8119*/2812/* 1FB7 */,/*8120*/2813/* 1FB8 */,/*8121*/2814/* 1FB9 */,/*8122*/2815/* 1FBA */, /*8123*/2816/* 1FBB */,/*8124*/2817/* 1FBC */,/*8125*/2818/* 1FBD */,/*8126*/2819/* 1FBE */,/*8127*/2820/* 1FBF */, /*8128*/2821/* 1FC0 */,/*8129*/2822/* 1FC1 */,/*8130*/2823/* 1FC2 */,/*8131*/2824/* 1FC3 */,/*8132*/2825/* 1FC4 */,0, /*8134*/2826/* 1FC6 */,/*8135*/2827/* 1FC7 */,/*8136*/2828/* 1FC8 */,/*8137*/2829/* 1FC9 */,/*8138*/2830/* 1FCA */, /*8139*/2831/* 1FCB */,/*8140*/2832/* 1FCC */,/*8141*/2833/* 1FCD */,/*8142*/2834/* 1FCE */,/*8143*/2835/* 1FCF */, /*8144*/2836/* 1FD0 */,/*8145*/2837/* 1FD1 */,/*8146*/2838/* 1FD2 */,/*8147*/2839/* 1FD3 */,0,0,/*8150*/2840/* 1FD6 */, /*8151*/2841/* 1FD7 */,/*8152*/2842/* 1FD8 */,/*8153*/2843/* 1FD9 */,/*8154*/2844/* 1FDA */,/*8155*/2845/* 1FDB */,0, /*8157*/2846/* 1FDD */,/*8158*/2847/* 1FDE */,/*8159*/2848/* 1FDF */,/*8160*/2849/* 1FE0 */,/*8161*/2850/* 1FE1 */, /*8162*/2851/* 1FE2 */,/*8163*/2852/* 1FE3 */,/*8164*/2853/* 1FE4 */,/*8165*/2854/* 1FE5 */,/*8166*/2855/* 1FE6 */, /*8167*/2856/* 1FE7 */,/*8168*/2857/* 1FE8 */,/*8169*/2858/* 1FE9 */,/*8170*/2859/* 1FEA */,/*8171*/2860/* 1FEB */, /*8172*/2861/* 1FEC */,/*8173*/2862/* 1FED */,/*8174*/2863/* 1FEE */,/*8175*/2864/* 1FEF */,0,0,/*8178*/2865/* 1FF2 */, /*8179*/2866/* 1FF3 */,/*8180*/2867/* 1FF4 */,0,/*8182*/2868/* 1FF6 */,/*8183*/2869/* 1FF7 */,/*8184*/2870/* 1FF8 */, /*8185*/2871/* 1FF9 */,/*8186*/2872/* 1FFA */,/*8187*/2873/* 1FFB */,/*8188*/2874/* 1FFC */,/*8189*/2875/* 1FFD */, /*8190*/2876/* 1FFE */,0,/*8192*/2877/* 2000 */,/*8193*/2878/* 2001 */,/*8194*/2879/* 2002 */,/*8195*/2880/* 2003 */, /*8196*/2881/* 2004 */,/*8197*/2882/* 2005 */,/*8198*/2883/* 2006 */,/*8199*/2884/* 2007 */,/*8200*/2885/* 2008 */, /*8201*/2886/* 2009 */,/*8202*/2887/* 200A */,/*8203*/2888/* 200B */,/*8204*/2889/* 200C */,/*8205*/2890/* 200D */, /*8206*/2891/* 200E */,/*8207*/2892/* 200F */,/*8208*/2893/* 2010 */,/*8209*/2894/* 2011 */,/*8210*/2895/* 2012 */, /*8211*/2896/* 2013 */,/*8212*/2896/* 2014 */,/*8213*/2895/* 2015 */,/*8214*/2897/* 2016 */,/*8215*/2898/* 2017 */, /*8216*/2899/* 2018 */,/*8217*/2900/* 2019 */,/*8218*/2901/* 201A */,/*8219*/2902/* 201B */,/*8220*/2902/* 201C */, /*8221*/2903/* 201D */,/*8222*/2901/* 201E */,/*8223*/2902/* 201F */,/*8224*/2904/* 2020 */,/*8225*/2904/* 2021 */, /*8226*/2904/* 2022 */,/*8227*/2904/* 2023 */,/*8228*/2905/* 2024 */,/*8229*/2906/* 2025 */,/*8230*/2907/* 2026 */, /*8231*/2908/* 2027 */,/*8232*/2909/* 2028 */,/*8233*/2910/* 2029 */,/*8234*/2911/* 202A */,/*8235*/2912/* 202B */, /*8236*/2913/* 202C */,/*8237*/2914/* 202D */,/*8238*/2915/* 202E */,/*8239*/2916/* 202F */,/*8240*/2917/* 2030 */, /*8241*/2917/* 2031 */,/*8242*/2918/* 2032 */,/*8243*/2919/* 2033 */,/*8244*/2920/* 2034 */,/*8245*/2904/* 2035 */, /*8246*/2921/* 2036 */,/*8247*/2922/* 2037 */,/*8248*/2904/* 2038 */,/*8249*/2923/* 2039 */,/*8250*/2924/* 203A */, /*8251*/2904/* 203B */,/*8252*/2925/* 203C */,/*8253*/2926/* 203D */,/*8254*/2927/* 203E */,/*8255*/2928/* 203F */, /*8256*/2929/* 2040 */,/*8257*/2904/* 2041 */,/*8258*/2904/* 2042 */,/*8259*/2904/* 2043 */,/*8260*/2930/* 2044 */, /*8261*/2931/* 2045 */,/*8262*/2932/* 2046 */,/*8263*/2933/* 2047 */,/*8264*/2934/* 2048 */,/*8265*/2935/* 2049 */, /*8266*/2936/* 204A */,/*8267*/2936/* 204B */,/*8268*/2936/* 204C */,/*8269*/2936/* 204D */,/*8270*/2937/* 204E */, /*8271*/2937/* 204F */,/*8272*/2937/* 2050 */,/*8273*/2937/* 2051 */,/*8274*/2938/* 2052 */,/*8275*/2939/* 2053 */, /*8276*/2940/* 2054 */,/*8277*/2941/* 2055 */,/*8278*/2941/* 2056 */,/*8279*/2942/* 2057 */,/*8280*/2941/* 2058 */, /*8281*/2941/* 2059 */,/*8282*/2941/* 205A */,/*8283*/2941/* 205B */,/*8284*/2941/* 205C */,/*8285*/2941/* 205D */, /*8286*/2941/* 205E */,/*8287*/2943/* 205F */,/*8288*/2944/* 2060 */,/*8289*/2945/* 2061 */,/*8290*/2945/* 2062 */, /*8291*/2945/* 2063 */,/*8292*/2946/* 2064 */,0,/*8294*/2947/* 2066 */,/*8295*/2948/* 2067 */,/*8296*/2949/* 2068 */, /*8297*/2950/* 2069 */,/*8298*/2951/* 206A */,/*8299*/2951/* 206B */,/*8300*/2951/* 206C */,/*8301*/2951/* 206D */, /*8302*/2951/* 206E */,/*8303*/2951/* 206F */,/*8304*/2952/* 2070 */,/*8305*/2953/* 2071 */,0,0,/*8308*/2954/* 2074 */, /*8309*/2955/* 2075 */,/*8310*/2956/* 2076 */,/*8311*/2957/* 2077 */,/*8312*/2958/* 2078 */,/*8313*/2959/* 2079 */, /*8314*/2960/* 207A */,/*8315*/2961/* 207B */,/*8316*/2962/* 207C */,/*8317*/2963/* 207D */,/*8318*/2964/* 207E */, /*8319*/2965/* 207F */,/*8320*/2966/* 2080 */,/*8321*/2967/* 2081 */,/*8322*/2968/* 2082 */,/*8323*/2969/* 2083 */, /*8324*/2970/* 2084 */,/*8325*/2971/* 2085 */,/*8326*/2972/* 2086 */,/*8327*/2973/* 2087 */,/*8328*/2974/* 2088 */, /*8329*/2975/* 2089 */,/*8330*/2976/* 208A */,/*8331*/2977/* 208B */,/*8332*/2978/* 208C */,/*8333*/2979/* 208D */, /*8334*/2980/* 208E */,0,/*8336*/2981/* 2090 */,/*8337*/2982/* 2091 */,/*8338*/2983/* 2092 */,/*8339*/2984/* 2093 */, /*8340*/2985/* 2094 */,/*8341*/2986/* 2095 */,/*8342*/2987/* 2096 */,/*8343*/2988/* 2097 */,/*8344*/2989/* 2098 */, /*8345*/2990/* 2099 */,/*8346*/2991/* 209A */,/*8347*/2992/* 209B */,/*8348*/2993/* 209C */,0,0,0,/*8352*/2994/* 20A0 */, /*8353*/2994/* 20A1 */,/*8354*/2994/* 20A2 */,/*8355*/2994/* 20A3 */,/*8356*/2994/* 20A4 */,/*8357*/2994/* 20A5 */, /*8358*/2994/* 20A6 */,/*8359*/2994/* 20A7 */,/*8360*/2995/* 20A8 */,/*8361*/2994/* 20A9 */,/*8362*/2994/* 20AA */, /*8363*/2996/* 20AB */,/*8364*/2997/* 20AC */,/*8365*/2998/* 20AD */,/*8366*/2998/* 20AE */,/*8367*/2998/* 20AF */, /*8368*/2999/* 20B0 */,/*8369*/2999/* 20B1 */,/*8370*/3000/* 20B2 */,/*8371*/3000/* 20B3 */,/*8372*/3000/* 20B4 */, /*8373*/3000/* 20B5 */,/*8374*/3001/* 20B6 */,/*8375*/3001/* 20B7 */,/*8376*/3001/* 20B8 */,/*8377*/3002/* 20B9 */, /*8378*/3003/* 20BA */,/*8379*/3004/* 20BB */,/*8380*/3004/* 20BC */,/*8381*/3004/* 20BD */,/*8382*/3005/* 20BE */,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*8400*/3006/* 20D0 */,/*8401*/3006/* 20D1 */,/*8402*/3007/* 20D2 */,/*8403*/3007/* 20D3 */, /*8404*/3006/* 20D4 */,/*8405*/3006/* 20D5 */,/*8406*/3006/* 20D6 */,/*8407*/3006/* 20D7 */,/*8408*/3007/* 20D8 */, /*8409*/3007/* 20D9 */,/*8410*/3007/* 20DA */,/*8411*/3006/* 20DB */,/*8412*/3006/* 20DC */,/*8413*/3008/* 20DD */, /*8414*/3008/* 20DE */,/*8415*/3008/* 20DF */,/*8416*/3008/* 20E0 */,/*8417*/3006/* 20E1 */,/*8418*/3009/* 20E2 */, /*8419*/3009/* 20E3 */,/*8420*/3010/* 20E4 */,/*8421*/3011/* 20E5 */,/*8422*/3011/* 20E6 */,/*8423*/3012/* 20E7 */, /*8424*/3013/* 20E8 */,/*8425*/3012/* 20E9 */,/*8426*/3014/* 20EA */,/*8427*/3015/* 20EB */,/*8428*/3016/* 20EC */, /*8429*/3016/* 20ED */,/*8430*/3016/* 20EE */,/*8431*/3016/* 20EF */,/*8432*/3017/* 20F0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*8448*/3018/* 2100 */,/*8449*/3019/* 2101 */,/*8450*/3020/* 2102 */,/*8451*/3021/* 2103 */,/*8452*/3022/* 2104 */, /*8453*/3023/* 2105 */,/*8454*/3024/* 2106 */,/*8455*/3025/* 2107 */,/*8456*/3022/* 2108 */,/*8457*/3026/* 2109 */, /*8458*/3027/* 210A */,/*8459*/3028/* 210B */,/*8460*/3029/* 210C */,/*8461*/3030/* 210D */,/*8462*/3031/* 210E */, /*8463*/3032/* 210F */,/*8464*/3033/* 2110 */,/*8465*/3034/* 2111 */,/*8466*/3035/* 2112 */,/*8467*/3036/* 2113 */, /*8468*/3022/* 2114 */,/*8469*/3037/* 2115 */,/*8470*/3038/* 2116 */,/*8471*/3022/* 2117 */,/*8472*/3039/* 2118 */, /*8473*/3040/* 2119 */,/*8474*/3041/* 211A */,/*8475*/3042/* 211B */,/*8476*/3043/* 211C */,/*8477*/3044/* 211D */, /*8478*/3022/* 211E */,/*8479*/3022/* 211F */,/*8480*/3045/* 2120 */,/*8481*/3046/* 2121 */,/*8482*/3047/* 2122 */, /*8483*/3022/* 2123 */,/*8484*/3048/* 2124 */,/*8485*/3022/* 2125 */,/*8486*/3049/* 2126 */,/*8487*/3022/* 2127 */, /*8488*/3050/* 2128 */,/*8489*/3051/* 2129 */,/*8490*/3052/* 212A */,/*8491*/3053/* 212B */,/*8492*/3054/* 212C */, /*8493*/3055/* 212D */,/*8494*/3056/* 212E */,/*8495*/3057/* 212F */,/*8496*/3058/* 2130 */,/*8497*/3059/* 2131 */, /*8498*/3060/* 2132 */,/*8499*/3061/* 2133 */,/*8500*/3062/* 2134 */,/*8501*/3063/* 2135 */,/*8502*/3064/* 2136 */, /*8503*/3065/* 2137 */,/*8504*/3066/* 2138 */,/*8505*/3067/* 2139 */,/*8506*/3068/* 213A */,/*8507*/3069/* 213B */, /*8508*/3070/* 213C */,/*8509*/3071/* 213D */,/*8510*/3072/* 213E */,/*8511*/3073/* 213F */,/*8512*/3074/* 2140 */, /*8513*/3075/* 2141 */,/*8514*/3075/* 2142 */,/*8515*/3075/* 2143 */,/*8516*/3075/* 2144 */,/*8517*/3076/* 2145 */, /*8518*/3077/* 2146 */,/*8519*/3078/* 2147 */,/*8520*/3079/* 2148 */,/*8521*/3080/* 2149 */,/*8522*/3081/* 214A */, /*8523*/3075/* 214B */,/*8524*/3082/* 214C */,/*8525*/3083/* 214D */,/*8526*/3084/* 214E */,/*8527*/3085/* 214F */, /*8528*/3086/* 2150 */,/*8529*/3087/* 2151 */,/*8530*/3088/* 2152 */,/*8531*/3089/* 2153 */,/*8532*/3090/* 2154 */, /*8533*/3091/* 2155 */,/*8534*/3092/* 2156 */,/*8535*/3093/* 2157 */,/*8536*/3094/* 2158 */,/*8537*/3095/* 2159 */, /*8538*/3096/* 215A */,/*8539*/3097/* 215B */,/*8540*/3098/* 215C */,/*8541*/3099/* 215D */,/*8542*/3100/* 215E */, /*8543*/3101/* 215F */,/*8544*/3102/* 2160 */,/*8545*/3103/* 2161 */,/*8546*/3104/* 2162 */,/*8547*/3105/* 2163 */, /*8548*/3106/* 2164 */,/*8549*/3107/* 2165 */,/*8550*/3108/* 2166 */,/*8551*/3109/* 2167 */,/*8552*/3110/* 2168 */, /*8553*/3111/* 2169 */,/*8554*/3112/* 216A */,/*8555*/3113/* 216B */,/*8556*/3114/* 216C */,/*8557*/3115/* 216D */, /*8558*/3116/* 216E */,/*8559*/3117/* 216F */,/*8560*/3118/* 2170 */,/*8561*/3119/* 2171 */,/*8562*/3120/* 2172 */, /*8563*/3121/* 2173 */,/*8564*/3122/* 2174 */,/*8565*/3123/* 2175 */,/*8566*/3124/* 2176 */,/*8567*/3125/* 2177 */, /*8568*/3126/* 2178 */,/*8569*/3127/* 2179 */,/*8570*/3128/* 217A */,/*8571*/3129/* 217B */,/*8572*/3130/* 217C */, /*8573*/3131/* 217D */,/*8574*/3132/* 217E */,/*8575*/3133/* 217F */,/*8576*/3134/* 2180 */,/*8577*/3135/* 2181 */, /*8578*/3136/* 2182 */,/*8579*/3137/* 2183 */,/*8580*/3138/* 2184 */,/*8581*/3139/* 2185 */,/*8582*/3140/* 2186 */, /*8583*/3141/* 2187 */,/*8584*/3142/* 2188 */,/*8585*/3143/* 2189 */,/*8586*/3144/* 218A */,/*8587*/3144/* 218B */,0,0,0, 0,/*8592*/3145/* 2190 */,/*8593*/3145/* 2191 */,/*8594*/3145/* 2192 */,/*8595*/3145/* 2193 */,/*8596*/3145/* 2194 */, /*8597*/3146/* 2195 */,/*8598*/3146/* 2196 */,/*8599*/3146/* 2197 */,/*8600*/3146/* 2198 */,/*8601*/3146/* 2199 */, /*8602*/3147/* 219A */,/*8603*/3148/* 219B */,/*8604*/3146/* 219C */,/*8605*/3146/* 219D */,/*8606*/3146/* 219E */, /*8607*/3146/* 219F */,/*8608*/3145/* 21A0 */,/*8609*/3146/* 21A1 */,/*8610*/3146/* 21A2 */,/*8611*/3145/* 21A3 */, /*8612*/3146/* 21A4 */,/*8613*/3146/* 21A5 */,/*8614*/3145/* 21A6 */,/*8615*/3146/* 21A7 */,/*8616*/3149/* 21A8 */, /*8617*/3146/* 21A9 */,/*8618*/3146/* 21AA */,/*8619*/3146/* 21AB */,/*8620*/3146/* 21AC */,/*8621*/3146/* 21AD */, /*8622*/3150/* 21AE */,/*8623*/3149/* 21AF */,/*8624*/3146/* 21B0 */,/*8625*/3146/* 21B1 */,/*8626*/3149/* 21B2 */, /*8627*/3149/* 21B3 */,/*8628*/3149/* 21B4 */,/*8629*/3149/* 21B5 */,/*8630*/3146/* 21B6 */,/*8631*/3146/* 21B7 */, /*8632*/3149/* 21B8 */,/*8633*/3149/* 21B9 */,/*8634*/3149/* 21BA */,/*8635*/3149/* 21BB */,/*8636*/3146/* 21BC */, /*8637*/3146/* 21BD */,/*8638*/3146/* 21BE */,/*8639*/3146/* 21BF */,/*8640*/3146/* 21C0 */,/*8641*/3146/* 21C1 */, /*8642*/3146/* 21C2 */,/*8643*/3146/* 21C3 */,/*8644*/3146/* 21C4 */,/*8645*/3146/* 21C5 */,/*8646*/3146/* 21C6 */, /*8647*/3146/* 21C7 */,/*8648*/3146/* 21C8 */,/*8649*/3146/* 21C9 */,/*8650*/3146/* 21CA */,/*8651*/3146/* 21CB */, /*8652*/3146/* 21CC */,/*8653*/3151/* 21CD */,/*8654*/3152/* 21CE */,/*8655*/3153/* 21CF */,/*8656*/3146/* 21D0 */, /*8657*/3146/* 21D1 */,/*8658*/3145/* 21D2 */,/*8659*/3146/* 21D3 */,/*8660*/3145/* 21D4 */,/*8661*/3146/* 21D5 */, /*8662*/3146/* 21D6 */,/*8663*/3146/* 21D7 */,/*8664*/3146/* 21D8 */,/*8665*/3146/* 21D9 */,/*8666*/3146/* 21DA */, /*8667*/3146/* 21DB */,/*8668*/3149/* 21DC */,/*8669*/3146/* 21DD */,/*8670*/3149/* 21DE */,/*8671*/3149/* 21DF */, /*8672*/3149/* 21E0 */,/*8673*/3149/* 21E1 */,/*8674*/3149/* 21E2 */,/*8675*/3149/* 21E3 */,/*8676*/3146/* 21E4 */, /*8677*/3146/* 21E5 */,/*8678*/3149/* 21E6 */,/*8679*/3149/* 21E7 */,/*8680*/3149/* 21E8 */,/*8681*/3149/* 21E9 */, /*8682*/3149/* 21EA */,/*8683*/3154/* 21EB */,/*8684*/3154/* 21EC */,/*8685*/3154/* 21ED */,/*8686*/3154/* 21EE */, /*8687*/3154/* 21EF */,/*8688*/3154/* 21F0 */,/*8689*/3154/* 21F1 */,/*8690*/3154/* 21F2 */,/*8691*/3154/* 21F3 */, /*8692*/3155/* 21F4 */,/*8693*/3155/* 21F5 */,/*8694*/3155/* 21F6 */,/*8695*/3155/* 21F7 */,/*8696*/3155/* 21F8 */, /*8697*/3155/* 21F9 */,/*8698*/3155/* 21FA */,/*8699*/3155/* 21FB */,/*8700*/3155/* 21FC */,/*8701*/3155/* 21FD */, /*8702*/3155/* 21FE */,/*8703*/3155/* 21FF */,/*8704*/3156/* 2200 */,/*8705*/3157/* 2201 */,/*8706*/3157/* 2202 */, /*8707*/3157/* 2203 */,/*8708*/3158/* 2204 */,/*8709*/3156/* 2205 */,/*8710*/3156/* 2206 */,/*8711*/3156/* 2207 */, /*8712*/3159/* 2208 */,/*8713*/3160/* 2209 */,/*8714*/3161/* 220A */,/*8715*/3162/* 220B */,/*8716*/3163/* 220C */, /*8717*/3164/* 220D */,/*8718*/3156/* 220E */,/*8719*/3156/* 220F */,/*8720*/3156/* 2210 */,/*8721*/3157/* 2211 */, /*8722*/3165/* 2212 */,/*8723*/3166/* 2213 */,/*8724*/3156/* 2214 */,/*8725*/3167/* 2215 */,/*8726*/3157/* 2216 */, /*8727*/3156/* 2217 */,/*8728*/3156/* 2218 */,/*8729*/3156/* 2219 */,/*8730*/3157/* 221A */,/*8731*/3157/* 221B */, /*8732*/3157/* 221C */,/*8733*/3157/* 221D */,/*8734*/3156/* 221E */,/*8735*/3157/* 221F */,/*8736*/3157/* 2220 */, /*8737*/3157/* 2221 */,/*8738*/3157/* 2222 */,/*8739*/3156/* 2223 */,/*8740*/3168/* 2224 */,/*8741*/3156/* 2225 */, /*8742*/3169/* 2226 */,/*8743*/3156/* 2227 */,/*8744*/3156/* 2228 */,/*8745*/3156/* 2229 */,/*8746*/3156/* 222A */, /*8747*/3157/* 222B */,/*8748*/3170/* 222C */,/*8749*/3171/* 222D */,/*8750*/3157/* 222E */,/*8751*/3172/* 222F */, /*8752*/3173/* 2230 */,/*8753*/3157/* 2231 */,/*8754*/3157/* 2232 */,/*8755*/3157/* 2233 */,/*8756*/3156/* 2234 */, /*8757*/3156/* 2235 */,/*8758*/3156/* 2236 */,/*8759*/3156/* 2237 */,/*8760*/3156/* 2238 */,/*8761*/3157/* 2239 */, /*8762*/3156/* 223A */,/*8763*/3157/* 223B */,/*8764*/3174/* 223C */,/*8765*/3175/* 223D */,/*8766*/3157/* 223E */, /*8767*/3157/* 223F */,/*8768*/3157/* 2240 */,/*8769*/3176/* 2241 */,/*8770*/3157/* 2242 */,/*8771*/3177/* 2243 */, /*8772*/3178/* 2244 */,/*8773*/3157/* 2245 */,/*8774*/3157/* 2246 */,/*8775*/3179/* 2247 */,/*8776*/3157/* 2248 */, /*8777*/3180/* 2249 */,/*8778*/3157/* 224A */,/*8779*/3157/* 224B */,/*8780*/3157/* 224C */,/*8781*/3156/* 224D */, /*8782*/3156/* 224E */,/*8783*/3156/* 224F */,/*8784*/3156/* 2250 */,/*8785*/3156/* 2251 */,/*8786*/3181/* 2252 */, /*8787*/3182/* 2253 */,/*8788*/3183/* 2254 */,/*8789*/3184/* 2255 */,/*8790*/3156/* 2256 */,/*8791*/3156/* 2257 */, /*8792*/3156/* 2258 */,/*8793*/3156/* 2259 */,/*8794*/3156/* 225A */,/*8795*/3156/* 225B */,/*8796*/3156/* 225C */, /*8797*/3156/* 225D */,/*8798*/3156/* 225E */,/*8799*/3157/* 225F */,/*8800*/3185/* 2260 */,/*8801*/3156/* 2261 */, /*8802*/3186/* 2262 */,/*8803*/3156/* 2263 */,/*8804*/3187/* 2264 */,/*8805*/3188/* 2265 */,/*8806*/3189/* 2266 */, /*8807*/3190/* 2267 */,/*8808*/3191/* 2268 */,/*8809*/3192/* 2269 */,/*8810*/3193/* 226A */,/*8811*/3194/* 226B */, /*8812*/3156/* 226C */,/*8813*/3195/* 226D */,/*8814*/3196/* 226E */,/*8815*/3197/* 226F */,/*8816*/3198/* 2270 */, /*8817*/3199/* 2271 */,/*8818*/3200/* 2272 */,/*8819*/3201/* 2273 */,/*8820*/3202/* 2274 */,/*8821*/3203/* 2275 */, /*8822*/3204/* 2276 */,/*8823*/3205/* 2277 */,/*8824*/3206/* 2278 */,/*8825*/3207/* 2279 */,/*8826*/3208/* 227A */, /*8827*/3209/* 227B */,/*8828*/3210/* 227C */,/*8829*/3211/* 227D */,/*8830*/3212/* 227E */,/*8831*/3213/* 227F */, /*8832*/3214/* 2280 */,/*8833*/3215/* 2281 */,/*8834*/3216/* 2282 */,/*8835*/3217/* 2283 */,/*8836*/3218/* 2284 */, /*8837*/3219/* 2285 */,/*8838*/3220/* 2286 */,/*8839*/3221/* 2287 */,/*8840*/3222/* 2288 */,/*8841*/3223/* 2289 */, /*8842*/3224/* 228A */,/*8843*/3225/* 228B */,/*8844*/3157/* 228C */,/*8845*/3156/* 228D */,/*8846*/3156/* 228E */, /*8847*/3226/* 228F */,/*8848*/3227/* 2290 */,/*8849*/3228/* 2291 */,/*8850*/3229/* 2292 */,/*8851*/3156/* 2293 */, /*8852*/3156/* 2294 */,/*8853*/3156/* 2295 */,/*8854*/3156/* 2296 */,/*8855*/3156/* 2297 */,/*8856*/3230/* 2298 */, /*8857*/3156/* 2299 */,/*8858*/3156/* 229A */,/*8859*/3156/* 229B */,/*8860*/3156/* 229C */,/*8861*/3156/* 229D */, /*8862*/3156/* 229E */,/*8863*/3156/* 229F */,/*8864*/3156/* 22A0 */,/*8865*/3156/* 22A1 */,/*8866*/3231/* 22A2 */, /*8867*/3232/* 22A3 */,/*8868*/3156/* 22A4 */,/*8869*/3156/* 22A5 */,/*8870*/3233/* 22A6 */,/*8871*/3157/* 22A7 */, /*8872*/3234/* 22A8 */,/*8873*/3235/* 22A9 */,/*8874*/3157/* 22AA */,/*8875*/3236/* 22AB */,/*8876*/3237/* 22AC */, /*8877*/3238/* 22AD */,/*8878*/3239/* 22AE */,/*8879*/3240/* 22AF */,/*8880*/3241/* 22B0 */,/*8881*/3242/* 22B1 */, /*8882*/3243/* 22B2 */,/*8883*/3244/* 22B3 */,/*8884*/3245/* 22B4 */,/*8885*/3246/* 22B5 */,/*8886*/3247/* 22B6 */, /*8887*/3248/* 22B7 */,/*8888*/3157/* 22B8 */,/*8889*/3156/* 22B9 */,/*8890*/3156/* 22BA */,/*8891*/3156/* 22BB */, /*8892*/3156/* 22BC */,/*8893*/3156/* 22BD */,/*8894*/3157/* 22BE */,/*8895*/3157/* 22BF */,/*8896*/3156/* 22C0 */, /*8897*/3156/* 22C1 */,/*8898*/3156/* 22C2 */,/*8899*/3156/* 22C3 */,/*8900*/3156/* 22C4 */,/*8901*/3156/* 22C5 */, /*8902*/3156/* 22C6 */,/*8903*/3156/* 22C7 */,/*8904*/3156/* 22C8 */,/*8905*/3249/* 22C9 */,/*8906*/3250/* 22CA */, /*8907*/3251/* 22CB */,/*8908*/3252/* 22CC */,/*8909*/3253/* 22CD */,/*8910*/3156/* 22CE */,/*8911*/3156/* 22CF */, /*8912*/3254/* 22D0 */,/*8913*/3255/* 22D1 */,/*8914*/3156/* 22D2 */,/*8915*/3156/* 22D3 */,/*8916*/3156/* 22D4 */, /*8917*/3156/* 22D5 */,/*8918*/3256/* 22D6 */,/*8919*/3257/* 22D7 */,/*8920*/3258/* 22D8 */,/*8921*/3259/* 22D9 */, /*8922*/3260/* 22DA */,/*8923*/3261/* 22DB */,/*8924*/3262/* 22DC */,/*8925*/3263/* 22DD */,/*8926*/3264/* 22DE */, /*8927*/3265/* 22DF */,/*8928*/3266/* 22E0 */,/*8929*/3267/* 22E1 */,/*8930*/3268/* 22E2 */,/*8931*/3269/* 22E3 */, /*8932*/3270/* 22E4 */,/*8933*/3271/* 22E5 */,/*8934*/3272/* 22E6 */,/*8935*/3273/* 22E7 */,/*8936*/3274/* 22E8 */, /*8937*/3275/* 22E9 */,/*8938*/3276/* 22EA */,/*8939*/3277/* 22EB */,/*8940*/3278/* 22EC */,/*8941*/3279/* 22ED */, /*8942*/3156/* 22EE */,/*8943*/3156/* 22EF */,/*8944*/3280/* 22F0 */,/*8945*/3281/* 22F1 */,/*8946*/3282/* 22F2 */, /*8947*/3283/* 22F3 */,/*8948*/3284/* 22F4 */,/*8949*/3285/* 22F5 */,/*8950*/3286/* 22F6 */,/*8951*/3287/* 22F7 */, /*8952*/3285/* 22F8 */,/*8953*/3285/* 22F9 */,/*8954*/3288/* 22FA */,/*8955*/3289/* 22FB */,/*8956*/3290/* 22FC */, /*8957*/3291/* 22FD */,/*8958*/3292/* 22FE */,/*8959*/3285/* 22FF */,/*8960*/3293/* 2300 */,/*8961*/3294/* 2301 */, /*8962*/3293/* 2302 */,/*8963*/3293/* 2303 */,/*8964*/3293/* 2304 */,/*8965*/3293/* 2305 */,/*8966*/3293/* 2306 */, /*8967*/3293/* 2307 */,/*8968*/3295/* 2308 */,/*8969*/3296/* 2309 */,/*8970*/3297/* 230A */,/*8971*/3298/* 230B */, /*8972*/3293/* 230C */,/*8973*/3293/* 230D */,/*8974*/3293/* 230E */,/*8975*/3293/* 230F */,/*8976*/3293/* 2310 */, /*8977*/3293/* 2311 */,/*8978*/3293/* 2312 */,/*8979*/3293/* 2313 */,/*8980*/3293/* 2314 */,/*8981*/3293/* 2315 */, /*8982*/3293/* 2316 */,/*8983*/3293/* 2317 */,/*8984*/3293/* 2318 */,/*8985*/3293/* 2319 */,/*8986*/3293/* 231A */, /*8987*/3293/* 231B */,/*8988*/3293/* 231C */,/*8989*/3293/* 231D */,/*8990*/3293/* 231E */,/*8991*/3293/* 231F */, /*8992*/3299/* 2320 */,/*8993*/3299/* 2321 */,/*8994*/3293/* 2322 */,/*8995*/3293/* 2323 */,/*8996*/3293/* 2324 */, /*8997*/3293/* 2325 */,/*8998*/3293/* 2326 */,/*8999*/3293/* 2327 */,/*9000*/3293/* 2328 */,/*9001*/3300/* 2329 */, /*9002*/3301/* 232A */,/*9003*/3293/* 232B */,/*9004*/3293/* 232C */,/*9005*/3293/* 232D */,/*9006*/3293/* 232E */, /*9007*/3293/* 232F */,/*9008*/3293/* 2330 */,/*9009*/3293/* 2331 */,/*9010*/3293/* 2332 */,/*9011*/3293/* 2333 */, /*9012*/3293/* 2334 */,/*9013*/3293/* 2335 */,/*9014*/3302/* 2336 */,/*9015*/3302/* 2337 */,/*9016*/3302/* 2338 */, /*9017*/3302/* 2339 */,/*9018*/3302/* 233A */,/*9019*/3302/* 233B */,/*9020*/3302/* 233C */,/*9021*/3302/* 233D */, /*9022*/3302/* 233E */,/*9023*/3302/* 233F */,/*9024*/3302/* 2340 */,/*9025*/3302/* 2341 */,/*9026*/3302/* 2342 */, /*9027*/3302/* 2343 */,/*9028*/3302/* 2344 */,/*9029*/3302/* 2345 */,/*9030*/3302/* 2346 */,/*9031*/3302/* 2347 */, /*9032*/3302/* 2348 */,/*9033*/3302/* 2349 */,/*9034*/3302/* 234A */,/*9035*/3302/* 234B */,/*9036*/3302/* 234C */, /*9037*/3302/* 234D */,/*9038*/3302/* 234E */,/*9039*/3302/* 234F */,/*9040*/3302/* 2350 */,/*9041*/3302/* 2351 */, /*9042*/3302/* 2352 */,/*9043*/3302/* 2353 */,/*9044*/3302/* 2354 */,/*9045*/3302/* 2355 */,/*9046*/3302/* 2356 */, /*9047*/3302/* 2357 */,/*9048*/3302/* 2358 */,/*9049*/3302/* 2359 */,/*9050*/3302/* 235A */,/*9051*/3302/* 235B */, /*9052*/3302/* 235C */,/*9053*/3302/* 235D */,/*9054*/3302/* 235E */,/*9055*/3302/* 235F */,/*9056*/3302/* 2360 */, /*9057*/3302/* 2361 */,/*9058*/3302/* 2362 */,/*9059*/3302/* 2363 */,/*9060*/3302/* 2364 */,/*9061*/3302/* 2365 */, /*9062*/3302/* 2366 */,/*9063*/3302/* 2367 */,/*9064*/3302/* 2368 */,/*9065*/3302/* 2369 */,/*9066*/3302/* 236A */, /*9067*/3302/* 236B */,/*9068*/3302/* 236C */,/*9069*/3302/* 236D */,/*9070*/3302/* 236E */,/*9071*/3302/* 236F */, /*9072*/3302/* 2370 */,/*9073*/3302/* 2371 */,/*9074*/3302/* 2372 */,/*9075*/3302/* 2373 */,/*9076*/3302/* 2374 */, /*9077*/3302/* 2375 */,/*9078*/3302/* 2376 */,/*9079*/3302/* 2377 */,/*9080*/3302/* 2378 */,/*9081*/3302/* 2379 */, /*9082*/3302/* 237A */,/*9083*/3294/* 237B */,/*9084*/3303/* 237C */,/*9085*/3294/* 237D */,/*9086*/3294/* 237E */, /*9087*/3294/* 237F */,/*9088*/3294/* 2380 */,/*9089*/3294/* 2381 */,/*9090*/3294/* 2382 */,/*9091*/3294/* 2383 */, /*9092*/3294/* 2384 */,/*9093*/3294/* 2385 */,/*9094*/3294/* 2386 */,/*9095*/3294/* 2387 */,/*9096*/3294/* 2388 */, /*9097*/3294/* 2389 */,/*9098*/3294/* 238A */,/*9099*/3294/* 238B */,/*9100*/3294/* 238C */,/*9101*/3294/* 238D */, /*9102*/3294/* 238E */,/*9103*/3294/* 238F */,/*9104*/3294/* 2390 */,/*9105*/3294/* 2391 */,/*9106*/3294/* 2392 */, /*9107*/3294/* 2393 */,/*9108*/3294/* 2394 */,/*9109*/3304/* 2395 */,/*9110*/3294/* 2396 */,/*9111*/3294/* 2397 */, /*9112*/3294/* 2398 */,/*9113*/3294/* 2399 */,/*9114*/3294/* 239A */,/*9115*/3303/* 239B */,/*9116*/3303/* 239C */, /*9117*/3303/* 239D */,/*9118*/3303/* 239E */,/*9119*/3303/* 239F */,/*9120*/3303/* 23A0 */,/*9121*/3303/* 23A1 */, /*9122*/3303/* 23A2 */,/*9123*/3303/* 23A3 */,/*9124*/3303/* 23A4 */,/*9125*/3303/* 23A5 */,/*9126*/3303/* 23A6 */, /*9127*/3303/* 23A7 */,/*9128*/3303/* 23A8 */,/*9129*/3303/* 23A9 */,/*9130*/3303/* 23AA */,/*9131*/3303/* 23AB */, /*9132*/3303/* 23AC */,/*9133*/3303/* 23AD */,/*9134*/3303/* 23AE */,/*9135*/3303/* 23AF */,/*9136*/3303/* 23B0 */, /*9137*/3303/* 23B1 */,/*9138*/3303/* 23B2 */,/*9139*/3303/* 23B3 */,/*9140*/3305/* 23B4 */,/*9141*/3305/* 23B5 */, /*9142*/3306/* 23B6 */,/*9143*/3305/* 23B7 */,/*9144*/3306/* 23B8 */,/*9145*/3306/* 23B9 */,/*9146*/3306/* 23BA */, /*9147*/3306/* 23BB */,/*9148*/3306/* 23BC */,/*9149*/3306/* 23BD */,/*9150*/3306/* 23BE */,/*9151*/3306/* 23BF */, /*9152*/3306/* 23C0 */,/*9153*/3306/* 23C1 */,/*9154*/3306/* 23C2 */,/*9155*/3306/* 23C3 */,/*9156*/3306/* 23C4 */, /*9157*/3306/* 23C5 */,/*9158*/3306/* 23C6 */,/*9159*/3306/* 23C7 */,/*9160*/3306/* 23C8 */,/*9161*/3306/* 23C9 */, /*9162*/3306/* 23CA */,/*9163*/3306/* 23CB */,/*9164*/3306/* 23CC */,/*9165*/3306/* 23CD */,/*9166*/3306/* 23CE */, /*9167*/3307/* 23CF */,/*9168*/3308/* 23D0 */,/*9169*/3309/* 23D1 */,/*9170*/3309/* 23D2 */,/*9171*/3309/* 23D3 */, /*9172*/3309/* 23D4 */,/*9173*/3309/* 23D5 */,/*9174*/3309/* 23D6 */,/*9175*/3309/* 23D7 */,/*9176*/3309/* 23D8 */, /*9177*/3309/* 23D9 */,/*9178*/3309/* 23DA */,/*9179*/3309/* 23DB */,/*9180*/3310/* 23DC */,/*9181*/3310/* 23DD */, /*9182*/3310/* 23DE */,/*9183*/3310/* 23DF */,/*9184*/3310/* 23E0 */,/*9185*/3310/* 23E1 */,/*9186*/3311/* 23E2 */, /*9187*/3312/* 23E3 */,/*9188*/3312/* 23E4 */,/*9189*/3312/* 23E5 */,/*9190*/3312/* 23E6 */,/*9191*/3312/* 23E7 */, /*9192*/3313/* 23E8 */,/*9193*/3314/* 23E9 */,/*9194*/3314/* 23EA */,/*9195*/3314/* 23EB */,/*9196*/3314/* 23EC */, /*9197*/3314/* 23ED */,/*9198*/3314/* 23EE */,/*9199*/3314/* 23EF */,/*9200*/3314/* 23F0 */,/*9201*/3314/* 23F1 */, /*9202*/3314/* 23F2 */,/*9203*/3314/* 23F3 */,/*9204*/3315/* 23F4 */,/*9205*/3315/* 23F5 */,/*9206*/3315/* 23F6 */, /*9207*/3315/* 23F7 */,/*9208*/3315/* 23F8 */,/*9209*/3315/* 23F9 */,/*9210*/3315/* 23FA */,0,0,0,0,0, /*9216*/3316/* 2400 */,/*9217*/3316/* 2401 */,/*9218*/3316/* 2402 */,/*9219*/3316/* 2403 */,/*9220*/3316/* 2404 */, /*9221*/3316/* 2405 */,/*9222*/3316/* 2406 */,/*9223*/3316/* 2407 */,/*9224*/3316/* 2408 */,/*9225*/3316/* 2409 */, /*9226*/3316/* 240A */,/*9227*/3316/* 240B */,/*9228*/3316/* 240C */,/*9229*/3316/* 240D */,/*9230*/3316/* 240E */, /*9231*/3316/* 240F */,/*9232*/3316/* 2410 */,/*9233*/3316/* 2411 */,/*9234*/3316/* 2412 */,/*9235*/3316/* 2413 */, /*9236*/3316/* 2414 */,/*9237*/3316/* 2415 */,/*9238*/3316/* 2416 */,/*9239*/3316/* 2417 */,/*9240*/3316/* 2418 */, /*9241*/3316/* 2419 */,/*9242*/3316/* 241A */,/*9243*/3316/* 241B */,/*9244*/3316/* 241C */,/*9245*/3316/* 241D */, /*9246*/3316/* 241E */,/*9247*/3316/* 241F */,/*9248*/3316/* 2420 */,/*9249*/3316/* 2421 */,/*9250*/3316/* 2422 */, /*9251*/3316/* 2423 */,/*9252*/3316/* 2424 */,/*9253*/3317/* 2425 */,/*9254*/3317/* 2426 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*9280*/3318/* 2440 */,/*9281*/3318/* 2441 */,/*9282*/3318/* 2442 */,/*9283*/3318/* 2443 */, /*9284*/3318/* 2444 */,/*9285*/3318/* 2445 */,/*9286*/3318/* 2446 */,/*9287*/3318/* 2447 */,/*9288*/3318/* 2448 */, /*9289*/3318/* 2449 */,/*9290*/3318/* 244A */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*9312*/3319/* 2460 */, /*9313*/3320/* 2461 */,/*9314*/3321/* 2462 */,/*9315*/3322/* 2463 */,/*9316*/3323/* 2464 */,/*9317*/3324/* 2465 */, /*9318*/3325/* 2466 */,/*9319*/3326/* 2467 */,/*9320*/3327/* 2468 */,/*9321*/3328/* 2469 */,/*9322*/3329/* 246A */, /*9323*/3330/* 246B */,/*9324*/3331/* 246C */,/*9325*/3332/* 246D */,/*9326*/3333/* 246E */,/*9327*/3334/* 246F */, /*9328*/3335/* 2470 */,/*9329*/3336/* 2471 */,/*9330*/3337/* 2472 */,/*9331*/3338/* 2473 */,/*9332*/3339/* 2474 */, /*9333*/3340/* 2475 */,/*9334*/3341/* 2476 */,/*9335*/3342/* 2477 */,/*9336*/3343/* 2478 */,/*9337*/3344/* 2479 */, /*9338*/3345/* 247A */,/*9339*/3346/* 247B */,/*9340*/3347/* 247C */,/*9341*/3348/* 247D */,/*9342*/3349/* 247E */, /*9343*/3350/* 247F */,/*9344*/3351/* 2480 */,/*9345*/3352/* 2481 */,/*9346*/3353/* 2482 */,/*9347*/3354/* 2483 */, /*9348*/3355/* 2484 */,/*9349*/3356/* 2485 */,/*9350*/3357/* 2486 */,/*9351*/3358/* 2487 */,/*9352*/3359/* 2488 */, /*9353*/3360/* 2489 */,/*9354*/3361/* 248A */,/*9355*/3362/* 248B */,/*9356*/3363/* 248C */,/*9357*/3364/* 248D */, /*9358*/3365/* 248E */,/*9359*/3366/* 248F */,/*9360*/3367/* 2490 */,/*9361*/3368/* 2491 */,/*9362*/3369/* 2492 */, /*9363*/3370/* 2493 */,/*9364*/3371/* 2494 */,/*9365*/3372/* 2495 */,/*9366*/3373/* 2496 */,/*9367*/3374/* 2497 */, /*9368*/3375/* 2498 */,/*9369*/3376/* 2499 */,/*9370*/3377/* 249A */,/*9371*/3378/* 249B */,/*9372*/3379/* 249C */, /*9373*/3380/* 249D */,/*9374*/3381/* 249E */,/*9375*/3382/* 249F */,/*9376*/3383/* 24A0 */,/*9377*/3384/* 24A1 */, /*9378*/3385/* 24A2 */,/*9379*/3386/* 24A3 */,/*9380*/3387/* 24A4 */,/*9381*/3388/* 24A5 */,/*9382*/3389/* 24A6 */, /*9383*/3390/* 24A7 */,/*9384*/3391/* 24A8 */,/*9385*/3392/* 24A9 */,/*9386*/3393/* 24AA */,/*9387*/3394/* 24AB */, /*9388*/3395/* 24AC */,/*9389*/3396/* 24AD */,/*9390*/3397/* 24AE */,/*9391*/3398/* 24AF */,/*9392*/3399/* 24B0 */, /*9393*/3400/* 24B1 */,/*9394*/3401/* 24B2 */,/*9395*/3402/* 24B3 */,/*9396*/3403/* 24B4 */,/*9397*/3404/* 24B5 */, /*9398*/3405/* 24B6 */,/*9399*/3406/* 24B7 */,/*9400*/3407/* 24B8 */,/*9401*/3408/* 24B9 */,/*9402*/3409/* 24BA */, /*9403*/3410/* 24BB */,/*9404*/3411/* 24BC */,/*9405*/3412/* 24BD */,/*9406*/3413/* 24BE */,/*9407*/3414/* 24BF */, /*9408*/3415/* 24C0 */,/*9409*/3416/* 24C1 */,/*9410*/3417/* 24C2 */,/*9411*/3418/* 24C3 */,/*9412*/3419/* 24C4 */, /*9413*/3420/* 24C5 */,/*9414*/3421/* 24C6 */,/*9415*/3422/* 24C7 */,/*9416*/3423/* 24C8 */,/*9417*/3424/* 24C9 */, /*9418*/3425/* 24CA */,/*9419*/3426/* 24CB */,/*9420*/3427/* 24CC */,/*9421*/3428/* 24CD */,/*9422*/3429/* 24CE */, /*9423*/3430/* 24CF */,/*9424*/3431/* 24D0 */,/*9425*/3432/* 24D1 */,/*9426*/3433/* 24D2 */,/*9427*/3434/* 24D3 */, /*9428*/3435/* 24D4 */,/*9429*/3436/* 24D5 */,/*9430*/3437/* 24D6 */,/*9431*/3438/* 24D7 */,/*9432*/3439/* 24D8 */, /*9433*/3440/* 24D9 */,/*9434*/3441/* 24DA */,/*9435*/3442/* 24DB */,/*9436*/3443/* 24DC */,/*9437*/3444/* 24DD */, /*9438*/3445/* 24DE */,/*9439*/3446/* 24DF */,/*9440*/3447/* 24E0 */,/*9441*/3448/* 24E1 */,/*9442*/3449/* 24E2 */, /*9443*/3450/* 24E3 */,/*9444*/3451/* 24E4 */,/*9445*/3452/* 24E5 */,/*9446*/3453/* 24E6 */,/*9447*/3454/* 24E7 */, /*9448*/3455/* 24E8 */,/*9449*/3456/* 24E9 */,/*9450*/3457/* 24EA */,/*9451*/3458/* 24EB */,/*9452*/3459/* 24EC */, /*9453*/3460/* 24ED */,/*9454*/3461/* 24EE */,/*9455*/3462/* 24EF */,/*9456*/3463/* 24F0 */,/*9457*/3464/* 24F1 */, /*9458*/3465/* 24F2 */,/*9459*/3466/* 24F3 */,/*9460*/3467/* 24F4 */,/*9461*/3468/* 24F5 */,/*9462*/3469/* 24F6 */, /*9463*/3470/* 24F7 */,/*9464*/3471/* 24F8 */,/*9465*/3472/* 24F9 */,/*9466*/3473/* 24FA */,/*9467*/3474/* 24FB */, /*9468*/3475/* 24FC */,/*9469*/3476/* 24FD */,/*9470*/3477/* 24FE */,/*9471*/3478/* 24FF */,/*9472*/3479/* 2500 */, /*9473*/3479/* 2501 */,/*9474*/3479/* 2502 */,/*9475*/3479/* 2503 */,/*9476*/3479/* 2504 */,/*9477*/3479/* 2505 */, /*9478*/3479/* 2506 */,/*9479*/3479/* 2507 */,/*9480*/3479/* 2508 */,/*9481*/3479/* 2509 */,/*9482*/3479/* 250A */, /*9483*/3479/* 250B */,/*9484*/3479/* 250C */,/*9485*/3479/* 250D */,/*9486*/3479/* 250E */,/*9487*/3479/* 250F */, /*9488*/3479/* 2510 */,/*9489*/3479/* 2511 */,/*9490*/3479/* 2512 */,/*9491*/3479/* 2513 */,/*9492*/3479/* 2514 */, /*9493*/3479/* 2515 */,/*9494*/3479/* 2516 */,/*9495*/3479/* 2517 */,/*9496*/3479/* 2518 */,/*9497*/3479/* 2519 */, /*9498*/3479/* 251A */,/*9499*/3479/* 251B */,/*9500*/3479/* 251C */,/*9501*/3479/* 251D */,/*9502*/3479/* 251E */, /*9503*/3479/* 251F */,/*9504*/3479/* 2520 */,/*9505*/3479/* 2521 */,/*9506*/3479/* 2522 */,/*9507*/3479/* 2523 */, /*9508*/3479/* 2524 */,/*9509*/3479/* 2525 */,/*9510*/3479/* 2526 */,/*9511*/3479/* 2527 */,/*9512*/3479/* 2528 */, /*9513*/3479/* 2529 */,/*9514*/3479/* 252A */,/*9515*/3479/* 252B */,/*9516*/3479/* 252C */,/*9517*/3479/* 252D */, /*9518*/3479/* 252E */,/*9519*/3479/* 252F */,/*9520*/3479/* 2530 */,/*9521*/3479/* 2531 */,/*9522*/3479/* 2532 */, /*9523*/3479/* 2533 */,/*9524*/3479/* 2534 */,/*9525*/3479/* 2535 */,/*9526*/3479/* 2536 */,/*9527*/3479/* 2537 */, /*9528*/3479/* 2538 */,/*9529*/3479/* 2539 */,/*9530*/3479/* 253A */,/*9531*/3479/* 253B */,/*9532*/3479/* 253C */, /*9533*/3479/* 253D */,/*9534*/3479/* 253E */,/*9535*/3479/* 253F */,/*9536*/3479/* 2540 */,/*9537*/3479/* 2541 */, /*9538*/3479/* 2542 */,/*9539*/3479/* 2543 */,/*9540*/3479/* 2544 */,/*9541*/3479/* 2545 */,/*9542*/3479/* 2546 */, /*9543*/3479/* 2547 */,/*9544*/3479/* 2548 */,/*9545*/3479/* 2549 */,/*9546*/3479/* 254A */,/*9547*/3479/* 254B */, /*9548*/3479/* 254C */,/*9549*/3479/* 254D */,/*9550*/3479/* 254E */,/*9551*/3479/* 254F */,/*9552*/3479/* 2550 */, /*9553*/3479/* 2551 */,/*9554*/3479/* 2552 */,/*9555*/3479/* 2553 */,/*9556*/3479/* 2554 */,/*9557*/3479/* 2555 */, /*9558*/3479/* 2556 */,/*9559*/3479/* 2557 */,/*9560*/3479/* 2558 */,/*9561*/3479/* 2559 */,/*9562*/3479/* 255A */, /*9563*/3479/* 255B */,/*9564*/3479/* 255C */,/*9565*/3479/* 255D */,/*9566*/3479/* 255E */,/*9567*/3479/* 255F */, /*9568*/3479/* 2560 */,/*9569*/3479/* 2561 */,/*9570*/3479/* 2562 */,/*9571*/3479/* 2563 */,/*9572*/3479/* 2564 */, /*9573*/3479/* 2565 */,/*9574*/3479/* 2566 */,/*9575*/3479/* 2567 */,/*9576*/3479/* 2568 */,/*9577*/3479/* 2569 */, /*9578*/3479/* 256A */,/*9579*/3479/* 256B */,/*9580*/3479/* 256C */,/*9581*/3479/* 256D */,/*9582*/3479/* 256E */, /*9583*/3479/* 256F */,/*9584*/3479/* 2570 */,/*9585*/3479/* 2571 */,/*9586*/3479/* 2572 */,/*9587*/3479/* 2573 */, /*9588*/3479/* 2574 */,/*9589*/3479/* 2575 */,/*9590*/3479/* 2576 */,/*9591*/3479/* 2577 */,/*9592*/3479/* 2578 */, /*9593*/3479/* 2579 */,/*9594*/3479/* 257A */,/*9595*/3479/* 257B */,/*9596*/3479/* 257C */,/*9597*/3479/* 257D */, /*9598*/3479/* 257E */,/*9599*/3479/* 257F */,/*9600*/3480/* 2580 */,/*9601*/3480/* 2581 */,/*9602*/3480/* 2582 */, /*9603*/3480/* 2583 */,/*9604*/3480/* 2584 */,/*9605*/3480/* 2585 */,/*9606*/3480/* 2586 */,/*9607*/3480/* 2587 */, /*9608*/3480/* 2588 */,/*9609*/3480/* 2589 */,/*9610*/3480/* 258A */,/*9611*/3480/* 258B */,/*9612*/3480/* 258C */, /*9613*/3480/* 258D */,/*9614*/3480/* 258E */,/*9615*/3480/* 258F */,/*9616*/3480/* 2590 */,/*9617*/3480/* 2591 */, /*9618*/3480/* 2592 */,/*9619*/3480/* 2593 */,/*9620*/3480/* 2594 */,/*9621*/3480/* 2595 */,/*9622*/3481/* 2596 */, /*9623*/3481/* 2597 */,/*9624*/3481/* 2598 */,/*9625*/3481/* 2599 */,/*9626*/3481/* 259A */,/*9627*/3481/* 259B */, /*9628*/3481/* 259C */,/*9629*/3481/* 259D */,/*9630*/3481/* 259E */,/*9631*/3481/* 259F */,/*9632*/3482/* 25A0 */, /*9633*/3482/* 25A1 */,/*9634*/3483/* 25A2 */,/*9635*/3483/* 25A3 */,/*9636*/3483/* 25A4 */,/*9637*/3483/* 25A5 */, /*9638*/3483/* 25A6 */,/*9639*/3483/* 25A7 */,/*9640*/3483/* 25A8 */,/*9641*/3483/* 25A9 */,/*9642*/3483/* 25AA */, /*9643*/3483/* 25AB */,/*9644*/3483/* 25AC */,/*9645*/3483/* 25AD */,/*9646*/3482/* 25AE */,/*9647*/3482/* 25AF */, /*9648*/3482/* 25B0 */,/*9649*/3482/* 25B1 */,/*9650*/3482/* 25B2 */,/*9651*/3482/* 25B3 */,/*9652*/3482/* 25B4 */, /*9653*/3482/* 25B5 */,/*9654*/3482/* 25B6 */,/*9655*/3484/* 25B7 */,/*9656*/3483/* 25B8 */,/*9657*/3483/* 25B9 */, /*9658*/3483/* 25BA */,/*9659*/3483/* 25BB */,/*9660*/3482/* 25BC */,/*9661*/3482/* 25BD */,/*9662*/3482/* 25BE */, /*9663*/3482/* 25BF */,/*9664*/3482/* 25C0 */,/*9665*/3484/* 25C1 */,/*9666*/3483/* 25C2 */,/*9667*/3483/* 25C3 */, /*9668*/3483/* 25C4 */,/*9669*/3483/* 25C5 */,/*9670*/3482/* 25C6 */,/*9671*/3482/* 25C7 */,/*9672*/3483/* 25C8 */, /*9673*/3483/* 25C9 */,/*9674*/3482/* 25CA */,/*9675*/3482/* 25CB */,/*9676*/3483/* 25CC */,/*9677*/3483/* 25CD */, /*9678*/3483/* 25CE */,/*9679*/3482/* 25CF */,/*9680*/3482/* 25D0 */,/*9681*/3482/* 25D1 */,/*9682*/3482/* 25D2 */, /*9683*/3482/* 25D3 */,/*9684*/3483/* 25D4 */,/*9685*/3483/* 25D5 */,/*9686*/3483/* 25D6 */,/*9687*/3483/* 25D7 */, /*9688*/3483/* 25D8 */,/*9689*/3483/* 25D9 */,/*9690*/3483/* 25DA */,/*9691*/3483/* 25DB */,/*9692*/3483/* 25DC */, /*9693*/3483/* 25DD */,/*9694*/3483/* 25DE */,/*9695*/3483/* 25DF */,/*9696*/3483/* 25E0 */,/*9697*/3483/* 25E1 */, /*9698*/3482/* 25E2 */,/*9699*/3483/* 25E3 */,/*9700*/3482/* 25E4 */,/*9701*/3483/* 25E5 */,/*9702*/3483/* 25E6 */, /*9703*/3482/* 25E7 */,/*9704*/3482/* 25E8 */,/*9705*/3482/* 25E9 */,/*9706*/3482/* 25EA */,/*9707*/3482/* 25EB */, /*9708*/3482/* 25EC */,/*9709*/3483/* 25ED */,/*9710*/3483/* 25EE */,/*9711*/3483/* 25EF */,/*9712*/3485/* 25F0 */, /*9713*/3485/* 25F1 */,/*9714*/3485/* 25F2 */,/*9715*/3485/* 25F3 */,/*9716*/3485/* 25F4 */,/*9717*/3485/* 25F5 */, /*9718*/3485/* 25F6 */,/*9719*/3485/* 25F7 */,/*9720*/3486/* 25F8 */,/*9721*/3486/* 25F9 */,/*9722*/3486/* 25FA */, /*9723*/3486/* 25FB */,/*9724*/3486/* 25FC */,/*9725*/3486/* 25FD */,/*9726*/3486/* 25FE */,/*9727*/3486/* 25FF */, /*9728*/3487/* 2600 */,/*9729*/3487/* 2601 */,/*9730*/3487/* 2602 */,/*9731*/3487/* 2603 */,/*9732*/3487/* 2604 */, /*9733*/3488/* 2605 */,/*9734*/3488/* 2606 */,/*9735*/3487/* 2607 */,/*9736*/3487/* 2608 */,/*9737*/3487/* 2609 */, /*9738*/3487/* 260A */,/*9739*/3487/* 260B */,/*9740*/3487/* 260C */,/*9741*/3487/* 260D */,/*9742*/3487/* 260E */, /*9743*/3487/* 260F */,/*9744*/3487/* 2610 */,/*9745*/3487/* 2611 */,/*9746*/3487/* 2612 */,/*9747*/3487/* 2613 */, /*9748*/3489/* 2614 */,/*9749*/3489/* 2615 */,/*9750*/3490/* 2616 */,/*9751*/3490/* 2617 */,/*9752*/3491/* 2618 */, /*9753*/3492/* 2619 */,/*9754*/3487/* 261A */,/*9755*/3487/* 261B */,/*9756*/3487/* 261C */,/*9757*/3487/* 261D */, /*9758*/3487/* 261E */,/*9759*/3487/* 261F */,/*9760*/3487/* 2620 */,/*9761*/3487/* 2621 */,/*9762*/3487/* 2622 */, /*9763*/3487/* 2623 */,/*9764*/3487/* 2624 */,/*9765*/3487/* 2625 */,/*9766*/3487/* 2626 */,/*9767*/3487/* 2627 */, /*9768*/3487/* 2628 */,/*9769*/3487/* 2629 */,/*9770*/3487/* 262A */,/*9771*/3487/* 262B */,/*9772*/3487/* 262C */, /*9773*/3487/* 262D */,/*9774*/3487/* 262E */,/*9775*/3487/* 262F */,/*9776*/3487/* 2630 */,/*9777*/3487/* 2631 */, /*9778*/3487/* 2632 */,/*9779*/3487/* 2633 */,/*9780*/3487/* 2634 */,/*9781*/3487/* 2635 */,/*9782*/3487/* 2636 */, /*9783*/3487/* 2637 */,/*9784*/3487/* 2638 */,/*9785*/3487/* 2639 */,/*9786*/3487/* 263A */,/*9787*/3487/* 263B */, /*9788*/3487/* 263C */,/*9789*/3487/* 263D */,/*9790*/3487/* 263E */,/*9791*/3487/* 263F */,/*9792*/3488/* 2640 */, /*9793*/3487/* 2641 */,/*9794*/3488/* 2642 */,/*9795*/3487/* 2643 */,/*9796*/3487/* 2644 */,/*9797*/3487/* 2645 */, /*9798*/3487/* 2646 */,/*9799*/3487/* 2647 */,/*9800*/3487/* 2648 */,/*9801*/3487/* 2649 */,/*9802*/3487/* 264A */, /*9803*/3487/* 264B */,/*9804*/3487/* 264C */,/*9805*/3487/* 264D */,/*9806*/3487/* 264E */,/*9807*/3487/* 264F */, /*9808*/3487/* 2650 */,/*9809*/3487/* 2651 */,/*9810*/3487/* 2652 */,/*9811*/3487/* 2653 */,/*9812*/3487/* 2654 */, /*9813*/3487/* 2655 */,/*9814*/3487/* 2656 */,/*9815*/3487/* 2657 */,/*9816*/3487/* 2658 */,/*9817*/3487/* 2659 */, /*9818*/3487/* 265A */,/*9819*/3487/* 265B */,/*9820*/3487/* 265C */,/*9821*/3487/* 265D */,/*9822*/3487/* 265E */, /*9823*/3487/* 265F */,/*9824*/3488/* 2660 */,/*9825*/3488/* 2661 */,/*9826*/3488/* 2662 */,/*9827*/3488/* 2663 */, /*9828*/3487/* 2664 */,/*9829*/3487/* 2665 */,/*9830*/3487/* 2666 */,/*9831*/3487/* 2667 */,/*9832*/3487/* 2668 */, /*9833*/3487/* 2669 */,/*9834*/3487/* 266A */,/*9835*/3487/* 266B */,/*9836*/3487/* 266C */,/*9837*/3488/* 266D */, /*9838*/3488/* 266E */,/*9839*/3493/* 266F */,/*9840*/3492/* 2670 */,/*9841*/3492/* 2671 */,/*9842*/3490/* 2672 */, /*9843*/3490/* 2673 */,/*9844*/3490/* 2674 */,/*9845*/3490/* 2675 */,/*9846*/3490/* 2676 */,/*9847*/3490/* 2677 */, /*9848*/3490/* 2678 */,/*9849*/3490/* 2679 */,/*9850*/3490/* 267A */,/*9851*/3490/* 267B */,/*9852*/3490/* 267C */, /*9853*/3490/* 267D */,/*9854*/3491/* 267E */,/*9855*/3491/* 267F */,/*9856*/3490/* 2680 */,/*9857*/3490/* 2681 */, /*9858*/3490/* 2682 */,/*9859*/3490/* 2683 */,/*9860*/3490/* 2684 */,/*9861*/3490/* 2685 */,/*9862*/3490/* 2686 */, /*9863*/3490/* 2687 */,/*9864*/3490/* 2688 */,/*9865*/3490/* 2689 */,/*9866*/3489/* 268A */,/*9867*/3489/* 268B */, /*9868*/3489/* 268C */,/*9869*/3489/* 268D */,/*9870*/3489/* 268E */,/*9871*/3489/* 268F */,/*9872*/3489/* 2690 */, /*9873*/3489/* 2691 */,/*9874*/3491/* 2692 */,/*9875*/3491/* 2693 */,/*9876*/3491/* 2694 */,/*9877*/3491/* 2695 */, /*9878*/3491/* 2696 */,/*9879*/3491/* 2697 */,/*9880*/3491/* 2698 */,/*9881*/3491/* 2699 */,/*9882*/3491/* 269A */, /*9883*/3491/* 269B */,/*9884*/3491/* 269C */,/*9885*/3494/* 269D */,/*9886*/3495/* 269E */,/*9887*/3495/* 269F */, /*9888*/3489/* 26A0 */,/*9889*/3489/* 26A1 */,/*9890*/3491/* 26A2 */,/*9891*/3491/* 26A3 */,/*9892*/3491/* 26A4 */, /*9893*/3491/* 26A5 */,/*9894*/3491/* 26A6 */,/*9895*/3491/* 26A7 */,/*9896*/3491/* 26A8 */,/*9897*/3491/* 26A9 */, /*9898*/3491/* 26AA */,/*9899*/3491/* 26AB */,/*9900*/3496/* 26AC */,/*9901*/3491/* 26AD */,/*9902*/3491/* 26AE */, /*9903*/3491/* 26AF */,/*9904*/3491/* 26B0 */,/*9905*/3491/* 26B1 */,/*9906*/3497/* 26B2 */,/*9907*/3494/* 26B3 */, /*9908*/3494/* 26B4 */,/*9909*/3494/* 26B5 */,/*9910*/3494/* 26B6 */,/*9911*/3494/* 26B7 */,/*9912*/3494/* 26B8 */, /*9913*/3494/* 26B9 */,/*9914*/3494/* 26BA */,/*9915*/3494/* 26BB */,/*9916*/3494/* 26BC */,/*9917*/3495/* 26BD */, /*9918*/3495/* 26BE */,/*9919*/3495/* 26BF */,/*9920*/3494/* 26C0 */,/*9921*/3494/* 26C1 */,/*9922*/3494/* 26C2 */, /*9923*/3494/* 26C3 */,/*9924*/3495/* 26C4 */,/*9925*/3495/* 26C5 */,/*9926*/3495/* 26C6 */,/*9927*/3495/* 26C7 */, /*9928*/3495/* 26C8 */,/*9929*/3495/* 26C9 */,/*9930*/3495/* 26CA */,/*9931*/3495/* 26CB */,/*9932*/3495/* 26CC */, /*9933*/3495/* 26CD */,/*9934*/3498/* 26CE */,/*9935*/3495/* 26CF */,/*9936*/3495/* 26D0 */,/*9937*/3495/* 26D1 */, /*9938*/3495/* 26D2 */,/*9939*/3495/* 26D3 */,/*9940*/3495/* 26D4 */,/*9941*/3495/* 26D5 */,/*9942*/3495/* 26D6 */, /*9943*/3495/* 26D7 */,/*9944*/3495/* 26D8 */,/*9945*/3495/* 26D9 */,/*9946*/3495/* 26DA */,/*9947*/3495/* 26DB */, /*9948*/3495/* 26DC */,/*9949*/3495/* 26DD */,/*9950*/3495/* 26DE */,/*9951*/3495/* 26DF */,/*9952*/3495/* 26E0 */, /*9953*/3495/* 26E1 */,/*9954*/3498/* 26E2 */,/*9955*/3495/* 26E3 */,/*9956*/3498/* 26E4 */,/*9957*/3498/* 26E5 */, /*9958*/3498/* 26E6 */,/*9959*/3498/* 26E7 */,/*9960*/3495/* 26E8 */,/*9961*/3495/* 26E9 */,/*9962*/3495/* 26EA */, /*9963*/3495/* 26EB */,/*9964*/3495/* 26EC */,/*9965*/3495/* 26ED */,/*9966*/3495/* 26EE */,/*9967*/3495/* 26EF */, /*9968*/3495/* 26F0 */,/*9969*/3495/* 26F1 */,/*9970*/3495/* 26F2 */,/*9971*/3495/* 26F3 */,/*9972*/3495/* 26F4 */, /*9973*/3495/* 26F5 */,/*9974*/3495/* 26F6 */,/*9975*/3495/* 26F7 */,/*9976*/3495/* 26F8 */,/*9977*/3495/* 26F9 */, /*9978*/3495/* 26FA */,/*9979*/3495/* 26FB */,/*9980*/3495/* 26FC */,/*9981*/3495/* 26FD */,/*9982*/3495/* 26FE */, /*9983*/3495/* 26FF */,/*9984*/3499/* 2700 */,/*9985*/3500/* 2701 */,/*9986*/3500/* 2702 */,/*9987*/3500/* 2703 */, /*9988*/3500/* 2704 */,/*9989*/3501/* 2705 */,/*9990*/3500/* 2706 */,/*9991*/3500/* 2707 */,/*9992*/3500/* 2708 */, /*9993*/3500/* 2709 */,/*9994*/3501/* 270A */,/*9995*/3501/* 270B */,/*9996*/3500/* 270C */,/*9997*/3500/* 270D */, /*9998*/3500/* 270E */,/*9999*/3500/* 270F */,/*10000*/3500/* 2710 */,/*10001*/3500/* 2711 */,/*10002*/3500/* 2712 */, /*10003*/3500/* 2713 */,/*10004*/3500/* 2714 */,/*10005*/3500/* 2715 */,/*10006*/3500/* 2716 */,/*10007*/3500/* 2717 */, /*10008*/3500/* 2718 */,/*10009*/3500/* 2719 */,/*10010*/3500/* 271A */,/*10011*/3500/* 271B */,/*10012*/3500/* 271C */, /*10013*/3500/* 271D */,/*10014*/3500/* 271E */,/*10015*/3500/* 271F */,/*10016*/3500/* 2720 */,/*10017*/3500/* 2721 */, /*10018*/3500/* 2722 */,/*10019*/3500/* 2723 */,/*10020*/3500/* 2724 */,/*10021*/3500/* 2725 */,/*10022*/3500/* 2726 */, /*10023*/3500/* 2727 */,/*10024*/3501/* 2728 */,/*10025*/3500/* 2729 */,/*10026*/3500/* 272A */,/*10027*/3500/* 272B */, /*10028*/3500/* 272C */,/*10029*/3500/* 272D */,/*10030*/3500/* 272E */,/*10031*/3500/* 272F */,/*10032*/3500/* 2730 */, /*10033*/3500/* 2731 */,/*10034*/3500/* 2732 */,/*10035*/3500/* 2733 */,/*10036*/3500/* 2734 */,/*10037*/3500/* 2735 */, /*10038*/3500/* 2736 */,/*10039*/3500/* 2737 */,/*10040*/3500/* 2738 */,/*10041*/3500/* 2739 */,/*10042*/3500/* 273A */, /*10043*/3500/* 273B */,/*10044*/3500/* 273C */,/*10045*/3500/* 273D */,/*10046*/3500/* 273E */,/*10047*/3500/* 273F */, /*10048*/3500/* 2740 */,/*10049*/3500/* 2741 */,/*10050*/3500/* 2742 */,/*10051*/3500/* 2743 */,/*10052*/3500/* 2744 */, /*10053*/3500/* 2745 */,/*10054*/3500/* 2746 */,/*10055*/3500/* 2747 */,/*10056*/3500/* 2748 */,/*10057*/3500/* 2749 */, /*10058*/3500/* 274A */,/*10059*/3500/* 274B */,/*10060*/3501/* 274C */,/*10061*/3500/* 274D */,/*10062*/3501/* 274E */, /*10063*/3500/* 274F */,/*10064*/3500/* 2750 */,/*10065*/3500/* 2751 */,/*10066*/3500/* 2752 */,/*10067*/3501/* 2753 */, /*10068*/3501/* 2754 */,/*10069*/3501/* 2755 */,/*10070*/3500/* 2756 */,/*10071*/3502/* 2757 */,/*10072*/3500/* 2758 */, /*10073*/3500/* 2759 */,/*10074*/3500/* 275A */,/*10075*/3503/* 275B */,/*10076*/3503/* 275C */,/*10077*/3503/* 275D */, /*10078*/3503/* 275E */,/*10079*/3504/* 275F */,/*10080*/3504/* 2760 */,/*10081*/3500/* 2761 */,/*10082*/3500/* 2762 */, /*10083*/3500/* 2763 */,/*10084*/3500/* 2764 */,/*10085*/3500/* 2765 */,/*10086*/3500/* 2766 */,/*10087*/3500/* 2767 */, /*10088*/3505/* 2768 */,/*10089*/3506/* 2769 */,/*10090*/3507/* 276A */,/*10091*/3508/* 276B */,/*10092*/3509/* 276C */, /*10093*/3510/* 276D */,/*10094*/3511/* 276E */,/*10095*/3512/* 276F */,/*10096*/3513/* 2770 */,/*10097*/3514/* 2771 */, /*10098*/3515/* 2772 */,/*10099*/3516/* 2773 */,/*10100*/3517/* 2774 */,/*10101*/3518/* 2775 */,/*10102*/3519/* 2776 */, /*10103*/3520/* 2777 */,/*10104*/3521/* 2778 */,/*10105*/3522/* 2779 */,/*10106*/3523/* 277A */,/*10107*/3524/* 277B */, /*10108*/3525/* 277C */,/*10109*/3526/* 277D */,/*10110*/3527/* 277E */,/*10111*/3528/* 277F */,/*10112*/3519/* 2780 */, /*10113*/3520/* 2781 */,/*10114*/3521/* 2782 */,/*10115*/3522/* 2783 */,/*10116*/3523/* 2784 */,/*10117*/3524/* 2785 */, /*10118*/3525/* 2786 */,/*10119*/3526/* 2787 */,/*10120*/3527/* 2788 */,/*10121*/3528/* 2789 */,/*10122*/3519/* 278A */, /*10123*/3520/* 278B */,/*10124*/3521/* 278C */,/*10125*/3522/* 278D */,/*10126*/3523/* 278E */,/*10127*/3524/* 278F */, /*10128*/3525/* 2790 */,/*10129*/3526/* 2791 */,/*10130*/3527/* 2792 */,/*10131*/3528/* 2793 */,/*10132*/3500/* 2794 */, /*10133*/3501/* 2795 */,/*10134*/3501/* 2796 */,/*10135*/3501/* 2797 */,/*10136*/3500/* 2798 */,/*10137*/3500/* 2799 */, /*10138*/3500/* 279A */,/*10139*/3500/* 279B */,/*10140*/3500/* 279C */,/*10141*/3500/* 279D */,/*10142*/3500/* 279E */, /*10143*/3500/* 279F */,/*10144*/3500/* 27A0 */,/*10145*/3500/* 27A1 */,/*10146*/3500/* 27A2 */,/*10147*/3500/* 27A3 */, /*10148*/3500/* 27A4 */,/*10149*/3500/* 27A5 */,/*10150*/3500/* 27A6 */,/*10151*/3500/* 27A7 */,/*10152*/3500/* 27A8 */, /*10153*/3500/* 27A9 */,/*10154*/3500/* 27AA */,/*10155*/3500/* 27AB */,/*10156*/3500/* 27AC */,/*10157*/3500/* 27AD */, /*10158*/3500/* 27AE */,/*10159*/3500/* 27AF */,/*10160*/3501/* 27B0 */,/*10161*/3500/* 27B1 */,/*10162*/3500/* 27B2 */, /*10163*/3500/* 27B3 */,/*10164*/3500/* 27B4 */,/*10165*/3500/* 27B5 */,/*10166*/3500/* 27B6 */,/*10167*/3500/* 27B7 */, /*10168*/3500/* 27B8 */,/*10169*/3500/* 27B9 */,/*10170*/3500/* 27BA */,/*10171*/3500/* 27BB */,/*10172*/3500/* 27BC */, /*10173*/3500/* 27BD */,/*10174*/3500/* 27BE */,/*10175*/3501/* 27BF */,/*10176*/3529/* 27C0 */,/*10177*/3530/* 27C1 */, /*10178*/3530/* 27C2 */,/*10179*/3531/* 27C3 */,/*10180*/3532/* 27C4 */,/*10181*/3533/* 27C5 */,/*10182*/3534/* 27C6 */, /*10183*/3535/* 27C7 */,/*10184*/3536/* 27C8 */,/*10185*/3537/* 27C9 */,/*10186*/3535/* 27CA */,/*10187*/3538/* 27CB */, /*10188*/3539/* 27CC */,/*10189*/3540/* 27CD */,/*10190*/3541/* 27CE */,/*10191*/3541/* 27CF */,/*10192*/3542/* 27D0 */, /*10193*/3542/* 27D1 */,/*10194*/3542/* 27D2 */,/*10195*/3543/* 27D3 */,/*10196*/3543/* 27D4 */,/*10197*/3544/* 27D5 */, /*10198*/3545/* 27D6 */,/*10199*/3542/* 27D7 */,/*10200*/3542/* 27D8 */,/*10201*/3542/* 27D9 */,/*10202*/3542/* 27DA */, /*10203*/3542/* 27DB */,/*10204*/3543/* 27DC */,/*10205*/3546/* 27DD */,/*10206*/3547/* 27DE */,/*10207*/3542/* 27DF */, /*10208*/3542/* 27E0 */,/*10209*/3542/* 27E1 */,/*10210*/3548/* 27E2 */,/*10211*/3549/* 27E3 */,/*10212*/3550/* 27E4 */, /*10213*/3551/* 27E5 */,/*10214*/3552/* 27E6 */,/*10215*/3553/* 27E7 */,/*10216*/3554/* 27E8 */,/*10217*/3555/* 27E9 */, /*10218*/3556/* 27EA */,/*10219*/3557/* 27EB */,/*10220*/3558/* 27EC */,/*10221*/3559/* 27ED */,/*10222*/3560/* 27EE */, /*10223*/3561/* 27EF */,/*10224*/3562/* 27F0 */,/*10225*/3562/* 27F1 */,/*10226*/3562/* 27F2 */,/*10227*/3562/* 27F3 */, /*10228*/3562/* 27F4 */,/*10229*/3562/* 27F5 */,/*10230*/3562/* 27F6 */,/*10231*/3562/* 27F7 */,/*10232*/3562/* 27F8 */, /*10233*/3562/* 27F9 */,/*10234*/3562/* 27FA */,/*10235*/3562/* 27FB */,/*10236*/3562/* 27FC */,/*10237*/3562/* 27FD */, /*10238*/3562/* 27FE */,/*10239*/3562/* 27FF */,/*10240*/3563/* 2800 */,/*10241*/3563/* 2801 */,/*10242*/3563/* 2802 */, /*10243*/3563/* 2803 */,/*10244*/3563/* 2804 */,/*10245*/3563/* 2805 */,/*10246*/3563/* 2806 */,/*10247*/3563/* 2807 */, /*10248*/3563/* 2808 */,/*10249*/3563/* 2809 */,/*10250*/3563/* 280A */,/*10251*/3563/* 280B */,/*10252*/3563/* 280C */, /*10253*/3563/* 280D */,/*10254*/3563/* 280E */,/*10255*/3563/* 280F */,/*10256*/3563/* 2810 */,/*10257*/3563/* 2811 */, /*10258*/3563/* 2812 */,/*10259*/3563/* 2813 */,/*10260*/3563/* 2814 */,/*10261*/3563/* 2815 */,/*10262*/3563/* 2816 */, /*10263*/3563/* 2817 */,/*10264*/3563/* 2818 */,/*10265*/3563/* 2819 */,/*10266*/3563/* 281A */,/*10267*/3563/* 281B */, /*10268*/3563/* 281C */,/*10269*/3563/* 281D */,/*10270*/3563/* 281E */,/*10271*/3563/* 281F */,/*10272*/3563/* 2820 */, /*10273*/3563/* 2821 */,/*10274*/3563/* 2822 */,/*10275*/3563/* 2823 */,/*10276*/3563/* 2824 */,/*10277*/3563/* 2825 */, /*10278*/3563/* 2826 */,/*10279*/3563/* 2827 */,/*10280*/3563/* 2828 */,/*10281*/3563/* 2829 */,/*10282*/3563/* 282A */, /*10283*/3563/* 282B */,/*10284*/3563/* 282C */,/*10285*/3563/* 282D */,/*10286*/3563/* 282E */,/*10287*/3563/* 282F */, /*10288*/3563/* 2830 */,/*10289*/3563/* 2831 */,/*10290*/3563/* 2832 */,/*10291*/3563/* 2833 */,/*10292*/3563/* 2834 */, /*10293*/3563/* 2835 */,/*10294*/3563/* 2836 */,/*10295*/3563/* 2837 */,/*10296*/3563/* 2838 */,/*10297*/3563/* 2839 */, /*10298*/3563/* 283A */,/*10299*/3563/* 283B */,/*10300*/3563/* 283C */,/*10301*/3563/* 283D */,/*10302*/3563/* 283E */, /*10303*/3563/* 283F */,/*10304*/3563/* 2840 */,/*10305*/3563/* 2841 */,/*10306*/3563/* 2842 */,/*10307*/3563/* 2843 */, /*10308*/3563/* 2844 */,/*10309*/3563/* 2845 */,/*10310*/3563/* 2846 */,/*10311*/3563/* 2847 */,/*10312*/3563/* 2848 */, /*10313*/3563/* 2849 */,/*10314*/3563/* 284A */,/*10315*/3563/* 284B */,/*10316*/3563/* 284C */,/*10317*/3563/* 284D */, /*10318*/3563/* 284E */,/*10319*/3563/* 284F */,/*10320*/3563/* 2850 */,/*10321*/3563/* 2851 */,/*10322*/3563/* 2852 */, /*10323*/3563/* 2853 */,/*10324*/3563/* 2854 */,/*10325*/3563/* 2855 */,/*10326*/3563/* 2856 */,/*10327*/3563/* 2857 */, /*10328*/3563/* 2858 */,/*10329*/3563/* 2859 */,/*10330*/3563/* 285A */,/*10331*/3563/* 285B */,/*10332*/3563/* 285C */, /*10333*/3563/* 285D */,/*10334*/3563/* 285E */,/*10335*/3563/* 285F */,/*10336*/3563/* 2860 */,/*10337*/3563/* 2861 */, /*10338*/3563/* 2862 */,/*10339*/3563/* 2863 */,/*10340*/3563/* 2864 */,/*10341*/3563/* 2865 */,/*10342*/3563/* 2866 */, /*10343*/3563/* 2867 */,/*10344*/3563/* 2868 */,/*10345*/3563/* 2869 */,/*10346*/3563/* 286A */,/*10347*/3563/* 286B */, /*10348*/3563/* 286C */,/*10349*/3563/* 286D */,/*10350*/3563/* 286E */,/*10351*/3563/* 286F */,/*10352*/3563/* 2870 */, /*10353*/3563/* 2871 */,/*10354*/3563/* 2872 */,/*10355*/3563/* 2873 */,/*10356*/3563/* 2874 */,/*10357*/3563/* 2875 */, /*10358*/3563/* 2876 */,/*10359*/3563/* 2877 */,/*10360*/3563/* 2878 */,/*10361*/3563/* 2879 */,/*10362*/3563/* 287A */, /*10363*/3563/* 287B */,/*10364*/3563/* 287C */,/*10365*/3563/* 287D */,/*10366*/3563/* 287E */,/*10367*/3563/* 287F */, /*10368*/3563/* 2880 */,/*10369*/3563/* 2881 */,/*10370*/3563/* 2882 */,/*10371*/3563/* 2883 */,/*10372*/3563/* 2884 */, /*10373*/3563/* 2885 */,/*10374*/3563/* 2886 */,/*10375*/3563/* 2887 */,/*10376*/3563/* 2888 */,/*10377*/3563/* 2889 */, /*10378*/3563/* 288A */,/*10379*/3563/* 288B */,/*10380*/3563/* 288C */,/*10381*/3563/* 288D */,/*10382*/3563/* 288E */, /*10383*/3563/* 288F */,/*10384*/3563/* 2890 */,/*10385*/3563/* 2891 */,/*10386*/3563/* 2892 */,/*10387*/3563/* 2893 */, /*10388*/3563/* 2894 */,/*10389*/3563/* 2895 */,/*10390*/3563/* 2896 */,/*10391*/3563/* 2897 */,/*10392*/3563/* 2898 */, /*10393*/3563/* 2899 */,/*10394*/3563/* 289A */,/*10395*/3563/* 289B */,/*10396*/3563/* 289C */,/*10397*/3563/* 289D */, /*10398*/3563/* 289E */,/*10399*/3563/* 289F */,/*10400*/3563/* 28A0 */,/*10401*/3563/* 28A1 */,/*10402*/3563/* 28A2 */, /*10403*/3563/* 28A3 */,/*10404*/3563/* 28A4 */,/*10405*/3563/* 28A5 */,/*10406*/3563/* 28A6 */,/*10407*/3563/* 28A7 */, /*10408*/3563/* 28A8 */,/*10409*/3563/* 28A9 */,/*10410*/3563/* 28AA */,/*10411*/3563/* 28AB */,/*10412*/3563/* 28AC */, /*10413*/3563/* 28AD */,/*10414*/3563/* 28AE */,/*10415*/3563/* 28AF */,/*10416*/3563/* 28B0 */,/*10417*/3563/* 28B1 */, /*10418*/3563/* 28B2 */,/*10419*/3563/* 28B3 */,/*10420*/3563/* 28B4 */,/*10421*/3563/* 28B5 */,/*10422*/3563/* 28B6 */, /*10423*/3563/* 28B7 */,/*10424*/3563/* 28B8 */,/*10425*/3563/* 28B9 */,/*10426*/3563/* 28BA */,/*10427*/3563/* 28BB */, /*10428*/3563/* 28BC */,/*10429*/3563/* 28BD */,/*10430*/3563/* 28BE */,/*10431*/3563/* 28BF */,/*10432*/3563/* 28C0 */, /*10433*/3563/* 28C1 */,/*10434*/3563/* 28C2 */,/*10435*/3563/* 28C3 */,/*10436*/3563/* 28C4 */,/*10437*/3563/* 28C5 */, /*10438*/3563/* 28C6 */,/*10439*/3563/* 28C7 */,/*10440*/3563/* 28C8 */,/*10441*/3563/* 28C9 */,/*10442*/3563/* 28CA */, /*10443*/3563/* 28CB */,/*10444*/3563/* 28CC */,/*10445*/3563/* 28CD */,/*10446*/3563/* 28CE */,/*10447*/3563/* 28CF */, /*10448*/3563/* 28D0 */,/*10449*/3563/* 28D1 */,/*10450*/3563/* 28D2 */,/*10451*/3563/* 28D3 */,/*10452*/3563/* 28D4 */, /*10453*/3563/* 28D5 */,/*10454*/3563/* 28D6 */,/*10455*/3563/* 28D7 */,/*10456*/3563/* 28D8 */,/*10457*/3563/* 28D9 */, /*10458*/3563/* 28DA */,/*10459*/3563/* 28DB */,/*10460*/3563/* 28DC */,/*10461*/3563/* 28DD */,/*10462*/3563/* 28DE */, /*10463*/3563/* 28DF */,/*10464*/3563/* 28E0 */,/*10465*/3563/* 28E1 */,/*10466*/3563/* 28E2 */,/*10467*/3563/* 28E3 */, /*10468*/3563/* 28E4 */,/*10469*/3563/* 28E5 */,/*10470*/3563/* 28E6 */,/*10471*/3563/* 28E7 */,/*10472*/3563/* 28E8 */, /*10473*/3563/* 28E9 */,/*10474*/3563/* 28EA */,/*10475*/3563/* 28EB */,/*10476*/3563/* 28EC */,/*10477*/3563/* 28ED */, /*10478*/3563/* 28EE */,/*10479*/3563/* 28EF */,/*10480*/3563/* 28F0 */,/*10481*/3563/* 28F1 */,/*10482*/3563/* 28F2 */, /*10483*/3563/* 28F3 */,/*10484*/3563/* 28F4 */,/*10485*/3563/* 28F5 */,/*10486*/3563/* 28F6 */,/*10487*/3563/* 28F7 */, /*10488*/3563/* 28F8 */,/*10489*/3563/* 28F9 */,/*10490*/3563/* 28FA */,/*10491*/3563/* 28FB */,/*10492*/3563/* 28FC */, /*10493*/3563/* 28FD */,/*10494*/3563/* 28FE */,/*10495*/3563/* 28FF */,/*10496*/3564/* 2900 */,/*10497*/3564/* 2901 */, /*10498*/3564/* 2902 */,/*10499*/3564/* 2903 */,/*10500*/3564/* 2904 */,/*10501*/3564/* 2905 */,/*10502*/3564/* 2906 */, /*10503*/3564/* 2907 */,/*10504*/3564/* 2908 */,/*10505*/3564/* 2909 */,/*10506*/3564/* 290A */,/*10507*/3564/* 290B */, /*10508*/3564/* 290C */,/*10509*/3564/* 290D */,/*10510*/3564/* 290E */,/*10511*/3564/* 290F */,/*10512*/3564/* 2910 */, /*10513*/3564/* 2911 */,/*10514*/3564/* 2912 */,/*10515*/3564/* 2913 */,/*10516*/3564/* 2914 */,/*10517*/3564/* 2915 */, /*10518*/3564/* 2916 */,/*10519*/3564/* 2917 */,/*10520*/3564/* 2918 */,/*10521*/3564/* 2919 */,/*10522*/3564/* 291A */, /*10523*/3564/* 291B */,/*10524*/3564/* 291C */,/*10525*/3564/* 291D */,/*10526*/3564/* 291E */,/*10527*/3564/* 291F */, /*10528*/3564/* 2920 */,/*10529*/3564/* 2921 */,/*10530*/3564/* 2922 */,/*10531*/3564/* 2923 */,/*10532*/3564/* 2924 */, /*10533*/3564/* 2925 */,/*10534*/3564/* 2926 */,/*10535*/3564/* 2927 */,/*10536*/3564/* 2928 */,/*10537*/3564/* 2929 */, /*10538*/3564/* 292A */,/*10539*/3564/* 292B */,/*10540*/3564/* 292C */,/*10541*/3564/* 292D */,/*10542*/3564/* 292E */, /*10543*/3564/* 292F */,/*10544*/3564/* 2930 */,/*10545*/3564/* 2931 */,/*10546*/3564/* 2932 */,/*10547*/3564/* 2933 */, /*10548*/3564/* 2934 */,/*10549*/3564/* 2935 */,/*10550*/3564/* 2936 */,/*10551*/3564/* 2937 */,/*10552*/3564/* 2938 */, /*10553*/3564/* 2939 */,/*10554*/3564/* 293A */,/*10555*/3564/* 293B */,/*10556*/3564/* 293C */,/*10557*/3564/* 293D */, /*10558*/3564/* 293E */,/*10559*/3564/* 293F */,/*10560*/3564/* 2940 */,/*10561*/3564/* 2941 */,/*10562*/3564/* 2942 */, /*10563*/3564/* 2943 */,/*10564*/3564/* 2944 */,/*10565*/3564/* 2945 */,/*10566*/3564/* 2946 */,/*10567*/3564/* 2947 */, /*10568*/3564/* 2948 */,/*10569*/3564/* 2949 */,/*10570*/3564/* 294A */,/*10571*/3564/* 294B */,/*10572*/3564/* 294C */, /*10573*/3564/* 294D */,/*10574*/3564/* 294E */,/*10575*/3564/* 294F */,/*10576*/3564/* 2950 */,/*10577*/3564/* 2951 */, /*10578*/3564/* 2952 */,/*10579*/3564/* 2953 */,/*10580*/3564/* 2954 */,/*10581*/3564/* 2955 */,/*10582*/3564/* 2956 */, /*10583*/3564/* 2957 */,/*10584*/3564/* 2958 */,/*10585*/3564/* 2959 */,/*10586*/3564/* 295A */,/*10587*/3564/* 295B */, /*10588*/3564/* 295C */,/*10589*/3564/* 295D */,/*10590*/3564/* 295E */,/*10591*/3564/* 295F */,/*10592*/3564/* 2960 */, /*10593*/3564/* 2961 */,/*10594*/3564/* 2962 */,/*10595*/3564/* 2963 */,/*10596*/3564/* 2964 */,/*10597*/3564/* 2965 */, /*10598*/3564/* 2966 */,/*10599*/3564/* 2967 */,/*10600*/3564/* 2968 */,/*10601*/3564/* 2969 */,/*10602*/3564/* 296A */, /*10603*/3564/* 296B */,/*10604*/3564/* 296C */,/*10605*/3564/* 296D */,/*10606*/3564/* 296E */,/*10607*/3564/* 296F */, /*10608*/3564/* 2970 */,/*10609*/3564/* 2971 */,/*10610*/3564/* 2972 */,/*10611*/3564/* 2973 */,/*10612*/3564/* 2974 */, /*10613*/3564/* 2975 */,/*10614*/3564/* 2976 */,/*10615*/3564/* 2977 */,/*10616*/3564/* 2978 */,/*10617*/3564/* 2979 */, /*10618*/3564/* 297A */,/*10619*/3564/* 297B */,/*10620*/3564/* 297C */,/*10621*/3564/* 297D */,/*10622*/3564/* 297E */, /*10623*/3564/* 297F */,/*10624*/3565/* 2980 */,/*10625*/3565/* 2981 */,/*10626*/3565/* 2982 */,/*10627*/3566/* 2983 */, /*10628*/3567/* 2984 */,/*10629*/3568/* 2985 */,/*10630*/3569/* 2986 */,/*10631*/3570/* 2987 */,/*10632*/3571/* 2988 */, /*10633*/3572/* 2989 */,/*10634*/3573/* 298A */,/*10635*/3574/* 298B */,/*10636*/3575/* 298C */,/*10637*/3576/* 298D */, /*10638*/3577/* 298E */,/*10639*/3578/* 298F */,/*10640*/3579/* 2990 */,/*10641*/3580/* 2991 */,/*10642*/3581/* 2992 */, /*10643*/3582/* 2993 */,/*10644*/3583/* 2994 */,/*10645*/3584/* 2995 */,/*10646*/3585/* 2996 */,/*10647*/3586/* 2997 */, /*10648*/3587/* 2998 */,/*10649*/3565/* 2999 */,/*10650*/3565/* 299A */,/*10651*/3588/* 299B */,/*10652*/3588/* 299C */, /*10653*/3588/* 299D */,/*10654*/3588/* 299E */,/*10655*/3588/* 299F */,/*10656*/3588/* 29A0 */,/*10657*/3588/* 29A1 */, /*10658*/3588/* 29A2 */,/*10659*/3588/* 29A3 */,/*10660*/3588/* 29A4 */,/*10661*/3588/* 29A5 */,/*10662*/3588/* 29A6 */, /*10663*/3588/* 29A7 */,/*10664*/3588/* 29A8 */,/*10665*/3588/* 29A9 */,/*10666*/3588/* 29AA */,/*10667*/3588/* 29AB */, /*10668*/3588/* 29AC */,/*10669*/3588/* 29AD */,/*10670*/3588/* 29AE */,/*10671*/3588/* 29AF */,/*10672*/3565/* 29B0 */, /*10673*/3565/* 29B1 */,/*10674*/3565/* 29B2 */,/*10675*/3565/* 29B3 */,/*10676*/3565/* 29B4 */,/*10677*/3565/* 29B5 */, /*10678*/3565/* 29B6 */,/*10679*/3565/* 29B7 */,/*10680*/3589/* 29B8 */,/*10681*/3565/* 29B9 */,/*10682*/3565/* 29BA */, /*10683*/3565/* 29BB */,/*10684*/3565/* 29BC */,/*10685*/3565/* 29BD */,/*10686*/3565/* 29BE */,/*10687*/3565/* 29BF */, /*10688*/3590/* 29C0 */,/*10689*/3591/* 29C1 */,/*10690*/3588/* 29C2 */,/*10691*/3588/* 29C3 */,/*10692*/3592/* 29C4 */, /*10693*/3593/* 29C5 */,/*10694*/3565/* 29C6 */,/*10695*/3565/* 29C7 */,/*10696*/3565/* 29C8 */,/*10697*/3588/* 29C9 */, /*10698*/3565/* 29CA */,/*10699*/3565/* 29CB */,/*10700*/3565/* 29CC */,/*10701*/3565/* 29CD */,/*10702*/3588/* 29CE */, /*10703*/3594/* 29CF */,/*10704*/3595/* 29D0 */,/*10705*/3596/* 29D1 */,/*10706*/3597/* 29D2 */,/*10707*/3565/* 29D3 */, /*10708*/3598/* 29D4 */,/*10709*/3599/* 29D5 */,/*10710*/3565/* 29D6 */,/*10711*/3565/* 29D7 */,/*10712*/3600/* 29D8 */, /*10713*/3601/* 29D9 */,/*10714*/3602/* 29DA */,/*10715*/3603/* 29DB */,/*10716*/3588/* 29DC */,/*10717*/3565/* 29DD */, /*10718*/3565/* 29DE */,/*10719*/3565/* 29DF */,/*10720*/3565/* 29E0 */,/*10721*/3588/* 29E1 */,/*10722*/3565/* 29E2 */, /*10723*/3588/* 29E3 */,/*10724*/3588/* 29E4 */,/*10725*/3588/* 29E5 */,/*10726*/3565/* 29E6 */,/*10727*/3565/* 29E7 */, /*10728*/3588/* 29E8 */,/*10729*/3588/* 29E9 */,/*10730*/3565/* 29EA */,/*10731*/3565/* 29EB */,/*10732*/3565/* 29EC */, /*10733*/3565/* 29ED */,/*10734*/3565/* 29EE */,/*10735*/3565/* 29EF */,/*10736*/3565/* 29F0 */,/*10737*/3565/* 29F1 */, /*10738*/3565/* 29F2 */,/*10739*/3565/* 29F3 */,/*10740*/3588/* 29F4 */,/*10741*/3604/* 29F5 */,/*10742*/3588/* 29F6 */, /*10743*/3588/* 29F7 */,/*10744*/3605/* 29F8 */,/*10745*/3606/* 29F9 */,/*10746*/3565/* 29FA */,/*10747*/3565/* 29FB */, /*10748*/3607/* 29FC */,/*10749*/3608/* 29FD */,/*10750*/3565/* 29FE */,/*10751*/3565/* 29FF */,/*10752*/3609/* 2A00 */, /*10753*/3609/* 2A01 */,/*10754*/3609/* 2A02 */,/*10755*/3609/* 2A03 */,/*10756*/3609/* 2A04 */,/*10757*/3609/* 2A05 */, /*10758*/3609/* 2A06 */,/*10759*/3609/* 2A07 */,/*10760*/3609/* 2A08 */,/*10761*/3609/* 2A09 */,/*10762*/3610/* 2A0A */, /*10763*/3610/* 2A0B */,/*10764*/3611/* 2A0C */,/*10765*/3610/* 2A0D */,/*10766*/3610/* 2A0E */,/*10767*/3610/* 2A0F */, /*10768*/3610/* 2A10 */,/*10769*/3610/* 2A11 */,/*10770*/3610/* 2A12 */,/*10771*/3610/* 2A13 */,/*10772*/3610/* 2A14 */, /*10773*/3610/* 2A15 */,/*10774*/3610/* 2A16 */,/*10775*/3610/* 2A17 */,/*10776*/3610/* 2A18 */,/*10777*/3610/* 2A19 */, /*10778*/3610/* 2A1A */,/*10779*/3610/* 2A1B */,/*10780*/3610/* 2A1C */,/*10781*/3609/* 2A1D */,/*10782*/3610/* 2A1E */, /*10783*/3610/* 2A1F */,/*10784*/3610/* 2A20 */,/*10785*/3610/* 2A21 */,/*10786*/3609/* 2A22 */,/*10787*/3609/* 2A23 */, /*10788*/3610/* 2A24 */,/*10789*/3609/* 2A25 */,/*10790*/3610/* 2A26 */,/*10791*/3609/* 2A27 */,/*10792*/3609/* 2A28 */, /*10793*/3610/* 2A29 */,/*10794*/3609/* 2A2A */,/*10795*/3612/* 2A2B */,/*10796*/3613/* 2A2C */,/*10797*/3614/* 2A2D */, /*10798*/3615/* 2A2E */,/*10799*/3609/* 2A2F */,/*10800*/3609/* 2A30 */,/*10801*/3609/* 2A31 */,/*10802*/3609/* 2A32 */, /*10803*/3609/* 2A33 */,/*10804*/3616/* 2A34 */,/*10805*/3617/* 2A35 */,/*10806*/3609/* 2A36 */,/*10807*/3609/* 2A37 */, /*10808*/3609/* 2A38 */,/*10809*/3609/* 2A39 */,/*10810*/3609/* 2A3A */,/*10811*/3609/* 2A3B */,/*10812*/3618/* 2A3C */, /*10813*/3619/* 2A3D */,/*10814*/3610/* 2A3E */,/*10815*/3609/* 2A3F */,/*10816*/3609/* 2A40 */,/*10817*/3609/* 2A41 */, /*10818*/3609/* 2A42 */,/*10819*/3609/* 2A43 */,/*10820*/3609/* 2A44 */,/*10821*/3609/* 2A45 */,/*10822*/3609/* 2A46 */, /*10823*/3609/* 2A47 */,/*10824*/3609/* 2A48 */,/*10825*/3609/* 2A49 */,/*10826*/3609/* 2A4A */,/*10827*/3609/* 2A4B */, /*10828*/3609/* 2A4C */,/*10829*/3609/* 2A4D */,/*10830*/3609/* 2A4E */,/*10831*/3609/* 2A4F */,/*10832*/3609/* 2A50 */, /*10833*/3609/* 2A51 */,/*10834*/3609/* 2A52 */,/*10835*/3609/* 2A53 */,/*10836*/3609/* 2A54 */,/*10837*/3609/* 2A55 */, /*10838*/3609/* 2A56 */,/*10839*/3610/* 2A57 */,/*10840*/3610/* 2A58 */,/*10841*/3609/* 2A59 */,/*10842*/3609/* 2A5A */, /*10843*/3609/* 2A5B */,/*10844*/3609/* 2A5C */,/*10845*/3609/* 2A5D */,/*10846*/3609/* 2A5E */,/*10847*/3609/* 2A5F */, /*10848*/3609/* 2A60 */,/*10849*/3609/* 2A61 */,/*10850*/3609/* 2A62 */,/*10851*/3609/* 2A63 */,/*10852*/3620/* 2A64 */, /*10853*/3621/* 2A65 */,/*10854*/3609/* 2A66 */,/*10855*/3609/* 2A67 */,/*10856*/3609/* 2A68 */,/*10857*/3609/* 2A69 */, /*10858*/3610/* 2A6A */,/*10859*/3610/* 2A6B */,/*10860*/3610/* 2A6C */,/*10861*/3610/* 2A6D */,/*10862*/3609/* 2A6E */, /*10863*/3610/* 2A6F */,/*10864*/3610/* 2A70 */,/*10865*/3609/* 2A71 */,/*10866*/3609/* 2A72 */,/*10867*/3610/* 2A73 */, /*10868*/3622/* 2A74 */,/*10869*/3623/* 2A75 */,/*10870*/3624/* 2A76 */,/*10871*/3609/* 2A77 */,/*10872*/3609/* 2A78 */, /*10873*/3625/* 2A79 */,/*10874*/3626/* 2A7A */,/*10875*/3610/* 2A7B */,/*10876*/3610/* 2A7C */,/*10877*/3627/* 2A7D */, /*10878*/3628/* 2A7E */,/*10879*/3629/* 2A7F */,/*10880*/3630/* 2A80 */,/*10881*/3631/* 2A81 */,/*10882*/3632/* 2A82 */, /*10883*/3633/* 2A83 */,/*10884*/3634/* 2A84 */,/*10885*/3610/* 2A85 */,/*10886*/3610/* 2A86 */,/*10887*/3610/* 2A87 */, /*10888*/3610/* 2A88 */,/*10889*/3610/* 2A89 */,/*10890*/3610/* 2A8A */,/*10891*/3635/* 2A8B */,/*10892*/3636/* 2A8C */, /*10893*/3610/* 2A8D */,/*10894*/3610/* 2A8E */,/*10895*/3610/* 2A8F */,/*10896*/3610/* 2A90 */,/*10897*/3637/* 2A91 */, /*10898*/3638/* 2A92 */,/*10899*/3639/* 2A93 */,/*10900*/3640/* 2A94 */,/*10901*/3641/* 2A95 */,/*10902*/3642/* 2A96 */, /*10903*/3643/* 2A97 */,/*10904*/3644/* 2A98 */,/*10905*/3645/* 2A99 */,/*10906*/3646/* 2A9A */,/*10907*/3647/* 2A9B */, /*10908*/3648/* 2A9C */,/*10909*/3610/* 2A9D */,/*10910*/3610/* 2A9E */,/*10911*/3610/* 2A9F */,/*10912*/3610/* 2AA0 */, /*10913*/3649/* 2AA1 */,/*10914*/3650/* 2AA2 */,/*10915*/3610/* 2AA3 */,/*10916*/3609/* 2AA4 */,/*10917*/3609/* 2AA5 */, /*10918*/3651/* 2AA6 */,/*10919*/3652/* 2AA7 */,/*10920*/3653/* 2AA8 */,/*10921*/3654/* 2AA9 */,/*10922*/3655/* 2AAA */, /*10923*/3656/* 2AAB */,/*10924*/3657/* 2AAC */,/*10925*/3658/* 2AAD */,/*10926*/3609/* 2AAE */,/*10927*/3659/* 2AAF */, /*10928*/3660/* 2AB0 */,/*10929*/3610/* 2AB1 */,/*10930*/3610/* 2AB2 */,/*10931*/3661/* 2AB3 */,/*10932*/3662/* 2AB4 */, /*10933*/3610/* 2AB5 */,/*10934*/3610/* 2AB6 */,/*10935*/3610/* 2AB7 */,/*10936*/3610/* 2AB8 */,/*10937*/3610/* 2AB9 */, /*10938*/3610/* 2ABA */,/*10939*/3663/* 2ABB */,/*10940*/3664/* 2ABC */,/*10941*/3665/* 2ABD */,/*10942*/3666/* 2ABE */, /*10943*/3667/* 2ABF */,/*10944*/3668/* 2AC0 */,/*10945*/3669/* 2AC1 */,/*10946*/3670/* 2AC2 */,/*10947*/3671/* 2AC3 */, /*10948*/3672/* 2AC4 */,/*10949*/3673/* 2AC5 */,/*10950*/3674/* 2AC6 */,/*10951*/3610/* 2AC7 */,/*10952*/3610/* 2AC8 */, /*10953*/3610/* 2AC9 */,/*10954*/3610/* 2ACA */,/*10955*/3610/* 2ACB */,/*10956*/3610/* 2ACC */,/*10957*/3675/* 2ACD */, /*10958*/3676/* 2ACE */,/*10959*/3677/* 2ACF */,/*10960*/3678/* 2AD0 */,/*10961*/3679/* 2AD1 */,/*10962*/3680/* 2AD2 */, /*10963*/3681/* 2AD3 */,/*10964*/3682/* 2AD4 */,/*10965*/3683/* 2AD5 */,/*10966*/3684/* 2AD6 */,/*10967*/3609/* 2AD7 */, /*10968*/3609/* 2AD8 */,/*10969*/3609/* 2AD9 */,/*10970*/3609/* 2ADA */,/*10971*/3609/* 2ADB */,/*10972*/3685/* 2ADC */, /*10973*/3609/* 2ADD */,/*10974*/3686/* 2ADE */,/*10975*/3609/* 2ADF */,/*10976*/3609/* 2AE0 */,/*10977*/3609/* 2AE1 */, /*10978*/3610/* 2AE2 */,/*10979*/3687/* 2AE3 */,/*10980*/3688/* 2AE4 */,/*10981*/3689/* 2AE5 */,/*10982*/3610/* 2AE6 */, /*10983*/3609/* 2AE7 */,/*10984*/3609/* 2AE8 */,/*10985*/3609/* 2AE9 */,/*10986*/3609/* 2AEA */,/*10987*/3609/* 2AEB */, /*10988*/3690/* 2AEC */,/*10989*/3691/* 2AED */,/*10990*/3610/* 2AEE */,/*10991*/3609/* 2AEF */,/*10992*/3609/* 2AF0 */, /*10993*/3609/* 2AF1 */,/*10994*/3609/* 2AF2 */,/*10995*/3610/* 2AF3 */,/*10996*/3609/* 2AF4 */,/*10997*/3609/* 2AF5 */, /*10998*/3609/* 2AF6 */,/*10999*/3692/* 2AF7 */,/*11000*/3693/* 2AF8 */,/*11001*/3694/* 2AF9 */,/*11002*/3695/* 2AFA */, /*11003*/3610/* 2AFB */,/*11004*/3609/* 2AFC */,/*11005*/3610/* 2AFD */,/*11006*/3609/* 2AFE */,/*11007*/3609/* 2AFF */, /*11008*/3696/* 2B00 */,/*11009*/3696/* 2B01 */,/*11010*/3696/* 2B02 */,/*11011*/3696/* 2B03 */,/*11012*/3696/* 2B04 */, /*11013*/3696/* 2B05 */,/*11014*/3696/* 2B06 */,/*11015*/3696/* 2B07 */,/*11016*/3696/* 2B08 */,/*11017*/3696/* 2B09 */, /*11018*/3696/* 2B0A */,/*11019*/3696/* 2B0B */,/*11020*/3696/* 2B0C */,/*11021*/3696/* 2B0D */,/*11022*/3697/* 2B0E */, /*11023*/3697/* 2B0F */,/*11024*/3697/* 2B10 */,/*11025*/3697/* 2B11 */,/*11026*/3697/* 2B12 */,/*11027*/3697/* 2B13 */, /*11028*/3698/* 2B14 */,/*11029*/3698/* 2B15 */,/*11030*/3698/* 2B16 */,/*11031*/3698/* 2B17 */,/*11032*/3698/* 2B18 */, /*11033*/3698/* 2B19 */,/*11034*/3698/* 2B1A */,/*11035*/3699/* 2B1B */,/*11036*/3699/* 2B1C */,/*11037*/3699/* 2B1D */, /*11038*/3699/* 2B1E */,/*11039*/3699/* 2B1F */,/*11040*/3698/* 2B20 */,/*11041*/3698/* 2B21 */,/*11042*/3698/* 2B22 */, /*11043*/3698/* 2B23 */,/*11044*/3699/* 2B24 */,/*11045*/3699/* 2B25 */,/*11046*/3699/* 2B26 */,/*11047*/3699/* 2B27 */, /*11048*/3699/* 2B28 */,/*11049*/3699/* 2B29 */,/*11050*/3699/* 2B2A */,/*11051*/3699/* 2B2B */,/*11052*/3699/* 2B2C */, /*11053*/3699/* 2B2D */,/*11054*/3699/* 2B2E */,/*11055*/3699/* 2B2F */,/*11056*/3700/* 2B30 */,/*11057*/3700/* 2B31 */, /*11058*/3700/* 2B32 */,/*11059*/3700/* 2B33 */,/*11060*/3700/* 2B34 */,/*11061*/3700/* 2B35 */,/*11062*/3700/* 2B36 */, /*11063*/3700/* 2B37 */,/*11064*/3700/* 2B38 */,/*11065*/3700/* 2B39 */,/*11066*/3700/* 2B3A */,/*11067*/3700/* 2B3B */, /*11068*/3700/* 2B3C */,/*11069*/3700/* 2B3D */,/*11070*/3700/* 2B3E */,/*11071*/3700/* 2B3F */,/*11072*/3700/* 2B40 */, /*11073*/3700/* 2B41 */,/*11074*/3700/* 2B42 */,/*11075*/3700/* 2B43 */,/*11076*/3700/* 2B44 */,/*11077*/3699/* 2B45 */, /*11078*/3699/* 2B46 */,/*11079*/3700/* 2B47 */,/*11080*/3700/* 2B48 */,/*11081*/3700/* 2B49 */,/*11082*/3700/* 2B4A */, /*11083*/3700/* 2B4B */,/*11084*/3700/* 2B4C */,/*11085*/3701/* 2B4D */,/*11086*/3701/* 2B4E */,/*11087*/3701/* 2B4F */, /*11088*/3699/* 2B50 */,/*11089*/3699/* 2B51 */,/*11090*/3699/* 2B52 */,/*11091*/3699/* 2B53 */,/*11092*/3699/* 2B54 */, /*11093*/3702/* 2B55 */,/*11094*/3702/* 2B56 */,/*11095*/3702/* 2B57 */,/*11096*/3702/* 2B58 */,/*11097*/3702/* 2B59 */, /*11098*/3701/* 2B5A */,/*11099*/3701/* 2B5B */,/*11100*/3701/* 2B5C */,/*11101*/3701/* 2B5D */,/*11102*/3701/* 2B5E */, /*11103*/3701/* 2B5F */,/*11104*/3701/* 2B60 */,/*11105*/3701/* 2B61 */,/*11106*/3701/* 2B62 */,/*11107*/3701/* 2B63 */, /*11108*/3701/* 2B64 */,/*11109*/3701/* 2B65 */,/*11110*/3701/* 2B66 */,/*11111*/3701/* 2B67 */,/*11112*/3701/* 2B68 */, /*11113*/3701/* 2B69 */,/*11114*/3701/* 2B6A */,/*11115*/3701/* 2B6B */,/*11116*/3701/* 2B6C */,/*11117*/3701/* 2B6D */, /*11118*/3701/* 2B6E */,/*11119*/3701/* 2B6F */,/*11120*/3701/* 2B70 */,/*11121*/3701/* 2B71 */,/*11122*/3701/* 2B72 */, /*11123*/3701/* 2B73 */,0,0,/*11126*/3701/* 2B76 */,/*11127*/3701/* 2B77 */,/*11128*/3701/* 2B78 */, /*11129*/3701/* 2B79 */,/*11130*/3701/* 2B7A */,/*11131*/3701/* 2B7B */,/*11132*/3701/* 2B7C */,/*11133*/3701/* 2B7D */, /*11134*/3701/* 2B7E */,/*11135*/3701/* 2B7F */,/*11136*/3701/* 2B80 */,/*11137*/3701/* 2B81 */,/*11138*/3701/* 2B82 */, /*11139*/3701/* 2B83 */,/*11140*/3701/* 2B84 */,/*11141*/3701/* 2B85 */,/*11142*/3701/* 2B86 */,/*11143*/3701/* 2B87 */, /*11144*/3701/* 2B88 */,/*11145*/3701/* 2B89 */,/*11146*/3701/* 2B8A */,/*11147*/3701/* 2B8B */,/*11148*/3701/* 2B8C */, /*11149*/3701/* 2B8D */,/*11150*/3701/* 2B8E */,/*11151*/3701/* 2B8F */,/*11152*/3701/* 2B90 */,/*11153*/3701/* 2B91 */, /*11154*/3701/* 2B92 */,/*11155*/3701/* 2B93 */,/*11156*/3701/* 2B94 */,/*11157*/3701/* 2B95 */,0,0, /*11160*/3701/* 2B98 */,/*11161*/3701/* 2B99 */,/*11162*/3701/* 2B9A */,/*11163*/3701/* 2B9B */,/*11164*/3701/* 2B9C */, /*11165*/3701/* 2B9D */,/*11166*/3701/* 2B9E */,/*11167*/3701/* 2B9F */,/*11168*/3701/* 2BA0 */,/*11169*/3701/* 2BA1 */, /*11170*/3701/* 2BA2 */,/*11171*/3701/* 2BA3 */,/*11172*/3701/* 2BA4 */,/*11173*/3701/* 2BA5 */,/*11174*/3701/* 2BA6 */, /*11175*/3701/* 2BA7 */,/*11176*/3701/* 2BA8 */,/*11177*/3701/* 2BA9 */,/*11178*/3701/* 2BAA */,/*11179*/3701/* 2BAB */, /*11180*/3701/* 2BAC */,/*11181*/3701/* 2BAD */,/*11182*/3701/* 2BAE */,/*11183*/3701/* 2BAF */,/*11184*/3701/* 2BB0 */, /*11185*/3701/* 2BB1 */,/*11186*/3701/* 2BB2 */,/*11187*/3701/* 2BB3 */,/*11188*/3701/* 2BB4 */,/*11189*/3701/* 2BB5 */, /*11190*/3701/* 2BB6 */,/*11191*/3701/* 2BB7 */,/*11192*/3701/* 2BB8 */,/*11193*/3701/* 2BB9 */,0,0,0, /*11197*/3701/* 2BBD */,/*11198*/3701/* 2BBE */,/*11199*/3701/* 2BBF */,/*11200*/3701/* 2BC0 */,/*11201*/3701/* 2BC1 */, /*11202*/3701/* 2BC2 */,/*11203*/3701/* 2BC3 */,/*11204*/3701/* 2BC4 */,/*11205*/3701/* 2BC5 */,/*11206*/3701/* 2BC6 */, /*11207*/3701/* 2BC7 */,/*11208*/3701/* 2BC8 */,0,/*11210*/3701/* 2BCA */,/*11211*/3701/* 2BCB */, /*11212*/3701/* 2BCC */,/*11213*/3701/* 2BCD */,/*11214*/3701/* 2BCE */,/*11215*/3701/* 2BCF */,/*11216*/3701/* 2BD0 */, /*11217*/3701/* 2BD1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11244*/3703/* 2BEC */, /*11245*/3703/* 2BED */,/*11246*/3703/* 2BEE */,/*11247*/3703/* 2BEF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*11264*/3704/* 2C00 */,/*11265*/3705/* 2C01 */,/*11266*/3706/* 2C02 */,/*11267*/3707/* 2C03 */,/*11268*/3708/* 2C04 */, /*11269*/3709/* 2C05 */,/*11270*/3710/* 2C06 */,/*11271*/3711/* 2C07 */,/*11272*/3712/* 2C08 */,/*11273*/3713/* 2C09 */, /*11274*/3714/* 2C0A */,/*11275*/3715/* 2C0B */,/*11276*/3716/* 2C0C */,/*11277*/3717/* 2C0D */,/*11278*/3718/* 2C0E */, /*11279*/3719/* 2C0F */,/*11280*/3720/* 2C10 */,/*11281*/3721/* 2C11 */,/*11282*/3722/* 2C12 */,/*11283*/3723/* 2C13 */, /*11284*/3724/* 2C14 */,/*11285*/3725/* 2C15 */,/*11286*/3726/* 2C16 */,/*11287*/3727/* 2C17 */,/*11288*/3728/* 2C18 */, /*11289*/3729/* 2C19 */,/*11290*/3730/* 2C1A */,/*11291*/3731/* 2C1B */,/*11292*/3732/* 2C1C */,/*11293*/3733/* 2C1D */, /*11294*/3734/* 2C1E */,/*11295*/3735/* 2C1F */,/*11296*/3736/* 2C20 */,/*11297*/3737/* 2C21 */,/*11298*/3738/* 2C22 */, /*11299*/3739/* 2C23 */,/*11300*/3740/* 2C24 */,/*11301*/3741/* 2C25 */,/*11302*/3742/* 2C26 */,/*11303*/3743/* 2C27 */, /*11304*/3744/* 2C28 */,/*11305*/3745/* 2C29 */,/*11306*/3746/* 2C2A */,/*11307*/3747/* 2C2B */,/*11308*/3748/* 2C2C */, /*11309*/3749/* 2C2D */,/*11310*/3750/* 2C2E */,0,/*11312*/3751/* 2C30 */,/*11313*/3752/* 2C31 */, /*11314*/3753/* 2C32 */,/*11315*/3754/* 2C33 */,/*11316*/3755/* 2C34 */,/*11317*/3756/* 2C35 */,/*11318*/3757/* 2C36 */, /*11319*/3758/* 2C37 */,/*11320*/3759/* 2C38 */,/*11321*/3760/* 2C39 */,/*11322*/3761/* 2C3A */,/*11323*/3762/* 2C3B */, /*11324*/3763/* 2C3C */,/*11325*/3764/* 2C3D */,/*11326*/3765/* 2C3E */,/*11327*/3766/* 2C3F */,/*11328*/3767/* 2C40 */, /*11329*/3768/* 2C41 */,/*11330*/3769/* 2C42 */,/*11331*/3770/* 2C43 */,/*11332*/3771/* 2C44 */,/*11333*/3772/* 2C45 */, /*11334*/3773/* 2C46 */,/*11335*/3774/* 2C47 */,/*11336*/3775/* 2C48 */,/*11337*/3776/* 2C49 */,/*11338*/3777/* 2C4A */, /*11339*/3778/* 2C4B */,/*11340*/3779/* 2C4C */,/*11341*/3780/* 2C4D */,/*11342*/3781/* 2C4E */,/*11343*/3782/* 2C4F */, /*11344*/3783/* 2C50 */,/*11345*/3784/* 2C51 */,/*11346*/3785/* 2C52 */,/*11347*/3786/* 2C53 */,/*11348*/3787/* 2C54 */, /*11349*/3788/* 2C55 */,/*11350*/3789/* 2C56 */,/*11351*/3790/* 2C57 */,/*11352*/3791/* 2C58 */,/*11353*/3792/* 2C59 */, /*11354*/3793/* 2C5A */,/*11355*/3794/* 2C5B */,/*11356*/3795/* 2C5C */,/*11357*/3796/* 2C5D */,/*11358*/3797/* 2C5E */, 0,/*11360*/3798/* 2C60 */,/*11361*/3799/* 2C61 */,/*11362*/3800/* 2C62 */,/*11363*/3801/* 2C63 */, /*11364*/3802/* 2C64 */,/*11365*/3803/* 2C65 */,/*11366*/3804/* 2C66 */,/*11367*/3805/* 2C67 */,/*11368*/3806/* 2C68 */, /*11369*/3807/* 2C69 */,/*11370*/3808/* 2C6A */,/*11371*/3809/* 2C6B */,/*11372*/3810/* 2C6C */,/*11373*/3811/* 2C6D */, /*11374*/3812/* 2C6E */,/*11375*/3813/* 2C6F */,/*11376*/3814/* 2C70 */,/*11377*/3815/* 2C71 */,/*11378*/3816/* 2C72 */, /*11379*/3817/* 2C73 */,/*11380*/3818/* 2C74 */,/*11381*/3819/* 2C75 */,/*11382*/3820/* 2C76 */,/*11383*/3818/* 2C77 */, /*11384*/3815/* 2C78 */,/*11385*/3815/* 2C79 */,/*11386*/3815/* 2C7A */,/*11387*/3815/* 2C7B */,/*11388*/3821/* 2C7C */, /*11389*/3822/* 2C7D */,/*11390*/3823/* 2C7E */,/*11391*/3824/* 2C7F */,/*11392*/3825/* 2C80 */,/*11393*/3826/* 2C81 */, /*11394*/3827/* 2C82 */,/*11395*/3828/* 2C83 */,/*11396*/3829/* 2C84 */,/*11397*/3830/* 2C85 */,/*11398*/3831/* 2C86 */, /*11399*/3832/* 2C87 */,/*11400*/3833/* 2C88 */,/*11401*/3834/* 2C89 */,/*11402*/3835/* 2C8A */,/*11403*/3836/* 2C8B */, /*11404*/3837/* 2C8C */,/*11405*/3838/* 2C8D */,/*11406*/3839/* 2C8E */,/*11407*/3840/* 2C8F */,/*11408*/3841/* 2C90 */, /*11409*/3842/* 2C91 */,/*11410*/3843/* 2C92 */,/*11411*/3844/* 2C93 */,/*11412*/3845/* 2C94 */,/*11413*/3846/* 2C95 */, /*11414*/3847/* 2C96 */,/*11415*/3848/* 2C97 */,/*11416*/3849/* 2C98 */,/*11417*/3850/* 2C99 */,/*11418*/3851/* 2C9A */, /*11419*/3852/* 2C9B */,/*11420*/3853/* 2C9C */,/*11421*/3854/* 2C9D */,/*11422*/3855/* 2C9E */,/*11423*/3856/* 2C9F */, /*11424*/3857/* 2CA0 */,/*11425*/3858/* 2CA1 */,/*11426*/3859/* 2CA2 */,/*11427*/3860/* 2CA3 */,/*11428*/3861/* 2CA4 */, /*11429*/3862/* 2CA5 */,/*11430*/3863/* 2CA6 */,/*11431*/3864/* 2CA7 */,/*11432*/3865/* 2CA8 */,/*11433*/3866/* 2CA9 */, /*11434*/3867/* 2CAA */,/*11435*/3868/* 2CAB */,/*11436*/3869/* 2CAC */,/*11437*/3870/* 2CAD */,/*11438*/3871/* 2CAE */, /*11439*/3872/* 2CAF */,/*11440*/3873/* 2CB0 */,/*11441*/3874/* 2CB1 */,/*11442*/3875/* 2CB2 */,/*11443*/3876/* 2CB3 */, /*11444*/3877/* 2CB4 */,/*11445*/3878/* 2CB5 */,/*11446*/3879/* 2CB6 */,/*11447*/3880/* 2CB7 */,/*11448*/3881/* 2CB8 */, /*11449*/3882/* 2CB9 */,/*11450*/3883/* 2CBA */,/*11451*/3884/* 2CBB */,/*11452*/3885/* 2CBC */,/*11453*/3886/* 2CBD */, /*11454*/3887/* 2CBE */,/*11455*/3888/* 2CBF */,/*11456*/3889/* 2CC0 */,/*11457*/3890/* 2CC1 */,/*11458*/3891/* 2CC2 */, /*11459*/3892/* 2CC3 */,/*11460*/3893/* 2CC4 */,/*11461*/3894/* 2CC5 */,/*11462*/3895/* 2CC6 */,/*11463*/3896/* 2CC7 */, /*11464*/3897/* 2CC8 */,/*11465*/3898/* 2CC9 */,/*11466*/3899/* 2CCA */,/*11467*/3900/* 2CCB */,/*11468*/3901/* 2CCC */, /*11469*/3902/* 2CCD */,/*11470*/3903/* 2CCE */,/*11471*/3904/* 2CCF */,/*11472*/3905/* 2CD0 */,/*11473*/3906/* 2CD1 */, /*11474*/3907/* 2CD2 */,/*11475*/3908/* 2CD3 */,/*11476*/3909/* 2CD4 */,/*11477*/3910/* 2CD5 */,/*11478*/3911/* 2CD6 */, /*11479*/3912/* 2CD7 */,/*11480*/3913/* 2CD8 */,/*11481*/3914/* 2CD9 */,/*11482*/3915/* 2CDA */,/*11483*/3916/* 2CDB */, /*11484*/3917/* 2CDC */,/*11485*/3918/* 2CDD */,/*11486*/3919/* 2CDE */,/*11487*/3920/* 2CDF */,/*11488*/3921/* 2CE0 */, /*11489*/3922/* 2CE1 */,/*11490*/3923/* 2CE2 */,/*11491*/3924/* 2CE3 */,/*11492*/3925/* 2CE4 */,/*11493*/3926/* 2CE5 */, /*11494*/3926/* 2CE6 */,/*11495*/3926/* 2CE7 */,/*11496*/3926/* 2CE8 */,/*11497*/3926/* 2CE9 */,/*11498*/3926/* 2CEA */, /*11499*/3927/* 2CEB */,/*11500*/3928/* 2CEC */,/*11501*/3929/* 2CED */,/*11502*/3930/* 2CEE */,/*11503*/3931/* 2CEF */, /*11504*/3931/* 2CF0 */,/*11505*/3931/* 2CF1 */,/*11506*/3932/* 2CF2 */,/*11507*/3933/* 2CF3 */,0,0,0,0,0, /*11513*/3934/* 2CF9 */,/*11514*/3934/* 2CFA */,/*11515*/3934/* 2CFB */,/*11516*/3934/* 2CFC */,/*11517*/3935/* 2CFD */, /*11518*/3934/* 2CFE */,/*11519*/3934/* 2CFF */,/*11520*/3936/* 2D00 */,/*11521*/3937/* 2D01 */,/*11522*/3938/* 2D02 */, /*11523*/3939/* 2D03 */,/*11524*/3940/* 2D04 */,/*11525*/3941/* 2D05 */,/*11526*/3942/* 2D06 */,/*11527*/3943/* 2D07 */, /*11528*/3944/* 2D08 */,/*11529*/3945/* 2D09 */,/*11530*/3946/* 2D0A */,/*11531*/3947/* 2D0B */,/*11532*/3948/* 2D0C */, /*11533*/3949/* 2D0D */,/*11534*/3950/* 2D0E */,/*11535*/3951/* 2D0F */,/*11536*/3952/* 2D10 */,/*11537*/3953/* 2D11 */, /*11538*/3954/* 2D12 */,/*11539*/3955/* 2D13 */,/*11540*/3956/* 2D14 */,/*11541*/3957/* 2D15 */,/*11542*/3958/* 2D16 */, /*11543*/3959/* 2D17 */,/*11544*/3960/* 2D18 */,/*11545*/3961/* 2D19 */,/*11546*/3962/* 2D1A */,/*11547*/3963/* 2D1B */, /*11548*/3964/* 2D1C */,/*11549*/3965/* 2D1D */,/*11550*/3966/* 2D1E */,/*11551*/3967/* 2D1F */,/*11552*/3968/* 2D20 */, /*11553*/3969/* 2D21 */,/*11554*/3970/* 2D22 */,/*11555*/3971/* 2D23 */,/*11556*/3972/* 2D24 */,/*11557*/3973/* 2D25 */, 0,/*11559*/3974/* 2D27 */,0,0,0,0,0,/*11565*/3975/* 2D2D */,0,0,/*11568*/3976/* 2D30 */,/*11569*/3976/* 2D31 */, /*11570*/3976/* 2D32 */,/*11571*/3976/* 2D33 */,/*11572*/3976/* 2D34 */,/*11573*/3976/* 2D35 */,/*11574*/3976/* 2D36 */, /*11575*/3976/* 2D37 */,/*11576*/3976/* 2D38 */,/*11577*/3976/* 2D39 */,/*11578*/3976/* 2D3A */,/*11579*/3976/* 2D3B */, /*11580*/3976/* 2D3C */,/*11581*/3976/* 2D3D */,/*11582*/3976/* 2D3E */,/*11583*/3976/* 2D3F */,/*11584*/3976/* 2D40 */, /*11585*/3976/* 2D41 */,/*11586*/3976/* 2D42 */,/*11587*/3976/* 2D43 */,/*11588*/3976/* 2D44 */,/*11589*/3976/* 2D45 */, /*11590*/3976/* 2D46 */,/*11591*/3976/* 2D47 */,/*11592*/3976/* 2D48 */,/*11593*/3976/* 2D49 */,/*11594*/3976/* 2D4A */, /*11595*/3976/* 2D4B */,/*11596*/3976/* 2D4C */,/*11597*/3976/* 2D4D */,/*11598*/3976/* 2D4E */,/*11599*/3976/* 2D4F */, /*11600*/3976/* 2D50 */,/*11601*/3976/* 2D51 */,/*11602*/3976/* 2D52 */,/*11603*/3976/* 2D53 */,/*11604*/3976/* 2D54 */, /*11605*/3976/* 2D55 */,/*11606*/3976/* 2D56 */,/*11607*/3976/* 2D57 */,/*11608*/3976/* 2D58 */,/*11609*/3976/* 2D59 */, /*11610*/3976/* 2D5A */,/*11611*/3976/* 2D5B */,/*11612*/3976/* 2D5C */,/*11613*/3976/* 2D5D */,/*11614*/3976/* 2D5E */, /*11615*/3976/* 2D5F */,/*11616*/3976/* 2D60 */,/*11617*/3976/* 2D61 */,/*11618*/3976/* 2D62 */,/*11619*/3976/* 2D63 */, /*11620*/3976/* 2D64 */,/*11621*/3976/* 2D65 */,/*11622*/3977/* 2D66 */,/*11623*/3977/* 2D67 */,0,0,0,0,0,0,0, /*11631*/3978/* 2D6F */,/*11632*/3979/* 2D70 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11647*/3980/* 2D7F */, /*11648*/3981/* 2D80 */,/*11649*/3981/* 2D81 */,/*11650*/3981/* 2D82 */,/*11651*/3981/* 2D83 */,/*11652*/3981/* 2D84 */, /*11653*/3981/* 2D85 */,/*11654*/3981/* 2D86 */,/*11655*/3981/* 2D87 */,/*11656*/3981/* 2D88 */,/*11657*/3981/* 2D89 */, /*11658*/3981/* 2D8A */,/*11659*/3981/* 2D8B */,/*11660*/3981/* 2D8C */,/*11661*/3981/* 2D8D */,/*11662*/3981/* 2D8E */, /*11663*/3981/* 2D8F */,/*11664*/3981/* 2D90 */,/*11665*/3981/* 2D91 */,/*11666*/3981/* 2D92 */,/*11667*/3981/* 2D93 */, /*11668*/3981/* 2D94 */,/*11669*/3981/* 2D95 */,/*11670*/3981/* 2D96 */,0,0,0,0,0,0,0,0,0,/*11680*/3981/* 2DA0 */, /*11681*/3981/* 2DA1 */,/*11682*/3981/* 2DA2 */,/*11683*/3981/* 2DA3 */,/*11684*/3981/* 2DA4 */,/*11685*/3981/* 2DA5 */, /*11686*/3981/* 2DA6 */,0,/*11688*/3981/* 2DA8 */,/*11689*/3981/* 2DA9 */,/*11690*/3981/* 2DAA */, /*11691*/3981/* 2DAB */,/*11692*/3981/* 2DAC */,/*11693*/3981/* 2DAD */,/*11694*/3981/* 2DAE */,0, /*11696*/3981/* 2DB0 */,/*11697*/3981/* 2DB1 */,/*11698*/3981/* 2DB2 */,/*11699*/3981/* 2DB3 */,/*11700*/3981/* 2DB4 */, /*11701*/3981/* 2DB5 */,/*11702*/3981/* 2DB6 */,0,/*11704*/3981/* 2DB8 */,/*11705*/3981/* 2DB9 */, /*11706*/3981/* 2DBA */,/*11707*/3981/* 2DBB */,/*11708*/3981/* 2DBC */,/*11709*/3981/* 2DBD */,/*11710*/3981/* 2DBE */, 0,/*11712*/3981/* 2DC0 */,/*11713*/3981/* 2DC1 */,/*11714*/3981/* 2DC2 */,/*11715*/3981/* 2DC3 */, /*11716*/3981/* 2DC4 */,/*11717*/3981/* 2DC5 */,/*11718*/3981/* 2DC6 */,0,/*11720*/3981/* 2DC8 */, /*11721*/3981/* 2DC9 */,/*11722*/3981/* 2DCA */,/*11723*/3981/* 2DCB */,/*11724*/3981/* 2DCC */,/*11725*/3981/* 2DCD */, /*11726*/3981/* 2DCE */,0,/*11728*/3981/* 2DD0 */,/*11729*/3981/* 2DD1 */,/*11730*/3981/* 2DD2 */, /*11731*/3981/* 2DD3 */,/*11732*/3981/* 2DD4 */,/*11733*/3981/* 2DD5 */,/*11734*/3981/* 2DD6 */,0, /*11736*/3981/* 2DD8 */,/*11737*/3981/* 2DD9 */,/*11738*/3981/* 2DDA */,/*11739*/3981/* 2DDB */,/*11740*/3981/* 2DDC */, /*11741*/3981/* 2DDD */,/*11742*/3981/* 2DDE */,0,/*11744*/3982/* 2DE0 */,/*11745*/3982/* 2DE1 */, /*11746*/3982/* 2DE2 */,/*11747*/3982/* 2DE3 */,/*11748*/3982/* 2DE4 */,/*11749*/3982/* 2DE5 */,/*11750*/3982/* 2DE6 */, /*11751*/3982/* 2DE7 */,/*11752*/3982/* 2DE8 */,/*11753*/3982/* 2DE9 */,/*11754*/3982/* 2DEA */,/*11755*/3982/* 2DEB */, /*11756*/3982/* 2DEC */,/*11757*/3982/* 2DED */,/*11758*/3982/* 2DEE */,/*11759*/3982/* 2DEF */,/*11760*/3982/* 2DF0 */, /*11761*/3982/* 2DF1 */,/*11762*/3982/* 2DF2 */,/*11763*/3982/* 2DF3 */,/*11764*/3982/* 2DF4 */,/*11765*/3982/* 2DF5 */, /*11766*/3982/* 2DF6 */,/*11767*/3982/* 2DF7 */,/*11768*/3982/* 2DF8 */,/*11769*/3982/* 2DF9 */,/*11770*/3982/* 2DFA */, /*11771*/3982/* 2DFB */,/*11772*/3982/* 2DFC */,/*11773*/3982/* 2DFD */,/*11774*/3982/* 2DFE */,/*11775*/3982/* 2DFF */, /*11776*/3983/* 2E00 */,/*11777*/3983/* 2E01 */,/*11778*/3984/* 2E02 */,/*11779*/3985/* 2E03 */,/*11780*/3986/* 2E04 */, /*11781*/3987/* 2E05 */,/*11782*/3983/* 2E06 */,/*11783*/3983/* 2E07 */,/*11784*/3983/* 2E08 */,/*11785*/3988/* 2E09 */, /*11786*/3989/* 2E0A */,/*11787*/3983/* 2E0B */,/*11788*/3990/* 2E0C */,/*11789*/3991/* 2E0D */,/*11790*/3992/* 2E0E */, /*11791*/3992/* 2E0F */,/*11792*/3992/* 2E10 */,/*11793*/3992/* 2E11 */,/*11794*/3992/* 2E12 */,/*11795*/3992/* 2E13 */, /*11796*/3992/* 2E14 */,/*11797*/3992/* 2E15 */,/*11798*/3992/* 2E16 */,/*11799*/3993/* 2E17 */,/*11800*/3994/* 2E18 */, /*11801*/3994/* 2E19 */,/*11802*/3995/* 2E1A */,/*11803*/3994/* 2E1B */,/*11804*/3996/* 2E1C */,/*11805*/3997/* 2E1D */, /*11806*/3994/* 2E1E */,/*11807*/3994/* 2E1F */,/*11808*/3998/* 2E20 */,/*11809*/3999/* 2E21 */,/*11810*/4000/* 2E22 */, /*11811*/4001/* 2E23 */,/*11812*/4002/* 2E24 */,/*11813*/4003/* 2E25 */,/*11814*/4004/* 2E26 */,/*11815*/4005/* 2E27 */, /*11816*/4006/* 2E28 */,/*11817*/4007/* 2E29 */,/*11818*/3994/* 2E2A */,/*11819*/3994/* 2E2B */,/*11820*/3994/* 2E2C */, /*11821*/3994/* 2E2D */,/*11822*/4008/* 2E2E */,/*11823*/4009/* 2E2F */,/*11824*/3994/* 2E30 */,/*11825*/4010/* 2E31 */, /*11826*/4011/* 2E32 */,/*11827*/4011/* 2E33 */,/*11828*/4011/* 2E34 */,/*11829*/4011/* 2E35 */,/*11830*/4011/* 2E36 */, /*11831*/4011/* 2E37 */,/*11832*/4011/* 2E38 */,/*11833*/4011/* 2E39 */,/*11834*/4012/* 2E3A */,/*11835*/4012/* 2E3B */, /*11836*/4013/* 2E3C */,/*11837*/4014/* 2E3D */,/*11838*/4014/* 2E3E */,/*11839*/4014/* 2E3F */,/*11840*/4015/* 2E40 */, /*11841*/4016/* 2E41 */,/*11842*/4017/* 2E42 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11904*/4018/* 2E80 */,/*11905*/4019/* 2E81 */, /*11906*/4019/* 2E82 */,/*11907*/4019/* 2E83 */,/*11908*/4019/* 2E84 */,/*11909*/4019/* 2E85 */,/*11910*/4019/* 2E86 */, /*11911*/4019/* 2E87 */,/*11912*/4019/* 2E88 */,/*11913*/4019/* 2E89 */,/*11914*/4019/* 2E8A */,/*11915*/4019/* 2E8B */, /*11916*/4019/* 2E8C */,/*11917*/4019/* 2E8D */,/*11918*/4019/* 2E8E */,/*11919*/4019/* 2E8F */,/*11920*/4019/* 2E90 */, /*11921*/4019/* 2E91 */,/*11922*/4019/* 2E92 */,/*11923*/4019/* 2E93 */,/*11924*/4019/* 2E94 */,/*11925*/4019/* 2E95 */, /*11926*/4019/* 2E96 */,/*11927*/4019/* 2E97 */,/*11928*/4019/* 2E98 */,/*11929*/4019/* 2E99 */,0, /*11931*/4019/* 2E9B */,/*11932*/4019/* 2E9C */,/*11933*/4019/* 2E9D */,/*11934*/4019/* 2E9E */,/*11935*/4020/* 2E9F */, /*11936*/4019/* 2EA0 */,/*11937*/4019/* 2EA1 */,/*11938*/4019/* 2EA2 */,/*11939*/4019/* 2EA3 */,/*11940*/4019/* 2EA4 */, /*11941*/4019/* 2EA5 */,/*11942*/4019/* 2EA6 */,/*11943*/4019/* 2EA7 */,/*11944*/4019/* 2EA8 */,/*11945*/4019/* 2EA9 */, /*11946*/4019/* 2EAA */,/*11947*/4019/* 2EAB */,/*11948*/4019/* 2EAC */,/*11949*/4019/* 2EAD */,/*11950*/4019/* 2EAE */, /*11951*/4019/* 2EAF */,/*11952*/4019/* 2EB0 */,/*11953*/4019/* 2EB1 */,/*11954*/4019/* 2EB2 */,/*11955*/4019/* 2EB3 */, /*11956*/4019/* 2EB4 */,/*11957*/4019/* 2EB5 */,/*11958*/4019/* 2EB6 */,/*11959*/4019/* 2EB7 */,/*11960*/4019/* 2EB8 */, /*11961*/4019/* 2EB9 */,/*11962*/4019/* 2EBA */,/*11963*/4019/* 2EBB */,/*11964*/4019/* 2EBC */,/*11965*/4019/* 2EBD */, /*11966*/4019/* 2EBE */,/*11967*/4019/* 2EBF */,/*11968*/4019/* 2EC0 */,/*11969*/4019/* 2EC1 */,/*11970*/4019/* 2EC2 */, /*11971*/4019/* 2EC3 */,/*11972*/4019/* 2EC4 */,/*11973*/4019/* 2EC5 */,/*11974*/4019/* 2EC6 */,/*11975*/4019/* 2EC7 */, /*11976*/4019/* 2EC8 */,/*11977*/4019/* 2EC9 */,/*11978*/4019/* 2ECA */,/*11979*/4019/* 2ECB */,/*11980*/4019/* 2ECC */, /*11981*/4019/* 2ECD */,/*11982*/4019/* 2ECE */,/*11983*/4019/* 2ECF */,/*11984*/4019/* 2ED0 */,/*11985*/4019/* 2ED1 */, /*11986*/4019/* 2ED2 */,/*11987*/4019/* 2ED3 */,/*11988*/4019/* 2ED4 */,/*11989*/4019/* 2ED5 */,/*11990*/4019/* 2ED6 */, /*11991*/4019/* 2ED7 */,/*11992*/4019/* 2ED8 */,/*11993*/4019/* 2ED9 */,/*11994*/4019/* 2EDA */,/*11995*/4019/* 2EDB */, /*11996*/4019/* 2EDC */,/*11997*/4019/* 2EDD */,/*11998*/4019/* 2EDE */,/*11999*/4019/* 2EDF */,/*12000*/4019/* 2EE0 */, /*12001*/4019/* 2EE1 */,/*12002*/4019/* 2EE2 */,/*12003*/4019/* 2EE3 */,/*12004*/4019/* 2EE4 */,/*12005*/4019/* 2EE5 */, /*12006*/4019/* 2EE6 */,/*12007*/4019/* 2EE7 */,/*12008*/4019/* 2EE8 */,/*12009*/4019/* 2EE9 */,/*12010*/4019/* 2EEA */, /*12011*/4019/* 2EEB */,/*12012*/4019/* 2EEC */,/*12013*/4019/* 2EED */,/*12014*/4019/* 2EEE */,/*12015*/4019/* 2EEF */, /*12016*/4019/* 2EF0 */,/*12017*/4019/* 2EF1 */,/*12018*/4019/* 2EF2 */,/*12019*/4021/* 2EF3 */,0,0,0,0,0,0,0,0,0,0,0,0, /*12032*/4022/* 2F00 */,/*12033*/4023/* 2F01 */,/*12034*/4024/* 2F02 */,/*12035*/4025/* 2F03 */,/*12036*/4026/* 2F04 */, /*12037*/4027/* 2F05 */,/*12038*/4028/* 2F06 */,/*12039*/4029/* 2F07 */,/*12040*/4030/* 2F08 */,/*12041*/4031/* 2F09 */, /*12042*/4032/* 2F0A */,/*12043*/4033/* 2F0B */,/*12044*/4034/* 2F0C */,/*12045*/4035/* 2F0D */,/*12046*/4036/* 2F0E */, /*12047*/4037/* 2F0F */,/*12048*/4038/* 2F10 */,/*12049*/4039/* 2F11 */,/*12050*/4040/* 2F12 */,/*12051*/4041/* 2F13 */, /*12052*/4042/* 2F14 */,/*12053*/4043/* 2F15 */,/*12054*/4044/* 2F16 */,/*12055*/4045/* 2F17 */,/*12056*/4046/* 2F18 */, /*12057*/4047/* 2F19 */,/*12058*/4048/* 2F1A */,/*12059*/4049/* 2F1B */,/*12060*/4050/* 2F1C */,/*12061*/4051/* 2F1D */, /*12062*/4052/* 2F1E */,/*12063*/4053/* 2F1F */,/*12064*/4054/* 2F20 */,/*12065*/4055/* 2F21 */,/*12066*/4056/* 2F22 */, /*12067*/4057/* 2F23 */,/*12068*/4058/* 2F24 */,/*12069*/4059/* 2F25 */,/*12070*/4060/* 2F26 */,/*12071*/4061/* 2F27 */, /*12072*/4062/* 2F28 */,/*12073*/4063/* 2F29 */,/*12074*/4064/* 2F2A */,/*12075*/4065/* 2F2B */,/*12076*/4066/* 2F2C */, /*12077*/4067/* 2F2D */,/*12078*/4068/* 2F2E */,/*12079*/4069/* 2F2F */,/*12080*/4070/* 2F30 */,/*12081*/4071/* 2F31 */, /*12082*/4072/* 2F32 */,/*12083*/4073/* 2F33 */,/*12084*/4074/* 2F34 */,/*12085*/4075/* 2F35 */,/*12086*/4076/* 2F36 */, /*12087*/4077/* 2F37 */,/*12088*/4078/* 2F38 */,/*12089*/4079/* 2F39 */,/*12090*/4080/* 2F3A */,/*12091*/4081/* 2F3B */, /*12092*/4082/* 2F3C */,/*12093*/4083/* 2F3D */,/*12094*/4084/* 2F3E */,/*12095*/4085/* 2F3F */,/*12096*/4086/* 2F40 */, /*12097*/4087/* 2F41 */,/*12098*/4088/* 2F42 */,/*12099*/4089/* 2F43 */,/*12100*/4090/* 2F44 */,/*12101*/4091/* 2F45 */, /*12102*/4092/* 2F46 */,/*12103*/4093/* 2F47 */,/*12104*/4094/* 2F48 */,/*12105*/4095/* 2F49 */,/*12106*/4096/* 2F4A */, /*12107*/4097/* 2F4B */,/*12108*/4098/* 2F4C */,/*12109*/4099/* 2F4D */,/*12110*/4100/* 2F4E */,/*12111*/4101/* 2F4F */, /*12112*/4102/* 2F50 */,/*12113*/4103/* 2F51 */,/*12114*/4104/* 2F52 */,/*12115*/4105/* 2F53 */,/*12116*/4106/* 2F54 */, /*12117*/4107/* 2F55 */,/*12118*/4108/* 2F56 */,/*12119*/4109/* 2F57 */,/*12120*/4110/* 2F58 */,/*12121*/4111/* 2F59 */, /*12122*/4112/* 2F5A */,/*12123*/4113/* 2F5B */,/*12124*/4114/* 2F5C */,/*12125*/4115/* 2F5D */,/*12126*/4116/* 2F5E */, /*12127*/4117/* 2F5F */,/*12128*/4118/* 2F60 */,/*12129*/4119/* 2F61 */,/*12130*/4120/* 2F62 */,/*12131*/4121/* 2F63 */, /*12132*/4122/* 2F64 */,/*12133*/4123/* 2F65 */,/*12134*/4124/* 2F66 */,/*12135*/4125/* 2F67 */,/*12136*/4126/* 2F68 */, /*12137*/4127/* 2F69 */,/*12138*/4128/* 2F6A */,/*12139*/4129/* 2F6B */,/*12140*/4130/* 2F6C */,/*12141*/4131/* 2F6D */, /*12142*/4132/* 2F6E */,/*12143*/4133/* 2F6F */,/*12144*/4134/* 2F70 */,/*12145*/4135/* 2F71 */,/*12146*/4136/* 2F72 */, /*12147*/4137/* 2F73 */,/*12148*/4138/* 2F74 */,/*12149*/4139/* 2F75 */,/*12150*/4140/* 2F76 */,/*12151*/4141/* 2F77 */, /*12152*/4142/* 2F78 */,/*12153*/4143/* 2F79 */,/*12154*/4144/* 2F7A */,/*12155*/4145/* 2F7B */,/*12156*/4146/* 2F7C */, /*12157*/4147/* 2F7D */,/*12158*/4148/* 2F7E */,/*12159*/4149/* 2F7F */,/*12160*/4150/* 2F80 */,/*12161*/4151/* 2F81 */, /*12162*/4152/* 2F82 */,/*12163*/4153/* 2F83 */,/*12164*/4154/* 2F84 */,/*12165*/4155/* 2F85 */,/*12166*/4156/* 2F86 */, /*12167*/4157/* 2F87 */,/*12168*/4158/* 2F88 */,/*12169*/4159/* 2F89 */,/*12170*/4160/* 2F8A */,/*12171*/4161/* 2F8B */, /*12172*/4162/* 2F8C */,/*12173*/4163/* 2F8D */,/*12174*/4164/* 2F8E */,/*12175*/4165/* 2F8F */,/*12176*/4166/* 2F90 */, /*12177*/4167/* 2F91 */,/*12178*/4168/* 2F92 */,/*12179*/4169/* 2F93 */,/*12180*/4170/* 2F94 */,/*12181*/4171/* 2F95 */, /*12182*/4172/* 2F96 */,/*12183*/4173/* 2F97 */,/*12184*/4174/* 2F98 */,/*12185*/4175/* 2F99 */,/*12186*/4176/* 2F9A */, /*12187*/4177/* 2F9B */,/*12188*/4178/* 2F9C */,/*12189*/4179/* 2F9D */,/*12190*/4180/* 2F9E */,/*12191*/4181/* 2F9F */, /*12192*/4182/* 2FA0 */,/*12193*/4183/* 2FA1 */,/*12194*/4184/* 2FA2 */,/*12195*/4185/* 2FA3 */,/*12196*/4186/* 2FA4 */, /*12197*/4187/* 2FA5 */,/*12198*/4188/* 2FA6 */,/*12199*/4189/* 2FA7 */,/*12200*/4190/* 2FA8 */,/*12201*/4191/* 2FA9 */, /*12202*/4192/* 2FAA */,/*12203*/4193/* 2FAB */,/*12204*/4194/* 2FAC */,/*12205*/4195/* 2FAD */,/*12206*/4196/* 2FAE */, /*12207*/4197/* 2FAF */,/*12208*/4198/* 2FB0 */,/*12209*/4199/* 2FB1 */,/*12210*/4200/* 2FB2 */,/*12211*/4201/* 2FB3 */, /*12212*/4202/* 2FB4 */,/*12213*/4203/* 2FB5 */,/*12214*/4204/* 2FB6 */,/*12215*/4205/* 2FB7 */,/*12216*/4206/* 2FB8 */, /*12217*/4207/* 2FB9 */,/*12218*/4208/* 2FBA */,/*12219*/4209/* 2FBB */,/*12220*/4210/* 2FBC */,/*12221*/4211/* 2FBD */, /*12222*/4212/* 2FBE */,/*12223*/4213/* 2FBF */,/*12224*/4214/* 2FC0 */,/*12225*/4215/* 2FC1 */,/*12226*/4216/* 2FC2 */, /*12227*/4217/* 2FC3 */,/*12228*/4218/* 2FC4 */,/*12229*/4219/* 2FC5 */,/*12230*/4220/* 2FC6 */,/*12231*/4221/* 2FC7 */, /*12232*/4222/* 2FC8 */,/*12233*/4223/* 2FC9 */,/*12234*/4224/* 2FCA */,/*12235*/4225/* 2FCB */,/*12236*/4226/* 2FCC */, /*12237*/4227/* 2FCD */,/*12238*/4228/* 2FCE */,/*12239*/4229/* 2FCF */,/*12240*/4230/* 2FD0 */,/*12241*/4231/* 2FD1 */, /*12242*/4232/* 2FD2 */,/*12243*/4233/* 2FD3 */,/*12244*/4234/* 2FD4 */,/*12245*/4235/* 2FD5 */,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*12272*/4236/* 2FF0 */,/*12273*/4236/* 2FF1 */,/*12274*/4237/* 2FF2 */, /*12275*/4237/* 2FF3 */,/*12276*/4236/* 2FF4 */,/*12277*/4236/* 2FF5 */,/*12278*/4236/* 2FF6 */,/*12279*/4236/* 2FF7 */, /*12280*/4236/* 2FF8 */,/*12281*/4236/* 2FF9 */,/*12282*/4236/* 2FFA */,/*12283*/4236/* 2FFB */,0,0,0,0, /*12288*/4238/* 3000 */,/*12289*/4239/* 3001 */,/*12290*/4240/* 3002 */,/*12291*/4241/* 3003 */,/*12292*/4242/* 3004 */, /*12293*/4243/* 3005 */,/*12294*/4244/* 3006 */,/*12295*/4245/* 3007 */,/*12296*/4246/* 3008 */,/*12297*/4247/* 3009 */, /*12298*/4248/* 300A */,/*12299*/4249/* 300B */,/*12300*/4250/* 300C */,/*12301*/4251/* 300D */,/*12302*/4252/* 300E */, /*12303*/4253/* 300F */,/*12304*/4254/* 3010 */,/*12305*/4255/* 3011 */,/*12306*/4256/* 3012 */,/*12307*/4256/* 3013 */, /*12308*/4257/* 3014 */,/*12309*/4258/* 3015 */,/*12310*/4259/* 3016 */,/*12311*/4260/* 3017 */,/*12312*/4261/* 3018 */, /*12313*/4262/* 3019 */,/*12314*/4263/* 301A */,/*12315*/4264/* 301B */,/*12316*/4265/* 301C */,/*12317*/4266/* 301D */, /*12318*/4267/* 301E */,/*12319*/4267/* 301F */,/*12320*/4256/* 3020 */,/*12321*/4268/* 3021 */,/*12322*/4269/* 3022 */, /*12323*/4270/* 3023 */,/*12324*/4271/* 3024 */,/*12325*/4272/* 3025 */,/*12326*/4273/* 3026 */,/*12327*/4274/* 3027 */, /*12328*/4275/* 3028 */,/*12329*/4276/* 3029 */,/*12330*/4277/* 302A */,/*12331*/4278/* 302B */,/*12332*/4279/* 302C */, /*12333*/4280/* 302D */,/*12334*/4281/* 302E */,/*12335*/4281/* 302F */,/*12336*/4265/* 3030 */,/*12337*/4282/* 3031 */, /*12338*/4282/* 3032 */,/*12339*/4282/* 3033 */,/*12340*/4282/* 3034 */,/*12341*/4283/* 3035 */,/*12342*/4284/* 3036 */, /*12343*/4242/* 3037 */,/*12344*/4285/* 3038 */,/*12345*/4286/* 3039 */,/*12346*/4287/* 303A */,/*12347*/4288/* 303B */, /*12348*/4289/* 303C */,/*12349*/4290/* 303D */,/*12350*/4291/* 303E */,/*12351*/4242/* 303F */,0, /*12353*/4292/* 3041 */,/*12354*/4292/* 3042 */,/*12355*/4292/* 3043 */,/*12356*/4292/* 3044 */,/*12357*/4292/* 3045 */, /*12358*/4292/* 3046 */,/*12359*/4292/* 3047 */,/*12360*/4292/* 3048 */,/*12361*/4292/* 3049 */,/*12362*/4292/* 304A */, /*12363*/4292/* 304B */,/*12364*/4293/* 304C */,/*12365*/4292/* 304D */,/*12366*/4294/* 304E */,/*12367*/4292/* 304F */, /*12368*/4295/* 3050 */,/*12369*/4292/* 3051 */,/*12370*/4296/* 3052 */,/*12371*/4292/* 3053 */,/*12372*/4297/* 3054 */, /*12373*/4292/* 3055 */,/*12374*/4298/* 3056 */,/*12375*/4292/* 3057 */,/*12376*/4299/* 3058 */,/*12377*/4292/* 3059 */, /*12378*/4300/* 305A */,/*12379*/4292/* 305B */,/*12380*/4301/* 305C */,/*12381*/4292/* 305D */,/*12382*/4302/* 305E */, /*12383*/4292/* 305F */,/*12384*/4303/* 3060 */,/*12385*/4292/* 3061 */,/*12386*/4304/* 3062 */,/*12387*/4292/* 3063 */, /*12388*/4292/* 3064 */,/*12389*/4305/* 3065 */,/*12390*/4292/* 3066 */,/*12391*/4306/* 3067 */,/*12392*/4292/* 3068 */, /*12393*/4307/* 3069 */,/*12394*/4292/* 306A */,/*12395*/4292/* 306B */,/*12396*/4292/* 306C */,/*12397*/4292/* 306D */, /*12398*/4292/* 306E */,/*12399*/4292/* 306F */,/*12400*/4308/* 3070 */,/*12401*/4309/* 3071 */,/*12402*/4292/* 3072 */, /*12403*/4310/* 3073 */,/*12404*/4311/* 3074 */,/*12405*/4292/* 3075 */,/*12406*/4312/* 3076 */,/*12407*/4313/* 3077 */, /*12408*/4292/* 3078 */,/*12409*/4314/* 3079 */,/*12410*/4315/* 307A */,/*12411*/4292/* 307B */,/*12412*/4316/* 307C */, /*12413*/4317/* 307D */,/*12414*/4292/* 307E */,/*12415*/4292/* 307F */,/*12416*/4292/* 3080 */,/*12417*/4292/* 3081 */, /*12418*/4292/* 3082 */,/*12419*/4292/* 3083 */,/*12420*/4292/* 3084 */,/*12421*/4292/* 3085 */,/*12422*/4292/* 3086 */, /*12423*/4292/* 3087 */,/*12424*/4292/* 3088 */,/*12425*/4292/* 3089 */,/*12426*/4292/* 308A */,/*12427*/4292/* 308B */, /*12428*/4292/* 308C */,/*12429*/4292/* 308D */,/*12430*/4292/* 308E */,/*12431*/4292/* 308F */,/*12432*/4292/* 3090 */, /*12433*/4292/* 3091 */,/*12434*/4292/* 3092 */,/*12435*/4292/* 3093 */,/*12436*/4318/* 3094 */,/*12437*/4319/* 3095 */, /*12438*/4319/* 3096 */,0,0,/*12441*/4320/* 3099 */,/*12442*/4320/* 309A */,/*12443*/4321/* 309B */, /*12444*/4322/* 309C */,/*12445*/4323/* 309D */,/*12446*/4324/* 309E */,/*12447*/4325/* 309F */,/*12448*/4326/* 30A0 */, /*12449*/4327/* 30A1 */,/*12450*/4327/* 30A2 */,/*12451*/4327/* 30A3 */,/*12452*/4327/* 30A4 */,/*12453*/4327/* 30A5 */, /*12454*/4327/* 30A6 */,/*12455*/4327/* 30A7 */,/*12456*/4327/* 30A8 */,/*12457*/4327/* 30A9 */,/*12458*/4327/* 30AA */, /*12459*/4327/* 30AB */,/*12460*/4328/* 30AC */,/*12461*/4327/* 30AD */,/*12462*/4329/* 30AE */,/*12463*/4327/* 30AF */, /*12464*/4330/* 30B0 */,/*12465*/4327/* 30B1 */,/*12466*/4331/* 30B2 */,/*12467*/4327/* 30B3 */,/*12468*/4332/* 30B4 */, /*12469*/4327/* 30B5 */,/*12470*/4333/* 30B6 */,/*12471*/4327/* 30B7 */,/*12472*/4334/* 30B8 */,/*12473*/4327/* 30B9 */, /*12474*/4335/* 30BA */,/*12475*/4327/* 30BB */,/*12476*/4336/* 30BC */,/*12477*/4327/* 30BD */,/*12478*/4337/* 30BE */, /*12479*/4327/* 30BF */,/*12480*/4338/* 30C0 */,/*12481*/4327/* 30C1 */,/*12482*/4339/* 30C2 */,/*12483*/4327/* 30C3 */, /*12484*/4327/* 30C4 */,/*12485*/4340/* 30C5 */,/*12486*/4327/* 30C6 */,/*12487*/4341/* 30C7 */,/*12488*/4327/* 30C8 */, /*12489*/4342/* 30C9 */,/*12490*/4327/* 30CA */,/*12491*/4327/* 30CB */,/*12492*/4327/* 30CC */,/*12493*/4327/* 30CD */, /*12494*/4327/* 30CE */,/*12495*/4327/* 30CF */,/*12496*/4343/* 30D0 */,/*12497*/4344/* 30D1 */,/*12498*/4327/* 30D2 */, /*12499*/4345/* 30D3 */,/*12500*/4346/* 30D4 */,/*12501*/4327/* 30D5 */,/*12502*/4347/* 30D6 */,/*12503*/4348/* 30D7 */, /*12504*/4327/* 30D8 */,/*12505*/4349/* 30D9 */,/*12506*/4350/* 30DA */,/*12507*/4327/* 30DB */,/*12508*/4351/* 30DC */, /*12509*/4352/* 30DD */,/*12510*/4327/* 30DE */,/*12511*/4327/* 30DF */,/*12512*/4327/* 30E0 */,/*12513*/4327/* 30E1 */, /*12514*/4327/* 30E2 */,/*12515*/4327/* 30E3 */,/*12516*/4327/* 30E4 */,/*12517*/4327/* 30E5 */,/*12518*/4327/* 30E6 */, /*12519*/4327/* 30E7 */,/*12520*/4327/* 30E8 */,/*12521*/4327/* 30E9 */,/*12522*/4327/* 30EA */,/*12523*/4327/* 30EB */, /*12524*/4327/* 30EC */,/*12525*/4327/* 30ED */,/*12526*/4327/* 30EE */,/*12527*/4327/* 30EF */,/*12528*/4327/* 30F0 */, /*12529*/4327/* 30F1 */,/*12530*/4327/* 30F2 */,/*12531*/4327/* 30F3 */,/*12532*/4353/* 30F4 */,/*12533*/4327/* 30F5 */, /*12534*/4327/* 30F6 */,/*12535*/4354/* 30F7 */,/*12536*/4355/* 30F8 */,/*12537*/4356/* 30F9 */,/*12538*/4357/* 30FA */, /*12539*/4358/* 30FB */,/*12540*/4359/* 30FC */,/*12541*/4360/* 30FD */,/*12542*/4361/* 30FE */,/*12543*/4362/* 30FF */, 0,0,0,0,0,/*12549*/4363/* 3105 */,/*12550*/4363/* 3106 */,/*12551*/4363/* 3107 */,/*12552*/4363/* 3108 */, /*12553*/4363/* 3109 */,/*12554*/4363/* 310A */,/*12555*/4363/* 310B */,/*12556*/4363/* 310C */,/*12557*/4363/* 310D */, /*12558*/4363/* 310E */,/*12559*/4363/* 310F */,/*12560*/4363/* 3110 */,/*12561*/4363/* 3111 */,/*12562*/4363/* 3112 */, /*12563*/4363/* 3113 */,/*12564*/4363/* 3114 */,/*12565*/4363/* 3115 */,/*12566*/4363/* 3116 */,/*12567*/4363/* 3117 */, /*12568*/4363/* 3118 */,/*12569*/4363/* 3119 */,/*12570*/4363/* 311A */,/*12571*/4363/* 311B */,/*12572*/4363/* 311C */, /*12573*/4363/* 311D */,/*12574*/4363/* 311E */,/*12575*/4363/* 311F */,/*12576*/4363/* 3120 */,/*12577*/4363/* 3121 */, /*12578*/4363/* 3122 */,/*12579*/4363/* 3123 */,/*12580*/4363/* 3124 */,/*12581*/4363/* 3125 */,/*12582*/4363/* 3126 */, /*12583*/4363/* 3127 */,/*12584*/4363/* 3128 */,/*12585*/4363/* 3129 */,/*12586*/4363/* 312A */,/*12587*/4363/* 312B */, /*12588*/4363/* 312C */,/*12589*/4364/* 312D */,0,0,0,/*12593*/4365/* 3131 */,/*12594*/4366/* 3132 */, /*12595*/4367/* 3133 */,/*12596*/4368/* 3134 */,/*12597*/4369/* 3135 */,/*12598*/4370/* 3136 */,/*12599*/4371/* 3137 */, /*12600*/4372/* 3138 */,/*12601*/4373/* 3139 */,/*12602*/4374/* 313A */,/*12603*/4375/* 313B */,/*12604*/4376/* 313C */, /*12605*/4377/* 313D */,/*12606*/4378/* 313E */,/*12607*/4379/* 313F */,/*12608*/4380/* 3140 */,/*12609*/4381/* 3141 */, /*12610*/4382/* 3142 */,/*12611*/4383/* 3143 */,/*12612*/4384/* 3144 */,/*12613*/4385/* 3145 */,/*12614*/4386/* 3146 */, /*12615*/4387/* 3147 */,/*12616*/4388/* 3148 */,/*12617*/4389/* 3149 */,/*12618*/4390/* 314A */,/*12619*/4391/* 314B */, /*12620*/4392/* 314C */,/*12621*/4393/* 314D */,/*12622*/4394/* 314E */,/*12623*/4395/* 314F */,/*12624*/4396/* 3150 */, /*12625*/4397/* 3151 */,/*12626*/4398/* 3152 */,/*12627*/4399/* 3153 */,/*12628*/4400/* 3154 */,/*12629*/4401/* 3155 */, /*12630*/4402/* 3156 */,/*12631*/4403/* 3157 */,/*12632*/4404/* 3158 */,/*12633*/4405/* 3159 */,/*12634*/4406/* 315A */, /*12635*/4407/* 315B */,/*12636*/4408/* 315C */,/*12637*/4409/* 315D */,/*12638*/4410/* 315E */,/*12639*/4411/* 315F */, /*12640*/4412/* 3160 */,/*12641*/4413/* 3161 */,/*12642*/4414/* 3162 */,/*12643*/4415/* 3163 */,/*12644*/4416/* 3164 */, /*12645*/4417/* 3165 */,/*12646*/4418/* 3166 */,/*12647*/4419/* 3167 */,/*12648*/4420/* 3168 */,/*12649*/4421/* 3169 */, /*12650*/4422/* 316A */,/*12651*/4423/* 316B */,/*12652*/4424/* 316C */,/*12653*/4425/* 316D */,/*12654*/4426/* 316E */, /*12655*/4427/* 316F */,/*12656*/4428/* 3170 */,/*12657*/4429/* 3171 */,/*12658*/4430/* 3172 */,/*12659*/4431/* 3173 */, /*12660*/4432/* 3174 */,/*12661*/4433/* 3175 */,/*12662*/4434/* 3176 */,/*12663*/4435/* 3177 */,/*12664*/4436/* 3178 */, /*12665*/4437/* 3179 */,/*12666*/4438/* 317A */,/*12667*/4439/* 317B */,/*12668*/4440/* 317C */,/*12669*/4441/* 317D */, /*12670*/4442/* 317E */,/*12671*/4443/* 317F */,/*12672*/4444/* 3180 */,/*12673*/4445/* 3181 */,/*12674*/4446/* 3182 */, /*12675*/4447/* 3183 */,/*12676*/4448/* 3184 */,/*12677*/4449/* 3185 */,/*12678*/4450/* 3186 */,/*12679*/4451/* 3187 */, /*12680*/4452/* 3188 */,/*12681*/4453/* 3189 */,/*12682*/4454/* 318A */,/*12683*/4455/* 318B */,/*12684*/4456/* 318C */, /*12685*/4457/* 318D */,/*12686*/4458/* 318E */,0,/*12688*/4459/* 3190 */,/*12689*/4459/* 3191 */, /*12690*/4460/* 3192 */,/*12691*/4461/* 3193 */,/*12692*/4462/* 3194 */,/*12693*/4463/* 3195 */,/*12694*/4464/* 3196 */, /*12695*/4465/* 3197 */,/*12696*/4466/* 3198 */,/*12697*/4467/* 3199 */,/*12698*/4468/* 319A */,/*12699*/4469/* 319B */, /*12700*/4470/* 319C */,/*12701*/4471/* 319D */,/*12702*/4472/* 319E */,/*12703*/4473/* 319F */,/*12704*/4474/* 31A0 */, /*12705*/4474/* 31A1 */,/*12706*/4474/* 31A2 */,/*12707*/4474/* 31A3 */,/*12708*/4474/* 31A4 */,/*12709*/4474/* 31A5 */, /*12710*/4474/* 31A6 */,/*12711*/4474/* 31A7 */,/*12712*/4474/* 31A8 */,/*12713*/4474/* 31A9 */,/*12714*/4474/* 31AA */, /*12715*/4474/* 31AB */,/*12716*/4474/* 31AC */,/*12717*/4474/* 31AD */,/*12718*/4474/* 31AE */,/*12719*/4474/* 31AF */, /*12720*/4474/* 31B0 */,/*12721*/4474/* 31B1 */,/*12722*/4474/* 31B2 */,/*12723*/4474/* 31B3 */,/*12724*/4474/* 31B4 */, /*12725*/4474/* 31B5 */,/*12726*/4474/* 31B6 */,/*12727*/4474/* 31B7 */,/*12728*/4475/* 31B8 */,/*12729*/4475/* 31B9 */, /*12730*/4475/* 31BA */,0,0,0,0,0,/*12736*/4476/* 31C0 */,/*12737*/4476/* 31C1 */,/*12738*/4476/* 31C2 */, /*12739*/4476/* 31C3 */,/*12740*/4476/* 31C4 */,/*12741*/4476/* 31C5 */,/*12742*/4476/* 31C6 */,/*12743*/4476/* 31C7 */, /*12744*/4476/* 31C8 */,/*12745*/4476/* 31C9 */,/*12746*/4476/* 31CA */,/*12747*/4476/* 31CB */,/*12748*/4476/* 31CC */, /*12749*/4476/* 31CD */,/*12750*/4476/* 31CE */,/*12751*/4476/* 31CF */,/*12752*/4477/* 31D0 */,/*12753*/4477/* 31D1 */, /*12754*/4477/* 31D2 */,/*12755*/4477/* 31D3 */,/*12756*/4477/* 31D4 */,/*12757*/4477/* 31D5 */,/*12758*/4477/* 31D6 */, /*12759*/4477/* 31D7 */,/*12760*/4477/* 31D8 */,/*12761*/4477/* 31D9 */,/*12762*/4477/* 31DA */,/*12763*/4477/* 31DB */, /*12764*/4477/* 31DC */,/*12765*/4477/* 31DD */,/*12766*/4477/* 31DE */,/*12767*/4477/* 31DF */,/*12768*/4477/* 31E0 */, /*12769*/4477/* 31E1 */,/*12770*/4477/* 31E2 */,/*12771*/4477/* 31E3 */,0,0,0,0,0,0,0,0,0,0,0,0,/*12784*/4478/* 31F0 */, /*12785*/4478/* 31F1 */,/*12786*/4478/* 31F2 */,/*12787*/4478/* 31F3 */,/*12788*/4478/* 31F4 */,/*12789*/4478/* 31F5 */, /*12790*/4478/* 31F6 */,/*12791*/4478/* 31F7 */,/*12792*/4478/* 31F8 */,/*12793*/4478/* 31F9 */,/*12794*/4478/* 31FA */, /*12795*/4478/* 31FB */,/*12796*/4478/* 31FC */,/*12797*/4478/* 31FD */,/*12798*/4478/* 31FE */,/*12799*/4478/* 31FF */, /*12800*/4479/* 3200 */,/*12801*/4480/* 3201 */,/*12802*/4481/* 3202 */,/*12803*/4482/* 3203 */,/*12804*/4483/* 3204 */, /*12805*/4484/* 3205 */,/*12806*/4485/* 3206 */,/*12807*/4486/* 3207 */,/*12808*/4487/* 3208 */,/*12809*/4488/* 3209 */, /*12810*/4489/* 320A */,/*12811*/4490/* 320B */,/*12812*/4491/* 320C */,/*12813*/4492/* 320D */,/*12814*/4493/* 320E */, /*12815*/4494/* 320F */,/*12816*/4495/* 3210 */,/*12817*/4496/* 3211 */,/*12818*/4497/* 3212 */,/*12819*/4498/* 3213 */, /*12820*/4499/* 3214 */,/*12821*/4500/* 3215 */,/*12822*/4501/* 3216 */,/*12823*/4502/* 3217 */,/*12824*/4503/* 3218 */, /*12825*/4504/* 3219 */,/*12826*/4505/* 321A */,/*12827*/4506/* 321B */,/*12828*/4507/* 321C */,/*12829*/4508/* 321D */, /*12830*/4509/* 321E */,0,/*12832*/4510/* 3220 */,/*12833*/4511/* 3221 */,/*12834*/4512/* 3222 */, /*12835*/4513/* 3223 */,/*12836*/4514/* 3224 */,/*12837*/4515/* 3225 */,/*12838*/4516/* 3226 */,/*12839*/4517/* 3227 */, /*12840*/4518/* 3228 */,/*12841*/4519/* 3229 */,/*12842*/4520/* 322A */,/*12843*/4521/* 322B */,/*12844*/4522/* 322C */, /*12845*/4523/* 322D */,/*12846*/4524/* 322E */,/*12847*/4525/* 322F */,/*12848*/4526/* 3230 */,/*12849*/4527/* 3231 */, /*12850*/4528/* 3232 */,/*12851*/4529/* 3233 */,/*12852*/4530/* 3234 */,/*12853*/4531/* 3235 */,/*12854*/4532/* 3236 */, /*12855*/4533/* 3237 */,/*12856*/4534/* 3238 */,/*12857*/4535/* 3239 */,/*12858*/4536/* 323A */,/*12859*/4537/* 323B */, /*12860*/4538/* 323C */,/*12861*/4539/* 323D */,/*12862*/4540/* 323E */,/*12863*/4541/* 323F */,/*12864*/4542/* 3240 */, /*12865*/4543/* 3241 */,/*12866*/4544/* 3242 */,/*12867*/4545/* 3243 */,/*12868*/4546/* 3244 */,/*12869*/4547/* 3245 */, /*12870*/4548/* 3246 */,/*12871*/4549/* 3247 */,/*12872*/4550/* 3248 */,/*12873*/4551/* 3249 */,/*12874*/4552/* 324A */, /*12875*/4553/* 324B */,/*12876*/4554/* 324C */,/*12877*/4555/* 324D */,/*12878*/4556/* 324E */,/*12879*/4557/* 324F */, /*12880*/4558/* 3250 */,/*12881*/4559/* 3251 */,/*12882*/4560/* 3252 */,/*12883*/4561/* 3253 */,/*12884*/4562/* 3254 */, /*12885*/4563/* 3255 */,/*12886*/4564/* 3256 */,/*12887*/4565/* 3257 */,/*12888*/4566/* 3258 */,/*12889*/4567/* 3259 */, /*12890*/4568/* 325A */,/*12891*/4569/* 325B */,/*12892*/4570/* 325C */,/*12893*/4571/* 325D */,/*12894*/4572/* 325E */, /*12895*/4573/* 325F */,/*12896*/4574/* 3260 */,/*12897*/4575/* 3261 */,/*12898*/4576/* 3262 */,/*12899*/4577/* 3263 */, /*12900*/4578/* 3264 */,/*12901*/4579/* 3265 */,/*12902*/4580/* 3266 */,/*12903*/4581/* 3267 */,/*12904*/4582/* 3268 */, /*12905*/4583/* 3269 */,/*12906*/4584/* 326A */,/*12907*/4585/* 326B */,/*12908*/4586/* 326C */,/*12909*/4587/* 326D */, /*12910*/4588/* 326E */,/*12911*/4589/* 326F */,/*12912*/4590/* 3270 */,/*12913*/4591/* 3271 */,/*12914*/4592/* 3272 */, /*12915*/4593/* 3273 */,/*12916*/4594/* 3274 */,/*12917*/4595/* 3275 */,/*12918*/4596/* 3276 */,/*12919*/4597/* 3277 */, /*12920*/4598/* 3278 */,/*12921*/4599/* 3279 */,/*12922*/4600/* 327A */,/*12923*/4601/* 327B */,/*12924*/4602/* 327C */, /*12925*/4603/* 327D */,/*12926*/4604/* 327E */,/*12927*/4605/* 327F */,/*12928*/4606/* 3280 */,/*12929*/4607/* 3281 */, /*12930*/4608/* 3282 */,/*12931*/4609/* 3283 */,/*12932*/4610/* 3284 */,/*12933*/4611/* 3285 */,/*12934*/4612/* 3286 */, /*12935*/4613/* 3287 */,/*12936*/4614/* 3288 */,/*12937*/4615/* 3289 */,/*12938*/4616/* 328A */,/*12939*/4617/* 328B */, /*12940*/4618/* 328C */,/*12941*/4619/* 328D */,/*12942*/4620/* 328E */,/*12943*/4621/* 328F */,/*12944*/4622/* 3290 */, /*12945*/4623/* 3291 */,/*12946*/4624/* 3292 */,/*12947*/4625/* 3293 */,/*12948*/4626/* 3294 */,/*12949*/4627/* 3295 */, /*12950*/4628/* 3296 */,/*12951*/4629/* 3297 */,/*12952*/4630/* 3298 */,/*12953*/4631/* 3299 */,/*12954*/4632/* 329A */, /*12955*/4633/* 329B */,/*12956*/4634/* 329C */,/*12957*/4635/* 329D */,/*12958*/4636/* 329E */,/*12959*/4637/* 329F */, /*12960*/4638/* 32A0 */,/*12961*/4639/* 32A1 */,/*12962*/4640/* 32A2 */,/*12963*/4641/* 32A3 */,/*12964*/4642/* 32A4 */, /*12965*/4643/* 32A5 */,/*12966*/4644/* 32A6 */,/*12967*/4645/* 32A7 */,/*12968*/4646/* 32A8 */,/*12969*/4647/* 32A9 */, /*12970*/4648/* 32AA */,/*12971*/4649/* 32AB */,/*12972*/4650/* 32AC */,/*12973*/4651/* 32AD */,/*12974*/4652/* 32AE */, /*12975*/4653/* 32AF */,/*12976*/4654/* 32B0 */,/*12977*/4655/* 32B1 */,/*12978*/4656/* 32B2 */,/*12979*/4657/* 32B3 */, /*12980*/4658/* 32B4 */,/*12981*/4659/* 32B5 */,/*12982*/4660/* 32B6 */,/*12983*/4661/* 32B7 */,/*12984*/4662/* 32B8 */, /*12985*/4663/* 32B9 */,/*12986*/4664/* 32BA */,/*12987*/4665/* 32BB */,/*12988*/4666/* 32BC */,/*12989*/4667/* 32BD */, /*12990*/4668/* 32BE */,/*12991*/4669/* 32BF */,/*12992*/4670/* 32C0 */,/*12993*/4671/* 32C1 */,/*12994*/4672/* 32C2 */, /*12995*/4673/* 32C3 */,/*12996*/4674/* 32C4 */,/*12997*/4675/* 32C5 */,/*12998*/4676/* 32C6 */,/*12999*/4677/* 32C7 */, /*13000*/4678/* 32C8 */,/*13001*/4679/* 32C9 */,/*13002*/4680/* 32CA */,/*13003*/4681/* 32CB */,/*13004*/4682/* 32CC */, /*13005*/4683/* 32CD */,/*13006*/4684/* 32CE */,/*13007*/4685/* 32CF */,/*13008*/4686/* 32D0 */,/*13009*/4687/* 32D1 */, /*13010*/4688/* 32D2 */,/*13011*/4689/* 32D3 */,/*13012*/4690/* 32D4 */,/*13013*/4691/* 32D5 */,/*13014*/4692/* 32D6 */, /*13015*/4693/* 32D7 */,/*13016*/4694/* 32D8 */,/*13017*/4695/* 32D9 */,/*13018*/4696/* 32DA */,/*13019*/4697/* 32DB */, /*13020*/4698/* 32DC */,/*13021*/4699/* 32DD */,/*13022*/4700/* 32DE */,/*13023*/4701/* 32DF */,/*13024*/4702/* 32E0 */, /*13025*/4703/* 32E1 */,/*13026*/4704/* 32E2 */,/*13027*/4705/* 32E3 */,/*13028*/4706/* 32E4 */,/*13029*/4707/* 32E5 */, /*13030*/4708/* 32E6 */,/*13031*/4709/* 32E7 */,/*13032*/4710/* 32E8 */,/*13033*/4711/* 32E9 */,/*13034*/4712/* 32EA */, /*13035*/4713/* 32EB */,/*13036*/4714/* 32EC */,/*13037*/4715/* 32ED */,/*13038*/4716/* 32EE */,/*13039*/4717/* 32EF */, /*13040*/4718/* 32F0 */,/*13041*/4719/* 32F1 */,/*13042*/4720/* 32F2 */,/*13043*/4721/* 32F3 */,/*13044*/4722/* 32F4 */, /*13045*/4723/* 32F5 */,/*13046*/4724/* 32F6 */,/*13047*/4725/* 32F7 */,/*13048*/4726/* 32F8 */,/*13049*/4727/* 32F9 */, /*13050*/4728/* 32FA */,/*13051*/4729/* 32FB */,/*13052*/4730/* 32FC */,/*13053*/4731/* 32FD */,/*13054*/4732/* 32FE */, 0,/*13056*/4733/* 3300 */,/*13057*/4734/* 3301 */,/*13058*/4735/* 3302 */,/*13059*/4736/* 3303 */, /*13060*/4737/* 3304 */,/*13061*/4738/* 3305 */,/*13062*/4739/* 3306 */,/*13063*/4740/* 3307 */,/*13064*/4741/* 3308 */, /*13065*/4742/* 3309 */,/*13066*/4743/* 330A */,/*13067*/4744/* 330B */,/*13068*/4745/* 330C */,/*13069*/4746/* 330D */, /*13070*/4747/* 330E */,/*13071*/4748/* 330F */,/*13072*/4749/* 3310 */,/*13073*/4750/* 3311 */,/*13074*/4751/* 3312 */, /*13075*/4752/* 3313 */,/*13076*/4753/* 3314 */,/*13077*/4754/* 3315 */,/*13078*/4755/* 3316 */,/*13079*/4756/* 3317 */, /*13080*/4757/* 3318 */,/*13081*/4758/* 3319 */,/*13082*/4759/* 331A */,/*13083*/4760/* 331B */,/*13084*/4761/* 331C */, /*13085*/4762/* 331D */,/*13086*/4763/* 331E */,/*13087*/4764/* 331F */,/*13088*/4765/* 3320 */,/*13089*/4766/* 3321 */, /*13090*/4767/* 3322 */,/*13091*/4768/* 3323 */,/*13092*/4769/* 3324 */,/*13093*/4770/* 3325 */,/*13094*/4771/* 3326 */, /*13095*/4772/* 3327 */,/*13096*/4773/* 3328 */,/*13097*/4774/* 3329 */,/*13098*/4775/* 332A */,/*13099*/4776/* 332B */, /*13100*/4777/* 332C */,/*13101*/4778/* 332D */,/*13102*/4779/* 332E */,/*13103*/4780/* 332F */,/*13104*/4781/* 3330 */, /*13105*/4782/* 3331 */,/*13106*/4783/* 3332 */,/*13107*/4784/* 3333 */,/*13108*/4785/* 3334 */,/*13109*/4786/* 3335 */, /*13110*/4787/* 3336 */,/*13111*/4788/* 3337 */,/*13112*/4789/* 3338 */,/*13113*/4790/* 3339 */,/*13114*/4791/* 333A */, /*13115*/4792/* 333B */,/*13116*/4793/* 333C */,/*13117*/4794/* 333D */,/*13118*/4795/* 333E */,/*13119*/4796/* 333F */, /*13120*/4797/* 3340 */,/*13121*/4798/* 3341 */,/*13122*/4799/* 3342 */,/*13123*/4800/* 3343 */,/*13124*/4801/* 3344 */, /*13125*/4802/* 3345 */,/*13126*/4803/* 3346 */,/*13127*/4804/* 3347 */,/*13128*/4805/* 3348 */,/*13129*/4806/* 3349 */, /*13130*/4807/* 334A */,/*13131*/4808/* 334B */,/*13132*/4809/* 334C */,/*13133*/4810/* 334D */,/*13134*/4811/* 334E */, /*13135*/4812/* 334F */,/*13136*/4813/* 3350 */,/*13137*/4814/* 3351 */,/*13138*/4815/* 3352 */,/*13139*/4816/* 3353 */, /*13140*/4817/* 3354 */,/*13141*/4818/* 3355 */,/*13142*/4819/* 3356 */,/*13143*/4820/* 3357 */,/*13144*/4821/* 3358 */, /*13145*/4822/* 3359 */,/*13146*/4823/* 335A */,/*13147*/4824/* 335B */,/*13148*/4825/* 335C */,/*13149*/4826/* 335D */, /*13150*/4827/* 335E */,/*13151*/4828/* 335F */,/*13152*/4829/* 3360 */,/*13153*/4830/* 3361 */,/*13154*/4831/* 3362 */, /*13155*/4832/* 3363 */,/*13156*/4833/* 3364 */,/*13157*/4834/* 3365 */,/*13158*/4835/* 3366 */,/*13159*/4836/* 3367 */, /*13160*/4837/* 3368 */,/*13161*/4838/* 3369 */,/*13162*/4839/* 336A */,/*13163*/4840/* 336B */,/*13164*/4841/* 336C */, /*13165*/4842/* 336D */,/*13166*/4843/* 336E */,/*13167*/4844/* 336F */,/*13168*/4845/* 3370 */,/*13169*/4846/* 3371 */, /*13170*/4847/* 3372 */,/*13171*/4848/* 3373 */,/*13172*/4849/* 3374 */,/*13173*/4850/* 3375 */,/*13174*/4851/* 3376 */, /*13175*/4852/* 3377 */,/*13176*/4853/* 3378 */,/*13177*/4854/* 3379 */,/*13178*/4855/* 337A */,/*13179*/4856/* 337B */, /*13180*/4857/* 337C */,/*13181*/4858/* 337D */,/*13182*/4859/* 337E */,/*13183*/4860/* 337F */,/*13184*/4861/* 3380 */, /*13185*/4862/* 3381 */,/*13186*/4863/* 3382 */,/*13187*/4864/* 3383 */,/*13188*/4865/* 3384 */,/*13189*/4866/* 3385 */, /*13190*/4867/* 3386 */,/*13191*/4868/* 3387 */,/*13192*/4869/* 3388 */,/*13193*/4870/* 3389 */,/*13194*/4871/* 338A */, /*13195*/4872/* 338B */,/*13196*/4873/* 338C */,/*13197*/4874/* 338D */,/*13198*/4875/* 338E */,/*13199*/4876/* 338F */, /*13200*/4877/* 3390 */,/*13201*/4878/* 3391 */,/*13202*/4879/* 3392 */,/*13203*/4880/* 3393 */,/*13204*/4881/* 3394 */, /*13205*/4882/* 3395 */,/*13206*/4883/* 3396 */,/*13207*/4884/* 3397 */,/*13208*/4885/* 3398 */,/*13209*/4886/* 3399 */, /*13210*/4887/* 339A */,/*13211*/4888/* 339B */,/*13212*/4889/* 339C */,/*13213*/4890/* 339D */,/*13214*/4891/* 339E */, /*13215*/4892/* 339F */,/*13216*/4893/* 33A0 */,/*13217*/4894/* 33A1 */,/*13218*/4895/* 33A2 */,/*13219*/4896/* 33A3 */, /*13220*/4897/* 33A4 */,/*13221*/4898/* 33A5 */,/*13222*/4899/* 33A6 */,/*13223*/4900/* 33A7 */,/*13224*/4901/* 33A8 */, /*13225*/4902/* 33A9 */,/*13226*/4903/* 33AA */,/*13227*/4904/* 33AB */,/*13228*/4905/* 33AC */,/*13229*/4906/* 33AD */, /*13230*/4907/* 33AE */,/*13231*/4908/* 33AF */,/*13232*/4909/* 33B0 */,/*13233*/4910/* 33B1 */,/*13234*/4911/* 33B2 */, /*13235*/4912/* 33B3 */,/*13236*/4913/* 33B4 */,/*13237*/4914/* 33B5 */,/*13238*/4915/* 33B6 */,/*13239*/4916/* 33B7 */, /*13240*/4917/* 33B8 */,/*13241*/4918/* 33B9 */,/*13242*/4919/* 33BA */,/*13243*/4920/* 33BB */,/*13244*/4921/* 33BC */, /*13245*/4922/* 33BD */,/*13246*/4923/* 33BE */,/*13247*/4924/* 33BF */,/*13248*/4925/* 33C0 */,/*13249*/4926/* 33C1 */, /*13250*/4927/* 33C2 */,/*13251*/4928/* 33C3 */,/*13252*/4929/* 33C4 */,/*13253*/4930/* 33C5 */,/*13254*/4931/* 33C6 */, /*13255*/4932/* 33C7 */,/*13256*/4933/* 33C8 */,/*13257*/4934/* 33C9 */,/*13258*/4935/* 33CA */,/*13259*/4936/* 33CB */, /*13260*/4937/* 33CC */,/*13261*/4938/* 33CD */,/*13262*/4939/* 33CE */,/*13263*/4940/* 33CF */,/*13264*/4941/* 33D0 */, /*13265*/4942/* 33D1 */,/*13266*/4943/* 33D2 */,/*13267*/4944/* 33D3 */,/*13268*/4945/* 33D4 */,/*13269*/4946/* 33D5 */, /*13270*/4947/* 33D6 */,/*13271*/4948/* 33D7 */,/*13272*/4949/* 33D8 */,/*13273*/4950/* 33D9 */,/*13274*/4951/* 33DA */, /*13275*/4952/* 33DB */,/*13276*/4953/* 33DC */,/*13277*/4954/* 33DD */,/*13278*/4955/* 33DE */,/*13279*/4956/* 33DF */, /*13280*/4957/* 33E0 */,/*13281*/4958/* 33E1 */,/*13282*/4959/* 33E2 */,/*13283*/4960/* 33E3 */,/*13284*/4961/* 33E4 */, /*13285*/4962/* 33E5 */,/*13286*/4963/* 33E6 */,/*13287*/4964/* 33E7 */,/*13288*/4965/* 33E8 */,/*13289*/4966/* 33E9 */, /*13290*/4967/* 33EA */,/*13291*/4968/* 33EB */,/*13292*/4969/* 33EC */,/*13293*/4970/* 33ED */,/*13294*/4971/* 33EE */, /*13295*/4972/* 33EF */,/*13296*/4973/* 33F0 */,/*13297*/4974/* 33F1 */,/*13298*/4975/* 33F2 */,/*13299*/4976/* 33F3 */, /*13300*/4977/* 33F4 */,/*13301*/4978/* 33F5 */,/*13302*/4979/* 33F6 */,/*13303*/4980/* 33F7 */,/*13304*/4981/* 33F8 */, /*13305*/4982/* 33F9 */,/*13306*/4983/* 33FA */,/*13307*/4984/* 33FB */,/*13308*/4985/* 33FC */,/*13309*/4986/* 33FD */, /*13310*/4987/* 33FE */,/*13311*/4988/* 33FF */,/*13312*/4989/* 3400 */,/*13313*/4989/*3401 */,/*13314*/4989/*3402 */, /*13315*/4989/*3403 */,/*13316*/4989/*3404 */,/*13317*/4990/* 3405 */,/*13318*/4989/* 3406 */,/*13319*/4991/* 3483 */, /*13320*/4989/* 3484 */,/*13321*/4990/* 382A */,/*13322*/4989/* 382B */,/*13323*/4992/* 3B4D */,/*13324*/4989/* 3B4E */, 0,0,0,0,0,0,0,0,0,0,/*13335*/4993/* 4DC0 */,/*13336*/4993/* 4DC1 */,/*13337*/4993/* 4DC2 */,/*13338*/4993/* 4DC3 */, /*13339*/4993/* 4DC4 */,/*13340*/4993/* 4DC5 */,/*13341*/4993/* 4DC6 */,/*13342*/4993/* 4DC7 */,/*13343*/4993/* 4DC8 */, /*13344*/4993/* 4DC9 */,/*13345*/4993/* 4DCA */,/*13346*/4993/* 4DCB */,/*13347*/4993/* 4DCC */,/*13348*/4993/* 4DCD */, /*13349*/4993/* 4DCE */,/*13350*/4993/* 4DCF */,/*13351*/4993/* 4DD0 */,/*13352*/4993/* 4DD1 */,/*13353*/4993/* 4DD2 */, /*13354*/4993/* 4DD3 */,/*13355*/4993/* 4DD4 */,/*13356*/4993/* 4DD5 */,/*13357*/4993/* 4DD6 */,/*13358*/4993/* 4DD7 */, /*13359*/4993/* 4DD8 */,/*13360*/4993/* 4DD9 */,/*13361*/4993/* 4DDA */,/*13362*/4993/* 4DDB */,/*13363*/4993/* 4DDC */, /*13364*/4993/* 4DDD */,/*13365*/4993/* 4DDE */,/*13366*/4993/* 4DDF */,/*13367*/4993/* 4DE0 */,/*13368*/4993/* 4DE1 */, /*13369*/4993/* 4DE2 */,/*13370*/4993/* 4DE3 */,/*13371*/4993/* 4DE4 */,/*13372*/4993/* 4DE5 */,/*13373*/4993/* 4DE6 */, /*13374*/4993/* 4DE7 */,/*13375*/4993/* 4DE8 */,/*13376*/4993/* 4DE9 */,/*13377*/4993/* 4DEA */,/*13378*/4993/* 4DEB */, /*13379*/4993/* 4DEC */,/*13380*/4993/* 4DED */,/*13381*/4993/* 4DEE */,/*13382*/4993/* 4DEF */,/*13383*/4993/* 4DF0 */, /*13384*/4993/* 4DF1 */,/*13385*/4993/* 4DF2 */,/*13386*/4993/* 4DF3 */,/*13387*/4993/* 4DF4 */,/*13388*/4993/* 4DF5 */, /*13389*/4993/* 4DF6 */,/*13390*/4993/* 4DF7 */,/*13391*/4993/* 4DF8 */,/*13392*/4993/* 4DF9 */,/*13393*/4993/* 4DFA */, /*13394*/4993/* 4DFB */,/*13395*/4993/* 4DFC */,/*13396*/4993/* 4DFD */,/*13397*/4993/* 4DFE */,/*13398*/4993/* 4DFF */, /*13399*/4994/* 4E00 */,/*13400*/4995/* 4E01 */,/*13401*/4995/*4E02 */,/*13402*/4996/* 4E03 */,/*13403*/4995/* 4E04 */, /*13404*/4995/*4E05 */,/*13405*/4995/*4E06 */,/*13406*/4997/* 4E07 */,/*13407*/4995/* 4E08 */,/*13408*/4998/* 4E09 */, /*13409*/4995/* 4E0A */,/*13410*/4995/*4E0B */,/*13411*/4995/*4E0C */,/*13412*/4995/*4E0D */,/*13413*/4995/*4E0E */, /*13414*/4995/*4E0F */,/*13415*/4995/*4E10 */,/*13416*/4995/*4E11 */,/*13417*/4995/*4E12 */,/*13418*/4995/*4E13 */, /*13419*/4995/*4E14 */,/*13420*/4995/*4E15 */,/*13421*/4995/*4E16 */,/*13422*/4995/*4E17 */,/*13423*/4995/*4E18 */, /*13424*/4995/*4E19 */,/*13425*/4995/*4E1A */,/*13426*/4995/*4E1B */,/*13427*/4995/*4E1C */,/*13428*/4995/*4E1D */, /*13429*/4995/*4E1E */,/*13430*/4995/*4E1F */,/*13431*/4995/*4E20 */,/*13432*/4995/*4E21 */,/*13433*/4995/*4E22 */, /*13434*/4995/*4E23 */,/*13435*/4995/*4E24 */,/*13436*/4995/*4E25 */,/*13437*/4995/*4E26 */,/*13438*/4995/*4E27 */, /*13439*/4995/*4E28 */,/*13440*/4995/*4E29 */,/*13441*/4995/*4E2A */,/*13442*/4995/*4E2B */,/*13443*/4995/*4E2C */, /*13444*/4995/*4E2D */,/*13445*/4995/*4E2E */,/*13446*/4995/*4E2F */,/*13447*/4995/*4E30 */,/*13448*/4995/*4E31 */, /*13449*/4995/*4E32 */,/*13450*/4995/*4E33 */,/*13451*/4995/*4E34 */,/*13452*/4995/*4E35 */,/*13453*/4995/*4E36 */, /*13454*/4995/*4E37 */,/*13455*/4995/*4E38 */,/*13456*/4995/*4E39 */,/*13457*/4995/*4E3A */,/*13458*/4995/*4E3B */, /*13459*/4995/*4E3C */,/*13460*/4995/*4E3D */,/*13461*/4995/*4E3E */,/*13462*/4995/*4E3F */,/*13463*/4995/*4E40 */, /*13464*/4995/*4E41 */,/*13465*/4995/*4E42 */,/*13466*/4995/*4E43 */,/*13467*/4995/*4E44 */,/*13468*/4995/*4E45 */, /*13469*/4995/*4E46 */,/*13470*/4995/*4E47 */,/*13471*/4995/*4E48 */,/*13472*/4995/*4E49 */,/*13473*/4995/*4E4A */, /*13474*/4995/*4E4B */,/*13475*/4995/*4E4C */,/*13476*/4995/*4E4D */,/*13477*/4995/*4E4E */,/*13478*/4995/*4E4F */, /*13479*/4995/*4E50 */,/*13480*/4995/*4E51 */,/*13481*/4995/*4E52 */,/*13482*/4995/*4E53 */,/*13483*/4995/*4E54 */, /*13484*/4995/*4E55 */,/*13485*/4995/*4E56 */,/*13486*/4995/*4E57 */,/*13487*/4995/*4E58 */,/*13488*/4995/*4E59 */, /*13489*/4995/*4E5A */,/*13490*/4995/*4E5B */,/*13491*/4995/*4E5C */,/*13492*/4999/* 4E5D */,/*13493*/4995/* 4E5E */, /*13494*/4995/*4E5F */,/*13495*/4995/*4E60 */,/*13496*/4995/*4E61 */,/*13497*/4995/*4E62 */,/*13498*/4995/*4E63 */, /*13499*/4995/*4E64 */,/*13500*/4995/*4E65 */,/*13501*/4995/*4E66 */,/*13502*/4995/*4E67 */,/*13503*/4995/*4E68 */, /*13504*/4995/*4E69 */,/*13505*/4995/*4E6A */,/*13506*/4995/*4E6B */,/*13507*/4995/*4E6C */,/*13508*/4995/*4E6D */, /*13509*/4995/*4E6E */,/*13510*/4995/*4E6F */,/*13511*/4995/*4E70 */,/*13512*/4995/*4E71 */,/*13513*/4995/*4E72 */, /*13514*/4995/*4E73 */,/*13515*/4995/*4E74 */,/*13516*/4995/*4E75 */,/*13517*/4995/*4E76 */,/*13518*/4995/*4E77 */, /*13519*/4995/*4E78 */,/*13520*/4995/*4E79 */,/*13521*/4995/*4E7A */,/*13522*/4995/*4E7B */,/*13523*/4995/*4E7C */, /*13524*/4995/*4E7D */,/*13525*/4995/*4E7E */,/*13526*/4995/*4E7F */,/*13527*/4995/*4E80 */,/*13528*/4995/*4E81 */, /*13529*/4995/*4E82 */,/*13530*/4995/*4E83 */,/*13531*/4995/*4E84 */,/*13532*/4995/*4E85 */,/*13533*/4995/*4E86 */, /*13534*/4995/*4E87 */,/*13535*/4995/*4E88 */,/*13536*/4995/*4E89 */,/*13537*/4995/*4E8A */,/*13538*/4995/*4E8B */, /*13539*/5000/* 4E8C */,/*13540*/4995/* 4E8D */,/*13541*/4995/*4E8E */,/*13542*/4995/*4E8F */,/*13543*/4995/*4E90 */, /*13544*/4995/*4E91 */,/*13545*/4995/*4E92 */,/*13546*/4995/*4E93 */,/*13547*/5001/* 4E94 */,/*13548*/4995/* 4E95 */, /*13549*/5002/* 4E96 */,/*13550*/4995/* 4E97 */,/*13551*/4995/*4E98 */,/*13552*/4995/*4E99 */,/*13553*/4995/*4E9A */, /*13554*/4995/*4E9B */,/*13555*/4995/*4E9C */,/*13556*/4995/*4E9D */,/*13557*/4995/*4E9E */,/*13558*/4995/*4E9F */, /*13559*/4995/*4EA0 */,/*13560*/4995/*4EA1 */,/*13561*/4995/*4EA2 */,/*13562*/4995/*4EA3 */,/*13563*/4995/*4EA4 */, /*13564*/4995/*4EA5 */,/*13565*/4995/*4EA6 */,/*13566*/4995/*4EA7 */,/*13567*/4995/*4EA8 */,/*13568*/4995/*4EA9 */, /*13569*/4995/*4EAA */,/*13570*/4995/*4EAB */,/*13571*/4995/*4EAC */,/*13572*/4995/*4EAD */,/*13573*/4995/*4EAE */, /*13574*/4995/*4EAF */,/*13575*/4995/*4EB0 */,/*13576*/4995/*4EB1 */,/*13577*/4995/*4EB2 */,/*13578*/4995/*4EB3 */, /*13579*/4995/*4EB4 */,/*13580*/4995/*4EB5 */,/*13581*/4995/*4EB6 */,/*13582*/4995/*4EB7 */,/*13583*/4995/*4EB8 */, /*13584*/4995/*4EB9 */,/*13585*/4995/*4EBA */,/*13586*/4995/*4EBB */,/*13587*/4995/*4EBC */,/*13588*/4995/*4EBD */, /*13589*/4995/*4EBE */,/*13590*/5003/* 4EBF */,/*13591*/5004/* 4EC0 */,/*13592*/4995/* 4EC1 */,/*13593*/4995/*4EC2 */, /*13594*/4995/*4EC3 */,/*13595*/4995/*4EC4 */,/*13596*/4995/*4EC5 */,/*13597*/4995/*4EC6 */,/*13598*/4995/*4EC7 */, /*13599*/4995/*4EC8 */,/*13600*/4995/*4EC9 */,/*13601*/4995/*4ECA */,/*13602*/4995/*4ECB */,/*13603*/4995/*4ECC */, /*13604*/4995/*4ECD */,/*13605*/4995/*4ECE */,/*13606*/4995/*4ECF */,/*13607*/4995/*4ED0 */,/*13608*/4995/*4ED1 */, /*13609*/4995/*4ED2 */,/*13610*/4995/*4ED3 */,/*13611*/4995/*4ED4 */,/*13612*/4995/*4ED5 */,/*13613*/4995/*4ED6 */, /*13614*/4995/*4ED7 */,/*13615*/4995/*4ED8 */,/*13616*/4995/*4ED9 */,/*13617*/4995/*4EDA */,/*13618*/4995/*4EDB */, /*13619*/4995/*4EDC */,/*13620*/4995/*4EDD */,/*13621*/4995/*4EDE */,/*13622*/5005/* 4EDF */,/*13623*/4995/* 4EE0 */, /*13624*/4995/*4EE1 */,/*13625*/4995/*4EE2 */,/*13626*/4995/*4EE3 */,/*13627*/4995/*4EE4 */,/*13628*/4995/*4EE5 */, /*13629*/4995/*4EE6 */,/*13630*/4995/*4EE7 */,/*13631*/4998/* 4EE8 */,/*13632*/4995/* 4EE9 */,/*13633*/4995/*4EEA */, /*13634*/4995/*4EEB */,/*13635*/4995/*4EEC */,/*13636*/4995/*4EED */,/*13637*/4995/*4EEE */,/*13638*/4995/*4EEF */, /*13639*/4995/*4EF0 */,/*13640*/4995/*4EF1 */,/*13641*/4995/*4EF2 */,/*13642*/4995/*4EF3 */,/*13643*/4995/*4EF4 */, /*13644*/4995/*4EF5 */,/*13645*/4995/*4EF6 */,/*13646*/4995/*4EF7 */,/*13647*/4995/*4EF8 */,/*13648*/4995/*4EF9 */, /*13649*/4995/*4EFA */,/*13650*/4995/*4EFB */,/*13651*/4995/*4EFC */,/*13652*/4995/*4EFD */,/*13653*/4995/*4EFE */, /*13654*/4995/*4EFF */,/*13655*/4995/*4F00 */,/*13656*/4995/*4F01 */,/*13657*/4995/*4F02 */,/*13658*/4995/*4F03 */, /*13659*/4995/*4F04 */,/*13660*/4995/*4F05 */,/*13661*/4995/*4F06 */,/*13662*/4995/*4F07 */,/*13663*/4995/*4F08 */, /*13664*/4995/*4F09 */,/*13665*/4995/*4F0A */,/*13666*/4995/*4F0B */,/*13667*/4995/*4F0C */,/*13668*/5001/* 4F0D */, /*13669*/4995/* 4F0E */,/*13670*/4995/*4F0F */,/*13671*/4995/*4F10 */,/*13672*/4995/*4F11 */,/*13673*/4995/*4F12 */, /*13674*/4995/*4F13 */,/*13675*/4995/*4F14 */,/*13676*/4995/*4F15 */,/*13677*/4995/*4F16 */,/*13678*/4995/*4F17 */, /*13679*/4995/*4F18 */,/*13680*/4995/*4F19 */,/*13681*/4995/*4F1A */,/*13682*/4995/*4F1B */,/*13683*/4995/*4F1C */, /*13684*/4995/*4F1D */,/*13685*/4995/*4F1E */,/*13686*/4995/*4F1F */,/*13687*/4995/*4F20 */,/*13688*/4995/*4F21 */, /*13689*/4995/*4F22 */,/*13690*/4995/*4F23 */,/*13691*/4995/*4F24 */,/*13692*/4995/*4F25 */,/*13693*/4995/*4F26 */, /*13694*/4995/*4F27 */,/*13695*/4995/*4F28 */,/*13696*/4995/*4F29 */,/*13697*/4995/*4F2A */,/*13698*/4995/*4F2B */, /*13699*/4995/*4F2C */,/*13700*/4995/*4F2D */,/*13701*/4995/*4F2E */,/*13702*/4995/*4F2F */,/*13703*/4995/*4F30 */, /*13704*/4995/*4F31 */,/*13705*/4995/*4F32 */,/*13706*/4995/*4F33 */,/*13707*/4995/*4F34 */,/*13708*/4995/*4F35 */, /*13709*/4995/*4F36 */,/*13710*/4995/*4F37 */,/*13711*/4995/*4F38 */,/*13712*/4995/*4F39 */,/*13713*/4995/*4F3A */, /*13714*/4995/*4F3B */,/*13715*/4995/*4F3C */,/*13716*/4995/*4F3D */,/*13717*/4995/*4F3E */,/*13718*/4995/*4F3F */, /*13719*/4995/*4F40 */,/*13720*/4995/*4F41 */,/*13721*/4995/*4F42 */,/*13722*/4995/*4F43 */,/*13723*/4995/*4F44 */, /*13724*/4995/*4F45 */,/*13725*/4995/*4F46 */,/*13726*/4995/*4F47 */,/*13727*/4995/*4F48 */,/*13728*/4995/*4F49 */, /*13729*/4995/*4F4A */,/*13730*/4995/*4F4B */,/*13731*/4995/*4F4C */,/*13732*/4995/*4F4D */,/*13733*/4995/*4F4E */, /*13734*/4995/*4F4F */,/*13735*/4995/*4F50 */,/*13736*/4995/*4F51 */,/*13737*/4995/*4F52 */,/*13738*/4995/*4F53 */, /*13739*/4995/*4F54 */,/*13740*/4995/*4F55 */,/*13741*/4995/*4F56 */,/*13742*/4995/*4F57 */,/*13743*/4995/*4F58 */, /*13744*/4995/*4F59 */,/*13745*/4995/*4F5A */,/*13746*/4995/*4F5B */,/*13747*/4995/*4F5C */,/*13748*/4995/*4F5D */, /*13749*/4995/*4F5E */,/*13750*/4995/*4F5F */,/*13751*/4995/*4F60 */,/*13752*/4995/*4F61 */,/*13753*/4995/*4F62 */, /*13754*/4995/*4F63 */,/*13755*/4995/*4F64 */,/*13756*/4995/*4F65 */,/*13757*/4995/*4F66 */,/*13758*/4995/*4F67 */, /*13759*/4995/*4F68 */,/*13760*/4995/*4F69 */,/*13761*/4995/*4F6A */,/*13762*/4995/*4F6B */,/*13763*/4995/*4F6C */, /*13764*/4995/*4F6D */,/*13765*/4995/*4F6E */,/*13766*/4995/*4F6F */,/*13767*/5006/* 4F70 */,/*13768*/4995/* 4F71 */, /*13769*/5003/* 5104 */,/*13770*/4995/* 5105 */,/*13771*/4995/*5106 */,/*13772*/4995/*5107 */,/*13773*/4995/*5108 */, /*13774*/4995/*5109 */,/*13775*/4995/*510A */,/*13776*/4995/*510B */,/*13777*/4995/*510C */,/*13778*/4995/*510D */, /*13779*/4995/*510E */,/*13780*/4995/*510F */,/*13781*/4995/*5110 */,/*13782*/4995/*5111 */,/*13783*/4995/*5112 */, /*13784*/4995/*5113 */,/*13785*/4995/*5114 */,/*13786*/4995/*5115 */,/*13787*/4995/*5116 */,/*13788*/4995/*5117 */, /*13789*/4995/*5118 */,/*13790*/4995/*5119 */,/*13791*/4995/*511A */,/*13792*/4995/*511B */,/*13793*/4995/*511C */, /*13794*/4995/*511D */,/*13795*/4995/*511E */,/*13796*/4995/*511F */,/*13797*/4995/*5120 */,/*13798*/4995/*5121 */, /*13799*/4995/*5122 */,/*13800*/4995/*5123 */,/*13801*/4995/*5124 */,/*13802*/4995/*5125 */,/*13803*/4995/*5126 */, /*13804*/4995/*5127 */,/*13805*/4995/*5128 */,/*13806*/4995/*5129 */,/*13807*/4995/*512A */,/*13808*/4995/*512B */, /*13809*/4995/*512C */,/*13810*/4995/*512D */,/*13811*/4995/*512E */,/*13812*/4995/*512F */,/*13813*/4995/*5130 */, /*13814*/4995/*5131 */,/*13815*/4995/*5132 */,/*13816*/4995/*5133 */,/*13817*/4995/*5134 */,/*13818*/4995/*5135 */, /*13819*/4995/*5136 */,/*13820*/4995/*5137 */,/*13821*/4995/*5138 */,/*13822*/4995/*5139 */,/*13823*/4995/*513A */, /*13824*/4995/*513B */,/*13825*/4995/*513C */,/*13826*/4995/*513D */,/*13827*/4995/*513E */,/*13828*/4995/*513F */, /*13829*/4995/*5140 */,/*13830*/4995/*5141 */,/*13831*/4995/*5142 */,/*13832*/4995/*5143 */,/*13833*/4995/*5144 */, /*13834*/4995/*5145 */,/*13835*/5007/* 5146 */,/*13836*/4995/* 5147 */,/*13837*/4995/*5148 */,/*13838*/4995/*5149 */, /*13839*/4995/*514A */,/*13840*/4995/*514B */,/*13841*/4995/*514C */,/*13842*/4995/*514D */,/*13843*/4995/*514E */, /*13844*/4995/*514F */,/*13845*/4995/*5150 */,/*13846*/4995/*5151 */,/*13847*/4995/*5152 */,/*13848*/4995/*5153 */, /*13849*/4995/*5154 */,/*13850*/4995/*5155 */,/*13851*/4995/*5156 */,/*13852*/4995/*5157 */,/*13853*/4995/*5158 */, /*13854*/4995/*5159 */,/*13855*/4995/*515A */,/*13856*/4995/*515B */,/*13857*/4995/*515C */,/*13858*/4995/*515D */, /*13859*/4995/*515E */,/*13860*/4995/*515F */,/*13861*/4995/*5160 */,/*13862*/4995/*5161 */,/*13863*/4995/*5162 */, /*13864*/4995/*5163 */,/*13865*/4995/*5164 */,/*13866*/4995/*5165 */,/*13867*/4995/*5166 */,/*13868*/4995/*5167 */, /*13869*/4995/*5168 */,/*13870*/5000/* 5169 */,/*13871*/4995/* 516A */,/*13872*/5008/* 516B */,/*13873*/4995/* 516C */, /*13874*/5009/* 516D */,/*13875*/4995/* 516E */,/*13876*/5004/* 5341 */,/*13877*/4995/* 5342 */,/*13878*/5005/* 5343 */, /*13879*/5010/* 5344 */,/*13880*/5011/* 5345 */,/*13881*/4995/* 5346 */,/*13882*/4995/*5347 */,/*13883*/4995/*5348 */, /*13884*/4995/*5349 */,/*13885*/4995/*534A */,/*13886*/4995/*534B */,/*13887*/5012/* 534C */,/*13888*/4995/* 534D */, /*13889*/4998/* 53C1 */,/*13890*/4998/*53C2 */,/*13891*/4998/*53C3 */,/*13892*/4998/*53C4 */,/*13893*/4995/* 53C5 */, /*13894*/5002/* 56DB */,/*13895*/4995/* 56DC */,/*13896*/4994/* 58F1 */,/*13897*/4995/* 58F2 */,/*13898*/4995/*58F3 */, /*13899*/4995/*58F4 */,/*13900*/4995/*58F5 */,/*13901*/4995/*58F6 */,/*13902*/4995/*58F7 */,/*13903*/4995/*58F8 */, /*13904*/4994/* 58F9 */,/*13905*/4995/* 58FA */,/*13906*/4994/* 5E7A */,/*13907*/4995/* 5E7B */,/*13908*/4999/* 5EFE */, /*13909*/5010/* 5EFF */,/*13910*/4995/* 5F00 */,/*13911*/4995/*5F01 */,/*13912*/4995/*5F02 */,/*13913*/4995/*5F03 */, /*13914*/4995/*5F04 */,/*13915*/4995/*5F05 */,/*13916*/4995/*5F06 */,/*13917*/4995/*5F07 */,/*13918*/4995/*5F08 */, /*13919*/4995/*5F09 */,/*13920*/4995/*5F0A */,/*13921*/4995/*5F0B */,/*13922*/4994/* 5F0C */,/*13923*/5000/* 5F0D */, /*13924*/4998/* 5F0E */,/*13925*/4995/* 5F0F */,/*13926*/5000/* 5F10 */,/*13927*/4995/* 5F11 */,/*13928*/5004/* 62FE */, /*13929*/4995/* 62FF */,/*13930*/4995/*6300 */,/*13931*/4995/*6301 */,/*13932*/4995/*6302 */,/*13933*/4995/*6303 */, /*13934*/4995/*6304 */,/*13935*/4995/*6305 */,/*13936*/4995/*6306 */,/*13937*/4995/*6307 */,/*13938*/4995/*6308 */, /*13939*/4995/*6309 */,/*13940*/4995/*630A */,/*13941*/4995/*630B */,/*13942*/4995/*630C */,/*13943*/4995/*630D */, /*13944*/4995/*630E */,/*13945*/4995/*630F */,/*13946*/4995/*6310 */,/*13947*/4995/*6311 */,/*13948*/4995/*6312 */, /*13949*/4995/*6313 */,/*13950*/4995/*6314 */,/*13951*/4995/*6315 */,/*13952*/4995/*6316 */,/*13953*/4995/*6317 */, /*13954*/4995/*6318 */,/*13955*/4995/*6319 */,/*13956*/4995/*631A */,/*13957*/4995/*631B */,/*13958*/4995/*631C */, /*13959*/4995/*631D */,/*13960*/4995/*631E */,/*13961*/4995/*631F */,/*13962*/4995/*6320 */,/*13963*/4995/*6321 */, /*13964*/4995/*6322 */,/*13965*/4995/*6323 */,/*13966*/4995/*6324 */,/*13967*/4995/*6325 */,/*13968*/4995/*6326 */, /*13969*/4995/*6327 */,/*13970*/4995/*6328 */,/*13971*/4995/*6329 */,/*13972*/4995/*632A */,/*13973*/4995/*632B */, /*13974*/4995/*632C */,/*13975*/4995/*632D */,/*13976*/4995/*632E */,/*13977*/4995/*632F */,/*13978*/4995/*6330 */, /*13979*/4995/*6331 */,/*13980*/4995/*6332 */,/*13981*/4995/*6333 */,/*13982*/4995/*6334 */,/*13983*/4995/*6335 */, /*13984*/4995/*6336 */,/*13985*/4995/*6337 */,/*13986*/4995/*6338 */,/*13987*/4995/*6339 */,/*13988*/4995/*633A */, /*13989*/4995/*633B */,/*13990*/4995/*633C */,/*13991*/4995/*633D */,/*13992*/4995/*633E */,/*13993*/4995/*633F */, /*13994*/4995/*6340 */,/*13995*/4995/*6341 */,/*13996*/4995/*6342 */,/*13997*/4995/*6343 */,/*13998*/4995/*6344 */, /*13999*/4995/*6345 */,/*14000*/4995/*6346 */,/*14001*/4995/*6347 */,/*14002*/4995/*6348 */,/*14003*/4995/*6349 */, /*14004*/4995/*634A */,/*14005*/4995/*634B */,/*14006*/5008/* 634C */,/*14007*/4995/* 634D */,/*14008*/4996/* 67D2 */, /*14009*/4995/* 67D3 */,/*14010*/4996/* 6F06 */,/*14011*/4995/* 6F07 */,/*14012*/4999/* 7396 */,/*14013*/4995/* 7397 */, /*14014*/5006/* 767E */,/*14015*/4995/* 767F */,/*14016*/5002/* 8086 */,/*14017*/4995/* 8087 */,/*14018*/4997/* 842C */, /*14019*/4995/* 842D */,/*14020*/5000/* 8CAE */,/*14021*/4995/* 8CAF */,/*14022*/4995/*8CB0 */,/*14023*/4995/*8CB1 */, /*14024*/4995/*8CB2 */,/*14025*/5000/* 8CB3 */,/*14026*/4995/* 8CB4 */,/*14027*/5000/* 8D30 */,/*14028*/4995/* 8D31 */, /*14029*/5005/* 9621 */,/*14030*/4995/* 9622 */,/*14031*/4995/*9623 */,/*14032*/4995/*9624 */,/*14033*/4995/*9625 */, /*14034*/4995/*9626 */,/*14035*/4995/*9627 */,/*14036*/4995/*9628 */,/*14037*/4995/*9629 */,/*14038*/4995/*962A */, /*14039*/4995/*962B */,/*14040*/4995/*962C */,/*14041*/4995/*962D */,/*14042*/4995/*962E */,/*14043*/4995/*962F */, /*14044*/4995/*9630 */,/*14045*/4995/*9631 */,/*14046*/4995/*9632 */,/*14047*/4995/*9633 */,/*14048*/4995/*9634 */, /*14049*/4995/*9635 */,/*14050*/4995/*9636 */,/*14051*/4995/*9637 */,/*14052*/4995/*9638 */,/*14053*/4995/*9639 */, /*14054*/4995/*963A */,/*14055*/4995/*963B */,/*14056*/4995/*963C */,/*14057*/4995/*963D */,/*14058*/4995/*963E */, /*14059*/4995/*963F */,/*14060*/4995/*9640 */,/*14061*/4995/*9641 */,/*14062*/4995/*9642 */,/*14063*/4995/*9643 */, /*14064*/4995/*9644 */,/*14065*/4995/*9645 */,/*14066*/5009/* 9646 */,/*14067*/4995/* 9647 */,/*14068*/4995/*9648 */, /*14069*/4995/*9649 */,/*14070*/4995/*964A */,/*14071*/4995/*964B */,/*14072*/5006/* 964C */,/*14073*/4995/* 964D */, /*14074*/4995/*964E */,/*14075*/4995/*964F */,/*14076*/4995/*9650 */,/*14077*/4995/*9651 */,/*14078*/4995/*9652 */, /*14079*/4995/*9653 */,/*14080*/4995/*9654 */,/*14081*/4995/*9655 */,/*14082*/4995/*9656 */,/*14083*/4995/*9657 */, /*14084*/4995/*9658 */,/*14085*/4995/*9659 */,/*14086*/4995/*965A */,/*14087*/4995/*965B */,/*14088*/4995/*965C */, /*14089*/4995/*965D */,/*14090*/4995/*965E */,/*14091*/4995/*965F */,/*14092*/4995/*9660 */,/*14093*/4995/*9661 */, /*14094*/4995/*9662 */,/*14095*/4995/*9663 */,/*14096*/4995/*9664 */,/*14097*/4995/*9665 */,/*14098*/4995/*9666 */, /*14099*/4995/*9667 */,/*14100*/4995/*9668 */,/*14101*/4995/*9669 */,/*14102*/4995/*966A */,/*14103*/4995/*966B */, /*14104*/4995/*966C */,/*14105*/4995/*966D */,/*14106*/4995/*966E */,/*14107*/4995/*966F */,/*14108*/4995/*9670 */, /*14109*/4995/*9671 */,/*14110*/4995/*9672 */,/*14111*/4995/*9673 */,/*14112*/4995/*9674 */,/*14113*/4995/*9675 */, /*14114*/4995/*9676 */,/*14115*/4995/*9677 */,/*14116*/5009/* 9678 */,/*14117*/4995/* 9679 */,/*14118*/5013/* 96F6 */, /*14119*/4995/* 96F7 */,/*14120*/5014/* 9FA6 */,/*14121*/5014/*9FA7 */,/*14122*/5014/*9FA8 */,/*14123*/5014/*9FA9 */, /*14124*/5014/*9FAA */,/*14125*/5014/*9FAB */,/*14126*/5014/*9FAC */,/*14127*/5014/*9FAD */,/*14128*/5014/*9FAE */, /*14129*/5014/*9FAF */,/*14130*/5014/*9FB0 */,/*14131*/5014/*9FB1 */,/*14132*/5014/*9FB2 */,/*14133*/5014/*9FB3 */, /*14134*/5014/*9FB4 */,/*14135*/5014/*9FB5 */,/*14136*/5014/*9FB6 */,/*14137*/5014/*9FB7 */,/*14138*/5014/*9FB8 */, /*14139*/5014/*9FB9 */,/*14140*/5014/*9FBA */,/*14141*/5014/*9FBB */,/*14142*/5015/* 9FBC */,/*14143*/5015/*9FBD */, /*14144*/5015/*9FBE */,/*14145*/5015/*9FBF */,/*14146*/5015/*9FC0 */,/*14147*/5015/*9FC1 */,/*14148*/5015/*9FC2 */, /*14149*/5015/*9FC3 */,/*14150*/5016/* 9FC4 */,/*14151*/5016/*9FC5 */,/*14152*/5016/*9FC6 */,/*14153*/5016/*9FC7 */, /*14154*/5016/*9FC8 */,/*14155*/5016/*9FC9 */,/*14156*/5016/*9FCA */,/*14157*/5016/*9FCB */,/*14158*/5017/* 9FCC */, /*14159*/5018/* 9FCD */,/*14160*/5018/*9FCE */,/*14161*/5018/*9FCF */,/*14162*/5018/*9FD0 */,/*14163*/5018/*9FD1 */, /*14164*/5018/*9FD2 */,/*14165*/5018/*9FD3 */,/*14166*/5018/*9FD4 */,/*14167*/5018/*9FD5 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*14210*/5019/* A000 */,/*14211*/5019/* A001 */, /*14212*/5019/* A002 */,/*14213*/5019/* A003 */,/*14214*/5019/* A004 */,/*14215*/5019/* A005 */,/*14216*/5019/* A006 */, /*14217*/5019/* A007 */,/*14218*/5019/* A008 */,/*14219*/5019/* A009 */,/*14220*/5019/* A00A */,/*14221*/5019/* A00B */, /*14222*/5019/* A00C */,/*14223*/5019/* A00D */,/*14224*/5019/* A00E */,/*14225*/5019/* A00F */,/*14226*/5019/* A010 */, /*14227*/5019/* A011 */,/*14228*/5019/* A012 */,/*14229*/5019/* A013 */,/*14230*/5019/* A014 */,/*14231*/5020/* A015 */, /*14232*/5019/* A016 */,/*14233*/5019/* A017 */,/*14234*/5019/* A018 */,/*14235*/5019/* A019 */,/*14236*/5019/* A01A */, /*14237*/5019/* A01B */,/*14238*/5019/* A01C */,/*14239*/5019/* A01D */,/*14240*/5019/* A01E */,/*14241*/5019/* A01F */, /*14242*/5019/* A020 */,/*14243*/5019/* A021 */,/*14244*/5019/* A022 */,/*14245*/5019/* A023 */,/*14246*/5019/* A024 */, /*14247*/5019/* A025 */,/*14248*/5019/* A026 */,/*14249*/5019/* A027 */,/*14250*/5019/* A028 */,/*14251*/5019/* A029 */, /*14252*/5019/* A02A */,/*14253*/5019/* A02B */,/*14254*/5019/* A02C */,/*14255*/5019/* A02D */,/*14256*/5019/* A02E */, /*14257*/5019/* A02F */,/*14258*/5019/* A030 */,/*14259*/5019/* A031 */,/*14260*/5019/* A032 */,/*14261*/5019/* A033 */, /*14262*/5019/* A034 */,/*14263*/5019/* A035 */,/*14264*/5019/* A036 */,/*14265*/5019/* A037 */,/*14266*/5019/* A038 */, /*14267*/5019/* A039 */,/*14268*/5019/* A03A */,/*14269*/5019/* A03B */,/*14270*/5019/* A03C */,/*14271*/5019/* A03D */, /*14272*/5019/* A03E */,/*14273*/5019/* A03F */,/*14274*/5019/* A040 */,/*14275*/5019/* A041 */,/*14276*/5019/* A042 */, /*14277*/5019/* A043 */,/*14278*/5019/* A044 */,/*14279*/5019/* A045 */,/*14280*/5019/* A046 */,/*14281*/5019/* A047 */, /*14282*/5019/* A048 */,/*14283*/5019/* A049 */,/*14284*/5019/* A04A */,/*14285*/5019/* A04B */,/*14286*/5019/* A04C */, /*14287*/5019/* A04D */,/*14288*/5019/* A04E */,/*14289*/5019/* A04F */,/*14290*/5019/* A050 */,/*14291*/5019/* A051 */, /*14292*/5019/* A052 */,/*14293*/5019/* A053 */,/*14294*/5019/* A054 */,/*14295*/5019/* A055 */,/*14296*/5019/* A056 */, /*14297*/5019/* A057 */,/*14298*/5019/* A058 */,/*14299*/5019/* A059 */,/*14300*/5019/* A05A */,/*14301*/5019/* A05B */, /*14302*/5019/* A05C */,/*14303*/5019/* A05D */,/*14304*/5019/* A05E */,/*14305*/5019/* A05F */,/*14306*/5019/* A060 */, /*14307*/5019/* A061 */,/*14308*/5019/* A062 */,/*14309*/5019/* A063 */,/*14310*/5019/* A064 */,/*14311*/5019/* A065 */, /*14312*/5019/* A066 */,/*14313*/5019/* A067 */,/*14314*/5019/* A068 */,/*14315*/5019/* A069 */,/*14316*/5019/* A06A */, /*14317*/5019/* A06B */,/*14318*/5019/* A06C */,/*14319*/5019/* A06D */,/*14320*/5019/* A06E */,/*14321*/5019/* A06F */, /*14322*/5019/* A070 */,/*14323*/5019/* A071 */,/*14324*/5019/* A072 */,/*14325*/5019/* A073 */,/*14326*/5019/* A074 */, /*14327*/5019/* A075 */,/*14328*/5019/* A076 */,/*14329*/5019/* A077 */,/*14330*/5019/* A078 */,/*14331*/5019/* A079 */, /*14332*/5019/* A07A */,/*14333*/5019/* A07B */,/*14334*/5019/* A07C */,/*14335*/5019/* A07D */,/*14336*/5019/* A07E */, /*14337*/5019/* A07F */,/*14338*/5019/* A080 */,/*14339*/5019/* A081 */,/*14340*/5019/* A082 */,/*14341*/5019/* A083 */, /*14342*/5019/* A084 */,/*14343*/5019/* A085 */,/*14344*/5019/* A086 */,/*14345*/5019/* A087 */,/*14346*/5019/* A088 */, /*14347*/5019/* A089 */,/*14348*/5019/* A08A */,/*14349*/5019/* A08B */,/*14350*/5019/* A08C */,/*14351*/5019/* A08D */, /*14352*/5019/* A08E */,/*14353*/5019/* A08F */,/*14354*/5019/* A090 */,/*14355*/5019/* A091 */,/*14356*/5019/* A092 */, /*14357*/5019/* A093 */,/*14358*/5019/* A094 */,/*14359*/5019/* A095 */,/*14360*/5019/* A096 */,/*14361*/5019/* A097 */, /*14362*/5019/* A098 */,/*14363*/5019/* A099 */,/*14364*/5019/* A09A */,/*14365*/5019/* A09B */,/*14366*/5019/* A09C */, /*14367*/5019/* A09D */,/*14368*/5019/* A09E */,/*14369*/5019/* A09F */,/*14370*/5019/* A0A0 */,/*14371*/5019/* A0A1 */, /*14372*/5019/* A0A2 */,/*14373*/5019/* A0A3 */,/*14374*/5019/* A0A4 */,/*14375*/5019/* A0A5 */,/*14376*/5019/* A0A6 */, /*14377*/5019/* A0A7 */,/*14378*/5019/* A0A8 */,/*14379*/5019/* A0A9 */,/*14380*/5019/* A0AA */,/*14381*/5019/* A0AB */, /*14382*/5019/* A0AC */,/*14383*/5019/* A0AD */,/*14384*/5019/* A0AE */,/*14385*/5019/* A0AF */,/*14386*/5019/* A0B0 */, /*14387*/5019/* A0B1 */,/*14388*/5019/* A0B2 */,/*14389*/5019/* A0B3 */,/*14390*/5019/* A0B4 */,/*14391*/5019/* A0B5 */, /*14392*/5019/* A0B6 */,/*14393*/5019/* A0B7 */,/*14394*/5019/* A0B8 */,/*14395*/5019/* A0B9 */,/*14396*/5019/* A0BA */, /*14397*/5019/* A0BB */,/*14398*/5019/* A0BC */,/*14399*/5019/* A0BD */,/*14400*/5019/* A0BE */,/*14401*/5019/* A0BF */, /*14402*/5019/* A0C0 */,/*14403*/5019/* A0C1 */,/*14404*/5019/* A0C2 */,/*14405*/5019/* A0C3 */,/*14406*/5019/* A0C4 */, /*14407*/5019/* A0C5 */,/*14408*/5019/* A0C6 */,/*14409*/5019/* A0C7 */,/*14410*/5019/* A0C8 */,/*14411*/5019/* A0C9 */, /*14412*/5019/* A0CA */,/*14413*/5019/* A0CB */,/*14414*/5019/* A0CC */,/*14415*/5019/* A0CD */,/*14416*/5019/* A0CE */, /*14417*/5019/* A0CF */,/*14418*/5019/* A0D0 */,/*14419*/5019/* A0D1 */,/*14420*/5019/* A0D2 */,/*14421*/5019/* A0D3 */, /*14422*/5019/* A0D4 */,/*14423*/5019/* A0D5 */,/*14424*/5019/* A0D6 */,/*14425*/5019/* A0D7 */,/*14426*/5019/* A0D8 */, /*14427*/5019/* A0D9 */,/*14428*/5019/* A0DA */,/*14429*/5019/* A0DB */,/*14430*/5019/* A0DC */,/*14431*/5019/* A0DD */, /*14432*/5019/* A0DE */,/*14433*/5019/* A0DF */,/*14434*/5019/* A0E0 */,/*14435*/5019/* A0E1 */,/*14436*/5019/* A0E2 */, /*14437*/5019/* A0E3 */,/*14438*/5019/* A0E4 */,/*14439*/5019/* A0E5 */,/*14440*/5019/* A0E6 */,/*14441*/5019/* A0E7 */, /*14442*/5019/* A0E8 */,/*14443*/5019/* A0E9 */,/*14444*/5019/* A0EA */,/*14445*/5019/* A0EB */,/*14446*/5019/* A0EC */, /*14447*/5019/* A0ED */,/*14448*/5019/* A0EE */,/*14449*/5019/* A0EF */,/*14450*/5019/* A0F0 */,/*14451*/5019/* A0F1 */, /*14452*/5019/* A0F2 */,/*14453*/5019/* A0F3 */,/*14454*/5019/* A0F4 */,/*14455*/5019/* A0F5 */,/*14456*/5019/* A0F6 */, /*14457*/5019/* A0F7 */,/*14458*/5019/* A0F8 */,/*14459*/5019/* A0F9 */,/*14460*/5019/* A0FA */,/*14461*/5019/* A0FB */, /*14462*/5019/* A0FC */,/*14463*/5019/* A0FD */,/*14464*/5019/* A0FE */,/*14465*/5019/* A0FF */,/*14466*/5019/* A100 */, /*14467*/5019/* A101 */,/*14468*/5019/* A102 */,/*14469*/5019/* A103 */,/*14470*/5019/* A104 */,/*14471*/5019/* A105 */, /*14472*/5019/* A106 */,/*14473*/5019/* A107 */,/*14474*/5019/* A108 */,/*14475*/5019/* A109 */,/*14476*/5019/* A10A */, /*14477*/5019/* A10B */,/*14478*/5019/* A10C */,/*14479*/5019/* A10D */,/*14480*/5019/* A10E */,/*14481*/5019/* A10F */, /*14482*/5019/* A110 */,/*14483*/5019/* A111 */,/*14484*/5019/* A112 */,/*14485*/5019/* A113 */,/*14486*/5019/* A114 */, /*14487*/5019/* A115 */,/*14488*/5019/* A116 */,/*14489*/5019/* A117 */,/*14490*/5019/* A118 */,/*14491*/5019/* A119 */, /*14492*/5019/* A11A */,/*14493*/5019/* A11B */,/*14494*/5019/* A11C */,/*14495*/5019/* A11D */,/*14496*/5019/* A11E */, /*14497*/5019/* A11F */,/*14498*/5019/* A120 */,/*14499*/5019/* A121 */,/*14500*/5019/* A122 */,/*14501*/5019/* A123 */, /*14502*/5019/* A124 */,/*14503*/5019/* A125 */,/*14504*/5019/* A126 */,/*14505*/5019/* A127 */,/*14506*/5019/* A128 */, /*14507*/5019/* A129 */,/*14508*/5019/* A12A */,/*14509*/5019/* A12B */,/*14510*/5019/* A12C */,/*14511*/5019/* A12D */, /*14512*/5019/* A12E */,/*14513*/5019/* A12F */,/*14514*/5019/* A130 */,/*14515*/5019/* A131 */,/*14516*/5019/* A132 */, /*14517*/5019/* A133 */,/*14518*/5019/* A134 */,/*14519*/5019/* A135 */,/*14520*/5019/* A136 */,/*14521*/5019/* A137 */, /*14522*/5019/* A138 */,/*14523*/5019/* A139 */,/*14524*/5019/* A13A */,/*14525*/5019/* A13B */,/*14526*/5019/* A13C */, /*14527*/5019/* A13D */,/*14528*/5019/* A13E */,/*14529*/5019/* A13F */,/*14530*/5019/* A140 */,/*14531*/5019/* A141 */, /*14532*/5019/* A142 */,/*14533*/5019/* A143 */,/*14534*/5019/* A144 */,/*14535*/5019/* A145 */,/*14536*/5019/* A146 */, /*14537*/5019/* A147 */,/*14538*/5019/* A148 */,/*14539*/5019/* A149 */,/*14540*/5019/* A14A */,/*14541*/5019/* A14B */, /*14542*/5019/* A14C */,/*14543*/5019/* A14D */,/*14544*/5019/* A14E */,/*14545*/5019/* A14F */,/*14546*/5019/* A150 */, /*14547*/5019/* A151 */,/*14548*/5019/* A152 */,/*14549*/5019/* A153 */,/*14550*/5019/* A154 */,/*14551*/5019/* A155 */, /*14552*/5019/* A156 */,/*14553*/5019/* A157 */,/*14554*/5019/* A158 */,/*14555*/5019/* A159 */,/*14556*/5019/* A15A */, /*14557*/5019/* A15B */,/*14558*/5019/* A15C */,/*14559*/5019/* A15D */,/*14560*/5019/* A15E */,/*14561*/5019/* A15F */, /*14562*/5019/* A160 */,/*14563*/5019/* A161 */,/*14564*/5019/* A162 */,/*14565*/5019/* A163 */,/*14566*/5019/* A164 */, /*14567*/5019/* A165 */,/*14568*/5019/* A166 */,/*14569*/5019/* A167 */,/*14570*/5019/* A168 */,/*14571*/5019/* A169 */, /*14572*/5019/* A16A */,/*14573*/5019/* A16B */,/*14574*/5019/* A16C */,/*14575*/5019/* A16D */,/*14576*/5019/* A16E */, /*14577*/5019/* A16F */,/*14578*/5019/* A170 */,/*14579*/5019/* A171 */,/*14580*/5019/* A172 */,/*14581*/5019/* A173 */, /*14582*/5019/* A174 */,/*14583*/5019/* A175 */,/*14584*/5019/* A176 */,/*14585*/5019/* A177 */,/*14586*/5019/* A178 */, /*14587*/5019/* A179 */,/*14588*/5019/* A17A */,/*14589*/5019/* A17B */,/*14590*/5019/* A17C */,/*14591*/5019/* A17D */, /*14592*/5019/* A17E */,/*14593*/5019/* A17F */,/*14594*/5019/* A180 */,/*14595*/5019/* A181 */,/*14596*/5019/* A182 */, /*14597*/5019/* A183 */,/*14598*/5019/* A184 */,/*14599*/5019/* A185 */,/*14600*/5019/* A186 */,/*14601*/5019/* A187 */, /*14602*/5019/* A188 */,/*14603*/5019/* A189 */,/*14604*/5019/* A18A */,/*14605*/5019/* A18B */,/*14606*/5019/* A18C */, /*14607*/5019/* A18D */,/*14608*/5019/* A18E */,/*14609*/5019/* A18F */,/*14610*/5019/* A190 */,/*14611*/5019/* A191 */, /*14612*/5019/* A192 */,/*14613*/5019/* A193 */,/*14614*/5019/* A194 */,/*14615*/5019/* A195 */,/*14616*/5019/* A196 */, /*14617*/5019/* A197 */,/*14618*/5019/* A198 */,/*14619*/5019/* A199 */,/*14620*/5019/* A19A */,/*14621*/5019/* A19B */, /*14622*/5019/* A19C */,/*14623*/5019/* A19D */,/*14624*/5019/* A19E */,/*14625*/5019/* A19F */,/*14626*/5019/* A1A0 */, /*14627*/5019/* A1A1 */,/*14628*/5019/* A1A2 */,/*14629*/5019/* A1A3 */,/*14630*/5019/* A1A4 */,/*14631*/5019/* A1A5 */, /*14632*/5019/* A1A6 */,/*14633*/5019/* A1A7 */,/*14634*/5019/* A1A8 */,/*14635*/5019/* A1A9 */,/*14636*/5019/* A1AA */, /*14637*/5019/* A1AB */,/*14638*/5019/* A1AC */,/*14639*/5019/* A1AD */,/*14640*/5019/* A1AE */,/*14641*/5019/* A1AF */, /*14642*/5019/* A1B0 */,/*14643*/5019/* A1B1 */,/*14644*/5019/* A1B2 */,/*14645*/5019/* A1B3 */,/*14646*/5019/* A1B4 */, /*14647*/5019/* A1B5 */,/*14648*/5019/* A1B6 */,/*14649*/5019/* A1B7 */,/*14650*/5019/* A1B8 */,/*14651*/5019/* A1B9 */, /*14652*/5019/* A1BA */,/*14653*/5019/* A1BB */,/*14654*/5019/* A1BC */,/*14655*/5019/* A1BD */,/*14656*/5019/* A1BE */, /*14657*/5019/* A1BF */,/*14658*/5019/* A1C0 */,/*14659*/5019/* A1C1 */,/*14660*/5019/* A1C2 */,/*14661*/5019/* A1C3 */, /*14662*/5019/* A1C4 */,/*14663*/5019/* A1C5 */,/*14664*/5019/* A1C6 */,/*14665*/5019/* A1C7 */,/*14666*/5019/* A1C8 */, /*14667*/5019/* A1C9 */,/*14668*/5019/* A1CA */,/*14669*/5019/* A1CB */,/*14670*/5019/* A1CC */,/*14671*/5019/* A1CD */, /*14672*/5019/* A1CE */,/*14673*/5019/* A1CF */,/*14674*/5019/* A1D0 */,/*14675*/5019/* A1D1 */,/*14676*/5019/* A1D2 */, /*14677*/5019/* A1D3 */,/*14678*/5019/* A1D4 */,/*14679*/5019/* A1D5 */,/*14680*/5019/* A1D6 */,/*14681*/5019/* A1D7 */, /*14682*/5019/* A1D8 */,/*14683*/5019/* A1D9 */,/*14684*/5019/* A1DA */,/*14685*/5019/* A1DB */,/*14686*/5019/* A1DC */, /*14687*/5019/* A1DD */,/*14688*/5019/* A1DE */,/*14689*/5019/* A1DF */,/*14690*/5019/* A1E0 */,/*14691*/5019/* A1E1 */, /*14692*/5019/* A1E2 */,/*14693*/5019/* A1E3 */,/*14694*/5019/* A1E4 */,/*14695*/5019/* A1E5 */,/*14696*/5019/* A1E6 */, /*14697*/5019/* A1E7 */,/*14698*/5019/* A1E8 */,/*14699*/5019/* A1E9 */,/*14700*/5019/* A1EA */,/*14701*/5019/* A1EB */, /*14702*/5019/* A1EC */,/*14703*/5019/* A1ED */,/*14704*/5019/* A1EE */,/*14705*/5019/* A1EF */,/*14706*/5019/* A1F0 */, /*14707*/5019/* A1F1 */,/*14708*/5019/* A1F2 */,/*14709*/5019/* A1F3 */,/*14710*/5019/* A1F4 */,/*14711*/5019/* A1F5 */, /*14712*/5019/* A1F6 */,/*14713*/5019/* A1F7 */,/*14714*/5019/* A1F8 */,/*14715*/5019/* A1F9 */,/*14716*/5019/* A1FA */, /*14717*/5019/* A1FB */,/*14718*/5019/* A1FC */,/*14719*/5019/* A1FD */,/*14720*/5019/* A1FE */,/*14721*/5019/* A1FF */, /*14722*/5019/* A200 */,/*14723*/5019/* A201 */,/*14724*/5019/* A202 */,/*14725*/5019/* A203 */,/*14726*/5019/* A204 */, /*14727*/5019/* A205 */,/*14728*/5019/* A206 */,/*14729*/5019/* A207 */,/*14730*/5019/* A208 */,/*14731*/5019/* A209 */, /*14732*/5019/* A20A */,/*14733*/5019/* A20B */,/*14734*/5019/* A20C */,/*14735*/5019/* A20D */,/*14736*/5019/* A20E */, /*14737*/5019/* A20F */,/*14738*/5019/* A210 */,/*14739*/5019/* A211 */,/*14740*/5019/* A212 */,/*14741*/5019/* A213 */, /*14742*/5019/* A214 */,/*14743*/5019/* A215 */,/*14744*/5019/* A216 */,/*14745*/5019/* A217 */,/*14746*/5019/* A218 */, /*14747*/5019/* A219 */,/*14748*/5019/* A21A */,/*14749*/5019/* A21B */,/*14750*/5019/* A21C */,/*14751*/5019/* A21D */, /*14752*/5019/* A21E */,/*14753*/5019/* A21F */,/*14754*/5019/* A220 */,/*14755*/5019/* A221 */,/*14756*/5019/* A222 */, /*14757*/5019/* A223 */,/*14758*/5019/* A224 */,/*14759*/5019/* A225 */,/*14760*/5019/* A226 */,/*14761*/5019/* A227 */, /*14762*/5019/* A228 */,/*14763*/5019/* A229 */,/*14764*/5019/* A22A */,/*14765*/5019/* A22B */,/*14766*/5019/* A22C */, /*14767*/5019/* A22D */,/*14768*/5019/* A22E */,/*14769*/5019/* A22F */,/*14770*/5019/* A230 */,/*14771*/5019/* A231 */, /*14772*/5019/* A232 */,/*14773*/5019/* A233 */,/*14774*/5019/* A234 */,/*14775*/5019/* A235 */,/*14776*/5019/* A236 */, /*14777*/5019/* A237 */,/*14778*/5019/* A238 */,/*14779*/5019/* A239 */,/*14780*/5019/* A23A */,/*14781*/5019/* A23B */, /*14782*/5019/* A23C */,/*14783*/5019/* A23D */,/*14784*/5019/* A23E */,/*14785*/5019/* A23F */,/*14786*/5019/* A240 */, /*14787*/5019/* A241 */,/*14788*/5019/* A242 */,/*14789*/5019/* A243 */,/*14790*/5019/* A244 */,/*14791*/5019/* A245 */, /*14792*/5019/* A246 */,/*14793*/5019/* A247 */,/*14794*/5019/* A248 */,/*14795*/5019/* A249 */,/*14796*/5019/* A24A */, /*14797*/5019/* A24B */,/*14798*/5019/* A24C */,/*14799*/5019/* A24D */,/*14800*/5019/* A24E */,/*14801*/5019/* A24F */, /*14802*/5019/* A250 */,/*14803*/5019/* A251 */,/*14804*/5019/* A252 */,/*14805*/5019/* A253 */,/*14806*/5019/* A254 */, /*14807*/5019/* A255 */,/*14808*/5019/* A256 */,/*14809*/5019/* A257 */,/*14810*/5019/* A258 */,/*14811*/5019/* A259 */, /*14812*/5019/* A25A */,/*14813*/5019/* A25B */,/*14814*/5019/* A25C */,/*14815*/5019/* A25D */,/*14816*/5019/* A25E */, /*14817*/5019/* A25F */,/*14818*/5019/* A260 */,/*14819*/5019/* A261 */,/*14820*/5019/* A262 */,/*14821*/5019/* A263 */, /*14822*/5019/* A264 */,/*14823*/5019/* A265 */,/*14824*/5019/* A266 */,/*14825*/5019/* A267 */,/*14826*/5019/* A268 */, /*14827*/5019/* A269 */,/*14828*/5019/* A26A */,/*14829*/5019/* A26B */,/*14830*/5019/* A26C */,/*14831*/5019/* A26D */, /*14832*/5019/* A26E */,/*14833*/5019/* A26F */,/*14834*/5019/* A270 */,/*14835*/5019/* A271 */,/*14836*/5019/* A272 */, /*14837*/5019/* A273 */,/*14838*/5019/* A274 */,/*14839*/5019/* A275 */,/*14840*/5019/* A276 */,/*14841*/5019/* A277 */, /*14842*/5019/* A278 */,/*14843*/5019/* A279 */,/*14844*/5019/* A27A */,/*14845*/5019/* A27B */,/*14846*/5019/* A27C */, /*14847*/5019/* A27D */,/*14848*/5019/* A27E */,/*14849*/5019/* A27F */,/*14850*/5019/* A280 */,/*14851*/5019/* A281 */, /*14852*/5019/* A282 */,/*14853*/5019/* A283 */,/*14854*/5019/* A284 */,/*14855*/5019/* A285 */,/*14856*/5019/* A286 */, /*14857*/5019/* A287 */,/*14858*/5019/* A288 */,/*14859*/5019/* A289 */,/*14860*/5019/* A28A */,/*14861*/5019/* A28B */, /*14862*/5019/* A28C */,/*14863*/5019/* A28D */,/*14864*/5019/* A28E */,/*14865*/5019/* A28F */,/*14866*/5019/* A290 */, /*14867*/5019/* A291 */,/*14868*/5019/* A292 */,/*14869*/5019/* A293 */,/*14870*/5019/* A294 */,/*14871*/5019/* A295 */, /*14872*/5019/* A296 */,/*14873*/5019/* A297 */,/*14874*/5019/* A298 */,/*14875*/5019/* A299 */,/*14876*/5019/* A29A */, /*14877*/5019/* A29B */,/*14878*/5019/* A29C */,/*14879*/5019/* A29D */,/*14880*/5019/* A29E */,/*14881*/5019/* A29F */, /*14882*/5019/* A2A0 */,/*14883*/5019/* A2A1 */,/*14884*/5019/* A2A2 */,/*14885*/5019/* A2A3 */,/*14886*/5019/* A2A4 */, /*14887*/5019/* A2A5 */,/*14888*/5019/* A2A6 */,/*14889*/5019/* A2A7 */,/*14890*/5019/* A2A8 */,/*14891*/5019/* A2A9 */, /*14892*/5019/* A2AA */,/*14893*/5019/* A2AB */,/*14894*/5019/* A2AC */,/*14895*/5019/* A2AD */,/*14896*/5019/* A2AE */, /*14897*/5019/* A2AF */,/*14898*/5019/* A2B0 */,/*14899*/5019/* A2B1 */,/*14900*/5019/* A2B2 */,/*14901*/5019/* A2B3 */, /*14902*/5019/* A2B4 */,/*14903*/5019/* A2B5 */,/*14904*/5019/* A2B6 */,/*14905*/5019/* A2B7 */,/*14906*/5019/* A2B8 */, /*14907*/5019/* A2B9 */,/*14908*/5019/* A2BA */,/*14909*/5019/* A2BB */,/*14910*/5019/* A2BC */,/*14911*/5019/* A2BD */, /*14912*/5019/* A2BE */,/*14913*/5019/* A2BF */,/*14914*/5019/* A2C0 */,/*14915*/5019/* A2C1 */,/*14916*/5019/* A2C2 */, /*14917*/5019/* A2C3 */,/*14918*/5019/* A2C4 */,/*14919*/5019/* A2C5 */,/*14920*/5019/* A2C6 */,/*14921*/5019/* A2C7 */, /*14922*/5019/* A2C8 */,/*14923*/5019/* A2C9 */,/*14924*/5019/* A2CA */,/*14925*/5019/* A2CB */,/*14926*/5019/* A2CC */, /*14927*/5019/* A2CD */,/*14928*/5019/* A2CE */,/*14929*/5019/* A2CF */,/*14930*/5019/* A2D0 */,/*14931*/5019/* A2D1 */, /*14932*/5019/* A2D2 */,/*14933*/5019/* A2D3 */,/*14934*/5019/* A2D4 */,/*14935*/5019/* A2D5 */,/*14936*/5019/* A2D6 */, /*14937*/5019/* A2D7 */,/*14938*/5019/* A2D8 */,/*14939*/5019/* A2D9 */,/*14940*/5019/* A2DA */,/*14941*/5019/* A2DB */, /*14942*/5019/* A2DC */,/*14943*/5019/* A2DD */,/*14944*/5019/* A2DE */,/*14945*/5019/* A2DF */,/*14946*/5019/* A2E0 */, /*14947*/5019/* A2E1 */,/*14948*/5019/* A2E2 */,/*14949*/5019/* A2E3 */,/*14950*/5019/* A2E4 */,/*14951*/5019/* A2E5 */, /*14952*/5019/* A2E6 */,/*14953*/5019/* A2E7 */,/*14954*/5019/* A2E8 */,/*14955*/5019/* A2E9 */,/*14956*/5019/* A2EA */, /*14957*/5019/* A2EB */,/*14958*/5019/* A2EC */,/*14959*/5019/* A2ED */,/*14960*/5019/* A2EE */,/*14961*/5019/* A2EF */, /*14962*/5019/* A2F0 */,/*14963*/5019/* A2F1 */,/*14964*/5019/* A2F2 */,/*14965*/5019/* A2F3 */,/*14966*/5019/* A2F4 */, /*14967*/5019/* A2F5 */,/*14968*/5019/* A2F6 */,/*14969*/5019/* A2F7 */,/*14970*/5019/* A2F8 */,/*14971*/5019/* A2F9 */, /*14972*/5019/* A2FA */,/*14973*/5019/* A2FB */,/*14974*/5019/* A2FC */,/*14975*/5019/* A2FD */,/*14976*/5019/* A2FE */, /*14977*/5019/* A2FF */,/*14978*/5019/* A300 */,/*14979*/5019/* A301 */,/*14980*/5019/* A302 */,/*14981*/5019/* A303 */, /*14982*/5019/* A304 */,/*14983*/5019/* A305 */,/*14984*/5019/* A306 */,/*14985*/5019/* A307 */,/*14986*/5019/* A308 */, /*14987*/5019/* A309 */,/*14988*/5019/* A30A */,/*14989*/5019/* A30B */,/*14990*/5019/* A30C */,/*14991*/5019/* A30D */, /*14992*/5019/* A30E */,/*14993*/5019/* A30F */,/*14994*/5019/* A310 */,/*14995*/5019/* A311 */,/*14996*/5019/* A312 */, /*14997*/5019/* A313 */,/*14998*/5019/* A314 */,/*14999*/5019/* A315 */,/*15000*/5019/* A316 */,/*15001*/5019/* A317 */, /*15002*/5019/* A318 */,/*15003*/5019/* A319 */,/*15004*/5019/* A31A */,/*15005*/5019/* A31B */,/*15006*/5019/* A31C */, /*15007*/5019/* A31D */,/*15008*/5019/* A31E */,/*15009*/5019/* A31F */,/*15010*/5019/* A320 */,/*15011*/5019/* A321 */, /*15012*/5019/* A322 */,/*15013*/5019/* A323 */,/*15014*/5019/* A324 */,/*15015*/5019/* A325 */,/*15016*/5019/* A326 */, /*15017*/5019/* A327 */,/*15018*/5019/* A328 */,/*15019*/5019/* A329 */,/*15020*/5019/* A32A */,/*15021*/5019/* A32B */, /*15022*/5019/* A32C */,/*15023*/5019/* A32D */,/*15024*/5019/* A32E */,/*15025*/5019/* A32F */,/*15026*/5019/* A330 */, /*15027*/5019/* A331 */,/*15028*/5019/* A332 */,/*15029*/5019/* A333 */,/*15030*/5019/* A334 */,/*15031*/5019/* A335 */, /*15032*/5019/* A336 */,/*15033*/5019/* A337 */,/*15034*/5019/* A338 */,/*15035*/5019/* A339 */,/*15036*/5019/* A33A */, /*15037*/5019/* A33B */,/*15038*/5019/* A33C */,/*15039*/5019/* A33D */,/*15040*/5019/* A33E */,/*15041*/5019/* A33F */, /*15042*/5019/* A340 */,/*15043*/5019/* A341 */,/*15044*/5019/* A342 */,/*15045*/5019/* A343 */,/*15046*/5019/* A344 */, /*15047*/5019/* A345 */,/*15048*/5019/* A346 */,/*15049*/5019/* A347 */,/*15050*/5019/* A348 */,/*15051*/5019/* A349 */, /*15052*/5019/* A34A */,/*15053*/5019/* A34B */,/*15054*/5019/* A34C */,/*15055*/5019/* A34D */,/*15056*/5019/* A34E */, /*15057*/5019/* A34F */,/*15058*/5019/* A350 */,/*15059*/5019/* A351 */,/*15060*/5019/* A352 */,/*15061*/5019/* A353 */, /*15062*/5019/* A354 */,/*15063*/5019/* A355 */,/*15064*/5019/* A356 */,/*15065*/5019/* A357 */,/*15066*/5019/* A358 */, /*15067*/5019/* A359 */,/*15068*/5019/* A35A */,/*15069*/5019/* A35B */,/*15070*/5019/* A35C */,/*15071*/5019/* A35D */, /*15072*/5019/* A35E */,/*15073*/5019/* A35F */,/*15074*/5019/* A360 */,/*15075*/5019/* A361 */,/*15076*/5019/* A362 */, /*15077*/5019/* A363 */,/*15078*/5019/* A364 */,/*15079*/5019/* A365 */,/*15080*/5019/* A366 */,/*15081*/5019/* A367 */, /*15082*/5019/* A368 */,/*15083*/5019/* A369 */,/*15084*/5019/* A36A */,/*15085*/5019/* A36B */,/*15086*/5019/* A36C */, /*15087*/5019/* A36D */,/*15088*/5019/* A36E */,/*15089*/5019/* A36F */,/*15090*/5019/* A370 */,/*15091*/5019/* A371 */, /*15092*/5019/* A372 */,/*15093*/5019/* A373 */,/*15094*/5019/* A374 */,/*15095*/5019/* A375 */,/*15096*/5019/* A376 */, /*15097*/5019/* A377 */,/*15098*/5019/* A378 */,/*15099*/5019/* A379 */,/*15100*/5019/* A37A */,/*15101*/5019/* A37B */, /*15102*/5019/* A37C */,/*15103*/5019/* A37D */,/*15104*/5019/* A37E */,/*15105*/5019/* A37F */,/*15106*/5019/* A380 */, /*15107*/5019/* A381 */,/*15108*/5019/* A382 */,/*15109*/5019/* A383 */,/*15110*/5019/* A384 */,/*15111*/5019/* A385 */, /*15112*/5019/* A386 */,/*15113*/5019/* A387 */,/*15114*/5019/* A388 */,/*15115*/5019/* A389 */,/*15116*/5019/* A38A */, /*15117*/5019/* A38B */,/*15118*/5019/* A38C */,/*15119*/5019/* A38D */,/*15120*/5019/* A38E */,/*15121*/5019/* A38F */, /*15122*/5019/* A390 */,/*15123*/5019/* A391 */,/*15124*/5019/* A392 */,/*15125*/5019/* A393 */,/*15126*/5019/* A394 */, /*15127*/5019/* A395 */,/*15128*/5019/* A396 */,/*15129*/5019/* A397 */,/*15130*/5019/* A398 */,/*15131*/5019/* A399 */, /*15132*/5019/* A39A */,/*15133*/5019/* A39B */,/*15134*/5019/* A39C */,/*15135*/5019/* A39D */,/*15136*/5019/* A39E */, /*15137*/5019/* A39F */,/*15138*/5019/* A3A0 */,/*15139*/5019/* A3A1 */,/*15140*/5019/* A3A2 */,/*15141*/5019/* A3A3 */, /*15142*/5019/* A3A4 */,/*15143*/5019/* A3A5 */,/*15144*/5019/* A3A6 */,/*15145*/5019/* A3A7 */,/*15146*/5019/* A3A8 */, /*15147*/5019/* A3A9 */,/*15148*/5019/* A3AA */,/*15149*/5019/* A3AB */,/*15150*/5019/* A3AC */,/*15151*/5019/* A3AD */, /*15152*/5019/* A3AE */,/*15153*/5019/* A3AF */,/*15154*/5019/* A3B0 */,/*15155*/5019/* A3B1 */,/*15156*/5019/* A3B2 */, /*15157*/5019/* A3B3 */,/*15158*/5019/* A3B4 */,/*15159*/5019/* A3B5 */,/*15160*/5019/* A3B6 */,/*15161*/5019/* A3B7 */, /*15162*/5019/* A3B8 */,/*15163*/5019/* A3B9 */,/*15164*/5019/* A3BA */,/*15165*/5019/* A3BB */,/*15166*/5019/* A3BC */, /*15167*/5019/* A3BD */,/*15168*/5019/* A3BE */,/*15169*/5019/* A3BF */,/*15170*/5019/* A3C0 */,/*15171*/5019/* A3C1 */, /*15172*/5019/* A3C2 */,/*15173*/5019/* A3C3 */,/*15174*/5019/* A3C4 */,/*15175*/5019/* A3C5 */,/*15176*/5019/* A3C6 */, /*15177*/5019/* A3C7 */,/*15178*/5019/* A3C8 */,/*15179*/5019/* A3C9 */,/*15180*/5019/* A3CA */,/*15181*/5019/* A3CB */, /*15182*/5019/* A3CC */,/*15183*/5019/* A3CD */,/*15184*/5019/* A3CE */,/*15185*/5019/* A3CF */,/*15186*/5019/* A3D0 */, /*15187*/5019/* A3D1 */,/*15188*/5019/* A3D2 */,/*15189*/5019/* A3D3 */,/*15190*/5019/* A3D4 */,/*15191*/5019/* A3D5 */, /*15192*/5019/* A3D6 */,/*15193*/5019/* A3D7 */,/*15194*/5019/* A3D8 */,/*15195*/5019/* A3D9 */,/*15196*/5019/* A3DA */, /*15197*/5019/* A3DB */,/*15198*/5019/* A3DC */,/*15199*/5019/* A3DD */,/*15200*/5019/* A3DE */,/*15201*/5019/* A3DF */, /*15202*/5019/* A3E0 */,/*15203*/5019/* A3E1 */,/*15204*/5019/* A3E2 */,/*15205*/5019/* A3E3 */,/*15206*/5019/* A3E4 */, /*15207*/5019/* A3E5 */,/*15208*/5019/* A3E6 */,/*15209*/5019/* A3E7 */,/*15210*/5019/* A3E8 */,/*15211*/5019/* A3E9 */, /*15212*/5019/* A3EA */,/*15213*/5019/* A3EB */,/*15214*/5019/* A3EC */,/*15215*/5019/* A3ED */,/*15216*/5019/* A3EE */, /*15217*/5019/* A3EF */,/*15218*/5019/* A3F0 */,/*15219*/5019/* A3F1 */,/*15220*/5019/* A3F2 */,/*15221*/5019/* A3F3 */, /*15222*/5019/* A3F4 */,/*15223*/5019/* A3F5 */,/*15224*/5019/* A3F6 */,/*15225*/5019/* A3F7 */,/*15226*/5019/* A3F8 */, /*15227*/5019/* A3F9 */,/*15228*/5019/* A3FA */,/*15229*/5019/* A3FB */,/*15230*/5019/* A3FC */,/*15231*/5019/* A3FD */, /*15232*/5019/* A3FE */,/*15233*/5019/* A3FF */,/*15234*/5019/* A400 */,/*15235*/5019/* A401 */,/*15236*/5019/* A402 */, /*15237*/5019/* A403 */,/*15238*/5019/* A404 */,/*15239*/5019/* A405 */,/*15240*/5019/* A406 */,/*15241*/5019/* A407 */, /*15242*/5019/* A408 */,/*15243*/5019/* A409 */,/*15244*/5019/* A40A */,/*15245*/5019/* A40B */,/*15246*/5019/* A40C */, /*15247*/5019/* A40D */,/*15248*/5019/* A40E */,/*15249*/5019/* A40F */,/*15250*/5019/* A410 */,/*15251*/5019/* A411 */, /*15252*/5019/* A412 */,/*15253*/5019/* A413 */,/*15254*/5019/* A414 */,/*15255*/5019/* A415 */,/*15256*/5019/* A416 */, /*15257*/5019/* A417 */,/*15258*/5019/* A418 */,/*15259*/5019/* A419 */,/*15260*/5019/* A41A */,/*15261*/5019/* A41B */, /*15262*/5019/* A41C */,/*15263*/5019/* A41D */,/*15264*/5019/* A41E */,/*15265*/5019/* A41F */,/*15266*/5019/* A420 */, /*15267*/5019/* A421 */,/*15268*/5019/* A422 */,/*15269*/5019/* A423 */,/*15270*/5019/* A424 */,/*15271*/5019/* A425 */, /*15272*/5019/* A426 */,/*15273*/5019/* A427 */,/*15274*/5019/* A428 */,/*15275*/5019/* A429 */,/*15276*/5019/* A42A */, /*15277*/5019/* A42B */,/*15278*/5019/* A42C */,/*15279*/5019/* A42D */,/*15280*/5019/* A42E */,/*15281*/5019/* A42F */, /*15282*/5019/* A430 */,/*15283*/5019/* A431 */,/*15284*/5019/* A432 */,/*15285*/5019/* A433 */,/*15286*/5019/* A434 */, /*15287*/5019/* A435 */,/*15288*/5019/* A436 */,/*15289*/5019/* A437 */,/*15290*/5019/* A438 */,/*15291*/5019/* A439 */, /*15292*/5019/* A43A */,/*15293*/5019/* A43B */,/*15294*/5019/* A43C */,/*15295*/5019/* A43D */,/*15296*/5019/* A43E */, /*15297*/5019/* A43F */,/*15298*/5019/* A440 */,/*15299*/5019/* A441 */,/*15300*/5019/* A442 */,/*15301*/5019/* A443 */, /*15302*/5019/* A444 */,/*15303*/5019/* A445 */,/*15304*/5019/* A446 */,/*15305*/5019/* A447 */,/*15306*/5019/* A448 */, /*15307*/5019/* A449 */,/*15308*/5019/* A44A */,/*15309*/5019/* A44B */,/*15310*/5019/* A44C */,/*15311*/5019/* A44D */, /*15312*/5019/* A44E */,/*15313*/5019/* A44F */,/*15314*/5019/* A450 */,/*15315*/5019/* A451 */,/*15316*/5019/* A452 */, /*15317*/5019/* A453 */,/*15318*/5019/* A454 */,/*15319*/5019/* A455 */,/*15320*/5019/* A456 */,/*15321*/5019/* A457 */, /*15322*/5019/* A458 */,/*15323*/5019/* A459 */,/*15324*/5019/* A45A */,/*15325*/5019/* A45B */,/*15326*/5019/* A45C */, /*15327*/5019/* A45D */,/*15328*/5019/* A45E */,/*15329*/5019/* A45F */,/*15330*/5019/* A460 */,/*15331*/5019/* A461 */, /*15332*/5019/* A462 */,/*15333*/5019/* A463 */,/*15334*/5019/* A464 */,/*15335*/5019/* A465 */,/*15336*/5019/* A466 */, /*15337*/5019/* A467 */,/*15338*/5019/* A468 */,/*15339*/5019/* A469 */,/*15340*/5019/* A46A */,/*15341*/5019/* A46B */, /*15342*/5019/* A46C */,/*15343*/5019/* A46D */,/*15344*/5019/* A46E */,/*15345*/5019/* A46F */,/*15346*/5019/* A470 */, /*15347*/5019/* A471 */,/*15348*/5019/* A472 */,/*15349*/5019/* A473 */,/*15350*/5019/* A474 */,/*15351*/5019/* A475 */, /*15352*/5019/* A476 */,/*15353*/5019/* A477 */,/*15354*/5019/* A478 */,/*15355*/5019/* A479 */,/*15356*/5019/* A47A */, /*15357*/5019/* A47B */,/*15358*/5019/* A47C */,/*15359*/5019/* A47D */,/*15360*/5019/* A47E */,/*15361*/5019/* A47F */, /*15362*/5019/* A480 */,/*15363*/5019/* A481 */,/*15364*/5019/* A482 */,/*15365*/5019/* A483 */,/*15366*/5019/* A484 */, /*15367*/5019/* A485 */,/*15368*/5019/* A486 */,/*15369*/5019/* A487 */,/*15370*/5019/* A488 */,/*15371*/5019/* A489 */, /*15372*/5019/* A48A */,/*15373*/5019/* A48B */,/*15374*/5019/* A48C */,0,0,0,/*15378*/5021/* A490 */, /*15379*/5021/* A491 */,/*15380*/5021/* A492 */,/*15381*/5021/* A493 */,/*15382*/5021/* A494 */,/*15383*/5021/* A495 */, /*15384*/5021/* A496 */,/*15385*/5021/* A497 */,/*15386*/5021/* A498 */,/*15387*/5021/* A499 */,/*15388*/5021/* A49A */, /*15389*/5021/* A49B */,/*15390*/5021/* A49C */,/*15391*/5021/* A49D */,/*15392*/5021/* A49E */,/*15393*/5021/* A49F */, /*15394*/5021/* A4A0 */,/*15395*/5021/* A4A1 */,/*15396*/5022/* A4A2 */,/*15397*/5022/* A4A3 */,/*15398*/5021/* A4A4 */, /*15399*/5021/* A4A5 */,/*15400*/5021/* A4A6 */,/*15401*/5021/* A4A7 */,/*15402*/5021/* A4A8 */,/*15403*/5021/* A4A9 */, /*15404*/5021/* A4AA */,/*15405*/5021/* A4AB */,/*15406*/5021/* A4AC */,/*15407*/5021/* A4AD */,/*15408*/5021/* A4AE */, /*15409*/5021/* A4AF */,/*15410*/5021/* A4B0 */,/*15411*/5021/* A4B1 */,/*15412*/5021/* A4B2 */,/*15413*/5021/* A4B3 */, /*15414*/5022/* A4B4 */,/*15415*/5021/* A4B5 */,/*15416*/5021/* A4B6 */,/*15417*/5021/* A4B7 */,/*15418*/5021/* A4B8 */, /*15419*/5021/* A4B9 */,/*15420*/5021/* A4BA */,/*15421*/5021/* A4BB */,/*15422*/5021/* A4BC */,/*15423*/5021/* A4BD */, /*15424*/5021/* A4BE */,/*15425*/5021/* A4BF */,/*15426*/5021/* A4C0 */,/*15427*/5022/* A4C1 */,/*15428*/5021/* A4C2 */, /*15429*/5021/* A4C3 */,/*15430*/5021/* A4C4 */,/*15431*/5022/* A4C5 */,/*15432*/5021/* A4C6 */,0,0,0,0,0,0,0,0,0, /*15442*/5023/* A4D0 */,/*15443*/5023/* A4D1 */,/*15444*/5023/* A4D2 */,/*15445*/5023/* A4D3 */,/*15446*/5023/* A4D4 */, /*15447*/5023/* A4D5 */,/*15448*/5023/* A4D6 */,/*15449*/5023/* A4D7 */,/*15450*/5023/* A4D8 */,/*15451*/5023/* A4D9 */, /*15452*/5023/* A4DA */,/*15453*/5023/* A4DB */,/*15454*/5023/* A4DC */,/*15455*/5023/* A4DD */,/*15456*/5023/* A4DE */, /*15457*/5023/* A4DF */,/*15458*/5023/* A4E0 */,/*15459*/5023/* A4E1 */,/*15460*/5023/* A4E2 */,/*15461*/5023/* A4E3 */, /*15462*/5023/* A4E4 */,/*15463*/5023/* A4E5 */,/*15464*/5023/* A4E6 */,/*15465*/5023/* A4E7 */,/*15466*/5023/* A4E8 */, /*15467*/5023/* A4E9 */,/*15468*/5023/* A4EA */,/*15469*/5023/* A4EB */,/*15470*/5023/* A4EC */,/*15471*/5023/* A4ED */, /*15472*/5023/* A4EE */,/*15473*/5023/* A4EF */,/*15474*/5023/* A4F0 */,/*15475*/5023/* A4F1 */,/*15476*/5023/* A4F2 */, /*15477*/5023/* A4F3 */,/*15478*/5023/* A4F4 */,/*15479*/5023/* A4F5 */,/*15480*/5023/* A4F6 */,/*15481*/5023/* A4F7 */, /*15482*/5024/* A4F8 */,/*15483*/5024/* A4F9 */,/*15484*/5024/* A4FA */,/*15485*/5024/* A4FB */,/*15486*/5024/* A4FC */, /*15487*/5024/* A4FD */,/*15488*/5025/* A4FE */,/*15489*/5026/* A4FF */,/*15490*/5027/* A500 */,/*15491*/5027/* A501 */, /*15492*/5027/* A502 */,/*15493*/5027/* A503 */,/*15494*/5027/* A504 */,/*15495*/5027/* A505 */,/*15496*/5027/* A506 */, /*15497*/5027/* A507 */,/*15498*/5027/* A508 */,/*15499*/5027/* A509 */,/*15500*/5027/* A50A */,/*15501*/5027/* A50B */, /*15502*/5027/* A50C */,/*15503*/5027/* A50D */,/*15504*/5027/* A50E */,/*15505*/5027/* A50F */,/*15506*/5027/* A510 */, /*15507*/5027/* A511 */,/*15508*/5027/* A512 */,/*15509*/5027/* A513 */,/*15510*/5027/* A514 */,/*15511*/5027/* A515 */, /*15512*/5027/* A516 */,/*15513*/5027/* A517 */,/*15514*/5027/* A518 */,/*15515*/5027/* A519 */,/*15516*/5027/* A51A */, /*15517*/5027/* A51B */,/*15518*/5027/* A51C */,/*15519*/5027/* A51D */,/*15520*/5027/* A51E */,/*15521*/5027/* A51F */, /*15522*/5027/* A520 */,/*15523*/5027/* A521 */,/*15524*/5027/* A522 */,/*15525*/5027/* A523 */,/*15526*/5027/* A524 */, /*15527*/5027/* A525 */,/*15528*/5027/* A526 */,/*15529*/5027/* A527 */,/*15530*/5027/* A528 */,/*15531*/5027/* A529 */, /*15532*/5027/* A52A */,/*15533*/5027/* A52B */,/*15534*/5027/* A52C */,/*15535*/5027/* A52D */,/*15536*/5027/* A52E */, /*15537*/5027/* A52F */,/*15538*/5027/* A530 */,/*15539*/5027/* A531 */,/*15540*/5027/* A532 */,/*15541*/5027/* A533 */, /*15542*/5027/* A534 */,/*15543*/5027/* A535 */,/*15544*/5027/* A536 */,/*15545*/5027/* A537 */,/*15546*/5027/* A538 */, /*15547*/5027/* A539 */,/*15548*/5027/* A53A */,/*15549*/5027/* A53B */,/*15550*/5027/* A53C */,/*15551*/5027/* A53D */, /*15552*/5027/* A53E */,/*15553*/5027/* A53F */,/*15554*/5027/* A540 */,/*15555*/5027/* A541 */,/*15556*/5027/* A542 */, /*15557*/5027/* A543 */,/*15558*/5027/* A544 */,/*15559*/5027/* A545 */,/*15560*/5027/* A546 */,/*15561*/5027/* A547 */, /*15562*/5027/* A548 */,/*15563*/5027/* A549 */,/*15564*/5027/* A54A */,/*15565*/5027/* A54B */,/*15566*/5027/* A54C */, /*15567*/5027/* A54D */,/*15568*/5027/* A54E */,/*15569*/5027/* A54F */,/*15570*/5027/* A550 */,/*15571*/5027/* A551 */, /*15572*/5027/* A552 */,/*15573*/5027/* A553 */,/*15574*/5027/* A554 */,/*15575*/5027/* A555 */,/*15576*/5027/* A556 */, /*15577*/5027/* A557 */,/*15578*/5027/* A558 */,/*15579*/5027/* A559 */,/*15580*/5027/* A55A */,/*15581*/5027/* A55B */, /*15582*/5027/* A55C */,/*15583*/5027/* A55D */,/*15584*/5027/* A55E */,/*15585*/5027/* A55F */,/*15586*/5027/* A560 */, /*15587*/5027/* A561 */,/*15588*/5027/* A562 */,/*15589*/5027/* A563 */,/*15590*/5027/* A564 */,/*15591*/5027/* A565 */, /*15592*/5027/* A566 */,/*15593*/5027/* A567 */,/*15594*/5027/* A568 */,/*15595*/5027/* A569 */,/*15596*/5027/* A56A */, /*15597*/5027/* A56B */,/*15598*/5027/* A56C */,/*15599*/5027/* A56D */,/*15600*/5027/* A56E */,/*15601*/5027/* A56F */, /*15602*/5027/* A570 */,/*15603*/5027/* A571 */,/*15604*/5027/* A572 */,/*15605*/5027/* A573 */,/*15606*/5027/* A574 */, /*15607*/5027/* A575 */,/*15608*/5027/* A576 */,/*15609*/5027/* A577 */,/*15610*/5027/* A578 */,/*15611*/5027/* A579 */, /*15612*/5027/* A57A */,/*15613*/5027/* A57B */,/*15614*/5027/* A57C */,/*15615*/5027/* A57D */,/*15616*/5027/* A57E */, /*15617*/5027/* A57F */,/*15618*/5027/* A580 */,/*15619*/5027/* A581 */,/*15620*/5027/* A582 */,/*15621*/5027/* A583 */, /*15622*/5027/* A584 */,/*15623*/5027/* A585 */,/*15624*/5027/* A586 */,/*15625*/5027/* A587 */,/*15626*/5027/* A588 */, /*15627*/5027/* A589 */,/*15628*/5027/* A58A */,/*15629*/5027/* A58B */,/*15630*/5027/* A58C */,/*15631*/5027/* A58D */, /*15632*/5027/* A58E */,/*15633*/5027/* A58F */,/*15634*/5027/* A590 */,/*15635*/5027/* A591 */,/*15636*/5027/* A592 */, /*15637*/5027/* A593 */,/*15638*/5027/* A594 */,/*15639*/5027/* A595 */,/*15640*/5027/* A596 */,/*15641*/5027/* A597 */, /*15642*/5027/* A598 */,/*15643*/5027/* A599 */,/*15644*/5027/* A59A */,/*15645*/5027/* A59B */,/*15646*/5027/* A59C */, /*15647*/5027/* A59D */,/*15648*/5027/* A59E */,/*15649*/5027/* A59F */,/*15650*/5027/* A5A0 */,/*15651*/5027/* A5A1 */, /*15652*/5027/* A5A2 */,/*15653*/5027/* A5A3 */,/*15654*/5027/* A5A4 */,/*15655*/5027/* A5A5 */,/*15656*/5027/* A5A6 */, /*15657*/5027/* A5A7 */,/*15658*/5027/* A5A8 */,/*15659*/5027/* A5A9 */,/*15660*/5027/* A5AA */,/*15661*/5027/* A5AB */, /*15662*/5027/* A5AC */,/*15663*/5027/* A5AD */,/*15664*/5027/* A5AE */,/*15665*/5027/* A5AF */,/*15666*/5027/* A5B0 */, /*15667*/5027/* A5B1 */,/*15668*/5027/* A5B2 */,/*15669*/5027/* A5B3 */,/*15670*/5027/* A5B4 */,/*15671*/5027/* A5B5 */, /*15672*/5027/* A5B6 */,/*15673*/5027/* A5B7 */,/*15674*/5027/* A5B8 */,/*15675*/5027/* A5B9 */,/*15676*/5027/* A5BA */, /*15677*/5027/* A5BB */,/*15678*/5027/* A5BC */,/*15679*/5027/* A5BD */,/*15680*/5027/* A5BE */,/*15681*/5027/* A5BF */, /*15682*/5027/* A5C0 */,/*15683*/5027/* A5C1 */,/*15684*/5027/* A5C2 */,/*15685*/5027/* A5C3 */,/*15686*/5027/* A5C4 */, /*15687*/5027/* A5C5 */,/*15688*/5027/* A5C6 */,/*15689*/5027/* A5C7 */,/*15690*/5027/* A5C8 */,/*15691*/5027/* A5C9 */, /*15692*/5027/* A5CA */,/*15693*/5027/* A5CB */,/*15694*/5027/* A5CC */,/*15695*/5027/* A5CD */,/*15696*/5027/* A5CE */, /*15697*/5027/* A5CF */,/*15698*/5027/* A5D0 */,/*15699*/5027/* A5D1 */,/*15700*/5027/* A5D2 */,/*15701*/5027/* A5D3 */, /*15702*/5027/* A5D4 */,/*15703*/5027/* A5D5 */,/*15704*/5027/* A5D6 */,/*15705*/5027/* A5D7 */,/*15706*/5027/* A5D8 */, /*15707*/5027/* A5D9 */,/*15708*/5027/* A5DA */,/*15709*/5027/* A5DB */,/*15710*/5027/* A5DC */,/*15711*/5027/* A5DD */, /*15712*/5027/* A5DE */,/*15713*/5027/* A5DF */,/*15714*/5027/* A5E0 */,/*15715*/5027/* A5E1 */,/*15716*/5027/* A5E2 */, /*15717*/5027/* A5E3 */,/*15718*/5027/* A5E4 */,/*15719*/5027/* A5E5 */,/*15720*/5027/* A5E6 */,/*15721*/5027/* A5E7 */, /*15722*/5027/* A5E8 */,/*15723*/5027/* A5E9 */,/*15724*/5027/* A5EA */,/*15725*/5027/* A5EB */,/*15726*/5027/* A5EC */, /*15727*/5027/* A5ED */,/*15728*/5027/* A5EE */,/*15729*/5027/* A5EF */,/*15730*/5027/* A5F0 */,/*15731*/5027/* A5F1 */, /*15732*/5027/* A5F2 */,/*15733*/5027/* A5F3 */,/*15734*/5027/* A5F4 */,/*15735*/5027/* A5F5 */,/*15736*/5027/* A5F6 */, /*15737*/5027/* A5F7 */,/*15738*/5027/* A5F8 */,/*15739*/5027/* A5F9 */,/*15740*/5027/* A5FA */,/*15741*/5027/* A5FB */, /*15742*/5027/* A5FC */,/*15743*/5027/* A5FD */,/*15744*/5027/* A5FE */,/*15745*/5027/* A5FF */,/*15746*/5027/* A600 */, /*15747*/5027/* A601 */,/*15748*/5027/* A602 */,/*15749*/5027/* A603 */,/*15750*/5027/* A604 */,/*15751*/5027/* A605 */, /*15752*/5027/* A606 */,/*15753*/5027/* A607 */,/*15754*/5027/* A608 */,/*15755*/5027/* A609 */,/*15756*/5027/* A60A */, /*15757*/5027/* A60B */,/*15758*/5028/* A60C */,/*15759*/5029/* A60D */,/*15760*/5030/* A60E */,/*15761*/5030/* A60F */, /*15762*/5027/* A610 */,/*15763*/5027/* A611 */,/*15764*/5027/* A612 */,/*15765*/5027/* A613 */,/*15766*/5027/* A614 */, /*15767*/5027/* A615 */,/*15768*/5027/* A616 */,/*15769*/5027/* A617 */,/*15770*/5027/* A618 */,/*15771*/5027/* A619 */, /*15772*/5027/* A61A */,/*15773*/5027/* A61B */,/*15774*/5027/* A61C */,/*15775*/5027/* A61D */,/*15776*/5027/* A61E */, /*15777*/5027/* A61F */,/*15778*/5031/* A620 */,/*15779*/5032/* A621 */,/*15780*/5033/* A622 */,/*15781*/5034/* A623 */, /*15782*/5035/* A624 */,/*15783*/5036/* A625 */,/*15784*/5037/* A626 */,/*15785*/5038/* A627 */,/*15786*/5039/* A628 */, /*15787*/5040/* A629 */,/*15788*/5027/* A62A */,/*15789*/5027/* A62B */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*15810*/5041/* A640 */,/*15811*/5042/* A641 */,/*15812*/5043/* A642 */,/*15813*/5044/* A643 */,/*15814*/5045/* A644 */, /*15815*/5046/* A645 */,/*15816*/5047/* A646 */,/*15817*/5048/* A647 */,/*15818*/5049/* A648 */,/*15819*/5050/* A649 */, /*15820*/5051/* A64A */,/*15821*/5052/* A64B */,/*15822*/5053/* A64C */,/*15823*/5054/* A64D */,/*15824*/5055/* A64E */, /*15825*/5056/* A64F */,/*15826*/5057/* A650 */,/*15827*/5058/* A651 */,/*15828*/5059/* A652 */,/*15829*/5060/* A653 */, /*15830*/5061/* A654 */,/*15831*/5062/* A655 */,/*15832*/5063/* A656 */,/*15833*/5064/* A657 */,/*15834*/5065/* A658 */, /*15835*/5066/* A659 */,/*15836*/5067/* A65A */,/*15837*/5068/* A65B */,/*15838*/5069/* A65C */,/*15839*/5070/* A65D */, /*15840*/5071/* A65E */,/*15841*/5072/* A65F */,/*15842*/5073/* A660 */,/*15843*/5074/* A661 */,/*15844*/5075/* A662 */, /*15845*/5076/* A663 */,/*15846*/5077/* A664 */,/*15847*/5078/* A665 */,/*15848*/5079/* A666 */,/*15849*/5080/* A667 */, /*15850*/5081/* A668 */,/*15851*/5082/* A669 */,/*15852*/5083/* A66A */,/*15853*/5084/* A66B */,/*15854*/5085/* A66C */, /*15855*/5086/* A66D */,/*15856*/5087/* A66E */,/*15857*/5088/* A66F */,/*15858*/5089/* A670 */,/*15859*/5089/* A671 */, /*15860*/5089/* A672 */,/*15861*/5090/* A673 */,/*15862*/5091/* A674 */,/*15863*/5091/* A675 */,/*15864*/5091/* A676 */, /*15865*/5091/* A677 */,/*15866*/5091/* A678 */,/*15867*/5091/* A679 */,/*15868*/5091/* A67A */,/*15869*/5091/* A67B */, /*15870*/5088/* A67C */,/*15871*/5088/* A67D */,/*15872*/5090/* A67E */,/*15873*/5092/* A67F */,/*15874*/5093/* A680 */, /*15875*/5094/* A681 */,/*15876*/5095/* A682 */,/*15877*/5096/* A683 */,/*15878*/5097/* A684 */,/*15879*/5098/* A685 */, /*15880*/5099/* A686 */,/*15881*/5100/* A687 */,/*15882*/5101/* A688 */,/*15883*/5102/* A689 */,/*15884*/5103/* A68A */, /*15885*/5104/* A68B */,/*15886*/5105/* A68C */,/*15887*/5106/* A68D */,/*15888*/5107/* A68E */,/*15889*/5108/* A68F */, /*15890*/5109/* A690 */,/*15891*/5110/* A691 */,/*15892*/5111/* A692 */,/*15893*/5112/* A693 */,/*15894*/5113/* A694 */, /*15895*/5114/* A695 */,/*15896*/5115/* A696 */,/*15897*/5116/* A697 */,/*15898*/5117/* A698 */,/*15899*/5118/* A699 */, /*15900*/5119/* A69A */,/*15901*/5120/* A69B */,/*15902*/5121/* A69C */,/*15903*/5122/* A69D */,/*15904*/5123/* A69E */, /*15905*/5091/* A69F */,/*15906*/5124/* A6A0 */,/*15907*/5124/* A6A1 */,/*15908*/5124/* A6A2 */,/*15909*/5124/* A6A3 */, /*15910*/5124/* A6A4 */,/*15911*/5124/* A6A5 */,/*15912*/5124/* A6A6 */,/*15913*/5124/* A6A7 */,/*15914*/5124/* A6A8 */, /*15915*/5124/* A6A9 */,/*15916*/5124/* A6AA */,/*15917*/5124/* A6AB */,/*15918*/5124/* A6AC */,/*15919*/5124/* A6AD */, /*15920*/5124/* A6AE */,/*15921*/5124/* A6AF */,/*15922*/5124/* A6B0 */,/*15923*/5124/* A6B1 */,/*15924*/5124/* A6B2 */, /*15925*/5124/* A6B3 */,/*15926*/5124/* A6B4 */,/*15927*/5124/* A6B5 */,/*15928*/5124/* A6B6 */,/*15929*/5124/* A6B7 */, /*15930*/5124/* A6B8 */,/*15931*/5124/* A6B9 */,/*15932*/5124/* A6BA */,/*15933*/5124/* A6BB */,/*15934*/5124/* A6BC */, /*15935*/5124/* A6BD */,/*15936*/5124/* A6BE */,/*15937*/5124/* A6BF */,/*15938*/5124/* A6C0 */,/*15939*/5124/* A6C1 */, /*15940*/5124/* A6C2 */,/*15941*/5124/* A6C3 */,/*15942*/5124/* A6C4 */,/*15943*/5124/* A6C5 */,/*15944*/5124/* A6C6 */, /*15945*/5124/* A6C7 */,/*15946*/5124/* A6C8 */,/*15947*/5124/* A6C9 */,/*15948*/5124/* A6CA */,/*15949*/5124/* A6CB */, /*15950*/5124/* A6CC */,/*15951*/5124/* A6CD */,/*15952*/5124/* A6CE */,/*15953*/5124/* A6CF */,/*15954*/5124/* A6D0 */, /*15955*/5124/* A6D1 */,/*15956*/5124/* A6D2 */,/*15957*/5124/* A6D3 */,/*15958*/5124/* A6D4 */,/*15959*/5124/* A6D5 */, /*15960*/5124/* A6D6 */,/*15961*/5124/* A6D7 */,/*15962*/5124/* A6D8 */,/*15963*/5124/* A6D9 */,/*15964*/5124/* A6DA */, /*15965*/5124/* A6DB */,/*15966*/5124/* A6DC */,/*15967*/5124/* A6DD */,/*15968*/5124/* A6DE */,/*15969*/5124/* A6DF */, /*15970*/5124/* A6E0 */,/*15971*/5124/* A6E1 */,/*15972*/5124/* A6E2 */,/*15973*/5124/* A6E3 */,/*15974*/5124/* A6E4 */, /*15975*/5124/* A6E5 */,/*15976*/5125/* A6E6 */,/*15977*/5126/* A6E7 */,/*15978*/5127/* A6E8 */,/*15979*/5128/* A6E9 */, /*15980*/5129/* A6EA */,/*15981*/5130/* A6EB */,/*15982*/5131/* A6EC */,/*15983*/5132/* A6ED */,/*15984*/5133/* A6EE */, /*15985*/5134/* A6EF */,/*15986*/5135/* A6F0 */,/*15987*/5135/* A6F1 */,/*15988*/5136/* A6F2 */,/*15989*/5137/* A6F3 */, /*15990*/5138/* A6F4 */,/*15991*/5138/* A6F5 */,/*15992*/5138/* A6F6 */,/*15993*/5137/* A6F7 */,0,0,0,0,0,0,0,0, /*16002*/5139/* A700 */,/*16003*/5139/* A701 */,/*16004*/5139/* A702 */,/*16005*/5139/* A703 */,/*16006*/5139/* A704 */, /*16007*/5139/* A705 */,/*16008*/5139/* A706 */,/*16009*/5139/* A707 */,/*16010*/5139/* A708 */,/*16011*/5139/* A709 */, /*16012*/5139/* A70A */,/*16013*/5139/* A70B */,/*16014*/5139/* A70C */,/*16015*/5139/* A70D */,/*16016*/5139/* A70E */, /*16017*/5139/* A70F */,/*16018*/5139/* A710 */,/*16019*/5139/* A711 */,/*16020*/5139/* A712 */,/*16021*/5139/* A713 */, /*16022*/5139/* A714 */,/*16023*/5139/* A715 */,/*16024*/5139/* A716 */,/*16025*/5140/* A717 */,/*16026*/5140/* A718 */, /*16027*/5140/* A719 */,/*16028*/5140/* A71A */,/*16029*/5141/* A71B */,/*16030*/5141/* A71C */,/*16031*/5141/* A71D */, /*16032*/5141/* A71E */,/*16033*/5141/* A71F */,/*16034*/5142/* A720 */,/*16035*/5142/* A721 */,/*16036*/5143/* A722 */, /*16037*/5144/* A723 */,/*16038*/5145/* A724 */,/*16039*/5146/* A725 */,/*16040*/5147/* A726 */,/*16041*/5148/* A727 */, /*16042*/5149/* A728 */,/*16043*/5150/* A729 */,/*16044*/5151/* A72A */,/*16045*/5152/* A72B */,/*16046*/5153/* A72C */, /*16047*/5154/* A72D */,/*16048*/5155/* A72E */,/*16049*/5156/* A72F */,/*16050*/5157/* A730 */,/*16051*/5157/* A731 */, /*16052*/5158/* A732 */,/*16053*/5159/* A733 */,/*16054*/5160/* A734 */,/*16055*/5161/* A735 */,/*16056*/5162/* A736 */, /*16057*/5163/* A737 */,/*16058*/5164/* A738 */,/*16059*/5165/* A739 */,/*16060*/5166/* A73A */,/*16061*/5167/* A73B */, /*16062*/5168/* A73C */,/*16063*/5169/* A73D */,/*16064*/5170/* A73E */,/*16065*/5171/* A73F */,/*16066*/5172/* A740 */, /*16067*/5173/* A741 */,/*16068*/5174/* A742 */,/*16069*/5175/* A743 */,/*16070*/5176/* A744 */,/*16071*/5177/* A745 */, /*16072*/5178/* A746 */,/*16073*/5179/* A747 */,/*16074*/5180/* A748 */,/*16075*/5181/* A749 */,/*16076*/5182/* A74A */, /*16077*/5183/* A74B */,/*16078*/5184/* A74C */,/*16079*/5185/* A74D */,/*16080*/5186/* A74E */,/*16081*/5187/* A74F */, /*16082*/5188/* A750 */,/*16083*/5189/* A751 */,/*16084*/5190/* A752 */,/*16085*/5191/* A753 */,/*16086*/5192/* A754 */, /*16087*/5193/* A755 */,/*16088*/5194/* A756 */,/*16089*/5195/* A757 */,/*16090*/5196/* A758 */,/*16091*/5197/* A759 */, /*16092*/5198/* A75A */,/*16093*/5199/* A75B */,/*16094*/5200/* A75C */,/*16095*/5201/* A75D */,/*16096*/5202/* A75E */, /*16097*/5203/* A75F */,/*16098*/5204/* A760 */,/*16099*/5205/* A761 */,/*16100*/5206/* A762 */,/*16101*/5207/* A763 */, /*16102*/5208/* A764 */,/*16103*/5209/* A765 */,/*16104*/5210/* A766 */,/*16105*/5211/* A767 */,/*16106*/5212/* A768 */, /*16107*/5213/* A769 */,/*16108*/5214/* A76A */,/*16109*/5215/* A76B */,/*16110*/5216/* A76C */,/*16111*/5217/* A76D */, /*16112*/5218/* A76E */,/*16113*/5219/* A76F */,/*16114*/5220/* A770 */,/*16115*/5157/* A771 */,/*16116*/5157/* A772 */, /*16117*/5157/* A773 */,/*16118*/5157/* A774 */,/*16119*/5157/* A775 */,/*16120*/5157/* A776 */,/*16121*/5157/* A777 */, /*16122*/5157/* A778 */,/*16123*/5221/* A779 */,/*16124*/5222/* A77A */,/*16125*/5223/* A77B */,/*16126*/5224/* A77C */, /*16127*/5225/* A77D */,/*16128*/5226/* A77E */,/*16129*/5227/* A77F */,/*16130*/5228/* A780 */,/*16131*/5229/* A781 */, /*16132*/5230/* A782 */,/*16133*/5231/* A783 */,/*16134*/5232/* A784 */,/*16135*/5233/* A785 */,/*16136*/5234/* A786 */, /*16137*/5235/* A787 */,/*16138*/5236/* A788 */,/*16139*/5237/* A789 */,/*16140*/5237/* A78A */,/*16141*/5238/* A78B */, /*16142*/5239/* A78C */,/*16143*/5240/* A78D */,/*16144*/5241/* A78E */,/*16145*/5242/* A78F */,/*16146*/5243/* A790 */, /*16147*/5244/* A791 */,/*16148*/5245/* A792 */,/*16149*/5246/* A793 */,/*16150*/5247/* A794 */,/*16151*/5247/* A795 */, /*16152*/5248/* A796 */,/*16153*/5249/* A797 */,/*16154*/5250/* A798 */,/*16155*/5251/* A799 */,/*16156*/5252/* A79A */, /*16157*/5253/* A79B */,/*16158*/5254/* A79C */,/*16159*/5255/* A79D */,/*16160*/5256/* A79E */,/*16161*/5257/* A79F */, /*16162*/5258/* A7A0 */,/*16163*/5259/* A7A1 */,/*16164*/5260/* A7A2 */,/*16165*/5261/* A7A3 */,/*16166*/5262/* A7A4 */, /*16167*/5263/* A7A5 */,/*16168*/5264/* A7A6 */,/*16169*/5265/* A7A7 */,/*16170*/5266/* A7A8 */,/*16171*/5267/* A7A9 */, /*16172*/5268/* A7AA */,/*16173*/5269/* A7AB */,/*16174*/5270/* A7AC */,/*16175*/5271/* A7AD */,0,0, /*16178*/5272/* A7B0 */,/*16179*/5273/* A7B1 */,/*16180*/5274/* A7B2 */,/*16181*/5275/* A7B3 */,/*16182*/5276/* A7B4 */, /*16183*/5277/* A7B5 */,/*16184*/5278/* A7B6 */,/*16185*/5279/* A7B7 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*16249*/5280/* A7F7 */, /*16250*/5281/* A7F8 */,/*16251*/5282/* A7F9 */,/*16252*/5241/* A7FA */,/*16253*/5283/* A7FB */,/*16254*/5283/* A7FC */, /*16255*/5283/* A7FD */,/*16256*/5283/* A7FE */,/*16257*/5283/* A7FF */,/*16258*/5284/* A800 */,/*16259*/5284/* A801 */, /*16260*/5285/* A802 */,/*16261*/5284/* A803 */,/*16262*/5284/* A804 */,/*16263*/5284/* A805 */,/*16264*/5286/* A806 */, /*16265*/5284/* A807 */,/*16266*/5284/* A808 */,/*16267*/5284/* A809 */,/*16268*/5284/* A80A */,/*16269*/5285/* A80B */, /*16270*/5284/* A80C */,/*16271*/5284/* A80D */,/*16272*/5284/* A80E */,/*16273*/5284/* A80F */,/*16274*/5284/* A810 */, /*16275*/5284/* A811 */,/*16276*/5284/* A812 */,/*16277*/5284/* A813 */,/*16278*/5284/* A814 */,/*16279*/5284/* A815 */, /*16280*/5284/* A816 */,/*16281*/5284/* A817 */,/*16282*/5284/* A818 */,/*16283*/5284/* A819 */,/*16284*/5284/* A81A */, /*16285*/5284/* A81B */,/*16286*/5284/* A81C */,/*16287*/5284/* A81D */,/*16288*/5284/* A81E */,/*16289*/5284/* A81F */, /*16290*/5284/* A820 */,/*16291*/5284/* A821 */,/*16292*/5284/* A822 */,/*16293*/5287/* A823 */,/*16294*/5287/* A824 */, /*16295*/5288/* A825 */,/*16296*/5288/* A826 */,/*16297*/5287/* A827 */,/*16298*/5289/* A828 */,/*16299*/5289/* A829 */, /*16300*/5289/* A82A */,/*16301*/5289/* A82B */,0,0,0,0,/*16306*/5290/* A830 */,/*16307*/5291/* A831 */, /*16308*/5292/* A832 */,/*16309*/5293/* A833 */,/*16310*/5294/* A834 */,/*16311*/5295/* A835 */,/*16312*/5296/* A836 */, /*16313*/5296/* A837 */,/*16314*/5297/* A838 */,/*16315*/5298/* A839 */,0,0,0,0,0,0,/*16322*/5299/* A840 */, /*16323*/5299/* A841 */,/*16324*/5299/* A842 */,/*16325*/5299/* A843 */,/*16326*/5299/* A844 */,/*16327*/5299/* A845 */, /*16328*/5299/* A846 */,/*16329*/5299/* A847 */,/*16330*/5299/* A848 */,/*16331*/5299/* A849 */,/*16332*/5299/* A84A */, /*16333*/5299/* A84B */,/*16334*/5299/* A84C */,/*16335*/5299/* A84D */,/*16336*/5299/* A84E */,/*16337*/5299/* A84F */, /*16338*/5299/* A850 */,/*16339*/5299/* A851 */,/*16340*/5299/* A852 */,/*16341*/5299/* A853 */,/*16342*/5299/* A854 */, /*16343*/5299/* A855 */,/*16344*/5299/* A856 */,/*16345*/5299/* A857 */,/*16346*/5299/* A858 */,/*16347*/5299/* A859 */, /*16348*/5299/* A85A */,/*16349*/5299/* A85B */,/*16350*/5299/* A85C */,/*16351*/5299/* A85D */,/*16352*/5299/* A85E */, /*16353*/5299/* A85F */,/*16354*/5299/* A860 */,/*16355*/5299/* A861 */,/*16356*/5299/* A862 */,/*16357*/5299/* A863 */, /*16358*/5299/* A864 */,/*16359*/5299/* A865 */,/*16360*/5299/* A866 */,/*16361*/5299/* A867 */,/*16362*/5299/* A868 */, /*16363*/5299/* A869 */,/*16364*/5299/* A86A */,/*16365*/5299/* A86B */,/*16366*/5299/* A86C */,/*16367*/5299/* A86D */, /*16368*/5299/* A86E */,/*16369*/5299/* A86F */,/*16370*/5299/* A870 */,/*16371*/5299/* A871 */,/*16372*/5300/* A872 */, /*16373*/5301/* A873 */,/*16374*/5302/* A874 */,/*16375*/5302/* A875 */,/*16376*/5303/* A876 */,/*16377*/5303/* A877 */, 0,0,0,0,0,0,0,0,/*16386*/5304/* A880 */,/*16387*/5304/* A881 */,/*16388*/5305/* A882 */,/*16389*/5305/* A883 */, /*16390*/5305/* A884 */,/*16391*/5305/* A885 */,/*16392*/5305/* A886 */,/*16393*/5305/* A887 */,/*16394*/5305/* A888 */, /*16395*/5305/* A889 */,/*16396*/5305/* A88A */,/*16397*/5305/* A88B */,/*16398*/5305/* A88C */,/*16399*/5305/* A88D */, /*16400*/5305/* A88E */,/*16401*/5305/* A88F */,/*16402*/5305/* A890 */,/*16403*/5305/* A891 */,/*16404*/5305/* A892 */, /*16405*/5305/* A893 */,/*16406*/5305/* A894 */,/*16407*/5305/* A895 */,/*16408*/5305/* A896 */,/*16409*/5305/* A897 */, /*16410*/5305/* A898 */,/*16411*/5305/* A899 */,/*16412*/5305/* A89A */,/*16413*/5305/* A89B */,/*16414*/5305/* A89C */, /*16415*/5305/* A89D */,/*16416*/5305/* A89E */,/*16417*/5305/* A89F */,/*16418*/5305/* A8A0 */,/*16419*/5305/* A8A1 */, /*16420*/5305/* A8A2 */,/*16421*/5305/* A8A3 */,/*16422*/5305/* A8A4 */,/*16423*/5305/* A8A5 */,/*16424*/5305/* A8A6 */, /*16425*/5305/* A8A7 */,/*16426*/5305/* A8A8 */,/*16427*/5305/* A8A9 */,/*16428*/5305/* A8AA */,/*16429*/5305/* A8AB */, /*16430*/5305/* A8AC */,/*16431*/5305/* A8AD */,/*16432*/5305/* A8AE */,/*16433*/5305/* A8AF */,/*16434*/5305/* A8B0 */, /*16435*/5305/* A8B1 */,/*16436*/5305/* A8B2 */,/*16437*/5305/* A8B3 */,/*16438*/5304/* A8B4 */,/*16439*/5304/* A8B5 */, /*16440*/5304/* A8B6 */,/*16441*/5304/* A8B7 */,/*16442*/5304/* A8B8 */,/*16443*/5304/* A8B9 */,/*16444*/5304/* A8BA */, /*16445*/5304/* A8BB */,/*16446*/5304/* A8BC */,/*16447*/5304/* A8BD */,/*16448*/5304/* A8BE */,/*16449*/5304/* A8BF */, /*16450*/5304/* A8C0 */,/*16451*/5304/* A8C1 */,/*16452*/5304/* A8C2 */,/*16453*/5304/* A8C3 */,/*16454*/5306/* A8C4 */, 0,0,0,0,0,0,0,0,0,/*16464*/5307/* A8CE */,/*16465*/5307/* A8CF */,/*16466*/5308/* A8D0 */,/*16467*/5309/* A8D1 */, /*16468*/5310/* A8D2 */,/*16469*/5311/* A8D3 */,/*16470*/5312/* A8D4 */,/*16471*/5313/* A8D5 */,/*16472*/5314/* A8D6 */, /*16473*/5315/* A8D7 */,/*16474*/5316/* A8D8 */,/*16475*/5317/* A8D9 */,0,0,0,0,0,0,/*16482*/5318/* A8E0 */, /*16483*/5318/* A8E1 */,/*16484*/5318/* A8E2 */,/*16485*/5318/* A8E3 */,/*16486*/5318/* A8E4 */,/*16487*/5318/* A8E5 */, /*16488*/5318/* A8E6 */,/*16489*/5318/* A8E7 */,/*16490*/5318/* A8E8 */,/*16491*/5318/* A8E9 */,/*16492*/5318/* A8EA */, /*16493*/5318/* A8EB */,/*16494*/5318/* A8EC */,/*16495*/5318/* A8ED */,/*16496*/5318/* A8EE */,/*16497*/5318/* A8EF */, /*16498*/5318/* A8F0 */,/*16499*/5318/* A8F1 */,/*16500*/5319/* A8F2 */,/*16501*/5319/* A8F3 */,/*16502*/5319/* A8F4 */, /*16503*/5319/* A8F5 */,/*16504*/5319/* A8F6 */,/*16505*/5319/* A8F7 */,/*16506*/5320/* A8F8 */,/*16507*/5320/* A8F9 */, /*16508*/5320/* A8FA */,/*16509*/5319/* A8FB */,/*16510*/5321/* A8FC */,/*16511*/5322/* A8FD */,0,0, /*16514*/5323/* A900 */,/*16515*/5324/* A901 */,/*16516*/5325/* A902 */,/*16517*/5326/* A903 */,/*16518*/5327/* A904 */, /*16519*/5328/* A905 */,/*16520*/5329/* A906 */,/*16521*/5330/* A907 */,/*16522*/5331/* A908 */,/*16523*/5332/* A909 */, /*16524*/5333/* A90A */,/*16525*/5333/* A90B */,/*16526*/5333/* A90C */,/*16527*/5333/* A90D */,/*16528*/5333/* A90E */, /*16529*/5333/* A90F */,/*16530*/5333/* A910 */,/*16531*/5333/* A911 */,/*16532*/5333/* A912 */,/*16533*/5333/* A913 */, /*16534*/5333/* A914 */,/*16535*/5333/* A915 */,/*16536*/5333/* A916 */,/*16537*/5333/* A917 */,/*16538*/5333/* A918 */, /*16539*/5333/* A919 */,/*16540*/5333/* A91A */,/*16541*/5333/* A91B */,/*16542*/5333/* A91C */,/*16543*/5333/* A91D */, /*16544*/5333/* A91E */,/*16545*/5333/* A91F */,/*16546*/5333/* A920 */,/*16547*/5333/* A921 */,/*16548*/5333/* A922 */, /*16549*/5333/* A923 */,/*16550*/5333/* A924 */,/*16551*/5333/* A925 */,/*16552*/5334/* A926 */,/*16553*/5334/* A927 */, /*16554*/5334/* A928 */,/*16555*/5334/* A929 */,/*16556*/5334/* A92A */,/*16557*/5335/* A92B */,/*16558*/5335/* A92C */, /*16559*/5335/* A92D */,/*16560*/5336/* A92E */,/*16561*/5337/* A92F */,/*16562*/5338/* A930 */,/*16563*/5338/* A931 */, /*16564*/5338/* A932 */,/*16565*/5338/* A933 */,/*16566*/5338/* A934 */,/*16567*/5338/* A935 */,/*16568*/5338/* A936 */, /*16569*/5338/* A937 */,/*16570*/5338/* A938 */,/*16571*/5338/* A939 */,/*16572*/5338/* A93A */,/*16573*/5338/* A93B */, /*16574*/5338/* A93C */,/*16575*/5338/* A93D */,/*16576*/5338/* A93E */,/*16577*/5338/* A93F */,/*16578*/5338/* A940 */, /*16579*/5338/* A941 */,/*16580*/5338/* A942 */,/*16581*/5338/* A943 */,/*16582*/5338/* A944 */,/*16583*/5338/* A945 */, /*16584*/5338/* A946 */,/*16585*/5339/* A947 */,/*16586*/5339/* A948 */,/*16587*/5339/* A949 */,/*16588*/5339/* A94A */, /*16589*/5339/* A94B */,/*16590*/5339/* A94C */,/*16591*/5339/* A94D */,/*16592*/5339/* A94E */,/*16593*/5339/* A94F */, /*16594*/5339/* A950 */,/*16595*/5339/* A951 */,/*16596*/5340/* A952 */,/*16597*/5341/* A953 */,0,0,0,0,0,0,0,0,0,0,0, /*16609*/5342/* A95F */,/*16610*/5343/* A960 */,/*16611*/5343/* A961 */,/*16612*/5343/* A962 */,/*16613*/5343/* A963 */, /*16614*/5343/* A964 */,/*16615*/5343/* A965 */,/*16616*/5343/* A966 */,/*16617*/5343/* A967 */,/*16618*/5343/* A968 */, /*16619*/5343/* A969 */,/*16620*/5343/* A96A */,/*16621*/5343/* A96B */,/*16622*/5343/* A96C */,/*16623*/5343/* A96D */, /*16624*/5343/* A96E */,/*16625*/5343/* A96F */,/*16626*/5343/* A970 */,/*16627*/5343/* A971 */,/*16628*/5343/* A972 */, /*16629*/5343/* A973 */,/*16630*/5343/* A974 */,/*16631*/5343/* A975 */,/*16632*/5343/* A976 */,/*16633*/5343/* A977 */, /*16634*/5343/* A978 */,/*16635*/5343/* A979 */,/*16636*/5343/* A97A */,/*16637*/5343/* A97B */,/*16638*/5343/* A97C */, 0,0,0,/*16642*/5344/* A980 */,/*16643*/5344/* A981 */,/*16644*/5344/* A982 */,/*16645*/5345/* A983 */, /*16646*/5346/* A984 */,/*16647*/5346/* A985 */,/*16648*/5346/* A986 */,/*16649*/5346/* A987 */,/*16650*/5346/* A988 */, /*16651*/5346/* A989 */,/*16652*/5346/* A98A */,/*16653*/5346/* A98B */,/*16654*/5346/* A98C */,/*16655*/5346/* A98D */, /*16656*/5346/* A98E */,/*16657*/5346/* A98F */,/*16658*/5346/* A990 */,/*16659*/5346/* A991 */,/*16660*/5346/* A992 */, /*16661*/5346/* A993 */,/*16662*/5346/* A994 */,/*16663*/5346/* A995 */,/*16664*/5346/* A996 */,/*16665*/5346/* A997 */, /*16666*/5346/* A998 */,/*16667*/5346/* A999 */,/*16668*/5346/* A99A */,/*16669*/5346/* A99B */,/*16670*/5346/* A99C */, /*16671*/5346/* A99D */,/*16672*/5346/* A99E */,/*16673*/5346/* A99F */,/*16674*/5346/* A9A0 */,/*16675*/5346/* A9A1 */, /*16676*/5346/* A9A2 */,/*16677*/5346/* A9A3 */,/*16678*/5346/* A9A4 */,/*16679*/5346/* A9A5 */,/*16680*/5346/* A9A6 */, /*16681*/5346/* A9A7 */,/*16682*/5346/* A9A8 */,/*16683*/5346/* A9A9 */,/*16684*/5346/* A9AA */,/*16685*/5346/* A9AB */, /*16686*/5346/* A9AC */,/*16687*/5346/* A9AD */,/*16688*/5346/* A9AE */,/*16689*/5346/* A9AF */,/*16690*/5346/* A9B0 */, /*16691*/5346/* A9B1 */,/*16692*/5346/* A9B2 */,/*16693*/5347/* A9B3 */,/*16694*/5345/* A9B4 */,/*16695*/5345/* A9B5 */, /*16696*/5344/* A9B6 */,/*16697*/5344/* A9B7 */,/*16698*/5344/* A9B8 */,/*16699*/5344/* A9B9 */,/*16700*/5345/* A9BA */, /*16701*/5345/* A9BB */,/*16702*/5344/* A9BC */,/*16703*/5345/* A9BD */,/*16704*/5345/* A9BE */,/*16705*/5345/* A9BF */, /*16706*/5348/* A9C0 */,/*16707*/5349/* A9C1 */,/*16708*/5349/* A9C2 */,/*16709*/5349/* A9C3 */,/*16710*/5349/* A9C4 */, /*16711*/5349/* A9C5 */,/*16712*/5349/* A9C6 */,/*16713*/5350/* A9C7 */,/*16714*/5351/* A9C8 */,/*16715*/5351/* A9C9 */, /*16716*/5349/* A9CA */,/*16717*/5349/* A9CB */,/*16718*/5349/* A9CC */,/*16719*/5349/* A9CD */,0, /*16721*/5352/* A9CF */,/*16722*/5353/* A9D0 */,/*16723*/5354/* A9D1 */,/*16724*/5355/* A9D2 */,/*16725*/5356/* A9D3 */, /*16726*/5357/* A9D4 */,/*16727*/5358/* A9D5 */,/*16728*/5359/* A9D6 */,/*16729*/5360/* A9D7 */,/*16730*/5361/* A9D8 */, /*16731*/5362/* A9D9 */,0,0,0,0,/*16736*/5349/* A9DE */,/*16737*/5349/* A9DF */,/*16738*/5363/* A9E0 */, /*16739*/5363/* A9E1 */,/*16740*/5363/* A9E2 */,/*16741*/5363/* A9E3 */,/*16742*/5363/* A9E4 */,/*16743*/5364/* A9E5 */, /*16744*/5365/* A9E6 */,/*16745*/5363/* A9E7 */,/*16746*/5363/* A9E8 */,/*16747*/5363/* A9E9 */,/*16748*/5363/* A9EA */, /*16749*/5363/* A9EB */,/*16750*/5363/* A9EC */,/*16751*/5363/* A9ED */,/*16752*/5363/* A9EE */,/*16753*/5363/* A9EF */, /*16754*/5366/* A9F0 */,/*16755*/5367/* A9F1 */,/*16756*/5368/* A9F2 */,/*16757*/5369/* A9F3 */,/*16758*/5370/* A9F4 */, /*16759*/5371/* A9F5 */,/*16760*/5372/* A9F6 */,/*16761*/5373/* A9F7 */,/*16762*/5374/* A9F8 */,/*16763*/5375/* A9F9 */, /*16764*/5363/* A9FA */,/*16765*/5363/* A9FB */,/*16766*/5363/* A9FC */,/*16767*/5363/* A9FD */,/*16768*/5363/* A9FE */, 0,/*16770*/5376/* AA00 */,/*16771*/5376/* AA01 */,/*16772*/5376/* AA02 */,/*16773*/5376/* AA03 */, /*16774*/5376/* AA04 */,/*16775*/5376/* AA05 */,/*16776*/5376/* AA06 */,/*16777*/5376/* AA07 */,/*16778*/5376/* AA08 */, /*16779*/5376/* AA09 */,/*16780*/5376/* AA0A */,/*16781*/5376/* AA0B */,/*16782*/5376/* AA0C */,/*16783*/5376/* AA0D */, /*16784*/5376/* AA0E */,/*16785*/5376/* AA0F */,/*16786*/5376/* AA10 */,/*16787*/5376/* AA11 */,/*16788*/5376/* AA12 */, /*16789*/5376/* AA13 */,/*16790*/5376/* AA14 */,/*16791*/5376/* AA15 */,/*16792*/5376/* AA16 */,/*16793*/5376/* AA17 */, /*16794*/5376/* AA18 */,/*16795*/5376/* AA19 */,/*16796*/5376/* AA1A */,/*16797*/5376/* AA1B */,/*16798*/5376/* AA1C */, /*16799*/5376/* AA1D */,/*16800*/5376/* AA1E */,/*16801*/5376/* AA1F */,/*16802*/5376/* AA20 */,/*16803*/5376/* AA21 */, /*16804*/5376/* AA22 */,/*16805*/5376/* AA23 */,/*16806*/5376/* AA24 */,/*16807*/5376/* AA25 */,/*16808*/5376/* AA26 */, /*16809*/5376/* AA27 */,/*16810*/5376/* AA28 */,/*16811*/5377/* AA29 */,/*16812*/5377/* AA2A */,/*16813*/5377/* AA2B */, /*16814*/5377/* AA2C */,/*16815*/5377/* AA2D */,/*16816*/5377/* AA2E */,/*16817*/5378/* AA2F */,/*16818*/5378/* AA30 */, /*16819*/5377/* AA31 */,/*16820*/5377/* AA32 */,/*16821*/5378/* AA33 */,/*16822*/5378/* AA34 */,/*16823*/5377/* AA35 */, /*16824*/5377/* AA36 */,0,0,0,0,0,0,0,0,0,/*16834*/5376/* AA40 */,/*16835*/5376/* AA41 */,/*16836*/5376/* AA42 */, /*16837*/5377/* AA43 */,/*16838*/5376/* AA44 */,/*16839*/5376/* AA45 */,/*16840*/5376/* AA46 */,/*16841*/5376/* AA47 */, /*16842*/5376/* AA48 */,/*16843*/5376/* AA49 */,/*16844*/5376/* AA4A */,/*16845*/5376/* AA4B */,/*16846*/5377/* AA4C */, /*16847*/5378/* AA4D */,0,0,/*16850*/5379/* AA50 */,/*16851*/5380/* AA51 */,/*16852*/5381/* AA52 */, /*16853*/5382/* AA53 */,/*16854*/5383/* AA54 */,/*16855*/5384/* AA55 */,/*16856*/5385/* AA56 */,/*16857*/5386/* AA57 */, /*16858*/5387/* AA58 */,/*16859*/5388/* AA59 */,0,0,/*16862*/5389/* AA5C */,/*16863*/5390/* AA5D */, /*16864*/5390/* AA5E */,/*16865*/5390/* AA5F */,/*16866*/5391/* AA60 */,/*16867*/5391/* AA61 */,/*16868*/5391/* AA62 */, /*16869*/5391/* AA63 */,/*16870*/5391/* AA64 */,/*16871*/5391/* AA65 */,/*16872*/5391/* AA66 */,/*16873*/5391/* AA67 */, /*16874*/5391/* AA68 */,/*16875*/5391/* AA69 */,/*16876*/5391/* AA6A */,/*16877*/5391/* AA6B */,/*16878*/5391/* AA6C */, /*16879*/5391/* AA6D */,/*16880*/5391/* AA6E */,/*16881*/5391/* AA6F */,/*16882*/5392/* AA70 */,/*16883*/5391/* AA71 */, /*16884*/5391/* AA72 */,/*16885*/5391/* AA73 */,/*16886*/5391/* AA74 */,/*16887*/5391/* AA75 */,/*16888*/5391/* AA76 */, /*16889*/5393/* AA77 */,/*16890*/5393/* AA78 */,/*16891*/5393/* AA79 */,/*16892*/5391/* AA7A */,/*16893*/5394/* AA7B */, /*16894*/5395/* AA7C */,/*16895*/5396/* AA7D */,/*16896*/5397/* AA7E */,/*16897*/5397/* AA7F */,/*16898*/5398/* AA80 */, /*16899*/5398/* AA81 */,/*16900*/5398/* AA82 */,/*16901*/5398/* AA83 */,/*16902*/5398/* AA84 */,/*16903*/5398/* AA85 */, /*16904*/5398/* AA86 */,/*16905*/5398/* AA87 */,/*16906*/5398/* AA88 */,/*16907*/5398/* AA89 */,/*16908*/5398/* AA8A */, /*16909*/5398/* AA8B */,/*16910*/5398/* AA8C */,/*16911*/5398/* AA8D */,/*16912*/5398/* AA8E */,/*16913*/5398/* AA8F */, /*16914*/5398/* AA90 */,/*16915*/5398/* AA91 */,/*16916*/5398/* AA92 */,/*16917*/5398/* AA93 */,/*16918*/5398/* AA94 */, /*16919*/5398/* AA95 */,/*16920*/5398/* AA96 */,/*16921*/5398/* AA97 */,/*16922*/5398/* AA98 */,/*16923*/5398/* AA99 */, /*16924*/5398/* AA9A */,/*16925*/5398/* AA9B */,/*16926*/5398/* AA9C */,/*16927*/5398/* AA9D */,/*16928*/5398/* AA9E */, /*16929*/5398/* AA9F */,/*16930*/5398/* AAA0 */,/*16931*/5398/* AAA1 */,/*16932*/5398/* AAA2 */,/*16933*/5398/* AAA3 */, /*16934*/5398/* AAA4 */,/*16935*/5398/* AAA5 */,/*16936*/5398/* AAA6 */,/*16937*/5398/* AAA7 */,/*16938*/5398/* AAA8 */, /*16939*/5398/* AAA9 */,/*16940*/5398/* AAAA */,/*16941*/5398/* AAAB */,/*16942*/5398/* AAAC */,/*16943*/5398/* AAAD */, /*16944*/5398/* AAAE */,/*16945*/5398/* AAAF */,/*16946*/5399/* AAB0 */,/*16947*/5398/* AAB1 */,/*16948*/5399/* AAB2 */, /*16949*/5399/* AAB3 */,/*16950*/5400/* AAB4 */,/*16951*/5401/* AAB5 */,/*16952*/5401/* AAB6 */,/*16953*/5399/* AAB7 */, /*16954*/5399/* AAB8 */,/*16955*/5401/* AAB9 */,/*16956*/5398/* AABA */,/*16957*/5401/* AABB */,/*16958*/5401/* AABC */, /*16959*/5398/* AABD */,/*16960*/5399/* AABE */,/*16961*/5402/* AABF */,/*16962*/5403/* AAC0 */,/*16963*/5402/* AAC1 */, /*16964*/5403/* AAC2 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*16989*/5398/* AADB */,/*16990*/5398/* AADC */, /*16991*/5404/* AADD */,/*16992*/5405/* AADE */,/*16993*/5406/* AADF */,/*16994*/5407/* AAE0 */,/*16995*/5407/* AAE1 */, /*16996*/5407/* AAE2 */,/*16997*/5407/* AAE3 */,/*16998*/5407/* AAE4 */,/*16999*/5407/* AAE5 */,/*17000*/5407/* AAE6 */, /*17001*/5407/* AAE7 */,/*17002*/5407/* AAE8 */,/*17003*/5407/* AAE9 */,/*17004*/5407/* AAEA */,/*17005*/5408/* AAEB */, /*17006*/5409/* AAEC */,/*17007*/5409/* AAED */,/*17008*/5408/* AAEE */,/*17009*/5408/* AAEF */,/*17010*/5410/* AAF0 */, /*17011*/5410/* AAF1 */,/*17012*/5407/* AAF2 */,/*17013*/5411/* AAF3 */,/*17014*/5411/* AAF4 */,/*17015*/5408/* AAF5 */, /*17016*/5412/* AAF6 */,0,0,0,0,0,0,0,0,0,0,/*17027*/5413/* AB01 */,/*17028*/5413/* AB02 */,/*17029*/5413/* AB03 */, /*17030*/5413/* AB04 */,/*17031*/5413/* AB05 */,/*17032*/5413/* AB06 */,0,0,/*17035*/5413/* AB09 */, /*17036*/5413/* AB0A */,/*17037*/5413/* AB0B */,/*17038*/5413/* AB0C */,/*17039*/5413/* AB0D */,/*17040*/5413/* AB0E */, 0,0,/*17043*/5413/* AB11 */,/*17044*/5413/* AB12 */,/*17045*/5413/* AB13 */,/*17046*/5413/* AB14 */, /*17047*/5413/* AB15 */,/*17048*/5413/* AB16 */,0,0,0,0,0,0,0,0,0,/*17058*/5413/* AB20 */,/*17059*/5413/* AB21 */, /*17060*/5413/* AB22 */,/*17061*/5413/* AB23 */,/*17062*/5413/* AB24 */,/*17063*/5413/* AB25 */,/*17064*/5413/* AB26 */, 0,/*17066*/5413/* AB28 */,/*17067*/5413/* AB29 */,/*17068*/5413/* AB2A */,/*17069*/5413/* AB2B */, /*17070*/5413/* AB2C */,/*17071*/5413/* AB2D */,/*17072*/5413/* AB2E */,0,/*17074*/5414/* AB30 */, /*17075*/5414/* AB31 */,/*17076*/5414/* AB32 */,/*17077*/5414/* AB33 */,/*17078*/5414/* AB34 */,/*17079*/5414/* AB35 */, /*17080*/5414/* AB36 */,/*17081*/5414/* AB37 */,/*17082*/5414/* AB38 */,/*17083*/5414/* AB39 */,/*17084*/5414/* AB3A */, /*17085*/5414/* AB3B */,/*17086*/5414/* AB3C */,/*17087*/5414/* AB3D */,/*17088*/5414/* AB3E */,/*17089*/5414/* AB3F */, /*17090*/5414/* AB40 */,/*17091*/5414/* AB41 */,/*17092*/5414/* AB42 */,/*17093*/5414/* AB43 */,/*17094*/5414/* AB44 */, /*17095*/5414/* AB45 */,/*17096*/5414/* AB46 */,/*17097*/5414/* AB47 */,/*17098*/5414/* AB48 */,/*17099*/5414/* AB49 */, /*17100*/5414/* AB4A */,/*17101*/5414/* AB4B */,/*17102*/5414/* AB4C */,/*17103*/5414/* AB4D */,/*17104*/5414/* AB4E */, /*17105*/5414/* AB4F */,/*17106*/5414/* AB50 */,/*17107*/5414/* AB51 */,/*17108*/5414/* AB52 */,/*17109*/5415/* AB53 */, /*17110*/5414/* AB54 */,/*17111*/5414/* AB55 */,/*17112*/5414/* AB56 */,/*17113*/5414/* AB57 */,/*17114*/5414/* AB58 */, /*17115*/5414/* AB59 */,/*17116*/5414/* AB5A */,/*17117*/5416/* AB5B */,/*17118*/5417/* AB5C */,/*17119*/5418/* AB5D */, /*17120*/5419/* AB5E */,/*17121*/5420/* AB5F */,/*17122*/5421/* AB60 */,/*17123*/5421/* AB61 */,/*17124*/5421/* AB62 */, /*17125*/5421/* AB63 */,/*17126*/5414/* AB64 */,/*17127*/5422/* AB65 */,0,0,0,0,0,0,0,0,0,0,/*17138*/5423/* AB70 */, /*17139*/5424/* AB71 */,/*17140*/5425/* AB72 */,/*17141*/5426/* AB73 */,/*17142*/5427/* AB74 */,/*17143*/5428/* AB75 */, /*17144*/5429/* AB76 */,/*17145*/5430/* AB77 */,/*17146*/5431/* AB78 */,/*17147*/5432/* AB79 */,/*17148*/5433/* AB7A */, /*17149*/5434/* AB7B */,/*17150*/5435/* AB7C */,/*17151*/5436/* AB7D */,/*17152*/5437/* AB7E */,/*17153*/5438/* AB7F */, /*17154*/5439/* AB80 */,/*17155*/5440/* AB81 */,/*17156*/5441/* AB82 */,/*17157*/5442/* AB83 */,/*17158*/5443/* AB84 */, /*17159*/5444/* AB85 */,/*17160*/5445/* AB86 */,/*17161*/5446/* AB87 */,/*17162*/5447/* AB88 */,/*17163*/5448/* AB89 */, /*17164*/5449/* AB8A */,/*17165*/5450/* AB8B */,/*17166*/5451/* AB8C */,/*17167*/5452/* AB8D */,/*17168*/5453/* AB8E */, /*17169*/5454/* AB8F */,/*17170*/5455/* AB90 */,/*17171*/5456/* AB91 */,/*17172*/5457/* AB92 */,/*17173*/5458/* AB93 */, /*17174*/5459/* AB94 */,/*17175*/5460/* AB95 */,/*17176*/5461/* AB96 */,/*17177*/5462/* AB97 */,/*17178*/5463/* AB98 */, /*17179*/5464/* AB99 */,/*17180*/5465/* AB9A */,/*17181*/5466/* AB9B */,/*17182*/5467/* AB9C */,/*17183*/5468/* AB9D */, /*17184*/5469/* AB9E */,/*17185*/5470/* AB9F */,/*17186*/5471/* ABA0 */,/*17187*/5472/* ABA1 */,/*17188*/5473/* ABA2 */, /*17189*/5474/* ABA3 */,/*17190*/5475/* ABA4 */,/*17191*/5476/* ABA5 */,/*17192*/5477/* ABA6 */,/*17193*/5478/* ABA7 */, /*17194*/5479/* ABA8 */,/*17195*/5480/* ABA9 */,/*17196*/5481/* ABAA */,/*17197*/5482/* ABAB */,/*17198*/5483/* ABAC */, /*17199*/5484/* ABAD */,/*17200*/5485/* ABAE */,/*17201*/5486/* ABAF */,/*17202*/5487/* ABB0 */,/*17203*/5488/* ABB1 */, /*17204*/5489/* ABB2 */,/*17205*/5490/* ABB3 */,/*17206*/5491/* ABB4 */,/*17207*/5492/* ABB5 */,/*17208*/5493/* ABB6 */, /*17209*/5494/* ABB7 */,/*17210*/5495/* ABB8 */,/*17211*/5496/* ABB9 */,/*17212*/5497/* ABBA */,/*17213*/5498/* ABBB */, /*17214*/5499/* ABBC */,/*17215*/5500/* ABBD */,/*17216*/5501/* ABBE */,/*17217*/5502/* ABBF */,/*17218*/5503/* ABC0 */, /*17219*/5503/* ABC1 */,/*17220*/5503/* ABC2 */,/*17221*/5503/* ABC3 */,/*17222*/5503/* ABC4 */,/*17223*/5503/* ABC5 */, /*17224*/5503/* ABC6 */,/*17225*/5503/* ABC7 */,/*17226*/5503/* ABC8 */,/*17227*/5503/* ABC9 */,/*17228*/5503/* ABCA */, /*17229*/5503/* ABCB */,/*17230*/5503/* ABCC */,/*17231*/5503/* ABCD */,/*17232*/5503/* ABCE */,/*17233*/5503/* ABCF */, /*17234*/5503/* ABD0 */,/*17235*/5503/* ABD1 */,/*17236*/5503/* ABD2 */,/*17237*/5503/* ABD3 */,/*17238*/5503/* ABD4 */, /*17239*/5503/* ABD5 */,/*17240*/5503/* ABD6 */,/*17241*/5503/* ABD7 */,/*17242*/5503/* ABD8 */,/*17243*/5503/* ABD9 */, /*17244*/5503/* ABDA */,/*17245*/5503/* ABDB */,/*17246*/5503/* ABDC */,/*17247*/5503/* ABDD */,/*17248*/5503/* ABDE */, /*17249*/5503/* ABDF */,/*17250*/5503/* ABE0 */,/*17251*/5503/* ABE1 */,/*17252*/5503/* ABE2 */,/*17253*/5504/* ABE3 */, /*17254*/5504/* ABE4 */,/*17255*/5505/* ABE5 */,/*17256*/5504/* ABE6 */,/*17257*/5504/* ABE7 */,/*17258*/5505/* ABE8 */, /*17259*/5504/* ABE9 */,/*17260*/5504/* ABEA */,/*17261*/5506/* ABEB */,/*17262*/5507/* ABEC */,/*17263*/5508/* ABED */, 0,0,/*17266*/5509/* ABF0 */,/*17267*/5510/* ABF1 */,/*17268*/5511/* ABF2 */,/*17269*/5512/* ABF3 */, /*17270*/5513/* ABF4 */,/*17271*/5514/* ABF5 */,/*17272*/5515/* ABF6 */,/*17273*/5516/* ABF7 */,/*17274*/5517/* ABF8 */, /*17275*/5518/* ABF9 */,0,0,0,0,0,0,/*17282*/5519/* AC00 */,/*17283*/5520/* AC01 */,/*17284*/5520/*AC02 */, /*17285*/5520/*AC03 */,/*17286*/5520/*AC04 */,/*17287*/5520/*AC05 */,/*17288*/5520/*AC06 */,/*17289*/5520/*AC07 */, /*17290*/5520/*AC08 */,/*17291*/5520/*AC09 */,/*17292*/5520/*AC0A */,/*17293*/5520/*AC0B */,/*17294*/5520/*AC0C */, /*17295*/5520/*AC0D */,/*17296*/5520/*AC0E */,/*17297*/5520/*AC0F */,/*17298*/5520/*AC10 */,/*17299*/5520/*AC11 */, /*17300*/5520/*AC12 */,/*17301*/5520/*AC13 */,/*17302*/5520/*AC14 */,/*17303*/5520/*AC15 */,/*17304*/5520/*AC16 */, /*17305*/5520/*AC17 */,/*17306*/5520/*AC18 */,/*17307*/5520/*AC19 */,/*17308*/5520/*AC1A */,/*17309*/5520/*AC1B */, /*17310*/5519/* AC1C */,/*17311*/5520/* AC1D */,/*17312*/5520/*AC1E */,/*17313*/5520/*AC1F */,/*17314*/5520/*AC20 */, /*17315*/5520/*AC21 */,/*17316*/5520/*AC22 */,/*17317*/5520/*AC23 */,/*17318*/5520/*AC24 */,/*17319*/5520/*AC25 */, /*17320*/5520/*AC26 */,/*17321*/5520/*AC27 */,/*17322*/5520/*AC28 */,/*17323*/5520/*AC29 */,/*17324*/5520/*AC2A */, /*17325*/5520/*AC2B */,/*17326*/5520/*AC2C */,/*17327*/5520/*AC2D */,/*17328*/5520/*AC2E */,/*17329*/5520/*AC2F */, /*17330*/5520/*AC30 */,/*17331*/5520/*AC31 */,/*17332*/5520/*AC32 */,/*17333*/5520/*AC33 */,/*17334*/5520/*AC34 */, /*17335*/5520/*AC35 */,/*17336*/5520/*AC36 */,/*17337*/5520/*AC37 */,/*17338*/5519/* AC38 */,/*17339*/5520/* AC39 */, /*17340*/5520/*AC3A */,/*17341*/5520/*AC3B */,/*17342*/5520/*AC3C */,/*17343*/5520/*AC3D */,/*17344*/5520/*AC3E */, /*17345*/5520/*AC3F */,/*17346*/5520/*AC40 */,/*17347*/5520/*AC41 */,/*17348*/5520/*AC42 */,/*17349*/5520/*AC43 */, /*17350*/5520/*AC44 */,/*17351*/5520/*AC45 */,/*17352*/5520/*AC46 */,/*17353*/5520/*AC47 */,/*17354*/5520/*AC48 */, /*17355*/5520/*AC49 */,/*17356*/5520/*AC4A */,/*17357*/5520/*AC4B */,/*17358*/5520/*AC4C */,/*17359*/5520/*AC4D */, /*17360*/5520/*AC4E */,/*17361*/5520/*AC4F */,/*17362*/5520/*AC50 */,/*17363*/5520/*AC51 */,/*17364*/5520/*AC52 */, /*17365*/5520/*AC53 */,/*17366*/5519/* AC54 */,/*17367*/5520/* AC55 */,/*17368*/5520/*AC56 */,/*17369*/5520/*AC57 */, /*17370*/5520/*AC58 */,/*17371*/5520/*AC59 */,/*17372*/5520/*AC5A */,/*17373*/5520/*AC5B */,/*17374*/5520/*AC5C */, /*17375*/5520/*AC5D */,/*17376*/5520/*AC5E */,/*17377*/5520/*AC5F */,/*17378*/5520/*AC60 */,/*17379*/5520/*AC61 */, /*17380*/5520/*AC62 */,/*17381*/5520/*AC63 */,/*17382*/5520/*AC64 */,/*17383*/5520/*AC65 */,/*17384*/5520/*AC66 */, /*17385*/5520/*AC67 */,/*17386*/5520/*AC68 */,/*17387*/5520/*AC69 */,/*17388*/5520/*AC6A */,/*17389*/5520/*AC6B */, /*17390*/5520/*AC6C */,/*17391*/5520/*AC6D */,/*17392*/5520/*AC6E */,/*17393*/5520/*AC6F */,/*17394*/5519/* AC70 */, /*17395*/5520/* AC71 */,/*17396*/5520/*AC72 */,/*17397*/5520/*AC73 */,/*17398*/5520/*AC74 */,/*17399*/5520/*AC75 */, /*17400*/5520/*AC76 */,/*17401*/5520/*AC77 */,/*17402*/5520/*AC78 */,/*17403*/5520/*AC79 */,/*17404*/5520/*AC7A */, /*17405*/5520/*AC7B */,/*17406*/5520/*AC7C */,/*17407*/5520/*AC7D */,/*17408*/5520/*AC7E */,/*17409*/5520/*AC7F */, /*17410*/5520/*AC80 */,/*17411*/5520/*AC81 */,/*17412*/5520/*AC82 */,/*17413*/5520/*AC83 */,/*17414*/5520/*AC84 */, /*17415*/5520/*AC85 */,/*17416*/5520/*AC86 */,/*17417*/5520/*AC87 */,/*17418*/5520/*AC88 */,/*17419*/5520/*AC89 */, /*17420*/5520/*AC8A */,/*17421*/5520/*AC8B */,/*17422*/5519/* AC8C */,/*17423*/5520/* AC8D */,/*17424*/5520/*AC8E */, /*17425*/5520/*AC8F */,/*17426*/5520/*AC90 */,/*17427*/5520/*AC91 */,/*17428*/5520/*AC92 */,/*17429*/5520/*AC93 */, /*17430*/5520/*AC94 */,/*17431*/5520/*AC95 */,/*17432*/5520/*AC96 */,/*17433*/5520/*AC97 */,/*17434*/5520/*AC98 */, /*17435*/5520/*AC99 */,/*17436*/5520/*AC9A */,/*17437*/5520/*AC9B */,/*17438*/5520/*AC9C */,/*17439*/5520/*AC9D */, /*17440*/5520/*AC9E */,/*17441*/5520/*AC9F */,/*17442*/5520/*ACA0 */,/*17443*/5520/*ACA1 */,/*17444*/5520/*ACA2 */, /*17445*/5520/*ACA3 */,/*17446*/5520/*ACA4 */,/*17447*/5520/*ACA5 */,/*17448*/5520/*ACA6 */,/*17449*/5520/*ACA7 */, /*17450*/5519/* ACA8 */,/*17451*/5520/* ACA9 */,/*17452*/5520/*ACAA */,/*17453*/5520/*ACAB */,/*17454*/5520/*ACAC */, /*17455*/5520/*ACAD */,/*17456*/5520/*ACAE */,/*17457*/5520/*ACAF */,/*17458*/5520/*ACB0 */,/*17459*/5520/*ACB1 */, /*17460*/5520/*ACB2 */,/*17461*/5520/*ACB3 */,/*17462*/5520/*ACB4 */,/*17463*/5520/*ACB5 */,/*17464*/5520/*ACB6 */, /*17465*/5520/*ACB7 */,/*17466*/5520/*ACB8 */,/*17467*/5520/*ACB9 */,/*17468*/5520/*ACBA */,/*17469*/5520/*ACBB */, /*17470*/5520/*ACBC */,/*17471*/5520/*ACBD */,/*17472*/5520/*ACBE */,/*17473*/5520/*ACBF */,/*17474*/5520/*ACC0 */, /*17475*/5520/*ACC1 */,/*17476*/5520/*ACC2 */,/*17477*/5520/*ACC3 */,/*17478*/5519/* ACC4 */,/*17479*/5520/* ACC5 */, /*17480*/5520/*ACC6 */,/*17481*/5520/*ACC7 */,/*17482*/5520/*ACC8 */,/*17483*/5520/*ACC9 */,/*17484*/5520/*ACCA */, /*17485*/5520/*ACCB */,/*17486*/5520/*ACCC */,/*17487*/5520/*ACCD */,/*17488*/5520/*ACCE */,/*17489*/5520/*ACCF */, /*17490*/5520/*ACD0 */,/*17491*/5520/*ACD1 */,/*17492*/5520/*ACD2 */,/*17493*/5520/*ACD3 */,/*17494*/5520/*ACD4 */, /*17495*/5520/*ACD5 */,/*17496*/5520/*ACD6 */,/*17497*/5520/*ACD7 */,/*17498*/5520/*ACD8 */,/*17499*/5520/*ACD9 */, /*17500*/5520/*ACDA */,/*17501*/5520/*ACDB */,/*17502*/5520/*ACDC */,/*17503*/5520/*ACDD */,/*17504*/5520/*ACDE */, /*17505*/5520/*ACDF */,/*17506*/5519/* ACE0 */,/*17507*/5520/* ACE1 */,/*17508*/5520/*ACE2 */,/*17509*/5520/*ACE3 */, /*17510*/5520/*ACE4 */,/*17511*/5520/*ACE5 */,/*17512*/5520/*ACE6 */,/*17513*/5520/*ACE7 */,/*17514*/5520/*ACE8 */, /*17515*/5520/*ACE9 */,/*17516*/5520/*ACEA */,/*17517*/5520/*ACEB */,/*17518*/5520/*ACEC */,/*17519*/5520/*ACED */, /*17520*/5520/*ACEE */,/*17521*/5520/*ACEF */,/*17522*/5520/*ACF0 */,/*17523*/5520/*ACF1 */,/*17524*/5520/*ACF2 */, /*17525*/5520/*ACF3 */,/*17526*/5520/*ACF4 */,/*17527*/5520/*ACF5 */,/*17528*/5520/*ACF6 */,/*17529*/5520/*ACF7 */, /*17530*/5520/*ACF8 */,/*17531*/5520/*ACF9 */,/*17532*/5520/*ACFA */,/*17533*/5520/*ACFB */,/*17534*/5519/* ACFC */, /*17535*/5520/* ACFD */,/*17536*/5520/*ACFE */,/*17537*/5520/*ACFF */,/*17538*/5520/*AD00 */,/*17539*/5520/*AD01 */, /*17540*/5520/*AD02 */,/*17541*/5520/*AD03 */,/*17542*/5520/*AD04 */,/*17543*/5520/*AD05 */,/*17544*/5520/*AD06 */, /*17545*/5520/*AD07 */,/*17546*/5520/*AD08 */,/*17547*/5520/*AD09 */,/*17548*/5520/*AD0A */,/*17549*/5520/*AD0B */, /*17550*/5520/*AD0C */,/*17551*/5520/*AD0D */,/*17552*/5520/*AD0E */,/*17553*/5520/*AD0F */,/*17554*/5520/*AD10 */, /*17555*/5520/*AD11 */,/*17556*/5520/*AD12 */,/*17557*/5520/*AD13 */,/*17558*/5520/*AD14 */,/*17559*/5520/*AD15 */, /*17560*/5520/*AD16 */,/*17561*/5520/*AD17 */,/*17562*/5519/* AD18 */,/*17563*/5520/* AD19 */,/*17564*/5520/*AD1A */, /*17565*/5520/*AD1B */,/*17566*/5520/*AD1C */,/*17567*/5520/*AD1D */,/*17568*/5520/*AD1E */,/*17569*/5520/*AD1F */, /*17570*/5520/*AD20 */,/*17571*/5520/*AD21 */,/*17572*/5520/*AD22 */,/*17573*/5520/*AD23 */,/*17574*/5520/*AD24 */, /*17575*/5520/*AD25 */,/*17576*/5520/*AD26 */,/*17577*/5520/*AD27 */,/*17578*/5520/*AD28 */,/*17579*/5520/*AD29 */, /*17580*/5520/*AD2A */,/*17581*/5520/*AD2B */,/*17582*/5520/*AD2C */,/*17583*/5520/*AD2D */,/*17584*/5520/*AD2E */, /*17585*/5520/*AD2F */,/*17586*/5520/*AD30 */,/*17587*/5520/*AD31 */,/*17588*/5520/*AD32 */,/*17589*/5520/*AD33 */, /*17590*/5519/* AD34 */,/*17591*/5520/* AD35 */,/*17592*/5520/*AD36 */,/*17593*/5520/*AD37 */,/*17594*/5520/*AD38 */, /*17595*/5520/*AD39 */,/*17596*/5520/*AD3A */,/*17597*/5520/*AD3B */,/*17598*/5520/*AD3C */,/*17599*/5520/*AD3D */, /*17600*/5520/*AD3E */,/*17601*/5520/*AD3F */,/*17602*/5520/*AD40 */,/*17603*/5520/*AD41 */,/*17604*/5520/*AD42 */, /*17605*/5520/*AD43 */,/*17606*/5520/*AD44 */,/*17607*/5520/*AD45 */,/*17608*/5520/*AD46 */,/*17609*/5520/*AD47 */, /*17610*/5520/*AD48 */,/*17611*/5520/*AD49 */,/*17612*/5520/*AD4A */,/*17613*/5520/*AD4B */,/*17614*/5520/*AD4C */, /*17615*/5520/*AD4D */,/*17616*/5520/*AD4E */,/*17617*/5520/*AD4F */,/*17618*/5519/* AD50 */,/*17619*/5520/* AD51 */, /*17620*/5520/*AD52 */,/*17621*/5520/*AD53 */,/*17622*/5520/*AD54 */,/*17623*/5520/*AD55 */,/*17624*/5520/*AD56 */, /*17625*/5520/*AD57 */,/*17626*/5520/*AD58 */,/*17627*/5520/*AD59 */,/*17628*/5520/*AD5A */,/*17629*/5520/*AD5B */, /*17630*/5520/*AD5C */,/*17631*/5520/*AD5D */,/*17632*/5520/*AD5E */,/*17633*/5520/*AD5F */,/*17634*/5520/*AD60 */, /*17635*/5520/*AD61 */,/*17636*/5520/*AD62 */,/*17637*/5520/*AD63 */,/*17638*/5520/*AD64 */,/*17639*/5520/*AD65 */, /*17640*/5520/*AD66 */,/*17641*/5520/*AD67 */,/*17642*/5520/*AD68 */,/*17643*/5520/*AD69 */,/*17644*/5520/*AD6A */, /*17645*/5520/*AD6B */,/*17646*/5519/* AD6C */,/*17647*/5520/* AD6D */,/*17648*/5520/*AD6E */,/*17649*/5520/*AD6F */, /*17650*/5520/*AD70 */,/*17651*/5520/*AD71 */,/*17652*/5520/*AD72 */,/*17653*/5520/*AD73 */,/*17654*/5520/*AD74 */, /*17655*/5520/*AD75 */,/*17656*/5520/*AD76 */,/*17657*/5520/*AD77 */,/*17658*/5520/*AD78 */,/*17659*/5520/*AD79 */, /*17660*/5520/*AD7A */,/*17661*/5520/*AD7B */,/*17662*/5520/*AD7C */,/*17663*/5520/*AD7D */,/*17664*/5520/*AD7E */, /*17665*/5520/*AD7F */,/*17666*/5520/*AD80 */,/*17667*/5520/*AD81 */,/*17668*/5520/*AD82 */,/*17669*/5520/*AD83 */, /*17670*/5520/*AD84 */,/*17671*/5520/*AD85 */,/*17672*/5520/*AD86 */,/*17673*/5520/*AD87 */,/*17674*/5519/* AD88 */, /*17675*/5520/* AD89 */,/*17676*/5520/*AD8A */,/*17677*/5520/*AD8B */,/*17678*/5520/*AD8C */,/*17679*/5520/*AD8D */, /*17680*/5520/*AD8E */,/*17681*/5520/*AD8F */,/*17682*/5520/*AD90 */,/*17683*/5520/*AD91 */,/*17684*/5520/*AD92 */, /*17685*/5520/*AD93 */,/*17686*/5520/*AD94 */,/*17687*/5520/*AD95 */,/*17688*/5520/*AD96 */,/*17689*/5520/*AD97 */, /*17690*/5520/*AD98 */,/*17691*/5520/*AD99 */,/*17692*/5520/*AD9A */,/*17693*/5520/*AD9B */,/*17694*/5520/*AD9C */, /*17695*/5520/*AD9D */,/*17696*/5520/*AD9E */,/*17697*/5520/*AD9F */,/*17698*/5520/*ADA0 */,/*17699*/5520/*ADA1 */, /*17700*/5520/*ADA2 */,/*17701*/5520/*ADA3 */,/*17702*/5519/* ADA4 */,/*17703*/5520/* ADA5 */,/*17704*/5520/*ADA6 */, /*17705*/5520/*ADA7 */,/*17706*/5520/*ADA8 */,/*17707*/5520/*ADA9 */,/*17708*/5520/*ADAA */,/*17709*/5520/*ADAB */, /*17710*/5520/*ADAC */,/*17711*/5520/*ADAD */,/*17712*/5520/*ADAE */,/*17713*/5520/*ADAF */,/*17714*/5520/*ADB0 */, /*17715*/5520/*ADB1 */,/*17716*/5520/*ADB2 */,/*17717*/5520/*ADB3 */,/*17718*/5520/*ADB4 */,/*17719*/5520/*ADB5 */, /*17720*/5520/*ADB6 */,/*17721*/5520/*ADB7 */,/*17722*/5520/*ADB8 */,/*17723*/5520/*ADB9 */,/*17724*/5520/*ADBA */, /*17725*/5520/*ADBB */,/*17726*/5520/*ADBC */,/*17727*/5520/*ADBD */,/*17728*/5520/*ADBE */,/*17729*/5520/*ADBF */, /*17730*/5519/* ADC0 */,/*17731*/5520/* ADC1 */,/*17732*/5520/*ADC2 */,/*17733*/5520/*ADC3 */,/*17734*/5520/*ADC4 */, /*17735*/5520/*ADC5 */,/*17736*/5520/*ADC6 */,/*17737*/5520/*ADC7 */,/*17738*/5520/*ADC8 */,/*17739*/5520/*ADC9 */, /*17740*/5520/*ADCA */,/*17741*/5520/*ADCB */,/*17742*/5520/*ADCC */,/*17743*/5520/*ADCD */,/*17744*/5520/*ADCE */, /*17745*/5520/*ADCF */,/*17746*/5520/*ADD0 */,/*17747*/5520/*ADD1 */,/*17748*/5520/*ADD2 */,/*17749*/5520/*ADD3 */, /*17750*/5520/*ADD4 */,/*17751*/5520/*ADD5 */,/*17752*/5520/*ADD6 */,/*17753*/5520/*ADD7 */,/*17754*/5520/*ADD8 */, /*17755*/5520/*ADD9 */,/*17756*/5520/*ADDA */,/*17757*/5520/*ADDB */,/*17758*/5519/* ADDC */,/*17759*/5520/* ADDD */, /*17760*/5520/*ADDE */,/*17761*/5520/*ADDF */,/*17762*/5520/*ADE0 */,/*17763*/5520/*ADE1 */,/*17764*/5520/*ADE2 */, /*17765*/5520/*ADE3 */,/*17766*/5520/*ADE4 */,/*17767*/5520/*ADE5 */,/*17768*/5520/*ADE6 */,/*17769*/5520/*ADE7 */, /*17770*/5520/*ADE8 */,/*17771*/5520/*ADE9 */,/*17772*/5520/*ADEA */,/*17773*/5520/*ADEB */,/*17774*/5520/*ADEC */, /*17775*/5520/*ADED */,/*17776*/5520/*ADEE */,/*17777*/5520/*ADEF */,/*17778*/5520/*ADF0 */,/*17779*/5520/*ADF1 */, /*17780*/5520/*ADF2 */,/*17781*/5520/*ADF3 */,/*17782*/5520/*ADF4 */,/*17783*/5520/*ADF5 */,/*17784*/5520/*ADF6 */, /*17785*/5520/*ADF7 */,/*17786*/5519/* ADF8 */,/*17787*/5520/* ADF9 */,/*17788*/5520/*ADFA */,/*17789*/5520/*ADFB */, /*17790*/5520/*ADFC */,/*17791*/5520/*ADFD */,/*17792*/5520/*ADFE */,/*17793*/5520/*ADFF */,/*17794*/5520/*AE00 */, /*17795*/5520/*AE01 */,/*17796*/5520/*AE02 */,/*17797*/5520/*AE03 */,/*17798*/5520/*AE04 */,/*17799*/5520/*AE05 */, /*17800*/5520/*AE06 */,/*17801*/5520/*AE07 */,/*17802*/5520/*AE08 */,/*17803*/5520/*AE09 */,/*17804*/5520/*AE0A */, /*17805*/5520/*AE0B */,/*17806*/5520/*AE0C */,/*17807*/5520/*AE0D */,/*17808*/5520/*AE0E */,/*17809*/5520/*AE0F */, /*17810*/5520/*AE10 */,/*17811*/5520/*AE11 */,/*17812*/5520/*AE12 */,/*17813*/5520/*AE13 */,/*17814*/5519/* AE14 */, /*17815*/5520/* AE15 */,/*17816*/5520/*AE16 */,/*17817*/5520/*AE17 */,/*17818*/5520/*AE18 */,/*17819*/5520/*AE19 */, /*17820*/5520/*AE1A */,/*17821*/5520/*AE1B */,/*17822*/5520/*AE1C */,/*17823*/5520/*AE1D */,/*17824*/5520/*AE1E */, /*17825*/5520/*AE1F */,/*17826*/5520/*AE20 */,/*17827*/5520/*AE21 */,/*17828*/5520/*AE22 */,/*17829*/5520/*AE23 */, /*17830*/5520/*AE24 */,/*17831*/5520/*AE25 */,/*17832*/5520/*AE26 */,/*17833*/5520/*AE27 */,/*17834*/5520/*AE28 */, /*17835*/5520/*AE29 */,/*17836*/5520/*AE2A */,/*17837*/5520/*AE2B */,/*17838*/5520/*AE2C */,/*17839*/5520/*AE2D */, /*17840*/5520/*AE2E */,/*17841*/5520/*AE2F */,/*17842*/5519/* AE30 */,/*17843*/5520/* AE31 */,/*17844*/5520/*AE32 */, /*17845*/5520/*AE33 */,/*17846*/5520/*AE34 */,/*17847*/5520/*AE35 */,/*17848*/5520/*AE36 */,/*17849*/5520/*AE37 */, /*17850*/5520/*AE38 */,/*17851*/5520/*AE39 */,/*17852*/5520/*AE3A */,/*17853*/5520/*AE3B */,/*17854*/5520/*AE3C */, /*17855*/5520/*AE3D */,/*17856*/5520/*AE3E */,/*17857*/5520/*AE3F */,/*17858*/5520/*AE40 */,/*17859*/5520/*AE41 */, /*17860*/5520/*AE42 */,/*17861*/5520/*AE43 */,/*17862*/5520/*AE44 */,/*17863*/5520/*AE45 */,/*17864*/5520/*AE46 */, /*17865*/5520/*AE47 */,/*17866*/5520/*AE48 */,/*17867*/5520/*AE49 */,/*17868*/5520/*AE4A */,/*17869*/5520/*AE4B */, /*17870*/5519/* AE4C */,/*17871*/5520/* AE4D */,/*17872*/5520/*AE4E */,/*17873*/5520/*AE4F */,/*17874*/5520/*AE50 */, /*17875*/5520/*AE51 */,/*17876*/5520/*AE52 */,/*17877*/5520/*AE53 */,/*17878*/5520/*AE54 */,/*17879*/5520/*AE55 */, /*17880*/5520/*AE56 */,/*17881*/5520/*AE57 */,/*17882*/5520/*AE58 */,/*17883*/5520/*AE59 */,/*17884*/5520/*AE5A */, /*17885*/5520/*AE5B */,/*17886*/5520/*AE5C */,/*17887*/5520/*AE5D */,/*17888*/5520/*AE5E */,/*17889*/5520/*AE5F */, /*17890*/5520/*AE60 */,/*17891*/5520/*AE61 */,/*17892*/5520/*AE62 */,/*17893*/5520/*AE63 */,/*17894*/5520/*AE64 */, /*17895*/5520/*AE65 */,/*17896*/5520/*AE66 */,/*17897*/5520/*AE67 */,/*17898*/5519/* AE68 */,/*17899*/5520/* AE69 */, /*17900*/5520/*AE6A */,/*17901*/5520/*AE6B */,/*17902*/5520/*AE6C */,/*17903*/5520/*AE6D */,/*17904*/5520/*AE6E */, /*17905*/5520/*AE6F */,/*17906*/5520/*AE70 */,/*17907*/5520/*AE71 */,/*17908*/5520/*AE72 */,/*17909*/5520/*AE73 */, /*17910*/5520/*AE74 */,/*17911*/5520/*AE75 */,/*17912*/5520/*AE76 */,/*17913*/5520/*AE77 */,/*17914*/5520/*AE78 */, /*17915*/5520/*AE79 */,/*17916*/5520/*AE7A */,/*17917*/5520/*AE7B */,/*17918*/5520/*AE7C */,/*17919*/5520/*AE7D */, /*17920*/5520/*AE7E */,/*17921*/5520/*AE7F */,/*17922*/5520/*AE80 */,/*17923*/5520/*AE81 */,/*17924*/5520/*AE82 */, /*17925*/5520/*AE83 */,/*17926*/5519/* AE84 */,/*17927*/5520/* AE85 */,/*17928*/5520/*AE86 */,/*17929*/5520/*AE87 */, /*17930*/5520/*AE88 */,/*17931*/5520/*AE89 */,/*17932*/5520/*AE8A */,/*17933*/5520/*AE8B */,/*17934*/5520/*AE8C */, /*17935*/5520/*AE8D */,/*17936*/5520/*AE8E */,/*17937*/5520/*AE8F */,/*17938*/5520/*AE90 */,/*17939*/5520/*AE91 */, /*17940*/5520/*AE92 */,/*17941*/5520/*AE93 */,/*17942*/5520/*AE94 */,/*17943*/5520/*AE95 */,/*17944*/5520/*AE96 */, /*17945*/5520/*AE97 */,/*17946*/5520/*AE98 */,/*17947*/5520/*AE99 */,/*17948*/5520/*AE9A */,/*17949*/5520/*AE9B */, /*17950*/5520/*AE9C */,/*17951*/5520/*AE9D */,/*17952*/5520/*AE9E */,/*17953*/5520/*AE9F */,/*17954*/5519/* AEA0 */, /*17955*/5520/* AEA1 */,/*17956*/5520/*AEA2 */,/*17957*/5520/*AEA3 */,/*17958*/5520/*AEA4 */,/*17959*/5520/*AEA5 */, /*17960*/5520/*AEA6 */,/*17961*/5520/*AEA7 */,/*17962*/5520/*AEA8 */,/*17963*/5520/*AEA9 */,/*17964*/5520/*AEAA */, /*17965*/5520/*AEAB */,/*17966*/5520/*AEAC */,/*17967*/5520/*AEAD */,/*17968*/5520/*AEAE */,/*17969*/5520/*AEAF */, /*17970*/5520/*AEB0 */,/*17971*/5520/*AEB1 */,/*17972*/5520/*AEB2 */,/*17973*/5520/*AEB3 */,/*17974*/5520/*AEB4 */, /*17975*/5520/*AEB5 */,/*17976*/5520/*AEB6 */,/*17977*/5520/*AEB7 */,/*17978*/5520/*AEB8 */,/*17979*/5520/*AEB9 */, /*17980*/5520/*AEBA */,/*17981*/5520/*AEBB */,/*17982*/5519/* AEBC */,/*17983*/5520/* AEBD */,/*17984*/5520/*AEBE */, /*17985*/5520/*AEBF */,/*17986*/5520/*AEC0 */,/*17987*/5520/*AEC1 */,/*17988*/5520/*AEC2 */,/*17989*/5520/*AEC3 */, /*17990*/5520/*AEC4 */,/*17991*/5520/*AEC5 */,/*17992*/5520/*AEC6 */,/*17993*/5520/*AEC7 */,/*17994*/5520/*AEC8 */, /*17995*/5520/*AEC9 */,/*17996*/5520/*AECA */,/*17997*/5520/*AECB */,/*17998*/5520/*AECC */,/*17999*/5520/*AECD */, /*18000*/5520/*AECE */,/*18001*/5520/*AECF */,/*18002*/5520/*AED0 */,/*18003*/5520/*AED1 */,/*18004*/5520/*AED2 */, /*18005*/5520/*AED3 */,/*18006*/5520/*AED4 */,/*18007*/5520/*AED5 */,/*18008*/5520/*AED6 */,/*18009*/5520/*AED7 */, /*18010*/5519/* AED8 */,/*18011*/5520/* AED9 */,/*18012*/5520/*AEDA */,/*18013*/5520/*AEDB */,/*18014*/5520/*AEDC */, /*18015*/5520/*AEDD */,/*18016*/5520/*AEDE */,/*18017*/5520/*AEDF */,/*18018*/5520/*AEE0 */,/*18019*/5520/*AEE1 */, /*18020*/5520/*AEE2 */,/*18021*/5520/*AEE3 */,/*18022*/5520/*AEE4 */,/*18023*/5520/*AEE5 */,/*18024*/5520/*AEE6 */, /*18025*/5520/*AEE7 */,/*18026*/5520/*AEE8 */,/*18027*/5520/*AEE9 */,/*18028*/5520/*AEEA */,/*18029*/5520/*AEEB */, /*18030*/5520/*AEEC */,/*18031*/5520/*AEED */,/*18032*/5520/*AEEE */,/*18033*/5520/*AEEF */,/*18034*/5520/*AEF0 */, /*18035*/5520/*AEF1 */,/*18036*/5520/*AEF2 */,/*18037*/5520/*AEF3 */,/*18038*/5519/* AEF4 */,/*18039*/5520/* AEF5 */, /*18040*/5520/*AEF6 */,/*18041*/5520/*AEF7 */,/*18042*/5520/*AEF8 */,/*18043*/5520/*AEF9 */,/*18044*/5520/*AEFA */, /*18045*/5520/*AEFB */,/*18046*/5520/*AEFC */,/*18047*/5520/*AEFD */,/*18048*/5520/*AEFE */,/*18049*/5520/*AEFF */, /*18050*/5520/*AF00 */,/*18051*/5520/*AF01 */,/*18052*/5520/*AF02 */,/*18053*/5520/*AF03 */,/*18054*/5520/*AF04 */, /*18055*/5520/*AF05 */,/*18056*/5520/*AF06 */,/*18057*/5520/*AF07 */,/*18058*/5520/*AF08 */,/*18059*/5520/*AF09 */, /*18060*/5520/*AF0A */,/*18061*/5520/*AF0B */,/*18062*/5520/*AF0C */,/*18063*/5520/*AF0D */,/*18064*/5520/*AF0E */, /*18065*/5520/*AF0F */,/*18066*/5519/* AF10 */,/*18067*/5520/* AF11 */,/*18068*/5520/*AF12 */,/*18069*/5520/*AF13 */, /*18070*/5520/*AF14 */,/*18071*/5520/*AF15 */,/*18072*/5520/*AF16 */,/*18073*/5520/*AF17 */,/*18074*/5520/*AF18 */, /*18075*/5520/*AF19 */,/*18076*/5520/*AF1A */,/*18077*/5520/*AF1B */,/*18078*/5520/*AF1C */,/*18079*/5520/*AF1D */, /*18080*/5520/*AF1E */,/*18081*/5520/*AF1F */,/*18082*/5520/*AF20 */,/*18083*/5520/*AF21 */,/*18084*/5520/*AF22 */, /*18085*/5520/*AF23 */,/*18086*/5520/*AF24 */,/*18087*/5520/*AF25 */,/*18088*/5520/*AF26 */,/*18089*/5520/*AF27 */, /*18090*/5520/*AF28 */,/*18091*/5520/*AF29 */,/*18092*/5520/*AF2A */,/*18093*/5520/*AF2B */,/*18094*/5519/* AF2C */, /*18095*/5520/* AF2D */,/*18096*/5520/*AF2E */,/*18097*/5520/*AF2F */,/*18098*/5520/*AF30 */,/*18099*/5520/*AF31 */, /*18100*/5520/*AF32 */,/*18101*/5520/*AF33 */,/*18102*/5520/*AF34 */,/*18103*/5520/*AF35 */,/*18104*/5520/*AF36 */, /*18105*/5520/*AF37 */,/*18106*/5520/*AF38 */,/*18107*/5520/*AF39 */,/*18108*/5520/*AF3A */,/*18109*/5520/*AF3B */, /*18110*/5520/*AF3C */,/*18111*/5520/*AF3D */,/*18112*/5520/*AF3E */,/*18113*/5520/*AF3F */,/*18114*/5520/*AF40 */, /*18115*/5520/*AF41 */,/*18116*/5520/*AF42 */,/*18117*/5520/*AF43 */,/*18118*/5520/*AF44 */,/*18119*/5520/*AF45 */, /*18120*/5520/*AF46 */,/*18121*/5520/*AF47 */,/*18122*/5519/* AF48 */,/*18123*/5520/* AF49 */,/*18124*/5520/*AF4A */, /*18125*/5520/*AF4B */,/*18126*/5520/*AF4C */,/*18127*/5520/*AF4D */,/*18128*/5520/*AF4E */,/*18129*/5520/*AF4F */, /*18130*/5520/*AF50 */,/*18131*/5520/*AF51 */,/*18132*/5520/*AF52 */,/*18133*/5520/*AF53 */,/*18134*/5520/*AF54 */, /*18135*/5520/*AF55 */,/*18136*/5520/*AF56 */,/*18137*/5520/*AF57 */,/*18138*/5520/*AF58 */,/*18139*/5520/*AF59 */, /*18140*/5520/*AF5A */,/*18141*/5520/*AF5B */,/*18142*/5520/*AF5C */,/*18143*/5520/*AF5D */,/*18144*/5520/*AF5E */, /*18145*/5520/*AF5F */,/*18146*/5520/*AF60 */,/*18147*/5520/*AF61 */,/*18148*/5520/*AF62 */,/*18149*/5520/*AF63 */, /*18150*/5519/* AF64 */,/*18151*/5520/* AF65 */,/*18152*/5520/*AF66 */,/*18153*/5520/*AF67 */,/*18154*/5520/*AF68 */, /*18155*/5520/*AF69 */,/*18156*/5520/*AF6A */,/*18157*/5520/*AF6B */,/*18158*/5520/*AF6C */,/*18159*/5520/*AF6D */, /*18160*/5520/*AF6E */,/*18161*/5520/*AF6F */,/*18162*/5520/*AF70 */,/*18163*/5520/*AF71 */,/*18164*/5520/*AF72 */, /*18165*/5520/*AF73 */,/*18166*/5520/*AF74 */,/*18167*/5520/*AF75 */,/*18168*/5520/*AF76 */,/*18169*/5520/*AF77 */, /*18170*/5520/*AF78 */,/*18171*/5520/*AF79 */,/*18172*/5520/*AF7A */,/*18173*/5520/*AF7B */,/*18174*/5520/*AF7C */, /*18175*/5520/*AF7D */,/*18176*/5520/*AF7E */,/*18177*/5520/*AF7F */,/*18178*/5519/* AF80 */,/*18179*/5520/* AF81 */, /*18180*/5520/*AF82 */,/*18181*/5520/*AF83 */,/*18182*/5520/*AF84 */,/*18183*/5520/*AF85 */,/*18184*/5520/*AF86 */, /*18185*/5520/*AF87 */,/*18186*/5520/*AF88 */,/*18187*/5520/*AF89 */,/*18188*/5520/*AF8A */,/*18189*/5520/*AF8B */, /*18190*/5520/*AF8C */,/*18191*/5520/*AF8D */,/*18192*/5520/*AF8E */,/*18193*/5520/*AF8F */,/*18194*/5520/*AF90 */, /*18195*/5520/*AF91 */,/*18196*/5520/*AF92 */,/*18197*/5520/*AF93 */,/*18198*/5520/*AF94 */,/*18199*/5520/*AF95 */, /*18200*/5520/*AF96 */,/*18201*/5520/*AF97 */,/*18202*/5520/*AF98 */,/*18203*/5520/*AF99 */,/*18204*/5520/*AF9A */, /*18205*/5520/*AF9B */,/*18206*/5519/* AF9C */,/*18207*/5520/* AF9D */,/*18208*/5520/*AF9E */,/*18209*/5520/*AF9F */, /*18210*/5520/*AFA0 */,/*18211*/5520/*AFA1 */,/*18212*/5520/*AFA2 */,/*18213*/5520/*AFA3 */,/*18214*/5520/*AFA4 */, /*18215*/5520/*AFA5 */,/*18216*/5520/*AFA6 */,/*18217*/5520/*AFA7 */,/*18218*/5520/*AFA8 */,/*18219*/5520/*AFA9 */, /*18220*/5520/*AFAA */,/*18221*/5520/*AFAB */,/*18222*/5520/*AFAC */,/*18223*/5520/*AFAD */,/*18224*/5520/*AFAE */, /*18225*/5520/*AFAF */,/*18226*/5520/*AFB0 */,/*18227*/5520/*AFB1 */,/*18228*/5520/*AFB2 */,/*18229*/5520/*AFB3 */, /*18230*/5520/*AFB4 */,/*18231*/5520/*AFB5 */,/*18232*/5520/*AFB6 */,/*18233*/5520/*AFB7 */,/*18234*/5519/* AFB8 */, /*18235*/5520/* AFB9 */,/*18236*/5520/*AFBA */,/*18237*/5520/*AFBB */,/*18238*/5520/*AFBC */,/*18239*/5520/*AFBD */, /*18240*/5520/*AFBE */,/*18241*/5520/*AFBF */,/*18242*/5520/*AFC0 */,/*18243*/5520/*AFC1 */,/*18244*/5520/*AFC2 */, /*18245*/5520/*AFC3 */,/*18246*/5520/*AFC4 */,/*18247*/5520/*AFC5 */,/*18248*/5520/*AFC6 */,/*18249*/5520/*AFC7 */, /*18250*/5520/*AFC8 */,/*18251*/5520/*AFC9 */,/*18252*/5520/*AFCA */,/*18253*/5520/*AFCB */,/*18254*/5520/*AFCC */, /*18255*/5520/*AFCD */,/*18256*/5520/*AFCE */,/*18257*/5520/*AFCF */,/*18258*/5520/*AFD0 */,/*18259*/5520/*AFD1 */, /*18260*/5520/*AFD2 */,/*18261*/5520/*AFD3 */,/*18262*/5519/* AFD4 */,/*18263*/5520/* AFD5 */,/*18264*/5520/*AFD6 */, /*18265*/5520/*AFD7 */,/*18266*/5520/*AFD8 */,/*18267*/5520/*AFD9 */,/*18268*/5520/*AFDA */,/*18269*/5520/*AFDB */, /*18270*/5520/*AFDC */,/*18271*/5520/*AFDD */,/*18272*/5520/*AFDE */,/*18273*/5520/*AFDF */,/*18274*/5520/*AFE0 */, /*18275*/5520/*AFE1 */,/*18276*/5520/*AFE2 */,/*18277*/5520/*AFE3 */,/*18278*/5520/*AFE4 */,/*18279*/5520/*AFE5 */, /*18280*/5520/*AFE6 */,/*18281*/5520/*AFE7 */,/*18282*/5520/*AFE8 */,/*18283*/5520/*AFE9 */,/*18284*/5520/*AFEA */, /*18285*/5520/*AFEB */,/*18286*/5520/*AFEC */,/*18287*/5520/*AFED */,/*18288*/5520/*AFEE */,/*18289*/5520/*AFEF */, /*18290*/5519/* AFF0 */,/*18291*/5520/* AFF1 */,/*18292*/5520/*AFF2 */,/*18293*/5520/*AFF3 */,/*18294*/5520/*AFF4 */, /*18295*/5520/*AFF5 */,/*18296*/5520/*AFF6 */,/*18297*/5520/*AFF7 */,/*18298*/5520/*AFF8 */,/*18299*/5520/*AFF9 */, /*18300*/5520/*AFFA */,/*18301*/5520/*AFFB */,/*18302*/5520/*AFFC */,/*18303*/5520/*AFFD */,/*18304*/5520/*AFFE */, /*18305*/5520/*AFFF */,/*18306*/5520/*B000 */,/*18307*/5520/*B001 */,/*18308*/5520/*B002 */,/*18309*/5520/*B003 */, /*18310*/5520/*B004 */,/*18311*/5520/*B005 */,/*18312*/5520/*B006 */,/*18313*/5520/*B007 */,/*18314*/5520/*B008 */, /*18315*/5520/*B009 */,/*18316*/5520/*B00A */,/*18317*/5520/*B00B */,/*18318*/5519/* B00C */,/*18319*/5520/* B00D */, /*18320*/5520/*B00E */,/*18321*/5520/*B00F */,/*18322*/5520/*B010 */,/*18323*/5520/*B011 */,/*18324*/5520/*B012 */, /*18325*/5520/*B013 */,/*18326*/5520/*B014 */,/*18327*/5520/*B015 */,/*18328*/5520/*B016 */,/*18329*/5520/*B017 */, /*18330*/5520/*B018 */,/*18331*/5520/*B019 */,/*18332*/5520/*B01A */,/*18333*/5520/*B01B */,/*18334*/5520/*B01C */, /*18335*/5520/*B01D */,/*18336*/5520/*B01E */,/*18337*/5520/*B01F */,/*18338*/5520/*B020 */,/*18339*/5520/*B021 */, /*18340*/5520/*B022 */,/*18341*/5520/*B023 */,/*18342*/5520/*B024 */,/*18343*/5520/*B025 */,/*18344*/5520/*B026 */, /*18345*/5520/*B027 */,/*18346*/5519/* B028 */,/*18347*/5520/* B029 */,/*18348*/5520/*B02A */,/*18349*/5520/*B02B */, /*18350*/5520/*B02C */,/*18351*/5520/*B02D */,/*18352*/5520/*B02E */,/*18353*/5520/*B02F */,/*18354*/5520/*B030 */, /*18355*/5520/*B031 */,/*18356*/5520/*B032 */,/*18357*/5520/*B033 */,/*18358*/5520/*B034 */,/*18359*/5520/*B035 */, /*18360*/5520/*B036 */,/*18361*/5520/*B037 */,/*18362*/5520/*B038 */,/*18363*/5520/*B039 */,/*18364*/5520/*B03A */, /*18365*/5520/*B03B */,/*18366*/5520/*B03C */,/*18367*/5520/*B03D */,/*18368*/5520/*B03E */,/*18369*/5520/*B03F */, /*18370*/5520/*B040 */,/*18371*/5520/*B041 */,/*18372*/5520/*B042 */,/*18373*/5520/*B043 */,/*18374*/5519/* B044 */, /*18375*/5520/* B045 */,/*18376*/5520/*B046 */,/*18377*/5520/*B047 */,/*18378*/5520/*B048 */,/*18379*/5520/*B049 */, /*18380*/5520/*B04A */,/*18381*/5520/*B04B */,/*18382*/5520/*B04C */,/*18383*/5520/*B04D */,/*18384*/5520/*B04E */, /*18385*/5520/*B04F */,/*18386*/5520/*B050 */,/*18387*/5520/*B051 */,/*18388*/5520/*B052 */,/*18389*/5520/*B053 */, /*18390*/5520/*B054 */,/*18391*/5520/*B055 */,/*18392*/5520/*B056 */,/*18393*/5520/*B057 */,/*18394*/5520/*B058 */, /*18395*/5520/*B059 */,/*18396*/5520/*B05A */,/*18397*/5520/*B05B */,/*18398*/5520/*B05C */,/*18399*/5520/*B05D */, /*18400*/5520/*B05E */,/*18401*/5520/*B05F */,/*18402*/5519/* B060 */,/*18403*/5520/* B061 */,/*18404*/5520/*B062 */, /*18405*/5520/*B063 */,/*18406*/5520/*B064 */,/*18407*/5520/*B065 */,/*18408*/5520/*B066 */,/*18409*/5520/*B067 */, /*18410*/5520/*B068 */,/*18411*/5520/*B069 */,/*18412*/5520/*B06A */,/*18413*/5520/*B06B */,/*18414*/5520/*B06C */, /*18415*/5520/*B06D */,/*18416*/5520/*B06E */,/*18417*/5520/*B06F */,/*18418*/5520/*B070 */,/*18419*/5520/*B071 */, /*18420*/5520/*B072 */,/*18421*/5520/*B073 */,/*18422*/5520/*B074 */,/*18423*/5520/*B075 */,/*18424*/5520/*B076 */, /*18425*/5520/*B077 */,/*18426*/5520/*B078 */,/*18427*/5520/*B079 */,/*18428*/5520/*B07A */,/*18429*/5520/*B07B */, /*18430*/5519/* B07C */,/*18431*/5520/* B07D */,/*18432*/5520/*B07E */,/*18433*/5520/*B07F */,/*18434*/5520/*B080 */, /*18435*/5520/*B081 */,/*18436*/5520/*B082 */,/*18437*/5520/*B083 */,/*18438*/5520/*B084 */,/*18439*/5520/*B085 */, /*18440*/5520/*B086 */,/*18441*/5520/*B087 */,/*18442*/5520/*B088 */,/*18443*/5520/*B089 */,/*18444*/5520/*B08A */, /*18445*/5520/*B08B */,/*18446*/5520/*B08C */,/*18447*/5520/*B08D */,/*18448*/5520/*B08E */,/*18449*/5520/*B08F */, /*18450*/5520/*B090 */,/*18451*/5520/*B091 */,/*18452*/5520/*B092 */,/*18453*/5520/*B093 */,/*18454*/5520/*B094 */, /*18455*/5520/*B095 */,/*18456*/5520/*B096 */,/*18457*/5520/*B097 */,/*18458*/5519/* B098 */,/*18459*/5520/* B099 */, /*18460*/5520/*B09A */,/*18461*/5520/*B09B */,/*18462*/5520/*B09C */,/*18463*/5520/*B09D */,/*18464*/5520/*B09E */, /*18465*/5520/*B09F */,/*18466*/5520/*B0A0 */,/*18467*/5520/*B0A1 */,/*18468*/5520/*B0A2 */,/*18469*/5520/*B0A3 */, /*18470*/5520/*B0A4 */,/*18471*/5520/*B0A5 */,/*18472*/5520/*B0A6 */,/*18473*/5520/*B0A7 */,/*18474*/5520/*B0A8 */, /*18475*/5520/*B0A9 */,/*18476*/5520/*B0AA */,/*18477*/5520/*B0AB */,/*18478*/5520/*B0AC */,/*18479*/5520/*B0AD */, /*18480*/5520/*B0AE */,/*18481*/5520/*B0AF */,/*18482*/5520/*B0B0 */,/*18483*/5520/*B0B1 */,/*18484*/5520/*B0B2 */, /*18485*/5520/*B0B3 */,/*18486*/5519/* B0B4 */,/*18487*/5520/* B0B5 */,/*18488*/5520/*B0B6 */,/*18489*/5520/*B0B7 */, /*18490*/5520/*B0B8 */,/*18491*/5520/*B0B9 */,/*18492*/5520/*B0BA */,/*18493*/5520/*B0BB */,/*18494*/5520/*B0BC */, /*18495*/5520/*B0BD */,/*18496*/5520/*B0BE */,/*18497*/5520/*B0BF */,/*18498*/5520/*B0C0 */,/*18499*/5520/*B0C1 */, /*18500*/5520/*B0C2 */,/*18501*/5520/*B0C3 */,/*18502*/5520/*B0C4 */,/*18503*/5520/*B0C5 */,/*18504*/5520/*B0C6 */, /*18505*/5520/*B0C7 */,/*18506*/5520/*B0C8 */,/*18507*/5520/*B0C9 */,/*18508*/5520/*B0CA */,/*18509*/5520/*B0CB */, /*18510*/5520/*B0CC */,/*18511*/5520/*B0CD */,/*18512*/5520/*B0CE */,/*18513*/5520/*B0CF */,/*18514*/5519/* B0D0 */, /*18515*/5520/* B0D1 */,/*18516*/5520/*B0D2 */,/*18517*/5520/*B0D3 */,/*18518*/5520/*B0D4 */,/*18519*/5520/*B0D5 */, /*18520*/5520/*B0D6 */,/*18521*/5520/*B0D7 */,/*18522*/5520/*B0D8 */,/*18523*/5520/*B0D9 */,/*18524*/5520/*B0DA */, /*18525*/5520/*B0DB */,/*18526*/5520/*B0DC */,/*18527*/5520/*B0DD */,/*18528*/5520/*B0DE */,/*18529*/5520/*B0DF */, /*18530*/5520/*B0E0 */,/*18531*/5520/*B0E1 */,/*18532*/5520/*B0E2 */,/*18533*/5520/*B0E3 */,/*18534*/5520/*B0E4 */, /*18535*/5520/*B0E5 */,/*18536*/5520/*B0E6 */,/*18537*/5520/*B0E7 */,/*18538*/5520/*B0E8 */,/*18539*/5520/*B0E9 */, /*18540*/5520/*B0EA */,/*18541*/5520/*B0EB */,/*18542*/5519/* B0EC */,/*18543*/5520/* B0ED */,/*18544*/5520/*B0EE */, /*18545*/5520/*B0EF */,/*18546*/5520/*B0F0 */,/*18547*/5520/*B0F1 */,/*18548*/5520/*B0F2 */,/*18549*/5520/*B0F3 */, /*18550*/5520/*B0F4 */,/*18551*/5520/*B0F5 */,/*18552*/5520/*B0F6 */,/*18553*/5520/*B0F7 */,/*18554*/5520/*B0F8 */, /*18555*/5520/*B0F9 */,/*18556*/5520/*B0FA */,/*18557*/5520/*B0FB */,/*18558*/5520/*B0FC */,/*18559*/5520/*B0FD */, /*18560*/5520/*B0FE */,/*18561*/5520/*B0FF */,/*18562*/5520/*B100 */,/*18563*/5520/*B101 */,/*18564*/5520/*B102 */, /*18565*/5520/*B103 */,/*18566*/5520/*B104 */,/*18567*/5520/*B105 */,/*18568*/5520/*B106 */,/*18569*/5520/*B107 */, /*18570*/5519/* B108 */,/*18571*/5520/* B109 */,/*18572*/5520/*B10A */,/*18573*/5520/*B10B */,/*18574*/5520/*B10C */, /*18575*/5520/*B10D */,/*18576*/5520/*B10E */,/*18577*/5520/*B10F */,/*18578*/5520/*B110 */,/*18579*/5520/*B111 */, /*18580*/5520/*B112 */,/*18581*/5520/*B113 */,/*18582*/5520/*B114 */,/*18583*/5520/*B115 */,/*18584*/5520/*B116 */, /*18585*/5520/*B117 */,/*18586*/5520/*B118 */,/*18587*/5520/*B119 */,/*18588*/5520/*B11A */,/*18589*/5520/*B11B */, /*18590*/5520/*B11C */,/*18591*/5520/*B11D */,/*18592*/5520/*B11E */,/*18593*/5520/*B11F */,/*18594*/5520/*B120 */, /*18595*/5520/*B121 */,/*18596*/5520/*B122 */,/*18597*/5520/*B123 */,/*18598*/5519/* B124 */,/*18599*/5520/* B125 */, /*18600*/5520/*B126 */,/*18601*/5520/*B127 */,/*18602*/5520/*B128 */,/*18603*/5520/*B129 */,/*18604*/5520/*B12A */, /*18605*/5520/*B12B */,/*18606*/5520/*B12C */,/*18607*/5520/*B12D */,/*18608*/5520/*B12E */,/*18609*/5520/*B12F */, /*18610*/5520/*B130 */,/*18611*/5520/*B131 */,/*18612*/5520/*B132 */,/*18613*/5520/*B133 */,/*18614*/5520/*B134 */, /*18615*/5520/*B135 */,/*18616*/5520/*B136 */,/*18617*/5520/*B137 */,/*18618*/5520/*B138 */,/*18619*/5520/*B139 */, /*18620*/5520/*B13A */,/*18621*/5520/*B13B */,/*18622*/5520/*B13C */,/*18623*/5520/*B13D */,/*18624*/5520/*B13E */, /*18625*/5520/*B13F */,/*18626*/5519/* B140 */,/*18627*/5520/* B141 */,/*18628*/5520/*B142 */,/*18629*/5520/*B143 */, /*18630*/5520/*B144 */,/*18631*/5520/*B145 */,/*18632*/5520/*B146 */,/*18633*/5520/*B147 */,/*18634*/5520/*B148 */, /*18635*/5520/*B149 */,/*18636*/5520/*B14A */,/*18637*/5520/*B14B */,/*18638*/5520/*B14C */,/*18639*/5520/*B14D */, /*18640*/5520/*B14E */,/*18641*/5520/*B14F */,/*18642*/5520/*B150 */,/*18643*/5520/*B151 */,/*18644*/5520/*B152 */, /*18645*/5520/*B153 */,/*18646*/5520/*B154 */,/*18647*/5520/*B155 */,/*18648*/5520/*B156 */,/*18649*/5520/*B157 */, /*18650*/5520/*B158 */,/*18651*/5520/*B159 */,/*18652*/5520/*B15A */,/*18653*/5520/*B15B */,/*18654*/5519/* B15C */, /*18655*/5520/* B15D */,/*18656*/5520/*B15E */,/*18657*/5520/*B15F */,/*18658*/5520/*B160 */,/*18659*/5520/*B161 */, /*18660*/5520/*B162 */,/*18661*/5520/*B163 */,/*18662*/5520/*B164 */,/*18663*/5520/*B165 */,/*18664*/5520/*B166 */, /*18665*/5520/*B167 */,/*18666*/5520/*B168 */,/*18667*/5520/*B169 */,/*18668*/5520/*B16A */,/*18669*/5520/*B16B */, /*18670*/5520/*B16C */,/*18671*/5520/*B16D */,/*18672*/5520/*B16E */,/*18673*/5520/*B16F */,/*18674*/5520/*B170 */, /*18675*/5520/*B171 */,/*18676*/5520/*B172 */,/*18677*/5520/*B173 */,/*18678*/5520/*B174 */,/*18679*/5520/*B175 */, /*18680*/5520/*B176 */,/*18681*/5520/*B177 */,/*18682*/5519/* B178 */,/*18683*/5520/* B179 */,/*18684*/5520/*B17A */, /*18685*/5520/*B17B */,/*18686*/5520/*B17C */,/*18687*/5520/*B17D */,/*18688*/5520/*B17E */,/*18689*/5520/*B17F */, /*18690*/5520/*B180 */,/*18691*/5520/*B181 */,/*18692*/5520/*B182 */,/*18693*/5520/*B183 */,/*18694*/5520/*B184 */, /*18695*/5520/*B185 */,/*18696*/5520/*B186 */,/*18697*/5520/*B187 */,/*18698*/5520/*B188 */,/*18699*/5520/*B189 */, /*18700*/5520/*B18A */,/*18701*/5520/*B18B */,/*18702*/5520/*B18C */,/*18703*/5520/*B18D */,/*18704*/5520/*B18E */, /*18705*/5520/*B18F */,/*18706*/5520/*B190 */,/*18707*/5520/*B191 */,/*18708*/5520/*B192 */,/*18709*/5520/*B193 */, /*18710*/5519/* B194 */,/*18711*/5520/* B195 */,/*18712*/5520/*B196 */,/*18713*/5520/*B197 */,/*18714*/5520/*B198 */, /*18715*/5520/*B199 */,/*18716*/5520/*B19A */,/*18717*/5520/*B19B */,/*18718*/5520/*B19C */,/*18719*/5520/*B19D */, /*18720*/5520/*B19E */,/*18721*/5520/*B19F */,/*18722*/5520/*B1A0 */,/*18723*/5520/*B1A1 */,/*18724*/5520/*B1A2 */, /*18725*/5520/*B1A3 */,/*18726*/5520/*B1A4 */,/*18727*/5520/*B1A5 */,/*18728*/5520/*B1A6 */,/*18729*/5520/*B1A7 */, /*18730*/5520/*B1A8 */,/*18731*/5520/*B1A9 */,/*18732*/5520/*B1AA */,/*18733*/5520/*B1AB */,/*18734*/5520/*B1AC */, /*18735*/5520/*B1AD */,/*18736*/5520/*B1AE */,/*18737*/5520/*B1AF */,/*18738*/5519/* B1B0 */,/*18739*/5520/* B1B1 */, /*18740*/5520/*B1B2 */,/*18741*/5520/*B1B3 */,/*18742*/5520/*B1B4 */,/*18743*/5520/*B1B5 */,/*18744*/5520/*B1B6 */, /*18745*/5520/*B1B7 */,/*18746*/5520/*B1B8 */,/*18747*/5520/*B1B9 */,/*18748*/5520/*B1BA */,/*18749*/5520/*B1BB */, /*18750*/5520/*B1BC */,/*18751*/5520/*B1BD */,/*18752*/5520/*B1BE */,/*18753*/5520/*B1BF */,/*18754*/5520/*B1C0 */, /*18755*/5520/*B1C1 */,/*18756*/5520/*B1C2 */,/*18757*/5520/*B1C3 */,/*18758*/5520/*B1C4 */,/*18759*/5520/*B1C5 */, /*18760*/5520/*B1C6 */,/*18761*/5520/*B1C7 */,/*18762*/5520/*B1C8 */,/*18763*/5520/*B1C9 */,/*18764*/5520/*B1CA */, /*18765*/5520/*B1CB */,/*18766*/5519/* B1CC */,/*18767*/5520/* B1CD */,/*18768*/5520/*B1CE */,/*18769*/5520/*B1CF */, /*18770*/5520/*B1D0 */,/*18771*/5520/*B1D1 */,/*18772*/5520/*B1D2 */,/*18773*/5520/*B1D3 */,/*18774*/5520/*B1D4 */, /*18775*/5520/*B1D5 */,/*18776*/5520/*B1D6 */,/*18777*/5520/*B1D7 */,/*18778*/5520/*B1D8 */,/*18779*/5520/*B1D9 */, /*18780*/5520/*B1DA */,/*18781*/5520/*B1DB */,/*18782*/5520/*B1DC */,/*18783*/5520/*B1DD */,/*18784*/5520/*B1DE */, /*18785*/5520/*B1DF */,/*18786*/5520/*B1E0 */,/*18787*/5520/*B1E1 */,/*18788*/5520/*B1E2 */,/*18789*/5520/*B1E3 */, /*18790*/5520/*B1E4 */,/*18791*/5520/*B1E5 */,/*18792*/5520/*B1E6 */,/*18793*/5520/*B1E7 */,/*18794*/5519/* B1E8 */, /*18795*/5520/* B1E9 */,/*18796*/5520/*B1EA */,/*18797*/5520/*B1EB */,/*18798*/5520/*B1EC */,/*18799*/5520/*B1ED */, /*18800*/5520/*B1EE */,/*18801*/5520/*B1EF */,/*18802*/5520/*B1F0 */,/*18803*/5520/*B1F1 */,/*18804*/5520/*B1F2 */, /*18805*/5520/*B1F3 */,/*18806*/5520/*B1F4 */,/*18807*/5520/*B1F5 */,/*18808*/5520/*B1F6 */,/*18809*/5520/*B1F7 */, /*18810*/5520/*B1F8 */,/*18811*/5520/*B1F9 */,/*18812*/5520/*B1FA */,/*18813*/5520/*B1FB */,/*18814*/5520/*B1FC */, /*18815*/5520/*B1FD */,/*18816*/5520/*B1FE */,/*18817*/5520/*B1FF */,/*18818*/5520/*B200 */,/*18819*/5520/*B201 */, /*18820*/5520/*B202 */,/*18821*/5520/*B203 */,/*18822*/5519/* B204 */,/*18823*/5520/* B205 */,/*18824*/5520/*B206 */, /*18825*/5520/*B207 */,/*18826*/5520/*B208 */,/*18827*/5520/*B209 */,/*18828*/5520/*B20A */,/*18829*/5520/*B20B */, /*18830*/5520/*B20C */,/*18831*/5520/*B20D */,/*18832*/5520/*B20E */,/*18833*/5520/*B20F */,/*18834*/5520/*B210 */, /*18835*/5520/*B211 */,/*18836*/5520/*B212 */,/*18837*/5520/*B213 */,/*18838*/5520/*B214 */,/*18839*/5520/*B215 */, /*18840*/5520/*B216 */,/*18841*/5520/*B217 */,/*18842*/5520/*B218 */,/*18843*/5520/*B219 */,/*18844*/5520/*B21A */, /*18845*/5520/*B21B */,/*18846*/5520/*B21C */,/*18847*/5520/*B21D */,/*18848*/5520/*B21E */,/*18849*/5520/*B21F */, /*18850*/5519/* B220 */,/*18851*/5520/* B221 */,/*18852*/5520/*B222 */,/*18853*/5520/*B223 */,/*18854*/5520/*B224 */, /*18855*/5520/*B225 */,/*18856*/5520/*B226 */,/*18857*/5520/*B227 */,/*18858*/5520/*B228 */,/*18859*/5520/*B229 */, /*18860*/5520/*B22A */,/*18861*/5520/*B22B */,/*18862*/5520/*B22C */,/*18863*/5520/*B22D */,/*18864*/5520/*B22E */, /*18865*/5520/*B22F */,/*18866*/5520/*B230 */,/*18867*/5520/*B231 */,/*18868*/5520/*B232 */,/*18869*/5520/*B233 */, /*18870*/5520/*B234 */,/*18871*/5520/*B235 */,/*18872*/5520/*B236 */,/*18873*/5520/*B237 */,/*18874*/5520/*B238 */, /*18875*/5520/*B239 */,/*18876*/5520/*B23A */,/*18877*/5520/*B23B */,/*18878*/5519/* B23C */,/*18879*/5520/* B23D */, /*18880*/5520/*B23E */,/*18881*/5520/*B23F */,/*18882*/5520/*B240 */,/*18883*/5520/*B241 */,/*18884*/5520/*B242 */, /*18885*/5520/*B243 */,/*18886*/5520/*B244 */,/*18887*/5520/*B245 */,/*18888*/5520/*B246 */,/*18889*/5520/*B247 */, /*18890*/5520/*B248 */,/*18891*/5520/*B249 */,/*18892*/5520/*B24A */,/*18893*/5520/*B24B */,/*18894*/5520/*B24C */, /*18895*/5520/*B24D */,/*18896*/5520/*B24E */,/*18897*/5520/*B24F */,/*18898*/5520/*B250 */,/*18899*/5520/*B251 */, /*18900*/5520/*B252 */,/*18901*/5520/*B253 */,/*18902*/5520/*B254 */,/*18903*/5520/*B255 */,/*18904*/5520/*B256 */, /*18905*/5520/*B257 */,/*18906*/5519/* B258 */,/*18907*/5520/* B259 */,/*18908*/5520/*B25A */,/*18909*/5520/*B25B */, /*18910*/5520/*B25C */,/*18911*/5520/*B25D */,/*18912*/5520/*B25E */,/*18913*/5520/*B25F */,/*18914*/5520/*B260 */, /*18915*/5520/*B261 */,/*18916*/5520/*B262 */,/*18917*/5520/*B263 */,/*18918*/5520/*B264 */,/*18919*/5520/*B265 */, /*18920*/5520/*B266 */,/*18921*/5520/*B267 */,/*18922*/5520/*B268 */,/*18923*/5520/*B269 */,/*18924*/5520/*B26A */, /*18925*/5520/*B26B */,/*18926*/5520/*B26C */,/*18927*/5520/*B26D */,/*18928*/5520/*B26E */,/*18929*/5520/*B26F */, /*18930*/5520/*B270 */,/*18931*/5520/*B271 */,/*18932*/5520/*B272 */,/*18933*/5520/*B273 */,/*18934*/5519/* B274 */, /*18935*/5520/* B275 */,/*18936*/5520/*B276 */,/*18937*/5520/*B277 */,/*18938*/5520/*B278 */,/*18939*/5520/*B279 */, /*18940*/5520/*B27A */,/*18941*/5520/*B27B */,/*18942*/5520/*B27C */,/*18943*/5520/*B27D */,/*18944*/5520/*B27E */, /*18945*/5520/*B27F */,/*18946*/5520/*B280 */,/*18947*/5520/*B281 */,/*18948*/5520/*B282 */,/*18949*/5520/*B283 */, /*18950*/5520/*B284 */,/*18951*/5520/*B285 */,/*18952*/5520/*B286 */,/*18953*/5520/*B287 */,/*18954*/5520/*B288 */, /*18955*/5520/*B289 */,/*18956*/5520/*B28A */,/*18957*/5520/*B28B */,/*18958*/5520/*B28C */,/*18959*/5520/*B28D */, /*18960*/5520/*B28E */,/*18961*/5520/*B28F */,/*18962*/5519/* B290 */,/*18963*/5520/* B291 */,/*18964*/5520/*B292 */, /*18965*/5520/*B293 */,/*18966*/5520/*B294 */,/*18967*/5520/*B295 */,/*18968*/5520/*B296 */,/*18969*/5520/*B297 */, /*18970*/5520/*B298 */,/*18971*/5520/*B299 */,/*18972*/5520/*B29A */,/*18973*/5520/*B29B */,/*18974*/5520/*B29C */, /*18975*/5520/*B29D */,/*18976*/5520/*B29E */,/*18977*/5520/*B29F */,/*18978*/5520/*B2A0 */,/*18979*/5520/*B2A1 */, /*18980*/5520/*B2A2 */,/*18981*/5520/*B2A3 */,/*18982*/5520/*B2A4 */,/*18983*/5520/*B2A5 */,/*18984*/5520/*B2A6 */, /*18985*/5520/*B2A7 */,/*18986*/5520/*B2A8 */,/*18987*/5520/*B2A9 */,/*18988*/5520/*B2AA */,/*18989*/5520/*B2AB */, /*18990*/5519/* B2AC */,/*18991*/5520/* B2AD */,/*18992*/5520/*B2AE */,/*18993*/5520/*B2AF */,/*18994*/5520/*B2B0 */, /*18995*/5520/*B2B1 */,/*18996*/5520/*B2B2 */,/*18997*/5520/*B2B3 */,/*18998*/5520/*B2B4 */,/*18999*/5520/*B2B5 */, /*19000*/5520/*B2B6 */,/*19001*/5520/*B2B7 */,/*19002*/5520/*B2B8 */,/*19003*/5520/*B2B9 */,/*19004*/5520/*B2BA */, /*19005*/5520/*B2BB */,/*19006*/5520/*B2BC */,/*19007*/5520/*B2BD */,/*19008*/5520/*B2BE */,/*19009*/5520/*B2BF */, /*19010*/5520/*B2C0 */,/*19011*/5520/*B2C1 */,/*19012*/5520/*B2C2 */,/*19013*/5520/*B2C3 */,/*19014*/5520/*B2C4 */, /*19015*/5520/*B2C5 */,/*19016*/5520/*B2C6 */,/*19017*/5520/*B2C7 */,/*19018*/5519/* B2C8 */,/*19019*/5520/* B2C9 */, /*19020*/5520/*B2CA */,/*19021*/5520/*B2CB */,/*19022*/5520/*B2CC */,/*19023*/5520/*B2CD */,/*19024*/5520/*B2CE */, /*19025*/5520/*B2CF */,/*19026*/5520/*B2D0 */,/*19027*/5520/*B2D1 */,/*19028*/5520/*B2D2 */,/*19029*/5520/*B2D3 */, /*19030*/5520/*B2D4 */,/*19031*/5520/*B2D5 */,/*19032*/5520/*B2D6 */,/*19033*/5520/*B2D7 */,/*19034*/5520/*B2D8 */, /*19035*/5520/*B2D9 */,/*19036*/5520/*B2DA */,/*19037*/5520/*B2DB */,/*19038*/5520/*B2DC */,/*19039*/5520/*B2DD */, /*19040*/5520/*B2DE */,/*19041*/5520/*B2DF */,/*19042*/5520/*B2E0 */,/*19043*/5520/*B2E1 */,/*19044*/5520/*B2E2 */, /*19045*/5520/*B2E3 */,/*19046*/5519/* B2E4 */,/*19047*/5520/* B2E5 */,/*19048*/5520/*B2E6 */,/*19049*/5520/*B2E7 */, /*19050*/5520/*B2E8 */,/*19051*/5520/*B2E9 */,/*19052*/5520/*B2EA */,/*19053*/5520/*B2EB */,/*19054*/5520/*B2EC */, /*19055*/5520/*B2ED */,/*19056*/5520/*B2EE */,/*19057*/5520/*B2EF */,/*19058*/5520/*B2F0 */,/*19059*/5520/*B2F1 */, /*19060*/5520/*B2F2 */,/*19061*/5520/*B2F3 */,/*19062*/5520/*B2F4 */,/*19063*/5520/*B2F5 */,/*19064*/5520/*B2F6 */, /*19065*/5520/*B2F7 */,/*19066*/5520/*B2F8 */,/*19067*/5520/*B2F9 */,/*19068*/5520/*B2FA */,/*19069*/5520/*B2FB */, /*19070*/5520/*B2FC */,/*19071*/5520/*B2FD */,/*19072*/5520/*B2FE */,/*19073*/5520/*B2FF */,/*19074*/5519/* B300 */, /*19075*/5520/* B301 */,/*19076*/5520/*B302 */,/*19077*/5520/*B303 */,/*19078*/5520/*B304 */,/*19079*/5520/*B305 */, /*19080*/5520/*B306 */,/*19081*/5520/*B307 */,/*19082*/5520/*B308 */,/*19083*/5520/*B309 */,/*19084*/5520/*B30A */, /*19085*/5520/*B30B */,/*19086*/5520/*B30C */,/*19087*/5520/*B30D */,/*19088*/5520/*B30E */,/*19089*/5520/*B30F */, /*19090*/5520/*B310 */,/*19091*/5520/*B311 */,/*19092*/5520/*B312 */,/*19093*/5520/*B313 */,/*19094*/5520/*B314 */, /*19095*/5520/*B315 */,/*19096*/5520/*B316 */,/*19097*/5520/*B317 */,/*19098*/5520/*B318 */,/*19099*/5520/*B319 */, /*19100*/5520/*B31A */,/*19101*/5520/*B31B */,/*19102*/5519/* B31C */,/*19103*/5520/* B31D */,/*19104*/5520/*B31E */, /*19105*/5520/*B31F */,/*19106*/5520/*B320 */,/*19107*/5520/*B321 */,/*19108*/5520/*B322 */,/*19109*/5520/*B323 */, /*19110*/5520/*B324 */,/*19111*/5520/*B325 */,/*19112*/5520/*B326 */,/*19113*/5520/*B327 */,/*19114*/5520/*B328 */, /*19115*/5520/*B329 */,/*19116*/5520/*B32A */,/*19117*/5520/*B32B */,/*19118*/5520/*B32C */,/*19119*/5520/*B32D */, /*19120*/5520/*B32E */,/*19121*/5520/*B32F */,/*19122*/5520/*B330 */,/*19123*/5520/*B331 */,/*19124*/5520/*B332 */, /*19125*/5520/*B333 */,/*19126*/5520/*B334 */,/*19127*/5520/*B335 */,/*19128*/5520/*B336 */,/*19129*/5520/*B337 */, /*19130*/5519/* B338 */,/*19131*/5520/* B339 */,/*19132*/5520/*B33A */,/*19133*/5520/*B33B */,/*19134*/5520/*B33C */, /*19135*/5520/*B33D */,/*19136*/5520/*B33E */,/*19137*/5520/*B33F */,/*19138*/5520/*B340 */,/*19139*/5520/*B341 */, /*19140*/5520/*B342 */,/*19141*/5520/*B343 */,/*19142*/5520/*B344 */,/*19143*/5520/*B345 */,/*19144*/5520/*B346 */, /*19145*/5520/*B347 */,/*19146*/5520/*B348 */,/*19147*/5520/*B349 */,/*19148*/5520/*B34A */,/*19149*/5520/*B34B */, /*19150*/5520/*B34C */,/*19151*/5520/*B34D */,/*19152*/5520/*B34E */,/*19153*/5520/*B34F */,/*19154*/5520/*B350 */, /*19155*/5520/*B351 */,/*19156*/5520/*B352 */,/*19157*/5520/*B353 */,/*19158*/5519/* B354 */,/*19159*/5520/* B355 */, /*19160*/5520/*B356 */,/*19161*/5520/*B357 */,/*19162*/5520/*B358 */,/*19163*/5520/*B359 */,/*19164*/5520/*B35A */, /*19165*/5520/*B35B */,/*19166*/5520/*B35C */,/*19167*/5520/*B35D */,/*19168*/5520/*B35E */,/*19169*/5520/*B35F */, /*19170*/5520/*B360 */,/*19171*/5520/*B361 */,/*19172*/5520/*B362 */,/*19173*/5520/*B363 */,/*19174*/5520/*B364 */, /*19175*/5520/*B365 */,/*19176*/5520/*B366 */,/*19177*/5520/*B367 */,/*19178*/5520/*B368 */,/*19179*/5520/*B369 */, /*19180*/5520/*B36A */,/*19181*/5520/*B36B */,/*19182*/5520/*B36C */,/*19183*/5520/*B36D */,/*19184*/5520/*B36E */, /*19185*/5520/*B36F */,/*19186*/5519/* B370 */,/*19187*/5520/* B371 */,/*19188*/5520/*B372 */,/*19189*/5520/*B373 */, /*19190*/5520/*B374 */,/*19191*/5520/*B375 */,/*19192*/5520/*B376 */,/*19193*/5520/*B377 */,/*19194*/5520/*B378 */, /*19195*/5520/*B379 */,/*19196*/5520/*B37A */,/*19197*/5520/*B37B */,/*19198*/5520/*B37C */,/*19199*/5520/*B37D */, /*19200*/5520/*B37E */,/*19201*/5520/*B37F */,/*19202*/5520/*B380 */,/*19203*/5520/*B381 */,/*19204*/5520/*B382 */, /*19205*/5520/*B383 */,/*19206*/5520/*B384 */,/*19207*/5520/*B385 */,/*19208*/5520/*B386 */,/*19209*/5520/*B387 */, /*19210*/5520/*B388 */,/*19211*/5520/*B389 */,/*19212*/5520/*B38A */,/*19213*/5520/*B38B */,/*19214*/5519/* B38C */, /*19215*/5520/* B38D */,/*19216*/5520/*B38E */,/*19217*/5520/*B38F */,/*19218*/5520/*B390 */,/*19219*/5520/*B391 */, /*19220*/5520/*B392 */,/*19221*/5520/*B393 */,/*19222*/5520/*B394 */,/*19223*/5520/*B395 */,/*19224*/5520/*B396 */, /*19225*/5520/*B397 */,/*19226*/5520/*B398 */,/*19227*/5520/*B399 */,/*19228*/5520/*B39A */,/*19229*/5520/*B39B */, /*19230*/5520/*B39C */,/*19231*/5520/*B39D */,/*19232*/5520/*B39E */,/*19233*/5520/*B39F */,/*19234*/5520/*B3A0 */, /*19235*/5520/*B3A1 */,/*19236*/5520/*B3A2 */,/*19237*/5520/*B3A3 */,/*19238*/5520/*B3A4 */,/*19239*/5520/*B3A5 */, /*19240*/5520/*B3A6 */,/*19241*/5520/*B3A7 */,/*19242*/5519/* B3A8 */,/*19243*/5520/* B3A9 */,/*19244*/5520/*B3AA */, /*19245*/5520/*B3AB */,/*19246*/5520/*B3AC */,/*19247*/5520/*B3AD */,/*19248*/5520/*B3AE */,/*19249*/5520/*B3AF */, /*19250*/5520/*B3B0 */,/*19251*/5520/*B3B1 */,/*19252*/5520/*B3B2 */,/*19253*/5520/*B3B3 */,/*19254*/5520/*B3B4 */, /*19255*/5520/*B3B5 */,/*19256*/5520/*B3B6 */,/*19257*/5520/*B3B7 */,/*19258*/5520/*B3B8 */,/*19259*/5520/*B3B9 */, /*19260*/5520/*B3BA */,/*19261*/5520/*B3BB */,/*19262*/5520/*B3BC */,/*19263*/5520/*B3BD */,/*19264*/5520/*B3BE */, /*19265*/5520/*B3BF */,/*19266*/5520/*B3C0 */,/*19267*/5520/*B3C1 */,/*19268*/5520/*B3C2 */,/*19269*/5520/*B3C3 */, /*19270*/5519/* B3C4 */,/*19271*/5520/* B3C5 */,/*19272*/5520/*B3C6 */,/*19273*/5520/*B3C7 */,/*19274*/5520/*B3C8 */, /*19275*/5520/*B3C9 */,/*19276*/5520/*B3CA */,/*19277*/5520/*B3CB */,/*19278*/5520/*B3CC */,/*19279*/5520/*B3CD */, /*19280*/5520/*B3CE */,/*19281*/5520/*B3CF */,/*19282*/5520/*B3D0 */,/*19283*/5520/*B3D1 */,/*19284*/5520/*B3D2 */, /*19285*/5520/*B3D3 */,/*19286*/5520/*B3D4 */,/*19287*/5520/*B3D5 */,/*19288*/5520/*B3D6 */,/*19289*/5520/*B3D7 */, /*19290*/5520/*B3D8 */,/*19291*/5520/*B3D9 */,/*19292*/5520/*B3DA */,/*19293*/5520/*B3DB */,/*19294*/5520/*B3DC */, /*19295*/5520/*B3DD */,/*19296*/5520/*B3DE */,/*19297*/5520/*B3DF */,/*19298*/5519/* B3E0 */,/*19299*/5520/* B3E1 */, /*19300*/5520/*B3E2 */,/*19301*/5520/*B3E3 */,/*19302*/5520/*B3E4 */,/*19303*/5520/*B3E5 */,/*19304*/5520/*B3E6 */, /*19305*/5520/*B3E7 */,/*19306*/5520/*B3E8 */,/*19307*/5520/*B3E9 */,/*19308*/5520/*B3EA */,/*19309*/5520/*B3EB */, /*19310*/5520/*B3EC */,/*19311*/5520/*B3ED */,/*19312*/5520/*B3EE */,/*19313*/5520/*B3EF */,/*19314*/5520/*B3F0 */, /*19315*/5520/*B3F1 */,/*19316*/5520/*B3F2 */,/*19317*/5520/*B3F3 */,/*19318*/5520/*B3F4 */,/*19319*/5520/*B3F5 */, /*19320*/5520/*B3F6 */,/*19321*/5520/*B3F7 */,/*19322*/5520/*B3F8 */,/*19323*/5520/*B3F9 */,/*19324*/5520/*B3FA */, /*19325*/5520/*B3FB */,/*19326*/5519/* B3FC */,/*19327*/5520/* B3FD */,/*19328*/5520/*B3FE */,/*19329*/5520/*B3FF */, /*19330*/5520/*B400 */,/*19331*/5520/*B401 */,/*19332*/5520/*B402 */,/*19333*/5520/*B403 */,/*19334*/5520/*B404 */, /*19335*/5520/*B405 */,/*19336*/5520/*B406 */,/*19337*/5520/*B407 */,/*19338*/5520/*B408 */,/*19339*/5520/*B409 */, /*19340*/5520/*B40A */,/*19341*/5520/*B40B */,/*19342*/5520/*B40C */,/*19343*/5520/*B40D */,/*19344*/5520/*B40E */, /*19345*/5520/*B40F */,/*19346*/5520/*B410 */,/*19347*/5520/*B411 */,/*19348*/5520/*B412 */,/*19349*/5520/*B413 */, /*19350*/5520/*B414 */,/*19351*/5520/*B415 */,/*19352*/5520/*B416 */,/*19353*/5520/*B417 */,/*19354*/5519/* B418 */, /*19355*/5520/* B419 */,/*19356*/5520/*B41A */,/*19357*/5520/*B41B */,/*19358*/5520/*B41C */,/*19359*/5520/*B41D */, /*19360*/5520/*B41E */,/*19361*/5520/*B41F */,/*19362*/5520/*B420 */,/*19363*/5520/*B421 */,/*19364*/5520/*B422 */, /*19365*/5520/*B423 */,/*19366*/5520/*B424 */,/*19367*/5520/*B425 */,/*19368*/5520/*B426 */,/*19369*/5520/*B427 */, /*19370*/5520/*B428 */,/*19371*/5520/*B429 */,/*19372*/5520/*B42A */,/*19373*/5520/*B42B */,/*19374*/5520/*B42C */, /*19375*/5520/*B42D */,/*19376*/5520/*B42E */,/*19377*/5520/*B42F */,/*19378*/5520/*B430 */,/*19379*/5520/*B431 */, /*19380*/5520/*B432 */,/*19381*/5520/*B433 */,/*19382*/5519/* B434 */,/*19383*/5520/* B435 */,/*19384*/5520/*B436 */, /*19385*/5520/*B437 */,/*19386*/5520/*B438 */,/*19387*/5520/*B439 */,/*19388*/5520/*B43A */,/*19389*/5520/*B43B */, /*19390*/5520/*B43C */,/*19391*/5520/*B43D */,/*19392*/5520/*B43E */,/*19393*/5520/*B43F */,/*19394*/5520/*B440 */, /*19395*/5520/*B441 */,/*19396*/5520/*B442 */,/*19397*/5520/*B443 */,/*19398*/5520/*B444 */,/*19399*/5520/*B445 */, /*19400*/5520/*B446 */,/*19401*/5520/*B447 */,/*19402*/5520/*B448 */,/*19403*/5520/*B449 */,/*19404*/5520/*B44A */, /*19405*/5520/*B44B */,/*19406*/5520/*B44C */,/*19407*/5520/*B44D */,/*19408*/5520/*B44E */,/*19409*/5520/*B44F */, /*19410*/5519/* B450 */,/*19411*/5520/* B451 */,/*19412*/5520/*B452 */,/*19413*/5520/*B453 */,/*19414*/5520/*B454 */, /*19415*/5520/*B455 */,/*19416*/5520/*B456 */,/*19417*/5520/*B457 */,/*19418*/5520/*B458 */,/*19419*/5520/*B459 */, /*19420*/5520/*B45A */,/*19421*/5520/*B45B */,/*19422*/5520/*B45C */,/*19423*/5520/*B45D */,/*19424*/5520/*B45E */, /*19425*/5520/*B45F */,/*19426*/5520/*B460 */,/*19427*/5520/*B461 */,/*19428*/5520/*B462 */,/*19429*/5520/*B463 */, /*19430*/5520/*B464 */,/*19431*/5520/*B465 */,/*19432*/5520/*B466 */,/*19433*/5520/*B467 */,/*19434*/5520/*B468 */, /*19435*/5520/*B469 */,/*19436*/5520/*B46A */,/*19437*/5520/*B46B */,/*19438*/5519/* B46C */,/*19439*/5520/* B46D */, /*19440*/5520/*B46E */,/*19441*/5520/*B46F */,/*19442*/5520/*B470 */,/*19443*/5520/*B471 */,/*19444*/5520/*B472 */, /*19445*/5520/*B473 */,/*19446*/5520/*B474 */,/*19447*/5520/*B475 */,/*19448*/5520/*B476 */,/*19449*/5520/*B477 */, /*19450*/5520/*B478 */,/*19451*/5520/*B479 */,/*19452*/5520/*B47A */,/*19453*/5520/*B47B */,/*19454*/5520/*B47C */, /*19455*/5520/*B47D */,/*19456*/5520/*B47E */,/*19457*/5520/*B47F */,/*19458*/5520/*B480 */,/*19459*/5520/*B481 */, /*19460*/5520/*B482 */,/*19461*/5520/*B483 */,/*19462*/5520/*B484 */,/*19463*/5520/*B485 */,/*19464*/5520/*B486 */, /*19465*/5520/*B487 */,/*19466*/5519/* B488 */,/*19467*/5520/* B489 */,/*19468*/5520/*B48A */,/*19469*/5520/*B48B */, /*19470*/5520/*B48C */,/*19471*/5520/*B48D */,/*19472*/5520/*B48E */,/*19473*/5520/*B48F */,/*19474*/5520/*B490 */, /*19475*/5520/*B491 */,/*19476*/5520/*B492 */,/*19477*/5520/*B493 */,/*19478*/5520/*B494 */,/*19479*/5520/*B495 */, /*19480*/5520/*B496 */,/*19481*/5520/*B497 */,/*19482*/5520/*B498 */,/*19483*/5520/*B499 */,/*19484*/5520/*B49A */, /*19485*/5520/*B49B */,/*19486*/5520/*B49C */,/*19487*/5520/*B49D */,/*19488*/5520/*B49E */,/*19489*/5520/*B49F */, /*19490*/5520/*B4A0 */,/*19491*/5520/*B4A1 */,/*19492*/5520/*B4A2 */,/*19493*/5520/*B4A3 */,/*19494*/5519/* B4A4 */, /*19495*/5520/* B4A5 */,/*19496*/5520/*B4A6 */,/*19497*/5520/*B4A7 */,/*19498*/5520/*B4A8 */,/*19499*/5520/*B4A9 */, /*19500*/5520/*B4AA */,/*19501*/5520/*B4AB */,/*19502*/5520/*B4AC */,/*19503*/5520/*B4AD */,/*19504*/5520/*B4AE */, /*19505*/5520/*B4AF */,/*19506*/5520/*B4B0 */,/*19507*/5520/*B4B1 */,/*19508*/5520/*B4B2 */,/*19509*/5520/*B4B3 */, /*19510*/5520/*B4B4 */,/*19511*/5520/*B4B5 */,/*19512*/5520/*B4B6 */,/*19513*/5520/*B4B7 */,/*19514*/5520/*B4B8 */, /*19515*/5520/*B4B9 */,/*19516*/5520/*B4BA */,/*19517*/5520/*B4BB */,/*19518*/5520/*B4BC */,/*19519*/5520/*B4BD */, /*19520*/5520/*B4BE */,/*19521*/5520/*B4BF */,/*19522*/5519/* B4C0 */,/*19523*/5520/* B4C1 */,/*19524*/5520/*B4C2 */, /*19525*/5520/*B4C3 */,/*19526*/5520/*B4C4 */,/*19527*/5520/*B4C5 */,/*19528*/5520/*B4C6 */,/*19529*/5520/*B4C7 */, /*19530*/5520/*B4C8 */,/*19531*/5520/*B4C9 */,/*19532*/5520/*B4CA */,/*19533*/5520/*B4CB */,/*19534*/5520/*B4CC */, /*19535*/5520/*B4CD */,/*19536*/5520/*B4CE */,/*19537*/5520/*B4CF */,/*19538*/5520/*B4D0 */,/*19539*/5520/*B4D1 */, /*19540*/5520/*B4D2 */,/*19541*/5520/*B4D3 */,/*19542*/5520/*B4D4 */,/*19543*/5520/*B4D5 */,/*19544*/5520/*B4D6 */, /*19545*/5520/*B4D7 */,/*19546*/5520/*B4D8 */,/*19547*/5520/*B4D9 */,/*19548*/5520/*B4DA */,/*19549*/5520/*B4DB */, /*19550*/5519/* B4DC */,/*19551*/5520/* B4DD */,/*19552*/5520/*B4DE */,/*19553*/5520/*B4DF */,/*19554*/5520/*B4E0 */, /*19555*/5520/*B4E1 */,/*19556*/5520/*B4E2 */,/*19557*/5520/*B4E3 */,/*19558*/5520/*B4E4 */,/*19559*/5520/*B4E5 */, /*19560*/5520/*B4E6 */,/*19561*/5520/*B4E7 */,/*19562*/5520/*B4E8 */,/*19563*/5520/*B4E9 */,/*19564*/5520/*B4EA */, /*19565*/5520/*B4EB */,/*19566*/5520/*B4EC */,/*19567*/5520/*B4ED */,/*19568*/5520/*B4EE */,/*19569*/5520/*B4EF */, /*19570*/5520/*B4F0 */,/*19571*/5520/*B4F1 */,/*19572*/5520/*B4F2 */,/*19573*/5520/*B4F3 */,/*19574*/5520/*B4F4 */, /*19575*/5520/*B4F5 */,/*19576*/5520/*B4F6 */,/*19577*/5520/*B4F7 */,/*19578*/5519/* B4F8 */,/*19579*/5520/* B4F9 */, /*19580*/5520/*B4FA */,/*19581*/5520/*B4FB */,/*19582*/5520/*B4FC */,/*19583*/5520/*B4FD */,/*19584*/5520/*B4FE */, /*19585*/5520/*B4FF */,/*19586*/5520/*B500 */,/*19587*/5520/*B501 */,/*19588*/5520/*B502 */,/*19589*/5520/*B503 */, /*19590*/5520/*B504 */,/*19591*/5520/*B505 */,/*19592*/5520/*B506 */,/*19593*/5520/*B507 */,/*19594*/5520/*B508 */, /*19595*/5520/*B509 */,/*19596*/5520/*B50A */,/*19597*/5520/*B50B */,/*19598*/5520/*B50C */,/*19599*/5520/*B50D */, /*19600*/5520/*B50E */,/*19601*/5520/*B50F */,/*19602*/5520/*B510 */,/*19603*/5520/*B511 */,/*19604*/5520/*B512 */, /*19605*/5520/*B513 */,/*19606*/5519/* B514 */,/*19607*/5520/* B515 */,/*19608*/5520/*B516 */,/*19609*/5520/*B517 */, /*19610*/5520/*B518 */,/*19611*/5520/*B519 */,/*19612*/5520/*B51A */,/*19613*/5520/*B51B */,/*19614*/5520/*B51C */, /*19615*/5520/*B51D */,/*19616*/5520/*B51E */,/*19617*/5520/*B51F */,/*19618*/5520/*B520 */,/*19619*/5520/*B521 */, /*19620*/5520/*B522 */,/*19621*/5520/*B523 */,/*19622*/5520/*B524 */,/*19623*/5520/*B525 */,/*19624*/5520/*B526 */, /*19625*/5520/*B527 */,/*19626*/5520/*B528 */,/*19627*/5520/*B529 */,/*19628*/5520/*B52A */,/*19629*/5520/*B52B */, /*19630*/5520/*B52C */,/*19631*/5520/*B52D */,/*19632*/5520/*B52E */,/*19633*/5520/*B52F */,/*19634*/5519/* B530 */, /*19635*/5520/* B531 */,/*19636*/5520/*B532 */,/*19637*/5520/*B533 */,/*19638*/5520/*B534 */,/*19639*/5520/*B535 */, /*19640*/5520/*B536 */,/*19641*/5520/*B537 */,/*19642*/5520/*B538 */,/*19643*/5520/*B539 */,/*19644*/5520/*B53A */, /*19645*/5520/*B53B */,/*19646*/5520/*B53C */,/*19647*/5520/*B53D */,/*19648*/5520/*B53E */,/*19649*/5520/*B53F */, /*19650*/5520/*B540 */,/*19651*/5520/*B541 */,/*19652*/5520/*B542 */,/*19653*/5520/*B543 */,/*19654*/5520/*B544 */, /*19655*/5520/*B545 */,/*19656*/5520/*B546 */,/*19657*/5520/*B547 */,/*19658*/5520/*B548 */,/*19659*/5520/*B549 */, /*19660*/5520/*B54A */,/*19661*/5520/*B54B */,/*19662*/5519/* B54C */,/*19663*/5520/* B54D */,/*19664*/5520/*B54E */, /*19665*/5520/*B54F */,/*19666*/5520/*B550 */,/*19667*/5520/*B551 */,/*19668*/5520/*B552 */,/*19669*/5520/*B553 */, /*19670*/5520/*B554 */,/*19671*/5520/*B555 */,/*19672*/5520/*B556 */,/*19673*/5520/*B557 */,/*19674*/5520/*B558 */, /*19675*/5520/*B559 */,/*19676*/5520/*B55A */,/*19677*/5520/*B55B */,/*19678*/5520/*B55C */,/*19679*/5520/*B55D */, /*19680*/5520/*B55E */,/*19681*/5520/*B55F */,/*19682*/5520/*B560 */,/*19683*/5520/*B561 */,/*19684*/5520/*B562 */, /*19685*/5520/*B563 */,/*19686*/5520/*B564 */,/*19687*/5520/*B565 */,/*19688*/5520/*B566 */,/*19689*/5520/*B567 */, /*19690*/5519/* B568 */,/*19691*/5520/* B569 */,/*19692*/5520/*B56A */,/*19693*/5520/*B56B */,/*19694*/5520/*B56C */, /*19695*/5520/*B56D */,/*19696*/5520/*B56E */,/*19697*/5520/*B56F */,/*19698*/5520/*B570 */,/*19699*/5520/*B571 */, /*19700*/5520/*B572 */,/*19701*/5520/*B573 */,/*19702*/5520/*B574 */,/*19703*/5520/*B575 */,/*19704*/5520/*B576 */, /*19705*/5520/*B577 */,/*19706*/5520/*B578 */,/*19707*/5520/*B579 */,/*19708*/5520/*B57A */,/*19709*/5520/*B57B */, /*19710*/5520/*B57C */,/*19711*/5520/*B57D */,/*19712*/5520/*B57E */,/*19713*/5520/*B57F */,/*19714*/5520/*B580 */, /*19715*/5520/*B581 */,/*19716*/5520/*B582 */,/*19717*/5520/*B583 */,/*19718*/5519/* B584 */,/*19719*/5520/* B585 */, /*19720*/5520/*B586 */,/*19721*/5520/*B587 */,/*19722*/5520/*B588 */,/*19723*/5520/*B589 */,/*19724*/5520/*B58A */, /*19725*/5520/*B58B */,/*19726*/5520/*B58C */,/*19727*/5520/*B58D */,/*19728*/5520/*B58E */,/*19729*/5520/*B58F */, /*19730*/5520/*B590 */,/*19731*/5520/*B591 */,/*19732*/5520/*B592 */,/*19733*/5520/*B593 */,/*19734*/5520/*B594 */, /*19735*/5520/*B595 */,/*19736*/5520/*B596 */,/*19737*/5520/*B597 */,/*19738*/5520/*B598 */,/*19739*/5520/*B599 */, /*19740*/5520/*B59A */,/*19741*/5520/*B59B */,/*19742*/5520/*B59C */,/*19743*/5520/*B59D */,/*19744*/5520/*B59E */, /*19745*/5520/*B59F */,/*19746*/5519/* B5A0 */,/*19747*/5520/* B5A1 */,/*19748*/5520/*B5A2 */,/*19749*/5520/*B5A3 */, /*19750*/5520/*B5A4 */,/*19751*/5520/*B5A5 */,/*19752*/5520/*B5A6 */,/*19753*/5520/*B5A7 */,/*19754*/5520/*B5A8 */, /*19755*/5520/*B5A9 */,/*19756*/5520/*B5AA */,/*19757*/5520/*B5AB */,/*19758*/5520/*B5AC */,/*19759*/5520/*B5AD */, /*19760*/5520/*B5AE */,/*19761*/5520/*B5AF */,/*19762*/5520/*B5B0 */,/*19763*/5520/*B5B1 */,/*19764*/5520/*B5B2 */, /*19765*/5520/*B5B3 */,/*19766*/5520/*B5B4 */,/*19767*/5520/*B5B5 */,/*19768*/5520/*B5B6 */,/*19769*/5520/*B5B7 */, /*19770*/5520/*B5B8 */,/*19771*/5520/*B5B9 */,/*19772*/5520/*B5BA */,/*19773*/5520/*B5BB */,/*19774*/5519/* B5BC */, /*19775*/5520/* B5BD */,/*19776*/5520/*B5BE */,/*19777*/5520/*B5BF */,/*19778*/5520/*B5C0 */,/*19779*/5520/*B5C1 */, /*19780*/5520/*B5C2 */,/*19781*/5520/*B5C3 */,/*19782*/5520/*B5C4 */,/*19783*/5520/*B5C5 */,/*19784*/5520/*B5C6 */, /*19785*/5520/*B5C7 */,/*19786*/5520/*B5C8 */,/*19787*/5520/*B5C9 */,/*19788*/5520/*B5CA */,/*19789*/5520/*B5CB */, /*19790*/5520/*B5CC */,/*19791*/5520/*B5CD */,/*19792*/5520/*B5CE */,/*19793*/5520/*B5CF */,/*19794*/5520/*B5D0 */, /*19795*/5520/*B5D1 */,/*19796*/5520/*B5D2 */,/*19797*/5520/*B5D3 */,/*19798*/5520/*B5D4 */,/*19799*/5520/*B5D5 */, /*19800*/5520/*B5D6 */,/*19801*/5520/*B5D7 */,/*19802*/5519/* B5D8 */,/*19803*/5520/* B5D9 */,/*19804*/5520/*B5DA */, /*19805*/5520/*B5DB */,/*19806*/5520/*B5DC */,/*19807*/5520/*B5DD */,/*19808*/5520/*B5DE */,/*19809*/5520/*B5DF */, /*19810*/5520/*B5E0 */,/*19811*/5520/*B5E1 */,/*19812*/5520/*B5E2 */,/*19813*/5520/*B5E3 */,/*19814*/5520/*B5E4 */, /*19815*/5520/*B5E5 */,/*19816*/5520/*B5E6 */,/*19817*/5520/*B5E7 */,/*19818*/5520/*B5E8 */,/*19819*/5520/*B5E9 */, /*19820*/5520/*B5EA */,/*19821*/5520/*B5EB */,/*19822*/5520/*B5EC */,/*19823*/5520/*B5ED */,/*19824*/5520/*B5EE */, /*19825*/5520/*B5EF */,/*19826*/5520/*B5F0 */,/*19827*/5520/*B5F1 */,/*19828*/5520/*B5F2 */,/*19829*/5520/*B5F3 */, /*19830*/5519/* B5F4 */,/*19831*/5520/* B5F5 */,/*19832*/5520/*B5F6 */,/*19833*/5520/*B5F7 */,/*19834*/5520/*B5F8 */, /*19835*/5520/*B5F9 */,/*19836*/5520/*B5FA */,/*19837*/5520/*B5FB */,/*19838*/5520/*B5FC */,/*19839*/5520/*B5FD */, /*19840*/5520/*B5FE */,/*19841*/5520/*B5FF */,/*19842*/5520/*B600 */,/*19843*/5520/*B601 */,/*19844*/5520/*B602 */, /*19845*/5520/*B603 */,/*19846*/5520/*B604 */,/*19847*/5520/*B605 */,/*19848*/5520/*B606 */,/*19849*/5520/*B607 */, /*19850*/5520/*B608 */,/*19851*/5520/*B609 */,/*19852*/5520/*B60A */,/*19853*/5520/*B60B */,/*19854*/5520/*B60C */, /*19855*/5520/*B60D */,/*19856*/5520/*B60E */,/*19857*/5520/*B60F */,/*19858*/5519/* B610 */,/*19859*/5520/* B611 */, /*19860*/5520/*B612 */,/*19861*/5520/*B613 */,/*19862*/5520/*B614 */,/*19863*/5520/*B615 */,/*19864*/5520/*B616 */, /*19865*/5520/*B617 */,/*19866*/5520/*B618 */,/*19867*/5520/*B619 */,/*19868*/5520/*B61A */,/*19869*/5520/*B61B */, /*19870*/5520/*B61C */,/*19871*/5520/*B61D */,/*19872*/5520/*B61E */,/*19873*/5520/*B61F */,/*19874*/5520/*B620 */, /*19875*/5520/*B621 */,/*19876*/5520/*B622 */,/*19877*/5520/*B623 */,/*19878*/5520/*B624 */,/*19879*/5520/*B625 */, /*19880*/5520/*B626 */,/*19881*/5520/*B627 */,/*19882*/5520/*B628 */,/*19883*/5520/*B629 */,/*19884*/5520/*B62A */, /*19885*/5520/*B62B */,/*19886*/5519/* B62C */,/*19887*/5520/* B62D */,/*19888*/5520/*B62E */,/*19889*/5520/*B62F */, /*19890*/5520/*B630 */,/*19891*/5520/*B631 */,/*19892*/5520/*B632 */,/*19893*/5520/*B633 */,/*19894*/5520/*B634 */, /*19895*/5520/*B635 */,/*19896*/5520/*B636 */,/*19897*/5520/*B637 */,/*19898*/5520/*B638 */,/*19899*/5520/*B639 */, /*19900*/5520/*B63A */,/*19901*/5520/*B63B */,/*19902*/5520/*B63C */,/*19903*/5520/*B63D */,/*19904*/5520/*B63E */, /*19905*/5520/*B63F */,/*19906*/5520/*B640 */,/*19907*/5520/*B641 */,/*19908*/5520/*B642 */,/*19909*/5520/*B643 */, /*19910*/5520/*B644 */,/*19911*/5520/*B645 */,/*19912*/5520/*B646 */,/*19913*/5520/*B647 */,/*19914*/5519/* B648 */, /*19915*/5520/* B649 */,/*19916*/5520/*B64A */,/*19917*/5520/*B64B */,/*19918*/5520/*B64C */,/*19919*/5520/*B64D */, /*19920*/5520/*B64E */,/*19921*/5520/*B64F */,/*19922*/5520/*B650 */,/*19923*/5520/*B651 */,/*19924*/5520/*B652 */, /*19925*/5520/*B653 */,/*19926*/5520/*B654 */,/*19927*/5520/*B655 */,/*19928*/5520/*B656 */,/*19929*/5520/*B657 */, /*19930*/5520/*B658 */,/*19931*/5520/*B659 */,/*19932*/5520/*B65A */,/*19933*/5520/*B65B */,/*19934*/5520/*B65C */, /*19935*/5520/*B65D */,/*19936*/5520/*B65E */,/*19937*/5520/*B65F */,/*19938*/5520/*B660 */,/*19939*/5520/*B661 */, /*19940*/5520/*B662 */,/*19941*/5520/*B663 */,/*19942*/5519/* B664 */,/*19943*/5520/* B665 */,/*19944*/5520/*B666 */, /*19945*/5520/*B667 */,/*19946*/5520/*B668 */,/*19947*/5520/*B669 */,/*19948*/5520/*B66A */,/*19949*/5520/*B66B */, /*19950*/5520/*B66C */,/*19951*/5520/*B66D */,/*19952*/5520/*B66E */,/*19953*/5520/*B66F */,/*19954*/5520/*B670 */, /*19955*/5520/*B671 */,/*19956*/5520/*B672 */,/*19957*/5520/*B673 */,/*19958*/5520/*B674 */,/*19959*/5520/*B675 */, /*19960*/5520/*B676 */,/*19961*/5520/*B677 */,/*19962*/5520/*B678 */,/*19963*/5520/*B679 */,/*19964*/5520/*B67A */, /*19965*/5520/*B67B */,/*19966*/5520/*B67C */,/*19967*/5520/*B67D */,/*19968*/5520/*B67E */,/*19969*/5520/*B67F */, /*19970*/5519/* B680 */,/*19971*/5520/* B681 */,/*19972*/5520/*B682 */,/*19973*/5520/*B683 */,/*19974*/5520/*B684 */, /*19975*/5520/*B685 */,/*19976*/5520/*B686 */,/*19977*/5520/*B687 */,/*19978*/5520/*B688 */,/*19979*/5520/*B689 */, /*19980*/5520/*B68A */,/*19981*/5520/*B68B */,/*19982*/5520/*B68C */,/*19983*/5520/*B68D */,/*19984*/5520/*B68E */, /*19985*/5520/*B68F */,/*19986*/5520/*B690 */,/*19987*/5520/*B691 */,/*19988*/5520/*B692 */,/*19989*/5520/*B693 */, /*19990*/5520/*B694 */,/*19991*/5520/*B695 */,/*19992*/5520/*B696 */,/*19993*/5520/*B697 */,/*19994*/5520/*B698 */, /*19995*/5520/*B699 */,/*19996*/5520/*B69A */,/*19997*/5520/*B69B */,/*19998*/5519/* B69C */,/*19999*/5520/* B69D */, /*20000*/5520/*B69E */,/*20001*/5520/*B69F */,/*20002*/5520/*B6A0 */,/*20003*/5520/*B6A1 */,/*20004*/5520/*B6A2 */, /*20005*/5520/*B6A3 */,/*20006*/5520/*B6A4 */,/*20007*/5520/*B6A5 */,/*20008*/5520/*B6A6 */,/*20009*/5520/*B6A7 */, /*20010*/5520/*B6A8 */,/*20011*/5520/*B6A9 */,/*20012*/5520/*B6AA */,/*20013*/5520/*B6AB */,/*20014*/5520/*B6AC */, /*20015*/5520/*B6AD */,/*20016*/5520/*B6AE */,/*20017*/5520/*B6AF */,/*20018*/5520/*B6B0 */,/*20019*/5520/*B6B1 */, /*20020*/5520/*B6B2 */,/*20021*/5520/*B6B3 */,/*20022*/5520/*B6B4 */,/*20023*/5520/*B6B5 */,/*20024*/5520/*B6B6 */, /*20025*/5520/*B6B7 */,/*20026*/5519/* B6B8 */,/*20027*/5520/* B6B9 */,/*20028*/5520/*B6BA */,/*20029*/5520/*B6BB */, /*20030*/5520/*B6BC */,/*20031*/5520/*B6BD */,/*20032*/5520/*B6BE */,/*20033*/5520/*B6BF */,/*20034*/5520/*B6C0 */, /*20035*/5520/*B6C1 */,/*20036*/5520/*B6C2 */,/*20037*/5520/*B6C3 */,/*20038*/5520/*B6C4 */,/*20039*/5520/*B6C5 */, /*20040*/5520/*B6C6 */,/*20041*/5520/*B6C7 */,/*20042*/5520/*B6C8 */,/*20043*/5520/*B6C9 */,/*20044*/5520/*B6CA */, /*20045*/5520/*B6CB */,/*20046*/5520/*B6CC */,/*20047*/5520/*B6CD */,/*20048*/5520/*B6CE */,/*20049*/5520/*B6CF */, /*20050*/5520/*B6D0 */,/*20051*/5520/*B6D1 */,/*20052*/5520/*B6D2 */,/*20053*/5520/*B6D3 */,/*20054*/5519/* B6D4 */, /*20055*/5520/* B6D5 */,/*20056*/5520/*B6D6 */,/*20057*/5520/*B6D7 */,/*20058*/5520/*B6D8 */,/*20059*/5520/*B6D9 */, /*20060*/5520/*B6DA */,/*20061*/5520/*B6DB */,/*20062*/5520/*B6DC */,/*20063*/5520/*B6DD */,/*20064*/5520/*B6DE */, /*20065*/5520/*B6DF */,/*20066*/5520/*B6E0 */,/*20067*/5520/*B6E1 */,/*20068*/5520/*B6E2 */,/*20069*/5520/*B6E3 */, /*20070*/5520/*B6E4 */,/*20071*/5520/*B6E5 */,/*20072*/5520/*B6E6 */,/*20073*/5520/*B6E7 */,/*20074*/5520/*B6E8 */, /*20075*/5520/*B6E9 */,/*20076*/5520/*B6EA */,/*20077*/5520/*B6EB */,/*20078*/5520/*B6EC */,/*20079*/5520/*B6ED */, /*20080*/5520/*B6EE */,/*20081*/5520/*B6EF */,/*20082*/5519/* B6F0 */,/*20083*/5520/* B6F1 */,/*20084*/5520/*B6F2 */, /*20085*/5520/*B6F3 */,/*20086*/5520/*B6F4 */,/*20087*/5520/*B6F5 */,/*20088*/5520/*B6F6 */,/*20089*/5520/*B6F7 */, /*20090*/5520/*B6F8 */,/*20091*/5520/*B6F9 */,/*20092*/5520/*B6FA */,/*20093*/5520/*B6FB */,/*20094*/5520/*B6FC */, /*20095*/5520/*B6FD */,/*20096*/5520/*B6FE */,/*20097*/5520/*B6FF */,/*20098*/5520/*B700 */,/*20099*/5520/*B701 */, /*20100*/5520/*B702 */,/*20101*/5520/*B703 */,/*20102*/5520/*B704 */,/*20103*/5520/*B705 */,/*20104*/5520/*B706 */, /*20105*/5520/*B707 */,/*20106*/5520/*B708 */,/*20107*/5520/*B709 */,/*20108*/5520/*B70A */,/*20109*/5520/*B70B */, /*20110*/5519/* B70C */,/*20111*/5520/* B70D */,/*20112*/5520/*B70E */,/*20113*/5520/*B70F */,/*20114*/5520/*B710 */, /*20115*/5520/*B711 */,/*20116*/5520/*B712 */,/*20117*/5520/*B713 */,/*20118*/5520/*B714 */,/*20119*/5520/*B715 */, /*20120*/5520/*B716 */,/*20121*/5520/*B717 */,/*20122*/5520/*B718 */,/*20123*/5520/*B719 */,/*20124*/5520/*B71A */, /*20125*/5520/*B71B */,/*20126*/5520/*B71C */,/*20127*/5520/*B71D */,/*20128*/5520/*B71E */,/*20129*/5520/*B71F */, /*20130*/5520/*B720 */,/*20131*/5520/*B721 */,/*20132*/5520/*B722 */,/*20133*/5520/*B723 */,/*20134*/5520/*B724 */, /*20135*/5520/*B725 */,/*20136*/5520/*B726 */,/*20137*/5520/*B727 */,/*20138*/5519/* B728 */,/*20139*/5520/* B729 */, /*20140*/5520/*B72A */,/*20141*/5520/*B72B */,/*20142*/5520/*B72C */,/*20143*/5520/*B72D */,/*20144*/5520/*B72E */, /*20145*/5520/*B72F */,/*20146*/5520/*B730 */,/*20147*/5520/*B731 */,/*20148*/5520/*B732 */,/*20149*/5520/*B733 */, /*20150*/5520/*B734 */,/*20151*/5520/*B735 */,/*20152*/5520/*B736 */,/*20153*/5520/*B737 */,/*20154*/5520/*B738 */, /*20155*/5520/*B739 */,/*20156*/5520/*B73A */,/*20157*/5520/*B73B */,/*20158*/5520/*B73C */,/*20159*/5520/*B73D */, /*20160*/5520/*B73E */,/*20161*/5520/*B73F */,/*20162*/5520/*B740 */,/*20163*/5520/*B741 */,/*20164*/5520/*B742 */, /*20165*/5520/*B743 */,/*20166*/5519/* B744 */,/*20167*/5520/* B745 */,/*20168*/5520/*B746 */,/*20169*/5520/*B747 */, /*20170*/5520/*B748 */,/*20171*/5520/*B749 */,/*20172*/5520/*B74A */,/*20173*/5520/*B74B */,/*20174*/5520/*B74C */, /*20175*/5520/*B74D */,/*20176*/5520/*B74E */,/*20177*/5520/*B74F */,/*20178*/5520/*B750 */,/*20179*/5520/*B751 */, /*20180*/5520/*B752 */,/*20181*/5520/*B753 */,/*20182*/5520/*B754 */,/*20183*/5520/*B755 */,/*20184*/5520/*B756 */, /*20185*/5520/*B757 */,/*20186*/5520/*B758 */,/*20187*/5520/*B759 */,/*20188*/5520/*B75A */,/*20189*/5520/*B75B */, /*20190*/5520/*B75C */,/*20191*/5520/*B75D */,/*20192*/5520/*B75E */,/*20193*/5520/*B75F */,/*20194*/5519/* B760 */, /*20195*/5520/* B761 */,/*20196*/5520/*B762 */,/*20197*/5520/*B763 */,/*20198*/5520/*B764 */,/*20199*/5520/*B765 */, /*20200*/5520/*B766 */,/*20201*/5520/*B767 */,/*20202*/5520/*B768 */,/*20203*/5520/*B769 */,/*20204*/5520/*B76A */, /*20205*/5520/*B76B */,/*20206*/5520/*B76C */,/*20207*/5520/*B76D */,/*20208*/5520/*B76E */,/*20209*/5520/*B76F */, /*20210*/5520/*B770 */,/*20211*/5520/*B771 */,/*20212*/5520/*B772 */,/*20213*/5520/*B773 */,/*20214*/5520/*B774 */, /*20215*/5520/*B775 */,/*20216*/5520/*B776 */,/*20217*/5520/*B777 */,/*20218*/5520/*B778 */,/*20219*/5520/*B779 */, /*20220*/5520/*B77A */,/*20221*/5520/*B77B */,/*20222*/5519/* B77C */,/*20223*/5520/* B77D */,/*20224*/5520/*B77E */, /*20225*/5520/*B77F */,/*20226*/5520/*B780 */,/*20227*/5520/*B781 */,/*20228*/5520/*B782 */,/*20229*/5520/*B783 */, /*20230*/5520/*B784 */,/*20231*/5520/*B785 */,/*20232*/5520/*B786 */,/*20233*/5520/*B787 */,/*20234*/5520/*B788 */, /*20235*/5520/*B789 */,/*20236*/5520/*B78A */,/*20237*/5520/*B78B */,/*20238*/5520/*B78C */,/*20239*/5520/*B78D */, /*20240*/5520/*B78E */,/*20241*/5520/*B78F */,/*20242*/5520/*B790 */,/*20243*/5520/*B791 */,/*20244*/5520/*B792 */, /*20245*/5520/*B793 */,/*20246*/5520/*B794 */,/*20247*/5520/*B795 */,/*20248*/5520/*B796 */,/*20249*/5520/*B797 */, /*20250*/5519/* B798 */,/*20251*/5520/* B799 */,/*20252*/5520/*B79A */,/*20253*/5520/*B79B */,/*20254*/5520/*B79C */, /*20255*/5520/*B79D */,/*20256*/5520/*B79E */,/*20257*/5520/*B79F */,/*20258*/5520/*B7A0 */,/*20259*/5520/*B7A1 */, /*20260*/5520/*B7A2 */,/*20261*/5520/*B7A3 */,/*20262*/5520/*B7A4 */,/*20263*/5520/*B7A5 */,/*20264*/5520/*B7A6 */, /*20265*/5520/*B7A7 */,/*20266*/5520/*B7A8 */,/*20267*/5520/*B7A9 */,/*20268*/5520/*B7AA */,/*20269*/5520/*B7AB */, /*20270*/5520/*B7AC */,/*20271*/5520/*B7AD */,/*20272*/5520/*B7AE */,/*20273*/5520/*B7AF */,/*20274*/5520/*B7B0 */, /*20275*/5520/*B7B1 */,/*20276*/5520/*B7B2 */,/*20277*/5520/*B7B3 */,/*20278*/5519/* B7B4 */,/*20279*/5520/* B7B5 */, /*20280*/5520/*B7B6 */,/*20281*/5520/*B7B7 */,/*20282*/5520/*B7B8 */,/*20283*/5520/*B7B9 */,/*20284*/5520/*B7BA */, /*20285*/5520/*B7BB */,/*20286*/5520/*B7BC */,/*20287*/5520/*B7BD */,/*20288*/5520/*B7BE */,/*20289*/5520/*B7BF */, /*20290*/5520/*B7C0 */,/*20291*/5520/*B7C1 */,/*20292*/5520/*B7C2 */,/*20293*/5520/*B7C3 */,/*20294*/5520/*B7C4 */, /*20295*/5520/*B7C5 */,/*20296*/5520/*B7C6 */,/*20297*/5520/*B7C7 */,/*20298*/5520/*B7C8 */,/*20299*/5520/*B7C9 */, /*20300*/5520/*B7CA */,/*20301*/5520/*B7CB */,/*20302*/5520/*B7CC */,/*20303*/5520/*B7CD */,/*20304*/5520/*B7CE */, /*20305*/5520/*B7CF */,/*20306*/5519/* B7D0 */,/*20307*/5520/* B7D1 */,/*20308*/5520/*B7D2 */,/*20309*/5520/*B7D3 */, /*20310*/5520/*B7D4 */,/*20311*/5520/*B7D5 */,/*20312*/5520/*B7D6 */,/*20313*/5520/*B7D7 */,/*20314*/5520/*B7D8 */, /*20315*/5520/*B7D9 */,/*20316*/5520/*B7DA */,/*20317*/5520/*B7DB */,/*20318*/5520/*B7DC */,/*20319*/5520/*B7DD */, /*20320*/5520/*B7DE */,/*20321*/5520/*B7DF */,/*20322*/5520/*B7E0 */,/*20323*/5520/*B7E1 */,/*20324*/5520/*B7E2 */, /*20325*/5520/*B7E3 */,/*20326*/5520/*B7E4 */,/*20327*/5520/*B7E5 */,/*20328*/5520/*B7E6 */,/*20329*/5520/*B7E7 */, /*20330*/5520/*B7E8 */,/*20331*/5520/*B7E9 */,/*20332*/5520/*B7EA */,/*20333*/5520/*B7EB */,/*20334*/5519/* B7EC */, /*20335*/5520/* B7ED */,/*20336*/5520/*B7EE */,/*20337*/5520/*B7EF */,/*20338*/5520/*B7F0 */,/*20339*/5520/*B7F1 */, /*20340*/5520/*B7F2 */,/*20341*/5520/*B7F3 */,/*20342*/5520/*B7F4 */,/*20343*/5520/*B7F5 */,/*20344*/5520/*B7F6 */, /*20345*/5520/*B7F7 */,/*20346*/5520/*B7F8 */,/*20347*/5520/*B7F9 */,/*20348*/5520/*B7FA */,/*20349*/5520/*B7FB */, /*20350*/5520/*B7FC */,/*20351*/5520/*B7FD */,/*20352*/5520/*B7FE */,/*20353*/5520/*B7FF */,/*20354*/5520/*B800 */, /*20355*/5520/*B801 */,/*20356*/5520/*B802 */,/*20357*/5520/*B803 */,/*20358*/5520/*B804 */,/*20359*/5520/*B805 */, /*20360*/5520/*B806 */,/*20361*/5520/*B807 */,/*20362*/5519/* B808 */,/*20363*/5520/* B809 */,/*20364*/5520/*B80A */, /*20365*/5520/*B80B */,/*20366*/5520/*B80C */,/*20367*/5520/*B80D */,/*20368*/5520/*B80E */,/*20369*/5520/*B80F */, /*20370*/5520/*B810 */,/*20371*/5520/*B811 */,/*20372*/5520/*B812 */,/*20373*/5520/*B813 */,/*20374*/5520/*B814 */, /*20375*/5520/*B815 */,/*20376*/5520/*B816 */,/*20377*/5520/*B817 */,/*20378*/5520/*B818 */,/*20379*/5520/*B819 */, /*20380*/5520/*B81A */,/*20381*/5520/*B81B */,/*20382*/5520/*B81C */,/*20383*/5520/*B81D */,/*20384*/5520/*B81E */, /*20385*/5520/*B81F */,/*20386*/5520/*B820 */,/*20387*/5520/*B821 */,/*20388*/5520/*B822 */,/*20389*/5520/*B823 */, /*20390*/5519/* B824 */,/*20391*/5520/* B825 */,/*20392*/5520/*B826 */,/*20393*/5520/*B827 */,/*20394*/5520/*B828 */, /*20395*/5520/*B829 */,/*20396*/5520/*B82A */,/*20397*/5520/*B82B */,/*20398*/5520/*B82C */,/*20399*/5520/*B82D */, /*20400*/5520/*B82E */,/*20401*/5520/*B82F */,/*20402*/5520/*B830 */,/*20403*/5520/*B831 */,/*20404*/5520/*B832 */, /*20405*/5520/*B833 */,/*20406*/5520/*B834 */,/*20407*/5520/*B835 */,/*20408*/5520/*B836 */,/*20409*/5520/*B837 */, /*20410*/5520/*B838 */,/*20411*/5520/*B839 */,/*20412*/5520/*B83A */,/*20413*/5520/*B83B */,/*20414*/5520/*B83C */, /*20415*/5520/*B83D */,/*20416*/5520/*B83E */,/*20417*/5520/*B83F */,/*20418*/5519/* B840 */,/*20419*/5520/* B841 */, /*20420*/5520/*B842 */,/*20421*/5520/*B843 */,/*20422*/5520/*B844 */,/*20423*/5520/*B845 */,/*20424*/5520/*B846 */, /*20425*/5520/*B847 */,/*20426*/5520/*B848 */,/*20427*/5520/*B849 */,/*20428*/5520/*B84A */,/*20429*/5520/*B84B */, /*20430*/5520/*B84C */,/*20431*/5520/*B84D */,/*20432*/5520/*B84E */,/*20433*/5520/*B84F */,/*20434*/5520/*B850 */, /*20435*/5520/*B851 */,/*20436*/5520/*B852 */,/*20437*/5520/*B853 */,/*20438*/5520/*B854 */,/*20439*/5520/*B855 */, /*20440*/5520/*B856 */,/*20441*/5520/*B857 */,/*20442*/5520/*B858 */,/*20443*/5520/*B859 */,/*20444*/5520/*B85A */, /*20445*/5520/*B85B */,/*20446*/5519/* B85C */,/*20447*/5520/* B85D */,/*20448*/5520/*B85E */,/*20449*/5520/*B85F */, /*20450*/5520/*B860 */,/*20451*/5520/*B861 */,/*20452*/5520/*B862 */,/*20453*/5520/*B863 */,/*20454*/5520/*B864 */, /*20455*/5520/*B865 */,/*20456*/5520/*B866 */,/*20457*/5520/*B867 */,/*20458*/5520/*B868 */,/*20459*/5520/*B869 */, /*20460*/5520/*B86A */,/*20461*/5520/*B86B */,/*20462*/5520/*B86C */,/*20463*/5520/*B86D */,/*20464*/5520/*B86E */, /*20465*/5520/*B86F */,/*20466*/5520/*B870 */,/*20467*/5520/*B871 */,/*20468*/5520/*B872 */,/*20469*/5520/*B873 */, /*20470*/5520/*B874 */,/*20471*/5520/*B875 */,/*20472*/5520/*B876 */,/*20473*/5520/*B877 */,/*20474*/5519/* B878 */, /*20475*/5520/* B879 */,/*20476*/5520/*B87A */,/*20477*/5520/*B87B */,/*20478*/5520/*B87C */,/*20479*/5520/*B87D */, /*20480*/5520/*B87E */,/*20481*/5520/*B87F */,/*20482*/5520/*B880 */,/*20483*/5520/*B881 */,/*20484*/5520/*B882 */, /*20485*/5520/*B883 */,/*20486*/5520/*B884 */,/*20487*/5520/*B885 */,/*20488*/5520/*B886 */,/*20489*/5520/*B887 */, /*20490*/5520/*B888 */,/*20491*/5520/*B889 */,/*20492*/5520/*B88A */,/*20493*/5520/*B88B */,/*20494*/5520/*B88C */, /*20495*/5520/*B88D */,/*20496*/5520/*B88E */,/*20497*/5520/*B88F */,/*20498*/5520/*B890 */,/*20499*/5520/*B891 */, /*20500*/5520/*B892 */,/*20501*/5520/*B893 */,/*20502*/5519/* B894 */,/*20503*/5520/* B895 */,/*20504*/5520/*B896 */, /*20505*/5520/*B897 */,/*20506*/5520/*B898 */,/*20507*/5520/*B899 */,/*20508*/5520/*B89A */,/*20509*/5520/*B89B */, /*20510*/5520/*B89C */,/*20511*/5520/*B89D */,/*20512*/5520/*B89E */,/*20513*/5520/*B89F */,/*20514*/5520/*B8A0 */, /*20515*/5520/*B8A1 */,/*20516*/5520/*B8A2 */,/*20517*/5520/*B8A3 */,/*20518*/5520/*B8A4 */,/*20519*/5520/*B8A5 */, /*20520*/5520/*B8A6 */,/*20521*/5520/*B8A7 */,/*20522*/5520/*B8A8 */,/*20523*/5520/*B8A9 */,/*20524*/5520/*B8AA */, /*20525*/5520/*B8AB */,/*20526*/5520/*B8AC */,/*20527*/5520/*B8AD */,/*20528*/5520/*B8AE */,/*20529*/5520/*B8AF */, /*20530*/5519/* B8B0 */,/*20531*/5520/* B8B1 */,/*20532*/5520/*B8B2 */,/*20533*/5520/*B8B3 */,/*20534*/5520/*B8B4 */, /*20535*/5520/*B8B5 */,/*20536*/5520/*B8B6 */,/*20537*/5520/*B8B7 */,/*20538*/5520/*B8B8 */,/*20539*/5520/*B8B9 */, /*20540*/5520/*B8BA */,/*20541*/5520/*B8BB */,/*20542*/5520/*B8BC */,/*20543*/5520/*B8BD */,/*20544*/5520/*B8BE */, /*20545*/5520/*B8BF */,/*20546*/5520/*B8C0 */,/*20547*/5520/*B8C1 */,/*20548*/5520/*B8C2 */,/*20549*/5520/*B8C3 */, /*20550*/5520/*B8C4 */,/*20551*/5520/*B8C5 */,/*20552*/5520/*B8C6 */,/*20553*/5520/*B8C7 */,/*20554*/5520/*B8C8 */, /*20555*/5520/*B8C9 */,/*20556*/5520/*B8CA */,/*20557*/5520/*B8CB */,/*20558*/5519/* B8CC */,/*20559*/5520/* B8CD */, /*20560*/5520/*B8CE */,/*20561*/5520/*B8CF */,/*20562*/5520/*B8D0 */,/*20563*/5520/*B8D1 */,/*20564*/5520/*B8D2 */, /*20565*/5520/*B8D3 */,/*20566*/5520/*B8D4 */,/*20567*/5520/*B8D5 */,/*20568*/5520/*B8D6 */,/*20569*/5520/*B8D7 */, /*20570*/5520/*B8D8 */,/*20571*/5520/*B8D9 */,/*20572*/5520/*B8DA */,/*20573*/5520/*B8DB */,/*20574*/5520/*B8DC */, /*20575*/5520/*B8DD */,/*20576*/5520/*B8DE */,/*20577*/5520/*B8DF */,/*20578*/5520/*B8E0 */,/*20579*/5520/*B8E1 */, /*20580*/5520/*B8E2 */,/*20581*/5520/*B8E3 */,/*20582*/5520/*B8E4 */,/*20583*/5520/*B8E5 */,/*20584*/5520/*B8E6 */, /*20585*/5520/*B8E7 */,/*20586*/5519/* B8E8 */,/*20587*/5520/* B8E9 */,/*20588*/5520/*B8EA */,/*20589*/5520/*B8EB */, /*20590*/5520/*B8EC */,/*20591*/5520/*B8ED */,/*20592*/5520/*B8EE */,/*20593*/5520/*B8EF */,/*20594*/5520/*B8F0 */, /*20595*/5520/*B8F1 */,/*20596*/5520/*B8F2 */,/*20597*/5520/*B8F3 */,/*20598*/5520/*B8F4 */,/*20599*/5520/*B8F5 */, /*20600*/5520/*B8F6 */,/*20601*/5520/*B8F7 */,/*20602*/5520/*B8F8 */,/*20603*/5520/*B8F9 */,/*20604*/5520/*B8FA */, /*20605*/5520/*B8FB */,/*20606*/5520/*B8FC */,/*20607*/5520/*B8FD */,/*20608*/5520/*B8FE */,/*20609*/5520/*B8FF */, /*20610*/5520/*B900 */,/*20611*/5520/*B901 */,/*20612*/5520/*B902 */,/*20613*/5520/*B903 */,/*20614*/5519/* B904 */, /*20615*/5520/* B905 */,/*20616*/5520/*B906 */,/*20617*/5520/*B907 */,/*20618*/5520/*B908 */,/*20619*/5520/*B909 */, /*20620*/5520/*B90A */,/*20621*/5520/*B90B */,/*20622*/5520/*B90C */,/*20623*/5520/*B90D */,/*20624*/5520/*B90E */, /*20625*/5520/*B90F */,/*20626*/5520/*B910 */,/*20627*/5520/*B911 */,/*20628*/5520/*B912 */,/*20629*/5520/*B913 */, /*20630*/5520/*B914 */,/*20631*/5520/*B915 */,/*20632*/5520/*B916 */,/*20633*/5520/*B917 */,/*20634*/5520/*B918 */, /*20635*/5520/*B919 */,/*20636*/5520/*B91A */,/*20637*/5520/*B91B */,/*20638*/5520/*B91C */,/*20639*/5520/*B91D */, /*20640*/5520/*B91E */,/*20641*/5520/*B91F */,/*20642*/5519/* B920 */,/*20643*/5520/* B921 */,/*20644*/5520/*B922 */, /*20645*/5520/*B923 */,/*20646*/5520/*B924 */,/*20647*/5520/*B925 */,/*20648*/5520/*B926 */,/*20649*/5520/*B927 */, /*20650*/5520/*B928 */,/*20651*/5520/*B929 */,/*20652*/5520/*B92A */,/*20653*/5520/*B92B */,/*20654*/5520/*B92C */, /*20655*/5520/*B92D */,/*20656*/5520/*B92E */,/*20657*/5520/*B92F */,/*20658*/5520/*B930 */,/*20659*/5520/*B931 */, /*20660*/5520/*B932 */,/*20661*/5520/*B933 */,/*20662*/5520/*B934 */,/*20663*/5520/*B935 */,/*20664*/5520/*B936 */, /*20665*/5520/*B937 */,/*20666*/5520/*B938 */,/*20667*/5520/*B939 */,/*20668*/5520/*B93A */,/*20669*/5520/*B93B */, /*20670*/5519/* B93C */,/*20671*/5520/* B93D */,/*20672*/5520/*B93E */,/*20673*/5520/*B93F */,/*20674*/5520/*B940 */, /*20675*/5520/*B941 */,/*20676*/5520/*B942 */,/*20677*/5520/*B943 */,/*20678*/5520/*B944 */,/*20679*/5520/*B945 */, /*20680*/5520/*B946 */,/*20681*/5520/*B947 */,/*20682*/5520/*B948 */,/*20683*/5520/*B949 */,/*20684*/5520/*B94A */, /*20685*/5520/*B94B */,/*20686*/5520/*B94C */,/*20687*/5520/*B94D */,/*20688*/5520/*B94E */,/*20689*/5520/*B94F */, /*20690*/5520/*B950 */,/*20691*/5520/*B951 */,/*20692*/5520/*B952 */,/*20693*/5520/*B953 */,/*20694*/5520/*B954 */, /*20695*/5520/*B955 */,/*20696*/5520/*B956 */,/*20697*/5520/*B957 */,/*20698*/5519/* B958 */,/*20699*/5520/* B959 */, /*20700*/5520/*B95A */,/*20701*/5520/*B95B */,/*20702*/5520/*B95C */,/*20703*/5520/*B95D */,/*20704*/5520/*B95E */, /*20705*/5520/*B95F */,/*20706*/5520/*B960 */,/*20707*/5520/*B961 */,/*20708*/5520/*B962 */,/*20709*/5520/*B963 */, /*20710*/5520/*B964 */,/*20711*/5520/*B965 */,/*20712*/5520/*B966 */,/*20713*/5520/*B967 */,/*20714*/5520/*B968 */, /*20715*/5520/*B969 */,/*20716*/5520/*B96A */,/*20717*/5520/*B96B */,/*20718*/5520/*B96C */,/*20719*/5520/*B96D */, /*20720*/5520/*B96E */,/*20721*/5520/*B96F */,/*20722*/5520/*B970 */,/*20723*/5520/*B971 */,/*20724*/5520/*B972 */, /*20725*/5520/*B973 */,/*20726*/5519/* B974 */,/*20727*/5520/* B975 */,/*20728*/5520/*B976 */,/*20729*/5520/*B977 */, /*20730*/5520/*B978 */,/*20731*/5520/*B979 */,/*20732*/5520/*B97A */,/*20733*/5520/*B97B */,/*20734*/5520/*B97C */, /*20735*/5520/*B97D */,/*20736*/5520/*B97E */,/*20737*/5520/*B97F */,/*20738*/5520/*B980 */,/*20739*/5520/*B981 */, /*20740*/5520/*B982 */,/*20741*/5520/*B983 */,/*20742*/5520/*B984 */,/*20743*/5520/*B985 */,/*20744*/5520/*B986 */, /*20745*/5520/*B987 */,/*20746*/5520/*B988 */,/*20747*/5520/*B989 */,/*20748*/5520/*B98A */,/*20749*/5520/*B98B */, /*20750*/5520/*B98C */,/*20751*/5520/*B98D */,/*20752*/5520/*B98E */,/*20753*/5520/*B98F */,/*20754*/5519/* B990 */, /*20755*/5520/* B991 */,/*20756*/5520/*B992 */,/*20757*/5520/*B993 */,/*20758*/5520/*B994 */,/*20759*/5520/*B995 */, /*20760*/5520/*B996 */,/*20761*/5520/*B997 */,/*20762*/5520/*B998 */,/*20763*/5520/*B999 */,/*20764*/5520/*B99A */, /*20765*/5520/*B99B */,/*20766*/5520/*B99C */,/*20767*/5520/*B99D */,/*20768*/5520/*B99E */,/*20769*/5520/*B99F */, /*20770*/5520/*B9A0 */,/*20771*/5520/*B9A1 */,/*20772*/5520/*B9A2 */,/*20773*/5520/*B9A3 */,/*20774*/5520/*B9A4 */, /*20775*/5520/*B9A5 */,/*20776*/5520/*B9A6 */,/*20777*/5520/*B9A7 */,/*20778*/5520/*B9A8 */,/*20779*/5520/*B9A9 */, /*20780*/5520/*B9AA */,/*20781*/5520/*B9AB */,/*20782*/5519/* B9AC */,/*20783*/5520/* B9AD */,/*20784*/5520/*B9AE */, /*20785*/5520/*B9AF */,/*20786*/5520/*B9B0 */,/*20787*/5520/*B9B1 */,/*20788*/5520/*B9B2 */,/*20789*/5520/*B9B3 */, /*20790*/5520/*B9B4 */,/*20791*/5520/*B9B5 */,/*20792*/5520/*B9B6 */,/*20793*/5520/*B9B7 */,/*20794*/5520/*B9B8 */, /*20795*/5520/*B9B9 */,/*20796*/5520/*B9BA */,/*20797*/5520/*B9BB */,/*20798*/5520/*B9BC */,/*20799*/5520/*B9BD */, /*20800*/5520/*B9BE */,/*20801*/5520/*B9BF */,/*20802*/5520/*B9C0 */,/*20803*/5520/*B9C1 */,/*20804*/5520/*B9C2 */, /*20805*/5520/*B9C3 */,/*20806*/5520/*B9C4 */,/*20807*/5520/*B9C5 */,/*20808*/5520/*B9C6 */,/*20809*/5520/*B9C7 */, /*20810*/5519/* B9C8 */,/*20811*/5520/* B9C9 */,/*20812*/5520/*B9CA */,/*20813*/5520/*B9CB */,/*20814*/5520/*B9CC */, /*20815*/5520/*B9CD */,/*20816*/5520/*B9CE */,/*20817*/5520/*B9CF */,/*20818*/5520/*B9D0 */,/*20819*/5520/*B9D1 */, /*20820*/5520/*B9D2 */,/*20821*/5520/*B9D3 */,/*20822*/5520/*B9D4 */,/*20823*/5520/*B9D5 */,/*20824*/5520/*B9D6 */, /*20825*/5520/*B9D7 */,/*20826*/5520/*B9D8 */,/*20827*/5520/*B9D9 */,/*20828*/5520/*B9DA */,/*20829*/5520/*B9DB */, /*20830*/5520/*B9DC */,/*20831*/5520/*B9DD */,/*20832*/5520/*B9DE */,/*20833*/5520/*B9DF */,/*20834*/5520/*B9E0 */, /*20835*/5520/*B9E1 */,/*20836*/5520/*B9E2 */,/*20837*/5520/*B9E3 */,/*20838*/5519/* B9E4 */,/*20839*/5520/* B9E5 */, /*20840*/5520/*B9E6 */,/*20841*/5520/*B9E7 */,/*20842*/5520/*B9E8 */,/*20843*/5520/*B9E9 */,/*20844*/5520/*B9EA */, /*20845*/5520/*B9EB */,/*20846*/5520/*B9EC */,/*20847*/5520/*B9ED */,/*20848*/5520/*B9EE */,/*20849*/5520/*B9EF */, /*20850*/5520/*B9F0 */,/*20851*/5520/*B9F1 */,/*20852*/5520/*B9F2 */,/*20853*/5520/*B9F3 */,/*20854*/5520/*B9F4 */, /*20855*/5520/*B9F5 */,/*20856*/5520/*B9F6 */,/*20857*/5520/*B9F7 */,/*20858*/5520/*B9F8 */,/*20859*/5520/*B9F9 */, /*20860*/5520/*B9FA */,/*20861*/5520/*B9FB */,/*20862*/5520/*B9FC */,/*20863*/5520/*B9FD */,/*20864*/5520/*B9FE */, /*20865*/5520/*B9FF */,/*20866*/5519/* BA00 */,/*20867*/5520/* BA01 */,/*20868*/5520/*BA02 */,/*20869*/5520/*BA03 */, /*20870*/5520/*BA04 */,/*20871*/5520/*BA05 */,/*20872*/5520/*BA06 */,/*20873*/5520/*BA07 */,/*20874*/5520/*BA08 */, /*20875*/5520/*BA09 */,/*20876*/5520/*BA0A */,/*20877*/5520/*BA0B */,/*20878*/5520/*BA0C */,/*20879*/5520/*BA0D */, /*20880*/5520/*BA0E */,/*20881*/5520/*BA0F */,/*20882*/5520/*BA10 */,/*20883*/5520/*BA11 */,/*20884*/5520/*BA12 */, /*20885*/5520/*BA13 */,/*20886*/5520/*BA14 */,/*20887*/5520/*BA15 */,/*20888*/5520/*BA16 */,/*20889*/5520/*BA17 */, /*20890*/5520/*BA18 */,/*20891*/5520/*BA19 */,/*20892*/5520/*BA1A */,/*20893*/5520/*BA1B */,/*20894*/5519/* BA1C */, /*20895*/5520/* BA1D */,/*20896*/5520/*BA1E */,/*20897*/5520/*BA1F */,/*20898*/5520/*BA20 */,/*20899*/5520/*BA21 */, /*20900*/5520/*BA22 */,/*20901*/5520/*BA23 */,/*20902*/5520/*BA24 */,/*20903*/5520/*BA25 */,/*20904*/5520/*BA26 */, /*20905*/5520/*BA27 */,/*20906*/5520/*BA28 */,/*20907*/5520/*BA29 */,/*20908*/5520/*BA2A */,/*20909*/5520/*BA2B */, /*20910*/5520/*BA2C */,/*20911*/5520/*BA2D */,/*20912*/5520/*BA2E */,/*20913*/5520/*BA2F */,/*20914*/5520/*BA30 */, /*20915*/5520/*BA31 */,/*20916*/5520/*BA32 */,/*20917*/5520/*BA33 */,/*20918*/5520/*BA34 */,/*20919*/5520/*BA35 */, /*20920*/5520/*BA36 */,/*20921*/5520/*BA37 */,/*20922*/5519/* BA38 */,/*20923*/5520/* BA39 */,/*20924*/5520/*BA3A */, /*20925*/5520/*BA3B */,/*20926*/5520/*BA3C */,/*20927*/5520/*BA3D */,/*20928*/5520/*BA3E */,/*20929*/5520/*BA3F */, /*20930*/5520/*BA40 */,/*20931*/5520/*BA41 */,/*20932*/5520/*BA42 */,/*20933*/5520/*BA43 */,/*20934*/5520/*BA44 */, /*20935*/5520/*BA45 */,/*20936*/5520/*BA46 */,/*20937*/5520/*BA47 */,/*20938*/5520/*BA48 */,/*20939*/5520/*BA49 */, /*20940*/5520/*BA4A */,/*20941*/5520/*BA4B */,/*20942*/5520/*BA4C */,/*20943*/5520/*BA4D */,/*20944*/5520/*BA4E */, /*20945*/5520/*BA4F */,/*20946*/5520/*BA50 */,/*20947*/5520/*BA51 */,/*20948*/5520/*BA52 */,/*20949*/5520/*BA53 */, /*20950*/5519/* BA54 */,/*20951*/5520/* BA55 */,/*20952*/5520/*BA56 */,/*20953*/5520/*BA57 */,/*20954*/5520/*BA58 */, /*20955*/5520/*BA59 */,/*20956*/5520/*BA5A */,/*20957*/5520/*BA5B */,/*20958*/5520/*BA5C */,/*20959*/5520/*BA5D */, /*20960*/5520/*BA5E */,/*20961*/5520/*BA5F */,/*20962*/5520/*BA60 */,/*20963*/5520/*BA61 */,/*20964*/5520/*BA62 */, /*20965*/5520/*BA63 */,/*20966*/5520/*BA64 */,/*20967*/5520/*BA65 */,/*20968*/5520/*BA66 */,/*20969*/5520/*BA67 */, /*20970*/5520/*BA68 */,/*20971*/5520/*BA69 */,/*20972*/5520/*BA6A */,/*20973*/5520/*BA6B */,/*20974*/5520/*BA6C */, /*20975*/5520/*BA6D */,/*20976*/5520/*BA6E */,/*20977*/5520/*BA6F */,/*20978*/5519/* BA70 */,/*20979*/5520/* BA71 */, /*20980*/5520/*BA72 */,/*20981*/5520/*BA73 */,/*20982*/5520/*BA74 */,/*20983*/5520/*BA75 */,/*20984*/5520/*BA76 */, /*20985*/5520/*BA77 */,/*20986*/5520/*BA78 */,/*20987*/5520/*BA79 */,/*20988*/5520/*BA7A */,/*20989*/5520/*BA7B */, /*20990*/5520/*BA7C */,/*20991*/5520/*BA7D */,/*20992*/5520/*BA7E */,/*20993*/5520/*BA7F */,/*20994*/5520/*BA80 */, /*20995*/5520/*BA81 */,/*20996*/5520/*BA82 */,/*20997*/5520/*BA83 */,/*20998*/5520/*BA84 */,/*20999*/5520/*BA85 */, /*21000*/5520/*BA86 */,/*21001*/5520/*BA87 */,/*21002*/5520/*BA88 */,/*21003*/5520/*BA89 */,/*21004*/5520/*BA8A */, /*21005*/5520/*BA8B */,/*21006*/5519/* BA8C */,/*21007*/5520/* BA8D */,/*21008*/5520/*BA8E */,/*21009*/5520/*BA8F */, /*21010*/5520/*BA90 */,/*21011*/5520/*BA91 */,/*21012*/5520/*BA92 */,/*21013*/5520/*BA93 */,/*21014*/5520/*BA94 */, /*21015*/5520/*BA95 */,/*21016*/5520/*BA96 */,/*21017*/5520/*BA97 */,/*21018*/5520/*BA98 */,/*21019*/5520/*BA99 */, /*21020*/5520/*BA9A */,/*21021*/5520/*BA9B */,/*21022*/5520/*BA9C */,/*21023*/5520/*BA9D */,/*21024*/5520/*BA9E */, /*21025*/5520/*BA9F */,/*21026*/5520/*BAA0 */,/*21027*/5520/*BAA1 */,/*21028*/5520/*BAA2 */,/*21029*/5520/*BAA3 */, /*21030*/5520/*BAA4 */,/*21031*/5520/*BAA5 */,/*21032*/5520/*BAA6 */,/*21033*/5520/*BAA7 */,/*21034*/5519/* BAA8 */, /*21035*/5520/* BAA9 */,/*21036*/5520/*BAAA */,/*21037*/5520/*BAAB */,/*21038*/5520/*BAAC */,/*21039*/5520/*BAAD */, /*21040*/5520/*BAAE */,/*21041*/5520/*BAAF */,/*21042*/5520/*BAB0 */,/*21043*/5520/*BAB1 */,/*21044*/5520/*BAB2 */, /*21045*/5520/*BAB3 */,/*21046*/5520/*BAB4 */,/*21047*/5520/*BAB5 */,/*21048*/5520/*BAB6 */,/*21049*/5520/*BAB7 */, /*21050*/5520/*BAB8 */,/*21051*/5520/*BAB9 */,/*21052*/5520/*BABA */,/*21053*/5520/*BABB */,/*21054*/5520/*BABC */, /*21055*/5520/*BABD */,/*21056*/5520/*BABE */,/*21057*/5520/*BABF */,/*21058*/5520/*BAC0 */,/*21059*/5520/*BAC1 */, /*21060*/5520/*BAC2 */,/*21061*/5520/*BAC3 */,/*21062*/5519/* BAC4 */,/*21063*/5520/* BAC5 */,/*21064*/5520/*BAC6 */, /*21065*/5520/*BAC7 */,/*21066*/5520/*BAC8 */,/*21067*/5520/*BAC9 */,/*21068*/5520/*BACA */,/*21069*/5520/*BACB */, /*21070*/5520/*BACC */,/*21071*/5520/*BACD */,/*21072*/5520/*BACE */,/*21073*/5520/*BACF */,/*21074*/5520/*BAD0 */, /*21075*/5520/*BAD1 */,/*21076*/5520/*BAD2 */,/*21077*/5520/*BAD3 */,/*21078*/5520/*BAD4 */,/*21079*/5520/*BAD5 */, /*21080*/5520/*BAD6 */,/*21081*/5520/*BAD7 */,/*21082*/5520/*BAD8 */,/*21083*/5520/*BAD9 */,/*21084*/5520/*BADA */, /*21085*/5520/*BADB */,/*21086*/5520/*BADC */,/*21087*/5520/*BADD */,/*21088*/5520/*BADE */,/*21089*/5520/*BADF */, /*21090*/5519/* BAE0 */,/*21091*/5520/* BAE1 */,/*21092*/5520/*BAE2 */,/*21093*/5520/*BAE3 */,/*21094*/5520/*BAE4 */, /*21095*/5520/*BAE5 */,/*21096*/5520/*BAE6 */,/*21097*/5520/*BAE7 */,/*21098*/5520/*BAE8 */,/*21099*/5520/*BAE9 */, /*21100*/5520/*BAEA */,/*21101*/5520/*BAEB */,/*21102*/5520/*BAEC */,/*21103*/5520/*BAED */,/*21104*/5520/*BAEE */, /*21105*/5520/*BAEF */,/*21106*/5520/*BAF0 */,/*21107*/5520/*BAF1 */,/*21108*/5520/*BAF2 */,/*21109*/5520/*BAF3 */, /*21110*/5520/*BAF4 */,/*21111*/5520/*BAF5 */,/*21112*/5520/*BAF6 */,/*21113*/5520/*BAF7 */,/*21114*/5520/*BAF8 */, /*21115*/5520/*BAF9 */,/*21116*/5520/*BAFA */,/*21117*/5520/*BAFB */,/*21118*/5519/* BAFC */,/*21119*/5520/* BAFD */, /*21120*/5520/*BAFE */,/*21121*/5520/*BAFF */,/*21122*/5520/*BB00 */,/*21123*/5520/*BB01 */,/*21124*/5520/*BB02 */, /*21125*/5520/*BB03 */,/*21126*/5520/*BB04 */,/*21127*/5520/*BB05 */,/*21128*/5520/*BB06 */,/*21129*/5520/*BB07 */, /*21130*/5520/*BB08 */,/*21131*/5520/*BB09 */,/*21132*/5520/*BB0A */,/*21133*/5520/*BB0B */,/*21134*/5520/*BB0C */, /*21135*/5520/*BB0D */,/*21136*/5520/*BB0E */,/*21137*/5520/*BB0F */,/*21138*/5520/*BB10 */,/*21139*/5520/*BB11 */, /*21140*/5520/*BB12 */,/*21141*/5520/*BB13 */,/*21142*/5520/*BB14 */,/*21143*/5520/*BB15 */,/*21144*/5520/*BB16 */, /*21145*/5520/*BB17 */,/*21146*/5519/* BB18 */,/*21147*/5520/* BB19 */,/*21148*/5520/*BB1A */,/*21149*/5520/*BB1B */, /*21150*/5520/*BB1C */,/*21151*/5520/*BB1D */,/*21152*/5520/*BB1E */,/*21153*/5520/*BB1F */,/*21154*/5520/*BB20 */, /*21155*/5520/*BB21 */,/*21156*/5520/*BB22 */,/*21157*/5520/*BB23 */,/*21158*/5520/*BB24 */,/*21159*/5520/*BB25 */, /*21160*/5520/*BB26 */,/*21161*/5520/*BB27 */,/*21162*/5520/*BB28 */,/*21163*/5520/*BB29 */,/*21164*/5520/*BB2A */, /*21165*/5520/*BB2B */,/*21166*/5520/*BB2C */,/*21167*/5520/*BB2D */,/*21168*/5520/*BB2E */,/*21169*/5520/*BB2F */, /*21170*/5520/*BB30 */,/*21171*/5520/*BB31 */,/*21172*/5520/*BB32 */,/*21173*/5520/*BB33 */,/*21174*/5519/* BB34 */, /*21175*/5520/* BB35 */,/*21176*/5520/*BB36 */,/*21177*/5520/*BB37 */,/*21178*/5520/*BB38 */,/*21179*/5520/*BB39 */, /*21180*/5520/*BB3A */,/*21181*/5520/*BB3B */,/*21182*/5520/*BB3C */,/*21183*/5520/*BB3D */,/*21184*/5520/*BB3E */, /*21185*/5520/*BB3F */,/*21186*/5520/*BB40 */,/*21187*/5520/*BB41 */,/*21188*/5520/*BB42 */,/*21189*/5520/*BB43 */, /*21190*/5520/*BB44 */,/*21191*/5520/*BB45 */,/*21192*/5520/*BB46 */,/*21193*/5520/*BB47 */,/*21194*/5520/*BB48 */, /*21195*/5520/*BB49 */,/*21196*/5520/*BB4A */,/*21197*/5520/*BB4B */,/*21198*/5520/*BB4C */,/*21199*/5520/*BB4D */, /*21200*/5520/*BB4E */,/*21201*/5520/*BB4F */,/*21202*/5519/* BB50 */,/*21203*/5520/* BB51 */,/*21204*/5520/*BB52 */, /*21205*/5520/*BB53 */,/*21206*/5520/*BB54 */,/*21207*/5520/*BB55 */,/*21208*/5520/*BB56 */,/*21209*/5520/*BB57 */, /*21210*/5520/*BB58 */,/*21211*/5520/*BB59 */,/*21212*/5520/*BB5A */,/*21213*/5520/*BB5B */,/*21214*/5520/*BB5C */, /*21215*/5520/*BB5D */,/*21216*/5520/*BB5E */,/*21217*/5520/*BB5F */,/*21218*/5520/*BB60 */,/*21219*/5520/*BB61 */, /*21220*/5520/*BB62 */,/*21221*/5520/*BB63 */,/*21222*/5520/*BB64 */,/*21223*/5520/*BB65 */,/*21224*/5520/*BB66 */, /*21225*/5520/*BB67 */,/*21226*/5520/*BB68 */,/*21227*/5520/*BB69 */,/*21228*/5520/*BB6A */,/*21229*/5520/*BB6B */, /*21230*/5519/* BB6C */,/*21231*/5520/* BB6D */,/*21232*/5520/*BB6E */,/*21233*/5520/*BB6F */,/*21234*/5520/*BB70 */, /*21235*/5520/*BB71 */,/*21236*/5520/*BB72 */,/*21237*/5520/*BB73 */,/*21238*/5520/*BB74 */,/*21239*/5520/*BB75 */, /*21240*/5520/*BB76 */,/*21241*/5520/*BB77 */,/*21242*/5520/*BB78 */,/*21243*/5520/*BB79 */,/*21244*/5520/*BB7A */, /*21245*/5520/*BB7B */,/*21246*/5520/*BB7C */,/*21247*/5520/*BB7D */,/*21248*/5520/*BB7E */,/*21249*/5520/*BB7F */, /*21250*/5520/*BB80 */,/*21251*/5520/*BB81 */,/*21252*/5520/*BB82 */,/*21253*/5520/*BB83 */,/*21254*/5520/*BB84 */, /*21255*/5520/*BB85 */,/*21256*/5520/*BB86 */,/*21257*/5520/*BB87 */,/*21258*/5519/* BB88 */,/*21259*/5520/* BB89 */, /*21260*/5520/*BB8A */,/*21261*/5520/*BB8B */,/*21262*/5520/*BB8C */,/*21263*/5520/*BB8D */,/*21264*/5520/*BB8E */, /*21265*/5520/*BB8F */,/*21266*/5520/*BB90 */,/*21267*/5520/*BB91 */,/*21268*/5520/*BB92 */,/*21269*/5520/*BB93 */, /*21270*/5520/*BB94 */,/*21271*/5520/*BB95 */,/*21272*/5520/*BB96 */,/*21273*/5520/*BB97 */,/*21274*/5520/*BB98 */, /*21275*/5520/*BB99 */,/*21276*/5520/*BB9A */,/*21277*/5520/*BB9B */,/*21278*/5520/*BB9C */,/*21279*/5520/*BB9D */, /*21280*/5520/*BB9E */,/*21281*/5520/*BB9F */,/*21282*/5520/*BBA0 */,/*21283*/5520/*BBA1 */,/*21284*/5520/*BBA2 */, /*21285*/5520/*BBA3 */,/*21286*/5519/* BBA4 */,/*21287*/5520/* BBA5 */,/*21288*/5520/*BBA6 */,/*21289*/5520/*BBA7 */, /*21290*/5520/*BBA8 */,/*21291*/5520/*BBA9 */,/*21292*/5520/*BBAA */,/*21293*/5520/*BBAB */,/*21294*/5520/*BBAC */, /*21295*/5520/*BBAD */,/*21296*/5520/*BBAE */,/*21297*/5520/*BBAF */,/*21298*/5520/*BBB0 */,/*21299*/5520/*BBB1 */, /*21300*/5520/*BBB2 */,/*21301*/5520/*BBB3 */,/*21302*/5520/*BBB4 */,/*21303*/5520/*BBB5 */,/*21304*/5520/*BBB6 */, /*21305*/5520/*BBB7 */,/*21306*/5520/*BBB8 */,/*21307*/5520/*BBB9 */,/*21308*/5520/*BBBA */,/*21309*/5520/*BBBB */, /*21310*/5520/*BBBC */,/*21311*/5520/*BBBD */,/*21312*/5520/*BBBE */,/*21313*/5520/*BBBF */,/*21314*/5519/* BBC0 */, /*21315*/5520/* BBC1 */,/*21316*/5520/*BBC2 */,/*21317*/5520/*BBC3 */,/*21318*/5520/*BBC4 */,/*21319*/5520/*BBC5 */, /*21320*/5520/*BBC6 */,/*21321*/5520/*BBC7 */,/*21322*/5520/*BBC8 */,/*21323*/5520/*BBC9 */,/*21324*/5520/*BBCA */, /*21325*/5520/*BBCB */,/*21326*/5520/*BBCC */,/*21327*/5520/*BBCD */,/*21328*/5520/*BBCE */,/*21329*/5520/*BBCF */, /*21330*/5520/*BBD0 */,/*21331*/5520/*BBD1 */,/*21332*/5520/*BBD2 */,/*21333*/5520/*BBD3 */,/*21334*/5520/*BBD4 */, /*21335*/5520/*BBD5 */,/*21336*/5520/*BBD6 */,/*21337*/5520/*BBD7 */,/*21338*/5520/*BBD8 */,/*21339*/5520/*BBD9 */, /*21340*/5520/*BBDA */,/*21341*/5520/*BBDB */,/*21342*/5519/* BBDC */,/*21343*/5520/* BBDD */,/*21344*/5520/*BBDE */, /*21345*/5520/*BBDF */,/*21346*/5520/*BBE0 */,/*21347*/5520/*BBE1 */,/*21348*/5520/*BBE2 */,/*21349*/5520/*BBE3 */, /*21350*/5520/*BBE4 */,/*21351*/5520/*BBE5 */,/*21352*/5520/*BBE6 */,/*21353*/5520/*BBE7 */,/*21354*/5520/*BBE8 */, /*21355*/5520/*BBE9 */,/*21356*/5520/*BBEA */,/*21357*/5520/*BBEB */,/*21358*/5520/*BBEC */,/*21359*/5520/*BBED */, /*21360*/5520/*BBEE */,/*21361*/5520/*BBEF */,/*21362*/5520/*BBF0 */,/*21363*/5520/*BBF1 */,/*21364*/5520/*BBF2 */, /*21365*/5520/*BBF3 */,/*21366*/5520/*BBF4 */,/*21367*/5520/*BBF5 */,/*21368*/5520/*BBF6 */,/*21369*/5520/*BBF7 */, /*21370*/5519/* BBF8 */,/*21371*/5520/* BBF9 */,/*21372*/5520/*BBFA */,/*21373*/5520/*BBFB */,/*21374*/5520/*BBFC */, /*21375*/5520/*BBFD */,/*21376*/5520/*BBFE */,/*21377*/5520/*BBFF */,/*21378*/5520/*BC00 */,/*21379*/5520/*BC01 */, /*21380*/5520/*BC02 */,/*21381*/5520/*BC03 */,/*21382*/5520/*BC04 */,/*21383*/5520/*BC05 */,/*21384*/5520/*BC06 */, /*21385*/5520/*BC07 */,/*21386*/5520/*BC08 */,/*21387*/5520/*BC09 */,/*21388*/5520/*BC0A */,/*21389*/5520/*BC0B */, /*21390*/5520/*BC0C */,/*21391*/5520/*BC0D */,/*21392*/5520/*BC0E */,/*21393*/5520/*BC0F */,/*21394*/5520/*BC10 */, /*21395*/5520/*BC11 */,/*21396*/5520/*BC12 */,/*21397*/5520/*BC13 */,/*21398*/5519/* BC14 */,/*21399*/5520/* BC15 */, /*21400*/5520/*BC16 */,/*21401*/5520/*BC17 */,/*21402*/5520/*BC18 */,/*21403*/5520/*BC19 */,/*21404*/5520/*BC1A */, /*21405*/5520/*BC1B */,/*21406*/5520/*BC1C */,/*21407*/5520/*BC1D */,/*21408*/5520/*BC1E */,/*21409*/5520/*BC1F */, /*21410*/5520/*BC20 */,/*21411*/5520/*BC21 */,/*21412*/5520/*BC22 */,/*21413*/5520/*BC23 */,/*21414*/5520/*BC24 */, /*21415*/5520/*BC25 */,/*21416*/5520/*BC26 */,/*21417*/5520/*BC27 */,/*21418*/5520/*BC28 */,/*21419*/5520/*BC29 */, /*21420*/5520/*BC2A */,/*21421*/5520/*BC2B */,/*21422*/5520/*BC2C */,/*21423*/5520/*BC2D */,/*21424*/5520/*BC2E */, /*21425*/5520/*BC2F */,/*21426*/5519/* BC30 */,/*21427*/5520/* BC31 */,/*21428*/5520/*BC32 */,/*21429*/5520/*BC33 */, /*21430*/5520/*BC34 */,/*21431*/5520/*BC35 */,/*21432*/5520/*BC36 */,/*21433*/5520/*BC37 */,/*21434*/5520/*BC38 */, /*21435*/5520/*BC39 */,/*21436*/5520/*BC3A */,/*21437*/5520/*BC3B */,/*21438*/5520/*BC3C */,/*21439*/5520/*BC3D */, /*21440*/5520/*BC3E */,/*21441*/5520/*BC3F */,/*21442*/5520/*BC40 */,/*21443*/5520/*BC41 */,/*21444*/5520/*BC42 */, /*21445*/5520/*BC43 */,/*21446*/5520/*BC44 */,/*21447*/5520/*BC45 */,/*21448*/5520/*BC46 */,/*21449*/5520/*BC47 */, /*21450*/5520/*BC48 */,/*21451*/5520/*BC49 */,/*21452*/5520/*BC4A */,/*21453*/5520/*BC4B */,/*21454*/5519/* BC4C */, /*21455*/5520/* BC4D */,/*21456*/5520/*BC4E */,/*21457*/5520/*BC4F */,/*21458*/5520/*BC50 */,/*21459*/5520/*BC51 */, /*21460*/5520/*BC52 */,/*21461*/5520/*BC53 */,/*21462*/5520/*BC54 */,/*21463*/5520/*BC55 */,/*21464*/5520/*BC56 */, /*21465*/5520/*BC57 */,/*21466*/5520/*BC58 */,/*21467*/5520/*BC59 */,/*21468*/5520/*BC5A */,/*21469*/5520/*BC5B */, /*21470*/5520/*BC5C */,/*21471*/5520/*BC5D */,/*21472*/5520/*BC5E */,/*21473*/5520/*BC5F */,/*21474*/5520/*BC60 */, /*21475*/5520/*BC61 */,/*21476*/5520/*BC62 */,/*21477*/5520/*BC63 */,/*21478*/5520/*BC64 */,/*21479*/5520/*BC65 */, /*21480*/5520/*BC66 */,/*21481*/5520/*BC67 */,/*21482*/5519/* BC68 */,/*21483*/5520/* BC69 */,/*21484*/5520/*BC6A */, /*21485*/5520/*BC6B */,/*21486*/5520/*BC6C */,/*21487*/5520/*BC6D */,/*21488*/5520/*BC6E */,/*21489*/5520/*BC6F */, /*21490*/5520/*BC70 */,/*21491*/5520/*BC71 */,/*21492*/5520/*BC72 */,/*21493*/5520/*BC73 */,/*21494*/5520/*BC74 */, /*21495*/5520/*BC75 */,/*21496*/5520/*BC76 */,/*21497*/5520/*BC77 */,/*21498*/5520/*BC78 */,/*21499*/5520/*BC79 */, /*21500*/5520/*BC7A */,/*21501*/5520/*BC7B */,/*21502*/5520/*BC7C */,/*21503*/5520/*BC7D */,/*21504*/5520/*BC7E */, /*21505*/5520/*BC7F */,/*21506*/5520/*BC80 */,/*21507*/5520/*BC81 */,/*21508*/5520/*BC82 */,/*21509*/5520/*BC83 */, /*21510*/5519/* BC84 */,/*21511*/5520/* BC85 */,/*21512*/5520/*BC86 */,/*21513*/5520/*BC87 */,/*21514*/5520/*BC88 */, /*21515*/5520/*BC89 */,/*21516*/5520/*BC8A */,/*21517*/5520/*BC8B */,/*21518*/5520/*BC8C */,/*21519*/5520/*BC8D */, /*21520*/5520/*BC8E */,/*21521*/5520/*BC8F */,/*21522*/5520/*BC90 */,/*21523*/5520/*BC91 */,/*21524*/5520/*BC92 */, /*21525*/5520/*BC93 */,/*21526*/5520/*BC94 */,/*21527*/5520/*BC95 */,/*21528*/5520/*BC96 */,/*21529*/5520/*BC97 */, /*21530*/5520/*BC98 */,/*21531*/5520/*BC99 */,/*21532*/5520/*BC9A */,/*21533*/5520/*BC9B */,/*21534*/5520/*BC9C */, /*21535*/5520/*BC9D */,/*21536*/5520/*BC9E */,/*21537*/5520/*BC9F */,/*21538*/5519/* BCA0 */,/*21539*/5520/* BCA1 */, /*21540*/5520/*BCA2 */,/*21541*/5520/*BCA3 */,/*21542*/5520/*BCA4 */,/*21543*/5520/*BCA5 */,/*21544*/5520/*BCA6 */, /*21545*/5520/*BCA7 */,/*21546*/5520/*BCA8 */,/*21547*/5520/*BCA9 */,/*21548*/5520/*BCAA */,/*21549*/5520/*BCAB */, /*21550*/5520/*BCAC */,/*21551*/5520/*BCAD */,/*21552*/5520/*BCAE */,/*21553*/5520/*BCAF */,/*21554*/5520/*BCB0 */, /*21555*/5520/*BCB1 */,/*21556*/5520/*BCB2 */,/*21557*/5520/*BCB3 */,/*21558*/5520/*BCB4 */,/*21559*/5520/*BCB5 */, /*21560*/5520/*BCB6 */,/*21561*/5520/*BCB7 */,/*21562*/5520/*BCB8 */,/*21563*/5520/*BCB9 */,/*21564*/5520/*BCBA */, /*21565*/5520/*BCBB */,/*21566*/5519/* BCBC */,/*21567*/5520/* BCBD */,/*21568*/5520/*BCBE */,/*21569*/5520/*BCBF */, /*21570*/5520/*BCC0 */,/*21571*/5520/*BCC1 */,/*21572*/5520/*BCC2 */,/*21573*/5520/*BCC3 */,/*21574*/5520/*BCC4 */, /*21575*/5520/*BCC5 */,/*21576*/5520/*BCC6 */,/*21577*/5520/*BCC7 */,/*21578*/5520/*BCC8 */,/*21579*/5520/*BCC9 */, /*21580*/5520/*BCCA */,/*21581*/5520/*BCCB */,/*21582*/5520/*BCCC */,/*21583*/5520/*BCCD */,/*21584*/5520/*BCCE */, /*21585*/5520/*BCCF */,/*21586*/5520/*BCD0 */,/*21587*/5520/*BCD1 */,/*21588*/5520/*BCD2 */,/*21589*/5520/*BCD3 */, /*21590*/5520/*BCD4 */,/*21591*/5520/*BCD5 */,/*21592*/5520/*BCD6 */,/*21593*/5520/*BCD7 */,/*21594*/5519/* BCD8 */, /*21595*/5520/* BCD9 */,/*21596*/5520/*BCDA */,/*21597*/5520/*BCDB */,/*21598*/5520/*BCDC */,/*21599*/5520/*BCDD */, /*21600*/5520/*BCDE */,/*21601*/5520/*BCDF */,/*21602*/5520/*BCE0 */,/*21603*/5520/*BCE1 */,/*21604*/5520/*BCE2 */, /*21605*/5520/*BCE3 */,/*21606*/5520/*BCE4 */,/*21607*/5520/*BCE5 */,/*21608*/5520/*BCE6 */,/*21609*/5520/*BCE7 */, /*21610*/5520/*BCE8 */,/*21611*/5520/*BCE9 */,/*21612*/5520/*BCEA */,/*21613*/5520/*BCEB */,/*21614*/5520/*BCEC */, /*21615*/5520/*BCED */,/*21616*/5520/*BCEE */,/*21617*/5520/*BCEF */,/*21618*/5520/*BCF0 */,/*21619*/5520/*BCF1 */, /*21620*/5520/*BCF2 */,/*21621*/5520/*BCF3 */,/*21622*/5519/* BCF4 */,/*21623*/5520/* BCF5 */,/*21624*/5520/*BCF6 */, /*21625*/5520/*BCF7 */,/*21626*/5520/*BCF8 */,/*21627*/5520/*BCF9 */,/*21628*/5520/*BCFA */,/*21629*/5520/*BCFB */, /*21630*/5520/*BCFC */,/*21631*/5520/*BCFD */,/*21632*/5520/*BCFE */,/*21633*/5520/*BCFF */,/*21634*/5520/*BD00 */, /*21635*/5520/*BD01 */,/*21636*/5520/*BD02 */,/*21637*/5520/*BD03 */,/*21638*/5520/*BD04 */,/*21639*/5520/*BD05 */, /*21640*/5520/*BD06 */,/*21641*/5520/*BD07 */,/*21642*/5520/*BD08 */,/*21643*/5520/*BD09 */,/*21644*/5520/*BD0A */, /*21645*/5520/*BD0B */,/*21646*/5520/*BD0C */,/*21647*/5520/*BD0D */,/*21648*/5520/*BD0E */,/*21649*/5520/*BD0F */, /*21650*/5519/* BD10 */,/*21651*/5520/* BD11 */,/*21652*/5520/*BD12 */,/*21653*/5520/*BD13 */,/*21654*/5520/*BD14 */, /*21655*/5520/*BD15 */,/*21656*/5520/*BD16 */,/*21657*/5520/*BD17 */,/*21658*/5520/*BD18 */,/*21659*/5520/*BD19 */, /*21660*/5520/*BD1A */,/*21661*/5520/*BD1B */,/*21662*/5520/*BD1C */,/*21663*/5520/*BD1D */,/*21664*/5520/*BD1E */, /*21665*/5520/*BD1F */,/*21666*/5520/*BD20 */,/*21667*/5520/*BD21 */,/*21668*/5520/*BD22 */,/*21669*/5520/*BD23 */, /*21670*/5520/*BD24 */,/*21671*/5520/*BD25 */,/*21672*/5520/*BD26 */,/*21673*/5520/*BD27 */,/*21674*/5520/*BD28 */, /*21675*/5520/*BD29 */,/*21676*/5520/*BD2A */,/*21677*/5520/*BD2B */,/*21678*/5519/* BD2C */,/*21679*/5520/* BD2D */, /*21680*/5520/*BD2E */,/*21681*/5520/*BD2F */,/*21682*/5520/*BD30 */,/*21683*/5520/*BD31 */,/*21684*/5520/*BD32 */, /*21685*/5520/*BD33 */,/*21686*/5520/*BD34 */,/*21687*/5520/*BD35 */,/*21688*/5520/*BD36 */,/*21689*/5520/*BD37 */, /*21690*/5520/*BD38 */,/*21691*/5520/*BD39 */,/*21692*/5520/*BD3A */,/*21693*/5520/*BD3B */,/*21694*/5520/*BD3C */, /*21695*/5520/*BD3D */,/*21696*/5520/*BD3E */,/*21697*/5520/*BD3F */,/*21698*/5520/*BD40 */,/*21699*/5520/*BD41 */, /*21700*/5520/*BD42 */,/*21701*/5520/*BD43 */,/*21702*/5520/*BD44 */,/*21703*/5520/*BD45 */,/*21704*/5520/*BD46 */, /*21705*/5520/*BD47 */,/*21706*/5519/* BD48 */,/*21707*/5520/* BD49 */,/*21708*/5520/*BD4A */,/*21709*/5520/*BD4B */, /*21710*/5520/*BD4C */,/*21711*/5520/*BD4D */,/*21712*/5520/*BD4E */,/*21713*/5520/*BD4F */,/*21714*/5520/*BD50 */, /*21715*/5520/*BD51 */,/*21716*/5520/*BD52 */,/*21717*/5520/*BD53 */,/*21718*/5520/*BD54 */,/*21719*/5520/*BD55 */, /*21720*/5520/*BD56 */,/*21721*/5520/*BD57 */,/*21722*/5520/*BD58 */,/*21723*/5520/*BD59 */,/*21724*/5520/*BD5A */, /*21725*/5520/*BD5B */,/*21726*/5520/*BD5C */,/*21727*/5520/*BD5D */,/*21728*/5520/*BD5E */,/*21729*/5520/*BD5F */, /*21730*/5520/*BD60 */,/*21731*/5520/*BD61 */,/*21732*/5520/*BD62 */,/*21733*/5520/*BD63 */,/*21734*/5519/* BD64 */, /*21735*/5520/* BD65 */,/*21736*/5520/*BD66 */,/*21737*/5520/*BD67 */,/*21738*/5520/*BD68 */,/*21739*/5520/*BD69 */, /*21740*/5520/*BD6A */,/*21741*/5520/*BD6B */,/*21742*/5520/*BD6C */,/*21743*/5520/*BD6D */,/*21744*/5520/*BD6E */, /*21745*/5520/*BD6F */,/*21746*/5520/*BD70 */,/*21747*/5520/*BD71 */,/*21748*/5520/*BD72 */,/*21749*/5520/*BD73 */, /*21750*/5520/*BD74 */,/*21751*/5520/*BD75 */,/*21752*/5520/*BD76 */,/*21753*/5520/*BD77 */,/*21754*/5520/*BD78 */, /*21755*/5520/*BD79 */,/*21756*/5520/*BD7A */,/*21757*/5520/*BD7B */,/*21758*/5520/*BD7C */,/*21759*/5520/*BD7D */, /*21760*/5520/*BD7E */,/*21761*/5520/*BD7F */,/*21762*/5519/* BD80 */,/*21763*/5520/* BD81 */,/*21764*/5520/*BD82 */, /*21765*/5520/*BD83 */,/*21766*/5520/*BD84 */,/*21767*/5520/*BD85 */,/*21768*/5520/*BD86 */,/*21769*/5520/*BD87 */, /*21770*/5520/*BD88 */,/*21771*/5520/*BD89 */,/*21772*/5520/*BD8A */,/*21773*/5520/*BD8B */,/*21774*/5520/*BD8C */, /*21775*/5520/*BD8D */,/*21776*/5520/*BD8E */,/*21777*/5520/*BD8F */,/*21778*/5520/*BD90 */,/*21779*/5520/*BD91 */, /*21780*/5520/*BD92 */,/*21781*/5520/*BD93 */,/*21782*/5520/*BD94 */,/*21783*/5520/*BD95 */,/*21784*/5520/*BD96 */, /*21785*/5520/*BD97 */,/*21786*/5520/*BD98 */,/*21787*/5520/*BD99 */,/*21788*/5520/*BD9A */,/*21789*/5520/*BD9B */, /*21790*/5519/* BD9C */,/*21791*/5520/* BD9D */,/*21792*/5520/*BD9E */,/*21793*/5520/*BD9F */,/*21794*/5520/*BDA0 */, /*21795*/5520/*BDA1 */,/*21796*/5520/*BDA2 */,/*21797*/5520/*BDA3 */,/*21798*/5520/*BDA4 */,/*21799*/5520/*BDA5 */, /*21800*/5520/*BDA6 */,/*21801*/5520/*BDA7 */,/*21802*/5520/*BDA8 */,/*21803*/5520/*BDA9 */,/*21804*/5520/*BDAA */, /*21805*/5520/*BDAB */,/*21806*/5520/*BDAC */,/*21807*/5520/*BDAD */,/*21808*/5520/*BDAE */,/*21809*/5520/*BDAF */, /*21810*/5520/*BDB0 */,/*21811*/5520/*BDB1 */,/*21812*/5520/*BDB2 */,/*21813*/5520/*BDB3 */,/*21814*/5520/*BDB4 */, /*21815*/5520/*BDB5 */,/*21816*/5520/*BDB6 */,/*21817*/5520/*BDB7 */,/*21818*/5519/* BDB8 */,/*21819*/5520/* BDB9 */, /*21820*/5520/*BDBA */,/*21821*/5520/*BDBB */,/*21822*/5520/*BDBC */,/*21823*/5520/*BDBD */,/*21824*/5520/*BDBE */, /*21825*/5520/*BDBF */,/*21826*/5520/*BDC0 */,/*21827*/5520/*BDC1 */,/*21828*/5520/*BDC2 */,/*21829*/5520/*BDC3 */, /*21830*/5520/*BDC4 */,/*21831*/5520/*BDC5 */,/*21832*/5520/*BDC6 */,/*21833*/5520/*BDC7 */,/*21834*/5520/*BDC8 */, /*21835*/5520/*BDC9 */,/*21836*/5520/*BDCA */,/*21837*/5520/*BDCB */,/*21838*/5520/*BDCC */,/*21839*/5520/*BDCD */, /*21840*/5520/*BDCE */,/*21841*/5520/*BDCF */,/*21842*/5520/*BDD0 */,/*21843*/5520/*BDD1 */,/*21844*/5520/*BDD2 */, /*21845*/5520/*BDD3 */,/*21846*/5519/* BDD4 */,/*21847*/5520/* BDD5 */,/*21848*/5520/*BDD6 */,/*21849*/5520/*BDD7 */, /*21850*/5520/*BDD8 */,/*21851*/5520/*BDD9 */,/*21852*/5520/*BDDA */,/*21853*/5520/*BDDB */,/*21854*/5520/*BDDC */, /*21855*/5520/*BDDD */,/*21856*/5520/*BDDE */,/*21857*/5520/*BDDF */,/*21858*/5520/*BDE0 */,/*21859*/5520/*BDE1 */, /*21860*/5520/*BDE2 */,/*21861*/5520/*BDE3 */,/*21862*/5520/*BDE4 */,/*21863*/5520/*BDE5 */,/*21864*/5520/*BDE6 */, /*21865*/5520/*BDE7 */,/*21866*/5520/*BDE8 */,/*21867*/5520/*BDE9 */,/*21868*/5520/*BDEA */,/*21869*/5520/*BDEB */, /*21870*/5520/*BDEC */,/*21871*/5520/*BDED */,/*21872*/5520/*BDEE */,/*21873*/5520/*BDEF */,/*21874*/5519/* BDF0 */, /*21875*/5520/* BDF1 */,/*21876*/5520/*BDF2 */,/*21877*/5520/*BDF3 */,/*21878*/5520/*BDF4 */,/*21879*/5520/*BDF5 */, /*21880*/5520/*BDF6 */,/*21881*/5520/*BDF7 */,/*21882*/5520/*BDF8 */,/*21883*/5520/*BDF9 */,/*21884*/5520/*BDFA */, /*21885*/5520/*BDFB */,/*21886*/5520/*BDFC */,/*21887*/5520/*BDFD */,/*21888*/5520/*BDFE */,/*21889*/5520/*BDFF */, /*21890*/5520/*BE00 */,/*21891*/5520/*BE01 */,/*21892*/5520/*BE02 */,/*21893*/5520/*BE03 */,/*21894*/5520/*BE04 */, /*21895*/5520/*BE05 */,/*21896*/5520/*BE06 */,/*21897*/5520/*BE07 */,/*21898*/5520/*BE08 */,/*21899*/5520/*BE09 */, /*21900*/5520/*BE0A */,/*21901*/5520/*BE0B */,/*21902*/5519/* BE0C */,/*21903*/5520/* BE0D */,/*21904*/5520/*BE0E */, /*21905*/5520/*BE0F */,/*21906*/5520/*BE10 */,/*21907*/5520/*BE11 */,/*21908*/5520/*BE12 */,/*21909*/5520/*BE13 */, /*21910*/5520/*BE14 */,/*21911*/5520/*BE15 */,/*21912*/5520/*BE16 */,/*21913*/5520/*BE17 */,/*21914*/5520/*BE18 */, /*21915*/5520/*BE19 */,/*21916*/5520/*BE1A */,/*21917*/5520/*BE1B */,/*21918*/5520/*BE1C */,/*21919*/5520/*BE1D */, /*21920*/5520/*BE1E */,/*21921*/5520/*BE1F */,/*21922*/5520/*BE20 */,/*21923*/5520/*BE21 */,/*21924*/5520/*BE22 */, /*21925*/5520/*BE23 */,/*21926*/5520/*BE24 */,/*21927*/5520/*BE25 */,/*21928*/5520/*BE26 */,/*21929*/5520/*BE27 */, /*21930*/5519/* BE28 */,/*21931*/5520/* BE29 */,/*21932*/5520/*BE2A */,/*21933*/5520/*BE2B */,/*21934*/5520/*BE2C */, /*21935*/5520/*BE2D */,/*21936*/5520/*BE2E */,/*21937*/5520/*BE2F */,/*21938*/5520/*BE30 */,/*21939*/5520/*BE31 */, /*21940*/5520/*BE32 */,/*21941*/5520/*BE33 */,/*21942*/5520/*BE34 */,/*21943*/5520/*BE35 */,/*21944*/5520/*BE36 */, /*21945*/5520/*BE37 */,/*21946*/5520/*BE38 */,/*21947*/5520/*BE39 */,/*21948*/5520/*BE3A */,/*21949*/5520/*BE3B */, /*21950*/5520/*BE3C */,/*21951*/5520/*BE3D */,/*21952*/5520/*BE3E */,/*21953*/5520/*BE3F */,/*21954*/5520/*BE40 */, /*21955*/5520/*BE41 */,/*21956*/5520/*BE42 */,/*21957*/5520/*BE43 */,/*21958*/5519/* BE44 */,/*21959*/5520/* BE45 */, /*21960*/5520/*BE46 */,/*21961*/5520/*BE47 */,/*21962*/5520/*BE48 */,/*21963*/5520/*BE49 */,/*21964*/5520/*BE4A */, /*21965*/5520/*BE4B */,/*21966*/5520/*BE4C */,/*21967*/5520/*BE4D */,/*21968*/5520/*BE4E */,/*21969*/5520/*BE4F */, /*21970*/5520/*BE50 */,/*21971*/5520/*BE51 */,/*21972*/5520/*BE52 */,/*21973*/5520/*BE53 */,/*21974*/5520/*BE54 */, /*21975*/5520/*BE55 */,/*21976*/5520/*BE56 */,/*21977*/5520/*BE57 */,/*21978*/5520/*BE58 */,/*21979*/5520/*BE59 */, /*21980*/5520/*BE5A */,/*21981*/5520/*BE5B */,/*21982*/5520/*BE5C */,/*21983*/5520/*BE5D */,/*21984*/5520/*BE5E */, /*21985*/5520/*BE5F */,/*21986*/5519/* BE60 */,/*21987*/5520/* BE61 */,/*21988*/5520/*BE62 */,/*21989*/5520/*BE63 */, /*21990*/5520/*BE64 */,/*21991*/5520/*BE65 */,/*21992*/5520/*BE66 */,/*21993*/5520/*BE67 */,/*21994*/5520/*BE68 */, /*21995*/5520/*BE69 */,/*21996*/5520/*BE6A */,/*21997*/5520/*BE6B */,/*21998*/5520/*BE6C */,/*21999*/5520/*BE6D */, /*22000*/5520/*BE6E */,/*22001*/5520/*BE6F */,/*22002*/5520/*BE70 */,/*22003*/5520/*BE71 */,/*22004*/5520/*BE72 */, /*22005*/5520/*BE73 */,/*22006*/5520/*BE74 */,/*22007*/5520/*BE75 */,/*22008*/5520/*BE76 */,/*22009*/5520/*BE77 */, /*22010*/5520/*BE78 */,/*22011*/5520/*BE79 */,/*22012*/5520/*BE7A */,/*22013*/5520/*BE7B */,/*22014*/5519/* BE7C */, /*22015*/5520/* BE7D */,/*22016*/5520/*BE7E */,/*22017*/5520/*BE7F */,/*22018*/5520/*BE80 */,/*22019*/5520/*BE81 */, /*22020*/5520/*BE82 */,/*22021*/5520/*BE83 */,/*22022*/5520/*BE84 */,/*22023*/5520/*BE85 */,/*22024*/5520/*BE86 */, /*22025*/5520/*BE87 */,/*22026*/5520/*BE88 */,/*22027*/5520/*BE89 */,/*22028*/5520/*BE8A */,/*22029*/5520/*BE8B */, /*22030*/5520/*BE8C */,/*22031*/5520/*BE8D */,/*22032*/5520/*BE8E */,/*22033*/5520/*BE8F */,/*22034*/5520/*BE90 */, /*22035*/5520/*BE91 */,/*22036*/5520/*BE92 */,/*22037*/5520/*BE93 */,/*22038*/5520/*BE94 */,/*22039*/5520/*BE95 */, /*22040*/5520/*BE96 */,/*22041*/5520/*BE97 */,/*22042*/5519/* BE98 */,/*22043*/5520/* BE99 */,/*22044*/5520/*BE9A */, /*22045*/5520/*BE9B */,/*22046*/5520/*BE9C */,/*22047*/5520/*BE9D */,/*22048*/5520/*BE9E */,/*22049*/5520/*BE9F */, /*22050*/5520/*BEA0 */,/*22051*/5520/*BEA1 */,/*22052*/5520/*BEA2 */,/*22053*/5520/*BEA3 */,/*22054*/5520/*BEA4 */, /*22055*/5520/*BEA5 */,/*22056*/5520/*BEA6 */,/*22057*/5520/*BEA7 */,/*22058*/5520/*BEA8 */,/*22059*/5520/*BEA9 */, /*22060*/5520/*BEAA */,/*22061*/5520/*BEAB */,/*22062*/5520/*BEAC */,/*22063*/5520/*BEAD */,/*22064*/5520/*BEAE */, /*22065*/5520/*BEAF */,/*22066*/5520/*BEB0 */,/*22067*/5520/*BEB1 */,/*22068*/5520/*BEB2 */,/*22069*/5520/*BEB3 */, /*22070*/5519/* BEB4 */,/*22071*/5520/* BEB5 */,/*22072*/5520/*BEB6 */,/*22073*/5520/*BEB7 */,/*22074*/5520/*BEB8 */, /*22075*/5520/*BEB9 */,/*22076*/5520/*BEBA */,/*22077*/5520/*BEBB */,/*22078*/5520/*BEBC */,/*22079*/5520/*BEBD */, /*22080*/5520/*BEBE */,/*22081*/5520/*BEBF */,/*22082*/5520/*BEC0 */,/*22083*/5520/*BEC1 */,/*22084*/5520/*BEC2 */, /*22085*/5520/*BEC3 */,/*22086*/5520/*BEC4 */,/*22087*/5520/*BEC5 */,/*22088*/5520/*BEC6 */,/*22089*/5520/*BEC7 */, /*22090*/5520/*BEC8 */,/*22091*/5520/*BEC9 */,/*22092*/5520/*BECA */,/*22093*/5520/*BECB */,/*22094*/5520/*BECC */, /*22095*/5520/*BECD */,/*22096*/5520/*BECE */,/*22097*/5520/*BECF */,/*22098*/5519/* BED0 */,/*22099*/5520/* BED1 */, /*22100*/5520/*BED2 */,/*22101*/5520/*BED3 */,/*22102*/5520/*BED4 */,/*22103*/5520/*BED5 */,/*22104*/5520/*BED6 */, /*22105*/5520/*BED7 */,/*22106*/5520/*BED8 */,/*22107*/5520/*BED9 */,/*22108*/5520/*BEDA */,/*22109*/5520/*BEDB */, /*22110*/5520/*BEDC */,/*22111*/5520/*BEDD */,/*22112*/5520/*BEDE */,/*22113*/5520/*BEDF */,/*22114*/5520/*BEE0 */, /*22115*/5520/*BEE1 */,/*22116*/5520/*BEE2 */,/*22117*/5520/*BEE3 */,/*22118*/5520/*BEE4 */,/*22119*/5520/*BEE5 */, /*22120*/5520/*BEE6 */,/*22121*/5520/*BEE7 */,/*22122*/5520/*BEE8 */,/*22123*/5520/*BEE9 */,/*22124*/5520/*BEEA */, /*22125*/5520/*BEEB */,/*22126*/5519/* BEEC */,/*22127*/5520/* BEED */,/*22128*/5520/*BEEE */,/*22129*/5520/*BEEF */, /*22130*/5520/*BEF0 */,/*22131*/5520/*BEF1 */,/*22132*/5520/*BEF2 */,/*22133*/5520/*BEF3 */,/*22134*/5520/*BEF4 */, /*22135*/5520/*BEF5 */,/*22136*/5520/*BEF6 */,/*22137*/5520/*BEF7 */,/*22138*/5520/*BEF8 */,/*22139*/5520/*BEF9 */, /*22140*/5520/*BEFA */,/*22141*/5520/*BEFB */,/*22142*/5520/*BEFC */,/*22143*/5520/*BEFD */,/*22144*/5520/*BEFE */, /*22145*/5520/*BEFF */,/*22146*/5520/*BF00 */,/*22147*/5520/*BF01 */,/*22148*/5520/*BF02 */,/*22149*/5520/*BF03 */, /*22150*/5520/*BF04 */,/*22151*/5520/*BF05 */,/*22152*/5520/*BF06 */,/*22153*/5520/*BF07 */,/*22154*/5519/* BF08 */, /*22155*/5520/* BF09 */,/*22156*/5520/*BF0A */,/*22157*/5520/*BF0B */,/*22158*/5520/*BF0C */,/*22159*/5520/*BF0D */, /*22160*/5520/*BF0E */,/*22161*/5520/*BF0F */,/*22162*/5520/*BF10 */,/*22163*/5520/*BF11 */,/*22164*/5520/*BF12 */, /*22165*/5520/*BF13 */,/*22166*/5520/*BF14 */,/*22167*/5520/*BF15 */,/*22168*/5520/*BF16 */,/*22169*/5520/*BF17 */, /*22170*/5520/*BF18 */,/*22171*/5520/*BF19 */,/*22172*/5520/*BF1A */,/*22173*/5520/*BF1B */,/*22174*/5520/*BF1C */, /*22175*/5520/*BF1D */,/*22176*/5520/*BF1E */,/*22177*/5520/*BF1F */,/*22178*/5520/*BF20 */,/*22179*/5520/*BF21 */, /*22180*/5520/*BF22 */,/*22181*/5520/*BF23 */,/*22182*/5519/* BF24 */,/*22183*/5520/* BF25 */,/*22184*/5520/*BF26 */, /*22185*/5520/*BF27 */,/*22186*/5520/*BF28 */,/*22187*/5520/*BF29 */,/*22188*/5520/*BF2A */,/*22189*/5520/*BF2B */, /*22190*/5520/*BF2C */,/*22191*/5520/*BF2D */,/*22192*/5520/*BF2E */,/*22193*/5520/*BF2F */,/*22194*/5520/*BF30 */, /*22195*/5520/*BF31 */,/*22196*/5520/*BF32 */,/*22197*/5520/*BF33 */,/*22198*/5520/*BF34 */,/*22199*/5520/*BF35 */, /*22200*/5520/*BF36 */,/*22201*/5520/*BF37 */,/*22202*/5520/*BF38 */,/*22203*/5520/*BF39 */,/*22204*/5520/*BF3A */, /*22205*/5520/*BF3B */,/*22206*/5520/*BF3C */,/*22207*/5520/*BF3D */,/*22208*/5520/*BF3E */,/*22209*/5520/*BF3F */, /*22210*/5519/* BF40 */,/*22211*/5520/* BF41 */,/*22212*/5520/*BF42 */,/*22213*/5520/*BF43 */,/*22214*/5520/*BF44 */, /*22215*/5520/*BF45 */,/*22216*/5520/*BF46 */,/*22217*/5520/*BF47 */,/*22218*/5520/*BF48 */,/*22219*/5520/*BF49 */, /*22220*/5520/*BF4A */,/*22221*/5520/*BF4B */,/*22222*/5520/*BF4C */,/*22223*/5520/*BF4D */,/*22224*/5520/*BF4E */, /*22225*/5520/*BF4F */,/*22226*/5520/*BF50 */,/*22227*/5520/*BF51 */,/*22228*/5520/*BF52 */,/*22229*/5520/*BF53 */, /*22230*/5520/*BF54 */,/*22231*/5520/*BF55 */,/*22232*/5520/*BF56 */,/*22233*/5520/*BF57 */,/*22234*/5520/*BF58 */, /*22235*/5520/*BF59 */,/*22236*/5520/*BF5A */,/*22237*/5520/*BF5B */,/*22238*/5519/* BF5C */,/*22239*/5520/* BF5D */, /*22240*/5520/*BF5E */,/*22241*/5520/*BF5F */,/*22242*/5520/*BF60 */,/*22243*/5520/*BF61 */,/*22244*/5520/*BF62 */, /*22245*/5520/*BF63 */,/*22246*/5520/*BF64 */,/*22247*/5520/*BF65 */,/*22248*/5520/*BF66 */,/*22249*/5520/*BF67 */, /*22250*/5520/*BF68 */,/*22251*/5520/*BF69 */,/*22252*/5520/*BF6A */,/*22253*/5520/*BF6B */,/*22254*/5520/*BF6C */, /*22255*/5520/*BF6D */,/*22256*/5520/*BF6E */,/*22257*/5520/*BF6F */,/*22258*/5520/*BF70 */,/*22259*/5520/*BF71 */, /*22260*/5520/*BF72 */,/*22261*/5520/*BF73 */,/*22262*/5520/*BF74 */,/*22263*/5520/*BF75 */,/*22264*/5520/*BF76 */, /*22265*/5520/*BF77 */,/*22266*/5519/* BF78 */,/*22267*/5520/* BF79 */,/*22268*/5520/*BF7A */,/*22269*/5520/*BF7B */, /*22270*/5520/*BF7C */,/*22271*/5520/*BF7D */,/*22272*/5520/*BF7E */,/*22273*/5520/*BF7F */,/*22274*/5520/*BF80 */, /*22275*/5520/*BF81 */,/*22276*/5520/*BF82 */,/*22277*/5520/*BF83 */,/*22278*/5520/*BF84 */,/*22279*/5520/*BF85 */, /*22280*/5520/*BF86 */,/*22281*/5520/*BF87 */,/*22282*/5520/*BF88 */,/*22283*/5520/*BF89 */,/*22284*/5520/*BF8A */, /*22285*/5520/*BF8B */,/*22286*/5520/*BF8C */,/*22287*/5520/*BF8D */,/*22288*/5520/*BF8E */,/*22289*/5520/*BF8F */, /*22290*/5520/*BF90 */,/*22291*/5520/*BF91 */,/*22292*/5520/*BF92 */,/*22293*/5520/*BF93 */,/*22294*/5519/* BF94 */, /*22295*/5520/* BF95 */,/*22296*/5520/*BF96 */,/*22297*/5520/*BF97 */,/*22298*/5520/*BF98 */,/*22299*/5520/*BF99 */, /*22300*/5520/*BF9A */,/*22301*/5520/*BF9B */,/*22302*/5520/*BF9C */,/*22303*/5520/*BF9D */,/*22304*/5520/*BF9E */, /*22305*/5520/*BF9F */,/*22306*/5520/*BFA0 */,/*22307*/5520/*BFA1 */,/*22308*/5520/*BFA2 */,/*22309*/5520/*BFA3 */, /*22310*/5520/*BFA4 */,/*22311*/5520/*BFA5 */,/*22312*/5520/*BFA6 */,/*22313*/5520/*BFA7 */,/*22314*/5520/*BFA8 */, /*22315*/5520/*BFA9 */,/*22316*/5520/*BFAA */,/*22317*/5520/*BFAB */,/*22318*/5520/*BFAC */,/*22319*/5520/*BFAD */, /*22320*/5520/*BFAE */,/*22321*/5520/*BFAF */,/*22322*/5519/* BFB0 */,/*22323*/5520/* BFB1 */,/*22324*/5520/*BFB2 */, /*22325*/5520/*BFB3 */,/*22326*/5520/*BFB4 */,/*22327*/5520/*BFB5 */,/*22328*/5520/*BFB6 */,/*22329*/5520/*BFB7 */, /*22330*/5520/*BFB8 */,/*22331*/5520/*BFB9 */,/*22332*/5520/*BFBA */,/*22333*/5520/*BFBB */,/*22334*/5520/*BFBC */, /*22335*/5520/*BFBD */,/*22336*/5520/*BFBE */,/*22337*/5520/*BFBF */,/*22338*/5520/*BFC0 */,/*22339*/5520/*BFC1 */, /*22340*/5520/*BFC2 */,/*22341*/5520/*BFC3 */,/*22342*/5520/*BFC4 */,/*22343*/5520/*BFC5 */,/*22344*/5520/*BFC6 */, /*22345*/5520/*BFC7 */,/*22346*/5520/*BFC8 */,/*22347*/5520/*BFC9 */,/*22348*/5520/*BFCA */,/*22349*/5520/*BFCB */, /*22350*/5519/* BFCC */,/*22351*/5520/* BFCD */,/*22352*/5520/*BFCE */,/*22353*/5520/*BFCF */,/*22354*/5520/*BFD0 */, /*22355*/5520/*BFD1 */,/*22356*/5520/*BFD2 */,/*22357*/5520/*BFD3 */,/*22358*/5520/*BFD4 */,/*22359*/5520/*BFD5 */, /*22360*/5520/*BFD6 */,/*22361*/5520/*BFD7 */,/*22362*/5520/*BFD8 */,/*22363*/5520/*BFD9 */,/*22364*/5520/*BFDA */, /*22365*/5520/*BFDB */,/*22366*/5520/*BFDC */,/*22367*/5520/*BFDD */,/*22368*/5520/*BFDE */,/*22369*/5520/*BFDF */, /*22370*/5520/*BFE0 */,/*22371*/5520/*BFE1 */,/*22372*/5520/*BFE2 */,/*22373*/5520/*BFE3 */,/*22374*/5520/*BFE4 */, /*22375*/5520/*BFE5 */,/*22376*/5520/*BFE6 */,/*22377*/5520/*BFE7 */,/*22378*/5519/* BFE8 */,/*22379*/5520/* BFE9 */, /*22380*/5520/*BFEA */,/*22381*/5520/*BFEB */,/*22382*/5520/*BFEC */,/*22383*/5520/*BFED */,/*22384*/5520/*BFEE */, /*22385*/5520/*BFEF */,/*22386*/5520/*BFF0 */,/*22387*/5520/*BFF1 */,/*22388*/5520/*BFF2 */,/*22389*/5520/*BFF3 */, /*22390*/5520/*BFF4 */,/*22391*/5520/*BFF5 */,/*22392*/5520/*BFF6 */,/*22393*/5520/*BFF7 */,/*22394*/5520/*BFF8 */, /*22395*/5520/*BFF9 */,/*22396*/5520/*BFFA */,/*22397*/5520/*BFFB */,/*22398*/5520/*BFFC */,/*22399*/5520/*BFFD */, /*22400*/5520/*BFFE */,/*22401*/5520/*BFFF */,/*22402*/5520/*C000 */,/*22403*/5520/*C001 */,/*22404*/5520/*C002 */, /*22405*/5520/*C003 */,/*22406*/5519/* C004 */,/*22407*/5520/* C005 */,/*22408*/5520/*C006 */,/*22409*/5520/*C007 */, /*22410*/5520/*C008 */,/*22411*/5520/*C009 */,/*22412*/5520/*C00A */,/*22413*/5520/*C00B */,/*22414*/5520/*C00C */, /*22415*/5520/*C00D */,/*22416*/5520/*C00E */,/*22417*/5520/*C00F */,/*22418*/5520/*C010 */,/*22419*/5520/*C011 */, /*22420*/5520/*C012 */,/*22421*/5520/*C013 */,/*22422*/5520/*C014 */,/*22423*/5520/*C015 */,/*22424*/5520/*C016 */, /*22425*/5520/*C017 */,/*22426*/5520/*C018 */,/*22427*/5520/*C019 */,/*22428*/5520/*C01A */,/*22429*/5520/*C01B */, /*22430*/5520/*C01C */,/*22431*/5520/*C01D */,/*22432*/5520/*C01E */,/*22433*/5520/*C01F */,/*22434*/5519/* C020 */, /*22435*/5520/* C021 */,/*22436*/5520/*C022 */,/*22437*/5520/*C023 */,/*22438*/5520/*C024 */,/*22439*/5520/*C025 */, /*22440*/5520/*C026 */,/*22441*/5520/*C027 */,/*22442*/5520/*C028 */,/*22443*/5520/*C029 */,/*22444*/5520/*C02A */, /*22445*/5520/*C02B */,/*22446*/5520/*C02C */,/*22447*/5520/*C02D */,/*22448*/5520/*C02E */,/*22449*/5520/*C02F */, /*22450*/5520/*C030 */,/*22451*/5520/*C031 */,/*22452*/5520/*C032 */,/*22453*/5520/*C033 */,/*22454*/5520/*C034 */, /*22455*/5520/*C035 */,/*22456*/5520/*C036 */,/*22457*/5520/*C037 */,/*22458*/5520/*C038 */,/*22459*/5520/*C039 */, /*22460*/5520/*C03A */,/*22461*/5520/*C03B */,/*22462*/5519/* C03C */,/*22463*/5520/* C03D */,/*22464*/5520/*C03E */, /*22465*/5520/*C03F */,/*22466*/5520/*C040 */,/*22467*/5520/*C041 */,/*22468*/5520/*C042 */,/*22469*/5520/*C043 */, /*22470*/5520/*C044 */,/*22471*/5520/*C045 */,/*22472*/5520/*C046 */,/*22473*/5520/*C047 */,/*22474*/5520/*C048 */, /*22475*/5520/*C049 */,/*22476*/5520/*C04A */,/*22477*/5520/*C04B */,/*22478*/5520/*C04C */,/*22479*/5520/*C04D */, /*22480*/5520/*C04E */,/*22481*/5520/*C04F */,/*22482*/5520/*C050 */,/*22483*/5520/*C051 */,/*22484*/5520/*C052 */, /*22485*/5520/*C053 */,/*22486*/5520/*C054 */,/*22487*/5520/*C055 */,/*22488*/5520/*C056 */,/*22489*/5520/*C057 */, /*22490*/5519/* C058 */,/*22491*/5520/* C059 */,/*22492*/5520/*C05A */,/*22493*/5520/*C05B */,/*22494*/5520/*C05C */, /*22495*/5520/*C05D */,/*22496*/5520/*C05E */,/*22497*/5520/*C05F */,/*22498*/5520/*C060 */,/*22499*/5520/*C061 */, /*22500*/5520/*C062 */,/*22501*/5520/*C063 */,/*22502*/5520/*C064 */,/*22503*/5520/*C065 */,/*22504*/5520/*C066 */, /*22505*/5520/*C067 */,/*22506*/5520/*C068 */,/*22507*/5520/*C069 */,/*22508*/5520/*C06A */,/*22509*/5520/*C06B */, /*22510*/5520/*C06C */,/*22511*/5520/*C06D */,/*22512*/5520/*C06E */,/*22513*/5520/*C06F */,/*22514*/5520/*C070 */, /*22515*/5520/*C071 */,/*22516*/5520/*C072 */,/*22517*/5520/*C073 */,/*22518*/5519/* C074 */,/*22519*/5520/* C075 */, /*22520*/5520/*C076 */,/*22521*/5520/*C077 */,/*22522*/5520/*C078 */,/*22523*/5520/*C079 */,/*22524*/5520/*C07A */, /*22525*/5520/*C07B */,/*22526*/5520/*C07C */,/*22527*/5520/*C07D */,/*22528*/5520/*C07E */,/*22529*/5520/*C07F */, /*22530*/5520/*C080 */,/*22531*/5520/*C081 */,/*22532*/5520/*C082 */,/*22533*/5520/*C083 */,/*22534*/5520/*C084 */, /*22535*/5520/*C085 */,/*22536*/5520/*C086 */,/*22537*/5520/*C087 */,/*22538*/5520/*C088 */,/*22539*/5520/*C089 */, /*22540*/5520/*C08A */,/*22541*/5520/*C08B */,/*22542*/5520/*C08C */,/*22543*/5520/*C08D */,/*22544*/5520/*C08E */, /*22545*/5520/*C08F */,/*22546*/5519/* C090 */,/*22547*/5520/* C091 */,/*22548*/5520/*C092 */,/*22549*/5520/*C093 */, /*22550*/5520/*C094 */,/*22551*/5520/*C095 */,/*22552*/5520/*C096 */,/*22553*/5520/*C097 */,/*22554*/5520/*C098 */, /*22555*/5520/*C099 */,/*22556*/5520/*C09A */,/*22557*/5520/*C09B */,/*22558*/5520/*C09C */,/*22559*/5520/*C09D */, /*22560*/5520/*C09E */,/*22561*/5520/*C09F */,/*22562*/5520/*C0A0 */,/*22563*/5520/*C0A1 */,/*22564*/5520/*C0A2 */, /*22565*/5520/*C0A3 */,/*22566*/5520/*C0A4 */,/*22567*/5520/*C0A5 */,/*22568*/5520/*C0A6 */,/*22569*/5520/*C0A7 */, /*22570*/5520/*C0A8 */,/*22571*/5520/*C0A9 */,/*22572*/5520/*C0AA */,/*22573*/5520/*C0AB */,/*22574*/5519/* C0AC */, /*22575*/5520/* C0AD */,/*22576*/5520/*C0AE */,/*22577*/5520/*C0AF */,/*22578*/5520/*C0B0 */,/*22579*/5520/*C0B1 */, /*22580*/5520/*C0B2 */,/*22581*/5520/*C0B3 */,/*22582*/5520/*C0B4 */,/*22583*/5520/*C0B5 */,/*22584*/5520/*C0B6 */, /*22585*/5520/*C0B7 */,/*22586*/5520/*C0B8 */,/*22587*/5520/*C0B9 */,/*22588*/5520/*C0BA */,/*22589*/5520/*C0BB */, /*22590*/5520/*C0BC */,/*22591*/5520/*C0BD */,/*22592*/5520/*C0BE */,/*22593*/5520/*C0BF */,/*22594*/5520/*C0C0 */, /*22595*/5520/*C0C1 */,/*22596*/5520/*C0C2 */,/*22597*/5520/*C0C3 */,/*22598*/5520/*C0C4 */,/*22599*/5520/*C0C5 */, /*22600*/5520/*C0C6 */,/*22601*/5520/*C0C7 */,/*22602*/5519/* C0C8 */,/*22603*/5520/* C0C9 */,/*22604*/5520/*C0CA */, /*22605*/5520/*C0CB */,/*22606*/5520/*C0CC */,/*22607*/5520/*C0CD */,/*22608*/5520/*C0CE */,/*22609*/5520/*C0CF */, /*22610*/5520/*C0D0 */,/*22611*/5520/*C0D1 */,/*22612*/5520/*C0D2 */,/*22613*/5520/*C0D3 */,/*22614*/5520/*C0D4 */, /*22615*/5520/*C0D5 */,/*22616*/5520/*C0D6 */,/*22617*/5520/*C0D7 */,/*22618*/5520/*C0D8 */,/*22619*/5520/*C0D9 */, /*22620*/5520/*C0DA */,/*22621*/5520/*C0DB */,/*22622*/5520/*C0DC */,/*22623*/5520/*C0DD */,/*22624*/5520/*C0DE */, /*22625*/5520/*C0DF */,/*22626*/5520/*C0E0 */,/*22627*/5520/*C0E1 */,/*22628*/5520/*C0E2 */,/*22629*/5520/*C0E3 */, /*22630*/5519/* C0E4 */,/*22631*/5520/* C0E5 */,/*22632*/5520/*C0E6 */,/*22633*/5520/*C0E7 */,/*22634*/5520/*C0E8 */, /*22635*/5520/*C0E9 */,/*22636*/5520/*C0EA */,/*22637*/5520/*C0EB */,/*22638*/5520/*C0EC */,/*22639*/5520/*C0ED */, /*22640*/5520/*C0EE */,/*22641*/5520/*C0EF */,/*22642*/5520/*C0F0 */,/*22643*/5520/*C0F1 */,/*22644*/5520/*C0F2 */, /*22645*/5520/*C0F3 */,/*22646*/5520/*C0F4 */,/*22647*/5520/*C0F5 */,/*22648*/5520/*C0F6 */,/*22649*/5520/*C0F7 */, /*22650*/5520/*C0F8 */,/*22651*/5520/*C0F9 */,/*22652*/5520/*C0FA */,/*22653*/5520/*C0FB */,/*22654*/5520/*C0FC */, /*22655*/5520/*C0FD */,/*22656*/5520/*C0FE */,/*22657*/5520/*C0FF */,/*22658*/5519/* C100 */,/*22659*/5520/* C101 */, /*22660*/5520/*C102 */,/*22661*/5520/*C103 */,/*22662*/5520/*C104 */,/*22663*/5520/*C105 */,/*22664*/5520/*C106 */, /*22665*/5520/*C107 */,/*22666*/5520/*C108 */,/*22667*/5520/*C109 */,/*22668*/5520/*C10A */,/*22669*/5520/*C10B */, /*22670*/5520/*C10C */,/*22671*/5520/*C10D */,/*22672*/5520/*C10E */,/*22673*/5520/*C10F */,/*22674*/5520/*C110 */, /*22675*/5520/*C111 */,/*22676*/5520/*C112 */,/*22677*/5520/*C113 */,/*22678*/5520/*C114 */,/*22679*/5520/*C115 */, /*22680*/5520/*C116 */,/*22681*/5520/*C117 */,/*22682*/5520/*C118 */,/*22683*/5520/*C119 */,/*22684*/5520/*C11A */, /*22685*/5520/*C11B */,/*22686*/5519/* C11C */,/*22687*/5520/* C11D */,/*22688*/5520/*C11E */,/*22689*/5520/*C11F */, /*22690*/5520/*C120 */,/*22691*/5520/*C121 */,/*22692*/5520/*C122 */,/*22693*/5520/*C123 */,/*22694*/5520/*C124 */, /*22695*/5520/*C125 */,/*22696*/5520/*C126 */,/*22697*/5520/*C127 */,/*22698*/5520/*C128 */,/*22699*/5520/*C129 */, /*22700*/5520/*C12A */,/*22701*/5520/*C12B */,/*22702*/5520/*C12C */,/*22703*/5520/*C12D */,/*22704*/5520/*C12E */, /*22705*/5520/*C12F */,/*22706*/5520/*C130 */,/*22707*/5520/*C131 */,/*22708*/5520/*C132 */,/*22709*/5520/*C133 */, /*22710*/5520/*C134 */,/*22711*/5520/*C135 */,/*22712*/5520/*C136 */,/*22713*/5520/*C137 */,/*22714*/5519/* C138 */, /*22715*/5520/* C139 */,/*22716*/5520/*C13A */,/*22717*/5520/*C13B */,/*22718*/5520/*C13C */,/*22719*/5520/*C13D */, /*22720*/5520/*C13E */,/*22721*/5520/*C13F */,/*22722*/5520/*C140 */,/*22723*/5520/*C141 */,/*22724*/5520/*C142 */, /*22725*/5520/*C143 */,/*22726*/5520/*C144 */,/*22727*/5520/*C145 */,/*22728*/5520/*C146 */,/*22729*/5520/*C147 */, /*22730*/5520/*C148 */,/*22731*/5520/*C149 */,/*22732*/5520/*C14A */,/*22733*/5520/*C14B */,/*22734*/5520/*C14C */, /*22735*/5520/*C14D */,/*22736*/5520/*C14E */,/*22737*/5520/*C14F */,/*22738*/5520/*C150 */,/*22739*/5520/*C151 */, /*22740*/5520/*C152 */,/*22741*/5520/*C153 */,/*22742*/5519/* C154 */,/*22743*/5520/* C155 */,/*22744*/5520/*C156 */, /*22745*/5520/*C157 */,/*22746*/5520/*C158 */,/*22747*/5520/*C159 */,/*22748*/5520/*C15A */,/*22749*/5520/*C15B */, /*22750*/5520/*C15C */,/*22751*/5520/*C15D */,/*22752*/5520/*C15E */,/*22753*/5520/*C15F */,/*22754*/5520/*C160 */, /*22755*/5520/*C161 */,/*22756*/5520/*C162 */,/*22757*/5520/*C163 */,/*22758*/5520/*C164 */,/*22759*/5520/*C165 */, /*22760*/5520/*C166 */,/*22761*/5520/*C167 */,/*22762*/5520/*C168 */,/*22763*/5520/*C169 */,/*22764*/5520/*C16A */, /*22765*/5520/*C16B */,/*22766*/5520/*C16C */,/*22767*/5520/*C16D */,/*22768*/5520/*C16E */,/*22769*/5520/*C16F */, /*22770*/5519/* C170 */,/*22771*/5520/* C171 */,/*22772*/5520/*C172 */,/*22773*/5520/*C173 */,/*22774*/5520/*C174 */, /*22775*/5520/*C175 */,/*22776*/5520/*C176 */,/*22777*/5520/*C177 */,/*22778*/5520/*C178 */,/*22779*/5520/*C179 */, /*22780*/5520/*C17A */,/*22781*/5520/*C17B */,/*22782*/5520/*C17C */,/*22783*/5520/*C17D */,/*22784*/5520/*C17E */, /*22785*/5520/*C17F */,/*22786*/5520/*C180 */,/*22787*/5520/*C181 */,/*22788*/5520/*C182 */,/*22789*/5520/*C183 */, /*22790*/5520/*C184 */,/*22791*/5520/*C185 */,/*22792*/5520/*C186 */,/*22793*/5520/*C187 */,/*22794*/5520/*C188 */, /*22795*/5520/*C189 */,/*22796*/5520/*C18A */,/*22797*/5520/*C18B */,/*22798*/5519/* C18C */,/*22799*/5520/* C18D */, /*22800*/5520/*C18E */,/*22801*/5520/*C18F */,/*22802*/5520/*C190 */,/*22803*/5520/*C191 */,/*22804*/5520/*C192 */, /*22805*/5520/*C193 */,/*22806*/5520/*C194 */,/*22807*/5520/*C195 */,/*22808*/5520/*C196 */,/*22809*/5520/*C197 */, /*22810*/5520/*C198 */,/*22811*/5520/*C199 */,/*22812*/5520/*C19A */,/*22813*/5520/*C19B */,/*22814*/5520/*C19C */, /*22815*/5520/*C19D */,/*22816*/5520/*C19E */,/*22817*/5520/*C19F */,/*22818*/5520/*C1A0 */,/*22819*/5520/*C1A1 */, /*22820*/5520/*C1A2 */,/*22821*/5520/*C1A3 */,/*22822*/5520/*C1A4 */,/*22823*/5520/*C1A5 */,/*22824*/5520/*C1A6 */, /*22825*/5520/*C1A7 */,/*22826*/5519/* C1A8 */,/*22827*/5520/* C1A9 */,/*22828*/5520/*C1AA */,/*22829*/5520/*C1AB */, /*22830*/5520/*C1AC */,/*22831*/5520/*C1AD */,/*22832*/5520/*C1AE */,/*22833*/5520/*C1AF */,/*22834*/5520/*C1B0 */, /*22835*/5520/*C1B1 */,/*22836*/5520/*C1B2 */,/*22837*/5520/*C1B3 */,/*22838*/5520/*C1B4 */,/*22839*/5520/*C1B5 */, /*22840*/5520/*C1B6 */,/*22841*/5520/*C1B7 */,/*22842*/5520/*C1B8 */,/*22843*/5520/*C1B9 */,/*22844*/5520/*C1BA */, /*22845*/5520/*C1BB */,/*22846*/5520/*C1BC */,/*22847*/5520/*C1BD */,/*22848*/5520/*C1BE */,/*22849*/5520/*C1BF */, /*22850*/5520/*C1C0 */,/*22851*/5520/*C1C1 */,/*22852*/5520/*C1C2 */,/*22853*/5520/*C1C3 */,/*22854*/5519/* C1C4 */, /*22855*/5520/* C1C5 */,/*22856*/5520/*C1C6 */,/*22857*/5520/*C1C7 */,/*22858*/5520/*C1C8 */,/*22859*/5520/*C1C9 */, /*22860*/5520/*C1CA */,/*22861*/5520/*C1CB */,/*22862*/5520/*C1CC */,/*22863*/5520/*C1CD */,/*22864*/5520/*C1CE */, /*22865*/5520/*C1CF */,/*22866*/5520/*C1D0 */,/*22867*/5520/*C1D1 */,/*22868*/5520/*C1D2 */,/*22869*/5520/*C1D3 */, /*22870*/5520/*C1D4 */,/*22871*/5520/*C1D5 */,/*22872*/5520/*C1D6 */,/*22873*/5520/*C1D7 */,/*22874*/5520/*C1D8 */, /*22875*/5520/*C1D9 */,/*22876*/5520/*C1DA */,/*22877*/5520/*C1DB */,/*22878*/5520/*C1DC */,/*22879*/5520/*C1DD */, /*22880*/5520/*C1DE */,/*22881*/5520/*C1DF */,/*22882*/5519/* C1E0 */,/*22883*/5520/* C1E1 */,/*22884*/5520/*C1E2 */, /*22885*/5520/*C1E3 */,/*22886*/5520/*C1E4 */,/*22887*/5520/*C1E5 */,/*22888*/5520/*C1E6 */,/*22889*/5520/*C1E7 */, /*22890*/5520/*C1E8 */,/*22891*/5520/*C1E9 */,/*22892*/5520/*C1EA */,/*22893*/5520/*C1EB */,/*22894*/5520/*C1EC */, /*22895*/5520/*C1ED */,/*22896*/5520/*C1EE */,/*22897*/5520/*C1EF */,/*22898*/5520/*C1F0 */,/*22899*/5520/*C1F1 */, /*22900*/5520/*C1F2 */,/*22901*/5520/*C1F3 */,/*22902*/5520/*C1F4 */,/*22903*/5520/*C1F5 */,/*22904*/5520/*C1F6 */, /*22905*/5520/*C1F7 */,/*22906*/5520/*C1F8 */,/*22907*/5520/*C1F9 */,/*22908*/5520/*C1FA */,/*22909*/5520/*C1FB */, /*22910*/5519/* C1FC */,/*22911*/5520/* C1FD */,/*22912*/5520/*C1FE */,/*22913*/5520/*C1FF */,/*22914*/5520/*C200 */, /*22915*/5520/*C201 */,/*22916*/5520/*C202 */,/*22917*/5520/*C203 */,/*22918*/5520/*C204 */,/*22919*/5520/*C205 */, /*22920*/5520/*C206 */,/*22921*/5520/*C207 */,/*22922*/5520/*C208 */,/*22923*/5520/*C209 */,/*22924*/5520/*C20A */, /*22925*/5520/*C20B */,/*22926*/5520/*C20C */,/*22927*/5520/*C20D */,/*22928*/5520/*C20E */,/*22929*/5520/*C20F */, /*22930*/5520/*C210 */,/*22931*/5520/*C211 */,/*22932*/5520/*C212 */,/*22933*/5520/*C213 */,/*22934*/5520/*C214 */, /*22935*/5520/*C215 */,/*22936*/5520/*C216 */,/*22937*/5520/*C217 */,/*22938*/5519/* C218 */,/*22939*/5520/* C219 */, /*22940*/5520/*C21A */,/*22941*/5520/*C21B */,/*22942*/5520/*C21C */,/*22943*/5520/*C21D */,/*22944*/5520/*C21E */, /*22945*/5520/*C21F */,/*22946*/5520/*C220 */,/*22947*/5520/*C221 */,/*22948*/5520/*C222 */,/*22949*/5520/*C223 */, /*22950*/5520/*C224 */,/*22951*/5520/*C225 */,/*22952*/5520/*C226 */,/*22953*/5520/*C227 */,/*22954*/5520/*C228 */, /*22955*/5520/*C229 */,/*22956*/5520/*C22A */,/*22957*/5520/*C22B */,/*22958*/5520/*C22C */,/*22959*/5520/*C22D */, /*22960*/5520/*C22E */,/*22961*/5520/*C22F */,/*22962*/5520/*C230 */,/*22963*/5520/*C231 */,/*22964*/5520/*C232 */, /*22965*/5520/*C233 */,/*22966*/5519/* C234 */,/*22967*/5520/* C235 */,/*22968*/5520/*C236 */,/*22969*/5520/*C237 */, /*22970*/5520/*C238 */,/*22971*/5520/*C239 */,/*22972*/5520/*C23A */,/*22973*/5520/*C23B */,/*22974*/5520/*C23C */, /*22975*/5520/*C23D */,/*22976*/5520/*C23E */,/*22977*/5520/*C23F */,/*22978*/5520/*C240 */,/*22979*/5520/*C241 */, /*22980*/5520/*C242 */,/*22981*/5520/*C243 */,/*22982*/5520/*C244 */,/*22983*/5520/*C245 */,/*22984*/5520/*C246 */, /*22985*/5520/*C247 */,/*22986*/5520/*C248 */,/*22987*/5520/*C249 */,/*22988*/5520/*C24A */,/*22989*/5520/*C24B */, /*22990*/5520/*C24C */,/*22991*/5520/*C24D */,/*22992*/5520/*C24E */,/*22993*/5520/*C24F */,/*22994*/5519/* C250 */, /*22995*/5520/* C251 */,/*22996*/5520/*C252 */,/*22997*/5520/*C253 */,/*22998*/5520/*C254 */,/*22999*/5520/*C255 */, /*23000*/5520/*C256 */,/*23001*/5520/*C257 */,/*23002*/5520/*C258 */,/*23003*/5520/*C259 */,/*23004*/5520/*C25A */, /*23005*/5520/*C25B */,/*23006*/5520/*C25C */,/*23007*/5520/*C25D */,/*23008*/5520/*C25E */,/*23009*/5520/*C25F */, /*23010*/5520/*C260 */,/*23011*/5520/*C261 */,/*23012*/5520/*C262 */,/*23013*/5520/*C263 */,/*23014*/5520/*C264 */, /*23015*/5520/*C265 */,/*23016*/5520/*C266 */,/*23017*/5520/*C267 */,/*23018*/5520/*C268 */,/*23019*/5520/*C269 */, /*23020*/5520/*C26A */,/*23021*/5520/*C26B */,/*23022*/5519/* C26C */,/*23023*/5520/* C26D */,/*23024*/5520/*C26E */, /*23025*/5520/*C26F */,/*23026*/5520/*C270 */,/*23027*/5520/*C271 */,/*23028*/5520/*C272 */,/*23029*/5520/*C273 */, /*23030*/5520/*C274 */,/*23031*/5520/*C275 */,/*23032*/5520/*C276 */,/*23033*/5520/*C277 */,/*23034*/5520/*C278 */, /*23035*/5520/*C279 */,/*23036*/5520/*C27A */,/*23037*/5520/*C27B */,/*23038*/5520/*C27C */,/*23039*/5520/*C27D */, /*23040*/5520/*C27E */,/*23041*/5520/*C27F */,/*23042*/5520/*C280 */,/*23043*/5520/*C281 */,/*23044*/5520/*C282 */, /*23045*/5520/*C283 */,/*23046*/5520/*C284 */,/*23047*/5520/*C285 */,/*23048*/5520/*C286 */,/*23049*/5520/*C287 */, /*23050*/5519/* C288 */,/*23051*/5520/* C289 */,/*23052*/5520/*C28A */,/*23053*/5520/*C28B */,/*23054*/5520/*C28C */, /*23055*/5520/*C28D */,/*23056*/5520/*C28E */,/*23057*/5520/*C28F */,/*23058*/5520/*C290 */,/*23059*/5520/*C291 */, /*23060*/5520/*C292 */,/*23061*/5520/*C293 */,/*23062*/5520/*C294 */,/*23063*/5520/*C295 */,/*23064*/5520/*C296 */, /*23065*/5520/*C297 */,/*23066*/5520/*C298 */,/*23067*/5520/*C299 */,/*23068*/5520/*C29A */,/*23069*/5520/*C29B */, /*23070*/5520/*C29C */,/*23071*/5520/*C29D */,/*23072*/5520/*C29E */,/*23073*/5520/*C29F */,/*23074*/5520/*C2A0 */, /*23075*/5520/*C2A1 */,/*23076*/5520/*C2A2 */,/*23077*/5520/*C2A3 */,/*23078*/5519/* C2A4 */,/*23079*/5520/* C2A5 */, /*23080*/5520/*C2A6 */,/*23081*/5520/*C2A7 */,/*23082*/5520/*C2A8 */,/*23083*/5520/*C2A9 */,/*23084*/5520/*C2AA */, /*23085*/5520/*C2AB */,/*23086*/5520/*C2AC */,/*23087*/5520/*C2AD */,/*23088*/5520/*C2AE */,/*23089*/5520/*C2AF */, /*23090*/5520/*C2B0 */,/*23091*/5520/*C2B1 */,/*23092*/5520/*C2B2 */,/*23093*/5520/*C2B3 */,/*23094*/5520/*C2B4 */, /*23095*/5520/*C2B5 */,/*23096*/5520/*C2B6 */,/*23097*/5520/*C2B7 */,/*23098*/5520/*C2B8 */,/*23099*/5520/*C2B9 */, /*23100*/5520/*C2BA */,/*23101*/5520/*C2BB */,/*23102*/5520/*C2BC */,/*23103*/5520/*C2BD */,/*23104*/5520/*C2BE */, /*23105*/5520/*C2BF */,/*23106*/5519/* C2C0 */,/*23107*/5520/* C2C1 */,/*23108*/5520/*C2C2 */,/*23109*/5520/*C2C3 */, /*23110*/5520/*C2C4 */,/*23111*/5520/*C2C5 */,/*23112*/5520/*C2C6 */,/*23113*/5520/*C2C7 */,/*23114*/5520/*C2C8 */, /*23115*/5520/*C2C9 */,/*23116*/5520/*C2CA */,/*23117*/5520/*C2CB */,/*23118*/5520/*C2CC */,/*23119*/5520/*C2CD */, /*23120*/5520/*C2CE */,/*23121*/5520/*C2CF */,/*23122*/5520/*C2D0 */,/*23123*/5520/*C2D1 */,/*23124*/5520/*C2D2 */, /*23125*/5520/*C2D3 */,/*23126*/5520/*C2D4 */,/*23127*/5520/*C2D5 */,/*23128*/5520/*C2D6 */,/*23129*/5520/*C2D7 */, /*23130*/5520/*C2D8 */,/*23131*/5520/*C2D9 */,/*23132*/5520/*C2DA */,/*23133*/5520/*C2DB */,/*23134*/5519/* C2DC */, /*23135*/5520/* C2DD */,/*23136*/5520/*C2DE */,/*23137*/5520/*C2DF */,/*23138*/5520/*C2E0 */,/*23139*/5520/*C2E1 */, /*23140*/5520/*C2E2 */,/*23141*/5520/*C2E3 */,/*23142*/5520/*C2E4 */,/*23143*/5520/*C2E5 */,/*23144*/5520/*C2E6 */, /*23145*/5520/*C2E7 */,/*23146*/5520/*C2E8 */,/*23147*/5520/*C2E9 */,/*23148*/5520/*C2EA */,/*23149*/5520/*C2EB */, /*23150*/5520/*C2EC */,/*23151*/5520/*C2ED */,/*23152*/5520/*C2EE */,/*23153*/5520/*C2EF */,/*23154*/5520/*C2F0 */, /*23155*/5520/*C2F1 */,/*23156*/5520/*C2F2 */,/*23157*/5520/*C2F3 */,/*23158*/5520/*C2F4 */,/*23159*/5520/*C2F5 */, /*23160*/5520/*C2F6 */,/*23161*/5520/*C2F7 */,/*23162*/5519/* C2F8 */,/*23163*/5520/* C2F9 */,/*23164*/5520/*C2FA */, /*23165*/5520/*C2FB */,/*23166*/5520/*C2FC */,/*23167*/5520/*C2FD */,/*23168*/5520/*C2FE */,/*23169*/5520/*C2FF */, /*23170*/5520/*C300 */,/*23171*/5520/*C301 */,/*23172*/5520/*C302 */,/*23173*/5520/*C303 */,/*23174*/5520/*C304 */, /*23175*/5520/*C305 */,/*23176*/5520/*C306 */,/*23177*/5520/*C307 */,/*23178*/5520/*C308 */,/*23179*/5520/*C309 */, /*23180*/5520/*C30A */,/*23181*/5520/*C30B */,/*23182*/5520/*C30C */,/*23183*/5520/*C30D */,/*23184*/5520/*C30E */, /*23185*/5520/*C30F */,/*23186*/5520/*C310 */,/*23187*/5520/*C311 */,/*23188*/5520/*C312 */,/*23189*/5520/*C313 */, /*23190*/5519/* C314 */,/*23191*/5520/* C315 */,/*23192*/5520/*C316 */,/*23193*/5520/*C317 */,/*23194*/5520/*C318 */, /*23195*/5520/*C319 */,/*23196*/5520/*C31A */,/*23197*/5520/*C31B */,/*23198*/5520/*C31C */,/*23199*/5520/*C31D */, /*23200*/5520/*C31E */,/*23201*/5520/*C31F */,/*23202*/5520/*C320 */,/*23203*/5520/*C321 */,/*23204*/5520/*C322 */, /*23205*/5520/*C323 */,/*23206*/5520/*C324 */,/*23207*/5520/*C325 */,/*23208*/5520/*C326 */,/*23209*/5520/*C327 */, /*23210*/5520/*C328 */,/*23211*/5520/*C329 */,/*23212*/5520/*C32A */,/*23213*/5520/*C32B */,/*23214*/5520/*C32C */, /*23215*/5520/*C32D */,/*23216*/5520/*C32E */,/*23217*/5520/*C32F */,/*23218*/5519/* C330 */,/*23219*/5520/* C331 */, /*23220*/5520/*C332 */,/*23221*/5520/*C333 */,/*23222*/5520/*C334 */,/*23223*/5520/*C335 */,/*23224*/5520/*C336 */, /*23225*/5520/*C337 */,/*23226*/5520/*C338 */,/*23227*/5520/*C339 */,/*23228*/5520/*C33A */,/*23229*/5520/*C33B */, /*23230*/5520/*C33C */,/*23231*/5520/*C33D */,/*23232*/5520/*C33E */,/*23233*/5520/*C33F */,/*23234*/5520/*C340 */, /*23235*/5520/*C341 */,/*23236*/5520/*C342 */,/*23237*/5520/*C343 */,/*23238*/5520/*C344 */,/*23239*/5520/*C345 */, /*23240*/5520/*C346 */,/*23241*/5520/*C347 */,/*23242*/5520/*C348 */,/*23243*/5520/*C349 */,/*23244*/5520/*C34A */, /*23245*/5520/*C34B */,/*23246*/5519/* C34C */,/*23247*/5520/* C34D */,/*23248*/5520/*C34E */,/*23249*/5520/*C34F */, /*23250*/5520/*C350 */,/*23251*/5520/*C351 */,/*23252*/5520/*C352 */,/*23253*/5520/*C353 */,/*23254*/5520/*C354 */, /*23255*/5520/*C355 */,/*23256*/5520/*C356 */,/*23257*/5520/*C357 */,/*23258*/5520/*C358 */,/*23259*/5520/*C359 */, /*23260*/5520/*C35A */,/*23261*/5520/*C35B */,/*23262*/5520/*C35C */,/*23263*/5520/*C35D */,/*23264*/5520/*C35E */, /*23265*/5520/*C35F */,/*23266*/5520/*C360 */,/*23267*/5520/*C361 */,/*23268*/5520/*C362 */,/*23269*/5520/*C363 */, /*23270*/5520/*C364 */,/*23271*/5520/*C365 */,/*23272*/5520/*C366 */,/*23273*/5520/*C367 */,/*23274*/5519/* C368 */, /*23275*/5520/* C369 */,/*23276*/5520/*C36A */,/*23277*/5520/*C36B */,/*23278*/5520/*C36C */,/*23279*/5520/*C36D */, /*23280*/5520/*C36E */,/*23281*/5520/*C36F */,/*23282*/5520/*C370 */,/*23283*/5520/*C371 */,/*23284*/5520/*C372 */, /*23285*/5520/*C373 */,/*23286*/5520/*C374 */,/*23287*/5520/*C375 */,/*23288*/5520/*C376 */,/*23289*/5520/*C377 */, /*23290*/5520/*C378 */,/*23291*/5520/*C379 */,/*23292*/5520/*C37A */,/*23293*/5520/*C37B */,/*23294*/5520/*C37C */, /*23295*/5520/*C37D */,/*23296*/5520/*C37E */,/*23297*/5520/*C37F */,/*23298*/5520/*C380 */,/*23299*/5520/*C381 */, /*23300*/5520/*C382 */,/*23301*/5520/*C383 */,/*23302*/5519/* C384 */,/*23303*/5520/* C385 */,/*23304*/5520/*C386 */, /*23305*/5520/*C387 */,/*23306*/5520/*C388 */,/*23307*/5520/*C389 */,/*23308*/5520/*C38A */,/*23309*/5520/*C38B */, /*23310*/5520/*C38C */,/*23311*/5520/*C38D */,/*23312*/5520/*C38E */,/*23313*/5520/*C38F */,/*23314*/5520/*C390 */, /*23315*/5520/*C391 */,/*23316*/5520/*C392 */,/*23317*/5520/*C393 */,/*23318*/5520/*C394 */,/*23319*/5520/*C395 */, /*23320*/5520/*C396 */,/*23321*/5520/*C397 */,/*23322*/5520/*C398 */,/*23323*/5520/*C399 */,/*23324*/5520/*C39A */, /*23325*/5520/*C39B */,/*23326*/5520/*C39C */,/*23327*/5520/*C39D */,/*23328*/5520/*C39E */,/*23329*/5520/*C39F */, /*23330*/5519/* C3A0 */,/*23331*/5520/* C3A1 */,/*23332*/5520/*C3A2 */,/*23333*/5520/*C3A3 */,/*23334*/5520/*C3A4 */, /*23335*/5520/*C3A5 */,/*23336*/5520/*C3A6 */,/*23337*/5520/*C3A7 */,/*23338*/5520/*C3A8 */,/*23339*/5520/*C3A9 */, /*23340*/5520/*C3AA */,/*23341*/5520/*C3AB */,/*23342*/5520/*C3AC */,/*23343*/5520/*C3AD */,/*23344*/5520/*C3AE */, /*23345*/5520/*C3AF */,/*23346*/5520/*C3B0 */,/*23347*/5520/*C3B1 */,/*23348*/5520/*C3B2 */,/*23349*/5520/*C3B3 */, /*23350*/5520/*C3B4 */,/*23351*/5520/*C3B5 */,/*23352*/5520/*C3B6 */,/*23353*/5520/*C3B7 */,/*23354*/5520/*C3B8 */, /*23355*/5520/*C3B9 */,/*23356*/5520/*C3BA */,/*23357*/5520/*C3BB */,/*23358*/5519/* C3BC */,/*23359*/5520/* C3BD */, /*23360*/5520/*C3BE */,/*23361*/5520/*C3BF */,/*23362*/5520/*C3C0 */,/*23363*/5520/*C3C1 */,/*23364*/5520/*C3C2 */, /*23365*/5520/*C3C3 */,/*23366*/5520/*C3C4 */,/*23367*/5520/*C3C5 */,/*23368*/5520/*C3C6 */,/*23369*/5520/*C3C7 */, /*23370*/5520/*C3C8 */,/*23371*/5520/*C3C9 */,/*23372*/5520/*C3CA */,/*23373*/5520/*C3CB */,/*23374*/5520/*C3CC */, /*23375*/5520/*C3CD */,/*23376*/5520/*C3CE */,/*23377*/5520/*C3CF */,/*23378*/5520/*C3D0 */,/*23379*/5520/*C3D1 */, /*23380*/5520/*C3D2 */,/*23381*/5520/*C3D3 */,/*23382*/5520/*C3D4 */,/*23383*/5520/*C3D5 */,/*23384*/5520/*C3D6 */, /*23385*/5520/*C3D7 */,/*23386*/5519/* C3D8 */,/*23387*/5520/* C3D9 */,/*23388*/5520/*C3DA */,/*23389*/5520/*C3DB */, /*23390*/5520/*C3DC */,/*23391*/5520/*C3DD */,/*23392*/5520/*C3DE */,/*23393*/5520/*C3DF */,/*23394*/5520/*C3E0 */, /*23395*/5520/*C3E1 */,/*23396*/5520/*C3E2 */,/*23397*/5520/*C3E3 */,/*23398*/5520/*C3E4 */,/*23399*/5520/*C3E5 */, /*23400*/5520/*C3E6 */,/*23401*/5520/*C3E7 */,/*23402*/5520/*C3E8 */,/*23403*/5520/*C3E9 */,/*23404*/5520/*C3EA */, /*23405*/5520/*C3EB */,/*23406*/5520/*C3EC */,/*23407*/5520/*C3ED */,/*23408*/5520/*C3EE */,/*23409*/5520/*C3EF */, /*23410*/5520/*C3F0 */,/*23411*/5520/*C3F1 */,/*23412*/5520/*C3F2 */,/*23413*/5520/*C3F3 */,/*23414*/5519/* C3F4 */, /*23415*/5520/* C3F5 */,/*23416*/5520/*C3F6 */,/*23417*/5520/*C3F7 */,/*23418*/5520/*C3F8 */,/*23419*/5520/*C3F9 */, /*23420*/5520/*C3FA */,/*23421*/5520/*C3FB */,/*23422*/5520/*C3FC */,/*23423*/5520/*C3FD */,/*23424*/5520/*C3FE */, /*23425*/5520/*C3FF */,/*23426*/5520/*C400 */,/*23427*/5520/*C401 */,/*23428*/5520/*C402 */,/*23429*/5520/*C403 */, /*23430*/5520/*C404 */,/*23431*/5520/*C405 */,/*23432*/5520/*C406 */,/*23433*/5520/*C407 */,/*23434*/5520/*C408 */, /*23435*/5520/*C409 */,/*23436*/5520/*C40A */,/*23437*/5520/*C40B */,/*23438*/5520/*C40C */,/*23439*/5520/*C40D */, /*23440*/5520/*C40E */,/*23441*/5520/*C40F */,/*23442*/5519/* C410 */,/*23443*/5520/* C411 */,/*23444*/5520/*C412 */, /*23445*/5520/*C413 */,/*23446*/5520/*C414 */,/*23447*/5520/*C415 */,/*23448*/5520/*C416 */,/*23449*/5520/*C417 */, /*23450*/5520/*C418 */,/*23451*/5520/*C419 */,/*23452*/5520/*C41A */,/*23453*/5520/*C41B */,/*23454*/5520/*C41C */, /*23455*/5520/*C41D */,/*23456*/5520/*C41E */,/*23457*/5520/*C41F */,/*23458*/5520/*C420 */,/*23459*/5520/*C421 */, /*23460*/5520/*C422 */,/*23461*/5520/*C423 */,/*23462*/5520/*C424 */,/*23463*/5520/*C425 */,/*23464*/5520/*C426 */, /*23465*/5520/*C427 */,/*23466*/5520/*C428 */,/*23467*/5520/*C429 */,/*23468*/5520/*C42A */,/*23469*/5520/*C42B */, /*23470*/5519/* C42C */,/*23471*/5520/* C42D */,/*23472*/5520/*C42E */,/*23473*/5520/*C42F */,/*23474*/5520/*C430 */, /*23475*/5520/*C431 */,/*23476*/5520/*C432 */,/*23477*/5520/*C433 */,/*23478*/5520/*C434 */,/*23479*/5520/*C435 */, /*23480*/5520/*C436 */,/*23481*/5520/*C437 */,/*23482*/5520/*C438 */,/*23483*/5520/*C439 */,/*23484*/5520/*C43A */, /*23485*/5520/*C43B */,/*23486*/5520/*C43C */,/*23487*/5520/*C43D */,/*23488*/5520/*C43E */,/*23489*/5520/*C43F */, /*23490*/5520/*C440 */,/*23491*/5520/*C441 */,/*23492*/5520/*C442 */,/*23493*/5520/*C443 */,/*23494*/5520/*C444 */, /*23495*/5520/*C445 */,/*23496*/5520/*C446 */,/*23497*/5520/*C447 */,/*23498*/5519/* C448 */,/*23499*/5520/* C449 */, /*23500*/5520/*C44A */,/*23501*/5520/*C44B */,/*23502*/5520/*C44C */,/*23503*/5520/*C44D */,/*23504*/5520/*C44E */, /*23505*/5520/*C44F */,/*23506*/5520/*C450 */,/*23507*/5520/*C451 */,/*23508*/5520/*C452 */,/*23509*/5520/*C453 */, /*23510*/5520/*C454 */,/*23511*/5520/*C455 */,/*23512*/5520/*C456 */,/*23513*/5520/*C457 */,/*23514*/5520/*C458 */, /*23515*/5520/*C459 */,/*23516*/5520/*C45A */,/*23517*/5520/*C45B */,/*23518*/5520/*C45C */,/*23519*/5520/*C45D */, /*23520*/5520/*C45E */,/*23521*/5520/*C45F */,/*23522*/5520/*C460 */,/*23523*/5520/*C461 */,/*23524*/5520/*C462 */, /*23525*/5520/*C463 */,/*23526*/5519/* C464 */,/*23527*/5520/* C465 */,/*23528*/5520/*C466 */,/*23529*/5520/*C467 */, /*23530*/5520/*C468 */,/*23531*/5520/*C469 */,/*23532*/5520/*C46A */,/*23533*/5520/*C46B */,/*23534*/5520/*C46C */, /*23535*/5520/*C46D */,/*23536*/5520/*C46E */,/*23537*/5520/*C46F */,/*23538*/5520/*C470 */,/*23539*/5520/*C471 */, /*23540*/5520/*C472 */,/*23541*/5520/*C473 */,/*23542*/5520/*C474 */,/*23543*/5520/*C475 */,/*23544*/5520/*C476 */, /*23545*/5520/*C477 */,/*23546*/5520/*C478 */,/*23547*/5520/*C479 */,/*23548*/5520/*C47A */,/*23549*/5520/*C47B */, /*23550*/5520/*C47C */,/*23551*/5520/*C47D */,/*23552*/5520/*C47E */,/*23553*/5520/*C47F */,/*23554*/5519/* C480 */, /*23555*/5520/* C481 */,/*23556*/5520/*C482 */,/*23557*/5520/*C483 */,/*23558*/5520/*C484 */,/*23559*/5520/*C485 */, /*23560*/5520/*C486 */,/*23561*/5520/*C487 */,/*23562*/5520/*C488 */,/*23563*/5520/*C489 */,/*23564*/5520/*C48A */, /*23565*/5520/*C48B */,/*23566*/5520/*C48C */,/*23567*/5520/*C48D */,/*23568*/5520/*C48E */,/*23569*/5520/*C48F */, /*23570*/5520/*C490 */,/*23571*/5520/*C491 */,/*23572*/5520/*C492 */,/*23573*/5520/*C493 */,/*23574*/5520/*C494 */, /*23575*/5520/*C495 */,/*23576*/5520/*C496 */,/*23577*/5520/*C497 */,/*23578*/5520/*C498 */,/*23579*/5520/*C499 */, /*23580*/5520/*C49A */,/*23581*/5520/*C49B */,/*23582*/5519/* C49C */,/*23583*/5520/* C49D */,/*23584*/5520/*C49E */, /*23585*/5520/*C49F */,/*23586*/5520/*C4A0 */,/*23587*/5520/*C4A1 */,/*23588*/5520/*C4A2 */,/*23589*/5520/*C4A3 */, /*23590*/5520/*C4A4 */,/*23591*/5520/*C4A5 */,/*23592*/5520/*C4A6 */,/*23593*/5520/*C4A7 */,/*23594*/5520/*C4A8 */, /*23595*/5520/*C4A9 */,/*23596*/5520/*C4AA */,/*23597*/5520/*C4AB */,/*23598*/5520/*C4AC */,/*23599*/5520/*C4AD */, /*23600*/5520/*C4AE */,/*23601*/5520/*C4AF */,/*23602*/5520/*C4B0 */,/*23603*/5520/*C4B1 */,/*23604*/5520/*C4B2 */, /*23605*/5520/*C4B3 */,/*23606*/5520/*C4B4 */,/*23607*/5520/*C4B5 */,/*23608*/5520/*C4B6 */,/*23609*/5520/*C4B7 */, /*23610*/5519/* C4B8 */,/*23611*/5520/* C4B9 */,/*23612*/5520/*C4BA */,/*23613*/5520/*C4BB */,/*23614*/5520/*C4BC */, /*23615*/5520/*C4BD */,/*23616*/5520/*C4BE */,/*23617*/5520/*C4BF */,/*23618*/5520/*C4C0 */,/*23619*/5520/*C4C1 */, /*23620*/5520/*C4C2 */,/*23621*/5520/*C4C3 */,/*23622*/5520/*C4C4 */,/*23623*/5520/*C4C5 */,/*23624*/5520/*C4C6 */, /*23625*/5520/*C4C7 */,/*23626*/5520/*C4C8 */,/*23627*/5520/*C4C9 */,/*23628*/5520/*C4CA */,/*23629*/5520/*C4CB */, /*23630*/5520/*C4CC */,/*23631*/5520/*C4CD */,/*23632*/5520/*C4CE */,/*23633*/5520/*C4CF */,/*23634*/5520/*C4D0 */, /*23635*/5520/*C4D1 */,/*23636*/5520/*C4D2 */,/*23637*/5520/*C4D3 */,/*23638*/5519/* C4D4 */,/*23639*/5520/* C4D5 */, /*23640*/5520/*C4D6 */,/*23641*/5520/*C4D7 */,/*23642*/5520/*C4D8 */,/*23643*/5520/*C4D9 */,/*23644*/5520/*C4DA */, /*23645*/5520/*C4DB */,/*23646*/5520/*C4DC */,/*23647*/5520/*C4DD */,/*23648*/5520/*C4DE */,/*23649*/5520/*C4DF */, /*23650*/5520/*C4E0 */,/*23651*/5520/*C4E1 */,/*23652*/5520/*C4E2 */,/*23653*/5520/*C4E3 */,/*23654*/5520/*C4E4 */, /*23655*/5520/*C4E5 */,/*23656*/5520/*C4E6 */,/*23657*/5520/*C4E7 */,/*23658*/5520/*C4E8 */,/*23659*/5520/*C4E9 */, /*23660*/5520/*C4EA */,/*23661*/5520/*C4EB */,/*23662*/5520/*C4EC */,/*23663*/5520/*C4ED */,/*23664*/5520/*C4EE */, /*23665*/5520/*C4EF */,/*23666*/5519/* C4F0 */,/*23667*/5520/* C4F1 */,/*23668*/5520/*C4F2 */,/*23669*/5520/*C4F3 */, /*23670*/5520/*C4F4 */,/*23671*/5520/*C4F5 */,/*23672*/5520/*C4F6 */,/*23673*/5520/*C4F7 */,/*23674*/5520/*C4F8 */, /*23675*/5520/*C4F9 */,/*23676*/5520/*C4FA */,/*23677*/5520/*C4FB */,/*23678*/5520/*C4FC */,/*23679*/5520/*C4FD */, /*23680*/5520/*C4FE */,/*23681*/5520/*C4FF */,/*23682*/5520/*C500 */,/*23683*/5520/*C501 */,/*23684*/5520/*C502 */, /*23685*/5520/*C503 */,/*23686*/5520/*C504 */,/*23687*/5520/*C505 */,/*23688*/5520/*C506 */,/*23689*/5520/*C507 */, /*23690*/5520/*C508 */,/*23691*/5520/*C509 */,/*23692*/5520/*C50A */,/*23693*/5520/*C50B */,/*23694*/5519/* C50C */, /*23695*/5520/* C50D */,/*23696*/5520/*C50E */,/*23697*/5520/*C50F */,/*23698*/5520/*C510 */,/*23699*/5520/*C511 */, /*23700*/5520/*C512 */,/*23701*/5520/*C513 */,/*23702*/5520/*C514 */,/*23703*/5520/*C515 */,/*23704*/5520/*C516 */, /*23705*/5520/*C517 */,/*23706*/5520/*C518 */,/*23707*/5520/*C519 */,/*23708*/5520/*C51A */,/*23709*/5520/*C51B */, /*23710*/5520/*C51C */,/*23711*/5520/*C51D */,/*23712*/5520/*C51E */,/*23713*/5520/*C51F */,/*23714*/5520/*C520 */, /*23715*/5520/*C521 */,/*23716*/5520/*C522 */,/*23717*/5520/*C523 */,/*23718*/5520/*C524 */,/*23719*/5520/*C525 */, /*23720*/5520/*C526 */,/*23721*/5520/*C527 */,/*23722*/5519/* C528 */,/*23723*/5520/* C529 */,/*23724*/5520/*C52A */, /*23725*/5520/*C52B */,/*23726*/5520/*C52C */,/*23727*/5520/*C52D */,/*23728*/5520/*C52E */,/*23729*/5520/*C52F */, /*23730*/5520/*C530 */,/*23731*/5520/*C531 */,/*23732*/5520/*C532 */,/*23733*/5520/*C533 */,/*23734*/5520/*C534 */, /*23735*/5520/*C535 */,/*23736*/5520/*C536 */,/*23737*/5520/*C537 */,/*23738*/5520/*C538 */,/*23739*/5520/*C539 */, /*23740*/5520/*C53A */,/*23741*/5520/*C53B */,/*23742*/5520/*C53C */,/*23743*/5520/*C53D */,/*23744*/5520/*C53E */, /*23745*/5520/*C53F */,/*23746*/5520/*C540 */,/*23747*/5520/*C541 */,/*23748*/5520/*C542 */,/*23749*/5520/*C543 */, /*23750*/5519/* C544 */,/*23751*/5520/* C545 */,/*23752*/5520/*C546 */,/*23753*/5520/*C547 */,/*23754*/5520/*C548 */, /*23755*/5520/*C549 */,/*23756*/5520/*C54A */,/*23757*/5520/*C54B */,/*23758*/5520/*C54C */,/*23759*/5520/*C54D */, /*23760*/5520/*C54E */,/*23761*/5520/*C54F */,/*23762*/5520/*C550 */,/*23763*/5520/*C551 */,/*23764*/5520/*C552 */, /*23765*/5520/*C553 */,/*23766*/5520/*C554 */,/*23767*/5520/*C555 */,/*23768*/5520/*C556 */,/*23769*/5520/*C557 */, /*23770*/5520/*C558 */,/*23771*/5520/*C559 */,/*23772*/5520/*C55A */,/*23773*/5520/*C55B */,/*23774*/5520/*C55C */, /*23775*/5520/*C55D */,/*23776*/5520/*C55E */,/*23777*/5520/*C55F */,/*23778*/5519/* C560 */,/*23779*/5520/* C561 */, /*23780*/5520/*C562 */,/*23781*/5520/*C563 */,/*23782*/5520/*C564 */,/*23783*/5520/*C565 */,/*23784*/5520/*C566 */, /*23785*/5520/*C567 */,/*23786*/5520/*C568 */,/*23787*/5520/*C569 */,/*23788*/5520/*C56A */,/*23789*/5520/*C56B */, /*23790*/5520/*C56C */,/*23791*/5520/*C56D */,/*23792*/5520/*C56E */,/*23793*/5520/*C56F */,/*23794*/5520/*C570 */, /*23795*/5520/*C571 */,/*23796*/5520/*C572 */,/*23797*/5520/*C573 */,/*23798*/5520/*C574 */,/*23799*/5520/*C575 */, /*23800*/5520/*C576 */,/*23801*/5520/*C577 */,/*23802*/5520/*C578 */,/*23803*/5520/*C579 */,/*23804*/5520/*C57A */, /*23805*/5520/*C57B */,/*23806*/5519/* C57C */,/*23807*/5520/* C57D */,/*23808*/5520/*C57E */,/*23809*/5520/*C57F */, /*23810*/5520/*C580 */,/*23811*/5520/*C581 */,/*23812*/5520/*C582 */,/*23813*/5520/*C583 */,/*23814*/5520/*C584 */, /*23815*/5520/*C585 */,/*23816*/5520/*C586 */,/*23817*/5520/*C587 */,/*23818*/5520/*C588 */,/*23819*/5520/*C589 */, /*23820*/5520/*C58A */,/*23821*/5520/*C58B */,/*23822*/5520/*C58C */,/*23823*/5520/*C58D */,/*23824*/5520/*C58E */, /*23825*/5520/*C58F */,/*23826*/5520/*C590 */,/*23827*/5520/*C591 */,/*23828*/5520/*C592 */,/*23829*/5520/*C593 */, /*23830*/5520/*C594 */,/*23831*/5520/*C595 */,/*23832*/5520/*C596 */,/*23833*/5520/*C597 */,/*23834*/5519/* C598 */, /*23835*/5520/* C599 */,/*23836*/5520/*C59A */,/*23837*/5520/*C59B */,/*23838*/5520/*C59C */,/*23839*/5520/*C59D */, /*23840*/5520/*C59E */,/*23841*/5520/*C59F */,/*23842*/5520/*C5A0 */,/*23843*/5520/*C5A1 */,/*23844*/5520/*C5A2 */, /*23845*/5520/*C5A3 */,/*23846*/5520/*C5A4 */,/*23847*/5520/*C5A5 */,/*23848*/5520/*C5A6 */,/*23849*/5520/*C5A7 */, /*23850*/5520/*C5A8 */,/*23851*/5520/*C5A9 */,/*23852*/5520/*C5AA */,/*23853*/5520/*C5AB */,/*23854*/5520/*C5AC */, /*23855*/5520/*C5AD */,/*23856*/5520/*C5AE */,/*23857*/5520/*C5AF */,/*23858*/5520/*C5B0 */,/*23859*/5520/*C5B1 */, /*23860*/5520/*C5B2 */,/*23861*/5520/*C5B3 */,/*23862*/5519/* C5B4 */,/*23863*/5520/* C5B5 */,/*23864*/5520/*C5B6 */, /*23865*/5520/*C5B7 */,/*23866*/5520/*C5B8 */,/*23867*/5520/*C5B9 */,/*23868*/5520/*C5BA */,/*23869*/5520/*C5BB */, /*23870*/5520/*C5BC */,/*23871*/5520/*C5BD */,/*23872*/5520/*C5BE */,/*23873*/5520/*C5BF */,/*23874*/5520/*C5C0 */, /*23875*/5520/*C5C1 */,/*23876*/5520/*C5C2 */,/*23877*/5520/*C5C3 */,/*23878*/5520/*C5C4 */,/*23879*/5520/*C5C5 */, /*23880*/5520/*C5C6 */,/*23881*/5520/*C5C7 */,/*23882*/5520/*C5C8 */,/*23883*/5520/*C5C9 */,/*23884*/5520/*C5CA */, /*23885*/5520/*C5CB */,/*23886*/5520/*C5CC */,/*23887*/5520/*C5CD */,/*23888*/5520/*C5CE */,/*23889*/5520/*C5CF */, /*23890*/5519/* C5D0 */,/*23891*/5520/* C5D1 */,/*23892*/5520/*C5D2 */,/*23893*/5520/*C5D3 */,/*23894*/5520/*C5D4 */, /*23895*/5520/*C5D5 */,/*23896*/5520/*C5D6 */,/*23897*/5520/*C5D7 */,/*23898*/5520/*C5D8 */,/*23899*/5520/*C5D9 */, /*23900*/5520/*C5DA */,/*23901*/5520/*C5DB */,/*23902*/5520/*C5DC */,/*23903*/5520/*C5DD */,/*23904*/5520/*C5DE */, /*23905*/5520/*C5DF */,/*23906*/5520/*C5E0 */,/*23907*/5520/*C5E1 */,/*23908*/5520/*C5E2 */,/*23909*/5520/*C5E3 */, /*23910*/5520/*C5E4 */,/*23911*/5520/*C5E5 */,/*23912*/5520/*C5E6 */,/*23913*/5520/*C5E7 */,/*23914*/5520/*C5E8 */, /*23915*/5520/*C5E9 */,/*23916*/5520/*C5EA */,/*23917*/5520/*C5EB */,/*23918*/5519/* C5EC */,/*23919*/5520/* C5ED */, /*23920*/5520/*C5EE */,/*23921*/5520/*C5EF */,/*23922*/5520/*C5F0 */,/*23923*/5520/*C5F1 */,/*23924*/5520/*C5F2 */, /*23925*/5520/*C5F3 */,/*23926*/5520/*C5F4 */,/*23927*/5520/*C5F5 */,/*23928*/5520/*C5F6 */,/*23929*/5520/*C5F7 */, /*23930*/5520/*C5F8 */,/*23931*/5520/*C5F9 */,/*23932*/5520/*C5FA */,/*23933*/5520/*C5FB */,/*23934*/5520/*C5FC */, /*23935*/5520/*C5FD */,/*23936*/5520/*C5FE */,/*23937*/5520/*C5FF */,/*23938*/5520/*C600 */,/*23939*/5520/*C601 */, /*23940*/5520/*C602 */,/*23941*/5520/*C603 */,/*23942*/5520/*C604 */,/*23943*/5520/*C605 */,/*23944*/5520/*C606 */, /*23945*/5520/*C607 */,/*23946*/5519/* C608 */,/*23947*/5520/* C609 */,/*23948*/5520/*C60A */,/*23949*/5520/*C60B */, /*23950*/5520/*C60C */,/*23951*/5520/*C60D */,/*23952*/5520/*C60E */,/*23953*/5520/*C60F */,/*23954*/5520/*C610 */, /*23955*/5520/*C611 */,/*23956*/5520/*C612 */,/*23957*/5520/*C613 */,/*23958*/5520/*C614 */,/*23959*/5520/*C615 */, /*23960*/5520/*C616 */,/*23961*/5520/*C617 */,/*23962*/5520/*C618 */,/*23963*/5520/*C619 */,/*23964*/5520/*C61A */, /*23965*/5520/*C61B */,/*23966*/5520/*C61C */,/*23967*/5520/*C61D */,/*23968*/5520/*C61E */,/*23969*/5520/*C61F */, /*23970*/5520/*C620 */,/*23971*/5520/*C621 */,/*23972*/5520/*C622 */,/*23973*/5520/*C623 */,/*23974*/5519/* C624 */, /*23975*/5520/* C625 */,/*23976*/5520/*C626 */,/*23977*/5520/*C627 */,/*23978*/5520/*C628 */,/*23979*/5520/*C629 */, /*23980*/5520/*C62A */,/*23981*/5520/*C62B */,/*23982*/5520/*C62C */,/*23983*/5520/*C62D */,/*23984*/5520/*C62E */, /*23985*/5520/*C62F */,/*23986*/5520/*C630 */,/*23987*/5520/*C631 */,/*23988*/5520/*C632 */,/*23989*/5520/*C633 */, /*23990*/5520/*C634 */,/*23991*/5520/*C635 */,/*23992*/5520/*C636 */,/*23993*/5520/*C637 */,/*23994*/5520/*C638 */, /*23995*/5520/*C639 */,/*23996*/5520/*C63A */,/*23997*/5520/*C63B */,/*23998*/5520/*C63C */,/*23999*/5520/*C63D */, /*24000*/5520/*C63E */,/*24001*/5520/*C63F */,/*24002*/5519/* C640 */,/*24003*/5520/* C641 */,/*24004*/5520/*C642 */, /*24005*/5520/*C643 */,/*24006*/5520/*C644 */,/*24007*/5520/*C645 */,/*24008*/5520/*C646 */,/*24009*/5520/*C647 */, /*24010*/5520/*C648 */,/*24011*/5520/*C649 */,/*24012*/5520/*C64A */,/*24013*/5520/*C64B */,/*24014*/5520/*C64C */, /*24015*/5520/*C64D */,/*24016*/5520/*C64E */,/*24017*/5520/*C64F */,/*24018*/5520/*C650 */,/*24019*/5520/*C651 */, /*24020*/5520/*C652 */,/*24021*/5520/*C653 */,/*24022*/5520/*C654 */,/*24023*/5520/*C655 */,/*24024*/5520/*C656 */, /*24025*/5520/*C657 */,/*24026*/5520/*C658 */,/*24027*/5520/*C659 */,/*24028*/5520/*C65A */,/*24029*/5520/*C65B */, /*24030*/5519/* C65C */,/*24031*/5520/* C65D */,/*24032*/5520/*C65E */,/*24033*/5520/*C65F */,/*24034*/5520/*C660 */, /*24035*/5520/*C661 */,/*24036*/5520/*C662 */,/*24037*/5520/*C663 */,/*24038*/5520/*C664 */,/*24039*/5520/*C665 */, /*24040*/5520/*C666 */,/*24041*/5520/*C667 */,/*24042*/5520/*C668 */,/*24043*/5520/*C669 */,/*24044*/5520/*C66A */, /*24045*/5520/*C66B */,/*24046*/5520/*C66C */,/*24047*/5520/*C66D */,/*24048*/5520/*C66E */,/*24049*/5520/*C66F */, /*24050*/5520/*C670 */,/*24051*/5520/*C671 */,/*24052*/5520/*C672 */,/*24053*/5520/*C673 */,/*24054*/5520/*C674 */, /*24055*/5520/*C675 */,/*24056*/5520/*C676 */,/*24057*/5520/*C677 */,/*24058*/5519/* C678 */,/*24059*/5520/* C679 */, /*24060*/5520/*C67A */,/*24061*/5520/*C67B */,/*24062*/5520/*C67C */,/*24063*/5520/*C67D */,/*24064*/5520/*C67E */, /*24065*/5520/*C67F */,/*24066*/5520/*C680 */,/*24067*/5520/*C681 */,/*24068*/5520/*C682 */,/*24069*/5520/*C683 */, /*24070*/5520/*C684 */,/*24071*/5520/*C685 */,/*24072*/5520/*C686 */,/*24073*/5520/*C687 */,/*24074*/5520/*C688 */, /*24075*/5520/*C689 */,/*24076*/5520/*C68A */,/*24077*/5520/*C68B */,/*24078*/5520/*C68C */,/*24079*/5520/*C68D */, /*24080*/5520/*C68E */,/*24081*/5520/*C68F */,/*24082*/5520/*C690 */,/*24083*/5520/*C691 */,/*24084*/5520/*C692 */, /*24085*/5520/*C693 */,/*24086*/5519/* C694 */,/*24087*/5520/* C695 */,/*24088*/5520/*C696 */,/*24089*/5520/*C697 */, /*24090*/5520/*C698 */,/*24091*/5520/*C699 */,/*24092*/5520/*C69A */,/*24093*/5520/*C69B */,/*24094*/5520/*C69C */, /*24095*/5520/*C69D */,/*24096*/5520/*C69E */,/*24097*/5520/*C69F */,/*24098*/5520/*C6A0 */,/*24099*/5520/*C6A1 */, /*24100*/5520/*C6A2 */,/*24101*/5520/*C6A3 */,/*24102*/5520/*C6A4 */,/*24103*/5520/*C6A5 */,/*24104*/5520/*C6A6 */, /*24105*/5520/*C6A7 */,/*24106*/5520/*C6A8 */,/*24107*/5520/*C6A9 */,/*24108*/5520/*C6AA */,/*24109*/5520/*C6AB */, /*24110*/5520/*C6AC */,/*24111*/5520/*C6AD */,/*24112*/5520/*C6AE */,/*24113*/5520/*C6AF */,/*24114*/5519/* C6B0 */, /*24115*/5520/* C6B1 */,/*24116*/5520/*C6B2 */,/*24117*/5520/*C6B3 */,/*24118*/5520/*C6B4 */,/*24119*/5520/*C6B5 */, /*24120*/5520/*C6B6 */,/*24121*/5520/*C6B7 */,/*24122*/5520/*C6B8 */,/*24123*/5520/*C6B9 */,/*24124*/5520/*C6BA */, /*24125*/5520/*C6BB */,/*24126*/5520/*C6BC */,/*24127*/5520/*C6BD */,/*24128*/5520/*C6BE */,/*24129*/5520/*C6BF */, /*24130*/5520/*C6C0 */,/*24131*/5520/*C6C1 */,/*24132*/5520/*C6C2 */,/*24133*/5520/*C6C3 */,/*24134*/5520/*C6C4 */, /*24135*/5520/*C6C5 */,/*24136*/5520/*C6C6 */,/*24137*/5520/*C6C7 */,/*24138*/5520/*C6C8 */,/*24139*/5520/*C6C9 */, /*24140*/5520/*C6CA */,/*24141*/5520/*C6CB */,/*24142*/5519/* C6CC */,/*24143*/5520/* C6CD */,/*24144*/5520/*C6CE */, /*24145*/5520/*C6CF */,/*24146*/5520/*C6D0 */,/*24147*/5520/*C6D1 */,/*24148*/5520/*C6D2 */,/*24149*/5520/*C6D3 */, /*24150*/5520/*C6D4 */,/*24151*/5520/*C6D5 */,/*24152*/5520/*C6D6 */,/*24153*/5520/*C6D7 */,/*24154*/5520/*C6D8 */, /*24155*/5520/*C6D9 */,/*24156*/5520/*C6DA */,/*24157*/5520/*C6DB */,/*24158*/5520/*C6DC */,/*24159*/5520/*C6DD */, /*24160*/5520/*C6DE */,/*24161*/5520/*C6DF */,/*24162*/5520/*C6E0 */,/*24163*/5520/*C6E1 */,/*24164*/5520/*C6E2 */, /*24165*/5520/*C6E3 */,/*24166*/5520/*C6E4 */,/*24167*/5520/*C6E5 */,/*24168*/5520/*C6E6 */,/*24169*/5520/*C6E7 */, /*24170*/5519/* C6E8 */,/*24171*/5520/* C6E9 */,/*24172*/5520/*C6EA */,/*24173*/5520/*C6EB */,/*24174*/5520/*C6EC */, /*24175*/5520/*C6ED */,/*24176*/5520/*C6EE */,/*24177*/5520/*C6EF */,/*24178*/5520/*C6F0 */,/*24179*/5520/*C6F1 */, /*24180*/5520/*C6F2 */,/*24181*/5520/*C6F3 */,/*24182*/5520/*C6F4 */,/*24183*/5520/*C6F5 */,/*24184*/5520/*C6F6 */, /*24185*/5520/*C6F7 */,/*24186*/5520/*C6F8 */,/*24187*/5520/*C6F9 */,/*24188*/5520/*C6FA */,/*24189*/5520/*C6FB */, /*24190*/5520/*C6FC */,/*24191*/5520/*C6FD */,/*24192*/5520/*C6FE */,/*24193*/5520/*C6FF */,/*24194*/5520/*C700 */, /*24195*/5520/*C701 */,/*24196*/5520/*C702 */,/*24197*/5520/*C703 */,/*24198*/5519/* C704 */,/*24199*/5520/* C705 */, /*24200*/5520/*C706 */,/*24201*/5520/*C707 */,/*24202*/5520/*C708 */,/*24203*/5520/*C709 */,/*24204*/5520/*C70A */, /*24205*/5520/*C70B */,/*24206*/5520/*C70C */,/*24207*/5520/*C70D */,/*24208*/5520/*C70E */,/*24209*/5520/*C70F */, /*24210*/5520/*C710 */,/*24211*/5520/*C711 */,/*24212*/5520/*C712 */,/*24213*/5520/*C713 */,/*24214*/5520/*C714 */, /*24215*/5520/*C715 */,/*24216*/5520/*C716 */,/*24217*/5520/*C717 */,/*24218*/5520/*C718 */,/*24219*/5520/*C719 */, /*24220*/5520/*C71A */,/*24221*/5520/*C71B */,/*24222*/5520/*C71C */,/*24223*/5520/*C71D */,/*24224*/5520/*C71E */, /*24225*/5520/*C71F */,/*24226*/5519/* C720 */,/*24227*/5520/* C721 */,/*24228*/5520/*C722 */,/*24229*/5520/*C723 */, /*24230*/5520/*C724 */,/*24231*/5520/*C725 */,/*24232*/5520/*C726 */,/*24233*/5520/*C727 */,/*24234*/5520/*C728 */, /*24235*/5520/*C729 */,/*24236*/5520/*C72A */,/*24237*/5520/*C72B */,/*24238*/5520/*C72C */,/*24239*/5520/*C72D */, /*24240*/5520/*C72E */,/*24241*/5520/*C72F */,/*24242*/5520/*C730 */,/*24243*/5520/*C731 */,/*24244*/5520/*C732 */, /*24245*/5520/*C733 */,/*24246*/5520/*C734 */,/*24247*/5520/*C735 */,/*24248*/5520/*C736 */,/*24249*/5520/*C737 */, /*24250*/5520/*C738 */,/*24251*/5520/*C739 */,/*24252*/5520/*C73A */,/*24253*/5520/*C73B */,/*24254*/5519/* C73C */, /*24255*/5520/* C73D */,/*24256*/5520/*C73E */,/*24257*/5520/*C73F */,/*24258*/5520/*C740 */,/*24259*/5520/*C741 */, /*24260*/5520/*C742 */,/*24261*/5520/*C743 */,/*24262*/5520/*C744 */,/*24263*/5520/*C745 */,/*24264*/5520/*C746 */, /*24265*/5520/*C747 */,/*24266*/5520/*C748 */,/*24267*/5520/*C749 */,/*24268*/5520/*C74A */,/*24269*/5520/*C74B */, /*24270*/5520/*C74C */,/*24271*/5520/*C74D */,/*24272*/5520/*C74E */,/*24273*/5520/*C74F */,/*24274*/5520/*C750 */, /*24275*/5520/*C751 */,/*24276*/5520/*C752 */,/*24277*/5520/*C753 */,/*24278*/5520/*C754 */,/*24279*/5520/*C755 */, /*24280*/5520/*C756 */,/*24281*/5520/*C757 */,/*24282*/5519/* C758 */,/*24283*/5520/* C759 */,/*24284*/5520/*C75A */, /*24285*/5520/*C75B */,/*24286*/5520/*C75C */,/*24287*/5520/*C75D */,/*24288*/5520/*C75E */,/*24289*/5520/*C75F */, /*24290*/5520/*C760 */,/*24291*/5520/*C761 */,/*24292*/5520/*C762 */,/*24293*/5520/*C763 */,/*24294*/5520/*C764 */, /*24295*/5520/*C765 */,/*24296*/5520/*C766 */,/*24297*/5520/*C767 */,/*24298*/5520/*C768 */,/*24299*/5520/*C769 */, /*24300*/5520/*C76A */,/*24301*/5520/*C76B */,/*24302*/5520/*C76C */,/*24303*/5520/*C76D */,/*24304*/5520/*C76E */, /*24305*/5520/*C76F */,/*24306*/5520/*C770 */,/*24307*/5520/*C771 */,/*24308*/5520/*C772 */,/*24309*/5520/*C773 */, /*24310*/5519/* C774 */,/*24311*/5520/* C775 */,/*24312*/5520/*C776 */,/*24313*/5520/*C777 */,/*24314*/5520/*C778 */, /*24315*/5520/*C779 */,/*24316*/5520/*C77A */,/*24317*/5520/*C77B */,/*24318*/5520/*C77C */,/*24319*/5520/*C77D */, /*24320*/5520/*C77E */,/*24321*/5520/*C77F */,/*24322*/5520/*C780 */,/*24323*/5520/*C781 */,/*24324*/5520/*C782 */, /*24325*/5520/*C783 */,/*24326*/5520/*C784 */,/*24327*/5520/*C785 */,/*24328*/5520/*C786 */,/*24329*/5520/*C787 */, /*24330*/5520/*C788 */,/*24331*/5520/*C789 */,/*24332*/5520/*C78A */,/*24333*/5520/*C78B */,/*24334*/5520/*C78C */, /*24335*/5520/*C78D */,/*24336*/5520/*C78E */,/*24337*/5520/*C78F */,/*24338*/5519/* C790 */,/*24339*/5520/* C791 */, /*24340*/5520/*C792 */,/*24341*/5520/*C793 */,/*24342*/5520/*C794 */,/*24343*/5520/*C795 */,/*24344*/5520/*C796 */, /*24345*/5520/*C797 */,/*24346*/5520/*C798 */,/*24347*/5520/*C799 */,/*24348*/5520/*C79A */,/*24349*/5520/*C79B */, /*24350*/5520/*C79C */,/*24351*/5520/*C79D */,/*24352*/5520/*C79E */,/*24353*/5520/*C79F */,/*24354*/5520/*C7A0 */, /*24355*/5520/*C7A1 */,/*24356*/5520/*C7A2 */,/*24357*/5520/*C7A3 */,/*24358*/5520/*C7A4 */,/*24359*/5520/*C7A5 */, /*24360*/5520/*C7A6 */,/*24361*/5520/*C7A7 */,/*24362*/5520/*C7A8 */,/*24363*/5520/*C7A9 */,/*24364*/5520/*C7AA */, /*24365*/5520/*C7AB */,/*24366*/5519/* C7AC */,/*24367*/5520/* C7AD */,/*24368*/5520/*C7AE */,/*24369*/5520/*C7AF */, /*24370*/5520/*C7B0 */,/*24371*/5520/*C7B1 */,/*24372*/5520/*C7B2 */,/*24373*/5520/*C7B3 */,/*24374*/5520/*C7B4 */, /*24375*/5520/*C7B5 */,/*24376*/5520/*C7B6 */,/*24377*/5520/*C7B7 */,/*24378*/5520/*C7B8 */,/*24379*/5520/*C7B9 */, /*24380*/5520/*C7BA */,/*24381*/5520/*C7BB */,/*24382*/5520/*C7BC */,/*24383*/5520/*C7BD */,/*24384*/5520/*C7BE */, /*24385*/5520/*C7BF */,/*24386*/5520/*C7C0 */,/*24387*/5520/*C7C1 */,/*24388*/5520/*C7C2 */,/*24389*/5520/*C7C3 */, /*24390*/5520/*C7C4 */,/*24391*/5520/*C7C5 */,/*24392*/5520/*C7C6 */,/*24393*/5520/*C7C7 */,/*24394*/5519/* C7C8 */, /*24395*/5520/* C7C9 */,/*24396*/5520/*C7CA */,/*24397*/5520/*C7CB */,/*24398*/5520/*C7CC */,/*24399*/5520/*C7CD */, /*24400*/5520/*C7CE */,/*24401*/5520/*C7CF */,/*24402*/5520/*C7D0 */,/*24403*/5520/*C7D1 */,/*24404*/5520/*C7D2 */, /*24405*/5520/*C7D3 */,/*24406*/5520/*C7D4 */,/*24407*/5520/*C7D5 */,/*24408*/5520/*C7D6 */,/*24409*/5520/*C7D7 */, /*24410*/5520/*C7D8 */,/*24411*/5520/*C7D9 */,/*24412*/5520/*C7DA */,/*24413*/5520/*C7DB */,/*24414*/5520/*C7DC */, /*24415*/5520/*C7DD */,/*24416*/5520/*C7DE */,/*24417*/5520/*C7DF */,/*24418*/5520/*C7E0 */,/*24419*/5520/*C7E1 */, /*24420*/5520/*C7E2 */,/*24421*/5520/*C7E3 */,/*24422*/5519/* C7E4 */,/*24423*/5520/* C7E5 */,/*24424*/5520/*C7E6 */, /*24425*/5520/*C7E7 */,/*24426*/5520/*C7E8 */,/*24427*/5520/*C7E9 */,/*24428*/5520/*C7EA */,/*24429*/5520/*C7EB */, /*24430*/5520/*C7EC */,/*24431*/5520/*C7ED */,/*24432*/5520/*C7EE */,/*24433*/5520/*C7EF */,/*24434*/5520/*C7F0 */, /*24435*/5520/*C7F1 */,/*24436*/5520/*C7F2 */,/*24437*/5520/*C7F3 */,/*24438*/5520/*C7F4 */,/*24439*/5520/*C7F5 */, /*24440*/5520/*C7F6 */,/*24441*/5520/*C7F7 */,/*24442*/5520/*C7F8 */,/*24443*/5520/*C7F9 */,/*24444*/5520/*C7FA */, /*24445*/5520/*C7FB */,/*24446*/5520/*C7FC */,/*24447*/5520/*C7FD */,/*24448*/5520/*C7FE */,/*24449*/5520/*C7FF */, /*24450*/5519/* C800 */,/*24451*/5520/* C801 */,/*24452*/5520/*C802 */,/*24453*/5520/*C803 */,/*24454*/5520/*C804 */, /*24455*/5520/*C805 */,/*24456*/5520/*C806 */,/*24457*/5520/*C807 */,/*24458*/5520/*C808 */,/*24459*/5520/*C809 */, /*24460*/5520/*C80A */,/*24461*/5520/*C80B */,/*24462*/5520/*C80C */,/*24463*/5520/*C80D */,/*24464*/5520/*C80E */, /*24465*/5520/*C80F */,/*24466*/5520/*C810 */,/*24467*/5520/*C811 */,/*24468*/5520/*C812 */,/*24469*/5520/*C813 */, /*24470*/5520/*C814 */,/*24471*/5520/*C815 */,/*24472*/5520/*C816 */,/*24473*/5520/*C817 */,/*24474*/5520/*C818 */, /*24475*/5520/*C819 */,/*24476*/5520/*C81A */,/*24477*/5520/*C81B */,/*24478*/5519/* C81C */,/*24479*/5520/* C81D */, /*24480*/5520/*C81E */,/*24481*/5520/*C81F */,/*24482*/5520/*C820 */,/*24483*/5520/*C821 */,/*24484*/5520/*C822 */, /*24485*/5520/*C823 */,/*24486*/5520/*C824 */,/*24487*/5520/*C825 */,/*24488*/5520/*C826 */,/*24489*/5520/*C827 */, /*24490*/5520/*C828 */,/*24491*/5520/*C829 */,/*24492*/5520/*C82A */,/*24493*/5520/*C82B */,/*24494*/5520/*C82C */, /*24495*/5520/*C82D */,/*24496*/5520/*C82E */,/*24497*/5520/*C82F */,/*24498*/5520/*C830 */,/*24499*/5520/*C831 */, /*24500*/5520/*C832 */,/*24501*/5520/*C833 */,/*24502*/5520/*C834 */,/*24503*/5520/*C835 */,/*24504*/5520/*C836 */, /*24505*/5520/*C837 */,/*24506*/5519/* C838 */,/*24507*/5520/* C839 */,/*24508*/5520/*C83A */,/*24509*/5520/*C83B */, /*24510*/5520/*C83C */,/*24511*/5520/*C83D */,/*24512*/5520/*C83E */,/*24513*/5520/*C83F */,/*24514*/5520/*C840 */, /*24515*/5520/*C841 */,/*24516*/5520/*C842 */,/*24517*/5520/*C843 */,/*24518*/5520/*C844 */,/*24519*/5520/*C845 */, /*24520*/5520/*C846 */,/*24521*/5520/*C847 */,/*24522*/5520/*C848 */,/*24523*/5520/*C849 */,/*24524*/5520/*C84A */, /*24525*/5520/*C84B */,/*24526*/5520/*C84C */,/*24527*/5520/*C84D */,/*24528*/5520/*C84E */,/*24529*/5520/*C84F */, /*24530*/5520/*C850 */,/*24531*/5520/*C851 */,/*24532*/5520/*C852 */,/*24533*/5520/*C853 */,/*24534*/5519/* C854 */, /*24535*/5520/* C855 */,/*24536*/5520/*C856 */,/*24537*/5520/*C857 */,/*24538*/5520/*C858 */,/*24539*/5520/*C859 */, /*24540*/5520/*C85A */,/*24541*/5520/*C85B */,/*24542*/5520/*C85C */,/*24543*/5520/*C85D */,/*24544*/5520/*C85E */, /*24545*/5520/*C85F */,/*24546*/5520/*C860 */,/*24547*/5520/*C861 */,/*24548*/5520/*C862 */,/*24549*/5520/*C863 */, /*24550*/5520/*C864 */,/*24551*/5520/*C865 */,/*24552*/5520/*C866 */,/*24553*/5520/*C867 */,/*24554*/5520/*C868 */, /*24555*/5520/*C869 */,/*24556*/5520/*C86A */,/*24557*/5520/*C86B */,/*24558*/5520/*C86C */,/*24559*/5520/*C86D */, /*24560*/5520/*C86E */,/*24561*/5520/*C86F */,/*24562*/5519/* C870 */,/*24563*/5520/* C871 */,/*24564*/5520/*C872 */, /*24565*/5520/*C873 */,/*24566*/5520/*C874 */,/*24567*/5520/*C875 */,/*24568*/5520/*C876 */,/*24569*/5520/*C877 */, /*24570*/5520/*C878 */,/*24571*/5520/*C879 */,/*24572*/5520/*C87A */,/*24573*/5520/*C87B */,/*24574*/5520/*C87C */, /*24575*/5520/*C87D */,/*24576*/5520/*C87E */,/*24577*/5520/*C87F */,/*24578*/5520/*C880 */,/*24579*/5520/*C881 */, /*24580*/5520/*C882 */,/*24581*/5520/*C883 */,/*24582*/5520/*C884 */,/*24583*/5520/*C885 */,/*24584*/5520/*C886 */, /*24585*/5520/*C887 */,/*24586*/5520/*C888 */,/*24587*/5520/*C889 */,/*24588*/5520/*C88A */,/*24589*/5520/*C88B */, /*24590*/5519/* C88C */,/*24591*/5520/* C88D */,/*24592*/5520/*C88E */,/*24593*/5520/*C88F */,/*24594*/5520/*C890 */, /*24595*/5520/*C891 */,/*24596*/5520/*C892 */,/*24597*/5520/*C893 */,/*24598*/5520/*C894 */,/*24599*/5520/*C895 */, /*24600*/5520/*C896 */,/*24601*/5520/*C897 */,/*24602*/5520/*C898 */,/*24603*/5520/*C899 */,/*24604*/5520/*C89A */, /*24605*/5520/*C89B */,/*24606*/5520/*C89C */,/*24607*/5520/*C89D */,/*24608*/5520/*C89E */,/*24609*/5520/*C89F */, /*24610*/5520/*C8A0 */,/*24611*/5520/*C8A1 */,/*24612*/5520/*C8A2 */,/*24613*/5520/*C8A3 */,/*24614*/5520/*C8A4 */, /*24615*/5520/*C8A5 */,/*24616*/5520/*C8A6 */,/*24617*/5520/*C8A7 */,/*24618*/5519/* C8A8 */,/*24619*/5520/* C8A9 */, /*24620*/5520/*C8AA */,/*24621*/5520/*C8AB */,/*24622*/5520/*C8AC */,/*24623*/5520/*C8AD */,/*24624*/5520/*C8AE */, /*24625*/5520/*C8AF */,/*24626*/5520/*C8B0 */,/*24627*/5520/*C8B1 */,/*24628*/5520/*C8B2 */,/*24629*/5520/*C8B3 */, /*24630*/5520/*C8B4 */,/*24631*/5520/*C8B5 */,/*24632*/5520/*C8B6 */,/*24633*/5520/*C8B7 */,/*24634*/5520/*C8B8 */, /*24635*/5520/*C8B9 */,/*24636*/5520/*C8BA */,/*24637*/5520/*C8BB */,/*24638*/5520/*C8BC */,/*24639*/5520/*C8BD */, /*24640*/5520/*C8BE */,/*24641*/5520/*C8BF */,/*24642*/5520/*C8C0 */,/*24643*/5520/*C8C1 */,/*24644*/5520/*C8C2 */, /*24645*/5520/*C8C3 */,/*24646*/5519/* C8C4 */,/*24647*/5520/* C8C5 */,/*24648*/5520/*C8C6 */,/*24649*/5520/*C8C7 */, /*24650*/5520/*C8C8 */,/*24651*/5520/*C8C9 */,/*24652*/5520/*C8CA */,/*24653*/5520/*C8CB */,/*24654*/5520/*C8CC */, /*24655*/5520/*C8CD */,/*24656*/5520/*C8CE */,/*24657*/5520/*C8CF */,/*24658*/5520/*C8D0 */,/*24659*/5520/*C8D1 */, /*24660*/5520/*C8D2 */,/*24661*/5520/*C8D3 */,/*24662*/5520/*C8D4 */,/*24663*/5520/*C8D5 */,/*24664*/5520/*C8D6 */, /*24665*/5520/*C8D7 */,/*24666*/5520/*C8D8 */,/*24667*/5520/*C8D9 */,/*24668*/5520/*C8DA */,/*24669*/5520/*C8DB */, /*24670*/5520/*C8DC */,/*24671*/5520/*C8DD */,/*24672*/5520/*C8DE */,/*24673*/5520/*C8DF */,/*24674*/5519/* C8E0 */, /*24675*/5520/* C8E1 */,/*24676*/5520/*C8E2 */,/*24677*/5520/*C8E3 */,/*24678*/5520/*C8E4 */,/*24679*/5520/*C8E5 */, /*24680*/5520/*C8E6 */,/*24681*/5520/*C8E7 */,/*24682*/5520/*C8E8 */,/*24683*/5520/*C8E9 */,/*24684*/5520/*C8EA */, /*24685*/5520/*C8EB */,/*24686*/5520/*C8EC */,/*24687*/5520/*C8ED */,/*24688*/5520/*C8EE */,/*24689*/5520/*C8EF */, /*24690*/5520/*C8F0 */,/*24691*/5520/*C8F1 */,/*24692*/5520/*C8F2 */,/*24693*/5520/*C8F3 */,/*24694*/5520/*C8F4 */, /*24695*/5520/*C8F5 */,/*24696*/5520/*C8F6 */,/*24697*/5520/*C8F7 */,/*24698*/5520/*C8F8 */,/*24699*/5520/*C8F9 */, /*24700*/5520/*C8FA */,/*24701*/5520/*C8FB */,/*24702*/5519/* C8FC */,/*24703*/5520/* C8FD */,/*24704*/5520/*C8FE */, /*24705*/5520/*C8FF */,/*24706*/5520/*C900 */,/*24707*/5520/*C901 */,/*24708*/5520/*C902 */,/*24709*/5520/*C903 */, /*24710*/5520/*C904 */,/*24711*/5520/*C905 */,/*24712*/5520/*C906 */,/*24713*/5520/*C907 */,/*24714*/5520/*C908 */, /*24715*/5520/*C909 */,/*24716*/5520/*C90A */,/*24717*/5520/*C90B */,/*24718*/5520/*C90C */,/*24719*/5520/*C90D */, /*24720*/5520/*C90E */,/*24721*/5520/*C90F */,/*24722*/5520/*C910 */,/*24723*/5520/*C911 */,/*24724*/5520/*C912 */, /*24725*/5520/*C913 */,/*24726*/5520/*C914 */,/*24727*/5520/*C915 */,/*24728*/5520/*C916 */,/*24729*/5520/*C917 */, /*24730*/5519/* C918 */,/*24731*/5520/* C919 */,/*24732*/5520/*C91A */,/*24733*/5520/*C91B */,/*24734*/5520/*C91C */, /*24735*/5520/*C91D */,/*24736*/5520/*C91E */,/*24737*/5520/*C91F */,/*24738*/5520/*C920 */,/*24739*/5520/*C921 */, /*24740*/5520/*C922 */,/*24741*/5520/*C923 */,/*24742*/5520/*C924 */,/*24743*/5520/*C925 */,/*24744*/5520/*C926 */, /*24745*/5520/*C927 */,/*24746*/5520/*C928 */,/*24747*/5520/*C929 */,/*24748*/5520/*C92A */,/*24749*/5520/*C92B */, /*24750*/5520/*C92C */,/*24751*/5520/*C92D */,/*24752*/5520/*C92E */,/*24753*/5520/*C92F */,/*24754*/5520/*C930 */, /*24755*/5520/*C931 */,/*24756*/5520/*C932 */,/*24757*/5520/*C933 */,/*24758*/5519/* C934 */,/*24759*/5520/* C935 */, /*24760*/5520/*C936 */,/*24761*/5520/*C937 */,/*24762*/5520/*C938 */,/*24763*/5520/*C939 */,/*24764*/5520/*C93A */, /*24765*/5520/*C93B */,/*24766*/5520/*C93C */,/*24767*/5520/*C93D */,/*24768*/5520/*C93E */,/*24769*/5520/*C93F */, /*24770*/5520/*C940 */,/*24771*/5520/*C941 */,/*24772*/5520/*C942 */,/*24773*/5520/*C943 */,/*24774*/5520/*C944 */, /*24775*/5520/*C945 */,/*24776*/5520/*C946 */,/*24777*/5520/*C947 */,/*24778*/5520/*C948 */,/*24779*/5520/*C949 */, /*24780*/5520/*C94A */,/*24781*/5520/*C94B */,/*24782*/5520/*C94C */,/*24783*/5520/*C94D */,/*24784*/5520/*C94E */, /*24785*/5520/*C94F */,/*24786*/5519/* C950 */,/*24787*/5520/* C951 */,/*24788*/5520/*C952 */,/*24789*/5520/*C953 */, /*24790*/5520/*C954 */,/*24791*/5520/*C955 */,/*24792*/5520/*C956 */,/*24793*/5520/*C957 */,/*24794*/5520/*C958 */, /*24795*/5520/*C959 */,/*24796*/5520/*C95A */,/*24797*/5520/*C95B */,/*24798*/5520/*C95C */,/*24799*/5520/*C95D */, /*24800*/5520/*C95E */,/*24801*/5520/*C95F */,/*24802*/5520/*C960 */,/*24803*/5520/*C961 */,/*24804*/5520/*C962 */, /*24805*/5520/*C963 */,/*24806*/5520/*C964 */,/*24807*/5520/*C965 */,/*24808*/5520/*C966 */,/*24809*/5520/*C967 */, /*24810*/5520/*C968 */,/*24811*/5520/*C969 */,/*24812*/5520/*C96A */,/*24813*/5520/*C96B */,/*24814*/5519/* C96C */, /*24815*/5520/* C96D */,/*24816*/5520/*C96E */,/*24817*/5520/*C96F */,/*24818*/5520/*C970 */,/*24819*/5520/*C971 */, /*24820*/5520/*C972 */,/*24821*/5520/*C973 */,/*24822*/5520/*C974 */,/*24823*/5520/*C975 */,/*24824*/5520/*C976 */, /*24825*/5520/*C977 */,/*24826*/5520/*C978 */,/*24827*/5520/*C979 */,/*24828*/5520/*C97A */,/*24829*/5520/*C97B */, /*24830*/5520/*C97C */,/*24831*/5520/*C97D */,/*24832*/5520/*C97E */,/*24833*/5520/*C97F */,/*24834*/5520/*C980 */, /*24835*/5520/*C981 */,/*24836*/5520/*C982 */,/*24837*/5520/*C983 */,/*24838*/5520/*C984 */,/*24839*/5520/*C985 */, /*24840*/5520/*C986 */,/*24841*/5520/*C987 */,/*24842*/5519/* C988 */,/*24843*/5520/* C989 */,/*24844*/5520/*C98A */, /*24845*/5520/*C98B */,/*24846*/5520/*C98C */,/*24847*/5520/*C98D */,/*24848*/5520/*C98E */,/*24849*/5520/*C98F */, /*24850*/5520/*C990 */,/*24851*/5520/*C991 */,/*24852*/5520/*C992 */,/*24853*/5520/*C993 */,/*24854*/5520/*C994 */, /*24855*/5520/*C995 */,/*24856*/5520/*C996 */,/*24857*/5520/*C997 */,/*24858*/5520/*C998 */,/*24859*/5520/*C999 */, /*24860*/5520/*C99A */,/*24861*/5520/*C99B */,/*24862*/5520/*C99C */,/*24863*/5520/*C99D */,/*24864*/5520/*C99E */, /*24865*/5520/*C99F */,/*24866*/5520/*C9A0 */,/*24867*/5520/*C9A1 */,/*24868*/5520/*C9A2 */,/*24869*/5520/*C9A3 */, /*24870*/5519/* C9A4 */,/*24871*/5520/* C9A5 */,/*24872*/5520/*C9A6 */,/*24873*/5520/*C9A7 */,/*24874*/5520/*C9A8 */, /*24875*/5520/*C9A9 */,/*24876*/5520/*C9AA */,/*24877*/5520/*C9AB */,/*24878*/5520/*C9AC */,/*24879*/5520/*C9AD */, /*24880*/5520/*C9AE */,/*24881*/5520/*C9AF */,/*24882*/5520/*C9B0 */,/*24883*/5520/*C9B1 */,/*24884*/5520/*C9B2 */, /*24885*/5520/*C9B3 */,/*24886*/5520/*C9B4 */,/*24887*/5520/*C9B5 */,/*24888*/5520/*C9B6 */,/*24889*/5520/*C9B7 */, /*24890*/5520/*C9B8 */,/*24891*/5520/*C9B9 */,/*24892*/5520/*C9BA */,/*24893*/5520/*C9BB */,/*24894*/5520/*C9BC */, /*24895*/5520/*C9BD */,/*24896*/5520/*C9BE */,/*24897*/5520/*C9BF */,/*24898*/5519/* C9C0 */,/*24899*/5520/* C9C1 */, /*24900*/5520/*C9C2 */,/*24901*/5520/*C9C3 */,/*24902*/5520/*C9C4 */,/*24903*/5520/*C9C5 */,/*24904*/5520/*C9C6 */, /*24905*/5520/*C9C7 */,/*24906*/5520/*C9C8 */,/*24907*/5520/*C9C9 */,/*24908*/5520/*C9CA */,/*24909*/5520/*C9CB */, /*24910*/5520/*C9CC */,/*24911*/5520/*C9CD */,/*24912*/5520/*C9CE */,/*24913*/5520/*C9CF */,/*24914*/5520/*C9D0 */, /*24915*/5520/*C9D1 */,/*24916*/5520/*C9D2 */,/*24917*/5520/*C9D3 */,/*24918*/5520/*C9D4 */,/*24919*/5520/*C9D5 */, /*24920*/5520/*C9D6 */,/*24921*/5520/*C9D7 */,/*24922*/5520/*C9D8 */,/*24923*/5520/*C9D9 */,/*24924*/5520/*C9DA */, /*24925*/5520/*C9DB */,/*24926*/5519/* C9DC */,/*24927*/5520/* C9DD */,/*24928*/5520/*C9DE */,/*24929*/5520/*C9DF */, /*24930*/5520/*C9E0 */,/*24931*/5520/*C9E1 */,/*24932*/5520/*C9E2 */,/*24933*/5520/*C9E3 */,/*24934*/5520/*C9E4 */, /*24935*/5520/*C9E5 */,/*24936*/5520/*C9E6 */,/*24937*/5520/*C9E7 */,/*24938*/5520/*C9E8 */,/*24939*/5520/*C9E9 */, /*24940*/5520/*C9EA */,/*24941*/5520/*C9EB */,/*24942*/5520/*C9EC */,/*24943*/5520/*C9ED */,/*24944*/5520/*C9EE */, /*24945*/5520/*C9EF */,/*24946*/5520/*C9F0 */,/*24947*/5520/*C9F1 */,/*24948*/5520/*C9F2 */,/*24949*/5520/*C9F3 */, /*24950*/5520/*C9F4 */,/*24951*/5520/*C9F5 */,/*24952*/5520/*C9F6 */,/*24953*/5520/*C9F7 */,/*24954*/5519/* C9F8 */, /*24955*/5520/* C9F9 */,/*24956*/5520/*C9FA */,/*24957*/5520/*C9FB */,/*24958*/5520/*C9FC */,/*24959*/5520/*C9FD */, /*24960*/5520/*C9FE */,/*24961*/5520/*C9FF */,/*24962*/5520/*CA00 */,/*24963*/5520/*CA01 */,/*24964*/5520/*CA02 */, /*24965*/5520/*CA03 */,/*24966*/5520/*CA04 */,/*24967*/5520/*CA05 */,/*24968*/5520/*CA06 */,/*24969*/5520/*CA07 */, /*24970*/5520/*CA08 */,/*24971*/5520/*CA09 */,/*24972*/5520/*CA0A */,/*24973*/5520/*CA0B */,/*24974*/5520/*CA0C */, /*24975*/5520/*CA0D */,/*24976*/5520/*CA0E */,/*24977*/5520/*CA0F */,/*24978*/5520/*CA10 */,/*24979*/5520/*CA11 */, /*24980*/5520/*CA12 */,/*24981*/5520/*CA13 */,/*24982*/5519/* CA14 */,/*24983*/5520/* CA15 */,/*24984*/5520/*CA16 */, /*24985*/5520/*CA17 */,/*24986*/5520/*CA18 */,/*24987*/5520/*CA19 */,/*24988*/5520/*CA1A */,/*24989*/5520/*CA1B */, /*24990*/5520/*CA1C */,/*24991*/5520/*CA1D */,/*24992*/5520/*CA1E */,/*24993*/5520/*CA1F */,/*24994*/5520/*CA20 */, /*24995*/5520/*CA21 */,/*24996*/5520/*CA22 */,/*24997*/5520/*CA23 */,/*24998*/5520/*CA24 */,/*24999*/5520/*CA25 */, /*25000*/5520/*CA26 */,/*25001*/5520/*CA27 */,/*25002*/5520/*CA28 */,/*25003*/5520/*CA29 */,/*25004*/5520/*CA2A */, /*25005*/5520/*CA2B */,/*25006*/5520/*CA2C */,/*25007*/5520/*CA2D */,/*25008*/5520/*CA2E */,/*25009*/5520/*CA2F */, /*25010*/5519/* CA30 */,/*25011*/5520/* CA31 */,/*25012*/5520/*CA32 */,/*25013*/5520/*CA33 */,/*25014*/5520/*CA34 */, /*25015*/5520/*CA35 */,/*25016*/5520/*CA36 */,/*25017*/5520/*CA37 */,/*25018*/5520/*CA38 */,/*25019*/5520/*CA39 */, /*25020*/5520/*CA3A */,/*25021*/5520/*CA3B */,/*25022*/5520/*CA3C */,/*25023*/5520/*CA3D */,/*25024*/5520/*CA3E */, /*25025*/5520/*CA3F */,/*25026*/5520/*CA40 */,/*25027*/5520/*CA41 */,/*25028*/5520/*CA42 */,/*25029*/5520/*CA43 */, /*25030*/5520/*CA44 */,/*25031*/5520/*CA45 */,/*25032*/5520/*CA46 */,/*25033*/5520/*CA47 */,/*25034*/5520/*CA48 */, /*25035*/5520/*CA49 */,/*25036*/5520/*CA4A */,/*25037*/5520/*CA4B */,/*25038*/5519/* CA4C */,/*25039*/5520/* CA4D */, /*25040*/5520/*CA4E */,/*25041*/5520/*CA4F */,/*25042*/5520/*CA50 */,/*25043*/5520/*CA51 */,/*25044*/5520/*CA52 */, /*25045*/5520/*CA53 */,/*25046*/5520/*CA54 */,/*25047*/5520/*CA55 */,/*25048*/5520/*CA56 */,/*25049*/5520/*CA57 */, /*25050*/5520/*CA58 */,/*25051*/5520/*CA59 */,/*25052*/5520/*CA5A */,/*25053*/5520/*CA5B */,/*25054*/5520/*CA5C */, /*25055*/5520/*CA5D */,/*25056*/5520/*CA5E */,/*25057*/5520/*CA5F */,/*25058*/5520/*CA60 */,/*25059*/5520/*CA61 */, /*25060*/5520/*CA62 */,/*25061*/5520/*CA63 */,/*25062*/5520/*CA64 */,/*25063*/5520/*CA65 */,/*25064*/5520/*CA66 */, /*25065*/5520/*CA67 */,/*25066*/5519/* CA68 */,/*25067*/5520/* CA69 */,/*25068*/5520/*CA6A */,/*25069*/5520/*CA6B */, /*25070*/5520/*CA6C */,/*25071*/5520/*CA6D */,/*25072*/5520/*CA6E */,/*25073*/5520/*CA6F */,/*25074*/5520/*CA70 */, /*25075*/5520/*CA71 */,/*25076*/5520/*CA72 */,/*25077*/5520/*CA73 */,/*25078*/5520/*CA74 */,/*25079*/5520/*CA75 */, /*25080*/5520/*CA76 */,/*25081*/5520/*CA77 */,/*25082*/5520/*CA78 */,/*25083*/5520/*CA79 */,/*25084*/5520/*CA7A */, /*25085*/5520/*CA7B */,/*25086*/5520/*CA7C */,/*25087*/5520/*CA7D */,/*25088*/5520/*CA7E */,/*25089*/5520/*CA7F */, /*25090*/5520/*CA80 */,/*25091*/5520/*CA81 */,/*25092*/5520/*CA82 */,/*25093*/5520/*CA83 */,/*25094*/5519/* CA84 */, /*25095*/5520/* CA85 */,/*25096*/5520/*CA86 */,/*25097*/5520/*CA87 */,/*25098*/5520/*CA88 */,/*25099*/5520/*CA89 */, /*25100*/5520/*CA8A */,/*25101*/5520/*CA8B */,/*25102*/5520/*CA8C */,/*25103*/5520/*CA8D */,/*25104*/5520/*CA8E */, /*25105*/5520/*CA8F */,/*25106*/5520/*CA90 */,/*25107*/5520/*CA91 */,/*25108*/5520/*CA92 */,/*25109*/5520/*CA93 */, /*25110*/5520/*CA94 */,/*25111*/5520/*CA95 */,/*25112*/5520/*CA96 */,/*25113*/5520/*CA97 */,/*25114*/5520/*CA98 */, /*25115*/5520/*CA99 */,/*25116*/5520/*CA9A */,/*25117*/5520/*CA9B */,/*25118*/5520/*CA9C */,/*25119*/5520/*CA9D */, /*25120*/5520/*CA9E */,/*25121*/5520/*CA9F */,/*25122*/5519/* CAA0 */,/*25123*/5520/* CAA1 */,/*25124*/5520/*CAA2 */, /*25125*/5520/*CAA3 */,/*25126*/5520/*CAA4 */,/*25127*/5520/*CAA5 */,/*25128*/5520/*CAA6 */,/*25129*/5520/*CAA7 */, /*25130*/5520/*CAA8 */,/*25131*/5520/*CAA9 */,/*25132*/5520/*CAAA */,/*25133*/5520/*CAAB */,/*25134*/5520/*CAAC */, /*25135*/5520/*CAAD */,/*25136*/5520/*CAAE */,/*25137*/5520/*CAAF */,/*25138*/5520/*CAB0 */,/*25139*/5520/*CAB1 */, /*25140*/5520/*CAB2 */,/*25141*/5520/*CAB3 */,/*25142*/5520/*CAB4 */,/*25143*/5520/*CAB5 */,/*25144*/5520/*CAB6 */, /*25145*/5520/*CAB7 */,/*25146*/5520/*CAB8 */,/*25147*/5520/*CAB9 */,/*25148*/5520/*CABA */,/*25149*/5520/*CABB */, /*25150*/5519/* CABC */,/*25151*/5520/* CABD */,/*25152*/5520/*CABE */,/*25153*/5520/*CABF */,/*25154*/5520/*CAC0 */, /*25155*/5520/*CAC1 */,/*25156*/5520/*CAC2 */,/*25157*/5520/*CAC3 */,/*25158*/5520/*CAC4 */,/*25159*/5520/*CAC5 */, /*25160*/5520/*CAC6 */,/*25161*/5520/*CAC7 */,/*25162*/5520/*CAC8 */,/*25163*/5520/*CAC9 */,/*25164*/5520/*CACA */, /*25165*/5520/*CACB */,/*25166*/5520/*CACC */,/*25167*/5520/*CACD */,/*25168*/5520/*CACE */,/*25169*/5520/*CACF */, /*25170*/5520/*CAD0 */,/*25171*/5520/*CAD1 */,/*25172*/5520/*CAD2 */,/*25173*/5520/*CAD3 */,/*25174*/5520/*CAD4 */, /*25175*/5520/*CAD5 */,/*25176*/5520/*CAD6 */,/*25177*/5520/*CAD7 */,/*25178*/5519/* CAD8 */,/*25179*/5520/* CAD9 */, /*25180*/5520/*CADA */,/*25181*/5520/*CADB */,/*25182*/5520/*CADC */,/*25183*/5520/*CADD */,/*25184*/5520/*CADE */, /*25185*/5520/*CADF */,/*25186*/5520/*CAE0 */,/*25187*/5520/*CAE1 */,/*25188*/5520/*CAE2 */,/*25189*/5520/*CAE3 */, /*25190*/5520/*CAE4 */,/*25191*/5520/*CAE5 */,/*25192*/5520/*CAE6 */,/*25193*/5520/*CAE7 */,/*25194*/5520/*CAE8 */, /*25195*/5520/*CAE9 */,/*25196*/5520/*CAEA */,/*25197*/5520/*CAEB */,/*25198*/5520/*CAEC */,/*25199*/5520/*CAED */, /*25200*/5520/*CAEE */,/*25201*/5520/*CAEF */,/*25202*/5520/*CAF0 */,/*25203*/5520/*CAF1 */,/*25204*/5520/*CAF2 */, /*25205*/5520/*CAF3 */,/*25206*/5519/* CAF4 */,/*25207*/5520/* CAF5 */,/*25208*/5520/*CAF6 */,/*25209*/5520/*CAF7 */, /*25210*/5520/*CAF8 */,/*25211*/5520/*CAF9 */,/*25212*/5520/*CAFA */,/*25213*/5520/*CAFB */,/*25214*/5520/*CAFC */, /*25215*/5520/*CAFD */,/*25216*/5520/*CAFE */,/*25217*/5520/*CAFF */,/*25218*/5520/*CB00 */,/*25219*/5520/*CB01 */, /*25220*/5520/*CB02 */,/*25221*/5520/*CB03 */,/*25222*/5520/*CB04 */,/*25223*/5520/*CB05 */,/*25224*/5520/*CB06 */, /*25225*/5520/*CB07 */,/*25226*/5520/*CB08 */,/*25227*/5520/*CB09 */,/*25228*/5520/*CB0A */,/*25229*/5520/*CB0B */, /*25230*/5520/*CB0C */,/*25231*/5520/*CB0D */,/*25232*/5520/*CB0E */,/*25233*/5520/*CB0F */,/*25234*/5519/* CB10 */, /*25235*/5520/* CB11 */,/*25236*/5520/*CB12 */,/*25237*/5520/*CB13 */,/*25238*/5520/*CB14 */,/*25239*/5520/*CB15 */, /*25240*/5520/*CB16 */,/*25241*/5520/*CB17 */,/*25242*/5520/*CB18 */,/*25243*/5520/*CB19 */,/*25244*/5520/*CB1A */, /*25245*/5520/*CB1B */,/*25246*/5520/*CB1C */,/*25247*/5520/*CB1D */,/*25248*/5520/*CB1E */,/*25249*/5520/*CB1F */, /*25250*/5520/*CB20 */,/*25251*/5520/*CB21 */,/*25252*/5520/*CB22 */,/*25253*/5520/*CB23 */,/*25254*/5520/*CB24 */, /*25255*/5520/*CB25 */,/*25256*/5520/*CB26 */,/*25257*/5520/*CB27 */,/*25258*/5520/*CB28 */,/*25259*/5520/*CB29 */, /*25260*/5520/*CB2A */,/*25261*/5520/*CB2B */,/*25262*/5519/* CB2C */,/*25263*/5520/* CB2D */,/*25264*/5520/*CB2E */, /*25265*/5520/*CB2F */,/*25266*/5520/*CB30 */,/*25267*/5520/*CB31 */,/*25268*/5520/*CB32 */,/*25269*/5520/*CB33 */, /*25270*/5520/*CB34 */,/*25271*/5520/*CB35 */,/*25272*/5520/*CB36 */,/*25273*/5520/*CB37 */,/*25274*/5520/*CB38 */, /*25275*/5520/*CB39 */,/*25276*/5520/*CB3A */,/*25277*/5520/*CB3B */,/*25278*/5520/*CB3C */,/*25279*/5520/*CB3D */, /*25280*/5520/*CB3E */,/*25281*/5520/*CB3F */,/*25282*/5520/*CB40 */,/*25283*/5520/*CB41 */,/*25284*/5520/*CB42 */, /*25285*/5520/*CB43 */,/*25286*/5520/*CB44 */,/*25287*/5520/*CB45 */,/*25288*/5520/*CB46 */,/*25289*/5520/*CB47 */, /*25290*/5519/* CB48 */,/*25291*/5520/* CB49 */,/*25292*/5520/*CB4A */,/*25293*/5520/*CB4B */,/*25294*/5520/*CB4C */, /*25295*/5520/*CB4D */,/*25296*/5520/*CB4E */,/*25297*/5520/*CB4F */,/*25298*/5520/*CB50 */,/*25299*/5520/*CB51 */, /*25300*/5520/*CB52 */,/*25301*/5520/*CB53 */,/*25302*/5520/*CB54 */,/*25303*/5520/*CB55 */,/*25304*/5520/*CB56 */, /*25305*/5520/*CB57 */,/*25306*/5520/*CB58 */,/*25307*/5520/*CB59 */,/*25308*/5520/*CB5A */,/*25309*/5520/*CB5B */, /*25310*/5520/*CB5C */,/*25311*/5520/*CB5D */,/*25312*/5520/*CB5E */,/*25313*/5520/*CB5F */,/*25314*/5520/*CB60 */, /*25315*/5520/*CB61 */,/*25316*/5520/*CB62 */,/*25317*/5520/*CB63 */,/*25318*/5519/* CB64 */,/*25319*/5520/* CB65 */, /*25320*/5520/*CB66 */,/*25321*/5520/*CB67 */,/*25322*/5520/*CB68 */,/*25323*/5520/*CB69 */,/*25324*/5520/*CB6A */, /*25325*/5520/*CB6B */,/*25326*/5520/*CB6C */,/*25327*/5520/*CB6D */,/*25328*/5520/*CB6E */,/*25329*/5520/*CB6F */, /*25330*/5520/*CB70 */,/*25331*/5520/*CB71 */,/*25332*/5520/*CB72 */,/*25333*/5520/*CB73 */,/*25334*/5520/*CB74 */, /*25335*/5520/*CB75 */,/*25336*/5520/*CB76 */,/*25337*/5520/*CB77 */,/*25338*/5520/*CB78 */,/*25339*/5520/*CB79 */, /*25340*/5520/*CB7A */,/*25341*/5520/*CB7B */,/*25342*/5520/*CB7C */,/*25343*/5520/*CB7D */,/*25344*/5520/*CB7E */, /*25345*/5520/*CB7F */,/*25346*/5519/* CB80 */,/*25347*/5520/* CB81 */,/*25348*/5520/*CB82 */,/*25349*/5520/*CB83 */, /*25350*/5520/*CB84 */,/*25351*/5520/*CB85 */,/*25352*/5520/*CB86 */,/*25353*/5520/*CB87 */,/*25354*/5520/*CB88 */, /*25355*/5520/*CB89 */,/*25356*/5520/*CB8A */,/*25357*/5520/*CB8B */,/*25358*/5520/*CB8C */,/*25359*/5520/*CB8D */, /*25360*/5520/*CB8E */,/*25361*/5520/*CB8F */,/*25362*/5520/*CB90 */,/*25363*/5520/*CB91 */,/*25364*/5520/*CB92 */, /*25365*/5520/*CB93 */,/*25366*/5520/*CB94 */,/*25367*/5520/*CB95 */,/*25368*/5520/*CB96 */,/*25369*/5520/*CB97 */, /*25370*/5520/*CB98 */,/*25371*/5520/*CB99 */,/*25372*/5520/*CB9A */,/*25373*/5520/*CB9B */,/*25374*/5519/* CB9C */, /*25375*/5520/* CB9D */,/*25376*/5520/*CB9E */,/*25377*/5520/*CB9F */,/*25378*/5520/*CBA0 */,/*25379*/5520/*CBA1 */, /*25380*/5520/*CBA2 */,/*25381*/5520/*CBA3 */,/*25382*/5520/*CBA4 */,/*25383*/5520/*CBA5 */,/*25384*/5520/*CBA6 */, /*25385*/5520/*CBA7 */,/*25386*/5520/*CBA8 */,/*25387*/5520/*CBA9 */,/*25388*/5520/*CBAA */,/*25389*/5520/*CBAB */, /*25390*/5520/*CBAC */,/*25391*/5520/*CBAD */,/*25392*/5520/*CBAE */,/*25393*/5520/*CBAF */,/*25394*/5520/*CBB0 */, /*25395*/5520/*CBB1 */,/*25396*/5520/*CBB2 */,/*25397*/5520/*CBB3 */,/*25398*/5520/*CBB4 */,/*25399*/5520/*CBB5 */, /*25400*/5520/*CBB6 */,/*25401*/5520/*CBB7 */,/*25402*/5519/* CBB8 */,/*25403*/5520/* CBB9 */,/*25404*/5520/*CBBA */, /*25405*/5520/*CBBB */,/*25406*/5520/*CBBC */,/*25407*/5520/*CBBD */,/*25408*/5520/*CBBE */,/*25409*/5520/*CBBF */, /*25410*/5520/*CBC0 */,/*25411*/5520/*CBC1 */,/*25412*/5520/*CBC2 */,/*25413*/5520/*CBC3 */,/*25414*/5520/*CBC4 */, /*25415*/5520/*CBC5 */,/*25416*/5520/*CBC6 */,/*25417*/5520/*CBC7 */,/*25418*/5520/*CBC8 */,/*25419*/5520/*CBC9 */, /*25420*/5520/*CBCA */,/*25421*/5520/*CBCB */,/*25422*/5520/*CBCC */,/*25423*/5520/*CBCD */,/*25424*/5520/*CBCE */, /*25425*/5520/*CBCF */,/*25426*/5520/*CBD0 */,/*25427*/5520/*CBD1 */,/*25428*/5520/*CBD2 */,/*25429*/5520/*CBD3 */, /*25430*/5519/* CBD4 */,/*25431*/5520/* CBD5 */,/*25432*/5520/*CBD6 */,/*25433*/5520/*CBD7 */,/*25434*/5520/*CBD8 */, /*25435*/5520/*CBD9 */,/*25436*/5520/*CBDA */,/*25437*/5520/*CBDB */,/*25438*/5520/*CBDC */,/*25439*/5520/*CBDD */, /*25440*/5520/*CBDE */,/*25441*/5520/*CBDF */,/*25442*/5520/*CBE0 */,/*25443*/5520/*CBE1 */,/*25444*/5520/*CBE2 */, /*25445*/5520/*CBE3 */,/*25446*/5520/*CBE4 */,/*25447*/5520/*CBE5 */,/*25448*/5520/*CBE6 */,/*25449*/5520/*CBE7 */, /*25450*/5520/*CBE8 */,/*25451*/5520/*CBE9 */,/*25452*/5520/*CBEA */,/*25453*/5520/*CBEB */,/*25454*/5520/*CBEC */, /*25455*/5520/*CBED */,/*25456*/5520/*CBEE */,/*25457*/5520/*CBEF */,/*25458*/5519/* CBF0 */,/*25459*/5520/* CBF1 */, /*25460*/5520/*CBF2 */,/*25461*/5520/*CBF3 */,/*25462*/5520/*CBF4 */,/*25463*/5520/*CBF5 */,/*25464*/5520/*CBF6 */, /*25465*/5520/*CBF7 */,/*25466*/5520/*CBF8 */,/*25467*/5520/*CBF9 */,/*25468*/5520/*CBFA */,/*25469*/5520/*CBFB */, /*25470*/5520/*CBFC */,/*25471*/5520/*CBFD */,/*25472*/5520/*CBFE */,/*25473*/5520/*CBFF */,/*25474*/5520/*CC00 */, /*25475*/5520/*CC01 */,/*25476*/5520/*CC02 */,/*25477*/5520/*CC03 */,/*25478*/5520/*CC04 */,/*25479*/5520/*CC05 */, /*25480*/5520/*CC06 */,/*25481*/5520/*CC07 */,/*25482*/5520/*CC08 */,/*25483*/5520/*CC09 */,/*25484*/5520/*CC0A */, /*25485*/5520/*CC0B */,/*25486*/5519/* CC0C */,/*25487*/5520/* CC0D */,/*25488*/5520/*CC0E */,/*25489*/5520/*CC0F */, /*25490*/5520/*CC10 */,/*25491*/5520/*CC11 */,/*25492*/5520/*CC12 */,/*25493*/5520/*CC13 */,/*25494*/5520/*CC14 */, /*25495*/5520/*CC15 */,/*25496*/5520/*CC16 */,/*25497*/5520/*CC17 */,/*25498*/5520/*CC18 */,/*25499*/5520/*CC19 */, /*25500*/5520/*CC1A */,/*25501*/5520/*CC1B */,/*25502*/5520/*CC1C */,/*25503*/5520/*CC1D */,/*25504*/5520/*CC1E */, /*25505*/5520/*CC1F */,/*25506*/5520/*CC20 */,/*25507*/5520/*CC21 */,/*25508*/5520/*CC22 */,/*25509*/5520/*CC23 */, /*25510*/5520/*CC24 */,/*25511*/5520/*CC25 */,/*25512*/5520/*CC26 */,/*25513*/5520/*CC27 */,/*25514*/5519/* CC28 */, /*25515*/5520/* CC29 */,/*25516*/5520/*CC2A */,/*25517*/5520/*CC2B */,/*25518*/5520/*CC2C */,/*25519*/5520/*CC2D */, /*25520*/5520/*CC2E */,/*25521*/5520/*CC2F */,/*25522*/5520/*CC30 */,/*25523*/5520/*CC31 */,/*25524*/5520/*CC32 */, /*25525*/5520/*CC33 */,/*25526*/5520/*CC34 */,/*25527*/5520/*CC35 */,/*25528*/5520/*CC36 */,/*25529*/5520/*CC37 */, /*25530*/5520/*CC38 */,/*25531*/5520/*CC39 */,/*25532*/5520/*CC3A */,/*25533*/5520/*CC3B */,/*25534*/5520/*CC3C */, /*25535*/5520/*CC3D */,/*25536*/5520/*CC3E */,/*25537*/5520/*CC3F */,/*25538*/5520/*CC40 */,/*25539*/5520/*CC41 */, /*25540*/5520/*CC42 */,/*25541*/5520/*CC43 */,/*25542*/5519/* CC44 */,/*25543*/5520/* CC45 */,/*25544*/5520/*CC46 */, /*25545*/5520/*CC47 */,/*25546*/5520/*CC48 */,/*25547*/5520/*CC49 */,/*25548*/5520/*CC4A */,/*25549*/5520/*CC4B */, /*25550*/5520/*CC4C */,/*25551*/5520/*CC4D */,/*25552*/5520/*CC4E */,/*25553*/5520/*CC4F */,/*25554*/5520/*CC50 */, /*25555*/5520/*CC51 */,/*25556*/5520/*CC52 */,/*25557*/5520/*CC53 */,/*25558*/5520/*CC54 */,/*25559*/5520/*CC55 */, /*25560*/5520/*CC56 */,/*25561*/5520/*CC57 */,/*25562*/5520/*CC58 */,/*25563*/5520/*CC59 */,/*25564*/5520/*CC5A */, /*25565*/5520/*CC5B */,/*25566*/5520/*CC5C */,/*25567*/5520/*CC5D */,/*25568*/5520/*CC5E */,/*25569*/5520/*CC5F */, /*25570*/5519/* CC60 */,/*25571*/5520/* CC61 */,/*25572*/5520/*CC62 */,/*25573*/5520/*CC63 */,/*25574*/5520/*CC64 */, /*25575*/5520/*CC65 */,/*25576*/5520/*CC66 */,/*25577*/5520/*CC67 */,/*25578*/5520/*CC68 */,/*25579*/5520/*CC69 */, /*25580*/5520/*CC6A */,/*25581*/5520/*CC6B */,/*25582*/5520/*CC6C */,/*25583*/5520/*CC6D */,/*25584*/5520/*CC6E */, /*25585*/5520/*CC6F */,/*25586*/5520/*CC70 */,/*25587*/5520/*CC71 */,/*25588*/5520/*CC72 */,/*25589*/5520/*CC73 */, /*25590*/5520/*CC74 */,/*25591*/5520/*CC75 */,/*25592*/5520/*CC76 */,/*25593*/5520/*CC77 */,/*25594*/5520/*CC78 */, /*25595*/5520/*CC79 */,/*25596*/5520/*CC7A */,/*25597*/5520/*CC7B */,/*25598*/5519/* CC7C */,/*25599*/5520/* CC7D */, /*25600*/5520/*CC7E */,/*25601*/5520/*CC7F */,/*25602*/5520/*CC80 */,/*25603*/5520/*CC81 */,/*25604*/5520/*CC82 */, /*25605*/5520/*CC83 */,/*25606*/5520/*CC84 */,/*25607*/5520/*CC85 */,/*25608*/5520/*CC86 */,/*25609*/5520/*CC87 */, /*25610*/5520/*CC88 */,/*25611*/5520/*CC89 */,/*25612*/5520/*CC8A */,/*25613*/5520/*CC8B */,/*25614*/5520/*CC8C */, /*25615*/5520/*CC8D */,/*25616*/5520/*CC8E */,/*25617*/5520/*CC8F */,/*25618*/5520/*CC90 */,/*25619*/5520/*CC91 */, /*25620*/5520/*CC92 */,/*25621*/5520/*CC93 */,/*25622*/5520/*CC94 */,/*25623*/5520/*CC95 */,/*25624*/5520/*CC96 */, /*25625*/5520/*CC97 */,/*25626*/5519/* CC98 */,/*25627*/5520/* CC99 */,/*25628*/5520/*CC9A */,/*25629*/5520/*CC9B */, /*25630*/5520/*CC9C */,/*25631*/5520/*CC9D */,/*25632*/5520/*CC9E */,/*25633*/5520/*CC9F */,/*25634*/5520/*CCA0 */, /*25635*/5520/*CCA1 */,/*25636*/5520/*CCA2 */,/*25637*/5520/*CCA3 */,/*25638*/5520/*CCA4 */,/*25639*/5520/*CCA5 */, /*25640*/5520/*CCA6 */,/*25641*/5520/*CCA7 */,/*25642*/5520/*CCA8 */,/*25643*/5520/*CCA9 */,/*25644*/5520/*CCAA */, /*25645*/5520/*CCAB */,/*25646*/5520/*CCAC */,/*25647*/5520/*CCAD */,/*25648*/5520/*CCAE */,/*25649*/5520/*CCAF */, /*25650*/5520/*CCB0 */,/*25651*/5520/*CCB1 */,/*25652*/5520/*CCB2 */,/*25653*/5520/*CCB3 */,/*25654*/5519/* CCB4 */, /*25655*/5520/* CCB5 */,/*25656*/5520/*CCB6 */,/*25657*/5520/*CCB7 */,/*25658*/5520/*CCB8 */,/*25659*/5520/*CCB9 */, /*25660*/5520/*CCBA */,/*25661*/5520/*CCBB */,/*25662*/5520/*CCBC */,/*25663*/5520/*CCBD */,/*25664*/5520/*CCBE */, /*25665*/5520/*CCBF */,/*25666*/5520/*CCC0 */,/*25667*/5520/*CCC1 */,/*25668*/5520/*CCC2 */,/*25669*/5520/*CCC3 */, /*25670*/5520/*CCC4 */,/*25671*/5520/*CCC5 */,/*25672*/5520/*CCC6 */,/*25673*/5520/*CCC7 */,/*25674*/5520/*CCC8 */, /*25675*/5520/*CCC9 */,/*25676*/5520/*CCCA */,/*25677*/5520/*CCCB */,/*25678*/5520/*CCCC */,/*25679*/5520/*CCCD */, /*25680*/5520/*CCCE */,/*25681*/5520/*CCCF */,/*25682*/5519/* CCD0 */,/*25683*/5520/* CCD1 */,/*25684*/5520/*CCD2 */, /*25685*/5520/*CCD3 */,/*25686*/5520/*CCD4 */,/*25687*/5520/*CCD5 */,/*25688*/5520/*CCD6 */,/*25689*/5520/*CCD7 */, /*25690*/5520/*CCD8 */,/*25691*/5520/*CCD9 */,/*25692*/5520/*CCDA */,/*25693*/5520/*CCDB */,/*25694*/5520/*CCDC */, /*25695*/5520/*CCDD */,/*25696*/5520/*CCDE */,/*25697*/5520/*CCDF */,/*25698*/5520/*CCE0 */,/*25699*/5520/*CCE1 */, /*25700*/5520/*CCE2 */,/*25701*/5520/*CCE3 */,/*25702*/5520/*CCE4 */,/*25703*/5520/*CCE5 */,/*25704*/5520/*CCE6 */, /*25705*/5520/*CCE7 */,/*25706*/5520/*CCE8 */,/*25707*/5520/*CCE9 */,/*25708*/5520/*CCEA */,/*25709*/5520/*CCEB */, /*25710*/5519/* CCEC */,/*25711*/5520/* CCED */,/*25712*/5520/*CCEE */,/*25713*/5520/*CCEF */,/*25714*/5520/*CCF0 */, /*25715*/5520/*CCF1 */,/*25716*/5520/*CCF2 */,/*25717*/5520/*CCF3 */,/*25718*/5520/*CCF4 */,/*25719*/5520/*CCF5 */, /*25720*/5520/*CCF6 */,/*25721*/5520/*CCF7 */,/*25722*/5520/*CCF8 */,/*25723*/5520/*CCF9 */,/*25724*/5520/*CCFA */, /*25725*/5520/*CCFB */,/*25726*/5520/*CCFC */,/*25727*/5520/*CCFD */,/*25728*/5520/*CCFE */,/*25729*/5520/*CCFF */, /*25730*/5520/*CD00 */,/*25731*/5520/*CD01 */,/*25732*/5520/*CD02 */,/*25733*/5520/*CD03 */,/*25734*/5520/*CD04 */, /*25735*/5520/*CD05 */,/*25736*/5520/*CD06 */,/*25737*/5520/*CD07 */,/*25738*/5519/* CD08 */,/*25739*/5520/* CD09 */, /*25740*/5520/*CD0A */,/*25741*/5520/*CD0B */,/*25742*/5520/*CD0C */,/*25743*/5520/*CD0D */,/*25744*/5520/*CD0E */, /*25745*/5520/*CD0F */,/*25746*/5520/*CD10 */,/*25747*/5520/*CD11 */,/*25748*/5520/*CD12 */,/*25749*/5520/*CD13 */, /*25750*/5520/*CD14 */,/*25751*/5520/*CD15 */,/*25752*/5520/*CD16 */,/*25753*/5520/*CD17 */,/*25754*/5520/*CD18 */, /*25755*/5520/*CD19 */,/*25756*/5520/*CD1A */,/*25757*/5520/*CD1B */,/*25758*/5520/*CD1C */,/*25759*/5520/*CD1D */, /*25760*/5520/*CD1E */,/*25761*/5520/*CD1F */,/*25762*/5520/*CD20 */,/*25763*/5520/*CD21 */,/*25764*/5520/*CD22 */, /*25765*/5520/*CD23 */,/*25766*/5519/* CD24 */,/*25767*/5520/* CD25 */,/*25768*/5520/*CD26 */,/*25769*/5520/*CD27 */, /*25770*/5520/*CD28 */,/*25771*/5520/*CD29 */,/*25772*/5520/*CD2A */,/*25773*/5520/*CD2B */,/*25774*/5520/*CD2C */, /*25775*/5520/*CD2D */,/*25776*/5520/*CD2E */,/*25777*/5520/*CD2F */,/*25778*/5520/*CD30 */,/*25779*/5520/*CD31 */, /*25780*/5520/*CD32 */,/*25781*/5520/*CD33 */,/*25782*/5520/*CD34 */,/*25783*/5520/*CD35 */,/*25784*/5520/*CD36 */, /*25785*/5520/*CD37 */,/*25786*/5520/*CD38 */,/*25787*/5520/*CD39 */,/*25788*/5520/*CD3A */,/*25789*/5520/*CD3B */, /*25790*/5520/*CD3C */,/*25791*/5520/*CD3D */,/*25792*/5520/*CD3E */,/*25793*/5520/*CD3F */,/*25794*/5519/* CD40 */, /*25795*/5520/* CD41 */,/*25796*/5520/*CD42 */,/*25797*/5520/*CD43 */,/*25798*/5520/*CD44 */,/*25799*/5520/*CD45 */, /*25800*/5520/*CD46 */,/*25801*/5520/*CD47 */,/*25802*/5520/*CD48 */,/*25803*/5520/*CD49 */,/*25804*/5520/*CD4A */, /*25805*/5520/*CD4B */,/*25806*/5520/*CD4C */,/*25807*/5520/*CD4D */,/*25808*/5520/*CD4E */,/*25809*/5520/*CD4F */, /*25810*/5520/*CD50 */,/*25811*/5520/*CD51 */,/*25812*/5520/*CD52 */,/*25813*/5520/*CD53 */,/*25814*/5520/*CD54 */, /*25815*/5520/*CD55 */,/*25816*/5520/*CD56 */,/*25817*/5520/*CD57 */,/*25818*/5520/*CD58 */,/*25819*/5520/*CD59 */, /*25820*/5520/*CD5A */,/*25821*/5520/*CD5B */,/*25822*/5519/* CD5C */,/*25823*/5520/* CD5D */,/*25824*/5520/*CD5E */, /*25825*/5520/*CD5F */,/*25826*/5520/*CD60 */,/*25827*/5520/*CD61 */,/*25828*/5520/*CD62 */,/*25829*/5520/*CD63 */, /*25830*/5520/*CD64 */,/*25831*/5520/*CD65 */,/*25832*/5520/*CD66 */,/*25833*/5520/*CD67 */,/*25834*/5520/*CD68 */, /*25835*/5520/*CD69 */,/*25836*/5520/*CD6A */,/*25837*/5520/*CD6B */,/*25838*/5520/*CD6C */,/*25839*/5520/*CD6D */, /*25840*/5520/*CD6E */,/*25841*/5520/*CD6F */,/*25842*/5520/*CD70 */,/*25843*/5520/*CD71 */,/*25844*/5520/*CD72 */, /*25845*/5520/*CD73 */,/*25846*/5520/*CD74 */,/*25847*/5520/*CD75 */,/*25848*/5520/*CD76 */,/*25849*/5520/*CD77 */, /*25850*/5519/* CD78 */,/*25851*/5520/* CD79 */,/*25852*/5520/*CD7A */,/*25853*/5520/*CD7B */,/*25854*/5520/*CD7C */, /*25855*/5520/*CD7D */,/*25856*/5520/*CD7E */,/*25857*/5520/*CD7F */,/*25858*/5520/*CD80 */,/*25859*/5520/*CD81 */, /*25860*/5520/*CD82 */,/*25861*/5520/*CD83 */,/*25862*/5520/*CD84 */,/*25863*/5520/*CD85 */,/*25864*/5520/*CD86 */, /*25865*/5520/*CD87 */,/*25866*/5520/*CD88 */,/*25867*/5520/*CD89 */,/*25868*/5520/*CD8A */,/*25869*/5520/*CD8B */, /*25870*/5520/*CD8C */,/*25871*/5520/*CD8D */,/*25872*/5520/*CD8E */,/*25873*/5520/*CD8F */,/*25874*/5520/*CD90 */, /*25875*/5520/*CD91 */,/*25876*/5520/*CD92 */,/*25877*/5520/*CD93 */,/*25878*/5519/* CD94 */,/*25879*/5520/* CD95 */, /*25880*/5520/*CD96 */,/*25881*/5520/*CD97 */,/*25882*/5520/*CD98 */,/*25883*/5520/*CD99 */,/*25884*/5520/*CD9A */, /*25885*/5520/*CD9B */,/*25886*/5520/*CD9C */,/*25887*/5520/*CD9D */,/*25888*/5520/*CD9E */,/*25889*/5520/*CD9F */, /*25890*/5520/*CDA0 */,/*25891*/5520/*CDA1 */,/*25892*/5520/*CDA2 */,/*25893*/5520/*CDA3 */,/*25894*/5520/*CDA4 */, /*25895*/5520/*CDA5 */,/*25896*/5520/*CDA6 */,/*25897*/5520/*CDA7 */,/*25898*/5520/*CDA8 */,/*25899*/5520/*CDA9 */, /*25900*/5520/*CDAA */,/*25901*/5520/*CDAB */,/*25902*/5520/*CDAC */,/*25903*/5520/*CDAD */,/*25904*/5520/*CDAE */, /*25905*/5520/*CDAF */,/*25906*/5519/* CDB0 */,/*25907*/5520/* CDB1 */,/*25908*/5520/*CDB2 */,/*25909*/5520/*CDB3 */, /*25910*/5520/*CDB4 */,/*25911*/5520/*CDB5 */,/*25912*/5520/*CDB6 */,/*25913*/5520/*CDB7 */,/*25914*/5520/*CDB8 */, /*25915*/5520/*CDB9 */,/*25916*/5520/*CDBA */,/*25917*/5520/*CDBB */,/*25918*/5520/*CDBC */,/*25919*/5520/*CDBD */, /*25920*/5520/*CDBE */,/*25921*/5520/*CDBF */,/*25922*/5520/*CDC0 */,/*25923*/5520/*CDC1 */,/*25924*/5520/*CDC2 */, /*25925*/5520/*CDC3 */,/*25926*/5520/*CDC4 */,/*25927*/5520/*CDC5 */,/*25928*/5520/*CDC6 */,/*25929*/5520/*CDC7 */, /*25930*/5520/*CDC8 */,/*25931*/5520/*CDC9 */,/*25932*/5520/*CDCA */,/*25933*/5520/*CDCB */,/*25934*/5519/* CDCC */, /*25935*/5520/* CDCD */,/*25936*/5520/*CDCE */,/*25937*/5520/*CDCF */,/*25938*/5520/*CDD0 */,/*25939*/5520/*CDD1 */, /*25940*/5520/*CDD2 */,/*25941*/5520/*CDD3 */,/*25942*/5520/*CDD4 */,/*25943*/5520/*CDD5 */,/*25944*/5520/*CDD6 */, /*25945*/5520/*CDD7 */,/*25946*/5520/*CDD8 */,/*25947*/5520/*CDD9 */,/*25948*/5520/*CDDA */,/*25949*/5520/*CDDB */, /*25950*/5520/*CDDC */,/*25951*/5520/*CDDD */,/*25952*/5520/*CDDE */,/*25953*/5520/*CDDF */,/*25954*/5520/*CDE0 */, /*25955*/5520/*CDE1 */,/*25956*/5520/*CDE2 */,/*25957*/5520/*CDE3 */,/*25958*/5520/*CDE4 */,/*25959*/5520/*CDE5 */, /*25960*/5520/*CDE6 */,/*25961*/5520/*CDE7 */,/*25962*/5519/* CDE8 */,/*25963*/5520/* CDE9 */,/*25964*/5520/*CDEA */, /*25965*/5520/*CDEB */,/*25966*/5520/*CDEC */,/*25967*/5520/*CDED */,/*25968*/5520/*CDEE */,/*25969*/5520/*CDEF */, /*25970*/5520/*CDF0 */,/*25971*/5520/*CDF1 */,/*25972*/5520/*CDF2 */,/*25973*/5520/*CDF3 */,/*25974*/5520/*CDF4 */, /*25975*/5520/*CDF5 */,/*25976*/5520/*CDF6 */,/*25977*/5520/*CDF7 */,/*25978*/5520/*CDF8 */,/*25979*/5520/*CDF9 */, /*25980*/5520/*CDFA */,/*25981*/5520/*CDFB */,/*25982*/5520/*CDFC */,/*25983*/5520/*CDFD */,/*25984*/5520/*CDFE */, /*25985*/5520/*CDFF */,/*25986*/5520/*CE00 */,/*25987*/5520/*CE01 */,/*25988*/5520/*CE02 */,/*25989*/5520/*CE03 */, /*25990*/5519/* CE04 */,/*25991*/5520/* CE05 */,/*25992*/5520/*CE06 */,/*25993*/5520/*CE07 */,/*25994*/5520/*CE08 */, /*25995*/5520/*CE09 */,/*25996*/5520/*CE0A */,/*25997*/5520/*CE0B */,/*25998*/5520/*CE0C */,/*25999*/5520/*CE0D */, /*26000*/5520/*CE0E */,/*26001*/5520/*CE0F */,/*26002*/5520/*CE10 */,/*26003*/5520/*CE11 */,/*26004*/5520/*CE12 */, /*26005*/5520/*CE13 */,/*26006*/5520/*CE14 */,/*26007*/5520/*CE15 */,/*26008*/5520/*CE16 */,/*26009*/5520/*CE17 */, /*26010*/5520/*CE18 */,/*26011*/5520/*CE19 */,/*26012*/5520/*CE1A */,/*26013*/5520/*CE1B */,/*26014*/5520/*CE1C */, /*26015*/5520/*CE1D */,/*26016*/5520/*CE1E */,/*26017*/5520/*CE1F */,/*26018*/5519/* CE20 */,/*26019*/5520/* CE21 */, /*26020*/5520/*CE22 */,/*26021*/5520/*CE23 */,/*26022*/5520/*CE24 */,/*26023*/5520/*CE25 */,/*26024*/5520/*CE26 */, /*26025*/5520/*CE27 */,/*26026*/5520/*CE28 */,/*26027*/5520/*CE29 */,/*26028*/5520/*CE2A */,/*26029*/5520/*CE2B */, /*26030*/5520/*CE2C */,/*26031*/5520/*CE2D */,/*26032*/5520/*CE2E */,/*26033*/5520/*CE2F */,/*26034*/5520/*CE30 */, /*26035*/5520/*CE31 */,/*26036*/5520/*CE32 */,/*26037*/5520/*CE33 */,/*26038*/5520/*CE34 */,/*26039*/5520/*CE35 */, /*26040*/5520/*CE36 */,/*26041*/5520/*CE37 */,/*26042*/5520/*CE38 */,/*26043*/5520/*CE39 */,/*26044*/5520/*CE3A */, /*26045*/5520/*CE3B */,/*26046*/5519/* CE3C */,/*26047*/5520/* CE3D */,/*26048*/5520/*CE3E */,/*26049*/5520/*CE3F */, /*26050*/5520/*CE40 */,/*26051*/5520/*CE41 */,/*26052*/5520/*CE42 */,/*26053*/5520/*CE43 */,/*26054*/5520/*CE44 */, /*26055*/5520/*CE45 */,/*26056*/5520/*CE46 */,/*26057*/5520/*CE47 */,/*26058*/5520/*CE48 */,/*26059*/5520/*CE49 */, /*26060*/5520/*CE4A */,/*26061*/5520/*CE4B */,/*26062*/5520/*CE4C */,/*26063*/5520/*CE4D */,/*26064*/5520/*CE4E */, /*26065*/5520/*CE4F */,/*26066*/5520/*CE50 */,/*26067*/5520/*CE51 */,/*26068*/5520/*CE52 */,/*26069*/5520/*CE53 */, /*26070*/5520/*CE54 */,/*26071*/5520/*CE55 */,/*26072*/5520/*CE56 */,/*26073*/5520/*CE57 */,/*26074*/5519/* CE58 */, /*26075*/5520/* CE59 */,/*26076*/5520/*CE5A */,/*26077*/5520/*CE5B */,/*26078*/5520/*CE5C */,/*26079*/5520/*CE5D */, /*26080*/5520/*CE5E */,/*26081*/5520/*CE5F */,/*26082*/5520/*CE60 */,/*26083*/5520/*CE61 */,/*26084*/5520/*CE62 */, /*26085*/5520/*CE63 */,/*26086*/5520/*CE64 */,/*26087*/5520/*CE65 */,/*26088*/5520/*CE66 */,/*26089*/5520/*CE67 */, /*26090*/5520/*CE68 */,/*26091*/5520/*CE69 */,/*26092*/5520/*CE6A */,/*26093*/5520/*CE6B */,/*26094*/5520/*CE6C */, /*26095*/5520/*CE6D */,/*26096*/5520/*CE6E */,/*26097*/5520/*CE6F */,/*26098*/5520/*CE70 */,/*26099*/5520/*CE71 */, /*26100*/5520/*CE72 */,/*26101*/5520/*CE73 */,/*26102*/5519/* CE74 */,/*26103*/5520/* CE75 */,/*26104*/5520/*CE76 */, /*26105*/5520/*CE77 */,/*26106*/5520/*CE78 */,/*26107*/5520/*CE79 */,/*26108*/5520/*CE7A */,/*26109*/5520/*CE7B */, /*26110*/5520/*CE7C */,/*26111*/5520/*CE7D */,/*26112*/5520/*CE7E */,/*26113*/5520/*CE7F */,/*26114*/5520/*CE80 */, /*26115*/5520/*CE81 */,/*26116*/5520/*CE82 */,/*26117*/5520/*CE83 */,/*26118*/5520/*CE84 */,/*26119*/5520/*CE85 */, /*26120*/5520/*CE86 */,/*26121*/5520/*CE87 */,/*26122*/5520/*CE88 */,/*26123*/5520/*CE89 */,/*26124*/5520/*CE8A */, /*26125*/5520/*CE8B */,/*26126*/5520/*CE8C */,/*26127*/5520/*CE8D */,/*26128*/5520/*CE8E */,/*26129*/5520/*CE8F */, /*26130*/5519/* CE90 */,/*26131*/5520/* CE91 */,/*26132*/5520/*CE92 */,/*26133*/5520/*CE93 */,/*26134*/5520/*CE94 */, /*26135*/5520/*CE95 */,/*26136*/5520/*CE96 */,/*26137*/5520/*CE97 */,/*26138*/5520/*CE98 */,/*26139*/5520/*CE99 */, /*26140*/5520/*CE9A */,/*26141*/5520/*CE9B */,/*26142*/5520/*CE9C */,/*26143*/5520/*CE9D */,/*26144*/5520/*CE9E */, /*26145*/5520/*CE9F */,/*26146*/5520/*CEA0 */,/*26147*/5520/*CEA1 */,/*26148*/5520/*CEA2 */,/*26149*/5520/*CEA3 */, /*26150*/5520/*CEA4 */,/*26151*/5520/*CEA5 */,/*26152*/5520/*CEA6 */,/*26153*/5520/*CEA7 */,/*26154*/5520/*CEA8 */, /*26155*/5520/*CEA9 */,/*26156*/5520/*CEAA */,/*26157*/5520/*CEAB */,/*26158*/5519/* CEAC */,/*26159*/5520/* CEAD */, /*26160*/5520/*CEAE */,/*26161*/5520/*CEAF */,/*26162*/5520/*CEB0 */,/*26163*/5520/*CEB1 */,/*26164*/5520/*CEB2 */, /*26165*/5520/*CEB3 */,/*26166*/5520/*CEB4 */,/*26167*/5520/*CEB5 */,/*26168*/5520/*CEB6 */,/*26169*/5520/*CEB7 */, /*26170*/5520/*CEB8 */,/*26171*/5520/*CEB9 */,/*26172*/5520/*CEBA */,/*26173*/5520/*CEBB */,/*26174*/5520/*CEBC */, /*26175*/5520/*CEBD */,/*26176*/5520/*CEBE */,/*26177*/5520/*CEBF */,/*26178*/5520/*CEC0 */,/*26179*/5520/*CEC1 */, /*26180*/5520/*CEC2 */,/*26181*/5520/*CEC3 */,/*26182*/5520/*CEC4 */,/*26183*/5520/*CEC5 */,/*26184*/5520/*CEC6 */, /*26185*/5520/*CEC7 */,/*26186*/5519/* CEC8 */,/*26187*/5520/* CEC9 */,/*26188*/5520/*CECA */,/*26189*/5520/*CECB */, /*26190*/5520/*CECC */,/*26191*/5520/*CECD */,/*26192*/5520/*CECE */,/*26193*/5520/*CECF */,/*26194*/5520/*CED0 */, /*26195*/5520/*CED1 */,/*26196*/5520/*CED2 */,/*26197*/5520/*CED3 */,/*26198*/5520/*CED4 */,/*26199*/5520/*CED5 */, /*26200*/5520/*CED6 */,/*26201*/5520/*CED7 */,/*26202*/5520/*CED8 */,/*26203*/5520/*CED9 */,/*26204*/5520/*CEDA */, /*26205*/5520/*CEDB */,/*26206*/5520/*CEDC */,/*26207*/5520/*CEDD */,/*26208*/5520/*CEDE */,/*26209*/5520/*CEDF */, /*26210*/5520/*CEE0 */,/*26211*/5520/*CEE1 */,/*26212*/5520/*CEE2 */,/*26213*/5520/*CEE3 */,/*26214*/5519/* CEE4 */, /*26215*/5520/* CEE5 */,/*26216*/5520/*CEE6 */,/*26217*/5520/*CEE7 */,/*26218*/5520/*CEE8 */,/*26219*/5520/*CEE9 */, /*26220*/5520/*CEEA */,/*26221*/5520/*CEEB */,/*26222*/5520/*CEEC */,/*26223*/5520/*CEED */,/*26224*/5520/*CEEE */, /*26225*/5520/*CEEF */,/*26226*/5520/*CEF0 */,/*26227*/5520/*CEF1 */,/*26228*/5520/*CEF2 */,/*26229*/5520/*CEF3 */, /*26230*/5520/*CEF4 */,/*26231*/5520/*CEF5 */,/*26232*/5520/*CEF6 */,/*26233*/5520/*CEF7 */,/*26234*/5520/*CEF8 */, /*26235*/5520/*CEF9 */,/*26236*/5520/*CEFA */,/*26237*/5520/*CEFB */,/*26238*/5520/*CEFC */,/*26239*/5520/*CEFD */, /*26240*/5520/*CEFE */,/*26241*/5520/*CEFF */,/*26242*/5519/* CF00 */,/*26243*/5520/* CF01 */,/*26244*/5520/*CF02 */, /*26245*/5520/*CF03 */,/*26246*/5520/*CF04 */,/*26247*/5520/*CF05 */,/*26248*/5520/*CF06 */,/*26249*/5520/*CF07 */, /*26250*/5520/*CF08 */,/*26251*/5520/*CF09 */,/*26252*/5520/*CF0A */,/*26253*/5520/*CF0B */,/*26254*/5520/*CF0C */, /*26255*/5520/*CF0D */,/*26256*/5520/*CF0E */,/*26257*/5520/*CF0F */,/*26258*/5520/*CF10 */,/*26259*/5520/*CF11 */, /*26260*/5520/*CF12 */,/*26261*/5520/*CF13 */,/*26262*/5520/*CF14 */,/*26263*/5520/*CF15 */,/*26264*/5520/*CF16 */, /*26265*/5520/*CF17 */,/*26266*/5520/*CF18 */,/*26267*/5520/*CF19 */,/*26268*/5520/*CF1A */,/*26269*/5520/*CF1B */, /*26270*/5519/* CF1C */,/*26271*/5520/* CF1D */,/*26272*/5520/*CF1E */,/*26273*/5520/*CF1F */,/*26274*/5520/*CF20 */, /*26275*/5520/*CF21 */,/*26276*/5520/*CF22 */,/*26277*/5520/*CF23 */,/*26278*/5520/*CF24 */,/*26279*/5520/*CF25 */, /*26280*/5520/*CF26 */,/*26281*/5520/*CF27 */,/*26282*/5520/*CF28 */,/*26283*/5520/*CF29 */,/*26284*/5520/*CF2A */, /*26285*/5520/*CF2B */,/*26286*/5520/*CF2C */,/*26287*/5520/*CF2D */,/*26288*/5520/*CF2E */,/*26289*/5520/*CF2F */, /*26290*/5520/*CF30 */,/*26291*/5520/*CF31 */,/*26292*/5520/*CF32 */,/*26293*/5520/*CF33 */,/*26294*/5520/*CF34 */, /*26295*/5520/*CF35 */,/*26296*/5520/*CF36 */,/*26297*/5520/*CF37 */,/*26298*/5519/* CF38 */,/*26299*/5520/* CF39 */, /*26300*/5520/*CF3A */,/*26301*/5520/*CF3B */,/*26302*/5520/*CF3C */,/*26303*/5520/*CF3D */,/*26304*/5520/*CF3E */, /*26305*/5520/*CF3F */,/*26306*/5520/*CF40 */,/*26307*/5520/*CF41 */,/*26308*/5520/*CF42 */,/*26309*/5520/*CF43 */, /*26310*/5520/*CF44 */,/*26311*/5520/*CF45 */,/*26312*/5520/*CF46 */,/*26313*/5520/*CF47 */,/*26314*/5520/*CF48 */, /*26315*/5520/*CF49 */,/*26316*/5520/*CF4A */,/*26317*/5520/*CF4B */,/*26318*/5520/*CF4C */,/*26319*/5520/*CF4D */, /*26320*/5520/*CF4E */,/*26321*/5520/*CF4F */,/*26322*/5520/*CF50 */,/*26323*/5520/*CF51 */,/*26324*/5520/*CF52 */, /*26325*/5520/*CF53 */,/*26326*/5519/* CF54 */,/*26327*/5520/* CF55 */,/*26328*/5520/*CF56 */,/*26329*/5520/*CF57 */, /*26330*/5520/*CF58 */,/*26331*/5520/*CF59 */,/*26332*/5520/*CF5A */,/*26333*/5520/*CF5B */,/*26334*/5520/*CF5C */, /*26335*/5520/*CF5D */,/*26336*/5520/*CF5E */,/*26337*/5520/*CF5F */,/*26338*/5520/*CF60 */,/*26339*/5520/*CF61 */, /*26340*/5520/*CF62 */,/*26341*/5520/*CF63 */,/*26342*/5520/*CF64 */,/*26343*/5520/*CF65 */,/*26344*/5520/*CF66 */, /*26345*/5520/*CF67 */,/*26346*/5520/*CF68 */,/*26347*/5520/*CF69 */,/*26348*/5520/*CF6A */,/*26349*/5520/*CF6B */, /*26350*/5520/*CF6C */,/*26351*/5520/*CF6D */,/*26352*/5520/*CF6E */,/*26353*/5520/*CF6F */,/*26354*/5519/* CF70 */, /*26355*/5520/* CF71 */,/*26356*/5520/*CF72 */,/*26357*/5520/*CF73 */,/*26358*/5520/*CF74 */,/*26359*/5520/*CF75 */, /*26360*/5520/*CF76 */,/*26361*/5520/*CF77 */,/*26362*/5520/*CF78 */,/*26363*/5520/*CF79 */,/*26364*/5520/*CF7A */, /*26365*/5520/*CF7B */,/*26366*/5520/*CF7C */,/*26367*/5520/*CF7D */,/*26368*/5520/*CF7E */,/*26369*/5520/*CF7F */, /*26370*/5520/*CF80 */,/*26371*/5520/*CF81 */,/*26372*/5520/*CF82 */,/*26373*/5520/*CF83 */,/*26374*/5520/*CF84 */, /*26375*/5520/*CF85 */,/*26376*/5520/*CF86 */,/*26377*/5520/*CF87 */,/*26378*/5520/*CF88 */,/*26379*/5520/*CF89 */, /*26380*/5520/*CF8A */,/*26381*/5520/*CF8B */,/*26382*/5519/* CF8C */,/*26383*/5520/* CF8D */,/*26384*/5520/*CF8E */, /*26385*/5520/*CF8F */,/*26386*/5520/*CF90 */,/*26387*/5520/*CF91 */,/*26388*/5520/*CF92 */,/*26389*/5520/*CF93 */, /*26390*/5520/*CF94 */,/*26391*/5520/*CF95 */,/*26392*/5520/*CF96 */,/*26393*/5520/*CF97 */,/*26394*/5520/*CF98 */, /*26395*/5520/*CF99 */,/*26396*/5520/*CF9A */,/*26397*/5520/*CF9B */,/*26398*/5520/*CF9C */,/*26399*/5520/*CF9D */, /*26400*/5520/*CF9E */,/*26401*/5520/*CF9F */,/*26402*/5520/*CFA0 */,/*26403*/5520/*CFA1 */,/*26404*/5520/*CFA2 */, /*26405*/5520/*CFA3 */,/*26406*/5520/*CFA4 */,/*26407*/5520/*CFA5 */,/*26408*/5520/*CFA6 */,/*26409*/5520/*CFA7 */, /*26410*/5519/* CFA8 */,/*26411*/5520/* CFA9 */,/*26412*/5520/*CFAA */,/*26413*/5520/*CFAB */,/*26414*/5520/*CFAC */, /*26415*/5520/*CFAD */,/*26416*/5520/*CFAE */,/*26417*/5520/*CFAF */,/*26418*/5520/*CFB0 */,/*26419*/5520/*CFB1 */, /*26420*/5520/*CFB2 */,/*26421*/5520/*CFB3 */,/*26422*/5520/*CFB4 */,/*26423*/5520/*CFB5 */,/*26424*/5520/*CFB6 */, /*26425*/5520/*CFB7 */,/*26426*/5520/*CFB8 */,/*26427*/5520/*CFB9 */,/*26428*/5520/*CFBA */,/*26429*/5520/*CFBB */, /*26430*/5520/*CFBC */,/*26431*/5520/*CFBD */,/*26432*/5520/*CFBE */,/*26433*/5520/*CFBF */,/*26434*/5520/*CFC0 */, /*26435*/5520/*CFC1 */,/*26436*/5520/*CFC2 */,/*26437*/5520/*CFC3 */,/*26438*/5519/* CFC4 */,/*26439*/5520/* CFC5 */, /*26440*/5520/*CFC6 */,/*26441*/5520/*CFC7 */,/*26442*/5520/*CFC8 */,/*26443*/5520/*CFC9 */,/*26444*/5520/*CFCA */, /*26445*/5520/*CFCB */,/*26446*/5520/*CFCC */,/*26447*/5520/*CFCD */,/*26448*/5520/*CFCE */,/*26449*/5520/*CFCF */, /*26450*/5520/*CFD0 */,/*26451*/5520/*CFD1 */,/*26452*/5520/*CFD2 */,/*26453*/5520/*CFD3 */,/*26454*/5520/*CFD4 */, /*26455*/5520/*CFD5 */,/*26456*/5520/*CFD6 */,/*26457*/5520/*CFD7 */,/*26458*/5520/*CFD8 */,/*26459*/5520/*CFD9 */, /*26460*/5520/*CFDA */,/*26461*/5520/*CFDB */,/*26462*/5520/*CFDC */,/*26463*/5520/*CFDD */,/*26464*/5520/*CFDE */, /*26465*/5520/*CFDF */,/*26466*/5519/* CFE0 */,/*26467*/5520/* CFE1 */,/*26468*/5520/*CFE2 */,/*26469*/5520/*CFE3 */, /*26470*/5520/*CFE4 */,/*26471*/5520/*CFE5 */,/*26472*/5520/*CFE6 */,/*26473*/5520/*CFE7 */,/*26474*/5520/*CFE8 */, /*26475*/5520/*CFE9 */,/*26476*/5520/*CFEA */,/*26477*/5520/*CFEB */,/*26478*/5520/*CFEC */,/*26479*/5520/*CFED */, /*26480*/5520/*CFEE */,/*26481*/5520/*CFEF */,/*26482*/5520/*CFF0 */,/*26483*/5520/*CFF1 */,/*26484*/5520/*CFF2 */, /*26485*/5520/*CFF3 */,/*26486*/5520/*CFF4 */,/*26487*/5520/*CFF5 */,/*26488*/5520/*CFF6 */,/*26489*/5520/*CFF7 */, /*26490*/5520/*CFF8 */,/*26491*/5520/*CFF9 */,/*26492*/5520/*CFFA */,/*26493*/5520/*CFFB */,/*26494*/5519/* CFFC */, /*26495*/5520/* CFFD */,/*26496*/5520/*CFFE */,/*26497*/5520/*CFFF */,/*26498*/5520/*D000 */,/*26499*/5520/*D001 */, /*26500*/5520/*D002 */,/*26501*/5520/*D003 */,/*26502*/5520/*D004 */,/*26503*/5520/*D005 */,/*26504*/5520/*D006 */, /*26505*/5520/*D007 */,/*26506*/5520/*D008 */,/*26507*/5520/*D009 */,/*26508*/5520/*D00A */,/*26509*/5520/*D00B */, /*26510*/5520/*D00C */,/*26511*/5520/*D00D */,/*26512*/5520/*D00E */,/*26513*/5520/*D00F */,/*26514*/5520/*D010 */, /*26515*/5520/*D011 */,/*26516*/5520/*D012 */,/*26517*/5520/*D013 */,/*26518*/5520/*D014 */,/*26519*/5520/*D015 */, /*26520*/5520/*D016 */,/*26521*/5520/*D017 */,/*26522*/5519/* D018 */,/*26523*/5520/* D019 */,/*26524*/5520/*D01A */, /*26525*/5520/*D01B */,/*26526*/5520/*D01C */,/*26527*/5520/*D01D */,/*26528*/5520/*D01E */,/*26529*/5520/*D01F */, /*26530*/5520/*D020 */,/*26531*/5520/*D021 */,/*26532*/5520/*D022 */,/*26533*/5520/*D023 */,/*26534*/5520/*D024 */, /*26535*/5520/*D025 */,/*26536*/5520/*D026 */,/*26537*/5520/*D027 */,/*26538*/5520/*D028 */,/*26539*/5520/*D029 */, /*26540*/5520/*D02A */,/*26541*/5520/*D02B */,/*26542*/5520/*D02C */,/*26543*/5520/*D02D */,/*26544*/5520/*D02E */, /*26545*/5520/*D02F */,/*26546*/5520/*D030 */,/*26547*/5520/*D031 */,/*26548*/5520/*D032 */,/*26549*/5520/*D033 */, /*26550*/5519/* D034 */,/*26551*/5520/* D035 */,/*26552*/5520/*D036 */,/*26553*/5520/*D037 */,/*26554*/5520/*D038 */, /*26555*/5520/*D039 */,/*26556*/5520/*D03A */,/*26557*/5520/*D03B */,/*26558*/5520/*D03C */,/*26559*/5520/*D03D */, /*26560*/5520/*D03E */,/*26561*/5520/*D03F */,/*26562*/5520/*D040 */,/*26563*/5520/*D041 */,/*26564*/5520/*D042 */, /*26565*/5520/*D043 */,/*26566*/5520/*D044 */,/*26567*/5520/*D045 */,/*26568*/5520/*D046 */,/*26569*/5520/*D047 */, /*26570*/5520/*D048 */,/*26571*/5520/*D049 */,/*26572*/5520/*D04A */,/*26573*/5520/*D04B */,/*26574*/5520/*D04C */, /*26575*/5520/*D04D */,/*26576*/5520/*D04E */,/*26577*/5520/*D04F */,/*26578*/5519/* D050 */,/*26579*/5520/* D051 */, /*26580*/5520/*D052 */,/*26581*/5520/*D053 */,/*26582*/5520/*D054 */,/*26583*/5520/*D055 */,/*26584*/5520/*D056 */, /*26585*/5520/*D057 */,/*26586*/5520/*D058 */,/*26587*/5520/*D059 */,/*26588*/5520/*D05A */,/*26589*/5520/*D05B */, /*26590*/5520/*D05C */,/*26591*/5520/*D05D */,/*26592*/5520/*D05E */,/*26593*/5520/*D05F */,/*26594*/5520/*D060 */, /*26595*/5520/*D061 */,/*26596*/5520/*D062 */,/*26597*/5520/*D063 */,/*26598*/5520/*D064 */,/*26599*/5520/*D065 */, /*26600*/5520/*D066 */,/*26601*/5520/*D067 */,/*26602*/5520/*D068 */,/*26603*/5520/*D069 */,/*26604*/5520/*D06A */, /*26605*/5520/*D06B */,/*26606*/5519/* D06C */,/*26607*/5520/* D06D */,/*26608*/5520/*D06E */,/*26609*/5520/*D06F */, /*26610*/5520/*D070 */,/*26611*/5520/*D071 */,/*26612*/5520/*D072 */,/*26613*/5520/*D073 */,/*26614*/5520/*D074 */, /*26615*/5520/*D075 */,/*26616*/5520/*D076 */,/*26617*/5520/*D077 */,/*26618*/5520/*D078 */,/*26619*/5520/*D079 */, /*26620*/5520/*D07A */,/*26621*/5520/*D07B */,/*26622*/5520/*D07C */,/*26623*/5520/*D07D */,/*26624*/5520/*D07E */, /*26625*/5520/*D07F */,/*26626*/5520/*D080 */,/*26627*/5520/*D081 */,/*26628*/5520/*D082 */,/*26629*/5520/*D083 */, /*26630*/5520/*D084 */,/*26631*/5520/*D085 */,/*26632*/5520/*D086 */,/*26633*/5520/*D087 */,/*26634*/5519/* D088 */, /*26635*/5520/* D089 */,/*26636*/5520/*D08A */,/*26637*/5520/*D08B */,/*26638*/5520/*D08C */,/*26639*/5520/*D08D */, /*26640*/5520/*D08E */,/*26641*/5520/*D08F */,/*26642*/5520/*D090 */,/*26643*/5520/*D091 */,/*26644*/5520/*D092 */, /*26645*/5520/*D093 */,/*26646*/5520/*D094 */,/*26647*/5520/*D095 */,/*26648*/5520/*D096 */,/*26649*/5520/*D097 */, /*26650*/5520/*D098 */,/*26651*/5520/*D099 */,/*26652*/5520/*D09A */,/*26653*/5520/*D09B */,/*26654*/5520/*D09C */, /*26655*/5520/*D09D */,/*26656*/5520/*D09E */,/*26657*/5520/*D09F */,/*26658*/5520/*D0A0 */,/*26659*/5520/*D0A1 */, /*26660*/5520/*D0A2 */,/*26661*/5520/*D0A3 */,/*26662*/5519/* D0A4 */,/*26663*/5520/* D0A5 */,/*26664*/5520/*D0A6 */, /*26665*/5520/*D0A7 */,/*26666*/5520/*D0A8 */,/*26667*/5520/*D0A9 */,/*26668*/5520/*D0AA */,/*26669*/5520/*D0AB */, /*26670*/5520/*D0AC */,/*26671*/5520/*D0AD */,/*26672*/5520/*D0AE */,/*26673*/5520/*D0AF */,/*26674*/5520/*D0B0 */, /*26675*/5520/*D0B1 */,/*26676*/5520/*D0B2 */,/*26677*/5520/*D0B3 */,/*26678*/5520/*D0B4 */,/*26679*/5520/*D0B5 */, /*26680*/5520/*D0B6 */,/*26681*/5520/*D0B7 */,/*26682*/5520/*D0B8 */,/*26683*/5520/*D0B9 */,/*26684*/5520/*D0BA */, /*26685*/5520/*D0BB */,/*26686*/5520/*D0BC */,/*26687*/5520/*D0BD */,/*26688*/5520/*D0BE */,/*26689*/5520/*D0BF */, /*26690*/5519/* D0C0 */,/*26691*/5520/* D0C1 */,/*26692*/5520/*D0C2 */,/*26693*/5520/*D0C3 */,/*26694*/5520/*D0C4 */, /*26695*/5520/*D0C5 */,/*26696*/5520/*D0C6 */,/*26697*/5520/*D0C7 */,/*26698*/5520/*D0C8 */,/*26699*/5520/*D0C9 */, /*26700*/5520/*D0CA */,/*26701*/5520/*D0CB */,/*26702*/5520/*D0CC */,/*26703*/5520/*D0CD */,/*26704*/5520/*D0CE */, /*26705*/5520/*D0CF */,/*26706*/5520/*D0D0 */,/*26707*/5520/*D0D1 */,/*26708*/5520/*D0D2 */,/*26709*/5520/*D0D3 */, /*26710*/5520/*D0D4 */,/*26711*/5520/*D0D5 */,/*26712*/5520/*D0D6 */,/*26713*/5520/*D0D7 */,/*26714*/5520/*D0D8 */, /*26715*/5520/*D0D9 */,/*26716*/5520/*D0DA */,/*26717*/5520/*D0DB */,/*26718*/5519/* D0DC */,/*26719*/5520/* D0DD */, /*26720*/5520/*D0DE */,/*26721*/5520/*D0DF */,/*26722*/5520/*D0E0 */,/*26723*/5520/*D0E1 */,/*26724*/5520/*D0E2 */, /*26725*/5520/*D0E3 */,/*26726*/5520/*D0E4 */,/*26727*/5520/*D0E5 */,/*26728*/5520/*D0E6 */,/*26729*/5520/*D0E7 */, /*26730*/5520/*D0E8 */,/*26731*/5520/*D0E9 */,/*26732*/5520/*D0EA */,/*26733*/5520/*D0EB */,/*26734*/5520/*D0EC */, /*26735*/5520/*D0ED */,/*26736*/5520/*D0EE */,/*26737*/5520/*D0EF */,/*26738*/5520/*D0F0 */,/*26739*/5520/*D0F1 */, /*26740*/5520/*D0F2 */,/*26741*/5520/*D0F3 */,/*26742*/5520/*D0F4 */,/*26743*/5520/*D0F5 */,/*26744*/5520/*D0F6 */, /*26745*/5520/*D0F7 */,/*26746*/5519/* D0F8 */,/*26747*/5520/* D0F9 */,/*26748*/5520/*D0FA */,/*26749*/5520/*D0FB */, /*26750*/5520/*D0FC */,/*26751*/5520/*D0FD */,/*26752*/5520/*D0FE */,/*26753*/5520/*D0FF */,/*26754*/5520/*D100 */, /*26755*/5520/*D101 */,/*26756*/5520/*D102 */,/*26757*/5520/*D103 */,/*26758*/5520/*D104 */,/*26759*/5520/*D105 */, /*26760*/5520/*D106 */,/*26761*/5520/*D107 */,/*26762*/5520/*D108 */,/*26763*/5520/*D109 */,/*26764*/5520/*D10A */, /*26765*/5520/*D10B */,/*26766*/5520/*D10C */,/*26767*/5520/*D10D */,/*26768*/5520/*D10E */,/*26769*/5520/*D10F */, /*26770*/5520/*D110 */,/*26771*/5520/*D111 */,/*26772*/5520/*D112 */,/*26773*/5520/*D113 */,/*26774*/5519/* D114 */, /*26775*/5520/* D115 */,/*26776*/5520/*D116 */,/*26777*/5520/*D117 */,/*26778*/5520/*D118 */,/*26779*/5520/*D119 */, /*26780*/5520/*D11A */,/*26781*/5520/*D11B */,/*26782*/5520/*D11C */,/*26783*/5520/*D11D */,/*26784*/5520/*D11E */, /*26785*/5520/*D11F */,/*26786*/5520/*D120 */,/*26787*/5520/*D121 */,/*26788*/5520/*D122 */,/*26789*/5520/*D123 */, /*26790*/5520/*D124 */,/*26791*/5520/*D125 */,/*26792*/5520/*D126 */,/*26793*/5520/*D127 */,/*26794*/5520/*D128 */, /*26795*/5520/*D129 */,/*26796*/5520/*D12A */,/*26797*/5520/*D12B */,/*26798*/5520/*D12C */,/*26799*/5520/*D12D */, /*26800*/5520/*D12E */,/*26801*/5520/*D12F */,/*26802*/5519/* D130 */,/*26803*/5520/* D131 */,/*26804*/5520/*D132 */, /*26805*/5520/*D133 */,/*26806*/5520/*D134 */,/*26807*/5520/*D135 */,/*26808*/5520/*D136 */,/*26809*/5520/*D137 */, /*26810*/5520/*D138 */,/*26811*/5520/*D139 */,/*26812*/5520/*D13A */,/*26813*/5520/*D13B */,/*26814*/5520/*D13C */, /*26815*/5520/*D13D */,/*26816*/5520/*D13E */,/*26817*/5520/*D13F */,/*26818*/5520/*D140 */,/*26819*/5520/*D141 */, /*26820*/5520/*D142 */,/*26821*/5520/*D143 */,/*26822*/5520/*D144 */,/*26823*/5520/*D145 */,/*26824*/5520/*D146 */, /*26825*/5520/*D147 */,/*26826*/5520/*D148 */,/*26827*/5520/*D149 */,/*26828*/5520/*D14A */,/*26829*/5520/*D14B */, /*26830*/5519/* D14C */,/*26831*/5520/* D14D */,/*26832*/5520/*D14E */,/*26833*/5520/*D14F */,/*26834*/5520/*D150 */, /*26835*/5520/*D151 */,/*26836*/5520/*D152 */,/*26837*/5520/*D153 */,/*26838*/5520/*D154 */,/*26839*/5520/*D155 */, /*26840*/5520/*D156 */,/*26841*/5520/*D157 */,/*26842*/5520/*D158 */,/*26843*/5520/*D159 */,/*26844*/5520/*D15A */, /*26845*/5520/*D15B */,/*26846*/5520/*D15C */,/*26847*/5520/*D15D */,/*26848*/5520/*D15E */,/*26849*/5520/*D15F */, /*26850*/5520/*D160 */,/*26851*/5520/*D161 */,/*26852*/5520/*D162 */,/*26853*/5520/*D163 */,/*26854*/5520/*D164 */, /*26855*/5520/*D165 */,/*26856*/5520/*D166 */,/*26857*/5520/*D167 */,/*26858*/5519/* D168 */,/*26859*/5520/* D169 */, /*26860*/5520/*D16A */,/*26861*/5520/*D16B */,/*26862*/5520/*D16C */,/*26863*/5520/*D16D */,/*26864*/5520/*D16E */, /*26865*/5520/*D16F */,/*26866*/5520/*D170 */,/*26867*/5520/*D171 */,/*26868*/5520/*D172 */,/*26869*/5520/*D173 */, /*26870*/5520/*D174 */,/*26871*/5520/*D175 */,/*26872*/5520/*D176 */,/*26873*/5520/*D177 */,/*26874*/5520/*D178 */, /*26875*/5520/*D179 */,/*26876*/5520/*D17A */,/*26877*/5520/*D17B */,/*26878*/5520/*D17C */,/*26879*/5520/*D17D */, /*26880*/5520/*D17E */,/*26881*/5520/*D17F */,/*26882*/5520/*D180 */,/*26883*/5520/*D181 */,/*26884*/5520/*D182 */, /*26885*/5520/*D183 */,/*26886*/5519/* D184 */,/*26887*/5520/* D185 */,/*26888*/5520/*D186 */,/*26889*/5520/*D187 */, /*26890*/5520/*D188 */,/*26891*/5520/*D189 */,/*26892*/5520/*D18A */,/*26893*/5520/*D18B */,/*26894*/5520/*D18C */, /*26895*/5520/*D18D */,/*26896*/5520/*D18E */,/*26897*/5520/*D18F */,/*26898*/5520/*D190 */,/*26899*/5520/*D191 */, /*26900*/5520/*D192 */,/*26901*/5520/*D193 */,/*26902*/5520/*D194 */,/*26903*/5520/*D195 */,/*26904*/5520/*D196 */, /*26905*/5520/*D197 */,/*26906*/5520/*D198 */,/*26907*/5520/*D199 */,/*26908*/5520/*D19A */,/*26909*/5520/*D19B */, /*26910*/5520/*D19C */,/*26911*/5520/*D19D */,/*26912*/5520/*D19E */,/*26913*/5520/*D19F */,/*26914*/5519/* D1A0 */, /*26915*/5520/* D1A1 */,/*26916*/5520/*D1A2 */,/*26917*/5520/*D1A3 */,/*26918*/5520/*D1A4 */,/*26919*/5520/*D1A5 */, /*26920*/5520/*D1A6 */,/*26921*/5520/*D1A7 */,/*26922*/5520/*D1A8 */,/*26923*/5520/*D1A9 */,/*26924*/5520/*D1AA */, /*26925*/5520/*D1AB */,/*26926*/5520/*D1AC */,/*26927*/5520/*D1AD */,/*26928*/5520/*D1AE */,/*26929*/5520/*D1AF */, /*26930*/5520/*D1B0 */,/*26931*/5520/*D1B1 */,/*26932*/5520/*D1B2 */,/*26933*/5520/*D1B3 */,/*26934*/5520/*D1B4 */, /*26935*/5520/*D1B5 */,/*26936*/5520/*D1B6 */,/*26937*/5520/*D1B7 */,/*26938*/5520/*D1B8 */,/*26939*/5520/*D1B9 */, /*26940*/5520/*D1BA */,/*26941*/5520/*D1BB */,/*26942*/5519/* D1BC */,/*26943*/5520/* D1BD */,/*26944*/5520/*D1BE */, /*26945*/5520/*D1BF */,/*26946*/5520/*D1C0 */,/*26947*/5520/*D1C1 */,/*26948*/5520/*D1C2 */,/*26949*/5520/*D1C3 */, /*26950*/5520/*D1C4 */,/*26951*/5520/*D1C5 */,/*26952*/5520/*D1C6 */,/*26953*/5520/*D1C7 */,/*26954*/5520/*D1C8 */, /*26955*/5520/*D1C9 */,/*26956*/5520/*D1CA */,/*26957*/5520/*D1CB */,/*26958*/5520/*D1CC */,/*26959*/5520/*D1CD */, /*26960*/5520/*D1CE */,/*26961*/5520/*D1CF */,/*26962*/5520/*D1D0 */,/*26963*/5520/*D1D1 */,/*26964*/5520/*D1D2 */, /*26965*/5520/*D1D3 */,/*26966*/5520/*D1D4 */,/*26967*/5520/*D1D5 */,/*26968*/5520/*D1D6 */,/*26969*/5520/*D1D7 */, /*26970*/5519/* D1D8 */,/*26971*/5520/* D1D9 */,/*26972*/5520/*D1DA */,/*26973*/5520/*D1DB */,/*26974*/5520/*D1DC */, /*26975*/5520/*D1DD */,/*26976*/5520/*D1DE */,/*26977*/5520/*D1DF */,/*26978*/5520/*D1E0 */,/*26979*/5520/*D1E1 */, /*26980*/5520/*D1E2 */,/*26981*/5520/*D1E3 */,/*26982*/5520/*D1E4 */,/*26983*/5520/*D1E5 */,/*26984*/5520/*D1E6 */, /*26985*/5520/*D1E7 */,/*26986*/5520/*D1E8 */,/*26987*/5520/*D1E9 */,/*26988*/5520/*D1EA */,/*26989*/5520/*D1EB */, /*26990*/5520/*D1EC */,/*26991*/5520/*D1ED */,/*26992*/5520/*D1EE */,/*26993*/5520/*D1EF */,/*26994*/5520/*D1F0 */, /*26995*/5520/*D1F1 */,/*26996*/5520/*D1F2 */,/*26997*/5520/*D1F3 */,/*26998*/5519/* D1F4 */,/*26999*/5520/* D1F5 */, /*27000*/5520/*D1F6 */,/*27001*/5520/*D1F7 */,/*27002*/5520/*D1F8 */,/*27003*/5520/*D1F9 */,/*27004*/5520/*D1FA */, /*27005*/5520/*D1FB */,/*27006*/5520/*D1FC */,/*27007*/5520/*D1FD */,/*27008*/5520/*D1FE */,/*27009*/5520/*D1FF */, /*27010*/5520/*D200 */,/*27011*/5520/*D201 */,/*27012*/5520/*D202 */,/*27013*/5520/*D203 */,/*27014*/5520/*D204 */, /*27015*/5520/*D205 */,/*27016*/5520/*D206 */,/*27017*/5520/*D207 */,/*27018*/5520/*D208 */,/*27019*/5520/*D209 */, /*27020*/5520/*D20A */,/*27021*/5520/*D20B */,/*27022*/5520/*D20C */,/*27023*/5520/*D20D */,/*27024*/5520/*D20E */, /*27025*/5520/*D20F */,/*27026*/5519/* D210 */,/*27027*/5520/* D211 */,/*27028*/5520/*D212 */,/*27029*/5520/*D213 */, /*27030*/5520/*D214 */,/*27031*/5520/*D215 */,/*27032*/5520/*D216 */,/*27033*/5520/*D217 */,/*27034*/5520/*D218 */, /*27035*/5520/*D219 */,/*27036*/5520/*D21A */,/*27037*/5520/*D21B */,/*27038*/5520/*D21C */,/*27039*/5520/*D21D */, /*27040*/5520/*D21E */,/*27041*/5520/*D21F */,/*27042*/5520/*D220 */,/*27043*/5520/*D221 */,/*27044*/5520/*D222 */, /*27045*/5520/*D223 */,/*27046*/5520/*D224 */,/*27047*/5520/*D225 */,/*27048*/5520/*D226 */,/*27049*/5520/*D227 */, /*27050*/5520/*D228 */,/*27051*/5520/*D229 */,/*27052*/5520/*D22A */,/*27053*/5520/*D22B */,/*27054*/5519/* D22C */, /*27055*/5520/* D22D */,/*27056*/5520/*D22E */,/*27057*/5520/*D22F */,/*27058*/5520/*D230 */,/*27059*/5520/*D231 */, /*27060*/5520/*D232 */,/*27061*/5520/*D233 */,/*27062*/5520/*D234 */,/*27063*/5520/*D235 */,/*27064*/5520/*D236 */, /*27065*/5520/*D237 */,/*27066*/5520/*D238 */,/*27067*/5520/*D239 */,/*27068*/5520/*D23A */,/*27069*/5520/*D23B */, /*27070*/5520/*D23C */,/*27071*/5520/*D23D */,/*27072*/5520/*D23E */,/*27073*/5520/*D23F */,/*27074*/5520/*D240 */, /*27075*/5520/*D241 */,/*27076*/5520/*D242 */,/*27077*/5520/*D243 */,/*27078*/5520/*D244 */,/*27079*/5520/*D245 */, /*27080*/5520/*D246 */,/*27081*/5520/*D247 */,/*27082*/5519/* D248 */,/*27083*/5520/* D249 */,/*27084*/5520/*D24A */, /*27085*/5520/*D24B */,/*27086*/5520/*D24C */,/*27087*/5520/*D24D */,/*27088*/5520/*D24E */,/*27089*/5520/*D24F */, /*27090*/5520/*D250 */,/*27091*/5520/*D251 */,/*27092*/5520/*D252 */,/*27093*/5520/*D253 */,/*27094*/5520/*D254 */, /*27095*/5520/*D255 */,/*27096*/5520/*D256 */,/*27097*/5520/*D257 */,/*27098*/5520/*D258 */,/*27099*/5520/*D259 */, /*27100*/5520/*D25A */,/*27101*/5520/*D25B */,/*27102*/5520/*D25C */,/*27103*/5520/*D25D */,/*27104*/5520/*D25E */, /*27105*/5520/*D25F */,/*27106*/5520/*D260 */,/*27107*/5520/*D261 */,/*27108*/5520/*D262 */,/*27109*/5520/*D263 */, /*27110*/5519/* D264 */,/*27111*/5520/* D265 */,/*27112*/5520/*D266 */,/*27113*/5520/*D267 */,/*27114*/5520/*D268 */, /*27115*/5520/*D269 */,/*27116*/5520/*D26A */,/*27117*/5520/*D26B */,/*27118*/5520/*D26C */,/*27119*/5520/*D26D */, /*27120*/5520/*D26E */,/*27121*/5520/*D26F */,/*27122*/5520/*D270 */,/*27123*/5520/*D271 */,/*27124*/5520/*D272 */, /*27125*/5520/*D273 */,/*27126*/5520/*D274 */,/*27127*/5520/*D275 */,/*27128*/5520/*D276 */,/*27129*/5520/*D277 */, /*27130*/5520/*D278 */,/*27131*/5520/*D279 */,/*27132*/5520/*D27A */,/*27133*/5520/*D27B */,/*27134*/5520/*D27C */, /*27135*/5520/*D27D */,/*27136*/5520/*D27E */,/*27137*/5520/*D27F */,/*27138*/5519/* D280 */,/*27139*/5520/* D281 */, /*27140*/5520/*D282 */,/*27141*/5520/*D283 */,/*27142*/5520/*D284 */,/*27143*/5520/*D285 */,/*27144*/5520/*D286 */, /*27145*/5520/*D287 */,/*27146*/5520/*D288 */,/*27147*/5520/*D289 */,/*27148*/5520/*D28A */,/*27149*/5520/*D28B */, /*27150*/5520/*D28C */,/*27151*/5520/*D28D */,/*27152*/5520/*D28E */,/*27153*/5520/*D28F */,/*27154*/5520/*D290 */, /*27155*/5520/*D291 */,/*27156*/5520/*D292 */,/*27157*/5520/*D293 */,/*27158*/5520/*D294 */,/*27159*/5520/*D295 */, /*27160*/5520/*D296 */,/*27161*/5520/*D297 */,/*27162*/5520/*D298 */,/*27163*/5520/*D299 */,/*27164*/5520/*D29A */, /*27165*/5520/*D29B */,/*27166*/5519/* D29C */,/*27167*/5520/* D29D */,/*27168*/5520/*D29E */,/*27169*/5520/*D29F */, /*27170*/5520/*D2A0 */,/*27171*/5520/*D2A1 */,/*27172*/5520/*D2A2 */,/*27173*/5520/*D2A3 */,/*27174*/5520/*D2A4 */, /*27175*/5520/*D2A5 */,/*27176*/5520/*D2A6 */,/*27177*/5520/*D2A7 */,/*27178*/5520/*D2A8 */,/*27179*/5520/*D2A9 */, /*27180*/5520/*D2AA */,/*27181*/5520/*D2AB */,/*27182*/5520/*D2AC */,/*27183*/5520/*D2AD */,/*27184*/5520/*D2AE */, /*27185*/5520/*D2AF */,/*27186*/5520/*D2B0 */,/*27187*/5520/*D2B1 */,/*27188*/5520/*D2B2 */,/*27189*/5520/*D2B3 */, /*27190*/5520/*D2B4 */,/*27191*/5520/*D2B5 */,/*27192*/5520/*D2B6 */,/*27193*/5520/*D2B7 */,/*27194*/5519/* D2B8 */, /*27195*/5520/* D2B9 */,/*27196*/5520/*D2BA */,/*27197*/5520/*D2BB */,/*27198*/5520/*D2BC */,/*27199*/5520/*D2BD */, /*27200*/5520/*D2BE */,/*27201*/5520/*D2BF */,/*27202*/5520/*D2C0 */,/*27203*/5520/*D2C1 */,/*27204*/5520/*D2C2 */, /*27205*/5520/*D2C3 */,/*27206*/5520/*D2C4 */,/*27207*/5520/*D2C5 */,/*27208*/5520/*D2C6 */,/*27209*/5520/*D2C7 */, /*27210*/5520/*D2C8 */,/*27211*/5520/*D2C9 */,/*27212*/5520/*D2CA */,/*27213*/5520/*D2CB */,/*27214*/5520/*D2CC */, /*27215*/5520/*D2CD */,/*27216*/5520/*D2CE */,/*27217*/5520/*D2CF */,/*27218*/5520/*D2D0 */,/*27219*/5520/*D2D1 */, /*27220*/5520/*D2D2 */,/*27221*/5520/*D2D3 */,/*27222*/5519/* D2D4 */,/*27223*/5520/* D2D5 */,/*27224*/5520/*D2D6 */, /*27225*/5520/*D2D7 */,/*27226*/5520/*D2D8 */,/*27227*/5520/*D2D9 */,/*27228*/5520/*D2DA */,/*27229*/5520/*D2DB */, /*27230*/5520/*D2DC */,/*27231*/5520/*D2DD */,/*27232*/5520/*D2DE */,/*27233*/5520/*D2DF */,/*27234*/5520/*D2E0 */, /*27235*/5520/*D2E1 */,/*27236*/5520/*D2E2 */,/*27237*/5520/*D2E3 */,/*27238*/5520/*D2E4 */,/*27239*/5520/*D2E5 */, /*27240*/5520/*D2E6 */,/*27241*/5520/*D2E7 */,/*27242*/5520/*D2E8 */,/*27243*/5520/*D2E9 */,/*27244*/5520/*D2EA */, /*27245*/5520/*D2EB */,/*27246*/5520/*D2EC */,/*27247*/5520/*D2ED */,/*27248*/5520/*D2EE */,/*27249*/5520/*D2EF */, /*27250*/5519/* D2F0 */,/*27251*/5520/* D2F1 */,/*27252*/5520/*D2F2 */,/*27253*/5520/*D2F3 */,/*27254*/5520/*D2F4 */, /*27255*/5520/*D2F5 */,/*27256*/5520/*D2F6 */,/*27257*/5520/*D2F7 */,/*27258*/5520/*D2F8 */,/*27259*/5520/*D2F9 */, /*27260*/5520/*D2FA */,/*27261*/5520/*D2FB */,/*27262*/5520/*D2FC */,/*27263*/5520/*D2FD */,/*27264*/5520/*D2FE */, /*27265*/5520/*D2FF */,/*27266*/5520/*D300 */,/*27267*/5520/*D301 */,/*27268*/5520/*D302 */,/*27269*/5520/*D303 */, /*27270*/5520/*D304 */,/*27271*/5520/*D305 */,/*27272*/5520/*D306 */,/*27273*/5520/*D307 */,/*27274*/5520/*D308 */, /*27275*/5520/*D309 */,/*27276*/5520/*D30A */,/*27277*/5520/*D30B */,/*27278*/5519/* D30C */,/*27279*/5520/* D30D */, /*27280*/5520/*D30E */,/*27281*/5520/*D30F */,/*27282*/5520/*D310 */,/*27283*/5520/*D311 */,/*27284*/5520/*D312 */, /*27285*/5520/*D313 */,/*27286*/5520/*D314 */,/*27287*/5520/*D315 */,/*27288*/5520/*D316 */,/*27289*/5520/*D317 */, /*27290*/5520/*D318 */,/*27291*/5520/*D319 */,/*27292*/5520/*D31A */,/*27293*/5520/*D31B */,/*27294*/5520/*D31C */, /*27295*/5520/*D31D */,/*27296*/5520/*D31E */,/*27297*/5520/*D31F */,/*27298*/5520/*D320 */,/*27299*/5520/*D321 */, /*27300*/5520/*D322 */,/*27301*/5520/*D323 */,/*27302*/5520/*D324 */,/*27303*/5520/*D325 */,/*27304*/5520/*D326 */, /*27305*/5520/*D327 */,/*27306*/5519/* D328 */,/*27307*/5520/* D329 */,/*27308*/5520/*D32A */,/*27309*/5520/*D32B */, /*27310*/5520/*D32C */,/*27311*/5520/*D32D */,/*27312*/5520/*D32E */,/*27313*/5520/*D32F */,/*27314*/5520/*D330 */, /*27315*/5520/*D331 */,/*27316*/5520/*D332 */,/*27317*/5520/*D333 */,/*27318*/5520/*D334 */,/*27319*/5520/*D335 */, /*27320*/5520/*D336 */,/*27321*/5520/*D337 */,/*27322*/5520/*D338 */,/*27323*/5520/*D339 */,/*27324*/5520/*D33A */, /*27325*/5520/*D33B */,/*27326*/5520/*D33C */,/*27327*/5520/*D33D */,/*27328*/5520/*D33E */,/*27329*/5520/*D33F */, /*27330*/5520/*D340 */,/*27331*/5520/*D341 */,/*27332*/5520/*D342 */,/*27333*/5520/*D343 */,/*27334*/5519/* D344 */, /*27335*/5520/* D345 */,/*27336*/5520/*D346 */,/*27337*/5520/*D347 */,/*27338*/5520/*D348 */,/*27339*/5520/*D349 */, /*27340*/5520/*D34A */,/*27341*/5520/*D34B */,/*27342*/5520/*D34C */,/*27343*/5520/*D34D */,/*27344*/5520/*D34E */, /*27345*/5520/*D34F */,/*27346*/5520/*D350 */,/*27347*/5520/*D351 */,/*27348*/5520/*D352 */,/*27349*/5520/*D353 */, /*27350*/5520/*D354 */,/*27351*/5520/*D355 */,/*27352*/5520/*D356 */,/*27353*/5520/*D357 */,/*27354*/5520/*D358 */, /*27355*/5520/*D359 */,/*27356*/5520/*D35A */,/*27357*/5520/*D35B */,/*27358*/5520/*D35C */,/*27359*/5520/*D35D */, /*27360*/5520/*D35E */,/*27361*/5520/*D35F */,/*27362*/5519/* D360 */,/*27363*/5520/* D361 */,/*27364*/5520/*D362 */, /*27365*/5520/*D363 */,/*27366*/5520/*D364 */,/*27367*/5520/*D365 */,/*27368*/5520/*D366 */,/*27369*/5520/*D367 */, /*27370*/5520/*D368 */,/*27371*/5520/*D369 */,/*27372*/5520/*D36A */,/*27373*/5520/*D36B */,/*27374*/5520/*D36C */, /*27375*/5520/*D36D */,/*27376*/5520/*D36E */,/*27377*/5520/*D36F */,/*27378*/5520/*D370 */,/*27379*/5520/*D371 */, /*27380*/5520/*D372 */,/*27381*/5520/*D373 */,/*27382*/5520/*D374 */,/*27383*/5520/*D375 */,/*27384*/5520/*D376 */, /*27385*/5520/*D377 */,/*27386*/5520/*D378 */,/*27387*/5520/*D379 */,/*27388*/5520/*D37A */,/*27389*/5520/*D37B */, /*27390*/5519/* D37C */,/*27391*/5520/* D37D */,/*27392*/5520/*D37E */,/*27393*/5520/*D37F */,/*27394*/5520/*D380 */, /*27395*/5520/*D381 */,/*27396*/5520/*D382 */,/*27397*/5520/*D383 */,/*27398*/5520/*D384 */,/*27399*/5520/*D385 */, /*27400*/5520/*D386 */,/*27401*/5520/*D387 */,/*27402*/5520/*D388 */,/*27403*/5520/*D389 */,/*27404*/5520/*D38A */, /*27405*/5520/*D38B */,/*27406*/5520/*D38C */,/*27407*/5520/*D38D */,/*27408*/5520/*D38E */,/*27409*/5520/*D38F */, /*27410*/5520/*D390 */,/*27411*/5520/*D391 */,/*27412*/5520/*D392 */,/*27413*/5520/*D393 */,/*27414*/5520/*D394 */, /*27415*/5520/*D395 */,/*27416*/5520/*D396 */,/*27417*/5520/*D397 */,/*27418*/5519/* D398 */,/*27419*/5520/* D399 */, /*27420*/5520/*D39A */,/*27421*/5520/*D39B */,/*27422*/5520/*D39C */,/*27423*/5520/*D39D */,/*27424*/5520/*D39E */, /*27425*/5520/*D39F */,/*27426*/5520/*D3A0 */,/*27427*/5520/*D3A1 */,/*27428*/5520/*D3A2 */,/*27429*/5520/*D3A3 */, /*27430*/5520/*D3A4 */,/*27431*/5520/*D3A5 */,/*27432*/5520/*D3A6 */,/*27433*/5520/*D3A7 */,/*27434*/5520/*D3A8 */, /*27435*/5520/*D3A9 */,/*27436*/5520/*D3AA */,/*27437*/5520/*D3AB */,/*27438*/5520/*D3AC */,/*27439*/5520/*D3AD */, /*27440*/5520/*D3AE */,/*27441*/5520/*D3AF */,/*27442*/5520/*D3B0 */,/*27443*/5520/*D3B1 */,/*27444*/5520/*D3B2 */, /*27445*/5520/*D3B3 */,/*27446*/5519/* D3B4 */,/*27447*/5520/* D3B5 */,/*27448*/5520/*D3B6 */,/*27449*/5520/*D3B7 */, /*27450*/5520/*D3B8 */,/*27451*/5520/*D3B9 */,/*27452*/5520/*D3BA */,/*27453*/5520/*D3BB */,/*27454*/5520/*D3BC */, /*27455*/5520/*D3BD */,/*27456*/5520/*D3BE */,/*27457*/5520/*D3BF */,/*27458*/5520/*D3C0 */,/*27459*/5520/*D3C1 */, /*27460*/5520/*D3C2 */,/*27461*/5520/*D3C3 */,/*27462*/5520/*D3C4 */,/*27463*/5520/*D3C5 */,/*27464*/5520/*D3C6 */, /*27465*/5520/*D3C7 */,/*27466*/5520/*D3C8 */,/*27467*/5520/*D3C9 */,/*27468*/5520/*D3CA */,/*27469*/5520/*D3CB */, /*27470*/5520/*D3CC */,/*27471*/5520/*D3CD */,/*27472*/5520/*D3CE */,/*27473*/5520/*D3CF */,/*27474*/5519/* D3D0 */, /*27475*/5520/* D3D1 */,/*27476*/5520/*D3D2 */,/*27477*/5520/*D3D3 */,/*27478*/5520/*D3D4 */,/*27479*/5520/*D3D5 */, /*27480*/5520/*D3D6 */,/*27481*/5520/*D3D7 */,/*27482*/5520/*D3D8 */,/*27483*/5520/*D3D9 */,/*27484*/5520/*D3DA */, /*27485*/5520/*D3DB */,/*27486*/5520/*D3DC */,/*27487*/5520/*D3DD */,/*27488*/5520/*D3DE */,/*27489*/5520/*D3DF */, /*27490*/5520/*D3E0 */,/*27491*/5520/*D3E1 */,/*27492*/5520/*D3E2 */,/*27493*/5520/*D3E3 */,/*27494*/5520/*D3E4 */, /*27495*/5520/*D3E5 */,/*27496*/5520/*D3E6 */,/*27497*/5520/*D3E7 */,/*27498*/5520/*D3E8 */,/*27499*/5520/*D3E9 */, /*27500*/5520/*D3EA */,/*27501*/5520/*D3EB */,/*27502*/5519/* D3EC */,/*27503*/5520/* D3ED */,/*27504*/5520/*D3EE */, /*27505*/5520/*D3EF */,/*27506*/5520/*D3F0 */,/*27507*/5520/*D3F1 */,/*27508*/5520/*D3F2 */,/*27509*/5520/*D3F3 */, /*27510*/5520/*D3F4 */,/*27511*/5520/*D3F5 */,/*27512*/5520/*D3F6 */,/*27513*/5520/*D3F7 */,/*27514*/5520/*D3F8 */, /*27515*/5520/*D3F9 */,/*27516*/5520/*D3FA */,/*27517*/5520/*D3FB */,/*27518*/5520/*D3FC */,/*27519*/5520/*D3FD */, /*27520*/5520/*D3FE */,/*27521*/5520/*D3FF */,/*27522*/5520/*D400 */,/*27523*/5520/*D401 */,/*27524*/5520/*D402 */, /*27525*/5520/*D403 */,/*27526*/5520/*D404 */,/*27527*/5520/*D405 */,/*27528*/5520/*D406 */,/*27529*/5520/*D407 */, /*27530*/5519/* D408 */,/*27531*/5520/* D409 */,/*27532*/5520/*D40A */,/*27533*/5520/*D40B */,/*27534*/5520/*D40C */, /*27535*/5520/*D40D */,/*27536*/5520/*D40E */,/*27537*/5520/*D40F */,/*27538*/5520/*D410 */,/*27539*/5520/*D411 */, /*27540*/5520/*D412 */,/*27541*/5520/*D413 */,/*27542*/5520/*D414 */,/*27543*/5520/*D415 */,/*27544*/5520/*D416 */, /*27545*/5520/*D417 */,/*27546*/5520/*D418 */,/*27547*/5520/*D419 */,/*27548*/5520/*D41A */,/*27549*/5520/*D41B */, /*27550*/5520/*D41C */,/*27551*/5520/*D41D */,/*27552*/5520/*D41E */,/*27553*/5520/*D41F */,/*27554*/5520/*D420 */, /*27555*/5520/*D421 */,/*27556*/5520/*D422 */,/*27557*/5520/*D423 */,/*27558*/5519/* D424 */,/*27559*/5520/* D425 */, /*27560*/5520/*D426 */,/*27561*/5520/*D427 */,/*27562*/5520/*D428 */,/*27563*/5520/*D429 */,/*27564*/5520/*D42A */, /*27565*/5520/*D42B */,/*27566*/5520/*D42C */,/*27567*/5520/*D42D */,/*27568*/5520/*D42E */,/*27569*/5520/*D42F */, /*27570*/5520/*D430 */,/*27571*/5520/*D431 */,/*27572*/5520/*D432 */,/*27573*/5520/*D433 */,/*27574*/5520/*D434 */, /*27575*/5520/*D435 */,/*27576*/5520/*D436 */,/*27577*/5520/*D437 */,/*27578*/5520/*D438 */,/*27579*/5520/*D439 */, /*27580*/5520/*D43A */,/*27581*/5520/*D43B */,/*27582*/5520/*D43C */,/*27583*/5520/*D43D */,/*27584*/5520/*D43E */, /*27585*/5520/*D43F */,/*27586*/5519/* D440 */,/*27587*/5520/* D441 */,/*27588*/5520/*D442 */,/*27589*/5520/*D443 */, /*27590*/5520/*D444 */,/*27591*/5520/*D445 */,/*27592*/5520/*D446 */,/*27593*/5520/*D447 */,/*27594*/5520/*D448 */, /*27595*/5520/*D449 */,/*27596*/5520/*D44A */,/*27597*/5520/*D44B */,/*27598*/5520/*D44C */,/*27599*/5520/*D44D */, /*27600*/5520/*D44E */,/*27601*/5520/*D44F */,/*27602*/5520/*D450 */,/*27603*/5520/*D451 */,/*27604*/5520/*D452 */, /*27605*/5520/*D453 */,/*27606*/5520/*D454 */,/*27607*/5520/*D455 */,/*27608*/5520/*D456 */,/*27609*/5520/*D457 */, /*27610*/5520/*D458 */,/*27611*/5520/*D459 */,/*27612*/5520/*D45A */,/*27613*/5520/*D45B */,/*27614*/5519/* D45C */, /*27615*/5520/* D45D */,/*27616*/5520/*D45E */,/*27617*/5520/*D45F */,/*27618*/5520/*D460 */,/*27619*/5520/*D461 */, /*27620*/5520/*D462 */,/*27621*/5520/*D463 */,/*27622*/5520/*D464 */,/*27623*/5520/*D465 */,/*27624*/5520/*D466 */, /*27625*/5520/*D467 */,/*27626*/5520/*D468 */,/*27627*/5520/*D469 */,/*27628*/5520/*D46A */,/*27629*/5520/*D46B */, /*27630*/5520/*D46C */,/*27631*/5520/*D46D */,/*27632*/5520/*D46E */,/*27633*/5520/*D46F */,/*27634*/5520/*D470 */, /*27635*/5520/*D471 */,/*27636*/5520/*D472 */,/*27637*/5520/*D473 */,/*27638*/5520/*D474 */,/*27639*/5520/*D475 */, /*27640*/5520/*D476 */,/*27641*/5520/*D477 */,/*27642*/5519/* D478 */,/*27643*/5520/* D479 */,/*27644*/5520/*D47A */, /*27645*/5520/*D47B */,/*27646*/5520/*D47C */,/*27647*/5520/*D47D */,/*27648*/5520/*D47E */,/*27649*/5520/*D47F */, /*27650*/5520/*D480 */,/*27651*/5520/*D481 */,/*27652*/5520/*D482 */,/*27653*/5520/*D483 */,/*27654*/5520/*D484 */, /*27655*/5520/*D485 */,/*27656*/5520/*D486 */,/*27657*/5520/*D487 */,/*27658*/5520/*D488 */,/*27659*/5520/*D489 */, /*27660*/5520/*D48A */,/*27661*/5520/*D48B */,/*27662*/5520/*D48C */,/*27663*/5520/*D48D */,/*27664*/5520/*D48E */, /*27665*/5520/*D48F */,/*27666*/5520/*D490 */,/*27667*/5520/*D491 */,/*27668*/5520/*D492 */,/*27669*/5520/*D493 */, /*27670*/5519/* D494 */,/*27671*/5520/* D495 */,/*27672*/5520/*D496 */,/*27673*/5520/*D497 */,/*27674*/5520/*D498 */, /*27675*/5520/*D499 */,/*27676*/5520/*D49A */,/*27677*/5520/*D49B */,/*27678*/5520/*D49C */,/*27679*/5520/*D49D */, /*27680*/5520/*D49E */,/*27681*/5520/*D49F */,/*27682*/5520/*D4A0 */,/*27683*/5520/*D4A1 */,/*27684*/5520/*D4A2 */, /*27685*/5520/*D4A3 */,/*27686*/5520/*D4A4 */,/*27687*/5520/*D4A5 */,/*27688*/5520/*D4A6 */,/*27689*/5520/*D4A7 */, /*27690*/5520/*D4A8 */,/*27691*/5520/*D4A9 */,/*27692*/5520/*D4AA */,/*27693*/5520/*D4AB */,/*27694*/5520/*D4AC */, /*27695*/5520/*D4AD */,/*27696*/5520/*D4AE */,/*27697*/5520/*D4AF */,/*27698*/5519/* D4B0 */,/*27699*/5520/* D4B1 */, /*27700*/5520/*D4B2 */,/*27701*/5520/*D4B3 */,/*27702*/5520/*D4B4 */,/*27703*/5520/*D4B5 */,/*27704*/5520/*D4B6 */, /*27705*/5520/*D4B7 */,/*27706*/5520/*D4B8 */,/*27707*/5520/*D4B9 */,/*27708*/5520/*D4BA */,/*27709*/5520/*D4BB */, /*27710*/5520/*D4BC */,/*27711*/5520/*D4BD */,/*27712*/5520/*D4BE */,/*27713*/5520/*D4BF */,/*27714*/5520/*D4C0 */, /*27715*/5520/*D4C1 */,/*27716*/5520/*D4C2 */,/*27717*/5520/*D4C3 */,/*27718*/5520/*D4C4 */,/*27719*/5520/*D4C5 */, /*27720*/5520/*D4C6 */,/*27721*/5520/*D4C7 */,/*27722*/5520/*D4C8 */,/*27723*/5520/*D4C9 */,/*27724*/5520/*D4CA */, /*27725*/5520/*D4CB */,/*27726*/5519/* D4CC */,/*27727*/5520/* D4CD */,/*27728*/5520/*D4CE */,/*27729*/5520/*D4CF */, /*27730*/5520/*D4D0 */,/*27731*/5520/*D4D1 */,/*27732*/5520/*D4D2 */,/*27733*/5520/*D4D3 */,/*27734*/5520/*D4D4 */, /*27735*/5520/*D4D5 */,/*27736*/5520/*D4D6 */,/*27737*/5520/*D4D7 */,/*27738*/5520/*D4D8 */,/*27739*/5520/*D4D9 */, /*27740*/5520/*D4DA */,/*27741*/5520/*D4DB */,/*27742*/5520/*D4DC */,/*27743*/5520/*D4DD */,/*27744*/5520/*D4DE */, /*27745*/5520/*D4DF */,/*27746*/5520/*D4E0 */,/*27747*/5520/*D4E1 */,/*27748*/5520/*D4E2 */,/*27749*/5520/*D4E3 */, /*27750*/5520/*D4E4 */,/*27751*/5520/*D4E5 */,/*27752*/5520/*D4E6 */,/*27753*/5520/*D4E7 */,/*27754*/5519/* D4E8 */, /*27755*/5520/* D4E9 */,/*27756*/5520/*D4EA */,/*27757*/5520/*D4EB */,/*27758*/5520/*D4EC */,/*27759*/5520/*D4ED */, /*27760*/5520/*D4EE */,/*27761*/5520/*D4EF */,/*27762*/5520/*D4F0 */,/*27763*/5520/*D4F1 */,/*27764*/5520/*D4F2 */, /*27765*/5520/*D4F3 */,/*27766*/5520/*D4F4 */,/*27767*/5520/*D4F5 */,/*27768*/5520/*D4F6 */,/*27769*/5520/*D4F7 */, /*27770*/5520/*D4F8 */,/*27771*/5520/*D4F9 */,/*27772*/5520/*D4FA */,/*27773*/5520/*D4FB */,/*27774*/5520/*D4FC */, /*27775*/5520/*D4FD */,/*27776*/5520/*D4FE */,/*27777*/5520/*D4FF */,/*27778*/5520/*D500 */,/*27779*/5520/*D501 */, /*27780*/5520/*D502 */,/*27781*/5520/*D503 */,/*27782*/5519/* D504 */,/*27783*/5520/* D505 */,/*27784*/5520/*D506 */, /*27785*/5520/*D507 */,/*27786*/5520/*D508 */,/*27787*/5520/*D509 */,/*27788*/5520/*D50A */,/*27789*/5520/*D50B */, /*27790*/5520/*D50C */,/*27791*/5520/*D50D */,/*27792*/5520/*D50E */,/*27793*/5520/*D50F */,/*27794*/5520/*D510 */, /*27795*/5520/*D511 */,/*27796*/5520/*D512 */,/*27797*/5520/*D513 */,/*27798*/5520/*D514 */,/*27799*/5520/*D515 */, /*27800*/5520/*D516 */,/*27801*/5520/*D517 */,/*27802*/5520/*D518 */,/*27803*/5520/*D519 */,/*27804*/5520/*D51A */, /*27805*/5520/*D51B */,/*27806*/5520/*D51C */,/*27807*/5520/*D51D */,/*27808*/5520/*D51E */,/*27809*/5520/*D51F */, /*27810*/5519/* D520 */,/*27811*/5520/* D521 */,/*27812*/5520/*D522 */,/*27813*/5520/*D523 */,/*27814*/5520/*D524 */, /*27815*/5520/*D525 */,/*27816*/5520/*D526 */,/*27817*/5520/*D527 */,/*27818*/5520/*D528 */,/*27819*/5520/*D529 */, /*27820*/5520/*D52A */,/*27821*/5520/*D52B */,/*27822*/5520/*D52C */,/*27823*/5520/*D52D */,/*27824*/5520/*D52E */, /*27825*/5520/*D52F */,/*27826*/5520/*D530 */,/*27827*/5520/*D531 */,/*27828*/5520/*D532 */,/*27829*/5520/*D533 */, /*27830*/5520/*D534 */,/*27831*/5520/*D535 */,/*27832*/5520/*D536 */,/*27833*/5520/*D537 */,/*27834*/5520/*D538 */, /*27835*/5520/*D539 */,/*27836*/5520/*D53A */,/*27837*/5520/*D53B */,/*27838*/5519/* D53C */,/*27839*/5520/* D53D */, /*27840*/5520/*D53E */,/*27841*/5520/*D53F */,/*27842*/5520/*D540 */,/*27843*/5520/*D541 */,/*27844*/5520/*D542 */, /*27845*/5520/*D543 */,/*27846*/5520/*D544 */,/*27847*/5520/*D545 */,/*27848*/5520/*D546 */,/*27849*/5520/*D547 */, /*27850*/5520/*D548 */,/*27851*/5520/*D549 */,/*27852*/5520/*D54A */,/*27853*/5520/*D54B */,/*27854*/5520/*D54C */, /*27855*/5520/*D54D */,/*27856*/5520/*D54E */,/*27857*/5520/*D54F */,/*27858*/5520/*D550 */,/*27859*/5520/*D551 */, /*27860*/5520/*D552 */,/*27861*/5520/*D553 */,/*27862*/5520/*D554 */,/*27863*/5520/*D555 */,/*27864*/5520/*D556 */, /*27865*/5520/*D557 */,/*27866*/5519/* D558 */,/*27867*/5520/* D559 */,/*27868*/5520/*D55A */,/*27869*/5520/*D55B */, /*27870*/5520/*D55C */,/*27871*/5520/*D55D */,/*27872*/5520/*D55E */,/*27873*/5520/*D55F */,/*27874*/5520/*D560 */, /*27875*/5520/*D561 */,/*27876*/5520/*D562 */,/*27877*/5520/*D563 */,/*27878*/5520/*D564 */,/*27879*/5520/*D565 */, /*27880*/5520/*D566 */,/*27881*/5520/*D567 */,/*27882*/5520/*D568 */,/*27883*/5520/*D569 */,/*27884*/5520/*D56A */, /*27885*/5520/*D56B */,/*27886*/5520/*D56C */,/*27887*/5520/*D56D */,/*27888*/5520/*D56E */,/*27889*/5520/*D56F */, /*27890*/5520/*D570 */,/*27891*/5520/*D571 */,/*27892*/5520/*D572 */,/*27893*/5520/*D573 */,/*27894*/5519/* D574 */, /*27895*/5520/* D575 */,/*27896*/5520/*D576 */,/*27897*/5520/*D577 */,/*27898*/5520/*D578 */,/*27899*/5520/*D579 */, /*27900*/5520/*D57A */,/*27901*/5520/*D57B */,/*27902*/5520/*D57C */,/*27903*/5520/*D57D */,/*27904*/5520/*D57E */, /*27905*/5520/*D57F */,/*27906*/5520/*D580 */,/*27907*/5520/*D581 */,/*27908*/5520/*D582 */,/*27909*/5520/*D583 */, /*27910*/5520/*D584 */,/*27911*/5520/*D585 */,/*27912*/5520/*D586 */,/*27913*/5520/*D587 */,/*27914*/5520/*D588 */, /*27915*/5520/*D589 */,/*27916*/5520/*D58A */,/*27917*/5520/*D58B */,/*27918*/5520/*D58C */,/*27919*/5520/*D58D */, /*27920*/5520/*D58E */,/*27921*/5520/*D58F */,/*27922*/5519/* D590 */,/*27923*/5520/* D591 */,/*27924*/5520/*D592 */, /*27925*/5520/*D593 */,/*27926*/5520/*D594 */,/*27927*/5520/*D595 */,/*27928*/5520/*D596 */,/*27929*/5520/*D597 */, /*27930*/5520/*D598 */,/*27931*/5520/*D599 */,/*27932*/5520/*D59A */,/*27933*/5520/*D59B */,/*27934*/5520/*D59C */, /*27935*/5520/*D59D */,/*27936*/5520/*D59E */,/*27937*/5520/*D59F */,/*27938*/5520/*D5A0 */,/*27939*/5520/*D5A1 */, /*27940*/5520/*D5A2 */,/*27941*/5520/*D5A3 */,/*27942*/5520/*D5A4 */,/*27943*/5520/*D5A5 */,/*27944*/5520/*D5A6 */, /*27945*/5520/*D5A7 */,/*27946*/5520/*D5A8 */,/*27947*/5520/*D5A9 */,/*27948*/5520/*D5AA */,/*27949*/5520/*D5AB */, /*27950*/5519/* D5AC */,/*27951*/5520/* D5AD */,/*27952*/5520/*D5AE */,/*27953*/5520/*D5AF */,/*27954*/5520/*D5B0 */, /*27955*/5520/*D5B1 */,/*27956*/5520/*D5B2 */,/*27957*/5520/*D5B3 */,/*27958*/5520/*D5B4 */,/*27959*/5520/*D5B5 */, /*27960*/5520/*D5B6 */,/*27961*/5520/*D5B7 */,/*27962*/5520/*D5B8 */,/*27963*/5520/*D5B9 */,/*27964*/5520/*D5BA */, /*27965*/5520/*D5BB */,/*27966*/5520/*D5BC */,/*27967*/5520/*D5BD */,/*27968*/5520/*D5BE */,/*27969*/5520/*D5BF */, /*27970*/5520/*D5C0 */,/*27971*/5520/*D5C1 */,/*27972*/5520/*D5C2 */,/*27973*/5520/*D5C3 */,/*27974*/5520/*D5C4 */, /*27975*/5520/*D5C5 */,/*27976*/5520/*D5C6 */,/*27977*/5520/*D5C7 */,/*27978*/5519/* D5C8 */,/*27979*/5520/* D5C9 */, /*27980*/5520/*D5CA */,/*27981*/5520/*D5CB */,/*27982*/5520/*D5CC */,/*27983*/5520/*D5CD */,/*27984*/5520/*D5CE */, /*27985*/5520/*D5CF */,/*27986*/5520/*D5D0 */,/*27987*/5520/*D5D1 */,/*27988*/5520/*D5D2 */,/*27989*/5520/*D5D3 */, /*27990*/5520/*D5D4 */,/*27991*/5520/*D5D5 */,/*27992*/5520/*D5D6 */,/*27993*/5520/*D5D7 */,/*27994*/5520/*D5D8 */, /*27995*/5520/*D5D9 */,/*27996*/5520/*D5DA */,/*27997*/5520/*D5DB */,/*27998*/5520/*D5DC */,/*27999*/5520/*D5DD */, /*28000*/5520/*D5DE */,/*28001*/5520/*D5DF */,/*28002*/5520/*D5E0 */,/*28003*/5520/*D5E1 */,/*28004*/5520/*D5E2 */, /*28005*/5520/*D5E3 */,/*28006*/5519/* D5E4 */,/*28007*/5520/* D5E5 */,/*28008*/5520/*D5E6 */,/*28009*/5520/*D5E7 */, /*28010*/5520/*D5E8 */,/*28011*/5520/*D5E9 */,/*28012*/5520/*D5EA */,/*28013*/5520/*D5EB */,/*28014*/5520/*D5EC */, /*28015*/5520/*D5ED */,/*28016*/5520/*D5EE */,/*28017*/5520/*D5EF */,/*28018*/5520/*D5F0 */,/*28019*/5520/*D5F1 */, /*28020*/5520/*D5F2 */,/*28021*/5520/*D5F3 */,/*28022*/5520/*D5F4 */,/*28023*/5520/*D5F5 */,/*28024*/5520/*D5F6 */, /*28025*/5520/*D5F7 */,/*28026*/5520/*D5F8 */,/*28027*/5520/*D5F9 */,/*28028*/5520/*D5FA */,/*28029*/5520/*D5FB */, /*28030*/5520/*D5FC */,/*28031*/5520/*D5FD */,/*28032*/5520/*D5FE */,/*28033*/5520/*D5FF */,/*28034*/5519/* D600 */, /*28035*/5520/* D601 */,/*28036*/5520/*D602 */,/*28037*/5520/*D603 */,/*28038*/5520/*D604 */,/*28039*/5520/*D605 */, /*28040*/5520/*D606 */,/*28041*/5520/*D607 */,/*28042*/5520/*D608 */,/*28043*/5520/*D609 */,/*28044*/5520/*D60A */, /*28045*/5520/*D60B */,/*28046*/5520/*D60C */,/*28047*/5520/*D60D */,/*28048*/5520/*D60E */,/*28049*/5520/*D60F */, /*28050*/5520/*D610 */,/*28051*/5520/*D611 */,/*28052*/5520/*D612 */,/*28053*/5520/*D613 */,/*28054*/5520/*D614 */, /*28055*/5520/*D615 */,/*28056*/5520/*D616 */,/*28057*/5520/*D617 */,/*28058*/5520/*D618 */,/*28059*/5520/*D619 */, /*28060*/5520/*D61A */,/*28061*/5520/*D61B */,/*28062*/5519/* D61C */,/*28063*/5520/* D61D */,/*28064*/5520/*D61E */, /*28065*/5520/*D61F */,/*28066*/5520/*D620 */,/*28067*/5520/*D621 */,/*28068*/5520/*D622 */,/*28069*/5520/*D623 */, /*28070*/5520/*D624 */,/*28071*/5520/*D625 */,/*28072*/5520/*D626 */,/*28073*/5520/*D627 */,/*28074*/5520/*D628 */, /*28075*/5520/*D629 */,/*28076*/5520/*D62A */,/*28077*/5520/*D62B */,/*28078*/5520/*D62C */,/*28079*/5520/*D62D */, /*28080*/5520/*D62E */,/*28081*/5520/*D62F */,/*28082*/5520/*D630 */,/*28083*/5520/*D631 */,/*28084*/5520/*D632 */, /*28085*/5520/*D633 */,/*28086*/5520/*D634 */,/*28087*/5520/*D635 */,/*28088*/5520/*D636 */,/*28089*/5520/*D637 */, /*28090*/5519/* D638 */,/*28091*/5520/* D639 */,/*28092*/5520/*D63A */,/*28093*/5520/*D63B */,/*28094*/5520/*D63C */, /*28095*/5520/*D63D */,/*28096*/5520/*D63E */,/*28097*/5520/*D63F */,/*28098*/5520/*D640 */,/*28099*/5520/*D641 */, /*28100*/5520/*D642 */,/*28101*/5520/*D643 */,/*28102*/5520/*D644 */,/*28103*/5520/*D645 */,/*28104*/5520/*D646 */, /*28105*/5520/*D647 */,/*28106*/5520/*D648 */,/*28107*/5520/*D649 */,/*28108*/5520/*D64A */,/*28109*/5520/*D64B */, /*28110*/5520/*D64C */,/*28111*/5520/*D64D */,/*28112*/5520/*D64E */,/*28113*/5520/*D64F */,/*28114*/5520/*D650 */, /*28115*/5520/*D651 */,/*28116*/5520/*D652 */,/*28117*/5520/*D653 */,/*28118*/5519/* D654 */,/*28119*/5520/* D655 */, /*28120*/5520/*D656 */,/*28121*/5520/*D657 */,/*28122*/5520/*D658 */,/*28123*/5520/*D659 */,/*28124*/5520/*D65A */, /*28125*/5520/*D65B */,/*28126*/5520/*D65C */,/*28127*/5520/*D65D */,/*28128*/5520/*D65E */,/*28129*/5520/*D65F */, /*28130*/5520/*D660 */,/*28131*/5520/*D661 */,/*28132*/5520/*D662 */,/*28133*/5520/*D663 */,/*28134*/5520/*D664 */, /*28135*/5520/*D665 */,/*28136*/5520/*D666 */,/*28137*/5520/*D667 */,/*28138*/5520/*D668 */,/*28139*/5520/*D669 */, /*28140*/5520/*D66A */,/*28141*/5520/*D66B */,/*28142*/5520/*D66C */,/*28143*/5520/*D66D */,/*28144*/5520/*D66E */, /*28145*/5520/*D66F */,/*28146*/5519/* D670 */,/*28147*/5520/* D671 */,/*28148*/5520/*D672 */,/*28149*/5520/*D673 */, /*28150*/5520/*D674 */,/*28151*/5520/*D675 */,/*28152*/5520/*D676 */,/*28153*/5520/*D677 */,/*28154*/5520/*D678 */, /*28155*/5520/*D679 */,/*28156*/5520/*D67A */,/*28157*/5520/*D67B */,/*28158*/5520/*D67C */,/*28159*/5520/*D67D */, /*28160*/5520/*D67E */,/*28161*/5520/*D67F */,/*28162*/5520/*D680 */,/*28163*/5520/*D681 */,/*28164*/5520/*D682 */, /*28165*/5520/*D683 */,/*28166*/5520/*D684 */,/*28167*/5520/*D685 */,/*28168*/5520/*D686 */,/*28169*/5520/*D687 */, /*28170*/5520/*D688 */,/*28171*/5520/*D689 */,/*28172*/5520/*D68A */,/*28173*/5520/*D68B */,/*28174*/5519/* D68C */, /*28175*/5520/* D68D */,/*28176*/5520/*D68E */,/*28177*/5520/*D68F */,/*28178*/5520/*D690 */,/*28179*/5520/*D691 */, /*28180*/5520/*D692 */,/*28181*/5520/*D693 */,/*28182*/5520/*D694 */,/*28183*/5520/*D695 */,/*28184*/5520/*D696 */, /*28185*/5520/*D697 */,/*28186*/5520/*D698 */,/*28187*/5520/*D699 */,/*28188*/5520/*D69A */,/*28189*/5520/*D69B */, /*28190*/5520/*D69C */,/*28191*/5520/*D69D */,/*28192*/5520/*D69E */,/*28193*/5520/*D69F */,/*28194*/5520/*D6A0 */, /*28195*/5520/*D6A1 */,/*28196*/5520/*D6A2 */,/*28197*/5520/*D6A3 */,/*28198*/5520/*D6A4 */,/*28199*/5520/*D6A5 */, /*28200*/5520/*D6A6 */,/*28201*/5520/*D6A7 */,/*28202*/5519/* D6A8 */,/*28203*/5520/* D6A9 */,/*28204*/5520/*D6AA */, /*28205*/5520/*D6AB */,/*28206*/5520/*D6AC */,/*28207*/5520/*D6AD */,/*28208*/5520/*D6AE */,/*28209*/5520/*D6AF */, /*28210*/5520/*D6B0 */,/*28211*/5520/*D6B1 */,/*28212*/5520/*D6B2 */,/*28213*/5520/*D6B3 */,/*28214*/5520/*D6B4 */, /*28215*/5520/*D6B5 */,/*28216*/5520/*D6B6 */,/*28217*/5520/*D6B7 */,/*28218*/5520/*D6B8 */,/*28219*/5520/*D6B9 */, /*28220*/5520/*D6BA */,/*28221*/5520/*D6BB */,/*28222*/5520/*D6BC */,/*28223*/5520/*D6BD */,/*28224*/5520/*D6BE */, /*28225*/5520/*D6BF */,/*28226*/5520/*D6C0 */,/*28227*/5520/*D6C1 */,/*28228*/5520/*D6C2 */,/*28229*/5520/*D6C3 */, /*28230*/5519/* D6C4 */,/*28231*/5520/* D6C5 */,/*28232*/5520/*D6C6 */,/*28233*/5520/*D6C7 */,/*28234*/5520/*D6C8 */, /*28235*/5520/*D6C9 */,/*28236*/5520/*D6CA */,/*28237*/5520/*D6CB */,/*28238*/5520/*D6CC */,/*28239*/5520/*D6CD */, /*28240*/5520/*D6CE */,/*28241*/5520/*D6CF */,/*28242*/5520/*D6D0 */,/*28243*/5520/*D6D1 */,/*28244*/5520/*D6D2 */, /*28245*/5520/*D6D3 */,/*28246*/5520/*D6D4 */,/*28247*/5520/*D6D5 */,/*28248*/5520/*D6D6 */,/*28249*/5520/*D6D7 */, /*28250*/5520/*D6D8 */,/*28251*/5520/*D6D9 */,/*28252*/5520/*D6DA */,/*28253*/5520/*D6DB */,/*28254*/5520/*D6DC */, /*28255*/5520/*D6DD */,/*28256*/5520/*D6DE */,/*28257*/5520/*D6DF */,/*28258*/5519/* D6E0 */,/*28259*/5520/* D6E1 */, /*28260*/5520/*D6E2 */,/*28261*/5520/*D6E3 */,/*28262*/5520/*D6E4 */,/*28263*/5520/*D6E5 */,/*28264*/5520/*D6E6 */, /*28265*/5520/*D6E7 */,/*28266*/5520/*D6E8 */,/*28267*/5520/*D6E9 */,/*28268*/5520/*D6EA */,/*28269*/5520/*D6EB */, /*28270*/5520/*D6EC */,/*28271*/5520/*D6ED */,/*28272*/5520/*D6EE */,/*28273*/5520/*D6EF */,/*28274*/5520/*D6F0 */, /*28275*/5520/*D6F1 */,/*28276*/5520/*D6F2 */,/*28277*/5520/*D6F3 */,/*28278*/5520/*D6F4 */,/*28279*/5520/*D6F5 */, /*28280*/5520/*D6F6 */,/*28281*/5520/*D6F7 */,/*28282*/5520/*D6F8 */,/*28283*/5520/*D6F9 */,/*28284*/5520/*D6FA */, /*28285*/5520/*D6FB */,/*28286*/5519/* D6FC */,/*28287*/5520/* D6FD */,/*28288*/5520/*D6FE */,/*28289*/5520/*D6FF */, /*28290*/5520/*D700 */,/*28291*/5520/*D701 */,/*28292*/5520/*D702 */,/*28293*/5520/*D703 */,/*28294*/5520/*D704 */, /*28295*/5520/*D705 */,/*28296*/5520/*D706 */,/*28297*/5520/*D707 */,/*28298*/5520/*D708 */,/*28299*/5520/*D709 */, /*28300*/5520/*D70A */,/*28301*/5520/*D70B */,/*28302*/5520/*D70C */,/*28303*/5520/*D70D */,/*28304*/5520/*D70E */, /*28305*/5520/*D70F */,/*28306*/5520/*D710 */,/*28307*/5520/*D711 */,/*28308*/5520/*D712 */,/*28309*/5520/*D713 */, /*28310*/5520/*D714 */,/*28311*/5520/*D715 */,/*28312*/5520/*D716 */,/*28313*/5520/*D717 */,/*28314*/5519/* D718 */, /*28315*/5520/* D719 */,/*28316*/5520/*D71A */,/*28317*/5520/*D71B */,/*28318*/5520/*D71C */,/*28319*/5520/*D71D */, /*28320*/5520/*D71E */,/*28321*/5520/*D71F */,/*28322*/5520/*D720 */,/*28323*/5520/*D721 */,/*28324*/5520/*D722 */, /*28325*/5520/*D723 */,/*28326*/5520/*D724 */,/*28327*/5520/*D725 */,/*28328*/5520/*D726 */,/*28329*/5520/*D727 */, /*28330*/5520/*D728 */,/*28331*/5520/*D729 */,/*28332*/5520/*D72A */,/*28333*/5520/*D72B */,/*28334*/5520/*D72C */, /*28335*/5520/*D72D */,/*28336*/5520/*D72E */,/*28337*/5520/*D72F */,/*28338*/5520/*D730 */,/*28339*/5520/*D731 */, /*28340*/5520/*D732 */,/*28341*/5520/*D733 */,/*28342*/5519/* D734 */,/*28343*/5520/* D735 */,/*28344*/5520/*D736 */, /*28345*/5520/*D737 */,/*28346*/5520/*D738 */,/*28347*/5520/*D739 */,/*28348*/5520/*D73A */,/*28349*/5520/*D73B */, /*28350*/5520/*D73C */,/*28351*/5520/*D73D */,/*28352*/5520/*D73E */,/*28353*/5520/*D73F */,/*28354*/5520/*D740 */, /*28355*/5520/*D741 */,/*28356*/5520/*D742 */,/*28357*/5520/*D743 */,/*28358*/5520/*D744 */,/*28359*/5520/*D745 */, /*28360*/5520/*D746 */,/*28361*/5520/*D747 */,/*28362*/5520/*D748 */,/*28363*/5520/*D749 */,/*28364*/5520/*D74A */, /*28365*/5520/*D74B */,/*28366*/5520/*D74C */,/*28367*/5520/*D74D */,/*28368*/5520/*D74E */,/*28369*/5520/*D74F */, /*28370*/5519/* D750 */,/*28371*/5520/* D751 */,/*28372*/5520/*D752 */,/*28373*/5520/*D753 */,/*28374*/5520/*D754 */, /*28375*/5520/*D755 */,/*28376*/5520/*D756 */,/*28377*/5520/*D757 */,/*28378*/5520/*D758 */,/*28379*/5520/*D759 */, /*28380*/5520/*D75A */,/*28381*/5520/*D75B */,/*28382*/5520/*D75C */,/*28383*/5520/*D75D */,/*28384*/5520/*D75E */, /*28385*/5520/*D75F */,/*28386*/5520/*D760 */,/*28387*/5520/*D761 */,/*28388*/5520/*D762 */,/*28389*/5520/*D763 */, /*28390*/5520/*D764 */,/*28391*/5520/*D765 */,/*28392*/5520/*D766 */,/*28393*/5520/*D767 */,/*28394*/5520/*D768 */, /*28395*/5520/*D769 */,/*28396*/5520/*D76A */,/*28397*/5520/*D76B */,/*28398*/5519/* D76C */,/*28399*/5520/* D76D */, /*28400*/5520/*D76E */,/*28401*/5520/*D76F */,/*28402*/5520/*D770 */,/*28403*/5520/*D771 */,/*28404*/5520/*D772 */, /*28405*/5520/*D773 */,/*28406*/5520/*D774 */,/*28407*/5520/*D775 */,/*28408*/5520/*D776 */,/*28409*/5520/*D777 */, /*28410*/5520/*D778 */,/*28411*/5520/*D779 */,/*28412*/5520/*D77A */,/*28413*/5520/*D77B */,/*28414*/5520/*D77C */, /*28415*/5520/*D77D */,/*28416*/5520/*D77E */,/*28417*/5520/*D77F */,/*28418*/5520/*D780 */,/*28419*/5520/*D781 */, /*28420*/5520/*D782 */,/*28421*/5520/*D783 */,/*28422*/5520/*D784 */,/*28423*/5520/*D785 */,/*28424*/5520/*D786 */, /*28425*/5520/*D787 */,/*28426*/5519/* D788 */,/*28427*/5520/* D789 */,/*28428*/5520/*D78A */,/*28429*/5520/*D78B */, /*28430*/5520/*D78C */,/*28431*/5520/*D78D */,/*28432*/5520/*D78E */,/*28433*/5520/*D78F */,/*28434*/5520/*D790 */, /*28435*/5520/*D791 */,/*28436*/5520/*D792 */,/*28437*/5520/*D793 */,/*28438*/5520/*D794 */,/*28439*/5520/*D795 */, /*28440*/5520/*D796 */,/*28441*/5520/*D797 */,/*28442*/5520/*D798 */,/*28443*/5520/*D799 */,/*28444*/5520/*D79A */, /*28445*/5520/*D79B */,/*28446*/5520/*D79C */,/*28447*/5520/*D79D */,/*28448*/5520/*D79E */,/*28449*/5520/*D79F */, /*28450*/5520/*D7A0 */,/*28451*/5520/*D7A1 */,/*28452*/5520/*D7A2 */,/*28453*/5520/*D7A3 */,0,0,0,0,0,0,0,0,0,0,0,0, /*28466*/5521/* D7B0 */,/*28467*/5521/* D7B1 */,/*28468*/5521/* D7B2 */,/*28469*/5521/* D7B3 */,/*28470*/5521/* D7B4 */, /*28471*/5521/* D7B5 */,/*28472*/5521/* D7B6 */,/*28473*/5521/* D7B7 */,/*28474*/5521/* D7B8 */,/*28475*/5521/* D7B9 */, /*28476*/5521/* D7BA */,/*28477*/5521/* D7BB */,/*28478*/5521/* D7BC */,/*28479*/5521/* D7BD */,/*28480*/5521/* D7BE */, /*28481*/5521/* D7BF */,/*28482*/5521/* D7C0 */,/*28483*/5521/* D7C1 */,/*28484*/5521/* D7C2 */,/*28485*/5521/* D7C3 */, /*28486*/5521/* D7C4 */,/*28487*/5521/* D7C5 */,/*28488*/5521/* D7C6 */,0,0,0,0,/*28493*/5522/* D7CB */, /*28494*/5522/* D7CC */,/*28495*/5522/* D7CD */,/*28496*/5522/* D7CE */,/*28497*/5522/* D7CF */,/*28498*/5522/* D7D0 */, /*28499*/5522/* D7D1 */,/*28500*/5522/* D7D2 */,/*28501*/5522/* D7D3 */,/*28502*/5522/* D7D4 */,/*28503*/5522/* D7D5 */, /*28504*/5522/* D7D6 */,/*28505*/5522/* D7D7 */,/*28506*/5522/* D7D8 */,/*28507*/5522/* D7D9 */,/*28508*/5522/* D7DA */, /*28509*/5522/* D7DB */,/*28510*/5522/* D7DC */,/*28511*/5522/* D7DD */,/*28512*/5522/* D7DE */,/*28513*/5522/* D7DF */, /*28514*/5522/* D7E0 */,/*28515*/5522/* D7E1 */,/*28516*/5522/* D7E2 */,/*28517*/5522/* D7E3 */,/*28518*/5522/* D7E4 */, /*28519*/5522/* D7E5 */,/*28520*/5522/* D7E6 */,/*28521*/5522/* D7E7 */,/*28522*/5522/* D7E8 */,/*28523*/5522/* D7E9 */, /*28524*/5522/* D7EA */,/*28525*/5522/* D7EB */,/*28526*/5522/* D7EC */,/*28527*/5522/* D7ED */,/*28528*/5522/* D7EE */, /*28529*/5522/* D7EF */,/*28530*/5522/* D7F0 */,/*28531*/5522/* D7F1 */,/*28532*/5522/* D7F2 */,/*28533*/5522/* D7F3 */, /*28534*/5522/* D7F4 */,/*28535*/5522/* D7F5 */,/*28536*/5522/* D7F6 */,/*28537*/5522/* D7F7 */,/*28538*/5522/* D7F8 */, /*28539*/5522/* D7F9 */,/*28540*/5522/* D7FA */,/*28541*/5522/* D7FB */,0,0,0,0,/*28546*/5523/* D800 */, /*28547*/5524/* DB80 */,/*28548*/5525/* DC00 */,/*28549*/5526/* E000 */,/*28550*/5527/* F900 */,/*28551*/5528/* F901 */, /*28552*/5529/* F902 */,/*28553*/5530/* F903 */,/*28554*/5531/* F904 */,/*28555*/5532/* F905 */,/*28556*/5533/* F906 */, /*28557*/5534/* F907 */,/*28558*/5535/* F908 */,/*28559*/5536/* F909 */,/*28560*/5537/* F90A */,/*28561*/5538/* F90B */, /*28562*/5539/* F90C */,/*28563*/5540/* F90D */,/*28564*/5541/* F90E */,/*28565*/5542/* F90F */,/*28566*/5543/* F910 */, /*28567*/5544/* F911 */,/*28568*/5545/* F912 */,/*28569*/5546/* F913 */,/*28570*/5547/* F914 */,/*28571*/5548/* F915 */, /*28572*/5549/* F916 */,/*28573*/5550/* F917 */,/*28574*/5551/* F918 */,/*28575*/5552/* F919 */,/*28576*/5553/* F91A */, /*28577*/5554/* F91B */,/*28578*/5555/* F91C */,/*28579*/5556/* F91D */,/*28580*/5557/* F91E */,/*28581*/5558/* F91F */, /*28582*/5559/* F920 */,/*28583*/5560/* F921 */,/*28584*/5561/* F922 */,/*28585*/5562/* F923 */,/*28586*/5563/* F924 */, /*28587*/5564/* F925 */,/*28588*/5565/* F926 */,/*28589*/5566/* F927 */,/*28590*/5567/* F928 */,/*28591*/5568/* F929 */, /*28592*/5569/* F92A */,/*28593*/5570/* F92B */,/*28594*/5571/* F92C */,/*28595*/5572/* F92D */,/*28596*/5573/* F92E */, /*28597*/5574/* F92F */,/*28598*/5575/* F930 */,/*28599*/5576/* F931 */,/*28600*/5577/* F932 */,/*28601*/5578/* F933 */, /*28602*/5579/* F934 */,/*28603*/5580/* F935 */,/*28604*/5581/* F936 */,/*28605*/5582/* F937 */,/*28606*/5583/* F938 */, /*28607*/5584/* F939 */,/*28608*/5585/* F93A */,/*28609*/5586/* F93B */,/*28610*/5587/* F93C */,/*28611*/5588/* F93D */, /*28612*/5589/* F93E */,/*28613*/5590/* F93F */,/*28614*/5591/* F940 */,/*28615*/5592/* F941 */,/*28616*/5593/* F942 */, /*28617*/5594/* F943 */,/*28618*/5595/* F944 */,/*28619*/5596/* F945 */,/*28620*/5597/* F946 */,/*28621*/5598/* F947 */, /*28622*/5599/* F948 */,/*28623*/5600/* F949 */,/*28624*/5601/* F94A */,/*28625*/5602/* F94B */,/*28626*/5603/* F94C */, /*28627*/5604/* F94D */,/*28628*/5605/* F94E */,/*28629*/5606/* F94F */,/*28630*/5607/* F950 */,/*28631*/5608/* F951 */, /*28632*/5609/* F952 */,/*28633*/5610/* F953 */,/*28634*/5611/* F954 */,/*28635*/5612/* F955 */,/*28636*/5613/* F956 */, /*28637*/5614/* F957 */,/*28638*/5615/* F958 */,/*28639*/5616/* F959 */,/*28640*/5617/* F95A */,/*28641*/5618/* F95B */, /*28642*/5619/* F95C */,/*28643*/5620/* F95D */,/*28644*/5621/* F95E */,/*28645*/5622/* F95F */,/*28646*/5623/* F960 */, /*28647*/5624/* F961 */,/*28648*/5625/* F962 */,/*28649*/5626/* F963 */,/*28650*/5627/* F964 */,/*28651*/5628/* F965 */, /*28652*/5629/* F966 */,/*28653*/5630/* F967 */,/*28654*/5631/* F968 */,/*28655*/5632/* F969 */,/*28656*/5633/* F96A */, /*28657*/5634/* F96B */,/*28658*/5635/* F96C */,/*28659*/5636/* F96D */,/*28660*/5637/* F96E */,/*28661*/5638/* F96F */, /*28662*/5639/* F970 */,/*28663*/5640/* F971 */,/*28664*/5641/* F972 */,/*28665*/5642/* F973 */,/*28666*/5643/* F974 */, /*28667*/5644/* F975 */,/*28668*/5645/* F976 */,/*28669*/5646/* F977 */,/*28670*/5647/* F978 */,/*28671*/5648/* F979 */, /*28672*/5649/* F97A */,/*28673*/5650/* F97B */,/*28674*/5651/* F97C */,/*28675*/5652/* F97D */,/*28676*/5653/* F97E */, /*28677*/5654/* F97F */,/*28678*/5655/* F980 */,/*28679*/5656/* F981 */,/*28680*/5657/* F982 */,/*28681*/5658/* F983 */, /*28682*/5659/* F984 */,/*28683*/5660/* F985 */,/*28684*/5661/* F986 */,/*28685*/5662/* F987 */,/*28686*/5663/* F988 */, /*28687*/5664/* F989 */,/*28688*/5665/* F98A */,/*28689*/5666/* F98B */,/*28690*/5667/* F98C */,/*28691*/5668/* F98D */, /*28692*/5669/* F98E */,/*28693*/5670/* F98F */,/*28694*/5671/* F990 */,/*28695*/5672/* F991 */,/*28696*/5673/* F992 */, /*28697*/5674/* F993 */,/*28698*/5675/* F994 */,/*28699*/5676/* F995 */,/*28700*/5677/* F996 */,/*28701*/5678/* F997 */, /*28702*/5679/* F998 */,/*28703*/5680/* F999 */,/*28704*/5681/* F99A */,/*28705*/5682/* F99B */,/*28706*/5683/* F99C */, /*28707*/5684/* F99D */,/*28708*/5685/* F99E */,/*28709*/5686/* F99F */,/*28710*/5687/* F9A0 */,/*28711*/5688/* F9A1 */, /*28712*/5689/* F9A2 */,/*28713*/5690/* F9A3 */,/*28714*/5691/* F9A4 */,/*28715*/5692/* F9A5 */,/*28716*/5693/* F9A6 */, /*28717*/5694/* F9A7 */,/*28718*/5695/* F9A8 */,/*28719*/5696/* F9A9 */,/*28720*/5697/* F9AA */,/*28721*/5698/* F9AB */, /*28722*/5699/* F9AC */,/*28723*/5700/* F9AD */,/*28724*/5701/* F9AE */,/*28725*/5702/* F9AF */,/*28726*/5703/* F9B0 */, /*28727*/5704/* F9B1 */,/*28728*/5705/* F9B2 */,/*28729*/5706/* F9B3 */,/*28730*/5707/* F9B4 */,/*28731*/5708/* F9B5 */, /*28732*/5709/* F9B6 */,/*28733*/5710/* F9B7 */,/*28734*/5711/* F9B8 */,/*28735*/5712/* F9B9 */,/*28736*/5713/* F9BA */, /*28737*/5714/* F9BB */,/*28738*/5715/* F9BC */,/*28739*/5716/* F9BD */,/*28740*/5717/* F9BE */,/*28741*/5718/* F9BF */, /*28742*/5719/* F9C0 */,/*28743*/5720/* F9C1 */,/*28744*/5721/* F9C2 */,/*28745*/5722/* F9C3 */,/*28746*/5723/* F9C4 */, /*28747*/5724/* F9C5 */,/*28748*/5725/* F9C6 */,/*28749*/5726/* F9C7 */,/*28750*/5727/* F9C8 */,/*28751*/5728/* F9C9 */, /*28752*/5729/* F9CA */,/*28753*/5730/* F9CB */,/*28754*/5731/* F9CC */,/*28755*/5732/* F9CD */,/*28756*/5733/* F9CE */, /*28757*/5734/* F9CF */,/*28758*/5735/* F9D0 */,/*28759*/5736/* F9D1 */,/*28760*/5737/* F9D2 */,/*28761*/5738/* F9D3 */, /*28762*/5739/* F9D4 */,/*28763*/5740/* F9D5 */,/*28764*/5741/* F9D6 */,/*28765*/5742/* F9D7 */,/*28766*/5743/* F9D8 */, /*28767*/5744/* F9D9 */,/*28768*/5745/* F9DA */,/*28769*/5746/* F9DB */,/*28770*/5747/* F9DC */,/*28771*/5748/* F9DD */, /*28772*/5749/* F9DE */,/*28773*/5750/* F9DF */,/*28774*/5751/* F9E0 */,/*28775*/5752/* F9E1 */,/*28776*/5753/* F9E2 */, /*28777*/5754/* F9E3 */,/*28778*/5755/* F9E4 */,/*28779*/5756/* F9E5 */,/*28780*/5757/* F9E6 */,/*28781*/5758/* F9E7 */, /*28782*/5759/* F9E8 */,/*28783*/5760/* F9E9 */,/*28784*/5761/* F9EA */,/*28785*/5762/* F9EB */,/*28786*/5763/* F9EC */, /*28787*/5764/* F9ED */,/*28788*/5765/* F9EE */,/*28789*/5766/* F9EF */,/*28790*/5767/* F9F0 */,/*28791*/5768/* F9F1 */, /*28792*/5769/* F9F2 */,/*28793*/5770/* F9F3 */,/*28794*/5771/* F9F4 */,/*28795*/5772/* F9F5 */,/*28796*/5773/* F9F6 */, /*28797*/5774/* F9F7 */,/*28798*/5775/* F9F8 */,/*28799*/5776/* F9F9 */,/*28800*/5777/* F9FA */,/*28801*/5778/* F9FB */, /*28802*/5779/* F9FC */,/*28803*/5780/* F9FD */,/*28804*/5781/* F9FE */,/*28805*/5782/* F9FF */,/*28806*/5783/* FA00 */, /*28807*/5784/* FA01 */,/*28808*/5785/* FA02 */,/*28809*/5786/* FA03 */,/*28810*/5787/* FA04 */,/*28811*/5788/* FA05 */, /*28812*/5789/* FA06 */,/*28813*/5790/* FA07 */,/*28814*/5791/* FA08 */,/*28815*/5792/* FA09 */,/*28816*/5793/* FA0A */, /*28817*/5794/* FA0B */,/*28818*/5795/* FA0C */,/*28819*/5796/* FA0D */,/*28820*/5797/* FA0E */,/*28821*/5797/* FA0F */, /*28822*/5798/* FA10 */,/*28823*/5797/* FA11 */,/*28824*/5799/* FA12 */,/*28825*/5797/* FA13 */,/*28826*/5797/* FA14 */, /*28827*/5800/* FA15 */,/*28828*/5801/* FA16 */,/*28829*/5802/* FA17 */,/*28830*/5803/* FA18 */,/*28831*/5804/* FA19 */, /*28832*/5805/* FA1A */,/*28833*/5806/* FA1B */,/*28834*/5807/* FA1C */,/*28835*/5808/* FA1D */,/*28836*/5809/* FA1E */, /*28837*/5797/* FA1F */,/*28838*/5810/* FA20 */,/*28839*/5797/* FA21 */,/*28840*/5811/* FA22 */,/*28841*/5797/* FA23 */, /*28842*/5797/* FA24 */,/*28843*/5812/* FA25 */,/*28844*/5813/* FA26 */,/*28845*/5797/* FA27 */,/*28846*/5797/* FA28 */, /*28847*/5797/* FA29 */,/*28848*/5814/* FA2A */,/*28849*/5815/* FA2B */,/*28850*/5816/* FA2C */,/*28851*/5817/* FA2D */, /*28852*/5818/* FA2E */,/*28853*/5819/* FA2F */,/*28854*/5820/* FA30 */,/*28855*/5821/* FA31 */,/*28856*/5822/* FA32 */, /*28857*/5823/* FA33 */,/*28858*/5824/* FA34 */,/*28859*/5825/* FA35 */,/*28860*/5826/* FA36 */,/*28861*/5827/* FA37 */, /*28862*/5828/* FA38 */,/*28863*/5829/* FA39 */,/*28864*/5830/* FA3A */,/*28865*/5831/* FA3B */,/*28866*/5832/* FA3C */, /*28867*/5833/* FA3D */,/*28868*/5834/* FA3E */,/*28869*/5835/* FA3F */,/*28870*/5836/* FA40 */,/*28871*/5837/* FA41 */, /*28872*/5838/* FA42 */,/*28873*/5839/* FA43 */,/*28874*/5840/* FA44 */,/*28875*/5841/* FA45 */,/*28876*/5842/* FA46 */, /*28877*/5843/* FA47 */,/*28878*/5844/* FA48 */,/*28879*/5845/* FA49 */,/*28880*/5846/* FA4A */,/*28881*/5847/* FA4B */, /*28882*/5848/* FA4C */,/*28883*/5849/* FA4D */,/*28884*/5850/* FA4E */,/*28885*/5851/* FA4F */,/*28886*/5852/* FA50 */, /*28887*/5853/* FA51 */,/*28888*/5854/* FA52 */,/*28889*/5855/* FA53 */,/*28890*/5856/* FA54 */,/*28891*/5857/* FA55 */, /*28892*/5858/* FA56 */,/*28893*/5859/* FA57 */,/*28894*/5860/* FA58 */,/*28895*/5861/* FA59 */,/*28896*/5862/* FA5A */, /*28897*/5863/* FA5B */,/*28898*/5864/* FA5C */,/*28899*/5865/* FA5D */,/*28900*/5866/* FA5E */,/*28901*/5867/* FA5F */, /*28902*/5868/* FA60 */,/*28903*/5869/* FA61 */,/*28904*/5870/* FA62 */,/*28905*/5871/* FA63 */,/*28906*/5872/* FA64 */, /*28907*/5873/* FA65 */,/*28908*/5874/* FA66 */,/*28909*/5875/* FA67 */,/*28910*/5876/* FA68 */,/*28911*/5877/* FA69 */, /*28912*/5878/* FA6A */,/*28913*/5879/* FA6B */,/*28914*/5880/* FA6C */,/*28915*/5881/* FA6D */,0,0, /*28918*/5882/* FA70 */,/*28919*/5883/* FA71 */,/*28920*/5884/* FA72 */,/*28921*/5885/* FA73 */,/*28922*/5886/* FA74 */, /*28923*/5887/* FA75 */,/*28924*/5888/* FA76 */,/*28925*/5889/* FA77 */,/*28926*/5890/* FA78 */,/*28927*/5891/* FA79 */, /*28928*/5892/* FA7A */,/*28929*/5893/* FA7B */,/*28930*/5894/* FA7C */,/*28931*/5895/* FA7D */,/*28932*/5896/* FA7E */, /*28933*/5897/* FA7F */,/*28934*/5898/* FA80 */,/*28935*/5899/* FA81 */,/*28936*/5900/* FA82 */,/*28937*/5901/* FA83 */, /*28938*/5902/* FA84 */,/*28939*/5903/* FA85 */,/*28940*/5904/* FA86 */,/*28941*/5905/* FA87 */,/*28942*/5906/* FA88 */, /*28943*/5907/* FA89 */,/*28944*/5908/* FA8A */,/*28945*/5909/* FA8B */,/*28946*/5910/* FA8C */,/*28947*/5911/* FA8D */, /*28948*/5912/* FA8E */,/*28949*/5913/* FA8F */,/*28950*/5914/* FA90 */,/*28951*/5915/* FA91 */,/*28952*/5916/* FA92 */, /*28953*/5917/* FA93 */,/*28954*/5918/* FA94 */,/*28955*/5919/* FA95 */,/*28956*/5920/* FA96 */,/*28957*/5921/* FA97 */, /*28958*/5922/* FA98 */,/*28959*/5923/* FA99 */,/*28960*/5924/* FA9A */,/*28961*/5925/* FA9B */,/*28962*/5926/* FA9C */, /*28963*/5927/* FA9D */,/*28964*/5928/* FA9E */,/*28965*/5929/* FA9F */,/*28966*/5930/* FAA0 */,/*28967*/5931/* FAA1 */, /*28968*/5932/* FAA2 */,/*28969*/5933/* FAA3 */,/*28970*/5934/* FAA4 */,/*28971*/5935/* FAA5 */,/*28972*/5936/* FAA6 */, /*28973*/5937/* FAA7 */,/*28974*/5938/* FAA8 */,/*28975*/5939/* FAA9 */,/*28976*/5940/* FAAA */,/*28977*/5941/* FAAB */, /*28978*/5942/* FAAC */,/*28979*/5943/* FAAD */,/*28980*/5944/* FAAE */,/*28981*/5945/* FAAF */,/*28982*/5946/* FAB0 */, /*28983*/5947/* FAB1 */,/*28984*/5948/* FAB2 */,/*28985*/5949/* FAB3 */,/*28986*/5950/* FAB4 */,/*28987*/5951/* FAB5 */, /*28988*/5952/* FAB6 */,/*28989*/5953/* FAB7 */,/*28990*/5954/* FAB8 */,/*28991*/5955/* FAB9 */,/*28992*/5956/* FABA */, /*28993*/5957/* FABB */,/*28994*/5958/* FABC */,/*28995*/5959/* FABD */,/*28996*/5960/* FABE */,/*28997*/5961/* FABF */, /*28998*/5962/* FAC0 */,/*28999*/5963/* FAC1 */,/*29000*/5964/* FAC2 */,/*29001*/5965/* FAC3 */,/*29002*/5966/* FAC4 */, /*29003*/5967/* FAC5 */,/*29004*/5968/* FAC6 */,/*29005*/5969/* FAC7 */,/*29006*/5970/* FAC8 */,/*29007*/5971/* FAC9 */, /*29008*/5972/* FACA */,/*29009*/5973/* FACB */,/*29010*/5974/* FACC */,/*29011*/5975/* FACD */,/*29012*/5976/* FACE */, /*29013*/5977/* FACF */,/*29014*/5978/* FAD0 */,/*29015*/5979/* FAD1 */,/*29016*/5980/* FAD2 */,/*29017*/5981/* FAD3 */, /*29018*/5982/* FAD4 */,/*29019*/5983/* FAD5 */,/*29020*/5984/* FAD6 */,/*29021*/5985/* FAD7 */,/*29022*/5986/* FAD8 */, /*29023*/5987/* FAD9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*29062*/5988/* FB00 */,/*29063*/5989/* FB01 */,/*29064*/5990/* FB02 */,/*29065*/5991/* FB03 */,/*29066*/5992/* FB04 */, /*29067*/5993/* FB05 */,/*29068*/5994/* FB06 */,0,0,0,0,0,0,0,0,0,0,0,0,/*29081*/5995/* FB13 */,/*29082*/5996/* FB14 */, /*29083*/5997/* FB15 */,/*29084*/5998/* FB16 */,/*29085*/5999/* FB17 */,0,0,0,0,0,/*29091*/6000/* FB1D */, /*29092*/6001/* FB1E */,/*29093*/6002/* FB1F */,/*29094*/6003/* FB20 */,/*29095*/6004/* FB21 */,/*29096*/6005/* FB22 */, /*29097*/6006/* FB23 */,/*29098*/6007/* FB24 */,/*29099*/6008/* FB25 */,/*29100*/6009/* FB26 */,/*29101*/6010/* FB27 */, /*29102*/6011/* FB28 */,/*29103*/6012/* FB29 */,/*29104*/6013/* FB2A */,/*29105*/6014/* FB2B */,/*29106*/6015/* FB2C */, /*29107*/6016/* FB2D */,/*29108*/6017/* FB2E */,/*29109*/6018/* FB2F */,/*29110*/6019/* FB30 */,/*29111*/6020/* FB31 */, /*29112*/6021/* FB32 */,/*29113*/6022/* FB33 */,/*29114*/6023/* FB34 */,/*29115*/6024/* FB35 */,/*29116*/6025/* FB36 */, 0,/*29118*/6026/* FB38 */,/*29119*/6027/* FB39 */,/*29120*/6028/* FB3A */,/*29121*/6029/* FB3B */, /*29122*/6030/* FB3C */,0,/*29124*/6031/* FB3E */,0,/*29126*/6032/* FB40 */,/*29127*/6033/* FB41 */,0, /*29129*/6034/* FB43 */,/*29130*/6035/* FB44 */,0,/*29132*/6036/* FB46 */,/*29133*/6037/* FB47 */, /*29134*/6038/* FB48 */,/*29135*/6039/* FB49 */,/*29136*/6040/* FB4A */,/*29137*/6041/* FB4B */,/*29138*/6042/* FB4C */, /*29139*/6043/* FB4D */,/*29140*/6044/* FB4E */,/*29141*/6045/* FB4F */,/*29142*/6046/* FB50 */,/*29143*/6047/* FB51 */, /*29144*/6048/* FB52 */,/*29145*/6049/* FB53 */,/*29146*/6050/* FB54 */,/*29147*/6051/* FB55 */,/*29148*/6052/* FB56 */, /*29149*/6053/* FB57 */,/*29150*/6054/* FB58 */,/*29151*/6055/* FB59 */,/*29152*/6056/* FB5A */,/*29153*/6057/* FB5B */, /*29154*/6058/* FB5C */,/*29155*/6059/* FB5D */,/*29156*/6060/* FB5E */,/*29157*/6061/* FB5F */,/*29158*/6062/* FB60 */, /*29159*/6063/* FB61 */,/*29160*/6064/* FB62 */,/*29161*/6065/* FB63 */,/*29162*/6066/* FB64 */,/*29163*/6067/* FB65 */, /*29164*/6068/* FB66 */,/*29165*/6069/* FB67 */,/*29166*/6070/* FB68 */,/*29167*/6071/* FB69 */,/*29168*/6072/* FB6A */, /*29169*/6073/* FB6B */,/*29170*/6074/* FB6C */,/*29171*/6075/* FB6D */,/*29172*/6076/* FB6E */,/*29173*/6077/* FB6F */, /*29174*/6078/* FB70 */,/*29175*/6079/* FB71 */,/*29176*/6080/* FB72 */,/*29177*/6081/* FB73 */,/*29178*/6082/* FB74 */, /*29179*/6083/* FB75 */,/*29180*/6084/* FB76 */,/*29181*/6085/* FB77 */,/*29182*/6086/* FB78 */,/*29183*/6087/* FB79 */, /*29184*/6088/* FB7A */,/*29185*/6089/* FB7B */,/*29186*/6090/* FB7C */,/*29187*/6091/* FB7D */,/*29188*/6092/* FB7E */, /*29189*/6093/* FB7F */,/*29190*/6094/* FB80 */,/*29191*/6095/* FB81 */,/*29192*/6096/* FB82 */,/*29193*/6097/* FB83 */, /*29194*/6098/* FB84 */,/*29195*/6099/* FB85 */,/*29196*/6100/* FB86 */,/*29197*/6101/* FB87 */,/*29198*/6102/* FB88 */, /*29199*/6103/* FB89 */,/*29200*/6104/* FB8A */,/*29201*/6105/* FB8B */,/*29202*/6106/* FB8C */,/*29203*/6107/* FB8D */, /*29204*/6108/* FB8E */,/*29205*/6109/* FB8F */,/*29206*/6110/* FB90 */,/*29207*/6111/* FB91 */,/*29208*/6112/* FB92 */, /*29209*/6113/* FB93 */,/*29210*/6114/* FB94 */,/*29211*/6115/* FB95 */,/*29212*/6116/* FB96 */,/*29213*/6117/* FB97 */, /*29214*/6118/* FB98 */,/*29215*/6119/* FB99 */,/*29216*/6120/* FB9A */,/*29217*/6121/* FB9B */,/*29218*/6122/* FB9C */, /*29219*/6123/* FB9D */,/*29220*/6124/* FB9E */,/*29221*/6125/* FB9F */,/*29222*/6126/* FBA0 */,/*29223*/6127/* FBA1 */, /*29224*/6128/* FBA2 */,/*29225*/6129/* FBA3 */,/*29226*/6130/* FBA4 */,/*29227*/6131/* FBA5 */,/*29228*/6132/* FBA6 */, /*29229*/6133/* FBA7 */,/*29230*/6134/* FBA8 */,/*29231*/6135/* FBA9 */,/*29232*/6136/* FBAA */,/*29233*/6137/* FBAB */, /*29234*/6138/* FBAC */,/*29235*/6139/* FBAD */,/*29236*/6140/* FBAE */,/*29237*/6141/* FBAF */,/*29238*/6142/* FBB0 */, /*29239*/6143/* FBB1 */,/*29240*/6144/* FBB2 */,/*29241*/6144/* FBB3 */,/*29242*/6144/* FBB4 */,/*29243*/6144/* FBB5 */, /*29244*/6144/* FBB6 */,/*29245*/6144/* FBB7 */,/*29246*/6144/* FBB8 */,/*29247*/6144/* FBB9 */,/*29248*/6144/* FBBA */, /*29249*/6144/* FBBB */,/*29250*/6144/* FBBC */,/*29251*/6144/* FBBD */,/*29252*/6144/* FBBE */,/*29253*/6144/* FBBF */, /*29254*/6144/* FBC0 */,/*29255*/6144/* FBC1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*29273*/6145/* FBD3 */, /*29274*/6146/* FBD4 */,/*29275*/6147/* FBD5 */,/*29276*/6148/* FBD6 */,/*29277*/6149/* FBD7 */,/*29278*/6150/* FBD8 */, /*29279*/6151/* FBD9 */,/*29280*/6152/* FBDA */,/*29281*/6153/* FBDB */,/*29282*/6154/* FBDC */,/*29283*/6155/* FBDD */, /*29284*/6156/* FBDE */,/*29285*/6157/* FBDF */,/*29286*/6158/* FBE0 */,/*29287*/6159/* FBE1 */,/*29288*/6160/* FBE2 */, /*29289*/6161/* FBE3 */,/*29290*/6162/* FBE4 */,/*29291*/6163/* FBE5 */,/*29292*/6164/* FBE6 */,/*29293*/6165/* FBE7 */, /*29294*/6166/* FBE8 */,/*29295*/6167/* FBE9 */,/*29296*/6168/* FBEA */,/*29297*/6169/* FBEB */,/*29298*/6170/* FBEC */, /*29299*/6171/* FBED */,/*29300*/6172/* FBEE */,/*29301*/6173/* FBEF */,/*29302*/6174/* FBF0 */,/*29303*/6175/* FBF1 */, /*29304*/6176/* FBF2 */,/*29305*/6177/* FBF3 */,/*29306*/6178/* FBF4 */,/*29307*/6179/* FBF5 */,/*29308*/6180/* FBF6 */, /*29309*/6181/* FBF7 */,/*29310*/6182/* FBF8 */,/*29311*/6183/* FBF9 */,/*29312*/6184/* FBFA */,/*29313*/6185/* FBFB */, /*29314*/6186/* FBFC */,/*29315*/6187/* FBFD */,/*29316*/6188/* FBFE */,/*29317*/6189/* FBFF */,/*29318*/6190/* FC00 */, /*29319*/6191/* FC01 */,/*29320*/6192/* FC02 */,/*29321*/6193/* FC03 */,/*29322*/6194/* FC04 */,/*29323*/6195/* FC05 */, /*29324*/6196/* FC06 */,/*29325*/6197/* FC07 */,/*29326*/6198/* FC08 */,/*29327*/6199/* FC09 */,/*29328*/6200/* FC0A */, /*29329*/6201/* FC0B */,/*29330*/6202/* FC0C */,/*29331*/6203/* FC0D */,/*29332*/6204/* FC0E */,/*29333*/6205/* FC0F */, /*29334*/6206/* FC10 */,/*29335*/6207/* FC11 */,/*29336*/6208/* FC12 */,/*29337*/6209/* FC13 */,/*29338*/6210/* FC14 */, /*29339*/6211/* FC15 */,/*29340*/6212/* FC16 */,/*29341*/6213/* FC17 */,/*29342*/6214/* FC18 */,/*29343*/6215/* FC19 */, /*29344*/6216/* FC1A */,/*29345*/6217/* FC1B */,/*29346*/6218/* FC1C */,/*29347*/6219/* FC1D */,/*29348*/6220/* FC1E */, /*29349*/6221/* FC1F */,/*29350*/6222/* FC20 */,/*29351*/6223/* FC21 */,/*29352*/6224/* FC22 */,/*29353*/6225/* FC23 */, /*29354*/6226/* FC24 */,/*29355*/6227/* FC25 */,/*29356*/6228/* FC26 */,/*29357*/6229/* FC27 */,/*29358*/6230/* FC28 */, /*29359*/6231/* FC29 */,/*29360*/6232/* FC2A */,/*29361*/6233/* FC2B */,/*29362*/6234/* FC2C */,/*29363*/6235/* FC2D */, /*29364*/6236/* FC2E */,/*29365*/6237/* FC2F */,/*29366*/6238/* FC30 */,/*29367*/6239/* FC31 */,/*29368*/6240/* FC32 */, /*29369*/6241/* FC33 */,/*29370*/6242/* FC34 */,/*29371*/6243/* FC35 */,/*29372*/6244/* FC36 */,/*29373*/6245/* FC37 */, /*29374*/6246/* FC38 */,/*29375*/6247/* FC39 */,/*29376*/6248/* FC3A */,/*29377*/6249/* FC3B */,/*29378*/6250/* FC3C */, /*29379*/6251/* FC3D */,/*29380*/6252/* FC3E */,/*29381*/6253/* FC3F */,/*29382*/6254/* FC40 */,/*29383*/6255/* FC41 */, /*29384*/6256/* FC42 */,/*29385*/6257/* FC43 */,/*29386*/6258/* FC44 */,/*29387*/6259/* FC45 */,/*29388*/6260/* FC46 */, /*29389*/6261/* FC47 */,/*29390*/6262/* FC48 */,/*29391*/6263/* FC49 */,/*29392*/6264/* FC4A */,/*29393*/6265/* FC4B */, /*29394*/6266/* FC4C */,/*29395*/6267/* FC4D */,/*29396*/6268/* FC4E */,/*29397*/6269/* FC4F */,/*29398*/6270/* FC50 */, /*29399*/6271/* FC51 */,/*29400*/6272/* FC52 */,/*29401*/6273/* FC53 */,/*29402*/6274/* FC54 */,/*29403*/6275/* FC55 */, /*29404*/6276/* FC56 */,/*29405*/6277/* FC57 */,/*29406*/6278/* FC58 */,/*29407*/6279/* FC59 */,/*29408*/6280/* FC5A */, /*29409*/6281/* FC5B */,/*29410*/6282/* FC5C */,/*29411*/6283/* FC5D */,/*29412*/6284/* FC5E */,/*29413*/6285/* FC5F */, /*29414*/6286/* FC60 */,/*29415*/6287/* FC61 */,/*29416*/6288/* FC62 */,/*29417*/6289/* FC63 */,/*29418*/6290/* FC64 */, /*29419*/6291/* FC65 */,/*29420*/6292/* FC66 */,/*29421*/6293/* FC67 */,/*29422*/6294/* FC68 */,/*29423*/6295/* FC69 */, /*29424*/6296/* FC6A */,/*29425*/6297/* FC6B */,/*29426*/6298/* FC6C */,/*29427*/6299/* FC6D */,/*29428*/6300/* FC6E */, /*29429*/6301/* FC6F */,/*29430*/6302/* FC70 */,/*29431*/6303/* FC71 */,/*29432*/6304/* FC72 */,/*29433*/6305/* FC73 */, /*29434*/6306/* FC74 */,/*29435*/6307/* FC75 */,/*29436*/6308/* FC76 */,/*29437*/6309/* FC77 */,/*29438*/6310/* FC78 */, /*29439*/6311/* FC79 */,/*29440*/6312/* FC7A */,/*29441*/6313/* FC7B */,/*29442*/6314/* FC7C */,/*29443*/6315/* FC7D */, /*29444*/6316/* FC7E */,/*29445*/6317/* FC7F */,/*29446*/6318/* FC80 */,/*29447*/6319/* FC81 */,/*29448*/6320/* FC82 */, /*29449*/6321/* FC83 */,/*29450*/6322/* FC84 */,/*29451*/6323/* FC85 */,/*29452*/6324/* FC86 */,/*29453*/6325/* FC87 */, /*29454*/6326/* FC88 */,/*29455*/6327/* FC89 */,/*29456*/6328/* FC8A */,/*29457*/6329/* FC8B */,/*29458*/6330/* FC8C */, /*29459*/6331/* FC8D */,/*29460*/6332/* FC8E */,/*29461*/6333/* FC8F */,/*29462*/6334/* FC90 */,/*29463*/6335/* FC91 */, /*29464*/6336/* FC92 */,/*29465*/6337/* FC93 */,/*29466*/6338/* FC94 */,/*29467*/6339/* FC95 */,/*29468*/6340/* FC96 */, /*29469*/6341/* FC97 */,/*29470*/6342/* FC98 */,/*29471*/6343/* FC99 */,/*29472*/6344/* FC9A */,/*29473*/6345/* FC9B */, /*29474*/6346/* FC9C */,/*29475*/6347/* FC9D */,/*29476*/6348/* FC9E */,/*29477*/6349/* FC9F */,/*29478*/6350/* FCA0 */, /*29479*/6351/* FCA1 */,/*29480*/6352/* FCA2 */,/*29481*/6353/* FCA3 */,/*29482*/6354/* FCA4 */,/*29483*/6355/* FCA5 */, /*29484*/6356/* FCA6 */,/*29485*/6357/* FCA7 */,/*29486*/6358/* FCA8 */,/*29487*/6359/* FCA9 */,/*29488*/6360/* FCAA */, /*29489*/6361/* FCAB */,/*29490*/6362/* FCAC */,/*29491*/6363/* FCAD */,/*29492*/6364/* FCAE */,/*29493*/6365/* FCAF */, /*29494*/6366/* FCB0 */,/*29495*/6367/* FCB1 */,/*29496*/6368/* FCB2 */,/*29497*/6369/* FCB3 */,/*29498*/6370/* FCB4 */, /*29499*/6371/* FCB5 */,/*29500*/6372/* FCB6 */,/*29501*/6373/* FCB7 */,/*29502*/6374/* FCB8 */,/*29503*/6375/* FCB9 */, /*29504*/6376/* FCBA */,/*29505*/6377/* FCBB */,/*29506*/6378/* FCBC */,/*29507*/6379/* FCBD */,/*29508*/6380/* FCBE */, /*29509*/6381/* FCBF */,/*29510*/6382/* FCC0 */,/*29511*/6383/* FCC1 */,/*29512*/6384/* FCC2 */,/*29513*/6385/* FCC3 */, /*29514*/6386/* FCC4 */,/*29515*/6387/* FCC5 */,/*29516*/6388/* FCC6 */,/*29517*/6389/* FCC7 */,/*29518*/6390/* FCC8 */, /*29519*/6391/* FCC9 */,/*29520*/6392/* FCCA */,/*29521*/6393/* FCCB */,/*29522*/6394/* FCCC */,/*29523*/6395/* FCCD */, /*29524*/6396/* FCCE */,/*29525*/6397/* FCCF */,/*29526*/6398/* FCD0 */,/*29527*/6399/* FCD1 */,/*29528*/6400/* FCD2 */, /*29529*/6401/* FCD3 */,/*29530*/6402/* FCD4 */,/*29531*/6403/* FCD5 */,/*29532*/6404/* FCD6 */,/*29533*/6405/* FCD7 */, /*29534*/6406/* FCD8 */,/*29535*/6407/* FCD9 */,/*29536*/6408/* FCDA */,/*29537*/6409/* FCDB */,/*29538*/6410/* FCDC */, /*29539*/6411/* FCDD */,/*29540*/6412/* FCDE */,/*29541*/6413/* FCDF */,/*29542*/6414/* FCE0 */,/*29543*/6415/* FCE1 */, /*29544*/6416/* FCE2 */,/*29545*/6417/* FCE3 */,/*29546*/6418/* FCE4 */,/*29547*/6419/* FCE5 */,/*29548*/6420/* FCE6 */, /*29549*/6421/* FCE7 */,/*29550*/6422/* FCE8 */,/*29551*/6423/* FCE9 */,/*29552*/6424/* FCEA */,/*29553*/6425/* FCEB */, /*29554*/6426/* FCEC */,/*29555*/6427/* FCED */,/*29556*/6428/* FCEE */,/*29557*/6429/* FCEF */,/*29558*/6430/* FCF0 */, /*29559*/6431/* FCF1 */,/*29560*/6432/* FCF2 */,/*29561*/6433/* FCF3 */,/*29562*/6434/* FCF4 */,/*29563*/6435/* FCF5 */, /*29564*/6436/* FCF6 */,/*29565*/6437/* FCF7 */,/*29566*/6438/* FCF8 */,/*29567*/6439/* FCF9 */,/*29568*/6440/* FCFA */, /*29569*/6441/* FCFB */,/*29570*/6442/* FCFC */,/*29571*/6443/* FCFD */,/*29572*/6444/* FCFE */,/*29573*/6445/* FCFF */, /*29574*/6446/* FD00 */,/*29575*/6447/* FD01 */,/*29576*/6448/* FD02 */,/*29577*/6449/* FD03 */,/*29578*/6450/* FD04 */, /*29579*/6451/* FD05 */,/*29580*/6452/* FD06 */,/*29581*/6453/* FD07 */,/*29582*/6454/* FD08 */,/*29583*/6455/* FD09 */, /*29584*/6456/* FD0A */,/*29585*/6457/* FD0B */,/*29586*/6458/* FD0C */,/*29587*/6459/* FD0D */,/*29588*/6460/* FD0E */, /*29589*/6461/* FD0F */,/*29590*/6462/* FD10 */,/*29591*/6463/* FD11 */,/*29592*/6464/* FD12 */,/*29593*/6465/* FD13 */, /*29594*/6466/* FD14 */,/*29595*/6467/* FD15 */,/*29596*/6468/* FD16 */,/*29597*/6469/* FD17 */,/*29598*/6470/* FD18 */, /*29599*/6471/* FD19 */,/*29600*/6472/* FD1A */,/*29601*/6473/* FD1B */,/*29602*/6474/* FD1C */,/*29603*/6475/* FD1D */, /*29604*/6476/* FD1E */,/*29605*/6477/* FD1F */,/*29606*/6478/* FD20 */,/*29607*/6479/* FD21 */,/*29608*/6480/* FD22 */, /*29609*/6481/* FD23 */,/*29610*/6482/* FD24 */,/*29611*/6483/* FD25 */,/*29612*/6484/* FD26 */,/*29613*/6485/* FD27 */, /*29614*/6486/* FD28 */,/*29615*/6487/* FD29 */,/*29616*/6488/* FD2A */,/*29617*/6489/* FD2B */,/*29618*/6490/* FD2C */, /*29619*/6491/* FD2D */,/*29620*/6492/* FD2E */,/*29621*/6493/* FD2F */,/*29622*/6494/* FD30 */,/*29623*/6495/* FD31 */, /*29624*/6496/* FD32 */,/*29625*/6497/* FD33 */,/*29626*/6498/* FD34 */,/*29627*/6499/* FD35 */,/*29628*/6500/* FD36 */, /*29629*/6501/* FD37 */,/*29630*/6502/* FD38 */,/*29631*/6503/* FD39 */,/*29632*/6504/* FD3A */,/*29633*/6505/* FD3B */, /*29634*/6506/* FD3C */,/*29635*/6507/* FD3D */,/*29636*/6508/* FD3E */,/*29637*/6509/* FD3F */,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,/*29654*/6510/* FD50 */,/*29655*/6511/* FD51 */,/*29656*/6512/* FD52 */,/*29657*/6513/* FD53 */, /*29658*/6514/* FD54 */,/*29659*/6515/* FD55 */,/*29660*/6516/* FD56 */,/*29661*/6517/* FD57 */,/*29662*/6518/* FD58 */, /*29663*/6519/* FD59 */,/*29664*/6520/* FD5A */,/*29665*/6521/* FD5B */,/*29666*/6522/* FD5C */,/*29667*/6523/* FD5D */, /*29668*/6524/* FD5E */,/*29669*/6525/* FD5F */,/*29670*/6526/* FD60 */,/*29671*/6527/* FD61 */,/*29672*/6528/* FD62 */, /*29673*/6529/* FD63 */,/*29674*/6530/* FD64 */,/*29675*/6531/* FD65 */,/*29676*/6532/* FD66 */,/*29677*/6533/* FD67 */, /*29678*/6534/* FD68 */,/*29679*/6535/* FD69 */,/*29680*/6536/* FD6A */,/*29681*/6537/* FD6B */,/*29682*/6538/* FD6C */, /*29683*/6539/* FD6D */,/*29684*/6540/* FD6E */,/*29685*/6541/* FD6F */,/*29686*/6542/* FD70 */,/*29687*/6543/* FD71 */, /*29688*/6544/* FD72 */,/*29689*/6545/* FD73 */,/*29690*/6546/* FD74 */,/*29691*/6547/* FD75 */,/*29692*/6548/* FD76 */, /*29693*/6549/* FD77 */,/*29694*/6550/* FD78 */,/*29695*/6551/* FD79 */,/*29696*/6552/* FD7A */,/*29697*/6553/* FD7B */, /*29698*/6554/* FD7C */,/*29699*/6555/* FD7D */,/*29700*/6556/* FD7E */,/*29701*/6557/* FD7F */,/*29702*/6558/* FD80 */, /*29703*/6559/* FD81 */,/*29704*/6560/* FD82 */,/*29705*/6561/* FD83 */,/*29706*/6562/* FD84 */,/*29707*/6563/* FD85 */, /*29708*/6564/* FD86 */,/*29709*/6565/* FD87 */,/*29710*/6566/* FD88 */,/*29711*/6567/* FD89 */,/*29712*/6568/* FD8A */, /*29713*/6569/* FD8B */,/*29714*/6570/* FD8C */,/*29715*/6571/* FD8D */,/*29716*/6572/* FD8E */,/*29717*/6573/* FD8F */, 0,0,/*29720*/6574/* FD92 */,/*29721*/6575/* FD93 */,/*29722*/6576/* FD94 */,/*29723*/6577/* FD95 */, /*29724*/6578/* FD96 */,/*29725*/6579/* FD97 */,/*29726*/6580/* FD98 */,/*29727*/6581/* FD99 */,/*29728*/6582/* FD9A */, /*29729*/6583/* FD9B */,/*29730*/6584/* FD9C */,/*29731*/6585/* FD9D */,/*29732*/6586/* FD9E */,/*29733*/6587/* FD9F */, /*29734*/6588/* FDA0 */,/*29735*/6589/* FDA1 */,/*29736*/6590/* FDA2 */,/*29737*/6591/* FDA3 */,/*29738*/6592/* FDA4 */, /*29739*/6593/* FDA5 */,/*29740*/6594/* FDA6 */,/*29741*/6595/* FDA7 */,/*29742*/6596/* FDA8 */,/*29743*/6597/* FDA9 */, /*29744*/6598/* FDAA */,/*29745*/6599/* FDAB */,/*29746*/6600/* FDAC */,/*29747*/6601/* FDAD */,/*29748*/6602/* FDAE */, /*29749*/6603/* FDAF */,/*29750*/6604/* FDB0 */,/*29751*/6605/* FDB1 */,/*29752*/6606/* FDB2 */,/*29753*/6607/* FDB3 */, /*29754*/6608/* FDB4 */,/*29755*/6609/* FDB5 */,/*29756*/6610/* FDB6 */,/*29757*/6611/* FDB7 */,/*29758*/6612/* FDB8 */, /*29759*/6613/* FDB9 */,/*29760*/6614/* FDBA */,/*29761*/6615/* FDBB */,/*29762*/6616/* FDBC */,/*29763*/6617/* FDBD */, /*29764*/6618/* FDBE */,/*29765*/6619/* FDBF */,/*29766*/6620/* FDC0 */,/*29767*/6621/* FDC1 */,/*29768*/6622/* FDC2 */, /*29769*/6623/* FDC3 */,/*29770*/6624/* FDC4 */,/*29771*/6625/* FDC5 */,/*29772*/6626/* FDC6 */,/*29773*/6627/* FDC7 */, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*29814*/6628/* FDF0 */, /*29815*/6629/* FDF1 */,/*29816*/6630/* FDF2 */,/*29817*/6631/* FDF3 */,/*29818*/6632/* FDF4 */,/*29819*/6633/* FDF5 */, /*29820*/6634/* FDF6 */,/*29821*/6635/* FDF7 */,/*29822*/6636/* FDF8 */,/*29823*/6637/* FDF9 */,/*29824*/6638/* FDFA */, /*29825*/6639/* FDFB */,/*29826*/6640/* FDFC */,/*29827*/6641/* FDFD */,0,0,/*29830*/6642/* FE00 */, /*29831*/6642/* FE01 */,/*29832*/6642/* FE02 */,/*29833*/6642/* FE03 */,/*29834*/6642/* FE04 */,/*29835*/6642/* FE05 */, /*29836*/6642/* FE06 */,/*29837*/6642/* FE07 */,/*29838*/6642/* FE08 */,/*29839*/6642/* FE09 */,/*29840*/6642/* FE0A */, /*29841*/6642/* FE0B */,/*29842*/6642/* FE0C */,/*29843*/6642/* FE0D */,/*29844*/6642/* FE0E */,/*29845*/6642/* FE0F */, /*29846*/6643/* FE10 */,/*29847*/6644/* FE11 */,/*29848*/6645/* FE12 */,/*29849*/6646/* FE13 */,/*29850*/6647/* FE14 */, /*29851*/6648/* FE15 */,/*29852*/6649/* FE16 */,/*29853*/6650/* FE17 */,/*29854*/6651/* FE18 */,/*29855*/6652/* FE19 */, 0,0,0,0,0,0,/*29862*/6653/* FE20 */,/*29863*/6653/* FE21 */,/*29864*/6653/* FE22 */,/*29865*/6653/* FE23 */, /*29866*/6654/* FE24 */,/*29867*/6654/* FE25 */,/*29868*/6654/* FE26 */,/*29869*/6655/* FE27 */,/*29870*/6655/* FE28 */, /*29871*/6655/* FE29 */,/*29872*/6655/* FE2A */,/*29873*/6655/* FE2B */,/*29874*/6655/* FE2C */,/*29875*/6655/* FE2D */, /*29876*/6656/* FE2E */,/*29877*/6656/* FE2F */,/*29878*/6657/* FE30 */,/*29879*/6658/* FE31 */,/*29880*/6659/* FE32 */, /*29881*/6660/* FE33 */,/*29882*/6661/* FE34 */,/*29883*/6662/* FE35 */,/*29884*/6663/* FE36 */,/*29885*/6664/* FE37 */, /*29886*/6665/* FE38 */,/*29887*/6666/* FE39 */,/*29888*/6667/* FE3A */,/*29889*/6668/* FE3B */,/*29890*/6669/* FE3C */, /*29891*/6670/* FE3D */,/*29892*/6671/* FE3E */,/*29893*/6672/* FE3F */,/*29894*/6673/* FE40 */,/*29895*/6674/* FE41 */, /*29896*/6675/* FE42 */,/*29897*/6676/* FE43 */,/*29898*/6677/* FE44 */,/*29899*/6678/* FE45 */,/*29900*/6678/* FE46 */, /*29901*/6679/* FE47 */,/*29902*/6680/* FE48 */,/*29903*/6681/* FE49 */,/*29904*/6682/* FE4A */,/*29905*/6683/* FE4B */, /*29906*/6684/* FE4C */,/*29907*/6685/* FE4D */,/*29908*/6686/* FE4E */,/*29909*/6687/* FE4F */,/*29910*/6688/* FE50 */, /*29911*/6689/* FE51 */,/*29912*/6690/* FE52 */,0,/*29914*/6691/* FE54 */,/*29915*/6692/* FE55 */, /*29916*/6693/* FE56 */,/*29917*/6694/* FE57 */,/*29918*/6695/* FE58 */,/*29919*/6696/* FE59 */,/*29920*/6697/* FE5A */, /*29921*/6698/* FE5B */,/*29922*/6699/* FE5C */,/*29923*/6700/* FE5D */,/*29924*/6701/* FE5E */,/*29925*/6702/* FE5F */, /*29926*/6703/* FE60 */,/*29927*/6704/* FE61 */,/*29928*/6705/* FE62 */,/*29929*/6706/* FE63 */,/*29930*/6707/* FE64 */, /*29931*/6708/* FE65 */,/*29932*/6709/* FE66 */,0,/*29934*/6710/* FE68 */,/*29935*/6711/* FE69 */, /*29936*/6712/* FE6A */,/*29937*/6713/* FE6B */,0,0,0,0,/*29942*/6714/* FE70 */,/*29943*/6715/* FE71 */, /*29944*/6716/* FE72 */,/*29945*/6717/* FE73 */,/*29946*/6718/* FE74 */,0,/*29948*/6719/* FE76 */, /*29949*/6720/* FE77 */,/*29950*/6721/* FE78 */,/*29951*/6722/* FE79 */,/*29952*/6723/* FE7A */,/*29953*/6724/* FE7B */, /*29954*/6725/* FE7C */,/*29955*/6726/* FE7D */,/*29956*/6727/* FE7E */,/*29957*/6728/* FE7F */,/*29958*/6729/* FE80 */, /*29959*/6730/* FE81 */,/*29960*/6731/* FE82 */,/*29961*/6732/* FE83 */,/*29962*/6733/* FE84 */,/*29963*/6734/* FE85 */, /*29964*/6735/* FE86 */,/*29965*/6736/* FE87 */,/*29966*/6737/* FE88 */,/*29967*/6738/* FE89 */,/*29968*/6739/* FE8A */, /*29969*/6740/* FE8B */,/*29970*/6741/* FE8C */,/*29971*/6742/* FE8D */,/*29972*/6743/* FE8E */,/*29973*/6744/* FE8F */, /*29974*/6745/* FE90 */,/*29975*/6746/* FE91 */,/*29976*/6747/* FE92 */,/*29977*/6748/* FE93 */,/*29978*/6749/* FE94 */, /*29979*/6750/* FE95 */,/*29980*/6751/* FE96 */,/*29981*/6752/* FE97 */,/*29982*/6753/* FE98 */,/*29983*/6754/* FE99 */, /*29984*/6755/* FE9A */,/*29985*/6756/* FE9B */,/*29986*/6757/* FE9C */,/*29987*/6758/* FE9D */,/*29988*/6759/* FE9E */, /*29989*/6760/* FE9F */,/*29990*/6761/* FEA0 */,/*29991*/6762/* FEA1 */,/*29992*/6763/* FEA2 */,/*29993*/6764/* FEA3 */, /*29994*/6765/* FEA4 */,/*29995*/6766/* FEA5 */,/*29996*/6767/* FEA6 */,/*29997*/6768/* FEA7 */,/*29998*/6769/* FEA8 */, /*29999*/6770/* FEA9 */,/*30000*/6771/* FEAA */,/*30001*/6772/* FEAB */,/*30002*/6773/* FEAC */,/*30003*/6774/* FEAD */, /*30004*/6775/* FEAE */,/*30005*/6776/* FEAF */,/*30006*/6777/* FEB0 */,/*30007*/6778/* FEB1 */,/*30008*/6779/* FEB2 */, /*30009*/6780/* FEB3 */,/*30010*/6781/* FEB4 */,/*30011*/6782/* FEB5 */,/*30012*/6783/* FEB6 */,/*30013*/6784/* FEB7 */, /*30014*/6785/* FEB8 */,/*30015*/6786/* FEB9 */,/*30016*/6787/* FEBA */,/*30017*/6788/* FEBB */,/*30018*/6789/* FEBC */, /*30019*/6790/* FEBD */,/*30020*/6791/* FEBE */,/*30021*/6792/* FEBF */,/*30022*/6793/* FEC0 */,/*30023*/6794/* FEC1 */, /*30024*/6795/* FEC2 */,/*30025*/6796/* FEC3 */,/*30026*/6797/* FEC4 */,/*30027*/6798/* FEC5 */,/*30028*/6799/* FEC6 */, /*30029*/6800/* FEC7 */,/*30030*/6801/* FEC8 */,/*30031*/6802/* FEC9 */,/*30032*/6803/* FECA */,/*30033*/6804/* FECB */, /*30034*/6805/* FECC */,/*30035*/6806/* FECD */,/*30036*/6807/* FECE */,/*30037*/6808/* FECF */,/*30038*/6809/* FED0 */, /*30039*/6810/* FED1 */,/*30040*/6811/* FED2 */,/*30041*/6812/* FED3 */,/*30042*/6813/* FED4 */,/*30043*/6814/* FED5 */, /*30044*/6815/* FED6 */,/*30045*/6816/* FED7 */,/*30046*/6817/* FED8 */,/*30047*/6818/* FED9 */,/*30048*/6819/* FEDA */, /*30049*/6820/* FEDB */,/*30050*/6821/* FEDC */,/*30051*/6822/* FEDD */,/*30052*/6823/* FEDE */,/*30053*/6824/* FEDF */, /*30054*/6825/* FEE0 */,/*30055*/6826/* FEE1 */,/*30056*/6827/* FEE2 */,/*30057*/6828/* FEE3 */,/*30058*/6829/* FEE4 */, /*30059*/6830/* FEE5 */,/*30060*/6831/* FEE6 */,/*30061*/6832/* FEE7 */,/*30062*/6833/* FEE8 */,/*30063*/6834/* FEE9 */, /*30064*/6835/* FEEA */,/*30065*/6836/* FEEB */,/*30066*/6837/* FEEC */,/*30067*/6838/* FEED */,/*30068*/6839/* FEEE */, /*30069*/6840/* FEEF */,/*30070*/6841/* FEF0 */,/*30071*/6842/* FEF1 */,/*30072*/6843/* FEF2 */,/*30073*/6844/* FEF3 */, /*30074*/6845/* FEF4 */,/*30075*/6846/* FEF5 */,/*30076*/6847/* FEF6 */,/*30077*/6848/* FEF7 */,/*30078*/6849/* FEF8 */, /*30079*/6850/* FEF9 */,/*30080*/6851/* FEFA */,/*30081*/6852/* FEFB */,/*30082*/6853/* FEFC */,0,0, /*30085*/6854/* FEFF */,0,/*30087*/6855/* FF01 */,/*30088*/6856/* FF02 */,/*30089*/6857/* FF03 */, /*30090*/6858/* FF04 */,/*30091*/6859/* FF05 */,/*30092*/6860/* FF06 */,/*30093*/6861/* FF07 */,/*30094*/6862/* FF08 */, /*30095*/6863/* FF09 */,/*30096*/6864/* FF0A */,/*30097*/6865/* FF0B */,/*30098*/6866/* FF0C */,/*30099*/6867/* FF0D */, /*30100*/6868/* FF0E */,/*30101*/6869/* FF0F */,/*30102*/6870/* FF10 */,/*30103*/6871/* FF11 */,/*30104*/6872/* FF12 */, /*30105*/6873/* FF13 */,/*30106*/6874/* FF14 */,/*30107*/6875/* FF15 */,/*30108*/6876/* FF16 */,/*30109*/6877/* FF17 */, /*30110*/6878/* FF18 */,/*30111*/6879/* FF19 */,/*30112*/6880/* FF1A */,/*30113*/6881/* FF1B */,/*30114*/6882/* FF1C */, /*30115*/6883/* FF1D */,/*30116*/6884/* FF1E */,/*30117*/6885/* FF1F */,/*30118*/6886/* FF20 */,/*30119*/6887/* FF21 */, /*30120*/6888/* FF22 */,/*30121*/6889/* FF23 */,/*30122*/6890/* FF24 */,/*30123*/6891/* FF25 */,/*30124*/6892/* FF26 */, /*30125*/6893/* FF27 */,/*30126*/6894/* FF28 */,/*30127*/6895/* FF29 */,/*30128*/6896/* FF2A */,/*30129*/6897/* FF2B */, /*30130*/6898/* FF2C */,/*30131*/6899/* FF2D */,/*30132*/6900/* FF2E */,/*30133*/6901/* FF2F */,/*30134*/6902/* FF30 */, /*30135*/6903/* FF31 */,/*30136*/6904/* FF32 */,/*30137*/6905/* FF33 */,/*30138*/6906/* FF34 */,/*30139*/6907/* FF35 */, /*30140*/6908/* FF36 */,/*30141*/6909/* FF37 */,/*30142*/6910/* FF38 */,/*30143*/6911/* FF39 */,/*30144*/6912/* FF3A */, /*30145*/6913/* FF3B */,/*30146*/6914/* FF3C */,/*30147*/6915/* FF3D */,/*30148*/6916/* FF3E */,/*30149*/6917/* FF3F */, /*30150*/6918/* FF40 */,/*30151*/6919/* FF41 */,/*30152*/6920/* FF42 */,/*30153*/6921/* FF43 */,/*30154*/6922/* FF44 */, /*30155*/6923/* FF45 */,/*30156*/6924/* FF46 */,/*30157*/6925/* FF47 */,/*30158*/6926/* FF48 */,/*30159*/6927/* FF49 */, /*30160*/6928/* FF4A */,/*30161*/6929/* FF4B */,/*30162*/6930/* FF4C */,/*30163*/6931/* FF4D */,/*30164*/6932/* FF4E */, /*30165*/6933/* FF4F */,/*30166*/6934/* FF50 */,/*30167*/6935/* FF51 */,/*30168*/6936/* FF52 */,/*30169*/6937/* FF53 */, /*30170*/6938/* FF54 */,/*30171*/6939/* FF55 */,/*30172*/6940/* FF56 */,/*30173*/6941/* FF57 */,/*30174*/6942/* FF58 */, /*30175*/6943/* FF59 */,/*30176*/6944/* FF5A */,/*30177*/6945/* FF5B */,/*30178*/6946/* FF5C */,/*30179*/6947/* FF5D */, /*30180*/6948/* FF5E */,/*30181*/6949/* FF5F */,/*30182*/6950/* FF60 */,/*30183*/6951/* FF61 */,/*30184*/6952/* FF62 */, /*30185*/6953/* FF63 */,/*30186*/6954/* FF64 */,/*30187*/6955/* FF65 */,/*30188*/6956/* FF66 */,/*30189*/6957/* FF67 */, /*30190*/6958/* FF68 */,/*30191*/6959/* FF69 */,/*30192*/6960/* FF6A */,/*30193*/6961/* FF6B */,/*30194*/6962/* FF6C */, /*30195*/6963/* FF6D */,/*30196*/6964/* FF6E */,/*30197*/6965/* FF6F */,/*30198*/6966/* FF70 */,/*30199*/6967/* FF71 */, /*30200*/6968/* FF72 */,/*30201*/6969/* FF73 */,/*30202*/6970/* FF74 */,/*30203*/6971/* FF75 */,/*30204*/6972/* FF76 */, /*30205*/6973/* FF77 */,/*30206*/6974/* FF78 */,/*30207*/6975/* FF79 */,/*30208*/6976/* FF7A */,/*30209*/6977/* FF7B */, /*30210*/6978/* FF7C */,/*30211*/6979/* FF7D */,/*30212*/6980/* FF7E */,/*30213*/6981/* FF7F */,/*30214*/6982/* FF80 */, /*30215*/6983/* FF81 */,/*30216*/6984/* FF82 */,/*30217*/6985/* FF83 */,/*30218*/6986/* FF84 */,/*30219*/6987/* FF85 */, /*30220*/6988/* FF86 */,/*30221*/6989/* FF87 */,/*30222*/6990/* FF88 */,/*30223*/6991/* FF89 */,/*30224*/6992/* FF8A */, /*30225*/6993/* FF8B */,/*30226*/6994/* FF8C */,/*30227*/6995/* FF8D */,/*30228*/6996/* FF8E */,/*30229*/6997/* FF8F */, /*30230*/6998/* FF90 */,/*30231*/6999/* FF91 */,/*30232*/7000/* FF92 */,/*30233*/7001/* FF93 */,/*30234*/7002/* FF94 */, /*30235*/7003/* FF95 */,/*30236*/7004/* FF96 */,/*30237*/7005/* FF97 */,/*30238*/7006/* FF98 */,/*30239*/7007/* FF99 */, /*30240*/7008/* FF9A */,/*30241*/7009/* FF9B */,/*30242*/7010/* FF9C */,/*30243*/7011/* FF9D */,/*30244*/7012/* FF9E */, /*30245*/7013/* FF9F */,/*30246*/7014/* FFA0 */,/*30247*/7015/* FFA1 */,/*30248*/7016/* FFA2 */,/*30249*/7017/* FFA3 */, /*30250*/7018/* FFA4 */,/*30251*/7019/* FFA5 */,/*30252*/7020/* FFA6 */,/*30253*/7021/* FFA7 */,/*30254*/7022/* FFA8 */, /*30255*/7023/* FFA9 */,/*30256*/7024/* FFAA */,/*30257*/7025/* FFAB */,/*30258*/7026/* FFAC */,/*30259*/7027/* FFAD */, /*30260*/7028/* FFAE */,/*30261*/7029/* FFAF */,/*30262*/7030/* FFB0 */,/*30263*/7031/* FFB1 */,/*30264*/7032/* FFB2 */, /*30265*/7033/* FFB3 */,/*30266*/7034/* FFB4 */,/*30267*/7035/* FFB5 */,/*30268*/7036/* FFB6 */,/*30269*/7037/* FFB7 */, /*30270*/7038/* FFB8 */,/*30271*/7039/* FFB9 */,/*30272*/7040/* FFBA */,/*30273*/7041/* FFBB */,/*30274*/7042/* FFBC */, /*30275*/7043/* FFBD */,/*30276*/7044/* FFBE */,0,0,0,/*30280*/7045/* FFC2 */,/*30281*/7046/* FFC3 */, /*30282*/7047/* FFC4 */,/*30283*/7048/* FFC5 */,/*30284*/7049/* FFC6 */,/*30285*/7050/* FFC7 */,0,0, /*30288*/7051/* FFCA */,/*30289*/7052/* FFCB */,/*30290*/7053/* FFCC */,/*30291*/7054/* FFCD */,/*30292*/7055/* FFCE */, /*30293*/7056/* FFCF */,0,0,/*30296*/7057/* FFD2 */,/*30297*/7058/* FFD3 */,/*30298*/7059/* FFD4 */, /*30299*/7060/* FFD5 */,/*30300*/7061/* FFD6 */,/*30301*/7062/* FFD7 */,0,0,/*30304*/7063/* FFDA */, /*30305*/7064/* FFDB */,/*30306*/7065/* FFDC */,0,0,0,/*30310*/7066/* FFE0 */,/*30311*/7067/* FFE1 */, /*30312*/7068/* FFE2 */,/*30313*/7069/* FFE3 */,/*30314*/7070/* FFE4 */,/*30315*/7071/* FFE5 */,/*30316*/7072/* FFE6 */, 0,/*30318*/7073/* FFE8 */,/*30319*/7074/* FFE9 */,/*30320*/7075/* FFEA */,/*30321*/7076/* FFEB */, /*30322*/7077/* FFEC */,/*30323*/7078/* FFED */,/*30324*/7079/* FFEE */,0,0,0,0,0,0,0,0,0,0,/*30335*/7080/* FFF9 */, /*30336*/7081/* FFFA */,/*30337*/7081/* FFFB */,/*30338*/7082/* FFFC */,/*30339*/7083/* FFFD */,/*30340*/7084/* 10000 */, /*30341*/7085/* 10001 */,/*30342*/7085/* 10002 */,/*30343*/7085/* 10003 */,/*30344*/7085/* 10004 */, /*30345*/7085/* 10005 */,/*30346*/7085/* 10006 */,/*30347*/7085/* 10007 */,/*30348*/7085/* 10008 */, /*30349*/7085/* 10009 */,/*30350*/7085/* 1000A */,/*30351*/7085/* 1000B */,0,/*30353*/7085/* 1000D */, /*30354*/7085/* 1000E */,/*30355*/7085/* 1000F */,/*30356*/7085/* 10010 */,/*30357*/7085/* 10011 */, /*30358*/7085/* 10012 */,/*30359*/7085/* 10013 */,/*30360*/7085/* 10014 */,/*30361*/7085/* 10015 */, /*30362*/7085/* 10016 */,/*30363*/7085/* 10017 */,/*30364*/7085/* 10018 */,/*30365*/7085/* 10019 */, /*30366*/7085/* 1001A */,/*30367*/7085/* 1001B */,/*30368*/7085/* 1001C */,/*30369*/7085/* 1001D */, /*30370*/7085/* 1001E */,/*30371*/7085/* 1001F */,/*30372*/7085/* 10020 */,/*30373*/7085/* 10021 */, /*30374*/7085/* 10022 */,/*30375*/7085/* 10023 */,/*30376*/7085/* 10024 */,/*30377*/7085/* 10025 */, /*30378*/7085/* 10026 */,0,/*30380*/7085/* 10028 */,/*30381*/7085/* 10029 */,/*30382*/7085/* 1002A */, /*30383*/7085/* 1002B */,/*30384*/7085/* 1002C */,/*30385*/7085/* 1002D */,/*30386*/7085/* 1002E */, /*30387*/7085/* 1002F */,/*30388*/7085/* 10030 */,/*30389*/7085/* 10031 */,/*30390*/7085/* 10032 */, /*30391*/7085/* 10033 */,/*30392*/7085/* 10034 */,/*30393*/7085/* 10035 */,/*30394*/7085/* 10036 */, /*30395*/7085/* 10037 */,/*30396*/7085/* 10038 */,/*30397*/7085/* 10039 */,/*30398*/7085/* 1003A */,0, /*30400*/7085/* 1003C */,/*30401*/7085/* 1003D */,0,/*30403*/7085/* 1003F */,/*30404*/7085/* 10040 */, /*30405*/7085/* 10041 */,/*30406*/7085/* 10042 */,/*30407*/7085/* 10043 */,/*30408*/7085/* 10044 */, /*30409*/7085/* 10045 */,/*30410*/7085/* 10046 */,/*30411*/7085/* 10047 */,/*30412*/7085/* 10048 */, /*30413*/7085/* 10049 */,/*30414*/7085/* 1004A */,/*30415*/7085/* 1004B */,/*30416*/7085/* 1004C */, /*30417*/7085/* 1004D */,0,0,/*30420*/7085/* 10050 */,/*30421*/7085/* 10051 */,/*30422*/7085/* 10052 */, /*30423*/7085/* 10053 */,/*30424*/7085/* 10054 */,/*30425*/7085/* 10055 */,/*30426*/7085/* 10056 */, /*30427*/7085/* 10057 */,/*30428*/7085/* 10058 */,/*30429*/7085/* 10059 */,/*30430*/7085/* 1005A */, /*30431*/7085/* 1005B */,/*30432*/7085/* 1005C */,/*30433*/7085/* 1005D */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*30468*/7086/* 10080 */,/*30469*/7086/* 10081 */,/*30470*/7086/* 10082 */, /*30471*/7086/* 10083 */,/*30472*/7086/* 10084 */,/*30473*/7086/* 10085 */,/*30474*/7086/* 10086 */, /*30475*/7086/* 10087 */,/*30476*/7086/* 10088 */,/*30477*/7086/* 10089 */,/*30478*/7086/* 1008A */, /*30479*/7086/* 1008B */,/*30480*/7086/* 1008C */,/*30481*/7086/* 1008D */,/*30482*/7086/* 1008E */, /*30483*/7086/* 1008F */,/*30484*/7086/* 10090 */,/*30485*/7086/* 10091 */,/*30486*/7086/* 10092 */, /*30487*/7086/* 10093 */,/*30488*/7086/* 10094 */,/*30489*/7086/* 10095 */,/*30490*/7086/* 10096 */, /*30491*/7086/* 10097 */,/*30492*/7086/* 10098 */,/*30493*/7086/* 10099 */,/*30494*/7086/* 1009A */, /*30495*/7086/* 1009B */,/*30496*/7086/* 1009C */,/*30497*/7086/* 1009D */,/*30498*/7086/* 1009E */, /*30499*/7086/* 1009F */,/*30500*/7086/* 100A0 */,/*30501*/7086/* 100A1 */,/*30502*/7086/* 100A2 */, /*30503*/7086/* 100A3 */,/*30504*/7086/* 100A4 */,/*30505*/7086/* 100A5 */,/*30506*/7086/* 100A6 */, /*30507*/7086/* 100A7 */,/*30508*/7086/* 100A8 */,/*30509*/7086/* 100A9 */,/*30510*/7086/* 100AA */, /*30511*/7086/* 100AB */,/*30512*/7086/* 100AC */,/*30513*/7086/* 100AD */,/*30514*/7086/* 100AE */, /*30515*/7086/* 100AF */,/*30516*/7086/* 100B0 */,/*30517*/7086/* 100B1 */,/*30518*/7086/* 100B2 */, /*30519*/7086/* 100B3 */,/*30520*/7086/* 100B4 */,/*30521*/7086/* 100B5 */,/*30522*/7086/* 100B6 */, /*30523*/7086/* 100B7 */,/*30524*/7086/* 100B8 */,/*30525*/7086/* 100B9 */,/*30526*/7086/* 100BA */, /*30527*/7086/* 100BB */,/*30528*/7086/* 100BC */,/*30529*/7086/* 100BD */,/*30530*/7086/* 100BE */, /*30531*/7086/* 100BF */,/*30532*/7086/* 100C0 */,/*30533*/7086/* 100C1 */,/*30534*/7086/* 100C2 */, /*30535*/7086/* 100C3 */,/*30536*/7086/* 100C4 */,/*30537*/7086/* 100C5 */,/*30538*/7086/* 100C6 */, /*30539*/7086/* 100C7 */,/*30540*/7086/* 100C8 */,/*30541*/7086/* 100C9 */,/*30542*/7086/* 100CA */, /*30543*/7086/* 100CB */,/*30544*/7086/* 100CC */,/*30545*/7086/* 100CD */,/*30546*/7086/* 100CE */, /*30547*/7086/* 100CF */,/*30548*/7086/* 100D0 */,/*30549*/7086/* 100D1 */,/*30550*/7086/* 100D2 */, /*30551*/7086/* 100D3 */,/*30552*/7086/* 100D4 */,/*30553*/7086/* 100D5 */,/*30554*/7086/* 100D6 */, /*30555*/7086/* 100D7 */,/*30556*/7086/* 100D8 */,/*30557*/7086/* 100D9 */,/*30558*/7086/* 100DA */, /*30559*/7086/* 100DB */,/*30560*/7086/* 100DC */,/*30561*/7086/* 100DD */,/*30562*/7086/* 100DE */, /*30563*/7086/* 100DF */,/*30564*/7086/* 100E0 */,/*30565*/7086/* 100E1 */,/*30566*/7086/* 100E2 */, /*30567*/7086/* 100E3 */,/*30568*/7086/* 100E4 */,/*30569*/7086/* 100E5 */,/*30570*/7086/* 100E6 */, /*30571*/7086/* 100E7 */,/*30572*/7086/* 100E8 */,/*30573*/7086/* 100E9 */,/*30574*/7086/* 100EA */, /*30575*/7086/* 100EB */,/*30576*/7086/* 100EC */,/*30577*/7086/* 100ED */,/*30578*/7086/* 100EE */, /*30579*/7086/* 100EF */,/*30580*/7086/* 100F0 */,/*30581*/7086/* 100F1 */,/*30582*/7086/* 100F2 */, /*30583*/7086/* 100F3 */,/*30584*/7086/* 100F4 */,/*30585*/7086/* 100F5 */,/*30586*/7086/* 100F6 */, /*30587*/7086/* 100F7 */,/*30588*/7086/* 100F8 */,/*30589*/7086/* 100F9 */,/*30590*/7086/* 100FA */,0,0,0,0,0, /*30596*/7087/* 10100 */,/*30597*/7088/* 10101 */,/*30598*/7087/* 10102 */,0,0,0,0,/*30603*/7089/* 10107 */, /*30604*/7090/* 10108 */,/*30605*/7091/* 10109 */,/*30606*/7092/* 1010A */,/*30607*/7093/* 1010B */, /*30608*/7094/* 1010C */,/*30609*/7095/* 1010D */,/*30610*/7096/* 1010E */,/*30611*/7097/* 1010F */, /*30612*/7098/* 10110 */,/*30613*/7099/* 10111 */,/*30614*/7100/* 10112 */,/*30615*/7101/* 10113 */, /*30616*/7102/* 10114 */,/*30617*/7103/* 10115 */,/*30618*/7104/* 10116 */,/*30619*/7105/* 10117 */, /*30620*/7106/* 10118 */,/*30621*/7107/* 10119 */,/*30622*/7108/* 1011A */,/*30623*/7109/* 1011B */, /*30624*/7110/* 1011C */,/*30625*/7111/* 1011D */,/*30626*/7112/* 1011E */,/*30627*/7113/* 1011F */, /*30628*/7114/* 10120 */,/*30629*/7115/* 10121 */,/*30630*/7116/* 10122 */,/*30631*/7117/* 10123 */, /*30632*/7118/* 10124 */,/*30633*/7119/* 10125 */,/*30634*/7120/* 10126 */,/*30635*/7121/* 10127 */, /*30636*/7122/* 10128 */,/*30637*/7123/* 10129 */,/*30638*/7124/* 1012A */,/*30639*/7125/* 1012B */, /*30640*/7126/* 1012C */,/*30641*/7127/* 1012D */,/*30642*/7128/* 1012E */,/*30643*/7129/* 1012F */, /*30644*/7130/* 10130 */,/*30645*/7131/* 10131 */,/*30646*/7132/* 10132 */,/*30647*/7133/* 10133 */,0,0,0, /*30651*/7134/* 10137 */,/*30652*/7134/* 10138 */,/*30653*/7134/* 10139 */,/*30654*/7134/* 1013A */, /*30655*/7134/* 1013B */,/*30656*/7134/* 1013C */,/*30657*/7134/* 1013D */,/*30658*/7134/* 1013E */, /*30659*/7134/* 1013F */,/*30660*/7135/* 10140 */,/*30661*/7136/* 10141 */,/*30662*/7137/* 10142 */, /*30663*/7138/* 10143 */,/*30664*/7139/* 10144 */,/*30665*/7140/* 10145 */,/*30666*/7141/* 10146 */, /*30667*/7142/* 10147 */,/*30668*/7138/* 10148 */,/*30669*/7143/* 10149 */,/*30670*/7139/* 1014A */, /*30671*/7144/* 1014B */,/*30672*/7140/* 1014C */,/*30673*/7145/* 1014D */,/*30674*/7141/* 1014E */, /*30675*/7138/* 1014F */,/*30676*/7143/* 10150 */,/*30677*/7139/* 10151 */,/*30678*/7144/* 10152 */, /*30679*/7140/* 10153 */,/*30680*/7145/* 10154 */,/*30681*/7146/* 10155 */,/*30682*/7142/* 10156 */, /*30683*/7143/* 10157 */,/*30684*/7137/* 10158 */,/*30685*/7137/* 10159 */,/*30686*/7137/* 1015A */, /*30687*/7147/* 1015B */,/*30688*/7147/* 1015C */,/*30689*/7147/* 1015D */,/*30690*/7147/* 1015E */, /*30691*/7138/* 1015F */,/*30692*/7143/* 10160 */,/*30693*/7143/* 10161 */,/*30694*/7143/* 10162 */, /*30695*/7143/* 10163 */,/*30696*/7143/* 10164 */,/*30697*/7148/* 10165 */,/*30698*/7139/* 10166 */, /*30699*/7139/* 10167 */,/*30700*/7139/* 10168 */,/*30701*/7139/* 10169 */,/*30702*/7144/* 1016A */, /*30703*/7149/* 1016B */,/*30704*/7140/* 1016C */,/*30705*/7140/* 1016D */,/*30706*/7140/* 1016E */, /*30707*/7140/* 1016F */,/*30708*/7140/* 10170 */,/*30709*/7145/* 10171 */,/*30710*/7141/* 10172 */, /*30711*/7138/* 10173 */,/*30712*/7139/* 10174 */,/*30713*/7150/* 10175 */,/*30714*/7150/* 10176 */, /*30715*/7151/* 10177 */,/*30716*/7152/* 10178 */,/*30717*/7153/* 10179 */,/*30718*/7153/* 1017A */, /*30719*/7153/* 1017B */,/*30720*/7153/* 1017C */,/*30721*/7153/* 1017D */,/*30722*/7153/* 1017E */, /*30723*/7153/* 1017F */,/*30724*/7153/* 10180 */,/*30725*/7153/* 10181 */,/*30726*/7153/* 10182 */, /*30727*/7153/* 10183 */,/*30728*/7153/* 10184 */,/*30729*/7153/* 10185 */,/*30730*/7153/* 10186 */, /*30731*/7153/* 10187 */,/*30732*/7153/* 10188 */,/*30733*/7153/* 10189 */,/*30734*/7154/* 1018A */, /*30735*/7155/* 1018B */,/*30736*/7156/* 1018C */,0,0,0,/*30740*/7157/* 10190 */,/*30741*/7157/* 10191 */, /*30742*/7157/* 10192 */,/*30743*/7157/* 10193 */,/*30744*/7157/* 10194 */,/*30745*/7157/* 10195 */, /*30746*/7157/* 10196 */,/*30747*/7157/* 10197 */,/*30748*/7157/* 10198 */,/*30749*/7157/* 10199 */, /*30750*/7157/* 1019A */,/*30751*/7157/* 1019B */,0,0,0,0,/*30756*/7158/* 101A0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*30804*/7159/* 101D0 */,/*30805*/7159/* 101D1 */, /*30806*/7159/* 101D2 */,/*30807*/7159/* 101D3 */,/*30808*/7159/* 101D4 */,/*30809*/7159/* 101D5 */, /*30810*/7159/* 101D6 */,/*30811*/7159/* 101D7 */,/*30812*/7159/* 101D8 */,/*30813*/7159/* 101D9 */, /*30814*/7159/* 101DA */,/*30815*/7159/* 101DB */,/*30816*/7159/* 101DC */,/*30817*/7159/* 101DD */, /*30818*/7159/* 101DE */,/*30819*/7159/* 101DF */,/*30820*/7159/* 101E0 */,/*30821*/7159/* 101E1 */, /*30822*/7159/* 101E2 */,/*30823*/7159/* 101E3 */,/*30824*/7159/* 101E4 */,/*30825*/7159/* 101E5 */, /*30826*/7159/* 101E6 */,/*30827*/7159/* 101E7 */,/*30828*/7159/* 101E8 */,/*30829*/7159/* 101E9 */, /*30830*/7159/* 101EA */,/*30831*/7159/* 101EB */,/*30832*/7159/* 101EC */,/*30833*/7159/* 101ED */, /*30834*/7159/* 101EE */,/*30835*/7159/* 101EF */,/*30836*/7159/* 101F0 */,/*30837*/7159/* 101F1 */, /*30838*/7159/* 101F2 */,/*30839*/7159/* 101F3 */,/*30840*/7159/* 101F4 */,/*30841*/7159/* 101F5 */, /*30842*/7159/* 101F6 */,/*30843*/7159/* 101F7 */,/*30844*/7159/* 101F8 */,/*30845*/7159/* 101F9 */, /*30846*/7159/* 101FA */,/*30847*/7159/* 101FB */,/*30848*/7159/* 101FC */,/*30849*/7160/* 101FD */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*30980*/7161/* 10280 */,/*30981*/7161/* 10281 */,/*30982*/7161/* 10282 */,/*30983*/7161/* 10283 */, /*30984*/7161/* 10284 */,/*30985*/7161/* 10285 */,/*30986*/7161/* 10286 */,/*30987*/7161/* 10287 */, /*30988*/7161/* 10288 */,/*30989*/7161/* 10289 */,/*30990*/7161/* 1028A */,/*30991*/7161/* 1028B */, /*30992*/7161/* 1028C */,/*30993*/7161/* 1028D */,/*30994*/7161/* 1028E */,/*30995*/7161/* 1028F */, /*30996*/7161/* 10290 */,/*30997*/7161/* 10291 */,/*30998*/7161/* 10292 */,/*30999*/7161/* 10293 */, /*31000*/7161/* 10294 */,/*31001*/7161/* 10295 */,/*31002*/7161/* 10296 */,/*31003*/7161/* 10297 */, /*31004*/7161/* 10298 */,/*31005*/7161/* 10299 */,/*31006*/7161/* 1029A */,/*31007*/7161/* 1029B */, /*31008*/7161/* 1029C */,0,0,0,/*31012*/7162/* 102A0 */,/*31013*/7162/* 102A1 */,/*31014*/7162/* 102A2 */, /*31015*/7162/* 102A3 */,/*31016*/7162/* 102A4 */,/*31017*/7162/* 102A5 */,/*31018*/7162/* 102A6 */, /*31019*/7162/* 102A7 */,/*31020*/7162/* 102A8 */,/*31021*/7162/* 102A9 */,/*31022*/7162/* 102AA */, /*31023*/7162/* 102AB */,/*31024*/7162/* 102AC */,/*31025*/7162/* 102AD */,/*31026*/7162/* 102AE */, /*31027*/7162/* 102AF */,/*31028*/7162/* 102B0 */,/*31029*/7162/* 102B1 */,/*31030*/7162/* 102B2 */, /*31031*/7162/* 102B3 */,/*31032*/7162/* 102B4 */,/*31033*/7162/* 102B5 */,/*31034*/7162/* 102B6 */, /*31035*/7162/* 102B7 */,/*31036*/7162/* 102B8 */,/*31037*/7162/* 102B9 */,/*31038*/7162/* 102BA */, /*31039*/7162/* 102BB */,/*31040*/7162/* 102BC */,/*31041*/7162/* 102BD */,/*31042*/7162/* 102BE */, /*31043*/7162/* 102BF */,/*31044*/7162/* 102C0 */,/*31045*/7162/* 102C1 */,/*31046*/7162/* 102C2 */, /*31047*/7162/* 102C3 */,/*31048*/7162/* 102C4 */,/*31049*/7162/* 102C5 */,/*31050*/7162/* 102C6 */, /*31051*/7162/* 102C7 */,/*31052*/7162/* 102C8 */,/*31053*/7162/* 102C9 */,/*31054*/7162/* 102CA */, /*31055*/7162/* 102CB */,/*31056*/7162/* 102CC */,/*31057*/7162/* 102CD */,/*31058*/7162/* 102CE */, /*31059*/7162/* 102CF */,/*31060*/7162/* 102D0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31076*/7163/* 102E0 */, /*31077*/7164/* 102E1 */,/*31078*/7165/* 102E2 */,/*31079*/7166/* 102E3 */,/*31080*/7167/* 102E4 */, /*31081*/7168/* 102E5 */,/*31082*/7169/* 102E6 */,/*31083*/7170/* 102E7 */,/*31084*/7171/* 102E8 */, /*31085*/7172/* 102E9 */,/*31086*/7173/* 102EA */,/*31087*/7174/* 102EB */,/*31088*/7175/* 102EC */, /*31089*/7176/* 102ED */,/*31090*/7177/* 102EE */,/*31091*/7178/* 102EF */,/*31092*/7179/* 102F0 */, /*31093*/7180/* 102F1 */,/*31094*/7181/* 102F2 */,/*31095*/7182/* 102F3 */,/*31096*/7183/* 102F4 */, /*31097*/7184/* 102F5 */,/*31098*/7185/* 102F6 */,/*31099*/7186/* 102F7 */,/*31100*/7187/* 102F8 */, /*31101*/7188/* 102F9 */,/*31102*/7189/* 102FA */,/*31103*/7190/* 102FB */,0,0,0,0,/*31108*/7191/* 10300 */, /*31109*/7191/* 10301 */,/*31110*/7191/* 10302 */,/*31111*/7191/* 10303 */,/*31112*/7191/* 10304 */, /*31113*/7191/* 10305 */,/*31114*/7191/* 10306 */,/*31115*/7191/* 10307 */,/*31116*/7191/* 10308 */, /*31117*/7191/* 10309 */,/*31118*/7191/* 1030A */,/*31119*/7191/* 1030B */,/*31120*/7191/* 1030C */, /*31121*/7191/* 1030D */,/*31122*/7191/* 1030E */,/*31123*/7191/* 1030F */,/*31124*/7191/* 10310 */, /*31125*/7191/* 10311 */,/*31126*/7191/* 10312 */,/*31127*/7191/* 10313 */,/*31128*/7191/* 10314 */, /*31129*/7191/* 10315 */,/*31130*/7191/* 10316 */,/*31131*/7191/* 10317 */,/*31132*/7191/* 10318 */, /*31133*/7191/* 10319 */,/*31134*/7191/* 1031A */,/*31135*/7191/* 1031B */,/*31136*/7191/* 1031C */, /*31137*/7191/* 1031D */,/*31138*/7191/* 1031E */,/*31139*/7192/* 1031F */,/*31140*/7193/* 10320 */, /*31141*/7194/* 10321 */,/*31142*/7195/* 10322 */,/*31143*/7196/* 10323 */,0,0,0,0,0,0,0,0,0,0,0,0, /*31156*/7197/* 10330 */,/*31157*/7197/* 10331 */,/*31158*/7197/* 10332 */,/*31159*/7197/* 10333 */, /*31160*/7197/* 10334 */,/*31161*/7197/* 10335 */,/*31162*/7197/* 10336 */,/*31163*/7197/* 10337 */, /*31164*/7197/* 10338 */,/*31165*/7197/* 10339 */,/*31166*/7197/* 1033A */,/*31167*/7197/* 1033B */, /*31168*/7197/* 1033C */,/*31169*/7197/* 1033D */,/*31170*/7197/* 1033E */,/*31171*/7197/* 1033F */, /*31172*/7197/* 10340 */,/*31173*/7198/* 10341 */,/*31174*/7197/* 10342 */,/*31175*/7197/* 10343 */, /*31176*/7197/* 10344 */,/*31177*/7197/* 10345 */,/*31178*/7197/* 10346 */,/*31179*/7197/* 10347 */, /*31180*/7197/* 10348 */,/*31181*/7197/* 10349 */,/*31182*/7199/* 1034A */,0,0,0,0,0,/*31188*/7200/* 10350 */, /*31189*/7200/* 10351 */,/*31190*/7200/* 10352 */,/*31191*/7200/* 10353 */,/*31192*/7200/* 10354 */, /*31193*/7200/* 10355 */,/*31194*/7200/* 10356 */,/*31195*/7200/* 10357 */,/*31196*/7200/* 10358 */, /*31197*/7200/* 10359 */,/*31198*/7200/* 1035A */,/*31199*/7200/* 1035B */,/*31200*/7200/* 1035C */, /*31201*/7200/* 1035D */,/*31202*/7200/* 1035E */,/*31203*/7200/* 1035F */,/*31204*/7200/* 10360 */, /*31205*/7200/* 10361 */,/*31206*/7200/* 10362 */,/*31207*/7200/* 10363 */,/*31208*/7200/* 10364 */, /*31209*/7200/* 10365 */,/*31210*/7200/* 10366 */,/*31211*/7200/* 10367 */,/*31212*/7200/* 10368 */, /*31213*/7200/* 10369 */,/*31214*/7200/* 1036A */,/*31215*/7200/* 1036B */,/*31216*/7200/* 1036C */, /*31217*/7200/* 1036D */,/*31218*/7200/* 1036E */,/*31219*/7200/* 1036F */,/*31220*/7200/* 10370 */, /*31221*/7200/* 10371 */,/*31222*/7200/* 10372 */,/*31223*/7200/* 10373 */,/*31224*/7200/* 10374 */, /*31225*/7200/* 10375 */,/*31226*/7201/* 10376 */,/*31227*/7201/* 10377 */,/*31228*/7201/* 10378 */, /*31229*/7201/* 10379 */,/*31230*/7201/* 1037A */,0,0,0,0,0,/*31236*/7202/* 10380 */,/*31237*/7202/* 10381 */, /*31238*/7202/* 10382 */,/*31239*/7202/* 10383 */,/*31240*/7202/* 10384 */,/*31241*/7202/* 10385 */, /*31242*/7202/* 10386 */,/*31243*/7202/* 10387 */,/*31244*/7202/* 10388 */,/*31245*/7202/* 10389 */, /*31246*/7202/* 1038A */,/*31247*/7202/* 1038B */,/*31248*/7202/* 1038C */,/*31249*/7202/* 1038D */, /*31250*/7202/* 1038E */,/*31251*/7202/* 1038F */,/*31252*/7202/* 10390 */,/*31253*/7202/* 10391 */, /*31254*/7202/* 10392 */,/*31255*/7202/* 10393 */,/*31256*/7202/* 10394 */,/*31257*/7202/* 10395 */, /*31258*/7202/* 10396 */,/*31259*/7202/* 10397 */,/*31260*/7202/* 10398 */,/*31261*/7202/* 10399 */, /*31262*/7202/* 1039A */,/*31263*/7202/* 1039B */,/*31264*/7202/* 1039C */,/*31265*/7202/* 1039D */,0, /*31267*/7203/* 1039F */,/*31268*/7204/* 103A0 */,/*31269*/7204/* 103A1 */,/*31270*/7204/* 103A2 */, /*31271*/7204/* 103A3 */,/*31272*/7204/* 103A4 */,/*31273*/7204/* 103A5 */,/*31274*/7204/* 103A6 */, /*31275*/7204/* 103A7 */,/*31276*/7204/* 103A8 */,/*31277*/7204/* 103A9 */,/*31278*/7204/* 103AA */, /*31279*/7204/* 103AB */,/*31280*/7204/* 103AC */,/*31281*/7204/* 103AD */,/*31282*/7204/* 103AE */, /*31283*/7204/* 103AF */,/*31284*/7204/* 103B0 */,/*31285*/7204/* 103B1 */,/*31286*/7204/* 103B2 */, /*31287*/7204/* 103B3 */,/*31288*/7204/* 103B4 */,/*31289*/7204/* 103B5 */,/*31290*/7204/* 103B6 */, /*31291*/7204/* 103B7 */,/*31292*/7204/* 103B8 */,/*31293*/7204/* 103B9 */,/*31294*/7204/* 103BA */, /*31295*/7204/* 103BB */,/*31296*/7204/* 103BC */,/*31297*/7204/* 103BD */,/*31298*/7204/* 103BE */, /*31299*/7204/* 103BF */,/*31300*/7204/* 103C0 */,/*31301*/7204/* 103C1 */,/*31302*/7204/* 103C2 */, /*31303*/7204/* 103C3 */,0,0,0,0,/*31308*/7204/* 103C8 */,/*31309*/7204/* 103C9 */,/*31310*/7204/* 103CA */, /*31311*/7204/* 103CB */,/*31312*/7204/* 103CC */,/*31313*/7204/* 103CD */,/*31314*/7204/* 103CE */, /*31315*/7204/* 103CF */,/*31316*/7205/* 103D0 */,/*31317*/7206/* 103D1 */,/*31318*/7207/* 103D2 */, /*31319*/7208/* 103D3 */,/*31320*/7209/* 103D4 */,/*31321*/7210/* 103D5 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31364*/7211/* 10400 */,/*31365*/7212/* 10401 */,/*31366*/7213/* 10402 */, /*31367*/7214/* 10403 */,/*31368*/7215/* 10404 */,/*31369*/7216/* 10405 */,/*31370*/7217/* 10406 */, /*31371*/7218/* 10407 */,/*31372*/7219/* 10408 */,/*31373*/7220/* 10409 */,/*31374*/7221/* 1040A */, /*31375*/7222/* 1040B */,/*31376*/7223/* 1040C */,/*31377*/7224/* 1040D */,/*31378*/7225/* 1040E */, /*31379*/7226/* 1040F */,/*31380*/7227/* 10410 */,/*31381*/7228/* 10411 */,/*31382*/7229/* 10412 */, /*31383*/7230/* 10413 */,/*31384*/7231/* 10414 */,/*31385*/7232/* 10415 */,/*31386*/7233/* 10416 */, /*31387*/7234/* 10417 */,/*31388*/7235/* 10418 */,/*31389*/7236/* 10419 */,/*31390*/7237/* 1041A */, /*31391*/7238/* 1041B */,/*31392*/7239/* 1041C */,/*31393*/7240/* 1041D */,/*31394*/7241/* 1041E */, /*31395*/7242/* 1041F */,/*31396*/7243/* 10420 */,/*31397*/7244/* 10421 */,/*31398*/7245/* 10422 */, /*31399*/7246/* 10423 */,/*31400*/7247/* 10424 */,/*31401*/7248/* 10425 */,/*31402*/7249/* 10426 */, /*31403*/7250/* 10427 */,/*31404*/7251/* 10428 */,/*31405*/7252/* 10429 */,/*31406*/7253/* 1042A */, /*31407*/7254/* 1042B */,/*31408*/7255/* 1042C */,/*31409*/7256/* 1042D */,/*31410*/7257/* 1042E */, /*31411*/7258/* 1042F */,/*31412*/7259/* 10430 */,/*31413*/7260/* 10431 */,/*31414*/7261/* 10432 */, /*31415*/7262/* 10433 */,/*31416*/7263/* 10434 */,/*31417*/7264/* 10435 */,/*31418*/7265/* 10436 */, /*31419*/7266/* 10437 */,/*31420*/7267/* 10438 */,/*31421*/7268/* 10439 */,/*31422*/7269/* 1043A */, /*31423*/7270/* 1043B */,/*31424*/7271/* 1043C */,/*31425*/7272/* 1043D */,/*31426*/7273/* 1043E */, /*31427*/7274/* 1043F */,/*31428*/7275/* 10440 */,/*31429*/7276/* 10441 */,/*31430*/7277/* 10442 */, /*31431*/7278/* 10443 */,/*31432*/7279/* 10444 */,/*31433*/7280/* 10445 */,/*31434*/7281/* 10446 */, /*31435*/7282/* 10447 */,/*31436*/7283/* 10448 */,/*31437*/7284/* 10449 */,/*31438*/7285/* 1044A */, /*31439*/7286/* 1044B */,/*31440*/7287/* 1044C */,/*31441*/7288/* 1044D */,/*31442*/7289/* 1044E */, /*31443*/7290/* 1044F */,/*31444*/7291/* 10450 */,/*31445*/7291/* 10451 */,/*31446*/7291/* 10452 */, /*31447*/7291/* 10453 */,/*31448*/7291/* 10454 */,/*31449*/7291/* 10455 */,/*31450*/7291/* 10456 */, /*31451*/7291/* 10457 */,/*31452*/7291/* 10458 */,/*31453*/7291/* 10459 */,/*31454*/7291/* 1045A */, /*31455*/7291/* 1045B */,/*31456*/7291/* 1045C */,/*31457*/7291/* 1045D */,/*31458*/7291/* 1045E */, /*31459*/7291/* 1045F */,/*31460*/7291/* 10460 */,/*31461*/7291/* 10461 */,/*31462*/7291/* 10462 */, /*31463*/7291/* 10463 */,/*31464*/7291/* 10464 */,/*31465*/7291/* 10465 */,/*31466*/7291/* 10466 */, /*31467*/7291/* 10467 */,/*31468*/7291/* 10468 */,/*31469*/7291/* 10469 */,/*31470*/7291/* 1046A */, /*31471*/7291/* 1046B */,/*31472*/7291/* 1046C */,/*31473*/7291/* 1046D */,/*31474*/7291/* 1046E */, /*31475*/7291/* 1046F */,/*31476*/7291/* 10470 */,/*31477*/7291/* 10471 */,/*31478*/7291/* 10472 */, /*31479*/7291/* 10473 */,/*31480*/7291/* 10474 */,/*31481*/7291/* 10475 */,/*31482*/7291/* 10476 */, /*31483*/7291/* 10477 */,/*31484*/7291/* 10478 */,/*31485*/7291/* 10479 */,/*31486*/7291/* 1047A */, /*31487*/7291/* 1047B */,/*31488*/7291/* 1047C */,/*31489*/7291/* 1047D */,/*31490*/7291/* 1047E */, /*31491*/7291/* 1047F */,/*31492*/7292/* 10480 */,/*31493*/7292/* 10481 */,/*31494*/7292/* 10482 */, /*31495*/7292/* 10483 */,/*31496*/7292/* 10484 */,/*31497*/7292/* 10485 */,/*31498*/7292/* 10486 */, /*31499*/7292/* 10487 */,/*31500*/7292/* 10488 */,/*31501*/7292/* 10489 */,/*31502*/7292/* 1048A */, /*31503*/7292/* 1048B */,/*31504*/7292/* 1048C */,/*31505*/7292/* 1048D */,/*31506*/7292/* 1048E */, /*31507*/7292/* 1048F */,/*31508*/7292/* 10490 */,/*31509*/7292/* 10491 */,/*31510*/7292/* 10492 */, /*31511*/7292/* 10493 */,/*31512*/7292/* 10494 */,/*31513*/7292/* 10495 */,/*31514*/7292/* 10496 */, /*31515*/7292/* 10497 */,/*31516*/7292/* 10498 */,/*31517*/7292/* 10499 */,/*31518*/7292/* 1049A */, /*31519*/7292/* 1049B */,/*31520*/7292/* 1049C */,/*31521*/7292/* 1049D */,0,0,/*31524*/7293/* 104A0 */, /*31525*/7294/* 104A1 */,/*31526*/7295/* 104A2 */,/*31527*/7296/* 104A3 */,/*31528*/7297/* 104A4 */, /*31529*/7298/* 104A5 */,/*31530*/7299/* 104A6 */,/*31531*/7300/* 104A7 */,/*31532*/7301/* 104A8 */, /*31533*/7302/* 104A9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31620*/7303/* 10500 */, /*31621*/7303/* 10501 */,/*31622*/7303/* 10502 */,/*31623*/7303/* 10503 */,/*31624*/7303/* 10504 */, /*31625*/7303/* 10505 */,/*31626*/7303/* 10506 */,/*31627*/7303/* 10507 */,/*31628*/7303/* 10508 */, /*31629*/7303/* 10509 */,/*31630*/7303/* 1050A */,/*31631*/7303/* 1050B */,/*31632*/7303/* 1050C */, /*31633*/7303/* 1050D */,/*31634*/7303/* 1050E */,/*31635*/7303/* 1050F */,/*31636*/7303/* 10510 */, /*31637*/7303/* 10511 */,/*31638*/7303/* 10512 */,/*31639*/7303/* 10513 */,/*31640*/7303/* 10514 */, /*31641*/7303/* 10515 */,/*31642*/7303/* 10516 */,/*31643*/7303/* 10517 */,/*31644*/7303/* 10518 */, /*31645*/7303/* 10519 */,/*31646*/7303/* 1051A */,/*31647*/7303/* 1051B */,/*31648*/7303/* 1051C */, /*31649*/7303/* 1051D */,/*31650*/7303/* 1051E */,/*31651*/7303/* 1051F */,/*31652*/7303/* 10520 */, /*31653*/7303/* 10521 */,/*31654*/7303/* 10522 */,/*31655*/7303/* 10523 */,/*31656*/7303/* 10524 */, /*31657*/7303/* 10525 */,/*31658*/7303/* 10526 */,/*31659*/7303/* 10527 */,0,0,0,0,0,0,0,0,/*31668*/7304/* 10530 */, /*31669*/7304/* 10531 */,/*31670*/7304/* 10532 */,/*31671*/7304/* 10533 */,/*31672*/7304/* 10534 */, /*31673*/7304/* 10535 */,/*31674*/7304/* 10536 */,/*31675*/7304/* 10537 */,/*31676*/7304/* 10538 */, /*31677*/7304/* 10539 */,/*31678*/7304/* 1053A */,/*31679*/7304/* 1053B */,/*31680*/7304/* 1053C */, /*31681*/7304/* 1053D */,/*31682*/7304/* 1053E */,/*31683*/7304/* 1053F */,/*31684*/7304/* 10540 */, /*31685*/7304/* 10541 */,/*31686*/7304/* 10542 */,/*31687*/7304/* 10543 */,/*31688*/7304/* 10544 */, /*31689*/7304/* 10545 */,/*31690*/7304/* 10546 */,/*31691*/7304/* 10547 */,/*31692*/7304/* 10548 */, /*31693*/7304/* 10549 */,/*31694*/7304/* 1054A */,/*31695*/7304/* 1054B */,/*31696*/7304/* 1054C */, /*31697*/7304/* 1054D */,/*31698*/7304/* 1054E */,/*31699*/7304/* 1054F */,/*31700*/7304/* 10550 */, /*31701*/7304/* 10551 */,/*31702*/7304/* 10552 */,/*31703*/7304/* 10553 */,/*31704*/7304/* 10554 */, /*31705*/7304/* 10555 */,/*31706*/7304/* 10556 */,/*31707*/7304/* 10557 */,/*31708*/7304/* 10558 */, /*31709*/7304/* 10559 */,/*31710*/7304/* 1055A */,/*31711*/7304/* 1055B */,/*31712*/7304/* 1055C */, /*31713*/7304/* 1055D */,/*31714*/7304/* 1055E */,/*31715*/7304/* 1055F */,/*31716*/7304/* 10560 */, /*31717*/7304/* 10561 */,/*31718*/7304/* 10562 */,/*31719*/7304/* 10563 */,0,0,0,0,0,0,0,0,0,0,0, /*31731*/7305/* 1056F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31876*/7306/* 10600 */, /*31877*/7306/* 10601 */,/*31878*/7306/* 10602 */,/*31879*/7306/* 10603 */,/*31880*/7306/* 10604 */, /*31881*/7306/* 10605 */,/*31882*/7306/* 10606 */,/*31883*/7306/* 10607 */,/*31884*/7306/* 10608 */, /*31885*/7306/* 10609 */,/*31886*/7306/* 1060A */,/*31887*/7306/* 1060B */,/*31888*/7306/* 1060C */, /*31889*/7306/* 1060D */,/*31890*/7306/* 1060E */,/*31891*/7306/* 1060F */,/*31892*/7306/* 10610 */, /*31893*/7306/* 10611 */,/*31894*/7306/* 10612 */,/*31895*/7306/* 10613 */,/*31896*/7306/* 10614 */, /*31897*/7306/* 10615 */,/*31898*/7306/* 10616 */,/*31899*/7306/* 10617 */,/*31900*/7306/* 10618 */, /*31901*/7306/* 10619 */,/*31902*/7306/* 1061A */,/*31903*/7306/* 1061B */,/*31904*/7306/* 1061C */, /*31905*/7306/* 1061D */,/*31906*/7306/* 1061E */,/*31907*/7306/* 1061F */,/*31908*/7306/* 10620 */, /*31909*/7306/* 10621 */,/*31910*/7306/* 10622 */,/*31911*/7306/* 10623 */,/*31912*/7306/* 10624 */, /*31913*/7306/* 10625 */,/*31914*/7306/* 10626 */,/*31915*/7306/* 10627 */,/*31916*/7306/* 10628 */, /*31917*/7306/* 10629 */,/*31918*/7306/* 1062A */,/*31919*/7306/* 1062B */,/*31920*/7306/* 1062C */, /*31921*/7306/* 1062D */,/*31922*/7306/* 1062E */,/*31923*/7306/* 1062F */,/*31924*/7306/* 10630 */, /*31925*/7306/* 10631 */,/*31926*/7306/* 10632 */,/*31927*/7306/* 10633 */,/*31928*/7306/* 10634 */, /*31929*/7306/* 10635 */,/*31930*/7306/* 10636 */,/*31931*/7306/* 10637 */,/*31932*/7306/* 10638 */, /*31933*/7306/* 10639 */,/*31934*/7306/* 1063A */,/*31935*/7306/* 1063B */,/*31936*/7306/* 1063C */, /*31937*/7306/* 1063D */,/*31938*/7306/* 1063E */,/*31939*/7306/* 1063F */,/*31940*/7306/* 10640 */, /*31941*/7306/* 10641 */,/*31942*/7306/* 10642 */,/*31943*/7306/* 10643 */,/*31944*/7306/* 10644 */, /*31945*/7306/* 10645 */,/*31946*/7306/* 10646 */,/*31947*/7306/* 10647 */,/*31948*/7306/* 10648 */, /*31949*/7306/* 10649 */,/*31950*/7306/* 1064A */,/*31951*/7306/* 1064B */,/*31952*/7306/* 1064C */, /*31953*/7306/* 1064D */,/*31954*/7306/* 1064E */,/*31955*/7306/* 1064F */,/*31956*/7306/* 10650 */, /*31957*/7306/* 10651 */,/*31958*/7306/* 10652 */,/*31959*/7306/* 10653 */,/*31960*/7306/* 10654 */, /*31961*/7306/* 10655 */,/*31962*/7306/* 10656 */,/*31963*/7306/* 10657 */,/*31964*/7306/* 10658 */, /*31965*/7306/* 10659 */,/*31966*/7306/* 1065A */,/*31967*/7306/* 1065B */,/*31968*/7306/* 1065C */, /*31969*/7306/* 1065D */,/*31970*/7306/* 1065E */,/*31971*/7306/* 1065F */,/*31972*/7306/* 10660 */, /*31973*/7306/* 10661 */,/*31974*/7306/* 10662 */,/*31975*/7306/* 10663 */,/*31976*/7306/* 10664 */, /*31977*/7306/* 10665 */,/*31978*/7306/* 10666 */,/*31979*/7306/* 10667 */,/*31980*/7306/* 10668 */, /*31981*/7306/* 10669 */,/*31982*/7306/* 1066A */,/*31983*/7306/* 1066B */,/*31984*/7306/* 1066C */, /*31985*/7306/* 1066D */,/*31986*/7306/* 1066E */,/*31987*/7306/* 1066F */,/*31988*/7306/* 10670 */, /*31989*/7306/* 10671 */,/*31990*/7306/* 10672 */,/*31991*/7306/* 10673 */,/*31992*/7306/* 10674 */, /*31993*/7306/* 10675 */,/*31994*/7306/* 10676 */,/*31995*/7306/* 10677 */,/*31996*/7306/* 10678 */, /*31997*/7306/* 10679 */,/*31998*/7306/* 1067A */,/*31999*/7306/* 1067B */,/*32000*/7306/* 1067C */, /*32001*/7306/* 1067D */,/*32002*/7306/* 1067E */,/*32003*/7306/* 1067F */,/*32004*/7306/* 10680 */, /*32005*/7306/* 10681 */,/*32006*/7306/* 10682 */,/*32007*/7306/* 10683 */,/*32008*/7306/* 10684 */, /*32009*/7306/* 10685 */,/*32010*/7306/* 10686 */,/*32011*/7306/* 10687 */,/*32012*/7306/* 10688 */, /*32013*/7306/* 10689 */,/*32014*/7306/* 1068A */,/*32015*/7306/* 1068B */,/*32016*/7306/* 1068C */, /*32017*/7306/* 1068D */,/*32018*/7306/* 1068E */,/*32019*/7306/* 1068F */,/*32020*/7306/* 10690 */, /*32021*/7306/* 10691 */,/*32022*/7306/* 10692 */,/*32023*/7306/* 10693 */,/*32024*/7306/* 10694 */, /*32025*/7306/* 10695 */,/*32026*/7306/* 10696 */,/*32027*/7306/* 10697 */,/*32028*/7306/* 10698 */, /*32029*/7306/* 10699 */,/*32030*/7306/* 1069A */,/*32031*/7306/* 1069B */,/*32032*/7306/* 1069C */, /*32033*/7306/* 1069D */,/*32034*/7306/* 1069E */,/*32035*/7306/* 1069F */,/*32036*/7306/* 106A0 */, /*32037*/7306/* 106A1 */,/*32038*/7306/* 106A2 */,/*32039*/7306/* 106A3 */,/*32040*/7306/* 106A4 */, /*32041*/7306/* 106A5 */,/*32042*/7306/* 106A6 */,/*32043*/7306/* 106A7 */,/*32044*/7306/* 106A8 */, /*32045*/7306/* 106A9 */,/*32046*/7306/* 106AA */,/*32047*/7306/* 106AB */,/*32048*/7306/* 106AC */, /*32049*/7306/* 106AD */,/*32050*/7306/* 106AE */,/*32051*/7306/* 106AF */,/*32052*/7306/* 106B0 */, /*32053*/7306/* 106B1 */,/*32054*/7306/* 106B2 */,/*32055*/7306/* 106B3 */,/*32056*/7306/* 106B4 */, /*32057*/7306/* 106B5 */,/*32058*/7306/* 106B6 */,/*32059*/7306/* 106B7 */,/*32060*/7306/* 106B8 */, /*32061*/7306/* 106B9 */,/*32062*/7306/* 106BA */,/*32063*/7306/* 106BB */,/*32064*/7306/* 106BC */, /*32065*/7306/* 106BD */,/*32066*/7306/* 106BE */,/*32067*/7306/* 106BF */,/*32068*/7306/* 106C0 */, /*32069*/7306/* 106C1 */,/*32070*/7306/* 106C2 */,/*32071*/7306/* 106C3 */,/*32072*/7306/* 106C4 */, /*32073*/7306/* 106C5 */,/*32074*/7306/* 106C6 */,/*32075*/7306/* 106C7 */,/*32076*/7306/* 106C8 */, /*32077*/7306/* 106C9 */,/*32078*/7306/* 106CA */,/*32079*/7306/* 106CB */,/*32080*/7306/* 106CC */, /*32081*/7306/* 106CD */,/*32082*/7306/* 106CE */,/*32083*/7306/* 106CF */,/*32084*/7306/* 106D0 */, /*32085*/7306/* 106D1 */,/*32086*/7306/* 106D2 */,/*32087*/7306/* 106D3 */,/*32088*/7306/* 106D4 */, /*32089*/7306/* 106D5 */,/*32090*/7306/* 106D6 */,/*32091*/7306/* 106D7 */,/*32092*/7306/* 106D8 */, /*32093*/7306/* 106D9 */,/*32094*/7306/* 106DA */,/*32095*/7306/* 106DB */,/*32096*/7306/* 106DC */, /*32097*/7306/* 106DD */,/*32098*/7306/* 106DE */,/*32099*/7306/* 106DF */,/*32100*/7306/* 106E0 */, /*32101*/7306/* 106E1 */,/*32102*/7306/* 106E2 */,/*32103*/7306/* 106E3 */,/*32104*/7306/* 106E4 */, /*32105*/7306/* 106E5 */,/*32106*/7306/* 106E6 */,/*32107*/7306/* 106E7 */,/*32108*/7306/* 106E8 */, /*32109*/7306/* 106E9 */,/*32110*/7306/* 106EA */,/*32111*/7306/* 106EB */,/*32112*/7306/* 106EC */, /*32113*/7306/* 106ED */,/*32114*/7306/* 106EE */,/*32115*/7306/* 106EF */,/*32116*/7306/* 106F0 */, /*32117*/7306/* 106F1 */,/*32118*/7306/* 106F2 */,/*32119*/7306/* 106F3 */,/*32120*/7306/* 106F4 */, /*32121*/7306/* 106F5 */,/*32122*/7306/* 106F6 */,/*32123*/7306/* 106F7 */,/*32124*/7306/* 106F8 */, /*32125*/7306/* 106F9 */,/*32126*/7306/* 106FA */,/*32127*/7306/* 106FB */,/*32128*/7306/* 106FC */, /*32129*/7306/* 106FD */,/*32130*/7306/* 106FE */,/*32131*/7306/* 106FF */,/*32132*/7306/* 10700 */, /*32133*/7306/* 10701 */,/*32134*/7306/* 10702 */,/*32135*/7306/* 10703 */,/*32136*/7306/* 10704 */, /*32137*/7306/* 10705 */,/*32138*/7306/* 10706 */,/*32139*/7306/* 10707 */,/*32140*/7306/* 10708 */, /*32141*/7306/* 10709 */,/*32142*/7306/* 1070A */,/*32143*/7306/* 1070B */,/*32144*/7306/* 1070C */, /*32145*/7306/* 1070D */,/*32146*/7306/* 1070E */,/*32147*/7306/* 1070F */,/*32148*/7306/* 10710 */, /*32149*/7306/* 10711 */,/*32150*/7306/* 10712 */,/*32151*/7306/* 10713 */,/*32152*/7306/* 10714 */, /*32153*/7306/* 10715 */,/*32154*/7306/* 10716 */,/*32155*/7306/* 10717 */,/*32156*/7306/* 10718 */, /*32157*/7306/* 10719 */,/*32158*/7306/* 1071A */,/*32159*/7306/* 1071B */,/*32160*/7306/* 1071C */, /*32161*/7306/* 1071D */,/*32162*/7306/* 1071E */,/*32163*/7306/* 1071F */,/*32164*/7306/* 10720 */, /*32165*/7306/* 10721 */,/*32166*/7306/* 10722 */,/*32167*/7306/* 10723 */,/*32168*/7306/* 10724 */, /*32169*/7306/* 10725 */,/*32170*/7306/* 10726 */,/*32171*/7306/* 10727 */,/*32172*/7306/* 10728 */, /*32173*/7306/* 10729 */,/*32174*/7306/* 1072A */,/*32175*/7306/* 1072B */,/*32176*/7306/* 1072C */, /*32177*/7306/* 1072D */,/*32178*/7306/* 1072E */,/*32179*/7306/* 1072F */,/*32180*/7306/* 10730 */, /*32181*/7306/* 10731 */,/*32182*/7306/* 10732 */,/*32183*/7306/* 10733 */,/*32184*/7306/* 10734 */, /*32185*/7306/* 10735 */,/*32186*/7306/* 10736 */,0,0,0,0,0,0,0,0,0,/*32196*/7306/* 10740 */,/*32197*/7306/* 10741 */, /*32198*/7306/* 10742 */,/*32199*/7306/* 10743 */,/*32200*/7306/* 10744 */,/*32201*/7306/* 10745 */, /*32202*/7306/* 10746 */,/*32203*/7306/* 10747 */,/*32204*/7306/* 10748 */,/*32205*/7306/* 10749 */, /*32206*/7306/* 1074A */,/*32207*/7306/* 1074B */,/*32208*/7306/* 1074C */,/*32209*/7306/* 1074D */, /*32210*/7306/* 1074E */,/*32211*/7306/* 1074F */,/*32212*/7306/* 10750 */,/*32213*/7306/* 10751 */, /*32214*/7306/* 10752 */,/*32215*/7306/* 10753 */,/*32216*/7306/* 10754 */,/*32217*/7306/* 10755 */,0,0,0,0,0,0,0,0,0,0, /*32228*/7306/* 10760 */,/*32229*/7306/* 10761 */,/*32230*/7306/* 10762 */,/*32231*/7306/* 10763 */, /*32232*/7306/* 10764 */,/*32233*/7306/* 10765 */,/*32234*/7306/* 10766 */,/*32235*/7306/* 10767 */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*32388*/7307/* 10800 */,/*32389*/7307/* 10801 */,/*32390*/7307/* 10802 */, /*32391*/7307/* 10803 */,/*32392*/7307/* 10804 */,/*32393*/7307/* 10805 */,0,0,/*32396*/7307/* 10808 */,0, /*32398*/7307/* 1080A */,/*32399*/7307/* 1080B */,/*32400*/7307/* 1080C */,/*32401*/7307/* 1080D */, /*32402*/7307/* 1080E */,/*32403*/7307/* 1080F */,/*32404*/7307/* 10810 */,/*32405*/7307/* 10811 */, /*32406*/7307/* 10812 */,/*32407*/7307/* 10813 */,/*32408*/7307/* 10814 */,/*32409*/7307/* 10815 */, /*32410*/7307/* 10816 */,/*32411*/7307/* 10817 */,/*32412*/7307/* 10818 */,/*32413*/7307/* 10819 */, /*32414*/7307/* 1081A */,/*32415*/7307/* 1081B */,/*32416*/7307/* 1081C */,/*32417*/7307/* 1081D */, /*32418*/7307/* 1081E */,/*32419*/7307/* 1081F */,/*32420*/7307/* 10820 */,/*32421*/7307/* 10821 */, /*32422*/7307/* 10822 */,/*32423*/7307/* 10823 */,/*32424*/7307/* 10824 */,/*32425*/7307/* 10825 */, /*32426*/7307/* 10826 */,/*32427*/7307/* 10827 */,/*32428*/7307/* 10828 */,/*32429*/7307/* 10829 */, /*32430*/7307/* 1082A */,/*32431*/7307/* 1082B */,/*32432*/7307/* 1082C */,/*32433*/7307/* 1082D */, /*32434*/7307/* 1082E */,/*32435*/7307/* 1082F */,/*32436*/7307/* 10830 */,/*32437*/7307/* 10831 */, /*32438*/7307/* 10832 */,/*32439*/7307/* 10833 */,/*32440*/7307/* 10834 */,/*32441*/7307/* 10835 */,0, /*32443*/7307/* 10837 */,/*32444*/7307/* 10838 */,0,0,0,/*32448*/7307/* 1083C */,0,0,/*32451*/7307/* 1083F */, /*32452*/7308/* 10840 */,/*32453*/7308/* 10841 */,/*32454*/7308/* 10842 */,/*32455*/7308/* 10843 */, /*32456*/7308/* 10844 */,/*32457*/7308/* 10845 */,/*32458*/7308/* 10846 */,/*32459*/7308/* 10847 */, /*32460*/7308/* 10848 */,/*32461*/7308/* 10849 */,/*32462*/7308/* 1084A */,/*32463*/7308/* 1084B */, /*32464*/7308/* 1084C */,/*32465*/7308/* 1084D */,/*32466*/7308/* 1084E */,/*32467*/7308/* 1084F */, /*32468*/7308/* 10850 */,/*32469*/7308/* 10851 */,/*32470*/7308/* 10852 */,/*32471*/7308/* 10853 */, /*32472*/7308/* 10854 */,/*32473*/7308/* 10855 */,0,/*32475*/7309/* 10857 */,/*32476*/7310/* 10858 */, /*32477*/7311/* 10859 */,/*32478*/7312/* 1085A */,/*32479*/7313/* 1085B */,/*32480*/7314/* 1085C */, /*32481*/7315/* 1085D */,/*32482*/7316/* 1085E */,/*32483*/7317/* 1085F */,/*32484*/7318/* 10860 */, /*32485*/7318/* 10861 */,/*32486*/7318/* 10862 */,/*32487*/7318/* 10863 */,/*32488*/7318/* 10864 */, /*32489*/7318/* 10865 */,/*32490*/7318/* 10866 */,/*32491*/7318/* 10867 */,/*32492*/7318/* 10868 */, /*32493*/7318/* 10869 */,/*32494*/7318/* 1086A */,/*32495*/7318/* 1086B */,/*32496*/7318/* 1086C */, /*32497*/7318/* 1086D */,/*32498*/7318/* 1086E */,/*32499*/7318/* 1086F */,/*32500*/7318/* 10870 */, /*32501*/7318/* 10871 */,/*32502*/7318/* 10872 */,/*32503*/7318/* 10873 */,/*32504*/7318/* 10874 */, /*32505*/7318/* 10875 */,/*32506*/7318/* 10876 */,/*32507*/7319/* 10877 */,/*32508*/7319/* 10878 */, /*32509*/7320/* 10879 */,/*32510*/7321/* 1087A */,/*32511*/7322/* 1087B */,/*32512*/7323/* 1087C */, /*32513*/7324/* 1087D */,/*32514*/7325/* 1087E */,/*32515*/7326/* 1087F */,/*32516*/7327/* 10880 */, /*32517*/7327/* 10881 */,/*32518*/7327/* 10882 */,/*32519*/7327/* 10883 */,/*32520*/7327/* 10884 */, /*32521*/7327/* 10885 */,/*32522*/7327/* 10886 */,/*32523*/7327/* 10887 */,/*32524*/7327/* 10888 */, /*32525*/7327/* 10889 */,/*32526*/7327/* 1088A */,/*32527*/7327/* 1088B */,/*32528*/7327/* 1088C */, /*32529*/7327/* 1088D */,/*32530*/7327/* 1088E */,/*32531*/7327/* 1088F */,/*32532*/7327/* 10890 */, /*32533*/7327/* 10891 */,/*32534*/7327/* 10892 */,/*32535*/7327/* 10893 */,/*32536*/7327/* 10894 */, /*32537*/7327/* 10895 */,/*32538*/7327/* 10896 */,/*32539*/7327/* 10897 */,/*32540*/7327/* 10898 */, /*32541*/7327/* 10899 */,/*32542*/7327/* 1089A */,/*32543*/7327/* 1089B */,/*32544*/7327/* 1089C */, /*32545*/7327/* 1089D */,/*32546*/7327/* 1089E */,0,0,0,0,0,0,0,0,/*32555*/7328/* 108A7 */,/*32556*/7329/* 108A8 */, /*32557*/7330/* 108A9 */,/*32558*/7331/* 108AA */,/*32559*/7331/* 108AB */,/*32560*/7332/* 108AC */, /*32561*/7333/* 108AD */,/*32562*/7334/* 108AE */,/*32563*/7335/* 108AF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*32612*/7336/* 108E0 */,/*32613*/7336/* 108E1 */, /*32614*/7336/* 108E2 */,/*32615*/7336/* 108E3 */,/*32616*/7336/* 108E4 */,/*32617*/7336/* 108E5 */, /*32618*/7336/* 108E6 */,/*32619*/7336/* 108E7 */,/*32620*/7336/* 108E8 */,/*32621*/7336/* 108E9 */, /*32622*/7336/* 108EA */,/*32623*/7336/* 108EB */,/*32624*/7336/* 108EC */,/*32625*/7336/* 108ED */, /*32626*/7336/* 108EE */,/*32627*/7336/* 108EF */,/*32628*/7336/* 108F0 */,/*32629*/7336/* 108F1 */, /*32630*/7336/* 108F2 */,0,/*32632*/7336/* 108F4 */,/*32633*/7336/* 108F5 */,0,0,0,0,0,/*32639*/7337/* 108FB */, /*32640*/7338/* 108FC */,/*32641*/7339/* 108FD */,/*32642*/7340/* 108FE */,/*32643*/7341/* 108FF */, /*32644*/7342/* 10900 */,/*32645*/7342/* 10901 */,/*32646*/7342/* 10902 */,/*32647*/7342/* 10903 */, /*32648*/7342/* 10904 */,/*32649*/7342/* 10905 */,/*32650*/7342/* 10906 */,/*32651*/7342/* 10907 */, /*32652*/7342/* 10908 */,/*32653*/7342/* 10909 */,/*32654*/7342/* 1090A */,/*32655*/7342/* 1090B */, /*32656*/7342/* 1090C */,/*32657*/7342/* 1090D */,/*32658*/7342/* 1090E */,/*32659*/7342/* 1090F */, /*32660*/7342/* 10910 */,/*32661*/7342/* 10911 */,/*32662*/7342/* 10912 */,/*32663*/7342/* 10913 */, /*32664*/7342/* 10914 */,/*32665*/7342/* 10915 */,/*32666*/7343/* 10916 */,/*32667*/7344/* 10917 */, /*32668*/7345/* 10918 */,/*32669*/7346/* 10919 */,/*32670*/7347/* 1091A */,/*32671*/7348/* 1091B */,0,0,0, /*32675*/7349/* 1091F */,/*32676*/7350/* 10920 */,/*32677*/7350/* 10921 */,/*32678*/7350/* 10922 */, /*32679*/7350/* 10923 */,/*32680*/7350/* 10924 */,/*32681*/7350/* 10925 */,/*32682*/7350/* 10926 */, /*32683*/7350/* 10927 */,/*32684*/7350/* 10928 */,/*32685*/7350/* 10929 */,/*32686*/7350/* 1092A */, /*32687*/7350/* 1092B */,/*32688*/7350/* 1092C */,/*32689*/7350/* 1092D */,/*32690*/7350/* 1092E */, /*32691*/7350/* 1092F */,/*32692*/7350/* 10930 */,/*32693*/7350/* 10931 */,/*32694*/7350/* 10932 */, /*32695*/7350/* 10933 */,/*32696*/7350/* 10934 */,/*32697*/7350/* 10935 */,/*32698*/7350/* 10936 */, /*32699*/7350/* 10937 */,/*32700*/7350/* 10938 */,/*32701*/7350/* 10939 */,0,0,0,0,0,/*32707*/7351/* 1093F */,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*32772*/7352/* 10980 */,/*32773*/7352/* 10981 */,/*32774*/7352/* 10982 */,/*32775*/7352/* 10983 */, /*32776*/7352/* 10984 */,/*32777*/7352/* 10985 */,/*32778*/7352/* 10986 */,/*32779*/7352/* 10987 */, /*32780*/7352/* 10988 */,/*32781*/7352/* 10989 */,/*32782*/7352/* 1098A */,/*32783*/7352/* 1098B */, /*32784*/7352/* 1098C */,/*32785*/7352/* 1098D */,/*32786*/7352/* 1098E */,/*32787*/7352/* 1098F */, /*32788*/7352/* 10990 */,/*32789*/7352/* 10991 */,/*32790*/7352/* 10992 */,/*32791*/7352/* 10993 */, /*32792*/7352/* 10994 */,/*32793*/7352/* 10995 */,/*32794*/7352/* 10996 */,/*32795*/7352/* 10997 */, /*32796*/7352/* 10998 */,/*32797*/7352/* 10999 */,/*32798*/7352/* 1099A */,/*32799*/7352/* 1099B */, /*32800*/7352/* 1099C */,/*32801*/7352/* 1099D */,/*32802*/7352/* 1099E */,/*32803*/7352/* 1099F */, /*32804*/7353/* 109A0 */,/*32805*/7353/* 109A1 */,/*32806*/7353/* 109A2 */,/*32807*/7353/* 109A3 */, /*32808*/7353/* 109A4 */,/*32809*/7353/* 109A5 */,/*32810*/7353/* 109A6 */,/*32811*/7353/* 109A7 */, /*32812*/7353/* 109A8 */,/*32813*/7353/* 109A9 */,/*32814*/7353/* 109AA */,/*32815*/7353/* 109AB */, /*32816*/7353/* 109AC */,/*32817*/7353/* 109AD */,/*32818*/7353/* 109AE */,/*32819*/7353/* 109AF */, /*32820*/7353/* 109B0 */,/*32821*/7353/* 109B1 */,/*32822*/7353/* 109B2 */,/*32823*/7353/* 109B3 */, /*32824*/7353/* 109B4 */,/*32825*/7353/* 109B5 */,/*32826*/7353/* 109B6 */,/*32827*/7353/* 109B7 */,0,0,0,0, /*32832*/7354/* 109BC */,/*32833*/7355/* 109BD */,/*32834*/7353/* 109BE */,/*32835*/7353/* 109BF */, /*32836*/7356/* 109C0 */,/*32837*/7357/* 109C1 */,/*32838*/7358/* 109C2 */,/*32839*/7359/* 109C3 */, /*32840*/7360/* 109C4 */,/*32841*/7361/* 109C5 */,/*32842*/7362/* 109C6 */,/*32843*/7363/* 109C7 */, /*32844*/7364/* 109C8 */,/*32845*/7365/* 109C9 */,/*32846*/7366/* 109CA */,/*32847*/7367/* 109CB */, /*32848*/7368/* 109CC */,/*32849*/7369/* 109CD */,/*32850*/7370/* 109CE */,/*32851*/7371/* 109CF */,0,0, /*32854*/7372/* 109D2 */,/*32855*/7373/* 109D3 */,/*32856*/7374/* 109D4 */,/*32857*/7375/* 109D5 */, /*32858*/7376/* 109D6 */,/*32859*/7377/* 109D7 */,/*32860*/7378/* 109D8 */,/*32861*/7379/* 109D9 */, /*32862*/7380/* 109DA */,/*32863*/7381/* 109DB */,/*32864*/7382/* 109DC */,/*32865*/7383/* 109DD */, /*32866*/7384/* 109DE */,/*32867*/7385/* 109DF */,/*32868*/7386/* 109E0 */,/*32869*/7387/* 109E1 */, /*32870*/7388/* 109E2 */,/*32871*/7389/* 109E3 */,/*32872*/7390/* 109E4 */,/*32873*/7391/* 109E5 */, /*32874*/7392/* 109E6 */,/*32875*/7393/* 109E7 */,/*32876*/7394/* 109E8 */,/*32877*/7395/* 109E9 */, /*32878*/7396/* 109EA */,/*32879*/7397/* 109EB */,/*32880*/7398/* 109EC */,/*32881*/7399/* 109ED */, /*32882*/7400/* 109EE */,/*32883*/7401/* 109EF */,/*32884*/7402/* 109F0 */,/*32885*/7403/* 109F1 */, /*32886*/7404/* 109F2 */,/*32887*/7405/* 109F3 */,/*32888*/7406/* 109F4 */,/*32889*/7407/* 109F5 */, /*32890*/7408/* 109F6 */,/*32891*/7409/* 109F7 */,/*32892*/7410/* 109F8 */,/*32893*/7411/* 109F9 */, /*32894*/7412/* 109FA */,/*32895*/7355/* 109FB */,/*32896*/7413/* 109FC */,/*32897*/7414/* 109FD */, /*32898*/7415/* 109FE */,/*32899*/7416/* 109FF */,/*32900*/7417/* 10A00 */,/*32901*/7418/* 10A01 */, /*32902*/7418/* 10A02 */,/*32903*/7418/* 10A03 */,0,/*32905*/7418/* 10A05 */,/*32906*/7418/* 10A06 */,0,0,0,0,0, /*32912*/7418/* 10A0C */,/*32913*/7419/* 10A0D */,/*32914*/7418/* 10A0E */,/*32915*/7420/* 10A0F */, /*32916*/7417/* 10A10 */,/*32917*/7417/* 10A11 */,/*32918*/7417/* 10A12 */,/*32919*/7417/* 10A13 */,0, /*32921*/7417/* 10A15 */,/*32922*/7417/* 10A16 */,/*32923*/7417/* 10A17 */,0,/*32925*/7417/* 10A19 */, /*32926*/7417/* 10A1A */,/*32927*/7417/* 10A1B */,/*32928*/7417/* 10A1C */,/*32929*/7417/* 10A1D */, /*32930*/7417/* 10A1E */,/*32931*/7417/* 10A1F */,/*32932*/7417/* 10A20 */,/*32933*/7417/* 10A21 */, /*32934*/7417/* 10A22 */,/*32935*/7417/* 10A23 */,/*32936*/7417/* 10A24 */,/*32937*/7417/* 10A25 */, /*32938*/7417/* 10A26 */,/*32939*/7417/* 10A27 */,/*32940*/7417/* 10A28 */,/*32941*/7417/* 10A29 */, /*32942*/7417/* 10A2A */,/*32943*/7417/* 10A2B */,/*32944*/7417/* 10A2C */,/*32945*/7417/* 10A2D */, /*32946*/7417/* 10A2E */,/*32947*/7417/* 10A2F */,/*32948*/7417/* 10A30 */,/*32949*/7417/* 10A31 */, /*32950*/7417/* 10A32 */,/*32951*/7417/* 10A33 */,0,0,0,0,/*32956*/7421/* 10A38 */,/*32957*/7422/* 10A39 */, /*32958*/7423/* 10A3A */,0,0,0,0,/*32963*/7424/* 10A3F */,/*32964*/7425/* 10A40 */,/*32965*/7426/* 10A41 */, /*32966*/7427/* 10A42 */,/*32967*/7428/* 10A43 */,/*32968*/7429/* 10A44 */,/*32969*/7430/* 10A45 */, /*32970*/7431/* 10A46 */,/*32971*/7432/* 10A47 */,0,0,0,0,0,0,0,0,/*32980*/7433/* 10A50 */,/*32981*/7433/* 10A51 */, /*32982*/7433/* 10A52 */,/*32983*/7433/* 10A53 */,/*32984*/7433/* 10A54 */,/*32985*/7433/* 10A55 */, /*32986*/7434/* 10A56 */,/*32987*/7434/* 10A57 */,/*32988*/7433/* 10A58 */,0,0,0,0,0,0,0,/*32996*/7435/* 10A60 */, /*32997*/7435/* 10A61 */,/*32998*/7435/* 10A62 */,/*32999*/7435/* 10A63 */,/*33000*/7435/* 10A64 */, /*33001*/7435/* 10A65 */,/*33002*/7435/* 10A66 */,/*33003*/7435/* 10A67 */,/*33004*/7435/* 10A68 */, /*33005*/7435/* 10A69 */,/*33006*/7435/* 10A6A */,/*33007*/7435/* 10A6B */,/*33008*/7435/* 10A6C */, /*33009*/7435/* 10A6D */,/*33010*/7435/* 10A6E */,/*33011*/7435/* 10A6F */,/*33012*/7435/* 10A70 */, /*33013*/7435/* 10A71 */,/*33014*/7435/* 10A72 */,/*33015*/7435/* 10A73 */,/*33016*/7435/* 10A74 */, /*33017*/7435/* 10A75 */,/*33018*/7435/* 10A76 */,/*33019*/7435/* 10A77 */,/*33020*/7435/* 10A78 */, /*33021*/7435/* 10A79 */,/*33022*/7435/* 10A7A */,/*33023*/7435/* 10A7B */,/*33024*/7435/* 10A7C */, /*33025*/7436/* 10A7D */,/*33026*/7437/* 10A7E */,/*33027*/7438/* 10A7F */,/*33028*/7439/* 10A80 */, /*33029*/7439/* 10A81 */,/*33030*/7439/* 10A82 */,/*33031*/7439/* 10A83 */,/*33032*/7439/* 10A84 */, /*33033*/7439/* 10A85 */,/*33034*/7439/* 10A86 */,/*33035*/7439/* 10A87 */,/*33036*/7439/* 10A88 */, /*33037*/7439/* 10A89 */,/*33038*/7439/* 10A8A */,/*33039*/7439/* 10A8B */,/*33040*/7439/* 10A8C */, /*33041*/7439/* 10A8D */,/*33042*/7439/* 10A8E */,/*33043*/7439/* 10A8F */,/*33044*/7439/* 10A90 */, /*33045*/7439/* 10A91 */,/*33046*/7439/* 10A92 */,/*33047*/7439/* 10A93 */,/*33048*/7439/* 10A94 */, /*33049*/7439/* 10A95 */,/*33050*/7439/* 10A96 */,/*33051*/7439/* 10A97 */,/*33052*/7439/* 10A98 */, /*33053*/7439/* 10A99 */,/*33054*/7439/* 10A9A */,/*33055*/7439/* 10A9B */,/*33056*/7439/* 10A9C */, /*33057*/7440/* 10A9D */,/*33058*/7441/* 10A9E */,/*33059*/7442/* 10A9F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,/*33092*/7443/* 10AC0 */,/*33093*/7444/* 10AC1 */,/*33094*/7444/* 10AC2 */,/*33095*/7445/* 10AC3 */, /*33096*/7445/* 10AC4 */,/*33097*/7446/* 10AC5 */,/*33098*/7447/* 10AC6 */,/*33099*/7448/* 10AC7 */, /*33100*/7449/* 10AC8 */,/*33101*/7450/* 10AC9 */,/*33102*/7450/* 10ACA */,/*33103*/7447/* 10ACB */, /*33104*/7447/* 10ACC */,/*33105*/7451/* 10ACD */,/*33106*/7452/* 10ACE */,/*33107*/7453/* 10ACF */, /*33108*/7454/* 10AD0 */,/*33109*/7454/* 10AD1 */,/*33110*/7454/* 10AD2 */,/*33111*/7455/* 10AD3 */, /*33112*/7456/* 10AD4 */,/*33113*/7457/* 10AD5 */,/*33114*/7458/* 10AD6 */,/*33115*/7459/* 10AD7 */, /*33116*/7460/* 10AD8 */,/*33117*/7461/* 10AD9 */,/*33118*/7461/* 10ADA */,/*33119*/7462/* 10ADB */, /*33120*/7462/* 10ADC */,/*33121*/7463/* 10ADD */,/*33122*/7464/* 10ADE */,/*33123*/7464/* 10ADF */, /*33124*/7464/* 10AE0 */,/*33125*/7465/* 10AE1 */,/*33126*/7447/* 10AE2 */,/*33127*/7447/* 10AE3 */, /*33128*/7466/* 10AE4 */,/*33129*/7467/* 10AE5 */,/*33130*/7468/* 10AE6 */,0,0,0,0,/*33135*/7469/* 10AEB */, /*33136*/7470/* 10AEC */,/*33137*/7471/* 10AED */,/*33138*/7472/* 10AEE */,/*33139*/7473/* 10AEF */, /*33140*/7474/* 10AF0 */,/*33141*/7474/* 10AF1 */,/*33142*/7474/* 10AF2 */,/*33143*/7474/* 10AF3 */, /*33144*/7474/* 10AF4 */,/*33145*/7474/* 10AF5 */,/*33146*/7475/* 10AF6 */,0,0,0,0,0,0,0,0,0,/*33156*/7476/* 10B00 */, /*33157*/7476/* 10B01 */,/*33158*/7476/* 10B02 */,/*33159*/7476/* 10B03 */,/*33160*/7476/* 10B04 */, /*33161*/7476/* 10B05 */,/*33162*/7476/* 10B06 */,/*33163*/7476/* 10B07 */,/*33164*/7476/* 10B08 */, /*33165*/7476/* 10B09 */,/*33166*/7476/* 10B0A */,/*33167*/7476/* 10B0B */,/*33168*/7476/* 10B0C */, /*33169*/7476/* 10B0D */,/*33170*/7476/* 10B0E */,/*33171*/7476/* 10B0F */,/*33172*/7476/* 10B10 */, /*33173*/7476/* 10B11 */,/*33174*/7476/* 10B12 */,/*33175*/7476/* 10B13 */,/*33176*/7476/* 10B14 */, /*33177*/7476/* 10B15 */,/*33178*/7476/* 10B16 */,/*33179*/7476/* 10B17 */,/*33180*/7476/* 10B18 */, /*33181*/7476/* 10B19 */,/*33182*/7476/* 10B1A */,/*33183*/7476/* 10B1B */,/*33184*/7476/* 10B1C */, /*33185*/7476/* 10B1D */,/*33186*/7476/* 10B1E */,/*33187*/7476/* 10B1F */,/*33188*/7476/* 10B20 */, /*33189*/7476/* 10B21 */,/*33190*/7476/* 10B22 */,/*33191*/7476/* 10B23 */,/*33192*/7476/* 10B24 */, /*33193*/7476/* 10B25 */,/*33194*/7476/* 10B26 */,/*33195*/7476/* 10B27 */,/*33196*/7476/* 10B28 */, /*33197*/7476/* 10B29 */,/*33198*/7476/* 10B2A */,/*33199*/7476/* 10B2B */,/*33200*/7476/* 10B2C */, /*33201*/7476/* 10B2D */,/*33202*/7476/* 10B2E */,/*33203*/7476/* 10B2F */,/*33204*/7476/* 10B30 */, /*33205*/7476/* 10B31 */,/*33206*/7476/* 10B32 */,/*33207*/7476/* 10B33 */,/*33208*/7476/* 10B34 */, /*33209*/7476/* 10B35 */,0,0,0,/*33213*/7477/* 10B39 */,/*33214*/7478/* 10B3A */,/*33215*/7478/* 10B3B */, /*33216*/7478/* 10B3C */,/*33217*/7478/* 10B3D */,/*33218*/7478/* 10B3E */,/*33219*/7478/* 10B3F */, /*33220*/7479/* 10B40 */,/*33221*/7479/* 10B41 */,/*33222*/7479/* 10B42 */,/*33223*/7479/* 10B43 */, /*33224*/7479/* 10B44 */,/*33225*/7479/* 10B45 */,/*33226*/7479/* 10B46 */,/*33227*/7479/* 10B47 */, /*33228*/7479/* 10B48 */,/*33229*/7479/* 10B49 */,/*33230*/7479/* 10B4A */,/*33231*/7479/* 10B4B */, /*33232*/7479/* 10B4C */,/*33233*/7479/* 10B4D */,/*33234*/7479/* 10B4E */,/*33235*/7479/* 10B4F */, /*33236*/7479/* 10B50 */,/*33237*/7479/* 10B51 */,/*33238*/7479/* 10B52 */,/*33239*/7479/* 10B53 */, /*33240*/7479/* 10B54 */,/*33241*/7479/* 10B55 */,0,0,/*33244*/7480/* 10B58 */,/*33245*/7481/* 10B59 */, /*33246*/7482/* 10B5A */,/*33247*/7483/* 10B5B */,/*33248*/7484/* 10B5C */,/*33249*/7485/* 10B5D */, /*33250*/7486/* 10B5E */,/*33251*/7487/* 10B5F */,/*33252*/7488/* 10B60 */,/*33253*/7488/* 10B61 */, /*33254*/7488/* 10B62 */,/*33255*/7488/* 10B63 */,/*33256*/7488/* 10B64 */,/*33257*/7488/* 10B65 */, /*33258*/7488/* 10B66 */,/*33259*/7488/* 10B67 */,/*33260*/7488/* 10B68 */,/*33261*/7488/* 10B69 */, /*33262*/7488/* 10B6A */,/*33263*/7488/* 10B6B */,/*33264*/7488/* 10B6C */,/*33265*/7488/* 10B6D */, /*33266*/7488/* 10B6E */,/*33267*/7488/* 10B6F */,/*33268*/7488/* 10B70 */,/*33269*/7488/* 10B71 */, /*33270*/7488/* 10B72 */,0,0,0,0,0,/*33276*/7489/* 10B78 */,/*33277*/7490/* 10B79 */,/*33278*/7491/* 10B7A */, /*33279*/7492/* 10B7B */,/*33280*/7493/* 10B7C */,/*33281*/7494/* 10B7D */,/*33282*/7495/* 10B7E */, /*33283*/7496/* 10B7F */,/*33284*/7497/* 10B80 */,/*33285*/7498/* 10B81 */,/*33286*/7497/* 10B82 */, /*33287*/7498/* 10B83 */,/*33288*/7498/* 10B84 */,/*33289*/7498/* 10B85 */,/*33290*/7497/* 10B86 */, /*33291*/7497/* 10B87 */,/*33292*/7497/* 10B88 */,/*33293*/7498/* 10B89 */,/*33294*/7497/* 10B8A */, /*33295*/7497/* 10B8B */,/*33296*/7498/* 10B8C */,/*33297*/7497/* 10B8D */,/*33298*/7498/* 10B8E */, /*33299*/7498/* 10B8F */,/*33300*/7497/* 10B90 */,/*33301*/7498/* 10B91 */,0,0,0,0,0,0,0,/*33309*/7499/* 10B99 */, /*33310*/7499/* 10B9A */,/*33311*/7499/* 10B9B */,/*33312*/7499/* 10B9C */,0,0,0,0,0,0,0,0,0,0,0,0, /*33325*/7500/* 10BA9 */,/*33326*/7501/* 10BAA */,/*33327*/7502/* 10BAB */,/*33328*/7503/* 10BAC */, /*33329*/7504/* 10BAD */,/*33330*/7505/* 10BAE */,/*33331*/7506/* 10BAF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*33412*/7507/* 10C00 */,/*33413*/7507/* 10C01 */,/*33414*/7507/* 10C02 */,/*33415*/7507/* 10C03 */, /*33416*/7507/* 10C04 */,/*33417*/7507/* 10C05 */,/*33418*/7507/* 10C06 */,/*33419*/7507/* 10C07 */, /*33420*/7507/* 10C08 */,/*33421*/7507/* 10C09 */,/*33422*/7507/* 10C0A */,/*33423*/7507/* 10C0B */, /*33424*/7507/* 10C0C */,/*33425*/7507/* 10C0D */,/*33426*/7507/* 10C0E */,/*33427*/7507/* 10C0F */, /*33428*/7507/* 10C10 */,/*33429*/7507/* 10C11 */,/*33430*/7507/* 10C12 */,/*33431*/7507/* 10C13 */, /*33432*/7507/* 10C14 */,/*33433*/7507/* 10C15 */,/*33434*/7507/* 10C16 */,/*33435*/7507/* 10C17 */, /*33436*/7507/* 10C18 */,/*33437*/7507/* 10C19 */,/*33438*/7507/* 10C1A */,/*33439*/7507/* 10C1B */, /*33440*/7507/* 10C1C */,/*33441*/7507/* 10C1D */,/*33442*/7507/* 10C1E */,/*33443*/7507/* 10C1F */, /*33444*/7507/* 10C20 */,/*33445*/7507/* 10C21 */,/*33446*/7507/* 10C22 */,/*33447*/7507/* 10C23 */, /*33448*/7507/* 10C24 */,/*33449*/7507/* 10C25 */,/*33450*/7507/* 10C26 */,/*33451*/7507/* 10C27 */, /*33452*/7507/* 10C28 */,/*33453*/7507/* 10C29 */,/*33454*/7507/* 10C2A */,/*33455*/7507/* 10C2B */, /*33456*/7507/* 10C2C */,/*33457*/7507/* 10C2D */,/*33458*/7507/* 10C2E */,/*33459*/7507/* 10C2F */, /*33460*/7507/* 10C30 */,/*33461*/7507/* 10C31 */,/*33462*/7507/* 10C32 */,/*33463*/7507/* 10C33 */, /*33464*/7507/* 10C34 */,/*33465*/7507/* 10C35 */,/*33466*/7507/* 10C36 */,/*33467*/7507/* 10C37 */, /*33468*/7507/* 10C38 */,/*33469*/7507/* 10C39 */,/*33470*/7507/* 10C3A */,/*33471*/7507/* 10C3B */, /*33472*/7507/* 10C3C */,/*33473*/7507/* 10C3D */,/*33474*/7507/* 10C3E */,/*33475*/7507/* 10C3F */, /*33476*/7507/* 10C40 */,/*33477*/7507/* 10C41 */,/*33478*/7507/* 10C42 */,/*33479*/7507/* 10C43 */, /*33480*/7507/* 10C44 */,/*33481*/7507/* 10C45 */,/*33482*/7507/* 10C46 */,/*33483*/7507/* 10C47 */, /*33484*/7507/* 10C48 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,/*33540*/7508/* 10C80 */,/*33541*/7509/* 10C81 */,/*33542*/7510/* 10C82 */,/*33543*/7511/* 10C83 */, /*33544*/7512/* 10C84 */,/*33545*/7513/* 10C85 */,/*33546*/7514/* 10C86 */,/*33547*/7515/* 10C87 */, /*33548*/7516/* 10C88 */,/*33549*/7517/* 10C89 */,/*33550*/7518/* 10C8A */,/*33551*/7519/* 10C8B */, /*33552*/7520/* 10C8C */,/*33553*/7521/* 10C8D */,/*33554*/7522/* 10C8E */,/*33555*/7523/* 10C8F */, /*33556*/7524/* 10C90 */,/*33557*/7525/* 10C91 */,/*33558*/7526/* 10C92 */,/*33559*/7527/* 10C93 */, /*33560*/7528/* 10C94 */,/*33561*/7529/* 10C95 */,/*33562*/7530/* 10C96 */,/*33563*/7531/* 10C97 */, /*33564*/7532/* 10C98 */,/*33565*/7533/* 10C99 */,/*33566*/7534/* 10C9A */,/*33567*/7535/* 10C9B */, /*33568*/7536/* 10C9C */,/*33569*/7537/* 10C9D */,/*33570*/7538/* 10C9E */,/*33571*/7539/* 10C9F */, /*33572*/7540/* 10CA0 */,/*33573*/7541/* 10CA1 */,/*33574*/7542/* 10CA2 */,/*33575*/7543/* 10CA3 */, /*33576*/7544/* 10CA4 */,/*33577*/7545/* 10CA5 */,/*33578*/7546/* 10CA6 */,/*33579*/7547/* 10CA7 */, /*33580*/7548/* 10CA8 */,/*33581*/7549/* 10CA9 */,/*33582*/7550/* 10CAA */,/*33583*/7551/* 10CAB */, /*33584*/7552/* 10CAC */,/*33585*/7553/* 10CAD */,/*33586*/7554/* 10CAE */,/*33587*/7555/* 10CAF */, /*33588*/7556/* 10CB0 */,/*33589*/7557/* 10CB1 */,/*33590*/7558/* 10CB2 */,0,0,0,0,0,0,0,0,0,0,0,0,0, /*33604*/7559/* 10CC0 */,/*33605*/7560/* 10CC1 */,/*33606*/7561/* 10CC2 */,/*33607*/7562/* 10CC3 */, /*33608*/7563/* 10CC4 */,/*33609*/7564/* 10CC5 */,/*33610*/7565/* 10CC6 */,/*33611*/7566/* 10CC7 */, /*33612*/7567/* 10CC8 */,/*33613*/7568/* 10CC9 */,/*33614*/7569/* 10CCA */,/*33615*/7570/* 10CCB */, /*33616*/7571/* 10CCC */,/*33617*/7572/* 10CCD */,/*33618*/7573/* 10CCE */,/*33619*/7574/* 10CCF */, /*33620*/7575/* 10CD0 */,/*33621*/7576/* 10CD1 */,/*33622*/7577/* 10CD2 */,/*33623*/7578/* 10CD3 */, /*33624*/7579/* 10CD4 */,/*33625*/7580/* 10CD5 */,/*33626*/7581/* 10CD6 */,/*33627*/7582/* 10CD7 */, /*33628*/7583/* 10CD8 */,/*33629*/7584/* 10CD9 */,/*33630*/7585/* 10CDA */,/*33631*/7586/* 10CDB */, /*33632*/7587/* 10CDC */,/*33633*/7588/* 10CDD */,/*33634*/7589/* 10CDE */,/*33635*/7590/* 10CDF */, /*33636*/7591/* 10CE0 */,/*33637*/7592/* 10CE1 */,/*33638*/7593/* 10CE2 */,/*33639*/7594/* 10CE3 */, /*33640*/7595/* 10CE4 */,/*33641*/7596/* 10CE5 */,/*33642*/7597/* 10CE6 */,/*33643*/7598/* 10CE7 */, /*33644*/7599/* 10CE8 */,/*33645*/7600/* 10CE9 */,/*33646*/7601/* 10CEA */,/*33647*/7602/* 10CEB */, /*33648*/7603/* 10CEC */,/*33649*/7604/* 10CED */,/*33650*/7605/* 10CEE */,/*33651*/7606/* 10CEF */, /*33652*/7607/* 10CF0 */,/*33653*/7608/* 10CF1 */,/*33654*/7609/* 10CF2 */,0,0,0,0,0,0,0,/*33662*/7610/* 10CFA */, /*33663*/7611/* 10CFB */,/*33664*/7612/* 10CFC */,/*33665*/7613/* 10CFD */,/*33666*/7614/* 10CFE */, /*33667*/7615/* 10CFF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,/*34020*/7616/* 10E60 */,/*34021*/7617/* 10E61 */,/*34022*/7618/* 10E62 */,/*34023*/7619/* 10E63 */, /*34024*/7620/* 10E64 */,/*34025*/7621/* 10E65 */,/*34026*/7622/* 10E66 */,/*34027*/7623/* 10E67 */, /*34028*/7624/* 10E68 */,/*34029*/7625/* 10E69 */,/*34030*/7626/* 10E6A */,/*34031*/7627/* 10E6B */, /*34032*/7628/* 10E6C */,/*34033*/7629/* 10E6D */,/*34034*/7630/* 10E6E */,/*34035*/7631/* 10E6F */, /*34036*/7632/* 10E70 */,/*34037*/7633/* 10E71 */,/*34038*/7634/* 10E72 */,/*34039*/7635/* 10E73 */, /*34040*/7636/* 10E74 */,/*34041*/7637/* 10E75 */,/*34042*/7638/* 10E76 */,/*34043*/7639/* 10E77 */, /*34044*/7640/* 10E78 */,/*34045*/7641/* 10E79 */,/*34046*/7642/* 10E7A */,/*34047*/7643/* 10E7B */, /*34048*/7644/* 10E7C */,/*34049*/7645/* 10E7D */,/*34050*/7646/* 10E7E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,/*34436*/7647/* 11000 */,/*34437*/7648/* 11001 */,/*34438*/7647/* 11002 */,/*34439*/7649/* 11003 */, /*34440*/7649/* 11004 */,/*34441*/7649/* 11005 */,/*34442*/7649/* 11006 */,/*34443*/7649/* 11007 */, /*34444*/7649/* 11008 */,/*34445*/7649/* 11009 */,/*34446*/7649/* 1100A */,/*34447*/7649/* 1100B */, /*34448*/7649/* 1100C */,/*34449*/7649/* 1100D */,/*34450*/7649/* 1100E */,/*34451*/7649/* 1100F */, /*34452*/7649/* 11010 */,/*34453*/7649/* 11011 */,/*34454*/7649/* 11012 */,/*34455*/7649/* 11013 */, /*34456*/7649/* 11014 */,/*34457*/7649/* 11015 */,/*34458*/7649/* 11016 */,/*34459*/7649/* 11017 */, /*34460*/7649/* 11018 */,/*34461*/7649/* 11019 */,/*34462*/7649/* 1101A */,/*34463*/7649/* 1101B */, /*34464*/7649/* 1101C */,/*34465*/7649/* 1101D */,/*34466*/7649/* 1101E */,/*34467*/7649/* 1101F */, /*34468*/7649/* 11020 */,/*34469*/7649/* 11021 */,/*34470*/7649/* 11022 */,/*34471*/7649/* 11023 */, /*34472*/7649/* 11024 */,/*34473*/7649/* 11025 */,/*34474*/7649/* 11026 */,/*34475*/7649/* 11027 */, /*34476*/7649/* 11028 */,/*34477*/7649/* 11029 */,/*34478*/7649/* 1102A */,/*34479*/7649/* 1102B */, /*34480*/7649/* 1102C */,/*34481*/7649/* 1102D */,/*34482*/7649/* 1102E */,/*34483*/7649/* 1102F */, /*34484*/7649/* 11030 */,/*34485*/7649/* 11031 */,/*34486*/7649/* 11032 */,/*34487*/7649/* 11033 */, /*34488*/7649/* 11034 */,/*34489*/7649/* 11035 */,/*34490*/7649/* 11036 */,/*34491*/7649/* 11037 */, /*34492*/7648/* 11038 */,/*34493*/7648/* 11039 */,/*34494*/7648/* 1103A */,/*34495*/7648/* 1103B */, /*34496*/7648/* 1103C */,/*34497*/7648/* 1103D */,/*34498*/7648/* 1103E */,/*34499*/7648/* 1103F */, /*34500*/7648/* 11040 */,/*34501*/7648/* 11041 */,/*34502*/7648/* 11042 */,/*34503*/7648/* 11043 */, /*34504*/7648/* 11044 */,/*34505*/7648/* 11045 */,/*34506*/7650/* 11046 */,/*34507*/7651/* 11047 */, /*34508*/7651/* 11048 */,/*34509*/7652/* 11049 */,/*34510*/7652/* 1104A */,/*34511*/7652/* 1104B */, /*34512*/7652/* 1104C */,/*34513*/7652/* 1104D */,0,0,0,0,/*34518*/7653/* 11052 */,/*34519*/7654/* 11053 */, /*34520*/7655/* 11054 */,/*34521*/7656/* 11055 */,/*34522*/7657/* 11056 */,/*34523*/7658/* 11057 */, /*34524*/7659/* 11058 */,/*34525*/7660/* 11059 */,/*34526*/7661/* 1105A */,/*34527*/7662/* 1105B */, /*34528*/7663/* 1105C */,/*34529*/7664/* 1105D */,/*34530*/7665/* 1105E */,/*34531*/7666/* 1105F */, /*34532*/7667/* 11060 */,/*34533*/7668/* 11061 */,/*34534*/7669/* 11062 */,/*34535*/7670/* 11063 */, /*34536*/7671/* 11064 */,/*34537*/7672/* 11065 */,/*34538*/7673/* 11066 */,/*34539*/7674/* 11067 */, /*34540*/7675/* 11068 */,/*34541*/7676/* 11069 */,/*34542*/7677/* 1106A */,/*34543*/7678/* 1106B */, /*34544*/7679/* 1106C */,/*34545*/7680/* 1106D */,/*34546*/7681/* 1106E */,/*34547*/7682/* 1106F */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,/*34563*/7683/* 1107F */,/*34564*/7684/* 11080 */,/*34565*/7684/* 11081 */,/*34566*/7685/* 11082 */, /*34567*/7686/* 11083 */,/*34568*/7686/* 11084 */,/*34569*/7686/* 11085 */,/*34570*/7686/* 11086 */, /*34571*/7686/* 11087 */,/*34572*/7686/* 11088 */,/*34573*/7686/* 11089 */,/*34574*/7686/* 1108A */, /*34575*/7686/* 1108B */,/*34576*/7686/* 1108C */,/*34577*/7686/* 1108D */,/*34578*/7686/* 1108E */, /*34579*/7686/* 1108F */,/*34580*/7686/* 11090 */,/*34581*/7686/* 11091 */,/*34582*/7686/* 11092 */, /*34583*/7686/* 11093 */,/*34584*/7686/* 11094 */,/*34585*/7686/* 11095 */,/*34586*/7686/* 11096 */, /*34587*/7686/* 11097 */,/*34588*/7686/* 11098 */,/*34589*/7686/* 11099 */,/*34590*/7687/* 1109A */, /*34591*/7686/* 1109B */,/*34592*/7688/* 1109C */,/*34593*/7686/* 1109D */,/*34594*/7686/* 1109E */, /*34595*/7686/* 1109F */,/*34596*/7686/* 110A0 */,/*34597*/7686/* 110A1 */,/*34598*/7686/* 110A2 */, /*34599*/7686/* 110A3 */,/*34600*/7686/* 110A4 */,/*34601*/7686/* 110A5 */,/*34602*/7686/* 110A6 */, /*34603*/7686/* 110A7 */,/*34604*/7686/* 110A8 */,/*34605*/7686/* 110A9 */,/*34606*/7686/* 110AA */, /*34607*/7689/* 110AB */,/*34608*/7686/* 110AC */,/*34609*/7686/* 110AD */,/*34610*/7686/* 110AE */, /*34611*/7686/* 110AF */,/*34612*/7685/* 110B0 */,/*34613*/7685/* 110B1 */,/*34614*/7685/* 110B2 */, /*34615*/7690/* 110B3 */,/*34616*/7690/* 110B4 */,/*34617*/7690/* 110B5 */,/*34618*/7690/* 110B6 */, /*34619*/7685/* 110B7 */,/*34620*/7685/* 110B8 */,/*34621*/7691/* 110B9 */,/*34622*/7692/* 110BA */, /*34623*/7693/* 110BB */,/*34624*/7693/* 110BC */,/*34625*/7694/* 110BD */,/*34626*/7695/* 110BE */, /*34627*/7695/* 110BF */,/*34628*/7695/* 110C0 */,/*34629*/7695/* 110C1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*34644*/7696/* 110D0 */,/*34645*/7696/* 110D1 */,/*34646*/7696/* 110D2 */,/*34647*/7696/* 110D3 */, /*34648*/7696/* 110D4 */,/*34649*/7696/* 110D5 */,/*34650*/7696/* 110D6 */,/*34651*/7696/* 110D7 */, /*34652*/7696/* 110D8 */,/*34653*/7696/* 110D9 */,/*34654*/7696/* 110DA */,/*34655*/7696/* 110DB */, /*34656*/7696/* 110DC */,/*34657*/7696/* 110DD */,/*34658*/7696/* 110DE */,/*34659*/7696/* 110DF */, /*34660*/7696/* 110E0 */,/*34661*/7696/* 110E1 */,/*34662*/7696/* 110E2 */,/*34663*/7696/* 110E3 */, /*34664*/7696/* 110E4 */,/*34665*/7696/* 110E5 */,/*34666*/7696/* 110E6 */,/*34667*/7696/* 110E7 */, /*34668*/7696/* 110E8 */,0,0,0,0,0,0,0,/*34676*/7697/* 110F0 */,/*34677*/7698/* 110F1 */,/*34678*/7699/* 110F2 */, /*34679*/7700/* 110F3 */,/*34680*/7701/* 110F4 */,/*34681*/7702/* 110F5 */,/*34682*/7703/* 110F6 */, /*34683*/7704/* 110F7 */,/*34684*/7705/* 110F8 */,/*34685*/7706/* 110F9 */,0,0,0,0,0,0,/*34692*/7707/* 11100 */, /*34693*/7707/* 11101 */,/*34694*/7707/* 11102 */,/*34695*/7708/* 11103 */,/*34696*/7708/* 11104 */, /*34697*/7708/* 11105 */,/*34698*/7708/* 11106 */,/*34699*/7708/* 11107 */,/*34700*/7708/* 11108 */, /*34701*/7708/* 11109 */,/*34702*/7708/* 1110A */,/*34703*/7708/* 1110B */,/*34704*/7708/* 1110C */, /*34705*/7708/* 1110D */,/*34706*/7708/* 1110E */,/*34707*/7708/* 1110F */,/*34708*/7708/* 11110 */, /*34709*/7708/* 11111 */,/*34710*/7708/* 11112 */,/*34711*/7708/* 11113 */,/*34712*/7708/* 11114 */, /*34713*/7708/* 11115 */,/*34714*/7708/* 11116 */,/*34715*/7708/* 11117 */,/*34716*/7708/* 11118 */, /*34717*/7708/* 11119 */,/*34718*/7708/* 1111A */,/*34719*/7708/* 1111B */,/*34720*/7708/* 1111C */, /*34721*/7708/* 1111D */,/*34722*/7708/* 1111E */,/*34723*/7708/* 1111F */,/*34724*/7708/* 11120 */, /*34725*/7708/* 11121 */,/*34726*/7708/* 11122 */,/*34727*/7708/* 11123 */,/*34728*/7708/* 11124 */, /*34729*/7708/* 11125 */,/*34730*/7708/* 11126 */,/*34731*/7709/* 11127 */,/*34732*/7710/* 11128 */, /*34733*/7710/* 11129 */,/*34734*/7710/* 1112A */,/*34735*/7710/* 1112B */,/*34736*/7711/* 1112C */, /*34737*/7710/* 1112D */,/*34738*/7712/* 1112E */,/*34739*/7713/* 1112F */,/*34740*/7710/* 11130 */, /*34741*/7710/* 11131 */,/*34742*/7710/* 11132 */,/*34743*/7714/* 11133 */,/*34744*/7714/* 11134 */,0, /*34746*/7715/* 11136 */,/*34747*/7716/* 11137 */,/*34748*/7717/* 11138 */,/*34749*/7718/* 11139 */, /*34750*/7719/* 1113A */,/*34751*/7720/* 1113B */,/*34752*/7721/* 1113C */,/*34753*/7722/* 1113D */, /*34754*/7723/* 1113E */,/*34755*/7724/* 1113F */,/*34756*/7725/* 11140 */,/*34757*/7726/* 11141 */, /*34758*/7726/* 11142 */,/*34759*/7726/* 11143 */,0,0,0,0,0,0,0,0,0,0,0,0,/*34772*/7727/* 11150 */, /*34773*/7727/* 11151 */,/*34774*/7727/* 11152 */,/*34775*/7727/* 11153 */,/*34776*/7727/* 11154 */, /*34777*/7727/* 11155 */,/*34778*/7727/* 11156 */,/*34779*/7727/* 11157 */,/*34780*/7727/* 11158 */, /*34781*/7727/* 11159 */,/*34782*/7727/* 1115A */,/*34783*/7727/* 1115B */,/*34784*/7727/* 1115C */, /*34785*/7727/* 1115D */,/*34786*/7727/* 1115E */,/*34787*/7727/* 1115F */,/*34788*/7727/* 11160 */, /*34789*/7727/* 11161 */,/*34790*/7727/* 11162 */,/*34791*/7727/* 11163 */,/*34792*/7727/* 11164 */, /*34793*/7727/* 11165 */,/*34794*/7727/* 11166 */,/*34795*/7727/* 11167 */,/*34796*/7727/* 11168 */, /*34797*/7727/* 11169 */,/*34798*/7727/* 1116A */,/*34799*/7727/* 1116B */,/*34800*/7727/* 1116C */, /*34801*/7727/* 1116D */,/*34802*/7727/* 1116E */,/*34803*/7727/* 1116F */,/*34804*/7727/* 11170 */, /*34805*/7727/* 11171 */,/*34806*/7727/* 11172 */,/*34807*/7728/* 11173 */,/*34808*/7729/* 11174 */, /*34809*/7729/* 11175 */,/*34810*/7727/* 11176 */,0,0,0,0,0,0,0,0,0,/*34820*/7730/* 11180 */,/*34821*/7730/* 11181 */, /*34822*/7731/* 11182 */,/*34823*/7732/* 11183 */,/*34824*/7732/* 11184 */,/*34825*/7732/* 11185 */, /*34826*/7732/* 11186 */,/*34827*/7732/* 11187 */,/*34828*/7732/* 11188 */,/*34829*/7732/* 11189 */, /*34830*/7732/* 1118A */,/*34831*/7732/* 1118B */,/*34832*/7732/* 1118C */,/*34833*/7732/* 1118D */, /*34834*/7732/* 1118E */,/*34835*/7732/* 1118F */,/*34836*/7732/* 11190 */,/*34837*/7732/* 11191 */, /*34838*/7732/* 11192 */,/*34839*/7732/* 11193 */,/*34840*/7732/* 11194 */,/*34841*/7732/* 11195 */, /*34842*/7732/* 11196 */,/*34843*/7732/* 11197 */,/*34844*/7732/* 11198 */,/*34845*/7732/* 11199 */, /*34846*/7732/* 1119A */,/*34847*/7732/* 1119B */,/*34848*/7732/* 1119C */,/*34849*/7732/* 1119D */, /*34850*/7732/* 1119E */,/*34851*/7732/* 1119F */,/*34852*/7732/* 111A0 */,/*34853*/7732/* 111A1 */, /*34854*/7732/* 111A2 */,/*34855*/7732/* 111A3 */,/*34856*/7732/* 111A4 */,/*34857*/7732/* 111A5 */, /*34858*/7732/* 111A6 */,/*34859*/7732/* 111A7 */,/*34860*/7732/* 111A8 */,/*34861*/7732/* 111A9 */, /*34862*/7732/* 111AA */,/*34863*/7732/* 111AB */,/*34864*/7732/* 111AC */,/*34865*/7732/* 111AD */, /*34866*/7732/* 111AE */,/*34867*/7732/* 111AF */,/*34868*/7732/* 111B0 */,/*34869*/7732/* 111B1 */, /*34870*/7732/* 111B2 */,/*34871*/7731/* 111B3 */,/*34872*/7731/* 111B4 */,/*34873*/7731/* 111B5 */, /*34874*/7730/* 111B6 */,/*34875*/7730/* 111B7 */,/*34876*/7730/* 111B8 */,/*34877*/7730/* 111B9 */, /*34878*/7730/* 111BA */,/*34879*/7730/* 111BB */,/*34880*/7730/* 111BC */,/*34881*/7730/* 111BD */, /*34882*/7730/* 111BE */,/*34883*/7731/* 111BF */,/*34884*/7733/* 111C0 */,/*34885*/7732/* 111C1 */, /*34886*/7732/* 111C2 */,/*34887*/7732/* 111C3 */,/*34888*/7732/* 111C4 */,/*34889*/7734/* 111C5 */, /*34890*/7734/* 111C6 */,/*34891*/7735/* 111C7 */,/*34892*/7735/* 111C8 */,/*34893*/7736/* 111C9 */, /*34894*/7737/* 111CA */,/*34895*/7738/* 111CB */,/*34896*/7738/* 111CC */,/*34897*/7739/* 111CD */,0,0, /*34900*/7740/* 111D0 */,/*34901*/7741/* 111D1 */,/*34902*/7742/* 111D2 */,/*34903*/7743/* 111D3 */, /*34904*/7744/* 111D4 */,/*34905*/7745/* 111D5 */,/*34906*/7746/* 111D6 */,/*34907*/7747/* 111D7 */, /*34908*/7748/* 111D8 */,/*34909*/7749/* 111D9 */,/*34910*/7750/* 111DA */,/*34911*/7736/* 111DB */, /*34912*/7751/* 111DC */,/*34913*/7736/* 111DD */,/*34914*/7752/* 111DE */,/*34915*/7752/* 111DF */,0, /*34917*/7753/* 111E1 */,/*34918*/7754/* 111E2 */,/*34919*/7755/* 111E3 */,/*34920*/7756/* 111E4 */, /*34921*/7757/* 111E5 */,/*34922*/7758/* 111E6 */,/*34923*/7759/* 111E7 */,/*34924*/7760/* 111E8 */, /*34925*/7761/* 111E9 */,/*34926*/7762/* 111EA */,/*34927*/7763/* 111EB */,/*34928*/7764/* 111EC */, /*34929*/7765/* 111ED */,/*34930*/7766/* 111EE */,/*34931*/7767/* 111EF */,/*34932*/7768/* 111F0 */, /*34933*/7769/* 111F1 */,/*34934*/7770/* 111F2 */,/*34935*/7771/* 111F3 */,/*34936*/7772/* 111F4 */,0,0,0,0,0,0,0,0,0,0, 0,/*34948*/7773/* 11200 */,/*34949*/7773/* 11201 */,/*34950*/7773/* 11202 */,/*34951*/7773/* 11203 */, /*34952*/7773/* 11204 */,/*34953*/7773/* 11205 */,/*34954*/7773/* 11206 */,/*34955*/7773/* 11207 */, /*34956*/7773/* 11208 */,/*34957*/7773/* 11209 */,/*34958*/7773/* 1120A */,/*34959*/7773/* 1120B */, /*34960*/7773/* 1120C */,/*34961*/7773/* 1120D */,/*34962*/7773/* 1120E */,/*34963*/7773/* 1120F */, /*34964*/7773/* 11210 */,/*34965*/7773/* 11211 */,0,/*34967*/7773/* 11213 */,/*34968*/7773/* 11214 */, /*34969*/7773/* 11215 */,/*34970*/7773/* 11216 */,/*34971*/7773/* 11217 */,/*34972*/7773/* 11218 */, /*34973*/7773/* 11219 */,/*34974*/7773/* 1121A */,/*34975*/7773/* 1121B */,/*34976*/7773/* 1121C */, /*34977*/7773/* 1121D */,/*34978*/7773/* 1121E */,/*34979*/7773/* 1121F */,/*34980*/7773/* 11220 */, /*34981*/7773/* 11221 */,/*34982*/7773/* 11222 */,/*34983*/7773/* 11223 */,/*34984*/7773/* 11224 */, /*34985*/7773/* 11225 */,/*34986*/7773/* 11226 */,/*34987*/7773/* 11227 */,/*34988*/7773/* 11228 */, /*34989*/7773/* 11229 */,/*34990*/7773/* 1122A */,/*34991*/7773/* 1122B */,/*34992*/7774/* 1122C */, /*34993*/7774/* 1122D */,/*34994*/7774/* 1122E */,/*34995*/7775/* 1122F */,/*34996*/7775/* 11230 */, /*34997*/7775/* 11231 */,/*34998*/7774/* 11232 */,/*34999*/7774/* 11233 */,/*35000*/7775/* 11234 */, /*35001*/7776/* 11235 */,/*35002*/7777/* 11236 */,/*35003*/7775/* 11237 */,/*35004*/7778/* 11238 */, /*35005*/7778/* 11239 */,/*35006*/7779/* 1123A */,/*35007*/7778/* 1123B */,/*35008*/7778/* 1123C */, /*35009*/7780/* 1123D */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*35076*/7781/* 11280 */,/*35077*/7781/* 11281 */,/*35078*/7781/* 11282 */, /*35079*/7781/* 11283 */,/*35080*/7781/* 11284 */,/*35081*/7781/* 11285 */,/*35082*/7781/* 11286 */,0, /*35084*/7781/* 11288 */,0,/*35086*/7781/* 1128A */,/*35087*/7781/* 1128B */,/*35088*/7781/* 1128C */, /*35089*/7781/* 1128D */,0,/*35091*/7781/* 1128F */,/*35092*/7781/* 11290 */,/*35093*/7781/* 11291 */, /*35094*/7781/* 11292 */,/*35095*/7781/* 11293 */,/*35096*/7781/* 11294 */,/*35097*/7781/* 11295 */, /*35098*/7781/* 11296 */,/*35099*/7781/* 11297 */,/*35100*/7781/* 11298 */,/*35101*/7781/* 11299 */, /*35102*/7781/* 1129A */,/*35103*/7781/* 1129B */,/*35104*/7781/* 1129C */,/*35105*/7781/* 1129D */,0, /*35107*/7781/* 1129F */,/*35108*/7781/* 112A0 */,/*35109*/7781/* 112A1 */,/*35110*/7781/* 112A2 */, /*35111*/7781/* 112A3 */,/*35112*/7781/* 112A4 */,/*35113*/7781/* 112A5 */,/*35114*/7781/* 112A6 */, /*35115*/7781/* 112A7 */,/*35116*/7781/* 112A8 */,/*35117*/7782/* 112A9 */,0,0,0,0,0,0,/*35124*/7783/* 112B0 */, /*35125*/7783/* 112B1 */,/*35126*/7783/* 112B2 */,/*35127*/7783/* 112B3 */,/*35128*/7783/* 112B4 */, /*35129*/7783/* 112B5 */,/*35130*/7783/* 112B6 */,/*35131*/7783/* 112B7 */,/*35132*/7783/* 112B8 */, /*35133*/7783/* 112B9 */,/*35134*/7783/* 112BA */,/*35135*/7783/* 112BB */,/*35136*/7783/* 112BC */, /*35137*/7783/* 112BD */,/*35138*/7783/* 112BE */,/*35139*/7783/* 112BF */,/*35140*/7783/* 112C0 */, /*35141*/7783/* 112C1 */,/*35142*/7783/* 112C2 */,/*35143*/7783/* 112C3 */,/*35144*/7783/* 112C4 */, /*35145*/7783/* 112C5 */,/*35146*/7783/* 112C6 */,/*35147*/7783/* 112C7 */,/*35148*/7783/* 112C8 */, /*35149*/7783/* 112C9 */,/*35150*/7783/* 112CA */,/*35151*/7783/* 112CB */,/*35152*/7783/* 112CC */, /*35153*/7783/* 112CD */,/*35154*/7783/* 112CE */,/*35155*/7783/* 112CF */,/*35156*/7783/* 112D0 */, /*35157*/7783/* 112D1 */,/*35158*/7783/* 112D2 */,/*35159*/7783/* 112D3 */,/*35160*/7783/* 112D4 */, /*35161*/7783/* 112D5 */,/*35162*/7783/* 112D6 */,/*35163*/7783/* 112D7 */,/*35164*/7783/* 112D8 */, /*35165*/7783/* 112D9 */,/*35166*/7783/* 112DA */,/*35167*/7783/* 112DB */,/*35168*/7783/* 112DC */, /*35169*/7783/* 112DD */,/*35170*/7783/* 112DE */,/*35171*/7784/* 112DF */,/*35172*/7785/* 112E0 */, /*35173*/7785/* 112E1 */,/*35174*/7785/* 112E2 */,/*35175*/7784/* 112E3 */,/*35176*/7784/* 112E4 */, /*35177*/7784/* 112E5 */,/*35178*/7784/* 112E6 */,/*35179*/7784/* 112E7 */,/*35180*/7784/* 112E8 */, /*35181*/7786/* 112E9 */,/*35182*/7787/* 112EA */,0,0,0,0,0,/*35188*/7788/* 112F0 */,/*35189*/7789/* 112F1 */, /*35190*/7790/* 112F2 */,/*35191*/7791/* 112F3 */,/*35192*/7792/* 112F4 */,/*35193*/7793/* 112F5 */, /*35194*/7794/* 112F6 */,/*35195*/7795/* 112F7 */,/*35196*/7796/* 112F8 */,/*35197*/7797/* 112F9 */,0,0,0,0,0,0, /*35204*/7798/* 11300 */,/*35205*/7799/* 11301 */,/*35206*/7800/* 11302 */,/*35207*/7800/* 11303 */,0, /*35209*/7801/* 11305 */,/*35210*/7801/* 11306 */,/*35211*/7801/* 11307 */,/*35212*/7801/* 11308 */, /*35213*/7801/* 11309 */,/*35214*/7801/* 1130A */,/*35215*/7801/* 1130B */,/*35216*/7801/* 1130C */,0,0, /*35219*/7801/* 1130F */,/*35220*/7801/* 11310 */,0,0,/*35223*/7801/* 11313 */,/*35224*/7801/* 11314 */, /*35225*/7801/* 11315 */,/*35226*/7801/* 11316 */,/*35227*/7801/* 11317 */,/*35228*/7801/* 11318 */, /*35229*/7801/* 11319 */,/*35230*/7801/* 1131A */,/*35231*/7801/* 1131B */,/*35232*/7801/* 1131C */, /*35233*/7801/* 1131D */,/*35234*/7801/* 1131E */,/*35235*/7801/* 1131F */,/*35236*/7801/* 11320 */, /*35237*/7801/* 11321 */,/*35238*/7801/* 11322 */,/*35239*/7801/* 11323 */,/*35240*/7801/* 11324 */, /*35241*/7801/* 11325 */,/*35242*/7801/* 11326 */,/*35243*/7801/* 11327 */,/*35244*/7801/* 11328 */,0, /*35246*/7801/* 1132A */,/*35247*/7801/* 1132B */,/*35248*/7801/* 1132C */,/*35249*/7801/* 1132D */, /*35250*/7801/* 1132E */,/*35251*/7801/* 1132F */,/*35252*/7801/* 11330 */,0,/*35254*/7801/* 11332 */, /*35255*/7801/* 11333 */,0,/*35257*/7801/* 11335 */,/*35258*/7801/* 11336 */,/*35259*/7801/* 11337 */, /*35260*/7801/* 11338 */,/*35261*/7801/* 11339 */,0,0,/*35264*/7802/* 1133C */,/*35265*/7801/* 1133D */, /*35266*/7803/* 1133E */,/*35267*/7800/* 1133F */,/*35268*/7799/* 11340 */,/*35269*/7800/* 11341 */, /*35270*/7800/* 11342 */,/*35271*/7800/* 11343 */,/*35272*/7800/* 11344 */,0,0,/*35275*/7800/* 11347 */, /*35276*/7800/* 11348 */,0,0,/*35279*/7804/* 1134B */,/*35280*/7805/* 1134C */,/*35281*/7806/* 1134D */,0,0, /*35284*/7807/* 11350 */,0,0,0,0,0,0,/*35291*/7803/* 11357 */,0,0,0,0,0,/*35297*/7808/* 1135D */, /*35298*/7801/* 1135E */,/*35299*/7801/* 1135F */,/*35300*/7801/* 11360 */,/*35301*/7801/* 11361 */, /*35302*/7800/* 11362 */,/*35303*/7800/* 11363 */,0,0,/*35306*/7809/* 11366 */,/*35307*/7809/* 11367 */, /*35308*/7809/* 11368 */,/*35309*/7809/* 11369 */,/*35310*/7809/* 1136A */,/*35311*/7809/* 1136B */, /*35312*/7809/* 1136C */,0,0,0,/*35316*/7809/* 11370 */,/*35317*/7809/* 11371 */,/*35318*/7809/* 11372 */, /*35319*/7809/* 11373 */,/*35320*/7809/* 11374 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*35588*/7810/* 11480 */,/*35589*/7810/* 11481 */,/*35590*/7810/* 11482 */,/*35591*/7810/* 11483 */, /*35592*/7810/* 11484 */,/*35593*/7810/* 11485 */,/*35594*/7810/* 11486 */,/*35595*/7810/* 11487 */, /*35596*/7810/* 11488 */,/*35597*/7810/* 11489 */,/*35598*/7810/* 1148A */,/*35599*/7810/* 1148B */, /*35600*/7810/* 1148C */,/*35601*/7810/* 1148D */,/*35602*/7810/* 1148E */,/*35603*/7810/* 1148F */, /*35604*/7810/* 11490 */,/*35605*/7810/* 11491 */,/*35606*/7810/* 11492 */,/*35607*/7810/* 11493 */, /*35608*/7810/* 11494 */,/*35609*/7810/* 11495 */,/*35610*/7810/* 11496 */,/*35611*/7810/* 11497 */, /*35612*/7810/* 11498 */,/*35613*/7810/* 11499 */,/*35614*/7810/* 1149A */,/*35615*/7810/* 1149B */, /*35616*/7810/* 1149C */,/*35617*/7810/* 1149D */,/*35618*/7810/* 1149E */,/*35619*/7810/* 1149F */, /*35620*/7810/* 114A0 */,/*35621*/7810/* 114A1 */,/*35622*/7810/* 114A2 */,/*35623*/7810/* 114A3 */, /*35624*/7810/* 114A4 */,/*35625*/7810/* 114A5 */,/*35626*/7810/* 114A6 */,/*35627*/7810/* 114A7 */, /*35628*/7810/* 114A8 */,/*35629*/7810/* 114A9 */,/*35630*/7810/* 114AA */,/*35631*/7810/* 114AB */, /*35632*/7810/* 114AC */,/*35633*/7810/* 114AD */,/*35634*/7810/* 114AE */,/*35635*/7810/* 114AF */, /*35636*/7811/* 114B0 */,/*35637*/7812/* 114B1 */,/*35638*/7812/* 114B2 */,/*35639*/7813/* 114B3 */, /*35640*/7813/* 114B4 */,/*35641*/7813/* 114B5 */,/*35642*/7813/* 114B6 */,/*35643*/7813/* 114B7 */, /*35644*/7813/* 114B8 */,/*35645*/7812/* 114B9 */,/*35646*/7814/* 114BA */,/*35647*/7815/* 114BB */, /*35648*/7816/* 114BC */,/*35649*/7811/* 114BD */,/*35650*/7817/* 114BE */,/*35651*/7813/* 114BF */, /*35652*/7813/* 114C0 */,/*35653*/7812/* 114C1 */,/*35654*/7818/* 114C2 */,/*35655*/7819/* 114C3 */, /*35656*/7810/* 114C4 */,/*35657*/7810/* 114C5 */,/*35658*/7820/* 114C6 */,/*35659*/7810/* 114C7 */,0,0,0,0,0,0,0,0, /*35668*/7821/* 114D0 */,/*35669*/7822/* 114D1 */,/*35670*/7823/* 114D2 */,/*35671*/7824/* 114D3 */, /*35672*/7825/* 114D4 */,/*35673*/7826/* 114D5 */,/*35674*/7827/* 114D6 */,/*35675*/7828/* 114D7 */, /*35676*/7829/* 114D8 */,/*35677*/7830/* 114D9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*35844*/7831/* 11580 */,/*35845*/7831/* 11581 */,/*35846*/7831/* 11582 */, /*35847*/7831/* 11583 */,/*35848*/7831/* 11584 */,/*35849*/7831/* 11585 */,/*35850*/7831/* 11586 */, /*35851*/7831/* 11587 */,/*35852*/7831/* 11588 */,/*35853*/7831/* 11589 */,/*35854*/7831/* 1158A */, /*35855*/7831/* 1158B */,/*35856*/7831/* 1158C */,/*35857*/7831/* 1158D */,/*35858*/7831/* 1158E */, /*35859*/7831/* 1158F */,/*35860*/7831/* 11590 */,/*35861*/7831/* 11591 */,/*35862*/7831/* 11592 */, /*35863*/7831/* 11593 */,/*35864*/7831/* 11594 */,/*35865*/7831/* 11595 */,/*35866*/7831/* 11596 */, /*35867*/7831/* 11597 */,/*35868*/7831/* 11598 */,/*35869*/7831/* 11599 */,/*35870*/7831/* 1159A */, /*35871*/7831/* 1159B */,/*35872*/7831/* 1159C */,/*35873*/7831/* 1159D */,/*35874*/7831/* 1159E */, /*35875*/7831/* 1159F */,/*35876*/7831/* 115A0 */,/*35877*/7831/* 115A1 */,/*35878*/7831/* 115A2 */, /*35879*/7831/* 115A3 */,/*35880*/7831/* 115A4 */,/*35881*/7831/* 115A5 */,/*35882*/7831/* 115A6 */, /*35883*/7831/* 115A7 */,/*35884*/7831/* 115A8 */,/*35885*/7831/* 115A9 */,/*35886*/7831/* 115AA */, /*35887*/7831/* 115AB */,/*35888*/7831/* 115AC */,/*35889*/7831/* 115AD */,/*35890*/7831/* 115AE */, /*35891*/7832/* 115AF */,/*35892*/7833/* 115B0 */,/*35893*/7833/* 115B1 */,/*35894*/7834/* 115B2 */, /*35895*/7834/* 115B3 */,/*35896*/7834/* 115B4 */,/*35897*/7834/* 115B5 */,0,0,/*35900*/7833/* 115B8 */, /*35901*/7833/* 115B9 */,/*35902*/7835/* 115BA */,/*35903*/7836/* 115BB */,/*35904*/7834/* 115BC */, /*35905*/7834/* 115BD */,/*35906*/7833/* 115BE */,/*35907*/7837/* 115BF */,/*35908*/7838/* 115C0 */, /*35909*/7839/* 115C1 */,/*35910*/7840/* 115C2 */,/*35911*/7840/* 115C3 */,/*35912*/7841/* 115C4 */, /*35913*/7841/* 115C5 */,/*35914*/7842/* 115C6 */,/*35915*/7842/* 115C7 */,/*35916*/7842/* 115C8 */, /*35917*/7840/* 115C9 */,/*35918*/7843/* 115CA */,/*35919*/7843/* 115CB */,/*35920*/7843/* 115CC */, /*35921*/7843/* 115CD */,/*35922*/7843/* 115CE */,/*35923*/7843/* 115CF */,/*35924*/7843/* 115D0 */, /*35925*/7843/* 115D1 */,/*35926*/7843/* 115D2 */,/*35927*/7843/* 115D3 */,/*35928*/7843/* 115D4 */, /*35929*/7843/* 115D5 */,/*35930*/7843/* 115D6 */,/*35931*/7843/* 115D7 */,/*35932*/7844/* 115D8 */, /*35933*/7844/* 115D9 */,/*35934*/7844/* 115DA */,/*35935*/7844/* 115DB */,/*35936*/7845/* 115DC */, /*35937*/7845/* 115DD */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*35972*/7846/* 11600 */, /*35973*/7846/* 11601 */,/*35974*/7846/* 11602 */,/*35975*/7846/* 11603 */,/*35976*/7846/* 11604 */, /*35977*/7846/* 11605 */,/*35978*/7846/* 11606 */,/*35979*/7846/* 11607 */,/*35980*/7846/* 11608 */, /*35981*/7846/* 11609 */,/*35982*/7846/* 1160A */,/*35983*/7846/* 1160B */,/*35984*/7846/* 1160C */, /*35985*/7846/* 1160D */,/*35986*/7846/* 1160E */,/*35987*/7846/* 1160F */,/*35988*/7846/* 11610 */, /*35989*/7846/* 11611 */,/*35990*/7846/* 11612 */,/*35991*/7846/* 11613 */,/*35992*/7846/* 11614 */, /*35993*/7846/* 11615 */,/*35994*/7846/* 11616 */,/*35995*/7846/* 11617 */,/*35996*/7846/* 11618 */, /*35997*/7846/* 11619 */,/*35998*/7846/* 1161A */,/*35999*/7846/* 1161B */,/*36000*/7846/* 1161C */, /*36001*/7846/* 1161D */,/*36002*/7846/* 1161E */,/*36003*/7846/* 1161F */,/*36004*/7846/* 11620 */, /*36005*/7846/* 11621 */,/*36006*/7846/* 11622 */,/*36007*/7846/* 11623 */,/*36008*/7846/* 11624 */, /*36009*/7846/* 11625 */,/*36010*/7846/* 11626 */,/*36011*/7846/* 11627 */,/*36012*/7846/* 11628 */, /*36013*/7846/* 11629 */,/*36014*/7846/* 1162A */,/*36015*/7846/* 1162B */,/*36016*/7846/* 1162C */, /*36017*/7846/* 1162D */,/*36018*/7846/* 1162E */,/*36019*/7846/* 1162F */,/*36020*/7847/* 11630 */, /*36021*/7847/* 11631 */,/*36022*/7847/* 11632 */,/*36023*/7848/* 11633 */,/*36024*/7848/* 11634 */, /*36025*/7848/* 11635 */,/*36026*/7848/* 11636 */,/*36027*/7848/* 11637 */,/*36028*/7848/* 11638 */, /*36029*/7848/* 11639 */,/*36030*/7848/* 1163A */,/*36031*/7847/* 1163B */,/*36032*/7847/* 1163C */, /*36033*/7848/* 1163D */,/*36034*/7847/* 1163E */,/*36035*/7849/* 1163F */,/*36036*/7848/* 11640 */, /*36037*/7850/* 11641 */,/*36038*/7850/* 11642 */,/*36039*/7851/* 11643 */,/*36040*/7846/* 11644 */,0,0,0,0,0,0,0,0,0,0, 0,/*36052*/7852/* 11650 */,/*36053*/7853/* 11651 */,/*36054*/7854/* 11652 */,/*36055*/7855/* 11653 */, /*36056*/7856/* 11654 */,/*36057*/7857/* 11655 */,/*36058*/7858/* 11656 */,/*36059*/7859/* 11657 */, /*36060*/7860/* 11658 */,/*36061*/7861/* 11659 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,/*36100*/7862/* 11680 */,/*36101*/7862/* 11681 */,/*36102*/7862/* 11682 */,/*36103*/7862/* 11683 */, /*36104*/7862/* 11684 */,/*36105*/7862/* 11685 */,/*36106*/7862/* 11686 */,/*36107*/7862/* 11687 */, /*36108*/7862/* 11688 */,/*36109*/7862/* 11689 */,/*36110*/7862/* 1168A */,/*36111*/7862/* 1168B */, /*36112*/7862/* 1168C */,/*36113*/7862/* 1168D */,/*36114*/7862/* 1168E */,/*36115*/7862/* 1168F */, /*36116*/7862/* 11690 */,/*36117*/7862/* 11691 */,/*36118*/7862/* 11692 */,/*36119*/7862/* 11693 */, /*36120*/7862/* 11694 */,/*36121*/7862/* 11695 */,/*36122*/7862/* 11696 */,/*36123*/7862/* 11697 */, /*36124*/7862/* 11698 */,/*36125*/7862/* 11699 */,/*36126*/7862/* 1169A */,/*36127*/7862/* 1169B */, /*36128*/7862/* 1169C */,/*36129*/7862/* 1169D */,/*36130*/7862/* 1169E */,/*36131*/7862/* 1169F */, /*36132*/7862/* 116A0 */,/*36133*/7862/* 116A1 */,/*36134*/7862/* 116A2 */,/*36135*/7862/* 116A3 */, /*36136*/7862/* 116A4 */,/*36137*/7862/* 116A5 */,/*36138*/7862/* 116A6 */,/*36139*/7862/* 116A7 */, /*36140*/7862/* 116A8 */,/*36141*/7862/* 116A9 */,/*36142*/7862/* 116AA */,/*36143*/7863/* 116AB */, /*36144*/7864/* 116AC */,/*36145*/7863/* 116AD */,/*36146*/7864/* 116AE */,/*36147*/7864/* 116AF */, /*36148*/7863/* 116B0 */,/*36149*/7863/* 116B1 */,/*36150*/7863/* 116B2 */,/*36151*/7863/* 116B3 */, /*36152*/7863/* 116B4 */,/*36153*/7863/* 116B5 */,/*36154*/7865/* 116B6 */,/*36155*/7866/* 116B7 */,0,0,0,0,0,0,0,0, /*36164*/7867/* 116C0 */,/*36165*/7868/* 116C1 */,/*36166*/7869/* 116C2 */,/*36167*/7870/* 116C3 */, /*36168*/7871/* 116C4 */,/*36169*/7872/* 116C5 */,/*36170*/7873/* 116C6 */,/*36171*/7874/* 116C7 */, /*36172*/7875/* 116C8 */,/*36173*/7876/* 116C9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*36228*/7877/* 11700 */,/*36229*/7877/* 11701 */,/*36230*/7877/* 11702 */, /*36231*/7877/* 11703 */,/*36232*/7877/* 11704 */,/*36233*/7877/* 11705 */,/*36234*/7877/* 11706 */, /*36235*/7877/* 11707 */,/*36236*/7877/* 11708 */,/*36237*/7877/* 11709 */,/*36238*/7877/* 1170A */, /*36239*/7877/* 1170B */,/*36240*/7877/* 1170C */,/*36241*/7877/* 1170D */,/*36242*/7877/* 1170E */, /*36243*/7877/* 1170F */,/*36244*/7877/* 11710 */,/*36245*/7877/* 11711 */,/*36246*/7877/* 11712 */, /*36247*/7877/* 11713 */,/*36248*/7877/* 11714 */,/*36249*/7877/* 11715 */,/*36250*/7877/* 11716 */, /*36251*/7877/* 11717 */,/*36252*/7877/* 11718 */,/*36253*/7877/* 11719 */,0,0,0,/*36257*/7878/* 1171D */, /*36258*/7878/* 1171E */,/*36259*/7878/* 1171F */,/*36260*/7879/* 11720 */,/*36261*/7879/* 11721 */, /*36262*/7878/* 11722 */,/*36263*/7878/* 11723 */,/*36264*/7878/* 11724 */,/*36265*/7878/* 11725 */, /*36266*/7879/* 11726 */,/*36267*/7878/* 11727 */,/*36268*/7878/* 11728 */,/*36269*/7878/* 11729 */, /*36270*/7878/* 1172A */,/*36271*/7880/* 1172B */,0,0,0,0,/*36276*/7881/* 11730 */,/*36277*/7882/* 11731 */, /*36278*/7883/* 11732 */,/*36279*/7884/* 11733 */,/*36280*/7885/* 11734 */,/*36281*/7886/* 11735 */, /*36282*/7887/* 11736 */,/*36283*/7888/* 11737 */,/*36284*/7889/* 11738 */,/*36285*/7890/* 11739 */, /*36286*/7891/* 1173A */,/*36287*/7892/* 1173B */,/*36288*/7893/* 1173C */,/*36289*/7893/* 1173D */, /*36290*/7893/* 1173E */,/*36291*/7894/* 1173F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*36644*/7895/* 118A0 */,/*36645*/7896/* 118A1 */,/*36646*/7897/* 118A2 */, /*36647*/7898/* 118A3 */,/*36648*/7899/* 118A4 */,/*36649*/7900/* 118A5 */,/*36650*/7901/* 118A6 */, /*36651*/7902/* 118A7 */,/*36652*/7903/* 118A8 */,/*36653*/7904/* 118A9 */,/*36654*/7905/* 118AA */, /*36655*/7906/* 118AB */,/*36656*/7907/* 118AC */,/*36657*/7908/* 118AD */,/*36658*/7909/* 118AE */, /*36659*/7910/* 118AF */,/*36660*/7911/* 118B0 */,/*36661*/7912/* 118B1 */,/*36662*/7913/* 118B2 */, /*36663*/7914/* 118B3 */,/*36664*/7915/* 118B4 */,/*36665*/7916/* 118B5 */,/*36666*/7917/* 118B6 */, /*36667*/7918/* 118B7 */,/*36668*/7919/* 118B8 */,/*36669*/7920/* 118B9 */,/*36670*/7921/* 118BA */, /*36671*/7922/* 118BB */,/*36672*/7923/* 118BC */,/*36673*/7924/* 118BD */,/*36674*/7925/* 118BE */, /*36675*/7926/* 118BF */,/*36676*/7927/* 118C0 */,/*36677*/7928/* 118C1 */,/*36678*/7929/* 118C2 */, /*36679*/7930/* 118C3 */,/*36680*/7931/* 118C4 */,/*36681*/7932/* 118C5 */,/*36682*/7933/* 118C6 */, /*36683*/7934/* 118C7 */,/*36684*/7935/* 118C8 */,/*36685*/7936/* 118C9 */,/*36686*/7937/* 118CA */, /*36687*/7938/* 118CB */,/*36688*/7939/* 118CC */,/*36689*/7940/* 118CD */,/*36690*/7941/* 118CE */, /*36691*/7942/* 118CF */,/*36692*/7943/* 118D0 */,/*36693*/7944/* 118D1 */,/*36694*/7945/* 118D2 */, /*36695*/7946/* 118D3 */,/*36696*/7947/* 118D4 */,/*36697*/7948/* 118D5 */,/*36698*/7949/* 118D6 */, /*36699*/7950/* 118D7 */,/*36700*/7951/* 118D8 */,/*36701*/7952/* 118D9 */,/*36702*/7953/* 118DA */, /*36703*/7954/* 118DB */,/*36704*/7955/* 118DC */,/*36705*/7956/* 118DD */,/*36706*/7957/* 118DE */, /*36707*/7958/* 118DF */,/*36708*/7959/* 118E0 */,/*36709*/7960/* 118E1 */,/*36710*/7961/* 118E2 */, /*36711*/7962/* 118E3 */,/*36712*/7963/* 118E4 */,/*36713*/7964/* 118E5 */,/*36714*/7965/* 118E6 */, /*36715*/7966/* 118E7 */,/*36716*/7967/* 118E8 */,/*36717*/7968/* 118E9 */,/*36718*/7969/* 118EA */, /*36719*/7970/* 118EB */,/*36720*/7971/* 118EC */,/*36721*/7972/* 118ED */,/*36722*/7973/* 118EE */, /*36723*/7974/* 118EF */,/*36724*/7975/* 118F0 */,/*36725*/7976/* 118F1 */,/*36726*/7977/* 118F2 */,0,0,0,0,0,0,0,0,0,0, 0,0,/*36739*/7978/* 118FF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*37188*/7979/* 11AC0 */, /*37189*/7979/* 11AC1 */,/*37190*/7979/* 11AC2 */,/*37191*/7979/* 11AC3 */,/*37192*/7979/* 11AC4 */, /*37193*/7979/* 11AC5 */,/*37194*/7979/* 11AC6 */,/*37195*/7979/* 11AC7 */,/*37196*/7979/* 11AC8 */, /*37197*/7979/* 11AC9 */,/*37198*/7979/* 11ACA */,/*37199*/7979/* 11ACB */,/*37200*/7979/* 11ACC */, /*37201*/7979/* 11ACD */,/*37202*/7979/* 11ACE */,/*37203*/7979/* 11ACF */,/*37204*/7979/* 11AD0 */, /*37205*/7979/* 11AD1 */,/*37206*/7979/* 11AD2 */,/*37207*/7979/* 11AD3 */,/*37208*/7979/* 11AD4 */, /*37209*/7979/* 11AD5 */,/*37210*/7979/* 11AD6 */,/*37211*/7979/* 11AD7 */,/*37212*/7979/* 11AD8 */, /*37213*/7979/* 11AD9 */,/*37214*/7979/* 11ADA */,/*37215*/7979/* 11ADB */,/*37216*/7979/* 11ADC */, /*37217*/7979/* 11ADD */,/*37218*/7979/* 11ADE */,/*37219*/7979/* 11ADF */,/*37220*/7979/* 11AE0 */, /*37221*/7979/* 11AE1 */,/*37222*/7979/* 11AE2 */,/*37223*/7979/* 11AE3 */,/*37224*/7979/* 11AE4 */, /*37225*/7979/* 11AE5 */,/*37226*/7979/* 11AE6 */,/*37227*/7979/* 11AE7 */,/*37228*/7979/* 11AE8 */, /*37229*/7979/* 11AE9 */,/*37230*/7979/* 11AEA */,/*37231*/7979/* 11AEB */,/*37232*/7979/* 11AEC */, /*37233*/7979/* 11AED */,/*37234*/7979/* 11AEE */,/*37235*/7979/* 11AEF */,/*37236*/7979/* 11AF0 */, /*37237*/7979/* 11AF1 */,/*37238*/7979/* 11AF2 */,/*37239*/7979/* 11AF3 */,/*37240*/7979/* 11AF4 */, /*37241*/7979/* 11AF5 */,/*37242*/7979/* 11AF6 */,/*37243*/7979/* 11AF7 */,/*37244*/7979/* 11AF8 */, /*37245*/7980/* 12000 */,/*37246*/7980/* 12001 */,/*37247*/7980/* 12002 */,/*37248*/7980/* 12003 */, /*37249*/7980/* 12004 */,/*37250*/7980/* 12005 */,/*37251*/7980/* 12006 */,/*37252*/7980/* 12007 */, /*37253*/7980/* 12008 */,/*37254*/7980/* 12009 */,/*37255*/7980/* 1200A */,/*37256*/7980/* 1200B */, /*37257*/7980/* 1200C */,/*37258*/7980/* 1200D */,/*37259*/7980/* 1200E */,/*37260*/7980/* 1200F */, /*37261*/7980/* 12010 */,/*37262*/7980/* 12011 */,/*37263*/7980/* 12012 */,/*37264*/7980/* 12013 */, /*37265*/7980/* 12014 */,/*37266*/7980/* 12015 */,/*37267*/7980/* 12016 */,/*37268*/7980/* 12017 */, /*37269*/7980/* 12018 */,/*37270*/7980/* 12019 */,/*37271*/7980/* 1201A */,/*37272*/7980/* 1201B */, /*37273*/7980/* 1201C */,/*37274*/7980/* 1201D */,/*37275*/7980/* 1201E */,/*37276*/7980/* 1201F */, /*37277*/7980/* 12020 */,/*37278*/7980/* 12021 */,/*37279*/7980/* 12022 */,/*37280*/7980/* 12023 */, /*37281*/7980/* 12024 */,/*37282*/7980/* 12025 */,/*37283*/7980/* 12026 */,/*37284*/7980/* 12027 */, /*37285*/7980/* 12028 */,/*37286*/7980/* 12029 */,/*37287*/7980/* 1202A */,/*37288*/7980/* 1202B */, /*37289*/7980/* 1202C */,/*37290*/7980/* 1202D */,/*37291*/7980/* 1202E */,/*37292*/7980/* 1202F */, /*37293*/7980/* 12030 */,/*37294*/7980/* 12031 */,/*37295*/7980/* 12032 */,/*37296*/7980/* 12033 */, /*37297*/7980/* 12034 */,/*37298*/7980/* 12035 */,/*37299*/7980/* 12036 */,/*37300*/7980/* 12037 */, /*37301*/7980/* 12038 */,/*37302*/7980/* 12039 */,/*37303*/7980/* 1203A */,/*37304*/7980/* 1203B */, /*37305*/7980/* 1203C */,/*37306*/7980/* 1203D */,/*37307*/7980/* 1203E */,/*37308*/7980/* 1203F */, /*37309*/7980/* 12040 */,/*37310*/7980/* 12041 */,/*37311*/7980/* 12042 */,/*37312*/7980/* 12043 */, /*37313*/7980/* 12044 */,/*37314*/7980/* 12045 */,/*37315*/7980/* 12046 */,/*37316*/7980/* 12047 */, /*37317*/7980/* 12048 */,/*37318*/7980/* 12049 */,/*37319*/7980/* 1204A */,/*37320*/7980/* 1204B */, /*37321*/7980/* 1204C */,/*37322*/7980/* 1204D */,/*37323*/7980/* 1204E */,/*37324*/7980/* 1204F */, /*37325*/7980/* 12050 */,/*37326*/7980/* 12051 */,/*37327*/7980/* 12052 */,/*37328*/7980/* 12053 */, /*37329*/7980/* 12054 */,/*37330*/7980/* 12055 */,/*37331*/7980/* 12056 */,/*37332*/7980/* 12057 */, /*37333*/7980/* 12058 */,/*37334*/7980/* 12059 */,/*37335*/7980/* 1205A */,/*37336*/7980/* 1205B */, /*37337*/7980/* 1205C */,/*37338*/7980/* 1205D */,/*37339*/7980/* 1205E */,/*37340*/7980/* 1205F */, /*37341*/7980/* 12060 */,/*37342*/7980/* 12061 */,/*37343*/7980/* 12062 */,/*37344*/7980/* 12063 */, /*37345*/7980/* 12064 */,/*37346*/7980/* 12065 */,/*37347*/7980/* 12066 */,/*37348*/7980/* 12067 */, /*37349*/7980/* 12068 */,/*37350*/7980/* 12069 */,/*37351*/7980/* 1206A */,/*37352*/7980/* 1206B */, /*37353*/7980/* 1206C */,/*37354*/7980/* 1206D */,/*37355*/7980/* 1206E */,/*37356*/7980/* 1206F */, /*37357*/7980/* 12070 */,/*37358*/7980/* 12071 */,/*37359*/7980/* 12072 */,/*37360*/7980/* 12073 */, /*37361*/7980/* 12074 */,/*37362*/7980/* 12075 */,/*37363*/7980/* 12076 */,/*37364*/7980/* 12077 */, /*37365*/7980/* 12078 */,/*37366*/7980/* 12079 */,/*37367*/7980/* 1207A */,/*37368*/7980/* 1207B */, /*37369*/7980/* 1207C */,/*37370*/7980/* 1207D */,/*37371*/7980/* 1207E */,/*37372*/7980/* 1207F */, /*37373*/7980/* 12080 */,/*37374*/7980/* 12081 */,/*37375*/7980/* 12082 */,/*37376*/7980/* 12083 */, /*37377*/7980/* 12084 */,/*37378*/7980/* 12085 */,/*37379*/7980/* 12086 */,/*37380*/7980/* 12087 */, /*37381*/7980/* 12088 */,/*37382*/7980/* 12089 */,/*37383*/7980/* 1208A */,/*37384*/7980/* 1208B */, /*37385*/7980/* 1208C */,/*37386*/7980/* 1208D */,/*37387*/7980/* 1208E */,/*37388*/7980/* 1208F */, /*37389*/7980/* 12090 */,/*37390*/7980/* 12091 */,/*37391*/7980/* 12092 */,/*37392*/7980/* 12093 */, /*37393*/7980/* 12094 */,/*37394*/7980/* 12095 */,/*37395*/7980/* 12096 */,/*37396*/7980/* 12097 */, /*37397*/7980/* 12098 */,/*37398*/7980/* 12099 */,/*37399*/7980/* 1209A */,/*37400*/7980/* 1209B */, /*37401*/7980/* 1209C */,/*37402*/7980/* 1209D */,/*37403*/7980/* 1209E */,/*37404*/7980/* 1209F */, /*37405*/7980/* 120A0 */,/*37406*/7980/* 120A1 */,/*37407*/7980/* 120A2 */,/*37408*/7980/* 120A3 */, /*37409*/7980/* 120A4 */,/*37410*/7980/* 120A5 */,/*37411*/7980/* 120A6 */,/*37412*/7980/* 120A7 */, /*37413*/7980/* 120A8 */,/*37414*/7980/* 120A9 */,/*37415*/7980/* 120AA */,/*37416*/7980/* 120AB */, /*37417*/7980/* 120AC */,/*37418*/7980/* 120AD */,/*37419*/7980/* 120AE */,/*37420*/7980/* 120AF */, /*37421*/7980/* 120B0 */,/*37422*/7980/* 120B1 */,/*37423*/7980/* 120B2 */,/*37424*/7980/* 120B3 */, /*37425*/7980/* 120B4 */,/*37426*/7980/* 120B5 */,/*37427*/7980/* 120B6 */,/*37428*/7980/* 120B7 */, /*37429*/7980/* 120B8 */,/*37430*/7980/* 120B9 */,/*37431*/7980/* 120BA */,/*37432*/7980/* 120BB */, /*37433*/7980/* 120BC */,/*37434*/7980/* 120BD */,/*37435*/7980/* 120BE */,/*37436*/7980/* 120BF */, /*37437*/7980/* 120C0 */,/*37438*/7980/* 120C1 */,/*37439*/7980/* 120C2 */,/*37440*/7980/* 120C3 */, /*37441*/7980/* 120C4 */,/*37442*/7980/* 120C5 */,/*37443*/7980/* 120C6 */,/*37444*/7980/* 120C7 */, /*37445*/7980/* 120C8 */,/*37446*/7980/* 120C9 */,/*37447*/7980/* 120CA */,/*37448*/7980/* 120CB */, /*37449*/7980/* 120CC */,/*37450*/7980/* 120CD */,/*37451*/7980/* 120CE */,/*37452*/7980/* 120CF */, /*37453*/7980/* 120D0 */,/*37454*/7980/* 120D1 */,/*37455*/7980/* 120D2 */,/*37456*/7980/* 120D3 */, /*37457*/7980/* 120D4 */,/*37458*/7980/* 120D5 */,/*37459*/7980/* 120D6 */,/*37460*/7980/* 120D7 */, /*37461*/7980/* 120D8 */,/*37462*/7980/* 120D9 */,/*37463*/7980/* 120DA */,/*37464*/7980/* 120DB */, /*37465*/7980/* 120DC */,/*37466*/7980/* 120DD */,/*37467*/7980/* 120DE */,/*37468*/7980/* 120DF */, /*37469*/7980/* 120E0 */,/*37470*/7980/* 120E1 */,/*37471*/7980/* 120E2 */,/*37472*/7980/* 120E3 */, /*37473*/7980/* 120E4 */,/*37474*/7980/* 120E5 */,/*37475*/7980/* 120E6 */,/*37476*/7980/* 120E7 */, /*37477*/7980/* 120E8 */,/*37478*/7980/* 120E9 */,/*37479*/7980/* 120EA */,/*37480*/7980/* 120EB */, /*37481*/7980/* 120EC */,/*37482*/7980/* 120ED */,/*37483*/7980/* 120EE */,/*37484*/7980/* 120EF */, /*37485*/7980/* 120F0 */,/*37486*/7980/* 120F1 */,/*37487*/7980/* 120F2 */,/*37488*/7980/* 120F3 */, /*37489*/7980/* 120F4 */,/*37490*/7980/* 120F5 */,/*37491*/7980/* 120F6 */,/*37492*/7980/* 120F7 */, /*37493*/7980/* 120F8 */,/*37494*/7980/* 120F9 */,/*37495*/7980/* 120FA */,/*37496*/7980/* 120FB */, /*37497*/7980/* 120FC */,/*37498*/7980/* 120FD */,/*37499*/7980/* 120FE */,/*37500*/7980/* 120FF */, /*37501*/7980/* 12100 */,/*37502*/7980/* 12101 */,/*37503*/7980/* 12102 */,/*37504*/7980/* 12103 */, /*37505*/7980/* 12104 */,/*37506*/7980/* 12105 */,/*37507*/7980/* 12106 */,/*37508*/7980/* 12107 */, /*37509*/7980/* 12108 */,/*37510*/7980/* 12109 */,/*37511*/7980/* 1210A */,/*37512*/7980/* 1210B */, /*37513*/7980/* 1210C */,/*37514*/7980/* 1210D */,/*37515*/7980/* 1210E */,/*37516*/7980/* 1210F */, /*37517*/7980/* 12110 */,/*37518*/7980/* 12111 */,/*37519*/7980/* 12112 */,/*37520*/7980/* 12113 */, /*37521*/7980/* 12114 */,/*37522*/7980/* 12115 */,/*37523*/7980/* 12116 */,/*37524*/7980/* 12117 */, /*37525*/7980/* 12118 */,/*37526*/7980/* 12119 */,/*37527*/7980/* 1211A */,/*37528*/7980/* 1211B */, /*37529*/7980/* 1211C */,/*37530*/7980/* 1211D */,/*37531*/7980/* 1211E */,/*37532*/7980/* 1211F */, /*37533*/7980/* 12120 */,/*37534*/7980/* 12121 */,/*37535*/7980/* 12122 */,/*37536*/7980/* 12123 */, /*37537*/7980/* 12124 */,/*37538*/7980/* 12125 */,/*37539*/7980/* 12126 */,/*37540*/7980/* 12127 */, /*37541*/7980/* 12128 */,/*37542*/7980/* 12129 */,/*37543*/7980/* 1212A */,/*37544*/7980/* 1212B */, /*37545*/7980/* 1212C */,/*37546*/7980/* 1212D */,/*37547*/7980/* 1212E */,/*37548*/7980/* 1212F */, /*37549*/7980/* 12130 */,/*37550*/7980/* 12131 */,/*37551*/7980/* 12132 */,/*37552*/7980/* 12133 */, /*37553*/7980/* 12134 */,/*37554*/7980/* 12135 */,/*37555*/7980/* 12136 */,/*37556*/7980/* 12137 */, /*37557*/7980/* 12138 */,/*37558*/7980/* 12139 */,/*37559*/7980/* 1213A */,/*37560*/7980/* 1213B */, /*37561*/7980/* 1213C */,/*37562*/7980/* 1213D */,/*37563*/7980/* 1213E */,/*37564*/7980/* 1213F */, /*37565*/7980/* 12140 */,/*37566*/7980/* 12141 */,/*37567*/7980/* 12142 */,/*37568*/7980/* 12143 */, /*37569*/7980/* 12144 */,/*37570*/7980/* 12145 */,/*37571*/7980/* 12146 */,/*37572*/7980/* 12147 */, /*37573*/7980/* 12148 */,/*37574*/7980/* 12149 */,/*37575*/7980/* 1214A */,/*37576*/7980/* 1214B */, /*37577*/7980/* 1214C */,/*37578*/7980/* 1214D */,/*37579*/7980/* 1214E */,/*37580*/7980/* 1214F */, /*37581*/7980/* 12150 */,/*37582*/7980/* 12151 */,/*37583*/7980/* 12152 */,/*37584*/7980/* 12153 */, /*37585*/7980/* 12154 */,/*37586*/7980/* 12155 */,/*37587*/7980/* 12156 */,/*37588*/7980/* 12157 */, /*37589*/7980/* 12158 */,/*37590*/7980/* 12159 */,/*37591*/7980/* 1215A */,/*37592*/7980/* 1215B */, /*37593*/7980/* 1215C */,/*37594*/7980/* 1215D */,/*37595*/7980/* 1215E */,/*37596*/7980/* 1215F */, /*37597*/7980/* 12160 */,/*37598*/7980/* 12161 */,/*37599*/7980/* 12162 */,/*37600*/7980/* 12163 */, /*37601*/7980/* 12164 */,/*37602*/7980/* 12165 */,/*37603*/7980/* 12166 */,/*37604*/7980/* 12167 */, /*37605*/7980/* 12168 */,/*37606*/7980/* 12169 */,/*37607*/7980/* 1216A */,/*37608*/7980/* 1216B */, /*37609*/7980/* 1216C */,/*37610*/7980/* 1216D */,/*37611*/7980/* 1216E */,/*37612*/7980/* 1216F */, /*37613*/7980/* 12170 */,/*37614*/7980/* 12171 */,/*37615*/7980/* 12172 */,/*37616*/7980/* 12173 */, /*37617*/7980/* 12174 */,/*37618*/7980/* 12175 */,/*37619*/7980/* 12176 */,/*37620*/7980/* 12177 */, /*37621*/7980/* 12178 */,/*37622*/7980/* 12179 */,/*37623*/7980/* 1217A */,/*37624*/7980/* 1217B */, /*37625*/7980/* 1217C */,/*37626*/7980/* 1217D */,/*37627*/7980/* 1217E */,/*37628*/7980/* 1217F */, /*37629*/7980/* 12180 */,/*37630*/7980/* 12181 */,/*37631*/7980/* 12182 */,/*37632*/7980/* 12183 */, /*37633*/7980/* 12184 */,/*37634*/7980/* 12185 */,/*37635*/7980/* 12186 */,/*37636*/7980/* 12187 */, /*37637*/7980/* 12188 */,/*37638*/7980/* 12189 */,/*37639*/7980/* 1218A */,/*37640*/7980/* 1218B */, /*37641*/7980/* 1218C */,/*37642*/7980/* 1218D */,/*37643*/7980/* 1218E */,/*37644*/7980/* 1218F */, /*37645*/7980/* 12190 */,/*37646*/7980/* 12191 */,/*37647*/7980/* 12192 */,/*37648*/7980/* 12193 */, /*37649*/7980/* 12194 */,/*37650*/7980/* 12195 */,/*37651*/7980/* 12196 */,/*37652*/7980/* 12197 */, /*37653*/7980/* 12198 */,/*37654*/7980/* 12199 */,/*37655*/7980/* 1219A */,/*37656*/7980/* 1219B */, /*37657*/7980/* 1219C */,/*37658*/7980/* 1219D */,/*37659*/7980/* 1219E */,/*37660*/7980/* 1219F */, /*37661*/7980/* 121A0 */,/*37662*/7980/* 121A1 */,/*37663*/7980/* 121A2 */,/*37664*/7980/* 121A3 */, /*37665*/7980/* 121A4 */,/*37666*/7980/* 121A5 */,/*37667*/7980/* 121A6 */,/*37668*/7980/* 121A7 */, /*37669*/7980/* 121A8 */,/*37670*/7980/* 121A9 */,/*37671*/7980/* 121AA */,/*37672*/7980/* 121AB */, /*37673*/7980/* 121AC */,/*37674*/7980/* 121AD */,/*37675*/7980/* 121AE */,/*37676*/7980/* 121AF */, /*37677*/7980/* 121B0 */,/*37678*/7980/* 121B1 */,/*37679*/7980/* 121B2 */,/*37680*/7980/* 121B3 */, /*37681*/7980/* 121B4 */,/*37682*/7980/* 121B5 */,/*37683*/7980/* 121B6 */,/*37684*/7980/* 121B7 */, /*37685*/7980/* 121B8 */,/*37686*/7980/* 121B9 */,/*37687*/7980/* 121BA */,/*37688*/7980/* 121BB */, /*37689*/7980/* 121BC */,/*37690*/7980/* 121BD */,/*37691*/7980/* 121BE */,/*37692*/7980/* 121BF */, /*37693*/7980/* 121C0 */,/*37694*/7980/* 121C1 */,/*37695*/7980/* 121C2 */,/*37696*/7980/* 121C3 */, /*37697*/7980/* 121C4 */,/*37698*/7980/* 121C5 */,/*37699*/7980/* 121C6 */,/*37700*/7980/* 121C7 */, /*37701*/7980/* 121C8 */,/*37702*/7980/* 121C9 */,/*37703*/7980/* 121CA */,/*37704*/7980/* 121CB */, /*37705*/7980/* 121CC */,/*37706*/7980/* 121CD */,/*37707*/7980/* 121CE */,/*37708*/7980/* 121CF */, /*37709*/7980/* 121D0 */,/*37710*/7980/* 121D1 */,/*37711*/7980/* 121D2 */,/*37712*/7980/* 121D3 */, /*37713*/7980/* 121D4 */,/*37714*/7980/* 121D5 */,/*37715*/7980/* 121D6 */,/*37716*/7980/* 121D7 */, /*37717*/7980/* 121D8 */,/*37718*/7980/* 121D9 */,/*37719*/7980/* 121DA */,/*37720*/7980/* 121DB */, /*37721*/7980/* 121DC */,/*37722*/7980/* 121DD */,/*37723*/7980/* 121DE */,/*37724*/7980/* 121DF */, /*37725*/7980/* 121E0 */,/*37726*/7980/* 121E1 */,/*37727*/7980/* 121E2 */,/*37728*/7980/* 121E3 */, /*37729*/7980/* 121E4 */,/*37730*/7980/* 121E5 */,/*37731*/7980/* 121E6 */,/*37732*/7980/* 121E7 */, /*37733*/7980/* 121E8 */,/*37734*/7980/* 121E9 */,/*37735*/7980/* 121EA */,/*37736*/7980/* 121EB */, /*37737*/7980/* 121EC */,/*37738*/7980/* 121ED */,/*37739*/7980/* 121EE */,/*37740*/7980/* 121EF */, /*37741*/7980/* 121F0 */,/*37742*/7980/* 121F1 */,/*37743*/7980/* 121F2 */,/*37744*/7980/* 121F3 */, /*37745*/7980/* 121F4 */,/*37746*/7980/* 121F5 */,/*37747*/7980/* 121F6 */,/*37748*/7980/* 121F7 */, /*37749*/7980/* 121F8 */,/*37750*/7980/* 121F9 */,/*37751*/7980/* 121FA */,/*37752*/7980/* 121FB */, /*37753*/7980/* 121FC */,/*37754*/7980/* 121FD */,/*37755*/7980/* 121FE */,/*37756*/7980/* 121FF */, /*37757*/7980/* 12200 */,/*37758*/7980/* 12201 */,/*37759*/7980/* 12202 */,/*37760*/7980/* 12203 */, /*37761*/7980/* 12204 */,/*37762*/7980/* 12205 */,/*37763*/7980/* 12206 */,/*37764*/7980/* 12207 */, /*37765*/7980/* 12208 */,/*37766*/7980/* 12209 */,/*37767*/7980/* 1220A */,/*37768*/7980/* 1220B */, /*37769*/7980/* 1220C */,/*37770*/7980/* 1220D */,/*37771*/7980/* 1220E */,/*37772*/7980/* 1220F */, /*37773*/7980/* 12210 */,/*37774*/7980/* 12211 */,/*37775*/7980/* 12212 */,/*37776*/7980/* 12213 */, /*37777*/7980/* 12214 */,/*37778*/7980/* 12215 */,/*37779*/7980/* 12216 */,/*37780*/7980/* 12217 */, /*37781*/7980/* 12218 */,/*37782*/7980/* 12219 */,/*37783*/7980/* 1221A */,/*37784*/7980/* 1221B */, /*37785*/7980/* 1221C */,/*37786*/7980/* 1221D */,/*37787*/7980/* 1221E */,/*37788*/7980/* 1221F */, /*37789*/7980/* 12220 */,/*37790*/7980/* 12221 */,/*37791*/7980/* 12222 */,/*37792*/7980/* 12223 */, /*37793*/7980/* 12224 */,/*37794*/7980/* 12225 */,/*37795*/7980/* 12226 */,/*37796*/7980/* 12227 */, /*37797*/7980/* 12228 */,/*37798*/7980/* 12229 */,/*37799*/7980/* 1222A */,/*37800*/7980/* 1222B */, /*37801*/7980/* 1222C */,/*37802*/7980/* 1222D */,/*37803*/7980/* 1222E */,/*37804*/7980/* 1222F */, /*37805*/7980/* 12230 */,/*37806*/7980/* 12231 */,/*37807*/7980/* 12232 */,/*37808*/7980/* 12233 */, /*37809*/7980/* 12234 */,/*37810*/7980/* 12235 */,/*37811*/7980/* 12236 */,/*37812*/7980/* 12237 */, /*37813*/7980/* 12238 */,/*37814*/7980/* 12239 */,/*37815*/7980/* 1223A */,/*37816*/7980/* 1223B */, /*37817*/7980/* 1223C */,/*37818*/7980/* 1223D */,/*37819*/7980/* 1223E */,/*37820*/7980/* 1223F */, /*37821*/7980/* 12240 */,/*37822*/7980/* 12241 */,/*37823*/7980/* 12242 */,/*37824*/7980/* 12243 */, /*37825*/7980/* 12244 */,/*37826*/7980/* 12245 */,/*37827*/7980/* 12246 */,/*37828*/7980/* 12247 */, /*37829*/7980/* 12248 */,/*37830*/7980/* 12249 */,/*37831*/7980/* 1224A */,/*37832*/7980/* 1224B */, /*37833*/7980/* 1224C */,/*37834*/7980/* 1224D */,/*37835*/7980/* 1224E */,/*37836*/7980/* 1224F */, /*37837*/7980/* 12250 */,/*37838*/7980/* 12251 */,/*37839*/7980/* 12252 */,/*37840*/7980/* 12253 */, /*37841*/7980/* 12254 */,/*37842*/7980/* 12255 */,/*37843*/7980/* 12256 */,/*37844*/7980/* 12257 */, /*37845*/7980/* 12258 */,/*37846*/7980/* 12259 */,/*37847*/7980/* 1225A */,/*37848*/7980/* 1225B */, /*37849*/7980/* 1225C */,/*37850*/7980/* 1225D */,/*37851*/7980/* 1225E */,/*37852*/7980/* 1225F */, /*37853*/7980/* 12260 */,/*37854*/7980/* 12261 */,/*37855*/7980/* 12262 */,/*37856*/7980/* 12263 */, /*37857*/7980/* 12264 */,/*37858*/7980/* 12265 */,/*37859*/7980/* 12266 */,/*37860*/7980/* 12267 */, /*37861*/7980/* 12268 */,/*37862*/7980/* 12269 */,/*37863*/7980/* 1226A */,/*37864*/7980/* 1226B */, /*37865*/7980/* 1226C */,/*37866*/7980/* 1226D */,/*37867*/7980/* 1226E */,/*37868*/7980/* 1226F */, /*37869*/7980/* 12270 */,/*37870*/7980/* 12271 */,/*37871*/7980/* 12272 */,/*37872*/7980/* 12273 */, /*37873*/7980/* 12274 */,/*37874*/7980/* 12275 */,/*37875*/7980/* 12276 */,/*37876*/7980/* 12277 */, /*37877*/7980/* 12278 */,/*37878*/7980/* 12279 */,/*37879*/7980/* 1227A */,/*37880*/7980/* 1227B */, /*37881*/7980/* 1227C */,/*37882*/7980/* 1227D */,/*37883*/7980/* 1227E */,/*37884*/7980/* 1227F */, /*37885*/7980/* 12280 */,/*37886*/7980/* 12281 */,/*37887*/7980/* 12282 */,/*37888*/7980/* 12283 */, /*37889*/7980/* 12284 */,/*37890*/7980/* 12285 */,/*37891*/7980/* 12286 */,/*37892*/7980/* 12287 */, /*37893*/7980/* 12288 */,/*37894*/7980/* 12289 */,/*37895*/7980/* 1228A */,/*37896*/7980/* 1228B */, /*37897*/7980/* 1228C */,/*37898*/7980/* 1228D */,/*37899*/7980/* 1228E */,/*37900*/7980/* 1228F */, /*37901*/7980/* 12290 */,/*37902*/7980/* 12291 */,/*37903*/7980/* 12292 */,/*37904*/7980/* 12293 */, /*37905*/7980/* 12294 */,/*37906*/7980/* 12295 */,/*37907*/7980/* 12296 */,/*37908*/7980/* 12297 */, /*37909*/7980/* 12298 */,/*37910*/7980/* 12299 */,/*37911*/7980/* 1229A */,/*37912*/7980/* 1229B */, /*37913*/7980/* 1229C */,/*37914*/7980/* 1229D */,/*37915*/7980/* 1229E */,/*37916*/7980/* 1229F */, /*37917*/7980/* 122A0 */,/*37918*/7980/* 122A1 */,/*37919*/7980/* 122A2 */,/*37920*/7980/* 122A3 */, /*37921*/7980/* 122A4 */,/*37922*/7980/* 122A5 */,/*37923*/7980/* 122A6 */,/*37924*/7980/* 122A7 */, /*37925*/7980/* 122A8 */,/*37926*/7980/* 122A9 */,/*37927*/7980/* 122AA */,/*37928*/7980/* 122AB */, /*37929*/7980/* 122AC */,/*37930*/7980/* 122AD */,/*37931*/7980/* 122AE */,/*37932*/7980/* 122AF */, /*37933*/7980/* 122B0 */,/*37934*/7980/* 122B1 */,/*37935*/7980/* 122B2 */,/*37936*/7980/* 122B3 */, /*37937*/7980/* 122B4 */,/*37938*/7980/* 122B5 */,/*37939*/7980/* 122B6 */,/*37940*/7980/* 122B7 */, /*37941*/7980/* 122B8 */,/*37942*/7980/* 122B9 */,/*37943*/7980/* 122BA */,/*37944*/7980/* 122BB */, /*37945*/7980/* 122BC */,/*37946*/7980/* 122BD */,/*37947*/7980/* 122BE */,/*37948*/7980/* 122BF */, /*37949*/7980/* 122C0 */,/*37950*/7980/* 122C1 */,/*37951*/7980/* 122C2 */,/*37952*/7980/* 122C3 */, /*37953*/7980/* 122C4 */,/*37954*/7980/* 122C5 */,/*37955*/7980/* 122C6 */,/*37956*/7980/* 122C7 */, /*37957*/7980/* 122C8 */,/*37958*/7980/* 122C9 */,/*37959*/7980/* 122CA */,/*37960*/7980/* 122CB */, /*37961*/7980/* 122CC */,/*37962*/7980/* 122CD */,/*37963*/7980/* 122CE */,/*37964*/7980/* 122CF */, /*37965*/7980/* 122D0 */,/*37966*/7980/* 122D1 */,/*37967*/7980/* 122D2 */,/*37968*/7980/* 122D3 */, /*37969*/7980/* 122D4 */,/*37970*/7980/* 122D5 */,/*37971*/7980/* 122D6 */,/*37972*/7980/* 122D7 */, /*37973*/7980/* 122D8 */,/*37974*/7980/* 122D9 */,/*37975*/7980/* 122DA */,/*37976*/7980/* 122DB */, /*37977*/7980/* 122DC */,/*37978*/7980/* 122DD */,/*37979*/7980/* 122DE */,/*37980*/7980/* 122DF */, /*37981*/7980/* 122E0 */,/*37982*/7980/* 122E1 */,/*37983*/7980/* 122E2 */,/*37984*/7980/* 122E3 */, /*37985*/7980/* 122E4 */,/*37986*/7980/* 122E5 */,/*37987*/7980/* 122E6 */,/*37988*/7980/* 122E7 */, /*37989*/7980/* 122E8 */,/*37990*/7980/* 122E9 */,/*37991*/7980/* 122EA */,/*37992*/7980/* 122EB */, /*37993*/7980/* 122EC */,/*37994*/7980/* 122ED */,/*37995*/7980/* 122EE */,/*37996*/7980/* 122EF */, /*37997*/7980/* 122F0 */,/*37998*/7980/* 122F1 */,/*37999*/7980/* 122F2 */,/*38000*/7980/* 122F3 */, /*38001*/7980/* 122F4 */,/*38002*/7980/* 122F5 */,/*38003*/7980/* 122F6 */,/*38004*/7980/* 122F7 */, /*38005*/7980/* 122F8 */,/*38006*/7980/* 122F9 */,/*38007*/7980/* 122FA */,/*38008*/7980/* 122FB */, /*38009*/7980/* 122FC */,/*38010*/7980/* 122FD */,/*38011*/7980/* 122FE */,/*38012*/7980/* 122FF */, /*38013*/7980/* 12300 */,/*38014*/7980/* 12301 */,/*38015*/7980/* 12302 */,/*38016*/7980/* 12303 */, /*38017*/7980/* 12304 */,/*38018*/7980/* 12305 */,/*38019*/7980/* 12306 */,/*38020*/7980/* 12307 */, /*38021*/7980/* 12308 */,/*38022*/7980/* 12309 */,/*38023*/7980/* 1230A */,/*38024*/7980/* 1230B */, /*38025*/7980/* 1230C */,/*38026*/7980/* 1230D */,/*38027*/7980/* 1230E */,/*38028*/7980/* 1230F */, /*38029*/7980/* 12310 */,/*38030*/7980/* 12311 */,/*38031*/7980/* 12312 */,/*38032*/7980/* 12313 */, /*38033*/7980/* 12314 */,/*38034*/7980/* 12315 */,/*38035*/7980/* 12316 */,/*38036*/7980/* 12317 */, /*38037*/7980/* 12318 */,/*38038*/7980/* 12319 */,/*38039*/7980/* 1231A */,/*38040*/7980/* 1231B */, /*38041*/7980/* 1231C */,/*38042*/7980/* 1231D */,/*38043*/7980/* 1231E */,/*38044*/7980/* 1231F */, /*38045*/7980/* 12320 */,/*38046*/7980/* 12321 */,/*38047*/7980/* 12322 */,/*38048*/7980/* 12323 */, /*38049*/7980/* 12324 */,/*38050*/7980/* 12325 */,/*38051*/7980/* 12326 */,/*38052*/7980/* 12327 */, /*38053*/7980/* 12328 */,/*38054*/7980/* 12329 */,/*38055*/7980/* 1232A */,/*38056*/7980/* 1232B */, /*38057*/7980/* 1232C */,/*38058*/7980/* 1232D */,/*38059*/7980/* 1232E */,/*38060*/7980/* 1232F */, /*38061*/7980/* 12330 */,/*38062*/7980/* 12331 */,/*38063*/7980/* 12332 */,/*38064*/7980/* 12333 */, /*38065*/7980/* 12334 */,/*38066*/7980/* 12335 */,/*38067*/7980/* 12336 */,/*38068*/7980/* 12337 */, /*38069*/7980/* 12338 */,/*38070*/7980/* 12339 */,/*38071*/7980/* 1233A */,/*38072*/7980/* 1233B */, /*38073*/7980/* 1233C */,/*38074*/7980/* 1233D */,/*38075*/7980/* 1233E */,/*38076*/7980/* 1233F */, /*38077*/7980/* 12340 */,/*38078*/7980/* 12341 */,/*38079*/7980/* 12342 */,/*38080*/7980/* 12343 */, /*38081*/7980/* 12344 */,/*38082*/7980/* 12345 */,/*38083*/7980/* 12346 */,/*38084*/7980/* 12347 */, /*38085*/7980/* 12348 */,/*38086*/7980/* 12349 */,/*38087*/7980/* 1234A */,/*38088*/7980/* 1234B */, /*38089*/7980/* 1234C */,/*38090*/7980/* 1234D */,/*38091*/7980/* 1234E */,/*38092*/7980/* 1234F */, /*38093*/7980/* 12350 */,/*38094*/7980/* 12351 */,/*38095*/7980/* 12352 */,/*38096*/7980/* 12353 */, /*38097*/7980/* 12354 */,/*38098*/7980/* 12355 */,/*38099*/7980/* 12356 */,/*38100*/7980/* 12357 */, /*38101*/7980/* 12358 */,/*38102*/7980/* 12359 */,/*38103*/7980/* 1235A */,/*38104*/7980/* 1235B */, /*38105*/7980/* 1235C */,/*38106*/7980/* 1235D */,/*38107*/7980/* 1235E */,/*38108*/7980/* 1235F */, /*38109*/7980/* 12360 */,/*38110*/7980/* 12361 */,/*38111*/7980/* 12362 */,/*38112*/7980/* 12363 */, /*38113*/7980/* 12364 */,/*38114*/7980/* 12365 */,/*38115*/7980/* 12366 */,/*38116*/7980/* 12367 */, /*38117*/7980/* 12368 */,/*38118*/7980/* 12369 */,/*38119*/7980/* 1236A */,/*38120*/7980/* 1236B */, /*38121*/7980/* 1236C */,/*38122*/7980/* 1236D */,/*38123*/7980/* 1236E */,/*38124*/7981/* 1236F */, /*38125*/7981/* 12370 */,/*38126*/7981/* 12371 */,/*38127*/7981/* 12372 */,/*38128*/7981/* 12373 */, /*38129*/7981/* 12374 */,/*38130*/7981/* 12375 */,/*38131*/7981/* 12376 */,/*38132*/7981/* 12377 */, /*38133*/7981/* 12378 */,/*38134*/7981/* 12379 */,/*38135*/7981/* 1237A */,/*38136*/7981/* 1237B */, /*38137*/7981/* 1237C */,/*38138*/7981/* 1237D */,/*38139*/7981/* 1237E */,/*38140*/7981/* 1237F */, /*38141*/7981/* 12380 */,/*38142*/7981/* 12381 */,/*38143*/7981/* 12382 */,/*38144*/7981/* 12383 */, /*38145*/7981/* 12384 */,/*38146*/7981/* 12385 */,/*38147*/7981/* 12386 */,/*38148*/7981/* 12387 */, /*38149*/7981/* 12388 */,/*38150*/7981/* 12389 */,/*38151*/7981/* 1238A */,/*38152*/7981/* 1238B */, /*38153*/7981/* 1238C */,/*38154*/7981/* 1238D */,/*38155*/7981/* 1238E */,/*38156*/7981/* 1238F */, /*38157*/7981/* 12390 */,/*38158*/7981/* 12391 */,/*38159*/7981/* 12392 */,/*38160*/7981/* 12393 */, /*38161*/7981/* 12394 */,/*38162*/7981/* 12395 */,/*38163*/7981/* 12396 */,/*38164*/7981/* 12397 */, /*38165*/7981/* 12398 */,/*38166*/7982/* 12399 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,/*38269*/7983/* 12400 */,/*38270*/7984/* 12401 */,/*38271*/7985/* 12402 */,/*38272*/7986/* 12403 */, /*38273*/7987/* 12404 */,/*38274*/7988/* 12405 */,/*38275*/7989/* 12406 */,/*38276*/7990/* 12407 */, /*38277*/7984/* 12408 */,/*38278*/7985/* 12409 */,/*38279*/7986/* 1240A */,/*38280*/7987/* 1240B */, /*38281*/7988/* 1240C */,/*38282*/7989/* 1240D */,/*38283*/7990/* 1240E */,/*38284*/7985/* 1240F */, /*38285*/7986/* 12410 */,/*38286*/7987/* 12411 */,/*38287*/7988/* 12412 */,/*38288*/7989/* 12413 */, /*38289*/7990/* 12414 */,/*38290*/7991/* 12415 */,/*38291*/7983/* 12416 */,/*38292*/7984/* 12417 */, /*38293*/7985/* 12418 */,/*38294*/7986/* 12419 */,/*38295*/7987/* 1241A */,/*38296*/7988/* 1241B */, /*38297*/7989/* 1241C */,/*38298*/7990/* 1241D */,/*38299*/7991/* 1241E */,/*38300*/7983/* 1241F */, /*38301*/7984/* 12420 */,/*38302*/7985/* 12421 */,/*38303*/7986/* 12422 */,/*38304*/7983/* 12423 */, /*38305*/7984/* 12424 */,/*38306*/7984/* 12425 */,/*38307*/7985/* 12426 */,/*38308*/7986/* 12427 */, /*38309*/7987/* 12428 */,/*38310*/7988/* 12429 */,/*38311*/7989/* 1242A */,/*38312*/7990/* 1242B */, /*38313*/7991/* 1242C */,/*38314*/7983/* 1242D */,/*38315*/7984/* 1242E */,/*38316*/7984/* 1242F */, /*38317*/7985/* 12430 */,/*38318*/7986/* 12431 */,/*38319*/7992/* 12432 */,/*38320*/7993/* 12433 */, /*38321*/7991/* 12434 */,/*38322*/7983/* 12435 */,/*38323*/7984/* 12436 */,/*38324*/7984/* 12437 */, /*38325*/7985/* 12438 */,/*38326*/7986/* 12439 */,/*38327*/7984/* 1243A */,/*38328*/7984/* 1243B */, /*38329*/7985/* 1243C */,/*38330*/7985/* 1243D */,/*38331*/7985/* 1243E */,/*38332*/7985/* 1243F */, /*38333*/7987/* 12440 */,/*38334*/7988/* 12441 */,/*38335*/7988/* 12442 */,/*38336*/7988/* 12443 */, /*38337*/7989/* 12444 */,/*38338*/7989/* 12445 */,/*38339*/7990/* 12446 */,/*38340*/7990/* 12447 */, /*38341*/7990/* 12448 */,/*38342*/7990/* 12449 */,/*38343*/7983/* 1244A */,/*38344*/7984/* 1244B */, /*38345*/7985/* 1244C */,/*38346*/7986/* 1244D */,/*38347*/7987/* 1244E */,/*38348*/7991/* 1244F */, /*38349*/7983/* 12450 */,/*38350*/7984/* 12451 */,/*38351*/7985/* 12452 */,/*38352*/7985/* 12453 */, /*38353*/7986/* 12454 */,/*38354*/7986/* 12455 */,/*38355*/7983/* 12456 */,/*38356*/7984/* 12457 */, /*38357*/7991/* 12458 */,/*38358*/7983/* 12459 */,/*38359*/7994/* 1245A */,/*38360*/7995/* 1245B */, /*38361*/7996/* 1245C */,/*38362*/7994/* 1245D */,/*38363*/7995/* 1245E */,/*38364*/7997/* 1245F */, /*38365*/7998/* 12460 */,/*38366*/7999/* 12461 */,/*38367*/7998/* 12462 */,/*38368*/8000/* 12463 */, /*38369*/8001/* 12464 */,/*38370*/8002/* 12465 */,/*38371*/8003/* 12466 */,/*38372*/8004/* 12467 */, /*38373*/8005/* 12468 */,/*38374*/8006/* 12469 */,/*38375*/8007/* 1246A */,/*38376*/8008/* 1246B */, /*38377*/8009/* 1246C */,/*38378*/8010/* 1246D */,/*38379*/8011/* 1246E */,0,/*38381*/8012/* 12470 */, /*38382*/8012/* 12471 */,/*38383*/8012/* 12472 */,/*38384*/8012/* 12473 */,/*38385*/8013/* 12474 */,0,0,0,0,0,0,0,0,0,0, 0,/*38397*/8014/* 12480 */,/*38398*/8014/* 12481 */,/*38399*/8014/* 12482 */,/*38400*/8014/* 12483 */, /*38401*/8014/* 12484 */,/*38402*/8014/* 12485 */,/*38403*/8014/* 12486 */,/*38404*/8014/* 12487 */, /*38405*/8014/* 12488 */,/*38406*/8014/* 12489 */,/*38407*/8014/* 1248A */,/*38408*/8014/* 1248B */, /*38409*/8014/* 1248C */,/*38410*/8014/* 1248D */,/*38411*/8014/* 1248E */,/*38412*/8014/* 1248F */, /*38413*/8014/* 12490 */,/*38414*/8014/* 12491 */,/*38415*/8014/* 12492 */,/*38416*/8014/* 12493 */, /*38417*/8014/* 12494 */,/*38418*/8014/* 12495 */,/*38419*/8014/* 12496 */,/*38420*/8014/* 12497 */, /*38421*/8014/* 12498 */,/*38422*/8014/* 12499 */,/*38423*/8014/* 1249A */,/*38424*/8014/* 1249B */, /*38425*/8014/* 1249C */,/*38426*/8014/* 1249D */,/*38427*/8014/* 1249E */,/*38428*/8014/* 1249F */, /*38429*/8014/* 124A0 */,/*38430*/8014/* 124A1 */,/*38431*/8014/* 124A2 */,/*38432*/8014/* 124A3 */, /*38433*/8014/* 124A4 */,/*38434*/8014/* 124A5 */,/*38435*/8014/* 124A6 */,/*38436*/8014/* 124A7 */, /*38437*/8014/* 124A8 */,/*38438*/8014/* 124A9 */,/*38439*/8014/* 124AA */,/*38440*/8014/* 124AB */, /*38441*/8014/* 124AC */,/*38442*/8014/* 124AD */,/*38443*/8014/* 124AE */,/*38444*/8014/* 124AF */, /*38445*/8014/* 124B0 */,/*38446*/8014/* 124B1 */,/*38447*/8014/* 124B2 */,/*38448*/8014/* 124B3 */, /*38449*/8014/* 124B4 */,/*38450*/8014/* 124B5 */,/*38451*/8014/* 124B6 */,/*38452*/8014/* 124B7 */, /*38453*/8014/* 124B8 */,/*38454*/8014/* 124B9 */,/*38455*/8014/* 124BA */,/*38456*/8014/* 124BB */, /*38457*/8014/* 124BC */,/*38458*/8014/* 124BD */,/*38459*/8014/* 124BE */,/*38460*/8014/* 124BF */, /*38461*/8014/* 124C0 */,/*38462*/8014/* 124C1 */,/*38463*/8014/* 124C2 */,/*38464*/8014/* 124C3 */, /*38465*/8014/* 124C4 */,/*38466*/8014/* 124C5 */,/*38467*/8014/* 124C6 */,/*38468*/8014/* 124C7 */, /*38469*/8014/* 124C8 */,/*38470*/8014/* 124C9 */,/*38471*/8014/* 124CA */,/*38472*/8014/* 124CB */, /*38473*/8014/* 124CC */,/*38474*/8014/* 124CD */,/*38475*/8014/* 124CE */,/*38476*/8014/* 124CF */, /*38477*/8014/* 124D0 */,/*38478*/8014/* 124D1 */,/*38479*/8014/* 124D2 */,/*38480*/8014/* 124D3 */, /*38481*/8014/* 124D4 */,/*38482*/8014/* 124D5 */,/*38483*/8014/* 124D6 */,/*38484*/8014/* 124D7 */, /*38485*/8014/* 124D8 */,/*38486*/8014/* 124D9 */,/*38487*/8014/* 124DA */,/*38488*/8014/* 124DB */, /*38489*/8014/* 124DC */,/*38490*/8014/* 124DD */,/*38491*/8014/* 124DE */,/*38492*/8014/* 124DF */, /*38493*/8014/* 124E0 */,/*38494*/8014/* 124E1 */,/*38495*/8014/* 124E2 */,/*38496*/8014/* 124E3 */, /*38497*/8014/* 124E4 */,/*38498*/8014/* 124E5 */,/*38499*/8014/* 124E6 */,/*38500*/8014/* 124E7 */, /*38501*/8014/* 124E8 */,/*38502*/8014/* 124E9 */,/*38503*/8014/* 124EA */,/*38504*/8014/* 124EB */, /*38505*/8014/* 124EC */,/*38506*/8014/* 124ED */,/*38507*/8014/* 124EE */,/*38508*/8014/* 124EF */, /*38509*/8014/* 124F0 */,/*38510*/8014/* 124F1 */,/*38511*/8014/* 124F2 */,/*38512*/8014/* 124F3 */, /*38513*/8014/* 124F4 */,/*38514*/8014/* 124F5 */,/*38515*/8014/* 124F6 */,/*38516*/8014/* 124F7 */, /*38517*/8014/* 124F8 */,/*38518*/8014/* 124F9 */,/*38519*/8014/* 124FA */,/*38520*/8014/* 124FB */, /*38521*/8014/* 124FC */,/*38522*/8014/* 124FD */,/*38523*/8014/* 124FE */,/*38524*/8014/* 124FF */, /*38525*/8014/* 12500 */,/*38526*/8014/* 12501 */,/*38527*/8014/* 12502 */,/*38528*/8014/* 12503 */, /*38529*/8014/* 12504 */,/*38530*/8014/* 12505 */,/*38531*/8014/* 12506 */,/*38532*/8014/* 12507 */, /*38533*/8014/* 12508 */,/*38534*/8014/* 12509 */,/*38535*/8014/* 1250A */,/*38536*/8014/* 1250B */, /*38537*/8014/* 1250C */,/*38538*/8014/* 1250D */,/*38539*/8014/* 1250E */,/*38540*/8014/* 1250F */, /*38541*/8014/* 12510 */,/*38542*/8014/* 12511 */,/*38543*/8014/* 12512 */,/*38544*/8014/* 12513 */, /*38545*/8014/* 12514 */,/*38546*/8014/* 12515 */,/*38547*/8014/* 12516 */,/*38548*/8014/* 12517 */, /*38549*/8014/* 12518 */,/*38550*/8014/* 12519 */,/*38551*/8014/* 1251A */,/*38552*/8014/* 1251B */, /*38553*/8014/* 1251C */,/*38554*/8014/* 1251D */,/*38555*/8014/* 1251E */,/*38556*/8014/* 1251F */, /*38557*/8014/* 12520 */,/*38558*/8014/* 12521 */,/*38559*/8014/* 12522 */,/*38560*/8014/* 12523 */, /*38561*/8014/* 12524 */,/*38562*/8014/* 12525 */,/*38563*/8014/* 12526 */,/*38564*/8014/* 12527 */, /*38565*/8014/* 12528 */,/*38566*/8014/* 12529 */,/*38567*/8014/* 1252A */,/*38568*/8014/* 1252B */, /*38569*/8014/* 1252C */,/*38570*/8014/* 1252D */,/*38571*/8014/* 1252E */,/*38572*/8014/* 1252F */, /*38573*/8014/* 12530 */,/*38574*/8014/* 12531 */,/*38575*/8014/* 12532 */,/*38576*/8014/* 12533 */, /*38577*/8014/* 12534 */,/*38578*/8014/* 12535 */,/*38579*/8014/* 12536 */,/*38580*/8014/* 12537 */, /*38581*/8014/* 12538 */,/*38582*/8014/* 12539 */,/*38583*/8014/* 1253A */,/*38584*/8014/* 1253B */, /*38585*/8014/* 1253C */,/*38586*/8014/* 1253D */,/*38587*/8014/* 1253E */,/*38588*/8014/* 1253F */, /*38589*/8014/* 12540 */,/*38590*/8014/* 12541 */,/*38591*/8014/* 12542 */,/*38592*/8014/* 12543 */, /*38593*/8015/* 13000 */,/*38594*/8015/* 13001 */,/*38595*/8015/* 13002 */,/*38596*/8015/* 13003 */, /*38597*/8015/* 13004 */,/*38598*/8015/* 13005 */,/*38599*/8015/* 13006 */,/*38600*/8015/* 13007 */, /*38601*/8015/* 13008 */,/*38602*/8015/* 13009 */,/*38603*/8015/* 1300A */,/*38604*/8015/* 1300B */, /*38605*/8015/* 1300C */,/*38606*/8015/* 1300D */,/*38607*/8015/* 1300E */,/*38608*/8015/* 1300F */, /*38609*/8015/* 13010 */,/*38610*/8015/* 13011 */,/*38611*/8015/* 13012 */,/*38612*/8015/* 13013 */, /*38613*/8015/* 13014 */,/*38614*/8015/* 13015 */,/*38615*/8015/* 13016 */,/*38616*/8015/* 13017 */, /*38617*/8015/* 13018 */,/*38618*/8015/* 13019 */,/*38619*/8015/* 1301A */,/*38620*/8015/* 1301B */, /*38621*/8015/* 1301C */,/*38622*/8015/* 1301D */,/*38623*/8015/* 1301E */,/*38624*/8015/* 1301F */, /*38625*/8015/* 13020 */,/*38626*/8015/* 13021 */,/*38627*/8015/* 13022 */,/*38628*/8015/* 13023 */, /*38629*/8015/* 13024 */,/*38630*/8015/* 13025 */,/*38631*/8015/* 13026 */,/*38632*/8015/* 13027 */, /*38633*/8015/* 13028 */,/*38634*/8015/* 13029 */,/*38635*/8015/* 1302A */,/*38636*/8015/* 1302B */, /*38637*/8015/* 1302C */,/*38638*/8015/* 1302D */,/*38639*/8015/* 1302E */,/*38640*/8015/* 1302F */, /*38641*/8015/* 13030 */,/*38642*/8015/* 13031 */,/*38643*/8015/* 13032 */,/*38644*/8015/* 13033 */, /*38645*/8015/* 13034 */,/*38646*/8015/* 13035 */,/*38647*/8015/* 13036 */,/*38648*/8015/* 13037 */, /*38649*/8015/* 13038 */,/*38650*/8015/* 13039 */,/*38651*/8015/* 1303A */,/*38652*/8015/* 1303B */, /*38653*/8015/* 1303C */,/*38654*/8015/* 1303D */,/*38655*/8015/* 1303E */,/*38656*/8015/* 1303F */, /*38657*/8015/* 13040 */,/*38658*/8015/* 13041 */,/*38659*/8015/* 13042 */,/*38660*/8015/* 13043 */, /*38661*/8015/* 13044 */,/*38662*/8015/* 13045 */,/*38663*/8015/* 13046 */,/*38664*/8015/* 13047 */, /*38665*/8015/* 13048 */,/*38666*/8015/* 13049 */,/*38667*/8015/* 1304A */,/*38668*/8015/* 1304B */, /*38669*/8015/* 1304C */,/*38670*/8015/* 1304D */,/*38671*/8015/* 1304E */,/*38672*/8015/* 1304F */, /*38673*/8015/* 13050 */,/*38674*/8015/* 13051 */,/*38675*/8015/* 13052 */,/*38676*/8015/* 13053 */, /*38677*/8015/* 13054 */,/*38678*/8015/* 13055 */,/*38679*/8015/* 13056 */,/*38680*/8015/* 13057 */, /*38681*/8015/* 13058 */,/*38682*/8015/* 13059 */,/*38683*/8015/* 1305A */,/*38684*/8015/* 1305B */, /*38685*/8015/* 1305C */,/*38686*/8015/* 1305D */,/*38687*/8015/* 1305E */,/*38688*/8015/* 1305F */, /*38689*/8015/* 13060 */,/*38690*/8015/* 13061 */,/*38691*/8015/* 13062 */,/*38692*/8015/* 13063 */, /*38693*/8015/* 13064 */,/*38694*/8015/* 13065 */,/*38695*/8015/* 13066 */,/*38696*/8015/* 13067 */, /*38697*/8015/* 13068 */,/*38698*/8015/* 13069 */,/*38699*/8015/* 1306A */,/*38700*/8015/* 1306B */, /*38701*/8015/* 1306C */,/*38702*/8015/* 1306D */,/*38703*/8015/* 1306E */,/*38704*/8015/* 1306F */, /*38705*/8015/* 13070 */,/*38706*/8015/* 13071 */,/*38707*/8015/* 13072 */,/*38708*/8015/* 13073 */, /*38709*/8015/* 13074 */,/*38710*/8015/* 13075 */,/*38711*/8015/* 13076 */,/*38712*/8015/* 13077 */, /*38713*/8015/* 13078 */,/*38714*/8015/* 13079 */,/*38715*/8015/* 1307A */,/*38716*/8015/* 1307B */, /*38717*/8015/* 1307C */,/*38718*/8015/* 1307D */,/*38719*/8015/* 1307E */,/*38720*/8015/* 1307F */, /*38721*/8015/* 13080 */,/*38722*/8015/* 13081 */,/*38723*/8015/* 13082 */,/*38724*/8015/* 13083 */, /*38725*/8015/* 13084 */,/*38726*/8015/* 13085 */,/*38727*/8015/* 13086 */,/*38728*/8015/* 13087 */, /*38729*/8015/* 13088 */,/*38730*/8015/* 13089 */,/*38731*/8015/* 1308A */,/*38732*/8015/* 1308B */, /*38733*/8015/* 1308C */,/*38734*/8015/* 1308D */,/*38735*/8015/* 1308E */,/*38736*/8015/* 1308F */, /*38737*/8015/* 13090 */,/*38738*/8015/* 13091 */,/*38739*/8015/* 13092 */,/*38740*/8015/* 13093 */, /*38741*/8015/* 13094 */,/*38742*/8015/* 13095 */,/*38743*/8015/* 13096 */,/*38744*/8015/* 13097 */, /*38745*/8015/* 13098 */,/*38746*/8015/* 13099 */,/*38747*/8015/* 1309A */,/*38748*/8015/* 1309B */, /*38749*/8015/* 1309C */,/*38750*/8015/* 1309D */,/*38751*/8015/* 1309E */,/*38752*/8015/* 1309F */, /*38753*/8015/* 130A0 */,/*38754*/8015/* 130A1 */,/*38755*/8015/* 130A2 */,/*38756*/8015/* 130A3 */, /*38757*/8015/* 130A4 */,/*38758*/8015/* 130A5 */,/*38759*/8015/* 130A6 */,/*38760*/8015/* 130A7 */, /*38761*/8015/* 130A8 */,/*38762*/8015/* 130A9 */,/*38763*/8015/* 130AA */,/*38764*/8015/* 130AB */, /*38765*/8015/* 130AC */,/*38766*/8015/* 130AD */,/*38767*/8015/* 130AE */,/*38768*/8015/* 130AF */, /*38769*/8015/* 130B0 */,/*38770*/8015/* 130B1 */,/*38771*/8015/* 130B2 */,/*38772*/8015/* 130B3 */, /*38773*/8015/* 130B4 */,/*38774*/8015/* 130B5 */,/*38775*/8015/* 130B6 */,/*38776*/8015/* 130B7 */, /*38777*/8015/* 130B8 */,/*38778*/8015/* 130B9 */,/*38779*/8015/* 130BA */,/*38780*/8015/* 130BB */, /*38781*/8015/* 130BC */,/*38782*/8015/* 130BD */,/*38783*/8015/* 130BE */,/*38784*/8015/* 130BF */, /*38785*/8015/* 130C0 */,/*38786*/8015/* 130C1 */,/*38787*/8015/* 130C2 */,/*38788*/8015/* 130C3 */, /*38789*/8015/* 130C4 */,/*38790*/8015/* 130C5 */,/*38791*/8015/* 130C6 */,/*38792*/8015/* 130C7 */, /*38793*/8015/* 130C8 */,/*38794*/8015/* 130C9 */,/*38795*/8015/* 130CA */,/*38796*/8015/* 130CB */, /*38797*/8015/* 130CC */,/*38798*/8015/* 130CD */,/*38799*/8015/* 130CE */,/*38800*/8015/* 130CF */, /*38801*/8015/* 130D0 */,/*38802*/8015/* 130D1 */,/*38803*/8015/* 130D2 */,/*38804*/8015/* 130D3 */, /*38805*/8015/* 130D4 */,/*38806*/8015/* 130D5 */,/*38807*/8015/* 130D6 */,/*38808*/8015/* 130D7 */, /*38809*/8015/* 130D8 */,/*38810*/8015/* 130D9 */,/*38811*/8015/* 130DA */,/*38812*/8015/* 130DB */, /*38813*/8015/* 130DC */,/*38814*/8015/* 130DD */,/*38815*/8015/* 130DE */,/*38816*/8015/* 130DF */, /*38817*/8015/* 130E0 */,/*38818*/8015/* 130E1 */,/*38819*/8015/* 130E2 */,/*38820*/8015/* 130E3 */, /*38821*/8015/* 130E4 */,/*38822*/8015/* 130E5 */,/*38823*/8015/* 130E6 */,/*38824*/8015/* 130E7 */, /*38825*/8015/* 130E8 */,/*38826*/8015/* 130E9 */,/*38827*/8015/* 130EA */,/*38828*/8015/* 130EB */, /*38829*/8015/* 130EC */,/*38830*/8015/* 130ED */,/*38831*/8015/* 130EE */,/*38832*/8015/* 130EF */, /*38833*/8015/* 130F0 */,/*38834*/8015/* 130F1 */,/*38835*/8015/* 130F2 */,/*38836*/8015/* 130F3 */, /*38837*/8015/* 130F4 */,/*38838*/8015/* 130F5 */,/*38839*/8015/* 130F6 */,/*38840*/8015/* 130F7 */, /*38841*/8015/* 130F8 */,/*38842*/8015/* 130F9 */,/*38843*/8015/* 130FA */,/*38844*/8015/* 130FB */, /*38845*/8015/* 130FC */,/*38846*/8015/* 130FD */,/*38847*/8015/* 130FE */,/*38848*/8015/* 130FF */, /*38849*/8015/* 13100 */,/*38850*/8015/* 13101 */,/*38851*/8015/* 13102 */,/*38852*/8015/* 13103 */, /*38853*/8015/* 13104 */,/*38854*/8015/* 13105 */,/*38855*/8015/* 13106 */,/*38856*/8015/* 13107 */, /*38857*/8015/* 13108 */,/*38858*/8015/* 13109 */,/*38859*/8015/* 1310A */,/*38860*/8015/* 1310B */, /*38861*/8015/* 1310C */,/*38862*/8015/* 1310D */,/*38863*/8015/* 1310E */,/*38864*/8015/* 1310F */, /*38865*/8015/* 13110 */,/*38866*/8015/* 13111 */,/*38867*/8015/* 13112 */,/*38868*/8015/* 13113 */, /*38869*/8015/* 13114 */,/*38870*/8015/* 13115 */,/*38871*/8015/* 13116 */,/*38872*/8015/* 13117 */, /*38873*/8015/* 13118 */,/*38874*/8015/* 13119 */,/*38875*/8015/* 1311A */,/*38876*/8015/* 1311B */, /*38877*/8015/* 1311C */,/*38878*/8015/* 1311D */,/*38879*/8015/* 1311E */,/*38880*/8015/* 1311F */, /*38881*/8015/* 13120 */,/*38882*/8015/* 13121 */,/*38883*/8015/* 13122 */,/*38884*/8015/* 13123 */, /*38885*/8015/* 13124 */,/*38886*/8015/* 13125 */,/*38887*/8015/* 13126 */,/*38888*/8015/* 13127 */, /*38889*/8015/* 13128 */,/*38890*/8015/* 13129 */,/*38891*/8015/* 1312A */,/*38892*/8015/* 1312B */, /*38893*/8015/* 1312C */,/*38894*/8015/* 1312D */,/*38895*/8015/* 1312E */,/*38896*/8015/* 1312F */, /*38897*/8015/* 13130 */,/*38898*/8015/* 13131 */,/*38899*/8015/* 13132 */,/*38900*/8015/* 13133 */, /*38901*/8015/* 13134 */,/*38902*/8015/* 13135 */,/*38903*/8015/* 13136 */,/*38904*/8015/* 13137 */, /*38905*/8015/* 13138 */,/*38906*/8015/* 13139 */,/*38907*/8015/* 1313A */,/*38908*/8015/* 1313B */, /*38909*/8015/* 1313C */,/*38910*/8015/* 1313D */,/*38911*/8015/* 1313E */,/*38912*/8015/* 1313F */, /*38913*/8015/* 13140 */,/*38914*/8015/* 13141 */,/*38915*/8015/* 13142 */,/*38916*/8015/* 13143 */, /*38917*/8015/* 13144 */,/*38918*/8015/* 13145 */,/*38919*/8015/* 13146 */,/*38920*/8015/* 13147 */, /*38921*/8015/* 13148 */,/*38922*/8015/* 13149 */,/*38923*/8015/* 1314A */,/*38924*/8015/* 1314B */, /*38925*/8015/* 1314C */,/*38926*/8015/* 1314D */,/*38927*/8015/* 1314E */,/*38928*/8015/* 1314F */, /*38929*/8015/* 13150 */,/*38930*/8015/* 13151 */,/*38931*/8015/* 13152 */,/*38932*/8015/* 13153 */, /*38933*/8015/* 13154 */,/*38934*/8015/* 13155 */,/*38935*/8015/* 13156 */,/*38936*/8015/* 13157 */, /*38937*/8015/* 13158 */,/*38938*/8015/* 13159 */,/*38939*/8015/* 1315A */,/*38940*/8015/* 1315B */, /*38941*/8015/* 1315C */,/*38942*/8015/* 1315D */,/*38943*/8015/* 1315E */,/*38944*/8015/* 1315F */, /*38945*/8015/* 13160 */,/*38946*/8015/* 13161 */,/*38947*/8015/* 13162 */,/*38948*/8015/* 13163 */, /*38949*/8015/* 13164 */,/*38950*/8015/* 13165 */,/*38951*/8015/* 13166 */,/*38952*/8015/* 13167 */, /*38953*/8015/* 13168 */,/*38954*/8015/* 13169 */,/*38955*/8015/* 1316A */,/*38956*/8015/* 1316B */, /*38957*/8015/* 1316C */,/*38958*/8015/* 1316D */,/*38959*/8015/* 1316E */,/*38960*/8015/* 1316F */, /*38961*/8015/* 13170 */,/*38962*/8015/* 13171 */,/*38963*/8015/* 13172 */,/*38964*/8015/* 13173 */, /*38965*/8015/* 13174 */,/*38966*/8015/* 13175 */,/*38967*/8015/* 13176 */,/*38968*/8015/* 13177 */, /*38969*/8015/* 13178 */,/*38970*/8015/* 13179 */,/*38971*/8015/* 1317A */,/*38972*/8015/* 1317B */, /*38973*/8015/* 1317C */,/*38974*/8015/* 1317D */,/*38975*/8015/* 1317E */,/*38976*/8015/* 1317F */, /*38977*/8015/* 13180 */,/*38978*/8015/* 13181 */,/*38979*/8015/* 13182 */,/*38980*/8015/* 13183 */, /*38981*/8015/* 13184 */,/*38982*/8015/* 13185 */,/*38983*/8015/* 13186 */,/*38984*/8015/* 13187 */, /*38985*/8015/* 13188 */,/*38986*/8015/* 13189 */,/*38987*/8015/* 1318A */,/*38988*/8015/* 1318B */, /*38989*/8015/* 1318C */,/*38990*/8015/* 1318D */,/*38991*/8015/* 1318E */,/*38992*/8015/* 1318F */, /*38993*/8015/* 13190 */,/*38994*/8015/* 13191 */,/*38995*/8015/* 13192 */,/*38996*/8015/* 13193 */, /*38997*/8015/* 13194 */,/*38998*/8015/* 13195 */,/*38999*/8015/* 13196 */,/*39000*/8015/* 13197 */, /*39001*/8015/* 13198 */,/*39002*/8015/* 13199 */,/*39003*/8015/* 1319A */,/*39004*/8015/* 1319B */, /*39005*/8015/* 1319C */,/*39006*/8015/* 1319D */,/*39007*/8015/* 1319E */,/*39008*/8015/* 1319F */, /*39009*/8015/* 131A0 */,/*39010*/8015/* 131A1 */,/*39011*/8015/* 131A2 */,/*39012*/8015/* 131A3 */, /*39013*/8015/* 131A4 */,/*39014*/8015/* 131A5 */,/*39015*/8015/* 131A6 */,/*39016*/8015/* 131A7 */, /*39017*/8015/* 131A8 */,/*39018*/8015/* 131A9 */,/*39019*/8015/* 131AA */,/*39020*/8015/* 131AB */, /*39021*/8015/* 131AC */,/*39022*/8015/* 131AD */,/*39023*/8015/* 131AE */,/*39024*/8015/* 131AF */, /*39025*/8015/* 131B0 */,/*39026*/8015/* 131B1 */,/*39027*/8015/* 131B2 */,/*39028*/8015/* 131B3 */, /*39029*/8015/* 131B4 */,/*39030*/8015/* 131B5 */,/*39031*/8015/* 131B6 */,/*39032*/8015/* 131B7 */, /*39033*/8015/* 131B8 */,/*39034*/8015/* 131B9 */,/*39035*/8015/* 131BA */,/*39036*/8015/* 131BB */, /*39037*/8015/* 131BC */,/*39038*/8015/* 131BD */,/*39039*/8015/* 131BE */,/*39040*/8015/* 131BF */, /*39041*/8015/* 131C0 */,/*39042*/8015/* 131C1 */,/*39043*/8015/* 131C2 */,/*39044*/8015/* 131C3 */, /*39045*/8015/* 131C4 */,/*39046*/8015/* 131C5 */,/*39047*/8015/* 131C6 */,/*39048*/8015/* 131C7 */, /*39049*/8015/* 131C8 */,/*39050*/8015/* 131C9 */,/*39051*/8015/* 131CA */,/*39052*/8015/* 131CB */, /*39053*/8015/* 131CC */,/*39054*/8015/* 131CD */,/*39055*/8015/* 131CE */,/*39056*/8015/* 131CF */, /*39057*/8015/* 131D0 */,/*39058*/8015/* 131D1 */,/*39059*/8015/* 131D2 */,/*39060*/8015/* 131D3 */, /*39061*/8015/* 131D4 */,/*39062*/8015/* 131D5 */,/*39063*/8015/* 131D6 */,/*39064*/8015/* 131D7 */, /*39065*/8015/* 131D8 */,/*39066*/8015/* 131D9 */,/*39067*/8015/* 131DA */,/*39068*/8015/* 131DB */, /*39069*/8015/* 131DC */,/*39070*/8015/* 131DD */,/*39071*/8015/* 131DE */,/*39072*/8015/* 131DF */, /*39073*/8015/* 131E0 */,/*39074*/8015/* 131E1 */,/*39075*/8015/* 131E2 */,/*39076*/8015/* 131E3 */, /*39077*/8015/* 131E4 */,/*39078*/8015/* 131E5 */,/*39079*/8015/* 131E6 */,/*39080*/8015/* 131E7 */, /*39081*/8015/* 131E8 */,/*39082*/8015/* 131E9 */,/*39083*/8015/* 131EA */,/*39084*/8015/* 131EB */, /*39085*/8015/* 131EC */,/*39086*/8015/* 131ED */,/*39087*/8015/* 131EE */,/*39088*/8015/* 131EF */, /*39089*/8015/* 131F0 */,/*39090*/8015/* 131F1 */,/*39091*/8015/* 131F2 */,/*39092*/8015/* 131F3 */, /*39093*/8015/* 131F4 */,/*39094*/8015/* 131F5 */,/*39095*/8015/* 131F6 */,/*39096*/8015/* 131F7 */, /*39097*/8015/* 131F8 */,/*39098*/8015/* 131F9 */,/*39099*/8015/* 131FA */,/*39100*/8015/* 131FB */, /*39101*/8015/* 131FC */,/*39102*/8015/* 131FD */,/*39103*/8015/* 131FE */,/*39104*/8015/* 131FF */, /*39105*/8015/* 13200 */,/*39106*/8015/* 13201 */,/*39107*/8015/* 13202 */,/*39108*/8015/* 13203 */, /*39109*/8015/* 13204 */,/*39110*/8015/* 13205 */,/*39111*/8015/* 13206 */,/*39112*/8015/* 13207 */, /*39113*/8015/* 13208 */,/*39114*/8015/* 13209 */,/*39115*/8015/* 1320A */,/*39116*/8015/* 1320B */, /*39117*/8015/* 1320C */,/*39118*/8015/* 1320D */,/*39119*/8015/* 1320E */,/*39120*/8015/* 1320F */, /*39121*/8015/* 13210 */,/*39122*/8015/* 13211 */,/*39123*/8015/* 13212 */,/*39124*/8015/* 13213 */, /*39125*/8015/* 13214 */,/*39126*/8015/* 13215 */,/*39127*/8015/* 13216 */,/*39128*/8015/* 13217 */, /*39129*/8015/* 13218 */,/*39130*/8015/* 13219 */,/*39131*/8015/* 1321A */,/*39132*/8015/* 1321B */, /*39133*/8015/* 1321C */,/*39134*/8015/* 1321D */,/*39135*/8015/* 1321E */,/*39136*/8015/* 1321F */, /*39137*/8015/* 13220 */,/*39138*/8015/* 13221 */,/*39139*/8015/* 13222 */,/*39140*/8015/* 13223 */, /*39141*/8015/* 13224 */,/*39142*/8015/* 13225 */,/*39143*/8015/* 13226 */,/*39144*/8015/* 13227 */, /*39145*/8015/* 13228 */,/*39146*/8015/* 13229 */,/*39147*/8015/* 1322A */,/*39148*/8015/* 1322B */, /*39149*/8015/* 1322C */,/*39150*/8015/* 1322D */,/*39151*/8015/* 1322E */,/*39152*/8015/* 1322F */, /*39153*/8015/* 13230 */,/*39154*/8015/* 13231 */,/*39155*/8015/* 13232 */,/*39156*/8015/* 13233 */, /*39157*/8015/* 13234 */,/*39158*/8015/* 13235 */,/*39159*/8015/* 13236 */,/*39160*/8015/* 13237 */, /*39161*/8015/* 13238 */,/*39162*/8015/* 13239 */,/*39163*/8015/* 1323A */,/*39164*/8015/* 1323B */, /*39165*/8015/* 1323C */,/*39166*/8015/* 1323D */,/*39167*/8015/* 1323E */,/*39168*/8015/* 1323F */, /*39169*/8015/* 13240 */,/*39170*/8015/* 13241 */,/*39171*/8015/* 13242 */,/*39172*/8015/* 13243 */, /*39173*/8015/* 13244 */,/*39174*/8015/* 13245 */,/*39175*/8015/* 13246 */,/*39176*/8015/* 13247 */, /*39177*/8015/* 13248 */,/*39178*/8015/* 13249 */,/*39179*/8015/* 1324A */,/*39180*/8015/* 1324B */, /*39181*/8015/* 1324C */,/*39182*/8015/* 1324D */,/*39183*/8015/* 1324E */,/*39184*/8015/* 1324F */, /*39185*/8015/* 13250 */,/*39186*/8015/* 13251 */,/*39187*/8015/* 13252 */,/*39188*/8015/* 13253 */, /*39189*/8015/* 13254 */,/*39190*/8015/* 13255 */,/*39191*/8015/* 13256 */,/*39192*/8015/* 13257 */, /*39193*/8015/* 13258 */,/*39194*/8015/* 13259 */,/*39195*/8015/* 1325A */,/*39196*/8015/* 1325B */, /*39197*/8015/* 1325C */,/*39198*/8015/* 1325D */,/*39199*/8015/* 1325E */,/*39200*/8015/* 1325F */, /*39201*/8015/* 13260 */,/*39202*/8015/* 13261 */,/*39203*/8015/* 13262 */,/*39204*/8015/* 13263 */, /*39205*/8015/* 13264 */,/*39206*/8015/* 13265 */,/*39207*/8015/* 13266 */,/*39208*/8015/* 13267 */, /*39209*/8015/* 13268 */,/*39210*/8015/* 13269 */,/*39211*/8015/* 1326A */,/*39212*/8015/* 1326B */, /*39213*/8015/* 1326C */,/*39214*/8015/* 1326D */,/*39215*/8015/* 1326E */,/*39216*/8015/* 1326F */, /*39217*/8015/* 13270 */,/*39218*/8015/* 13271 */,/*39219*/8015/* 13272 */,/*39220*/8015/* 13273 */, /*39221*/8015/* 13274 */,/*39222*/8015/* 13275 */,/*39223*/8015/* 13276 */,/*39224*/8015/* 13277 */, /*39225*/8015/* 13278 */,/*39226*/8015/* 13279 */,/*39227*/8015/* 1327A */,/*39228*/8015/* 1327B */, /*39229*/8015/* 1327C */,/*39230*/8015/* 1327D */,/*39231*/8015/* 1327E */,/*39232*/8015/* 1327F */, /*39233*/8015/* 13280 */,/*39234*/8015/* 13281 */,/*39235*/8015/* 13282 */,/*39236*/8015/* 13283 */, /*39237*/8015/* 13284 */,/*39238*/8015/* 13285 */,/*39239*/8015/* 13286 */,/*39240*/8015/* 13287 */, /*39241*/8015/* 13288 */,/*39242*/8015/* 13289 */,/*39243*/8015/* 1328A */,/*39244*/8015/* 1328B */, /*39245*/8015/* 1328C */,/*39246*/8015/* 1328D */,/*39247*/8015/* 1328E */,/*39248*/8015/* 1328F */, /*39249*/8015/* 13290 */,/*39250*/8015/* 13291 */,/*39251*/8015/* 13292 */,/*39252*/8015/* 13293 */, /*39253*/8015/* 13294 */,/*39254*/8015/* 13295 */,/*39255*/8015/* 13296 */,/*39256*/8015/* 13297 */, /*39257*/8015/* 13298 */,/*39258*/8015/* 13299 */,/*39259*/8015/* 1329A */,/*39260*/8015/* 1329B */, /*39261*/8015/* 1329C */,/*39262*/8015/* 1329D */,/*39263*/8015/* 1329E */,/*39264*/8015/* 1329F */, /*39265*/8015/* 132A0 */,/*39266*/8015/* 132A1 */,/*39267*/8015/* 132A2 */,/*39268*/8015/* 132A3 */, /*39269*/8015/* 132A4 */,/*39270*/8015/* 132A5 */,/*39271*/8015/* 132A6 */,/*39272*/8015/* 132A7 */, /*39273*/8015/* 132A8 */,/*39274*/8015/* 132A9 */,/*39275*/8015/* 132AA */,/*39276*/8015/* 132AB */, /*39277*/8015/* 132AC */,/*39278*/8015/* 132AD */,/*39279*/8015/* 132AE */,/*39280*/8015/* 132AF */, /*39281*/8015/* 132B0 */,/*39282*/8015/* 132B1 */,/*39283*/8015/* 132B2 */,/*39284*/8015/* 132B3 */, /*39285*/8015/* 132B4 */,/*39286*/8015/* 132B5 */,/*39287*/8015/* 132B6 */,/*39288*/8015/* 132B7 */, /*39289*/8015/* 132B8 */,/*39290*/8015/* 132B9 */,/*39291*/8015/* 132BA */,/*39292*/8015/* 132BB */, /*39293*/8015/* 132BC */,/*39294*/8015/* 132BD */,/*39295*/8015/* 132BE */,/*39296*/8015/* 132BF */, /*39297*/8015/* 132C0 */,/*39298*/8015/* 132C1 */,/*39299*/8015/* 132C2 */,/*39300*/8015/* 132C3 */, /*39301*/8015/* 132C4 */,/*39302*/8015/* 132C5 */,/*39303*/8015/* 132C6 */,/*39304*/8015/* 132C7 */, /*39305*/8015/* 132C8 */,/*39306*/8015/* 132C9 */,/*39307*/8015/* 132CA */,/*39308*/8015/* 132CB */, /*39309*/8015/* 132CC */,/*39310*/8015/* 132CD */,/*39311*/8015/* 132CE */,/*39312*/8015/* 132CF */, /*39313*/8015/* 132D0 */,/*39314*/8015/* 132D1 */,/*39315*/8015/* 132D2 */,/*39316*/8015/* 132D3 */, /*39317*/8015/* 132D4 */,/*39318*/8015/* 132D5 */,/*39319*/8015/* 132D6 */,/*39320*/8015/* 132D7 */, /*39321*/8015/* 132D8 */,/*39322*/8015/* 132D9 */,/*39323*/8015/* 132DA */,/*39324*/8015/* 132DB */, /*39325*/8015/* 132DC */,/*39326*/8015/* 132DD */,/*39327*/8015/* 132DE */,/*39328*/8015/* 132DF */, /*39329*/8015/* 132E0 */,/*39330*/8015/* 132E1 */,/*39331*/8015/* 132E2 */,/*39332*/8015/* 132E3 */, /*39333*/8015/* 132E4 */,/*39334*/8015/* 132E5 */,/*39335*/8015/* 132E6 */,/*39336*/8015/* 132E7 */, /*39337*/8015/* 132E8 */,/*39338*/8015/* 132E9 */,/*39339*/8015/* 132EA */,/*39340*/8015/* 132EB */, /*39341*/8015/* 132EC */,/*39342*/8015/* 132ED */,/*39343*/8015/* 132EE */,/*39344*/8015/* 132EF */, /*39345*/8015/* 132F0 */,/*39346*/8015/* 132F1 */,/*39347*/8015/* 132F2 */,/*39348*/8015/* 132F3 */, /*39349*/8015/* 132F4 */,/*39350*/8015/* 132F5 */,/*39351*/8015/* 132F6 */,/*39352*/8015/* 132F7 */, /*39353*/8015/* 132F8 */,/*39354*/8015/* 132F9 */,/*39355*/8015/* 132FA */,/*39356*/8015/* 132FB */, /*39357*/8015/* 132FC */,/*39358*/8015/* 132FD */,/*39359*/8015/* 132FE */,/*39360*/8015/* 132FF */, /*39361*/8015/* 13300 */,/*39362*/8015/* 13301 */,/*39363*/8015/* 13302 */,/*39364*/8015/* 13303 */, /*39365*/8015/* 13304 */,/*39366*/8015/* 13305 */,/*39367*/8015/* 13306 */,/*39368*/8015/* 13307 */, /*39369*/8015/* 13308 */,/*39370*/8015/* 13309 */,/*39371*/8015/* 1330A */,/*39372*/8015/* 1330B */, /*39373*/8015/* 1330C */,/*39374*/8015/* 1330D */,/*39375*/8015/* 1330E */,/*39376*/8015/* 1330F */, /*39377*/8015/* 13310 */,/*39378*/8015/* 13311 */,/*39379*/8015/* 13312 */,/*39380*/8015/* 13313 */, /*39381*/8015/* 13314 */,/*39382*/8015/* 13315 */,/*39383*/8015/* 13316 */,/*39384*/8015/* 13317 */, /*39385*/8015/* 13318 */,/*39386*/8015/* 13319 */,/*39387*/8015/* 1331A */,/*39388*/8015/* 1331B */, /*39389*/8015/* 1331C */,/*39390*/8015/* 1331D */,/*39391*/8015/* 1331E */,/*39392*/8015/* 1331F */, /*39393*/8015/* 13320 */,/*39394*/8015/* 13321 */,/*39395*/8015/* 13322 */,/*39396*/8015/* 13323 */, /*39397*/8015/* 13324 */,/*39398*/8015/* 13325 */,/*39399*/8015/* 13326 */,/*39400*/8015/* 13327 */, /*39401*/8015/* 13328 */,/*39402*/8015/* 13329 */,/*39403*/8015/* 1332A */,/*39404*/8015/* 1332B */, /*39405*/8015/* 1332C */,/*39406*/8015/* 1332D */,/*39407*/8015/* 1332E */,/*39408*/8015/* 1332F */, /*39409*/8015/* 13330 */,/*39410*/8015/* 13331 */,/*39411*/8015/* 13332 */,/*39412*/8015/* 13333 */, /*39413*/8015/* 13334 */,/*39414*/8015/* 13335 */,/*39415*/8015/* 13336 */,/*39416*/8015/* 13337 */, /*39417*/8015/* 13338 */,/*39418*/8015/* 13339 */,/*39419*/8015/* 1333A */,/*39420*/8015/* 1333B */, /*39421*/8015/* 1333C */,/*39422*/8015/* 1333D */,/*39423*/8015/* 1333E */,/*39424*/8015/* 1333F */, /*39425*/8015/* 13340 */,/*39426*/8015/* 13341 */,/*39427*/8015/* 13342 */,/*39428*/8015/* 13343 */, /*39429*/8015/* 13344 */,/*39430*/8015/* 13345 */,/*39431*/8015/* 13346 */,/*39432*/8015/* 13347 */, /*39433*/8015/* 13348 */,/*39434*/8015/* 13349 */,/*39435*/8015/* 1334A */,/*39436*/8015/* 1334B */, /*39437*/8015/* 1334C */,/*39438*/8015/* 1334D */,/*39439*/8015/* 1334E */,/*39440*/8015/* 1334F */, /*39441*/8015/* 13350 */,/*39442*/8015/* 13351 */,/*39443*/8015/* 13352 */,/*39444*/8015/* 13353 */, /*39445*/8015/* 13354 */,/*39446*/8015/* 13355 */,/*39447*/8015/* 13356 */,/*39448*/8015/* 13357 */, /*39449*/8015/* 13358 */,/*39450*/8015/* 13359 */,/*39451*/8015/* 1335A */,/*39452*/8015/* 1335B */, /*39453*/8015/* 1335C */,/*39454*/8015/* 1335D */,/*39455*/8015/* 1335E */,/*39456*/8015/* 1335F */, /*39457*/8015/* 13360 */,/*39458*/8015/* 13361 */,/*39459*/8015/* 13362 */,/*39460*/8015/* 13363 */, /*39461*/8015/* 13364 */,/*39462*/8015/* 13365 */,/*39463*/8015/* 13366 */,/*39464*/8015/* 13367 */, /*39465*/8015/* 13368 */,/*39466*/8015/* 13369 */,/*39467*/8015/* 1336A */,/*39468*/8015/* 1336B */, /*39469*/8015/* 1336C */,/*39470*/8015/* 1336D */,/*39471*/8015/* 1336E */,/*39472*/8015/* 1336F */, /*39473*/8015/* 13370 */,/*39474*/8015/* 13371 */,/*39475*/8015/* 13372 */,/*39476*/8015/* 13373 */, /*39477*/8015/* 13374 */,/*39478*/8015/* 13375 */,/*39479*/8015/* 13376 */,/*39480*/8015/* 13377 */, /*39481*/8015/* 13378 */,/*39482*/8015/* 13379 */,/*39483*/8015/* 1337A */,/*39484*/8015/* 1337B */, /*39485*/8015/* 1337C */,/*39486*/8015/* 1337D */,/*39487*/8015/* 1337E */,/*39488*/8015/* 1337F */, /*39489*/8015/* 13380 */,/*39490*/8015/* 13381 */,/*39491*/8015/* 13382 */,/*39492*/8015/* 13383 */, /*39493*/8015/* 13384 */,/*39494*/8015/* 13385 */,/*39495*/8015/* 13386 */,/*39496*/8015/* 13387 */, /*39497*/8015/* 13388 */,/*39498*/8015/* 13389 */,/*39499*/8015/* 1338A */,/*39500*/8015/* 1338B */, /*39501*/8015/* 1338C */,/*39502*/8015/* 1338D */,/*39503*/8015/* 1338E */,/*39504*/8015/* 1338F */, /*39505*/8015/* 13390 */,/*39506*/8015/* 13391 */,/*39507*/8015/* 13392 */,/*39508*/8015/* 13393 */, /*39509*/8015/* 13394 */,/*39510*/8015/* 13395 */,/*39511*/8015/* 13396 */,/*39512*/8015/* 13397 */, /*39513*/8015/* 13398 */,/*39514*/8015/* 13399 */,/*39515*/8015/* 1339A */,/*39516*/8015/* 1339B */, /*39517*/8015/* 1339C */,/*39518*/8015/* 1339D */,/*39519*/8015/* 1339E */,/*39520*/8015/* 1339F */, /*39521*/8015/* 133A0 */,/*39522*/8015/* 133A1 */,/*39523*/8015/* 133A2 */,/*39524*/8015/* 133A3 */, /*39525*/8015/* 133A4 */,/*39526*/8015/* 133A5 */,/*39527*/8015/* 133A6 */,/*39528*/8015/* 133A7 */, /*39529*/8015/* 133A8 */,/*39530*/8015/* 133A9 */,/*39531*/8015/* 133AA */,/*39532*/8015/* 133AB */, /*39533*/8015/* 133AC */,/*39534*/8015/* 133AD */,/*39535*/8015/* 133AE */,/*39536*/8015/* 133AF */, /*39537*/8015/* 133B0 */,/*39538*/8015/* 133B1 */,/*39539*/8015/* 133B2 */,/*39540*/8015/* 133B3 */, /*39541*/8015/* 133B4 */,/*39542*/8015/* 133B5 */,/*39543*/8015/* 133B6 */,/*39544*/8015/* 133B7 */, /*39545*/8015/* 133B8 */,/*39546*/8015/* 133B9 */,/*39547*/8015/* 133BA */,/*39548*/8015/* 133BB */, /*39549*/8015/* 133BC */,/*39550*/8015/* 133BD */,/*39551*/8015/* 133BE */,/*39552*/8015/* 133BF */, /*39553*/8015/* 133C0 */,/*39554*/8015/* 133C1 */,/*39555*/8015/* 133C2 */,/*39556*/8015/* 133C3 */, /*39557*/8015/* 133C4 */,/*39558*/8015/* 133C5 */,/*39559*/8015/* 133C6 */,/*39560*/8015/* 133C7 */, /*39561*/8015/* 133C8 */,/*39562*/8015/* 133C9 */,/*39563*/8015/* 133CA */,/*39564*/8015/* 133CB */, /*39565*/8015/* 133CC */,/*39566*/8015/* 133CD */,/*39567*/8015/* 133CE */,/*39568*/8015/* 133CF */, /*39569*/8015/* 133D0 */,/*39570*/8015/* 133D1 */,/*39571*/8015/* 133D2 */,/*39572*/8015/* 133D3 */, /*39573*/8015/* 133D4 */,/*39574*/8015/* 133D5 */,/*39575*/8015/* 133D6 */,/*39576*/8015/* 133D7 */, /*39577*/8015/* 133D8 */,/*39578*/8015/* 133D9 */,/*39579*/8015/* 133DA */,/*39580*/8015/* 133DB */, /*39581*/8015/* 133DC */,/*39582*/8015/* 133DD */,/*39583*/8015/* 133DE */,/*39584*/8015/* 133DF */, /*39585*/8015/* 133E0 */,/*39586*/8015/* 133E1 */,/*39587*/8015/* 133E2 */,/*39588*/8015/* 133E3 */, /*39589*/8015/* 133E4 */,/*39590*/8015/* 133E5 */,/*39591*/8015/* 133E6 */,/*39592*/8015/* 133E7 */, /*39593*/8015/* 133E8 */,/*39594*/8015/* 133E9 */,/*39595*/8015/* 133EA */,/*39596*/8015/* 133EB */, /*39597*/8015/* 133EC */,/*39598*/8015/* 133ED */,/*39599*/8015/* 133EE */,/*39600*/8015/* 133EF */, /*39601*/8015/* 133F0 */,/*39602*/8015/* 133F1 */,/*39603*/8015/* 133F2 */,/*39604*/8015/* 133F3 */, /*39605*/8015/* 133F4 */,/*39606*/8015/* 133F5 */,/*39607*/8015/* 133F6 */,/*39608*/8015/* 133F7 */, /*39609*/8015/* 133F8 */,/*39610*/8015/* 133F9 */,/*39611*/8015/* 133FA */,/*39612*/8015/* 133FB */, /*39613*/8015/* 133FC */,/*39614*/8015/* 133FD */,/*39615*/8015/* 133FE */,/*39616*/8015/* 133FF */, /*39617*/8015/* 13400 */,/*39618*/8015/* 13401 */,/*39619*/8015/* 13402 */,/*39620*/8015/* 13403 */, /*39621*/8015/* 13404 */,/*39622*/8015/* 13405 */,/*39623*/8015/* 13406 */,/*39624*/8015/* 13407 */, /*39625*/8015/* 13408 */,/*39626*/8015/* 13409 */,/*39627*/8015/* 1340A */,/*39628*/8015/* 1340B */, /*39629*/8015/* 1340C */,/*39630*/8015/* 1340D */,/*39631*/8015/* 1340E */,/*39632*/8015/* 1340F */, /*39633*/8015/* 13410 */,/*39634*/8015/* 13411 */,/*39635*/8015/* 13412 */,/*39636*/8015/* 13413 */, /*39637*/8015/* 13414 */,/*39638*/8015/* 13415 */,/*39639*/8015/* 13416 */,/*39640*/8015/* 13417 */, /*39641*/8015/* 13418 */,/*39642*/8015/* 13419 */,/*39643*/8015/* 1341A */,/*39644*/8015/* 1341B */, /*39645*/8015/* 1341C */,/*39646*/8015/* 1341D */,/*39647*/8015/* 1341E */,/*39648*/8015/* 1341F */, /*39649*/8015/* 13420 */,/*39650*/8015/* 13421 */,/*39651*/8015/* 13422 */,/*39652*/8015/* 13423 */, /*39653*/8015/* 13424 */,/*39654*/8015/* 13425 */,/*39655*/8015/* 13426 */,/*39656*/8015/* 13427 */, /*39657*/8015/* 13428 */,/*39658*/8015/* 13429 */,/*39659*/8015/* 1342A */,/*39660*/8015/* 1342B */, /*39661*/8015/* 1342C */,/*39662*/8015/* 1342D */,/*39663*/8015/* 1342E */,/*39664*/8016/* 14400 */, /*39665*/8016/* 14401 */,/*39666*/8016/* 14402 */,/*39667*/8016/* 14403 */,/*39668*/8016/* 14404 */, /*39669*/8016/* 14405 */,/*39670*/8016/* 14406 */,/*39671*/8016/* 14407 */,/*39672*/8016/* 14408 */, /*39673*/8016/* 14409 */,/*39674*/8016/* 1440A */,/*39675*/8016/* 1440B */,/*39676*/8016/* 1440C */, /*39677*/8016/* 1440D */,/*39678*/8016/* 1440E */,/*39679*/8016/* 1440F */,/*39680*/8016/* 14410 */, /*39681*/8016/* 14411 */,/*39682*/8016/* 14412 */,/*39683*/8016/* 14413 */,/*39684*/8016/* 14414 */, /*39685*/8016/* 14415 */,/*39686*/8016/* 14416 */,/*39687*/8016/* 14417 */,/*39688*/8016/* 14418 */, /*39689*/8016/* 14419 */,/*39690*/8016/* 1441A */,/*39691*/8016/* 1441B */,/*39692*/8016/* 1441C */, /*39693*/8016/* 1441D */,/*39694*/8016/* 1441E */,/*39695*/8016/* 1441F */,/*39696*/8016/* 14420 */, /*39697*/8016/* 14421 */,/*39698*/8016/* 14422 */,/*39699*/8016/* 14423 */,/*39700*/8016/* 14424 */, /*39701*/8016/* 14425 */,/*39702*/8016/* 14426 */,/*39703*/8016/* 14427 */,/*39704*/8016/* 14428 */, /*39705*/8016/* 14429 */,/*39706*/8016/* 1442A */,/*39707*/8016/* 1442B */,/*39708*/8016/* 1442C */, /*39709*/8016/* 1442D */,/*39710*/8016/* 1442E */,/*39711*/8016/* 1442F */,/*39712*/8016/* 14430 */, /*39713*/8016/* 14431 */,/*39714*/8016/* 14432 */,/*39715*/8016/* 14433 */,/*39716*/8016/* 14434 */, /*39717*/8016/* 14435 */,/*39718*/8016/* 14436 */,/*39719*/8016/* 14437 */,/*39720*/8016/* 14438 */, /*39721*/8016/* 14439 */,/*39722*/8016/* 1443A */,/*39723*/8016/* 1443B */,/*39724*/8016/* 1443C */, /*39725*/8016/* 1443D */,/*39726*/8016/* 1443E */,/*39727*/8016/* 1443F */,/*39728*/8016/* 14440 */, /*39729*/8016/* 14441 */,/*39730*/8016/* 14442 */,/*39731*/8016/* 14443 */,/*39732*/8016/* 14444 */, /*39733*/8016/* 14445 */,/*39734*/8016/* 14446 */,/*39735*/8016/* 14447 */,/*39736*/8016/* 14448 */, /*39737*/8016/* 14449 */,/*39738*/8016/* 1444A */,/*39739*/8016/* 1444B */,/*39740*/8016/* 1444C */, /*39741*/8016/* 1444D */,/*39742*/8016/* 1444E */,/*39743*/8016/* 1444F */,/*39744*/8016/* 14450 */, /*39745*/8016/* 14451 */,/*39746*/8016/* 14452 */,/*39747*/8016/* 14453 */,/*39748*/8016/* 14454 */, /*39749*/8016/* 14455 */,/*39750*/8016/* 14456 */,/*39751*/8016/* 14457 */,/*39752*/8016/* 14458 */, /*39753*/8016/* 14459 */,/*39754*/8016/* 1445A */,/*39755*/8016/* 1445B */,/*39756*/8016/* 1445C */, /*39757*/8016/* 1445D */,/*39758*/8016/* 1445E */,/*39759*/8016/* 1445F */,/*39760*/8016/* 14460 */, /*39761*/8016/* 14461 */,/*39762*/8016/* 14462 */,/*39763*/8016/* 14463 */,/*39764*/8016/* 14464 */, /*39765*/8016/* 14465 */,/*39766*/8016/* 14466 */,/*39767*/8016/* 14467 */,/*39768*/8016/* 14468 */, /*39769*/8016/* 14469 */,/*39770*/8016/* 1446A */,/*39771*/8016/* 1446B */,/*39772*/8016/* 1446C */, /*39773*/8016/* 1446D */,/*39774*/8016/* 1446E */,/*39775*/8016/* 1446F */,/*39776*/8016/* 14470 */, /*39777*/8016/* 14471 */,/*39778*/8016/* 14472 */,/*39779*/8016/* 14473 */,/*39780*/8016/* 14474 */, /*39781*/8016/* 14475 */,/*39782*/8016/* 14476 */,/*39783*/8016/* 14477 */,/*39784*/8016/* 14478 */, /*39785*/8016/* 14479 */,/*39786*/8016/* 1447A */,/*39787*/8016/* 1447B */,/*39788*/8016/* 1447C */, /*39789*/8016/* 1447D */,/*39790*/8016/* 1447E */,/*39791*/8016/* 1447F */,/*39792*/8016/* 14480 */, /*39793*/8016/* 14481 */,/*39794*/8016/* 14482 */,/*39795*/8016/* 14483 */,/*39796*/8016/* 14484 */, /*39797*/8016/* 14485 */,/*39798*/8016/* 14486 */,/*39799*/8016/* 14487 */,/*39800*/8016/* 14488 */, /*39801*/8016/* 14489 */,/*39802*/8016/* 1448A */,/*39803*/8016/* 1448B */,/*39804*/8016/* 1448C */, /*39805*/8016/* 1448D */,/*39806*/8016/* 1448E */,/*39807*/8016/* 1448F */,/*39808*/8016/* 14490 */, /*39809*/8016/* 14491 */,/*39810*/8016/* 14492 */,/*39811*/8016/* 14493 */,/*39812*/8016/* 14494 */, /*39813*/8016/* 14495 */,/*39814*/8016/* 14496 */,/*39815*/8016/* 14497 */,/*39816*/8016/* 14498 */, /*39817*/8016/* 14499 */,/*39818*/8016/* 1449A */,/*39819*/8016/* 1449B */,/*39820*/8016/* 1449C */, /*39821*/8016/* 1449D */,/*39822*/8016/* 1449E */,/*39823*/8016/* 1449F */,/*39824*/8016/* 144A0 */, /*39825*/8016/* 144A1 */,/*39826*/8016/* 144A2 */,/*39827*/8016/* 144A3 */,/*39828*/8016/* 144A4 */, /*39829*/8016/* 144A5 */,/*39830*/8016/* 144A6 */,/*39831*/8016/* 144A7 */,/*39832*/8016/* 144A8 */, /*39833*/8016/* 144A9 */,/*39834*/8016/* 144AA */,/*39835*/8016/* 144AB */,/*39836*/8016/* 144AC */, /*39837*/8016/* 144AD */,/*39838*/8016/* 144AE */,/*39839*/8016/* 144AF */,/*39840*/8016/* 144B0 */, /*39841*/8016/* 144B1 */,/*39842*/8016/* 144B2 */,/*39843*/8016/* 144B3 */,/*39844*/8016/* 144B4 */, /*39845*/8016/* 144B5 */,/*39846*/8016/* 144B6 */,/*39847*/8016/* 144B7 */,/*39848*/8016/* 144B8 */, /*39849*/8016/* 144B9 */,/*39850*/8016/* 144BA */,/*39851*/8016/* 144BB */,/*39852*/8016/* 144BC */, /*39853*/8016/* 144BD */,/*39854*/8016/* 144BE */,/*39855*/8016/* 144BF */,/*39856*/8016/* 144C0 */, /*39857*/8016/* 144C1 */,/*39858*/8016/* 144C2 */,/*39859*/8016/* 144C3 */,/*39860*/8016/* 144C4 */, /*39861*/8016/* 144C5 */,/*39862*/8016/* 144C6 */,/*39863*/8016/* 144C7 */,/*39864*/8016/* 144C8 */, /*39865*/8016/* 144C9 */,/*39866*/8016/* 144CA */,/*39867*/8016/* 144CB */,/*39868*/8016/* 144CC */, /*39869*/8016/* 144CD */,/*39870*/8016/* 144CE */,/*39871*/8016/* 144CF */,/*39872*/8016/* 144D0 */, /*39873*/8016/* 144D1 */,/*39874*/8016/* 144D2 */,/*39875*/8016/* 144D3 */,/*39876*/8016/* 144D4 */, /*39877*/8016/* 144D5 */,/*39878*/8016/* 144D6 */,/*39879*/8016/* 144D7 */,/*39880*/8016/* 144D8 */, /*39881*/8016/* 144D9 */,/*39882*/8016/* 144DA */,/*39883*/8016/* 144DB */,/*39884*/8016/* 144DC */, /*39885*/8016/* 144DD */,/*39886*/8016/* 144DE */,/*39887*/8016/* 144DF */,/*39888*/8016/* 144E0 */, /*39889*/8016/* 144E1 */,/*39890*/8016/* 144E2 */,/*39891*/8016/* 144E3 */,/*39892*/8016/* 144E4 */, /*39893*/8016/* 144E5 */,/*39894*/8016/* 144E6 */,/*39895*/8016/* 144E7 */,/*39896*/8016/* 144E8 */, /*39897*/8016/* 144E9 */,/*39898*/8016/* 144EA */,/*39899*/8016/* 144EB */,/*39900*/8016/* 144EC */, /*39901*/8016/* 144ED */,/*39902*/8016/* 144EE */,/*39903*/8016/* 144EF */,/*39904*/8016/* 144F0 */, /*39905*/8016/* 144F1 */,/*39906*/8016/* 144F2 */,/*39907*/8016/* 144F3 */,/*39908*/8016/* 144F4 */, /*39909*/8016/* 144F5 */,/*39910*/8016/* 144F6 */,/*39911*/8016/* 144F7 */,/*39912*/8016/* 144F8 */, /*39913*/8016/* 144F9 */,/*39914*/8016/* 144FA */,/*39915*/8016/* 144FB */,/*39916*/8016/* 144FC */, /*39917*/8016/* 144FD */,/*39918*/8016/* 144FE */,/*39919*/8016/* 144FF */,/*39920*/8016/* 14500 */, /*39921*/8016/* 14501 */,/*39922*/8016/* 14502 */,/*39923*/8016/* 14503 */,/*39924*/8016/* 14504 */, /*39925*/8016/* 14505 */,/*39926*/8016/* 14506 */,/*39927*/8016/* 14507 */,/*39928*/8016/* 14508 */, /*39929*/8016/* 14509 */,/*39930*/8016/* 1450A */,/*39931*/8016/* 1450B */,/*39932*/8016/* 1450C */, /*39933*/8016/* 1450D */,/*39934*/8016/* 1450E */,/*39935*/8016/* 1450F */,/*39936*/8016/* 14510 */, /*39937*/8016/* 14511 */,/*39938*/8016/* 14512 */,/*39939*/8016/* 14513 */,/*39940*/8016/* 14514 */, /*39941*/8016/* 14515 */,/*39942*/8016/* 14516 */,/*39943*/8016/* 14517 */,/*39944*/8016/* 14518 */, /*39945*/8016/* 14519 */,/*39946*/8016/* 1451A */,/*39947*/8016/* 1451B */,/*39948*/8016/* 1451C */, /*39949*/8016/* 1451D */,/*39950*/8016/* 1451E */,/*39951*/8016/* 1451F */,/*39952*/8016/* 14520 */, /*39953*/8016/* 14521 */,/*39954*/8016/* 14522 */,/*39955*/8016/* 14523 */,/*39956*/8016/* 14524 */, /*39957*/8016/* 14525 */,/*39958*/8016/* 14526 */,/*39959*/8016/* 14527 */,/*39960*/8016/* 14528 */, /*39961*/8016/* 14529 */,/*39962*/8016/* 1452A */,/*39963*/8016/* 1452B */,/*39964*/8016/* 1452C */, /*39965*/8016/* 1452D */,/*39966*/8016/* 1452E */,/*39967*/8016/* 1452F */,/*39968*/8016/* 14530 */, /*39969*/8016/* 14531 */,/*39970*/8016/* 14532 */,/*39971*/8016/* 14533 */,/*39972*/8016/* 14534 */, /*39973*/8016/* 14535 */,/*39974*/8016/* 14536 */,/*39975*/8016/* 14537 */,/*39976*/8016/* 14538 */, /*39977*/8016/* 14539 */,/*39978*/8016/* 1453A */,/*39979*/8016/* 1453B */,/*39980*/8016/* 1453C */, /*39981*/8016/* 1453D */,/*39982*/8016/* 1453E */,/*39983*/8016/* 1453F */,/*39984*/8016/* 14540 */, /*39985*/8016/* 14541 */,/*39986*/8016/* 14542 */,/*39987*/8016/* 14543 */,/*39988*/8016/* 14544 */, /*39989*/8016/* 14545 */,/*39990*/8016/* 14546 */,/*39991*/8016/* 14547 */,/*39992*/8016/* 14548 */, /*39993*/8016/* 14549 */,/*39994*/8016/* 1454A */,/*39995*/8016/* 1454B */,/*39996*/8016/* 1454C */, /*39997*/8016/* 1454D */,/*39998*/8016/* 1454E */,/*39999*/8016/* 1454F */,/*40000*/8016/* 14550 */, /*40001*/8016/* 14551 */,/*40002*/8016/* 14552 */,/*40003*/8016/* 14553 */,/*40004*/8016/* 14554 */, /*40005*/8016/* 14555 */,/*40006*/8016/* 14556 */,/*40007*/8016/* 14557 */,/*40008*/8016/* 14558 */, /*40009*/8016/* 14559 */,/*40010*/8016/* 1455A */,/*40011*/8016/* 1455B */,/*40012*/8016/* 1455C */, /*40013*/8016/* 1455D */,/*40014*/8016/* 1455E */,/*40015*/8016/* 1455F */,/*40016*/8016/* 14560 */, /*40017*/8016/* 14561 */,/*40018*/8016/* 14562 */,/*40019*/8016/* 14563 */,/*40020*/8016/* 14564 */, /*40021*/8016/* 14565 */,/*40022*/8016/* 14566 */,/*40023*/8016/* 14567 */,/*40024*/8016/* 14568 */, /*40025*/8016/* 14569 */,/*40026*/8016/* 1456A */,/*40027*/8016/* 1456B */,/*40028*/8016/* 1456C */, /*40029*/8016/* 1456D */,/*40030*/8016/* 1456E */,/*40031*/8016/* 1456F */,/*40032*/8016/* 14570 */, /*40033*/8016/* 14571 */,/*40034*/8016/* 14572 */,/*40035*/8016/* 14573 */,/*40036*/8016/* 14574 */, /*40037*/8016/* 14575 */,/*40038*/8016/* 14576 */,/*40039*/8016/* 14577 */,/*40040*/8016/* 14578 */, /*40041*/8016/* 14579 */,/*40042*/8016/* 1457A */,/*40043*/8016/* 1457B */,/*40044*/8016/* 1457C */, /*40045*/8016/* 1457D */,/*40046*/8016/* 1457E */,/*40047*/8016/* 1457F */,/*40048*/8016/* 14580 */, /*40049*/8016/* 14581 */,/*40050*/8016/* 14582 */,/*40051*/8016/* 14583 */,/*40052*/8016/* 14584 */, /*40053*/8016/* 14585 */,/*40054*/8016/* 14586 */,/*40055*/8016/* 14587 */,/*40056*/8016/* 14588 */, /*40057*/8016/* 14589 */,/*40058*/8016/* 1458A */,/*40059*/8016/* 1458B */,/*40060*/8016/* 1458C */, /*40061*/8016/* 1458D */,/*40062*/8016/* 1458E */,/*40063*/8016/* 1458F */,/*40064*/8016/* 14590 */, /*40065*/8016/* 14591 */,/*40066*/8016/* 14592 */,/*40067*/8016/* 14593 */,/*40068*/8016/* 14594 */, /*40069*/8016/* 14595 */,/*40070*/8016/* 14596 */,/*40071*/8016/* 14597 */,/*40072*/8016/* 14598 */, /*40073*/8016/* 14599 */,/*40074*/8016/* 1459A */,/*40075*/8016/* 1459B */,/*40076*/8016/* 1459C */, /*40077*/8016/* 1459D */,/*40078*/8016/* 1459E */,/*40079*/8016/* 1459F */,/*40080*/8016/* 145A0 */, /*40081*/8016/* 145A1 */,/*40082*/8016/* 145A2 */,/*40083*/8016/* 145A3 */,/*40084*/8016/* 145A4 */, /*40085*/8016/* 145A5 */,/*40086*/8016/* 145A6 */,/*40087*/8016/* 145A7 */,/*40088*/8016/* 145A8 */, /*40089*/8016/* 145A9 */,/*40090*/8016/* 145AA */,/*40091*/8016/* 145AB */,/*40092*/8016/* 145AC */, /*40093*/8016/* 145AD */,/*40094*/8016/* 145AE */,/*40095*/8016/* 145AF */,/*40096*/8016/* 145B0 */, /*40097*/8016/* 145B1 */,/*40098*/8016/* 145B2 */,/*40099*/8016/* 145B3 */,/*40100*/8016/* 145B4 */, /*40101*/8016/* 145B5 */,/*40102*/8016/* 145B6 */,/*40103*/8016/* 145B7 */,/*40104*/8016/* 145B8 */, /*40105*/8016/* 145B9 */,/*40106*/8016/* 145BA */,/*40107*/8016/* 145BB */,/*40108*/8016/* 145BC */, /*40109*/8016/* 145BD */,/*40110*/8016/* 145BE */,/*40111*/8016/* 145BF */,/*40112*/8016/* 145C0 */, /*40113*/8016/* 145C1 */,/*40114*/8016/* 145C2 */,/*40115*/8016/* 145C3 */,/*40116*/8016/* 145C4 */, /*40117*/8016/* 145C5 */,/*40118*/8016/* 145C6 */,/*40119*/8016/* 145C7 */,/*40120*/8016/* 145C8 */, /*40121*/8016/* 145C9 */,/*40122*/8016/* 145CA */,/*40123*/8016/* 145CB */,/*40124*/8016/* 145CC */, /*40125*/8016/* 145CD */,/*40126*/8016/* 145CE */,/*40127*/8016/* 145CF */,/*40128*/8016/* 145D0 */, /*40129*/8016/* 145D1 */,/*40130*/8016/* 145D2 */,/*40131*/8016/* 145D3 */,/*40132*/8016/* 145D4 */, /*40133*/8016/* 145D5 */,/*40134*/8016/* 145D6 */,/*40135*/8016/* 145D7 */,/*40136*/8016/* 145D8 */, /*40137*/8016/* 145D9 */,/*40138*/8016/* 145DA */,/*40139*/8016/* 145DB */,/*40140*/8016/* 145DC */, /*40141*/8016/* 145DD */,/*40142*/8016/* 145DE */,/*40143*/8016/* 145DF */,/*40144*/8016/* 145E0 */, /*40145*/8016/* 145E1 */,/*40146*/8016/* 145E2 */,/*40147*/8016/* 145E3 */,/*40148*/8016/* 145E4 */, /*40149*/8016/* 145E5 */,/*40150*/8016/* 145E6 */,/*40151*/8016/* 145E7 */,/*40152*/8016/* 145E8 */, /*40153*/8016/* 145E9 */,/*40154*/8016/* 145EA */,/*40155*/8016/* 145EB */,/*40156*/8016/* 145EC */, /*40157*/8016/* 145ED */,/*40158*/8016/* 145EE */,/*40159*/8016/* 145EF */,/*40160*/8016/* 145F0 */, /*40161*/8016/* 145F1 */,/*40162*/8016/* 145F2 */,/*40163*/8016/* 145F3 */,/*40164*/8016/* 145F4 */, /*40165*/8016/* 145F5 */,/*40166*/8016/* 145F6 */,/*40167*/8016/* 145F7 */,/*40168*/8016/* 145F8 */, /*40169*/8016/* 145F9 */,/*40170*/8016/* 145FA */,/*40171*/8016/* 145FB */,/*40172*/8016/* 145FC */, /*40173*/8016/* 145FD */,/*40174*/8016/* 145FE */,/*40175*/8016/* 145FF */,/*40176*/8016/* 14600 */, /*40177*/8016/* 14601 */,/*40178*/8016/* 14602 */,/*40179*/8016/* 14603 */,/*40180*/8016/* 14604 */, /*40181*/8016/* 14605 */,/*40182*/8016/* 14606 */,/*40183*/8016/* 14607 */,/*40184*/8016/* 14608 */, /*40185*/8016/* 14609 */,/*40186*/8016/* 1460A */,/*40187*/8016/* 1460B */,/*40188*/8016/* 1460C */, /*40189*/8016/* 1460D */,/*40190*/8016/* 1460E */,/*40191*/8016/* 1460F */,/*40192*/8016/* 14610 */, /*40193*/8016/* 14611 */,/*40194*/8016/* 14612 */,/*40195*/8016/* 14613 */,/*40196*/8016/* 14614 */, /*40197*/8016/* 14615 */,/*40198*/8016/* 14616 */,/*40199*/8016/* 14617 */,/*40200*/8016/* 14618 */, /*40201*/8016/* 14619 */,/*40202*/8016/* 1461A */,/*40203*/8016/* 1461B */,/*40204*/8016/* 1461C */, /*40205*/8016/* 1461D */,/*40206*/8016/* 1461E */,/*40207*/8016/* 1461F */,/*40208*/8016/* 14620 */, /*40209*/8016/* 14621 */,/*40210*/8016/* 14622 */,/*40211*/8016/* 14623 */,/*40212*/8016/* 14624 */, /*40213*/8016/* 14625 */,/*40214*/8016/* 14626 */,/*40215*/8016/* 14627 */,/*40216*/8016/* 14628 */, /*40217*/8016/* 14629 */,/*40218*/8016/* 1462A */,/*40219*/8016/* 1462B */,/*40220*/8016/* 1462C */, /*40221*/8016/* 1462D */,/*40222*/8016/* 1462E */,/*40223*/8016/* 1462F */,/*40224*/8016/* 14630 */, /*40225*/8016/* 14631 */,/*40226*/8016/* 14632 */,/*40227*/8016/* 14633 */,/*40228*/8016/* 14634 */, /*40229*/8016/* 14635 */,/*40230*/8016/* 14636 */,/*40231*/8016/* 14637 */,/*40232*/8016/* 14638 */, /*40233*/8016/* 14639 */,/*40234*/8016/* 1463A */,/*40235*/8016/* 1463B */,/*40236*/8016/* 1463C */, /*40237*/8016/* 1463D */,/*40238*/8016/* 1463E */,/*40239*/8016/* 1463F */,/*40240*/8016/* 14640 */, /*40241*/8016/* 14641 */,/*40242*/8016/* 14642 */,/*40243*/8016/* 14643 */,/*40244*/8016/* 14644 */, /*40245*/8016/* 14645 */,/*40246*/8016/* 14646 */,/*40247*/8017/* 16800 */,/*40248*/8017/* 16801 */, /*40249*/8017/* 16802 */,/*40250*/8017/* 16803 */,/*40251*/8017/* 16804 */,/*40252*/8017/* 16805 */, /*40253*/8017/* 16806 */,/*40254*/8017/* 16807 */,/*40255*/8017/* 16808 */,/*40256*/8017/* 16809 */, /*40257*/8017/* 1680A */,/*40258*/8017/* 1680B */,/*40259*/8017/* 1680C */,/*40260*/8017/* 1680D */, /*40261*/8017/* 1680E */,/*40262*/8017/* 1680F */,/*40263*/8017/* 16810 */,/*40264*/8017/* 16811 */, /*40265*/8017/* 16812 */,/*40266*/8017/* 16813 */,/*40267*/8017/* 16814 */,/*40268*/8017/* 16815 */, /*40269*/8017/* 16816 */,/*40270*/8017/* 16817 */,/*40271*/8017/* 16818 */,/*40272*/8017/* 16819 */, /*40273*/8017/* 1681A */,/*40274*/8017/* 1681B */,/*40275*/8017/* 1681C */,/*40276*/8017/* 1681D */, /*40277*/8017/* 1681E */,/*40278*/8017/* 1681F */,/*40279*/8017/* 16820 */,/*40280*/8017/* 16821 */, /*40281*/8017/* 16822 */,/*40282*/8017/* 16823 */,/*40283*/8017/* 16824 */,/*40284*/8017/* 16825 */, /*40285*/8017/* 16826 */,/*40286*/8017/* 16827 */,/*40287*/8017/* 16828 */,/*40288*/8017/* 16829 */, /*40289*/8017/* 1682A */,/*40290*/8017/* 1682B */,/*40291*/8017/* 1682C */,/*40292*/8017/* 1682D */, /*40293*/8017/* 1682E */,/*40294*/8017/* 1682F */,/*40295*/8017/* 16830 */,/*40296*/8017/* 16831 */, /*40297*/8017/* 16832 */,/*40298*/8017/* 16833 */,/*40299*/8017/* 16834 */,/*40300*/8017/* 16835 */, /*40301*/8017/* 16836 */,/*40302*/8017/* 16837 */,/*40303*/8017/* 16838 */,/*40304*/8017/* 16839 */, /*40305*/8017/* 1683A */,/*40306*/8017/* 1683B */,/*40307*/8017/* 1683C */,/*40308*/8017/* 1683D */, /*40309*/8017/* 1683E */,/*40310*/8017/* 1683F */,/*40311*/8017/* 16840 */,/*40312*/8017/* 16841 */, /*40313*/8017/* 16842 */,/*40314*/8017/* 16843 */,/*40315*/8017/* 16844 */,/*40316*/8017/* 16845 */, /*40317*/8017/* 16846 */,/*40318*/8017/* 16847 */,/*40319*/8017/* 16848 */,/*40320*/8017/* 16849 */, /*40321*/8017/* 1684A */,/*40322*/8017/* 1684B */,/*40323*/8017/* 1684C */,/*40324*/8017/* 1684D */, /*40325*/8017/* 1684E */,/*40326*/8017/* 1684F */,/*40327*/8017/* 16850 */,/*40328*/8017/* 16851 */, /*40329*/8017/* 16852 */,/*40330*/8017/* 16853 */,/*40331*/8017/* 16854 */,/*40332*/8017/* 16855 */, /*40333*/8017/* 16856 */,/*40334*/8017/* 16857 */,/*40335*/8017/* 16858 */,/*40336*/8017/* 16859 */, /*40337*/8017/* 1685A */,/*40338*/8017/* 1685B */,/*40339*/8017/* 1685C */,/*40340*/8017/* 1685D */, /*40341*/8017/* 1685E */,/*40342*/8017/* 1685F */,/*40343*/8017/* 16860 */,/*40344*/8017/* 16861 */, /*40345*/8017/* 16862 */,/*40346*/8017/* 16863 */,/*40347*/8017/* 16864 */,/*40348*/8017/* 16865 */, /*40349*/8017/* 16866 */,/*40350*/8017/* 16867 */,/*40351*/8017/* 16868 */,/*40352*/8017/* 16869 */, /*40353*/8017/* 1686A */,/*40354*/8017/* 1686B */,/*40355*/8017/* 1686C */,/*40356*/8017/* 1686D */, /*40357*/8017/* 1686E */,/*40358*/8017/* 1686F */,/*40359*/8017/* 16870 */,/*40360*/8017/* 16871 */, /*40361*/8017/* 16872 */,/*40362*/8017/* 16873 */,/*40363*/8017/* 16874 */,/*40364*/8017/* 16875 */, /*40365*/8017/* 16876 */,/*40366*/8017/* 16877 */,/*40367*/8017/* 16878 */,/*40368*/8017/* 16879 */, /*40369*/8017/* 1687A */,/*40370*/8017/* 1687B */,/*40371*/8017/* 1687C */,/*40372*/8017/* 1687D */, /*40373*/8017/* 1687E */,/*40374*/8017/* 1687F */,/*40375*/8017/* 16880 */,/*40376*/8017/* 16881 */, /*40377*/8017/* 16882 */,/*40378*/8017/* 16883 */,/*40379*/8017/* 16884 */,/*40380*/8017/* 16885 */, /*40381*/8017/* 16886 */,/*40382*/8017/* 16887 */,/*40383*/8017/* 16888 */,/*40384*/8017/* 16889 */, /*40385*/8017/* 1688A */,/*40386*/8017/* 1688B */,/*40387*/8017/* 1688C */,/*40388*/8017/* 1688D */, /*40389*/8017/* 1688E */,/*40390*/8017/* 1688F */,/*40391*/8017/* 16890 */,/*40392*/8017/* 16891 */, /*40393*/8017/* 16892 */,/*40394*/8017/* 16893 */,/*40395*/8017/* 16894 */,/*40396*/8017/* 16895 */, /*40397*/8017/* 16896 */,/*40398*/8017/* 16897 */,/*40399*/8017/* 16898 */,/*40400*/8017/* 16899 */, /*40401*/8017/* 1689A */,/*40402*/8017/* 1689B */,/*40403*/8017/* 1689C */,/*40404*/8017/* 1689D */, /*40405*/8017/* 1689E */,/*40406*/8017/* 1689F */,/*40407*/8017/* 168A0 */,/*40408*/8017/* 168A1 */, /*40409*/8017/* 168A2 */,/*40410*/8017/* 168A3 */,/*40411*/8017/* 168A4 */,/*40412*/8017/* 168A5 */, /*40413*/8017/* 168A6 */,/*40414*/8017/* 168A7 */,/*40415*/8017/* 168A8 */,/*40416*/8017/* 168A9 */, /*40417*/8017/* 168AA */,/*40418*/8017/* 168AB */,/*40419*/8017/* 168AC */,/*40420*/8017/* 168AD */, /*40421*/8017/* 168AE */,/*40422*/8017/* 168AF */,/*40423*/8017/* 168B0 */,/*40424*/8017/* 168B1 */, /*40425*/8017/* 168B2 */,/*40426*/8017/* 168B3 */,/*40427*/8017/* 168B4 */,/*40428*/8017/* 168B5 */, /*40429*/8017/* 168B6 */,/*40430*/8017/* 168B7 */,/*40431*/8017/* 168B8 */,/*40432*/8017/* 168B9 */, /*40433*/8017/* 168BA */,/*40434*/8017/* 168BB */,/*40435*/8017/* 168BC */,/*40436*/8017/* 168BD */, /*40437*/8017/* 168BE */,/*40438*/8017/* 168BF */,/*40439*/8017/* 168C0 */,/*40440*/8017/* 168C1 */, /*40441*/8017/* 168C2 */,/*40442*/8017/* 168C3 */,/*40443*/8017/* 168C4 */,/*40444*/8017/* 168C5 */, /*40445*/8017/* 168C6 */,/*40446*/8017/* 168C7 */,/*40447*/8017/* 168C8 */,/*40448*/8017/* 168C9 */, /*40449*/8017/* 168CA */,/*40450*/8017/* 168CB */,/*40451*/8017/* 168CC */,/*40452*/8017/* 168CD */, /*40453*/8017/* 168CE */,/*40454*/8017/* 168CF */,/*40455*/8017/* 168D0 */,/*40456*/8017/* 168D1 */, /*40457*/8017/* 168D2 */,/*40458*/8017/* 168D3 */,/*40459*/8017/* 168D4 */,/*40460*/8017/* 168D5 */, /*40461*/8017/* 168D6 */,/*40462*/8017/* 168D7 */,/*40463*/8017/* 168D8 */,/*40464*/8017/* 168D9 */, /*40465*/8017/* 168DA */,/*40466*/8017/* 168DB */,/*40467*/8017/* 168DC */,/*40468*/8017/* 168DD */, /*40469*/8017/* 168DE */,/*40470*/8017/* 168DF */,/*40471*/8017/* 168E0 */,/*40472*/8017/* 168E1 */, /*40473*/8017/* 168E2 */,/*40474*/8017/* 168E3 */,/*40475*/8017/* 168E4 */,/*40476*/8017/* 168E5 */, /*40477*/8017/* 168E6 */,/*40478*/8017/* 168E7 */,/*40479*/8017/* 168E8 */,/*40480*/8017/* 168E9 */, /*40481*/8017/* 168EA */,/*40482*/8017/* 168EB */,/*40483*/8017/* 168EC */,/*40484*/8017/* 168ED */, /*40485*/8017/* 168EE */,/*40486*/8017/* 168EF */,/*40487*/8017/* 168F0 */,/*40488*/8017/* 168F1 */, /*40489*/8017/* 168F2 */,/*40490*/8017/* 168F3 */,/*40491*/8017/* 168F4 */,/*40492*/8017/* 168F5 */, /*40493*/8017/* 168F6 */,/*40494*/8017/* 168F7 */,/*40495*/8017/* 168F8 */,/*40496*/8017/* 168F9 */, /*40497*/8017/* 168FA */,/*40498*/8017/* 168FB */,/*40499*/8017/* 168FC */,/*40500*/8017/* 168FD */, /*40501*/8017/* 168FE */,/*40502*/8017/* 168FF */,/*40503*/8017/* 16900 */,/*40504*/8017/* 16901 */, /*40505*/8017/* 16902 */,/*40506*/8017/* 16903 */,/*40507*/8017/* 16904 */,/*40508*/8017/* 16905 */, /*40509*/8017/* 16906 */,/*40510*/8017/* 16907 */,/*40511*/8017/* 16908 */,/*40512*/8017/* 16909 */, /*40513*/8017/* 1690A */,/*40514*/8017/* 1690B */,/*40515*/8017/* 1690C */,/*40516*/8017/* 1690D */, /*40517*/8017/* 1690E */,/*40518*/8017/* 1690F */,/*40519*/8017/* 16910 */,/*40520*/8017/* 16911 */, /*40521*/8017/* 16912 */,/*40522*/8017/* 16913 */,/*40523*/8017/* 16914 */,/*40524*/8017/* 16915 */, /*40525*/8017/* 16916 */,/*40526*/8017/* 16917 */,/*40527*/8017/* 16918 */,/*40528*/8017/* 16919 */, /*40529*/8017/* 1691A */,/*40530*/8017/* 1691B */,/*40531*/8017/* 1691C */,/*40532*/8017/* 1691D */, /*40533*/8017/* 1691E */,/*40534*/8017/* 1691F */,/*40535*/8017/* 16920 */,/*40536*/8017/* 16921 */, /*40537*/8017/* 16922 */,/*40538*/8017/* 16923 */,/*40539*/8017/* 16924 */,/*40540*/8017/* 16925 */, /*40541*/8017/* 16926 */,/*40542*/8017/* 16927 */,/*40543*/8017/* 16928 */,/*40544*/8017/* 16929 */, /*40545*/8017/* 1692A */,/*40546*/8017/* 1692B */,/*40547*/8017/* 1692C */,/*40548*/8017/* 1692D */, /*40549*/8017/* 1692E */,/*40550*/8017/* 1692F */,/*40551*/8017/* 16930 */,/*40552*/8017/* 16931 */, /*40553*/8017/* 16932 */,/*40554*/8017/* 16933 */,/*40555*/8017/* 16934 */,/*40556*/8017/* 16935 */, /*40557*/8017/* 16936 */,/*40558*/8017/* 16937 */,/*40559*/8017/* 16938 */,/*40560*/8017/* 16939 */, /*40561*/8017/* 1693A */,/*40562*/8017/* 1693B */,/*40563*/8017/* 1693C */,/*40564*/8017/* 1693D */, /*40565*/8017/* 1693E */,/*40566*/8017/* 1693F */,/*40567*/8017/* 16940 */,/*40568*/8017/* 16941 */, /*40569*/8017/* 16942 */,/*40570*/8017/* 16943 */,/*40571*/8017/* 16944 */,/*40572*/8017/* 16945 */, /*40573*/8017/* 16946 */,/*40574*/8017/* 16947 */,/*40575*/8017/* 16948 */,/*40576*/8017/* 16949 */, /*40577*/8017/* 1694A */,/*40578*/8017/* 1694B */,/*40579*/8017/* 1694C */,/*40580*/8017/* 1694D */, /*40581*/8017/* 1694E */,/*40582*/8017/* 1694F */,/*40583*/8017/* 16950 */,/*40584*/8017/* 16951 */, /*40585*/8017/* 16952 */,/*40586*/8017/* 16953 */,/*40587*/8017/* 16954 */,/*40588*/8017/* 16955 */, /*40589*/8017/* 16956 */,/*40590*/8017/* 16957 */,/*40591*/8017/* 16958 */,/*40592*/8017/* 16959 */, /*40593*/8017/* 1695A */,/*40594*/8017/* 1695B */,/*40595*/8017/* 1695C */,/*40596*/8017/* 1695D */, /*40597*/8017/* 1695E */,/*40598*/8017/* 1695F */,/*40599*/8017/* 16960 */,/*40600*/8017/* 16961 */, /*40601*/8017/* 16962 */,/*40602*/8017/* 16963 */,/*40603*/8017/* 16964 */,/*40604*/8017/* 16965 */, /*40605*/8017/* 16966 */,/*40606*/8017/* 16967 */,/*40607*/8017/* 16968 */,/*40608*/8017/* 16969 */, /*40609*/8017/* 1696A */,/*40610*/8017/* 1696B */,/*40611*/8017/* 1696C */,/*40612*/8017/* 1696D */, /*40613*/8017/* 1696E */,/*40614*/8017/* 1696F */,/*40615*/8017/* 16970 */,/*40616*/8017/* 16971 */, /*40617*/8017/* 16972 */,/*40618*/8017/* 16973 */,/*40619*/8017/* 16974 */,/*40620*/8017/* 16975 */, /*40621*/8017/* 16976 */,/*40622*/8017/* 16977 */,/*40623*/8017/* 16978 */,/*40624*/8017/* 16979 */, /*40625*/8017/* 1697A */,/*40626*/8017/* 1697B */,/*40627*/8017/* 1697C */,/*40628*/8017/* 1697D */, /*40629*/8017/* 1697E */,/*40630*/8017/* 1697F */,/*40631*/8017/* 16980 */,/*40632*/8017/* 16981 */, /*40633*/8017/* 16982 */,/*40634*/8017/* 16983 */,/*40635*/8017/* 16984 */,/*40636*/8017/* 16985 */, /*40637*/8017/* 16986 */,/*40638*/8017/* 16987 */,/*40639*/8017/* 16988 */,/*40640*/8017/* 16989 */, /*40641*/8017/* 1698A */,/*40642*/8017/* 1698B */,/*40643*/8017/* 1698C */,/*40644*/8017/* 1698D */, /*40645*/8017/* 1698E */,/*40646*/8017/* 1698F */,/*40647*/8017/* 16990 */,/*40648*/8017/* 16991 */, /*40649*/8017/* 16992 */,/*40650*/8017/* 16993 */,/*40651*/8017/* 16994 */,/*40652*/8017/* 16995 */, /*40653*/8017/* 16996 */,/*40654*/8017/* 16997 */,/*40655*/8017/* 16998 */,/*40656*/8017/* 16999 */, /*40657*/8017/* 1699A */,/*40658*/8017/* 1699B */,/*40659*/8017/* 1699C */,/*40660*/8017/* 1699D */, /*40661*/8017/* 1699E */,/*40662*/8017/* 1699F */,/*40663*/8017/* 169A0 */,/*40664*/8017/* 169A1 */, /*40665*/8017/* 169A2 */,/*40666*/8017/* 169A3 */,/*40667*/8017/* 169A4 */,/*40668*/8017/* 169A5 */, /*40669*/8017/* 169A6 */,/*40670*/8017/* 169A7 */,/*40671*/8017/* 169A8 */,/*40672*/8017/* 169A9 */, /*40673*/8017/* 169AA */,/*40674*/8017/* 169AB */,/*40675*/8017/* 169AC */,/*40676*/8017/* 169AD */, /*40677*/8017/* 169AE */,/*40678*/8017/* 169AF */,/*40679*/8017/* 169B0 */,/*40680*/8017/* 169B1 */, /*40681*/8017/* 169B2 */,/*40682*/8017/* 169B3 */,/*40683*/8017/* 169B4 */,/*40684*/8017/* 169B5 */, /*40685*/8017/* 169B6 */,/*40686*/8017/* 169B7 */,/*40687*/8017/* 169B8 */,/*40688*/8017/* 169B9 */, /*40689*/8017/* 169BA */,/*40690*/8017/* 169BB */,/*40691*/8017/* 169BC */,/*40692*/8017/* 169BD */, /*40693*/8017/* 169BE */,/*40694*/8017/* 169BF */,/*40695*/8017/* 169C0 */,/*40696*/8017/* 169C1 */, /*40697*/8017/* 169C2 */,/*40698*/8017/* 169C3 */,/*40699*/8017/* 169C4 */,/*40700*/8017/* 169C5 */, /*40701*/8017/* 169C6 */,/*40702*/8017/* 169C7 */,/*40703*/8017/* 169C8 */,/*40704*/8017/* 169C9 */, /*40705*/8017/* 169CA */,/*40706*/8017/* 169CB */,/*40707*/8017/* 169CC */,/*40708*/8017/* 169CD */, /*40709*/8017/* 169CE */,/*40710*/8017/* 169CF */,/*40711*/8017/* 169D0 */,/*40712*/8017/* 169D1 */, /*40713*/8017/* 169D2 */,/*40714*/8017/* 169D3 */,/*40715*/8017/* 169D4 */,/*40716*/8017/* 169D5 */, /*40717*/8017/* 169D6 */,/*40718*/8017/* 169D7 */,/*40719*/8017/* 169D8 */,/*40720*/8017/* 169D9 */, /*40721*/8017/* 169DA */,/*40722*/8017/* 169DB */,/*40723*/8017/* 169DC */,/*40724*/8017/* 169DD */, /*40725*/8017/* 169DE */,/*40726*/8017/* 169DF */,/*40727*/8017/* 169E0 */,/*40728*/8017/* 169E1 */, /*40729*/8017/* 169E2 */,/*40730*/8017/* 169E3 */,/*40731*/8017/* 169E4 */,/*40732*/8017/* 169E5 */, /*40733*/8017/* 169E6 */,/*40734*/8017/* 169E7 */,/*40735*/8017/* 169E8 */,/*40736*/8017/* 169E9 */, /*40737*/8017/* 169EA */,/*40738*/8017/* 169EB */,/*40739*/8017/* 169EC */,/*40740*/8017/* 169ED */, /*40741*/8017/* 169EE */,/*40742*/8017/* 169EF */,/*40743*/8017/* 169F0 */,/*40744*/8017/* 169F1 */, /*40745*/8017/* 169F2 */,/*40746*/8017/* 169F3 */,/*40747*/8017/* 169F4 */,/*40748*/8017/* 169F5 */, /*40749*/8017/* 169F6 */,/*40750*/8017/* 169F7 */,/*40751*/8017/* 169F8 */,/*40752*/8017/* 169F9 */, /*40753*/8017/* 169FA */,/*40754*/8017/* 169FB */,/*40755*/8017/* 169FC */,/*40756*/8017/* 169FD */, /*40757*/8017/* 169FE */,/*40758*/8017/* 169FF */,/*40759*/8017/* 16A00 */,/*40760*/8017/* 16A01 */, /*40761*/8017/* 16A02 */,/*40762*/8017/* 16A03 */,/*40763*/8017/* 16A04 */,/*40764*/8017/* 16A05 */, /*40765*/8017/* 16A06 */,/*40766*/8017/* 16A07 */,/*40767*/8017/* 16A08 */,/*40768*/8017/* 16A09 */, /*40769*/8017/* 16A0A */,/*40770*/8017/* 16A0B */,/*40771*/8017/* 16A0C */,/*40772*/8017/* 16A0D */, /*40773*/8017/* 16A0E */,/*40774*/8017/* 16A0F */,/*40775*/8017/* 16A10 */,/*40776*/8017/* 16A11 */, /*40777*/8017/* 16A12 */,/*40778*/8017/* 16A13 */,/*40779*/8017/* 16A14 */,/*40780*/8017/* 16A15 */, /*40781*/8017/* 16A16 */,/*40782*/8017/* 16A17 */,/*40783*/8017/* 16A18 */,/*40784*/8017/* 16A19 */, /*40785*/8017/* 16A1A */,/*40786*/8017/* 16A1B */,/*40787*/8017/* 16A1C */,/*40788*/8017/* 16A1D */, /*40789*/8017/* 16A1E */,/*40790*/8017/* 16A1F */,/*40791*/8017/* 16A20 */,/*40792*/8017/* 16A21 */, /*40793*/8017/* 16A22 */,/*40794*/8017/* 16A23 */,/*40795*/8017/* 16A24 */,/*40796*/8017/* 16A25 */, /*40797*/8017/* 16A26 */,/*40798*/8017/* 16A27 */,/*40799*/8017/* 16A28 */,/*40800*/8017/* 16A29 */, /*40801*/8017/* 16A2A */,/*40802*/8017/* 16A2B */,/*40803*/8017/* 16A2C */,/*40804*/8017/* 16A2D */, /*40805*/8017/* 16A2E */,/*40806*/8017/* 16A2F */,/*40807*/8017/* 16A30 */,/*40808*/8017/* 16A31 */, /*40809*/8017/* 16A32 */,/*40810*/8017/* 16A33 */,/*40811*/8017/* 16A34 */,/*40812*/8017/* 16A35 */, /*40813*/8017/* 16A36 */,/*40814*/8017/* 16A37 */,/*40815*/8017/* 16A38 */,0,0,0,0,0,0,0,/*40823*/8018/* 16A40 */, /*40824*/8018/* 16A41 */,/*40825*/8018/* 16A42 */,/*40826*/8018/* 16A43 */,/*40827*/8018/* 16A44 */, /*40828*/8018/* 16A45 */,/*40829*/8018/* 16A46 */,/*40830*/8018/* 16A47 */,/*40831*/8018/* 16A48 */, /*40832*/8018/* 16A49 */,/*40833*/8018/* 16A4A */,/*40834*/8018/* 16A4B */,/*40835*/8018/* 16A4C */, /*40836*/8018/* 16A4D */,/*40837*/8018/* 16A4E */,/*40838*/8018/* 16A4F */,/*40839*/8018/* 16A50 */, /*40840*/8018/* 16A51 */,/*40841*/8018/* 16A52 */,/*40842*/8018/* 16A53 */,/*40843*/8018/* 16A54 */, /*40844*/8018/* 16A55 */,/*40845*/8018/* 16A56 */,/*40846*/8018/* 16A57 */,/*40847*/8018/* 16A58 */, /*40848*/8018/* 16A59 */,/*40849*/8018/* 16A5A */,/*40850*/8018/* 16A5B */,/*40851*/8018/* 16A5C */, /*40852*/8018/* 16A5D */,/*40853*/8018/* 16A5E */,0,/*40855*/8019/* 16A60 */,/*40856*/8020/* 16A61 */, /*40857*/8021/* 16A62 */,/*40858*/8022/* 16A63 */,/*40859*/8023/* 16A64 */,/*40860*/8024/* 16A65 */, /*40861*/8025/* 16A66 */,/*40862*/8026/* 16A67 */,/*40863*/8027/* 16A68 */,/*40864*/8028/* 16A69 */,0,0,0,0, /*40869*/8029/* 16A6E */,/*40870*/8029/* 16A6F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*40967*/8030/* 16AD0 */,/*40968*/8030/* 16AD1 */,/*40969*/8030/* 16AD2 */,/*40970*/8030/* 16AD3 */, /*40971*/8030/* 16AD4 */,/*40972*/8030/* 16AD5 */,/*40973*/8030/* 16AD6 */,/*40974*/8030/* 16AD7 */, /*40975*/8030/* 16AD8 */,/*40976*/8030/* 16AD9 */,/*40977*/8030/* 16ADA */,/*40978*/8030/* 16ADB */, /*40979*/8030/* 16ADC */,/*40980*/8030/* 16ADD */,/*40981*/8030/* 16ADE */,/*40982*/8030/* 16ADF */, /*40983*/8030/* 16AE0 */,/*40984*/8030/* 16AE1 */,/*40985*/8030/* 16AE2 */,/*40986*/8030/* 16AE3 */, /*40987*/8030/* 16AE4 */,/*40988*/8030/* 16AE5 */,/*40989*/8030/* 16AE6 */,/*40990*/8030/* 16AE7 */, /*40991*/8030/* 16AE8 */,/*40992*/8030/* 16AE9 */,/*40993*/8030/* 16AEA */,/*40994*/8030/* 16AEB */, /*40995*/8030/* 16AEC */,/*40996*/8030/* 16AED */,0,0,/*40999*/8031/* 16AF0 */,/*41000*/8031/* 16AF1 */, /*41001*/8031/* 16AF2 */,/*41002*/8031/* 16AF3 */,/*41003*/8031/* 16AF4 */,/*41004*/8032/* 16AF5 */,0,0,0,0,0,0,0,0,0,0, /*41015*/8033/* 16B00 */,/*41016*/8033/* 16B01 */,/*41017*/8033/* 16B02 */,/*41018*/8033/* 16B03 */, /*41019*/8033/* 16B04 */,/*41020*/8033/* 16B05 */,/*41021*/8033/* 16B06 */,/*41022*/8033/* 16B07 */, /*41023*/8033/* 16B08 */,/*41024*/8033/* 16B09 */,/*41025*/8033/* 16B0A */,/*41026*/8033/* 16B0B */, /*41027*/8033/* 16B0C */,/*41028*/8033/* 16B0D */,/*41029*/8033/* 16B0E */,/*41030*/8033/* 16B0F */, /*41031*/8033/* 16B10 */,/*41032*/8033/* 16B11 */,/*41033*/8033/* 16B12 */,/*41034*/8033/* 16B13 */, /*41035*/8033/* 16B14 */,/*41036*/8033/* 16B15 */,/*41037*/8033/* 16B16 */,/*41038*/8033/* 16B17 */, /*41039*/8033/* 16B18 */,/*41040*/8033/* 16B19 */,/*41041*/8033/* 16B1A */,/*41042*/8033/* 16B1B */, /*41043*/8033/* 16B1C */,/*41044*/8033/* 16B1D */,/*41045*/8033/* 16B1E */,/*41046*/8033/* 16B1F */, /*41047*/8033/* 16B20 */,/*41048*/8033/* 16B21 */,/*41049*/8033/* 16B22 */,/*41050*/8033/* 16B23 */, /*41051*/8033/* 16B24 */,/*41052*/8033/* 16B25 */,/*41053*/8033/* 16B26 */,/*41054*/8033/* 16B27 */, /*41055*/8033/* 16B28 */,/*41056*/8033/* 16B29 */,/*41057*/8033/* 16B2A */,/*41058*/8033/* 16B2B */, /*41059*/8033/* 16B2C */,/*41060*/8033/* 16B2D */,/*41061*/8033/* 16B2E */,/*41062*/8033/* 16B2F */, /*41063*/8034/* 16B30 */,/*41064*/8034/* 16B31 */,/*41065*/8034/* 16B32 */,/*41066*/8034/* 16B33 */, /*41067*/8034/* 16B34 */,/*41068*/8034/* 16B35 */,/*41069*/8034/* 16B36 */,/*41070*/8035/* 16B37 */, /*41071*/8035/* 16B38 */,/*41072*/8036/* 16B39 */,/*41073*/8037/* 16B3A */,/*41074*/8037/* 16B3B */, /*41075*/8038/* 16B3C */,/*41076*/8038/* 16B3D */,/*41077*/8038/* 16B3E */,/*41078*/8038/* 16B3F */, /*41079*/8039/* 16B40 */,/*41080*/8039/* 16B41 */,/*41081*/8040/* 16B42 */,/*41082*/8040/* 16B43 */, /*41083*/8035/* 16B44 */,/*41084*/8038/* 16B45 */,0,0,0,0,0,0,0,0,0,0,/*41095*/8041/* 16B50 */,/*41096*/8042/* 16B51 */, /*41097*/8043/* 16B52 */,/*41098*/8044/* 16B53 */,/*41099*/8045/* 16B54 */,/*41100*/8046/* 16B55 */, /*41101*/8047/* 16B56 */,/*41102*/8048/* 16B57 */,/*41103*/8049/* 16B58 */,/*41104*/8050/* 16B59 */,0, /*41106*/8051/* 16B5B */,/*41107*/8052/* 16B5C */,/*41108*/8053/* 16B5D */,/*41109*/8054/* 16B5E */, /*41110*/8055/* 16B5F */,/*41111*/8056/* 16B60 */,/*41112*/8057/* 16B61 */,0,/*41114*/8033/* 16B63 */, /*41115*/8033/* 16B64 */,/*41116*/8033/* 16B65 */,/*41117*/8033/* 16B66 */,/*41118*/8033/* 16B67 */, /*41119*/8033/* 16B68 */,/*41120*/8033/* 16B69 */,/*41121*/8033/* 16B6A */,/*41122*/8033/* 16B6B */, /*41123*/8033/* 16B6C */,/*41124*/8033/* 16B6D */,/*41125*/8033/* 16B6E */,/*41126*/8033/* 16B6F */, /*41127*/8033/* 16B70 */,/*41128*/8033/* 16B71 */,/*41129*/8033/* 16B72 */,/*41130*/8033/* 16B73 */, /*41131*/8033/* 16B74 */,/*41132*/8033/* 16B75 */,/*41133*/8033/* 16B76 */,/*41134*/8033/* 16B77 */,0,0,0,0,0, /*41140*/8033/* 16B7D */,/*41141*/8033/* 16B7E */,/*41142*/8033/* 16B7F */,/*41143*/8033/* 16B80 */, /*41144*/8033/* 16B81 */,/*41145*/8033/* 16B82 */,/*41146*/8033/* 16B83 */,/*41147*/8033/* 16B84 */, /*41148*/8033/* 16B85 */,/*41149*/8033/* 16B86 */,/*41150*/8033/* 16B87 */,/*41151*/8033/* 16B88 */, /*41152*/8033/* 16B89 */,/*41153*/8033/* 16B8A */,/*41154*/8033/* 16B8B */,/*41155*/8033/* 16B8C */, /*41156*/8033/* 16B8D */,/*41157*/8033/* 16B8E */,/*41158*/8033/* 16B8F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*42039*/8058/* 16F00 */,/*42040*/8058/* 16F01 */,/*42041*/8058/* 16F02 */, /*42042*/8058/* 16F03 */,/*42043*/8058/* 16F04 */,/*42044*/8058/* 16F05 */,/*42045*/8058/* 16F06 */, /*42046*/8058/* 16F07 */,/*42047*/8058/* 16F08 */,/*42048*/8058/* 16F09 */,/*42049*/8058/* 16F0A */, /*42050*/8058/* 16F0B */,/*42051*/8058/* 16F0C */,/*42052*/8058/* 16F0D */,/*42053*/8058/* 16F0E */, /*42054*/8058/* 16F0F */,/*42055*/8058/* 16F10 */,/*42056*/8058/* 16F11 */,/*42057*/8058/* 16F12 */, /*42058*/8058/* 16F13 */,/*42059*/8058/* 16F14 */,/*42060*/8058/* 16F15 */,/*42061*/8058/* 16F16 */, /*42062*/8058/* 16F17 */,/*42063*/8058/* 16F18 */,/*42064*/8058/* 16F19 */,/*42065*/8058/* 16F1A */, /*42066*/8058/* 16F1B */,/*42067*/8058/* 16F1C */,/*42068*/8058/* 16F1D */,/*42069*/8058/* 16F1E */, /*42070*/8058/* 16F1F */,/*42071*/8058/* 16F20 */,/*42072*/8058/* 16F21 */,/*42073*/8058/* 16F22 */, /*42074*/8058/* 16F23 */,/*42075*/8058/* 16F24 */,/*42076*/8058/* 16F25 */,/*42077*/8058/* 16F26 */, /*42078*/8058/* 16F27 */,/*42079*/8058/* 16F28 */,/*42080*/8058/* 16F29 */,/*42081*/8058/* 16F2A */, /*42082*/8058/* 16F2B */,/*42083*/8058/* 16F2C */,/*42084*/8058/* 16F2D */,/*42085*/8058/* 16F2E */, /*42086*/8058/* 16F2F */,/*42087*/8058/* 16F30 */,/*42088*/8058/* 16F31 */,/*42089*/8058/* 16F32 */, /*42090*/8058/* 16F33 */,/*42091*/8058/* 16F34 */,/*42092*/8058/* 16F35 */,/*42093*/8058/* 16F36 */, /*42094*/8058/* 16F37 */,/*42095*/8058/* 16F38 */,/*42096*/8058/* 16F39 */,/*42097*/8058/* 16F3A */, /*42098*/8058/* 16F3B */,/*42099*/8058/* 16F3C */,/*42100*/8058/* 16F3D */,/*42101*/8058/* 16F3E */, /*42102*/8058/* 16F3F */,/*42103*/8058/* 16F40 */,/*42104*/8058/* 16F41 */,/*42105*/8058/* 16F42 */, /*42106*/8058/* 16F43 */,/*42107*/8058/* 16F44 */,0,0,0,0,0,0,0,0,0,0,0,/*42119*/8058/* 16F50 */, /*42120*/8059/* 16F51 */,/*42121*/8059/* 16F52 */,/*42122*/8059/* 16F53 */,/*42123*/8059/* 16F54 */, /*42124*/8059/* 16F55 */,/*42125*/8059/* 16F56 */,/*42126*/8059/* 16F57 */,/*42127*/8059/* 16F58 */, /*42128*/8059/* 16F59 */,/*42129*/8059/* 16F5A */,/*42130*/8059/* 16F5B */,/*42131*/8059/* 16F5C */, /*42132*/8059/* 16F5D */,/*42133*/8059/* 16F5E */,/*42134*/8059/* 16F5F */,/*42135*/8059/* 16F60 */, /*42136*/8059/* 16F61 */,/*42137*/8059/* 16F62 */,/*42138*/8059/* 16F63 */,/*42139*/8059/* 16F64 */, /*42140*/8059/* 16F65 */,/*42141*/8059/* 16F66 */,/*42142*/8059/* 16F67 */,/*42143*/8059/* 16F68 */, /*42144*/8059/* 16F69 */,/*42145*/8059/* 16F6A */,/*42146*/8059/* 16F6B */,/*42147*/8059/* 16F6C */, /*42148*/8059/* 16F6D */,/*42149*/8059/* 16F6E */,/*42150*/8059/* 16F6F */,/*42151*/8059/* 16F70 */, /*42152*/8059/* 16F71 */,/*42153*/8059/* 16F72 */,/*42154*/8059/* 16F73 */,/*42155*/8059/* 16F74 */, /*42156*/8059/* 16F75 */,/*42157*/8059/* 16F76 */,/*42158*/8059/* 16F77 */,/*42159*/8059/* 16F78 */, /*42160*/8059/* 16F79 */,/*42161*/8059/* 16F7A */,/*42162*/8059/* 16F7B */,/*42163*/8059/* 16F7C */, /*42164*/8059/* 16F7D */,/*42165*/8059/* 16F7E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*42182*/8060/* 16F8F */, /*42183*/8060/* 16F90 */,/*42184*/8060/* 16F91 */,/*42185*/8060/* 16F92 */,/*42186*/8061/* 16F93 */, /*42187*/8061/* 16F94 */,/*42188*/8061/* 16F95 */,/*42189*/8061/* 16F96 */,/*42190*/8061/* 16F97 */, /*42191*/8061/* 16F98 */,/*42192*/8061/* 16F99 */,/*42193*/8061/* 16F9A */,/*42194*/8061/* 16F9B */, /*42195*/8061/* 16F9C */,/*42196*/8061/* 16F9D */,/*42197*/8061/* 16F9E */,/*42198*/8061/* 16F9F */, /*42199*/8062/* 1B000 */,/*42200*/8063/* 1B001 */,/*42201*/8064/* 1BC00 */,/*42202*/8064/* 1BC01 */, /*42203*/8064/* 1BC02 */,/*42204*/8064/* 1BC03 */,/*42205*/8064/* 1BC04 */,/*42206*/8064/* 1BC05 */, /*42207*/8064/* 1BC06 */,/*42208*/8064/* 1BC07 */,/*42209*/8064/* 1BC08 */,/*42210*/8064/* 1BC09 */, /*42211*/8064/* 1BC0A */,/*42212*/8064/* 1BC0B */,/*42213*/8064/* 1BC0C */,/*42214*/8064/* 1BC0D */, /*42215*/8064/* 1BC0E */,/*42216*/8064/* 1BC0F */,/*42217*/8064/* 1BC10 */,/*42218*/8064/* 1BC11 */, /*42219*/8064/* 1BC12 */,/*42220*/8064/* 1BC13 */,/*42221*/8064/* 1BC14 */,/*42222*/8064/* 1BC15 */, /*42223*/8064/* 1BC16 */,/*42224*/8064/* 1BC17 */,/*42225*/8064/* 1BC18 */,/*42226*/8064/* 1BC19 */, /*42227*/8064/* 1BC1A */,/*42228*/8064/* 1BC1B */,/*42229*/8064/* 1BC1C */,/*42230*/8064/* 1BC1D */, /*42231*/8064/* 1BC1E */,/*42232*/8064/* 1BC1F */,/*42233*/8064/* 1BC20 */,/*42234*/8064/* 1BC21 */, /*42235*/8064/* 1BC22 */,/*42236*/8064/* 1BC23 */,/*42237*/8064/* 1BC24 */,/*42238*/8064/* 1BC25 */, /*42239*/8064/* 1BC26 */,/*42240*/8064/* 1BC27 */,/*42241*/8064/* 1BC28 */,/*42242*/8064/* 1BC29 */, /*42243*/8064/* 1BC2A */,/*42244*/8064/* 1BC2B */,/*42245*/8064/* 1BC2C */,/*42246*/8064/* 1BC2D */, /*42247*/8064/* 1BC2E */,/*42248*/8064/* 1BC2F */,/*42249*/8064/* 1BC30 */,/*42250*/8064/* 1BC31 */, /*42251*/8064/* 1BC32 */,/*42252*/8064/* 1BC33 */,/*42253*/8064/* 1BC34 */,/*42254*/8064/* 1BC35 */, /*42255*/8064/* 1BC36 */,/*42256*/8064/* 1BC37 */,/*42257*/8064/* 1BC38 */,/*42258*/8064/* 1BC39 */, /*42259*/8064/* 1BC3A */,/*42260*/8064/* 1BC3B */,/*42261*/8064/* 1BC3C */,/*42262*/8064/* 1BC3D */, /*42263*/8064/* 1BC3E */,/*42264*/8064/* 1BC3F */,/*42265*/8064/* 1BC40 */,/*42266*/8064/* 1BC41 */, /*42267*/8064/* 1BC42 */,/*42268*/8064/* 1BC43 */,/*42269*/8064/* 1BC44 */,/*42270*/8064/* 1BC45 */, /*42271*/8064/* 1BC46 */,/*42272*/8064/* 1BC47 */,/*42273*/8064/* 1BC48 */,/*42274*/8064/* 1BC49 */, /*42275*/8064/* 1BC4A */,/*42276*/8064/* 1BC4B */,/*42277*/8064/* 1BC4C */,/*42278*/8064/* 1BC4D */, /*42279*/8064/* 1BC4E */,/*42280*/8064/* 1BC4F */,/*42281*/8064/* 1BC50 */,/*42282*/8064/* 1BC51 */, /*42283*/8064/* 1BC52 */,/*42284*/8064/* 1BC53 */,/*42285*/8064/* 1BC54 */,/*42286*/8064/* 1BC55 */, /*42287*/8064/* 1BC56 */,/*42288*/8064/* 1BC57 */,/*42289*/8064/* 1BC58 */,/*42290*/8064/* 1BC59 */, /*42291*/8064/* 1BC5A */,/*42292*/8064/* 1BC5B */,/*42293*/8064/* 1BC5C */,/*42294*/8064/* 1BC5D */, /*42295*/8064/* 1BC5E */,/*42296*/8064/* 1BC5F */,/*42297*/8064/* 1BC60 */,/*42298*/8064/* 1BC61 */, /*42299*/8064/* 1BC62 */,/*42300*/8064/* 1BC63 */,/*42301*/8064/* 1BC64 */,/*42302*/8064/* 1BC65 */, /*42303*/8064/* 1BC66 */,/*42304*/8064/* 1BC67 */,/*42305*/8064/* 1BC68 */,/*42306*/8064/* 1BC69 */, /*42307*/8064/* 1BC6A */,0,0,0,0,0,/*42313*/8064/* 1BC70 */,/*42314*/8064/* 1BC71 */,/*42315*/8064/* 1BC72 */, /*42316*/8064/* 1BC73 */,/*42317*/8064/* 1BC74 */,/*42318*/8064/* 1BC75 */,/*42319*/8064/* 1BC76 */, /*42320*/8064/* 1BC77 */,/*42321*/8064/* 1BC78 */,/*42322*/8064/* 1BC79 */,/*42323*/8064/* 1BC7A */, /*42324*/8064/* 1BC7B */,/*42325*/8064/* 1BC7C */,0,0,0,/*42329*/8064/* 1BC80 */,/*42330*/8064/* 1BC81 */, /*42331*/8064/* 1BC82 */,/*42332*/8064/* 1BC83 */,/*42333*/8064/* 1BC84 */,/*42334*/8064/* 1BC85 */, /*42335*/8064/* 1BC86 */,/*42336*/8064/* 1BC87 */,/*42337*/8064/* 1BC88 */,0,0,0,0,0,0,0,/*42345*/8064/* 1BC90 */, /*42346*/8064/* 1BC91 */,/*42347*/8064/* 1BC92 */,/*42348*/8064/* 1BC93 */,/*42349*/8064/* 1BC94 */, /*42350*/8064/* 1BC95 */,/*42351*/8064/* 1BC96 */,/*42352*/8064/* 1BC97 */,/*42353*/8064/* 1BC98 */, /*42354*/8064/* 1BC99 */,0,0,/*42357*/8065/* 1BC9C */,/*42358*/8066/* 1BC9D */,/*42359*/8067/* 1BC9E */, /*42360*/8068/* 1BC9F */,/*42361*/8069/* 1BCA0 */,/*42362*/8069/* 1BCA1 */,/*42363*/8069/* 1BCA2 */, /*42364*/8069/* 1BCA3 */,/*42365*/8070/* 1D000 */,/*42366*/8070/* 1D001 */,/*42367*/8070/* 1D002 */, /*42368*/8070/* 1D003 */,/*42369*/8070/* 1D004 */,/*42370*/8070/* 1D005 */,/*42371*/8070/* 1D006 */, /*42372*/8070/* 1D007 */,/*42373*/8070/* 1D008 */,/*42374*/8070/* 1D009 */,/*42375*/8070/* 1D00A */, /*42376*/8070/* 1D00B */,/*42377*/8070/* 1D00C */,/*42378*/8070/* 1D00D */,/*42379*/8070/* 1D00E */, /*42380*/8070/* 1D00F */,/*42381*/8070/* 1D010 */,/*42382*/8070/* 1D011 */,/*42383*/8070/* 1D012 */, /*42384*/8070/* 1D013 */,/*42385*/8070/* 1D014 */,/*42386*/8070/* 1D015 */,/*42387*/8070/* 1D016 */, /*42388*/8070/* 1D017 */,/*42389*/8070/* 1D018 */,/*42390*/8070/* 1D019 */,/*42391*/8070/* 1D01A */, /*42392*/8070/* 1D01B */,/*42393*/8070/* 1D01C */,/*42394*/8070/* 1D01D */,/*42395*/8070/* 1D01E */, /*42396*/8070/* 1D01F */,/*42397*/8070/* 1D020 */,/*42398*/8070/* 1D021 */,/*42399*/8070/* 1D022 */, /*42400*/8070/* 1D023 */,/*42401*/8070/* 1D024 */,/*42402*/8070/* 1D025 */,/*42403*/8070/* 1D026 */, /*42404*/8070/* 1D027 */,/*42405*/8070/* 1D028 */,/*42406*/8070/* 1D029 */,/*42407*/8070/* 1D02A */, /*42408*/8070/* 1D02B */,/*42409*/8070/* 1D02C */,/*42410*/8070/* 1D02D */,/*42411*/8070/* 1D02E */, /*42412*/8070/* 1D02F */,/*42413*/8070/* 1D030 */,/*42414*/8070/* 1D031 */,/*42415*/8070/* 1D032 */, /*42416*/8070/* 1D033 */,/*42417*/8070/* 1D034 */,/*42418*/8070/* 1D035 */,/*42419*/8070/* 1D036 */, /*42420*/8070/* 1D037 */,/*42421*/8070/* 1D038 */,/*42422*/8070/* 1D039 */,/*42423*/8070/* 1D03A */, /*42424*/8070/* 1D03B */,/*42425*/8070/* 1D03C */,/*42426*/8070/* 1D03D */,/*42427*/8070/* 1D03E */, /*42428*/8070/* 1D03F */,/*42429*/8070/* 1D040 */,/*42430*/8070/* 1D041 */,/*42431*/8070/* 1D042 */, /*42432*/8070/* 1D043 */,/*42433*/8070/* 1D044 */,/*42434*/8070/* 1D045 */,/*42435*/8070/* 1D046 */, /*42436*/8070/* 1D047 */,/*42437*/8070/* 1D048 */,/*42438*/8070/* 1D049 */,/*42439*/8070/* 1D04A */, /*42440*/8070/* 1D04B */,/*42441*/8070/* 1D04C */,/*42442*/8070/* 1D04D */,/*42443*/8070/* 1D04E */, /*42444*/8070/* 1D04F */,/*42445*/8070/* 1D050 */,/*42446*/8070/* 1D051 */,/*42447*/8070/* 1D052 */, /*42448*/8070/* 1D053 */,/*42449*/8070/* 1D054 */,/*42450*/8070/* 1D055 */,/*42451*/8070/* 1D056 */, /*42452*/8070/* 1D057 */,/*42453*/8070/* 1D058 */,/*42454*/8070/* 1D059 */,/*42455*/8070/* 1D05A */, /*42456*/8070/* 1D05B */,/*42457*/8070/* 1D05C */,/*42458*/8070/* 1D05D */,/*42459*/8070/* 1D05E */, /*42460*/8070/* 1D05F */,/*42461*/8070/* 1D060 */,/*42462*/8070/* 1D061 */,/*42463*/8070/* 1D062 */, /*42464*/8070/* 1D063 */,/*42465*/8070/* 1D064 */,/*42466*/8070/* 1D065 */,/*42467*/8070/* 1D066 */, /*42468*/8070/* 1D067 */,/*42469*/8070/* 1D068 */,/*42470*/8070/* 1D069 */,/*42471*/8070/* 1D06A */, /*42472*/8070/* 1D06B */,/*42473*/8070/* 1D06C */,/*42474*/8070/* 1D06D */,/*42475*/8070/* 1D06E */, /*42476*/8070/* 1D06F */,/*42477*/8070/* 1D070 */,/*42478*/8070/* 1D071 */,/*42479*/8070/* 1D072 */, /*42480*/8070/* 1D073 */,/*42481*/8070/* 1D074 */,/*42482*/8070/* 1D075 */,/*42483*/8070/* 1D076 */, /*42484*/8070/* 1D077 */,/*42485*/8070/* 1D078 */,/*42486*/8070/* 1D079 */,/*42487*/8070/* 1D07A */, /*42488*/8070/* 1D07B */,/*42489*/8070/* 1D07C */,/*42490*/8070/* 1D07D */,/*42491*/8070/* 1D07E */, /*42492*/8070/* 1D07F */,/*42493*/8070/* 1D080 */,/*42494*/8070/* 1D081 */,/*42495*/8070/* 1D082 */, /*42496*/8070/* 1D083 */,/*42497*/8070/* 1D084 */,/*42498*/8070/* 1D085 */,/*42499*/8070/* 1D086 */, /*42500*/8070/* 1D087 */,/*42501*/8070/* 1D088 */,/*42502*/8070/* 1D089 */,/*42503*/8070/* 1D08A */, /*42504*/8070/* 1D08B */,/*42505*/8070/* 1D08C */,/*42506*/8070/* 1D08D */,/*42507*/8070/* 1D08E */, /*42508*/8070/* 1D08F */,/*42509*/8070/* 1D090 */,/*42510*/8070/* 1D091 */,/*42511*/8070/* 1D092 */, /*42512*/8070/* 1D093 */,/*42513*/8070/* 1D094 */,/*42514*/8070/* 1D095 */,/*42515*/8070/* 1D096 */, /*42516*/8070/* 1D097 */,/*42517*/8070/* 1D098 */,/*42518*/8070/* 1D099 */,/*42519*/8070/* 1D09A */, /*42520*/8070/* 1D09B */,/*42521*/8070/* 1D09C */,/*42522*/8070/* 1D09D */,/*42523*/8070/* 1D09E */, /*42524*/8070/* 1D09F */,/*42525*/8070/* 1D0A0 */,/*42526*/8070/* 1D0A1 */,/*42527*/8070/* 1D0A2 */, /*42528*/8070/* 1D0A3 */,/*42529*/8070/* 1D0A4 */,/*42530*/8070/* 1D0A5 */,/*42531*/8070/* 1D0A6 */, /*42532*/8070/* 1D0A7 */,/*42533*/8070/* 1D0A8 */,/*42534*/8070/* 1D0A9 */,/*42535*/8070/* 1D0AA */, /*42536*/8070/* 1D0AB */,/*42537*/8070/* 1D0AC */,/*42538*/8070/* 1D0AD */,/*42539*/8070/* 1D0AE */, /*42540*/8070/* 1D0AF */,/*42541*/8070/* 1D0B0 */,/*42542*/8070/* 1D0B1 */,/*42543*/8070/* 1D0B2 */, /*42544*/8070/* 1D0B3 */,/*42545*/8070/* 1D0B4 */,/*42546*/8070/* 1D0B5 */,/*42547*/8070/* 1D0B6 */, /*42548*/8070/* 1D0B7 */,/*42549*/8070/* 1D0B8 */,/*42550*/8070/* 1D0B9 */,/*42551*/8070/* 1D0BA */, /*42552*/8070/* 1D0BB */,/*42553*/8070/* 1D0BC */,/*42554*/8070/* 1D0BD */,/*42555*/8070/* 1D0BE */, /*42556*/8070/* 1D0BF */,/*42557*/8070/* 1D0C0 */,/*42558*/8070/* 1D0C1 */,/*42559*/8070/* 1D0C2 */, /*42560*/8070/* 1D0C3 */,/*42561*/8070/* 1D0C4 */,/*42562*/8070/* 1D0C5 */,/*42563*/8070/* 1D0C6 */, /*42564*/8070/* 1D0C7 */,/*42565*/8070/* 1D0C8 */,/*42566*/8070/* 1D0C9 */,/*42567*/8070/* 1D0CA */, /*42568*/8070/* 1D0CB */,/*42569*/8070/* 1D0CC */,/*42570*/8070/* 1D0CD */,/*42571*/8070/* 1D0CE */, /*42572*/8070/* 1D0CF */,/*42573*/8070/* 1D0D0 */,/*42574*/8070/* 1D0D1 */,/*42575*/8070/* 1D0D2 */, /*42576*/8070/* 1D0D3 */,/*42577*/8070/* 1D0D4 */,/*42578*/8070/* 1D0D5 */,/*42579*/8070/* 1D0D6 */, /*42580*/8070/* 1D0D7 */,/*42581*/8070/* 1D0D8 */,/*42582*/8070/* 1D0D9 */,/*42583*/8070/* 1D0DA */, /*42584*/8070/* 1D0DB */,/*42585*/8070/* 1D0DC */,/*42586*/8070/* 1D0DD */,/*42587*/8070/* 1D0DE */, /*42588*/8070/* 1D0DF */,/*42589*/8070/* 1D0E0 */,/*42590*/8070/* 1D0E1 */,/*42591*/8070/* 1D0E2 */, /*42592*/8070/* 1D0E3 */,/*42593*/8070/* 1D0E4 */,/*42594*/8070/* 1D0E5 */,/*42595*/8070/* 1D0E6 */, /*42596*/8070/* 1D0E7 */,/*42597*/8070/* 1D0E8 */,/*42598*/8070/* 1D0E9 */,/*42599*/8070/* 1D0EA */, /*42600*/8070/* 1D0EB */,/*42601*/8070/* 1D0EC */,/*42602*/8070/* 1D0ED */,/*42603*/8070/* 1D0EE */, /*42604*/8070/* 1D0EF */,/*42605*/8070/* 1D0F0 */,/*42606*/8070/* 1D0F1 */,/*42607*/8070/* 1D0F2 */, /*42608*/8070/* 1D0F3 */,/*42609*/8070/* 1D0F4 */,/*42610*/8070/* 1D0F5 */,0,0,0,0,0,0,0,0,0,0,/*42621*/8071/* 1D100 */, /*42622*/8071/* 1D101 */,/*42623*/8071/* 1D102 */,/*42624*/8071/* 1D103 */,/*42625*/8071/* 1D104 */, /*42626*/8071/* 1D105 */,/*42627*/8071/* 1D106 */,/*42628*/8071/* 1D107 */,/*42629*/8071/* 1D108 */, /*42630*/8071/* 1D109 */,/*42631*/8071/* 1D10A */,/*42632*/8071/* 1D10B */,/*42633*/8071/* 1D10C */, /*42634*/8071/* 1D10D */,/*42635*/8071/* 1D10E */,/*42636*/8071/* 1D10F */,/*42637*/8071/* 1D110 */, /*42638*/8071/* 1D111 */,/*42639*/8071/* 1D112 */,/*42640*/8071/* 1D113 */,/*42641*/8071/* 1D114 */, /*42642*/8071/* 1D115 */,/*42643*/8071/* 1D116 */,/*42644*/8071/* 1D117 */,/*42645*/8071/* 1D118 */, /*42646*/8071/* 1D119 */,/*42647*/8071/* 1D11A */,/*42648*/8071/* 1D11B */,/*42649*/8071/* 1D11C */, /*42650*/8071/* 1D11D */,/*42651*/8071/* 1D11E */,/*42652*/8071/* 1D11F */,/*42653*/8071/* 1D120 */, /*42654*/8071/* 1D121 */,/*42655*/8071/* 1D122 */,/*42656*/8071/* 1D123 */,/*42657*/8071/* 1D124 */, /*42658*/8071/* 1D125 */,/*42659*/8071/* 1D126 */,0,0,/*42662*/8072/* 1D129 */,/*42663*/8071/* 1D12A */, /*42664*/8071/* 1D12B */,/*42665*/8071/* 1D12C */,/*42666*/8071/* 1D12D */,/*42667*/8071/* 1D12E */, /*42668*/8071/* 1D12F */,/*42669*/8071/* 1D130 */,/*42670*/8071/* 1D131 */,/*42671*/8071/* 1D132 */, /*42672*/8071/* 1D133 */,/*42673*/8071/* 1D134 */,/*42674*/8071/* 1D135 */,/*42675*/8071/* 1D136 */, /*42676*/8071/* 1D137 */,/*42677*/8071/* 1D138 */,/*42678*/8071/* 1D139 */,/*42679*/8071/* 1D13A */, /*42680*/8071/* 1D13B */,/*42681*/8071/* 1D13C */,/*42682*/8071/* 1D13D */,/*42683*/8071/* 1D13E */, /*42684*/8071/* 1D13F */,/*42685*/8071/* 1D140 */,/*42686*/8071/* 1D141 */,/*42687*/8071/* 1D142 */, /*42688*/8071/* 1D143 */,/*42689*/8071/* 1D144 */,/*42690*/8071/* 1D145 */,/*42691*/8071/* 1D146 */, /*42692*/8071/* 1D147 */,/*42693*/8071/* 1D148 */,/*42694*/8071/* 1D149 */,/*42695*/8071/* 1D14A */, /*42696*/8071/* 1D14B */,/*42697*/8071/* 1D14C */,/*42698*/8071/* 1D14D */,/*42699*/8071/* 1D14E */, /*42700*/8071/* 1D14F */,/*42701*/8071/* 1D150 */,/*42702*/8071/* 1D151 */,/*42703*/8071/* 1D152 */, /*42704*/8071/* 1D153 */,/*42705*/8071/* 1D154 */,/*42706*/8071/* 1D155 */,/*42707*/8071/* 1D156 */, /*42708*/8071/* 1D157 */,/*42709*/8071/* 1D158 */,/*42710*/8071/* 1D159 */,/*42711*/8071/* 1D15A */, /*42712*/8071/* 1D15B */,/*42713*/8071/* 1D15C */,/*42714*/8071/* 1D15D */,/*42715*/8073/* 1D15E */, /*42716*/8074/* 1D15F */,/*42717*/8075/* 1D160 */,/*42718*/8076/* 1D161 */,/*42719*/8077/* 1D162 */, /*42720*/8078/* 1D163 */,/*42721*/8079/* 1D164 */,/*42722*/8080/* 1D165 */,/*42723*/8081/* 1D166 */, /*42724*/8082/* 1D167 */,/*42725*/8082/* 1D168 */,/*42726*/8082/* 1D169 */,/*42727*/8071/* 1D16A */, /*42728*/8071/* 1D16B */,/*42729*/8071/* 1D16C */,/*42730*/8083/* 1D16D */,/*42731*/8084/* 1D16E */, /*42732*/8084/* 1D16F */,/*42733*/8084/* 1D170 */,/*42734*/8084/* 1D171 */,/*42735*/8084/* 1D172 */, /*42736*/8085/* 1D173 */,/*42737*/8085/* 1D174 */,/*42738*/8085/* 1D175 */,/*42739*/8085/* 1D176 */, /*42740*/8085/* 1D177 */,/*42741*/8085/* 1D178 */,/*42742*/8085/* 1D179 */,/*42743*/8085/* 1D17A */, /*42744*/8086/* 1D17B */,/*42745*/8086/* 1D17C */,/*42746*/8086/* 1D17D */,/*42747*/8086/* 1D17E */, /*42748*/8086/* 1D17F */,/*42749*/8086/* 1D180 */,/*42750*/8086/* 1D181 */,/*42751*/8086/* 1D182 */, /*42752*/8071/* 1D183 */,/*42753*/8071/* 1D184 */,/*42754*/8087/* 1D185 */,/*42755*/8087/* 1D186 */, /*42756*/8087/* 1D187 */,/*42757*/8087/* 1D188 */,/*42758*/8087/* 1D189 */,/*42759*/8086/* 1D18A */, /*42760*/8086/* 1D18B */,/*42761*/8071/* 1D18C */,/*42762*/8071/* 1D18D */,/*42763*/8071/* 1D18E */, /*42764*/8071/* 1D18F */,/*42765*/8071/* 1D190 */,/*42766*/8071/* 1D191 */,/*42767*/8071/* 1D192 */, /*42768*/8071/* 1D193 */,/*42769*/8071/* 1D194 */,/*42770*/8071/* 1D195 */,/*42771*/8071/* 1D196 */, /*42772*/8071/* 1D197 */,/*42773*/8071/* 1D198 */,/*42774*/8071/* 1D199 */,/*42775*/8071/* 1D19A */, /*42776*/8071/* 1D19B */,/*42777*/8071/* 1D19C */,/*42778*/8071/* 1D19D */,/*42779*/8071/* 1D19E */, /*42780*/8071/* 1D19F */,/*42781*/8071/* 1D1A0 */,/*42782*/8071/* 1D1A1 */,/*42783*/8071/* 1D1A2 */, /*42784*/8071/* 1D1A3 */,/*42785*/8071/* 1D1A4 */,/*42786*/8071/* 1D1A5 */,/*42787*/8071/* 1D1A6 */, /*42788*/8071/* 1D1A7 */,/*42789*/8071/* 1D1A8 */,/*42790*/8071/* 1D1A9 */,/*42791*/8087/* 1D1AA */, /*42792*/8087/* 1D1AB */,/*42793*/8087/* 1D1AC */,/*42794*/8087/* 1D1AD */,/*42795*/8071/* 1D1AE */, /*42796*/8071/* 1D1AF */,/*42797*/8071/* 1D1B0 */,/*42798*/8071/* 1D1B1 */,/*42799*/8071/* 1D1B2 */, /*42800*/8071/* 1D1B3 */,/*42801*/8071/* 1D1B4 */,/*42802*/8071/* 1D1B5 */,/*42803*/8071/* 1D1B6 */, /*42804*/8071/* 1D1B7 */,/*42805*/8071/* 1D1B8 */,/*42806*/8071/* 1D1B9 */,/*42807*/8071/* 1D1BA */, /*42808*/8088/* 1D1BB */,/*42809*/8089/* 1D1BC */,/*42810*/8090/* 1D1BD */,/*42811*/8091/* 1D1BE */, /*42812*/8092/* 1D1BF */,/*42813*/8093/* 1D1C0 */,/*42814*/8071/* 1D1C1 */,/*42815*/8071/* 1D1C2 */, /*42816*/8071/* 1D1C3 */,/*42817*/8071/* 1D1C4 */,/*42818*/8071/* 1D1C5 */,/*42819*/8071/* 1D1C6 */, /*42820*/8071/* 1D1C7 */,/*42821*/8071/* 1D1C8 */,/*42822*/8071/* 1D1C9 */,/*42823*/8071/* 1D1CA */, /*42824*/8071/* 1D1CB */,/*42825*/8071/* 1D1CC */,/*42826*/8071/* 1D1CD */,/*42827*/8071/* 1D1CE */, /*42828*/8071/* 1D1CF */,/*42829*/8071/* 1D1D0 */,/*42830*/8071/* 1D1D1 */,/*42831*/8071/* 1D1D2 */, /*42832*/8071/* 1D1D3 */,/*42833*/8071/* 1D1D4 */,/*42834*/8071/* 1D1D5 */,/*42835*/8071/* 1D1D6 */, /*42836*/8071/* 1D1D7 */,/*42837*/8071/* 1D1D8 */,/*42838*/8071/* 1D1D9 */,/*42839*/8071/* 1D1DA */, /*42840*/8071/* 1D1DB */,/*42841*/8071/* 1D1DC */,/*42842*/8071/* 1D1DD */,/*42843*/8094/* 1D1DE */, /*42844*/8094/* 1D1DF */,/*42845*/8094/* 1D1E0 */,/*42846*/8094/* 1D1E1 */,/*42847*/8094/* 1D1E2 */, /*42848*/8094/* 1D1E3 */,/*42849*/8094/* 1D1E4 */,/*42850*/8094/* 1D1E5 */,/*42851*/8094/* 1D1E6 */, /*42852*/8094/* 1D1E7 */,/*42853*/8094/* 1D1E8 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*42877*/8095/* 1D200 */, /*42878*/8095/* 1D201 */,/*42879*/8095/* 1D202 */,/*42880*/8095/* 1D203 */,/*42881*/8095/* 1D204 */, /*42882*/8095/* 1D205 */,/*42883*/8095/* 1D206 */,/*42884*/8095/* 1D207 */,/*42885*/8095/* 1D208 */, /*42886*/8095/* 1D209 */,/*42887*/8095/* 1D20A */,/*42888*/8095/* 1D20B */,/*42889*/8095/* 1D20C */, /*42890*/8095/* 1D20D */,/*42891*/8095/* 1D20E */,/*42892*/8095/* 1D20F */,/*42893*/8095/* 1D210 */, /*42894*/8095/* 1D211 */,/*42895*/8095/* 1D212 */,/*42896*/8095/* 1D213 */,/*42897*/8095/* 1D214 */, /*42898*/8095/* 1D215 */,/*42899*/8095/* 1D216 */,/*42900*/8095/* 1D217 */,/*42901*/8095/* 1D218 */, /*42902*/8095/* 1D219 */,/*42903*/8095/* 1D21A */,/*42904*/8095/* 1D21B */,/*42905*/8095/* 1D21C */, /*42906*/8095/* 1D21D */,/*42907*/8095/* 1D21E */,/*42908*/8095/* 1D21F */,/*42909*/8095/* 1D220 */, /*42910*/8095/* 1D221 */,/*42911*/8095/* 1D222 */,/*42912*/8095/* 1D223 */,/*42913*/8095/* 1D224 */, /*42914*/8095/* 1D225 */,/*42915*/8095/* 1D226 */,/*42916*/8095/* 1D227 */,/*42917*/8095/* 1D228 */, /*42918*/8095/* 1D229 */,/*42919*/8095/* 1D22A */,/*42920*/8095/* 1D22B */,/*42921*/8095/* 1D22C */, /*42922*/8095/* 1D22D */,/*42923*/8095/* 1D22E */,/*42924*/8095/* 1D22F */,/*42925*/8095/* 1D230 */, /*42926*/8095/* 1D231 */,/*42927*/8095/* 1D232 */,/*42928*/8095/* 1D233 */,/*42929*/8095/* 1D234 */, /*42930*/8095/* 1D235 */,/*42931*/8095/* 1D236 */,/*42932*/8095/* 1D237 */,/*42933*/8095/* 1D238 */, /*42934*/8095/* 1D239 */,/*42935*/8095/* 1D23A */,/*42936*/8095/* 1D23B */,/*42937*/8095/* 1D23C */, /*42938*/8095/* 1D23D */,/*42939*/8095/* 1D23E */,/*42940*/8095/* 1D23F */,/*42941*/8095/* 1D240 */, /*42942*/8095/* 1D241 */,/*42943*/8096/* 1D242 */,/*42944*/8096/* 1D243 */,/*42945*/8096/* 1D244 */, /*42946*/8095/* 1D245 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*43133*/8097/* 1D300 */,/*43134*/8097/* 1D301 */,/*43135*/8097/* 1D302 */, /*43136*/8097/* 1D303 */,/*43137*/8097/* 1D304 */,/*43138*/8097/* 1D305 */,/*43139*/8097/* 1D306 */, /*43140*/8097/* 1D307 */,/*43141*/8097/* 1D308 */,/*43142*/8097/* 1D309 */,/*43143*/8097/* 1D30A */, /*43144*/8097/* 1D30B */,/*43145*/8097/* 1D30C */,/*43146*/8097/* 1D30D */,/*43147*/8097/* 1D30E */, /*43148*/8097/* 1D30F */,/*43149*/8097/* 1D310 */,/*43150*/8097/* 1D311 */,/*43151*/8097/* 1D312 */, /*43152*/8097/* 1D313 */,/*43153*/8097/* 1D314 */,/*43154*/8097/* 1D315 */,/*43155*/8097/* 1D316 */, /*43156*/8097/* 1D317 */,/*43157*/8097/* 1D318 */,/*43158*/8097/* 1D319 */,/*43159*/8097/* 1D31A */, /*43160*/8097/* 1D31B */,/*43161*/8097/* 1D31C */,/*43162*/8097/* 1D31D */,/*43163*/8097/* 1D31E */, /*43164*/8097/* 1D31F */,/*43165*/8097/* 1D320 */,/*43166*/8097/* 1D321 */,/*43167*/8097/* 1D322 */, /*43168*/8097/* 1D323 */,/*43169*/8097/* 1D324 */,/*43170*/8097/* 1D325 */,/*43171*/8097/* 1D326 */, /*43172*/8097/* 1D327 */,/*43173*/8097/* 1D328 */,/*43174*/8097/* 1D329 */,/*43175*/8097/* 1D32A */, /*43176*/8097/* 1D32B */,/*43177*/8097/* 1D32C */,/*43178*/8097/* 1D32D */,/*43179*/8097/* 1D32E */, /*43180*/8097/* 1D32F */,/*43181*/8097/* 1D330 */,/*43182*/8097/* 1D331 */,/*43183*/8097/* 1D332 */, /*43184*/8097/* 1D333 */,/*43185*/8097/* 1D334 */,/*43186*/8097/* 1D335 */,/*43187*/8097/* 1D336 */, /*43188*/8097/* 1D337 */,/*43189*/8097/* 1D338 */,/*43190*/8097/* 1D339 */,/*43191*/8097/* 1D33A */, /*43192*/8097/* 1D33B */,/*43193*/8097/* 1D33C */,/*43194*/8097/* 1D33D */,/*43195*/8097/* 1D33E */, /*43196*/8097/* 1D33F */,/*43197*/8097/* 1D340 */,/*43198*/8097/* 1D341 */,/*43199*/8097/* 1D342 */, /*43200*/8097/* 1D343 */,/*43201*/8097/* 1D344 */,/*43202*/8097/* 1D345 */,/*43203*/8097/* 1D346 */, /*43204*/8097/* 1D347 */,/*43205*/8097/* 1D348 */,/*43206*/8097/* 1D349 */,/*43207*/8097/* 1D34A */, /*43208*/8097/* 1D34B */,/*43209*/8097/* 1D34C */,/*43210*/8097/* 1D34D */,/*43211*/8097/* 1D34E */, /*43212*/8097/* 1D34F */,/*43213*/8097/* 1D350 */,/*43214*/8097/* 1D351 */,/*43215*/8097/* 1D352 */, /*43216*/8097/* 1D353 */,/*43217*/8097/* 1D354 */,/*43218*/8097/* 1D355 */,/*43219*/8097/* 1D356 */,0,0,0,0,0,0,0,0,0, /*43229*/8098/* 1D360 */,/*43230*/8099/* 1D361 */,/*43231*/8100/* 1D362 */,/*43232*/8101/* 1D363 */, /*43233*/8102/* 1D364 */,/*43234*/8103/* 1D365 */,/*43235*/8104/* 1D366 */,/*43236*/8105/* 1D367 */, /*43237*/8106/* 1D368 */,/*43238*/8107/* 1D369 */,/*43239*/8108/* 1D36A */,/*43240*/8109/* 1D36B */, /*43241*/8110/* 1D36C */,/*43242*/8111/* 1D36D */,/*43243*/8112/* 1D36E */,/*43244*/8113/* 1D36F */, /*43245*/8114/* 1D370 */,/*43246*/8115/* 1D371 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*43389*/8116/* 1D400 */, /*43390*/8117/* 1D401 */,/*43391*/8118/* 1D402 */,/*43392*/8119/* 1D403 */,/*43393*/8120/* 1D404 */, /*43394*/8121/* 1D405 */,/*43395*/8122/* 1D406 */,/*43396*/8123/* 1D407 */,/*43397*/8124/* 1D408 */, /*43398*/8125/* 1D409 */,/*43399*/8126/* 1D40A */,/*43400*/8127/* 1D40B */,/*43401*/8128/* 1D40C */, /*43402*/8129/* 1D40D */,/*43403*/8130/* 1D40E */,/*43404*/8131/* 1D40F */,/*43405*/8132/* 1D410 */, /*43406*/8133/* 1D411 */,/*43407*/8134/* 1D412 */,/*43408*/8135/* 1D413 */,/*43409*/8136/* 1D414 */, /*43410*/8137/* 1D415 */,/*43411*/8138/* 1D416 */,/*43412*/8139/* 1D417 */,/*43413*/8140/* 1D418 */, /*43414*/8141/* 1D419 */,/*43415*/8142/* 1D41A */,/*43416*/8143/* 1D41B */,/*43417*/8144/* 1D41C */, /*43418*/8145/* 1D41D */,/*43419*/8146/* 1D41E */,/*43420*/8147/* 1D41F */,/*43421*/8148/* 1D420 */, /*43422*/8149/* 1D421 */,/*43423*/8150/* 1D422 */,/*43424*/8151/* 1D423 */,/*43425*/8152/* 1D424 */, /*43426*/8153/* 1D425 */,/*43427*/8154/* 1D426 */,/*43428*/8155/* 1D427 */,/*43429*/8156/* 1D428 */, /*43430*/8157/* 1D429 */,/*43431*/8158/* 1D42A */,/*43432*/8159/* 1D42B */,/*43433*/8160/* 1D42C */, /*43434*/8161/* 1D42D */,/*43435*/8162/* 1D42E */,/*43436*/8163/* 1D42F */,/*43437*/8164/* 1D430 */, /*43438*/8165/* 1D431 */,/*43439*/8166/* 1D432 */,/*43440*/8167/* 1D433 */,/*43441*/8168/* 1D434 */, /*43442*/8169/* 1D435 */,/*43443*/8170/* 1D436 */,/*43444*/8171/* 1D437 */,/*43445*/8172/* 1D438 */, /*43446*/8173/* 1D439 */,/*43447*/8174/* 1D43A */,/*43448*/8175/* 1D43B */,/*43449*/8176/* 1D43C */, /*43450*/8177/* 1D43D */,/*43451*/8178/* 1D43E */,/*43452*/8179/* 1D43F */,/*43453*/8180/* 1D440 */, /*43454*/8181/* 1D441 */,/*43455*/8182/* 1D442 */,/*43456*/8183/* 1D443 */,/*43457*/8184/* 1D444 */, /*43458*/8185/* 1D445 */,/*43459*/8186/* 1D446 */,/*43460*/8187/* 1D447 */,/*43461*/8188/* 1D448 */, /*43462*/8189/* 1D449 */,/*43463*/8190/* 1D44A */,/*43464*/8191/* 1D44B */,/*43465*/8192/* 1D44C */, /*43466*/8193/* 1D44D */,/*43467*/8194/* 1D44E */,/*43468*/8195/* 1D44F */,/*43469*/8196/* 1D450 */, /*43470*/8197/* 1D451 */,/*43471*/8198/* 1D452 */,/*43472*/8199/* 1D453 */,/*43473*/8200/* 1D454 */,0, /*43475*/8201/* 1D456 */,/*43476*/8202/* 1D457 */,/*43477*/8203/* 1D458 */,/*43478*/8204/* 1D459 */, /*43479*/8205/* 1D45A */,/*43480*/8206/* 1D45B */,/*43481*/8207/* 1D45C */,/*43482*/8208/* 1D45D */, /*43483*/8209/* 1D45E */,/*43484*/8210/* 1D45F */,/*43485*/8211/* 1D460 */,/*43486*/8212/* 1D461 */, /*43487*/8213/* 1D462 */,/*43488*/8214/* 1D463 */,/*43489*/8215/* 1D464 */,/*43490*/8216/* 1D465 */, /*43491*/8217/* 1D466 */,/*43492*/8218/* 1D467 */,/*43493*/8219/* 1D468 */,/*43494*/8220/* 1D469 */, /*43495*/8221/* 1D46A */,/*43496*/8222/* 1D46B */,/*43497*/8223/* 1D46C */,/*43498*/8224/* 1D46D */, /*43499*/8225/* 1D46E */,/*43500*/8226/* 1D46F */,/*43501*/8227/* 1D470 */,/*43502*/8228/* 1D471 */, /*43503*/8229/* 1D472 */,/*43504*/8230/* 1D473 */,/*43505*/8231/* 1D474 */,/*43506*/8232/* 1D475 */, /*43507*/8233/* 1D476 */,/*43508*/8234/* 1D477 */,/*43509*/8235/* 1D478 */,/*43510*/8236/* 1D479 */, /*43511*/8237/* 1D47A */,/*43512*/8238/* 1D47B */,/*43513*/8239/* 1D47C */,/*43514*/8240/* 1D47D */, /*43515*/8241/* 1D47E */,/*43516*/8242/* 1D47F */,/*43517*/8243/* 1D480 */,/*43518*/8244/* 1D481 */, /*43519*/8245/* 1D482 */,/*43520*/8246/* 1D483 */,/*43521*/8247/* 1D484 */,/*43522*/8248/* 1D485 */, /*43523*/8249/* 1D486 */,/*43524*/8250/* 1D487 */,/*43525*/8251/* 1D488 */,/*43526*/8252/* 1D489 */, /*43527*/8253/* 1D48A */,/*43528*/8254/* 1D48B */,/*43529*/8255/* 1D48C */,/*43530*/8256/* 1D48D */, /*43531*/8257/* 1D48E */,/*43532*/8258/* 1D48F */,/*43533*/8259/* 1D490 */,/*43534*/8260/* 1D491 */, /*43535*/8261/* 1D492 */,/*43536*/8262/* 1D493 */,/*43537*/8263/* 1D494 */,/*43538*/8264/* 1D495 */, /*43539*/8265/* 1D496 */,/*43540*/8266/* 1D497 */,/*43541*/8267/* 1D498 */,/*43542*/8268/* 1D499 */, /*43543*/8269/* 1D49A */,/*43544*/8270/* 1D49B */,/*43545*/8271/* 1D49C */,0,/*43547*/8272/* 1D49E */, /*43548*/8273/* 1D49F */,0,0,/*43551*/8274/* 1D4A2 */,0,0,/*43554*/8275/* 1D4A5 */,/*43555*/8276/* 1D4A6 */,0,0, /*43558*/8277/* 1D4A9 */,/*43559*/8278/* 1D4AA */,/*43560*/8279/* 1D4AB */,/*43561*/8280/* 1D4AC */,0, /*43563*/8281/* 1D4AE */,/*43564*/8282/* 1D4AF */,/*43565*/8283/* 1D4B0 */,/*43566*/8284/* 1D4B1 */, /*43567*/8285/* 1D4B2 */,/*43568*/8286/* 1D4B3 */,/*43569*/8287/* 1D4B4 */,/*43570*/8288/* 1D4B5 */, /*43571*/8289/* 1D4B6 */,/*43572*/8290/* 1D4B7 */,/*43573*/8291/* 1D4B8 */,/*43574*/8292/* 1D4B9 */,0, /*43576*/8293/* 1D4BB */,0,/*43578*/8294/* 1D4BD */,/*43579*/8295/* 1D4BE */,/*43580*/8296/* 1D4BF */, /*43581*/8297/* 1D4C0 */,/*43582*/8298/* 1D4C1 */,/*43583*/8299/* 1D4C2 */,/*43584*/8300/* 1D4C3 */,0, /*43586*/8301/* 1D4C5 */,/*43587*/8302/* 1D4C6 */,/*43588*/8303/* 1D4C7 */,/*43589*/8304/* 1D4C8 */, /*43590*/8305/* 1D4C9 */,/*43591*/8306/* 1D4CA */,/*43592*/8307/* 1D4CB */,/*43593*/8308/* 1D4CC */, /*43594*/8309/* 1D4CD */,/*43595*/8310/* 1D4CE */,/*43596*/8311/* 1D4CF */,/*43597*/8312/* 1D4D0 */, /*43598*/8313/* 1D4D1 */,/*43599*/8314/* 1D4D2 */,/*43600*/8315/* 1D4D3 */,/*43601*/8316/* 1D4D4 */, /*43602*/8317/* 1D4D5 */,/*43603*/8318/* 1D4D6 */,/*43604*/8319/* 1D4D7 */,/*43605*/8320/* 1D4D8 */, /*43606*/8321/* 1D4D9 */,/*43607*/8322/* 1D4DA */,/*43608*/8323/* 1D4DB */,/*43609*/8324/* 1D4DC */, /*43610*/8325/* 1D4DD */,/*43611*/8326/* 1D4DE */,/*43612*/8327/* 1D4DF */,/*43613*/8328/* 1D4E0 */, /*43614*/8329/* 1D4E1 */,/*43615*/8330/* 1D4E2 */,/*43616*/8331/* 1D4E3 */,/*43617*/8332/* 1D4E4 */, /*43618*/8333/* 1D4E5 */,/*43619*/8334/* 1D4E6 */,/*43620*/8335/* 1D4E7 */,/*43621*/8336/* 1D4E8 */, /*43622*/8337/* 1D4E9 */,/*43623*/8338/* 1D4EA */,/*43624*/8339/* 1D4EB */,/*43625*/8340/* 1D4EC */, /*43626*/8341/* 1D4ED */,/*43627*/8342/* 1D4EE */,/*43628*/8343/* 1D4EF */,/*43629*/8344/* 1D4F0 */, /*43630*/8345/* 1D4F1 */,/*43631*/8346/* 1D4F2 */,/*43632*/8347/* 1D4F3 */,/*43633*/8348/* 1D4F4 */, /*43634*/8349/* 1D4F5 */,/*43635*/8350/* 1D4F6 */,/*43636*/8351/* 1D4F7 */,/*43637*/8352/* 1D4F8 */, /*43638*/8353/* 1D4F9 */,/*43639*/8354/* 1D4FA */,/*43640*/8355/* 1D4FB */,/*43641*/8356/* 1D4FC */, /*43642*/8357/* 1D4FD */,/*43643*/8358/* 1D4FE */,/*43644*/8359/* 1D4FF */,/*43645*/8360/* 1D500 */, /*43646*/8361/* 1D501 */,/*43647*/8362/* 1D502 */,/*43648*/8363/* 1D503 */,/*43649*/8364/* 1D504 */, /*43650*/8365/* 1D505 */,0,/*43652*/8366/* 1D507 */,/*43653*/8367/* 1D508 */,/*43654*/8368/* 1D509 */, /*43655*/8369/* 1D50A */,0,0,/*43658*/8370/* 1D50D */,/*43659*/8371/* 1D50E */,/*43660*/8372/* 1D50F */, /*43661*/8373/* 1D510 */,/*43662*/8374/* 1D511 */,/*43663*/8375/* 1D512 */,/*43664*/8376/* 1D513 */, /*43665*/8377/* 1D514 */,0,/*43667*/8378/* 1D516 */,/*43668*/8379/* 1D517 */,/*43669*/8380/* 1D518 */, /*43670*/8381/* 1D519 */,/*43671*/8382/* 1D51A */,/*43672*/8383/* 1D51B */,/*43673*/8384/* 1D51C */,0, /*43675*/8385/* 1D51E */,/*43676*/8386/* 1D51F */,/*43677*/8387/* 1D520 */,/*43678*/8388/* 1D521 */, /*43679*/8389/* 1D522 */,/*43680*/8390/* 1D523 */,/*43681*/8391/* 1D524 */,/*43682*/8392/* 1D525 */, /*43683*/8393/* 1D526 */,/*43684*/8394/* 1D527 */,/*43685*/8395/* 1D528 */,/*43686*/8396/* 1D529 */, /*43687*/8397/* 1D52A */,/*43688*/8398/* 1D52B */,/*43689*/8399/* 1D52C */,/*43690*/8400/* 1D52D */, /*43691*/8401/* 1D52E */,/*43692*/8402/* 1D52F */,/*43693*/8403/* 1D530 */,/*43694*/8404/* 1D531 */, /*43695*/8405/* 1D532 */,/*43696*/8406/* 1D533 */,/*43697*/8407/* 1D534 */,/*43698*/8408/* 1D535 */, /*43699*/8409/* 1D536 */,/*43700*/8410/* 1D537 */,/*43701*/8411/* 1D538 */,/*43702*/8412/* 1D539 */,0, /*43704*/8413/* 1D53B */,/*43705*/8414/* 1D53C */,/*43706*/8415/* 1D53D */,/*43707*/8416/* 1D53E */,0, /*43709*/8417/* 1D540 */,/*43710*/8418/* 1D541 */,/*43711*/8419/* 1D542 */,/*43712*/8420/* 1D543 */, /*43713*/8421/* 1D544 */,0,/*43715*/8422/* 1D546 */,0,0,0,/*43719*/8423/* 1D54A */,/*43720*/8424/* 1D54B */, /*43721*/8425/* 1D54C */,/*43722*/8426/* 1D54D */,/*43723*/8427/* 1D54E */,/*43724*/8428/* 1D54F */, /*43725*/8429/* 1D550 */,0,/*43727*/8430/* 1D552 */,/*43728*/8431/* 1D553 */,/*43729*/8432/* 1D554 */, /*43730*/8433/* 1D555 */,/*43731*/8434/* 1D556 */,/*43732*/8435/* 1D557 */,/*43733*/8436/* 1D558 */, /*43734*/8437/* 1D559 */,/*43735*/8438/* 1D55A */,/*43736*/8439/* 1D55B */,/*43737*/8440/* 1D55C */, /*43738*/8441/* 1D55D */,/*43739*/8442/* 1D55E */,/*43740*/8443/* 1D55F */,/*43741*/8444/* 1D560 */, /*43742*/8445/* 1D561 */,/*43743*/8446/* 1D562 */,/*43744*/8447/* 1D563 */,/*43745*/8448/* 1D564 */, /*43746*/8449/* 1D565 */,/*43747*/8450/* 1D566 */,/*43748*/8451/* 1D567 */,/*43749*/8452/* 1D568 */, /*43750*/8453/* 1D569 */,/*43751*/8454/* 1D56A */,/*43752*/8455/* 1D56B */,/*43753*/8456/* 1D56C */, /*43754*/8457/* 1D56D */,/*43755*/8458/* 1D56E */,/*43756*/8459/* 1D56F */,/*43757*/8460/* 1D570 */, /*43758*/8461/* 1D571 */,/*43759*/8462/* 1D572 */,/*43760*/8463/* 1D573 */,/*43761*/8464/* 1D574 */, /*43762*/8465/* 1D575 */,/*43763*/8466/* 1D576 */,/*43764*/8467/* 1D577 */,/*43765*/8468/* 1D578 */, /*43766*/8469/* 1D579 */,/*43767*/8470/* 1D57A */,/*43768*/8471/* 1D57B */,/*43769*/8472/* 1D57C */, /*43770*/8473/* 1D57D */,/*43771*/8474/* 1D57E */,/*43772*/8475/* 1D57F */,/*43773*/8476/* 1D580 */, /*43774*/8477/* 1D581 */,/*43775*/8478/* 1D582 */,/*43776*/8479/* 1D583 */,/*43777*/8480/* 1D584 */, /*43778*/8481/* 1D585 */,/*43779*/8482/* 1D586 */,/*43780*/8483/* 1D587 */,/*43781*/8484/* 1D588 */, /*43782*/8485/* 1D589 */,/*43783*/8486/* 1D58A */,/*43784*/8487/* 1D58B */,/*43785*/8488/* 1D58C */, /*43786*/8489/* 1D58D */,/*43787*/8490/* 1D58E */,/*43788*/8491/* 1D58F */,/*43789*/8492/* 1D590 */, /*43790*/8493/* 1D591 */,/*43791*/8494/* 1D592 */,/*43792*/8495/* 1D593 */,/*43793*/8496/* 1D594 */, /*43794*/8497/* 1D595 */,/*43795*/8498/* 1D596 */,/*43796*/8499/* 1D597 */,/*43797*/8500/* 1D598 */, /*43798*/8501/* 1D599 */,/*43799*/8502/* 1D59A */,/*43800*/8503/* 1D59B */,/*43801*/8504/* 1D59C */, /*43802*/8505/* 1D59D */,/*43803*/8506/* 1D59E */,/*43804*/8507/* 1D59F */,/*43805*/8508/* 1D5A0 */, /*43806*/8509/* 1D5A1 */,/*43807*/8510/* 1D5A2 */,/*43808*/8511/* 1D5A3 */,/*43809*/8512/* 1D5A4 */, /*43810*/8513/* 1D5A5 */,/*43811*/8514/* 1D5A6 */,/*43812*/8515/* 1D5A7 */,/*43813*/8516/* 1D5A8 */, /*43814*/8517/* 1D5A9 */,/*43815*/8518/* 1D5AA */,/*43816*/8519/* 1D5AB */,/*43817*/8520/* 1D5AC */, /*43818*/8521/* 1D5AD */,/*43819*/8522/* 1D5AE */,/*43820*/8523/* 1D5AF */,/*43821*/8524/* 1D5B0 */, /*43822*/8525/* 1D5B1 */,/*43823*/8526/* 1D5B2 */,/*43824*/8527/* 1D5B3 */,/*43825*/8528/* 1D5B4 */, /*43826*/8529/* 1D5B5 */,/*43827*/8530/* 1D5B6 */,/*43828*/8531/* 1D5B7 */,/*43829*/8532/* 1D5B8 */, /*43830*/8533/* 1D5B9 */,/*43831*/8534/* 1D5BA */,/*43832*/8535/* 1D5BB */,/*43833*/8536/* 1D5BC */, /*43834*/8537/* 1D5BD */,/*43835*/8538/* 1D5BE */,/*43836*/8539/* 1D5BF */,/*43837*/8540/* 1D5C0 */, /*43838*/8541/* 1D5C1 */,/*43839*/8542/* 1D5C2 */,/*43840*/8543/* 1D5C3 */,/*43841*/8544/* 1D5C4 */, /*43842*/8545/* 1D5C5 */,/*43843*/8546/* 1D5C6 */,/*43844*/8547/* 1D5C7 */,/*43845*/8548/* 1D5C8 */, /*43846*/8549/* 1D5C9 */,/*43847*/8550/* 1D5CA */,/*43848*/8551/* 1D5CB */,/*43849*/8552/* 1D5CC */, /*43850*/8553/* 1D5CD */,/*43851*/8554/* 1D5CE */,/*43852*/8555/* 1D5CF */,/*43853*/8556/* 1D5D0 */, /*43854*/8557/* 1D5D1 */,/*43855*/8558/* 1D5D2 */,/*43856*/8559/* 1D5D3 */,/*43857*/8560/* 1D5D4 */, /*43858*/8561/* 1D5D5 */,/*43859*/8562/* 1D5D6 */,/*43860*/8563/* 1D5D7 */,/*43861*/8564/* 1D5D8 */, /*43862*/8565/* 1D5D9 */,/*43863*/8566/* 1D5DA */,/*43864*/8567/* 1D5DB */,/*43865*/8568/* 1D5DC */, /*43866*/8569/* 1D5DD */,/*43867*/8570/* 1D5DE */,/*43868*/8571/* 1D5DF */,/*43869*/8572/* 1D5E0 */, /*43870*/8573/* 1D5E1 */,/*43871*/8574/* 1D5E2 */,/*43872*/8575/* 1D5E3 */,/*43873*/8576/* 1D5E4 */, /*43874*/8577/* 1D5E5 */,/*43875*/8578/* 1D5E6 */,/*43876*/8579/* 1D5E7 */,/*43877*/8580/* 1D5E8 */, /*43878*/8581/* 1D5E9 */,/*43879*/8582/* 1D5EA */,/*43880*/8583/* 1D5EB */,/*43881*/8584/* 1D5EC */, /*43882*/8585/* 1D5ED */,/*43883*/8586/* 1D5EE */,/*43884*/8587/* 1D5EF */,/*43885*/8588/* 1D5F0 */, /*43886*/8589/* 1D5F1 */,/*43887*/8590/* 1D5F2 */,/*43888*/8591/* 1D5F3 */,/*43889*/8592/* 1D5F4 */, /*43890*/8593/* 1D5F5 */,/*43891*/8594/* 1D5F6 */,/*43892*/8595/* 1D5F7 */,/*43893*/8596/* 1D5F8 */, /*43894*/8597/* 1D5F9 */,/*43895*/8598/* 1D5FA */,/*43896*/8599/* 1D5FB */,/*43897*/8600/* 1D5FC */, /*43898*/8601/* 1D5FD */,/*43899*/8602/* 1D5FE */,/*43900*/8603/* 1D5FF */,/*43901*/8604/* 1D600 */, /*43902*/8605/* 1D601 */,/*43903*/8606/* 1D602 */,/*43904*/8607/* 1D603 */,/*43905*/8608/* 1D604 */, /*43906*/8609/* 1D605 */,/*43907*/8610/* 1D606 */,/*43908*/8611/* 1D607 */,/*43909*/8612/* 1D608 */, /*43910*/8613/* 1D609 */,/*43911*/8614/* 1D60A */,/*43912*/8615/* 1D60B */,/*43913*/8616/* 1D60C */, /*43914*/8617/* 1D60D */,/*43915*/8618/* 1D60E */,/*43916*/8619/* 1D60F */,/*43917*/8620/* 1D610 */, /*43918*/8621/* 1D611 */,/*43919*/8622/* 1D612 */,/*43920*/8623/* 1D613 */,/*43921*/8624/* 1D614 */, /*43922*/8625/* 1D615 */,/*43923*/8626/* 1D616 */,/*43924*/8627/* 1D617 */,/*43925*/8628/* 1D618 */, /*43926*/8629/* 1D619 */,/*43927*/8630/* 1D61A */,/*43928*/8631/* 1D61B */,/*43929*/8632/* 1D61C */, /*43930*/8633/* 1D61D */,/*43931*/8634/* 1D61E */,/*43932*/8635/* 1D61F */,/*43933*/8636/* 1D620 */, /*43934*/8637/* 1D621 */,/*43935*/8638/* 1D622 */,/*43936*/8639/* 1D623 */,/*43937*/8640/* 1D624 */, /*43938*/8641/* 1D625 */,/*43939*/8642/* 1D626 */,/*43940*/8643/* 1D627 */,/*43941*/8644/* 1D628 */, /*43942*/8645/* 1D629 */,/*43943*/8646/* 1D62A */,/*43944*/8647/* 1D62B */,/*43945*/8648/* 1D62C */, /*43946*/8649/* 1D62D */,/*43947*/8650/* 1D62E */,/*43948*/8651/* 1D62F */,/*43949*/8652/* 1D630 */, /*43950*/8653/* 1D631 */,/*43951*/8654/* 1D632 */,/*43952*/8655/* 1D633 */,/*43953*/8656/* 1D634 */, /*43954*/8657/* 1D635 */,/*43955*/8658/* 1D636 */,/*43956*/8659/* 1D637 */,/*43957*/8660/* 1D638 */, /*43958*/8661/* 1D639 */,/*43959*/8662/* 1D63A */,/*43960*/8663/* 1D63B */,/*43961*/8664/* 1D63C */, /*43962*/8665/* 1D63D */,/*43963*/8666/* 1D63E */,/*43964*/8667/* 1D63F */,/*43965*/8668/* 1D640 */, /*43966*/8669/* 1D641 */,/*43967*/8670/* 1D642 */,/*43968*/8671/* 1D643 */,/*43969*/8672/* 1D644 */, /*43970*/8673/* 1D645 */,/*43971*/8674/* 1D646 */,/*43972*/8675/* 1D647 */,/*43973*/8676/* 1D648 */, /*43974*/8677/* 1D649 */,/*43975*/8678/* 1D64A */,/*43976*/8679/* 1D64B */,/*43977*/8680/* 1D64C */, /*43978*/8681/* 1D64D */,/*43979*/8682/* 1D64E */,/*43980*/8683/* 1D64F */,/*43981*/8684/* 1D650 */, /*43982*/8685/* 1D651 */,/*43983*/8686/* 1D652 */,/*43984*/8687/* 1D653 */,/*43985*/8688/* 1D654 */, /*43986*/8689/* 1D655 */,/*43987*/8690/* 1D656 */,/*43988*/8691/* 1D657 */,/*43989*/8692/* 1D658 */, /*43990*/8693/* 1D659 */,/*43991*/8694/* 1D65A */,/*43992*/8695/* 1D65B */,/*43993*/8696/* 1D65C */, /*43994*/8697/* 1D65D */,/*43995*/8698/* 1D65E */,/*43996*/8699/* 1D65F */,/*43997*/8700/* 1D660 */, /*43998*/8701/* 1D661 */,/*43999*/8702/* 1D662 */,/*44000*/8703/* 1D663 */,/*44001*/8704/* 1D664 */, /*44002*/8705/* 1D665 */,/*44003*/8706/* 1D666 */,/*44004*/8707/* 1D667 */,/*44005*/8708/* 1D668 */, /*44006*/8709/* 1D669 */,/*44007*/8710/* 1D66A */,/*44008*/8711/* 1D66B */,/*44009*/8712/* 1D66C */, /*44010*/8713/* 1D66D */,/*44011*/8714/* 1D66E */,/*44012*/8715/* 1D66F */,/*44013*/8716/* 1D670 */, /*44014*/8717/* 1D671 */,/*44015*/8718/* 1D672 */,/*44016*/8719/* 1D673 */,/*44017*/8720/* 1D674 */, /*44018*/8721/* 1D675 */,/*44019*/8722/* 1D676 */,/*44020*/8723/* 1D677 */,/*44021*/8724/* 1D678 */, /*44022*/8725/* 1D679 */,/*44023*/8726/* 1D67A */,/*44024*/8727/* 1D67B */,/*44025*/8728/* 1D67C */, /*44026*/8729/* 1D67D */,/*44027*/8730/* 1D67E */,/*44028*/8731/* 1D67F */,/*44029*/8732/* 1D680 */, /*44030*/8733/* 1D681 */,/*44031*/8734/* 1D682 */,/*44032*/8735/* 1D683 */,/*44033*/8736/* 1D684 */, /*44034*/8737/* 1D685 */,/*44035*/8738/* 1D686 */,/*44036*/8739/* 1D687 */,/*44037*/8740/* 1D688 */, /*44038*/8741/* 1D689 */,/*44039*/8742/* 1D68A */,/*44040*/8743/* 1D68B */,/*44041*/8744/* 1D68C */, /*44042*/8745/* 1D68D */,/*44043*/8746/* 1D68E */,/*44044*/8747/* 1D68F */,/*44045*/8748/* 1D690 */, /*44046*/8749/* 1D691 */,/*44047*/8750/* 1D692 */,/*44048*/8751/* 1D693 */,/*44049*/8752/* 1D694 */, /*44050*/8753/* 1D695 */,/*44051*/8754/* 1D696 */,/*44052*/8755/* 1D697 */,/*44053*/8756/* 1D698 */, /*44054*/8757/* 1D699 */,/*44055*/8758/* 1D69A */,/*44056*/8759/* 1D69B */,/*44057*/8760/* 1D69C */, /*44058*/8761/* 1D69D */,/*44059*/8762/* 1D69E */,/*44060*/8763/* 1D69F */,/*44061*/8764/* 1D6A0 */, /*44062*/8765/* 1D6A1 */,/*44063*/8766/* 1D6A2 */,/*44064*/8767/* 1D6A3 */,/*44065*/8768/* 1D6A4 */, /*44066*/8769/* 1D6A5 */,0,0,/*44069*/8770/* 1D6A8 */,/*44070*/8771/* 1D6A9 */,/*44071*/8772/* 1D6AA */, /*44072*/8773/* 1D6AB */,/*44073*/8774/* 1D6AC */,/*44074*/8775/* 1D6AD */,/*44075*/8776/* 1D6AE */, /*44076*/8777/* 1D6AF */,/*44077*/8778/* 1D6B0 */,/*44078*/8779/* 1D6B1 */,/*44079*/8780/* 1D6B2 */, /*44080*/8781/* 1D6B3 */,/*44081*/8782/* 1D6B4 */,/*44082*/8783/* 1D6B5 */,/*44083*/8784/* 1D6B6 */, /*44084*/8785/* 1D6B7 */,/*44085*/8786/* 1D6B8 */,/*44086*/8787/* 1D6B9 */,/*44087*/8788/* 1D6BA */, /*44088*/8789/* 1D6BB */,/*44089*/8790/* 1D6BC */,/*44090*/8791/* 1D6BD */,/*44091*/8792/* 1D6BE */, /*44092*/8793/* 1D6BF */,/*44093*/8794/* 1D6C0 */,/*44094*/8795/* 1D6C1 */,/*44095*/8796/* 1D6C2 */, /*44096*/8797/* 1D6C3 */,/*44097*/8798/* 1D6C4 */,/*44098*/8799/* 1D6C5 */,/*44099*/8800/* 1D6C6 */, /*44100*/8801/* 1D6C7 */,/*44101*/8802/* 1D6C8 */,/*44102*/8803/* 1D6C9 */,/*44103*/8804/* 1D6CA */, /*44104*/8805/* 1D6CB */,/*44105*/8806/* 1D6CC */,/*44106*/8807/* 1D6CD */,/*44107*/8808/* 1D6CE */, /*44108*/8809/* 1D6CF */,/*44109*/8810/* 1D6D0 */,/*44110*/8811/* 1D6D1 */,/*44111*/8812/* 1D6D2 */, /*44112*/8813/* 1D6D3 */,/*44113*/8814/* 1D6D4 */,/*44114*/8815/* 1D6D5 */,/*44115*/8816/* 1D6D6 */, /*44116*/8817/* 1D6D7 */,/*44117*/8818/* 1D6D8 */,/*44118*/8819/* 1D6D9 */,/*44119*/8820/* 1D6DA */, /*44120*/8821/* 1D6DB */,/*44121*/8822/* 1D6DC */,/*44122*/8823/* 1D6DD */,/*44123*/8824/* 1D6DE */, /*44124*/8825/* 1D6DF */,/*44125*/8826/* 1D6E0 */,/*44126*/8827/* 1D6E1 */,/*44127*/8828/* 1D6E2 */, /*44128*/8829/* 1D6E3 */,/*44129*/8830/* 1D6E4 */,/*44130*/8831/* 1D6E5 */,/*44131*/8832/* 1D6E6 */, /*44132*/8833/* 1D6E7 */,/*44133*/8834/* 1D6E8 */,/*44134*/8835/* 1D6E9 */,/*44135*/8836/* 1D6EA */, /*44136*/8837/* 1D6EB */,/*44137*/8838/* 1D6EC */,/*44138*/8839/* 1D6ED */,/*44139*/8840/* 1D6EE */, /*44140*/8841/* 1D6EF */,/*44141*/8842/* 1D6F0 */,/*44142*/8843/* 1D6F1 */,/*44143*/8844/* 1D6F2 */, /*44144*/8845/* 1D6F3 */,/*44145*/8846/* 1D6F4 */,/*44146*/8847/* 1D6F5 */,/*44147*/8848/* 1D6F6 */, /*44148*/8849/* 1D6F7 */,/*44149*/8850/* 1D6F8 */,/*44150*/8851/* 1D6F9 */,/*44151*/8852/* 1D6FA */, /*44152*/8853/* 1D6FB */,/*44153*/8854/* 1D6FC */,/*44154*/8855/* 1D6FD */,/*44155*/8856/* 1D6FE */, /*44156*/8857/* 1D6FF */,/*44157*/8858/* 1D700 */,/*44158*/8859/* 1D701 */,/*44159*/8860/* 1D702 */, /*44160*/8861/* 1D703 */,/*44161*/8862/* 1D704 */,/*44162*/8863/* 1D705 */,/*44163*/8864/* 1D706 */, /*44164*/8865/* 1D707 */,/*44165*/8866/* 1D708 */,/*44166*/8867/* 1D709 */,/*44167*/8868/* 1D70A */, /*44168*/8869/* 1D70B */,/*44169*/8870/* 1D70C */,/*44170*/8871/* 1D70D */,/*44171*/8872/* 1D70E */, /*44172*/8873/* 1D70F */,/*44173*/8874/* 1D710 */,/*44174*/8875/* 1D711 */,/*44175*/8876/* 1D712 */, /*44176*/8877/* 1D713 */,/*44177*/8878/* 1D714 */,/*44178*/8879/* 1D715 */,/*44179*/8880/* 1D716 */, /*44180*/8881/* 1D717 */,/*44181*/8882/* 1D718 */,/*44182*/8883/* 1D719 */,/*44183*/8884/* 1D71A */, /*44184*/8885/* 1D71B */,/*44185*/8886/* 1D71C */,/*44186*/8887/* 1D71D */,/*44187*/8888/* 1D71E */, /*44188*/8889/* 1D71F */,/*44189*/8890/* 1D720 */,/*44190*/8891/* 1D721 */,/*44191*/8892/* 1D722 */, /*44192*/8893/* 1D723 */,/*44193*/8894/* 1D724 */,/*44194*/8895/* 1D725 */,/*44195*/8896/* 1D726 */, /*44196*/8897/* 1D727 */,/*44197*/8898/* 1D728 */,/*44198*/8899/* 1D729 */,/*44199*/8900/* 1D72A */, /*44200*/8901/* 1D72B */,/*44201*/8902/* 1D72C */,/*44202*/8903/* 1D72D */,/*44203*/8904/* 1D72E */, /*44204*/8905/* 1D72F */,/*44205*/8906/* 1D730 */,/*44206*/8907/* 1D731 */,/*44207*/8908/* 1D732 */, /*44208*/8909/* 1D733 */,/*44209*/8910/* 1D734 */,/*44210*/8911/* 1D735 */,/*44211*/8912/* 1D736 */, /*44212*/8913/* 1D737 */,/*44213*/8914/* 1D738 */,/*44214*/8915/* 1D739 */,/*44215*/8916/* 1D73A */, /*44216*/8917/* 1D73B */,/*44217*/8918/* 1D73C */,/*44218*/8919/* 1D73D */,/*44219*/8920/* 1D73E */, /*44220*/8921/* 1D73F */,/*44221*/8922/* 1D740 */,/*44222*/8923/* 1D741 */,/*44223*/8924/* 1D742 */, /*44224*/8925/* 1D743 */,/*44225*/8926/* 1D744 */,/*44226*/8927/* 1D745 */,/*44227*/8928/* 1D746 */, /*44228*/8929/* 1D747 */,/*44229*/8930/* 1D748 */,/*44230*/8931/* 1D749 */,/*44231*/8932/* 1D74A */, /*44232*/8933/* 1D74B */,/*44233*/8934/* 1D74C */,/*44234*/8935/* 1D74D */,/*44235*/8936/* 1D74E */, /*44236*/8937/* 1D74F */,/*44237*/8938/* 1D750 */,/*44238*/8939/* 1D751 */,/*44239*/8940/* 1D752 */, /*44240*/8941/* 1D753 */,/*44241*/8942/* 1D754 */,/*44242*/8943/* 1D755 */,/*44243*/8944/* 1D756 */, /*44244*/8945/* 1D757 */,/*44245*/8946/* 1D758 */,/*44246*/8947/* 1D759 */,/*44247*/8948/* 1D75A */, /*44248*/8949/* 1D75B */,/*44249*/8950/* 1D75C */,/*44250*/8951/* 1D75D */,/*44251*/8952/* 1D75E */, /*44252*/8953/* 1D75F */,/*44253*/8954/* 1D760 */,/*44254*/8955/* 1D761 */,/*44255*/8956/* 1D762 */, /*44256*/8957/* 1D763 */,/*44257*/8958/* 1D764 */,/*44258*/8959/* 1D765 */,/*44259*/8960/* 1D766 */, /*44260*/8961/* 1D767 */,/*44261*/8962/* 1D768 */,/*44262*/8963/* 1D769 */,/*44263*/8964/* 1D76A */, /*44264*/8965/* 1D76B */,/*44265*/8966/* 1D76C */,/*44266*/8967/* 1D76D */,/*44267*/8968/* 1D76E */, /*44268*/8969/* 1D76F */,/*44269*/8970/* 1D770 */,/*44270*/8971/* 1D771 */,/*44271*/8972/* 1D772 */, /*44272*/8973/* 1D773 */,/*44273*/8974/* 1D774 */,/*44274*/8975/* 1D775 */,/*44275*/8976/* 1D776 */, /*44276*/8977/* 1D777 */,/*44277*/8978/* 1D778 */,/*44278*/8979/* 1D779 */,/*44279*/8980/* 1D77A */, /*44280*/8981/* 1D77B */,/*44281*/8982/* 1D77C */,/*44282*/8983/* 1D77D */,/*44283*/8984/* 1D77E */, /*44284*/8985/* 1D77F */,/*44285*/8986/* 1D780 */,/*44286*/8987/* 1D781 */,/*44287*/8988/* 1D782 */, /*44288*/8989/* 1D783 */,/*44289*/8990/* 1D784 */,/*44290*/8991/* 1D785 */,/*44291*/8992/* 1D786 */, /*44292*/8993/* 1D787 */,/*44293*/8994/* 1D788 */,/*44294*/8995/* 1D789 */,/*44295*/8996/* 1D78A */, /*44296*/8997/* 1D78B */,/*44297*/8998/* 1D78C */,/*44298*/8999/* 1D78D */,/*44299*/9000/* 1D78E */, /*44300*/9001/* 1D78F */,/*44301*/9002/* 1D790 */,/*44302*/9003/* 1D791 */,/*44303*/9004/* 1D792 */, /*44304*/9005/* 1D793 */,/*44305*/9006/* 1D794 */,/*44306*/9007/* 1D795 */,/*44307*/9008/* 1D796 */, /*44308*/9009/* 1D797 */,/*44309*/9010/* 1D798 */,/*44310*/9011/* 1D799 */,/*44311*/9012/* 1D79A */, /*44312*/9013/* 1D79B */,/*44313*/9014/* 1D79C */,/*44314*/9015/* 1D79D */,/*44315*/9016/* 1D79E */, /*44316*/9017/* 1D79F */,/*44317*/9018/* 1D7A0 */,/*44318*/9019/* 1D7A1 */,/*44319*/9020/* 1D7A2 */, /*44320*/9021/* 1D7A3 */,/*44321*/9022/* 1D7A4 */,/*44322*/9023/* 1D7A5 */,/*44323*/9024/* 1D7A6 */, /*44324*/9025/* 1D7A7 */,/*44325*/9026/* 1D7A8 */,/*44326*/9027/* 1D7A9 */,/*44327*/9028/* 1D7AA */, /*44328*/9029/* 1D7AB */,/*44329*/9030/* 1D7AC */,/*44330*/9031/* 1D7AD */,/*44331*/9032/* 1D7AE */, /*44332*/9033/* 1D7AF */,/*44333*/9034/* 1D7B0 */,/*44334*/9035/* 1D7B1 */,/*44335*/9036/* 1D7B2 */, /*44336*/9037/* 1D7B3 */,/*44337*/9038/* 1D7B4 */,/*44338*/9039/* 1D7B5 */,/*44339*/9040/* 1D7B6 */, /*44340*/9041/* 1D7B7 */,/*44341*/9042/* 1D7B8 */,/*44342*/9043/* 1D7B9 */,/*44343*/9044/* 1D7BA */, /*44344*/9045/* 1D7BB */,/*44345*/9046/* 1D7BC */,/*44346*/9047/* 1D7BD */,/*44347*/9048/* 1D7BE */, /*44348*/9049/* 1D7BF */,/*44349*/9050/* 1D7C0 */,/*44350*/9051/* 1D7C1 */,/*44351*/9052/* 1D7C2 */, /*44352*/9053/* 1D7C3 */,/*44353*/9054/* 1D7C4 */,/*44354*/9055/* 1D7C5 */,/*44355*/9056/* 1D7C6 */, /*44356*/9057/* 1D7C7 */,/*44357*/9058/* 1D7C8 */,/*44358*/9059/* 1D7C9 */,/*44359*/9060/* 1D7CA */, /*44360*/9061/* 1D7CB */,0,0,/*44363*/9062/* 1D7CE */,/*44364*/9063/* 1D7CF */,/*44365*/9064/* 1D7D0 */, /*44366*/9065/* 1D7D1 */,/*44367*/9066/* 1D7D2 */,/*44368*/9067/* 1D7D3 */,/*44369*/9068/* 1D7D4 */, /*44370*/9069/* 1D7D5 */,/*44371*/9070/* 1D7D6 */,/*44372*/9071/* 1D7D7 */,/*44373*/9072/* 1D7D8 */, /*44374*/9073/* 1D7D9 */,/*44375*/9074/* 1D7DA */,/*44376*/9075/* 1D7DB */,/*44377*/9076/* 1D7DC */, /*44378*/9077/* 1D7DD */,/*44379*/9078/* 1D7DE */,/*44380*/9079/* 1D7DF */,/*44381*/9080/* 1D7E0 */, /*44382*/9081/* 1D7E1 */,/*44383*/9082/* 1D7E2 */,/*44384*/9083/* 1D7E3 */,/*44385*/9084/* 1D7E4 */, /*44386*/9085/* 1D7E5 */,/*44387*/9086/* 1D7E6 */,/*44388*/9087/* 1D7E7 */,/*44389*/9088/* 1D7E8 */, /*44390*/9089/* 1D7E9 */,/*44391*/9090/* 1D7EA */,/*44392*/9091/* 1D7EB */,/*44393*/9092/* 1D7EC */, /*44394*/9093/* 1D7ED */,/*44395*/9094/* 1D7EE */,/*44396*/9095/* 1D7EF */,/*44397*/9096/* 1D7F0 */, /*44398*/9097/* 1D7F1 */,/*44399*/9098/* 1D7F2 */,/*44400*/9099/* 1D7F3 */,/*44401*/9100/* 1D7F4 */, /*44402*/9101/* 1D7F5 */,/*44403*/9102/* 1D7F6 */,/*44404*/9103/* 1D7F7 */,/*44405*/9104/* 1D7F8 */, /*44406*/9105/* 1D7F9 */,/*44407*/9106/* 1D7FA */,/*44408*/9107/* 1D7FB */,/*44409*/9108/* 1D7FC */, /*44410*/9109/* 1D7FD */,/*44411*/9110/* 1D7FE */,/*44412*/9111/* 1D7FF */,/*44413*/9112/* 1D800 */, /*44414*/9112/* 1D801 */,/*44415*/9112/* 1D802 */,/*44416*/9112/* 1D803 */,/*44417*/9112/* 1D804 */, /*44418*/9112/* 1D805 */,/*44419*/9112/* 1D806 */,/*44420*/9112/* 1D807 */,/*44421*/9112/* 1D808 */, /*44422*/9112/* 1D809 */,/*44423*/9112/* 1D80A */,/*44424*/9112/* 1D80B */,/*44425*/9112/* 1D80C */, /*44426*/9112/* 1D80D */,/*44427*/9112/* 1D80E */,/*44428*/9112/* 1D80F */,/*44429*/9112/* 1D810 */, /*44430*/9112/* 1D811 */,/*44431*/9112/* 1D812 */,/*44432*/9112/* 1D813 */,/*44433*/9112/* 1D814 */, /*44434*/9112/* 1D815 */,/*44435*/9112/* 1D816 */,/*44436*/9112/* 1D817 */,/*44437*/9112/* 1D818 */, /*44438*/9112/* 1D819 */,/*44439*/9112/* 1D81A */,/*44440*/9112/* 1D81B */,/*44441*/9112/* 1D81C */, /*44442*/9112/* 1D81D */,/*44443*/9112/* 1D81E */,/*44444*/9112/* 1D81F */,/*44445*/9112/* 1D820 */, /*44446*/9112/* 1D821 */,/*44447*/9112/* 1D822 */,/*44448*/9112/* 1D823 */,/*44449*/9112/* 1D824 */, /*44450*/9112/* 1D825 */,/*44451*/9112/* 1D826 */,/*44452*/9112/* 1D827 */,/*44453*/9112/* 1D828 */, /*44454*/9112/* 1D829 */,/*44455*/9112/* 1D82A */,/*44456*/9112/* 1D82B */,/*44457*/9112/* 1D82C */, /*44458*/9112/* 1D82D */,/*44459*/9112/* 1D82E */,/*44460*/9112/* 1D82F */,/*44461*/9112/* 1D830 */, /*44462*/9112/* 1D831 */,/*44463*/9112/* 1D832 */,/*44464*/9112/* 1D833 */,/*44465*/9112/* 1D834 */, /*44466*/9112/* 1D835 */,/*44467*/9112/* 1D836 */,/*44468*/9112/* 1D837 */,/*44469*/9112/* 1D838 */, /*44470*/9112/* 1D839 */,/*44471*/9112/* 1D83A */,/*44472*/9112/* 1D83B */,/*44473*/9112/* 1D83C */, /*44474*/9112/* 1D83D */,/*44475*/9112/* 1D83E */,/*44476*/9112/* 1D83F */,/*44477*/9112/* 1D840 */, /*44478*/9112/* 1D841 */,/*44479*/9112/* 1D842 */,/*44480*/9112/* 1D843 */,/*44481*/9112/* 1D844 */, /*44482*/9112/* 1D845 */,/*44483*/9112/* 1D846 */,/*44484*/9112/* 1D847 */,/*44485*/9112/* 1D848 */, /*44486*/9112/* 1D849 */,/*44487*/9112/* 1D84A */,/*44488*/9112/* 1D84B */,/*44489*/9112/* 1D84C */, /*44490*/9112/* 1D84D */,/*44491*/9112/* 1D84E */,/*44492*/9112/* 1D84F */,/*44493*/9112/* 1D850 */, /*44494*/9112/* 1D851 */,/*44495*/9112/* 1D852 */,/*44496*/9112/* 1D853 */,/*44497*/9112/* 1D854 */, /*44498*/9112/* 1D855 */,/*44499*/9112/* 1D856 */,/*44500*/9112/* 1D857 */,/*44501*/9112/* 1D858 */, /*44502*/9112/* 1D859 */,/*44503*/9112/* 1D85A */,/*44504*/9112/* 1D85B */,/*44505*/9112/* 1D85C */, /*44506*/9112/* 1D85D */,/*44507*/9112/* 1D85E */,/*44508*/9112/* 1D85F */,/*44509*/9112/* 1D860 */, /*44510*/9112/* 1D861 */,/*44511*/9112/* 1D862 */,/*44512*/9112/* 1D863 */,/*44513*/9112/* 1D864 */, /*44514*/9112/* 1D865 */,/*44515*/9112/* 1D866 */,/*44516*/9112/* 1D867 */,/*44517*/9112/* 1D868 */, /*44518*/9112/* 1D869 */,/*44519*/9112/* 1D86A */,/*44520*/9112/* 1D86B */,/*44521*/9112/* 1D86C */, /*44522*/9112/* 1D86D */,/*44523*/9112/* 1D86E */,/*44524*/9112/* 1D86F */,/*44525*/9112/* 1D870 */, /*44526*/9112/* 1D871 */,/*44527*/9112/* 1D872 */,/*44528*/9112/* 1D873 */,/*44529*/9112/* 1D874 */, /*44530*/9112/* 1D875 */,/*44531*/9112/* 1D876 */,/*44532*/9112/* 1D877 */,/*44533*/9112/* 1D878 */, /*44534*/9112/* 1D879 */,/*44535*/9112/* 1D87A */,/*44536*/9112/* 1D87B */,/*44537*/9112/* 1D87C */, /*44538*/9112/* 1D87D */,/*44539*/9112/* 1D87E */,/*44540*/9112/* 1D87F */,/*44541*/9112/* 1D880 */, /*44542*/9112/* 1D881 */,/*44543*/9112/* 1D882 */,/*44544*/9112/* 1D883 */,/*44545*/9112/* 1D884 */, /*44546*/9112/* 1D885 */,/*44547*/9112/* 1D886 */,/*44548*/9112/* 1D887 */,/*44549*/9112/* 1D888 */, /*44550*/9112/* 1D889 */,/*44551*/9112/* 1D88A */,/*44552*/9112/* 1D88B */,/*44553*/9112/* 1D88C */, /*44554*/9112/* 1D88D */,/*44555*/9112/* 1D88E */,/*44556*/9112/* 1D88F */,/*44557*/9112/* 1D890 */, /*44558*/9112/* 1D891 */,/*44559*/9112/* 1D892 */,/*44560*/9112/* 1D893 */,/*44561*/9112/* 1D894 */, /*44562*/9112/* 1D895 */,/*44563*/9112/* 1D896 */,/*44564*/9112/* 1D897 */,/*44565*/9112/* 1D898 */, /*44566*/9112/* 1D899 */,/*44567*/9112/* 1D89A */,/*44568*/9112/* 1D89B */,/*44569*/9112/* 1D89C */, /*44570*/9112/* 1D89D */,/*44571*/9112/* 1D89E */,/*44572*/9112/* 1D89F */,/*44573*/9112/* 1D8A0 */, /*44574*/9112/* 1D8A1 */,/*44575*/9112/* 1D8A2 */,/*44576*/9112/* 1D8A3 */,/*44577*/9112/* 1D8A4 */, /*44578*/9112/* 1D8A5 */,/*44579*/9112/* 1D8A6 */,/*44580*/9112/* 1D8A7 */,/*44581*/9112/* 1D8A8 */, /*44582*/9112/* 1D8A9 */,/*44583*/9112/* 1D8AA */,/*44584*/9112/* 1D8AB */,/*44585*/9112/* 1D8AC */, /*44586*/9112/* 1D8AD */,/*44587*/9112/* 1D8AE */,/*44588*/9112/* 1D8AF */,/*44589*/9112/* 1D8B0 */, /*44590*/9112/* 1D8B1 */,/*44591*/9112/* 1D8B2 */,/*44592*/9112/* 1D8B3 */,/*44593*/9112/* 1D8B4 */, /*44594*/9112/* 1D8B5 */,/*44595*/9112/* 1D8B6 */,/*44596*/9112/* 1D8B7 */,/*44597*/9112/* 1D8B8 */, /*44598*/9112/* 1D8B9 */,/*44599*/9112/* 1D8BA */,/*44600*/9112/* 1D8BB */,/*44601*/9112/* 1D8BC */, /*44602*/9112/* 1D8BD */,/*44603*/9112/* 1D8BE */,/*44604*/9112/* 1D8BF */,/*44605*/9112/* 1D8C0 */, /*44606*/9112/* 1D8C1 */,/*44607*/9112/* 1D8C2 */,/*44608*/9112/* 1D8C3 */,/*44609*/9112/* 1D8C4 */, /*44610*/9112/* 1D8C5 */,/*44611*/9112/* 1D8C6 */,/*44612*/9112/* 1D8C7 */,/*44613*/9112/* 1D8C8 */, /*44614*/9112/* 1D8C9 */,/*44615*/9112/* 1D8CA */,/*44616*/9112/* 1D8CB */,/*44617*/9112/* 1D8CC */, /*44618*/9112/* 1D8CD */,/*44619*/9112/* 1D8CE */,/*44620*/9112/* 1D8CF */,/*44621*/9112/* 1D8D0 */, /*44622*/9112/* 1D8D1 */,/*44623*/9112/* 1D8D2 */,/*44624*/9112/* 1D8D3 */,/*44625*/9112/* 1D8D4 */, /*44626*/9112/* 1D8D5 */,/*44627*/9112/* 1D8D6 */,/*44628*/9112/* 1D8D7 */,/*44629*/9112/* 1D8D8 */, /*44630*/9112/* 1D8D9 */,/*44631*/9112/* 1D8DA */,/*44632*/9112/* 1D8DB */,/*44633*/9112/* 1D8DC */, /*44634*/9112/* 1D8DD */,/*44635*/9112/* 1D8DE */,/*44636*/9112/* 1D8DF */,/*44637*/9112/* 1D8E0 */, /*44638*/9112/* 1D8E1 */,/*44639*/9112/* 1D8E2 */,/*44640*/9112/* 1D8E3 */,/*44641*/9112/* 1D8E4 */, /*44642*/9112/* 1D8E5 */,/*44643*/9112/* 1D8E6 */,/*44644*/9112/* 1D8E7 */,/*44645*/9112/* 1D8E8 */, /*44646*/9112/* 1D8E9 */,/*44647*/9112/* 1D8EA */,/*44648*/9112/* 1D8EB */,/*44649*/9112/* 1D8EC */, /*44650*/9112/* 1D8ED */,/*44651*/9112/* 1D8EE */,/*44652*/9112/* 1D8EF */,/*44653*/9112/* 1D8F0 */, /*44654*/9112/* 1D8F1 */,/*44655*/9112/* 1D8F2 */,/*44656*/9112/* 1D8F3 */,/*44657*/9112/* 1D8F4 */, /*44658*/9112/* 1D8F5 */,/*44659*/9112/* 1D8F6 */,/*44660*/9112/* 1D8F7 */,/*44661*/9112/* 1D8F8 */, /*44662*/9112/* 1D8F9 */,/*44663*/9112/* 1D8FA */,/*44664*/9112/* 1D8FB */,/*44665*/9112/* 1D8FC */, /*44666*/9112/* 1D8FD */,/*44667*/9112/* 1D8FE */,/*44668*/9112/* 1D8FF */,/*44669*/9112/* 1D900 */, /*44670*/9112/* 1D901 */,/*44671*/9112/* 1D902 */,/*44672*/9112/* 1D903 */,/*44673*/9112/* 1D904 */, /*44674*/9112/* 1D905 */,/*44675*/9112/* 1D906 */,/*44676*/9112/* 1D907 */,/*44677*/9112/* 1D908 */, /*44678*/9112/* 1D909 */,/*44679*/9112/* 1D90A */,/*44680*/9112/* 1D90B */,/*44681*/9112/* 1D90C */, /*44682*/9112/* 1D90D */,/*44683*/9112/* 1D90E */,/*44684*/9112/* 1D90F */,/*44685*/9112/* 1D910 */, /*44686*/9112/* 1D911 */,/*44687*/9112/* 1D912 */,/*44688*/9112/* 1D913 */,/*44689*/9112/* 1D914 */, /*44690*/9112/* 1D915 */,/*44691*/9112/* 1D916 */,/*44692*/9112/* 1D917 */,/*44693*/9112/* 1D918 */, /*44694*/9112/* 1D919 */,/*44695*/9112/* 1D91A */,/*44696*/9112/* 1D91B */,/*44697*/9112/* 1D91C */, /*44698*/9112/* 1D91D */,/*44699*/9112/* 1D91E */,/*44700*/9112/* 1D91F */,/*44701*/9112/* 1D920 */, /*44702*/9112/* 1D921 */,/*44703*/9112/* 1D922 */,/*44704*/9112/* 1D923 */,/*44705*/9112/* 1D924 */, /*44706*/9112/* 1D925 */,/*44707*/9112/* 1D926 */,/*44708*/9112/* 1D927 */,/*44709*/9112/* 1D928 */, /*44710*/9112/* 1D929 */,/*44711*/9112/* 1D92A */,/*44712*/9112/* 1D92B */,/*44713*/9112/* 1D92C */, /*44714*/9112/* 1D92D */,/*44715*/9112/* 1D92E */,/*44716*/9112/* 1D92F */,/*44717*/9112/* 1D930 */, /*44718*/9112/* 1D931 */,/*44719*/9112/* 1D932 */,/*44720*/9112/* 1D933 */,/*44721*/9112/* 1D934 */, /*44722*/9112/* 1D935 */,/*44723*/9112/* 1D936 */,/*44724*/9112/* 1D937 */,/*44725*/9112/* 1D938 */, /*44726*/9112/* 1D939 */,/*44727*/9112/* 1D93A */,/*44728*/9112/* 1D93B */,/*44729*/9112/* 1D93C */, /*44730*/9112/* 1D93D */,/*44731*/9112/* 1D93E */,/*44732*/9112/* 1D93F */,/*44733*/9112/* 1D940 */, /*44734*/9112/* 1D941 */,/*44735*/9112/* 1D942 */,/*44736*/9112/* 1D943 */,/*44737*/9112/* 1D944 */, /*44738*/9112/* 1D945 */,/*44739*/9112/* 1D946 */,/*44740*/9112/* 1D947 */,/*44741*/9112/* 1D948 */, /*44742*/9112/* 1D949 */,/*44743*/9112/* 1D94A */,/*44744*/9112/* 1D94B */,/*44745*/9112/* 1D94C */, /*44746*/9112/* 1D94D */,/*44747*/9112/* 1D94E */,/*44748*/9112/* 1D94F */,/*44749*/9112/* 1D950 */, /*44750*/9112/* 1D951 */,/*44751*/9112/* 1D952 */,/*44752*/9112/* 1D953 */,/*44753*/9112/* 1D954 */, /*44754*/9112/* 1D955 */,/*44755*/9112/* 1D956 */,/*44756*/9112/* 1D957 */,/*44757*/9112/* 1D958 */, /*44758*/9112/* 1D959 */,/*44759*/9112/* 1D95A */,/*44760*/9112/* 1D95B */,/*44761*/9112/* 1D95C */, /*44762*/9112/* 1D95D */,/*44763*/9112/* 1D95E */,/*44764*/9112/* 1D95F */,/*44765*/9112/* 1D960 */, /*44766*/9112/* 1D961 */,/*44767*/9112/* 1D962 */,/*44768*/9112/* 1D963 */,/*44769*/9112/* 1D964 */, /*44770*/9112/* 1D965 */,/*44771*/9112/* 1D966 */,/*44772*/9112/* 1D967 */,/*44773*/9112/* 1D968 */, /*44774*/9112/* 1D969 */,/*44775*/9112/* 1D96A */,/*44776*/9112/* 1D96B */,/*44777*/9112/* 1D96C */, /*44778*/9112/* 1D96D */,/*44779*/9112/* 1D96E */,/*44780*/9112/* 1D96F */,/*44781*/9112/* 1D970 */, /*44782*/9112/* 1D971 */,/*44783*/9112/* 1D972 */,/*44784*/9112/* 1D973 */,/*44785*/9112/* 1D974 */, /*44786*/9112/* 1D975 */,/*44787*/9112/* 1D976 */,/*44788*/9112/* 1D977 */,/*44789*/9112/* 1D978 */, /*44790*/9112/* 1D979 */,/*44791*/9112/* 1D97A */,/*44792*/9112/* 1D97B */,/*44793*/9112/* 1D97C */, /*44794*/9112/* 1D97D */,/*44795*/9112/* 1D97E */,/*44796*/9112/* 1D97F */,/*44797*/9112/* 1D980 */, /*44798*/9112/* 1D981 */,/*44799*/9112/* 1D982 */,/*44800*/9112/* 1D983 */,/*44801*/9112/* 1D984 */, /*44802*/9112/* 1D985 */,/*44803*/9112/* 1D986 */,/*44804*/9112/* 1D987 */,/*44805*/9112/* 1D988 */, /*44806*/9112/* 1D989 */,/*44807*/9112/* 1D98A */,/*44808*/9112/* 1D98B */,/*44809*/9112/* 1D98C */, /*44810*/9112/* 1D98D */,/*44811*/9112/* 1D98E */,/*44812*/9112/* 1D98F */,/*44813*/9112/* 1D990 */, /*44814*/9112/* 1D991 */,/*44815*/9112/* 1D992 */,/*44816*/9112/* 1D993 */,/*44817*/9112/* 1D994 */, /*44818*/9112/* 1D995 */,/*44819*/9112/* 1D996 */,/*44820*/9112/* 1D997 */,/*44821*/9112/* 1D998 */, /*44822*/9112/* 1D999 */,/*44823*/9112/* 1D99A */,/*44824*/9112/* 1D99B */,/*44825*/9112/* 1D99C */, /*44826*/9112/* 1D99D */,/*44827*/9112/* 1D99E */,/*44828*/9112/* 1D99F */,/*44829*/9112/* 1D9A0 */, /*44830*/9112/* 1D9A1 */,/*44831*/9112/* 1D9A2 */,/*44832*/9112/* 1D9A3 */,/*44833*/9112/* 1D9A4 */, /*44834*/9112/* 1D9A5 */,/*44835*/9112/* 1D9A6 */,/*44836*/9112/* 1D9A7 */,/*44837*/9112/* 1D9A8 */, /*44838*/9112/* 1D9A9 */,/*44839*/9112/* 1D9AA */,/*44840*/9112/* 1D9AB */,/*44841*/9112/* 1D9AC */, /*44842*/9112/* 1D9AD */,/*44843*/9112/* 1D9AE */,/*44844*/9112/* 1D9AF */,/*44845*/9112/* 1D9B0 */, /*44846*/9112/* 1D9B1 */,/*44847*/9112/* 1D9B2 */,/*44848*/9112/* 1D9B3 */,/*44849*/9112/* 1D9B4 */, /*44850*/9112/* 1D9B5 */,/*44851*/9112/* 1D9B6 */,/*44852*/9112/* 1D9B7 */,/*44853*/9112/* 1D9B8 */, /*44854*/9112/* 1D9B9 */,/*44855*/9112/* 1D9BA */,/*44856*/9112/* 1D9BB */,/*44857*/9112/* 1D9BC */, /*44858*/9112/* 1D9BD */,/*44859*/9112/* 1D9BE */,/*44860*/9112/* 1D9BF */,/*44861*/9112/* 1D9C0 */, /*44862*/9112/* 1D9C1 */,/*44863*/9112/* 1D9C2 */,/*44864*/9112/* 1D9C3 */,/*44865*/9112/* 1D9C4 */, /*44866*/9112/* 1D9C5 */,/*44867*/9112/* 1D9C6 */,/*44868*/9112/* 1D9C7 */,/*44869*/9112/* 1D9C8 */, /*44870*/9112/* 1D9C9 */,/*44871*/9112/* 1D9CA */,/*44872*/9112/* 1D9CB */,/*44873*/9112/* 1D9CC */, /*44874*/9112/* 1D9CD */,/*44875*/9112/* 1D9CE */,/*44876*/9112/* 1D9CF */,/*44877*/9112/* 1D9D0 */, /*44878*/9112/* 1D9D1 */,/*44879*/9112/* 1D9D2 */,/*44880*/9112/* 1D9D3 */,/*44881*/9112/* 1D9D4 */, /*44882*/9112/* 1D9D5 */,/*44883*/9112/* 1D9D6 */,/*44884*/9112/* 1D9D7 */,/*44885*/9112/* 1D9D8 */, /*44886*/9112/* 1D9D9 */,/*44887*/9112/* 1D9DA */,/*44888*/9112/* 1D9DB */,/*44889*/9112/* 1D9DC */, /*44890*/9112/* 1D9DD */,/*44891*/9112/* 1D9DE */,/*44892*/9112/* 1D9DF */,/*44893*/9112/* 1D9E0 */, /*44894*/9112/* 1D9E1 */,/*44895*/9112/* 1D9E2 */,/*44896*/9112/* 1D9E3 */,/*44897*/9112/* 1D9E4 */, /*44898*/9112/* 1D9E5 */,/*44899*/9112/* 1D9E6 */,/*44900*/9112/* 1D9E7 */,/*44901*/9112/* 1D9E8 */, /*44902*/9112/* 1D9E9 */,/*44903*/9112/* 1D9EA */,/*44904*/9112/* 1D9EB */,/*44905*/9112/* 1D9EC */, /*44906*/9112/* 1D9ED */,/*44907*/9112/* 1D9EE */,/*44908*/9112/* 1D9EF */,/*44909*/9112/* 1D9F0 */, /*44910*/9112/* 1D9F1 */,/*44911*/9112/* 1D9F2 */,/*44912*/9112/* 1D9F3 */,/*44913*/9112/* 1D9F4 */, /*44914*/9112/* 1D9F5 */,/*44915*/9112/* 1D9F6 */,/*44916*/9112/* 1D9F7 */,/*44917*/9112/* 1D9F8 */, /*44918*/9112/* 1D9F9 */,/*44919*/9112/* 1D9FA */,/*44920*/9112/* 1D9FB */,/*44921*/9112/* 1D9FC */, /*44922*/9112/* 1D9FD */,/*44923*/9112/* 1D9FE */,/*44924*/9112/* 1D9FF */,/*44925*/9113/* 1DA00 */, /*44926*/9113/* 1DA01 */,/*44927*/9113/* 1DA02 */,/*44928*/9113/* 1DA03 */,/*44929*/9113/* 1DA04 */, /*44930*/9113/* 1DA05 */,/*44931*/9113/* 1DA06 */,/*44932*/9113/* 1DA07 */,/*44933*/9113/* 1DA08 */, /*44934*/9113/* 1DA09 */,/*44935*/9113/* 1DA0A */,/*44936*/9113/* 1DA0B */,/*44937*/9113/* 1DA0C */, /*44938*/9113/* 1DA0D */,/*44939*/9113/* 1DA0E */,/*44940*/9113/* 1DA0F */,/*44941*/9113/* 1DA10 */, /*44942*/9113/* 1DA11 */,/*44943*/9113/* 1DA12 */,/*44944*/9113/* 1DA13 */,/*44945*/9113/* 1DA14 */, /*44946*/9113/* 1DA15 */,/*44947*/9113/* 1DA16 */,/*44948*/9113/* 1DA17 */,/*44949*/9113/* 1DA18 */, /*44950*/9113/* 1DA19 */,/*44951*/9113/* 1DA1A */,/*44952*/9113/* 1DA1B */,/*44953*/9113/* 1DA1C */, /*44954*/9113/* 1DA1D */,/*44955*/9113/* 1DA1E */,/*44956*/9113/* 1DA1F */,/*44957*/9113/* 1DA20 */, /*44958*/9113/* 1DA21 */,/*44959*/9113/* 1DA22 */,/*44960*/9113/* 1DA23 */,/*44961*/9113/* 1DA24 */, /*44962*/9113/* 1DA25 */,/*44963*/9113/* 1DA26 */,/*44964*/9113/* 1DA27 */,/*44965*/9113/* 1DA28 */, /*44966*/9113/* 1DA29 */,/*44967*/9113/* 1DA2A */,/*44968*/9113/* 1DA2B */,/*44969*/9113/* 1DA2C */, /*44970*/9113/* 1DA2D */,/*44971*/9113/* 1DA2E */,/*44972*/9113/* 1DA2F */,/*44973*/9113/* 1DA30 */, /*44974*/9113/* 1DA31 */,/*44975*/9113/* 1DA32 */,/*44976*/9113/* 1DA33 */,/*44977*/9113/* 1DA34 */, /*44978*/9113/* 1DA35 */,/*44979*/9113/* 1DA36 */,/*44980*/9112/* 1DA37 */,/*44981*/9112/* 1DA38 */, /*44982*/9112/* 1DA39 */,/*44983*/9112/* 1DA3A */,/*44984*/9113/* 1DA3B */,/*44985*/9113/* 1DA3C */, /*44986*/9113/* 1DA3D */,/*44987*/9113/* 1DA3E */,/*44988*/9113/* 1DA3F */,/*44989*/9113/* 1DA40 */, /*44990*/9113/* 1DA41 */,/*44991*/9113/* 1DA42 */,/*44992*/9113/* 1DA43 */,/*44993*/9113/* 1DA44 */, /*44994*/9113/* 1DA45 */,/*44995*/9113/* 1DA46 */,/*44996*/9113/* 1DA47 */,/*44997*/9113/* 1DA48 */, /*44998*/9113/* 1DA49 */,/*44999*/9113/* 1DA4A */,/*45000*/9113/* 1DA4B */,/*45001*/9113/* 1DA4C */, /*45002*/9113/* 1DA4D */,/*45003*/9113/* 1DA4E */,/*45004*/9113/* 1DA4F */,/*45005*/9113/* 1DA50 */, /*45006*/9113/* 1DA51 */,/*45007*/9113/* 1DA52 */,/*45008*/9113/* 1DA53 */,/*45009*/9113/* 1DA54 */, /*45010*/9113/* 1DA55 */,/*45011*/9113/* 1DA56 */,/*45012*/9113/* 1DA57 */,/*45013*/9113/* 1DA58 */, /*45014*/9113/* 1DA59 */,/*45015*/9113/* 1DA5A */,/*45016*/9113/* 1DA5B */,/*45017*/9113/* 1DA5C */, /*45018*/9113/* 1DA5D */,/*45019*/9113/* 1DA5E */,/*45020*/9113/* 1DA5F */,/*45021*/9113/* 1DA60 */, /*45022*/9113/* 1DA61 */,/*45023*/9113/* 1DA62 */,/*45024*/9113/* 1DA63 */,/*45025*/9113/* 1DA64 */, /*45026*/9113/* 1DA65 */,/*45027*/9113/* 1DA66 */,/*45028*/9113/* 1DA67 */,/*45029*/9113/* 1DA68 */, /*45030*/9113/* 1DA69 */,/*45031*/9113/* 1DA6A */,/*45032*/9113/* 1DA6B */,/*45033*/9113/* 1DA6C */, /*45034*/9112/* 1DA6D */,/*45035*/9112/* 1DA6E */,/*45036*/9112/* 1DA6F */,/*45037*/9112/* 1DA70 */, /*45038*/9112/* 1DA71 */,/*45039*/9112/* 1DA72 */,/*45040*/9112/* 1DA73 */,/*45041*/9112/* 1DA74 */, /*45042*/9113/* 1DA75 */,/*45043*/9112/* 1DA76 */,/*45044*/9112/* 1DA77 */,/*45045*/9112/* 1DA78 */, /*45046*/9112/* 1DA79 */,/*45047*/9112/* 1DA7A */,/*45048*/9112/* 1DA7B */,/*45049*/9112/* 1DA7C */, /*45050*/9112/* 1DA7D */,/*45051*/9112/* 1DA7E */,/*45052*/9112/* 1DA7F */,/*45053*/9112/* 1DA80 */, /*45054*/9112/* 1DA81 */,/*45055*/9112/* 1DA82 */,/*45056*/9112/* 1DA83 */,/*45057*/9113/* 1DA84 */, /*45058*/9112/* 1DA85 */,/*45059*/9112/* 1DA86 */,/*45060*/9114/* 1DA87 */,/*45061*/9115/* 1DA88 */, /*45062*/9114/* 1DA89 */,/*45063*/9114/* 1DA8A */,/*45064*/9116/* 1DA8B */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*45080*/9113/* 1DA9B */,/*45081*/9113/* 1DA9C */,/*45082*/9113/* 1DA9D */,/*45083*/9113/* 1DA9E */, /*45084*/9113/* 1DA9F */,0,/*45086*/9113/* 1DAA1 */,/*45087*/9113/* 1DAA2 */,/*45088*/9113/* 1DAA3 */, /*45089*/9113/* 1DAA4 */,/*45090*/9113/* 1DAA5 */,/*45091*/9113/* 1DAA6 */,/*45092*/9113/* 1DAA7 */, /*45093*/9113/* 1DAA8 */,/*45094*/9113/* 1DAA9 */,/*45095*/9113/* 1DAAA */,/*45096*/9113/* 1DAAB */, /*45097*/9113/* 1DAAC */,/*45098*/9113/* 1DAAD */,/*45099*/9113/* 1DAAE */,/*45100*/9113/* 1DAAF */, /*45101*/9117/* 1E800 */,/*45102*/9117/* 1E801 */,/*45103*/9117/* 1E802 */,/*45104*/9117/* 1E803 */, /*45105*/9117/* 1E804 */,/*45106*/9117/* 1E805 */,/*45107*/9117/* 1E806 */,/*45108*/9117/* 1E807 */, /*45109*/9117/* 1E808 */,/*45110*/9117/* 1E809 */,/*45111*/9117/* 1E80A */,/*45112*/9117/* 1E80B */, /*45113*/9117/* 1E80C */,/*45114*/9117/* 1E80D */,/*45115*/9117/* 1E80E */,/*45116*/9117/* 1E80F */, /*45117*/9117/* 1E810 */,/*45118*/9117/* 1E811 */,/*45119*/9117/* 1E812 */,/*45120*/9117/* 1E813 */, /*45121*/9117/* 1E814 */,/*45122*/9117/* 1E815 */,/*45123*/9117/* 1E816 */,/*45124*/9117/* 1E817 */, /*45125*/9117/* 1E818 */,/*45126*/9117/* 1E819 */,/*45127*/9117/* 1E81A */,/*45128*/9117/* 1E81B */, /*45129*/9117/* 1E81C */,/*45130*/9117/* 1E81D */,/*45131*/9117/* 1E81E */,/*45132*/9117/* 1E81F */, /*45133*/9117/* 1E820 */,/*45134*/9117/* 1E821 */,/*45135*/9117/* 1E822 */,/*45136*/9117/* 1E823 */, /*45137*/9117/* 1E824 */,/*45138*/9117/* 1E825 */,/*45139*/9117/* 1E826 */,/*45140*/9117/* 1E827 */, /*45141*/9117/* 1E828 */,/*45142*/9117/* 1E829 */,/*45143*/9117/* 1E82A */,/*45144*/9117/* 1E82B */, /*45145*/9117/* 1E82C */,/*45146*/9117/* 1E82D */,/*45147*/9117/* 1E82E */,/*45148*/9117/* 1E82F */, /*45149*/9117/* 1E830 */,/*45150*/9117/* 1E831 */,/*45151*/9117/* 1E832 */,/*45152*/9117/* 1E833 */, /*45153*/9117/* 1E834 */,/*45154*/9117/* 1E835 */,/*45155*/9117/* 1E836 */,/*45156*/9117/* 1E837 */, /*45157*/9117/* 1E838 */,/*45158*/9117/* 1E839 */,/*45159*/9117/* 1E83A */,/*45160*/9117/* 1E83B */, /*45161*/9117/* 1E83C */,/*45162*/9117/* 1E83D */,/*45163*/9117/* 1E83E */,/*45164*/9117/* 1E83F */, /*45165*/9117/* 1E840 */,/*45166*/9117/* 1E841 */,/*45167*/9117/* 1E842 */,/*45168*/9117/* 1E843 */, /*45169*/9117/* 1E844 */,/*45170*/9117/* 1E845 */,/*45171*/9117/* 1E846 */,/*45172*/9117/* 1E847 */, /*45173*/9117/* 1E848 */,/*45174*/9117/* 1E849 */,/*45175*/9117/* 1E84A */,/*45176*/9117/* 1E84B */, /*45177*/9117/* 1E84C */,/*45178*/9117/* 1E84D */,/*45179*/9117/* 1E84E */,/*45180*/9117/* 1E84F */, /*45181*/9117/* 1E850 */,/*45182*/9117/* 1E851 */,/*45183*/9117/* 1E852 */,/*45184*/9117/* 1E853 */, /*45185*/9117/* 1E854 */,/*45186*/9117/* 1E855 */,/*45187*/9117/* 1E856 */,/*45188*/9117/* 1E857 */, /*45189*/9117/* 1E858 */,/*45190*/9117/* 1E859 */,/*45191*/9117/* 1E85A */,/*45192*/9117/* 1E85B */, /*45193*/9117/* 1E85C */,/*45194*/9117/* 1E85D */,/*45195*/9117/* 1E85E */,/*45196*/9117/* 1E85F */, /*45197*/9117/* 1E860 */,/*45198*/9117/* 1E861 */,/*45199*/9117/* 1E862 */,/*45200*/9117/* 1E863 */, /*45201*/9117/* 1E864 */,/*45202*/9117/* 1E865 */,/*45203*/9117/* 1E866 */,/*45204*/9117/* 1E867 */, /*45205*/9117/* 1E868 */,/*45206*/9117/* 1E869 */,/*45207*/9117/* 1E86A */,/*45208*/9117/* 1E86B */, /*45209*/9117/* 1E86C */,/*45210*/9117/* 1E86D */,/*45211*/9117/* 1E86E */,/*45212*/9117/* 1E86F */, /*45213*/9117/* 1E870 */,/*45214*/9117/* 1E871 */,/*45215*/9117/* 1E872 */,/*45216*/9117/* 1E873 */, /*45217*/9117/* 1E874 */,/*45218*/9117/* 1E875 */,/*45219*/9117/* 1E876 */,/*45220*/9117/* 1E877 */, /*45221*/9117/* 1E878 */,/*45222*/9117/* 1E879 */,/*45223*/9117/* 1E87A */,/*45224*/9117/* 1E87B */, /*45225*/9117/* 1E87C */,/*45226*/9117/* 1E87D */,/*45227*/9117/* 1E87E */,/*45228*/9117/* 1E87F */, /*45229*/9117/* 1E880 */,/*45230*/9117/* 1E881 */,/*45231*/9117/* 1E882 */,/*45232*/9117/* 1E883 */, /*45233*/9117/* 1E884 */,/*45234*/9117/* 1E885 */,/*45235*/9117/* 1E886 */,/*45236*/9117/* 1E887 */, /*45237*/9117/* 1E888 */,/*45238*/9117/* 1E889 */,/*45239*/9117/* 1E88A */,/*45240*/9117/* 1E88B */, /*45241*/9117/* 1E88C */,/*45242*/9117/* 1E88D */,/*45243*/9117/* 1E88E */,/*45244*/9117/* 1E88F */, /*45245*/9117/* 1E890 */,/*45246*/9117/* 1E891 */,/*45247*/9117/* 1E892 */,/*45248*/9117/* 1E893 */, /*45249*/9117/* 1E894 */,/*45250*/9117/* 1E895 */,/*45251*/9117/* 1E896 */,/*45252*/9117/* 1E897 */, /*45253*/9117/* 1E898 */,/*45254*/9117/* 1E899 */,/*45255*/9117/* 1E89A */,/*45256*/9117/* 1E89B */, /*45257*/9117/* 1E89C */,/*45258*/9117/* 1E89D */,/*45259*/9117/* 1E89E */,/*45260*/9117/* 1E89F */, /*45261*/9117/* 1E8A0 */,/*45262*/9117/* 1E8A1 */,/*45263*/9117/* 1E8A2 */,/*45264*/9117/* 1E8A3 */, /*45265*/9117/* 1E8A4 */,/*45266*/9117/* 1E8A5 */,/*45267*/9117/* 1E8A6 */,/*45268*/9117/* 1E8A7 */, /*45269*/9117/* 1E8A8 */,/*45270*/9117/* 1E8A9 */,/*45271*/9117/* 1E8AA */,/*45272*/9117/* 1E8AB */, /*45273*/9117/* 1E8AC */,/*45274*/9117/* 1E8AD */,/*45275*/9117/* 1E8AE */,/*45276*/9117/* 1E8AF */, /*45277*/9117/* 1E8B0 */,/*45278*/9117/* 1E8B1 */,/*45279*/9117/* 1E8B2 */,/*45280*/9117/* 1E8B3 */, /*45281*/9117/* 1E8B4 */,/*45282*/9117/* 1E8B5 */,/*45283*/9117/* 1E8B6 */,/*45284*/9117/* 1E8B7 */, /*45285*/9117/* 1E8B8 */,/*45286*/9117/* 1E8B9 */,/*45287*/9117/* 1E8BA */,/*45288*/9117/* 1E8BB */, /*45289*/9117/* 1E8BC */,/*45290*/9117/* 1E8BD */,/*45291*/9117/* 1E8BE */,/*45292*/9117/* 1E8BF */, /*45293*/9117/* 1E8C0 */,/*45294*/9117/* 1E8C1 */,/*45295*/9117/* 1E8C2 */,/*45296*/9117/* 1E8C3 */, /*45297*/9117/* 1E8C4 */,0,0,/*45300*/9118/* 1E8C7 */,/*45301*/9119/* 1E8C8 */,/*45302*/9120/* 1E8C9 */, /*45303*/9121/* 1E8CA */,/*45304*/9122/* 1E8CB */,/*45305*/9123/* 1E8CC */,/*45306*/9124/* 1E8CD */, /*45307*/9125/* 1E8CE */,/*45308*/9126/* 1E8CF */,/*45309*/9127/* 1E8D0 */,/*45310*/9127/* 1E8D1 */, /*45311*/9127/* 1E8D2 */,/*45312*/9127/* 1E8D3 */,/*45313*/9127/* 1E8D4 */,/*45314*/9127/* 1E8D5 */, /*45315*/9127/* 1E8D6 */,/*45316*/9128/* 1EE00 */,/*45317*/9129/* 1EE01 */,/*45318*/9130/* 1EE02 */, /*45319*/9131/* 1EE03 */,0,/*45321*/9132/* 1EE05 */,/*45322*/9133/* 1EE06 */,/*45323*/9134/* 1EE07 */, /*45324*/9135/* 1EE08 */,/*45325*/9136/* 1EE09 */,/*45326*/9137/* 1EE0A */,/*45327*/9138/* 1EE0B */, /*45328*/9139/* 1EE0C */,/*45329*/9140/* 1EE0D */,/*45330*/9141/* 1EE0E */,/*45331*/9142/* 1EE0F */, /*45332*/9143/* 1EE10 */,/*45333*/9144/* 1EE11 */,/*45334*/9145/* 1EE12 */,/*45335*/9146/* 1EE13 */, /*45336*/9147/* 1EE14 */,/*45337*/9148/* 1EE15 */,/*45338*/9149/* 1EE16 */,/*45339*/9150/* 1EE17 */, /*45340*/9151/* 1EE18 */,/*45341*/9152/* 1EE19 */,/*45342*/9153/* 1EE1A */,/*45343*/9154/* 1EE1B */, /*45344*/9155/* 1EE1C */,/*45345*/9156/* 1EE1D */,/*45346*/9157/* 1EE1E */,/*45347*/9158/* 1EE1F */,0, /*45349*/9159/* 1EE21 */,/*45350*/9160/* 1EE22 */,0,/*45352*/9161/* 1EE24 */,0,0,/*45355*/9162/* 1EE27 */,0, /*45357*/9163/* 1EE29 */,/*45358*/9164/* 1EE2A */,/*45359*/9165/* 1EE2B */,/*45360*/9166/* 1EE2C */, /*45361*/9167/* 1EE2D */,/*45362*/9168/* 1EE2E */,/*45363*/9169/* 1EE2F */,/*45364*/9170/* 1EE30 */, /*45365*/9171/* 1EE31 */,/*45366*/9172/* 1EE32 */,0,/*45368*/9173/* 1EE34 */,/*45369*/9174/* 1EE35 */, /*45370*/9175/* 1EE36 */,/*45371*/9176/* 1EE37 */,0,/*45373*/9177/* 1EE39 */,0,/*45375*/9178/* 1EE3B */,0,0,0,0,0,0, /*45382*/9179/* 1EE42 */,0,0,0,0,/*45387*/9180/* 1EE47 */,0,/*45389*/9181/* 1EE49 */,0,/*45391*/9182/* 1EE4B */,0, /*45393*/9183/* 1EE4D */,/*45394*/9184/* 1EE4E */,/*45395*/9185/* 1EE4F */,0,/*45397*/9186/* 1EE51 */, /*45398*/9187/* 1EE52 */,0,/*45400*/9188/* 1EE54 */,0,0,/*45403*/9189/* 1EE57 */,0,/*45405*/9190/* 1EE59 */,0, /*45407*/9191/* 1EE5B */,0,/*45409*/9192/* 1EE5D */,0,/*45411*/9193/* 1EE5F */,0,/*45413*/9194/* 1EE61 */, /*45414*/9195/* 1EE62 */,0,/*45416*/9196/* 1EE64 */,0,0,/*45419*/9197/* 1EE67 */,/*45420*/9198/* 1EE68 */, /*45421*/9199/* 1EE69 */,/*45422*/9200/* 1EE6A */,0,/*45424*/9201/* 1EE6C */,/*45425*/9202/* 1EE6D */, /*45426*/9203/* 1EE6E */,/*45427*/9204/* 1EE6F */,/*45428*/9205/* 1EE70 */,/*45429*/9206/* 1EE71 */, /*45430*/9207/* 1EE72 */,0,/*45432*/9208/* 1EE74 */,/*45433*/9209/* 1EE75 */,/*45434*/9210/* 1EE76 */, /*45435*/9211/* 1EE77 */,0,/*45437*/9212/* 1EE79 */,/*45438*/9213/* 1EE7A */,/*45439*/9214/* 1EE7B */, /*45440*/9215/* 1EE7C */,0,/*45442*/9216/* 1EE7E */,0,/*45444*/9217/* 1EE80 */,/*45445*/9218/* 1EE81 */, /*45446*/9219/* 1EE82 */,/*45447*/9220/* 1EE83 */,/*45448*/9221/* 1EE84 */,/*45449*/9222/* 1EE85 */, /*45450*/9223/* 1EE86 */,/*45451*/9224/* 1EE87 */,/*45452*/9225/* 1EE88 */,/*45453*/9226/* 1EE89 */,0, /*45455*/9227/* 1EE8B */,/*45456*/9228/* 1EE8C */,/*45457*/9229/* 1EE8D */,/*45458*/9230/* 1EE8E */, /*45459*/9231/* 1EE8F */,/*45460*/9232/* 1EE90 */,/*45461*/9233/* 1EE91 */,/*45462*/9234/* 1EE92 */, /*45463*/9235/* 1EE93 */,/*45464*/9236/* 1EE94 */,/*45465*/9237/* 1EE95 */,/*45466*/9238/* 1EE96 */, /*45467*/9239/* 1EE97 */,/*45468*/9240/* 1EE98 */,/*45469*/9241/* 1EE99 */,/*45470*/9242/* 1EE9A */, /*45471*/9243/* 1EE9B */,0,0,0,0,0,/*45477*/9244/* 1EEA1 */,/*45478*/9245/* 1EEA2 */,/*45479*/9246/* 1EEA3 */,0, /*45481*/9247/* 1EEA5 */,/*45482*/9248/* 1EEA6 */,/*45483*/9249/* 1EEA7 */,/*45484*/9250/* 1EEA8 */, /*45485*/9251/* 1EEA9 */,0,/*45487*/9252/* 1EEAB */,/*45488*/9253/* 1EEAC */,/*45489*/9254/* 1EEAD */, /*45490*/9255/* 1EEAE */,/*45491*/9256/* 1EEAF */,/*45492*/9257/* 1EEB0 */,/*45493*/9258/* 1EEB1 */, /*45494*/9259/* 1EEB2 */,/*45495*/9260/* 1EEB3 */,/*45496*/9261/* 1EEB4 */,/*45497*/9262/* 1EEB5 */, /*45498*/9263/* 1EEB6 */,/*45499*/9264/* 1EEB7 */,/*45500*/9265/* 1EEB8 */,/*45501*/9266/* 1EEB9 */, /*45502*/9267/* 1EEBA */,/*45503*/9268/* 1EEBB */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*45556*/9269/* 1EEF0 */,/*45557*/9269/* 1EEF1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,/*45828*/9270/* 1F000 */,/*45829*/9270/* 1F001 */,/*45830*/9270/* 1F002 */, /*45831*/9270/* 1F003 */,/*45832*/9270/* 1F004 */,/*45833*/9270/* 1F005 */,/*45834*/9270/* 1F006 */, /*45835*/9270/* 1F007 */,/*45836*/9270/* 1F008 */,/*45837*/9270/* 1F009 */,/*45838*/9270/* 1F00A */, /*45839*/9270/* 1F00B */,/*45840*/9270/* 1F00C */,/*45841*/9270/* 1F00D */,/*45842*/9270/* 1F00E */, /*45843*/9270/* 1F00F */,/*45844*/9270/* 1F010 */,/*45845*/9270/* 1F011 */,/*45846*/9270/* 1F012 */, /*45847*/9270/* 1F013 */,/*45848*/9270/* 1F014 */,/*45849*/9270/* 1F015 */,/*45850*/9270/* 1F016 */, /*45851*/9270/* 1F017 */,/*45852*/9270/* 1F018 */,/*45853*/9270/* 1F019 */,/*45854*/9270/* 1F01A */, /*45855*/9270/* 1F01B */,/*45856*/9270/* 1F01C */,/*45857*/9270/* 1F01D */,/*45858*/9270/* 1F01E */, /*45859*/9270/* 1F01F */,/*45860*/9270/* 1F020 */,/*45861*/9270/* 1F021 */,/*45862*/9270/* 1F022 */, /*45863*/9270/* 1F023 */,/*45864*/9270/* 1F024 */,/*45865*/9270/* 1F025 */,/*45866*/9270/* 1F026 */, /*45867*/9270/* 1F027 */,/*45868*/9270/* 1F028 */,/*45869*/9270/* 1F029 */,/*45870*/9270/* 1F02A */, /*45871*/9270/* 1F02B */,0,0,0,0,/*45876*/9271/* 1F030 */,/*45877*/9271/* 1F031 */,/*45878*/9271/* 1F032 */, /*45879*/9271/* 1F033 */,/*45880*/9271/* 1F034 */,/*45881*/9271/* 1F035 */,/*45882*/9271/* 1F036 */, /*45883*/9271/* 1F037 */,/*45884*/9271/* 1F038 */,/*45885*/9271/* 1F039 */,/*45886*/9271/* 1F03A */, /*45887*/9271/* 1F03B */,/*45888*/9271/* 1F03C */,/*45889*/9271/* 1F03D */,/*45890*/9271/* 1F03E */, /*45891*/9271/* 1F03F */,/*45892*/9271/* 1F040 */,/*45893*/9271/* 1F041 */,/*45894*/9271/* 1F042 */, /*45895*/9271/* 1F043 */,/*45896*/9271/* 1F044 */,/*45897*/9271/* 1F045 */,/*45898*/9271/* 1F046 */, /*45899*/9271/* 1F047 */,/*45900*/9271/* 1F048 */,/*45901*/9271/* 1F049 */,/*45902*/9271/* 1F04A */, /*45903*/9271/* 1F04B */,/*45904*/9271/* 1F04C */,/*45905*/9271/* 1F04D */,/*45906*/9271/* 1F04E */, /*45907*/9271/* 1F04F */,/*45908*/9271/* 1F050 */,/*45909*/9271/* 1F051 */,/*45910*/9271/* 1F052 */, /*45911*/9271/* 1F053 */,/*45912*/9271/* 1F054 */,/*45913*/9271/* 1F055 */,/*45914*/9271/* 1F056 */, /*45915*/9271/* 1F057 */,/*45916*/9271/* 1F058 */,/*45917*/9271/* 1F059 */,/*45918*/9271/* 1F05A */, /*45919*/9271/* 1F05B */,/*45920*/9271/* 1F05C */,/*45921*/9271/* 1F05D */,/*45922*/9271/* 1F05E */, /*45923*/9271/* 1F05F */,/*45924*/9271/* 1F060 */,/*45925*/9271/* 1F061 */,/*45926*/9271/* 1F062 */, /*45927*/9271/* 1F063 */,/*45928*/9271/* 1F064 */,/*45929*/9271/* 1F065 */,/*45930*/9271/* 1F066 */, /*45931*/9271/* 1F067 */,/*45932*/9271/* 1F068 */,/*45933*/9271/* 1F069 */,/*45934*/9271/* 1F06A */, /*45935*/9271/* 1F06B */,/*45936*/9271/* 1F06C */,/*45937*/9271/* 1F06D */,/*45938*/9271/* 1F06E */, /*45939*/9271/* 1F06F */,/*45940*/9271/* 1F070 */,/*45941*/9271/* 1F071 */,/*45942*/9271/* 1F072 */, /*45943*/9271/* 1F073 */,/*45944*/9271/* 1F074 */,/*45945*/9271/* 1F075 */,/*45946*/9271/* 1F076 */, /*45947*/9271/* 1F077 */,/*45948*/9271/* 1F078 */,/*45949*/9271/* 1F079 */,/*45950*/9271/* 1F07A */, /*45951*/9271/* 1F07B */,/*45952*/9271/* 1F07C */,/*45953*/9271/* 1F07D */,/*45954*/9271/* 1F07E */, /*45955*/9271/* 1F07F */,/*45956*/9271/* 1F080 */,/*45957*/9271/* 1F081 */,/*45958*/9271/* 1F082 */, /*45959*/9271/* 1F083 */,/*45960*/9271/* 1F084 */,/*45961*/9271/* 1F085 */,/*45962*/9271/* 1F086 */, /*45963*/9271/* 1F087 */,/*45964*/9271/* 1F088 */,/*45965*/9271/* 1F089 */,/*45966*/9271/* 1F08A */, /*45967*/9271/* 1F08B */,/*45968*/9271/* 1F08C */,/*45969*/9271/* 1F08D */,/*45970*/9271/* 1F08E */, /*45971*/9271/* 1F08F */,/*45972*/9271/* 1F090 */,/*45973*/9271/* 1F091 */,/*45974*/9271/* 1F092 */, /*45975*/9271/* 1F093 */,0,0,0,0,0,0,0,0,0,0,0,0,/*45988*/9272/* 1F0A0 */,/*45989*/9272/* 1F0A1 */, /*45990*/9272/* 1F0A2 */,/*45991*/9272/* 1F0A3 */,/*45992*/9272/* 1F0A4 */,/*45993*/9272/* 1F0A5 */, /*45994*/9272/* 1F0A6 */,/*45995*/9272/* 1F0A7 */,/*45996*/9272/* 1F0A8 */,/*45997*/9272/* 1F0A9 */, /*45998*/9272/* 1F0AA */,/*45999*/9272/* 1F0AB */,/*46000*/9272/* 1F0AC */,/*46001*/9272/* 1F0AD */, /*46002*/9272/* 1F0AE */,0,0,/*46005*/9272/* 1F0B1 */,/*46006*/9272/* 1F0B2 */,/*46007*/9272/* 1F0B3 */, /*46008*/9272/* 1F0B4 */,/*46009*/9272/* 1F0B5 */,/*46010*/9272/* 1F0B6 */,/*46011*/9272/* 1F0B7 */, /*46012*/9272/* 1F0B8 */,/*46013*/9272/* 1F0B9 */,/*46014*/9272/* 1F0BA */,/*46015*/9272/* 1F0BB */, /*46016*/9272/* 1F0BC */,/*46017*/9272/* 1F0BD */,/*46018*/9272/* 1F0BE */,/*46019*/9273/* 1F0BF */,0, /*46021*/9272/* 1F0C1 */,/*46022*/9272/* 1F0C2 */,/*46023*/9272/* 1F0C3 */,/*46024*/9272/* 1F0C4 */, /*46025*/9272/* 1F0C5 */,/*46026*/9272/* 1F0C6 */,/*46027*/9272/* 1F0C7 */,/*46028*/9272/* 1F0C8 */, /*46029*/9272/* 1F0C9 */,/*46030*/9272/* 1F0CA */,/*46031*/9272/* 1F0CB */,/*46032*/9272/* 1F0CC */, /*46033*/9272/* 1F0CD */,/*46034*/9272/* 1F0CE */,/*46035*/9272/* 1F0CF */,0,/*46037*/9272/* 1F0D1 */, /*46038*/9272/* 1F0D2 */,/*46039*/9272/* 1F0D3 */,/*46040*/9272/* 1F0D4 */,/*46041*/9272/* 1F0D5 */, /*46042*/9272/* 1F0D6 */,/*46043*/9272/* 1F0D7 */,/*46044*/9272/* 1F0D8 */,/*46045*/9272/* 1F0D9 */, /*46046*/9272/* 1F0DA */,/*46047*/9272/* 1F0DB */,/*46048*/9272/* 1F0DC */,/*46049*/9272/* 1F0DD */, /*46050*/9272/* 1F0DE */,/*46051*/9272/* 1F0DF */,/*46052*/9273/* 1F0E0 */,/*46053*/9273/* 1F0E1 */, /*46054*/9273/* 1F0E2 */,/*46055*/9273/* 1F0E3 */,/*46056*/9273/* 1F0E4 */,/*46057*/9273/* 1F0E5 */, /*46058*/9273/* 1F0E6 */,/*46059*/9273/* 1F0E7 */,/*46060*/9273/* 1F0E8 */,/*46061*/9273/* 1F0E9 */, /*46062*/9273/* 1F0EA */,/*46063*/9273/* 1F0EB */,/*46064*/9273/* 1F0EC */,/*46065*/9273/* 1F0ED */, /*46066*/9273/* 1F0EE */,/*46067*/9273/* 1F0EF */,/*46068*/9273/* 1F0F0 */,/*46069*/9273/* 1F0F1 */, /*46070*/9273/* 1F0F2 */,/*46071*/9273/* 1F0F3 */,/*46072*/9273/* 1F0F4 */,/*46073*/9273/* 1F0F5 */,0,0,0,0,0,0,0,0,0,0, /*46084*/9274/* 1F100 */,/*46085*/9275/* 1F101 */,/*46086*/9276/* 1F102 */,/*46087*/9277/* 1F103 */, /*46088*/9278/* 1F104 */,/*46089*/9279/* 1F105 */,/*46090*/9280/* 1F106 */,/*46091*/9281/* 1F107 */, /*46092*/9282/* 1F108 */,/*46093*/9283/* 1F109 */,/*46094*/9284/* 1F10A */,/*46095*/9285/* 1F10B */, /*46096*/9285/* 1F10C */,0,0,0,/*46100*/9286/* 1F110 */,/*46101*/9287/* 1F111 */,/*46102*/9288/* 1F112 */, /*46103*/9289/* 1F113 */,/*46104*/9290/* 1F114 */,/*46105*/9291/* 1F115 */,/*46106*/9292/* 1F116 */, /*46107*/9293/* 1F117 */,/*46108*/9294/* 1F118 */,/*46109*/9295/* 1F119 */,/*46110*/9296/* 1F11A */, /*46111*/9297/* 1F11B */,/*46112*/9298/* 1F11C */,/*46113*/9299/* 1F11D */,/*46114*/9300/* 1F11E */, /*46115*/9301/* 1F11F */,/*46116*/9302/* 1F120 */,/*46117*/9303/* 1F121 */,/*46118*/9304/* 1F122 */, /*46119*/9305/* 1F123 */,/*46120*/9306/* 1F124 */,/*46121*/9307/* 1F125 */,/*46122*/9308/* 1F126 */, /*46123*/9309/* 1F127 */,/*46124*/9310/* 1F128 */,/*46125*/9311/* 1F129 */,/*46126*/9312/* 1F12A */, /*46127*/9313/* 1F12B */,/*46128*/9314/* 1F12C */,/*46129*/9315/* 1F12D */,/*46130*/9316/* 1F12E */,0, /*46132*/9317/* 1F130 */,/*46133*/9318/* 1F131 */,/*46134*/9319/* 1F132 */,/*46135*/9320/* 1F133 */, /*46136*/9321/* 1F134 */,/*46137*/9322/* 1F135 */,/*46138*/9323/* 1F136 */,/*46139*/9324/* 1F137 */, /*46140*/9325/* 1F138 */,/*46141*/9326/* 1F139 */,/*46142*/9327/* 1F13A */,/*46143*/9328/* 1F13B */, /*46144*/9329/* 1F13C */,/*46145*/9330/* 1F13D */,/*46146*/9331/* 1F13E */,/*46147*/9332/* 1F13F */, /*46148*/9333/* 1F140 */,/*46149*/9334/* 1F141 */,/*46150*/9335/* 1F142 */,/*46151*/9336/* 1F143 */, /*46152*/9337/* 1F144 */,/*46153*/9338/* 1F145 */,/*46154*/9339/* 1F146 */,/*46155*/9340/* 1F147 */, /*46156*/9341/* 1F148 */,/*46157*/9342/* 1F149 */,/*46158*/9343/* 1F14A */,/*46159*/9344/* 1F14B */, /*46160*/9345/* 1F14C */,/*46161*/9346/* 1F14D */,/*46162*/9347/* 1F14E */,/*46163*/9348/* 1F14F */, /*46164*/9349/* 1F150 */,/*46165*/9349/* 1F151 */,/*46166*/9349/* 1F152 */,/*46167*/9349/* 1F153 */, /*46168*/9349/* 1F154 */,/*46169*/9349/* 1F155 */,/*46170*/9349/* 1F156 */,/*46171*/9350/* 1F157 */, /*46172*/9349/* 1F158 */,/*46173*/9349/* 1F159 */,/*46174*/9349/* 1F15A */,/*46175*/9349/* 1F15B */, /*46176*/9349/* 1F15C */,/*46177*/9349/* 1F15D */,/*46178*/9349/* 1F15E */,/*46179*/9350/* 1F15F */, /*46180*/9349/* 1F160 */,/*46181*/9349/* 1F161 */,/*46182*/9349/* 1F162 */,/*46183*/9349/* 1F163 */, /*46184*/9349/* 1F164 */,/*46185*/9349/* 1F165 */,/*46186*/9349/* 1F166 */,/*46187*/9349/* 1F167 */, /*46188*/9349/* 1F168 */,/*46189*/9349/* 1F169 */,/*46190*/9351/* 1F16A */,/*46191*/9352/* 1F16B */,0,0,0,0, /*46196*/9349/* 1F170 */,/*46197*/9349/* 1F171 */,/*46198*/9349/* 1F172 */,/*46199*/9349/* 1F173 */, /*46200*/9349/* 1F174 */,/*46201*/9349/* 1F175 */,/*46202*/9349/* 1F176 */,/*46203*/9349/* 1F177 */, /*46204*/9349/* 1F178 */,/*46205*/9350/* 1F179 */,/*46206*/9349/* 1F17A */,/*46207*/9350/* 1F17B */, /*46208*/9350/* 1F17C */,/*46209*/9349/* 1F17D */,/*46210*/9349/* 1F17E */,/*46211*/9350/* 1F17F */, /*46212*/9349/* 1F180 */,/*46213*/9349/* 1F181 */,/*46214*/9349/* 1F182 */,/*46215*/9349/* 1F183 */, /*46216*/9349/* 1F184 */,/*46217*/9349/* 1F185 */,/*46218*/9349/* 1F186 */,/*46219*/9349/* 1F187 */, /*46220*/9349/* 1F188 */,/*46221*/9349/* 1F189 */,/*46222*/9353/* 1F18A */,/*46223*/9353/* 1F18B */, /*46224*/9353/* 1F18C */,/*46225*/9353/* 1F18D */,/*46226*/9354/* 1F18E */,/*46227*/9354/* 1F18F */, /*46228*/9355/* 1F190 */,/*46229*/9354/* 1F191 */,/*46230*/9354/* 1F192 */,/*46231*/9354/* 1F193 */, /*46232*/9354/* 1F194 */,/*46233*/9354/* 1F195 */,/*46234*/9354/* 1F196 */,/*46235*/9354/* 1F197 */, /*46236*/9354/* 1F198 */,/*46237*/9354/* 1F199 */,/*46238*/9354/* 1F19A */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*46314*/9356/* 1F1E6 */,/*46315*/9356/* 1F1E7 */,/*46316*/9356/* 1F1E8 */,/*46317*/9356/* 1F1E9 */, /*46318*/9356/* 1F1EA */,/*46319*/9356/* 1F1EB */,/*46320*/9356/* 1F1EC */,/*46321*/9356/* 1F1ED */, /*46322*/9356/* 1F1EE */,/*46323*/9356/* 1F1EF */,/*46324*/9356/* 1F1F0 */,/*46325*/9356/* 1F1F1 */, /*46326*/9356/* 1F1F2 */,/*46327*/9356/* 1F1F3 */,/*46328*/9356/* 1F1F4 */,/*46329*/9356/* 1F1F5 */, /*46330*/9356/* 1F1F6 */,/*46331*/9356/* 1F1F7 */,/*46332*/9356/* 1F1F8 */,/*46333*/9356/* 1F1F9 */, /*46334*/9356/* 1F1FA */,/*46335*/9356/* 1F1FB */,/*46336*/9356/* 1F1FC */,/*46337*/9356/* 1F1FD */, /*46338*/9356/* 1F1FE */,/*46339*/9356/* 1F1FF */,/*46340*/9357/* 1F200 */,/*46341*/9358/* 1F201 */, /*46342*/9359/* 1F202 */,0,0,0,0,0,0,0,0,0,0,0,0,0,/*46356*/9360/* 1F210 */,/*46357*/9361/* 1F211 */, /*46358*/9362/* 1F212 */,/*46359*/9363/* 1F213 */,/*46360*/9364/* 1F214 */,/*46361*/9365/* 1F215 */, /*46362*/9366/* 1F216 */,/*46363*/9367/* 1F217 */,/*46364*/9368/* 1F218 */,/*46365*/9369/* 1F219 */, /*46366*/9370/* 1F21A */,/*46367*/9371/* 1F21B */,/*46368*/9372/* 1F21C */,/*46369*/9373/* 1F21D */, /*46370*/9374/* 1F21E */,/*46371*/9375/* 1F21F */,/*46372*/9376/* 1F220 */,/*46373*/9377/* 1F221 */, /*46374*/9378/* 1F222 */,/*46375*/9379/* 1F223 */,/*46376*/9380/* 1F224 */,/*46377*/9381/* 1F225 */, /*46378*/9382/* 1F226 */,/*46379*/9383/* 1F227 */,/*46380*/9384/* 1F228 */,/*46381*/9385/* 1F229 */, /*46382*/9386/* 1F22A */,/*46383*/9387/* 1F22B */,/*46384*/9388/* 1F22C */,/*46385*/9389/* 1F22D */, /*46386*/9390/* 1F22E */,/*46387*/9391/* 1F22F */,/*46388*/9392/* 1F230 */,/*46389*/9393/* 1F231 */, /*46390*/9394/* 1F232 */,/*46391*/9395/* 1F233 */,/*46392*/9396/* 1F234 */,/*46393*/9397/* 1F235 */, /*46394*/9398/* 1F236 */,/*46395*/9399/* 1F237 */,/*46396*/9400/* 1F238 */,/*46397*/9401/* 1F239 */, /*46398*/9402/* 1F23A */,0,0,0,0,0,/*46404*/9403/* 1F240 */,/*46405*/9404/* 1F241 */,/*46406*/9405/* 1F242 */, /*46407*/9406/* 1F243 */,/*46408*/9407/* 1F244 */,/*46409*/9408/* 1F245 */,/*46410*/9409/* 1F246 */, /*46411*/9410/* 1F247 */,/*46412*/9411/* 1F248 */,0,0,0,0,0,0,0,/*46420*/9412/* 1F250 */,/*46421*/9413/* 1F251 */,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*46596*/9414/* 1F300 */,/*46597*/9414/* 1F301 */,/*46598*/9414/* 1F302 */,/*46599*/9414/* 1F303 */, /*46600*/9414/* 1F304 */,/*46601*/9414/* 1F305 */,/*46602*/9414/* 1F306 */,/*46603*/9414/* 1F307 */, /*46604*/9414/* 1F308 */,/*46605*/9414/* 1F309 */,/*46606*/9414/* 1F30A */,/*46607*/9414/* 1F30B */, /*46608*/9414/* 1F30C */,/*46609*/9414/* 1F30D */,/*46610*/9414/* 1F30E */,/*46611*/9414/* 1F30F */, /*46612*/9414/* 1F310 */,/*46613*/9414/* 1F311 */,/*46614*/9414/* 1F312 */,/*46615*/9414/* 1F313 */, /*46616*/9414/* 1F314 */,/*46617*/9414/* 1F315 */,/*46618*/9414/* 1F316 */,/*46619*/9414/* 1F317 */, /*46620*/9414/* 1F318 */,/*46621*/9414/* 1F319 */,/*46622*/9414/* 1F31A */,/*46623*/9414/* 1F31B */, /*46624*/9414/* 1F31C */,/*46625*/9414/* 1F31D */,/*46626*/9414/* 1F31E */,/*46627*/9414/* 1F31F */, /*46628*/9414/* 1F320 */,/*46629*/9415/* 1F321 */,/*46630*/9415/* 1F322 */,/*46631*/9415/* 1F323 */, /*46632*/9415/* 1F324 */,/*46633*/9415/* 1F325 */,/*46634*/9415/* 1F326 */,/*46635*/9415/* 1F327 */, /*46636*/9415/* 1F328 */,/*46637*/9415/* 1F329 */,/*46638*/9415/* 1F32A */,/*46639*/9415/* 1F32B */, /*46640*/9415/* 1F32C */,/*46641*/9416/* 1F32D */,/*46642*/9416/* 1F32E */,/*46643*/9416/* 1F32F */, /*46644*/9414/* 1F330 */,/*46645*/9414/* 1F331 */,/*46646*/9414/* 1F332 */,/*46647*/9414/* 1F333 */, /*46648*/9414/* 1F334 */,/*46649*/9414/* 1F335 */,/*46650*/9415/* 1F336 */,/*46651*/9414/* 1F337 */, /*46652*/9414/* 1F338 */,/*46653*/9414/* 1F339 */,/*46654*/9414/* 1F33A */,/*46655*/9414/* 1F33B */, /*46656*/9414/* 1F33C */,/*46657*/9414/* 1F33D */,/*46658*/9414/* 1F33E */,/*46659*/9414/* 1F33F */, /*46660*/9414/* 1F340 */,/*46661*/9414/* 1F341 */,/*46662*/9414/* 1F342 */,/*46663*/9414/* 1F343 */, /*46664*/9414/* 1F344 */,/*46665*/9414/* 1F345 */,/*46666*/9414/* 1F346 */,/*46667*/9414/* 1F347 */, /*46668*/9414/* 1F348 */,/*46669*/9414/* 1F349 */,/*46670*/9414/* 1F34A */,/*46671*/9414/* 1F34B */, /*46672*/9414/* 1F34C */,/*46673*/9414/* 1F34D */,/*46674*/9414/* 1F34E */,/*46675*/9414/* 1F34F */, /*46676*/9414/* 1F350 */,/*46677*/9414/* 1F351 */,/*46678*/9414/* 1F352 */,/*46679*/9414/* 1F353 */, /*46680*/9414/* 1F354 */,/*46681*/9414/* 1F355 */,/*46682*/9414/* 1F356 */,/*46683*/9414/* 1F357 */, /*46684*/9414/* 1F358 */,/*46685*/9414/* 1F359 */,/*46686*/9414/* 1F35A */,/*46687*/9414/* 1F35B */, /*46688*/9414/* 1F35C */,/*46689*/9414/* 1F35D */,/*46690*/9414/* 1F35E */,/*46691*/9414/* 1F35F */, /*46692*/9414/* 1F360 */,/*46693*/9414/* 1F361 */,/*46694*/9414/* 1F362 */,/*46695*/9414/* 1F363 */, /*46696*/9414/* 1F364 */,/*46697*/9414/* 1F365 */,/*46698*/9414/* 1F366 */,/*46699*/9414/* 1F367 */, /*46700*/9414/* 1F368 */,/*46701*/9414/* 1F369 */,/*46702*/9414/* 1F36A */,/*46703*/9414/* 1F36B */, /*46704*/9414/* 1F36C */,/*46705*/9414/* 1F36D */,/*46706*/9414/* 1F36E */,/*46707*/9414/* 1F36F */, /*46708*/9414/* 1F370 */,/*46709*/9414/* 1F371 */,/*46710*/9414/* 1F372 */,/*46711*/9414/* 1F373 */, /*46712*/9414/* 1F374 */,/*46713*/9414/* 1F375 */,/*46714*/9414/* 1F376 */,/*46715*/9414/* 1F377 */, /*46716*/9414/* 1F378 */,/*46717*/9414/* 1F379 */,/*46718*/9414/* 1F37A */,/*46719*/9414/* 1F37B */, /*46720*/9414/* 1F37C */,/*46721*/9415/* 1F37D */,/*46722*/9416/* 1F37E */,/*46723*/9416/* 1F37F */, /*46724*/9414/* 1F380 */,/*46725*/9414/* 1F381 */,/*46726*/9414/* 1F382 */,/*46727*/9414/* 1F383 */, /*46728*/9414/* 1F384 */,/*46729*/9414/* 1F385 */,/*46730*/9414/* 1F386 */,/*46731*/9414/* 1F387 */, /*46732*/9414/* 1F388 */,/*46733*/9414/* 1F389 */,/*46734*/9414/* 1F38A */,/*46735*/9414/* 1F38B */, /*46736*/9414/* 1F38C */,/*46737*/9414/* 1F38D */,/*46738*/9414/* 1F38E */,/*46739*/9414/* 1F38F */, /*46740*/9414/* 1F390 */,/*46741*/9414/* 1F391 */,/*46742*/9414/* 1F392 */,/*46743*/9414/* 1F393 */, /*46744*/9415/* 1F394 */,/*46745*/9415/* 1F395 */,/*46746*/9415/* 1F396 */,/*46747*/9415/* 1F397 */, /*46748*/9415/* 1F398 */,/*46749*/9415/* 1F399 */,/*46750*/9415/* 1F39A */,/*46751*/9415/* 1F39B */, /*46752*/9415/* 1F39C */,/*46753*/9415/* 1F39D */,/*46754*/9415/* 1F39E */,/*46755*/9415/* 1F39F */, /*46756*/9414/* 1F3A0 */,/*46757*/9414/* 1F3A1 */,/*46758*/9414/* 1F3A2 */,/*46759*/9414/* 1F3A3 */, /*46760*/9414/* 1F3A4 */,/*46761*/9414/* 1F3A5 */,/*46762*/9414/* 1F3A6 */,/*46763*/9414/* 1F3A7 */, /*46764*/9414/* 1F3A8 */,/*46765*/9414/* 1F3A9 */,/*46766*/9414/* 1F3AA */,/*46767*/9414/* 1F3AB */, /*46768*/9414/* 1F3AC */,/*46769*/9414/* 1F3AD */,/*46770*/9414/* 1F3AE */,/*46771*/9414/* 1F3AF */, /*46772*/9414/* 1F3B0 */,/*46773*/9414/* 1F3B1 */,/*46774*/9414/* 1F3B2 */,/*46775*/9414/* 1F3B3 */, /*46776*/9414/* 1F3B4 */,/*46777*/9414/* 1F3B5 */,/*46778*/9414/* 1F3B6 */,/*46779*/9414/* 1F3B7 */, /*46780*/9414/* 1F3B8 */,/*46781*/9414/* 1F3B9 */,/*46782*/9414/* 1F3BA */,/*46783*/9414/* 1F3BB */, /*46784*/9414/* 1F3BC */,/*46785*/9414/* 1F3BD */,/*46786*/9414/* 1F3BE */,/*46787*/9414/* 1F3BF */, /*46788*/9414/* 1F3C0 */,/*46789*/9414/* 1F3C1 */,/*46790*/9414/* 1F3C2 */,/*46791*/9414/* 1F3C3 */, /*46792*/9414/* 1F3C4 */,/*46793*/9415/* 1F3C5 */,/*46794*/9414/* 1F3C6 */,/*46795*/9414/* 1F3C7 */, /*46796*/9414/* 1F3C8 */,/*46797*/9414/* 1F3C9 */,/*46798*/9414/* 1F3CA */,/*46799*/9415/* 1F3CB */, /*46800*/9415/* 1F3CC */,/*46801*/9415/* 1F3CD */,/*46802*/9415/* 1F3CE */,/*46803*/9416/* 1F3CF */, /*46804*/9416/* 1F3D0 */,/*46805*/9416/* 1F3D1 */,/*46806*/9416/* 1F3D2 */,/*46807*/9416/* 1F3D3 */, /*46808*/9415/* 1F3D4 */,/*46809*/9415/* 1F3D5 */,/*46810*/9415/* 1F3D6 */,/*46811*/9415/* 1F3D7 */, /*46812*/9415/* 1F3D8 */,/*46813*/9415/* 1F3D9 */,/*46814*/9415/* 1F3DA */,/*46815*/9415/* 1F3DB */, /*46816*/9415/* 1F3DC */,/*46817*/9415/* 1F3DD */,/*46818*/9415/* 1F3DE */,/*46819*/9415/* 1F3DF */, /*46820*/9414/* 1F3E0 */,/*46821*/9414/* 1F3E1 */,/*46822*/9414/* 1F3E2 */,/*46823*/9414/* 1F3E3 */, /*46824*/9414/* 1F3E4 */,/*46825*/9414/* 1F3E5 */,/*46826*/9414/* 1F3E6 */,/*46827*/9414/* 1F3E7 */, /*46828*/9414/* 1F3E8 */,/*46829*/9414/* 1F3E9 */,/*46830*/9414/* 1F3EA */,/*46831*/9414/* 1F3EB */, /*46832*/9414/* 1F3EC */,/*46833*/9414/* 1F3ED */,/*46834*/9414/* 1F3EE */,/*46835*/9414/* 1F3EF */, /*46836*/9414/* 1F3F0 */,/*46837*/9415/* 1F3F1 */,/*46838*/9415/* 1F3F2 */,/*46839*/9415/* 1F3F3 */, /*46840*/9415/* 1F3F4 */,/*46841*/9415/* 1F3F5 */,/*46842*/9415/* 1F3F6 */,/*46843*/9415/* 1F3F7 */, /*46844*/9416/* 1F3F8 */,/*46845*/9416/* 1F3F9 */,/*46846*/9416/* 1F3FA */,/*46847*/9417/* 1F3FB */, /*46848*/9417/* 1F3FC */,/*46849*/9417/* 1F3FD */,/*46850*/9417/* 1F3FE */,/*46851*/9417/* 1F3FF */, /*46852*/9414/* 1F400 */,/*46853*/9414/* 1F401 */,/*46854*/9414/* 1F402 */,/*46855*/9414/* 1F403 */, /*46856*/9414/* 1F404 */,/*46857*/9414/* 1F405 */,/*46858*/9414/* 1F406 */,/*46859*/9414/* 1F407 */, /*46860*/9414/* 1F408 */,/*46861*/9414/* 1F409 */,/*46862*/9414/* 1F40A */,/*46863*/9414/* 1F40B */, /*46864*/9414/* 1F40C */,/*46865*/9414/* 1F40D */,/*46866*/9414/* 1F40E */,/*46867*/9414/* 1F40F */, /*46868*/9414/* 1F410 */,/*46869*/9414/* 1F411 */,/*46870*/9414/* 1F412 */,/*46871*/9414/* 1F413 */, /*46872*/9414/* 1F414 */,/*46873*/9414/* 1F415 */,/*46874*/9414/* 1F416 */,/*46875*/9414/* 1F417 */, /*46876*/9414/* 1F418 */,/*46877*/9414/* 1F419 */,/*46878*/9414/* 1F41A */,/*46879*/9414/* 1F41B */, /*46880*/9414/* 1F41C */,/*46881*/9414/* 1F41D */,/*46882*/9414/* 1F41E */,/*46883*/9414/* 1F41F */, /*46884*/9414/* 1F420 */,/*46885*/9414/* 1F421 */,/*46886*/9414/* 1F422 */,/*46887*/9414/* 1F423 */, /*46888*/9414/* 1F424 */,/*46889*/9414/* 1F425 */,/*46890*/9414/* 1F426 */,/*46891*/9414/* 1F427 */, /*46892*/9414/* 1F428 */,/*46893*/9414/* 1F429 */,/*46894*/9414/* 1F42A */,/*46895*/9414/* 1F42B */, /*46896*/9414/* 1F42C */,/*46897*/9414/* 1F42D */,/*46898*/9414/* 1F42E */,/*46899*/9414/* 1F42F */, /*46900*/9414/* 1F430 */,/*46901*/9414/* 1F431 */,/*46902*/9414/* 1F432 */,/*46903*/9414/* 1F433 */, /*46904*/9414/* 1F434 */,/*46905*/9414/* 1F435 */,/*46906*/9414/* 1F436 */,/*46907*/9414/* 1F437 */, /*46908*/9414/* 1F438 */,/*46909*/9414/* 1F439 */,/*46910*/9414/* 1F43A */,/*46911*/9414/* 1F43B */, /*46912*/9414/* 1F43C */,/*46913*/9414/* 1F43D */,/*46914*/9414/* 1F43E */,/*46915*/9415/* 1F43F */, /*46916*/9414/* 1F440 */,/*46917*/9415/* 1F441 */,/*46918*/9414/* 1F442 */,/*46919*/9414/* 1F443 */, /*46920*/9414/* 1F444 */,/*46921*/9414/* 1F445 */,/*46922*/9414/* 1F446 */,/*46923*/9414/* 1F447 */, /*46924*/9414/* 1F448 */,/*46925*/9414/* 1F449 */,/*46926*/9414/* 1F44A */,/*46927*/9414/* 1F44B */, /*46928*/9414/* 1F44C */,/*46929*/9414/* 1F44D */,/*46930*/9414/* 1F44E */,/*46931*/9414/* 1F44F */, /*46932*/9414/* 1F450 */,/*46933*/9414/* 1F451 */,/*46934*/9414/* 1F452 */,/*46935*/9414/* 1F453 */, /*46936*/9414/* 1F454 */,/*46937*/9414/* 1F455 */,/*46938*/9414/* 1F456 */,/*46939*/9414/* 1F457 */, /*46940*/9414/* 1F458 */,/*46941*/9414/* 1F459 */,/*46942*/9414/* 1F45A */,/*46943*/9414/* 1F45B */, /*46944*/9414/* 1F45C */,/*46945*/9414/* 1F45D */,/*46946*/9414/* 1F45E */,/*46947*/9414/* 1F45F */, /*46948*/9414/* 1F460 */,/*46949*/9414/* 1F461 */,/*46950*/9414/* 1F462 */,/*46951*/9414/* 1F463 */, /*46952*/9414/* 1F464 */,/*46953*/9414/* 1F465 */,/*46954*/9414/* 1F466 */,/*46955*/9414/* 1F467 */, /*46956*/9414/* 1F468 */,/*46957*/9414/* 1F469 */,/*46958*/9414/* 1F46A */,/*46959*/9414/* 1F46B */, /*46960*/9414/* 1F46C */,/*46961*/9414/* 1F46D */,/*46962*/9414/* 1F46E */,/*46963*/9414/* 1F46F */, /*46964*/9414/* 1F470 */,/*46965*/9414/* 1F471 */,/*46966*/9414/* 1F472 */,/*46967*/9414/* 1F473 */, /*46968*/9414/* 1F474 */,/*46969*/9414/* 1F475 */,/*46970*/9414/* 1F476 */,/*46971*/9414/* 1F477 */, /*46972*/9414/* 1F478 */,/*46973*/9414/* 1F479 */,/*46974*/9414/* 1F47A */,/*46975*/9414/* 1F47B */, /*46976*/9414/* 1F47C */,/*46977*/9414/* 1F47D */,/*46978*/9414/* 1F47E */,/*46979*/9414/* 1F47F */, /*46980*/9414/* 1F480 */,/*46981*/9414/* 1F481 */,/*46982*/9414/* 1F482 */,/*46983*/9414/* 1F483 */, /*46984*/9414/* 1F484 */,/*46985*/9414/* 1F485 */,/*46986*/9414/* 1F486 */,/*46987*/9414/* 1F487 */, /*46988*/9414/* 1F488 */,/*46989*/9414/* 1F489 */,/*46990*/9414/* 1F48A */,/*46991*/9414/* 1F48B */, /*46992*/9414/* 1F48C */,/*46993*/9414/* 1F48D */,/*46994*/9414/* 1F48E */,/*46995*/9414/* 1F48F */, /*46996*/9414/* 1F490 */,/*46997*/9414/* 1F491 */,/*46998*/9414/* 1F492 */,/*46999*/9414/* 1F493 */, /*47000*/9414/* 1F494 */,/*47001*/9414/* 1F495 */,/*47002*/9414/* 1F496 */,/*47003*/9414/* 1F497 */, /*47004*/9414/* 1F498 */,/*47005*/9414/* 1F499 */,/*47006*/9414/* 1F49A */,/*47007*/9414/* 1F49B */, /*47008*/9414/* 1F49C */,/*47009*/9414/* 1F49D */,/*47010*/9414/* 1F49E */,/*47011*/9414/* 1F49F */, /*47012*/9414/* 1F4A0 */,/*47013*/9414/* 1F4A1 */,/*47014*/9414/* 1F4A2 */,/*47015*/9414/* 1F4A3 */, /*47016*/9414/* 1F4A4 */,/*47017*/9414/* 1F4A5 */,/*47018*/9414/* 1F4A6 */,/*47019*/9414/* 1F4A7 */, /*47020*/9414/* 1F4A8 */,/*47021*/9414/* 1F4A9 */,/*47022*/9414/* 1F4AA */,/*47023*/9414/* 1F4AB */, /*47024*/9414/* 1F4AC */,/*47025*/9414/* 1F4AD */,/*47026*/9414/* 1F4AE */,/*47027*/9414/* 1F4AF */, /*47028*/9414/* 1F4B0 */,/*47029*/9414/* 1F4B1 */,/*47030*/9414/* 1F4B2 */,/*47031*/9414/* 1F4B3 */, /*47032*/9414/* 1F4B4 */,/*47033*/9414/* 1F4B5 */,/*47034*/9414/* 1F4B6 */,/*47035*/9414/* 1F4B7 */, /*47036*/9414/* 1F4B8 */,/*47037*/9414/* 1F4B9 */,/*47038*/9414/* 1F4BA */,/*47039*/9414/* 1F4BB */, /*47040*/9414/* 1F4BC */,/*47041*/9414/* 1F4BD */,/*47042*/9414/* 1F4BE */,/*47043*/9414/* 1F4BF */, /*47044*/9414/* 1F4C0 */,/*47045*/9414/* 1F4C1 */,/*47046*/9414/* 1F4C2 */,/*47047*/9414/* 1F4C3 */, /*47048*/9414/* 1F4C4 */,/*47049*/9414/* 1F4C5 */,/*47050*/9414/* 1F4C6 */,/*47051*/9414/* 1F4C7 */, /*47052*/9414/* 1F4C8 */,/*47053*/9414/* 1F4C9 */,/*47054*/9414/* 1F4CA */,/*47055*/9414/* 1F4CB */, /*47056*/9414/* 1F4CC */,/*47057*/9414/* 1F4CD */,/*47058*/9414/* 1F4CE */,/*47059*/9414/* 1F4CF */, /*47060*/9414/* 1F4D0 */,/*47061*/9414/* 1F4D1 */,/*47062*/9414/* 1F4D2 */,/*47063*/9414/* 1F4D3 */, /*47064*/9414/* 1F4D4 */,/*47065*/9414/* 1F4D5 */,/*47066*/9414/* 1F4D6 */,/*47067*/9414/* 1F4D7 */, /*47068*/9414/* 1F4D8 */,/*47069*/9414/* 1F4D9 */,/*47070*/9414/* 1F4DA */,/*47071*/9414/* 1F4DB */, /*47072*/9414/* 1F4DC */,/*47073*/9414/* 1F4DD */,/*47074*/9414/* 1F4DE */,/*47075*/9414/* 1F4DF */, /*47076*/9414/* 1F4E0 */,/*47077*/9414/* 1F4E1 */,/*47078*/9414/* 1F4E2 */,/*47079*/9414/* 1F4E3 */, /*47080*/9414/* 1F4E4 */,/*47081*/9414/* 1F4E5 */,/*47082*/9414/* 1F4E6 */,/*47083*/9414/* 1F4E7 */, /*47084*/9414/* 1F4E8 */,/*47085*/9414/* 1F4E9 */,/*47086*/9414/* 1F4EA */,/*47087*/9414/* 1F4EB */, /*47088*/9414/* 1F4EC */,/*47089*/9414/* 1F4ED */,/*47090*/9414/* 1F4EE */,/*47091*/9414/* 1F4EF */, /*47092*/9414/* 1F4F0 */,/*47093*/9414/* 1F4F1 */,/*47094*/9414/* 1F4F2 */,/*47095*/9414/* 1F4F3 */, /*47096*/9414/* 1F4F4 */,/*47097*/9414/* 1F4F5 */,/*47098*/9414/* 1F4F6 */,/*47099*/9414/* 1F4F7 */, /*47100*/9415/* 1F4F8 */,/*47101*/9414/* 1F4F9 */,/*47102*/9414/* 1F4FA */,/*47103*/9414/* 1F4FB */, /*47104*/9414/* 1F4FC */,/*47105*/9415/* 1F4FD */,/*47106*/9415/* 1F4FE */,/*47107*/9416/* 1F4FF */, /*47108*/9414/* 1F500 */,/*47109*/9414/* 1F501 */,/*47110*/9414/* 1F502 */,/*47111*/9414/* 1F503 */, /*47112*/9414/* 1F504 */,/*47113*/9414/* 1F505 */,/*47114*/9414/* 1F506 */,/*47115*/9414/* 1F507 */, /*47116*/9414/* 1F508 */,/*47117*/9414/* 1F509 */,/*47118*/9414/* 1F50A */,/*47119*/9414/* 1F50B */, /*47120*/9414/* 1F50C */,/*47121*/9414/* 1F50D */,/*47122*/9414/* 1F50E */,/*47123*/9414/* 1F50F */, /*47124*/9414/* 1F510 */,/*47125*/9414/* 1F511 */,/*47126*/9414/* 1F512 */,/*47127*/9414/* 1F513 */, /*47128*/9414/* 1F514 */,/*47129*/9414/* 1F515 */,/*47130*/9414/* 1F516 */,/*47131*/9414/* 1F517 */, /*47132*/9414/* 1F518 */,/*47133*/9414/* 1F519 */,/*47134*/9414/* 1F51A */,/*47135*/9414/* 1F51B */, /*47136*/9414/* 1F51C */,/*47137*/9414/* 1F51D */,/*47138*/9414/* 1F51E */,/*47139*/9414/* 1F51F */, /*47140*/9414/* 1F520 */,/*47141*/9414/* 1F521 */,/*47142*/9414/* 1F522 */,/*47143*/9414/* 1F523 */, /*47144*/9414/* 1F524 */,/*47145*/9414/* 1F525 */,/*47146*/9414/* 1F526 */,/*47147*/9414/* 1F527 */, /*47148*/9414/* 1F528 */,/*47149*/9414/* 1F529 */,/*47150*/9414/* 1F52A */,/*47151*/9414/* 1F52B */, /*47152*/9414/* 1F52C */,/*47153*/9414/* 1F52D */,/*47154*/9414/* 1F52E */,/*47155*/9414/* 1F52F */, /*47156*/9414/* 1F530 */,/*47157*/9414/* 1F531 */,/*47158*/9414/* 1F532 */,/*47159*/9414/* 1F533 */, /*47160*/9414/* 1F534 */,/*47161*/9414/* 1F535 */,/*47162*/9414/* 1F536 */,/*47163*/9414/* 1F537 */, /*47164*/9414/* 1F538 */,/*47165*/9414/* 1F539 */,/*47166*/9414/* 1F53A */,/*47167*/9414/* 1F53B */, /*47168*/9414/* 1F53C */,/*47169*/9414/* 1F53D */,/*47170*/9415/* 1F53E */,/*47171*/9415/* 1F53F */, /*47172*/9418/* 1F540 */,/*47173*/9418/* 1F541 */,/*47174*/9418/* 1F542 */,/*47175*/9418/* 1F543 */, /*47176*/9415/* 1F544 */,/*47177*/9415/* 1F545 */,/*47178*/9415/* 1F546 */,/*47179*/9415/* 1F547 */, /*47180*/9415/* 1F548 */,/*47181*/9415/* 1F549 */,/*47182*/9415/* 1F54A */,/*47183*/9416/* 1F54B */, /*47184*/9416/* 1F54C */,/*47185*/9416/* 1F54D */,/*47186*/9416/* 1F54E */,/*47187*/9416/* 1F54F */, /*47188*/9414/* 1F550 */,/*47189*/9414/* 1F551 */,/*47190*/9414/* 1F552 */,/*47191*/9414/* 1F553 */, /*47192*/9414/* 1F554 */,/*47193*/9414/* 1F555 */,/*47194*/9414/* 1F556 */,/*47195*/9414/* 1F557 */, /*47196*/9414/* 1F558 */,/*47197*/9414/* 1F559 */,/*47198*/9414/* 1F55A */,/*47199*/9414/* 1F55B */, /*47200*/9414/* 1F55C */,/*47201*/9414/* 1F55D */,/*47202*/9414/* 1F55E */,/*47203*/9414/* 1F55F */, /*47204*/9414/* 1F560 */,/*47205*/9414/* 1F561 */,/*47206*/9414/* 1F562 */,/*47207*/9414/* 1F563 */, /*47208*/9414/* 1F564 */,/*47209*/9414/* 1F565 */,/*47210*/9414/* 1F566 */,/*47211*/9414/* 1F567 */, /*47212*/9415/* 1F568 */,/*47213*/9415/* 1F569 */,/*47214*/9415/* 1F56A */,/*47215*/9415/* 1F56B */, /*47216*/9415/* 1F56C */,/*47217*/9415/* 1F56D */,/*47218*/9415/* 1F56E */,/*47219*/9415/* 1F56F */, /*47220*/9415/* 1F570 */,/*47221*/9415/* 1F571 */,/*47222*/9415/* 1F572 */,/*47223*/9415/* 1F573 */, /*47224*/9415/* 1F574 */,/*47225*/9415/* 1F575 */,/*47226*/9415/* 1F576 */,/*47227*/9415/* 1F577 */, /*47228*/9415/* 1F578 */,/*47229*/9415/* 1F579 */,0,/*47231*/9415/* 1F57B */,/*47232*/9415/* 1F57C */, /*47233*/9415/* 1F57D */,/*47234*/9415/* 1F57E */,/*47235*/9415/* 1F57F */,/*47236*/9415/* 1F580 */, /*47237*/9415/* 1F581 */,/*47238*/9415/* 1F582 */,/*47239*/9415/* 1F583 */,/*47240*/9415/* 1F584 */, /*47241*/9415/* 1F585 */,/*47242*/9415/* 1F586 */,/*47243*/9415/* 1F587 */,/*47244*/9415/* 1F588 */, /*47245*/9415/* 1F589 */,/*47246*/9415/* 1F58A */,/*47247*/9415/* 1F58B */,/*47248*/9415/* 1F58C */, /*47249*/9415/* 1F58D */,/*47250*/9415/* 1F58E */,/*47251*/9415/* 1F58F */,/*47252*/9415/* 1F590 */, /*47253*/9415/* 1F591 */,/*47254*/9415/* 1F592 */,/*47255*/9415/* 1F593 */,/*47256*/9415/* 1F594 */, /*47257*/9415/* 1F595 */,/*47258*/9415/* 1F596 */,/*47259*/9415/* 1F597 */,/*47260*/9415/* 1F598 */, /*47261*/9415/* 1F599 */,/*47262*/9415/* 1F59A */,/*47263*/9415/* 1F59B */,/*47264*/9415/* 1F59C */, /*47265*/9415/* 1F59D */,/*47266*/9415/* 1F59E */,/*47267*/9415/* 1F59F */,/*47268*/9415/* 1F5A0 */, /*47269*/9415/* 1F5A1 */,/*47270*/9415/* 1F5A2 */,/*47271*/9415/* 1F5A3 */,0,/*47273*/9415/* 1F5A5 */, /*47274*/9415/* 1F5A6 */,/*47275*/9415/* 1F5A7 */,/*47276*/9415/* 1F5A8 */,/*47277*/9415/* 1F5A9 */, /*47278*/9415/* 1F5AA */,/*47279*/9415/* 1F5AB */,/*47280*/9415/* 1F5AC */,/*47281*/9415/* 1F5AD */, /*47282*/9415/* 1F5AE */,/*47283*/9415/* 1F5AF */,/*47284*/9415/* 1F5B0 */,/*47285*/9415/* 1F5B1 */, /*47286*/9415/* 1F5B2 */,/*47287*/9415/* 1F5B3 */,/*47288*/9415/* 1F5B4 */,/*47289*/9415/* 1F5B5 */, /*47290*/9415/* 1F5B6 */,/*47291*/9415/* 1F5B7 */,/*47292*/9415/* 1F5B8 */,/*47293*/9415/* 1F5B9 */, /*47294*/9415/* 1F5BA */,/*47295*/9415/* 1F5BB */,/*47296*/9415/* 1F5BC */,/*47297*/9415/* 1F5BD */, /*47298*/9415/* 1F5BE */,/*47299*/9415/* 1F5BF */,/*47300*/9415/* 1F5C0 */,/*47301*/9415/* 1F5C1 */, /*47302*/9415/* 1F5C2 */,/*47303*/9415/* 1F5C3 */,/*47304*/9415/* 1F5C4 */,/*47305*/9415/* 1F5C5 */, /*47306*/9415/* 1F5C6 */,/*47307*/9415/* 1F5C7 */,/*47308*/9415/* 1F5C8 */,/*47309*/9415/* 1F5C9 */, /*47310*/9415/* 1F5CA */,/*47311*/9415/* 1F5CB */,/*47312*/9415/* 1F5CC */,/*47313*/9415/* 1F5CD */, /*47314*/9415/* 1F5CE */,/*47315*/9415/* 1F5CF */,/*47316*/9415/* 1F5D0 */,/*47317*/9415/* 1F5D1 */, /*47318*/9415/* 1F5D2 */,/*47319*/9415/* 1F5D3 */,/*47320*/9415/* 1F5D4 */,/*47321*/9415/* 1F5D5 */, /*47322*/9415/* 1F5D6 */,/*47323*/9415/* 1F5D7 */,/*47324*/9415/* 1F5D8 */,/*47325*/9415/* 1F5D9 */, /*47326*/9415/* 1F5DA */,/*47327*/9415/* 1F5DB */,/*47328*/9415/* 1F5DC */,/*47329*/9415/* 1F5DD */, /*47330*/9415/* 1F5DE */,/*47331*/9415/* 1F5DF */,/*47332*/9415/* 1F5E0 */,/*47333*/9415/* 1F5E1 */, /*47334*/9415/* 1F5E2 */,/*47335*/9415/* 1F5E3 */,/*47336*/9415/* 1F5E4 */,/*47337*/9415/* 1F5E5 */, /*47338*/9415/* 1F5E6 */,/*47339*/9415/* 1F5E7 */,/*47340*/9415/* 1F5E8 */,/*47341*/9415/* 1F5E9 */, /*47342*/9415/* 1F5EA */,/*47343*/9415/* 1F5EB */,/*47344*/9415/* 1F5EC */,/*47345*/9415/* 1F5ED */, /*47346*/9415/* 1F5EE */,/*47347*/9415/* 1F5EF */,/*47348*/9415/* 1F5F0 */,/*47349*/9415/* 1F5F1 */, /*47350*/9415/* 1F5F2 */,/*47351*/9415/* 1F5F3 */,/*47352*/9415/* 1F5F4 */,/*47353*/9415/* 1F5F5 */, /*47354*/9415/* 1F5F6 */,/*47355*/9415/* 1F5F7 */,/*47356*/9415/* 1F5F8 */,/*47357*/9415/* 1F5F9 */, /*47358*/9415/* 1F5FA */,/*47359*/9414/* 1F5FB */,/*47360*/9414/* 1F5FC */,/*47361*/9414/* 1F5FD */, /*47362*/9414/* 1F5FE */,/*47363*/9414/* 1F5FF */,/*47364*/9419/* 1F600 */,/*47365*/9420/* 1F601 */, /*47366*/9420/* 1F602 */,/*47367*/9420/* 1F603 */,/*47368*/9420/* 1F604 */,/*47369*/9420/* 1F605 */, /*47370*/9420/* 1F606 */,/*47371*/9420/* 1F607 */,/*47372*/9420/* 1F608 */,/*47373*/9420/* 1F609 */, /*47374*/9420/* 1F60A */,/*47375*/9420/* 1F60B */,/*47376*/9420/* 1F60C */,/*47377*/9420/* 1F60D */, /*47378*/9420/* 1F60E */,/*47379*/9420/* 1F60F */,/*47380*/9420/* 1F610 */,/*47381*/9419/* 1F611 */, /*47382*/9420/* 1F612 */,/*47383*/9420/* 1F613 */,/*47384*/9420/* 1F614 */,/*47385*/9419/* 1F615 */, /*47386*/9420/* 1F616 */,/*47387*/9419/* 1F617 */,/*47388*/9420/* 1F618 */,/*47389*/9419/* 1F619 */, /*47390*/9420/* 1F61A */,/*47391*/9419/* 1F61B */,/*47392*/9420/* 1F61C */,/*47393*/9420/* 1F61D */, /*47394*/9420/* 1F61E */,/*47395*/9419/* 1F61F */,/*47396*/9420/* 1F620 */,/*47397*/9420/* 1F621 */, /*47398*/9420/* 1F622 */,/*47399*/9420/* 1F623 */,/*47400*/9420/* 1F624 */,/*47401*/9420/* 1F625 */, /*47402*/9419/* 1F626 */,/*47403*/9419/* 1F627 */,/*47404*/9420/* 1F628 */,/*47405*/9420/* 1F629 */, /*47406*/9420/* 1F62A */,/*47407*/9420/* 1F62B */,/*47408*/9419/* 1F62C */,/*47409*/9420/* 1F62D */, /*47410*/9419/* 1F62E */,/*47411*/9419/* 1F62F */,/*47412*/9420/* 1F630 */,/*47413*/9420/* 1F631 */, /*47414*/9420/* 1F632 */,/*47415*/9420/* 1F633 */,/*47416*/9419/* 1F634 */,/*47417*/9420/* 1F635 */, /*47418*/9420/* 1F636 */,/*47419*/9420/* 1F637 */,/*47420*/9420/* 1F638 */,/*47421*/9420/* 1F639 */, /*47422*/9420/* 1F63A */,/*47423*/9420/* 1F63B */,/*47424*/9420/* 1F63C */,/*47425*/9420/* 1F63D */, /*47426*/9420/* 1F63E */,/*47427*/9420/* 1F63F */,/*47428*/9420/* 1F640 */,/*47429*/9421/* 1F641 */, /*47430*/9421/* 1F642 */,/*47431*/9422/* 1F643 */,/*47432*/9422/* 1F644 */,/*47433*/9420/* 1F645 */, /*47434*/9420/* 1F646 */,/*47435*/9420/* 1F647 */,/*47436*/9420/* 1F648 */,/*47437*/9420/* 1F649 */, /*47438*/9420/* 1F64A */,/*47439*/9420/* 1F64B */,/*47440*/9420/* 1F64C */,/*47441*/9420/* 1F64D */, /*47442*/9420/* 1F64E */,/*47443*/9420/* 1F64F */,/*47444*/9423/* 1F650 */,/*47445*/9423/* 1F651 */, /*47446*/9423/* 1F652 */,/*47447*/9423/* 1F653 */,/*47448*/9423/* 1F654 */,/*47449*/9423/* 1F655 */, /*47450*/9423/* 1F656 */,/*47451*/9423/* 1F657 */,/*47452*/9423/* 1F658 */,/*47453*/9423/* 1F659 */, /*47454*/9423/* 1F65A */,/*47455*/9423/* 1F65B */,/*47456*/9423/* 1F65C */,/*47457*/9423/* 1F65D */, /*47458*/9423/* 1F65E */,/*47459*/9423/* 1F65F */,/*47460*/9423/* 1F660 */,/*47461*/9423/* 1F661 */, /*47462*/9423/* 1F662 */,/*47463*/9423/* 1F663 */,/*47464*/9423/* 1F664 */,/*47465*/9423/* 1F665 */, /*47466*/9423/* 1F666 */,/*47467*/9423/* 1F667 */,/*47468*/9423/* 1F668 */,/*47469*/9423/* 1F669 */, /*47470*/9423/* 1F66A */,/*47471*/9423/* 1F66B */,/*47472*/9423/* 1F66C */,/*47473*/9423/* 1F66D */, /*47474*/9423/* 1F66E */,/*47475*/9423/* 1F66F */,/*47476*/9423/* 1F670 */,/*47477*/9423/* 1F671 */, /*47478*/9423/* 1F672 */,/*47479*/9423/* 1F673 */,/*47480*/9423/* 1F674 */,/*47481*/9423/* 1F675 */, /*47482*/9424/* 1F676 */,/*47483*/9424/* 1F677 */,/*47484*/9424/* 1F678 */,/*47485*/9423/* 1F679 */, /*47486*/9423/* 1F67A */,/*47487*/9423/* 1F67B */,/*47488*/9423/* 1F67C */,/*47489*/9423/* 1F67D */, /*47490*/9423/* 1F67E */,/*47491*/9423/* 1F67F */,/*47492*/9425/* 1F680 */,/*47493*/9425/* 1F681 */, /*47494*/9425/* 1F682 */,/*47495*/9425/* 1F683 */,/*47496*/9425/* 1F684 */,/*47497*/9425/* 1F685 */, /*47498*/9425/* 1F686 */,/*47499*/9425/* 1F687 */,/*47500*/9425/* 1F688 */,/*47501*/9425/* 1F689 */, /*47502*/9425/* 1F68A */,/*47503*/9425/* 1F68B */,/*47504*/9425/* 1F68C */,/*47505*/9425/* 1F68D */, /*47506*/9425/* 1F68E */,/*47507*/9425/* 1F68F */,/*47508*/9425/* 1F690 */,/*47509*/9425/* 1F691 */, /*47510*/9425/* 1F692 */,/*47511*/9425/* 1F693 */,/*47512*/9425/* 1F694 */,/*47513*/9425/* 1F695 */, /*47514*/9425/* 1F696 */,/*47515*/9425/* 1F697 */,/*47516*/9425/* 1F698 */,/*47517*/9425/* 1F699 */, /*47518*/9425/* 1F69A */,/*47519*/9425/* 1F69B */,/*47520*/9425/* 1F69C */,/*47521*/9425/* 1F69D */, /*47522*/9425/* 1F69E */,/*47523*/9425/* 1F69F */,/*47524*/9425/* 1F6A0 */,/*47525*/9425/* 1F6A1 */, /*47526*/9425/* 1F6A2 */,/*47527*/9425/* 1F6A3 */,/*47528*/9425/* 1F6A4 */,/*47529*/9425/* 1F6A5 */, /*47530*/9425/* 1F6A6 */,/*47531*/9425/* 1F6A7 */,/*47532*/9425/* 1F6A8 */,/*47533*/9425/* 1F6A9 */, /*47534*/9425/* 1F6AA */,/*47535*/9425/* 1F6AB */,/*47536*/9425/* 1F6AC */,/*47537*/9425/* 1F6AD */, /*47538*/9425/* 1F6AE */,/*47539*/9425/* 1F6AF */,/*47540*/9425/* 1F6B0 */,/*47541*/9425/* 1F6B1 */, /*47542*/9425/* 1F6B2 */,/*47543*/9425/* 1F6B3 */,/*47544*/9425/* 1F6B4 */,/*47545*/9425/* 1F6B5 */, /*47546*/9425/* 1F6B6 */,/*47547*/9425/* 1F6B7 */,/*47548*/9425/* 1F6B8 */,/*47549*/9425/* 1F6B9 */, /*47550*/9425/* 1F6BA */,/*47551*/9425/* 1F6BB */,/*47552*/9425/* 1F6BC */,/*47553*/9425/* 1F6BD */, /*47554*/9425/* 1F6BE */,/*47555*/9425/* 1F6BF */,/*47556*/9425/* 1F6C0 */,/*47557*/9425/* 1F6C1 */, /*47558*/9425/* 1F6C2 */,/*47559*/9425/* 1F6C3 */,/*47560*/9425/* 1F6C4 */,/*47561*/9425/* 1F6C5 */, /*47562*/9426/* 1F6C6 */,/*47563*/9426/* 1F6C7 */,/*47564*/9426/* 1F6C8 */,/*47565*/9426/* 1F6C9 */, /*47566*/9426/* 1F6CA */,/*47567*/9426/* 1F6CB */,/*47568*/9426/* 1F6CC */,/*47569*/9426/* 1F6CD */, /*47570*/9426/* 1F6CE */,/*47571*/9426/* 1F6CF */,/*47572*/9427/* 1F6D0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*47588*/9426/* 1F6E0 */,/*47589*/9426/* 1F6E1 */,/*47590*/9426/* 1F6E2 */,/*47591*/9426/* 1F6E3 */, /*47592*/9426/* 1F6E4 */,/*47593*/9426/* 1F6E5 */,/*47594*/9426/* 1F6E6 */,/*47595*/9426/* 1F6E7 */, /*47596*/9426/* 1F6E8 */,/*47597*/9426/* 1F6E9 */,/*47598*/9426/* 1F6EA */,/*47599*/9426/* 1F6EB */, /*47600*/9426/* 1F6EC */,0,0,0,/*47604*/9426/* 1F6F0 */,/*47605*/9426/* 1F6F1 */,/*47606*/9426/* 1F6F2 */, /*47607*/9426/* 1F6F3 */,0,0,0,0,0,0,0,0,0,0,0,0,/*47620*/9428/* 1F700 */,/*47621*/9428/* 1F701 */, /*47622*/9428/* 1F702 */,/*47623*/9428/* 1F703 */,/*47624*/9428/* 1F704 */,/*47625*/9428/* 1F705 */, /*47626*/9428/* 1F706 */,/*47627*/9428/* 1F707 */,/*47628*/9428/* 1F708 */,/*47629*/9428/* 1F709 */, /*47630*/9428/* 1F70A */,/*47631*/9428/* 1F70B */,/*47632*/9428/* 1F70C */,/*47633*/9428/* 1F70D */, /*47634*/9428/* 1F70E */,/*47635*/9428/* 1F70F */,/*47636*/9428/* 1F710 */,/*47637*/9428/* 1F711 */, /*47638*/9428/* 1F712 */,/*47639*/9428/* 1F713 */,/*47640*/9428/* 1F714 */,/*47641*/9428/* 1F715 */, /*47642*/9428/* 1F716 */,/*47643*/9428/* 1F717 */,/*47644*/9428/* 1F718 */,/*47645*/9428/* 1F719 */, /*47646*/9428/* 1F71A */,/*47647*/9428/* 1F71B */,/*47648*/9428/* 1F71C */,/*47649*/9428/* 1F71D */, /*47650*/9428/* 1F71E */,/*47651*/9428/* 1F71F */,/*47652*/9428/* 1F720 */,/*47653*/9428/* 1F721 */, /*47654*/9428/* 1F722 */,/*47655*/9428/* 1F723 */,/*47656*/9428/* 1F724 */,/*47657*/9428/* 1F725 */, /*47658*/9428/* 1F726 */,/*47659*/9428/* 1F727 */,/*47660*/9428/* 1F728 */,/*47661*/9428/* 1F729 */, /*47662*/9428/* 1F72A */,/*47663*/9428/* 1F72B */,/*47664*/9428/* 1F72C */,/*47665*/9428/* 1F72D */, /*47666*/9428/* 1F72E */,/*47667*/9428/* 1F72F */,/*47668*/9428/* 1F730 */,/*47669*/9428/* 1F731 */, /*47670*/9428/* 1F732 */,/*47671*/9428/* 1F733 */,/*47672*/9428/* 1F734 */,/*47673*/9428/* 1F735 */, /*47674*/9428/* 1F736 */,/*47675*/9428/* 1F737 */,/*47676*/9428/* 1F738 */,/*47677*/9428/* 1F739 */, /*47678*/9428/* 1F73A */,/*47679*/9428/* 1F73B */,/*47680*/9428/* 1F73C */,/*47681*/9428/* 1F73D */, /*47682*/9428/* 1F73E */,/*47683*/9428/* 1F73F */,/*47684*/9428/* 1F740 */,/*47685*/9428/* 1F741 */, /*47686*/9428/* 1F742 */,/*47687*/9428/* 1F743 */,/*47688*/9428/* 1F744 */,/*47689*/9428/* 1F745 */, /*47690*/9428/* 1F746 */,/*47691*/9428/* 1F747 */,/*47692*/9428/* 1F748 */,/*47693*/9428/* 1F749 */, /*47694*/9428/* 1F74A */,/*47695*/9428/* 1F74B */,/*47696*/9428/* 1F74C */,/*47697*/9428/* 1F74D */, /*47698*/9428/* 1F74E */,/*47699*/9428/* 1F74F */,/*47700*/9428/* 1F750 */,/*47701*/9428/* 1F751 */, /*47702*/9428/* 1F752 */,/*47703*/9428/* 1F753 */,/*47704*/9428/* 1F754 */,/*47705*/9428/* 1F755 */, /*47706*/9428/* 1F756 */,/*47707*/9428/* 1F757 */,/*47708*/9428/* 1F758 */,/*47709*/9428/* 1F759 */, /*47710*/9428/* 1F75A */,/*47711*/9428/* 1F75B */,/*47712*/9428/* 1F75C */,/*47713*/9428/* 1F75D */, /*47714*/9428/* 1F75E */,/*47715*/9428/* 1F75F */,/*47716*/9428/* 1F760 */,/*47717*/9428/* 1F761 */, /*47718*/9428/* 1F762 */,/*47719*/9428/* 1F763 */,/*47720*/9428/* 1F764 */,/*47721*/9428/* 1F765 */, /*47722*/9428/* 1F766 */,/*47723*/9428/* 1F767 */,/*47724*/9428/* 1F768 */,/*47725*/9428/* 1F769 */, /*47726*/9428/* 1F76A */,/*47727*/9428/* 1F76B */,/*47728*/9428/* 1F76C */,/*47729*/9428/* 1F76D */, /*47730*/9428/* 1F76E */,/*47731*/9428/* 1F76F */,/*47732*/9428/* 1F770 */,/*47733*/9428/* 1F771 */, /*47734*/9428/* 1F772 */,/*47735*/9428/* 1F773 */,0,0,0,0,0,0,0,0,0,0,0,0,/*47748*/9429/* 1F780 */, /*47749*/9429/* 1F781 */,/*47750*/9429/* 1F782 */,/*47751*/9429/* 1F783 */,/*47752*/9429/* 1F784 */, /*47753*/9429/* 1F785 */,/*47754*/9429/* 1F786 */,/*47755*/9429/* 1F787 */,/*47756*/9429/* 1F788 */, /*47757*/9429/* 1F789 */,/*47758*/9429/* 1F78A */,/*47759*/9429/* 1F78B */,/*47760*/9429/* 1F78C */, /*47761*/9429/* 1F78D */,/*47762*/9429/* 1F78E */,/*47763*/9429/* 1F78F */,/*47764*/9429/* 1F790 */, /*47765*/9429/* 1F791 */,/*47766*/9429/* 1F792 */,/*47767*/9429/* 1F793 */,/*47768*/9429/* 1F794 */, /*47769*/9429/* 1F795 */,/*47770*/9429/* 1F796 */,/*47771*/9429/* 1F797 */,/*47772*/9429/* 1F798 */, /*47773*/9429/* 1F799 */,/*47774*/9429/* 1F79A */,/*47775*/9429/* 1F79B */,/*47776*/9429/* 1F79C */, /*47777*/9429/* 1F79D */,/*47778*/9429/* 1F79E */,/*47779*/9429/* 1F79F */,/*47780*/9429/* 1F7A0 */, /*47781*/9429/* 1F7A1 */,/*47782*/9429/* 1F7A2 */,/*47783*/9429/* 1F7A3 */,/*47784*/9429/* 1F7A4 */, /*47785*/9429/* 1F7A5 */,/*47786*/9429/* 1F7A6 */,/*47787*/9429/* 1F7A7 */,/*47788*/9429/* 1F7A8 */, /*47789*/9429/* 1F7A9 */,/*47790*/9429/* 1F7AA */,/*47791*/9429/* 1F7AB */,/*47792*/9429/* 1F7AC */, /*47793*/9429/* 1F7AD */,/*47794*/9429/* 1F7AE */,/*47795*/9429/* 1F7AF */,/*47796*/9429/* 1F7B0 */, /*47797*/9429/* 1F7B1 */,/*47798*/9429/* 1F7B2 */,/*47799*/9429/* 1F7B3 */,/*47800*/9429/* 1F7B4 */, /*47801*/9429/* 1F7B5 */,/*47802*/9429/* 1F7B6 */,/*47803*/9429/* 1F7B7 */,/*47804*/9429/* 1F7B8 */, /*47805*/9429/* 1F7B9 */,/*47806*/9429/* 1F7BA */,/*47807*/9429/* 1F7BB */,/*47808*/9429/* 1F7BC */, /*47809*/9429/* 1F7BD */,/*47810*/9429/* 1F7BE */,/*47811*/9429/* 1F7BF */,/*47812*/9429/* 1F7C0 */, /*47813*/9429/* 1F7C1 */,/*47814*/9429/* 1F7C2 */,/*47815*/9429/* 1F7C3 */,/*47816*/9429/* 1F7C4 */, /*47817*/9429/* 1F7C5 */,/*47818*/9429/* 1F7C6 */,/*47819*/9429/* 1F7C7 */,/*47820*/9429/* 1F7C8 */, /*47821*/9429/* 1F7C9 */,/*47822*/9429/* 1F7CA */,/*47823*/9429/* 1F7CB */,/*47824*/9429/* 1F7CC */, /*47825*/9429/* 1F7CD */,/*47826*/9429/* 1F7CE */,/*47827*/9429/* 1F7CF */,/*47828*/9429/* 1F7D0 */, /*47829*/9429/* 1F7D1 */,/*47830*/9429/* 1F7D2 */,/*47831*/9429/* 1F7D3 */,/*47832*/9429/* 1F7D4 */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*47876*/9430/* 1F800 */,/*47877*/9430/* 1F801 */, /*47878*/9430/* 1F802 */,/*47879*/9430/* 1F803 */,/*47880*/9430/* 1F804 */,/*47881*/9430/* 1F805 */, /*47882*/9430/* 1F806 */,/*47883*/9430/* 1F807 */,/*47884*/9430/* 1F808 */,/*47885*/9430/* 1F809 */, /*47886*/9430/* 1F80A */,/*47887*/9430/* 1F80B */,0,0,0,0,/*47892*/9430/* 1F810 */,/*47893*/9430/* 1F811 */, /*47894*/9430/* 1F812 */,/*47895*/9430/* 1F813 */,/*47896*/9430/* 1F814 */,/*47897*/9430/* 1F815 */, /*47898*/9430/* 1F816 */,/*47899*/9430/* 1F817 */,/*47900*/9430/* 1F818 */,/*47901*/9430/* 1F819 */, /*47902*/9430/* 1F81A */,/*47903*/9430/* 1F81B */,/*47904*/9430/* 1F81C */,/*47905*/9430/* 1F81D */, /*47906*/9430/* 1F81E */,/*47907*/9430/* 1F81F */,/*47908*/9430/* 1F820 */,/*47909*/9430/* 1F821 */, /*47910*/9430/* 1F822 */,/*47911*/9430/* 1F823 */,/*47912*/9430/* 1F824 */,/*47913*/9430/* 1F825 */, /*47914*/9430/* 1F826 */,/*47915*/9430/* 1F827 */,/*47916*/9430/* 1F828 */,/*47917*/9430/* 1F829 */, /*47918*/9430/* 1F82A */,/*47919*/9430/* 1F82B */,/*47920*/9430/* 1F82C */,/*47921*/9430/* 1F82D */, /*47922*/9430/* 1F82E */,/*47923*/9430/* 1F82F */,/*47924*/9430/* 1F830 */,/*47925*/9430/* 1F831 */, /*47926*/9430/* 1F832 */,/*47927*/9430/* 1F833 */,/*47928*/9430/* 1F834 */,/*47929*/9430/* 1F835 */, /*47930*/9430/* 1F836 */,/*47931*/9430/* 1F837 */,/*47932*/9430/* 1F838 */,/*47933*/9430/* 1F839 */, /*47934*/9430/* 1F83A */,/*47935*/9430/* 1F83B */,/*47936*/9430/* 1F83C */,/*47937*/9430/* 1F83D */, /*47938*/9430/* 1F83E */,/*47939*/9430/* 1F83F */,/*47940*/9430/* 1F840 */,/*47941*/9430/* 1F841 */, /*47942*/9430/* 1F842 */,/*47943*/9430/* 1F843 */,/*47944*/9430/* 1F844 */,/*47945*/9430/* 1F845 */, /*47946*/9430/* 1F846 */,/*47947*/9430/* 1F847 */,0,0,0,0,0,0,0,0,/*47956*/9430/* 1F850 */,/*47957*/9430/* 1F851 */, /*47958*/9430/* 1F852 */,/*47959*/9430/* 1F853 */,/*47960*/9430/* 1F854 */,/*47961*/9430/* 1F855 */, /*47962*/9430/* 1F856 */,/*47963*/9430/* 1F857 */,/*47964*/9430/* 1F858 */,/*47965*/9430/* 1F859 */,0,0,0,0,0,0, /*47972*/9430/* 1F860 */,/*47973*/9430/* 1F861 */,/*47974*/9430/* 1F862 */,/*47975*/9430/* 1F863 */, /*47976*/9430/* 1F864 */,/*47977*/9430/* 1F865 */,/*47978*/9430/* 1F866 */,/*47979*/9430/* 1F867 */, /*47980*/9430/* 1F868 */,/*47981*/9430/* 1F869 */,/*47982*/9430/* 1F86A */,/*47983*/9430/* 1F86B */, /*47984*/9430/* 1F86C */,/*47985*/9430/* 1F86D */,/*47986*/9430/* 1F86E */,/*47987*/9430/* 1F86F */, /*47988*/9430/* 1F870 */,/*47989*/9430/* 1F871 */,/*47990*/9430/* 1F872 */,/*47991*/9430/* 1F873 */, /*47992*/9430/* 1F874 */,/*47993*/9430/* 1F875 */,/*47994*/9430/* 1F876 */,/*47995*/9430/* 1F877 */, /*47996*/9430/* 1F878 */,/*47997*/9430/* 1F879 */,/*47998*/9430/* 1F87A */,/*47999*/9430/* 1F87B */, /*48000*/9430/* 1F87C */,/*48001*/9430/* 1F87D */,/*48002*/9430/* 1F87E */,/*48003*/9430/* 1F87F */, /*48004*/9430/* 1F880 */,/*48005*/9430/* 1F881 */,/*48006*/9430/* 1F882 */,/*48007*/9430/* 1F883 */, /*48008*/9430/* 1F884 */,/*48009*/9430/* 1F885 */,/*48010*/9430/* 1F886 */,/*48011*/9430/* 1F887 */,0,0,0,0,0,0,0,0, /*48020*/9430/* 1F890 */,/*48021*/9430/* 1F891 */,/*48022*/9430/* 1F892 */,/*48023*/9430/* 1F893 */, /*48024*/9430/* 1F894 */,/*48025*/9430/* 1F895 */,/*48026*/9430/* 1F896 */,/*48027*/9430/* 1F897 */, /*48028*/9430/* 1F898 */,/*48029*/9430/* 1F899 */,/*48030*/9430/* 1F89A */,/*48031*/9430/* 1F89B */, /*48032*/9430/* 1F89C */,/*48033*/9430/* 1F89D */,/*48034*/9430/* 1F89E */,/*48035*/9430/* 1F89F */, /*48036*/9430/* 1F8A0 */,/*48037*/9430/* 1F8A1 */,/*48038*/9430/* 1F8A2 */,/*48039*/9430/* 1F8A3 */, /*48040*/9430/* 1F8A4 */,/*48041*/9430/* 1F8A5 */,/*48042*/9430/* 1F8A6 */,/*48043*/9430/* 1F8A7 */, /*48044*/9430/* 1F8A8 */,/*48045*/9430/* 1F8A9 */,/*48046*/9430/* 1F8AA */,/*48047*/9430/* 1F8AB */, /*48048*/9430/* 1F8AC */,/*48049*/9430/* 1F8AD */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,/*48148*/9431/* 1F910 */,/*48149*/9431/* 1F911 */,/*48150*/9431/* 1F912 */,/*48151*/9431/* 1F913 */, /*48152*/9431/* 1F914 */,/*48153*/9431/* 1F915 */,/*48154*/9431/* 1F916 */,/*48155*/9431/* 1F917 */, /*48156*/9431/* 1F918 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*48260*/9431/* 1F980 */,/*48261*/9431/* 1F981 */,/*48262*/9431/* 1F982 */,/*48263*/9431/* 1F983 */, /*48264*/9431/* 1F984 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*48324*/9431/* 1F9C0 */,/*48325*/9432/* 20000 */,/*48326*/9433/* 20001 */, /*48327*/9434/* 20002 */,/*48328*/9434/*20003 */,/*48329*/9434/*20004 */,/*48330*/9434/*20005 */,/*48331*/9434/*20006 */, /*48332*/9434/*20007 */,/*48333*/9434/*20008 */,/*48334*/9434/*20009 */,/*48335*/9434/*2000A */,/*48336*/9434/*2000B */, /*48337*/9434/*2000C */,/*48338*/9434/*2000D */,/*48339*/9434/*2000E */,/*48340*/9434/*2000F */,/*48341*/9434/*20010 */, /*48342*/9434/*20011 */,/*48343*/9434/*20012 */,/*48344*/9434/*20013 */,/*48345*/9434/*20014 */,/*48346*/9434/*20015 */, /*48347*/9434/*20016 */,/*48348*/9434/*20017 */,/*48349*/9434/*20018 */,/*48350*/9434/*20019 */,/*48351*/9434/*2001A */, /*48352*/9434/*2001B */,/*48353*/9434/*2001C */,/*48354*/9434/*2001D */,/*48355*/9434/*2001E */,/*48356*/9434/*2001F */, /*48357*/9434/*20020 */,/*48358*/9434/*20021 */,/*48359*/9434/*20022 */,/*48360*/9434/*20023 */,/*48361*/9434/*20024 */, /*48362*/9434/*20025 */,/*48363*/9434/*20026 */,/*48364*/9434/*20027 */,/*48365*/9434/*20028 */,/*48366*/9434/*20029 */, /*48367*/9434/*2002A */,/*48368*/9434/*2002B */,/*48369*/9434/*2002C */,/*48370*/9434/*2002D */,/*48371*/9434/*2002E */, /*48372*/9434/*2002F */,/*48373*/9434/*20030 */,/*48374*/9434/*20031 */,/*48375*/9434/*20032 */,/*48376*/9434/*20033 */, /*48377*/9434/*20034 */,/*48378*/9434/*20035 */,/*48379*/9434/*20036 */,/*48380*/9434/*20037 */,/*48381*/9434/*20038 */, /*48382*/9434/*20039 */,/*48383*/9434/*2003A */,/*48384*/9434/*2003B */,/*48385*/9434/*2003C */,/*48386*/9434/*2003D */, /*48387*/9434/*2003E */,/*48388*/9434/*2003F */,/*48389*/9434/*20040 */,/*48390*/9434/*20041 */,/*48391*/9434/*20042 */, /*48392*/9434/*20043 */,/*48393*/9434/*20044 */,/*48394*/9434/*20045 */,/*48395*/9434/*20046 */,/*48396*/9434/*20047 */, /*48397*/9434/*20048 */,/*48398*/9434/*20049 */,/*48399*/9434/*2004A */,/*48400*/9434/*2004B */,/*48401*/9434/*2004C */, /*48402*/9434/*2004D */,/*48403*/9434/*2004E */,/*48404*/9434/*2004F */,/*48405*/9434/*20050 */,/*48406*/9434/*20051 */, /*48407*/9434/*20052 */,/*48408*/9434/*20053 */,/*48409*/9434/*20054 */,/*48410*/9434/*20055 */,/*48411*/9434/*20056 */, /*48412*/9434/*20057 */,/*48413*/9434/*20058 */,/*48414*/9434/*20059 */,/*48415*/9434/*2005A */,/*48416*/9434/*2005B */, /*48417*/9434/*2005C */,/*48418*/9434/*2005D */,/*48419*/9434/*2005E */,/*48420*/9434/*2005F */,/*48421*/9434/*20060 */, /*48422*/9434/*20061 */,/*48423*/9434/*20062 */,/*48424*/9434/*20063 */,/*48425*/9435/* 20064 */, /*48426*/9434/* 20065 */,/*48427*/9435/* 200E2 */,/*48428*/9434/* 200E3 */,/*48429*/9434/*200E4 */, /*48430*/9434/*200E5 */,/*48431*/9434/*200E6 */,/*48432*/9434/*200E7 */,/*48433*/9434/*200E8 */,/*48434*/9434/*200E9 */, /*48435*/9434/*200EA */,/*48436*/9434/*200EB */,/*48437*/9434/*200EC */,/*48438*/9434/*200ED */,/*48439*/9434/*200EE */, /*48440*/9434/*200EF */,/*48441*/9434/*200F0 */,/*48442*/9434/*200F1 */,/*48443*/9434/*200F2 */,/*48444*/9434/*200F3 */, /*48445*/9434/*200F4 */,/*48446*/9434/*200F5 */,/*48447*/9434/*200F6 */,/*48448*/9434/*200F7 */,/*48449*/9434/*200F8 */, /*48450*/9434/*200F9 */,/*48451*/9434/*200FA */,/*48452*/9434/*200FB */,/*48453*/9434/*200FC */,/*48454*/9434/*200FD */, /*48455*/9434/*200FE */,/*48456*/9434/*200FF */,/*48457*/9434/*20100 */,/*48458*/9434/*20101 */,/*48459*/9434/*20102 */, /*48460*/9434/*20103 */,/*48461*/9434/*20104 */,/*48462*/9434/*20105 */,/*48463*/9434/*20106 */,/*48464*/9434/*20107 */, /*48465*/9434/*20108 */,/*48466*/9434/*20109 */,/*48467*/9434/*2010A */,/*48468*/9434/*2010B */,/*48469*/9434/*2010C */, /*48470*/9434/*2010D */,/*48471*/9434/*2010E */,/*48472*/9434/*2010F */,/*48473*/9434/*20110 */,/*48474*/9434/*20111 */, /*48475*/9434/*20112 */,/*48476*/9434/*20113 */,/*48477*/9434/*20114 */,/*48478*/9434/*20115 */,/*48479*/9434/*20116 */, /*48480*/9434/*20117 */,/*48481*/9434/*20118 */,/*48482*/9434/*20119 */,/*48483*/9434/*2011A */,/*48484*/9434/*2011B */, /*48485*/9434/*2011C */,/*48486*/9434/*2011D */,/*48487*/9434/*2011E */,/*48488*/9434/*2011F */,/*48489*/9434/*20120 */, /*48490*/9436/* 20121 */,/*48491*/9434/* 20122 */,/*48492*/9437/* 2092A */,/*48493*/9434/* 2092B */, /*48494*/9434/*2092C */,/*48495*/9434/*2092D */,/*48496*/9434/*2092E */,/*48497*/9434/*2092F */,/*48498*/9434/*20930 */, /*48499*/9434/*20931 */,/*48500*/9434/*20932 */,/*48501*/9434/*20933 */,/*48502*/9434/*20934 */,/*48503*/9434/*20935 */, /*48504*/9434/*20936 */,/*48505*/9434/*20937 */,/*48506*/9434/*20938 */,/*48507*/9434/*20939 */,/*48508*/9434/*2093A */, /*48509*/9434/*2093B */,/*48510*/9434/*2093C */,/*48511*/9434/*2093D */,/*48512*/9434/*2093E */,/*48513*/9434/*2093F */, /*48514*/9434/*20940 */,/*48515*/9434/*20941 */,/*48516*/9434/*20942 */,/*48517*/9434/*20943 */,/*48518*/9434/*20944 */, /*48519*/9434/*20945 */,/*48520*/9434/*20946 */,/*48521*/9434/*20947 */,/*48522*/9434/*20948 */,/*48523*/9434/*20949 */, /*48524*/9434/*2094A */,/*48525*/9434/*2094B */,/*48526*/9434/*2094C */,/*48527*/9434/*2094D */,/*48528*/9434/*2094E */, /*48529*/9434/*2094F */,/*48530*/9434/*20950 */,/*48531*/9434/*20951 */,/*48532*/9434/*20952 */,/*48533*/9434/*20953 */, /*48534*/9434/*20954 */,/*48535*/9434/*20955 */,/*48536*/9434/*20956 */,/*48537*/9434/*20957 */,/*48538*/9434/*20958 */, /*48539*/9434/*20959 */,/*48540*/9434/*2095A */,/*48541*/9434/*2095B */,/*48542*/9434/*2095C */,/*48543*/9434/*2095D */, /*48544*/9434/*2095E */,/*48545*/9434/*2095F */,/*48546*/9434/*20960 */,/*48547*/9434/*20961 */,/*48548*/9434/*20962 */, /*48549*/9434/*20963 */,/*48550*/9434/*20964 */,/*48551*/9434/*20965 */,/*48552*/9434/*20966 */,/*48553*/9434/*20967 */, /*48554*/9434/*20968 */,/*48555*/9434/*20969 */,/*48556*/9434/*2096A */,/*48557*/9434/*2096B */,/*48558*/9434/*2096C */, /*48559*/9434/*2096D */,/*48560*/9434/*2096E */,/*48561*/9434/*2096F */,/*48562*/9434/*20970 */,/*48563*/9434/*20971 */, /*48564*/9434/*20972 */,/*48565*/9434/*20973 */,/*48566*/9434/*20974 */,/*48567*/9434/*20975 */,/*48568*/9434/*20976 */, /*48569*/9434/*20977 */,/*48570*/9434/*20978 */,/*48571*/9434/*20979 */,/*48572*/9434/*2097A */,/*48573*/9434/*2097B */, /*48574*/9434/*2097C */,/*48575*/9434/*2097D */,/*48576*/9434/*2097E */,/*48577*/9434/*2097F */,/*48578*/9434/*20980 */, /*48579*/9434/*20981 */,/*48580*/9434/*20982 */,/*48581*/9438/* 20983 */,/*48582*/9434/* 20984 */, /*48583*/9434/*20985 */,/*48584*/9434/*20986 */,/*48585*/9434/*20987 */,/*48586*/9434/*20988 */,/*48587*/9434/*20989 */, /*48588*/9434/*2098A */,/*48589*/9434/*2098B */,/*48590*/9439/* 2098C */,/*48591*/9434/* 2098D */, /*48592*/9434/*2098E */,/*48593*/9434/*2098F */,/*48594*/9434/*20990 */,/*48595*/9434/*20991 */,/*48596*/9434/*20992 */, /*48597*/9434/*20993 */,/*48598*/9434/*20994 */,/*48599*/9434/*20995 */,/*48600*/9434/*20996 */,/*48601*/9434/*20997 */, /*48602*/9434/*20998 */,/*48603*/9434/*20999 */,/*48604*/9434/*2099A */,/*48605*/9434/*2099B */,/*48606*/9439/* 2099C */, /*48607*/9434/* 2099D */,/*48608*/9440/* 20AEA */,/*48609*/9434/* 20AEB */,/*48610*/9434/*20AEC */, /*48611*/9434/*20AED */,/*48612*/9434/*20AEE */,/*48613*/9434/*20AEF */,/*48614*/9434/*20AF0 */,/*48615*/9434/*20AF1 */, /*48616*/9434/*20AF2 */,/*48617*/9434/*20AF3 */,/*48618*/9434/*20AF4 */,/*48619*/9434/*20AF5 */,/*48620*/9434/*20AF6 */, /*48621*/9434/*20AF7 */,/*48622*/9434/*20AF8 */,/*48623*/9434/*20AF9 */,/*48624*/9434/*20AFA */,/*48625*/9434/*20AFB */, /*48626*/9434/*20AFC */,/*48627*/9441/* 20AFD */,/*48628*/9434/* 20AFE */,/*48629*/9434/*20AFF */, /*48630*/9434/*20B00 */,/*48631*/9434/*20B01 */,/*48632*/9434/*20B02 */,/*48633*/9434/*20B03 */,/*48634*/9434/*20B04 */, /*48635*/9434/*20B05 */,/*48636*/9434/*20B06 */,/*48637*/9434/*20B07 */,/*48638*/9434/*20B08 */,/*48639*/9434/*20B09 */, /*48640*/9434/*20B0A */,/*48641*/9434/*20B0B */,/*48642*/9434/*20B0C */,/*48643*/9434/*20B0D */,/*48644*/9434/*20B0E */, /*48645*/9434/*20B0F */,/*48646*/9434/*20B10 */,/*48647*/9434/*20B11 */,/*48648*/9434/*20B12 */,/*48649*/9434/*20B13 */, /*48650*/9434/*20B14 */,/*48651*/9434/*20B15 */,/*48652*/9434/*20B16 */,/*48653*/9434/*20B17 */,/*48654*/9434/*20B18 */, /*48655*/9441/* 20B19 */,/*48656*/9434/* 20B1A */,/*48657*/9442/* 22390 */,/*48658*/9434/* 22391 */, /*48659*/9441/* 22998 */,/*48660*/9434/* 22999 */,/*48661*/9441/* 23B1B */,/*48662*/9434/* 23B1C */, /*48663*/9435/* 2626D */,/*48664*/9434/* 2626E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,/*48706*/9443/* 2A700 */,0,0,0,0,0,0,0,0,0,0,0,/*48718*/9444/* 2B740 */,0,0,/*48721*/9445/* 2B820 */, /*48722*/9446/* 2F800 */,/*48723*/9447/* 2F801 */,/*48724*/9448/* 2F802 */,/*48725*/9449/* 2F803 */, /*48726*/9450/* 2F804 */,/*48727*/9451/* 2F805 */,/*48728*/9452/* 2F806 */,/*48729*/9453/* 2F807 */, /*48730*/9454/* 2F808 */,/*48731*/9455/* 2F809 */,/*48732*/9456/* 2F80A */,/*48733*/9457/* 2F80B */, /*48734*/9458/* 2F80C */,/*48735*/9459/* 2F80D */,/*48736*/9460/* 2F80E */,/*48737*/9461/* 2F80F */, /*48738*/9462/* 2F810 */,/*48739*/9463/* 2F811 */,/*48740*/9464/* 2F812 */,/*48741*/9465/* 2F813 */, /*48742*/9466/* 2F814 */,/*48743*/9467/* 2F815 */,/*48744*/9468/* 2F816 */,/*48745*/9469/* 2F817 */, /*48746*/9470/* 2F818 */,/*48747*/9471/* 2F819 */,/*48748*/9472/* 2F81A */,/*48749*/9473/* 2F81B */, /*48750*/9474/* 2F81C */,/*48751*/9475/* 2F81D */,/*48752*/9476/* 2F81E */,/*48753*/9477/* 2F81F */, /*48754*/9478/* 2F820 */,/*48755*/9479/* 2F821 */,/*48756*/9480/* 2F822 */,/*48757*/9481/* 2F823 */, /*48758*/9482/* 2F824 */,/*48759*/9483/* 2F825 */,/*48760*/9484/* 2F826 */,/*48761*/9485/* 2F827 */, /*48762*/9486/* 2F828 */,/*48763*/9487/* 2F829 */,/*48764*/9488/* 2F82A */,/*48765*/9489/* 2F82B */, /*48766*/9490/* 2F82C */,/*48767*/9491/* 2F82D */,/*48768*/9492/* 2F82E */,/*48769*/9493/* 2F82F */, /*48770*/9494/* 2F830 */,/*48771*/9495/* 2F831 */,/*48772*/9496/* 2F832 */,/*48773*/9497/* 2F833 */, /*48774*/9498/* 2F834 */,/*48775*/9499/* 2F835 */,/*48776*/9500/* 2F836 */,/*48777*/9501/* 2F837 */, /*48778*/9502/* 2F838 */,/*48779*/9503/* 2F839 */,/*48780*/9504/* 2F83A */,/*48781*/9505/* 2F83B */, /*48782*/9506/* 2F83C */,/*48783*/9507/* 2F83D */,/*48784*/9508/* 2F83E */,/*48785*/9509/* 2F83F */, /*48786*/9510/* 2F840 */,/*48787*/9511/* 2F841 */,/*48788*/9512/* 2F842 */,/*48789*/9513/* 2F843 */, /*48790*/9514/* 2F844 */,/*48791*/9515/* 2F845 */,/*48792*/9516/* 2F846 */,/*48793*/9517/* 2F847 */, /*48794*/9518/* 2F848 */,/*48795*/9519/* 2F849 */,/*48796*/9520/* 2F84A */,/*48797*/9521/* 2F84B */, /*48798*/9522/* 2F84C */,/*48799*/9523/* 2F84D */,/*48800*/9524/* 2F84E */,/*48801*/9525/* 2F84F */, /*48802*/9526/* 2F850 */,/*48803*/9527/* 2F851 */,/*48804*/9528/* 2F852 */,/*48805*/9529/* 2F853 */, /*48806*/9530/* 2F854 */,/*48807*/9531/* 2F855 */,/*48808*/9532/* 2F856 */,/*48809*/9533/* 2F857 */, /*48810*/9534/* 2F858 */,/*48811*/9535/* 2F859 */,/*48812*/9536/* 2F85A */,/*48813*/9537/* 2F85B */, /*48814*/9538/* 2F85C */,/*48815*/9539/* 2F85D */,/*48816*/9540/* 2F85E */,/*48817*/9541/* 2F85F */, /*48818*/9542/* 2F860 */,/*48819*/9543/* 2F861 */,/*48820*/9544/* 2F862 */,/*48821*/9545/* 2F863 */, /*48822*/9546/* 2F864 */,/*48823*/9547/* 2F865 */,/*48824*/9548/* 2F866 */,/*48825*/9549/* 2F867 */, /*48826*/9550/* 2F868 */,/*48827*/9551/* 2F869 */,/*48828*/9552/* 2F86A */,/*48829*/9553/* 2F86B */, /*48830*/9554/* 2F86C */,/*48831*/9555/* 2F86D */,/*48832*/9556/* 2F86E */,/*48833*/9557/* 2F86F */, /*48834*/9558/* 2F870 */,/*48835*/9559/* 2F871 */,/*48836*/9560/* 2F872 */,/*48837*/9561/* 2F873 */, /*48838*/9562/* 2F874 */,/*48839*/9563/* 2F875 */,/*48840*/9564/* 2F876 */,/*48841*/9565/* 2F877 */, /*48842*/9566/* 2F878 */,/*48843*/9567/* 2F879 */,/*48844*/9568/* 2F87A */,/*48845*/9569/* 2F87B */, /*48846*/9570/* 2F87C */,/*48847*/9571/* 2F87D */,/*48848*/9572/* 2F87E */,/*48849*/9573/* 2F87F */, /*48850*/9574/* 2F880 */,/*48851*/9575/* 2F881 */,/*48852*/9576/* 2F882 */,/*48853*/9577/* 2F883 */, /*48854*/9578/* 2F884 */,/*48855*/9579/* 2F885 */,/*48856*/9580/* 2F886 */,/*48857*/9581/* 2F887 */, /*48858*/9582/* 2F888 */,/*48859*/9583/* 2F889 */,/*48860*/9584/* 2F88A */,/*48861*/9585/* 2F88B */, /*48862*/9586/* 2F88C */,/*48863*/9587/* 2F88D */,/*48864*/9588/* 2F88E */,/*48865*/9589/* 2F88F */, /*48866*/9590/* 2F890 */,/*48867*/9591/* 2F891 */,/*48868*/9592/* 2F892 */,/*48869*/9593/* 2F893 */, /*48870*/9594/* 2F894 */,/*48871*/9595/* 2F895 */,/*48872*/9596/* 2F896 */,/*48873*/9597/* 2F897 */, /*48874*/9598/* 2F898 */,/*48875*/9599/* 2F899 */,/*48876*/9600/* 2F89A */,/*48877*/9601/* 2F89B */, /*48878*/9602/* 2F89C */,/*48879*/9603/* 2F89D */,/*48880*/9604/* 2F89E */,/*48881*/9605/* 2F89F */, /*48882*/9606/* 2F8A0 */,/*48883*/9607/* 2F8A1 */,/*48884*/9608/* 2F8A2 */,/*48885*/9609/* 2F8A3 */, /*48886*/9610/* 2F8A4 */,/*48887*/9611/* 2F8A5 */,/*48888*/9612/* 2F8A6 */,/*48889*/9613/* 2F8A7 */, /*48890*/9614/* 2F8A8 */,/*48891*/9615/* 2F8A9 */,/*48892*/9616/* 2F8AA */,/*48893*/9617/* 2F8AB */, /*48894*/9618/* 2F8AC */,/*48895*/9619/* 2F8AD */,/*48896*/9620/* 2F8AE */,/*48897*/9621/* 2F8AF */, /*48898*/9622/* 2F8B0 */,/*48899*/9623/* 2F8B1 */,/*48900*/9624/* 2F8B2 */,/*48901*/9625/* 2F8B3 */, /*48902*/9626/* 2F8B4 */,/*48903*/9627/* 2F8B5 */,/*48904*/9628/* 2F8B6 */,/*48905*/9629/* 2F8B7 */, /*48906*/9630/* 2F8B8 */,/*48907*/9631/* 2F8B9 */,/*48908*/9632/* 2F8BA */,/*48909*/9633/* 2F8BB */, /*48910*/9634/* 2F8BC */,/*48911*/9635/* 2F8BD */,/*48912*/9636/* 2F8BE */,/*48913*/9637/* 2F8BF */, /*48914*/9638/* 2F8C0 */,/*48915*/9639/* 2F8C1 */,/*48916*/9640/* 2F8C2 */,/*48917*/9641/* 2F8C3 */, /*48918*/9642/* 2F8C4 */,/*48919*/9643/* 2F8C5 */,/*48920*/9644/* 2F8C6 */,/*48921*/9645/* 2F8C7 */, /*48922*/9646/* 2F8C8 */,/*48923*/9647/* 2F8C9 */,/*48924*/9648/* 2F8CA */,/*48925*/9649/* 2F8CB */, /*48926*/9650/* 2F8CC */,/*48927*/9651/* 2F8CD */,/*48928*/9652/* 2F8CE */,/*48929*/9653/* 2F8CF */, /*48930*/9654/* 2F8D0 */,/*48931*/9655/* 2F8D1 */,/*48932*/9656/* 2F8D2 */,/*48933*/9657/* 2F8D3 */, /*48934*/9658/* 2F8D4 */,/*48935*/9659/* 2F8D5 */,/*48936*/9660/* 2F8D6 */,/*48937*/9661/* 2F8D7 */, /*48938*/9662/* 2F8D8 */,/*48939*/9663/* 2F8D9 */,/*48940*/9664/* 2F8DA */,/*48941*/9665/* 2F8DB */, /*48942*/9666/* 2F8DC */,/*48943*/9667/* 2F8DD */,/*48944*/9668/* 2F8DE */,/*48945*/9669/* 2F8DF */, /*48946*/9670/* 2F8E0 */,/*48947*/9671/* 2F8E1 */,/*48948*/9672/* 2F8E2 */,/*48949*/9673/* 2F8E3 */, /*48950*/9674/* 2F8E4 */,/*48951*/9675/* 2F8E5 */,/*48952*/9676/* 2F8E6 */,/*48953*/9677/* 2F8E7 */, /*48954*/9678/* 2F8E8 */,/*48955*/9679/* 2F8E9 */,/*48956*/9680/* 2F8EA */,/*48957*/9681/* 2F8EB */, /*48958*/9682/* 2F8EC */,/*48959*/9683/* 2F8ED */,/*48960*/9684/* 2F8EE */,/*48961*/9685/* 2F8EF */, /*48962*/9686/* 2F8F0 */,/*48963*/9687/* 2F8F1 */,/*48964*/9688/* 2F8F2 */,/*48965*/9689/* 2F8F3 */, /*48966*/9690/* 2F8F4 */,/*48967*/9691/* 2F8F5 */,/*48968*/9692/* 2F8F6 */,/*48969*/9693/* 2F8F7 */, /*48970*/9694/* 2F8F8 */,/*48971*/9695/* 2F8F9 */,/*48972*/9696/* 2F8FA */,/*48973*/9697/* 2F8FB */, /*48974*/9698/* 2F8FC */,/*48975*/9699/* 2F8FD */,/*48976*/9700/* 2F8FE */,/*48977*/9701/* 2F8FF */, /*48978*/9702/* 2F900 */,/*48979*/9703/* 2F901 */,/*48980*/9704/* 2F902 */,/*48981*/9705/* 2F903 */, /*48982*/9706/* 2F904 */,/*48983*/9707/* 2F905 */,/*48984*/9708/* 2F906 */,/*48985*/9709/* 2F907 */, /*48986*/9710/* 2F908 */,/*48987*/9711/* 2F909 */,/*48988*/9712/* 2F90A */,/*48989*/9713/* 2F90B */, /*48990*/9714/* 2F90C */,/*48991*/9715/* 2F90D */,/*48992*/9716/* 2F90E */,/*48993*/9717/* 2F90F */, /*48994*/9718/* 2F910 */,/*48995*/9719/* 2F911 */,/*48996*/9720/* 2F912 */,/*48997*/9721/* 2F913 */, /*48998*/9722/* 2F914 */,/*48999*/9723/* 2F915 */,/*49000*/9724/* 2F916 */,/*49001*/9725/* 2F917 */, /*49002*/9726/* 2F918 */,/*49003*/9727/* 2F919 */,/*49004*/9728/* 2F91A */,/*49005*/9729/* 2F91B */, /*49006*/9730/* 2F91C */,/*49007*/9731/* 2F91D */,/*49008*/9732/* 2F91E */,/*49009*/9733/* 2F91F */, /*49010*/9734/* 2F920 */,/*49011*/9735/* 2F921 */,/*49012*/9736/* 2F922 */,/*49013*/9737/* 2F923 */, /*49014*/9738/* 2F924 */,/*49015*/9739/* 2F925 */,/*49016*/9740/* 2F926 */,/*49017*/9741/* 2F927 */, /*49018*/9742/* 2F928 */,/*49019*/9743/* 2F929 */,/*49020*/9744/* 2F92A */,/*49021*/9745/* 2F92B */, /*49022*/9746/* 2F92C */,/*49023*/9747/* 2F92D */,/*49024*/9748/* 2F92E */,/*49025*/9749/* 2F92F */, /*49026*/9750/* 2F930 */,/*49027*/9751/* 2F931 */,/*49028*/9752/* 2F932 */,/*49029*/9753/* 2F933 */, /*49030*/9754/* 2F934 */,/*49031*/9755/* 2F935 */,/*49032*/9756/* 2F936 */,/*49033*/9757/* 2F937 */, /*49034*/9758/* 2F938 */,/*49035*/9759/* 2F939 */,/*49036*/9760/* 2F93A */,/*49037*/9761/* 2F93B */, /*49038*/9762/* 2F93C */,/*49039*/9763/* 2F93D */,/*49040*/9764/* 2F93E */,/*49041*/9765/* 2F93F */, /*49042*/9766/* 2F940 */,/*49043*/9767/* 2F941 */,/*49044*/9768/* 2F942 */,/*49045*/9769/* 2F943 */, /*49046*/9770/* 2F944 */,/*49047*/9771/* 2F945 */,/*49048*/9772/* 2F946 */,/*49049*/9773/* 2F947 */, /*49050*/9774/* 2F948 */,/*49051*/9775/* 2F949 */,/*49052*/9776/* 2F94A */,/*49053*/9777/* 2F94B */, /*49054*/9778/* 2F94C */,/*49055*/9779/* 2F94D */,/*49056*/9780/* 2F94E */,/*49057*/9781/* 2F94F */, /*49058*/9782/* 2F950 */,/*49059*/9783/* 2F951 */,/*49060*/9784/* 2F952 */,/*49061*/9785/* 2F953 */, /*49062*/9786/* 2F954 */,/*49063*/9787/* 2F955 */,/*49064*/9788/* 2F956 */,/*49065*/9789/* 2F957 */, /*49066*/9790/* 2F958 */,/*49067*/9791/* 2F959 */,/*49068*/9792/* 2F95A */,/*49069*/9793/* 2F95B */, /*49070*/9794/* 2F95C */,/*49071*/9795/* 2F95D */,/*49072*/9796/* 2F95E */,/*49073*/9797/* 2F95F */, /*49074*/9798/* 2F960 */,/*49075*/9799/* 2F961 */,/*49076*/9800/* 2F962 */,/*49077*/9801/* 2F963 */, /*49078*/9802/* 2F964 */,/*49079*/9803/* 2F965 */,/*49080*/9804/* 2F966 */,/*49081*/9805/* 2F967 */, /*49082*/9806/* 2F968 */,/*49083*/9807/* 2F969 */,/*49084*/9808/* 2F96A */,/*49085*/9809/* 2F96B */, /*49086*/9810/* 2F96C */,/*49087*/9811/* 2F96D */,/*49088*/9812/* 2F96E */,/*49089*/9813/* 2F96F */, /*49090*/9814/* 2F970 */,/*49091*/9815/* 2F971 */,/*49092*/9816/* 2F972 */,/*49093*/9817/* 2F973 */, /*49094*/9818/* 2F974 */,/*49095*/9819/* 2F975 */,/*49096*/9820/* 2F976 */,/*49097*/9821/* 2F977 */, /*49098*/9822/* 2F978 */,/*49099*/9823/* 2F979 */,/*49100*/9824/* 2F97A */,/*49101*/9825/* 2F97B */, /*49102*/9826/* 2F97C */,/*49103*/9827/* 2F97D */,/*49104*/9828/* 2F97E */,/*49105*/9829/* 2F97F */, /*49106*/9830/* 2F980 */,/*49107*/9831/* 2F981 */,/*49108*/9832/* 2F982 */,/*49109*/9833/* 2F983 */, /*49110*/9834/* 2F984 */,/*49111*/9835/* 2F985 */,/*49112*/9836/* 2F986 */,/*49113*/9837/* 2F987 */, /*49114*/9838/* 2F988 */,/*49115*/9839/* 2F989 */,/*49116*/9840/* 2F98A */,/*49117*/9841/* 2F98B */, /*49118*/9842/* 2F98C */,/*49119*/9843/* 2F98D */,/*49120*/9844/* 2F98E */,/*49121*/9845/* 2F98F */, /*49122*/9846/* 2F990 */,/*49123*/9847/* 2F991 */,/*49124*/9848/* 2F992 */,/*49125*/9849/* 2F993 */, /*49126*/9850/* 2F994 */,/*49127*/9851/* 2F995 */,/*49128*/9852/* 2F996 */,/*49129*/9853/* 2F997 */, /*49130*/9854/* 2F998 */,/*49131*/9855/* 2F999 */,/*49132*/9856/* 2F99A */,/*49133*/9857/* 2F99B */, /*49134*/9858/* 2F99C */,/*49135*/9859/* 2F99D */,/*49136*/9860/* 2F99E */,/*49137*/9861/* 2F99F */, /*49138*/9862/* 2F9A0 */,/*49139*/9863/* 2F9A1 */,/*49140*/9864/* 2F9A2 */,/*49141*/9865/* 2F9A3 */, /*49142*/9866/* 2F9A4 */,/*49143*/9867/* 2F9A5 */,/*49144*/9868/* 2F9A6 */,/*49145*/9869/* 2F9A7 */, /*49146*/9870/* 2F9A8 */,/*49147*/9871/* 2F9A9 */,/*49148*/9872/* 2F9AA */,/*49149*/9873/* 2F9AB */, /*49150*/9874/* 2F9AC */,/*49151*/9875/* 2F9AD */,/*49152*/9876/* 2F9AE */,/*49153*/9877/* 2F9AF */, /*49154*/9878/* 2F9B0 */,/*49155*/9879/* 2F9B1 */,/*49156*/9880/* 2F9B2 */,/*49157*/9881/* 2F9B3 */, /*49158*/9882/* 2F9B4 */,/*49159*/9883/* 2F9B5 */,/*49160*/9884/* 2F9B6 */,/*49161*/9885/* 2F9B7 */, /*49162*/9886/* 2F9B8 */,/*49163*/9887/* 2F9B9 */,/*49164*/9888/* 2F9BA */,/*49165*/9889/* 2F9BB */, /*49166*/9890/* 2F9BC */,/*49167*/9891/* 2F9BD */,/*49168*/9892/* 2F9BE */,/*49169*/9893/* 2F9BF */, /*49170*/9894/* 2F9C0 */,/*49171*/9895/* 2F9C1 */,/*49172*/9896/* 2F9C2 */,/*49173*/9897/* 2F9C3 */, /*49174*/9898/* 2F9C4 */,/*49175*/9899/* 2F9C5 */,/*49176*/9900/* 2F9C6 */,/*49177*/9901/* 2F9C7 */, /*49178*/9902/* 2F9C8 */,/*49179*/9903/* 2F9C9 */,/*49180*/9904/* 2F9CA */,/*49181*/9905/* 2F9CB */, /*49182*/9906/* 2F9CC */,/*49183*/9907/* 2F9CD */,/*49184*/9908/* 2F9CE */,/*49185*/9909/* 2F9CF */, /*49186*/9910/* 2F9D0 */,/*49187*/9911/* 2F9D1 */,/*49188*/9912/* 2F9D2 */,/*49189*/9913/* 2F9D3 */, /*49190*/9914/* 2F9D4 */,/*49191*/9915/* 2F9D5 */,/*49192*/9916/* 2F9D6 */,/*49193*/9917/* 2F9D7 */, /*49194*/9918/* 2F9D8 */,/*49195*/9919/* 2F9D9 */,/*49196*/9920/* 2F9DA */,/*49197*/9921/* 2F9DB */, /*49198*/9922/* 2F9DC */,/*49199*/9923/* 2F9DD */,/*49200*/9924/* 2F9DE */,/*49201*/9925/* 2F9DF */, /*49202*/9926/* 2F9E0 */,/*49203*/9927/* 2F9E1 */,/*49204*/9928/* 2F9E2 */,/*49205*/9929/* 2F9E3 */, /*49206*/9930/* 2F9E4 */,/*49207*/9931/* 2F9E5 */,/*49208*/9932/* 2F9E6 */,/*49209*/9933/* 2F9E7 */, /*49210*/9934/* 2F9E8 */,/*49211*/9935/* 2F9E9 */,/*49212*/9936/* 2F9EA */,/*49213*/9937/* 2F9EB */, /*49214*/9938/* 2F9EC */,/*49215*/9939/* 2F9ED */,/*49216*/9940/* 2F9EE */,/*49217*/9941/* 2F9EF */, /*49218*/9942/* 2F9F0 */,/*49219*/9943/* 2F9F1 */,/*49220*/9944/* 2F9F2 */,/*49221*/9945/* 2F9F3 */, /*49222*/9946/* 2F9F4 */,/*49223*/9947/* 2F9F5 */,/*49224*/9948/* 2F9F6 */,/*49225*/9949/* 2F9F7 */, /*49226*/9950/* 2F9F8 */,/*49227*/9951/* 2F9F9 */,/*49228*/9952/* 2F9FA */,/*49229*/9953/* 2F9FB */, /*49230*/9954/* 2F9FC */,/*49231*/9955/* 2F9FD */,/*49232*/9956/* 2F9FE */,/*49233*/9957/* 2F9FF */, /*49234*/9958/* 2FA00 */,/*49235*/9959/* 2FA01 */,/*49236*/9960/* 2FA02 */,/*49237*/9961/* 2FA03 */, /*49238*/9962/* 2FA04 */,/*49239*/9963/* 2FA05 */,/*49240*/9964/* 2FA06 */,/*49241*/9965/* 2FA07 */, /*49242*/9966/* 2FA08 */,/*49243*/9967/* 2FA09 */,/*49244*/9968/* 2FA0A */,/*49245*/9969/* 2FA0B */, /*49246*/9970/* 2FA0C */,/*49247*/9971/* 2FA0D */,/*49248*/9972/* 2FA0E */,/*49249*/9973/* 2FA0F */, /*49250*/9974/* 2FA10 */,/*49251*/9975/* 2FA11 */,/*49252*/9976/* 2FA12 */,/*49253*/9977/* 2FA13 */, /*49254*/9978/* 2FA14 */,/*49255*/9979/* 2FA15 */,/*49256*/9980/* 2FA16 */,/*49257*/9981/* 2FA17 */, /*49258*/9982/* 2FA18 */,/*49259*/9983/* 2FA19 */,/*49260*/9984/* 2FA1A */,/*49261*/9985/* 2FA1B */, /*49262*/9986/* 2FA1C */,/*49263*/9987/* 2FA1D */,/*49264*/9988/* E0001 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,/*49295*/9989/* E0020 */,/*49296*/9990/* E0021 */,/*49297*/9990/* E0022 */,/*49298*/9990/* E0023 */, /*49299*/9990/* E0024 */,/*49300*/9990/* E0025 */,/*49301*/9990/* E0026 */,/*49302*/9990/* E0027 */, /*49303*/9990/* E0028 */,/*49304*/9990/* E0029 */,/*49305*/9990/* E002A */,/*49306*/9990/* E002B */, /*49307*/9990/* E002C */,/*49308*/9990/* E002D */,/*49309*/9990/* E002E */,/*49310*/9990/* E002F */, /*49311*/9990/* E0030 */,/*49312*/9990/* E0031 */,/*49313*/9990/* E0032 */,/*49314*/9990/* E0033 */, /*49315*/9990/* E0034 */,/*49316*/9990/* E0035 */,/*49317*/9990/* E0036 */,/*49318*/9990/* E0037 */, /*49319*/9990/* E0038 */,/*49320*/9990/* E0039 */,/*49321*/9990/* E003A */,/*49322*/9990/* E003B */, /*49323*/9990/* E003C */,/*49324*/9990/* E003D */,/*49325*/9990/* E003E */,/*49326*/9990/* E003F */, /*49327*/9990/* E0040 */,/*49328*/9990/* E0041 */,/*49329*/9990/* E0042 */,/*49330*/9990/* E0043 */, /*49331*/9990/* E0044 */,/*49332*/9990/* E0045 */,/*49333*/9990/* E0046 */,/*49334*/9990/* E0047 */, /*49335*/9990/* E0048 */,/*49336*/9990/* E0049 */,/*49337*/9990/* E004A */,/*49338*/9990/* E004B */, /*49339*/9990/* E004C */,/*49340*/9990/* E004D */,/*49341*/9990/* E004E */,/*49342*/9990/* E004F */, /*49343*/9990/* E0050 */,/*49344*/9990/* E0051 */,/*49345*/9990/* E0052 */,/*49346*/9990/* E0053 */, /*49347*/9990/* E0054 */,/*49348*/9990/* E0055 */,/*49349*/9990/* E0056 */,/*49350*/9990/* E0057 */, /*49351*/9990/* E0058 */,/*49352*/9990/* E0059 */,/*49353*/9990/* E005A */,/*49354*/9990/* E005B */, /*49355*/9990/* E005C */,/*49356*/9990/* E005D */,/*49357*/9990/* E005E */,/*49358*/9990/* E005F */, /*49359*/9990/* E0060 */,/*49360*/9990/* E0061 */,/*49361*/9990/* E0062 */,/*49362*/9990/* E0063 */, /*49363*/9990/* E0064 */,/*49364*/9990/* E0065 */,/*49365*/9990/* E0066 */,/*49366*/9990/* E0067 */, /*49367*/9990/* E0068 */,/*49368*/9990/* E0069 */,/*49369*/9990/* E006A */,/*49370*/9990/* E006B */, /*49371*/9990/* E006C */,/*49372*/9990/* E006D */,/*49373*/9990/* E006E */,/*49374*/9990/* E006F */, /*49375*/9990/* E0070 */,/*49376*/9990/* E0071 */,/*49377*/9990/* E0072 */,/*49378*/9990/* E0073 */, /*49379*/9990/* E0074 */,/*49380*/9990/* E0075 */,/*49381*/9990/* E0076 */,/*49382*/9990/* E0077 */, /*49383*/9990/* E0078 */,/*49384*/9990/* E0079 */,/*49385*/9990/* E007A */,/*49386*/9990/* E007B */, /*49387*/9990/* E007C */,/*49388*/9990/* E007D */,/*49389*/9990/* E007E */,/*49390*/9991/* E007F */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*49519*/9992/* E0100 */,/*49520*/9993/* E0101 */,/*49521*/9993/* E0102 */,/*49522*/9993/* E0103 */, /*49523*/9993/* E0104 */,/*49524*/9993/* E0105 */,/*49525*/9993/* E0106 */,/*49526*/9993/* E0107 */, /*49527*/9993/* E0108 */,/*49528*/9993/* E0109 */,/*49529*/9993/* E010A */,/*49530*/9993/* E010B */, /*49531*/9993/* E010C */,/*49532*/9993/* E010D */,/*49533*/9993/* E010E */,/*49534*/9993/* E010F */, /*49535*/9993/* E0110 */,/*49536*/9993/* E0111 */,/*49537*/9993/* E0112 */,/*49538*/9993/* E0113 */, /*49539*/9993/* E0114 */,/*49540*/9993/* E0115 */,/*49541*/9993/* E0116 */,/*49542*/9993/* E0117 */, /*49543*/9993/* E0118 */,/*49544*/9993/* E0119 */,/*49545*/9993/* E011A */,/*49546*/9993/* E011B */, /*49547*/9993/* E011C */,/*49548*/9993/* E011D */,/*49549*/9993/* E011E */,/*49550*/9993/* E011F */, /*49551*/9993/* E0120 */,/*49552*/9993/* E0121 */,/*49553*/9993/* E0122 */,/*49554*/9993/* E0123 */, /*49555*/9993/* E0124 */,/*49556*/9993/* E0125 */,/*49557*/9993/* E0126 */,/*49558*/9993/* E0127 */, /*49559*/9993/* E0128 */,/*49560*/9993/* E0129 */,/*49561*/9993/* E012A */,/*49562*/9993/* E012B */, /*49563*/9993/* E012C */,/*49564*/9993/* E012D */,/*49565*/9993/* E012E */,/*49566*/9993/* E012F */, /*49567*/9993/* E0130 */,/*49568*/9993/* E0131 */,/*49569*/9993/* E0132 */,/*49570*/9993/* E0133 */, /*49571*/9993/* E0134 */,/*49572*/9993/* E0135 */,/*49573*/9993/* E0136 */,/*49574*/9993/* E0137 */, /*49575*/9993/* E0138 */,/*49576*/9993/* E0139 */,/*49577*/9993/* E013A */,/*49578*/9993/* E013B */, /*49579*/9993/* E013C */,/*49580*/9993/* E013D */,/*49581*/9993/* E013E */,/*49582*/9993/* E013F */, /*49583*/9993/* E0140 */,/*49584*/9993/* E0141 */,/*49585*/9993/* E0142 */,/*49586*/9993/* E0143 */, /*49587*/9993/* E0144 */,/*49588*/9993/* E0145 */,/*49589*/9993/* E0146 */,/*49590*/9993/* E0147 */, /*49591*/9993/* E0148 */,/*49592*/9993/* E0149 */,/*49593*/9993/* E014A */,/*49594*/9993/* E014B */, /*49595*/9993/* E014C */,/*49596*/9993/* E014D */,/*49597*/9993/* E014E */,/*49598*/9993/* E014F */, /*49599*/9993/* E0150 */,/*49600*/9993/* E0151 */,/*49601*/9993/* E0152 */,/*49602*/9993/* E0153 */, /*49603*/9993/* E0154 */,/*49604*/9993/* E0155 */,/*49605*/9993/* E0156 */,/*49606*/9993/* E0157 */, /*49607*/9993/* E0158 */,/*49608*/9993/* E0159 */,/*49609*/9993/* E015A */,/*49610*/9993/* E015B */, /*49611*/9993/* E015C */,/*49612*/9993/* E015D */,/*49613*/9993/* E015E */,/*49614*/9993/* E015F */, /*49615*/9993/* E0160 */,/*49616*/9993/* E0161 */,/*49617*/9993/* E0162 */,/*49618*/9993/* E0163 */, /*49619*/9993/* E0164 */,/*49620*/9993/* E0165 */,/*49621*/9993/* E0166 */,/*49622*/9993/* E0167 */, /*49623*/9993/* E0168 */,/*49624*/9993/* E0169 */,/*49625*/9993/* E016A */,/*49626*/9993/* E016B */, /*49627*/9993/* E016C */,/*49628*/9993/* E016D */,/*49629*/9993/* E016E */,/*49630*/9993/* E016F */, /*49631*/9993/* E0170 */,/*49632*/9993/* E0171 */,/*49633*/9993/* E0172 */,/*49634*/9993/* E0173 */, /*49635*/9993/* E0174 */,/*49636*/9993/* E0175 */,/*49637*/9993/* E0176 */,/*49638*/9993/* E0177 */, /*49639*/9993/* E0178 */,/*49640*/9993/* E0179 */,/*49641*/9993/* E017A */,/*49642*/9993/* E017B */, /*49643*/9993/* E017C */,/*49644*/9993/* E017D */,/*49645*/9993/* E017E */,/*49646*/9993/* E017F */, /*49647*/9993/* E0180 */,/*49648*/9993/* E0181 */,/*49649*/9993/* E0182 */,/*49650*/9993/* E0183 */, /*49651*/9993/* E0184 */,/*49652*/9993/* E0185 */,/*49653*/9993/* E0186 */,/*49654*/9993/* E0187 */, /*49655*/9993/* E0188 */,/*49656*/9993/* E0189 */,/*49657*/9993/* E018A */,/*49658*/9993/* E018B */, /*49659*/9993/* E018C */,/*49660*/9993/* E018D */,/*49661*/9993/* E018E */,/*49662*/9993/* E018F */, /*49663*/9993/* E0190 */,/*49664*/9993/* E0191 */,/*49665*/9993/* E0192 */,/*49666*/9993/* E0193 */, /*49667*/9993/* E0194 */,/*49668*/9993/* E0195 */,/*49669*/9993/* E0196 */,/*49670*/9993/* E0197 */, /*49671*/9993/* E0198 */,/*49672*/9993/* E0199 */,/*49673*/9993/* E019A */,/*49674*/9993/* E019B */, /*49675*/9993/* E019C */,/*49676*/9993/* E019D */,/*49677*/9993/* E019E */,/*49678*/9993/* E019F */, /*49679*/9993/* E01A0 */,/*49680*/9993/* E01A1 */,/*49681*/9993/* E01A2 */,/*49682*/9993/* E01A3 */, /*49683*/9993/* E01A4 */,/*49684*/9993/* E01A5 */,/*49685*/9993/* E01A6 */,/*49686*/9993/* E01A7 */, /*49687*/9993/* E01A8 */,/*49688*/9993/* E01A9 */,/*49689*/9993/* E01AA */,/*49690*/9993/* E01AB */, /*49691*/9993/* E01AC */,/*49692*/9993/* E01AD */,/*49693*/9993/* E01AE */,/*49694*/9993/* E01AF */, /*49695*/9993/* E01B0 */,/*49696*/9993/* E01B1 */,/*49697*/9993/* E01B2 */,/*49698*/9993/* E01B3 */, /*49699*/9993/* E01B4 */,/*49700*/9993/* E01B5 */,/*49701*/9993/* E01B6 */,/*49702*/9993/* E01B7 */, /*49703*/9993/* E01B8 */,/*49704*/9993/* E01B9 */,/*49705*/9993/* E01BA */,/*49706*/9993/* E01BB */, /*49707*/9993/* E01BC */,/*49708*/9993/* E01BD */,/*49709*/9993/* E01BE */,/*49710*/9993/* E01BF */, /*49711*/9993/* E01C0 */,/*49712*/9993/* E01C1 */,/*49713*/9993/* E01C2 */,/*49714*/9993/* E01C3 */, /*49715*/9993/* E01C4 */,/*49716*/9993/* E01C5 */,/*49717*/9993/* E01C6 */,/*49718*/9993/* E01C7 */, /*49719*/9993/* E01C8 */,/*49720*/9993/* E01C9 */,/*49721*/9993/* E01CA */,/*49722*/9993/* E01CB */, /*49723*/9993/* E01CC */,/*49724*/9993/* E01CD */,/*49725*/9993/* E01CE */,/*49726*/9993/* E01CF */, /*49727*/9993/* E01D0 */,/*49728*/9993/* E01D1 */,/*49729*/9993/* E01D2 */,/*49730*/9993/* E01D3 */, /*49731*/9993/* E01D4 */,/*49732*/9993/* E01D5 */,/*49733*/9993/* E01D6 */,/*49734*/9993/* E01D7 */, /*49735*/9993/* E01D8 */,/*49736*/9993/* E01D9 */,/*49737*/9993/* E01DA */,/*49738*/9993/* E01DB */, /*49739*/9993/* E01DC */,/*49740*/9993/* E01DD */,/*49741*/9993/* E01DE */,/*49742*/9993/* E01DF */, /*49743*/9993/* E01E0 */,/*49744*/9993/* E01E1 */,/*49745*/9993/* E01E2 */,/*49746*/9993/* E01E3 */, /*49747*/9993/* E01E4 */,/*49748*/9993/* E01E5 */,/*49749*/9993/* E01E6 */,/*49750*/9993/* E01E7 */, /*49751*/9993/* E01E8 */,/*49752*/9993/* E01E9 */,/*49753*/9993/* E01EA */,/*49754*/9993/* E01EB */, /*49755*/9993/* E01EC */,/*49756*/9993/* E01ED */,/*49757*/9993/* E01EE */,/*49758*/9993/* E01EF */, /*49759*/9994/* F0000 */,/*49760*/9995/* F0001 */,/*49761*/9996/* 100000 */,/*49762*/9997/* 100001 */, /*49763*/9998/* 110000 */ }; static const char *codepoint_names[49764] = { /*0*/"NULL"/* 0000 */,/*1*/"START OF HEADING"/* 0001 */,/*2*/"START OF TEXT"/* 0002 */,/*3*/"END OF TEXT"/* 0003 */, /*4*/"END OF TRANSMISSION"/* 0004 */,/*5*/"ENQUIRY"/* 0005 */,/*6*/"ACKNOWLEDGE"/* 0006 */,/*7*/"BELL"/* 0007 */, /*8*/"BACKSPACE"/* 0008 */,/*9*/"CHARACTER TABULATION"/* 0009 */,/*10*/"LINE FEED (LF)"/* 000A */, /*11*/"LINE TABULATION"/* 000B */,/*12*/"FORM FEED (FF)"/* 000C */,/*13*/"CARRIAGE RETURN (CR)"/* 000D */, /*14*/"SHIFT OUT"/* 000E */,/*15*/"SHIFT IN"/* 000F */,/*16*/"DATA LINK ESCAPE"/* 0010 */, /*17*/"DEVICE CONTROL ONE"/* 0011 */,/*18*/"DEVICE CONTROL TWO"/* 0012 */,/*19*/"DEVICE CONTROL THREE"/* 0013 */, /*20*/"DEVICE CONTROL FOUR"/* 0014 */,/*21*/"NEGATIVE ACKNOWLEDGE"/* 0015 */,/*22*/"SYNCHRONOUS IDLE"/* 0016 */, /*23*/"END OF TRANSMISSION BLOCK"/* 0017 */,/*24*/"CANCEL"/* 0018 */,/*25*/"END OF MEDIUM"/* 0019 */, /*26*/"SUBSTITUTE"/* 001A */,/*27*/"ESCAPE"/* 001B */,/*28*/"INFORMATION SEPARATOR FOUR"/* 001C */, /*29*/"INFORMATION SEPARATOR THREE"/* 001D */,/*30*/"INFORMATION SEPARATOR TWO"/* 001E */, /*31*/"INFORMATION SEPARATOR ONE"/* 001F */,/*32*/"SPACE"/* 0020 */,/*33*/"EXCLAMATION MARK"/* 0021 */, /*34*/"QUOTATION MARK"/* 0022 */,/*35*/"NUMBER SIGN"/* 0023 */,/*36*/"DOLLAR SIGN"/* 0024 */, /*37*/"PERCENT SIGN"/* 0025 */,/*38*/"AMPERSAND"/* 0026 */,/*39*/"APOSTROPHE"/* 0027 */, /*40*/"LEFT PARENTHESIS"/* 0028 */,/*41*/"RIGHT PARENTHESIS"/* 0029 */,/*42*/"ASTERISK"/* 002A */, /*43*/"PLUS SIGN"/* 002B */,/*44*/"COMMA"/* 002C */,/*45*/"HYPHEN-MINUS"/* 002D */,/*46*/"FULL STOP"/* 002E */, /*47*/"SOLIDUS"/* 002F */,/*48*/"DIGIT ZERO"/* 0030 */,/*49*/"DIGIT ONE"/* 0031 */,/*50*/"DIGIT TWO"/* 0032 */, /*51*/"DIGIT THREE"/* 0033 */,/*52*/"DIGIT FOUR"/* 0034 */,/*53*/"DIGIT FIVE"/* 0035 */,/*54*/"DIGIT SIX"/* 0036 */, /*55*/"DIGIT SEVEN"/* 0037 */,/*56*/"DIGIT EIGHT"/* 0038 */,/*57*/"DIGIT NINE"/* 0039 */,/*58*/"COLON"/* 003A */, /*59*/"SEMICOLON"/* 003B */,/*60*/"LESS-THAN SIGN"/* 003C */,/*61*/"EQUALS SIGN"/* 003D */, /*62*/"GREATER-THAN SIGN"/* 003E */,/*63*/"QUESTION MARK"/* 003F */,/*64*/"COMMERCIAL AT"/* 0040 */, /*65*/"LATIN CAPITAL LETTER A"/* 0041 */,/*66*/"LATIN CAPITAL LETTER B"/* 0042 */, /*67*/"LATIN CAPITAL LETTER C"/* 0043 */,/*68*/"LATIN CAPITAL LETTER D"/* 0044 */, /*69*/"LATIN CAPITAL LETTER E"/* 0045 */,/*70*/"LATIN CAPITAL LETTER F"/* 0046 */, /*71*/"LATIN CAPITAL LETTER G"/* 0047 */,/*72*/"LATIN CAPITAL LETTER H"/* 0048 */, /*73*/"LATIN CAPITAL LETTER I"/* 0049 */,/*74*/"LATIN CAPITAL LETTER J"/* 004A */, /*75*/"LATIN CAPITAL LETTER K"/* 004B */,/*76*/"LATIN CAPITAL LETTER L"/* 004C */, /*77*/"LATIN CAPITAL LETTER M"/* 004D */,/*78*/"LATIN CAPITAL LETTER N"/* 004E */, /*79*/"LATIN CAPITAL LETTER O"/* 004F */,/*80*/"LATIN CAPITAL LETTER P"/* 0050 */, /*81*/"LATIN CAPITAL LETTER Q"/* 0051 */,/*82*/"LATIN CAPITAL LETTER R"/* 0052 */, /*83*/"LATIN CAPITAL LETTER S"/* 0053 */,/*84*/"LATIN CAPITAL LETTER T"/* 0054 */, /*85*/"LATIN CAPITAL LETTER U"/* 0055 */,/*86*/"LATIN CAPITAL LETTER V"/* 0056 */, /*87*/"LATIN CAPITAL LETTER W"/* 0057 */,/*88*/"LATIN CAPITAL LETTER X"/* 0058 */, /*89*/"LATIN CAPITAL LETTER Y"/* 0059 */,/*90*/"LATIN CAPITAL LETTER Z"/* 005A */,/*91*/"LEFT SQUARE BRACKET"/* 005B */, /*92*/"REVERSE SOLIDUS"/* 005C */,/*93*/"RIGHT SQUARE BRACKET"/* 005D */,/*94*/"CIRCUMFLEX ACCENT"/* 005E */, /*95*/"LOW LINE"/* 005F */,/*96*/"GRAVE ACCENT"/* 0060 */,/*97*/"LATIN SMALL LETTER A"/* 0061 */, /*98*/"LATIN SMALL LETTER B"/* 0062 */,/*99*/"LATIN SMALL LETTER C"/* 0063 */,/*100*/"LATIN SMALL LETTER D"/* 0064 */, /*101*/"LATIN SMALL LETTER E"/* 0065 */,/*102*/"LATIN SMALL LETTER F"/* 0066 */,/*103*/"LATIN SMALL LETTER G"/* 0067 */, /*104*/"LATIN SMALL LETTER H"/* 0068 */,/*105*/"LATIN SMALL LETTER I"/* 0069 */,/*106*/"LATIN SMALL LETTER J"/* 006A */, /*107*/"LATIN SMALL LETTER K"/* 006B */,/*108*/"LATIN SMALL LETTER L"/* 006C */,/*109*/"LATIN SMALL LETTER M"/* 006D */, /*110*/"LATIN SMALL LETTER N"/* 006E */,/*111*/"LATIN SMALL LETTER O"/* 006F */,/*112*/"LATIN SMALL LETTER P"/* 0070 */, /*113*/"LATIN SMALL LETTER Q"/* 0071 */,/*114*/"LATIN SMALL LETTER R"/* 0072 */,/*115*/"LATIN SMALL LETTER S"/* 0073 */, /*116*/"LATIN SMALL LETTER T"/* 0074 */,/*117*/"LATIN SMALL LETTER U"/* 0075 */,/*118*/"LATIN SMALL LETTER V"/* 0076 */, /*119*/"LATIN SMALL LETTER W"/* 0077 */,/*120*/"LATIN SMALL LETTER X"/* 0078 */,/*121*/"LATIN SMALL LETTER Y"/* 0079 */, /*122*/"LATIN SMALL LETTER Z"/* 007A */,/*123*/"LEFT CURLY BRACKET"/* 007B */,/*124*/"VERTICAL LINE"/* 007C */, /*125*/"RIGHT CURLY BRACKET"/* 007D */,/*126*/"TILDE"/* 007E */,/*127*/"DELETE"/* 007F */,/*128*/""/* 0080 */, /*129*/""/* 0081 */,/*130*/"BREAK PERMITTED HERE"/* 0082 */,/*131*/"NO BREAK HERE"/* 0083 */,/*132*/""/* 0084 */, /*133*/"NEXT LINE (NEL)"/* 0085 */,/*134*/"START OF SELECTED AREA"/* 0086 */,/*135*/"END OF SELECTED AREA"/* 0087 */, /*136*/"CHARACTER TABULATION SET"/* 0088 */,/*137*/"CHARACTER TABULATION WITH JUSTIFICATION"/* 0089 */, /*138*/"LINE TABULATION SET"/* 008A */,/*139*/"PARTIAL LINE FORWARD"/* 008B */,/*140*/"PARTIAL LINE BACKWARD"/* 008C */, /*141*/"REVERSE LINE FEED"/* 008D */,/*142*/"SINGLE SHIFT TWO"/* 008E */,/*143*/"SINGLE SHIFT THREE"/* 008F */, /*144*/"DEVICE CONTROL STRING"/* 0090 */,/*145*/"PRIVATE USE ONE"/* 0091 */,/*146*/"PRIVATE USE TWO"/* 0092 */, /*147*/"SET TRANSMIT STATE"/* 0093 */,/*148*/"CANCEL CHARACTER"/* 0094 */,/*149*/"MESSAGE WAITING"/* 0095 */, /*150*/"START OF GUARDED AREA"/* 0096 */,/*151*/"END OF GUARDED AREA"/* 0097 */,/*152*/"START OF STRING"/* 0098 */, /*153*/""/* 0099 */,/*154*/"SINGLE CHARACTER INTRODUCER"/* 009A */,/*155*/"CONTROL SEQUENCE INTRODUCER"/* 009B */, /*156*/"STRING TERMINATOR"/* 009C */,/*157*/"OPERATING SYSTEM COMMAND"/* 009D */,/*158*/"PRIVACY MESSAGE"/* 009E */, /*159*/"APPLICATION PROGRAM COMMAND"/* 009F */,/*160*/"NO-BREAK SPACE"/* 00A0 */, /*161*/"INVERTED EXCLAMATION MARK"/* 00A1 */,/*162*/"CENT SIGN"/* 00A2 */,/*163*/"POUND SIGN"/* 00A3 */, /*164*/"CURRENCY SIGN"/* 00A4 */,/*165*/"YEN SIGN"/* 00A5 */,/*166*/"BROKEN BAR"/* 00A6 */, /*167*/"SECTION SIGN"/* 00A7 */,/*168*/"DIAERESIS"/* 00A8 */,/*169*/"COPYRIGHT SIGN"/* 00A9 */, /*170*/"FEMININE ORDINAL INDICATOR"/* 00AA */,/*171*/"LEFT-POINTING DOUBLE ANGLE QUOTATION MARK"/* 00AB */, /*172*/"NOT SIGN"/* 00AC */,/*173*/"SOFT HYPHEN"/* 00AD */,/*174*/"REGISTERED SIGN"/* 00AE */,/*175*/"MACRON"/* 00AF */, /*176*/"DEGREE SIGN"/* 00B0 */,/*177*/"PLUS-MINUS SIGN"/* 00B1 */,/*178*/"SUPERSCRIPT TWO"/* 00B2 */, /*179*/"SUPERSCRIPT THREE"/* 00B3 */,/*180*/"ACUTE ACCENT"/* 00B4 */,/*181*/"MICRO SIGN"/* 00B5 */, /*182*/"PILCROW SIGN"/* 00B6 */,/*183*/"MIDDLE DOT"/* 00B7 */,/*184*/"CEDILLA"/* 00B8 */, /*185*/"SUPERSCRIPT ONE"/* 00B9 */,/*186*/"MASCULINE ORDINAL INDICATOR"/* 00BA */, /*187*/"RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK"/* 00BB */,/*188*/"VULGAR FRACTION ONE QUARTER"/* 00BC */, /*189*/"VULGAR FRACTION ONE HALF"/* 00BD */,/*190*/"VULGAR FRACTION THREE QUARTERS"/* 00BE */, /*191*/"INVERTED QUESTION MARK"/* 00BF */,/*192*/"LATIN CAPITAL LETTER A WITH GRAVE"/* 00C0 */, /*193*/"LATIN CAPITAL LETTER A WITH ACUTE"/* 00C1 */,/*194*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX"/* 00C2 */, /*195*/"LATIN CAPITAL LETTER A WITH TILDE"/* 00C3 */,/*196*/"LATIN CAPITAL LETTER A WITH DIAERESIS"/* 00C4 */, /*197*/"LATIN CAPITAL LETTER A WITH RING ABOVE"/* 00C5 */,/*198*/"LATIN CAPITAL LETTER AE"/* 00C6 */, /*199*/"LATIN CAPITAL LETTER C WITH CEDILLA"/* 00C7 */,/*200*/"LATIN CAPITAL LETTER E WITH GRAVE"/* 00C8 */, /*201*/"LATIN CAPITAL LETTER E WITH ACUTE"/* 00C9 */,/*202*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX"/* 00CA */, /*203*/"LATIN CAPITAL LETTER E WITH DIAERESIS"/* 00CB */,/*204*/"LATIN CAPITAL LETTER I WITH GRAVE"/* 00CC */, /*205*/"LATIN CAPITAL LETTER I WITH ACUTE"/* 00CD */,/*206*/"LATIN CAPITAL LETTER I WITH CIRCUMFLEX"/* 00CE */, /*207*/"LATIN CAPITAL LETTER I WITH DIAERESIS"/* 00CF */,/*208*/"LATIN CAPITAL LETTER ETH"/* 00D0 */, /*209*/"LATIN CAPITAL LETTER N WITH TILDE"/* 00D1 */,/*210*/"LATIN CAPITAL LETTER O WITH GRAVE"/* 00D2 */, /*211*/"LATIN CAPITAL LETTER O WITH ACUTE"/* 00D3 */,/*212*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX"/* 00D4 */, /*213*/"LATIN CAPITAL LETTER O WITH TILDE"/* 00D5 */,/*214*/"LATIN CAPITAL LETTER O WITH DIAERESIS"/* 00D6 */, /*215*/"MULTIPLICATION SIGN"/* 00D7 */,/*216*/"LATIN CAPITAL LETTER O WITH STROKE"/* 00D8 */, /*217*/"LATIN CAPITAL LETTER U WITH GRAVE"/* 00D9 */,/*218*/"LATIN CAPITAL LETTER U WITH ACUTE"/* 00DA */, /*219*/"LATIN CAPITAL LETTER U WITH CIRCUMFLEX"/* 00DB */,/*220*/"LATIN CAPITAL LETTER U WITH DIAERESIS"/* 00DC */, /*221*/"LATIN CAPITAL LETTER Y WITH ACUTE"/* 00DD */,/*222*/"LATIN CAPITAL LETTER THORN"/* 00DE */, /*223*/"LATIN SMALL LETTER SHARP S"/* 00DF */,/*224*/"LATIN SMALL LETTER A WITH GRAVE"/* 00E0 */, /*225*/"LATIN SMALL LETTER A WITH ACUTE"/* 00E1 */,/*226*/"LATIN SMALL LETTER A WITH CIRCUMFLEX"/* 00E2 */, /*227*/"LATIN SMALL LETTER A WITH TILDE"/* 00E3 */,/*228*/"LATIN SMALL LETTER A WITH DIAERESIS"/* 00E4 */, /*229*/"LATIN SMALL LETTER A WITH RING ABOVE"/* 00E5 */,/*230*/"LATIN SMALL LETTER AE"/* 00E6 */, /*231*/"LATIN SMALL LETTER C WITH CEDILLA"/* 00E7 */,/*232*/"LATIN SMALL LETTER E WITH GRAVE"/* 00E8 */, /*233*/"LATIN SMALL LETTER E WITH ACUTE"/* 00E9 */,/*234*/"LATIN SMALL LETTER E WITH CIRCUMFLEX"/* 00EA */, /*235*/"LATIN SMALL LETTER E WITH DIAERESIS"/* 00EB */,/*236*/"LATIN SMALL LETTER I WITH GRAVE"/* 00EC */, /*237*/"LATIN SMALL LETTER I WITH ACUTE"/* 00ED */,/*238*/"LATIN SMALL LETTER I WITH CIRCUMFLEX"/* 00EE */, /*239*/"LATIN SMALL LETTER I WITH DIAERESIS"/* 00EF */,/*240*/"LATIN SMALL LETTER ETH"/* 00F0 */, /*241*/"LATIN SMALL LETTER N WITH TILDE"/* 00F1 */,/*242*/"LATIN SMALL LETTER O WITH GRAVE"/* 00F2 */, /*243*/"LATIN SMALL LETTER O WITH ACUTE"/* 00F3 */,/*244*/"LATIN SMALL LETTER O WITH CIRCUMFLEX"/* 00F4 */, /*245*/"LATIN SMALL LETTER O WITH TILDE"/* 00F5 */,/*246*/"LATIN SMALL LETTER O WITH DIAERESIS"/* 00F6 */, /*247*/"DIVISION SIGN"/* 00F7 */,/*248*/"LATIN SMALL LETTER O WITH STROKE"/* 00F8 */, /*249*/"LATIN SMALL LETTER U WITH GRAVE"/* 00F9 */,/*250*/"LATIN SMALL LETTER U WITH ACUTE"/* 00FA */, /*251*/"LATIN SMALL LETTER U WITH CIRCUMFLEX"/* 00FB */,/*252*/"LATIN SMALL LETTER U WITH DIAERESIS"/* 00FC */, /*253*/"LATIN SMALL LETTER Y WITH ACUTE"/* 00FD */,/*254*/"LATIN SMALL LETTER THORN"/* 00FE */, /*255*/"LATIN SMALL LETTER Y WITH DIAERESIS"/* 00FF */,/*256*/"LATIN CAPITAL LETTER A WITH MACRON"/* 0100 */, /*257*/"LATIN SMALL LETTER A WITH MACRON"/* 0101 */,/*258*/"LATIN CAPITAL LETTER A WITH BREVE"/* 0102 */, /*259*/"LATIN SMALL LETTER A WITH BREVE"/* 0103 */,/*260*/"LATIN CAPITAL LETTER A WITH OGONEK"/* 0104 */, /*261*/"LATIN SMALL LETTER A WITH OGONEK"/* 0105 */,/*262*/"LATIN CAPITAL LETTER C WITH ACUTE"/* 0106 */, /*263*/"LATIN SMALL LETTER C WITH ACUTE"/* 0107 */,/*264*/"LATIN CAPITAL LETTER C WITH CIRCUMFLEX"/* 0108 */, /*265*/"LATIN SMALL LETTER C WITH CIRCUMFLEX"/* 0109 */,/*266*/"LATIN CAPITAL LETTER C WITH DOT ABOVE"/* 010A */, /*267*/"LATIN SMALL LETTER C WITH DOT ABOVE"/* 010B */,/*268*/"LATIN CAPITAL LETTER C WITH CARON"/* 010C */, /*269*/"LATIN SMALL LETTER C WITH CARON"/* 010D */,/*270*/"LATIN CAPITAL LETTER D WITH CARON"/* 010E */, /*271*/"LATIN SMALL LETTER D WITH CARON"/* 010F */,/*272*/"LATIN CAPITAL LETTER D WITH STROKE"/* 0110 */, /*273*/"LATIN SMALL LETTER D WITH STROKE"/* 0111 */,/*274*/"LATIN CAPITAL LETTER E WITH MACRON"/* 0112 */, /*275*/"LATIN SMALL LETTER E WITH MACRON"/* 0113 */,/*276*/"LATIN CAPITAL LETTER E WITH BREVE"/* 0114 */, /*277*/"LATIN SMALL LETTER E WITH BREVE"/* 0115 */,/*278*/"LATIN CAPITAL LETTER E WITH DOT ABOVE"/* 0116 */, /*279*/"LATIN SMALL LETTER E WITH DOT ABOVE"/* 0117 */,/*280*/"LATIN CAPITAL LETTER E WITH OGONEK"/* 0118 */, /*281*/"LATIN SMALL LETTER E WITH OGONEK"/* 0119 */,/*282*/"LATIN CAPITAL LETTER E WITH CARON"/* 011A */, /*283*/"LATIN SMALL LETTER E WITH CARON"/* 011B */,/*284*/"LATIN CAPITAL LETTER G WITH CIRCUMFLEX"/* 011C */, /*285*/"LATIN SMALL LETTER G WITH CIRCUMFLEX"/* 011D */,/*286*/"LATIN CAPITAL LETTER G WITH BREVE"/* 011E */, /*287*/"LATIN SMALL LETTER G WITH BREVE"/* 011F */,/*288*/"LATIN CAPITAL LETTER G WITH DOT ABOVE"/* 0120 */, /*289*/"LATIN SMALL LETTER G WITH DOT ABOVE"/* 0121 */,/*290*/"LATIN CAPITAL LETTER G WITH CEDILLA"/* 0122 */, /*291*/"LATIN SMALL LETTER G WITH CEDILLA"/* 0123 */,/*292*/"LATIN CAPITAL LETTER H WITH CIRCUMFLEX"/* 0124 */, /*293*/"LATIN SMALL LETTER H WITH CIRCUMFLEX"/* 0125 */,/*294*/"LATIN CAPITAL LETTER H WITH STROKE"/* 0126 */, /*295*/"LATIN SMALL LETTER H WITH STROKE"/* 0127 */,/*296*/"LATIN CAPITAL LETTER I WITH TILDE"/* 0128 */, /*297*/"LATIN SMALL LETTER I WITH TILDE"/* 0129 */,/*298*/"LATIN CAPITAL LETTER I WITH MACRON"/* 012A */, /*299*/"LATIN SMALL LETTER I WITH MACRON"/* 012B */,/*300*/"LATIN CAPITAL LETTER I WITH BREVE"/* 012C */, /*301*/"LATIN SMALL LETTER I WITH BREVE"/* 012D */,/*302*/"LATIN CAPITAL LETTER I WITH OGONEK"/* 012E */, /*303*/"LATIN SMALL LETTER I WITH OGONEK"/* 012F */,/*304*/"LATIN CAPITAL LETTER I WITH DOT ABOVE"/* 0130 */, /*305*/"LATIN SMALL LETTER DOTLESS I"/* 0131 */,/*306*/"LATIN CAPITAL LIGATURE IJ"/* 0132 */, /*307*/"LATIN SMALL LIGATURE IJ"/* 0133 */,/*308*/"LATIN CAPITAL LETTER J WITH CIRCUMFLEX"/* 0134 */, /*309*/"LATIN SMALL LETTER J WITH CIRCUMFLEX"/* 0135 */,/*310*/"LATIN CAPITAL LETTER K WITH CEDILLA"/* 0136 */, /*311*/"LATIN SMALL LETTER K WITH CEDILLA"/* 0137 */,/*312*/"LATIN SMALL LETTER KRA"/* 0138 */, /*313*/"LATIN CAPITAL LETTER L WITH ACUTE"/* 0139 */,/*314*/"LATIN SMALL LETTER L WITH ACUTE"/* 013A */, /*315*/"LATIN CAPITAL LETTER L WITH CEDILLA"/* 013B */,/*316*/"LATIN SMALL LETTER L WITH CEDILLA"/* 013C */, /*317*/"LATIN CAPITAL LETTER L WITH CARON"/* 013D */,/*318*/"LATIN SMALL LETTER L WITH CARON"/* 013E */, /*319*/"LATIN CAPITAL LETTER L WITH MIDDLE DOT"/* 013F */,/*320*/"LATIN SMALL LETTER L WITH MIDDLE DOT"/* 0140 */, /*321*/"LATIN CAPITAL LETTER L WITH STROKE"/* 0141 */,/*322*/"LATIN SMALL LETTER L WITH STROKE"/* 0142 */, /*323*/"LATIN CAPITAL LETTER N WITH ACUTE"/* 0143 */,/*324*/"LATIN SMALL LETTER N WITH ACUTE"/* 0144 */, /*325*/"LATIN CAPITAL LETTER N WITH CEDILLA"/* 0145 */,/*326*/"LATIN SMALL LETTER N WITH CEDILLA"/* 0146 */, /*327*/"LATIN CAPITAL LETTER N WITH CARON"/* 0147 */,/*328*/"LATIN SMALL LETTER N WITH CARON"/* 0148 */, /*329*/"LATIN SMALL LETTER N PRECEDED BY APOSTROPHE"/* 0149 */,/*330*/"LATIN CAPITAL LETTER ENG"/* 014A */, /*331*/"LATIN SMALL LETTER ENG"/* 014B */,/*332*/"LATIN CAPITAL LETTER O WITH MACRON"/* 014C */, /*333*/"LATIN SMALL LETTER O WITH MACRON"/* 014D */,/*334*/"LATIN CAPITAL LETTER O WITH BREVE"/* 014E */, /*335*/"LATIN SMALL LETTER O WITH BREVE"/* 014F */,/*336*/"LATIN CAPITAL LETTER O WITH DOUBLE ACUTE"/* 0150 */, /*337*/"LATIN SMALL LETTER O WITH DOUBLE ACUTE"/* 0151 */,/*338*/"LATIN CAPITAL LIGATURE OE"/* 0152 */, /*339*/"LATIN SMALL LIGATURE OE"/* 0153 */,/*340*/"LATIN CAPITAL LETTER R WITH ACUTE"/* 0154 */, /*341*/"LATIN SMALL LETTER R WITH ACUTE"/* 0155 */,/*342*/"LATIN CAPITAL LETTER R WITH CEDILLA"/* 0156 */, /*343*/"LATIN SMALL LETTER R WITH CEDILLA"/* 0157 */,/*344*/"LATIN CAPITAL LETTER R WITH CARON"/* 0158 */, /*345*/"LATIN SMALL LETTER R WITH CARON"/* 0159 */,/*346*/"LATIN CAPITAL LETTER S WITH ACUTE"/* 015A */, /*347*/"LATIN SMALL LETTER S WITH ACUTE"/* 015B */,/*348*/"LATIN CAPITAL LETTER S WITH CIRCUMFLEX"/* 015C */, /*349*/"LATIN SMALL LETTER S WITH CIRCUMFLEX"/* 015D */,/*350*/"LATIN CAPITAL LETTER S WITH CEDILLA"/* 015E */, /*351*/"LATIN SMALL LETTER S WITH CEDILLA"/* 015F */,/*352*/"LATIN CAPITAL LETTER S WITH CARON"/* 0160 */, /*353*/"LATIN SMALL LETTER S WITH CARON"/* 0161 */,/*354*/"LATIN CAPITAL LETTER T WITH CEDILLA"/* 0162 */, /*355*/"LATIN SMALL LETTER T WITH CEDILLA"/* 0163 */,/*356*/"LATIN CAPITAL LETTER T WITH CARON"/* 0164 */, /*357*/"LATIN SMALL LETTER T WITH CARON"/* 0165 */,/*358*/"LATIN CAPITAL LETTER T WITH STROKE"/* 0166 */, /*359*/"LATIN SMALL LETTER T WITH STROKE"/* 0167 */,/*360*/"LATIN CAPITAL LETTER U WITH TILDE"/* 0168 */, /*361*/"LATIN SMALL LETTER U WITH TILDE"/* 0169 */,/*362*/"LATIN CAPITAL LETTER U WITH MACRON"/* 016A */, /*363*/"LATIN SMALL LETTER U WITH MACRON"/* 016B */,/*364*/"LATIN CAPITAL LETTER U WITH BREVE"/* 016C */, /*365*/"LATIN SMALL LETTER U WITH BREVE"/* 016D */,/*366*/"LATIN CAPITAL LETTER U WITH RING ABOVE"/* 016E */, /*367*/"LATIN SMALL LETTER U WITH RING ABOVE"/* 016F */,/*368*/"LATIN CAPITAL LETTER U WITH DOUBLE ACUTE"/* 0170 */, /*369*/"LATIN SMALL LETTER U WITH DOUBLE ACUTE"/* 0171 */,/*370*/"LATIN CAPITAL LETTER U WITH OGONEK"/* 0172 */, /*371*/"LATIN SMALL LETTER U WITH OGONEK"/* 0173 */,/*372*/"LATIN CAPITAL LETTER W WITH CIRCUMFLEX"/* 0174 */, /*373*/"LATIN SMALL LETTER W WITH CIRCUMFLEX"/* 0175 */,/*374*/"LATIN CAPITAL LETTER Y WITH CIRCUMFLEX"/* 0176 */, /*375*/"LATIN SMALL LETTER Y WITH CIRCUMFLEX"/* 0177 */,/*376*/"LATIN CAPITAL LETTER Y WITH DIAERESIS"/* 0178 */, /*377*/"LATIN CAPITAL LETTER Z WITH ACUTE"/* 0179 */,/*378*/"LATIN SMALL LETTER Z WITH ACUTE"/* 017A */, /*379*/"LATIN CAPITAL LETTER Z WITH DOT ABOVE"/* 017B */,/*380*/"LATIN SMALL LETTER Z WITH DOT ABOVE"/* 017C */, /*381*/"LATIN CAPITAL LETTER Z WITH CARON"/* 017D */,/*382*/"LATIN SMALL LETTER Z WITH CARON"/* 017E */, /*383*/"LATIN SMALL LETTER LONG S"/* 017F */,/*384*/"LATIN SMALL LETTER B WITH STROKE"/* 0180 */, /*385*/"LATIN CAPITAL LETTER B WITH HOOK"/* 0181 */,/*386*/"LATIN CAPITAL LETTER B WITH TOPBAR"/* 0182 */, /*387*/"LATIN SMALL LETTER B WITH TOPBAR"/* 0183 */,/*388*/"LATIN CAPITAL LETTER TONE SIX"/* 0184 */, /*389*/"LATIN SMALL LETTER TONE SIX"/* 0185 */,/*390*/"LATIN CAPITAL LETTER OPEN O"/* 0186 */, /*391*/"LATIN CAPITAL LETTER C WITH HOOK"/* 0187 */,/*392*/"LATIN SMALL LETTER C WITH HOOK"/* 0188 */, /*393*/"LATIN CAPITAL LETTER AFRICAN D"/* 0189 */,/*394*/"LATIN CAPITAL LETTER D WITH HOOK"/* 018A */, /*395*/"LATIN CAPITAL LETTER D WITH TOPBAR"/* 018B */,/*396*/"LATIN SMALL LETTER D WITH TOPBAR"/* 018C */, /*397*/"LATIN SMALL LETTER TURNED DELTA"/* 018D */,/*398*/"LATIN CAPITAL LETTER REVERSED E"/* 018E */, /*399*/"LATIN CAPITAL LETTER SCHWA"/* 018F */,/*400*/"LATIN CAPITAL LETTER OPEN E"/* 0190 */, /*401*/"LATIN CAPITAL LETTER F WITH HOOK"/* 0191 */,/*402*/"LATIN SMALL LETTER F WITH HOOK"/* 0192 */, /*403*/"LATIN CAPITAL LETTER G WITH HOOK"/* 0193 */,/*404*/"LATIN CAPITAL LETTER GAMMA"/* 0194 */, /*405*/"LATIN SMALL LETTER HV"/* 0195 */,/*406*/"LATIN CAPITAL LETTER IOTA"/* 0196 */, /*407*/"LATIN CAPITAL LETTER I WITH STROKE"/* 0197 */,/*408*/"LATIN CAPITAL LETTER K WITH HOOK"/* 0198 */, /*409*/"LATIN SMALL LETTER K WITH HOOK"/* 0199 */,/*410*/"LATIN SMALL LETTER L WITH BAR"/* 019A */, /*411*/"LATIN SMALL LETTER LAMBDA WITH STROKE"/* 019B */,/*412*/"LATIN CAPITAL LETTER TURNED M"/* 019C */, /*413*/"LATIN CAPITAL LETTER N WITH LEFT HOOK"/* 019D */,/*414*/"LATIN SMALL LETTER N WITH LONG RIGHT LEG"/* 019E */, /*415*/"LATIN CAPITAL LETTER O WITH MIDDLE TILDE"/* 019F */,/*416*/"LATIN CAPITAL LETTER O WITH HORN"/* 01A0 */, /*417*/"LATIN SMALL LETTER O WITH HORN"/* 01A1 */,/*418*/"LATIN CAPITAL LETTER OI"/* 01A2 */, /*419*/"LATIN SMALL LETTER OI"/* 01A3 */,/*420*/"LATIN CAPITAL LETTER P WITH HOOK"/* 01A4 */, /*421*/"LATIN SMALL LETTER P WITH HOOK"/* 01A5 */,/*422*/"LATIN LETTER YR"/* 01A6 */, /*423*/"LATIN CAPITAL LETTER TONE TWO"/* 01A7 */,/*424*/"LATIN SMALL LETTER TONE TWO"/* 01A8 */, /*425*/"LATIN CAPITAL LETTER ESH"/* 01A9 */,/*426*/"LATIN LETTER REVERSED ESH LOOP"/* 01AA */, /*427*/"LATIN SMALL LETTER T WITH PALATAL HOOK"/* 01AB */,/*428*/"LATIN CAPITAL LETTER T WITH HOOK"/* 01AC */, /*429*/"LATIN SMALL LETTER T WITH HOOK"/* 01AD */,/*430*/"LATIN CAPITAL LETTER T WITH RETROFLEX HOOK"/* 01AE */, /*431*/"LATIN CAPITAL LETTER U WITH HORN"/* 01AF */,/*432*/"LATIN SMALL LETTER U WITH HORN"/* 01B0 */, /*433*/"LATIN CAPITAL LETTER UPSILON"/* 01B1 */,/*434*/"LATIN CAPITAL LETTER V WITH HOOK"/* 01B2 */, /*435*/"LATIN CAPITAL LETTER Y WITH HOOK"/* 01B3 */,/*436*/"LATIN SMALL LETTER Y WITH HOOK"/* 01B4 */, /*437*/"LATIN CAPITAL LETTER Z WITH STROKE"/* 01B5 */,/*438*/"LATIN SMALL LETTER Z WITH STROKE"/* 01B6 */, /*439*/"LATIN CAPITAL LETTER EZH"/* 01B7 */,/*440*/"LATIN CAPITAL LETTER EZH REVERSED"/* 01B8 */, /*441*/"LATIN SMALL LETTER EZH REVERSED"/* 01B9 */,/*442*/"LATIN SMALL LETTER EZH WITH TAIL"/* 01BA */, /*443*/"LATIN LETTER TWO WITH STROKE"/* 01BB */,/*444*/"LATIN CAPITAL LETTER TONE FIVE"/* 01BC */, /*445*/"LATIN SMALL LETTER TONE FIVE"/* 01BD */,/*446*/"LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE"/* 01BE */, /*447*/"LATIN LETTER WYNN"/* 01BF */,/*448*/"LATIN LETTER DENTAL CLICK"/* 01C0 */, /*449*/"LATIN LETTER LATERAL CLICK"/* 01C1 */,/*450*/"LATIN LETTER ALVEOLAR CLICK"/* 01C2 */, /*451*/"LATIN LETTER RETROFLEX CLICK"/* 01C3 */,/*452*/"LATIN CAPITAL LETTER DZ WITH CARON"/* 01C4 */, /*453*/"LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON"/* 01C5 */, /*454*/"LATIN SMALL LETTER DZ WITH CARON"/* 01C6 */,/*455*/"LATIN CAPITAL LETTER LJ"/* 01C7 */, /*456*/"LATIN CAPITAL LETTER L WITH SMALL LETTER J"/* 01C8 */,/*457*/"LATIN SMALL LETTER LJ"/* 01C9 */, /*458*/"LATIN CAPITAL LETTER NJ"/* 01CA */,/*459*/"LATIN CAPITAL LETTER N WITH SMALL LETTER J"/* 01CB */, /*460*/"LATIN SMALL LETTER NJ"/* 01CC */,/*461*/"LATIN CAPITAL LETTER A WITH CARON"/* 01CD */, /*462*/"LATIN SMALL LETTER A WITH CARON"/* 01CE */,/*463*/"LATIN CAPITAL LETTER I WITH CARON"/* 01CF */, /*464*/"LATIN SMALL LETTER I WITH CARON"/* 01D0 */,/*465*/"LATIN CAPITAL LETTER O WITH CARON"/* 01D1 */, /*466*/"LATIN SMALL LETTER O WITH CARON"/* 01D2 */,/*467*/"LATIN CAPITAL LETTER U WITH CARON"/* 01D3 */, /*468*/"LATIN SMALL LETTER U WITH CARON"/* 01D4 */,/*469*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON"/* 01D5 */, /*470*/"LATIN SMALL LETTER U WITH DIAERESIS AND MACRON"/* 01D6 */, /*471*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE"/* 01D7 */, /*472*/"LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE"/* 01D8 */, /*473*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON"/* 01D9 */, /*474*/"LATIN SMALL LETTER U WITH DIAERESIS AND CARON"/* 01DA */, /*475*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE"/* 01DB */, /*476*/"LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE"/* 01DC */,/*477*/"LATIN SMALL LETTER TURNED E"/* 01DD */, /*478*/"LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON"/* 01DE */, /*479*/"LATIN SMALL LETTER A WITH DIAERESIS AND MACRON"/* 01DF */, /*480*/"LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON"/* 01E0 */, /*481*/"LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON"/* 01E1 */,/*482*/"LATIN CAPITAL LETTER AE WITH MACRON"/* 01E2 */, /*483*/"LATIN SMALL LETTER AE WITH MACRON"/* 01E3 */,/*484*/"LATIN CAPITAL LETTER G WITH STROKE"/* 01E4 */, /*485*/"LATIN SMALL LETTER G WITH STROKE"/* 01E5 */,/*486*/"LATIN CAPITAL LETTER G WITH CARON"/* 01E6 */, /*487*/"LATIN SMALL LETTER G WITH CARON"/* 01E7 */,/*488*/"LATIN CAPITAL LETTER K WITH CARON"/* 01E8 */, /*489*/"LATIN SMALL LETTER K WITH CARON"/* 01E9 */,/*490*/"LATIN CAPITAL LETTER O WITH OGONEK"/* 01EA */, /*491*/"LATIN SMALL LETTER O WITH OGONEK"/* 01EB */,/*492*/"LATIN CAPITAL LETTER O WITH OGONEK AND MACRON"/* 01EC */, /*493*/"LATIN SMALL LETTER O WITH OGONEK AND MACRON"/* 01ED */,/*494*/"LATIN CAPITAL LETTER EZH WITH CARON"/* 01EE */, /*495*/"LATIN SMALL LETTER EZH WITH CARON"/* 01EF */,/*496*/"LATIN SMALL LETTER J WITH CARON"/* 01F0 */, /*497*/"LATIN CAPITAL LETTER DZ"/* 01F1 */,/*498*/"LATIN CAPITAL LETTER D WITH SMALL LETTER Z"/* 01F2 */, /*499*/"LATIN SMALL LETTER DZ"/* 01F3 */,/*500*/"LATIN CAPITAL LETTER G WITH ACUTE"/* 01F4 */, /*501*/"LATIN SMALL LETTER G WITH ACUTE"/* 01F5 */,/*502*/"LATIN CAPITAL LETTER HWAIR"/* 01F6 */, /*503*/"LATIN CAPITAL LETTER WYNN"/* 01F7 */,/*504*/"LATIN CAPITAL LETTER N WITH GRAVE"/* 01F8 */, /*505*/"LATIN SMALL LETTER N WITH GRAVE"/* 01F9 */,/*506*/"LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE"/* 01FA */, /*507*/"LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE"/* 01FB */,/*508*/"LATIN CAPITAL LETTER AE WITH ACUTE"/* 01FC */, /*509*/"LATIN SMALL LETTER AE WITH ACUTE"/* 01FD */,/*510*/"LATIN CAPITAL LETTER O WITH STROKE AND ACUTE"/* 01FE */, /*511*/"LATIN SMALL LETTER O WITH STROKE AND ACUTE"/* 01FF */, /*512*/"LATIN CAPITAL LETTER A WITH DOUBLE GRAVE"/* 0200 */,/*513*/"LATIN SMALL LETTER A WITH DOUBLE GRAVE"/* 0201 */, /*514*/"LATIN CAPITAL LETTER A WITH INVERTED BREVE"/* 0202 */, /*515*/"LATIN SMALL LETTER A WITH INVERTED BREVE"/* 0203 */,/*516*/"LATIN CAPITAL LETTER E WITH DOUBLE GRAVE"/* 0204 */, /*517*/"LATIN SMALL LETTER E WITH DOUBLE GRAVE"/* 0205 */,/*518*/"LATIN CAPITAL LETTER E WITH INVERTED BREVE"/* 0206 */, /*519*/"LATIN SMALL LETTER E WITH INVERTED BREVE"/* 0207 */,/*520*/"LATIN CAPITAL LETTER I WITH DOUBLE GRAVE"/* 0208 */, /*521*/"LATIN SMALL LETTER I WITH DOUBLE GRAVE"/* 0209 */,/*522*/"LATIN CAPITAL LETTER I WITH INVERTED BREVE"/* 020A */, /*523*/"LATIN SMALL LETTER I WITH INVERTED BREVE"/* 020B */,/*524*/"LATIN CAPITAL LETTER O WITH DOUBLE GRAVE"/* 020C */, /*525*/"LATIN SMALL LETTER O WITH DOUBLE GRAVE"/* 020D */,/*526*/"LATIN CAPITAL LETTER O WITH INVERTED BREVE"/* 020E */, /*527*/"LATIN SMALL LETTER O WITH INVERTED BREVE"/* 020F */,/*528*/"LATIN CAPITAL LETTER R WITH DOUBLE GRAVE"/* 0210 */, /*529*/"LATIN SMALL LETTER R WITH DOUBLE GRAVE"/* 0211 */,/*530*/"LATIN CAPITAL LETTER R WITH INVERTED BREVE"/* 0212 */, /*531*/"LATIN SMALL LETTER R WITH INVERTED BREVE"/* 0213 */,/*532*/"LATIN CAPITAL LETTER U WITH DOUBLE GRAVE"/* 0214 */, /*533*/"LATIN SMALL LETTER U WITH DOUBLE GRAVE"/* 0215 */,/*534*/"LATIN CAPITAL LETTER U WITH INVERTED BREVE"/* 0216 */, /*535*/"LATIN SMALL LETTER U WITH INVERTED BREVE"/* 0217 */,/*536*/"LATIN CAPITAL LETTER S WITH COMMA BELOW"/* 0218 */, /*537*/"LATIN SMALL LETTER S WITH COMMA BELOW"/* 0219 */,/*538*/"LATIN CAPITAL LETTER T WITH COMMA BELOW"/* 021A */, /*539*/"LATIN SMALL LETTER T WITH COMMA BELOW"/* 021B */,/*540*/"LATIN CAPITAL LETTER YOGH"/* 021C */, /*541*/"LATIN SMALL LETTER YOGH"/* 021D */,/*542*/"LATIN CAPITAL LETTER H WITH CARON"/* 021E */, /*543*/"LATIN SMALL LETTER H WITH CARON"/* 021F */,/*544*/"LATIN CAPITAL LETTER N WITH LONG RIGHT LEG"/* 0220 */, /*545*/"LATIN SMALL LETTER D WITH CURL"/* 0221 */,/*546*/"LATIN CAPITAL LETTER OU"/* 0222 */, /*547*/"LATIN SMALL LETTER OU"/* 0223 */,/*548*/"LATIN CAPITAL LETTER Z WITH HOOK"/* 0224 */, /*549*/"LATIN SMALL LETTER Z WITH HOOK"/* 0225 */,/*550*/"LATIN CAPITAL LETTER A WITH DOT ABOVE"/* 0226 */, /*551*/"LATIN SMALL LETTER A WITH DOT ABOVE"/* 0227 */,/*552*/"LATIN CAPITAL LETTER E WITH CEDILLA"/* 0228 */, /*553*/"LATIN SMALL LETTER E WITH CEDILLA"/* 0229 */,/*554*/"LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON"/* 022A */, /*555*/"LATIN SMALL LETTER O WITH DIAERESIS AND MACRON"/* 022B */, /*556*/"LATIN CAPITAL LETTER O WITH TILDE AND MACRON"/* 022C */, /*557*/"LATIN SMALL LETTER O WITH TILDE AND MACRON"/* 022D */,/*558*/"LATIN CAPITAL LETTER O WITH DOT ABOVE"/* 022E */, /*559*/"LATIN SMALL LETTER O WITH DOT ABOVE"/* 022F */, /*560*/"LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON"/* 0230 */, /*561*/"LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON"/* 0231 */,/*562*/"LATIN CAPITAL LETTER Y WITH MACRON"/* 0232 */, /*563*/"LATIN SMALL LETTER Y WITH MACRON"/* 0233 */,/*564*/"LATIN SMALL LETTER L WITH CURL"/* 0234 */, /*565*/"LATIN SMALL LETTER N WITH CURL"/* 0235 */,/*566*/"LATIN SMALL LETTER T WITH CURL"/* 0236 */, /*567*/"LATIN SMALL LETTER DOTLESS J"/* 0237 */,/*568*/"LATIN SMALL LETTER DB DIGRAPH"/* 0238 */, /*569*/"LATIN SMALL LETTER QP DIGRAPH"/* 0239 */,/*570*/"LATIN CAPITAL LETTER A WITH STROKE"/* 023A */, /*571*/"LATIN CAPITAL LETTER C WITH STROKE"/* 023B */,/*572*/"LATIN SMALL LETTER C WITH STROKE"/* 023C */, /*573*/"LATIN CAPITAL LETTER L WITH BAR"/* 023D */,/*574*/"LATIN CAPITAL LETTER T WITH DIAGONAL STROKE"/* 023E */, /*575*/"LATIN SMALL LETTER S WITH SWASH TAIL"/* 023F */,/*576*/"LATIN SMALL LETTER Z WITH SWASH TAIL"/* 0240 */, /*577*/"LATIN CAPITAL LETTER GLOTTAL STOP"/* 0241 */,/*578*/"LATIN SMALL LETTER GLOTTAL STOP"/* 0242 */, /*579*/"LATIN CAPITAL LETTER B WITH STROKE"/* 0243 */,/*580*/"LATIN CAPITAL LETTER U BAR"/* 0244 */, /*581*/"LATIN CAPITAL LETTER TURNED V"/* 0245 */,/*582*/"LATIN CAPITAL LETTER E WITH STROKE"/* 0246 */, /*583*/"LATIN SMALL LETTER E WITH STROKE"/* 0247 */,/*584*/"LATIN CAPITAL LETTER J WITH STROKE"/* 0248 */, /*585*/"LATIN SMALL LETTER J WITH STROKE"/* 0249 */,/*586*/"LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL"/* 024A */, /*587*/"LATIN SMALL LETTER Q WITH HOOK TAIL"/* 024B */,/*588*/"LATIN CAPITAL LETTER R WITH STROKE"/* 024C */, /*589*/"LATIN SMALL LETTER R WITH STROKE"/* 024D */,/*590*/"LATIN CAPITAL LETTER Y WITH STROKE"/* 024E */, /*591*/"LATIN SMALL LETTER Y WITH STROKE"/* 024F */,/*592*/"LATIN SMALL LETTER TURNED A"/* 0250 */, /*593*/"LATIN SMALL LETTER ALPHA"/* 0251 */,/*594*/"LATIN SMALL LETTER TURNED ALPHA"/* 0252 */, /*595*/"LATIN SMALL LETTER B WITH HOOK"/* 0253 */,/*596*/"LATIN SMALL LETTER OPEN O"/* 0254 */, /*597*/"LATIN SMALL LETTER C WITH CURL"/* 0255 */,/*598*/"LATIN SMALL LETTER D WITH TAIL"/* 0256 */, /*599*/"LATIN SMALL LETTER D WITH HOOK"/* 0257 */,/*600*/"LATIN SMALL LETTER REVERSED E"/* 0258 */, /*601*/"LATIN SMALL LETTER SCHWA"/* 0259 */,/*602*/"LATIN SMALL LETTER SCHWA WITH HOOK"/* 025A */, /*603*/"LATIN SMALL LETTER OPEN E"/* 025B */,/*604*/"LATIN SMALL LETTER REVERSED OPEN E"/* 025C */, /*605*/"LATIN SMALL LETTER REVERSED OPEN E WITH HOOK"/* 025D */, /*606*/"LATIN SMALL LETTER CLOSED REVERSED OPEN E"/* 025E */,/*607*/"LATIN SMALL LETTER DOTLESS J WITH STROKE"/* 025F */, /*608*/"LATIN SMALL LETTER G WITH HOOK"/* 0260 */,/*609*/"LATIN SMALL LETTER SCRIPT G"/* 0261 */, /*610*/"LATIN LETTER SMALL CAPITAL G"/* 0262 */,/*611*/"LATIN SMALL LETTER GAMMA"/* 0263 */, /*612*/"LATIN SMALL LETTER RAMS HORN"/* 0264 */,/*613*/"LATIN SMALL LETTER TURNED H"/* 0265 */, /*614*/"LATIN SMALL LETTER H WITH HOOK"/* 0266 */,/*615*/"LATIN SMALL LETTER HENG WITH HOOK"/* 0267 */, /*616*/"LATIN SMALL LETTER I WITH STROKE"/* 0268 */,/*617*/"LATIN SMALL LETTER IOTA"/* 0269 */, /*618*/"LATIN LETTER SMALL CAPITAL I"/* 026A */,/*619*/"LATIN SMALL LETTER L WITH MIDDLE TILDE"/* 026B */, /*620*/"LATIN SMALL LETTER L WITH BELT"/* 026C */,/*621*/"LATIN SMALL LETTER L WITH RETROFLEX HOOK"/* 026D */, /*622*/"LATIN SMALL LETTER LEZH"/* 026E */,/*623*/"LATIN SMALL LETTER TURNED M"/* 026F */, /*624*/"LATIN SMALL LETTER TURNED M WITH LONG LEG"/* 0270 */,/*625*/"LATIN SMALL LETTER M WITH HOOK"/* 0271 */, /*626*/"LATIN SMALL LETTER N WITH LEFT HOOK"/* 0272 */,/*627*/"LATIN SMALL LETTER N WITH RETROFLEX HOOK"/* 0273 */, /*628*/"LATIN LETTER SMALL CAPITAL N"/* 0274 */,/*629*/"LATIN SMALL LETTER BARRED O"/* 0275 */, /*630*/"LATIN LETTER SMALL CAPITAL OE"/* 0276 */,/*631*/"LATIN SMALL LETTER CLOSED OMEGA"/* 0277 */, /*632*/"LATIN SMALL LETTER PHI"/* 0278 */,/*633*/"LATIN SMALL LETTER TURNED R"/* 0279 */, /*634*/"LATIN SMALL LETTER TURNED R WITH LONG LEG"/* 027A */,/*635*/"LATIN SMALL LETTER TURNED R WITH HOOK"/* 027B */, /*636*/"LATIN SMALL LETTER R WITH LONG LEG"/* 027C */,/*637*/"LATIN SMALL LETTER R WITH TAIL"/* 027D */, /*638*/"LATIN SMALL LETTER R WITH FISHHOOK"/* 027E */,/*639*/"LATIN SMALL LETTER REVERSED R WITH FISHHOOK"/* 027F */, /*640*/"LATIN LETTER SMALL CAPITAL R"/* 0280 */,/*641*/"LATIN LETTER SMALL CAPITAL INVERTED R"/* 0281 */, /*642*/"LATIN SMALL LETTER S WITH HOOK"/* 0282 */,/*643*/"LATIN SMALL LETTER ESH"/* 0283 */, /*644*/"LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK"/* 0284 */, /*645*/"LATIN SMALL LETTER SQUAT REVERSED ESH"/* 0285 */,/*646*/"LATIN SMALL LETTER ESH WITH CURL"/* 0286 */, /*647*/"LATIN SMALL LETTER TURNED T"/* 0287 */,/*648*/"LATIN SMALL LETTER T WITH RETROFLEX HOOK"/* 0288 */, /*649*/"LATIN SMALL LETTER U BAR"/* 0289 */,/*650*/"LATIN SMALL LETTER UPSILON"/* 028A */, /*651*/"LATIN SMALL LETTER V WITH HOOK"/* 028B */,/*652*/"LATIN SMALL LETTER TURNED V"/* 028C */, /*653*/"LATIN SMALL LETTER TURNED W"/* 028D */,/*654*/"LATIN SMALL LETTER TURNED Y"/* 028E */, /*655*/"LATIN LETTER SMALL CAPITAL Y"/* 028F */,/*656*/"LATIN SMALL LETTER Z WITH RETROFLEX HOOK"/* 0290 */, /*657*/"LATIN SMALL LETTER Z WITH CURL"/* 0291 */,/*658*/"LATIN SMALL LETTER EZH"/* 0292 */, /*659*/"LATIN SMALL LETTER EZH WITH CURL"/* 0293 */,/*660*/"LATIN LETTER GLOTTAL STOP"/* 0294 */, /*661*/"LATIN LETTER PHARYNGEAL VOICED FRICATIVE"/* 0295 */,/*662*/"LATIN LETTER INVERTED GLOTTAL STOP"/* 0296 */, /*663*/"LATIN LETTER STRETCHED C"/* 0297 */,/*664*/"LATIN LETTER BILABIAL CLICK"/* 0298 */, /*665*/"LATIN LETTER SMALL CAPITAL B"/* 0299 */,/*666*/"LATIN SMALL LETTER CLOSED OPEN E"/* 029A */, /*667*/"LATIN LETTER SMALL CAPITAL G WITH HOOK"/* 029B */,/*668*/"LATIN LETTER SMALL CAPITAL H"/* 029C */, /*669*/"LATIN SMALL LETTER J WITH CROSSED-TAIL"/* 029D */,/*670*/"LATIN SMALL LETTER TURNED K"/* 029E */, /*671*/"LATIN LETTER SMALL CAPITAL L"/* 029F */,/*672*/"LATIN SMALL LETTER Q WITH HOOK"/* 02A0 */, /*673*/"LATIN LETTER GLOTTAL STOP WITH STROKE"/* 02A1 */, /*674*/"LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE"/* 02A2 */,/*675*/"LATIN SMALL LETTER DZ DIGRAPH"/* 02A3 */, /*676*/"LATIN SMALL LETTER DEZH DIGRAPH"/* 02A4 */,/*677*/"LATIN SMALL LETTER DZ DIGRAPH WITH CURL"/* 02A5 */, /*678*/"LATIN SMALL LETTER TS DIGRAPH"/* 02A6 */,/*679*/"LATIN SMALL LETTER TESH DIGRAPH"/* 02A7 */, /*680*/"LATIN SMALL LETTER TC DIGRAPH WITH CURL"/* 02A8 */,/*681*/"LATIN SMALL LETTER FENG DIGRAPH"/* 02A9 */, /*682*/"LATIN SMALL LETTER LS DIGRAPH"/* 02AA */,/*683*/"LATIN SMALL LETTER LZ DIGRAPH"/* 02AB */, /*684*/"LATIN LETTER BILABIAL PERCUSSIVE"/* 02AC */,/*685*/"LATIN LETTER BIDENTAL PERCUSSIVE"/* 02AD */, /*686*/"LATIN SMALL LETTER TURNED H WITH FISHHOOK"/* 02AE */, /*687*/"LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL"/* 02AF */,/*688*/"MODIFIER LETTER SMALL H"/* 02B0 */, /*689*/"MODIFIER LETTER SMALL H WITH HOOK"/* 02B1 */,/*690*/"MODIFIER LETTER SMALL J"/* 02B2 */, /*691*/"MODIFIER LETTER SMALL R"/* 02B3 */,/*692*/"MODIFIER LETTER SMALL TURNED R"/* 02B4 */, /*693*/"MODIFIER LETTER SMALL TURNED R WITH HOOK"/* 02B5 */,/*694*/"MODIFIER LETTER SMALL CAPITAL INVERTED R"/* 02B6 */, /*695*/"MODIFIER LETTER SMALL W"/* 02B7 */,/*696*/"MODIFIER LETTER SMALL Y"/* 02B8 */, /*697*/"MODIFIER LETTER PRIME"/* 02B9 */,/*698*/"MODIFIER LETTER DOUBLE PRIME"/* 02BA */, /*699*/"MODIFIER LETTER TURNED COMMA"/* 02BB */,/*700*/"MODIFIER LETTER APOSTROPHE"/* 02BC */, /*701*/"MODIFIER LETTER REVERSED COMMA"/* 02BD */,/*702*/"MODIFIER LETTER RIGHT HALF RING"/* 02BE */, /*703*/"MODIFIER LETTER LEFT HALF RING"/* 02BF */,/*704*/"MODIFIER LETTER GLOTTAL STOP"/* 02C0 */, /*705*/"MODIFIER LETTER REVERSED GLOTTAL STOP"/* 02C1 */,/*706*/"MODIFIER LETTER LEFT ARROWHEAD"/* 02C2 */, /*707*/"MODIFIER LETTER RIGHT ARROWHEAD"/* 02C3 */,/*708*/"MODIFIER LETTER UP ARROWHEAD"/* 02C4 */, /*709*/"MODIFIER LETTER DOWN ARROWHEAD"/* 02C5 */,/*710*/"MODIFIER LETTER CIRCUMFLEX ACCENT"/* 02C6 */, /*711*/"CARON"/* 02C7 */,/*712*/"MODIFIER LETTER VERTICAL LINE"/* 02C8 */,/*713*/"MODIFIER LETTER MACRON"/* 02C9 */, /*714*/"MODIFIER LETTER ACUTE ACCENT"/* 02CA */,/*715*/"MODIFIER LETTER GRAVE ACCENT"/* 02CB */, /*716*/"MODIFIER LETTER LOW VERTICAL LINE"/* 02CC */,/*717*/"MODIFIER LETTER LOW MACRON"/* 02CD */, /*718*/"MODIFIER LETTER LOW GRAVE ACCENT"/* 02CE */,/*719*/"MODIFIER LETTER LOW ACUTE ACCENT"/* 02CF */, /*720*/"MODIFIER LETTER TRIANGULAR COLON"/* 02D0 */,/*721*/"MODIFIER LETTER HALF TRIANGULAR COLON"/* 02D1 */, /*722*/"MODIFIER LETTER CENTRED RIGHT HALF RING"/* 02D2 */,/*723*/"MODIFIER LETTER CENTRED LEFT HALF RING"/* 02D3 */, /*724*/"MODIFIER LETTER UP TACK"/* 02D4 */,/*725*/"MODIFIER LETTER DOWN TACK"/* 02D5 */, /*726*/"MODIFIER LETTER PLUS SIGN"/* 02D6 */,/*727*/"MODIFIER LETTER MINUS SIGN"/* 02D7 */,/*728*/"BREVE"/* 02D8 */, /*729*/"DOT ABOVE"/* 02D9 */,/*730*/"RING ABOVE"/* 02DA */,/*731*/"OGONEK"/* 02DB */,/*732*/"SMALL TILDE"/* 02DC */, /*733*/"DOUBLE ACUTE ACCENT"/* 02DD */,/*734*/"MODIFIER LETTER RHOTIC HOOK"/* 02DE */, /*735*/"MODIFIER LETTER CROSS ACCENT"/* 02DF */,/*736*/"MODIFIER LETTER SMALL GAMMA"/* 02E0 */, /*737*/"MODIFIER LETTER SMALL L"/* 02E1 */,/*738*/"MODIFIER LETTER SMALL S"/* 02E2 */, /*739*/"MODIFIER LETTER SMALL X"/* 02E3 */,/*740*/"MODIFIER LETTER SMALL REVERSED GLOTTAL STOP"/* 02E4 */, /*741*/"MODIFIER LETTER EXTRA-HIGH TONE BAR"/* 02E5 */,/*742*/"MODIFIER LETTER HIGH TONE BAR"/* 02E6 */, /*743*/"MODIFIER LETTER MID TONE BAR"/* 02E7 */,/*744*/"MODIFIER LETTER LOW TONE BAR"/* 02E8 */, /*745*/"MODIFIER LETTER EXTRA-LOW TONE BAR"/* 02E9 */,/*746*/"MODIFIER LETTER YIN DEPARTING TONE MARK"/* 02EA */, /*747*/"MODIFIER LETTER YANG DEPARTING TONE MARK"/* 02EB */,/*748*/"MODIFIER LETTER VOICING"/* 02EC */, /*749*/"MODIFIER LETTER UNASPIRATED"/* 02ED */,/*750*/"MODIFIER LETTER DOUBLE APOSTROPHE"/* 02EE */, /*751*/"MODIFIER LETTER LOW DOWN ARROWHEAD"/* 02EF */,/*752*/"MODIFIER LETTER LOW UP ARROWHEAD"/* 02F0 */, /*753*/"MODIFIER LETTER LOW LEFT ARROWHEAD"/* 02F1 */,/*754*/"MODIFIER LETTER LOW RIGHT ARROWHEAD"/* 02F2 */, /*755*/"MODIFIER LETTER LOW RING"/* 02F3 */,/*756*/"MODIFIER LETTER MIDDLE GRAVE ACCENT"/* 02F4 */, /*757*/"MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT"/* 02F5 */, /*758*/"MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT"/* 02F6 */,/*759*/"MODIFIER LETTER LOW TILDE"/* 02F7 */, /*760*/"MODIFIER LETTER RAISED COLON"/* 02F8 */,/*761*/"MODIFIER LETTER BEGIN HIGH TONE"/* 02F9 */, /*762*/"MODIFIER LETTER END HIGH TONE"/* 02FA */,/*763*/"MODIFIER LETTER BEGIN LOW TONE"/* 02FB */, /*764*/"MODIFIER LETTER END LOW TONE"/* 02FC */,/*765*/"MODIFIER LETTER SHELF"/* 02FD */, /*766*/"MODIFIER LETTER OPEN SHELF"/* 02FE */,/*767*/"MODIFIER LETTER LOW LEFT ARROW"/* 02FF */, /*768*/"COMBINING GRAVE ACCENT"/* 0300 */,/*769*/"COMBINING ACUTE ACCENT"/* 0301 */, /*770*/"COMBINING CIRCUMFLEX ACCENT"/* 0302 */,/*771*/"COMBINING TILDE"/* 0303 */,/*772*/"COMBINING MACRON"/* 0304 */, /*773*/"COMBINING OVERLINE"/* 0305 */,/*774*/"COMBINING BREVE"/* 0306 */,/*775*/"COMBINING DOT ABOVE"/* 0307 */, /*776*/"COMBINING DIAERESIS"/* 0308 */,/*777*/"COMBINING HOOK ABOVE"/* 0309 */,/*778*/"COMBINING RING ABOVE"/* 030A */, /*779*/"COMBINING DOUBLE ACUTE ACCENT"/* 030B */,/*780*/"COMBINING CARON"/* 030C */, /*781*/"COMBINING VERTICAL LINE ABOVE"/* 030D */,/*782*/"COMBINING DOUBLE VERTICAL LINE ABOVE"/* 030E */, /*783*/"COMBINING DOUBLE GRAVE ACCENT"/* 030F */,/*784*/"COMBINING CANDRABINDU"/* 0310 */, /*785*/"COMBINING INVERTED BREVE"/* 0311 */,/*786*/"COMBINING TURNED COMMA ABOVE"/* 0312 */, /*787*/"COMBINING COMMA ABOVE"/* 0313 */,/*788*/"COMBINING REVERSED COMMA ABOVE"/* 0314 */, /*789*/"COMBINING COMMA ABOVE RIGHT"/* 0315 */,/*790*/"COMBINING GRAVE ACCENT BELOW"/* 0316 */, /*791*/"COMBINING ACUTE ACCENT BELOW"/* 0317 */,/*792*/"COMBINING LEFT TACK BELOW"/* 0318 */, /*793*/"COMBINING RIGHT TACK BELOW"/* 0319 */,/*794*/"COMBINING LEFT ANGLE ABOVE"/* 031A */, /*795*/"COMBINING HORN"/* 031B */,/*796*/"COMBINING LEFT HALF RING BELOW"/* 031C */, /*797*/"COMBINING UP TACK BELOW"/* 031D */,/*798*/"COMBINING DOWN TACK BELOW"/* 031E */, /*799*/"COMBINING PLUS SIGN BELOW"/* 031F */,/*800*/"COMBINING MINUS SIGN BELOW"/* 0320 */, /*801*/"COMBINING PALATALIZED HOOK BELOW"/* 0321 */,/*802*/"COMBINING RETROFLEX HOOK BELOW"/* 0322 */, /*803*/"COMBINING DOT BELOW"/* 0323 */,/*804*/"COMBINING DIAERESIS BELOW"/* 0324 */, /*805*/"COMBINING RING BELOW"/* 0325 */,/*806*/"COMBINING COMMA BELOW"/* 0326 */,/*807*/"COMBINING CEDILLA"/* 0327 */, /*808*/"COMBINING OGONEK"/* 0328 */,/*809*/"COMBINING VERTICAL LINE BELOW"/* 0329 */, /*810*/"COMBINING BRIDGE BELOW"/* 032A */,/*811*/"COMBINING INVERTED DOUBLE ARCH BELOW"/* 032B */, /*812*/"COMBINING CARON BELOW"/* 032C */,/*813*/"COMBINING CIRCUMFLEX ACCENT BELOW"/* 032D */, /*814*/"COMBINING BREVE BELOW"/* 032E */,/*815*/"COMBINING INVERTED BREVE BELOW"/* 032F */, /*816*/"COMBINING TILDE BELOW"/* 0330 */,/*817*/"COMBINING MACRON BELOW"/* 0331 */,/*818*/"COMBINING LOW LINE"/* 0332 */, /*819*/"COMBINING DOUBLE LOW LINE"/* 0333 */,/*820*/"COMBINING TILDE OVERLAY"/* 0334 */, /*821*/"COMBINING SHORT STROKE OVERLAY"/* 0335 */,/*822*/"COMBINING LONG STROKE OVERLAY"/* 0336 */, /*823*/"COMBINING SHORT SOLIDUS OVERLAY"/* 0337 */,/*824*/"COMBINING LONG SOLIDUS OVERLAY"/* 0338 */, /*825*/"COMBINING RIGHT HALF RING BELOW"/* 0339 */,/*826*/"COMBINING INVERTED BRIDGE BELOW"/* 033A */, /*827*/"COMBINING SQUARE BELOW"/* 033B */,/*828*/"COMBINING SEAGULL BELOW"/* 033C */, /*829*/"COMBINING X ABOVE"/* 033D */,/*830*/"COMBINING VERTICAL TILDE"/* 033E */, /*831*/"COMBINING DOUBLE OVERLINE"/* 033F */,/*832*/"COMBINING GRAVE TONE MARK"/* 0340 */, /*833*/"COMBINING ACUTE TONE MARK"/* 0341 */,/*834*/"COMBINING GREEK PERISPOMENI"/* 0342 */, /*835*/"COMBINING GREEK KORONIS"/* 0343 */,/*836*/"COMBINING GREEK DIALYTIKA TONOS"/* 0344 */, /*837*/"COMBINING GREEK YPOGEGRAMMENI"/* 0345 */,/*838*/"COMBINING BRIDGE ABOVE"/* 0346 */, /*839*/"COMBINING EQUALS SIGN BELOW"/* 0347 */,/*840*/"COMBINING DOUBLE VERTICAL LINE BELOW"/* 0348 */, /*841*/"COMBINING LEFT ANGLE BELOW"/* 0349 */,/*842*/"COMBINING NOT TILDE ABOVE"/* 034A */, /*843*/"COMBINING HOMOTHETIC ABOVE"/* 034B */,/*844*/"COMBINING ALMOST EQUAL TO ABOVE"/* 034C */, /*845*/"COMBINING LEFT RIGHT ARROW BELOW"/* 034D */,/*846*/"COMBINING UPWARDS ARROW BELOW"/* 034E */, /*847*/"COMBINING GRAPHEME JOINER"/* 034F */,/*848*/"COMBINING RIGHT ARROWHEAD ABOVE"/* 0350 */, /*849*/"COMBINING LEFT HALF RING ABOVE"/* 0351 */,/*850*/"COMBINING FERMATA"/* 0352 */, /*851*/"COMBINING X BELOW"/* 0353 */,/*852*/"COMBINING LEFT ARROWHEAD BELOW"/* 0354 */, /*853*/"COMBINING RIGHT ARROWHEAD BELOW"/* 0355 */,/*854*/"COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW"/* 0356 */, /*855*/"COMBINING RIGHT HALF RING ABOVE"/* 0357 */,/*856*/"COMBINING DOT ABOVE RIGHT"/* 0358 */, /*857*/"COMBINING ASTERISK BELOW"/* 0359 */,/*858*/"COMBINING DOUBLE RING BELOW"/* 035A */, /*859*/"COMBINING ZIGZAG ABOVE"/* 035B */,/*860*/"COMBINING DOUBLE BREVE BELOW"/* 035C */, /*861*/"COMBINING DOUBLE BREVE"/* 035D */,/*862*/"COMBINING DOUBLE MACRON"/* 035E */, /*863*/"COMBINING DOUBLE MACRON BELOW"/* 035F */,/*864*/"COMBINING DOUBLE TILDE"/* 0360 */, /*865*/"COMBINING DOUBLE INVERTED BREVE"/* 0361 */,/*866*/"COMBINING DOUBLE RIGHTWARDS ARROW BELOW"/* 0362 */, /*867*/"COMBINING LATIN SMALL LETTER A"/* 0363 */,/*868*/"COMBINING LATIN SMALL LETTER E"/* 0364 */, /*869*/"COMBINING LATIN SMALL LETTER I"/* 0365 */,/*870*/"COMBINING LATIN SMALL LETTER O"/* 0366 */, /*871*/"COMBINING LATIN SMALL LETTER U"/* 0367 */,/*872*/"COMBINING LATIN SMALL LETTER C"/* 0368 */, /*873*/"COMBINING LATIN SMALL LETTER D"/* 0369 */,/*874*/"COMBINING LATIN SMALL LETTER H"/* 036A */, /*875*/"COMBINING LATIN SMALL LETTER M"/* 036B */,/*876*/"COMBINING LATIN SMALL LETTER R"/* 036C */, /*877*/"COMBINING LATIN SMALL LETTER T"/* 036D */,/*878*/"COMBINING LATIN SMALL LETTER V"/* 036E */, /*879*/"COMBINING LATIN SMALL LETTER X"/* 036F */,/*880*/"GREEK CAPITAL LETTER HETA"/* 0370 */, /*881*/"GREEK SMALL LETTER HETA"/* 0371 */,/*882*/"GREEK CAPITAL LETTER ARCHAIC SAMPI"/* 0372 */, /*883*/"GREEK SMALL LETTER ARCHAIC SAMPI"/* 0373 */,/*884*/"GREEK NUMERAL SIGN"/* 0374 */, /*885*/"GREEK LOWER NUMERAL SIGN"/* 0375 */,/*886*/"GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA"/* 0376 */, /*887*/"GREEK SMALL LETTER PAMPHYLIAN DIGAMMA"/* 0377 */,NULL,NULL,/*890*/"GREEK YPOGEGRAMMENI"/* 037A */, /*891*/"GREEK SMALL REVERSED LUNATE SIGMA SYMBOL"/* 037B */,/*892*/"GREEK SMALL DOTTED LUNATE SIGMA SYMBOL"/* 037C */, /*893*/"GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL"/* 037D */,/*894*/"GREEK QUESTION MARK"/* 037E */, /*895*/"GREEK CAPITAL LETTER YOT"/* 037F */,NULL,NULL,NULL,NULL,/*900*/"GREEK TONOS"/* 0384 */, /*901*/"GREEK DIALYTIKA TONOS"/* 0385 */,/*902*/"GREEK CAPITAL LETTER ALPHA WITH TONOS"/* 0386 */, /*903*/"GREEK ANO TELEIA"/* 0387 */,/*904*/"GREEK CAPITAL LETTER EPSILON WITH TONOS"/* 0388 */, /*905*/"GREEK CAPITAL LETTER ETA WITH TONOS"/* 0389 */,/*906*/"GREEK CAPITAL LETTER IOTA WITH TONOS"/* 038A */,NULL, /*908*/"GREEK CAPITAL LETTER OMICRON WITH TONOS"/* 038C */,NULL, /*910*/"GREEK CAPITAL LETTER UPSILON WITH TONOS"/* 038E */,/*911*/"GREEK CAPITAL LETTER OMEGA WITH TONOS"/* 038F */, /*912*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS"/* 0390 */,/*913*/"GREEK CAPITAL LETTER ALPHA"/* 0391 */, /*914*/"GREEK CAPITAL LETTER BETA"/* 0392 */,/*915*/"GREEK CAPITAL LETTER GAMMA"/* 0393 */, /*916*/"GREEK CAPITAL LETTER DELTA"/* 0394 */,/*917*/"GREEK CAPITAL LETTER EPSILON"/* 0395 */, /*918*/"GREEK CAPITAL LETTER ZETA"/* 0396 */,/*919*/"GREEK CAPITAL LETTER ETA"/* 0397 */, /*920*/"GREEK CAPITAL LETTER THETA"/* 0398 */,/*921*/"GREEK CAPITAL LETTER IOTA"/* 0399 */, /*922*/"GREEK CAPITAL LETTER KAPPA"/* 039A */,/*923*/"GREEK CAPITAL LETTER LAMDA"/* 039B */, /*924*/"GREEK CAPITAL LETTER MU"/* 039C */,/*925*/"GREEK CAPITAL LETTER NU"/* 039D */, /*926*/"GREEK CAPITAL LETTER XI"/* 039E */,/*927*/"GREEK CAPITAL LETTER OMICRON"/* 039F */, /*928*/"GREEK CAPITAL LETTER PI"/* 03A0 */,/*929*/"GREEK CAPITAL LETTER RHO"/* 03A1 */,NULL, /*931*/"GREEK CAPITAL LETTER SIGMA"/* 03A3 */,/*932*/"GREEK CAPITAL LETTER TAU"/* 03A4 */, /*933*/"GREEK CAPITAL LETTER UPSILON"/* 03A5 */,/*934*/"GREEK CAPITAL LETTER PHI"/* 03A6 */, /*935*/"GREEK CAPITAL LETTER CHI"/* 03A7 */,/*936*/"GREEK CAPITAL LETTER PSI"/* 03A8 */, /*937*/"GREEK CAPITAL LETTER OMEGA"/* 03A9 */,/*938*/"GREEK CAPITAL LETTER IOTA WITH DIALYTIKA"/* 03AA */, /*939*/"GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA"/* 03AB */,/*940*/"GREEK SMALL LETTER ALPHA WITH TONOS"/* 03AC */, /*941*/"GREEK SMALL LETTER EPSILON WITH TONOS"/* 03AD */,/*942*/"GREEK SMALL LETTER ETA WITH TONOS"/* 03AE */, /*943*/"GREEK SMALL LETTER IOTA WITH TONOS"/* 03AF */, /*944*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS"/* 03B0 */,/*945*/"GREEK SMALL LETTER ALPHA"/* 03B1 */, /*946*/"GREEK SMALL LETTER BETA"/* 03B2 */,/*947*/"GREEK SMALL LETTER GAMMA"/* 03B3 */, /*948*/"GREEK SMALL LETTER DELTA"/* 03B4 */,/*949*/"GREEK SMALL LETTER EPSILON"/* 03B5 */, /*950*/"GREEK SMALL LETTER ZETA"/* 03B6 */,/*951*/"GREEK SMALL LETTER ETA"/* 03B7 */, /*952*/"GREEK SMALL LETTER THETA"/* 03B8 */,/*953*/"GREEK SMALL LETTER IOTA"/* 03B9 */, /*954*/"GREEK SMALL LETTER KAPPA"/* 03BA */,/*955*/"GREEK SMALL LETTER LAMDA"/* 03BB */, /*956*/"GREEK SMALL LETTER MU"/* 03BC */,/*957*/"GREEK SMALL LETTER NU"/* 03BD */, /*958*/"GREEK SMALL LETTER XI"/* 03BE */,/*959*/"GREEK SMALL LETTER OMICRON"/* 03BF */, /*960*/"GREEK SMALL LETTER PI"/* 03C0 */,/*961*/"GREEK SMALL LETTER RHO"/* 03C1 */, /*962*/"GREEK SMALL LETTER FINAL SIGMA"/* 03C2 */,/*963*/"GREEK SMALL LETTER SIGMA"/* 03C3 */, /*964*/"GREEK SMALL LETTER TAU"/* 03C4 */,/*965*/"GREEK SMALL LETTER UPSILON"/* 03C5 */, /*966*/"GREEK SMALL LETTER PHI"/* 03C6 */,/*967*/"GREEK SMALL LETTER CHI"/* 03C7 */, /*968*/"GREEK SMALL LETTER PSI"/* 03C8 */,/*969*/"GREEK SMALL LETTER OMEGA"/* 03C9 */, /*970*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA"/* 03CA */,/*971*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA"/* 03CB */, /*972*/"GREEK SMALL LETTER OMICRON WITH TONOS"/* 03CC */,/*973*/"GREEK SMALL LETTER UPSILON WITH TONOS"/* 03CD */, /*974*/"GREEK SMALL LETTER OMEGA WITH TONOS"/* 03CE */,/*975*/"GREEK CAPITAL KAI SYMBOL"/* 03CF */, /*976*/"GREEK BETA SYMBOL"/* 03D0 */,/*977*/"GREEK THETA SYMBOL"/* 03D1 */, /*978*/"GREEK UPSILON WITH HOOK SYMBOL"/* 03D2 */,/*979*/"GREEK UPSILON WITH ACUTE AND HOOK SYMBOL"/* 03D3 */, /*980*/"GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL"/* 03D4 */,/*981*/"GREEK PHI SYMBOL"/* 03D5 */, /*982*/"GREEK PI SYMBOL"/* 03D6 */,/*983*/"GREEK KAI SYMBOL"/* 03D7 */,/*984*/"GREEK LETTER ARCHAIC KOPPA"/* 03D8 */, /*985*/"GREEK SMALL LETTER ARCHAIC KOPPA"/* 03D9 */,/*986*/"GREEK LETTER STIGMA"/* 03DA */, /*987*/"GREEK SMALL LETTER STIGMA"/* 03DB */,/*988*/"GREEK LETTER DIGAMMA"/* 03DC */, /*989*/"GREEK SMALL LETTER DIGAMMA"/* 03DD */,/*990*/"GREEK LETTER KOPPA"/* 03DE */, /*991*/"GREEK SMALL LETTER KOPPA"/* 03DF */,/*992*/"GREEK LETTER SAMPI"/* 03E0 */, /*993*/"GREEK SMALL LETTER SAMPI"/* 03E1 */,/*994*/"COPTIC CAPITAL LETTER SHEI"/* 03E2 */, /*995*/"COPTIC SMALL LETTER SHEI"/* 03E3 */,/*996*/"COPTIC CAPITAL LETTER FEI"/* 03E4 */, /*997*/"COPTIC SMALL LETTER FEI"/* 03E5 */,/*998*/"COPTIC CAPITAL LETTER KHEI"/* 03E6 */, /*999*/"COPTIC SMALL LETTER KHEI"/* 03E7 */,/*1000*/"COPTIC CAPITAL LETTER HORI"/* 03E8 */, /*1001*/"COPTIC SMALL LETTER HORI"/* 03E9 */,/*1002*/"COPTIC CAPITAL LETTER GANGIA"/* 03EA */, /*1003*/"COPTIC SMALL LETTER GANGIA"/* 03EB */,/*1004*/"COPTIC CAPITAL LETTER SHIMA"/* 03EC */, /*1005*/"COPTIC SMALL LETTER SHIMA"/* 03ED */,/*1006*/"COPTIC CAPITAL LETTER DEI"/* 03EE */, /*1007*/"COPTIC SMALL LETTER DEI"/* 03EF */,/*1008*/"GREEK KAPPA SYMBOL"/* 03F0 */,/*1009*/"GREEK RHO SYMBOL"/* 03F1 */, /*1010*/"GREEK LUNATE SIGMA SYMBOL"/* 03F2 */,/*1011*/"GREEK LETTER YOT"/* 03F3 */, /*1012*/"GREEK CAPITAL THETA SYMBOL"/* 03F4 */,/*1013*/"GREEK LUNATE EPSILON SYMBOL"/* 03F5 */, /*1014*/"GREEK REVERSED LUNATE EPSILON SYMBOL"/* 03F6 */,/*1015*/"GREEK CAPITAL LETTER SHO"/* 03F7 */, /*1016*/"GREEK SMALL LETTER SHO"/* 03F8 */,/*1017*/"GREEK CAPITAL LUNATE SIGMA SYMBOL"/* 03F9 */, /*1018*/"GREEK CAPITAL LETTER SAN"/* 03FA */,/*1019*/"GREEK SMALL LETTER SAN"/* 03FB */, /*1020*/"GREEK RHO WITH STROKE SYMBOL"/* 03FC */,/*1021*/"GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL"/* 03FD */, /*1022*/"GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL"/* 03FE */, /*1023*/"GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL"/* 03FF */, /*1024*/"CYRILLIC CAPITAL LETTER IE WITH GRAVE"/* 0400 */,/*1025*/"CYRILLIC CAPITAL LETTER IO"/* 0401 */, /*1026*/"CYRILLIC CAPITAL LETTER DJE"/* 0402 */,/*1027*/"CYRILLIC CAPITAL LETTER GJE"/* 0403 */, /*1028*/"CYRILLIC CAPITAL LETTER UKRAINIAN IE"/* 0404 */,/*1029*/"CYRILLIC CAPITAL LETTER DZE"/* 0405 */, /*1030*/"CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I"/* 0406 */,/*1031*/"CYRILLIC CAPITAL LETTER YI"/* 0407 */, /*1032*/"CYRILLIC CAPITAL LETTER JE"/* 0408 */,/*1033*/"CYRILLIC CAPITAL LETTER LJE"/* 0409 */, /*1034*/"CYRILLIC CAPITAL LETTER NJE"/* 040A */,/*1035*/"CYRILLIC CAPITAL LETTER TSHE"/* 040B */, /*1036*/"CYRILLIC CAPITAL LETTER KJE"/* 040C */,/*1037*/"CYRILLIC CAPITAL LETTER I WITH GRAVE"/* 040D */, /*1038*/"CYRILLIC CAPITAL LETTER SHORT U"/* 040E */,/*1039*/"CYRILLIC CAPITAL LETTER DZHE"/* 040F */, /*1040*/"CYRILLIC CAPITAL LETTER A"/* 0410 */,/*1041*/"CYRILLIC CAPITAL LETTER BE"/* 0411 */, /*1042*/"CYRILLIC CAPITAL LETTER VE"/* 0412 */,/*1043*/"CYRILLIC CAPITAL LETTER GHE"/* 0413 */, /*1044*/"CYRILLIC CAPITAL LETTER DE"/* 0414 */,/*1045*/"CYRILLIC CAPITAL LETTER IE"/* 0415 */, /*1046*/"CYRILLIC CAPITAL LETTER ZHE"/* 0416 */,/*1047*/"CYRILLIC CAPITAL LETTER ZE"/* 0417 */, /*1048*/"CYRILLIC CAPITAL LETTER I"/* 0418 */,/*1049*/"CYRILLIC CAPITAL LETTER SHORT I"/* 0419 */, /*1050*/"CYRILLIC CAPITAL LETTER KA"/* 041A */,/*1051*/"CYRILLIC CAPITAL LETTER EL"/* 041B */, /*1052*/"CYRILLIC CAPITAL LETTER EM"/* 041C */,/*1053*/"CYRILLIC CAPITAL LETTER EN"/* 041D */, /*1054*/"CYRILLIC CAPITAL LETTER O"/* 041E */,/*1055*/"CYRILLIC CAPITAL LETTER PE"/* 041F */, /*1056*/"CYRILLIC CAPITAL LETTER ER"/* 0420 */,/*1057*/"CYRILLIC CAPITAL LETTER ES"/* 0421 */, /*1058*/"CYRILLIC CAPITAL LETTER TE"/* 0422 */,/*1059*/"CYRILLIC CAPITAL LETTER U"/* 0423 */, /*1060*/"CYRILLIC CAPITAL LETTER EF"/* 0424 */,/*1061*/"CYRILLIC CAPITAL LETTER HA"/* 0425 */, /*1062*/"CYRILLIC CAPITAL LETTER TSE"/* 0426 */,/*1063*/"CYRILLIC CAPITAL LETTER CHE"/* 0427 */, /*1064*/"CYRILLIC CAPITAL LETTER SHA"/* 0428 */,/*1065*/"CYRILLIC CAPITAL LETTER SHCHA"/* 0429 */, /*1066*/"CYRILLIC CAPITAL LETTER HARD SIGN"/* 042A */,/*1067*/"CYRILLIC CAPITAL LETTER YERU"/* 042B */, /*1068*/"CYRILLIC CAPITAL LETTER SOFT SIGN"/* 042C */,/*1069*/"CYRILLIC CAPITAL LETTER E"/* 042D */, /*1070*/"CYRILLIC CAPITAL LETTER YU"/* 042E */,/*1071*/"CYRILLIC CAPITAL LETTER YA"/* 042F */, /*1072*/"CYRILLIC SMALL LETTER A"/* 0430 */,/*1073*/"CYRILLIC SMALL LETTER BE"/* 0431 */, /*1074*/"CYRILLIC SMALL LETTER VE"/* 0432 */,/*1075*/"CYRILLIC SMALL LETTER GHE"/* 0433 */, /*1076*/"CYRILLIC SMALL LETTER DE"/* 0434 */,/*1077*/"CYRILLIC SMALL LETTER IE"/* 0435 */, /*1078*/"CYRILLIC SMALL LETTER ZHE"/* 0436 */,/*1079*/"CYRILLIC SMALL LETTER ZE"/* 0437 */, /*1080*/"CYRILLIC SMALL LETTER I"/* 0438 */,/*1081*/"CYRILLIC SMALL LETTER SHORT I"/* 0439 */, /*1082*/"CYRILLIC SMALL LETTER KA"/* 043A */,/*1083*/"CYRILLIC SMALL LETTER EL"/* 043B */, /*1084*/"CYRILLIC SMALL LETTER EM"/* 043C */,/*1085*/"CYRILLIC SMALL LETTER EN"/* 043D */, /*1086*/"CYRILLIC SMALL LETTER O"/* 043E */,/*1087*/"CYRILLIC SMALL LETTER PE"/* 043F */, /*1088*/"CYRILLIC SMALL LETTER ER"/* 0440 */,/*1089*/"CYRILLIC SMALL LETTER ES"/* 0441 */, /*1090*/"CYRILLIC SMALL LETTER TE"/* 0442 */,/*1091*/"CYRILLIC SMALL LETTER U"/* 0443 */, /*1092*/"CYRILLIC SMALL LETTER EF"/* 0444 */,/*1093*/"CYRILLIC SMALL LETTER HA"/* 0445 */, /*1094*/"CYRILLIC SMALL LETTER TSE"/* 0446 */,/*1095*/"CYRILLIC SMALL LETTER CHE"/* 0447 */, /*1096*/"CYRILLIC SMALL LETTER SHA"/* 0448 */,/*1097*/"CYRILLIC SMALL LETTER SHCHA"/* 0449 */, /*1098*/"CYRILLIC SMALL LETTER HARD SIGN"/* 044A */,/*1099*/"CYRILLIC SMALL LETTER YERU"/* 044B */, /*1100*/"CYRILLIC SMALL LETTER SOFT SIGN"/* 044C */,/*1101*/"CYRILLIC SMALL LETTER E"/* 044D */, /*1102*/"CYRILLIC SMALL LETTER YU"/* 044E */,/*1103*/"CYRILLIC SMALL LETTER YA"/* 044F */, /*1104*/"CYRILLIC SMALL LETTER IE WITH GRAVE"/* 0450 */,/*1105*/"CYRILLIC SMALL LETTER IO"/* 0451 */, /*1106*/"CYRILLIC SMALL LETTER DJE"/* 0452 */,/*1107*/"CYRILLIC SMALL LETTER GJE"/* 0453 */, /*1108*/"CYRILLIC SMALL LETTER UKRAINIAN IE"/* 0454 */,/*1109*/"CYRILLIC SMALL LETTER DZE"/* 0455 */, /*1110*/"CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I"/* 0456 */,/*1111*/"CYRILLIC SMALL LETTER YI"/* 0457 */, /*1112*/"CYRILLIC SMALL LETTER JE"/* 0458 */,/*1113*/"CYRILLIC SMALL LETTER LJE"/* 0459 */, /*1114*/"CYRILLIC SMALL LETTER NJE"/* 045A */,/*1115*/"CYRILLIC SMALL LETTER TSHE"/* 045B */, /*1116*/"CYRILLIC SMALL LETTER KJE"/* 045C */,/*1117*/"CYRILLIC SMALL LETTER I WITH GRAVE"/* 045D */, /*1118*/"CYRILLIC SMALL LETTER SHORT U"/* 045E */,/*1119*/"CYRILLIC SMALL LETTER DZHE"/* 045F */, /*1120*/"CYRILLIC CAPITAL LETTER OMEGA"/* 0460 */,/*1121*/"CYRILLIC SMALL LETTER OMEGA"/* 0461 */, /*1122*/"CYRILLIC CAPITAL LETTER YAT"/* 0462 */,/*1123*/"CYRILLIC SMALL LETTER YAT"/* 0463 */, /*1124*/"CYRILLIC CAPITAL LETTER IOTIFIED E"/* 0464 */,/*1125*/"CYRILLIC SMALL LETTER IOTIFIED E"/* 0465 */, /*1126*/"CYRILLIC CAPITAL LETTER LITTLE YUS"/* 0466 */,/*1127*/"CYRILLIC SMALL LETTER LITTLE YUS"/* 0467 */, /*1128*/"CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS"/* 0468 */, /*1129*/"CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS"/* 0469 */,/*1130*/"CYRILLIC CAPITAL LETTER BIG YUS"/* 046A */, /*1131*/"CYRILLIC SMALL LETTER BIG YUS"/* 046B */,/*1132*/"CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS"/* 046C */, /*1133*/"CYRILLIC SMALL LETTER IOTIFIED BIG YUS"/* 046D */,/*1134*/"CYRILLIC CAPITAL LETTER KSI"/* 046E */, /*1135*/"CYRILLIC SMALL LETTER KSI"/* 046F */,/*1136*/"CYRILLIC CAPITAL LETTER PSI"/* 0470 */, /*1137*/"CYRILLIC SMALL LETTER PSI"/* 0471 */,/*1138*/"CYRILLIC CAPITAL LETTER FITA"/* 0472 */, /*1139*/"CYRILLIC SMALL LETTER FITA"/* 0473 */,/*1140*/"CYRILLIC CAPITAL LETTER IZHITSA"/* 0474 */, /*1141*/"CYRILLIC SMALL LETTER IZHITSA"/* 0475 */, /*1142*/"CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"/* 0476 */, /*1143*/"CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"/* 0477 */, /*1144*/"CYRILLIC CAPITAL LETTER UK"/* 0478 */,/*1145*/"CYRILLIC SMALL LETTER UK"/* 0479 */, /*1146*/"CYRILLIC CAPITAL LETTER ROUND OMEGA"/* 047A */,/*1147*/"CYRILLIC SMALL LETTER ROUND OMEGA"/* 047B */, /*1148*/"CYRILLIC CAPITAL LETTER OMEGA WITH TITLO"/* 047C */,/*1149*/"CYRILLIC SMALL LETTER OMEGA WITH TITLO"/* 047D */, /*1150*/"CYRILLIC CAPITAL LETTER OT"/* 047E */,/*1151*/"CYRILLIC SMALL LETTER OT"/* 047F */, /*1152*/"CYRILLIC CAPITAL LETTER KOPPA"/* 0480 */,/*1153*/"CYRILLIC SMALL LETTER KOPPA"/* 0481 */, /*1154*/"CYRILLIC THOUSANDS SIGN"/* 0482 */,/*1155*/"COMBINING CYRILLIC TITLO"/* 0483 */, /*1156*/"COMBINING CYRILLIC PALATALIZATION"/* 0484 */,/*1157*/"COMBINING CYRILLIC DASIA PNEUMATA"/* 0485 */, /*1158*/"COMBINING CYRILLIC PSILI PNEUMATA"/* 0486 */,/*1159*/"COMBINING CYRILLIC POKRYTIE"/* 0487 */, /*1160*/"COMBINING CYRILLIC HUNDRED THOUSANDS SIGN"/* 0488 */,/*1161*/"COMBINING CYRILLIC MILLIONS SIGN"/* 0489 */, /*1162*/"CYRILLIC CAPITAL LETTER SHORT I WITH TAIL"/* 048A */, /*1163*/"CYRILLIC SMALL LETTER SHORT I WITH TAIL"/* 048B */,/*1164*/"CYRILLIC CAPITAL LETTER SEMISOFT SIGN"/* 048C */, /*1165*/"CYRILLIC SMALL LETTER SEMISOFT SIGN"/* 048D */,/*1166*/"CYRILLIC CAPITAL LETTER ER WITH TICK"/* 048E */, /*1167*/"CYRILLIC SMALL LETTER ER WITH TICK"/* 048F */,/*1168*/"CYRILLIC CAPITAL LETTER GHE WITH UPTURN"/* 0490 */, /*1169*/"CYRILLIC SMALL LETTER GHE WITH UPTURN"/* 0491 */,/*1170*/"CYRILLIC CAPITAL LETTER GHE WITH STROKE"/* 0492 */, /*1171*/"CYRILLIC SMALL LETTER GHE WITH STROKE"/* 0493 */, /*1172*/"CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK"/* 0494 */, /*1173*/"CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK"/* 0495 */, /*1174*/"CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER"/* 0496 */, /*1175*/"CYRILLIC SMALL LETTER ZHE WITH DESCENDER"/* 0497 */, /*1176*/"CYRILLIC CAPITAL LETTER ZE WITH DESCENDER"/* 0498 */, /*1177*/"CYRILLIC SMALL LETTER ZE WITH DESCENDER"/* 0499 */, /*1178*/"CYRILLIC CAPITAL LETTER KA WITH DESCENDER"/* 049A */, /*1179*/"CYRILLIC SMALL LETTER KA WITH DESCENDER"/* 049B */, /*1180*/"CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE"/* 049C */, /*1181*/"CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE"/* 049D */, /*1182*/"CYRILLIC CAPITAL LETTER KA WITH STROKE"/* 049E */,/*1183*/"CYRILLIC SMALL LETTER KA WITH STROKE"/* 049F */, /*1184*/"CYRILLIC CAPITAL LETTER BASHKIR KA"/* 04A0 */,/*1185*/"CYRILLIC SMALL LETTER BASHKIR KA"/* 04A1 */, /*1186*/"CYRILLIC CAPITAL LETTER EN WITH DESCENDER"/* 04A2 */, /*1187*/"CYRILLIC SMALL LETTER EN WITH DESCENDER"/* 04A3 */,/*1188*/"CYRILLIC CAPITAL LIGATURE EN GHE"/* 04A4 */, /*1189*/"CYRILLIC SMALL LIGATURE EN GHE"/* 04A5 */,/*1190*/"CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK"/* 04A6 */, /*1191*/"CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK"/* 04A7 */,/*1192*/"CYRILLIC CAPITAL LETTER ABKHASIAN HA"/* 04A8 */, /*1193*/"CYRILLIC SMALL LETTER ABKHASIAN HA"/* 04A9 */,/*1194*/"CYRILLIC CAPITAL LETTER ES WITH DESCENDER"/* 04AA */, /*1195*/"CYRILLIC SMALL LETTER ES WITH DESCENDER"/* 04AB */, /*1196*/"CYRILLIC CAPITAL LETTER TE WITH DESCENDER"/* 04AC */, /*1197*/"CYRILLIC SMALL LETTER TE WITH DESCENDER"/* 04AD */,/*1198*/"CYRILLIC CAPITAL LETTER STRAIGHT U"/* 04AE */, /*1199*/"CYRILLIC SMALL LETTER STRAIGHT U"/* 04AF */,/*1200*/"CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE"/* 04B0 */, /*1201*/"CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE"/* 04B1 */, /*1202*/"CYRILLIC CAPITAL LETTER HA WITH DESCENDER"/* 04B2 */, /*1203*/"CYRILLIC SMALL LETTER HA WITH DESCENDER"/* 04B3 */,/*1204*/"CYRILLIC CAPITAL LIGATURE TE TSE"/* 04B4 */, /*1205*/"CYRILLIC SMALL LIGATURE TE TSE"/* 04B5 */,/*1206*/"CYRILLIC CAPITAL LETTER CHE WITH DESCENDER"/* 04B6 */, /*1207*/"CYRILLIC SMALL LETTER CHE WITH DESCENDER"/* 04B7 */, /*1208*/"CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE"/* 04B8 */, /*1209*/"CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE"/* 04B9 */,/*1210*/"CYRILLIC CAPITAL LETTER SHHA"/* 04BA */, /*1211*/"CYRILLIC SMALL LETTER SHHA"/* 04BB */,/*1212*/"CYRILLIC CAPITAL LETTER ABKHASIAN CHE"/* 04BC */, /*1213*/"CYRILLIC SMALL LETTER ABKHASIAN CHE"/* 04BD */, /*1214*/"CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER"/* 04BE */, /*1215*/"CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER"/* 04BF */,/*1216*/"CYRILLIC LETTER PALOCHKA"/* 04C0 */, /*1217*/"CYRILLIC CAPITAL LETTER ZHE WITH BREVE"/* 04C1 */,/*1218*/"CYRILLIC SMALL LETTER ZHE WITH BREVE"/* 04C2 */, /*1219*/"CYRILLIC CAPITAL LETTER KA WITH HOOK"/* 04C3 */,/*1220*/"CYRILLIC SMALL LETTER KA WITH HOOK"/* 04C4 */, /*1221*/"CYRILLIC CAPITAL LETTER EL WITH TAIL"/* 04C5 */,/*1222*/"CYRILLIC SMALL LETTER EL WITH TAIL"/* 04C6 */, /*1223*/"CYRILLIC CAPITAL LETTER EN WITH HOOK"/* 04C7 */,/*1224*/"CYRILLIC SMALL LETTER EN WITH HOOK"/* 04C8 */, /*1225*/"CYRILLIC CAPITAL LETTER EN WITH TAIL"/* 04C9 */,/*1226*/"CYRILLIC SMALL LETTER EN WITH TAIL"/* 04CA */, /*1227*/"CYRILLIC CAPITAL LETTER KHAKASSIAN CHE"/* 04CB */,/*1228*/"CYRILLIC SMALL LETTER KHAKASSIAN CHE"/* 04CC */, /*1229*/"CYRILLIC CAPITAL LETTER EM WITH TAIL"/* 04CD */,/*1230*/"CYRILLIC SMALL LETTER EM WITH TAIL"/* 04CE */, /*1231*/"CYRILLIC SMALL LETTER PALOCHKA"/* 04CF */,/*1232*/"CYRILLIC CAPITAL LETTER A WITH BREVE"/* 04D0 */, /*1233*/"CYRILLIC SMALL LETTER A WITH BREVE"/* 04D1 */,/*1234*/"CYRILLIC CAPITAL LETTER A WITH DIAERESIS"/* 04D2 */, /*1235*/"CYRILLIC SMALL LETTER A WITH DIAERESIS"/* 04D3 */,/*1236*/"CYRILLIC CAPITAL LIGATURE A IE"/* 04D4 */, /*1237*/"CYRILLIC SMALL LIGATURE A IE"/* 04D5 */,/*1238*/"CYRILLIC CAPITAL LETTER IE WITH BREVE"/* 04D6 */, /*1239*/"CYRILLIC SMALL LETTER IE WITH BREVE"/* 04D7 */,/*1240*/"CYRILLIC CAPITAL LETTER SCHWA"/* 04D8 */, /*1241*/"CYRILLIC SMALL LETTER SCHWA"/* 04D9 */,/*1242*/"CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS"/* 04DA */, /*1243*/"CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS"/* 04DB */, /*1244*/"CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS"/* 04DC */, /*1245*/"CYRILLIC SMALL LETTER ZHE WITH DIAERESIS"/* 04DD */, /*1246*/"CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS"/* 04DE */, /*1247*/"CYRILLIC SMALL LETTER ZE WITH DIAERESIS"/* 04DF */,/*1248*/"CYRILLIC CAPITAL LETTER ABKHASIAN DZE"/* 04E0 */, /*1249*/"CYRILLIC SMALL LETTER ABKHASIAN DZE"/* 04E1 */,/*1250*/"CYRILLIC CAPITAL LETTER I WITH MACRON"/* 04E2 */, /*1251*/"CYRILLIC SMALL LETTER I WITH MACRON"/* 04E3 */,/*1252*/"CYRILLIC CAPITAL LETTER I WITH DIAERESIS"/* 04E4 */, /*1253*/"CYRILLIC SMALL LETTER I WITH DIAERESIS"/* 04E5 */,/*1254*/"CYRILLIC CAPITAL LETTER O WITH DIAERESIS"/* 04E6 */, /*1255*/"CYRILLIC SMALL LETTER O WITH DIAERESIS"/* 04E7 */,/*1256*/"CYRILLIC CAPITAL LETTER BARRED O"/* 04E8 */, /*1257*/"CYRILLIC SMALL LETTER BARRED O"/* 04E9 */,/*1258*/"CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS"/* 04EA */, /*1259*/"CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS"/* 04EB */, /*1260*/"CYRILLIC CAPITAL LETTER E WITH DIAERESIS"/* 04EC */,/*1261*/"CYRILLIC SMALL LETTER E WITH DIAERESIS"/* 04ED */, /*1262*/"CYRILLIC CAPITAL LETTER U WITH MACRON"/* 04EE */,/*1263*/"CYRILLIC SMALL LETTER U WITH MACRON"/* 04EF */, /*1264*/"CYRILLIC CAPITAL LETTER U WITH DIAERESIS"/* 04F0 */,/*1265*/"CYRILLIC SMALL LETTER U WITH DIAERESIS"/* 04F1 */, /*1266*/"CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE"/* 04F2 */, /*1267*/"CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE"/* 04F3 */, /*1268*/"CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS"/* 04F4 */, /*1269*/"CYRILLIC SMALL LETTER CHE WITH DIAERESIS"/* 04F5 */, /*1270*/"CYRILLIC CAPITAL LETTER GHE WITH DESCENDER"/* 04F6 */, /*1271*/"CYRILLIC SMALL LETTER GHE WITH DESCENDER"/* 04F7 */, /*1272*/"CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS"/* 04F8 */, /*1273*/"CYRILLIC SMALL LETTER YERU WITH DIAERESIS"/* 04F9 */, /*1274*/"CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK"/* 04FA */, /*1275*/"CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK"/* 04FB */, /*1276*/"CYRILLIC CAPITAL LETTER HA WITH HOOK"/* 04FC */,/*1277*/"CYRILLIC SMALL LETTER HA WITH HOOK"/* 04FD */, /*1278*/"CYRILLIC CAPITAL LETTER HA WITH STROKE"/* 04FE */,/*1279*/"CYRILLIC SMALL LETTER HA WITH STROKE"/* 04FF */, /*1280*/"CYRILLIC CAPITAL LETTER KOMI DE"/* 0500 */,/*1281*/"CYRILLIC SMALL LETTER KOMI DE"/* 0501 */, /*1282*/"CYRILLIC CAPITAL LETTER KOMI DJE"/* 0502 */,/*1283*/"CYRILLIC SMALL LETTER KOMI DJE"/* 0503 */, /*1284*/"CYRILLIC CAPITAL LETTER KOMI ZJE"/* 0504 */,/*1285*/"CYRILLIC SMALL LETTER KOMI ZJE"/* 0505 */, /*1286*/"CYRILLIC CAPITAL LETTER KOMI DZJE"/* 0506 */,/*1287*/"CYRILLIC SMALL LETTER KOMI DZJE"/* 0507 */, /*1288*/"CYRILLIC CAPITAL LETTER KOMI LJE"/* 0508 */,/*1289*/"CYRILLIC SMALL LETTER KOMI LJE"/* 0509 */, /*1290*/"CYRILLIC CAPITAL LETTER KOMI NJE"/* 050A */,/*1291*/"CYRILLIC SMALL LETTER KOMI NJE"/* 050B */, /*1292*/"CYRILLIC CAPITAL LETTER KOMI SJE"/* 050C */,/*1293*/"CYRILLIC SMALL LETTER KOMI SJE"/* 050D */, /*1294*/"CYRILLIC CAPITAL LETTER KOMI TJE"/* 050E */,/*1295*/"CYRILLIC SMALL LETTER KOMI TJE"/* 050F */, /*1296*/"CYRILLIC CAPITAL LETTER REVERSED ZE"/* 0510 */,/*1297*/"CYRILLIC SMALL LETTER REVERSED ZE"/* 0511 */, /*1298*/"CYRILLIC CAPITAL LETTER EL WITH HOOK"/* 0512 */,/*1299*/"CYRILLIC SMALL LETTER EL WITH HOOK"/* 0513 */, /*1300*/"CYRILLIC CAPITAL LETTER LHA"/* 0514 */,/*1301*/"CYRILLIC SMALL LETTER LHA"/* 0515 */, /*1302*/"CYRILLIC CAPITAL LETTER RHA"/* 0516 */,/*1303*/"CYRILLIC SMALL LETTER RHA"/* 0517 */, /*1304*/"CYRILLIC CAPITAL LETTER YAE"/* 0518 */,/*1305*/"CYRILLIC SMALL LETTER YAE"/* 0519 */, /*1306*/"CYRILLIC CAPITAL LETTER QA"/* 051A */,/*1307*/"CYRILLIC SMALL LETTER QA"/* 051B */, /*1308*/"CYRILLIC CAPITAL LETTER WE"/* 051C */,/*1309*/"CYRILLIC SMALL LETTER WE"/* 051D */, /*1310*/"CYRILLIC CAPITAL LETTER ALEUT KA"/* 051E */,/*1311*/"CYRILLIC SMALL LETTER ALEUT KA"/* 051F */, /*1312*/"CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK"/* 0520 */, /*1313*/"CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK"/* 0521 */, /*1314*/"CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK"/* 0522 */, /*1315*/"CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK"/* 0523 */, /*1316*/"CYRILLIC CAPITAL LETTER PE WITH DESCENDER"/* 0524 */, /*1317*/"CYRILLIC SMALL LETTER PE WITH DESCENDER"/* 0525 */, /*1318*/"CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER"/* 0526 */, /*1319*/"CYRILLIC SMALL LETTER SHHA WITH DESCENDER"/* 0527 */, /*1320*/"CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK"/* 0528 */, /*1321*/"CYRILLIC SMALL LETTER EN WITH LEFT HOOK"/* 0529 */,/*1322*/"CYRILLIC CAPITAL LETTER DZZHE"/* 052A */, /*1323*/"CYRILLIC SMALL LETTER DZZHE"/* 052B */,/*1324*/"CYRILLIC CAPITAL LETTER DCHE"/* 052C */, /*1325*/"CYRILLIC SMALL LETTER DCHE"/* 052D */,/*1326*/"CYRILLIC CAPITAL LETTER EL WITH DESCENDER"/* 052E */, /*1327*/"CYRILLIC SMALL LETTER EL WITH DESCENDER"/* 052F */,NULL,/*1329*/"ARMENIAN CAPITAL LETTER AYB"/* 0531 */, /*1330*/"ARMENIAN CAPITAL LETTER BEN"/* 0532 */,/*1331*/"ARMENIAN CAPITAL LETTER GIM"/* 0533 */, /*1332*/"ARMENIAN CAPITAL LETTER DA"/* 0534 */,/*1333*/"ARMENIAN CAPITAL LETTER ECH"/* 0535 */, /*1334*/"ARMENIAN CAPITAL LETTER ZA"/* 0536 */,/*1335*/"ARMENIAN CAPITAL LETTER EH"/* 0537 */, /*1336*/"ARMENIAN CAPITAL LETTER ET"/* 0538 */,/*1337*/"ARMENIAN CAPITAL LETTER TO"/* 0539 */, /*1338*/"ARMENIAN CAPITAL LETTER ZHE"/* 053A */,/*1339*/"ARMENIAN CAPITAL LETTER INI"/* 053B */, /*1340*/"ARMENIAN CAPITAL LETTER LIWN"/* 053C */,/*1341*/"ARMENIAN CAPITAL LETTER XEH"/* 053D */, /*1342*/"ARMENIAN CAPITAL LETTER CA"/* 053E */,/*1343*/"ARMENIAN CAPITAL LETTER KEN"/* 053F */, /*1344*/"ARMENIAN CAPITAL LETTER HO"/* 0540 */,/*1345*/"ARMENIAN CAPITAL LETTER JA"/* 0541 */, /*1346*/"ARMENIAN CAPITAL LETTER GHAD"/* 0542 */,/*1347*/"ARMENIAN CAPITAL LETTER CHEH"/* 0543 */, /*1348*/"ARMENIAN CAPITAL LETTER MEN"/* 0544 */,/*1349*/"ARMENIAN CAPITAL LETTER YI"/* 0545 */, /*1350*/"ARMENIAN CAPITAL LETTER NOW"/* 0546 */,/*1351*/"ARMENIAN CAPITAL LETTER SHA"/* 0547 */, /*1352*/"ARMENIAN CAPITAL LETTER VO"/* 0548 */,/*1353*/"ARMENIAN CAPITAL LETTER CHA"/* 0549 */, /*1354*/"ARMENIAN CAPITAL LETTER PEH"/* 054A */,/*1355*/"ARMENIAN CAPITAL LETTER JHEH"/* 054B */, /*1356*/"ARMENIAN CAPITAL LETTER RA"/* 054C */,/*1357*/"ARMENIAN CAPITAL LETTER SEH"/* 054D */, /*1358*/"ARMENIAN CAPITAL LETTER VEW"/* 054E */,/*1359*/"ARMENIAN CAPITAL LETTER TIWN"/* 054F */, /*1360*/"ARMENIAN CAPITAL LETTER REH"/* 0550 */,/*1361*/"ARMENIAN CAPITAL LETTER CO"/* 0551 */, /*1362*/"ARMENIAN CAPITAL LETTER YIWN"/* 0552 */,/*1363*/"ARMENIAN CAPITAL LETTER PIWR"/* 0553 */, /*1364*/"ARMENIAN CAPITAL LETTER KEH"/* 0554 */,/*1365*/"ARMENIAN CAPITAL LETTER OH"/* 0555 */, /*1366*/"ARMENIAN CAPITAL LETTER FEH"/* 0556 */,NULL,NULL,/*1369*/"ARMENIAN MODIFIER LETTER LEFT HALF RING"/* 0559 */, /*1370*/"ARMENIAN APOSTROPHE"/* 055A */,/*1371*/"ARMENIAN EMPHASIS MARK"/* 055B */, /*1372*/"ARMENIAN EXCLAMATION MARK"/* 055C */,/*1373*/"ARMENIAN COMMA"/* 055D */, /*1374*/"ARMENIAN QUESTION MARK"/* 055E */,/*1375*/"ARMENIAN ABBREVIATION MARK"/* 055F */,NULL, /*1377*/"ARMENIAN SMALL LETTER AYB"/* 0561 */,/*1378*/"ARMENIAN SMALL LETTER BEN"/* 0562 */, /*1379*/"ARMENIAN SMALL LETTER GIM"/* 0563 */,/*1380*/"ARMENIAN SMALL LETTER DA"/* 0564 */, /*1381*/"ARMENIAN SMALL LETTER ECH"/* 0565 */,/*1382*/"ARMENIAN SMALL LETTER ZA"/* 0566 */, /*1383*/"ARMENIAN SMALL LETTER EH"/* 0567 */,/*1384*/"ARMENIAN SMALL LETTER ET"/* 0568 */, /*1385*/"ARMENIAN SMALL LETTER TO"/* 0569 */,/*1386*/"ARMENIAN SMALL LETTER ZHE"/* 056A */, /*1387*/"ARMENIAN SMALL LETTER INI"/* 056B */,/*1388*/"ARMENIAN SMALL LETTER LIWN"/* 056C */, /*1389*/"ARMENIAN SMALL LETTER XEH"/* 056D */,/*1390*/"ARMENIAN SMALL LETTER CA"/* 056E */, /*1391*/"ARMENIAN SMALL LETTER KEN"/* 056F */,/*1392*/"ARMENIAN SMALL LETTER HO"/* 0570 */, /*1393*/"ARMENIAN SMALL LETTER JA"/* 0571 */,/*1394*/"ARMENIAN SMALL LETTER GHAD"/* 0572 */, /*1395*/"ARMENIAN SMALL LETTER CHEH"/* 0573 */,/*1396*/"ARMENIAN SMALL LETTER MEN"/* 0574 */, /*1397*/"ARMENIAN SMALL LETTER YI"/* 0575 */,/*1398*/"ARMENIAN SMALL LETTER NOW"/* 0576 */, /*1399*/"ARMENIAN SMALL LETTER SHA"/* 0577 */,/*1400*/"ARMENIAN SMALL LETTER VO"/* 0578 */, /*1401*/"ARMENIAN SMALL LETTER CHA"/* 0579 */,/*1402*/"ARMENIAN SMALL LETTER PEH"/* 057A */, /*1403*/"ARMENIAN SMALL LETTER JHEH"/* 057B */,/*1404*/"ARMENIAN SMALL LETTER RA"/* 057C */, /*1405*/"ARMENIAN SMALL LETTER SEH"/* 057D */,/*1406*/"ARMENIAN SMALL LETTER VEW"/* 057E */, /*1407*/"ARMENIAN SMALL LETTER TIWN"/* 057F */,/*1408*/"ARMENIAN SMALL LETTER REH"/* 0580 */, /*1409*/"ARMENIAN SMALL LETTER CO"/* 0581 */,/*1410*/"ARMENIAN SMALL LETTER YIWN"/* 0582 */, /*1411*/"ARMENIAN SMALL LETTER PIWR"/* 0583 */,/*1412*/"ARMENIAN SMALL LETTER KEH"/* 0584 */, /*1413*/"ARMENIAN SMALL LETTER OH"/* 0585 */,/*1414*/"ARMENIAN SMALL LETTER FEH"/* 0586 */, /*1415*/"ARMENIAN SMALL LIGATURE ECH YIWN"/* 0587 */,NULL,/*1417*/"ARMENIAN FULL STOP"/* 0589 */, /*1418*/"ARMENIAN HYPHEN"/* 058A */,NULL,NULL,/*1421*/"RIGHT-FACING ARMENIAN ETERNITY SIGN"/* 058D */, /*1422*/"LEFT-FACING ARMENIAN ETERNITY SIGN"/* 058E */,/*1423*/"ARMENIAN DRAM SIGN"/* 058F */,NULL, /*1425*/"HEBREW ACCENT ETNAHTA"/* 0591 */,/*1426*/"HEBREW ACCENT SEGOL"/* 0592 */, /*1427*/"HEBREW ACCENT SHALSHELET"/* 0593 */,/*1428*/"HEBREW ACCENT ZAQEF QATAN"/* 0594 */, /*1429*/"HEBREW ACCENT ZAQEF GADOL"/* 0595 */,/*1430*/"HEBREW ACCENT TIPEHA"/* 0596 */, /*1431*/"HEBREW ACCENT REVIA"/* 0597 */,/*1432*/"HEBREW ACCENT ZARQA"/* 0598 */,/*1433*/"HEBREW ACCENT PASHTA"/* 0599 */, /*1434*/"HEBREW ACCENT YETIV"/* 059A */,/*1435*/"HEBREW ACCENT TEVIR"/* 059B */,/*1436*/"HEBREW ACCENT GERESH"/* 059C */, /*1437*/"HEBREW ACCENT GERESH MUQDAM"/* 059D */,/*1438*/"HEBREW ACCENT GERSHAYIM"/* 059E */, /*1439*/"HEBREW ACCENT QARNEY PARA"/* 059F */,/*1440*/"HEBREW ACCENT TELISHA GEDOLA"/* 05A0 */, /*1441*/"HEBREW ACCENT PAZER"/* 05A1 */,/*1442*/"HEBREW ACCENT ATNAH HAFUKH"/* 05A2 */, /*1443*/"HEBREW ACCENT MUNAH"/* 05A3 */,/*1444*/"HEBREW ACCENT MAHAPAKH"/* 05A4 */, /*1445*/"HEBREW ACCENT MERKHA"/* 05A5 */,/*1446*/"HEBREW ACCENT MERKHA KEFULA"/* 05A6 */, /*1447*/"HEBREW ACCENT DARGA"/* 05A7 */,/*1448*/"HEBREW ACCENT QADMA"/* 05A8 */, /*1449*/"HEBREW ACCENT TELISHA QETANA"/* 05A9 */,/*1450*/"HEBREW ACCENT YERAH BEN YOMO"/* 05AA */, /*1451*/"HEBREW ACCENT OLE"/* 05AB */,/*1452*/"HEBREW ACCENT ILUY"/* 05AC */,/*1453*/"HEBREW ACCENT DEHI"/* 05AD */, /*1454*/"HEBREW ACCENT ZINOR"/* 05AE */,/*1455*/"HEBREW MARK MASORA CIRCLE"/* 05AF */, /*1456*/"HEBREW POINT SHEVA"/* 05B0 */,/*1457*/"HEBREW POINT HATAF SEGOL"/* 05B1 */, /*1458*/"HEBREW POINT HATAF PATAH"/* 05B2 */,/*1459*/"HEBREW POINT HATAF QAMATS"/* 05B3 */, /*1460*/"HEBREW POINT HIRIQ"/* 05B4 */,/*1461*/"HEBREW POINT TSERE"/* 05B5 */,/*1462*/"HEBREW POINT SEGOL"/* 05B6 */, /*1463*/"HEBREW POINT PATAH"/* 05B7 */,/*1464*/"HEBREW POINT QAMATS"/* 05B8 */,/*1465*/"HEBREW POINT HOLAM"/* 05B9 */, /*1466*/"HEBREW POINT HOLAM HASER FOR VAV"/* 05BA */,/*1467*/"HEBREW POINT QUBUTS"/* 05BB */, /*1468*/"HEBREW POINT DAGESH OR MAPIQ"/* 05BC */,/*1469*/"HEBREW POINT METEG"/* 05BD */, /*1470*/"HEBREW PUNCTUATION MAQAF"/* 05BE */,/*1471*/"HEBREW POINT RAFE"/* 05BF */, /*1472*/"HEBREW PUNCTUATION PASEQ"/* 05C0 */,/*1473*/"HEBREW POINT SHIN DOT"/* 05C1 */, /*1474*/"HEBREW POINT SIN DOT"/* 05C2 */,/*1475*/"HEBREW PUNCTUATION SOF PASUQ"/* 05C3 */, /*1476*/"HEBREW MARK UPPER DOT"/* 05C4 */,/*1477*/"HEBREW MARK LOWER DOT"/* 05C5 */, /*1478*/"HEBREW PUNCTUATION NUN HAFUKHA"/* 05C6 */,/*1479*/"HEBREW POINT QAMATS QATAN"/* 05C7 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*1488*/"HEBREW LETTER ALEF"/* 05D0 */,/*1489*/"HEBREW LETTER BET"/* 05D1 */, /*1490*/"HEBREW LETTER GIMEL"/* 05D2 */,/*1491*/"HEBREW LETTER DALET"/* 05D3 */,/*1492*/"HEBREW LETTER HE"/* 05D4 */, /*1493*/"HEBREW LETTER VAV"/* 05D5 */,/*1494*/"HEBREW LETTER ZAYIN"/* 05D6 */,/*1495*/"HEBREW LETTER HET"/* 05D7 */, /*1496*/"HEBREW LETTER TET"/* 05D8 */,/*1497*/"HEBREW LETTER YOD"/* 05D9 */,/*1498*/"HEBREW LETTER FINAL KAF"/* 05DA */, /*1499*/"HEBREW LETTER KAF"/* 05DB */,/*1500*/"HEBREW LETTER LAMED"/* 05DC */, /*1501*/"HEBREW LETTER FINAL MEM"/* 05DD */,/*1502*/"HEBREW LETTER MEM"/* 05DE */, /*1503*/"HEBREW LETTER FINAL NUN"/* 05DF */,/*1504*/"HEBREW LETTER NUN"/* 05E0 */, /*1505*/"HEBREW LETTER SAMEKH"/* 05E1 */,/*1506*/"HEBREW LETTER AYIN"/* 05E2 */, /*1507*/"HEBREW LETTER FINAL PE"/* 05E3 */,/*1508*/"HEBREW LETTER PE"/* 05E4 */, /*1509*/"HEBREW LETTER FINAL TSADI"/* 05E5 */,/*1510*/"HEBREW LETTER TSADI"/* 05E6 */, /*1511*/"HEBREW LETTER QOF"/* 05E7 */,/*1512*/"HEBREW LETTER RESH"/* 05E8 */,/*1513*/"HEBREW LETTER SHIN"/* 05E9 */, /*1514*/"HEBREW LETTER TAV"/* 05EA */,NULL,NULL,NULL,NULL,NULL,/*1520*/"HEBREW LIGATURE YIDDISH DOUBLE VAV"/* 05F0 */, /*1521*/"HEBREW LIGATURE YIDDISH VAV YOD"/* 05F1 */,/*1522*/"HEBREW LIGATURE YIDDISH DOUBLE YOD"/* 05F2 */, /*1523*/"HEBREW PUNCTUATION GERESH"/* 05F3 */,/*1524*/"HEBREW PUNCTUATION GERSHAYIM"/* 05F4 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*1536*/"ARABIC NUMBER SIGN"/* 0600 */,/*1537*/"ARABIC SIGN SANAH"/* 0601 */, /*1538*/"ARABIC FOOTNOTE MARKER"/* 0602 */,/*1539*/"ARABIC SIGN SAFHA"/* 0603 */,/*1540*/"ARABIC SIGN SAMVAT"/* 0604 */, /*1541*/"ARABIC NUMBER MARK ABOVE"/* 0605 */,/*1542*/"ARABIC-INDIC CUBE ROOT"/* 0606 */, /*1543*/"ARABIC-INDIC FOURTH ROOT"/* 0607 */,/*1544*/"ARABIC RAY"/* 0608 */, /*1545*/"ARABIC-INDIC PER MILLE SIGN"/* 0609 */,/*1546*/"ARABIC-INDIC PER TEN THOUSAND SIGN"/* 060A */, /*1547*/"AFGHANI SIGN"/* 060B */,/*1548*/"ARABIC COMMA"/* 060C */,/*1549*/"ARABIC DATE SEPARATOR"/* 060D */, /*1550*/"ARABIC POETIC VERSE SIGN"/* 060E */,/*1551*/"ARABIC SIGN MISRA"/* 060F */, /*1552*/"ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM"/* 0610 */,/*1553*/"ARABIC SIGN ALAYHE ASSALLAM"/* 0611 */, /*1554*/"ARABIC SIGN RAHMATULLAH ALAYHE"/* 0612 */,/*1555*/"ARABIC SIGN RADI ALLAHOU ANHU"/* 0613 */, /*1556*/"ARABIC SIGN TAKHALLUS"/* 0614 */,/*1557*/"ARABIC SMALL HIGH TAH"/* 0615 */, /*1558*/"ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH"/* 0616 */,/*1559*/"ARABIC SMALL HIGH ZAIN"/* 0617 */, /*1560*/"ARABIC SMALL FATHA"/* 0618 */,/*1561*/"ARABIC SMALL DAMMA"/* 0619 */,/*1562*/"ARABIC SMALL KASRA"/* 061A */, /*1563*/"ARABIC SEMICOLON"/* 061B */,/*1564*/"ARABIC LETTER MARK"/* 061C */,NULL, /*1566*/"ARABIC TRIPLE DOT PUNCTUATION MARK"/* 061E */,/*1567*/"ARABIC QUESTION MARK"/* 061F */, /*1568*/"ARABIC LETTER KASHMIRI YEH"/* 0620 */,/*1569*/"ARABIC LETTER HAMZA"/* 0621 */, /*1570*/"ARABIC LETTER ALEF WITH MADDA ABOVE"/* 0622 */,/*1571*/"ARABIC LETTER ALEF WITH HAMZA ABOVE"/* 0623 */, /*1572*/"ARABIC LETTER WAW WITH HAMZA ABOVE"/* 0624 */,/*1573*/"ARABIC LETTER ALEF WITH HAMZA BELOW"/* 0625 */, /*1574*/"ARABIC LETTER YEH WITH HAMZA ABOVE"/* 0626 */,/*1575*/"ARABIC LETTER ALEF"/* 0627 */, /*1576*/"ARABIC LETTER BEH"/* 0628 */,/*1577*/"ARABIC LETTER TEH MARBUTA"/* 0629 */, /*1578*/"ARABIC LETTER TEH"/* 062A */,/*1579*/"ARABIC LETTER THEH"/* 062B */,/*1580*/"ARABIC LETTER JEEM"/* 062C */, /*1581*/"ARABIC LETTER HAH"/* 062D */,/*1582*/"ARABIC LETTER KHAH"/* 062E */,/*1583*/"ARABIC LETTER DAL"/* 062F */, /*1584*/"ARABIC LETTER THAL"/* 0630 */,/*1585*/"ARABIC LETTER REH"/* 0631 */,/*1586*/"ARABIC LETTER ZAIN"/* 0632 */, /*1587*/"ARABIC LETTER SEEN"/* 0633 */,/*1588*/"ARABIC LETTER SHEEN"/* 0634 */,/*1589*/"ARABIC LETTER SAD"/* 0635 */, /*1590*/"ARABIC LETTER DAD"/* 0636 */,/*1591*/"ARABIC LETTER TAH"/* 0637 */,/*1592*/"ARABIC LETTER ZAH"/* 0638 */, /*1593*/"ARABIC LETTER AIN"/* 0639 */,/*1594*/"ARABIC LETTER GHAIN"/* 063A */, /*1595*/"ARABIC LETTER KEHEH WITH TWO DOTS ABOVE"/* 063B */, /*1596*/"ARABIC LETTER KEHEH WITH THREE DOTS BELOW"/* 063C */, /*1597*/"ARABIC LETTER FARSI YEH WITH INVERTED V"/* 063D */, /*1598*/"ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE"/* 063E */, /*1599*/"ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE"/* 063F */,/*1600*/"ARABIC TATWEEL"/* 0640 */, /*1601*/"ARABIC LETTER FEH"/* 0641 */,/*1602*/"ARABIC LETTER QAF"/* 0642 */,/*1603*/"ARABIC LETTER KAF"/* 0643 */, /*1604*/"ARABIC LETTER LAM"/* 0644 */,/*1605*/"ARABIC LETTER MEEM"/* 0645 */,/*1606*/"ARABIC LETTER NOON"/* 0646 */, /*1607*/"ARABIC LETTER HEH"/* 0647 */,/*1608*/"ARABIC LETTER WAW"/* 0648 */, /*1609*/"ARABIC LETTER ALEF MAKSURA"/* 0649 */,/*1610*/"ARABIC LETTER YEH"/* 064A */,/*1611*/"ARABIC FATHATAN"/* 064B */, /*1612*/"ARABIC DAMMATAN"/* 064C */,/*1613*/"ARABIC KASRATAN"/* 064D */,/*1614*/"ARABIC FATHA"/* 064E */, /*1615*/"ARABIC DAMMA"/* 064F */,/*1616*/"ARABIC KASRA"/* 0650 */,/*1617*/"ARABIC SHADDA"/* 0651 */, /*1618*/"ARABIC SUKUN"/* 0652 */,/*1619*/"ARABIC MADDAH ABOVE"/* 0653 */,/*1620*/"ARABIC HAMZA ABOVE"/* 0654 */, /*1621*/"ARABIC HAMZA BELOW"/* 0655 */,/*1622*/"ARABIC SUBSCRIPT ALEF"/* 0656 */, /*1623*/"ARABIC INVERTED DAMMA"/* 0657 */,/*1624*/"ARABIC MARK NOON GHUNNA"/* 0658 */, /*1625*/"ARABIC ZWARAKAY"/* 0659 */,/*1626*/"ARABIC VOWEL SIGN SMALL V ABOVE"/* 065A */, /*1627*/"ARABIC VOWEL SIGN INVERTED SMALL V ABOVE"/* 065B */,/*1628*/"ARABIC VOWEL SIGN DOT BELOW"/* 065C */, /*1629*/"ARABIC REVERSED DAMMA"/* 065D */,/*1630*/"ARABIC FATHA WITH TWO DOTS"/* 065E */, /*1631*/"ARABIC WAVY HAMZA BELOW"/* 065F */,/*1632*/"ARABIC-INDIC DIGIT ZERO"/* 0660 */, /*1633*/"ARABIC-INDIC DIGIT ONE"/* 0661 */,/*1634*/"ARABIC-INDIC DIGIT TWO"/* 0662 */, /*1635*/"ARABIC-INDIC DIGIT THREE"/* 0663 */,/*1636*/"ARABIC-INDIC DIGIT FOUR"/* 0664 */, /*1637*/"ARABIC-INDIC DIGIT FIVE"/* 0665 */,/*1638*/"ARABIC-INDIC DIGIT SIX"/* 0666 */, /*1639*/"ARABIC-INDIC DIGIT SEVEN"/* 0667 */,/*1640*/"ARABIC-INDIC DIGIT EIGHT"/* 0668 */, /*1641*/"ARABIC-INDIC DIGIT NINE"/* 0669 */,/*1642*/"ARABIC PERCENT SIGN"/* 066A */, /*1643*/"ARABIC DECIMAL SEPARATOR"/* 066B */,/*1644*/"ARABIC THOUSANDS SEPARATOR"/* 066C */, /*1645*/"ARABIC FIVE POINTED STAR"/* 066D */,/*1646*/"ARABIC LETTER DOTLESS BEH"/* 066E */, /*1647*/"ARABIC LETTER DOTLESS QAF"/* 066F */,/*1648*/"ARABIC LETTER SUPERSCRIPT ALEF"/* 0670 */, /*1649*/"ARABIC LETTER ALEF WASLA"/* 0671 */,/*1650*/"ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE"/* 0672 */, /*1651*/"ARABIC LETTER ALEF WITH WAVY HAMZA BELOW"/* 0673 */,/*1652*/"ARABIC LETTER HIGH HAMZA"/* 0674 */, /*1653*/"ARABIC LETTER HIGH HAMZA ALEF"/* 0675 */,/*1654*/"ARABIC LETTER HIGH HAMZA WAW"/* 0676 */, /*1655*/"ARABIC LETTER U WITH HAMZA ABOVE"/* 0677 */,/*1656*/"ARABIC LETTER HIGH HAMZA YEH"/* 0678 */, /*1657*/"ARABIC LETTER TTEH"/* 0679 */,/*1658*/"ARABIC LETTER TTEHEH"/* 067A */,/*1659*/"ARABIC LETTER BEEH"/* 067B */, /*1660*/"ARABIC LETTER TEH WITH RING"/* 067C */,/*1661*/"ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS"/* 067D */, /*1662*/"ARABIC LETTER PEH"/* 067E */,/*1663*/"ARABIC LETTER TEHEH"/* 067F */,/*1664*/"ARABIC LETTER BEHEH"/* 0680 */, /*1665*/"ARABIC LETTER HAH WITH HAMZA ABOVE"/* 0681 */, /*1666*/"ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE"/* 0682 */,/*1667*/"ARABIC LETTER NYEH"/* 0683 */, /*1668*/"ARABIC LETTER DYEH"/* 0684 */,/*1669*/"ARABIC LETTER HAH WITH THREE DOTS ABOVE"/* 0685 */, /*1670*/"ARABIC LETTER TCHEH"/* 0686 */,/*1671*/"ARABIC LETTER TCHEHEH"/* 0687 */,/*1672*/"ARABIC LETTER DDAL"/* 0688 */, /*1673*/"ARABIC LETTER DAL WITH RING"/* 0689 */,/*1674*/"ARABIC LETTER DAL WITH DOT BELOW"/* 068A */, /*1675*/"ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH"/* 068B */,/*1676*/"ARABIC LETTER DAHAL"/* 068C */, /*1677*/"ARABIC LETTER DDAHAL"/* 068D */,/*1678*/"ARABIC LETTER DUL"/* 068E */, /*1679*/"ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS"/* 068F */, /*1680*/"ARABIC LETTER DAL WITH FOUR DOTS ABOVE"/* 0690 */,/*1681*/"ARABIC LETTER RREH"/* 0691 */, /*1682*/"ARABIC LETTER REH WITH SMALL V"/* 0692 */,/*1683*/"ARABIC LETTER REH WITH RING"/* 0693 */, /*1684*/"ARABIC LETTER REH WITH DOT BELOW"/* 0694 */,/*1685*/"ARABIC LETTER REH WITH SMALL V BELOW"/* 0695 */, /*1686*/"ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE"/* 0696 */, /*1687*/"ARABIC LETTER REH WITH TWO DOTS ABOVE"/* 0697 */,/*1688*/"ARABIC LETTER JEH"/* 0698 */, /*1689*/"ARABIC LETTER REH WITH FOUR DOTS ABOVE"/* 0699 */, /*1690*/"ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE"/* 069A */, /*1691*/"ARABIC LETTER SEEN WITH THREE DOTS BELOW"/* 069B */, /*1692*/"ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE"/* 069C */, /*1693*/"ARABIC LETTER SAD WITH TWO DOTS BELOW"/* 069D */,/*1694*/"ARABIC LETTER SAD WITH THREE DOTS ABOVE"/* 069E */, /*1695*/"ARABIC LETTER TAH WITH THREE DOTS ABOVE"/* 069F */,/*1696*/"ARABIC LETTER AIN WITH THREE DOTS ABOVE"/* 06A0 */, /*1697*/"ARABIC LETTER DOTLESS FEH"/* 06A1 */,/*1698*/"ARABIC LETTER FEH WITH DOT MOVED BELOW"/* 06A2 */, /*1699*/"ARABIC LETTER FEH WITH DOT BELOW"/* 06A3 */,/*1700*/"ARABIC LETTER VEH"/* 06A4 */, /*1701*/"ARABIC LETTER FEH WITH THREE DOTS BELOW"/* 06A5 */,/*1702*/"ARABIC LETTER PEHEH"/* 06A6 */, /*1703*/"ARABIC LETTER QAF WITH DOT ABOVE"/* 06A7 */,/*1704*/"ARABIC LETTER QAF WITH THREE DOTS ABOVE"/* 06A8 */, /*1705*/"ARABIC LETTER KEHEH"/* 06A9 */,/*1706*/"ARABIC LETTER SWASH KAF"/* 06AA */, /*1707*/"ARABIC LETTER KAF WITH RING"/* 06AB */,/*1708*/"ARABIC LETTER KAF WITH DOT ABOVE"/* 06AC */, /*1709*/"ARABIC LETTER NG"/* 06AD */,/*1710*/"ARABIC LETTER KAF WITH THREE DOTS BELOW"/* 06AE */, /*1711*/"ARABIC LETTER GAF"/* 06AF */,/*1712*/"ARABIC LETTER GAF WITH RING"/* 06B0 */, /*1713*/"ARABIC LETTER NGOEH"/* 06B1 */,/*1714*/"ARABIC LETTER GAF WITH TWO DOTS BELOW"/* 06B2 */, /*1715*/"ARABIC LETTER GUEH"/* 06B3 */,/*1716*/"ARABIC LETTER GAF WITH THREE DOTS ABOVE"/* 06B4 */, /*1717*/"ARABIC LETTER LAM WITH SMALL V"/* 06B5 */,/*1718*/"ARABIC LETTER LAM WITH DOT ABOVE"/* 06B6 */, /*1719*/"ARABIC LETTER LAM WITH THREE DOTS ABOVE"/* 06B7 */,/*1720*/"ARABIC LETTER LAM WITH THREE DOTS BELOW"/* 06B8 */, /*1721*/"ARABIC LETTER NOON WITH DOT BELOW"/* 06B9 */,/*1722*/"ARABIC LETTER NOON GHUNNA"/* 06BA */, /*1723*/"ARABIC LETTER RNOON"/* 06BB */,/*1724*/"ARABIC LETTER NOON WITH RING"/* 06BC */, /*1725*/"ARABIC LETTER NOON WITH THREE DOTS ABOVE"/* 06BD */,/*1726*/"ARABIC LETTER HEH DOACHASHMEE"/* 06BE */, /*1727*/"ARABIC LETTER TCHEH WITH DOT ABOVE"/* 06BF */,/*1728*/"ARABIC LETTER HEH WITH YEH ABOVE"/* 06C0 */, /*1729*/"ARABIC LETTER HEH GOAL"/* 06C1 */,/*1730*/"ARABIC LETTER HEH GOAL WITH HAMZA ABOVE"/* 06C2 */, /*1731*/"ARABIC LETTER TEH MARBUTA GOAL"/* 06C3 */,/*1732*/"ARABIC LETTER WAW WITH RING"/* 06C4 */, /*1733*/"ARABIC LETTER KIRGHIZ OE"/* 06C5 */,/*1734*/"ARABIC LETTER OE"/* 06C6 */,/*1735*/"ARABIC LETTER U"/* 06C7 */, /*1736*/"ARABIC LETTER YU"/* 06C8 */,/*1737*/"ARABIC LETTER KIRGHIZ YU"/* 06C9 */, /*1738*/"ARABIC LETTER WAW WITH TWO DOTS ABOVE"/* 06CA */,/*1739*/"ARABIC LETTER VE"/* 06CB */, /*1740*/"ARABIC LETTER FARSI YEH"/* 06CC */,/*1741*/"ARABIC LETTER YEH WITH TAIL"/* 06CD */, /*1742*/"ARABIC LETTER YEH WITH SMALL V"/* 06CE */,/*1743*/"ARABIC LETTER WAW WITH DOT ABOVE"/* 06CF */, /*1744*/"ARABIC LETTER E"/* 06D0 */,/*1745*/"ARABIC LETTER YEH WITH THREE DOTS BELOW"/* 06D1 */, /*1746*/"ARABIC LETTER YEH BARREE"/* 06D2 */,/*1747*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE"/* 06D3 */, /*1748*/"ARABIC FULL STOP"/* 06D4 */,/*1749*/"ARABIC LETTER AE"/* 06D5 */, /*1750*/"ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA"/* 06D6 */, /*1751*/"ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA"/* 06D7 */, /*1752*/"ARABIC SMALL HIGH MEEM INITIAL FORM"/* 06D8 */,/*1753*/"ARABIC SMALL HIGH LAM ALEF"/* 06D9 */, /*1754*/"ARABIC SMALL HIGH JEEM"/* 06DA */,/*1755*/"ARABIC SMALL HIGH THREE DOTS"/* 06DB */, /*1756*/"ARABIC SMALL HIGH SEEN"/* 06DC */,/*1757*/"ARABIC END OF AYAH"/* 06DD */, /*1758*/"ARABIC START OF RUB EL HIZB"/* 06DE */,/*1759*/"ARABIC SMALL HIGH ROUNDED ZERO"/* 06DF */, /*1760*/"ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO"/* 06E0 */, /*1761*/"ARABIC SMALL HIGH DOTLESS HEAD OF KHAH"/* 06E1 */,/*1762*/"ARABIC SMALL HIGH MEEM ISOLATED FORM"/* 06E2 */, /*1763*/"ARABIC SMALL LOW SEEN"/* 06E3 */,/*1764*/"ARABIC SMALL HIGH MADDA"/* 06E4 */, /*1765*/"ARABIC SMALL WAW"/* 06E5 */,/*1766*/"ARABIC SMALL YEH"/* 06E6 */,/*1767*/"ARABIC SMALL HIGH YEH"/* 06E7 */, /*1768*/"ARABIC SMALL HIGH NOON"/* 06E8 */,/*1769*/"ARABIC PLACE OF SAJDAH"/* 06E9 */, /*1770*/"ARABIC EMPTY CENTRE LOW STOP"/* 06EA */,/*1771*/"ARABIC EMPTY CENTRE HIGH STOP"/* 06EB */, /*1772*/"ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE"/* 06EC */,/*1773*/"ARABIC SMALL LOW MEEM"/* 06ED */, /*1774*/"ARABIC LETTER DAL WITH INVERTED V"/* 06EE */,/*1775*/"ARABIC LETTER REH WITH INVERTED V"/* 06EF */, /*1776*/"EXTENDED ARABIC-INDIC DIGIT ZERO"/* 06F0 */,/*1777*/"EXTENDED ARABIC-INDIC DIGIT ONE"/* 06F1 */, /*1778*/"EXTENDED ARABIC-INDIC DIGIT TWO"/* 06F2 */,/*1779*/"EXTENDED ARABIC-INDIC DIGIT THREE"/* 06F3 */, /*1780*/"EXTENDED ARABIC-INDIC DIGIT FOUR"/* 06F4 */,/*1781*/"EXTENDED ARABIC-INDIC DIGIT FIVE"/* 06F5 */, /*1782*/"EXTENDED ARABIC-INDIC DIGIT SIX"/* 06F6 */,/*1783*/"EXTENDED ARABIC-INDIC DIGIT SEVEN"/* 06F7 */, /*1784*/"EXTENDED ARABIC-INDIC DIGIT EIGHT"/* 06F8 */,/*1785*/"EXTENDED ARABIC-INDIC DIGIT NINE"/* 06F9 */, /*1786*/"ARABIC LETTER SHEEN WITH DOT BELOW"/* 06FA */,/*1787*/"ARABIC LETTER DAD WITH DOT BELOW"/* 06FB */, /*1788*/"ARABIC LETTER GHAIN WITH DOT BELOW"/* 06FC */,/*1789*/"ARABIC SIGN SINDHI AMPERSAND"/* 06FD */, /*1790*/"ARABIC SIGN SINDHI POSTPOSITION MEN"/* 06FE */,/*1791*/"ARABIC LETTER HEH WITH INVERTED V"/* 06FF */, /*1792*/"SYRIAC END OF PARAGRAPH"/* 0700 */,/*1793*/"SYRIAC SUPRALINEAR FULL STOP"/* 0701 */, /*1794*/"SYRIAC SUBLINEAR FULL STOP"/* 0702 */,/*1795*/"SYRIAC SUPRALINEAR COLON"/* 0703 */, /*1796*/"SYRIAC SUBLINEAR COLON"/* 0704 */,/*1797*/"SYRIAC HORIZONTAL COLON"/* 0705 */, /*1798*/"SYRIAC COLON SKEWED LEFT"/* 0706 */,/*1799*/"SYRIAC COLON SKEWED RIGHT"/* 0707 */, /*1800*/"SYRIAC SUPRALINEAR COLON SKEWED LEFT"/* 0708 */,/*1801*/"SYRIAC SUBLINEAR COLON SKEWED RIGHT"/* 0709 */, /*1802*/"SYRIAC CONTRACTION"/* 070A */,/*1803*/"SYRIAC HARKLEAN OBELUS"/* 070B */, /*1804*/"SYRIAC HARKLEAN METOBELUS"/* 070C */,/*1805*/"SYRIAC HARKLEAN ASTERISCUS"/* 070D */,NULL, /*1807*/"SYRIAC ABBREVIATION MARK"/* 070F */,/*1808*/"SYRIAC LETTER ALAPH"/* 0710 */, /*1809*/"SYRIAC LETTER SUPERSCRIPT ALAPH"/* 0711 */,/*1810*/"SYRIAC LETTER BETH"/* 0712 */, /*1811*/"SYRIAC LETTER GAMAL"/* 0713 */,/*1812*/"SYRIAC LETTER GAMAL GARSHUNI"/* 0714 */, /*1813*/"SYRIAC LETTER DALATH"/* 0715 */,/*1814*/"SYRIAC LETTER DOTLESS DALATH RISH"/* 0716 */, /*1815*/"SYRIAC LETTER HE"/* 0717 */,/*1816*/"SYRIAC LETTER WAW"/* 0718 */,/*1817*/"SYRIAC LETTER ZAIN"/* 0719 */, /*1818*/"SYRIAC LETTER HETH"/* 071A */,/*1819*/"SYRIAC LETTER TETH"/* 071B */, /*1820*/"SYRIAC LETTER TETH GARSHUNI"/* 071C */,/*1821*/"SYRIAC LETTER YUDH"/* 071D */, /*1822*/"SYRIAC LETTER YUDH HE"/* 071E */,/*1823*/"SYRIAC LETTER KAPH"/* 071F */, /*1824*/"SYRIAC LETTER LAMADH"/* 0720 */,/*1825*/"SYRIAC LETTER MIM"/* 0721 */,/*1826*/"SYRIAC LETTER NUN"/* 0722 */, /*1827*/"SYRIAC LETTER SEMKATH"/* 0723 */,/*1828*/"SYRIAC LETTER FINAL SEMKATH"/* 0724 */, /*1829*/"SYRIAC LETTER E"/* 0725 */,/*1830*/"SYRIAC LETTER PE"/* 0726 */,/*1831*/"SYRIAC LETTER REVERSED PE"/* 0727 */, /*1832*/"SYRIAC LETTER SADHE"/* 0728 */,/*1833*/"SYRIAC LETTER QAPH"/* 0729 */,/*1834*/"SYRIAC LETTER RISH"/* 072A */, /*1835*/"SYRIAC LETTER SHIN"/* 072B */,/*1836*/"SYRIAC LETTER TAW"/* 072C */, /*1837*/"SYRIAC LETTER PERSIAN BHETH"/* 072D */,/*1838*/"SYRIAC LETTER PERSIAN GHAMAL"/* 072E */, /*1839*/"SYRIAC LETTER PERSIAN DHALATH"/* 072F */,/*1840*/"SYRIAC PTHAHA ABOVE"/* 0730 */, /*1841*/"SYRIAC PTHAHA BELOW"/* 0731 */,/*1842*/"SYRIAC PTHAHA DOTTED"/* 0732 */,/*1843*/"SYRIAC ZQAPHA ABOVE"/* 0733 */, /*1844*/"SYRIAC ZQAPHA BELOW"/* 0734 */,/*1845*/"SYRIAC ZQAPHA DOTTED"/* 0735 */,/*1846*/"SYRIAC RBASA ABOVE"/* 0736 */, /*1847*/"SYRIAC RBASA BELOW"/* 0737 */,/*1848*/"SYRIAC DOTTED ZLAMA HORIZONTAL"/* 0738 */, /*1849*/"SYRIAC DOTTED ZLAMA ANGULAR"/* 0739 */,/*1850*/"SYRIAC HBASA ABOVE"/* 073A */, /*1851*/"SYRIAC HBASA BELOW"/* 073B */,/*1852*/"SYRIAC HBASA-ESASA DOTTED"/* 073C */, /*1853*/"SYRIAC ESASA ABOVE"/* 073D */,/*1854*/"SYRIAC ESASA BELOW"/* 073E */,/*1855*/"SYRIAC RWAHA"/* 073F */, /*1856*/"SYRIAC FEMININE DOT"/* 0740 */,/*1857*/"SYRIAC QUSHSHAYA"/* 0741 */,/*1858*/"SYRIAC RUKKAKHA"/* 0742 */, /*1859*/"SYRIAC TWO VERTICAL DOTS ABOVE"/* 0743 */,/*1860*/"SYRIAC TWO VERTICAL DOTS BELOW"/* 0744 */, /*1861*/"SYRIAC THREE DOTS ABOVE"/* 0745 */,/*1862*/"SYRIAC THREE DOTS BELOW"/* 0746 */, /*1863*/"SYRIAC OBLIQUE LINE ABOVE"/* 0747 */,/*1864*/"SYRIAC OBLIQUE LINE BELOW"/* 0748 */, /*1865*/"SYRIAC MUSIC"/* 0749 */,/*1866*/"SYRIAC BARREKH"/* 074A */,NULL,NULL, /*1869*/"SYRIAC LETTER SOGDIAN ZHAIN"/* 074D */,/*1870*/"SYRIAC LETTER SOGDIAN KHAPH"/* 074E */, /*1871*/"SYRIAC LETTER SOGDIAN FE"/* 074F */,/*1872*/"ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW"/* 0750 */, /*1873*/"ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE"/* 0751 */, /*1874*/"ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0752 */, /*1875*/"ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE"/* 0753 */, /*1876*/"ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE"/* 0754 */, /*1877*/"ARABIC LETTER BEH WITH INVERTED SMALL V BELOW"/* 0755 */,/*1878*/"ARABIC LETTER BEH WITH SMALL V"/* 0756 */, /*1879*/"ARABIC LETTER HAH WITH TWO DOTS ABOVE"/* 0757 */, /*1880*/"ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0758 */, /*1881*/"ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH"/* 0759 */, /*1882*/"ARABIC LETTER DAL WITH INVERTED SMALL V BELOW"/* 075A */,/*1883*/"ARABIC LETTER REH WITH STROKE"/* 075B */, /*1884*/"ARABIC LETTER SEEN WITH FOUR DOTS ABOVE"/* 075C */,/*1885*/"ARABIC LETTER AIN WITH TWO DOTS ABOVE"/* 075D */, /*1886*/"ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE"/* 075E */, /*1887*/"ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE"/* 075F */, /*1888*/"ARABIC LETTER FEH WITH TWO DOTS BELOW"/* 0760 */, /*1889*/"ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0761 */, /*1890*/"ARABIC LETTER KEHEH WITH DOT ABOVE"/* 0762 */,/*1891*/"ARABIC LETTER KEHEH WITH THREE DOTS ABOVE"/* 0763 */, /*1892*/"ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0764 */, /*1893*/"ARABIC LETTER MEEM WITH DOT ABOVE"/* 0765 */,/*1894*/"ARABIC LETTER MEEM WITH DOT BELOW"/* 0766 */, /*1895*/"ARABIC LETTER NOON WITH TWO DOTS BELOW"/* 0767 */,/*1896*/"ARABIC LETTER NOON WITH SMALL TAH"/* 0768 */, /*1897*/"ARABIC LETTER NOON WITH SMALL V"/* 0769 */,/*1898*/"ARABIC LETTER LAM WITH BAR"/* 076A */, /*1899*/"ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE"/* 076B */, /*1900*/"ARABIC LETTER REH WITH HAMZA ABOVE"/* 076C */, /*1901*/"ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE"/* 076D */, /*1902*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW"/* 076E */, /*1903*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 076F */, /*1904*/"ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 0770 */, /*1905*/"ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 0771 */, /*1906*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE"/* 0772 */, /*1907*/"ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0773 */, /*1908*/"ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0774 */, /*1909*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0775 */, /*1910*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0776 */, /*1911*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW"/* 0777 */, /*1912*/"ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0778 */, /*1913*/"ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0779 */, /*1914*/"ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 077A */, /*1915*/"ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 077B */, /*1916*/"ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW"/* 077C */, /*1917*/"ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE"/* 077D */, /*1918*/"ARABIC LETTER SEEN WITH INVERTED V"/* 077E */,/*1919*/"ARABIC LETTER KAF WITH TWO DOTS ABOVE"/* 077F */, /*1920*/"THAANA LETTER HAA"/* 0780 */,/*1921*/"THAANA LETTER SHAVIYANI"/* 0781 */, /*1922*/"THAANA LETTER NOONU"/* 0782 */,/*1923*/"THAANA LETTER RAA"/* 0783 */,/*1924*/"THAANA LETTER BAA"/* 0784 */, /*1925*/"THAANA LETTER LHAVIYANI"/* 0785 */,/*1926*/"THAANA LETTER KAAFU"/* 0786 */, /*1927*/"THAANA LETTER ALIFU"/* 0787 */,/*1928*/"THAANA LETTER VAAVU"/* 0788 */,/*1929*/"THAANA LETTER MEEMU"/* 0789 */, /*1930*/"THAANA LETTER FAAFU"/* 078A */,/*1931*/"THAANA LETTER DHAALU"/* 078B */,/*1932*/"THAANA LETTER THAA"/* 078C */, /*1933*/"THAANA LETTER LAAMU"/* 078D */,/*1934*/"THAANA LETTER GAAFU"/* 078E */, /*1935*/"THAANA LETTER GNAVIYANI"/* 078F */,/*1936*/"THAANA LETTER SEENU"/* 0790 */, /*1937*/"THAANA LETTER DAVIYANI"/* 0791 */,/*1938*/"THAANA LETTER ZAVIYANI"/* 0792 */, /*1939*/"THAANA LETTER TAVIYANI"/* 0793 */,/*1940*/"THAANA LETTER YAA"/* 0794 */, /*1941*/"THAANA LETTER PAVIYANI"/* 0795 */,/*1942*/"THAANA LETTER JAVIYANI"/* 0796 */, /*1943*/"THAANA LETTER CHAVIYANI"/* 0797 */,/*1944*/"THAANA LETTER TTAA"/* 0798 */, /*1945*/"THAANA LETTER HHAA"/* 0799 */,/*1946*/"THAANA LETTER KHAA"/* 079A */,/*1947*/"THAANA LETTER THAALU"/* 079B */, /*1948*/"THAANA LETTER ZAA"/* 079C */,/*1949*/"THAANA LETTER SHEENU"/* 079D */,/*1950*/"THAANA LETTER SAADHU"/* 079E */, /*1951*/"THAANA LETTER DAADHU"/* 079F */,/*1952*/"THAANA LETTER TO"/* 07A0 */,/*1953*/"THAANA LETTER ZO"/* 07A1 */, /*1954*/"THAANA LETTER AINU"/* 07A2 */,/*1955*/"THAANA LETTER GHAINU"/* 07A3 */,/*1956*/"THAANA LETTER QAAFU"/* 07A4 */, /*1957*/"THAANA LETTER WAAVU"/* 07A5 */,/*1958*/"THAANA ABAFILI"/* 07A6 */,/*1959*/"THAANA AABAAFILI"/* 07A7 */, /*1960*/"THAANA IBIFILI"/* 07A8 */,/*1961*/"THAANA EEBEEFILI"/* 07A9 */,/*1962*/"THAANA UBUFILI"/* 07AA */, /*1963*/"THAANA OOBOOFILI"/* 07AB */,/*1964*/"THAANA EBEFILI"/* 07AC */,/*1965*/"THAANA EYBEYFILI"/* 07AD */, /*1966*/"THAANA OBOFILI"/* 07AE */,/*1967*/"THAANA OABOAFILI"/* 07AF */,/*1968*/"THAANA SUKUN"/* 07B0 */, /*1969*/"THAANA LETTER NAA"/* 07B1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*1984*/"NKO DIGIT ZERO"/* 07C0 */,/*1985*/"NKO DIGIT ONE"/* 07C1 */,/*1986*/"NKO DIGIT TWO"/* 07C2 */, /*1987*/"NKO DIGIT THREE"/* 07C3 */,/*1988*/"NKO DIGIT FOUR"/* 07C4 */,/*1989*/"NKO DIGIT FIVE"/* 07C5 */, /*1990*/"NKO DIGIT SIX"/* 07C6 */,/*1991*/"NKO DIGIT SEVEN"/* 07C7 */,/*1992*/"NKO DIGIT EIGHT"/* 07C8 */, /*1993*/"NKO DIGIT NINE"/* 07C9 */,/*1994*/"NKO LETTER A"/* 07CA */,/*1995*/"NKO LETTER EE"/* 07CB */, /*1996*/"NKO LETTER I"/* 07CC */,/*1997*/"NKO LETTER E"/* 07CD */,/*1998*/"NKO LETTER U"/* 07CE */, /*1999*/"NKO LETTER OO"/* 07CF */,/*2000*/"NKO LETTER O"/* 07D0 */,/*2001*/"NKO LETTER DAGBASINNA"/* 07D1 */, /*2002*/"NKO LETTER N"/* 07D2 */,/*2003*/"NKO LETTER BA"/* 07D3 */,/*2004*/"NKO LETTER PA"/* 07D4 */, /*2005*/"NKO LETTER TA"/* 07D5 */,/*2006*/"NKO LETTER JA"/* 07D6 */,/*2007*/"NKO LETTER CHA"/* 07D7 */, /*2008*/"NKO LETTER DA"/* 07D8 */,/*2009*/"NKO LETTER RA"/* 07D9 */,/*2010*/"NKO LETTER RRA"/* 07DA */, /*2011*/"NKO LETTER SA"/* 07DB */,/*2012*/"NKO LETTER GBA"/* 07DC */,/*2013*/"NKO LETTER FA"/* 07DD */, /*2014*/"NKO LETTER KA"/* 07DE */,/*2015*/"NKO LETTER LA"/* 07DF */,/*2016*/"NKO LETTER NA WOLOSO"/* 07E0 */, /*2017*/"NKO LETTER MA"/* 07E1 */,/*2018*/"NKO LETTER NYA"/* 07E2 */,/*2019*/"NKO LETTER NA"/* 07E3 */, /*2020*/"NKO LETTER HA"/* 07E4 */,/*2021*/"NKO LETTER WA"/* 07E5 */,/*2022*/"NKO LETTER YA"/* 07E6 */, /*2023*/"NKO LETTER NYA WOLOSO"/* 07E7 */,/*2024*/"NKO LETTER JONA JA"/* 07E8 */,/*2025*/"NKO LETTER JONA CHA"/* 07E9 */, /*2026*/"NKO LETTER JONA RA"/* 07EA */,/*2027*/"NKO COMBINING SHORT HIGH TONE"/* 07EB */, /*2028*/"NKO COMBINING SHORT LOW TONE"/* 07EC */,/*2029*/"NKO COMBINING SHORT RISING TONE"/* 07ED */, /*2030*/"NKO COMBINING LONG DESCENDING TONE"/* 07EE */,/*2031*/"NKO COMBINING LONG HIGH TONE"/* 07EF */, /*2032*/"NKO COMBINING LONG LOW TONE"/* 07F0 */,/*2033*/"NKO COMBINING LONG RISING TONE"/* 07F1 */, /*2034*/"NKO COMBINING NASALIZATION MARK"/* 07F2 */,/*2035*/"NKO COMBINING DOUBLE DOT ABOVE"/* 07F3 */, /*2036*/"NKO HIGH TONE APOSTROPHE"/* 07F4 */,/*2037*/"NKO LOW TONE APOSTROPHE"/* 07F5 */, /*2038*/"NKO SYMBOL OO DENNEN"/* 07F6 */,/*2039*/"NKO SYMBOL GBAKURUNEN"/* 07F7 */,/*2040*/"NKO COMMA"/* 07F8 */, /*2041*/"NKO EXCLAMATION MARK"/* 07F9 */,/*2042*/"NKO LAJANYALAN"/* 07FA */,NULL,NULL,NULL,NULL,NULL, /*2048*/"SAMARITAN LETTER ALAF"/* 0800 */,/*2049*/"SAMARITAN LETTER BIT"/* 0801 */, /*2050*/"SAMARITAN LETTER GAMAN"/* 0802 */,/*2051*/"SAMARITAN LETTER DALAT"/* 0803 */, /*2052*/"SAMARITAN LETTER IY"/* 0804 */,/*2053*/"SAMARITAN LETTER BAA"/* 0805 */, /*2054*/"SAMARITAN LETTER ZEN"/* 0806 */,/*2055*/"SAMARITAN LETTER IT"/* 0807 */, /*2056*/"SAMARITAN LETTER TIT"/* 0808 */,/*2057*/"SAMARITAN LETTER YUT"/* 0809 */, /*2058*/"SAMARITAN LETTER KAAF"/* 080A */,/*2059*/"SAMARITAN LETTER LABAT"/* 080B */, /*2060*/"SAMARITAN LETTER MIM"/* 080C */,/*2061*/"SAMARITAN LETTER NUN"/* 080D */, /*2062*/"SAMARITAN LETTER SINGAAT"/* 080E */,/*2063*/"SAMARITAN LETTER IN"/* 080F */, /*2064*/"SAMARITAN LETTER FI"/* 0810 */,/*2065*/"SAMARITAN LETTER TSAADIY"/* 0811 */, /*2066*/"SAMARITAN LETTER QUF"/* 0812 */,/*2067*/"SAMARITAN LETTER RISH"/* 0813 */, /*2068*/"SAMARITAN LETTER SHAN"/* 0814 */,/*2069*/"SAMARITAN LETTER TAAF"/* 0815 */, /*2070*/"SAMARITAN MARK IN"/* 0816 */,/*2071*/"SAMARITAN MARK IN-ALAF"/* 0817 */, /*2072*/"SAMARITAN MARK OCCLUSION"/* 0818 */,/*2073*/"SAMARITAN MARK DAGESH"/* 0819 */, /*2074*/"SAMARITAN MODIFIER LETTER EPENTHETIC YUT"/* 081A */,/*2075*/"SAMARITAN MARK EPENTHETIC YUT"/* 081B */, /*2076*/"SAMARITAN VOWEL SIGN LONG E"/* 081C */,/*2077*/"SAMARITAN VOWEL SIGN E"/* 081D */, /*2078*/"SAMARITAN VOWEL SIGN OVERLONG AA"/* 081E */,/*2079*/"SAMARITAN VOWEL SIGN LONG AA"/* 081F */, /*2080*/"SAMARITAN VOWEL SIGN AA"/* 0820 */,/*2081*/"SAMARITAN VOWEL SIGN OVERLONG A"/* 0821 */, /*2082*/"SAMARITAN VOWEL SIGN LONG A"/* 0822 */,/*2083*/"SAMARITAN VOWEL SIGN A"/* 0823 */, /*2084*/"SAMARITAN MODIFIER LETTER SHORT A"/* 0824 */,/*2085*/"SAMARITAN VOWEL SIGN SHORT A"/* 0825 */, /*2086*/"SAMARITAN VOWEL SIGN LONG U"/* 0826 */,/*2087*/"SAMARITAN VOWEL SIGN U"/* 0827 */, /*2088*/"SAMARITAN MODIFIER LETTER I"/* 0828 */,/*2089*/"SAMARITAN VOWEL SIGN LONG I"/* 0829 */, /*2090*/"SAMARITAN VOWEL SIGN I"/* 082A */,/*2091*/"SAMARITAN VOWEL SIGN O"/* 082B */, /*2092*/"SAMARITAN VOWEL SIGN SUKUN"/* 082C */,/*2093*/"SAMARITAN MARK NEQUDAA"/* 082D */,NULL,NULL, /*2096*/"SAMARITAN PUNCTUATION NEQUDAA"/* 0830 */,/*2097*/"SAMARITAN PUNCTUATION AFSAAQ"/* 0831 */, /*2098*/"SAMARITAN PUNCTUATION ANGED"/* 0832 */,/*2099*/"SAMARITAN PUNCTUATION BAU"/* 0833 */, /*2100*/"SAMARITAN PUNCTUATION ATMAAU"/* 0834 */,/*2101*/"SAMARITAN PUNCTUATION SHIYYAALAA"/* 0835 */, /*2102*/"SAMARITAN ABBREVIATION MARK"/* 0836 */,/*2103*/"SAMARITAN PUNCTUATION MELODIC QITSA"/* 0837 */, /*2104*/"SAMARITAN PUNCTUATION ZIQAA"/* 0838 */,/*2105*/"SAMARITAN PUNCTUATION QITSA"/* 0839 */, /*2106*/"SAMARITAN PUNCTUATION ZAEF"/* 083A */,/*2107*/"SAMARITAN PUNCTUATION TURU"/* 083B */, /*2108*/"SAMARITAN PUNCTUATION ARKAANU"/* 083C */,/*2109*/"SAMARITAN PUNCTUATION SOF MASHFAAT"/* 083D */, /*2110*/"SAMARITAN PUNCTUATION ANNAAU"/* 083E */,NULL,/*2112*/"MANDAIC LETTER HALQA"/* 0840 */, /*2113*/"MANDAIC LETTER AB"/* 0841 */,/*2114*/"MANDAIC LETTER AG"/* 0842 */,/*2115*/"MANDAIC LETTER AD"/* 0843 */, /*2116*/"MANDAIC LETTER AH"/* 0844 */,/*2117*/"MANDAIC LETTER USHENNA"/* 0845 */,/*2118*/"MANDAIC LETTER AZ"/* 0846 */, /*2119*/"MANDAIC LETTER IT"/* 0847 */,/*2120*/"MANDAIC LETTER ATT"/* 0848 */,/*2121*/"MANDAIC LETTER AKSA"/* 0849 */, /*2122*/"MANDAIC LETTER AK"/* 084A */,/*2123*/"MANDAIC LETTER AL"/* 084B */,/*2124*/"MANDAIC LETTER AM"/* 084C */, /*2125*/"MANDAIC LETTER AN"/* 084D */,/*2126*/"MANDAIC LETTER AS"/* 084E */,/*2127*/"MANDAIC LETTER IN"/* 084F */, /*2128*/"MANDAIC LETTER AP"/* 0850 */,/*2129*/"MANDAIC LETTER ASZ"/* 0851 */,/*2130*/"MANDAIC LETTER AQ"/* 0852 */, /*2131*/"MANDAIC LETTER AR"/* 0853 */,/*2132*/"MANDAIC LETTER ASH"/* 0854 */,/*2133*/"MANDAIC LETTER AT"/* 0855 */, /*2134*/"MANDAIC LETTER DUSHENNA"/* 0856 */,/*2135*/"MANDAIC LETTER KAD"/* 0857 */, /*2136*/"MANDAIC LETTER AIN"/* 0858 */,/*2137*/"MANDAIC AFFRICATION MARK"/* 0859 */, /*2138*/"MANDAIC VOCALIZATION MARK"/* 085A */,/*2139*/"MANDAIC GEMINATION MARK"/* 085B */,NULL,NULL, /*2142*/"MANDAIC PUNCTUATION"/* 085E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*2208*/"ARABIC LETTER BEH WITH SMALL V BELOW"/* 08A0 */,/*2209*/"ARABIC LETTER BEH WITH HAMZA ABOVE"/* 08A1 */, /*2210*/"ARABIC LETTER JEEM WITH TWO DOTS ABOVE"/* 08A2 */,/*2211*/"ARABIC LETTER TAH WITH TWO DOTS ABOVE"/* 08A3 */, /*2212*/"ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE"/* 08A4 */, /*2213*/"ARABIC LETTER QAF WITH DOT BELOW"/* 08A5 */,/*2214*/"ARABIC LETTER LAM WITH DOUBLE BAR"/* 08A6 */, /*2215*/"ARABIC LETTER MEEM WITH THREE DOTS ABOVE"/* 08A7 */, /*2216*/"ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE"/* 08A8 */, /*2217*/"ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE"/* 08A9 */,/*2218*/"ARABIC LETTER REH WITH LOOP"/* 08AA */, /*2219*/"ARABIC LETTER WAW WITH DOT WITHIN"/* 08AB */,/*2220*/"ARABIC LETTER ROHINGYA YEH"/* 08AC */, /*2221*/"ARABIC LETTER LOW ALEF"/* 08AD */,/*2222*/"ARABIC LETTER DAL WITH THREE DOTS BELOW"/* 08AE */, /*2223*/"ARABIC LETTER SAD WITH THREE DOTS BELOW"/* 08AF */,/*2224*/"ARABIC LETTER GAF WITH INVERTED STROKE"/* 08B0 */, /*2225*/"ARABIC LETTER STRAIGHT WAW"/* 08B1 */,/*2226*/"ARABIC LETTER ZAIN WITH INVERTED V ABOVE"/* 08B2 */, /*2227*/"ARABIC LETTER AIN WITH THREE DOTS BELOW"/* 08B3 */,/*2228*/"ARABIC LETTER KAF WITH DOT BELOW"/* 08B4 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*2275*/"ARABIC TURNED DAMMA BELOW"/* 08E3 */,/*2276*/"ARABIC CURLY FATHA"/* 08E4 */, /*2277*/"ARABIC CURLY DAMMA"/* 08E5 */,/*2278*/"ARABIC CURLY KASRA"/* 08E6 */,/*2279*/"ARABIC CURLY FATHATAN"/* 08E7 */, /*2280*/"ARABIC CURLY DAMMATAN"/* 08E8 */,/*2281*/"ARABIC CURLY KASRATAN"/* 08E9 */, /*2282*/"ARABIC TONE ONE DOT ABOVE"/* 08EA */,/*2283*/"ARABIC TONE TWO DOTS ABOVE"/* 08EB */, /*2284*/"ARABIC TONE LOOP ABOVE"/* 08EC */,/*2285*/"ARABIC TONE ONE DOT BELOW"/* 08ED */, /*2286*/"ARABIC TONE TWO DOTS BELOW"/* 08EE */,/*2287*/"ARABIC TONE LOOP BELOW"/* 08EF */, /*2288*/"ARABIC OPEN FATHATAN"/* 08F0 */,/*2289*/"ARABIC OPEN DAMMATAN"/* 08F1 */, /*2290*/"ARABIC OPEN KASRATAN"/* 08F2 */,/*2291*/"ARABIC SMALL HIGH WAW"/* 08F3 */, /*2292*/"ARABIC FATHA WITH RING"/* 08F4 */,/*2293*/"ARABIC FATHA WITH DOT ABOVE"/* 08F5 */, /*2294*/"ARABIC KASRA WITH DOT BELOW"/* 08F6 */,/*2295*/"ARABIC LEFT ARROWHEAD ABOVE"/* 08F7 */, /*2296*/"ARABIC RIGHT ARROWHEAD ABOVE"/* 08F8 */,/*2297*/"ARABIC LEFT ARROWHEAD BELOW"/* 08F9 */, /*2298*/"ARABIC RIGHT ARROWHEAD BELOW"/* 08FA */,/*2299*/"ARABIC DOUBLE RIGHT ARROWHEAD ABOVE"/* 08FB */, /*2300*/"ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT"/* 08FC */, /*2301*/"ARABIC RIGHT ARROWHEAD ABOVE WITH DOT"/* 08FD */,/*2302*/"ARABIC DAMMA WITH DOT"/* 08FE */, /*2303*/"ARABIC MARK SIDEWAYS NOON GHUNNA"/* 08FF */,/*2304*/"DEVANAGARI SIGN INVERTED CANDRABINDU"/* 0900 */, /*2305*/"DEVANAGARI SIGN CANDRABINDU"/* 0901 */,/*2306*/"DEVANAGARI SIGN ANUSVARA"/* 0902 */, /*2307*/"DEVANAGARI SIGN VISARGA"/* 0903 */,/*2308*/"DEVANAGARI LETTER SHORT A"/* 0904 */, /*2309*/"DEVANAGARI LETTER A"/* 0905 */,/*2310*/"DEVANAGARI LETTER AA"/* 0906 */,/*2311*/"DEVANAGARI LETTER I"/* 0907 */, /*2312*/"DEVANAGARI LETTER II"/* 0908 */,/*2313*/"DEVANAGARI LETTER U"/* 0909 */, /*2314*/"DEVANAGARI LETTER UU"/* 090A */,/*2315*/"DEVANAGARI LETTER VOCALIC R"/* 090B */, /*2316*/"DEVANAGARI LETTER VOCALIC L"/* 090C */,/*2317*/"DEVANAGARI LETTER CANDRA E"/* 090D */, /*2318*/"DEVANAGARI LETTER SHORT E"/* 090E */,/*2319*/"DEVANAGARI LETTER E"/* 090F */, /*2320*/"DEVANAGARI LETTER AI"/* 0910 */,/*2321*/"DEVANAGARI LETTER CANDRA O"/* 0911 */, /*2322*/"DEVANAGARI LETTER SHORT O"/* 0912 */,/*2323*/"DEVANAGARI LETTER O"/* 0913 */, /*2324*/"DEVANAGARI LETTER AU"/* 0914 */,/*2325*/"DEVANAGARI LETTER KA"/* 0915 */, /*2326*/"DEVANAGARI LETTER KHA"/* 0916 */,/*2327*/"DEVANAGARI LETTER GA"/* 0917 */, /*2328*/"DEVANAGARI LETTER GHA"/* 0918 */,/*2329*/"DEVANAGARI LETTER NGA"/* 0919 */, /*2330*/"DEVANAGARI LETTER CA"/* 091A */,/*2331*/"DEVANAGARI LETTER CHA"/* 091B */, /*2332*/"DEVANAGARI LETTER JA"/* 091C */,/*2333*/"DEVANAGARI LETTER JHA"/* 091D */, /*2334*/"DEVANAGARI LETTER NYA"/* 091E */,/*2335*/"DEVANAGARI LETTER TTA"/* 091F */, /*2336*/"DEVANAGARI LETTER TTHA"/* 0920 */,/*2337*/"DEVANAGARI LETTER DDA"/* 0921 */, /*2338*/"DEVANAGARI LETTER DDHA"/* 0922 */,/*2339*/"DEVANAGARI LETTER NNA"/* 0923 */, /*2340*/"DEVANAGARI LETTER TA"/* 0924 */,/*2341*/"DEVANAGARI LETTER THA"/* 0925 */, /*2342*/"DEVANAGARI LETTER DA"/* 0926 */,/*2343*/"DEVANAGARI LETTER DHA"/* 0927 */, /*2344*/"DEVANAGARI LETTER NA"/* 0928 */,/*2345*/"DEVANAGARI LETTER NNNA"/* 0929 */, /*2346*/"DEVANAGARI LETTER PA"/* 092A */,/*2347*/"DEVANAGARI LETTER PHA"/* 092B */, /*2348*/"DEVANAGARI LETTER BA"/* 092C */,/*2349*/"DEVANAGARI LETTER BHA"/* 092D */, /*2350*/"DEVANAGARI LETTER MA"/* 092E */,/*2351*/"DEVANAGARI LETTER YA"/* 092F */, /*2352*/"DEVANAGARI LETTER RA"/* 0930 */,/*2353*/"DEVANAGARI LETTER RRA"/* 0931 */, /*2354*/"DEVANAGARI LETTER LA"/* 0932 */,/*2355*/"DEVANAGARI LETTER LLA"/* 0933 */, /*2356*/"DEVANAGARI LETTER LLLA"/* 0934 */,/*2357*/"DEVANAGARI LETTER VA"/* 0935 */, /*2358*/"DEVANAGARI LETTER SHA"/* 0936 */,/*2359*/"DEVANAGARI LETTER SSA"/* 0937 */, /*2360*/"DEVANAGARI LETTER SA"/* 0938 */,/*2361*/"DEVANAGARI LETTER HA"/* 0939 */, /*2362*/"DEVANAGARI VOWEL SIGN OE"/* 093A */,/*2363*/"DEVANAGARI VOWEL SIGN OOE"/* 093B */, /*2364*/"DEVANAGARI SIGN NUKTA"/* 093C */,/*2365*/"DEVANAGARI SIGN AVAGRAHA"/* 093D */, /*2366*/"DEVANAGARI VOWEL SIGN AA"/* 093E */,/*2367*/"DEVANAGARI VOWEL SIGN I"/* 093F */, /*2368*/"DEVANAGARI VOWEL SIGN II"/* 0940 */,/*2369*/"DEVANAGARI VOWEL SIGN U"/* 0941 */, /*2370*/"DEVANAGARI VOWEL SIGN UU"/* 0942 */,/*2371*/"DEVANAGARI VOWEL SIGN VOCALIC R"/* 0943 */, /*2372*/"DEVANAGARI VOWEL SIGN VOCALIC RR"/* 0944 */,/*2373*/"DEVANAGARI VOWEL SIGN CANDRA E"/* 0945 */, /*2374*/"DEVANAGARI VOWEL SIGN SHORT E"/* 0946 */,/*2375*/"DEVANAGARI VOWEL SIGN E"/* 0947 */, /*2376*/"DEVANAGARI VOWEL SIGN AI"/* 0948 */,/*2377*/"DEVANAGARI VOWEL SIGN CANDRA O"/* 0949 */, /*2378*/"DEVANAGARI VOWEL SIGN SHORT O"/* 094A */,/*2379*/"DEVANAGARI VOWEL SIGN O"/* 094B */, /*2380*/"DEVANAGARI VOWEL SIGN AU"/* 094C */,/*2381*/"DEVANAGARI SIGN VIRAMA"/* 094D */, /*2382*/"DEVANAGARI VOWEL SIGN PRISHTHAMATRA E"/* 094E */,/*2383*/"DEVANAGARI VOWEL SIGN AW"/* 094F */, /*2384*/"DEVANAGARI OM"/* 0950 */,/*2385*/"DEVANAGARI STRESS SIGN UDATTA"/* 0951 */, /*2386*/"DEVANAGARI STRESS SIGN ANUDATTA"/* 0952 */,/*2387*/"DEVANAGARI GRAVE ACCENT"/* 0953 */, /*2388*/"DEVANAGARI ACUTE ACCENT"/* 0954 */,/*2389*/"DEVANAGARI VOWEL SIGN CANDRA LONG E"/* 0955 */, /*2390*/"DEVANAGARI VOWEL SIGN UE"/* 0956 */,/*2391*/"DEVANAGARI VOWEL SIGN UUE"/* 0957 */, /*2392*/"DEVANAGARI LETTER QA"/* 0958 */,/*2393*/"DEVANAGARI LETTER KHHA"/* 0959 */, /*2394*/"DEVANAGARI LETTER GHHA"/* 095A */,/*2395*/"DEVANAGARI LETTER ZA"/* 095B */, /*2396*/"DEVANAGARI LETTER DDDHA"/* 095C */,/*2397*/"DEVANAGARI LETTER RHA"/* 095D */, /*2398*/"DEVANAGARI LETTER FA"/* 095E */,/*2399*/"DEVANAGARI LETTER YYA"/* 095F */, /*2400*/"DEVANAGARI LETTER VOCALIC RR"/* 0960 */,/*2401*/"DEVANAGARI LETTER VOCALIC LL"/* 0961 */, /*2402*/"DEVANAGARI VOWEL SIGN VOCALIC L"/* 0962 */,/*2403*/"DEVANAGARI VOWEL SIGN VOCALIC LL"/* 0963 */, /*2404*/"DEVANAGARI DANDA"/* 0964 */,/*2405*/"DEVANAGARI DOUBLE DANDA"/* 0965 */, /*2406*/"DEVANAGARI DIGIT ZERO"/* 0966 */,/*2407*/"DEVANAGARI DIGIT ONE"/* 0967 */, /*2408*/"DEVANAGARI DIGIT TWO"/* 0968 */,/*2409*/"DEVANAGARI DIGIT THREE"/* 0969 */, /*2410*/"DEVANAGARI DIGIT FOUR"/* 096A */,/*2411*/"DEVANAGARI DIGIT FIVE"/* 096B */, /*2412*/"DEVANAGARI DIGIT SIX"/* 096C */,/*2413*/"DEVANAGARI DIGIT SEVEN"/* 096D */, /*2414*/"DEVANAGARI DIGIT EIGHT"/* 096E */,/*2415*/"DEVANAGARI DIGIT NINE"/* 096F */, /*2416*/"DEVANAGARI ABBREVIATION SIGN"/* 0970 */,/*2417*/"DEVANAGARI SIGN HIGH SPACING DOT"/* 0971 */, /*2418*/"DEVANAGARI LETTER CANDRA A"/* 0972 */,/*2419*/"DEVANAGARI LETTER OE"/* 0973 */, /*2420*/"DEVANAGARI LETTER OOE"/* 0974 */,/*2421*/"DEVANAGARI LETTER AW"/* 0975 */, /*2422*/"DEVANAGARI LETTER UE"/* 0976 */,/*2423*/"DEVANAGARI LETTER UUE"/* 0977 */, /*2424*/"DEVANAGARI LETTER MARWARI DDA"/* 0978 */,/*2425*/"DEVANAGARI LETTER ZHA"/* 0979 */, /*2426*/"DEVANAGARI LETTER HEAVY YA"/* 097A */,/*2427*/"DEVANAGARI LETTER GGA"/* 097B */, /*2428*/"DEVANAGARI LETTER JJA"/* 097C */,/*2429*/"DEVANAGARI LETTER GLOTTAL STOP"/* 097D */, /*2430*/"DEVANAGARI LETTER DDDA"/* 097E */,/*2431*/"DEVANAGARI LETTER BBA"/* 097F */,/*2432*/"BENGALI ANJI"/* 0980 */, /*2433*/"BENGALI SIGN CANDRABINDU"/* 0981 */,/*2434*/"BENGALI SIGN ANUSVARA"/* 0982 */, /*2435*/"BENGALI SIGN VISARGA"/* 0983 */,NULL,/*2437*/"BENGALI LETTER A"/* 0985 */,/*2438*/"BENGALI LETTER AA"/* 0986 */, /*2439*/"BENGALI LETTER I"/* 0987 */,/*2440*/"BENGALI LETTER II"/* 0988 */,/*2441*/"BENGALI LETTER U"/* 0989 */, /*2442*/"BENGALI LETTER UU"/* 098A */,/*2443*/"BENGALI LETTER VOCALIC R"/* 098B */, /*2444*/"BENGALI LETTER VOCALIC L"/* 098C */,NULL,NULL,/*2447*/"BENGALI LETTER E"/* 098F */, /*2448*/"BENGALI LETTER AI"/* 0990 */,NULL,NULL,/*2451*/"BENGALI LETTER O"/* 0993 */, /*2452*/"BENGALI LETTER AU"/* 0994 */,/*2453*/"BENGALI LETTER KA"/* 0995 */,/*2454*/"BENGALI LETTER KHA"/* 0996 */, /*2455*/"BENGALI LETTER GA"/* 0997 */,/*2456*/"BENGALI LETTER GHA"/* 0998 */,/*2457*/"BENGALI LETTER NGA"/* 0999 */, /*2458*/"BENGALI LETTER CA"/* 099A */,/*2459*/"BENGALI LETTER CHA"/* 099B */,/*2460*/"BENGALI LETTER JA"/* 099C */, /*2461*/"BENGALI LETTER JHA"/* 099D */,/*2462*/"BENGALI LETTER NYA"/* 099E */,/*2463*/"BENGALI LETTER TTA"/* 099F */, /*2464*/"BENGALI LETTER TTHA"/* 09A0 */,/*2465*/"BENGALI LETTER DDA"/* 09A1 */,/*2466*/"BENGALI LETTER DDHA"/* 09A2 */, /*2467*/"BENGALI LETTER NNA"/* 09A3 */,/*2468*/"BENGALI LETTER TA"/* 09A4 */,/*2469*/"BENGALI LETTER THA"/* 09A5 */, /*2470*/"BENGALI LETTER DA"/* 09A6 */,/*2471*/"BENGALI LETTER DHA"/* 09A7 */,/*2472*/"BENGALI LETTER NA"/* 09A8 */,NULL, /*2474*/"BENGALI LETTER PA"/* 09AA */,/*2475*/"BENGALI LETTER PHA"/* 09AB */,/*2476*/"BENGALI LETTER BA"/* 09AC */, /*2477*/"BENGALI LETTER BHA"/* 09AD */,/*2478*/"BENGALI LETTER MA"/* 09AE */,/*2479*/"BENGALI LETTER YA"/* 09AF */, /*2480*/"BENGALI LETTER RA"/* 09B0 */,NULL,/*2482*/"BENGALI LETTER LA"/* 09B2 */,NULL,NULL,NULL, /*2486*/"BENGALI LETTER SHA"/* 09B6 */,/*2487*/"BENGALI LETTER SSA"/* 09B7 */,/*2488*/"BENGALI LETTER SA"/* 09B8 */, /*2489*/"BENGALI LETTER HA"/* 09B9 */,NULL,NULL,/*2492*/"BENGALI SIGN NUKTA"/* 09BC */, /*2493*/"BENGALI SIGN AVAGRAHA"/* 09BD */,/*2494*/"BENGALI VOWEL SIGN AA"/* 09BE */, /*2495*/"BENGALI VOWEL SIGN I"/* 09BF */,/*2496*/"BENGALI VOWEL SIGN II"/* 09C0 */, /*2497*/"BENGALI VOWEL SIGN U"/* 09C1 */,/*2498*/"BENGALI VOWEL SIGN UU"/* 09C2 */, /*2499*/"BENGALI VOWEL SIGN VOCALIC R"/* 09C3 */,/*2500*/"BENGALI VOWEL SIGN VOCALIC RR"/* 09C4 */,NULL,NULL, /*2503*/"BENGALI VOWEL SIGN E"/* 09C7 */,/*2504*/"BENGALI VOWEL SIGN AI"/* 09C8 */,NULL,NULL, /*2507*/"BENGALI VOWEL SIGN O"/* 09CB */,/*2508*/"BENGALI VOWEL SIGN AU"/* 09CC */, /*2509*/"BENGALI SIGN VIRAMA"/* 09CD */,/*2510*/"BENGALI LETTER KHANDA TA"/* 09CE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*2519*/"BENGALI AU LENGTH MARK"/* 09D7 */,NULL,NULL,NULL,NULL,/*2524*/"BENGALI LETTER RRA"/* 09DC */, /*2525*/"BENGALI LETTER RHA"/* 09DD */,NULL,/*2527*/"BENGALI LETTER YYA"/* 09DF */, /*2528*/"BENGALI LETTER VOCALIC RR"/* 09E0 */,/*2529*/"BENGALI LETTER VOCALIC LL"/* 09E1 */, /*2530*/"BENGALI VOWEL SIGN VOCALIC L"/* 09E2 */,/*2531*/"BENGALI VOWEL SIGN VOCALIC LL"/* 09E3 */,NULL,NULL, /*2534*/"BENGALI DIGIT ZERO"/* 09E6 */,/*2535*/"BENGALI DIGIT ONE"/* 09E7 */,/*2536*/"BENGALI DIGIT TWO"/* 09E8 */, /*2537*/"BENGALI DIGIT THREE"/* 09E9 */,/*2538*/"BENGALI DIGIT FOUR"/* 09EA */,/*2539*/"BENGALI DIGIT FIVE"/* 09EB */, /*2540*/"BENGALI DIGIT SIX"/* 09EC */,/*2541*/"BENGALI DIGIT SEVEN"/* 09ED */,/*2542*/"BENGALI DIGIT EIGHT"/* 09EE */, /*2543*/"BENGALI DIGIT NINE"/* 09EF */,/*2544*/"BENGALI LETTER RA WITH MIDDLE DIAGONAL"/* 09F0 */, /*2545*/"BENGALI LETTER RA WITH LOWER DIAGONAL"/* 09F1 */,/*2546*/"BENGALI RUPEE MARK"/* 09F2 */, /*2547*/"BENGALI RUPEE SIGN"/* 09F3 */,/*2548*/"BENGALI CURRENCY NUMERATOR ONE"/* 09F4 */, /*2549*/"BENGALI CURRENCY NUMERATOR TWO"/* 09F5 */,/*2550*/"BENGALI CURRENCY NUMERATOR THREE"/* 09F6 */, /*2551*/"BENGALI CURRENCY NUMERATOR FOUR"/* 09F7 */, /*2552*/"BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR"/* 09F8 */, /*2553*/"BENGALI CURRENCY DENOMINATOR SIXTEEN"/* 09F9 */,/*2554*/"BENGALI ISSHAR"/* 09FA */, /*2555*/"BENGALI GANDA MARK"/* 09FB */,NULL,NULL,NULL,NULL,NULL,/*2561*/"GURMUKHI SIGN ADAK BINDI"/* 0A01 */, /*2562*/"GURMUKHI SIGN BINDI"/* 0A02 */,/*2563*/"GURMUKHI SIGN VISARGA"/* 0A03 */,NULL, /*2565*/"GURMUKHI LETTER A"/* 0A05 */,/*2566*/"GURMUKHI LETTER AA"/* 0A06 */,/*2567*/"GURMUKHI LETTER I"/* 0A07 */, /*2568*/"GURMUKHI LETTER II"/* 0A08 */,/*2569*/"GURMUKHI LETTER U"/* 0A09 */,/*2570*/"GURMUKHI LETTER UU"/* 0A0A */,NULL, NULL,NULL,NULL,/*2575*/"GURMUKHI LETTER EE"/* 0A0F */,/*2576*/"GURMUKHI LETTER AI"/* 0A10 */,NULL,NULL, /*2579*/"GURMUKHI LETTER OO"/* 0A13 */,/*2580*/"GURMUKHI LETTER AU"/* 0A14 */,/*2581*/"GURMUKHI LETTER KA"/* 0A15 */, /*2582*/"GURMUKHI LETTER KHA"/* 0A16 */,/*2583*/"GURMUKHI LETTER GA"/* 0A17 */,/*2584*/"GURMUKHI LETTER GHA"/* 0A18 */, /*2585*/"GURMUKHI LETTER NGA"/* 0A19 */,/*2586*/"GURMUKHI LETTER CA"/* 0A1A */,/*2587*/"GURMUKHI LETTER CHA"/* 0A1B */, /*2588*/"GURMUKHI LETTER JA"/* 0A1C */,/*2589*/"GURMUKHI LETTER JHA"/* 0A1D */,/*2590*/"GURMUKHI LETTER NYA"/* 0A1E */, /*2591*/"GURMUKHI LETTER TTA"/* 0A1F */,/*2592*/"GURMUKHI LETTER TTHA"/* 0A20 */,/*2593*/"GURMUKHI LETTER DDA"/* 0A21 */, /*2594*/"GURMUKHI LETTER DDHA"/* 0A22 */,/*2595*/"GURMUKHI LETTER NNA"/* 0A23 */,/*2596*/"GURMUKHI LETTER TA"/* 0A24 */, /*2597*/"GURMUKHI LETTER THA"/* 0A25 */,/*2598*/"GURMUKHI LETTER DA"/* 0A26 */,/*2599*/"GURMUKHI LETTER DHA"/* 0A27 */, /*2600*/"GURMUKHI LETTER NA"/* 0A28 */,NULL,/*2602*/"GURMUKHI LETTER PA"/* 0A2A */, /*2603*/"GURMUKHI LETTER PHA"/* 0A2B */,/*2604*/"GURMUKHI LETTER BA"/* 0A2C */,/*2605*/"GURMUKHI LETTER BHA"/* 0A2D */, /*2606*/"GURMUKHI LETTER MA"/* 0A2E */,/*2607*/"GURMUKHI LETTER YA"/* 0A2F */,/*2608*/"GURMUKHI LETTER RA"/* 0A30 */, NULL,/*2610*/"GURMUKHI LETTER LA"/* 0A32 */,/*2611*/"GURMUKHI LETTER LLA"/* 0A33 */,NULL, /*2613*/"GURMUKHI LETTER VA"/* 0A35 */,/*2614*/"GURMUKHI LETTER SHA"/* 0A36 */,NULL, /*2616*/"GURMUKHI LETTER SA"/* 0A38 */,/*2617*/"GURMUKHI LETTER HA"/* 0A39 */,NULL,NULL, /*2620*/"GURMUKHI SIGN NUKTA"/* 0A3C */,NULL,/*2622*/"GURMUKHI VOWEL SIGN AA"/* 0A3E */, /*2623*/"GURMUKHI VOWEL SIGN I"/* 0A3F */,/*2624*/"GURMUKHI VOWEL SIGN II"/* 0A40 */, /*2625*/"GURMUKHI VOWEL SIGN U"/* 0A41 */,/*2626*/"GURMUKHI VOWEL SIGN UU"/* 0A42 */,NULL,NULL,NULL,NULL, /*2631*/"GURMUKHI VOWEL SIGN EE"/* 0A47 */,/*2632*/"GURMUKHI VOWEL SIGN AI"/* 0A48 */,NULL,NULL, /*2635*/"GURMUKHI VOWEL SIGN OO"/* 0A4B */,/*2636*/"GURMUKHI VOWEL SIGN AU"/* 0A4C */, /*2637*/"GURMUKHI SIGN VIRAMA"/* 0A4D */,NULL,NULL,NULL,/*2641*/"GURMUKHI SIGN UDAAT"/* 0A51 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*2649*/"GURMUKHI LETTER KHHA"/* 0A59 */,/*2650*/"GURMUKHI LETTER GHHA"/* 0A5A */, /*2651*/"GURMUKHI LETTER ZA"/* 0A5B */,/*2652*/"GURMUKHI LETTER RRA"/* 0A5C */,NULL, /*2654*/"GURMUKHI LETTER FA"/* 0A5E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2662*/"GURMUKHI DIGIT ZERO"/* 0A66 */, /*2663*/"GURMUKHI DIGIT ONE"/* 0A67 */,/*2664*/"GURMUKHI DIGIT TWO"/* 0A68 */,/*2665*/"GURMUKHI DIGIT THREE"/* 0A69 */, /*2666*/"GURMUKHI DIGIT FOUR"/* 0A6A */,/*2667*/"GURMUKHI DIGIT FIVE"/* 0A6B */,/*2668*/"GURMUKHI DIGIT SIX"/* 0A6C */, /*2669*/"GURMUKHI DIGIT SEVEN"/* 0A6D */,/*2670*/"GURMUKHI DIGIT EIGHT"/* 0A6E */, /*2671*/"GURMUKHI DIGIT NINE"/* 0A6F */,/*2672*/"GURMUKHI TIPPI"/* 0A70 */,/*2673*/"GURMUKHI ADDAK"/* 0A71 */, /*2674*/"GURMUKHI IRI"/* 0A72 */,/*2675*/"GURMUKHI URA"/* 0A73 */,/*2676*/"GURMUKHI EK ONKAR"/* 0A74 */, /*2677*/"GURMUKHI SIGN YAKASH"/* 0A75 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*2689*/"GUJARATI SIGN CANDRABINDU"/* 0A81 */,/*2690*/"GUJARATI SIGN ANUSVARA"/* 0A82 */, /*2691*/"GUJARATI SIGN VISARGA"/* 0A83 */,NULL,/*2693*/"GUJARATI LETTER A"/* 0A85 */, /*2694*/"GUJARATI LETTER AA"/* 0A86 */,/*2695*/"GUJARATI LETTER I"/* 0A87 */,/*2696*/"GUJARATI LETTER II"/* 0A88 */, /*2697*/"GUJARATI LETTER U"/* 0A89 */,/*2698*/"GUJARATI LETTER UU"/* 0A8A */, /*2699*/"GUJARATI LETTER VOCALIC R"/* 0A8B */,/*2700*/"GUJARATI LETTER VOCALIC L"/* 0A8C */, /*2701*/"GUJARATI VOWEL CANDRA E"/* 0A8D */,NULL,/*2703*/"GUJARATI LETTER E"/* 0A8F */, /*2704*/"GUJARATI LETTER AI"/* 0A90 */,/*2705*/"GUJARATI VOWEL CANDRA O"/* 0A91 */,NULL, /*2707*/"GUJARATI LETTER O"/* 0A93 */,/*2708*/"GUJARATI LETTER AU"/* 0A94 */,/*2709*/"GUJARATI LETTER KA"/* 0A95 */, /*2710*/"GUJARATI LETTER KHA"/* 0A96 */,/*2711*/"GUJARATI LETTER GA"/* 0A97 */,/*2712*/"GUJARATI LETTER GHA"/* 0A98 */, /*2713*/"GUJARATI LETTER NGA"/* 0A99 */,/*2714*/"GUJARATI LETTER CA"/* 0A9A */,/*2715*/"GUJARATI LETTER CHA"/* 0A9B */, /*2716*/"GUJARATI LETTER JA"/* 0A9C */,/*2717*/"GUJARATI LETTER JHA"/* 0A9D */,/*2718*/"GUJARATI LETTER NYA"/* 0A9E */, /*2719*/"GUJARATI LETTER TTA"/* 0A9F */,/*2720*/"GUJARATI LETTER TTHA"/* 0AA0 */,/*2721*/"GUJARATI LETTER DDA"/* 0AA1 */, /*2722*/"GUJARATI LETTER DDHA"/* 0AA2 */,/*2723*/"GUJARATI LETTER NNA"/* 0AA3 */,/*2724*/"GUJARATI LETTER TA"/* 0AA4 */, /*2725*/"GUJARATI LETTER THA"/* 0AA5 */,/*2726*/"GUJARATI LETTER DA"/* 0AA6 */,/*2727*/"GUJARATI LETTER DHA"/* 0AA7 */, /*2728*/"GUJARATI LETTER NA"/* 0AA8 */,NULL,/*2730*/"GUJARATI LETTER PA"/* 0AAA */, /*2731*/"GUJARATI LETTER PHA"/* 0AAB */,/*2732*/"GUJARATI LETTER BA"/* 0AAC */,/*2733*/"GUJARATI LETTER BHA"/* 0AAD */, /*2734*/"GUJARATI LETTER MA"/* 0AAE */,/*2735*/"GUJARATI LETTER YA"/* 0AAF */,/*2736*/"GUJARATI LETTER RA"/* 0AB0 */, NULL,/*2738*/"GUJARATI LETTER LA"/* 0AB2 */,/*2739*/"GUJARATI LETTER LLA"/* 0AB3 */,NULL, /*2741*/"GUJARATI LETTER VA"/* 0AB5 */,/*2742*/"GUJARATI LETTER SHA"/* 0AB6 */,/*2743*/"GUJARATI LETTER SSA"/* 0AB7 */, /*2744*/"GUJARATI LETTER SA"/* 0AB8 */,/*2745*/"GUJARATI LETTER HA"/* 0AB9 */,NULL,NULL, /*2748*/"GUJARATI SIGN NUKTA"/* 0ABC */,/*2749*/"GUJARATI SIGN AVAGRAHA"/* 0ABD */, /*2750*/"GUJARATI VOWEL SIGN AA"/* 0ABE */,/*2751*/"GUJARATI VOWEL SIGN I"/* 0ABF */, /*2752*/"GUJARATI VOWEL SIGN II"/* 0AC0 */,/*2753*/"GUJARATI VOWEL SIGN U"/* 0AC1 */, /*2754*/"GUJARATI VOWEL SIGN UU"/* 0AC2 */,/*2755*/"GUJARATI VOWEL SIGN VOCALIC R"/* 0AC3 */, /*2756*/"GUJARATI VOWEL SIGN VOCALIC RR"/* 0AC4 */,/*2757*/"GUJARATI VOWEL SIGN CANDRA E"/* 0AC5 */,NULL, /*2759*/"GUJARATI VOWEL SIGN E"/* 0AC7 */,/*2760*/"GUJARATI VOWEL SIGN AI"/* 0AC8 */, /*2761*/"GUJARATI VOWEL SIGN CANDRA O"/* 0AC9 */,NULL,/*2763*/"GUJARATI VOWEL SIGN O"/* 0ACB */, /*2764*/"GUJARATI VOWEL SIGN AU"/* 0ACC */,/*2765*/"GUJARATI SIGN VIRAMA"/* 0ACD */,NULL,NULL, /*2768*/"GUJARATI OM"/* 0AD0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*2784*/"GUJARATI LETTER VOCALIC RR"/* 0AE0 */,/*2785*/"GUJARATI LETTER VOCALIC LL"/* 0AE1 */, /*2786*/"GUJARATI VOWEL SIGN VOCALIC L"/* 0AE2 */,/*2787*/"GUJARATI VOWEL SIGN VOCALIC LL"/* 0AE3 */,NULL,NULL, /*2790*/"GUJARATI DIGIT ZERO"/* 0AE6 */,/*2791*/"GUJARATI DIGIT ONE"/* 0AE7 */,/*2792*/"GUJARATI DIGIT TWO"/* 0AE8 */, /*2793*/"GUJARATI DIGIT THREE"/* 0AE9 */,/*2794*/"GUJARATI DIGIT FOUR"/* 0AEA */,/*2795*/"GUJARATI DIGIT FIVE"/* 0AEB */, /*2796*/"GUJARATI DIGIT SIX"/* 0AEC */,/*2797*/"GUJARATI DIGIT SEVEN"/* 0AED */,/*2798*/"GUJARATI DIGIT EIGHT"/* 0AEE */, /*2799*/"GUJARATI DIGIT NINE"/* 0AEF */,/*2800*/"GUJARATI ABBREVIATION SIGN"/* 0AF0 */, /*2801*/"GUJARATI RUPEE SIGN"/* 0AF1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2809*/"GUJARATI LETTER ZHA"/* 0AF9 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*2817*/"ORIYA SIGN CANDRABINDU"/* 0B01 */,/*2818*/"ORIYA SIGN ANUSVARA"/* 0B02 */, /*2819*/"ORIYA SIGN VISARGA"/* 0B03 */,NULL,/*2821*/"ORIYA LETTER A"/* 0B05 */,/*2822*/"ORIYA LETTER AA"/* 0B06 */, /*2823*/"ORIYA LETTER I"/* 0B07 */,/*2824*/"ORIYA LETTER II"/* 0B08 */,/*2825*/"ORIYA LETTER U"/* 0B09 */, /*2826*/"ORIYA LETTER UU"/* 0B0A */,/*2827*/"ORIYA LETTER VOCALIC R"/* 0B0B */, /*2828*/"ORIYA LETTER VOCALIC L"/* 0B0C */,NULL,NULL,/*2831*/"ORIYA LETTER E"/* 0B0F */, /*2832*/"ORIYA LETTER AI"/* 0B10 */,NULL,NULL,/*2835*/"ORIYA LETTER O"/* 0B13 */,/*2836*/"ORIYA LETTER AU"/* 0B14 */, /*2837*/"ORIYA LETTER KA"/* 0B15 */,/*2838*/"ORIYA LETTER KHA"/* 0B16 */,/*2839*/"ORIYA LETTER GA"/* 0B17 */, /*2840*/"ORIYA LETTER GHA"/* 0B18 */,/*2841*/"ORIYA LETTER NGA"/* 0B19 */,/*2842*/"ORIYA LETTER CA"/* 0B1A */, /*2843*/"ORIYA LETTER CHA"/* 0B1B */,/*2844*/"ORIYA LETTER JA"/* 0B1C */,/*2845*/"ORIYA LETTER JHA"/* 0B1D */, /*2846*/"ORIYA LETTER NYA"/* 0B1E */,/*2847*/"ORIYA LETTER TTA"/* 0B1F */,/*2848*/"ORIYA LETTER TTHA"/* 0B20 */, /*2849*/"ORIYA LETTER DDA"/* 0B21 */,/*2850*/"ORIYA LETTER DDHA"/* 0B22 */,/*2851*/"ORIYA LETTER NNA"/* 0B23 */, /*2852*/"ORIYA LETTER TA"/* 0B24 */,/*2853*/"ORIYA LETTER THA"/* 0B25 */,/*2854*/"ORIYA LETTER DA"/* 0B26 */, /*2855*/"ORIYA LETTER DHA"/* 0B27 */,/*2856*/"ORIYA LETTER NA"/* 0B28 */,NULL,/*2858*/"ORIYA LETTER PA"/* 0B2A */, /*2859*/"ORIYA LETTER PHA"/* 0B2B */,/*2860*/"ORIYA LETTER BA"/* 0B2C */,/*2861*/"ORIYA LETTER BHA"/* 0B2D */, /*2862*/"ORIYA LETTER MA"/* 0B2E */,/*2863*/"ORIYA LETTER YA"/* 0B2F */,/*2864*/"ORIYA LETTER RA"/* 0B30 */,NULL, /*2866*/"ORIYA LETTER LA"/* 0B32 */,/*2867*/"ORIYA LETTER LLA"/* 0B33 */,NULL,/*2869*/"ORIYA LETTER VA"/* 0B35 */, /*2870*/"ORIYA LETTER SHA"/* 0B36 */,/*2871*/"ORIYA LETTER SSA"/* 0B37 */,/*2872*/"ORIYA LETTER SA"/* 0B38 */, /*2873*/"ORIYA LETTER HA"/* 0B39 */,NULL,NULL,/*2876*/"ORIYA SIGN NUKTA"/* 0B3C */, /*2877*/"ORIYA SIGN AVAGRAHA"/* 0B3D */,/*2878*/"ORIYA VOWEL SIGN AA"/* 0B3E */,/*2879*/"ORIYA VOWEL SIGN I"/* 0B3F */, /*2880*/"ORIYA VOWEL SIGN II"/* 0B40 */,/*2881*/"ORIYA VOWEL SIGN U"/* 0B41 */,/*2882*/"ORIYA VOWEL SIGN UU"/* 0B42 */, /*2883*/"ORIYA VOWEL SIGN VOCALIC R"/* 0B43 */,/*2884*/"ORIYA VOWEL SIGN VOCALIC RR"/* 0B44 */,NULL,NULL, /*2887*/"ORIYA VOWEL SIGN E"/* 0B47 */,/*2888*/"ORIYA VOWEL SIGN AI"/* 0B48 */,NULL,NULL, /*2891*/"ORIYA VOWEL SIGN O"/* 0B4B */,/*2892*/"ORIYA VOWEL SIGN AU"/* 0B4C */,/*2893*/"ORIYA SIGN VIRAMA"/* 0B4D */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2902*/"ORIYA AI LENGTH MARK"/* 0B56 */, /*2903*/"ORIYA AU LENGTH MARK"/* 0B57 */,NULL,NULL,NULL,NULL,/*2908*/"ORIYA LETTER RRA"/* 0B5C */, /*2909*/"ORIYA LETTER RHA"/* 0B5D */,NULL,/*2911*/"ORIYA LETTER YYA"/* 0B5F */, /*2912*/"ORIYA LETTER VOCALIC RR"/* 0B60 */,/*2913*/"ORIYA LETTER VOCALIC LL"/* 0B61 */, /*2914*/"ORIYA VOWEL SIGN VOCALIC L"/* 0B62 */,/*2915*/"ORIYA VOWEL SIGN VOCALIC LL"/* 0B63 */,NULL,NULL, /*2918*/"ORIYA DIGIT ZERO"/* 0B66 */,/*2919*/"ORIYA DIGIT ONE"/* 0B67 */,/*2920*/"ORIYA DIGIT TWO"/* 0B68 */, /*2921*/"ORIYA DIGIT THREE"/* 0B69 */,/*2922*/"ORIYA DIGIT FOUR"/* 0B6A */,/*2923*/"ORIYA DIGIT FIVE"/* 0B6B */, /*2924*/"ORIYA DIGIT SIX"/* 0B6C */,/*2925*/"ORIYA DIGIT SEVEN"/* 0B6D */,/*2926*/"ORIYA DIGIT EIGHT"/* 0B6E */, /*2927*/"ORIYA DIGIT NINE"/* 0B6F */,/*2928*/"ORIYA ISSHAR"/* 0B70 */,/*2929*/"ORIYA LETTER WA"/* 0B71 */, /*2930*/"ORIYA FRACTION ONE QUARTER"/* 0B72 */,/*2931*/"ORIYA FRACTION ONE HALF"/* 0B73 */, /*2932*/"ORIYA FRACTION THREE QUARTERS"/* 0B74 */,/*2933*/"ORIYA FRACTION ONE SIXTEENTH"/* 0B75 */, /*2934*/"ORIYA FRACTION ONE EIGHTH"/* 0B76 */,/*2935*/"ORIYA FRACTION THREE SIXTEENTHS"/* 0B77 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*2946*/"TAMIL SIGN ANUSVARA"/* 0B82 */,/*2947*/"TAMIL SIGN VISARGA"/* 0B83 */,NULL, /*2949*/"TAMIL LETTER A"/* 0B85 */,/*2950*/"TAMIL LETTER AA"/* 0B86 */,/*2951*/"TAMIL LETTER I"/* 0B87 */, /*2952*/"TAMIL LETTER II"/* 0B88 */,/*2953*/"TAMIL LETTER U"/* 0B89 */,/*2954*/"TAMIL LETTER UU"/* 0B8A */,NULL,NULL, NULL,/*2958*/"TAMIL LETTER E"/* 0B8E */,/*2959*/"TAMIL LETTER EE"/* 0B8F */,/*2960*/"TAMIL LETTER AI"/* 0B90 */,NULL, /*2962*/"TAMIL LETTER O"/* 0B92 */,/*2963*/"TAMIL LETTER OO"/* 0B93 */,/*2964*/"TAMIL LETTER AU"/* 0B94 */, /*2965*/"TAMIL LETTER KA"/* 0B95 */,NULL,NULL,NULL,/*2969*/"TAMIL LETTER NGA"/* 0B99 */, /*2970*/"TAMIL LETTER CA"/* 0B9A */,NULL,/*2972*/"TAMIL LETTER JA"/* 0B9C */,NULL,/*2974*/"TAMIL LETTER NYA"/* 0B9E */, /*2975*/"TAMIL LETTER TTA"/* 0B9F */,NULL,NULL,NULL,/*2979*/"TAMIL LETTER NNA"/* 0BA3 */, /*2980*/"TAMIL LETTER TA"/* 0BA4 */,NULL,NULL,NULL,/*2984*/"TAMIL LETTER NA"/* 0BA8 */, /*2985*/"TAMIL LETTER NNNA"/* 0BA9 */,/*2986*/"TAMIL LETTER PA"/* 0BAA */,NULL,NULL,NULL, /*2990*/"TAMIL LETTER MA"/* 0BAE */,/*2991*/"TAMIL LETTER YA"/* 0BAF */,/*2992*/"TAMIL LETTER RA"/* 0BB0 */, /*2993*/"TAMIL LETTER RRA"/* 0BB1 */,/*2994*/"TAMIL LETTER LA"/* 0BB2 */,/*2995*/"TAMIL LETTER LLA"/* 0BB3 */, /*2996*/"TAMIL LETTER LLLA"/* 0BB4 */,/*2997*/"TAMIL LETTER VA"/* 0BB5 */,/*2998*/"TAMIL LETTER SHA"/* 0BB6 */, /*2999*/"TAMIL LETTER SSA"/* 0BB7 */,/*3000*/"TAMIL LETTER SA"/* 0BB8 */,/*3001*/"TAMIL LETTER HA"/* 0BB9 */,NULL,NULL, NULL,NULL,/*3006*/"TAMIL VOWEL SIGN AA"/* 0BBE */,/*3007*/"TAMIL VOWEL SIGN I"/* 0BBF */, /*3008*/"TAMIL VOWEL SIGN II"/* 0BC0 */,/*3009*/"TAMIL VOWEL SIGN U"/* 0BC1 */,/*3010*/"TAMIL VOWEL SIGN UU"/* 0BC2 */, NULL,NULL,NULL,/*3014*/"TAMIL VOWEL SIGN E"/* 0BC6 */,/*3015*/"TAMIL VOWEL SIGN EE"/* 0BC7 */, /*3016*/"TAMIL VOWEL SIGN AI"/* 0BC8 */,NULL,/*3018*/"TAMIL VOWEL SIGN O"/* 0BCA */, /*3019*/"TAMIL VOWEL SIGN OO"/* 0BCB */,/*3020*/"TAMIL VOWEL SIGN AU"/* 0BCC */,/*3021*/"TAMIL SIGN VIRAMA"/* 0BCD */, NULL,NULL,/*3024*/"TAMIL OM"/* 0BD0 */,NULL,NULL,NULL,NULL,NULL,NULL,/*3031*/"TAMIL AU LENGTH MARK"/* 0BD7 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3046*/"TAMIL DIGIT ZERO"/* 0BE6 */, /*3047*/"TAMIL DIGIT ONE"/* 0BE7 */,/*3048*/"TAMIL DIGIT TWO"/* 0BE8 */,/*3049*/"TAMIL DIGIT THREE"/* 0BE9 */, /*3050*/"TAMIL DIGIT FOUR"/* 0BEA */,/*3051*/"TAMIL DIGIT FIVE"/* 0BEB */,/*3052*/"TAMIL DIGIT SIX"/* 0BEC */, /*3053*/"TAMIL DIGIT SEVEN"/* 0BED */,/*3054*/"TAMIL DIGIT EIGHT"/* 0BEE */,/*3055*/"TAMIL DIGIT NINE"/* 0BEF */, /*3056*/"TAMIL NUMBER TEN"/* 0BF0 */,/*3057*/"TAMIL NUMBER ONE HUNDRED"/* 0BF1 */, /*3058*/"TAMIL NUMBER ONE THOUSAND"/* 0BF2 */,/*3059*/"TAMIL DAY SIGN"/* 0BF3 */,/*3060*/"TAMIL MONTH SIGN"/* 0BF4 */, /*3061*/"TAMIL YEAR SIGN"/* 0BF5 */,/*3062*/"TAMIL DEBIT SIGN"/* 0BF6 */,/*3063*/"TAMIL CREDIT SIGN"/* 0BF7 */, /*3064*/"TAMIL AS ABOVE SIGN"/* 0BF8 */,/*3065*/"TAMIL RUPEE SIGN"/* 0BF9 */,/*3066*/"TAMIL NUMBER SIGN"/* 0BFA */,NULL, NULL,NULL,NULL,NULL,/*3072*/"TELUGU SIGN COMBINING CANDRABINDU ABOVE"/* 0C00 */, /*3073*/"TELUGU SIGN CANDRABINDU"/* 0C01 */,/*3074*/"TELUGU SIGN ANUSVARA"/* 0C02 */, /*3075*/"TELUGU SIGN VISARGA"/* 0C03 */,NULL,/*3077*/"TELUGU LETTER A"/* 0C05 */,/*3078*/"TELUGU LETTER AA"/* 0C06 */, /*3079*/"TELUGU LETTER I"/* 0C07 */,/*3080*/"TELUGU LETTER II"/* 0C08 */,/*3081*/"TELUGU LETTER U"/* 0C09 */, /*3082*/"TELUGU LETTER UU"/* 0C0A */,/*3083*/"TELUGU LETTER VOCALIC R"/* 0C0B */, /*3084*/"TELUGU LETTER VOCALIC L"/* 0C0C */,NULL,/*3086*/"TELUGU LETTER E"/* 0C0E */, /*3087*/"TELUGU LETTER EE"/* 0C0F */,/*3088*/"TELUGU LETTER AI"/* 0C10 */,NULL,/*3090*/"TELUGU LETTER O"/* 0C12 */, /*3091*/"TELUGU LETTER OO"/* 0C13 */,/*3092*/"TELUGU LETTER AU"/* 0C14 */,/*3093*/"TELUGU LETTER KA"/* 0C15 */, /*3094*/"TELUGU LETTER KHA"/* 0C16 */,/*3095*/"TELUGU LETTER GA"/* 0C17 */,/*3096*/"TELUGU LETTER GHA"/* 0C18 */, /*3097*/"TELUGU LETTER NGA"/* 0C19 */,/*3098*/"TELUGU LETTER CA"/* 0C1A */,/*3099*/"TELUGU LETTER CHA"/* 0C1B */, /*3100*/"TELUGU LETTER JA"/* 0C1C */,/*3101*/"TELUGU LETTER JHA"/* 0C1D */,/*3102*/"TELUGU LETTER NYA"/* 0C1E */, /*3103*/"TELUGU LETTER TTA"/* 0C1F */,/*3104*/"TELUGU LETTER TTHA"/* 0C20 */,/*3105*/"TELUGU LETTER DDA"/* 0C21 */, /*3106*/"TELUGU LETTER DDHA"/* 0C22 */,/*3107*/"TELUGU LETTER NNA"/* 0C23 */,/*3108*/"TELUGU LETTER TA"/* 0C24 */, /*3109*/"TELUGU LETTER THA"/* 0C25 */,/*3110*/"TELUGU LETTER DA"/* 0C26 */,/*3111*/"TELUGU LETTER DHA"/* 0C27 */, /*3112*/"TELUGU LETTER NA"/* 0C28 */,NULL,/*3114*/"TELUGU LETTER PA"/* 0C2A */,/*3115*/"TELUGU LETTER PHA"/* 0C2B */, /*3116*/"TELUGU LETTER BA"/* 0C2C */,/*3117*/"TELUGU LETTER BHA"/* 0C2D */,/*3118*/"TELUGU LETTER MA"/* 0C2E */, /*3119*/"TELUGU LETTER YA"/* 0C2F */,/*3120*/"TELUGU LETTER RA"/* 0C30 */,/*3121*/"TELUGU LETTER RRA"/* 0C31 */, /*3122*/"TELUGU LETTER LA"/* 0C32 */,/*3123*/"TELUGU LETTER LLA"/* 0C33 */,/*3124*/"TELUGU LETTER LLLA"/* 0C34 */, /*3125*/"TELUGU LETTER VA"/* 0C35 */,/*3126*/"TELUGU LETTER SHA"/* 0C36 */,/*3127*/"TELUGU LETTER SSA"/* 0C37 */, /*3128*/"TELUGU LETTER SA"/* 0C38 */,/*3129*/"TELUGU LETTER HA"/* 0C39 */,NULL,NULL,NULL, /*3133*/"TELUGU SIGN AVAGRAHA"/* 0C3D */,/*3134*/"TELUGU VOWEL SIGN AA"/* 0C3E */, /*3135*/"TELUGU VOWEL SIGN I"/* 0C3F */,/*3136*/"TELUGU VOWEL SIGN II"/* 0C40 */,/*3137*/"TELUGU VOWEL SIGN U"/* 0C41 */, /*3138*/"TELUGU VOWEL SIGN UU"/* 0C42 */,/*3139*/"TELUGU VOWEL SIGN VOCALIC R"/* 0C43 */, /*3140*/"TELUGU VOWEL SIGN VOCALIC RR"/* 0C44 */,NULL,/*3142*/"TELUGU VOWEL SIGN E"/* 0C46 */, /*3143*/"TELUGU VOWEL SIGN EE"/* 0C47 */,/*3144*/"TELUGU VOWEL SIGN AI"/* 0C48 */,NULL, /*3146*/"TELUGU VOWEL SIGN O"/* 0C4A */,/*3147*/"TELUGU VOWEL SIGN OO"/* 0C4B */, /*3148*/"TELUGU VOWEL SIGN AU"/* 0C4C */,/*3149*/"TELUGU SIGN VIRAMA"/* 0C4D */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3157*/"TELUGU LENGTH MARK"/* 0C55 */,/*3158*/"TELUGU AI LENGTH MARK"/* 0C56 */,NULL, /*3160*/"TELUGU LETTER TSA"/* 0C58 */,/*3161*/"TELUGU LETTER DZA"/* 0C59 */,/*3162*/"TELUGU LETTER RRRA"/* 0C5A */,NULL, NULL,NULL,NULL,NULL,/*3168*/"TELUGU LETTER VOCALIC RR"/* 0C60 */,/*3169*/"TELUGU LETTER VOCALIC LL"/* 0C61 */, /*3170*/"TELUGU VOWEL SIGN VOCALIC L"/* 0C62 */,/*3171*/"TELUGU VOWEL SIGN VOCALIC LL"/* 0C63 */,NULL,NULL, /*3174*/"TELUGU DIGIT ZERO"/* 0C66 */,/*3175*/"TELUGU DIGIT ONE"/* 0C67 */,/*3176*/"TELUGU DIGIT TWO"/* 0C68 */, /*3177*/"TELUGU DIGIT THREE"/* 0C69 */,/*3178*/"TELUGU DIGIT FOUR"/* 0C6A */,/*3179*/"TELUGU DIGIT FIVE"/* 0C6B */, /*3180*/"TELUGU DIGIT SIX"/* 0C6C */,/*3181*/"TELUGU DIGIT SEVEN"/* 0C6D */,/*3182*/"TELUGU DIGIT EIGHT"/* 0C6E */, /*3183*/"TELUGU DIGIT NINE"/* 0C6F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3192*/"TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR"/* 0C78 */, /*3193*/"TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR"/* 0C79 */, /*3194*/"TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR"/* 0C7A */, /*3195*/"TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR"/* 0C7B */, /*3196*/"TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR"/* 0C7C */, /*3197*/"TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR"/* 0C7D */, /*3198*/"TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR"/* 0C7E */,/*3199*/"TELUGU SIGN TUUMU"/* 0C7F */,NULL, /*3201*/"KANNADA SIGN CANDRABINDU"/* 0C81 */,/*3202*/"KANNADA SIGN ANUSVARA"/* 0C82 */, /*3203*/"KANNADA SIGN VISARGA"/* 0C83 */,NULL,/*3205*/"KANNADA LETTER A"/* 0C85 */,/*3206*/"KANNADA LETTER AA"/* 0C86 */, /*3207*/"KANNADA LETTER I"/* 0C87 */,/*3208*/"KANNADA LETTER II"/* 0C88 */,/*3209*/"KANNADA LETTER U"/* 0C89 */, /*3210*/"KANNADA LETTER UU"/* 0C8A */,/*3211*/"KANNADA LETTER VOCALIC R"/* 0C8B */, /*3212*/"KANNADA LETTER VOCALIC L"/* 0C8C */,NULL,/*3214*/"KANNADA LETTER E"/* 0C8E */, /*3215*/"KANNADA LETTER EE"/* 0C8F */,/*3216*/"KANNADA LETTER AI"/* 0C90 */,NULL,/*3218*/"KANNADA LETTER O"/* 0C92 */, /*3219*/"KANNADA LETTER OO"/* 0C93 */,/*3220*/"KANNADA LETTER AU"/* 0C94 */,/*3221*/"KANNADA LETTER KA"/* 0C95 */, /*3222*/"KANNADA LETTER KHA"/* 0C96 */,/*3223*/"KANNADA LETTER GA"/* 0C97 */,/*3224*/"KANNADA LETTER GHA"/* 0C98 */, /*3225*/"KANNADA LETTER NGA"/* 0C99 */,/*3226*/"KANNADA LETTER CA"/* 0C9A */,/*3227*/"KANNADA LETTER CHA"/* 0C9B */, /*3228*/"KANNADA LETTER JA"/* 0C9C */,/*3229*/"KANNADA LETTER JHA"/* 0C9D */,/*3230*/"KANNADA LETTER NYA"/* 0C9E */, /*3231*/"KANNADA LETTER TTA"/* 0C9F */,/*3232*/"KANNADA LETTER TTHA"/* 0CA0 */,/*3233*/"KANNADA LETTER DDA"/* 0CA1 */, /*3234*/"KANNADA LETTER DDHA"/* 0CA2 */,/*3235*/"KANNADA LETTER NNA"/* 0CA3 */,/*3236*/"KANNADA LETTER TA"/* 0CA4 */, /*3237*/"KANNADA LETTER THA"/* 0CA5 */,/*3238*/"KANNADA LETTER DA"/* 0CA6 */,/*3239*/"KANNADA LETTER DHA"/* 0CA7 */, /*3240*/"KANNADA LETTER NA"/* 0CA8 */,NULL,/*3242*/"KANNADA LETTER PA"/* 0CAA */,/*3243*/"KANNADA LETTER PHA"/* 0CAB */, /*3244*/"KANNADA LETTER BA"/* 0CAC */,/*3245*/"KANNADA LETTER BHA"/* 0CAD */,/*3246*/"KANNADA LETTER MA"/* 0CAE */, /*3247*/"KANNADA LETTER YA"/* 0CAF */,/*3248*/"KANNADA LETTER RA"/* 0CB0 */,/*3249*/"KANNADA LETTER RRA"/* 0CB1 */, /*3250*/"KANNADA LETTER LA"/* 0CB2 */,/*3251*/"KANNADA LETTER LLA"/* 0CB3 */,NULL,/*3253*/"KANNADA LETTER VA"/* 0CB5 */, /*3254*/"KANNADA LETTER SHA"/* 0CB6 */,/*3255*/"KANNADA LETTER SSA"/* 0CB7 */,/*3256*/"KANNADA LETTER SA"/* 0CB8 */, /*3257*/"KANNADA LETTER HA"/* 0CB9 */,NULL,NULL,/*3260*/"KANNADA SIGN NUKTA"/* 0CBC */, /*3261*/"KANNADA SIGN AVAGRAHA"/* 0CBD */,/*3262*/"KANNADA VOWEL SIGN AA"/* 0CBE */, /*3263*/"KANNADA VOWEL SIGN I"/* 0CBF */,/*3264*/"KANNADA VOWEL SIGN II"/* 0CC0 */, /*3265*/"KANNADA VOWEL SIGN U"/* 0CC1 */,/*3266*/"KANNADA VOWEL SIGN UU"/* 0CC2 */, /*3267*/"KANNADA VOWEL SIGN VOCALIC R"/* 0CC3 */,/*3268*/"KANNADA VOWEL SIGN VOCALIC RR"/* 0CC4 */,NULL, /*3270*/"KANNADA VOWEL SIGN E"/* 0CC6 */,/*3271*/"KANNADA VOWEL SIGN EE"/* 0CC7 */, /*3272*/"KANNADA VOWEL SIGN AI"/* 0CC8 */,NULL,/*3274*/"KANNADA VOWEL SIGN O"/* 0CCA */, /*3275*/"KANNADA VOWEL SIGN OO"/* 0CCB */,/*3276*/"KANNADA VOWEL SIGN AU"/* 0CCC */, /*3277*/"KANNADA SIGN VIRAMA"/* 0CCD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3285*/"KANNADA LENGTH MARK"/* 0CD5 */, /*3286*/"KANNADA AI LENGTH MARK"/* 0CD6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3294*/"KANNADA LETTER FA"/* 0CDE */,NULL, /*3296*/"KANNADA LETTER VOCALIC RR"/* 0CE0 */,/*3297*/"KANNADA LETTER VOCALIC LL"/* 0CE1 */, /*3298*/"KANNADA VOWEL SIGN VOCALIC L"/* 0CE2 */,/*3299*/"KANNADA VOWEL SIGN VOCALIC LL"/* 0CE3 */,NULL,NULL, /*3302*/"KANNADA DIGIT ZERO"/* 0CE6 */,/*3303*/"KANNADA DIGIT ONE"/* 0CE7 */,/*3304*/"KANNADA DIGIT TWO"/* 0CE8 */, /*3305*/"KANNADA DIGIT THREE"/* 0CE9 */,/*3306*/"KANNADA DIGIT FOUR"/* 0CEA */,/*3307*/"KANNADA DIGIT FIVE"/* 0CEB */, /*3308*/"KANNADA DIGIT SIX"/* 0CEC */,/*3309*/"KANNADA DIGIT SEVEN"/* 0CED */,/*3310*/"KANNADA DIGIT EIGHT"/* 0CEE */, /*3311*/"KANNADA DIGIT NINE"/* 0CEF */,NULL,/*3313*/"KANNADA SIGN JIHVAMULIYA"/* 0CF1 */, /*3314*/"KANNADA SIGN UPADHMANIYA"/* 0CF2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3329*/"MALAYALAM SIGN CANDRABINDU"/* 0D01 */,/*3330*/"MALAYALAM SIGN ANUSVARA"/* 0D02 */, /*3331*/"MALAYALAM SIGN VISARGA"/* 0D03 */,NULL,/*3333*/"MALAYALAM LETTER A"/* 0D05 */, /*3334*/"MALAYALAM LETTER AA"/* 0D06 */,/*3335*/"MALAYALAM LETTER I"/* 0D07 */,/*3336*/"MALAYALAM LETTER II"/* 0D08 */, /*3337*/"MALAYALAM LETTER U"/* 0D09 */,/*3338*/"MALAYALAM LETTER UU"/* 0D0A */, /*3339*/"MALAYALAM LETTER VOCALIC R"/* 0D0B */,/*3340*/"MALAYALAM LETTER VOCALIC L"/* 0D0C */,NULL, /*3342*/"MALAYALAM LETTER E"/* 0D0E */,/*3343*/"MALAYALAM LETTER EE"/* 0D0F */,/*3344*/"MALAYALAM LETTER AI"/* 0D10 */, NULL,/*3346*/"MALAYALAM LETTER O"/* 0D12 */,/*3347*/"MALAYALAM LETTER OO"/* 0D13 */, /*3348*/"MALAYALAM LETTER AU"/* 0D14 */,/*3349*/"MALAYALAM LETTER KA"/* 0D15 */,/*3350*/"MALAYALAM LETTER KHA"/* 0D16 */, /*3351*/"MALAYALAM LETTER GA"/* 0D17 */,/*3352*/"MALAYALAM LETTER GHA"/* 0D18 */, /*3353*/"MALAYALAM LETTER NGA"/* 0D19 */,/*3354*/"MALAYALAM LETTER CA"/* 0D1A */, /*3355*/"MALAYALAM LETTER CHA"/* 0D1B */,/*3356*/"MALAYALAM LETTER JA"/* 0D1C */, /*3357*/"MALAYALAM LETTER JHA"/* 0D1D */,/*3358*/"MALAYALAM LETTER NYA"/* 0D1E */, /*3359*/"MALAYALAM LETTER TTA"/* 0D1F */,/*3360*/"MALAYALAM LETTER TTHA"/* 0D20 */, /*3361*/"MALAYALAM LETTER DDA"/* 0D21 */,/*3362*/"MALAYALAM LETTER DDHA"/* 0D22 */, /*3363*/"MALAYALAM LETTER NNA"/* 0D23 */,/*3364*/"MALAYALAM LETTER TA"/* 0D24 */, /*3365*/"MALAYALAM LETTER THA"/* 0D25 */,/*3366*/"MALAYALAM LETTER DA"/* 0D26 */, /*3367*/"MALAYALAM LETTER DHA"/* 0D27 */,/*3368*/"MALAYALAM LETTER NA"/* 0D28 */, /*3369*/"MALAYALAM LETTER NNNA"/* 0D29 */,/*3370*/"MALAYALAM LETTER PA"/* 0D2A */, /*3371*/"MALAYALAM LETTER PHA"/* 0D2B */,/*3372*/"MALAYALAM LETTER BA"/* 0D2C */, /*3373*/"MALAYALAM LETTER BHA"/* 0D2D */,/*3374*/"MALAYALAM LETTER MA"/* 0D2E */,/*3375*/"MALAYALAM LETTER YA"/* 0D2F */, /*3376*/"MALAYALAM LETTER RA"/* 0D30 */,/*3377*/"MALAYALAM LETTER RRA"/* 0D31 */,/*3378*/"MALAYALAM LETTER LA"/* 0D32 */, /*3379*/"MALAYALAM LETTER LLA"/* 0D33 */,/*3380*/"MALAYALAM LETTER LLLA"/* 0D34 */, /*3381*/"MALAYALAM LETTER VA"/* 0D35 */,/*3382*/"MALAYALAM LETTER SHA"/* 0D36 */, /*3383*/"MALAYALAM LETTER SSA"/* 0D37 */,/*3384*/"MALAYALAM LETTER SA"/* 0D38 */,/*3385*/"MALAYALAM LETTER HA"/* 0D39 */, /*3386*/"MALAYALAM LETTER TTTA"/* 0D3A */,NULL,NULL,/*3389*/"MALAYALAM SIGN AVAGRAHA"/* 0D3D */, /*3390*/"MALAYALAM VOWEL SIGN AA"/* 0D3E */,/*3391*/"MALAYALAM VOWEL SIGN I"/* 0D3F */, /*3392*/"MALAYALAM VOWEL SIGN II"/* 0D40 */,/*3393*/"MALAYALAM VOWEL SIGN U"/* 0D41 */, /*3394*/"MALAYALAM VOWEL SIGN UU"/* 0D42 */,/*3395*/"MALAYALAM VOWEL SIGN VOCALIC R"/* 0D43 */, /*3396*/"MALAYALAM VOWEL SIGN VOCALIC RR"/* 0D44 */,NULL,/*3398*/"MALAYALAM VOWEL SIGN E"/* 0D46 */, /*3399*/"MALAYALAM VOWEL SIGN EE"/* 0D47 */,/*3400*/"MALAYALAM VOWEL SIGN AI"/* 0D48 */,NULL, /*3402*/"MALAYALAM VOWEL SIGN O"/* 0D4A */,/*3403*/"MALAYALAM VOWEL SIGN OO"/* 0D4B */, /*3404*/"MALAYALAM VOWEL SIGN AU"/* 0D4C */,/*3405*/"MALAYALAM SIGN VIRAMA"/* 0D4D */, /*3406*/"MALAYALAM LETTER DOT REPH"/* 0D4E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3415*/"MALAYALAM AU LENGTH MARK"/* 0D57 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3423*/"MALAYALAM LETTER ARCHAIC II"/* 0D5F */,/*3424*/"MALAYALAM LETTER VOCALIC RR"/* 0D60 */, /*3425*/"MALAYALAM LETTER VOCALIC LL"/* 0D61 */,/*3426*/"MALAYALAM VOWEL SIGN VOCALIC L"/* 0D62 */, /*3427*/"MALAYALAM VOWEL SIGN VOCALIC LL"/* 0D63 */,NULL,NULL,/*3430*/"MALAYALAM DIGIT ZERO"/* 0D66 */, /*3431*/"MALAYALAM DIGIT ONE"/* 0D67 */,/*3432*/"MALAYALAM DIGIT TWO"/* 0D68 */, /*3433*/"MALAYALAM DIGIT THREE"/* 0D69 */,/*3434*/"MALAYALAM DIGIT FOUR"/* 0D6A */, /*3435*/"MALAYALAM DIGIT FIVE"/* 0D6B */,/*3436*/"MALAYALAM DIGIT SIX"/* 0D6C */, /*3437*/"MALAYALAM DIGIT SEVEN"/* 0D6D */,/*3438*/"MALAYALAM DIGIT EIGHT"/* 0D6E */, /*3439*/"MALAYALAM DIGIT NINE"/* 0D6F */,/*3440*/"MALAYALAM NUMBER TEN"/* 0D70 */, /*3441*/"MALAYALAM NUMBER ONE HUNDRED"/* 0D71 */,/*3442*/"MALAYALAM NUMBER ONE THOUSAND"/* 0D72 */, /*3443*/"MALAYALAM FRACTION ONE QUARTER"/* 0D73 */,/*3444*/"MALAYALAM FRACTION ONE HALF"/* 0D74 */, /*3445*/"MALAYALAM FRACTION THREE QUARTERS"/* 0D75 */,NULL,NULL,NULL,/*3449*/"MALAYALAM DATE MARK"/* 0D79 */, /*3450*/"MALAYALAM LETTER CHILLU NN"/* 0D7A */,/*3451*/"MALAYALAM LETTER CHILLU N"/* 0D7B */, /*3452*/"MALAYALAM LETTER CHILLU RR"/* 0D7C */,/*3453*/"MALAYALAM LETTER CHILLU L"/* 0D7D */, /*3454*/"MALAYALAM LETTER CHILLU LL"/* 0D7E */,/*3455*/"MALAYALAM LETTER CHILLU K"/* 0D7F */,NULL,NULL, /*3458*/"SINHALA SIGN ANUSVARAYA"/* 0D82 */,/*3459*/"SINHALA SIGN VISARGAYA"/* 0D83 */,NULL, /*3461*/"SINHALA LETTER AYANNA"/* 0D85 */,/*3462*/"SINHALA LETTER AAYANNA"/* 0D86 */, /*3463*/"SINHALA LETTER AEYANNA"/* 0D87 */,/*3464*/"SINHALA LETTER AEEYANNA"/* 0D88 */, /*3465*/"SINHALA LETTER IYANNA"/* 0D89 */,/*3466*/"SINHALA LETTER IIYANNA"/* 0D8A */, /*3467*/"SINHALA LETTER UYANNA"/* 0D8B */,/*3468*/"SINHALA LETTER UUYANNA"/* 0D8C */, /*3469*/"SINHALA LETTER IRUYANNA"/* 0D8D */,/*3470*/"SINHALA LETTER IRUUYANNA"/* 0D8E */, /*3471*/"SINHALA LETTER ILUYANNA"/* 0D8F */,/*3472*/"SINHALA LETTER ILUUYANNA"/* 0D90 */, /*3473*/"SINHALA LETTER EYANNA"/* 0D91 */,/*3474*/"SINHALA LETTER EEYANNA"/* 0D92 */, /*3475*/"SINHALA LETTER AIYANNA"/* 0D93 */,/*3476*/"SINHALA LETTER OYANNA"/* 0D94 */, /*3477*/"SINHALA LETTER OOYANNA"/* 0D95 */,/*3478*/"SINHALA LETTER AUYANNA"/* 0D96 */,NULL,NULL,NULL, /*3482*/"SINHALA LETTER ALPAPRAANA KAYANNA"/* 0D9A */,/*3483*/"SINHALA LETTER MAHAAPRAANA KAYANNA"/* 0D9B */, /*3484*/"SINHALA LETTER ALPAPRAANA GAYANNA"/* 0D9C */,/*3485*/"SINHALA LETTER MAHAAPRAANA GAYANNA"/* 0D9D */, /*3486*/"SINHALA LETTER KANTAJA NAASIKYAYA"/* 0D9E */,/*3487*/"SINHALA LETTER SANYAKA GAYANNA"/* 0D9F */, /*3488*/"SINHALA LETTER ALPAPRAANA CAYANNA"/* 0DA0 */,/*3489*/"SINHALA LETTER MAHAAPRAANA CAYANNA"/* 0DA1 */, /*3490*/"SINHALA LETTER ALPAPRAANA JAYANNA"/* 0DA2 */,/*3491*/"SINHALA LETTER MAHAAPRAANA JAYANNA"/* 0DA3 */, /*3492*/"SINHALA LETTER TAALUJA NAASIKYAYA"/* 0DA4 */,/*3493*/"SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA"/* 0DA5 */, /*3494*/"SINHALA LETTER SANYAKA JAYANNA"/* 0DA6 */,/*3495*/"SINHALA LETTER ALPAPRAANA TTAYANNA"/* 0DA7 */, /*3496*/"SINHALA LETTER MAHAAPRAANA TTAYANNA"/* 0DA8 */,/*3497*/"SINHALA LETTER ALPAPRAANA DDAYANNA"/* 0DA9 */, /*3498*/"SINHALA LETTER MAHAAPRAANA DDAYANNA"/* 0DAA */,/*3499*/"SINHALA LETTER MUURDHAJA NAYANNA"/* 0DAB */, /*3500*/"SINHALA LETTER SANYAKA DDAYANNA"/* 0DAC */,/*3501*/"SINHALA LETTER ALPAPRAANA TAYANNA"/* 0DAD */, /*3502*/"SINHALA LETTER MAHAAPRAANA TAYANNA"/* 0DAE */,/*3503*/"SINHALA LETTER ALPAPRAANA DAYANNA"/* 0DAF */, /*3504*/"SINHALA LETTER MAHAAPRAANA DAYANNA"/* 0DB0 */,/*3505*/"SINHALA LETTER DANTAJA NAYANNA"/* 0DB1 */,NULL, /*3507*/"SINHALA LETTER SANYAKA DAYANNA"/* 0DB3 */,/*3508*/"SINHALA LETTER ALPAPRAANA PAYANNA"/* 0DB4 */, /*3509*/"SINHALA LETTER MAHAAPRAANA PAYANNA"/* 0DB5 */,/*3510*/"SINHALA LETTER ALPAPRAANA BAYANNA"/* 0DB6 */, /*3511*/"SINHALA LETTER MAHAAPRAANA BAYANNA"/* 0DB7 */,/*3512*/"SINHALA LETTER MAYANNA"/* 0DB8 */, /*3513*/"SINHALA LETTER AMBA BAYANNA"/* 0DB9 */,/*3514*/"SINHALA LETTER YAYANNA"/* 0DBA */, /*3515*/"SINHALA LETTER RAYANNA"/* 0DBB */,NULL,/*3517*/"SINHALA LETTER DANTAJA LAYANNA"/* 0DBD */,NULL,NULL, /*3520*/"SINHALA LETTER VAYANNA"/* 0DC0 */,/*3521*/"SINHALA LETTER TAALUJA SAYANNA"/* 0DC1 */, /*3522*/"SINHALA LETTER MUURDHAJA SAYANNA"/* 0DC2 */,/*3523*/"SINHALA LETTER DANTAJA SAYANNA"/* 0DC3 */, /*3524*/"SINHALA LETTER HAYANNA"/* 0DC4 */,/*3525*/"SINHALA LETTER MUURDHAJA LAYANNA"/* 0DC5 */, /*3526*/"SINHALA LETTER FAYANNA"/* 0DC6 */,NULL,NULL,NULL,/*3530*/"SINHALA SIGN AL-LAKUNA"/* 0DCA */,NULL,NULL,NULL,NULL, /*3535*/"SINHALA VOWEL SIGN AELA-PILLA"/* 0DCF */,/*3536*/"SINHALA VOWEL SIGN KETTI AEDA-PILLA"/* 0DD0 */, /*3537*/"SINHALA VOWEL SIGN DIGA AEDA-PILLA"/* 0DD1 */,/*3538*/"SINHALA VOWEL SIGN KETTI IS-PILLA"/* 0DD2 */, /*3539*/"SINHALA VOWEL SIGN DIGA IS-PILLA"/* 0DD3 */,/*3540*/"SINHALA VOWEL SIGN KETTI PAA-PILLA"/* 0DD4 */,NULL, /*3542*/"SINHALA VOWEL SIGN DIGA PAA-PILLA"/* 0DD6 */,NULL,/*3544*/"SINHALA VOWEL SIGN GAETTA-PILLA"/* 0DD8 */, /*3545*/"SINHALA VOWEL SIGN KOMBUVA"/* 0DD9 */,/*3546*/"SINHALA VOWEL SIGN DIGA KOMBUVA"/* 0DDA */, /*3547*/"SINHALA VOWEL SIGN KOMBU DEKA"/* 0DDB */,/*3548*/"SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA"/* 0DDC */, /*3549*/"SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA"/* 0DDD */, /*3550*/"SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA"/* 0DDE */,/*3551*/"SINHALA VOWEL SIGN GAYANUKITTA"/* 0DDF */,NULL, NULL,NULL,NULL,NULL,NULL,/*3558*/"SINHALA LITH DIGIT ZERO"/* 0DE6 */,/*3559*/"SINHALA LITH DIGIT ONE"/* 0DE7 */, /*3560*/"SINHALA LITH DIGIT TWO"/* 0DE8 */,/*3561*/"SINHALA LITH DIGIT THREE"/* 0DE9 */, /*3562*/"SINHALA LITH DIGIT FOUR"/* 0DEA */,/*3563*/"SINHALA LITH DIGIT FIVE"/* 0DEB */, /*3564*/"SINHALA LITH DIGIT SIX"/* 0DEC */,/*3565*/"SINHALA LITH DIGIT SEVEN"/* 0DED */, /*3566*/"SINHALA LITH DIGIT EIGHT"/* 0DEE */,/*3567*/"SINHALA LITH DIGIT NINE"/* 0DEF */,NULL,NULL, /*3570*/"SINHALA VOWEL SIGN DIGA GAETTA-PILLA"/* 0DF2 */,/*3571*/"SINHALA VOWEL SIGN DIGA GAYANUKITTA"/* 0DF3 */, /*3572*/"SINHALA PUNCTUATION KUNDDALIYA"/* 0DF4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3585*/"THAI CHARACTER KO KAI"/* 0E01 */,/*3586*/"THAI CHARACTER KHO KHAI"/* 0E02 */, /*3587*/"THAI CHARACTER KHO KHUAT"/* 0E03 */,/*3588*/"THAI CHARACTER KHO KHWAI"/* 0E04 */, /*3589*/"THAI CHARACTER KHO KHON"/* 0E05 */,/*3590*/"THAI CHARACTER KHO RAKHANG"/* 0E06 */, /*3591*/"THAI CHARACTER NGO NGU"/* 0E07 */,/*3592*/"THAI CHARACTER CHO CHAN"/* 0E08 */, /*3593*/"THAI CHARACTER CHO CHING"/* 0E09 */,/*3594*/"THAI CHARACTER CHO CHANG"/* 0E0A */, /*3595*/"THAI CHARACTER SO SO"/* 0E0B */,/*3596*/"THAI CHARACTER CHO CHOE"/* 0E0C */, /*3597*/"THAI CHARACTER YO YING"/* 0E0D */,/*3598*/"THAI CHARACTER DO CHADA"/* 0E0E */, /*3599*/"THAI CHARACTER TO PATAK"/* 0E0F */,/*3600*/"THAI CHARACTER THO THAN"/* 0E10 */, /*3601*/"THAI CHARACTER THO NANGMONTHO"/* 0E11 */,/*3602*/"THAI CHARACTER THO PHUTHAO"/* 0E12 */, /*3603*/"THAI CHARACTER NO NEN"/* 0E13 */,/*3604*/"THAI CHARACTER DO DEK"/* 0E14 */, /*3605*/"THAI CHARACTER TO TAO"/* 0E15 */,/*3606*/"THAI CHARACTER THO THUNG"/* 0E16 */, /*3607*/"THAI CHARACTER THO THAHAN"/* 0E17 */,/*3608*/"THAI CHARACTER THO THONG"/* 0E18 */, /*3609*/"THAI CHARACTER NO NU"/* 0E19 */,/*3610*/"THAI CHARACTER BO BAIMAI"/* 0E1A */, /*3611*/"THAI CHARACTER PO PLA"/* 0E1B */,/*3612*/"THAI CHARACTER PHO PHUNG"/* 0E1C */, /*3613*/"THAI CHARACTER FO FA"/* 0E1D */,/*3614*/"THAI CHARACTER PHO PHAN"/* 0E1E */, /*3615*/"THAI CHARACTER FO FAN"/* 0E1F */,/*3616*/"THAI CHARACTER PHO SAMPHAO"/* 0E20 */, /*3617*/"THAI CHARACTER MO MA"/* 0E21 */,/*3618*/"THAI CHARACTER YO YAK"/* 0E22 */, /*3619*/"THAI CHARACTER RO RUA"/* 0E23 */,/*3620*/"THAI CHARACTER RU"/* 0E24 */, /*3621*/"THAI CHARACTER LO LING"/* 0E25 */,/*3622*/"THAI CHARACTER LU"/* 0E26 */, /*3623*/"THAI CHARACTER WO WAEN"/* 0E27 */,/*3624*/"THAI CHARACTER SO SALA"/* 0E28 */, /*3625*/"THAI CHARACTER SO RUSI"/* 0E29 */,/*3626*/"THAI CHARACTER SO SUA"/* 0E2A */, /*3627*/"THAI CHARACTER HO HIP"/* 0E2B */,/*3628*/"THAI CHARACTER LO CHULA"/* 0E2C */, /*3629*/"THAI CHARACTER O ANG"/* 0E2D */,/*3630*/"THAI CHARACTER HO NOKHUK"/* 0E2E */, /*3631*/"THAI CHARACTER PAIYANNOI"/* 0E2F */,/*3632*/"THAI CHARACTER SARA A"/* 0E30 */, /*3633*/"THAI CHARACTER MAI HAN-AKAT"/* 0E31 */,/*3634*/"THAI CHARACTER SARA AA"/* 0E32 */, /*3635*/"THAI CHARACTER SARA AM"/* 0E33 */,/*3636*/"THAI CHARACTER SARA I"/* 0E34 */, /*3637*/"THAI CHARACTER SARA II"/* 0E35 */,/*3638*/"THAI CHARACTER SARA UE"/* 0E36 */, /*3639*/"THAI CHARACTER SARA UEE"/* 0E37 */,/*3640*/"THAI CHARACTER SARA U"/* 0E38 */, /*3641*/"THAI CHARACTER SARA UU"/* 0E39 */,/*3642*/"THAI CHARACTER PHINTHU"/* 0E3A */,NULL,NULL,NULL,NULL, /*3647*/"THAI CURRENCY SYMBOL BAHT"/* 0E3F */,/*3648*/"THAI CHARACTER SARA E"/* 0E40 */, /*3649*/"THAI CHARACTER SARA AE"/* 0E41 */,/*3650*/"THAI CHARACTER SARA O"/* 0E42 */, /*3651*/"THAI CHARACTER SARA AI MAIMUAN"/* 0E43 */,/*3652*/"THAI CHARACTER SARA AI MAIMALAI"/* 0E44 */, /*3653*/"THAI CHARACTER LAKKHANGYAO"/* 0E45 */,/*3654*/"THAI CHARACTER MAIYAMOK"/* 0E46 */, /*3655*/"THAI CHARACTER MAITAIKHU"/* 0E47 */,/*3656*/"THAI CHARACTER MAI EK"/* 0E48 */, /*3657*/"THAI CHARACTER MAI THO"/* 0E49 */,/*3658*/"THAI CHARACTER MAI TRI"/* 0E4A */, /*3659*/"THAI CHARACTER MAI CHATTAWA"/* 0E4B */,/*3660*/"THAI CHARACTER THANTHAKHAT"/* 0E4C */, /*3661*/"THAI CHARACTER NIKHAHIT"/* 0E4D */,/*3662*/"THAI CHARACTER YAMAKKAN"/* 0E4E */, /*3663*/"THAI CHARACTER FONGMAN"/* 0E4F */,/*3664*/"THAI DIGIT ZERO"/* 0E50 */,/*3665*/"THAI DIGIT ONE"/* 0E51 */, /*3666*/"THAI DIGIT TWO"/* 0E52 */,/*3667*/"THAI DIGIT THREE"/* 0E53 */,/*3668*/"THAI DIGIT FOUR"/* 0E54 */, /*3669*/"THAI DIGIT FIVE"/* 0E55 */,/*3670*/"THAI DIGIT SIX"/* 0E56 */,/*3671*/"THAI DIGIT SEVEN"/* 0E57 */, /*3672*/"THAI DIGIT EIGHT"/* 0E58 */,/*3673*/"THAI DIGIT NINE"/* 0E59 */,/*3674*/"THAI CHARACTER ANGKHANKHU"/* 0E5A */, /*3675*/"THAI CHARACTER KHOMUT"/* 0E5B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3713*/"LAO LETTER KO"/* 0E81 */,/*3714*/"LAO LETTER KHO SUNG"/* 0E82 */,NULL,/*3716*/"LAO LETTER KHO TAM"/* 0E84 */, NULL,NULL,/*3719*/"LAO LETTER NGO"/* 0E87 */,/*3720*/"LAO LETTER CO"/* 0E88 */,NULL, /*3722*/"LAO LETTER SO TAM"/* 0E8A */,NULL,NULL,/*3725*/"LAO LETTER NYO"/* 0E8D */,NULL,NULL,NULL,NULL,NULL,NULL, /*3732*/"LAO LETTER DO"/* 0E94 */,/*3733*/"LAO LETTER TO"/* 0E95 */,/*3734*/"LAO LETTER THO SUNG"/* 0E96 */, /*3735*/"LAO LETTER THO TAM"/* 0E97 */,NULL,/*3737*/"LAO LETTER NO"/* 0E99 */,/*3738*/"LAO LETTER BO"/* 0E9A */, /*3739*/"LAO LETTER PO"/* 0E9B */,/*3740*/"LAO LETTER PHO SUNG"/* 0E9C */,/*3741*/"LAO LETTER FO TAM"/* 0E9D */, /*3742*/"LAO LETTER PHO TAM"/* 0E9E */,/*3743*/"LAO LETTER FO SUNG"/* 0E9F */,NULL,/*3745*/"LAO LETTER MO"/* 0EA1 */, /*3746*/"LAO LETTER YO"/* 0EA2 */,/*3747*/"LAO LETTER LO LING"/* 0EA3 */,NULL,/*3749*/"LAO LETTER LO LOOT"/* 0EA5 */, NULL,/*3751*/"LAO LETTER WO"/* 0EA7 */,NULL,NULL,/*3754*/"LAO LETTER SO SUNG"/* 0EAA */, /*3755*/"LAO LETTER HO SUNG"/* 0EAB */,NULL,/*3757*/"LAO LETTER O"/* 0EAD */,/*3758*/"LAO LETTER HO TAM"/* 0EAE */, /*3759*/"LAO ELLIPSIS"/* 0EAF */,/*3760*/"LAO VOWEL SIGN A"/* 0EB0 */,/*3761*/"LAO VOWEL SIGN MAI KAN"/* 0EB1 */, /*3762*/"LAO VOWEL SIGN AA"/* 0EB2 */,/*3763*/"LAO VOWEL SIGN AM"/* 0EB3 */,/*3764*/"LAO VOWEL SIGN I"/* 0EB4 */, /*3765*/"LAO VOWEL SIGN II"/* 0EB5 */,/*3766*/"LAO VOWEL SIGN Y"/* 0EB6 */,/*3767*/"LAO VOWEL SIGN YY"/* 0EB7 */, /*3768*/"LAO VOWEL SIGN U"/* 0EB8 */,/*3769*/"LAO VOWEL SIGN UU"/* 0EB9 */,NULL, /*3771*/"LAO VOWEL SIGN MAI KON"/* 0EBB */,/*3772*/"LAO SEMIVOWEL SIGN LO"/* 0EBC */, /*3773*/"LAO SEMIVOWEL SIGN NYO"/* 0EBD */,NULL,NULL,/*3776*/"LAO VOWEL SIGN E"/* 0EC0 */, /*3777*/"LAO VOWEL SIGN EI"/* 0EC1 */,/*3778*/"LAO VOWEL SIGN O"/* 0EC2 */,/*3779*/"LAO VOWEL SIGN AY"/* 0EC3 */, /*3780*/"LAO VOWEL SIGN AI"/* 0EC4 */,NULL,/*3782*/"LAO KO LA"/* 0EC6 */,NULL,/*3784*/"LAO TONE MAI EK"/* 0EC8 */, /*3785*/"LAO TONE MAI THO"/* 0EC9 */,/*3786*/"LAO TONE MAI TI"/* 0ECA */,/*3787*/"LAO TONE MAI CATAWA"/* 0ECB */, /*3788*/"LAO CANCELLATION MARK"/* 0ECC */,/*3789*/"LAO NIGGAHITA"/* 0ECD */,NULL,NULL,/*3792*/"LAO DIGIT ZERO"/* 0ED0 */, /*3793*/"LAO DIGIT ONE"/* 0ED1 */,/*3794*/"LAO DIGIT TWO"/* 0ED2 */,/*3795*/"LAO DIGIT THREE"/* 0ED3 */, /*3796*/"LAO DIGIT FOUR"/* 0ED4 */,/*3797*/"LAO DIGIT FIVE"/* 0ED5 */,/*3798*/"LAO DIGIT SIX"/* 0ED6 */, /*3799*/"LAO DIGIT SEVEN"/* 0ED7 */,/*3800*/"LAO DIGIT EIGHT"/* 0ED8 */,/*3801*/"LAO DIGIT NINE"/* 0ED9 */,NULL,NULL, /*3804*/"LAO HO NO"/* 0EDC */,/*3805*/"LAO HO MO"/* 0EDD */,/*3806*/"LAO LETTER KHMU GO"/* 0EDE */, /*3807*/"LAO LETTER KHMU NYO"/* 0EDF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3840*/"TIBETAN SYLLABLE OM"/* 0F00 */, /*3841*/"TIBETAN MARK GTER YIG MGO TRUNCATED A"/* 0F01 */,/*3842*/"TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA"/* 0F02 */, /*3843*/"TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA"/* 0F03 */,/*3844*/"TIBETAN MARK INITIAL YIG MGO MDUN MA"/* 0F04 */, /*3845*/"TIBETAN MARK CLOSING YIG MGO SGAB MA"/* 0F05 */,/*3846*/"TIBETAN MARK CARET YIG MGO PHUR SHAD MA"/* 0F06 */, /*3847*/"TIBETAN MARK YIG MGO TSHEG SHAD MA"/* 0F07 */,/*3848*/"TIBETAN MARK SBRUL SHAD"/* 0F08 */, /*3849*/"TIBETAN MARK BSKUR YIG MGO"/* 0F09 */,/*3850*/"TIBETAN MARK BKA- SHOG YIG MGO"/* 0F0A */, /*3851*/"TIBETAN MARK INTERSYLLABIC TSHEG"/* 0F0B */,/*3852*/"TIBETAN MARK DELIMITER TSHEG BSTAR"/* 0F0C */, /*3853*/"TIBETAN MARK SHAD"/* 0F0D */,/*3854*/"TIBETAN MARK NYIS SHAD"/* 0F0E */, /*3855*/"TIBETAN MARK TSHEG SHAD"/* 0F0F */,/*3856*/"TIBETAN MARK NYIS TSHEG SHAD"/* 0F10 */, /*3857*/"TIBETAN MARK RIN CHEN SPUNGS SHAD"/* 0F11 */,/*3858*/"TIBETAN MARK RGYA GRAM SHAD"/* 0F12 */, /*3859*/"TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN"/* 0F13 */,/*3860*/"TIBETAN MARK GTER TSHEG"/* 0F14 */, /*3861*/"TIBETAN LOGOTYPE SIGN CHAD RTAGS"/* 0F15 */,/*3862*/"TIBETAN LOGOTYPE SIGN LHAG RTAGS"/* 0F16 */, /*3863*/"TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS"/* 0F17 */, /*3864*/"TIBETAN ASTROLOGICAL SIGN -KHYUD PA"/* 0F18 */,/*3865*/"TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS"/* 0F19 */, /*3866*/"TIBETAN SIGN RDEL DKAR GCIG"/* 0F1A */,/*3867*/"TIBETAN SIGN RDEL DKAR GNYIS"/* 0F1B */, /*3868*/"TIBETAN SIGN RDEL DKAR GSUM"/* 0F1C */,/*3869*/"TIBETAN SIGN RDEL NAG GCIG"/* 0F1D */, /*3870*/"TIBETAN SIGN RDEL NAG GNYIS"/* 0F1E */,/*3871*/"TIBETAN SIGN RDEL DKAR RDEL NAG"/* 0F1F */, /*3872*/"TIBETAN DIGIT ZERO"/* 0F20 */,/*3873*/"TIBETAN DIGIT ONE"/* 0F21 */,/*3874*/"TIBETAN DIGIT TWO"/* 0F22 */, /*3875*/"TIBETAN DIGIT THREE"/* 0F23 */,/*3876*/"TIBETAN DIGIT FOUR"/* 0F24 */,/*3877*/"TIBETAN DIGIT FIVE"/* 0F25 */, /*3878*/"TIBETAN DIGIT SIX"/* 0F26 */,/*3879*/"TIBETAN DIGIT SEVEN"/* 0F27 */,/*3880*/"TIBETAN DIGIT EIGHT"/* 0F28 */, /*3881*/"TIBETAN DIGIT NINE"/* 0F29 */,/*3882*/"TIBETAN DIGIT HALF ONE"/* 0F2A */, /*3883*/"TIBETAN DIGIT HALF TWO"/* 0F2B */,/*3884*/"TIBETAN DIGIT HALF THREE"/* 0F2C */, /*3885*/"TIBETAN DIGIT HALF FOUR"/* 0F2D */,/*3886*/"TIBETAN DIGIT HALF FIVE"/* 0F2E */, /*3887*/"TIBETAN DIGIT HALF SIX"/* 0F2F */,/*3888*/"TIBETAN DIGIT HALF SEVEN"/* 0F30 */, /*3889*/"TIBETAN DIGIT HALF EIGHT"/* 0F31 */,/*3890*/"TIBETAN DIGIT HALF NINE"/* 0F32 */, /*3891*/"TIBETAN DIGIT HALF ZERO"/* 0F33 */,/*3892*/"TIBETAN MARK BSDUS RTAGS"/* 0F34 */, /*3893*/"TIBETAN MARK NGAS BZUNG NYI ZLA"/* 0F35 */,/*3894*/"TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN"/* 0F36 */, /*3895*/"TIBETAN MARK NGAS BZUNG SGOR RTAGS"/* 0F37 */,/*3896*/"TIBETAN MARK CHE MGO"/* 0F38 */, /*3897*/"TIBETAN MARK TSA -PHRU"/* 0F39 */,/*3898*/"TIBETAN MARK GUG RTAGS GYON"/* 0F3A */, /*3899*/"TIBETAN MARK GUG RTAGS GYAS"/* 0F3B */,/*3900*/"TIBETAN MARK ANG KHANG GYON"/* 0F3C */, /*3901*/"TIBETAN MARK ANG KHANG GYAS"/* 0F3D */,/*3902*/"TIBETAN SIGN YAR TSHES"/* 0F3E */, /*3903*/"TIBETAN SIGN MAR TSHES"/* 0F3F */,/*3904*/"TIBETAN LETTER KA"/* 0F40 */,/*3905*/"TIBETAN LETTER KHA"/* 0F41 */, /*3906*/"TIBETAN LETTER GA"/* 0F42 */,/*3907*/"TIBETAN LETTER GHA"/* 0F43 */,/*3908*/"TIBETAN LETTER NGA"/* 0F44 */, /*3909*/"TIBETAN LETTER CA"/* 0F45 */,/*3910*/"TIBETAN LETTER CHA"/* 0F46 */,/*3911*/"TIBETAN LETTER JA"/* 0F47 */,NULL, /*3913*/"TIBETAN LETTER NYA"/* 0F49 */,/*3914*/"TIBETAN LETTER TTA"/* 0F4A */,/*3915*/"TIBETAN LETTER TTHA"/* 0F4B */, /*3916*/"TIBETAN LETTER DDA"/* 0F4C */,/*3917*/"TIBETAN LETTER DDHA"/* 0F4D */,/*3918*/"TIBETAN LETTER NNA"/* 0F4E */, /*3919*/"TIBETAN LETTER TA"/* 0F4F */,/*3920*/"TIBETAN LETTER THA"/* 0F50 */,/*3921*/"TIBETAN LETTER DA"/* 0F51 */, /*3922*/"TIBETAN LETTER DHA"/* 0F52 */,/*3923*/"TIBETAN LETTER NA"/* 0F53 */,/*3924*/"TIBETAN LETTER PA"/* 0F54 */, /*3925*/"TIBETAN LETTER PHA"/* 0F55 */,/*3926*/"TIBETAN LETTER BA"/* 0F56 */,/*3927*/"TIBETAN LETTER BHA"/* 0F57 */, /*3928*/"TIBETAN LETTER MA"/* 0F58 */,/*3929*/"TIBETAN LETTER TSA"/* 0F59 */,/*3930*/"TIBETAN LETTER TSHA"/* 0F5A */, /*3931*/"TIBETAN LETTER DZA"/* 0F5B */,/*3932*/"TIBETAN LETTER DZHA"/* 0F5C */,/*3933*/"TIBETAN LETTER WA"/* 0F5D */, /*3934*/"TIBETAN LETTER ZHA"/* 0F5E */,/*3935*/"TIBETAN LETTER ZA"/* 0F5F */,/*3936*/"TIBETAN LETTER -A"/* 0F60 */, /*3937*/"TIBETAN LETTER YA"/* 0F61 */,/*3938*/"TIBETAN LETTER RA"/* 0F62 */,/*3939*/"TIBETAN LETTER LA"/* 0F63 */, /*3940*/"TIBETAN LETTER SHA"/* 0F64 */,/*3941*/"TIBETAN LETTER SSA"/* 0F65 */,/*3942*/"TIBETAN LETTER SA"/* 0F66 */, /*3943*/"TIBETAN LETTER HA"/* 0F67 */,/*3944*/"TIBETAN LETTER A"/* 0F68 */,/*3945*/"TIBETAN LETTER KSSA"/* 0F69 */, /*3946*/"TIBETAN LETTER FIXED-FORM RA"/* 0F6A */,/*3947*/"TIBETAN LETTER KKA"/* 0F6B */, /*3948*/"TIBETAN LETTER RRA"/* 0F6C */,NULL,NULL,NULL,NULL,/*3953*/"TIBETAN VOWEL SIGN AA"/* 0F71 */, /*3954*/"TIBETAN VOWEL SIGN I"/* 0F72 */,/*3955*/"TIBETAN VOWEL SIGN II"/* 0F73 */, /*3956*/"TIBETAN VOWEL SIGN U"/* 0F74 */,/*3957*/"TIBETAN VOWEL SIGN UU"/* 0F75 */, /*3958*/"TIBETAN VOWEL SIGN VOCALIC R"/* 0F76 */,/*3959*/"TIBETAN VOWEL SIGN VOCALIC RR"/* 0F77 */, /*3960*/"TIBETAN VOWEL SIGN VOCALIC L"/* 0F78 */,/*3961*/"TIBETAN VOWEL SIGN VOCALIC LL"/* 0F79 */, /*3962*/"TIBETAN VOWEL SIGN E"/* 0F7A */,/*3963*/"TIBETAN VOWEL SIGN EE"/* 0F7B */, /*3964*/"TIBETAN VOWEL SIGN O"/* 0F7C */,/*3965*/"TIBETAN VOWEL SIGN OO"/* 0F7D */, /*3966*/"TIBETAN SIGN RJES SU NGA RO"/* 0F7E */,/*3967*/"TIBETAN SIGN RNAM BCAD"/* 0F7F */, /*3968*/"TIBETAN VOWEL SIGN REVERSED I"/* 0F80 */,/*3969*/"TIBETAN VOWEL SIGN REVERSED II"/* 0F81 */, /*3970*/"TIBETAN SIGN NYI ZLA NAA DA"/* 0F82 */,/*3971*/"TIBETAN SIGN SNA LDAN"/* 0F83 */, /*3972*/"TIBETAN MARK HALANTA"/* 0F84 */,/*3973*/"TIBETAN MARK PALUTA"/* 0F85 */, /*3974*/"TIBETAN SIGN LCI RTAGS"/* 0F86 */,/*3975*/"TIBETAN SIGN YANG RTAGS"/* 0F87 */, /*3976*/"TIBETAN SIGN LCE TSA CAN"/* 0F88 */,/*3977*/"TIBETAN SIGN MCHU CAN"/* 0F89 */, /*3978*/"TIBETAN SIGN GRU CAN RGYINGS"/* 0F8A */,/*3979*/"TIBETAN SIGN GRU MED RGYINGS"/* 0F8B */, /*3980*/"TIBETAN SIGN INVERTED MCHU CAN"/* 0F8C */,/*3981*/"TIBETAN SUBJOINED SIGN LCE TSA CAN"/* 0F8D */, /*3982*/"TIBETAN SUBJOINED SIGN MCHU CAN"/* 0F8E */,/*3983*/"TIBETAN SUBJOINED SIGN INVERTED MCHU CAN"/* 0F8F */, /*3984*/"TIBETAN SUBJOINED LETTER KA"/* 0F90 */,/*3985*/"TIBETAN SUBJOINED LETTER KHA"/* 0F91 */, /*3986*/"TIBETAN SUBJOINED LETTER GA"/* 0F92 */,/*3987*/"TIBETAN SUBJOINED LETTER GHA"/* 0F93 */, /*3988*/"TIBETAN SUBJOINED LETTER NGA"/* 0F94 */,/*3989*/"TIBETAN SUBJOINED LETTER CA"/* 0F95 */, /*3990*/"TIBETAN SUBJOINED LETTER CHA"/* 0F96 */,/*3991*/"TIBETAN SUBJOINED LETTER JA"/* 0F97 */,NULL, /*3993*/"TIBETAN SUBJOINED LETTER NYA"/* 0F99 */,/*3994*/"TIBETAN SUBJOINED LETTER TTA"/* 0F9A */, /*3995*/"TIBETAN SUBJOINED LETTER TTHA"/* 0F9B */,/*3996*/"TIBETAN SUBJOINED LETTER DDA"/* 0F9C */, /*3997*/"TIBETAN SUBJOINED LETTER DDHA"/* 0F9D */,/*3998*/"TIBETAN SUBJOINED LETTER NNA"/* 0F9E */, /*3999*/"TIBETAN SUBJOINED LETTER TA"/* 0F9F */,/*4000*/"TIBETAN SUBJOINED LETTER THA"/* 0FA0 */, /*4001*/"TIBETAN SUBJOINED LETTER DA"/* 0FA1 */,/*4002*/"TIBETAN SUBJOINED LETTER DHA"/* 0FA2 */, /*4003*/"TIBETAN SUBJOINED LETTER NA"/* 0FA3 */,/*4004*/"TIBETAN SUBJOINED LETTER PA"/* 0FA4 */, /*4005*/"TIBETAN SUBJOINED LETTER PHA"/* 0FA5 */,/*4006*/"TIBETAN SUBJOINED LETTER BA"/* 0FA6 */, /*4007*/"TIBETAN SUBJOINED LETTER BHA"/* 0FA7 */,/*4008*/"TIBETAN SUBJOINED LETTER MA"/* 0FA8 */, /*4009*/"TIBETAN SUBJOINED LETTER TSA"/* 0FA9 */,/*4010*/"TIBETAN SUBJOINED LETTER TSHA"/* 0FAA */, /*4011*/"TIBETAN SUBJOINED LETTER DZA"/* 0FAB */,/*4012*/"TIBETAN SUBJOINED LETTER DZHA"/* 0FAC */, /*4013*/"TIBETAN SUBJOINED LETTER WA"/* 0FAD */,/*4014*/"TIBETAN SUBJOINED LETTER ZHA"/* 0FAE */, /*4015*/"TIBETAN SUBJOINED LETTER ZA"/* 0FAF */,/*4016*/"TIBETAN SUBJOINED LETTER -A"/* 0FB0 */, /*4017*/"TIBETAN SUBJOINED LETTER YA"/* 0FB1 */,/*4018*/"TIBETAN SUBJOINED LETTER RA"/* 0FB2 */, /*4019*/"TIBETAN SUBJOINED LETTER LA"/* 0FB3 */,/*4020*/"TIBETAN SUBJOINED LETTER SHA"/* 0FB4 */, /*4021*/"TIBETAN SUBJOINED LETTER SSA"/* 0FB5 */,/*4022*/"TIBETAN SUBJOINED LETTER SA"/* 0FB6 */, /*4023*/"TIBETAN SUBJOINED LETTER HA"/* 0FB7 */,/*4024*/"TIBETAN SUBJOINED LETTER A"/* 0FB8 */, /*4025*/"TIBETAN SUBJOINED LETTER KSSA"/* 0FB9 */,/*4026*/"TIBETAN SUBJOINED LETTER FIXED-FORM WA"/* 0FBA */, /*4027*/"TIBETAN SUBJOINED LETTER FIXED-FORM YA"/* 0FBB */,/*4028*/"TIBETAN SUBJOINED LETTER FIXED-FORM RA"/* 0FBC */, NULL,/*4030*/"TIBETAN KU RU KHA"/* 0FBE */,/*4031*/"TIBETAN KU RU KHA BZHI MIG CAN"/* 0FBF */, /*4032*/"TIBETAN CANTILLATION SIGN HEAVY BEAT"/* 0FC0 */,/*4033*/"TIBETAN CANTILLATION SIGN LIGHT BEAT"/* 0FC1 */, /*4034*/"TIBETAN CANTILLATION SIGN CANG TE-U"/* 0FC2 */,/*4035*/"TIBETAN CANTILLATION SIGN SBUB -CHAL"/* 0FC3 */, /*4036*/"TIBETAN SYMBOL DRIL BU"/* 0FC4 */,/*4037*/"TIBETAN SYMBOL RDO RJE"/* 0FC5 */, /*4038*/"TIBETAN SYMBOL PADMA GDAN"/* 0FC6 */,/*4039*/"TIBETAN SYMBOL RDO RJE RGYA GRAM"/* 0FC7 */, /*4040*/"TIBETAN SYMBOL PHUR PA"/* 0FC8 */,/*4041*/"TIBETAN SYMBOL NOR BU"/* 0FC9 */, /*4042*/"TIBETAN SYMBOL NOR BU NYIS -KHYIL"/* 0FCA */,/*4043*/"TIBETAN SYMBOL NOR BU GSUM -KHYIL"/* 0FCB */, /*4044*/"TIBETAN SYMBOL NOR BU BZHI -KHYIL"/* 0FCC */,NULL,/*4046*/"TIBETAN SIGN RDEL NAG RDEL DKAR"/* 0FCE */, /*4047*/"TIBETAN SIGN RDEL NAG GSUM"/* 0FCF */,/*4048*/"TIBETAN MARK BSKA- SHOG GI MGO RGYAN"/* 0FD0 */, /*4049*/"TIBETAN MARK MNYAM YIG GI MGO RGYAN"/* 0FD1 */,/*4050*/"TIBETAN MARK NYIS TSHEG"/* 0FD2 */, /*4051*/"TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA"/* 0FD3 */, /*4052*/"TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA"/* 0FD4 */,/*4053*/"RIGHT-FACING SVASTI SIGN"/* 0FD5 */, /*4054*/"LEFT-FACING SVASTI SIGN"/* 0FD6 */,/*4055*/"RIGHT-FACING SVASTI SIGN WITH DOTS"/* 0FD7 */, /*4056*/"LEFT-FACING SVASTI SIGN WITH DOTS"/* 0FD8 */,/*4057*/"TIBETAN MARK LEADING MCHAN RTAGS"/* 0FD9 */, /*4058*/"TIBETAN MARK TRAILING MCHAN RTAGS"/* 0FDA */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*4096*/"MYANMAR LETTER KA"/* 1000 */,/*4097*/"MYANMAR LETTER KHA"/* 1001 */,/*4098*/"MYANMAR LETTER GA"/* 1002 */, /*4099*/"MYANMAR LETTER GHA"/* 1003 */,/*4100*/"MYANMAR LETTER NGA"/* 1004 */,/*4101*/"MYANMAR LETTER CA"/* 1005 */, /*4102*/"MYANMAR LETTER CHA"/* 1006 */,/*4103*/"MYANMAR LETTER JA"/* 1007 */,/*4104*/"MYANMAR LETTER JHA"/* 1008 */, /*4105*/"MYANMAR LETTER NYA"/* 1009 */,/*4106*/"MYANMAR LETTER NNYA"/* 100A */,/*4107*/"MYANMAR LETTER TTA"/* 100B */, /*4108*/"MYANMAR LETTER TTHA"/* 100C */,/*4109*/"MYANMAR LETTER DDA"/* 100D */,/*4110*/"MYANMAR LETTER DDHA"/* 100E */, /*4111*/"MYANMAR LETTER NNA"/* 100F */,/*4112*/"MYANMAR LETTER TA"/* 1010 */,/*4113*/"MYANMAR LETTER THA"/* 1011 */, /*4114*/"MYANMAR LETTER DA"/* 1012 */,/*4115*/"MYANMAR LETTER DHA"/* 1013 */,/*4116*/"MYANMAR LETTER NA"/* 1014 */, /*4117*/"MYANMAR LETTER PA"/* 1015 */,/*4118*/"MYANMAR LETTER PHA"/* 1016 */,/*4119*/"MYANMAR LETTER BA"/* 1017 */, /*4120*/"MYANMAR LETTER BHA"/* 1018 */,/*4121*/"MYANMAR LETTER MA"/* 1019 */,/*4122*/"MYANMAR LETTER YA"/* 101A */, /*4123*/"MYANMAR LETTER RA"/* 101B */,/*4124*/"MYANMAR LETTER LA"/* 101C */,/*4125*/"MYANMAR LETTER WA"/* 101D */, /*4126*/"MYANMAR LETTER SA"/* 101E */,/*4127*/"MYANMAR LETTER HA"/* 101F */,/*4128*/"MYANMAR LETTER LLA"/* 1020 */, /*4129*/"MYANMAR LETTER A"/* 1021 */,/*4130*/"MYANMAR LETTER SHAN A"/* 1022 */,/*4131*/"MYANMAR LETTER I"/* 1023 */, /*4132*/"MYANMAR LETTER II"/* 1024 */,/*4133*/"MYANMAR LETTER U"/* 1025 */,/*4134*/"MYANMAR LETTER UU"/* 1026 */, /*4135*/"MYANMAR LETTER E"/* 1027 */,/*4136*/"MYANMAR LETTER MON E"/* 1028 */,/*4137*/"MYANMAR LETTER O"/* 1029 */, /*4138*/"MYANMAR LETTER AU"/* 102A */,/*4139*/"MYANMAR VOWEL SIGN TALL AA"/* 102B */, /*4140*/"MYANMAR VOWEL SIGN AA"/* 102C */,/*4141*/"MYANMAR VOWEL SIGN I"/* 102D */, /*4142*/"MYANMAR VOWEL SIGN II"/* 102E */,/*4143*/"MYANMAR VOWEL SIGN U"/* 102F */, /*4144*/"MYANMAR VOWEL SIGN UU"/* 1030 */,/*4145*/"MYANMAR VOWEL SIGN E"/* 1031 */, /*4146*/"MYANMAR VOWEL SIGN AI"/* 1032 */,/*4147*/"MYANMAR VOWEL SIGN MON II"/* 1033 */, /*4148*/"MYANMAR VOWEL SIGN MON O"/* 1034 */,/*4149*/"MYANMAR VOWEL SIGN E ABOVE"/* 1035 */, /*4150*/"MYANMAR SIGN ANUSVARA"/* 1036 */,/*4151*/"MYANMAR SIGN DOT BELOW"/* 1037 */, /*4152*/"MYANMAR SIGN VISARGA"/* 1038 */,/*4153*/"MYANMAR SIGN VIRAMA"/* 1039 */,/*4154*/"MYANMAR SIGN ASAT"/* 103A */, /*4155*/"MYANMAR CONSONANT SIGN MEDIAL YA"/* 103B */,/*4156*/"MYANMAR CONSONANT SIGN MEDIAL RA"/* 103C */, /*4157*/"MYANMAR CONSONANT SIGN MEDIAL WA"/* 103D */,/*4158*/"MYANMAR CONSONANT SIGN MEDIAL HA"/* 103E */, /*4159*/"MYANMAR LETTER GREAT SA"/* 103F */,/*4160*/"MYANMAR DIGIT ZERO"/* 1040 */,/*4161*/"MYANMAR DIGIT ONE"/* 1041 */, /*4162*/"MYANMAR DIGIT TWO"/* 1042 */,/*4163*/"MYANMAR DIGIT THREE"/* 1043 */,/*4164*/"MYANMAR DIGIT FOUR"/* 1044 */, /*4165*/"MYANMAR DIGIT FIVE"/* 1045 */,/*4166*/"MYANMAR DIGIT SIX"/* 1046 */,/*4167*/"MYANMAR DIGIT SEVEN"/* 1047 */, /*4168*/"MYANMAR DIGIT EIGHT"/* 1048 */,/*4169*/"MYANMAR DIGIT NINE"/* 1049 */, /*4170*/"MYANMAR SIGN LITTLE SECTION"/* 104A */,/*4171*/"MYANMAR SIGN SECTION"/* 104B */, /*4172*/"MYANMAR SYMBOL LOCATIVE"/* 104C */,/*4173*/"MYANMAR SYMBOL COMPLETED"/* 104D */, /*4174*/"MYANMAR SYMBOL AFOREMENTIONED"/* 104E */,/*4175*/"MYANMAR SYMBOL GENITIVE"/* 104F */, /*4176*/"MYANMAR LETTER SHA"/* 1050 */,/*4177*/"MYANMAR LETTER SSA"/* 1051 */, /*4178*/"MYANMAR LETTER VOCALIC R"/* 1052 */,/*4179*/"MYANMAR LETTER VOCALIC RR"/* 1053 */, /*4180*/"MYANMAR LETTER VOCALIC L"/* 1054 */,/*4181*/"MYANMAR LETTER VOCALIC LL"/* 1055 */, /*4182*/"MYANMAR VOWEL SIGN VOCALIC R"/* 1056 */,/*4183*/"MYANMAR VOWEL SIGN VOCALIC RR"/* 1057 */, /*4184*/"MYANMAR VOWEL SIGN VOCALIC L"/* 1058 */,/*4185*/"MYANMAR VOWEL SIGN VOCALIC LL"/* 1059 */, /*4186*/"MYANMAR LETTER MON NGA"/* 105A */,/*4187*/"MYANMAR LETTER MON JHA"/* 105B */, /*4188*/"MYANMAR LETTER MON BBA"/* 105C */,/*4189*/"MYANMAR LETTER MON BBE"/* 105D */, /*4190*/"MYANMAR CONSONANT SIGN MON MEDIAL NA"/* 105E */,/*4191*/"MYANMAR CONSONANT SIGN MON MEDIAL MA"/* 105F */, /*4192*/"MYANMAR CONSONANT SIGN MON MEDIAL LA"/* 1060 */,/*4193*/"MYANMAR LETTER SGAW KAREN SHA"/* 1061 */, /*4194*/"MYANMAR VOWEL SIGN SGAW KAREN EU"/* 1062 */,/*4195*/"MYANMAR TONE MARK SGAW KAREN HATHI"/* 1063 */, /*4196*/"MYANMAR TONE MARK SGAW KAREN KE PHO"/* 1064 */,/*4197*/"MYANMAR LETTER WESTERN PWO KAREN THA"/* 1065 */, /*4198*/"MYANMAR LETTER WESTERN PWO KAREN PWA"/* 1066 */,/*4199*/"MYANMAR VOWEL SIGN WESTERN PWO KAREN EU"/* 1067 */, /*4200*/"MYANMAR VOWEL SIGN WESTERN PWO KAREN UE"/* 1068 */,/*4201*/"MYANMAR SIGN WESTERN PWO KAREN TONE-1"/* 1069 */, /*4202*/"MYANMAR SIGN WESTERN PWO KAREN TONE-2"/* 106A */,/*4203*/"MYANMAR SIGN WESTERN PWO KAREN TONE-3"/* 106B */, /*4204*/"MYANMAR SIGN WESTERN PWO KAREN TONE-4"/* 106C */,/*4205*/"MYANMAR SIGN WESTERN PWO KAREN TONE-5"/* 106D */, /*4206*/"MYANMAR LETTER EASTERN PWO KAREN NNA"/* 106E */,/*4207*/"MYANMAR LETTER EASTERN PWO KAREN YWA"/* 106F */, /*4208*/"MYANMAR LETTER EASTERN PWO KAREN GHWA"/* 1070 */,/*4209*/"MYANMAR VOWEL SIGN GEBA KAREN I"/* 1071 */, /*4210*/"MYANMAR VOWEL SIGN KAYAH OE"/* 1072 */,/*4211*/"MYANMAR VOWEL SIGN KAYAH U"/* 1073 */, /*4212*/"MYANMAR VOWEL SIGN KAYAH EE"/* 1074 */,/*4213*/"MYANMAR LETTER SHAN KA"/* 1075 */, /*4214*/"MYANMAR LETTER SHAN KHA"/* 1076 */,/*4215*/"MYANMAR LETTER SHAN GA"/* 1077 */, /*4216*/"MYANMAR LETTER SHAN CA"/* 1078 */,/*4217*/"MYANMAR LETTER SHAN ZA"/* 1079 */, /*4218*/"MYANMAR LETTER SHAN NYA"/* 107A */,/*4219*/"MYANMAR LETTER SHAN DA"/* 107B */, /*4220*/"MYANMAR LETTER SHAN NA"/* 107C */,/*4221*/"MYANMAR LETTER SHAN PHA"/* 107D */, /*4222*/"MYANMAR LETTER SHAN FA"/* 107E */,/*4223*/"MYANMAR LETTER SHAN BA"/* 107F */, /*4224*/"MYANMAR LETTER SHAN THA"/* 1080 */,/*4225*/"MYANMAR LETTER SHAN HA"/* 1081 */, /*4226*/"MYANMAR CONSONANT SIGN SHAN MEDIAL WA"/* 1082 */,/*4227*/"MYANMAR VOWEL SIGN SHAN AA"/* 1083 */, /*4228*/"MYANMAR VOWEL SIGN SHAN E"/* 1084 */,/*4229*/"MYANMAR VOWEL SIGN SHAN E ABOVE"/* 1085 */, /*4230*/"MYANMAR VOWEL SIGN SHAN FINAL Y"/* 1086 */,/*4231*/"MYANMAR SIGN SHAN TONE-2"/* 1087 */, /*4232*/"MYANMAR SIGN SHAN TONE-3"/* 1088 */,/*4233*/"MYANMAR SIGN SHAN TONE-5"/* 1089 */, /*4234*/"MYANMAR SIGN SHAN TONE-6"/* 108A */,/*4235*/"MYANMAR SIGN SHAN COUNCIL TONE-2"/* 108B */, /*4236*/"MYANMAR SIGN SHAN COUNCIL TONE-3"/* 108C */,/*4237*/"MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE"/* 108D */, /*4238*/"MYANMAR LETTER RUMAI PALAUNG FA"/* 108E */,/*4239*/"MYANMAR SIGN RUMAI PALAUNG TONE-5"/* 108F */, /*4240*/"MYANMAR SHAN DIGIT ZERO"/* 1090 */,/*4241*/"MYANMAR SHAN DIGIT ONE"/* 1091 */, /*4242*/"MYANMAR SHAN DIGIT TWO"/* 1092 */,/*4243*/"MYANMAR SHAN DIGIT THREE"/* 1093 */, /*4244*/"MYANMAR SHAN DIGIT FOUR"/* 1094 */,/*4245*/"MYANMAR SHAN DIGIT FIVE"/* 1095 */, /*4246*/"MYANMAR SHAN DIGIT SIX"/* 1096 */,/*4247*/"MYANMAR SHAN DIGIT SEVEN"/* 1097 */, /*4248*/"MYANMAR SHAN DIGIT EIGHT"/* 1098 */,/*4249*/"MYANMAR SHAN DIGIT NINE"/* 1099 */, /*4250*/"MYANMAR SIGN KHAMTI TONE-1"/* 109A */,/*4251*/"MYANMAR SIGN KHAMTI TONE-3"/* 109B */, /*4252*/"MYANMAR VOWEL SIGN AITON A"/* 109C */,/*4253*/"MYANMAR VOWEL SIGN AITON AI"/* 109D */, /*4254*/"MYANMAR SYMBOL SHAN ONE"/* 109E */,/*4255*/"MYANMAR SYMBOL SHAN EXCLAMATION"/* 109F */, /*4256*/"GEORGIAN CAPITAL LETTER AN"/* 10A0 */,/*4257*/"GEORGIAN CAPITAL LETTER BAN"/* 10A1 */, /*4258*/"GEORGIAN CAPITAL LETTER GAN"/* 10A2 */,/*4259*/"GEORGIAN CAPITAL LETTER DON"/* 10A3 */, /*4260*/"GEORGIAN CAPITAL LETTER EN"/* 10A4 */,/*4261*/"GEORGIAN CAPITAL LETTER VIN"/* 10A5 */, /*4262*/"GEORGIAN CAPITAL LETTER ZEN"/* 10A6 */,/*4263*/"GEORGIAN CAPITAL LETTER TAN"/* 10A7 */, /*4264*/"GEORGIAN CAPITAL LETTER IN"/* 10A8 */,/*4265*/"GEORGIAN CAPITAL LETTER KAN"/* 10A9 */, /*4266*/"GEORGIAN CAPITAL LETTER LAS"/* 10AA */,/*4267*/"GEORGIAN CAPITAL LETTER MAN"/* 10AB */, /*4268*/"GEORGIAN CAPITAL LETTER NAR"/* 10AC */,/*4269*/"GEORGIAN CAPITAL LETTER ON"/* 10AD */, /*4270*/"GEORGIAN CAPITAL LETTER PAR"/* 10AE */,/*4271*/"GEORGIAN CAPITAL LETTER ZHAR"/* 10AF */, /*4272*/"GEORGIAN CAPITAL LETTER RAE"/* 10B0 */,/*4273*/"GEORGIAN CAPITAL LETTER SAN"/* 10B1 */, /*4274*/"GEORGIAN CAPITAL LETTER TAR"/* 10B2 */,/*4275*/"GEORGIAN CAPITAL LETTER UN"/* 10B3 */, /*4276*/"GEORGIAN CAPITAL LETTER PHAR"/* 10B4 */,/*4277*/"GEORGIAN CAPITAL LETTER KHAR"/* 10B5 */, /*4278*/"GEORGIAN CAPITAL LETTER GHAN"/* 10B6 */,/*4279*/"GEORGIAN CAPITAL LETTER QAR"/* 10B7 */, /*4280*/"GEORGIAN CAPITAL LETTER SHIN"/* 10B8 */,/*4281*/"GEORGIAN CAPITAL LETTER CHIN"/* 10B9 */, /*4282*/"GEORGIAN CAPITAL LETTER CAN"/* 10BA */,/*4283*/"GEORGIAN CAPITAL LETTER JIL"/* 10BB */, /*4284*/"GEORGIAN CAPITAL LETTER CIL"/* 10BC */,/*4285*/"GEORGIAN CAPITAL LETTER CHAR"/* 10BD */, /*4286*/"GEORGIAN CAPITAL LETTER XAN"/* 10BE */,/*4287*/"GEORGIAN CAPITAL LETTER JHAN"/* 10BF */, /*4288*/"GEORGIAN CAPITAL LETTER HAE"/* 10C0 */,/*4289*/"GEORGIAN CAPITAL LETTER HE"/* 10C1 */, /*4290*/"GEORGIAN CAPITAL LETTER HIE"/* 10C2 */,/*4291*/"GEORGIAN CAPITAL LETTER WE"/* 10C3 */, /*4292*/"GEORGIAN CAPITAL LETTER HAR"/* 10C4 */,/*4293*/"GEORGIAN CAPITAL LETTER HOE"/* 10C5 */,NULL, /*4295*/"GEORGIAN CAPITAL LETTER YN"/* 10C7 */,NULL,NULL,NULL,NULL,NULL,/*4301*/"GEORGIAN CAPITAL LETTER AEN"/* 10CD */, NULL,NULL,/*4304*/"GEORGIAN LETTER AN"/* 10D0 */,/*4305*/"GEORGIAN LETTER BAN"/* 10D1 */, /*4306*/"GEORGIAN LETTER GAN"/* 10D2 */,/*4307*/"GEORGIAN LETTER DON"/* 10D3 */,/*4308*/"GEORGIAN LETTER EN"/* 10D4 */, /*4309*/"GEORGIAN LETTER VIN"/* 10D5 */,/*4310*/"GEORGIAN LETTER ZEN"/* 10D6 */,/*4311*/"GEORGIAN LETTER TAN"/* 10D7 */, /*4312*/"GEORGIAN LETTER IN"/* 10D8 */,/*4313*/"GEORGIAN LETTER KAN"/* 10D9 */,/*4314*/"GEORGIAN LETTER LAS"/* 10DA */, /*4315*/"GEORGIAN LETTER MAN"/* 10DB */,/*4316*/"GEORGIAN LETTER NAR"/* 10DC */,/*4317*/"GEORGIAN LETTER ON"/* 10DD */, /*4318*/"GEORGIAN LETTER PAR"/* 10DE */,/*4319*/"GEORGIAN LETTER ZHAR"/* 10DF */,/*4320*/"GEORGIAN LETTER RAE"/* 10E0 */, /*4321*/"GEORGIAN LETTER SAN"/* 10E1 */,/*4322*/"GEORGIAN LETTER TAR"/* 10E2 */,/*4323*/"GEORGIAN LETTER UN"/* 10E3 */, /*4324*/"GEORGIAN LETTER PHAR"/* 10E4 */,/*4325*/"GEORGIAN LETTER KHAR"/* 10E5 */, /*4326*/"GEORGIAN LETTER GHAN"/* 10E6 */,/*4327*/"GEORGIAN LETTER QAR"/* 10E7 */, /*4328*/"GEORGIAN LETTER SHIN"/* 10E8 */,/*4329*/"GEORGIAN LETTER CHIN"/* 10E9 */, /*4330*/"GEORGIAN LETTER CAN"/* 10EA */,/*4331*/"GEORGIAN LETTER JIL"/* 10EB */,/*4332*/"GEORGIAN LETTER CIL"/* 10EC */, /*4333*/"GEORGIAN LETTER CHAR"/* 10ED */,/*4334*/"GEORGIAN LETTER XAN"/* 10EE */, /*4335*/"GEORGIAN LETTER JHAN"/* 10EF */,/*4336*/"GEORGIAN LETTER HAE"/* 10F0 */,/*4337*/"GEORGIAN LETTER HE"/* 10F1 */, /*4338*/"GEORGIAN LETTER HIE"/* 10F2 */,/*4339*/"GEORGIAN LETTER WE"/* 10F3 */,/*4340*/"GEORGIAN LETTER HAR"/* 10F4 */, /*4341*/"GEORGIAN LETTER HOE"/* 10F5 */,/*4342*/"GEORGIAN LETTER FI"/* 10F6 */,/*4343*/"GEORGIAN LETTER YN"/* 10F7 */, /*4344*/"GEORGIAN LETTER ELIFI"/* 10F8 */,/*4345*/"GEORGIAN LETTER TURNED GAN"/* 10F9 */, /*4346*/"GEORGIAN LETTER AIN"/* 10FA */,/*4347*/"GEORGIAN PARAGRAPH SEPARATOR"/* 10FB */, /*4348*/"MODIFIER LETTER GEORGIAN NAR"/* 10FC */,/*4349*/"GEORGIAN LETTER AEN"/* 10FD */, /*4350*/"GEORGIAN LETTER HARD SIGN"/* 10FE */,/*4351*/"GEORGIAN LETTER LABIAL SIGN"/* 10FF */, /*4352*/"HANGUL CHOSEONG KIYEOK"/* 1100 */,/*4353*/"HANGUL CHOSEONG SSANGKIYEOK"/* 1101 */, /*4354*/"HANGUL CHOSEONG NIEUN"/* 1102 */,/*4355*/"HANGUL CHOSEONG TIKEUT"/* 1103 */, /*4356*/"HANGUL CHOSEONG SSANGTIKEUT"/* 1104 */,/*4357*/"HANGUL CHOSEONG RIEUL"/* 1105 */, /*4358*/"HANGUL CHOSEONG MIEUM"/* 1106 */,/*4359*/"HANGUL CHOSEONG PIEUP"/* 1107 */, /*4360*/"HANGUL CHOSEONG SSANGPIEUP"/* 1108 */,/*4361*/"HANGUL CHOSEONG SIOS"/* 1109 */, /*4362*/"HANGUL CHOSEONG SSANGSIOS"/* 110A */,/*4363*/"HANGUL CHOSEONG IEUNG"/* 110B */, /*4364*/"HANGUL CHOSEONG CIEUC"/* 110C */,/*4365*/"HANGUL CHOSEONG SSANGCIEUC"/* 110D */, /*4366*/"HANGUL CHOSEONG CHIEUCH"/* 110E */,/*4367*/"HANGUL CHOSEONG KHIEUKH"/* 110F */, /*4368*/"HANGUL CHOSEONG THIEUTH"/* 1110 */,/*4369*/"HANGUL CHOSEONG PHIEUPH"/* 1111 */, /*4370*/"HANGUL CHOSEONG HIEUH"/* 1112 */,/*4371*/"HANGUL CHOSEONG NIEUN-KIYEOK"/* 1113 */, /*4372*/"HANGUL CHOSEONG SSANGNIEUN"/* 1114 */,/*4373*/"HANGUL CHOSEONG NIEUN-TIKEUT"/* 1115 */, /*4374*/"HANGUL CHOSEONG NIEUN-PIEUP"/* 1116 */,/*4375*/"HANGUL CHOSEONG TIKEUT-KIYEOK"/* 1117 */, /*4376*/"HANGUL CHOSEONG RIEUL-NIEUN"/* 1118 */,/*4377*/"HANGUL CHOSEONG SSANGRIEUL"/* 1119 */, /*4378*/"HANGUL CHOSEONG RIEUL-HIEUH"/* 111A */,/*4379*/"HANGUL CHOSEONG KAPYEOUNRIEUL"/* 111B */, /*4380*/"HANGUL CHOSEONG MIEUM-PIEUP"/* 111C */,/*4381*/"HANGUL CHOSEONG KAPYEOUNMIEUM"/* 111D */, /*4382*/"HANGUL CHOSEONG PIEUP-KIYEOK"/* 111E */,/*4383*/"HANGUL CHOSEONG PIEUP-NIEUN"/* 111F */, /*4384*/"HANGUL CHOSEONG PIEUP-TIKEUT"/* 1120 */,/*4385*/"HANGUL CHOSEONG PIEUP-SIOS"/* 1121 */, /*4386*/"HANGUL CHOSEONG PIEUP-SIOS-KIYEOK"/* 1122 */,/*4387*/"HANGUL CHOSEONG PIEUP-SIOS-TIKEUT"/* 1123 */, /*4388*/"HANGUL CHOSEONG PIEUP-SIOS-PIEUP"/* 1124 */,/*4389*/"HANGUL CHOSEONG PIEUP-SSANGSIOS"/* 1125 */, /*4390*/"HANGUL CHOSEONG PIEUP-SIOS-CIEUC"/* 1126 */,/*4391*/"HANGUL CHOSEONG PIEUP-CIEUC"/* 1127 */, /*4392*/"HANGUL CHOSEONG PIEUP-CHIEUCH"/* 1128 */,/*4393*/"HANGUL CHOSEONG PIEUP-THIEUTH"/* 1129 */, /*4394*/"HANGUL CHOSEONG PIEUP-PHIEUPH"/* 112A */,/*4395*/"HANGUL CHOSEONG KAPYEOUNPIEUP"/* 112B */, /*4396*/"HANGUL CHOSEONG KAPYEOUNSSANGPIEUP"/* 112C */,/*4397*/"HANGUL CHOSEONG SIOS-KIYEOK"/* 112D */, /*4398*/"HANGUL CHOSEONG SIOS-NIEUN"/* 112E */,/*4399*/"HANGUL CHOSEONG SIOS-TIKEUT"/* 112F */, /*4400*/"HANGUL CHOSEONG SIOS-RIEUL"/* 1130 */,/*4401*/"HANGUL CHOSEONG SIOS-MIEUM"/* 1131 */, /*4402*/"HANGUL CHOSEONG SIOS-PIEUP"/* 1132 */,/*4403*/"HANGUL CHOSEONG SIOS-PIEUP-KIYEOK"/* 1133 */, /*4404*/"HANGUL CHOSEONG SIOS-SSANGSIOS"/* 1134 */,/*4405*/"HANGUL CHOSEONG SIOS-IEUNG"/* 1135 */, /*4406*/"HANGUL CHOSEONG SIOS-CIEUC"/* 1136 */,/*4407*/"HANGUL CHOSEONG SIOS-CHIEUCH"/* 1137 */, /*4408*/"HANGUL CHOSEONG SIOS-KHIEUKH"/* 1138 */,/*4409*/"HANGUL CHOSEONG SIOS-THIEUTH"/* 1139 */, /*4410*/"HANGUL CHOSEONG SIOS-PHIEUPH"/* 113A */,/*4411*/"HANGUL CHOSEONG SIOS-HIEUH"/* 113B */, /*4412*/"HANGUL CHOSEONG CHITUEUMSIOS"/* 113C */,/*4413*/"HANGUL CHOSEONG CHITUEUMSSANGSIOS"/* 113D */, /*4414*/"HANGUL CHOSEONG CEONGCHIEUMSIOS"/* 113E */,/*4415*/"HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS"/* 113F */, /*4416*/"HANGUL CHOSEONG PANSIOS"/* 1140 */,/*4417*/"HANGUL CHOSEONG IEUNG-KIYEOK"/* 1141 */, /*4418*/"HANGUL CHOSEONG IEUNG-TIKEUT"/* 1142 */,/*4419*/"HANGUL CHOSEONG IEUNG-MIEUM"/* 1143 */, /*4420*/"HANGUL CHOSEONG IEUNG-PIEUP"/* 1144 */,/*4421*/"HANGUL CHOSEONG IEUNG-SIOS"/* 1145 */, /*4422*/"HANGUL CHOSEONG IEUNG-PANSIOS"/* 1146 */,/*4423*/"HANGUL CHOSEONG SSANGIEUNG"/* 1147 */, /*4424*/"HANGUL CHOSEONG IEUNG-CIEUC"/* 1148 */,/*4425*/"HANGUL CHOSEONG IEUNG-CHIEUCH"/* 1149 */, /*4426*/"HANGUL CHOSEONG IEUNG-THIEUTH"/* 114A */,/*4427*/"HANGUL CHOSEONG IEUNG-PHIEUPH"/* 114B */, /*4428*/"HANGUL CHOSEONG YESIEUNG"/* 114C */,/*4429*/"HANGUL CHOSEONG CIEUC-IEUNG"/* 114D */, /*4430*/"HANGUL CHOSEONG CHITUEUMCIEUC"/* 114E */,/*4431*/"HANGUL CHOSEONG CHITUEUMSSANGCIEUC"/* 114F */, /*4432*/"HANGUL CHOSEONG CEONGCHIEUMCIEUC"/* 1150 */,/*4433*/"HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC"/* 1151 */, /*4434*/"HANGUL CHOSEONG CHIEUCH-KHIEUKH"/* 1152 */,/*4435*/"HANGUL CHOSEONG CHIEUCH-HIEUH"/* 1153 */, /*4436*/"HANGUL CHOSEONG CHITUEUMCHIEUCH"/* 1154 */,/*4437*/"HANGUL CHOSEONG CEONGCHIEUMCHIEUCH"/* 1155 */, /*4438*/"HANGUL CHOSEONG PHIEUPH-PIEUP"/* 1156 */,/*4439*/"HANGUL CHOSEONG KAPYEOUNPHIEUPH"/* 1157 */, /*4440*/"HANGUL CHOSEONG SSANGHIEUH"/* 1158 */,/*4441*/"HANGUL CHOSEONG YEORINHIEUH"/* 1159 */, /*4442*/"HANGUL CHOSEONG KIYEOK-TIKEUT"/* 115A */,/*4443*/"HANGUL CHOSEONG NIEUN-SIOS"/* 115B */, /*4444*/"HANGUL CHOSEONG NIEUN-CIEUC"/* 115C */,/*4445*/"HANGUL CHOSEONG NIEUN-HIEUH"/* 115D */, /*4446*/"HANGUL CHOSEONG TIKEUT-RIEUL"/* 115E */,/*4447*/"HANGUL CHOSEONG FILLER"/* 115F */, /*4448*/"HANGUL JUNGSEONG FILLER"/* 1160 */,/*4449*/"HANGUL JUNGSEONG A"/* 1161 */, /*4450*/"HANGUL JUNGSEONG AE"/* 1162 */,/*4451*/"HANGUL JUNGSEONG YA"/* 1163 */,/*4452*/"HANGUL JUNGSEONG YAE"/* 1164 */, /*4453*/"HANGUL JUNGSEONG EO"/* 1165 */,/*4454*/"HANGUL JUNGSEONG E"/* 1166 */,/*4455*/"HANGUL JUNGSEONG YEO"/* 1167 */, /*4456*/"HANGUL JUNGSEONG YE"/* 1168 */,/*4457*/"HANGUL JUNGSEONG O"/* 1169 */,/*4458*/"HANGUL JUNGSEONG WA"/* 116A */, /*4459*/"HANGUL JUNGSEONG WAE"/* 116B */,/*4460*/"HANGUL JUNGSEONG OE"/* 116C */,/*4461*/"HANGUL JUNGSEONG YO"/* 116D */, /*4462*/"HANGUL JUNGSEONG U"/* 116E */,/*4463*/"HANGUL JUNGSEONG WEO"/* 116F */,/*4464*/"HANGUL JUNGSEONG WE"/* 1170 */, /*4465*/"HANGUL JUNGSEONG WI"/* 1171 */,/*4466*/"HANGUL JUNGSEONG YU"/* 1172 */,/*4467*/"HANGUL JUNGSEONG EU"/* 1173 */, /*4468*/"HANGUL JUNGSEONG YI"/* 1174 */,/*4469*/"HANGUL JUNGSEONG I"/* 1175 */,/*4470*/"HANGUL JUNGSEONG A-O"/* 1176 */, /*4471*/"HANGUL JUNGSEONG A-U"/* 1177 */,/*4472*/"HANGUL JUNGSEONG YA-O"/* 1178 */, /*4473*/"HANGUL JUNGSEONG YA-YO"/* 1179 */,/*4474*/"HANGUL JUNGSEONG EO-O"/* 117A */, /*4475*/"HANGUL JUNGSEONG EO-U"/* 117B */,/*4476*/"HANGUL JUNGSEONG EO-EU"/* 117C */, /*4477*/"HANGUL JUNGSEONG YEO-O"/* 117D */,/*4478*/"HANGUL JUNGSEONG YEO-U"/* 117E */, /*4479*/"HANGUL JUNGSEONG O-EO"/* 117F */,/*4480*/"HANGUL JUNGSEONG O-E"/* 1180 */, /*4481*/"HANGUL JUNGSEONG O-YE"/* 1181 */,/*4482*/"HANGUL JUNGSEONG O-O"/* 1182 */, /*4483*/"HANGUL JUNGSEONG O-U"/* 1183 */,/*4484*/"HANGUL JUNGSEONG YO-YA"/* 1184 */, /*4485*/"HANGUL JUNGSEONG YO-YAE"/* 1185 */,/*4486*/"HANGUL JUNGSEONG YO-YEO"/* 1186 */, /*4487*/"HANGUL JUNGSEONG YO-O"/* 1187 */,/*4488*/"HANGUL JUNGSEONG YO-I"/* 1188 */, /*4489*/"HANGUL JUNGSEONG U-A"/* 1189 */,/*4490*/"HANGUL JUNGSEONG U-AE"/* 118A */, /*4491*/"HANGUL JUNGSEONG U-EO-EU"/* 118B */,/*4492*/"HANGUL JUNGSEONG U-YE"/* 118C */, /*4493*/"HANGUL JUNGSEONG U-U"/* 118D */,/*4494*/"HANGUL JUNGSEONG YU-A"/* 118E */, /*4495*/"HANGUL JUNGSEONG YU-EO"/* 118F */,/*4496*/"HANGUL JUNGSEONG YU-E"/* 1190 */, /*4497*/"HANGUL JUNGSEONG YU-YEO"/* 1191 */,/*4498*/"HANGUL JUNGSEONG YU-YE"/* 1192 */, /*4499*/"HANGUL JUNGSEONG YU-U"/* 1193 */,/*4500*/"HANGUL JUNGSEONG YU-I"/* 1194 */, /*4501*/"HANGUL JUNGSEONG EU-U"/* 1195 */,/*4502*/"HANGUL JUNGSEONG EU-EU"/* 1196 */, /*4503*/"HANGUL JUNGSEONG YI-U"/* 1197 */,/*4504*/"HANGUL JUNGSEONG I-A"/* 1198 */, /*4505*/"HANGUL JUNGSEONG I-YA"/* 1199 */,/*4506*/"HANGUL JUNGSEONG I-O"/* 119A */, /*4507*/"HANGUL JUNGSEONG I-U"/* 119B */,/*4508*/"HANGUL JUNGSEONG I-EU"/* 119C */, /*4509*/"HANGUL JUNGSEONG I-ARAEA"/* 119D */,/*4510*/"HANGUL JUNGSEONG ARAEA"/* 119E */, /*4511*/"HANGUL JUNGSEONG ARAEA-EO"/* 119F */,/*4512*/"HANGUL JUNGSEONG ARAEA-U"/* 11A0 */, /*4513*/"HANGUL JUNGSEONG ARAEA-I"/* 11A1 */,/*4514*/"HANGUL JUNGSEONG SSANGARAEA"/* 11A2 */, /*4515*/"HANGUL JUNGSEONG A-EU"/* 11A3 */,/*4516*/"HANGUL JUNGSEONG YA-U"/* 11A4 */, /*4517*/"HANGUL JUNGSEONG YEO-YA"/* 11A5 */,/*4518*/"HANGUL JUNGSEONG O-YA"/* 11A6 */, /*4519*/"HANGUL JUNGSEONG O-YAE"/* 11A7 */,/*4520*/"HANGUL JONGSEONG KIYEOK"/* 11A8 */, /*4521*/"HANGUL JONGSEONG SSANGKIYEOK"/* 11A9 */,/*4522*/"HANGUL JONGSEONG KIYEOK-SIOS"/* 11AA */, /*4523*/"HANGUL JONGSEONG NIEUN"/* 11AB */,/*4524*/"HANGUL JONGSEONG NIEUN-CIEUC"/* 11AC */, /*4525*/"HANGUL JONGSEONG NIEUN-HIEUH"/* 11AD */,/*4526*/"HANGUL JONGSEONG TIKEUT"/* 11AE */, /*4527*/"HANGUL JONGSEONG RIEUL"/* 11AF */,/*4528*/"HANGUL JONGSEONG RIEUL-KIYEOK"/* 11B0 */, /*4529*/"HANGUL JONGSEONG RIEUL-MIEUM"/* 11B1 */,/*4530*/"HANGUL JONGSEONG RIEUL-PIEUP"/* 11B2 */, /*4531*/"HANGUL JONGSEONG RIEUL-SIOS"/* 11B3 */,/*4532*/"HANGUL JONGSEONG RIEUL-THIEUTH"/* 11B4 */, /*4533*/"HANGUL JONGSEONG RIEUL-PHIEUPH"/* 11B5 */,/*4534*/"HANGUL JONGSEONG RIEUL-HIEUH"/* 11B6 */, /*4535*/"HANGUL JONGSEONG MIEUM"/* 11B7 */,/*4536*/"HANGUL JONGSEONG PIEUP"/* 11B8 */, /*4537*/"HANGUL JONGSEONG PIEUP-SIOS"/* 11B9 */,/*4538*/"HANGUL JONGSEONG SIOS"/* 11BA */, /*4539*/"HANGUL JONGSEONG SSANGSIOS"/* 11BB */,/*4540*/"HANGUL JONGSEONG IEUNG"/* 11BC */, /*4541*/"HANGUL JONGSEONG CIEUC"/* 11BD */,/*4542*/"HANGUL JONGSEONG CHIEUCH"/* 11BE */, /*4543*/"HANGUL JONGSEONG KHIEUKH"/* 11BF */,/*4544*/"HANGUL JONGSEONG THIEUTH"/* 11C0 */, /*4545*/"HANGUL JONGSEONG PHIEUPH"/* 11C1 */,/*4546*/"HANGUL JONGSEONG HIEUH"/* 11C2 */, /*4547*/"HANGUL JONGSEONG KIYEOK-RIEUL"/* 11C3 */,/*4548*/"HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK"/* 11C4 */, /*4549*/"HANGUL JONGSEONG NIEUN-KIYEOK"/* 11C5 */,/*4550*/"HANGUL JONGSEONG NIEUN-TIKEUT"/* 11C6 */, /*4551*/"HANGUL JONGSEONG NIEUN-SIOS"/* 11C7 */,/*4552*/"HANGUL JONGSEONG NIEUN-PANSIOS"/* 11C8 */, /*4553*/"HANGUL JONGSEONG NIEUN-THIEUTH"/* 11C9 */,/*4554*/"HANGUL JONGSEONG TIKEUT-KIYEOK"/* 11CA */, /*4555*/"HANGUL JONGSEONG TIKEUT-RIEUL"/* 11CB */,/*4556*/"HANGUL JONGSEONG RIEUL-KIYEOK-SIOS"/* 11CC */, /*4557*/"HANGUL JONGSEONG RIEUL-NIEUN"/* 11CD */,/*4558*/"HANGUL JONGSEONG RIEUL-TIKEUT"/* 11CE */, /*4559*/"HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH"/* 11CF */,/*4560*/"HANGUL JONGSEONG SSANGRIEUL"/* 11D0 */, /*4561*/"HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK"/* 11D1 */,/*4562*/"HANGUL JONGSEONG RIEUL-MIEUM-SIOS"/* 11D2 */, /*4563*/"HANGUL JONGSEONG RIEUL-PIEUP-SIOS"/* 11D3 */,/*4564*/"HANGUL JONGSEONG RIEUL-PIEUP-HIEUH"/* 11D4 */, /*4565*/"HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP"/* 11D5 */,/*4566*/"HANGUL JONGSEONG RIEUL-SSANGSIOS"/* 11D6 */, /*4567*/"HANGUL JONGSEONG RIEUL-PANSIOS"/* 11D7 */,/*4568*/"HANGUL JONGSEONG RIEUL-KHIEUKH"/* 11D8 */, /*4569*/"HANGUL JONGSEONG RIEUL-YEORINHIEUH"/* 11D9 */,/*4570*/"HANGUL JONGSEONG MIEUM-KIYEOK"/* 11DA */, /*4571*/"HANGUL JONGSEONG MIEUM-RIEUL"/* 11DB */,/*4572*/"HANGUL JONGSEONG MIEUM-PIEUP"/* 11DC */, /*4573*/"HANGUL JONGSEONG MIEUM-SIOS"/* 11DD */,/*4574*/"HANGUL JONGSEONG MIEUM-SSANGSIOS"/* 11DE */, /*4575*/"HANGUL JONGSEONG MIEUM-PANSIOS"/* 11DF */,/*4576*/"HANGUL JONGSEONG MIEUM-CHIEUCH"/* 11E0 */, /*4577*/"HANGUL JONGSEONG MIEUM-HIEUH"/* 11E1 */,/*4578*/"HANGUL JONGSEONG KAPYEOUNMIEUM"/* 11E2 */, /*4579*/"HANGUL JONGSEONG PIEUP-RIEUL"/* 11E3 */,/*4580*/"HANGUL JONGSEONG PIEUP-PHIEUPH"/* 11E4 */, /*4581*/"HANGUL JONGSEONG PIEUP-HIEUH"/* 11E5 */,/*4582*/"HANGUL JONGSEONG KAPYEOUNPIEUP"/* 11E6 */, /*4583*/"HANGUL JONGSEONG SIOS-KIYEOK"/* 11E7 */,/*4584*/"HANGUL JONGSEONG SIOS-TIKEUT"/* 11E8 */, /*4585*/"HANGUL JONGSEONG SIOS-RIEUL"/* 11E9 */,/*4586*/"HANGUL JONGSEONG SIOS-PIEUP"/* 11EA */, /*4587*/"HANGUL JONGSEONG PANSIOS"/* 11EB */,/*4588*/"HANGUL JONGSEONG IEUNG-KIYEOK"/* 11EC */, /*4589*/"HANGUL JONGSEONG IEUNG-SSANGKIYEOK"/* 11ED */,/*4590*/"HANGUL JONGSEONG SSANGIEUNG"/* 11EE */, /*4591*/"HANGUL JONGSEONG IEUNG-KHIEUKH"/* 11EF */,/*4592*/"HANGUL JONGSEONG YESIEUNG"/* 11F0 */, /*4593*/"HANGUL JONGSEONG YESIEUNG-SIOS"/* 11F1 */,/*4594*/"HANGUL JONGSEONG YESIEUNG-PANSIOS"/* 11F2 */, /*4595*/"HANGUL JONGSEONG PHIEUPH-PIEUP"/* 11F3 */,/*4596*/"HANGUL JONGSEONG KAPYEOUNPHIEUPH"/* 11F4 */, /*4597*/"HANGUL JONGSEONG HIEUH-NIEUN"/* 11F5 */,/*4598*/"HANGUL JONGSEONG HIEUH-RIEUL"/* 11F6 */, /*4599*/"HANGUL JONGSEONG HIEUH-MIEUM"/* 11F7 */,/*4600*/"HANGUL JONGSEONG HIEUH-PIEUP"/* 11F8 */, /*4601*/"HANGUL JONGSEONG YEORINHIEUH"/* 11F9 */,/*4602*/"HANGUL JONGSEONG KIYEOK-NIEUN"/* 11FA */, /*4603*/"HANGUL JONGSEONG KIYEOK-PIEUP"/* 11FB */,/*4604*/"HANGUL JONGSEONG KIYEOK-CHIEUCH"/* 11FC */, /*4605*/"HANGUL JONGSEONG KIYEOK-KHIEUKH"/* 11FD */,/*4606*/"HANGUL JONGSEONG KIYEOK-HIEUH"/* 11FE */, /*4607*/"HANGUL JONGSEONG SSANGNIEUN"/* 11FF */,/*4608*/"ETHIOPIC SYLLABLE HA"/* 1200 */, /*4609*/"ETHIOPIC SYLLABLE HU"/* 1201 */,/*4610*/"ETHIOPIC SYLLABLE HI"/* 1202 */, /*4611*/"ETHIOPIC SYLLABLE HAA"/* 1203 */,/*4612*/"ETHIOPIC SYLLABLE HEE"/* 1204 */, /*4613*/"ETHIOPIC SYLLABLE HE"/* 1205 */,/*4614*/"ETHIOPIC SYLLABLE HO"/* 1206 */, /*4615*/"ETHIOPIC SYLLABLE HOA"/* 1207 */,/*4616*/"ETHIOPIC SYLLABLE LA"/* 1208 */, /*4617*/"ETHIOPIC SYLLABLE LU"/* 1209 */,/*4618*/"ETHIOPIC SYLLABLE LI"/* 120A */, /*4619*/"ETHIOPIC SYLLABLE LAA"/* 120B */,/*4620*/"ETHIOPIC SYLLABLE LEE"/* 120C */, /*4621*/"ETHIOPIC SYLLABLE LE"/* 120D */,/*4622*/"ETHIOPIC SYLLABLE LO"/* 120E */, /*4623*/"ETHIOPIC SYLLABLE LWA"/* 120F */,/*4624*/"ETHIOPIC SYLLABLE HHA"/* 1210 */, /*4625*/"ETHIOPIC SYLLABLE HHU"/* 1211 */,/*4626*/"ETHIOPIC SYLLABLE HHI"/* 1212 */, /*4627*/"ETHIOPIC SYLLABLE HHAA"/* 1213 */,/*4628*/"ETHIOPIC SYLLABLE HHEE"/* 1214 */, /*4629*/"ETHIOPIC SYLLABLE HHE"/* 1215 */,/*4630*/"ETHIOPIC SYLLABLE HHO"/* 1216 */, /*4631*/"ETHIOPIC SYLLABLE HHWA"/* 1217 */,/*4632*/"ETHIOPIC SYLLABLE MA"/* 1218 */, /*4633*/"ETHIOPIC SYLLABLE MU"/* 1219 */,/*4634*/"ETHIOPIC SYLLABLE MI"/* 121A */, /*4635*/"ETHIOPIC SYLLABLE MAA"/* 121B */,/*4636*/"ETHIOPIC SYLLABLE MEE"/* 121C */, /*4637*/"ETHIOPIC SYLLABLE ME"/* 121D */,/*4638*/"ETHIOPIC SYLLABLE MO"/* 121E */, /*4639*/"ETHIOPIC SYLLABLE MWA"/* 121F */,/*4640*/"ETHIOPIC SYLLABLE SZA"/* 1220 */, /*4641*/"ETHIOPIC SYLLABLE SZU"/* 1221 */,/*4642*/"ETHIOPIC SYLLABLE SZI"/* 1222 */, /*4643*/"ETHIOPIC SYLLABLE SZAA"/* 1223 */,/*4644*/"ETHIOPIC SYLLABLE SZEE"/* 1224 */, /*4645*/"ETHIOPIC SYLLABLE SZE"/* 1225 */,/*4646*/"ETHIOPIC SYLLABLE SZO"/* 1226 */, /*4647*/"ETHIOPIC SYLLABLE SZWA"/* 1227 */,/*4648*/"ETHIOPIC SYLLABLE RA"/* 1228 */, /*4649*/"ETHIOPIC SYLLABLE RU"/* 1229 */,/*4650*/"ETHIOPIC SYLLABLE RI"/* 122A */, /*4651*/"ETHIOPIC SYLLABLE RAA"/* 122B */,/*4652*/"ETHIOPIC SYLLABLE REE"/* 122C */, /*4653*/"ETHIOPIC SYLLABLE RE"/* 122D */,/*4654*/"ETHIOPIC SYLLABLE RO"/* 122E */, /*4655*/"ETHIOPIC SYLLABLE RWA"/* 122F */,/*4656*/"ETHIOPIC SYLLABLE SA"/* 1230 */, /*4657*/"ETHIOPIC SYLLABLE SU"/* 1231 */,/*4658*/"ETHIOPIC SYLLABLE SI"/* 1232 */, /*4659*/"ETHIOPIC SYLLABLE SAA"/* 1233 */,/*4660*/"ETHIOPIC SYLLABLE SEE"/* 1234 */, /*4661*/"ETHIOPIC SYLLABLE SE"/* 1235 */,/*4662*/"ETHIOPIC SYLLABLE SO"/* 1236 */, /*4663*/"ETHIOPIC SYLLABLE SWA"/* 1237 */,/*4664*/"ETHIOPIC SYLLABLE SHA"/* 1238 */, /*4665*/"ETHIOPIC SYLLABLE SHU"/* 1239 */,/*4666*/"ETHIOPIC SYLLABLE SHI"/* 123A */, /*4667*/"ETHIOPIC SYLLABLE SHAA"/* 123B */,/*4668*/"ETHIOPIC SYLLABLE SHEE"/* 123C */, /*4669*/"ETHIOPIC SYLLABLE SHE"/* 123D */,/*4670*/"ETHIOPIC SYLLABLE SHO"/* 123E */, /*4671*/"ETHIOPIC SYLLABLE SHWA"/* 123F */,/*4672*/"ETHIOPIC SYLLABLE QA"/* 1240 */, /*4673*/"ETHIOPIC SYLLABLE QU"/* 1241 */,/*4674*/"ETHIOPIC SYLLABLE QI"/* 1242 */, /*4675*/"ETHIOPIC SYLLABLE QAA"/* 1243 */,/*4676*/"ETHIOPIC SYLLABLE QEE"/* 1244 */, /*4677*/"ETHIOPIC SYLLABLE QE"/* 1245 */,/*4678*/"ETHIOPIC SYLLABLE QO"/* 1246 */, /*4679*/"ETHIOPIC SYLLABLE QOA"/* 1247 */,/*4680*/"ETHIOPIC SYLLABLE QWA"/* 1248 */,NULL, /*4682*/"ETHIOPIC SYLLABLE QWI"/* 124A */,/*4683*/"ETHIOPIC SYLLABLE QWAA"/* 124B */, /*4684*/"ETHIOPIC SYLLABLE QWEE"/* 124C */,/*4685*/"ETHIOPIC SYLLABLE QWE"/* 124D */,NULL,NULL, /*4688*/"ETHIOPIC SYLLABLE QHA"/* 1250 */,/*4689*/"ETHIOPIC SYLLABLE QHU"/* 1251 */, /*4690*/"ETHIOPIC SYLLABLE QHI"/* 1252 */,/*4691*/"ETHIOPIC SYLLABLE QHAA"/* 1253 */, /*4692*/"ETHIOPIC SYLLABLE QHEE"/* 1254 */,/*4693*/"ETHIOPIC SYLLABLE QHE"/* 1255 */, /*4694*/"ETHIOPIC SYLLABLE QHO"/* 1256 */,NULL,/*4696*/"ETHIOPIC SYLLABLE QHWA"/* 1258 */,NULL, /*4698*/"ETHIOPIC SYLLABLE QHWI"/* 125A */,/*4699*/"ETHIOPIC SYLLABLE QHWAA"/* 125B */, /*4700*/"ETHIOPIC SYLLABLE QHWEE"/* 125C */,/*4701*/"ETHIOPIC SYLLABLE QHWE"/* 125D */,NULL,NULL, /*4704*/"ETHIOPIC SYLLABLE BA"/* 1260 */,/*4705*/"ETHIOPIC SYLLABLE BU"/* 1261 */, /*4706*/"ETHIOPIC SYLLABLE BI"/* 1262 */,/*4707*/"ETHIOPIC SYLLABLE BAA"/* 1263 */, /*4708*/"ETHIOPIC SYLLABLE BEE"/* 1264 */,/*4709*/"ETHIOPIC SYLLABLE BE"/* 1265 */, /*4710*/"ETHIOPIC SYLLABLE BO"/* 1266 */,/*4711*/"ETHIOPIC SYLLABLE BWA"/* 1267 */, /*4712*/"ETHIOPIC SYLLABLE VA"/* 1268 */,/*4713*/"ETHIOPIC SYLLABLE VU"/* 1269 */, /*4714*/"ETHIOPIC SYLLABLE VI"/* 126A */,/*4715*/"ETHIOPIC SYLLABLE VAA"/* 126B */, /*4716*/"ETHIOPIC SYLLABLE VEE"/* 126C */,/*4717*/"ETHIOPIC SYLLABLE VE"/* 126D */, /*4718*/"ETHIOPIC SYLLABLE VO"/* 126E */,/*4719*/"ETHIOPIC SYLLABLE VWA"/* 126F */, /*4720*/"ETHIOPIC SYLLABLE TA"/* 1270 */,/*4721*/"ETHIOPIC SYLLABLE TU"/* 1271 */, /*4722*/"ETHIOPIC SYLLABLE TI"/* 1272 */,/*4723*/"ETHIOPIC SYLLABLE TAA"/* 1273 */, /*4724*/"ETHIOPIC SYLLABLE TEE"/* 1274 */,/*4725*/"ETHIOPIC SYLLABLE TE"/* 1275 */, /*4726*/"ETHIOPIC SYLLABLE TO"/* 1276 */,/*4727*/"ETHIOPIC SYLLABLE TWA"/* 1277 */, /*4728*/"ETHIOPIC SYLLABLE CA"/* 1278 */,/*4729*/"ETHIOPIC SYLLABLE CU"/* 1279 */, /*4730*/"ETHIOPIC SYLLABLE CI"/* 127A */,/*4731*/"ETHIOPIC SYLLABLE CAA"/* 127B */, /*4732*/"ETHIOPIC SYLLABLE CEE"/* 127C */,/*4733*/"ETHIOPIC SYLLABLE CE"/* 127D */, /*4734*/"ETHIOPIC SYLLABLE CO"/* 127E */,/*4735*/"ETHIOPIC SYLLABLE CWA"/* 127F */, /*4736*/"ETHIOPIC SYLLABLE XA"/* 1280 */,/*4737*/"ETHIOPIC SYLLABLE XU"/* 1281 */, /*4738*/"ETHIOPIC SYLLABLE XI"/* 1282 */,/*4739*/"ETHIOPIC SYLLABLE XAA"/* 1283 */, /*4740*/"ETHIOPIC SYLLABLE XEE"/* 1284 */,/*4741*/"ETHIOPIC SYLLABLE XE"/* 1285 */, /*4742*/"ETHIOPIC SYLLABLE XO"/* 1286 */,/*4743*/"ETHIOPIC SYLLABLE XOA"/* 1287 */, /*4744*/"ETHIOPIC SYLLABLE XWA"/* 1288 */,NULL,/*4746*/"ETHIOPIC SYLLABLE XWI"/* 128A */, /*4747*/"ETHIOPIC SYLLABLE XWAA"/* 128B */,/*4748*/"ETHIOPIC SYLLABLE XWEE"/* 128C */, /*4749*/"ETHIOPIC SYLLABLE XWE"/* 128D */,NULL,NULL,/*4752*/"ETHIOPIC SYLLABLE NA"/* 1290 */, /*4753*/"ETHIOPIC SYLLABLE NU"/* 1291 */,/*4754*/"ETHIOPIC SYLLABLE NI"/* 1292 */, /*4755*/"ETHIOPIC SYLLABLE NAA"/* 1293 */,/*4756*/"ETHIOPIC SYLLABLE NEE"/* 1294 */, /*4757*/"ETHIOPIC SYLLABLE NE"/* 1295 */,/*4758*/"ETHIOPIC SYLLABLE NO"/* 1296 */, /*4759*/"ETHIOPIC SYLLABLE NWA"/* 1297 */,/*4760*/"ETHIOPIC SYLLABLE NYA"/* 1298 */, /*4761*/"ETHIOPIC SYLLABLE NYU"/* 1299 */,/*4762*/"ETHIOPIC SYLLABLE NYI"/* 129A */, /*4763*/"ETHIOPIC SYLLABLE NYAA"/* 129B */,/*4764*/"ETHIOPIC SYLLABLE NYEE"/* 129C */, /*4765*/"ETHIOPIC SYLLABLE NYE"/* 129D */,/*4766*/"ETHIOPIC SYLLABLE NYO"/* 129E */, /*4767*/"ETHIOPIC SYLLABLE NYWA"/* 129F */,/*4768*/"ETHIOPIC SYLLABLE GLOTTAL A"/* 12A0 */, /*4769*/"ETHIOPIC SYLLABLE GLOTTAL U"/* 12A1 */,/*4770*/"ETHIOPIC SYLLABLE GLOTTAL I"/* 12A2 */, /*4771*/"ETHIOPIC SYLLABLE GLOTTAL AA"/* 12A3 */,/*4772*/"ETHIOPIC SYLLABLE GLOTTAL EE"/* 12A4 */, /*4773*/"ETHIOPIC SYLLABLE GLOTTAL E"/* 12A5 */,/*4774*/"ETHIOPIC SYLLABLE GLOTTAL O"/* 12A6 */, /*4775*/"ETHIOPIC SYLLABLE GLOTTAL WA"/* 12A7 */,/*4776*/"ETHIOPIC SYLLABLE KA"/* 12A8 */, /*4777*/"ETHIOPIC SYLLABLE KU"/* 12A9 */,/*4778*/"ETHIOPIC SYLLABLE KI"/* 12AA */, /*4779*/"ETHIOPIC SYLLABLE KAA"/* 12AB */,/*4780*/"ETHIOPIC SYLLABLE KEE"/* 12AC */, /*4781*/"ETHIOPIC SYLLABLE KE"/* 12AD */,/*4782*/"ETHIOPIC SYLLABLE KO"/* 12AE */, /*4783*/"ETHIOPIC SYLLABLE KOA"/* 12AF */,/*4784*/"ETHIOPIC SYLLABLE KWA"/* 12B0 */,NULL, /*4786*/"ETHIOPIC SYLLABLE KWI"/* 12B2 */,/*4787*/"ETHIOPIC SYLLABLE KWAA"/* 12B3 */, /*4788*/"ETHIOPIC SYLLABLE KWEE"/* 12B4 */,/*4789*/"ETHIOPIC SYLLABLE KWE"/* 12B5 */,NULL,NULL, /*4792*/"ETHIOPIC SYLLABLE KXA"/* 12B8 */,/*4793*/"ETHIOPIC SYLLABLE KXU"/* 12B9 */, /*4794*/"ETHIOPIC SYLLABLE KXI"/* 12BA */,/*4795*/"ETHIOPIC SYLLABLE KXAA"/* 12BB */, /*4796*/"ETHIOPIC SYLLABLE KXEE"/* 12BC */,/*4797*/"ETHIOPIC SYLLABLE KXE"/* 12BD */, /*4798*/"ETHIOPIC SYLLABLE KXO"/* 12BE */,NULL,/*4800*/"ETHIOPIC SYLLABLE KXWA"/* 12C0 */,NULL, /*4802*/"ETHIOPIC SYLLABLE KXWI"/* 12C2 */,/*4803*/"ETHIOPIC SYLLABLE KXWAA"/* 12C3 */, /*4804*/"ETHIOPIC SYLLABLE KXWEE"/* 12C4 */,/*4805*/"ETHIOPIC SYLLABLE KXWE"/* 12C5 */,NULL,NULL, /*4808*/"ETHIOPIC SYLLABLE WA"/* 12C8 */,/*4809*/"ETHIOPIC SYLLABLE WU"/* 12C9 */, /*4810*/"ETHIOPIC SYLLABLE WI"/* 12CA */,/*4811*/"ETHIOPIC SYLLABLE WAA"/* 12CB */, /*4812*/"ETHIOPIC SYLLABLE WEE"/* 12CC */,/*4813*/"ETHIOPIC SYLLABLE WE"/* 12CD */, /*4814*/"ETHIOPIC SYLLABLE WO"/* 12CE */,/*4815*/"ETHIOPIC SYLLABLE WOA"/* 12CF */, /*4816*/"ETHIOPIC SYLLABLE PHARYNGEAL A"/* 12D0 */,/*4817*/"ETHIOPIC SYLLABLE PHARYNGEAL U"/* 12D1 */, /*4818*/"ETHIOPIC SYLLABLE PHARYNGEAL I"/* 12D2 */,/*4819*/"ETHIOPIC SYLLABLE PHARYNGEAL AA"/* 12D3 */, /*4820*/"ETHIOPIC SYLLABLE PHARYNGEAL EE"/* 12D4 */,/*4821*/"ETHIOPIC SYLLABLE PHARYNGEAL E"/* 12D5 */, /*4822*/"ETHIOPIC SYLLABLE PHARYNGEAL O"/* 12D6 */,NULL,/*4824*/"ETHIOPIC SYLLABLE ZA"/* 12D8 */, /*4825*/"ETHIOPIC SYLLABLE ZU"/* 12D9 */,/*4826*/"ETHIOPIC SYLLABLE ZI"/* 12DA */, /*4827*/"ETHIOPIC SYLLABLE ZAA"/* 12DB */,/*4828*/"ETHIOPIC SYLLABLE ZEE"/* 12DC */, /*4829*/"ETHIOPIC SYLLABLE ZE"/* 12DD */,/*4830*/"ETHIOPIC SYLLABLE ZO"/* 12DE */, /*4831*/"ETHIOPIC SYLLABLE ZWA"/* 12DF */,/*4832*/"ETHIOPIC SYLLABLE ZHA"/* 12E0 */, /*4833*/"ETHIOPIC SYLLABLE ZHU"/* 12E1 */,/*4834*/"ETHIOPIC SYLLABLE ZHI"/* 12E2 */, /*4835*/"ETHIOPIC SYLLABLE ZHAA"/* 12E3 */,/*4836*/"ETHIOPIC SYLLABLE ZHEE"/* 12E4 */, /*4837*/"ETHIOPIC SYLLABLE ZHE"/* 12E5 */,/*4838*/"ETHIOPIC SYLLABLE ZHO"/* 12E6 */, /*4839*/"ETHIOPIC SYLLABLE ZHWA"/* 12E7 */,/*4840*/"ETHIOPIC SYLLABLE YA"/* 12E8 */, /*4841*/"ETHIOPIC SYLLABLE YU"/* 12E9 */,/*4842*/"ETHIOPIC SYLLABLE YI"/* 12EA */, /*4843*/"ETHIOPIC SYLLABLE YAA"/* 12EB */,/*4844*/"ETHIOPIC SYLLABLE YEE"/* 12EC */, /*4845*/"ETHIOPIC SYLLABLE YE"/* 12ED */,/*4846*/"ETHIOPIC SYLLABLE YO"/* 12EE */, /*4847*/"ETHIOPIC SYLLABLE YOA"/* 12EF */,/*4848*/"ETHIOPIC SYLLABLE DA"/* 12F0 */, /*4849*/"ETHIOPIC SYLLABLE DU"/* 12F1 */,/*4850*/"ETHIOPIC SYLLABLE DI"/* 12F2 */, /*4851*/"ETHIOPIC SYLLABLE DAA"/* 12F3 */,/*4852*/"ETHIOPIC SYLLABLE DEE"/* 12F4 */, /*4853*/"ETHIOPIC SYLLABLE DE"/* 12F5 */,/*4854*/"ETHIOPIC SYLLABLE DO"/* 12F6 */, /*4855*/"ETHIOPIC SYLLABLE DWA"/* 12F7 */,/*4856*/"ETHIOPIC SYLLABLE DDA"/* 12F8 */, /*4857*/"ETHIOPIC SYLLABLE DDU"/* 12F9 */,/*4858*/"ETHIOPIC SYLLABLE DDI"/* 12FA */, /*4859*/"ETHIOPIC SYLLABLE DDAA"/* 12FB */,/*4860*/"ETHIOPIC SYLLABLE DDEE"/* 12FC */, /*4861*/"ETHIOPIC SYLLABLE DDE"/* 12FD */,/*4862*/"ETHIOPIC SYLLABLE DDO"/* 12FE */, /*4863*/"ETHIOPIC SYLLABLE DDWA"/* 12FF */,/*4864*/"ETHIOPIC SYLLABLE JA"/* 1300 */, /*4865*/"ETHIOPIC SYLLABLE JU"/* 1301 */,/*4866*/"ETHIOPIC SYLLABLE JI"/* 1302 */, /*4867*/"ETHIOPIC SYLLABLE JAA"/* 1303 */,/*4868*/"ETHIOPIC SYLLABLE JEE"/* 1304 */, /*4869*/"ETHIOPIC SYLLABLE JE"/* 1305 */,/*4870*/"ETHIOPIC SYLLABLE JO"/* 1306 */, /*4871*/"ETHIOPIC SYLLABLE JWA"/* 1307 */,/*4872*/"ETHIOPIC SYLLABLE GA"/* 1308 */, /*4873*/"ETHIOPIC SYLLABLE GU"/* 1309 */,/*4874*/"ETHIOPIC SYLLABLE GI"/* 130A */, /*4875*/"ETHIOPIC SYLLABLE GAA"/* 130B */,/*4876*/"ETHIOPIC SYLLABLE GEE"/* 130C */, /*4877*/"ETHIOPIC SYLLABLE GE"/* 130D */,/*4878*/"ETHIOPIC SYLLABLE GO"/* 130E */, /*4879*/"ETHIOPIC SYLLABLE GOA"/* 130F */,/*4880*/"ETHIOPIC SYLLABLE GWA"/* 1310 */,NULL, /*4882*/"ETHIOPIC SYLLABLE GWI"/* 1312 */,/*4883*/"ETHIOPIC SYLLABLE GWAA"/* 1313 */, /*4884*/"ETHIOPIC SYLLABLE GWEE"/* 1314 */,/*4885*/"ETHIOPIC SYLLABLE GWE"/* 1315 */,NULL,NULL, /*4888*/"ETHIOPIC SYLLABLE GGA"/* 1318 */,/*4889*/"ETHIOPIC SYLLABLE GGU"/* 1319 */, /*4890*/"ETHIOPIC SYLLABLE GGI"/* 131A */,/*4891*/"ETHIOPIC SYLLABLE GGAA"/* 131B */, /*4892*/"ETHIOPIC SYLLABLE GGEE"/* 131C */,/*4893*/"ETHIOPIC SYLLABLE GGE"/* 131D */, /*4894*/"ETHIOPIC SYLLABLE GGO"/* 131E */,/*4895*/"ETHIOPIC SYLLABLE GGWAA"/* 131F */, /*4896*/"ETHIOPIC SYLLABLE THA"/* 1320 */,/*4897*/"ETHIOPIC SYLLABLE THU"/* 1321 */, /*4898*/"ETHIOPIC SYLLABLE THI"/* 1322 */,/*4899*/"ETHIOPIC SYLLABLE THAA"/* 1323 */, /*4900*/"ETHIOPIC SYLLABLE THEE"/* 1324 */,/*4901*/"ETHIOPIC SYLLABLE THE"/* 1325 */, /*4902*/"ETHIOPIC SYLLABLE THO"/* 1326 */,/*4903*/"ETHIOPIC SYLLABLE THWA"/* 1327 */, /*4904*/"ETHIOPIC SYLLABLE CHA"/* 1328 */,/*4905*/"ETHIOPIC SYLLABLE CHU"/* 1329 */, /*4906*/"ETHIOPIC SYLLABLE CHI"/* 132A */,/*4907*/"ETHIOPIC SYLLABLE CHAA"/* 132B */, /*4908*/"ETHIOPIC SYLLABLE CHEE"/* 132C */,/*4909*/"ETHIOPIC SYLLABLE CHE"/* 132D */, /*4910*/"ETHIOPIC SYLLABLE CHO"/* 132E */,/*4911*/"ETHIOPIC SYLLABLE CHWA"/* 132F */, /*4912*/"ETHIOPIC SYLLABLE PHA"/* 1330 */,/*4913*/"ETHIOPIC SYLLABLE PHU"/* 1331 */, /*4914*/"ETHIOPIC SYLLABLE PHI"/* 1332 */,/*4915*/"ETHIOPIC SYLLABLE PHAA"/* 1333 */, /*4916*/"ETHIOPIC SYLLABLE PHEE"/* 1334 */,/*4917*/"ETHIOPIC SYLLABLE PHE"/* 1335 */, /*4918*/"ETHIOPIC SYLLABLE PHO"/* 1336 */,/*4919*/"ETHIOPIC SYLLABLE PHWA"/* 1337 */, /*4920*/"ETHIOPIC SYLLABLE TSA"/* 1338 */,/*4921*/"ETHIOPIC SYLLABLE TSU"/* 1339 */, /*4922*/"ETHIOPIC SYLLABLE TSI"/* 133A */,/*4923*/"ETHIOPIC SYLLABLE TSAA"/* 133B */, /*4924*/"ETHIOPIC SYLLABLE TSEE"/* 133C */,/*4925*/"ETHIOPIC SYLLABLE TSE"/* 133D */, /*4926*/"ETHIOPIC SYLLABLE TSO"/* 133E */,/*4927*/"ETHIOPIC SYLLABLE TSWA"/* 133F */, /*4928*/"ETHIOPIC SYLLABLE TZA"/* 1340 */,/*4929*/"ETHIOPIC SYLLABLE TZU"/* 1341 */, /*4930*/"ETHIOPIC SYLLABLE TZI"/* 1342 */,/*4931*/"ETHIOPIC SYLLABLE TZAA"/* 1343 */, /*4932*/"ETHIOPIC SYLLABLE TZEE"/* 1344 */,/*4933*/"ETHIOPIC SYLLABLE TZE"/* 1345 */, /*4934*/"ETHIOPIC SYLLABLE TZO"/* 1346 */,/*4935*/"ETHIOPIC SYLLABLE TZOA"/* 1347 */, /*4936*/"ETHIOPIC SYLLABLE FA"/* 1348 */,/*4937*/"ETHIOPIC SYLLABLE FU"/* 1349 */, /*4938*/"ETHIOPIC SYLLABLE FI"/* 134A */,/*4939*/"ETHIOPIC SYLLABLE FAA"/* 134B */, /*4940*/"ETHIOPIC SYLLABLE FEE"/* 134C */,/*4941*/"ETHIOPIC SYLLABLE FE"/* 134D */, /*4942*/"ETHIOPIC SYLLABLE FO"/* 134E */,/*4943*/"ETHIOPIC SYLLABLE FWA"/* 134F */, /*4944*/"ETHIOPIC SYLLABLE PA"/* 1350 */,/*4945*/"ETHIOPIC SYLLABLE PU"/* 1351 */, /*4946*/"ETHIOPIC SYLLABLE PI"/* 1352 */,/*4947*/"ETHIOPIC SYLLABLE PAA"/* 1353 */, /*4948*/"ETHIOPIC SYLLABLE PEE"/* 1354 */,/*4949*/"ETHIOPIC SYLLABLE PE"/* 1355 */, /*4950*/"ETHIOPIC SYLLABLE PO"/* 1356 */,/*4951*/"ETHIOPIC SYLLABLE PWA"/* 1357 */, /*4952*/"ETHIOPIC SYLLABLE RYA"/* 1358 */,/*4953*/"ETHIOPIC SYLLABLE MYA"/* 1359 */, /*4954*/"ETHIOPIC SYLLABLE FYA"/* 135A */,NULL,NULL, /*4957*/"ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK"/* 135D */, /*4958*/"ETHIOPIC COMBINING VOWEL LENGTH MARK"/* 135E */,/*4959*/"ETHIOPIC COMBINING GEMINATION MARK"/* 135F */, /*4960*/"ETHIOPIC SECTION MARK"/* 1360 */,/*4961*/"ETHIOPIC WORDSPACE"/* 1361 */,/*4962*/"ETHIOPIC FULL STOP"/* 1362 */, /*4963*/"ETHIOPIC COMMA"/* 1363 */,/*4964*/"ETHIOPIC SEMICOLON"/* 1364 */,/*4965*/"ETHIOPIC COLON"/* 1365 */, /*4966*/"ETHIOPIC PREFACE COLON"/* 1366 */,/*4967*/"ETHIOPIC QUESTION MARK"/* 1367 */, /*4968*/"ETHIOPIC PARAGRAPH SEPARATOR"/* 1368 */,/*4969*/"ETHIOPIC DIGIT ONE"/* 1369 */, /*4970*/"ETHIOPIC DIGIT TWO"/* 136A */,/*4971*/"ETHIOPIC DIGIT THREE"/* 136B */,/*4972*/"ETHIOPIC DIGIT FOUR"/* 136C */, /*4973*/"ETHIOPIC DIGIT FIVE"/* 136D */,/*4974*/"ETHIOPIC DIGIT SIX"/* 136E */,/*4975*/"ETHIOPIC DIGIT SEVEN"/* 136F */, /*4976*/"ETHIOPIC DIGIT EIGHT"/* 1370 */,/*4977*/"ETHIOPIC DIGIT NINE"/* 1371 */,/*4978*/"ETHIOPIC NUMBER TEN"/* 1372 */, /*4979*/"ETHIOPIC NUMBER TWENTY"/* 1373 */,/*4980*/"ETHIOPIC NUMBER THIRTY"/* 1374 */, /*4981*/"ETHIOPIC NUMBER FORTY"/* 1375 */,/*4982*/"ETHIOPIC NUMBER FIFTY"/* 1376 */, /*4983*/"ETHIOPIC NUMBER SIXTY"/* 1377 */,/*4984*/"ETHIOPIC NUMBER SEVENTY"/* 1378 */, /*4985*/"ETHIOPIC NUMBER EIGHTY"/* 1379 */,/*4986*/"ETHIOPIC NUMBER NINETY"/* 137A */, /*4987*/"ETHIOPIC NUMBER HUNDRED"/* 137B */,/*4988*/"ETHIOPIC NUMBER TEN THOUSAND"/* 137C */,NULL,NULL,NULL, /*4992*/"ETHIOPIC SYLLABLE SEBATBEIT MWA"/* 1380 */,/*4993*/"ETHIOPIC SYLLABLE MWI"/* 1381 */, /*4994*/"ETHIOPIC SYLLABLE MWEE"/* 1382 */,/*4995*/"ETHIOPIC SYLLABLE MWE"/* 1383 */, /*4996*/"ETHIOPIC SYLLABLE SEBATBEIT BWA"/* 1384 */,/*4997*/"ETHIOPIC SYLLABLE BWI"/* 1385 */, /*4998*/"ETHIOPIC SYLLABLE BWEE"/* 1386 */,/*4999*/"ETHIOPIC SYLLABLE BWE"/* 1387 */, /*5000*/"ETHIOPIC SYLLABLE SEBATBEIT FWA"/* 1388 */,/*5001*/"ETHIOPIC SYLLABLE FWI"/* 1389 */, /*5002*/"ETHIOPIC SYLLABLE FWEE"/* 138A */,/*5003*/"ETHIOPIC SYLLABLE FWE"/* 138B */, /*5004*/"ETHIOPIC SYLLABLE SEBATBEIT PWA"/* 138C */,/*5005*/"ETHIOPIC SYLLABLE PWI"/* 138D */, /*5006*/"ETHIOPIC SYLLABLE PWEE"/* 138E */,/*5007*/"ETHIOPIC SYLLABLE PWE"/* 138F */, /*5008*/"ETHIOPIC TONAL MARK YIZET"/* 1390 */,/*5009*/"ETHIOPIC TONAL MARK DERET"/* 1391 */, /*5010*/"ETHIOPIC TONAL MARK RIKRIK"/* 1392 */,/*5011*/"ETHIOPIC TONAL MARK SHORT RIKRIK"/* 1393 */, /*5012*/"ETHIOPIC TONAL MARK DIFAT"/* 1394 */,/*5013*/"ETHIOPIC TONAL MARK KENAT"/* 1395 */, /*5014*/"ETHIOPIC TONAL MARK CHIRET"/* 1396 */,/*5015*/"ETHIOPIC TONAL MARK HIDET"/* 1397 */, /*5016*/"ETHIOPIC TONAL MARK DERET-HIDET"/* 1398 */,/*5017*/"ETHIOPIC TONAL MARK KURT"/* 1399 */,NULL,NULL,NULL,NULL, NULL,NULL,/*5024*/"CHEROKEE LETTER A"/* 13A0 */,/*5025*/"CHEROKEE LETTER E"/* 13A1 */, /*5026*/"CHEROKEE LETTER I"/* 13A2 */,/*5027*/"CHEROKEE LETTER O"/* 13A3 */,/*5028*/"CHEROKEE LETTER U"/* 13A4 */, /*5029*/"CHEROKEE LETTER V"/* 13A5 */,/*5030*/"CHEROKEE LETTER GA"/* 13A6 */,/*5031*/"CHEROKEE LETTER KA"/* 13A7 */, /*5032*/"CHEROKEE LETTER GE"/* 13A8 */,/*5033*/"CHEROKEE LETTER GI"/* 13A9 */,/*5034*/"CHEROKEE LETTER GO"/* 13AA */, /*5035*/"CHEROKEE LETTER GU"/* 13AB */,/*5036*/"CHEROKEE LETTER GV"/* 13AC */,/*5037*/"CHEROKEE LETTER HA"/* 13AD */, /*5038*/"CHEROKEE LETTER HE"/* 13AE */,/*5039*/"CHEROKEE LETTER HI"/* 13AF */,/*5040*/"CHEROKEE LETTER HO"/* 13B0 */, /*5041*/"CHEROKEE LETTER HU"/* 13B1 */,/*5042*/"CHEROKEE LETTER HV"/* 13B2 */,/*5043*/"CHEROKEE LETTER LA"/* 13B3 */, /*5044*/"CHEROKEE LETTER LE"/* 13B4 */,/*5045*/"CHEROKEE LETTER LI"/* 13B5 */,/*5046*/"CHEROKEE LETTER LO"/* 13B6 */, /*5047*/"CHEROKEE LETTER LU"/* 13B7 */,/*5048*/"CHEROKEE LETTER LV"/* 13B8 */,/*5049*/"CHEROKEE LETTER MA"/* 13B9 */, /*5050*/"CHEROKEE LETTER ME"/* 13BA */,/*5051*/"CHEROKEE LETTER MI"/* 13BB */,/*5052*/"CHEROKEE LETTER MO"/* 13BC */, /*5053*/"CHEROKEE LETTER MU"/* 13BD */,/*5054*/"CHEROKEE LETTER NA"/* 13BE */,/*5055*/"CHEROKEE LETTER HNA"/* 13BF */, /*5056*/"CHEROKEE LETTER NAH"/* 13C0 */,/*5057*/"CHEROKEE LETTER NE"/* 13C1 */,/*5058*/"CHEROKEE LETTER NI"/* 13C2 */, /*5059*/"CHEROKEE LETTER NO"/* 13C3 */,/*5060*/"CHEROKEE LETTER NU"/* 13C4 */,/*5061*/"CHEROKEE LETTER NV"/* 13C5 */, /*5062*/"CHEROKEE LETTER QUA"/* 13C6 */,/*5063*/"CHEROKEE LETTER QUE"/* 13C7 */,/*5064*/"CHEROKEE LETTER QUI"/* 13C8 */, /*5065*/"CHEROKEE LETTER QUO"/* 13C9 */,/*5066*/"CHEROKEE LETTER QUU"/* 13CA */,/*5067*/"CHEROKEE LETTER QUV"/* 13CB */, /*5068*/"CHEROKEE LETTER SA"/* 13CC */,/*5069*/"CHEROKEE LETTER S"/* 13CD */,/*5070*/"CHEROKEE LETTER SE"/* 13CE */, /*5071*/"CHEROKEE LETTER SI"/* 13CF */,/*5072*/"CHEROKEE LETTER SO"/* 13D0 */,/*5073*/"CHEROKEE LETTER SU"/* 13D1 */, /*5074*/"CHEROKEE LETTER SV"/* 13D2 */,/*5075*/"CHEROKEE LETTER DA"/* 13D3 */,/*5076*/"CHEROKEE LETTER TA"/* 13D4 */, /*5077*/"CHEROKEE LETTER DE"/* 13D5 */,/*5078*/"CHEROKEE LETTER TE"/* 13D6 */,/*5079*/"CHEROKEE LETTER DI"/* 13D7 */, /*5080*/"CHEROKEE LETTER TI"/* 13D8 */,/*5081*/"CHEROKEE LETTER DO"/* 13D9 */,/*5082*/"CHEROKEE LETTER DU"/* 13DA */, /*5083*/"CHEROKEE LETTER DV"/* 13DB */,/*5084*/"CHEROKEE LETTER DLA"/* 13DC */,/*5085*/"CHEROKEE LETTER TLA"/* 13DD */, /*5086*/"CHEROKEE LETTER TLE"/* 13DE */,/*5087*/"CHEROKEE LETTER TLI"/* 13DF */,/*5088*/"CHEROKEE LETTER TLO"/* 13E0 */, /*5089*/"CHEROKEE LETTER TLU"/* 13E1 */,/*5090*/"CHEROKEE LETTER TLV"/* 13E2 */,/*5091*/"CHEROKEE LETTER TSA"/* 13E3 */, /*5092*/"CHEROKEE LETTER TSE"/* 13E4 */,/*5093*/"CHEROKEE LETTER TSI"/* 13E5 */,/*5094*/"CHEROKEE LETTER TSO"/* 13E6 */, /*5095*/"CHEROKEE LETTER TSU"/* 13E7 */,/*5096*/"CHEROKEE LETTER TSV"/* 13E8 */,/*5097*/"CHEROKEE LETTER WA"/* 13E9 */, /*5098*/"CHEROKEE LETTER WE"/* 13EA */,/*5099*/"CHEROKEE LETTER WI"/* 13EB */,/*5100*/"CHEROKEE LETTER WO"/* 13EC */, /*5101*/"CHEROKEE LETTER WU"/* 13ED */,/*5102*/"CHEROKEE LETTER WV"/* 13EE */,/*5103*/"CHEROKEE LETTER YA"/* 13EF */, /*5104*/"CHEROKEE LETTER YE"/* 13F0 */,/*5105*/"CHEROKEE LETTER YI"/* 13F1 */,/*5106*/"CHEROKEE LETTER YO"/* 13F2 */, /*5107*/"CHEROKEE LETTER YU"/* 13F3 */,/*5108*/"CHEROKEE LETTER YV"/* 13F4 */,/*5109*/"CHEROKEE LETTER MV"/* 13F5 */, NULL,NULL,/*5112*/"CHEROKEE SMALL LETTER YE"/* 13F8 */,/*5113*/"CHEROKEE SMALL LETTER YI"/* 13F9 */, /*5114*/"CHEROKEE SMALL LETTER YO"/* 13FA */,/*5115*/"CHEROKEE SMALL LETTER YU"/* 13FB */, /*5116*/"CHEROKEE SMALL LETTER YV"/* 13FC */,/*5117*/"CHEROKEE SMALL LETTER MV"/* 13FD */,NULL,NULL, /*5120*/"CANADIAN SYLLABICS HYPHEN"/* 1400 */,/*5121*/"CANADIAN SYLLABICS E"/* 1401 */, /*5122*/"CANADIAN SYLLABICS AAI"/* 1402 */,/*5123*/"CANADIAN SYLLABICS I"/* 1403 */, /*5124*/"CANADIAN SYLLABICS II"/* 1404 */,/*5125*/"CANADIAN SYLLABICS O"/* 1405 */, /*5126*/"CANADIAN SYLLABICS OO"/* 1406 */,/*5127*/"CANADIAN SYLLABICS Y-CREE OO"/* 1407 */, /*5128*/"CANADIAN SYLLABICS CARRIER EE"/* 1408 */,/*5129*/"CANADIAN SYLLABICS CARRIER I"/* 1409 */, /*5130*/"CANADIAN SYLLABICS A"/* 140A */,/*5131*/"CANADIAN SYLLABICS AA"/* 140B */, /*5132*/"CANADIAN SYLLABICS WE"/* 140C */,/*5133*/"CANADIAN SYLLABICS WEST-CREE WE"/* 140D */, /*5134*/"CANADIAN SYLLABICS WI"/* 140E */,/*5135*/"CANADIAN SYLLABICS WEST-CREE WI"/* 140F */, /*5136*/"CANADIAN SYLLABICS WII"/* 1410 */,/*5137*/"CANADIAN SYLLABICS WEST-CREE WII"/* 1411 */, /*5138*/"CANADIAN SYLLABICS WO"/* 1412 */,/*5139*/"CANADIAN SYLLABICS WEST-CREE WO"/* 1413 */, /*5140*/"CANADIAN SYLLABICS WOO"/* 1414 */,/*5141*/"CANADIAN SYLLABICS WEST-CREE WOO"/* 1415 */, /*5142*/"CANADIAN SYLLABICS NASKAPI WOO"/* 1416 */,/*5143*/"CANADIAN SYLLABICS WA"/* 1417 */, /*5144*/"CANADIAN SYLLABICS WEST-CREE WA"/* 1418 */,/*5145*/"CANADIAN SYLLABICS WAA"/* 1419 */, /*5146*/"CANADIAN SYLLABICS WEST-CREE WAA"/* 141A */,/*5147*/"CANADIAN SYLLABICS NASKAPI WAA"/* 141B */, /*5148*/"CANADIAN SYLLABICS AI"/* 141C */,/*5149*/"CANADIAN SYLLABICS Y-CREE W"/* 141D */, /*5150*/"CANADIAN SYLLABICS GLOTTAL STOP"/* 141E */,/*5151*/"CANADIAN SYLLABICS FINAL ACUTE"/* 141F */, /*5152*/"CANADIAN SYLLABICS FINAL GRAVE"/* 1420 */,/*5153*/"CANADIAN SYLLABICS FINAL BOTTOM HALF RING"/* 1421 */, /*5154*/"CANADIAN SYLLABICS FINAL TOP HALF RING"/* 1422 */,/*5155*/"CANADIAN SYLLABICS FINAL RIGHT HALF RING"/* 1423 */, /*5156*/"CANADIAN SYLLABICS FINAL RING"/* 1424 */,/*5157*/"CANADIAN SYLLABICS FINAL DOUBLE ACUTE"/* 1425 */, /*5158*/"CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES"/* 1426 */, /*5159*/"CANADIAN SYLLABICS FINAL MIDDLE DOT"/* 1427 */, /*5160*/"CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE"/* 1428 */,/*5161*/"CANADIAN SYLLABICS FINAL PLUS"/* 1429 */, /*5162*/"CANADIAN SYLLABICS FINAL DOWN TACK"/* 142A */,/*5163*/"CANADIAN SYLLABICS EN"/* 142B */, /*5164*/"CANADIAN SYLLABICS IN"/* 142C */,/*5165*/"CANADIAN SYLLABICS ON"/* 142D */, /*5166*/"CANADIAN SYLLABICS AN"/* 142E */,/*5167*/"CANADIAN SYLLABICS PE"/* 142F */, /*5168*/"CANADIAN SYLLABICS PAAI"/* 1430 */,/*5169*/"CANADIAN SYLLABICS PI"/* 1431 */, /*5170*/"CANADIAN SYLLABICS PII"/* 1432 */,/*5171*/"CANADIAN SYLLABICS PO"/* 1433 */, /*5172*/"CANADIAN SYLLABICS POO"/* 1434 */,/*5173*/"CANADIAN SYLLABICS Y-CREE POO"/* 1435 */, /*5174*/"CANADIAN SYLLABICS CARRIER HEE"/* 1436 */,/*5175*/"CANADIAN SYLLABICS CARRIER HI"/* 1437 */, /*5176*/"CANADIAN SYLLABICS PA"/* 1438 */,/*5177*/"CANADIAN SYLLABICS PAA"/* 1439 */, /*5178*/"CANADIAN SYLLABICS PWE"/* 143A */,/*5179*/"CANADIAN SYLLABICS WEST-CREE PWE"/* 143B */, /*5180*/"CANADIAN SYLLABICS PWI"/* 143C */,/*5181*/"CANADIAN SYLLABICS WEST-CREE PWI"/* 143D */, /*5182*/"CANADIAN SYLLABICS PWII"/* 143E */,/*5183*/"CANADIAN SYLLABICS WEST-CREE PWII"/* 143F */, /*5184*/"CANADIAN SYLLABICS PWO"/* 1440 */,/*5185*/"CANADIAN SYLLABICS WEST-CREE PWO"/* 1441 */, /*5186*/"CANADIAN SYLLABICS PWOO"/* 1442 */,/*5187*/"CANADIAN SYLLABICS WEST-CREE PWOO"/* 1443 */, /*5188*/"CANADIAN SYLLABICS PWA"/* 1444 */,/*5189*/"CANADIAN SYLLABICS WEST-CREE PWA"/* 1445 */, /*5190*/"CANADIAN SYLLABICS PWAA"/* 1446 */,/*5191*/"CANADIAN SYLLABICS WEST-CREE PWAA"/* 1447 */, /*5192*/"CANADIAN SYLLABICS Y-CREE PWAA"/* 1448 */,/*5193*/"CANADIAN SYLLABICS P"/* 1449 */, /*5194*/"CANADIAN SYLLABICS WEST-CREE P"/* 144A */,/*5195*/"CANADIAN SYLLABICS CARRIER H"/* 144B */, /*5196*/"CANADIAN SYLLABICS TE"/* 144C */,/*5197*/"CANADIAN SYLLABICS TAAI"/* 144D */, /*5198*/"CANADIAN SYLLABICS TI"/* 144E */,/*5199*/"CANADIAN SYLLABICS TII"/* 144F */, /*5200*/"CANADIAN SYLLABICS TO"/* 1450 */,/*5201*/"CANADIAN SYLLABICS TOO"/* 1451 */, /*5202*/"CANADIAN SYLLABICS Y-CREE TOO"/* 1452 */,/*5203*/"CANADIAN SYLLABICS CARRIER DEE"/* 1453 */, /*5204*/"CANADIAN SYLLABICS CARRIER DI"/* 1454 */,/*5205*/"CANADIAN SYLLABICS TA"/* 1455 */, /*5206*/"CANADIAN SYLLABICS TAA"/* 1456 */,/*5207*/"CANADIAN SYLLABICS TWE"/* 1457 */, /*5208*/"CANADIAN SYLLABICS WEST-CREE TWE"/* 1458 */,/*5209*/"CANADIAN SYLLABICS TWI"/* 1459 */, /*5210*/"CANADIAN SYLLABICS WEST-CREE TWI"/* 145A */,/*5211*/"CANADIAN SYLLABICS TWII"/* 145B */, /*5212*/"CANADIAN SYLLABICS WEST-CREE TWII"/* 145C */,/*5213*/"CANADIAN SYLLABICS TWO"/* 145D */, /*5214*/"CANADIAN SYLLABICS WEST-CREE TWO"/* 145E */,/*5215*/"CANADIAN SYLLABICS TWOO"/* 145F */, /*5216*/"CANADIAN SYLLABICS WEST-CREE TWOO"/* 1460 */,/*5217*/"CANADIAN SYLLABICS TWA"/* 1461 */, /*5218*/"CANADIAN SYLLABICS WEST-CREE TWA"/* 1462 */,/*5219*/"CANADIAN SYLLABICS TWAA"/* 1463 */, /*5220*/"CANADIAN SYLLABICS WEST-CREE TWAA"/* 1464 */,/*5221*/"CANADIAN SYLLABICS NASKAPI TWAA"/* 1465 */, /*5222*/"CANADIAN SYLLABICS T"/* 1466 */,/*5223*/"CANADIAN SYLLABICS TTE"/* 1467 */, /*5224*/"CANADIAN SYLLABICS TTI"/* 1468 */,/*5225*/"CANADIAN SYLLABICS TTO"/* 1469 */, /*5226*/"CANADIAN SYLLABICS TTA"/* 146A */,/*5227*/"CANADIAN SYLLABICS KE"/* 146B */, /*5228*/"CANADIAN SYLLABICS KAAI"/* 146C */,/*5229*/"CANADIAN SYLLABICS KI"/* 146D */, /*5230*/"CANADIAN SYLLABICS KII"/* 146E */,/*5231*/"CANADIAN SYLLABICS KO"/* 146F */, /*5232*/"CANADIAN SYLLABICS KOO"/* 1470 */,/*5233*/"CANADIAN SYLLABICS Y-CREE KOO"/* 1471 */, /*5234*/"CANADIAN SYLLABICS KA"/* 1472 */,/*5235*/"CANADIAN SYLLABICS KAA"/* 1473 */, /*5236*/"CANADIAN SYLLABICS KWE"/* 1474 */,/*5237*/"CANADIAN SYLLABICS WEST-CREE KWE"/* 1475 */, /*5238*/"CANADIAN SYLLABICS KWI"/* 1476 */,/*5239*/"CANADIAN SYLLABICS WEST-CREE KWI"/* 1477 */, /*5240*/"CANADIAN SYLLABICS KWII"/* 1478 */,/*5241*/"CANADIAN SYLLABICS WEST-CREE KWII"/* 1479 */, /*5242*/"CANADIAN SYLLABICS KWO"/* 147A */,/*5243*/"CANADIAN SYLLABICS WEST-CREE KWO"/* 147B */, /*5244*/"CANADIAN SYLLABICS KWOO"/* 147C */,/*5245*/"CANADIAN SYLLABICS WEST-CREE KWOO"/* 147D */, /*5246*/"CANADIAN SYLLABICS KWA"/* 147E */,/*5247*/"CANADIAN SYLLABICS WEST-CREE KWA"/* 147F */, /*5248*/"CANADIAN SYLLABICS KWAA"/* 1480 */,/*5249*/"CANADIAN SYLLABICS WEST-CREE KWAA"/* 1481 */, /*5250*/"CANADIAN SYLLABICS NASKAPI KWAA"/* 1482 */,/*5251*/"CANADIAN SYLLABICS K"/* 1483 */, /*5252*/"CANADIAN SYLLABICS KW"/* 1484 */,/*5253*/"CANADIAN SYLLABICS SOUTH-SLAVEY KEH"/* 1485 */, /*5254*/"CANADIAN SYLLABICS SOUTH-SLAVEY KIH"/* 1486 */,/*5255*/"CANADIAN SYLLABICS SOUTH-SLAVEY KOH"/* 1487 */, /*5256*/"CANADIAN SYLLABICS SOUTH-SLAVEY KAH"/* 1488 */,/*5257*/"CANADIAN SYLLABICS CE"/* 1489 */, /*5258*/"CANADIAN SYLLABICS CAAI"/* 148A */,/*5259*/"CANADIAN SYLLABICS CI"/* 148B */, /*5260*/"CANADIAN SYLLABICS CII"/* 148C */,/*5261*/"CANADIAN SYLLABICS CO"/* 148D */, /*5262*/"CANADIAN SYLLABICS COO"/* 148E */,/*5263*/"CANADIAN SYLLABICS Y-CREE COO"/* 148F */, /*5264*/"CANADIAN SYLLABICS CA"/* 1490 */,/*5265*/"CANADIAN SYLLABICS CAA"/* 1491 */, /*5266*/"CANADIAN SYLLABICS CWE"/* 1492 */,/*5267*/"CANADIAN SYLLABICS WEST-CREE CWE"/* 1493 */, /*5268*/"CANADIAN SYLLABICS CWI"/* 1494 */,/*5269*/"CANADIAN SYLLABICS WEST-CREE CWI"/* 1495 */, /*5270*/"CANADIAN SYLLABICS CWII"/* 1496 */,/*5271*/"CANADIAN SYLLABICS WEST-CREE CWII"/* 1497 */, /*5272*/"CANADIAN SYLLABICS CWO"/* 1498 */,/*5273*/"CANADIAN SYLLABICS WEST-CREE CWO"/* 1499 */, /*5274*/"CANADIAN SYLLABICS CWOO"/* 149A */,/*5275*/"CANADIAN SYLLABICS WEST-CREE CWOO"/* 149B */, /*5276*/"CANADIAN SYLLABICS CWA"/* 149C */,/*5277*/"CANADIAN SYLLABICS WEST-CREE CWA"/* 149D */, /*5278*/"CANADIAN SYLLABICS CWAA"/* 149E */,/*5279*/"CANADIAN SYLLABICS WEST-CREE CWAA"/* 149F */, /*5280*/"CANADIAN SYLLABICS NASKAPI CWAA"/* 14A0 */,/*5281*/"CANADIAN SYLLABICS C"/* 14A1 */, /*5282*/"CANADIAN SYLLABICS SAYISI TH"/* 14A2 */,/*5283*/"CANADIAN SYLLABICS ME"/* 14A3 */, /*5284*/"CANADIAN SYLLABICS MAAI"/* 14A4 */,/*5285*/"CANADIAN SYLLABICS MI"/* 14A5 */, /*5286*/"CANADIAN SYLLABICS MII"/* 14A6 */,/*5287*/"CANADIAN SYLLABICS MO"/* 14A7 */, /*5288*/"CANADIAN SYLLABICS MOO"/* 14A8 */,/*5289*/"CANADIAN SYLLABICS Y-CREE MOO"/* 14A9 */, /*5290*/"CANADIAN SYLLABICS MA"/* 14AA */,/*5291*/"CANADIAN SYLLABICS MAA"/* 14AB */, /*5292*/"CANADIAN SYLLABICS MWE"/* 14AC */,/*5293*/"CANADIAN SYLLABICS WEST-CREE MWE"/* 14AD */, /*5294*/"CANADIAN SYLLABICS MWI"/* 14AE */,/*5295*/"CANADIAN SYLLABICS WEST-CREE MWI"/* 14AF */, /*5296*/"CANADIAN SYLLABICS MWII"/* 14B0 */,/*5297*/"CANADIAN SYLLABICS WEST-CREE MWII"/* 14B1 */, /*5298*/"CANADIAN SYLLABICS MWO"/* 14B2 */,/*5299*/"CANADIAN SYLLABICS WEST-CREE MWO"/* 14B3 */, /*5300*/"CANADIAN SYLLABICS MWOO"/* 14B4 */,/*5301*/"CANADIAN SYLLABICS WEST-CREE MWOO"/* 14B5 */, /*5302*/"CANADIAN SYLLABICS MWA"/* 14B6 */,/*5303*/"CANADIAN SYLLABICS WEST-CREE MWA"/* 14B7 */, /*5304*/"CANADIAN SYLLABICS MWAA"/* 14B8 */,/*5305*/"CANADIAN SYLLABICS WEST-CREE MWAA"/* 14B9 */, /*5306*/"CANADIAN SYLLABICS NASKAPI MWAA"/* 14BA */,/*5307*/"CANADIAN SYLLABICS M"/* 14BB */, /*5308*/"CANADIAN SYLLABICS WEST-CREE M"/* 14BC */,/*5309*/"CANADIAN SYLLABICS MH"/* 14BD */, /*5310*/"CANADIAN SYLLABICS ATHAPASCAN M"/* 14BE */,/*5311*/"CANADIAN SYLLABICS SAYISI M"/* 14BF */, /*5312*/"CANADIAN SYLLABICS NE"/* 14C0 */,/*5313*/"CANADIAN SYLLABICS NAAI"/* 14C1 */, /*5314*/"CANADIAN SYLLABICS NI"/* 14C2 */,/*5315*/"CANADIAN SYLLABICS NII"/* 14C3 */, /*5316*/"CANADIAN SYLLABICS NO"/* 14C4 */,/*5317*/"CANADIAN SYLLABICS NOO"/* 14C5 */, /*5318*/"CANADIAN SYLLABICS Y-CREE NOO"/* 14C6 */,/*5319*/"CANADIAN SYLLABICS NA"/* 14C7 */, /*5320*/"CANADIAN SYLLABICS NAA"/* 14C8 */,/*5321*/"CANADIAN SYLLABICS NWE"/* 14C9 */, /*5322*/"CANADIAN SYLLABICS WEST-CREE NWE"/* 14CA */,/*5323*/"CANADIAN SYLLABICS NWA"/* 14CB */, /*5324*/"CANADIAN SYLLABICS WEST-CREE NWA"/* 14CC */,/*5325*/"CANADIAN SYLLABICS NWAA"/* 14CD */, /*5326*/"CANADIAN SYLLABICS WEST-CREE NWAA"/* 14CE */,/*5327*/"CANADIAN SYLLABICS NASKAPI NWAA"/* 14CF */, /*5328*/"CANADIAN SYLLABICS N"/* 14D0 */,/*5329*/"CANADIAN SYLLABICS CARRIER NG"/* 14D1 */, /*5330*/"CANADIAN SYLLABICS NH"/* 14D2 */,/*5331*/"CANADIAN SYLLABICS LE"/* 14D3 */, /*5332*/"CANADIAN SYLLABICS LAAI"/* 14D4 */,/*5333*/"CANADIAN SYLLABICS LI"/* 14D5 */, /*5334*/"CANADIAN SYLLABICS LII"/* 14D6 */,/*5335*/"CANADIAN SYLLABICS LO"/* 14D7 */, /*5336*/"CANADIAN SYLLABICS LOO"/* 14D8 */,/*5337*/"CANADIAN SYLLABICS Y-CREE LOO"/* 14D9 */, /*5338*/"CANADIAN SYLLABICS LA"/* 14DA */,/*5339*/"CANADIAN SYLLABICS LAA"/* 14DB */, /*5340*/"CANADIAN SYLLABICS LWE"/* 14DC */,/*5341*/"CANADIAN SYLLABICS WEST-CREE LWE"/* 14DD */, /*5342*/"CANADIAN SYLLABICS LWI"/* 14DE */,/*5343*/"CANADIAN SYLLABICS WEST-CREE LWI"/* 14DF */, /*5344*/"CANADIAN SYLLABICS LWII"/* 14E0 */,/*5345*/"CANADIAN SYLLABICS WEST-CREE LWII"/* 14E1 */, /*5346*/"CANADIAN SYLLABICS LWO"/* 14E2 */,/*5347*/"CANADIAN SYLLABICS WEST-CREE LWO"/* 14E3 */, /*5348*/"CANADIAN SYLLABICS LWOO"/* 14E4 */,/*5349*/"CANADIAN SYLLABICS WEST-CREE LWOO"/* 14E5 */, /*5350*/"CANADIAN SYLLABICS LWA"/* 14E6 */,/*5351*/"CANADIAN SYLLABICS WEST-CREE LWA"/* 14E7 */, /*5352*/"CANADIAN SYLLABICS LWAA"/* 14E8 */,/*5353*/"CANADIAN SYLLABICS WEST-CREE LWAA"/* 14E9 */, /*5354*/"CANADIAN SYLLABICS L"/* 14EA */,/*5355*/"CANADIAN SYLLABICS WEST-CREE L"/* 14EB */, /*5356*/"CANADIAN SYLLABICS MEDIAL L"/* 14EC */,/*5357*/"CANADIAN SYLLABICS SE"/* 14ED */, /*5358*/"CANADIAN SYLLABICS SAAI"/* 14EE */,/*5359*/"CANADIAN SYLLABICS SI"/* 14EF */, /*5360*/"CANADIAN SYLLABICS SII"/* 14F0 */,/*5361*/"CANADIAN SYLLABICS SO"/* 14F1 */, /*5362*/"CANADIAN SYLLABICS SOO"/* 14F2 */,/*5363*/"CANADIAN SYLLABICS Y-CREE SOO"/* 14F3 */, /*5364*/"CANADIAN SYLLABICS SA"/* 14F4 */,/*5365*/"CANADIAN SYLLABICS SAA"/* 14F5 */, /*5366*/"CANADIAN SYLLABICS SWE"/* 14F6 */,/*5367*/"CANADIAN SYLLABICS WEST-CREE SWE"/* 14F7 */, /*5368*/"CANADIAN SYLLABICS SWI"/* 14F8 */,/*5369*/"CANADIAN SYLLABICS WEST-CREE SWI"/* 14F9 */, /*5370*/"CANADIAN SYLLABICS SWII"/* 14FA */,/*5371*/"CANADIAN SYLLABICS WEST-CREE SWII"/* 14FB */, /*5372*/"CANADIAN SYLLABICS SWO"/* 14FC */,/*5373*/"CANADIAN SYLLABICS WEST-CREE SWO"/* 14FD */, /*5374*/"CANADIAN SYLLABICS SWOO"/* 14FE */,/*5375*/"CANADIAN SYLLABICS WEST-CREE SWOO"/* 14FF */, /*5376*/"CANADIAN SYLLABICS SWA"/* 1500 */,/*5377*/"CANADIAN SYLLABICS WEST-CREE SWA"/* 1501 */, /*5378*/"CANADIAN SYLLABICS SWAA"/* 1502 */,/*5379*/"CANADIAN SYLLABICS WEST-CREE SWAA"/* 1503 */, /*5380*/"CANADIAN SYLLABICS NASKAPI SWAA"/* 1504 */,/*5381*/"CANADIAN SYLLABICS S"/* 1505 */, /*5382*/"CANADIAN SYLLABICS ATHAPASCAN S"/* 1506 */,/*5383*/"CANADIAN SYLLABICS SW"/* 1507 */, /*5384*/"CANADIAN SYLLABICS BLACKFOOT S"/* 1508 */,/*5385*/"CANADIAN SYLLABICS MOOSE-CREE SK"/* 1509 */, /*5386*/"CANADIAN SYLLABICS NASKAPI SKW"/* 150A */,/*5387*/"CANADIAN SYLLABICS NASKAPI S-W"/* 150B */, /*5388*/"CANADIAN SYLLABICS NASKAPI SPWA"/* 150C */,/*5389*/"CANADIAN SYLLABICS NASKAPI STWA"/* 150D */, /*5390*/"CANADIAN SYLLABICS NASKAPI SKWA"/* 150E */,/*5391*/"CANADIAN SYLLABICS NASKAPI SCWA"/* 150F */, /*5392*/"CANADIAN SYLLABICS SHE"/* 1510 */,/*5393*/"CANADIAN SYLLABICS SHI"/* 1511 */, /*5394*/"CANADIAN SYLLABICS SHII"/* 1512 */,/*5395*/"CANADIAN SYLLABICS SHO"/* 1513 */, /*5396*/"CANADIAN SYLLABICS SHOO"/* 1514 */,/*5397*/"CANADIAN SYLLABICS SHA"/* 1515 */, /*5398*/"CANADIAN SYLLABICS SHAA"/* 1516 */,/*5399*/"CANADIAN SYLLABICS SHWE"/* 1517 */, /*5400*/"CANADIAN SYLLABICS WEST-CREE SHWE"/* 1518 */,/*5401*/"CANADIAN SYLLABICS SHWI"/* 1519 */, /*5402*/"CANADIAN SYLLABICS WEST-CREE SHWI"/* 151A */,/*5403*/"CANADIAN SYLLABICS SHWII"/* 151B */, /*5404*/"CANADIAN SYLLABICS WEST-CREE SHWII"/* 151C */,/*5405*/"CANADIAN SYLLABICS SHWO"/* 151D */, /*5406*/"CANADIAN SYLLABICS WEST-CREE SHWO"/* 151E */,/*5407*/"CANADIAN SYLLABICS SHWOO"/* 151F */, /*5408*/"CANADIAN SYLLABICS WEST-CREE SHWOO"/* 1520 */,/*5409*/"CANADIAN SYLLABICS SHWA"/* 1521 */, /*5410*/"CANADIAN SYLLABICS WEST-CREE SHWA"/* 1522 */,/*5411*/"CANADIAN SYLLABICS SHWAA"/* 1523 */, /*5412*/"CANADIAN SYLLABICS WEST-CREE SHWAA"/* 1524 */,/*5413*/"CANADIAN SYLLABICS SH"/* 1525 */, /*5414*/"CANADIAN SYLLABICS YE"/* 1526 */,/*5415*/"CANADIAN SYLLABICS YAAI"/* 1527 */, /*5416*/"CANADIAN SYLLABICS YI"/* 1528 */,/*5417*/"CANADIAN SYLLABICS YII"/* 1529 */, /*5418*/"CANADIAN SYLLABICS YO"/* 152A */,/*5419*/"CANADIAN SYLLABICS YOO"/* 152B */, /*5420*/"CANADIAN SYLLABICS Y-CREE YOO"/* 152C */,/*5421*/"CANADIAN SYLLABICS YA"/* 152D */, /*5422*/"CANADIAN SYLLABICS YAA"/* 152E */,/*5423*/"CANADIAN SYLLABICS YWE"/* 152F */, /*5424*/"CANADIAN SYLLABICS WEST-CREE YWE"/* 1530 */,/*5425*/"CANADIAN SYLLABICS YWI"/* 1531 */, /*5426*/"CANADIAN SYLLABICS WEST-CREE YWI"/* 1532 */,/*5427*/"CANADIAN SYLLABICS YWII"/* 1533 */, /*5428*/"CANADIAN SYLLABICS WEST-CREE YWII"/* 1534 */,/*5429*/"CANADIAN SYLLABICS YWO"/* 1535 */, /*5430*/"CANADIAN SYLLABICS WEST-CREE YWO"/* 1536 */,/*5431*/"CANADIAN SYLLABICS YWOO"/* 1537 */, /*5432*/"CANADIAN SYLLABICS WEST-CREE YWOO"/* 1538 */,/*5433*/"CANADIAN SYLLABICS YWA"/* 1539 */, /*5434*/"CANADIAN SYLLABICS WEST-CREE YWA"/* 153A */,/*5435*/"CANADIAN SYLLABICS YWAA"/* 153B */, /*5436*/"CANADIAN SYLLABICS WEST-CREE YWAA"/* 153C */,/*5437*/"CANADIAN SYLLABICS NASKAPI YWAA"/* 153D */, /*5438*/"CANADIAN SYLLABICS Y"/* 153E */,/*5439*/"CANADIAN SYLLABICS BIBLE-CREE Y"/* 153F */, /*5440*/"CANADIAN SYLLABICS WEST-CREE Y"/* 1540 */,/*5441*/"CANADIAN SYLLABICS SAYISI YI"/* 1541 */, /*5442*/"CANADIAN SYLLABICS RE"/* 1542 */,/*5443*/"CANADIAN SYLLABICS R-CREE RE"/* 1543 */, /*5444*/"CANADIAN SYLLABICS WEST-CREE LE"/* 1544 */,/*5445*/"CANADIAN SYLLABICS RAAI"/* 1545 */, /*5446*/"CANADIAN SYLLABICS RI"/* 1546 */,/*5447*/"CANADIAN SYLLABICS RII"/* 1547 */, /*5448*/"CANADIAN SYLLABICS RO"/* 1548 */,/*5449*/"CANADIAN SYLLABICS ROO"/* 1549 */, /*5450*/"CANADIAN SYLLABICS WEST-CREE LO"/* 154A */,/*5451*/"CANADIAN SYLLABICS RA"/* 154B */, /*5452*/"CANADIAN SYLLABICS RAA"/* 154C */,/*5453*/"CANADIAN SYLLABICS WEST-CREE LA"/* 154D */, /*5454*/"CANADIAN SYLLABICS RWAA"/* 154E */,/*5455*/"CANADIAN SYLLABICS WEST-CREE RWAA"/* 154F */, /*5456*/"CANADIAN SYLLABICS R"/* 1550 */,/*5457*/"CANADIAN SYLLABICS WEST-CREE R"/* 1551 */, /*5458*/"CANADIAN SYLLABICS MEDIAL R"/* 1552 */,/*5459*/"CANADIAN SYLLABICS FE"/* 1553 */, /*5460*/"CANADIAN SYLLABICS FAAI"/* 1554 */,/*5461*/"CANADIAN SYLLABICS FI"/* 1555 */, /*5462*/"CANADIAN SYLLABICS FII"/* 1556 */,/*5463*/"CANADIAN SYLLABICS FO"/* 1557 */, /*5464*/"CANADIAN SYLLABICS FOO"/* 1558 */,/*5465*/"CANADIAN SYLLABICS FA"/* 1559 */, /*5466*/"CANADIAN SYLLABICS FAA"/* 155A */,/*5467*/"CANADIAN SYLLABICS FWAA"/* 155B */, /*5468*/"CANADIAN SYLLABICS WEST-CREE FWAA"/* 155C */,/*5469*/"CANADIAN SYLLABICS F"/* 155D */, /*5470*/"CANADIAN SYLLABICS THE"/* 155E */,/*5471*/"CANADIAN SYLLABICS N-CREE THE"/* 155F */, /*5472*/"CANADIAN SYLLABICS THI"/* 1560 */,/*5473*/"CANADIAN SYLLABICS N-CREE THI"/* 1561 */, /*5474*/"CANADIAN SYLLABICS THII"/* 1562 */,/*5475*/"CANADIAN SYLLABICS N-CREE THII"/* 1563 */, /*5476*/"CANADIAN SYLLABICS THO"/* 1564 */,/*5477*/"CANADIAN SYLLABICS THOO"/* 1565 */, /*5478*/"CANADIAN SYLLABICS THA"/* 1566 */,/*5479*/"CANADIAN SYLLABICS THAA"/* 1567 */, /*5480*/"CANADIAN SYLLABICS THWAA"/* 1568 */,/*5481*/"CANADIAN SYLLABICS WEST-CREE THWAA"/* 1569 */, /*5482*/"CANADIAN SYLLABICS TH"/* 156A */,/*5483*/"CANADIAN SYLLABICS TTHE"/* 156B */, /*5484*/"CANADIAN SYLLABICS TTHI"/* 156C */,/*5485*/"CANADIAN SYLLABICS TTHO"/* 156D */, /*5486*/"CANADIAN SYLLABICS TTHA"/* 156E */,/*5487*/"CANADIAN SYLLABICS TTH"/* 156F */, /*5488*/"CANADIAN SYLLABICS TYE"/* 1570 */,/*5489*/"CANADIAN SYLLABICS TYI"/* 1571 */, /*5490*/"CANADIAN SYLLABICS TYO"/* 1572 */,/*5491*/"CANADIAN SYLLABICS TYA"/* 1573 */, /*5492*/"CANADIAN SYLLABICS NUNAVIK HE"/* 1574 */,/*5493*/"CANADIAN SYLLABICS NUNAVIK HI"/* 1575 */, /*5494*/"CANADIAN SYLLABICS NUNAVIK HII"/* 1576 */,/*5495*/"CANADIAN SYLLABICS NUNAVIK HO"/* 1577 */, /*5496*/"CANADIAN SYLLABICS NUNAVIK HOO"/* 1578 */,/*5497*/"CANADIAN SYLLABICS NUNAVIK HA"/* 1579 */, /*5498*/"CANADIAN SYLLABICS NUNAVIK HAA"/* 157A */,/*5499*/"CANADIAN SYLLABICS NUNAVIK H"/* 157B */, /*5500*/"CANADIAN SYLLABICS NUNAVUT H"/* 157C */,/*5501*/"CANADIAN SYLLABICS HK"/* 157D */, /*5502*/"CANADIAN SYLLABICS QAAI"/* 157E */,/*5503*/"CANADIAN SYLLABICS QI"/* 157F */, /*5504*/"CANADIAN SYLLABICS QII"/* 1580 */,/*5505*/"CANADIAN SYLLABICS QO"/* 1581 */, /*5506*/"CANADIAN SYLLABICS QOO"/* 1582 */,/*5507*/"CANADIAN SYLLABICS QA"/* 1583 */, /*5508*/"CANADIAN SYLLABICS QAA"/* 1584 */,/*5509*/"CANADIAN SYLLABICS Q"/* 1585 */, /*5510*/"CANADIAN SYLLABICS TLHE"/* 1586 */,/*5511*/"CANADIAN SYLLABICS TLHI"/* 1587 */, /*5512*/"CANADIAN SYLLABICS TLHO"/* 1588 */,/*5513*/"CANADIAN SYLLABICS TLHA"/* 1589 */, /*5514*/"CANADIAN SYLLABICS WEST-CREE RE"/* 158A */,/*5515*/"CANADIAN SYLLABICS WEST-CREE RI"/* 158B */, /*5516*/"CANADIAN SYLLABICS WEST-CREE RO"/* 158C */,/*5517*/"CANADIAN SYLLABICS WEST-CREE RA"/* 158D */, /*5518*/"CANADIAN SYLLABICS NGAAI"/* 158E */,/*5519*/"CANADIAN SYLLABICS NGI"/* 158F */, /*5520*/"CANADIAN SYLLABICS NGII"/* 1590 */,/*5521*/"CANADIAN SYLLABICS NGO"/* 1591 */, /*5522*/"CANADIAN SYLLABICS NGOO"/* 1592 */,/*5523*/"CANADIAN SYLLABICS NGA"/* 1593 */, /*5524*/"CANADIAN SYLLABICS NGAA"/* 1594 */,/*5525*/"CANADIAN SYLLABICS NG"/* 1595 */, /*5526*/"CANADIAN SYLLABICS NNG"/* 1596 */,/*5527*/"CANADIAN SYLLABICS SAYISI SHE"/* 1597 */, /*5528*/"CANADIAN SYLLABICS SAYISI SHI"/* 1598 */,/*5529*/"CANADIAN SYLLABICS SAYISI SHO"/* 1599 */, /*5530*/"CANADIAN SYLLABICS SAYISI SHA"/* 159A */,/*5531*/"CANADIAN SYLLABICS WOODS-CREE THE"/* 159B */, /*5532*/"CANADIAN SYLLABICS WOODS-CREE THI"/* 159C */,/*5533*/"CANADIAN SYLLABICS WOODS-CREE THO"/* 159D */, /*5534*/"CANADIAN SYLLABICS WOODS-CREE THA"/* 159E */,/*5535*/"CANADIAN SYLLABICS WOODS-CREE TH"/* 159F */, /*5536*/"CANADIAN SYLLABICS LHI"/* 15A0 */,/*5537*/"CANADIAN SYLLABICS LHII"/* 15A1 */, /*5538*/"CANADIAN SYLLABICS LHO"/* 15A2 */,/*5539*/"CANADIAN SYLLABICS LHOO"/* 15A3 */, /*5540*/"CANADIAN SYLLABICS LHA"/* 15A4 */,/*5541*/"CANADIAN SYLLABICS LHAA"/* 15A5 */, /*5542*/"CANADIAN SYLLABICS LH"/* 15A6 */,/*5543*/"CANADIAN SYLLABICS TH-CREE THE"/* 15A7 */, /*5544*/"CANADIAN SYLLABICS TH-CREE THI"/* 15A8 */,/*5545*/"CANADIAN SYLLABICS TH-CREE THII"/* 15A9 */, /*5546*/"CANADIAN SYLLABICS TH-CREE THO"/* 15AA */,/*5547*/"CANADIAN SYLLABICS TH-CREE THOO"/* 15AB */, /*5548*/"CANADIAN SYLLABICS TH-CREE THA"/* 15AC */,/*5549*/"CANADIAN SYLLABICS TH-CREE THAA"/* 15AD */, /*5550*/"CANADIAN SYLLABICS TH-CREE TH"/* 15AE */,/*5551*/"CANADIAN SYLLABICS AIVILIK B"/* 15AF */, /*5552*/"CANADIAN SYLLABICS BLACKFOOT E"/* 15B0 */,/*5553*/"CANADIAN SYLLABICS BLACKFOOT I"/* 15B1 */, /*5554*/"CANADIAN SYLLABICS BLACKFOOT O"/* 15B2 */,/*5555*/"CANADIAN SYLLABICS BLACKFOOT A"/* 15B3 */, /*5556*/"CANADIAN SYLLABICS BLACKFOOT WE"/* 15B4 */,/*5557*/"CANADIAN SYLLABICS BLACKFOOT WI"/* 15B5 */, /*5558*/"CANADIAN SYLLABICS BLACKFOOT WO"/* 15B6 */,/*5559*/"CANADIAN SYLLABICS BLACKFOOT WA"/* 15B7 */, /*5560*/"CANADIAN SYLLABICS BLACKFOOT NE"/* 15B8 */,/*5561*/"CANADIAN SYLLABICS BLACKFOOT NI"/* 15B9 */, /*5562*/"CANADIAN SYLLABICS BLACKFOOT NO"/* 15BA */,/*5563*/"CANADIAN SYLLABICS BLACKFOOT NA"/* 15BB */, /*5564*/"CANADIAN SYLLABICS BLACKFOOT KE"/* 15BC */,/*5565*/"CANADIAN SYLLABICS BLACKFOOT KI"/* 15BD */, /*5566*/"CANADIAN SYLLABICS BLACKFOOT KO"/* 15BE */,/*5567*/"CANADIAN SYLLABICS BLACKFOOT KA"/* 15BF */, /*5568*/"CANADIAN SYLLABICS SAYISI HE"/* 15C0 */,/*5569*/"CANADIAN SYLLABICS SAYISI HI"/* 15C1 */, /*5570*/"CANADIAN SYLLABICS SAYISI HO"/* 15C2 */,/*5571*/"CANADIAN SYLLABICS SAYISI HA"/* 15C3 */, /*5572*/"CANADIAN SYLLABICS CARRIER GHU"/* 15C4 */,/*5573*/"CANADIAN SYLLABICS CARRIER GHO"/* 15C5 */, /*5574*/"CANADIAN SYLLABICS CARRIER GHE"/* 15C6 */,/*5575*/"CANADIAN SYLLABICS CARRIER GHEE"/* 15C7 */, /*5576*/"CANADIAN SYLLABICS CARRIER GHI"/* 15C8 */,/*5577*/"CANADIAN SYLLABICS CARRIER GHA"/* 15C9 */, /*5578*/"CANADIAN SYLLABICS CARRIER RU"/* 15CA */,/*5579*/"CANADIAN SYLLABICS CARRIER RO"/* 15CB */, /*5580*/"CANADIAN SYLLABICS CARRIER RE"/* 15CC */,/*5581*/"CANADIAN SYLLABICS CARRIER REE"/* 15CD */, /*5582*/"CANADIAN SYLLABICS CARRIER RI"/* 15CE */,/*5583*/"CANADIAN SYLLABICS CARRIER RA"/* 15CF */, /*5584*/"CANADIAN SYLLABICS CARRIER WU"/* 15D0 */,/*5585*/"CANADIAN SYLLABICS CARRIER WO"/* 15D1 */, /*5586*/"CANADIAN SYLLABICS CARRIER WE"/* 15D2 */,/*5587*/"CANADIAN SYLLABICS CARRIER WEE"/* 15D3 */, /*5588*/"CANADIAN SYLLABICS CARRIER WI"/* 15D4 */,/*5589*/"CANADIAN SYLLABICS CARRIER WA"/* 15D5 */, /*5590*/"CANADIAN SYLLABICS CARRIER HWU"/* 15D6 */,/*5591*/"CANADIAN SYLLABICS CARRIER HWO"/* 15D7 */, /*5592*/"CANADIAN SYLLABICS CARRIER HWE"/* 15D8 */,/*5593*/"CANADIAN SYLLABICS CARRIER HWEE"/* 15D9 */, /*5594*/"CANADIAN SYLLABICS CARRIER HWI"/* 15DA */,/*5595*/"CANADIAN SYLLABICS CARRIER HWA"/* 15DB */, /*5596*/"CANADIAN SYLLABICS CARRIER THU"/* 15DC */,/*5597*/"CANADIAN SYLLABICS CARRIER THO"/* 15DD */, /*5598*/"CANADIAN SYLLABICS CARRIER THE"/* 15DE */,/*5599*/"CANADIAN SYLLABICS CARRIER THEE"/* 15DF */, /*5600*/"CANADIAN SYLLABICS CARRIER THI"/* 15E0 */,/*5601*/"CANADIAN SYLLABICS CARRIER THA"/* 15E1 */, /*5602*/"CANADIAN SYLLABICS CARRIER TTU"/* 15E2 */,/*5603*/"CANADIAN SYLLABICS CARRIER TTO"/* 15E3 */, /*5604*/"CANADIAN SYLLABICS CARRIER TTE"/* 15E4 */,/*5605*/"CANADIAN SYLLABICS CARRIER TTEE"/* 15E5 */, /*5606*/"CANADIAN SYLLABICS CARRIER TTI"/* 15E6 */,/*5607*/"CANADIAN SYLLABICS CARRIER TTA"/* 15E7 */, /*5608*/"CANADIAN SYLLABICS CARRIER PU"/* 15E8 */,/*5609*/"CANADIAN SYLLABICS CARRIER PO"/* 15E9 */, /*5610*/"CANADIAN SYLLABICS CARRIER PE"/* 15EA */,/*5611*/"CANADIAN SYLLABICS CARRIER PEE"/* 15EB */, /*5612*/"CANADIAN SYLLABICS CARRIER PI"/* 15EC */,/*5613*/"CANADIAN SYLLABICS CARRIER PA"/* 15ED */, /*5614*/"CANADIAN SYLLABICS CARRIER P"/* 15EE */,/*5615*/"CANADIAN SYLLABICS CARRIER GU"/* 15EF */, /*5616*/"CANADIAN SYLLABICS CARRIER GO"/* 15F0 */,/*5617*/"CANADIAN SYLLABICS CARRIER GE"/* 15F1 */, /*5618*/"CANADIAN SYLLABICS CARRIER GEE"/* 15F2 */,/*5619*/"CANADIAN SYLLABICS CARRIER GI"/* 15F3 */, /*5620*/"CANADIAN SYLLABICS CARRIER GA"/* 15F4 */,/*5621*/"CANADIAN SYLLABICS CARRIER KHU"/* 15F5 */, /*5622*/"CANADIAN SYLLABICS CARRIER KHO"/* 15F6 */,/*5623*/"CANADIAN SYLLABICS CARRIER KHE"/* 15F7 */, /*5624*/"CANADIAN SYLLABICS CARRIER KHEE"/* 15F8 */,/*5625*/"CANADIAN SYLLABICS CARRIER KHI"/* 15F9 */, /*5626*/"CANADIAN SYLLABICS CARRIER KHA"/* 15FA */,/*5627*/"CANADIAN SYLLABICS CARRIER KKU"/* 15FB */, /*5628*/"CANADIAN SYLLABICS CARRIER KKO"/* 15FC */,/*5629*/"CANADIAN SYLLABICS CARRIER KKE"/* 15FD */, /*5630*/"CANADIAN SYLLABICS CARRIER KKEE"/* 15FE */,/*5631*/"CANADIAN SYLLABICS CARRIER KKI"/* 15FF */, /*5632*/"CANADIAN SYLLABICS CARRIER KKA"/* 1600 */,/*5633*/"CANADIAN SYLLABICS CARRIER KK"/* 1601 */, /*5634*/"CANADIAN SYLLABICS CARRIER NU"/* 1602 */,/*5635*/"CANADIAN SYLLABICS CARRIER NO"/* 1603 */, /*5636*/"CANADIAN SYLLABICS CARRIER NE"/* 1604 */,/*5637*/"CANADIAN SYLLABICS CARRIER NEE"/* 1605 */, /*5638*/"CANADIAN SYLLABICS CARRIER NI"/* 1606 */,/*5639*/"CANADIAN SYLLABICS CARRIER NA"/* 1607 */, /*5640*/"CANADIAN SYLLABICS CARRIER MU"/* 1608 */,/*5641*/"CANADIAN SYLLABICS CARRIER MO"/* 1609 */, /*5642*/"CANADIAN SYLLABICS CARRIER ME"/* 160A */,/*5643*/"CANADIAN SYLLABICS CARRIER MEE"/* 160B */, /*5644*/"CANADIAN SYLLABICS CARRIER MI"/* 160C */,/*5645*/"CANADIAN SYLLABICS CARRIER MA"/* 160D */, /*5646*/"CANADIAN SYLLABICS CARRIER YU"/* 160E */,/*5647*/"CANADIAN SYLLABICS CARRIER YO"/* 160F */, /*5648*/"CANADIAN SYLLABICS CARRIER YE"/* 1610 */,/*5649*/"CANADIAN SYLLABICS CARRIER YEE"/* 1611 */, /*5650*/"CANADIAN SYLLABICS CARRIER YI"/* 1612 */,/*5651*/"CANADIAN SYLLABICS CARRIER YA"/* 1613 */, /*5652*/"CANADIAN SYLLABICS CARRIER JU"/* 1614 */,/*5653*/"CANADIAN SYLLABICS SAYISI JU"/* 1615 */, /*5654*/"CANADIAN SYLLABICS CARRIER JO"/* 1616 */,/*5655*/"CANADIAN SYLLABICS CARRIER JE"/* 1617 */, /*5656*/"CANADIAN SYLLABICS CARRIER JEE"/* 1618 */,/*5657*/"CANADIAN SYLLABICS CARRIER JI"/* 1619 */, /*5658*/"CANADIAN SYLLABICS SAYISI JI"/* 161A */,/*5659*/"CANADIAN SYLLABICS CARRIER JA"/* 161B */, /*5660*/"CANADIAN SYLLABICS CARRIER JJU"/* 161C */,/*5661*/"CANADIAN SYLLABICS CARRIER JJO"/* 161D */, /*5662*/"CANADIAN SYLLABICS CARRIER JJE"/* 161E */,/*5663*/"CANADIAN SYLLABICS CARRIER JJEE"/* 161F */, /*5664*/"CANADIAN SYLLABICS CARRIER JJI"/* 1620 */,/*5665*/"CANADIAN SYLLABICS CARRIER JJA"/* 1621 */, /*5666*/"CANADIAN SYLLABICS CARRIER LU"/* 1622 */,/*5667*/"CANADIAN SYLLABICS CARRIER LO"/* 1623 */, /*5668*/"CANADIAN SYLLABICS CARRIER LE"/* 1624 */,/*5669*/"CANADIAN SYLLABICS CARRIER LEE"/* 1625 */, /*5670*/"CANADIAN SYLLABICS CARRIER LI"/* 1626 */,/*5671*/"CANADIAN SYLLABICS CARRIER LA"/* 1627 */, /*5672*/"CANADIAN SYLLABICS CARRIER DLU"/* 1628 */,/*5673*/"CANADIAN SYLLABICS CARRIER DLO"/* 1629 */, /*5674*/"CANADIAN SYLLABICS CARRIER DLE"/* 162A */,/*5675*/"CANADIAN SYLLABICS CARRIER DLEE"/* 162B */, /*5676*/"CANADIAN SYLLABICS CARRIER DLI"/* 162C */,/*5677*/"CANADIAN SYLLABICS CARRIER DLA"/* 162D */, /*5678*/"CANADIAN SYLLABICS CARRIER LHU"/* 162E */,/*5679*/"CANADIAN SYLLABICS CARRIER LHO"/* 162F */, /*5680*/"CANADIAN SYLLABICS CARRIER LHE"/* 1630 */,/*5681*/"CANADIAN SYLLABICS CARRIER LHEE"/* 1631 */, /*5682*/"CANADIAN SYLLABICS CARRIER LHI"/* 1632 */,/*5683*/"CANADIAN SYLLABICS CARRIER LHA"/* 1633 */, /*5684*/"CANADIAN SYLLABICS CARRIER TLHU"/* 1634 */,/*5685*/"CANADIAN SYLLABICS CARRIER TLHO"/* 1635 */, /*5686*/"CANADIAN SYLLABICS CARRIER TLHE"/* 1636 */,/*5687*/"CANADIAN SYLLABICS CARRIER TLHEE"/* 1637 */, /*5688*/"CANADIAN SYLLABICS CARRIER TLHI"/* 1638 */,/*5689*/"CANADIAN SYLLABICS CARRIER TLHA"/* 1639 */, /*5690*/"CANADIAN SYLLABICS CARRIER TLU"/* 163A */,/*5691*/"CANADIAN SYLLABICS CARRIER TLO"/* 163B */, /*5692*/"CANADIAN SYLLABICS CARRIER TLE"/* 163C */,/*5693*/"CANADIAN SYLLABICS CARRIER TLEE"/* 163D */, /*5694*/"CANADIAN SYLLABICS CARRIER TLI"/* 163E */,/*5695*/"CANADIAN SYLLABICS CARRIER TLA"/* 163F */, /*5696*/"CANADIAN SYLLABICS CARRIER ZU"/* 1640 */,/*5697*/"CANADIAN SYLLABICS CARRIER ZO"/* 1641 */, /*5698*/"CANADIAN SYLLABICS CARRIER ZE"/* 1642 */,/*5699*/"CANADIAN SYLLABICS CARRIER ZEE"/* 1643 */, /*5700*/"CANADIAN SYLLABICS CARRIER ZI"/* 1644 */,/*5701*/"CANADIAN SYLLABICS CARRIER ZA"/* 1645 */, /*5702*/"CANADIAN SYLLABICS CARRIER Z"/* 1646 */,/*5703*/"CANADIAN SYLLABICS CARRIER INITIAL Z"/* 1647 */, /*5704*/"CANADIAN SYLLABICS CARRIER DZU"/* 1648 */,/*5705*/"CANADIAN SYLLABICS CARRIER DZO"/* 1649 */, /*5706*/"CANADIAN SYLLABICS CARRIER DZE"/* 164A */,/*5707*/"CANADIAN SYLLABICS CARRIER DZEE"/* 164B */, /*5708*/"CANADIAN SYLLABICS CARRIER DZI"/* 164C */,/*5709*/"CANADIAN SYLLABICS CARRIER DZA"/* 164D */, /*5710*/"CANADIAN SYLLABICS CARRIER SU"/* 164E */,/*5711*/"CANADIAN SYLLABICS CARRIER SO"/* 164F */, /*5712*/"CANADIAN SYLLABICS CARRIER SE"/* 1650 */,/*5713*/"CANADIAN SYLLABICS CARRIER SEE"/* 1651 */, /*5714*/"CANADIAN SYLLABICS CARRIER SI"/* 1652 */,/*5715*/"CANADIAN SYLLABICS CARRIER SA"/* 1653 */, /*5716*/"CANADIAN SYLLABICS CARRIER SHU"/* 1654 */,/*5717*/"CANADIAN SYLLABICS CARRIER SHO"/* 1655 */, /*5718*/"CANADIAN SYLLABICS CARRIER SHE"/* 1656 */,/*5719*/"CANADIAN SYLLABICS CARRIER SHEE"/* 1657 */, /*5720*/"CANADIAN SYLLABICS CARRIER SHI"/* 1658 */,/*5721*/"CANADIAN SYLLABICS CARRIER SHA"/* 1659 */, /*5722*/"CANADIAN SYLLABICS CARRIER SH"/* 165A */,/*5723*/"CANADIAN SYLLABICS CARRIER TSU"/* 165B */, /*5724*/"CANADIAN SYLLABICS CARRIER TSO"/* 165C */,/*5725*/"CANADIAN SYLLABICS CARRIER TSE"/* 165D */, /*5726*/"CANADIAN SYLLABICS CARRIER TSEE"/* 165E */,/*5727*/"CANADIAN SYLLABICS CARRIER TSI"/* 165F */, /*5728*/"CANADIAN SYLLABICS CARRIER TSA"/* 1660 */,/*5729*/"CANADIAN SYLLABICS CARRIER CHU"/* 1661 */, /*5730*/"CANADIAN SYLLABICS CARRIER CHO"/* 1662 */,/*5731*/"CANADIAN SYLLABICS CARRIER CHE"/* 1663 */, /*5732*/"CANADIAN SYLLABICS CARRIER CHEE"/* 1664 */,/*5733*/"CANADIAN SYLLABICS CARRIER CHI"/* 1665 */, /*5734*/"CANADIAN SYLLABICS CARRIER CHA"/* 1666 */,/*5735*/"CANADIAN SYLLABICS CARRIER TTSU"/* 1667 */, /*5736*/"CANADIAN SYLLABICS CARRIER TTSO"/* 1668 */,/*5737*/"CANADIAN SYLLABICS CARRIER TTSE"/* 1669 */, /*5738*/"CANADIAN SYLLABICS CARRIER TTSEE"/* 166A */,/*5739*/"CANADIAN SYLLABICS CARRIER TTSI"/* 166B */, /*5740*/"CANADIAN SYLLABICS CARRIER TTSA"/* 166C */,/*5741*/"CANADIAN SYLLABICS CHI SIGN"/* 166D */, /*5742*/"CANADIAN SYLLABICS FULL STOP"/* 166E */,/*5743*/"CANADIAN SYLLABICS QAI"/* 166F */, /*5744*/"CANADIAN SYLLABICS NGAI"/* 1670 */,/*5745*/"CANADIAN SYLLABICS NNGI"/* 1671 */, /*5746*/"CANADIAN SYLLABICS NNGII"/* 1672 */,/*5747*/"CANADIAN SYLLABICS NNGO"/* 1673 */, /*5748*/"CANADIAN SYLLABICS NNGOO"/* 1674 */,/*5749*/"CANADIAN SYLLABICS NNGA"/* 1675 */, /*5750*/"CANADIAN SYLLABICS NNGAA"/* 1676 */,/*5751*/"CANADIAN SYLLABICS WOODS-CREE THWEE"/* 1677 */, /*5752*/"CANADIAN SYLLABICS WOODS-CREE THWI"/* 1678 */,/*5753*/"CANADIAN SYLLABICS WOODS-CREE THWII"/* 1679 */, /*5754*/"CANADIAN SYLLABICS WOODS-CREE THWO"/* 167A */,/*5755*/"CANADIAN SYLLABICS WOODS-CREE THWOO"/* 167B */, /*5756*/"CANADIAN SYLLABICS WOODS-CREE THWA"/* 167C */,/*5757*/"CANADIAN SYLLABICS WOODS-CREE THWAA"/* 167D */, /*5758*/"CANADIAN SYLLABICS WOODS-CREE FINAL TH"/* 167E */,/*5759*/"CANADIAN SYLLABICS BLACKFOOT W"/* 167F */, /*5760*/"OGHAM SPACE MARK"/* 1680 */,/*5761*/"OGHAM LETTER BEITH"/* 1681 */,/*5762*/"OGHAM LETTER LUIS"/* 1682 */, /*5763*/"OGHAM LETTER FEARN"/* 1683 */,/*5764*/"OGHAM LETTER SAIL"/* 1684 */,/*5765*/"OGHAM LETTER NION"/* 1685 */, /*5766*/"OGHAM LETTER UATH"/* 1686 */,/*5767*/"OGHAM LETTER DAIR"/* 1687 */,/*5768*/"OGHAM LETTER TINNE"/* 1688 */, /*5769*/"OGHAM LETTER COLL"/* 1689 */,/*5770*/"OGHAM LETTER CEIRT"/* 168A */,/*5771*/"OGHAM LETTER MUIN"/* 168B */, /*5772*/"OGHAM LETTER GORT"/* 168C */,/*5773*/"OGHAM LETTER NGEADAL"/* 168D */,/*5774*/"OGHAM LETTER STRAIF"/* 168E */, /*5775*/"OGHAM LETTER RUIS"/* 168F */,/*5776*/"OGHAM LETTER AILM"/* 1690 */,/*5777*/"OGHAM LETTER ONN"/* 1691 */, /*5778*/"OGHAM LETTER UR"/* 1692 */,/*5779*/"OGHAM LETTER EADHADH"/* 1693 */,/*5780*/"OGHAM LETTER IODHADH"/* 1694 */, /*5781*/"OGHAM LETTER EABHADH"/* 1695 */,/*5782*/"OGHAM LETTER OR"/* 1696 */,/*5783*/"OGHAM LETTER UILLEANN"/* 1697 */, /*5784*/"OGHAM LETTER IFIN"/* 1698 */,/*5785*/"OGHAM LETTER EAMHANCHOLL"/* 1699 */, /*5786*/"OGHAM LETTER PEITH"/* 169A */,/*5787*/"OGHAM FEATHER MARK"/* 169B */, /*5788*/"OGHAM REVERSED FEATHER MARK"/* 169C */,NULL,NULL,NULL,/*5792*/"RUNIC LETTER FEHU FEOH FE F"/* 16A0 */, /*5793*/"RUNIC LETTER V"/* 16A1 */,/*5794*/"RUNIC LETTER URUZ UR U"/* 16A2 */,/*5795*/"RUNIC LETTER YR"/* 16A3 */, /*5796*/"RUNIC LETTER Y"/* 16A4 */,/*5797*/"RUNIC LETTER W"/* 16A5 */, /*5798*/"RUNIC LETTER THURISAZ THURS THORN"/* 16A6 */,/*5799*/"RUNIC LETTER ETH"/* 16A7 */, /*5800*/"RUNIC LETTER ANSUZ A"/* 16A8 */,/*5801*/"RUNIC LETTER OS O"/* 16A9 */,/*5802*/"RUNIC LETTER AC A"/* 16AA */, /*5803*/"RUNIC LETTER AESC"/* 16AB */,/*5804*/"RUNIC LETTER LONG-BRANCH-OSS O"/* 16AC */, /*5805*/"RUNIC LETTER SHORT-TWIG-OSS O"/* 16AD */,/*5806*/"RUNIC LETTER O"/* 16AE */,/*5807*/"RUNIC LETTER OE"/* 16AF */, /*5808*/"RUNIC LETTER ON"/* 16B0 */,/*5809*/"RUNIC LETTER RAIDO RAD REID R"/* 16B1 */, /*5810*/"RUNIC LETTER KAUNA"/* 16B2 */,/*5811*/"RUNIC LETTER CEN"/* 16B3 */,/*5812*/"RUNIC LETTER KAUN K"/* 16B4 */, /*5813*/"RUNIC LETTER G"/* 16B5 */,/*5814*/"RUNIC LETTER ENG"/* 16B6 */,/*5815*/"RUNIC LETTER GEBO GYFU G"/* 16B7 */, /*5816*/"RUNIC LETTER GAR"/* 16B8 */,/*5817*/"RUNIC LETTER WUNJO WYNN W"/* 16B9 */, /*5818*/"RUNIC LETTER HAGLAZ H"/* 16BA */,/*5819*/"RUNIC LETTER HAEGL H"/* 16BB */, /*5820*/"RUNIC LETTER LONG-BRANCH-HAGALL H"/* 16BC */,/*5821*/"RUNIC LETTER SHORT-TWIG-HAGALL H"/* 16BD */, /*5822*/"RUNIC LETTER NAUDIZ NYD NAUD N"/* 16BE */,/*5823*/"RUNIC LETTER SHORT-TWIG-NAUD N"/* 16BF */, /*5824*/"RUNIC LETTER DOTTED-N"/* 16C0 */,/*5825*/"RUNIC LETTER ISAZ IS ISS I"/* 16C1 */, /*5826*/"RUNIC LETTER E"/* 16C2 */,/*5827*/"RUNIC LETTER JERAN J"/* 16C3 */,/*5828*/"RUNIC LETTER GER"/* 16C4 */, /*5829*/"RUNIC LETTER LONG-BRANCH-AR AE"/* 16C5 */,/*5830*/"RUNIC LETTER SHORT-TWIG-AR A"/* 16C6 */, /*5831*/"RUNIC LETTER IWAZ EOH"/* 16C7 */,/*5832*/"RUNIC LETTER PERTHO PEORTH P"/* 16C8 */, /*5833*/"RUNIC LETTER ALGIZ EOLHX"/* 16C9 */,/*5834*/"RUNIC LETTER SOWILO S"/* 16CA */, /*5835*/"RUNIC LETTER SIGEL LONG-BRANCH-SOL S"/* 16CB */,/*5836*/"RUNIC LETTER SHORT-TWIG-SOL S"/* 16CC */, /*5837*/"RUNIC LETTER C"/* 16CD */,/*5838*/"RUNIC LETTER Z"/* 16CE */,/*5839*/"RUNIC LETTER TIWAZ TIR TYR T"/* 16CF */, /*5840*/"RUNIC LETTER SHORT-TWIG-TYR T"/* 16D0 */,/*5841*/"RUNIC LETTER D"/* 16D1 */, /*5842*/"RUNIC LETTER BERKANAN BEORC BJARKAN B"/* 16D2 */,/*5843*/"RUNIC LETTER SHORT-TWIG-BJARKAN B"/* 16D3 */, /*5844*/"RUNIC LETTER DOTTED-P"/* 16D4 */,/*5845*/"RUNIC LETTER OPEN-P"/* 16D5 */, /*5846*/"RUNIC LETTER EHWAZ EH E"/* 16D6 */,/*5847*/"RUNIC LETTER MANNAZ MAN M"/* 16D7 */, /*5848*/"RUNIC LETTER LONG-BRANCH-MADR M"/* 16D8 */,/*5849*/"RUNIC LETTER SHORT-TWIG-MADR M"/* 16D9 */, /*5850*/"RUNIC LETTER LAUKAZ LAGU LOGR L"/* 16DA */,/*5851*/"RUNIC LETTER DOTTED-L"/* 16DB */, /*5852*/"RUNIC LETTER INGWAZ"/* 16DC */,/*5853*/"RUNIC LETTER ING"/* 16DD */, /*5854*/"RUNIC LETTER DAGAZ DAEG D"/* 16DE */,/*5855*/"RUNIC LETTER OTHALAN ETHEL O"/* 16DF */, /*5856*/"RUNIC LETTER EAR"/* 16E0 */,/*5857*/"RUNIC LETTER IOR"/* 16E1 */,/*5858*/"RUNIC LETTER CWEORTH"/* 16E2 */, /*5859*/"RUNIC LETTER CALC"/* 16E3 */,/*5860*/"RUNIC LETTER CEALC"/* 16E4 */,/*5861*/"RUNIC LETTER STAN"/* 16E5 */, /*5862*/"RUNIC LETTER LONG-BRANCH-YR"/* 16E6 */,/*5863*/"RUNIC LETTER SHORT-TWIG-YR"/* 16E7 */, /*5864*/"RUNIC LETTER ICELANDIC-YR"/* 16E8 */,/*5865*/"RUNIC LETTER Q"/* 16E9 */,/*5866*/"RUNIC LETTER X"/* 16EA */, /*5867*/"RUNIC SINGLE PUNCTUATION"/* 16EB */,/*5868*/"RUNIC MULTIPLE PUNCTUATION"/* 16EC */, /*5869*/"RUNIC CROSS PUNCTUATION"/* 16ED */,/*5870*/"RUNIC ARLAUG SYMBOL"/* 16EE */, /*5871*/"RUNIC TVIMADUR SYMBOL"/* 16EF */,/*5872*/"RUNIC BELGTHOR SYMBOL"/* 16F0 */,/*5873*/"RUNIC LETTER K"/* 16F1 */, /*5874*/"RUNIC LETTER SH"/* 16F2 */,/*5875*/"RUNIC LETTER OO"/* 16F3 */, /*5876*/"RUNIC LETTER FRANKS CASKET OS"/* 16F4 */,/*5877*/"RUNIC LETTER FRANKS CASKET IS"/* 16F5 */, /*5878*/"RUNIC LETTER FRANKS CASKET EH"/* 16F6 */,/*5879*/"RUNIC LETTER FRANKS CASKET AC"/* 16F7 */, /*5880*/"RUNIC LETTER FRANKS CASKET AESC"/* 16F8 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*5888*/"TAGALOG LETTER A"/* 1700 */,/*5889*/"TAGALOG LETTER I"/* 1701 */,/*5890*/"TAGALOG LETTER U"/* 1702 */, /*5891*/"TAGALOG LETTER KA"/* 1703 */,/*5892*/"TAGALOG LETTER GA"/* 1704 */,/*5893*/"TAGALOG LETTER NGA"/* 1705 */, /*5894*/"TAGALOG LETTER TA"/* 1706 */,/*5895*/"TAGALOG LETTER DA"/* 1707 */,/*5896*/"TAGALOG LETTER NA"/* 1708 */, /*5897*/"TAGALOG LETTER PA"/* 1709 */,/*5898*/"TAGALOG LETTER BA"/* 170A */,/*5899*/"TAGALOG LETTER MA"/* 170B */, /*5900*/"TAGALOG LETTER YA"/* 170C */,NULL,/*5902*/"TAGALOG LETTER LA"/* 170E */,/*5903*/"TAGALOG LETTER WA"/* 170F */, /*5904*/"TAGALOG LETTER SA"/* 1710 */,/*5905*/"TAGALOG LETTER HA"/* 1711 */,/*5906*/"TAGALOG VOWEL SIGN I"/* 1712 */, /*5907*/"TAGALOG VOWEL SIGN U"/* 1713 */,/*5908*/"TAGALOG SIGN VIRAMA"/* 1714 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*5920*/"HANUNOO LETTER A"/* 1720 */,/*5921*/"HANUNOO LETTER I"/* 1721 */, /*5922*/"HANUNOO LETTER U"/* 1722 */,/*5923*/"HANUNOO LETTER KA"/* 1723 */,/*5924*/"HANUNOO LETTER GA"/* 1724 */, /*5925*/"HANUNOO LETTER NGA"/* 1725 */,/*5926*/"HANUNOO LETTER TA"/* 1726 */,/*5927*/"HANUNOO LETTER DA"/* 1727 */, /*5928*/"HANUNOO LETTER NA"/* 1728 */,/*5929*/"HANUNOO LETTER PA"/* 1729 */,/*5930*/"HANUNOO LETTER BA"/* 172A */, /*5931*/"HANUNOO LETTER MA"/* 172B */,/*5932*/"HANUNOO LETTER YA"/* 172C */,/*5933*/"HANUNOO LETTER RA"/* 172D */, /*5934*/"HANUNOO LETTER LA"/* 172E */,/*5935*/"HANUNOO LETTER WA"/* 172F */,/*5936*/"HANUNOO LETTER SA"/* 1730 */, /*5937*/"HANUNOO LETTER HA"/* 1731 */,/*5938*/"HANUNOO VOWEL SIGN I"/* 1732 */,/*5939*/"HANUNOO VOWEL SIGN U"/* 1733 */, /*5940*/"HANUNOO SIGN PAMUDPOD"/* 1734 */,/*5941*/"PHILIPPINE SINGLE PUNCTUATION"/* 1735 */, /*5942*/"PHILIPPINE DOUBLE PUNCTUATION"/* 1736 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*5952*/"BUHID LETTER A"/* 1740 */,/*5953*/"BUHID LETTER I"/* 1741 */,/*5954*/"BUHID LETTER U"/* 1742 */, /*5955*/"BUHID LETTER KA"/* 1743 */,/*5956*/"BUHID LETTER GA"/* 1744 */,/*5957*/"BUHID LETTER NGA"/* 1745 */, /*5958*/"BUHID LETTER TA"/* 1746 */,/*5959*/"BUHID LETTER DA"/* 1747 */,/*5960*/"BUHID LETTER NA"/* 1748 */, /*5961*/"BUHID LETTER PA"/* 1749 */,/*5962*/"BUHID LETTER BA"/* 174A */,/*5963*/"BUHID LETTER MA"/* 174B */, /*5964*/"BUHID LETTER YA"/* 174C */,/*5965*/"BUHID LETTER RA"/* 174D */,/*5966*/"BUHID LETTER LA"/* 174E */, /*5967*/"BUHID LETTER WA"/* 174F */,/*5968*/"BUHID LETTER SA"/* 1750 */,/*5969*/"BUHID LETTER HA"/* 1751 */, /*5970*/"BUHID VOWEL SIGN I"/* 1752 */,/*5971*/"BUHID VOWEL SIGN U"/* 1753 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*5984*/"TAGBANWA LETTER A"/* 1760 */,/*5985*/"TAGBANWA LETTER I"/* 1761 */, /*5986*/"TAGBANWA LETTER U"/* 1762 */,/*5987*/"TAGBANWA LETTER KA"/* 1763 */,/*5988*/"TAGBANWA LETTER GA"/* 1764 */, /*5989*/"TAGBANWA LETTER NGA"/* 1765 */,/*5990*/"TAGBANWA LETTER TA"/* 1766 */,/*5991*/"TAGBANWA LETTER DA"/* 1767 */, /*5992*/"TAGBANWA LETTER NA"/* 1768 */,/*5993*/"TAGBANWA LETTER PA"/* 1769 */,/*5994*/"TAGBANWA LETTER BA"/* 176A */, /*5995*/"TAGBANWA LETTER MA"/* 176B */,/*5996*/"TAGBANWA LETTER YA"/* 176C */,NULL, /*5998*/"TAGBANWA LETTER LA"/* 176E */,/*5999*/"TAGBANWA LETTER WA"/* 176F */,/*6000*/"TAGBANWA LETTER SA"/* 1770 */, NULL,/*6002*/"TAGBANWA VOWEL SIGN I"/* 1772 */,/*6003*/"TAGBANWA VOWEL SIGN U"/* 1773 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*6016*/"KHMER LETTER KA"/* 1780 */,/*6017*/"KHMER LETTER KHA"/* 1781 */, /*6018*/"KHMER LETTER KO"/* 1782 */,/*6019*/"KHMER LETTER KHO"/* 1783 */,/*6020*/"KHMER LETTER NGO"/* 1784 */, /*6021*/"KHMER LETTER CA"/* 1785 */,/*6022*/"KHMER LETTER CHA"/* 1786 */,/*6023*/"KHMER LETTER CO"/* 1787 */, /*6024*/"KHMER LETTER CHO"/* 1788 */,/*6025*/"KHMER LETTER NYO"/* 1789 */,/*6026*/"KHMER LETTER DA"/* 178A */, /*6027*/"KHMER LETTER TTHA"/* 178B */,/*6028*/"KHMER LETTER DO"/* 178C */,/*6029*/"KHMER LETTER TTHO"/* 178D */, /*6030*/"KHMER LETTER NNO"/* 178E */,/*6031*/"KHMER LETTER TA"/* 178F */,/*6032*/"KHMER LETTER THA"/* 1790 */, /*6033*/"KHMER LETTER TO"/* 1791 */,/*6034*/"KHMER LETTER THO"/* 1792 */,/*6035*/"KHMER LETTER NO"/* 1793 */, /*6036*/"KHMER LETTER BA"/* 1794 */,/*6037*/"KHMER LETTER PHA"/* 1795 */,/*6038*/"KHMER LETTER PO"/* 1796 */, /*6039*/"KHMER LETTER PHO"/* 1797 */,/*6040*/"KHMER LETTER MO"/* 1798 */,/*6041*/"KHMER LETTER YO"/* 1799 */, /*6042*/"KHMER LETTER RO"/* 179A */,/*6043*/"KHMER LETTER LO"/* 179B */,/*6044*/"KHMER LETTER VO"/* 179C */, /*6045*/"KHMER LETTER SHA"/* 179D */,/*6046*/"KHMER LETTER SSO"/* 179E */,/*6047*/"KHMER LETTER SA"/* 179F */, /*6048*/"KHMER LETTER HA"/* 17A0 */,/*6049*/"KHMER LETTER LA"/* 17A1 */,/*6050*/"KHMER LETTER QA"/* 17A2 */, /*6051*/"KHMER INDEPENDENT VOWEL QAQ"/* 17A3 */,/*6052*/"KHMER INDEPENDENT VOWEL QAA"/* 17A4 */, /*6053*/"KHMER INDEPENDENT VOWEL QI"/* 17A5 */,/*6054*/"KHMER INDEPENDENT VOWEL QII"/* 17A6 */, /*6055*/"KHMER INDEPENDENT VOWEL QU"/* 17A7 */,/*6056*/"KHMER INDEPENDENT VOWEL QUK"/* 17A8 */, /*6057*/"KHMER INDEPENDENT VOWEL QUU"/* 17A9 */,/*6058*/"KHMER INDEPENDENT VOWEL QUUV"/* 17AA */, /*6059*/"KHMER INDEPENDENT VOWEL RY"/* 17AB */,/*6060*/"KHMER INDEPENDENT VOWEL RYY"/* 17AC */, /*6061*/"KHMER INDEPENDENT VOWEL LY"/* 17AD */,/*6062*/"KHMER INDEPENDENT VOWEL LYY"/* 17AE */, /*6063*/"KHMER INDEPENDENT VOWEL QE"/* 17AF */,/*6064*/"KHMER INDEPENDENT VOWEL QAI"/* 17B0 */, /*6065*/"KHMER INDEPENDENT VOWEL QOO TYPE ONE"/* 17B1 */,/*6066*/"KHMER INDEPENDENT VOWEL QOO TYPE TWO"/* 17B2 */, /*6067*/"KHMER INDEPENDENT VOWEL QAU"/* 17B3 */,/*6068*/"KHMER VOWEL INHERENT AQ"/* 17B4 */, /*6069*/"KHMER VOWEL INHERENT AA"/* 17B5 */,/*6070*/"KHMER VOWEL SIGN AA"/* 17B6 */, /*6071*/"KHMER VOWEL SIGN I"/* 17B7 */,/*6072*/"KHMER VOWEL SIGN II"/* 17B8 */,/*6073*/"KHMER VOWEL SIGN Y"/* 17B9 */, /*6074*/"KHMER VOWEL SIGN YY"/* 17BA */,/*6075*/"KHMER VOWEL SIGN U"/* 17BB */,/*6076*/"KHMER VOWEL SIGN UU"/* 17BC */, /*6077*/"KHMER VOWEL SIGN UA"/* 17BD */,/*6078*/"KHMER VOWEL SIGN OE"/* 17BE */,/*6079*/"KHMER VOWEL SIGN YA"/* 17BF */, /*6080*/"KHMER VOWEL SIGN IE"/* 17C0 */,/*6081*/"KHMER VOWEL SIGN E"/* 17C1 */,/*6082*/"KHMER VOWEL SIGN AE"/* 17C2 */, /*6083*/"KHMER VOWEL SIGN AI"/* 17C3 */,/*6084*/"KHMER VOWEL SIGN OO"/* 17C4 */,/*6085*/"KHMER VOWEL SIGN AU"/* 17C5 */, /*6086*/"KHMER SIGN NIKAHIT"/* 17C6 */,/*6087*/"KHMER SIGN REAHMUK"/* 17C7 */, /*6088*/"KHMER SIGN YUUKALEAPINTU"/* 17C8 */,/*6089*/"KHMER SIGN MUUSIKATOAN"/* 17C9 */, /*6090*/"KHMER SIGN TRIISAP"/* 17CA */,/*6091*/"KHMER SIGN BANTOC"/* 17CB */,/*6092*/"KHMER SIGN ROBAT"/* 17CC */, /*6093*/"KHMER SIGN TOANDAKHIAT"/* 17CD */,/*6094*/"KHMER SIGN KAKABAT"/* 17CE */,/*6095*/"KHMER SIGN AHSDA"/* 17CF */, /*6096*/"KHMER SIGN SAMYOK SANNYA"/* 17D0 */,/*6097*/"KHMER SIGN VIRIAM"/* 17D1 */,/*6098*/"KHMER SIGN COENG"/* 17D2 */, /*6099*/"KHMER SIGN BATHAMASAT"/* 17D3 */,/*6100*/"KHMER SIGN KHAN"/* 17D4 */,/*6101*/"KHMER SIGN BARIYOOSAN"/* 17D5 */, /*6102*/"KHMER SIGN CAMNUC PII KUUH"/* 17D6 */,/*6103*/"KHMER SIGN LEK TOO"/* 17D7 */, /*6104*/"KHMER SIGN BEYYAL"/* 17D8 */,/*6105*/"KHMER SIGN PHNAEK MUAN"/* 17D9 */,/*6106*/"KHMER SIGN KOOMUUT"/* 17DA */, /*6107*/"KHMER CURRENCY SYMBOL RIEL"/* 17DB */,/*6108*/"KHMER SIGN AVAKRAHASANYA"/* 17DC */, /*6109*/"KHMER SIGN ATTHACAN"/* 17DD */,NULL,NULL,/*6112*/"KHMER DIGIT ZERO"/* 17E0 */, /*6113*/"KHMER DIGIT ONE"/* 17E1 */,/*6114*/"KHMER DIGIT TWO"/* 17E2 */,/*6115*/"KHMER DIGIT THREE"/* 17E3 */, /*6116*/"KHMER DIGIT FOUR"/* 17E4 */,/*6117*/"KHMER DIGIT FIVE"/* 17E5 */,/*6118*/"KHMER DIGIT SIX"/* 17E6 */, /*6119*/"KHMER DIGIT SEVEN"/* 17E7 */,/*6120*/"KHMER DIGIT EIGHT"/* 17E8 */,/*6121*/"KHMER DIGIT NINE"/* 17E9 */,NULL, NULL,NULL,NULL,NULL,NULL,/*6128*/"KHMER SYMBOL LEK ATTAK SON"/* 17F0 */,/*6129*/"KHMER SYMBOL LEK ATTAK MUOY"/* 17F1 */, /*6130*/"KHMER SYMBOL LEK ATTAK PII"/* 17F2 */,/*6131*/"KHMER SYMBOL LEK ATTAK BEI"/* 17F3 */, /*6132*/"KHMER SYMBOL LEK ATTAK BUON"/* 17F4 */,/*6133*/"KHMER SYMBOL LEK ATTAK PRAM"/* 17F5 */, /*6134*/"KHMER SYMBOL LEK ATTAK PRAM-MUOY"/* 17F6 */,/*6135*/"KHMER SYMBOL LEK ATTAK PRAM-PII"/* 17F7 */, /*6136*/"KHMER SYMBOL LEK ATTAK PRAM-BEI"/* 17F8 */,/*6137*/"KHMER SYMBOL LEK ATTAK PRAM-BUON"/* 17F9 */,NULL,NULL,NULL, NULL,NULL,NULL,/*6144*/"MONGOLIAN BIRGA"/* 1800 */,/*6145*/"MONGOLIAN ELLIPSIS"/* 1801 */, /*6146*/"MONGOLIAN COMMA"/* 1802 */,/*6147*/"MONGOLIAN FULL STOP"/* 1803 */,/*6148*/"MONGOLIAN COLON"/* 1804 */, /*6149*/"MONGOLIAN FOUR DOTS"/* 1805 */,/*6150*/"MONGOLIAN TODO SOFT HYPHEN"/* 1806 */, /*6151*/"MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER"/* 1807 */,/*6152*/"MONGOLIAN MANCHU COMMA"/* 1808 */, /*6153*/"MONGOLIAN MANCHU FULL STOP"/* 1809 */,/*6154*/"MONGOLIAN NIRUGU"/* 180A */, /*6155*/"MONGOLIAN FREE VARIATION SELECTOR ONE"/* 180B */,/*6156*/"MONGOLIAN FREE VARIATION SELECTOR TWO"/* 180C */, /*6157*/"MONGOLIAN FREE VARIATION SELECTOR THREE"/* 180D */,/*6158*/"MONGOLIAN VOWEL SEPARATOR"/* 180E */,NULL, /*6160*/"MONGOLIAN DIGIT ZERO"/* 1810 */,/*6161*/"MONGOLIAN DIGIT ONE"/* 1811 */,/*6162*/"MONGOLIAN DIGIT TWO"/* 1812 */, /*6163*/"MONGOLIAN DIGIT THREE"/* 1813 */,/*6164*/"MONGOLIAN DIGIT FOUR"/* 1814 */, /*6165*/"MONGOLIAN DIGIT FIVE"/* 1815 */,/*6166*/"MONGOLIAN DIGIT SIX"/* 1816 */, /*6167*/"MONGOLIAN DIGIT SEVEN"/* 1817 */,/*6168*/"MONGOLIAN DIGIT EIGHT"/* 1818 */, /*6169*/"MONGOLIAN DIGIT NINE"/* 1819 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6176*/"MONGOLIAN LETTER A"/* 1820 */, /*6177*/"MONGOLIAN LETTER E"/* 1821 */,/*6178*/"MONGOLIAN LETTER I"/* 1822 */,/*6179*/"MONGOLIAN LETTER O"/* 1823 */, /*6180*/"MONGOLIAN LETTER U"/* 1824 */,/*6181*/"MONGOLIAN LETTER OE"/* 1825 */,/*6182*/"MONGOLIAN LETTER UE"/* 1826 */, /*6183*/"MONGOLIAN LETTER EE"/* 1827 */,/*6184*/"MONGOLIAN LETTER NA"/* 1828 */,/*6185*/"MONGOLIAN LETTER ANG"/* 1829 */, /*6186*/"MONGOLIAN LETTER BA"/* 182A */,/*6187*/"MONGOLIAN LETTER PA"/* 182B */,/*6188*/"MONGOLIAN LETTER QA"/* 182C */, /*6189*/"MONGOLIAN LETTER GA"/* 182D */,/*6190*/"MONGOLIAN LETTER MA"/* 182E */,/*6191*/"MONGOLIAN LETTER LA"/* 182F */, /*6192*/"MONGOLIAN LETTER SA"/* 1830 */,/*6193*/"MONGOLIAN LETTER SHA"/* 1831 */,/*6194*/"MONGOLIAN LETTER TA"/* 1832 */, /*6195*/"MONGOLIAN LETTER DA"/* 1833 */,/*6196*/"MONGOLIAN LETTER CHA"/* 1834 */,/*6197*/"MONGOLIAN LETTER JA"/* 1835 */, /*6198*/"MONGOLIAN LETTER YA"/* 1836 */,/*6199*/"MONGOLIAN LETTER RA"/* 1837 */,/*6200*/"MONGOLIAN LETTER WA"/* 1838 */, /*6201*/"MONGOLIAN LETTER FA"/* 1839 */,/*6202*/"MONGOLIAN LETTER KA"/* 183A */,/*6203*/"MONGOLIAN LETTER KHA"/* 183B */, /*6204*/"MONGOLIAN LETTER TSA"/* 183C */,/*6205*/"MONGOLIAN LETTER ZA"/* 183D */, /*6206*/"MONGOLIAN LETTER HAA"/* 183E */,/*6207*/"MONGOLIAN LETTER ZRA"/* 183F */, /*6208*/"MONGOLIAN LETTER LHA"/* 1840 */,/*6209*/"MONGOLIAN LETTER ZHI"/* 1841 */, /*6210*/"MONGOLIAN LETTER CHI"/* 1842 */,/*6211*/"MONGOLIAN LETTER TODO LONG VOWEL SIGN"/* 1843 */, /*6212*/"MONGOLIAN LETTER TODO E"/* 1844 */,/*6213*/"MONGOLIAN LETTER TODO I"/* 1845 */, /*6214*/"MONGOLIAN LETTER TODO O"/* 1846 */,/*6215*/"MONGOLIAN LETTER TODO U"/* 1847 */, /*6216*/"MONGOLIAN LETTER TODO OE"/* 1848 */,/*6217*/"MONGOLIAN LETTER TODO UE"/* 1849 */, /*6218*/"MONGOLIAN LETTER TODO ANG"/* 184A */,/*6219*/"MONGOLIAN LETTER TODO BA"/* 184B */, /*6220*/"MONGOLIAN LETTER TODO PA"/* 184C */,/*6221*/"MONGOLIAN LETTER TODO QA"/* 184D */, /*6222*/"MONGOLIAN LETTER TODO GA"/* 184E */,/*6223*/"MONGOLIAN LETTER TODO MA"/* 184F */, /*6224*/"MONGOLIAN LETTER TODO TA"/* 1850 */,/*6225*/"MONGOLIAN LETTER TODO DA"/* 1851 */, /*6226*/"MONGOLIAN LETTER TODO CHA"/* 1852 */,/*6227*/"MONGOLIAN LETTER TODO JA"/* 1853 */, /*6228*/"MONGOLIAN LETTER TODO TSA"/* 1854 */,/*6229*/"MONGOLIAN LETTER TODO YA"/* 1855 */, /*6230*/"MONGOLIAN LETTER TODO WA"/* 1856 */,/*6231*/"MONGOLIAN LETTER TODO KA"/* 1857 */, /*6232*/"MONGOLIAN LETTER TODO GAA"/* 1858 */,/*6233*/"MONGOLIAN LETTER TODO HAA"/* 1859 */, /*6234*/"MONGOLIAN LETTER TODO JIA"/* 185A */,/*6235*/"MONGOLIAN LETTER TODO NIA"/* 185B */, /*6236*/"MONGOLIAN LETTER TODO DZA"/* 185C */,/*6237*/"MONGOLIAN LETTER SIBE E"/* 185D */, /*6238*/"MONGOLIAN LETTER SIBE I"/* 185E */,/*6239*/"MONGOLIAN LETTER SIBE IY"/* 185F */, /*6240*/"MONGOLIAN LETTER SIBE UE"/* 1860 */,/*6241*/"MONGOLIAN LETTER SIBE U"/* 1861 */, /*6242*/"MONGOLIAN LETTER SIBE ANG"/* 1862 */,/*6243*/"MONGOLIAN LETTER SIBE KA"/* 1863 */, /*6244*/"MONGOLIAN LETTER SIBE GA"/* 1864 */,/*6245*/"MONGOLIAN LETTER SIBE HA"/* 1865 */, /*6246*/"MONGOLIAN LETTER SIBE PA"/* 1866 */,/*6247*/"MONGOLIAN LETTER SIBE SHA"/* 1867 */, /*6248*/"MONGOLIAN LETTER SIBE TA"/* 1868 */,/*6249*/"MONGOLIAN LETTER SIBE DA"/* 1869 */, /*6250*/"MONGOLIAN LETTER SIBE JA"/* 186A */,/*6251*/"MONGOLIAN LETTER SIBE FA"/* 186B */, /*6252*/"MONGOLIAN LETTER SIBE GAA"/* 186C */,/*6253*/"MONGOLIAN LETTER SIBE HAA"/* 186D */, /*6254*/"MONGOLIAN LETTER SIBE TSA"/* 186E */,/*6255*/"MONGOLIAN LETTER SIBE ZA"/* 186F */, /*6256*/"MONGOLIAN LETTER SIBE RAA"/* 1870 */,/*6257*/"MONGOLIAN LETTER SIBE CHA"/* 1871 */, /*6258*/"MONGOLIAN LETTER SIBE ZHA"/* 1872 */,/*6259*/"MONGOLIAN LETTER MANCHU I"/* 1873 */, /*6260*/"MONGOLIAN LETTER MANCHU KA"/* 1874 */,/*6261*/"MONGOLIAN LETTER MANCHU RA"/* 1875 */, /*6262*/"MONGOLIAN LETTER MANCHU FA"/* 1876 */,/*6263*/"MONGOLIAN LETTER MANCHU ZHA"/* 1877 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*6272*/"MONGOLIAN LETTER ALI GALI ANUSVARA ONE"/* 1880 */, /*6273*/"MONGOLIAN LETTER ALI GALI VISARGA ONE"/* 1881 */,/*6274*/"MONGOLIAN LETTER ALI GALI DAMARU"/* 1882 */, /*6275*/"MONGOLIAN LETTER ALI GALI UBADAMA"/* 1883 */,/*6276*/"MONGOLIAN LETTER ALI GALI INVERTED UBADAMA"/* 1884 */, /*6277*/"MONGOLIAN LETTER ALI GALI BALUDA"/* 1885 */,/*6278*/"MONGOLIAN LETTER ALI GALI THREE BALUDA"/* 1886 */, /*6279*/"MONGOLIAN LETTER ALI GALI A"/* 1887 */,/*6280*/"MONGOLIAN LETTER ALI GALI I"/* 1888 */, /*6281*/"MONGOLIAN LETTER ALI GALI KA"/* 1889 */,/*6282*/"MONGOLIAN LETTER ALI GALI NGA"/* 188A */, /*6283*/"MONGOLIAN LETTER ALI GALI CA"/* 188B */,/*6284*/"MONGOLIAN LETTER ALI GALI TTA"/* 188C */, /*6285*/"MONGOLIAN LETTER ALI GALI TTHA"/* 188D */,/*6286*/"MONGOLIAN LETTER ALI GALI DDA"/* 188E */, /*6287*/"MONGOLIAN LETTER ALI GALI NNA"/* 188F */,/*6288*/"MONGOLIAN LETTER ALI GALI TA"/* 1890 */, /*6289*/"MONGOLIAN LETTER ALI GALI DA"/* 1891 */,/*6290*/"MONGOLIAN LETTER ALI GALI PA"/* 1892 */, /*6291*/"MONGOLIAN LETTER ALI GALI PHA"/* 1893 */,/*6292*/"MONGOLIAN LETTER ALI GALI SSA"/* 1894 */, /*6293*/"MONGOLIAN LETTER ALI GALI ZHA"/* 1895 */,/*6294*/"MONGOLIAN LETTER ALI GALI ZA"/* 1896 */, /*6295*/"MONGOLIAN LETTER ALI GALI AH"/* 1897 */,/*6296*/"MONGOLIAN LETTER TODO ALI GALI TA"/* 1898 */, /*6297*/"MONGOLIAN LETTER TODO ALI GALI ZHA"/* 1899 */,/*6298*/"MONGOLIAN LETTER MANCHU ALI GALI GHA"/* 189A */, /*6299*/"MONGOLIAN LETTER MANCHU ALI GALI NGA"/* 189B */,/*6300*/"MONGOLIAN LETTER MANCHU ALI GALI CA"/* 189C */, /*6301*/"MONGOLIAN LETTER MANCHU ALI GALI JHA"/* 189D */,/*6302*/"MONGOLIAN LETTER MANCHU ALI GALI TTA"/* 189E */, /*6303*/"MONGOLIAN LETTER MANCHU ALI GALI DDHA"/* 189F */,/*6304*/"MONGOLIAN LETTER MANCHU ALI GALI TA"/* 18A0 */, /*6305*/"MONGOLIAN LETTER MANCHU ALI GALI DHA"/* 18A1 */,/*6306*/"MONGOLIAN LETTER MANCHU ALI GALI SSA"/* 18A2 */, /*6307*/"MONGOLIAN LETTER MANCHU ALI GALI CYA"/* 18A3 */,/*6308*/"MONGOLIAN LETTER MANCHU ALI GALI ZHA"/* 18A4 */, /*6309*/"MONGOLIAN LETTER MANCHU ALI GALI ZA"/* 18A5 */,/*6310*/"MONGOLIAN LETTER ALI GALI HALF U"/* 18A6 */, /*6311*/"MONGOLIAN LETTER ALI GALI HALF YA"/* 18A7 */,/*6312*/"MONGOLIAN LETTER MANCHU ALI GALI BHA"/* 18A8 */, /*6313*/"MONGOLIAN LETTER ALI GALI DAGALGA"/* 18A9 */,/*6314*/"MONGOLIAN LETTER MANCHU ALI GALI LHA"/* 18AA */,NULL,NULL, NULL,NULL,NULL,/*6320*/"CANADIAN SYLLABICS OY"/* 18B0 */,/*6321*/"CANADIAN SYLLABICS AY"/* 18B1 */, /*6322*/"CANADIAN SYLLABICS AAY"/* 18B2 */,/*6323*/"CANADIAN SYLLABICS WAY"/* 18B3 */, /*6324*/"CANADIAN SYLLABICS POY"/* 18B4 */,/*6325*/"CANADIAN SYLLABICS PAY"/* 18B5 */, /*6326*/"CANADIAN SYLLABICS PWOY"/* 18B6 */,/*6327*/"CANADIAN SYLLABICS TAY"/* 18B7 */, /*6328*/"CANADIAN SYLLABICS KAY"/* 18B8 */,/*6329*/"CANADIAN SYLLABICS KWAY"/* 18B9 */, /*6330*/"CANADIAN SYLLABICS MAY"/* 18BA */,/*6331*/"CANADIAN SYLLABICS NOY"/* 18BB */, /*6332*/"CANADIAN SYLLABICS NAY"/* 18BC */,/*6333*/"CANADIAN SYLLABICS LAY"/* 18BD */, /*6334*/"CANADIAN SYLLABICS SOY"/* 18BE */,/*6335*/"CANADIAN SYLLABICS SAY"/* 18BF */, /*6336*/"CANADIAN SYLLABICS SHOY"/* 18C0 */,/*6337*/"CANADIAN SYLLABICS SHAY"/* 18C1 */, /*6338*/"CANADIAN SYLLABICS SHWOY"/* 18C2 */,/*6339*/"CANADIAN SYLLABICS YOY"/* 18C3 */, /*6340*/"CANADIAN SYLLABICS YAY"/* 18C4 */,/*6341*/"CANADIAN SYLLABICS RAY"/* 18C5 */, /*6342*/"CANADIAN SYLLABICS NWI"/* 18C6 */,/*6343*/"CANADIAN SYLLABICS OJIBWAY NWI"/* 18C7 */, /*6344*/"CANADIAN SYLLABICS NWII"/* 18C8 */,/*6345*/"CANADIAN SYLLABICS OJIBWAY NWII"/* 18C9 */, /*6346*/"CANADIAN SYLLABICS NWO"/* 18CA */,/*6347*/"CANADIAN SYLLABICS OJIBWAY NWO"/* 18CB */, /*6348*/"CANADIAN SYLLABICS NWOO"/* 18CC */,/*6349*/"CANADIAN SYLLABICS OJIBWAY NWOO"/* 18CD */, /*6350*/"CANADIAN SYLLABICS RWEE"/* 18CE */,/*6351*/"CANADIAN SYLLABICS RWI"/* 18CF */, /*6352*/"CANADIAN SYLLABICS RWII"/* 18D0 */,/*6353*/"CANADIAN SYLLABICS RWO"/* 18D1 */, /*6354*/"CANADIAN SYLLABICS RWOO"/* 18D2 */,/*6355*/"CANADIAN SYLLABICS RWA"/* 18D3 */, /*6356*/"CANADIAN SYLLABICS OJIBWAY P"/* 18D4 */,/*6357*/"CANADIAN SYLLABICS OJIBWAY T"/* 18D5 */, /*6358*/"CANADIAN SYLLABICS OJIBWAY K"/* 18D6 */,/*6359*/"CANADIAN SYLLABICS OJIBWAY C"/* 18D7 */, /*6360*/"CANADIAN SYLLABICS OJIBWAY M"/* 18D8 */,/*6361*/"CANADIAN SYLLABICS OJIBWAY N"/* 18D9 */, /*6362*/"CANADIAN SYLLABICS OJIBWAY S"/* 18DA */,/*6363*/"CANADIAN SYLLABICS OJIBWAY SH"/* 18DB */, /*6364*/"CANADIAN SYLLABICS EASTERN W"/* 18DC */,/*6365*/"CANADIAN SYLLABICS WESTERN W"/* 18DD */, /*6366*/"CANADIAN SYLLABICS FINAL SMALL RING"/* 18DE */,/*6367*/"CANADIAN SYLLABICS FINAL RAISED DOT"/* 18DF */, /*6368*/"CANADIAN SYLLABICS R-CREE RWE"/* 18E0 */,/*6369*/"CANADIAN SYLLABICS WEST-CREE LOO"/* 18E1 */, /*6370*/"CANADIAN SYLLABICS WEST-CREE LAA"/* 18E2 */,/*6371*/"CANADIAN SYLLABICS THWE"/* 18E3 */, /*6372*/"CANADIAN SYLLABICS THWA"/* 18E4 */,/*6373*/"CANADIAN SYLLABICS TTHWE"/* 18E5 */, /*6374*/"CANADIAN SYLLABICS TTHOO"/* 18E6 */,/*6375*/"CANADIAN SYLLABICS TTHAA"/* 18E7 */, /*6376*/"CANADIAN SYLLABICS TLHWE"/* 18E8 */,/*6377*/"CANADIAN SYLLABICS TLHOO"/* 18E9 */, /*6378*/"CANADIAN SYLLABICS SAYISI SHWE"/* 18EA */,/*6379*/"CANADIAN SYLLABICS SAYISI SHOO"/* 18EB */, /*6380*/"CANADIAN SYLLABICS SAYISI HOO"/* 18EC */,/*6381*/"CANADIAN SYLLABICS CARRIER GWU"/* 18ED */, /*6382*/"CANADIAN SYLLABICS CARRIER DENE GEE"/* 18EE */,/*6383*/"CANADIAN SYLLABICS CARRIER GAA"/* 18EF */, /*6384*/"CANADIAN SYLLABICS CARRIER GWA"/* 18F0 */,/*6385*/"CANADIAN SYLLABICS SAYISI JUU"/* 18F1 */, /*6386*/"CANADIAN SYLLABICS CARRIER JWA"/* 18F2 */,/*6387*/"CANADIAN SYLLABICS BEAVER DENE L"/* 18F3 */, /*6388*/"CANADIAN SYLLABICS BEAVER DENE R"/* 18F4 */,/*6389*/"CANADIAN SYLLABICS CARRIER DENTAL S"/* 18F5 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*6400*/"LIMBU VOWEL-CARRIER LETTER"/* 1900 */, /*6401*/"LIMBU LETTER KA"/* 1901 */,/*6402*/"LIMBU LETTER KHA"/* 1902 */,/*6403*/"LIMBU LETTER GA"/* 1903 */, /*6404*/"LIMBU LETTER GHA"/* 1904 */,/*6405*/"LIMBU LETTER NGA"/* 1905 */,/*6406*/"LIMBU LETTER CA"/* 1906 */, /*6407*/"LIMBU LETTER CHA"/* 1907 */,/*6408*/"LIMBU LETTER JA"/* 1908 */,/*6409*/"LIMBU LETTER JHA"/* 1909 */, /*6410*/"LIMBU LETTER YAN"/* 190A */,/*6411*/"LIMBU LETTER TA"/* 190B */,/*6412*/"LIMBU LETTER THA"/* 190C */, /*6413*/"LIMBU LETTER DA"/* 190D */,/*6414*/"LIMBU LETTER DHA"/* 190E */,/*6415*/"LIMBU LETTER NA"/* 190F */, /*6416*/"LIMBU LETTER PA"/* 1910 */,/*6417*/"LIMBU LETTER PHA"/* 1911 */,/*6418*/"LIMBU LETTER BA"/* 1912 */, /*6419*/"LIMBU LETTER BHA"/* 1913 */,/*6420*/"LIMBU LETTER MA"/* 1914 */,/*6421*/"LIMBU LETTER YA"/* 1915 */, /*6422*/"LIMBU LETTER RA"/* 1916 */,/*6423*/"LIMBU LETTER LA"/* 1917 */,/*6424*/"LIMBU LETTER WA"/* 1918 */, /*6425*/"LIMBU LETTER SHA"/* 1919 */,/*6426*/"LIMBU LETTER SSA"/* 191A */,/*6427*/"LIMBU LETTER SA"/* 191B */, /*6428*/"LIMBU LETTER HA"/* 191C */,/*6429*/"LIMBU LETTER GYAN"/* 191D */,/*6430*/"LIMBU LETTER TRA"/* 191E */,NULL, /*6432*/"LIMBU VOWEL SIGN A"/* 1920 */,/*6433*/"LIMBU VOWEL SIGN I"/* 1921 */,/*6434*/"LIMBU VOWEL SIGN U"/* 1922 */, /*6435*/"LIMBU VOWEL SIGN EE"/* 1923 */,/*6436*/"LIMBU VOWEL SIGN AI"/* 1924 */,/*6437*/"LIMBU VOWEL SIGN OO"/* 1925 */, /*6438*/"LIMBU VOWEL SIGN AU"/* 1926 */,/*6439*/"LIMBU VOWEL SIGN E"/* 1927 */,/*6440*/"LIMBU VOWEL SIGN O"/* 1928 */, /*6441*/"LIMBU SUBJOINED LETTER YA"/* 1929 */,/*6442*/"LIMBU SUBJOINED LETTER RA"/* 192A */, /*6443*/"LIMBU SUBJOINED LETTER WA"/* 192B */,NULL,NULL,NULL,NULL,/*6448*/"LIMBU SMALL LETTER KA"/* 1930 */, /*6449*/"LIMBU SMALL LETTER NGA"/* 1931 */,/*6450*/"LIMBU SMALL LETTER ANUSVARA"/* 1932 */, /*6451*/"LIMBU SMALL LETTER TA"/* 1933 */,/*6452*/"LIMBU SMALL LETTER NA"/* 1934 */, /*6453*/"LIMBU SMALL LETTER PA"/* 1935 */,/*6454*/"LIMBU SMALL LETTER MA"/* 1936 */, /*6455*/"LIMBU SMALL LETTER RA"/* 1937 */,/*6456*/"LIMBU SMALL LETTER LA"/* 1938 */, /*6457*/"LIMBU SIGN MUKPHRENG"/* 1939 */,/*6458*/"LIMBU SIGN KEMPHRENG"/* 193A */,/*6459*/"LIMBU SIGN SA-I"/* 193B */, NULL,NULL,NULL,NULL,/*6464*/"LIMBU SIGN LOO"/* 1940 */,NULL,NULL,NULL,/*6468*/"LIMBU EXCLAMATION MARK"/* 1944 */, /*6469*/"LIMBU QUESTION MARK"/* 1945 */,/*6470*/"LIMBU DIGIT ZERO"/* 1946 */,/*6471*/"LIMBU DIGIT ONE"/* 1947 */, /*6472*/"LIMBU DIGIT TWO"/* 1948 */,/*6473*/"LIMBU DIGIT THREE"/* 1949 */,/*6474*/"LIMBU DIGIT FOUR"/* 194A */, /*6475*/"LIMBU DIGIT FIVE"/* 194B */,/*6476*/"LIMBU DIGIT SIX"/* 194C */,/*6477*/"LIMBU DIGIT SEVEN"/* 194D */, /*6478*/"LIMBU DIGIT EIGHT"/* 194E */,/*6479*/"LIMBU DIGIT NINE"/* 194F */,/*6480*/"TAI LE LETTER KA"/* 1950 */, /*6481*/"TAI LE LETTER XA"/* 1951 */,/*6482*/"TAI LE LETTER NGA"/* 1952 */,/*6483*/"TAI LE LETTER TSA"/* 1953 */, /*6484*/"TAI LE LETTER SA"/* 1954 */,/*6485*/"TAI LE LETTER YA"/* 1955 */,/*6486*/"TAI LE LETTER TA"/* 1956 */, /*6487*/"TAI LE LETTER THA"/* 1957 */,/*6488*/"TAI LE LETTER LA"/* 1958 */,/*6489*/"TAI LE LETTER PA"/* 1959 */, /*6490*/"TAI LE LETTER PHA"/* 195A */,/*6491*/"TAI LE LETTER MA"/* 195B */,/*6492*/"TAI LE LETTER FA"/* 195C */, /*6493*/"TAI LE LETTER VA"/* 195D */,/*6494*/"TAI LE LETTER HA"/* 195E */,/*6495*/"TAI LE LETTER QA"/* 195F */, /*6496*/"TAI LE LETTER KHA"/* 1960 */,/*6497*/"TAI LE LETTER TSHA"/* 1961 */,/*6498*/"TAI LE LETTER NA"/* 1962 */, /*6499*/"TAI LE LETTER A"/* 1963 */,/*6500*/"TAI LE LETTER I"/* 1964 */,/*6501*/"TAI LE LETTER EE"/* 1965 */, /*6502*/"TAI LE LETTER EH"/* 1966 */,/*6503*/"TAI LE LETTER U"/* 1967 */,/*6504*/"TAI LE LETTER OO"/* 1968 */, /*6505*/"TAI LE LETTER O"/* 1969 */,/*6506*/"TAI LE LETTER UE"/* 196A */,/*6507*/"TAI LE LETTER E"/* 196B */, /*6508*/"TAI LE LETTER AUE"/* 196C */,/*6509*/"TAI LE LETTER AI"/* 196D */,NULL,NULL, /*6512*/"TAI LE LETTER TONE-2"/* 1970 */,/*6513*/"TAI LE LETTER TONE-3"/* 1971 */, /*6514*/"TAI LE LETTER TONE-4"/* 1972 */,/*6515*/"TAI LE LETTER TONE-5"/* 1973 */, /*6516*/"TAI LE LETTER TONE-6"/* 1974 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*6528*/"NEW TAI LUE LETTER HIGH QA"/* 1980 */,/*6529*/"NEW TAI LUE LETTER LOW QA"/* 1981 */, /*6530*/"NEW TAI LUE LETTER HIGH KA"/* 1982 */,/*6531*/"NEW TAI LUE LETTER HIGH XA"/* 1983 */, /*6532*/"NEW TAI LUE LETTER HIGH NGA"/* 1984 */,/*6533*/"NEW TAI LUE LETTER LOW KA"/* 1985 */, /*6534*/"NEW TAI LUE LETTER LOW XA"/* 1986 */,/*6535*/"NEW TAI LUE LETTER LOW NGA"/* 1987 */, /*6536*/"NEW TAI LUE LETTER HIGH TSA"/* 1988 */,/*6537*/"NEW TAI LUE LETTER HIGH SA"/* 1989 */, /*6538*/"NEW TAI LUE LETTER HIGH YA"/* 198A */,/*6539*/"NEW TAI LUE LETTER LOW TSA"/* 198B */, /*6540*/"NEW TAI LUE LETTER LOW SA"/* 198C */,/*6541*/"NEW TAI LUE LETTER LOW YA"/* 198D */, /*6542*/"NEW TAI LUE LETTER HIGH TA"/* 198E */,/*6543*/"NEW TAI LUE LETTER HIGH THA"/* 198F */, /*6544*/"NEW TAI LUE LETTER HIGH NA"/* 1990 */,/*6545*/"NEW TAI LUE LETTER LOW TA"/* 1991 */, /*6546*/"NEW TAI LUE LETTER LOW THA"/* 1992 */,/*6547*/"NEW TAI LUE LETTER LOW NA"/* 1993 */, /*6548*/"NEW TAI LUE LETTER HIGH PA"/* 1994 */,/*6549*/"NEW TAI LUE LETTER HIGH PHA"/* 1995 */, /*6550*/"NEW TAI LUE LETTER HIGH MA"/* 1996 */,/*6551*/"NEW TAI LUE LETTER LOW PA"/* 1997 */, /*6552*/"NEW TAI LUE LETTER LOW PHA"/* 1998 */,/*6553*/"NEW TAI LUE LETTER LOW MA"/* 1999 */, /*6554*/"NEW TAI LUE LETTER HIGH FA"/* 199A */,/*6555*/"NEW TAI LUE LETTER HIGH VA"/* 199B */, /*6556*/"NEW TAI LUE LETTER HIGH LA"/* 199C */,/*6557*/"NEW TAI LUE LETTER LOW FA"/* 199D */, /*6558*/"NEW TAI LUE LETTER LOW VA"/* 199E */,/*6559*/"NEW TAI LUE LETTER LOW LA"/* 199F */, /*6560*/"NEW TAI LUE LETTER HIGH HA"/* 19A0 */,/*6561*/"NEW TAI LUE LETTER HIGH DA"/* 19A1 */, /*6562*/"NEW TAI LUE LETTER HIGH BA"/* 19A2 */,/*6563*/"NEW TAI LUE LETTER LOW HA"/* 19A3 */, /*6564*/"NEW TAI LUE LETTER LOW DA"/* 19A4 */,/*6565*/"NEW TAI LUE LETTER LOW BA"/* 19A5 */, /*6566*/"NEW TAI LUE LETTER HIGH KVA"/* 19A6 */,/*6567*/"NEW TAI LUE LETTER HIGH XVA"/* 19A7 */, /*6568*/"NEW TAI LUE LETTER LOW KVA"/* 19A8 */,/*6569*/"NEW TAI LUE LETTER LOW XVA"/* 19A9 */, /*6570*/"NEW TAI LUE LETTER HIGH SUA"/* 19AA */,/*6571*/"NEW TAI LUE LETTER LOW SUA"/* 19AB */,NULL,NULL,NULL,NULL, /*6576*/"NEW TAI LUE VOWEL SIGN VOWEL SHORTENER"/* 19B0 */,/*6577*/"NEW TAI LUE VOWEL SIGN AA"/* 19B1 */, /*6578*/"NEW TAI LUE VOWEL SIGN II"/* 19B2 */,/*6579*/"NEW TAI LUE VOWEL SIGN U"/* 19B3 */, /*6580*/"NEW TAI LUE VOWEL SIGN UU"/* 19B4 */,/*6581*/"NEW TAI LUE VOWEL SIGN E"/* 19B5 */, /*6582*/"NEW TAI LUE VOWEL SIGN AE"/* 19B6 */,/*6583*/"NEW TAI LUE VOWEL SIGN O"/* 19B7 */, /*6584*/"NEW TAI LUE VOWEL SIGN OA"/* 19B8 */,/*6585*/"NEW TAI LUE VOWEL SIGN UE"/* 19B9 */, /*6586*/"NEW TAI LUE VOWEL SIGN AY"/* 19BA */,/*6587*/"NEW TAI LUE VOWEL SIGN AAY"/* 19BB */, /*6588*/"NEW TAI LUE VOWEL SIGN UY"/* 19BC */,/*6589*/"NEW TAI LUE VOWEL SIGN OY"/* 19BD */, /*6590*/"NEW TAI LUE VOWEL SIGN OAY"/* 19BE */,/*6591*/"NEW TAI LUE VOWEL SIGN UEY"/* 19BF */, /*6592*/"NEW TAI LUE VOWEL SIGN IY"/* 19C0 */,/*6593*/"NEW TAI LUE LETTER FINAL V"/* 19C1 */, /*6594*/"NEW TAI LUE LETTER FINAL NG"/* 19C2 */,/*6595*/"NEW TAI LUE LETTER FINAL N"/* 19C3 */, /*6596*/"NEW TAI LUE LETTER FINAL M"/* 19C4 */,/*6597*/"NEW TAI LUE LETTER FINAL K"/* 19C5 */, /*6598*/"NEW TAI LUE LETTER FINAL D"/* 19C6 */,/*6599*/"NEW TAI LUE LETTER FINAL B"/* 19C7 */, /*6600*/"NEW TAI LUE TONE MARK-1"/* 19C8 */,/*6601*/"NEW TAI LUE TONE MARK-2"/* 19C9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*6608*/"NEW TAI LUE DIGIT ZERO"/* 19D0 */,/*6609*/"NEW TAI LUE DIGIT ONE"/* 19D1 */, /*6610*/"NEW TAI LUE DIGIT TWO"/* 19D2 */,/*6611*/"NEW TAI LUE DIGIT THREE"/* 19D3 */, /*6612*/"NEW TAI LUE DIGIT FOUR"/* 19D4 */,/*6613*/"NEW TAI LUE DIGIT FIVE"/* 19D5 */, /*6614*/"NEW TAI LUE DIGIT SIX"/* 19D6 */,/*6615*/"NEW TAI LUE DIGIT SEVEN"/* 19D7 */, /*6616*/"NEW TAI LUE DIGIT EIGHT"/* 19D8 */,/*6617*/"NEW TAI LUE DIGIT NINE"/* 19D9 */, /*6618*/"NEW TAI LUE THAM DIGIT ONE"/* 19DA */,NULL,NULL,NULL,/*6622*/"NEW TAI LUE SIGN LAE"/* 19DE */, /*6623*/"NEW TAI LUE SIGN LAEV"/* 19DF */,/*6624*/"KHMER SYMBOL PATHAMASAT"/* 19E0 */, /*6625*/"KHMER SYMBOL MUOY KOET"/* 19E1 */,/*6626*/"KHMER SYMBOL PII KOET"/* 19E2 */, /*6627*/"KHMER SYMBOL BEI KOET"/* 19E3 */,/*6628*/"KHMER SYMBOL BUON KOET"/* 19E4 */, /*6629*/"KHMER SYMBOL PRAM KOET"/* 19E5 */,/*6630*/"KHMER SYMBOL PRAM-MUOY KOET"/* 19E6 */, /*6631*/"KHMER SYMBOL PRAM-PII KOET"/* 19E7 */,/*6632*/"KHMER SYMBOL PRAM-BEI KOET"/* 19E8 */, /*6633*/"KHMER SYMBOL PRAM-BUON KOET"/* 19E9 */,/*6634*/"KHMER SYMBOL DAP KOET"/* 19EA */, /*6635*/"KHMER SYMBOL DAP-MUOY KOET"/* 19EB */,/*6636*/"KHMER SYMBOL DAP-PII KOET"/* 19EC */, /*6637*/"KHMER SYMBOL DAP-BEI KOET"/* 19ED */,/*6638*/"KHMER SYMBOL DAP-BUON KOET"/* 19EE */, /*6639*/"KHMER SYMBOL DAP-PRAM KOET"/* 19EF */,/*6640*/"KHMER SYMBOL TUTEYASAT"/* 19F0 */, /*6641*/"KHMER SYMBOL MUOY ROC"/* 19F1 */,/*6642*/"KHMER SYMBOL PII ROC"/* 19F2 */, /*6643*/"KHMER SYMBOL BEI ROC"/* 19F3 */,/*6644*/"KHMER SYMBOL BUON ROC"/* 19F4 */, /*6645*/"KHMER SYMBOL PRAM ROC"/* 19F5 */,/*6646*/"KHMER SYMBOL PRAM-MUOY ROC"/* 19F6 */, /*6647*/"KHMER SYMBOL PRAM-PII ROC"/* 19F7 */,/*6648*/"KHMER SYMBOL PRAM-BEI ROC"/* 19F8 */, /*6649*/"KHMER SYMBOL PRAM-BUON ROC"/* 19F9 */,/*6650*/"KHMER SYMBOL DAP ROC"/* 19FA */, /*6651*/"KHMER SYMBOL DAP-MUOY ROC"/* 19FB */,/*6652*/"KHMER SYMBOL DAP-PII ROC"/* 19FC */, /*6653*/"KHMER SYMBOL DAP-BEI ROC"/* 19FD */,/*6654*/"KHMER SYMBOL DAP-BUON ROC"/* 19FE */, /*6655*/"KHMER SYMBOL DAP-PRAM ROC"/* 19FF */,/*6656*/"BUGINESE LETTER KA"/* 1A00 */, /*6657*/"BUGINESE LETTER GA"/* 1A01 */,/*6658*/"BUGINESE LETTER NGA"/* 1A02 */,/*6659*/"BUGINESE LETTER NGKA"/* 1A03 */, /*6660*/"BUGINESE LETTER PA"/* 1A04 */,/*6661*/"BUGINESE LETTER BA"/* 1A05 */,/*6662*/"BUGINESE LETTER MA"/* 1A06 */, /*6663*/"BUGINESE LETTER MPA"/* 1A07 */,/*6664*/"BUGINESE LETTER TA"/* 1A08 */,/*6665*/"BUGINESE LETTER DA"/* 1A09 */, /*6666*/"BUGINESE LETTER NA"/* 1A0A */,/*6667*/"BUGINESE LETTER NRA"/* 1A0B */,/*6668*/"BUGINESE LETTER CA"/* 1A0C */, /*6669*/"BUGINESE LETTER JA"/* 1A0D */,/*6670*/"BUGINESE LETTER NYA"/* 1A0E */,/*6671*/"BUGINESE LETTER NYCA"/* 1A0F */, /*6672*/"BUGINESE LETTER YA"/* 1A10 */,/*6673*/"BUGINESE LETTER RA"/* 1A11 */,/*6674*/"BUGINESE LETTER LA"/* 1A12 */, /*6675*/"BUGINESE LETTER VA"/* 1A13 */,/*6676*/"BUGINESE LETTER SA"/* 1A14 */,/*6677*/"BUGINESE LETTER A"/* 1A15 */, /*6678*/"BUGINESE LETTER HA"/* 1A16 */,/*6679*/"BUGINESE VOWEL SIGN I"/* 1A17 */, /*6680*/"BUGINESE VOWEL SIGN U"/* 1A18 */,/*6681*/"BUGINESE VOWEL SIGN E"/* 1A19 */, /*6682*/"BUGINESE VOWEL SIGN O"/* 1A1A */,/*6683*/"BUGINESE VOWEL SIGN AE"/* 1A1B */,NULL,NULL, /*6686*/"BUGINESE PALLAWA"/* 1A1E */,/*6687*/"BUGINESE END OF SECTION"/* 1A1F */, /*6688*/"TAI THAM LETTER HIGH KA"/* 1A20 */,/*6689*/"TAI THAM LETTER HIGH KHA"/* 1A21 */, /*6690*/"TAI THAM LETTER HIGH KXA"/* 1A22 */,/*6691*/"TAI THAM LETTER LOW KA"/* 1A23 */, /*6692*/"TAI THAM LETTER LOW KXA"/* 1A24 */,/*6693*/"TAI THAM LETTER LOW KHA"/* 1A25 */, /*6694*/"TAI THAM LETTER NGA"/* 1A26 */,/*6695*/"TAI THAM LETTER HIGH CA"/* 1A27 */, /*6696*/"TAI THAM LETTER HIGH CHA"/* 1A28 */,/*6697*/"TAI THAM LETTER LOW CA"/* 1A29 */, /*6698*/"TAI THAM LETTER LOW SA"/* 1A2A */,/*6699*/"TAI THAM LETTER LOW CHA"/* 1A2B */, /*6700*/"TAI THAM LETTER NYA"/* 1A2C */,/*6701*/"TAI THAM LETTER RATA"/* 1A2D */, /*6702*/"TAI THAM LETTER HIGH RATHA"/* 1A2E */,/*6703*/"TAI THAM LETTER DA"/* 1A2F */, /*6704*/"TAI THAM LETTER LOW RATHA"/* 1A30 */,/*6705*/"TAI THAM LETTER RANA"/* 1A31 */, /*6706*/"TAI THAM LETTER HIGH TA"/* 1A32 */,/*6707*/"TAI THAM LETTER HIGH THA"/* 1A33 */, /*6708*/"TAI THAM LETTER LOW TA"/* 1A34 */,/*6709*/"TAI THAM LETTER LOW THA"/* 1A35 */, /*6710*/"TAI THAM LETTER NA"/* 1A36 */,/*6711*/"TAI THAM LETTER BA"/* 1A37 */, /*6712*/"TAI THAM LETTER HIGH PA"/* 1A38 */,/*6713*/"TAI THAM LETTER HIGH PHA"/* 1A39 */, /*6714*/"TAI THAM LETTER HIGH FA"/* 1A3A */,/*6715*/"TAI THAM LETTER LOW PA"/* 1A3B */, /*6716*/"TAI THAM LETTER LOW FA"/* 1A3C */,/*6717*/"TAI THAM LETTER LOW PHA"/* 1A3D */, /*6718*/"TAI THAM LETTER MA"/* 1A3E */,/*6719*/"TAI THAM LETTER LOW YA"/* 1A3F */, /*6720*/"TAI THAM LETTER HIGH YA"/* 1A40 */,/*6721*/"TAI THAM LETTER RA"/* 1A41 */, /*6722*/"TAI THAM LETTER RUE"/* 1A42 */,/*6723*/"TAI THAM LETTER LA"/* 1A43 */,/*6724*/"TAI THAM LETTER LUE"/* 1A44 */, /*6725*/"TAI THAM LETTER WA"/* 1A45 */,/*6726*/"TAI THAM LETTER HIGH SHA"/* 1A46 */, /*6727*/"TAI THAM LETTER HIGH SSA"/* 1A47 */,/*6728*/"TAI THAM LETTER HIGH SA"/* 1A48 */, /*6729*/"TAI THAM LETTER HIGH HA"/* 1A49 */,/*6730*/"TAI THAM LETTER LLA"/* 1A4A */, /*6731*/"TAI THAM LETTER A"/* 1A4B */,/*6732*/"TAI THAM LETTER LOW HA"/* 1A4C */,/*6733*/"TAI THAM LETTER I"/* 1A4D */, /*6734*/"TAI THAM LETTER II"/* 1A4E */,/*6735*/"TAI THAM LETTER U"/* 1A4F */,/*6736*/"TAI THAM LETTER UU"/* 1A50 */, /*6737*/"TAI THAM LETTER EE"/* 1A51 */,/*6738*/"TAI THAM LETTER OO"/* 1A52 */,/*6739*/"TAI THAM LETTER LAE"/* 1A53 */, /*6740*/"TAI THAM LETTER GREAT SA"/* 1A54 */,/*6741*/"TAI THAM CONSONANT SIGN MEDIAL RA"/* 1A55 */, /*6742*/"TAI THAM CONSONANT SIGN MEDIAL LA"/* 1A56 */,/*6743*/"TAI THAM CONSONANT SIGN LA TANG LAI"/* 1A57 */, /*6744*/"TAI THAM SIGN MAI KANG LAI"/* 1A58 */,/*6745*/"TAI THAM CONSONANT SIGN FINAL NGA"/* 1A59 */, /*6746*/"TAI THAM CONSONANT SIGN LOW PA"/* 1A5A */,/*6747*/"TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA"/* 1A5B */, /*6748*/"TAI THAM CONSONANT SIGN MA"/* 1A5C */,/*6749*/"TAI THAM CONSONANT SIGN BA"/* 1A5D */, /*6750*/"TAI THAM CONSONANT SIGN SA"/* 1A5E */,NULL,/*6752*/"TAI THAM SIGN SAKOT"/* 1A60 */, /*6753*/"TAI THAM VOWEL SIGN A"/* 1A61 */,/*6754*/"TAI THAM VOWEL SIGN MAI SAT"/* 1A62 */, /*6755*/"TAI THAM VOWEL SIGN AA"/* 1A63 */,/*6756*/"TAI THAM VOWEL SIGN TALL AA"/* 1A64 */, /*6757*/"TAI THAM VOWEL SIGN I"/* 1A65 */,/*6758*/"TAI THAM VOWEL SIGN II"/* 1A66 */, /*6759*/"TAI THAM VOWEL SIGN UE"/* 1A67 */,/*6760*/"TAI THAM VOWEL SIGN UUE"/* 1A68 */, /*6761*/"TAI THAM VOWEL SIGN U"/* 1A69 */,/*6762*/"TAI THAM VOWEL SIGN UU"/* 1A6A */, /*6763*/"TAI THAM VOWEL SIGN O"/* 1A6B */,/*6764*/"TAI THAM VOWEL SIGN OA BELOW"/* 1A6C */, /*6765*/"TAI THAM VOWEL SIGN OY"/* 1A6D */,/*6766*/"TAI THAM VOWEL SIGN E"/* 1A6E */, /*6767*/"TAI THAM VOWEL SIGN AE"/* 1A6F */,/*6768*/"TAI THAM VOWEL SIGN OO"/* 1A70 */, /*6769*/"TAI THAM VOWEL SIGN AI"/* 1A71 */,/*6770*/"TAI THAM VOWEL SIGN THAM AI"/* 1A72 */, /*6771*/"TAI THAM VOWEL SIGN OA ABOVE"/* 1A73 */,/*6772*/"TAI THAM SIGN MAI KANG"/* 1A74 */, /*6773*/"TAI THAM SIGN TONE-1"/* 1A75 */,/*6774*/"TAI THAM SIGN TONE-2"/* 1A76 */, /*6775*/"TAI THAM SIGN KHUEN TONE-3"/* 1A77 */,/*6776*/"TAI THAM SIGN KHUEN TONE-4"/* 1A78 */, /*6777*/"TAI THAM SIGN KHUEN TONE-5"/* 1A79 */,/*6778*/"TAI THAM SIGN RA HAAM"/* 1A7A */, /*6779*/"TAI THAM SIGN MAI SAM"/* 1A7B */,/*6780*/"TAI THAM SIGN KHUEN-LUE KARAN"/* 1A7C */,NULL,NULL, /*6783*/"TAI THAM COMBINING CRYPTOGRAMMIC DOT"/* 1A7F */,/*6784*/"TAI THAM HORA DIGIT ZERO"/* 1A80 */, /*6785*/"TAI THAM HORA DIGIT ONE"/* 1A81 */,/*6786*/"TAI THAM HORA DIGIT TWO"/* 1A82 */, /*6787*/"TAI THAM HORA DIGIT THREE"/* 1A83 */,/*6788*/"TAI THAM HORA DIGIT FOUR"/* 1A84 */, /*6789*/"TAI THAM HORA DIGIT FIVE"/* 1A85 */,/*6790*/"TAI THAM HORA DIGIT SIX"/* 1A86 */, /*6791*/"TAI THAM HORA DIGIT SEVEN"/* 1A87 */,/*6792*/"TAI THAM HORA DIGIT EIGHT"/* 1A88 */, /*6793*/"TAI THAM HORA DIGIT NINE"/* 1A89 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6800*/"TAI THAM THAM DIGIT ZERO"/* 1A90 */, /*6801*/"TAI THAM THAM DIGIT ONE"/* 1A91 */,/*6802*/"TAI THAM THAM DIGIT TWO"/* 1A92 */, /*6803*/"TAI THAM THAM DIGIT THREE"/* 1A93 */,/*6804*/"TAI THAM THAM DIGIT FOUR"/* 1A94 */, /*6805*/"TAI THAM THAM DIGIT FIVE"/* 1A95 */,/*6806*/"TAI THAM THAM DIGIT SIX"/* 1A96 */, /*6807*/"TAI THAM THAM DIGIT SEVEN"/* 1A97 */,/*6808*/"TAI THAM THAM DIGIT EIGHT"/* 1A98 */, /*6809*/"TAI THAM THAM DIGIT NINE"/* 1A99 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6816*/"TAI THAM SIGN WIANG"/* 1AA0 */, /*6817*/"TAI THAM SIGN WIANGWAAK"/* 1AA1 */,/*6818*/"TAI THAM SIGN SAWAN"/* 1AA2 */, /*6819*/"TAI THAM SIGN KEOW"/* 1AA3 */,/*6820*/"TAI THAM SIGN HOY"/* 1AA4 */,/*6821*/"TAI THAM SIGN DOKMAI"/* 1AA5 */, /*6822*/"TAI THAM SIGN REVERSED ROTATED RANA"/* 1AA6 */,/*6823*/"TAI THAM SIGN MAI YAMOK"/* 1AA7 */, /*6824*/"TAI THAM SIGN KAAN"/* 1AA8 */,/*6825*/"TAI THAM SIGN KAANKUU"/* 1AA9 */, /*6826*/"TAI THAM SIGN SATKAAN"/* 1AAA */,/*6827*/"TAI THAM SIGN SATKAANKUU"/* 1AAB */, /*6828*/"TAI THAM SIGN HANG"/* 1AAC */,/*6829*/"TAI THAM SIGN CAANG"/* 1AAD */,NULL,NULL, /*6832*/"COMBINING DOUBLED CIRCUMFLEX ACCENT"/* 1AB0 */,/*6833*/"COMBINING DIAERESIS-RING"/* 1AB1 */, /*6834*/"COMBINING INFINITY"/* 1AB2 */,/*6835*/"COMBINING DOWNWARDS ARROW"/* 1AB3 */, /*6836*/"COMBINING TRIPLE DOT"/* 1AB4 */,/*6837*/"COMBINING X-X BELOW"/* 1AB5 */, /*6838*/"COMBINING WIGGLY LINE BELOW"/* 1AB6 */,/*6839*/"COMBINING OPEN MARK BELOW"/* 1AB7 */, /*6840*/"COMBINING DOUBLE OPEN MARK BELOW"/* 1AB8 */,/*6841*/"COMBINING LIGHT CENTRALIZATION STROKE BELOW"/* 1AB9 */, /*6842*/"COMBINING STRONG CENTRALIZATION STROKE BELOW"/* 1ABA */,/*6843*/"COMBINING PARENTHESES ABOVE"/* 1ABB */, /*6844*/"COMBINING DOUBLE PARENTHESES ABOVE"/* 1ABC */,/*6845*/"COMBINING PARENTHESES BELOW"/* 1ABD */, /*6846*/"COMBINING PARENTHESES OVERLAY"/* 1ABE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*6912*/"BALINESE SIGN ULU RICEM"/* 1B00 */,/*6913*/"BALINESE SIGN ULU CANDRA"/* 1B01 */, /*6914*/"BALINESE SIGN CECEK"/* 1B02 */,/*6915*/"BALINESE SIGN SURANG"/* 1B03 */,/*6916*/"BALINESE SIGN BISAH"/* 1B04 */, /*6917*/"BALINESE LETTER AKARA"/* 1B05 */,/*6918*/"BALINESE LETTER AKARA TEDUNG"/* 1B06 */, /*6919*/"BALINESE LETTER IKARA"/* 1B07 */,/*6920*/"BALINESE LETTER IKARA TEDUNG"/* 1B08 */, /*6921*/"BALINESE LETTER UKARA"/* 1B09 */,/*6922*/"BALINESE LETTER UKARA TEDUNG"/* 1B0A */, /*6923*/"BALINESE LETTER RA REPA"/* 1B0B */,/*6924*/"BALINESE LETTER RA REPA TEDUNG"/* 1B0C */, /*6925*/"BALINESE LETTER LA LENGA"/* 1B0D */,/*6926*/"BALINESE LETTER LA LENGA TEDUNG"/* 1B0E */, /*6927*/"BALINESE LETTER EKARA"/* 1B0F */,/*6928*/"BALINESE LETTER AIKARA"/* 1B10 */, /*6929*/"BALINESE LETTER OKARA"/* 1B11 */,/*6930*/"BALINESE LETTER OKARA TEDUNG"/* 1B12 */, /*6931*/"BALINESE LETTER KA"/* 1B13 */,/*6932*/"BALINESE LETTER KA MAHAPRANA"/* 1B14 */, /*6933*/"BALINESE LETTER GA"/* 1B15 */,/*6934*/"BALINESE LETTER GA GORA"/* 1B16 */, /*6935*/"BALINESE LETTER NGA"/* 1B17 */,/*6936*/"BALINESE LETTER CA"/* 1B18 */, /*6937*/"BALINESE LETTER CA LACA"/* 1B19 */,/*6938*/"BALINESE LETTER JA"/* 1B1A */, /*6939*/"BALINESE LETTER JA JERA"/* 1B1B */,/*6940*/"BALINESE LETTER NYA"/* 1B1C */, /*6941*/"BALINESE LETTER TA LATIK"/* 1B1D */,/*6942*/"BALINESE LETTER TA MURDA MAHAPRANA"/* 1B1E */, /*6943*/"BALINESE LETTER DA MURDA ALPAPRANA"/* 1B1F */,/*6944*/"BALINESE LETTER DA MURDA MAHAPRANA"/* 1B20 */, /*6945*/"BALINESE LETTER NA RAMBAT"/* 1B21 */,/*6946*/"BALINESE LETTER TA"/* 1B22 */, /*6947*/"BALINESE LETTER TA TAWA"/* 1B23 */,/*6948*/"BALINESE LETTER DA"/* 1B24 */, /*6949*/"BALINESE LETTER DA MADU"/* 1B25 */,/*6950*/"BALINESE LETTER NA"/* 1B26 */, /*6951*/"BALINESE LETTER PA"/* 1B27 */,/*6952*/"BALINESE LETTER PA KAPAL"/* 1B28 */, /*6953*/"BALINESE LETTER BA"/* 1B29 */,/*6954*/"BALINESE LETTER BA KEMBANG"/* 1B2A */, /*6955*/"BALINESE LETTER MA"/* 1B2B */,/*6956*/"BALINESE LETTER YA"/* 1B2C */,/*6957*/"BALINESE LETTER RA"/* 1B2D */, /*6958*/"BALINESE LETTER LA"/* 1B2E */,/*6959*/"BALINESE LETTER WA"/* 1B2F */, /*6960*/"BALINESE LETTER SA SAGA"/* 1B30 */,/*6961*/"BALINESE LETTER SA SAPA"/* 1B31 */, /*6962*/"BALINESE LETTER SA"/* 1B32 */,/*6963*/"BALINESE LETTER HA"/* 1B33 */,/*6964*/"BALINESE SIGN REREKAN"/* 1B34 */, /*6965*/"BALINESE VOWEL SIGN TEDUNG"/* 1B35 */,/*6966*/"BALINESE VOWEL SIGN ULU"/* 1B36 */, /*6967*/"BALINESE VOWEL SIGN ULU SARI"/* 1B37 */,/*6968*/"BALINESE VOWEL SIGN SUKU"/* 1B38 */, /*6969*/"BALINESE VOWEL SIGN SUKU ILUT"/* 1B39 */,/*6970*/"BALINESE VOWEL SIGN RA REPA"/* 1B3A */, /*6971*/"BALINESE VOWEL SIGN RA REPA TEDUNG"/* 1B3B */,/*6972*/"BALINESE VOWEL SIGN LA LENGA"/* 1B3C */, /*6973*/"BALINESE VOWEL SIGN LA LENGA TEDUNG"/* 1B3D */,/*6974*/"BALINESE VOWEL SIGN TALING"/* 1B3E */, /*6975*/"BALINESE VOWEL SIGN TALING REPA"/* 1B3F */,/*6976*/"BALINESE VOWEL SIGN TALING TEDUNG"/* 1B40 */, /*6977*/"BALINESE VOWEL SIGN TALING REPA TEDUNG"/* 1B41 */,/*6978*/"BALINESE VOWEL SIGN PEPET"/* 1B42 */, /*6979*/"BALINESE VOWEL SIGN PEPET TEDUNG"/* 1B43 */,/*6980*/"BALINESE ADEG ADEG"/* 1B44 */, /*6981*/"BALINESE LETTER KAF SASAK"/* 1B45 */,/*6982*/"BALINESE LETTER KHOT SASAK"/* 1B46 */, /*6983*/"BALINESE LETTER TZIR SASAK"/* 1B47 */,/*6984*/"BALINESE LETTER EF SASAK"/* 1B48 */, /*6985*/"BALINESE LETTER VE SASAK"/* 1B49 */,/*6986*/"BALINESE LETTER ZAL SASAK"/* 1B4A */, /*6987*/"BALINESE LETTER ASYURA SASAK"/* 1B4B */,NULL,NULL,NULL,NULL,/*6992*/"BALINESE DIGIT ZERO"/* 1B50 */, /*6993*/"BALINESE DIGIT ONE"/* 1B51 */,/*6994*/"BALINESE DIGIT TWO"/* 1B52 */,/*6995*/"BALINESE DIGIT THREE"/* 1B53 */, /*6996*/"BALINESE DIGIT FOUR"/* 1B54 */,/*6997*/"BALINESE DIGIT FIVE"/* 1B55 */,/*6998*/"BALINESE DIGIT SIX"/* 1B56 */, /*6999*/"BALINESE DIGIT SEVEN"/* 1B57 */,/*7000*/"BALINESE DIGIT EIGHT"/* 1B58 */, /*7001*/"BALINESE DIGIT NINE"/* 1B59 */,/*7002*/"BALINESE PANTI"/* 1B5A */,/*7003*/"BALINESE PAMADA"/* 1B5B */, /*7004*/"BALINESE WINDU"/* 1B5C */,/*7005*/"BALINESE CARIK PAMUNGKAH"/* 1B5D */,/*7006*/"BALINESE CARIK SIKI"/* 1B5E */, /*7007*/"BALINESE CARIK PAREREN"/* 1B5F */,/*7008*/"BALINESE PAMENENG"/* 1B60 */, /*7009*/"BALINESE MUSICAL SYMBOL DONG"/* 1B61 */,/*7010*/"BALINESE MUSICAL SYMBOL DENG"/* 1B62 */, /*7011*/"BALINESE MUSICAL SYMBOL DUNG"/* 1B63 */,/*7012*/"BALINESE MUSICAL SYMBOL DANG"/* 1B64 */, /*7013*/"BALINESE MUSICAL SYMBOL DANG SURANG"/* 1B65 */,/*7014*/"BALINESE MUSICAL SYMBOL DING"/* 1B66 */, /*7015*/"BALINESE MUSICAL SYMBOL DAENG"/* 1B67 */,/*7016*/"BALINESE MUSICAL SYMBOL DEUNG"/* 1B68 */, /*7017*/"BALINESE MUSICAL SYMBOL DAING"/* 1B69 */,/*7018*/"BALINESE MUSICAL SYMBOL DANG GEDE"/* 1B6A */, /*7019*/"BALINESE MUSICAL SYMBOL COMBINING TEGEH"/* 1B6B */,/*7020*/"BALINESE MUSICAL SYMBOL COMBINING ENDEP"/* 1B6C */, /*7021*/"BALINESE MUSICAL SYMBOL COMBINING KEMPUL"/* 1B6D */, /*7022*/"BALINESE MUSICAL SYMBOL COMBINING KEMPLI"/* 1B6E */, /*7023*/"BALINESE MUSICAL SYMBOL COMBINING JEGOGAN"/* 1B6F */, /*7024*/"BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN"/* 1B70 */, /*7025*/"BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN"/* 1B71 */, /*7026*/"BALINESE MUSICAL SYMBOL COMBINING BENDE"/* 1B72 */,/*7027*/"BALINESE MUSICAL SYMBOL COMBINING GONG"/* 1B73 */, /*7028*/"BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG"/* 1B74 */, /*7029*/"BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG"/* 1B75 */, /*7030*/"BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK"/* 1B76 */, /*7031*/"BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK"/* 1B77 */, /*7032*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG"/* 1B78 */, /*7033*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG"/* 1B79 */, /*7034*/"BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK"/* 1B7A */, /*7035*/"BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK"/* 1B7B */, /*7036*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING"/* 1B7C */,NULL,NULL,NULL, /*7040*/"SUNDANESE SIGN PANYECEK"/* 1B80 */,/*7041*/"SUNDANESE SIGN PANGLAYAR"/* 1B81 */, /*7042*/"SUNDANESE SIGN PANGWISAD"/* 1B82 */,/*7043*/"SUNDANESE LETTER A"/* 1B83 */, /*7044*/"SUNDANESE LETTER I"/* 1B84 */,/*7045*/"SUNDANESE LETTER U"/* 1B85 */,/*7046*/"SUNDANESE LETTER AE"/* 1B86 */, /*7047*/"SUNDANESE LETTER O"/* 1B87 */,/*7048*/"SUNDANESE LETTER E"/* 1B88 */,/*7049*/"SUNDANESE LETTER EU"/* 1B89 */, /*7050*/"SUNDANESE LETTER KA"/* 1B8A */,/*7051*/"SUNDANESE LETTER QA"/* 1B8B */,/*7052*/"SUNDANESE LETTER GA"/* 1B8C */, /*7053*/"SUNDANESE LETTER NGA"/* 1B8D */,/*7054*/"SUNDANESE LETTER CA"/* 1B8E */,/*7055*/"SUNDANESE LETTER JA"/* 1B8F */, /*7056*/"SUNDANESE LETTER ZA"/* 1B90 */,/*7057*/"SUNDANESE LETTER NYA"/* 1B91 */,/*7058*/"SUNDANESE LETTER TA"/* 1B92 */, /*7059*/"SUNDANESE LETTER DA"/* 1B93 */,/*7060*/"SUNDANESE LETTER NA"/* 1B94 */,/*7061*/"SUNDANESE LETTER PA"/* 1B95 */, /*7062*/"SUNDANESE LETTER FA"/* 1B96 */,/*7063*/"SUNDANESE LETTER VA"/* 1B97 */,/*7064*/"SUNDANESE LETTER BA"/* 1B98 */, /*7065*/"SUNDANESE LETTER MA"/* 1B99 */,/*7066*/"SUNDANESE LETTER YA"/* 1B9A */,/*7067*/"SUNDANESE LETTER RA"/* 1B9B */, /*7068*/"SUNDANESE LETTER LA"/* 1B9C */,/*7069*/"SUNDANESE LETTER WA"/* 1B9D */,/*7070*/"SUNDANESE LETTER SA"/* 1B9E */, /*7071*/"SUNDANESE LETTER XA"/* 1B9F */,/*7072*/"SUNDANESE LETTER HA"/* 1BA0 */, /*7073*/"SUNDANESE CONSONANT SIGN PAMINGKAL"/* 1BA1 */,/*7074*/"SUNDANESE CONSONANT SIGN PANYAKRA"/* 1BA2 */, /*7075*/"SUNDANESE CONSONANT SIGN PANYIKU"/* 1BA3 */,/*7076*/"SUNDANESE VOWEL SIGN PANGHULU"/* 1BA4 */, /*7077*/"SUNDANESE VOWEL SIGN PANYUKU"/* 1BA5 */,/*7078*/"SUNDANESE VOWEL SIGN PANAELAENG"/* 1BA6 */, /*7079*/"SUNDANESE VOWEL SIGN PANOLONG"/* 1BA7 */,/*7080*/"SUNDANESE VOWEL SIGN PAMEPET"/* 1BA8 */, /*7081*/"SUNDANESE VOWEL SIGN PANEULEUNG"/* 1BA9 */,/*7082*/"SUNDANESE SIGN PAMAAEH"/* 1BAA */, /*7083*/"SUNDANESE SIGN VIRAMA"/* 1BAB */,/*7084*/"SUNDANESE CONSONANT SIGN PASANGAN MA"/* 1BAC */, /*7085*/"SUNDANESE CONSONANT SIGN PASANGAN WA"/* 1BAD */,/*7086*/"SUNDANESE LETTER KHA"/* 1BAE */, /*7087*/"SUNDANESE LETTER SYA"/* 1BAF */,/*7088*/"SUNDANESE DIGIT ZERO"/* 1BB0 */, /*7089*/"SUNDANESE DIGIT ONE"/* 1BB1 */,/*7090*/"SUNDANESE DIGIT TWO"/* 1BB2 */, /*7091*/"SUNDANESE DIGIT THREE"/* 1BB3 */,/*7092*/"SUNDANESE DIGIT FOUR"/* 1BB4 */, /*7093*/"SUNDANESE DIGIT FIVE"/* 1BB5 */,/*7094*/"SUNDANESE DIGIT SIX"/* 1BB6 */, /*7095*/"SUNDANESE DIGIT SEVEN"/* 1BB7 */,/*7096*/"SUNDANESE DIGIT EIGHT"/* 1BB8 */, /*7097*/"SUNDANESE DIGIT NINE"/* 1BB9 */,/*7098*/"SUNDANESE AVAGRAHA"/* 1BBA */,/*7099*/"SUNDANESE LETTER REU"/* 1BBB */, /*7100*/"SUNDANESE LETTER LEU"/* 1BBC */,/*7101*/"SUNDANESE LETTER BHA"/* 1BBD */, /*7102*/"SUNDANESE LETTER FINAL K"/* 1BBE */,/*7103*/"SUNDANESE LETTER FINAL M"/* 1BBF */, /*7104*/"BATAK LETTER A"/* 1BC0 */,/*7105*/"BATAK LETTER SIMALUNGUN A"/* 1BC1 */,/*7106*/"BATAK LETTER HA"/* 1BC2 */, /*7107*/"BATAK LETTER SIMALUNGUN HA"/* 1BC3 */,/*7108*/"BATAK LETTER MANDAILING HA"/* 1BC4 */, /*7109*/"BATAK LETTER BA"/* 1BC5 */,/*7110*/"BATAK LETTER KARO BA"/* 1BC6 */,/*7111*/"BATAK LETTER PA"/* 1BC7 */, /*7112*/"BATAK LETTER SIMALUNGUN PA"/* 1BC8 */,/*7113*/"BATAK LETTER NA"/* 1BC9 */, /*7114*/"BATAK LETTER MANDAILING NA"/* 1BCA */,/*7115*/"BATAK LETTER WA"/* 1BCB */, /*7116*/"BATAK LETTER SIMALUNGUN WA"/* 1BCC */,/*7117*/"BATAK LETTER PAKPAK WA"/* 1BCD */, /*7118*/"BATAK LETTER GA"/* 1BCE */,/*7119*/"BATAK LETTER SIMALUNGUN GA"/* 1BCF */,/*7120*/"BATAK LETTER JA"/* 1BD0 */, /*7121*/"BATAK LETTER DA"/* 1BD1 */,/*7122*/"BATAK LETTER RA"/* 1BD2 */,/*7123*/"BATAK LETTER SIMALUNGUN RA"/* 1BD3 */, /*7124*/"BATAK LETTER MA"/* 1BD4 */,/*7125*/"BATAK LETTER SIMALUNGUN MA"/* 1BD5 */, /*7126*/"BATAK LETTER SOUTHERN TA"/* 1BD6 */,/*7127*/"BATAK LETTER NORTHERN TA"/* 1BD7 */, /*7128*/"BATAK LETTER SA"/* 1BD8 */,/*7129*/"BATAK LETTER SIMALUNGUN SA"/* 1BD9 */, /*7130*/"BATAK LETTER MANDAILING SA"/* 1BDA */,/*7131*/"BATAK LETTER YA"/* 1BDB */, /*7132*/"BATAK LETTER SIMALUNGUN YA"/* 1BDC */,/*7133*/"BATAK LETTER NGA"/* 1BDD */,/*7134*/"BATAK LETTER LA"/* 1BDE */, /*7135*/"BATAK LETTER SIMALUNGUN LA"/* 1BDF */,/*7136*/"BATAK LETTER NYA"/* 1BE0 */,/*7137*/"BATAK LETTER CA"/* 1BE1 */, /*7138*/"BATAK LETTER NDA"/* 1BE2 */,/*7139*/"BATAK LETTER MBA"/* 1BE3 */,/*7140*/"BATAK LETTER I"/* 1BE4 */, /*7141*/"BATAK LETTER U"/* 1BE5 */,/*7142*/"BATAK SIGN TOMPI"/* 1BE6 */,/*7143*/"BATAK VOWEL SIGN E"/* 1BE7 */, /*7144*/"BATAK VOWEL SIGN PAKPAK E"/* 1BE8 */,/*7145*/"BATAK VOWEL SIGN EE"/* 1BE9 */, /*7146*/"BATAK VOWEL SIGN I"/* 1BEA */,/*7147*/"BATAK VOWEL SIGN KARO I"/* 1BEB */, /*7148*/"BATAK VOWEL SIGN O"/* 1BEC */,/*7149*/"BATAK VOWEL SIGN KARO O"/* 1BED */, /*7150*/"BATAK VOWEL SIGN U"/* 1BEE */,/*7151*/"BATAK VOWEL SIGN U FOR SIMALUNGUN SA"/* 1BEF */, /*7152*/"BATAK CONSONANT SIGN NG"/* 1BF0 */,/*7153*/"BATAK CONSONANT SIGN H"/* 1BF1 */, /*7154*/"BATAK PANGOLAT"/* 1BF2 */,/*7155*/"BATAK PANONGONAN"/* 1BF3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*7164*/"BATAK SYMBOL BINDU NA METEK"/* 1BFC */,/*7165*/"BATAK SYMBOL BINDU PINARBORAS"/* 1BFD */, /*7166*/"BATAK SYMBOL BINDU JUDUL"/* 1BFE */,/*7167*/"BATAK SYMBOL BINDU PANGOLAT"/* 1BFF */, /*7168*/"LEPCHA LETTER KA"/* 1C00 */,/*7169*/"LEPCHA LETTER KLA"/* 1C01 */,/*7170*/"LEPCHA LETTER KHA"/* 1C02 */, /*7171*/"LEPCHA LETTER GA"/* 1C03 */,/*7172*/"LEPCHA LETTER GLA"/* 1C04 */,/*7173*/"LEPCHA LETTER NGA"/* 1C05 */, /*7174*/"LEPCHA LETTER CA"/* 1C06 */,/*7175*/"LEPCHA LETTER CHA"/* 1C07 */,/*7176*/"LEPCHA LETTER JA"/* 1C08 */, /*7177*/"LEPCHA LETTER NYA"/* 1C09 */,/*7178*/"LEPCHA LETTER TA"/* 1C0A */,/*7179*/"LEPCHA LETTER THA"/* 1C0B */, /*7180*/"LEPCHA LETTER DA"/* 1C0C */,/*7181*/"LEPCHA LETTER NA"/* 1C0D */,/*7182*/"LEPCHA LETTER PA"/* 1C0E */, /*7183*/"LEPCHA LETTER PLA"/* 1C0F */,/*7184*/"LEPCHA LETTER PHA"/* 1C10 */,/*7185*/"LEPCHA LETTER FA"/* 1C11 */, /*7186*/"LEPCHA LETTER FLA"/* 1C12 */,/*7187*/"LEPCHA LETTER BA"/* 1C13 */,/*7188*/"LEPCHA LETTER BLA"/* 1C14 */, /*7189*/"LEPCHA LETTER MA"/* 1C15 */,/*7190*/"LEPCHA LETTER MLA"/* 1C16 */,/*7191*/"LEPCHA LETTER TSA"/* 1C17 */, /*7192*/"LEPCHA LETTER TSHA"/* 1C18 */,/*7193*/"LEPCHA LETTER DZA"/* 1C19 */,/*7194*/"LEPCHA LETTER YA"/* 1C1A */, /*7195*/"LEPCHA LETTER RA"/* 1C1B */,/*7196*/"LEPCHA LETTER LA"/* 1C1C */,/*7197*/"LEPCHA LETTER HA"/* 1C1D */, /*7198*/"LEPCHA LETTER HLA"/* 1C1E */,/*7199*/"LEPCHA LETTER VA"/* 1C1F */,/*7200*/"LEPCHA LETTER SA"/* 1C20 */, /*7201*/"LEPCHA LETTER SHA"/* 1C21 */,/*7202*/"LEPCHA LETTER WA"/* 1C22 */,/*7203*/"LEPCHA LETTER A"/* 1C23 */, /*7204*/"LEPCHA SUBJOINED LETTER YA"/* 1C24 */,/*7205*/"LEPCHA SUBJOINED LETTER RA"/* 1C25 */, /*7206*/"LEPCHA VOWEL SIGN AA"/* 1C26 */,/*7207*/"LEPCHA VOWEL SIGN I"/* 1C27 */,/*7208*/"LEPCHA VOWEL SIGN O"/* 1C28 */, /*7209*/"LEPCHA VOWEL SIGN OO"/* 1C29 */,/*7210*/"LEPCHA VOWEL SIGN U"/* 1C2A */, /*7211*/"LEPCHA VOWEL SIGN UU"/* 1C2B */,/*7212*/"LEPCHA VOWEL SIGN E"/* 1C2C */, /*7213*/"LEPCHA CONSONANT SIGN K"/* 1C2D */,/*7214*/"LEPCHA CONSONANT SIGN M"/* 1C2E */, /*7215*/"LEPCHA CONSONANT SIGN L"/* 1C2F */,/*7216*/"LEPCHA CONSONANT SIGN N"/* 1C30 */, /*7217*/"LEPCHA CONSONANT SIGN P"/* 1C31 */,/*7218*/"LEPCHA CONSONANT SIGN R"/* 1C32 */, /*7219*/"LEPCHA CONSONANT SIGN T"/* 1C33 */,/*7220*/"LEPCHA CONSONANT SIGN NYIN-DO"/* 1C34 */, /*7221*/"LEPCHA CONSONANT SIGN KANG"/* 1C35 */,/*7222*/"LEPCHA SIGN RAN"/* 1C36 */,/*7223*/"LEPCHA SIGN NUKTA"/* 1C37 */, NULL,NULL,NULL,/*7227*/"LEPCHA PUNCTUATION TA-ROL"/* 1C3B */,/*7228*/"LEPCHA PUNCTUATION NYET THYOOM TA-ROL"/* 1C3C */, /*7229*/"LEPCHA PUNCTUATION CER-WA"/* 1C3D */,/*7230*/"LEPCHA PUNCTUATION TSHOOK CER-WA"/* 1C3E */, /*7231*/"LEPCHA PUNCTUATION TSHOOK"/* 1C3F */,/*7232*/"LEPCHA DIGIT ZERO"/* 1C40 */,/*7233*/"LEPCHA DIGIT ONE"/* 1C41 */, /*7234*/"LEPCHA DIGIT TWO"/* 1C42 */,/*7235*/"LEPCHA DIGIT THREE"/* 1C43 */,/*7236*/"LEPCHA DIGIT FOUR"/* 1C44 */, /*7237*/"LEPCHA DIGIT FIVE"/* 1C45 */,/*7238*/"LEPCHA DIGIT SIX"/* 1C46 */,/*7239*/"LEPCHA DIGIT SEVEN"/* 1C47 */, /*7240*/"LEPCHA DIGIT EIGHT"/* 1C48 */,/*7241*/"LEPCHA DIGIT NINE"/* 1C49 */,NULL,NULL,NULL, /*7245*/"LEPCHA LETTER TTA"/* 1C4D */,/*7246*/"LEPCHA LETTER TTHA"/* 1C4E */,/*7247*/"LEPCHA LETTER DDA"/* 1C4F */, /*7248*/"OL CHIKI DIGIT ZERO"/* 1C50 */,/*7249*/"OL CHIKI DIGIT ONE"/* 1C51 */,/*7250*/"OL CHIKI DIGIT TWO"/* 1C52 */, /*7251*/"OL CHIKI DIGIT THREE"/* 1C53 */,/*7252*/"OL CHIKI DIGIT FOUR"/* 1C54 */,/*7253*/"OL CHIKI DIGIT FIVE"/* 1C55 */, /*7254*/"OL CHIKI DIGIT SIX"/* 1C56 */,/*7255*/"OL CHIKI DIGIT SEVEN"/* 1C57 */,/*7256*/"OL CHIKI DIGIT EIGHT"/* 1C58 */, /*7257*/"OL CHIKI DIGIT NINE"/* 1C59 */,/*7258*/"OL CHIKI LETTER LA"/* 1C5A */,/*7259*/"OL CHIKI LETTER AT"/* 1C5B */, /*7260*/"OL CHIKI LETTER AG"/* 1C5C */,/*7261*/"OL CHIKI LETTER ANG"/* 1C5D */,/*7262*/"OL CHIKI LETTER AL"/* 1C5E */, /*7263*/"OL CHIKI LETTER LAA"/* 1C5F */,/*7264*/"OL CHIKI LETTER AAK"/* 1C60 */,/*7265*/"OL CHIKI LETTER AAJ"/* 1C61 */, /*7266*/"OL CHIKI LETTER AAM"/* 1C62 */,/*7267*/"OL CHIKI LETTER AAW"/* 1C63 */,/*7268*/"OL CHIKI LETTER LI"/* 1C64 */, /*7269*/"OL CHIKI LETTER IS"/* 1C65 */,/*7270*/"OL CHIKI LETTER IH"/* 1C66 */,/*7271*/"OL CHIKI LETTER INY"/* 1C67 */, /*7272*/"OL CHIKI LETTER IR"/* 1C68 */,/*7273*/"OL CHIKI LETTER LU"/* 1C69 */,/*7274*/"OL CHIKI LETTER UC"/* 1C6A */, /*7275*/"OL CHIKI LETTER UD"/* 1C6B */,/*7276*/"OL CHIKI LETTER UNN"/* 1C6C */,/*7277*/"OL CHIKI LETTER UY"/* 1C6D */, /*7278*/"OL CHIKI LETTER LE"/* 1C6E */,/*7279*/"OL CHIKI LETTER EP"/* 1C6F */,/*7280*/"OL CHIKI LETTER EDD"/* 1C70 */, /*7281*/"OL CHIKI LETTER EN"/* 1C71 */,/*7282*/"OL CHIKI LETTER ERR"/* 1C72 */,/*7283*/"OL CHIKI LETTER LO"/* 1C73 */, /*7284*/"OL CHIKI LETTER OTT"/* 1C74 */,/*7285*/"OL CHIKI LETTER OB"/* 1C75 */,/*7286*/"OL CHIKI LETTER OV"/* 1C76 */, /*7287*/"OL CHIKI LETTER OH"/* 1C77 */,/*7288*/"OL CHIKI MU TTUDDAG"/* 1C78 */, /*7289*/"OL CHIKI GAAHLAA TTUDDAAG"/* 1C79 */,/*7290*/"OL CHIKI MU-GAAHLAA TTUDDAAG"/* 1C7A */, /*7291*/"OL CHIKI RELAA"/* 1C7B */,/*7292*/"OL CHIKI PHAARKAA"/* 1C7C */,/*7293*/"OL CHIKI AHAD"/* 1C7D */, /*7294*/"OL CHIKI PUNCTUATION MUCAAD"/* 1C7E */,/*7295*/"OL CHIKI PUNCTUATION DOUBLE MUCAAD"/* 1C7F */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*7360*/"SUNDANESE PUNCTUATION BINDU SURYA"/* 1CC0 */, /*7361*/"SUNDANESE PUNCTUATION BINDU PANGLONG"/* 1CC1 */,/*7362*/"SUNDANESE PUNCTUATION BINDU PURNAMA"/* 1CC2 */, /*7363*/"SUNDANESE PUNCTUATION BINDU CAKRA"/* 1CC3 */,/*7364*/"SUNDANESE PUNCTUATION BINDU LEU SATANGA"/* 1CC4 */, /*7365*/"SUNDANESE PUNCTUATION BINDU KA SATANGA"/* 1CC5 */,/*7366*/"SUNDANESE PUNCTUATION BINDU DA SATANGA"/* 1CC6 */, /*7367*/"SUNDANESE PUNCTUATION BINDU BA SATANGA"/* 1CC7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*7376*/"VEDIC TONE KARSHANA"/* 1CD0 */,/*7377*/"VEDIC TONE SHARA"/* 1CD1 */,/*7378*/"VEDIC TONE PRENKHA"/* 1CD2 */, /*7379*/"VEDIC SIGN NIHSHVASA"/* 1CD3 */,/*7380*/"VEDIC SIGN YAJURVEDIC MIDLINE SVARITA"/* 1CD4 */, /*7381*/"VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA"/* 1CD5 */, /*7382*/"VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA"/* 1CD6 */, /*7383*/"VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA"/* 1CD7 */,/*7384*/"VEDIC TONE CANDRA BELOW"/* 1CD8 */, /*7385*/"VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER"/* 1CD9 */, /*7386*/"VEDIC TONE DOUBLE SVARITA"/* 1CDA */,/*7387*/"VEDIC TONE TRIPLE SVARITA"/* 1CDB */, /*7388*/"VEDIC TONE KATHAKA ANUDATTA"/* 1CDC */,/*7389*/"VEDIC TONE DOT BELOW"/* 1CDD */, /*7390*/"VEDIC TONE TWO DOTS BELOW"/* 1CDE */,/*7391*/"VEDIC TONE THREE DOTS BELOW"/* 1CDF */, /*7392*/"VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA"/* 1CE0 */, /*7393*/"VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA"/* 1CE1 */,/*7394*/"VEDIC SIGN VISARGA SVARITA"/* 1CE2 */, /*7395*/"VEDIC SIGN VISARGA UDATTA"/* 1CE3 */,/*7396*/"VEDIC SIGN REVERSED VISARGA UDATTA"/* 1CE4 */, /*7397*/"VEDIC SIGN VISARGA ANUDATTA"/* 1CE5 */,/*7398*/"VEDIC SIGN REVERSED VISARGA ANUDATTA"/* 1CE6 */, /*7399*/"VEDIC SIGN VISARGA UDATTA WITH TAIL"/* 1CE7 */,/*7400*/"VEDIC SIGN VISARGA ANUDATTA WITH TAIL"/* 1CE8 */, /*7401*/"VEDIC SIGN ANUSVARA ANTARGOMUKHA"/* 1CE9 */,/*7402*/"VEDIC SIGN ANUSVARA BAHIRGOMUKHA"/* 1CEA */, /*7403*/"VEDIC SIGN ANUSVARA VAMAGOMUKHA"/* 1CEB */,/*7404*/"VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL"/* 1CEC */, /*7405*/"VEDIC SIGN TIRYAK"/* 1CED */,/*7406*/"VEDIC SIGN HEXIFORM LONG ANUSVARA"/* 1CEE */, /*7407*/"VEDIC SIGN LONG ANUSVARA"/* 1CEF */,/*7408*/"VEDIC SIGN RTHANG LONG ANUSVARA"/* 1CF0 */, /*7409*/"VEDIC SIGN ANUSVARA UBHAYATO MUKHA"/* 1CF1 */,/*7410*/"VEDIC SIGN ARDHAVISARGA"/* 1CF2 */, /*7411*/"VEDIC SIGN ROTATED ARDHAVISARGA"/* 1CF3 */,/*7412*/"VEDIC TONE CANDRA ABOVE"/* 1CF4 */, /*7413*/"VEDIC SIGN JIHVAMULIYA"/* 1CF5 */,/*7414*/"VEDIC SIGN UPADHMANIYA"/* 1CF6 */,NULL, /*7416*/"VEDIC TONE RING ABOVE"/* 1CF8 */,/*7417*/"VEDIC TONE DOUBLE RING ABOVE"/* 1CF9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*7424*/"LATIN LETTER SMALL CAPITAL A"/* 1D00 */,/*7425*/"LATIN LETTER SMALL CAPITAL AE"/* 1D01 */, /*7426*/"LATIN SMALL LETTER TURNED AE"/* 1D02 */,/*7427*/"LATIN LETTER SMALL CAPITAL BARRED B"/* 1D03 */, /*7428*/"LATIN LETTER SMALL CAPITAL C"/* 1D04 */,/*7429*/"LATIN LETTER SMALL CAPITAL D"/* 1D05 */, /*7430*/"LATIN LETTER SMALL CAPITAL ETH"/* 1D06 */,/*7431*/"LATIN LETTER SMALL CAPITAL E"/* 1D07 */, /*7432*/"LATIN SMALL LETTER TURNED OPEN E"/* 1D08 */,/*7433*/"LATIN SMALL LETTER TURNED I"/* 1D09 */, /*7434*/"LATIN LETTER SMALL CAPITAL J"/* 1D0A */,/*7435*/"LATIN LETTER SMALL CAPITAL K"/* 1D0B */, /*7436*/"LATIN LETTER SMALL CAPITAL L WITH STROKE"/* 1D0C */,/*7437*/"LATIN LETTER SMALL CAPITAL M"/* 1D0D */, /*7438*/"LATIN LETTER SMALL CAPITAL REVERSED N"/* 1D0E */,/*7439*/"LATIN LETTER SMALL CAPITAL O"/* 1D0F */, /*7440*/"LATIN LETTER SMALL CAPITAL OPEN O"/* 1D10 */,/*7441*/"LATIN SMALL LETTER SIDEWAYS O"/* 1D11 */, /*7442*/"LATIN SMALL LETTER SIDEWAYS OPEN O"/* 1D12 */,/*7443*/"LATIN SMALL LETTER SIDEWAYS O WITH STROKE"/* 1D13 */, /*7444*/"LATIN SMALL LETTER TURNED OE"/* 1D14 */,/*7445*/"LATIN LETTER SMALL CAPITAL OU"/* 1D15 */, /*7446*/"LATIN SMALL LETTER TOP HALF O"/* 1D16 */,/*7447*/"LATIN SMALL LETTER BOTTOM HALF O"/* 1D17 */, /*7448*/"LATIN LETTER SMALL CAPITAL P"/* 1D18 */,/*7449*/"LATIN LETTER SMALL CAPITAL REVERSED R"/* 1D19 */, /*7450*/"LATIN LETTER SMALL CAPITAL TURNED R"/* 1D1A */,/*7451*/"LATIN LETTER SMALL CAPITAL T"/* 1D1B */, /*7452*/"LATIN LETTER SMALL CAPITAL U"/* 1D1C */,/*7453*/"LATIN SMALL LETTER SIDEWAYS U"/* 1D1D */, /*7454*/"LATIN SMALL LETTER SIDEWAYS DIAERESIZED U"/* 1D1E */,/*7455*/"LATIN SMALL LETTER SIDEWAYS TURNED M"/* 1D1F */, /*7456*/"LATIN LETTER SMALL CAPITAL V"/* 1D20 */,/*7457*/"LATIN LETTER SMALL CAPITAL W"/* 1D21 */, /*7458*/"LATIN LETTER SMALL CAPITAL Z"/* 1D22 */,/*7459*/"LATIN LETTER SMALL CAPITAL EZH"/* 1D23 */, /*7460*/"LATIN LETTER VOICED LARYNGEAL SPIRANT"/* 1D24 */,/*7461*/"LATIN LETTER AIN"/* 1D25 */, /*7462*/"GREEK LETTER SMALL CAPITAL GAMMA"/* 1D26 */,/*7463*/"GREEK LETTER SMALL CAPITAL LAMDA"/* 1D27 */, /*7464*/"GREEK LETTER SMALL CAPITAL PI"/* 1D28 */,/*7465*/"GREEK LETTER SMALL CAPITAL RHO"/* 1D29 */, /*7466*/"GREEK LETTER SMALL CAPITAL PSI"/* 1D2A */,/*7467*/"CYRILLIC LETTER SMALL CAPITAL EL"/* 1D2B */, /*7468*/"MODIFIER LETTER CAPITAL A"/* 1D2C */,/*7469*/"MODIFIER LETTER CAPITAL AE"/* 1D2D */, /*7470*/"MODIFIER LETTER CAPITAL B"/* 1D2E */,/*7471*/"MODIFIER LETTER CAPITAL BARRED B"/* 1D2F */, /*7472*/"MODIFIER LETTER CAPITAL D"/* 1D30 */,/*7473*/"MODIFIER LETTER CAPITAL E"/* 1D31 */, /*7474*/"MODIFIER LETTER CAPITAL REVERSED E"/* 1D32 */,/*7475*/"MODIFIER LETTER CAPITAL G"/* 1D33 */, /*7476*/"MODIFIER LETTER CAPITAL H"/* 1D34 */,/*7477*/"MODIFIER LETTER CAPITAL I"/* 1D35 */, /*7478*/"MODIFIER LETTER CAPITAL J"/* 1D36 */,/*7479*/"MODIFIER LETTER CAPITAL K"/* 1D37 */, /*7480*/"MODIFIER LETTER CAPITAL L"/* 1D38 */,/*7481*/"MODIFIER LETTER CAPITAL M"/* 1D39 */, /*7482*/"MODIFIER LETTER CAPITAL N"/* 1D3A */,/*7483*/"MODIFIER LETTER CAPITAL REVERSED N"/* 1D3B */, /*7484*/"MODIFIER LETTER CAPITAL O"/* 1D3C */,/*7485*/"MODIFIER LETTER CAPITAL OU"/* 1D3D */, /*7486*/"MODIFIER LETTER CAPITAL P"/* 1D3E */,/*7487*/"MODIFIER LETTER CAPITAL R"/* 1D3F */, /*7488*/"MODIFIER LETTER CAPITAL T"/* 1D40 */,/*7489*/"MODIFIER LETTER CAPITAL U"/* 1D41 */, /*7490*/"MODIFIER LETTER CAPITAL W"/* 1D42 */,/*7491*/"MODIFIER LETTER SMALL A"/* 1D43 */, /*7492*/"MODIFIER LETTER SMALL TURNED A"/* 1D44 */,/*7493*/"MODIFIER LETTER SMALL ALPHA"/* 1D45 */, /*7494*/"MODIFIER LETTER SMALL TURNED AE"/* 1D46 */,/*7495*/"MODIFIER LETTER SMALL B"/* 1D47 */, /*7496*/"MODIFIER LETTER SMALL D"/* 1D48 */,/*7497*/"MODIFIER LETTER SMALL E"/* 1D49 */, /*7498*/"MODIFIER LETTER SMALL SCHWA"/* 1D4A */,/*7499*/"MODIFIER LETTER SMALL OPEN E"/* 1D4B */, /*7500*/"MODIFIER LETTER SMALL TURNED OPEN E"/* 1D4C */,/*7501*/"MODIFIER LETTER SMALL G"/* 1D4D */, /*7502*/"MODIFIER LETTER SMALL TURNED I"/* 1D4E */,/*7503*/"MODIFIER LETTER SMALL K"/* 1D4F */, /*7504*/"MODIFIER LETTER SMALL M"/* 1D50 */,/*7505*/"MODIFIER LETTER SMALL ENG"/* 1D51 */, /*7506*/"MODIFIER LETTER SMALL O"/* 1D52 */,/*7507*/"MODIFIER LETTER SMALL OPEN O"/* 1D53 */, /*7508*/"MODIFIER LETTER SMALL TOP HALF O"/* 1D54 */,/*7509*/"MODIFIER LETTER SMALL BOTTOM HALF O"/* 1D55 */, /*7510*/"MODIFIER LETTER SMALL P"/* 1D56 */,/*7511*/"MODIFIER LETTER SMALL T"/* 1D57 */, /*7512*/"MODIFIER LETTER SMALL U"/* 1D58 */,/*7513*/"MODIFIER LETTER SMALL SIDEWAYS U"/* 1D59 */, /*7514*/"MODIFIER LETTER SMALL TURNED M"/* 1D5A */,/*7515*/"MODIFIER LETTER SMALL V"/* 1D5B */, /*7516*/"MODIFIER LETTER SMALL AIN"/* 1D5C */,/*7517*/"MODIFIER LETTER SMALL BETA"/* 1D5D */, /*7518*/"MODIFIER LETTER SMALL GREEK GAMMA"/* 1D5E */,/*7519*/"MODIFIER LETTER SMALL DELTA"/* 1D5F */, /*7520*/"MODIFIER LETTER SMALL GREEK PHI"/* 1D60 */,/*7521*/"MODIFIER LETTER SMALL CHI"/* 1D61 */, /*7522*/"LATIN SUBSCRIPT SMALL LETTER I"/* 1D62 */,/*7523*/"LATIN SUBSCRIPT SMALL LETTER R"/* 1D63 */, /*7524*/"LATIN SUBSCRIPT SMALL LETTER U"/* 1D64 */,/*7525*/"LATIN SUBSCRIPT SMALL LETTER V"/* 1D65 */, /*7526*/"GREEK SUBSCRIPT SMALL LETTER BETA"/* 1D66 */,/*7527*/"GREEK SUBSCRIPT SMALL LETTER GAMMA"/* 1D67 */, /*7528*/"GREEK SUBSCRIPT SMALL LETTER RHO"/* 1D68 */,/*7529*/"GREEK SUBSCRIPT SMALL LETTER PHI"/* 1D69 */, /*7530*/"GREEK SUBSCRIPT SMALL LETTER CHI"/* 1D6A */,/*7531*/"LATIN SMALL LETTER UE"/* 1D6B */, /*7532*/"LATIN SMALL LETTER B WITH MIDDLE TILDE"/* 1D6C */,/*7533*/"LATIN SMALL LETTER D WITH MIDDLE TILDE"/* 1D6D */, /*7534*/"LATIN SMALL LETTER F WITH MIDDLE TILDE"/* 1D6E */,/*7535*/"LATIN SMALL LETTER M WITH MIDDLE TILDE"/* 1D6F */, /*7536*/"LATIN SMALL LETTER N WITH MIDDLE TILDE"/* 1D70 */,/*7537*/"LATIN SMALL LETTER P WITH MIDDLE TILDE"/* 1D71 */, /*7538*/"LATIN SMALL LETTER R WITH MIDDLE TILDE"/* 1D72 */, /*7539*/"LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE"/* 1D73 */, /*7540*/"LATIN SMALL LETTER S WITH MIDDLE TILDE"/* 1D74 */,/*7541*/"LATIN SMALL LETTER T WITH MIDDLE TILDE"/* 1D75 */, /*7542*/"LATIN SMALL LETTER Z WITH MIDDLE TILDE"/* 1D76 */,/*7543*/"LATIN SMALL LETTER TURNED G"/* 1D77 */, /*7544*/"MODIFIER LETTER CYRILLIC EN"/* 1D78 */,/*7545*/"LATIN SMALL LETTER INSULAR G"/* 1D79 */, /*7546*/"LATIN SMALL LETTER TH WITH STRIKETHROUGH"/* 1D7A */, /*7547*/"LATIN SMALL CAPITAL LETTER I WITH STROKE"/* 1D7B */,/*7548*/"LATIN SMALL LETTER IOTA WITH STROKE"/* 1D7C */, /*7549*/"LATIN SMALL LETTER P WITH STROKE"/* 1D7D */,/*7550*/"LATIN SMALL CAPITAL LETTER U WITH STROKE"/* 1D7E */, /*7551*/"LATIN SMALL LETTER UPSILON WITH STROKE"/* 1D7F */,/*7552*/"LATIN SMALL LETTER B WITH PALATAL HOOK"/* 1D80 */, /*7553*/"LATIN SMALL LETTER D WITH PALATAL HOOK"/* 1D81 */,/*7554*/"LATIN SMALL LETTER F WITH PALATAL HOOK"/* 1D82 */, /*7555*/"LATIN SMALL LETTER G WITH PALATAL HOOK"/* 1D83 */,/*7556*/"LATIN SMALL LETTER K WITH PALATAL HOOK"/* 1D84 */, /*7557*/"LATIN SMALL LETTER L WITH PALATAL HOOK"/* 1D85 */,/*7558*/"LATIN SMALL LETTER M WITH PALATAL HOOK"/* 1D86 */, /*7559*/"LATIN SMALL LETTER N WITH PALATAL HOOK"/* 1D87 */,/*7560*/"LATIN SMALL LETTER P WITH PALATAL HOOK"/* 1D88 */, /*7561*/"LATIN SMALL LETTER R WITH PALATAL HOOK"/* 1D89 */,/*7562*/"LATIN SMALL LETTER S WITH PALATAL HOOK"/* 1D8A */, /*7563*/"LATIN SMALL LETTER ESH WITH PALATAL HOOK"/* 1D8B */,/*7564*/"LATIN SMALL LETTER V WITH PALATAL HOOK"/* 1D8C */, /*7565*/"LATIN SMALL LETTER X WITH PALATAL HOOK"/* 1D8D */,/*7566*/"LATIN SMALL LETTER Z WITH PALATAL HOOK"/* 1D8E */, /*7567*/"LATIN SMALL LETTER A WITH RETROFLEX HOOK"/* 1D8F */, /*7568*/"LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK"/* 1D90 */, /*7569*/"LATIN SMALL LETTER D WITH HOOK AND TAIL"/* 1D91 */,/*7570*/"LATIN SMALL LETTER E WITH RETROFLEX HOOK"/* 1D92 */, /*7571*/"LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK"/* 1D93 */, /*7572*/"LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK"/* 1D94 */, /*7573*/"LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK"/* 1D95 */, /*7574*/"LATIN SMALL LETTER I WITH RETROFLEX HOOK"/* 1D96 */, /*7575*/"LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK"/* 1D97 */, /*7576*/"LATIN SMALL LETTER ESH WITH RETROFLEX HOOK"/* 1D98 */, /*7577*/"LATIN SMALL LETTER U WITH RETROFLEX HOOK"/* 1D99 */, /*7578*/"LATIN SMALL LETTER EZH WITH RETROFLEX HOOK"/* 1D9A */,/*7579*/"MODIFIER LETTER SMALL TURNED ALPHA"/* 1D9B */, /*7580*/"MODIFIER LETTER SMALL C"/* 1D9C */,/*7581*/"MODIFIER LETTER SMALL C WITH CURL"/* 1D9D */, /*7582*/"MODIFIER LETTER SMALL ETH"/* 1D9E */,/*7583*/"MODIFIER LETTER SMALL REVERSED OPEN E"/* 1D9F */, /*7584*/"MODIFIER LETTER SMALL F"/* 1DA0 */,/*7585*/"MODIFIER LETTER SMALL DOTLESS J WITH STROKE"/* 1DA1 */, /*7586*/"MODIFIER LETTER SMALL SCRIPT G"/* 1DA2 */,/*7587*/"MODIFIER LETTER SMALL TURNED H"/* 1DA3 */, /*7588*/"MODIFIER LETTER SMALL I WITH STROKE"/* 1DA4 */,/*7589*/"MODIFIER LETTER SMALL IOTA"/* 1DA5 */, /*7590*/"MODIFIER LETTER SMALL CAPITAL I"/* 1DA6 */,/*7591*/"MODIFIER LETTER SMALL CAPITAL I WITH STROKE"/* 1DA7 */, /*7592*/"MODIFIER LETTER SMALL J WITH CROSSED-TAIL"/* 1DA8 */, /*7593*/"MODIFIER LETTER SMALL L WITH RETROFLEX HOOK"/* 1DA9 */, /*7594*/"MODIFIER LETTER SMALL L WITH PALATAL HOOK"/* 1DAA */,/*7595*/"MODIFIER LETTER SMALL CAPITAL L"/* 1DAB */, /*7596*/"MODIFIER LETTER SMALL M WITH HOOK"/* 1DAC */,/*7597*/"MODIFIER LETTER SMALL TURNED M WITH LONG LEG"/* 1DAD */, /*7598*/"MODIFIER LETTER SMALL N WITH LEFT HOOK"/* 1DAE */, /*7599*/"MODIFIER LETTER SMALL N WITH RETROFLEX HOOK"/* 1DAF */,/*7600*/"MODIFIER LETTER SMALL CAPITAL N"/* 1DB0 */, /*7601*/"MODIFIER LETTER SMALL BARRED O"/* 1DB1 */,/*7602*/"MODIFIER LETTER SMALL PHI"/* 1DB2 */, /*7603*/"MODIFIER LETTER SMALL S WITH HOOK"/* 1DB3 */,/*7604*/"MODIFIER LETTER SMALL ESH"/* 1DB4 */, /*7605*/"MODIFIER LETTER SMALL T WITH PALATAL HOOK"/* 1DB5 */,/*7606*/"MODIFIER LETTER SMALL U BAR"/* 1DB6 */, /*7607*/"MODIFIER LETTER SMALL UPSILON"/* 1DB7 */,/*7608*/"MODIFIER LETTER SMALL CAPITAL U"/* 1DB8 */, /*7609*/"MODIFIER LETTER SMALL V WITH HOOK"/* 1DB9 */,/*7610*/"MODIFIER LETTER SMALL TURNED V"/* 1DBA */, /*7611*/"MODIFIER LETTER SMALL Z"/* 1DBB */,/*7612*/"MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK"/* 1DBC */, /*7613*/"MODIFIER LETTER SMALL Z WITH CURL"/* 1DBD */,/*7614*/"MODIFIER LETTER SMALL EZH"/* 1DBE */, /*7615*/"MODIFIER LETTER SMALL THETA"/* 1DBF */,/*7616*/"COMBINING DOTTED GRAVE ACCENT"/* 1DC0 */, /*7617*/"COMBINING DOTTED ACUTE ACCENT"/* 1DC1 */,/*7618*/"COMBINING SNAKE BELOW"/* 1DC2 */, /*7619*/"COMBINING SUSPENSION MARK"/* 1DC3 */,/*7620*/"COMBINING MACRON-ACUTE"/* 1DC4 */, /*7621*/"COMBINING GRAVE-MACRON"/* 1DC5 */,/*7622*/"COMBINING MACRON-GRAVE"/* 1DC6 */, /*7623*/"COMBINING ACUTE-MACRON"/* 1DC7 */,/*7624*/"COMBINING GRAVE-ACUTE-GRAVE"/* 1DC8 */, /*7625*/"COMBINING ACUTE-GRAVE-ACUTE"/* 1DC9 */,/*7626*/"COMBINING LATIN SMALL LETTER R BELOW"/* 1DCA */, /*7627*/"COMBINING BREVE-MACRON"/* 1DCB */,/*7628*/"COMBINING MACRON-BREVE"/* 1DCC */, /*7629*/"COMBINING DOUBLE CIRCUMFLEX ABOVE"/* 1DCD */,/*7630*/"COMBINING OGONEK ABOVE"/* 1DCE */, /*7631*/"COMBINING ZIGZAG BELOW"/* 1DCF */,/*7632*/"COMBINING IS BELOW"/* 1DD0 */,/*7633*/"COMBINING UR ABOVE"/* 1DD1 */, /*7634*/"COMBINING US ABOVE"/* 1DD2 */,/*7635*/"COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE"/* 1DD3 */, /*7636*/"COMBINING LATIN SMALL LETTER AE"/* 1DD4 */,/*7637*/"COMBINING LATIN SMALL LETTER AO"/* 1DD5 */, /*7638*/"COMBINING LATIN SMALL LETTER AV"/* 1DD6 */,/*7639*/"COMBINING LATIN SMALL LETTER C CEDILLA"/* 1DD7 */, /*7640*/"COMBINING LATIN SMALL LETTER INSULAR D"/* 1DD8 */,/*7641*/"COMBINING LATIN SMALL LETTER ETH"/* 1DD9 */, /*7642*/"COMBINING LATIN SMALL LETTER G"/* 1DDA */,/*7643*/"COMBINING LATIN LETTER SMALL CAPITAL G"/* 1DDB */, /*7644*/"COMBINING LATIN SMALL LETTER K"/* 1DDC */,/*7645*/"COMBINING LATIN SMALL LETTER L"/* 1DDD */, /*7646*/"COMBINING LATIN LETTER SMALL CAPITAL L"/* 1DDE */,/*7647*/"COMBINING LATIN LETTER SMALL CAPITAL M"/* 1DDF */, /*7648*/"COMBINING LATIN SMALL LETTER N"/* 1DE0 */,/*7649*/"COMBINING LATIN LETTER SMALL CAPITAL N"/* 1DE1 */, /*7650*/"COMBINING LATIN LETTER SMALL CAPITAL R"/* 1DE2 */,/*7651*/"COMBINING LATIN SMALL LETTER R ROTUNDA"/* 1DE3 */, /*7652*/"COMBINING LATIN SMALL LETTER S"/* 1DE4 */,/*7653*/"COMBINING LATIN SMALL LETTER LONG S"/* 1DE5 */, /*7654*/"COMBINING LATIN SMALL LETTER Z"/* 1DE6 */,/*7655*/"COMBINING LATIN SMALL LETTER ALPHA"/* 1DE7 */, /*7656*/"COMBINING LATIN SMALL LETTER B"/* 1DE8 */,/*7657*/"COMBINING LATIN SMALL LETTER BETA"/* 1DE9 */, /*7658*/"COMBINING LATIN SMALL LETTER SCHWA"/* 1DEA */,/*7659*/"COMBINING LATIN SMALL LETTER F"/* 1DEB */, /*7660*/"COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE"/* 1DEC */, /*7661*/"COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE"/* 1DED */, /*7662*/"COMBINING LATIN SMALL LETTER P"/* 1DEE */,/*7663*/"COMBINING LATIN SMALL LETTER ESH"/* 1DEF */, /*7664*/"COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE"/* 1DF0 */, /*7665*/"COMBINING LATIN SMALL LETTER W"/* 1DF1 */,/*7666*/"COMBINING LATIN SMALL LETTER A WITH DIAERESIS"/* 1DF2 */, /*7667*/"COMBINING LATIN SMALL LETTER O WITH DIAERESIS"/* 1DF3 */, /*7668*/"COMBINING LATIN SMALL LETTER U WITH DIAERESIS"/* 1DF4 */,/*7669*/"COMBINING UP TACK ABOVE"/* 1DF5 */,NULL,NULL, NULL,NULL,NULL,NULL,/*7676*/"COMBINING DOUBLE INVERTED BREVE BELOW"/* 1DFC */, /*7677*/"COMBINING ALMOST EQUAL TO BELOW"/* 1DFD */,/*7678*/"COMBINING LEFT ARROWHEAD ABOVE"/* 1DFE */, /*7679*/"COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW"/* 1DFF */, /*7680*/"LATIN CAPITAL LETTER A WITH RING BELOW"/* 1E00 */,/*7681*/"LATIN SMALL LETTER A WITH RING BELOW"/* 1E01 */, /*7682*/"LATIN CAPITAL LETTER B WITH DOT ABOVE"/* 1E02 */,/*7683*/"LATIN SMALL LETTER B WITH DOT ABOVE"/* 1E03 */, /*7684*/"LATIN CAPITAL LETTER B WITH DOT BELOW"/* 1E04 */,/*7685*/"LATIN SMALL LETTER B WITH DOT BELOW"/* 1E05 */, /*7686*/"LATIN CAPITAL LETTER B WITH LINE BELOW"/* 1E06 */,/*7687*/"LATIN SMALL LETTER B WITH LINE BELOW"/* 1E07 */, /*7688*/"LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE"/* 1E08 */, /*7689*/"LATIN SMALL LETTER C WITH CEDILLA AND ACUTE"/* 1E09 */, /*7690*/"LATIN CAPITAL LETTER D WITH DOT ABOVE"/* 1E0A */,/*7691*/"LATIN SMALL LETTER D WITH DOT ABOVE"/* 1E0B */, /*7692*/"LATIN CAPITAL LETTER D WITH DOT BELOW"/* 1E0C */,/*7693*/"LATIN SMALL LETTER D WITH DOT BELOW"/* 1E0D */, /*7694*/"LATIN CAPITAL LETTER D WITH LINE BELOW"/* 1E0E */,/*7695*/"LATIN SMALL LETTER D WITH LINE BELOW"/* 1E0F */, /*7696*/"LATIN CAPITAL LETTER D WITH CEDILLA"/* 1E10 */,/*7697*/"LATIN SMALL LETTER D WITH CEDILLA"/* 1E11 */, /*7698*/"LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW"/* 1E12 */, /*7699*/"LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW"/* 1E13 */, /*7700*/"LATIN CAPITAL LETTER E WITH MACRON AND GRAVE"/* 1E14 */, /*7701*/"LATIN SMALL LETTER E WITH MACRON AND GRAVE"/* 1E15 */, /*7702*/"LATIN CAPITAL LETTER E WITH MACRON AND ACUTE"/* 1E16 */, /*7703*/"LATIN SMALL LETTER E WITH MACRON AND ACUTE"/* 1E17 */, /*7704*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW"/* 1E18 */, /*7705*/"LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW"/* 1E19 */, /*7706*/"LATIN CAPITAL LETTER E WITH TILDE BELOW"/* 1E1A */,/*7707*/"LATIN SMALL LETTER E WITH TILDE BELOW"/* 1E1B */, /*7708*/"LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE"/* 1E1C */, /*7709*/"LATIN SMALL LETTER E WITH CEDILLA AND BREVE"/* 1E1D */, /*7710*/"LATIN CAPITAL LETTER F WITH DOT ABOVE"/* 1E1E */,/*7711*/"LATIN SMALL LETTER F WITH DOT ABOVE"/* 1E1F */, /*7712*/"LATIN CAPITAL LETTER G WITH MACRON"/* 1E20 */,/*7713*/"LATIN SMALL LETTER G WITH MACRON"/* 1E21 */, /*7714*/"LATIN CAPITAL LETTER H WITH DOT ABOVE"/* 1E22 */,/*7715*/"LATIN SMALL LETTER H WITH DOT ABOVE"/* 1E23 */, /*7716*/"LATIN CAPITAL LETTER H WITH DOT BELOW"/* 1E24 */,/*7717*/"LATIN SMALL LETTER H WITH DOT BELOW"/* 1E25 */, /*7718*/"LATIN CAPITAL LETTER H WITH DIAERESIS"/* 1E26 */,/*7719*/"LATIN SMALL LETTER H WITH DIAERESIS"/* 1E27 */, /*7720*/"LATIN CAPITAL LETTER H WITH CEDILLA"/* 1E28 */,/*7721*/"LATIN SMALL LETTER H WITH CEDILLA"/* 1E29 */, /*7722*/"LATIN CAPITAL LETTER H WITH BREVE BELOW"/* 1E2A */,/*7723*/"LATIN SMALL LETTER H WITH BREVE BELOW"/* 1E2B */, /*7724*/"LATIN CAPITAL LETTER I WITH TILDE BELOW"/* 1E2C */,/*7725*/"LATIN SMALL LETTER I WITH TILDE BELOW"/* 1E2D */, /*7726*/"LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE"/* 1E2E */, /*7727*/"LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE"/* 1E2F */,/*7728*/"LATIN CAPITAL LETTER K WITH ACUTE"/* 1E30 */, /*7729*/"LATIN SMALL LETTER K WITH ACUTE"/* 1E31 */,/*7730*/"LATIN CAPITAL LETTER K WITH DOT BELOW"/* 1E32 */, /*7731*/"LATIN SMALL LETTER K WITH DOT BELOW"/* 1E33 */,/*7732*/"LATIN CAPITAL LETTER K WITH LINE BELOW"/* 1E34 */, /*7733*/"LATIN SMALL LETTER K WITH LINE BELOW"/* 1E35 */,/*7734*/"LATIN CAPITAL LETTER L WITH DOT BELOW"/* 1E36 */, /*7735*/"LATIN SMALL LETTER L WITH DOT BELOW"/* 1E37 */, /*7736*/"LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON"/* 1E38 */, /*7737*/"LATIN SMALL LETTER L WITH DOT BELOW AND MACRON"/* 1E39 */, /*7738*/"LATIN CAPITAL LETTER L WITH LINE BELOW"/* 1E3A */,/*7739*/"LATIN SMALL LETTER L WITH LINE BELOW"/* 1E3B */, /*7740*/"LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW"/* 1E3C */, /*7741*/"LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW"/* 1E3D */,/*7742*/"LATIN CAPITAL LETTER M WITH ACUTE"/* 1E3E */, /*7743*/"LATIN SMALL LETTER M WITH ACUTE"/* 1E3F */,/*7744*/"LATIN CAPITAL LETTER M WITH DOT ABOVE"/* 1E40 */, /*7745*/"LATIN SMALL LETTER M WITH DOT ABOVE"/* 1E41 */,/*7746*/"LATIN CAPITAL LETTER M WITH DOT BELOW"/* 1E42 */, /*7747*/"LATIN SMALL LETTER M WITH DOT BELOW"/* 1E43 */,/*7748*/"LATIN CAPITAL LETTER N WITH DOT ABOVE"/* 1E44 */, /*7749*/"LATIN SMALL LETTER N WITH DOT ABOVE"/* 1E45 */,/*7750*/"LATIN CAPITAL LETTER N WITH DOT BELOW"/* 1E46 */, /*7751*/"LATIN SMALL LETTER N WITH DOT BELOW"/* 1E47 */,/*7752*/"LATIN CAPITAL LETTER N WITH LINE BELOW"/* 1E48 */, /*7753*/"LATIN SMALL LETTER N WITH LINE BELOW"/* 1E49 */, /*7754*/"LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW"/* 1E4A */, /*7755*/"LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW"/* 1E4B */, /*7756*/"LATIN CAPITAL LETTER O WITH TILDE AND ACUTE"/* 1E4C */, /*7757*/"LATIN SMALL LETTER O WITH TILDE AND ACUTE"/* 1E4D */, /*7758*/"LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS"/* 1E4E */, /*7759*/"LATIN SMALL LETTER O WITH TILDE AND DIAERESIS"/* 1E4F */, /*7760*/"LATIN CAPITAL LETTER O WITH MACRON AND GRAVE"/* 1E50 */, /*7761*/"LATIN SMALL LETTER O WITH MACRON AND GRAVE"/* 1E51 */, /*7762*/"LATIN CAPITAL LETTER O WITH MACRON AND ACUTE"/* 1E52 */, /*7763*/"LATIN SMALL LETTER O WITH MACRON AND ACUTE"/* 1E53 */,/*7764*/"LATIN CAPITAL LETTER P WITH ACUTE"/* 1E54 */, /*7765*/"LATIN SMALL LETTER P WITH ACUTE"/* 1E55 */,/*7766*/"LATIN CAPITAL LETTER P WITH DOT ABOVE"/* 1E56 */, /*7767*/"LATIN SMALL LETTER P WITH DOT ABOVE"/* 1E57 */,/*7768*/"LATIN CAPITAL LETTER R WITH DOT ABOVE"/* 1E58 */, /*7769*/"LATIN SMALL LETTER R WITH DOT ABOVE"/* 1E59 */,/*7770*/"LATIN CAPITAL LETTER R WITH DOT BELOW"/* 1E5A */, /*7771*/"LATIN SMALL LETTER R WITH DOT BELOW"/* 1E5B */, /*7772*/"LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON"/* 1E5C */, /*7773*/"LATIN SMALL LETTER R WITH DOT BELOW AND MACRON"/* 1E5D */, /*7774*/"LATIN CAPITAL LETTER R WITH LINE BELOW"/* 1E5E */,/*7775*/"LATIN SMALL LETTER R WITH LINE BELOW"/* 1E5F */, /*7776*/"LATIN CAPITAL LETTER S WITH DOT ABOVE"/* 1E60 */,/*7777*/"LATIN SMALL LETTER S WITH DOT ABOVE"/* 1E61 */, /*7778*/"LATIN CAPITAL LETTER S WITH DOT BELOW"/* 1E62 */,/*7779*/"LATIN SMALL LETTER S WITH DOT BELOW"/* 1E63 */, /*7780*/"LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE"/* 1E64 */, /*7781*/"LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE"/* 1E65 */, /*7782*/"LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE"/* 1E66 */, /*7783*/"LATIN SMALL LETTER S WITH CARON AND DOT ABOVE"/* 1E67 */, /*7784*/"LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE"/* 1E68 */, /*7785*/"LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE"/* 1E69 */, /*7786*/"LATIN CAPITAL LETTER T WITH DOT ABOVE"/* 1E6A */,/*7787*/"LATIN SMALL LETTER T WITH DOT ABOVE"/* 1E6B */, /*7788*/"LATIN CAPITAL LETTER T WITH DOT BELOW"/* 1E6C */,/*7789*/"LATIN SMALL LETTER T WITH DOT BELOW"/* 1E6D */, /*7790*/"LATIN CAPITAL LETTER T WITH LINE BELOW"/* 1E6E */,/*7791*/"LATIN SMALL LETTER T WITH LINE BELOW"/* 1E6F */, /*7792*/"LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW"/* 1E70 */, /*7793*/"LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW"/* 1E71 */, /*7794*/"LATIN CAPITAL LETTER U WITH DIAERESIS BELOW"/* 1E72 */, /*7795*/"LATIN SMALL LETTER U WITH DIAERESIS BELOW"/* 1E73 */, /*7796*/"LATIN CAPITAL LETTER U WITH TILDE BELOW"/* 1E74 */,/*7797*/"LATIN SMALL LETTER U WITH TILDE BELOW"/* 1E75 */, /*7798*/"LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW"/* 1E76 */, /*7799*/"LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW"/* 1E77 */, /*7800*/"LATIN CAPITAL LETTER U WITH TILDE AND ACUTE"/* 1E78 */, /*7801*/"LATIN SMALL LETTER U WITH TILDE AND ACUTE"/* 1E79 */, /*7802*/"LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS"/* 1E7A */, /*7803*/"LATIN SMALL LETTER U WITH MACRON AND DIAERESIS"/* 1E7B */,/*7804*/"LATIN CAPITAL LETTER V WITH TILDE"/* 1E7C */, /*7805*/"LATIN SMALL LETTER V WITH TILDE"/* 1E7D */,/*7806*/"LATIN CAPITAL LETTER V WITH DOT BELOW"/* 1E7E */, /*7807*/"LATIN SMALL LETTER V WITH DOT BELOW"/* 1E7F */,/*7808*/"LATIN CAPITAL LETTER W WITH GRAVE"/* 1E80 */, /*7809*/"LATIN SMALL LETTER W WITH GRAVE"/* 1E81 */,/*7810*/"LATIN CAPITAL LETTER W WITH ACUTE"/* 1E82 */, /*7811*/"LATIN SMALL LETTER W WITH ACUTE"/* 1E83 */,/*7812*/"LATIN CAPITAL LETTER W WITH DIAERESIS"/* 1E84 */, /*7813*/"LATIN SMALL LETTER W WITH DIAERESIS"/* 1E85 */,/*7814*/"LATIN CAPITAL LETTER W WITH DOT ABOVE"/* 1E86 */, /*7815*/"LATIN SMALL LETTER W WITH DOT ABOVE"/* 1E87 */,/*7816*/"LATIN CAPITAL LETTER W WITH DOT BELOW"/* 1E88 */, /*7817*/"LATIN SMALL LETTER W WITH DOT BELOW"/* 1E89 */,/*7818*/"LATIN CAPITAL LETTER X WITH DOT ABOVE"/* 1E8A */, /*7819*/"LATIN SMALL LETTER X WITH DOT ABOVE"/* 1E8B */,/*7820*/"LATIN CAPITAL LETTER X WITH DIAERESIS"/* 1E8C */, /*7821*/"LATIN SMALL LETTER X WITH DIAERESIS"/* 1E8D */,/*7822*/"LATIN CAPITAL LETTER Y WITH DOT ABOVE"/* 1E8E */, /*7823*/"LATIN SMALL LETTER Y WITH DOT ABOVE"/* 1E8F */,/*7824*/"LATIN CAPITAL LETTER Z WITH CIRCUMFLEX"/* 1E90 */, /*7825*/"LATIN SMALL LETTER Z WITH CIRCUMFLEX"/* 1E91 */,/*7826*/"LATIN CAPITAL LETTER Z WITH DOT BELOW"/* 1E92 */, /*7827*/"LATIN SMALL LETTER Z WITH DOT BELOW"/* 1E93 */,/*7828*/"LATIN CAPITAL LETTER Z WITH LINE BELOW"/* 1E94 */, /*7829*/"LATIN SMALL LETTER Z WITH LINE BELOW"/* 1E95 */,/*7830*/"LATIN SMALL LETTER H WITH LINE BELOW"/* 1E96 */, /*7831*/"LATIN SMALL LETTER T WITH DIAERESIS"/* 1E97 */,/*7832*/"LATIN SMALL LETTER W WITH RING ABOVE"/* 1E98 */, /*7833*/"LATIN SMALL LETTER Y WITH RING ABOVE"/* 1E99 */,/*7834*/"LATIN SMALL LETTER A WITH RIGHT HALF RING"/* 1E9A */, /*7835*/"LATIN SMALL LETTER LONG S WITH DOT ABOVE"/* 1E9B */, /*7836*/"LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE"/* 1E9C */, /*7837*/"LATIN SMALL LETTER LONG S WITH HIGH STROKE"/* 1E9D */,/*7838*/"LATIN CAPITAL LETTER SHARP S"/* 1E9E */, /*7839*/"LATIN SMALL LETTER DELTA"/* 1E9F */,/*7840*/"LATIN CAPITAL LETTER A WITH DOT BELOW"/* 1EA0 */, /*7841*/"LATIN SMALL LETTER A WITH DOT BELOW"/* 1EA1 */,/*7842*/"LATIN CAPITAL LETTER A WITH HOOK ABOVE"/* 1EA2 */, /*7843*/"LATIN SMALL LETTER A WITH HOOK ABOVE"/* 1EA3 */, /*7844*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE"/* 1EA4 */, /*7845*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE"/* 1EA5 */, /*7846*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE"/* 1EA6 */, /*7847*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE"/* 1EA7 */, /*7848*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EA8 */, /*7849*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EA9 */, /*7850*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE"/* 1EAA */, /*7851*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE"/* 1EAB */, /*7852*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW"/* 1EAC */, /*7853*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW"/* 1EAD */, /*7854*/"LATIN CAPITAL LETTER A WITH BREVE AND ACUTE"/* 1EAE */, /*7855*/"LATIN SMALL LETTER A WITH BREVE AND ACUTE"/* 1EAF */, /*7856*/"LATIN CAPITAL LETTER A WITH BREVE AND GRAVE"/* 1EB0 */, /*7857*/"LATIN SMALL LETTER A WITH BREVE AND GRAVE"/* 1EB1 */, /*7858*/"LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE"/* 1EB2 */, /*7859*/"LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE"/* 1EB3 */, /*7860*/"LATIN CAPITAL LETTER A WITH BREVE AND TILDE"/* 1EB4 */, /*7861*/"LATIN SMALL LETTER A WITH BREVE AND TILDE"/* 1EB5 */, /*7862*/"LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW"/* 1EB6 */, /*7863*/"LATIN SMALL LETTER A WITH BREVE AND DOT BELOW"/* 1EB7 */, /*7864*/"LATIN CAPITAL LETTER E WITH DOT BELOW"/* 1EB8 */,/*7865*/"LATIN SMALL LETTER E WITH DOT BELOW"/* 1EB9 */, /*7866*/"LATIN CAPITAL LETTER E WITH HOOK ABOVE"/* 1EBA */,/*7867*/"LATIN SMALL LETTER E WITH HOOK ABOVE"/* 1EBB */, /*7868*/"LATIN CAPITAL LETTER E WITH TILDE"/* 1EBC */,/*7869*/"LATIN SMALL LETTER E WITH TILDE"/* 1EBD */, /*7870*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE"/* 1EBE */, /*7871*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE"/* 1EBF */, /*7872*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE"/* 1EC0 */, /*7873*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE"/* 1EC1 */, /*7874*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EC2 */, /*7875*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EC3 */, /*7876*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE"/* 1EC4 */, /*7877*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE"/* 1EC5 */, /*7878*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW"/* 1EC6 */, /*7879*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW"/* 1EC7 */, /*7880*/"LATIN CAPITAL LETTER I WITH HOOK ABOVE"/* 1EC8 */,/*7881*/"LATIN SMALL LETTER I WITH HOOK ABOVE"/* 1EC9 */, /*7882*/"LATIN CAPITAL LETTER I WITH DOT BELOW"/* 1ECA */,/*7883*/"LATIN SMALL LETTER I WITH DOT BELOW"/* 1ECB */, /*7884*/"LATIN CAPITAL LETTER O WITH DOT BELOW"/* 1ECC */,/*7885*/"LATIN SMALL LETTER O WITH DOT BELOW"/* 1ECD */, /*7886*/"LATIN CAPITAL LETTER O WITH HOOK ABOVE"/* 1ECE */,/*7887*/"LATIN SMALL LETTER O WITH HOOK ABOVE"/* 1ECF */, /*7888*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE"/* 1ED0 */, /*7889*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE"/* 1ED1 */, /*7890*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE"/* 1ED2 */, /*7891*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE"/* 1ED3 */, /*7892*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"/* 1ED4 */, /*7893*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"/* 1ED5 */, /*7894*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE"/* 1ED6 */, /*7895*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE"/* 1ED7 */, /*7896*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW"/* 1ED8 */, /*7897*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW"/* 1ED9 */, /*7898*/"LATIN CAPITAL LETTER O WITH HORN AND ACUTE"/* 1EDA */, /*7899*/"LATIN SMALL LETTER O WITH HORN AND ACUTE"/* 1EDB */, /*7900*/"LATIN CAPITAL LETTER O WITH HORN AND GRAVE"/* 1EDC */, /*7901*/"LATIN SMALL LETTER O WITH HORN AND GRAVE"/* 1EDD */, /*7902*/"LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE"/* 1EDE */, /*7903*/"LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE"/* 1EDF */, /*7904*/"LATIN CAPITAL LETTER O WITH HORN AND TILDE"/* 1EE0 */, /*7905*/"LATIN SMALL LETTER O WITH HORN AND TILDE"/* 1EE1 */, /*7906*/"LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW"/* 1EE2 */, /*7907*/"LATIN SMALL LETTER O WITH HORN AND DOT BELOW"/* 1EE3 */, /*7908*/"LATIN CAPITAL LETTER U WITH DOT BELOW"/* 1EE4 */,/*7909*/"LATIN SMALL LETTER U WITH DOT BELOW"/* 1EE5 */, /*7910*/"LATIN CAPITAL LETTER U WITH HOOK ABOVE"/* 1EE6 */,/*7911*/"LATIN SMALL LETTER U WITH HOOK ABOVE"/* 1EE7 */, /*7912*/"LATIN CAPITAL LETTER U WITH HORN AND ACUTE"/* 1EE8 */, /*7913*/"LATIN SMALL LETTER U WITH HORN AND ACUTE"/* 1EE9 */, /*7914*/"LATIN CAPITAL LETTER U WITH HORN AND GRAVE"/* 1EEA */, /*7915*/"LATIN SMALL LETTER U WITH HORN AND GRAVE"/* 1EEB */, /*7916*/"LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE"/* 1EEC */, /*7917*/"LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE"/* 1EED */, /*7918*/"LATIN CAPITAL LETTER U WITH HORN AND TILDE"/* 1EEE */, /*7919*/"LATIN SMALL LETTER U WITH HORN AND TILDE"/* 1EEF */, /*7920*/"LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW"/* 1EF0 */, /*7921*/"LATIN SMALL LETTER U WITH HORN AND DOT BELOW"/* 1EF1 */,/*7922*/"LATIN CAPITAL LETTER Y WITH GRAVE"/* 1EF2 */, /*7923*/"LATIN SMALL LETTER Y WITH GRAVE"/* 1EF3 */,/*7924*/"LATIN CAPITAL LETTER Y WITH DOT BELOW"/* 1EF4 */, /*7925*/"LATIN SMALL LETTER Y WITH DOT BELOW"/* 1EF5 */,/*7926*/"LATIN CAPITAL LETTER Y WITH HOOK ABOVE"/* 1EF6 */, /*7927*/"LATIN SMALL LETTER Y WITH HOOK ABOVE"/* 1EF7 */,/*7928*/"LATIN CAPITAL LETTER Y WITH TILDE"/* 1EF8 */, /*7929*/"LATIN SMALL LETTER Y WITH TILDE"/* 1EF9 */,/*7930*/"LATIN CAPITAL LETTER MIDDLE-WELSH LL"/* 1EFA */, /*7931*/"LATIN SMALL LETTER MIDDLE-WELSH LL"/* 1EFB */,/*7932*/"LATIN CAPITAL LETTER MIDDLE-WELSH V"/* 1EFC */, /*7933*/"LATIN SMALL LETTER MIDDLE-WELSH V"/* 1EFD */,/*7934*/"LATIN CAPITAL LETTER Y WITH LOOP"/* 1EFE */, /*7935*/"LATIN SMALL LETTER Y WITH LOOP"/* 1EFF */,/*7936*/"GREEK SMALL LETTER ALPHA WITH PSILI"/* 1F00 */, /*7937*/"GREEK SMALL LETTER ALPHA WITH DASIA"/* 1F01 */, /*7938*/"GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA"/* 1F02 */, /*7939*/"GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA"/* 1F03 */, /*7940*/"GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA"/* 1F04 */, /*7941*/"GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA"/* 1F05 */, /*7942*/"GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI"/* 1F06 */, /*7943*/"GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI"/* 1F07 */, /*7944*/"GREEK CAPITAL LETTER ALPHA WITH PSILI"/* 1F08 */,/*7945*/"GREEK CAPITAL LETTER ALPHA WITH DASIA"/* 1F09 */, /*7946*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA"/* 1F0A */, /*7947*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA"/* 1F0B */, /*7948*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA"/* 1F0C */, /*7949*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA"/* 1F0D */, /*7950*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI"/* 1F0E */, /*7951*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI"/* 1F0F */, /*7952*/"GREEK SMALL LETTER EPSILON WITH PSILI"/* 1F10 */,/*7953*/"GREEK SMALL LETTER EPSILON WITH DASIA"/* 1F11 */, /*7954*/"GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA"/* 1F12 */, /*7955*/"GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA"/* 1F13 */, /*7956*/"GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA"/* 1F14 */, /*7957*/"GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA"/* 1F15 */,NULL,NULL, /*7960*/"GREEK CAPITAL LETTER EPSILON WITH PSILI"/* 1F18 */,/*7961*/"GREEK CAPITAL LETTER EPSILON WITH DASIA"/* 1F19 */, /*7962*/"GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA"/* 1F1A */, /*7963*/"GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA"/* 1F1B */, /*7964*/"GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA"/* 1F1C */, /*7965*/"GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA"/* 1F1D */,NULL,NULL, /*7968*/"GREEK SMALL LETTER ETA WITH PSILI"/* 1F20 */,/*7969*/"GREEK SMALL LETTER ETA WITH DASIA"/* 1F21 */, /*7970*/"GREEK SMALL LETTER ETA WITH PSILI AND VARIA"/* 1F22 */, /*7971*/"GREEK SMALL LETTER ETA WITH DASIA AND VARIA"/* 1F23 */, /*7972*/"GREEK SMALL LETTER ETA WITH PSILI AND OXIA"/* 1F24 */, /*7973*/"GREEK SMALL LETTER ETA WITH DASIA AND OXIA"/* 1F25 */, /*7974*/"GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI"/* 1F26 */, /*7975*/"GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI"/* 1F27 */, /*7976*/"GREEK CAPITAL LETTER ETA WITH PSILI"/* 1F28 */,/*7977*/"GREEK CAPITAL LETTER ETA WITH DASIA"/* 1F29 */, /*7978*/"GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA"/* 1F2A */, /*7979*/"GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA"/* 1F2B */, /*7980*/"GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA"/* 1F2C */, /*7981*/"GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA"/* 1F2D */, /*7982*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI"/* 1F2E */, /*7983*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI"/* 1F2F */, /*7984*/"GREEK SMALL LETTER IOTA WITH PSILI"/* 1F30 */,/*7985*/"GREEK SMALL LETTER IOTA WITH DASIA"/* 1F31 */, /*7986*/"GREEK SMALL LETTER IOTA WITH PSILI AND VARIA"/* 1F32 */, /*7987*/"GREEK SMALL LETTER IOTA WITH DASIA AND VARIA"/* 1F33 */, /*7988*/"GREEK SMALL LETTER IOTA WITH PSILI AND OXIA"/* 1F34 */, /*7989*/"GREEK SMALL LETTER IOTA WITH DASIA AND OXIA"/* 1F35 */, /*7990*/"GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI"/* 1F36 */, /*7991*/"GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI"/* 1F37 */, /*7992*/"GREEK CAPITAL LETTER IOTA WITH PSILI"/* 1F38 */,/*7993*/"GREEK CAPITAL LETTER IOTA WITH DASIA"/* 1F39 */, /*7994*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA"/* 1F3A */, /*7995*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA"/* 1F3B */, /*7996*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA"/* 1F3C */, /*7997*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA"/* 1F3D */, /*7998*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI"/* 1F3E */, /*7999*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI"/* 1F3F */, /*8000*/"GREEK SMALL LETTER OMICRON WITH PSILI"/* 1F40 */,/*8001*/"GREEK SMALL LETTER OMICRON WITH DASIA"/* 1F41 */, /*8002*/"GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA"/* 1F42 */, /*8003*/"GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA"/* 1F43 */, /*8004*/"GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA"/* 1F44 */, /*8005*/"GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA"/* 1F45 */,NULL,NULL, /*8008*/"GREEK CAPITAL LETTER OMICRON WITH PSILI"/* 1F48 */,/*8009*/"GREEK CAPITAL LETTER OMICRON WITH DASIA"/* 1F49 */, /*8010*/"GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA"/* 1F4A */, /*8011*/"GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA"/* 1F4B */, /*8012*/"GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA"/* 1F4C */, /*8013*/"GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA"/* 1F4D */,NULL,NULL, /*8016*/"GREEK SMALL LETTER UPSILON WITH PSILI"/* 1F50 */,/*8017*/"GREEK SMALL LETTER UPSILON WITH DASIA"/* 1F51 */, /*8018*/"GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA"/* 1F52 */, /*8019*/"GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA"/* 1F53 */, /*8020*/"GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA"/* 1F54 */, /*8021*/"GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA"/* 1F55 */, /*8022*/"GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI"/* 1F56 */, /*8023*/"GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI"/* 1F57 */,NULL, /*8025*/"GREEK CAPITAL LETTER UPSILON WITH DASIA"/* 1F59 */,NULL, /*8027*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA"/* 1F5B */,NULL, /*8029*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA"/* 1F5D */,NULL, /*8031*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI"/* 1F5F */, /*8032*/"GREEK SMALL LETTER OMEGA WITH PSILI"/* 1F60 */,/*8033*/"GREEK SMALL LETTER OMEGA WITH DASIA"/* 1F61 */, /*8034*/"GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA"/* 1F62 */, /*8035*/"GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA"/* 1F63 */, /*8036*/"GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA"/* 1F64 */, /*8037*/"GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA"/* 1F65 */, /*8038*/"GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI"/* 1F66 */, /*8039*/"GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI"/* 1F67 */, /*8040*/"GREEK CAPITAL LETTER OMEGA WITH PSILI"/* 1F68 */,/*8041*/"GREEK CAPITAL LETTER OMEGA WITH DASIA"/* 1F69 */, /*8042*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA"/* 1F6A */, /*8043*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA"/* 1F6B */, /*8044*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA"/* 1F6C */, /*8045*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA"/* 1F6D */, /*8046*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI"/* 1F6E */, /*8047*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI"/* 1F6F */, /*8048*/"GREEK SMALL LETTER ALPHA WITH VARIA"/* 1F70 */,/*8049*/"GREEK SMALL LETTER ALPHA WITH OXIA"/* 1F71 */, /*8050*/"GREEK SMALL LETTER EPSILON WITH VARIA"/* 1F72 */,/*8051*/"GREEK SMALL LETTER EPSILON WITH OXIA"/* 1F73 */, /*8052*/"GREEK SMALL LETTER ETA WITH VARIA"/* 1F74 */,/*8053*/"GREEK SMALL LETTER ETA WITH OXIA"/* 1F75 */, /*8054*/"GREEK SMALL LETTER IOTA WITH VARIA"/* 1F76 */,/*8055*/"GREEK SMALL LETTER IOTA WITH OXIA"/* 1F77 */, /*8056*/"GREEK SMALL LETTER OMICRON WITH VARIA"/* 1F78 */,/*8057*/"GREEK SMALL LETTER OMICRON WITH OXIA"/* 1F79 */, /*8058*/"GREEK SMALL LETTER UPSILON WITH VARIA"/* 1F7A */,/*8059*/"GREEK SMALL LETTER UPSILON WITH OXIA"/* 1F7B */, /*8060*/"GREEK SMALL LETTER OMEGA WITH VARIA"/* 1F7C */,/*8061*/"GREEK SMALL LETTER OMEGA WITH OXIA"/* 1F7D */,NULL,NULL, /*8064*/"GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"/* 1F80 */, /*8065*/"GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI"/* 1F81 */, /*8066*/"GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1F82 */, /*8067*/"GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1F83 */, /*8068*/"GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1F84 */, /*8069*/"GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1F85 */, /*8070*/"GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F86 */, /*8071*/"GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F87 */, /*8072*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI"/* 1F88 */, /*8073*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI"/* 1F89 */, /*8074*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1F8A */, /*8075*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1F8B */, /*8076*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1F8C */, /*8077*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1F8D */, /*8078*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F8E */, /*8079*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F8F */, /*8080*/"GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI"/* 1F90 */, /*8081*/"GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI"/* 1F91 */, /*8082*/"GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1F92 */, /*8083*/"GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1F93 */, /*8084*/"GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1F94 */, /*8085*/"GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1F95 */, /*8086*/"GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F96 */, /*8087*/"GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F97 */, /*8088*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI"/* 1F98 */, /*8089*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI"/* 1F99 */, /*8090*/"GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1F9A */, /*8091*/"GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1F9B */, /*8092*/"GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1F9C */, /*8093*/"GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1F9D */, /*8094*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F9E */, /*8095*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F9F */, /*8096*/"GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI"/* 1FA0 */, /*8097*/"GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI"/* 1FA1 */, /*8098*/"GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1FA2 */, /*8099*/"GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1FA3 */, /*8100*/"GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1FA4 */, /*8101*/"GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1FA5 */, /*8102*/"GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1FA6 */, /*8103*/"GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1FA7 */, /*8104*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI"/* 1FA8 */, /*8105*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI"/* 1FA9 */, /*8106*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1FAA */, /*8107*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1FAB */, /*8108*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1FAC */, /*8109*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1FAD */, /*8110*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1FAE */, /*8111*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1FAF */, /*8112*/"GREEK SMALL LETTER ALPHA WITH VRACHY"/* 1FB0 */,/*8113*/"GREEK SMALL LETTER ALPHA WITH MACRON"/* 1FB1 */, /*8114*/"GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI"/* 1FB2 */, /*8115*/"GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI"/* 1FB3 */, /*8116*/"GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI"/* 1FB4 */,NULL, /*8118*/"GREEK SMALL LETTER ALPHA WITH PERISPOMENI"/* 1FB6 */, /*8119*/"GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FB7 */, /*8120*/"GREEK CAPITAL LETTER ALPHA WITH VRACHY"/* 1FB8 */,/*8121*/"GREEK CAPITAL LETTER ALPHA WITH MACRON"/* 1FB9 */, /*8122*/"GREEK CAPITAL LETTER ALPHA WITH VARIA"/* 1FBA */,/*8123*/"GREEK CAPITAL LETTER ALPHA WITH OXIA"/* 1FBB */, /*8124*/"GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI"/* 1FBC */,/*8125*/"GREEK KORONIS"/* 1FBD */, /*8126*/"GREEK PROSGEGRAMMENI"/* 1FBE */,/*8127*/"GREEK PSILI"/* 1FBF */,/*8128*/"GREEK PERISPOMENI"/* 1FC0 */, /*8129*/"GREEK DIALYTIKA AND PERISPOMENI"/* 1FC1 */, /*8130*/"GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI"/* 1FC2 */, /*8131*/"GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI"/* 1FC3 */, /*8132*/"GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI"/* 1FC4 */,NULL, /*8134*/"GREEK SMALL LETTER ETA WITH PERISPOMENI"/* 1FC6 */, /*8135*/"GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FC7 */, /*8136*/"GREEK CAPITAL LETTER EPSILON WITH VARIA"/* 1FC8 */,/*8137*/"GREEK CAPITAL LETTER EPSILON WITH OXIA"/* 1FC9 */, /*8138*/"GREEK CAPITAL LETTER ETA WITH VARIA"/* 1FCA */,/*8139*/"GREEK CAPITAL LETTER ETA WITH OXIA"/* 1FCB */, /*8140*/"GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI"/* 1FCC */,/*8141*/"GREEK PSILI AND VARIA"/* 1FCD */, /*8142*/"GREEK PSILI AND OXIA"/* 1FCE */,/*8143*/"GREEK PSILI AND PERISPOMENI"/* 1FCF */, /*8144*/"GREEK SMALL LETTER IOTA WITH VRACHY"/* 1FD0 */,/*8145*/"GREEK SMALL LETTER IOTA WITH MACRON"/* 1FD1 */, /*8146*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA"/* 1FD2 */, /*8147*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA"/* 1FD3 */,NULL,NULL, /*8150*/"GREEK SMALL LETTER IOTA WITH PERISPOMENI"/* 1FD6 */, /*8151*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI"/* 1FD7 */, /*8152*/"GREEK CAPITAL LETTER IOTA WITH VRACHY"/* 1FD8 */,/*8153*/"GREEK CAPITAL LETTER IOTA WITH MACRON"/* 1FD9 */, /*8154*/"GREEK CAPITAL LETTER IOTA WITH VARIA"/* 1FDA */,/*8155*/"GREEK CAPITAL LETTER IOTA WITH OXIA"/* 1FDB */,NULL, /*8157*/"GREEK DASIA AND VARIA"/* 1FDD */,/*8158*/"GREEK DASIA AND OXIA"/* 1FDE */, /*8159*/"GREEK DASIA AND PERISPOMENI"/* 1FDF */,/*8160*/"GREEK SMALL LETTER UPSILON WITH VRACHY"/* 1FE0 */, /*8161*/"GREEK SMALL LETTER UPSILON WITH MACRON"/* 1FE1 */, /*8162*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA"/* 1FE2 */, /*8163*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA"/* 1FE3 */, /*8164*/"GREEK SMALL LETTER RHO WITH PSILI"/* 1FE4 */,/*8165*/"GREEK SMALL LETTER RHO WITH DASIA"/* 1FE5 */, /*8166*/"GREEK SMALL LETTER UPSILON WITH PERISPOMENI"/* 1FE6 */, /*8167*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI"/* 1FE7 */, /*8168*/"GREEK CAPITAL LETTER UPSILON WITH VRACHY"/* 1FE8 */, /*8169*/"GREEK CAPITAL LETTER UPSILON WITH MACRON"/* 1FE9 */,/*8170*/"GREEK CAPITAL LETTER UPSILON WITH VARIA"/* 1FEA */, /*8171*/"GREEK CAPITAL LETTER UPSILON WITH OXIA"/* 1FEB */,/*8172*/"GREEK CAPITAL LETTER RHO WITH DASIA"/* 1FEC */, /*8173*/"GREEK DIALYTIKA AND VARIA"/* 1FED */,/*8174*/"GREEK DIALYTIKA AND OXIA"/* 1FEE */, /*8175*/"GREEK VARIA"/* 1FEF */,NULL,NULL,/*8178*/"GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI"/* 1FF2 */, /*8179*/"GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI"/* 1FF3 */, /*8180*/"GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI"/* 1FF4 */,NULL, /*8182*/"GREEK SMALL LETTER OMEGA WITH PERISPOMENI"/* 1FF6 */, /*8183*/"GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FF7 */, /*8184*/"GREEK CAPITAL LETTER OMICRON WITH VARIA"/* 1FF8 */,/*8185*/"GREEK CAPITAL LETTER OMICRON WITH OXIA"/* 1FF9 */, /*8186*/"GREEK CAPITAL LETTER OMEGA WITH VARIA"/* 1FFA */,/*8187*/"GREEK CAPITAL LETTER OMEGA WITH OXIA"/* 1FFB */, /*8188*/"GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI"/* 1FFC */,/*8189*/"GREEK OXIA"/* 1FFD */, /*8190*/"GREEK DASIA"/* 1FFE */,NULL,/*8192*/"EN QUAD"/* 2000 */,/*8193*/"EM QUAD"/* 2001 */, /*8194*/"EN SPACE"/* 2002 */,/*8195*/"EM SPACE"/* 2003 */,/*8196*/"THREE-PER-EM SPACE"/* 2004 */, /*8197*/"FOUR-PER-EM SPACE"/* 2005 */,/*8198*/"SIX-PER-EM SPACE"/* 2006 */,/*8199*/"FIGURE SPACE"/* 2007 */, /*8200*/"PUNCTUATION SPACE"/* 2008 */,/*8201*/"THIN SPACE"/* 2009 */,/*8202*/"HAIR SPACE"/* 200A */, /*8203*/"ZERO WIDTH SPACE"/* 200B */,/*8204*/"ZERO WIDTH NON-JOINER"/* 200C */,/*8205*/"ZERO WIDTH JOINER"/* 200D */, /*8206*/"LEFT-TO-RIGHT MARK"/* 200E */,/*8207*/"RIGHT-TO-LEFT MARK"/* 200F */,/*8208*/"HYPHEN"/* 2010 */, /*8209*/"NON-BREAKING HYPHEN"/* 2011 */,/*8210*/"FIGURE DASH"/* 2012 */,/*8211*/"EN DASH"/* 2013 */, /*8212*/"EM DASH"/* 2014 */,/*8213*/"HORIZONTAL BAR"/* 2015 */,/*8214*/"DOUBLE VERTICAL LINE"/* 2016 */, /*8215*/"DOUBLE LOW LINE"/* 2017 */,/*8216*/"LEFT SINGLE QUOTATION MARK"/* 2018 */, /*8217*/"RIGHT SINGLE QUOTATION MARK"/* 2019 */,/*8218*/"SINGLE LOW-9 QUOTATION MARK"/* 201A */, /*8219*/"SINGLE HIGH-REVERSED-9 QUOTATION MARK"/* 201B */,/*8220*/"LEFT DOUBLE QUOTATION MARK"/* 201C */, /*8221*/"RIGHT DOUBLE QUOTATION MARK"/* 201D */,/*8222*/"DOUBLE LOW-9 QUOTATION MARK"/* 201E */, /*8223*/"DOUBLE HIGH-REVERSED-9 QUOTATION MARK"/* 201F */,/*8224*/"DAGGER"/* 2020 */,/*8225*/"DOUBLE DAGGER"/* 2021 */, /*8226*/"BULLET"/* 2022 */,/*8227*/"TRIANGULAR BULLET"/* 2023 */,/*8228*/"ONE DOT LEADER"/* 2024 */, /*8229*/"TWO DOT LEADER"/* 2025 */,/*8230*/"HORIZONTAL ELLIPSIS"/* 2026 */,/*8231*/"HYPHENATION POINT"/* 2027 */, /*8232*/"LINE SEPARATOR"/* 2028 */,/*8233*/"PARAGRAPH SEPARATOR"/* 2029 */,/*8234*/"LEFT-TO-RIGHT EMBEDDING"/* 202A */, /*8235*/"RIGHT-TO-LEFT EMBEDDING"/* 202B */,/*8236*/"POP DIRECTIONAL FORMATTING"/* 202C */, /*8237*/"LEFT-TO-RIGHT OVERRIDE"/* 202D */,/*8238*/"RIGHT-TO-LEFT OVERRIDE"/* 202E */, /*8239*/"NARROW NO-BREAK SPACE"/* 202F */,/*8240*/"PER MILLE SIGN"/* 2030 */,/*8241*/"PER TEN THOUSAND SIGN"/* 2031 */, /*8242*/"PRIME"/* 2032 */,/*8243*/"DOUBLE PRIME"/* 2033 */,/*8244*/"TRIPLE PRIME"/* 2034 */, /*8245*/"REVERSED PRIME"/* 2035 */,/*8246*/"REVERSED DOUBLE PRIME"/* 2036 */,/*8247*/"REVERSED TRIPLE PRIME"/* 2037 */, /*8248*/"CARET"/* 2038 */,/*8249*/"SINGLE LEFT-POINTING ANGLE QUOTATION MARK"/* 2039 */, /*8250*/"SINGLE RIGHT-POINTING ANGLE QUOTATION MARK"/* 203A */,/*8251*/"REFERENCE MARK"/* 203B */, /*8252*/"DOUBLE EXCLAMATION MARK"/* 203C */,/*8253*/"INTERROBANG"/* 203D */,/*8254*/"OVERLINE"/* 203E */, /*8255*/"UNDERTIE"/* 203F */,/*8256*/"CHARACTER TIE"/* 2040 */,/*8257*/"CARET INSERTION POINT"/* 2041 */, /*8258*/"ASTERISM"/* 2042 */,/*8259*/"HYPHEN BULLET"/* 2043 */,/*8260*/"FRACTION SLASH"/* 2044 */, /*8261*/"LEFT SQUARE BRACKET WITH QUILL"/* 2045 */,/*8262*/"RIGHT SQUARE BRACKET WITH QUILL"/* 2046 */, /*8263*/"DOUBLE QUESTION MARK"/* 2047 */,/*8264*/"QUESTION EXCLAMATION MARK"/* 2048 */, /*8265*/"EXCLAMATION QUESTION MARK"/* 2049 */,/*8266*/"TIRONIAN SIGN ET"/* 204A */, /*8267*/"REVERSED PILCROW SIGN"/* 204B */,/*8268*/"BLACK LEFTWARDS BULLET"/* 204C */, /*8269*/"BLACK RIGHTWARDS BULLET"/* 204D */,/*8270*/"LOW ASTERISK"/* 204E */,/*8271*/"REVERSED SEMICOLON"/* 204F */, /*8272*/"CLOSE UP"/* 2050 */,/*8273*/"TWO ASTERISKS ALIGNED VERTICALLY"/* 2051 */, /*8274*/"COMMERCIAL MINUS SIGN"/* 2052 */,/*8275*/"SWUNG DASH"/* 2053 */,/*8276*/"INVERTED UNDERTIE"/* 2054 */, /*8277*/"FLOWER PUNCTUATION MARK"/* 2055 */,/*8278*/"THREE DOT PUNCTUATION"/* 2056 */, /*8279*/"QUADRUPLE PRIME"/* 2057 */,/*8280*/"FOUR DOT PUNCTUATION"/* 2058 */,/*8281*/"FIVE DOT PUNCTUATION"/* 2059 */, /*8282*/"TWO DOT PUNCTUATION"/* 205A */,/*8283*/"FOUR DOT MARK"/* 205B */,/*8284*/"DOTTED CROSS"/* 205C */, /*8285*/"TRICOLON"/* 205D */,/*8286*/"VERTICAL FOUR DOTS"/* 205E */,/*8287*/"MEDIUM MATHEMATICAL SPACE"/* 205F */, /*8288*/"WORD JOINER"/* 2060 */,/*8289*/"FUNCTION APPLICATION"/* 2061 */,/*8290*/"INVISIBLE TIMES"/* 2062 */, /*8291*/"INVISIBLE SEPARATOR"/* 2063 */,/*8292*/"INVISIBLE PLUS"/* 2064 */,NULL, /*8294*/"LEFT-TO-RIGHT ISOLATE"/* 2066 */,/*8295*/"RIGHT-TO-LEFT ISOLATE"/* 2067 */, /*8296*/"FIRST STRONG ISOLATE"/* 2068 */,/*8297*/"POP DIRECTIONAL ISOLATE"/* 2069 */, /*8298*/"INHIBIT SYMMETRIC SWAPPING"/* 206A */,/*8299*/"ACTIVATE SYMMETRIC SWAPPING"/* 206B */, /*8300*/"INHIBIT ARABIC FORM SHAPING"/* 206C */,/*8301*/"ACTIVATE ARABIC FORM SHAPING"/* 206D */, /*8302*/"NATIONAL DIGIT SHAPES"/* 206E */,/*8303*/"NOMINAL DIGIT SHAPES"/* 206F */,/*8304*/"SUPERSCRIPT ZERO"/* 2070 */, /*8305*/"SUPERSCRIPT LATIN SMALL LETTER I"/* 2071 */,NULL,NULL,/*8308*/"SUPERSCRIPT FOUR"/* 2074 */, /*8309*/"SUPERSCRIPT FIVE"/* 2075 */,/*8310*/"SUPERSCRIPT SIX"/* 2076 */,/*8311*/"SUPERSCRIPT SEVEN"/* 2077 */, /*8312*/"SUPERSCRIPT EIGHT"/* 2078 */,/*8313*/"SUPERSCRIPT NINE"/* 2079 */,/*8314*/"SUPERSCRIPT PLUS SIGN"/* 207A */, /*8315*/"SUPERSCRIPT MINUS"/* 207B */,/*8316*/"SUPERSCRIPT EQUALS SIGN"/* 207C */, /*8317*/"SUPERSCRIPT LEFT PARENTHESIS"/* 207D */,/*8318*/"SUPERSCRIPT RIGHT PARENTHESIS"/* 207E */, /*8319*/"SUPERSCRIPT LATIN SMALL LETTER N"/* 207F */,/*8320*/"SUBSCRIPT ZERO"/* 2080 */, /*8321*/"SUBSCRIPT ONE"/* 2081 */,/*8322*/"SUBSCRIPT TWO"/* 2082 */,/*8323*/"SUBSCRIPT THREE"/* 2083 */, /*8324*/"SUBSCRIPT FOUR"/* 2084 */,/*8325*/"SUBSCRIPT FIVE"/* 2085 */,/*8326*/"SUBSCRIPT SIX"/* 2086 */, /*8327*/"SUBSCRIPT SEVEN"/* 2087 */,/*8328*/"SUBSCRIPT EIGHT"/* 2088 */,/*8329*/"SUBSCRIPT NINE"/* 2089 */, /*8330*/"SUBSCRIPT PLUS SIGN"/* 208A */,/*8331*/"SUBSCRIPT MINUS"/* 208B */,/*8332*/"SUBSCRIPT EQUALS SIGN"/* 208C */, /*8333*/"SUBSCRIPT LEFT PARENTHESIS"/* 208D */,/*8334*/"SUBSCRIPT RIGHT PARENTHESIS"/* 208E */,NULL, /*8336*/"LATIN SUBSCRIPT SMALL LETTER A"/* 2090 */,/*8337*/"LATIN SUBSCRIPT SMALL LETTER E"/* 2091 */, /*8338*/"LATIN SUBSCRIPT SMALL LETTER O"/* 2092 */,/*8339*/"LATIN SUBSCRIPT SMALL LETTER X"/* 2093 */, /*8340*/"LATIN SUBSCRIPT SMALL LETTER SCHWA"/* 2094 */,/*8341*/"LATIN SUBSCRIPT SMALL LETTER H"/* 2095 */, /*8342*/"LATIN SUBSCRIPT SMALL LETTER K"/* 2096 */,/*8343*/"LATIN SUBSCRIPT SMALL LETTER L"/* 2097 */, /*8344*/"LATIN SUBSCRIPT SMALL LETTER M"/* 2098 */,/*8345*/"LATIN SUBSCRIPT SMALL LETTER N"/* 2099 */, /*8346*/"LATIN SUBSCRIPT SMALL LETTER P"/* 209A */,/*8347*/"LATIN SUBSCRIPT SMALL LETTER S"/* 209B */, /*8348*/"LATIN SUBSCRIPT SMALL LETTER T"/* 209C */,NULL,NULL,NULL,/*8352*/"EURO-CURRENCY SIGN"/* 20A0 */, /*8353*/"COLON SIGN"/* 20A1 */,/*8354*/"CRUZEIRO SIGN"/* 20A2 */,/*8355*/"FRENCH FRANC SIGN"/* 20A3 */, /*8356*/"LIRA SIGN"/* 20A4 */,/*8357*/"MILL SIGN"/* 20A5 */,/*8358*/"NAIRA SIGN"/* 20A6 */, /*8359*/"PESETA SIGN"/* 20A7 */,/*8360*/"RUPEE SIGN"/* 20A8 */,/*8361*/"WON SIGN"/* 20A9 */, /*8362*/"NEW SHEQEL SIGN"/* 20AA */,/*8363*/"DONG SIGN"/* 20AB */,/*8364*/"EURO SIGN"/* 20AC */, /*8365*/"KIP SIGN"/* 20AD */,/*8366*/"TUGRIK SIGN"/* 20AE */,/*8367*/"DRACHMA SIGN"/* 20AF */, /*8368*/"GERMAN PENNY SIGN"/* 20B0 */,/*8369*/"PESO SIGN"/* 20B1 */,/*8370*/"GUARANI SIGN"/* 20B2 */, /*8371*/"AUSTRAL SIGN"/* 20B3 */,/*8372*/"HRYVNIA SIGN"/* 20B4 */,/*8373*/"CEDI SIGN"/* 20B5 */, /*8374*/"LIVRE TOURNOIS SIGN"/* 20B6 */,/*8375*/"SPESMILO SIGN"/* 20B7 */,/*8376*/"TENGE SIGN"/* 20B8 */, /*8377*/"INDIAN RUPEE SIGN"/* 20B9 */,/*8378*/"TURKISH LIRA SIGN"/* 20BA */,/*8379*/"NORDIC MARK SIGN"/* 20BB */, /*8380*/"MANAT SIGN"/* 20BC */,/*8381*/"RUBLE SIGN"/* 20BD */,/*8382*/"LARI SIGN"/* 20BE */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*8400*/"COMBINING LEFT HARPOON ABOVE"/* 20D0 */, /*8401*/"COMBINING RIGHT HARPOON ABOVE"/* 20D1 */,/*8402*/"COMBINING LONG VERTICAL LINE OVERLAY"/* 20D2 */, /*8403*/"COMBINING SHORT VERTICAL LINE OVERLAY"/* 20D3 */,/*8404*/"COMBINING ANTICLOCKWISE ARROW ABOVE"/* 20D4 */, /*8405*/"COMBINING CLOCKWISE ARROW ABOVE"/* 20D5 */,/*8406*/"COMBINING LEFT ARROW ABOVE"/* 20D6 */, /*8407*/"COMBINING RIGHT ARROW ABOVE"/* 20D7 */,/*8408*/"COMBINING RING OVERLAY"/* 20D8 */, /*8409*/"COMBINING CLOCKWISE RING OVERLAY"/* 20D9 */,/*8410*/"COMBINING ANTICLOCKWISE RING OVERLAY"/* 20DA */, /*8411*/"COMBINING THREE DOTS ABOVE"/* 20DB */,/*8412*/"COMBINING FOUR DOTS ABOVE"/* 20DC */, /*8413*/"COMBINING ENCLOSING CIRCLE"/* 20DD */,/*8414*/"COMBINING ENCLOSING SQUARE"/* 20DE */, /*8415*/"COMBINING ENCLOSING DIAMOND"/* 20DF */,/*8416*/"COMBINING ENCLOSING CIRCLE BACKSLASH"/* 20E0 */, /*8417*/"COMBINING LEFT RIGHT ARROW ABOVE"/* 20E1 */,/*8418*/"COMBINING ENCLOSING SCREEN"/* 20E2 */, /*8419*/"COMBINING ENCLOSING KEYCAP"/* 20E3 */,/*8420*/"COMBINING ENCLOSING UPWARD POINTING TRIANGLE"/* 20E4 */, /*8421*/"COMBINING REVERSE SOLIDUS OVERLAY"/* 20E5 */,/*8422*/"COMBINING DOUBLE VERTICAL STROKE OVERLAY"/* 20E6 */, /*8423*/"COMBINING ANNUITY SYMBOL"/* 20E7 */,/*8424*/"COMBINING TRIPLE UNDERDOT"/* 20E8 */, /*8425*/"COMBINING WIDE BRIDGE ABOVE"/* 20E9 */,/*8426*/"COMBINING LEFTWARDS ARROW OVERLAY"/* 20EA */, /*8427*/"COMBINING LONG DOUBLE SOLIDUS OVERLAY"/* 20EB */, /*8428*/"COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS"/* 20EC */, /*8429*/"COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS"/* 20ED */,/*8430*/"COMBINING LEFT ARROW BELOW"/* 20EE */, /*8431*/"COMBINING RIGHT ARROW BELOW"/* 20EF */,/*8432*/"COMBINING ASTERISK ABOVE"/* 20F0 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*8448*/"ACCOUNT OF"/* 2100 */, /*8449*/"ADDRESSED TO THE SUBJECT"/* 2101 */,/*8450*/"DOUBLE-STRUCK CAPITAL C"/* 2102 */, /*8451*/"DEGREE CELSIUS"/* 2103 */,/*8452*/"CENTRE LINE SYMBOL"/* 2104 */,/*8453*/"CARE OF"/* 2105 */, /*8454*/"CADA UNA"/* 2106 */,/*8455*/"EULER CONSTANT"/* 2107 */,/*8456*/"SCRUPLE"/* 2108 */, /*8457*/"DEGREE FAHRENHEIT"/* 2109 */,/*8458*/"SCRIPT SMALL G"/* 210A */,/*8459*/"SCRIPT CAPITAL H"/* 210B */, /*8460*/"BLACK-LETTER CAPITAL H"/* 210C */,/*8461*/"DOUBLE-STRUCK CAPITAL H"/* 210D */, /*8462*/"PLANCK CONSTANT"/* 210E */,/*8463*/"PLANCK CONSTANT OVER TWO PI"/* 210F */,/*8464*/"SCRIPT CAPITAL I"/* 2110 */, /*8465*/"BLACK-LETTER CAPITAL I"/* 2111 */,/*8466*/"SCRIPT CAPITAL L"/* 2112 */,/*8467*/"SCRIPT SMALL L"/* 2113 */, /*8468*/"L B BAR SYMBOL"/* 2114 */,/*8469*/"DOUBLE-STRUCK CAPITAL N"/* 2115 */,/*8470*/"NUMERO SIGN"/* 2116 */, /*8471*/"SOUND RECORDING COPYRIGHT"/* 2117 */,/*8472*/"SCRIPT CAPITAL P"/* 2118 */, /*8473*/"DOUBLE-STRUCK CAPITAL P"/* 2119 */,/*8474*/"DOUBLE-STRUCK CAPITAL Q"/* 211A */, /*8475*/"SCRIPT CAPITAL R"/* 211B */,/*8476*/"BLACK-LETTER CAPITAL R"/* 211C */, /*8477*/"DOUBLE-STRUCK CAPITAL R"/* 211D */,/*8478*/"PRESCRIPTION TAKE"/* 211E */,/*8479*/"RESPONSE"/* 211F */, /*8480*/"SERVICE MARK"/* 2120 */,/*8481*/"TELEPHONE SIGN"/* 2121 */,/*8482*/"TRADE MARK SIGN"/* 2122 */, /*8483*/"VERSICLE"/* 2123 */,/*8484*/"DOUBLE-STRUCK CAPITAL Z"/* 2124 */,/*8485*/"OUNCE SIGN"/* 2125 */, /*8486*/"OHM SIGN"/* 2126 */,/*8487*/"INVERTED OHM SIGN"/* 2127 */,/*8488*/"BLACK-LETTER CAPITAL Z"/* 2128 */, /*8489*/"TURNED GREEK SMALL LETTER IOTA"/* 2129 */,/*8490*/"KELVIN SIGN"/* 212A */,/*8491*/"ANGSTROM SIGN"/* 212B */, /*8492*/"SCRIPT CAPITAL B"/* 212C */,/*8493*/"BLACK-LETTER CAPITAL C"/* 212D */,/*8494*/"ESTIMATED SYMBOL"/* 212E */, /*8495*/"SCRIPT SMALL E"/* 212F */,/*8496*/"SCRIPT CAPITAL E"/* 2130 */,/*8497*/"SCRIPT CAPITAL F"/* 2131 */, /*8498*/"TURNED CAPITAL F"/* 2132 */,/*8499*/"SCRIPT CAPITAL M"/* 2133 */,/*8500*/"SCRIPT SMALL O"/* 2134 */, /*8501*/"ALEF SYMBOL"/* 2135 */,/*8502*/"BET SYMBOL"/* 2136 */,/*8503*/"GIMEL SYMBOL"/* 2137 */, /*8504*/"DALET SYMBOL"/* 2138 */,/*8505*/"INFORMATION SOURCE"/* 2139 */,/*8506*/"ROTATED CAPITAL Q"/* 213A */, /*8507*/"FACSIMILE SIGN"/* 213B */,/*8508*/"DOUBLE-STRUCK SMALL PI"/* 213C */, /*8509*/"DOUBLE-STRUCK SMALL GAMMA"/* 213D */,/*8510*/"DOUBLE-STRUCK CAPITAL GAMMA"/* 213E */, /*8511*/"DOUBLE-STRUCK CAPITAL PI"/* 213F */,/*8512*/"DOUBLE-STRUCK N-ARY SUMMATION"/* 2140 */, /*8513*/"TURNED SANS-SERIF CAPITAL G"/* 2141 */,/*8514*/"TURNED SANS-SERIF CAPITAL L"/* 2142 */, /*8515*/"REVERSED SANS-SERIF CAPITAL L"/* 2143 */,/*8516*/"TURNED SANS-SERIF CAPITAL Y"/* 2144 */, /*8517*/"DOUBLE-STRUCK ITALIC CAPITAL D"/* 2145 */,/*8518*/"DOUBLE-STRUCK ITALIC SMALL D"/* 2146 */, /*8519*/"DOUBLE-STRUCK ITALIC SMALL E"/* 2147 */,/*8520*/"DOUBLE-STRUCK ITALIC SMALL I"/* 2148 */, /*8521*/"DOUBLE-STRUCK ITALIC SMALL J"/* 2149 */,/*8522*/"PROPERTY LINE"/* 214A */,/*8523*/"TURNED AMPERSAND"/* 214B */, /*8524*/"PER SIGN"/* 214C */,/*8525*/"AKTIESELSKAB"/* 214D */,/*8526*/"TURNED SMALL F"/* 214E */, /*8527*/"SYMBOL FOR SAMARITAN SOURCE"/* 214F */,/*8528*/"VULGAR FRACTION ONE SEVENTH"/* 2150 */, /*8529*/"VULGAR FRACTION ONE NINTH"/* 2151 */,/*8530*/"VULGAR FRACTION ONE TENTH"/* 2152 */, /*8531*/"VULGAR FRACTION ONE THIRD"/* 2153 */,/*8532*/"VULGAR FRACTION TWO THIRDS"/* 2154 */, /*8533*/"VULGAR FRACTION ONE FIFTH"/* 2155 */,/*8534*/"VULGAR FRACTION TWO FIFTHS"/* 2156 */, /*8535*/"VULGAR FRACTION THREE FIFTHS"/* 2157 */,/*8536*/"VULGAR FRACTION FOUR FIFTHS"/* 2158 */, /*8537*/"VULGAR FRACTION ONE SIXTH"/* 2159 */,/*8538*/"VULGAR FRACTION FIVE SIXTHS"/* 215A */, /*8539*/"VULGAR FRACTION ONE EIGHTH"/* 215B */,/*8540*/"VULGAR FRACTION THREE EIGHTHS"/* 215C */, /*8541*/"VULGAR FRACTION FIVE EIGHTHS"/* 215D */,/*8542*/"VULGAR FRACTION SEVEN EIGHTHS"/* 215E */, /*8543*/"FRACTION NUMERATOR ONE"/* 215F */,/*8544*/"ROMAN NUMERAL ONE"/* 2160 */,/*8545*/"ROMAN NUMERAL TWO"/* 2161 */, /*8546*/"ROMAN NUMERAL THREE"/* 2162 */,/*8547*/"ROMAN NUMERAL FOUR"/* 2163 */,/*8548*/"ROMAN NUMERAL FIVE"/* 2164 */, /*8549*/"ROMAN NUMERAL SIX"/* 2165 */,/*8550*/"ROMAN NUMERAL SEVEN"/* 2166 */,/*8551*/"ROMAN NUMERAL EIGHT"/* 2167 */, /*8552*/"ROMAN NUMERAL NINE"/* 2168 */,/*8553*/"ROMAN NUMERAL TEN"/* 2169 */,/*8554*/"ROMAN NUMERAL ELEVEN"/* 216A */, /*8555*/"ROMAN NUMERAL TWELVE"/* 216B */,/*8556*/"ROMAN NUMERAL FIFTY"/* 216C */, /*8557*/"ROMAN NUMERAL ONE HUNDRED"/* 216D */,/*8558*/"ROMAN NUMERAL FIVE HUNDRED"/* 216E */, /*8559*/"ROMAN NUMERAL ONE THOUSAND"/* 216F */,/*8560*/"SMALL ROMAN NUMERAL ONE"/* 2170 */, /*8561*/"SMALL ROMAN NUMERAL TWO"/* 2171 */,/*8562*/"SMALL ROMAN NUMERAL THREE"/* 2172 */, /*8563*/"SMALL ROMAN NUMERAL FOUR"/* 2173 */,/*8564*/"SMALL ROMAN NUMERAL FIVE"/* 2174 */, /*8565*/"SMALL ROMAN NUMERAL SIX"/* 2175 */,/*8566*/"SMALL ROMAN NUMERAL SEVEN"/* 2176 */, /*8567*/"SMALL ROMAN NUMERAL EIGHT"/* 2177 */,/*8568*/"SMALL ROMAN NUMERAL NINE"/* 2178 */, /*8569*/"SMALL ROMAN NUMERAL TEN"/* 2179 */,/*8570*/"SMALL ROMAN NUMERAL ELEVEN"/* 217A */, /*8571*/"SMALL ROMAN NUMERAL TWELVE"/* 217B */,/*8572*/"SMALL ROMAN NUMERAL FIFTY"/* 217C */, /*8573*/"SMALL ROMAN NUMERAL ONE HUNDRED"/* 217D */,/*8574*/"SMALL ROMAN NUMERAL FIVE HUNDRED"/* 217E */, /*8575*/"SMALL ROMAN NUMERAL ONE THOUSAND"/* 217F */,/*8576*/"ROMAN NUMERAL ONE THOUSAND C D"/* 2180 */, /*8577*/"ROMAN NUMERAL FIVE THOUSAND"/* 2181 */,/*8578*/"ROMAN NUMERAL TEN THOUSAND"/* 2182 */, /*8579*/"ROMAN NUMERAL REVERSED ONE HUNDRED"/* 2183 */,/*8580*/"LATIN SMALL LETTER REVERSED C"/* 2184 */, /*8581*/"ROMAN NUMERAL SIX LATE FORM"/* 2185 */,/*8582*/"ROMAN NUMERAL FIFTY EARLY FORM"/* 2186 */, /*8583*/"ROMAN NUMERAL FIFTY THOUSAND"/* 2187 */,/*8584*/"ROMAN NUMERAL ONE HUNDRED THOUSAND"/* 2188 */, /*8585*/"VULGAR FRACTION ZERO THIRDS"/* 2189 */,/*8586*/"TURNED DIGIT TWO"/* 218A */, /*8587*/"TURNED DIGIT THREE"/* 218B */,NULL,NULL,NULL,NULL,/*8592*/"LEFTWARDS ARROW"/* 2190 */, /*8593*/"UPWARDS ARROW"/* 2191 */,/*8594*/"RIGHTWARDS ARROW"/* 2192 */,/*8595*/"DOWNWARDS ARROW"/* 2193 */, /*8596*/"LEFT RIGHT ARROW"/* 2194 */,/*8597*/"UP DOWN ARROW"/* 2195 */,/*8598*/"NORTH WEST ARROW"/* 2196 */, /*8599*/"NORTH EAST ARROW"/* 2197 */,/*8600*/"SOUTH EAST ARROW"/* 2198 */,/*8601*/"SOUTH WEST ARROW"/* 2199 */, /*8602*/"LEFTWARDS ARROW WITH STROKE"/* 219A */,/*8603*/"RIGHTWARDS ARROW WITH STROKE"/* 219B */, /*8604*/"LEFTWARDS WAVE ARROW"/* 219C */,/*8605*/"RIGHTWARDS WAVE ARROW"/* 219D */, /*8606*/"LEFTWARDS TWO HEADED ARROW"/* 219E */,/*8607*/"UPWARDS TWO HEADED ARROW"/* 219F */, /*8608*/"RIGHTWARDS TWO HEADED ARROW"/* 21A0 */,/*8609*/"DOWNWARDS TWO HEADED ARROW"/* 21A1 */, /*8610*/"LEFTWARDS ARROW WITH TAIL"/* 21A2 */,/*8611*/"RIGHTWARDS ARROW WITH TAIL"/* 21A3 */, /*8612*/"LEFTWARDS ARROW FROM BAR"/* 21A4 */,/*8613*/"UPWARDS ARROW FROM BAR"/* 21A5 */, /*8614*/"RIGHTWARDS ARROW FROM BAR"/* 21A6 */,/*8615*/"DOWNWARDS ARROW FROM BAR"/* 21A7 */, /*8616*/"UP DOWN ARROW WITH BASE"/* 21A8 */,/*8617*/"LEFTWARDS ARROW WITH HOOK"/* 21A9 */, /*8618*/"RIGHTWARDS ARROW WITH HOOK"/* 21AA */,/*8619*/"LEFTWARDS ARROW WITH LOOP"/* 21AB */, /*8620*/"RIGHTWARDS ARROW WITH LOOP"/* 21AC */,/*8621*/"LEFT RIGHT WAVE ARROW"/* 21AD */, /*8622*/"LEFT RIGHT ARROW WITH STROKE"/* 21AE */,/*8623*/"DOWNWARDS ZIGZAG ARROW"/* 21AF */, /*8624*/"UPWARDS ARROW WITH TIP LEFTWARDS"/* 21B0 */,/*8625*/"UPWARDS ARROW WITH TIP RIGHTWARDS"/* 21B1 */, /*8626*/"DOWNWARDS ARROW WITH TIP LEFTWARDS"/* 21B2 */,/*8627*/"DOWNWARDS ARROW WITH TIP RIGHTWARDS"/* 21B3 */, /*8628*/"RIGHTWARDS ARROW WITH CORNER DOWNWARDS"/* 21B4 */,/*8629*/"DOWNWARDS ARROW WITH CORNER LEFTWARDS"/* 21B5 */, /*8630*/"ANTICLOCKWISE TOP SEMICIRCLE ARROW"/* 21B6 */,/*8631*/"CLOCKWISE TOP SEMICIRCLE ARROW"/* 21B7 */, /*8632*/"NORTH WEST ARROW TO LONG BAR"/* 21B8 */,/*8633*/"LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR"/* 21B9 */, /*8634*/"ANTICLOCKWISE OPEN CIRCLE ARROW"/* 21BA */,/*8635*/"CLOCKWISE OPEN CIRCLE ARROW"/* 21BB */, /*8636*/"LEFTWARDS HARPOON WITH BARB UPWARDS"/* 21BC */,/*8637*/"LEFTWARDS HARPOON WITH BARB DOWNWARDS"/* 21BD */, /*8638*/"UPWARDS HARPOON WITH BARB RIGHTWARDS"/* 21BE */,/*8639*/"UPWARDS HARPOON WITH BARB LEFTWARDS"/* 21BF */, /*8640*/"RIGHTWARDS HARPOON WITH BARB UPWARDS"/* 21C0 */,/*8641*/"RIGHTWARDS HARPOON WITH BARB DOWNWARDS"/* 21C1 */, /*8642*/"DOWNWARDS HARPOON WITH BARB RIGHTWARDS"/* 21C2 */,/*8643*/"DOWNWARDS HARPOON WITH BARB LEFTWARDS"/* 21C3 */, /*8644*/"RIGHTWARDS ARROW OVER LEFTWARDS ARROW"/* 21C4 */,/*8645*/"UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW"/* 21C5 */, /*8646*/"LEFTWARDS ARROW OVER RIGHTWARDS ARROW"/* 21C6 */,/*8647*/"LEFTWARDS PAIRED ARROWS"/* 21C7 */, /*8648*/"UPWARDS PAIRED ARROWS"/* 21C8 */,/*8649*/"RIGHTWARDS PAIRED ARROWS"/* 21C9 */, /*8650*/"DOWNWARDS PAIRED ARROWS"/* 21CA */,/*8651*/"LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON"/* 21CB */, /*8652*/"RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON"/* 21CC */,/*8653*/"LEFTWARDS DOUBLE ARROW WITH STROKE"/* 21CD */, /*8654*/"LEFT RIGHT DOUBLE ARROW WITH STROKE"/* 21CE */,/*8655*/"RIGHTWARDS DOUBLE ARROW WITH STROKE"/* 21CF */, /*8656*/"LEFTWARDS DOUBLE ARROW"/* 21D0 */,/*8657*/"UPWARDS DOUBLE ARROW"/* 21D1 */, /*8658*/"RIGHTWARDS DOUBLE ARROW"/* 21D2 */,/*8659*/"DOWNWARDS DOUBLE ARROW"/* 21D3 */, /*8660*/"LEFT RIGHT DOUBLE ARROW"/* 21D4 */,/*8661*/"UP DOWN DOUBLE ARROW"/* 21D5 */, /*8662*/"NORTH WEST DOUBLE ARROW"/* 21D6 */,/*8663*/"NORTH EAST DOUBLE ARROW"/* 21D7 */, /*8664*/"SOUTH EAST DOUBLE ARROW"/* 21D8 */,/*8665*/"SOUTH WEST DOUBLE ARROW"/* 21D9 */, /*8666*/"LEFTWARDS TRIPLE ARROW"/* 21DA */,/*8667*/"RIGHTWARDS TRIPLE ARROW"/* 21DB */, /*8668*/"LEFTWARDS SQUIGGLE ARROW"/* 21DC */,/*8669*/"RIGHTWARDS SQUIGGLE ARROW"/* 21DD */, /*8670*/"UPWARDS ARROW WITH DOUBLE STROKE"/* 21DE */,/*8671*/"DOWNWARDS ARROW WITH DOUBLE STROKE"/* 21DF */, /*8672*/"LEFTWARDS DASHED ARROW"/* 21E0 */,/*8673*/"UPWARDS DASHED ARROW"/* 21E1 */, /*8674*/"RIGHTWARDS DASHED ARROW"/* 21E2 */,/*8675*/"DOWNWARDS DASHED ARROW"/* 21E3 */, /*8676*/"LEFTWARDS ARROW TO BAR"/* 21E4 */,/*8677*/"RIGHTWARDS ARROW TO BAR"/* 21E5 */, /*8678*/"LEFTWARDS WHITE ARROW"/* 21E6 */,/*8679*/"UPWARDS WHITE ARROW"/* 21E7 */, /*8680*/"RIGHTWARDS WHITE ARROW"/* 21E8 */,/*8681*/"DOWNWARDS WHITE ARROW"/* 21E9 */, /*8682*/"UPWARDS WHITE ARROW FROM BAR"/* 21EA */,/*8683*/"UPWARDS WHITE ARROW ON PEDESTAL"/* 21EB */, /*8684*/"UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR"/* 21EC */, /*8685*/"UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR"/* 21ED */,/*8686*/"UPWARDS WHITE DOUBLE ARROW"/* 21EE */, /*8687*/"UPWARDS WHITE DOUBLE ARROW ON PEDESTAL"/* 21EF */,/*8688*/"RIGHTWARDS WHITE ARROW FROM WALL"/* 21F0 */, /*8689*/"NORTH WEST ARROW TO CORNER"/* 21F1 */,/*8690*/"SOUTH EAST ARROW TO CORNER"/* 21F2 */, /*8691*/"UP DOWN WHITE ARROW"/* 21F3 */,/*8692*/"RIGHT ARROW WITH SMALL CIRCLE"/* 21F4 */, /*8693*/"DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW"/* 21F5 */,/*8694*/"THREE RIGHTWARDS ARROWS"/* 21F6 */, /*8695*/"LEFTWARDS ARROW WITH VERTICAL STROKE"/* 21F7 */,/*8696*/"RIGHTWARDS ARROW WITH VERTICAL STROKE"/* 21F8 */, /*8697*/"LEFT RIGHT ARROW WITH VERTICAL STROKE"/* 21F9 */, /*8698*/"LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE"/* 21FA */, /*8699*/"RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE"/* 21FB */, /*8700*/"LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE"/* 21FC */,/*8701*/"LEFTWARDS OPEN-HEADED ARROW"/* 21FD */, /*8702*/"RIGHTWARDS OPEN-HEADED ARROW"/* 21FE */,/*8703*/"LEFT RIGHT OPEN-HEADED ARROW"/* 21FF */, /*8704*/"FOR ALL"/* 2200 */,/*8705*/"COMPLEMENT"/* 2201 */,/*8706*/"PARTIAL DIFFERENTIAL"/* 2202 */, /*8707*/"THERE EXISTS"/* 2203 */,/*8708*/"THERE DOES NOT EXIST"/* 2204 */,/*8709*/"EMPTY SET"/* 2205 */, /*8710*/"INCREMENT"/* 2206 */,/*8711*/"NABLA"/* 2207 */,/*8712*/"ELEMENT OF"/* 2208 */, /*8713*/"NOT AN ELEMENT OF"/* 2209 */,/*8714*/"SMALL ELEMENT OF"/* 220A */,/*8715*/"CONTAINS AS MEMBER"/* 220B */, /*8716*/"DOES NOT CONTAIN AS MEMBER"/* 220C */,/*8717*/"SMALL CONTAINS AS MEMBER"/* 220D */, /*8718*/"END OF PROOF"/* 220E */,/*8719*/"N-ARY PRODUCT"/* 220F */,/*8720*/"N-ARY COPRODUCT"/* 2210 */, /*8721*/"N-ARY SUMMATION"/* 2211 */,/*8722*/"MINUS SIGN"/* 2212 */,/*8723*/"MINUS-OR-PLUS SIGN"/* 2213 */, /*8724*/"DOT PLUS"/* 2214 */,/*8725*/"DIVISION SLASH"/* 2215 */,/*8726*/"SET MINUS"/* 2216 */, /*8727*/"ASTERISK OPERATOR"/* 2217 */,/*8728*/"RING OPERATOR"/* 2218 */,/*8729*/"BULLET OPERATOR"/* 2219 */, /*8730*/"SQUARE ROOT"/* 221A */,/*8731*/"CUBE ROOT"/* 221B */,/*8732*/"FOURTH ROOT"/* 221C */, /*8733*/"PROPORTIONAL TO"/* 221D */,/*8734*/"INFINITY"/* 221E */,/*8735*/"RIGHT ANGLE"/* 221F */, /*8736*/"ANGLE"/* 2220 */,/*8737*/"MEASURED ANGLE"/* 2221 */,/*8738*/"SPHERICAL ANGLE"/* 2222 */, /*8739*/"DIVIDES"/* 2223 */,/*8740*/"DOES NOT DIVIDE"/* 2224 */,/*8741*/"PARALLEL TO"/* 2225 */, /*8742*/"NOT PARALLEL TO"/* 2226 */,/*8743*/"LOGICAL AND"/* 2227 */,/*8744*/"LOGICAL OR"/* 2228 */, /*8745*/"INTERSECTION"/* 2229 */,/*8746*/"UNION"/* 222A */,/*8747*/"INTEGRAL"/* 222B */, /*8748*/"DOUBLE INTEGRAL"/* 222C */,/*8749*/"TRIPLE INTEGRAL"/* 222D */,/*8750*/"CONTOUR INTEGRAL"/* 222E */, /*8751*/"SURFACE INTEGRAL"/* 222F */,/*8752*/"VOLUME INTEGRAL"/* 2230 */,/*8753*/"CLOCKWISE INTEGRAL"/* 2231 */, /*8754*/"CLOCKWISE CONTOUR INTEGRAL"/* 2232 */,/*8755*/"ANTICLOCKWISE CONTOUR INTEGRAL"/* 2233 */, /*8756*/"THEREFORE"/* 2234 */,/*8757*/"BECAUSE"/* 2235 */,/*8758*/"RATIO"/* 2236 */,/*8759*/"PROPORTION"/* 2237 */, /*8760*/"DOT MINUS"/* 2238 */,/*8761*/"EXCESS"/* 2239 */,/*8762*/"GEOMETRIC PROPORTION"/* 223A */, /*8763*/"HOMOTHETIC"/* 223B */,/*8764*/"TILDE OPERATOR"/* 223C */,/*8765*/"REVERSED TILDE"/* 223D */, /*8766*/"INVERTED LAZY S"/* 223E */,/*8767*/"SINE WAVE"/* 223F */,/*8768*/"WREATH PRODUCT"/* 2240 */, /*8769*/"NOT TILDE"/* 2241 */,/*8770*/"MINUS TILDE"/* 2242 */,/*8771*/"ASYMPTOTICALLY EQUAL TO"/* 2243 */, /*8772*/"NOT ASYMPTOTICALLY EQUAL TO"/* 2244 */,/*8773*/"APPROXIMATELY EQUAL TO"/* 2245 */, /*8774*/"APPROXIMATELY BUT NOT ACTUALLY EQUAL TO"/* 2246 */, /*8775*/"NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO"/* 2247 */,/*8776*/"ALMOST EQUAL TO"/* 2248 */, /*8777*/"NOT ALMOST EQUAL TO"/* 2249 */,/*8778*/"ALMOST EQUAL OR EQUAL TO"/* 224A */,/*8779*/"TRIPLE TILDE"/* 224B */, /*8780*/"ALL EQUAL TO"/* 224C */,/*8781*/"EQUIVALENT TO"/* 224D */,/*8782*/"GEOMETRICALLY EQUIVALENT TO"/* 224E */, /*8783*/"DIFFERENCE BETWEEN"/* 224F */,/*8784*/"APPROACHES THE LIMIT"/* 2250 */, /*8785*/"GEOMETRICALLY EQUAL TO"/* 2251 */,/*8786*/"APPROXIMATELY EQUAL TO OR THE IMAGE OF"/* 2252 */, /*8787*/"IMAGE OF OR APPROXIMATELY EQUAL TO"/* 2253 */,/*8788*/"COLON EQUALS"/* 2254 */,/*8789*/"EQUALS COLON"/* 2255 */, /*8790*/"RING IN EQUAL TO"/* 2256 */,/*8791*/"RING EQUAL TO"/* 2257 */,/*8792*/"CORRESPONDS TO"/* 2258 */, /*8793*/"ESTIMATES"/* 2259 */,/*8794*/"EQUIANGULAR TO"/* 225A */,/*8795*/"STAR EQUALS"/* 225B */, /*8796*/"DELTA EQUAL TO"/* 225C */,/*8797*/"EQUAL TO BY DEFINITION"/* 225D */,/*8798*/"MEASURED BY"/* 225E */, /*8799*/"QUESTIONED EQUAL TO"/* 225F */,/*8800*/"NOT EQUAL TO"/* 2260 */,/*8801*/"IDENTICAL TO"/* 2261 */, /*8802*/"NOT IDENTICAL TO"/* 2262 */,/*8803*/"STRICTLY EQUIVALENT TO"/* 2263 */, /*8804*/"LESS-THAN OR EQUAL TO"/* 2264 */,/*8805*/"GREATER-THAN OR EQUAL TO"/* 2265 */, /*8806*/"LESS-THAN OVER EQUAL TO"/* 2266 */,/*8807*/"GREATER-THAN OVER EQUAL TO"/* 2267 */, /*8808*/"LESS-THAN BUT NOT EQUAL TO"/* 2268 */,/*8809*/"GREATER-THAN BUT NOT EQUAL TO"/* 2269 */, /*8810*/"MUCH LESS-THAN"/* 226A */,/*8811*/"MUCH GREATER-THAN"/* 226B */,/*8812*/"BETWEEN"/* 226C */, /*8813*/"NOT EQUIVALENT TO"/* 226D */,/*8814*/"NOT LESS-THAN"/* 226E */,/*8815*/"NOT GREATER-THAN"/* 226F */, /*8816*/"NEITHER LESS-THAN NOR EQUAL TO"/* 2270 */,/*8817*/"NEITHER GREATER-THAN NOR EQUAL TO"/* 2271 */, /*8818*/"LESS-THAN OR EQUIVALENT TO"/* 2272 */,/*8819*/"GREATER-THAN OR EQUIVALENT TO"/* 2273 */, /*8820*/"NEITHER LESS-THAN NOR EQUIVALENT TO"/* 2274 */,/*8821*/"NEITHER GREATER-THAN NOR EQUIVALENT TO"/* 2275 */, /*8822*/"LESS-THAN OR GREATER-THAN"/* 2276 */,/*8823*/"GREATER-THAN OR LESS-THAN"/* 2277 */, /*8824*/"NEITHER LESS-THAN NOR GREATER-THAN"/* 2278 */,/*8825*/"NEITHER GREATER-THAN NOR LESS-THAN"/* 2279 */, /*8826*/"PRECEDES"/* 227A */,/*8827*/"SUCCEEDS"/* 227B */,/*8828*/"PRECEDES OR EQUAL TO"/* 227C */, /*8829*/"SUCCEEDS OR EQUAL TO"/* 227D */,/*8830*/"PRECEDES OR EQUIVALENT TO"/* 227E */, /*8831*/"SUCCEEDS OR EQUIVALENT TO"/* 227F */,/*8832*/"DOES NOT PRECEDE"/* 2280 */,/*8833*/"DOES NOT SUCCEED"/* 2281 */, /*8834*/"SUBSET OF"/* 2282 */,/*8835*/"SUPERSET OF"/* 2283 */,/*8836*/"NOT A SUBSET OF"/* 2284 */, /*8837*/"NOT A SUPERSET OF"/* 2285 */,/*8838*/"SUBSET OF OR EQUAL TO"/* 2286 */, /*8839*/"SUPERSET OF OR EQUAL TO"/* 2287 */,/*8840*/"NEITHER A SUBSET OF NOR EQUAL TO"/* 2288 */, /*8841*/"NEITHER A SUPERSET OF NOR EQUAL TO"/* 2289 */,/*8842*/"SUBSET OF WITH NOT EQUAL TO"/* 228A */, /*8843*/"SUPERSET OF WITH NOT EQUAL TO"/* 228B */,/*8844*/"MULTISET"/* 228C */, /*8845*/"MULTISET MULTIPLICATION"/* 228D */,/*8846*/"MULTISET UNION"/* 228E */,/*8847*/"SQUARE IMAGE OF"/* 228F */, /*8848*/"SQUARE ORIGINAL OF"/* 2290 */,/*8849*/"SQUARE IMAGE OF OR EQUAL TO"/* 2291 */, /*8850*/"SQUARE ORIGINAL OF OR EQUAL TO"/* 2292 */,/*8851*/"SQUARE CAP"/* 2293 */,/*8852*/"SQUARE CUP"/* 2294 */, /*8853*/"CIRCLED PLUS"/* 2295 */,/*8854*/"CIRCLED MINUS"/* 2296 */,/*8855*/"CIRCLED TIMES"/* 2297 */, /*8856*/"CIRCLED DIVISION SLASH"/* 2298 */,/*8857*/"CIRCLED DOT OPERATOR"/* 2299 */, /*8858*/"CIRCLED RING OPERATOR"/* 229A */,/*8859*/"CIRCLED ASTERISK OPERATOR"/* 229B */, /*8860*/"CIRCLED EQUALS"/* 229C */,/*8861*/"CIRCLED DASH"/* 229D */,/*8862*/"SQUARED PLUS"/* 229E */, /*8863*/"SQUARED MINUS"/* 229F */,/*8864*/"SQUARED TIMES"/* 22A0 */,/*8865*/"SQUARED DOT OPERATOR"/* 22A1 */, /*8866*/"RIGHT TACK"/* 22A2 */,/*8867*/"LEFT TACK"/* 22A3 */,/*8868*/"DOWN TACK"/* 22A4 */,/*8869*/"UP TACK"/* 22A5 */, /*8870*/"ASSERTION"/* 22A6 */,/*8871*/"MODELS"/* 22A7 */,/*8872*/"TRUE"/* 22A8 */,/*8873*/"FORCES"/* 22A9 */, /*8874*/"TRIPLE VERTICAL BAR RIGHT TURNSTILE"/* 22AA */,/*8875*/"DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE"/* 22AB */, /*8876*/"DOES NOT PROVE"/* 22AC */,/*8877*/"NOT TRUE"/* 22AD */,/*8878*/"DOES NOT FORCE"/* 22AE */, /*8879*/"NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE"/* 22AF */,/*8880*/"PRECEDES UNDER RELATION"/* 22B0 */, /*8881*/"SUCCEEDS UNDER RELATION"/* 22B1 */,/*8882*/"NORMAL SUBGROUP OF"/* 22B2 */, /*8883*/"CONTAINS AS NORMAL SUBGROUP"/* 22B3 */,/*8884*/"NORMAL SUBGROUP OF OR EQUAL TO"/* 22B4 */, /*8885*/"CONTAINS AS NORMAL SUBGROUP OR EQUAL TO"/* 22B5 */,/*8886*/"ORIGINAL OF"/* 22B6 */,/*8887*/"IMAGE OF"/* 22B7 */, /*8888*/"MULTIMAP"/* 22B8 */,/*8889*/"HERMITIAN CONJUGATE MATRIX"/* 22B9 */,/*8890*/"INTERCALATE"/* 22BA */, /*8891*/"XOR"/* 22BB */,/*8892*/"NAND"/* 22BC */,/*8893*/"NOR"/* 22BD */,/*8894*/"RIGHT ANGLE WITH ARC"/* 22BE */, /*8895*/"RIGHT TRIANGLE"/* 22BF */,/*8896*/"N-ARY LOGICAL AND"/* 22C0 */,/*8897*/"N-ARY LOGICAL OR"/* 22C1 */, /*8898*/"N-ARY INTERSECTION"/* 22C2 */,/*8899*/"N-ARY UNION"/* 22C3 */,/*8900*/"DIAMOND OPERATOR"/* 22C4 */, /*8901*/"DOT OPERATOR"/* 22C5 */,/*8902*/"STAR OPERATOR"/* 22C6 */,/*8903*/"DIVISION TIMES"/* 22C7 */, /*8904*/"BOWTIE"/* 22C8 */,/*8905*/"LEFT NORMAL FACTOR SEMIDIRECT PRODUCT"/* 22C9 */, /*8906*/"RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT"/* 22CA */,/*8907*/"LEFT SEMIDIRECT PRODUCT"/* 22CB */, /*8908*/"RIGHT SEMIDIRECT PRODUCT"/* 22CC */,/*8909*/"REVERSED TILDE EQUALS"/* 22CD */, /*8910*/"CURLY LOGICAL OR"/* 22CE */,/*8911*/"CURLY LOGICAL AND"/* 22CF */,/*8912*/"DOUBLE SUBSET"/* 22D0 */, /*8913*/"DOUBLE SUPERSET"/* 22D1 */,/*8914*/"DOUBLE INTERSECTION"/* 22D2 */,/*8915*/"DOUBLE UNION"/* 22D3 */, /*8916*/"PITCHFORK"/* 22D4 */,/*8917*/"EQUAL AND PARALLEL TO"/* 22D5 */,/*8918*/"LESS-THAN WITH DOT"/* 22D6 */, /*8919*/"GREATER-THAN WITH DOT"/* 22D7 */,/*8920*/"VERY MUCH LESS-THAN"/* 22D8 */, /*8921*/"VERY MUCH GREATER-THAN"/* 22D9 */,/*8922*/"LESS-THAN EQUAL TO OR GREATER-THAN"/* 22DA */, /*8923*/"GREATER-THAN EQUAL TO OR LESS-THAN"/* 22DB */,/*8924*/"EQUAL TO OR LESS-THAN"/* 22DC */, /*8925*/"EQUAL TO OR GREATER-THAN"/* 22DD */,/*8926*/"EQUAL TO OR PRECEDES"/* 22DE */, /*8927*/"EQUAL TO OR SUCCEEDS"/* 22DF */,/*8928*/"DOES NOT PRECEDE OR EQUAL"/* 22E0 */, /*8929*/"DOES NOT SUCCEED OR EQUAL"/* 22E1 */,/*8930*/"NOT SQUARE IMAGE OF OR EQUAL TO"/* 22E2 */, /*8931*/"NOT SQUARE ORIGINAL OF OR EQUAL TO"/* 22E3 */,/*8932*/"SQUARE IMAGE OF OR NOT EQUAL TO"/* 22E4 */, /*8933*/"SQUARE ORIGINAL OF OR NOT EQUAL TO"/* 22E5 */,/*8934*/"LESS-THAN BUT NOT EQUIVALENT TO"/* 22E6 */, /*8935*/"GREATER-THAN BUT NOT EQUIVALENT TO"/* 22E7 */,/*8936*/"PRECEDES BUT NOT EQUIVALENT TO"/* 22E8 */, /*8937*/"SUCCEEDS BUT NOT EQUIVALENT TO"/* 22E9 */,/*8938*/"NOT NORMAL SUBGROUP OF"/* 22EA */, /*8939*/"DOES NOT CONTAIN AS NORMAL SUBGROUP"/* 22EB */,/*8940*/"NOT NORMAL SUBGROUP OF OR EQUAL TO"/* 22EC */, /*8941*/"DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL"/* 22ED */,/*8942*/"VERTICAL ELLIPSIS"/* 22EE */, /*8943*/"MIDLINE HORIZONTAL ELLIPSIS"/* 22EF */,/*8944*/"UP RIGHT DIAGONAL ELLIPSIS"/* 22F0 */, /*8945*/"DOWN RIGHT DIAGONAL ELLIPSIS"/* 22F1 */,/*8946*/"ELEMENT OF WITH LONG HORIZONTAL STROKE"/* 22F2 */, /*8947*/"ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22F3 */, /*8948*/"SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22F4 */, /*8949*/"ELEMENT OF WITH DOT ABOVE"/* 22F5 */,/*8950*/"ELEMENT OF WITH OVERBAR"/* 22F6 */, /*8951*/"SMALL ELEMENT OF WITH OVERBAR"/* 22F7 */,/*8952*/"ELEMENT OF WITH UNDERBAR"/* 22F8 */, /*8953*/"ELEMENT OF WITH TWO HORIZONTAL STROKES"/* 22F9 */,/*8954*/"CONTAINS WITH LONG HORIZONTAL STROKE"/* 22FA */, /*8955*/"CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22FB */, /*8956*/"SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22FC */, /*8957*/"CONTAINS WITH OVERBAR"/* 22FD */,/*8958*/"SMALL CONTAINS WITH OVERBAR"/* 22FE */, /*8959*/"Z NOTATION BAG MEMBERSHIP"/* 22FF */,/*8960*/"DIAMETER SIGN"/* 2300 */,/*8961*/"ELECTRIC ARROW"/* 2301 */, /*8962*/"HOUSE"/* 2302 */,/*8963*/"UP ARROWHEAD"/* 2303 */,/*8964*/"DOWN ARROWHEAD"/* 2304 */, /*8965*/"PROJECTIVE"/* 2305 */,/*8966*/"PERSPECTIVE"/* 2306 */,/*8967*/"WAVY LINE"/* 2307 */, /*8968*/"LEFT CEILING"/* 2308 */,/*8969*/"RIGHT CEILING"/* 2309 */,/*8970*/"LEFT FLOOR"/* 230A */, /*8971*/"RIGHT FLOOR"/* 230B */,/*8972*/"BOTTOM RIGHT CROP"/* 230C */,/*8973*/"BOTTOM LEFT CROP"/* 230D */, /*8974*/"TOP RIGHT CROP"/* 230E */,/*8975*/"TOP LEFT CROP"/* 230F */,/*8976*/"REVERSED NOT SIGN"/* 2310 */, /*8977*/"SQUARE LOZENGE"/* 2311 */,/*8978*/"ARC"/* 2312 */,/*8979*/"SEGMENT"/* 2313 */,/*8980*/"SECTOR"/* 2314 */, /*8981*/"TELEPHONE RECORDER"/* 2315 */,/*8982*/"POSITION INDICATOR"/* 2316 */,/*8983*/"VIEWDATA SQUARE"/* 2317 */, /*8984*/"PLACE OF INTEREST SIGN"/* 2318 */,/*8985*/"TURNED NOT SIGN"/* 2319 */,/*8986*/"WATCH"/* 231A */, /*8987*/"HOURGLASS"/* 231B */,/*8988*/"TOP LEFT CORNER"/* 231C */,/*8989*/"TOP RIGHT CORNER"/* 231D */, /*8990*/"BOTTOM LEFT CORNER"/* 231E */,/*8991*/"BOTTOM RIGHT CORNER"/* 231F */,/*8992*/"TOP HALF INTEGRAL"/* 2320 */, /*8993*/"BOTTOM HALF INTEGRAL"/* 2321 */,/*8994*/"FROWN"/* 2322 */,/*8995*/"SMILE"/* 2323 */, /*8996*/"UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS"/* 2324 */,/*8997*/"OPTION KEY"/* 2325 */, /*8998*/"ERASE TO THE RIGHT"/* 2326 */,/*8999*/"X IN A RECTANGLE BOX"/* 2327 */,/*9000*/"KEYBOARD"/* 2328 */, /*9001*/"LEFT-POINTING ANGLE BRACKET"/* 2329 */,/*9002*/"RIGHT-POINTING ANGLE BRACKET"/* 232A */, /*9003*/"ERASE TO THE LEFT"/* 232B */,/*9004*/"BENZENE RING"/* 232C */,/*9005*/"CYLINDRICITY"/* 232D */, /*9006*/"ALL AROUND-PROFILE"/* 232E */,/*9007*/"SYMMETRY"/* 232F */,/*9008*/"TOTAL RUNOUT"/* 2330 */, /*9009*/"DIMENSION ORIGIN"/* 2331 */,/*9010*/"CONICAL TAPER"/* 2332 */,/*9011*/"SLOPE"/* 2333 */, /*9012*/"COUNTERBORE"/* 2334 */,/*9013*/"COUNTERSINK"/* 2335 */,/*9014*/"APL FUNCTIONAL SYMBOL I-BEAM"/* 2336 */, /*9015*/"APL FUNCTIONAL SYMBOL SQUISH QUAD"/* 2337 */,/*9016*/"APL FUNCTIONAL SYMBOL QUAD EQUAL"/* 2338 */, /*9017*/"APL FUNCTIONAL SYMBOL QUAD DIVIDE"/* 2339 */,/*9018*/"APL FUNCTIONAL SYMBOL QUAD DIAMOND"/* 233A */, /*9019*/"APL FUNCTIONAL SYMBOL QUAD JOT"/* 233B */,/*9020*/"APL FUNCTIONAL SYMBOL QUAD CIRCLE"/* 233C */, /*9021*/"APL FUNCTIONAL SYMBOL CIRCLE STILE"/* 233D */,/*9022*/"APL FUNCTIONAL SYMBOL CIRCLE JOT"/* 233E */, /*9023*/"APL FUNCTIONAL SYMBOL SLASH BAR"/* 233F */,/*9024*/"APL FUNCTIONAL SYMBOL BACKSLASH BAR"/* 2340 */, /*9025*/"APL FUNCTIONAL SYMBOL QUAD SLASH"/* 2341 */,/*9026*/"APL FUNCTIONAL SYMBOL QUAD BACKSLASH"/* 2342 */, /*9027*/"APL FUNCTIONAL SYMBOL QUAD LESS-THAN"/* 2343 */,/*9028*/"APL FUNCTIONAL SYMBOL QUAD GREATER-THAN"/* 2344 */, /*9029*/"APL FUNCTIONAL SYMBOL LEFTWARDS VANE"/* 2345 */,/*9030*/"APL FUNCTIONAL SYMBOL RIGHTWARDS VANE"/* 2346 */, /*9031*/"APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW"/* 2347 */, /*9032*/"APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW"/* 2348 */, /*9033*/"APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH"/* 2349 */,/*9034*/"APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR"/* 234A */, /*9035*/"APL FUNCTIONAL SYMBOL DELTA STILE"/* 234B */,/*9036*/"APL FUNCTIONAL SYMBOL QUAD DOWN CARET"/* 234C */, /*9037*/"APL FUNCTIONAL SYMBOL QUAD DELTA"/* 234D */,/*9038*/"APL FUNCTIONAL SYMBOL DOWN TACK JOT"/* 234E */, /*9039*/"APL FUNCTIONAL SYMBOL UPWARDS VANE"/* 234F */,/*9040*/"APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW"/* 2350 */, /*9041*/"APL FUNCTIONAL SYMBOL UP TACK OVERBAR"/* 2351 */,/*9042*/"APL FUNCTIONAL SYMBOL DEL STILE"/* 2352 */, /*9043*/"APL FUNCTIONAL SYMBOL QUAD UP CARET"/* 2353 */,/*9044*/"APL FUNCTIONAL SYMBOL QUAD DEL"/* 2354 */, /*9045*/"APL FUNCTIONAL SYMBOL UP TACK JOT"/* 2355 */,/*9046*/"APL FUNCTIONAL SYMBOL DOWNWARDS VANE"/* 2356 */, /*9047*/"APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW"/* 2357 */,/*9048*/"APL FUNCTIONAL SYMBOL QUOTE UNDERBAR"/* 2358 */, /*9049*/"APL FUNCTIONAL SYMBOL DELTA UNDERBAR"/* 2359 */,/*9050*/"APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR"/* 235A */, /*9051*/"APL FUNCTIONAL SYMBOL JOT UNDERBAR"/* 235B */,/*9052*/"APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR"/* 235C */, /*9053*/"APL FUNCTIONAL SYMBOL UP SHOE JOT"/* 235D */,/*9054*/"APL FUNCTIONAL SYMBOL QUOTE QUAD"/* 235E */, /*9055*/"APL FUNCTIONAL SYMBOL CIRCLE STAR"/* 235F */,/*9056*/"APL FUNCTIONAL SYMBOL QUAD COLON"/* 2360 */, /*9057*/"APL FUNCTIONAL SYMBOL UP TACK DIAERESIS"/* 2361 */,/*9058*/"APL FUNCTIONAL SYMBOL DEL DIAERESIS"/* 2362 */, /*9059*/"APL FUNCTIONAL SYMBOL STAR DIAERESIS"/* 2363 */,/*9060*/"APL FUNCTIONAL SYMBOL JOT DIAERESIS"/* 2364 */, /*9061*/"APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS"/* 2365 */,/*9062*/"APL FUNCTIONAL SYMBOL DOWN SHOE STILE"/* 2366 */, /*9063*/"APL FUNCTIONAL SYMBOL LEFT SHOE STILE"/* 2367 */,/*9064*/"APL FUNCTIONAL SYMBOL TILDE DIAERESIS"/* 2368 */, /*9065*/"APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS"/* 2369 */,/*9066*/"APL FUNCTIONAL SYMBOL COMMA BAR"/* 236A */, /*9067*/"APL FUNCTIONAL SYMBOL DEL TILDE"/* 236B */,/*9068*/"APL FUNCTIONAL SYMBOL ZILDE"/* 236C */, /*9069*/"APL FUNCTIONAL SYMBOL STILE TILDE"/* 236D */,/*9070*/"APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR"/* 236E */, /*9071*/"APL FUNCTIONAL SYMBOL QUAD NOT EQUAL"/* 236F */,/*9072*/"APL FUNCTIONAL SYMBOL QUAD QUESTION"/* 2370 */, /*9073*/"APL FUNCTIONAL SYMBOL DOWN CARET TILDE"/* 2371 */,/*9074*/"APL FUNCTIONAL SYMBOL UP CARET TILDE"/* 2372 */, /*9075*/"APL FUNCTIONAL SYMBOL IOTA"/* 2373 */,/*9076*/"APL FUNCTIONAL SYMBOL RHO"/* 2374 */, /*9077*/"APL FUNCTIONAL SYMBOL OMEGA"/* 2375 */,/*9078*/"APL FUNCTIONAL SYMBOL ALPHA UNDERBAR"/* 2376 */, /*9079*/"APL FUNCTIONAL SYMBOL EPSILON UNDERBAR"/* 2377 */,/*9080*/"APL FUNCTIONAL SYMBOL IOTA UNDERBAR"/* 2378 */, /*9081*/"APL FUNCTIONAL SYMBOL OMEGA UNDERBAR"/* 2379 */,/*9082*/"APL FUNCTIONAL SYMBOL ALPHA"/* 237A */, /*9083*/"NOT CHECK MARK"/* 237B */,/*9084*/"RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW"/* 237C */, /*9085*/"SHOULDERED OPEN BOX"/* 237D */,/*9086*/"BELL SYMBOL"/* 237E */, /*9087*/"VERTICAL LINE WITH MIDDLE DOT"/* 237F */,/*9088*/"INSERTION SYMBOL"/* 2380 */, /*9089*/"CONTINUOUS UNDERLINE SYMBOL"/* 2381 */,/*9090*/"DISCONTINUOUS UNDERLINE SYMBOL"/* 2382 */, /*9091*/"EMPHASIS SYMBOL"/* 2383 */,/*9092*/"COMPOSITION SYMBOL"/* 2384 */, /*9093*/"WHITE SQUARE WITH CENTRE VERTICAL LINE"/* 2385 */,/*9094*/"ENTER SYMBOL"/* 2386 */, /*9095*/"ALTERNATIVE KEY SYMBOL"/* 2387 */,/*9096*/"HELM SYMBOL"/* 2388 */, /*9097*/"CIRCLED HORIZONTAL BAR WITH NOTCH"/* 2389 */,/*9098*/"CIRCLED TRIANGLE DOWN"/* 238A */, /*9099*/"BROKEN CIRCLE WITH NORTHWEST ARROW"/* 238B */,/*9100*/"UNDO SYMBOL"/* 238C */, /*9101*/"MONOSTABLE SYMBOL"/* 238D */,/*9102*/"HYSTERESIS SYMBOL"/* 238E */, /*9103*/"OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL"/* 238F */,/*9104*/"OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL"/* 2390 */, /*9105*/"PASSIVE-PULL-DOWN-OUTPUT SYMBOL"/* 2391 */,/*9106*/"PASSIVE-PULL-UP-OUTPUT SYMBOL"/* 2392 */, /*9107*/"DIRECT CURRENT SYMBOL FORM TWO"/* 2393 */,/*9108*/"SOFTWARE-FUNCTION SYMBOL"/* 2394 */, /*9109*/"APL FUNCTIONAL SYMBOL QUAD"/* 2395 */,/*9110*/"DECIMAL SEPARATOR KEY SYMBOL"/* 2396 */, /*9111*/"PREVIOUS PAGE"/* 2397 */,/*9112*/"NEXT PAGE"/* 2398 */,/*9113*/"PRINT SCREEN SYMBOL"/* 2399 */, /*9114*/"CLEAR SCREEN SYMBOL"/* 239A */,/*9115*/"LEFT PARENTHESIS UPPER HOOK"/* 239B */, /*9116*/"LEFT PARENTHESIS EXTENSION"/* 239C */,/*9117*/"LEFT PARENTHESIS LOWER HOOK"/* 239D */, /*9118*/"RIGHT PARENTHESIS UPPER HOOK"/* 239E */,/*9119*/"RIGHT PARENTHESIS EXTENSION"/* 239F */, /*9120*/"RIGHT PARENTHESIS LOWER HOOK"/* 23A0 */,/*9121*/"LEFT SQUARE BRACKET UPPER CORNER"/* 23A1 */, /*9122*/"LEFT SQUARE BRACKET EXTENSION"/* 23A2 */,/*9123*/"LEFT SQUARE BRACKET LOWER CORNER"/* 23A3 */, /*9124*/"RIGHT SQUARE BRACKET UPPER CORNER"/* 23A4 */,/*9125*/"RIGHT SQUARE BRACKET EXTENSION"/* 23A5 */, /*9126*/"RIGHT SQUARE BRACKET LOWER CORNER"/* 23A6 */,/*9127*/"LEFT CURLY BRACKET UPPER HOOK"/* 23A7 */, /*9128*/"LEFT CURLY BRACKET MIDDLE PIECE"/* 23A8 */,/*9129*/"LEFT CURLY BRACKET LOWER HOOK"/* 23A9 */, /*9130*/"CURLY BRACKET EXTENSION"/* 23AA */,/*9131*/"RIGHT CURLY BRACKET UPPER HOOK"/* 23AB */, /*9132*/"RIGHT CURLY BRACKET MIDDLE PIECE"/* 23AC */,/*9133*/"RIGHT CURLY BRACKET LOWER HOOK"/* 23AD */, /*9134*/"INTEGRAL EXTENSION"/* 23AE */,/*9135*/"HORIZONTAL LINE EXTENSION"/* 23AF */, /*9136*/"UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION"/* 23B0 */, /*9137*/"UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION"/* 23B1 */,/*9138*/"SUMMATION TOP"/* 23B2 */, /*9139*/"SUMMATION BOTTOM"/* 23B3 */,/*9140*/"TOP SQUARE BRACKET"/* 23B4 */,/*9141*/"BOTTOM SQUARE BRACKET"/* 23B5 */, /*9142*/"BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET"/* 23B6 */,/*9143*/"RADICAL SYMBOL BOTTOM"/* 23B7 */, /*9144*/"LEFT VERTICAL BOX LINE"/* 23B8 */,/*9145*/"RIGHT VERTICAL BOX LINE"/* 23B9 */, /*9146*/"HORIZONTAL SCAN LINE-1"/* 23BA */,/*9147*/"HORIZONTAL SCAN LINE-3"/* 23BB */, /*9148*/"HORIZONTAL SCAN LINE-7"/* 23BC */,/*9149*/"HORIZONTAL SCAN LINE-9"/* 23BD */, /*9150*/"DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT"/* 23BE */, /*9151*/"DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT"/* 23BF */, /*9152*/"DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE"/* 23C0 */, /*9153*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE"/* 23C1 */, /*9154*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE"/* 23C2 */, /*9155*/"DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE"/* 23C3 */, /*9156*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE"/* 23C4 */, /*9157*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE"/* 23C5 */, /*9158*/"DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE"/* 23C6 */, /*9159*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE"/* 23C7 */, /*9160*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE"/* 23C8 */, /*9161*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL"/* 23C9 */, /*9162*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL"/* 23CA */, /*9163*/"DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT"/* 23CB */, /*9164*/"DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT"/* 23CC */,/*9165*/"SQUARE FOOT"/* 23CD */, /*9166*/"RETURN SYMBOL"/* 23CE */,/*9167*/"EJECT SYMBOL"/* 23CF */,/*9168*/"VERTICAL LINE EXTENSION"/* 23D0 */, /*9169*/"METRICAL BREVE"/* 23D1 */,/*9170*/"METRICAL LONG OVER SHORT"/* 23D2 */, /*9171*/"METRICAL SHORT OVER LONG"/* 23D3 */,/*9172*/"METRICAL LONG OVER TWO SHORTS"/* 23D4 */, /*9173*/"METRICAL TWO SHORTS OVER LONG"/* 23D5 */,/*9174*/"METRICAL TWO SHORTS JOINED"/* 23D6 */, /*9175*/"METRICAL TRISEME"/* 23D7 */,/*9176*/"METRICAL TETRASEME"/* 23D8 */,/*9177*/"METRICAL PENTASEME"/* 23D9 */, /*9178*/"EARTH GROUND"/* 23DA */,/*9179*/"FUSE"/* 23DB */,/*9180*/"TOP PARENTHESIS"/* 23DC */, /*9181*/"BOTTOM PARENTHESIS"/* 23DD */,/*9182*/"TOP CURLY BRACKET"/* 23DE */,/*9183*/"BOTTOM CURLY BRACKET"/* 23DF */, /*9184*/"TOP TORTOISE SHELL BRACKET"/* 23E0 */,/*9185*/"BOTTOM TORTOISE SHELL BRACKET"/* 23E1 */, /*9186*/"WHITE TRAPEZIUM"/* 23E2 */,/*9187*/"BENZENE RING WITH CIRCLE"/* 23E3 */,/*9188*/"STRAIGHTNESS"/* 23E4 */, /*9189*/"FLATNESS"/* 23E5 */,/*9190*/"AC CURRENT"/* 23E6 */,/*9191*/"ELECTRICAL INTERSECTION"/* 23E7 */, /*9192*/"DECIMAL EXPONENT SYMBOL"/* 23E8 */,/*9193*/"BLACK RIGHT-POINTING DOUBLE TRIANGLE"/* 23E9 */, /*9194*/"BLACK LEFT-POINTING DOUBLE TRIANGLE"/* 23EA */,/*9195*/"BLACK UP-POINTING DOUBLE TRIANGLE"/* 23EB */, /*9196*/"BLACK DOWN-POINTING DOUBLE TRIANGLE"/* 23EC */, /*9197*/"BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR"/* 23ED */, /*9198*/"BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR"/* 23EE */, /*9199*/"BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR"/* 23EF */,/*9200*/"ALARM CLOCK"/* 23F0 */, /*9201*/"STOPWATCH"/* 23F1 */,/*9202*/"TIMER CLOCK"/* 23F2 */,/*9203*/"HOURGLASS WITH FLOWING SAND"/* 23F3 */, /*9204*/"BLACK MEDIUM LEFT-POINTING TRIANGLE"/* 23F4 */,/*9205*/"BLACK MEDIUM RIGHT-POINTING TRIANGLE"/* 23F5 */, /*9206*/"BLACK MEDIUM UP-POINTING TRIANGLE"/* 23F6 */,/*9207*/"BLACK MEDIUM DOWN-POINTING TRIANGLE"/* 23F7 */, /*9208*/"DOUBLE VERTICAL BAR"/* 23F8 */,/*9209*/"BLACK SQUARE FOR STOP"/* 23F9 */, /*9210*/"BLACK CIRCLE FOR RECORD"/* 23FA */,NULL,NULL,NULL,NULL,NULL,/*9216*/"SYMBOL FOR NULL"/* 2400 */, /*9217*/"SYMBOL FOR START OF HEADING"/* 2401 */,/*9218*/"SYMBOL FOR START OF TEXT"/* 2402 */, /*9219*/"SYMBOL FOR END OF TEXT"/* 2403 */,/*9220*/"SYMBOL FOR END OF TRANSMISSION"/* 2404 */, /*9221*/"SYMBOL FOR ENQUIRY"/* 2405 */,/*9222*/"SYMBOL FOR ACKNOWLEDGE"/* 2406 */,/*9223*/"SYMBOL FOR BELL"/* 2407 */, /*9224*/"SYMBOL FOR BACKSPACE"/* 2408 */,/*9225*/"SYMBOL FOR HORIZONTAL TABULATION"/* 2409 */, /*9226*/"SYMBOL FOR LINE FEED"/* 240A */,/*9227*/"SYMBOL FOR VERTICAL TABULATION"/* 240B */, /*9228*/"SYMBOL FOR FORM FEED"/* 240C */,/*9229*/"SYMBOL FOR CARRIAGE RETURN"/* 240D */, /*9230*/"SYMBOL FOR SHIFT OUT"/* 240E */,/*9231*/"SYMBOL FOR SHIFT IN"/* 240F */, /*9232*/"SYMBOL FOR DATA LINK ESCAPE"/* 2410 */,/*9233*/"SYMBOL FOR DEVICE CONTROL ONE"/* 2411 */, /*9234*/"SYMBOL FOR DEVICE CONTROL TWO"/* 2412 */,/*9235*/"SYMBOL FOR DEVICE CONTROL THREE"/* 2413 */, /*9236*/"SYMBOL FOR DEVICE CONTROL FOUR"/* 2414 */,/*9237*/"SYMBOL FOR NEGATIVE ACKNOWLEDGE"/* 2415 */, /*9238*/"SYMBOL FOR SYNCHRONOUS IDLE"/* 2416 */,/*9239*/"SYMBOL FOR END OF TRANSMISSION BLOCK"/* 2417 */, /*9240*/"SYMBOL FOR CANCEL"/* 2418 */,/*9241*/"SYMBOL FOR END OF MEDIUM"/* 2419 */, /*9242*/"SYMBOL FOR SUBSTITUTE"/* 241A */,/*9243*/"SYMBOL FOR ESCAPE"/* 241B */, /*9244*/"SYMBOL FOR FILE SEPARATOR"/* 241C */,/*9245*/"SYMBOL FOR GROUP SEPARATOR"/* 241D */, /*9246*/"SYMBOL FOR RECORD SEPARATOR"/* 241E */,/*9247*/"SYMBOL FOR UNIT SEPARATOR"/* 241F */, /*9248*/"SYMBOL FOR SPACE"/* 2420 */,/*9249*/"SYMBOL FOR DELETE"/* 2421 */,/*9250*/"BLANK SYMBOL"/* 2422 */, /*9251*/"OPEN BOX"/* 2423 */,/*9252*/"SYMBOL FOR NEWLINE"/* 2424 */,/*9253*/"SYMBOL FOR DELETE FORM TWO"/* 2425 */, /*9254*/"SYMBOL FOR SUBSTITUTE FORM TWO"/* 2426 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*9280*/"OCR HOOK"/* 2440 */,/*9281*/"OCR CHAIR"/* 2441 */, /*9282*/"OCR FORK"/* 2442 */,/*9283*/"OCR INVERTED FORK"/* 2443 */,/*9284*/"OCR BELT BUCKLE"/* 2444 */, /*9285*/"OCR BOW TIE"/* 2445 */,/*9286*/"OCR BRANCH BANK IDENTIFICATION"/* 2446 */, /*9287*/"OCR AMOUNT OF CHECK"/* 2447 */,/*9288*/"OCR DASH"/* 2448 */,/*9289*/"OCR CUSTOMER ACCOUNT NUMBER"/* 2449 */, /*9290*/"OCR DOUBLE BACKSLASH"/* 244A */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*9312*/"CIRCLED DIGIT ONE"/* 2460 */,/*9313*/"CIRCLED DIGIT TWO"/* 2461 */, /*9314*/"CIRCLED DIGIT THREE"/* 2462 */,/*9315*/"CIRCLED DIGIT FOUR"/* 2463 */,/*9316*/"CIRCLED DIGIT FIVE"/* 2464 */, /*9317*/"CIRCLED DIGIT SIX"/* 2465 */,/*9318*/"CIRCLED DIGIT SEVEN"/* 2466 */,/*9319*/"CIRCLED DIGIT EIGHT"/* 2467 */, /*9320*/"CIRCLED DIGIT NINE"/* 2468 */,/*9321*/"CIRCLED NUMBER TEN"/* 2469 */,/*9322*/"CIRCLED NUMBER ELEVEN"/* 246A */, /*9323*/"CIRCLED NUMBER TWELVE"/* 246B */,/*9324*/"CIRCLED NUMBER THIRTEEN"/* 246C */, /*9325*/"CIRCLED NUMBER FOURTEEN"/* 246D */,/*9326*/"CIRCLED NUMBER FIFTEEN"/* 246E */, /*9327*/"CIRCLED NUMBER SIXTEEN"/* 246F */,/*9328*/"CIRCLED NUMBER SEVENTEEN"/* 2470 */, /*9329*/"CIRCLED NUMBER EIGHTEEN"/* 2471 */,/*9330*/"CIRCLED NUMBER NINETEEN"/* 2472 */, /*9331*/"CIRCLED NUMBER TWENTY"/* 2473 */,/*9332*/"PARENTHESIZED DIGIT ONE"/* 2474 */, /*9333*/"PARENTHESIZED DIGIT TWO"/* 2475 */,/*9334*/"PARENTHESIZED DIGIT THREE"/* 2476 */, /*9335*/"PARENTHESIZED DIGIT FOUR"/* 2477 */,/*9336*/"PARENTHESIZED DIGIT FIVE"/* 2478 */, /*9337*/"PARENTHESIZED DIGIT SIX"/* 2479 */,/*9338*/"PARENTHESIZED DIGIT SEVEN"/* 247A */, /*9339*/"PARENTHESIZED DIGIT EIGHT"/* 247B */,/*9340*/"PARENTHESIZED DIGIT NINE"/* 247C */, /*9341*/"PARENTHESIZED NUMBER TEN"/* 247D */,/*9342*/"PARENTHESIZED NUMBER ELEVEN"/* 247E */, /*9343*/"PARENTHESIZED NUMBER TWELVE"/* 247F */,/*9344*/"PARENTHESIZED NUMBER THIRTEEN"/* 2480 */, /*9345*/"PARENTHESIZED NUMBER FOURTEEN"/* 2481 */,/*9346*/"PARENTHESIZED NUMBER FIFTEEN"/* 2482 */, /*9347*/"PARENTHESIZED NUMBER SIXTEEN"/* 2483 */,/*9348*/"PARENTHESIZED NUMBER SEVENTEEN"/* 2484 */, /*9349*/"PARENTHESIZED NUMBER EIGHTEEN"/* 2485 */,/*9350*/"PARENTHESIZED NUMBER NINETEEN"/* 2486 */, /*9351*/"PARENTHESIZED NUMBER TWENTY"/* 2487 */,/*9352*/"DIGIT ONE FULL STOP"/* 2488 */, /*9353*/"DIGIT TWO FULL STOP"/* 2489 */,/*9354*/"DIGIT THREE FULL STOP"/* 248A */, /*9355*/"DIGIT FOUR FULL STOP"/* 248B */,/*9356*/"DIGIT FIVE FULL STOP"/* 248C */, /*9357*/"DIGIT SIX FULL STOP"/* 248D */,/*9358*/"DIGIT SEVEN FULL STOP"/* 248E */, /*9359*/"DIGIT EIGHT FULL STOP"/* 248F */,/*9360*/"DIGIT NINE FULL STOP"/* 2490 */, /*9361*/"NUMBER TEN FULL STOP"/* 2491 */,/*9362*/"NUMBER ELEVEN FULL STOP"/* 2492 */, /*9363*/"NUMBER TWELVE FULL STOP"/* 2493 */,/*9364*/"NUMBER THIRTEEN FULL STOP"/* 2494 */, /*9365*/"NUMBER FOURTEEN FULL STOP"/* 2495 */,/*9366*/"NUMBER FIFTEEN FULL STOP"/* 2496 */, /*9367*/"NUMBER SIXTEEN FULL STOP"/* 2497 */,/*9368*/"NUMBER SEVENTEEN FULL STOP"/* 2498 */, /*9369*/"NUMBER EIGHTEEN FULL STOP"/* 2499 */,/*9370*/"NUMBER NINETEEN FULL STOP"/* 249A */, /*9371*/"NUMBER TWENTY FULL STOP"/* 249B */,/*9372*/"PARENTHESIZED LATIN SMALL LETTER A"/* 249C */, /*9373*/"PARENTHESIZED LATIN SMALL LETTER B"/* 249D */,/*9374*/"PARENTHESIZED LATIN SMALL LETTER C"/* 249E */, /*9375*/"PARENTHESIZED LATIN SMALL LETTER D"/* 249F */,/*9376*/"PARENTHESIZED LATIN SMALL LETTER E"/* 24A0 */, /*9377*/"PARENTHESIZED LATIN SMALL LETTER F"/* 24A1 */,/*9378*/"PARENTHESIZED LATIN SMALL LETTER G"/* 24A2 */, /*9379*/"PARENTHESIZED LATIN SMALL LETTER H"/* 24A3 */,/*9380*/"PARENTHESIZED LATIN SMALL LETTER I"/* 24A4 */, /*9381*/"PARENTHESIZED LATIN SMALL LETTER J"/* 24A5 */,/*9382*/"PARENTHESIZED LATIN SMALL LETTER K"/* 24A6 */, /*9383*/"PARENTHESIZED LATIN SMALL LETTER L"/* 24A7 */,/*9384*/"PARENTHESIZED LATIN SMALL LETTER M"/* 24A8 */, /*9385*/"PARENTHESIZED LATIN SMALL LETTER N"/* 24A9 */,/*9386*/"PARENTHESIZED LATIN SMALL LETTER O"/* 24AA */, /*9387*/"PARENTHESIZED LATIN SMALL LETTER P"/* 24AB */,/*9388*/"PARENTHESIZED LATIN SMALL LETTER Q"/* 24AC */, /*9389*/"PARENTHESIZED LATIN SMALL LETTER R"/* 24AD */,/*9390*/"PARENTHESIZED LATIN SMALL LETTER S"/* 24AE */, /*9391*/"PARENTHESIZED LATIN SMALL LETTER T"/* 24AF */,/*9392*/"PARENTHESIZED LATIN SMALL LETTER U"/* 24B0 */, /*9393*/"PARENTHESIZED LATIN SMALL LETTER V"/* 24B1 */,/*9394*/"PARENTHESIZED LATIN SMALL LETTER W"/* 24B2 */, /*9395*/"PARENTHESIZED LATIN SMALL LETTER X"/* 24B3 */,/*9396*/"PARENTHESIZED LATIN SMALL LETTER Y"/* 24B4 */, /*9397*/"PARENTHESIZED LATIN SMALL LETTER Z"/* 24B5 */,/*9398*/"CIRCLED LATIN CAPITAL LETTER A"/* 24B6 */, /*9399*/"CIRCLED LATIN CAPITAL LETTER B"/* 24B7 */,/*9400*/"CIRCLED LATIN CAPITAL LETTER C"/* 24B8 */, /*9401*/"CIRCLED LATIN CAPITAL LETTER D"/* 24B9 */,/*9402*/"CIRCLED LATIN CAPITAL LETTER E"/* 24BA */, /*9403*/"CIRCLED LATIN CAPITAL LETTER F"/* 24BB */,/*9404*/"CIRCLED LATIN CAPITAL LETTER G"/* 24BC */, /*9405*/"CIRCLED LATIN CAPITAL LETTER H"/* 24BD */,/*9406*/"CIRCLED LATIN CAPITAL LETTER I"/* 24BE */, /*9407*/"CIRCLED LATIN CAPITAL LETTER J"/* 24BF */,/*9408*/"CIRCLED LATIN CAPITAL LETTER K"/* 24C0 */, /*9409*/"CIRCLED LATIN CAPITAL LETTER L"/* 24C1 */,/*9410*/"CIRCLED LATIN CAPITAL LETTER M"/* 24C2 */, /*9411*/"CIRCLED LATIN CAPITAL LETTER N"/* 24C3 */,/*9412*/"CIRCLED LATIN CAPITAL LETTER O"/* 24C4 */, /*9413*/"CIRCLED LATIN CAPITAL LETTER P"/* 24C5 */,/*9414*/"CIRCLED LATIN CAPITAL LETTER Q"/* 24C6 */, /*9415*/"CIRCLED LATIN CAPITAL LETTER R"/* 24C7 */,/*9416*/"CIRCLED LATIN CAPITAL LETTER S"/* 24C8 */, /*9417*/"CIRCLED LATIN CAPITAL LETTER T"/* 24C9 */,/*9418*/"CIRCLED LATIN CAPITAL LETTER U"/* 24CA */, /*9419*/"CIRCLED LATIN CAPITAL LETTER V"/* 24CB */,/*9420*/"CIRCLED LATIN CAPITAL LETTER W"/* 24CC */, /*9421*/"CIRCLED LATIN CAPITAL LETTER X"/* 24CD */,/*9422*/"CIRCLED LATIN CAPITAL LETTER Y"/* 24CE */, /*9423*/"CIRCLED LATIN CAPITAL LETTER Z"/* 24CF */,/*9424*/"CIRCLED LATIN SMALL LETTER A"/* 24D0 */, /*9425*/"CIRCLED LATIN SMALL LETTER B"/* 24D1 */,/*9426*/"CIRCLED LATIN SMALL LETTER C"/* 24D2 */, /*9427*/"CIRCLED LATIN SMALL LETTER D"/* 24D3 */,/*9428*/"CIRCLED LATIN SMALL LETTER E"/* 24D4 */, /*9429*/"CIRCLED LATIN SMALL LETTER F"/* 24D5 */,/*9430*/"CIRCLED LATIN SMALL LETTER G"/* 24D6 */, /*9431*/"CIRCLED LATIN SMALL LETTER H"/* 24D7 */,/*9432*/"CIRCLED LATIN SMALL LETTER I"/* 24D8 */, /*9433*/"CIRCLED LATIN SMALL LETTER J"/* 24D9 */,/*9434*/"CIRCLED LATIN SMALL LETTER K"/* 24DA */, /*9435*/"CIRCLED LATIN SMALL LETTER L"/* 24DB */,/*9436*/"CIRCLED LATIN SMALL LETTER M"/* 24DC */, /*9437*/"CIRCLED LATIN SMALL LETTER N"/* 24DD */,/*9438*/"CIRCLED LATIN SMALL LETTER O"/* 24DE */, /*9439*/"CIRCLED LATIN SMALL LETTER P"/* 24DF */,/*9440*/"CIRCLED LATIN SMALL LETTER Q"/* 24E0 */, /*9441*/"CIRCLED LATIN SMALL LETTER R"/* 24E1 */,/*9442*/"CIRCLED LATIN SMALL LETTER S"/* 24E2 */, /*9443*/"CIRCLED LATIN SMALL LETTER T"/* 24E3 */,/*9444*/"CIRCLED LATIN SMALL LETTER U"/* 24E4 */, /*9445*/"CIRCLED LATIN SMALL LETTER V"/* 24E5 */,/*9446*/"CIRCLED LATIN SMALL LETTER W"/* 24E6 */, /*9447*/"CIRCLED LATIN SMALL LETTER X"/* 24E7 */,/*9448*/"CIRCLED LATIN SMALL LETTER Y"/* 24E8 */, /*9449*/"CIRCLED LATIN SMALL LETTER Z"/* 24E9 */,/*9450*/"CIRCLED DIGIT ZERO"/* 24EA */, /*9451*/"NEGATIVE CIRCLED NUMBER ELEVEN"/* 24EB */,/*9452*/"NEGATIVE CIRCLED NUMBER TWELVE"/* 24EC */, /*9453*/"NEGATIVE CIRCLED NUMBER THIRTEEN"/* 24ED */,/*9454*/"NEGATIVE CIRCLED NUMBER FOURTEEN"/* 24EE */, /*9455*/"NEGATIVE CIRCLED NUMBER FIFTEEN"/* 24EF */,/*9456*/"NEGATIVE CIRCLED NUMBER SIXTEEN"/* 24F0 */, /*9457*/"NEGATIVE CIRCLED NUMBER SEVENTEEN"/* 24F1 */,/*9458*/"NEGATIVE CIRCLED NUMBER EIGHTEEN"/* 24F2 */, /*9459*/"NEGATIVE CIRCLED NUMBER NINETEEN"/* 24F3 */,/*9460*/"NEGATIVE CIRCLED NUMBER TWENTY"/* 24F4 */, /*9461*/"DOUBLE CIRCLED DIGIT ONE"/* 24F5 */,/*9462*/"DOUBLE CIRCLED DIGIT TWO"/* 24F6 */, /*9463*/"DOUBLE CIRCLED DIGIT THREE"/* 24F7 */,/*9464*/"DOUBLE CIRCLED DIGIT FOUR"/* 24F8 */, /*9465*/"DOUBLE CIRCLED DIGIT FIVE"/* 24F9 */,/*9466*/"DOUBLE CIRCLED DIGIT SIX"/* 24FA */, /*9467*/"DOUBLE CIRCLED DIGIT SEVEN"/* 24FB */,/*9468*/"DOUBLE CIRCLED DIGIT EIGHT"/* 24FC */, /*9469*/"DOUBLE CIRCLED DIGIT NINE"/* 24FD */,/*9470*/"DOUBLE CIRCLED NUMBER TEN"/* 24FE */, /*9471*/"NEGATIVE CIRCLED DIGIT ZERO"/* 24FF */,/*9472*/"BOX DRAWINGS LIGHT HORIZONTAL"/* 2500 */, /*9473*/"BOX DRAWINGS HEAVY HORIZONTAL"/* 2501 */,/*9474*/"BOX DRAWINGS LIGHT VERTICAL"/* 2502 */, /*9475*/"BOX DRAWINGS HEAVY VERTICAL"/* 2503 */,/*9476*/"BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL"/* 2504 */, /*9477*/"BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL"/* 2505 */, /*9478*/"BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL"/* 2506 */,/*9479*/"BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL"/* 2507 */, /*9480*/"BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL"/* 2508 */, /*9481*/"BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL"/* 2509 */, /*9482*/"BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL"/* 250A */, /*9483*/"BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL"/* 250B */,/*9484*/"BOX DRAWINGS LIGHT DOWN AND RIGHT"/* 250C */, /*9485*/"BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY"/* 250D */,/*9486*/"BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT"/* 250E */, /*9487*/"BOX DRAWINGS HEAVY DOWN AND RIGHT"/* 250F */,/*9488*/"BOX DRAWINGS LIGHT DOWN AND LEFT"/* 2510 */, /*9489*/"BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY"/* 2511 */,/*9490*/"BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT"/* 2512 */, /*9491*/"BOX DRAWINGS HEAVY DOWN AND LEFT"/* 2513 */,/*9492*/"BOX DRAWINGS LIGHT UP AND RIGHT"/* 2514 */, /*9493*/"BOX DRAWINGS UP LIGHT AND RIGHT HEAVY"/* 2515 */,/*9494*/"BOX DRAWINGS UP HEAVY AND RIGHT LIGHT"/* 2516 */, /*9495*/"BOX DRAWINGS HEAVY UP AND RIGHT"/* 2517 */,/*9496*/"BOX DRAWINGS LIGHT UP AND LEFT"/* 2518 */, /*9497*/"BOX DRAWINGS UP LIGHT AND LEFT HEAVY"/* 2519 */,/*9498*/"BOX DRAWINGS UP HEAVY AND LEFT LIGHT"/* 251A */, /*9499*/"BOX DRAWINGS HEAVY UP AND LEFT"/* 251B */,/*9500*/"BOX DRAWINGS LIGHT VERTICAL AND RIGHT"/* 251C */, /*9501*/"BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY"/* 251D */, /*9502*/"BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT"/* 251E */, /*9503*/"BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT"/* 251F */, /*9504*/"BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT"/* 2520 */, /*9505*/"BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY"/* 2521 */, /*9506*/"BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY"/* 2522 */,/*9507*/"BOX DRAWINGS HEAVY VERTICAL AND RIGHT"/* 2523 */, /*9508*/"BOX DRAWINGS LIGHT VERTICAL AND LEFT"/* 2524 */,/*9509*/"BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY"/* 2525 */, /*9510*/"BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT"/* 2526 */, /*9511*/"BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT"/* 2527 */, /*9512*/"BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT"/* 2528 */, /*9513*/"BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY"/* 2529 */, /*9514*/"BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY"/* 252A */,/*9515*/"BOX DRAWINGS HEAVY VERTICAL AND LEFT"/* 252B */, /*9516*/"BOX DRAWINGS LIGHT DOWN AND HORIZONTAL"/* 252C */, /*9517*/"BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT"/* 252D */, /*9518*/"BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT"/* 252E */, /*9519*/"BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY"/* 252F */, /*9520*/"BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT"/* 2530 */, /*9521*/"BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY"/* 2531 */, /*9522*/"BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY"/* 2532 */, /*9523*/"BOX DRAWINGS HEAVY DOWN AND HORIZONTAL"/* 2533 */,/*9524*/"BOX DRAWINGS LIGHT UP AND HORIZONTAL"/* 2534 */, /*9525*/"BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT"/* 2535 */, /*9526*/"BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT"/* 2536 */, /*9527*/"BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY"/* 2537 */, /*9528*/"BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT"/* 2538 */, /*9529*/"BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY"/* 2539 */, /*9530*/"BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY"/* 253A */,/*9531*/"BOX DRAWINGS HEAVY UP AND HORIZONTAL"/* 253B */, /*9532*/"BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL"/* 253C */, /*9533*/"BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT"/* 253D */, /*9534*/"BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT"/* 253E */, /*9535*/"BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY"/* 253F */, /*9536*/"BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT"/* 2540 */, /*9537*/"BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT"/* 2541 */, /*9538*/"BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT"/* 2542 */, /*9539*/"BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT"/* 2543 */, /*9540*/"BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT"/* 2544 */, /*9541*/"BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT"/* 2545 */, /*9542*/"BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT"/* 2546 */, /*9543*/"BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY"/* 2547 */, /*9544*/"BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY"/* 2548 */, /*9545*/"BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY"/* 2549 */, /*9546*/"BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY"/* 254A */, /*9547*/"BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL"/* 254B */, /*9548*/"BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL"/* 254C */, /*9549*/"BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL"/* 254D */, /*9550*/"BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL"/* 254E */,/*9551*/"BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL"/* 254F */, /*9552*/"BOX DRAWINGS DOUBLE HORIZONTAL"/* 2550 */,/*9553*/"BOX DRAWINGS DOUBLE VERTICAL"/* 2551 */, /*9554*/"BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE"/* 2552 */, /*9555*/"BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE"/* 2553 */,/*9556*/"BOX DRAWINGS DOUBLE DOWN AND RIGHT"/* 2554 */, /*9557*/"BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE"/* 2555 */, /*9558*/"BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE"/* 2556 */,/*9559*/"BOX DRAWINGS DOUBLE DOWN AND LEFT"/* 2557 */, /*9560*/"BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE"/* 2558 */,/*9561*/"BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE"/* 2559 */, /*9562*/"BOX DRAWINGS DOUBLE UP AND RIGHT"/* 255A */,/*9563*/"BOX DRAWINGS UP SINGLE AND LEFT DOUBLE"/* 255B */, /*9564*/"BOX DRAWINGS UP DOUBLE AND LEFT SINGLE"/* 255C */,/*9565*/"BOX DRAWINGS DOUBLE UP AND LEFT"/* 255D */, /*9566*/"BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE"/* 255E */, /*9567*/"BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE"/* 255F */, /*9568*/"BOX DRAWINGS DOUBLE VERTICAL AND RIGHT"/* 2560 */, /*9569*/"BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE"/* 2561 */, /*9570*/"BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE"/* 2562 */, /*9571*/"BOX DRAWINGS DOUBLE VERTICAL AND LEFT"/* 2563 */, /*9572*/"BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE"/* 2564 */, /*9573*/"BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE"/* 2565 */, /*9574*/"BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL"/* 2566 */, /*9575*/"BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE"/* 2567 */, /*9576*/"BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE"/* 2568 */, /*9577*/"BOX DRAWINGS DOUBLE UP AND HORIZONTAL"/* 2569 */, /*9578*/"BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE"/* 256A */, /*9579*/"BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE"/* 256B */, /*9580*/"BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL"/* 256C */, /*9581*/"BOX DRAWINGS LIGHT ARC DOWN AND RIGHT"/* 256D */,/*9582*/"BOX DRAWINGS LIGHT ARC DOWN AND LEFT"/* 256E */, /*9583*/"BOX DRAWINGS LIGHT ARC UP AND LEFT"/* 256F */,/*9584*/"BOX DRAWINGS LIGHT ARC UP AND RIGHT"/* 2570 */, /*9585*/"BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT"/* 2571 */, /*9586*/"BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT"/* 2572 */, /*9587*/"BOX DRAWINGS LIGHT DIAGONAL CROSS"/* 2573 */,/*9588*/"BOX DRAWINGS LIGHT LEFT"/* 2574 */, /*9589*/"BOX DRAWINGS LIGHT UP"/* 2575 */,/*9590*/"BOX DRAWINGS LIGHT RIGHT"/* 2576 */, /*9591*/"BOX DRAWINGS LIGHT DOWN"/* 2577 */,/*9592*/"BOX DRAWINGS HEAVY LEFT"/* 2578 */, /*9593*/"BOX DRAWINGS HEAVY UP"/* 2579 */,/*9594*/"BOX DRAWINGS HEAVY RIGHT"/* 257A */, /*9595*/"BOX DRAWINGS HEAVY DOWN"/* 257B */,/*9596*/"BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT"/* 257C */, /*9597*/"BOX DRAWINGS LIGHT UP AND HEAVY DOWN"/* 257D */,/*9598*/"BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT"/* 257E */, /*9599*/"BOX DRAWINGS HEAVY UP AND LIGHT DOWN"/* 257F */,/*9600*/"UPPER HALF BLOCK"/* 2580 */, /*9601*/"LOWER ONE EIGHTH BLOCK"/* 2581 */,/*9602*/"LOWER ONE QUARTER BLOCK"/* 2582 */, /*9603*/"LOWER THREE EIGHTHS BLOCK"/* 2583 */,/*9604*/"LOWER HALF BLOCK"/* 2584 */, /*9605*/"LOWER FIVE EIGHTHS BLOCK"/* 2585 */,/*9606*/"LOWER THREE QUARTERS BLOCK"/* 2586 */, /*9607*/"LOWER SEVEN EIGHTHS BLOCK"/* 2587 */,/*9608*/"FULL BLOCK"/* 2588 */, /*9609*/"LEFT SEVEN EIGHTHS BLOCK"/* 2589 */,/*9610*/"LEFT THREE QUARTERS BLOCK"/* 258A */, /*9611*/"LEFT FIVE EIGHTHS BLOCK"/* 258B */,/*9612*/"LEFT HALF BLOCK"/* 258C */, /*9613*/"LEFT THREE EIGHTHS BLOCK"/* 258D */,/*9614*/"LEFT ONE QUARTER BLOCK"/* 258E */, /*9615*/"LEFT ONE EIGHTH BLOCK"/* 258F */,/*9616*/"RIGHT HALF BLOCK"/* 2590 */,/*9617*/"LIGHT SHADE"/* 2591 */, /*9618*/"MEDIUM SHADE"/* 2592 */,/*9619*/"DARK SHADE"/* 2593 */,/*9620*/"UPPER ONE EIGHTH BLOCK"/* 2594 */, /*9621*/"RIGHT ONE EIGHTH BLOCK"/* 2595 */,/*9622*/"QUADRANT LOWER LEFT"/* 2596 */, /*9623*/"QUADRANT LOWER RIGHT"/* 2597 */,/*9624*/"QUADRANT UPPER LEFT"/* 2598 */, /*9625*/"QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT"/* 2599 */, /*9626*/"QUADRANT UPPER LEFT AND LOWER RIGHT"/* 259A */, /*9627*/"QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT"/* 259B */, /*9628*/"QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT"/* 259C */,/*9629*/"QUADRANT UPPER RIGHT"/* 259D */, /*9630*/"QUADRANT UPPER RIGHT AND LOWER LEFT"/* 259E */, /*9631*/"QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT"/* 259F */,/*9632*/"BLACK SQUARE"/* 25A0 */, /*9633*/"WHITE SQUARE"/* 25A1 */,/*9634*/"WHITE SQUARE WITH ROUNDED CORNERS"/* 25A2 */, /*9635*/"WHITE SQUARE CONTAINING BLACK SMALL SQUARE"/* 25A3 */,/*9636*/"SQUARE WITH HORIZONTAL FILL"/* 25A4 */, /*9637*/"SQUARE WITH VERTICAL FILL"/* 25A5 */,/*9638*/"SQUARE WITH ORTHOGONAL CROSSHATCH FILL"/* 25A6 */, /*9639*/"SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL"/* 25A7 */, /*9640*/"SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL"/* 25A8 */,/*9641*/"SQUARE WITH DIAGONAL CROSSHATCH FILL"/* 25A9 */, /*9642*/"BLACK SMALL SQUARE"/* 25AA */,/*9643*/"WHITE SMALL SQUARE"/* 25AB */,/*9644*/"BLACK RECTANGLE"/* 25AC */, /*9645*/"WHITE RECTANGLE"/* 25AD */,/*9646*/"BLACK VERTICAL RECTANGLE"/* 25AE */, /*9647*/"WHITE VERTICAL RECTANGLE"/* 25AF */,/*9648*/"BLACK PARALLELOGRAM"/* 25B0 */, /*9649*/"WHITE PARALLELOGRAM"/* 25B1 */,/*9650*/"BLACK UP-POINTING TRIANGLE"/* 25B2 */, /*9651*/"WHITE UP-POINTING TRIANGLE"/* 25B3 */,/*9652*/"BLACK UP-POINTING SMALL TRIANGLE"/* 25B4 */, /*9653*/"WHITE UP-POINTING SMALL TRIANGLE"/* 25B5 */,/*9654*/"BLACK RIGHT-POINTING TRIANGLE"/* 25B6 */, /*9655*/"WHITE RIGHT-POINTING TRIANGLE"/* 25B7 */,/*9656*/"BLACK RIGHT-POINTING SMALL TRIANGLE"/* 25B8 */, /*9657*/"WHITE RIGHT-POINTING SMALL TRIANGLE"/* 25B9 */,/*9658*/"BLACK RIGHT-POINTING POINTER"/* 25BA */, /*9659*/"WHITE RIGHT-POINTING POINTER"/* 25BB */,/*9660*/"BLACK DOWN-POINTING TRIANGLE"/* 25BC */, /*9661*/"WHITE DOWN-POINTING TRIANGLE"/* 25BD */,/*9662*/"BLACK DOWN-POINTING SMALL TRIANGLE"/* 25BE */, /*9663*/"WHITE DOWN-POINTING SMALL TRIANGLE"/* 25BF */,/*9664*/"BLACK LEFT-POINTING TRIANGLE"/* 25C0 */, /*9665*/"WHITE LEFT-POINTING TRIANGLE"/* 25C1 */,/*9666*/"BLACK LEFT-POINTING SMALL TRIANGLE"/* 25C2 */, /*9667*/"WHITE LEFT-POINTING SMALL TRIANGLE"/* 25C3 */,/*9668*/"BLACK LEFT-POINTING POINTER"/* 25C4 */, /*9669*/"WHITE LEFT-POINTING POINTER"/* 25C5 */,/*9670*/"BLACK DIAMOND"/* 25C6 */,/*9671*/"WHITE DIAMOND"/* 25C7 */, /*9672*/"WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND"/* 25C8 */,/*9673*/"FISHEYE"/* 25C9 */,/*9674*/"LOZENGE"/* 25CA */, /*9675*/"WHITE CIRCLE"/* 25CB */,/*9676*/"DOTTED CIRCLE"/* 25CC */,/*9677*/"CIRCLE WITH VERTICAL FILL"/* 25CD */, /*9678*/"BULLSEYE"/* 25CE */,/*9679*/"BLACK CIRCLE"/* 25CF */,/*9680*/"CIRCLE WITH LEFT HALF BLACK"/* 25D0 */, /*9681*/"CIRCLE WITH RIGHT HALF BLACK"/* 25D1 */,/*9682*/"CIRCLE WITH LOWER HALF BLACK"/* 25D2 */, /*9683*/"CIRCLE WITH UPPER HALF BLACK"/* 25D3 */,/*9684*/"CIRCLE WITH UPPER RIGHT QUADRANT BLACK"/* 25D4 */, /*9685*/"CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK"/* 25D5 */,/*9686*/"LEFT HALF BLACK CIRCLE"/* 25D6 */, /*9687*/"RIGHT HALF BLACK CIRCLE"/* 25D7 */,/*9688*/"INVERSE BULLET"/* 25D8 */,/*9689*/"INVERSE WHITE CIRCLE"/* 25D9 */, /*9690*/"UPPER HALF INVERSE WHITE CIRCLE"/* 25DA */,/*9691*/"LOWER HALF INVERSE WHITE CIRCLE"/* 25DB */, /*9692*/"UPPER LEFT QUADRANT CIRCULAR ARC"/* 25DC */,/*9693*/"UPPER RIGHT QUADRANT CIRCULAR ARC"/* 25DD */, /*9694*/"LOWER RIGHT QUADRANT CIRCULAR ARC"/* 25DE */,/*9695*/"LOWER LEFT QUADRANT CIRCULAR ARC"/* 25DF */, /*9696*/"UPPER HALF CIRCLE"/* 25E0 */,/*9697*/"LOWER HALF CIRCLE"/* 25E1 */, /*9698*/"BLACK LOWER RIGHT TRIANGLE"/* 25E2 */,/*9699*/"BLACK LOWER LEFT TRIANGLE"/* 25E3 */, /*9700*/"BLACK UPPER LEFT TRIANGLE"/* 25E4 */,/*9701*/"BLACK UPPER RIGHT TRIANGLE"/* 25E5 */, /*9702*/"WHITE BULLET"/* 25E6 */,/*9703*/"SQUARE WITH LEFT HALF BLACK"/* 25E7 */, /*9704*/"SQUARE WITH RIGHT HALF BLACK"/* 25E8 */,/*9705*/"SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK"/* 25E9 */, /*9706*/"SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK"/* 25EA */, /*9707*/"WHITE SQUARE WITH VERTICAL BISECTING LINE"/* 25EB */,/*9708*/"WHITE UP-POINTING TRIANGLE WITH DOT"/* 25EC */, /*9709*/"UP-POINTING TRIANGLE WITH LEFT HALF BLACK"/* 25ED */, /*9710*/"UP-POINTING TRIANGLE WITH RIGHT HALF BLACK"/* 25EE */,/*9711*/"LARGE CIRCLE"/* 25EF */, /*9712*/"WHITE SQUARE WITH UPPER LEFT QUADRANT"/* 25F0 */,/*9713*/"WHITE SQUARE WITH LOWER LEFT QUADRANT"/* 25F1 */, /*9714*/"WHITE SQUARE WITH LOWER RIGHT QUADRANT"/* 25F2 */,/*9715*/"WHITE SQUARE WITH UPPER RIGHT QUADRANT"/* 25F3 */, /*9716*/"WHITE CIRCLE WITH UPPER LEFT QUADRANT"/* 25F4 */,/*9717*/"WHITE CIRCLE WITH LOWER LEFT QUADRANT"/* 25F5 */, /*9718*/"WHITE CIRCLE WITH LOWER RIGHT QUADRANT"/* 25F6 */,/*9719*/"WHITE CIRCLE WITH UPPER RIGHT QUADRANT"/* 25F7 */, /*9720*/"UPPER LEFT TRIANGLE"/* 25F8 */,/*9721*/"UPPER RIGHT TRIANGLE"/* 25F9 */,/*9722*/"LOWER LEFT TRIANGLE"/* 25FA */, /*9723*/"WHITE MEDIUM SQUARE"/* 25FB */,/*9724*/"BLACK MEDIUM SQUARE"/* 25FC */, /*9725*/"WHITE MEDIUM SMALL SQUARE"/* 25FD */,/*9726*/"BLACK MEDIUM SMALL SQUARE"/* 25FE */, /*9727*/"LOWER RIGHT TRIANGLE"/* 25FF */,/*9728*/"BLACK SUN WITH RAYS"/* 2600 */,/*9729*/"CLOUD"/* 2601 */, /*9730*/"UMBRELLA"/* 2602 */,/*9731*/"SNOWMAN"/* 2603 */,/*9732*/"COMET"/* 2604 */,/*9733*/"BLACK STAR"/* 2605 */, /*9734*/"WHITE STAR"/* 2606 */,/*9735*/"LIGHTNING"/* 2607 */,/*9736*/"THUNDERSTORM"/* 2608 */,/*9737*/"SUN"/* 2609 */, /*9738*/"ASCENDING NODE"/* 260A */,/*9739*/"DESCENDING NODE"/* 260B */,/*9740*/"CONJUNCTION"/* 260C */, /*9741*/"OPPOSITION"/* 260D */,/*9742*/"BLACK TELEPHONE"/* 260E */,/*9743*/"WHITE TELEPHONE"/* 260F */, /*9744*/"BALLOT BOX"/* 2610 */,/*9745*/"BALLOT BOX WITH CHECK"/* 2611 */,/*9746*/"BALLOT BOX WITH X"/* 2612 */, /*9747*/"SALTIRE"/* 2613 */,/*9748*/"UMBRELLA WITH RAIN DROPS"/* 2614 */,/*9749*/"HOT BEVERAGE"/* 2615 */, /*9750*/"WHITE SHOGI PIECE"/* 2616 */,/*9751*/"BLACK SHOGI PIECE"/* 2617 */,/*9752*/"SHAMROCK"/* 2618 */, /*9753*/"REVERSED ROTATED FLORAL HEART BULLET"/* 2619 */,/*9754*/"BLACK LEFT POINTING INDEX"/* 261A */, /*9755*/"BLACK RIGHT POINTING INDEX"/* 261B */,/*9756*/"WHITE LEFT POINTING INDEX"/* 261C */, /*9757*/"WHITE UP POINTING INDEX"/* 261D */,/*9758*/"WHITE RIGHT POINTING INDEX"/* 261E */, /*9759*/"WHITE DOWN POINTING INDEX"/* 261F */,/*9760*/"SKULL AND CROSSBONES"/* 2620 */,/*9761*/"CAUTION SIGN"/* 2621 */, /*9762*/"RADIOACTIVE SIGN"/* 2622 */,/*9763*/"BIOHAZARD SIGN"/* 2623 */,/*9764*/"CADUCEUS"/* 2624 */, /*9765*/"ANKH"/* 2625 */,/*9766*/"ORTHODOX CROSS"/* 2626 */,/*9767*/"CHI RHO"/* 2627 */, /*9768*/"CROSS OF LORRAINE"/* 2628 */,/*9769*/"CROSS OF JERUSALEM"/* 2629 */,/*9770*/"STAR AND CRESCENT"/* 262A */, /*9771*/"FARSI SYMBOL"/* 262B */,/*9772*/"ADI SHAKTI"/* 262C */,/*9773*/"HAMMER AND SICKLE"/* 262D */, /*9774*/"PEACE SYMBOL"/* 262E */,/*9775*/"YIN YANG"/* 262F */,/*9776*/"TRIGRAM FOR HEAVEN"/* 2630 */, /*9777*/"TRIGRAM FOR LAKE"/* 2631 */,/*9778*/"TRIGRAM FOR FIRE"/* 2632 */,/*9779*/"TRIGRAM FOR THUNDER"/* 2633 */, /*9780*/"TRIGRAM FOR WIND"/* 2634 */,/*9781*/"TRIGRAM FOR WATER"/* 2635 */,/*9782*/"TRIGRAM FOR MOUNTAIN"/* 2636 */, /*9783*/"TRIGRAM FOR EARTH"/* 2637 */,/*9784*/"WHEEL OF DHARMA"/* 2638 */,/*9785*/"WHITE FROWNING FACE"/* 2639 */, /*9786*/"WHITE SMILING FACE"/* 263A */,/*9787*/"BLACK SMILING FACE"/* 263B */,/*9788*/"WHITE SUN WITH RAYS"/* 263C */, /*9789*/"FIRST QUARTER MOON"/* 263D */,/*9790*/"LAST QUARTER MOON"/* 263E */,/*9791*/"MERCURY"/* 263F */, /*9792*/"FEMALE SIGN"/* 2640 */,/*9793*/"EARTH"/* 2641 */,/*9794*/"MALE SIGN"/* 2642 */,/*9795*/"JUPITER"/* 2643 */, /*9796*/"SATURN"/* 2644 */,/*9797*/"URANUS"/* 2645 */,/*9798*/"NEPTUNE"/* 2646 */,/*9799*/"PLUTO"/* 2647 */, /*9800*/"ARIES"/* 2648 */,/*9801*/"TAURUS"/* 2649 */,/*9802*/"GEMINI"/* 264A */,/*9803*/"CANCER"/* 264B */, /*9804*/"LEO"/* 264C */,/*9805*/"VIRGO"/* 264D */,/*9806*/"LIBRA"/* 264E */,/*9807*/"SCORPIUS"/* 264F */, /*9808*/"SAGITTARIUS"/* 2650 */,/*9809*/"CAPRICORN"/* 2651 */,/*9810*/"AQUARIUS"/* 2652 */,/*9811*/"PISCES"/* 2653 */, /*9812*/"WHITE CHESS KING"/* 2654 */,/*9813*/"WHITE CHESS QUEEN"/* 2655 */,/*9814*/"WHITE CHESS ROOK"/* 2656 */, /*9815*/"WHITE CHESS BISHOP"/* 2657 */,/*9816*/"WHITE CHESS KNIGHT"/* 2658 */,/*9817*/"WHITE CHESS PAWN"/* 2659 */, /*9818*/"BLACK CHESS KING"/* 265A */,/*9819*/"BLACK CHESS QUEEN"/* 265B */,/*9820*/"BLACK CHESS ROOK"/* 265C */, /*9821*/"BLACK CHESS BISHOP"/* 265D */,/*9822*/"BLACK CHESS KNIGHT"/* 265E */,/*9823*/"BLACK CHESS PAWN"/* 265F */, /*9824*/"BLACK SPADE SUIT"/* 2660 */,/*9825*/"WHITE HEART SUIT"/* 2661 */,/*9826*/"WHITE DIAMOND SUIT"/* 2662 */, /*9827*/"BLACK CLUB SUIT"/* 2663 */,/*9828*/"WHITE SPADE SUIT"/* 2664 */,/*9829*/"BLACK HEART SUIT"/* 2665 */, /*9830*/"BLACK DIAMOND SUIT"/* 2666 */,/*9831*/"WHITE CLUB SUIT"/* 2667 */,/*9832*/"HOT SPRINGS"/* 2668 */, /*9833*/"QUARTER NOTE"/* 2669 */,/*9834*/"EIGHTH NOTE"/* 266A */,/*9835*/"BEAMED EIGHTH NOTES"/* 266B */, /*9836*/"BEAMED SIXTEENTH NOTES"/* 266C */,/*9837*/"MUSIC FLAT SIGN"/* 266D */,/*9838*/"MUSIC NATURAL SIGN"/* 266E */, /*9839*/"MUSIC SHARP SIGN"/* 266F */,/*9840*/"WEST SYRIAC CROSS"/* 2670 */,/*9841*/"EAST SYRIAC CROSS"/* 2671 */, /*9842*/"UNIVERSAL RECYCLING SYMBOL"/* 2672 */,/*9843*/"RECYCLING SYMBOL FOR TYPE-1 PLASTICS"/* 2673 */, /*9844*/"RECYCLING SYMBOL FOR TYPE-2 PLASTICS"/* 2674 */,/*9845*/"RECYCLING SYMBOL FOR TYPE-3 PLASTICS"/* 2675 */, /*9846*/"RECYCLING SYMBOL FOR TYPE-4 PLASTICS"/* 2676 */,/*9847*/"RECYCLING SYMBOL FOR TYPE-5 PLASTICS"/* 2677 */, /*9848*/"RECYCLING SYMBOL FOR TYPE-6 PLASTICS"/* 2678 */,/*9849*/"RECYCLING SYMBOL FOR TYPE-7 PLASTICS"/* 2679 */, /*9850*/"RECYCLING SYMBOL FOR GENERIC MATERIALS"/* 267A */,/*9851*/"BLACK UNIVERSAL RECYCLING SYMBOL"/* 267B */, /*9852*/"RECYCLED PAPER SYMBOL"/* 267C */,/*9853*/"PARTIALLY-RECYCLED PAPER SYMBOL"/* 267D */, /*9854*/"PERMANENT PAPER SIGN"/* 267E */,/*9855*/"WHEELCHAIR SYMBOL"/* 267F */,/*9856*/"DIE FACE-1"/* 2680 */, /*9857*/"DIE FACE-2"/* 2681 */,/*9858*/"DIE FACE-3"/* 2682 */,/*9859*/"DIE FACE-4"/* 2683 */, /*9860*/"DIE FACE-5"/* 2684 */,/*9861*/"DIE FACE-6"/* 2685 */,/*9862*/"WHITE CIRCLE WITH DOT RIGHT"/* 2686 */, /*9863*/"WHITE CIRCLE WITH TWO DOTS"/* 2687 */,/*9864*/"BLACK CIRCLE WITH WHITE DOT RIGHT"/* 2688 */, /*9865*/"BLACK CIRCLE WITH TWO WHITE DOTS"/* 2689 */,/*9866*/"MONOGRAM FOR YANG"/* 268A */, /*9867*/"MONOGRAM FOR YIN"/* 268B */,/*9868*/"DIGRAM FOR GREATER YANG"/* 268C */, /*9869*/"DIGRAM FOR LESSER YIN"/* 268D */,/*9870*/"DIGRAM FOR LESSER YANG"/* 268E */, /*9871*/"DIGRAM FOR GREATER YIN"/* 268F */,/*9872*/"WHITE FLAG"/* 2690 */,/*9873*/"BLACK FLAG"/* 2691 */, /*9874*/"HAMMER AND PICK"/* 2692 */,/*9875*/"ANCHOR"/* 2693 */,/*9876*/"CROSSED SWORDS"/* 2694 */, /*9877*/"STAFF OF AESCULAPIUS"/* 2695 */,/*9878*/"SCALES"/* 2696 */,/*9879*/"ALEMBIC"/* 2697 */, /*9880*/"FLOWER"/* 2698 */,/*9881*/"GEAR"/* 2699 */,/*9882*/"STAFF OF HERMES"/* 269A */,/*9883*/"ATOM SYMBOL"/* 269B */, /*9884*/"FLEUR-DE-LIS"/* 269C */,/*9885*/"OUTLINED WHITE STAR"/* 269D */, /*9886*/"THREE LINES CONVERGING RIGHT"/* 269E */,/*9887*/"THREE LINES CONVERGING LEFT"/* 269F */, /*9888*/"WARNING SIGN"/* 26A0 */,/*9889*/"HIGH VOLTAGE SIGN"/* 26A1 */,/*9890*/"DOUBLED FEMALE SIGN"/* 26A2 */, /*9891*/"DOUBLED MALE SIGN"/* 26A3 */,/*9892*/"INTERLOCKED FEMALE AND MALE SIGN"/* 26A4 */, /*9893*/"MALE AND FEMALE SIGN"/* 26A5 */,/*9894*/"MALE WITH STROKE SIGN"/* 26A6 */, /*9895*/"MALE WITH STROKE AND MALE AND FEMALE SIGN"/* 26A7 */,/*9896*/"VERTICAL MALE WITH STROKE SIGN"/* 26A8 */, /*9897*/"HORIZONTAL MALE WITH STROKE SIGN"/* 26A9 */,/*9898*/"MEDIUM WHITE CIRCLE"/* 26AA */, /*9899*/"MEDIUM BLACK CIRCLE"/* 26AB */,/*9900*/"MEDIUM SMALL WHITE CIRCLE"/* 26AC */, /*9901*/"MARRIAGE SYMBOL"/* 26AD */,/*9902*/"DIVORCE SYMBOL"/* 26AE */,/*9903*/"UNMARRIED PARTNERSHIP SYMBOL"/* 26AF */, /*9904*/"COFFIN"/* 26B0 */,/*9905*/"FUNERAL URN"/* 26B1 */,/*9906*/"NEUTER"/* 26B2 */,/*9907*/"CERES"/* 26B3 */, /*9908*/"PALLAS"/* 26B4 */,/*9909*/"JUNO"/* 26B5 */,/*9910*/"VESTA"/* 26B6 */,/*9911*/"CHIRON"/* 26B7 */, /*9912*/"BLACK MOON LILITH"/* 26B8 */,/*9913*/"SEXTILE"/* 26B9 */,/*9914*/"SEMISEXTILE"/* 26BA */, /*9915*/"QUINCUNX"/* 26BB */,/*9916*/"SESQUIQUADRATE"/* 26BC */,/*9917*/"SOCCER BALL"/* 26BD */, /*9918*/"BASEBALL"/* 26BE */,/*9919*/"SQUARED KEY"/* 26BF */,/*9920*/"WHITE DRAUGHTS MAN"/* 26C0 */, /*9921*/"WHITE DRAUGHTS KING"/* 26C1 */,/*9922*/"BLACK DRAUGHTS MAN"/* 26C2 */,/*9923*/"BLACK DRAUGHTS KING"/* 26C3 */, /*9924*/"SNOWMAN WITHOUT SNOW"/* 26C4 */,/*9925*/"SUN BEHIND CLOUD"/* 26C5 */,/*9926*/"RAIN"/* 26C6 */, /*9927*/"BLACK SNOWMAN"/* 26C7 */,/*9928*/"THUNDER CLOUD AND RAIN"/* 26C8 */, /*9929*/"TURNED WHITE SHOGI PIECE"/* 26C9 */,/*9930*/"TURNED BLACK SHOGI PIECE"/* 26CA */, /*9931*/"WHITE DIAMOND IN SQUARE"/* 26CB */,/*9932*/"CROSSING LANES"/* 26CC */,/*9933*/"DISABLED CAR"/* 26CD */, /*9934*/"OPHIUCHUS"/* 26CE */,/*9935*/"PICK"/* 26CF */,/*9936*/"CAR SLIDING"/* 26D0 */, /*9937*/"HELMET WITH WHITE CROSS"/* 26D1 */,/*9938*/"CIRCLED CROSSING LANES"/* 26D2 */,/*9939*/"CHAINS"/* 26D3 */, /*9940*/"NO ENTRY"/* 26D4 */,/*9941*/"ALTERNATE ONE-WAY LEFT WAY TRAFFIC"/* 26D5 */, /*9942*/"BLACK TWO-WAY LEFT WAY TRAFFIC"/* 26D6 */,/*9943*/"WHITE TWO-WAY LEFT WAY TRAFFIC"/* 26D7 */, /*9944*/"BLACK LEFT LANE MERGE"/* 26D8 */,/*9945*/"WHITE LEFT LANE MERGE"/* 26D9 */,/*9946*/"DRIVE SLOW SIGN"/* 26DA */, /*9947*/"HEAVY WHITE DOWN-POINTING TRIANGLE"/* 26DB */,/*9948*/"LEFT CLOSED ENTRY"/* 26DC */, /*9949*/"SQUARED SALTIRE"/* 26DD */,/*9950*/"FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE"/* 26DE */, /*9951*/"BLACK TRUCK"/* 26DF */,/*9952*/"RESTRICTED LEFT ENTRY-1"/* 26E0 */,/*9953*/"RESTRICTED LEFT ENTRY-2"/* 26E1 */, /*9954*/"ASTRONOMICAL SYMBOL FOR URANUS"/* 26E2 */,/*9955*/"HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE"/* 26E3 */, /*9956*/"PENTAGRAM"/* 26E4 */,/*9957*/"RIGHT-HANDED INTERLACED PENTAGRAM"/* 26E5 */, /*9958*/"LEFT-HANDED INTERLACED PENTAGRAM"/* 26E6 */,/*9959*/"INVERTED PENTAGRAM"/* 26E7 */, /*9960*/"BLACK CROSS ON SHIELD"/* 26E8 */,/*9961*/"SHINTO SHRINE"/* 26E9 */,/*9962*/"CHURCH"/* 26EA */, /*9963*/"CASTLE"/* 26EB */,/*9964*/"HISTORIC SITE"/* 26EC */,/*9965*/"GEAR WITHOUT HUB"/* 26ED */, /*9966*/"GEAR WITH HANDLES"/* 26EE */,/*9967*/"MAP SYMBOL FOR LIGHTHOUSE"/* 26EF */,/*9968*/"MOUNTAIN"/* 26F0 */, /*9969*/"UMBRELLA ON GROUND"/* 26F1 */,/*9970*/"FOUNTAIN"/* 26F2 */,/*9971*/"FLAG IN HOLE"/* 26F3 */, /*9972*/"FERRY"/* 26F4 */,/*9973*/"SAILBOAT"/* 26F5 */,/*9974*/"SQUARE FOUR CORNERS"/* 26F6 */,/*9975*/"SKIER"/* 26F7 */, /*9976*/"ICE SKATE"/* 26F8 */,/*9977*/"PERSON WITH BALL"/* 26F9 */,/*9978*/"TENT"/* 26FA */, /*9979*/"JAPANESE BANK SYMBOL"/* 26FB */,/*9980*/"HEADSTONE GRAVEYARD SYMBOL"/* 26FC */,/*9981*/"FUEL PUMP"/* 26FD */, /*9982*/"CUP ON BLACK SQUARE"/* 26FE */,/*9983*/"WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE"/* 26FF */, /*9984*/"BLACK SAFETY SCISSORS"/* 2700 */,/*9985*/"UPPER BLADE SCISSORS"/* 2701 */,/*9986*/"BLACK SCISSORS"/* 2702 */, /*9987*/"LOWER BLADE SCISSORS"/* 2703 */,/*9988*/"WHITE SCISSORS"/* 2704 */,/*9989*/"WHITE HEAVY CHECK MARK"/* 2705 */, /*9990*/"TELEPHONE LOCATION SIGN"/* 2706 */,/*9991*/"TAPE DRIVE"/* 2707 */,/*9992*/"AIRPLANE"/* 2708 */, /*9993*/"ENVELOPE"/* 2709 */,/*9994*/"RAISED FIST"/* 270A */,/*9995*/"RAISED HAND"/* 270B */, /*9996*/"VICTORY HAND"/* 270C */,/*9997*/"WRITING HAND"/* 270D */,/*9998*/"LOWER RIGHT PENCIL"/* 270E */, /*9999*/"PENCIL"/* 270F */,/*10000*/"UPPER RIGHT PENCIL"/* 2710 */,/*10001*/"WHITE NIB"/* 2711 */, /*10002*/"BLACK NIB"/* 2712 */,/*10003*/"CHECK MARK"/* 2713 */,/*10004*/"HEAVY CHECK MARK"/* 2714 */, /*10005*/"MULTIPLICATION X"/* 2715 */,/*10006*/"HEAVY MULTIPLICATION X"/* 2716 */,/*10007*/"BALLOT X"/* 2717 */, /*10008*/"HEAVY BALLOT X"/* 2718 */,/*10009*/"OUTLINED GREEK CROSS"/* 2719 */,/*10010*/"HEAVY GREEK CROSS"/* 271A */, /*10011*/"OPEN CENTRE CROSS"/* 271B */,/*10012*/"HEAVY OPEN CENTRE CROSS"/* 271C */,/*10013*/"LATIN CROSS"/* 271D */, /*10014*/"SHADOWED WHITE LATIN CROSS"/* 271E */,/*10015*/"OUTLINED LATIN CROSS"/* 271F */, /*10016*/"MALTESE CROSS"/* 2720 */,/*10017*/"STAR OF DAVID"/* 2721 */,/*10018*/"FOUR TEARDROP-SPOKED ASTERISK"/* 2722 */, /*10019*/"FOUR BALLOON-SPOKED ASTERISK"/* 2723 */,/*10020*/"HEAVY FOUR BALLOON-SPOKED ASTERISK"/* 2724 */, /*10021*/"FOUR CLUB-SPOKED ASTERISK"/* 2725 */,/*10022*/"BLACK FOUR POINTED STAR"/* 2726 */, /*10023*/"WHITE FOUR POINTED STAR"/* 2727 */,/*10024*/"SPARKLES"/* 2728 */, /*10025*/"STRESS OUTLINED WHITE STAR"/* 2729 */,/*10026*/"CIRCLED WHITE STAR"/* 272A */, /*10027*/"OPEN CENTRE BLACK STAR"/* 272B */,/*10028*/"BLACK CENTRE WHITE STAR"/* 272C */, /*10029*/"OUTLINED BLACK STAR"/* 272D */,/*10030*/"HEAVY OUTLINED BLACK STAR"/* 272E */, /*10031*/"PINWHEEL STAR"/* 272F */,/*10032*/"SHADOWED WHITE STAR"/* 2730 */,/*10033*/"HEAVY ASTERISK"/* 2731 */, /*10034*/"OPEN CENTRE ASTERISK"/* 2732 */,/*10035*/"EIGHT SPOKED ASTERISK"/* 2733 */, /*10036*/"EIGHT POINTED BLACK STAR"/* 2734 */,/*10037*/"EIGHT POINTED PINWHEEL STAR"/* 2735 */, /*10038*/"SIX POINTED BLACK STAR"/* 2736 */,/*10039*/"EIGHT POINTED RECTILINEAR BLACK STAR"/* 2737 */, /*10040*/"HEAVY EIGHT POINTED RECTILINEAR BLACK STAR"/* 2738 */,/*10041*/"TWELVE POINTED BLACK STAR"/* 2739 */, /*10042*/"SIXTEEN POINTED ASTERISK"/* 273A */,/*10043*/"TEARDROP-SPOKED ASTERISK"/* 273B */, /*10044*/"OPEN CENTRE TEARDROP-SPOKED ASTERISK"/* 273C */,/*10045*/"HEAVY TEARDROP-SPOKED ASTERISK"/* 273D */, /*10046*/"SIX PETALLED BLACK AND WHITE FLORETTE"/* 273E */,/*10047*/"BLACK FLORETTE"/* 273F */, /*10048*/"WHITE FLORETTE"/* 2740 */,/*10049*/"EIGHT PETALLED OUTLINED BLACK FLORETTE"/* 2741 */, /*10050*/"CIRCLED OPEN CENTRE EIGHT POINTED STAR"/* 2742 */,/*10051*/"HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK"/* 2743 */, /*10052*/"SNOWFLAKE"/* 2744 */,/*10053*/"TIGHT TRIFOLIATE SNOWFLAKE"/* 2745 */, /*10054*/"HEAVY CHEVRON SNOWFLAKE"/* 2746 */,/*10055*/"SPARKLE"/* 2747 */,/*10056*/"HEAVY SPARKLE"/* 2748 */, /*10057*/"BALLOON-SPOKED ASTERISK"/* 2749 */,/*10058*/"EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"/* 274A */, /*10059*/"HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"/* 274B */,/*10060*/"CROSS MARK"/* 274C */, /*10061*/"SHADOWED WHITE CIRCLE"/* 274D */,/*10062*/"NEGATIVE SQUARED CROSS MARK"/* 274E */, /*10063*/"LOWER RIGHT DROP-SHADOWED WHITE SQUARE"/* 274F */,/*10064*/"UPPER RIGHT DROP-SHADOWED WHITE SQUARE"/* 2750 */, /*10065*/"LOWER RIGHT SHADOWED WHITE SQUARE"/* 2751 */,/*10066*/"UPPER RIGHT SHADOWED WHITE SQUARE"/* 2752 */, /*10067*/"BLACK QUESTION MARK ORNAMENT"/* 2753 */,/*10068*/"WHITE QUESTION MARK ORNAMENT"/* 2754 */, /*10069*/"WHITE EXCLAMATION MARK ORNAMENT"/* 2755 */,/*10070*/"BLACK DIAMOND MINUS WHITE X"/* 2756 */, /*10071*/"HEAVY EXCLAMATION MARK SYMBOL"/* 2757 */,/*10072*/"LIGHT VERTICAL BAR"/* 2758 */, /*10073*/"MEDIUM VERTICAL BAR"/* 2759 */,/*10074*/"HEAVY VERTICAL BAR"/* 275A */, /*10075*/"HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 275B */, /*10076*/"HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT"/* 275C */, /*10077*/"HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 275D */, /*10078*/"HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 275E */, /*10079*/"HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT"/* 275F */, /*10080*/"HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 2760 */, /*10081*/"CURVED STEM PARAGRAPH SIGN ORNAMENT"/* 2761 */,/*10082*/"HEAVY EXCLAMATION MARK ORNAMENT"/* 2762 */, /*10083*/"HEAVY HEART EXCLAMATION MARK ORNAMENT"/* 2763 */,/*10084*/"HEAVY BLACK HEART"/* 2764 */, /*10085*/"ROTATED HEAVY BLACK HEART BULLET"/* 2765 */,/*10086*/"FLORAL HEART"/* 2766 */, /*10087*/"ROTATED FLORAL HEART BULLET"/* 2767 */,/*10088*/"MEDIUM LEFT PARENTHESIS ORNAMENT"/* 2768 */, /*10089*/"MEDIUM RIGHT PARENTHESIS ORNAMENT"/* 2769 */,/*10090*/"MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT"/* 276A */, /*10091*/"MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT"/* 276B */, /*10092*/"MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"/* 276C */, /*10093*/"MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT"/* 276D */, /*10094*/"HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT"/* 276E */, /*10095*/"HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT"/* 276F */, /*10096*/"HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT"/* 2770 */, /*10097*/"HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT"/* 2771 */, /*10098*/"LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT"/* 2772 */, /*10099*/"LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT"/* 2773 */,/*10100*/"MEDIUM LEFT CURLY BRACKET ORNAMENT"/* 2774 */, /*10101*/"MEDIUM RIGHT CURLY BRACKET ORNAMENT"/* 2775 */,/*10102*/"DINGBAT NEGATIVE CIRCLED DIGIT ONE"/* 2776 */, /*10103*/"DINGBAT NEGATIVE CIRCLED DIGIT TWO"/* 2777 */,/*10104*/"DINGBAT NEGATIVE CIRCLED DIGIT THREE"/* 2778 */, /*10105*/"DINGBAT NEGATIVE CIRCLED DIGIT FOUR"/* 2779 */,/*10106*/"DINGBAT NEGATIVE CIRCLED DIGIT FIVE"/* 277A */, /*10107*/"DINGBAT NEGATIVE CIRCLED DIGIT SIX"/* 277B */,/*10108*/"DINGBAT NEGATIVE CIRCLED DIGIT SEVEN"/* 277C */, /*10109*/"DINGBAT NEGATIVE CIRCLED DIGIT EIGHT"/* 277D */,/*10110*/"DINGBAT NEGATIVE CIRCLED DIGIT NINE"/* 277E */, /*10111*/"DINGBAT NEGATIVE CIRCLED NUMBER TEN"/* 277F */,/*10112*/"DINGBAT CIRCLED SANS-SERIF DIGIT ONE"/* 2780 */, /*10113*/"DINGBAT CIRCLED SANS-SERIF DIGIT TWO"/* 2781 */,/*10114*/"DINGBAT CIRCLED SANS-SERIF DIGIT THREE"/* 2782 */, /*10115*/"DINGBAT CIRCLED SANS-SERIF DIGIT FOUR"/* 2783 */,/*10116*/"DINGBAT CIRCLED SANS-SERIF DIGIT FIVE"/* 2784 */, /*10117*/"DINGBAT CIRCLED SANS-SERIF DIGIT SIX"/* 2785 */,/*10118*/"DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN"/* 2786 */, /*10119*/"DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT"/* 2787 */,/*10120*/"DINGBAT CIRCLED SANS-SERIF DIGIT NINE"/* 2788 */, /*10121*/"DINGBAT CIRCLED SANS-SERIF NUMBER TEN"/* 2789 */, /*10122*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE"/* 278A */, /*10123*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO"/* 278B */, /*10124*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE"/* 278C */, /*10125*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR"/* 278D */, /*10126*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE"/* 278E */, /*10127*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX"/* 278F */, /*10128*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN"/* 2790 */, /*10129*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT"/* 2791 */, /*10130*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE"/* 2792 */, /*10131*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN"/* 2793 */, /*10132*/"HEAVY WIDE-HEADED RIGHTWARDS ARROW"/* 2794 */,/*10133*/"HEAVY PLUS SIGN"/* 2795 */, /*10134*/"HEAVY MINUS SIGN"/* 2796 */,/*10135*/"HEAVY DIVISION SIGN"/* 2797 */, /*10136*/"HEAVY SOUTH EAST ARROW"/* 2798 */,/*10137*/"HEAVY RIGHTWARDS ARROW"/* 2799 */, /*10138*/"HEAVY NORTH EAST ARROW"/* 279A */,/*10139*/"DRAFTING POINT RIGHTWARDS ARROW"/* 279B */, /*10140*/"HEAVY ROUND-TIPPED RIGHTWARDS ARROW"/* 279C */,/*10141*/"TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279D */, /*10142*/"HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279E */,/*10143*/"DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279F */, /*10144*/"HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"/* 27A0 */,/*10145*/"BLACK RIGHTWARDS ARROW"/* 27A1 */, /*10146*/"THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD"/* 27A2 */, /*10147*/"THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD"/* 27A3 */,/*10148*/"BLACK RIGHTWARDS ARROWHEAD"/* 27A4 */, /*10149*/"HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW"/* 27A5 */, /*10150*/"HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW"/* 27A6 */,/*10151*/"SQUAT BLACK RIGHTWARDS ARROW"/* 27A7 */, /*10152*/"HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW"/* 27A8 */, /*10153*/"RIGHT-SHADED WHITE RIGHTWARDS ARROW"/* 27A9 */,/*10154*/"LEFT-SHADED WHITE RIGHTWARDS ARROW"/* 27AA */, /*10155*/"BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW"/* 27AB */, /*10156*/"FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW"/* 27AC */, /*10157*/"HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AD */, /*10158*/"HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AE */, /*10159*/"NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AF */,/*10160*/"CURLY LOOP"/* 27B0 */, /*10161*/"NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27B1 */, /*10162*/"CIRCLED HEAVY WHITE RIGHTWARDS ARROW"/* 27B2 */,/*10163*/"WHITE-FEATHERED RIGHTWARDS ARROW"/* 27B3 */, /*10164*/"BLACK-FEATHERED SOUTH EAST ARROW"/* 27B4 */,/*10165*/"BLACK-FEATHERED RIGHTWARDS ARROW"/* 27B5 */, /*10166*/"BLACK-FEATHERED NORTH EAST ARROW"/* 27B6 */,/*10167*/"HEAVY BLACK-FEATHERED SOUTH EAST ARROW"/* 27B7 */, /*10168*/"HEAVY BLACK-FEATHERED RIGHTWARDS ARROW"/* 27B8 */,/*10169*/"HEAVY BLACK-FEATHERED NORTH EAST ARROW"/* 27B9 */, /*10170*/"TEARDROP-BARBED RIGHTWARDS ARROW"/* 27BA */,/*10171*/"HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW"/* 27BB */, /*10172*/"WEDGE-TAILED RIGHTWARDS ARROW"/* 27BC */,/*10173*/"HEAVY WEDGE-TAILED RIGHTWARDS ARROW"/* 27BD */, /*10174*/"OPEN-OUTLINED RIGHTWARDS ARROW"/* 27BE */,/*10175*/"DOUBLE CURLY LOOP"/* 27BF */, /*10176*/"THREE DIMENSIONAL ANGLE"/* 27C0 */,/*10177*/"WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE"/* 27C1 */, /*10178*/"PERPENDICULAR"/* 27C2 */,/*10179*/"OPEN SUBSET"/* 27C3 */,/*10180*/"OPEN SUPERSET"/* 27C4 */, /*10181*/"LEFT S-SHAPED BAG DELIMITER"/* 27C5 */,/*10182*/"RIGHT S-SHAPED BAG DELIMITER"/* 27C6 */, /*10183*/"OR WITH DOT INSIDE"/* 27C7 */,/*10184*/"REVERSE SOLIDUS PRECEDING SUBSET"/* 27C8 */, /*10185*/"SUPERSET PRECEDING SOLIDUS"/* 27C9 */,/*10186*/"VERTICAL BAR WITH HORIZONTAL STROKE"/* 27CA */, /*10187*/"MATHEMATICAL RISING DIAGONAL"/* 27CB */,/*10188*/"LONG DIVISION"/* 27CC */, /*10189*/"MATHEMATICAL FALLING DIAGONAL"/* 27CD */,/*10190*/"SQUARED LOGICAL AND"/* 27CE */, /*10191*/"SQUARED LOGICAL OR"/* 27CF */,/*10192*/"WHITE DIAMOND WITH CENTRED DOT"/* 27D0 */, /*10193*/"AND WITH DOT"/* 27D1 */,/*10194*/"ELEMENT OF OPENING UPWARDS"/* 27D2 */, /*10195*/"LOWER RIGHT CORNER WITH DOT"/* 27D3 */,/*10196*/"UPPER LEFT CORNER WITH DOT"/* 27D4 */, /*10197*/"LEFT OUTER JOIN"/* 27D5 */,/*10198*/"RIGHT OUTER JOIN"/* 27D6 */,/*10199*/"FULL OUTER JOIN"/* 27D7 */, /*10200*/"LARGE UP TACK"/* 27D8 */,/*10201*/"LARGE DOWN TACK"/* 27D9 */, /*10202*/"LEFT AND RIGHT DOUBLE TURNSTILE"/* 27DA */,/*10203*/"LEFT AND RIGHT TACK"/* 27DB */, /*10204*/"LEFT MULTIMAP"/* 27DC */,/*10205*/"LONG RIGHT TACK"/* 27DD */,/*10206*/"LONG LEFT TACK"/* 27DE */, /*10207*/"UP TACK WITH CIRCLE ABOVE"/* 27DF */,/*10208*/"LOZENGE DIVIDED BY HORIZONTAL RULE"/* 27E0 */, /*10209*/"WHITE CONCAVE-SIDED DIAMOND"/* 27E1 */,/*10210*/"WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK"/* 27E2 */, /*10211*/"WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK"/* 27E3 */, /*10212*/"WHITE SQUARE WITH LEFTWARDS TICK"/* 27E4 */,/*10213*/"WHITE SQUARE WITH RIGHTWARDS TICK"/* 27E5 */, /*10214*/"MATHEMATICAL LEFT WHITE SQUARE BRACKET"/* 27E6 */,/*10215*/"MATHEMATICAL RIGHT WHITE SQUARE BRACKET"/* 27E7 */, /*10216*/"MATHEMATICAL LEFT ANGLE BRACKET"/* 27E8 */,/*10217*/"MATHEMATICAL RIGHT ANGLE BRACKET"/* 27E9 */, /*10218*/"MATHEMATICAL LEFT DOUBLE ANGLE BRACKET"/* 27EA */,/*10219*/"MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET"/* 27EB */, /*10220*/"MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET"/* 27EC */, /*10221*/"MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET"/* 27ED */, /*10222*/"MATHEMATICAL LEFT FLATTENED PARENTHESIS"/* 27EE */, /*10223*/"MATHEMATICAL RIGHT FLATTENED PARENTHESIS"/* 27EF */,/*10224*/"UPWARDS QUADRUPLE ARROW"/* 27F0 */, /*10225*/"DOWNWARDS QUADRUPLE ARROW"/* 27F1 */,/*10226*/"ANTICLOCKWISE GAPPED CIRCLE ARROW"/* 27F2 */, /*10227*/"CLOCKWISE GAPPED CIRCLE ARROW"/* 27F3 */,/*10228*/"RIGHT ARROW WITH CIRCLED PLUS"/* 27F4 */, /*10229*/"LONG LEFTWARDS ARROW"/* 27F5 */,/*10230*/"LONG RIGHTWARDS ARROW"/* 27F6 */, /*10231*/"LONG LEFT RIGHT ARROW"/* 27F7 */,/*10232*/"LONG LEFTWARDS DOUBLE ARROW"/* 27F8 */, /*10233*/"LONG RIGHTWARDS DOUBLE ARROW"/* 27F9 */,/*10234*/"LONG LEFT RIGHT DOUBLE ARROW"/* 27FA */, /*10235*/"LONG LEFTWARDS ARROW FROM BAR"/* 27FB */,/*10236*/"LONG RIGHTWARDS ARROW FROM BAR"/* 27FC */, /*10237*/"LONG LEFTWARDS DOUBLE ARROW FROM BAR"/* 27FD */,/*10238*/"LONG RIGHTWARDS DOUBLE ARROW FROM BAR"/* 27FE */, /*10239*/"LONG RIGHTWARDS SQUIGGLE ARROW"/* 27FF */,/*10240*/"BRAILLE PATTERN BLANK"/* 2800 */, /*10241*/"BRAILLE PATTERN DOTS-1"/* 2801 */,/*10242*/"BRAILLE PATTERN DOTS-2"/* 2802 */, /*10243*/"BRAILLE PATTERN DOTS-12"/* 2803 */,/*10244*/"BRAILLE PATTERN DOTS-3"/* 2804 */, /*10245*/"BRAILLE PATTERN DOTS-13"/* 2805 */,/*10246*/"BRAILLE PATTERN DOTS-23"/* 2806 */, /*10247*/"BRAILLE PATTERN DOTS-123"/* 2807 */,/*10248*/"BRAILLE PATTERN DOTS-4"/* 2808 */, /*10249*/"BRAILLE PATTERN DOTS-14"/* 2809 */,/*10250*/"BRAILLE PATTERN DOTS-24"/* 280A */, /*10251*/"BRAILLE PATTERN DOTS-124"/* 280B */,/*10252*/"BRAILLE PATTERN DOTS-34"/* 280C */, /*10253*/"BRAILLE PATTERN DOTS-134"/* 280D */,/*10254*/"BRAILLE PATTERN DOTS-234"/* 280E */, /*10255*/"BRAILLE PATTERN DOTS-1234"/* 280F */,/*10256*/"BRAILLE PATTERN DOTS-5"/* 2810 */, /*10257*/"BRAILLE PATTERN DOTS-15"/* 2811 */,/*10258*/"BRAILLE PATTERN DOTS-25"/* 2812 */, /*10259*/"BRAILLE PATTERN DOTS-125"/* 2813 */,/*10260*/"BRAILLE PATTERN DOTS-35"/* 2814 */, /*10261*/"BRAILLE PATTERN DOTS-135"/* 2815 */,/*10262*/"BRAILLE PATTERN DOTS-235"/* 2816 */, /*10263*/"BRAILLE PATTERN DOTS-1235"/* 2817 */,/*10264*/"BRAILLE PATTERN DOTS-45"/* 2818 */, /*10265*/"BRAILLE PATTERN DOTS-145"/* 2819 */,/*10266*/"BRAILLE PATTERN DOTS-245"/* 281A */, /*10267*/"BRAILLE PATTERN DOTS-1245"/* 281B */,/*10268*/"BRAILLE PATTERN DOTS-345"/* 281C */, /*10269*/"BRAILLE PATTERN DOTS-1345"/* 281D */,/*10270*/"BRAILLE PATTERN DOTS-2345"/* 281E */, /*10271*/"BRAILLE PATTERN DOTS-12345"/* 281F */,/*10272*/"BRAILLE PATTERN DOTS-6"/* 2820 */, /*10273*/"BRAILLE PATTERN DOTS-16"/* 2821 */,/*10274*/"BRAILLE PATTERN DOTS-26"/* 2822 */, /*10275*/"BRAILLE PATTERN DOTS-126"/* 2823 */,/*10276*/"BRAILLE PATTERN DOTS-36"/* 2824 */, /*10277*/"BRAILLE PATTERN DOTS-136"/* 2825 */,/*10278*/"BRAILLE PATTERN DOTS-236"/* 2826 */, /*10279*/"BRAILLE PATTERN DOTS-1236"/* 2827 */,/*10280*/"BRAILLE PATTERN DOTS-46"/* 2828 */, /*10281*/"BRAILLE PATTERN DOTS-146"/* 2829 */,/*10282*/"BRAILLE PATTERN DOTS-246"/* 282A */, /*10283*/"BRAILLE PATTERN DOTS-1246"/* 282B */,/*10284*/"BRAILLE PATTERN DOTS-346"/* 282C */, /*10285*/"BRAILLE PATTERN DOTS-1346"/* 282D */,/*10286*/"BRAILLE PATTERN DOTS-2346"/* 282E */, /*10287*/"BRAILLE PATTERN DOTS-12346"/* 282F */,/*10288*/"BRAILLE PATTERN DOTS-56"/* 2830 */, /*10289*/"BRAILLE PATTERN DOTS-156"/* 2831 */,/*10290*/"BRAILLE PATTERN DOTS-256"/* 2832 */, /*10291*/"BRAILLE PATTERN DOTS-1256"/* 2833 */,/*10292*/"BRAILLE PATTERN DOTS-356"/* 2834 */, /*10293*/"BRAILLE PATTERN DOTS-1356"/* 2835 */,/*10294*/"BRAILLE PATTERN DOTS-2356"/* 2836 */, /*10295*/"BRAILLE PATTERN DOTS-12356"/* 2837 */,/*10296*/"BRAILLE PATTERN DOTS-456"/* 2838 */, /*10297*/"BRAILLE PATTERN DOTS-1456"/* 2839 */,/*10298*/"BRAILLE PATTERN DOTS-2456"/* 283A */, /*10299*/"BRAILLE PATTERN DOTS-12456"/* 283B */,/*10300*/"BRAILLE PATTERN DOTS-3456"/* 283C */, /*10301*/"BRAILLE PATTERN DOTS-13456"/* 283D */,/*10302*/"BRAILLE PATTERN DOTS-23456"/* 283E */, /*10303*/"BRAILLE PATTERN DOTS-123456"/* 283F */,/*10304*/"BRAILLE PATTERN DOTS-7"/* 2840 */, /*10305*/"BRAILLE PATTERN DOTS-17"/* 2841 */,/*10306*/"BRAILLE PATTERN DOTS-27"/* 2842 */, /*10307*/"BRAILLE PATTERN DOTS-127"/* 2843 */,/*10308*/"BRAILLE PATTERN DOTS-37"/* 2844 */, /*10309*/"BRAILLE PATTERN DOTS-137"/* 2845 */,/*10310*/"BRAILLE PATTERN DOTS-237"/* 2846 */, /*10311*/"BRAILLE PATTERN DOTS-1237"/* 2847 */,/*10312*/"BRAILLE PATTERN DOTS-47"/* 2848 */, /*10313*/"BRAILLE PATTERN DOTS-147"/* 2849 */,/*10314*/"BRAILLE PATTERN DOTS-247"/* 284A */, /*10315*/"BRAILLE PATTERN DOTS-1247"/* 284B */,/*10316*/"BRAILLE PATTERN DOTS-347"/* 284C */, /*10317*/"BRAILLE PATTERN DOTS-1347"/* 284D */,/*10318*/"BRAILLE PATTERN DOTS-2347"/* 284E */, /*10319*/"BRAILLE PATTERN DOTS-12347"/* 284F */,/*10320*/"BRAILLE PATTERN DOTS-57"/* 2850 */, /*10321*/"BRAILLE PATTERN DOTS-157"/* 2851 */,/*10322*/"BRAILLE PATTERN DOTS-257"/* 2852 */, /*10323*/"BRAILLE PATTERN DOTS-1257"/* 2853 */,/*10324*/"BRAILLE PATTERN DOTS-357"/* 2854 */, /*10325*/"BRAILLE PATTERN DOTS-1357"/* 2855 */,/*10326*/"BRAILLE PATTERN DOTS-2357"/* 2856 */, /*10327*/"BRAILLE PATTERN DOTS-12357"/* 2857 */,/*10328*/"BRAILLE PATTERN DOTS-457"/* 2858 */, /*10329*/"BRAILLE PATTERN DOTS-1457"/* 2859 */,/*10330*/"BRAILLE PATTERN DOTS-2457"/* 285A */, /*10331*/"BRAILLE PATTERN DOTS-12457"/* 285B */,/*10332*/"BRAILLE PATTERN DOTS-3457"/* 285C */, /*10333*/"BRAILLE PATTERN DOTS-13457"/* 285D */,/*10334*/"BRAILLE PATTERN DOTS-23457"/* 285E */, /*10335*/"BRAILLE PATTERN DOTS-123457"/* 285F */,/*10336*/"BRAILLE PATTERN DOTS-67"/* 2860 */, /*10337*/"BRAILLE PATTERN DOTS-167"/* 2861 */,/*10338*/"BRAILLE PATTERN DOTS-267"/* 2862 */, /*10339*/"BRAILLE PATTERN DOTS-1267"/* 2863 */,/*10340*/"BRAILLE PATTERN DOTS-367"/* 2864 */, /*10341*/"BRAILLE PATTERN DOTS-1367"/* 2865 */,/*10342*/"BRAILLE PATTERN DOTS-2367"/* 2866 */, /*10343*/"BRAILLE PATTERN DOTS-12367"/* 2867 */,/*10344*/"BRAILLE PATTERN DOTS-467"/* 2868 */, /*10345*/"BRAILLE PATTERN DOTS-1467"/* 2869 */,/*10346*/"BRAILLE PATTERN DOTS-2467"/* 286A */, /*10347*/"BRAILLE PATTERN DOTS-12467"/* 286B */,/*10348*/"BRAILLE PATTERN DOTS-3467"/* 286C */, /*10349*/"BRAILLE PATTERN DOTS-13467"/* 286D */,/*10350*/"BRAILLE PATTERN DOTS-23467"/* 286E */, /*10351*/"BRAILLE PATTERN DOTS-123467"/* 286F */,/*10352*/"BRAILLE PATTERN DOTS-567"/* 2870 */, /*10353*/"BRAILLE PATTERN DOTS-1567"/* 2871 */,/*10354*/"BRAILLE PATTERN DOTS-2567"/* 2872 */, /*10355*/"BRAILLE PATTERN DOTS-12567"/* 2873 */,/*10356*/"BRAILLE PATTERN DOTS-3567"/* 2874 */, /*10357*/"BRAILLE PATTERN DOTS-13567"/* 2875 */,/*10358*/"BRAILLE PATTERN DOTS-23567"/* 2876 */, /*10359*/"BRAILLE PATTERN DOTS-123567"/* 2877 */,/*10360*/"BRAILLE PATTERN DOTS-4567"/* 2878 */, /*10361*/"BRAILLE PATTERN DOTS-14567"/* 2879 */,/*10362*/"BRAILLE PATTERN DOTS-24567"/* 287A */, /*10363*/"BRAILLE PATTERN DOTS-124567"/* 287B */,/*10364*/"BRAILLE PATTERN DOTS-34567"/* 287C */, /*10365*/"BRAILLE PATTERN DOTS-134567"/* 287D */,/*10366*/"BRAILLE PATTERN DOTS-234567"/* 287E */, /*10367*/"BRAILLE PATTERN DOTS-1234567"/* 287F */,/*10368*/"BRAILLE PATTERN DOTS-8"/* 2880 */, /*10369*/"BRAILLE PATTERN DOTS-18"/* 2881 */,/*10370*/"BRAILLE PATTERN DOTS-28"/* 2882 */, /*10371*/"BRAILLE PATTERN DOTS-128"/* 2883 */,/*10372*/"BRAILLE PATTERN DOTS-38"/* 2884 */, /*10373*/"BRAILLE PATTERN DOTS-138"/* 2885 */,/*10374*/"BRAILLE PATTERN DOTS-238"/* 2886 */, /*10375*/"BRAILLE PATTERN DOTS-1238"/* 2887 */,/*10376*/"BRAILLE PATTERN DOTS-48"/* 2888 */, /*10377*/"BRAILLE PATTERN DOTS-148"/* 2889 */,/*10378*/"BRAILLE PATTERN DOTS-248"/* 288A */, /*10379*/"BRAILLE PATTERN DOTS-1248"/* 288B */,/*10380*/"BRAILLE PATTERN DOTS-348"/* 288C */, /*10381*/"BRAILLE PATTERN DOTS-1348"/* 288D */,/*10382*/"BRAILLE PATTERN DOTS-2348"/* 288E */, /*10383*/"BRAILLE PATTERN DOTS-12348"/* 288F */,/*10384*/"BRAILLE PATTERN DOTS-58"/* 2890 */, /*10385*/"BRAILLE PATTERN DOTS-158"/* 2891 */,/*10386*/"BRAILLE PATTERN DOTS-258"/* 2892 */, /*10387*/"BRAILLE PATTERN DOTS-1258"/* 2893 */,/*10388*/"BRAILLE PATTERN DOTS-358"/* 2894 */, /*10389*/"BRAILLE PATTERN DOTS-1358"/* 2895 */,/*10390*/"BRAILLE PATTERN DOTS-2358"/* 2896 */, /*10391*/"BRAILLE PATTERN DOTS-12358"/* 2897 */,/*10392*/"BRAILLE PATTERN DOTS-458"/* 2898 */, /*10393*/"BRAILLE PATTERN DOTS-1458"/* 2899 */,/*10394*/"BRAILLE PATTERN DOTS-2458"/* 289A */, /*10395*/"BRAILLE PATTERN DOTS-12458"/* 289B */,/*10396*/"BRAILLE PATTERN DOTS-3458"/* 289C */, /*10397*/"BRAILLE PATTERN DOTS-13458"/* 289D */,/*10398*/"BRAILLE PATTERN DOTS-23458"/* 289E */, /*10399*/"BRAILLE PATTERN DOTS-123458"/* 289F */,/*10400*/"BRAILLE PATTERN DOTS-68"/* 28A0 */, /*10401*/"BRAILLE PATTERN DOTS-168"/* 28A1 */,/*10402*/"BRAILLE PATTERN DOTS-268"/* 28A2 */, /*10403*/"BRAILLE PATTERN DOTS-1268"/* 28A3 */,/*10404*/"BRAILLE PATTERN DOTS-368"/* 28A4 */, /*10405*/"BRAILLE PATTERN DOTS-1368"/* 28A5 */,/*10406*/"BRAILLE PATTERN DOTS-2368"/* 28A6 */, /*10407*/"BRAILLE PATTERN DOTS-12368"/* 28A7 */,/*10408*/"BRAILLE PATTERN DOTS-468"/* 28A8 */, /*10409*/"BRAILLE PATTERN DOTS-1468"/* 28A9 */,/*10410*/"BRAILLE PATTERN DOTS-2468"/* 28AA */, /*10411*/"BRAILLE PATTERN DOTS-12468"/* 28AB */,/*10412*/"BRAILLE PATTERN DOTS-3468"/* 28AC */, /*10413*/"BRAILLE PATTERN DOTS-13468"/* 28AD */,/*10414*/"BRAILLE PATTERN DOTS-23468"/* 28AE */, /*10415*/"BRAILLE PATTERN DOTS-123468"/* 28AF */,/*10416*/"BRAILLE PATTERN DOTS-568"/* 28B0 */, /*10417*/"BRAILLE PATTERN DOTS-1568"/* 28B1 */,/*10418*/"BRAILLE PATTERN DOTS-2568"/* 28B2 */, /*10419*/"BRAILLE PATTERN DOTS-12568"/* 28B3 */,/*10420*/"BRAILLE PATTERN DOTS-3568"/* 28B4 */, /*10421*/"BRAILLE PATTERN DOTS-13568"/* 28B5 */,/*10422*/"BRAILLE PATTERN DOTS-23568"/* 28B6 */, /*10423*/"BRAILLE PATTERN DOTS-123568"/* 28B7 */,/*10424*/"BRAILLE PATTERN DOTS-4568"/* 28B8 */, /*10425*/"BRAILLE PATTERN DOTS-14568"/* 28B9 */,/*10426*/"BRAILLE PATTERN DOTS-24568"/* 28BA */, /*10427*/"BRAILLE PATTERN DOTS-124568"/* 28BB */,/*10428*/"BRAILLE PATTERN DOTS-34568"/* 28BC */, /*10429*/"BRAILLE PATTERN DOTS-134568"/* 28BD */,/*10430*/"BRAILLE PATTERN DOTS-234568"/* 28BE */, /*10431*/"BRAILLE PATTERN DOTS-1234568"/* 28BF */,/*10432*/"BRAILLE PATTERN DOTS-78"/* 28C0 */, /*10433*/"BRAILLE PATTERN DOTS-178"/* 28C1 */,/*10434*/"BRAILLE PATTERN DOTS-278"/* 28C2 */, /*10435*/"BRAILLE PATTERN DOTS-1278"/* 28C3 */,/*10436*/"BRAILLE PATTERN DOTS-378"/* 28C4 */, /*10437*/"BRAILLE PATTERN DOTS-1378"/* 28C5 */,/*10438*/"BRAILLE PATTERN DOTS-2378"/* 28C6 */, /*10439*/"BRAILLE PATTERN DOTS-12378"/* 28C7 */,/*10440*/"BRAILLE PATTERN DOTS-478"/* 28C8 */, /*10441*/"BRAILLE PATTERN DOTS-1478"/* 28C9 */,/*10442*/"BRAILLE PATTERN DOTS-2478"/* 28CA */, /*10443*/"BRAILLE PATTERN DOTS-12478"/* 28CB */,/*10444*/"BRAILLE PATTERN DOTS-3478"/* 28CC */, /*10445*/"BRAILLE PATTERN DOTS-13478"/* 28CD */,/*10446*/"BRAILLE PATTERN DOTS-23478"/* 28CE */, /*10447*/"BRAILLE PATTERN DOTS-123478"/* 28CF */,/*10448*/"BRAILLE PATTERN DOTS-578"/* 28D0 */, /*10449*/"BRAILLE PATTERN DOTS-1578"/* 28D1 */,/*10450*/"BRAILLE PATTERN DOTS-2578"/* 28D2 */, /*10451*/"BRAILLE PATTERN DOTS-12578"/* 28D3 */,/*10452*/"BRAILLE PATTERN DOTS-3578"/* 28D4 */, /*10453*/"BRAILLE PATTERN DOTS-13578"/* 28D5 */,/*10454*/"BRAILLE PATTERN DOTS-23578"/* 28D6 */, /*10455*/"BRAILLE PATTERN DOTS-123578"/* 28D7 */,/*10456*/"BRAILLE PATTERN DOTS-4578"/* 28D8 */, /*10457*/"BRAILLE PATTERN DOTS-14578"/* 28D9 */,/*10458*/"BRAILLE PATTERN DOTS-24578"/* 28DA */, /*10459*/"BRAILLE PATTERN DOTS-124578"/* 28DB */,/*10460*/"BRAILLE PATTERN DOTS-34578"/* 28DC */, /*10461*/"BRAILLE PATTERN DOTS-134578"/* 28DD */,/*10462*/"BRAILLE PATTERN DOTS-234578"/* 28DE */, /*10463*/"BRAILLE PATTERN DOTS-1234578"/* 28DF */,/*10464*/"BRAILLE PATTERN DOTS-678"/* 28E0 */, /*10465*/"BRAILLE PATTERN DOTS-1678"/* 28E1 */,/*10466*/"BRAILLE PATTERN DOTS-2678"/* 28E2 */, /*10467*/"BRAILLE PATTERN DOTS-12678"/* 28E3 */,/*10468*/"BRAILLE PATTERN DOTS-3678"/* 28E4 */, /*10469*/"BRAILLE PATTERN DOTS-13678"/* 28E5 */,/*10470*/"BRAILLE PATTERN DOTS-23678"/* 28E6 */, /*10471*/"BRAILLE PATTERN DOTS-123678"/* 28E7 */,/*10472*/"BRAILLE PATTERN DOTS-4678"/* 28E8 */, /*10473*/"BRAILLE PATTERN DOTS-14678"/* 28E9 */,/*10474*/"BRAILLE PATTERN DOTS-24678"/* 28EA */, /*10475*/"BRAILLE PATTERN DOTS-124678"/* 28EB */,/*10476*/"BRAILLE PATTERN DOTS-34678"/* 28EC */, /*10477*/"BRAILLE PATTERN DOTS-134678"/* 28ED */,/*10478*/"BRAILLE PATTERN DOTS-234678"/* 28EE */, /*10479*/"BRAILLE PATTERN DOTS-1234678"/* 28EF */,/*10480*/"BRAILLE PATTERN DOTS-5678"/* 28F0 */, /*10481*/"BRAILLE PATTERN DOTS-15678"/* 28F1 */,/*10482*/"BRAILLE PATTERN DOTS-25678"/* 28F2 */, /*10483*/"BRAILLE PATTERN DOTS-125678"/* 28F3 */,/*10484*/"BRAILLE PATTERN DOTS-35678"/* 28F4 */, /*10485*/"BRAILLE PATTERN DOTS-135678"/* 28F5 */,/*10486*/"BRAILLE PATTERN DOTS-235678"/* 28F6 */, /*10487*/"BRAILLE PATTERN DOTS-1235678"/* 28F7 */,/*10488*/"BRAILLE PATTERN DOTS-45678"/* 28F8 */, /*10489*/"BRAILLE PATTERN DOTS-145678"/* 28F9 */,/*10490*/"BRAILLE PATTERN DOTS-245678"/* 28FA */, /*10491*/"BRAILLE PATTERN DOTS-1245678"/* 28FB */,/*10492*/"BRAILLE PATTERN DOTS-345678"/* 28FC */, /*10493*/"BRAILLE PATTERN DOTS-1345678"/* 28FD */,/*10494*/"BRAILLE PATTERN DOTS-2345678"/* 28FE */, /*10495*/"BRAILLE PATTERN DOTS-12345678"/* 28FF */,/*10496*/"RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE"/* 2900 */, /*10497*/"RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE"/* 2901 */, /*10498*/"LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE"/* 2902 */, /*10499*/"RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE"/* 2903 */, /*10500*/"LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE"/* 2904 */, /*10501*/"RIGHTWARDS TWO-HEADED ARROW FROM BAR"/* 2905 */,/*10502*/"LEFTWARDS DOUBLE ARROW FROM BAR"/* 2906 */, /*10503*/"RIGHTWARDS DOUBLE ARROW FROM BAR"/* 2907 */,/*10504*/"DOWNWARDS ARROW WITH HORIZONTAL STROKE"/* 2908 */, /*10505*/"UPWARDS ARROW WITH HORIZONTAL STROKE"/* 2909 */,/*10506*/"UPWARDS TRIPLE ARROW"/* 290A */, /*10507*/"DOWNWARDS TRIPLE ARROW"/* 290B */,/*10508*/"LEFTWARDS DOUBLE DASH ARROW"/* 290C */, /*10509*/"RIGHTWARDS DOUBLE DASH ARROW"/* 290D */,/*10510*/"LEFTWARDS TRIPLE DASH ARROW"/* 290E */, /*10511*/"RIGHTWARDS TRIPLE DASH ARROW"/* 290F */,/*10512*/"RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW"/* 2910 */, /*10513*/"RIGHTWARDS ARROW WITH DOTTED STEM"/* 2911 */,/*10514*/"UPWARDS ARROW TO BAR"/* 2912 */, /*10515*/"DOWNWARDS ARROW TO BAR"/* 2913 */,/*10516*/"RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE"/* 2914 */, /*10517*/"RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2915 */, /*10518*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL"/* 2916 */, /*10519*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE"/* 2917 */, /*10520*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2918 */, /*10521*/"LEFTWARDS ARROW-TAIL"/* 2919 */,/*10522*/"RIGHTWARDS ARROW-TAIL"/* 291A */, /*10523*/"LEFTWARDS DOUBLE ARROW-TAIL"/* 291B */,/*10524*/"RIGHTWARDS DOUBLE ARROW-TAIL"/* 291C */, /*10525*/"LEFTWARDS ARROW TO BLACK DIAMOND"/* 291D */,/*10526*/"RIGHTWARDS ARROW TO BLACK DIAMOND"/* 291E */, /*10527*/"LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND"/* 291F */, /*10528*/"RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND"/* 2920 */,/*10529*/"NORTH WEST AND SOUTH EAST ARROW"/* 2921 */, /*10530*/"NORTH EAST AND SOUTH WEST ARROW"/* 2922 */,/*10531*/"NORTH WEST ARROW WITH HOOK"/* 2923 */, /*10532*/"NORTH EAST ARROW WITH HOOK"/* 2924 */,/*10533*/"SOUTH EAST ARROW WITH HOOK"/* 2925 */, /*10534*/"SOUTH WEST ARROW WITH HOOK"/* 2926 */,/*10535*/"NORTH WEST ARROW AND NORTH EAST ARROW"/* 2927 */, /*10536*/"NORTH EAST ARROW AND SOUTH EAST ARROW"/* 2928 */,/*10537*/"SOUTH EAST ARROW AND SOUTH WEST ARROW"/* 2929 */, /*10538*/"SOUTH WEST ARROW AND NORTH WEST ARROW"/* 292A */, /*10539*/"RISING DIAGONAL CROSSING FALLING DIAGONAL"/* 292B */, /*10540*/"FALLING DIAGONAL CROSSING RISING DIAGONAL"/* 292C */, /*10541*/"SOUTH EAST ARROW CROSSING NORTH EAST ARROW"/* 292D */, /*10542*/"NORTH EAST ARROW CROSSING SOUTH EAST ARROW"/* 292E */, /*10543*/"FALLING DIAGONAL CROSSING NORTH EAST ARROW"/* 292F */, /*10544*/"RISING DIAGONAL CROSSING SOUTH EAST ARROW"/* 2930 */, /*10545*/"NORTH EAST ARROW CROSSING NORTH WEST ARROW"/* 2931 */, /*10546*/"NORTH WEST ARROW CROSSING NORTH EAST ARROW"/* 2932 */,/*10547*/"WAVE ARROW POINTING DIRECTLY RIGHT"/* 2933 */, /*10548*/"ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS"/* 2934 */, /*10549*/"ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS"/* 2935 */, /*10550*/"ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS"/* 2936 */, /*10551*/"ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS"/* 2937 */, /*10552*/"RIGHT-SIDE ARC CLOCKWISE ARROW"/* 2938 */,/*10553*/"LEFT-SIDE ARC ANTICLOCKWISE ARROW"/* 2939 */, /*10554*/"TOP ARC ANTICLOCKWISE ARROW"/* 293A */,/*10555*/"BOTTOM ARC ANTICLOCKWISE ARROW"/* 293B */, /*10556*/"TOP ARC CLOCKWISE ARROW WITH MINUS"/* 293C */,/*10557*/"TOP ARC ANTICLOCKWISE ARROW WITH PLUS"/* 293D */, /*10558*/"LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW"/* 293E */, /*10559*/"LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW"/* 293F */,/*10560*/"ANTICLOCKWISE CLOSED CIRCLE ARROW"/* 2940 */, /*10561*/"CLOCKWISE CLOSED CIRCLE ARROW"/* 2941 */,/*10562*/"RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW"/* 2942 */, /*10563*/"LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW"/* 2943 */, /*10564*/"SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW"/* 2944 */,/*10565*/"RIGHTWARDS ARROW WITH PLUS BELOW"/* 2945 */, /*10566*/"LEFTWARDS ARROW WITH PLUS BELOW"/* 2946 */,/*10567*/"RIGHTWARDS ARROW THROUGH X"/* 2947 */, /*10568*/"LEFT RIGHT ARROW THROUGH SMALL CIRCLE"/* 2948 */, /*10569*/"UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE"/* 2949 */, /*10570*/"LEFT BARB UP RIGHT BARB DOWN HARPOON"/* 294A */,/*10571*/"LEFT BARB DOWN RIGHT BARB UP HARPOON"/* 294B */, /*10572*/"UP BARB RIGHT DOWN BARB LEFT HARPOON"/* 294C */,/*10573*/"UP BARB LEFT DOWN BARB RIGHT HARPOON"/* 294D */, /*10574*/"LEFT BARB UP RIGHT BARB UP HARPOON"/* 294E */,/*10575*/"UP BARB RIGHT DOWN BARB RIGHT HARPOON"/* 294F */, /*10576*/"LEFT BARB DOWN RIGHT BARB DOWN HARPOON"/* 2950 */,/*10577*/"UP BARB LEFT DOWN BARB LEFT HARPOON"/* 2951 */, /*10578*/"LEFTWARDS HARPOON WITH BARB UP TO BAR"/* 2952 */,/*10579*/"RIGHTWARDS HARPOON WITH BARB UP TO BAR"/* 2953 */, /*10580*/"UPWARDS HARPOON WITH BARB RIGHT TO BAR"/* 2954 */, /*10581*/"DOWNWARDS HARPOON WITH BARB RIGHT TO BAR"/* 2955 */, /*10582*/"LEFTWARDS HARPOON WITH BARB DOWN TO BAR"/* 2956 */, /*10583*/"RIGHTWARDS HARPOON WITH BARB DOWN TO BAR"/* 2957 */,/*10584*/"UPWARDS HARPOON WITH BARB LEFT TO BAR"/* 2958 */, /*10585*/"DOWNWARDS HARPOON WITH BARB LEFT TO BAR"/* 2959 */, /*10586*/"LEFTWARDS HARPOON WITH BARB UP FROM BAR"/* 295A */, /*10587*/"RIGHTWARDS HARPOON WITH BARB UP FROM BAR"/* 295B */, /*10588*/"UPWARDS HARPOON WITH BARB RIGHT FROM BAR"/* 295C */, /*10589*/"DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR"/* 295D */, /*10590*/"LEFTWARDS HARPOON WITH BARB DOWN FROM BAR"/* 295E */, /*10591*/"RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR"/* 295F */, /*10592*/"UPWARDS HARPOON WITH BARB LEFT FROM BAR"/* 2960 */, /*10593*/"DOWNWARDS HARPOON WITH BARB LEFT FROM BAR"/* 2961 */, /*10594*/"LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN"/* 2962 */, /*10595*/"UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"/* 2963 */, /*10596*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN"/* 2964 */, /*10597*/"DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"/* 2965 */, /*10598*/"LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP"/* 2966 */, /*10599*/"LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN"/* 2967 */, /*10600*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP"/* 2968 */, /*10601*/"RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN"/* 2969 */, /*10602*/"LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH"/* 296A */, /*10603*/"LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH"/* 296B */, /*10604*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH"/* 296C */, /*10605*/"RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH"/* 296D */, /*10606*/"UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"/* 296E */, /*10607*/"DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"/* 296F */, /*10608*/"RIGHT DOUBLE ARROW WITH ROUNDED HEAD"/* 2970 */,/*10609*/"EQUALS SIGN ABOVE RIGHTWARDS ARROW"/* 2971 */, /*10610*/"TILDE OPERATOR ABOVE RIGHTWARDS ARROW"/* 2972 */,/*10611*/"LEFTWARDS ARROW ABOVE TILDE OPERATOR"/* 2973 */, /*10612*/"RIGHTWARDS ARROW ABOVE TILDE OPERATOR"/* 2974 */,/*10613*/"RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO"/* 2975 */, /*10614*/"LESS-THAN ABOVE LEFTWARDS ARROW"/* 2976 */,/*10615*/"LEFTWARDS ARROW THROUGH LESS-THAN"/* 2977 */, /*10616*/"GREATER-THAN ABOVE RIGHTWARDS ARROW"/* 2978 */,/*10617*/"SUBSET ABOVE RIGHTWARDS ARROW"/* 2979 */, /*10618*/"LEFTWARDS ARROW THROUGH SUBSET"/* 297A */,/*10619*/"SUPERSET ABOVE LEFTWARDS ARROW"/* 297B */, /*10620*/"LEFT FISH TAIL"/* 297C */,/*10621*/"RIGHT FISH TAIL"/* 297D */,/*10622*/"UP FISH TAIL"/* 297E */, /*10623*/"DOWN FISH TAIL"/* 297F */,/*10624*/"TRIPLE VERTICAL BAR DELIMITER"/* 2980 */, /*10625*/"Z NOTATION SPOT"/* 2981 */,/*10626*/"Z NOTATION TYPE COLON"/* 2982 */, /*10627*/"LEFT WHITE CURLY BRACKET"/* 2983 */,/*10628*/"RIGHT WHITE CURLY BRACKET"/* 2984 */, /*10629*/"LEFT WHITE PARENTHESIS"/* 2985 */,/*10630*/"RIGHT WHITE PARENTHESIS"/* 2986 */, /*10631*/"Z NOTATION LEFT IMAGE BRACKET"/* 2987 */,/*10632*/"Z NOTATION RIGHT IMAGE BRACKET"/* 2988 */, /*10633*/"Z NOTATION LEFT BINDING BRACKET"/* 2989 */,/*10634*/"Z NOTATION RIGHT BINDING BRACKET"/* 298A */, /*10635*/"LEFT SQUARE BRACKET WITH UNDERBAR"/* 298B */,/*10636*/"RIGHT SQUARE BRACKET WITH UNDERBAR"/* 298C */, /*10637*/"LEFT SQUARE BRACKET WITH TICK IN TOP CORNER"/* 298D */, /*10638*/"RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER"/* 298E */, /*10639*/"LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER"/* 298F */, /*10640*/"RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER"/* 2990 */,/*10641*/"LEFT ANGLE BRACKET WITH DOT"/* 2991 */, /*10642*/"RIGHT ANGLE BRACKET WITH DOT"/* 2992 */,/*10643*/"LEFT ARC LESS-THAN BRACKET"/* 2993 */, /*10644*/"RIGHT ARC GREATER-THAN BRACKET"/* 2994 */,/*10645*/"DOUBLE LEFT ARC GREATER-THAN BRACKET"/* 2995 */, /*10646*/"DOUBLE RIGHT ARC LESS-THAN BRACKET"/* 2996 */,/*10647*/"LEFT BLACK TORTOISE SHELL BRACKET"/* 2997 */, /*10648*/"RIGHT BLACK TORTOISE SHELL BRACKET"/* 2998 */,/*10649*/"DOTTED FENCE"/* 2999 */, /*10650*/"VERTICAL ZIGZAG LINE"/* 299A */,/*10651*/"MEASURED ANGLE OPENING LEFT"/* 299B */, /*10652*/"RIGHT ANGLE VARIANT WITH SQUARE"/* 299C */,/*10653*/"MEASURED RIGHT ANGLE WITH DOT"/* 299D */, /*10654*/"ANGLE WITH S INSIDE"/* 299E */,/*10655*/"ACUTE ANGLE"/* 299F */, /*10656*/"SPHERICAL ANGLE OPENING LEFT"/* 29A0 */,/*10657*/"SPHERICAL ANGLE OPENING UP"/* 29A1 */, /*10658*/"TURNED ANGLE"/* 29A2 */,/*10659*/"REVERSED ANGLE"/* 29A3 */,/*10660*/"ANGLE WITH UNDERBAR"/* 29A4 */, /*10661*/"REVERSED ANGLE WITH UNDERBAR"/* 29A5 */,/*10662*/"OBLIQUE ANGLE OPENING UP"/* 29A6 */, /*10663*/"OBLIQUE ANGLE OPENING DOWN"/* 29A7 */, /*10664*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT"/* 29A8 */, /*10665*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT"/* 29A9 */, /*10666*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT"/* 29AA */, /*10667*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT"/* 29AB */, /*10668*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP"/* 29AC */, /*10669*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP"/* 29AD */, /*10670*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN"/* 29AE */, /*10671*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN"/* 29AF */, /*10672*/"REVERSED EMPTY SET"/* 29B0 */,/*10673*/"EMPTY SET WITH OVERBAR"/* 29B1 */, /*10674*/"EMPTY SET WITH SMALL CIRCLE ABOVE"/* 29B2 */,/*10675*/"EMPTY SET WITH RIGHT ARROW ABOVE"/* 29B3 */, /*10676*/"EMPTY SET WITH LEFT ARROW ABOVE"/* 29B4 */,/*10677*/"CIRCLE WITH HORIZONTAL BAR"/* 29B5 */, /*10678*/"CIRCLED VERTICAL BAR"/* 29B6 */,/*10679*/"CIRCLED PARALLEL"/* 29B7 */, /*10680*/"CIRCLED REVERSE SOLIDUS"/* 29B8 */,/*10681*/"CIRCLED PERPENDICULAR"/* 29B9 */, /*10682*/"CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR"/* 29BA */, /*10683*/"CIRCLE WITH SUPERIMPOSED X"/* 29BB */,/*10684*/"CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN"/* 29BC */, /*10685*/"UP ARROW THROUGH CIRCLE"/* 29BD */,/*10686*/"CIRCLED WHITE BULLET"/* 29BE */, /*10687*/"CIRCLED BULLET"/* 29BF */,/*10688*/"CIRCLED LESS-THAN"/* 29C0 */,/*10689*/"CIRCLED GREATER-THAN"/* 29C1 */, /*10690*/"CIRCLE WITH SMALL CIRCLE TO THE RIGHT"/* 29C2 */, /*10691*/"CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT"/* 29C3 */,/*10692*/"SQUARED RISING DIAGONAL SLASH"/* 29C4 */, /*10693*/"SQUARED FALLING DIAGONAL SLASH"/* 29C5 */,/*10694*/"SQUARED ASTERISK"/* 29C6 */, /*10695*/"SQUARED SMALL CIRCLE"/* 29C7 */,/*10696*/"SQUARED SQUARE"/* 29C8 */,/*10697*/"TWO JOINED SQUARES"/* 29C9 */, /*10698*/"TRIANGLE WITH DOT ABOVE"/* 29CA */,/*10699*/"TRIANGLE WITH UNDERBAR"/* 29CB */, /*10700*/"S IN TRIANGLE"/* 29CC */,/*10701*/"TRIANGLE WITH SERIFS AT BOTTOM"/* 29CD */, /*10702*/"RIGHT TRIANGLE ABOVE LEFT TRIANGLE"/* 29CE */,/*10703*/"LEFT TRIANGLE BESIDE VERTICAL BAR"/* 29CF */, /*10704*/"VERTICAL BAR BESIDE RIGHT TRIANGLE"/* 29D0 */,/*10705*/"BOWTIE WITH LEFT HALF BLACK"/* 29D1 */, /*10706*/"BOWTIE WITH RIGHT HALF BLACK"/* 29D2 */,/*10707*/"BLACK BOWTIE"/* 29D3 */, /*10708*/"TIMES WITH LEFT HALF BLACK"/* 29D4 */,/*10709*/"TIMES WITH RIGHT HALF BLACK"/* 29D5 */, /*10710*/"WHITE HOURGLASS"/* 29D6 */,/*10711*/"BLACK HOURGLASS"/* 29D7 */,/*10712*/"LEFT WIGGLY FENCE"/* 29D8 */, /*10713*/"RIGHT WIGGLY FENCE"/* 29D9 */,/*10714*/"LEFT DOUBLE WIGGLY FENCE"/* 29DA */, /*10715*/"RIGHT DOUBLE WIGGLY FENCE"/* 29DB */,/*10716*/"INCOMPLETE INFINITY"/* 29DC */, /*10717*/"TIE OVER INFINITY"/* 29DD */,/*10718*/"INFINITY NEGATED WITH VERTICAL BAR"/* 29DE */, /*10719*/"DOUBLE-ENDED MULTIMAP"/* 29DF */,/*10720*/"SQUARE WITH CONTOURED OUTLINE"/* 29E0 */, /*10721*/"INCREASES AS"/* 29E1 */,/*10722*/"SHUFFLE PRODUCT"/* 29E2 */, /*10723*/"EQUALS SIGN AND SLANTED PARALLEL"/* 29E3 */, /*10724*/"EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE"/* 29E4 */, /*10725*/"IDENTICAL TO AND SLANTED PARALLEL"/* 29E5 */,/*10726*/"GLEICH STARK"/* 29E6 */, /*10727*/"THERMODYNAMIC"/* 29E7 */,/*10728*/"DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK"/* 29E8 */, /*10729*/"DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK"/* 29E9 */,/*10730*/"BLACK DIAMOND WITH DOWN ARROW"/* 29EA */, /*10731*/"BLACK LOZENGE"/* 29EB */,/*10732*/"WHITE CIRCLE WITH DOWN ARROW"/* 29EC */, /*10733*/"BLACK CIRCLE WITH DOWN ARROW"/* 29ED */,/*10734*/"ERROR-BARRED WHITE SQUARE"/* 29EE */, /*10735*/"ERROR-BARRED BLACK SQUARE"/* 29EF */,/*10736*/"ERROR-BARRED WHITE DIAMOND"/* 29F0 */, /*10737*/"ERROR-BARRED BLACK DIAMOND"/* 29F1 */,/*10738*/"ERROR-BARRED WHITE CIRCLE"/* 29F2 */, /*10739*/"ERROR-BARRED BLACK CIRCLE"/* 29F3 */,/*10740*/"RULE-DELAYED"/* 29F4 */, /*10741*/"REVERSE SOLIDUS OPERATOR"/* 29F5 */,/*10742*/"SOLIDUS WITH OVERBAR"/* 29F6 */, /*10743*/"REVERSE SOLIDUS WITH HORIZONTAL STROKE"/* 29F7 */,/*10744*/"BIG SOLIDUS"/* 29F8 */, /*10745*/"BIG REVERSE SOLIDUS"/* 29F9 */,/*10746*/"DOUBLE PLUS"/* 29FA */,/*10747*/"TRIPLE PLUS"/* 29FB */, /*10748*/"LEFT-POINTING CURVED ANGLE BRACKET"/* 29FC */,/*10749*/"RIGHT-POINTING CURVED ANGLE BRACKET"/* 29FD */, /*10750*/"TINY"/* 29FE */,/*10751*/"MINY"/* 29FF */,/*10752*/"N-ARY CIRCLED DOT OPERATOR"/* 2A00 */, /*10753*/"N-ARY CIRCLED PLUS OPERATOR"/* 2A01 */,/*10754*/"N-ARY CIRCLED TIMES OPERATOR"/* 2A02 */, /*10755*/"N-ARY UNION OPERATOR WITH DOT"/* 2A03 */,/*10756*/"N-ARY UNION OPERATOR WITH PLUS"/* 2A04 */, /*10757*/"N-ARY SQUARE INTERSECTION OPERATOR"/* 2A05 */,/*10758*/"N-ARY SQUARE UNION OPERATOR"/* 2A06 */, /*10759*/"TWO LOGICAL AND OPERATOR"/* 2A07 */,/*10760*/"TWO LOGICAL OR OPERATOR"/* 2A08 */, /*10761*/"N-ARY TIMES OPERATOR"/* 2A09 */,/*10762*/"MODULO TWO SUM"/* 2A0A */, /*10763*/"SUMMATION WITH INTEGRAL"/* 2A0B */,/*10764*/"QUADRUPLE INTEGRAL OPERATOR"/* 2A0C */, /*10765*/"FINITE PART INTEGRAL"/* 2A0D */,/*10766*/"INTEGRAL WITH DOUBLE STROKE"/* 2A0E */, /*10767*/"INTEGRAL AVERAGE WITH SLASH"/* 2A0F */,/*10768*/"CIRCULATION FUNCTION"/* 2A10 */, /*10769*/"ANTICLOCKWISE INTEGRATION"/* 2A11 */,/*10770*/"LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE"/* 2A12 */, /*10771*/"LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE"/* 2A13 */, /*10772*/"LINE INTEGRATION NOT INCLUDING THE POLE"/* 2A14 */,/*10773*/"INTEGRAL AROUND A POINT OPERATOR"/* 2A15 */, /*10774*/"QUATERNION INTEGRAL OPERATOR"/* 2A16 */,/*10775*/"INTEGRAL WITH LEFTWARDS ARROW WITH HOOK"/* 2A17 */, /*10776*/"INTEGRAL WITH TIMES SIGN"/* 2A18 */,/*10777*/"INTEGRAL WITH INTERSECTION"/* 2A19 */, /*10778*/"INTEGRAL WITH UNION"/* 2A1A */,/*10779*/"INTEGRAL WITH OVERBAR"/* 2A1B */, /*10780*/"INTEGRAL WITH UNDERBAR"/* 2A1C */,/*10781*/"JOIN"/* 2A1D */,/*10782*/"LARGE LEFT TRIANGLE OPERATOR"/* 2A1E */, /*10783*/"Z NOTATION SCHEMA COMPOSITION"/* 2A1F */,/*10784*/"Z NOTATION SCHEMA PIPING"/* 2A20 */, /*10785*/"Z NOTATION SCHEMA PROJECTION"/* 2A21 */,/*10786*/"PLUS SIGN WITH SMALL CIRCLE ABOVE"/* 2A22 */, /*10787*/"PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE"/* 2A23 */,/*10788*/"PLUS SIGN WITH TILDE ABOVE"/* 2A24 */, /*10789*/"PLUS SIGN WITH DOT BELOW"/* 2A25 */,/*10790*/"PLUS SIGN WITH TILDE BELOW"/* 2A26 */, /*10791*/"PLUS SIGN WITH SUBSCRIPT TWO"/* 2A27 */,/*10792*/"PLUS SIGN WITH BLACK TRIANGLE"/* 2A28 */, /*10793*/"MINUS SIGN WITH COMMA ABOVE"/* 2A29 */,/*10794*/"MINUS SIGN WITH DOT BELOW"/* 2A2A */, /*10795*/"MINUS SIGN WITH FALLING DOTS"/* 2A2B */,/*10796*/"MINUS SIGN WITH RISING DOTS"/* 2A2C */, /*10797*/"PLUS SIGN IN LEFT HALF CIRCLE"/* 2A2D */,/*10798*/"PLUS SIGN IN RIGHT HALF CIRCLE"/* 2A2E */, /*10799*/"VECTOR OR CROSS PRODUCT"/* 2A2F */,/*10800*/"MULTIPLICATION SIGN WITH DOT ABOVE"/* 2A30 */, /*10801*/"MULTIPLICATION SIGN WITH UNDERBAR"/* 2A31 */,/*10802*/"SEMIDIRECT PRODUCT WITH BOTTOM CLOSED"/* 2A32 */, /*10803*/"SMASH PRODUCT"/* 2A33 */,/*10804*/"MULTIPLICATION SIGN IN LEFT HALF CIRCLE"/* 2A34 */, /*10805*/"MULTIPLICATION SIGN IN RIGHT HALF CIRCLE"/* 2A35 */, /*10806*/"CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT"/* 2A36 */, /*10807*/"MULTIPLICATION SIGN IN DOUBLE CIRCLE"/* 2A37 */,/*10808*/"CIRCLED DIVISION SIGN"/* 2A38 */, /*10809*/"PLUS SIGN IN TRIANGLE"/* 2A39 */,/*10810*/"MINUS SIGN IN TRIANGLE"/* 2A3A */, /*10811*/"MULTIPLICATION SIGN IN TRIANGLE"/* 2A3B */,/*10812*/"INTERIOR PRODUCT"/* 2A3C */, /*10813*/"RIGHTHAND INTERIOR PRODUCT"/* 2A3D */,/*10814*/"Z NOTATION RELATIONAL COMPOSITION"/* 2A3E */, /*10815*/"AMALGAMATION OR COPRODUCT"/* 2A3F */,/*10816*/"INTERSECTION WITH DOT"/* 2A40 */, /*10817*/"UNION WITH MINUS SIGN"/* 2A41 */,/*10818*/"UNION WITH OVERBAR"/* 2A42 */, /*10819*/"INTERSECTION WITH OVERBAR"/* 2A43 */,/*10820*/"INTERSECTION WITH LOGICAL AND"/* 2A44 */, /*10821*/"UNION WITH LOGICAL OR"/* 2A45 */,/*10822*/"UNION ABOVE INTERSECTION"/* 2A46 */, /*10823*/"INTERSECTION ABOVE UNION"/* 2A47 */,/*10824*/"UNION ABOVE BAR ABOVE INTERSECTION"/* 2A48 */, /*10825*/"INTERSECTION ABOVE BAR ABOVE UNION"/* 2A49 */,/*10826*/"UNION BESIDE AND JOINED WITH UNION"/* 2A4A */, /*10827*/"INTERSECTION BESIDE AND JOINED WITH INTERSECTION"/* 2A4B */,/*10828*/"CLOSED UNION WITH SERIFS"/* 2A4C */, /*10829*/"CLOSED INTERSECTION WITH SERIFS"/* 2A4D */,/*10830*/"DOUBLE SQUARE INTERSECTION"/* 2A4E */, /*10831*/"DOUBLE SQUARE UNION"/* 2A4F */,/*10832*/"CLOSED UNION WITH SERIFS AND SMASH PRODUCT"/* 2A50 */, /*10833*/"LOGICAL AND WITH DOT ABOVE"/* 2A51 */,/*10834*/"LOGICAL OR WITH DOT ABOVE"/* 2A52 */, /*10835*/"DOUBLE LOGICAL AND"/* 2A53 */,/*10836*/"DOUBLE LOGICAL OR"/* 2A54 */, /*10837*/"TWO INTERSECTING LOGICAL AND"/* 2A55 */,/*10838*/"TWO INTERSECTING LOGICAL OR"/* 2A56 */, /*10839*/"SLOPING LARGE OR"/* 2A57 */,/*10840*/"SLOPING LARGE AND"/* 2A58 */, /*10841*/"LOGICAL OR OVERLAPPING LOGICAL AND"/* 2A59 */,/*10842*/"LOGICAL AND WITH MIDDLE STEM"/* 2A5A */, /*10843*/"LOGICAL OR WITH MIDDLE STEM"/* 2A5B */,/*10844*/"LOGICAL AND WITH HORIZONTAL DASH"/* 2A5C */, /*10845*/"LOGICAL OR WITH HORIZONTAL DASH"/* 2A5D */,/*10846*/"LOGICAL AND WITH DOUBLE OVERBAR"/* 2A5E */, /*10847*/"LOGICAL AND WITH UNDERBAR"/* 2A5F */,/*10848*/"LOGICAL AND WITH DOUBLE UNDERBAR"/* 2A60 */, /*10849*/"SMALL VEE WITH UNDERBAR"/* 2A61 */,/*10850*/"LOGICAL OR WITH DOUBLE OVERBAR"/* 2A62 */, /*10851*/"LOGICAL OR WITH DOUBLE UNDERBAR"/* 2A63 */,/*10852*/"Z NOTATION DOMAIN ANTIRESTRICTION"/* 2A64 */, /*10853*/"Z NOTATION RANGE ANTIRESTRICTION"/* 2A65 */,/*10854*/"EQUALS SIGN WITH DOT BELOW"/* 2A66 */, /*10855*/"IDENTICAL WITH DOT ABOVE"/* 2A67 */,/*10856*/"TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE"/* 2A68 */, /*10857*/"TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE"/* 2A69 */, /*10858*/"TILDE OPERATOR WITH DOT ABOVE"/* 2A6A */,/*10859*/"TILDE OPERATOR WITH RISING DOTS"/* 2A6B */, /*10860*/"SIMILAR MINUS SIMILAR"/* 2A6C */,/*10861*/"CONGRUENT WITH DOT ABOVE"/* 2A6D */, /*10862*/"EQUALS WITH ASTERISK"/* 2A6E */,/*10863*/"ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT"/* 2A6F */, /*10864*/"APPROXIMATELY EQUAL OR EQUAL TO"/* 2A70 */,/*10865*/"EQUALS SIGN ABOVE PLUS SIGN"/* 2A71 */, /*10866*/"PLUS SIGN ABOVE EQUALS SIGN"/* 2A72 */,/*10867*/"EQUALS SIGN ABOVE TILDE OPERATOR"/* 2A73 */, /*10868*/"DOUBLE COLON EQUAL"/* 2A74 */,/*10869*/"TWO CONSECUTIVE EQUALS SIGNS"/* 2A75 */, /*10870*/"THREE CONSECUTIVE EQUALS SIGNS"/* 2A76 */, /*10871*/"EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW"/* 2A77 */, /*10872*/"EQUIVALENT WITH FOUR DOTS ABOVE"/* 2A78 */,/*10873*/"LESS-THAN WITH CIRCLE INSIDE"/* 2A79 */, /*10874*/"GREATER-THAN WITH CIRCLE INSIDE"/* 2A7A */,/*10875*/"LESS-THAN WITH QUESTION MARK ABOVE"/* 2A7B */, /*10876*/"GREATER-THAN WITH QUESTION MARK ABOVE"/* 2A7C */,/*10877*/"LESS-THAN OR SLANTED EQUAL TO"/* 2A7D */, /*10878*/"GREATER-THAN OR SLANTED EQUAL TO"/* 2A7E */,/*10879*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE"/* 2A7F */, /*10880*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE"/* 2A80 */, /*10881*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE"/* 2A81 */, /*10882*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE"/* 2A82 */, /*10883*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT"/* 2A83 */, /*10884*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT"/* 2A84 */,/*10885*/"LESS-THAN OR APPROXIMATE"/* 2A85 */, /*10886*/"GREATER-THAN OR APPROXIMATE"/* 2A86 */,/*10887*/"LESS-THAN AND SINGLE-LINE NOT EQUAL TO"/* 2A87 */, /*10888*/"GREATER-THAN AND SINGLE-LINE NOT EQUAL TO"/* 2A88 */,/*10889*/"LESS-THAN AND NOT APPROXIMATE"/* 2A89 */, /*10890*/"GREATER-THAN AND NOT APPROXIMATE"/* 2A8A */, /*10891*/"LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN"/* 2A8B */, /*10892*/"GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN"/* 2A8C */, /*10893*/"LESS-THAN ABOVE SIMILAR OR EQUAL"/* 2A8D */,/*10894*/"GREATER-THAN ABOVE SIMILAR OR EQUAL"/* 2A8E */, /*10895*/"LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN"/* 2A8F */, /*10896*/"GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN"/* 2A90 */, /*10897*/"LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL"/* 2A91 */, /*10898*/"GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL"/* 2A92 */, /*10899*/"LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL"/* 2A93 */, /*10900*/"GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL"/* 2A94 */, /*10901*/"SLANTED EQUAL TO OR LESS-THAN"/* 2A95 */,/*10902*/"SLANTED EQUAL TO OR GREATER-THAN"/* 2A96 */, /*10903*/"SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE"/* 2A97 */, /*10904*/"SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE"/* 2A98 */, /*10905*/"DOUBLE-LINE EQUAL TO OR LESS-THAN"/* 2A99 */,/*10906*/"DOUBLE-LINE EQUAL TO OR GREATER-THAN"/* 2A9A */, /*10907*/"DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN"/* 2A9B */, /*10908*/"DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN"/* 2A9C */,/*10909*/"SIMILAR OR LESS-THAN"/* 2A9D */, /*10910*/"SIMILAR OR GREATER-THAN"/* 2A9E */,/*10911*/"SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN"/* 2A9F */, /*10912*/"SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN"/* 2AA0 */,/*10913*/"DOUBLE NESTED LESS-THAN"/* 2AA1 */, /*10914*/"DOUBLE NESTED GREATER-THAN"/* 2AA2 */,/*10915*/"DOUBLE NESTED LESS-THAN WITH UNDERBAR"/* 2AA3 */, /*10916*/"GREATER-THAN OVERLAPPING LESS-THAN"/* 2AA4 */,/*10917*/"GREATER-THAN BESIDE LESS-THAN"/* 2AA5 */, /*10918*/"LESS-THAN CLOSED BY CURVE"/* 2AA6 */,/*10919*/"GREATER-THAN CLOSED BY CURVE"/* 2AA7 */, /*10920*/"LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL"/* 2AA8 */, /*10921*/"GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL"/* 2AA9 */,/*10922*/"SMALLER THAN"/* 2AAA */, /*10923*/"LARGER THAN"/* 2AAB */,/*10924*/"SMALLER THAN OR EQUAL TO"/* 2AAC */, /*10925*/"LARGER THAN OR EQUAL TO"/* 2AAD */,/*10926*/"EQUALS SIGN WITH BUMPY ABOVE"/* 2AAE */, /*10927*/"PRECEDES ABOVE SINGLE-LINE EQUALS SIGN"/* 2AAF */,/*10928*/"SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN"/* 2AB0 */, /*10929*/"PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO"/* 2AB1 */, /*10930*/"SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO"/* 2AB2 */,/*10931*/"PRECEDES ABOVE EQUALS SIGN"/* 2AB3 */, /*10932*/"SUCCEEDS ABOVE EQUALS SIGN"/* 2AB4 */,/*10933*/"PRECEDES ABOVE NOT EQUAL TO"/* 2AB5 */, /*10934*/"SUCCEEDS ABOVE NOT EQUAL TO"/* 2AB6 */,/*10935*/"PRECEDES ABOVE ALMOST EQUAL TO"/* 2AB7 */, /*10936*/"SUCCEEDS ABOVE ALMOST EQUAL TO"/* 2AB8 */,/*10937*/"PRECEDES ABOVE NOT ALMOST EQUAL TO"/* 2AB9 */, /*10938*/"SUCCEEDS ABOVE NOT ALMOST EQUAL TO"/* 2ABA */,/*10939*/"DOUBLE PRECEDES"/* 2ABB */, /*10940*/"DOUBLE SUCCEEDS"/* 2ABC */,/*10941*/"SUBSET WITH DOT"/* 2ABD */,/*10942*/"SUPERSET WITH DOT"/* 2ABE */, /*10943*/"SUBSET WITH PLUS SIGN BELOW"/* 2ABF */,/*10944*/"SUPERSET WITH PLUS SIGN BELOW"/* 2AC0 */, /*10945*/"SUBSET WITH MULTIPLICATION SIGN BELOW"/* 2AC1 */,/*10946*/"SUPERSET WITH MULTIPLICATION SIGN BELOW"/* 2AC2 */, /*10947*/"SUBSET OF OR EQUAL TO WITH DOT ABOVE"/* 2AC3 */,/*10948*/"SUPERSET OF OR EQUAL TO WITH DOT ABOVE"/* 2AC4 */, /*10949*/"SUBSET OF ABOVE EQUALS SIGN"/* 2AC5 */,/*10950*/"SUPERSET OF ABOVE EQUALS SIGN"/* 2AC6 */, /*10951*/"SUBSET OF ABOVE TILDE OPERATOR"/* 2AC7 */,/*10952*/"SUPERSET OF ABOVE TILDE OPERATOR"/* 2AC8 */, /*10953*/"SUBSET OF ABOVE ALMOST EQUAL TO"/* 2AC9 */,/*10954*/"SUPERSET OF ABOVE ALMOST EQUAL TO"/* 2ACA */, /*10955*/"SUBSET OF ABOVE NOT EQUAL TO"/* 2ACB */,/*10956*/"SUPERSET OF ABOVE NOT EQUAL TO"/* 2ACC */, /*10957*/"SQUARE LEFT OPEN BOX OPERATOR"/* 2ACD */,/*10958*/"SQUARE RIGHT OPEN BOX OPERATOR"/* 2ACE */, /*10959*/"CLOSED SUBSET"/* 2ACF */,/*10960*/"CLOSED SUPERSET"/* 2AD0 */,/*10961*/"CLOSED SUBSET OR EQUAL TO"/* 2AD1 */, /*10962*/"CLOSED SUPERSET OR EQUAL TO"/* 2AD2 */,/*10963*/"SUBSET ABOVE SUPERSET"/* 2AD3 */, /*10964*/"SUPERSET ABOVE SUBSET"/* 2AD4 */,/*10965*/"SUBSET ABOVE SUBSET"/* 2AD5 */, /*10966*/"SUPERSET ABOVE SUPERSET"/* 2AD6 */,/*10967*/"SUPERSET BESIDE SUBSET"/* 2AD7 */, /*10968*/"SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET"/* 2AD8 */,/*10969*/"ELEMENT OF OPENING DOWNWARDS"/* 2AD9 */, /*10970*/"PITCHFORK WITH TEE TOP"/* 2ADA */,/*10971*/"TRANSVERSAL INTERSECTION"/* 2ADB */,/*10972*/"FORKING"/* 2ADC */, /*10973*/"NONFORKING"/* 2ADD */,/*10974*/"SHORT LEFT TACK"/* 2ADE */,/*10975*/"SHORT DOWN TACK"/* 2ADF */, /*10976*/"SHORT UP TACK"/* 2AE0 */,/*10977*/"PERPENDICULAR WITH S"/* 2AE1 */, /*10978*/"VERTICAL BAR TRIPLE RIGHT TURNSTILE"/* 2AE2 */,/*10979*/"DOUBLE VERTICAL BAR LEFT TURNSTILE"/* 2AE3 */, /*10980*/"VERTICAL BAR DOUBLE LEFT TURNSTILE"/* 2AE4 */,/*10981*/"DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE"/* 2AE5 */, /*10982*/"LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL"/* 2AE6 */,/*10983*/"SHORT DOWN TACK WITH OVERBAR"/* 2AE7 */, /*10984*/"SHORT UP TACK WITH UNDERBAR"/* 2AE8 */,/*10985*/"SHORT UP TACK ABOVE SHORT DOWN TACK"/* 2AE9 */, /*10986*/"DOUBLE DOWN TACK"/* 2AEA */,/*10987*/"DOUBLE UP TACK"/* 2AEB */,/*10988*/"DOUBLE STROKE NOT SIGN"/* 2AEC */, /*10989*/"REVERSED DOUBLE STROKE NOT SIGN"/* 2AED */,/*10990*/"DOES NOT DIVIDE WITH REVERSED NEGATION SLASH"/* 2AEE */, /*10991*/"VERTICAL LINE WITH CIRCLE ABOVE"/* 2AEF */,/*10992*/"VERTICAL LINE WITH CIRCLE BELOW"/* 2AF0 */, /*10993*/"DOWN TACK WITH CIRCLE BELOW"/* 2AF1 */,/*10994*/"PARALLEL WITH HORIZONTAL STROKE"/* 2AF2 */, /*10995*/"PARALLEL WITH TILDE OPERATOR"/* 2AF3 */,/*10996*/"TRIPLE VERTICAL BAR BINARY RELATION"/* 2AF4 */, /*10997*/"TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE"/* 2AF5 */,/*10998*/"TRIPLE COLON OPERATOR"/* 2AF6 */, /*10999*/"TRIPLE NESTED LESS-THAN"/* 2AF7 */,/*11000*/"TRIPLE NESTED GREATER-THAN"/* 2AF8 */, /*11001*/"DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO"/* 2AF9 */, /*11002*/"DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO"/* 2AFA */,/*11003*/"TRIPLE SOLIDUS BINARY RELATION"/* 2AFB */, /*11004*/"LARGE TRIPLE VERTICAL BAR OPERATOR"/* 2AFC */,/*11005*/"DOUBLE SOLIDUS OPERATOR"/* 2AFD */, /*11006*/"WHITE VERTICAL BAR"/* 2AFE */,/*11007*/"N-ARY WHITE VERTICAL BAR"/* 2AFF */, /*11008*/"NORTH EAST WHITE ARROW"/* 2B00 */,/*11009*/"NORTH WEST WHITE ARROW"/* 2B01 */, /*11010*/"SOUTH EAST WHITE ARROW"/* 2B02 */,/*11011*/"SOUTH WEST WHITE ARROW"/* 2B03 */, /*11012*/"LEFT RIGHT WHITE ARROW"/* 2B04 */,/*11013*/"LEFTWARDS BLACK ARROW"/* 2B05 */, /*11014*/"UPWARDS BLACK ARROW"/* 2B06 */,/*11015*/"DOWNWARDS BLACK ARROW"/* 2B07 */, /*11016*/"NORTH EAST BLACK ARROW"/* 2B08 */,/*11017*/"NORTH WEST BLACK ARROW"/* 2B09 */, /*11018*/"SOUTH EAST BLACK ARROW"/* 2B0A */,/*11019*/"SOUTH WEST BLACK ARROW"/* 2B0B */, /*11020*/"LEFT RIGHT BLACK ARROW"/* 2B0C */,/*11021*/"UP DOWN BLACK ARROW"/* 2B0D */, /*11022*/"RIGHTWARDS ARROW WITH TIP DOWNWARDS"/* 2B0E */,/*11023*/"RIGHTWARDS ARROW WITH TIP UPWARDS"/* 2B0F */, /*11024*/"LEFTWARDS ARROW WITH TIP DOWNWARDS"/* 2B10 */,/*11025*/"LEFTWARDS ARROW WITH TIP UPWARDS"/* 2B11 */, /*11026*/"SQUARE WITH TOP HALF BLACK"/* 2B12 */,/*11027*/"SQUARE WITH BOTTOM HALF BLACK"/* 2B13 */, /*11028*/"SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK"/* 2B14 */, /*11029*/"SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK"/* 2B15 */,/*11030*/"DIAMOND WITH LEFT HALF BLACK"/* 2B16 */, /*11031*/"DIAMOND WITH RIGHT HALF BLACK"/* 2B17 */,/*11032*/"DIAMOND WITH TOP HALF BLACK"/* 2B18 */, /*11033*/"DIAMOND WITH BOTTOM HALF BLACK"/* 2B19 */,/*11034*/"DOTTED SQUARE"/* 2B1A */, /*11035*/"BLACK LARGE SQUARE"/* 2B1B */,/*11036*/"WHITE LARGE SQUARE"/* 2B1C */, /*11037*/"BLACK VERY SMALL SQUARE"/* 2B1D */,/*11038*/"WHITE VERY SMALL SQUARE"/* 2B1E */, /*11039*/"BLACK PENTAGON"/* 2B1F */,/*11040*/"WHITE PENTAGON"/* 2B20 */,/*11041*/"WHITE HEXAGON"/* 2B21 */, /*11042*/"BLACK HEXAGON"/* 2B22 */,/*11043*/"HORIZONTAL BLACK HEXAGON"/* 2B23 */,/*11044*/"BLACK LARGE CIRCLE"/* 2B24 */, /*11045*/"BLACK MEDIUM DIAMOND"/* 2B25 */,/*11046*/"WHITE MEDIUM DIAMOND"/* 2B26 */, /*11047*/"BLACK MEDIUM LOZENGE"/* 2B27 */,/*11048*/"WHITE MEDIUM LOZENGE"/* 2B28 */, /*11049*/"BLACK SMALL DIAMOND"/* 2B29 */,/*11050*/"BLACK SMALL LOZENGE"/* 2B2A */, /*11051*/"WHITE SMALL LOZENGE"/* 2B2B */,/*11052*/"BLACK HORIZONTAL ELLIPSE"/* 2B2C */, /*11053*/"WHITE HORIZONTAL ELLIPSE"/* 2B2D */,/*11054*/"BLACK VERTICAL ELLIPSE"/* 2B2E */, /*11055*/"WHITE VERTICAL ELLIPSE"/* 2B2F */,/*11056*/"LEFT ARROW WITH SMALL CIRCLE"/* 2B30 */, /*11057*/"THREE LEFTWARDS ARROWS"/* 2B31 */,/*11058*/"LEFT ARROW WITH CIRCLED PLUS"/* 2B32 */, /*11059*/"LONG LEFTWARDS SQUIGGLE ARROW"/* 2B33 */,/*11060*/"LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE"/* 2B34 */, /*11061*/"LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE"/* 2B35 */, /*11062*/"LEFTWARDS TWO-HEADED ARROW FROM BAR"/* 2B36 */,/*11063*/"LEFTWARDS TWO-HEADED TRIPLE DASH ARROW"/* 2B37 */, /*11064*/"LEFTWARDS ARROW WITH DOTTED STEM"/* 2B38 */, /*11065*/"LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE"/* 2B39 */, /*11066*/"LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2B3A */, /*11067*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL"/* 2B3B */, /*11068*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE"/* 2B3C */, /*11069*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2B3D */, /*11070*/"LEFTWARDS ARROW THROUGH X"/* 2B3E */,/*11071*/"WAVE ARROW POINTING DIRECTLY LEFT"/* 2B3F */, /*11072*/"EQUALS SIGN ABOVE LEFTWARDS ARROW"/* 2B40 */,/*11073*/"REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW"/* 2B41 */, /*11074*/"LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO"/* 2B42 */, /*11075*/"RIGHTWARDS ARROW THROUGH GREATER-THAN"/* 2B43 */,/*11076*/"RIGHTWARDS ARROW THROUGH SUPERSET"/* 2B44 */, /*11077*/"LEFTWARDS QUADRUPLE ARROW"/* 2B45 */,/*11078*/"RIGHTWARDS QUADRUPLE ARROW"/* 2B46 */, /*11079*/"REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW"/* 2B47 */, /*11080*/"RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO"/* 2B48 */, /*11081*/"TILDE OPERATOR ABOVE LEFTWARDS ARROW"/* 2B49 */,/*11082*/"LEFTWARDS ARROW ABOVE ALMOST EQUAL TO"/* 2B4A */, /*11083*/"LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR"/* 2B4B */, /*11084*/"RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR"/* 2B4C */, /*11085*/"DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW"/* 2B4D */,/*11086*/"SHORT SLANTED NORTH ARROW"/* 2B4E */, /*11087*/"SHORT BACKSLANTED SOUTH ARROW"/* 2B4F */,/*11088*/"WHITE MEDIUM STAR"/* 2B50 */, /*11089*/"BLACK SMALL STAR"/* 2B51 */,/*11090*/"WHITE SMALL STAR"/* 2B52 */, /*11091*/"BLACK RIGHT-POINTING PENTAGON"/* 2B53 */,/*11092*/"WHITE RIGHT-POINTING PENTAGON"/* 2B54 */, /*11093*/"HEAVY LARGE CIRCLE"/* 2B55 */,/*11094*/"HEAVY OVAL WITH OVAL INSIDE"/* 2B56 */, /*11095*/"HEAVY CIRCLE WITH CIRCLE INSIDE"/* 2B57 */,/*11096*/"HEAVY CIRCLE"/* 2B58 */, /*11097*/"HEAVY CIRCLED SALTIRE"/* 2B59 */,/*11098*/"SLANTED NORTH ARROW WITH HOOKED HEAD"/* 2B5A */, /*11099*/"BACKSLANTED SOUTH ARROW WITH HOOKED TAIL"/* 2B5B */, /*11100*/"SLANTED NORTH ARROW WITH HORIZONTAL TAIL"/* 2B5C */, /*11101*/"BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL"/* 2B5D */, /*11102*/"BENT ARROW POINTING DOWNWARDS THEN NORTH EAST"/* 2B5E */, /*11103*/"SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST"/* 2B5F */, /*11104*/"LEFTWARDS TRIANGLE-HEADED ARROW"/* 2B60 */,/*11105*/"UPWARDS TRIANGLE-HEADED ARROW"/* 2B61 */, /*11106*/"RIGHTWARDS TRIANGLE-HEADED ARROW"/* 2B62 */,/*11107*/"DOWNWARDS TRIANGLE-HEADED ARROW"/* 2B63 */, /*11108*/"LEFT RIGHT TRIANGLE-HEADED ARROW"/* 2B64 */,/*11109*/"UP DOWN TRIANGLE-HEADED ARROW"/* 2B65 */, /*11110*/"NORTH WEST TRIANGLE-HEADED ARROW"/* 2B66 */,/*11111*/"NORTH EAST TRIANGLE-HEADED ARROW"/* 2B67 */, /*11112*/"SOUTH EAST TRIANGLE-HEADED ARROW"/* 2B68 */,/*11113*/"SOUTH WEST TRIANGLE-HEADED ARROW"/* 2B69 */, /*11114*/"LEFTWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6A */,/*11115*/"UPWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6B */, /*11116*/"RIGHTWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6C */,/*11117*/"DOWNWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6D */, /*11118*/"CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW"/* 2B6E */, /*11119*/"ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW"/* 2B6F */, /*11120*/"LEFTWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B70 */,/*11121*/"UPWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B71 */, /*11122*/"RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B72 */,/*11123*/"DOWNWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B73 */, NULL,NULL,/*11126*/"NORTH WEST TRIANGLE-HEADED ARROW TO BAR"/* 2B76 */, /*11127*/"NORTH EAST TRIANGLE-HEADED ARROW TO BAR"/* 2B77 */, /*11128*/"SOUTH EAST TRIANGLE-HEADED ARROW TO BAR"/* 2B78 */, /*11129*/"SOUTH WEST TRIANGLE-HEADED ARROW TO BAR"/* 2B79 */, /*11130*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7A */, /*11131*/"UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7B */, /*11132*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7C */, /*11133*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7D */, /*11134*/"HORIZONTAL TAB KEY"/* 2B7E */,/*11135*/"VERTICAL TAB KEY"/* 2B7F */, /*11136*/"LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW"/* 2B80 */, /*11137*/"UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW"/* 2B81 */, /*11138*/"RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW"/* 2B82 */, /*11139*/"DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW"/* 2B83 */, /*11140*/"LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B84 */,/*11141*/"UPWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B85 */, /*11142*/"RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B86 */, /*11143*/"DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B87 */,/*11144*/"LEFTWARDS BLACK CIRCLED WHITE ARROW"/* 2B88 */, /*11145*/"UPWARDS BLACK CIRCLED WHITE ARROW"/* 2B89 */,/*11146*/"RIGHTWARDS BLACK CIRCLED WHITE ARROW"/* 2B8A */, /*11147*/"DOWNWARDS BLACK CIRCLED WHITE ARROW"/* 2B8B */, /*11148*/"ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW"/* 2B8C */, /*11149*/"ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW"/* 2B8D */, /*11150*/"ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW"/* 2B8E */, /*11151*/"ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW"/* 2B8F */,/*11152*/"RETURN LEFT"/* 2B90 */, /*11153*/"RETURN RIGHT"/* 2B91 */,/*11154*/"NEWLINE LEFT"/* 2B92 */,/*11155*/"NEWLINE RIGHT"/* 2B93 */, /*11156*/"FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE"/* 2B94 */,/*11157*/"RIGHTWARDS BLACK ARROW"/* 2B95 */,NULL,NULL, /*11160*/"THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD"/* 2B98 */, /*11161*/"THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD"/* 2B99 */, /*11162*/"THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD"/* 2B9A */, /*11163*/"THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD"/* 2B9B */, /*11164*/"BLACK LEFTWARDS EQUILATERAL ARROWHEAD"/* 2B9C */,/*11165*/"BLACK UPWARDS EQUILATERAL ARROWHEAD"/* 2B9D */, /*11166*/"BLACK RIGHTWARDS EQUILATERAL ARROWHEAD"/* 2B9E */,/*11167*/"BLACK DOWNWARDS EQUILATERAL ARROWHEAD"/* 2B9F */, /*11168*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS"/* 2BA0 */, /*11169*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS"/* 2BA1 */, /*11170*/"UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS"/* 2BA2 */, /*11171*/"UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS"/* 2BA3 */, /*11172*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS"/* 2BA4 */, /*11173*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS"/* 2BA5 */, /*11174*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS"/* 2BA6 */, /*11175*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS"/* 2BA7 */, /*11176*/"BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW"/* 2BA8 */, /*11177*/"BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW"/* 2BA9 */, /*11178*/"BLACK CURVED UPWARDS AND LEFTWARDS ARROW"/* 2BAA */, /*11179*/"BLACK CURVED UPWARDS AND RIGHTWARDS ARROW"/* 2BAB */, /*11180*/"BLACK CURVED LEFTWARDS AND UPWARDS ARROW"/* 2BAC */, /*11181*/"BLACK CURVED RIGHTWARDS AND UPWARDS ARROW"/* 2BAD */, /*11182*/"BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW"/* 2BAE */, /*11183*/"BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW"/* 2BAF */,/*11184*/"RIBBON ARROW DOWN LEFT"/* 2BB0 */, /*11185*/"RIBBON ARROW DOWN RIGHT"/* 2BB1 */,/*11186*/"RIBBON ARROW UP LEFT"/* 2BB2 */, /*11187*/"RIBBON ARROW UP RIGHT"/* 2BB3 */,/*11188*/"RIBBON ARROW LEFT UP"/* 2BB4 */, /*11189*/"RIBBON ARROW RIGHT UP"/* 2BB5 */,/*11190*/"RIBBON ARROW LEFT DOWN"/* 2BB6 */, /*11191*/"RIBBON ARROW RIGHT DOWN"/* 2BB7 */,/*11192*/"UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR"/* 2BB8 */, /*11193*/"UP ARROWHEAD IN A RECTANGLE BOX"/* 2BB9 */,NULL,NULL,NULL,/*11197*/"BALLOT BOX WITH LIGHT X"/* 2BBD */, /*11198*/"CIRCLED X"/* 2BBE */,/*11199*/"CIRCLED BOLD X"/* 2BBF */,/*11200*/"BLACK SQUARE CENTRED"/* 2BC0 */, /*11201*/"BLACK DIAMOND CENTRED"/* 2BC1 */,/*11202*/"TURNED BLACK PENTAGON"/* 2BC2 */, /*11203*/"HORIZONTAL BLACK OCTAGON"/* 2BC3 */,/*11204*/"BLACK OCTAGON"/* 2BC4 */, /*11205*/"BLACK MEDIUM UP-POINTING TRIANGLE CENTRED"/* 2BC5 */, /*11206*/"BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED"/* 2BC6 */, /*11207*/"BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED"/* 2BC7 */, /*11208*/"BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED"/* 2BC8 */,NULL,/*11210*/"TOP HALF BLACK CIRCLE"/* 2BCA */, /*11211*/"BOTTOM HALF BLACK CIRCLE"/* 2BCB */,/*11212*/"LIGHT FOUR POINTED BLACK CUSP"/* 2BCC */, /*11213*/"ROTATED LIGHT FOUR POINTED BLACK CUSP"/* 2BCD */,/*11214*/"WHITE FOUR POINTED CUSP"/* 2BCE */, /*11215*/"ROTATED WHITE FOUR POINTED CUSP"/* 2BCF */,/*11216*/"SQUARE POSITION INDICATOR"/* 2BD0 */, /*11217*/"UNCERTAINTY SIGN"/* 2BD1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11244*/"LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEC */, /*11245*/"UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BED */, /*11246*/"RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEE */, /*11247*/"DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*11264*/"GLAGOLITIC CAPITAL LETTER AZU"/* 2C00 */, /*11265*/"GLAGOLITIC CAPITAL LETTER BUKY"/* 2C01 */,/*11266*/"GLAGOLITIC CAPITAL LETTER VEDE"/* 2C02 */, /*11267*/"GLAGOLITIC CAPITAL LETTER GLAGOLI"/* 2C03 */,/*11268*/"GLAGOLITIC CAPITAL LETTER DOBRO"/* 2C04 */, /*11269*/"GLAGOLITIC CAPITAL LETTER YESTU"/* 2C05 */,/*11270*/"GLAGOLITIC CAPITAL LETTER ZHIVETE"/* 2C06 */, /*11271*/"GLAGOLITIC CAPITAL LETTER DZELO"/* 2C07 */,/*11272*/"GLAGOLITIC CAPITAL LETTER ZEMLJA"/* 2C08 */, /*11273*/"GLAGOLITIC CAPITAL LETTER IZHE"/* 2C09 */,/*11274*/"GLAGOLITIC CAPITAL LETTER INITIAL IZHE"/* 2C0A */, /*11275*/"GLAGOLITIC CAPITAL LETTER I"/* 2C0B */,/*11276*/"GLAGOLITIC CAPITAL LETTER DJERVI"/* 2C0C */, /*11277*/"GLAGOLITIC CAPITAL LETTER KAKO"/* 2C0D */,/*11278*/"GLAGOLITIC CAPITAL LETTER LJUDIJE"/* 2C0E */, /*11279*/"GLAGOLITIC CAPITAL LETTER MYSLITE"/* 2C0F */,/*11280*/"GLAGOLITIC CAPITAL LETTER NASHI"/* 2C10 */, /*11281*/"GLAGOLITIC CAPITAL LETTER ONU"/* 2C11 */,/*11282*/"GLAGOLITIC CAPITAL LETTER POKOJI"/* 2C12 */, /*11283*/"GLAGOLITIC CAPITAL LETTER RITSI"/* 2C13 */,/*11284*/"GLAGOLITIC CAPITAL LETTER SLOVO"/* 2C14 */, /*11285*/"GLAGOLITIC CAPITAL LETTER TVRIDO"/* 2C15 */,/*11286*/"GLAGOLITIC CAPITAL LETTER UKU"/* 2C16 */, /*11287*/"GLAGOLITIC CAPITAL LETTER FRITU"/* 2C17 */,/*11288*/"GLAGOLITIC CAPITAL LETTER HERU"/* 2C18 */, /*11289*/"GLAGOLITIC CAPITAL LETTER OTU"/* 2C19 */,/*11290*/"GLAGOLITIC CAPITAL LETTER PE"/* 2C1A */, /*11291*/"GLAGOLITIC CAPITAL LETTER SHTA"/* 2C1B */,/*11292*/"GLAGOLITIC CAPITAL LETTER TSI"/* 2C1C */, /*11293*/"GLAGOLITIC CAPITAL LETTER CHRIVI"/* 2C1D */,/*11294*/"GLAGOLITIC CAPITAL LETTER SHA"/* 2C1E */, /*11295*/"GLAGOLITIC CAPITAL LETTER YERU"/* 2C1F */,/*11296*/"GLAGOLITIC CAPITAL LETTER YERI"/* 2C20 */, /*11297*/"GLAGOLITIC CAPITAL LETTER YATI"/* 2C21 */,/*11298*/"GLAGOLITIC CAPITAL LETTER SPIDERY HA"/* 2C22 */, /*11299*/"GLAGOLITIC CAPITAL LETTER YU"/* 2C23 */,/*11300*/"GLAGOLITIC CAPITAL LETTER SMALL YUS"/* 2C24 */, /*11301*/"GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL"/* 2C25 */,/*11302*/"GLAGOLITIC CAPITAL LETTER YO"/* 2C26 */, /*11303*/"GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS"/* 2C27 */,/*11304*/"GLAGOLITIC CAPITAL LETTER BIG YUS"/* 2C28 */, /*11305*/"GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS"/* 2C29 */,/*11306*/"GLAGOLITIC CAPITAL LETTER FITA"/* 2C2A */, /*11307*/"GLAGOLITIC CAPITAL LETTER IZHITSA"/* 2C2B */,/*11308*/"GLAGOLITIC CAPITAL LETTER SHTAPIC"/* 2C2C */, /*11309*/"GLAGOLITIC CAPITAL LETTER TROKUTASTI A"/* 2C2D */, /*11310*/"GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE"/* 2C2E */,NULL,/*11312*/"GLAGOLITIC SMALL LETTER AZU"/* 2C30 */, /*11313*/"GLAGOLITIC SMALL LETTER BUKY"/* 2C31 */,/*11314*/"GLAGOLITIC SMALL LETTER VEDE"/* 2C32 */, /*11315*/"GLAGOLITIC SMALL LETTER GLAGOLI"/* 2C33 */,/*11316*/"GLAGOLITIC SMALL LETTER DOBRO"/* 2C34 */, /*11317*/"GLAGOLITIC SMALL LETTER YESTU"/* 2C35 */,/*11318*/"GLAGOLITIC SMALL LETTER ZHIVETE"/* 2C36 */, /*11319*/"GLAGOLITIC SMALL LETTER DZELO"/* 2C37 */,/*11320*/"GLAGOLITIC SMALL LETTER ZEMLJA"/* 2C38 */, /*11321*/"GLAGOLITIC SMALL LETTER IZHE"/* 2C39 */,/*11322*/"GLAGOLITIC SMALL LETTER INITIAL IZHE"/* 2C3A */, /*11323*/"GLAGOLITIC SMALL LETTER I"/* 2C3B */,/*11324*/"GLAGOLITIC SMALL LETTER DJERVI"/* 2C3C */, /*11325*/"GLAGOLITIC SMALL LETTER KAKO"/* 2C3D */,/*11326*/"GLAGOLITIC SMALL LETTER LJUDIJE"/* 2C3E */, /*11327*/"GLAGOLITIC SMALL LETTER MYSLITE"/* 2C3F */,/*11328*/"GLAGOLITIC SMALL LETTER NASHI"/* 2C40 */, /*11329*/"GLAGOLITIC SMALL LETTER ONU"/* 2C41 */,/*11330*/"GLAGOLITIC SMALL LETTER POKOJI"/* 2C42 */, /*11331*/"GLAGOLITIC SMALL LETTER RITSI"/* 2C43 */,/*11332*/"GLAGOLITIC SMALL LETTER SLOVO"/* 2C44 */, /*11333*/"GLAGOLITIC SMALL LETTER TVRIDO"/* 2C45 */,/*11334*/"GLAGOLITIC SMALL LETTER UKU"/* 2C46 */, /*11335*/"GLAGOLITIC SMALL LETTER FRITU"/* 2C47 */,/*11336*/"GLAGOLITIC SMALL LETTER HERU"/* 2C48 */, /*11337*/"GLAGOLITIC SMALL LETTER OTU"/* 2C49 */,/*11338*/"GLAGOLITIC SMALL LETTER PE"/* 2C4A */, /*11339*/"GLAGOLITIC SMALL LETTER SHTA"/* 2C4B */,/*11340*/"GLAGOLITIC SMALL LETTER TSI"/* 2C4C */, /*11341*/"GLAGOLITIC SMALL LETTER CHRIVI"/* 2C4D */,/*11342*/"GLAGOLITIC SMALL LETTER SHA"/* 2C4E */, /*11343*/"GLAGOLITIC SMALL LETTER YERU"/* 2C4F */,/*11344*/"GLAGOLITIC SMALL LETTER YERI"/* 2C50 */, /*11345*/"GLAGOLITIC SMALL LETTER YATI"/* 2C51 */,/*11346*/"GLAGOLITIC SMALL LETTER SPIDERY HA"/* 2C52 */, /*11347*/"GLAGOLITIC SMALL LETTER YU"/* 2C53 */,/*11348*/"GLAGOLITIC SMALL LETTER SMALL YUS"/* 2C54 */, /*11349*/"GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL"/* 2C55 */,/*11350*/"GLAGOLITIC SMALL LETTER YO"/* 2C56 */, /*11351*/"GLAGOLITIC SMALL LETTER IOTATED SMALL YUS"/* 2C57 */,/*11352*/"GLAGOLITIC SMALL LETTER BIG YUS"/* 2C58 */, /*11353*/"GLAGOLITIC SMALL LETTER IOTATED BIG YUS"/* 2C59 */,/*11354*/"GLAGOLITIC SMALL LETTER FITA"/* 2C5A */, /*11355*/"GLAGOLITIC SMALL LETTER IZHITSA"/* 2C5B */,/*11356*/"GLAGOLITIC SMALL LETTER SHTAPIC"/* 2C5C */, /*11357*/"GLAGOLITIC SMALL LETTER TROKUTASTI A"/* 2C5D */,/*11358*/"GLAGOLITIC SMALL LETTER LATINATE MYSLITE"/* 2C5E */, NULL,/*11360*/"LATIN CAPITAL LETTER L WITH DOUBLE BAR"/* 2C60 */, /*11361*/"LATIN SMALL LETTER L WITH DOUBLE BAR"/* 2C61 */,/*11362*/"LATIN CAPITAL LETTER L WITH MIDDLE TILDE"/* 2C62 */, /*11363*/"LATIN CAPITAL LETTER P WITH STROKE"/* 2C63 */,/*11364*/"LATIN CAPITAL LETTER R WITH TAIL"/* 2C64 */, /*11365*/"LATIN SMALL LETTER A WITH STROKE"/* 2C65 */,/*11366*/"LATIN SMALL LETTER T WITH DIAGONAL STROKE"/* 2C66 */, /*11367*/"LATIN CAPITAL LETTER H WITH DESCENDER"/* 2C67 */,/*11368*/"LATIN SMALL LETTER H WITH DESCENDER"/* 2C68 */, /*11369*/"LATIN CAPITAL LETTER K WITH DESCENDER"/* 2C69 */,/*11370*/"LATIN SMALL LETTER K WITH DESCENDER"/* 2C6A */, /*11371*/"LATIN CAPITAL LETTER Z WITH DESCENDER"/* 2C6B */,/*11372*/"LATIN SMALL LETTER Z WITH DESCENDER"/* 2C6C */, /*11373*/"LATIN CAPITAL LETTER ALPHA"/* 2C6D */,/*11374*/"LATIN CAPITAL LETTER M WITH HOOK"/* 2C6E */, /*11375*/"LATIN CAPITAL LETTER TURNED A"/* 2C6F */,/*11376*/"LATIN CAPITAL LETTER TURNED ALPHA"/* 2C70 */, /*11377*/"LATIN SMALL LETTER V WITH RIGHT HOOK"/* 2C71 */,/*11378*/"LATIN CAPITAL LETTER W WITH HOOK"/* 2C72 */, /*11379*/"LATIN SMALL LETTER W WITH HOOK"/* 2C73 */,/*11380*/"LATIN SMALL LETTER V WITH CURL"/* 2C74 */, /*11381*/"LATIN CAPITAL LETTER HALF H"/* 2C75 */,/*11382*/"LATIN SMALL LETTER HALF H"/* 2C76 */, /*11383*/"LATIN SMALL LETTER TAILLESS PHI"/* 2C77 */,/*11384*/"LATIN SMALL LETTER E WITH NOTCH"/* 2C78 */, /*11385*/"LATIN SMALL LETTER TURNED R WITH TAIL"/* 2C79 */, /*11386*/"LATIN SMALL LETTER O WITH LOW RING INSIDE"/* 2C7A */,/*11387*/"LATIN LETTER SMALL CAPITAL TURNED E"/* 2C7B */, /*11388*/"LATIN SUBSCRIPT SMALL LETTER J"/* 2C7C */,/*11389*/"MODIFIER LETTER CAPITAL V"/* 2C7D */, /*11390*/"LATIN CAPITAL LETTER S WITH SWASH TAIL"/* 2C7E */,/*11391*/"LATIN CAPITAL LETTER Z WITH SWASH TAIL"/* 2C7F */, /*11392*/"COPTIC CAPITAL LETTER ALFA"/* 2C80 */,/*11393*/"COPTIC SMALL LETTER ALFA"/* 2C81 */, /*11394*/"COPTIC CAPITAL LETTER VIDA"/* 2C82 */,/*11395*/"COPTIC SMALL LETTER VIDA"/* 2C83 */, /*11396*/"COPTIC CAPITAL LETTER GAMMA"/* 2C84 */,/*11397*/"COPTIC SMALL LETTER GAMMA"/* 2C85 */, /*11398*/"COPTIC CAPITAL LETTER DALDA"/* 2C86 */,/*11399*/"COPTIC SMALL LETTER DALDA"/* 2C87 */, /*11400*/"COPTIC CAPITAL LETTER EIE"/* 2C88 */,/*11401*/"COPTIC SMALL LETTER EIE"/* 2C89 */, /*11402*/"COPTIC CAPITAL LETTER SOU"/* 2C8A */,/*11403*/"COPTIC SMALL LETTER SOU"/* 2C8B */, /*11404*/"COPTIC CAPITAL LETTER ZATA"/* 2C8C */,/*11405*/"COPTIC SMALL LETTER ZATA"/* 2C8D */, /*11406*/"COPTIC CAPITAL LETTER HATE"/* 2C8E */,/*11407*/"COPTIC SMALL LETTER HATE"/* 2C8F */, /*11408*/"COPTIC CAPITAL LETTER THETHE"/* 2C90 */,/*11409*/"COPTIC SMALL LETTER THETHE"/* 2C91 */, /*11410*/"COPTIC CAPITAL LETTER IAUDA"/* 2C92 */,/*11411*/"COPTIC SMALL LETTER IAUDA"/* 2C93 */, /*11412*/"COPTIC CAPITAL LETTER KAPA"/* 2C94 */,/*11413*/"COPTIC SMALL LETTER KAPA"/* 2C95 */, /*11414*/"COPTIC CAPITAL LETTER LAULA"/* 2C96 */,/*11415*/"COPTIC SMALL LETTER LAULA"/* 2C97 */, /*11416*/"COPTIC CAPITAL LETTER MI"/* 2C98 */,/*11417*/"COPTIC SMALL LETTER MI"/* 2C99 */, /*11418*/"COPTIC CAPITAL LETTER NI"/* 2C9A */,/*11419*/"COPTIC SMALL LETTER NI"/* 2C9B */, /*11420*/"COPTIC CAPITAL LETTER KSI"/* 2C9C */,/*11421*/"COPTIC SMALL LETTER KSI"/* 2C9D */, /*11422*/"COPTIC CAPITAL LETTER O"/* 2C9E */,/*11423*/"COPTIC SMALL LETTER O"/* 2C9F */, /*11424*/"COPTIC CAPITAL LETTER PI"/* 2CA0 */,/*11425*/"COPTIC SMALL LETTER PI"/* 2CA1 */, /*11426*/"COPTIC CAPITAL LETTER RO"/* 2CA2 */,/*11427*/"COPTIC SMALL LETTER RO"/* 2CA3 */, /*11428*/"COPTIC CAPITAL LETTER SIMA"/* 2CA4 */,/*11429*/"COPTIC SMALL LETTER SIMA"/* 2CA5 */, /*11430*/"COPTIC CAPITAL LETTER TAU"/* 2CA6 */,/*11431*/"COPTIC SMALL LETTER TAU"/* 2CA7 */, /*11432*/"COPTIC CAPITAL LETTER UA"/* 2CA8 */,/*11433*/"COPTIC SMALL LETTER UA"/* 2CA9 */, /*11434*/"COPTIC CAPITAL LETTER FI"/* 2CAA */,/*11435*/"COPTIC SMALL LETTER FI"/* 2CAB */, /*11436*/"COPTIC CAPITAL LETTER KHI"/* 2CAC */,/*11437*/"COPTIC SMALL LETTER KHI"/* 2CAD */, /*11438*/"COPTIC CAPITAL LETTER PSI"/* 2CAE */,/*11439*/"COPTIC SMALL LETTER PSI"/* 2CAF */, /*11440*/"COPTIC CAPITAL LETTER OOU"/* 2CB0 */,/*11441*/"COPTIC SMALL LETTER OOU"/* 2CB1 */, /*11442*/"COPTIC CAPITAL LETTER DIALECT-P ALEF"/* 2CB2 */,/*11443*/"COPTIC SMALL LETTER DIALECT-P ALEF"/* 2CB3 */, /*11444*/"COPTIC CAPITAL LETTER OLD COPTIC AIN"/* 2CB4 */,/*11445*/"COPTIC SMALL LETTER OLD COPTIC AIN"/* 2CB5 */, /*11446*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE"/* 2CB6 */,/*11447*/"COPTIC SMALL LETTER CRYPTOGRAMMIC EIE"/* 2CB7 */, /*11448*/"COPTIC CAPITAL LETTER DIALECT-P KAPA"/* 2CB8 */,/*11449*/"COPTIC SMALL LETTER DIALECT-P KAPA"/* 2CB9 */, /*11450*/"COPTIC CAPITAL LETTER DIALECT-P NI"/* 2CBA */,/*11451*/"COPTIC SMALL LETTER DIALECT-P NI"/* 2CBB */, /*11452*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI"/* 2CBC */,/*11453*/"COPTIC SMALL LETTER CRYPTOGRAMMIC NI"/* 2CBD */, /*11454*/"COPTIC CAPITAL LETTER OLD COPTIC OOU"/* 2CBE */,/*11455*/"COPTIC SMALL LETTER OLD COPTIC OOU"/* 2CBF */, /*11456*/"COPTIC CAPITAL LETTER SAMPI"/* 2CC0 */,/*11457*/"COPTIC SMALL LETTER SAMPI"/* 2CC1 */, /*11458*/"COPTIC CAPITAL LETTER CROSSED SHEI"/* 2CC2 */,/*11459*/"COPTIC SMALL LETTER CROSSED SHEI"/* 2CC3 */, /*11460*/"COPTIC CAPITAL LETTER OLD COPTIC SHEI"/* 2CC4 */,/*11461*/"COPTIC SMALL LETTER OLD COPTIC SHEI"/* 2CC5 */, /*11462*/"COPTIC CAPITAL LETTER OLD COPTIC ESH"/* 2CC6 */,/*11463*/"COPTIC SMALL LETTER OLD COPTIC ESH"/* 2CC7 */, /*11464*/"COPTIC CAPITAL LETTER AKHMIMIC KHEI"/* 2CC8 */,/*11465*/"COPTIC SMALL LETTER AKHMIMIC KHEI"/* 2CC9 */, /*11466*/"COPTIC CAPITAL LETTER DIALECT-P HORI"/* 2CCA */,/*11467*/"COPTIC SMALL LETTER DIALECT-P HORI"/* 2CCB */, /*11468*/"COPTIC CAPITAL LETTER OLD COPTIC HORI"/* 2CCC */,/*11469*/"COPTIC SMALL LETTER OLD COPTIC HORI"/* 2CCD */, /*11470*/"COPTIC CAPITAL LETTER OLD COPTIC HA"/* 2CCE */,/*11471*/"COPTIC SMALL LETTER OLD COPTIC HA"/* 2CCF */, /*11472*/"COPTIC CAPITAL LETTER L-SHAPED HA"/* 2CD0 */,/*11473*/"COPTIC SMALL LETTER L-SHAPED HA"/* 2CD1 */, /*11474*/"COPTIC CAPITAL LETTER OLD COPTIC HEI"/* 2CD2 */,/*11475*/"COPTIC SMALL LETTER OLD COPTIC HEI"/* 2CD3 */, /*11476*/"COPTIC CAPITAL LETTER OLD COPTIC HAT"/* 2CD4 */,/*11477*/"COPTIC SMALL LETTER OLD COPTIC HAT"/* 2CD5 */, /*11478*/"COPTIC CAPITAL LETTER OLD COPTIC GANGIA"/* 2CD6 */,/*11479*/"COPTIC SMALL LETTER OLD COPTIC GANGIA"/* 2CD7 */, /*11480*/"COPTIC CAPITAL LETTER OLD COPTIC DJA"/* 2CD8 */,/*11481*/"COPTIC SMALL LETTER OLD COPTIC DJA"/* 2CD9 */, /*11482*/"COPTIC CAPITAL LETTER OLD COPTIC SHIMA"/* 2CDA */,/*11483*/"COPTIC SMALL LETTER OLD COPTIC SHIMA"/* 2CDB */, /*11484*/"COPTIC CAPITAL LETTER OLD NUBIAN SHIMA"/* 2CDC */,/*11485*/"COPTIC SMALL LETTER OLD NUBIAN SHIMA"/* 2CDD */, /*11486*/"COPTIC CAPITAL LETTER OLD NUBIAN NGI"/* 2CDE */,/*11487*/"COPTIC SMALL LETTER OLD NUBIAN NGI"/* 2CDF */, /*11488*/"COPTIC CAPITAL LETTER OLD NUBIAN NYI"/* 2CE0 */,/*11489*/"COPTIC SMALL LETTER OLD NUBIAN NYI"/* 2CE1 */, /*11490*/"COPTIC CAPITAL LETTER OLD NUBIAN WAU"/* 2CE2 */,/*11491*/"COPTIC SMALL LETTER OLD NUBIAN WAU"/* 2CE3 */, /*11492*/"COPTIC SYMBOL KAI"/* 2CE4 */,/*11493*/"COPTIC SYMBOL MI RO"/* 2CE5 */,/*11494*/"COPTIC SYMBOL PI RO"/* 2CE6 */, /*11495*/"COPTIC SYMBOL STAUROS"/* 2CE7 */,/*11496*/"COPTIC SYMBOL TAU RO"/* 2CE8 */, /*11497*/"COPTIC SYMBOL KHI RO"/* 2CE9 */,/*11498*/"COPTIC SYMBOL SHIMA SIMA"/* 2CEA */, /*11499*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI"/* 2CEB */, /*11500*/"COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI"/* 2CEC */, /*11501*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA"/* 2CED */, /*11502*/"COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA"/* 2CEE */,/*11503*/"COPTIC COMBINING NI ABOVE"/* 2CEF */, /*11504*/"COPTIC COMBINING SPIRITUS ASPER"/* 2CF0 */,/*11505*/"COPTIC COMBINING SPIRITUS LENIS"/* 2CF1 */, /*11506*/"COPTIC CAPITAL LETTER BOHAIRIC KHEI"/* 2CF2 */,/*11507*/"COPTIC SMALL LETTER BOHAIRIC KHEI"/* 2CF3 */,NULL, NULL,NULL,NULL,NULL,/*11513*/"COPTIC OLD NUBIAN FULL STOP"/* 2CF9 */, /*11514*/"COPTIC OLD NUBIAN DIRECT QUESTION MARK"/* 2CFA */, /*11515*/"COPTIC OLD NUBIAN INDIRECT QUESTION MARK"/* 2CFB */,/*11516*/"COPTIC OLD NUBIAN VERSE DIVIDER"/* 2CFC */, /*11517*/"COPTIC FRACTION ONE HALF"/* 2CFD */,/*11518*/"COPTIC FULL STOP"/* 2CFE */, /*11519*/"COPTIC MORPHOLOGICAL DIVIDER"/* 2CFF */,/*11520*/"GEORGIAN SMALL LETTER AN"/* 2D00 */, /*11521*/"GEORGIAN SMALL LETTER BAN"/* 2D01 */,/*11522*/"GEORGIAN SMALL LETTER GAN"/* 2D02 */, /*11523*/"GEORGIAN SMALL LETTER DON"/* 2D03 */,/*11524*/"GEORGIAN SMALL LETTER EN"/* 2D04 */, /*11525*/"GEORGIAN SMALL LETTER VIN"/* 2D05 */,/*11526*/"GEORGIAN SMALL LETTER ZEN"/* 2D06 */, /*11527*/"GEORGIAN SMALL LETTER TAN"/* 2D07 */,/*11528*/"GEORGIAN SMALL LETTER IN"/* 2D08 */, /*11529*/"GEORGIAN SMALL LETTER KAN"/* 2D09 */,/*11530*/"GEORGIAN SMALL LETTER LAS"/* 2D0A */, /*11531*/"GEORGIAN SMALL LETTER MAN"/* 2D0B */,/*11532*/"GEORGIAN SMALL LETTER NAR"/* 2D0C */, /*11533*/"GEORGIAN SMALL LETTER ON"/* 2D0D */,/*11534*/"GEORGIAN SMALL LETTER PAR"/* 2D0E */, /*11535*/"GEORGIAN SMALL LETTER ZHAR"/* 2D0F */,/*11536*/"GEORGIAN SMALL LETTER RAE"/* 2D10 */, /*11537*/"GEORGIAN SMALL LETTER SAN"/* 2D11 */,/*11538*/"GEORGIAN SMALL LETTER TAR"/* 2D12 */, /*11539*/"GEORGIAN SMALL LETTER UN"/* 2D13 */,/*11540*/"GEORGIAN SMALL LETTER PHAR"/* 2D14 */, /*11541*/"GEORGIAN SMALL LETTER KHAR"/* 2D15 */,/*11542*/"GEORGIAN SMALL LETTER GHAN"/* 2D16 */, /*11543*/"GEORGIAN SMALL LETTER QAR"/* 2D17 */,/*11544*/"GEORGIAN SMALL LETTER SHIN"/* 2D18 */, /*11545*/"GEORGIAN SMALL LETTER CHIN"/* 2D19 */,/*11546*/"GEORGIAN SMALL LETTER CAN"/* 2D1A */, /*11547*/"GEORGIAN SMALL LETTER JIL"/* 2D1B */,/*11548*/"GEORGIAN SMALL LETTER CIL"/* 2D1C */, /*11549*/"GEORGIAN SMALL LETTER CHAR"/* 2D1D */,/*11550*/"GEORGIAN SMALL LETTER XAN"/* 2D1E */, /*11551*/"GEORGIAN SMALL LETTER JHAN"/* 2D1F */,/*11552*/"GEORGIAN SMALL LETTER HAE"/* 2D20 */, /*11553*/"GEORGIAN SMALL LETTER HE"/* 2D21 */,/*11554*/"GEORGIAN SMALL LETTER HIE"/* 2D22 */, /*11555*/"GEORGIAN SMALL LETTER WE"/* 2D23 */,/*11556*/"GEORGIAN SMALL LETTER HAR"/* 2D24 */, /*11557*/"GEORGIAN SMALL LETTER HOE"/* 2D25 */,NULL,/*11559*/"GEORGIAN SMALL LETTER YN"/* 2D27 */,NULL,NULL,NULL,NULL, NULL,/*11565*/"GEORGIAN SMALL LETTER AEN"/* 2D2D */,NULL,NULL,/*11568*/"TIFINAGH LETTER YA"/* 2D30 */, /*11569*/"TIFINAGH LETTER YAB"/* 2D31 */,/*11570*/"TIFINAGH LETTER YABH"/* 2D32 */, /*11571*/"TIFINAGH LETTER YAG"/* 2D33 */,/*11572*/"TIFINAGH LETTER YAGHH"/* 2D34 */, /*11573*/"TIFINAGH LETTER BERBER ACADEMY YAJ"/* 2D35 */,/*11574*/"TIFINAGH LETTER YAJ"/* 2D36 */, /*11575*/"TIFINAGH LETTER YAD"/* 2D37 */,/*11576*/"TIFINAGH LETTER YADH"/* 2D38 */, /*11577*/"TIFINAGH LETTER YADD"/* 2D39 */,/*11578*/"TIFINAGH LETTER YADDH"/* 2D3A */, /*11579*/"TIFINAGH LETTER YEY"/* 2D3B */,/*11580*/"TIFINAGH LETTER YAF"/* 2D3C */, /*11581*/"TIFINAGH LETTER YAK"/* 2D3D */,/*11582*/"TIFINAGH LETTER TUAREG YAK"/* 2D3E */, /*11583*/"TIFINAGH LETTER YAKHH"/* 2D3F */,/*11584*/"TIFINAGH LETTER YAH"/* 2D40 */, /*11585*/"TIFINAGH LETTER BERBER ACADEMY YAH"/* 2D41 */,/*11586*/"TIFINAGH LETTER TUAREG YAH"/* 2D42 */, /*11587*/"TIFINAGH LETTER YAHH"/* 2D43 */,/*11588*/"TIFINAGH LETTER YAA"/* 2D44 */, /*11589*/"TIFINAGH LETTER YAKH"/* 2D45 */,/*11590*/"TIFINAGH LETTER TUAREG YAKH"/* 2D46 */, /*11591*/"TIFINAGH LETTER YAQ"/* 2D47 */,/*11592*/"TIFINAGH LETTER TUAREG YAQ"/* 2D48 */, /*11593*/"TIFINAGH LETTER YI"/* 2D49 */,/*11594*/"TIFINAGH LETTER YAZH"/* 2D4A */, /*11595*/"TIFINAGH LETTER AHAGGAR YAZH"/* 2D4B */,/*11596*/"TIFINAGH LETTER TUAREG YAZH"/* 2D4C */, /*11597*/"TIFINAGH LETTER YAL"/* 2D4D */,/*11598*/"TIFINAGH LETTER YAM"/* 2D4E */, /*11599*/"TIFINAGH LETTER YAN"/* 2D4F */,/*11600*/"TIFINAGH LETTER TUAREG YAGN"/* 2D50 */, /*11601*/"TIFINAGH LETTER TUAREG YANG"/* 2D51 */,/*11602*/"TIFINAGH LETTER YAP"/* 2D52 */, /*11603*/"TIFINAGH LETTER YU"/* 2D53 */,/*11604*/"TIFINAGH LETTER YAR"/* 2D54 */, /*11605*/"TIFINAGH LETTER YARR"/* 2D55 */,/*11606*/"TIFINAGH LETTER YAGH"/* 2D56 */, /*11607*/"TIFINAGH LETTER TUAREG YAGH"/* 2D57 */,/*11608*/"TIFINAGH LETTER AYER YAGH"/* 2D58 */, /*11609*/"TIFINAGH LETTER YAS"/* 2D59 */,/*11610*/"TIFINAGH LETTER YASS"/* 2D5A */, /*11611*/"TIFINAGH LETTER YASH"/* 2D5B */,/*11612*/"TIFINAGH LETTER YAT"/* 2D5C */, /*11613*/"TIFINAGH LETTER YATH"/* 2D5D */,/*11614*/"TIFINAGH LETTER YACH"/* 2D5E */, /*11615*/"TIFINAGH LETTER YATT"/* 2D5F */,/*11616*/"TIFINAGH LETTER YAV"/* 2D60 */, /*11617*/"TIFINAGH LETTER YAW"/* 2D61 */,/*11618*/"TIFINAGH LETTER YAY"/* 2D62 */, /*11619*/"TIFINAGH LETTER YAZ"/* 2D63 */,/*11620*/"TIFINAGH LETTER TAWELLEMET YAZ"/* 2D64 */, /*11621*/"TIFINAGH LETTER YAZZ"/* 2D65 */,/*11622*/"TIFINAGH LETTER YE"/* 2D66 */, /*11623*/"TIFINAGH LETTER YO"/* 2D67 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11631*/"TIFINAGH MODIFIER LETTER LABIALIZATION MARK"/* 2D6F */,/*11632*/"TIFINAGH SEPARATOR MARK"/* 2D70 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*11647*/"TIFINAGH CONSONANT JOINER"/* 2D7F */, /*11648*/"ETHIOPIC SYLLABLE LOA"/* 2D80 */,/*11649*/"ETHIOPIC SYLLABLE MOA"/* 2D81 */, /*11650*/"ETHIOPIC SYLLABLE ROA"/* 2D82 */,/*11651*/"ETHIOPIC SYLLABLE SOA"/* 2D83 */, /*11652*/"ETHIOPIC SYLLABLE SHOA"/* 2D84 */,/*11653*/"ETHIOPIC SYLLABLE BOA"/* 2D85 */, /*11654*/"ETHIOPIC SYLLABLE TOA"/* 2D86 */,/*11655*/"ETHIOPIC SYLLABLE COA"/* 2D87 */, /*11656*/"ETHIOPIC SYLLABLE NOA"/* 2D88 */,/*11657*/"ETHIOPIC SYLLABLE NYOA"/* 2D89 */, /*11658*/"ETHIOPIC SYLLABLE GLOTTAL OA"/* 2D8A */,/*11659*/"ETHIOPIC SYLLABLE ZOA"/* 2D8B */, /*11660*/"ETHIOPIC SYLLABLE DOA"/* 2D8C */,/*11661*/"ETHIOPIC SYLLABLE DDOA"/* 2D8D */, /*11662*/"ETHIOPIC SYLLABLE JOA"/* 2D8E */,/*11663*/"ETHIOPIC SYLLABLE THOA"/* 2D8F */, /*11664*/"ETHIOPIC SYLLABLE CHOA"/* 2D90 */,/*11665*/"ETHIOPIC SYLLABLE PHOA"/* 2D91 */, /*11666*/"ETHIOPIC SYLLABLE POA"/* 2D92 */,/*11667*/"ETHIOPIC SYLLABLE GGWA"/* 2D93 */, /*11668*/"ETHIOPIC SYLLABLE GGWI"/* 2D94 */,/*11669*/"ETHIOPIC SYLLABLE GGWEE"/* 2D95 */, /*11670*/"ETHIOPIC SYLLABLE GGWE"/* 2D96 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11680*/"ETHIOPIC SYLLABLE SSA"/* 2DA0 */,/*11681*/"ETHIOPIC SYLLABLE SSU"/* 2DA1 */, /*11682*/"ETHIOPIC SYLLABLE SSI"/* 2DA2 */,/*11683*/"ETHIOPIC SYLLABLE SSAA"/* 2DA3 */, /*11684*/"ETHIOPIC SYLLABLE SSEE"/* 2DA4 */,/*11685*/"ETHIOPIC SYLLABLE SSE"/* 2DA5 */, /*11686*/"ETHIOPIC SYLLABLE SSO"/* 2DA6 */,NULL,/*11688*/"ETHIOPIC SYLLABLE CCA"/* 2DA8 */, /*11689*/"ETHIOPIC SYLLABLE CCU"/* 2DA9 */,/*11690*/"ETHIOPIC SYLLABLE CCI"/* 2DAA */, /*11691*/"ETHIOPIC SYLLABLE CCAA"/* 2DAB */,/*11692*/"ETHIOPIC SYLLABLE CCEE"/* 2DAC */, /*11693*/"ETHIOPIC SYLLABLE CCE"/* 2DAD */,/*11694*/"ETHIOPIC SYLLABLE CCO"/* 2DAE */,NULL, /*11696*/"ETHIOPIC SYLLABLE ZZA"/* 2DB0 */,/*11697*/"ETHIOPIC SYLLABLE ZZU"/* 2DB1 */, /*11698*/"ETHIOPIC SYLLABLE ZZI"/* 2DB2 */,/*11699*/"ETHIOPIC SYLLABLE ZZAA"/* 2DB3 */, /*11700*/"ETHIOPIC SYLLABLE ZZEE"/* 2DB4 */,/*11701*/"ETHIOPIC SYLLABLE ZZE"/* 2DB5 */, /*11702*/"ETHIOPIC SYLLABLE ZZO"/* 2DB6 */,NULL,/*11704*/"ETHIOPIC SYLLABLE CCHA"/* 2DB8 */, /*11705*/"ETHIOPIC SYLLABLE CCHU"/* 2DB9 */,/*11706*/"ETHIOPIC SYLLABLE CCHI"/* 2DBA */, /*11707*/"ETHIOPIC SYLLABLE CCHAA"/* 2DBB */,/*11708*/"ETHIOPIC SYLLABLE CCHEE"/* 2DBC */, /*11709*/"ETHIOPIC SYLLABLE CCHE"/* 2DBD */,/*11710*/"ETHIOPIC SYLLABLE CCHO"/* 2DBE */,NULL, /*11712*/"ETHIOPIC SYLLABLE QYA"/* 2DC0 */,/*11713*/"ETHIOPIC SYLLABLE QYU"/* 2DC1 */, /*11714*/"ETHIOPIC SYLLABLE QYI"/* 2DC2 */,/*11715*/"ETHIOPIC SYLLABLE QYAA"/* 2DC3 */, /*11716*/"ETHIOPIC SYLLABLE QYEE"/* 2DC4 */,/*11717*/"ETHIOPIC SYLLABLE QYE"/* 2DC5 */, /*11718*/"ETHIOPIC SYLLABLE QYO"/* 2DC6 */,NULL,/*11720*/"ETHIOPIC SYLLABLE KYA"/* 2DC8 */, /*11721*/"ETHIOPIC SYLLABLE KYU"/* 2DC9 */,/*11722*/"ETHIOPIC SYLLABLE KYI"/* 2DCA */, /*11723*/"ETHIOPIC SYLLABLE KYAA"/* 2DCB */,/*11724*/"ETHIOPIC SYLLABLE KYEE"/* 2DCC */, /*11725*/"ETHIOPIC SYLLABLE KYE"/* 2DCD */,/*11726*/"ETHIOPIC SYLLABLE KYO"/* 2DCE */,NULL, /*11728*/"ETHIOPIC SYLLABLE XYA"/* 2DD0 */,/*11729*/"ETHIOPIC SYLLABLE XYU"/* 2DD1 */, /*11730*/"ETHIOPIC SYLLABLE XYI"/* 2DD2 */,/*11731*/"ETHIOPIC SYLLABLE XYAA"/* 2DD3 */, /*11732*/"ETHIOPIC SYLLABLE XYEE"/* 2DD4 */,/*11733*/"ETHIOPIC SYLLABLE XYE"/* 2DD5 */, /*11734*/"ETHIOPIC SYLLABLE XYO"/* 2DD6 */,NULL,/*11736*/"ETHIOPIC SYLLABLE GYA"/* 2DD8 */, /*11737*/"ETHIOPIC SYLLABLE GYU"/* 2DD9 */,/*11738*/"ETHIOPIC SYLLABLE GYI"/* 2DDA */, /*11739*/"ETHIOPIC SYLLABLE GYAA"/* 2DDB */,/*11740*/"ETHIOPIC SYLLABLE GYEE"/* 2DDC */, /*11741*/"ETHIOPIC SYLLABLE GYE"/* 2DDD */,/*11742*/"ETHIOPIC SYLLABLE GYO"/* 2DDE */,NULL, /*11744*/"COMBINING CYRILLIC LETTER BE"/* 2DE0 */,/*11745*/"COMBINING CYRILLIC LETTER VE"/* 2DE1 */, /*11746*/"COMBINING CYRILLIC LETTER GHE"/* 2DE2 */,/*11747*/"COMBINING CYRILLIC LETTER DE"/* 2DE3 */, /*11748*/"COMBINING CYRILLIC LETTER ZHE"/* 2DE4 */,/*11749*/"COMBINING CYRILLIC LETTER ZE"/* 2DE5 */, /*11750*/"COMBINING CYRILLIC LETTER KA"/* 2DE6 */,/*11751*/"COMBINING CYRILLIC LETTER EL"/* 2DE7 */, /*11752*/"COMBINING CYRILLIC LETTER EM"/* 2DE8 */,/*11753*/"COMBINING CYRILLIC LETTER EN"/* 2DE9 */, /*11754*/"COMBINING CYRILLIC LETTER O"/* 2DEA */,/*11755*/"COMBINING CYRILLIC LETTER PE"/* 2DEB */, /*11756*/"COMBINING CYRILLIC LETTER ER"/* 2DEC */,/*11757*/"COMBINING CYRILLIC LETTER ES"/* 2DED */, /*11758*/"COMBINING CYRILLIC LETTER TE"/* 2DEE */,/*11759*/"COMBINING CYRILLIC LETTER HA"/* 2DEF */, /*11760*/"COMBINING CYRILLIC LETTER TSE"/* 2DF0 */,/*11761*/"COMBINING CYRILLIC LETTER CHE"/* 2DF1 */, /*11762*/"COMBINING CYRILLIC LETTER SHA"/* 2DF2 */,/*11763*/"COMBINING CYRILLIC LETTER SHCHA"/* 2DF3 */, /*11764*/"COMBINING CYRILLIC LETTER FITA"/* 2DF4 */,/*11765*/"COMBINING CYRILLIC LETTER ES-TE"/* 2DF5 */, /*11766*/"COMBINING CYRILLIC LETTER A"/* 2DF6 */,/*11767*/"COMBINING CYRILLIC LETTER IE"/* 2DF7 */, /*11768*/"COMBINING CYRILLIC LETTER DJERV"/* 2DF8 */,/*11769*/"COMBINING CYRILLIC LETTER MONOGRAPH UK"/* 2DF9 */, /*11770*/"COMBINING CYRILLIC LETTER YAT"/* 2DFA */,/*11771*/"COMBINING CYRILLIC LETTER YU"/* 2DFB */, /*11772*/"COMBINING CYRILLIC LETTER IOTIFIED A"/* 2DFC */,/*11773*/"COMBINING CYRILLIC LETTER LITTLE YUS"/* 2DFD */, /*11774*/"COMBINING CYRILLIC LETTER BIG YUS"/* 2DFE */,/*11775*/"COMBINING CYRILLIC LETTER IOTIFIED BIG YUS"/* 2DFF */, /*11776*/"RIGHT ANGLE SUBSTITUTION MARKER"/* 2E00 */,/*11777*/"RIGHT ANGLE DOTTED SUBSTITUTION MARKER"/* 2E01 */, /*11778*/"LEFT SUBSTITUTION BRACKET"/* 2E02 */,/*11779*/"RIGHT SUBSTITUTION BRACKET"/* 2E03 */, /*11780*/"LEFT DOTTED SUBSTITUTION BRACKET"/* 2E04 */,/*11781*/"RIGHT DOTTED SUBSTITUTION BRACKET"/* 2E05 */, /*11782*/"RAISED INTERPOLATION MARKER"/* 2E06 */,/*11783*/"RAISED DOTTED INTERPOLATION MARKER"/* 2E07 */, /*11784*/"DOTTED TRANSPOSITION MARKER"/* 2E08 */,/*11785*/"LEFT TRANSPOSITION BRACKET"/* 2E09 */, /*11786*/"RIGHT TRANSPOSITION BRACKET"/* 2E0A */,/*11787*/"RAISED SQUARE"/* 2E0B */, /*11788*/"LEFT RAISED OMISSION BRACKET"/* 2E0C */,/*11789*/"RIGHT RAISED OMISSION BRACKET"/* 2E0D */, /*11790*/"EDITORIAL CORONIS"/* 2E0E */,/*11791*/"PARAGRAPHOS"/* 2E0F */,/*11792*/"FORKED PARAGRAPHOS"/* 2E10 */, /*11793*/"REVERSED FORKED PARAGRAPHOS"/* 2E11 */,/*11794*/"HYPODIASTOLE"/* 2E12 */,/*11795*/"DOTTED OBELOS"/* 2E13 */, /*11796*/"DOWNWARDS ANCORA"/* 2E14 */,/*11797*/"UPWARDS ANCORA"/* 2E15 */, /*11798*/"DOTTED RIGHT-POINTING ANGLE"/* 2E16 */,/*11799*/"DOUBLE OBLIQUE HYPHEN"/* 2E17 */, /*11800*/"INVERTED INTERROBANG"/* 2E18 */,/*11801*/"PALM BRANCH"/* 2E19 */,/*11802*/"HYPHEN WITH DIAERESIS"/* 2E1A */, /*11803*/"TILDE WITH RING ABOVE"/* 2E1B */,/*11804*/"LEFT LOW PARAPHRASE BRACKET"/* 2E1C */, /*11805*/"RIGHT LOW PARAPHRASE BRACKET"/* 2E1D */,/*11806*/"TILDE WITH DOT ABOVE"/* 2E1E */, /*11807*/"TILDE WITH DOT BELOW"/* 2E1F */,/*11808*/"LEFT VERTICAL BAR WITH QUILL"/* 2E20 */, /*11809*/"RIGHT VERTICAL BAR WITH QUILL"/* 2E21 */,/*11810*/"TOP LEFT HALF BRACKET"/* 2E22 */, /*11811*/"TOP RIGHT HALF BRACKET"/* 2E23 */,/*11812*/"BOTTOM LEFT HALF BRACKET"/* 2E24 */, /*11813*/"BOTTOM RIGHT HALF BRACKET"/* 2E25 */,/*11814*/"LEFT SIDEWAYS U BRACKET"/* 2E26 */, /*11815*/"RIGHT SIDEWAYS U BRACKET"/* 2E27 */,/*11816*/"LEFT DOUBLE PARENTHESIS"/* 2E28 */, /*11817*/"RIGHT DOUBLE PARENTHESIS"/* 2E29 */,/*11818*/"TWO DOTS OVER ONE DOT PUNCTUATION"/* 2E2A */, /*11819*/"ONE DOT OVER TWO DOTS PUNCTUATION"/* 2E2B */,/*11820*/"SQUARED FOUR DOT PUNCTUATION"/* 2E2C */, /*11821*/"FIVE DOT MARK"/* 2E2D */,/*11822*/"REVERSED QUESTION MARK"/* 2E2E */,/*11823*/"VERTICAL TILDE"/* 2E2F */, /*11824*/"RING POINT"/* 2E30 */,/*11825*/"WORD SEPARATOR MIDDLE DOT"/* 2E31 */,/*11826*/"TURNED COMMA"/* 2E32 */, /*11827*/"RAISED DOT"/* 2E33 */,/*11828*/"RAISED COMMA"/* 2E34 */,/*11829*/"TURNED SEMICOLON"/* 2E35 */, /*11830*/"DAGGER WITH LEFT GUARD"/* 2E36 */,/*11831*/"DAGGER WITH RIGHT GUARD"/* 2E37 */, /*11832*/"TURNED DAGGER"/* 2E38 */,/*11833*/"TOP HALF SECTION SIGN"/* 2E39 */,/*11834*/"TWO-EM DASH"/* 2E3A */, /*11835*/"THREE-EM DASH"/* 2E3B */,/*11836*/"STENOGRAPHIC FULL STOP"/* 2E3C */,/*11837*/"VERTICAL SIX DOTS"/* 2E3D */, /*11838*/"WIGGLY VERTICAL LINE"/* 2E3E */,/*11839*/"CAPITULUM"/* 2E3F */,/*11840*/"DOUBLE HYPHEN"/* 2E40 */, /*11841*/"REVERSED COMMA"/* 2E41 */,/*11842*/"DOUBLE LOW-REVERSED-9 QUOTATION MARK"/* 2E42 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*11904*/"CJK RADICAL REPEAT"/* 2E80 */,/*11905*/"CJK RADICAL CLIFF"/* 2E81 */, /*11906*/"CJK RADICAL SECOND ONE"/* 2E82 */,/*11907*/"CJK RADICAL SECOND TWO"/* 2E83 */, /*11908*/"CJK RADICAL SECOND THREE"/* 2E84 */,/*11909*/"CJK RADICAL PERSON"/* 2E85 */, /*11910*/"CJK RADICAL BOX"/* 2E86 */,/*11911*/"CJK RADICAL TABLE"/* 2E87 */,/*11912*/"CJK RADICAL KNIFE ONE"/* 2E88 */, /*11913*/"CJK RADICAL KNIFE TWO"/* 2E89 */,/*11914*/"CJK RADICAL DIVINATION"/* 2E8A */, /*11915*/"CJK RADICAL SEAL"/* 2E8B */,/*11916*/"CJK RADICAL SMALL ONE"/* 2E8C */, /*11917*/"CJK RADICAL SMALL TWO"/* 2E8D */,/*11918*/"CJK RADICAL LAME ONE"/* 2E8E */, /*11919*/"CJK RADICAL LAME TWO"/* 2E8F */,/*11920*/"CJK RADICAL LAME THREE"/* 2E90 */, /*11921*/"CJK RADICAL LAME FOUR"/* 2E91 */,/*11922*/"CJK RADICAL SNAKE"/* 2E92 */, /*11923*/"CJK RADICAL THREAD"/* 2E93 */,/*11924*/"CJK RADICAL SNOUT ONE"/* 2E94 */, /*11925*/"CJK RADICAL SNOUT TWO"/* 2E95 */,/*11926*/"CJK RADICAL HEART ONE"/* 2E96 */, /*11927*/"CJK RADICAL HEART TWO"/* 2E97 */,/*11928*/"CJK RADICAL HAND"/* 2E98 */,/*11929*/"CJK RADICAL RAP"/* 2E99 */, NULL,/*11931*/"CJK RADICAL CHOKE"/* 2E9B */,/*11932*/"CJK RADICAL SUN"/* 2E9C */,/*11933*/"CJK RADICAL MOON"/* 2E9D */, /*11934*/"CJK RADICAL DEATH"/* 2E9E */,/*11935*/"CJK RADICAL MOTHER"/* 2E9F */,/*11936*/"CJK RADICAL CIVILIAN"/* 2EA0 */, /*11937*/"CJK RADICAL WATER ONE"/* 2EA1 */,/*11938*/"CJK RADICAL WATER TWO"/* 2EA2 */, /*11939*/"CJK RADICAL FIRE"/* 2EA3 */,/*11940*/"CJK RADICAL PAW ONE"/* 2EA4 */,/*11941*/"CJK RADICAL PAW TWO"/* 2EA5 */, /*11942*/"CJK RADICAL SIMPLIFIED HALF TREE TRUNK"/* 2EA6 */,/*11943*/"CJK RADICAL COW"/* 2EA7 */, /*11944*/"CJK RADICAL DOG"/* 2EA8 */,/*11945*/"CJK RADICAL JADE"/* 2EA9 */, /*11946*/"CJK RADICAL BOLT OF CLOTH"/* 2EAA */,/*11947*/"CJK RADICAL EYE"/* 2EAB */, /*11948*/"CJK RADICAL SPIRIT ONE"/* 2EAC */,/*11949*/"CJK RADICAL SPIRIT TWO"/* 2EAD */, /*11950*/"CJK RADICAL BAMBOO"/* 2EAE */,/*11951*/"CJK RADICAL SILK"/* 2EAF */, /*11952*/"CJK RADICAL C-SIMPLIFIED SILK"/* 2EB0 */,/*11953*/"CJK RADICAL NET ONE"/* 2EB1 */, /*11954*/"CJK RADICAL NET TWO"/* 2EB2 */,/*11955*/"CJK RADICAL NET THREE"/* 2EB3 */, /*11956*/"CJK RADICAL NET FOUR"/* 2EB4 */,/*11957*/"CJK RADICAL MESH"/* 2EB5 */,/*11958*/"CJK RADICAL SHEEP"/* 2EB6 */, /*11959*/"CJK RADICAL RAM"/* 2EB7 */,/*11960*/"CJK RADICAL EWE"/* 2EB8 */,/*11961*/"CJK RADICAL OLD"/* 2EB9 */, /*11962*/"CJK RADICAL BRUSH ONE"/* 2EBA */,/*11963*/"CJK RADICAL BRUSH TWO"/* 2EBB */, /*11964*/"CJK RADICAL MEAT"/* 2EBC */,/*11965*/"CJK RADICAL MORTAR"/* 2EBD */,/*11966*/"CJK RADICAL GRASS ONE"/* 2EBE */, /*11967*/"CJK RADICAL GRASS TWO"/* 2EBF */,/*11968*/"CJK RADICAL GRASS THREE"/* 2EC0 */, /*11969*/"CJK RADICAL TIGER"/* 2EC1 */,/*11970*/"CJK RADICAL CLOTHES"/* 2EC2 */, /*11971*/"CJK RADICAL WEST ONE"/* 2EC3 */,/*11972*/"CJK RADICAL WEST TWO"/* 2EC4 */, /*11973*/"CJK RADICAL C-SIMPLIFIED SEE"/* 2EC5 */,/*11974*/"CJK RADICAL SIMPLIFIED HORN"/* 2EC6 */, /*11975*/"CJK RADICAL HORN"/* 2EC7 */,/*11976*/"CJK RADICAL C-SIMPLIFIED SPEECH"/* 2EC8 */, /*11977*/"CJK RADICAL C-SIMPLIFIED SHELL"/* 2EC9 */,/*11978*/"CJK RADICAL FOOT"/* 2ECA */, /*11979*/"CJK RADICAL C-SIMPLIFIED CART"/* 2ECB */,/*11980*/"CJK RADICAL SIMPLIFIED WALK"/* 2ECC */, /*11981*/"CJK RADICAL WALK ONE"/* 2ECD */,/*11982*/"CJK RADICAL WALK TWO"/* 2ECE */, /*11983*/"CJK RADICAL CITY"/* 2ECF */,/*11984*/"CJK RADICAL C-SIMPLIFIED GOLD"/* 2ED0 */, /*11985*/"CJK RADICAL LONG ONE"/* 2ED1 */,/*11986*/"CJK RADICAL LONG TWO"/* 2ED2 */, /*11987*/"CJK RADICAL C-SIMPLIFIED LONG"/* 2ED3 */,/*11988*/"CJK RADICAL C-SIMPLIFIED GATE"/* 2ED4 */, /*11989*/"CJK RADICAL MOUND ONE"/* 2ED5 */,/*11990*/"CJK RADICAL MOUND TWO"/* 2ED6 */, /*11991*/"CJK RADICAL RAIN"/* 2ED7 */,/*11992*/"CJK RADICAL BLUE"/* 2ED8 */, /*11993*/"CJK RADICAL C-SIMPLIFIED TANNED LEATHER"/* 2ED9 */,/*11994*/"CJK RADICAL C-SIMPLIFIED LEAF"/* 2EDA */, /*11995*/"CJK RADICAL C-SIMPLIFIED WIND"/* 2EDB */,/*11996*/"CJK RADICAL C-SIMPLIFIED FLY"/* 2EDC */, /*11997*/"CJK RADICAL EAT ONE"/* 2EDD */,/*11998*/"CJK RADICAL EAT TWO"/* 2EDE */, /*11999*/"CJK RADICAL EAT THREE"/* 2EDF */,/*12000*/"CJK RADICAL C-SIMPLIFIED EAT"/* 2EE0 */, /*12001*/"CJK RADICAL HEAD"/* 2EE1 */,/*12002*/"CJK RADICAL C-SIMPLIFIED HORSE"/* 2EE2 */, /*12003*/"CJK RADICAL BONE"/* 2EE3 */,/*12004*/"CJK RADICAL GHOST"/* 2EE4 */, /*12005*/"CJK RADICAL C-SIMPLIFIED FISH"/* 2EE5 */,/*12006*/"CJK RADICAL C-SIMPLIFIED BIRD"/* 2EE6 */, /*12007*/"CJK RADICAL C-SIMPLIFIED SALT"/* 2EE7 */,/*12008*/"CJK RADICAL SIMPLIFIED WHEAT"/* 2EE8 */, /*12009*/"CJK RADICAL SIMPLIFIED YELLOW"/* 2EE9 */,/*12010*/"CJK RADICAL C-SIMPLIFIED FROG"/* 2EEA */, /*12011*/"CJK RADICAL J-SIMPLIFIED EVEN"/* 2EEB */,/*12012*/"CJK RADICAL C-SIMPLIFIED EVEN"/* 2EEC */, /*12013*/"CJK RADICAL J-SIMPLIFIED TOOTH"/* 2EED */,/*12014*/"CJK RADICAL C-SIMPLIFIED TOOTH"/* 2EEE */, /*12015*/"CJK RADICAL J-SIMPLIFIED DRAGON"/* 2EEF */,/*12016*/"CJK RADICAL C-SIMPLIFIED DRAGON"/* 2EF0 */, /*12017*/"CJK RADICAL TURTLE"/* 2EF1 */,/*12018*/"CJK RADICAL J-SIMPLIFIED TURTLE"/* 2EF2 */, /*12019*/"CJK RADICAL C-SIMPLIFIED TURTLE"/* 2EF3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*12032*/"KANGXI RADICAL ONE"/* 2F00 */,/*12033*/"KANGXI RADICAL LINE"/* 2F01 */,/*12034*/"KANGXI RADICAL DOT"/* 2F02 */, /*12035*/"KANGXI RADICAL SLASH"/* 2F03 */,/*12036*/"KANGXI RADICAL SECOND"/* 2F04 */, /*12037*/"KANGXI RADICAL HOOK"/* 2F05 */,/*12038*/"KANGXI RADICAL TWO"/* 2F06 */,/*12039*/"KANGXI RADICAL LID"/* 2F07 */, /*12040*/"KANGXI RADICAL MAN"/* 2F08 */,/*12041*/"KANGXI RADICAL LEGS"/* 2F09 */, /*12042*/"KANGXI RADICAL ENTER"/* 2F0A */,/*12043*/"KANGXI RADICAL EIGHT"/* 2F0B */, /*12044*/"KANGXI RADICAL DOWN BOX"/* 2F0C */,/*12045*/"KANGXI RADICAL COVER"/* 2F0D */, /*12046*/"KANGXI RADICAL ICE"/* 2F0E */,/*12047*/"KANGXI RADICAL TABLE"/* 2F0F */, /*12048*/"KANGXI RADICAL OPEN BOX"/* 2F10 */,/*12049*/"KANGXI RADICAL KNIFE"/* 2F11 */, /*12050*/"KANGXI RADICAL POWER"/* 2F12 */,/*12051*/"KANGXI RADICAL WRAP"/* 2F13 */, /*12052*/"KANGXI RADICAL SPOON"/* 2F14 */,/*12053*/"KANGXI RADICAL RIGHT OPEN BOX"/* 2F15 */, /*12054*/"KANGXI RADICAL HIDING ENCLOSURE"/* 2F16 */,/*12055*/"KANGXI RADICAL TEN"/* 2F17 */, /*12056*/"KANGXI RADICAL DIVINATION"/* 2F18 */,/*12057*/"KANGXI RADICAL SEAL"/* 2F19 */, /*12058*/"KANGXI RADICAL CLIFF"/* 2F1A */,/*12059*/"KANGXI RADICAL PRIVATE"/* 2F1B */, /*12060*/"KANGXI RADICAL AGAIN"/* 2F1C */,/*12061*/"KANGXI RADICAL MOUTH"/* 2F1D */, /*12062*/"KANGXI RADICAL ENCLOSURE"/* 2F1E */,/*12063*/"KANGXI RADICAL EARTH"/* 2F1F */, /*12064*/"KANGXI RADICAL SCHOLAR"/* 2F20 */,/*12065*/"KANGXI RADICAL GO"/* 2F21 */, /*12066*/"KANGXI RADICAL GO SLOWLY"/* 2F22 */,/*12067*/"KANGXI RADICAL EVENING"/* 2F23 */, /*12068*/"KANGXI RADICAL BIG"/* 2F24 */,/*12069*/"KANGXI RADICAL WOMAN"/* 2F25 */, /*12070*/"KANGXI RADICAL CHILD"/* 2F26 */,/*12071*/"KANGXI RADICAL ROOF"/* 2F27 */, /*12072*/"KANGXI RADICAL INCH"/* 2F28 */,/*12073*/"KANGXI RADICAL SMALL"/* 2F29 */, /*12074*/"KANGXI RADICAL LAME"/* 2F2A */,/*12075*/"KANGXI RADICAL CORPSE"/* 2F2B */, /*12076*/"KANGXI RADICAL SPROUT"/* 2F2C */,/*12077*/"KANGXI RADICAL MOUNTAIN"/* 2F2D */, /*12078*/"KANGXI RADICAL RIVER"/* 2F2E */,/*12079*/"KANGXI RADICAL WORK"/* 2F2F */, /*12080*/"KANGXI RADICAL ONESELF"/* 2F30 */,/*12081*/"KANGXI RADICAL TURBAN"/* 2F31 */, /*12082*/"KANGXI RADICAL DRY"/* 2F32 */,/*12083*/"KANGXI RADICAL SHORT THREAD"/* 2F33 */, /*12084*/"KANGXI RADICAL DOTTED CLIFF"/* 2F34 */,/*12085*/"KANGXI RADICAL LONG STRIDE"/* 2F35 */, /*12086*/"KANGXI RADICAL TWO HANDS"/* 2F36 */,/*12087*/"KANGXI RADICAL SHOOT"/* 2F37 */, /*12088*/"KANGXI RADICAL BOW"/* 2F38 */,/*12089*/"KANGXI RADICAL SNOUT"/* 2F39 */, /*12090*/"KANGXI RADICAL BRISTLE"/* 2F3A */,/*12091*/"KANGXI RADICAL STEP"/* 2F3B */, /*12092*/"KANGXI RADICAL HEART"/* 2F3C */,/*12093*/"KANGXI RADICAL HALBERD"/* 2F3D */, /*12094*/"KANGXI RADICAL DOOR"/* 2F3E */,/*12095*/"KANGXI RADICAL HAND"/* 2F3F */, /*12096*/"KANGXI RADICAL BRANCH"/* 2F40 */,/*12097*/"KANGXI RADICAL RAP"/* 2F41 */, /*12098*/"KANGXI RADICAL SCRIPT"/* 2F42 */,/*12099*/"KANGXI RADICAL DIPPER"/* 2F43 */, /*12100*/"KANGXI RADICAL AXE"/* 2F44 */,/*12101*/"KANGXI RADICAL SQUARE"/* 2F45 */, /*12102*/"KANGXI RADICAL NOT"/* 2F46 */,/*12103*/"KANGXI RADICAL SUN"/* 2F47 */,/*12104*/"KANGXI RADICAL SAY"/* 2F48 */, /*12105*/"KANGXI RADICAL MOON"/* 2F49 */,/*12106*/"KANGXI RADICAL TREE"/* 2F4A */, /*12107*/"KANGXI RADICAL LACK"/* 2F4B */,/*12108*/"KANGXI RADICAL STOP"/* 2F4C */, /*12109*/"KANGXI RADICAL DEATH"/* 2F4D */,/*12110*/"KANGXI RADICAL WEAPON"/* 2F4E */, /*12111*/"KANGXI RADICAL DO NOT"/* 2F4F */,/*12112*/"KANGXI RADICAL COMPARE"/* 2F50 */, /*12113*/"KANGXI RADICAL FUR"/* 2F51 */,/*12114*/"KANGXI RADICAL CLAN"/* 2F52 */, /*12115*/"KANGXI RADICAL STEAM"/* 2F53 */,/*12116*/"KANGXI RADICAL WATER"/* 2F54 */, /*12117*/"KANGXI RADICAL FIRE"/* 2F55 */,/*12118*/"KANGXI RADICAL CLAW"/* 2F56 */, /*12119*/"KANGXI RADICAL FATHER"/* 2F57 */,/*12120*/"KANGXI RADICAL DOUBLE X"/* 2F58 */, /*12121*/"KANGXI RADICAL HALF TREE TRUNK"/* 2F59 */,/*12122*/"KANGXI RADICAL SLICE"/* 2F5A */, /*12123*/"KANGXI RADICAL FANG"/* 2F5B */,/*12124*/"KANGXI RADICAL COW"/* 2F5C */,/*12125*/"KANGXI RADICAL DOG"/* 2F5D */, /*12126*/"KANGXI RADICAL PROFOUND"/* 2F5E */,/*12127*/"KANGXI RADICAL JADE"/* 2F5F */, /*12128*/"KANGXI RADICAL MELON"/* 2F60 */,/*12129*/"KANGXI RADICAL TILE"/* 2F61 */, /*12130*/"KANGXI RADICAL SWEET"/* 2F62 */,/*12131*/"KANGXI RADICAL LIFE"/* 2F63 */, /*12132*/"KANGXI RADICAL USE"/* 2F64 */,/*12133*/"KANGXI RADICAL FIELD"/* 2F65 */, /*12134*/"KANGXI RADICAL BOLT OF CLOTH"/* 2F66 */,/*12135*/"KANGXI RADICAL SICKNESS"/* 2F67 */, /*12136*/"KANGXI RADICAL DOTTED TENT"/* 2F68 */,/*12137*/"KANGXI RADICAL WHITE"/* 2F69 */, /*12138*/"KANGXI RADICAL SKIN"/* 2F6A */,/*12139*/"KANGXI RADICAL DISH"/* 2F6B */, /*12140*/"KANGXI RADICAL EYE"/* 2F6C */,/*12141*/"KANGXI RADICAL SPEAR"/* 2F6D */, /*12142*/"KANGXI RADICAL ARROW"/* 2F6E */,/*12143*/"KANGXI RADICAL STONE"/* 2F6F */, /*12144*/"KANGXI RADICAL SPIRIT"/* 2F70 */,/*12145*/"KANGXI RADICAL TRACK"/* 2F71 */, /*12146*/"KANGXI RADICAL GRAIN"/* 2F72 */,/*12147*/"KANGXI RADICAL CAVE"/* 2F73 */, /*12148*/"KANGXI RADICAL STAND"/* 2F74 */,/*12149*/"KANGXI RADICAL BAMBOO"/* 2F75 */, /*12150*/"KANGXI RADICAL RICE"/* 2F76 */,/*12151*/"KANGXI RADICAL SILK"/* 2F77 */, /*12152*/"KANGXI RADICAL JAR"/* 2F78 */,/*12153*/"KANGXI RADICAL NET"/* 2F79 */, /*12154*/"KANGXI RADICAL SHEEP"/* 2F7A */,/*12155*/"KANGXI RADICAL FEATHER"/* 2F7B */, /*12156*/"KANGXI RADICAL OLD"/* 2F7C */,/*12157*/"KANGXI RADICAL AND"/* 2F7D */,/*12158*/"KANGXI RADICAL PLOW"/* 2F7E */, /*12159*/"KANGXI RADICAL EAR"/* 2F7F */,/*12160*/"KANGXI RADICAL BRUSH"/* 2F80 */, /*12161*/"KANGXI RADICAL MEAT"/* 2F81 */,/*12162*/"KANGXI RADICAL MINISTER"/* 2F82 */, /*12163*/"KANGXI RADICAL SELF"/* 2F83 */,/*12164*/"KANGXI RADICAL ARRIVE"/* 2F84 */, /*12165*/"KANGXI RADICAL MORTAR"/* 2F85 */,/*12166*/"KANGXI RADICAL TONGUE"/* 2F86 */, /*12167*/"KANGXI RADICAL OPPOSE"/* 2F87 */,/*12168*/"KANGXI RADICAL BOAT"/* 2F88 */, /*12169*/"KANGXI RADICAL STOPPING"/* 2F89 */,/*12170*/"KANGXI RADICAL COLOR"/* 2F8A */, /*12171*/"KANGXI RADICAL GRASS"/* 2F8B */,/*12172*/"KANGXI RADICAL TIGER"/* 2F8C */, /*12173*/"KANGXI RADICAL INSECT"/* 2F8D */,/*12174*/"KANGXI RADICAL BLOOD"/* 2F8E */, /*12175*/"KANGXI RADICAL WALK ENCLOSURE"/* 2F8F */,/*12176*/"KANGXI RADICAL CLOTHES"/* 2F90 */, /*12177*/"KANGXI RADICAL WEST"/* 2F91 */,/*12178*/"KANGXI RADICAL SEE"/* 2F92 */, /*12179*/"KANGXI RADICAL HORN"/* 2F93 */,/*12180*/"KANGXI RADICAL SPEECH"/* 2F94 */, /*12181*/"KANGXI RADICAL VALLEY"/* 2F95 */,/*12182*/"KANGXI RADICAL BEAN"/* 2F96 */, /*12183*/"KANGXI RADICAL PIG"/* 2F97 */,/*12184*/"KANGXI RADICAL BADGER"/* 2F98 */, /*12185*/"KANGXI RADICAL SHELL"/* 2F99 */,/*12186*/"KANGXI RADICAL RED"/* 2F9A */, /*12187*/"KANGXI RADICAL RUN"/* 2F9B */,/*12188*/"KANGXI RADICAL FOOT"/* 2F9C */, /*12189*/"KANGXI RADICAL BODY"/* 2F9D */,/*12190*/"KANGXI RADICAL CART"/* 2F9E */, /*12191*/"KANGXI RADICAL BITTER"/* 2F9F */,/*12192*/"KANGXI RADICAL MORNING"/* 2FA0 */, /*12193*/"KANGXI RADICAL WALK"/* 2FA1 */,/*12194*/"KANGXI RADICAL CITY"/* 2FA2 */, /*12195*/"KANGXI RADICAL WINE"/* 2FA3 */,/*12196*/"KANGXI RADICAL DISTINGUISH"/* 2FA4 */, /*12197*/"KANGXI RADICAL VILLAGE"/* 2FA5 */,/*12198*/"KANGXI RADICAL GOLD"/* 2FA6 */, /*12199*/"KANGXI RADICAL LONG"/* 2FA7 */,/*12200*/"KANGXI RADICAL GATE"/* 2FA8 */, /*12201*/"KANGXI RADICAL MOUND"/* 2FA9 */,/*12202*/"KANGXI RADICAL SLAVE"/* 2FAA */, /*12203*/"KANGXI RADICAL SHORT TAILED BIRD"/* 2FAB */,/*12204*/"KANGXI RADICAL RAIN"/* 2FAC */, /*12205*/"KANGXI RADICAL BLUE"/* 2FAD */,/*12206*/"KANGXI RADICAL WRONG"/* 2FAE */, /*12207*/"KANGXI RADICAL FACE"/* 2FAF */,/*12208*/"KANGXI RADICAL LEATHER"/* 2FB0 */, /*12209*/"KANGXI RADICAL TANNED LEATHER"/* 2FB1 */,/*12210*/"KANGXI RADICAL LEEK"/* 2FB2 */, /*12211*/"KANGXI RADICAL SOUND"/* 2FB3 */,/*12212*/"KANGXI RADICAL LEAF"/* 2FB4 */, /*12213*/"KANGXI RADICAL WIND"/* 2FB5 */,/*12214*/"KANGXI RADICAL FLY"/* 2FB6 */,/*12215*/"KANGXI RADICAL EAT"/* 2FB7 */, /*12216*/"KANGXI RADICAL HEAD"/* 2FB8 */,/*12217*/"KANGXI RADICAL FRAGRANT"/* 2FB9 */, /*12218*/"KANGXI RADICAL HORSE"/* 2FBA */,/*12219*/"KANGXI RADICAL BONE"/* 2FBB */, /*12220*/"KANGXI RADICAL TALL"/* 2FBC */,/*12221*/"KANGXI RADICAL HAIR"/* 2FBD */, /*12222*/"KANGXI RADICAL FIGHT"/* 2FBE */,/*12223*/"KANGXI RADICAL SACRIFICIAL WINE"/* 2FBF */, /*12224*/"KANGXI RADICAL CAULDRON"/* 2FC0 */,/*12225*/"KANGXI RADICAL GHOST"/* 2FC1 */, /*12226*/"KANGXI RADICAL FISH"/* 2FC2 */,/*12227*/"KANGXI RADICAL BIRD"/* 2FC3 */, /*12228*/"KANGXI RADICAL SALT"/* 2FC4 */,/*12229*/"KANGXI RADICAL DEER"/* 2FC5 */, /*12230*/"KANGXI RADICAL WHEAT"/* 2FC6 */,/*12231*/"KANGXI RADICAL HEMP"/* 2FC7 */, /*12232*/"KANGXI RADICAL YELLOW"/* 2FC8 */,/*12233*/"KANGXI RADICAL MILLET"/* 2FC9 */, /*12234*/"KANGXI RADICAL BLACK"/* 2FCA */,/*12235*/"KANGXI RADICAL EMBROIDERY"/* 2FCB */, /*12236*/"KANGXI RADICAL FROG"/* 2FCC */,/*12237*/"KANGXI RADICAL TRIPOD"/* 2FCD */, /*12238*/"KANGXI RADICAL DRUM"/* 2FCE */,/*12239*/"KANGXI RADICAL RAT"/* 2FCF */, /*12240*/"KANGXI RADICAL NOSE"/* 2FD0 */,/*12241*/"KANGXI RADICAL EVEN"/* 2FD1 */, /*12242*/"KANGXI RADICAL TOOTH"/* 2FD2 */,/*12243*/"KANGXI RADICAL DRAGON"/* 2FD3 */, /*12244*/"KANGXI RADICAL TURTLE"/* 2FD4 */,/*12245*/"KANGXI RADICAL FLUTE"/* 2FD5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*12272*/"IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT"/* 2FF0 */, /*12273*/"IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW"/* 2FF1 */, /*12274*/"IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT"/* 2FF2 */, /*12275*/"IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW"/* 2FF3 */, /*12276*/"IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND"/* 2FF4 */, /*12277*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE"/* 2FF5 */, /*12278*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW"/* 2FF6 */, /*12279*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT"/* 2FF7 */, /*12280*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT"/* 2FF8 */, /*12281*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT"/* 2FF9 */, /*12282*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT"/* 2FFA */, /*12283*/"IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID"/* 2FFB */,NULL,NULL,NULL,NULL, /*12288*/"IDEOGRAPHIC SPACE"/* 3000 */,/*12289*/"IDEOGRAPHIC COMMA"/* 3001 */,/*12290*/"IDEOGRAPHIC FULL STOP"/* 3002 */, /*12291*/"DITTO MARK"/* 3003 */,/*12292*/"JAPANESE INDUSTRIAL STANDARD SYMBOL"/* 3004 */, /*12293*/"IDEOGRAPHIC ITERATION MARK"/* 3005 */,/*12294*/"IDEOGRAPHIC CLOSING MARK"/* 3006 */, /*12295*/"IDEOGRAPHIC NUMBER ZERO"/* 3007 */,/*12296*/"LEFT ANGLE BRACKET"/* 3008 */, /*12297*/"RIGHT ANGLE BRACKET"/* 3009 */,/*12298*/"LEFT DOUBLE ANGLE BRACKET"/* 300A */, /*12299*/"RIGHT DOUBLE ANGLE BRACKET"/* 300B */,/*12300*/"LEFT CORNER BRACKET"/* 300C */, /*12301*/"RIGHT CORNER BRACKET"/* 300D */,/*12302*/"LEFT WHITE CORNER BRACKET"/* 300E */, /*12303*/"RIGHT WHITE CORNER BRACKET"/* 300F */,/*12304*/"LEFT BLACK LENTICULAR BRACKET"/* 3010 */, /*12305*/"RIGHT BLACK LENTICULAR BRACKET"/* 3011 */,/*12306*/"POSTAL MARK"/* 3012 */,/*12307*/"GETA MARK"/* 3013 */, /*12308*/"LEFT TORTOISE SHELL BRACKET"/* 3014 */,/*12309*/"RIGHT TORTOISE SHELL BRACKET"/* 3015 */, /*12310*/"LEFT WHITE LENTICULAR BRACKET"/* 3016 */,/*12311*/"RIGHT WHITE LENTICULAR BRACKET"/* 3017 */, /*12312*/"LEFT WHITE TORTOISE SHELL BRACKET"/* 3018 */,/*12313*/"RIGHT WHITE TORTOISE SHELL BRACKET"/* 3019 */, /*12314*/"LEFT WHITE SQUARE BRACKET"/* 301A */,/*12315*/"RIGHT WHITE SQUARE BRACKET"/* 301B */, /*12316*/"WAVE DASH"/* 301C */,/*12317*/"REVERSED DOUBLE PRIME QUOTATION MARK"/* 301D */, /*12318*/"DOUBLE PRIME QUOTATION MARK"/* 301E */,/*12319*/"LOW DOUBLE PRIME QUOTATION MARK"/* 301F */, /*12320*/"POSTAL MARK FACE"/* 3020 */,/*12321*/"HANGZHOU NUMERAL ONE"/* 3021 */, /*12322*/"HANGZHOU NUMERAL TWO"/* 3022 */,/*12323*/"HANGZHOU NUMERAL THREE"/* 3023 */, /*12324*/"HANGZHOU NUMERAL FOUR"/* 3024 */,/*12325*/"HANGZHOU NUMERAL FIVE"/* 3025 */, /*12326*/"HANGZHOU NUMERAL SIX"/* 3026 */,/*12327*/"HANGZHOU NUMERAL SEVEN"/* 3027 */, /*12328*/"HANGZHOU NUMERAL EIGHT"/* 3028 */,/*12329*/"HANGZHOU NUMERAL NINE"/* 3029 */, /*12330*/"IDEOGRAPHIC LEVEL TONE MARK"/* 302A */,/*12331*/"IDEOGRAPHIC RISING TONE MARK"/* 302B */, /*12332*/"IDEOGRAPHIC DEPARTING TONE MARK"/* 302C */,/*12333*/"IDEOGRAPHIC ENTERING TONE MARK"/* 302D */, /*12334*/"HANGUL SINGLE DOT TONE MARK"/* 302E */,/*12335*/"HANGUL DOUBLE DOT TONE MARK"/* 302F */, /*12336*/"WAVY DASH"/* 3030 */,/*12337*/"VERTICAL KANA REPEAT MARK"/* 3031 */, /*12338*/"VERTICAL KANA REPEAT WITH VOICED SOUND MARK"/* 3032 */, /*12339*/"VERTICAL KANA REPEAT MARK UPPER HALF"/* 3033 */, /*12340*/"VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF"/* 3034 */, /*12341*/"VERTICAL KANA REPEAT MARK LOWER HALF"/* 3035 */,/*12342*/"CIRCLED POSTAL MARK"/* 3036 */, /*12343*/"IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL"/* 3037 */,/*12344*/"HANGZHOU NUMERAL TEN"/* 3038 */, /*12345*/"HANGZHOU NUMERAL TWENTY"/* 3039 */,/*12346*/"HANGZHOU NUMERAL THIRTY"/* 303A */, /*12347*/"VERTICAL IDEOGRAPHIC ITERATION MARK"/* 303B */,/*12348*/"MASU MARK"/* 303C */, /*12349*/"PART ALTERNATION MARK"/* 303D */,/*12350*/"IDEOGRAPHIC VARIATION INDICATOR"/* 303E */, /*12351*/"IDEOGRAPHIC HALF FILL SPACE"/* 303F */,NULL,/*12353*/"HIRAGANA LETTER SMALL A"/* 3041 */, /*12354*/"HIRAGANA LETTER A"/* 3042 */,/*12355*/"HIRAGANA LETTER SMALL I"/* 3043 */, /*12356*/"HIRAGANA LETTER I"/* 3044 */,/*12357*/"HIRAGANA LETTER SMALL U"/* 3045 */, /*12358*/"HIRAGANA LETTER U"/* 3046 */,/*12359*/"HIRAGANA LETTER SMALL E"/* 3047 */, /*12360*/"HIRAGANA LETTER E"/* 3048 */,/*12361*/"HIRAGANA LETTER SMALL O"/* 3049 */, /*12362*/"HIRAGANA LETTER O"/* 304A */,/*12363*/"HIRAGANA LETTER KA"/* 304B */,/*12364*/"HIRAGANA LETTER GA"/* 304C */, /*12365*/"HIRAGANA LETTER KI"/* 304D */,/*12366*/"HIRAGANA LETTER GI"/* 304E */,/*12367*/"HIRAGANA LETTER KU"/* 304F */, /*12368*/"HIRAGANA LETTER GU"/* 3050 */,/*12369*/"HIRAGANA LETTER KE"/* 3051 */,/*12370*/"HIRAGANA LETTER GE"/* 3052 */, /*12371*/"HIRAGANA LETTER KO"/* 3053 */,/*12372*/"HIRAGANA LETTER GO"/* 3054 */,/*12373*/"HIRAGANA LETTER SA"/* 3055 */, /*12374*/"HIRAGANA LETTER ZA"/* 3056 */,/*12375*/"HIRAGANA LETTER SI"/* 3057 */,/*12376*/"HIRAGANA LETTER ZI"/* 3058 */, /*12377*/"HIRAGANA LETTER SU"/* 3059 */,/*12378*/"HIRAGANA LETTER ZU"/* 305A */,/*12379*/"HIRAGANA LETTER SE"/* 305B */, /*12380*/"HIRAGANA LETTER ZE"/* 305C */,/*12381*/"HIRAGANA LETTER SO"/* 305D */,/*12382*/"HIRAGANA LETTER ZO"/* 305E */, /*12383*/"HIRAGANA LETTER TA"/* 305F */,/*12384*/"HIRAGANA LETTER DA"/* 3060 */,/*12385*/"HIRAGANA LETTER TI"/* 3061 */, /*12386*/"HIRAGANA LETTER DI"/* 3062 */,/*12387*/"HIRAGANA LETTER SMALL TU"/* 3063 */, /*12388*/"HIRAGANA LETTER TU"/* 3064 */,/*12389*/"HIRAGANA LETTER DU"/* 3065 */,/*12390*/"HIRAGANA LETTER TE"/* 3066 */, /*12391*/"HIRAGANA LETTER DE"/* 3067 */,/*12392*/"HIRAGANA LETTER TO"/* 3068 */,/*12393*/"HIRAGANA LETTER DO"/* 3069 */, /*12394*/"HIRAGANA LETTER NA"/* 306A */,/*12395*/"HIRAGANA LETTER NI"/* 306B */,/*12396*/"HIRAGANA LETTER NU"/* 306C */, /*12397*/"HIRAGANA LETTER NE"/* 306D */,/*12398*/"HIRAGANA LETTER NO"/* 306E */,/*12399*/"HIRAGANA LETTER HA"/* 306F */, /*12400*/"HIRAGANA LETTER BA"/* 3070 */,/*12401*/"HIRAGANA LETTER PA"/* 3071 */,/*12402*/"HIRAGANA LETTER HI"/* 3072 */, /*12403*/"HIRAGANA LETTER BI"/* 3073 */,/*12404*/"HIRAGANA LETTER PI"/* 3074 */,/*12405*/"HIRAGANA LETTER HU"/* 3075 */, /*12406*/"HIRAGANA LETTER BU"/* 3076 */,/*12407*/"HIRAGANA LETTER PU"/* 3077 */,/*12408*/"HIRAGANA LETTER HE"/* 3078 */, /*12409*/"HIRAGANA LETTER BE"/* 3079 */,/*12410*/"HIRAGANA LETTER PE"/* 307A */,/*12411*/"HIRAGANA LETTER HO"/* 307B */, /*12412*/"HIRAGANA LETTER BO"/* 307C */,/*12413*/"HIRAGANA LETTER PO"/* 307D */,/*12414*/"HIRAGANA LETTER MA"/* 307E */, /*12415*/"HIRAGANA LETTER MI"/* 307F */,/*12416*/"HIRAGANA LETTER MU"/* 3080 */,/*12417*/"HIRAGANA LETTER ME"/* 3081 */, /*12418*/"HIRAGANA LETTER MO"/* 3082 */,/*12419*/"HIRAGANA LETTER SMALL YA"/* 3083 */, /*12420*/"HIRAGANA LETTER YA"/* 3084 */,/*12421*/"HIRAGANA LETTER SMALL YU"/* 3085 */, /*12422*/"HIRAGANA LETTER YU"/* 3086 */,/*12423*/"HIRAGANA LETTER SMALL YO"/* 3087 */, /*12424*/"HIRAGANA LETTER YO"/* 3088 */,/*12425*/"HIRAGANA LETTER RA"/* 3089 */,/*12426*/"HIRAGANA LETTER RI"/* 308A */, /*12427*/"HIRAGANA LETTER RU"/* 308B */,/*12428*/"HIRAGANA LETTER RE"/* 308C */,/*12429*/"HIRAGANA LETTER RO"/* 308D */, /*12430*/"HIRAGANA LETTER SMALL WA"/* 308E */,/*12431*/"HIRAGANA LETTER WA"/* 308F */, /*12432*/"HIRAGANA LETTER WI"/* 3090 */,/*12433*/"HIRAGANA LETTER WE"/* 3091 */,/*12434*/"HIRAGANA LETTER WO"/* 3092 */, /*12435*/"HIRAGANA LETTER N"/* 3093 */,/*12436*/"HIRAGANA LETTER VU"/* 3094 */, /*12437*/"HIRAGANA LETTER SMALL KA"/* 3095 */,/*12438*/"HIRAGANA LETTER SMALL KE"/* 3096 */,NULL,NULL, /*12441*/"COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK"/* 3099 */, /*12442*/"COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"/* 309A */, /*12443*/"KATAKANA-HIRAGANA VOICED SOUND MARK"/* 309B */,/*12444*/"KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"/* 309C */, /*12445*/"HIRAGANA ITERATION MARK"/* 309D */,/*12446*/"HIRAGANA VOICED ITERATION MARK"/* 309E */, /*12447*/"HIRAGANA DIGRAPH YORI"/* 309F */,/*12448*/"KATAKANA-HIRAGANA DOUBLE HYPHEN"/* 30A0 */, /*12449*/"KATAKANA LETTER SMALL A"/* 30A1 */,/*12450*/"KATAKANA LETTER A"/* 30A2 */, /*12451*/"KATAKANA LETTER SMALL I"/* 30A3 */,/*12452*/"KATAKANA LETTER I"/* 30A4 */, /*12453*/"KATAKANA LETTER SMALL U"/* 30A5 */,/*12454*/"KATAKANA LETTER U"/* 30A6 */, /*12455*/"KATAKANA LETTER SMALL E"/* 30A7 */,/*12456*/"KATAKANA LETTER E"/* 30A8 */, /*12457*/"KATAKANA LETTER SMALL O"/* 30A9 */,/*12458*/"KATAKANA LETTER O"/* 30AA */, /*12459*/"KATAKANA LETTER KA"/* 30AB */,/*12460*/"KATAKANA LETTER GA"/* 30AC */,/*12461*/"KATAKANA LETTER KI"/* 30AD */, /*12462*/"KATAKANA LETTER GI"/* 30AE */,/*12463*/"KATAKANA LETTER KU"/* 30AF */,/*12464*/"KATAKANA LETTER GU"/* 30B0 */, /*12465*/"KATAKANA LETTER KE"/* 30B1 */,/*12466*/"KATAKANA LETTER GE"/* 30B2 */,/*12467*/"KATAKANA LETTER KO"/* 30B3 */, /*12468*/"KATAKANA LETTER GO"/* 30B4 */,/*12469*/"KATAKANA LETTER SA"/* 30B5 */,/*12470*/"KATAKANA LETTER ZA"/* 30B6 */, /*12471*/"KATAKANA LETTER SI"/* 30B7 */,/*12472*/"KATAKANA LETTER ZI"/* 30B8 */,/*12473*/"KATAKANA LETTER SU"/* 30B9 */, /*12474*/"KATAKANA LETTER ZU"/* 30BA */,/*12475*/"KATAKANA LETTER SE"/* 30BB */,/*12476*/"KATAKANA LETTER ZE"/* 30BC */, /*12477*/"KATAKANA LETTER SO"/* 30BD */,/*12478*/"KATAKANA LETTER ZO"/* 30BE */,/*12479*/"KATAKANA LETTER TA"/* 30BF */, /*12480*/"KATAKANA LETTER DA"/* 30C0 */,/*12481*/"KATAKANA LETTER TI"/* 30C1 */,/*12482*/"KATAKANA LETTER DI"/* 30C2 */, /*12483*/"KATAKANA LETTER SMALL TU"/* 30C3 */,/*12484*/"KATAKANA LETTER TU"/* 30C4 */, /*12485*/"KATAKANA LETTER DU"/* 30C5 */,/*12486*/"KATAKANA LETTER TE"/* 30C6 */,/*12487*/"KATAKANA LETTER DE"/* 30C7 */, /*12488*/"KATAKANA LETTER TO"/* 30C8 */,/*12489*/"KATAKANA LETTER DO"/* 30C9 */,/*12490*/"KATAKANA LETTER NA"/* 30CA */, /*12491*/"KATAKANA LETTER NI"/* 30CB */,/*12492*/"KATAKANA LETTER NU"/* 30CC */,/*12493*/"KATAKANA LETTER NE"/* 30CD */, /*12494*/"KATAKANA LETTER NO"/* 30CE */,/*12495*/"KATAKANA LETTER HA"/* 30CF */,/*12496*/"KATAKANA LETTER BA"/* 30D0 */, /*12497*/"KATAKANA LETTER PA"/* 30D1 */,/*12498*/"KATAKANA LETTER HI"/* 30D2 */,/*12499*/"KATAKANA LETTER BI"/* 30D3 */, /*12500*/"KATAKANA LETTER PI"/* 30D4 */,/*12501*/"KATAKANA LETTER HU"/* 30D5 */,/*12502*/"KATAKANA LETTER BU"/* 30D6 */, /*12503*/"KATAKANA LETTER PU"/* 30D7 */,/*12504*/"KATAKANA LETTER HE"/* 30D8 */,/*12505*/"KATAKANA LETTER BE"/* 30D9 */, /*12506*/"KATAKANA LETTER PE"/* 30DA */,/*12507*/"KATAKANA LETTER HO"/* 30DB */,/*12508*/"KATAKANA LETTER BO"/* 30DC */, /*12509*/"KATAKANA LETTER PO"/* 30DD */,/*12510*/"KATAKANA LETTER MA"/* 30DE */,/*12511*/"KATAKANA LETTER MI"/* 30DF */, /*12512*/"KATAKANA LETTER MU"/* 30E0 */,/*12513*/"KATAKANA LETTER ME"/* 30E1 */,/*12514*/"KATAKANA LETTER MO"/* 30E2 */, /*12515*/"KATAKANA LETTER SMALL YA"/* 30E3 */,/*12516*/"KATAKANA LETTER YA"/* 30E4 */, /*12517*/"KATAKANA LETTER SMALL YU"/* 30E5 */,/*12518*/"KATAKANA LETTER YU"/* 30E6 */, /*12519*/"KATAKANA LETTER SMALL YO"/* 30E7 */,/*12520*/"KATAKANA LETTER YO"/* 30E8 */, /*12521*/"KATAKANA LETTER RA"/* 30E9 */,/*12522*/"KATAKANA LETTER RI"/* 30EA */,/*12523*/"KATAKANA LETTER RU"/* 30EB */, /*12524*/"KATAKANA LETTER RE"/* 30EC */,/*12525*/"KATAKANA LETTER RO"/* 30ED */, /*12526*/"KATAKANA LETTER SMALL WA"/* 30EE */,/*12527*/"KATAKANA LETTER WA"/* 30EF */, /*12528*/"KATAKANA LETTER WI"/* 30F0 */,/*12529*/"KATAKANA LETTER WE"/* 30F1 */,/*12530*/"KATAKANA LETTER WO"/* 30F2 */, /*12531*/"KATAKANA LETTER N"/* 30F3 */,/*12532*/"KATAKANA LETTER VU"/* 30F4 */, /*12533*/"KATAKANA LETTER SMALL KA"/* 30F5 */,/*12534*/"KATAKANA LETTER SMALL KE"/* 30F6 */, /*12535*/"KATAKANA LETTER VA"/* 30F7 */,/*12536*/"KATAKANA LETTER VI"/* 30F8 */,/*12537*/"KATAKANA LETTER VE"/* 30F9 */, /*12538*/"KATAKANA LETTER VO"/* 30FA */,/*12539*/"KATAKANA MIDDLE DOT"/* 30FB */, /*12540*/"KATAKANA-HIRAGANA PROLONGED SOUND MARK"/* 30FC */,/*12541*/"KATAKANA ITERATION MARK"/* 30FD */, /*12542*/"KATAKANA VOICED ITERATION MARK"/* 30FE */,/*12543*/"KATAKANA DIGRAPH KOTO"/* 30FF */,NULL,NULL,NULL,NULL,NULL, /*12549*/"BOPOMOFO LETTER B"/* 3105 */,/*12550*/"BOPOMOFO LETTER P"/* 3106 */,/*12551*/"BOPOMOFO LETTER M"/* 3107 */, /*12552*/"BOPOMOFO LETTER F"/* 3108 */,/*12553*/"BOPOMOFO LETTER D"/* 3109 */,/*12554*/"BOPOMOFO LETTER T"/* 310A */, /*12555*/"BOPOMOFO LETTER N"/* 310B */,/*12556*/"BOPOMOFO LETTER L"/* 310C */,/*12557*/"BOPOMOFO LETTER G"/* 310D */, /*12558*/"BOPOMOFO LETTER K"/* 310E */,/*12559*/"BOPOMOFO LETTER H"/* 310F */,/*12560*/"BOPOMOFO LETTER J"/* 3110 */, /*12561*/"BOPOMOFO LETTER Q"/* 3111 */,/*12562*/"BOPOMOFO LETTER X"/* 3112 */,/*12563*/"BOPOMOFO LETTER ZH"/* 3113 */, /*12564*/"BOPOMOFO LETTER CH"/* 3114 */,/*12565*/"BOPOMOFO LETTER SH"/* 3115 */,/*12566*/"BOPOMOFO LETTER R"/* 3116 */, /*12567*/"BOPOMOFO LETTER Z"/* 3117 */,/*12568*/"BOPOMOFO LETTER C"/* 3118 */,/*12569*/"BOPOMOFO LETTER S"/* 3119 */, /*12570*/"BOPOMOFO LETTER A"/* 311A */,/*12571*/"BOPOMOFO LETTER O"/* 311B */,/*12572*/"BOPOMOFO LETTER E"/* 311C */, /*12573*/"BOPOMOFO LETTER EH"/* 311D */,/*12574*/"BOPOMOFO LETTER AI"/* 311E */,/*12575*/"BOPOMOFO LETTER EI"/* 311F */, /*12576*/"BOPOMOFO LETTER AU"/* 3120 */,/*12577*/"BOPOMOFO LETTER OU"/* 3121 */,/*12578*/"BOPOMOFO LETTER AN"/* 3122 */, /*12579*/"BOPOMOFO LETTER EN"/* 3123 */,/*12580*/"BOPOMOFO LETTER ANG"/* 3124 */, /*12581*/"BOPOMOFO LETTER ENG"/* 3125 */,/*12582*/"BOPOMOFO LETTER ER"/* 3126 */,/*12583*/"BOPOMOFO LETTER I"/* 3127 */, /*12584*/"BOPOMOFO LETTER U"/* 3128 */,/*12585*/"BOPOMOFO LETTER IU"/* 3129 */,/*12586*/"BOPOMOFO LETTER V"/* 312A */, /*12587*/"BOPOMOFO LETTER NG"/* 312B */,/*12588*/"BOPOMOFO LETTER GN"/* 312C */,/*12589*/"BOPOMOFO LETTER IH"/* 312D */, NULL,NULL,NULL,/*12593*/"HANGUL LETTER KIYEOK"/* 3131 */,/*12594*/"HANGUL LETTER SSANGKIYEOK"/* 3132 */, /*12595*/"HANGUL LETTER KIYEOK-SIOS"/* 3133 */,/*12596*/"HANGUL LETTER NIEUN"/* 3134 */, /*12597*/"HANGUL LETTER NIEUN-CIEUC"/* 3135 */,/*12598*/"HANGUL LETTER NIEUN-HIEUH"/* 3136 */, /*12599*/"HANGUL LETTER TIKEUT"/* 3137 */,/*12600*/"HANGUL LETTER SSANGTIKEUT"/* 3138 */, /*12601*/"HANGUL LETTER RIEUL"/* 3139 */,/*12602*/"HANGUL LETTER RIEUL-KIYEOK"/* 313A */, /*12603*/"HANGUL LETTER RIEUL-MIEUM"/* 313B */,/*12604*/"HANGUL LETTER RIEUL-PIEUP"/* 313C */, /*12605*/"HANGUL LETTER RIEUL-SIOS"/* 313D */,/*12606*/"HANGUL LETTER RIEUL-THIEUTH"/* 313E */, /*12607*/"HANGUL LETTER RIEUL-PHIEUPH"/* 313F */,/*12608*/"HANGUL LETTER RIEUL-HIEUH"/* 3140 */, /*12609*/"HANGUL LETTER MIEUM"/* 3141 */,/*12610*/"HANGUL LETTER PIEUP"/* 3142 */, /*12611*/"HANGUL LETTER SSANGPIEUP"/* 3143 */,/*12612*/"HANGUL LETTER PIEUP-SIOS"/* 3144 */, /*12613*/"HANGUL LETTER SIOS"/* 3145 */,/*12614*/"HANGUL LETTER SSANGSIOS"/* 3146 */, /*12615*/"HANGUL LETTER IEUNG"/* 3147 */,/*12616*/"HANGUL LETTER CIEUC"/* 3148 */, /*12617*/"HANGUL LETTER SSANGCIEUC"/* 3149 */,/*12618*/"HANGUL LETTER CHIEUCH"/* 314A */, /*12619*/"HANGUL LETTER KHIEUKH"/* 314B */,/*12620*/"HANGUL LETTER THIEUTH"/* 314C */, /*12621*/"HANGUL LETTER PHIEUPH"/* 314D */,/*12622*/"HANGUL LETTER HIEUH"/* 314E */,/*12623*/"HANGUL LETTER A"/* 314F */, /*12624*/"HANGUL LETTER AE"/* 3150 */,/*12625*/"HANGUL LETTER YA"/* 3151 */,/*12626*/"HANGUL LETTER YAE"/* 3152 */, /*12627*/"HANGUL LETTER EO"/* 3153 */,/*12628*/"HANGUL LETTER E"/* 3154 */,/*12629*/"HANGUL LETTER YEO"/* 3155 */, /*12630*/"HANGUL LETTER YE"/* 3156 */,/*12631*/"HANGUL LETTER O"/* 3157 */,/*12632*/"HANGUL LETTER WA"/* 3158 */, /*12633*/"HANGUL LETTER WAE"/* 3159 */,/*12634*/"HANGUL LETTER OE"/* 315A */,/*12635*/"HANGUL LETTER YO"/* 315B */, /*12636*/"HANGUL LETTER U"/* 315C */,/*12637*/"HANGUL LETTER WEO"/* 315D */,/*12638*/"HANGUL LETTER WE"/* 315E */, /*12639*/"HANGUL LETTER WI"/* 315F */,/*12640*/"HANGUL LETTER YU"/* 3160 */,/*12641*/"HANGUL LETTER EU"/* 3161 */, /*12642*/"HANGUL LETTER YI"/* 3162 */,/*12643*/"HANGUL LETTER I"/* 3163 */,/*12644*/"HANGUL FILLER"/* 3164 */, /*12645*/"HANGUL LETTER SSANGNIEUN"/* 3165 */,/*12646*/"HANGUL LETTER NIEUN-TIKEUT"/* 3166 */, /*12647*/"HANGUL LETTER NIEUN-SIOS"/* 3167 */,/*12648*/"HANGUL LETTER NIEUN-PANSIOS"/* 3168 */, /*12649*/"HANGUL LETTER RIEUL-KIYEOK-SIOS"/* 3169 */,/*12650*/"HANGUL LETTER RIEUL-TIKEUT"/* 316A */, /*12651*/"HANGUL LETTER RIEUL-PIEUP-SIOS"/* 316B */,/*12652*/"HANGUL LETTER RIEUL-PANSIOS"/* 316C */, /*12653*/"HANGUL LETTER RIEUL-YEORINHIEUH"/* 316D */,/*12654*/"HANGUL LETTER MIEUM-PIEUP"/* 316E */, /*12655*/"HANGUL LETTER MIEUM-SIOS"/* 316F */,/*12656*/"HANGUL LETTER MIEUM-PANSIOS"/* 3170 */, /*12657*/"HANGUL LETTER KAPYEOUNMIEUM"/* 3171 */,/*12658*/"HANGUL LETTER PIEUP-KIYEOK"/* 3172 */, /*12659*/"HANGUL LETTER PIEUP-TIKEUT"/* 3173 */,/*12660*/"HANGUL LETTER PIEUP-SIOS-KIYEOK"/* 3174 */, /*12661*/"HANGUL LETTER PIEUP-SIOS-TIKEUT"/* 3175 */,/*12662*/"HANGUL LETTER PIEUP-CIEUC"/* 3176 */, /*12663*/"HANGUL LETTER PIEUP-THIEUTH"/* 3177 */,/*12664*/"HANGUL LETTER KAPYEOUNPIEUP"/* 3178 */, /*12665*/"HANGUL LETTER KAPYEOUNSSANGPIEUP"/* 3179 */,/*12666*/"HANGUL LETTER SIOS-KIYEOK"/* 317A */, /*12667*/"HANGUL LETTER SIOS-NIEUN"/* 317B */,/*12668*/"HANGUL LETTER SIOS-TIKEUT"/* 317C */, /*12669*/"HANGUL LETTER SIOS-PIEUP"/* 317D */,/*12670*/"HANGUL LETTER SIOS-CIEUC"/* 317E */, /*12671*/"HANGUL LETTER PANSIOS"/* 317F */,/*12672*/"HANGUL LETTER SSANGIEUNG"/* 3180 */, /*12673*/"HANGUL LETTER YESIEUNG"/* 3181 */,/*12674*/"HANGUL LETTER YESIEUNG-SIOS"/* 3182 */, /*12675*/"HANGUL LETTER YESIEUNG-PANSIOS"/* 3183 */,/*12676*/"HANGUL LETTER KAPYEOUNPHIEUPH"/* 3184 */, /*12677*/"HANGUL LETTER SSANGHIEUH"/* 3185 */,/*12678*/"HANGUL LETTER YEORINHIEUH"/* 3186 */, /*12679*/"HANGUL LETTER YO-YA"/* 3187 */,/*12680*/"HANGUL LETTER YO-YAE"/* 3188 */, /*12681*/"HANGUL LETTER YO-I"/* 3189 */,/*12682*/"HANGUL LETTER YU-YEO"/* 318A */, /*12683*/"HANGUL LETTER YU-YE"/* 318B */,/*12684*/"HANGUL LETTER YU-I"/* 318C */, /*12685*/"HANGUL LETTER ARAEA"/* 318D */,/*12686*/"HANGUL LETTER ARAEAE"/* 318E */,NULL, /*12688*/"IDEOGRAPHIC ANNOTATION LINKING MARK"/* 3190 */,/*12689*/"IDEOGRAPHIC ANNOTATION REVERSE MARK"/* 3191 */, /*12690*/"IDEOGRAPHIC ANNOTATION ONE MARK"/* 3192 */,/*12691*/"IDEOGRAPHIC ANNOTATION TWO MARK"/* 3193 */, /*12692*/"IDEOGRAPHIC ANNOTATION THREE MARK"/* 3194 */,/*12693*/"IDEOGRAPHIC ANNOTATION FOUR MARK"/* 3195 */, /*12694*/"IDEOGRAPHIC ANNOTATION TOP MARK"/* 3196 */,/*12695*/"IDEOGRAPHIC ANNOTATION MIDDLE MARK"/* 3197 */, /*12696*/"IDEOGRAPHIC ANNOTATION BOTTOM MARK"/* 3198 */,/*12697*/"IDEOGRAPHIC ANNOTATION FIRST MARK"/* 3199 */, /*12698*/"IDEOGRAPHIC ANNOTATION SECOND MARK"/* 319A */,/*12699*/"IDEOGRAPHIC ANNOTATION THIRD MARK"/* 319B */, /*12700*/"IDEOGRAPHIC ANNOTATION FOURTH MARK"/* 319C */,/*12701*/"IDEOGRAPHIC ANNOTATION HEAVEN MARK"/* 319D */, /*12702*/"IDEOGRAPHIC ANNOTATION EARTH MARK"/* 319E */,/*12703*/"IDEOGRAPHIC ANNOTATION MAN MARK"/* 319F */, /*12704*/"BOPOMOFO LETTER BU"/* 31A0 */,/*12705*/"BOPOMOFO LETTER ZI"/* 31A1 */,/*12706*/"BOPOMOFO LETTER JI"/* 31A2 */, /*12707*/"BOPOMOFO LETTER GU"/* 31A3 */,/*12708*/"BOPOMOFO LETTER EE"/* 31A4 */,/*12709*/"BOPOMOFO LETTER ENN"/* 31A5 */, /*12710*/"BOPOMOFO LETTER OO"/* 31A6 */,/*12711*/"BOPOMOFO LETTER ONN"/* 31A7 */,/*12712*/"BOPOMOFO LETTER IR"/* 31A8 */, /*12713*/"BOPOMOFO LETTER ANN"/* 31A9 */,/*12714*/"BOPOMOFO LETTER INN"/* 31AA */, /*12715*/"BOPOMOFO LETTER UNN"/* 31AB */,/*12716*/"BOPOMOFO LETTER IM"/* 31AC */, /*12717*/"BOPOMOFO LETTER NGG"/* 31AD */,/*12718*/"BOPOMOFO LETTER AINN"/* 31AE */, /*12719*/"BOPOMOFO LETTER AUNN"/* 31AF */,/*12720*/"BOPOMOFO LETTER AM"/* 31B0 */, /*12721*/"BOPOMOFO LETTER OM"/* 31B1 */,/*12722*/"BOPOMOFO LETTER ONG"/* 31B2 */, /*12723*/"BOPOMOFO LETTER INNN"/* 31B3 */,/*12724*/"BOPOMOFO FINAL LETTER P"/* 31B4 */, /*12725*/"BOPOMOFO FINAL LETTER T"/* 31B5 */,/*12726*/"BOPOMOFO FINAL LETTER K"/* 31B6 */, /*12727*/"BOPOMOFO FINAL LETTER H"/* 31B7 */,/*12728*/"BOPOMOFO LETTER GH"/* 31B8 */, /*12729*/"BOPOMOFO LETTER LH"/* 31B9 */,/*12730*/"BOPOMOFO LETTER ZY"/* 31BA */,NULL,NULL,NULL,NULL,NULL, /*12736*/"CJK STROKE T"/* 31C0 */,/*12737*/"CJK STROKE WG"/* 31C1 */,/*12738*/"CJK STROKE XG"/* 31C2 */, /*12739*/"CJK STROKE BXG"/* 31C3 */,/*12740*/"CJK STROKE SW"/* 31C4 */,/*12741*/"CJK STROKE HZZ"/* 31C5 */, /*12742*/"CJK STROKE HZG"/* 31C6 */,/*12743*/"CJK STROKE HP"/* 31C7 */,/*12744*/"CJK STROKE HZWG"/* 31C8 */, /*12745*/"CJK STROKE SZWG"/* 31C9 */,/*12746*/"CJK STROKE HZT"/* 31CA */,/*12747*/"CJK STROKE HZZP"/* 31CB */, /*12748*/"CJK STROKE HPWG"/* 31CC */,/*12749*/"CJK STROKE HZW"/* 31CD */,/*12750*/"CJK STROKE HZZZ"/* 31CE */, /*12751*/"CJK STROKE N"/* 31CF */,/*12752*/"CJK STROKE H"/* 31D0 */,/*12753*/"CJK STROKE S"/* 31D1 */, /*12754*/"CJK STROKE P"/* 31D2 */,/*12755*/"CJK STROKE SP"/* 31D3 */,/*12756*/"CJK STROKE D"/* 31D4 */, /*12757*/"CJK STROKE HZ"/* 31D5 */,/*12758*/"CJK STROKE HG"/* 31D6 */,/*12759*/"CJK STROKE SZ"/* 31D7 */, /*12760*/"CJK STROKE SWZ"/* 31D8 */,/*12761*/"CJK STROKE ST"/* 31D9 */,/*12762*/"CJK STROKE SG"/* 31DA */, /*12763*/"CJK STROKE PD"/* 31DB */,/*12764*/"CJK STROKE PZ"/* 31DC */,/*12765*/"CJK STROKE TN"/* 31DD */, /*12766*/"CJK STROKE SZZ"/* 31DE */,/*12767*/"CJK STROKE SWG"/* 31DF */,/*12768*/"CJK STROKE HXWG"/* 31E0 */, /*12769*/"CJK STROKE HZZZG"/* 31E1 */,/*12770*/"CJK STROKE PG"/* 31E2 */,/*12771*/"CJK STROKE Q"/* 31E3 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*12784*/"KATAKANA LETTER SMALL KU"/* 31F0 */, /*12785*/"KATAKANA LETTER SMALL SI"/* 31F1 */,/*12786*/"KATAKANA LETTER SMALL SU"/* 31F2 */, /*12787*/"KATAKANA LETTER SMALL TO"/* 31F3 */,/*12788*/"KATAKANA LETTER SMALL NU"/* 31F4 */, /*12789*/"KATAKANA LETTER SMALL HA"/* 31F5 */,/*12790*/"KATAKANA LETTER SMALL HI"/* 31F6 */, /*12791*/"KATAKANA LETTER SMALL HU"/* 31F7 */,/*12792*/"KATAKANA LETTER SMALL HE"/* 31F8 */, /*12793*/"KATAKANA LETTER SMALL HO"/* 31F9 */,/*12794*/"KATAKANA LETTER SMALL MU"/* 31FA */, /*12795*/"KATAKANA LETTER SMALL RA"/* 31FB */,/*12796*/"KATAKANA LETTER SMALL RI"/* 31FC */, /*12797*/"KATAKANA LETTER SMALL RU"/* 31FD */,/*12798*/"KATAKANA LETTER SMALL RE"/* 31FE */, /*12799*/"KATAKANA LETTER SMALL RO"/* 31FF */,/*12800*/"PARENTHESIZED HANGUL KIYEOK"/* 3200 */, /*12801*/"PARENTHESIZED HANGUL NIEUN"/* 3201 */,/*12802*/"PARENTHESIZED HANGUL TIKEUT"/* 3202 */, /*12803*/"PARENTHESIZED HANGUL RIEUL"/* 3203 */,/*12804*/"PARENTHESIZED HANGUL MIEUM"/* 3204 */, /*12805*/"PARENTHESIZED HANGUL PIEUP"/* 3205 */,/*12806*/"PARENTHESIZED HANGUL SIOS"/* 3206 */, /*12807*/"PARENTHESIZED HANGUL IEUNG"/* 3207 */,/*12808*/"PARENTHESIZED HANGUL CIEUC"/* 3208 */, /*12809*/"PARENTHESIZED HANGUL CHIEUCH"/* 3209 */,/*12810*/"PARENTHESIZED HANGUL KHIEUKH"/* 320A */, /*12811*/"PARENTHESIZED HANGUL THIEUTH"/* 320B */,/*12812*/"PARENTHESIZED HANGUL PHIEUPH"/* 320C */, /*12813*/"PARENTHESIZED HANGUL HIEUH"/* 320D */,/*12814*/"PARENTHESIZED HANGUL KIYEOK A"/* 320E */, /*12815*/"PARENTHESIZED HANGUL NIEUN A"/* 320F */,/*12816*/"PARENTHESIZED HANGUL TIKEUT A"/* 3210 */, /*12817*/"PARENTHESIZED HANGUL RIEUL A"/* 3211 */,/*12818*/"PARENTHESIZED HANGUL MIEUM A"/* 3212 */, /*12819*/"PARENTHESIZED HANGUL PIEUP A"/* 3213 */,/*12820*/"PARENTHESIZED HANGUL SIOS A"/* 3214 */, /*12821*/"PARENTHESIZED HANGUL IEUNG A"/* 3215 */,/*12822*/"PARENTHESIZED HANGUL CIEUC A"/* 3216 */, /*12823*/"PARENTHESIZED HANGUL CHIEUCH A"/* 3217 */,/*12824*/"PARENTHESIZED HANGUL KHIEUKH A"/* 3218 */, /*12825*/"PARENTHESIZED HANGUL THIEUTH A"/* 3219 */,/*12826*/"PARENTHESIZED HANGUL PHIEUPH A"/* 321A */, /*12827*/"PARENTHESIZED HANGUL HIEUH A"/* 321B */,/*12828*/"PARENTHESIZED HANGUL CIEUC U"/* 321C */, /*12829*/"PARENTHESIZED KOREAN CHARACTER OJEON"/* 321D */,/*12830*/"PARENTHESIZED KOREAN CHARACTER O HU"/* 321E */,NULL, /*12832*/"PARENTHESIZED IDEOGRAPH ONE"/* 3220 */,/*12833*/"PARENTHESIZED IDEOGRAPH TWO"/* 3221 */, /*12834*/"PARENTHESIZED IDEOGRAPH THREE"/* 3222 */,/*12835*/"PARENTHESIZED IDEOGRAPH FOUR"/* 3223 */, /*12836*/"PARENTHESIZED IDEOGRAPH FIVE"/* 3224 */,/*12837*/"PARENTHESIZED IDEOGRAPH SIX"/* 3225 */, /*12838*/"PARENTHESIZED IDEOGRAPH SEVEN"/* 3226 */,/*12839*/"PARENTHESIZED IDEOGRAPH EIGHT"/* 3227 */, /*12840*/"PARENTHESIZED IDEOGRAPH NINE"/* 3228 */,/*12841*/"PARENTHESIZED IDEOGRAPH TEN"/* 3229 */, /*12842*/"PARENTHESIZED IDEOGRAPH MOON"/* 322A */,/*12843*/"PARENTHESIZED IDEOGRAPH FIRE"/* 322B */, /*12844*/"PARENTHESIZED IDEOGRAPH WATER"/* 322C */,/*12845*/"PARENTHESIZED IDEOGRAPH WOOD"/* 322D */, /*12846*/"PARENTHESIZED IDEOGRAPH METAL"/* 322E */,/*12847*/"PARENTHESIZED IDEOGRAPH EARTH"/* 322F */, /*12848*/"PARENTHESIZED IDEOGRAPH SUN"/* 3230 */,/*12849*/"PARENTHESIZED IDEOGRAPH STOCK"/* 3231 */, /*12850*/"PARENTHESIZED IDEOGRAPH HAVE"/* 3232 */,/*12851*/"PARENTHESIZED IDEOGRAPH SOCIETY"/* 3233 */, /*12852*/"PARENTHESIZED IDEOGRAPH NAME"/* 3234 */,/*12853*/"PARENTHESIZED IDEOGRAPH SPECIAL"/* 3235 */, /*12854*/"PARENTHESIZED IDEOGRAPH FINANCIAL"/* 3236 */,/*12855*/"PARENTHESIZED IDEOGRAPH CONGRATULATION"/* 3237 */, /*12856*/"PARENTHESIZED IDEOGRAPH LABOR"/* 3238 */,/*12857*/"PARENTHESIZED IDEOGRAPH REPRESENT"/* 3239 */, /*12858*/"PARENTHESIZED IDEOGRAPH CALL"/* 323A */,/*12859*/"PARENTHESIZED IDEOGRAPH STUDY"/* 323B */, /*12860*/"PARENTHESIZED IDEOGRAPH SUPERVISE"/* 323C */,/*12861*/"PARENTHESIZED IDEOGRAPH ENTERPRISE"/* 323D */, /*12862*/"PARENTHESIZED IDEOGRAPH RESOURCE"/* 323E */,/*12863*/"PARENTHESIZED IDEOGRAPH ALLIANCE"/* 323F */, /*12864*/"PARENTHESIZED IDEOGRAPH FESTIVAL"/* 3240 */,/*12865*/"PARENTHESIZED IDEOGRAPH REST"/* 3241 */, /*12866*/"PARENTHESIZED IDEOGRAPH SELF"/* 3242 */,/*12867*/"PARENTHESIZED IDEOGRAPH REACH"/* 3243 */, /*12868*/"CIRCLED IDEOGRAPH QUESTION"/* 3244 */,/*12869*/"CIRCLED IDEOGRAPH KINDERGARTEN"/* 3245 */, /*12870*/"CIRCLED IDEOGRAPH SCHOOL"/* 3246 */,/*12871*/"CIRCLED IDEOGRAPH KOTO"/* 3247 */, /*12872*/"CIRCLED NUMBER TEN ON BLACK SQUARE"/* 3248 */,/*12873*/"CIRCLED NUMBER TWENTY ON BLACK SQUARE"/* 3249 */, /*12874*/"CIRCLED NUMBER THIRTY ON BLACK SQUARE"/* 324A */,/*12875*/"CIRCLED NUMBER FORTY ON BLACK SQUARE"/* 324B */, /*12876*/"CIRCLED NUMBER FIFTY ON BLACK SQUARE"/* 324C */,/*12877*/"CIRCLED NUMBER SIXTY ON BLACK SQUARE"/* 324D */, /*12878*/"CIRCLED NUMBER SEVENTY ON BLACK SQUARE"/* 324E */,/*12879*/"CIRCLED NUMBER EIGHTY ON BLACK SQUARE"/* 324F */, /*12880*/"PARTNERSHIP SIGN"/* 3250 */,/*12881*/"CIRCLED NUMBER TWENTY ONE"/* 3251 */, /*12882*/"CIRCLED NUMBER TWENTY TWO"/* 3252 */,/*12883*/"CIRCLED NUMBER TWENTY THREE"/* 3253 */, /*12884*/"CIRCLED NUMBER TWENTY FOUR"/* 3254 */,/*12885*/"CIRCLED NUMBER TWENTY FIVE"/* 3255 */, /*12886*/"CIRCLED NUMBER TWENTY SIX"/* 3256 */,/*12887*/"CIRCLED NUMBER TWENTY SEVEN"/* 3257 */, /*12888*/"CIRCLED NUMBER TWENTY EIGHT"/* 3258 */,/*12889*/"CIRCLED NUMBER TWENTY NINE"/* 3259 */, /*12890*/"CIRCLED NUMBER THIRTY"/* 325A */,/*12891*/"CIRCLED NUMBER THIRTY ONE"/* 325B */, /*12892*/"CIRCLED NUMBER THIRTY TWO"/* 325C */,/*12893*/"CIRCLED NUMBER THIRTY THREE"/* 325D */, /*12894*/"CIRCLED NUMBER THIRTY FOUR"/* 325E */,/*12895*/"CIRCLED NUMBER THIRTY FIVE"/* 325F */, /*12896*/"CIRCLED HANGUL KIYEOK"/* 3260 */,/*12897*/"CIRCLED HANGUL NIEUN"/* 3261 */, /*12898*/"CIRCLED HANGUL TIKEUT"/* 3262 */,/*12899*/"CIRCLED HANGUL RIEUL"/* 3263 */, /*12900*/"CIRCLED HANGUL MIEUM"/* 3264 */,/*12901*/"CIRCLED HANGUL PIEUP"/* 3265 */, /*12902*/"CIRCLED HANGUL SIOS"/* 3266 */,/*12903*/"CIRCLED HANGUL IEUNG"/* 3267 */, /*12904*/"CIRCLED HANGUL CIEUC"/* 3268 */,/*12905*/"CIRCLED HANGUL CHIEUCH"/* 3269 */, /*12906*/"CIRCLED HANGUL KHIEUKH"/* 326A */,/*12907*/"CIRCLED HANGUL THIEUTH"/* 326B */, /*12908*/"CIRCLED HANGUL PHIEUPH"/* 326C */,/*12909*/"CIRCLED HANGUL HIEUH"/* 326D */, /*12910*/"CIRCLED HANGUL KIYEOK A"/* 326E */,/*12911*/"CIRCLED HANGUL NIEUN A"/* 326F */, /*12912*/"CIRCLED HANGUL TIKEUT A"/* 3270 */,/*12913*/"CIRCLED HANGUL RIEUL A"/* 3271 */, /*12914*/"CIRCLED HANGUL MIEUM A"/* 3272 */,/*12915*/"CIRCLED HANGUL PIEUP A"/* 3273 */, /*12916*/"CIRCLED HANGUL SIOS A"/* 3274 */,/*12917*/"CIRCLED HANGUL IEUNG A"/* 3275 */, /*12918*/"CIRCLED HANGUL CIEUC A"/* 3276 */,/*12919*/"CIRCLED HANGUL CHIEUCH A"/* 3277 */, /*12920*/"CIRCLED HANGUL KHIEUKH A"/* 3278 */,/*12921*/"CIRCLED HANGUL THIEUTH A"/* 3279 */, /*12922*/"CIRCLED HANGUL PHIEUPH A"/* 327A */,/*12923*/"CIRCLED HANGUL HIEUH A"/* 327B */, /*12924*/"CIRCLED KOREAN CHARACTER CHAMKO"/* 327C */,/*12925*/"CIRCLED KOREAN CHARACTER JUEUI"/* 327D */, /*12926*/"CIRCLED HANGUL IEUNG U"/* 327E */,/*12927*/"KOREAN STANDARD SYMBOL"/* 327F */, /*12928*/"CIRCLED IDEOGRAPH ONE"/* 3280 */,/*12929*/"CIRCLED IDEOGRAPH TWO"/* 3281 */, /*12930*/"CIRCLED IDEOGRAPH THREE"/* 3282 */,/*12931*/"CIRCLED IDEOGRAPH FOUR"/* 3283 */, /*12932*/"CIRCLED IDEOGRAPH FIVE"/* 3284 */,/*12933*/"CIRCLED IDEOGRAPH SIX"/* 3285 */, /*12934*/"CIRCLED IDEOGRAPH SEVEN"/* 3286 */,/*12935*/"CIRCLED IDEOGRAPH EIGHT"/* 3287 */, /*12936*/"CIRCLED IDEOGRAPH NINE"/* 3288 */,/*12937*/"CIRCLED IDEOGRAPH TEN"/* 3289 */, /*12938*/"CIRCLED IDEOGRAPH MOON"/* 328A */,/*12939*/"CIRCLED IDEOGRAPH FIRE"/* 328B */, /*12940*/"CIRCLED IDEOGRAPH WATER"/* 328C */,/*12941*/"CIRCLED IDEOGRAPH WOOD"/* 328D */, /*12942*/"CIRCLED IDEOGRAPH METAL"/* 328E */,/*12943*/"CIRCLED IDEOGRAPH EARTH"/* 328F */, /*12944*/"CIRCLED IDEOGRAPH SUN"/* 3290 */,/*12945*/"CIRCLED IDEOGRAPH STOCK"/* 3291 */, /*12946*/"CIRCLED IDEOGRAPH HAVE"/* 3292 */,/*12947*/"CIRCLED IDEOGRAPH SOCIETY"/* 3293 */, /*12948*/"CIRCLED IDEOGRAPH NAME"/* 3294 */,/*12949*/"CIRCLED IDEOGRAPH SPECIAL"/* 3295 */, /*12950*/"CIRCLED IDEOGRAPH FINANCIAL"/* 3296 */,/*12951*/"CIRCLED IDEOGRAPH CONGRATULATION"/* 3297 */, /*12952*/"CIRCLED IDEOGRAPH LABOR"/* 3298 */,/*12953*/"CIRCLED IDEOGRAPH SECRET"/* 3299 */, /*12954*/"CIRCLED IDEOGRAPH MALE"/* 329A */,/*12955*/"CIRCLED IDEOGRAPH FEMALE"/* 329B */, /*12956*/"CIRCLED IDEOGRAPH SUITABLE"/* 329C */,/*12957*/"CIRCLED IDEOGRAPH EXCELLENT"/* 329D */, /*12958*/"CIRCLED IDEOGRAPH PRINT"/* 329E */,/*12959*/"CIRCLED IDEOGRAPH ATTENTION"/* 329F */, /*12960*/"CIRCLED IDEOGRAPH ITEM"/* 32A0 */,/*12961*/"CIRCLED IDEOGRAPH REST"/* 32A1 */, /*12962*/"CIRCLED IDEOGRAPH COPY"/* 32A2 */,/*12963*/"CIRCLED IDEOGRAPH CORRECT"/* 32A3 */, /*12964*/"CIRCLED IDEOGRAPH HIGH"/* 32A4 */,/*12965*/"CIRCLED IDEOGRAPH CENTRE"/* 32A5 */, /*12966*/"CIRCLED IDEOGRAPH LOW"/* 32A6 */,/*12967*/"CIRCLED IDEOGRAPH LEFT"/* 32A7 */, /*12968*/"CIRCLED IDEOGRAPH RIGHT"/* 32A8 */,/*12969*/"CIRCLED IDEOGRAPH MEDICINE"/* 32A9 */, /*12970*/"CIRCLED IDEOGRAPH RELIGION"/* 32AA */,/*12971*/"CIRCLED IDEOGRAPH STUDY"/* 32AB */, /*12972*/"CIRCLED IDEOGRAPH SUPERVISE"/* 32AC */,/*12973*/"CIRCLED IDEOGRAPH ENTERPRISE"/* 32AD */, /*12974*/"CIRCLED IDEOGRAPH RESOURCE"/* 32AE */,/*12975*/"CIRCLED IDEOGRAPH ALLIANCE"/* 32AF */, /*12976*/"CIRCLED IDEOGRAPH NIGHT"/* 32B0 */,/*12977*/"CIRCLED NUMBER THIRTY SIX"/* 32B1 */, /*12978*/"CIRCLED NUMBER THIRTY SEVEN"/* 32B2 */,/*12979*/"CIRCLED NUMBER THIRTY EIGHT"/* 32B3 */, /*12980*/"CIRCLED NUMBER THIRTY NINE"/* 32B4 */,/*12981*/"CIRCLED NUMBER FORTY"/* 32B5 */, /*12982*/"CIRCLED NUMBER FORTY ONE"/* 32B6 */,/*12983*/"CIRCLED NUMBER FORTY TWO"/* 32B7 */, /*12984*/"CIRCLED NUMBER FORTY THREE"/* 32B8 */,/*12985*/"CIRCLED NUMBER FORTY FOUR"/* 32B9 */, /*12986*/"CIRCLED NUMBER FORTY FIVE"/* 32BA */,/*12987*/"CIRCLED NUMBER FORTY SIX"/* 32BB */, /*12988*/"CIRCLED NUMBER FORTY SEVEN"/* 32BC */,/*12989*/"CIRCLED NUMBER FORTY EIGHT"/* 32BD */, /*12990*/"CIRCLED NUMBER FORTY NINE"/* 32BE */,/*12991*/"CIRCLED NUMBER FIFTY"/* 32BF */, /*12992*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY"/* 32C0 */, /*12993*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY"/* 32C1 */, /*12994*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH"/* 32C2 */,/*12995*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL"/* 32C3 */, /*12996*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY"/* 32C4 */,/*12997*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE"/* 32C5 */, /*12998*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY"/* 32C6 */,/*12999*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST"/* 32C7 */, /*13000*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER"/* 32C8 */, /*13001*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER"/* 32C9 */, /*13002*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER"/* 32CA */, /*13003*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER"/* 32CB */,/*13004*/"SQUARE HG"/* 32CC */, /*13005*/"SQUARE ERG"/* 32CD */,/*13006*/"SQUARE EV"/* 32CE */,/*13007*/"LIMITED LIABILITY SIGN"/* 32CF */, /*13008*/"CIRCLED KATAKANA A"/* 32D0 */,/*13009*/"CIRCLED KATAKANA I"/* 32D1 */,/*13010*/"CIRCLED KATAKANA U"/* 32D2 */, /*13011*/"CIRCLED KATAKANA E"/* 32D3 */,/*13012*/"CIRCLED KATAKANA O"/* 32D4 */,/*13013*/"CIRCLED KATAKANA KA"/* 32D5 */, /*13014*/"CIRCLED KATAKANA KI"/* 32D6 */,/*13015*/"CIRCLED KATAKANA KU"/* 32D7 */, /*13016*/"CIRCLED KATAKANA KE"/* 32D8 */,/*13017*/"CIRCLED KATAKANA KO"/* 32D9 */, /*13018*/"CIRCLED KATAKANA SA"/* 32DA */,/*13019*/"CIRCLED KATAKANA SI"/* 32DB */, /*13020*/"CIRCLED KATAKANA SU"/* 32DC */,/*13021*/"CIRCLED KATAKANA SE"/* 32DD */, /*13022*/"CIRCLED KATAKANA SO"/* 32DE */,/*13023*/"CIRCLED KATAKANA TA"/* 32DF */, /*13024*/"CIRCLED KATAKANA TI"/* 32E0 */,/*13025*/"CIRCLED KATAKANA TU"/* 32E1 */, /*13026*/"CIRCLED KATAKANA TE"/* 32E2 */,/*13027*/"CIRCLED KATAKANA TO"/* 32E3 */, /*13028*/"CIRCLED KATAKANA NA"/* 32E4 */,/*13029*/"CIRCLED KATAKANA NI"/* 32E5 */, /*13030*/"CIRCLED KATAKANA NU"/* 32E6 */,/*13031*/"CIRCLED KATAKANA NE"/* 32E7 */, /*13032*/"CIRCLED KATAKANA NO"/* 32E8 */,/*13033*/"CIRCLED KATAKANA HA"/* 32E9 */, /*13034*/"CIRCLED KATAKANA HI"/* 32EA */,/*13035*/"CIRCLED KATAKANA HU"/* 32EB */, /*13036*/"CIRCLED KATAKANA HE"/* 32EC */,/*13037*/"CIRCLED KATAKANA HO"/* 32ED */, /*13038*/"CIRCLED KATAKANA MA"/* 32EE */,/*13039*/"CIRCLED KATAKANA MI"/* 32EF */, /*13040*/"CIRCLED KATAKANA MU"/* 32F0 */,/*13041*/"CIRCLED KATAKANA ME"/* 32F1 */, /*13042*/"CIRCLED KATAKANA MO"/* 32F2 */,/*13043*/"CIRCLED KATAKANA YA"/* 32F3 */, /*13044*/"CIRCLED KATAKANA YU"/* 32F4 */,/*13045*/"CIRCLED KATAKANA YO"/* 32F5 */, /*13046*/"CIRCLED KATAKANA RA"/* 32F6 */,/*13047*/"CIRCLED KATAKANA RI"/* 32F7 */, /*13048*/"CIRCLED KATAKANA RU"/* 32F8 */,/*13049*/"CIRCLED KATAKANA RE"/* 32F9 */, /*13050*/"CIRCLED KATAKANA RO"/* 32FA */,/*13051*/"CIRCLED KATAKANA WA"/* 32FB */, /*13052*/"CIRCLED KATAKANA WI"/* 32FC */,/*13053*/"CIRCLED KATAKANA WE"/* 32FD */, /*13054*/"CIRCLED KATAKANA WO"/* 32FE */,NULL,/*13056*/"SQUARE APAATO"/* 3300 */,/*13057*/"SQUARE ARUHUA"/* 3301 */, /*13058*/"SQUARE ANPEA"/* 3302 */,/*13059*/"SQUARE AARU"/* 3303 */,/*13060*/"SQUARE ININGU"/* 3304 */, /*13061*/"SQUARE INTI"/* 3305 */,/*13062*/"SQUARE UON"/* 3306 */,/*13063*/"SQUARE ESUKUUDO"/* 3307 */, /*13064*/"SQUARE EEKAA"/* 3308 */,/*13065*/"SQUARE ONSU"/* 3309 */,/*13066*/"SQUARE OOMU"/* 330A */, /*13067*/"SQUARE KAIRI"/* 330B */,/*13068*/"SQUARE KARATTO"/* 330C */,/*13069*/"SQUARE KARORII"/* 330D */, /*13070*/"SQUARE GARON"/* 330E */,/*13071*/"SQUARE GANMA"/* 330F */,/*13072*/"SQUARE GIGA"/* 3310 */, /*13073*/"SQUARE GINII"/* 3311 */,/*13074*/"SQUARE KYURII"/* 3312 */,/*13075*/"SQUARE GIRUDAA"/* 3313 */, /*13076*/"SQUARE KIRO"/* 3314 */,/*13077*/"SQUARE KIROGURAMU"/* 3315 */,/*13078*/"SQUARE KIROMEETORU"/* 3316 */, /*13079*/"SQUARE KIROWATTO"/* 3317 */,/*13080*/"SQUARE GURAMU"/* 3318 */,/*13081*/"SQUARE GURAMUTON"/* 3319 */, /*13082*/"SQUARE KURUZEIRO"/* 331A */,/*13083*/"SQUARE KUROONE"/* 331B */,/*13084*/"SQUARE KEESU"/* 331C */, /*13085*/"SQUARE KORUNA"/* 331D */,/*13086*/"SQUARE KOOPO"/* 331E */,/*13087*/"SQUARE SAIKURU"/* 331F */, /*13088*/"SQUARE SANTIIMU"/* 3320 */,/*13089*/"SQUARE SIRINGU"/* 3321 */,/*13090*/"SQUARE SENTI"/* 3322 */, /*13091*/"SQUARE SENTO"/* 3323 */,/*13092*/"SQUARE DAASU"/* 3324 */,/*13093*/"SQUARE DESI"/* 3325 */, /*13094*/"SQUARE DORU"/* 3326 */,/*13095*/"SQUARE TON"/* 3327 */,/*13096*/"SQUARE NANO"/* 3328 */, /*13097*/"SQUARE NOTTO"/* 3329 */,/*13098*/"SQUARE HAITU"/* 332A */,/*13099*/"SQUARE PAASENTO"/* 332B */, /*13100*/"SQUARE PAATU"/* 332C */,/*13101*/"SQUARE BAARERU"/* 332D */,/*13102*/"SQUARE PIASUTORU"/* 332E */, /*13103*/"SQUARE PIKURU"/* 332F */,/*13104*/"SQUARE PIKO"/* 3330 */,/*13105*/"SQUARE BIRU"/* 3331 */, /*13106*/"SQUARE HUARADDO"/* 3332 */,/*13107*/"SQUARE HUIITO"/* 3333 */,/*13108*/"SQUARE BUSSYERU"/* 3334 */, /*13109*/"SQUARE HURAN"/* 3335 */,/*13110*/"SQUARE HEKUTAARU"/* 3336 */,/*13111*/"SQUARE PESO"/* 3337 */, /*13112*/"SQUARE PENIHI"/* 3338 */,/*13113*/"SQUARE HERUTU"/* 3339 */,/*13114*/"SQUARE PENSU"/* 333A */, /*13115*/"SQUARE PEEZI"/* 333B */,/*13116*/"SQUARE BEETA"/* 333C */,/*13117*/"SQUARE POINTO"/* 333D */, /*13118*/"SQUARE BORUTO"/* 333E */,/*13119*/"SQUARE HON"/* 333F */,/*13120*/"SQUARE PONDO"/* 3340 */, /*13121*/"SQUARE HOORU"/* 3341 */,/*13122*/"SQUARE HOON"/* 3342 */,/*13123*/"SQUARE MAIKURO"/* 3343 */, /*13124*/"SQUARE MAIRU"/* 3344 */,/*13125*/"SQUARE MAHHA"/* 3345 */,/*13126*/"SQUARE MARUKU"/* 3346 */, /*13127*/"SQUARE MANSYON"/* 3347 */,/*13128*/"SQUARE MIKURON"/* 3348 */,/*13129*/"SQUARE MIRI"/* 3349 */, /*13130*/"SQUARE MIRIBAARU"/* 334A */,/*13131*/"SQUARE MEGA"/* 334B */,/*13132*/"SQUARE MEGATON"/* 334C */, /*13133*/"SQUARE MEETORU"/* 334D */,/*13134*/"SQUARE YAADO"/* 334E */,/*13135*/"SQUARE YAARU"/* 334F */, /*13136*/"SQUARE YUAN"/* 3350 */,/*13137*/"SQUARE RITTORU"/* 3351 */,/*13138*/"SQUARE RIRA"/* 3352 */, /*13139*/"SQUARE RUPII"/* 3353 */,/*13140*/"SQUARE RUUBURU"/* 3354 */,/*13141*/"SQUARE REMU"/* 3355 */, /*13142*/"SQUARE RENTOGEN"/* 3356 */,/*13143*/"SQUARE WATTO"/* 3357 */, /*13144*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO"/* 3358 */, /*13145*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE"/* 3359 */, /*13146*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO"/* 335A */, /*13147*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE"/* 335B */, /*13148*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR"/* 335C */, /*13149*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE"/* 335D */, /*13150*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX"/* 335E */, /*13151*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN"/* 335F */, /*13152*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT"/* 3360 */, /*13153*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE"/* 3361 */, /*13154*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN"/* 3362 */, /*13155*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN"/* 3363 */, /*13156*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE"/* 3364 */, /*13157*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN"/* 3365 */, /*13158*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN"/* 3366 */, /*13159*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN"/* 3367 */, /*13160*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN"/* 3368 */, /*13161*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN"/* 3369 */, /*13162*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN"/* 336A */, /*13163*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN"/* 336B */, /*13164*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY"/* 336C */, /*13165*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE"/* 336D */, /*13166*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO"/* 336E */, /*13167*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE"/* 336F */, /*13168*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR"/* 3370 */,/*13169*/"SQUARE HPA"/* 3371 */, /*13170*/"SQUARE DA"/* 3372 */,/*13171*/"SQUARE AU"/* 3373 */,/*13172*/"SQUARE BAR"/* 3374 */, /*13173*/"SQUARE OV"/* 3375 */,/*13174*/"SQUARE PC"/* 3376 */,/*13175*/"SQUARE DM"/* 3377 */, /*13176*/"SQUARE DM SQUARED"/* 3378 */,/*13177*/"SQUARE DM CUBED"/* 3379 */,/*13178*/"SQUARE IU"/* 337A */, /*13179*/"SQUARE ERA NAME HEISEI"/* 337B */,/*13180*/"SQUARE ERA NAME SYOUWA"/* 337C */, /*13181*/"SQUARE ERA NAME TAISYOU"/* 337D */,/*13182*/"SQUARE ERA NAME MEIZI"/* 337E */, /*13183*/"SQUARE CORPORATION"/* 337F */,/*13184*/"SQUARE PA AMPS"/* 3380 */,/*13185*/"SQUARE NA"/* 3381 */, /*13186*/"SQUARE MU A"/* 3382 */,/*13187*/"SQUARE MA"/* 3383 */,/*13188*/"SQUARE KA"/* 3384 */, /*13189*/"SQUARE KB"/* 3385 */,/*13190*/"SQUARE MB"/* 3386 */,/*13191*/"SQUARE GB"/* 3387 */, /*13192*/"SQUARE CAL"/* 3388 */,/*13193*/"SQUARE KCAL"/* 3389 */,/*13194*/"SQUARE PF"/* 338A */, /*13195*/"SQUARE NF"/* 338B */,/*13196*/"SQUARE MU F"/* 338C */,/*13197*/"SQUARE MU G"/* 338D */, /*13198*/"SQUARE MG"/* 338E */,/*13199*/"SQUARE KG"/* 338F */,/*13200*/"SQUARE HZ"/* 3390 */, /*13201*/"SQUARE KHZ"/* 3391 */,/*13202*/"SQUARE MHZ"/* 3392 */,/*13203*/"SQUARE GHZ"/* 3393 */, /*13204*/"SQUARE THZ"/* 3394 */,/*13205*/"SQUARE MU L"/* 3395 */,/*13206*/"SQUARE ML"/* 3396 */, /*13207*/"SQUARE DL"/* 3397 */,/*13208*/"SQUARE KL"/* 3398 */,/*13209*/"SQUARE FM"/* 3399 */, /*13210*/"SQUARE NM"/* 339A */,/*13211*/"SQUARE MU M"/* 339B */,/*13212*/"SQUARE MM"/* 339C */, /*13213*/"SQUARE CM"/* 339D */,/*13214*/"SQUARE KM"/* 339E */,/*13215*/"SQUARE MM SQUARED"/* 339F */, /*13216*/"SQUARE CM SQUARED"/* 33A0 */,/*13217*/"SQUARE M SQUARED"/* 33A1 */,/*13218*/"SQUARE KM SQUARED"/* 33A2 */, /*13219*/"SQUARE MM CUBED"/* 33A3 */,/*13220*/"SQUARE CM CUBED"/* 33A4 */,/*13221*/"SQUARE M CUBED"/* 33A5 */, /*13222*/"SQUARE KM CUBED"/* 33A6 */,/*13223*/"SQUARE M OVER S"/* 33A7 */,/*13224*/"SQUARE M OVER S SQUARED"/* 33A8 */, /*13225*/"SQUARE PA"/* 33A9 */,/*13226*/"SQUARE KPA"/* 33AA */,/*13227*/"SQUARE MPA"/* 33AB */, /*13228*/"SQUARE GPA"/* 33AC */,/*13229*/"SQUARE RAD"/* 33AD */,/*13230*/"SQUARE RAD OVER S"/* 33AE */, /*13231*/"SQUARE RAD OVER S SQUARED"/* 33AF */,/*13232*/"SQUARE PS"/* 33B0 */,/*13233*/"SQUARE NS"/* 33B1 */, /*13234*/"SQUARE MU S"/* 33B2 */,/*13235*/"SQUARE MS"/* 33B3 */,/*13236*/"SQUARE PV"/* 33B4 */, /*13237*/"SQUARE NV"/* 33B5 */,/*13238*/"SQUARE MU V"/* 33B6 */,/*13239*/"SQUARE MV"/* 33B7 */, /*13240*/"SQUARE KV"/* 33B8 */,/*13241*/"SQUARE MV MEGA"/* 33B9 */,/*13242*/"SQUARE PW"/* 33BA */, /*13243*/"SQUARE NW"/* 33BB */,/*13244*/"SQUARE MU W"/* 33BC */,/*13245*/"SQUARE MW"/* 33BD */, /*13246*/"SQUARE KW"/* 33BE */,/*13247*/"SQUARE MW MEGA"/* 33BF */,/*13248*/"SQUARE K OHM"/* 33C0 */, /*13249*/"SQUARE M OHM"/* 33C1 */,/*13250*/"SQUARE AM"/* 33C2 */,/*13251*/"SQUARE BQ"/* 33C3 */, /*13252*/"SQUARE CC"/* 33C4 */,/*13253*/"SQUARE CD"/* 33C5 */,/*13254*/"SQUARE C OVER KG"/* 33C6 */, /*13255*/"SQUARE CO"/* 33C7 */,/*13256*/"SQUARE DB"/* 33C8 */,/*13257*/"SQUARE GY"/* 33C9 */, /*13258*/"SQUARE HA"/* 33CA */,/*13259*/"SQUARE HP"/* 33CB */,/*13260*/"SQUARE IN"/* 33CC */, /*13261*/"SQUARE KK"/* 33CD */,/*13262*/"SQUARE KM CAPITAL"/* 33CE */,/*13263*/"SQUARE KT"/* 33CF */, /*13264*/"SQUARE LM"/* 33D0 */,/*13265*/"SQUARE LN"/* 33D1 */,/*13266*/"SQUARE LOG"/* 33D2 */, /*13267*/"SQUARE LX"/* 33D3 */,/*13268*/"SQUARE MB SMALL"/* 33D4 */,/*13269*/"SQUARE MIL"/* 33D5 */, /*13270*/"SQUARE MOL"/* 33D6 */,/*13271*/"SQUARE PH"/* 33D7 */,/*13272*/"SQUARE PM"/* 33D8 */, /*13273*/"SQUARE PPM"/* 33D9 */,/*13274*/"SQUARE PR"/* 33DA */,/*13275*/"SQUARE SR"/* 33DB */, /*13276*/"SQUARE SV"/* 33DC */,/*13277*/"SQUARE WB"/* 33DD */,/*13278*/"SQUARE V OVER M"/* 33DE */, /*13279*/"SQUARE A OVER M"/* 33DF */,/*13280*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE"/* 33E0 */, /*13281*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO"/* 33E1 */, /*13282*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE"/* 33E2 */, /*13283*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR"/* 33E3 */, /*13284*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE"/* 33E4 */, /*13285*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX"/* 33E5 */, /*13286*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN"/* 33E6 */, /*13287*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT"/* 33E7 */, /*13288*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE"/* 33E8 */, /*13289*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN"/* 33E9 */, /*13290*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN"/* 33EA */, /*13291*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE"/* 33EB */, /*13292*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN"/* 33EC */, /*13293*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN"/* 33ED */, /*13294*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN"/* 33EE */, /*13295*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN"/* 33EF */, /*13296*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN"/* 33F0 */, /*13297*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN"/* 33F1 */, /*13298*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN"/* 33F2 */, /*13299*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY"/* 33F3 */, /*13300*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE"/* 33F4 */, /*13301*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO"/* 33F5 */, /*13302*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE"/* 33F6 */, /*13303*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR"/* 33F7 */, /*13304*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE"/* 33F8 */, /*13305*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX"/* 33F9 */, /*13306*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN"/* 33FA */, /*13307*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT"/* 33FB */, /*13308*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE"/* 33FC */, /*13309*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY"/* 33FD */, /*13310*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE"/* 33FE */,/*13311*/"SQUARE GAL"/* 33FF */, /*13312*/""/* 3400 */,/*13313*/NULL/* 3401 */,/*13314*/NULL/* 3402 */,/*13315*/NULL/* 3403 */, /*13316*/NULL/* 3404 */,/*13317*/""/* 3405 */, /*13318*/""/* 3406 */,/*13319*/""/* 3483 */, /*13320*/""/* 3484 */,/*13321*/""/* 382A */, /*13322*/""/* 382B */,/*13323*/""/* 3B4D */, /*13324*/""/* 3B4E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13335*/"HEXAGRAM FOR THE CREATIVE HEAVEN"/* 4DC0 */,/*13336*/"HEXAGRAM FOR THE RECEPTIVE EARTH"/* 4DC1 */, /*13337*/"HEXAGRAM FOR DIFFICULTY AT THE BEGINNING"/* 4DC2 */,/*13338*/"HEXAGRAM FOR YOUTHFUL FOLLY"/* 4DC3 */, /*13339*/"HEXAGRAM FOR WAITING"/* 4DC4 */,/*13340*/"HEXAGRAM FOR CONFLICT"/* 4DC5 */, /*13341*/"HEXAGRAM FOR THE ARMY"/* 4DC6 */,/*13342*/"HEXAGRAM FOR HOLDING TOGETHER"/* 4DC7 */, /*13343*/"HEXAGRAM FOR SMALL TAMING"/* 4DC8 */,/*13344*/"HEXAGRAM FOR TREADING"/* 4DC9 */, /*13345*/"HEXAGRAM FOR PEACE"/* 4DCA */,/*13346*/"HEXAGRAM FOR STANDSTILL"/* 4DCB */, /*13347*/"HEXAGRAM FOR FELLOWSHIP"/* 4DCC */,/*13348*/"HEXAGRAM FOR GREAT POSSESSION"/* 4DCD */, /*13349*/"HEXAGRAM FOR MODESTY"/* 4DCE */,/*13350*/"HEXAGRAM FOR ENTHUSIASM"/* 4DCF */, /*13351*/"HEXAGRAM FOR FOLLOWING"/* 4DD0 */,/*13352*/"HEXAGRAM FOR WORK ON THE DECAYED"/* 4DD1 */, /*13353*/"HEXAGRAM FOR APPROACH"/* 4DD2 */,/*13354*/"HEXAGRAM FOR CONTEMPLATION"/* 4DD3 */, /*13355*/"HEXAGRAM FOR BITING THROUGH"/* 4DD4 */,/*13356*/"HEXAGRAM FOR GRACE"/* 4DD5 */, /*13357*/"HEXAGRAM FOR SPLITTING APART"/* 4DD6 */,/*13358*/"HEXAGRAM FOR RETURN"/* 4DD7 */, /*13359*/"HEXAGRAM FOR INNOCENCE"/* 4DD8 */,/*13360*/"HEXAGRAM FOR GREAT TAMING"/* 4DD9 */, /*13361*/"HEXAGRAM FOR MOUTH CORNERS"/* 4DDA */,/*13362*/"HEXAGRAM FOR GREAT PREPONDERANCE"/* 4DDB */, /*13363*/"HEXAGRAM FOR THE ABYSMAL WATER"/* 4DDC */,/*13364*/"HEXAGRAM FOR THE CLINGING FIRE"/* 4DDD */, /*13365*/"HEXAGRAM FOR INFLUENCE"/* 4DDE */,/*13366*/"HEXAGRAM FOR DURATION"/* 4DDF */, /*13367*/"HEXAGRAM FOR RETREAT"/* 4DE0 */,/*13368*/"HEXAGRAM FOR GREAT POWER"/* 4DE1 */, /*13369*/"HEXAGRAM FOR PROGRESS"/* 4DE2 */,/*13370*/"HEXAGRAM FOR DARKENING OF THE LIGHT"/* 4DE3 */, /*13371*/"HEXAGRAM FOR THE FAMILY"/* 4DE4 */,/*13372*/"HEXAGRAM FOR OPPOSITION"/* 4DE5 */, /*13373*/"HEXAGRAM FOR OBSTRUCTION"/* 4DE6 */,/*13374*/"HEXAGRAM FOR DELIVERANCE"/* 4DE7 */, /*13375*/"HEXAGRAM FOR DECREASE"/* 4DE8 */,/*13376*/"HEXAGRAM FOR INCREASE"/* 4DE9 */, /*13377*/"HEXAGRAM FOR BREAKTHROUGH"/* 4DEA */,/*13378*/"HEXAGRAM FOR COMING TO MEET"/* 4DEB */, /*13379*/"HEXAGRAM FOR GATHERING TOGETHER"/* 4DEC */,/*13380*/"HEXAGRAM FOR PUSHING UPWARD"/* 4DED */, /*13381*/"HEXAGRAM FOR OPPRESSION"/* 4DEE */,/*13382*/"HEXAGRAM FOR THE WELL"/* 4DEF */, /*13383*/"HEXAGRAM FOR REVOLUTION"/* 4DF0 */,/*13384*/"HEXAGRAM FOR THE CAULDRON"/* 4DF1 */, /*13385*/"HEXAGRAM FOR THE AROUSING THUNDER"/* 4DF2 */,/*13386*/"HEXAGRAM FOR THE KEEPING STILL MOUNTAIN"/* 4DF3 */, /*13387*/"HEXAGRAM FOR DEVELOPMENT"/* 4DF4 */,/*13388*/"HEXAGRAM FOR THE MARRYING MAIDEN"/* 4DF5 */, /*13389*/"HEXAGRAM FOR ABUNDANCE"/* 4DF6 */,/*13390*/"HEXAGRAM FOR THE WANDERER"/* 4DF7 */, /*13391*/"HEXAGRAM FOR THE GENTLE WIND"/* 4DF8 */,/*13392*/"HEXAGRAM FOR THE JOYOUS LAKE"/* 4DF9 */, /*13393*/"HEXAGRAM FOR DISPERSION"/* 4DFA */,/*13394*/"HEXAGRAM FOR LIMITATION"/* 4DFB */, /*13395*/"HEXAGRAM FOR INNER TRUTH"/* 4DFC */,/*13396*/"HEXAGRAM FOR SMALL PREPONDERANCE"/* 4DFD */, /*13397*/"HEXAGRAM FOR AFTER COMPLETION"/* 4DFE */,/*13398*/"HEXAGRAM FOR BEFORE COMPLETION"/* 4DFF */, /*13399*/""/* 4E00 */,/*13400*/""/* 4E01 */,/*13401*/NULL/* 4E02 */, /*13402*/""/* 4E03 */,/*13403*/""/* 4E04 */,/*13404*/NULL/* 4E05 */, /*13405*/NULL/* 4E06 */,/*13406*/""/* 4E07 */,/*13407*/""/* 4E08 */, /*13408*/""/* 4E09 */,/*13409*/""/* 4E0A */,/*13410*/NULL/* 4E0B */, /*13411*/NULL/* 4E0C */,/*13412*/NULL/* 4E0D */,/*13413*/NULL/* 4E0E */,/*13414*/NULL/* 4E0F */,/*13415*/NULL/* 4E10 */, /*13416*/NULL/* 4E11 */,/*13417*/NULL/* 4E12 */,/*13418*/NULL/* 4E13 */,/*13419*/NULL/* 4E14 */,/*13420*/NULL/* 4E15 */, /*13421*/NULL/* 4E16 */,/*13422*/NULL/* 4E17 */,/*13423*/NULL/* 4E18 */,/*13424*/NULL/* 4E19 */,/*13425*/NULL/* 4E1A */, /*13426*/NULL/* 4E1B */,/*13427*/NULL/* 4E1C */,/*13428*/NULL/* 4E1D */,/*13429*/NULL/* 4E1E */,/*13430*/NULL/* 4E1F */, /*13431*/NULL/* 4E20 */,/*13432*/NULL/* 4E21 */,/*13433*/NULL/* 4E22 */,/*13434*/""/* 4E23 */, /*13435*/NULL/* 4E24 */,/*13436*/NULL/* 4E25 */,/*13437*/NULL/* 4E26 */,/*13438*/NULL/* 4E27 */,/*13439*/NULL/* 4E28 */, /*13440*/NULL/* 4E29 */,/*13441*/NULL/* 4E2A */,/*13442*/NULL/* 4E2B */,/*13443*/NULL/* 4E2C */,/*13444*/NULL/* 4E2D */, /*13445*/NULL/* 4E2E */,/*13446*/NULL/* 4E2F */,/*13447*/NULL/* 4E30 */,/*13448*/NULL/* 4E31 */,/*13449*/NULL/* 4E32 */, /*13450*/NULL/* 4E33 */,/*13451*/NULL/* 4E34 */,/*13452*/NULL/* 4E35 */,/*13453*/NULL/* 4E36 */,/*13454*/NULL/* 4E37 */, /*13455*/NULL/* 4E38 */,/*13456*/NULL/* 4E39 */,/*13457*/NULL/* 4E3A */,/*13458*/NULL/* 4E3B */, /*13459*/""/* 4E3C */,/*13460*/NULL/* 4E3D */,/*13461*/NULL/* 4E3E */,/*13462*/NULL/* 4E3F */, /*13463*/NULL/* 4E40 */,/*13464*/NULL/* 4E41 */,/*13465*/NULL/* 4E42 */,/*13466*/NULL/* 4E43 */,/*13467*/NULL/* 4E44 */, /*13468*/NULL/* 4E45 */,/*13469*/NULL/* 4E46 */,/*13470*/NULL/* 4E47 */,/*13471*/NULL/* 4E48 */,/*13472*/NULL/* 4E49 */, /*13473*/NULL/* 4E4A */,/*13474*/NULL/* 4E4B */,/*13475*/NULL/* 4E4C */,/*13476*/NULL/* 4E4D */,/*13477*/NULL/* 4E4E */, /*13478*/NULL/* 4E4F */,/*13479*/NULL/* 4E50 */,/*13480*/NULL/* 4E51 */,/*13481*/NULL/* 4E52 */,/*13482*/NULL/* 4E53 */, /*13483*/NULL/* 4E54 */,/*13484*/""/* 4E55 */,/*13485*/NULL/* 4E56 */,/*13486*/NULL/* 4E57 */, /*13487*/NULL/* 4E58 */,/*13488*/NULL/* 4E59 */,/*13489*/NULL/* 4E5A */,/*13490*/NULL/* 4E5B */,/*13491*/NULL/* 4E5C */, /*13492*/""/* 4E5D */,/*13493*/""/* 4E5E */,/*13494*/NULL/* 4E5F */, /*13495*/NULL/* 4E60 */,/*13496*/NULL/* 4E61 */,/*13497*/NULL/* 4E62 */,/*13498*/NULL/* 4E63 */,/*13499*/NULL/* 4E64 */, /*13500*/NULL/* 4E65 */,/*13501*/NULL/* 4E66 */,/*13502*/NULL/* 4E67 */,/*13503*/NULL/* 4E68 */,/*13504*/NULL/* 4E69 */, /*13505*/NULL/* 4E6A */,/*13506*/NULL/* 4E6B */,/*13507*/NULL/* 4E6C */,/*13508*/NULL/* 4E6D */,/*13509*/NULL/* 4E6E */, /*13510*/NULL/* 4E6F */,/*13511*/NULL/* 4E70 */,/*13512*/NULL/* 4E71 */,/*13513*/NULL/* 4E72 */,/*13514*/NULL/* 4E73 */, /*13515*/NULL/* 4E74 */,/*13516*/NULL/* 4E75 */,/*13517*/NULL/* 4E76 */,/*13518*/""/* 4E77 */, /*13519*/NULL/* 4E78 */,/*13520*/NULL/* 4E79 */,/*13521*/NULL/* 4E7A */,/*13522*/NULL/* 4E7B */,/*13523*/NULL/* 4E7C */, /*13524*/NULL/* 4E7D */,/*13525*/NULL/* 4E7E */,/*13526*/NULL/* 4E7F */,/*13527*/NULL/* 4E80 */,/*13528*/NULL/* 4E81 */, /*13529*/NULL/* 4E82 */,/*13530*/NULL/* 4E83 */,/*13531*/NULL/* 4E84 */,/*13532*/NULL/* 4E85 */,/*13533*/NULL/* 4E86 */, /*13534*/NULL/* 4E87 */,/*13535*/NULL/* 4E88 */,/*13536*/NULL/* 4E89 */,/*13537*/NULL/* 4E8A */,/*13538*/NULL/* 4E8B */, /*13539*/""/* 4E8C */,/*13540*/""/* 4E8D */,/*13541*/NULL/* 4E8E */, /*13542*/NULL/* 4E8F */,/*13543*/NULL/* 4E90 */,/*13544*/NULL/* 4E91 */,/*13545*/NULL/* 4E92 */,/*13546*/NULL/* 4E93 */, /*13547*/""/* 4E94 */,/*13548*/""/* 4E95 */,/*13549*/""/* 4E96 */, /*13550*/""/* 4E97 */,/*13551*/NULL/* 4E98 */,/*13552*/NULL/* 4E99 */,/*13553*/NULL/* 4E9A */, /*13554*/NULL/* 4E9B */,/*13555*/NULL/* 4E9C */,/*13556*/NULL/* 4E9D */,/*13557*/NULL/* 4E9E */,/*13558*/NULL/* 4E9F */, /*13559*/NULL/* 4EA0 */,/*13560*/NULL/* 4EA1 */,/*13561*/NULL/* 4EA2 */,/*13562*/NULL/* 4EA3 */,/*13563*/NULL/* 4EA4 */, /*13564*/NULL/* 4EA5 */,/*13565*/NULL/* 4EA6 */,/*13566*/NULL/* 4EA7 */,/*13567*/NULL/* 4EA8 */,/*13568*/NULL/* 4EA9 */, /*13569*/NULL/* 4EAA */,/*13570*/NULL/* 4EAB */,/*13571*/NULL/* 4EAC */,/*13572*/NULL/* 4EAD */,/*13573*/NULL/* 4EAE */, /*13574*/NULL/* 4EAF */,/*13575*/""/* 4EB0 */,/*13576*/NULL/* 4EB1 */,/*13577*/NULL/* 4EB2 */, /*13578*/NULL/* 4EB3 */,/*13579*/NULL/* 4EB4 */,/*13580*/NULL/* 4EB5 */,/*13581*/NULL/* 4EB6 */,/*13582*/NULL/* 4EB7 */, /*13583*/NULL/* 4EB8 */,/*13584*/NULL/* 4EB9 */,/*13585*/NULL/* 4EBA */,/*13586*/NULL/* 4EBB */,/*13587*/NULL/* 4EBC */, /*13588*/NULL/* 4EBD */,/*13589*/NULL/* 4EBE */,/*13590*/""/* 4EBF */, /*13591*/""/* 4EC0 */,/*13592*/""/* 4EC1 */,/*13593*/NULL/* 4EC2 */, /*13594*/NULL/* 4EC3 */,/*13595*/NULL/* 4EC4 */,/*13596*/NULL/* 4EC5 */,/*13597*/NULL/* 4EC6 */,/*13598*/NULL/* 4EC7 */, /*13599*/NULL/* 4EC8 */,/*13600*/NULL/* 4EC9 */,/*13601*/NULL/* 4ECA */,/*13602*/NULL/* 4ECB */,/*13603*/NULL/* 4ECC */, /*13604*/NULL/* 4ECD */,/*13605*/NULL/* 4ECE */,/*13606*/NULL/* 4ECF */,/*13607*/NULL/* 4ED0 */,/*13608*/NULL/* 4ED1 */, /*13609*/NULL/* 4ED2 */,/*13610*/NULL/* 4ED3 */,/*13611*/NULL/* 4ED4 */,/*13612*/NULL/* 4ED5 */,/*13613*/NULL/* 4ED6 */, /*13614*/NULL/* 4ED7 */,/*13615*/NULL/* 4ED8 */,/*13616*/NULL/* 4ED9 */,/*13617*/""/* 4EDA */, /*13618*/NULL/* 4EDB */,/*13619*/NULL/* 4EDC */,/*13620*/NULL/* 4EDD */,/*13621*/NULL/* 4EDE */, /*13622*/""/* 4EDF */,/*13623*/""/* 4EE0 */,/*13624*/NULL/* 4EE1 */, /*13625*/NULL/* 4EE2 */,/*13626*/NULL/* 4EE3 */,/*13627*/NULL/* 4EE4 */,/*13628*/NULL/* 4EE5 */,/*13629*/NULL/* 4EE6 */, /*13630*/NULL/* 4EE7 */,/*13631*/""/* 4EE8 */,/*13632*/""/* 4EE9 */, /*13633*/NULL/* 4EEA */,/*13634*/NULL/* 4EEB */,/*13635*/NULL/* 4EEC */,/*13636*/NULL/* 4EED */,/*13637*/NULL/* 4EEE */, /*13638*/NULL/* 4EEF */,/*13639*/NULL/* 4EF0 */,/*13640*/NULL/* 4EF1 */,/*13641*/NULL/* 4EF2 */,/*13642*/NULL/* 4EF3 */, /*13643*/NULL/* 4EF4 */,/*13644*/NULL/* 4EF5 */,/*13645*/NULL/* 4EF6 */,/*13646*/NULL/* 4EF7 */,/*13647*/NULL/* 4EF8 */, /*13648*/NULL/* 4EF9 */,/*13649*/NULL/* 4EFA */,/*13650*/NULL/* 4EFB */,/*13651*/NULL/* 4EFC */,/*13652*/NULL/* 4EFD */, /*13653*/NULL/* 4EFE */,/*13654*/NULL/* 4EFF */,/*13655*/NULL/* 4F00 */,/*13656*/NULL/* 4F01 */, /*13657*/""/* 4F02 */,/*13658*/NULL/* 4F03 */,/*13659*/NULL/* 4F04 */,/*13660*/NULL/* 4F05 */, /*13661*/NULL/* 4F06 */,/*13662*/NULL/* 4F07 */,/*13663*/NULL/* 4F08 */,/*13664*/NULL/* 4F09 */,/*13665*/NULL/* 4F0A */, /*13666*/NULL/* 4F0B */,/*13667*/NULL/* 4F0C */,/*13668*/""/* 4F0D */, /*13669*/""/* 4F0E */,/*13670*/NULL/* 4F0F */,/*13671*/NULL/* 4F10 */,/*13672*/NULL/* 4F11 */, /*13673*/NULL/* 4F12 */,/*13674*/NULL/* 4F13 */,/*13675*/NULL/* 4F14 */,/*13676*/NULL/* 4F15 */,/*13677*/NULL/* 4F16 */, /*13678*/NULL/* 4F17 */,/*13679*/NULL/* 4F18 */,/*13680*/NULL/* 4F19 */,/*13681*/NULL/* 4F1A */,/*13682*/NULL/* 4F1B */, /*13683*/NULL/* 4F1C */,/*13684*/NULL/* 4F1D */,/*13685*/NULL/* 4F1E */,/*13686*/NULL/* 4F1F */,/*13687*/NULL/* 4F20 */, /*13688*/NULL/* 4F21 */,/*13689*/NULL/* 4F22 */,/*13690*/NULL/* 4F23 */,/*13691*/NULL/* 4F24 */,/*13692*/NULL/* 4F25 */, /*13693*/NULL/* 4F26 */,/*13694*/""/* 4F27 */,/*13695*/NULL/* 4F28 */,/*13696*/NULL/* 4F29 */, /*13697*/NULL/* 4F2A */,/*13698*/NULL/* 4F2B */,/*13699*/NULL/* 4F2C */,/*13700*/NULL/* 4F2D */,/*13701*/NULL/* 4F2E */, /*13702*/NULL/* 4F2F */,/*13703*/NULL/* 4F30 */,/*13704*/NULL/* 4F31 */,/*13705*/NULL/* 4F32 */,/*13706*/NULL/* 4F33 */, /*13707*/NULL/* 4F34 */,/*13708*/NULL/* 4F35 */,/*13709*/NULL/* 4F36 */,/*13710*/NULL/* 4F37 */,/*13711*/NULL/* 4F38 */, /*13712*/NULL/* 4F39 */,/*13713*/NULL/* 4F3A */,/*13714*/NULL/* 4F3B */,/*13715*/NULL/* 4F3C */,/*13716*/NULL/* 4F3D */, /*13717*/NULL/* 4F3E */,/*13718*/NULL/* 4F3F */,/*13719*/""/* 4F40 */,/*13720*/NULL/* 4F41 */, /*13721*/NULL/* 4F42 */,/*13722*/NULL/* 4F43 */,/*13723*/NULL/* 4F44 */,/*13724*/NULL/* 4F45 */,/*13725*/NULL/* 4F46 */, /*13726*/NULL/* 4F47 */,/*13727*/NULL/* 4F48 */,/*13728*/NULL/* 4F49 */,/*13729*/NULL/* 4F4A */,/*13730*/NULL/* 4F4B */, /*13731*/NULL/* 4F4C */,/*13732*/NULL/* 4F4D */,/*13733*/NULL/* 4F4E */,/*13734*/NULL/* 4F4F */,/*13735*/NULL/* 4F50 */, /*13736*/NULL/* 4F51 */,/*13737*/NULL/* 4F52 */,/*13738*/NULL/* 4F53 */,/*13739*/NULL/* 4F54 */,/*13740*/NULL/* 4F55 */, /*13741*/NULL/* 4F56 */,/*13742*/NULL/* 4F57 */,/*13743*/NULL/* 4F58 */,/*13744*/""/* 4F59 */, /*13745*/NULL/* 4F5A */,/*13746*/NULL/* 4F5B */,/*13747*/NULL/* 4F5C */,/*13748*/NULL/* 4F5D */,/*13749*/NULL/* 4F5E */, /*13750*/NULL/* 4F5F */,/*13751*/NULL/* 4F60 */,/*13752*/NULL/* 4F61 */,/*13753*/NULL/* 4F62 */,/*13754*/NULL/* 4F63 */, /*13755*/NULL/* 4F64 */,/*13756*/NULL/* 4F65 */,/*13757*/NULL/* 4F66 */,/*13758*/NULL/* 4F67 */,/*13759*/NULL/* 4F68 */, /*13760*/NULL/* 4F69 */,/*13761*/NULL/* 4F6A */,/*13762*/NULL/* 4F6B */,/*13763*/NULL/* 4F6C */,/*13764*/NULL/* 4F6D */, /*13765*/NULL/* 4F6E */,/*13766*/NULL/* 4F6F */,/*13767*/""/* 4F70 */, /*13768*/""/* 4F71 */,/*13769*/""/* 5104 */,/*13770*/""/* 5105 */, /*13771*/NULL/* 5106 */,/*13772*/NULL/* 5107 */,/*13773*/NULL/* 5108 */,/*13774*/NULL/* 5109 */,/*13775*/NULL/* 510A */, /*13776*/NULL/* 510B */,/*13777*/NULL/* 510C */,/*13778*/NULL/* 510D */,/*13779*/NULL/* 510E */,/*13780*/NULL/* 510F */, /*13781*/NULL/* 5110 */,/*13782*/NULL/* 5111 */,/*13783*/NULL/* 5112 */,/*13784*/NULL/* 5113 */,/*13785*/NULL/* 5114 */, /*13786*/NULL/* 5115 */,/*13787*/NULL/* 5116 */,/*13788*/NULL/* 5117 */,/*13789*/NULL/* 5118 */,/*13790*/NULL/* 5119 */, /*13791*/NULL/* 511A */,/*13792*/NULL/* 511B */,/*13793*/NULL/* 511C */,/*13794*/NULL/* 511D */, /*13795*/""/* 511E */,/*13796*/NULL/* 511F */,/*13797*/NULL/* 5120 */,/*13798*/NULL/* 5121 */, /*13799*/NULL/* 5122 */,/*13800*/NULL/* 5123 */,/*13801*/NULL/* 5124 */,/*13802*/NULL/* 5125 */,/*13803*/NULL/* 5126 */, /*13804*/NULL/* 5127 */,/*13805*/NULL/* 5128 */,/*13806*/NULL/* 5129 */,/*13807*/NULL/* 512A */,/*13808*/NULL/* 512B */, /*13809*/NULL/* 512C */,/*13810*/NULL/* 512D */,/*13811*/NULL/* 512E */,/*13812*/NULL/* 512F */,/*13813*/NULL/* 5130 */, /*13814*/NULL/* 5131 */,/*13815*/NULL/* 5132 */,/*13816*/NULL/* 5133 */,/*13817*/NULL/* 5134 */,/*13818*/NULL/* 5135 */, /*13819*/NULL/* 5136 */,/*13820*/""/* 5137 */,/*13821*/NULL/* 5138 */,/*13822*/NULL/* 5139 */, /*13823*/NULL/* 513A */,/*13824*/NULL/* 513B */,/*13825*/NULL/* 513C */,/*13826*/NULL/* 513D */,/*13827*/NULL/* 513E */, /*13828*/NULL/* 513F */,/*13829*/NULL/* 5140 */,/*13830*/NULL/* 5141 */,/*13831*/NULL/* 5142 */,/*13832*/NULL/* 5143 */, /*13833*/NULL/* 5144 */,/*13834*/NULL/* 5145 */,/*13835*/""/* 5146 */, /*13836*/""/* 5147 */,/*13837*/NULL/* 5148 */,/*13838*/NULL/* 5149 */,/*13839*/NULL/* 514A */, /*13840*/NULL/* 514B */,/*13841*/NULL/* 514C */,/*13842*/NULL/* 514D */,/*13843*/NULL/* 514E */,/*13844*/NULL/* 514F */, /*13845*/NULL/* 5150 */,/*13846*/NULL/* 5151 */,/*13847*/NULL/* 5152 */,/*13848*/NULL/* 5153 */,/*13849*/NULL/* 5154 */, /*13850*/NULL/* 5155 */,/*13851*/NULL/* 5156 */,/*13852*/NULL/* 5157 */,/*13853*/NULL/* 5158 */,/*13854*/NULL/* 5159 */, /*13855*/NULL/* 515A */,/*13856*/NULL/* 515B */,/*13857*/NULL/* 515C */,/*13858*/NULL/* 515D */,/*13859*/NULL/* 515E */, /*13860*/NULL/* 515F */,/*13861*/""/* 5160 */,/*13862*/NULL/* 5161 */,/*13863*/NULL/* 5162 */, /*13864*/NULL/* 5163 */,/*13865*/NULL/* 5164 */,/*13866*/NULL/* 5165 */,/*13867*/NULL/* 5166 */,/*13868*/NULL/* 5167 */, /*13869*/NULL/* 5168 */,/*13870*/""/* 5169 */,/*13871*/""/* 516A */, /*13872*/""/* 516B */,/*13873*/""/* 516C */,/*13874*/""/* 516D */, /*13875*/""/* 516E */,/*13876*/""/* 5341 */,/*13877*/""/* 5342 */, /*13878*/""/* 5343 */,/*13879*/""/* 5344 */,/*13880*/""/* 5345 */, /*13881*/""/* 5346 */,/*13882*/NULL/* 5347 */,/*13883*/NULL/* 5348 */,/*13884*/NULL/* 5349 */, /*13885*/NULL/* 534A */,/*13886*/NULL/* 534B */,/*13887*/""/* 534C */, /*13888*/""/* 534D */,/*13889*/""/* 53C1 */,/*13890*/NULL/* 53C2 */, /*13891*/NULL/* 53C3 */,/*13892*/NULL/* 53C4 */,/*13893*/""/* 53C5 */, /*13894*/""/* 56DB */,/*13895*/""/* 56DC */,/*13896*/""/* 58F1 */, /*13897*/""/* 58F2 */,/*13898*/NULL/* 58F3 */,/*13899*/NULL/* 58F4 */,/*13900*/NULL/* 58F5 */, /*13901*/NULL/* 58F6 */,/*13902*/NULL/* 58F7 */,/*13903*/NULL/* 58F8 */,/*13904*/""/* 58F9 */, /*13905*/""/* 58FA */,/*13906*/""/* 5E7A */,/*13907*/""/* 5E7B */, /*13908*/""/* 5EFE */,/*13909*/""/* 5EFF */,/*13910*/""/* 5F00 */, /*13911*/NULL/* 5F01 */,/*13912*/NULL/* 5F02 */,/*13913*/NULL/* 5F03 */,/*13914*/NULL/* 5F04 */,/*13915*/NULL/* 5F05 */, /*13916*/NULL/* 5F06 */,/*13917*/NULL/* 5F07 */,/*13918*/NULL/* 5F08 */,/*13919*/NULL/* 5F09 */,/*13920*/NULL/* 5F0A */, /*13921*/NULL/* 5F0B */,/*13922*/""/* 5F0C */,/*13923*/""/* 5F0D */, /*13924*/""/* 5F0E */,/*13925*/""/* 5F0F */,/*13926*/""/* 5F10 */, /*13927*/""/* 5F11 */,/*13928*/""/* 62FE */,/*13929*/""/* 62FF */, /*13930*/NULL/* 6300 */,/*13931*/NULL/* 6301 */,/*13932*/NULL/* 6302 */,/*13933*/NULL/* 6303 */,/*13934*/NULL/* 6304 */, /*13935*/NULL/* 6305 */,/*13936*/NULL/* 6306 */,/*13937*/NULL/* 6307 */,/*13938*/NULL/* 6308 */,/*13939*/NULL/* 6309 */, /*13940*/NULL/* 630A */,/*13941*/NULL/* 630B */,/*13942*/NULL/* 630C */,/*13943*/NULL/* 630D */,/*13944*/NULL/* 630E */, /*13945*/NULL/* 630F */,/*13946*/NULL/* 6310 */,/*13947*/NULL/* 6311 */,/*13948*/NULL/* 6312 */,/*13949*/NULL/* 6313 */, /*13950*/NULL/* 6314 */,/*13951*/NULL/* 6315 */,/*13952*/NULL/* 6316 */,/*13953*/NULL/* 6317 */, /*13954*/""/* 6318 */,/*13955*/NULL/* 6319 */,/*13956*/NULL/* 631A */,/*13957*/NULL/* 631B */, /*13958*/NULL/* 631C */,/*13959*/NULL/* 631D */,/*13960*/NULL/* 631E */,/*13961*/NULL/* 631F */,/*13962*/NULL/* 6320 */, /*13963*/NULL/* 6321 */,/*13964*/NULL/* 6322 */,/*13965*/NULL/* 6323 */,/*13966*/NULL/* 6324 */,/*13967*/NULL/* 6325 */, /*13968*/NULL/* 6326 */,/*13969*/NULL/* 6327 */,/*13970*/NULL/* 6328 */,/*13971*/NULL/* 6329 */,/*13972*/NULL/* 632A */, /*13973*/NULL/* 632B */,/*13974*/NULL/* 632C */,/*13975*/NULL/* 632D */,/*13976*/NULL/* 632E */,/*13977*/NULL/* 632F */, /*13978*/NULL/* 6330 */,/*13979*/""/* 6331 */,/*13980*/NULL/* 6332 */,/*13981*/NULL/* 6333 */, /*13982*/NULL/* 6334 */,/*13983*/NULL/* 6335 */,/*13984*/NULL/* 6336 */,/*13985*/NULL/* 6337 */,/*13986*/NULL/* 6338 */, /*13987*/NULL/* 6339 */,/*13988*/NULL/* 633A */,/*13989*/NULL/* 633B */,/*13990*/NULL/* 633C */,/*13991*/NULL/* 633D */, /*13992*/NULL/* 633E */,/*13993*/NULL/* 633F */,/*13994*/NULL/* 6340 */,/*13995*/NULL/* 6341 */,/*13996*/NULL/* 6342 */, /*13997*/NULL/* 6343 */,/*13998*/NULL/* 6344 */,/*13999*/NULL/* 6345 */,/*14000*/NULL/* 6346 */,/*14001*/NULL/* 6347 */, /*14002*/NULL/* 6348 */,/*14003*/NULL/* 6349 */,/*14004*/""/* 634A */,/*14005*/NULL/* 634B */, /*14006*/""/* 634C */,/*14007*/""/* 634D */,/*14008*/""/* 67D2 */, /*14009*/""/* 67D3 */,/*14010*/""/* 6F06 */,/*14011*/""/* 6F07 */, /*14012*/""/* 7396 */,/*14013*/""/* 7397 */,/*14014*/""/* 767E */, /*14015*/""/* 767F */,/*14016*/""/* 8086 */,/*14017*/""/* 8087 */, /*14018*/""/* 842C */,/*14019*/""/* 842D */,/*14020*/""/* 8CAE */, /*14021*/""/* 8CAF */,/*14022*/NULL/* 8CB0 */,/*14023*/NULL/* 8CB1 */,/*14024*/NULL/* 8CB2 */, /*14025*/""/* 8CB3 */,/*14026*/""/* 8CB4 */,/*14027*/""/* 8D30 */, /*14028*/""/* 8D31 */,/*14029*/""/* 9621 */,/*14030*/""/* 9622 */, /*14031*/NULL/* 9623 */,/*14032*/NULL/* 9624 */,/*14033*/NULL/* 9625 */,/*14034*/NULL/* 9626 */,/*14035*/NULL/* 9627 */, /*14036*/NULL/* 9628 */,/*14037*/NULL/* 9629 */,/*14038*/NULL/* 962A */,/*14039*/NULL/* 962B */,/*14040*/NULL/* 962C */, /*14041*/NULL/* 962D */,/*14042*/NULL/* 962E */,/*14043*/NULL/* 962F */,/*14044*/NULL/* 9630 */,/*14045*/NULL/* 9631 */, /*14046*/NULL/* 9632 */,/*14047*/NULL/* 9633 */,/*14048*/NULL/* 9634 */,/*14049*/NULL/* 9635 */,/*14050*/NULL/* 9636 */, /*14051*/NULL/* 9637 */,/*14052*/NULL/* 9638 */,/*14053*/NULL/* 9639 */,/*14054*/NULL/* 963A */, /*14055*/""/* 963B */,/*14056*/NULL/* 963C */,/*14057*/NULL/* 963D */,/*14058*/NULL/* 963E */, /*14059*/NULL/* 963F */,/*14060*/NULL/* 9640 */,/*14061*/NULL/* 9641 */,/*14062*/NULL/* 9642 */,/*14063*/NULL/* 9643 */, /*14064*/NULL/* 9644 */,/*14065*/NULL/* 9645 */,/*14066*/""/* 9646 */, /*14067*/""/* 9647 */,/*14068*/NULL/* 9648 */,/*14069*/NULL/* 9649 */,/*14070*/NULL/* 964A */, /*14071*/NULL/* 964B */,/*14072*/""/* 964C */,/*14073*/""/* 964D */, /*14074*/NULL/* 964E */,/*14075*/NULL/* 964F */,/*14076*/NULL/* 9650 */,/*14077*/NULL/* 9651 */,/*14078*/NULL/* 9652 */, /*14079*/NULL/* 9653 */,/*14080*/NULL/* 9654 */,/*14081*/NULL/* 9655 */,/*14082*/NULL/* 9656 */,/*14083*/NULL/* 9657 */, /*14084*/NULL/* 9658 */,/*14085*/NULL/* 9659 */,/*14086*/NULL/* 965A */,/*14087*/NULL/* 965B */,/*14088*/NULL/* 965C */, /*14089*/NULL/* 965D */,/*14090*/NULL/* 965E */,/*14091*/NULL/* 965F */,/*14092*/NULL/* 9660 */,/*14093*/NULL/* 9661 */, /*14094*/NULL/* 9662 */,/*14095*/NULL/* 9663 */,/*14096*/NULL/* 9664 */,/*14097*/NULL/* 9665 */, /*14098*/""/* 9666 */,/*14099*/NULL/* 9667 */,/*14100*/NULL/* 9668 */,/*14101*/NULL/* 9669 */, /*14102*/NULL/* 966A */,/*14103*/NULL/* 966B */,/*14104*/NULL/* 966C */,/*14105*/NULL/* 966D */,/*14106*/NULL/* 966E */, /*14107*/NULL/* 966F */,/*14108*/NULL/* 9670 */,/*14109*/NULL/* 9671 */,/*14110*/NULL/* 9672 */,/*14111*/NULL/* 9673 */, /*14112*/NULL/* 9674 */,/*14113*/NULL/* 9675 */,/*14114*/NULL/* 9676 */,/*14115*/NULL/* 9677 */, /*14116*/""/* 9678 */,/*14117*/""/* 9679 */,/*14118*/""/* 96F6 */, /*14119*/""/* 96F7 */,/*14120*/""/* 9FA6 */,/*14121*/NULL/* 9FA7 */, /*14122*/NULL/* 9FA8 */,/*14123*/NULL/* 9FA9 */,/*14124*/NULL/* 9FAA */,/*14125*/NULL/* 9FAB */,/*14126*/NULL/* 9FAC */, /*14127*/NULL/* 9FAD */,/*14128*/NULL/* 9FAE */,/*14129*/NULL/* 9FAF */,/*14130*/NULL/* 9FB0 */,/*14131*/NULL/* 9FB1 */, /*14132*/NULL/* 9FB2 */,/*14133*/NULL/* 9FB3 */,/*14134*/NULL/* 9FB4 */,/*14135*/NULL/* 9FB5 */,/*14136*/NULL/* 9FB6 */, /*14137*/NULL/* 9FB7 */,/*14138*/NULL/* 9FB8 */,/*14139*/NULL/* 9FB9 */,/*14140*/NULL/* 9FBA */,/*14141*/NULL/* 9FBB */, /*14142*/""/* 9FBC */,/*14143*/NULL/* 9FBD */,/*14144*/NULL/* 9FBE */,/*14145*/NULL/* 9FBF */, /*14146*/NULL/* 9FC0 */,/*14147*/NULL/* 9FC1 */,/*14148*/NULL/* 9FC2 */,/*14149*/NULL/* 9FC3 */, /*14150*/""/* 9FC4 */,/*14151*/NULL/* 9FC5 */,/*14152*/NULL/* 9FC6 */,/*14153*/NULL/* 9FC7 */, /*14154*/NULL/* 9FC8 */,/*14155*/NULL/* 9FC9 */,/*14156*/NULL/* 9FCA */,/*14157*/NULL/* 9FCB */, /*14158*/""/* 9FCC */,/*14159*/""/* 9FCD */,/*14160*/NULL/* 9FCE */, /*14161*/NULL/* 9FCF */,/*14162*/NULL/* 9FD0 */,/*14163*/NULL/* 9FD1 */,/*14164*/NULL/* 9FD2 */,/*14165*/NULL/* 9FD3 */, /*14166*/NULL/* 9FD4 */,/*14167*/NULL/* 9FD5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*14210*/"YI SYLLABLE IT"/* A000 */,/*14211*/"YI SYLLABLE IX"/* A001 */, /*14212*/"YI SYLLABLE I"/* A002 */,/*14213*/"YI SYLLABLE IP"/* A003 */,/*14214*/"YI SYLLABLE IET"/* A004 */, /*14215*/"YI SYLLABLE IEX"/* A005 */,/*14216*/"YI SYLLABLE IE"/* A006 */,/*14217*/"YI SYLLABLE IEP"/* A007 */, /*14218*/"YI SYLLABLE AT"/* A008 */,/*14219*/"YI SYLLABLE AX"/* A009 */,/*14220*/"YI SYLLABLE A"/* A00A */, /*14221*/"YI SYLLABLE AP"/* A00B */,/*14222*/"YI SYLLABLE UOX"/* A00C */,/*14223*/"YI SYLLABLE UO"/* A00D */, /*14224*/"YI SYLLABLE UOP"/* A00E */,/*14225*/"YI SYLLABLE OT"/* A00F */,/*14226*/"YI SYLLABLE OX"/* A010 */, /*14227*/"YI SYLLABLE O"/* A011 */,/*14228*/"YI SYLLABLE OP"/* A012 */,/*14229*/"YI SYLLABLE EX"/* A013 */, /*14230*/"YI SYLLABLE E"/* A014 */,/*14231*/"YI SYLLABLE WU"/* A015 */,/*14232*/"YI SYLLABLE BIT"/* A016 */, /*14233*/"YI SYLLABLE BIX"/* A017 */,/*14234*/"YI SYLLABLE BI"/* A018 */,/*14235*/"YI SYLLABLE BIP"/* A019 */, /*14236*/"YI SYLLABLE BIET"/* A01A */,/*14237*/"YI SYLLABLE BIEX"/* A01B */,/*14238*/"YI SYLLABLE BIE"/* A01C */, /*14239*/"YI SYLLABLE BIEP"/* A01D */,/*14240*/"YI SYLLABLE BAT"/* A01E */,/*14241*/"YI SYLLABLE BAX"/* A01F */, /*14242*/"YI SYLLABLE BA"/* A020 */,/*14243*/"YI SYLLABLE BAP"/* A021 */,/*14244*/"YI SYLLABLE BUOX"/* A022 */, /*14245*/"YI SYLLABLE BUO"/* A023 */,/*14246*/"YI SYLLABLE BUOP"/* A024 */,/*14247*/"YI SYLLABLE BOT"/* A025 */, /*14248*/"YI SYLLABLE BOX"/* A026 */,/*14249*/"YI SYLLABLE BO"/* A027 */,/*14250*/"YI SYLLABLE BOP"/* A028 */, /*14251*/"YI SYLLABLE BEX"/* A029 */,/*14252*/"YI SYLLABLE BE"/* A02A */,/*14253*/"YI SYLLABLE BEP"/* A02B */, /*14254*/"YI SYLLABLE BUT"/* A02C */,/*14255*/"YI SYLLABLE BUX"/* A02D */,/*14256*/"YI SYLLABLE BU"/* A02E */, /*14257*/"YI SYLLABLE BUP"/* A02F */,/*14258*/"YI SYLLABLE BURX"/* A030 */,/*14259*/"YI SYLLABLE BUR"/* A031 */, /*14260*/"YI SYLLABLE BYT"/* A032 */,/*14261*/"YI SYLLABLE BYX"/* A033 */,/*14262*/"YI SYLLABLE BY"/* A034 */, /*14263*/"YI SYLLABLE BYP"/* A035 */,/*14264*/"YI SYLLABLE BYRX"/* A036 */,/*14265*/"YI SYLLABLE BYR"/* A037 */, /*14266*/"YI SYLLABLE PIT"/* A038 */,/*14267*/"YI SYLLABLE PIX"/* A039 */,/*14268*/"YI SYLLABLE PI"/* A03A */, /*14269*/"YI SYLLABLE PIP"/* A03B */,/*14270*/"YI SYLLABLE PIEX"/* A03C */,/*14271*/"YI SYLLABLE PIE"/* A03D */, /*14272*/"YI SYLLABLE PIEP"/* A03E */,/*14273*/"YI SYLLABLE PAT"/* A03F */,/*14274*/"YI SYLLABLE PAX"/* A040 */, /*14275*/"YI SYLLABLE PA"/* A041 */,/*14276*/"YI SYLLABLE PAP"/* A042 */,/*14277*/"YI SYLLABLE PUOX"/* A043 */, /*14278*/"YI SYLLABLE PUO"/* A044 */,/*14279*/"YI SYLLABLE PUOP"/* A045 */,/*14280*/"YI SYLLABLE POT"/* A046 */, /*14281*/"YI SYLLABLE POX"/* A047 */,/*14282*/"YI SYLLABLE PO"/* A048 */,/*14283*/"YI SYLLABLE POP"/* A049 */, /*14284*/"YI SYLLABLE PUT"/* A04A */,/*14285*/"YI SYLLABLE PUX"/* A04B */,/*14286*/"YI SYLLABLE PU"/* A04C */, /*14287*/"YI SYLLABLE PUP"/* A04D */,/*14288*/"YI SYLLABLE PURX"/* A04E */,/*14289*/"YI SYLLABLE PUR"/* A04F */, /*14290*/"YI SYLLABLE PYT"/* A050 */,/*14291*/"YI SYLLABLE PYX"/* A051 */,/*14292*/"YI SYLLABLE PY"/* A052 */, /*14293*/"YI SYLLABLE PYP"/* A053 */,/*14294*/"YI SYLLABLE PYRX"/* A054 */,/*14295*/"YI SYLLABLE PYR"/* A055 */, /*14296*/"YI SYLLABLE BBIT"/* A056 */,/*14297*/"YI SYLLABLE BBIX"/* A057 */,/*14298*/"YI SYLLABLE BBI"/* A058 */, /*14299*/"YI SYLLABLE BBIP"/* A059 */,/*14300*/"YI SYLLABLE BBIET"/* A05A */,/*14301*/"YI SYLLABLE BBIEX"/* A05B */, /*14302*/"YI SYLLABLE BBIE"/* A05C */,/*14303*/"YI SYLLABLE BBIEP"/* A05D */,/*14304*/"YI SYLLABLE BBAT"/* A05E */, /*14305*/"YI SYLLABLE BBAX"/* A05F */,/*14306*/"YI SYLLABLE BBA"/* A060 */,/*14307*/"YI SYLLABLE BBAP"/* A061 */, /*14308*/"YI SYLLABLE BBUOX"/* A062 */,/*14309*/"YI SYLLABLE BBUO"/* A063 */,/*14310*/"YI SYLLABLE BBUOP"/* A064 */, /*14311*/"YI SYLLABLE BBOT"/* A065 */,/*14312*/"YI SYLLABLE BBOX"/* A066 */,/*14313*/"YI SYLLABLE BBO"/* A067 */, /*14314*/"YI SYLLABLE BBOP"/* A068 */,/*14315*/"YI SYLLABLE BBEX"/* A069 */,/*14316*/"YI SYLLABLE BBE"/* A06A */, /*14317*/"YI SYLLABLE BBEP"/* A06B */,/*14318*/"YI SYLLABLE BBUT"/* A06C */,/*14319*/"YI SYLLABLE BBUX"/* A06D */, /*14320*/"YI SYLLABLE BBU"/* A06E */,/*14321*/"YI SYLLABLE BBUP"/* A06F */,/*14322*/"YI SYLLABLE BBURX"/* A070 */, /*14323*/"YI SYLLABLE BBUR"/* A071 */,/*14324*/"YI SYLLABLE BBYT"/* A072 */,/*14325*/"YI SYLLABLE BBYX"/* A073 */, /*14326*/"YI SYLLABLE BBY"/* A074 */,/*14327*/"YI SYLLABLE BBYP"/* A075 */,/*14328*/"YI SYLLABLE NBIT"/* A076 */, /*14329*/"YI SYLLABLE NBIX"/* A077 */,/*14330*/"YI SYLLABLE NBI"/* A078 */,/*14331*/"YI SYLLABLE NBIP"/* A079 */, /*14332*/"YI SYLLABLE NBIEX"/* A07A */,/*14333*/"YI SYLLABLE NBIE"/* A07B */,/*14334*/"YI SYLLABLE NBIEP"/* A07C */, /*14335*/"YI SYLLABLE NBAT"/* A07D */,/*14336*/"YI SYLLABLE NBAX"/* A07E */,/*14337*/"YI SYLLABLE NBA"/* A07F */, /*14338*/"YI SYLLABLE NBAP"/* A080 */,/*14339*/"YI SYLLABLE NBOT"/* A081 */,/*14340*/"YI SYLLABLE NBOX"/* A082 */, /*14341*/"YI SYLLABLE NBO"/* A083 */,/*14342*/"YI SYLLABLE NBOP"/* A084 */,/*14343*/"YI SYLLABLE NBUT"/* A085 */, /*14344*/"YI SYLLABLE NBUX"/* A086 */,/*14345*/"YI SYLLABLE NBU"/* A087 */,/*14346*/"YI SYLLABLE NBUP"/* A088 */, /*14347*/"YI SYLLABLE NBURX"/* A089 */,/*14348*/"YI SYLLABLE NBUR"/* A08A */,/*14349*/"YI SYLLABLE NBYT"/* A08B */, /*14350*/"YI SYLLABLE NBYX"/* A08C */,/*14351*/"YI SYLLABLE NBY"/* A08D */,/*14352*/"YI SYLLABLE NBYP"/* A08E */, /*14353*/"YI SYLLABLE NBYRX"/* A08F */,/*14354*/"YI SYLLABLE NBYR"/* A090 */,/*14355*/"YI SYLLABLE HMIT"/* A091 */, /*14356*/"YI SYLLABLE HMIX"/* A092 */,/*14357*/"YI SYLLABLE HMI"/* A093 */,/*14358*/"YI SYLLABLE HMIP"/* A094 */, /*14359*/"YI SYLLABLE HMIEX"/* A095 */,/*14360*/"YI SYLLABLE HMIE"/* A096 */,/*14361*/"YI SYLLABLE HMIEP"/* A097 */, /*14362*/"YI SYLLABLE HMAT"/* A098 */,/*14363*/"YI SYLLABLE HMAX"/* A099 */,/*14364*/"YI SYLLABLE HMA"/* A09A */, /*14365*/"YI SYLLABLE HMAP"/* A09B */,/*14366*/"YI SYLLABLE HMUOX"/* A09C */,/*14367*/"YI SYLLABLE HMUO"/* A09D */, /*14368*/"YI SYLLABLE HMUOP"/* A09E */,/*14369*/"YI SYLLABLE HMOT"/* A09F */,/*14370*/"YI SYLLABLE HMOX"/* A0A0 */, /*14371*/"YI SYLLABLE HMO"/* A0A1 */,/*14372*/"YI SYLLABLE HMOP"/* A0A2 */,/*14373*/"YI SYLLABLE HMUT"/* A0A3 */, /*14374*/"YI SYLLABLE HMUX"/* A0A4 */,/*14375*/"YI SYLLABLE HMU"/* A0A5 */,/*14376*/"YI SYLLABLE HMUP"/* A0A6 */, /*14377*/"YI SYLLABLE HMURX"/* A0A7 */,/*14378*/"YI SYLLABLE HMUR"/* A0A8 */,/*14379*/"YI SYLLABLE HMYX"/* A0A9 */, /*14380*/"YI SYLLABLE HMY"/* A0AA */,/*14381*/"YI SYLLABLE HMYP"/* A0AB */,/*14382*/"YI SYLLABLE HMYRX"/* A0AC */, /*14383*/"YI SYLLABLE HMYR"/* A0AD */,/*14384*/"YI SYLLABLE MIT"/* A0AE */,/*14385*/"YI SYLLABLE MIX"/* A0AF */, /*14386*/"YI SYLLABLE MI"/* A0B0 */,/*14387*/"YI SYLLABLE MIP"/* A0B1 */,/*14388*/"YI SYLLABLE MIEX"/* A0B2 */, /*14389*/"YI SYLLABLE MIE"/* A0B3 */,/*14390*/"YI SYLLABLE MIEP"/* A0B4 */,/*14391*/"YI SYLLABLE MAT"/* A0B5 */, /*14392*/"YI SYLLABLE MAX"/* A0B6 */,/*14393*/"YI SYLLABLE MA"/* A0B7 */,/*14394*/"YI SYLLABLE MAP"/* A0B8 */, /*14395*/"YI SYLLABLE MUOT"/* A0B9 */,/*14396*/"YI SYLLABLE MUOX"/* A0BA */,/*14397*/"YI SYLLABLE MUO"/* A0BB */, /*14398*/"YI SYLLABLE MUOP"/* A0BC */,/*14399*/"YI SYLLABLE MOT"/* A0BD */,/*14400*/"YI SYLLABLE MOX"/* A0BE */, /*14401*/"YI SYLLABLE MO"/* A0BF */,/*14402*/"YI SYLLABLE MOP"/* A0C0 */,/*14403*/"YI SYLLABLE MEX"/* A0C1 */, /*14404*/"YI SYLLABLE ME"/* A0C2 */,/*14405*/"YI SYLLABLE MUT"/* A0C3 */,/*14406*/"YI SYLLABLE MUX"/* A0C4 */, /*14407*/"YI SYLLABLE MU"/* A0C5 */,/*14408*/"YI SYLLABLE MUP"/* A0C6 */,/*14409*/"YI SYLLABLE MURX"/* A0C7 */, /*14410*/"YI SYLLABLE MUR"/* A0C8 */,/*14411*/"YI SYLLABLE MYT"/* A0C9 */,/*14412*/"YI SYLLABLE MYX"/* A0CA */, /*14413*/"YI SYLLABLE MY"/* A0CB */,/*14414*/"YI SYLLABLE MYP"/* A0CC */,/*14415*/"YI SYLLABLE FIT"/* A0CD */, /*14416*/"YI SYLLABLE FIX"/* A0CE */,/*14417*/"YI SYLLABLE FI"/* A0CF */,/*14418*/"YI SYLLABLE FIP"/* A0D0 */, /*14419*/"YI SYLLABLE FAT"/* A0D1 */,/*14420*/"YI SYLLABLE FAX"/* A0D2 */,/*14421*/"YI SYLLABLE FA"/* A0D3 */, /*14422*/"YI SYLLABLE FAP"/* A0D4 */,/*14423*/"YI SYLLABLE FOX"/* A0D5 */,/*14424*/"YI SYLLABLE FO"/* A0D6 */, /*14425*/"YI SYLLABLE FOP"/* A0D7 */,/*14426*/"YI SYLLABLE FUT"/* A0D8 */,/*14427*/"YI SYLLABLE FUX"/* A0D9 */, /*14428*/"YI SYLLABLE FU"/* A0DA */,/*14429*/"YI SYLLABLE FUP"/* A0DB */,/*14430*/"YI SYLLABLE FURX"/* A0DC */, /*14431*/"YI SYLLABLE FUR"/* A0DD */,/*14432*/"YI SYLLABLE FYT"/* A0DE */,/*14433*/"YI SYLLABLE FYX"/* A0DF */, /*14434*/"YI SYLLABLE FY"/* A0E0 */,/*14435*/"YI SYLLABLE FYP"/* A0E1 */,/*14436*/"YI SYLLABLE VIT"/* A0E2 */, /*14437*/"YI SYLLABLE VIX"/* A0E3 */,/*14438*/"YI SYLLABLE VI"/* A0E4 */,/*14439*/"YI SYLLABLE VIP"/* A0E5 */, /*14440*/"YI SYLLABLE VIET"/* A0E6 */,/*14441*/"YI SYLLABLE VIEX"/* A0E7 */,/*14442*/"YI SYLLABLE VIE"/* A0E8 */, /*14443*/"YI SYLLABLE VIEP"/* A0E9 */,/*14444*/"YI SYLLABLE VAT"/* A0EA */,/*14445*/"YI SYLLABLE VAX"/* A0EB */, /*14446*/"YI SYLLABLE VA"/* A0EC */,/*14447*/"YI SYLLABLE VAP"/* A0ED */,/*14448*/"YI SYLLABLE VOT"/* A0EE */, /*14449*/"YI SYLLABLE VOX"/* A0EF */,/*14450*/"YI SYLLABLE VO"/* A0F0 */,/*14451*/"YI SYLLABLE VOP"/* A0F1 */, /*14452*/"YI SYLLABLE VEX"/* A0F2 */,/*14453*/"YI SYLLABLE VEP"/* A0F3 */,/*14454*/"YI SYLLABLE VUT"/* A0F4 */, /*14455*/"YI SYLLABLE VUX"/* A0F5 */,/*14456*/"YI SYLLABLE VU"/* A0F6 */,/*14457*/"YI SYLLABLE VUP"/* A0F7 */, /*14458*/"YI SYLLABLE VURX"/* A0F8 */,/*14459*/"YI SYLLABLE VUR"/* A0F9 */,/*14460*/"YI SYLLABLE VYT"/* A0FA */, /*14461*/"YI SYLLABLE VYX"/* A0FB */,/*14462*/"YI SYLLABLE VY"/* A0FC */,/*14463*/"YI SYLLABLE VYP"/* A0FD */, /*14464*/"YI SYLLABLE VYRX"/* A0FE */,/*14465*/"YI SYLLABLE VYR"/* A0FF */,/*14466*/"YI SYLLABLE DIT"/* A100 */, /*14467*/"YI SYLLABLE DIX"/* A101 */,/*14468*/"YI SYLLABLE DI"/* A102 */,/*14469*/"YI SYLLABLE DIP"/* A103 */, /*14470*/"YI SYLLABLE DIEX"/* A104 */,/*14471*/"YI SYLLABLE DIE"/* A105 */,/*14472*/"YI SYLLABLE DIEP"/* A106 */, /*14473*/"YI SYLLABLE DAT"/* A107 */,/*14474*/"YI SYLLABLE DAX"/* A108 */,/*14475*/"YI SYLLABLE DA"/* A109 */, /*14476*/"YI SYLLABLE DAP"/* A10A */,/*14477*/"YI SYLLABLE DUOX"/* A10B */,/*14478*/"YI SYLLABLE DUO"/* A10C */, /*14479*/"YI SYLLABLE DOT"/* A10D */,/*14480*/"YI SYLLABLE DOX"/* A10E */,/*14481*/"YI SYLLABLE DO"/* A10F */, /*14482*/"YI SYLLABLE DOP"/* A110 */,/*14483*/"YI SYLLABLE DEX"/* A111 */,/*14484*/"YI SYLLABLE DE"/* A112 */, /*14485*/"YI SYLLABLE DEP"/* A113 */,/*14486*/"YI SYLLABLE DUT"/* A114 */,/*14487*/"YI SYLLABLE DUX"/* A115 */, /*14488*/"YI SYLLABLE DU"/* A116 */,/*14489*/"YI SYLLABLE DUP"/* A117 */,/*14490*/"YI SYLLABLE DURX"/* A118 */, /*14491*/"YI SYLLABLE DUR"/* A119 */,/*14492*/"YI SYLLABLE TIT"/* A11A */,/*14493*/"YI SYLLABLE TIX"/* A11B */, /*14494*/"YI SYLLABLE TI"/* A11C */,/*14495*/"YI SYLLABLE TIP"/* A11D */,/*14496*/"YI SYLLABLE TIEX"/* A11E */, /*14497*/"YI SYLLABLE TIE"/* A11F */,/*14498*/"YI SYLLABLE TIEP"/* A120 */,/*14499*/"YI SYLLABLE TAT"/* A121 */, /*14500*/"YI SYLLABLE TAX"/* A122 */,/*14501*/"YI SYLLABLE TA"/* A123 */,/*14502*/"YI SYLLABLE TAP"/* A124 */, /*14503*/"YI SYLLABLE TUOT"/* A125 */,/*14504*/"YI SYLLABLE TUOX"/* A126 */,/*14505*/"YI SYLLABLE TUO"/* A127 */, /*14506*/"YI SYLLABLE TUOP"/* A128 */,/*14507*/"YI SYLLABLE TOT"/* A129 */,/*14508*/"YI SYLLABLE TOX"/* A12A */, /*14509*/"YI SYLLABLE TO"/* A12B */,/*14510*/"YI SYLLABLE TOP"/* A12C */,/*14511*/"YI SYLLABLE TEX"/* A12D */, /*14512*/"YI SYLLABLE TE"/* A12E */,/*14513*/"YI SYLLABLE TEP"/* A12F */,/*14514*/"YI SYLLABLE TUT"/* A130 */, /*14515*/"YI SYLLABLE TUX"/* A131 */,/*14516*/"YI SYLLABLE TU"/* A132 */,/*14517*/"YI SYLLABLE TUP"/* A133 */, /*14518*/"YI SYLLABLE TURX"/* A134 */,/*14519*/"YI SYLLABLE TUR"/* A135 */,/*14520*/"YI SYLLABLE DDIT"/* A136 */, /*14521*/"YI SYLLABLE DDIX"/* A137 */,/*14522*/"YI SYLLABLE DDI"/* A138 */,/*14523*/"YI SYLLABLE DDIP"/* A139 */, /*14524*/"YI SYLLABLE DDIEX"/* A13A */,/*14525*/"YI SYLLABLE DDIE"/* A13B */,/*14526*/"YI SYLLABLE DDIEP"/* A13C */, /*14527*/"YI SYLLABLE DDAT"/* A13D */,/*14528*/"YI SYLLABLE DDAX"/* A13E */,/*14529*/"YI SYLLABLE DDA"/* A13F */, /*14530*/"YI SYLLABLE DDAP"/* A140 */,/*14531*/"YI SYLLABLE DDUOX"/* A141 */,/*14532*/"YI SYLLABLE DDUO"/* A142 */, /*14533*/"YI SYLLABLE DDUOP"/* A143 */,/*14534*/"YI SYLLABLE DDOT"/* A144 */,/*14535*/"YI SYLLABLE DDOX"/* A145 */, /*14536*/"YI SYLLABLE DDO"/* A146 */,/*14537*/"YI SYLLABLE DDOP"/* A147 */,/*14538*/"YI SYLLABLE DDEX"/* A148 */, /*14539*/"YI SYLLABLE DDE"/* A149 */,/*14540*/"YI SYLLABLE DDEP"/* A14A */,/*14541*/"YI SYLLABLE DDUT"/* A14B */, /*14542*/"YI SYLLABLE DDUX"/* A14C */,/*14543*/"YI SYLLABLE DDU"/* A14D */,/*14544*/"YI SYLLABLE DDUP"/* A14E */, /*14545*/"YI SYLLABLE DDURX"/* A14F */,/*14546*/"YI SYLLABLE DDUR"/* A150 */,/*14547*/"YI SYLLABLE NDIT"/* A151 */, /*14548*/"YI SYLLABLE NDIX"/* A152 */,/*14549*/"YI SYLLABLE NDI"/* A153 */,/*14550*/"YI SYLLABLE NDIP"/* A154 */, /*14551*/"YI SYLLABLE NDIEX"/* A155 */,/*14552*/"YI SYLLABLE NDIE"/* A156 */,/*14553*/"YI SYLLABLE NDAT"/* A157 */, /*14554*/"YI SYLLABLE NDAX"/* A158 */,/*14555*/"YI SYLLABLE NDA"/* A159 */,/*14556*/"YI SYLLABLE NDAP"/* A15A */, /*14557*/"YI SYLLABLE NDOT"/* A15B */,/*14558*/"YI SYLLABLE NDOX"/* A15C */,/*14559*/"YI SYLLABLE NDO"/* A15D */, /*14560*/"YI SYLLABLE NDOP"/* A15E */,/*14561*/"YI SYLLABLE NDEX"/* A15F */,/*14562*/"YI SYLLABLE NDE"/* A160 */, /*14563*/"YI SYLLABLE NDEP"/* A161 */,/*14564*/"YI SYLLABLE NDUT"/* A162 */,/*14565*/"YI SYLLABLE NDUX"/* A163 */, /*14566*/"YI SYLLABLE NDU"/* A164 */,/*14567*/"YI SYLLABLE NDUP"/* A165 */,/*14568*/"YI SYLLABLE NDURX"/* A166 */, /*14569*/"YI SYLLABLE NDUR"/* A167 */,/*14570*/"YI SYLLABLE HNIT"/* A168 */,/*14571*/"YI SYLLABLE HNIX"/* A169 */, /*14572*/"YI SYLLABLE HNI"/* A16A */,/*14573*/"YI SYLLABLE HNIP"/* A16B */,/*14574*/"YI SYLLABLE HNIET"/* A16C */, /*14575*/"YI SYLLABLE HNIEX"/* A16D */,/*14576*/"YI SYLLABLE HNIE"/* A16E */,/*14577*/"YI SYLLABLE HNIEP"/* A16F */, /*14578*/"YI SYLLABLE HNAT"/* A170 */,/*14579*/"YI SYLLABLE HNAX"/* A171 */,/*14580*/"YI SYLLABLE HNA"/* A172 */, /*14581*/"YI SYLLABLE HNAP"/* A173 */,/*14582*/"YI SYLLABLE HNUOX"/* A174 */,/*14583*/"YI SYLLABLE HNUO"/* A175 */, /*14584*/"YI SYLLABLE HNOT"/* A176 */,/*14585*/"YI SYLLABLE HNOX"/* A177 */,/*14586*/"YI SYLLABLE HNOP"/* A178 */, /*14587*/"YI SYLLABLE HNEX"/* A179 */,/*14588*/"YI SYLLABLE HNE"/* A17A */,/*14589*/"YI SYLLABLE HNEP"/* A17B */, /*14590*/"YI SYLLABLE HNUT"/* A17C */,/*14591*/"YI SYLLABLE NIT"/* A17D */,/*14592*/"YI SYLLABLE NIX"/* A17E */, /*14593*/"YI SYLLABLE NI"/* A17F */,/*14594*/"YI SYLLABLE NIP"/* A180 */,/*14595*/"YI SYLLABLE NIEX"/* A181 */, /*14596*/"YI SYLLABLE NIE"/* A182 */,/*14597*/"YI SYLLABLE NIEP"/* A183 */,/*14598*/"YI SYLLABLE NAX"/* A184 */, /*14599*/"YI SYLLABLE NA"/* A185 */,/*14600*/"YI SYLLABLE NAP"/* A186 */,/*14601*/"YI SYLLABLE NUOX"/* A187 */, /*14602*/"YI SYLLABLE NUO"/* A188 */,/*14603*/"YI SYLLABLE NUOP"/* A189 */,/*14604*/"YI SYLLABLE NOT"/* A18A */, /*14605*/"YI SYLLABLE NOX"/* A18B */,/*14606*/"YI SYLLABLE NO"/* A18C */,/*14607*/"YI SYLLABLE NOP"/* A18D */, /*14608*/"YI SYLLABLE NEX"/* A18E */,/*14609*/"YI SYLLABLE NE"/* A18F */,/*14610*/"YI SYLLABLE NEP"/* A190 */, /*14611*/"YI SYLLABLE NUT"/* A191 */,/*14612*/"YI SYLLABLE NUX"/* A192 */,/*14613*/"YI SYLLABLE NU"/* A193 */, /*14614*/"YI SYLLABLE NUP"/* A194 */,/*14615*/"YI SYLLABLE NURX"/* A195 */,/*14616*/"YI SYLLABLE NUR"/* A196 */, /*14617*/"YI SYLLABLE HLIT"/* A197 */,/*14618*/"YI SYLLABLE HLIX"/* A198 */,/*14619*/"YI SYLLABLE HLI"/* A199 */, /*14620*/"YI SYLLABLE HLIP"/* A19A */,/*14621*/"YI SYLLABLE HLIEX"/* A19B */,/*14622*/"YI SYLLABLE HLIE"/* A19C */, /*14623*/"YI SYLLABLE HLIEP"/* A19D */,/*14624*/"YI SYLLABLE HLAT"/* A19E */,/*14625*/"YI SYLLABLE HLAX"/* A19F */, /*14626*/"YI SYLLABLE HLA"/* A1A0 */,/*14627*/"YI SYLLABLE HLAP"/* A1A1 */,/*14628*/"YI SYLLABLE HLUOX"/* A1A2 */, /*14629*/"YI SYLLABLE HLUO"/* A1A3 */,/*14630*/"YI SYLLABLE HLUOP"/* A1A4 */,/*14631*/"YI SYLLABLE HLOX"/* A1A5 */, /*14632*/"YI SYLLABLE HLO"/* A1A6 */,/*14633*/"YI SYLLABLE HLOP"/* A1A7 */,/*14634*/"YI SYLLABLE HLEX"/* A1A8 */, /*14635*/"YI SYLLABLE HLE"/* A1A9 */,/*14636*/"YI SYLLABLE HLEP"/* A1AA */,/*14637*/"YI SYLLABLE HLUT"/* A1AB */, /*14638*/"YI SYLLABLE HLUX"/* A1AC */,/*14639*/"YI SYLLABLE HLU"/* A1AD */,/*14640*/"YI SYLLABLE HLUP"/* A1AE */, /*14641*/"YI SYLLABLE HLURX"/* A1AF */,/*14642*/"YI SYLLABLE HLUR"/* A1B0 */,/*14643*/"YI SYLLABLE HLYT"/* A1B1 */, /*14644*/"YI SYLLABLE HLYX"/* A1B2 */,/*14645*/"YI SYLLABLE HLY"/* A1B3 */,/*14646*/"YI SYLLABLE HLYP"/* A1B4 */, /*14647*/"YI SYLLABLE HLYRX"/* A1B5 */,/*14648*/"YI SYLLABLE HLYR"/* A1B6 */,/*14649*/"YI SYLLABLE LIT"/* A1B7 */, /*14650*/"YI SYLLABLE LIX"/* A1B8 */,/*14651*/"YI SYLLABLE LI"/* A1B9 */,/*14652*/"YI SYLLABLE LIP"/* A1BA */, /*14653*/"YI SYLLABLE LIET"/* A1BB */,/*14654*/"YI SYLLABLE LIEX"/* A1BC */,/*14655*/"YI SYLLABLE LIE"/* A1BD */, /*14656*/"YI SYLLABLE LIEP"/* A1BE */,/*14657*/"YI SYLLABLE LAT"/* A1BF */,/*14658*/"YI SYLLABLE LAX"/* A1C0 */, /*14659*/"YI SYLLABLE LA"/* A1C1 */,/*14660*/"YI SYLLABLE LAP"/* A1C2 */,/*14661*/"YI SYLLABLE LUOT"/* A1C3 */, /*14662*/"YI SYLLABLE LUOX"/* A1C4 */,/*14663*/"YI SYLLABLE LUO"/* A1C5 */,/*14664*/"YI SYLLABLE LUOP"/* A1C6 */, /*14665*/"YI SYLLABLE LOT"/* A1C7 */,/*14666*/"YI SYLLABLE LOX"/* A1C8 */,/*14667*/"YI SYLLABLE LO"/* A1C9 */, /*14668*/"YI SYLLABLE LOP"/* A1CA */,/*14669*/"YI SYLLABLE LEX"/* A1CB */,/*14670*/"YI SYLLABLE LE"/* A1CC */, /*14671*/"YI SYLLABLE LEP"/* A1CD */,/*14672*/"YI SYLLABLE LUT"/* A1CE */,/*14673*/"YI SYLLABLE LUX"/* A1CF */, /*14674*/"YI SYLLABLE LU"/* A1D0 */,/*14675*/"YI SYLLABLE LUP"/* A1D1 */,/*14676*/"YI SYLLABLE LURX"/* A1D2 */, /*14677*/"YI SYLLABLE LUR"/* A1D3 */,/*14678*/"YI SYLLABLE LYT"/* A1D4 */,/*14679*/"YI SYLLABLE LYX"/* A1D5 */, /*14680*/"YI SYLLABLE LY"/* A1D6 */,/*14681*/"YI SYLLABLE LYP"/* A1D7 */,/*14682*/"YI SYLLABLE LYRX"/* A1D8 */, /*14683*/"YI SYLLABLE LYR"/* A1D9 */,/*14684*/"YI SYLLABLE GIT"/* A1DA */,/*14685*/"YI SYLLABLE GIX"/* A1DB */, /*14686*/"YI SYLLABLE GI"/* A1DC */,/*14687*/"YI SYLLABLE GIP"/* A1DD */,/*14688*/"YI SYLLABLE GIET"/* A1DE */, /*14689*/"YI SYLLABLE GIEX"/* A1DF */,/*14690*/"YI SYLLABLE GIE"/* A1E0 */,/*14691*/"YI SYLLABLE GIEP"/* A1E1 */, /*14692*/"YI SYLLABLE GAT"/* A1E2 */,/*14693*/"YI SYLLABLE GAX"/* A1E3 */,/*14694*/"YI SYLLABLE GA"/* A1E4 */, /*14695*/"YI SYLLABLE GAP"/* A1E5 */,/*14696*/"YI SYLLABLE GUOT"/* A1E6 */,/*14697*/"YI SYLLABLE GUOX"/* A1E7 */, /*14698*/"YI SYLLABLE GUO"/* A1E8 */,/*14699*/"YI SYLLABLE GUOP"/* A1E9 */,/*14700*/"YI SYLLABLE GOT"/* A1EA */, /*14701*/"YI SYLLABLE GOX"/* A1EB */,/*14702*/"YI SYLLABLE GO"/* A1EC */,/*14703*/"YI SYLLABLE GOP"/* A1ED */, /*14704*/"YI SYLLABLE GET"/* A1EE */,/*14705*/"YI SYLLABLE GEX"/* A1EF */,/*14706*/"YI SYLLABLE GE"/* A1F0 */, /*14707*/"YI SYLLABLE GEP"/* A1F1 */,/*14708*/"YI SYLLABLE GUT"/* A1F2 */,/*14709*/"YI SYLLABLE GUX"/* A1F3 */, /*14710*/"YI SYLLABLE GU"/* A1F4 */,/*14711*/"YI SYLLABLE GUP"/* A1F5 */,/*14712*/"YI SYLLABLE GURX"/* A1F6 */, /*14713*/"YI SYLLABLE GUR"/* A1F7 */,/*14714*/"YI SYLLABLE KIT"/* A1F8 */,/*14715*/"YI SYLLABLE KIX"/* A1F9 */, /*14716*/"YI SYLLABLE KI"/* A1FA */,/*14717*/"YI SYLLABLE KIP"/* A1FB */,/*14718*/"YI SYLLABLE KIEX"/* A1FC */, /*14719*/"YI SYLLABLE KIE"/* A1FD */,/*14720*/"YI SYLLABLE KIEP"/* A1FE */,/*14721*/"YI SYLLABLE KAT"/* A1FF */, /*14722*/"YI SYLLABLE KAX"/* A200 */,/*14723*/"YI SYLLABLE KA"/* A201 */,/*14724*/"YI SYLLABLE KAP"/* A202 */, /*14725*/"YI SYLLABLE KUOX"/* A203 */,/*14726*/"YI SYLLABLE KUO"/* A204 */,/*14727*/"YI SYLLABLE KUOP"/* A205 */, /*14728*/"YI SYLLABLE KOT"/* A206 */,/*14729*/"YI SYLLABLE KOX"/* A207 */,/*14730*/"YI SYLLABLE KO"/* A208 */, /*14731*/"YI SYLLABLE KOP"/* A209 */,/*14732*/"YI SYLLABLE KET"/* A20A */,/*14733*/"YI SYLLABLE KEX"/* A20B */, /*14734*/"YI SYLLABLE KE"/* A20C */,/*14735*/"YI SYLLABLE KEP"/* A20D */,/*14736*/"YI SYLLABLE KUT"/* A20E */, /*14737*/"YI SYLLABLE KUX"/* A20F */,/*14738*/"YI SYLLABLE KU"/* A210 */,/*14739*/"YI SYLLABLE KUP"/* A211 */, /*14740*/"YI SYLLABLE KURX"/* A212 */,/*14741*/"YI SYLLABLE KUR"/* A213 */,/*14742*/"YI SYLLABLE GGIT"/* A214 */, /*14743*/"YI SYLLABLE GGIX"/* A215 */,/*14744*/"YI SYLLABLE GGI"/* A216 */,/*14745*/"YI SYLLABLE GGIEX"/* A217 */, /*14746*/"YI SYLLABLE GGIE"/* A218 */,/*14747*/"YI SYLLABLE GGIEP"/* A219 */,/*14748*/"YI SYLLABLE GGAT"/* A21A */, /*14749*/"YI SYLLABLE GGAX"/* A21B */,/*14750*/"YI SYLLABLE GGA"/* A21C */,/*14751*/"YI SYLLABLE GGAP"/* A21D */, /*14752*/"YI SYLLABLE GGUOT"/* A21E */,/*14753*/"YI SYLLABLE GGUOX"/* A21F */,/*14754*/"YI SYLLABLE GGUO"/* A220 */, /*14755*/"YI SYLLABLE GGUOP"/* A221 */,/*14756*/"YI SYLLABLE GGOT"/* A222 */,/*14757*/"YI SYLLABLE GGOX"/* A223 */, /*14758*/"YI SYLLABLE GGO"/* A224 */,/*14759*/"YI SYLLABLE GGOP"/* A225 */,/*14760*/"YI SYLLABLE GGET"/* A226 */, /*14761*/"YI SYLLABLE GGEX"/* A227 */,/*14762*/"YI SYLLABLE GGE"/* A228 */,/*14763*/"YI SYLLABLE GGEP"/* A229 */, /*14764*/"YI SYLLABLE GGUT"/* A22A */,/*14765*/"YI SYLLABLE GGUX"/* A22B */,/*14766*/"YI SYLLABLE GGU"/* A22C */, /*14767*/"YI SYLLABLE GGUP"/* A22D */,/*14768*/"YI SYLLABLE GGURX"/* A22E */,/*14769*/"YI SYLLABLE GGUR"/* A22F */, /*14770*/"YI SYLLABLE MGIEX"/* A230 */,/*14771*/"YI SYLLABLE MGIE"/* A231 */,/*14772*/"YI SYLLABLE MGAT"/* A232 */, /*14773*/"YI SYLLABLE MGAX"/* A233 */,/*14774*/"YI SYLLABLE MGA"/* A234 */,/*14775*/"YI SYLLABLE MGAP"/* A235 */, /*14776*/"YI SYLLABLE MGUOX"/* A236 */,/*14777*/"YI SYLLABLE MGUO"/* A237 */,/*14778*/"YI SYLLABLE MGUOP"/* A238 */, /*14779*/"YI SYLLABLE MGOT"/* A239 */,/*14780*/"YI SYLLABLE MGOX"/* A23A */,/*14781*/"YI SYLLABLE MGO"/* A23B */, /*14782*/"YI SYLLABLE MGOP"/* A23C */,/*14783*/"YI SYLLABLE MGEX"/* A23D */,/*14784*/"YI SYLLABLE MGE"/* A23E */, /*14785*/"YI SYLLABLE MGEP"/* A23F */,/*14786*/"YI SYLLABLE MGUT"/* A240 */,/*14787*/"YI SYLLABLE MGUX"/* A241 */, /*14788*/"YI SYLLABLE MGU"/* A242 */,/*14789*/"YI SYLLABLE MGUP"/* A243 */,/*14790*/"YI SYLLABLE MGURX"/* A244 */, /*14791*/"YI SYLLABLE MGUR"/* A245 */,/*14792*/"YI SYLLABLE HXIT"/* A246 */,/*14793*/"YI SYLLABLE HXIX"/* A247 */, /*14794*/"YI SYLLABLE HXI"/* A248 */,/*14795*/"YI SYLLABLE HXIP"/* A249 */,/*14796*/"YI SYLLABLE HXIET"/* A24A */, /*14797*/"YI SYLLABLE HXIEX"/* A24B */,/*14798*/"YI SYLLABLE HXIE"/* A24C */,/*14799*/"YI SYLLABLE HXIEP"/* A24D */, /*14800*/"YI SYLLABLE HXAT"/* A24E */,/*14801*/"YI SYLLABLE HXAX"/* A24F */,/*14802*/"YI SYLLABLE HXA"/* A250 */, /*14803*/"YI SYLLABLE HXAP"/* A251 */,/*14804*/"YI SYLLABLE HXUOT"/* A252 */,/*14805*/"YI SYLLABLE HXUOX"/* A253 */, /*14806*/"YI SYLLABLE HXUO"/* A254 */,/*14807*/"YI SYLLABLE HXUOP"/* A255 */,/*14808*/"YI SYLLABLE HXOT"/* A256 */, /*14809*/"YI SYLLABLE HXOX"/* A257 */,/*14810*/"YI SYLLABLE HXO"/* A258 */,/*14811*/"YI SYLLABLE HXOP"/* A259 */, /*14812*/"YI SYLLABLE HXEX"/* A25A */,/*14813*/"YI SYLLABLE HXE"/* A25B */,/*14814*/"YI SYLLABLE HXEP"/* A25C */, /*14815*/"YI SYLLABLE NGIEX"/* A25D */,/*14816*/"YI SYLLABLE NGIE"/* A25E */,/*14817*/"YI SYLLABLE NGIEP"/* A25F */, /*14818*/"YI SYLLABLE NGAT"/* A260 */,/*14819*/"YI SYLLABLE NGAX"/* A261 */,/*14820*/"YI SYLLABLE NGA"/* A262 */, /*14821*/"YI SYLLABLE NGAP"/* A263 */,/*14822*/"YI SYLLABLE NGUOT"/* A264 */,/*14823*/"YI SYLLABLE NGUOX"/* A265 */, /*14824*/"YI SYLLABLE NGUO"/* A266 */,/*14825*/"YI SYLLABLE NGOT"/* A267 */,/*14826*/"YI SYLLABLE NGOX"/* A268 */, /*14827*/"YI SYLLABLE NGO"/* A269 */,/*14828*/"YI SYLLABLE NGOP"/* A26A */,/*14829*/"YI SYLLABLE NGEX"/* A26B */, /*14830*/"YI SYLLABLE NGE"/* A26C */,/*14831*/"YI SYLLABLE NGEP"/* A26D */,/*14832*/"YI SYLLABLE HIT"/* A26E */, /*14833*/"YI SYLLABLE HIEX"/* A26F */,/*14834*/"YI SYLLABLE HIE"/* A270 */,/*14835*/"YI SYLLABLE HAT"/* A271 */, /*14836*/"YI SYLLABLE HAX"/* A272 */,/*14837*/"YI SYLLABLE HA"/* A273 */,/*14838*/"YI SYLLABLE HAP"/* A274 */, /*14839*/"YI SYLLABLE HUOT"/* A275 */,/*14840*/"YI SYLLABLE HUOX"/* A276 */,/*14841*/"YI SYLLABLE HUO"/* A277 */, /*14842*/"YI SYLLABLE HUOP"/* A278 */,/*14843*/"YI SYLLABLE HOT"/* A279 */,/*14844*/"YI SYLLABLE HOX"/* A27A */, /*14845*/"YI SYLLABLE HO"/* A27B */,/*14846*/"YI SYLLABLE HOP"/* A27C */,/*14847*/"YI SYLLABLE HEX"/* A27D */, /*14848*/"YI SYLLABLE HE"/* A27E */,/*14849*/"YI SYLLABLE HEP"/* A27F */,/*14850*/"YI SYLLABLE WAT"/* A280 */, /*14851*/"YI SYLLABLE WAX"/* A281 */,/*14852*/"YI SYLLABLE WA"/* A282 */,/*14853*/"YI SYLLABLE WAP"/* A283 */, /*14854*/"YI SYLLABLE WUOX"/* A284 */,/*14855*/"YI SYLLABLE WUO"/* A285 */,/*14856*/"YI SYLLABLE WUOP"/* A286 */, /*14857*/"YI SYLLABLE WOX"/* A287 */,/*14858*/"YI SYLLABLE WO"/* A288 */,/*14859*/"YI SYLLABLE WOP"/* A289 */, /*14860*/"YI SYLLABLE WEX"/* A28A */,/*14861*/"YI SYLLABLE WE"/* A28B */,/*14862*/"YI SYLLABLE WEP"/* A28C */, /*14863*/"YI SYLLABLE ZIT"/* A28D */,/*14864*/"YI SYLLABLE ZIX"/* A28E */,/*14865*/"YI SYLLABLE ZI"/* A28F */, /*14866*/"YI SYLLABLE ZIP"/* A290 */,/*14867*/"YI SYLLABLE ZIEX"/* A291 */,/*14868*/"YI SYLLABLE ZIE"/* A292 */, /*14869*/"YI SYLLABLE ZIEP"/* A293 */,/*14870*/"YI SYLLABLE ZAT"/* A294 */,/*14871*/"YI SYLLABLE ZAX"/* A295 */, /*14872*/"YI SYLLABLE ZA"/* A296 */,/*14873*/"YI SYLLABLE ZAP"/* A297 */,/*14874*/"YI SYLLABLE ZUOX"/* A298 */, /*14875*/"YI SYLLABLE ZUO"/* A299 */,/*14876*/"YI SYLLABLE ZUOP"/* A29A */,/*14877*/"YI SYLLABLE ZOT"/* A29B */, /*14878*/"YI SYLLABLE ZOX"/* A29C */,/*14879*/"YI SYLLABLE ZO"/* A29D */,/*14880*/"YI SYLLABLE ZOP"/* A29E */, /*14881*/"YI SYLLABLE ZEX"/* A29F */,/*14882*/"YI SYLLABLE ZE"/* A2A0 */,/*14883*/"YI SYLLABLE ZEP"/* A2A1 */, /*14884*/"YI SYLLABLE ZUT"/* A2A2 */,/*14885*/"YI SYLLABLE ZUX"/* A2A3 */,/*14886*/"YI SYLLABLE ZU"/* A2A4 */, /*14887*/"YI SYLLABLE ZUP"/* A2A5 */,/*14888*/"YI SYLLABLE ZURX"/* A2A6 */,/*14889*/"YI SYLLABLE ZUR"/* A2A7 */, /*14890*/"YI SYLLABLE ZYT"/* A2A8 */,/*14891*/"YI SYLLABLE ZYX"/* A2A9 */,/*14892*/"YI SYLLABLE ZY"/* A2AA */, /*14893*/"YI SYLLABLE ZYP"/* A2AB */,/*14894*/"YI SYLLABLE ZYRX"/* A2AC */,/*14895*/"YI SYLLABLE ZYR"/* A2AD */, /*14896*/"YI SYLLABLE CIT"/* A2AE */,/*14897*/"YI SYLLABLE CIX"/* A2AF */,/*14898*/"YI SYLLABLE CI"/* A2B0 */, /*14899*/"YI SYLLABLE CIP"/* A2B1 */,/*14900*/"YI SYLLABLE CIET"/* A2B2 */,/*14901*/"YI SYLLABLE CIEX"/* A2B3 */, /*14902*/"YI SYLLABLE CIE"/* A2B4 */,/*14903*/"YI SYLLABLE CIEP"/* A2B5 */,/*14904*/"YI SYLLABLE CAT"/* A2B6 */, /*14905*/"YI SYLLABLE CAX"/* A2B7 */,/*14906*/"YI SYLLABLE CA"/* A2B8 */,/*14907*/"YI SYLLABLE CAP"/* A2B9 */, /*14908*/"YI SYLLABLE CUOX"/* A2BA */,/*14909*/"YI SYLLABLE CUO"/* A2BB */,/*14910*/"YI SYLLABLE CUOP"/* A2BC */, /*14911*/"YI SYLLABLE COT"/* A2BD */,/*14912*/"YI SYLLABLE COX"/* A2BE */,/*14913*/"YI SYLLABLE CO"/* A2BF */, /*14914*/"YI SYLLABLE COP"/* A2C0 */,/*14915*/"YI SYLLABLE CEX"/* A2C1 */,/*14916*/"YI SYLLABLE CE"/* A2C2 */, /*14917*/"YI SYLLABLE CEP"/* A2C3 */,/*14918*/"YI SYLLABLE CUT"/* A2C4 */,/*14919*/"YI SYLLABLE CUX"/* A2C5 */, /*14920*/"YI SYLLABLE CU"/* A2C6 */,/*14921*/"YI SYLLABLE CUP"/* A2C7 */,/*14922*/"YI SYLLABLE CURX"/* A2C8 */, /*14923*/"YI SYLLABLE CUR"/* A2C9 */,/*14924*/"YI SYLLABLE CYT"/* A2CA */,/*14925*/"YI SYLLABLE CYX"/* A2CB */, /*14926*/"YI SYLLABLE CY"/* A2CC */,/*14927*/"YI SYLLABLE CYP"/* A2CD */,/*14928*/"YI SYLLABLE CYRX"/* A2CE */, /*14929*/"YI SYLLABLE CYR"/* A2CF */,/*14930*/"YI SYLLABLE ZZIT"/* A2D0 */,/*14931*/"YI SYLLABLE ZZIX"/* A2D1 */, /*14932*/"YI SYLLABLE ZZI"/* A2D2 */,/*14933*/"YI SYLLABLE ZZIP"/* A2D3 */,/*14934*/"YI SYLLABLE ZZIET"/* A2D4 */, /*14935*/"YI SYLLABLE ZZIEX"/* A2D5 */,/*14936*/"YI SYLLABLE ZZIE"/* A2D6 */,/*14937*/"YI SYLLABLE ZZIEP"/* A2D7 */, /*14938*/"YI SYLLABLE ZZAT"/* A2D8 */,/*14939*/"YI SYLLABLE ZZAX"/* A2D9 */,/*14940*/"YI SYLLABLE ZZA"/* A2DA */, /*14941*/"YI SYLLABLE ZZAP"/* A2DB */,/*14942*/"YI SYLLABLE ZZOX"/* A2DC */,/*14943*/"YI SYLLABLE ZZO"/* A2DD */, /*14944*/"YI SYLLABLE ZZOP"/* A2DE */,/*14945*/"YI SYLLABLE ZZEX"/* A2DF */,/*14946*/"YI SYLLABLE ZZE"/* A2E0 */, /*14947*/"YI SYLLABLE ZZEP"/* A2E1 */,/*14948*/"YI SYLLABLE ZZUX"/* A2E2 */,/*14949*/"YI SYLLABLE ZZU"/* A2E3 */, /*14950*/"YI SYLLABLE ZZUP"/* A2E4 */,/*14951*/"YI SYLLABLE ZZURX"/* A2E5 */,/*14952*/"YI SYLLABLE ZZUR"/* A2E6 */, /*14953*/"YI SYLLABLE ZZYT"/* A2E7 */,/*14954*/"YI SYLLABLE ZZYX"/* A2E8 */,/*14955*/"YI SYLLABLE ZZY"/* A2E9 */, /*14956*/"YI SYLLABLE ZZYP"/* A2EA */,/*14957*/"YI SYLLABLE ZZYRX"/* A2EB */,/*14958*/"YI SYLLABLE ZZYR"/* A2EC */, /*14959*/"YI SYLLABLE NZIT"/* A2ED */,/*14960*/"YI SYLLABLE NZIX"/* A2EE */,/*14961*/"YI SYLLABLE NZI"/* A2EF */, /*14962*/"YI SYLLABLE NZIP"/* A2F0 */,/*14963*/"YI SYLLABLE NZIEX"/* A2F1 */,/*14964*/"YI SYLLABLE NZIE"/* A2F2 */, /*14965*/"YI SYLLABLE NZIEP"/* A2F3 */,/*14966*/"YI SYLLABLE NZAT"/* A2F4 */,/*14967*/"YI SYLLABLE NZAX"/* A2F5 */, /*14968*/"YI SYLLABLE NZA"/* A2F6 */,/*14969*/"YI SYLLABLE NZAP"/* A2F7 */,/*14970*/"YI SYLLABLE NZUOX"/* A2F8 */, /*14971*/"YI SYLLABLE NZUO"/* A2F9 */,/*14972*/"YI SYLLABLE NZOX"/* A2FA */,/*14973*/"YI SYLLABLE NZOP"/* A2FB */, /*14974*/"YI SYLLABLE NZEX"/* A2FC */,/*14975*/"YI SYLLABLE NZE"/* A2FD */,/*14976*/"YI SYLLABLE NZUX"/* A2FE */, /*14977*/"YI SYLLABLE NZU"/* A2FF */,/*14978*/"YI SYLLABLE NZUP"/* A300 */,/*14979*/"YI SYLLABLE NZURX"/* A301 */, /*14980*/"YI SYLLABLE NZUR"/* A302 */,/*14981*/"YI SYLLABLE NZYT"/* A303 */,/*14982*/"YI SYLLABLE NZYX"/* A304 */, /*14983*/"YI SYLLABLE NZY"/* A305 */,/*14984*/"YI SYLLABLE NZYP"/* A306 */,/*14985*/"YI SYLLABLE NZYRX"/* A307 */, /*14986*/"YI SYLLABLE NZYR"/* A308 */,/*14987*/"YI SYLLABLE SIT"/* A309 */,/*14988*/"YI SYLLABLE SIX"/* A30A */, /*14989*/"YI SYLLABLE SI"/* A30B */,/*14990*/"YI SYLLABLE SIP"/* A30C */,/*14991*/"YI SYLLABLE SIEX"/* A30D */, /*14992*/"YI SYLLABLE SIE"/* A30E */,/*14993*/"YI SYLLABLE SIEP"/* A30F */,/*14994*/"YI SYLLABLE SAT"/* A310 */, /*14995*/"YI SYLLABLE SAX"/* A311 */,/*14996*/"YI SYLLABLE SA"/* A312 */,/*14997*/"YI SYLLABLE SAP"/* A313 */, /*14998*/"YI SYLLABLE SUOX"/* A314 */,/*14999*/"YI SYLLABLE SUO"/* A315 */,/*15000*/"YI SYLLABLE SUOP"/* A316 */, /*15001*/"YI SYLLABLE SOT"/* A317 */,/*15002*/"YI SYLLABLE SOX"/* A318 */,/*15003*/"YI SYLLABLE SO"/* A319 */, /*15004*/"YI SYLLABLE SOP"/* A31A */,/*15005*/"YI SYLLABLE SEX"/* A31B */,/*15006*/"YI SYLLABLE SE"/* A31C */, /*15007*/"YI SYLLABLE SEP"/* A31D */,/*15008*/"YI SYLLABLE SUT"/* A31E */,/*15009*/"YI SYLLABLE SUX"/* A31F */, /*15010*/"YI SYLLABLE SU"/* A320 */,/*15011*/"YI SYLLABLE SUP"/* A321 */,/*15012*/"YI SYLLABLE SURX"/* A322 */, /*15013*/"YI SYLLABLE SUR"/* A323 */,/*15014*/"YI SYLLABLE SYT"/* A324 */,/*15015*/"YI SYLLABLE SYX"/* A325 */, /*15016*/"YI SYLLABLE SY"/* A326 */,/*15017*/"YI SYLLABLE SYP"/* A327 */,/*15018*/"YI SYLLABLE SYRX"/* A328 */, /*15019*/"YI SYLLABLE SYR"/* A329 */,/*15020*/"YI SYLLABLE SSIT"/* A32A */,/*15021*/"YI SYLLABLE SSIX"/* A32B */, /*15022*/"YI SYLLABLE SSI"/* A32C */,/*15023*/"YI SYLLABLE SSIP"/* A32D */,/*15024*/"YI SYLLABLE SSIEX"/* A32E */, /*15025*/"YI SYLLABLE SSIE"/* A32F */,/*15026*/"YI SYLLABLE SSIEP"/* A330 */,/*15027*/"YI SYLLABLE SSAT"/* A331 */, /*15028*/"YI SYLLABLE SSAX"/* A332 */,/*15029*/"YI SYLLABLE SSA"/* A333 */,/*15030*/"YI SYLLABLE SSAP"/* A334 */, /*15031*/"YI SYLLABLE SSOT"/* A335 */,/*15032*/"YI SYLLABLE SSOX"/* A336 */,/*15033*/"YI SYLLABLE SSO"/* A337 */, /*15034*/"YI SYLLABLE SSOP"/* A338 */,/*15035*/"YI SYLLABLE SSEX"/* A339 */,/*15036*/"YI SYLLABLE SSE"/* A33A */, /*15037*/"YI SYLLABLE SSEP"/* A33B */,/*15038*/"YI SYLLABLE SSUT"/* A33C */,/*15039*/"YI SYLLABLE SSUX"/* A33D */, /*15040*/"YI SYLLABLE SSU"/* A33E */,/*15041*/"YI SYLLABLE SSUP"/* A33F */,/*15042*/"YI SYLLABLE SSYT"/* A340 */, /*15043*/"YI SYLLABLE SSYX"/* A341 */,/*15044*/"YI SYLLABLE SSY"/* A342 */,/*15045*/"YI SYLLABLE SSYP"/* A343 */, /*15046*/"YI SYLLABLE SSYRX"/* A344 */,/*15047*/"YI SYLLABLE SSYR"/* A345 */,/*15048*/"YI SYLLABLE ZHAT"/* A346 */, /*15049*/"YI SYLLABLE ZHAX"/* A347 */,/*15050*/"YI SYLLABLE ZHA"/* A348 */,/*15051*/"YI SYLLABLE ZHAP"/* A349 */, /*15052*/"YI SYLLABLE ZHUOX"/* A34A */,/*15053*/"YI SYLLABLE ZHUO"/* A34B */,/*15054*/"YI SYLLABLE ZHUOP"/* A34C */, /*15055*/"YI SYLLABLE ZHOT"/* A34D */,/*15056*/"YI SYLLABLE ZHOX"/* A34E */,/*15057*/"YI SYLLABLE ZHO"/* A34F */, /*15058*/"YI SYLLABLE ZHOP"/* A350 */,/*15059*/"YI SYLLABLE ZHET"/* A351 */,/*15060*/"YI SYLLABLE ZHEX"/* A352 */, /*15061*/"YI SYLLABLE ZHE"/* A353 */,/*15062*/"YI SYLLABLE ZHEP"/* A354 */,/*15063*/"YI SYLLABLE ZHUT"/* A355 */, /*15064*/"YI SYLLABLE ZHUX"/* A356 */,/*15065*/"YI SYLLABLE ZHU"/* A357 */,/*15066*/"YI SYLLABLE ZHUP"/* A358 */, /*15067*/"YI SYLLABLE ZHURX"/* A359 */,/*15068*/"YI SYLLABLE ZHUR"/* A35A */,/*15069*/"YI SYLLABLE ZHYT"/* A35B */, /*15070*/"YI SYLLABLE ZHYX"/* A35C */,/*15071*/"YI SYLLABLE ZHY"/* A35D */,/*15072*/"YI SYLLABLE ZHYP"/* A35E */, /*15073*/"YI SYLLABLE ZHYRX"/* A35F */,/*15074*/"YI SYLLABLE ZHYR"/* A360 */,/*15075*/"YI SYLLABLE CHAT"/* A361 */, /*15076*/"YI SYLLABLE CHAX"/* A362 */,/*15077*/"YI SYLLABLE CHA"/* A363 */,/*15078*/"YI SYLLABLE CHAP"/* A364 */, /*15079*/"YI SYLLABLE CHUOT"/* A365 */,/*15080*/"YI SYLLABLE CHUOX"/* A366 */,/*15081*/"YI SYLLABLE CHUO"/* A367 */, /*15082*/"YI SYLLABLE CHUOP"/* A368 */,/*15083*/"YI SYLLABLE CHOT"/* A369 */,/*15084*/"YI SYLLABLE CHOX"/* A36A */, /*15085*/"YI SYLLABLE CHO"/* A36B */,/*15086*/"YI SYLLABLE CHOP"/* A36C */,/*15087*/"YI SYLLABLE CHET"/* A36D */, /*15088*/"YI SYLLABLE CHEX"/* A36E */,/*15089*/"YI SYLLABLE CHE"/* A36F */,/*15090*/"YI SYLLABLE CHEP"/* A370 */, /*15091*/"YI SYLLABLE CHUX"/* A371 */,/*15092*/"YI SYLLABLE CHU"/* A372 */,/*15093*/"YI SYLLABLE CHUP"/* A373 */, /*15094*/"YI SYLLABLE CHURX"/* A374 */,/*15095*/"YI SYLLABLE CHUR"/* A375 */,/*15096*/"YI SYLLABLE CHYT"/* A376 */, /*15097*/"YI SYLLABLE CHYX"/* A377 */,/*15098*/"YI SYLLABLE CHY"/* A378 */,/*15099*/"YI SYLLABLE CHYP"/* A379 */, /*15100*/"YI SYLLABLE CHYRX"/* A37A */,/*15101*/"YI SYLLABLE CHYR"/* A37B */,/*15102*/"YI SYLLABLE RRAX"/* A37C */, /*15103*/"YI SYLLABLE RRA"/* A37D */,/*15104*/"YI SYLLABLE RRUOX"/* A37E */,/*15105*/"YI SYLLABLE RRUO"/* A37F */, /*15106*/"YI SYLLABLE RROT"/* A380 */,/*15107*/"YI SYLLABLE RROX"/* A381 */,/*15108*/"YI SYLLABLE RRO"/* A382 */, /*15109*/"YI SYLLABLE RROP"/* A383 */,/*15110*/"YI SYLLABLE RRET"/* A384 */,/*15111*/"YI SYLLABLE RREX"/* A385 */, /*15112*/"YI SYLLABLE RRE"/* A386 */,/*15113*/"YI SYLLABLE RREP"/* A387 */,/*15114*/"YI SYLLABLE RRUT"/* A388 */, /*15115*/"YI SYLLABLE RRUX"/* A389 */,/*15116*/"YI SYLLABLE RRU"/* A38A */,/*15117*/"YI SYLLABLE RRUP"/* A38B */, /*15118*/"YI SYLLABLE RRURX"/* A38C */,/*15119*/"YI SYLLABLE RRUR"/* A38D */,/*15120*/"YI SYLLABLE RRYT"/* A38E */, /*15121*/"YI SYLLABLE RRYX"/* A38F */,/*15122*/"YI SYLLABLE RRY"/* A390 */,/*15123*/"YI SYLLABLE RRYP"/* A391 */, /*15124*/"YI SYLLABLE RRYRX"/* A392 */,/*15125*/"YI SYLLABLE RRYR"/* A393 */,/*15126*/"YI SYLLABLE NRAT"/* A394 */, /*15127*/"YI SYLLABLE NRAX"/* A395 */,/*15128*/"YI SYLLABLE NRA"/* A396 */,/*15129*/"YI SYLLABLE NRAP"/* A397 */, /*15130*/"YI SYLLABLE NROX"/* A398 */,/*15131*/"YI SYLLABLE NRO"/* A399 */,/*15132*/"YI SYLLABLE NROP"/* A39A */, /*15133*/"YI SYLLABLE NRET"/* A39B */,/*15134*/"YI SYLLABLE NREX"/* A39C */,/*15135*/"YI SYLLABLE NRE"/* A39D */, /*15136*/"YI SYLLABLE NREP"/* A39E */,/*15137*/"YI SYLLABLE NRUT"/* A39F */,/*15138*/"YI SYLLABLE NRUX"/* A3A0 */, /*15139*/"YI SYLLABLE NRU"/* A3A1 */,/*15140*/"YI SYLLABLE NRUP"/* A3A2 */,/*15141*/"YI SYLLABLE NRURX"/* A3A3 */, /*15142*/"YI SYLLABLE NRUR"/* A3A4 */,/*15143*/"YI SYLLABLE NRYT"/* A3A5 */,/*15144*/"YI SYLLABLE NRYX"/* A3A6 */, /*15145*/"YI SYLLABLE NRY"/* A3A7 */,/*15146*/"YI SYLLABLE NRYP"/* A3A8 */,/*15147*/"YI SYLLABLE NRYRX"/* A3A9 */, /*15148*/"YI SYLLABLE NRYR"/* A3AA */,/*15149*/"YI SYLLABLE SHAT"/* A3AB */,/*15150*/"YI SYLLABLE SHAX"/* A3AC */, /*15151*/"YI SYLLABLE SHA"/* A3AD */,/*15152*/"YI SYLLABLE SHAP"/* A3AE */,/*15153*/"YI SYLLABLE SHUOX"/* A3AF */, /*15154*/"YI SYLLABLE SHUO"/* A3B0 */,/*15155*/"YI SYLLABLE SHUOP"/* A3B1 */,/*15156*/"YI SYLLABLE SHOT"/* A3B2 */, /*15157*/"YI SYLLABLE SHOX"/* A3B3 */,/*15158*/"YI SYLLABLE SHO"/* A3B4 */,/*15159*/"YI SYLLABLE SHOP"/* A3B5 */, /*15160*/"YI SYLLABLE SHET"/* A3B6 */,/*15161*/"YI SYLLABLE SHEX"/* A3B7 */,/*15162*/"YI SYLLABLE SHE"/* A3B8 */, /*15163*/"YI SYLLABLE SHEP"/* A3B9 */,/*15164*/"YI SYLLABLE SHUT"/* A3BA */,/*15165*/"YI SYLLABLE SHUX"/* A3BB */, /*15166*/"YI SYLLABLE SHU"/* A3BC */,/*15167*/"YI SYLLABLE SHUP"/* A3BD */,/*15168*/"YI SYLLABLE SHURX"/* A3BE */, /*15169*/"YI SYLLABLE SHUR"/* A3BF */,/*15170*/"YI SYLLABLE SHYT"/* A3C0 */,/*15171*/"YI SYLLABLE SHYX"/* A3C1 */, /*15172*/"YI SYLLABLE SHY"/* A3C2 */,/*15173*/"YI SYLLABLE SHYP"/* A3C3 */,/*15174*/"YI SYLLABLE SHYRX"/* A3C4 */, /*15175*/"YI SYLLABLE SHYR"/* A3C5 */,/*15176*/"YI SYLLABLE RAT"/* A3C6 */,/*15177*/"YI SYLLABLE RAX"/* A3C7 */, /*15178*/"YI SYLLABLE RA"/* A3C8 */,/*15179*/"YI SYLLABLE RAP"/* A3C9 */,/*15180*/"YI SYLLABLE RUOX"/* A3CA */, /*15181*/"YI SYLLABLE RUO"/* A3CB */,/*15182*/"YI SYLLABLE RUOP"/* A3CC */,/*15183*/"YI SYLLABLE ROT"/* A3CD */, /*15184*/"YI SYLLABLE ROX"/* A3CE */,/*15185*/"YI SYLLABLE RO"/* A3CF */,/*15186*/"YI SYLLABLE ROP"/* A3D0 */, /*15187*/"YI SYLLABLE REX"/* A3D1 */,/*15188*/"YI SYLLABLE RE"/* A3D2 */,/*15189*/"YI SYLLABLE REP"/* A3D3 */, /*15190*/"YI SYLLABLE RUT"/* A3D4 */,/*15191*/"YI SYLLABLE RUX"/* A3D5 */,/*15192*/"YI SYLLABLE RU"/* A3D6 */, /*15193*/"YI SYLLABLE RUP"/* A3D7 */,/*15194*/"YI SYLLABLE RURX"/* A3D8 */,/*15195*/"YI SYLLABLE RUR"/* A3D9 */, /*15196*/"YI SYLLABLE RYT"/* A3DA */,/*15197*/"YI SYLLABLE RYX"/* A3DB */,/*15198*/"YI SYLLABLE RY"/* A3DC */, /*15199*/"YI SYLLABLE RYP"/* A3DD */,/*15200*/"YI SYLLABLE RYRX"/* A3DE */,/*15201*/"YI SYLLABLE RYR"/* A3DF */, /*15202*/"YI SYLLABLE JIT"/* A3E0 */,/*15203*/"YI SYLLABLE JIX"/* A3E1 */,/*15204*/"YI SYLLABLE JI"/* A3E2 */, /*15205*/"YI SYLLABLE JIP"/* A3E3 */,/*15206*/"YI SYLLABLE JIET"/* A3E4 */,/*15207*/"YI SYLLABLE JIEX"/* A3E5 */, /*15208*/"YI SYLLABLE JIE"/* A3E6 */,/*15209*/"YI SYLLABLE JIEP"/* A3E7 */,/*15210*/"YI SYLLABLE JUOT"/* A3E8 */, /*15211*/"YI SYLLABLE JUOX"/* A3E9 */,/*15212*/"YI SYLLABLE JUO"/* A3EA */,/*15213*/"YI SYLLABLE JUOP"/* A3EB */, /*15214*/"YI SYLLABLE JOT"/* A3EC */,/*15215*/"YI SYLLABLE JOX"/* A3ED */,/*15216*/"YI SYLLABLE JO"/* A3EE */, /*15217*/"YI SYLLABLE JOP"/* A3EF */,/*15218*/"YI SYLLABLE JUT"/* A3F0 */,/*15219*/"YI SYLLABLE JUX"/* A3F1 */, /*15220*/"YI SYLLABLE JU"/* A3F2 */,/*15221*/"YI SYLLABLE JUP"/* A3F3 */,/*15222*/"YI SYLLABLE JURX"/* A3F4 */, /*15223*/"YI SYLLABLE JUR"/* A3F5 */,/*15224*/"YI SYLLABLE JYT"/* A3F6 */,/*15225*/"YI SYLLABLE JYX"/* A3F7 */, /*15226*/"YI SYLLABLE JY"/* A3F8 */,/*15227*/"YI SYLLABLE JYP"/* A3F9 */,/*15228*/"YI SYLLABLE JYRX"/* A3FA */, /*15229*/"YI SYLLABLE JYR"/* A3FB */,/*15230*/"YI SYLLABLE QIT"/* A3FC */,/*15231*/"YI SYLLABLE QIX"/* A3FD */, /*15232*/"YI SYLLABLE QI"/* A3FE */,/*15233*/"YI SYLLABLE QIP"/* A3FF */,/*15234*/"YI SYLLABLE QIET"/* A400 */, /*15235*/"YI SYLLABLE QIEX"/* A401 */,/*15236*/"YI SYLLABLE QIE"/* A402 */,/*15237*/"YI SYLLABLE QIEP"/* A403 */, /*15238*/"YI SYLLABLE QUOT"/* A404 */,/*15239*/"YI SYLLABLE QUOX"/* A405 */,/*15240*/"YI SYLLABLE QUO"/* A406 */, /*15241*/"YI SYLLABLE QUOP"/* A407 */,/*15242*/"YI SYLLABLE QOT"/* A408 */,/*15243*/"YI SYLLABLE QOX"/* A409 */, /*15244*/"YI SYLLABLE QO"/* A40A */,/*15245*/"YI SYLLABLE QOP"/* A40B */,/*15246*/"YI SYLLABLE QUT"/* A40C */, /*15247*/"YI SYLLABLE QUX"/* A40D */,/*15248*/"YI SYLLABLE QU"/* A40E */,/*15249*/"YI SYLLABLE QUP"/* A40F */, /*15250*/"YI SYLLABLE QURX"/* A410 */,/*15251*/"YI SYLLABLE QUR"/* A411 */,/*15252*/"YI SYLLABLE QYT"/* A412 */, /*15253*/"YI SYLLABLE QYX"/* A413 */,/*15254*/"YI SYLLABLE QY"/* A414 */,/*15255*/"YI SYLLABLE QYP"/* A415 */, /*15256*/"YI SYLLABLE QYRX"/* A416 */,/*15257*/"YI SYLLABLE QYR"/* A417 */,/*15258*/"YI SYLLABLE JJIT"/* A418 */, /*15259*/"YI SYLLABLE JJIX"/* A419 */,/*15260*/"YI SYLLABLE JJI"/* A41A */,/*15261*/"YI SYLLABLE JJIP"/* A41B */, /*15262*/"YI SYLLABLE JJIET"/* A41C */,/*15263*/"YI SYLLABLE JJIEX"/* A41D */,/*15264*/"YI SYLLABLE JJIE"/* A41E */, /*15265*/"YI SYLLABLE JJIEP"/* A41F */,/*15266*/"YI SYLLABLE JJUOX"/* A420 */,/*15267*/"YI SYLLABLE JJUO"/* A421 */, /*15268*/"YI SYLLABLE JJUOP"/* A422 */,/*15269*/"YI SYLLABLE JJOT"/* A423 */,/*15270*/"YI SYLLABLE JJOX"/* A424 */, /*15271*/"YI SYLLABLE JJO"/* A425 */,/*15272*/"YI SYLLABLE JJOP"/* A426 */,/*15273*/"YI SYLLABLE JJUT"/* A427 */, /*15274*/"YI SYLLABLE JJUX"/* A428 */,/*15275*/"YI SYLLABLE JJU"/* A429 */,/*15276*/"YI SYLLABLE JJUP"/* A42A */, /*15277*/"YI SYLLABLE JJURX"/* A42B */,/*15278*/"YI SYLLABLE JJUR"/* A42C */,/*15279*/"YI SYLLABLE JJYT"/* A42D */, /*15280*/"YI SYLLABLE JJYX"/* A42E */,/*15281*/"YI SYLLABLE JJY"/* A42F */,/*15282*/"YI SYLLABLE JJYP"/* A430 */, /*15283*/"YI SYLLABLE NJIT"/* A431 */,/*15284*/"YI SYLLABLE NJIX"/* A432 */,/*15285*/"YI SYLLABLE NJI"/* A433 */, /*15286*/"YI SYLLABLE NJIP"/* A434 */,/*15287*/"YI SYLLABLE NJIET"/* A435 */,/*15288*/"YI SYLLABLE NJIEX"/* A436 */, /*15289*/"YI SYLLABLE NJIE"/* A437 */,/*15290*/"YI SYLLABLE NJIEP"/* A438 */,/*15291*/"YI SYLLABLE NJUOX"/* A439 */, /*15292*/"YI SYLLABLE NJUO"/* A43A */,/*15293*/"YI SYLLABLE NJOT"/* A43B */,/*15294*/"YI SYLLABLE NJOX"/* A43C */, /*15295*/"YI SYLLABLE NJO"/* A43D */,/*15296*/"YI SYLLABLE NJOP"/* A43E */,/*15297*/"YI SYLLABLE NJUX"/* A43F */, /*15298*/"YI SYLLABLE NJU"/* A440 */,/*15299*/"YI SYLLABLE NJUP"/* A441 */,/*15300*/"YI SYLLABLE NJURX"/* A442 */, /*15301*/"YI SYLLABLE NJUR"/* A443 */,/*15302*/"YI SYLLABLE NJYT"/* A444 */,/*15303*/"YI SYLLABLE NJYX"/* A445 */, /*15304*/"YI SYLLABLE NJY"/* A446 */,/*15305*/"YI SYLLABLE NJYP"/* A447 */,/*15306*/"YI SYLLABLE NJYRX"/* A448 */, /*15307*/"YI SYLLABLE NJYR"/* A449 */,/*15308*/"YI SYLLABLE NYIT"/* A44A */,/*15309*/"YI SYLLABLE NYIX"/* A44B */, /*15310*/"YI SYLLABLE NYI"/* A44C */,/*15311*/"YI SYLLABLE NYIP"/* A44D */,/*15312*/"YI SYLLABLE NYIET"/* A44E */, /*15313*/"YI SYLLABLE NYIEX"/* A44F */,/*15314*/"YI SYLLABLE NYIE"/* A450 */,/*15315*/"YI SYLLABLE NYIEP"/* A451 */, /*15316*/"YI SYLLABLE NYUOX"/* A452 */,/*15317*/"YI SYLLABLE NYUO"/* A453 */,/*15318*/"YI SYLLABLE NYUOP"/* A454 */, /*15319*/"YI SYLLABLE NYOT"/* A455 */,/*15320*/"YI SYLLABLE NYOX"/* A456 */,/*15321*/"YI SYLLABLE NYO"/* A457 */, /*15322*/"YI SYLLABLE NYOP"/* A458 */,/*15323*/"YI SYLLABLE NYUT"/* A459 */,/*15324*/"YI SYLLABLE NYUX"/* A45A */, /*15325*/"YI SYLLABLE NYU"/* A45B */,/*15326*/"YI SYLLABLE NYUP"/* A45C */,/*15327*/"YI SYLLABLE XIT"/* A45D */, /*15328*/"YI SYLLABLE XIX"/* A45E */,/*15329*/"YI SYLLABLE XI"/* A45F */,/*15330*/"YI SYLLABLE XIP"/* A460 */, /*15331*/"YI SYLLABLE XIET"/* A461 */,/*15332*/"YI SYLLABLE XIEX"/* A462 */,/*15333*/"YI SYLLABLE XIE"/* A463 */, /*15334*/"YI SYLLABLE XIEP"/* A464 */,/*15335*/"YI SYLLABLE XUOX"/* A465 */,/*15336*/"YI SYLLABLE XUO"/* A466 */, /*15337*/"YI SYLLABLE XOT"/* A467 */,/*15338*/"YI SYLLABLE XOX"/* A468 */,/*15339*/"YI SYLLABLE XO"/* A469 */, /*15340*/"YI SYLLABLE XOP"/* A46A */,/*15341*/"YI SYLLABLE XYT"/* A46B */,/*15342*/"YI SYLLABLE XYX"/* A46C */, /*15343*/"YI SYLLABLE XY"/* A46D */,/*15344*/"YI SYLLABLE XYP"/* A46E */,/*15345*/"YI SYLLABLE XYRX"/* A46F */, /*15346*/"YI SYLLABLE XYR"/* A470 */,/*15347*/"YI SYLLABLE YIT"/* A471 */,/*15348*/"YI SYLLABLE YIX"/* A472 */, /*15349*/"YI SYLLABLE YI"/* A473 */,/*15350*/"YI SYLLABLE YIP"/* A474 */,/*15351*/"YI SYLLABLE YIET"/* A475 */, /*15352*/"YI SYLLABLE YIEX"/* A476 */,/*15353*/"YI SYLLABLE YIE"/* A477 */,/*15354*/"YI SYLLABLE YIEP"/* A478 */, /*15355*/"YI SYLLABLE YUOT"/* A479 */,/*15356*/"YI SYLLABLE YUOX"/* A47A */,/*15357*/"YI SYLLABLE YUO"/* A47B */, /*15358*/"YI SYLLABLE YUOP"/* A47C */,/*15359*/"YI SYLLABLE YOT"/* A47D */,/*15360*/"YI SYLLABLE YOX"/* A47E */, /*15361*/"YI SYLLABLE YO"/* A47F */,/*15362*/"YI SYLLABLE YOP"/* A480 */,/*15363*/"YI SYLLABLE YUT"/* A481 */, /*15364*/"YI SYLLABLE YUX"/* A482 */,/*15365*/"YI SYLLABLE YU"/* A483 */,/*15366*/"YI SYLLABLE YUP"/* A484 */, /*15367*/"YI SYLLABLE YURX"/* A485 */,/*15368*/"YI SYLLABLE YUR"/* A486 */,/*15369*/"YI SYLLABLE YYT"/* A487 */, /*15370*/"YI SYLLABLE YYX"/* A488 */,/*15371*/"YI SYLLABLE YY"/* A489 */,/*15372*/"YI SYLLABLE YYP"/* A48A */, /*15373*/"YI SYLLABLE YYRX"/* A48B */,/*15374*/"YI SYLLABLE YYR"/* A48C */,NULL,NULL,NULL, /*15378*/"YI RADICAL QOT"/* A490 */,/*15379*/"YI RADICAL LI"/* A491 */,/*15380*/"YI RADICAL KIT"/* A492 */, /*15381*/"YI RADICAL NYIP"/* A493 */,/*15382*/"YI RADICAL CYP"/* A494 */,/*15383*/"YI RADICAL SSI"/* A495 */, /*15384*/"YI RADICAL GGOP"/* A496 */,/*15385*/"YI RADICAL GEP"/* A497 */,/*15386*/"YI RADICAL MI"/* A498 */, /*15387*/"YI RADICAL HXIT"/* A499 */,/*15388*/"YI RADICAL LYR"/* A49A */,/*15389*/"YI RADICAL BBUT"/* A49B */, /*15390*/"YI RADICAL MOP"/* A49C */,/*15391*/"YI RADICAL YO"/* A49D */,/*15392*/"YI RADICAL PUT"/* A49E */, /*15393*/"YI RADICAL HXUO"/* A49F */,/*15394*/"YI RADICAL TAT"/* A4A0 */,/*15395*/"YI RADICAL GA"/* A4A1 */, /*15396*/"YI RADICAL ZUP"/* A4A2 */,/*15397*/"YI RADICAL CYT"/* A4A3 */,/*15398*/"YI RADICAL DDUR"/* A4A4 */, /*15399*/"YI RADICAL BUR"/* A4A5 */,/*15400*/"YI RADICAL GGUO"/* A4A6 */,/*15401*/"YI RADICAL NYOP"/* A4A7 */, /*15402*/"YI RADICAL TU"/* A4A8 */,/*15403*/"YI RADICAL OP"/* A4A9 */,/*15404*/"YI RADICAL JJUT"/* A4AA */, /*15405*/"YI RADICAL ZOT"/* A4AB */,/*15406*/"YI RADICAL PYT"/* A4AC */,/*15407*/"YI RADICAL HMO"/* A4AD */, /*15408*/"YI RADICAL YIT"/* A4AE */,/*15409*/"YI RADICAL VUR"/* A4AF */,/*15410*/"YI RADICAL SHY"/* A4B0 */, /*15411*/"YI RADICAL VEP"/* A4B1 */,/*15412*/"YI RADICAL ZA"/* A4B2 */,/*15413*/"YI RADICAL JO"/* A4B3 */, /*15414*/"YI RADICAL NZUP"/* A4B4 */,/*15415*/"YI RADICAL JJY"/* A4B5 */,/*15416*/"YI RADICAL GOT"/* A4B6 */, /*15417*/"YI RADICAL JJIE"/* A4B7 */,/*15418*/"YI RADICAL WO"/* A4B8 */,/*15419*/"YI RADICAL DU"/* A4B9 */, /*15420*/"YI RADICAL SHUR"/* A4BA */,/*15421*/"YI RADICAL LIE"/* A4BB */,/*15422*/"YI RADICAL CY"/* A4BC */, /*15423*/"YI RADICAL CUOP"/* A4BD */,/*15424*/"YI RADICAL CIP"/* A4BE */,/*15425*/"YI RADICAL HXOP"/* A4BF */, /*15426*/"YI RADICAL SHAT"/* A4C0 */,/*15427*/"YI RADICAL ZUR"/* A4C1 */,/*15428*/"YI RADICAL SHOP"/* A4C2 */, /*15429*/"YI RADICAL CHE"/* A4C3 */,/*15430*/"YI RADICAL ZZIET"/* A4C4 */,/*15431*/"YI RADICAL NBIE"/* A4C5 */, /*15432*/"YI RADICAL KE"/* A4C6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*15442*/"LISU LETTER BA"/* A4D0 */, /*15443*/"LISU LETTER PA"/* A4D1 */,/*15444*/"LISU LETTER PHA"/* A4D2 */,/*15445*/"LISU LETTER DA"/* A4D3 */, /*15446*/"LISU LETTER TA"/* A4D4 */,/*15447*/"LISU LETTER THA"/* A4D5 */,/*15448*/"LISU LETTER GA"/* A4D6 */, /*15449*/"LISU LETTER KA"/* A4D7 */,/*15450*/"LISU LETTER KHA"/* A4D8 */,/*15451*/"LISU LETTER JA"/* A4D9 */, /*15452*/"LISU LETTER CA"/* A4DA */,/*15453*/"LISU LETTER CHA"/* A4DB */,/*15454*/"LISU LETTER DZA"/* A4DC */, /*15455*/"LISU LETTER TSA"/* A4DD */,/*15456*/"LISU LETTER TSHA"/* A4DE */,/*15457*/"LISU LETTER MA"/* A4DF */, /*15458*/"LISU LETTER NA"/* A4E0 */,/*15459*/"LISU LETTER LA"/* A4E1 */,/*15460*/"LISU LETTER SA"/* A4E2 */, /*15461*/"LISU LETTER ZHA"/* A4E3 */,/*15462*/"LISU LETTER ZA"/* A4E4 */,/*15463*/"LISU LETTER NGA"/* A4E5 */, /*15464*/"LISU LETTER HA"/* A4E6 */,/*15465*/"LISU LETTER XA"/* A4E7 */,/*15466*/"LISU LETTER HHA"/* A4E8 */, /*15467*/"LISU LETTER FA"/* A4E9 */,/*15468*/"LISU LETTER WA"/* A4EA */,/*15469*/"LISU LETTER SHA"/* A4EB */, /*15470*/"LISU LETTER YA"/* A4EC */,/*15471*/"LISU LETTER GHA"/* A4ED */,/*15472*/"LISU LETTER A"/* A4EE */, /*15473*/"LISU LETTER AE"/* A4EF */,/*15474*/"LISU LETTER E"/* A4F0 */,/*15475*/"LISU LETTER EU"/* A4F1 */, /*15476*/"LISU LETTER I"/* A4F2 */,/*15477*/"LISU LETTER O"/* A4F3 */,/*15478*/"LISU LETTER U"/* A4F4 */, /*15479*/"LISU LETTER UE"/* A4F5 */,/*15480*/"LISU LETTER UH"/* A4F6 */,/*15481*/"LISU LETTER OE"/* A4F7 */, /*15482*/"LISU LETTER TONE MYA TI"/* A4F8 */,/*15483*/"LISU LETTER TONE NA PO"/* A4F9 */, /*15484*/"LISU LETTER TONE MYA CYA"/* A4FA */,/*15485*/"LISU LETTER TONE MYA BO"/* A4FB */, /*15486*/"LISU LETTER TONE MYA NA"/* A4FC */,/*15487*/"LISU LETTER TONE MYA JEU"/* A4FD */, /*15488*/"LISU PUNCTUATION COMMA"/* A4FE */,/*15489*/"LISU PUNCTUATION FULL STOP"/* A4FF */, /*15490*/"VAI SYLLABLE EE"/* A500 */,/*15491*/"VAI SYLLABLE EEN"/* A501 */,/*15492*/"VAI SYLLABLE HEE"/* A502 */, /*15493*/"VAI SYLLABLE WEE"/* A503 */,/*15494*/"VAI SYLLABLE WEEN"/* A504 */,/*15495*/"VAI SYLLABLE PEE"/* A505 */, /*15496*/"VAI SYLLABLE BHEE"/* A506 */,/*15497*/"VAI SYLLABLE BEE"/* A507 */,/*15498*/"VAI SYLLABLE MBEE"/* A508 */, /*15499*/"VAI SYLLABLE KPEE"/* A509 */,/*15500*/"VAI SYLLABLE MGBEE"/* A50A */,/*15501*/"VAI SYLLABLE GBEE"/* A50B */, /*15502*/"VAI SYLLABLE FEE"/* A50C */,/*15503*/"VAI SYLLABLE VEE"/* A50D */,/*15504*/"VAI SYLLABLE TEE"/* A50E */, /*15505*/"VAI SYLLABLE THEE"/* A50F */,/*15506*/"VAI SYLLABLE DHEE"/* A510 */,/*15507*/"VAI SYLLABLE DHHEE"/* A511 */, /*15508*/"VAI SYLLABLE LEE"/* A512 */,/*15509*/"VAI SYLLABLE REE"/* A513 */,/*15510*/"VAI SYLLABLE DEE"/* A514 */, /*15511*/"VAI SYLLABLE NDEE"/* A515 */,/*15512*/"VAI SYLLABLE SEE"/* A516 */,/*15513*/"VAI SYLLABLE SHEE"/* A517 */, /*15514*/"VAI SYLLABLE ZEE"/* A518 */,/*15515*/"VAI SYLLABLE ZHEE"/* A519 */,/*15516*/"VAI SYLLABLE CEE"/* A51A */, /*15517*/"VAI SYLLABLE JEE"/* A51B */,/*15518*/"VAI SYLLABLE NJEE"/* A51C */,/*15519*/"VAI SYLLABLE YEE"/* A51D */, /*15520*/"VAI SYLLABLE KEE"/* A51E */,/*15521*/"VAI SYLLABLE NGGEE"/* A51F */,/*15522*/"VAI SYLLABLE GEE"/* A520 */, /*15523*/"VAI SYLLABLE MEE"/* A521 */,/*15524*/"VAI SYLLABLE NEE"/* A522 */,/*15525*/"VAI SYLLABLE NYEE"/* A523 */, /*15526*/"VAI SYLLABLE I"/* A524 */,/*15527*/"VAI SYLLABLE IN"/* A525 */,/*15528*/"VAI SYLLABLE HI"/* A526 */, /*15529*/"VAI SYLLABLE HIN"/* A527 */,/*15530*/"VAI SYLLABLE WI"/* A528 */,/*15531*/"VAI SYLLABLE WIN"/* A529 */, /*15532*/"VAI SYLLABLE PI"/* A52A */,/*15533*/"VAI SYLLABLE BHI"/* A52B */,/*15534*/"VAI SYLLABLE BI"/* A52C */, /*15535*/"VAI SYLLABLE MBI"/* A52D */,/*15536*/"VAI SYLLABLE KPI"/* A52E */,/*15537*/"VAI SYLLABLE MGBI"/* A52F */, /*15538*/"VAI SYLLABLE GBI"/* A530 */,/*15539*/"VAI SYLLABLE FI"/* A531 */,/*15540*/"VAI SYLLABLE VI"/* A532 */, /*15541*/"VAI SYLLABLE TI"/* A533 */,/*15542*/"VAI SYLLABLE THI"/* A534 */,/*15543*/"VAI SYLLABLE DHI"/* A535 */, /*15544*/"VAI SYLLABLE DHHI"/* A536 */,/*15545*/"VAI SYLLABLE LI"/* A537 */,/*15546*/"VAI SYLLABLE RI"/* A538 */, /*15547*/"VAI SYLLABLE DI"/* A539 */,/*15548*/"VAI SYLLABLE NDI"/* A53A */,/*15549*/"VAI SYLLABLE SI"/* A53B */, /*15550*/"VAI SYLLABLE SHI"/* A53C */,/*15551*/"VAI SYLLABLE ZI"/* A53D */,/*15552*/"VAI SYLLABLE ZHI"/* A53E */, /*15553*/"VAI SYLLABLE CI"/* A53F */,/*15554*/"VAI SYLLABLE JI"/* A540 */,/*15555*/"VAI SYLLABLE NJI"/* A541 */, /*15556*/"VAI SYLLABLE YI"/* A542 */,/*15557*/"VAI SYLLABLE KI"/* A543 */,/*15558*/"VAI SYLLABLE NGGI"/* A544 */, /*15559*/"VAI SYLLABLE GI"/* A545 */,/*15560*/"VAI SYLLABLE MI"/* A546 */,/*15561*/"VAI SYLLABLE NI"/* A547 */, /*15562*/"VAI SYLLABLE NYI"/* A548 */,/*15563*/"VAI SYLLABLE A"/* A549 */,/*15564*/"VAI SYLLABLE AN"/* A54A */, /*15565*/"VAI SYLLABLE NGAN"/* A54B */,/*15566*/"VAI SYLLABLE HA"/* A54C */,/*15567*/"VAI SYLLABLE HAN"/* A54D */, /*15568*/"VAI SYLLABLE WA"/* A54E */,/*15569*/"VAI SYLLABLE WAN"/* A54F */,/*15570*/"VAI SYLLABLE PA"/* A550 */, /*15571*/"VAI SYLLABLE BHA"/* A551 */,/*15572*/"VAI SYLLABLE BA"/* A552 */,/*15573*/"VAI SYLLABLE MBA"/* A553 */, /*15574*/"VAI SYLLABLE KPA"/* A554 */,/*15575*/"VAI SYLLABLE KPAN"/* A555 */,/*15576*/"VAI SYLLABLE MGBA"/* A556 */, /*15577*/"VAI SYLLABLE GBA"/* A557 */,/*15578*/"VAI SYLLABLE FA"/* A558 */,/*15579*/"VAI SYLLABLE VA"/* A559 */, /*15580*/"VAI SYLLABLE TA"/* A55A */,/*15581*/"VAI SYLLABLE THA"/* A55B */,/*15582*/"VAI SYLLABLE DHA"/* A55C */, /*15583*/"VAI SYLLABLE DHHA"/* A55D */,/*15584*/"VAI SYLLABLE LA"/* A55E */,/*15585*/"VAI SYLLABLE RA"/* A55F */, /*15586*/"VAI SYLLABLE DA"/* A560 */,/*15587*/"VAI SYLLABLE NDA"/* A561 */,/*15588*/"VAI SYLLABLE SA"/* A562 */, /*15589*/"VAI SYLLABLE SHA"/* A563 */,/*15590*/"VAI SYLLABLE ZA"/* A564 */,/*15591*/"VAI SYLLABLE ZHA"/* A565 */, /*15592*/"VAI SYLLABLE CA"/* A566 */,/*15593*/"VAI SYLLABLE JA"/* A567 */,/*15594*/"VAI SYLLABLE NJA"/* A568 */, /*15595*/"VAI SYLLABLE YA"/* A569 */,/*15596*/"VAI SYLLABLE KA"/* A56A */,/*15597*/"VAI SYLLABLE KAN"/* A56B */, /*15598*/"VAI SYLLABLE NGGA"/* A56C */,/*15599*/"VAI SYLLABLE GA"/* A56D */,/*15600*/"VAI SYLLABLE MA"/* A56E */, /*15601*/"VAI SYLLABLE NA"/* A56F */,/*15602*/"VAI SYLLABLE NYA"/* A570 */,/*15603*/"VAI SYLLABLE OO"/* A571 */, /*15604*/"VAI SYLLABLE OON"/* A572 */,/*15605*/"VAI SYLLABLE HOO"/* A573 */,/*15606*/"VAI SYLLABLE WOO"/* A574 */, /*15607*/"VAI SYLLABLE WOON"/* A575 */,/*15608*/"VAI SYLLABLE POO"/* A576 */,/*15609*/"VAI SYLLABLE BHOO"/* A577 */, /*15610*/"VAI SYLLABLE BOO"/* A578 */,/*15611*/"VAI SYLLABLE MBOO"/* A579 */,/*15612*/"VAI SYLLABLE KPOO"/* A57A */, /*15613*/"VAI SYLLABLE MGBOO"/* A57B */,/*15614*/"VAI SYLLABLE GBOO"/* A57C */,/*15615*/"VAI SYLLABLE FOO"/* A57D */, /*15616*/"VAI SYLLABLE VOO"/* A57E */,/*15617*/"VAI SYLLABLE TOO"/* A57F */,/*15618*/"VAI SYLLABLE THOO"/* A580 */, /*15619*/"VAI SYLLABLE DHOO"/* A581 */,/*15620*/"VAI SYLLABLE DHHOO"/* A582 */,/*15621*/"VAI SYLLABLE LOO"/* A583 */, /*15622*/"VAI SYLLABLE ROO"/* A584 */,/*15623*/"VAI SYLLABLE DOO"/* A585 */,/*15624*/"VAI SYLLABLE NDOO"/* A586 */, /*15625*/"VAI SYLLABLE SOO"/* A587 */,/*15626*/"VAI SYLLABLE SHOO"/* A588 */,/*15627*/"VAI SYLLABLE ZOO"/* A589 */, /*15628*/"VAI SYLLABLE ZHOO"/* A58A */,/*15629*/"VAI SYLLABLE COO"/* A58B */,/*15630*/"VAI SYLLABLE JOO"/* A58C */, /*15631*/"VAI SYLLABLE NJOO"/* A58D */,/*15632*/"VAI SYLLABLE YOO"/* A58E */,/*15633*/"VAI SYLLABLE KOO"/* A58F */, /*15634*/"VAI SYLLABLE NGGOO"/* A590 */,/*15635*/"VAI SYLLABLE GOO"/* A591 */,/*15636*/"VAI SYLLABLE MOO"/* A592 */, /*15637*/"VAI SYLLABLE NOO"/* A593 */,/*15638*/"VAI SYLLABLE NYOO"/* A594 */,/*15639*/"VAI SYLLABLE U"/* A595 */, /*15640*/"VAI SYLLABLE UN"/* A596 */,/*15641*/"VAI SYLLABLE HU"/* A597 */,/*15642*/"VAI SYLLABLE HUN"/* A598 */, /*15643*/"VAI SYLLABLE WU"/* A599 */,/*15644*/"VAI SYLLABLE WUN"/* A59A */,/*15645*/"VAI SYLLABLE PU"/* A59B */, /*15646*/"VAI SYLLABLE BHU"/* A59C */,/*15647*/"VAI SYLLABLE BU"/* A59D */,/*15648*/"VAI SYLLABLE MBU"/* A59E */, /*15649*/"VAI SYLLABLE KPU"/* A59F */,/*15650*/"VAI SYLLABLE MGBU"/* A5A0 */,/*15651*/"VAI SYLLABLE GBU"/* A5A1 */, /*15652*/"VAI SYLLABLE FU"/* A5A2 */,/*15653*/"VAI SYLLABLE VU"/* A5A3 */,/*15654*/"VAI SYLLABLE TU"/* A5A4 */, /*15655*/"VAI SYLLABLE THU"/* A5A5 */,/*15656*/"VAI SYLLABLE DHU"/* A5A6 */,/*15657*/"VAI SYLLABLE DHHU"/* A5A7 */, /*15658*/"VAI SYLLABLE LU"/* A5A8 */,/*15659*/"VAI SYLLABLE RU"/* A5A9 */,/*15660*/"VAI SYLLABLE DU"/* A5AA */, /*15661*/"VAI SYLLABLE NDU"/* A5AB */,/*15662*/"VAI SYLLABLE SU"/* A5AC */,/*15663*/"VAI SYLLABLE SHU"/* A5AD */, /*15664*/"VAI SYLLABLE ZU"/* A5AE */,/*15665*/"VAI SYLLABLE ZHU"/* A5AF */,/*15666*/"VAI SYLLABLE CU"/* A5B0 */, /*15667*/"VAI SYLLABLE JU"/* A5B1 */,/*15668*/"VAI SYLLABLE NJU"/* A5B2 */,/*15669*/"VAI SYLLABLE YU"/* A5B3 */, /*15670*/"VAI SYLLABLE KU"/* A5B4 */,/*15671*/"VAI SYLLABLE NGGU"/* A5B5 */,/*15672*/"VAI SYLLABLE GU"/* A5B6 */, /*15673*/"VAI SYLLABLE MU"/* A5B7 */,/*15674*/"VAI SYLLABLE NU"/* A5B8 */,/*15675*/"VAI SYLLABLE NYU"/* A5B9 */, /*15676*/"VAI SYLLABLE O"/* A5BA */,/*15677*/"VAI SYLLABLE ON"/* A5BB */,/*15678*/"VAI SYLLABLE NGON"/* A5BC */, /*15679*/"VAI SYLLABLE HO"/* A5BD */,/*15680*/"VAI SYLLABLE HON"/* A5BE */,/*15681*/"VAI SYLLABLE WO"/* A5BF */, /*15682*/"VAI SYLLABLE WON"/* A5C0 */,/*15683*/"VAI SYLLABLE PO"/* A5C1 */,/*15684*/"VAI SYLLABLE BHO"/* A5C2 */, /*15685*/"VAI SYLLABLE BO"/* A5C3 */,/*15686*/"VAI SYLLABLE MBO"/* A5C4 */,/*15687*/"VAI SYLLABLE KPO"/* A5C5 */, /*15688*/"VAI SYLLABLE MGBO"/* A5C6 */,/*15689*/"VAI SYLLABLE GBO"/* A5C7 */,/*15690*/"VAI SYLLABLE GBON"/* A5C8 */, /*15691*/"VAI SYLLABLE FO"/* A5C9 */,/*15692*/"VAI SYLLABLE VO"/* A5CA */,/*15693*/"VAI SYLLABLE TO"/* A5CB */, /*15694*/"VAI SYLLABLE THO"/* A5CC */,/*15695*/"VAI SYLLABLE DHO"/* A5CD */,/*15696*/"VAI SYLLABLE DHHO"/* A5CE */, /*15697*/"VAI SYLLABLE LO"/* A5CF */,/*15698*/"VAI SYLLABLE RO"/* A5D0 */,/*15699*/"VAI SYLLABLE DO"/* A5D1 */, /*15700*/"VAI SYLLABLE NDO"/* A5D2 */,/*15701*/"VAI SYLLABLE SO"/* A5D3 */,/*15702*/"VAI SYLLABLE SHO"/* A5D4 */, /*15703*/"VAI SYLLABLE ZO"/* A5D5 */,/*15704*/"VAI SYLLABLE ZHO"/* A5D6 */,/*15705*/"VAI SYLLABLE CO"/* A5D7 */, /*15706*/"VAI SYLLABLE JO"/* A5D8 */,/*15707*/"VAI SYLLABLE NJO"/* A5D9 */,/*15708*/"VAI SYLLABLE YO"/* A5DA */, /*15709*/"VAI SYLLABLE KO"/* A5DB */,/*15710*/"VAI SYLLABLE NGGO"/* A5DC */,/*15711*/"VAI SYLLABLE GO"/* A5DD */, /*15712*/"VAI SYLLABLE MO"/* A5DE */,/*15713*/"VAI SYLLABLE NO"/* A5DF */,/*15714*/"VAI SYLLABLE NYO"/* A5E0 */, /*15715*/"VAI SYLLABLE E"/* A5E1 */,/*15716*/"VAI SYLLABLE EN"/* A5E2 */,/*15717*/"VAI SYLLABLE NGEN"/* A5E3 */, /*15718*/"VAI SYLLABLE HE"/* A5E4 */,/*15719*/"VAI SYLLABLE HEN"/* A5E5 */,/*15720*/"VAI SYLLABLE WE"/* A5E6 */, /*15721*/"VAI SYLLABLE WEN"/* A5E7 */,/*15722*/"VAI SYLLABLE PE"/* A5E8 */,/*15723*/"VAI SYLLABLE BHE"/* A5E9 */, /*15724*/"VAI SYLLABLE BE"/* A5EA */,/*15725*/"VAI SYLLABLE MBE"/* A5EB */,/*15726*/"VAI SYLLABLE KPE"/* A5EC */, /*15727*/"VAI SYLLABLE KPEN"/* A5ED */,/*15728*/"VAI SYLLABLE MGBE"/* A5EE */,/*15729*/"VAI SYLLABLE GBE"/* A5EF */, /*15730*/"VAI SYLLABLE GBEN"/* A5F0 */,/*15731*/"VAI SYLLABLE FE"/* A5F1 */,/*15732*/"VAI SYLLABLE VE"/* A5F2 */, /*15733*/"VAI SYLLABLE TE"/* A5F3 */,/*15734*/"VAI SYLLABLE THE"/* A5F4 */,/*15735*/"VAI SYLLABLE DHE"/* A5F5 */, /*15736*/"VAI SYLLABLE DHHE"/* A5F6 */,/*15737*/"VAI SYLLABLE LE"/* A5F7 */,/*15738*/"VAI SYLLABLE RE"/* A5F8 */, /*15739*/"VAI SYLLABLE DE"/* A5F9 */,/*15740*/"VAI SYLLABLE NDE"/* A5FA */,/*15741*/"VAI SYLLABLE SE"/* A5FB */, /*15742*/"VAI SYLLABLE SHE"/* A5FC */,/*15743*/"VAI SYLLABLE ZE"/* A5FD */,/*15744*/"VAI SYLLABLE ZHE"/* A5FE */, /*15745*/"VAI SYLLABLE CE"/* A5FF */,/*15746*/"VAI SYLLABLE JE"/* A600 */,/*15747*/"VAI SYLLABLE NJE"/* A601 */, /*15748*/"VAI SYLLABLE YE"/* A602 */,/*15749*/"VAI SYLLABLE KE"/* A603 */,/*15750*/"VAI SYLLABLE NGGE"/* A604 */, /*15751*/"VAI SYLLABLE NGGEN"/* A605 */,/*15752*/"VAI SYLLABLE GE"/* A606 */,/*15753*/"VAI SYLLABLE GEN"/* A607 */, /*15754*/"VAI SYLLABLE ME"/* A608 */,/*15755*/"VAI SYLLABLE NE"/* A609 */,/*15756*/"VAI SYLLABLE NYE"/* A60A */, /*15757*/"VAI SYLLABLE NG"/* A60B */,/*15758*/"VAI SYLLABLE LENGTHENER"/* A60C */,/*15759*/"VAI COMMA"/* A60D */, /*15760*/"VAI FULL STOP"/* A60E */,/*15761*/"VAI QUESTION MARK"/* A60F */,/*15762*/"VAI SYLLABLE NDOLE FA"/* A610 */, /*15763*/"VAI SYLLABLE NDOLE KA"/* A611 */,/*15764*/"VAI SYLLABLE NDOLE SOO"/* A612 */, /*15765*/"VAI SYMBOL FEENG"/* A613 */,/*15766*/"VAI SYMBOL KEENG"/* A614 */,/*15767*/"VAI SYMBOL TING"/* A615 */, /*15768*/"VAI SYMBOL NII"/* A616 */,/*15769*/"VAI SYMBOL BANG"/* A617 */,/*15770*/"VAI SYMBOL FAA"/* A618 */, /*15771*/"VAI SYMBOL TAA"/* A619 */,/*15772*/"VAI SYMBOL DANG"/* A61A */,/*15773*/"VAI SYMBOL DOONG"/* A61B */, /*15774*/"VAI SYMBOL KUNG"/* A61C */,/*15775*/"VAI SYMBOL TONG"/* A61D */,/*15776*/"VAI SYMBOL DO-O"/* A61E */, /*15777*/"VAI SYMBOL JONG"/* A61F */,/*15778*/"VAI DIGIT ZERO"/* A620 */,/*15779*/"VAI DIGIT ONE"/* A621 */, /*15780*/"VAI DIGIT TWO"/* A622 */,/*15781*/"VAI DIGIT THREE"/* A623 */,/*15782*/"VAI DIGIT FOUR"/* A624 */, /*15783*/"VAI DIGIT FIVE"/* A625 */,/*15784*/"VAI DIGIT SIX"/* A626 */,/*15785*/"VAI DIGIT SEVEN"/* A627 */, /*15786*/"VAI DIGIT EIGHT"/* A628 */,/*15787*/"VAI DIGIT NINE"/* A629 */,/*15788*/"VAI SYLLABLE NDOLE MA"/* A62A */, /*15789*/"VAI SYLLABLE NDOLE DO"/* A62B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*15810*/"CYRILLIC CAPITAL LETTER ZEMLYA"/* A640 */, /*15811*/"CYRILLIC SMALL LETTER ZEMLYA"/* A641 */,/*15812*/"CYRILLIC CAPITAL LETTER DZELO"/* A642 */, /*15813*/"CYRILLIC SMALL LETTER DZELO"/* A643 */,/*15814*/"CYRILLIC CAPITAL LETTER REVERSED DZE"/* A644 */, /*15815*/"CYRILLIC SMALL LETTER REVERSED DZE"/* A645 */,/*15816*/"CYRILLIC CAPITAL LETTER IOTA"/* A646 */, /*15817*/"CYRILLIC SMALL LETTER IOTA"/* A647 */,/*15818*/"CYRILLIC CAPITAL LETTER DJERV"/* A648 */, /*15819*/"CYRILLIC SMALL LETTER DJERV"/* A649 */,/*15820*/"CYRILLIC CAPITAL LETTER MONOGRAPH UK"/* A64A */, /*15821*/"CYRILLIC SMALL LETTER MONOGRAPH UK"/* A64B */,/*15822*/"CYRILLIC CAPITAL LETTER BROAD OMEGA"/* A64C */, /*15823*/"CYRILLIC SMALL LETTER BROAD OMEGA"/* A64D */,/*15824*/"CYRILLIC CAPITAL LETTER NEUTRAL YER"/* A64E */, /*15825*/"CYRILLIC SMALL LETTER NEUTRAL YER"/* A64F */,/*15826*/"CYRILLIC CAPITAL LETTER YERU WITH BACK YER"/* A650 */, /*15827*/"CYRILLIC SMALL LETTER YERU WITH BACK YER"/* A651 */,/*15828*/"CYRILLIC CAPITAL LETTER IOTIFIED YAT"/* A652 */, /*15829*/"CYRILLIC SMALL LETTER IOTIFIED YAT"/* A653 */,/*15830*/"CYRILLIC CAPITAL LETTER REVERSED YU"/* A654 */, /*15831*/"CYRILLIC SMALL LETTER REVERSED YU"/* A655 */,/*15832*/"CYRILLIC CAPITAL LETTER IOTIFIED A"/* A656 */, /*15833*/"CYRILLIC SMALL LETTER IOTIFIED A"/* A657 */,/*15834*/"CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS"/* A658 */, /*15835*/"CYRILLIC SMALL LETTER CLOSED LITTLE YUS"/* A659 */,/*15836*/"CYRILLIC CAPITAL LETTER BLENDED YUS"/* A65A */, /*15837*/"CYRILLIC SMALL LETTER BLENDED YUS"/* A65B */, /*15838*/"CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS"/* A65C */, /*15839*/"CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS"/* A65D */,/*15840*/"CYRILLIC CAPITAL LETTER YN"/* A65E */, /*15841*/"CYRILLIC SMALL LETTER YN"/* A65F */,/*15842*/"CYRILLIC CAPITAL LETTER REVERSED TSE"/* A660 */, /*15843*/"CYRILLIC SMALL LETTER REVERSED TSE"/* A661 */,/*15844*/"CYRILLIC CAPITAL LETTER SOFT DE"/* A662 */, /*15845*/"CYRILLIC SMALL LETTER SOFT DE"/* A663 */,/*15846*/"CYRILLIC CAPITAL LETTER SOFT EL"/* A664 */, /*15847*/"CYRILLIC SMALL LETTER SOFT EL"/* A665 */,/*15848*/"CYRILLIC CAPITAL LETTER SOFT EM"/* A666 */, /*15849*/"CYRILLIC SMALL LETTER SOFT EM"/* A667 */,/*15850*/"CYRILLIC CAPITAL LETTER MONOCULAR O"/* A668 */, /*15851*/"CYRILLIC SMALL LETTER MONOCULAR O"/* A669 */,/*15852*/"CYRILLIC CAPITAL LETTER BINOCULAR O"/* A66A */, /*15853*/"CYRILLIC SMALL LETTER BINOCULAR O"/* A66B */,/*15854*/"CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O"/* A66C */, /*15855*/"CYRILLIC SMALL LETTER DOUBLE MONOCULAR O"/* A66D */,/*15856*/"CYRILLIC LETTER MULTIOCULAR O"/* A66E */, /*15857*/"COMBINING CYRILLIC VZMET"/* A66F */,/*15858*/"COMBINING CYRILLIC TEN MILLIONS SIGN"/* A670 */, /*15859*/"COMBINING CYRILLIC HUNDRED MILLIONS SIGN"/* A671 */, /*15860*/"COMBINING CYRILLIC THOUSAND MILLIONS SIGN"/* A672 */,/*15861*/"SLAVONIC ASTERISK"/* A673 */, /*15862*/"COMBINING CYRILLIC LETTER UKRAINIAN IE"/* A674 */,/*15863*/"COMBINING CYRILLIC LETTER I"/* A675 */, /*15864*/"COMBINING CYRILLIC LETTER YI"/* A676 */,/*15865*/"COMBINING CYRILLIC LETTER U"/* A677 */, /*15866*/"COMBINING CYRILLIC LETTER HARD SIGN"/* A678 */,/*15867*/"COMBINING CYRILLIC LETTER YERU"/* A679 */, /*15868*/"COMBINING CYRILLIC LETTER SOFT SIGN"/* A67A */,/*15869*/"COMBINING CYRILLIC LETTER OMEGA"/* A67B */, /*15870*/"COMBINING CYRILLIC KAVYKA"/* A67C */,/*15871*/"COMBINING CYRILLIC PAYEROK"/* A67D */, /*15872*/"CYRILLIC KAVYKA"/* A67E */,/*15873*/"CYRILLIC PAYEROK"/* A67F */, /*15874*/"CYRILLIC CAPITAL LETTER DWE"/* A680 */,/*15875*/"CYRILLIC SMALL LETTER DWE"/* A681 */, /*15876*/"CYRILLIC CAPITAL LETTER DZWE"/* A682 */,/*15877*/"CYRILLIC SMALL LETTER DZWE"/* A683 */, /*15878*/"CYRILLIC CAPITAL LETTER ZHWE"/* A684 */,/*15879*/"CYRILLIC SMALL LETTER ZHWE"/* A685 */, /*15880*/"CYRILLIC CAPITAL LETTER CCHE"/* A686 */,/*15881*/"CYRILLIC SMALL LETTER CCHE"/* A687 */, /*15882*/"CYRILLIC CAPITAL LETTER DZZE"/* A688 */,/*15883*/"CYRILLIC SMALL LETTER DZZE"/* A689 */, /*15884*/"CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK"/* A68A */, /*15885*/"CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK"/* A68B */,/*15886*/"CYRILLIC CAPITAL LETTER TWE"/* A68C */, /*15887*/"CYRILLIC SMALL LETTER TWE"/* A68D */,/*15888*/"CYRILLIC CAPITAL LETTER TSWE"/* A68E */, /*15889*/"CYRILLIC SMALL LETTER TSWE"/* A68F */,/*15890*/"CYRILLIC CAPITAL LETTER TSSE"/* A690 */, /*15891*/"CYRILLIC SMALL LETTER TSSE"/* A691 */,/*15892*/"CYRILLIC CAPITAL LETTER TCHE"/* A692 */, /*15893*/"CYRILLIC SMALL LETTER TCHE"/* A693 */,/*15894*/"CYRILLIC CAPITAL LETTER HWE"/* A694 */, /*15895*/"CYRILLIC SMALL LETTER HWE"/* A695 */,/*15896*/"CYRILLIC CAPITAL LETTER SHWE"/* A696 */, /*15897*/"CYRILLIC SMALL LETTER SHWE"/* A697 */,/*15898*/"CYRILLIC CAPITAL LETTER DOUBLE O"/* A698 */, /*15899*/"CYRILLIC SMALL LETTER DOUBLE O"/* A699 */,/*15900*/"CYRILLIC CAPITAL LETTER CROSSED O"/* A69A */, /*15901*/"CYRILLIC SMALL LETTER CROSSED O"/* A69B */,/*15902*/"MODIFIER LETTER CYRILLIC HARD SIGN"/* A69C */, /*15903*/"MODIFIER LETTER CYRILLIC SOFT SIGN"/* A69D */,/*15904*/"COMBINING CYRILLIC LETTER EF"/* A69E */, /*15905*/"COMBINING CYRILLIC LETTER IOTIFIED E"/* A69F */,/*15906*/"BAMUM LETTER A"/* A6A0 */, /*15907*/"BAMUM LETTER KA"/* A6A1 */,/*15908*/"BAMUM LETTER U"/* A6A2 */,/*15909*/"BAMUM LETTER KU"/* A6A3 */, /*15910*/"BAMUM LETTER EE"/* A6A4 */,/*15911*/"BAMUM LETTER REE"/* A6A5 */,/*15912*/"BAMUM LETTER TAE"/* A6A6 */, /*15913*/"BAMUM LETTER O"/* A6A7 */,/*15914*/"BAMUM LETTER NYI"/* A6A8 */,/*15915*/"BAMUM LETTER I"/* A6A9 */, /*15916*/"BAMUM LETTER LA"/* A6AA */,/*15917*/"BAMUM LETTER PA"/* A6AB */,/*15918*/"BAMUM LETTER RII"/* A6AC */, /*15919*/"BAMUM LETTER RIEE"/* A6AD */,/*15920*/"BAMUM LETTER LEEEE"/* A6AE */,/*15921*/"BAMUM LETTER MEEEE"/* A6AF */, /*15922*/"BAMUM LETTER TAA"/* A6B0 */,/*15923*/"BAMUM LETTER NDAA"/* A6B1 */,/*15924*/"BAMUM LETTER NJAEM"/* A6B2 */, /*15925*/"BAMUM LETTER M"/* A6B3 */,/*15926*/"BAMUM LETTER SUU"/* A6B4 */,/*15927*/"BAMUM LETTER MU"/* A6B5 */, /*15928*/"BAMUM LETTER SHII"/* A6B6 */,/*15929*/"BAMUM LETTER SI"/* A6B7 */,/*15930*/"BAMUM LETTER SHEUX"/* A6B8 */, /*15931*/"BAMUM LETTER SEUX"/* A6B9 */,/*15932*/"BAMUM LETTER KYEE"/* A6BA */,/*15933*/"BAMUM LETTER KET"/* A6BB */, /*15934*/"BAMUM LETTER NUAE"/* A6BC */,/*15935*/"BAMUM LETTER NU"/* A6BD */,/*15936*/"BAMUM LETTER NJUAE"/* A6BE */, /*15937*/"BAMUM LETTER YOQ"/* A6BF */,/*15938*/"BAMUM LETTER SHU"/* A6C0 */,/*15939*/"BAMUM LETTER YUQ"/* A6C1 */, /*15940*/"BAMUM LETTER YA"/* A6C2 */,/*15941*/"BAMUM LETTER NSHA"/* A6C3 */,/*15942*/"BAMUM LETTER KEUX"/* A6C4 */, /*15943*/"BAMUM LETTER PEUX"/* A6C5 */,/*15944*/"BAMUM LETTER NJEE"/* A6C6 */,/*15945*/"BAMUM LETTER NTEE"/* A6C7 */, /*15946*/"BAMUM LETTER PUE"/* A6C8 */,/*15947*/"BAMUM LETTER WUE"/* A6C9 */,/*15948*/"BAMUM LETTER PEE"/* A6CA */, /*15949*/"BAMUM LETTER FEE"/* A6CB */,/*15950*/"BAMUM LETTER RU"/* A6CC */,/*15951*/"BAMUM LETTER LU"/* A6CD */, /*15952*/"BAMUM LETTER MI"/* A6CE */,/*15953*/"BAMUM LETTER NI"/* A6CF */,/*15954*/"BAMUM LETTER REUX"/* A6D0 */, /*15955*/"BAMUM LETTER RAE"/* A6D1 */,/*15956*/"BAMUM LETTER KEN"/* A6D2 */,/*15957*/"BAMUM LETTER NGKWAEN"/* A6D3 */, /*15958*/"BAMUM LETTER NGGA"/* A6D4 */,/*15959*/"BAMUM LETTER NGA"/* A6D5 */,/*15960*/"BAMUM LETTER SHO"/* A6D6 */, /*15961*/"BAMUM LETTER PUAE"/* A6D7 */,/*15962*/"BAMUM LETTER FU"/* A6D8 */,/*15963*/"BAMUM LETTER FOM"/* A6D9 */, /*15964*/"BAMUM LETTER WA"/* A6DA */,/*15965*/"BAMUM LETTER NA"/* A6DB */,/*15966*/"BAMUM LETTER LI"/* A6DC */, /*15967*/"BAMUM LETTER PI"/* A6DD */,/*15968*/"BAMUM LETTER LOQ"/* A6DE */,/*15969*/"BAMUM LETTER KO"/* A6DF */, /*15970*/"BAMUM LETTER MBEN"/* A6E0 */,/*15971*/"BAMUM LETTER REN"/* A6E1 */,/*15972*/"BAMUM LETTER MEN"/* A6E2 */, /*15973*/"BAMUM LETTER MA"/* A6E3 */,/*15974*/"BAMUM LETTER TI"/* A6E4 */,/*15975*/"BAMUM LETTER KI"/* A6E5 */, /*15976*/"BAMUM LETTER MO"/* A6E6 */,/*15977*/"BAMUM LETTER MBAA"/* A6E7 */,/*15978*/"BAMUM LETTER TET"/* A6E8 */, /*15979*/"BAMUM LETTER KPA"/* A6E9 */,/*15980*/"BAMUM LETTER TEN"/* A6EA */,/*15981*/"BAMUM LETTER NTUU"/* A6EB */, /*15982*/"BAMUM LETTER SAMBA"/* A6EC */,/*15983*/"BAMUM LETTER FAAMAE"/* A6ED */,/*15984*/"BAMUM LETTER KOVUU"/* A6EE */, /*15985*/"BAMUM LETTER KOGHOM"/* A6EF */,/*15986*/"BAMUM COMBINING MARK KOQNDON"/* A6F0 */, /*15987*/"BAMUM COMBINING MARK TUKWENTIS"/* A6F1 */,/*15988*/"BAMUM NJAEMLI"/* A6F2 */, /*15989*/"BAMUM FULL STOP"/* A6F3 */,/*15990*/"BAMUM COLON"/* A6F4 */,/*15991*/"BAMUM COMMA"/* A6F5 */, /*15992*/"BAMUM SEMICOLON"/* A6F6 */,/*15993*/"BAMUM QUESTION MARK"/* A6F7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16002*/"MODIFIER LETTER CHINESE TONE YIN PING"/* A700 */,/*16003*/"MODIFIER LETTER CHINESE TONE YANG PING"/* A701 */, /*16004*/"MODIFIER LETTER CHINESE TONE YIN SHANG"/* A702 */,/*16005*/"MODIFIER LETTER CHINESE TONE YANG SHANG"/* A703 */, /*16006*/"MODIFIER LETTER CHINESE TONE YIN QU"/* A704 */,/*16007*/"MODIFIER LETTER CHINESE TONE YANG QU"/* A705 */, /*16008*/"MODIFIER LETTER CHINESE TONE YIN RU"/* A706 */,/*16009*/"MODIFIER LETTER CHINESE TONE YANG RU"/* A707 */, /*16010*/"MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR"/* A708 */, /*16011*/"MODIFIER LETTER HIGH DOTTED TONE BAR"/* A709 */,/*16012*/"MODIFIER LETTER MID DOTTED TONE BAR"/* A70A */, /*16013*/"MODIFIER LETTER LOW DOTTED TONE BAR"/* A70B */,/*16014*/"MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR"/* A70C */, /*16015*/"MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR"/* A70D */, /*16016*/"MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR"/* A70E */, /*16017*/"MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR"/* A70F */, /*16018*/"MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR"/* A710 */, /*16019*/"MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR"/* A711 */, /*16020*/"MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR"/* A712 */, /*16021*/"MODIFIER LETTER HIGH LEFT-STEM TONE BAR"/* A713 */,/*16022*/"MODIFIER LETTER MID LEFT-STEM TONE BAR"/* A714 */, /*16023*/"MODIFIER LETTER LOW LEFT-STEM TONE BAR"/* A715 */, /*16024*/"MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR"/* A716 */,/*16025*/"MODIFIER LETTER DOT VERTICAL BAR"/* A717 */, /*16026*/"MODIFIER LETTER DOT SLASH"/* A718 */,/*16027*/"MODIFIER LETTER DOT HORIZONTAL BAR"/* A719 */, /*16028*/"MODIFIER LETTER LOWER RIGHT CORNER ANGLE"/* A71A */,/*16029*/"MODIFIER LETTER RAISED UP ARROW"/* A71B */, /*16030*/"MODIFIER LETTER RAISED DOWN ARROW"/* A71C */,/*16031*/"MODIFIER LETTER RAISED EXCLAMATION MARK"/* A71D */, /*16032*/"MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK"/* A71E */, /*16033*/"MODIFIER LETTER LOW INVERTED EXCLAMATION MARK"/* A71F */, /*16034*/"MODIFIER LETTER STRESS AND HIGH TONE"/* A720 */,/*16035*/"MODIFIER LETTER STRESS AND LOW TONE"/* A721 */, /*16036*/"LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF"/* A722 */,/*16037*/"LATIN SMALL LETTER EGYPTOLOGICAL ALEF"/* A723 */, /*16038*/"LATIN CAPITAL LETTER EGYPTOLOGICAL AIN"/* A724 */,/*16039*/"LATIN SMALL LETTER EGYPTOLOGICAL AIN"/* A725 */, /*16040*/"LATIN CAPITAL LETTER HENG"/* A726 */,/*16041*/"LATIN SMALL LETTER HENG"/* A727 */, /*16042*/"LATIN CAPITAL LETTER TZ"/* A728 */,/*16043*/"LATIN SMALL LETTER TZ"/* A729 */, /*16044*/"LATIN CAPITAL LETTER TRESILLO"/* A72A */,/*16045*/"LATIN SMALL LETTER TRESILLO"/* A72B */, /*16046*/"LATIN CAPITAL LETTER CUATRILLO"/* A72C */,/*16047*/"LATIN SMALL LETTER CUATRILLO"/* A72D */, /*16048*/"LATIN CAPITAL LETTER CUATRILLO WITH COMMA"/* A72E */, /*16049*/"LATIN SMALL LETTER CUATRILLO WITH COMMA"/* A72F */,/*16050*/"LATIN LETTER SMALL CAPITAL F"/* A730 */, /*16051*/"LATIN LETTER SMALL CAPITAL S"/* A731 */,/*16052*/"LATIN CAPITAL LETTER AA"/* A732 */, /*16053*/"LATIN SMALL LETTER AA"/* A733 */,/*16054*/"LATIN CAPITAL LETTER AO"/* A734 */, /*16055*/"LATIN SMALL LETTER AO"/* A735 */,/*16056*/"LATIN CAPITAL LETTER AU"/* A736 */, /*16057*/"LATIN SMALL LETTER AU"/* A737 */,/*16058*/"LATIN CAPITAL LETTER AV"/* A738 */, /*16059*/"LATIN SMALL LETTER AV"/* A739 */,/*16060*/"LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR"/* A73A */, /*16061*/"LATIN SMALL LETTER AV WITH HORIZONTAL BAR"/* A73B */,/*16062*/"LATIN CAPITAL LETTER AY"/* A73C */, /*16063*/"LATIN SMALL LETTER AY"/* A73D */,/*16064*/"LATIN CAPITAL LETTER REVERSED C WITH DOT"/* A73E */, /*16065*/"LATIN SMALL LETTER REVERSED C WITH DOT"/* A73F */,/*16066*/"LATIN CAPITAL LETTER K WITH STROKE"/* A740 */, /*16067*/"LATIN SMALL LETTER K WITH STROKE"/* A741 */,/*16068*/"LATIN CAPITAL LETTER K WITH DIAGONAL STROKE"/* A742 */, /*16069*/"LATIN SMALL LETTER K WITH DIAGONAL STROKE"/* A743 */, /*16070*/"LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE"/* A744 */, /*16071*/"LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE"/* A745 */, /*16072*/"LATIN CAPITAL LETTER BROKEN L"/* A746 */,/*16073*/"LATIN SMALL LETTER BROKEN L"/* A747 */, /*16074*/"LATIN CAPITAL LETTER L WITH HIGH STROKE"/* A748 */,/*16075*/"LATIN SMALL LETTER L WITH HIGH STROKE"/* A749 */, /*16076*/"LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY"/* A74A */, /*16077*/"LATIN SMALL LETTER O WITH LONG STROKE OVERLAY"/* A74B */,/*16078*/"LATIN CAPITAL LETTER O WITH LOOP"/* A74C */, /*16079*/"LATIN SMALL LETTER O WITH LOOP"/* A74D */,/*16080*/"LATIN CAPITAL LETTER OO"/* A74E */, /*16081*/"LATIN SMALL LETTER OO"/* A74F */,/*16082*/"LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER"/* A750 */, /*16083*/"LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER"/* A751 */, /*16084*/"LATIN CAPITAL LETTER P WITH FLOURISH"/* A752 */,/*16085*/"LATIN SMALL LETTER P WITH FLOURISH"/* A753 */, /*16086*/"LATIN CAPITAL LETTER P WITH SQUIRREL TAIL"/* A754 */, /*16087*/"LATIN SMALL LETTER P WITH SQUIRREL TAIL"/* A755 */, /*16088*/"LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER"/* A756 */, /*16089*/"LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER"/* A757 */, /*16090*/"LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE"/* A758 */, /*16091*/"LATIN SMALL LETTER Q WITH DIAGONAL STROKE"/* A759 */,/*16092*/"LATIN CAPITAL LETTER R ROTUNDA"/* A75A */, /*16093*/"LATIN SMALL LETTER R ROTUNDA"/* A75B */,/*16094*/"LATIN CAPITAL LETTER RUM ROTUNDA"/* A75C */, /*16095*/"LATIN SMALL LETTER RUM ROTUNDA"/* A75D */,/*16096*/"LATIN CAPITAL LETTER V WITH DIAGONAL STROKE"/* A75E */, /*16097*/"LATIN SMALL LETTER V WITH DIAGONAL STROKE"/* A75F */,/*16098*/"LATIN CAPITAL LETTER VY"/* A760 */, /*16099*/"LATIN SMALL LETTER VY"/* A761 */,/*16100*/"LATIN CAPITAL LETTER VISIGOTHIC Z"/* A762 */, /*16101*/"LATIN SMALL LETTER VISIGOTHIC Z"/* A763 */,/*16102*/"LATIN CAPITAL LETTER THORN WITH STROKE"/* A764 */, /*16103*/"LATIN SMALL LETTER THORN WITH STROKE"/* A765 */, /*16104*/"LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER"/* A766 */, /*16105*/"LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER"/* A767 */, /*16106*/"LATIN CAPITAL LETTER VEND"/* A768 */,/*16107*/"LATIN SMALL LETTER VEND"/* A769 */, /*16108*/"LATIN CAPITAL LETTER ET"/* A76A */,/*16109*/"LATIN SMALL LETTER ET"/* A76B */, /*16110*/"LATIN CAPITAL LETTER IS"/* A76C */,/*16111*/"LATIN SMALL LETTER IS"/* A76D */, /*16112*/"LATIN CAPITAL LETTER CON"/* A76E */,/*16113*/"LATIN SMALL LETTER CON"/* A76F */, /*16114*/"MODIFIER LETTER US"/* A770 */,/*16115*/"LATIN SMALL LETTER DUM"/* A771 */, /*16116*/"LATIN SMALL LETTER LUM"/* A772 */,/*16117*/"LATIN SMALL LETTER MUM"/* A773 */, /*16118*/"LATIN SMALL LETTER NUM"/* A774 */,/*16119*/"LATIN SMALL LETTER RUM"/* A775 */, /*16120*/"LATIN LETTER SMALL CAPITAL RUM"/* A776 */,/*16121*/"LATIN SMALL LETTER TUM"/* A777 */, /*16122*/"LATIN SMALL LETTER UM"/* A778 */,/*16123*/"LATIN CAPITAL LETTER INSULAR D"/* A779 */, /*16124*/"LATIN SMALL LETTER INSULAR D"/* A77A */,/*16125*/"LATIN CAPITAL LETTER INSULAR F"/* A77B */, /*16126*/"LATIN SMALL LETTER INSULAR F"/* A77C */,/*16127*/"LATIN CAPITAL LETTER INSULAR G"/* A77D */, /*16128*/"LATIN CAPITAL LETTER TURNED INSULAR G"/* A77E */,/*16129*/"LATIN SMALL LETTER TURNED INSULAR G"/* A77F */, /*16130*/"LATIN CAPITAL LETTER TURNED L"/* A780 */,/*16131*/"LATIN SMALL LETTER TURNED L"/* A781 */, /*16132*/"LATIN CAPITAL LETTER INSULAR R"/* A782 */,/*16133*/"LATIN SMALL LETTER INSULAR R"/* A783 */, /*16134*/"LATIN CAPITAL LETTER INSULAR S"/* A784 */,/*16135*/"LATIN SMALL LETTER INSULAR S"/* A785 */, /*16136*/"LATIN CAPITAL LETTER INSULAR T"/* A786 */,/*16137*/"LATIN SMALL LETTER INSULAR T"/* A787 */, /*16138*/"MODIFIER LETTER LOW CIRCUMFLEX ACCENT"/* A788 */,/*16139*/"MODIFIER LETTER COLON"/* A789 */, /*16140*/"MODIFIER LETTER SHORT EQUALS SIGN"/* A78A */,/*16141*/"LATIN CAPITAL LETTER SALTILLO"/* A78B */, /*16142*/"LATIN SMALL LETTER SALTILLO"/* A78C */,/*16143*/"LATIN CAPITAL LETTER TURNED H"/* A78D */, /*16144*/"LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT"/* A78E */,/*16145*/"LATIN LETTER SINOLOGICAL DOT"/* A78F */, /*16146*/"LATIN CAPITAL LETTER N WITH DESCENDER"/* A790 */,/*16147*/"LATIN SMALL LETTER N WITH DESCENDER"/* A791 */, /*16148*/"LATIN CAPITAL LETTER C WITH BAR"/* A792 */,/*16149*/"LATIN SMALL LETTER C WITH BAR"/* A793 */, /*16150*/"LATIN SMALL LETTER C WITH PALATAL HOOK"/* A794 */,/*16151*/"LATIN SMALL LETTER H WITH PALATAL HOOK"/* A795 */, /*16152*/"LATIN CAPITAL LETTER B WITH FLOURISH"/* A796 */,/*16153*/"LATIN SMALL LETTER B WITH FLOURISH"/* A797 */, /*16154*/"LATIN CAPITAL LETTER F WITH STROKE"/* A798 */,/*16155*/"LATIN SMALL LETTER F WITH STROKE"/* A799 */, /*16156*/"LATIN CAPITAL LETTER VOLAPUK AE"/* A79A */,/*16157*/"LATIN SMALL LETTER VOLAPUK AE"/* A79B */, /*16158*/"LATIN CAPITAL LETTER VOLAPUK OE"/* A79C */,/*16159*/"LATIN SMALL LETTER VOLAPUK OE"/* A79D */, /*16160*/"LATIN CAPITAL LETTER VOLAPUK UE"/* A79E */,/*16161*/"LATIN SMALL LETTER VOLAPUK UE"/* A79F */, /*16162*/"LATIN CAPITAL LETTER G WITH OBLIQUE STROKE"/* A7A0 */, /*16163*/"LATIN SMALL LETTER G WITH OBLIQUE STROKE"/* A7A1 */, /*16164*/"LATIN CAPITAL LETTER K WITH OBLIQUE STROKE"/* A7A2 */, /*16165*/"LATIN SMALL LETTER K WITH OBLIQUE STROKE"/* A7A3 */, /*16166*/"LATIN CAPITAL LETTER N WITH OBLIQUE STROKE"/* A7A4 */, /*16167*/"LATIN SMALL LETTER N WITH OBLIQUE STROKE"/* A7A5 */, /*16168*/"LATIN CAPITAL LETTER R WITH OBLIQUE STROKE"/* A7A6 */, /*16169*/"LATIN SMALL LETTER R WITH OBLIQUE STROKE"/* A7A7 */, /*16170*/"LATIN CAPITAL LETTER S WITH OBLIQUE STROKE"/* A7A8 */, /*16171*/"LATIN SMALL LETTER S WITH OBLIQUE STROKE"/* A7A9 */,/*16172*/"LATIN CAPITAL LETTER H WITH HOOK"/* A7AA */, /*16173*/"LATIN CAPITAL LETTER REVERSED OPEN E"/* A7AB */,/*16174*/"LATIN CAPITAL LETTER SCRIPT G"/* A7AC */, /*16175*/"LATIN CAPITAL LETTER L WITH BELT"/* A7AD */,NULL,NULL,/*16178*/"LATIN CAPITAL LETTER TURNED K"/* A7B0 */, /*16179*/"LATIN CAPITAL LETTER TURNED T"/* A7B1 */,/*16180*/"LATIN CAPITAL LETTER J WITH CROSSED-TAIL"/* A7B2 */, /*16181*/"LATIN CAPITAL LETTER CHI"/* A7B3 */,/*16182*/"LATIN CAPITAL LETTER BETA"/* A7B4 */, /*16183*/"LATIN SMALL LETTER BETA"/* A7B5 */,/*16184*/"LATIN CAPITAL LETTER OMEGA"/* A7B6 */, /*16185*/"LATIN SMALL LETTER OMEGA"/* A7B7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16249*/"LATIN EPIGRAPHIC LETTER SIDEWAYS I"/* A7F7 */,/*16250*/"MODIFIER LETTER CAPITAL H WITH STROKE"/* A7F8 */, /*16251*/"MODIFIER LETTER SMALL LIGATURE OE"/* A7F9 */,/*16252*/"LATIN LETTER SMALL CAPITAL TURNED M"/* A7FA */, /*16253*/"LATIN EPIGRAPHIC LETTER REVERSED F"/* A7FB */,/*16254*/"LATIN EPIGRAPHIC LETTER REVERSED P"/* A7FC */, /*16255*/"LATIN EPIGRAPHIC LETTER INVERTED M"/* A7FD */,/*16256*/"LATIN EPIGRAPHIC LETTER I LONGA"/* A7FE */, /*16257*/"LATIN EPIGRAPHIC LETTER ARCHAIC M"/* A7FF */,/*16258*/"SYLOTI NAGRI LETTER A"/* A800 */, /*16259*/"SYLOTI NAGRI LETTER I"/* A801 */,/*16260*/"SYLOTI NAGRI SIGN DVISVARA"/* A802 */, /*16261*/"SYLOTI NAGRI LETTER U"/* A803 */,/*16262*/"SYLOTI NAGRI LETTER E"/* A804 */, /*16263*/"SYLOTI NAGRI LETTER O"/* A805 */,/*16264*/"SYLOTI NAGRI SIGN HASANTA"/* A806 */, /*16265*/"SYLOTI NAGRI LETTER KO"/* A807 */,/*16266*/"SYLOTI NAGRI LETTER KHO"/* A808 */, /*16267*/"SYLOTI NAGRI LETTER GO"/* A809 */,/*16268*/"SYLOTI NAGRI LETTER GHO"/* A80A */, /*16269*/"SYLOTI NAGRI SIGN ANUSVARA"/* A80B */,/*16270*/"SYLOTI NAGRI LETTER CO"/* A80C */, /*16271*/"SYLOTI NAGRI LETTER CHO"/* A80D */,/*16272*/"SYLOTI NAGRI LETTER JO"/* A80E */, /*16273*/"SYLOTI NAGRI LETTER JHO"/* A80F */,/*16274*/"SYLOTI NAGRI LETTER TTO"/* A810 */, /*16275*/"SYLOTI NAGRI LETTER TTHO"/* A811 */,/*16276*/"SYLOTI NAGRI LETTER DDO"/* A812 */, /*16277*/"SYLOTI NAGRI LETTER DDHO"/* A813 */,/*16278*/"SYLOTI NAGRI LETTER TO"/* A814 */, /*16279*/"SYLOTI NAGRI LETTER THO"/* A815 */,/*16280*/"SYLOTI NAGRI LETTER DO"/* A816 */, /*16281*/"SYLOTI NAGRI LETTER DHO"/* A817 */,/*16282*/"SYLOTI NAGRI LETTER NO"/* A818 */, /*16283*/"SYLOTI NAGRI LETTER PO"/* A819 */,/*16284*/"SYLOTI NAGRI LETTER PHO"/* A81A */, /*16285*/"SYLOTI NAGRI LETTER BO"/* A81B */,/*16286*/"SYLOTI NAGRI LETTER BHO"/* A81C */, /*16287*/"SYLOTI NAGRI LETTER MO"/* A81D */,/*16288*/"SYLOTI NAGRI LETTER RO"/* A81E */, /*16289*/"SYLOTI NAGRI LETTER LO"/* A81F */,/*16290*/"SYLOTI NAGRI LETTER RRO"/* A820 */, /*16291*/"SYLOTI NAGRI LETTER SO"/* A821 */,/*16292*/"SYLOTI NAGRI LETTER HO"/* A822 */, /*16293*/"SYLOTI NAGRI VOWEL SIGN A"/* A823 */,/*16294*/"SYLOTI NAGRI VOWEL SIGN I"/* A824 */, /*16295*/"SYLOTI NAGRI VOWEL SIGN U"/* A825 */,/*16296*/"SYLOTI NAGRI VOWEL SIGN E"/* A826 */, /*16297*/"SYLOTI NAGRI VOWEL SIGN OO"/* A827 */,/*16298*/"SYLOTI NAGRI POETRY MARK-1"/* A828 */, /*16299*/"SYLOTI NAGRI POETRY MARK-2"/* A829 */,/*16300*/"SYLOTI NAGRI POETRY MARK-3"/* A82A */, /*16301*/"SYLOTI NAGRI POETRY MARK-4"/* A82B */,NULL,NULL,NULL,NULL, /*16306*/"NORTH INDIC FRACTION ONE QUARTER"/* A830 */,/*16307*/"NORTH INDIC FRACTION ONE HALF"/* A831 */, /*16308*/"NORTH INDIC FRACTION THREE QUARTERS"/* A832 */,/*16309*/"NORTH INDIC FRACTION ONE SIXTEENTH"/* A833 */, /*16310*/"NORTH INDIC FRACTION ONE EIGHTH"/* A834 */,/*16311*/"NORTH INDIC FRACTION THREE SIXTEENTHS"/* A835 */, /*16312*/"NORTH INDIC QUARTER MARK"/* A836 */,/*16313*/"NORTH INDIC PLACEHOLDER MARK"/* A837 */, /*16314*/"NORTH INDIC RUPEE MARK"/* A838 */,/*16315*/"NORTH INDIC QUANTITY MARK"/* A839 */,NULL,NULL,NULL,NULL,NULL,NULL, /*16322*/"PHAGS-PA LETTER KA"/* A840 */,/*16323*/"PHAGS-PA LETTER KHA"/* A841 */,/*16324*/"PHAGS-PA LETTER GA"/* A842 */, /*16325*/"PHAGS-PA LETTER NGA"/* A843 */,/*16326*/"PHAGS-PA LETTER CA"/* A844 */, /*16327*/"PHAGS-PA LETTER CHA"/* A845 */,/*16328*/"PHAGS-PA LETTER JA"/* A846 */, /*16329*/"PHAGS-PA LETTER NYA"/* A847 */,/*16330*/"PHAGS-PA LETTER TA"/* A848 */, /*16331*/"PHAGS-PA LETTER THA"/* A849 */,/*16332*/"PHAGS-PA LETTER DA"/* A84A */,/*16333*/"PHAGS-PA LETTER NA"/* A84B */, /*16334*/"PHAGS-PA LETTER PA"/* A84C */,/*16335*/"PHAGS-PA LETTER PHA"/* A84D */,/*16336*/"PHAGS-PA LETTER BA"/* A84E */, /*16337*/"PHAGS-PA LETTER MA"/* A84F */,/*16338*/"PHAGS-PA LETTER TSA"/* A850 */, /*16339*/"PHAGS-PA LETTER TSHA"/* A851 */,/*16340*/"PHAGS-PA LETTER DZA"/* A852 */, /*16341*/"PHAGS-PA LETTER WA"/* A853 */,/*16342*/"PHAGS-PA LETTER ZHA"/* A854 */,/*16343*/"PHAGS-PA LETTER ZA"/* A855 */, /*16344*/"PHAGS-PA LETTER SMALL A"/* A856 */,/*16345*/"PHAGS-PA LETTER YA"/* A857 */, /*16346*/"PHAGS-PA LETTER RA"/* A858 */,/*16347*/"PHAGS-PA LETTER LA"/* A859 */,/*16348*/"PHAGS-PA LETTER SHA"/* A85A */, /*16349*/"PHAGS-PA LETTER SA"/* A85B */,/*16350*/"PHAGS-PA LETTER HA"/* A85C */,/*16351*/"PHAGS-PA LETTER A"/* A85D */, /*16352*/"PHAGS-PA LETTER I"/* A85E */,/*16353*/"PHAGS-PA LETTER U"/* A85F */,/*16354*/"PHAGS-PA LETTER E"/* A860 */, /*16355*/"PHAGS-PA LETTER O"/* A861 */,/*16356*/"PHAGS-PA LETTER QA"/* A862 */,/*16357*/"PHAGS-PA LETTER XA"/* A863 */, /*16358*/"PHAGS-PA LETTER FA"/* A864 */,/*16359*/"PHAGS-PA LETTER GGA"/* A865 */,/*16360*/"PHAGS-PA LETTER EE"/* A866 */, /*16361*/"PHAGS-PA SUBJOINED LETTER WA"/* A867 */,/*16362*/"PHAGS-PA SUBJOINED LETTER YA"/* A868 */, /*16363*/"PHAGS-PA LETTER TTA"/* A869 */,/*16364*/"PHAGS-PA LETTER TTHA"/* A86A */, /*16365*/"PHAGS-PA LETTER DDA"/* A86B */,/*16366*/"PHAGS-PA LETTER NNA"/* A86C */, /*16367*/"PHAGS-PA LETTER ALTERNATE YA"/* A86D */,/*16368*/"PHAGS-PA LETTER VOICELESS SHA"/* A86E */, /*16369*/"PHAGS-PA LETTER VOICED HA"/* A86F */,/*16370*/"PHAGS-PA LETTER ASPIRATED FA"/* A870 */, /*16371*/"PHAGS-PA SUBJOINED LETTER RA"/* A871 */,/*16372*/"PHAGS-PA SUPERFIXED LETTER RA"/* A872 */, /*16373*/"PHAGS-PA LETTER CANDRABINDU"/* A873 */,/*16374*/"PHAGS-PA SINGLE HEAD MARK"/* A874 */, /*16375*/"PHAGS-PA DOUBLE HEAD MARK"/* A875 */,/*16376*/"PHAGS-PA MARK SHAD"/* A876 */, /*16377*/"PHAGS-PA MARK DOUBLE SHAD"/* A877 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16386*/"SAURASHTRA SIGN ANUSVARA"/* A880 */,/*16387*/"SAURASHTRA SIGN VISARGA"/* A881 */, /*16388*/"SAURASHTRA LETTER A"/* A882 */,/*16389*/"SAURASHTRA LETTER AA"/* A883 */, /*16390*/"SAURASHTRA LETTER I"/* A884 */,/*16391*/"SAURASHTRA LETTER II"/* A885 */, /*16392*/"SAURASHTRA LETTER U"/* A886 */,/*16393*/"SAURASHTRA LETTER UU"/* A887 */, /*16394*/"SAURASHTRA LETTER VOCALIC R"/* A888 */,/*16395*/"SAURASHTRA LETTER VOCALIC RR"/* A889 */, /*16396*/"SAURASHTRA LETTER VOCALIC L"/* A88A */,/*16397*/"SAURASHTRA LETTER VOCALIC LL"/* A88B */, /*16398*/"SAURASHTRA LETTER E"/* A88C */,/*16399*/"SAURASHTRA LETTER EE"/* A88D */, /*16400*/"SAURASHTRA LETTER AI"/* A88E */,/*16401*/"SAURASHTRA LETTER O"/* A88F */, /*16402*/"SAURASHTRA LETTER OO"/* A890 */,/*16403*/"SAURASHTRA LETTER AU"/* A891 */, /*16404*/"SAURASHTRA LETTER KA"/* A892 */,/*16405*/"SAURASHTRA LETTER KHA"/* A893 */, /*16406*/"SAURASHTRA LETTER GA"/* A894 */,/*16407*/"SAURASHTRA LETTER GHA"/* A895 */, /*16408*/"SAURASHTRA LETTER NGA"/* A896 */,/*16409*/"SAURASHTRA LETTER CA"/* A897 */, /*16410*/"SAURASHTRA LETTER CHA"/* A898 */,/*16411*/"SAURASHTRA LETTER JA"/* A899 */, /*16412*/"SAURASHTRA LETTER JHA"/* A89A */,/*16413*/"SAURASHTRA LETTER NYA"/* A89B */, /*16414*/"SAURASHTRA LETTER TTA"/* A89C */,/*16415*/"SAURASHTRA LETTER TTHA"/* A89D */, /*16416*/"SAURASHTRA LETTER DDA"/* A89E */,/*16417*/"SAURASHTRA LETTER DDHA"/* A89F */, /*16418*/"SAURASHTRA LETTER NNA"/* A8A0 */,/*16419*/"SAURASHTRA LETTER TA"/* A8A1 */, /*16420*/"SAURASHTRA LETTER THA"/* A8A2 */,/*16421*/"SAURASHTRA LETTER DA"/* A8A3 */, /*16422*/"SAURASHTRA LETTER DHA"/* A8A4 */,/*16423*/"SAURASHTRA LETTER NA"/* A8A5 */, /*16424*/"SAURASHTRA LETTER PA"/* A8A6 */,/*16425*/"SAURASHTRA LETTER PHA"/* A8A7 */, /*16426*/"SAURASHTRA LETTER BA"/* A8A8 */,/*16427*/"SAURASHTRA LETTER BHA"/* A8A9 */, /*16428*/"SAURASHTRA LETTER MA"/* A8AA */,/*16429*/"SAURASHTRA LETTER YA"/* A8AB */, /*16430*/"SAURASHTRA LETTER RA"/* A8AC */,/*16431*/"SAURASHTRA LETTER LA"/* A8AD */, /*16432*/"SAURASHTRA LETTER VA"/* A8AE */,/*16433*/"SAURASHTRA LETTER SHA"/* A8AF */, /*16434*/"SAURASHTRA LETTER SSA"/* A8B0 */,/*16435*/"SAURASHTRA LETTER SA"/* A8B1 */, /*16436*/"SAURASHTRA LETTER HA"/* A8B2 */,/*16437*/"SAURASHTRA LETTER LLA"/* A8B3 */, /*16438*/"SAURASHTRA CONSONANT SIGN HAARU"/* A8B4 */,/*16439*/"SAURASHTRA VOWEL SIGN AA"/* A8B5 */, /*16440*/"SAURASHTRA VOWEL SIGN I"/* A8B6 */,/*16441*/"SAURASHTRA VOWEL SIGN II"/* A8B7 */, /*16442*/"SAURASHTRA VOWEL SIGN U"/* A8B8 */,/*16443*/"SAURASHTRA VOWEL SIGN UU"/* A8B9 */, /*16444*/"SAURASHTRA VOWEL SIGN VOCALIC R"/* A8BA */,/*16445*/"SAURASHTRA VOWEL SIGN VOCALIC RR"/* A8BB */, /*16446*/"SAURASHTRA VOWEL SIGN VOCALIC L"/* A8BC */,/*16447*/"SAURASHTRA VOWEL SIGN VOCALIC LL"/* A8BD */, /*16448*/"SAURASHTRA VOWEL SIGN E"/* A8BE */,/*16449*/"SAURASHTRA VOWEL SIGN EE"/* A8BF */, /*16450*/"SAURASHTRA VOWEL SIGN AI"/* A8C0 */,/*16451*/"SAURASHTRA VOWEL SIGN O"/* A8C1 */, /*16452*/"SAURASHTRA VOWEL SIGN OO"/* A8C2 */,/*16453*/"SAURASHTRA VOWEL SIGN AU"/* A8C3 */, /*16454*/"SAURASHTRA SIGN VIRAMA"/* A8C4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16464*/"SAURASHTRA DANDA"/* A8CE */,/*16465*/"SAURASHTRA DOUBLE DANDA"/* A8CF */, /*16466*/"SAURASHTRA DIGIT ZERO"/* A8D0 */,/*16467*/"SAURASHTRA DIGIT ONE"/* A8D1 */, /*16468*/"SAURASHTRA DIGIT TWO"/* A8D2 */,/*16469*/"SAURASHTRA DIGIT THREE"/* A8D3 */, /*16470*/"SAURASHTRA DIGIT FOUR"/* A8D4 */,/*16471*/"SAURASHTRA DIGIT FIVE"/* A8D5 */, /*16472*/"SAURASHTRA DIGIT SIX"/* A8D6 */,/*16473*/"SAURASHTRA DIGIT SEVEN"/* A8D7 */, /*16474*/"SAURASHTRA DIGIT EIGHT"/* A8D8 */,/*16475*/"SAURASHTRA DIGIT NINE"/* A8D9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*16482*/"COMBINING DEVANAGARI DIGIT ZERO"/* A8E0 */,/*16483*/"COMBINING DEVANAGARI DIGIT ONE"/* A8E1 */, /*16484*/"COMBINING DEVANAGARI DIGIT TWO"/* A8E2 */,/*16485*/"COMBINING DEVANAGARI DIGIT THREE"/* A8E3 */, /*16486*/"COMBINING DEVANAGARI DIGIT FOUR"/* A8E4 */,/*16487*/"COMBINING DEVANAGARI DIGIT FIVE"/* A8E5 */, /*16488*/"COMBINING DEVANAGARI DIGIT SIX"/* A8E6 */,/*16489*/"COMBINING DEVANAGARI DIGIT SEVEN"/* A8E7 */, /*16490*/"COMBINING DEVANAGARI DIGIT EIGHT"/* A8E8 */,/*16491*/"COMBINING DEVANAGARI DIGIT NINE"/* A8E9 */, /*16492*/"COMBINING DEVANAGARI LETTER A"/* A8EA */,/*16493*/"COMBINING DEVANAGARI LETTER U"/* A8EB */, /*16494*/"COMBINING DEVANAGARI LETTER KA"/* A8EC */,/*16495*/"COMBINING DEVANAGARI LETTER NA"/* A8ED */, /*16496*/"COMBINING DEVANAGARI LETTER PA"/* A8EE */,/*16497*/"COMBINING DEVANAGARI LETTER RA"/* A8EF */, /*16498*/"COMBINING DEVANAGARI LETTER VI"/* A8F0 */,/*16499*/"COMBINING DEVANAGARI SIGN AVAGRAHA"/* A8F1 */, /*16500*/"DEVANAGARI SIGN SPACING CANDRABINDU"/* A8F2 */,/*16501*/"DEVANAGARI SIGN CANDRABINDU VIRAMA"/* A8F3 */, /*16502*/"DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA"/* A8F4 */,/*16503*/"DEVANAGARI SIGN CANDRABINDU TWO"/* A8F5 */, /*16504*/"DEVANAGARI SIGN CANDRABINDU THREE"/* A8F6 */,/*16505*/"DEVANAGARI SIGN CANDRABINDU AVAGRAHA"/* A8F7 */, /*16506*/"DEVANAGARI SIGN PUSHPIKA"/* A8F8 */,/*16507*/"DEVANAGARI GAP FILLER"/* A8F9 */, /*16508*/"DEVANAGARI CARET"/* A8FA */,/*16509*/"DEVANAGARI HEADSTROKE"/* A8FB */, /*16510*/"DEVANAGARI SIGN SIDDHAM"/* A8FC */,/*16511*/"DEVANAGARI JAIN OM"/* A8FD */,NULL,NULL, /*16514*/"KAYAH LI DIGIT ZERO"/* A900 */,/*16515*/"KAYAH LI DIGIT ONE"/* A901 */,/*16516*/"KAYAH LI DIGIT TWO"/* A902 */, /*16517*/"KAYAH LI DIGIT THREE"/* A903 */,/*16518*/"KAYAH LI DIGIT FOUR"/* A904 */, /*16519*/"KAYAH LI DIGIT FIVE"/* A905 */,/*16520*/"KAYAH LI DIGIT SIX"/* A906 */, /*16521*/"KAYAH LI DIGIT SEVEN"/* A907 */,/*16522*/"KAYAH LI DIGIT EIGHT"/* A908 */, /*16523*/"KAYAH LI DIGIT NINE"/* A909 */,/*16524*/"KAYAH LI LETTER KA"/* A90A */, /*16525*/"KAYAH LI LETTER KHA"/* A90B */,/*16526*/"KAYAH LI LETTER GA"/* A90C */, /*16527*/"KAYAH LI LETTER NGA"/* A90D */,/*16528*/"KAYAH LI LETTER SA"/* A90E */, /*16529*/"KAYAH LI LETTER SHA"/* A90F */,/*16530*/"KAYAH LI LETTER ZA"/* A910 */, /*16531*/"KAYAH LI LETTER NYA"/* A911 */,/*16532*/"KAYAH LI LETTER TA"/* A912 */, /*16533*/"KAYAH LI LETTER HTA"/* A913 */,/*16534*/"KAYAH LI LETTER NA"/* A914 */,/*16535*/"KAYAH LI LETTER PA"/* A915 */, /*16536*/"KAYAH LI LETTER PHA"/* A916 */,/*16537*/"KAYAH LI LETTER MA"/* A917 */,/*16538*/"KAYAH LI LETTER DA"/* A918 */, /*16539*/"KAYAH LI LETTER BA"/* A919 */,/*16540*/"KAYAH LI LETTER RA"/* A91A */,/*16541*/"KAYAH LI LETTER YA"/* A91B */, /*16542*/"KAYAH LI LETTER LA"/* A91C */,/*16543*/"KAYAH LI LETTER WA"/* A91D */,/*16544*/"KAYAH LI LETTER THA"/* A91E */, /*16545*/"KAYAH LI LETTER HA"/* A91F */,/*16546*/"KAYAH LI LETTER VA"/* A920 */,/*16547*/"KAYAH LI LETTER CA"/* A921 */, /*16548*/"KAYAH LI LETTER A"/* A922 */,/*16549*/"KAYAH LI LETTER OE"/* A923 */,/*16550*/"KAYAH LI LETTER I"/* A924 */, /*16551*/"KAYAH LI LETTER OO"/* A925 */,/*16552*/"KAYAH LI VOWEL UE"/* A926 */,/*16553*/"KAYAH LI VOWEL E"/* A927 */, /*16554*/"KAYAH LI VOWEL U"/* A928 */,/*16555*/"KAYAH LI VOWEL EE"/* A929 */,/*16556*/"KAYAH LI VOWEL O"/* A92A */, /*16557*/"KAYAH LI TONE PLOPHU"/* A92B */,/*16558*/"KAYAH LI TONE CALYA"/* A92C */, /*16559*/"KAYAH LI TONE CALYA PLOPHU"/* A92D */,/*16560*/"KAYAH LI SIGN CWI"/* A92E */, /*16561*/"KAYAH LI SIGN SHYA"/* A92F */,/*16562*/"REJANG LETTER KA"/* A930 */,/*16563*/"REJANG LETTER GA"/* A931 */, /*16564*/"REJANG LETTER NGA"/* A932 */,/*16565*/"REJANG LETTER TA"/* A933 */,/*16566*/"REJANG LETTER DA"/* A934 */, /*16567*/"REJANG LETTER NA"/* A935 */,/*16568*/"REJANG LETTER PA"/* A936 */,/*16569*/"REJANG LETTER BA"/* A937 */, /*16570*/"REJANG LETTER MA"/* A938 */,/*16571*/"REJANG LETTER CA"/* A939 */,/*16572*/"REJANG LETTER JA"/* A93A */, /*16573*/"REJANG LETTER NYA"/* A93B */,/*16574*/"REJANG LETTER SA"/* A93C */,/*16575*/"REJANG LETTER RA"/* A93D */, /*16576*/"REJANG LETTER LA"/* A93E */,/*16577*/"REJANG LETTER YA"/* A93F */,/*16578*/"REJANG LETTER WA"/* A940 */, /*16579*/"REJANG LETTER HA"/* A941 */,/*16580*/"REJANG LETTER MBA"/* A942 */,/*16581*/"REJANG LETTER NGGA"/* A943 */, /*16582*/"REJANG LETTER NDA"/* A944 */,/*16583*/"REJANG LETTER NYJA"/* A945 */,/*16584*/"REJANG LETTER A"/* A946 */, /*16585*/"REJANG VOWEL SIGN I"/* A947 */,/*16586*/"REJANG VOWEL SIGN U"/* A948 */, /*16587*/"REJANG VOWEL SIGN E"/* A949 */,/*16588*/"REJANG VOWEL SIGN AI"/* A94A */, /*16589*/"REJANG VOWEL SIGN O"/* A94B */,/*16590*/"REJANG VOWEL SIGN AU"/* A94C */, /*16591*/"REJANG VOWEL SIGN EU"/* A94D */,/*16592*/"REJANG VOWEL SIGN EA"/* A94E */, /*16593*/"REJANG CONSONANT SIGN NG"/* A94F */,/*16594*/"REJANG CONSONANT SIGN N"/* A950 */, /*16595*/"REJANG CONSONANT SIGN R"/* A951 */,/*16596*/"REJANG CONSONANT SIGN H"/* A952 */, /*16597*/"REJANG VIRAMA"/* A953 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16609*/"REJANG SECTION MARK"/* A95F */,/*16610*/"HANGUL CHOSEONG TIKEUT-MIEUM"/* A960 */, /*16611*/"HANGUL CHOSEONG TIKEUT-PIEUP"/* A961 */,/*16612*/"HANGUL CHOSEONG TIKEUT-SIOS"/* A962 */, /*16613*/"HANGUL CHOSEONG TIKEUT-CIEUC"/* A963 */,/*16614*/"HANGUL CHOSEONG RIEUL-KIYEOK"/* A964 */, /*16615*/"HANGUL CHOSEONG RIEUL-SSANGKIYEOK"/* A965 */,/*16616*/"HANGUL CHOSEONG RIEUL-TIKEUT"/* A966 */, /*16617*/"HANGUL CHOSEONG RIEUL-SSANGTIKEUT"/* A967 */,/*16618*/"HANGUL CHOSEONG RIEUL-MIEUM"/* A968 */, /*16619*/"HANGUL CHOSEONG RIEUL-PIEUP"/* A969 */,/*16620*/"HANGUL CHOSEONG RIEUL-SSANGPIEUP"/* A96A */, /*16621*/"HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP"/* A96B */,/*16622*/"HANGUL CHOSEONG RIEUL-SIOS"/* A96C */, /*16623*/"HANGUL CHOSEONG RIEUL-CIEUC"/* A96D */,/*16624*/"HANGUL CHOSEONG RIEUL-KHIEUKH"/* A96E */, /*16625*/"HANGUL CHOSEONG MIEUM-KIYEOK"/* A96F */,/*16626*/"HANGUL CHOSEONG MIEUM-TIKEUT"/* A970 */, /*16627*/"HANGUL CHOSEONG MIEUM-SIOS"/* A971 */,/*16628*/"HANGUL CHOSEONG PIEUP-SIOS-THIEUTH"/* A972 */, /*16629*/"HANGUL CHOSEONG PIEUP-KHIEUKH"/* A973 */,/*16630*/"HANGUL CHOSEONG PIEUP-HIEUH"/* A974 */, /*16631*/"HANGUL CHOSEONG SSANGSIOS-PIEUP"/* A975 */,/*16632*/"HANGUL CHOSEONG IEUNG-RIEUL"/* A976 */, /*16633*/"HANGUL CHOSEONG IEUNG-HIEUH"/* A977 */,/*16634*/"HANGUL CHOSEONG SSANGCIEUC-HIEUH"/* A978 */, /*16635*/"HANGUL CHOSEONG SSANGTHIEUTH"/* A979 */,/*16636*/"HANGUL CHOSEONG PHIEUPH-HIEUH"/* A97A */, /*16637*/"HANGUL CHOSEONG HIEUH-SIOS"/* A97B */,/*16638*/"HANGUL CHOSEONG SSANGYEORINHIEUH"/* A97C */,NULL,NULL,NULL, /*16642*/"JAVANESE SIGN PANYANGGA"/* A980 */,/*16643*/"JAVANESE SIGN CECAK"/* A981 */, /*16644*/"JAVANESE SIGN LAYAR"/* A982 */,/*16645*/"JAVANESE SIGN WIGNYAN"/* A983 */, /*16646*/"JAVANESE LETTER A"/* A984 */,/*16647*/"JAVANESE LETTER I KAWI"/* A985 */, /*16648*/"JAVANESE LETTER I"/* A986 */,/*16649*/"JAVANESE LETTER II"/* A987 */,/*16650*/"JAVANESE LETTER U"/* A988 */, /*16651*/"JAVANESE LETTER PA CEREK"/* A989 */,/*16652*/"JAVANESE LETTER NGA LELET"/* A98A */, /*16653*/"JAVANESE LETTER NGA LELET RASWADI"/* A98B */,/*16654*/"JAVANESE LETTER E"/* A98C */, /*16655*/"JAVANESE LETTER AI"/* A98D */,/*16656*/"JAVANESE LETTER O"/* A98E */,/*16657*/"JAVANESE LETTER KA"/* A98F */, /*16658*/"JAVANESE LETTER KA SASAK"/* A990 */,/*16659*/"JAVANESE LETTER KA MURDA"/* A991 */, /*16660*/"JAVANESE LETTER GA"/* A992 */,/*16661*/"JAVANESE LETTER GA MURDA"/* A993 */, /*16662*/"JAVANESE LETTER NGA"/* A994 */,/*16663*/"JAVANESE LETTER CA"/* A995 */, /*16664*/"JAVANESE LETTER CA MURDA"/* A996 */,/*16665*/"JAVANESE LETTER JA"/* A997 */, /*16666*/"JAVANESE LETTER NYA MURDA"/* A998 */,/*16667*/"JAVANESE LETTER JA MAHAPRANA"/* A999 */, /*16668*/"JAVANESE LETTER NYA"/* A99A */,/*16669*/"JAVANESE LETTER TTA"/* A99B */, /*16670*/"JAVANESE LETTER TTA MAHAPRANA"/* A99C */,/*16671*/"JAVANESE LETTER DDA"/* A99D */, /*16672*/"JAVANESE LETTER DDA MAHAPRANA"/* A99E */,/*16673*/"JAVANESE LETTER NA MURDA"/* A99F */, /*16674*/"JAVANESE LETTER TA"/* A9A0 */,/*16675*/"JAVANESE LETTER TA MURDA"/* A9A1 */, /*16676*/"JAVANESE LETTER DA"/* A9A2 */,/*16677*/"JAVANESE LETTER DA MAHAPRANA"/* A9A3 */, /*16678*/"JAVANESE LETTER NA"/* A9A4 */,/*16679*/"JAVANESE LETTER PA"/* A9A5 */, /*16680*/"JAVANESE LETTER PA MURDA"/* A9A6 */,/*16681*/"JAVANESE LETTER BA"/* A9A7 */, /*16682*/"JAVANESE LETTER BA MURDA"/* A9A8 */,/*16683*/"JAVANESE LETTER MA"/* A9A9 */, /*16684*/"JAVANESE LETTER YA"/* A9AA */,/*16685*/"JAVANESE LETTER RA"/* A9AB */, /*16686*/"JAVANESE LETTER RA AGUNG"/* A9AC */,/*16687*/"JAVANESE LETTER LA"/* A9AD */, /*16688*/"JAVANESE LETTER WA"/* A9AE */,/*16689*/"JAVANESE LETTER SA MURDA"/* A9AF */, /*16690*/"JAVANESE LETTER SA MAHAPRANA"/* A9B0 */,/*16691*/"JAVANESE LETTER SA"/* A9B1 */, /*16692*/"JAVANESE LETTER HA"/* A9B2 */,/*16693*/"JAVANESE SIGN CECAK TELU"/* A9B3 */, /*16694*/"JAVANESE VOWEL SIGN TARUNG"/* A9B4 */,/*16695*/"JAVANESE VOWEL SIGN TOLONG"/* A9B5 */, /*16696*/"JAVANESE VOWEL SIGN WULU"/* A9B6 */,/*16697*/"JAVANESE VOWEL SIGN WULU MELIK"/* A9B7 */, /*16698*/"JAVANESE VOWEL SIGN SUKU"/* A9B8 */,/*16699*/"JAVANESE VOWEL SIGN SUKU MENDUT"/* A9B9 */, /*16700*/"JAVANESE VOWEL SIGN TALING"/* A9BA */,/*16701*/"JAVANESE VOWEL SIGN DIRGA MURE"/* A9BB */, /*16702*/"JAVANESE VOWEL SIGN PEPET"/* A9BC */,/*16703*/"JAVANESE CONSONANT SIGN KERET"/* A9BD */, /*16704*/"JAVANESE CONSONANT SIGN PENGKAL"/* A9BE */,/*16705*/"JAVANESE CONSONANT SIGN CAKRA"/* A9BF */, /*16706*/"JAVANESE PANGKON"/* A9C0 */,/*16707*/"JAVANESE LEFT RERENGGAN"/* A9C1 */, /*16708*/"JAVANESE RIGHT RERENGGAN"/* A9C2 */,/*16709*/"JAVANESE PADA ANDAP"/* A9C3 */, /*16710*/"JAVANESE PADA MADYA"/* A9C4 */,/*16711*/"JAVANESE PADA LUHUR"/* A9C5 */, /*16712*/"JAVANESE PADA WINDU"/* A9C6 */,/*16713*/"JAVANESE PADA PANGKAT"/* A9C7 */, /*16714*/"JAVANESE PADA LINGSA"/* A9C8 */,/*16715*/"JAVANESE PADA LUNGSI"/* A9C9 */, /*16716*/"JAVANESE PADA ADEG"/* A9CA */,/*16717*/"JAVANESE PADA ADEG ADEG"/* A9CB */, /*16718*/"JAVANESE PADA PISELEH"/* A9CC */,/*16719*/"JAVANESE TURNED PADA PISELEH"/* A9CD */,NULL, /*16721*/"JAVANESE PANGRANGKEP"/* A9CF */,/*16722*/"JAVANESE DIGIT ZERO"/* A9D0 */, /*16723*/"JAVANESE DIGIT ONE"/* A9D1 */,/*16724*/"JAVANESE DIGIT TWO"/* A9D2 */, /*16725*/"JAVANESE DIGIT THREE"/* A9D3 */,/*16726*/"JAVANESE DIGIT FOUR"/* A9D4 */, /*16727*/"JAVANESE DIGIT FIVE"/* A9D5 */,/*16728*/"JAVANESE DIGIT SIX"/* A9D6 */, /*16729*/"JAVANESE DIGIT SEVEN"/* A9D7 */,/*16730*/"JAVANESE DIGIT EIGHT"/* A9D8 */, /*16731*/"JAVANESE DIGIT NINE"/* A9D9 */,NULL,NULL,NULL,NULL,/*16736*/"JAVANESE PADA TIRTA TUMETES"/* A9DE */, /*16737*/"JAVANESE PADA ISEN-ISEN"/* A9DF */,/*16738*/"MYANMAR LETTER SHAN GHA"/* A9E0 */, /*16739*/"MYANMAR LETTER SHAN CHA"/* A9E1 */,/*16740*/"MYANMAR LETTER SHAN JHA"/* A9E2 */, /*16741*/"MYANMAR LETTER SHAN NNA"/* A9E3 */,/*16742*/"MYANMAR LETTER SHAN BHA"/* A9E4 */, /*16743*/"MYANMAR SIGN SHAN SAW"/* A9E5 */,/*16744*/"MYANMAR MODIFIER LETTER SHAN REDUPLICATION"/* A9E6 */, /*16745*/"MYANMAR LETTER TAI LAING NYA"/* A9E7 */,/*16746*/"MYANMAR LETTER TAI LAING FA"/* A9E8 */, /*16747*/"MYANMAR LETTER TAI LAING GA"/* A9E9 */,/*16748*/"MYANMAR LETTER TAI LAING GHA"/* A9EA */, /*16749*/"MYANMAR LETTER TAI LAING JA"/* A9EB */,/*16750*/"MYANMAR LETTER TAI LAING JHA"/* A9EC */, /*16751*/"MYANMAR LETTER TAI LAING DDA"/* A9ED */,/*16752*/"MYANMAR LETTER TAI LAING DDHA"/* A9EE */, /*16753*/"MYANMAR LETTER TAI LAING NNA"/* A9EF */,/*16754*/"MYANMAR TAI LAING DIGIT ZERO"/* A9F0 */, /*16755*/"MYANMAR TAI LAING DIGIT ONE"/* A9F1 */,/*16756*/"MYANMAR TAI LAING DIGIT TWO"/* A9F2 */, /*16757*/"MYANMAR TAI LAING DIGIT THREE"/* A9F3 */,/*16758*/"MYANMAR TAI LAING DIGIT FOUR"/* A9F4 */, /*16759*/"MYANMAR TAI LAING DIGIT FIVE"/* A9F5 */,/*16760*/"MYANMAR TAI LAING DIGIT SIX"/* A9F6 */, /*16761*/"MYANMAR TAI LAING DIGIT SEVEN"/* A9F7 */,/*16762*/"MYANMAR TAI LAING DIGIT EIGHT"/* A9F8 */, /*16763*/"MYANMAR TAI LAING DIGIT NINE"/* A9F9 */,/*16764*/"MYANMAR LETTER TAI LAING LLA"/* A9FA */, /*16765*/"MYANMAR LETTER TAI LAING DA"/* A9FB */,/*16766*/"MYANMAR LETTER TAI LAING DHA"/* A9FC */, /*16767*/"MYANMAR LETTER TAI LAING BA"/* A9FD */,/*16768*/"MYANMAR LETTER TAI LAING BHA"/* A9FE */,NULL, /*16770*/"CHAM LETTER A"/* AA00 */,/*16771*/"CHAM LETTER I"/* AA01 */,/*16772*/"CHAM LETTER U"/* AA02 */, /*16773*/"CHAM LETTER E"/* AA03 */,/*16774*/"CHAM LETTER AI"/* AA04 */,/*16775*/"CHAM LETTER O"/* AA05 */, /*16776*/"CHAM LETTER KA"/* AA06 */,/*16777*/"CHAM LETTER KHA"/* AA07 */,/*16778*/"CHAM LETTER GA"/* AA08 */, /*16779*/"CHAM LETTER GHA"/* AA09 */,/*16780*/"CHAM LETTER NGUE"/* AA0A */,/*16781*/"CHAM LETTER NGA"/* AA0B */, /*16782*/"CHAM LETTER CHA"/* AA0C */,/*16783*/"CHAM LETTER CHHA"/* AA0D */,/*16784*/"CHAM LETTER JA"/* AA0E */, /*16785*/"CHAM LETTER JHA"/* AA0F */,/*16786*/"CHAM LETTER NHUE"/* AA10 */,/*16787*/"CHAM LETTER NHA"/* AA11 */, /*16788*/"CHAM LETTER NHJA"/* AA12 */,/*16789*/"CHAM LETTER TA"/* AA13 */,/*16790*/"CHAM LETTER THA"/* AA14 */, /*16791*/"CHAM LETTER DA"/* AA15 */,/*16792*/"CHAM LETTER DHA"/* AA16 */,/*16793*/"CHAM LETTER NUE"/* AA17 */, /*16794*/"CHAM LETTER NA"/* AA18 */,/*16795*/"CHAM LETTER DDA"/* AA19 */,/*16796*/"CHAM LETTER PA"/* AA1A */, /*16797*/"CHAM LETTER PPA"/* AA1B */,/*16798*/"CHAM LETTER PHA"/* AA1C */,/*16799*/"CHAM LETTER BA"/* AA1D */, /*16800*/"CHAM LETTER BHA"/* AA1E */,/*16801*/"CHAM LETTER MUE"/* AA1F */,/*16802*/"CHAM LETTER MA"/* AA20 */, /*16803*/"CHAM LETTER BBA"/* AA21 */,/*16804*/"CHAM LETTER YA"/* AA22 */,/*16805*/"CHAM LETTER RA"/* AA23 */, /*16806*/"CHAM LETTER LA"/* AA24 */,/*16807*/"CHAM LETTER VA"/* AA25 */,/*16808*/"CHAM LETTER SSA"/* AA26 */, /*16809*/"CHAM LETTER SA"/* AA27 */,/*16810*/"CHAM LETTER HA"/* AA28 */,/*16811*/"CHAM VOWEL SIGN AA"/* AA29 */, /*16812*/"CHAM VOWEL SIGN I"/* AA2A */,/*16813*/"CHAM VOWEL SIGN II"/* AA2B */,/*16814*/"CHAM VOWEL SIGN EI"/* AA2C */, /*16815*/"CHAM VOWEL SIGN U"/* AA2D */,/*16816*/"CHAM VOWEL SIGN OE"/* AA2E */,/*16817*/"CHAM VOWEL SIGN O"/* AA2F */, /*16818*/"CHAM VOWEL SIGN AI"/* AA30 */,/*16819*/"CHAM VOWEL SIGN AU"/* AA31 */,/*16820*/"CHAM VOWEL SIGN UE"/* AA32 */, /*16821*/"CHAM CONSONANT SIGN YA"/* AA33 */,/*16822*/"CHAM CONSONANT SIGN RA"/* AA34 */, /*16823*/"CHAM CONSONANT SIGN LA"/* AA35 */,/*16824*/"CHAM CONSONANT SIGN WA"/* AA36 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*16834*/"CHAM LETTER FINAL K"/* AA40 */,/*16835*/"CHAM LETTER FINAL G"/* AA41 */, /*16836*/"CHAM LETTER FINAL NG"/* AA42 */,/*16837*/"CHAM CONSONANT SIGN FINAL NG"/* AA43 */, /*16838*/"CHAM LETTER FINAL CH"/* AA44 */,/*16839*/"CHAM LETTER FINAL T"/* AA45 */, /*16840*/"CHAM LETTER FINAL N"/* AA46 */,/*16841*/"CHAM LETTER FINAL P"/* AA47 */, /*16842*/"CHAM LETTER FINAL Y"/* AA48 */,/*16843*/"CHAM LETTER FINAL R"/* AA49 */, /*16844*/"CHAM LETTER FINAL L"/* AA4A */,/*16845*/"CHAM LETTER FINAL SS"/* AA4B */, /*16846*/"CHAM CONSONANT SIGN FINAL M"/* AA4C */,/*16847*/"CHAM CONSONANT SIGN FINAL H"/* AA4D */,NULL,NULL, /*16850*/"CHAM DIGIT ZERO"/* AA50 */,/*16851*/"CHAM DIGIT ONE"/* AA51 */,/*16852*/"CHAM DIGIT TWO"/* AA52 */, /*16853*/"CHAM DIGIT THREE"/* AA53 */,/*16854*/"CHAM DIGIT FOUR"/* AA54 */,/*16855*/"CHAM DIGIT FIVE"/* AA55 */, /*16856*/"CHAM DIGIT SIX"/* AA56 */,/*16857*/"CHAM DIGIT SEVEN"/* AA57 */,/*16858*/"CHAM DIGIT EIGHT"/* AA58 */, /*16859*/"CHAM DIGIT NINE"/* AA59 */,NULL,NULL,/*16862*/"CHAM PUNCTUATION SPIRAL"/* AA5C */, /*16863*/"CHAM PUNCTUATION DANDA"/* AA5D */,/*16864*/"CHAM PUNCTUATION DOUBLE DANDA"/* AA5E */, /*16865*/"CHAM PUNCTUATION TRIPLE DANDA"/* AA5F */,/*16866*/"MYANMAR LETTER KHAMTI GA"/* AA60 */, /*16867*/"MYANMAR LETTER KHAMTI CA"/* AA61 */,/*16868*/"MYANMAR LETTER KHAMTI CHA"/* AA62 */, /*16869*/"MYANMAR LETTER KHAMTI JA"/* AA63 */,/*16870*/"MYANMAR LETTER KHAMTI JHA"/* AA64 */, /*16871*/"MYANMAR LETTER KHAMTI NYA"/* AA65 */,/*16872*/"MYANMAR LETTER KHAMTI TTA"/* AA66 */, /*16873*/"MYANMAR LETTER KHAMTI TTHA"/* AA67 */,/*16874*/"MYANMAR LETTER KHAMTI DDA"/* AA68 */, /*16875*/"MYANMAR LETTER KHAMTI DDHA"/* AA69 */,/*16876*/"MYANMAR LETTER KHAMTI DHA"/* AA6A */, /*16877*/"MYANMAR LETTER KHAMTI NA"/* AA6B */,/*16878*/"MYANMAR LETTER KHAMTI SA"/* AA6C */, /*16879*/"MYANMAR LETTER KHAMTI HA"/* AA6D */,/*16880*/"MYANMAR LETTER KHAMTI HHA"/* AA6E */, /*16881*/"MYANMAR LETTER KHAMTI FA"/* AA6F */,/*16882*/"MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION"/* AA70 */, /*16883*/"MYANMAR LETTER KHAMTI XA"/* AA71 */,/*16884*/"MYANMAR LETTER KHAMTI ZA"/* AA72 */, /*16885*/"MYANMAR LETTER KHAMTI RA"/* AA73 */,/*16886*/"MYANMAR LOGOGRAM KHAMTI OAY"/* AA74 */, /*16887*/"MYANMAR LOGOGRAM KHAMTI QN"/* AA75 */,/*16888*/"MYANMAR LOGOGRAM KHAMTI HM"/* AA76 */, /*16889*/"MYANMAR SYMBOL AITON EXCLAMATION"/* AA77 */,/*16890*/"MYANMAR SYMBOL AITON ONE"/* AA78 */, /*16891*/"MYANMAR SYMBOL AITON TWO"/* AA79 */,/*16892*/"MYANMAR LETTER AITON RA"/* AA7A */, /*16893*/"MYANMAR SIGN PAO KAREN TONE"/* AA7B */,/*16894*/"MYANMAR SIGN TAI LAING TONE-2"/* AA7C */, /*16895*/"MYANMAR SIGN TAI LAING TONE-5"/* AA7D */,/*16896*/"MYANMAR LETTER SHWE PALAUNG CHA"/* AA7E */, /*16897*/"MYANMAR LETTER SHWE PALAUNG SHA"/* AA7F */,/*16898*/"TAI VIET LETTER LOW KO"/* AA80 */, /*16899*/"TAI VIET LETTER HIGH KO"/* AA81 */,/*16900*/"TAI VIET LETTER LOW KHO"/* AA82 */, /*16901*/"TAI VIET LETTER HIGH KHO"/* AA83 */,/*16902*/"TAI VIET LETTER LOW KHHO"/* AA84 */, /*16903*/"TAI VIET LETTER HIGH KHHO"/* AA85 */,/*16904*/"TAI VIET LETTER LOW GO"/* AA86 */, /*16905*/"TAI VIET LETTER HIGH GO"/* AA87 */,/*16906*/"TAI VIET LETTER LOW NGO"/* AA88 */, /*16907*/"TAI VIET LETTER HIGH NGO"/* AA89 */,/*16908*/"TAI VIET LETTER LOW CO"/* AA8A */, /*16909*/"TAI VIET LETTER HIGH CO"/* AA8B */,/*16910*/"TAI VIET LETTER LOW CHO"/* AA8C */, /*16911*/"TAI VIET LETTER HIGH CHO"/* AA8D */,/*16912*/"TAI VIET LETTER LOW SO"/* AA8E */, /*16913*/"TAI VIET LETTER HIGH SO"/* AA8F */,/*16914*/"TAI VIET LETTER LOW NYO"/* AA90 */, /*16915*/"TAI VIET LETTER HIGH NYO"/* AA91 */,/*16916*/"TAI VIET LETTER LOW DO"/* AA92 */, /*16917*/"TAI VIET LETTER HIGH DO"/* AA93 */,/*16918*/"TAI VIET LETTER LOW TO"/* AA94 */, /*16919*/"TAI VIET LETTER HIGH TO"/* AA95 */,/*16920*/"TAI VIET LETTER LOW THO"/* AA96 */, /*16921*/"TAI VIET LETTER HIGH THO"/* AA97 */,/*16922*/"TAI VIET LETTER LOW NO"/* AA98 */, /*16923*/"TAI VIET LETTER HIGH NO"/* AA99 */,/*16924*/"TAI VIET LETTER LOW BO"/* AA9A */, /*16925*/"TAI VIET LETTER HIGH BO"/* AA9B */,/*16926*/"TAI VIET LETTER LOW PO"/* AA9C */, /*16927*/"TAI VIET LETTER HIGH PO"/* AA9D */,/*16928*/"TAI VIET LETTER LOW PHO"/* AA9E */, /*16929*/"TAI VIET LETTER HIGH PHO"/* AA9F */,/*16930*/"TAI VIET LETTER LOW FO"/* AAA0 */, /*16931*/"TAI VIET LETTER HIGH FO"/* AAA1 */,/*16932*/"TAI VIET LETTER LOW MO"/* AAA2 */, /*16933*/"TAI VIET LETTER HIGH MO"/* AAA3 */,/*16934*/"TAI VIET LETTER LOW YO"/* AAA4 */, /*16935*/"TAI VIET LETTER HIGH YO"/* AAA5 */,/*16936*/"TAI VIET LETTER LOW RO"/* AAA6 */, /*16937*/"TAI VIET LETTER HIGH RO"/* AAA7 */,/*16938*/"TAI VIET LETTER LOW LO"/* AAA8 */, /*16939*/"TAI VIET LETTER HIGH LO"/* AAA9 */,/*16940*/"TAI VIET LETTER LOW VO"/* AAAA */, /*16941*/"TAI VIET LETTER HIGH VO"/* AAAB */,/*16942*/"TAI VIET LETTER LOW HO"/* AAAC */, /*16943*/"TAI VIET LETTER HIGH HO"/* AAAD */,/*16944*/"TAI VIET LETTER LOW O"/* AAAE */, /*16945*/"TAI VIET LETTER HIGH O"/* AAAF */,/*16946*/"TAI VIET MAI KANG"/* AAB0 */, /*16947*/"TAI VIET VOWEL AA"/* AAB1 */,/*16948*/"TAI VIET VOWEL I"/* AAB2 */,/*16949*/"TAI VIET VOWEL UE"/* AAB3 */, /*16950*/"TAI VIET VOWEL U"/* AAB4 */,/*16951*/"TAI VIET VOWEL E"/* AAB5 */,/*16952*/"TAI VIET VOWEL O"/* AAB6 */, /*16953*/"TAI VIET MAI KHIT"/* AAB7 */,/*16954*/"TAI VIET VOWEL IA"/* AAB8 */,/*16955*/"TAI VIET VOWEL UEA"/* AAB9 */, /*16956*/"TAI VIET VOWEL UA"/* AABA */,/*16957*/"TAI VIET VOWEL AUE"/* AABB */,/*16958*/"TAI VIET VOWEL AY"/* AABC */, /*16959*/"TAI VIET VOWEL AN"/* AABD */,/*16960*/"TAI VIET VOWEL AM"/* AABE */,/*16961*/"TAI VIET TONE MAI EK"/* AABF */, /*16962*/"TAI VIET TONE MAI NUENG"/* AAC0 */,/*16963*/"TAI VIET TONE MAI THO"/* AAC1 */, /*16964*/"TAI VIET TONE MAI SONG"/* AAC2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*16989*/"TAI VIET SYMBOL KON"/* AADB */, /*16990*/"TAI VIET SYMBOL NUENG"/* AADC */,/*16991*/"TAI VIET SYMBOL SAM"/* AADD */, /*16992*/"TAI VIET SYMBOL HO HOI"/* AADE */,/*16993*/"TAI VIET SYMBOL KOI KOI"/* AADF */, /*16994*/"MEETEI MAYEK LETTER E"/* AAE0 */,/*16995*/"MEETEI MAYEK LETTER O"/* AAE1 */, /*16996*/"MEETEI MAYEK LETTER CHA"/* AAE2 */,/*16997*/"MEETEI MAYEK LETTER NYA"/* AAE3 */, /*16998*/"MEETEI MAYEK LETTER TTA"/* AAE4 */,/*16999*/"MEETEI MAYEK LETTER TTHA"/* AAE5 */, /*17000*/"MEETEI MAYEK LETTER DDA"/* AAE6 */,/*17001*/"MEETEI MAYEK LETTER DDHA"/* AAE7 */, /*17002*/"MEETEI MAYEK LETTER NNA"/* AAE8 */,/*17003*/"MEETEI MAYEK LETTER SHA"/* AAE9 */, /*17004*/"MEETEI MAYEK LETTER SSA"/* AAEA */,/*17005*/"MEETEI MAYEK VOWEL SIGN II"/* AAEB */, /*17006*/"MEETEI MAYEK VOWEL SIGN UU"/* AAEC */,/*17007*/"MEETEI MAYEK VOWEL SIGN AAI"/* AAED */, /*17008*/"MEETEI MAYEK VOWEL SIGN AU"/* AAEE */,/*17009*/"MEETEI MAYEK VOWEL SIGN AAU"/* AAEF */, /*17010*/"MEETEI MAYEK CHEIKHAN"/* AAF0 */,/*17011*/"MEETEI MAYEK AHANG KHUDAM"/* AAF1 */, /*17012*/"MEETEI MAYEK ANJI"/* AAF2 */,/*17013*/"MEETEI MAYEK SYLLABLE REPETITION MARK"/* AAF3 */, /*17014*/"MEETEI MAYEK WORD REPETITION MARK"/* AAF4 */,/*17015*/"MEETEI MAYEK VOWEL SIGN VISARGA"/* AAF5 */, /*17016*/"MEETEI MAYEK VIRAMA"/* AAF6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*17027*/"ETHIOPIC SYLLABLE TTHU"/* AB01 */,/*17028*/"ETHIOPIC SYLLABLE TTHI"/* AB02 */, /*17029*/"ETHIOPIC SYLLABLE TTHAA"/* AB03 */,/*17030*/"ETHIOPIC SYLLABLE TTHEE"/* AB04 */, /*17031*/"ETHIOPIC SYLLABLE TTHE"/* AB05 */,/*17032*/"ETHIOPIC SYLLABLE TTHO"/* AB06 */,NULL,NULL, /*17035*/"ETHIOPIC SYLLABLE DDHU"/* AB09 */,/*17036*/"ETHIOPIC SYLLABLE DDHI"/* AB0A */, /*17037*/"ETHIOPIC SYLLABLE DDHAA"/* AB0B */,/*17038*/"ETHIOPIC SYLLABLE DDHEE"/* AB0C */, /*17039*/"ETHIOPIC SYLLABLE DDHE"/* AB0D */,/*17040*/"ETHIOPIC SYLLABLE DDHO"/* AB0E */,NULL,NULL, /*17043*/"ETHIOPIC SYLLABLE DZU"/* AB11 */,/*17044*/"ETHIOPIC SYLLABLE DZI"/* AB12 */, /*17045*/"ETHIOPIC SYLLABLE DZAA"/* AB13 */,/*17046*/"ETHIOPIC SYLLABLE DZEE"/* AB14 */, /*17047*/"ETHIOPIC SYLLABLE DZE"/* AB15 */,/*17048*/"ETHIOPIC SYLLABLE DZO"/* AB16 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*17058*/"ETHIOPIC SYLLABLE CCHHA"/* AB20 */,/*17059*/"ETHIOPIC SYLLABLE CCHHU"/* AB21 */, /*17060*/"ETHIOPIC SYLLABLE CCHHI"/* AB22 */,/*17061*/"ETHIOPIC SYLLABLE CCHHAA"/* AB23 */, /*17062*/"ETHIOPIC SYLLABLE CCHHEE"/* AB24 */,/*17063*/"ETHIOPIC SYLLABLE CCHHE"/* AB25 */, /*17064*/"ETHIOPIC SYLLABLE CCHHO"/* AB26 */,NULL,/*17066*/"ETHIOPIC SYLLABLE BBA"/* AB28 */, /*17067*/"ETHIOPIC SYLLABLE BBU"/* AB29 */,/*17068*/"ETHIOPIC SYLLABLE BBI"/* AB2A */, /*17069*/"ETHIOPIC SYLLABLE BBAA"/* AB2B */,/*17070*/"ETHIOPIC SYLLABLE BBEE"/* AB2C */, /*17071*/"ETHIOPIC SYLLABLE BBE"/* AB2D */,/*17072*/"ETHIOPIC SYLLABLE BBO"/* AB2E */,NULL, /*17074*/"LATIN SMALL LETTER BARRED ALPHA"/* AB30 */,/*17075*/"LATIN SMALL LETTER A REVERSED-SCHWA"/* AB31 */, /*17076*/"LATIN SMALL LETTER BLACKLETTER E"/* AB32 */,/*17077*/"LATIN SMALL LETTER BARRED E"/* AB33 */, /*17078*/"LATIN SMALL LETTER E WITH FLOURISH"/* AB34 */,/*17079*/"LATIN SMALL LETTER LENIS F"/* AB35 */, /*17080*/"LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL"/* AB36 */, /*17081*/"LATIN SMALL LETTER L WITH INVERTED LAZY S"/* AB37 */, /*17082*/"LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE"/* AB38 */, /*17083*/"LATIN SMALL LETTER L WITH MIDDLE RING"/* AB39 */,/*17084*/"LATIN SMALL LETTER M WITH CROSSED-TAIL"/* AB3A */, /*17085*/"LATIN SMALL LETTER N WITH CROSSED-TAIL"/* AB3B */, /*17086*/"LATIN SMALL LETTER ENG WITH CROSSED-TAIL"/* AB3C */,/*17087*/"LATIN SMALL LETTER BLACKLETTER O"/* AB3D */, /*17088*/"LATIN SMALL LETTER BLACKLETTER O WITH STROKE"/* AB3E */, /*17089*/"LATIN SMALL LETTER OPEN O WITH STROKE"/* AB3F */,/*17090*/"LATIN SMALL LETTER INVERTED OE"/* AB40 */, /*17091*/"LATIN SMALL LETTER TURNED OE WITH STROKE"/* AB41 */, /*17092*/"LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE"/* AB42 */, /*17093*/"LATIN SMALL LETTER TURNED O OPEN-O"/* AB43 */, /*17094*/"LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE"/* AB44 */,/*17095*/"LATIN SMALL LETTER STIRRUP R"/* AB45 */, /*17096*/"LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG"/* AB46 */, /*17097*/"LATIN SMALL LETTER R WITHOUT HANDLE"/* AB47 */,/*17098*/"LATIN SMALL LETTER DOUBLE R"/* AB48 */, /*17099*/"LATIN SMALL LETTER R WITH CROSSED-TAIL"/* AB49 */, /*17100*/"LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL"/* AB4A */,/*17101*/"LATIN SMALL LETTER SCRIPT R"/* AB4B */, /*17102*/"LATIN SMALL LETTER SCRIPT R WITH RING"/* AB4C */,/*17103*/"LATIN SMALL LETTER BASELINE ESH"/* AB4D */, /*17104*/"LATIN SMALL LETTER U WITH SHORT RIGHT LEG"/* AB4E */, /*17105*/"LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG"/* AB4F */,/*17106*/"LATIN SMALL LETTER UI"/* AB50 */, /*17107*/"LATIN SMALL LETTER TURNED UI"/* AB51 */,/*17108*/"LATIN SMALL LETTER U WITH LEFT HOOK"/* AB52 */, /*17109*/"LATIN SMALL LETTER CHI"/* AB53 */,/*17110*/"LATIN SMALL LETTER CHI WITH LOW RIGHT RING"/* AB54 */, /*17111*/"LATIN SMALL LETTER CHI WITH LOW LEFT SERIF"/* AB55 */, /*17112*/"LATIN SMALL LETTER X WITH LOW RIGHT RING"/* AB56 */, /*17113*/"LATIN SMALL LETTER X WITH LONG LEFT LEG"/* AB57 */, /*17114*/"LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING"/* AB58 */, /*17115*/"LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF"/* AB59 */, /*17116*/"LATIN SMALL LETTER Y WITH SHORT RIGHT LEG"/* AB5A */,/*17117*/"MODIFIER BREVE WITH INVERTED BREVE"/* AB5B */, /*17118*/"MODIFIER LETTER SMALL HENG"/* AB5C */,/*17119*/"MODIFIER LETTER SMALL L WITH INVERTED LAZY S"/* AB5D */, /*17120*/"MODIFIER LETTER SMALL L WITH MIDDLE TILDE"/* AB5E */, /*17121*/"MODIFIER LETTER SMALL U WITH LEFT HOOK"/* AB5F */,/*17122*/"LATIN SMALL LETTER SAKHA YAT"/* AB60 */, /*17123*/"LATIN SMALL LETTER IOTIFIED E"/* AB61 */,/*17124*/"LATIN SMALL LETTER OPEN OE"/* AB62 */, /*17125*/"LATIN SMALL LETTER UO"/* AB63 */,/*17126*/"LATIN SMALL LETTER INVERTED ALPHA"/* AB64 */, /*17127*/"GREEK LETTER SMALL CAPITAL OMEGA"/* AB65 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*17138*/"CHEROKEE SMALL LETTER A"/* AB70 */,/*17139*/"CHEROKEE SMALL LETTER E"/* AB71 */, /*17140*/"CHEROKEE SMALL LETTER I"/* AB72 */,/*17141*/"CHEROKEE SMALL LETTER O"/* AB73 */, /*17142*/"CHEROKEE SMALL LETTER U"/* AB74 */,/*17143*/"CHEROKEE SMALL LETTER V"/* AB75 */, /*17144*/"CHEROKEE SMALL LETTER GA"/* AB76 */,/*17145*/"CHEROKEE SMALL LETTER KA"/* AB77 */, /*17146*/"CHEROKEE SMALL LETTER GE"/* AB78 */,/*17147*/"CHEROKEE SMALL LETTER GI"/* AB79 */, /*17148*/"CHEROKEE SMALL LETTER GO"/* AB7A */,/*17149*/"CHEROKEE SMALL LETTER GU"/* AB7B */, /*17150*/"CHEROKEE SMALL LETTER GV"/* AB7C */,/*17151*/"CHEROKEE SMALL LETTER HA"/* AB7D */, /*17152*/"CHEROKEE SMALL LETTER HE"/* AB7E */,/*17153*/"CHEROKEE SMALL LETTER HI"/* AB7F */, /*17154*/"CHEROKEE SMALL LETTER HO"/* AB80 */,/*17155*/"CHEROKEE SMALL LETTER HU"/* AB81 */, /*17156*/"CHEROKEE SMALL LETTER HV"/* AB82 */,/*17157*/"CHEROKEE SMALL LETTER LA"/* AB83 */, /*17158*/"CHEROKEE SMALL LETTER LE"/* AB84 */,/*17159*/"CHEROKEE SMALL LETTER LI"/* AB85 */, /*17160*/"CHEROKEE SMALL LETTER LO"/* AB86 */,/*17161*/"CHEROKEE SMALL LETTER LU"/* AB87 */, /*17162*/"CHEROKEE SMALL LETTER LV"/* AB88 */,/*17163*/"CHEROKEE SMALL LETTER MA"/* AB89 */, /*17164*/"CHEROKEE SMALL LETTER ME"/* AB8A */,/*17165*/"CHEROKEE SMALL LETTER MI"/* AB8B */, /*17166*/"CHEROKEE SMALL LETTER MO"/* AB8C */,/*17167*/"CHEROKEE SMALL LETTER MU"/* AB8D */, /*17168*/"CHEROKEE SMALL LETTER NA"/* AB8E */,/*17169*/"CHEROKEE SMALL LETTER HNA"/* AB8F */, /*17170*/"CHEROKEE SMALL LETTER NAH"/* AB90 */,/*17171*/"CHEROKEE SMALL LETTER NE"/* AB91 */, /*17172*/"CHEROKEE SMALL LETTER NI"/* AB92 */,/*17173*/"CHEROKEE SMALL LETTER NO"/* AB93 */, /*17174*/"CHEROKEE SMALL LETTER NU"/* AB94 */,/*17175*/"CHEROKEE SMALL LETTER NV"/* AB95 */, /*17176*/"CHEROKEE SMALL LETTER QUA"/* AB96 */,/*17177*/"CHEROKEE SMALL LETTER QUE"/* AB97 */, /*17178*/"CHEROKEE SMALL LETTER QUI"/* AB98 */,/*17179*/"CHEROKEE SMALL LETTER QUO"/* AB99 */, /*17180*/"CHEROKEE SMALL LETTER QUU"/* AB9A */,/*17181*/"CHEROKEE SMALL LETTER QUV"/* AB9B */, /*17182*/"CHEROKEE SMALL LETTER SA"/* AB9C */,/*17183*/"CHEROKEE SMALL LETTER S"/* AB9D */, /*17184*/"CHEROKEE SMALL LETTER SE"/* AB9E */,/*17185*/"CHEROKEE SMALL LETTER SI"/* AB9F */, /*17186*/"CHEROKEE SMALL LETTER SO"/* ABA0 */,/*17187*/"CHEROKEE SMALL LETTER SU"/* ABA1 */, /*17188*/"CHEROKEE SMALL LETTER SV"/* ABA2 */,/*17189*/"CHEROKEE SMALL LETTER DA"/* ABA3 */, /*17190*/"CHEROKEE SMALL LETTER TA"/* ABA4 */,/*17191*/"CHEROKEE SMALL LETTER DE"/* ABA5 */, /*17192*/"CHEROKEE SMALL LETTER TE"/* ABA6 */,/*17193*/"CHEROKEE SMALL LETTER DI"/* ABA7 */, /*17194*/"CHEROKEE SMALL LETTER TI"/* ABA8 */,/*17195*/"CHEROKEE SMALL LETTER DO"/* ABA9 */, /*17196*/"CHEROKEE SMALL LETTER DU"/* ABAA */,/*17197*/"CHEROKEE SMALL LETTER DV"/* ABAB */, /*17198*/"CHEROKEE SMALL LETTER DLA"/* ABAC */,/*17199*/"CHEROKEE SMALL LETTER TLA"/* ABAD */, /*17200*/"CHEROKEE SMALL LETTER TLE"/* ABAE */,/*17201*/"CHEROKEE SMALL LETTER TLI"/* ABAF */, /*17202*/"CHEROKEE SMALL LETTER TLO"/* ABB0 */,/*17203*/"CHEROKEE SMALL LETTER TLU"/* ABB1 */, /*17204*/"CHEROKEE SMALL LETTER TLV"/* ABB2 */,/*17205*/"CHEROKEE SMALL LETTER TSA"/* ABB3 */, /*17206*/"CHEROKEE SMALL LETTER TSE"/* ABB4 */,/*17207*/"CHEROKEE SMALL LETTER TSI"/* ABB5 */, /*17208*/"CHEROKEE SMALL LETTER TSO"/* ABB6 */,/*17209*/"CHEROKEE SMALL LETTER TSU"/* ABB7 */, /*17210*/"CHEROKEE SMALL LETTER TSV"/* ABB8 */,/*17211*/"CHEROKEE SMALL LETTER WA"/* ABB9 */, /*17212*/"CHEROKEE SMALL LETTER WE"/* ABBA */,/*17213*/"CHEROKEE SMALL LETTER WI"/* ABBB */, /*17214*/"CHEROKEE SMALL LETTER WO"/* ABBC */,/*17215*/"CHEROKEE SMALL LETTER WU"/* ABBD */, /*17216*/"CHEROKEE SMALL LETTER WV"/* ABBE */,/*17217*/"CHEROKEE SMALL LETTER YA"/* ABBF */, /*17218*/"MEETEI MAYEK LETTER KOK"/* ABC0 */,/*17219*/"MEETEI MAYEK LETTER SAM"/* ABC1 */, /*17220*/"MEETEI MAYEK LETTER LAI"/* ABC2 */,/*17221*/"MEETEI MAYEK LETTER MIT"/* ABC3 */, /*17222*/"MEETEI MAYEK LETTER PA"/* ABC4 */,/*17223*/"MEETEI MAYEK LETTER NA"/* ABC5 */, /*17224*/"MEETEI MAYEK LETTER CHIL"/* ABC6 */,/*17225*/"MEETEI MAYEK LETTER TIL"/* ABC7 */, /*17226*/"MEETEI MAYEK LETTER KHOU"/* ABC8 */,/*17227*/"MEETEI MAYEK LETTER NGOU"/* ABC9 */, /*17228*/"MEETEI MAYEK LETTER THOU"/* ABCA */,/*17229*/"MEETEI MAYEK LETTER WAI"/* ABCB */, /*17230*/"MEETEI MAYEK LETTER YANG"/* ABCC */,/*17231*/"MEETEI MAYEK LETTER HUK"/* ABCD */, /*17232*/"MEETEI MAYEK LETTER UN"/* ABCE */,/*17233*/"MEETEI MAYEK LETTER I"/* ABCF */, /*17234*/"MEETEI MAYEK LETTER PHAM"/* ABD0 */,/*17235*/"MEETEI MAYEK LETTER ATIYA"/* ABD1 */, /*17236*/"MEETEI MAYEK LETTER GOK"/* ABD2 */,/*17237*/"MEETEI MAYEK LETTER JHAM"/* ABD3 */, /*17238*/"MEETEI MAYEK LETTER RAI"/* ABD4 */,/*17239*/"MEETEI MAYEK LETTER BA"/* ABD5 */, /*17240*/"MEETEI MAYEK LETTER JIL"/* ABD6 */,/*17241*/"MEETEI MAYEK LETTER DIL"/* ABD7 */, /*17242*/"MEETEI MAYEK LETTER GHOU"/* ABD8 */,/*17243*/"MEETEI MAYEK LETTER DHOU"/* ABD9 */, /*17244*/"MEETEI MAYEK LETTER BHAM"/* ABDA */,/*17245*/"MEETEI MAYEK LETTER KOK LONSUM"/* ABDB */, /*17246*/"MEETEI MAYEK LETTER LAI LONSUM"/* ABDC */,/*17247*/"MEETEI MAYEK LETTER MIT LONSUM"/* ABDD */, /*17248*/"MEETEI MAYEK LETTER PA LONSUM"/* ABDE */,/*17249*/"MEETEI MAYEK LETTER NA LONSUM"/* ABDF */, /*17250*/"MEETEI MAYEK LETTER TIL LONSUM"/* ABE0 */,/*17251*/"MEETEI MAYEK LETTER NGOU LONSUM"/* ABE1 */, /*17252*/"MEETEI MAYEK LETTER I LONSUM"/* ABE2 */,/*17253*/"MEETEI MAYEK VOWEL SIGN ONAP"/* ABE3 */, /*17254*/"MEETEI MAYEK VOWEL SIGN INAP"/* ABE4 */,/*17255*/"MEETEI MAYEK VOWEL SIGN ANAP"/* ABE5 */, /*17256*/"MEETEI MAYEK VOWEL SIGN YENAP"/* ABE6 */,/*17257*/"MEETEI MAYEK VOWEL SIGN SOUNAP"/* ABE7 */, /*17258*/"MEETEI MAYEK VOWEL SIGN UNAP"/* ABE8 */,/*17259*/"MEETEI MAYEK VOWEL SIGN CHEINAP"/* ABE9 */, /*17260*/"MEETEI MAYEK VOWEL SIGN NUNG"/* ABEA */,/*17261*/"MEETEI MAYEK CHEIKHEI"/* ABEB */, /*17262*/"MEETEI MAYEK LUM IYEK"/* ABEC */,/*17263*/"MEETEI MAYEK APUN IYEK"/* ABED */,NULL,NULL, /*17266*/"MEETEI MAYEK DIGIT ZERO"/* ABF0 */,/*17267*/"MEETEI MAYEK DIGIT ONE"/* ABF1 */, /*17268*/"MEETEI MAYEK DIGIT TWO"/* ABF2 */,/*17269*/"MEETEI MAYEK DIGIT THREE"/* ABF3 */, /*17270*/"MEETEI MAYEK DIGIT FOUR"/* ABF4 */,/*17271*/"MEETEI MAYEK DIGIT FIVE"/* ABF5 */, /*17272*/"MEETEI MAYEK DIGIT SIX"/* ABF6 */,/*17273*/"MEETEI MAYEK DIGIT SEVEN"/* ABF7 */, /*17274*/"MEETEI MAYEK DIGIT EIGHT"/* ABF8 */,/*17275*/"MEETEI MAYEK DIGIT NINE"/* ABF9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*17282*/""/* AC00 */,/*17283*/""/* AC01 */,/*17284*/NULL/* AC02 */, /*17285*/NULL/* AC03 */,/*17286*/NULL/* AC04 */,/*17287*/NULL/* AC05 */,/*17288*/NULL/* AC06 */,/*17289*/NULL/* AC07 */, /*17290*/NULL/* AC08 */,/*17291*/NULL/* AC09 */,/*17292*/NULL/* AC0A */,/*17293*/NULL/* AC0B */,/*17294*/NULL/* AC0C */, /*17295*/NULL/* AC0D */,/*17296*/NULL/* AC0E */,/*17297*/NULL/* AC0F */,/*17298*/NULL/* AC10 */,/*17299*/NULL/* AC11 */, /*17300*/NULL/* AC12 */,/*17301*/NULL/* AC13 */,/*17302*/NULL/* AC14 */,/*17303*/NULL/* AC15 */,/*17304*/NULL/* AC16 */, /*17305*/NULL/* AC17 */,/*17306*/NULL/* AC18 */,/*17307*/NULL/* AC19 */,/*17308*/""/* AC1A */, /*17309*/NULL/* AC1B */,/*17310*/""/* AC1C */,/*17311*/""/* AC1D */, /*17312*/NULL/* AC1E */,/*17313*/NULL/* AC1F */,/*17314*/NULL/* AC20 */,/*17315*/NULL/* AC21 */,/*17316*/NULL/* AC22 */, /*17317*/NULL/* AC23 */,/*17318*/NULL/* AC24 */,/*17319*/NULL/* AC25 */,/*17320*/NULL/* AC26 */,/*17321*/NULL/* AC27 */, /*17322*/NULL/* AC28 */,/*17323*/NULL/* AC29 */,/*17324*/NULL/* AC2A */,/*17325*/NULL/* AC2B */,/*17326*/NULL/* AC2C */, /*17327*/NULL/* AC2D */,/*17328*/NULL/* AC2E */,/*17329*/NULL/* AC2F */,/*17330*/NULL/* AC30 */,/*17331*/NULL/* AC31 */, /*17332*/NULL/* AC32 */,/*17333*/NULL/* AC33 */,/*17334*/NULL/* AC34 */,/*17335*/NULL/* AC35 */, /*17336*/""/* AC36 */,/*17337*/NULL/* AC37 */,/*17338*/""/* AC38 */, /*17339*/""/* AC39 */,/*17340*/NULL/* AC3A */,/*17341*/NULL/* AC3B */,/*17342*/NULL/* AC3C */, /*17343*/NULL/* AC3D */,/*17344*/NULL/* AC3E */,/*17345*/NULL/* AC3F */,/*17346*/NULL/* AC40 */,/*17347*/NULL/* AC41 */, /*17348*/NULL/* AC42 */,/*17349*/NULL/* AC43 */,/*17350*/NULL/* AC44 */,/*17351*/NULL/* AC45 */,/*17352*/NULL/* AC46 */, /*17353*/NULL/* AC47 */,/*17354*/NULL/* AC48 */,/*17355*/NULL/* AC49 */,/*17356*/NULL/* AC4A */,/*17357*/NULL/* AC4B */, /*17358*/NULL/* AC4C */,/*17359*/NULL/* AC4D */,/*17360*/NULL/* AC4E */,/*17361*/NULL/* AC4F */,/*17362*/NULL/* AC50 */, /*17363*/NULL/* AC51 */,/*17364*/""/* AC52 */,/*17365*/NULL/* AC53 */, /*17366*/""/* AC54 */,/*17367*/""/* AC55 */,/*17368*/NULL/* AC56 */, /*17369*/NULL/* AC57 */,/*17370*/NULL/* AC58 */,/*17371*/NULL/* AC59 */,/*17372*/NULL/* AC5A */,/*17373*/NULL/* AC5B */, /*17374*/NULL/* AC5C */,/*17375*/NULL/* AC5D */,/*17376*/NULL/* AC5E */,/*17377*/NULL/* AC5F */,/*17378*/NULL/* AC60 */, /*17379*/NULL/* AC61 */,/*17380*/NULL/* AC62 */,/*17381*/NULL/* AC63 */,/*17382*/NULL/* AC64 */,/*17383*/NULL/* AC65 */, /*17384*/NULL/* AC66 */,/*17385*/NULL/* AC67 */,/*17386*/NULL/* AC68 */,/*17387*/NULL/* AC69 */,/*17388*/NULL/* AC6A */, /*17389*/NULL/* AC6B */,/*17390*/NULL/* AC6C */,/*17391*/NULL/* AC6D */,/*17392*/""/* AC6E */, /*17393*/NULL/* AC6F */,/*17394*/""/* AC70 */,/*17395*/""/* AC71 */, /*17396*/NULL/* AC72 */,/*17397*/NULL/* AC73 */,/*17398*/NULL/* AC74 */,/*17399*/NULL/* AC75 */,/*17400*/NULL/* AC76 */, /*17401*/NULL/* AC77 */,/*17402*/NULL/* AC78 */,/*17403*/NULL/* AC79 */,/*17404*/NULL/* AC7A */,/*17405*/NULL/* AC7B */, /*17406*/NULL/* AC7C */,/*17407*/NULL/* AC7D */,/*17408*/NULL/* AC7E */,/*17409*/NULL/* AC7F */,/*17410*/NULL/* AC80 */, /*17411*/NULL/* AC81 */,/*17412*/NULL/* AC82 */,/*17413*/NULL/* AC83 */,/*17414*/NULL/* AC84 */,/*17415*/NULL/* AC85 */, /*17416*/NULL/* AC86 */,/*17417*/NULL/* AC87 */,/*17418*/NULL/* AC88 */,/*17419*/NULL/* AC89 */, /*17420*/""/* AC8A */,/*17421*/NULL/* AC8B */,/*17422*/""/* AC8C */, /*17423*/""/* AC8D */,/*17424*/NULL/* AC8E */,/*17425*/NULL/* AC8F */,/*17426*/NULL/* AC90 */, /*17427*/NULL/* AC91 */,/*17428*/NULL/* AC92 */,/*17429*/NULL/* AC93 */,/*17430*/NULL/* AC94 */,/*17431*/NULL/* AC95 */, /*17432*/NULL/* AC96 */,/*17433*/NULL/* AC97 */,/*17434*/NULL/* AC98 */,/*17435*/NULL/* AC99 */,/*17436*/NULL/* AC9A */, /*17437*/NULL/* AC9B */,/*17438*/NULL/* AC9C */,/*17439*/NULL/* AC9D */,/*17440*/NULL/* AC9E */,/*17441*/NULL/* AC9F */, /*17442*/NULL/* ACA0 */,/*17443*/NULL/* ACA1 */,/*17444*/NULL/* ACA2 */,/*17445*/NULL/* ACA3 */,/*17446*/NULL/* ACA4 */, /*17447*/NULL/* ACA5 */,/*17448*/""/* ACA6 */,/*17449*/NULL/* ACA7 */, /*17450*/""/* ACA8 */,/*17451*/""/* ACA9 */,/*17452*/NULL/* ACAA */, /*17453*/NULL/* ACAB */,/*17454*/NULL/* ACAC */,/*17455*/NULL/* ACAD */,/*17456*/NULL/* ACAE */,/*17457*/NULL/* ACAF */, /*17458*/NULL/* ACB0 */,/*17459*/NULL/* ACB1 */,/*17460*/NULL/* ACB2 */,/*17461*/NULL/* ACB3 */,/*17462*/NULL/* ACB4 */, /*17463*/NULL/* ACB5 */,/*17464*/NULL/* ACB6 */,/*17465*/NULL/* ACB7 */,/*17466*/NULL/* ACB8 */,/*17467*/NULL/* ACB9 */, /*17468*/NULL/* ACBA */,/*17469*/NULL/* ACBB */,/*17470*/NULL/* ACBC */,/*17471*/NULL/* ACBD */,/*17472*/NULL/* ACBE */, /*17473*/NULL/* ACBF */,/*17474*/NULL/* ACC0 */,/*17475*/NULL/* ACC1 */,/*17476*/""/* ACC2 */, /*17477*/NULL/* ACC3 */,/*17478*/""/* ACC4 */,/*17479*/""/* ACC5 */, /*17480*/NULL/* ACC6 */,/*17481*/NULL/* ACC7 */,/*17482*/NULL/* ACC8 */,/*17483*/NULL/* ACC9 */,/*17484*/NULL/* ACCA */, /*17485*/NULL/* ACCB */,/*17486*/NULL/* ACCC */,/*17487*/NULL/* ACCD */,/*17488*/NULL/* ACCE */,/*17489*/NULL/* ACCF */, /*17490*/NULL/* ACD0 */,/*17491*/NULL/* ACD1 */,/*17492*/NULL/* ACD2 */,/*17493*/NULL/* ACD3 */,/*17494*/NULL/* ACD4 */, /*17495*/NULL/* ACD5 */,/*17496*/NULL/* ACD6 */,/*17497*/NULL/* ACD7 */,/*17498*/NULL/* ACD8 */,/*17499*/NULL/* ACD9 */, /*17500*/NULL/* ACDA */,/*17501*/NULL/* ACDB */,/*17502*/NULL/* ACDC */,/*17503*/NULL/* ACDD */, /*17504*/""/* ACDE */,/*17505*/NULL/* ACDF */,/*17506*/""/* ACE0 */, /*17507*/""/* ACE1 */,/*17508*/NULL/* ACE2 */,/*17509*/NULL/* ACE3 */,/*17510*/NULL/* ACE4 */, /*17511*/NULL/* ACE5 */,/*17512*/NULL/* ACE6 */,/*17513*/NULL/* ACE7 */,/*17514*/NULL/* ACE8 */,/*17515*/NULL/* ACE9 */, /*17516*/NULL/* ACEA */,/*17517*/NULL/* ACEB */,/*17518*/NULL/* ACEC */,/*17519*/NULL/* ACED */,/*17520*/NULL/* ACEE */, /*17521*/NULL/* ACEF */,/*17522*/NULL/* ACF0 */,/*17523*/NULL/* ACF1 */,/*17524*/NULL/* ACF2 */,/*17525*/NULL/* ACF3 */, /*17526*/NULL/* ACF4 */,/*17527*/NULL/* ACF5 */,/*17528*/NULL/* ACF6 */,/*17529*/NULL/* ACF7 */,/*17530*/NULL/* ACF8 */, /*17531*/NULL/* ACF9 */,/*17532*/""/* ACFA */,/*17533*/NULL/* ACFB */, /*17534*/""/* ACFC */,/*17535*/""/* ACFD */,/*17536*/NULL/* ACFE */, /*17537*/NULL/* ACFF */,/*17538*/NULL/* AD00 */,/*17539*/NULL/* AD01 */,/*17540*/NULL/* AD02 */,/*17541*/NULL/* AD03 */, /*17542*/NULL/* AD04 */,/*17543*/NULL/* AD05 */,/*17544*/NULL/* AD06 */,/*17545*/NULL/* AD07 */,/*17546*/NULL/* AD08 */, /*17547*/NULL/* AD09 */,/*17548*/NULL/* AD0A */,/*17549*/NULL/* AD0B */,/*17550*/NULL/* AD0C */,/*17551*/NULL/* AD0D */, /*17552*/NULL/* AD0E */,/*17553*/NULL/* AD0F */,/*17554*/NULL/* AD10 */,/*17555*/NULL/* AD11 */,/*17556*/NULL/* AD12 */, /*17557*/NULL/* AD13 */,/*17558*/NULL/* AD14 */,/*17559*/NULL/* AD15 */,/*17560*/""/* AD16 */, /*17561*/NULL/* AD17 */,/*17562*/""/* AD18 */,/*17563*/""/* AD19 */, /*17564*/NULL/* AD1A */,/*17565*/NULL/* AD1B */,/*17566*/NULL/* AD1C */,/*17567*/NULL/* AD1D */,/*17568*/NULL/* AD1E */, /*17569*/NULL/* AD1F */,/*17570*/NULL/* AD20 */,/*17571*/NULL/* AD21 */,/*17572*/NULL/* AD22 */,/*17573*/NULL/* AD23 */, /*17574*/NULL/* AD24 */,/*17575*/NULL/* AD25 */,/*17576*/NULL/* AD26 */,/*17577*/NULL/* AD27 */,/*17578*/NULL/* AD28 */, /*17579*/NULL/* AD29 */,/*17580*/NULL/* AD2A */,/*17581*/NULL/* AD2B */,/*17582*/NULL/* AD2C */,/*17583*/NULL/* AD2D */, /*17584*/NULL/* AD2E */,/*17585*/NULL/* AD2F */,/*17586*/NULL/* AD30 */,/*17587*/NULL/* AD31 */, /*17588*/""/* AD32 */,/*17589*/NULL/* AD33 */,/*17590*/""/* AD34 */, /*17591*/""/* AD35 */,/*17592*/NULL/* AD36 */,/*17593*/NULL/* AD37 */,/*17594*/NULL/* AD38 */, /*17595*/NULL/* AD39 */,/*17596*/NULL/* AD3A */,/*17597*/NULL/* AD3B */,/*17598*/NULL/* AD3C */,/*17599*/NULL/* AD3D */, /*17600*/NULL/* AD3E */,/*17601*/NULL/* AD3F */,/*17602*/NULL/* AD40 */,/*17603*/NULL/* AD41 */,/*17604*/NULL/* AD42 */, /*17605*/NULL/* AD43 */,/*17606*/NULL/* AD44 */,/*17607*/NULL/* AD45 */,/*17608*/NULL/* AD46 */,/*17609*/NULL/* AD47 */, /*17610*/NULL/* AD48 */,/*17611*/NULL/* AD49 */,/*17612*/NULL/* AD4A */,/*17613*/NULL/* AD4B */,/*17614*/NULL/* AD4C */, /*17615*/NULL/* AD4D */,/*17616*/""/* AD4E */,/*17617*/NULL/* AD4F */, /*17618*/""/* AD50 */,/*17619*/""/* AD51 */,/*17620*/NULL/* AD52 */, /*17621*/NULL/* AD53 */,/*17622*/NULL/* AD54 */,/*17623*/NULL/* AD55 */,/*17624*/NULL/* AD56 */,/*17625*/NULL/* AD57 */, /*17626*/NULL/* AD58 */,/*17627*/NULL/* AD59 */,/*17628*/NULL/* AD5A */,/*17629*/NULL/* AD5B */,/*17630*/NULL/* AD5C */, /*17631*/NULL/* AD5D */,/*17632*/NULL/* AD5E */,/*17633*/NULL/* AD5F */,/*17634*/NULL/* AD60 */,/*17635*/NULL/* AD61 */, /*17636*/NULL/* AD62 */,/*17637*/NULL/* AD63 */,/*17638*/NULL/* AD64 */,/*17639*/NULL/* AD65 */,/*17640*/NULL/* AD66 */, /*17641*/NULL/* AD67 */,/*17642*/NULL/* AD68 */,/*17643*/NULL/* AD69 */,/*17644*/""/* AD6A */, /*17645*/NULL/* AD6B */,/*17646*/""/* AD6C */,/*17647*/""/* AD6D */, /*17648*/NULL/* AD6E */,/*17649*/NULL/* AD6F */,/*17650*/NULL/* AD70 */,/*17651*/NULL/* AD71 */,/*17652*/NULL/* AD72 */, /*17653*/NULL/* AD73 */,/*17654*/NULL/* AD74 */,/*17655*/NULL/* AD75 */,/*17656*/NULL/* AD76 */,/*17657*/NULL/* AD77 */, /*17658*/NULL/* AD78 */,/*17659*/NULL/* AD79 */,/*17660*/NULL/* AD7A */,/*17661*/NULL/* AD7B */,/*17662*/NULL/* AD7C */, /*17663*/NULL/* AD7D */,/*17664*/NULL/* AD7E */,/*17665*/NULL/* AD7F */,/*17666*/NULL/* AD80 */,/*17667*/NULL/* AD81 */, /*17668*/NULL/* AD82 */,/*17669*/NULL/* AD83 */,/*17670*/NULL/* AD84 */,/*17671*/NULL/* AD85 */, /*17672*/""/* AD86 */,/*17673*/NULL/* AD87 */,/*17674*/""/* AD88 */, /*17675*/""/* AD89 */,/*17676*/NULL/* AD8A */,/*17677*/NULL/* AD8B */,/*17678*/NULL/* AD8C */, /*17679*/NULL/* AD8D */,/*17680*/NULL/* AD8E */,/*17681*/NULL/* AD8F */,/*17682*/NULL/* AD90 */,/*17683*/NULL/* AD91 */, /*17684*/NULL/* AD92 */,/*17685*/NULL/* AD93 */,/*17686*/NULL/* AD94 */,/*17687*/NULL/* AD95 */,/*17688*/NULL/* AD96 */, /*17689*/NULL/* AD97 */,/*17690*/NULL/* AD98 */,/*17691*/NULL/* AD99 */,/*17692*/NULL/* AD9A */,/*17693*/NULL/* AD9B */, /*17694*/NULL/* AD9C */,/*17695*/NULL/* AD9D */,/*17696*/NULL/* AD9E */,/*17697*/NULL/* AD9F */,/*17698*/NULL/* ADA0 */, /*17699*/NULL/* ADA1 */,/*17700*/""/* ADA2 */,/*17701*/NULL/* ADA3 */, /*17702*/""/* ADA4 */,/*17703*/""/* ADA5 */,/*17704*/NULL/* ADA6 */, /*17705*/NULL/* ADA7 */,/*17706*/NULL/* ADA8 */,/*17707*/NULL/* ADA9 */,/*17708*/NULL/* ADAA */,/*17709*/NULL/* ADAB */, /*17710*/NULL/* ADAC */,/*17711*/NULL/* ADAD */,/*17712*/NULL/* ADAE */,/*17713*/NULL/* ADAF */,/*17714*/NULL/* ADB0 */, /*17715*/NULL/* ADB1 */,/*17716*/NULL/* ADB2 */,/*17717*/NULL/* ADB3 */,/*17718*/NULL/* ADB4 */,/*17719*/NULL/* ADB5 */, /*17720*/NULL/* ADB6 */,/*17721*/NULL/* ADB7 */,/*17722*/NULL/* ADB8 */,/*17723*/NULL/* ADB9 */,/*17724*/NULL/* ADBA */, /*17725*/NULL/* ADBB */,/*17726*/NULL/* ADBC */,/*17727*/NULL/* ADBD */,/*17728*/""/* ADBE */, /*17729*/NULL/* ADBF */,/*17730*/""/* ADC0 */,/*17731*/""/* ADC1 */, /*17732*/NULL/* ADC2 */,/*17733*/NULL/* ADC3 */,/*17734*/NULL/* ADC4 */,/*17735*/NULL/* ADC5 */,/*17736*/NULL/* ADC6 */, /*17737*/NULL/* ADC7 */,/*17738*/NULL/* ADC8 */,/*17739*/NULL/* ADC9 */,/*17740*/NULL/* ADCA */,/*17741*/NULL/* ADCB */, /*17742*/NULL/* ADCC */,/*17743*/NULL/* ADCD */,/*17744*/NULL/* ADCE */,/*17745*/NULL/* ADCF */,/*17746*/NULL/* ADD0 */, /*17747*/NULL/* ADD1 */,/*17748*/NULL/* ADD2 */,/*17749*/NULL/* ADD3 */,/*17750*/NULL/* ADD4 */,/*17751*/NULL/* ADD5 */, /*17752*/NULL/* ADD6 */,/*17753*/NULL/* ADD7 */,/*17754*/NULL/* ADD8 */,/*17755*/NULL/* ADD9 */, /*17756*/""/* ADDA */,/*17757*/NULL/* ADDB */,/*17758*/""/* ADDC */, /*17759*/""/* ADDD */,/*17760*/NULL/* ADDE */,/*17761*/NULL/* ADDF */,/*17762*/NULL/* ADE0 */, /*17763*/NULL/* ADE1 */,/*17764*/NULL/* ADE2 */,/*17765*/NULL/* ADE3 */,/*17766*/NULL/* ADE4 */,/*17767*/NULL/* ADE5 */, /*17768*/NULL/* ADE6 */,/*17769*/NULL/* ADE7 */,/*17770*/NULL/* ADE8 */,/*17771*/NULL/* ADE9 */,/*17772*/NULL/* ADEA */, /*17773*/NULL/* ADEB */,/*17774*/NULL/* ADEC */,/*17775*/NULL/* ADED */,/*17776*/NULL/* ADEE */,/*17777*/NULL/* ADEF */, /*17778*/NULL/* ADF0 */,/*17779*/NULL/* ADF1 */,/*17780*/NULL/* ADF2 */,/*17781*/NULL/* ADF3 */,/*17782*/NULL/* ADF4 */, /*17783*/NULL/* ADF5 */,/*17784*/""/* ADF6 */,/*17785*/NULL/* ADF7 */, /*17786*/""/* ADF8 */,/*17787*/""/* ADF9 */,/*17788*/NULL/* ADFA */, /*17789*/NULL/* ADFB */,/*17790*/NULL/* ADFC */,/*17791*/NULL/* ADFD */,/*17792*/NULL/* ADFE */,/*17793*/NULL/* ADFF */, /*17794*/NULL/* AE00 */,/*17795*/NULL/* AE01 */,/*17796*/NULL/* AE02 */,/*17797*/NULL/* AE03 */,/*17798*/NULL/* AE04 */, /*17799*/NULL/* AE05 */,/*17800*/NULL/* AE06 */,/*17801*/NULL/* AE07 */,/*17802*/NULL/* AE08 */,/*17803*/NULL/* AE09 */, /*17804*/NULL/* AE0A */,/*17805*/NULL/* AE0B */,/*17806*/NULL/* AE0C */,/*17807*/NULL/* AE0D */,/*17808*/NULL/* AE0E */, /*17809*/NULL/* AE0F */,/*17810*/NULL/* AE10 */,/*17811*/NULL/* AE11 */,/*17812*/""/* AE12 */, /*17813*/NULL/* AE13 */,/*17814*/""/* AE14 */,/*17815*/""/* AE15 */, /*17816*/NULL/* AE16 */,/*17817*/NULL/* AE17 */,/*17818*/NULL/* AE18 */,/*17819*/NULL/* AE19 */,/*17820*/NULL/* AE1A */, /*17821*/NULL/* AE1B */,/*17822*/NULL/* AE1C */,/*17823*/NULL/* AE1D */,/*17824*/NULL/* AE1E */,/*17825*/NULL/* AE1F */, /*17826*/NULL/* AE20 */,/*17827*/NULL/* AE21 */,/*17828*/NULL/* AE22 */,/*17829*/NULL/* AE23 */,/*17830*/NULL/* AE24 */, /*17831*/NULL/* AE25 */,/*17832*/NULL/* AE26 */,/*17833*/NULL/* AE27 */,/*17834*/NULL/* AE28 */,/*17835*/NULL/* AE29 */, /*17836*/NULL/* AE2A */,/*17837*/NULL/* AE2B */,/*17838*/NULL/* AE2C */,/*17839*/NULL/* AE2D */, /*17840*/""/* AE2E */,/*17841*/NULL/* AE2F */,/*17842*/""/* AE30 */, /*17843*/""/* AE31 */,/*17844*/NULL/* AE32 */,/*17845*/NULL/* AE33 */,/*17846*/NULL/* AE34 */, /*17847*/NULL/* AE35 */,/*17848*/NULL/* AE36 */,/*17849*/NULL/* AE37 */,/*17850*/NULL/* AE38 */,/*17851*/NULL/* AE39 */, /*17852*/NULL/* AE3A */,/*17853*/NULL/* AE3B */,/*17854*/NULL/* AE3C */,/*17855*/NULL/* AE3D */,/*17856*/NULL/* AE3E */, /*17857*/NULL/* AE3F */,/*17858*/NULL/* AE40 */,/*17859*/NULL/* AE41 */,/*17860*/NULL/* AE42 */,/*17861*/NULL/* AE43 */, /*17862*/NULL/* AE44 */,/*17863*/NULL/* AE45 */,/*17864*/NULL/* AE46 */,/*17865*/NULL/* AE47 */,/*17866*/NULL/* AE48 */, /*17867*/NULL/* AE49 */,/*17868*/""/* AE4A */,/*17869*/NULL/* AE4B */, /*17870*/""/* AE4C */,/*17871*/""/* AE4D */,/*17872*/NULL/* AE4E */, /*17873*/NULL/* AE4F */,/*17874*/NULL/* AE50 */,/*17875*/NULL/* AE51 */,/*17876*/NULL/* AE52 */,/*17877*/NULL/* AE53 */, /*17878*/NULL/* AE54 */,/*17879*/NULL/* AE55 */,/*17880*/NULL/* AE56 */,/*17881*/NULL/* AE57 */,/*17882*/NULL/* AE58 */, /*17883*/NULL/* AE59 */,/*17884*/NULL/* AE5A */,/*17885*/NULL/* AE5B */,/*17886*/NULL/* AE5C */,/*17887*/NULL/* AE5D */, /*17888*/NULL/* AE5E */,/*17889*/NULL/* AE5F */,/*17890*/NULL/* AE60 */,/*17891*/NULL/* AE61 */,/*17892*/NULL/* AE62 */, /*17893*/NULL/* AE63 */,/*17894*/NULL/* AE64 */,/*17895*/NULL/* AE65 */,/*17896*/""/* AE66 */, /*17897*/NULL/* AE67 */,/*17898*/""/* AE68 */,/*17899*/""/* AE69 */, /*17900*/NULL/* AE6A */,/*17901*/NULL/* AE6B */,/*17902*/NULL/* AE6C */,/*17903*/NULL/* AE6D */,/*17904*/NULL/* AE6E */, /*17905*/NULL/* AE6F */,/*17906*/NULL/* AE70 */,/*17907*/NULL/* AE71 */,/*17908*/NULL/* AE72 */,/*17909*/NULL/* AE73 */, /*17910*/NULL/* AE74 */,/*17911*/NULL/* AE75 */,/*17912*/NULL/* AE76 */,/*17913*/NULL/* AE77 */,/*17914*/NULL/* AE78 */, /*17915*/NULL/* AE79 */,/*17916*/NULL/* AE7A */,/*17917*/NULL/* AE7B */,/*17918*/NULL/* AE7C */,/*17919*/NULL/* AE7D */, /*17920*/NULL/* AE7E */,/*17921*/NULL/* AE7F */,/*17922*/NULL/* AE80 */,/*17923*/NULL/* AE81 */, /*17924*/""/* AE82 */,/*17925*/NULL/* AE83 */,/*17926*/""/* AE84 */, /*17927*/""/* AE85 */,/*17928*/NULL/* AE86 */,/*17929*/NULL/* AE87 */,/*17930*/NULL/* AE88 */, /*17931*/NULL/* AE89 */,/*17932*/NULL/* AE8A */,/*17933*/NULL/* AE8B */,/*17934*/NULL/* AE8C */,/*17935*/NULL/* AE8D */, /*17936*/NULL/* AE8E */,/*17937*/NULL/* AE8F */,/*17938*/NULL/* AE90 */,/*17939*/NULL/* AE91 */,/*17940*/NULL/* AE92 */, /*17941*/NULL/* AE93 */,/*17942*/NULL/* AE94 */,/*17943*/NULL/* AE95 */,/*17944*/NULL/* AE96 */,/*17945*/NULL/* AE97 */, /*17946*/NULL/* AE98 */,/*17947*/NULL/* AE99 */,/*17948*/NULL/* AE9A */,/*17949*/NULL/* AE9B */,/*17950*/NULL/* AE9C */, /*17951*/NULL/* AE9D */,/*17952*/""/* AE9E */,/*17953*/NULL/* AE9F */, /*17954*/""/* AEA0 */,/*17955*/""/* AEA1 */,/*17956*/NULL/* AEA2 */, /*17957*/NULL/* AEA3 */,/*17958*/NULL/* AEA4 */,/*17959*/NULL/* AEA5 */,/*17960*/NULL/* AEA6 */,/*17961*/NULL/* AEA7 */, /*17962*/NULL/* AEA8 */,/*17963*/NULL/* AEA9 */,/*17964*/NULL/* AEAA */,/*17965*/NULL/* AEAB */,/*17966*/NULL/* AEAC */, /*17967*/NULL/* AEAD */,/*17968*/NULL/* AEAE */,/*17969*/NULL/* AEAF */,/*17970*/NULL/* AEB0 */,/*17971*/NULL/* AEB1 */, /*17972*/NULL/* AEB2 */,/*17973*/NULL/* AEB3 */,/*17974*/NULL/* AEB4 */,/*17975*/NULL/* AEB5 */,/*17976*/NULL/* AEB6 */, /*17977*/NULL/* AEB7 */,/*17978*/NULL/* AEB8 */,/*17979*/NULL/* AEB9 */,/*17980*/""/* AEBA */, /*17981*/NULL/* AEBB */,/*17982*/""/* AEBC */,/*17983*/""/* AEBD */, /*17984*/NULL/* AEBE */,/*17985*/NULL/* AEBF */,/*17986*/NULL/* AEC0 */,/*17987*/NULL/* AEC1 */,/*17988*/NULL/* AEC2 */, /*17989*/NULL/* AEC3 */,/*17990*/NULL/* AEC4 */,/*17991*/NULL/* AEC5 */,/*17992*/NULL/* AEC6 */,/*17993*/NULL/* AEC7 */, /*17994*/NULL/* AEC8 */,/*17995*/NULL/* AEC9 */,/*17996*/NULL/* AECA */,/*17997*/NULL/* AECB */,/*17998*/NULL/* AECC */, /*17999*/NULL/* AECD */,/*18000*/NULL/* AECE */,/*18001*/NULL/* AECF */,/*18002*/NULL/* AED0 */,/*18003*/NULL/* AED1 */, /*18004*/NULL/* AED2 */,/*18005*/NULL/* AED3 */,/*18006*/NULL/* AED4 */,/*18007*/NULL/* AED5 */, /*18008*/""/* AED6 */,/*18009*/NULL/* AED7 */,/*18010*/""/* AED8 */, /*18011*/""/* AED9 */,/*18012*/NULL/* AEDA */,/*18013*/NULL/* AEDB */,/*18014*/NULL/* AEDC */, /*18015*/NULL/* AEDD */,/*18016*/NULL/* AEDE */,/*18017*/NULL/* AEDF */,/*18018*/NULL/* AEE0 */,/*18019*/NULL/* AEE1 */, /*18020*/NULL/* AEE2 */,/*18021*/NULL/* AEE3 */,/*18022*/NULL/* AEE4 */,/*18023*/NULL/* AEE5 */,/*18024*/NULL/* AEE6 */, /*18025*/NULL/* AEE7 */,/*18026*/NULL/* AEE8 */,/*18027*/NULL/* AEE9 */,/*18028*/NULL/* AEEA */,/*18029*/NULL/* AEEB */, /*18030*/NULL/* AEEC */,/*18031*/NULL/* AEED */,/*18032*/NULL/* AEEE */,/*18033*/NULL/* AEEF */,/*18034*/NULL/* AEF0 */, /*18035*/NULL/* AEF1 */,/*18036*/""/* AEF2 */,/*18037*/NULL/* AEF3 */, /*18038*/""/* AEF4 */,/*18039*/""/* AEF5 */,/*18040*/NULL/* AEF6 */, /*18041*/NULL/* AEF7 */,/*18042*/NULL/* AEF8 */,/*18043*/NULL/* AEF9 */,/*18044*/NULL/* AEFA */,/*18045*/NULL/* AEFB */, /*18046*/NULL/* AEFC */,/*18047*/NULL/* AEFD */,/*18048*/NULL/* AEFE */,/*18049*/NULL/* AEFF */,/*18050*/NULL/* AF00 */, /*18051*/NULL/* AF01 */,/*18052*/NULL/* AF02 */,/*18053*/NULL/* AF03 */,/*18054*/NULL/* AF04 */,/*18055*/NULL/* AF05 */, /*18056*/NULL/* AF06 */,/*18057*/NULL/* AF07 */,/*18058*/NULL/* AF08 */,/*18059*/NULL/* AF09 */,/*18060*/NULL/* AF0A */, /*18061*/NULL/* AF0B */,/*18062*/NULL/* AF0C */,/*18063*/NULL/* AF0D */,/*18064*/""/* AF0E */, /*18065*/NULL/* AF0F */,/*18066*/""/* AF10 */,/*18067*/""/* AF11 */, /*18068*/NULL/* AF12 */,/*18069*/NULL/* AF13 */,/*18070*/NULL/* AF14 */,/*18071*/NULL/* AF15 */,/*18072*/NULL/* AF16 */, /*18073*/NULL/* AF17 */,/*18074*/NULL/* AF18 */,/*18075*/NULL/* AF19 */,/*18076*/NULL/* AF1A */,/*18077*/NULL/* AF1B */, /*18078*/NULL/* AF1C */,/*18079*/NULL/* AF1D */,/*18080*/NULL/* AF1E */,/*18081*/NULL/* AF1F */,/*18082*/NULL/* AF20 */, /*18083*/NULL/* AF21 */,/*18084*/NULL/* AF22 */,/*18085*/NULL/* AF23 */,/*18086*/NULL/* AF24 */,/*18087*/NULL/* AF25 */, /*18088*/NULL/* AF26 */,/*18089*/NULL/* AF27 */,/*18090*/NULL/* AF28 */,/*18091*/NULL/* AF29 */, /*18092*/""/* AF2A */,/*18093*/NULL/* AF2B */,/*18094*/""/* AF2C */, /*18095*/""/* AF2D */,/*18096*/NULL/* AF2E */,/*18097*/NULL/* AF2F */,/*18098*/NULL/* AF30 */, /*18099*/NULL/* AF31 */,/*18100*/NULL/* AF32 */,/*18101*/NULL/* AF33 */,/*18102*/NULL/* AF34 */,/*18103*/NULL/* AF35 */, /*18104*/NULL/* AF36 */,/*18105*/NULL/* AF37 */,/*18106*/NULL/* AF38 */,/*18107*/NULL/* AF39 */,/*18108*/NULL/* AF3A */, /*18109*/NULL/* AF3B */,/*18110*/NULL/* AF3C */,/*18111*/NULL/* AF3D */,/*18112*/NULL/* AF3E */,/*18113*/NULL/* AF3F */, /*18114*/NULL/* AF40 */,/*18115*/NULL/* AF41 */,/*18116*/NULL/* AF42 */,/*18117*/NULL/* AF43 */,/*18118*/NULL/* AF44 */, /*18119*/NULL/* AF45 */,/*18120*/""/* AF46 */,/*18121*/NULL/* AF47 */, /*18122*/""/* AF48 */,/*18123*/""/* AF49 */,/*18124*/NULL/* AF4A */, /*18125*/NULL/* AF4B */,/*18126*/NULL/* AF4C */,/*18127*/NULL/* AF4D */,/*18128*/NULL/* AF4E */,/*18129*/NULL/* AF4F */, /*18130*/NULL/* AF50 */,/*18131*/NULL/* AF51 */,/*18132*/NULL/* AF52 */,/*18133*/NULL/* AF53 */,/*18134*/NULL/* AF54 */, /*18135*/NULL/* AF55 */,/*18136*/NULL/* AF56 */,/*18137*/NULL/* AF57 */,/*18138*/NULL/* AF58 */,/*18139*/NULL/* AF59 */, /*18140*/NULL/* AF5A */,/*18141*/NULL/* AF5B */,/*18142*/NULL/* AF5C */,/*18143*/NULL/* AF5D */,/*18144*/NULL/* AF5E */, /*18145*/NULL/* AF5F */,/*18146*/NULL/* AF60 */,/*18147*/NULL/* AF61 */,/*18148*/""/* AF62 */, /*18149*/NULL/* AF63 */,/*18150*/""/* AF64 */,/*18151*/""/* AF65 */, /*18152*/NULL/* AF66 */,/*18153*/NULL/* AF67 */,/*18154*/NULL/* AF68 */,/*18155*/NULL/* AF69 */,/*18156*/NULL/* AF6A */, /*18157*/NULL/* AF6B */,/*18158*/NULL/* AF6C */,/*18159*/NULL/* AF6D */,/*18160*/NULL/* AF6E */,/*18161*/NULL/* AF6F */, /*18162*/NULL/* AF70 */,/*18163*/NULL/* AF71 */,/*18164*/NULL/* AF72 */,/*18165*/NULL/* AF73 */,/*18166*/NULL/* AF74 */, /*18167*/NULL/* AF75 */,/*18168*/NULL/* AF76 */,/*18169*/NULL/* AF77 */,/*18170*/NULL/* AF78 */,/*18171*/NULL/* AF79 */, /*18172*/NULL/* AF7A */,/*18173*/NULL/* AF7B */,/*18174*/NULL/* AF7C */,/*18175*/NULL/* AF7D */, /*18176*/""/* AF7E */,/*18177*/NULL/* AF7F */,/*18178*/""/* AF80 */, /*18179*/""/* AF81 */,/*18180*/NULL/* AF82 */,/*18181*/NULL/* AF83 */,/*18182*/NULL/* AF84 */, /*18183*/NULL/* AF85 */,/*18184*/NULL/* AF86 */,/*18185*/NULL/* AF87 */,/*18186*/NULL/* AF88 */,/*18187*/NULL/* AF89 */, /*18188*/NULL/* AF8A */,/*18189*/NULL/* AF8B */,/*18190*/NULL/* AF8C */,/*18191*/NULL/* AF8D */,/*18192*/NULL/* AF8E */, /*18193*/NULL/* AF8F */,/*18194*/NULL/* AF90 */,/*18195*/NULL/* AF91 */,/*18196*/NULL/* AF92 */,/*18197*/NULL/* AF93 */, /*18198*/NULL/* AF94 */,/*18199*/NULL/* AF95 */,/*18200*/NULL/* AF96 */,/*18201*/NULL/* AF97 */,/*18202*/NULL/* AF98 */, /*18203*/NULL/* AF99 */,/*18204*/""/* AF9A */,/*18205*/NULL/* AF9B */, /*18206*/""/* AF9C */,/*18207*/""/* AF9D */,/*18208*/NULL/* AF9E */, /*18209*/NULL/* AF9F */,/*18210*/NULL/* AFA0 */,/*18211*/NULL/* AFA1 */,/*18212*/NULL/* AFA2 */,/*18213*/NULL/* AFA3 */, /*18214*/NULL/* AFA4 */,/*18215*/NULL/* AFA5 */,/*18216*/NULL/* AFA6 */,/*18217*/NULL/* AFA7 */,/*18218*/NULL/* AFA8 */, /*18219*/NULL/* AFA9 */,/*18220*/NULL/* AFAA */,/*18221*/NULL/* AFAB */,/*18222*/NULL/* AFAC */,/*18223*/NULL/* AFAD */, /*18224*/NULL/* AFAE */,/*18225*/NULL/* AFAF */,/*18226*/NULL/* AFB0 */,/*18227*/NULL/* AFB1 */,/*18228*/NULL/* AFB2 */, /*18229*/NULL/* AFB3 */,/*18230*/NULL/* AFB4 */,/*18231*/NULL/* AFB5 */,/*18232*/""/* AFB6 */, /*18233*/NULL/* AFB7 */,/*18234*/""/* AFB8 */,/*18235*/""/* AFB9 */, /*18236*/NULL/* AFBA */,/*18237*/NULL/* AFBB */,/*18238*/NULL/* AFBC */,/*18239*/NULL/* AFBD */,/*18240*/NULL/* AFBE */, /*18241*/NULL/* AFBF */,/*18242*/NULL/* AFC0 */,/*18243*/NULL/* AFC1 */,/*18244*/NULL/* AFC2 */,/*18245*/NULL/* AFC3 */, /*18246*/NULL/* AFC4 */,/*18247*/NULL/* AFC5 */,/*18248*/NULL/* AFC6 */,/*18249*/NULL/* AFC7 */,/*18250*/NULL/* AFC8 */, /*18251*/NULL/* AFC9 */,/*18252*/NULL/* AFCA */,/*18253*/NULL/* AFCB */,/*18254*/NULL/* AFCC */,/*18255*/NULL/* AFCD */, /*18256*/NULL/* AFCE */,/*18257*/NULL/* AFCF */,/*18258*/NULL/* AFD0 */,/*18259*/NULL/* AFD1 */, /*18260*/""/* AFD2 */,/*18261*/NULL/* AFD3 */,/*18262*/""/* AFD4 */, /*18263*/""/* AFD5 */,/*18264*/NULL/* AFD6 */,/*18265*/NULL/* AFD7 */,/*18266*/NULL/* AFD8 */, /*18267*/NULL/* AFD9 */,/*18268*/NULL/* AFDA */,/*18269*/NULL/* AFDB */,/*18270*/NULL/* AFDC */,/*18271*/NULL/* AFDD */, /*18272*/NULL/* AFDE */,/*18273*/NULL/* AFDF */,/*18274*/NULL/* AFE0 */,/*18275*/NULL/* AFE1 */,/*18276*/NULL/* AFE2 */, /*18277*/NULL/* AFE3 */,/*18278*/NULL/* AFE4 */,/*18279*/NULL/* AFE5 */,/*18280*/NULL/* AFE6 */,/*18281*/NULL/* AFE7 */, /*18282*/NULL/* AFE8 */,/*18283*/NULL/* AFE9 */,/*18284*/NULL/* AFEA */,/*18285*/NULL/* AFEB */,/*18286*/NULL/* AFEC */, /*18287*/NULL/* AFED */,/*18288*/""/* AFEE */,/*18289*/NULL/* AFEF */, /*18290*/""/* AFF0 */,/*18291*/""/* AFF1 */,/*18292*/NULL/* AFF2 */, /*18293*/NULL/* AFF3 */,/*18294*/NULL/* AFF4 */,/*18295*/NULL/* AFF5 */,/*18296*/NULL/* AFF6 */,/*18297*/NULL/* AFF7 */, /*18298*/NULL/* AFF8 */,/*18299*/NULL/* AFF9 */,/*18300*/NULL/* AFFA */,/*18301*/NULL/* AFFB */,/*18302*/NULL/* AFFC */, /*18303*/NULL/* AFFD */,/*18304*/NULL/* AFFE */,/*18305*/NULL/* AFFF */,/*18306*/NULL/* B000 */,/*18307*/NULL/* B001 */, /*18308*/NULL/* B002 */,/*18309*/NULL/* B003 */,/*18310*/NULL/* B004 */,/*18311*/NULL/* B005 */,/*18312*/NULL/* B006 */, /*18313*/NULL/* B007 */,/*18314*/NULL/* B008 */,/*18315*/NULL/* B009 */,/*18316*/""/* B00A */, /*18317*/NULL/* B00B */,/*18318*/""/* B00C */,/*18319*/""/* B00D */, /*18320*/NULL/* B00E */,/*18321*/NULL/* B00F */,/*18322*/NULL/* B010 */,/*18323*/NULL/* B011 */,/*18324*/NULL/* B012 */, /*18325*/NULL/* B013 */,/*18326*/NULL/* B014 */,/*18327*/NULL/* B015 */,/*18328*/NULL/* B016 */,/*18329*/NULL/* B017 */, /*18330*/NULL/* B018 */,/*18331*/NULL/* B019 */,/*18332*/NULL/* B01A */,/*18333*/NULL/* B01B */,/*18334*/NULL/* B01C */, /*18335*/NULL/* B01D */,/*18336*/NULL/* B01E */,/*18337*/NULL/* B01F */,/*18338*/NULL/* B020 */,/*18339*/NULL/* B021 */, /*18340*/NULL/* B022 */,/*18341*/NULL/* B023 */,/*18342*/NULL/* B024 */,/*18343*/NULL/* B025 */, /*18344*/""/* B026 */,/*18345*/NULL/* B027 */,/*18346*/""/* B028 */, /*18347*/""/* B029 */,/*18348*/NULL/* B02A */,/*18349*/NULL/* B02B */,/*18350*/NULL/* B02C */, /*18351*/NULL/* B02D */,/*18352*/NULL/* B02E */,/*18353*/NULL/* B02F */,/*18354*/NULL/* B030 */,/*18355*/NULL/* B031 */, /*18356*/NULL/* B032 */,/*18357*/NULL/* B033 */,/*18358*/NULL/* B034 */,/*18359*/NULL/* B035 */,/*18360*/NULL/* B036 */, /*18361*/NULL/* B037 */,/*18362*/NULL/* B038 */,/*18363*/NULL/* B039 */,/*18364*/NULL/* B03A */,/*18365*/NULL/* B03B */, /*18366*/NULL/* B03C */,/*18367*/NULL/* B03D */,/*18368*/NULL/* B03E */,/*18369*/NULL/* B03F */,/*18370*/NULL/* B040 */, /*18371*/NULL/* B041 */,/*18372*/""/* B042 */,/*18373*/NULL/* B043 */, /*18374*/""/* B044 */,/*18375*/""/* B045 */,/*18376*/NULL/* B046 */, /*18377*/NULL/* B047 */,/*18378*/NULL/* B048 */,/*18379*/NULL/* B049 */,/*18380*/NULL/* B04A */,/*18381*/NULL/* B04B */, /*18382*/NULL/* B04C */,/*18383*/NULL/* B04D */,/*18384*/NULL/* B04E */,/*18385*/NULL/* B04F */,/*18386*/NULL/* B050 */, /*18387*/NULL/* B051 */,/*18388*/NULL/* B052 */,/*18389*/NULL/* B053 */,/*18390*/NULL/* B054 */,/*18391*/NULL/* B055 */, /*18392*/NULL/* B056 */,/*18393*/NULL/* B057 */,/*18394*/NULL/* B058 */,/*18395*/NULL/* B059 */,/*18396*/NULL/* B05A */, /*18397*/NULL/* B05B */,/*18398*/NULL/* B05C */,/*18399*/NULL/* B05D */,/*18400*/""/* B05E */, /*18401*/NULL/* B05F */,/*18402*/""/* B060 */,/*18403*/""/* B061 */, /*18404*/NULL/* B062 */,/*18405*/NULL/* B063 */,/*18406*/NULL/* B064 */,/*18407*/NULL/* B065 */,/*18408*/NULL/* B066 */, /*18409*/NULL/* B067 */,/*18410*/NULL/* B068 */,/*18411*/NULL/* B069 */,/*18412*/NULL/* B06A */,/*18413*/NULL/* B06B */, /*18414*/NULL/* B06C */,/*18415*/NULL/* B06D */,/*18416*/NULL/* B06E */,/*18417*/NULL/* B06F */,/*18418*/NULL/* B070 */, /*18419*/NULL/* B071 */,/*18420*/NULL/* B072 */,/*18421*/NULL/* B073 */,/*18422*/NULL/* B074 */,/*18423*/NULL/* B075 */, /*18424*/NULL/* B076 */,/*18425*/NULL/* B077 */,/*18426*/NULL/* B078 */,/*18427*/NULL/* B079 */, /*18428*/""/* B07A */,/*18429*/NULL/* B07B */,/*18430*/""/* B07C */, /*18431*/""/* B07D */,/*18432*/NULL/* B07E */,/*18433*/NULL/* B07F */,/*18434*/NULL/* B080 */, /*18435*/NULL/* B081 */,/*18436*/NULL/* B082 */,/*18437*/NULL/* B083 */,/*18438*/NULL/* B084 */,/*18439*/NULL/* B085 */, /*18440*/NULL/* B086 */,/*18441*/NULL/* B087 */,/*18442*/NULL/* B088 */,/*18443*/NULL/* B089 */,/*18444*/NULL/* B08A */, /*18445*/NULL/* B08B */,/*18446*/NULL/* B08C */,/*18447*/NULL/* B08D */,/*18448*/NULL/* B08E */,/*18449*/NULL/* B08F */, /*18450*/NULL/* B090 */,/*18451*/NULL/* B091 */,/*18452*/NULL/* B092 */,/*18453*/NULL/* B093 */,/*18454*/NULL/* B094 */, /*18455*/NULL/* B095 */,/*18456*/""/* B096 */,/*18457*/NULL/* B097 */, /*18458*/""/* B098 */,/*18459*/""/* B099 */,/*18460*/NULL/* B09A */, /*18461*/NULL/* B09B */,/*18462*/NULL/* B09C */,/*18463*/NULL/* B09D */,/*18464*/NULL/* B09E */,/*18465*/NULL/* B09F */, /*18466*/NULL/* B0A0 */,/*18467*/NULL/* B0A1 */,/*18468*/NULL/* B0A2 */,/*18469*/NULL/* B0A3 */,/*18470*/NULL/* B0A4 */, /*18471*/NULL/* B0A5 */,/*18472*/NULL/* B0A6 */,/*18473*/NULL/* B0A7 */,/*18474*/NULL/* B0A8 */,/*18475*/NULL/* B0A9 */, /*18476*/NULL/* B0AA */,/*18477*/NULL/* B0AB */,/*18478*/NULL/* B0AC */,/*18479*/NULL/* B0AD */,/*18480*/NULL/* B0AE */, /*18481*/NULL/* B0AF */,/*18482*/NULL/* B0B0 */,/*18483*/NULL/* B0B1 */,/*18484*/""/* B0B2 */, /*18485*/NULL/* B0B3 */,/*18486*/""/* B0B4 */,/*18487*/""/* B0B5 */, /*18488*/NULL/* B0B6 */,/*18489*/NULL/* B0B7 */,/*18490*/NULL/* B0B8 */,/*18491*/NULL/* B0B9 */,/*18492*/NULL/* B0BA */, /*18493*/NULL/* B0BB */,/*18494*/NULL/* B0BC */,/*18495*/NULL/* B0BD */,/*18496*/NULL/* B0BE */,/*18497*/NULL/* B0BF */, /*18498*/NULL/* B0C0 */,/*18499*/NULL/* B0C1 */,/*18500*/NULL/* B0C2 */,/*18501*/NULL/* B0C3 */,/*18502*/NULL/* B0C4 */, /*18503*/NULL/* B0C5 */,/*18504*/NULL/* B0C6 */,/*18505*/NULL/* B0C7 */,/*18506*/NULL/* B0C8 */,/*18507*/NULL/* B0C9 */, /*18508*/NULL/* B0CA */,/*18509*/NULL/* B0CB */,/*18510*/NULL/* B0CC */,/*18511*/NULL/* B0CD */, /*18512*/""/* B0CE */,/*18513*/NULL/* B0CF */,/*18514*/""/* B0D0 */, /*18515*/""/* B0D1 */,/*18516*/NULL/* B0D2 */,/*18517*/NULL/* B0D3 */,/*18518*/NULL/* B0D4 */, /*18519*/NULL/* B0D5 */,/*18520*/NULL/* B0D6 */,/*18521*/NULL/* B0D7 */,/*18522*/NULL/* B0D8 */,/*18523*/NULL/* B0D9 */, /*18524*/NULL/* B0DA */,/*18525*/NULL/* B0DB */,/*18526*/NULL/* B0DC */,/*18527*/NULL/* B0DD */,/*18528*/NULL/* B0DE */, /*18529*/NULL/* B0DF */,/*18530*/NULL/* B0E0 */,/*18531*/NULL/* B0E1 */,/*18532*/NULL/* B0E2 */,/*18533*/NULL/* B0E3 */, /*18534*/NULL/* B0E4 */,/*18535*/NULL/* B0E5 */,/*18536*/NULL/* B0E6 */,/*18537*/NULL/* B0E7 */,/*18538*/NULL/* B0E8 */, /*18539*/NULL/* B0E9 */,/*18540*/""/* B0EA */,/*18541*/NULL/* B0EB */, /*18542*/""/* B0EC */,/*18543*/""/* B0ED */,/*18544*/NULL/* B0EE */, /*18545*/NULL/* B0EF */,/*18546*/NULL/* B0F0 */,/*18547*/NULL/* B0F1 */,/*18548*/NULL/* B0F2 */,/*18549*/NULL/* B0F3 */, /*18550*/NULL/* B0F4 */,/*18551*/NULL/* B0F5 */,/*18552*/NULL/* B0F6 */,/*18553*/NULL/* B0F7 */,/*18554*/NULL/* B0F8 */, /*18555*/NULL/* B0F9 */,/*18556*/NULL/* B0FA */,/*18557*/NULL/* B0FB */,/*18558*/NULL/* B0FC */,/*18559*/NULL/* B0FD */, /*18560*/NULL/* B0FE */,/*18561*/NULL/* B0FF */,/*18562*/NULL/* B100 */,/*18563*/NULL/* B101 */,/*18564*/NULL/* B102 */, /*18565*/NULL/* B103 */,/*18566*/NULL/* B104 */,/*18567*/NULL/* B105 */,/*18568*/""/* B106 */, /*18569*/NULL/* B107 */,/*18570*/""/* B108 */,/*18571*/""/* B109 */, /*18572*/NULL/* B10A */,/*18573*/NULL/* B10B */,/*18574*/NULL/* B10C */,/*18575*/NULL/* B10D */,/*18576*/NULL/* B10E */, /*18577*/NULL/* B10F */,/*18578*/NULL/* B110 */,/*18579*/NULL/* B111 */,/*18580*/NULL/* B112 */,/*18581*/NULL/* B113 */, /*18582*/NULL/* B114 */,/*18583*/NULL/* B115 */,/*18584*/NULL/* B116 */,/*18585*/NULL/* B117 */,/*18586*/NULL/* B118 */, /*18587*/NULL/* B119 */,/*18588*/NULL/* B11A */,/*18589*/NULL/* B11B */,/*18590*/NULL/* B11C */,/*18591*/NULL/* B11D */, /*18592*/NULL/* B11E */,/*18593*/NULL/* B11F */,/*18594*/NULL/* B120 */,/*18595*/NULL/* B121 */, /*18596*/""/* B122 */,/*18597*/NULL/* B123 */,/*18598*/""/* B124 */, /*18599*/""/* B125 */,/*18600*/NULL/* B126 */,/*18601*/NULL/* B127 */,/*18602*/NULL/* B128 */, /*18603*/NULL/* B129 */,/*18604*/NULL/* B12A */,/*18605*/NULL/* B12B */,/*18606*/NULL/* B12C */,/*18607*/NULL/* B12D */, /*18608*/NULL/* B12E */,/*18609*/NULL/* B12F */,/*18610*/NULL/* B130 */,/*18611*/NULL/* B131 */,/*18612*/NULL/* B132 */, /*18613*/NULL/* B133 */,/*18614*/NULL/* B134 */,/*18615*/NULL/* B135 */,/*18616*/NULL/* B136 */,/*18617*/NULL/* B137 */, /*18618*/NULL/* B138 */,/*18619*/NULL/* B139 */,/*18620*/NULL/* B13A */,/*18621*/NULL/* B13B */,/*18622*/NULL/* B13C */, /*18623*/NULL/* B13D */,/*18624*/""/* B13E */,/*18625*/NULL/* B13F */, /*18626*/""/* B140 */,/*18627*/""/* B141 */,/*18628*/NULL/* B142 */, /*18629*/NULL/* B143 */,/*18630*/NULL/* B144 */,/*18631*/NULL/* B145 */,/*18632*/NULL/* B146 */,/*18633*/NULL/* B147 */, /*18634*/NULL/* B148 */,/*18635*/NULL/* B149 */,/*18636*/NULL/* B14A */,/*18637*/NULL/* B14B */,/*18638*/NULL/* B14C */, /*18639*/NULL/* B14D */,/*18640*/NULL/* B14E */,/*18641*/NULL/* B14F */,/*18642*/NULL/* B150 */,/*18643*/NULL/* B151 */, /*18644*/NULL/* B152 */,/*18645*/NULL/* B153 */,/*18646*/NULL/* B154 */,/*18647*/NULL/* B155 */,/*18648*/NULL/* B156 */, /*18649*/NULL/* B157 */,/*18650*/NULL/* B158 */,/*18651*/NULL/* B159 */,/*18652*/""/* B15A */, /*18653*/NULL/* B15B */,/*18654*/""/* B15C */,/*18655*/""/* B15D */, /*18656*/NULL/* B15E */,/*18657*/NULL/* B15F */,/*18658*/NULL/* B160 */,/*18659*/NULL/* B161 */,/*18660*/NULL/* B162 */, /*18661*/NULL/* B163 */,/*18662*/NULL/* B164 */,/*18663*/NULL/* B165 */,/*18664*/NULL/* B166 */,/*18665*/NULL/* B167 */, /*18666*/NULL/* B168 */,/*18667*/NULL/* B169 */,/*18668*/NULL/* B16A */,/*18669*/NULL/* B16B */,/*18670*/NULL/* B16C */, /*18671*/NULL/* B16D */,/*18672*/NULL/* B16E */,/*18673*/NULL/* B16F */,/*18674*/NULL/* B170 */,/*18675*/NULL/* B171 */, /*18676*/NULL/* B172 */,/*18677*/NULL/* B173 */,/*18678*/NULL/* B174 */,/*18679*/NULL/* B175 */, /*18680*/""/* B176 */,/*18681*/NULL/* B177 */,/*18682*/""/* B178 */, /*18683*/""/* B179 */,/*18684*/NULL/* B17A */,/*18685*/NULL/* B17B */,/*18686*/NULL/* B17C */, /*18687*/NULL/* B17D */,/*18688*/NULL/* B17E */,/*18689*/NULL/* B17F */,/*18690*/NULL/* B180 */,/*18691*/NULL/* B181 */, /*18692*/NULL/* B182 */,/*18693*/NULL/* B183 */,/*18694*/NULL/* B184 */,/*18695*/NULL/* B185 */,/*18696*/NULL/* B186 */, /*18697*/NULL/* B187 */,/*18698*/NULL/* B188 */,/*18699*/NULL/* B189 */,/*18700*/NULL/* B18A */,/*18701*/NULL/* B18B */, /*18702*/NULL/* B18C */,/*18703*/NULL/* B18D */,/*18704*/NULL/* B18E */,/*18705*/NULL/* B18F */,/*18706*/NULL/* B190 */, /*18707*/NULL/* B191 */,/*18708*/""/* B192 */,/*18709*/NULL/* B193 */, /*18710*/""/* B194 */,/*18711*/""/* B195 */,/*18712*/NULL/* B196 */, /*18713*/NULL/* B197 */,/*18714*/NULL/* B198 */,/*18715*/NULL/* B199 */,/*18716*/NULL/* B19A */,/*18717*/NULL/* B19B */, /*18718*/NULL/* B19C */,/*18719*/NULL/* B19D */,/*18720*/NULL/* B19E */,/*18721*/NULL/* B19F */,/*18722*/NULL/* B1A0 */, /*18723*/NULL/* B1A1 */,/*18724*/NULL/* B1A2 */,/*18725*/NULL/* B1A3 */,/*18726*/NULL/* B1A4 */,/*18727*/NULL/* B1A5 */, /*18728*/NULL/* B1A6 */,/*18729*/NULL/* B1A7 */,/*18730*/NULL/* B1A8 */,/*18731*/NULL/* B1A9 */,/*18732*/NULL/* B1AA */, /*18733*/NULL/* B1AB */,/*18734*/NULL/* B1AC */,/*18735*/NULL/* B1AD */,/*18736*/""/* B1AE */, /*18737*/NULL/* B1AF */,/*18738*/""/* B1B0 */,/*18739*/""/* B1B1 */, /*18740*/NULL/* B1B2 */,/*18741*/NULL/* B1B3 */,/*18742*/NULL/* B1B4 */,/*18743*/NULL/* B1B5 */,/*18744*/NULL/* B1B6 */, /*18745*/NULL/* B1B7 */,/*18746*/NULL/* B1B8 */,/*18747*/NULL/* B1B9 */,/*18748*/NULL/* B1BA */,/*18749*/NULL/* B1BB */, /*18750*/NULL/* B1BC */,/*18751*/NULL/* B1BD */,/*18752*/NULL/* B1BE */,/*18753*/NULL/* B1BF */,/*18754*/NULL/* B1C0 */, /*18755*/NULL/* B1C1 */,/*18756*/NULL/* B1C2 */,/*18757*/NULL/* B1C3 */,/*18758*/NULL/* B1C4 */,/*18759*/NULL/* B1C5 */, /*18760*/NULL/* B1C6 */,/*18761*/NULL/* B1C7 */,/*18762*/NULL/* B1C8 */,/*18763*/NULL/* B1C9 */, /*18764*/""/* B1CA */,/*18765*/NULL/* B1CB */,/*18766*/""/* B1CC */, /*18767*/""/* B1CD */,/*18768*/NULL/* B1CE */,/*18769*/NULL/* B1CF */,/*18770*/NULL/* B1D0 */, /*18771*/NULL/* B1D1 */,/*18772*/NULL/* B1D2 */,/*18773*/NULL/* B1D3 */,/*18774*/NULL/* B1D4 */,/*18775*/NULL/* B1D5 */, /*18776*/NULL/* B1D6 */,/*18777*/NULL/* B1D7 */,/*18778*/NULL/* B1D8 */,/*18779*/NULL/* B1D9 */,/*18780*/NULL/* B1DA */, /*18781*/NULL/* B1DB */,/*18782*/NULL/* B1DC */,/*18783*/NULL/* B1DD */,/*18784*/NULL/* B1DE */,/*18785*/NULL/* B1DF */, /*18786*/NULL/* B1E0 */,/*18787*/NULL/* B1E1 */,/*18788*/NULL/* B1E2 */,/*18789*/NULL/* B1E3 */,/*18790*/NULL/* B1E4 */, /*18791*/NULL/* B1E5 */,/*18792*/""/* B1E6 */,/*18793*/NULL/* B1E7 */, /*18794*/""/* B1E8 */,/*18795*/""/* B1E9 */,/*18796*/NULL/* B1EA */, /*18797*/NULL/* B1EB */,/*18798*/NULL/* B1EC */,/*18799*/NULL/* B1ED */,/*18800*/NULL/* B1EE */,/*18801*/NULL/* B1EF */, /*18802*/NULL/* B1F0 */,/*18803*/NULL/* B1F1 */,/*18804*/NULL/* B1F2 */,/*18805*/NULL/* B1F3 */,/*18806*/NULL/* B1F4 */, /*18807*/NULL/* B1F5 */,/*18808*/NULL/* B1F6 */,/*18809*/NULL/* B1F7 */,/*18810*/NULL/* B1F8 */,/*18811*/NULL/* B1F9 */, /*18812*/NULL/* B1FA */,/*18813*/NULL/* B1FB */,/*18814*/NULL/* B1FC */,/*18815*/NULL/* B1FD */,/*18816*/NULL/* B1FE */, /*18817*/NULL/* B1FF */,/*18818*/NULL/* B200 */,/*18819*/NULL/* B201 */,/*18820*/""/* B202 */, /*18821*/NULL/* B203 */,/*18822*/""/* B204 */,/*18823*/""/* B205 */, /*18824*/NULL/* B206 */,/*18825*/NULL/* B207 */,/*18826*/NULL/* B208 */,/*18827*/NULL/* B209 */,/*18828*/NULL/* B20A */, /*18829*/NULL/* B20B */,/*18830*/NULL/* B20C */,/*18831*/NULL/* B20D */,/*18832*/NULL/* B20E */,/*18833*/NULL/* B20F */, /*18834*/NULL/* B210 */,/*18835*/NULL/* B211 */,/*18836*/NULL/* B212 */,/*18837*/NULL/* B213 */,/*18838*/NULL/* B214 */, /*18839*/NULL/* B215 */,/*18840*/NULL/* B216 */,/*18841*/NULL/* B217 */,/*18842*/NULL/* B218 */,/*18843*/NULL/* B219 */, /*18844*/NULL/* B21A */,/*18845*/NULL/* B21B */,/*18846*/NULL/* B21C */,/*18847*/NULL/* B21D */, /*18848*/""/* B21E */,/*18849*/NULL/* B21F */,/*18850*/""/* B220 */, /*18851*/""/* B221 */,/*18852*/NULL/* B222 */,/*18853*/NULL/* B223 */,/*18854*/NULL/* B224 */, /*18855*/NULL/* B225 */,/*18856*/NULL/* B226 */,/*18857*/NULL/* B227 */,/*18858*/NULL/* B228 */,/*18859*/NULL/* B229 */, /*18860*/NULL/* B22A */,/*18861*/NULL/* B22B */,/*18862*/NULL/* B22C */,/*18863*/NULL/* B22D */,/*18864*/NULL/* B22E */, /*18865*/NULL/* B22F */,/*18866*/NULL/* B230 */,/*18867*/NULL/* B231 */,/*18868*/NULL/* B232 */,/*18869*/NULL/* B233 */, /*18870*/NULL/* B234 */,/*18871*/NULL/* B235 */,/*18872*/NULL/* B236 */,/*18873*/NULL/* B237 */,/*18874*/NULL/* B238 */, /*18875*/NULL/* B239 */,/*18876*/""/* B23A */,/*18877*/NULL/* B23B */, /*18878*/""/* B23C */,/*18879*/""/* B23D */,/*18880*/NULL/* B23E */, /*18881*/NULL/* B23F */,/*18882*/NULL/* B240 */,/*18883*/NULL/* B241 */,/*18884*/NULL/* B242 */,/*18885*/NULL/* B243 */, /*18886*/NULL/* B244 */,/*18887*/NULL/* B245 */,/*18888*/NULL/* B246 */,/*18889*/NULL/* B247 */,/*18890*/NULL/* B248 */, /*18891*/NULL/* B249 */,/*18892*/NULL/* B24A */,/*18893*/NULL/* B24B */,/*18894*/NULL/* B24C */,/*18895*/NULL/* B24D */, /*18896*/NULL/* B24E */,/*18897*/NULL/* B24F */,/*18898*/NULL/* B250 */,/*18899*/NULL/* B251 */,/*18900*/NULL/* B252 */, /*18901*/NULL/* B253 */,/*18902*/NULL/* B254 */,/*18903*/NULL/* B255 */,/*18904*/""/* B256 */, /*18905*/NULL/* B257 */,/*18906*/""/* B258 */,/*18907*/""/* B259 */, /*18908*/NULL/* B25A */,/*18909*/NULL/* B25B */,/*18910*/NULL/* B25C */,/*18911*/NULL/* B25D */,/*18912*/NULL/* B25E */, /*18913*/NULL/* B25F */,/*18914*/NULL/* B260 */,/*18915*/NULL/* B261 */,/*18916*/NULL/* B262 */,/*18917*/NULL/* B263 */, /*18918*/NULL/* B264 */,/*18919*/NULL/* B265 */,/*18920*/NULL/* B266 */,/*18921*/NULL/* B267 */,/*18922*/NULL/* B268 */, /*18923*/NULL/* B269 */,/*18924*/NULL/* B26A */,/*18925*/NULL/* B26B */,/*18926*/NULL/* B26C */,/*18927*/NULL/* B26D */, /*18928*/NULL/* B26E */,/*18929*/NULL/* B26F */,/*18930*/NULL/* B270 */,/*18931*/NULL/* B271 */, /*18932*/""/* B272 */,/*18933*/NULL/* B273 */,/*18934*/""/* B274 */, /*18935*/""/* B275 */,/*18936*/NULL/* B276 */,/*18937*/NULL/* B277 */,/*18938*/NULL/* B278 */, /*18939*/NULL/* B279 */,/*18940*/NULL/* B27A */,/*18941*/NULL/* B27B */,/*18942*/NULL/* B27C */,/*18943*/NULL/* B27D */, /*18944*/NULL/* B27E */,/*18945*/NULL/* B27F */,/*18946*/NULL/* B280 */,/*18947*/NULL/* B281 */,/*18948*/NULL/* B282 */, /*18949*/NULL/* B283 */,/*18950*/NULL/* B284 */,/*18951*/NULL/* B285 */,/*18952*/NULL/* B286 */,/*18953*/NULL/* B287 */, /*18954*/NULL/* B288 */,/*18955*/NULL/* B289 */,/*18956*/NULL/* B28A */,/*18957*/NULL/* B28B */,/*18958*/NULL/* B28C */, /*18959*/NULL/* B28D */,/*18960*/""/* B28E */,/*18961*/NULL/* B28F */, /*18962*/""/* B290 */,/*18963*/""/* B291 */,/*18964*/NULL/* B292 */, /*18965*/NULL/* B293 */,/*18966*/NULL/* B294 */,/*18967*/NULL/* B295 */,/*18968*/NULL/* B296 */,/*18969*/NULL/* B297 */, /*18970*/NULL/* B298 */,/*18971*/NULL/* B299 */,/*18972*/NULL/* B29A */,/*18973*/NULL/* B29B */,/*18974*/NULL/* B29C */, /*18975*/NULL/* B29D */,/*18976*/NULL/* B29E */,/*18977*/NULL/* B29F */,/*18978*/NULL/* B2A0 */,/*18979*/NULL/* B2A1 */, /*18980*/NULL/* B2A2 */,/*18981*/NULL/* B2A3 */,/*18982*/NULL/* B2A4 */,/*18983*/NULL/* B2A5 */,/*18984*/NULL/* B2A6 */, /*18985*/NULL/* B2A7 */,/*18986*/NULL/* B2A8 */,/*18987*/NULL/* B2A9 */,/*18988*/""/* B2AA */, /*18989*/NULL/* B2AB */,/*18990*/""/* B2AC */,/*18991*/""/* B2AD */, /*18992*/NULL/* B2AE */,/*18993*/NULL/* B2AF */,/*18994*/NULL/* B2B0 */,/*18995*/NULL/* B2B1 */,/*18996*/NULL/* B2B2 */, /*18997*/NULL/* B2B3 */,/*18998*/NULL/* B2B4 */,/*18999*/NULL/* B2B5 */,/*19000*/NULL/* B2B6 */,/*19001*/NULL/* B2B7 */, /*19002*/NULL/* B2B8 */,/*19003*/NULL/* B2B9 */,/*19004*/NULL/* B2BA */,/*19005*/NULL/* B2BB */,/*19006*/NULL/* B2BC */, /*19007*/NULL/* B2BD */,/*19008*/NULL/* B2BE */,/*19009*/NULL/* B2BF */,/*19010*/NULL/* B2C0 */,/*19011*/NULL/* B2C1 */, /*19012*/NULL/* B2C2 */,/*19013*/NULL/* B2C3 */,/*19014*/NULL/* B2C4 */,/*19015*/NULL/* B2C5 */, /*19016*/""/* B2C6 */,/*19017*/NULL/* B2C7 */,/*19018*/""/* B2C8 */, /*19019*/""/* B2C9 */,/*19020*/NULL/* B2CA */,/*19021*/NULL/* B2CB */,/*19022*/NULL/* B2CC */, /*19023*/NULL/* B2CD */,/*19024*/NULL/* B2CE */,/*19025*/NULL/* B2CF */,/*19026*/NULL/* B2D0 */,/*19027*/NULL/* B2D1 */, /*19028*/NULL/* B2D2 */,/*19029*/NULL/* B2D3 */,/*19030*/NULL/* B2D4 */,/*19031*/NULL/* B2D5 */,/*19032*/NULL/* B2D6 */, /*19033*/NULL/* B2D7 */,/*19034*/NULL/* B2D8 */,/*19035*/NULL/* B2D9 */,/*19036*/NULL/* B2DA */,/*19037*/NULL/* B2DB */, /*19038*/NULL/* B2DC */,/*19039*/NULL/* B2DD */,/*19040*/NULL/* B2DE */,/*19041*/NULL/* B2DF */,/*19042*/NULL/* B2E0 */, /*19043*/NULL/* B2E1 */,/*19044*/""/* B2E2 */,/*19045*/NULL/* B2E3 */, /*19046*/""/* B2E4 */,/*19047*/""/* B2E5 */,/*19048*/NULL/* B2E6 */, /*19049*/NULL/* B2E7 */,/*19050*/NULL/* B2E8 */,/*19051*/NULL/* B2E9 */,/*19052*/NULL/* B2EA */,/*19053*/NULL/* B2EB */, /*19054*/NULL/* B2EC */,/*19055*/NULL/* B2ED */,/*19056*/NULL/* B2EE */,/*19057*/NULL/* B2EF */,/*19058*/NULL/* B2F0 */, /*19059*/NULL/* B2F1 */,/*19060*/NULL/* B2F2 */,/*19061*/NULL/* B2F3 */,/*19062*/NULL/* B2F4 */,/*19063*/NULL/* B2F5 */, /*19064*/NULL/* B2F6 */,/*19065*/NULL/* B2F7 */,/*19066*/NULL/* B2F8 */,/*19067*/NULL/* B2F9 */,/*19068*/NULL/* B2FA */, /*19069*/NULL/* B2FB */,/*19070*/NULL/* B2FC */,/*19071*/NULL/* B2FD */,/*19072*/""/* B2FE */, /*19073*/NULL/* B2FF */,/*19074*/""/* B300 */,/*19075*/""/* B301 */, /*19076*/NULL/* B302 */,/*19077*/NULL/* B303 */,/*19078*/NULL/* B304 */,/*19079*/NULL/* B305 */,/*19080*/NULL/* B306 */, /*19081*/NULL/* B307 */,/*19082*/NULL/* B308 */,/*19083*/NULL/* B309 */,/*19084*/NULL/* B30A */,/*19085*/NULL/* B30B */, /*19086*/NULL/* B30C */,/*19087*/NULL/* B30D */,/*19088*/NULL/* B30E */,/*19089*/NULL/* B30F */,/*19090*/NULL/* B310 */, /*19091*/NULL/* B311 */,/*19092*/NULL/* B312 */,/*19093*/NULL/* B313 */,/*19094*/NULL/* B314 */,/*19095*/NULL/* B315 */, /*19096*/NULL/* B316 */,/*19097*/NULL/* B317 */,/*19098*/NULL/* B318 */,/*19099*/NULL/* B319 */, /*19100*/""/* B31A */,/*19101*/NULL/* B31B */,/*19102*/""/* B31C */, /*19103*/""/* B31D */,/*19104*/NULL/* B31E */,/*19105*/NULL/* B31F */,/*19106*/NULL/* B320 */, /*19107*/NULL/* B321 */,/*19108*/NULL/* B322 */,/*19109*/NULL/* B323 */,/*19110*/NULL/* B324 */,/*19111*/NULL/* B325 */, /*19112*/NULL/* B326 */,/*19113*/NULL/* B327 */,/*19114*/NULL/* B328 */,/*19115*/NULL/* B329 */,/*19116*/NULL/* B32A */, /*19117*/NULL/* B32B */,/*19118*/NULL/* B32C */,/*19119*/NULL/* B32D */,/*19120*/NULL/* B32E */,/*19121*/NULL/* B32F */, /*19122*/NULL/* B330 */,/*19123*/NULL/* B331 */,/*19124*/NULL/* B332 */,/*19125*/NULL/* B333 */,/*19126*/NULL/* B334 */, /*19127*/NULL/* B335 */,/*19128*/""/* B336 */,/*19129*/NULL/* B337 */, /*19130*/""/* B338 */,/*19131*/""/* B339 */,/*19132*/NULL/* B33A */, /*19133*/NULL/* B33B */,/*19134*/NULL/* B33C */,/*19135*/NULL/* B33D */,/*19136*/NULL/* B33E */,/*19137*/NULL/* B33F */, /*19138*/NULL/* B340 */,/*19139*/NULL/* B341 */,/*19140*/NULL/* B342 */,/*19141*/NULL/* B343 */,/*19142*/NULL/* B344 */, /*19143*/NULL/* B345 */,/*19144*/NULL/* B346 */,/*19145*/NULL/* B347 */,/*19146*/NULL/* B348 */,/*19147*/NULL/* B349 */, /*19148*/NULL/* B34A */,/*19149*/NULL/* B34B */,/*19150*/NULL/* B34C */,/*19151*/NULL/* B34D */,/*19152*/NULL/* B34E */, /*19153*/NULL/* B34F */,/*19154*/NULL/* B350 */,/*19155*/NULL/* B351 */,/*19156*/""/* B352 */, /*19157*/NULL/* B353 */,/*19158*/""/* B354 */,/*19159*/""/* B355 */, /*19160*/NULL/* B356 */,/*19161*/NULL/* B357 */,/*19162*/NULL/* B358 */,/*19163*/NULL/* B359 */,/*19164*/NULL/* B35A */, /*19165*/NULL/* B35B */,/*19166*/NULL/* B35C */,/*19167*/NULL/* B35D */,/*19168*/NULL/* B35E */,/*19169*/NULL/* B35F */, /*19170*/NULL/* B360 */,/*19171*/NULL/* B361 */,/*19172*/NULL/* B362 */,/*19173*/NULL/* B363 */,/*19174*/NULL/* B364 */, /*19175*/NULL/* B365 */,/*19176*/NULL/* B366 */,/*19177*/NULL/* B367 */,/*19178*/NULL/* B368 */,/*19179*/NULL/* B369 */, /*19180*/NULL/* B36A */,/*19181*/NULL/* B36B */,/*19182*/NULL/* B36C */,/*19183*/NULL/* B36D */, /*19184*/""/* B36E */,/*19185*/NULL/* B36F */,/*19186*/""/* B370 */, /*19187*/""/* B371 */,/*19188*/NULL/* B372 */,/*19189*/NULL/* B373 */,/*19190*/NULL/* B374 */, /*19191*/NULL/* B375 */,/*19192*/NULL/* B376 */,/*19193*/NULL/* B377 */,/*19194*/NULL/* B378 */,/*19195*/NULL/* B379 */, /*19196*/NULL/* B37A */,/*19197*/NULL/* B37B */,/*19198*/NULL/* B37C */,/*19199*/NULL/* B37D */,/*19200*/NULL/* B37E */, /*19201*/NULL/* B37F */,/*19202*/NULL/* B380 */,/*19203*/NULL/* B381 */,/*19204*/NULL/* B382 */,/*19205*/NULL/* B383 */, /*19206*/NULL/* B384 */,/*19207*/NULL/* B385 */,/*19208*/NULL/* B386 */,/*19209*/NULL/* B387 */,/*19210*/NULL/* B388 */, /*19211*/NULL/* B389 */,/*19212*/""/* B38A */,/*19213*/NULL/* B38B */, /*19214*/""/* B38C */,/*19215*/""/* B38D */,/*19216*/NULL/* B38E */, /*19217*/NULL/* B38F */,/*19218*/NULL/* B390 */,/*19219*/NULL/* B391 */,/*19220*/NULL/* B392 */,/*19221*/NULL/* B393 */, /*19222*/NULL/* B394 */,/*19223*/NULL/* B395 */,/*19224*/NULL/* B396 */,/*19225*/NULL/* B397 */,/*19226*/NULL/* B398 */, /*19227*/NULL/* B399 */,/*19228*/NULL/* B39A */,/*19229*/NULL/* B39B */,/*19230*/NULL/* B39C */,/*19231*/NULL/* B39D */, /*19232*/NULL/* B39E */,/*19233*/NULL/* B39F */,/*19234*/NULL/* B3A0 */,/*19235*/NULL/* B3A1 */,/*19236*/NULL/* B3A2 */, /*19237*/NULL/* B3A3 */,/*19238*/NULL/* B3A4 */,/*19239*/NULL/* B3A5 */,/*19240*/""/* B3A6 */, /*19241*/NULL/* B3A7 */,/*19242*/""/* B3A8 */,/*19243*/""/* B3A9 */, /*19244*/NULL/* B3AA */,/*19245*/NULL/* B3AB */,/*19246*/NULL/* B3AC */,/*19247*/NULL/* B3AD */,/*19248*/NULL/* B3AE */, /*19249*/NULL/* B3AF */,/*19250*/NULL/* B3B0 */,/*19251*/NULL/* B3B1 */,/*19252*/NULL/* B3B2 */,/*19253*/NULL/* B3B3 */, /*19254*/NULL/* B3B4 */,/*19255*/NULL/* B3B5 */,/*19256*/NULL/* B3B6 */,/*19257*/NULL/* B3B7 */,/*19258*/NULL/* B3B8 */, /*19259*/NULL/* B3B9 */,/*19260*/NULL/* B3BA */,/*19261*/NULL/* B3BB */,/*19262*/NULL/* B3BC */,/*19263*/NULL/* B3BD */, /*19264*/NULL/* B3BE */,/*19265*/NULL/* B3BF */,/*19266*/NULL/* B3C0 */,/*19267*/NULL/* B3C1 */, /*19268*/""/* B3C2 */,/*19269*/NULL/* B3C3 */,/*19270*/""/* B3C4 */, /*19271*/""/* B3C5 */,/*19272*/NULL/* B3C6 */,/*19273*/NULL/* B3C7 */,/*19274*/NULL/* B3C8 */, /*19275*/NULL/* B3C9 */,/*19276*/NULL/* B3CA */,/*19277*/NULL/* B3CB */,/*19278*/NULL/* B3CC */,/*19279*/NULL/* B3CD */, /*19280*/NULL/* B3CE */,/*19281*/NULL/* B3CF */,/*19282*/NULL/* B3D0 */,/*19283*/NULL/* B3D1 */,/*19284*/NULL/* B3D2 */, /*19285*/NULL/* B3D3 */,/*19286*/NULL/* B3D4 */,/*19287*/NULL/* B3D5 */,/*19288*/NULL/* B3D6 */,/*19289*/NULL/* B3D7 */, /*19290*/NULL/* B3D8 */,/*19291*/NULL/* B3D9 */,/*19292*/NULL/* B3DA */,/*19293*/NULL/* B3DB */,/*19294*/NULL/* B3DC */, /*19295*/NULL/* B3DD */,/*19296*/""/* B3DE */,/*19297*/NULL/* B3DF */, /*19298*/""/* B3E0 */,/*19299*/""/* B3E1 */,/*19300*/NULL/* B3E2 */, /*19301*/NULL/* B3E3 */,/*19302*/NULL/* B3E4 */,/*19303*/NULL/* B3E5 */,/*19304*/NULL/* B3E6 */,/*19305*/NULL/* B3E7 */, /*19306*/NULL/* B3E8 */,/*19307*/NULL/* B3E9 */,/*19308*/NULL/* B3EA */,/*19309*/NULL/* B3EB */,/*19310*/NULL/* B3EC */, /*19311*/NULL/* B3ED */,/*19312*/NULL/* B3EE */,/*19313*/NULL/* B3EF */,/*19314*/NULL/* B3F0 */,/*19315*/NULL/* B3F1 */, /*19316*/NULL/* B3F2 */,/*19317*/NULL/* B3F3 */,/*19318*/NULL/* B3F4 */,/*19319*/NULL/* B3F5 */,/*19320*/NULL/* B3F6 */, /*19321*/NULL/* B3F7 */,/*19322*/NULL/* B3F8 */,/*19323*/NULL/* B3F9 */,/*19324*/""/* B3FA */, /*19325*/NULL/* B3FB */,/*19326*/""/* B3FC */,/*19327*/""/* B3FD */, /*19328*/NULL/* B3FE */,/*19329*/NULL/* B3FF */,/*19330*/NULL/* B400 */,/*19331*/NULL/* B401 */,/*19332*/NULL/* B402 */, /*19333*/NULL/* B403 */,/*19334*/NULL/* B404 */,/*19335*/NULL/* B405 */,/*19336*/NULL/* B406 */,/*19337*/NULL/* B407 */, /*19338*/NULL/* B408 */,/*19339*/NULL/* B409 */,/*19340*/NULL/* B40A */,/*19341*/NULL/* B40B */,/*19342*/NULL/* B40C */, /*19343*/NULL/* B40D */,/*19344*/NULL/* B40E */,/*19345*/NULL/* B40F */,/*19346*/NULL/* B410 */,/*19347*/NULL/* B411 */, /*19348*/NULL/* B412 */,/*19349*/NULL/* B413 */,/*19350*/NULL/* B414 */,/*19351*/NULL/* B415 */, /*19352*/""/* B416 */,/*19353*/NULL/* B417 */,/*19354*/""/* B418 */, /*19355*/""/* B419 */,/*19356*/NULL/* B41A */,/*19357*/NULL/* B41B */,/*19358*/NULL/* B41C */, /*19359*/NULL/* B41D */,/*19360*/NULL/* B41E */,/*19361*/NULL/* B41F */,/*19362*/NULL/* B420 */,/*19363*/NULL/* B421 */, /*19364*/NULL/* B422 */,/*19365*/NULL/* B423 */,/*19366*/NULL/* B424 */,/*19367*/NULL/* B425 */,/*19368*/NULL/* B426 */, /*19369*/NULL/* B427 */,/*19370*/NULL/* B428 */,/*19371*/NULL/* B429 */,/*19372*/NULL/* B42A */,/*19373*/NULL/* B42B */, /*19374*/NULL/* B42C */,/*19375*/NULL/* B42D */,/*19376*/NULL/* B42E */,/*19377*/NULL/* B42F */,/*19378*/NULL/* B430 */, /*19379*/NULL/* B431 */,/*19380*/""/* B432 */,/*19381*/NULL/* B433 */, /*19382*/""/* B434 */,/*19383*/""/* B435 */,/*19384*/NULL/* B436 */, /*19385*/NULL/* B437 */,/*19386*/NULL/* B438 */,/*19387*/NULL/* B439 */,/*19388*/NULL/* B43A */,/*19389*/NULL/* B43B */, /*19390*/NULL/* B43C */,/*19391*/NULL/* B43D */,/*19392*/NULL/* B43E */,/*19393*/NULL/* B43F */,/*19394*/NULL/* B440 */, /*19395*/NULL/* B441 */,/*19396*/NULL/* B442 */,/*19397*/NULL/* B443 */,/*19398*/NULL/* B444 */,/*19399*/NULL/* B445 */, /*19400*/NULL/* B446 */,/*19401*/NULL/* B447 */,/*19402*/NULL/* B448 */,/*19403*/NULL/* B449 */,/*19404*/NULL/* B44A */, /*19405*/NULL/* B44B */,/*19406*/NULL/* B44C */,/*19407*/NULL/* B44D */,/*19408*/""/* B44E */, /*19409*/NULL/* B44F */,/*19410*/""/* B450 */,/*19411*/""/* B451 */, /*19412*/NULL/* B452 */,/*19413*/NULL/* B453 */,/*19414*/NULL/* B454 */,/*19415*/NULL/* B455 */,/*19416*/NULL/* B456 */, /*19417*/NULL/* B457 */,/*19418*/NULL/* B458 */,/*19419*/NULL/* B459 */,/*19420*/NULL/* B45A */,/*19421*/NULL/* B45B */, /*19422*/NULL/* B45C */,/*19423*/NULL/* B45D */,/*19424*/NULL/* B45E */,/*19425*/NULL/* B45F */,/*19426*/NULL/* B460 */, /*19427*/NULL/* B461 */,/*19428*/NULL/* B462 */,/*19429*/NULL/* B463 */,/*19430*/NULL/* B464 */,/*19431*/NULL/* B465 */, /*19432*/NULL/* B466 */,/*19433*/NULL/* B467 */,/*19434*/NULL/* B468 */,/*19435*/NULL/* B469 */, /*19436*/""/* B46A */,/*19437*/NULL/* B46B */,/*19438*/""/* B46C */, /*19439*/""/* B46D */,/*19440*/NULL/* B46E */,/*19441*/NULL/* B46F */,/*19442*/NULL/* B470 */, /*19443*/NULL/* B471 */,/*19444*/NULL/* B472 */,/*19445*/NULL/* B473 */,/*19446*/NULL/* B474 */,/*19447*/NULL/* B475 */, /*19448*/NULL/* B476 */,/*19449*/NULL/* B477 */,/*19450*/NULL/* B478 */,/*19451*/NULL/* B479 */,/*19452*/NULL/* B47A */, /*19453*/NULL/* B47B */,/*19454*/NULL/* B47C */,/*19455*/NULL/* B47D */,/*19456*/NULL/* B47E */,/*19457*/NULL/* B47F */, /*19458*/NULL/* B480 */,/*19459*/NULL/* B481 */,/*19460*/NULL/* B482 */,/*19461*/NULL/* B483 */,/*19462*/NULL/* B484 */, /*19463*/NULL/* B485 */,/*19464*/""/* B486 */,/*19465*/NULL/* B487 */, /*19466*/""/* B488 */,/*19467*/""/* B489 */,/*19468*/NULL/* B48A */, /*19469*/NULL/* B48B */,/*19470*/NULL/* B48C */,/*19471*/NULL/* B48D */,/*19472*/NULL/* B48E */,/*19473*/NULL/* B48F */, /*19474*/NULL/* B490 */,/*19475*/NULL/* B491 */,/*19476*/NULL/* B492 */,/*19477*/NULL/* B493 */,/*19478*/NULL/* B494 */, /*19479*/NULL/* B495 */,/*19480*/NULL/* B496 */,/*19481*/NULL/* B497 */,/*19482*/NULL/* B498 */,/*19483*/NULL/* B499 */, /*19484*/NULL/* B49A */,/*19485*/NULL/* B49B */,/*19486*/NULL/* B49C */,/*19487*/NULL/* B49D */,/*19488*/NULL/* B49E */, /*19489*/NULL/* B49F */,/*19490*/NULL/* B4A0 */,/*19491*/NULL/* B4A1 */,/*19492*/""/* B4A2 */, /*19493*/NULL/* B4A3 */,/*19494*/""/* B4A4 */,/*19495*/""/* B4A5 */, /*19496*/NULL/* B4A6 */,/*19497*/NULL/* B4A7 */,/*19498*/NULL/* B4A8 */,/*19499*/NULL/* B4A9 */,/*19500*/NULL/* B4AA */, /*19501*/NULL/* B4AB */,/*19502*/NULL/* B4AC */,/*19503*/NULL/* B4AD */,/*19504*/NULL/* B4AE */,/*19505*/NULL/* B4AF */, /*19506*/NULL/* B4B0 */,/*19507*/NULL/* B4B1 */,/*19508*/NULL/* B4B2 */,/*19509*/NULL/* B4B3 */,/*19510*/NULL/* B4B4 */, /*19511*/NULL/* B4B5 */,/*19512*/NULL/* B4B6 */,/*19513*/NULL/* B4B7 */,/*19514*/NULL/* B4B8 */,/*19515*/NULL/* B4B9 */, /*19516*/NULL/* B4BA */,/*19517*/NULL/* B4BB */,/*19518*/NULL/* B4BC */,/*19519*/NULL/* B4BD */, /*19520*/""/* B4BE */,/*19521*/NULL/* B4BF */,/*19522*/""/* B4C0 */, /*19523*/""/* B4C1 */,/*19524*/NULL/* B4C2 */,/*19525*/NULL/* B4C3 */,/*19526*/NULL/* B4C4 */, /*19527*/NULL/* B4C5 */,/*19528*/NULL/* B4C6 */,/*19529*/NULL/* B4C7 */,/*19530*/NULL/* B4C8 */,/*19531*/NULL/* B4C9 */, /*19532*/NULL/* B4CA */,/*19533*/NULL/* B4CB */,/*19534*/NULL/* B4CC */,/*19535*/NULL/* B4CD */,/*19536*/NULL/* B4CE */, /*19537*/NULL/* B4CF */,/*19538*/NULL/* B4D0 */,/*19539*/NULL/* B4D1 */,/*19540*/NULL/* B4D2 */,/*19541*/NULL/* B4D3 */, /*19542*/NULL/* B4D4 */,/*19543*/NULL/* B4D5 */,/*19544*/NULL/* B4D6 */,/*19545*/NULL/* B4D7 */,/*19546*/NULL/* B4D8 */, /*19547*/NULL/* B4D9 */,/*19548*/""/* B4DA */,/*19549*/NULL/* B4DB */, /*19550*/""/* B4DC */,/*19551*/""/* B4DD */,/*19552*/NULL/* B4DE */, /*19553*/NULL/* B4DF */,/*19554*/NULL/* B4E0 */,/*19555*/NULL/* B4E1 */,/*19556*/NULL/* B4E2 */,/*19557*/NULL/* B4E3 */, /*19558*/NULL/* B4E4 */,/*19559*/NULL/* B4E5 */,/*19560*/NULL/* B4E6 */,/*19561*/NULL/* B4E7 */,/*19562*/NULL/* B4E8 */, /*19563*/NULL/* B4E9 */,/*19564*/NULL/* B4EA */,/*19565*/NULL/* B4EB */,/*19566*/NULL/* B4EC */,/*19567*/NULL/* B4ED */, /*19568*/NULL/* B4EE */,/*19569*/NULL/* B4EF */,/*19570*/NULL/* B4F0 */,/*19571*/NULL/* B4F1 */,/*19572*/NULL/* B4F2 */, /*19573*/NULL/* B4F3 */,/*19574*/NULL/* B4F4 */,/*19575*/NULL/* B4F5 */,/*19576*/""/* B4F6 */, /*19577*/NULL/* B4F7 */,/*19578*/""/* B4F8 */,/*19579*/""/* B4F9 */, /*19580*/NULL/* B4FA */,/*19581*/NULL/* B4FB */,/*19582*/NULL/* B4FC */,/*19583*/NULL/* B4FD */,/*19584*/NULL/* B4FE */, /*19585*/NULL/* B4FF */,/*19586*/NULL/* B500 */,/*19587*/NULL/* B501 */,/*19588*/NULL/* B502 */,/*19589*/NULL/* B503 */, /*19590*/NULL/* B504 */,/*19591*/NULL/* B505 */,/*19592*/NULL/* B506 */,/*19593*/NULL/* B507 */,/*19594*/NULL/* B508 */, /*19595*/NULL/* B509 */,/*19596*/NULL/* B50A */,/*19597*/NULL/* B50B */,/*19598*/NULL/* B50C */,/*19599*/NULL/* B50D */, /*19600*/NULL/* B50E */,/*19601*/NULL/* B50F */,/*19602*/NULL/* B510 */,/*19603*/NULL/* B511 */, /*19604*/""/* B512 */,/*19605*/NULL/* B513 */,/*19606*/""/* B514 */, /*19607*/""/* B515 */,/*19608*/NULL/* B516 */,/*19609*/NULL/* B517 */,/*19610*/NULL/* B518 */, /*19611*/NULL/* B519 */,/*19612*/NULL/* B51A */,/*19613*/NULL/* B51B */,/*19614*/NULL/* B51C */,/*19615*/NULL/* B51D */, /*19616*/NULL/* B51E */,/*19617*/NULL/* B51F */,/*19618*/NULL/* B520 */,/*19619*/NULL/* B521 */,/*19620*/NULL/* B522 */, /*19621*/NULL/* B523 */,/*19622*/NULL/* B524 */,/*19623*/NULL/* B525 */,/*19624*/NULL/* B526 */,/*19625*/NULL/* B527 */, /*19626*/NULL/* B528 */,/*19627*/NULL/* B529 */,/*19628*/NULL/* B52A */,/*19629*/NULL/* B52B */,/*19630*/NULL/* B52C */, /*19631*/NULL/* B52D */,/*19632*/""/* B52E */,/*19633*/NULL/* B52F */, /*19634*/""/* B530 */,/*19635*/""/* B531 */,/*19636*/NULL/* B532 */, /*19637*/NULL/* B533 */,/*19638*/NULL/* B534 */,/*19639*/NULL/* B535 */,/*19640*/NULL/* B536 */,/*19641*/NULL/* B537 */, /*19642*/NULL/* B538 */,/*19643*/NULL/* B539 */,/*19644*/NULL/* B53A */,/*19645*/NULL/* B53B */,/*19646*/NULL/* B53C */, /*19647*/NULL/* B53D */,/*19648*/NULL/* B53E */,/*19649*/NULL/* B53F */,/*19650*/NULL/* B540 */,/*19651*/NULL/* B541 */, /*19652*/NULL/* B542 */,/*19653*/NULL/* B543 */,/*19654*/NULL/* B544 */,/*19655*/NULL/* B545 */,/*19656*/NULL/* B546 */, /*19657*/NULL/* B547 */,/*19658*/NULL/* B548 */,/*19659*/NULL/* B549 */,/*19660*/""/* B54A */, /*19661*/NULL/* B54B */,/*19662*/""/* B54C */,/*19663*/""/* B54D */, /*19664*/NULL/* B54E */,/*19665*/NULL/* B54F */,/*19666*/NULL/* B550 */,/*19667*/NULL/* B551 */,/*19668*/NULL/* B552 */, /*19669*/NULL/* B553 */,/*19670*/NULL/* B554 */,/*19671*/NULL/* B555 */,/*19672*/NULL/* B556 */,/*19673*/NULL/* B557 */, /*19674*/NULL/* B558 */,/*19675*/NULL/* B559 */,/*19676*/NULL/* B55A */,/*19677*/NULL/* B55B */,/*19678*/NULL/* B55C */, /*19679*/NULL/* B55D */,/*19680*/NULL/* B55E */,/*19681*/NULL/* B55F */,/*19682*/NULL/* B560 */,/*19683*/NULL/* B561 */, /*19684*/NULL/* B562 */,/*19685*/NULL/* B563 */,/*19686*/NULL/* B564 */,/*19687*/NULL/* B565 */, /*19688*/""/* B566 */,/*19689*/NULL/* B567 */,/*19690*/""/* B568 */, /*19691*/""/* B569 */,/*19692*/NULL/* B56A */,/*19693*/NULL/* B56B */,/*19694*/NULL/* B56C */, /*19695*/NULL/* B56D */,/*19696*/NULL/* B56E */,/*19697*/NULL/* B56F */,/*19698*/NULL/* B570 */,/*19699*/NULL/* B571 */, /*19700*/NULL/* B572 */,/*19701*/NULL/* B573 */,/*19702*/NULL/* B574 */,/*19703*/NULL/* B575 */,/*19704*/NULL/* B576 */, /*19705*/NULL/* B577 */,/*19706*/NULL/* B578 */,/*19707*/NULL/* B579 */,/*19708*/NULL/* B57A */,/*19709*/NULL/* B57B */, /*19710*/NULL/* B57C */,/*19711*/NULL/* B57D */,/*19712*/NULL/* B57E */,/*19713*/NULL/* B57F */,/*19714*/NULL/* B580 */, /*19715*/NULL/* B581 */,/*19716*/""/* B582 */,/*19717*/NULL/* B583 */, /*19718*/""/* B584 */,/*19719*/""/* B585 */,/*19720*/NULL/* B586 */, /*19721*/NULL/* B587 */,/*19722*/NULL/* B588 */,/*19723*/NULL/* B589 */,/*19724*/NULL/* B58A */,/*19725*/NULL/* B58B */, /*19726*/NULL/* B58C */,/*19727*/NULL/* B58D */,/*19728*/NULL/* B58E */,/*19729*/NULL/* B58F */,/*19730*/NULL/* B590 */, /*19731*/NULL/* B591 */,/*19732*/NULL/* B592 */,/*19733*/NULL/* B593 */,/*19734*/NULL/* B594 */,/*19735*/NULL/* B595 */, /*19736*/NULL/* B596 */,/*19737*/NULL/* B597 */,/*19738*/NULL/* B598 */,/*19739*/NULL/* B599 */,/*19740*/NULL/* B59A */, /*19741*/NULL/* B59B */,/*19742*/NULL/* B59C */,/*19743*/NULL/* B59D */,/*19744*/""/* B59E */, /*19745*/NULL/* B59F */,/*19746*/""/* B5A0 */,/*19747*/""/* B5A1 */, /*19748*/NULL/* B5A2 */,/*19749*/NULL/* B5A3 */,/*19750*/NULL/* B5A4 */,/*19751*/NULL/* B5A5 */,/*19752*/NULL/* B5A6 */, /*19753*/NULL/* B5A7 */,/*19754*/NULL/* B5A8 */,/*19755*/NULL/* B5A9 */,/*19756*/NULL/* B5AA */,/*19757*/NULL/* B5AB */, /*19758*/NULL/* B5AC */,/*19759*/NULL/* B5AD */,/*19760*/NULL/* B5AE */,/*19761*/NULL/* B5AF */,/*19762*/NULL/* B5B0 */, /*19763*/NULL/* B5B1 */,/*19764*/NULL/* B5B2 */,/*19765*/NULL/* B5B3 */,/*19766*/NULL/* B5B4 */,/*19767*/NULL/* B5B5 */, /*19768*/NULL/* B5B6 */,/*19769*/NULL/* B5B7 */,/*19770*/NULL/* B5B8 */,/*19771*/NULL/* B5B9 */, /*19772*/""/* B5BA */,/*19773*/NULL/* B5BB */,/*19774*/""/* B5BC */, /*19775*/""/* B5BD */,/*19776*/NULL/* B5BE */,/*19777*/NULL/* B5BF */,/*19778*/NULL/* B5C0 */, /*19779*/NULL/* B5C1 */,/*19780*/NULL/* B5C2 */,/*19781*/NULL/* B5C3 */,/*19782*/NULL/* B5C4 */,/*19783*/NULL/* B5C5 */, /*19784*/NULL/* B5C6 */,/*19785*/NULL/* B5C7 */,/*19786*/NULL/* B5C8 */,/*19787*/NULL/* B5C9 */,/*19788*/NULL/* B5CA */, /*19789*/NULL/* B5CB */,/*19790*/NULL/* B5CC */,/*19791*/NULL/* B5CD */,/*19792*/NULL/* B5CE */,/*19793*/NULL/* B5CF */, /*19794*/NULL/* B5D0 */,/*19795*/NULL/* B5D1 */,/*19796*/NULL/* B5D2 */,/*19797*/NULL/* B5D3 */,/*19798*/NULL/* B5D4 */, /*19799*/NULL/* B5D5 */,/*19800*/""/* B5D6 */,/*19801*/NULL/* B5D7 */, /*19802*/""/* B5D8 */,/*19803*/""/* B5D9 */,/*19804*/NULL/* B5DA */, /*19805*/NULL/* B5DB */,/*19806*/NULL/* B5DC */,/*19807*/NULL/* B5DD */,/*19808*/NULL/* B5DE */,/*19809*/NULL/* B5DF */, /*19810*/NULL/* B5E0 */,/*19811*/NULL/* B5E1 */,/*19812*/NULL/* B5E2 */,/*19813*/NULL/* B5E3 */,/*19814*/NULL/* B5E4 */, /*19815*/NULL/* B5E5 */,/*19816*/NULL/* B5E6 */,/*19817*/NULL/* B5E7 */,/*19818*/NULL/* B5E8 */,/*19819*/NULL/* B5E9 */, /*19820*/NULL/* B5EA */,/*19821*/NULL/* B5EB */,/*19822*/NULL/* B5EC */,/*19823*/NULL/* B5ED */,/*19824*/NULL/* B5EE */, /*19825*/NULL/* B5EF */,/*19826*/NULL/* B5F0 */,/*19827*/NULL/* B5F1 */,/*19828*/""/* B5F2 */, /*19829*/NULL/* B5F3 */,/*19830*/""/* B5F4 */,/*19831*/""/* B5F5 */, /*19832*/NULL/* B5F6 */,/*19833*/NULL/* B5F7 */,/*19834*/NULL/* B5F8 */,/*19835*/NULL/* B5F9 */,/*19836*/NULL/* B5FA */, /*19837*/NULL/* B5FB */,/*19838*/NULL/* B5FC */,/*19839*/NULL/* B5FD */,/*19840*/NULL/* B5FE */,/*19841*/NULL/* B5FF */, /*19842*/NULL/* B600 */,/*19843*/NULL/* B601 */,/*19844*/NULL/* B602 */,/*19845*/NULL/* B603 */,/*19846*/NULL/* B604 */, /*19847*/NULL/* B605 */,/*19848*/NULL/* B606 */,/*19849*/NULL/* B607 */,/*19850*/NULL/* B608 */,/*19851*/NULL/* B609 */, /*19852*/NULL/* B60A */,/*19853*/NULL/* B60B */,/*19854*/NULL/* B60C */,/*19855*/NULL/* B60D */, /*19856*/""/* B60E */,/*19857*/NULL/* B60F */,/*19858*/""/* B610 */, /*19859*/""/* B611 */,/*19860*/NULL/* B612 */,/*19861*/NULL/* B613 */,/*19862*/NULL/* B614 */, /*19863*/NULL/* B615 */,/*19864*/NULL/* B616 */,/*19865*/NULL/* B617 */,/*19866*/NULL/* B618 */,/*19867*/NULL/* B619 */, /*19868*/NULL/* B61A */,/*19869*/NULL/* B61B */,/*19870*/NULL/* B61C */,/*19871*/NULL/* B61D */,/*19872*/NULL/* B61E */, /*19873*/NULL/* B61F */,/*19874*/NULL/* B620 */,/*19875*/NULL/* B621 */,/*19876*/NULL/* B622 */,/*19877*/NULL/* B623 */, /*19878*/NULL/* B624 */,/*19879*/NULL/* B625 */,/*19880*/NULL/* B626 */,/*19881*/NULL/* B627 */,/*19882*/NULL/* B628 */, /*19883*/NULL/* B629 */,/*19884*/""/* B62A */,/*19885*/NULL/* B62B */, /*19886*/""/* B62C */,/*19887*/""/* B62D */,/*19888*/NULL/* B62E */, /*19889*/NULL/* B62F */,/*19890*/NULL/* B630 */,/*19891*/NULL/* B631 */,/*19892*/NULL/* B632 */,/*19893*/NULL/* B633 */, /*19894*/NULL/* B634 */,/*19895*/NULL/* B635 */,/*19896*/NULL/* B636 */,/*19897*/NULL/* B637 */,/*19898*/NULL/* B638 */, /*19899*/NULL/* B639 */,/*19900*/NULL/* B63A */,/*19901*/NULL/* B63B */,/*19902*/NULL/* B63C */,/*19903*/NULL/* B63D */, /*19904*/NULL/* B63E */,/*19905*/NULL/* B63F */,/*19906*/NULL/* B640 */,/*19907*/NULL/* B641 */,/*19908*/NULL/* B642 */, /*19909*/NULL/* B643 */,/*19910*/NULL/* B644 */,/*19911*/NULL/* B645 */,/*19912*/""/* B646 */, /*19913*/NULL/* B647 */,/*19914*/""/* B648 */,/*19915*/""/* B649 */, /*19916*/NULL/* B64A */,/*19917*/NULL/* B64B */,/*19918*/NULL/* B64C */,/*19919*/NULL/* B64D */,/*19920*/NULL/* B64E */, /*19921*/NULL/* B64F */,/*19922*/NULL/* B650 */,/*19923*/NULL/* B651 */,/*19924*/NULL/* B652 */,/*19925*/NULL/* B653 */, /*19926*/NULL/* B654 */,/*19927*/NULL/* B655 */,/*19928*/NULL/* B656 */,/*19929*/NULL/* B657 */,/*19930*/NULL/* B658 */, /*19931*/NULL/* B659 */,/*19932*/NULL/* B65A */,/*19933*/NULL/* B65B */,/*19934*/NULL/* B65C */,/*19935*/NULL/* B65D */, /*19936*/NULL/* B65E */,/*19937*/NULL/* B65F */,/*19938*/NULL/* B660 */,/*19939*/NULL/* B661 */, /*19940*/""/* B662 */,/*19941*/NULL/* B663 */,/*19942*/""/* B664 */, /*19943*/""/* B665 */,/*19944*/NULL/* B666 */,/*19945*/NULL/* B667 */,/*19946*/NULL/* B668 */, /*19947*/NULL/* B669 */,/*19948*/NULL/* B66A */,/*19949*/NULL/* B66B */,/*19950*/NULL/* B66C */,/*19951*/NULL/* B66D */, /*19952*/NULL/* B66E */,/*19953*/NULL/* B66F */,/*19954*/NULL/* B670 */,/*19955*/NULL/* B671 */,/*19956*/NULL/* B672 */, /*19957*/NULL/* B673 */,/*19958*/NULL/* B674 */,/*19959*/NULL/* B675 */,/*19960*/NULL/* B676 */,/*19961*/NULL/* B677 */, /*19962*/NULL/* B678 */,/*19963*/NULL/* B679 */,/*19964*/NULL/* B67A */,/*19965*/NULL/* B67B */,/*19966*/NULL/* B67C */, /*19967*/NULL/* B67D */,/*19968*/""/* B67E */,/*19969*/NULL/* B67F */, /*19970*/""/* B680 */,/*19971*/""/* B681 */,/*19972*/NULL/* B682 */, /*19973*/NULL/* B683 */,/*19974*/NULL/* B684 */,/*19975*/NULL/* B685 */,/*19976*/NULL/* B686 */,/*19977*/NULL/* B687 */, /*19978*/NULL/* B688 */,/*19979*/NULL/* B689 */,/*19980*/NULL/* B68A */,/*19981*/NULL/* B68B */,/*19982*/NULL/* B68C */, /*19983*/NULL/* B68D */,/*19984*/NULL/* B68E */,/*19985*/NULL/* B68F */,/*19986*/NULL/* B690 */,/*19987*/NULL/* B691 */, /*19988*/NULL/* B692 */,/*19989*/NULL/* B693 */,/*19990*/NULL/* B694 */,/*19991*/NULL/* B695 */,/*19992*/NULL/* B696 */, /*19993*/NULL/* B697 */,/*19994*/NULL/* B698 */,/*19995*/NULL/* B699 */,/*19996*/""/* B69A */, /*19997*/NULL/* B69B */,/*19998*/""/* B69C */,/*19999*/""/* B69D */, /*20000*/NULL/* B69E */,/*20001*/NULL/* B69F */,/*20002*/NULL/* B6A0 */,/*20003*/NULL/* B6A1 */,/*20004*/NULL/* B6A2 */, /*20005*/NULL/* B6A3 */,/*20006*/NULL/* B6A4 */,/*20007*/NULL/* B6A5 */,/*20008*/NULL/* B6A6 */,/*20009*/NULL/* B6A7 */, /*20010*/NULL/* B6A8 */,/*20011*/NULL/* B6A9 */,/*20012*/NULL/* B6AA */,/*20013*/NULL/* B6AB */,/*20014*/NULL/* B6AC */, /*20015*/NULL/* B6AD */,/*20016*/NULL/* B6AE */,/*20017*/NULL/* B6AF */,/*20018*/NULL/* B6B0 */,/*20019*/NULL/* B6B1 */, /*20020*/NULL/* B6B2 */,/*20021*/NULL/* B6B3 */,/*20022*/NULL/* B6B4 */,/*20023*/NULL/* B6B5 */, /*20024*/""/* B6B6 */,/*20025*/NULL/* B6B7 */,/*20026*/""/* B6B8 */, /*20027*/""/* B6B9 */,/*20028*/NULL/* B6BA */,/*20029*/NULL/* B6BB */,/*20030*/NULL/* B6BC */, /*20031*/NULL/* B6BD */,/*20032*/NULL/* B6BE */,/*20033*/NULL/* B6BF */,/*20034*/NULL/* B6C0 */,/*20035*/NULL/* B6C1 */, /*20036*/NULL/* B6C2 */,/*20037*/NULL/* B6C3 */,/*20038*/NULL/* B6C4 */,/*20039*/NULL/* B6C5 */,/*20040*/NULL/* B6C6 */, /*20041*/NULL/* B6C7 */,/*20042*/NULL/* B6C8 */,/*20043*/NULL/* B6C9 */,/*20044*/NULL/* B6CA */,/*20045*/NULL/* B6CB */, /*20046*/NULL/* B6CC */,/*20047*/NULL/* B6CD */,/*20048*/NULL/* B6CE */,/*20049*/NULL/* B6CF */,/*20050*/NULL/* B6D0 */, /*20051*/NULL/* B6D1 */,/*20052*/""/* B6D2 */,/*20053*/NULL/* B6D3 */, /*20054*/""/* B6D4 */,/*20055*/""/* B6D5 */,/*20056*/NULL/* B6D6 */, /*20057*/NULL/* B6D7 */,/*20058*/NULL/* B6D8 */,/*20059*/NULL/* B6D9 */,/*20060*/NULL/* B6DA */,/*20061*/NULL/* B6DB */, /*20062*/NULL/* B6DC */,/*20063*/NULL/* B6DD */,/*20064*/NULL/* B6DE */,/*20065*/NULL/* B6DF */,/*20066*/NULL/* B6E0 */, /*20067*/NULL/* B6E1 */,/*20068*/NULL/* B6E2 */,/*20069*/NULL/* B6E3 */,/*20070*/NULL/* B6E4 */,/*20071*/NULL/* B6E5 */, /*20072*/NULL/* B6E6 */,/*20073*/NULL/* B6E7 */,/*20074*/NULL/* B6E8 */,/*20075*/NULL/* B6E9 */,/*20076*/NULL/* B6EA */, /*20077*/NULL/* B6EB */,/*20078*/NULL/* B6EC */,/*20079*/NULL/* B6ED */,/*20080*/""/* B6EE */, /*20081*/NULL/* B6EF */,/*20082*/""/* B6F0 */,/*20083*/""/* B6F1 */, /*20084*/NULL/* B6F2 */,/*20085*/NULL/* B6F3 */,/*20086*/NULL/* B6F4 */,/*20087*/NULL/* B6F5 */,/*20088*/NULL/* B6F6 */, /*20089*/NULL/* B6F7 */,/*20090*/NULL/* B6F8 */,/*20091*/NULL/* B6F9 */,/*20092*/NULL/* B6FA */,/*20093*/NULL/* B6FB */, /*20094*/NULL/* B6FC */,/*20095*/NULL/* B6FD */,/*20096*/NULL/* B6FE */,/*20097*/NULL/* B6FF */,/*20098*/NULL/* B700 */, /*20099*/NULL/* B701 */,/*20100*/NULL/* B702 */,/*20101*/NULL/* B703 */,/*20102*/NULL/* B704 */,/*20103*/NULL/* B705 */, /*20104*/NULL/* B706 */,/*20105*/NULL/* B707 */,/*20106*/NULL/* B708 */,/*20107*/NULL/* B709 */, /*20108*/""/* B70A */,/*20109*/NULL/* B70B */,/*20110*/""/* B70C */, /*20111*/""/* B70D */,/*20112*/NULL/* B70E */,/*20113*/NULL/* B70F */,/*20114*/NULL/* B710 */, /*20115*/NULL/* B711 */,/*20116*/NULL/* B712 */,/*20117*/NULL/* B713 */,/*20118*/NULL/* B714 */,/*20119*/NULL/* B715 */, /*20120*/NULL/* B716 */,/*20121*/NULL/* B717 */,/*20122*/NULL/* B718 */,/*20123*/NULL/* B719 */,/*20124*/NULL/* B71A */, /*20125*/NULL/* B71B */,/*20126*/NULL/* B71C */,/*20127*/NULL/* B71D */,/*20128*/NULL/* B71E */,/*20129*/NULL/* B71F */, /*20130*/NULL/* B720 */,/*20131*/NULL/* B721 */,/*20132*/NULL/* B722 */,/*20133*/NULL/* B723 */,/*20134*/NULL/* B724 */, /*20135*/NULL/* B725 */,/*20136*/""/* B726 */,/*20137*/NULL/* B727 */, /*20138*/""/* B728 */,/*20139*/""/* B729 */,/*20140*/NULL/* B72A */, /*20141*/NULL/* B72B */,/*20142*/NULL/* B72C */,/*20143*/NULL/* B72D */,/*20144*/NULL/* B72E */,/*20145*/NULL/* B72F */, /*20146*/NULL/* B730 */,/*20147*/NULL/* B731 */,/*20148*/NULL/* B732 */,/*20149*/NULL/* B733 */,/*20150*/NULL/* B734 */, /*20151*/NULL/* B735 */,/*20152*/NULL/* B736 */,/*20153*/NULL/* B737 */,/*20154*/NULL/* B738 */,/*20155*/NULL/* B739 */, /*20156*/NULL/* B73A */,/*20157*/NULL/* B73B */,/*20158*/NULL/* B73C */,/*20159*/NULL/* B73D */,/*20160*/NULL/* B73E */, /*20161*/NULL/* B73F */,/*20162*/NULL/* B740 */,/*20163*/NULL/* B741 */,/*20164*/""/* B742 */, /*20165*/NULL/* B743 */,/*20166*/""/* B744 */,/*20167*/""/* B745 */, /*20168*/NULL/* B746 */,/*20169*/NULL/* B747 */,/*20170*/NULL/* B748 */,/*20171*/NULL/* B749 */,/*20172*/NULL/* B74A */, /*20173*/NULL/* B74B */,/*20174*/NULL/* B74C */,/*20175*/NULL/* B74D */,/*20176*/NULL/* B74E */,/*20177*/NULL/* B74F */, /*20178*/NULL/* B750 */,/*20179*/NULL/* B751 */,/*20180*/NULL/* B752 */,/*20181*/NULL/* B753 */,/*20182*/NULL/* B754 */, /*20183*/NULL/* B755 */,/*20184*/NULL/* B756 */,/*20185*/NULL/* B757 */,/*20186*/NULL/* B758 */,/*20187*/NULL/* B759 */, /*20188*/NULL/* B75A */,/*20189*/NULL/* B75B */,/*20190*/NULL/* B75C */,/*20191*/NULL/* B75D */, /*20192*/""/* B75E */,/*20193*/NULL/* B75F */,/*20194*/""/* B760 */, /*20195*/""/* B761 */,/*20196*/NULL/* B762 */,/*20197*/NULL/* B763 */,/*20198*/NULL/* B764 */, /*20199*/NULL/* B765 */,/*20200*/NULL/* B766 */,/*20201*/NULL/* B767 */,/*20202*/NULL/* B768 */,/*20203*/NULL/* B769 */, /*20204*/NULL/* B76A */,/*20205*/NULL/* B76B */,/*20206*/NULL/* B76C */,/*20207*/NULL/* B76D */,/*20208*/NULL/* B76E */, /*20209*/NULL/* B76F */,/*20210*/NULL/* B770 */,/*20211*/NULL/* B771 */,/*20212*/NULL/* B772 */,/*20213*/NULL/* B773 */, /*20214*/NULL/* B774 */,/*20215*/NULL/* B775 */,/*20216*/NULL/* B776 */,/*20217*/NULL/* B777 */,/*20218*/NULL/* B778 */, /*20219*/NULL/* B779 */,/*20220*/""/* B77A */,/*20221*/NULL/* B77B */, /*20222*/""/* B77C */,/*20223*/""/* B77D */,/*20224*/NULL/* B77E */, /*20225*/NULL/* B77F */,/*20226*/NULL/* B780 */,/*20227*/NULL/* B781 */,/*20228*/NULL/* B782 */,/*20229*/NULL/* B783 */, /*20230*/NULL/* B784 */,/*20231*/NULL/* B785 */,/*20232*/NULL/* B786 */,/*20233*/NULL/* B787 */,/*20234*/NULL/* B788 */, /*20235*/NULL/* B789 */,/*20236*/NULL/* B78A */,/*20237*/NULL/* B78B */,/*20238*/NULL/* B78C */,/*20239*/NULL/* B78D */, /*20240*/NULL/* B78E */,/*20241*/NULL/* B78F */,/*20242*/NULL/* B790 */,/*20243*/NULL/* B791 */,/*20244*/NULL/* B792 */, /*20245*/NULL/* B793 */,/*20246*/NULL/* B794 */,/*20247*/NULL/* B795 */,/*20248*/""/* B796 */, /*20249*/NULL/* B797 */,/*20250*/""/* B798 */,/*20251*/""/* B799 */, /*20252*/NULL/* B79A */,/*20253*/NULL/* B79B */,/*20254*/NULL/* B79C */,/*20255*/NULL/* B79D */,/*20256*/NULL/* B79E */, /*20257*/NULL/* B79F */,/*20258*/NULL/* B7A0 */,/*20259*/NULL/* B7A1 */,/*20260*/NULL/* B7A2 */,/*20261*/NULL/* B7A3 */, /*20262*/NULL/* B7A4 */,/*20263*/NULL/* B7A5 */,/*20264*/NULL/* B7A6 */,/*20265*/NULL/* B7A7 */,/*20266*/NULL/* B7A8 */, /*20267*/NULL/* B7A9 */,/*20268*/NULL/* B7AA */,/*20269*/NULL/* B7AB */,/*20270*/NULL/* B7AC */,/*20271*/NULL/* B7AD */, /*20272*/NULL/* B7AE */,/*20273*/NULL/* B7AF */,/*20274*/NULL/* B7B0 */,/*20275*/NULL/* B7B1 */, /*20276*/""/* B7B2 */,/*20277*/NULL/* B7B3 */,/*20278*/""/* B7B4 */, /*20279*/""/* B7B5 */,/*20280*/NULL/* B7B6 */,/*20281*/NULL/* B7B7 */,/*20282*/NULL/* B7B8 */, /*20283*/NULL/* B7B9 */,/*20284*/NULL/* B7BA */,/*20285*/NULL/* B7BB */,/*20286*/NULL/* B7BC */,/*20287*/NULL/* B7BD */, /*20288*/NULL/* B7BE */,/*20289*/NULL/* B7BF */,/*20290*/NULL/* B7C0 */,/*20291*/NULL/* B7C1 */,/*20292*/NULL/* B7C2 */, /*20293*/NULL/* B7C3 */,/*20294*/NULL/* B7C4 */,/*20295*/NULL/* B7C5 */,/*20296*/NULL/* B7C6 */,/*20297*/NULL/* B7C7 */, /*20298*/NULL/* B7C8 */,/*20299*/NULL/* B7C9 */,/*20300*/NULL/* B7CA */,/*20301*/NULL/* B7CB */,/*20302*/NULL/* B7CC */, /*20303*/NULL/* B7CD */,/*20304*/""/* B7CE */,/*20305*/NULL/* B7CF */, /*20306*/""/* B7D0 */,/*20307*/""/* B7D1 */,/*20308*/NULL/* B7D2 */, /*20309*/NULL/* B7D3 */,/*20310*/NULL/* B7D4 */,/*20311*/NULL/* B7D5 */,/*20312*/NULL/* B7D6 */,/*20313*/NULL/* B7D7 */, /*20314*/NULL/* B7D8 */,/*20315*/NULL/* B7D9 */,/*20316*/NULL/* B7DA */,/*20317*/NULL/* B7DB */,/*20318*/NULL/* B7DC */, /*20319*/NULL/* B7DD */,/*20320*/NULL/* B7DE */,/*20321*/NULL/* B7DF */,/*20322*/NULL/* B7E0 */,/*20323*/NULL/* B7E1 */, /*20324*/NULL/* B7E2 */,/*20325*/NULL/* B7E3 */,/*20326*/NULL/* B7E4 */,/*20327*/NULL/* B7E5 */,/*20328*/NULL/* B7E6 */, /*20329*/NULL/* B7E7 */,/*20330*/NULL/* B7E8 */,/*20331*/NULL/* B7E9 */,/*20332*/""/* B7EA */, /*20333*/NULL/* B7EB */,/*20334*/""/* B7EC */,/*20335*/""/* B7ED */, /*20336*/NULL/* B7EE */,/*20337*/NULL/* B7EF */,/*20338*/NULL/* B7F0 */,/*20339*/NULL/* B7F1 */,/*20340*/NULL/* B7F2 */, /*20341*/NULL/* B7F3 */,/*20342*/NULL/* B7F4 */,/*20343*/NULL/* B7F5 */,/*20344*/NULL/* B7F6 */,/*20345*/NULL/* B7F7 */, /*20346*/NULL/* B7F8 */,/*20347*/NULL/* B7F9 */,/*20348*/NULL/* B7FA */,/*20349*/NULL/* B7FB */,/*20350*/NULL/* B7FC */, /*20351*/NULL/* B7FD */,/*20352*/NULL/* B7FE */,/*20353*/NULL/* B7FF */,/*20354*/NULL/* B800 */,/*20355*/NULL/* B801 */, /*20356*/NULL/* B802 */,/*20357*/NULL/* B803 */,/*20358*/NULL/* B804 */,/*20359*/NULL/* B805 */, /*20360*/""/* B806 */,/*20361*/NULL/* B807 */,/*20362*/""/* B808 */, /*20363*/""/* B809 */,/*20364*/NULL/* B80A */,/*20365*/NULL/* B80B */,/*20366*/NULL/* B80C */, /*20367*/NULL/* B80D */,/*20368*/NULL/* B80E */,/*20369*/NULL/* B80F */,/*20370*/NULL/* B810 */,/*20371*/NULL/* B811 */, /*20372*/NULL/* B812 */,/*20373*/NULL/* B813 */,/*20374*/NULL/* B814 */,/*20375*/NULL/* B815 */,/*20376*/NULL/* B816 */, /*20377*/NULL/* B817 */,/*20378*/NULL/* B818 */,/*20379*/NULL/* B819 */,/*20380*/NULL/* B81A */,/*20381*/NULL/* B81B */, /*20382*/NULL/* B81C */,/*20383*/NULL/* B81D */,/*20384*/NULL/* B81E */,/*20385*/NULL/* B81F */,/*20386*/NULL/* B820 */, /*20387*/NULL/* B821 */,/*20388*/""/* B822 */,/*20389*/NULL/* B823 */, /*20390*/""/* B824 */,/*20391*/""/* B825 */,/*20392*/NULL/* B826 */, /*20393*/NULL/* B827 */,/*20394*/NULL/* B828 */,/*20395*/NULL/* B829 */,/*20396*/NULL/* B82A */,/*20397*/NULL/* B82B */, /*20398*/NULL/* B82C */,/*20399*/NULL/* B82D */,/*20400*/NULL/* B82E */,/*20401*/NULL/* B82F */,/*20402*/NULL/* B830 */, /*20403*/NULL/* B831 */,/*20404*/NULL/* B832 */,/*20405*/NULL/* B833 */,/*20406*/NULL/* B834 */,/*20407*/NULL/* B835 */, /*20408*/NULL/* B836 */,/*20409*/NULL/* B837 */,/*20410*/NULL/* B838 */,/*20411*/NULL/* B839 */,/*20412*/NULL/* B83A */, /*20413*/NULL/* B83B */,/*20414*/NULL/* B83C */,/*20415*/NULL/* B83D */,/*20416*/""/* B83E */, /*20417*/NULL/* B83F */,/*20418*/""/* B840 */,/*20419*/""/* B841 */, /*20420*/NULL/* B842 */,/*20421*/NULL/* B843 */,/*20422*/NULL/* B844 */,/*20423*/NULL/* B845 */,/*20424*/NULL/* B846 */, /*20425*/NULL/* B847 */,/*20426*/NULL/* B848 */,/*20427*/NULL/* B849 */,/*20428*/NULL/* B84A */,/*20429*/NULL/* B84B */, /*20430*/NULL/* B84C */,/*20431*/NULL/* B84D */,/*20432*/NULL/* B84E */,/*20433*/NULL/* B84F */,/*20434*/NULL/* B850 */, /*20435*/NULL/* B851 */,/*20436*/NULL/* B852 */,/*20437*/NULL/* B853 */,/*20438*/NULL/* B854 */,/*20439*/NULL/* B855 */, /*20440*/NULL/* B856 */,/*20441*/NULL/* B857 */,/*20442*/NULL/* B858 */,/*20443*/NULL/* B859 */, /*20444*/""/* B85A */,/*20445*/NULL/* B85B */,/*20446*/""/* B85C */, /*20447*/""/* B85D */,/*20448*/NULL/* B85E */,/*20449*/NULL/* B85F */,/*20450*/NULL/* B860 */, /*20451*/NULL/* B861 */,/*20452*/NULL/* B862 */,/*20453*/NULL/* B863 */,/*20454*/NULL/* B864 */,/*20455*/NULL/* B865 */, /*20456*/NULL/* B866 */,/*20457*/NULL/* B867 */,/*20458*/NULL/* B868 */,/*20459*/NULL/* B869 */,/*20460*/NULL/* B86A */, /*20461*/NULL/* B86B */,/*20462*/NULL/* B86C */,/*20463*/NULL/* B86D */,/*20464*/NULL/* B86E */,/*20465*/NULL/* B86F */, /*20466*/NULL/* B870 */,/*20467*/NULL/* B871 */,/*20468*/NULL/* B872 */,/*20469*/NULL/* B873 */,/*20470*/NULL/* B874 */, /*20471*/NULL/* B875 */,/*20472*/""/* B876 */,/*20473*/NULL/* B877 */, /*20474*/""/* B878 */,/*20475*/""/* B879 */,/*20476*/NULL/* B87A */, /*20477*/NULL/* B87B */,/*20478*/NULL/* B87C */,/*20479*/NULL/* B87D */,/*20480*/NULL/* B87E */,/*20481*/NULL/* B87F */, /*20482*/NULL/* B880 */,/*20483*/NULL/* B881 */,/*20484*/NULL/* B882 */,/*20485*/NULL/* B883 */,/*20486*/NULL/* B884 */, /*20487*/NULL/* B885 */,/*20488*/NULL/* B886 */,/*20489*/NULL/* B887 */,/*20490*/NULL/* B888 */,/*20491*/NULL/* B889 */, /*20492*/NULL/* B88A */,/*20493*/NULL/* B88B */,/*20494*/NULL/* B88C */,/*20495*/NULL/* B88D */,/*20496*/NULL/* B88E */, /*20497*/NULL/* B88F */,/*20498*/NULL/* B890 */,/*20499*/NULL/* B891 */,/*20500*/""/* B892 */, /*20501*/NULL/* B893 */,/*20502*/""/* B894 */,/*20503*/""/* B895 */, /*20504*/NULL/* B896 */,/*20505*/NULL/* B897 */,/*20506*/NULL/* B898 */,/*20507*/NULL/* B899 */,/*20508*/NULL/* B89A */, /*20509*/NULL/* B89B */,/*20510*/NULL/* B89C */,/*20511*/NULL/* B89D */,/*20512*/NULL/* B89E */,/*20513*/NULL/* B89F */, /*20514*/NULL/* B8A0 */,/*20515*/NULL/* B8A1 */,/*20516*/NULL/* B8A2 */,/*20517*/NULL/* B8A3 */,/*20518*/NULL/* B8A4 */, /*20519*/NULL/* B8A5 */,/*20520*/NULL/* B8A6 */,/*20521*/NULL/* B8A7 */,/*20522*/NULL/* B8A8 */,/*20523*/NULL/* B8A9 */, /*20524*/NULL/* B8AA */,/*20525*/NULL/* B8AB */,/*20526*/NULL/* B8AC */,/*20527*/NULL/* B8AD */, /*20528*/""/* B8AE */,/*20529*/NULL/* B8AF */,/*20530*/""/* B8B0 */, /*20531*/""/* B8B1 */,/*20532*/NULL/* B8B2 */,/*20533*/NULL/* B8B3 */,/*20534*/NULL/* B8B4 */, /*20535*/NULL/* B8B5 */,/*20536*/NULL/* B8B6 */,/*20537*/NULL/* B8B7 */,/*20538*/NULL/* B8B8 */,/*20539*/NULL/* B8B9 */, /*20540*/NULL/* B8BA */,/*20541*/NULL/* B8BB */,/*20542*/NULL/* B8BC */,/*20543*/NULL/* B8BD */,/*20544*/NULL/* B8BE */, /*20545*/NULL/* B8BF */,/*20546*/NULL/* B8C0 */,/*20547*/NULL/* B8C1 */,/*20548*/NULL/* B8C2 */,/*20549*/NULL/* B8C3 */, /*20550*/NULL/* B8C4 */,/*20551*/NULL/* B8C5 */,/*20552*/NULL/* B8C6 */,/*20553*/NULL/* B8C7 */,/*20554*/NULL/* B8C8 */, /*20555*/NULL/* B8C9 */,/*20556*/""/* B8CA */,/*20557*/NULL/* B8CB */, /*20558*/""/* B8CC */,/*20559*/""/* B8CD */,/*20560*/NULL/* B8CE */, /*20561*/NULL/* B8CF */,/*20562*/NULL/* B8D0 */,/*20563*/NULL/* B8D1 */,/*20564*/NULL/* B8D2 */,/*20565*/NULL/* B8D3 */, /*20566*/NULL/* B8D4 */,/*20567*/NULL/* B8D5 */,/*20568*/NULL/* B8D6 */,/*20569*/NULL/* B8D7 */,/*20570*/NULL/* B8D8 */, /*20571*/NULL/* B8D9 */,/*20572*/NULL/* B8DA */,/*20573*/NULL/* B8DB */,/*20574*/NULL/* B8DC */,/*20575*/NULL/* B8DD */, /*20576*/NULL/* B8DE */,/*20577*/NULL/* B8DF */,/*20578*/NULL/* B8E0 */,/*20579*/NULL/* B8E1 */,/*20580*/NULL/* B8E2 */, /*20581*/NULL/* B8E3 */,/*20582*/NULL/* B8E4 */,/*20583*/NULL/* B8E5 */,/*20584*/""/* B8E6 */, /*20585*/NULL/* B8E7 */,/*20586*/""/* B8E8 */,/*20587*/""/* B8E9 */, /*20588*/NULL/* B8EA */,/*20589*/NULL/* B8EB */,/*20590*/NULL/* B8EC */,/*20591*/NULL/* B8ED */,/*20592*/NULL/* B8EE */, /*20593*/NULL/* B8EF */,/*20594*/NULL/* B8F0 */,/*20595*/NULL/* B8F1 */,/*20596*/NULL/* B8F2 */,/*20597*/NULL/* B8F3 */, /*20598*/NULL/* B8F4 */,/*20599*/NULL/* B8F5 */,/*20600*/NULL/* B8F6 */,/*20601*/NULL/* B8F7 */,/*20602*/NULL/* B8F8 */, /*20603*/NULL/* B8F9 */,/*20604*/NULL/* B8FA */,/*20605*/NULL/* B8FB */,/*20606*/NULL/* B8FC */,/*20607*/NULL/* B8FD */, /*20608*/NULL/* B8FE */,/*20609*/NULL/* B8FF */,/*20610*/NULL/* B900 */,/*20611*/NULL/* B901 */, /*20612*/""/* B902 */,/*20613*/NULL/* B903 */,/*20614*/""/* B904 */, /*20615*/""/* B905 */,/*20616*/NULL/* B906 */,/*20617*/NULL/* B907 */,/*20618*/NULL/* B908 */, /*20619*/NULL/* B909 */,/*20620*/NULL/* B90A */,/*20621*/NULL/* B90B */,/*20622*/NULL/* B90C */,/*20623*/NULL/* B90D */, /*20624*/NULL/* B90E */,/*20625*/NULL/* B90F */,/*20626*/NULL/* B910 */,/*20627*/NULL/* B911 */,/*20628*/NULL/* B912 */, /*20629*/NULL/* B913 */,/*20630*/NULL/* B914 */,/*20631*/NULL/* B915 */,/*20632*/NULL/* B916 */,/*20633*/NULL/* B917 */, /*20634*/NULL/* B918 */,/*20635*/NULL/* B919 */,/*20636*/NULL/* B91A */,/*20637*/NULL/* B91B */,/*20638*/NULL/* B91C */, /*20639*/NULL/* B91D */,/*20640*/""/* B91E */,/*20641*/NULL/* B91F */, /*20642*/""/* B920 */,/*20643*/""/* B921 */,/*20644*/NULL/* B922 */, /*20645*/NULL/* B923 */,/*20646*/NULL/* B924 */,/*20647*/NULL/* B925 */,/*20648*/NULL/* B926 */,/*20649*/NULL/* B927 */, /*20650*/NULL/* B928 */,/*20651*/NULL/* B929 */,/*20652*/NULL/* B92A */,/*20653*/NULL/* B92B */,/*20654*/NULL/* B92C */, /*20655*/NULL/* B92D */,/*20656*/NULL/* B92E */,/*20657*/NULL/* B92F */,/*20658*/NULL/* B930 */,/*20659*/NULL/* B931 */, /*20660*/NULL/* B932 */,/*20661*/NULL/* B933 */,/*20662*/NULL/* B934 */,/*20663*/NULL/* B935 */,/*20664*/NULL/* B936 */, /*20665*/NULL/* B937 */,/*20666*/NULL/* B938 */,/*20667*/NULL/* B939 */,/*20668*/""/* B93A */, /*20669*/NULL/* B93B */,/*20670*/""/* B93C */,/*20671*/""/* B93D */, /*20672*/NULL/* B93E */,/*20673*/NULL/* B93F */,/*20674*/NULL/* B940 */,/*20675*/NULL/* B941 */,/*20676*/NULL/* B942 */, /*20677*/NULL/* B943 */,/*20678*/NULL/* B944 */,/*20679*/NULL/* B945 */,/*20680*/NULL/* B946 */,/*20681*/NULL/* B947 */, /*20682*/NULL/* B948 */,/*20683*/NULL/* B949 */,/*20684*/NULL/* B94A */,/*20685*/NULL/* B94B */,/*20686*/NULL/* B94C */, /*20687*/NULL/* B94D */,/*20688*/NULL/* B94E */,/*20689*/NULL/* B94F */,/*20690*/NULL/* B950 */,/*20691*/NULL/* B951 */, /*20692*/NULL/* B952 */,/*20693*/NULL/* B953 */,/*20694*/NULL/* B954 */,/*20695*/NULL/* B955 */, /*20696*/""/* B956 */,/*20697*/NULL/* B957 */,/*20698*/""/* B958 */, /*20699*/""/* B959 */,/*20700*/NULL/* B95A */,/*20701*/NULL/* B95B */,/*20702*/NULL/* B95C */, /*20703*/NULL/* B95D */,/*20704*/NULL/* B95E */,/*20705*/NULL/* B95F */,/*20706*/NULL/* B960 */,/*20707*/NULL/* B961 */, /*20708*/NULL/* B962 */,/*20709*/NULL/* B963 */,/*20710*/NULL/* B964 */,/*20711*/NULL/* B965 */,/*20712*/NULL/* B966 */, /*20713*/NULL/* B967 */,/*20714*/NULL/* B968 */,/*20715*/NULL/* B969 */,/*20716*/NULL/* B96A */,/*20717*/NULL/* B96B */, /*20718*/NULL/* B96C */,/*20719*/NULL/* B96D */,/*20720*/NULL/* B96E */,/*20721*/NULL/* B96F */,/*20722*/NULL/* B970 */, /*20723*/NULL/* B971 */,/*20724*/""/* B972 */,/*20725*/NULL/* B973 */, /*20726*/""/* B974 */,/*20727*/""/* B975 */,/*20728*/NULL/* B976 */, /*20729*/NULL/* B977 */,/*20730*/NULL/* B978 */,/*20731*/NULL/* B979 */,/*20732*/NULL/* B97A */,/*20733*/NULL/* B97B */, /*20734*/NULL/* B97C */,/*20735*/NULL/* B97D */,/*20736*/NULL/* B97E */,/*20737*/NULL/* B97F */,/*20738*/NULL/* B980 */, /*20739*/NULL/* B981 */,/*20740*/NULL/* B982 */,/*20741*/NULL/* B983 */,/*20742*/NULL/* B984 */,/*20743*/NULL/* B985 */, /*20744*/NULL/* B986 */,/*20745*/NULL/* B987 */,/*20746*/NULL/* B988 */,/*20747*/NULL/* B989 */,/*20748*/NULL/* B98A */, /*20749*/NULL/* B98B */,/*20750*/NULL/* B98C */,/*20751*/NULL/* B98D */,/*20752*/""/* B98E */, /*20753*/NULL/* B98F */,/*20754*/""/* B990 */,/*20755*/""/* B991 */, /*20756*/NULL/* B992 */,/*20757*/NULL/* B993 */,/*20758*/NULL/* B994 */,/*20759*/NULL/* B995 */,/*20760*/NULL/* B996 */, /*20761*/NULL/* B997 */,/*20762*/NULL/* B998 */,/*20763*/NULL/* B999 */,/*20764*/NULL/* B99A */,/*20765*/NULL/* B99B */, /*20766*/NULL/* B99C */,/*20767*/NULL/* B99D */,/*20768*/NULL/* B99E */,/*20769*/NULL/* B99F */,/*20770*/NULL/* B9A0 */, /*20771*/NULL/* B9A1 */,/*20772*/NULL/* B9A2 */,/*20773*/NULL/* B9A3 */,/*20774*/NULL/* B9A4 */,/*20775*/NULL/* B9A5 */, /*20776*/NULL/* B9A6 */,/*20777*/NULL/* B9A7 */,/*20778*/NULL/* B9A8 */,/*20779*/NULL/* B9A9 */, /*20780*/""/* B9AA */,/*20781*/NULL/* B9AB */,/*20782*/""/* B9AC */, /*20783*/""/* B9AD */,/*20784*/NULL/* B9AE */,/*20785*/NULL/* B9AF */,/*20786*/NULL/* B9B0 */, /*20787*/NULL/* B9B1 */,/*20788*/NULL/* B9B2 */,/*20789*/NULL/* B9B3 */,/*20790*/NULL/* B9B4 */,/*20791*/NULL/* B9B5 */, /*20792*/NULL/* B9B6 */,/*20793*/NULL/* B9B7 */,/*20794*/NULL/* B9B8 */,/*20795*/NULL/* B9B9 */,/*20796*/NULL/* B9BA */, /*20797*/NULL/* B9BB */,/*20798*/NULL/* B9BC */,/*20799*/NULL/* B9BD */,/*20800*/NULL/* B9BE */,/*20801*/NULL/* B9BF */, /*20802*/NULL/* B9C0 */,/*20803*/NULL/* B9C1 */,/*20804*/NULL/* B9C2 */,/*20805*/NULL/* B9C3 */,/*20806*/NULL/* B9C4 */, /*20807*/NULL/* B9C5 */,/*20808*/""/* B9C6 */,/*20809*/NULL/* B9C7 */, /*20810*/""/* B9C8 */,/*20811*/""/* B9C9 */,/*20812*/NULL/* B9CA */, /*20813*/NULL/* B9CB */,/*20814*/NULL/* B9CC */,/*20815*/NULL/* B9CD */,/*20816*/NULL/* B9CE */,/*20817*/NULL/* B9CF */, /*20818*/NULL/* B9D0 */,/*20819*/NULL/* B9D1 */,/*20820*/NULL/* B9D2 */,/*20821*/NULL/* B9D3 */,/*20822*/NULL/* B9D4 */, /*20823*/NULL/* B9D5 */,/*20824*/NULL/* B9D6 */,/*20825*/NULL/* B9D7 */,/*20826*/NULL/* B9D8 */,/*20827*/NULL/* B9D9 */, /*20828*/NULL/* B9DA */,/*20829*/NULL/* B9DB */,/*20830*/NULL/* B9DC */,/*20831*/NULL/* B9DD */,/*20832*/NULL/* B9DE */, /*20833*/NULL/* B9DF */,/*20834*/NULL/* B9E0 */,/*20835*/NULL/* B9E1 */,/*20836*/""/* B9E2 */, /*20837*/NULL/* B9E3 */,/*20838*/""/* B9E4 */,/*20839*/""/* B9E5 */, /*20840*/NULL/* B9E6 */,/*20841*/NULL/* B9E7 */,/*20842*/NULL/* B9E8 */,/*20843*/NULL/* B9E9 */,/*20844*/NULL/* B9EA */, /*20845*/NULL/* B9EB */,/*20846*/NULL/* B9EC */,/*20847*/NULL/* B9ED */,/*20848*/NULL/* B9EE */,/*20849*/NULL/* B9EF */, /*20850*/NULL/* B9F0 */,/*20851*/NULL/* B9F1 */,/*20852*/NULL/* B9F2 */,/*20853*/NULL/* B9F3 */,/*20854*/NULL/* B9F4 */, /*20855*/NULL/* B9F5 */,/*20856*/NULL/* B9F6 */,/*20857*/NULL/* B9F7 */,/*20858*/NULL/* B9F8 */,/*20859*/NULL/* B9F9 */, /*20860*/NULL/* B9FA */,/*20861*/NULL/* B9FB */,/*20862*/NULL/* B9FC */,/*20863*/NULL/* B9FD */, /*20864*/""/* B9FE */,/*20865*/NULL/* B9FF */,/*20866*/""/* BA00 */, /*20867*/""/* BA01 */,/*20868*/NULL/* BA02 */,/*20869*/NULL/* BA03 */,/*20870*/NULL/* BA04 */, /*20871*/NULL/* BA05 */,/*20872*/NULL/* BA06 */,/*20873*/NULL/* BA07 */,/*20874*/NULL/* BA08 */,/*20875*/NULL/* BA09 */, /*20876*/NULL/* BA0A */,/*20877*/NULL/* BA0B */,/*20878*/NULL/* BA0C */,/*20879*/NULL/* BA0D */,/*20880*/NULL/* BA0E */, /*20881*/NULL/* BA0F */,/*20882*/NULL/* BA10 */,/*20883*/NULL/* BA11 */,/*20884*/NULL/* BA12 */,/*20885*/NULL/* BA13 */, /*20886*/NULL/* BA14 */,/*20887*/NULL/* BA15 */,/*20888*/NULL/* BA16 */,/*20889*/NULL/* BA17 */,/*20890*/NULL/* BA18 */, /*20891*/NULL/* BA19 */,/*20892*/""/* BA1A */,/*20893*/NULL/* BA1B */, /*20894*/""/* BA1C */,/*20895*/""/* BA1D */,/*20896*/NULL/* BA1E */, /*20897*/NULL/* BA1F */,/*20898*/NULL/* BA20 */,/*20899*/NULL/* BA21 */,/*20900*/NULL/* BA22 */,/*20901*/NULL/* BA23 */, /*20902*/NULL/* BA24 */,/*20903*/NULL/* BA25 */,/*20904*/NULL/* BA26 */,/*20905*/NULL/* BA27 */,/*20906*/NULL/* BA28 */, /*20907*/NULL/* BA29 */,/*20908*/NULL/* BA2A */,/*20909*/NULL/* BA2B */,/*20910*/NULL/* BA2C */,/*20911*/NULL/* BA2D */, /*20912*/NULL/* BA2E */,/*20913*/NULL/* BA2F */,/*20914*/NULL/* BA30 */,/*20915*/NULL/* BA31 */,/*20916*/NULL/* BA32 */, /*20917*/NULL/* BA33 */,/*20918*/NULL/* BA34 */,/*20919*/NULL/* BA35 */,/*20920*/""/* BA36 */, /*20921*/NULL/* BA37 */,/*20922*/""/* BA38 */,/*20923*/""/* BA39 */, /*20924*/NULL/* BA3A */,/*20925*/NULL/* BA3B */,/*20926*/NULL/* BA3C */,/*20927*/NULL/* BA3D */,/*20928*/NULL/* BA3E */, /*20929*/NULL/* BA3F */,/*20930*/NULL/* BA40 */,/*20931*/NULL/* BA41 */,/*20932*/NULL/* BA42 */,/*20933*/NULL/* BA43 */, /*20934*/NULL/* BA44 */,/*20935*/NULL/* BA45 */,/*20936*/NULL/* BA46 */,/*20937*/NULL/* BA47 */,/*20938*/NULL/* BA48 */, /*20939*/NULL/* BA49 */,/*20940*/NULL/* BA4A */,/*20941*/NULL/* BA4B */,/*20942*/NULL/* BA4C */,/*20943*/NULL/* BA4D */, /*20944*/NULL/* BA4E */,/*20945*/NULL/* BA4F */,/*20946*/NULL/* BA50 */,/*20947*/NULL/* BA51 */, /*20948*/""/* BA52 */,/*20949*/NULL/* BA53 */,/*20950*/""/* BA54 */, /*20951*/""/* BA55 */,/*20952*/NULL/* BA56 */,/*20953*/NULL/* BA57 */,/*20954*/NULL/* BA58 */, /*20955*/NULL/* BA59 */,/*20956*/NULL/* BA5A */,/*20957*/NULL/* BA5B */,/*20958*/NULL/* BA5C */,/*20959*/NULL/* BA5D */, /*20960*/NULL/* BA5E */,/*20961*/NULL/* BA5F */,/*20962*/NULL/* BA60 */,/*20963*/NULL/* BA61 */,/*20964*/NULL/* BA62 */, /*20965*/NULL/* BA63 */,/*20966*/NULL/* BA64 */,/*20967*/NULL/* BA65 */,/*20968*/NULL/* BA66 */,/*20969*/NULL/* BA67 */, /*20970*/NULL/* BA68 */,/*20971*/NULL/* BA69 */,/*20972*/NULL/* BA6A */,/*20973*/NULL/* BA6B */,/*20974*/NULL/* BA6C */, /*20975*/NULL/* BA6D */,/*20976*/""/* BA6E */,/*20977*/NULL/* BA6F */, /*20978*/""/* BA70 */,/*20979*/""/* BA71 */,/*20980*/NULL/* BA72 */, /*20981*/NULL/* BA73 */,/*20982*/NULL/* BA74 */,/*20983*/NULL/* BA75 */,/*20984*/NULL/* BA76 */,/*20985*/NULL/* BA77 */, /*20986*/NULL/* BA78 */,/*20987*/NULL/* BA79 */,/*20988*/NULL/* BA7A */,/*20989*/NULL/* BA7B */,/*20990*/NULL/* BA7C */, /*20991*/NULL/* BA7D */,/*20992*/NULL/* BA7E */,/*20993*/NULL/* BA7F */,/*20994*/NULL/* BA80 */,/*20995*/NULL/* BA81 */, /*20996*/NULL/* BA82 */,/*20997*/NULL/* BA83 */,/*20998*/NULL/* BA84 */,/*20999*/NULL/* BA85 */,/*21000*/NULL/* BA86 */, /*21001*/NULL/* BA87 */,/*21002*/NULL/* BA88 */,/*21003*/NULL/* BA89 */,/*21004*/""/* BA8A */, /*21005*/NULL/* BA8B */,/*21006*/""/* BA8C */,/*21007*/""/* BA8D */, /*21008*/NULL/* BA8E */,/*21009*/NULL/* BA8F */,/*21010*/NULL/* BA90 */,/*21011*/NULL/* BA91 */,/*21012*/NULL/* BA92 */, /*21013*/NULL/* BA93 */,/*21014*/NULL/* BA94 */,/*21015*/NULL/* BA95 */,/*21016*/NULL/* BA96 */,/*21017*/NULL/* BA97 */, /*21018*/NULL/* BA98 */,/*21019*/NULL/* BA99 */,/*21020*/NULL/* BA9A */,/*21021*/NULL/* BA9B */,/*21022*/NULL/* BA9C */, /*21023*/NULL/* BA9D */,/*21024*/NULL/* BA9E */,/*21025*/NULL/* BA9F */,/*21026*/NULL/* BAA0 */,/*21027*/NULL/* BAA1 */, /*21028*/NULL/* BAA2 */,/*21029*/NULL/* BAA3 */,/*21030*/NULL/* BAA4 */,/*21031*/NULL/* BAA5 */, /*21032*/""/* BAA6 */,/*21033*/NULL/* BAA7 */,/*21034*/""/* BAA8 */, /*21035*/""/* BAA9 */,/*21036*/NULL/* BAAA */,/*21037*/NULL/* BAAB */,/*21038*/NULL/* BAAC */, /*21039*/NULL/* BAAD */,/*21040*/NULL/* BAAE */,/*21041*/NULL/* BAAF */,/*21042*/NULL/* BAB0 */,/*21043*/NULL/* BAB1 */, /*21044*/NULL/* BAB2 */,/*21045*/NULL/* BAB3 */,/*21046*/NULL/* BAB4 */,/*21047*/NULL/* BAB5 */,/*21048*/NULL/* BAB6 */, /*21049*/NULL/* BAB7 */,/*21050*/NULL/* BAB8 */,/*21051*/NULL/* BAB9 */,/*21052*/NULL/* BABA */,/*21053*/NULL/* BABB */, /*21054*/NULL/* BABC */,/*21055*/NULL/* BABD */,/*21056*/NULL/* BABE */,/*21057*/NULL/* BABF */,/*21058*/NULL/* BAC0 */, /*21059*/NULL/* BAC1 */,/*21060*/""/* BAC2 */,/*21061*/NULL/* BAC3 */, /*21062*/""/* BAC4 */,/*21063*/""/* BAC5 */,/*21064*/NULL/* BAC6 */, /*21065*/NULL/* BAC7 */,/*21066*/NULL/* BAC8 */,/*21067*/NULL/* BAC9 */,/*21068*/NULL/* BACA */,/*21069*/NULL/* BACB */, /*21070*/NULL/* BACC */,/*21071*/NULL/* BACD */,/*21072*/NULL/* BACE */,/*21073*/NULL/* BACF */,/*21074*/NULL/* BAD0 */, /*21075*/NULL/* BAD1 */,/*21076*/NULL/* BAD2 */,/*21077*/NULL/* BAD3 */,/*21078*/NULL/* BAD4 */,/*21079*/NULL/* BAD5 */, /*21080*/NULL/* BAD6 */,/*21081*/NULL/* BAD7 */,/*21082*/NULL/* BAD8 */,/*21083*/NULL/* BAD9 */,/*21084*/NULL/* BADA */, /*21085*/NULL/* BADB */,/*21086*/NULL/* BADC */,/*21087*/NULL/* BADD */,/*21088*/""/* BADE */, /*21089*/NULL/* BADF */,/*21090*/""/* BAE0 */,/*21091*/""/* BAE1 */, /*21092*/NULL/* BAE2 */,/*21093*/NULL/* BAE3 */,/*21094*/NULL/* BAE4 */,/*21095*/NULL/* BAE5 */,/*21096*/NULL/* BAE6 */, /*21097*/NULL/* BAE7 */,/*21098*/NULL/* BAE8 */,/*21099*/NULL/* BAE9 */,/*21100*/NULL/* BAEA */,/*21101*/NULL/* BAEB */, /*21102*/NULL/* BAEC */,/*21103*/NULL/* BAED */,/*21104*/NULL/* BAEE */,/*21105*/NULL/* BAEF */,/*21106*/NULL/* BAF0 */, /*21107*/NULL/* BAF1 */,/*21108*/NULL/* BAF2 */,/*21109*/NULL/* BAF3 */,/*21110*/NULL/* BAF4 */,/*21111*/NULL/* BAF5 */, /*21112*/NULL/* BAF6 */,/*21113*/NULL/* BAF7 */,/*21114*/NULL/* BAF8 */,/*21115*/NULL/* BAF9 */, /*21116*/""/* BAFA */,/*21117*/NULL/* BAFB */,/*21118*/""/* BAFC */, /*21119*/""/* BAFD */,/*21120*/NULL/* BAFE */,/*21121*/NULL/* BAFF */,/*21122*/NULL/* BB00 */, /*21123*/NULL/* BB01 */,/*21124*/NULL/* BB02 */,/*21125*/NULL/* BB03 */,/*21126*/NULL/* BB04 */,/*21127*/NULL/* BB05 */, /*21128*/NULL/* BB06 */,/*21129*/NULL/* BB07 */,/*21130*/NULL/* BB08 */,/*21131*/NULL/* BB09 */,/*21132*/NULL/* BB0A */, /*21133*/NULL/* BB0B */,/*21134*/NULL/* BB0C */,/*21135*/NULL/* BB0D */,/*21136*/NULL/* BB0E */,/*21137*/NULL/* BB0F */, /*21138*/NULL/* BB10 */,/*21139*/NULL/* BB11 */,/*21140*/NULL/* BB12 */,/*21141*/NULL/* BB13 */,/*21142*/NULL/* BB14 */, /*21143*/NULL/* BB15 */,/*21144*/""/* BB16 */,/*21145*/NULL/* BB17 */, /*21146*/""/* BB18 */,/*21147*/""/* BB19 */,/*21148*/NULL/* BB1A */, /*21149*/NULL/* BB1B */,/*21150*/NULL/* BB1C */,/*21151*/NULL/* BB1D */,/*21152*/NULL/* BB1E */,/*21153*/NULL/* BB1F */, /*21154*/NULL/* BB20 */,/*21155*/NULL/* BB21 */,/*21156*/NULL/* BB22 */,/*21157*/NULL/* BB23 */,/*21158*/NULL/* BB24 */, /*21159*/NULL/* BB25 */,/*21160*/NULL/* BB26 */,/*21161*/NULL/* BB27 */,/*21162*/NULL/* BB28 */,/*21163*/NULL/* BB29 */, /*21164*/NULL/* BB2A */,/*21165*/NULL/* BB2B */,/*21166*/NULL/* BB2C */,/*21167*/NULL/* BB2D */,/*21168*/NULL/* BB2E */, /*21169*/NULL/* BB2F */,/*21170*/NULL/* BB30 */,/*21171*/NULL/* BB31 */,/*21172*/""/* BB32 */, /*21173*/NULL/* BB33 */,/*21174*/""/* BB34 */,/*21175*/""/* BB35 */, /*21176*/NULL/* BB36 */,/*21177*/NULL/* BB37 */,/*21178*/NULL/* BB38 */,/*21179*/NULL/* BB39 */,/*21180*/NULL/* BB3A */, /*21181*/NULL/* BB3B */,/*21182*/NULL/* BB3C */,/*21183*/NULL/* BB3D */,/*21184*/NULL/* BB3E */,/*21185*/NULL/* BB3F */, /*21186*/NULL/* BB40 */,/*21187*/NULL/* BB41 */,/*21188*/NULL/* BB42 */,/*21189*/NULL/* BB43 */,/*21190*/NULL/* BB44 */, /*21191*/NULL/* BB45 */,/*21192*/NULL/* BB46 */,/*21193*/NULL/* BB47 */,/*21194*/NULL/* BB48 */,/*21195*/NULL/* BB49 */, /*21196*/NULL/* BB4A */,/*21197*/NULL/* BB4B */,/*21198*/NULL/* BB4C */,/*21199*/NULL/* BB4D */, /*21200*/""/* BB4E */,/*21201*/NULL/* BB4F */,/*21202*/""/* BB50 */, /*21203*/""/* BB51 */,/*21204*/NULL/* BB52 */,/*21205*/NULL/* BB53 */,/*21206*/NULL/* BB54 */, /*21207*/NULL/* BB55 */,/*21208*/NULL/* BB56 */,/*21209*/NULL/* BB57 */,/*21210*/NULL/* BB58 */,/*21211*/NULL/* BB59 */, /*21212*/NULL/* BB5A */,/*21213*/NULL/* BB5B */,/*21214*/NULL/* BB5C */,/*21215*/NULL/* BB5D */,/*21216*/NULL/* BB5E */, /*21217*/NULL/* BB5F */,/*21218*/NULL/* BB60 */,/*21219*/NULL/* BB61 */,/*21220*/NULL/* BB62 */,/*21221*/NULL/* BB63 */, /*21222*/NULL/* BB64 */,/*21223*/NULL/* BB65 */,/*21224*/NULL/* BB66 */,/*21225*/NULL/* BB67 */,/*21226*/NULL/* BB68 */, /*21227*/NULL/* BB69 */,/*21228*/""/* BB6A */,/*21229*/NULL/* BB6B */, /*21230*/""/* BB6C */,/*21231*/""/* BB6D */,/*21232*/NULL/* BB6E */, /*21233*/NULL/* BB6F */,/*21234*/NULL/* BB70 */,/*21235*/NULL/* BB71 */,/*21236*/NULL/* BB72 */,/*21237*/NULL/* BB73 */, /*21238*/NULL/* BB74 */,/*21239*/NULL/* BB75 */,/*21240*/NULL/* BB76 */,/*21241*/NULL/* BB77 */,/*21242*/NULL/* BB78 */, /*21243*/NULL/* BB79 */,/*21244*/NULL/* BB7A */,/*21245*/NULL/* BB7B */,/*21246*/NULL/* BB7C */,/*21247*/NULL/* BB7D */, /*21248*/NULL/* BB7E */,/*21249*/NULL/* BB7F */,/*21250*/NULL/* BB80 */,/*21251*/NULL/* BB81 */,/*21252*/NULL/* BB82 */, /*21253*/NULL/* BB83 */,/*21254*/NULL/* BB84 */,/*21255*/NULL/* BB85 */,/*21256*/""/* BB86 */, /*21257*/NULL/* BB87 */,/*21258*/""/* BB88 */,/*21259*/""/* BB89 */, /*21260*/NULL/* BB8A */,/*21261*/NULL/* BB8B */,/*21262*/NULL/* BB8C */,/*21263*/NULL/* BB8D */,/*21264*/NULL/* BB8E */, /*21265*/NULL/* BB8F */,/*21266*/NULL/* BB90 */,/*21267*/NULL/* BB91 */,/*21268*/NULL/* BB92 */,/*21269*/NULL/* BB93 */, /*21270*/NULL/* BB94 */,/*21271*/NULL/* BB95 */,/*21272*/NULL/* BB96 */,/*21273*/NULL/* BB97 */,/*21274*/NULL/* BB98 */, /*21275*/NULL/* BB99 */,/*21276*/NULL/* BB9A */,/*21277*/NULL/* BB9B */,/*21278*/NULL/* BB9C */,/*21279*/NULL/* BB9D */, /*21280*/NULL/* BB9E */,/*21281*/NULL/* BB9F */,/*21282*/NULL/* BBA0 */,/*21283*/NULL/* BBA1 */, /*21284*/""/* BBA2 */,/*21285*/NULL/* BBA3 */,/*21286*/""/* BBA4 */, /*21287*/""/* BBA5 */,/*21288*/NULL/* BBA6 */,/*21289*/NULL/* BBA7 */,/*21290*/NULL/* BBA8 */, /*21291*/NULL/* BBA9 */,/*21292*/NULL/* BBAA */,/*21293*/NULL/* BBAB */,/*21294*/NULL/* BBAC */,/*21295*/NULL/* BBAD */, /*21296*/NULL/* BBAE */,/*21297*/NULL/* BBAF */,/*21298*/NULL/* BBB0 */,/*21299*/NULL/* BBB1 */,/*21300*/NULL/* BBB2 */, /*21301*/NULL/* BBB3 */,/*21302*/NULL/* BBB4 */,/*21303*/NULL/* BBB5 */,/*21304*/NULL/* BBB6 */,/*21305*/NULL/* BBB7 */, /*21306*/NULL/* BBB8 */,/*21307*/NULL/* BBB9 */,/*21308*/NULL/* BBBA */,/*21309*/NULL/* BBBB */,/*21310*/NULL/* BBBC */, /*21311*/NULL/* BBBD */,/*21312*/""/* BBBE */,/*21313*/NULL/* BBBF */, /*21314*/""/* BBC0 */,/*21315*/""/* BBC1 */,/*21316*/NULL/* BBC2 */, /*21317*/NULL/* BBC3 */,/*21318*/NULL/* BBC4 */,/*21319*/NULL/* BBC5 */,/*21320*/NULL/* BBC6 */,/*21321*/NULL/* BBC7 */, /*21322*/NULL/* BBC8 */,/*21323*/NULL/* BBC9 */,/*21324*/NULL/* BBCA */,/*21325*/NULL/* BBCB */,/*21326*/NULL/* BBCC */, /*21327*/NULL/* BBCD */,/*21328*/NULL/* BBCE */,/*21329*/NULL/* BBCF */,/*21330*/NULL/* BBD0 */,/*21331*/NULL/* BBD1 */, /*21332*/NULL/* BBD2 */,/*21333*/NULL/* BBD3 */,/*21334*/NULL/* BBD4 */,/*21335*/NULL/* BBD5 */,/*21336*/NULL/* BBD6 */, /*21337*/NULL/* BBD7 */,/*21338*/NULL/* BBD8 */,/*21339*/NULL/* BBD9 */,/*21340*/""/* BBDA */, /*21341*/NULL/* BBDB */,/*21342*/""/* BBDC */,/*21343*/""/* BBDD */, /*21344*/NULL/* BBDE */,/*21345*/NULL/* BBDF */,/*21346*/NULL/* BBE0 */,/*21347*/NULL/* BBE1 */,/*21348*/NULL/* BBE2 */, /*21349*/NULL/* BBE3 */,/*21350*/NULL/* BBE4 */,/*21351*/NULL/* BBE5 */,/*21352*/NULL/* BBE6 */,/*21353*/NULL/* BBE7 */, /*21354*/NULL/* BBE8 */,/*21355*/NULL/* BBE9 */,/*21356*/NULL/* BBEA */,/*21357*/NULL/* BBEB */,/*21358*/NULL/* BBEC */, /*21359*/NULL/* BBED */,/*21360*/NULL/* BBEE */,/*21361*/NULL/* BBEF */,/*21362*/NULL/* BBF0 */,/*21363*/NULL/* BBF1 */, /*21364*/NULL/* BBF2 */,/*21365*/NULL/* BBF3 */,/*21366*/NULL/* BBF4 */,/*21367*/NULL/* BBF5 */, /*21368*/""/* BBF6 */,/*21369*/NULL/* BBF7 */,/*21370*/""/* BBF8 */, /*21371*/""/* BBF9 */,/*21372*/NULL/* BBFA */,/*21373*/NULL/* BBFB */,/*21374*/NULL/* BBFC */, /*21375*/NULL/* BBFD */,/*21376*/NULL/* BBFE */,/*21377*/NULL/* BBFF */,/*21378*/NULL/* BC00 */,/*21379*/NULL/* BC01 */, /*21380*/NULL/* BC02 */,/*21381*/NULL/* BC03 */,/*21382*/NULL/* BC04 */,/*21383*/NULL/* BC05 */,/*21384*/NULL/* BC06 */, /*21385*/NULL/* BC07 */,/*21386*/NULL/* BC08 */,/*21387*/NULL/* BC09 */,/*21388*/NULL/* BC0A */,/*21389*/NULL/* BC0B */, /*21390*/NULL/* BC0C */,/*21391*/NULL/* BC0D */,/*21392*/NULL/* BC0E */,/*21393*/NULL/* BC0F */,/*21394*/NULL/* BC10 */, /*21395*/NULL/* BC11 */,/*21396*/""/* BC12 */,/*21397*/NULL/* BC13 */, /*21398*/""/* BC14 */,/*21399*/""/* BC15 */,/*21400*/NULL/* BC16 */, /*21401*/NULL/* BC17 */,/*21402*/NULL/* BC18 */,/*21403*/NULL/* BC19 */,/*21404*/NULL/* BC1A */,/*21405*/NULL/* BC1B */, /*21406*/NULL/* BC1C */,/*21407*/NULL/* BC1D */,/*21408*/NULL/* BC1E */,/*21409*/NULL/* BC1F */,/*21410*/NULL/* BC20 */, /*21411*/NULL/* BC21 */,/*21412*/NULL/* BC22 */,/*21413*/NULL/* BC23 */,/*21414*/NULL/* BC24 */,/*21415*/NULL/* BC25 */, /*21416*/NULL/* BC26 */,/*21417*/NULL/* BC27 */,/*21418*/NULL/* BC28 */,/*21419*/NULL/* BC29 */,/*21420*/NULL/* BC2A */, /*21421*/NULL/* BC2B */,/*21422*/NULL/* BC2C */,/*21423*/NULL/* BC2D */,/*21424*/""/* BC2E */, /*21425*/NULL/* BC2F */,/*21426*/""/* BC30 */,/*21427*/""/* BC31 */, /*21428*/NULL/* BC32 */,/*21429*/NULL/* BC33 */,/*21430*/NULL/* BC34 */,/*21431*/NULL/* BC35 */,/*21432*/NULL/* BC36 */, /*21433*/NULL/* BC37 */,/*21434*/NULL/* BC38 */,/*21435*/NULL/* BC39 */,/*21436*/NULL/* BC3A */,/*21437*/NULL/* BC3B */, /*21438*/NULL/* BC3C */,/*21439*/NULL/* BC3D */,/*21440*/NULL/* BC3E */,/*21441*/NULL/* BC3F */,/*21442*/NULL/* BC40 */, /*21443*/NULL/* BC41 */,/*21444*/NULL/* BC42 */,/*21445*/NULL/* BC43 */,/*21446*/NULL/* BC44 */,/*21447*/NULL/* BC45 */, /*21448*/NULL/* BC46 */,/*21449*/NULL/* BC47 */,/*21450*/NULL/* BC48 */,/*21451*/NULL/* BC49 */, /*21452*/""/* BC4A */,/*21453*/NULL/* BC4B */,/*21454*/""/* BC4C */, /*21455*/""/* BC4D */,/*21456*/NULL/* BC4E */,/*21457*/NULL/* BC4F */,/*21458*/NULL/* BC50 */, /*21459*/NULL/* BC51 */,/*21460*/NULL/* BC52 */,/*21461*/NULL/* BC53 */,/*21462*/NULL/* BC54 */,/*21463*/NULL/* BC55 */, /*21464*/NULL/* BC56 */,/*21465*/NULL/* BC57 */,/*21466*/NULL/* BC58 */,/*21467*/NULL/* BC59 */,/*21468*/NULL/* BC5A */, /*21469*/NULL/* BC5B */,/*21470*/NULL/* BC5C */,/*21471*/NULL/* BC5D */,/*21472*/NULL/* BC5E */,/*21473*/NULL/* BC5F */, /*21474*/NULL/* BC60 */,/*21475*/NULL/* BC61 */,/*21476*/NULL/* BC62 */,/*21477*/NULL/* BC63 */,/*21478*/NULL/* BC64 */, /*21479*/NULL/* BC65 */,/*21480*/""/* BC66 */,/*21481*/NULL/* BC67 */, /*21482*/""/* BC68 */,/*21483*/""/* BC69 */,/*21484*/NULL/* BC6A */, /*21485*/NULL/* BC6B */,/*21486*/NULL/* BC6C */,/*21487*/NULL/* BC6D */,/*21488*/NULL/* BC6E */,/*21489*/NULL/* BC6F */, /*21490*/NULL/* BC70 */,/*21491*/NULL/* BC71 */,/*21492*/NULL/* BC72 */,/*21493*/NULL/* BC73 */,/*21494*/NULL/* BC74 */, /*21495*/NULL/* BC75 */,/*21496*/NULL/* BC76 */,/*21497*/NULL/* BC77 */,/*21498*/NULL/* BC78 */,/*21499*/NULL/* BC79 */, /*21500*/NULL/* BC7A */,/*21501*/NULL/* BC7B */,/*21502*/NULL/* BC7C */,/*21503*/NULL/* BC7D */,/*21504*/NULL/* BC7E */, /*21505*/NULL/* BC7F */,/*21506*/NULL/* BC80 */,/*21507*/NULL/* BC81 */,/*21508*/""/* BC82 */, /*21509*/NULL/* BC83 */,/*21510*/""/* BC84 */,/*21511*/""/* BC85 */, /*21512*/NULL/* BC86 */,/*21513*/NULL/* BC87 */,/*21514*/NULL/* BC88 */,/*21515*/NULL/* BC89 */,/*21516*/NULL/* BC8A */, /*21517*/NULL/* BC8B */,/*21518*/NULL/* BC8C */,/*21519*/NULL/* BC8D */,/*21520*/NULL/* BC8E */,/*21521*/NULL/* BC8F */, /*21522*/NULL/* BC90 */,/*21523*/NULL/* BC91 */,/*21524*/NULL/* BC92 */,/*21525*/NULL/* BC93 */,/*21526*/NULL/* BC94 */, /*21527*/NULL/* BC95 */,/*21528*/NULL/* BC96 */,/*21529*/NULL/* BC97 */,/*21530*/NULL/* BC98 */,/*21531*/NULL/* BC99 */, /*21532*/NULL/* BC9A */,/*21533*/NULL/* BC9B */,/*21534*/NULL/* BC9C */,/*21535*/NULL/* BC9D */, /*21536*/""/* BC9E */,/*21537*/NULL/* BC9F */,/*21538*/""/* BCA0 */, /*21539*/""/* BCA1 */,/*21540*/NULL/* BCA2 */,/*21541*/NULL/* BCA3 */,/*21542*/NULL/* BCA4 */, /*21543*/NULL/* BCA5 */,/*21544*/NULL/* BCA6 */,/*21545*/NULL/* BCA7 */,/*21546*/NULL/* BCA8 */,/*21547*/NULL/* BCA9 */, /*21548*/NULL/* BCAA */,/*21549*/NULL/* BCAB */,/*21550*/NULL/* BCAC */,/*21551*/NULL/* BCAD */,/*21552*/NULL/* BCAE */, /*21553*/NULL/* BCAF */,/*21554*/NULL/* BCB0 */,/*21555*/NULL/* BCB1 */,/*21556*/NULL/* BCB2 */,/*21557*/NULL/* BCB3 */, /*21558*/NULL/* BCB4 */,/*21559*/NULL/* BCB5 */,/*21560*/NULL/* BCB6 */,/*21561*/NULL/* BCB7 */,/*21562*/NULL/* BCB8 */, /*21563*/NULL/* BCB9 */,/*21564*/""/* BCBA */,/*21565*/NULL/* BCBB */, /*21566*/""/* BCBC */,/*21567*/""/* BCBD */,/*21568*/NULL/* BCBE */, /*21569*/NULL/* BCBF */,/*21570*/NULL/* BCC0 */,/*21571*/NULL/* BCC1 */,/*21572*/NULL/* BCC2 */,/*21573*/NULL/* BCC3 */, /*21574*/NULL/* BCC4 */,/*21575*/NULL/* BCC5 */,/*21576*/NULL/* BCC6 */,/*21577*/NULL/* BCC7 */,/*21578*/NULL/* BCC8 */, /*21579*/NULL/* BCC9 */,/*21580*/NULL/* BCCA */,/*21581*/NULL/* BCCB */,/*21582*/NULL/* BCCC */,/*21583*/NULL/* BCCD */, /*21584*/NULL/* BCCE */,/*21585*/NULL/* BCCF */,/*21586*/NULL/* BCD0 */,/*21587*/NULL/* BCD1 */,/*21588*/NULL/* BCD2 */, /*21589*/NULL/* BCD3 */,/*21590*/NULL/* BCD4 */,/*21591*/NULL/* BCD5 */,/*21592*/""/* BCD6 */, /*21593*/NULL/* BCD7 */,/*21594*/""/* BCD8 */,/*21595*/""/* BCD9 */, /*21596*/NULL/* BCDA */,/*21597*/NULL/* BCDB */,/*21598*/NULL/* BCDC */,/*21599*/NULL/* BCDD */,/*21600*/NULL/* BCDE */, /*21601*/NULL/* BCDF */,/*21602*/NULL/* BCE0 */,/*21603*/NULL/* BCE1 */,/*21604*/NULL/* BCE2 */,/*21605*/NULL/* BCE3 */, /*21606*/NULL/* BCE4 */,/*21607*/NULL/* BCE5 */,/*21608*/NULL/* BCE6 */,/*21609*/NULL/* BCE7 */,/*21610*/NULL/* BCE8 */, /*21611*/NULL/* BCE9 */,/*21612*/NULL/* BCEA */,/*21613*/NULL/* BCEB */,/*21614*/NULL/* BCEC */,/*21615*/NULL/* BCED */, /*21616*/NULL/* BCEE */,/*21617*/NULL/* BCEF */,/*21618*/NULL/* BCF0 */,/*21619*/NULL/* BCF1 */, /*21620*/""/* BCF2 */,/*21621*/NULL/* BCF3 */,/*21622*/""/* BCF4 */, /*21623*/""/* BCF5 */,/*21624*/NULL/* BCF6 */,/*21625*/NULL/* BCF7 */,/*21626*/NULL/* BCF8 */, /*21627*/NULL/* BCF9 */,/*21628*/NULL/* BCFA */,/*21629*/NULL/* BCFB */,/*21630*/NULL/* BCFC */,/*21631*/NULL/* BCFD */, /*21632*/NULL/* BCFE */,/*21633*/NULL/* BCFF */,/*21634*/NULL/* BD00 */,/*21635*/NULL/* BD01 */,/*21636*/NULL/* BD02 */, /*21637*/NULL/* BD03 */,/*21638*/NULL/* BD04 */,/*21639*/NULL/* BD05 */,/*21640*/NULL/* BD06 */,/*21641*/NULL/* BD07 */, /*21642*/NULL/* BD08 */,/*21643*/NULL/* BD09 */,/*21644*/NULL/* BD0A */,/*21645*/NULL/* BD0B */,/*21646*/NULL/* BD0C */, /*21647*/NULL/* BD0D */,/*21648*/""/* BD0E */,/*21649*/NULL/* BD0F */, /*21650*/""/* BD10 */,/*21651*/""/* BD11 */,/*21652*/NULL/* BD12 */, /*21653*/NULL/* BD13 */,/*21654*/NULL/* BD14 */,/*21655*/NULL/* BD15 */,/*21656*/NULL/* BD16 */,/*21657*/NULL/* BD17 */, /*21658*/NULL/* BD18 */,/*21659*/NULL/* BD19 */,/*21660*/NULL/* BD1A */,/*21661*/NULL/* BD1B */,/*21662*/NULL/* BD1C */, /*21663*/NULL/* BD1D */,/*21664*/NULL/* BD1E */,/*21665*/NULL/* BD1F */,/*21666*/NULL/* BD20 */,/*21667*/NULL/* BD21 */, /*21668*/NULL/* BD22 */,/*21669*/NULL/* BD23 */,/*21670*/NULL/* BD24 */,/*21671*/NULL/* BD25 */,/*21672*/NULL/* BD26 */, /*21673*/NULL/* BD27 */,/*21674*/NULL/* BD28 */,/*21675*/NULL/* BD29 */,/*21676*/""/* BD2A */, /*21677*/NULL/* BD2B */,/*21678*/""/* BD2C */,/*21679*/""/* BD2D */, /*21680*/NULL/* BD2E */,/*21681*/NULL/* BD2F */,/*21682*/NULL/* BD30 */,/*21683*/NULL/* BD31 */,/*21684*/NULL/* BD32 */, /*21685*/NULL/* BD33 */,/*21686*/NULL/* BD34 */,/*21687*/NULL/* BD35 */,/*21688*/NULL/* BD36 */,/*21689*/NULL/* BD37 */, /*21690*/NULL/* BD38 */,/*21691*/NULL/* BD39 */,/*21692*/NULL/* BD3A */,/*21693*/NULL/* BD3B */,/*21694*/NULL/* BD3C */, /*21695*/NULL/* BD3D */,/*21696*/NULL/* BD3E */,/*21697*/NULL/* BD3F */,/*21698*/NULL/* BD40 */,/*21699*/NULL/* BD41 */, /*21700*/NULL/* BD42 */,/*21701*/NULL/* BD43 */,/*21702*/NULL/* BD44 */,/*21703*/NULL/* BD45 */, /*21704*/""/* BD46 */,/*21705*/NULL/* BD47 */,/*21706*/""/* BD48 */, /*21707*/""/* BD49 */,/*21708*/NULL/* BD4A */,/*21709*/NULL/* BD4B */,/*21710*/NULL/* BD4C */, /*21711*/NULL/* BD4D */,/*21712*/NULL/* BD4E */,/*21713*/NULL/* BD4F */,/*21714*/NULL/* BD50 */,/*21715*/NULL/* BD51 */, /*21716*/NULL/* BD52 */,/*21717*/NULL/* BD53 */,/*21718*/NULL/* BD54 */,/*21719*/NULL/* BD55 */,/*21720*/NULL/* BD56 */, /*21721*/NULL/* BD57 */,/*21722*/NULL/* BD58 */,/*21723*/NULL/* BD59 */,/*21724*/NULL/* BD5A */,/*21725*/NULL/* BD5B */, /*21726*/NULL/* BD5C */,/*21727*/NULL/* BD5D */,/*21728*/NULL/* BD5E */,/*21729*/NULL/* BD5F */,/*21730*/NULL/* BD60 */, /*21731*/NULL/* BD61 */,/*21732*/""/* BD62 */,/*21733*/NULL/* BD63 */, /*21734*/""/* BD64 */,/*21735*/""/* BD65 */,/*21736*/NULL/* BD66 */, /*21737*/NULL/* BD67 */,/*21738*/NULL/* BD68 */,/*21739*/NULL/* BD69 */,/*21740*/NULL/* BD6A */,/*21741*/NULL/* BD6B */, /*21742*/NULL/* BD6C */,/*21743*/NULL/* BD6D */,/*21744*/NULL/* BD6E */,/*21745*/NULL/* BD6F */,/*21746*/NULL/* BD70 */, /*21747*/NULL/* BD71 */,/*21748*/NULL/* BD72 */,/*21749*/NULL/* BD73 */,/*21750*/NULL/* BD74 */,/*21751*/NULL/* BD75 */, /*21752*/NULL/* BD76 */,/*21753*/NULL/* BD77 */,/*21754*/NULL/* BD78 */,/*21755*/NULL/* BD79 */,/*21756*/NULL/* BD7A */, /*21757*/NULL/* BD7B */,/*21758*/NULL/* BD7C */,/*21759*/NULL/* BD7D */,/*21760*/""/* BD7E */, /*21761*/NULL/* BD7F */,/*21762*/""/* BD80 */,/*21763*/""/* BD81 */, /*21764*/NULL/* BD82 */,/*21765*/NULL/* BD83 */,/*21766*/NULL/* BD84 */,/*21767*/NULL/* BD85 */,/*21768*/NULL/* BD86 */, /*21769*/NULL/* BD87 */,/*21770*/NULL/* BD88 */,/*21771*/NULL/* BD89 */,/*21772*/NULL/* BD8A */,/*21773*/NULL/* BD8B */, /*21774*/NULL/* BD8C */,/*21775*/NULL/* BD8D */,/*21776*/NULL/* BD8E */,/*21777*/NULL/* BD8F */,/*21778*/NULL/* BD90 */, /*21779*/NULL/* BD91 */,/*21780*/NULL/* BD92 */,/*21781*/NULL/* BD93 */,/*21782*/NULL/* BD94 */,/*21783*/NULL/* BD95 */, /*21784*/NULL/* BD96 */,/*21785*/NULL/* BD97 */,/*21786*/NULL/* BD98 */,/*21787*/NULL/* BD99 */, /*21788*/""/* BD9A */,/*21789*/NULL/* BD9B */,/*21790*/""/* BD9C */, /*21791*/""/* BD9D */,/*21792*/NULL/* BD9E */,/*21793*/NULL/* BD9F */,/*21794*/NULL/* BDA0 */, /*21795*/NULL/* BDA1 */,/*21796*/NULL/* BDA2 */,/*21797*/NULL/* BDA3 */,/*21798*/NULL/* BDA4 */,/*21799*/NULL/* BDA5 */, /*21800*/NULL/* BDA6 */,/*21801*/NULL/* BDA7 */,/*21802*/NULL/* BDA8 */,/*21803*/NULL/* BDA9 */,/*21804*/NULL/* BDAA */, /*21805*/NULL/* BDAB */,/*21806*/NULL/* BDAC */,/*21807*/NULL/* BDAD */,/*21808*/NULL/* BDAE */,/*21809*/NULL/* BDAF */, /*21810*/NULL/* BDB0 */,/*21811*/NULL/* BDB1 */,/*21812*/NULL/* BDB2 */,/*21813*/NULL/* BDB3 */,/*21814*/NULL/* BDB4 */, /*21815*/NULL/* BDB5 */,/*21816*/""/* BDB6 */,/*21817*/NULL/* BDB7 */, /*21818*/""/* BDB8 */,/*21819*/""/* BDB9 */,/*21820*/NULL/* BDBA */, /*21821*/NULL/* BDBB */,/*21822*/NULL/* BDBC */,/*21823*/NULL/* BDBD */,/*21824*/NULL/* BDBE */,/*21825*/NULL/* BDBF */, /*21826*/NULL/* BDC0 */,/*21827*/NULL/* BDC1 */,/*21828*/NULL/* BDC2 */,/*21829*/NULL/* BDC3 */,/*21830*/NULL/* BDC4 */, /*21831*/NULL/* BDC5 */,/*21832*/NULL/* BDC6 */,/*21833*/NULL/* BDC7 */,/*21834*/NULL/* BDC8 */,/*21835*/NULL/* BDC9 */, /*21836*/NULL/* BDCA */,/*21837*/NULL/* BDCB */,/*21838*/NULL/* BDCC */,/*21839*/NULL/* BDCD */,/*21840*/NULL/* BDCE */, /*21841*/NULL/* BDCF */,/*21842*/NULL/* BDD0 */,/*21843*/NULL/* BDD1 */,/*21844*/""/* BDD2 */, /*21845*/NULL/* BDD3 */,/*21846*/""/* BDD4 */,/*21847*/""/* BDD5 */, /*21848*/NULL/* BDD6 */,/*21849*/NULL/* BDD7 */,/*21850*/NULL/* BDD8 */,/*21851*/NULL/* BDD9 */,/*21852*/NULL/* BDDA */, /*21853*/NULL/* BDDB */,/*21854*/NULL/* BDDC */,/*21855*/NULL/* BDDD */,/*21856*/NULL/* BDDE */,/*21857*/NULL/* BDDF */, /*21858*/NULL/* BDE0 */,/*21859*/NULL/* BDE1 */,/*21860*/NULL/* BDE2 */,/*21861*/NULL/* BDE3 */,/*21862*/NULL/* BDE4 */, /*21863*/NULL/* BDE5 */,/*21864*/NULL/* BDE6 */,/*21865*/NULL/* BDE7 */,/*21866*/NULL/* BDE8 */,/*21867*/NULL/* BDE9 */, /*21868*/NULL/* BDEA */,/*21869*/NULL/* BDEB */,/*21870*/NULL/* BDEC */,/*21871*/NULL/* BDED */, /*21872*/""/* BDEE */,/*21873*/NULL/* BDEF */,/*21874*/""/* BDF0 */, /*21875*/""/* BDF1 */,/*21876*/NULL/* BDF2 */,/*21877*/NULL/* BDF3 */,/*21878*/NULL/* BDF4 */, /*21879*/NULL/* BDF5 */,/*21880*/NULL/* BDF6 */,/*21881*/NULL/* BDF7 */,/*21882*/NULL/* BDF8 */,/*21883*/NULL/* BDF9 */, /*21884*/NULL/* BDFA */,/*21885*/NULL/* BDFB */,/*21886*/NULL/* BDFC */,/*21887*/NULL/* BDFD */,/*21888*/NULL/* BDFE */, /*21889*/NULL/* BDFF */,/*21890*/NULL/* BE00 */,/*21891*/NULL/* BE01 */,/*21892*/NULL/* BE02 */,/*21893*/NULL/* BE03 */, /*21894*/NULL/* BE04 */,/*21895*/NULL/* BE05 */,/*21896*/NULL/* BE06 */,/*21897*/NULL/* BE07 */,/*21898*/NULL/* BE08 */, /*21899*/NULL/* BE09 */,/*21900*/""/* BE0A */,/*21901*/NULL/* BE0B */, /*21902*/""/* BE0C */,/*21903*/""/* BE0D */,/*21904*/NULL/* BE0E */, /*21905*/NULL/* BE0F */,/*21906*/NULL/* BE10 */,/*21907*/NULL/* BE11 */,/*21908*/NULL/* BE12 */,/*21909*/NULL/* BE13 */, /*21910*/NULL/* BE14 */,/*21911*/NULL/* BE15 */,/*21912*/NULL/* BE16 */,/*21913*/NULL/* BE17 */,/*21914*/NULL/* BE18 */, /*21915*/NULL/* BE19 */,/*21916*/NULL/* BE1A */,/*21917*/NULL/* BE1B */,/*21918*/NULL/* BE1C */,/*21919*/NULL/* BE1D */, /*21920*/NULL/* BE1E */,/*21921*/NULL/* BE1F */,/*21922*/NULL/* BE20 */,/*21923*/NULL/* BE21 */,/*21924*/NULL/* BE22 */, /*21925*/NULL/* BE23 */,/*21926*/NULL/* BE24 */,/*21927*/NULL/* BE25 */,/*21928*/""/* BE26 */, /*21929*/NULL/* BE27 */,/*21930*/""/* BE28 */,/*21931*/""/* BE29 */, /*21932*/NULL/* BE2A */,/*21933*/NULL/* BE2B */,/*21934*/NULL/* BE2C */,/*21935*/NULL/* BE2D */,/*21936*/NULL/* BE2E */, /*21937*/NULL/* BE2F */,/*21938*/NULL/* BE30 */,/*21939*/NULL/* BE31 */,/*21940*/NULL/* BE32 */,/*21941*/NULL/* BE33 */, /*21942*/NULL/* BE34 */,/*21943*/NULL/* BE35 */,/*21944*/NULL/* BE36 */,/*21945*/NULL/* BE37 */,/*21946*/NULL/* BE38 */, /*21947*/NULL/* BE39 */,/*21948*/NULL/* BE3A */,/*21949*/NULL/* BE3B */,/*21950*/NULL/* BE3C */,/*21951*/NULL/* BE3D */, /*21952*/NULL/* BE3E */,/*21953*/NULL/* BE3F */,/*21954*/NULL/* BE40 */,/*21955*/NULL/* BE41 */, /*21956*/""/* BE42 */,/*21957*/NULL/* BE43 */,/*21958*/""/* BE44 */, /*21959*/""/* BE45 */,/*21960*/NULL/* BE46 */,/*21961*/NULL/* BE47 */,/*21962*/NULL/* BE48 */, /*21963*/NULL/* BE49 */,/*21964*/NULL/* BE4A */,/*21965*/NULL/* BE4B */,/*21966*/NULL/* BE4C */,/*21967*/NULL/* BE4D */, /*21968*/NULL/* BE4E */,/*21969*/NULL/* BE4F */,/*21970*/NULL/* BE50 */,/*21971*/NULL/* BE51 */,/*21972*/NULL/* BE52 */, /*21973*/NULL/* BE53 */,/*21974*/NULL/* BE54 */,/*21975*/NULL/* BE55 */,/*21976*/NULL/* BE56 */,/*21977*/NULL/* BE57 */, /*21978*/NULL/* BE58 */,/*21979*/NULL/* BE59 */,/*21980*/NULL/* BE5A */,/*21981*/NULL/* BE5B */,/*21982*/NULL/* BE5C */, /*21983*/NULL/* BE5D */,/*21984*/""/* BE5E */,/*21985*/NULL/* BE5F */, /*21986*/""/* BE60 */,/*21987*/""/* BE61 */,/*21988*/NULL/* BE62 */, /*21989*/NULL/* BE63 */,/*21990*/NULL/* BE64 */,/*21991*/NULL/* BE65 */,/*21992*/NULL/* BE66 */,/*21993*/NULL/* BE67 */, /*21994*/NULL/* BE68 */,/*21995*/NULL/* BE69 */,/*21996*/NULL/* BE6A */,/*21997*/NULL/* BE6B */,/*21998*/NULL/* BE6C */, /*21999*/NULL/* BE6D */,/*22000*/NULL/* BE6E */,/*22001*/NULL/* BE6F */,/*22002*/NULL/* BE70 */,/*22003*/NULL/* BE71 */, /*22004*/NULL/* BE72 */,/*22005*/NULL/* BE73 */,/*22006*/NULL/* BE74 */,/*22007*/NULL/* BE75 */,/*22008*/NULL/* BE76 */, /*22009*/NULL/* BE77 */,/*22010*/NULL/* BE78 */,/*22011*/NULL/* BE79 */,/*22012*/""/* BE7A */, /*22013*/NULL/* BE7B */,/*22014*/""/* BE7C */,/*22015*/""/* BE7D */, /*22016*/NULL/* BE7E */,/*22017*/NULL/* BE7F */,/*22018*/NULL/* BE80 */,/*22019*/NULL/* BE81 */,/*22020*/NULL/* BE82 */, /*22021*/NULL/* BE83 */,/*22022*/NULL/* BE84 */,/*22023*/NULL/* BE85 */,/*22024*/NULL/* BE86 */,/*22025*/NULL/* BE87 */, /*22026*/NULL/* BE88 */,/*22027*/NULL/* BE89 */,/*22028*/NULL/* BE8A */,/*22029*/NULL/* BE8B */,/*22030*/NULL/* BE8C */, /*22031*/NULL/* BE8D */,/*22032*/NULL/* BE8E */,/*22033*/NULL/* BE8F */,/*22034*/NULL/* BE90 */,/*22035*/NULL/* BE91 */, /*22036*/NULL/* BE92 */,/*22037*/NULL/* BE93 */,/*22038*/NULL/* BE94 */,/*22039*/NULL/* BE95 */, /*22040*/""/* BE96 */,/*22041*/NULL/* BE97 */,/*22042*/""/* BE98 */, /*22043*/""/* BE99 */,/*22044*/NULL/* BE9A */,/*22045*/NULL/* BE9B */,/*22046*/NULL/* BE9C */, /*22047*/NULL/* BE9D */,/*22048*/NULL/* BE9E */,/*22049*/NULL/* BE9F */,/*22050*/NULL/* BEA0 */,/*22051*/NULL/* BEA1 */, /*22052*/NULL/* BEA2 */,/*22053*/NULL/* BEA3 */,/*22054*/NULL/* BEA4 */,/*22055*/NULL/* BEA5 */,/*22056*/NULL/* BEA6 */, /*22057*/NULL/* BEA7 */,/*22058*/NULL/* BEA8 */,/*22059*/NULL/* BEA9 */,/*22060*/NULL/* BEAA */,/*22061*/NULL/* BEAB */, /*22062*/NULL/* BEAC */,/*22063*/NULL/* BEAD */,/*22064*/NULL/* BEAE */,/*22065*/NULL/* BEAF */,/*22066*/NULL/* BEB0 */, /*22067*/NULL/* BEB1 */,/*22068*/""/* BEB2 */,/*22069*/NULL/* BEB3 */, /*22070*/""/* BEB4 */,/*22071*/""/* BEB5 */,/*22072*/NULL/* BEB6 */, /*22073*/NULL/* BEB7 */,/*22074*/NULL/* BEB8 */,/*22075*/NULL/* BEB9 */,/*22076*/NULL/* BEBA */,/*22077*/NULL/* BEBB */, /*22078*/NULL/* BEBC */,/*22079*/NULL/* BEBD */,/*22080*/NULL/* BEBE */,/*22081*/NULL/* BEBF */,/*22082*/NULL/* BEC0 */, /*22083*/NULL/* BEC1 */,/*22084*/NULL/* BEC2 */,/*22085*/NULL/* BEC3 */,/*22086*/NULL/* BEC4 */,/*22087*/NULL/* BEC5 */, /*22088*/NULL/* BEC6 */,/*22089*/NULL/* BEC7 */,/*22090*/NULL/* BEC8 */,/*22091*/NULL/* BEC9 */,/*22092*/NULL/* BECA */, /*22093*/NULL/* BECB */,/*22094*/NULL/* BECC */,/*22095*/NULL/* BECD */,/*22096*/""/* BECE */, /*22097*/NULL/* BECF */,/*22098*/""/* BED0 */,/*22099*/""/* BED1 */, /*22100*/NULL/* BED2 */,/*22101*/NULL/* BED3 */,/*22102*/NULL/* BED4 */,/*22103*/NULL/* BED5 */,/*22104*/NULL/* BED6 */, /*22105*/NULL/* BED7 */,/*22106*/NULL/* BED8 */,/*22107*/NULL/* BED9 */,/*22108*/NULL/* BEDA */,/*22109*/NULL/* BEDB */, /*22110*/NULL/* BEDC */,/*22111*/NULL/* BEDD */,/*22112*/NULL/* BEDE */,/*22113*/NULL/* BEDF */,/*22114*/NULL/* BEE0 */, /*22115*/NULL/* BEE1 */,/*22116*/NULL/* BEE2 */,/*22117*/NULL/* BEE3 */,/*22118*/NULL/* BEE4 */,/*22119*/NULL/* BEE5 */, /*22120*/NULL/* BEE6 */,/*22121*/NULL/* BEE7 */,/*22122*/NULL/* BEE8 */,/*22123*/NULL/* BEE9 */, /*22124*/""/* BEEA */,/*22125*/NULL/* BEEB */,/*22126*/""/* BEEC */, /*22127*/""/* BEED */,/*22128*/NULL/* BEEE */,/*22129*/NULL/* BEEF */,/*22130*/NULL/* BEF0 */, /*22131*/NULL/* BEF1 */,/*22132*/NULL/* BEF2 */,/*22133*/NULL/* BEF3 */,/*22134*/NULL/* BEF4 */,/*22135*/NULL/* BEF5 */, /*22136*/NULL/* BEF6 */,/*22137*/NULL/* BEF7 */,/*22138*/NULL/* BEF8 */,/*22139*/NULL/* BEF9 */,/*22140*/NULL/* BEFA */, /*22141*/NULL/* BEFB */,/*22142*/NULL/* BEFC */,/*22143*/NULL/* BEFD */,/*22144*/NULL/* BEFE */,/*22145*/NULL/* BEFF */, /*22146*/NULL/* BF00 */,/*22147*/NULL/* BF01 */,/*22148*/NULL/* BF02 */,/*22149*/NULL/* BF03 */,/*22150*/NULL/* BF04 */, /*22151*/NULL/* BF05 */,/*22152*/""/* BF06 */,/*22153*/NULL/* BF07 */, /*22154*/""/* BF08 */,/*22155*/""/* BF09 */,/*22156*/NULL/* BF0A */, /*22157*/NULL/* BF0B */,/*22158*/NULL/* BF0C */,/*22159*/NULL/* BF0D */,/*22160*/NULL/* BF0E */,/*22161*/NULL/* BF0F */, /*22162*/NULL/* BF10 */,/*22163*/NULL/* BF11 */,/*22164*/NULL/* BF12 */,/*22165*/NULL/* BF13 */,/*22166*/NULL/* BF14 */, /*22167*/NULL/* BF15 */,/*22168*/NULL/* BF16 */,/*22169*/NULL/* BF17 */,/*22170*/NULL/* BF18 */,/*22171*/NULL/* BF19 */, /*22172*/NULL/* BF1A */,/*22173*/NULL/* BF1B */,/*22174*/NULL/* BF1C */,/*22175*/NULL/* BF1D */,/*22176*/NULL/* BF1E */, /*22177*/NULL/* BF1F */,/*22178*/NULL/* BF20 */,/*22179*/NULL/* BF21 */,/*22180*/""/* BF22 */, /*22181*/NULL/* BF23 */,/*22182*/""/* BF24 */,/*22183*/""/* BF25 */, /*22184*/NULL/* BF26 */,/*22185*/NULL/* BF27 */,/*22186*/NULL/* BF28 */,/*22187*/NULL/* BF29 */,/*22188*/NULL/* BF2A */, /*22189*/NULL/* BF2B */,/*22190*/NULL/* BF2C */,/*22191*/NULL/* BF2D */,/*22192*/NULL/* BF2E */,/*22193*/NULL/* BF2F */, /*22194*/NULL/* BF30 */,/*22195*/NULL/* BF31 */,/*22196*/NULL/* BF32 */,/*22197*/NULL/* BF33 */,/*22198*/NULL/* BF34 */, /*22199*/NULL/* BF35 */,/*22200*/NULL/* BF36 */,/*22201*/NULL/* BF37 */,/*22202*/NULL/* BF38 */,/*22203*/NULL/* BF39 */, /*22204*/NULL/* BF3A */,/*22205*/NULL/* BF3B */,/*22206*/NULL/* BF3C */,/*22207*/NULL/* BF3D */, /*22208*/""/* BF3E */,/*22209*/NULL/* BF3F */,/*22210*/""/* BF40 */, /*22211*/""/* BF41 */,/*22212*/NULL/* BF42 */,/*22213*/NULL/* BF43 */,/*22214*/NULL/* BF44 */, /*22215*/NULL/* BF45 */,/*22216*/NULL/* BF46 */,/*22217*/NULL/* BF47 */,/*22218*/NULL/* BF48 */,/*22219*/NULL/* BF49 */, /*22220*/NULL/* BF4A */,/*22221*/NULL/* BF4B */,/*22222*/NULL/* BF4C */,/*22223*/NULL/* BF4D */,/*22224*/NULL/* BF4E */, /*22225*/NULL/* BF4F */,/*22226*/NULL/* BF50 */,/*22227*/NULL/* BF51 */,/*22228*/NULL/* BF52 */,/*22229*/NULL/* BF53 */, /*22230*/NULL/* BF54 */,/*22231*/NULL/* BF55 */,/*22232*/NULL/* BF56 */,/*22233*/NULL/* BF57 */,/*22234*/NULL/* BF58 */, /*22235*/NULL/* BF59 */,/*22236*/""/* BF5A */,/*22237*/NULL/* BF5B */, /*22238*/""/* BF5C */,/*22239*/""/* BF5D */,/*22240*/NULL/* BF5E */, /*22241*/NULL/* BF5F */,/*22242*/NULL/* BF60 */,/*22243*/NULL/* BF61 */,/*22244*/NULL/* BF62 */,/*22245*/NULL/* BF63 */, /*22246*/NULL/* BF64 */,/*22247*/NULL/* BF65 */,/*22248*/NULL/* BF66 */,/*22249*/NULL/* BF67 */,/*22250*/NULL/* BF68 */, /*22251*/NULL/* BF69 */,/*22252*/NULL/* BF6A */,/*22253*/NULL/* BF6B */,/*22254*/NULL/* BF6C */,/*22255*/NULL/* BF6D */, /*22256*/NULL/* BF6E */,/*22257*/NULL/* BF6F */,/*22258*/NULL/* BF70 */,/*22259*/NULL/* BF71 */,/*22260*/NULL/* BF72 */, /*22261*/NULL/* BF73 */,/*22262*/NULL/* BF74 */,/*22263*/NULL/* BF75 */,/*22264*/""/* BF76 */, /*22265*/NULL/* BF77 */,/*22266*/""/* BF78 */,/*22267*/""/* BF79 */, /*22268*/NULL/* BF7A */,/*22269*/NULL/* BF7B */,/*22270*/NULL/* BF7C */,/*22271*/NULL/* BF7D */,/*22272*/NULL/* BF7E */, /*22273*/NULL/* BF7F */,/*22274*/NULL/* BF80 */,/*22275*/NULL/* BF81 */,/*22276*/NULL/* BF82 */,/*22277*/NULL/* BF83 */, /*22278*/NULL/* BF84 */,/*22279*/NULL/* BF85 */,/*22280*/NULL/* BF86 */,/*22281*/NULL/* BF87 */,/*22282*/NULL/* BF88 */, /*22283*/NULL/* BF89 */,/*22284*/NULL/* BF8A */,/*22285*/NULL/* BF8B */,/*22286*/NULL/* BF8C */,/*22287*/NULL/* BF8D */, /*22288*/NULL/* BF8E */,/*22289*/NULL/* BF8F */,/*22290*/NULL/* BF90 */,/*22291*/NULL/* BF91 */, /*22292*/""/* BF92 */,/*22293*/NULL/* BF93 */,/*22294*/""/* BF94 */, /*22295*/""/* BF95 */,/*22296*/NULL/* BF96 */,/*22297*/NULL/* BF97 */,/*22298*/NULL/* BF98 */, /*22299*/NULL/* BF99 */,/*22300*/NULL/* BF9A */,/*22301*/NULL/* BF9B */,/*22302*/NULL/* BF9C */,/*22303*/NULL/* BF9D */, /*22304*/NULL/* BF9E */,/*22305*/NULL/* BF9F */,/*22306*/NULL/* BFA0 */,/*22307*/NULL/* BFA1 */,/*22308*/NULL/* BFA2 */, /*22309*/NULL/* BFA3 */,/*22310*/NULL/* BFA4 */,/*22311*/NULL/* BFA5 */,/*22312*/NULL/* BFA6 */,/*22313*/NULL/* BFA7 */, /*22314*/NULL/* BFA8 */,/*22315*/NULL/* BFA9 */,/*22316*/NULL/* BFAA */,/*22317*/NULL/* BFAB */,/*22318*/NULL/* BFAC */, /*22319*/NULL/* BFAD */,/*22320*/""/* BFAE */,/*22321*/NULL/* BFAF */, /*22322*/""/* BFB0 */,/*22323*/""/* BFB1 */,/*22324*/NULL/* BFB2 */, /*22325*/NULL/* BFB3 */,/*22326*/NULL/* BFB4 */,/*22327*/NULL/* BFB5 */,/*22328*/NULL/* BFB6 */,/*22329*/NULL/* BFB7 */, /*22330*/NULL/* BFB8 */,/*22331*/NULL/* BFB9 */,/*22332*/NULL/* BFBA */,/*22333*/NULL/* BFBB */,/*22334*/NULL/* BFBC */, /*22335*/NULL/* BFBD */,/*22336*/NULL/* BFBE */,/*22337*/NULL/* BFBF */,/*22338*/NULL/* BFC0 */,/*22339*/NULL/* BFC1 */, /*22340*/NULL/* BFC2 */,/*22341*/NULL/* BFC3 */,/*22342*/NULL/* BFC4 */,/*22343*/NULL/* BFC5 */,/*22344*/NULL/* BFC6 */, /*22345*/NULL/* BFC7 */,/*22346*/NULL/* BFC8 */,/*22347*/NULL/* BFC9 */,/*22348*/""/* BFCA */, /*22349*/NULL/* BFCB */,/*22350*/""/* BFCC */,/*22351*/""/* BFCD */, /*22352*/NULL/* BFCE */,/*22353*/NULL/* BFCF */,/*22354*/NULL/* BFD0 */,/*22355*/NULL/* BFD1 */,/*22356*/NULL/* BFD2 */, /*22357*/NULL/* BFD3 */,/*22358*/NULL/* BFD4 */,/*22359*/NULL/* BFD5 */,/*22360*/NULL/* BFD6 */,/*22361*/NULL/* BFD7 */, /*22362*/NULL/* BFD8 */,/*22363*/NULL/* BFD9 */,/*22364*/NULL/* BFDA */,/*22365*/NULL/* BFDB */,/*22366*/NULL/* BFDC */, /*22367*/NULL/* BFDD */,/*22368*/NULL/* BFDE */,/*22369*/NULL/* BFDF */,/*22370*/NULL/* BFE0 */,/*22371*/NULL/* BFE1 */, /*22372*/NULL/* BFE2 */,/*22373*/NULL/* BFE3 */,/*22374*/NULL/* BFE4 */,/*22375*/NULL/* BFE5 */, /*22376*/""/* BFE6 */,/*22377*/NULL/* BFE7 */,/*22378*/""/* BFE8 */, /*22379*/""/* BFE9 */,/*22380*/NULL/* BFEA */,/*22381*/NULL/* BFEB */,/*22382*/NULL/* BFEC */, /*22383*/NULL/* BFED */,/*22384*/NULL/* BFEE */,/*22385*/NULL/* BFEF */,/*22386*/NULL/* BFF0 */,/*22387*/NULL/* BFF1 */, /*22388*/NULL/* BFF2 */,/*22389*/NULL/* BFF3 */,/*22390*/NULL/* BFF4 */,/*22391*/NULL/* BFF5 */,/*22392*/NULL/* BFF6 */, /*22393*/NULL/* BFF7 */,/*22394*/NULL/* BFF8 */,/*22395*/NULL/* BFF9 */,/*22396*/NULL/* BFFA */,/*22397*/NULL/* BFFB */, /*22398*/NULL/* BFFC */,/*22399*/NULL/* BFFD */,/*22400*/NULL/* BFFE */,/*22401*/NULL/* BFFF */,/*22402*/NULL/* C000 */, /*22403*/NULL/* C001 */,/*22404*/""/* C002 */,/*22405*/NULL/* C003 */, /*22406*/""/* C004 */,/*22407*/""/* C005 */,/*22408*/NULL/* C006 */, /*22409*/NULL/* C007 */,/*22410*/NULL/* C008 */,/*22411*/NULL/* C009 */,/*22412*/NULL/* C00A */,/*22413*/NULL/* C00B */, /*22414*/NULL/* C00C */,/*22415*/NULL/* C00D */,/*22416*/NULL/* C00E */,/*22417*/NULL/* C00F */,/*22418*/NULL/* C010 */, /*22419*/NULL/* C011 */,/*22420*/NULL/* C012 */,/*22421*/NULL/* C013 */,/*22422*/NULL/* C014 */,/*22423*/NULL/* C015 */, /*22424*/NULL/* C016 */,/*22425*/NULL/* C017 */,/*22426*/NULL/* C018 */,/*22427*/NULL/* C019 */,/*22428*/NULL/* C01A */, /*22429*/NULL/* C01B */,/*22430*/NULL/* C01C */,/*22431*/NULL/* C01D */,/*22432*/""/* C01E */, /*22433*/NULL/* C01F */,/*22434*/""/* C020 */,/*22435*/""/* C021 */, /*22436*/NULL/* C022 */,/*22437*/NULL/* C023 */,/*22438*/NULL/* C024 */,/*22439*/NULL/* C025 */,/*22440*/NULL/* C026 */, /*22441*/NULL/* C027 */,/*22442*/NULL/* C028 */,/*22443*/NULL/* C029 */,/*22444*/NULL/* C02A */,/*22445*/NULL/* C02B */, /*22446*/NULL/* C02C */,/*22447*/NULL/* C02D */,/*22448*/NULL/* C02E */,/*22449*/NULL/* C02F */,/*22450*/NULL/* C030 */, /*22451*/NULL/* C031 */,/*22452*/NULL/* C032 */,/*22453*/NULL/* C033 */,/*22454*/NULL/* C034 */,/*22455*/NULL/* C035 */, /*22456*/NULL/* C036 */,/*22457*/NULL/* C037 */,/*22458*/NULL/* C038 */,/*22459*/NULL/* C039 */, /*22460*/""/* C03A */,/*22461*/NULL/* C03B */,/*22462*/""/* C03C */, /*22463*/""/* C03D */,/*22464*/NULL/* C03E */,/*22465*/NULL/* C03F */,/*22466*/NULL/* C040 */, /*22467*/NULL/* C041 */,/*22468*/NULL/* C042 */,/*22469*/NULL/* C043 */,/*22470*/NULL/* C044 */,/*22471*/NULL/* C045 */, /*22472*/NULL/* C046 */,/*22473*/NULL/* C047 */,/*22474*/NULL/* C048 */,/*22475*/NULL/* C049 */,/*22476*/NULL/* C04A */, /*22477*/NULL/* C04B */,/*22478*/NULL/* C04C */,/*22479*/NULL/* C04D */,/*22480*/NULL/* C04E */,/*22481*/NULL/* C04F */, /*22482*/NULL/* C050 */,/*22483*/NULL/* C051 */,/*22484*/NULL/* C052 */,/*22485*/NULL/* C053 */,/*22486*/NULL/* C054 */, /*22487*/NULL/* C055 */,/*22488*/""/* C056 */,/*22489*/NULL/* C057 */, /*22490*/""/* C058 */,/*22491*/""/* C059 */,/*22492*/NULL/* C05A */, /*22493*/NULL/* C05B */,/*22494*/NULL/* C05C */,/*22495*/NULL/* C05D */,/*22496*/NULL/* C05E */,/*22497*/NULL/* C05F */, /*22498*/NULL/* C060 */,/*22499*/NULL/* C061 */,/*22500*/NULL/* C062 */,/*22501*/NULL/* C063 */,/*22502*/NULL/* C064 */, /*22503*/NULL/* C065 */,/*22504*/NULL/* C066 */,/*22505*/NULL/* C067 */,/*22506*/NULL/* C068 */,/*22507*/NULL/* C069 */, /*22508*/NULL/* C06A */,/*22509*/NULL/* C06B */,/*22510*/NULL/* C06C */,/*22511*/NULL/* C06D */,/*22512*/NULL/* C06E */, /*22513*/NULL/* C06F */,/*22514*/NULL/* C070 */,/*22515*/NULL/* C071 */,/*22516*/""/* C072 */, /*22517*/NULL/* C073 */,/*22518*/""/* C074 */,/*22519*/""/* C075 */, /*22520*/NULL/* C076 */,/*22521*/NULL/* C077 */,/*22522*/NULL/* C078 */,/*22523*/NULL/* C079 */,/*22524*/NULL/* C07A */, /*22525*/NULL/* C07B */,/*22526*/NULL/* C07C */,/*22527*/NULL/* C07D */,/*22528*/NULL/* C07E */,/*22529*/NULL/* C07F */, /*22530*/NULL/* C080 */,/*22531*/NULL/* C081 */,/*22532*/NULL/* C082 */,/*22533*/NULL/* C083 */,/*22534*/NULL/* C084 */, /*22535*/NULL/* C085 */,/*22536*/NULL/* C086 */,/*22537*/NULL/* C087 */,/*22538*/NULL/* C088 */,/*22539*/NULL/* C089 */, /*22540*/NULL/* C08A */,/*22541*/NULL/* C08B */,/*22542*/NULL/* C08C */,/*22543*/NULL/* C08D */, /*22544*/""/* C08E */,/*22545*/NULL/* C08F */,/*22546*/""/* C090 */, /*22547*/""/* C091 */,/*22548*/NULL/* C092 */,/*22549*/NULL/* C093 */,/*22550*/NULL/* C094 */, /*22551*/NULL/* C095 */,/*22552*/NULL/* C096 */,/*22553*/NULL/* C097 */,/*22554*/NULL/* C098 */,/*22555*/NULL/* C099 */, /*22556*/NULL/* C09A */,/*22557*/NULL/* C09B */,/*22558*/NULL/* C09C */,/*22559*/NULL/* C09D */,/*22560*/NULL/* C09E */, /*22561*/NULL/* C09F */,/*22562*/NULL/* C0A0 */,/*22563*/NULL/* C0A1 */,/*22564*/NULL/* C0A2 */,/*22565*/NULL/* C0A3 */, /*22566*/NULL/* C0A4 */,/*22567*/NULL/* C0A5 */,/*22568*/NULL/* C0A6 */,/*22569*/NULL/* C0A7 */,/*22570*/NULL/* C0A8 */, /*22571*/NULL/* C0A9 */,/*22572*/""/* C0AA */,/*22573*/NULL/* C0AB */, /*22574*/""/* C0AC */,/*22575*/""/* C0AD */,/*22576*/NULL/* C0AE */, /*22577*/NULL/* C0AF */,/*22578*/NULL/* C0B0 */,/*22579*/NULL/* C0B1 */,/*22580*/NULL/* C0B2 */,/*22581*/NULL/* C0B3 */, /*22582*/NULL/* C0B4 */,/*22583*/NULL/* C0B5 */,/*22584*/NULL/* C0B6 */,/*22585*/NULL/* C0B7 */,/*22586*/NULL/* C0B8 */, /*22587*/NULL/* C0B9 */,/*22588*/NULL/* C0BA */,/*22589*/NULL/* C0BB */,/*22590*/NULL/* C0BC */,/*22591*/NULL/* C0BD */, /*22592*/NULL/* C0BE */,/*22593*/NULL/* C0BF */,/*22594*/NULL/* C0C0 */,/*22595*/NULL/* C0C1 */,/*22596*/NULL/* C0C2 */, /*22597*/NULL/* C0C3 */,/*22598*/NULL/* C0C4 */,/*22599*/NULL/* C0C5 */,/*22600*/""/* C0C6 */, /*22601*/NULL/* C0C7 */,/*22602*/""/* C0C8 */,/*22603*/""/* C0C9 */, /*22604*/NULL/* C0CA */,/*22605*/NULL/* C0CB */,/*22606*/NULL/* C0CC */,/*22607*/NULL/* C0CD */,/*22608*/NULL/* C0CE */, /*22609*/NULL/* C0CF */,/*22610*/NULL/* C0D0 */,/*22611*/NULL/* C0D1 */,/*22612*/NULL/* C0D2 */,/*22613*/NULL/* C0D3 */, /*22614*/NULL/* C0D4 */,/*22615*/NULL/* C0D5 */,/*22616*/NULL/* C0D6 */,/*22617*/NULL/* C0D7 */,/*22618*/NULL/* C0D8 */, /*22619*/NULL/* C0D9 */,/*22620*/NULL/* C0DA */,/*22621*/NULL/* C0DB */,/*22622*/NULL/* C0DC */,/*22623*/NULL/* C0DD */, /*22624*/NULL/* C0DE */,/*22625*/NULL/* C0DF */,/*22626*/NULL/* C0E0 */,/*22627*/NULL/* C0E1 */, /*22628*/""/* C0E2 */,/*22629*/NULL/* C0E3 */,/*22630*/""/* C0E4 */, /*22631*/""/* C0E5 */,/*22632*/NULL/* C0E6 */,/*22633*/NULL/* C0E7 */,/*22634*/NULL/* C0E8 */, /*22635*/NULL/* C0E9 */,/*22636*/NULL/* C0EA */,/*22637*/NULL/* C0EB */,/*22638*/NULL/* C0EC */,/*22639*/NULL/* C0ED */, /*22640*/NULL/* C0EE */,/*22641*/NULL/* C0EF */,/*22642*/NULL/* C0F0 */,/*22643*/NULL/* C0F1 */,/*22644*/NULL/* C0F2 */, /*22645*/NULL/* C0F3 */,/*22646*/NULL/* C0F4 */,/*22647*/NULL/* C0F5 */,/*22648*/NULL/* C0F6 */,/*22649*/NULL/* C0F7 */, /*22650*/NULL/* C0F8 */,/*22651*/NULL/* C0F9 */,/*22652*/NULL/* C0FA */,/*22653*/NULL/* C0FB */,/*22654*/NULL/* C0FC */, /*22655*/NULL/* C0FD */,/*22656*/""/* C0FE */,/*22657*/NULL/* C0FF */, /*22658*/""/* C100 */,/*22659*/""/* C101 */,/*22660*/NULL/* C102 */, /*22661*/NULL/* C103 */,/*22662*/NULL/* C104 */,/*22663*/NULL/* C105 */,/*22664*/NULL/* C106 */,/*22665*/NULL/* C107 */, /*22666*/NULL/* C108 */,/*22667*/NULL/* C109 */,/*22668*/NULL/* C10A */,/*22669*/NULL/* C10B */,/*22670*/NULL/* C10C */, /*22671*/NULL/* C10D */,/*22672*/NULL/* C10E */,/*22673*/NULL/* C10F */,/*22674*/NULL/* C110 */,/*22675*/NULL/* C111 */, /*22676*/NULL/* C112 */,/*22677*/NULL/* C113 */,/*22678*/NULL/* C114 */,/*22679*/NULL/* C115 */,/*22680*/NULL/* C116 */, /*22681*/NULL/* C117 */,/*22682*/NULL/* C118 */,/*22683*/NULL/* C119 */,/*22684*/""/* C11A */, /*22685*/NULL/* C11B */,/*22686*/""/* C11C */,/*22687*/""/* C11D */, /*22688*/NULL/* C11E */,/*22689*/NULL/* C11F */,/*22690*/NULL/* C120 */,/*22691*/NULL/* C121 */,/*22692*/NULL/* C122 */, /*22693*/NULL/* C123 */,/*22694*/NULL/* C124 */,/*22695*/NULL/* C125 */,/*22696*/NULL/* C126 */,/*22697*/NULL/* C127 */, /*22698*/NULL/* C128 */,/*22699*/NULL/* C129 */,/*22700*/NULL/* C12A */,/*22701*/NULL/* C12B */,/*22702*/NULL/* C12C */, /*22703*/NULL/* C12D */,/*22704*/NULL/* C12E */,/*22705*/NULL/* C12F */,/*22706*/NULL/* C130 */,/*22707*/NULL/* C131 */, /*22708*/NULL/* C132 */,/*22709*/NULL/* C133 */,/*22710*/NULL/* C134 */,/*22711*/NULL/* C135 */, /*22712*/""/* C136 */,/*22713*/NULL/* C137 */,/*22714*/""/* C138 */, /*22715*/""/* C139 */,/*22716*/NULL/* C13A */,/*22717*/NULL/* C13B */,/*22718*/NULL/* C13C */, /*22719*/NULL/* C13D */,/*22720*/NULL/* C13E */,/*22721*/NULL/* C13F */,/*22722*/NULL/* C140 */,/*22723*/NULL/* C141 */, /*22724*/NULL/* C142 */,/*22725*/NULL/* C143 */,/*22726*/NULL/* C144 */,/*22727*/NULL/* C145 */,/*22728*/NULL/* C146 */, /*22729*/NULL/* C147 */,/*22730*/NULL/* C148 */,/*22731*/NULL/* C149 */,/*22732*/NULL/* C14A */,/*22733*/NULL/* C14B */, /*22734*/NULL/* C14C */,/*22735*/NULL/* C14D */,/*22736*/NULL/* C14E */,/*22737*/NULL/* C14F */,/*22738*/NULL/* C150 */, /*22739*/NULL/* C151 */,/*22740*/""/* C152 */,/*22741*/NULL/* C153 */, /*22742*/""/* C154 */,/*22743*/""/* C155 */,/*22744*/NULL/* C156 */, /*22745*/NULL/* C157 */,/*22746*/NULL/* C158 */,/*22747*/NULL/* C159 */,/*22748*/NULL/* C15A */,/*22749*/NULL/* C15B */, /*22750*/NULL/* C15C */,/*22751*/NULL/* C15D */,/*22752*/NULL/* C15E */,/*22753*/NULL/* C15F */,/*22754*/NULL/* C160 */, /*22755*/NULL/* C161 */,/*22756*/NULL/* C162 */,/*22757*/NULL/* C163 */,/*22758*/NULL/* C164 */,/*22759*/NULL/* C165 */, /*22760*/NULL/* C166 */,/*22761*/NULL/* C167 */,/*22762*/NULL/* C168 */,/*22763*/NULL/* C169 */,/*22764*/NULL/* C16A */, /*22765*/NULL/* C16B */,/*22766*/NULL/* C16C */,/*22767*/NULL/* C16D */,/*22768*/""/* C16E */, /*22769*/NULL/* C16F */,/*22770*/""/* C170 */,/*22771*/""/* C171 */, /*22772*/NULL/* C172 */,/*22773*/NULL/* C173 */,/*22774*/NULL/* C174 */,/*22775*/NULL/* C175 */,/*22776*/NULL/* C176 */, /*22777*/NULL/* C177 */,/*22778*/NULL/* C178 */,/*22779*/NULL/* C179 */,/*22780*/NULL/* C17A */,/*22781*/NULL/* C17B */, /*22782*/NULL/* C17C */,/*22783*/NULL/* C17D */,/*22784*/NULL/* C17E */,/*22785*/NULL/* C17F */,/*22786*/NULL/* C180 */, /*22787*/NULL/* C181 */,/*22788*/NULL/* C182 */,/*22789*/NULL/* C183 */,/*22790*/NULL/* C184 */,/*22791*/NULL/* C185 */, /*22792*/NULL/* C186 */,/*22793*/NULL/* C187 */,/*22794*/NULL/* C188 */,/*22795*/NULL/* C189 */, /*22796*/""/* C18A */,/*22797*/NULL/* C18B */,/*22798*/""/* C18C */, /*22799*/""/* C18D */,/*22800*/NULL/* C18E */,/*22801*/NULL/* C18F */,/*22802*/NULL/* C190 */, /*22803*/NULL/* C191 */,/*22804*/NULL/* C192 */,/*22805*/NULL/* C193 */,/*22806*/NULL/* C194 */,/*22807*/NULL/* C195 */, /*22808*/NULL/* C196 */,/*22809*/NULL/* C197 */,/*22810*/NULL/* C198 */,/*22811*/NULL/* C199 */,/*22812*/NULL/* C19A */, /*22813*/NULL/* C19B */,/*22814*/NULL/* C19C */,/*22815*/NULL/* C19D */,/*22816*/NULL/* C19E */,/*22817*/NULL/* C19F */, /*22818*/NULL/* C1A0 */,/*22819*/NULL/* C1A1 */,/*22820*/NULL/* C1A2 */,/*22821*/NULL/* C1A3 */,/*22822*/NULL/* C1A4 */, /*22823*/NULL/* C1A5 */,/*22824*/""/* C1A6 */,/*22825*/NULL/* C1A7 */, /*22826*/""/* C1A8 */,/*22827*/""/* C1A9 */,/*22828*/NULL/* C1AA */, /*22829*/NULL/* C1AB */,/*22830*/NULL/* C1AC */,/*22831*/NULL/* C1AD */,/*22832*/NULL/* C1AE */,/*22833*/NULL/* C1AF */, /*22834*/NULL/* C1B0 */,/*22835*/NULL/* C1B1 */,/*22836*/NULL/* C1B2 */,/*22837*/NULL/* C1B3 */,/*22838*/NULL/* C1B4 */, /*22839*/NULL/* C1B5 */,/*22840*/NULL/* C1B6 */,/*22841*/NULL/* C1B7 */,/*22842*/NULL/* C1B8 */,/*22843*/NULL/* C1B9 */, /*22844*/NULL/* C1BA */,/*22845*/NULL/* C1BB */,/*22846*/NULL/* C1BC */,/*22847*/NULL/* C1BD */,/*22848*/NULL/* C1BE */, /*22849*/NULL/* C1BF */,/*22850*/NULL/* C1C0 */,/*22851*/NULL/* C1C1 */,/*22852*/""/* C1C2 */, /*22853*/NULL/* C1C3 */,/*22854*/""/* C1C4 */,/*22855*/""/* C1C5 */, /*22856*/NULL/* C1C6 */,/*22857*/NULL/* C1C7 */,/*22858*/NULL/* C1C8 */,/*22859*/NULL/* C1C9 */,/*22860*/NULL/* C1CA */, /*22861*/NULL/* C1CB */,/*22862*/NULL/* C1CC */,/*22863*/NULL/* C1CD */,/*22864*/NULL/* C1CE */,/*22865*/NULL/* C1CF */, /*22866*/NULL/* C1D0 */,/*22867*/NULL/* C1D1 */,/*22868*/NULL/* C1D2 */,/*22869*/NULL/* C1D3 */,/*22870*/NULL/* C1D4 */, /*22871*/NULL/* C1D5 */,/*22872*/NULL/* C1D6 */,/*22873*/NULL/* C1D7 */,/*22874*/NULL/* C1D8 */,/*22875*/NULL/* C1D9 */, /*22876*/NULL/* C1DA */,/*22877*/NULL/* C1DB */,/*22878*/NULL/* C1DC */,/*22879*/NULL/* C1DD */, /*22880*/""/* C1DE */,/*22881*/NULL/* C1DF */,/*22882*/""/* C1E0 */, /*22883*/""/* C1E1 */,/*22884*/NULL/* C1E2 */,/*22885*/NULL/* C1E3 */,/*22886*/NULL/* C1E4 */, /*22887*/NULL/* C1E5 */,/*22888*/NULL/* C1E6 */,/*22889*/NULL/* C1E7 */,/*22890*/NULL/* C1E8 */,/*22891*/NULL/* C1E9 */, /*22892*/NULL/* C1EA */,/*22893*/NULL/* C1EB */,/*22894*/NULL/* C1EC */,/*22895*/NULL/* C1ED */,/*22896*/NULL/* C1EE */, /*22897*/NULL/* C1EF */,/*22898*/NULL/* C1F0 */,/*22899*/NULL/* C1F1 */,/*22900*/NULL/* C1F2 */,/*22901*/NULL/* C1F3 */, /*22902*/NULL/* C1F4 */,/*22903*/NULL/* C1F5 */,/*22904*/NULL/* C1F6 */,/*22905*/NULL/* C1F7 */,/*22906*/NULL/* C1F8 */, /*22907*/NULL/* C1F9 */,/*22908*/""/* C1FA */,/*22909*/NULL/* C1FB */, /*22910*/""/* C1FC */,/*22911*/""/* C1FD */,/*22912*/NULL/* C1FE */, /*22913*/NULL/* C1FF */,/*22914*/NULL/* C200 */,/*22915*/NULL/* C201 */,/*22916*/NULL/* C202 */,/*22917*/NULL/* C203 */, /*22918*/NULL/* C204 */,/*22919*/NULL/* C205 */,/*22920*/NULL/* C206 */,/*22921*/NULL/* C207 */,/*22922*/NULL/* C208 */, /*22923*/NULL/* C209 */,/*22924*/NULL/* C20A */,/*22925*/NULL/* C20B */,/*22926*/NULL/* C20C */,/*22927*/NULL/* C20D */, /*22928*/NULL/* C20E */,/*22929*/NULL/* C20F */,/*22930*/NULL/* C210 */,/*22931*/NULL/* C211 */,/*22932*/NULL/* C212 */, /*22933*/NULL/* C213 */,/*22934*/NULL/* C214 */,/*22935*/NULL/* C215 */,/*22936*/""/* C216 */, /*22937*/NULL/* C217 */,/*22938*/""/* C218 */,/*22939*/""/* C219 */, /*22940*/NULL/* C21A */,/*22941*/NULL/* C21B */,/*22942*/NULL/* C21C */,/*22943*/NULL/* C21D */,/*22944*/NULL/* C21E */, /*22945*/NULL/* C21F */,/*22946*/NULL/* C220 */,/*22947*/NULL/* C221 */,/*22948*/NULL/* C222 */,/*22949*/NULL/* C223 */, /*22950*/NULL/* C224 */,/*22951*/NULL/* C225 */,/*22952*/NULL/* C226 */,/*22953*/NULL/* C227 */,/*22954*/NULL/* C228 */, /*22955*/NULL/* C229 */,/*22956*/NULL/* C22A */,/*22957*/NULL/* C22B */,/*22958*/NULL/* C22C */,/*22959*/NULL/* C22D */, /*22960*/NULL/* C22E */,/*22961*/NULL/* C22F */,/*22962*/NULL/* C230 */,/*22963*/NULL/* C231 */, /*22964*/""/* C232 */,/*22965*/NULL/* C233 */,/*22966*/""/* C234 */, /*22967*/""/* C235 */,/*22968*/NULL/* C236 */,/*22969*/NULL/* C237 */,/*22970*/NULL/* C238 */, /*22971*/NULL/* C239 */,/*22972*/NULL/* C23A */,/*22973*/NULL/* C23B */,/*22974*/NULL/* C23C */,/*22975*/NULL/* C23D */, /*22976*/NULL/* C23E */,/*22977*/NULL/* C23F */,/*22978*/NULL/* C240 */,/*22979*/NULL/* C241 */,/*22980*/NULL/* C242 */, /*22981*/NULL/* C243 */,/*22982*/NULL/* C244 */,/*22983*/NULL/* C245 */,/*22984*/NULL/* C246 */,/*22985*/NULL/* C247 */, /*22986*/NULL/* C248 */,/*22987*/NULL/* C249 */,/*22988*/NULL/* C24A */,/*22989*/NULL/* C24B */,/*22990*/NULL/* C24C */, /*22991*/NULL/* C24D */,/*22992*/""/* C24E */,/*22993*/NULL/* C24F */, /*22994*/""/* C250 */,/*22995*/""/* C251 */,/*22996*/NULL/* C252 */, /*22997*/NULL/* C253 */,/*22998*/NULL/* C254 */,/*22999*/NULL/* C255 */,/*23000*/NULL/* C256 */,/*23001*/NULL/* C257 */, /*23002*/NULL/* C258 */,/*23003*/NULL/* C259 */,/*23004*/NULL/* C25A */,/*23005*/NULL/* C25B */,/*23006*/NULL/* C25C */, /*23007*/NULL/* C25D */,/*23008*/NULL/* C25E */,/*23009*/NULL/* C25F */,/*23010*/NULL/* C260 */,/*23011*/NULL/* C261 */, /*23012*/NULL/* C262 */,/*23013*/NULL/* C263 */,/*23014*/NULL/* C264 */,/*23015*/NULL/* C265 */,/*23016*/NULL/* C266 */, /*23017*/NULL/* C267 */,/*23018*/NULL/* C268 */,/*23019*/NULL/* C269 */,/*23020*/""/* C26A */, /*23021*/NULL/* C26B */,/*23022*/""/* C26C */,/*23023*/""/* C26D */, /*23024*/NULL/* C26E */,/*23025*/NULL/* C26F */,/*23026*/NULL/* C270 */,/*23027*/NULL/* C271 */,/*23028*/NULL/* C272 */, /*23029*/NULL/* C273 */,/*23030*/NULL/* C274 */,/*23031*/NULL/* C275 */,/*23032*/NULL/* C276 */,/*23033*/NULL/* C277 */, /*23034*/NULL/* C278 */,/*23035*/NULL/* C279 */,/*23036*/NULL/* C27A */,/*23037*/NULL/* C27B */,/*23038*/NULL/* C27C */, /*23039*/NULL/* C27D */,/*23040*/NULL/* C27E */,/*23041*/NULL/* C27F */,/*23042*/NULL/* C280 */,/*23043*/NULL/* C281 */, /*23044*/NULL/* C282 */,/*23045*/NULL/* C283 */,/*23046*/NULL/* C284 */,/*23047*/NULL/* C285 */, /*23048*/""/* C286 */,/*23049*/NULL/* C287 */,/*23050*/""/* C288 */, /*23051*/""/* C289 */,/*23052*/NULL/* C28A */,/*23053*/NULL/* C28B */,/*23054*/NULL/* C28C */, /*23055*/NULL/* C28D */,/*23056*/NULL/* C28E */,/*23057*/NULL/* C28F */,/*23058*/NULL/* C290 */,/*23059*/NULL/* C291 */, /*23060*/NULL/* C292 */,/*23061*/NULL/* C293 */,/*23062*/NULL/* C294 */,/*23063*/NULL/* C295 */,/*23064*/NULL/* C296 */, /*23065*/NULL/* C297 */,/*23066*/NULL/* C298 */,/*23067*/NULL/* C299 */,/*23068*/NULL/* C29A */,/*23069*/NULL/* C29B */, /*23070*/NULL/* C29C */,/*23071*/NULL/* C29D */,/*23072*/NULL/* C29E */,/*23073*/NULL/* C29F */,/*23074*/NULL/* C2A0 */, /*23075*/NULL/* C2A1 */,/*23076*/""/* C2A2 */,/*23077*/NULL/* C2A3 */, /*23078*/""/* C2A4 */,/*23079*/""/* C2A5 */,/*23080*/NULL/* C2A6 */, /*23081*/NULL/* C2A7 */,/*23082*/NULL/* C2A8 */,/*23083*/NULL/* C2A9 */,/*23084*/NULL/* C2AA */,/*23085*/NULL/* C2AB */, /*23086*/NULL/* C2AC */,/*23087*/NULL/* C2AD */,/*23088*/NULL/* C2AE */,/*23089*/NULL/* C2AF */,/*23090*/NULL/* C2B0 */, /*23091*/NULL/* C2B1 */,/*23092*/NULL/* C2B2 */,/*23093*/NULL/* C2B3 */,/*23094*/NULL/* C2B4 */,/*23095*/NULL/* C2B5 */, /*23096*/NULL/* C2B6 */,/*23097*/NULL/* C2B7 */,/*23098*/NULL/* C2B8 */,/*23099*/NULL/* C2B9 */,/*23100*/NULL/* C2BA */, /*23101*/NULL/* C2BB */,/*23102*/NULL/* C2BC */,/*23103*/NULL/* C2BD */,/*23104*/""/* C2BE */, /*23105*/NULL/* C2BF */,/*23106*/""/* C2C0 */,/*23107*/""/* C2C1 */, /*23108*/NULL/* C2C2 */,/*23109*/NULL/* C2C3 */,/*23110*/NULL/* C2C4 */,/*23111*/NULL/* C2C5 */,/*23112*/NULL/* C2C6 */, /*23113*/NULL/* C2C7 */,/*23114*/NULL/* C2C8 */,/*23115*/NULL/* C2C9 */,/*23116*/NULL/* C2CA */,/*23117*/NULL/* C2CB */, /*23118*/NULL/* C2CC */,/*23119*/NULL/* C2CD */,/*23120*/NULL/* C2CE */,/*23121*/NULL/* C2CF */,/*23122*/NULL/* C2D0 */, /*23123*/NULL/* C2D1 */,/*23124*/NULL/* C2D2 */,/*23125*/NULL/* C2D3 */,/*23126*/NULL/* C2D4 */,/*23127*/NULL/* C2D5 */, /*23128*/NULL/* C2D6 */,/*23129*/NULL/* C2D7 */,/*23130*/NULL/* C2D8 */,/*23131*/NULL/* C2D9 */, /*23132*/""/* C2DA */,/*23133*/NULL/* C2DB */,/*23134*/""/* C2DC */, /*23135*/""/* C2DD */,/*23136*/NULL/* C2DE */,/*23137*/NULL/* C2DF */,/*23138*/NULL/* C2E0 */, /*23139*/NULL/* C2E1 */,/*23140*/NULL/* C2E2 */,/*23141*/NULL/* C2E3 */,/*23142*/NULL/* C2E4 */,/*23143*/NULL/* C2E5 */, /*23144*/NULL/* C2E6 */,/*23145*/NULL/* C2E7 */,/*23146*/NULL/* C2E8 */,/*23147*/NULL/* C2E9 */,/*23148*/NULL/* C2EA */, /*23149*/NULL/* C2EB */,/*23150*/NULL/* C2EC */,/*23151*/NULL/* C2ED */,/*23152*/NULL/* C2EE */,/*23153*/NULL/* C2EF */, /*23154*/NULL/* C2F0 */,/*23155*/NULL/* C2F1 */,/*23156*/NULL/* C2F2 */,/*23157*/NULL/* C2F3 */,/*23158*/NULL/* C2F4 */, /*23159*/NULL/* C2F5 */,/*23160*/""/* C2F6 */,/*23161*/NULL/* C2F7 */, /*23162*/""/* C2F8 */,/*23163*/""/* C2F9 */,/*23164*/NULL/* C2FA */, /*23165*/NULL/* C2FB */,/*23166*/NULL/* C2FC */,/*23167*/NULL/* C2FD */,/*23168*/NULL/* C2FE */,/*23169*/NULL/* C2FF */, /*23170*/NULL/* C300 */,/*23171*/NULL/* C301 */,/*23172*/NULL/* C302 */,/*23173*/NULL/* C303 */,/*23174*/NULL/* C304 */, /*23175*/NULL/* C305 */,/*23176*/NULL/* C306 */,/*23177*/NULL/* C307 */,/*23178*/NULL/* C308 */,/*23179*/NULL/* C309 */, /*23180*/NULL/* C30A */,/*23181*/NULL/* C30B */,/*23182*/NULL/* C30C */,/*23183*/NULL/* C30D */,/*23184*/NULL/* C30E */, /*23185*/NULL/* C30F */,/*23186*/NULL/* C310 */,/*23187*/NULL/* C311 */,/*23188*/""/* C312 */, /*23189*/NULL/* C313 */,/*23190*/""/* C314 */,/*23191*/""/* C315 */, /*23192*/NULL/* C316 */,/*23193*/NULL/* C317 */,/*23194*/NULL/* C318 */,/*23195*/NULL/* C319 */,/*23196*/NULL/* C31A */, /*23197*/NULL/* C31B */,/*23198*/NULL/* C31C */,/*23199*/NULL/* C31D */,/*23200*/NULL/* C31E */,/*23201*/NULL/* C31F */, /*23202*/NULL/* C320 */,/*23203*/NULL/* C321 */,/*23204*/NULL/* C322 */,/*23205*/NULL/* C323 */,/*23206*/NULL/* C324 */, /*23207*/NULL/* C325 */,/*23208*/NULL/* C326 */,/*23209*/NULL/* C327 */,/*23210*/NULL/* C328 */,/*23211*/NULL/* C329 */, /*23212*/NULL/* C32A */,/*23213*/NULL/* C32B */,/*23214*/NULL/* C32C */,/*23215*/NULL/* C32D */, /*23216*/""/* C32E */,/*23217*/NULL/* C32F */,/*23218*/""/* C330 */, /*23219*/""/* C331 */,/*23220*/NULL/* C332 */,/*23221*/NULL/* C333 */,/*23222*/NULL/* C334 */, /*23223*/NULL/* C335 */,/*23224*/NULL/* C336 */,/*23225*/NULL/* C337 */,/*23226*/NULL/* C338 */,/*23227*/NULL/* C339 */, /*23228*/NULL/* C33A */,/*23229*/NULL/* C33B */,/*23230*/NULL/* C33C */,/*23231*/NULL/* C33D */,/*23232*/NULL/* C33E */, /*23233*/NULL/* C33F */,/*23234*/NULL/* C340 */,/*23235*/NULL/* C341 */,/*23236*/NULL/* C342 */,/*23237*/NULL/* C343 */, /*23238*/NULL/* C344 */,/*23239*/NULL/* C345 */,/*23240*/NULL/* C346 */,/*23241*/NULL/* C347 */,/*23242*/NULL/* C348 */, /*23243*/NULL/* C349 */,/*23244*/""/* C34A */,/*23245*/NULL/* C34B */, /*23246*/""/* C34C */,/*23247*/""/* C34D */,/*23248*/NULL/* C34E */, /*23249*/NULL/* C34F */,/*23250*/NULL/* C350 */,/*23251*/NULL/* C351 */,/*23252*/NULL/* C352 */,/*23253*/NULL/* C353 */, /*23254*/NULL/* C354 */,/*23255*/NULL/* C355 */,/*23256*/NULL/* C356 */,/*23257*/NULL/* C357 */,/*23258*/NULL/* C358 */, /*23259*/NULL/* C359 */,/*23260*/NULL/* C35A */,/*23261*/NULL/* C35B */,/*23262*/NULL/* C35C */,/*23263*/NULL/* C35D */, /*23264*/NULL/* C35E */,/*23265*/NULL/* C35F */,/*23266*/NULL/* C360 */,/*23267*/NULL/* C361 */,/*23268*/NULL/* C362 */, /*23269*/NULL/* C363 */,/*23270*/NULL/* C364 */,/*23271*/NULL/* C365 */,/*23272*/""/* C366 */, /*23273*/NULL/* C367 */,/*23274*/""/* C368 */,/*23275*/""/* C369 */, /*23276*/NULL/* C36A */,/*23277*/NULL/* C36B */,/*23278*/NULL/* C36C */,/*23279*/NULL/* C36D */,/*23280*/NULL/* C36E */, /*23281*/NULL/* C36F */,/*23282*/NULL/* C370 */,/*23283*/NULL/* C371 */,/*23284*/NULL/* C372 */,/*23285*/NULL/* C373 */, /*23286*/NULL/* C374 */,/*23287*/NULL/* C375 */,/*23288*/NULL/* C376 */,/*23289*/NULL/* C377 */,/*23290*/NULL/* C378 */, /*23291*/NULL/* C379 */,/*23292*/NULL/* C37A */,/*23293*/NULL/* C37B */,/*23294*/NULL/* C37C */,/*23295*/NULL/* C37D */, /*23296*/NULL/* C37E */,/*23297*/NULL/* C37F */,/*23298*/NULL/* C380 */,/*23299*/NULL/* C381 */, /*23300*/""/* C382 */,/*23301*/NULL/* C383 */,/*23302*/""/* C384 */, /*23303*/""/* C385 */,/*23304*/NULL/* C386 */,/*23305*/NULL/* C387 */,/*23306*/NULL/* C388 */, /*23307*/NULL/* C389 */,/*23308*/NULL/* C38A */,/*23309*/NULL/* C38B */,/*23310*/NULL/* C38C */,/*23311*/NULL/* C38D */, /*23312*/NULL/* C38E */,/*23313*/NULL/* C38F */,/*23314*/NULL/* C390 */,/*23315*/NULL/* C391 */,/*23316*/NULL/* C392 */, /*23317*/NULL/* C393 */,/*23318*/NULL/* C394 */,/*23319*/NULL/* C395 */,/*23320*/NULL/* C396 */,/*23321*/NULL/* C397 */, /*23322*/NULL/* C398 */,/*23323*/NULL/* C399 */,/*23324*/NULL/* C39A */,/*23325*/NULL/* C39B */,/*23326*/NULL/* C39C */, /*23327*/NULL/* C39D */,/*23328*/""/* C39E */,/*23329*/NULL/* C39F */, /*23330*/""/* C3A0 */,/*23331*/""/* C3A1 */,/*23332*/NULL/* C3A2 */, /*23333*/NULL/* C3A3 */,/*23334*/NULL/* C3A4 */,/*23335*/NULL/* C3A5 */,/*23336*/NULL/* C3A6 */,/*23337*/NULL/* C3A7 */, /*23338*/NULL/* C3A8 */,/*23339*/NULL/* C3A9 */,/*23340*/NULL/* C3AA */,/*23341*/NULL/* C3AB */,/*23342*/NULL/* C3AC */, /*23343*/NULL/* C3AD */,/*23344*/NULL/* C3AE */,/*23345*/NULL/* C3AF */,/*23346*/NULL/* C3B0 */,/*23347*/NULL/* C3B1 */, /*23348*/NULL/* C3B2 */,/*23349*/NULL/* C3B3 */,/*23350*/NULL/* C3B4 */,/*23351*/NULL/* C3B5 */,/*23352*/NULL/* C3B6 */, /*23353*/NULL/* C3B7 */,/*23354*/NULL/* C3B8 */,/*23355*/NULL/* C3B9 */,/*23356*/""/* C3BA */, /*23357*/NULL/* C3BB */,/*23358*/""/* C3BC */,/*23359*/""/* C3BD */, /*23360*/NULL/* C3BE */,/*23361*/NULL/* C3BF */,/*23362*/NULL/* C3C0 */,/*23363*/NULL/* C3C1 */,/*23364*/NULL/* C3C2 */, /*23365*/NULL/* C3C3 */,/*23366*/NULL/* C3C4 */,/*23367*/NULL/* C3C5 */,/*23368*/NULL/* C3C6 */,/*23369*/NULL/* C3C7 */, /*23370*/NULL/* C3C8 */,/*23371*/NULL/* C3C9 */,/*23372*/NULL/* C3CA */,/*23373*/NULL/* C3CB */,/*23374*/NULL/* C3CC */, /*23375*/NULL/* C3CD */,/*23376*/NULL/* C3CE */,/*23377*/NULL/* C3CF */,/*23378*/NULL/* C3D0 */,/*23379*/NULL/* C3D1 */, /*23380*/NULL/* C3D2 */,/*23381*/NULL/* C3D3 */,/*23382*/NULL/* C3D4 */,/*23383*/NULL/* C3D5 */, /*23384*/""/* C3D6 */,/*23385*/NULL/* C3D7 */,/*23386*/""/* C3D8 */, /*23387*/""/* C3D9 */,/*23388*/NULL/* C3DA */,/*23389*/NULL/* C3DB */,/*23390*/NULL/* C3DC */, /*23391*/NULL/* C3DD */,/*23392*/NULL/* C3DE */,/*23393*/NULL/* C3DF */,/*23394*/NULL/* C3E0 */,/*23395*/NULL/* C3E1 */, /*23396*/NULL/* C3E2 */,/*23397*/NULL/* C3E3 */,/*23398*/NULL/* C3E4 */,/*23399*/NULL/* C3E5 */,/*23400*/NULL/* C3E6 */, /*23401*/NULL/* C3E7 */,/*23402*/NULL/* C3E8 */,/*23403*/NULL/* C3E9 */,/*23404*/NULL/* C3EA */,/*23405*/NULL/* C3EB */, /*23406*/NULL/* C3EC */,/*23407*/NULL/* C3ED */,/*23408*/NULL/* C3EE */,/*23409*/NULL/* C3EF */,/*23410*/NULL/* C3F0 */, /*23411*/NULL/* C3F1 */,/*23412*/""/* C3F2 */,/*23413*/NULL/* C3F3 */, /*23414*/""/* C3F4 */,/*23415*/""/* C3F5 */,/*23416*/NULL/* C3F6 */, /*23417*/NULL/* C3F7 */,/*23418*/NULL/* C3F8 */,/*23419*/NULL/* C3F9 */,/*23420*/NULL/* C3FA */,/*23421*/NULL/* C3FB */, /*23422*/NULL/* C3FC */,/*23423*/NULL/* C3FD */,/*23424*/NULL/* C3FE */,/*23425*/NULL/* C3FF */,/*23426*/NULL/* C400 */, /*23427*/NULL/* C401 */,/*23428*/NULL/* C402 */,/*23429*/NULL/* C403 */,/*23430*/NULL/* C404 */,/*23431*/NULL/* C405 */, /*23432*/NULL/* C406 */,/*23433*/NULL/* C407 */,/*23434*/NULL/* C408 */,/*23435*/NULL/* C409 */,/*23436*/NULL/* C40A */, /*23437*/NULL/* C40B */,/*23438*/NULL/* C40C */,/*23439*/NULL/* C40D */,/*23440*/""/* C40E */, /*23441*/NULL/* C40F */,/*23442*/""/* C410 */,/*23443*/""/* C411 */, /*23444*/NULL/* C412 */,/*23445*/NULL/* C413 */,/*23446*/NULL/* C414 */,/*23447*/NULL/* C415 */,/*23448*/NULL/* C416 */, /*23449*/NULL/* C417 */,/*23450*/NULL/* C418 */,/*23451*/NULL/* C419 */,/*23452*/NULL/* C41A */,/*23453*/NULL/* C41B */, /*23454*/NULL/* C41C */,/*23455*/NULL/* C41D */,/*23456*/NULL/* C41E */,/*23457*/NULL/* C41F */,/*23458*/NULL/* C420 */, /*23459*/NULL/* C421 */,/*23460*/NULL/* C422 */,/*23461*/NULL/* C423 */,/*23462*/NULL/* C424 */,/*23463*/NULL/* C425 */, /*23464*/NULL/* C426 */,/*23465*/NULL/* C427 */,/*23466*/NULL/* C428 */,/*23467*/NULL/* C429 */, /*23468*/""/* C42A */,/*23469*/NULL/* C42B */,/*23470*/""/* C42C */, /*23471*/""/* C42D */,/*23472*/NULL/* C42E */,/*23473*/NULL/* C42F */,/*23474*/NULL/* C430 */, /*23475*/NULL/* C431 */,/*23476*/NULL/* C432 */,/*23477*/NULL/* C433 */,/*23478*/NULL/* C434 */,/*23479*/NULL/* C435 */, /*23480*/NULL/* C436 */,/*23481*/NULL/* C437 */,/*23482*/NULL/* C438 */,/*23483*/NULL/* C439 */,/*23484*/NULL/* C43A */, /*23485*/NULL/* C43B */,/*23486*/NULL/* C43C */,/*23487*/NULL/* C43D */,/*23488*/NULL/* C43E */,/*23489*/NULL/* C43F */, /*23490*/NULL/* C440 */,/*23491*/NULL/* C441 */,/*23492*/NULL/* C442 */,/*23493*/NULL/* C443 */,/*23494*/NULL/* C444 */, /*23495*/NULL/* C445 */,/*23496*/""/* C446 */,/*23497*/NULL/* C447 */, /*23498*/""/* C448 */,/*23499*/""/* C449 */,/*23500*/NULL/* C44A */, /*23501*/NULL/* C44B */,/*23502*/NULL/* C44C */,/*23503*/NULL/* C44D */,/*23504*/NULL/* C44E */,/*23505*/NULL/* C44F */, /*23506*/NULL/* C450 */,/*23507*/NULL/* C451 */,/*23508*/NULL/* C452 */,/*23509*/NULL/* C453 */,/*23510*/NULL/* C454 */, /*23511*/NULL/* C455 */,/*23512*/NULL/* C456 */,/*23513*/NULL/* C457 */,/*23514*/NULL/* C458 */,/*23515*/NULL/* C459 */, /*23516*/NULL/* C45A */,/*23517*/NULL/* C45B */,/*23518*/NULL/* C45C */,/*23519*/NULL/* C45D */,/*23520*/NULL/* C45E */, /*23521*/NULL/* C45F */,/*23522*/NULL/* C460 */,/*23523*/NULL/* C461 */,/*23524*/""/* C462 */, /*23525*/NULL/* C463 */,/*23526*/""/* C464 */,/*23527*/""/* C465 */, /*23528*/NULL/* C466 */,/*23529*/NULL/* C467 */,/*23530*/NULL/* C468 */,/*23531*/NULL/* C469 */,/*23532*/NULL/* C46A */, /*23533*/NULL/* C46B */,/*23534*/NULL/* C46C */,/*23535*/NULL/* C46D */,/*23536*/NULL/* C46E */,/*23537*/NULL/* C46F */, /*23538*/NULL/* C470 */,/*23539*/NULL/* C471 */,/*23540*/NULL/* C472 */,/*23541*/NULL/* C473 */,/*23542*/NULL/* C474 */, /*23543*/NULL/* C475 */,/*23544*/NULL/* C476 */,/*23545*/NULL/* C477 */,/*23546*/NULL/* C478 */,/*23547*/NULL/* C479 */, /*23548*/NULL/* C47A */,/*23549*/NULL/* C47B */,/*23550*/NULL/* C47C */,/*23551*/NULL/* C47D */, /*23552*/""/* C47E */,/*23553*/NULL/* C47F */,/*23554*/""/* C480 */, /*23555*/""/* C481 */,/*23556*/NULL/* C482 */,/*23557*/NULL/* C483 */,/*23558*/NULL/* C484 */, /*23559*/NULL/* C485 */,/*23560*/NULL/* C486 */,/*23561*/NULL/* C487 */,/*23562*/NULL/* C488 */,/*23563*/NULL/* C489 */, /*23564*/NULL/* C48A */,/*23565*/NULL/* C48B */,/*23566*/NULL/* C48C */,/*23567*/NULL/* C48D */,/*23568*/NULL/* C48E */, /*23569*/NULL/* C48F */,/*23570*/NULL/* C490 */,/*23571*/NULL/* C491 */,/*23572*/NULL/* C492 */,/*23573*/NULL/* C493 */, /*23574*/NULL/* C494 */,/*23575*/NULL/* C495 */,/*23576*/NULL/* C496 */,/*23577*/NULL/* C497 */,/*23578*/NULL/* C498 */, /*23579*/NULL/* C499 */,/*23580*/""/* C49A */,/*23581*/NULL/* C49B */, /*23582*/""/* C49C */,/*23583*/""/* C49D */,/*23584*/NULL/* C49E */, /*23585*/NULL/* C49F */,/*23586*/NULL/* C4A0 */,/*23587*/NULL/* C4A1 */,/*23588*/NULL/* C4A2 */,/*23589*/NULL/* C4A3 */, /*23590*/NULL/* C4A4 */,/*23591*/NULL/* C4A5 */,/*23592*/NULL/* C4A6 */,/*23593*/NULL/* C4A7 */,/*23594*/NULL/* C4A8 */, /*23595*/NULL/* C4A9 */,/*23596*/NULL/* C4AA */,/*23597*/NULL/* C4AB */,/*23598*/NULL/* C4AC */,/*23599*/NULL/* C4AD */, /*23600*/NULL/* C4AE */,/*23601*/NULL/* C4AF */,/*23602*/NULL/* C4B0 */,/*23603*/NULL/* C4B1 */,/*23604*/NULL/* C4B2 */, /*23605*/NULL/* C4B3 */,/*23606*/NULL/* C4B4 */,/*23607*/NULL/* C4B5 */,/*23608*/""/* C4B6 */, /*23609*/NULL/* C4B7 */,/*23610*/""/* C4B8 */,/*23611*/""/* C4B9 */, /*23612*/NULL/* C4BA */,/*23613*/NULL/* C4BB */,/*23614*/NULL/* C4BC */,/*23615*/NULL/* C4BD */,/*23616*/NULL/* C4BE */, /*23617*/NULL/* C4BF */,/*23618*/NULL/* C4C0 */,/*23619*/NULL/* C4C1 */,/*23620*/NULL/* C4C2 */,/*23621*/NULL/* C4C3 */, /*23622*/NULL/* C4C4 */,/*23623*/NULL/* C4C5 */,/*23624*/NULL/* C4C6 */,/*23625*/NULL/* C4C7 */,/*23626*/NULL/* C4C8 */, /*23627*/NULL/* C4C9 */,/*23628*/NULL/* C4CA */,/*23629*/NULL/* C4CB */,/*23630*/NULL/* C4CC */,/*23631*/NULL/* C4CD */, /*23632*/NULL/* C4CE */,/*23633*/NULL/* C4CF */,/*23634*/NULL/* C4D0 */,/*23635*/NULL/* C4D1 */, /*23636*/""/* C4D2 */,/*23637*/NULL/* C4D3 */,/*23638*/""/* C4D4 */, /*23639*/""/* C4D5 */,/*23640*/NULL/* C4D6 */,/*23641*/NULL/* C4D7 */,/*23642*/NULL/* C4D8 */, /*23643*/NULL/* C4D9 */,/*23644*/NULL/* C4DA */,/*23645*/NULL/* C4DB */,/*23646*/NULL/* C4DC */,/*23647*/NULL/* C4DD */, /*23648*/NULL/* C4DE */,/*23649*/NULL/* C4DF */,/*23650*/NULL/* C4E0 */,/*23651*/NULL/* C4E1 */,/*23652*/NULL/* C4E2 */, /*23653*/NULL/* C4E3 */,/*23654*/NULL/* C4E4 */,/*23655*/NULL/* C4E5 */,/*23656*/NULL/* C4E6 */,/*23657*/NULL/* C4E7 */, /*23658*/NULL/* C4E8 */,/*23659*/NULL/* C4E9 */,/*23660*/NULL/* C4EA */,/*23661*/NULL/* C4EB */,/*23662*/NULL/* C4EC */, /*23663*/NULL/* C4ED */,/*23664*/""/* C4EE */,/*23665*/NULL/* C4EF */, /*23666*/""/* C4F0 */,/*23667*/""/* C4F1 */,/*23668*/NULL/* C4F2 */, /*23669*/NULL/* C4F3 */,/*23670*/NULL/* C4F4 */,/*23671*/NULL/* C4F5 */,/*23672*/NULL/* C4F6 */,/*23673*/NULL/* C4F7 */, /*23674*/NULL/* C4F8 */,/*23675*/NULL/* C4F9 */,/*23676*/NULL/* C4FA */,/*23677*/NULL/* C4FB */,/*23678*/NULL/* C4FC */, /*23679*/NULL/* C4FD */,/*23680*/NULL/* C4FE */,/*23681*/NULL/* C4FF */,/*23682*/NULL/* C500 */,/*23683*/NULL/* C501 */, /*23684*/NULL/* C502 */,/*23685*/NULL/* C503 */,/*23686*/NULL/* C504 */,/*23687*/NULL/* C505 */,/*23688*/NULL/* C506 */, /*23689*/NULL/* C507 */,/*23690*/NULL/* C508 */,/*23691*/NULL/* C509 */,/*23692*/""/* C50A */, /*23693*/NULL/* C50B */,/*23694*/""/* C50C */,/*23695*/""/* C50D */, /*23696*/NULL/* C50E */,/*23697*/NULL/* C50F */,/*23698*/NULL/* C510 */,/*23699*/NULL/* C511 */,/*23700*/NULL/* C512 */, /*23701*/NULL/* C513 */,/*23702*/NULL/* C514 */,/*23703*/NULL/* C515 */,/*23704*/NULL/* C516 */,/*23705*/NULL/* C517 */, /*23706*/NULL/* C518 */,/*23707*/NULL/* C519 */,/*23708*/NULL/* C51A */,/*23709*/NULL/* C51B */,/*23710*/NULL/* C51C */, /*23711*/NULL/* C51D */,/*23712*/NULL/* C51E */,/*23713*/NULL/* C51F */,/*23714*/NULL/* C520 */,/*23715*/NULL/* C521 */, /*23716*/NULL/* C522 */,/*23717*/NULL/* C523 */,/*23718*/NULL/* C524 */,/*23719*/NULL/* C525 */, /*23720*/""/* C526 */,/*23721*/NULL/* C527 */,/*23722*/""/* C528 */, /*23723*/""/* C529 */,/*23724*/NULL/* C52A */,/*23725*/NULL/* C52B */,/*23726*/NULL/* C52C */, /*23727*/NULL/* C52D */,/*23728*/NULL/* C52E */,/*23729*/NULL/* C52F */,/*23730*/NULL/* C530 */,/*23731*/NULL/* C531 */, /*23732*/NULL/* C532 */,/*23733*/NULL/* C533 */,/*23734*/NULL/* C534 */,/*23735*/NULL/* C535 */,/*23736*/NULL/* C536 */, /*23737*/NULL/* C537 */,/*23738*/NULL/* C538 */,/*23739*/NULL/* C539 */,/*23740*/NULL/* C53A */,/*23741*/NULL/* C53B */, /*23742*/NULL/* C53C */,/*23743*/NULL/* C53D */,/*23744*/NULL/* C53E */,/*23745*/NULL/* C53F */,/*23746*/NULL/* C540 */, /*23747*/NULL/* C541 */,/*23748*/""/* C542 */,/*23749*/NULL/* C543 */, /*23750*/""/* C544 */,/*23751*/""/* C545 */,/*23752*/NULL/* C546 */, /*23753*/NULL/* C547 */,/*23754*/NULL/* C548 */,/*23755*/NULL/* C549 */,/*23756*/NULL/* C54A */,/*23757*/NULL/* C54B */, /*23758*/NULL/* C54C */,/*23759*/NULL/* C54D */,/*23760*/NULL/* C54E */,/*23761*/NULL/* C54F */,/*23762*/NULL/* C550 */, /*23763*/NULL/* C551 */,/*23764*/NULL/* C552 */,/*23765*/NULL/* C553 */,/*23766*/NULL/* C554 */,/*23767*/NULL/* C555 */, /*23768*/NULL/* C556 */,/*23769*/NULL/* C557 */,/*23770*/NULL/* C558 */,/*23771*/NULL/* C559 */,/*23772*/NULL/* C55A */, /*23773*/NULL/* C55B */,/*23774*/NULL/* C55C */,/*23775*/NULL/* C55D */,/*23776*/""/* C55E */, /*23777*/NULL/* C55F */,/*23778*/""/* C560 */,/*23779*/""/* C561 */, /*23780*/NULL/* C562 */,/*23781*/NULL/* C563 */,/*23782*/NULL/* C564 */,/*23783*/NULL/* C565 */,/*23784*/NULL/* C566 */, /*23785*/NULL/* C567 */,/*23786*/NULL/* C568 */,/*23787*/NULL/* C569 */,/*23788*/NULL/* C56A */,/*23789*/NULL/* C56B */, /*23790*/NULL/* C56C */,/*23791*/NULL/* C56D */,/*23792*/NULL/* C56E */,/*23793*/NULL/* C56F */,/*23794*/NULL/* C570 */, /*23795*/NULL/* C571 */,/*23796*/NULL/* C572 */,/*23797*/NULL/* C573 */,/*23798*/NULL/* C574 */,/*23799*/NULL/* C575 */, /*23800*/NULL/* C576 */,/*23801*/NULL/* C577 */,/*23802*/NULL/* C578 */,/*23803*/NULL/* C579 */, /*23804*/""/* C57A */,/*23805*/NULL/* C57B */,/*23806*/""/* C57C */, /*23807*/""/* C57D */,/*23808*/NULL/* C57E */,/*23809*/NULL/* C57F */,/*23810*/NULL/* C580 */, /*23811*/NULL/* C581 */,/*23812*/NULL/* C582 */,/*23813*/NULL/* C583 */,/*23814*/NULL/* C584 */,/*23815*/NULL/* C585 */, /*23816*/NULL/* C586 */,/*23817*/NULL/* C587 */,/*23818*/NULL/* C588 */,/*23819*/NULL/* C589 */,/*23820*/NULL/* C58A */, /*23821*/NULL/* C58B */,/*23822*/NULL/* C58C */,/*23823*/NULL/* C58D */,/*23824*/NULL/* C58E */,/*23825*/NULL/* C58F */, /*23826*/NULL/* C590 */,/*23827*/NULL/* C591 */,/*23828*/NULL/* C592 */,/*23829*/NULL/* C593 */,/*23830*/NULL/* C594 */, /*23831*/NULL/* C595 */,/*23832*/""/* C596 */,/*23833*/NULL/* C597 */, /*23834*/""/* C598 */,/*23835*/""/* C599 */,/*23836*/NULL/* C59A */, /*23837*/NULL/* C59B */,/*23838*/NULL/* C59C */,/*23839*/NULL/* C59D */,/*23840*/NULL/* C59E */,/*23841*/NULL/* C59F */, /*23842*/NULL/* C5A0 */,/*23843*/NULL/* C5A1 */,/*23844*/NULL/* C5A2 */,/*23845*/NULL/* C5A3 */,/*23846*/NULL/* C5A4 */, /*23847*/NULL/* C5A5 */,/*23848*/NULL/* C5A6 */,/*23849*/NULL/* C5A7 */,/*23850*/NULL/* C5A8 */,/*23851*/NULL/* C5A9 */, /*23852*/NULL/* C5AA */,/*23853*/NULL/* C5AB */,/*23854*/NULL/* C5AC */,/*23855*/NULL/* C5AD */,/*23856*/NULL/* C5AE */, /*23857*/NULL/* C5AF */,/*23858*/NULL/* C5B0 */,/*23859*/NULL/* C5B1 */,/*23860*/""/* C5B2 */, /*23861*/NULL/* C5B3 */,/*23862*/""/* C5B4 */,/*23863*/""/* C5B5 */, /*23864*/NULL/* C5B6 */,/*23865*/NULL/* C5B7 */,/*23866*/NULL/* C5B8 */,/*23867*/NULL/* C5B9 */,/*23868*/NULL/* C5BA */, /*23869*/NULL/* C5BB */,/*23870*/NULL/* C5BC */,/*23871*/NULL/* C5BD */,/*23872*/NULL/* C5BE */,/*23873*/NULL/* C5BF */, /*23874*/NULL/* C5C0 */,/*23875*/NULL/* C5C1 */,/*23876*/NULL/* C5C2 */,/*23877*/NULL/* C5C3 */,/*23878*/NULL/* C5C4 */, /*23879*/NULL/* C5C5 */,/*23880*/NULL/* C5C6 */,/*23881*/NULL/* C5C7 */,/*23882*/NULL/* C5C8 */,/*23883*/NULL/* C5C9 */, /*23884*/NULL/* C5CA */,/*23885*/NULL/* C5CB */,/*23886*/NULL/* C5CC */,/*23887*/NULL/* C5CD */, /*23888*/""/* C5CE */,/*23889*/NULL/* C5CF */,/*23890*/""/* C5D0 */, /*23891*/""/* C5D1 */,/*23892*/NULL/* C5D2 */,/*23893*/NULL/* C5D3 */,/*23894*/NULL/* C5D4 */, /*23895*/NULL/* C5D5 */,/*23896*/NULL/* C5D6 */,/*23897*/NULL/* C5D7 */,/*23898*/NULL/* C5D8 */,/*23899*/NULL/* C5D9 */, /*23900*/NULL/* C5DA */,/*23901*/NULL/* C5DB */,/*23902*/NULL/* C5DC */,/*23903*/NULL/* C5DD */,/*23904*/NULL/* C5DE */, /*23905*/NULL/* C5DF */,/*23906*/NULL/* C5E0 */,/*23907*/NULL/* C5E1 */,/*23908*/NULL/* C5E2 */,/*23909*/NULL/* C5E3 */, /*23910*/NULL/* C5E4 */,/*23911*/NULL/* C5E5 */,/*23912*/NULL/* C5E6 */,/*23913*/NULL/* C5E7 */,/*23914*/NULL/* C5E8 */, /*23915*/NULL/* C5E9 */,/*23916*/""/* C5EA */,/*23917*/NULL/* C5EB */, /*23918*/""/* C5EC */,/*23919*/""/* C5ED */,/*23920*/NULL/* C5EE */, /*23921*/NULL/* C5EF */,/*23922*/NULL/* C5F0 */,/*23923*/NULL/* C5F1 */,/*23924*/NULL/* C5F2 */,/*23925*/NULL/* C5F3 */, /*23926*/NULL/* C5F4 */,/*23927*/NULL/* C5F5 */,/*23928*/NULL/* C5F6 */,/*23929*/NULL/* C5F7 */,/*23930*/NULL/* C5F8 */, /*23931*/NULL/* C5F9 */,/*23932*/NULL/* C5FA */,/*23933*/NULL/* C5FB */,/*23934*/NULL/* C5FC */,/*23935*/NULL/* C5FD */, /*23936*/NULL/* C5FE */,/*23937*/NULL/* C5FF */,/*23938*/NULL/* C600 */,/*23939*/NULL/* C601 */,/*23940*/NULL/* C602 */, /*23941*/NULL/* C603 */,/*23942*/NULL/* C604 */,/*23943*/NULL/* C605 */,/*23944*/""/* C606 */, /*23945*/NULL/* C607 */,/*23946*/""/* C608 */,/*23947*/""/* C609 */, /*23948*/NULL/* C60A */,/*23949*/NULL/* C60B */,/*23950*/NULL/* C60C */,/*23951*/NULL/* C60D */,/*23952*/NULL/* C60E */, /*23953*/NULL/* C60F */,/*23954*/NULL/* C610 */,/*23955*/NULL/* C611 */,/*23956*/NULL/* C612 */,/*23957*/NULL/* C613 */, /*23958*/NULL/* C614 */,/*23959*/NULL/* C615 */,/*23960*/NULL/* C616 */,/*23961*/NULL/* C617 */,/*23962*/NULL/* C618 */, /*23963*/NULL/* C619 */,/*23964*/NULL/* C61A */,/*23965*/NULL/* C61B */,/*23966*/NULL/* C61C */,/*23967*/NULL/* C61D */, /*23968*/NULL/* C61E */,/*23969*/NULL/* C61F */,/*23970*/NULL/* C620 */,/*23971*/NULL/* C621 */, /*23972*/""/* C622 */,/*23973*/NULL/* C623 */,/*23974*/""/* C624 */, /*23975*/""/* C625 */,/*23976*/NULL/* C626 */,/*23977*/NULL/* C627 */,/*23978*/NULL/* C628 */, /*23979*/NULL/* C629 */,/*23980*/NULL/* C62A */,/*23981*/NULL/* C62B */,/*23982*/NULL/* C62C */,/*23983*/NULL/* C62D */, /*23984*/NULL/* C62E */,/*23985*/NULL/* C62F */,/*23986*/NULL/* C630 */,/*23987*/NULL/* C631 */,/*23988*/NULL/* C632 */, /*23989*/NULL/* C633 */,/*23990*/NULL/* C634 */,/*23991*/NULL/* C635 */,/*23992*/NULL/* C636 */,/*23993*/NULL/* C637 */, /*23994*/NULL/* C638 */,/*23995*/NULL/* C639 */,/*23996*/NULL/* C63A */,/*23997*/NULL/* C63B */,/*23998*/NULL/* C63C */, /*23999*/NULL/* C63D */,/*24000*/""/* C63E */,/*24001*/NULL/* C63F */, /*24002*/""/* C640 */,/*24003*/""/* C641 */,/*24004*/NULL/* C642 */, /*24005*/NULL/* C643 */,/*24006*/NULL/* C644 */,/*24007*/NULL/* C645 */,/*24008*/NULL/* C646 */,/*24009*/NULL/* C647 */, /*24010*/NULL/* C648 */,/*24011*/NULL/* C649 */,/*24012*/NULL/* C64A */,/*24013*/NULL/* C64B */,/*24014*/NULL/* C64C */, /*24015*/NULL/* C64D */,/*24016*/NULL/* C64E */,/*24017*/NULL/* C64F */,/*24018*/NULL/* C650 */,/*24019*/NULL/* C651 */, /*24020*/NULL/* C652 */,/*24021*/NULL/* C653 */,/*24022*/NULL/* C654 */,/*24023*/NULL/* C655 */,/*24024*/NULL/* C656 */, /*24025*/NULL/* C657 */,/*24026*/NULL/* C658 */,/*24027*/NULL/* C659 */,/*24028*/""/* C65A */, /*24029*/NULL/* C65B */,/*24030*/""/* C65C */,/*24031*/""/* C65D */, /*24032*/NULL/* C65E */,/*24033*/NULL/* C65F */,/*24034*/NULL/* C660 */,/*24035*/NULL/* C661 */,/*24036*/NULL/* C662 */, /*24037*/NULL/* C663 */,/*24038*/NULL/* C664 */,/*24039*/NULL/* C665 */,/*24040*/NULL/* C666 */,/*24041*/NULL/* C667 */, /*24042*/NULL/* C668 */,/*24043*/NULL/* C669 */,/*24044*/NULL/* C66A */,/*24045*/NULL/* C66B */,/*24046*/NULL/* C66C */, /*24047*/NULL/* C66D */,/*24048*/NULL/* C66E */,/*24049*/NULL/* C66F */,/*24050*/NULL/* C670 */,/*24051*/NULL/* C671 */, /*24052*/NULL/* C672 */,/*24053*/NULL/* C673 */,/*24054*/NULL/* C674 */,/*24055*/NULL/* C675 */, /*24056*/""/* C676 */,/*24057*/NULL/* C677 */,/*24058*/""/* C678 */, /*24059*/""/* C679 */,/*24060*/NULL/* C67A */,/*24061*/NULL/* C67B */,/*24062*/NULL/* C67C */, /*24063*/NULL/* C67D */,/*24064*/NULL/* C67E */,/*24065*/NULL/* C67F */,/*24066*/NULL/* C680 */,/*24067*/NULL/* C681 */, /*24068*/NULL/* C682 */,/*24069*/NULL/* C683 */,/*24070*/NULL/* C684 */,/*24071*/NULL/* C685 */,/*24072*/NULL/* C686 */, /*24073*/NULL/* C687 */,/*24074*/NULL/* C688 */,/*24075*/NULL/* C689 */,/*24076*/NULL/* C68A */,/*24077*/NULL/* C68B */, /*24078*/NULL/* C68C */,/*24079*/NULL/* C68D */,/*24080*/NULL/* C68E */,/*24081*/NULL/* C68F */,/*24082*/NULL/* C690 */, /*24083*/NULL/* C691 */,/*24084*/""/* C692 */,/*24085*/NULL/* C693 */, /*24086*/""/* C694 */,/*24087*/""/* C695 */,/*24088*/NULL/* C696 */, /*24089*/NULL/* C697 */,/*24090*/NULL/* C698 */,/*24091*/NULL/* C699 */,/*24092*/NULL/* C69A */,/*24093*/NULL/* C69B */, /*24094*/NULL/* C69C */,/*24095*/NULL/* C69D */,/*24096*/NULL/* C69E */,/*24097*/NULL/* C69F */,/*24098*/NULL/* C6A0 */, /*24099*/NULL/* C6A1 */,/*24100*/NULL/* C6A2 */,/*24101*/NULL/* C6A3 */,/*24102*/NULL/* C6A4 */,/*24103*/NULL/* C6A5 */, /*24104*/NULL/* C6A6 */,/*24105*/NULL/* C6A7 */,/*24106*/NULL/* C6A8 */,/*24107*/NULL/* C6A9 */,/*24108*/NULL/* C6AA */, /*24109*/NULL/* C6AB */,/*24110*/NULL/* C6AC */,/*24111*/NULL/* C6AD */,/*24112*/""/* C6AE */, /*24113*/NULL/* C6AF */,/*24114*/""/* C6B0 */,/*24115*/""/* C6B1 */, /*24116*/NULL/* C6B2 */,/*24117*/NULL/* C6B3 */,/*24118*/NULL/* C6B4 */,/*24119*/NULL/* C6B5 */,/*24120*/NULL/* C6B6 */, /*24121*/NULL/* C6B7 */,/*24122*/NULL/* C6B8 */,/*24123*/NULL/* C6B9 */,/*24124*/NULL/* C6BA */,/*24125*/NULL/* C6BB */, /*24126*/NULL/* C6BC */,/*24127*/NULL/* C6BD */,/*24128*/NULL/* C6BE */,/*24129*/NULL/* C6BF */,/*24130*/NULL/* C6C0 */, /*24131*/NULL/* C6C1 */,/*24132*/NULL/* C6C2 */,/*24133*/NULL/* C6C3 */,/*24134*/NULL/* C6C4 */,/*24135*/NULL/* C6C5 */, /*24136*/NULL/* C6C6 */,/*24137*/NULL/* C6C7 */,/*24138*/NULL/* C6C8 */,/*24139*/NULL/* C6C9 */, /*24140*/""/* C6CA */,/*24141*/NULL/* C6CB */,/*24142*/""/* C6CC */, /*24143*/""/* C6CD */,/*24144*/NULL/* C6CE */,/*24145*/NULL/* C6CF */,/*24146*/NULL/* C6D0 */, /*24147*/NULL/* C6D1 */,/*24148*/NULL/* C6D2 */,/*24149*/NULL/* C6D3 */,/*24150*/NULL/* C6D4 */,/*24151*/NULL/* C6D5 */, /*24152*/NULL/* C6D6 */,/*24153*/NULL/* C6D7 */,/*24154*/NULL/* C6D8 */,/*24155*/NULL/* C6D9 */,/*24156*/NULL/* C6DA */, /*24157*/NULL/* C6DB */,/*24158*/NULL/* C6DC */,/*24159*/NULL/* C6DD */,/*24160*/NULL/* C6DE */,/*24161*/NULL/* C6DF */, /*24162*/NULL/* C6E0 */,/*24163*/NULL/* C6E1 */,/*24164*/NULL/* C6E2 */,/*24165*/NULL/* C6E3 */,/*24166*/NULL/* C6E4 */, /*24167*/NULL/* C6E5 */,/*24168*/""/* C6E6 */,/*24169*/NULL/* C6E7 */, /*24170*/""/* C6E8 */,/*24171*/""/* C6E9 */,/*24172*/NULL/* C6EA */, /*24173*/NULL/* C6EB */,/*24174*/NULL/* C6EC */,/*24175*/NULL/* C6ED */,/*24176*/NULL/* C6EE */,/*24177*/NULL/* C6EF */, /*24178*/NULL/* C6F0 */,/*24179*/NULL/* C6F1 */,/*24180*/NULL/* C6F2 */,/*24181*/NULL/* C6F3 */,/*24182*/NULL/* C6F4 */, /*24183*/NULL/* C6F5 */,/*24184*/NULL/* C6F6 */,/*24185*/NULL/* C6F7 */,/*24186*/NULL/* C6F8 */,/*24187*/NULL/* C6F9 */, /*24188*/NULL/* C6FA */,/*24189*/NULL/* C6FB */,/*24190*/NULL/* C6FC */,/*24191*/NULL/* C6FD */,/*24192*/NULL/* C6FE */, /*24193*/NULL/* C6FF */,/*24194*/NULL/* C700 */,/*24195*/NULL/* C701 */,/*24196*/""/* C702 */, /*24197*/NULL/* C703 */,/*24198*/""/* C704 */,/*24199*/""/* C705 */, /*24200*/NULL/* C706 */,/*24201*/NULL/* C707 */,/*24202*/NULL/* C708 */,/*24203*/NULL/* C709 */,/*24204*/NULL/* C70A */, /*24205*/NULL/* C70B */,/*24206*/NULL/* C70C */,/*24207*/NULL/* C70D */,/*24208*/NULL/* C70E */,/*24209*/NULL/* C70F */, /*24210*/NULL/* C710 */,/*24211*/NULL/* C711 */,/*24212*/NULL/* C712 */,/*24213*/NULL/* C713 */,/*24214*/NULL/* C714 */, /*24215*/NULL/* C715 */,/*24216*/NULL/* C716 */,/*24217*/NULL/* C717 */,/*24218*/NULL/* C718 */,/*24219*/NULL/* C719 */, /*24220*/NULL/* C71A */,/*24221*/NULL/* C71B */,/*24222*/NULL/* C71C */,/*24223*/NULL/* C71D */, /*24224*/""/* C71E */,/*24225*/NULL/* C71F */,/*24226*/""/* C720 */, /*24227*/""/* C721 */,/*24228*/NULL/* C722 */,/*24229*/NULL/* C723 */,/*24230*/NULL/* C724 */, /*24231*/NULL/* C725 */,/*24232*/NULL/* C726 */,/*24233*/NULL/* C727 */,/*24234*/NULL/* C728 */,/*24235*/NULL/* C729 */, /*24236*/NULL/* C72A */,/*24237*/NULL/* C72B */,/*24238*/NULL/* C72C */,/*24239*/NULL/* C72D */,/*24240*/NULL/* C72E */, /*24241*/NULL/* C72F */,/*24242*/NULL/* C730 */,/*24243*/NULL/* C731 */,/*24244*/NULL/* C732 */,/*24245*/NULL/* C733 */, /*24246*/NULL/* C734 */,/*24247*/NULL/* C735 */,/*24248*/NULL/* C736 */,/*24249*/NULL/* C737 */,/*24250*/NULL/* C738 */, /*24251*/NULL/* C739 */,/*24252*/""/* C73A */,/*24253*/NULL/* C73B */, /*24254*/""/* C73C */,/*24255*/""/* C73D */,/*24256*/NULL/* C73E */, /*24257*/NULL/* C73F */,/*24258*/NULL/* C740 */,/*24259*/NULL/* C741 */,/*24260*/NULL/* C742 */,/*24261*/NULL/* C743 */, /*24262*/NULL/* C744 */,/*24263*/NULL/* C745 */,/*24264*/NULL/* C746 */,/*24265*/NULL/* C747 */,/*24266*/NULL/* C748 */, /*24267*/NULL/* C749 */,/*24268*/NULL/* C74A */,/*24269*/NULL/* C74B */,/*24270*/NULL/* C74C */,/*24271*/NULL/* C74D */, /*24272*/NULL/* C74E */,/*24273*/NULL/* C74F */,/*24274*/NULL/* C750 */,/*24275*/NULL/* C751 */,/*24276*/NULL/* C752 */, /*24277*/NULL/* C753 */,/*24278*/NULL/* C754 */,/*24279*/NULL/* C755 */,/*24280*/""/* C756 */, /*24281*/NULL/* C757 */,/*24282*/""/* C758 */,/*24283*/""/* C759 */, /*24284*/NULL/* C75A */,/*24285*/NULL/* C75B */,/*24286*/NULL/* C75C */,/*24287*/NULL/* C75D */,/*24288*/NULL/* C75E */, /*24289*/NULL/* C75F */,/*24290*/NULL/* C760 */,/*24291*/NULL/* C761 */,/*24292*/NULL/* C762 */,/*24293*/NULL/* C763 */, /*24294*/NULL/* C764 */,/*24295*/NULL/* C765 */,/*24296*/NULL/* C766 */,/*24297*/NULL/* C767 */,/*24298*/NULL/* C768 */, /*24299*/NULL/* C769 */,/*24300*/NULL/* C76A */,/*24301*/NULL/* C76B */,/*24302*/NULL/* C76C */,/*24303*/NULL/* C76D */, /*24304*/NULL/* C76E */,/*24305*/NULL/* C76F */,/*24306*/NULL/* C770 */,/*24307*/NULL/* C771 */, /*24308*/""/* C772 */,/*24309*/NULL/* C773 */,/*24310*/""/* C774 */, /*24311*/""/* C775 */,/*24312*/NULL/* C776 */,/*24313*/NULL/* C777 */,/*24314*/NULL/* C778 */, /*24315*/NULL/* C779 */,/*24316*/NULL/* C77A */,/*24317*/NULL/* C77B */,/*24318*/NULL/* C77C */,/*24319*/NULL/* C77D */, /*24320*/NULL/* C77E */,/*24321*/NULL/* C77F */,/*24322*/NULL/* C780 */,/*24323*/NULL/* C781 */,/*24324*/NULL/* C782 */, /*24325*/NULL/* C783 */,/*24326*/NULL/* C784 */,/*24327*/NULL/* C785 */,/*24328*/NULL/* C786 */,/*24329*/NULL/* C787 */, /*24330*/NULL/* C788 */,/*24331*/NULL/* C789 */,/*24332*/NULL/* C78A */,/*24333*/NULL/* C78B */,/*24334*/NULL/* C78C */, /*24335*/NULL/* C78D */,/*24336*/""/* C78E */,/*24337*/NULL/* C78F */, /*24338*/""/* C790 */,/*24339*/""/* C791 */,/*24340*/NULL/* C792 */, /*24341*/NULL/* C793 */,/*24342*/NULL/* C794 */,/*24343*/NULL/* C795 */,/*24344*/NULL/* C796 */,/*24345*/NULL/* C797 */, /*24346*/NULL/* C798 */,/*24347*/NULL/* C799 */,/*24348*/NULL/* C79A */,/*24349*/NULL/* C79B */,/*24350*/NULL/* C79C */, /*24351*/NULL/* C79D */,/*24352*/NULL/* C79E */,/*24353*/NULL/* C79F */,/*24354*/NULL/* C7A0 */,/*24355*/NULL/* C7A1 */, /*24356*/NULL/* C7A2 */,/*24357*/NULL/* C7A3 */,/*24358*/NULL/* C7A4 */,/*24359*/NULL/* C7A5 */,/*24360*/NULL/* C7A6 */, /*24361*/NULL/* C7A7 */,/*24362*/NULL/* C7A8 */,/*24363*/NULL/* C7A9 */,/*24364*/""/* C7AA */, /*24365*/NULL/* C7AB */,/*24366*/""/* C7AC */,/*24367*/""/* C7AD */, /*24368*/NULL/* C7AE */,/*24369*/NULL/* C7AF */,/*24370*/NULL/* C7B0 */,/*24371*/NULL/* C7B1 */,/*24372*/NULL/* C7B2 */, /*24373*/NULL/* C7B3 */,/*24374*/NULL/* C7B4 */,/*24375*/NULL/* C7B5 */,/*24376*/NULL/* C7B6 */,/*24377*/NULL/* C7B7 */, /*24378*/NULL/* C7B8 */,/*24379*/NULL/* C7B9 */,/*24380*/NULL/* C7BA */,/*24381*/NULL/* C7BB */,/*24382*/NULL/* C7BC */, /*24383*/NULL/* C7BD */,/*24384*/NULL/* C7BE */,/*24385*/NULL/* C7BF */,/*24386*/NULL/* C7C0 */,/*24387*/NULL/* C7C1 */, /*24388*/NULL/* C7C2 */,/*24389*/NULL/* C7C3 */,/*24390*/NULL/* C7C4 */,/*24391*/NULL/* C7C5 */, /*24392*/""/* C7C6 */,/*24393*/NULL/* C7C7 */,/*24394*/""/* C7C8 */, /*24395*/""/* C7C9 */,/*24396*/NULL/* C7CA */,/*24397*/NULL/* C7CB */,/*24398*/NULL/* C7CC */, /*24399*/NULL/* C7CD */,/*24400*/NULL/* C7CE */,/*24401*/NULL/* C7CF */,/*24402*/NULL/* C7D0 */,/*24403*/NULL/* C7D1 */, /*24404*/NULL/* C7D2 */,/*24405*/NULL/* C7D3 */,/*24406*/NULL/* C7D4 */,/*24407*/NULL/* C7D5 */,/*24408*/NULL/* C7D6 */, /*24409*/NULL/* C7D7 */,/*24410*/NULL/* C7D8 */,/*24411*/NULL/* C7D9 */,/*24412*/NULL/* C7DA */,/*24413*/NULL/* C7DB */, /*24414*/NULL/* C7DC */,/*24415*/NULL/* C7DD */,/*24416*/NULL/* C7DE */,/*24417*/NULL/* C7DF */,/*24418*/NULL/* C7E0 */, /*24419*/NULL/* C7E1 */,/*24420*/""/* C7E2 */,/*24421*/NULL/* C7E3 */, /*24422*/""/* C7E4 */,/*24423*/""/* C7E5 */,/*24424*/NULL/* C7E6 */, /*24425*/NULL/* C7E7 */,/*24426*/NULL/* C7E8 */,/*24427*/NULL/* C7E9 */,/*24428*/NULL/* C7EA */,/*24429*/NULL/* C7EB */, /*24430*/NULL/* C7EC */,/*24431*/NULL/* C7ED */,/*24432*/NULL/* C7EE */,/*24433*/NULL/* C7EF */,/*24434*/NULL/* C7F0 */, /*24435*/NULL/* C7F1 */,/*24436*/NULL/* C7F2 */,/*24437*/NULL/* C7F3 */,/*24438*/NULL/* C7F4 */,/*24439*/NULL/* C7F5 */, /*24440*/NULL/* C7F6 */,/*24441*/NULL/* C7F7 */,/*24442*/NULL/* C7F8 */,/*24443*/NULL/* C7F9 */,/*24444*/NULL/* C7FA */, /*24445*/NULL/* C7FB */,/*24446*/NULL/* C7FC */,/*24447*/NULL/* C7FD */,/*24448*/""/* C7FE */, /*24449*/NULL/* C7FF */,/*24450*/""/* C800 */,/*24451*/""/* C801 */, /*24452*/NULL/* C802 */,/*24453*/NULL/* C803 */,/*24454*/NULL/* C804 */,/*24455*/NULL/* C805 */,/*24456*/NULL/* C806 */, /*24457*/NULL/* C807 */,/*24458*/NULL/* C808 */,/*24459*/NULL/* C809 */,/*24460*/NULL/* C80A */,/*24461*/NULL/* C80B */, /*24462*/NULL/* C80C */,/*24463*/NULL/* C80D */,/*24464*/NULL/* C80E */,/*24465*/NULL/* C80F */,/*24466*/NULL/* C810 */, /*24467*/NULL/* C811 */,/*24468*/NULL/* C812 */,/*24469*/NULL/* C813 */,/*24470*/NULL/* C814 */,/*24471*/NULL/* C815 */, /*24472*/NULL/* C816 */,/*24473*/NULL/* C817 */,/*24474*/NULL/* C818 */,/*24475*/NULL/* C819 */, /*24476*/""/* C81A */,/*24477*/NULL/* C81B */,/*24478*/""/* C81C */, /*24479*/""/* C81D */,/*24480*/NULL/* C81E */,/*24481*/NULL/* C81F */,/*24482*/NULL/* C820 */, /*24483*/NULL/* C821 */,/*24484*/NULL/* C822 */,/*24485*/NULL/* C823 */,/*24486*/NULL/* C824 */,/*24487*/NULL/* C825 */, /*24488*/NULL/* C826 */,/*24489*/NULL/* C827 */,/*24490*/NULL/* C828 */,/*24491*/NULL/* C829 */,/*24492*/NULL/* C82A */, /*24493*/NULL/* C82B */,/*24494*/NULL/* C82C */,/*24495*/NULL/* C82D */,/*24496*/NULL/* C82E */,/*24497*/NULL/* C82F */, /*24498*/NULL/* C830 */,/*24499*/NULL/* C831 */,/*24500*/NULL/* C832 */,/*24501*/NULL/* C833 */,/*24502*/NULL/* C834 */, /*24503*/NULL/* C835 */,/*24504*/""/* C836 */,/*24505*/NULL/* C837 */, /*24506*/""/* C838 */,/*24507*/""/* C839 */,/*24508*/NULL/* C83A */, /*24509*/NULL/* C83B */,/*24510*/NULL/* C83C */,/*24511*/NULL/* C83D */,/*24512*/NULL/* C83E */,/*24513*/NULL/* C83F */, /*24514*/NULL/* C840 */,/*24515*/NULL/* C841 */,/*24516*/NULL/* C842 */,/*24517*/NULL/* C843 */,/*24518*/NULL/* C844 */, /*24519*/NULL/* C845 */,/*24520*/NULL/* C846 */,/*24521*/NULL/* C847 */,/*24522*/NULL/* C848 */,/*24523*/NULL/* C849 */, /*24524*/NULL/* C84A */,/*24525*/NULL/* C84B */,/*24526*/NULL/* C84C */,/*24527*/NULL/* C84D */,/*24528*/NULL/* C84E */, /*24529*/NULL/* C84F */,/*24530*/NULL/* C850 */,/*24531*/NULL/* C851 */,/*24532*/""/* C852 */, /*24533*/NULL/* C853 */,/*24534*/""/* C854 */,/*24535*/""/* C855 */, /*24536*/NULL/* C856 */,/*24537*/NULL/* C857 */,/*24538*/NULL/* C858 */,/*24539*/NULL/* C859 */,/*24540*/NULL/* C85A */, /*24541*/NULL/* C85B */,/*24542*/NULL/* C85C */,/*24543*/NULL/* C85D */,/*24544*/NULL/* C85E */,/*24545*/NULL/* C85F */, /*24546*/NULL/* C860 */,/*24547*/NULL/* C861 */,/*24548*/NULL/* C862 */,/*24549*/NULL/* C863 */,/*24550*/NULL/* C864 */, /*24551*/NULL/* C865 */,/*24552*/NULL/* C866 */,/*24553*/NULL/* C867 */,/*24554*/NULL/* C868 */,/*24555*/NULL/* C869 */, /*24556*/NULL/* C86A */,/*24557*/NULL/* C86B */,/*24558*/NULL/* C86C */,/*24559*/NULL/* C86D */, /*24560*/""/* C86E */,/*24561*/NULL/* C86F */,/*24562*/""/* C870 */, /*24563*/""/* C871 */,/*24564*/NULL/* C872 */,/*24565*/NULL/* C873 */,/*24566*/NULL/* C874 */, /*24567*/NULL/* C875 */,/*24568*/NULL/* C876 */,/*24569*/NULL/* C877 */,/*24570*/NULL/* C878 */,/*24571*/NULL/* C879 */, /*24572*/NULL/* C87A */,/*24573*/NULL/* C87B */,/*24574*/NULL/* C87C */,/*24575*/NULL/* C87D */,/*24576*/NULL/* C87E */, /*24577*/NULL/* C87F */,/*24578*/NULL/* C880 */,/*24579*/NULL/* C881 */,/*24580*/NULL/* C882 */,/*24581*/NULL/* C883 */, /*24582*/NULL/* C884 */,/*24583*/NULL/* C885 */,/*24584*/NULL/* C886 */,/*24585*/NULL/* C887 */,/*24586*/NULL/* C888 */, /*24587*/NULL/* C889 */,/*24588*/""/* C88A */,/*24589*/NULL/* C88B */, /*24590*/""/* C88C */,/*24591*/""/* C88D */,/*24592*/NULL/* C88E */, /*24593*/NULL/* C88F */,/*24594*/NULL/* C890 */,/*24595*/NULL/* C891 */,/*24596*/NULL/* C892 */,/*24597*/NULL/* C893 */, /*24598*/NULL/* C894 */,/*24599*/NULL/* C895 */,/*24600*/NULL/* C896 */,/*24601*/NULL/* C897 */,/*24602*/NULL/* C898 */, /*24603*/NULL/* C899 */,/*24604*/NULL/* C89A */,/*24605*/NULL/* C89B */,/*24606*/NULL/* C89C */,/*24607*/NULL/* C89D */, /*24608*/NULL/* C89E */,/*24609*/NULL/* C89F */,/*24610*/NULL/* C8A0 */,/*24611*/NULL/* C8A1 */,/*24612*/NULL/* C8A2 */, /*24613*/NULL/* C8A3 */,/*24614*/NULL/* C8A4 */,/*24615*/NULL/* C8A5 */,/*24616*/""/* C8A6 */, /*24617*/NULL/* C8A7 */,/*24618*/""/* C8A8 */,/*24619*/""/* C8A9 */, /*24620*/NULL/* C8AA */,/*24621*/NULL/* C8AB */,/*24622*/NULL/* C8AC */,/*24623*/NULL/* C8AD */,/*24624*/NULL/* C8AE */, /*24625*/NULL/* C8AF */,/*24626*/NULL/* C8B0 */,/*24627*/NULL/* C8B1 */,/*24628*/NULL/* C8B2 */,/*24629*/NULL/* C8B3 */, /*24630*/NULL/* C8B4 */,/*24631*/NULL/* C8B5 */,/*24632*/NULL/* C8B6 */,/*24633*/NULL/* C8B7 */,/*24634*/NULL/* C8B8 */, /*24635*/NULL/* C8B9 */,/*24636*/NULL/* C8BA */,/*24637*/NULL/* C8BB */,/*24638*/NULL/* C8BC */,/*24639*/NULL/* C8BD */, /*24640*/NULL/* C8BE */,/*24641*/NULL/* C8BF */,/*24642*/NULL/* C8C0 */,/*24643*/NULL/* C8C1 */, /*24644*/""/* C8C2 */,/*24645*/NULL/* C8C3 */,/*24646*/""/* C8C4 */, /*24647*/""/* C8C5 */,/*24648*/NULL/* C8C6 */,/*24649*/NULL/* C8C7 */,/*24650*/NULL/* C8C8 */, /*24651*/NULL/* C8C9 */,/*24652*/NULL/* C8CA */,/*24653*/NULL/* C8CB */,/*24654*/NULL/* C8CC */,/*24655*/NULL/* C8CD */, /*24656*/NULL/* C8CE */,/*24657*/NULL/* C8CF */,/*24658*/NULL/* C8D0 */,/*24659*/NULL/* C8D1 */,/*24660*/NULL/* C8D2 */, /*24661*/NULL/* C8D3 */,/*24662*/NULL/* C8D4 */,/*24663*/NULL/* C8D5 */,/*24664*/NULL/* C8D6 */,/*24665*/NULL/* C8D7 */, /*24666*/NULL/* C8D8 */,/*24667*/NULL/* C8D9 */,/*24668*/NULL/* C8DA */,/*24669*/NULL/* C8DB */,/*24670*/NULL/* C8DC */, /*24671*/NULL/* C8DD */,/*24672*/""/* C8DE */,/*24673*/NULL/* C8DF */, /*24674*/""/* C8E0 */,/*24675*/""/* C8E1 */,/*24676*/NULL/* C8E2 */, /*24677*/NULL/* C8E3 */,/*24678*/NULL/* C8E4 */,/*24679*/NULL/* C8E5 */,/*24680*/NULL/* C8E6 */,/*24681*/NULL/* C8E7 */, /*24682*/NULL/* C8E8 */,/*24683*/NULL/* C8E9 */,/*24684*/NULL/* C8EA */,/*24685*/NULL/* C8EB */,/*24686*/NULL/* C8EC */, /*24687*/NULL/* C8ED */,/*24688*/NULL/* C8EE */,/*24689*/NULL/* C8EF */,/*24690*/NULL/* C8F0 */,/*24691*/NULL/* C8F1 */, /*24692*/NULL/* C8F2 */,/*24693*/NULL/* C8F3 */,/*24694*/NULL/* C8F4 */,/*24695*/NULL/* C8F5 */,/*24696*/NULL/* C8F6 */, /*24697*/NULL/* C8F7 */,/*24698*/NULL/* C8F8 */,/*24699*/NULL/* C8F9 */,/*24700*/""/* C8FA */, /*24701*/NULL/* C8FB */,/*24702*/""/* C8FC */,/*24703*/""/* C8FD */, /*24704*/NULL/* C8FE */,/*24705*/NULL/* C8FF */,/*24706*/NULL/* C900 */,/*24707*/NULL/* C901 */,/*24708*/NULL/* C902 */, /*24709*/NULL/* C903 */,/*24710*/NULL/* C904 */,/*24711*/NULL/* C905 */,/*24712*/NULL/* C906 */,/*24713*/NULL/* C907 */, /*24714*/NULL/* C908 */,/*24715*/NULL/* C909 */,/*24716*/NULL/* C90A */,/*24717*/NULL/* C90B */,/*24718*/NULL/* C90C */, /*24719*/NULL/* C90D */,/*24720*/NULL/* C90E */,/*24721*/NULL/* C90F */,/*24722*/NULL/* C910 */,/*24723*/NULL/* C911 */, /*24724*/NULL/* C912 */,/*24725*/NULL/* C913 */,/*24726*/NULL/* C914 */,/*24727*/NULL/* C915 */, /*24728*/""/* C916 */,/*24729*/NULL/* C917 */,/*24730*/""/* C918 */, /*24731*/""/* C919 */,/*24732*/NULL/* C91A */,/*24733*/NULL/* C91B */,/*24734*/NULL/* C91C */, /*24735*/NULL/* C91D */,/*24736*/NULL/* C91E */,/*24737*/NULL/* C91F */,/*24738*/NULL/* C920 */,/*24739*/NULL/* C921 */, /*24740*/NULL/* C922 */,/*24741*/NULL/* C923 */,/*24742*/NULL/* C924 */,/*24743*/NULL/* C925 */,/*24744*/NULL/* C926 */, /*24745*/NULL/* C927 */,/*24746*/NULL/* C928 */,/*24747*/NULL/* C929 */,/*24748*/NULL/* C92A */,/*24749*/NULL/* C92B */, /*24750*/NULL/* C92C */,/*24751*/NULL/* C92D */,/*24752*/NULL/* C92E */,/*24753*/NULL/* C92F */,/*24754*/NULL/* C930 */, /*24755*/NULL/* C931 */,/*24756*/""/* C932 */,/*24757*/NULL/* C933 */, /*24758*/""/* C934 */,/*24759*/""/* C935 */,/*24760*/NULL/* C936 */, /*24761*/NULL/* C937 */,/*24762*/NULL/* C938 */,/*24763*/NULL/* C939 */,/*24764*/NULL/* C93A */,/*24765*/NULL/* C93B */, /*24766*/NULL/* C93C */,/*24767*/NULL/* C93D */,/*24768*/NULL/* C93E */,/*24769*/NULL/* C93F */,/*24770*/NULL/* C940 */, /*24771*/NULL/* C941 */,/*24772*/NULL/* C942 */,/*24773*/NULL/* C943 */,/*24774*/NULL/* C944 */,/*24775*/NULL/* C945 */, /*24776*/NULL/* C946 */,/*24777*/NULL/* C947 */,/*24778*/NULL/* C948 */,/*24779*/NULL/* C949 */,/*24780*/NULL/* C94A */, /*24781*/NULL/* C94B */,/*24782*/NULL/* C94C */,/*24783*/NULL/* C94D */,/*24784*/""/* C94E */, /*24785*/NULL/* C94F */,/*24786*/""/* C950 */,/*24787*/""/* C951 */, /*24788*/NULL/* C952 */,/*24789*/NULL/* C953 */,/*24790*/NULL/* C954 */,/*24791*/NULL/* C955 */,/*24792*/NULL/* C956 */, /*24793*/NULL/* C957 */,/*24794*/NULL/* C958 */,/*24795*/NULL/* C959 */,/*24796*/NULL/* C95A */,/*24797*/NULL/* C95B */, /*24798*/NULL/* C95C */,/*24799*/NULL/* C95D */,/*24800*/NULL/* C95E */,/*24801*/NULL/* C95F */,/*24802*/NULL/* C960 */, /*24803*/NULL/* C961 */,/*24804*/NULL/* C962 */,/*24805*/NULL/* C963 */,/*24806*/NULL/* C964 */,/*24807*/NULL/* C965 */, /*24808*/NULL/* C966 */,/*24809*/NULL/* C967 */,/*24810*/NULL/* C968 */,/*24811*/NULL/* C969 */, /*24812*/""/* C96A */,/*24813*/NULL/* C96B */,/*24814*/""/* C96C */, /*24815*/""/* C96D */,/*24816*/NULL/* C96E */,/*24817*/NULL/* C96F */,/*24818*/NULL/* C970 */, /*24819*/NULL/* C971 */,/*24820*/NULL/* C972 */,/*24821*/NULL/* C973 */,/*24822*/NULL/* C974 */,/*24823*/NULL/* C975 */, /*24824*/NULL/* C976 */,/*24825*/NULL/* C977 */,/*24826*/NULL/* C978 */,/*24827*/NULL/* C979 */,/*24828*/NULL/* C97A */, /*24829*/NULL/* C97B */,/*24830*/NULL/* C97C */,/*24831*/NULL/* C97D */,/*24832*/NULL/* C97E */,/*24833*/NULL/* C97F */, /*24834*/NULL/* C980 */,/*24835*/NULL/* C981 */,/*24836*/NULL/* C982 */,/*24837*/NULL/* C983 */,/*24838*/NULL/* C984 */, /*24839*/NULL/* C985 */,/*24840*/""/* C986 */,/*24841*/NULL/* C987 */, /*24842*/""/* C988 */,/*24843*/""/* C989 */,/*24844*/NULL/* C98A */, /*24845*/NULL/* C98B */,/*24846*/NULL/* C98C */,/*24847*/NULL/* C98D */,/*24848*/NULL/* C98E */,/*24849*/NULL/* C98F */, /*24850*/NULL/* C990 */,/*24851*/NULL/* C991 */,/*24852*/NULL/* C992 */,/*24853*/NULL/* C993 */,/*24854*/NULL/* C994 */, /*24855*/NULL/* C995 */,/*24856*/NULL/* C996 */,/*24857*/NULL/* C997 */,/*24858*/NULL/* C998 */,/*24859*/NULL/* C999 */, /*24860*/NULL/* C99A */,/*24861*/NULL/* C99B */,/*24862*/NULL/* C99C */,/*24863*/NULL/* C99D */,/*24864*/NULL/* C99E */, /*24865*/NULL/* C99F */,/*24866*/NULL/* C9A0 */,/*24867*/NULL/* C9A1 */,/*24868*/""/* C9A2 */, /*24869*/NULL/* C9A3 */,/*24870*/""/* C9A4 */,/*24871*/""/* C9A5 */, /*24872*/NULL/* C9A6 */,/*24873*/NULL/* C9A7 */,/*24874*/NULL/* C9A8 */,/*24875*/NULL/* C9A9 */,/*24876*/NULL/* C9AA */, /*24877*/NULL/* C9AB */,/*24878*/NULL/* C9AC */,/*24879*/NULL/* C9AD */,/*24880*/NULL/* C9AE */,/*24881*/NULL/* C9AF */, /*24882*/NULL/* C9B0 */,/*24883*/NULL/* C9B1 */,/*24884*/NULL/* C9B2 */,/*24885*/NULL/* C9B3 */,/*24886*/NULL/* C9B4 */, /*24887*/NULL/* C9B5 */,/*24888*/NULL/* C9B6 */,/*24889*/NULL/* C9B7 */,/*24890*/NULL/* C9B8 */,/*24891*/NULL/* C9B9 */, /*24892*/NULL/* C9BA */,/*24893*/NULL/* C9BB */,/*24894*/NULL/* C9BC */,/*24895*/NULL/* C9BD */, /*24896*/""/* C9BE */,/*24897*/NULL/* C9BF */,/*24898*/""/* C9C0 */, /*24899*/""/* C9C1 */,/*24900*/NULL/* C9C2 */,/*24901*/NULL/* C9C3 */,/*24902*/NULL/* C9C4 */, /*24903*/NULL/* C9C5 */,/*24904*/NULL/* C9C6 */,/*24905*/NULL/* C9C7 */,/*24906*/NULL/* C9C8 */,/*24907*/NULL/* C9C9 */, /*24908*/NULL/* C9CA */,/*24909*/NULL/* C9CB */,/*24910*/NULL/* C9CC */,/*24911*/NULL/* C9CD */,/*24912*/NULL/* C9CE */, /*24913*/NULL/* C9CF */,/*24914*/NULL/* C9D0 */,/*24915*/NULL/* C9D1 */,/*24916*/NULL/* C9D2 */,/*24917*/NULL/* C9D3 */, /*24918*/NULL/* C9D4 */,/*24919*/NULL/* C9D5 */,/*24920*/NULL/* C9D6 */,/*24921*/NULL/* C9D7 */,/*24922*/NULL/* C9D8 */, /*24923*/NULL/* C9D9 */,/*24924*/""/* C9DA */,/*24925*/NULL/* C9DB */, /*24926*/""/* C9DC */,/*24927*/""/* C9DD */,/*24928*/NULL/* C9DE */, /*24929*/NULL/* C9DF */,/*24930*/NULL/* C9E0 */,/*24931*/NULL/* C9E1 */,/*24932*/NULL/* C9E2 */,/*24933*/NULL/* C9E3 */, /*24934*/NULL/* C9E4 */,/*24935*/NULL/* C9E5 */,/*24936*/NULL/* C9E6 */,/*24937*/NULL/* C9E7 */,/*24938*/NULL/* C9E8 */, /*24939*/NULL/* C9E9 */,/*24940*/NULL/* C9EA */,/*24941*/NULL/* C9EB */,/*24942*/NULL/* C9EC */,/*24943*/NULL/* C9ED */, /*24944*/NULL/* C9EE */,/*24945*/NULL/* C9EF */,/*24946*/NULL/* C9F0 */,/*24947*/NULL/* C9F1 */,/*24948*/NULL/* C9F2 */, /*24949*/NULL/* C9F3 */,/*24950*/NULL/* C9F4 */,/*24951*/NULL/* C9F5 */,/*24952*/""/* C9F6 */, /*24953*/NULL/* C9F7 */,/*24954*/""/* C9F8 */,/*24955*/""/* C9F9 */, /*24956*/NULL/* C9FA */,/*24957*/NULL/* C9FB */,/*24958*/NULL/* C9FC */,/*24959*/NULL/* C9FD */,/*24960*/NULL/* C9FE */, /*24961*/NULL/* C9FF */,/*24962*/NULL/* CA00 */,/*24963*/NULL/* CA01 */,/*24964*/NULL/* CA02 */,/*24965*/NULL/* CA03 */, /*24966*/NULL/* CA04 */,/*24967*/NULL/* CA05 */,/*24968*/NULL/* CA06 */,/*24969*/NULL/* CA07 */,/*24970*/NULL/* CA08 */, /*24971*/NULL/* CA09 */,/*24972*/NULL/* CA0A */,/*24973*/NULL/* CA0B */,/*24974*/NULL/* CA0C */,/*24975*/NULL/* CA0D */, /*24976*/NULL/* CA0E */,/*24977*/NULL/* CA0F */,/*24978*/NULL/* CA10 */,/*24979*/NULL/* CA11 */, /*24980*/""/* CA12 */,/*24981*/NULL/* CA13 */,/*24982*/""/* CA14 */, /*24983*/""/* CA15 */,/*24984*/NULL/* CA16 */,/*24985*/NULL/* CA17 */,/*24986*/NULL/* CA18 */, /*24987*/NULL/* CA19 */,/*24988*/NULL/* CA1A */,/*24989*/NULL/* CA1B */,/*24990*/NULL/* CA1C */,/*24991*/NULL/* CA1D */, /*24992*/NULL/* CA1E */,/*24993*/NULL/* CA1F */,/*24994*/NULL/* CA20 */,/*24995*/NULL/* CA21 */,/*24996*/NULL/* CA22 */, /*24997*/NULL/* CA23 */,/*24998*/NULL/* CA24 */,/*24999*/NULL/* CA25 */,/*25000*/NULL/* CA26 */,/*25001*/NULL/* CA27 */, /*25002*/NULL/* CA28 */,/*25003*/NULL/* CA29 */,/*25004*/NULL/* CA2A */,/*25005*/NULL/* CA2B */,/*25006*/NULL/* CA2C */, /*25007*/NULL/* CA2D */,/*25008*/""/* CA2E */,/*25009*/NULL/* CA2F */, /*25010*/""/* CA30 */,/*25011*/""/* CA31 */,/*25012*/NULL/* CA32 */, /*25013*/NULL/* CA33 */,/*25014*/NULL/* CA34 */,/*25015*/NULL/* CA35 */,/*25016*/NULL/* CA36 */,/*25017*/NULL/* CA37 */, /*25018*/NULL/* CA38 */,/*25019*/NULL/* CA39 */,/*25020*/NULL/* CA3A */,/*25021*/NULL/* CA3B */,/*25022*/NULL/* CA3C */, /*25023*/NULL/* CA3D */,/*25024*/NULL/* CA3E */,/*25025*/NULL/* CA3F */,/*25026*/NULL/* CA40 */,/*25027*/NULL/* CA41 */, /*25028*/NULL/* CA42 */,/*25029*/NULL/* CA43 */,/*25030*/NULL/* CA44 */,/*25031*/NULL/* CA45 */,/*25032*/NULL/* CA46 */, /*25033*/NULL/* CA47 */,/*25034*/NULL/* CA48 */,/*25035*/NULL/* CA49 */,/*25036*/""/* CA4A */, /*25037*/NULL/* CA4B */,/*25038*/""/* CA4C */,/*25039*/""/* CA4D */, /*25040*/NULL/* CA4E */,/*25041*/NULL/* CA4F */,/*25042*/NULL/* CA50 */,/*25043*/NULL/* CA51 */,/*25044*/NULL/* CA52 */, /*25045*/NULL/* CA53 */,/*25046*/NULL/* CA54 */,/*25047*/NULL/* CA55 */,/*25048*/NULL/* CA56 */,/*25049*/NULL/* CA57 */, /*25050*/NULL/* CA58 */,/*25051*/NULL/* CA59 */,/*25052*/NULL/* CA5A */,/*25053*/NULL/* CA5B */,/*25054*/NULL/* CA5C */, /*25055*/NULL/* CA5D */,/*25056*/NULL/* CA5E */,/*25057*/NULL/* CA5F */,/*25058*/NULL/* CA60 */,/*25059*/NULL/* CA61 */, /*25060*/NULL/* CA62 */,/*25061*/NULL/* CA63 */,/*25062*/NULL/* CA64 */,/*25063*/NULL/* CA65 */, /*25064*/""/* CA66 */,/*25065*/NULL/* CA67 */,/*25066*/""/* CA68 */, /*25067*/""/* CA69 */,/*25068*/NULL/* CA6A */,/*25069*/NULL/* CA6B */,/*25070*/NULL/* CA6C */, /*25071*/NULL/* CA6D */,/*25072*/NULL/* CA6E */,/*25073*/NULL/* CA6F */,/*25074*/NULL/* CA70 */,/*25075*/NULL/* CA71 */, /*25076*/NULL/* CA72 */,/*25077*/NULL/* CA73 */,/*25078*/NULL/* CA74 */,/*25079*/NULL/* CA75 */,/*25080*/NULL/* CA76 */, /*25081*/NULL/* CA77 */,/*25082*/NULL/* CA78 */,/*25083*/NULL/* CA79 */,/*25084*/NULL/* CA7A */,/*25085*/NULL/* CA7B */, /*25086*/NULL/* CA7C */,/*25087*/NULL/* CA7D */,/*25088*/NULL/* CA7E */,/*25089*/NULL/* CA7F */,/*25090*/NULL/* CA80 */, /*25091*/NULL/* CA81 */,/*25092*/""/* CA82 */,/*25093*/NULL/* CA83 */, /*25094*/""/* CA84 */,/*25095*/""/* CA85 */,/*25096*/NULL/* CA86 */, /*25097*/NULL/* CA87 */,/*25098*/NULL/* CA88 */,/*25099*/NULL/* CA89 */,/*25100*/NULL/* CA8A */,/*25101*/NULL/* CA8B */, /*25102*/NULL/* CA8C */,/*25103*/NULL/* CA8D */,/*25104*/NULL/* CA8E */,/*25105*/NULL/* CA8F */,/*25106*/NULL/* CA90 */, /*25107*/NULL/* CA91 */,/*25108*/NULL/* CA92 */,/*25109*/NULL/* CA93 */,/*25110*/NULL/* CA94 */,/*25111*/NULL/* CA95 */, /*25112*/NULL/* CA96 */,/*25113*/NULL/* CA97 */,/*25114*/NULL/* CA98 */,/*25115*/NULL/* CA99 */,/*25116*/NULL/* CA9A */, /*25117*/NULL/* CA9B */,/*25118*/NULL/* CA9C */,/*25119*/NULL/* CA9D */,/*25120*/""/* CA9E */, /*25121*/NULL/* CA9F */,/*25122*/""/* CAA0 */,/*25123*/""/* CAA1 */, /*25124*/NULL/* CAA2 */,/*25125*/NULL/* CAA3 */,/*25126*/NULL/* CAA4 */,/*25127*/NULL/* CAA5 */,/*25128*/NULL/* CAA6 */, /*25129*/NULL/* CAA7 */,/*25130*/NULL/* CAA8 */,/*25131*/NULL/* CAA9 */,/*25132*/NULL/* CAAA */,/*25133*/NULL/* CAAB */, /*25134*/NULL/* CAAC */,/*25135*/NULL/* CAAD */,/*25136*/NULL/* CAAE */,/*25137*/NULL/* CAAF */,/*25138*/NULL/* CAB0 */, /*25139*/NULL/* CAB1 */,/*25140*/NULL/* CAB2 */,/*25141*/NULL/* CAB3 */,/*25142*/NULL/* CAB4 */,/*25143*/NULL/* CAB5 */, /*25144*/NULL/* CAB6 */,/*25145*/NULL/* CAB7 */,/*25146*/NULL/* CAB8 */,/*25147*/NULL/* CAB9 */, /*25148*/""/* CABA */,/*25149*/NULL/* CABB */,/*25150*/""/* CABC */, /*25151*/""/* CABD */,/*25152*/NULL/* CABE */,/*25153*/NULL/* CABF */,/*25154*/NULL/* CAC0 */, /*25155*/NULL/* CAC1 */,/*25156*/NULL/* CAC2 */,/*25157*/NULL/* CAC3 */,/*25158*/NULL/* CAC4 */,/*25159*/NULL/* CAC5 */, /*25160*/NULL/* CAC6 */,/*25161*/NULL/* CAC7 */,/*25162*/NULL/* CAC8 */,/*25163*/NULL/* CAC9 */,/*25164*/NULL/* CACA */, /*25165*/NULL/* CACB */,/*25166*/NULL/* CACC */,/*25167*/NULL/* CACD */,/*25168*/NULL/* CACE */,/*25169*/NULL/* CACF */, /*25170*/NULL/* CAD0 */,/*25171*/NULL/* CAD1 */,/*25172*/NULL/* CAD2 */,/*25173*/NULL/* CAD3 */,/*25174*/NULL/* CAD4 */, /*25175*/NULL/* CAD5 */,/*25176*/""/* CAD6 */,/*25177*/NULL/* CAD7 */, /*25178*/""/* CAD8 */,/*25179*/""/* CAD9 */,/*25180*/NULL/* CADA */, /*25181*/NULL/* CADB */,/*25182*/NULL/* CADC */,/*25183*/NULL/* CADD */,/*25184*/NULL/* CADE */,/*25185*/NULL/* CADF */, /*25186*/NULL/* CAE0 */,/*25187*/NULL/* CAE1 */,/*25188*/NULL/* CAE2 */,/*25189*/NULL/* CAE3 */,/*25190*/NULL/* CAE4 */, /*25191*/NULL/* CAE5 */,/*25192*/NULL/* CAE6 */,/*25193*/NULL/* CAE7 */,/*25194*/NULL/* CAE8 */,/*25195*/NULL/* CAE9 */, /*25196*/NULL/* CAEA */,/*25197*/NULL/* CAEB */,/*25198*/NULL/* CAEC */,/*25199*/NULL/* CAED */,/*25200*/NULL/* CAEE */, /*25201*/NULL/* CAEF */,/*25202*/NULL/* CAF0 */,/*25203*/NULL/* CAF1 */,/*25204*/""/* CAF2 */, /*25205*/NULL/* CAF3 */,/*25206*/""/* CAF4 */,/*25207*/""/* CAF5 */, /*25208*/NULL/* CAF6 */,/*25209*/NULL/* CAF7 */,/*25210*/NULL/* CAF8 */,/*25211*/NULL/* CAF9 */,/*25212*/NULL/* CAFA */, /*25213*/NULL/* CAFB */,/*25214*/NULL/* CAFC */,/*25215*/NULL/* CAFD */,/*25216*/NULL/* CAFE */,/*25217*/NULL/* CAFF */, /*25218*/NULL/* CB00 */,/*25219*/NULL/* CB01 */,/*25220*/NULL/* CB02 */,/*25221*/NULL/* CB03 */,/*25222*/NULL/* CB04 */, /*25223*/NULL/* CB05 */,/*25224*/NULL/* CB06 */,/*25225*/NULL/* CB07 */,/*25226*/NULL/* CB08 */,/*25227*/NULL/* CB09 */, /*25228*/NULL/* CB0A */,/*25229*/NULL/* CB0B */,/*25230*/NULL/* CB0C */,/*25231*/NULL/* CB0D */, /*25232*/""/* CB0E */,/*25233*/NULL/* CB0F */,/*25234*/""/* CB10 */, /*25235*/""/* CB11 */,/*25236*/NULL/* CB12 */,/*25237*/NULL/* CB13 */,/*25238*/NULL/* CB14 */, /*25239*/NULL/* CB15 */,/*25240*/NULL/* CB16 */,/*25241*/NULL/* CB17 */,/*25242*/NULL/* CB18 */,/*25243*/NULL/* CB19 */, /*25244*/NULL/* CB1A */,/*25245*/NULL/* CB1B */,/*25246*/NULL/* CB1C */,/*25247*/NULL/* CB1D */,/*25248*/NULL/* CB1E */, /*25249*/NULL/* CB1F */,/*25250*/NULL/* CB20 */,/*25251*/NULL/* CB21 */,/*25252*/NULL/* CB22 */,/*25253*/NULL/* CB23 */, /*25254*/NULL/* CB24 */,/*25255*/NULL/* CB25 */,/*25256*/NULL/* CB26 */,/*25257*/NULL/* CB27 */,/*25258*/NULL/* CB28 */, /*25259*/NULL/* CB29 */,/*25260*/""/* CB2A */,/*25261*/NULL/* CB2B */, /*25262*/""/* CB2C */,/*25263*/""/* CB2D */,/*25264*/NULL/* CB2E */, /*25265*/NULL/* CB2F */,/*25266*/NULL/* CB30 */,/*25267*/NULL/* CB31 */,/*25268*/NULL/* CB32 */,/*25269*/NULL/* CB33 */, /*25270*/NULL/* CB34 */,/*25271*/NULL/* CB35 */,/*25272*/NULL/* CB36 */,/*25273*/NULL/* CB37 */,/*25274*/NULL/* CB38 */, /*25275*/NULL/* CB39 */,/*25276*/NULL/* CB3A */,/*25277*/NULL/* CB3B */,/*25278*/NULL/* CB3C */,/*25279*/NULL/* CB3D */, /*25280*/NULL/* CB3E */,/*25281*/NULL/* CB3F */,/*25282*/NULL/* CB40 */,/*25283*/NULL/* CB41 */,/*25284*/NULL/* CB42 */, /*25285*/NULL/* CB43 */,/*25286*/NULL/* CB44 */,/*25287*/NULL/* CB45 */,/*25288*/""/* CB46 */, /*25289*/NULL/* CB47 */,/*25290*/""/* CB48 */,/*25291*/""/* CB49 */, /*25292*/NULL/* CB4A */,/*25293*/NULL/* CB4B */,/*25294*/NULL/* CB4C */,/*25295*/NULL/* CB4D */,/*25296*/NULL/* CB4E */, /*25297*/NULL/* CB4F */,/*25298*/NULL/* CB50 */,/*25299*/NULL/* CB51 */,/*25300*/NULL/* CB52 */,/*25301*/NULL/* CB53 */, /*25302*/NULL/* CB54 */,/*25303*/NULL/* CB55 */,/*25304*/NULL/* CB56 */,/*25305*/NULL/* CB57 */,/*25306*/NULL/* CB58 */, /*25307*/NULL/* CB59 */,/*25308*/NULL/* CB5A */,/*25309*/NULL/* CB5B */,/*25310*/NULL/* CB5C */,/*25311*/NULL/* CB5D */, /*25312*/NULL/* CB5E */,/*25313*/NULL/* CB5F */,/*25314*/NULL/* CB60 */,/*25315*/NULL/* CB61 */, /*25316*/""/* CB62 */,/*25317*/NULL/* CB63 */,/*25318*/""/* CB64 */, /*25319*/""/* CB65 */,/*25320*/NULL/* CB66 */,/*25321*/NULL/* CB67 */,/*25322*/NULL/* CB68 */, /*25323*/NULL/* CB69 */,/*25324*/NULL/* CB6A */,/*25325*/NULL/* CB6B */,/*25326*/NULL/* CB6C */,/*25327*/NULL/* CB6D */, /*25328*/NULL/* CB6E */,/*25329*/NULL/* CB6F */,/*25330*/NULL/* CB70 */,/*25331*/NULL/* CB71 */,/*25332*/NULL/* CB72 */, /*25333*/NULL/* CB73 */,/*25334*/NULL/* CB74 */,/*25335*/NULL/* CB75 */,/*25336*/NULL/* CB76 */,/*25337*/NULL/* CB77 */, /*25338*/NULL/* CB78 */,/*25339*/NULL/* CB79 */,/*25340*/NULL/* CB7A */,/*25341*/NULL/* CB7B */,/*25342*/NULL/* CB7C */, /*25343*/NULL/* CB7D */,/*25344*/""/* CB7E */,/*25345*/NULL/* CB7F */, /*25346*/""/* CB80 */,/*25347*/""/* CB81 */,/*25348*/NULL/* CB82 */, /*25349*/NULL/* CB83 */,/*25350*/NULL/* CB84 */,/*25351*/NULL/* CB85 */,/*25352*/NULL/* CB86 */,/*25353*/NULL/* CB87 */, /*25354*/NULL/* CB88 */,/*25355*/NULL/* CB89 */,/*25356*/NULL/* CB8A */,/*25357*/NULL/* CB8B */,/*25358*/NULL/* CB8C */, /*25359*/NULL/* CB8D */,/*25360*/NULL/* CB8E */,/*25361*/NULL/* CB8F */,/*25362*/NULL/* CB90 */,/*25363*/NULL/* CB91 */, /*25364*/NULL/* CB92 */,/*25365*/NULL/* CB93 */,/*25366*/NULL/* CB94 */,/*25367*/NULL/* CB95 */,/*25368*/NULL/* CB96 */, /*25369*/NULL/* CB97 */,/*25370*/NULL/* CB98 */,/*25371*/NULL/* CB99 */,/*25372*/""/* CB9A */, /*25373*/NULL/* CB9B */,/*25374*/""/* CB9C */,/*25375*/""/* CB9D */, /*25376*/NULL/* CB9E */,/*25377*/NULL/* CB9F */,/*25378*/NULL/* CBA0 */,/*25379*/NULL/* CBA1 */,/*25380*/NULL/* CBA2 */, /*25381*/NULL/* CBA3 */,/*25382*/NULL/* CBA4 */,/*25383*/NULL/* CBA5 */,/*25384*/NULL/* CBA6 */,/*25385*/NULL/* CBA7 */, /*25386*/NULL/* CBA8 */,/*25387*/NULL/* CBA9 */,/*25388*/NULL/* CBAA */,/*25389*/NULL/* CBAB */,/*25390*/NULL/* CBAC */, /*25391*/NULL/* CBAD */,/*25392*/NULL/* CBAE */,/*25393*/NULL/* CBAF */,/*25394*/NULL/* CBB0 */,/*25395*/NULL/* CBB1 */, /*25396*/NULL/* CBB2 */,/*25397*/NULL/* CBB3 */,/*25398*/NULL/* CBB4 */,/*25399*/NULL/* CBB5 */, /*25400*/""/* CBB6 */,/*25401*/NULL/* CBB7 */,/*25402*/""/* CBB8 */, /*25403*/""/* CBB9 */,/*25404*/NULL/* CBBA */,/*25405*/NULL/* CBBB */,/*25406*/NULL/* CBBC */, /*25407*/NULL/* CBBD */,/*25408*/NULL/* CBBE */,/*25409*/NULL/* CBBF */,/*25410*/NULL/* CBC0 */,/*25411*/NULL/* CBC1 */, /*25412*/NULL/* CBC2 */,/*25413*/NULL/* CBC3 */,/*25414*/NULL/* CBC4 */,/*25415*/NULL/* CBC5 */,/*25416*/NULL/* CBC6 */, /*25417*/NULL/* CBC7 */,/*25418*/NULL/* CBC8 */,/*25419*/NULL/* CBC9 */,/*25420*/NULL/* CBCA */,/*25421*/NULL/* CBCB */, /*25422*/NULL/* CBCC */,/*25423*/NULL/* CBCD */,/*25424*/NULL/* CBCE */,/*25425*/NULL/* CBCF */,/*25426*/NULL/* CBD0 */, /*25427*/NULL/* CBD1 */,/*25428*/""/* CBD2 */,/*25429*/NULL/* CBD3 */, /*25430*/""/* CBD4 */,/*25431*/""/* CBD5 */,/*25432*/NULL/* CBD6 */, /*25433*/NULL/* CBD7 */,/*25434*/NULL/* CBD8 */,/*25435*/NULL/* CBD9 */,/*25436*/NULL/* CBDA */,/*25437*/NULL/* CBDB */, /*25438*/NULL/* CBDC */,/*25439*/NULL/* CBDD */,/*25440*/NULL/* CBDE */,/*25441*/NULL/* CBDF */,/*25442*/NULL/* CBE0 */, /*25443*/NULL/* CBE1 */,/*25444*/NULL/* CBE2 */,/*25445*/NULL/* CBE3 */,/*25446*/NULL/* CBE4 */,/*25447*/NULL/* CBE5 */, /*25448*/NULL/* CBE6 */,/*25449*/NULL/* CBE7 */,/*25450*/NULL/* CBE8 */,/*25451*/NULL/* CBE9 */,/*25452*/NULL/* CBEA */, /*25453*/NULL/* CBEB */,/*25454*/NULL/* CBEC */,/*25455*/NULL/* CBED */,/*25456*/""/* CBEE */, /*25457*/NULL/* CBEF */,/*25458*/""/* CBF0 */,/*25459*/""/* CBF1 */, /*25460*/NULL/* CBF2 */,/*25461*/NULL/* CBF3 */,/*25462*/NULL/* CBF4 */,/*25463*/NULL/* CBF5 */,/*25464*/NULL/* CBF6 */, /*25465*/NULL/* CBF7 */,/*25466*/NULL/* CBF8 */,/*25467*/NULL/* CBF9 */,/*25468*/NULL/* CBFA */,/*25469*/NULL/* CBFB */, /*25470*/NULL/* CBFC */,/*25471*/NULL/* CBFD */,/*25472*/NULL/* CBFE */,/*25473*/NULL/* CBFF */,/*25474*/NULL/* CC00 */, /*25475*/NULL/* CC01 */,/*25476*/NULL/* CC02 */,/*25477*/NULL/* CC03 */,/*25478*/NULL/* CC04 */,/*25479*/NULL/* CC05 */, /*25480*/NULL/* CC06 */,/*25481*/NULL/* CC07 */,/*25482*/NULL/* CC08 */,/*25483*/NULL/* CC09 */, /*25484*/""/* CC0A */,/*25485*/NULL/* CC0B */,/*25486*/""/* CC0C */, /*25487*/""/* CC0D */,/*25488*/NULL/* CC0E */,/*25489*/NULL/* CC0F */,/*25490*/NULL/* CC10 */, /*25491*/NULL/* CC11 */,/*25492*/NULL/* CC12 */,/*25493*/NULL/* CC13 */,/*25494*/NULL/* CC14 */,/*25495*/NULL/* CC15 */, /*25496*/NULL/* CC16 */,/*25497*/NULL/* CC17 */,/*25498*/NULL/* CC18 */,/*25499*/NULL/* CC19 */,/*25500*/NULL/* CC1A */, /*25501*/NULL/* CC1B */,/*25502*/NULL/* CC1C */,/*25503*/NULL/* CC1D */,/*25504*/NULL/* CC1E */,/*25505*/NULL/* CC1F */, /*25506*/NULL/* CC20 */,/*25507*/NULL/* CC21 */,/*25508*/NULL/* CC22 */,/*25509*/NULL/* CC23 */,/*25510*/NULL/* CC24 */, /*25511*/NULL/* CC25 */,/*25512*/""/* CC26 */,/*25513*/NULL/* CC27 */, /*25514*/""/* CC28 */,/*25515*/""/* CC29 */,/*25516*/NULL/* CC2A */, /*25517*/NULL/* CC2B */,/*25518*/NULL/* CC2C */,/*25519*/NULL/* CC2D */,/*25520*/NULL/* CC2E */,/*25521*/NULL/* CC2F */, /*25522*/NULL/* CC30 */,/*25523*/NULL/* CC31 */,/*25524*/NULL/* CC32 */,/*25525*/NULL/* CC33 */,/*25526*/NULL/* CC34 */, /*25527*/NULL/* CC35 */,/*25528*/NULL/* CC36 */,/*25529*/NULL/* CC37 */,/*25530*/NULL/* CC38 */,/*25531*/NULL/* CC39 */, /*25532*/NULL/* CC3A */,/*25533*/NULL/* CC3B */,/*25534*/NULL/* CC3C */,/*25535*/NULL/* CC3D */,/*25536*/NULL/* CC3E */, /*25537*/NULL/* CC3F */,/*25538*/NULL/* CC40 */,/*25539*/NULL/* CC41 */,/*25540*/""/* CC42 */, /*25541*/NULL/* CC43 */,/*25542*/""/* CC44 */,/*25543*/""/* CC45 */, /*25544*/NULL/* CC46 */,/*25545*/NULL/* CC47 */,/*25546*/NULL/* CC48 */,/*25547*/NULL/* CC49 */,/*25548*/NULL/* CC4A */, /*25549*/NULL/* CC4B */,/*25550*/NULL/* CC4C */,/*25551*/NULL/* CC4D */,/*25552*/NULL/* CC4E */,/*25553*/NULL/* CC4F */, /*25554*/NULL/* CC50 */,/*25555*/NULL/* CC51 */,/*25556*/NULL/* CC52 */,/*25557*/NULL/* CC53 */,/*25558*/NULL/* CC54 */, /*25559*/NULL/* CC55 */,/*25560*/NULL/* CC56 */,/*25561*/NULL/* CC57 */,/*25562*/NULL/* CC58 */,/*25563*/NULL/* CC59 */, /*25564*/NULL/* CC5A */,/*25565*/NULL/* CC5B */,/*25566*/NULL/* CC5C */,/*25567*/NULL/* CC5D */, /*25568*/""/* CC5E */,/*25569*/NULL/* CC5F */,/*25570*/""/* CC60 */, /*25571*/""/* CC61 */,/*25572*/NULL/* CC62 */,/*25573*/NULL/* CC63 */,/*25574*/NULL/* CC64 */, /*25575*/NULL/* CC65 */,/*25576*/NULL/* CC66 */,/*25577*/NULL/* CC67 */,/*25578*/NULL/* CC68 */,/*25579*/NULL/* CC69 */, /*25580*/NULL/* CC6A */,/*25581*/NULL/* CC6B */,/*25582*/NULL/* CC6C */,/*25583*/NULL/* CC6D */,/*25584*/NULL/* CC6E */, /*25585*/NULL/* CC6F */,/*25586*/NULL/* CC70 */,/*25587*/NULL/* CC71 */,/*25588*/NULL/* CC72 */,/*25589*/NULL/* CC73 */, /*25590*/NULL/* CC74 */,/*25591*/NULL/* CC75 */,/*25592*/NULL/* CC76 */,/*25593*/NULL/* CC77 */,/*25594*/NULL/* CC78 */, /*25595*/NULL/* CC79 */,/*25596*/""/* CC7A */,/*25597*/NULL/* CC7B */, /*25598*/""/* CC7C */,/*25599*/""/* CC7D */,/*25600*/NULL/* CC7E */, /*25601*/NULL/* CC7F */,/*25602*/NULL/* CC80 */,/*25603*/NULL/* CC81 */,/*25604*/NULL/* CC82 */,/*25605*/NULL/* CC83 */, /*25606*/NULL/* CC84 */,/*25607*/NULL/* CC85 */,/*25608*/NULL/* CC86 */,/*25609*/NULL/* CC87 */,/*25610*/NULL/* CC88 */, /*25611*/NULL/* CC89 */,/*25612*/NULL/* CC8A */,/*25613*/NULL/* CC8B */,/*25614*/NULL/* CC8C */,/*25615*/NULL/* CC8D */, /*25616*/NULL/* CC8E */,/*25617*/NULL/* CC8F */,/*25618*/NULL/* CC90 */,/*25619*/NULL/* CC91 */,/*25620*/NULL/* CC92 */, /*25621*/NULL/* CC93 */,/*25622*/NULL/* CC94 */,/*25623*/NULL/* CC95 */,/*25624*/""/* CC96 */, /*25625*/NULL/* CC97 */,/*25626*/""/* CC98 */,/*25627*/""/* CC99 */, /*25628*/NULL/* CC9A */,/*25629*/NULL/* CC9B */,/*25630*/NULL/* CC9C */,/*25631*/NULL/* CC9D */,/*25632*/NULL/* CC9E */, /*25633*/NULL/* CC9F */,/*25634*/NULL/* CCA0 */,/*25635*/NULL/* CCA1 */,/*25636*/NULL/* CCA2 */,/*25637*/NULL/* CCA3 */, /*25638*/NULL/* CCA4 */,/*25639*/NULL/* CCA5 */,/*25640*/NULL/* CCA6 */,/*25641*/NULL/* CCA7 */,/*25642*/NULL/* CCA8 */, /*25643*/NULL/* CCA9 */,/*25644*/NULL/* CCAA */,/*25645*/NULL/* CCAB */,/*25646*/NULL/* CCAC */,/*25647*/NULL/* CCAD */, /*25648*/NULL/* CCAE */,/*25649*/NULL/* CCAF */,/*25650*/NULL/* CCB0 */,/*25651*/NULL/* CCB1 */, /*25652*/""/* CCB2 */,/*25653*/NULL/* CCB3 */,/*25654*/""/* CCB4 */, /*25655*/""/* CCB5 */,/*25656*/NULL/* CCB6 */,/*25657*/NULL/* CCB7 */,/*25658*/NULL/* CCB8 */, /*25659*/NULL/* CCB9 */,/*25660*/NULL/* CCBA */,/*25661*/NULL/* CCBB */,/*25662*/NULL/* CCBC */,/*25663*/NULL/* CCBD */, /*25664*/NULL/* CCBE */,/*25665*/NULL/* CCBF */,/*25666*/NULL/* CCC0 */,/*25667*/NULL/* CCC1 */,/*25668*/NULL/* CCC2 */, /*25669*/NULL/* CCC3 */,/*25670*/NULL/* CCC4 */,/*25671*/NULL/* CCC5 */,/*25672*/NULL/* CCC6 */,/*25673*/NULL/* CCC7 */, /*25674*/NULL/* CCC8 */,/*25675*/NULL/* CCC9 */,/*25676*/NULL/* CCCA */,/*25677*/NULL/* CCCB */,/*25678*/NULL/* CCCC */, /*25679*/NULL/* CCCD */,/*25680*/""/* CCCE */,/*25681*/NULL/* CCCF */, /*25682*/""/* CCD0 */,/*25683*/""/* CCD1 */,/*25684*/NULL/* CCD2 */, /*25685*/NULL/* CCD3 */,/*25686*/NULL/* CCD4 */,/*25687*/NULL/* CCD5 */,/*25688*/NULL/* CCD6 */,/*25689*/NULL/* CCD7 */, /*25690*/NULL/* CCD8 */,/*25691*/NULL/* CCD9 */,/*25692*/NULL/* CCDA */,/*25693*/NULL/* CCDB */,/*25694*/NULL/* CCDC */, /*25695*/NULL/* CCDD */,/*25696*/NULL/* CCDE */,/*25697*/NULL/* CCDF */,/*25698*/NULL/* CCE0 */,/*25699*/NULL/* CCE1 */, /*25700*/NULL/* CCE2 */,/*25701*/NULL/* CCE3 */,/*25702*/NULL/* CCE4 */,/*25703*/NULL/* CCE5 */,/*25704*/NULL/* CCE6 */, /*25705*/NULL/* CCE7 */,/*25706*/NULL/* CCE8 */,/*25707*/NULL/* CCE9 */,/*25708*/""/* CCEA */, /*25709*/NULL/* CCEB */,/*25710*/""/* CCEC */,/*25711*/""/* CCED */, /*25712*/NULL/* CCEE */,/*25713*/NULL/* CCEF */,/*25714*/NULL/* CCF0 */,/*25715*/NULL/* CCF1 */,/*25716*/NULL/* CCF2 */, /*25717*/NULL/* CCF3 */,/*25718*/NULL/* CCF4 */,/*25719*/NULL/* CCF5 */,/*25720*/NULL/* CCF6 */,/*25721*/NULL/* CCF7 */, /*25722*/NULL/* CCF8 */,/*25723*/NULL/* CCF9 */,/*25724*/NULL/* CCFA */,/*25725*/NULL/* CCFB */,/*25726*/NULL/* CCFC */, /*25727*/NULL/* CCFD */,/*25728*/NULL/* CCFE */,/*25729*/NULL/* CCFF */,/*25730*/NULL/* CD00 */,/*25731*/NULL/* CD01 */, /*25732*/NULL/* CD02 */,/*25733*/NULL/* CD03 */,/*25734*/NULL/* CD04 */,/*25735*/NULL/* CD05 */, /*25736*/""/* CD06 */,/*25737*/NULL/* CD07 */,/*25738*/""/* CD08 */, /*25739*/""/* CD09 */,/*25740*/NULL/* CD0A */,/*25741*/NULL/* CD0B */,/*25742*/NULL/* CD0C */, /*25743*/NULL/* CD0D */,/*25744*/NULL/* CD0E */,/*25745*/NULL/* CD0F */,/*25746*/NULL/* CD10 */,/*25747*/NULL/* CD11 */, /*25748*/NULL/* CD12 */,/*25749*/NULL/* CD13 */,/*25750*/NULL/* CD14 */,/*25751*/NULL/* CD15 */,/*25752*/NULL/* CD16 */, /*25753*/NULL/* CD17 */,/*25754*/NULL/* CD18 */,/*25755*/NULL/* CD19 */,/*25756*/NULL/* CD1A */,/*25757*/NULL/* CD1B */, /*25758*/NULL/* CD1C */,/*25759*/NULL/* CD1D */,/*25760*/NULL/* CD1E */,/*25761*/NULL/* CD1F */,/*25762*/NULL/* CD20 */, /*25763*/NULL/* CD21 */,/*25764*/""/* CD22 */,/*25765*/NULL/* CD23 */, /*25766*/""/* CD24 */,/*25767*/""/* CD25 */,/*25768*/NULL/* CD26 */, /*25769*/NULL/* CD27 */,/*25770*/NULL/* CD28 */,/*25771*/NULL/* CD29 */,/*25772*/NULL/* CD2A */,/*25773*/NULL/* CD2B */, /*25774*/NULL/* CD2C */,/*25775*/NULL/* CD2D */,/*25776*/NULL/* CD2E */,/*25777*/NULL/* CD2F */,/*25778*/NULL/* CD30 */, /*25779*/NULL/* CD31 */,/*25780*/NULL/* CD32 */,/*25781*/NULL/* CD33 */,/*25782*/NULL/* CD34 */,/*25783*/NULL/* CD35 */, /*25784*/NULL/* CD36 */,/*25785*/NULL/* CD37 */,/*25786*/NULL/* CD38 */,/*25787*/NULL/* CD39 */,/*25788*/NULL/* CD3A */, /*25789*/NULL/* CD3B */,/*25790*/NULL/* CD3C */,/*25791*/NULL/* CD3D */,/*25792*/""/* CD3E */, /*25793*/NULL/* CD3F */,/*25794*/""/* CD40 */,/*25795*/""/* CD41 */, /*25796*/NULL/* CD42 */,/*25797*/NULL/* CD43 */,/*25798*/NULL/* CD44 */,/*25799*/NULL/* CD45 */,/*25800*/NULL/* CD46 */, /*25801*/NULL/* CD47 */,/*25802*/NULL/* CD48 */,/*25803*/NULL/* CD49 */,/*25804*/NULL/* CD4A */,/*25805*/NULL/* CD4B */, /*25806*/NULL/* CD4C */,/*25807*/NULL/* CD4D */,/*25808*/NULL/* CD4E */,/*25809*/NULL/* CD4F */,/*25810*/NULL/* CD50 */, /*25811*/NULL/* CD51 */,/*25812*/NULL/* CD52 */,/*25813*/NULL/* CD53 */,/*25814*/NULL/* CD54 */,/*25815*/NULL/* CD55 */, /*25816*/NULL/* CD56 */,/*25817*/NULL/* CD57 */,/*25818*/NULL/* CD58 */,/*25819*/NULL/* CD59 */, /*25820*/""/* CD5A */,/*25821*/NULL/* CD5B */,/*25822*/""/* CD5C */, /*25823*/""/* CD5D */,/*25824*/NULL/* CD5E */,/*25825*/NULL/* CD5F */,/*25826*/NULL/* CD60 */, /*25827*/NULL/* CD61 */,/*25828*/NULL/* CD62 */,/*25829*/NULL/* CD63 */,/*25830*/NULL/* CD64 */,/*25831*/NULL/* CD65 */, /*25832*/NULL/* CD66 */,/*25833*/NULL/* CD67 */,/*25834*/NULL/* CD68 */,/*25835*/NULL/* CD69 */,/*25836*/NULL/* CD6A */, /*25837*/NULL/* CD6B */,/*25838*/NULL/* CD6C */,/*25839*/NULL/* CD6D */,/*25840*/NULL/* CD6E */,/*25841*/NULL/* CD6F */, /*25842*/NULL/* CD70 */,/*25843*/NULL/* CD71 */,/*25844*/NULL/* CD72 */,/*25845*/NULL/* CD73 */,/*25846*/NULL/* CD74 */, /*25847*/NULL/* CD75 */,/*25848*/""/* CD76 */,/*25849*/NULL/* CD77 */, /*25850*/""/* CD78 */,/*25851*/""/* CD79 */,/*25852*/NULL/* CD7A */, /*25853*/NULL/* CD7B */,/*25854*/NULL/* CD7C */,/*25855*/NULL/* CD7D */,/*25856*/NULL/* CD7E */,/*25857*/NULL/* CD7F */, /*25858*/NULL/* CD80 */,/*25859*/NULL/* CD81 */,/*25860*/NULL/* CD82 */,/*25861*/NULL/* CD83 */,/*25862*/NULL/* CD84 */, /*25863*/NULL/* CD85 */,/*25864*/NULL/* CD86 */,/*25865*/NULL/* CD87 */,/*25866*/NULL/* CD88 */,/*25867*/NULL/* CD89 */, /*25868*/NULL/* CD8A */,/*25869*/NULL/* CD8B */,/*25870*/NULL/* CD8C */,/*25871*/NULL/* CD8D */,/*25872*/NULL/* CD8E */, /*25873*/NULL/* CD8F */,/*25874*/NULL/* CD90 */,/*25875*/NULL/* CD91 */,/*25876*/""/* CD92 */, /*25877*/NULL/* CD93 */,/*25878*/""/* CD94 */,/*25879*/""/* CD95 */, /*25880*/NULL/* CD96 */,/*25881*/NULL/* CD97 */,/*25882*/NULL/* CD98 */,/*25883*/NULL/* CD99 */,/*25884*/NULL/* CD9A */, /*25885*/NULL/* CD9B */,/*25886*/NULL/* CD9C */,/*25887*/NULL/* CD9D */,/*25888*/NULL/* CD9E */,/*25889*/NULL/* CD9F */, /*25890*/NULL/* CDA0 */,/*25891*/NULL/* CDA1 */,/*25892*/NULL/* CDA2 */,/*25893*/NULL/* CDA3 */,/*25894*/NULL/* CDA4 */, /*25895*/NULL/* CDA5 */,/*25896*/NULL/* CDA6 */,/*25897*/NULL/* CDA7 */,/*25898*/NULL/* CDA8 */,/*25899*/NULL/* CDA9 */, /*25900*/NULL/* CDAA */,/*25901*/NULL/* CDAB */,/*25902*/NULL/* CDAC */,/*25903*/NULL/* CDAD */, /*25904*/""/* CDAE */,/*25905*/NULL/* CDAF */,/*25906*/""/* CDB0 */, /*25907*/""/* CDB1 */,/*25908*/NULL/* CDB2 */,/*25909*/NULL/* CDB3 */,/*25910*/NULL/* CDB4 */, /*25911*/NULL/* CDB5 */,/*25912*/NULL/* CDB6 */,/*25913*/NULL/* CDB7 */,/*25914*/NULL/* CDB8 */,/*25915*/NULL/* CDB9 */, /*25916*/NULL/* CDBA */,/*25917*/NULL/* CDBB */,/*25918*/NULL/* CDBC */,/*25919*/NULL/* CDBD */,/*25920*/NULL/* CDBE */, /*25921*/NULL/* CDBF */,/*25922*/NULL/* CDC0 */,/*25923*/NULL/* CDC1 */,/*25924*/NULL/* CDC2 */,/*25925*/NULL/* CDC3 */, /*25926*/NULL/* CDC4 */,/*25927*/NULL/* CDC5 */,/*25928*/NULL/* CDC6 */,/*25929*/NULL/* CDC7 */,/*25930*/NULL/* CDC8 */, /*25931*/NULL/* CDC9 */,/*25932*/""/* CDCA */,/*25933*/NULL/* CDCB */, /*25934*/""/* CDCC */,/*25935*/""/* CDCD */,/*25936*/NULL/* CDCE */, /*25937*/NULL/* CDCF */,/*25938*/NULL/* CDD0 */,/*25939*/NULL/* CDD1 */,/*25940*/NULL/* CDD2 */,/*25941*/NULL/* CDD3 */, /*25942*/NULL/* CDD4 */,/*25943*/NULL/* CDD5 */,/*25944*/NULL/* CDD6 */,/*25945*/NULL/* CDD7 */,/*25946*/NULL/* CDD8 */, /*25947*/NULL/* CDD9 */,/*25948*/NULL/* CDDA */,/*25949*/NULL/* CDDB */,/*25950*/NULL/* CDDC */,/*25951*/NULL/* CDDD */, /*25952*/NULL/* CDDE */,/*25953*/NULL/* CDDF */,/*25954*/NULL/* CDE0 */,/*25955*/NULL/* CDE1 */,/*25956*/NULL/* CDE2 */, /*25957*/NULL/* CDE3 */,/*25958*/NULL/* CDE4 */,/*25959*/NULL/* CDE5 */,/*25960*/""/* CDE6 */, /*25961*/NULL/* CDE7 */,/*25962*/""/* CDE8 */,/*25963*/""/* CDE9 */, /*25964*/NULL/* CDEA */,/*25965*/NULL/* CDEB */,/*25966*/NULL/* CDEC */,/*25967*/NULL/* CDED */,/*25968*/NULL/* CDEE */, /*25969*/NULL/* CDEF */,/*25970*/NULL/* CDF0 */,/*25971*/NULL/* CDF1 */,/*25972*/NULL/* CDF2 */,/*25973*/NULL/* CDF3 */, /*25974*/NULL/* CDF4 */,/*25975*/NULL/* CDF5 */,/*25976*/NULL/* CDF6 */,/*25977*/NULL/* CDF7 */,/*25978*/NULL/* CDF8 */, /*25979*/NULL/* CDF9 */,/*25980*/NULL/* CDFA */,/*25981*/NULL/* CDFB */,/*25982*/NULL/* CDFC */,/*25983*/NULL/* CDFD */, /*25984*/NULL/* CDFE */,/*25985*/NULL/* CDFF */,/*25986*/NULL/* CE00 */,/*25987*/NULL/* CE01 */, /*25988*/""/* CE02 */,/*25989*/NULL/* CE03 */,/*25990*/""/* CE04 */, /*25991*/""/* CE05 */,/*25992*/NULL/* CE06 */,/*25993*/NULL/* CE07 */,/*25994*/NULL/* CE08 */, /*25995*/NULL/* CE09 */,/*25996*/NULL/* CE0A */,/*25997*/NULL/* CE0B */,/*25998*/NULL/* CE0C */,/*25999*/NULL/* CE0D */, /*26000*/NULL/* CE0E */,/*26001*/NULL/* CE0F */,/*26002*/NULL/* CE10 */,/*26003*/NULL/* CE11 */,/*26004*/NULL/* CE12 */, /*26005*/NULL/* CE13 */,/*26006*/NULL/* CE14 */,/*26007*/NULL/* CE15 */,/*26008*/NULL/* CE16 */,/*26009*/NULL/* CE17 */, /*26010*/NULL/* CE18 */,/*26011*/NULL/* CE19 */,/*26012*/NULL/* CE1A */,/*26013*/NULL/* CE1B */,/*26014*/NULL/* CE1C */, /*26015*/NULL/* CE1D */,/*26016*/""/* CE1E */,/*26017*/NULL/* CE1F */, /*26018*/""/* CE20 */,/*26019*/""/* CE21 */,/*26020*/NULL/* CE22 */, /*26021*/NULL/* CE23 */,/*26022*/NULL/* CE24 */,/*26023*/NULL/* CE25 */,/*26024*/NULL/* CE26 */,/*26025*/NULL/* CE27 */, /*26026*/NULL/* CE28 */,/*26027*/NULL/* CE29 */,/*26028*/NULL/* CE2A */,/*26029*/NULL/* CE2B */,/*26030*/NULL/* CE2C */, /*26031*/NULL/* CE2D */,/*26032*/NULL/* CE2E */,/*26033*/NULL/* CE2F */,/*26034*/NULL/* CE30 */,/*26035*/NULL/* CE31 */, /*26036*/NULL/* CE32 */,/*26037*/NULL/* CE33 */,/*26038*/NULL/* CE34 */,/*26039*/NULL/* CE35 */,/*26040*/NULL/* CE36 */, /*26041*/NULL/* CE37 */,/*26042*/NULL/* CE38 */,/*26043*/NULL/* CE39 */,/*26044*/""/* CE3A */, /*26045*/NULL/* CE3B */,/*26046*/""/* CE3C */,/*26047*/""/* CE3D */, /*26048*/NULL/* CE3E */,/*26049*/NULL/* CE3F */,/*26050*/NULL/* CE40 */,/*26051*/NULL/* CE41 */,/*26052*/NULL/* CE42 */, /*26053*/NULL/* CE43 */,/*26054*/NULL/* CE44 */,/*26055*/NULL/* CE45 */,/*26056*/NULL/* CE46 */,/*26057*/NULL/* CE47 */, /*26058*/NULL/* CE48 */,/*26059*/NULL/* CE49 */,/*26060*/NULL/* CE4A */,/*26061*/NULL/* CE4B */,/*26062*/NULL/* CE4C */, /*26063*/NULL/* CE4D */,/*26064*/NULL/* CE4E */,/*26065*/NULL/* CE4F */,/*26066*/NULL/* CE50 */,/*26067*/NULL/* CE51 */, /*26068*/NULL/* CE52 */,/*26069*/NULL/* CE53 */,/*26070*/NULL/* CE54 */,/*26071*/NULL/* CE55 */, /*26072*/""/* CE56 */,/*26073*/NULL/* CE57 */,/*26074*/""/* CE58 */, /*26075*/""/* CE59 */,/*26076*/NULL/* CE5A */,/*26077*/NULL/* CE5B */,/*26078*/NULL/* CE5C */, /*26079*/NULL/* CE5D */,/*26080*/NULL/* CE5E */,/*26081*/NULL/* CE5F */,/*26082*/NULL/* CE60 */,/*26083*/NULL/* CE61 */, /*26084*/NULL/* CE62 */,/*26085*/NULL/* CE63 */,/*26086*/NULL/* CE64 */,/*26087*/NULL/* CE65 */,/*26088*/NULL/* CE66 */, /*26089*/NULL/* CE67 */,/*26090*/NULL/* CE68 */,/*26091*/NULL/* CE69 */,/*26092*/NULL/* CE6A */,/*26093*/NULL/* CE6B */, /*26094*/NULL/* CE6C */,/*26095*/NULL/* CE6D */,/*26096*/NULL/* CE6E */,/*26097*/NULL/* CE6F */,/*26098*/NULL/* CE70 */, /*26099*/NULL/* CE71 */,/*26100*/""/* CE72 */,/*26101*/NULL/* CE73 */, /*26102*/""/* CE74 */,/*26103*/""/* CE75 */,/*26104*/NULL/* CE76 */, /*26105*/NULL/* CE77 */,/*26106*/NULL/* CE78 */,/*26107*/NULL/* CE79 */,/*26108*/NULL/* CE7A */,/*26109*/NULL/* CE7B */, /*26110*/NULL/* CE7C */,/*26111*/NULL/* CE7D */,/*26112*/NULL/* CE7E */,/*26113*/NULL/* CE7F */,/*26114*/NULL/* CE80 */, /*26115*/NULL/* CE81 */,/*26116*/NULL/* CE82 */,/*26117*/NULL/* CE83 */,/*26118*/NULL/* CE84 */,/*26119*/NULL/* CE85 */, /*26120*/NULL/* CE86 */,/*26121*/NULL/* CE87 */,/*26122*/NULL/* CE88 */,/*26123*/NULL/* CE89 */,/*26124*/NULL/* CE8A */, /*26125*/NULL/* CE8B */,/*26126*/NULL/* CE8C */,/*26127*/NULL/* CE8D */,/*26128*/""/* CE8E */, /*26129*/NULL/* CE8F */,/*26130*/""/* CE90 */,/*26131*/""/* CE91 */, /*26132*/NULL/* CE92 */,/*26133*/NULL/* CE93 */,/*26134*/NULL/* CE94 */,/*26135*/NULL/* CE95 */,/*26136*/NULL/* CE96 */, /*26137*/NULL/* CE97 */,/*26138*/NULL/* CE98 */,/*26139*/NULL/* CE99 */,/*26140*/NULL/* CE9A */,/*26141*/NULL/* CE9B */, /*26142*/NULL/* CE9C */,/*26143*/NULL/* CE9D */,/*26144*/NULL/* CE9E */,/*26145*/NULL/* CE9F */,/*26146*/NULL/* CEA0 */, /*26147*/NULL/* CEA1 */,/*26148*/NULL/* CEA2 */,/*26149*/NULL/* CEA3 */,/*26150*/NULL/* CEA4 */,/*26151*/NULL/* CEA5 */, /*26152*/NULL/* CEA6 */,/*26153*/NULL/* CEA7 */,/*26154*/NULL/* CEA8 */,/*26155*/NULL/* CEA9 */, /*26156*/""/* CEAA */,/*26157*/NULL/* CEAB */,/*26158*/""/* CEAC */, /*26159*/""/* CEAD */,/*26160*/NULL/* CEAE */,/*26161*/NULL/* CEAF */,/*26162*/NULL/* CEB0 */, /*26163*/NULL/* CEB1 */,/*26164*/NULL/* CEB2 */,/*26165*/NULL/* CEB3 */,/*26166*/NULL/* CEB4 */,/*26167*/NULL/* CEB5 */, /*26168*/NULL/* CEB6 */,/*26169*/NULL/* CEB7 */,/*26170*/NULL/* CEB8 */,/*26171*/NULL/* CEB9 */,/*26172*/NULL/* CEBA */, /*26173*/NULL/* CEBB */,/*26174*/NULL/* CEBC */,/*26175*/NULL/* CEBD */,/*26176*/NULL/* CEBE */,/*26177*/NULL/* CEBF */, /*26178*/NULL/* CEC0 */,/*26179*/NULL/* CEC1 */,/*26180*/NULL/* CEC2 */,/*26181*/NULL/* CEC3 */,/*26182*/NULL/* CEC4 */, /*26183*/NULL/* CEC5 */,/*26184*/""/* CEC6 */,/*26185*/NULL/* CEC7 */, /*26186*/""/* CEC8 */,/*26187*/""/* CEC9 */,/*26188*/NULL/* CECA */, /*26189*/NULL/* CECB */,/*26190*/NULL/* CECC */,/*26191*/NULL/* CECD */,/*26192*/NULL/* CECE */,/*26193*/NULL/* CECF */, /*26194*/NULL/* CED0 */,/*26195*/NULL/* CED1 */,/*26196*/NULL/* CED2 */,/*26197*/NULL/* CED3 */,/*26198*/NULL/* CED4 */, /*26199*/NULL/* CED5 */,/*26200*/NULL/* CED6 */,/*26201*/NULL/* CED7 */,/*26202*/NULL/* CED8 */,/*26203*/NULL/* CED9 */, /*26204*/NULL/* CEDA */,/*26205*/NULL/* CEDB */,/*26206*/NULL/* CEDC */,/*26207*/NULL/* CEDD */,/*26208*/NULL/* CEDE */, /*26209*/NULL/* CEDF */,/*26210*/NULL/* CEE0 */,/*26211*/NULL/* CEE1 */,/*26212*/""/* CEE2 */, /*26213*/NULL/* CEE3 */,/*26214*/""/* CEE4 */,/*26215*/""/* CEE5 */, /*26216*/NULL/* CEE6 */,/*26217*/NULL/* CEE7 */,/*26218*/NULL/* CEE8 */,/*26219*/NULL/* CEE9 */,/*26220*/NULL/* CEEA */, /*26221*/NULL/* CEEB */,/*26222*/NULL/* CEEC */,/*26223*/NULL/* CEED */,/*26224*/NULL/* CEEE */,/*26225*/NULL/* CEEF */, /*26226*/NULL/* CEF0 */,/*26227*/NULL/* CEF1 */,/*26228*/NULL/* CEF2 */,/*26229*/NULL/* CEF3 */,/*26230*/NULL/* CEF4 */, /*26231*/NULL/* CEF5 */,/*26232*/NULL/* CEF6 */,/*26233*/NULL/* CEF7 */,/*26234*/NULL/* CEF8 */,/*26235*/NULL/* CEF9 */, /*26236*/NULL/* CEFA */,/*26237*/NULL/* CEFB */,/*26238*/NULL/* CEFC */,/*26239*/NULL/* CEFD */, /*26240*/""/* CEFE */,/*26241*/NULL/* CEFF */,/*26242*/""/* CF00 */, /*26243*/""/* CF01 */,/*26244*/NULL/* CF02 */,/*26245*/NULL/* CF03 */,/*26246*/NULL/* CF04 */, /*26247*/NULL/* CF05 */,/*26248*/NULL/* CF06 */,/*26249*/NULL/* CF07 */,/*26250*/NULL/* CF08 */,/*26251*/NULL/* CF09 */, /*26252*/NULL/* CF0A */,/*26253*/NULL/* CF0B */,/*26254*/NULL/* CF0C */,/*26255*/NULL/* CF0D */,/*26256*/NULL/* CF0E */, /*26257*/NULL/* CF0F */,/*26258*/NULL/* CF10 */,/*26259*/NULL/* CF11 */,/*26260*/NULL/* CF12 */,/*26261*/NULL/* CF13 */, /*26262*/NULL/* CF14 */,/*26263*/NULL/* CF15 */,/*26264*/NULL/* CF16 */,/*26265*/NULL/* CF17 */,/*26266*/NULL/* CF18 */, /*26267*/NULL/* CF19 */,/*26268*/""/* CF1A */,/*26269*/NULL/* CF1B */, /*26270*/""/* CF1C */,/*26271*/""/* CF1D */,/*26272*/NULL/* CF1E */, /*26273*/NULL/* CF1F */,/*26274*/NULL/* CF20 */,/*26275*/NULL/* CF21 */,/*26276*/NULL/* CF22 */,/*26277*/NULL/* CF23 */, /*26278*/NULL/* CF24 */,/*26279*/NULL/* CF25 */,/*26280*/NULL/* CF26 */,/*26281*/NULL/* CF27 */,/*26282*/NULL/* CF28 */, /*26283*/NULL/* CF29 */,/*26284*/NULL/* CF2A */,/*26285*/NULL/* CF2B */,/*26286*/NULL/* CF2C */,/*26287*/NULL/* CF2D */, /*26288*/NULL/* CF2E */,/*26289*/NULL/* CF2F */,/*26290*/NULL/* CF30 */,/*26291*/NULL/* CF31 */,/*26292*/NULL/* CF32 */, /*26293*/NULL/* CF33 */,/*26294*/NULL/* CF34 */,/*26295*/NULL/* CF35 */,/*26296*/""/* CF36 */, /*26297*/NULL/* CF37 */,/*26298*/""/* CF38 */,/*26299*/""/* CF39 */, /*26300*/NULL/* CF3A */,/*26301*/NULL/* CF3B */,/*26302*/NULL/* CF3C */,/*26303*/NULL/* CF3D */,/*26304*/NULL/* CF3E */, /*26305*/NULL/* CF3F */,/*26306*/NULL/* CF40 */,/*26307*/NULL/* CF41 */,/*26308*/NULL/* CF42 */,/*26309*/NULL/* CF43 */, /*26310*/NULL/* CF44 */,/*26311*/NULL/* CF45 */,/*26312*/NULL/* CF46 */,/*26313*/NULL/* CF47 */,/*26314*/NULL/* CF48 */, /*26315*/NULL/* CF49 */,/*26316*/NULL/* CF4A */,/*26317*/NULL/* CF4B */,/*26318*/NULL/* CF4C */,/*26319*/NULL/* CF4D */, /*26320*/NULL/* CF4E */,/*26321*/NULL/* CF4F */,/*26322*/NULL/* CF50 */,/*26323*/NULL/* CF51 */, /*26324*/""/* CF52 */,/*26325*/NULL/* CF53 */,/*26326*/""/* CF54 */, /*26327*/""/* CF55 */,/*26328*/NULL/* CF56 */,/*26329*/NULL/* CF57 */,/*26330*/NULL/* CF58 */, /*26331*/NULL/* CF59 */,/*26332*/NULL/* CF5A */,/*26333*/NULL/* CF5B */,/*26334*/NULL/* CF5C */,/*26335*/NULL/* CF5D */, /*26336*/NULL/* CF5E */,/*26337*/NULL/* CF5F */,/*26338*/NULL/* CF60 */,/*26339*/NULL/* CF61 */,/*26340*/NULL/* CF62 */, /*26341*/NULL/* CF63 */,/*26342*/NULL/* CF64 */,/*26343*/NULL/* CF65 */,/*26344*/NULL/* CF66 */,/*26345*/NULL/* CF67 */, /*26346*/NULL/* CF68 */,/*26347*/NULL/* CF69 */,/*26348*/NULL/* CF6A */,/*26349*/NULL/* CF6B */,/*26350*/NULL/* CF6C */, /*26351*/NULL/* CF6D */,/*26352*/""/* CF6E */,/*26353*/NULL/* CF6F */, /*26354*/""/* CF70 */,/*26355*/""/* CF71 */,/*26356*/NULL/* CF72 */, /*26357*/NULL/* CF73 */,/*26358*/NULL/* CF74 */,/*26359*/NULL/* CF75 */,/*26360*/NULL/* CF76 */,/*26361*/NULL/* CF77 */, /*26362*/NULL/* CF78 */,/*26363*/NULL/* CF79 */,/*26364*/NULL/* CF7A */,/*26365*/NULL/* CF7B */,/*26366*/NULL/* CF7C */, /*26367*/NULL/* CF7D */,/*26368*/NULL/* CF7E */,/*26369*/NULL/* CF7F */,/*26370*/NULL/* CF80 */,/*26371*/NULL/* CF81 */, /*26372*/NULL/* CF82 */,/*26373*/NULL/* CF83 */,/*26374*/NULL/* CF84 */,/*26375*/NULL/* CF85 */,/*26376*/NULL/* CF86 */, /*26377*/NULL/* CF87 */,/*26378*/NULL/* CF88 */,/*26379*/NULL/* CF89 */,/*26380*/""/* CF8A */, /*26381*/NULL/* CF8B */,/*26382*/""/* CF8C */,/*26383*/""/* CF8D */, /*26384*/NULL/* CF8E */,/*26385*/NULL/* CF8F */,/*26386*/NULL/* CF90 */,/*26387*/NULL/* CF91 */,/*26388*/NULL/* CF92 */, /*26389*/NULL/* CF93 */,/*26390*/NULL/* CF94 */,/*26391*/NULL/* CF95 */,/*26392*/NULL/* CF96 */,/*26393*/NULL/* CF97 */, /*26394*/NULL/* CF98 */,/*26395*/NULL/* CF99 */,/*26396*/NULL/* CF9A */,/*26397*/NULL/* CF9B */,/*26398*/NULL/* CF9C */, /*26399*/NULL/* CF9D */,/*26400*/NULL/* CF9E */,/*26401*/NULL/* CF9F */,/*26402*/NULL/* CFA0 */,/*26403*/NULL/* CFA1 */, /*26404*/NULL/* CFA2 */,/*26405*/NULL/* CFA3 */,/*26406*/NULL/* CFA4 */,/*26407*/NULL/* CFA5 */, /*26408*/""/* CFA6 */,/*26409*/NULL/* CFA7 */,/*26410*/""/* CFA8 */, /*26411*/""/* CFA9 */,/*26412*/NULL/* CFAA */,/*26413*/NULL/* CFAB */,/*26414*/NULL/* CFAC */, /*26415*/NULL/* CFAD */,/*26416*/NULL/* CFAE */,/*26417*/NULL/* CFAF */,/*26418*/NULL/* CFB0 */,/*26419*/NULL/* CFB1 */, /*26420*/NULL/* CFB2 */,/*26421*/NULL/* CFB3 */,/*26422*/NULL/* CFB4 */,/*26423*/NULL/* CFB5 */,/*26424*/NULL/* CFB6 */, /*26425*/NULL/* CFB7 */,/*26426*/NULL/* CFB8 */,/*26427*/NULL/* CFB9 */,/*26428*/NULL/* CFBA */,/*26429*/NULL/* CFBB */, /*26430*/NULL/* CFBC */,/*26431*/NULL/* CFBD */,/*26432*/NULL/* CFBE */,/*26433*/NULL/* CFBF */,/*26434*/NULL/* CFC0 */, /*26435*/NULL/* CFC1 */,/*26436*/""/* CFC2 */,/*26437*/NULL/* CFC3 */, /*26438*/""/* CFC4 */,/*26439*/""/* CFC5 */,/*26440*/NULL/* CFC6 */, /*26441*/NULL/* CFC7 */,/*26442*/NULL/* CFC8 */,/*26443*/NULL/* CFC9 */,/*26444*/NULL/* CFCA */,/*26445*/NULL/* CFCB */, /*26446*/NULL/* CFCC */,/*26447*/NULL/* CFCD */,/*26448*/NULL/* CFCE */,/*26449*/NULL/* CFCF */,/*26450*/NULL/* CFD0 */, /*26451*/NULL/* CFD1 */,/*26452*/NULL/* CFD2 */,/*26453*/NULL/* CFD3 */,/*26454*/NULL/* CFD4 */,/*26455*/NULL/* CFD5 */, /*26456*/NULL/* CFD6 */,/*26457*/NULL/* CFD7 */,/*26458*/NULL/* CFD8 */,/*26459*/NULL/* CFD9 */,/*26460*/NULL/* CFDA */, /*26461*/NULL/* CFDB */,/*26462*/NULL/* CFDC */,/*26463*/NULL/* CFDD */,/*26464*/""/* CFDE */, /*26465*/NULL/* CFDF */,/*26466*/""/* CFE0 */,/*26467*/""/* CFE1 */, /*26468*/NULL/* CFE2 */,/*26469*/NULL/* CFE3 */,/*26470*/NULL/* CFE4 */,/*26471*/NULL/* CFE5 */,/*26472*/NULL/* CFE6 */, /*26473*/NULL/* CFE7 */,/*26474*/NULL/* CFE8 */,/*26475*/NULL/* CFE9 */,/*26476*/NULL/* CFEA */,/*26477*/NULL/* CFEB */, /*26478*/NULL/* CFEC */,/*26479*/NULL/* CFED */,/*26480*/NULL/* CFEE */,/*26481*/NULL/* CFEF */,/*26482*/NULL/* CFF0 */, /*26483*/NULL/* CFF1 */,/*26484*/NULL/* CFF2 */,/*26485*/NULL/* CFF3 */,/*26486*/NULL/* CFF4 */,/*26487*/NULL/* CFF5 */, /*26488*/NULL/* CFF6 */,/*26489*/NULL/* CFF7 */,/*26490*/NULL/* CFF8 */,/*26491*/NULL/* CFF9 */, /*26492*/""/* CFFA */,/*26493*/NULL/* CFFB */,/*26494*/""/* CFFC */, /*26495*/""/* CFFD */,/*26496*/NULL/* CFFE */,/*26497*/NULL/* CFFF */,/*26498*/NULL/* D000 */, /*26499*/NULL/* D001 */,/*26500*/NULL/* D002 */,/*26501*/NULL/* D003 */,/*26502*/NULL/* D004 */,/*26503*/NULL/* D005 */, /*26504*/NULL/* D006 */,/*26505*/NULL/* D007 */,/*26506*/NULL/* D008 */,/*26507*/NULL/* D009 */,/*26508*/NULL/* D00A */, /*26509*/NULL/* D00B */,/*26510*/NULL/* D00C */,/*26511*/NULL/* D00D */,/*26512*/NULL/* D00E */,/*26513*/NULL/* D00F */, /*26514*/NULL/* D010 */,/*26515*/NULL/* D011 */,/*26516*/NULL/* D012 */,/*26517*/NULL/* D013 */,/*26518*/NULL/* D014 */, /*26519*/NULL/* D015 */,/*26520*/""/* D016 */,/*26521*/NULL/* D017 */, /*26522*/""/* D018 */,/*26523*/""/* D019 */,/*26524*/NULL/* D01A */, /*26525*/NULL/* D01B */,/*26526*/NULL/* D01C */,/*26527*/NULL/* D01D */,/*26528*/NULL/* D01E */,/*26529*/NULL/* D01F */, /*26530*/NULL/* D020 */,/*26531*/NULL/* D021 */,/*26532*/NULL/* D022 */,/*26533*/NULL/* D023 */,/*26534*/NULL/* D024 */, /*26535*/NULL/* D025 */,/*26536*/NULL/* D026 */,/*26537*/NULL/* D027 */,/*26538*/NULL/* D028 */,/*26539*/NULL/* D029 */, /*26540*/NULL/* D02A */,/*26541*/NULL/* D02B */,/*26542*/NULL/* D02C */,/*26543*/NULL/* D02D */,/*26544*/NULL/* D02E */, /*26545*/NULL/* D02F */,/*26546*/NULL/* D030 */,/*26547*/NULL/* D031 */,/*26548*/""/* D032 */, /*26549*/NULL/* D033 */,/*26550*/""/* D034 */,/*26551*/""/* D035 */, /*26552*/NULL/* D036 */,/*26553*/NULL/* D037 */,/*26554*/NULL/* D038 */,/*26555*/NULL/* D039 */,/*26556*/NULL/* D03A */, /*26557*/NULL/* D03B */,/*26558*/NULL/* D03C */,/*26559*/NULL/* D03D */,/*26560*/NULL/* D03E */,/*26561*/NULL/* D03F */, /*26562*/NULL/* D040 */,/*26563*/NULL/* D041 */,/*26564*/NULL/* D042 */,/*26565*/NULL/* D043 */,/*26566*/NULL/* D044 */, /*26567*/NULL/* D045 */,/*26568*/NULL/* D046 */,/*26569*/NULL/* D047 */,/*26570*/NULL/* D048 */,/*26571*/NULL/* D049 */, /*26572*/NULL/* D04A */,/*26573*/NULL/* D04B */,/*26574*/NULL/* D04C */,/*26575*/NULL/* D04D */, /*26576*/""/* D04E */,/*26577*/NULL/* D04F */,/*26578*/""/* D050 */, /*26579*/""/* D051 */,/*26580*/NULL/* D052 */,/*26581*/NULL/* D053 */,/*26582*/NULL/* D054 */, /*26583*/NULL/* D055 */,/*26584*/NULL/* D056 */,/*26585*/NULL/* D057 */,/*26586*/NULL/* D058 */,/*26587*/NULL/* D059 */, /*26588*/NULL/* D05A */,/*26589*/NULL/* D05B */,/*26590*/NULL/* D05C */,/*26591*/NULL/* D05D */,/*26592*/NULL/* D05E */, /*26593*/NULL/* D05F */,/*26594*/NULL/* D060 */,/*26595*/NULL/* D061 */,/*26596*/NULL/* D062 */,/*26597*/NULL/* D063 */, /*26598*/NULL/* D064 */,/*26599*/NULL/* D065 */,/*26600*/NULL/* D066 */,/*26601*/NULL/* D067 */,/*26602*/NULL/* D068 */, /*26603*/NULL/* D069 */,/*26604*/""/* D06A */,/*26605*/NULL/* D06B */, /*26606*/""/* D06C */,/*26607*/""/* D06D */,/*26608*/NULL/* D06E */, /*26609*/NULL/* D06F */,/*26610*/NULL/* D070 */,/*26611*/NULL/* D071 */,/*26612*/NULL/* D072 */,/*26613*/NULL/* D073 */, /*26614*/NULL/* D074 */,/*26615*/NULL/* D075 */,/*26616*/NULL/* D076 */,/*26617*/NULL/* D077 */,/*26618*/NULL/* D078 */, /*26619*/NULL/* D079 */,/*26620*/NULL/* D07A */,/*26621*/NULL/* D07B */,/*26622*/NULL/* D07C */,/*26623*/NULL/* D07D */, /*26624*/NULL/* D07E */,/*26625*/NULL/* D07F */,/*26626*/NULL/* D080 */,/*26627*/NULL/* D081 */,/*26628*/NULL/* D082 */, /*26629*/NULL/* D083 */,/*26630*/NULL/* D084 */,/*26631*/NULL/* D085 */,/*26632*/""/* D086 */, /*26633*/NULL/* D087 */,/*26634*/""/* D088 */,/*26635*/""/* D089 */, /*26636*/NULL/* D08A */,/*26637*/NULL/* D08B */,/*26638*/NULL/* D08C */,/*26639*/NULL/* D08D */,/*26640*/NULL/* D08E */, /*26641*/NULL/* D08F */,/*26642*/NULL/* D090 */,/*26643*/NULL/* D091 */,/*26644*/NULL/* D092 */,/*26645*/NULL/* D093 */, /*26646*/NULL/* D094 */,/*26647*/NULL/* D095 */,/*26648*/NULL/* D096 */,/*26649*/NULL/* D097 */,/*26650*/NULL/* D098 */, /*26651*/NULL/* D099 */,/*26652*/NULL/* D09A */,/*26653*/NULL/* D09B */,/*26654*/NULL/* D09C */,/*26655*/NULL/* D09D */, /*26656*/NULL/* D09E */,/*26657*/NULL/* D09F */,/*26658*/NULL/* D0A0 */,/*26659*/NULL/* D0A1 */, /*26660*/""/* D0A2 */,/*26661*/NULL/* D0A3 */,/*26662*/""/* D0A4 */, /*26663*/""/* D0A5 */,/*26664*/NULL/* D0A6 */,/*26665*/NULL/* D0A7 */,/*26666*/NULL/* D0A8 */, /*26667*/NULL/* D0A9 */,/*26668*/NULL/* D0AA */,/*26669*/NULL/* D0AB */,/*26670*/NULL/* D0AC */,/*26671*/NULL/* D0AD */, /*26672*/NULL/* D0AE */,/*26673*/NULL/* D0AF */,/*26674*/NULL/* D0B0 */,/*26675*/NULL/* D0B1 */,/*26676*/NULL/* D0B2 */, /*26677*/NULL/* D0B3 */,/*26678*/NULL/* D0B4 */,/*26679*/NULL/* D0B5 */,/*26680*/NULL/* D0B6 */,/*26681*/NULL/* D0B7 */, /*26682*/NULL/* D0B8 */,/*26683*/NULL/* D0B9 */,/*26684*/NULL/* D0BA */,/*26685*/NULL/* D0BB */,/*26686*/NULL/* D0BC */, /*26687*/NULL/* D0BD */,/*26688*/""/* D0BE */,/*26689*/NULL/* D0BF */, /*26690*/""/* D0C0 */,/*26691*/""/* D0C1 */,/*26692*/NULL/* D0C2 */, /*26693*/NULL/* D0C3 */,/*26694*/NULL/* D0C4 */,/*26695*/NULL/* D0C5 */,/*26696*/NULL/* D0C6 */,/*26697*/NULL/* D0C7 */, /*26698*/NULL/* D0C8 */,/*26699*/NULL/* D0C9 */,/*26700*/NULL/* D0CA */,/*26701*/NULL/* D0CB */,/*26702*/NULL/* D0CC */, /*26703*/NULL/* D0CD */,/*26704*/NULL/* D0CE */,/*26705*/NULL/* D0CF */,/*26706*/NULL/* D0D0 */,/*26707*/NULL/* D0D1 */, /*26708*/NULL/* D0D2 */,/*26709*/NULL/* D0D3 */,/*26710*/NULL/* D0D4 */,/*26711*/NULL/* D0D5 */,/*26712*/NULL/* D0D6 */, /*26713*/NULL/* D0D7 */,/*26714*/NULL/* D0D8 */,/*26715*/NULL/* D0D9 */,/*26716*/""/* D0DA */, /*26717*/NULL/* D0DB */,/*26718*/""/* D0DC */,/*26719*/""/* D0DD */, /*26720*/NULL/* D0DE */,/*26721*/NULL/* D0DF */,/*26722*/NULL/* D0E0 */,/*26723*/NULL/* D0E1 */,/*26724*/NULL/* D0E2 */, /*26725*/NULL/* D0E3 */,/*26726*/NULL/* D0E4 */,/*26727*/NULL/* D0E5 */,/*26728*/NULL/* D0E6 */,/*26729*/NULL/* D0E7 */, /*26730*/NULL/* D0E8 */,/*26731*/NULL/* D0E9 */,/*26732*/NULL/* D0EA */,/*26733*/NULL/* D0EB */,/*26734*/NULL/* D0EC */, /*26735*/NULL/* D0ED */,/*26736*/NULL/* D0EE */,/*26737*/NULL/* D0EF */,/*26738*/NULL/* D0F0 */,/*26739*/NULL/* D0F1 */, /*26740*/NULL/* D0F2 */,/*26741*/NULL/* D0F3 */,/*26742*/NULL/* D0F4 */,/*26743*/NULL/* D0F5 */, /*26744*/""/* D0F6 */,/*26745*/NULL/* D0F7 */,/*26746*/""/* D0F8 */, /*26747*/""/* D0F9 */,/*26748*/NULL/* D0FA */,/*26749*/NULL/* D0FB */,/*26750*/NULL/* D0FC */, /*26751*/NULL/* D0FD */,/*26752*/NULL/* D0FE */,/*26753*/NULL/* D0FF */,/*26754*/NULL/* D100 */,/*26755*/NULL/* D101 */, /*26756*/NULL/* D102 */,/*26757*/NULL/* D103 */,/*26758*/NULL/* D104 */,/*26759*/NULL/* D105 */,/*26760*/NULL/* D106 */, /*26761*/NULL/* D107 */,/*26762*/NULL/* D108 */,/*26763*/NULL/* D109 */,/*26764*/NULL/* D10A */,/*26765*/NULL/* D10B */, /*26766*/NULL/* D10C */,/*26767*/NULL/* D10D */,/*26768*/NULL/* D10E */,/*26769*/NULL/* D10F */,/*26770*/NULL/* D110 */, /*26771*/NULL/* D111 */,/*26772*/""/* D112 */,/*26773*/NULL/* D113 */, /*26774*/""/* D114 */,/*26775*/""/* D115 */,/*26776*/NULL/* D116 */, /*26777*/NULL/* D117 */,/*26778*/NULL/* D118 */,/*26779*/NULL/* D119 */,/*26780*/NULL/* D11A */,/*26781*/NULL/* D11B */, /*26782*/NULL/* D11C */,/*26783*/NULL/* D11D */,/*26784*/NULL/* D11E */,/*26785*/NULL/* D11F */,/*26786*/NULL/* D120 */, /*26787*/NULL/* D121 */,/*26788*/NULL/* D122 */,/*26789*/NULL/* D123 */,/*26790*/NULL/* D124 */,/*26791*/NULL/* D125 */, /*26792*/NULL/* D126 */,/*26793*/NULL/* D127 */,/*26794*/NULL/* D128 */,/*26795*/NULL/* D129 */,/*26796*/NULL/* D12A */, /*26797*/NULL/* D12B */,/*26798*/NULL/* D12C */,/*26799*/NULL/* D12D */,/*26800*/""/* D12E */, /*26801*/NULL/* D12F */,/*26802*/""/* D130 */,/*26803*/""/* D131 */, /*26804*/NULL/* D132 */,/*26805*/NULL/* D133 */,/*26806*/NULL/* D134 */,/*26807*/NULL/* D135 */,/*26808*/NULL/* D136 */, /*26809*/NULL/* D137 */,/*26810*/NULL/* D138 */,/*26811*/NULL/* D139 */,/*26812*/NULL/* D13A */,/*26813*/NULL/* D13B */, /*26814*/NULL/* D13C */,/*26815*/NULL/* D13D */,/*26816*/NULL/* D13E */,/*26817*/NULL/* D13F */,/*26818*/NULL/* D140 */, /*26819*/NULL/* D141 */,/*26820*/NULL/* D142 */,/*26821*/NULL/* D143 */,/*26822*/NULL/* D144 */,/*26823*/NULL/* D145 */, /*26824*/NULL/* D146 */,/*26825*/NULL/* D147 */,/*26826*/NULL/* D148 */,/*26827*/NULL/* D149 */, /*26828*/""/* D14A */,/*26829*/NULL/* D14B */,/*26830*/""/* D14C */, /*26831*/""/* D14D */,/*26832*/NULL/* D14E */,/*26833*/NULL/* D14F */,/*26834*/NULL/* D150 */, /*26835*/NULL/* D151 */,/*26836*/NULL/* D152 */,/*26837*/NULL/* D153 */,/*26838*/NULL/* D154 */,/*26839*/NULL/* D155 */, /*26840*/NULL/* D156 */,/*26841*/NULL/* D157 */,/*26842*/NULL/* D158 */,/*26843*/NULL/* D159 */,/*26844*/NULL/* D15A */, /*26845*/NULL/* D15B */,/*26846*/NULL/* D15C */,/*26847*/NULL/* D15D */,/*26848*/NULL/* D15E */,/*26849*/NULL/* D15F */, /*26850*/NULL/* D160 */,/*26851*/NULL/* D161 */,/*26852*/NULL/* D162 */,/*26853*/NULL/* D163 */,/*26854*/NULL/* D164 */, /*26855*/NULL/* D165 */,/*26856*/""/* D166 */,/*26857*/NULL/* D167 */, /*26858*/""/* D168 */,/*26859*/""/* D169 */,/*26860*/NULL/* D16A */, /*26861*/NULL/* D16B */,/*26862*/NULL/* D16C */,/*26863*/NULL/* D16D */,/*26864*/NULL/* D16E */,/*26865*/NULL/* D16F */, /*26866*/NULL/* D170 */,/*26867*/NULL/* D171 */,/*26868*/NULL/* D172 */,/*26869*/NULL/* D173 */,/*26870*/NULL/* D174 */, /*26871*/NULL/* D175 */,/*26872*/NULL/* D176 */,/*26873*/NULL/* D177 */,/*26874*/NULL/* D178 */,/*26875*/NULL/* D179 */, /*26876*/NULL/* D17A */,/*26877*/NULL/* D17B */,/*26878*/NULL/* D17C */,/*26879*/NULL/* D17D */,/*26880*/NULL/* D17E */, /*26881*/NULL/* D17F */,/*26882*/NULL/* D180 */,/*26883*/NULL/* D181 */,/*26884*/""/* D182 */, /*26885*/NULL/* D183 */,/*26886*/""/* D184 */,/*26887*/""/* D185 */, /*26888*/NULL/* D186 */,/*26889*/NULL/* D187 */,/*26890*/NULL/* D188 */,/*26891*/NULL/* D189 */,/*26892*/NULL/* D18A */, /*26893*/NULL/* D18B */,/*26894*/NULL/* D18C */,/*26895*/NULL/* D18D */,/*26896*/NULL/* D18E */,/*26897*/NULL/* D18F */, /*26898*/NULL/* D190 */,/*26899*/NULL/* D191 */,/*26900*/NULL/* D192 */,/*26901*/NULL/* D193 */,/*26902*/NULL/* D194 */, /*26903*/NULL/* D195 */,/*26904*/NULL/* D196 */,/*26905*/NULL/* D197 */,/*26906*/NULL/* D198 */,/*26907*/NULL/* D199 */, /*26908*/NULL/* D19A */,/*26909*/NULL/* D19B */,/*26910*/NULL/* D19C */,/*26911*/NULL/* D19D */, /*26912*/""/* D19E */,/*26913*/NULL/* D19F */,/*26914*/""/* D1A0 */, /*26915*/""/* D1A1 */,/*26916*/NULL/* D1A2 */,/*26917*/NULL/* D1A3 */,/*26918*/NULL/* D1A4 */, /*26919*/NULL/* D1A5 */,/*26920*/NULL/* D1A6 */,/*26921*/NULL/* D1A7 */,/*26922*/NULL/* D1A8 */,/*26923*/NULL/* D1A9 */, /*26924*/NULL/* D1AA */,/*26925*/NULL/* D1AB */,/*26926*/NULL/* D1AC */,/*26927*/NULL/* D1AD */,/*26928*/NULL/* D1AE */, /*26929*/NULL/* D1AF */,/*26930*/NULL/* D1B0 */,/*26931*/NULL/* D1B1 */,/*26932*/NULL/* D1B2 */,/*26933*/NULL/* D1B3 */, /*26934*/NULL/* D1B4 */,/*26935*/NULL/* D1B5 */,/*26936*/NULL/* D1B6 */,/*26937*/NULL/* D1B7 */,/*26938*/NULL/* D1B8 */, /*26939*/NULL/* D1B9 */,/*26940*/""/* D1BA */,/*26941*/NULL/* D1BB */, /*26942*/""/* D1BC */,/*26943*/""/* D1BD */,/*26944*/NULL/* D1BE */, /*26945*/NULL/* D1BF */,/*26946*/NULL/* D1C0 */,/*26947*/NULL/* D1C1 */,/*26948*/NULL/* D1C2 */,/*26949*/NULL/* D1C3 */, /*26950*/NULL/* D1C4 */,/*26951*/NULL/* D1C5 */,/*26952*/NULL/* D1C6 */,/*26953*/NULL/* D1C7 */,/*26954*/NULL/* D1C8 */, /*26955*/NULL/* D1C9 */,/*26956*/NULL/* D1CA */,/*26957*/NULL/* D1CB */,/*26958*/NULL/* D1CC */,/*26959*/NULL/* D1CD */, /*26960*/NULL/* D1CE */,/*26961*/NULL/* D1CF */,/*26962*/NULL/* D1D0 */,/*26963*/NULL/* D1D1 */,/*26964*/NULL/* D1D2 */, /*26965*/NULL/* D1D3 */,/*26966*/NULL/* D1D4 */,/*26967*/NULL/* D1D5 */,/*26968*/""/* D1D6 */, /*26969*/NULL/* D1D7 */,/*26970*/""/* D1D8 */,/*26971*/""/* D1D9 */, /*26972*/NULL/* D1DA */,/*26973*/NULL/* D1DB */,/*26974*/NULL/* D1DC */,/*26975*/NULL/* D1DD */,/*26976*/NULL/* D1DE */, /*26977*/NULL/* D1DF */,/*26978*/NULL/* D1E0 */,/*26979*/NULL/* D1E1 */,/*26980*/NULL/* D1E2 */,/*26981*/NULL/* D1E3 */, /*26982*/NULL/* D1E4 */,/*26983*/NULL/* D1E5 */,/*26984*/NULL/* D1E6 */,/*26985*/NULL/* D1E7 */,/*26986*/NULL/* D1E8 */, /*26987*/NULL/* D1E9 */,/*26988*/NULL/* D1EA */,/*26989*/NULL/* D1EB */,/*26990*/NULL/* D1EC */,/*26991*/NULL/* D1ED */, /*26992*/NULL/* D1EE */,/*26993*/NULL/* D1EF */,/*26994*/NULL/* D1F0 */,/*26995*/NULL/* D1F1 */, /*26996*/""/* D1F2 */,/*26997*/NULL/* D1F3 */,/*26998*/""/* D1F4 */, /*26999*/""/* D1F5 */,/*27000*/NULL/* D1F6 */,/*27001*/NULL/* D1F7 */,/*27002*/NULL/* D1F8 */, /*27003*/NULL/* D1F9 */,/*27004*/NULL/* D1FA */,/*27005*/NULL/* D1FB */,/*27006*/NULL/* D1FC */,/*27007*/NULL/* D1FD */, /*27008*/NULL/* D1FE */,/*27009*/NULL/* D1FF */,/*27010*/NULL/* D200 */,/*27011*/NULL/* D201 */,/*27012*/NULL/* D202 */, /*27013*/NULL/* D203 */,/*27014*/NULL/* D204 */,/*27015*/NULL/* D205 */,/*27016*/NULL/* D206 */,/*27017*/NULL/* D207 */, /*27018*/NULL/* D208 */,/*27019*/NULL/* D209 */,/*27020*/NULL/* D20A */,/*27021*/NULL/* D20B */,/*27022*/NULL/* D20C */, /*27023*/NULL/* D20D */,/*27024*/""/* D20E */,/*27025*/NULL/* D20F */, /*27026*/""/* D210 */,/*27027*/""/* D211 */,/*27028*/NULL/* D212 */, /*27029*/NULL/* D213 */,/*27030*/NULL/* D214 */,/*27031*/NULL/* D215 */,/*27032*/NULL/* D216 */,/*27033*/NULL/* D217 */, /*27034*/NULL/* D218 */,/*27035*/NULL/* D219 */,/*27036*/NULL/* D21A */,/*27037*/NULL/* D21B */,/*27038*/NULL/* D21C */, /*27039*/NULL/* D21D */,/*27040*/NULL/* D21E */,/*27041*/NULL/* D21F */,/*27042*/NULL/* D220 */,/*27043*/NULL/* D221 */, /*27044*/NULL/* D222 */,/*27045*/NULL/* D223 */,/*27046*/NULL/* D224 */,/*27047*/NULL/* D225 */,/*27048*/NULL/* D226 */, /*27049*/NULL/* D227 */,/*27050*/NULL/* D228 */,/*27051*/NULL/* D229 */,/*27052*/""/* D22A */, /*27053*/NULL/* D22B */,/*27054*/""/* D22C */,/*27055*/""/* D22D */, /*27056*/NULL/* D22E */,/*27057*/NULL/* D22F */,/*27058*/NULL/* D230 */,/*27059*/NULL/* D231 */,/*27060*/NULL/* D232 */, /*27061*/NULL/* D233 */,/*27062*/NULL/* D234 */,/*27063*/NULL/* D235 */,/*27064*/NULL/* D236 */,/*27065*/NULL/* D237 */, /*27066*/NULL/* D238 */,/*27067*/NULL/* D239 */,/*27068*/NULL/* D23A */,/*27069*/NULL/* D23B */,/*27070*/NULL/* D23C */, /*27071*/NULL/* D23D */,/*27072*/NULL/* D23E */,/*27073*/NULL/* D23F */,/*27074*/NULL/* D240 */,/*27075*/NULL/* D241 */, /*27076*/NULL/* D242 */,/*27077*/NULL/* D243 */,/*27078*/NULL/* D244 */,/*27079*/NULL/* D245 */, /*27080*/""/* D246 */,/*27081*/NULL/* D247 */,/*27082*/""/* D248 */, /*27083*/""/* D249 */,/*27084*/NULL/* D24A */,/*27085*/NULL/* D24B */,/*27086*/NULL/* D24C */, /*27087*/NULL/* D24D */,/*27088*/NULL/* D24E */,/*27089*/NULL/* D24F */,/*27090*/NULL/* D250 */,/*27091*/NULL/* D251 */, /*27092*/NULL/* D252 */,/*27093*/NULL/* D253 */,/*27094*/NULL/* D254 */,/*27095*/NULL/* D255 */,/*27096*/NULL/* D256 */, /*27097*/NULL/* D257 */,/*27098*/NULL/* D258 */,/*27099*/NULL/* D259 */,/*27100*/NULL/* D25A */,/*27101*/NULL/* D25B */, /*27102*/NULL/* D25C */,/*27103*/NULL/* D25D */,/*27104*/NULL/* D25E */,/*27105*/NULL/* D25F */,/*27106*/NULL/* D260 */, /*27107*/NULL/* D261 */,/*27108*/""/* D262 */,/*27109*/NULL/* D263 */, /*27110*/""/* D264 */,/*27111*/""/* D265 */,/*27112*/NULL/* D266 */, /*27113*/NULL/* D267 */,/*27114*/NULL/* D268 */,/*27115*/NULL/* D269 */,/*27116*/NULL/* D26A */,/*27117*/NULL/* D26B */, /*27118*/NULL/* D26C */,/*27119*/NULL/* D26D */,/*27120*/NULL/* D26E */,/*27121*/NULL/* D26F */,/*27122*/NULL/* D270 */, /*27123*/NULL/* D271 */,/*27124*/NULL/* D272 */,/*27125*/NULL/* D273 */,/*27126*/NULL/* D274 */,/*27127*/NULL/* D275 */, /*27128*/NULL/* D276 */,/*27129*/NULL/* D277 */,/*27130*/NULL/* D278 */,/*27131*/NULL/* D279 */,/*27132*/NULL/* D27A */, /*27133*/NULL/* D27B */,/*27134*/NULL/* D27C */,/*27135*/NULL/* D27D */,/*27136*/""/* D27E */, /*27137*/NULL/* D27F */,/*27138*/""/* D280 */,/*27139*/""/* D281 */, /*27140*/NULL/* D282 */,/*27141*/NULL/* D283 */,/*27142*/NULL/* D284 */,/*27143*/NULL/* D285 */,/*27144*/NULL/* D286 */, /*27145*/NULL/* D287 */,/*27146*/NULL/* D288 */,/*27147*/NULL/* D289 */,/*27148*/NULL/* D28A */,/*27149*/NULL/* D28B */, /*27150*/NULL/* D28C */,/*27151*/NULL/* D28D */,/*27152*/NULL/* D28E */,/*27153*/NULL/* D28F */,/*27154*/NULL/* D290 */, /*27155*/NULL/* D291 */,/*27156*/NULL/* D292 */,/*27157*/NULL/* D293 */,/*27158*/NULL/* D294 */,/*27159*/NULL/* D295 */, /*27160*/NULL/* D296 */,/*27161*/NULL/* D297 */,/*27162*/NULL/* D298 */,/*27163*/NULL/* D299 */, /*27164*/""/* D29A */,/*27165*/NULL/* D29B */,/*27166*/""/* D29C */, /*27167*/""/* D29D */,/*27168*/NULL/* D29E */,/*27169*/NULL/* D29F */,/*27170*/NULL/* D2A0 */, /*27171*/NULL/* D2A1 */,/*27172*/NULL/* D2A2 */,/*27173*/NULL/* D2A3 */,/*27174*/NULL/* D2A4 */,/*27175*/NULL/* D2A5 */, /*27176*/NULL/* D2A6 */,/*27177*/NULL/* D2A7 */,/*27178*/NULL/* D2A8 */,/*27179*/NULL/* D2A9 */,/*27180*/NULL/* D2AA */, /*27181*/NULL/* D2AB */,/*27182*/NULL/* D2AC */,/*27183*/NULL/* D2AD */,/*27184*/NULL/* D2AE */,/*27185*/NULL/* D2AF */, /*27186*/NULL/* D2B0 */,/*27187*/NULL/* D2B1 */,/*27188*/NULL/* D2B2 */,/*27189*/NULL/* D2B3 */,/*27190*/NULL/* D2B4 */, /*27191*/NULL/* D2B5 */,/*27192*/""/* D2B6 */,/*27193*/NULL/* D2B7 */, /*27194*/""/* D2B8 */,/*27195*/""/* D2B9 */,/*27196*/NULL/* D2BA */, /*27197*/NULL/* D2BB */,/*27198*/NULL/* D2BC */,/*27199*/NULL/* D2BD */,/*27200*/NULL/* D2BE */,/*27201*/NULL/* D2BF */, /*27202*/NULL/* D2C0 */,/*27203*/NULL/* D2C1 */,/*27204*/NULL/* D2C2 */,/*27205*/NULL/* D2C3 */,/*27206*/NULL/* D2C4 */, /*27207*/NULL/* D2C5 */,/*27208*/NULL/* D2C6 */,/*27209*/NULL/* D2C7 */,/*27210*/NULL/* D2C8 */,/*27211*/NULL/* D2C9 */, /*27212*/NULL/* D2CA */,/*27213*/NULL/* D2CB */,/*27214*/NULL/* D2CC */,/*27215*/NULL/* D2CD */,/*27216*/NULL/* D2CE */, /*27217*/NULL/* D2CF */,/*27218*/NULL/* D2D0 */,/*27219*/NULL/* D2D1 */,/*27220*/""/* D2D2 */, /*27221*/NULL/* D2D3 */,/*27222*/""/* D2D4 */,/*27223*/""/* D2D5 */, /*27224*/NULL/* D2D6 */,/*27225*/NULL/* D2D7 */,/*27226*/NULL/* D2D8 */,/*27227*/NULL/* D2D9 */,/*27228*/NULL/* D2DA */, /*27229*/NULL/* D2DB */,/*27230*/NULL/* D2DC */,/*27231*/NULL/* D2DD */,/*27232*/NULL/* D2DE */,/*27233*/NULL/* D2DF */, /*27234*/NULL/* D2E0 */,/*27235*/NULL/* D2E1 */,/*27236*/NULL/* D2E2 */,/*27237*/NULL/* D2E3 */,/*27238*/NULL/* D2E4 */, /*27239*/NULL/* D2E5 */,/*27240*/NULL/* D2E6 */,/*27241*/NULL/* D2E7 */,/*27242*/NULL/* D2E8 */,/*27243*/NULL/* D2E9 */, /*27244*/NULL/* D2EA */,/*27245*/NULL/* D2EB */,/*27246*/NULL/* D2EC */,/*27247*/NULL/* D2ED */, /*27248*/""/* D2EE */,/*27249*/NULL/* D2EF */,/*27250*/""/* D2F0 */, /*27251*/""/* D2F1 */,/*27252*/NULL/* D2F2 */,/*27253*/NULL/* D2F3 */,/*27254*/NULL/* D2F4 */, /*27255*/NULL/* D2F5 */,/*27256*/NULL/* D2F6 */,/*27257*/NULL/* D2F7 */,/*27258*/NULL/* D2F8 */,/*27259*/NULL/* D2F9 */, /*27260*/NULL/* D2FA */,/*27261*/NULL/* D2FB */,/*27262*/NULL/* D2FC */,/*27263*/NULL/* D2FD */,/*27264*/NULL/* D2FE */, /*27265*/NULL/* D2FF */,/*27266*/NULL/* D300 */,/*27267*/NULL/* D301 */,/*27268*/NULL/* D302 */,/*27269*/NULL/* D303 */, /*27270*/NULL/* D304 */,/*27271*/NULL/* D305 */,/*27272*/NULL/* D306 */,/*27273*/NULL/* D307 */,/*27274*/NULL/* D308 */, /*27275*/NULL/* D309 */,/*27276*/""/* D30A */,/*27277*/NULL/* D30B */, /*27278*/""/* D30C */,/*27279*/""/* D30D */,/*27280*/NULL/* D30E */, /*27281*/NULL/* D30F */,/*27282*/NULL/* D310 */,/*27283*/NULL/* D311 */,/*27284*/NULL/* D312 */,/*27285*/NULL/* D313 */, /*27286*/NULL/* D314 */,/*27287*/NULL/* D315 */,/*27288*/NULL/* D316 */,/*27289*/NULL/* D317 */,/*27290*/NULL/* D318 */, /*27291*/NULL/* D319 */,/*27292*/NULL/* D31A */,/*27293*/NULL/* D31B */,/*27294*/NULL/* D31C */,/*27295*/NULL/* D31D */, /*27296*/NULL/* D31E */,/*27297*/NULL/* D31F */,/*27298*/NULL/* D320 */,/*27299*/NULL/* D321 */,/*27300*/NULL/* D322 */, /*27301*/NULL/* D323 */,/*27302*/NULL/* D324 */,/*27303*/NULL/* D325 */,/*27304*/""/* D326 */, /*27305*/NULL/* D327 */,/*27306*/""/* D328 */,/*27307*/""/* D329 */, /*27308*/NULL/* D32A */,/*27309*/NULL/* D32B */,/*27310*/NULL/* D32C */,/*27311*/NULL/* D32D */,/*27312*/NULL/* D32E */, /*27313*/NULL/* D32F */,/*27314*/NULL/* D330 */,/*27315*/NULL/* D331 */,/*27316*/NULL/* D332 */,/*27317*/NULL/* D333 */, /*27318*/NULL/* D334 */,/*27319*/NULL/* D335 */,/*27320*/NULL/* D336 */,/*27321*/NULL/* D337 */,/*27322*/NULL/* D338 */, /*27323*/NULL/* D339 */,/*27324*/NULL/* D33A */,/*27325*/NULL/* D33B */,/*27326*/NULL/* D33C */,/*27327*/NULL/* D33D */, /*27328*/NULL/* D33E */,/*27329*/NULL/* D33F */,/*27330*/NULL/* D340 */,/*27331*/NULL/* D341 */, /*27332*/""/* D342 */,/*27333*/NULL/* D343 */,/*27334*/""/* D344 */, /*27335*/""/* D345 */,/*27336*/NULL/* D346 */,/*27337*/NULL/* D347 */,/*27338*/NULL/* D348 */, /*27339*/NULL/* D349 */,/*27340*/NULL/* D34A */,/*27341*/NULL/* D34B */,/*27342*/NULL/* D34C */,/*27343*/NULL/* D34D */, /*27344*/NULL/* D34E */,/*27345*/NULL/* D34F */,/*27346*/NULL/* D350 */,/*27347*/NULL/* D351 */,/*27348*/NULL/* D352 */, /*27349*/NULL/* D353 */,/*27350*/NULL/* D354 */,/*27351*/NULL/* D355 */,/*27352*/NULL/* D356 */,/*27353*/NULL/* D357 */, /*27354*/NULL/* D358 */,/*27355*/NULL/* D359 */,/*27356*/NULL/* D35A */,/*27357*/NULL/* D35B */,/*27358*/NULL/* D35C */, /*27359*/NULL/* D35D */,/*27360*/""/* D35E */,/*27361*/NULL/* D35F */, /*27362*/""/* D360 */,/*27363*/""/* D361 */,/*27364*/NULL/* D362 */, /*27365*/NULL/* D363 */,/*27366*/NULL/* D364 */,/*27367*/NULL/* D365 */,/*27368*/NULL/* D366 */,/*27369*/NULL/* D367 */, /*27370*/NULL/* D368 */,/*27371*/NULL/* D369 */,/*27372*/NULL/* D36A */,/*27373*/NULL/* D36B */,/*27374*/NULL/* D36C */, /*27375*/NULL/* D36D */,/*27376*/NULL/* D36E */,/*27377*/NULL/* D36F */,/*27378*/NULL/* D370 */,/*27379*/NULL/* D371 */, /*27380*/NULL/* D372 */,/*27381*/NULL/* D373 */,/*27382*/NULL/* D374 */,/*27383*/NULL/* D375 */,/*27384*/NULL/* D376 */, /*27385*/NULL/* D377 */,/*27386*/NULL/* D378 */,/*27387*/NULL/* D379 */,/*27388*/""/* D37A */, /*27389*/NULL/* D37B */,/*27390*/""/* D37C */,/*27391*/""/* D37D */, /*27392*/NULL/* D37E */,/*27393*/NULL/* D37F */,/*27394*/NULL/* D380 */,/*27395*/NULL/* D381 */,/*27396*/NULL/* D382 */, /*27397*/NULL/* D383 */,/*27398*/NULL/* D384 */,/*27399*/NULL/* D385 */,/*27400*/NULL/* D386 */,/*27401*/NULL/* D387 */, /*27402*/NULL/* D388 */,/*27403*/NULL/* D389 */,/*27404*/NULL/* D38A */,/*27405*/NULL/* D38B */,/*27406*/NULL/* D38C */, /*27407*/NULL/* D38D */,/*27408*/NULL/* D38E */,/*27409*/NULL/* D38F */,/*27410*/NULL/* D390 */,/*27411*/NULL/* D391 */, /*27412*/NULL/* D392 */,/*27413*/NULL/* D393 */,/*27414*/NULL/* D394 */,/*27415*/NULL/* D395 */, /*27416*/""/* D396 */,/*27417*/NULL/* D397 */,/*27418*/""/* D398 */, /*27419*/""/* D399 */,/*27420*/NULL/* D39A */,/*27421*/NULL/* D39B */,/*27422*/NULL/* D39C */, /*27423*/NULL/* D39D */,/*27424*/NULL/* D39E */,/*27425*/NULL/* D39F */,/*27426*/NULL/* D3A0 */,/*27427*/NULL/* D3A1 */, /*27428*/NULL/* D3A2 */,/*27429*/NULL/* D3A3 */,/*27430*/NULL/* D3A4 */,/*27431*/NULL/* D3A5 */,/*27432*/NULL/* D3A6 */, /*27433*/NULL/* D3A7 */,/*27434*/NULL/* D3A8 */,/*27435*/NULL/* D3A9 */,/*27436*/NULL/* D3AA */,/*27437*/NULL/* D3AB */, /*27438*/NULL/* D3AC */,/*27439*/NULL/* D3AD */,/*27440*/NULL/* D3AE */,/*27441*/NULL/* D3AF */,/*27442*/NULL/* D3B0 */, /*27443*/NULL/* D3B1 */,/*27444*/""/* D3B2 */,/*27445*/NULL/* D3B3 */, /*27446*/""/* D3B4 */,/*27447*/""/* D3B5 */,/*27448*/NULL/* D3B6 */, /*27449*/NULL/* D3B7 */,/*27450*/NULL/* D3B8 */,/*27451*/NULL/* D3B9 */,/*27452*/NULL/* D3BA */,/*27453*/NULL/* D3BB */, /*27454*/NULL/* D3BC */,/*27455*/NULL/* D3BD */,/*27456*/NULL/* D3BE */,/*27457*/NULL/* D3BF */,/*27458*/NULL/* D3C0 */, /*27459*/NULL/* D3C1 */,/*27460*/NULL/* D3C2 */,/*27461*/NULL/* D3C3 */,/*27462*/NULL/* D3C4 */,/*27463*/NULL/* D3C5 */, /*27464*/NULL/* D3C6 */,/*27465*/NULL/* D3C7 */,/*27466*/NULL/* D3C8 */,/*27467*/NULL/* D3C9 */,/*27468*/NULL/* D3CA */, /*27469*/NULL/* D3CB */,/*27470*/NULL/* D3CC */,/*27471*/NULL/* D3CD */,/*27472*/""/* D3CE */, /*27473*/NULL/* D3CF */,/*27474*/""/* D3D0 */,/*27475*/""/* D3D1 */, /*27476*/NULL/* D3D2 */,/*27477*/NULL/* D3D3 */,/*27478*/NULL/* D3D4 */,/*27479*/NULL/* D3D5 */,/*27480*/NULL/* D3D6 */, /*27481*/NULL/* D3D7 */,/*27482*/NULL/* D3D8 */,/*27483*/NULL/* D3D9 */,/*27484*/NULL/* D3DA */,/*27485*/NULL/* D3DB */, /*27486*/NULL/* D3DC */,/*27487*/NULL/* D3DD */,/*27488*/NULL/* D3DE */,/*27489*/NULL/* D3DF */,/*27490*/NULL/* D3E0 */, /*27491*/NULL/* D3E1 */,/*27492*/NULL/* D3E2 */,/*27493*/NULL/* D3E3 */,/*27494*/NULL/* D3E4 */,/*27495*/NULL/* D3E5 */, /*27496*/NULL/* D3E6 */,/*27497*/NULL/* D3E7 */,/*27498*/NULL/* D3E8 */,/*27499*/NULL/* D3E9 */, /*27500*/""/* D3EA */,/*27501*/NULL/* D3EB */,/*27502*/""/* D3EC */, /*27503*/""/* D3ED */,/*27504*/NULL/* D3EE */,/*27505*/NULL/* D3EF */,/*27506*/NULL/* D3F0 */, /*27507*/NULL/* D3F1 */,/*27508*/NULL/* D3F2 */,/*27509*/NULL/* D3F3 */,/*27510*/NULL/* D3F4 */,/*27511*/NULL/* D3F5 */, /*27512*/NULL/* D3F6 */,/*27513*/NULL/* D3F7 */,/*27514*/NULL/* D3F8 */,/*27515*/NULL/* D3F9 */,/*27516*/NULL/* D3FA */, /*27517*/NULL/* D3FB */,/*27518*/NULL/* D3FC */,/*27519*/NULL/* D3FD */,/*27520*/NULL/* D3FE */,/*27521*/NULL/* D3FF */, /*27522*/NULL/* D400 */,/*27523*/NULL/* D401 */,/*27524*/NULL/* D402 */,/*27525*/NULL/* D403 */,/*27526*/NULL/* D404 */, /*27527*/NULL/* D405 */,/*27528*/""/* D406 */,/*27529*/NULL/* D407 */, /*27530*/""/* D408 */,/*27531*/""/* D409 */,/*27532*/NULL/* D40A */, /*27533*/NULL/* D40B */,/*27534*/NULL/* D40C */,/*27535*/NULL/* D40D */,/*27536*/NULL/* D40E */,/*27537*/NULL/* D40F */, /*27538*/NULL/* D410 */,/*27539*/NULL/* D411 */,/*27540*/NULL/* D412 */,/*27541*/NULL/* D413 */,/*27542*/NULL/* D414 */, /*27543*/NULL/* D415 */,/*27544*/NULL/* D416 */,/*27545*/NULL/* D417 */,/*27546*/NULL/* D418 */,/*27547*/NULL/* D419 */, /*27548*/NULL/* D41A */,/*27549*/NULL/* D41B */,/*27550*/NULL/* D41C */,/*27551*/NULL/* D41D */,/*27552*/NULL/* D41E */, /*27553*/NULL/* D41F */,/*27554*/NULL/* D420 */,/*27555*/NULL/* D421 */,/*27556*/""/* D422 */, /*27557*/NULL/* D423 */,/*27558*/""/* D424 */,/*27559*/""/* D425 */, /*27560*/NULL/* D426 */,/*27561*/NULL/* D427 */,/*27562*/NULL/* D428 */,/*27563*/NULL/* D429 */,/*27564*/NULL/* D42A */, /*27565*/NULL/* D42B */,/*27566*/NULL/* D42C */,/*27567*/NULL/* D42D */,/*27568*/NULL/* D42E */,/*27569*/NULL/* D42F */, /*27570*/NULL/* D430 */,/*27571*/NULL/* D431 */,/*27572*/NULL/* D432 */,/*27573*/NULL/* D433 */,/*27574*/NULL/* D434 */, /*27575*/NULL/* D435 */,/*27576*/NULL/* D436 */,/*27577*/NULL/* D437 */,/*27578*/NULL/* D438 */,/*27579*/NULL/* D439 */, /*27580*/NULL/* D43A */,/*27581*/NULL/* D43B */,/*27582*/NULL/* D43C */,/*27583*/NULL/* D43D */, /*27584*/""/* D43E */,/*27585*/NULL/* D43F */,/*27586*/""/* D440 */, /*27587*/""/* D441 */,/*27588*/NULL/* D442 */,/*27589*/NULL/* D443 */,/*27590*/NULL/* D444 */, /*27591*/NULL/* D445 */,/*27592*/NULL/* D446 */,/*27593*/NULL/* D447 */,/*27594*/NULL/* D448 */,/*27595*/NULL/* D449 */, /*27596*/NULL/* D44A */,/*27597*/NULL/* D44B */,/*27598*/NULL/* D44C */,/*27599*/NULL/* D44D */,/*27600*/NULL/* D44E */, /*27601*/NULL/* D44F */,/*27602*/NULL/* D450 */,/*27603*/NULL/* D451 */,/*27604*/NULL/* D452 */,/*27605*/NULL/* D453 */, /*27606*/NULL/* D454 */,/*27607*/NULL/* D455 */,/*27608*/NULL/* D456 */,/*27609*/NULL/* D457 */,/*27610*/NULL/* D458 */, /*27611*/NULL/* D459 */,/*27612*/""/* D45A */,/*27613*/NULL/* D45B */, /*27614*/""/* D45C */,/*27615*/""/* D45D */,/*27616*/NULL/* D45E */, /*27617*/NULL/* D45F */,/*27618*/NULL/* D460 */,/*27619*/NULL/* D461 */,/*27620*/NULL/* D462 */,/*27621*/NULL/* D463 */, /*27622*/NULL/* D464 */,/*27623*/NULL/* D465 */,/*27624*/NULL/* D466 */,/*27625*/NULL/* D467 */,/*27626*/NULL/* D468 */, /*27627*/NULL/* D469 */,/*27628*/NULL/* D46A */,/*27629*/NULL/* D46B */,/*27630*/NULL/* D46C */,/*27631*/NULL/* D46D */, /*27632*/NULL/* D46E */,/*27633*/NULL/* D46F */,/*27634*/NULL/* D470 */,/*27635*/NULL/* D471 */,/*27636*/NULL/* D472 */, /*27637*/NULL/* D473 */,/*27638*/NULL/* D474 */,/*27639*/NULL/* D475 */,/*27640*/""/* D476 */, /*27641*/NULL/* D477 */,/*27642*/""/* D478 */,/*27643*/""/* D479 */, /*27644*/NULL/* D47A */,/*27645*/NULL/* D47B */,/*27646*/NULL/* D47C */,/*27647*/NULL/* D47D */,/*27648*/NULL/* D47E */, /*27649*/NULL/* D47F */,/*27650*/NULL/* D480 */,/*27651*/NULL/* D481 */,/*27652*/NULL/* D482 */,/*27653*/NULL/* D483 */, /*27654*/NULL/* D484 */,/*27655*/NULL/* D485 */,/*27656*/NULL/* D486 */,/*27657*/NULL/* D487 */,/*27658*/NULL/* D488 */, /*27659*/NULL/* D489 */,/*27660*/NULL/* D48A */,/*27661*/NULL/* D48B */,/*27662*/NULL/* D48C */,/*27663*/NULL/* D48D */, /*27664*/NULL/* D48E */,/*27665*/NULL/* D48F */,/*27666*/NULL/* D490 */,/*27667*/NULL/* D491 */, /*27668*/""/* D492 */,/*27669*/NULL/* D493 */,/*27670*/""/* D494 */, /*27671*/""/* D495 */,/*27672*/NULL/* D496 */,/*27673*/NULL/* D497 */,/*27674*/NULL/* D498 */, /*27675*/NULL/* D499 */,/*27676*/NULL/* D49A */,/*27677*/NULL/* D49B */,/*27678*/NULL/* D49C */,/*27679*/NULL/* D49D */, /*27680*/NULL/* D49E */,/*27681*/NULL/* D49F */,/*27682*/NULL/* D4A0 */,/*27683*/NULL/* D4A1 */,/*27684*/NULL/* D4A2 */, /*27685*/NULL/* D4A3 */,/*27686*/NULL/* D4A4 */,/*27687*/NULL/* D4A5 */,/*27688*/NULL/* D4A6 */,/*27689*/NULL/* D4A7 */, /*27690*/NULL/* D4A8 */,/*27691*/NULL/* D4A9 */,/*27692*/NULL/* D4AA */,/*27693*/NULL/* D4AB */,/*27694*/NULL/* D4AC */, /*27695*/NULL/* D4AD */,/*27696*/""/* D4AE */,/*27697*/NULL/* D4AF */, /*27698*/""/* D4B0 */,/*27699*/""/* D4B1 */,/*27700*/NULL/* D4B2 */, /*27701*/NULL/* D4B3 */,/*27702*/NULL/* D4B4 */,/*27703*/NULL/* D4B5 */,/*27704*/NULL/* D4B6 */,/*27705*/NULL/* D4B7 */, /*27706*/NULL/* D4B8 */,/*27707*/NULL/* D4B9 */,/*27708*/NULL/* D4BA */,/*27709*/NULL/* D4BB */,/*27710*/NULL/* D4BC */, /*27711*/NULL/* D4BD */,/*27712*/NULL/* D4BE */,/*27713*/NULL/* D4BF */,/*27714*/NULL/* D4C0 */,/*27715*/NULL/* D4C1 */, /*27716*/NULL/* D4C2 */,/*27717*/NULL/* D4C3 */,/*27718*/NULL/* D4C4 */,/*27719*/NULL/* D4C5 */,/*27720*/NULL/* D4C6 */, /*27721*/NULL/* D4C7 */,/*27722*/NULL/* D4C8 */,/*27723*/NULL/* D4C9 */,/*27724*/""/* D4CA */, /*27725*/NULL/* D4CB */,/*27726*/""/* D4CC */,/*27727*/""/* D4CD */, /*27728*/NULL/* D4CE */,/*27729*/NULL/* D4CF */,/*27730*/NULL/* D4D0 */,/*27731*/NULL/* D4D1 */,/*27732*/NULL/* D4D2 */, /*27733*/NULL/* D4D3 */,/*27734*/NULL/* D4D4 */,/*27735*/NULL/* D4D5 */,/*27736*/NULL/* D4D6 */,/*27737*/NULL/* D4D7 */, /*27738*/NULL/* D4D8 */,/*27739*/NULL/* D4D9 */,/*27740*/NULL/* D4DA */,/*27741*/NULL/* D4DB */,/*27742*/NULL/* D4DC */, /*27743*/NULL/* D4DD */,/*27744*/NULL/* D4DE */,/*27745*/NULL/* D4DF */,/*27746*/NULL/* D4E0 */,/*27747*/NULL/* D4E1 */, /*27748*/NULL/* D4E2 */,/*27749*/NULL/* D4E3 */,/*27750*/NULL/* D4E4 */,/*27751*/NULL/* D4E5 */, /*27752*/""/* D4E6 */,/*27753*/NULL/* D4E7 */,/*27754*/""/* D4E8 */, /*27755*/""/* D4E9 */,/*27756*/NULL/* D4EA */,/*27757*/NULL/* D4EB */,/*27758*/NULL/* D4EC */, /*27759*/NULL/* D4ED */,/*27760*/NULL/* D4EE */,/*27761*/NULL/* D4EF */,/*27762*/NULL/* D4F0 */,/*27763*/NULL/* D4F1 */, /*27764*/NULL/* D4F2 */,/*27765*/NULL/* D4F3 */,/*27766*/NULL/* D4F4 */,/*27767*/NULL/* D4F5 */,/*27768*/NULL/* D4F6 */, /*27769*/NULL/* D4F7 */,/*27770*/NULL/* D4F8 */,/*27771*/NULL/* D4F9 */,/*27772*/NULL/* D4FA */,/*27773*/NULL/* D4FB */, /*27774*/NULL/* D4FC */,/*27775*/NULL/* D4FD */,/*27776*/NULL/* D4FE */,/*27777*/NULL/* D4FF */,/*27778*/NULL/* D500 */, /*27779*/NULL/* D501 */,/*27780*/""/* D502 */,/*27781*/NULL/* D503 */, /*27782*/""/* D504 */,/*27783*/""/* D505 */,/*27784*/NULL/* D506 */, /*27785*/NULL/* D507 */,/*27786*/NULL/* D508 */,/*27787*/NULL/* D509 */,/*27788*/NULL/* D50A */,/*27789*/NULL/* D50B */, /*27790*/NULL/* D50C */,/*27791*/NULL/* D50D */,/*27792*/NULL/* D50E */,/*27793*/NULL/* D50F */,/*27794*/NULL/* D510 */, /*27795*/NULL/* D511 */,/*27796*/NULL/* D512 */,/*27797*/NULL/* D513 */,/*27798*/NULL/* D514 */,/*27799*/NULL/* D515 */, /*27800*/NULL/* D516 */,/*27801*/NULL/* D517 */,/*27802*/NULL/* D518 */,/*27803*/NULL/* D519 */,/*27804*/NULL/* D51A */, /*27805*/NULL/* D51B */,/*27806*/NULL/* D51C */,/*27807*/NULL/* D51D */,/*27808*/""/* D51E */, /*27809*/NULL/* D51F */,/*27810*/""/* D520 */,/*27811*/""/* D521 */, /*27812*/NULL/* D522 */,/*27813*/NULL/* D523 */,/*27814*/NULL/* D524 */,/*27815*/NULL/* D525 */,/*27816*/NULL/* D526 */, /*27817*/NULL/* D527 */,/*27818*/NULL/* D528 */,/*27819*/NULL/* D529 */,/*27820*/NULL/* D52A */,/*27821*/NULL/* D52B */, /*27822*/NULL/* D52C */,/*27823*/NULL/* D52D */,/*27824*/NULL/* D52E */,/*27825*/NULL/* D52F */,/*27826*/NULL/* D530 */, /*27827*/NULL/* D531 */,/*27828*/NULL/* D532 */,/*27829*/NULL/* D533 */,/*27830*/NULL/* D534 */,/*27831*/NULL/* D535 */, /*27832*/NULL/* D536 */,/*27833*/NULL/* D537 */,/*27834*/NULL/* D538 */,/*27835*/NULL/* D539 */, /*27836*/""/* D53A */,/*27837*/NULL/* D53B */,/*27838*/""/* D53C */, /*27839*/""/* D53D */,/*27840*/NULL/* D53E */,/*27841*/NULL/* D53F */,/*27842*/NULL/* D540 */, /*27843*/NULL/* D541 */,/*27844*/NULL/* D542 */,/*27845*/NULL/* D543 */,/*27846*/NULL/* D544 */,/*27847*/NULL/* D545 */, /*27848*/NULL/* D546 */,/*27849*/NULL/* D547 */,/*27850*/NULL/* D548 */,/*27851*/NULL/* D549 */,/*27852*/NULL/* D54A */, /*27853*/NULL/* D54B */,/*27854*/NULL/* D54C */,/*27855*/NULL/* D54D */,/*27856*/NULL/* D54E */,/*27857*/NULL/* D54F */, /*27858*/NULL/* D550 */,/*27859*/NULL/* D551 */,/*27860*/NULL/* D552 */,/*27861*/NULL/* D553 */,/*27862*/NULL/* D554 */, /*27863*/NULL/* D555 */,/*27864*/""/* D556 */,/*27865*/NULL/* D557 */, /*27866*/""/* D558 */,/*27867*/""/* D559 */,/*27868*/NULL/* D55A */, /*27869*/NULL/* D55B */,/*27870*/NULL/* D55C */,/*27871*/NULL/* D55D */,/*27872*/NULL/* D55E */,/*27873*/NULL/* D55F */, /*27874*/NULL/* D560 */,/*27875*/NULL/* D561 */,/*27876*/NULL/* D562 */,/*27877*/NULL/* D563 */,/*27878*/NULL/* D564 */, /*27879*/NULL/* D565 */,/*27880*/NULL/* D566 */,/*27881*/NULL/* D567 */,/*27882*/NULL/* D568 */,/*27883*/NULL/* D569 */, /*27884*/NULL/* D56A */,/*27885*/NULL/* D56B */,/*27886*/NULL/* D56C */,/*27887*/NULL/* D56D */,/*27888*/NULL/* D56E */, /*27889*/NULL/* D56F */,/*27890*/NULL/* D570 */,/*27891*/NULL/* D571 */,/*27892*/""/* D572 */, /*27893*/NULL/* D573 */,/*27894*/""/* D574 */,/*27895*/""/* D575 */, /*27896*/NULL/* D576 */,/*27897*/NULL/* D577 */,/*27898*/NULL/* D578 */,/*27899*/NULL/* D579 */,/*27900*/NULL/* D57A */, /*27901*/NULL/* D57B */,/*27902*/NULL/* D57C */,/*27903*/NULL/* D57D */,/*27904*/NULL/* D57E */,/*27905*/NULL/* D57F */, /*27906*/NULL/* D580 */,/*27907*/NULL/* D581 */,/*27908*/NULL/* D582 */,/*27909*/NULL/* D583 */,/*27910*/NULL/* D584 */, /*27911*/NULL/* D585 */,/*27912*/NULL/* D586 */,/*27913*/NULL/* D587 */,/*27914*/NULL/* D588 */,/*27915*/NULL/* D589 */, /*27916*/NULL/* D58A */,/*27917*/NULL/* D58B */,/*27918*/NULL/* D58C */,/*27919*/NULL/* D58D */, /*27920*/""/* D58E */,/*27921*/NULL/* D58F */,/*27922*/""/* D590 */, /*27923*/""/* D591 */,/*27924*/NULL/* D592 */,/*27925*/NULL/* D593 */,/*27926*/NULL/* D594 */, /*27927*/NULL/* D595 */,/*27928*/NULL/* D596 */,/*27929*/NULL/* D597 */,/*27930*/NULL/* D598 */,/*27931*/NULL/* D599 */, /*27932*/NULL/* D59A */,/*27933*/NULL/* D59B */,/*27934*/NULL/* D59C */,/*27935*/NULL/* D59D */,/*27936*/NULL/* D59E */, /*27937*/NULL/* D59F */,/*27938*/NULL/* D5A0 */,/*27939*/NULL/* D5A1 */,/*27940*/NULL/* D5A2 */,/*27941*/NULL/* D5A3 */, /*27942*/NULL/* D5A4 */,/*27943*/NULL/* D5A5 */,/*27944*/NULL/* D5A6 */,/*27945*/NULL/* D5A7 */,/*27946*/NULL/* D5A8 */, /*27947*/NULL/* D5A9 */,/*27948*/""/* D5AA */,/*27949*/NULL/* D5AB */, /*27950*/""/* D5AC */,/*27951*/""/* D5AD */,/*27952*/NULL/* D5AE */, /*27953*/NULL/* D5AF */,/*27954*/NULL/* D5B0 */,/*27955*/NULL/* D5B1 */,/*27956*/NULL/* D5B2 */,/*27957*/NULL/* D5B3 */, /*27958*/NULL/* D5B4 */,/*27959*/NULL/* D5B5 */,/*27960*/NULL/* D5B6 */,/*27961*/NULL/* D5B7 */,/*27962*/NULL/* D5B8 */, /*27963*/NULL/* D5B9 */,/*27964*/NULL/* D5BA */,/*27965*/NULL/* D5BB */,/*27966*/NULL/* D5BC */,/*27967*/NULL/* D5BD */, /*27968*/NULL/* D5BE */,/*27969*/NULL/* D5BF */,/*27970*/NULL/* D5C0 */,/*27971*/NULL/* D5C1 */,/*27972*/NULL/* D5C2 */, /*27973*/NULL/* D5C3 */,/*27974*/NULL/* D5C4 */,/*27975*/NULL/* D5C5 */,/*27976*/""/* D5C6 */, /*27977*/NULL/* D5C7 */,/*27978*/""/* D5C8 */,/*27979*/""/* D5C9 */, /*27980*/NULL/* D5CA */,/*27981*/NULL/* D5CB */,/*27982*/NULL/* D5CC */,/*27983*/NULL/* D5CD */,/*27984*/NULL/* D5CE */, /*27985*/NULL/* D5CF */,/*27986*/NULL/* D5D0 */,/*27987*/NULL/* D5D1 */,/*27988*/NULL/* D5D2 */,/*27989*/NULL/* D5D3 */, /*27990*/NULL/* D5D4 */,/*27991*/NULL/* D5D5 */,/*27992*/NULL/* D5D6 */,/*27993*/NULL/* D5D7 */,/*27994*/NULL/* D5D8 */, /*27995*/NULL/* D5D9 */,/*27996*/NULL/* D5DA */,/*27997*/NULL/* D5DB */,/*27998*/NULL/* D5DC */,/*27999*/NULL/* D5DD */, /*28000*/NULL/* D5DE */,/*28001*/NULL/* D5DF */,/*28002*/NULL/* D5E0 */,/*28003*/NULL/* D5E1 */, /*28004*/""/* D5E2 */,/*28005*/NULL/* D5E3 */,/*28006*/""/* D5E4 */, /*28007*/""/* D5E5 */,/*28008*/NULL/* D5E6 */,/*28009*/NULL/* D5E7 */,/*28010*/NULL/* D5E8 */, /*28011*/NULL/* D5E9 */,/*28012*/NULL/* D5EA */,/*28013*/NULL/* D5EB */,/*28014*/NULL/* D5EC */,/*28015*/NULL/* D5ED */, /*28016*/NULL/* D5EE */,/*28017*/NULL/* D5EF */,/*28018*/NULL/* D5F0 */,/*28019*/NULL/* D5F1 */,/*28020*/NULL/* D5F2 */, /*28021*/NULL/* D5F3 */,/*28022*/NULL/* D5F4 */,/*28023*/NULL/* D5F5 */,/*28024*/NULL/* D5F6 */,/*28025*/NULL/* D5F7 */, /*28026*/NULL/* D5F8 */,/*28027*/NULL/* D5F9 */,/*28028*/NULL/* D5FA */,/*28029*/NULL/* D5FB */,/*28030*/NULL/* D5FC */, /*28031*/NULL/* D5FD */,/*28032*/""/* D5FE */,/*28033*/NULL/* D5FF */, /*28034*/""/* D600 */,/*28035*/""/* D601 */,/*28036*/NULL/* D602 */, /*28037*/NULL/* D603 */,/*28038*/NULL/* D604 */,/*28039*/NULL/* D605 */,/*28040*/NULL/* D606 */,/*28041*/NULL/* D607 */, /*28042*/NULL/* D608 */,/*28043*/NULL/* D609 */,/*28044*/NULL/* D60A */,/*28045*/NULL/* D60B */,/*28046*/NULL/* D60C */, /*28047*/NULL/* D60D */,/*28048*/NULL/* D60E */,/*28049*/NULL/* D60F */,/*28050*/NULL/* D610 */,/*28051*/NULL/* D611 */, /*28052*/NULL/* D612 */,/*28053*/NULL/* D613 */,/*28054*/NULL/* D614 */,/*28055*/NULL/* D615 */,/*28056*/NULL/* D616 */, /*28057*/NULL/* D617 */,/*28058*/NULL/* D618 */,/*28059*/NULL/* D619 */,/*28060*/""/* D61A */, /*28061*/NULL/* D61B */,/*28062*/""/* D61C */,/*28063*/""/* D61D */, /*28064*/NULL/* D61E */,/*28065*/NULL/* D61F */,/*28066*/NULL/* D620 */,/*28067*/NULL/* D621 */,/*28068*/NULL/* D622 */, /*28069*/NULL/* D623 */,/*28070*/NULL/* D624 */,/*28071*/NULL/* D625 */,/*28072*/NULL/* D626 */,/*28073*/NULL/* D627 */, /*28074*/NULL/* D628 */,/*28075*/NULL/* D629 */,/*28076*/NULL/* D62A */,/*28077*/NULL/* D62B */,/*28078*/NULL/* D62C */, /*28079*/NULL/* D62D */,/*28080*/NULL/* D62E */,/*28081*/NULL/* D62F */,/*28082*/NULL/* D630 */,/*28083*/NULL/* D631 */, /*28084*/NULL/* D632 */,/*28085*/NULL/* D633 */,/*28086*/NULL/* D634 */,/*28087*/NULL/* D635 */, /*28088*/""/* D636 */,/*28089*/NULL/* D637 */,/*28090*/""/* D638 */, /*28091*/""/* D639 */,/*28092*/NULL/* D63A */,/*28093*/NULL/* D63B */,/*28094*/NULL/* D63C */, /*28095*/NULL/* D63D */,/*28096*/NULL/* D63E */,/*28097*/NULL/* D63F */,/*28098*/NULL/* D640 */,/*28099*/NULL/* D641 */, /*28100*/NULL/* D642 */,/*28101*/NULL/* D643 */,/*28102*/NULL/* D644 */,/*28103*/NULL/* D645 */,/*28104*/NULL/* D646 */, /*28105*/NULL/* D647 */,/*28106*/NULL/* D648 */,/*28107*/NULL/* D649 */,/*28108*/NULL/* D64A */,/*28109*/NULL/* D64B */, /*28110*/NULL/* D64C */,/*28111*/NULL/* D64D */,/*28112*/NULL/* D64E */,/*28113*/NULL/* D64F */,/*28114*/NULL/* D650 */, /*28115*/NULL/* D651 */,/*28116*/""/* D652 */,/*28117*/NULL/* D653 */, /*28118*/""/* D654 */,/*28119*/""/* D655 */,/*28120*/NULL/* D656 */, /*28121*/NULL/* D657 */,/*28122*/NULL/* D658 */,/*28123*/NULL/* D659 */,/*28124*/NULL/* D65A */,/*28125*/NULL/* D65B */, /*28126*/NULL/* D65C */,/*28127*/NULL/* D65D */,/*28128*/NULL/* D65E */,/*28129*/NULL/* D65F */,/*28130*/NULL/* D660 */, /*28131*/NULL/* D661 */,/*28132*/NULL/* D662 */,/*28133*/NULL/* D663 */,/*28134*/NULL/* D664 */,/*28135*/NULL/* D665 */, /*28136*/NULL/* D666 */,/*28137*/NULL/* D667 */,/*28138*/NULL/* D668 */,/*28139*/NULL/* D669 */,/*28140*/NULL/* D66A */, /*28141*/NULL/* D66B */,/*28142*/NULL/* D66C */,/*28143*/NULL/* D66D */,/*28144*/""/* D66E */, /*28145*/NULL/* D66F */,/*28146*/""/* D670 */,/*28147*/""/* D671 */, /*28148*/NULL/* D672 */,/*28149*/NULL/* D673 */,/*28150*/NULL/* D674 */,/*28151*/NULL/* D675 */,/*28152*/NULL/* D676 */, /*28153*/NULL/* D677 */,/*28154*/NULL/* D678 */,/*28155*/NULL/* D679 */,/*28156*/NULL/* D67A */,/*28157*/NULL/* D67B */, /*28158*/NULL/* D67C */,/*28159*/NULL/* D67D */,/*28160*/NULL/* D67E */,/*28161*/NULL/* D67F */,/*28162*/NULL/* D680 */, /*28163*/NULL/* D681 */,/*28164*/NULL/* D682 */,/*28165*/NULL/* D683 */,/*28166*/NULL/* D684 */,/*28167*/NULL/* D685 */, /*28168*/NULL/* D686 */,/*28169*/NULL/* D687 */,/*28170*/NULL/* D688 */,/*28171*/NULL/* D689 */, /*28172*/""/* D68A */,/*28173*/NULL/* D68B */,/*28174*/""/* D68C */, /*28175*/""/* D68D */,/*28176*/NULL/* D68E */,/*28177*/NULL/* D68F */,/*28178*/NULL/* D690 */, /*28179*/NULL/* D691 */,/*28180*/NULL/* D692 */,/*28181*/NULL/* D693 */,/*28182*/NULL/* D694 */,/*28183*/NULL/* D695 */, /*28184*/NULL/* D696 */,/*28185*/NULL/* D697 */,/*28186*/NULL/* D698 */,/*28187*/NULL/* D699 */,/*28188*/NULL/* D69A */, /*28189*/NULL/* D69B */,/*28190*/NULL/* D69C */,/*28191*/NULL/* D69D */,/*28192*/NULL/* D69E */,/*28193*/NULL/* D69F */, /*28194*/NULL/* D6A0 */,/*28195*/NULL/* D6A1 */,/*28196*/NULL/* D6A2 */,/*28197*/NULL/* D6A3 */,/*28198*/NULL/* D6A4 */, /*28199*/NULL/* D6A5 */,/*28200*/""/* D6A6 */,/*28201*/NULL/* D6A7 */, /*28202*/""/* D6A8 */,/*28203*/""/* D6A9 */,/*28204*/NULL/* D6AA */, /*28205*/NULL/* D6AB */,/*28206*/NULL/* D6AC */,/*28207*/NULL/* D6AD */,/*28208*/NULL/* D6AE */,/*28209*/NULL/* D6AF */, /*28210*/NULL/* D6B0 */,/*28211*/NULL/* D6B1 */,/*28212*/NULL/* D6B2 */,/*28213*/NULL/* D6B3 */,/*28214*/NULL/* D6B4 */, /*28215*/NULL/* D6B5 */,/*28216*/NULL/* D6B6 */,/*28217*/NULL/* D6B7 */,/*28218*/NULL/* D6B8 */,/*28219*/NULL/* D6B9 */, /*28220*/NULL/* D6BA */,/*28221*/NULL/* D6BB */,/*28222*/NULL/* D6BC */,/*28223*/NULL/* D6BD */,/*28224*/NULL/* D6BE */, /*28225*/NULL/* D6BF */,/*28226*/NULL/* D6C0 */,/*28227*/NULL/* D6C1 */,/*28228*/""/* D6C2 */, /*28229*/NULL/* D6C3 */,/*28230*/""/* D6C4 */,/*28231*/""/* D6C5 */, /*28232*/NULL/* D6C6 */,/*28233*/NULL/* D6C7 */,/*28234*/NULL/* D6C8 */,/*28235*/NULL/* D6C9 */,/*28236*/NULL/* D6CA */, /*28237*/NULL/* D6CB */,/*28238*/NULL/* D6CC */,/*28239*/NULL/* D6CD */,/*28240*/NULL/* D6CE */,/*28241*/NULL/* D6CF */, /*28242*/NULL/* D6D0 */,/*28243*/NULL/* D6D1 */,/*28244*/NULL/* D6D2 */,/*28245*/NULL/* D6D3 */,/*28246*/NULL/* D6D4 */, /*28247*/NULL/* D6D5 */,/*28248*/NULL/* D6D6 */,/*28249*/NULL/* D6D7 */,/*28250*/NULL/* D6D8 */,/*28251*/NULL/* D6D9 */, /*28252*/NULL/* D6DA */,/*28253*/NULL/* D6DB */,/*28254*/NULL/* D6DC */,/*28255*/NULL/* D6DD */, /*28256*/""/* D6DE */,/*28257*/NULL/* D6DF */,/*28258*/""/* D6E0 */, /*28259*/""/* D6E1 */,/*28260*/NULL/* D6E2 */,/*28261*/NULL/* D6E3 */,/*28262*/NULL/* D6E4 */, /*28263*/NULL/* D6E5 */,/*28264*/NULL/* D6E6 */,/*28265*/NULL/* D6E7 */,/*28266*/NULL/* D6E8 */,/*28267*/NULL/* D6E9 */, /*28268*/NULL/* D6EA */,/*28269*/NULL/* D6EB */,/*28270*/NULL/* D6EC */,/*28271*/NULL/* D6ED */,/*28272*/NULL/* D6EE */, /*28273*/NULL/* D6EF */,/*28274*/NULL/* D6F0 */,/*28275*/NULL/* D6F1 */,/*28276*/NULL/* D6F2 */,/*28277*/NULL/* D6F3 */, /*28278*/NULL/* D6F4 */,/*28279*/NULL/* D6F5 */,/*28280*/NULL/* D6F6 */,/*28281*/NULL/* D6F7 */,/*28282*/NULL/* D6F8 */, /*28283*/NULL/* D6F9 */,/*28284*/""/* D6FA */,/*28285*/NULL/* D6FB */, /*28286*/""/* D6FC */,/*28287*/""/* D6FD */,/*28288*/NULL/* D6FE */, /*28289*/NULL/* D6FF */,/*28290*/NULL/* D700 */,/*28291*/NULL/* D701 */,/*28292*/NULL/* D702 */,/*28293*/NULL/* D703 */, /*28294*/NULL/* D704 */,/*28295*/NULL/* D705 */,/*28296*/NULL/* D706 */,/*28297*/NULL/* D707 */,/*28298*/NULL/* D708 */, /*28299*/NULL/* D709 */,/*28300*/NULL/* D70A */,/*28301*/NULL/* D70B */,/*28302*/NULL/* D70C */,/*28303*/NULL/* D70D */, /*28304*/NULL/* D70E */,/*28305*/NULL/* D70F */,/*28306*/NULL/* D710 */,/*28307*/NULL/* D711 */,/*28308*/NULL/* D712 */, /*28309*/NULL/* D713 */,/*28310*/NULL/* D714 */,/*28311*/NULL/* D715 */,/*28312*/""/* D716 */, /*28313*/NULL/* D717 */,/*28314*/""/* D718 */,/*28315*/""/* D719 */, /*28316*/NULL/* D71A */,/*28317*/NULL/* D71B */,/*28318*/NULL/* D71C */,/*28319*/NULL/* D71D */,/*28320*/NULL/* D71E */, /*28321*/NULL/* D71F */,/*28322*/NULL/* D720 */,/*28323*/NULL/* D721 */,/*28324*/NULL/* D722 */,/*28325*/NULL/* D723 */, /*28326*/NULL/* D724 */,/*28327*/NULL/* D725 */,/*28328*/NULL/* D726 */,/*28329*/NULL/* D727 */,/*28330*/NULL/* D728 */, /*28331*/NULL/* D729 */,/*28332*/NULL/* D72A */,/*28333*/NULL/* D72B */,/*28334*/NULL/* D72C */,/*28335*/NULL/* D72D */, /*28336*/NULL/* D72E */,/*28337*/NULL/* D72F */,/*28338*/NULL/* D730 */,/*28339*/NULL/* D731 */, /*28340*/""/* D732 */,/*28341*/NULL/* D733 */,/*28342*/""/* D734 */, /*28343*/""/* D735 */,/*28344*/NULL/* D736 */,/*28345*/NULL/* D737 */,/*28346*/NULL/* D738 */, /*28347*/NULL/* D739 */,/*28348*/NULL/* D73A */,/*28349*/NULL/* D73B */,/*28350*/NULL/* D73C */,/*28351*/NULL/* D73D */, /*28352*/NULL/* D73E */,/*28353*/NULL/* D73F */,/*28354*/NULL/* D740 */,/*28355*/NULL/* D741 */,/*28356*/NULL/* D742 */, /*28357*/NULL/* D743 */,/*28358*/NULL/* D744 */,/*28359*/NULL/* D745 */,/*28360*/NULL/* D746 */,/*28361*/NULL/* D747 */, /*28362*/NULL/* D748 */,/*28363*/NULL/* D749 */,/*28364*/NULL/* D74A */,/*28365*/NULL/* D74B */,/*28366*/NULL/* D74C */, /*28367*/NULL/* D74D */,/*28368*/""/* D74E */,/*28369*/NULL/* D74F */, /*28370*/""/* D750 */,/*28371*/""/* D751 */,/*28372*/NULL/* D752 */, /*28373*/NULL/* D753 */,/*28374*/NULL/* D754 */,/*28375*/NULL/* D755 */,/*28376*/NULL/* D756 */,/*28377*/NULL/* D757 */, /*28378*/NULL/* D758 */,/*28379*/NULL/* D759 */,/*28380*/NULL/* D75A */,/*28381*/NULL/* D75B */,/*28382*/NULL/* D75C */, /*28383*/NULL/* D75D */,/*28384*/NULL/* D75E */,/*28385*/NULL/* D75F */,/*28386*/NULL/* D760 */,/*28387*/NULL/* D761 */, /*28388*/NULL/* D762 */,/*28389*/NULL/* D763 */,/*28390*/NULL/* D764 */,/*28391*/NULL/* D765 */,/*28392*/NULL/* D766 */, /*28393*/NULL/* D767 */,/*28394*/NULL/* D768 */,/*28395*/NULL/* D769 */,/*28396*/""/* D76A */, /*28397*/NULL/* D76B */,/*28398*/""/* D76C */,/*28399*/""/* D76D */, /*28400*/NULL/* D76E */,/*28401*/NULL/* D76F */,/*28402*/NULL/* D770 */,/*28403*/NULL/* D771 */,/*28404*/NULL/* D772 */, /*28405*/NULL/* D773 */,/*28406*/NULL/* D774 */,/*28407*/NULL/* D775 */,/*28408*/NULL/* D776 */,/*28409*/NULL/* D777 */, /*28410*/NULL/* D778 */,/*28411*/NULL/* D779 */,/*28412*/NULL/* D77A */,/*28413*/NULL/* D77B */,/*28414*/NULL/* D77C */, /*28415*/NULL/* D77D */,/*28416*/NULL/* D77E */,/*28417*/NULL/* D77F */,/*28418*/NULL/* D780 */,/*28419*/NULL/* D781 */, /*28420*/NULL/* D782 */,/*28421*/NULL/* D783 */,/*28422*/NULL/* D784 */,/*28423*/NULL/* D785 */, /*28424*/""/* D786 */,/*28425*/NULL/* D787 */,/*28426*/""/* D788 */, /*28427*/""/* D789 */,/*28428*/NULL/* D78A */,/*28429*/NULL/* D78B */,/*28430*/NULL/* D78C */, /*28431*/NULL/* D78D */,/*28432*/NULL/* D78E */,/*28433*/NULL/* D78F */,/*28434*/NULL/* D790 */,/*28435*/NULL/* D791 */, /*28436*/NULL/* D792 */,/*28437*/NULL/* D793 */,/*28438*/NULL/* D794 */,/*28439*/NULL/* D795 */,/*28440*/NULL/* D796 */, /*28441*/NULL/* D797 */,/*28442*/NULL/* D798 */,/*28443*/NULL/* D799 */,/*28444*/NULL/* D79A */,/*28445*/NULL/* D79B */, /*28446*/NULL/* D79C */,/*28447*/NULL/* D79D */,/*28448*/NULL/* D79E */,/*28449*/NULL/* D79F */,/*28450*/NULL/* D7A0 */, /*28451*/NULL/* D7A1 */,/*28452*/""/* D7A2 */,/*28453*/NULL/* D7A3 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*28466*/"HANGUL JUNGSEONG O-YEO"/* D7B0 */,/*28467*/"HANGUL JUNGSEONG O-O-I"/* D7B1 */, /*28468*/"HANGUL JUNGSEONG YO-A"/* D7B2 */,/*28469*/"HANGUL JUNGSEONG YO-AE"/* D7B3 */, /*28470*/"HANGUL JUNGSEONG YO-EO"/* D7B4 */,/*28471*/"HANGUL JUNGSEONG U-YEO"/* D7B5 */, /*28472*/"HANGUL JUNGSEONG U-I-I"/* D7B6 */,/*28473*/"HANGUL JUNGSEONG YU-AE"/* D7B7 */, /*28474*/"HANGUL JUNGSEONG YU-O"/* D7B8 */,/*28475*/"HANGUL JUNGSEONG EU-A"/* D7B9 */, /*28476*/"HANGUL JUNGSEONG EU-EO"/* D7BA */,/*28477*/"HANGUL JUNGSEONG EU-E"/* D7BB */, /*28478*/"HANGUL JUNGSEONG EU-O"/* D7BC */,/*28479*/"HANGUL JUNGSEONG I-YA-O"/* D7BD */, /*28480*/"HANGUL JUNGSEONG I-YAE"/* D7BE */,/*28481*/"HANGUL JUNGSEONG I-YEO"/* D7BF */, /*28482*/"HANGUL JUNGSEONG I-YE"/* D7C0 */,/*28483*/"HANGUL JUNGSEONG I-O-I"/* D7C1 */, /*28484*/"HANGUL JUNGSEONG I-YO"/* D7C2 */,/*28485*/"HANGUL JUNGSEONG I-YU"/* D7C3 */, /*28486*/"HANGUL JUNGSEONG I-I"/* D7C4 */,/*28487*/"HANGUL JUNGSEONG ARAEA-A"/* D7C5 */, /*28488*/"HANGUL JUNGSEONG ARAEA-E"/* D7C6 */,NULL,NULL,NULL,NULL,/*28493*/"HANGUL JONGSEONG NIEUN-RIEUL"/* D7CB */, /*28494*/"HANGUL JONGSEONG NIEUN-CHIEUCH"/* D7CC */,/*28495*/"HANGUL JONGSEONG SSANGTIKEUT"/* D7CD */, /*28496*/"HANGUL JONGSEONG SSANGTIKEUT-PIEUP"/* D7CE */,/*28497*/"HANGUL JONGSEONG TIKEUT-PIEUP"/* D7CF */, /*28498*/"HANGUL JONGSEONG TIKEUT-SIOS"/* D7D0 */,/*28499*/"HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK"/* D7D1 */, /*28500*/"HANGUL JONGSEONG TIKEUT-CIEUC"/* D7D2 */,/*28501*/"HANGUL JONGSEONG TIKEUT-CHIEUCH"/* D7D3 */, /*28502*/"HANGUL JONGSEONG TIKEUT-THIEUTH"/* D7D4 */,/*28503*/"HANGUL JONGSEONG RIEUL-SSANGKIYEOK"/* D7D5 */, /*28504*/"HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH"/* D7D6 */,/*28505*/"HANGUL JONGSEONG SSANGRIEUL-KHIEUKH"/* D7D7 */, /*28506*/"HANGUL JONGSEONG RIEUL-MIEUM-HIEUH"/* D7D8 */,/*28507*/"HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT"/* D7D9 */, /*28508*/"HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH"/* D7DA */,/*28509*/"HANGUL JONGSEONG RIEUL-YESIEUNG"/* D7DB */, /*28510*/"HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH"/* D7DC */,/*28511*/"HANGUL JONGSEONG KAPYEOUNRIEUL"/* D7DD */, /*28512*/"HANGUL JONGSEONG MIEUM-NIEUN"/* D7DE */,/*28513*/"HANGUL JONGSEONG MIEUM-SSANGNIEUN"/* D7DF */, /*28514*/"HANGUL JONGSEONG SSANGMIEUM"/* D7E0 */,/*28515*/"HANGUL JONGSEONG MIEUM-PIEUP-SIOS"/* D7E1 */, /*28516*/"HANGUL JONGSEONG MIEUM-CIEUC"/* D7E2 */,/*28517*/"HANGUL JONGSEONG PIEUP-TIKEUT"/* D7E3 */, /*28518*/"HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH"/* D7E4 */,/*28519*/"HANGUL JONGSEONG PIEUP-MIEUM"/* D7E5 */, /*28520*/"HANGUL JONGSEONG SSANGPIEUP"/* D7E6 */,/*28521*/"HANGUL JONGSEONG PIEUP-SIOS-TIKEUT"/* D7E7 */, /*28522*/"HANGUL JONGSEONG PIEUP-CIEUC"/* D7E8 */,/*28523*/"HANGUL JONGSEONG PIEUP-CHIEUCH"/* D7E9 */, /*28524*/"HANGUL JONGSEONG SIOS-MIEUM"/* D7EA */,/*28525*/"HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP"/* D7EB */, /*28526*/"HANGUL JONGSEONG SSANGSIOS-KIYEOK"/* D7EC */,/*28527*/"HANGUL JONGSEONG SSANGSIOS-TIKEUT"/* D7ED */, /*28528*/"HANGUL JONGSEONG SIOS-PANSIOS"/* D7EE */,/*28529*/"HANGUL JONGSEONG SIOS-CIEUC"/* D7EF */, /*28530*/"HANGUL JONGSEONG SIOS-CHIEUCH"/* D7F0 */,/*28531*/"HANGUL JONGSEONG SIOS-THIEUTH"/* D7F1 */, /*28532*/"HANGUL JONGSEONG SIOS-HIEUH"/* D7F2 */,/*28533*/"HANGUL JONGSEONG PANSIOS-PIEUP"/* D7F3 */, /*28534*/"HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP"/* D7F4 */,/*28535*/"HANGUL JONGSEONG YESIEUNG-MIEUM"/* D7F5 */, /*28536*/"HANGUL JONGSEONG YESIEUNG-HIEUH"/* D7F6 */,/*28537*/"HANGUL JONGSEONG CIEUC-PIEUP"/* D7F7 */, /*28538*/"HANGUL JONGSEONG CIEUC-SSANGPIEUP"/* D7F8 */,/*28539*/"HANGUL JONGSEONG SSANGCIEUC"/* D7F9 */, /*28540*/"HANGUL JONGSEONG PHIEUPH-SIOS"/* D7FA */,/*28541*/"HANGUL JONGSEONG PHIEUPH-THIEUTH"/* D7FB */,NULL,NULL,NULL, NULL,/*28546*/""/* D800 */,/*28547*/""/* DB80 */, /*28548*/""/* DC00 */,/*28549*/""/* E000 */, /*28550*/"CJK COMPATIBILITY IDEOGRAPH-F900"/* F900 */,/*28551*/"CJK COMPATIBILITY IDEOGRAPH-F901"/* F901 */, /*28552*/"CJK COMPATIBILITY IDEOGRAPH-F902"/* F902 */,/*28553*/"CJK COMPATIBILITY IDEOGRAPH-F903"/* F903 */, /*28554*/"CJK COMPATIBILITY IDEOGRAPH-F904"/* F904 */,/*28555*/"CJK COMPATIBILITY IDEOGRAPH-F905"/* F905 */, /*28556*/"CJK COMPATIBILITY IDEOGRAPH-F906"/* F906 */,/*28557*/"CJK COMPATIBILITY IDEOGRAPH-F907"/* F907 */, /*28558*/"CJK COMPATIBILITY IDEOGRAPH-F908"/* F908 */,/*28559*/"CJK COMPATIBILITY IDEOGRAPH-F909"/* F909 */, /*28560*/"CJK COMPATIBILITY IDEOGRAPH-F90A"/* F90A */,/*28561*/"CJK COMPATIBILITY IDEOGRAPH-F90B"/* F90B */, /*28562*/"CJK COMPATIBILITY IDEOGRAPH-F90C"/* F90C */,/*28563*/"CJK COMPATIBILITY IDEOGRAPH-F90D"/* F90D */, /*28564*/"CJK COMPATIBILITY IDEOGRAPH-F90E"/* F90E */,/*28565*/"CJK COMPATIBILITY IDEOGRAPH-F90F"/* F90F */, /*28566*/"CJK COMPATIBILITY IDEOGRAPH-F910"/* F910 */,/*28567*/"CJK COMPATIBILITY IDEOGRAPH-F911"/* F911 */, /*28568*/"CJK COMPATIBILITY IDEOGRAPH-F912"/* F912 */,/*28569*/"CJK COMPATIBILITY IDEOGRAPH-F913"/* F913 */, /*28570*/"CJK COMPATIBILITY IDEOGRAPH-F914"/* F914 */,/*28571*/"CJK COMPATIBILITY IDEOGRAPH-F915"/* F915 */, /*28572*/"CJK COMPATIBILITY IDEOGRAPH-F916"/* F916 */,/*28573*/"CJK COMPATIBILITY IDEOGRAPH-F917"/* F917 */, /*28574*/"CJK COMPATIBILITY IDEOGRAPH-F918"/* F918 */,/*28575*/"CJK COMPATIBILITY IDEOGRAPH-F919"/* F919 */, /*28576*/"CJK COMPATIBILITY IDEOGRAPH-F91A"/* F91A */,/*28577*/"CJK COMPATIBILITY IDEOGRAPH-F91B"/* F91B */, /*28578*/"CJK COMPATIBILITY IDEOGRAPH-F91C"/* F91C */,/*28579*/"CJK COMPATIBILITY IDEOGRAPH-F91D"/* F91D */, /*28580*/"CJK COMPATIBILITY IDEOGRAPH-F91E"/* F91E */,/*28581*/"CJK COMPATIBILITY IDEOGRAPH-F91F"/* F91F */, /*28582*/"CJK COMPATIBILITY IDEOGRAPH-F920"/* F920 */,/*28583*/"CJK COMPATIBILITY IDEOGRAPH-F921"/* F921 */, /*28584*/"CJK COMPATIBILITY IDEOGRAPH-F922"/* F922 */,/*28585*/"CJK COMPATIBILITY IDEOGRAPH-F923"/* F923 */, /*28586*/"CJK COMPATIBILITY IDEOGRAPH-F924"/* F924 */,/*28587*/"CJK COMPATIBILITY IDEOGRAPH-F925"/* F925 */, /*28588*/"CJK COMPATIBILITY IDEOGRAPH-F926"/* F926 */,/*28589*/"CJK COMPATIBILITY IDEOGRAPH-F927"/* F927 */, /*28590*/"CJK COMPATIBILITY IDEOGRAPH-F928"/* F928 */,/*28591*/"CJK COMPATIBILITY IDEOGRAPH-F929"/* F929 */, /*28592*/"CJK COMPATIBILITY IDEOGRAPH-F92A"/* F92A */,/*28593*/"CJK COMPATIBILITY IDEOGRAPH-F92B"/* F92B */, /*28594*/"CJK COMPATIBILITY IDEOGRAPH-F92C"/* F92C */,/*28595*/"CJK COMPATIBILITY IDEOGRAPH-F92D"/* F92D */, /*28596*/"CJK COMPATIBILITY IDEOGRAPH-F92E"/* F92E */,/*28597*/"CJK COMPATIBILITY IDEOGRAPH-F92F"/* F92F */, /*28598*/"CJK COMPATIBILITY IDEOGRAPH-F930"/* F930 */,/*28599*/"CJK COMPATIBILITY IDEOGRAPH-F931"/* F931 */, /*28600*/"CJK COMPATIBILITY IDEOGRAPH-F932"/* F932 */,/*28601*/"CJK COMPATIBILITY IDEOGRAPH-F933"/* F933 */, /*28602*/"CJK COMPATIBILITY IDEOGRAPH-F934"/* F934 */,/*28603*/"CJK COMPATIBILITY IDEOGRAPH-F935"/* F935 */, /*28604*/"CJK COMPATIBILITY IDEOGRAPH-F936"/* F936 */,/*28605*/"CJK COMPATIBILITY IDEOGRAPH-F937"/* F937 */, /*28606*/"CJK COMPATIBILITY IDEOGRAPH-F938"/* F938 */,/*28607*/"CJK COMPATIBILITY IDEOGRAPH-F939"/* F939 */, /*28608*/"CJK COMPATIBILITY IDEOGRAPH-F93A"/* F93A */,/*28609*/"CJK COMPATIBILITY IDEOGRAPH-F93B"/* F93B */, /*28610*/"CJK COMPATIBILITY IDEOGRAPH-F93C"/* F93C */,/*28611*/"CJK COMPATIBILITY IDEOGRAPH-F93D"/* F93D */, /*28612*/"CJK COMPATIBILITY IDEOGRAPH-F93E"/* F93E */,/*28613*/"CJK COMPATIBILITY IDEOGRAPH-F93F"/* F93F */, /*28614*/"CJK COMPATIBILITY IDEOGRAPH-F940"/* F940 */,/*28615*/"CJK COMPATIBILITY IDEOGRAPH-F941"/* F941 */, /*28616*/"CJK COMPATIBILITY IDEOGRAPH-F942"/* F942 */,/*28617*/"CJK COMPATIBILITY IDEOGRAPH-F943"/* F943 */, /*28618*/"CJK COMPATIBILITY IDEOGRAPH-F944"/* F944 */,/*28619*/"CJK COMPATIBILITY IDEOGRAPH-F945"/* F945 */, /*28620*/"CJK COMPATIBILITY IDEOGRAPH-F946"/* F946 */,/*28621*/"CJK COMPATIBILITY IDEOGRAPH-F947"/* F947 */, /*28622*/"CJK COMPATIBILITY IDEOGRAPH-F948"/* F948 */,/*28623*/"CJK COMPATIBILITY IDEOGRAPH-F949"/* F949 */, /*28624*/"CJK COMPATIBILITY IDEOGRAPH-F94A"/* F94A */,/*28625*/"CJK COMPATIBILITY IDEOGRAPH-F94B"/* F94B */, /*28626*/"CJK COMPATIBILITY IDEOGRAPH-F94C"/* F94C */,/*28627*/"CJK COMPATIBILITY IDEOGRAPH-F94D"/* F94D */, /*28628*/"CJK COMPATIBILITY IDEOGRAPH-F94E"/* F94E */,/*28629*/"CJK COMPATIBILITY IDEOGRAPH-F94F"/* F94F */, /*28630*/"CJK COMPATIBILITY IDEOGRAPH-F950"/* F950 */,/*28631*/"CJK COMPATIBILITY IDEOGRAPH-F951"/* F951 */, /*28632*/"CJK COMPATIBILITY IDEOGRAPH-F952"/* F952 */,/*28633*/"CJK COMPATIBILITY IDEOGRAPH-F953"/* F953 */, /*28634*/"CJK COMPATIBILITY IDEOGRAPH-F954"/* F954 */,/*28635*/"CJK COMPATIBILITY IDEOGRAPH-F955"/* F955 */, /*28636*/"CJK COMPATIBILITY IDEOGRAPH-F956"/* F956 */,/*28637*/"CJK COMPATIBILITY IDEOGRAPH-F957"/* F957 */, /*28638*/"CJK COMPATIBILITY IDEOGRAPH-F958"/* F958 */,/*28639*/"CJK COMPATIBILITY IDEOGRAPH-F959"/* F959 */, /*28640*/"CJK COMPATIBILITY IDEOGRAPH-F95A"/* F95A */,/*28641*/"CJK COMPATIBILITY IDEOGRAPH-F95B"/* F95B */, /*28642*/"CJK COMPATIBILITY IDEOGRAPH-F95C"/* F95C */,/*28643*/"CJK COMPATIBILITY IDEOGRAPH-F95D"/* F95D */, /*28644*/"CJK COMPATIBILITY IDEOGRAPH-F95E"/* F95E */,/*28645*/"CJK COMPATIBILITY IDEOGRAPH-F95F"/* F95F */, /*28646*/"CJK COMPATIBILITY IDEOGRAPH-F960"/* F960 */,/*28647*/"CJK COMPATIBILITY IDEOGRAPH-F961"/* F961 */, /*28648*/"CJK COMPATIBILITY IDEOGRAPH-F962"/* F962 */,/*28649*/"CJK COMPATIBILITY IDEOGRAPH-F963"/* F963 */, /*28650*/"CJK COMPATIBILITY IDEOGRAPH-F964"/* F964 */,/*28651*/"CJK COMPATIBILITY IDEOGRAPH-F965"/* F965 */, /*28652*/"CJK COMPATIBILITY IDEOGRAPH-F966"/* F966 */,/*28653*/"CJK COMPATIBILITY IDEOGRAPH-F967"/* F967 */, /*28654*/"CJK COMPATIBILITY IDEOGRAPH-F968"/* F968 */,/*28655*/"CJK COMPATIBILITY IDEOGRAPH-F969"/* F969 */, /*28656*/"CJK COMPATIBILITY IDEOGRAPH-F96A"/* F96A */,/*28657*/"CJK COMPATIBILITY IDEOGRAPH-F96B"/* F96B */, /*28658*/"CJK COMPATIBILITY IDEOGRAPH-F96C"/* F96C */,/*28659*/"CJK COMPATIBILITY IDEOGRAPH-F96D"/* F96D */, /*28660*/"CJK COMPATIBILITY IDEOGRAPH-F96E"/* F96E */,/*28661*/"CJK COMPATIBILITY IDEOGRAPH-F96F"/* F96F */, /*28662*/"CJK COMPATIBILITY IDEOGRAPH-F970"/* F970 */,/*28663*/"CJK COMPATIBILITY IDEOGRAPH-F971"/* F971 */, /*28664*/"CJK COMPATIBILITY IDEOGRAPH-F972"/* F972 */,/*28665*/"CJK COMPATIBILITY IDEOGRAPH-F973"/* F973 */, /*28666*/"CJK COMPATIBILITY IDEOGRAPH-F974"/* F974 */,/*28667*/"CJK COMPATIBILITY IDEOGRAPH-F975"/* F975 */, /*28668*/"CJK COMPATIBILITY IDEOGRAPH-F976"/* F976 */,/*28669*/"CJK COMPATIBILITY IDEOGRAPH-F977"/* F977 */, /*28670*/"CJK COMPATIBILITY IDEOGRAPH-F978"/* F978 */,/*28671*/"CJK COMPATIBILITY IDEOGRAPH-F979"/* F979 */, /*28672*/"CJK COMPATIBILITY IDEOGRAPH-F97A"/* F97A */,/*28673*/"CJK COMPATIBILITY IDEOGRAPH-F97B"/* F97B */, /*28674*/"CJK COMPATIBILITY IDEOGRAPH-F97C"/* F97C */,/*28675*/"CJK COMPATIBILITY IDEOGRAPH-F97D"/* F97D */, /*28676*/"CJK COMPATIBILITY IDEOGRAPH-F97E"/* F97E */,/*28677*/"CJK COMPATIBILITY IDEOGRAPH-F97F"/* F97F */, /*28678*/"CJK COMPATIBILITY IDEOGRAPH-F980"/* F980 */,/*28679*/"CJK COMPATIBILITY IDEOGRAPH-F981"/* F981 */, /*28680*/"CJK COMPATIBILITY IDEOGRAPH-F982"/* F982 */,/*28681*/"CJK COMPATIBILITY IDEOGRAPH-F983"/* F983 */, /*28682*/"CJK COMPATIBILITY IDEOGRAPH-F984"/* F984 */,/*28683*/"CJK COMPATIBILITY IDEOGRAPH-F985"/* F985 */, /*28684*/"CJK COMPATIBILITY IDEOGRAPH-F986"/* F986 */,/*28685*/"CJK COMPATIBILITY IDEOGRAPH-F987"/* F987 */, /*28686*/"CJK COMPATIBILITY IDEOGRAPH-F988"/* F988 */,/*28687*/"CJK COMPATIBILITY IDEOGRAPH-F989"/* F989 */, /*28688*/"CJK COMPATIBILITY IDEOGRAPH-F98A"/* F98A */,/*28689*/"CJK COMPATIBILITY IDEOGRAPH-F98B"/* F98B */, /*28690*/"CJK COMPATIBILITY IDEOGRAPH-F98C"/* F98C */,/*28691*/"CJK COMPATIBILITY IDEOGRAPH-F98D"/* F98D */, /*28692*/"CJK COMPATIBILITY IDEOGRAPH-F98E"/* F98E */,/*28693*/"CJK COMPATIBILITY IDEOGRAPH-F98F"/* F98F */, /*28694*/"CJK COMPATIBILITY IDEOGRAPH-F990"/* F990 */,/*28695*/"CJK COMPATIBILITY IDEOGRAPH-F991"/* F991 */, /*28696*/"CJK COMPATIBILITY IDEOGRAPH-F992"/* F992 */,/*28697*/"CJK COMPATIBILITY IDEOGRAPH-F993"/* F993 */, /*28698*/"CJK COMPATIBILITY IDEOGRAPH-F994"/* F994 */,/*28699*/"CJK COMPATIBILITY IDEOGRAPH-F995"/* F995 */, /*28700*/"CJK COMPATIBILITY IDEOGRAPH-F996"/* F996 */,/*28701*/"CJK COMPATIBILITY IDEOGRAPH-F997"/* F997 */, /*28702*/"CJK COMPATIBILITY IDEOGRAPH-F998"/* F998 */,/*28703*/"CJK COMPATIBILITY IDEOGRAPH-F999"/* F999 */, /*28704*/"CJK COMPATIBILITY IDEOGRAPH-F99A"/* F99A */,/*28705*/"CJK COMPATIBILITY IDEOGRAPH-F99B"/* F99B */, /*28706*/"CJK COMPATIBILITY IDEOGRAPH-F99C"/* F99C */,/*28707*/"CJK COMPATIBILITY IDEOGRAPH-F99D"/* F99D */, /*28708*/"CJK COMPATIBILITY IDEOGRAPH-F99E"/* F99E */,/*28709*/"CJK COMPATIBILITY IDEOGRAPH-F99F"/* F99F */, /*28710*/"CJK COMPATIBILITY IDEOGRAPH-F9A0"/* F9A0 */,/*28711*/"CJK COMPATIBILITY IDEOGRAPH-F9A1"/* F9A1 */, /*28712*/"CJK COMPATIBILITY IDEOGRAPH-F9A2"/* F9A2 */,/*28713*/"CJK COMPATIBILITY IDEOGRAPH-F9A3"/* F9A3 */, /*28714*/"CJK COMPATIBILITY IDEOGRAPH-F9A4"/* F9A4 */,/*28715*/"CJK COMPATIBILITY IDEOGRAPH-F9A5"/* F9A5 */, /*28716*/"CJK COMPATIBILITY IDEOGRAPH-F9A6"/* F9A6 */,/*28717*/"CJK COMPATIBILITY IDEOGRAPH-F9A7"/* F9A7 */, /*28718*/"CJK COMPATIBILITY IDEOGRAPH-F9A8"/* F9A8 */,/*28719*/"CJK COMPATIBILITY IDEOGRAPH-F9A9"/* F9A9 */, /*28720*/"CJK COMPATIBILITY IDEOGRAPH-F9AA"/* F9AA */,/*28721*/"CJK COMPATIBILITY IDEOGRAPH-F9AB"/* F9AB */, /*28722*/"CJK COMPATIBILITY IDEOGRAPH-F9AC"/* F9AC */,/*28723*/"CJK COMPATIBILITY IDEOGRAPH-F9AD"/* F9AD */, /*28724*/"CJK COMPATIBILITY IDEOGRAPH-F9AE"/* F9AE */,/*28725*/"CJK COMPATIBILITY IDEOGRAPH-F9AF"/* F9AF */, /*28726*/"CJK COMPATIBILITY IDEOGRAPH-F9B0"/* F9B0 */,/*28727*/"CJK COMPATIBILITY IDEOGRAPH-F9B1"/* F9B1 */, /*28728*/"CJK COMPATIBILITY IDEOGRAPH-F9B2"/* F9B2 */,/*28729*/"CJK COMPATIBILITY IDEOGRAPH-F9B3"/* F9B3 */, /*28730*/"CJK COMPATIBILITY IDEOGRAPH-F9B4"/* F9B4 */,/*28731*/"CJK COMPATIBILITY IDEOGRAPH-F9B5"/* F9B5 */, /*28732*/"CJK COMPATIBILITY IDEOGRAPH-F9B6"/* F9B6 */,/*28733*/"CJK COMPATIBILITY IDEOGRAPH-F9B7"/* F9B7 */, /*28734*/"CJK COMPATIBILITY IDEOGRAPH-F9B8"/* F9B8 */,/*28735*/"CJK COMPATIBILITY IDEOGRAPH-F9B9"/* F9B9 */, /*28736*/"CJK COMPATIBILITY IDEOGRAPH-F9BA"/* F9BA */,/*28737*/"CJK COMPATIBILITY IDEOGRAPH-F9BB"/* F9BB */, /*28738*/"CJK COMPATIBILITY IDEOGRAPH-F9BC"/* F9BC */,/*28739*/"CJK COMPATIBILITY IDEOGRAPH-F9BD"/* F9BD */, /*28740*/"CJK COMPATIBILITY IDEOGRAPH-F9BE"/* F9BE */,/*28741*/"CJK COMPATIBILITY IDEOGRAPH-F9BF"/* F9BF */, /*28742*/"CJK COMPATIBILITY IDEOGRAPH-F9C0"/* F9C0 */,/*28743*/"CJK COMPATIBILITY IDEOGRAPH-F9C1"/* F9C1 */, /*28744*/"CJK COMPATIBILITY IDEOGRAPH-F9C2"/* F9C2 */,/*28745*/"CJK COMPATIBILITY IDEOGRAPH-F9C3"/* F9C3 */, /*28746*/"CJK COMPATIBILITY IDEOGRAPH-F9C4"/* F9C4 */,/*28747*/"CJK COMPATIBILITY IDEOGRAPH-F9C5"/* F9C5 */, /*28748*/"CJK COMPATIBILITY IDEOGRAPH-F9C6"/* F9C6 */,/*28749*/"CJK COMPATIBILITY IDEOGRAPH-F9C7"/* F9C7 */, /*28750*/"CJK COMPATIBILITY IDEOGRAPH-F9C8"/* F9C8 */,/*28751*/"CJK COMPATIBILITY IDEOGRAPH-F9C9"/* F9C9 */, /*28752*/"CJK COMPATIBILITY IDEOGRAPH-F9CA"/* F9CA */,/*28753*/"CJK COMPATIBILITY IDEOGRAPH-F9CB"/* F9CB */, /*28754*/"CJK COMPATIBILITY IDEOGRAPH-F9CC"/* F9CC */,/*28755*/"CJK COMPATIBILITY IDEOGRAPH-F9CD"/* F9CD */, /*28756*/"CJK COMPATIBILITY IDEOGRAPH-F9CE"/* F9CE */,/*28757*/"CJK COMPATIBILITY IDEOGRAPH-F9CF"/* F9CF */, /*28758*/"CJK COMPATIBILITY IDEOGRAPH-F9D0"/* F9D0 */,/*28759*/"CJK COMPATIBILITY IDEOGRAPH-F9D1"/* F9D1 */, /*28760*/"CJK COMPATIBILITY IDEOGRAPH-F9D2"/* F9D2 */,/*28761*/"CJK COMPATIBILITY IDEOGRAPH-F9D3"/* F9D3 */, /*28762*/"CJK COMPATIBILITY IDEOGRAPH-F9D4"/* F9D4 */,/*28763*/"CJK COMPATIBILITY IDEOGRAPH-F9D5"/* F9D5 */, /*28764*/"CJK COMPATIBILITY IDEOGRAPH-F9D6"/* F9D6 */,/*28765*/"CJK COMPATIBILITY IDEOGRAPH-F9D7"/* F9D7 */, /*28766*/"CJK COMPATIBILITY IDEOGRAPH-F9D8"/* F9D8 */,/*28767*/"CJK COMPATIBILITY IDEOGRAPH-F9D9"/* F9D9 */, /*28768*/"CJK COMPATIBILITY IDEOGRAPH-F9DA"/* F9DA */,/*28769*/"CJK COMPATIBILITY IDEOGRAPH-F9DB"/* F9DB */, /*28770*/"CJK COMPATIBILITY IDEOGRAPH-F9DC"/* F9DC */,/*28771*/"CJK COMPATIBILITY IDEOGRAPH-F9DD"/* F9DD */, /*28772*/"CJK COMPATIBILITY IDEOGRAPH-F9DE"/* F9DE */,/*28773*/"CJK COMPATIBILITY IDEOGRAPH-F9DF"/* F9DF */, /*28774*/"CJK COMPATIBILITY IDEOGRAPH-F9E0"/* F9E0 */,/*28775*/"CJK COMPATIBILITY IDEOGRAPH-F9E1"/* F9E1 */, /*28776*/"CJK COMPATIBILITY IDEOGRAPH-F9E2"/* F9E2 */,/*28777*/"CJK COMPATIBILITY IDEOGRAPH-F9E3"/* F9E3 */, /*28778*/"CJK COMPATIBILITY IDEOGRAPH-F9E4"/* F9E4 */,/*28779*/"CJK COMPATIBILITY IDEOGRAPH-F9E5"/* F9E5 */, /*28780*/"CJK COMPATIBILITY IDEOGRAPH-F9E6"/* F9E6 */,/*28781*/"CJK COMPATIBILITY IDEOGRAPH-F9E7"/* F9E7 */, /*28782*/"CJK COMPATIBILITY IDEOGRAPH-F9E8"/* F9E8 */,/*28783*/"CJK COMPATIBILITY IDEOGRAPH-F9E9"/* F9E9 */, /*28784*/"CJK COMPATIBILITY IDEOGRAPH-F9EA"/* F9EA */,/*28785*/"CJK COMPATIBILITY IDEOGRAPH-F9EB"/* F9EB */, /*28786*/"CJK COMPATIBILITY IDEOGRAPH-F9EC"/* F9EC */,/*28787*/"CJK COMPATIBILITY IDEOGRAPH-F9ED"/* F9ED */, /*28788*/"CJK COMPATIBILITY IDEOGRAPH-F9EE"/* F9EE */,/*28789*/"CJK COMPATIBILITY IDEOGRAPH-F9EF"/* F9EF */, /*28790*/"CJK COMPATIBILITY IDEOGRAPH-F9F0"/* F9F0 */,/*28791*/"CJK COMPATIBILITY IDEOGRAPH-F9F1"/* F9F1 */, /*28792*/"CJK COMPATIBILITY IDEOGRAPH-F9F2"/* F9F2 */,/*28793*/"CJK COMPATIBILITY IDEOGRAPH-F9F3"/* F9F3 */, /*28794*/"CJK COMPATIBILITY IDEOGRAPH-F9F4"/* F9F4 */,/*28795*/"CJK COMPATIBILITY IDEOGRAPH-F9F5"/* F9F5 */, /*28796*/"CJK COMPATIBILITY IDEOGRAPH-F9F6"/* F9F6 */,/*28797*/"CJK COMPATIBILITY IDEOGRAPH-F9F7"/* F9F7 */, /*28798*/"CJK COMPATIBILITY IDEOGRAPH-F9F8"/* F9F8 */,/*28799*/"CJK COMPATIBILITY IDEOGRAPH-F9F9"/* F9F9 */, /*28800*/"CJK COMPATIBILITY IDEOGRAPH-F9FA"/* F9FA */,/*28801*/"CJK COMPATIBILITY IDEOGRAPH-F9FB"/* F9FB */, /*28802*/"CJK COMPATIBILITY IDEOGRAPH-F9FC"/* F9FC */,/*28803*/"CJK COMPATIBILITY IDEOGRAPH-F9FD"/* F9FD */, /*28804*/"CJK COMPATIBILITY IDEOGRAPH-F9FE"/* F9FE */,/*28805*/"CJK COMPATIBILITY IDEOGRAPH-F9FF"/* F9FF */, /*28806*/"CJK COMPATIBILITY IDEOGRAPH-FA00"/* FA00 */,/*28807*/"CJK COMPATIBILITY IDEOGRAPH-FA01"/* FA01 */, /*28808*/"CJK COMPATIBILITY IDEOGRAPH-FA02"/* FA02 */,/*28809*/"CJK COMPATIBILITY IDEOGRAPH-FA03"/* FA03 */, /*28810*/"CJK COMPATIBILITY IDEOGRAPH-FA04"/* FA04 */,/*28811*/"CJK COMPATIBILITY IDEOGRAPH-FA05"/* FA05 */, /*28812*/"CJK COMPATIBILITY IDEOGRAPH-FA06"/* FA06 */,/*28813*/"CJK COMPATIBILITY IDEOGRAPH-FA07"/* FA07 */, /*28814*/"CJK COMPATIBILITY IDEOGRAPH-FA08"/* FA08 */,/*28815*/"CJK COMPATIBILITY IDEOGRAPH-FA09"/* FA09 */, /*28816*/"CJK COMPATIBILITY IDEOGRAPH-FA0A"/* FA0A */,/*28817*/"CJK COMPATIBILITY IDEOGRAPH-FA0B"/* FA0B */, /*28818*/"CJK COMPATIBILITY IDEOGRAPH-FA0C"/* FA0C */,/*28819*/"CJK COMPATIBILITY IDEOGRAPH-FA0D"/* FA0D */, /*28820*/"CJK COMPATIBILITY IDEOGRAPH-FA0E"/* FA0E */,/*28821*/"CJK COMPATIBILITY IDEOGRAPH-FA0F"/* FA0F */, /*28822*/"CJK COMPATIBILITY IDEOGRAPH-FA10"/* FA10 */,/*28823*/"CJK COMPATIBILITY IDEOGRAPH-FA11"/* FA11 */, /*28824*/"CJK COMPATIBILITY IDEOGRAPH-FA12"/* FA12 */,/*28825*/"CJK COMPATIBILITY IDEOGRAPH-FA13"/* FA13 */, /*28826*/"CJK COMPATIBILITY IDEOGRAPH-FA14"/* FA14 */,/*28827*/"CJK COMPATIBILITY IDEOGRAPH-FA15"/* FA15 */, /*28828*/"CJK COMPATIBILITY IDEOGRAPH-FA16"/* FA16 */,/*28829*/"CJK COMPATIBILITY IDEOGRAPH-FA17"/* FA17 */, /*28830*/"CJK COMPATIBILITY IDEOGRAPH-FA18"/* FA18 */,/*28831*/"CJK COMPATIBILITY IDEOGRAPH-FA19"/* FA19 */, /*28832*/"CJK COMPATIBILITY IDEOGRAPH-FA1A"/* FA1A */,/*28833*/"CJK COMPATIBILITY IDEOGRAPH-FA1B"/* FA1B */, /*28834*/"CJK COMPATIBILITY IDEOGRAPH-FA1C"/* FA1C */,/*28835*/"CJK COMPATIBILITY IDEOGRAPH-FA1D"/* FA1D */, /*28836*/"CJK COMPATIBILITY IDEOGRAPH-FA1E"/* FA1E */,/*28837*/"CJK COMPATIBILITY IDEOGRAPH-FA1F"/* FA1F */, /*28838*/"CJK COMPATIBILITY IDEOGRAPH-FA20"/* FA20 */,/*28839*/"CJK COMPATIBILITY IDEOGRAPH-FA21"/* FA21 */, /*28840*/"CJK COMPATIBILITY IDEOGRAPH-FA22"/* FA22 */,/*28841*/"CJK COMPATIBILITY IDEOGRAPH-FA23"/* FA23 */, /*28842*/"CJK COMPATIBILITY IDEOGRAPH-FA24"/* FA24 */,/*28843*/"CJK COMPATIBILITY IDEOGRAPH-FA25"/* FA25 */, /*28844*/"CJK COMPATIBILITY IDEOGRAPH-FA26"/* FA26 */,/*28845*/"CJK COMPATIBILITY IDEOGRAPH-FA27"/* FA27 */, /*28846*/"CJK COMPATIBILITY IDEOGRAPH-FA28"/* FA28 */,/*28847*/"CJK COMPATIBILITY IDEOGRAPH-FA29"/* FA29 */, /*28848*/"CJK COMPATIBILITY IDEOGRAPH-FA2A"/* FA2A */,/*28849*/"CJK COMPATIBILITY IDEOGRAPH-FA2B"/* FA2B */, /*28850*/"CJK COMPATIBILITY IDEOGRAPH-FA2C"/* FA2C */,/*28851*/"CJK COMPATIBILITY IDEOGRAPH-FA2D"/* FA2D */, /*28852*/"CJK COMPATIBILITY IDEOGRAPH-FA2E"/* FA2E */,/*28853*/"CJK COMPATIBILITY IDEOGRAPH-FA2F"/* FA2F */, /*28854*/"CJK COMPATIBILITY IDEOGRAPH-FA30"/* FA30 */,/*28855*/"CJK COMPATIBILITY IDEOGRAPH-FA31"/* FA31 */, /*28856*/"CJK COMPATIBILITY IDEOGRAPH-FA32"/* FA32 */,/*28857*/"CJK COMPATIBILITY IDEOGRAPH-FA33"/* FA33 */, /*28858*/"CJK COMPATIBILITY IDEOGRAPH-FA34"/* FA34 */,/*28859*/"CJK COMPATIBILITY IDEOGRAPH-FA35"/* FA35 */, /*28860*/"CJK COMPATIBILITY IDEOGRAPH-FA36"/* FA36 */,/*28861*/"CJK COMPATIBILITY IDEOGRAPH-FA37"/* FA37 */, /*28862*/"CJK COMPATIBILITY IDEOGRAPH-FA38"/* FA38 */,/*28863*/"CJK COMPATIBILITY IDEOGRAPH-FA39"/* FA39 */, /*28864*/"CJK COMPATIBILITY IDEOGRAPH-FA3A"/* FA3A */,/*28865*/"CJK COMPATIBILITY IDEOGRAPH-FA3B"/* FA3B */, /*28866*/"CJK COMPATIBILITY IDEOGRAPH-FA3C"/* FA3C */,/*28867*/"CJK COMPATIBILITY IDEOGRAPH-FA3D"/* FA3D */, /*28868*/"CJK COMPATIBILITY IDEOGRAPH-FA3E"/* FA3E */,/*28869*/"CJK COMPATIBILITY IDEOGRAPH-FA3F"/* FA3F */, /*28870*/"CJK COMPATIBILITY IDEOGRAPH-FA40"/* FA40 */,/*28871*/"CJK COMPATIBILITY IDEOGRAPH-FA41"/* FA41 */, /*28872*/"CJK COMPATIBILITY IDEOGRAPH-FA42"/* FA42 */,/*28873*/"CJK COMPATIBILITY IDEOGRAPH-FA43"/* FA43 */, /*28874*/"CJK COMPATIBILITY IDEOGRAPH-FA44"/* FA44 */,/*28875*/"CJK COMPATIBILITY IDEOGRAPH-FA45"/* FA45 */, /*28876*/"CJK COMPATIBILITY IDEOGRAPH-FA46"/* FA46 */,/*28877*/"CJK COMPATIBILITY IDEOGRAPH-FA47"/* FA47 */, /*28878*/"CJK COMPATIBILITY IDEOGRAPH-FA48"/* FA48 */,/*28879*/"CJK COMPATIBILITY IDEOGRAPH-FA49"/* FA49 */, /*28880*/"CJK COMPATIBILITY IDEOGRAPH-FA4A"/* FA4A */,/*28881*/"CJK COMPATIBILITY IDEOGRAPH-FA4B"/* FA4B */, /*28882*/"CJK COMPATIBILITY IDEOGRAPH-FA4C"/* FA4C */,/*28883*/"CJK COMPATIBILITY IDEOGRAPH-FA4D"/* FA4D */, /*28884*/"CJK COMPATIBILITY IDEOGRAPH-FA4E"/* FA4E */,/*28885*/"CJK COMPATIBILITY IDEOGRAPH-FA4F"/* FA4F */, /*28886*/"CJK COMPATIBILITY IDEOGRAPH-FA50"/* FA50 */,/*28887*/"CJK COMPATIBILITY IDEOGRAPH-FA51"/* FA51 */, /*28888*/"CJK COMPATIBILITY IDEOGRAPH-FA52"/* FA52 */,/*28889*/"CJK COMPATIBILITY IDEOGRAPH-FA53"/* FA53 */, /*28890*/"CJK COMPATIBILITY IDEOGRAPH-FA54"/* FA54 */,/*28891*/"CJK COMPATIBILITY IDEOGRAPH-FA55"/* FA55 */, /*28892*/"CJK COMPATIBILITY IDEOGRAPH-FA56"/* FA56 */,/*28893*/"CJK COMPATIBILITY IDEOGRAPH-FA57"/* FA57 */, /*28894*/"CJK COMPATIBILITY IDEOGRAPH-FA58"/* FA58 */,/*28895*/"CJK COMPATIBILITY IDEOGRAPH-FA59"/* FA59 */, /*28896*/"CJK COMPATIBILITY IDEOGRAPH-FA5A"/* FA5A */,/*28897*/"CJK COMPATIBILITY IDEOGRAPH-FA5B"/* FA5B */, /*28898*/"CJK COMPATIBILITY IDEOGRAPH-FA5C"/* FA5C */,/*28899*/"CJK COMPATIBILITY IDEOGRAPH-FA5D"/* FA5D */, /*28900*/"CJK COMPATIBILITY IDEOGRAPH-FA5E"/* FA5E */,/*28901*/"CJK COMPATIBILITY IDEOGRAPH-FA5F"/* FA5F */, /*28902*/"CJK COMPATIBILITY IDEOGRAPH-FA60"/* FA60 */,/*28903*/"CJK COMPATIBILITY IDEOGRAPH-FA61"/* FA61 */, /*28904*/"CJK COMPATIBILITY IDEOGRAPH-FA62"/* FA62 */,/*28905*/"CJK COMPATIBILITY IDEOGRAPH-FA63"/* FA63 */, /*28906*/"CJK COMPATIBILITY IDEOGRAPH-FA64"/* FA64 */,/*28907*/"CJK COMPATIBILITY IDEOGRAPH-FA65"/* FA65 */, /*28908*/"CJK COMPATIBILITY IDEOGRAPH-FA66"/* FA66 */,/*28909*/"CJK COMPATIBILITY IDEOGRAPH-FA67"/* FA67 */, /*28910*/"CJK COMPATIBILITY IDEOGRAPH-FA68"/* FA68 */,/*28911*/"CJK COMPATIBILITY IDEOGRAPH-FA69"/* FA69 */, /*28912*/"CJK COMPATIBILITY IDEOGRAPH-FA6A"/* FA6A */,/*28913*/"CJK COMPATIBILITY IDEOGRAPH-FA6B"/* FA6B */, /*28914*/"CJK COMPATIBILITY IDEOGRAPH-FA6C"/* FA6C */,/*28915*/"CJK COMPATIBILITY IDEOGRAPH-FA6D"/* FA6D */,NULL,NULL, /*28918*/"CJK COMPATIBILITY IDEOGRAPH-FA70"/* FA70 */,/*28919*/"CJK COMPATIBILITY IDEOGRAPH-FA71"/* FA71 */, /*28920*/"CJK COMPATIBILITY IDEOGRAPH-FA72"/* FA72 */,/*28921*/"CJK COMPATIBILITY IDEOGRAPH-FA73"/* FA73 */, /*28922*/"CJK COMPATIBILITY IDEOGRAPH-FA74"/* FA74 */,/*28923*/"CJK COMPATIBILITY IDEOGRAPH-FA75"/* FA75 */, /*28924*/"CJK COMPATIBILITY IDEOGRAPH-FA76"/* FA76 */,/*28925*/"CJK COMPATIBILITY IDEOGRAPH-FA77"/* FA77 */, /*28926*/"CJK COMPATIBILITY IDEOGRAPH-FA78"/* FA78 */,/*28927*/"CJK COMPATIBILITY IDEOGRAPH-FA79"/* FA79 */, /*28928*/"CJK COMPATIBILITY IDEOGRAPH-FA7A"/* FA7A */,/*28929*/"CJK COMPATIBILITY IDEOGRAPH-FA7B"/* FA7B */, /*28930*/"CJK COMPATIBILITY IDEOGRAPH-FA7C"/* FA7C */,/*28931*/"CJK COMPATIBILITY IDEOGRAPH-FA7D"/* FA7D */, /*28932*/"CJK COMPATIBILITY IDEOGRAPH-FA7E"/* FA7E */,/*28933*/"CJK COMPATIBILITY IDEOGRAPH-FA7F"/* FA7F */, /*28934*/"CJK COMPATIBILITY IDEOGRAPH-FA80"/* FA80 */,/*28935*/"CJK COMPATIBILITY IDEOGRAPH-FA81"/* FA81 */, /*28936*/"CJK COMPATIBILITY IDEOGRAPH-FA82"/* FA82 */,/*28937*/"CJK COMPATIBILITY IDEOGRAPH-FA83"/* FA83 */, /*28938*/"CJK COMPATIBILITY IDEOGRAPH-FA84"/* FA84 */,/*28939*/"CJK COMPATIBILITY IDEOGRAPH-FA85"/* FA85 */, /*28940*/"CJK COMPATIBILITY IDEOGRAPH-FA86"/* FA86 */,/*28941*/"CJK COMPATIBILITY IDEOGRAPH-FA87"/* FA87 */, /*28942*/"CJK COMPATIBILITY IDEOGRAPH-FA88"/* FA88 */,/*28943*/"CJK COMPATIBILITY IDEOGRAPH-FA89"/* FA89 */, /*28944*/"CJK COMPATIBILITY IDEOGRAPH-FA8A"/* FA8A */,/*28945*/"CJK COMPATIBILITY IDEOGRAPH-FA8B"/* FA8B */, /*28946*/"CJK COMPATIBILITY IDEOGRAPH-FA8C"/* FA8C */,/*28947*/"CJK COMPATIBILITY IDEOGRAPH-FA8D"/* FA8D */, /*28948*/"CJK COMPATIBILITY IDEOGRAPH-FA8E"/* FA8E */,/*28949*/"CJK COMPATIBILITY IDEOGRAPH-FA8F"/* FA8F */, /*28950*/"CJK COMPATIBILITY IDEOGRAPH-FA90"/* FA90 */,/*28951*/"CJK COMPATIBILITY IDEOGRAPH-FA91"/* FA91 */, /*28952*/"CJK COMPATIBILITY IDEOGRAPH-FA92"/* FA92 */,/*28953*/"CJK COMPATIBILITY IDEOGRAPH-FA93"/* FA93 */, /*28954*/"CJK COMPATIBILITY IDEOGRAPH-FA94"/* FA94 */,/*28955*/"CJK COMPATIBILITY IDEOGRAPH-FA95"/* FA95 */, /*28956*/"CJK COMPATIBILITY IDEOGRAPH-FA96"/* FA96 */,/*28957*/"CJK COMPATIBILITY IDEOGRAPH-FA97"/* FA97 */, /*28958*/"CJK COMPATIBILITY IDEOGRAPH-FA98"/* FA98 */,/*28959*/"CJK COMPATIBILITY IDEOGRAPH-FA99"/* FA99 */, /*28960*/"CJK COMPATIBILITY IDEOGRAPH-FA9A"/* FA9A */,/*28961*/"CJK COMPATIBILITY IDEOGRAPH-FA9B"/* FA9B */, /*28962*/"CJK COMPATIBILITY IDEOGRAPH-FA9C"/* FA9C */,/*28963*/"CJK COMPATIBILITY IDEOGRAPH-FA9D"/* FA9D */, /*28964*/"CJK COMPATIBILITY IDEOGRAPH-FA9E"/* FA9E */,/*28965*/"CJK COMPATIBILITY IDEOGRAPH-FA9F"/* FA9F */, /*28966*/"CJK COMPATIBILITY IDEOGRAPH-FAA0"/* FAA0 */,/*28967*/"CJK COMPATIBILITY IDEOGRAPH-FAA1"/* FAA1 */, /*28968*/"CJK COMPATIBILITY IDEOGRAPH-FAA2"/* FAA2 */,/*28969*/"CJK COMPATIBILITY IDEOGRAPH-FAA3"/* FAA3 */, /*28970*/"CJK COMPATIBILITY IDEOGRAPH-FAA4"/* FAA4 */,/*28971*/"CJK COMPATIBILITY IDEOGRAPH-FAA5"/* FAA5 */, /*28972*/"CJK COMPATIBILITY IDEOGRAPH-FAA6"/* FAA6 */,/*28973*/"CJK COMPATIBILITY IDEOGRAPH-FAA7"/* FAA7 */, /*28974*/"CJK COMPATIBILITY IDEOGRAPH-FAA8"/* FAA8 */,/*28975*/"CJK COMPATIBILITY IDEOGRAPH-FAA9"/* FAA9 */, /*28976*/"CJK COMPATIBILITY IDEOGRAPH-FAAA"/* FAAA */,/*28977*/"CJK COMPATIBILITY IDEOGRAPH-FAAB"/* FAAB */, /*28978*/"CJK COMPATIBILITY IDEOGRAPH-FAAC"/* FAAC */,/*28979*/"CJK COMPATIBILITY IDEOGRAPH-FAAD"/* FAAD */, /*28980*/"CJK COMPATIBILITY IDEOGRAPH-FAAE"/* FAAE */,/*28981*/"CJK COMPATIBILITY IDEOGRAPH-FAAF"/* FAAF */, /*28982*/"CJK COMPATIBILITY IDEOGRAPH-FAB0"/* FAB0 */,/*28983*/"CJK COMPATIBILITY IDEOGRAPH-FAB1"/* FAB1 */, /*28984*/"CJK COMPATIBILITY IDEOGRAPH-FAB2"/* FAB2 */,/*28985*/"CJK COMPATIBILITY IDEOGRAPH-FAB3"/* FAB3 */, /*28986*/"CJK COMPATIBILITY IDEOGRAPH-FAB4"/* FAB4 */,/*28987*/"CJK COMPATIBILITY IDEOGRAPH-FAB5"/* FAB5 */, /*28988*/"CJK COMPATIBILITY IDEOGRAPH-FAB6"/* FAB6 */,/*28989*/"CJK COMPATIBILITY IDEOGRAPH-FAB7"/* FAB7 */, /*28990*/"CJK COMPATIBILITY IDEOGRAPH-FAB8"/* FAB8 */,/*28991*/"CJK COMPATIBILITY IDEOGRAPH-FAB9"/* FAB9 */, /*28992*/"CJK COMPATIBILITY IDEOGRAPH-FABA"/* FABA */,/*28993*/"CJK COMPATIBILITY IDEOGRAPH-FABB"/* FABB */, /*28994*/"CJK COMPATIBILITY IDEOGRAPH-FABC"/* FABC */,/*28995*/"CJK COMPATIBILITY IDEOGRAPH-FABD"/* FABD */, /*28996*/"CJK COMPATIBILITY IDEOGRAPH-FABE"/* FABE */,/*28997*/"CJK COMPATIBILITY IDEOGRAPH-FABF"/* FABF */, /*28998*/"CJK COMPATIBILITY IDEOGRAPH-FAC0"/* FAC0 */,/*28999*/"CJK COMPATIBILITY IDEOGRAPH-FAC1"/* FAC1 */, /*29000*/"CJK COMPATIBILITY IDEOGRAPH-FAC2"/* FAC2 */,/*29001*/"CJK COMPATIBILITY IDEOGRAPH-FAC3"/* FAC3 */, /*29002*/"CJK COMPATIBILITY IDEOGRAPH-FAC4"/* FAC4 */,/*29003*/"CJK COMPATIBILITY IDEOGRAPH-FAC5"/* FAC5 */, /*29004*/"CJK COMPATIBILITY IDEOGRAPH-FAC6"/* FAC6 */,/*29005*/"CJK COMPATIBILITY IDEOGRAPH-FAC7"/* FAC7 */, /*29006*/"CJK COMPATIBILITY IDEOGRAPH-FAC8"/* FAC8 */,/*29007*/"CJK COMPATIBILITY IDEOGRAPH-FAC9"/* FAC9 */, /*29008*/"CJK COMPATIBILITY IDEOGRAPH-FACA"/* FACA */,/*29009*/"CJK COMPATIBILITY IDEOGRAPH-FACB"/* FACB */, /*29010*/"CJK COMPATIBILITY IDEOGRAPH-FACC"/* FACC */,/*29011*/"CJK COMPATIBILITY IDEOGRAPH-FACD"/* FACD */, /*29012*/"CJK COMPATIBILITY IDEOGRAPH-FACE"/* FACE */,/*29013*/"CJK COMPATIBILITY IDEOGRAPH-FACF"/* FACF */, /*29014*/"CJK COMPATIBILITY IDEOGRAPH-FAD0"/* FAD0 */,/*29015*/"CJK COMPATIBILITY IDEOGRAPH-FAD1"/* FAD1 */, /*29016*/"CJK COMPATIBILITY IDEOGRAPH-FAD2"/* FAD2 */,/*29017*/"CJK COMPATIBILITY IDEOGRAPH-FAD3"/* FAD3 */, /*29018*/"CJK COMPATIBILITY IDEOGRAPH-FAD4"/* FAD4 */,/*29019*/"CJK COMPATIBILITY IDEOGRAPH-FAD5"/* FAD5 */, /*29020*/"CJK COMPATIBILITY IDEOGRAPH-FAD6"/* FAD6 */,/*29021*/"CJK COMPATIBILITY IDEOGRAPH-FAD7"/* FAD7 */, /*29022*/"CJK COMPATIBILITY IDEOGRAPH-FAD8"/* FAD8 */,/*29023*/"CJK COMPATIBILITY IDEOGRAPH-FAD9"/* FAD9 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29062*/"LATIN SMALL LIGATURE FF"/* FB00 */, /*29063*/"LATIN SMALL LIGATURE FI"/* FB01 */,/*29064*/"LATIN SMALL LIGATURE FL"/* FB02 */, /*29065*/"LATIN SMALL LIGATURE FFI"/* FB03 */,/*29066*/"LATIN SMALL LIGATURE FFL"/* FB04 */, /*29067*/"LATIN SMALL LIGATURE LONG S T"/* FB05 */,/*29068*/"LATIN SMALL LIGATURE ST"/* FB06 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29081*/"ARMENIAN SMALL LIGATURE MEN NOW"/* FB13 */, /*29082*/"ARMENIAN SMALL LIGATURE MEN ECH"/* FB14 */,/*29083*/"ARMENIAN SMALL LIGATURE MEN INI"/* FB15 */, /*29084*/"ARMENIAN SMALL LIGATURE VEW NOW"/* FB16 */,/*29085*/"ARMENIAN SMALL LIGATURE MEN XEH"/* FB17 */,NULL,NULL,NULL, NULL,NULL,/*29091*/"HEBREW LETTER YOD WITH HIRIQ"/* FB1D */,/*29092*/"HEBREW POINT JUDEO-SPANISH VARIKA"/* FB1E */, /*29093*/"HEBREW LIGATURE YIDDISH YOD YOD PATAH"/* FB1F */,/*29094*/"HEBREW LETTER ALTERNATIVE AYIN"/* FB20 */, /*29095*/"HEBREW LETTER WIDE ALEF"/* FB21 */,/*29096*/"HEBREW LETTER WIDE DALET"/* FB22 */, /*29097*/"HEBREW LETTER WIDE HE"/* FB23 */,/*29098*/"HEBREW LETTER WIDE KAF"/* FB24 */, /*29099*/"HEBREW LETTER WIDE LAMED"/* FB25 */,/*29100*/"HEBREW LETTER WIDE FINAL MEM"/* FB26 */, /*29101*/"HEBREW LETTER WIDE RESH"/* FB27 */,/*29102*/"HEBREW LETTER WIDE TAV"/* FB28 */, /*29103*/"HEBREW LETTER ALTERNATIVE PLUS SIGN"/* FB29 */,/*29104*/"HEBREW LETTER SHIN WITH SHIN DOT"/* FB2A */, /*29105*/"HEBREW LETTER SHIN WITH SIN DOT"/* FB2B */,/*29106*/"HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT"/* FB2C */, /*29107*/"HEBREW LETTER SHIN WITH DAGESH AND SIN DOT"/* FB2D */,/*29108*/"HEBREW LETTER ALEF WITH PATAH"/* FB2E */, /*29109*/"HEBREW LETTER ALEF WITH QAMATS"/* FB2F */,/*29110*/"HEBREW LETTER ALEF WITH MAPIQ"/* FB30 */, /*29111*/"HEBREW LETTER BET WITH DAGESH"/* FB31 */,/*29112*/"HEBREW LETTER GIMEL WITH DAGESH"/* FB32 */, /*29113*/"HEBREW LETTER DALET WITH DAGESH"/* FB33 */,/*29114*/"HEBREW LETTER HE WITH MAPIQ"/* FB34 */, /*29115*/"HEBREW LETTER VAV WITH DAGESH"/* FB35 */,/*29116*/"HEBREW LETTER ZAYIN WITH DAGESH"/* FB36 */,NULL, /*29118*/"HEBREW LETTER TET WITH DAGESH"/* FB38 */,/*29119*/"HEBREW LETTER YOD WITH DAGESH"/* FB39 */, /*29120*/"HEBREW LETTER FINAL KAF WITH DAGESH"/* FB3A */,/*29121*/"HEBREW LETTER KAF WITH DAGESH"/* FB3B */, /*29122*/"HEBREW LETTER LAMED WITH DAGESH"/* FB3C */,NULL,/*29124*/"HEBREW LETTER MEM WITH DAGESH"/* FB3E */,NULL, /*29126*/"HEBREW LETTER NUN WITH DAGESH"/* FB40 */,/*29127*/"HEBREW LETTER SAMEKH WITH DAGESH"/* FB41 */,NULL, /*29129*/"HEBREW LETTER FINAL PE WITH DAGESH"/* FB43 */,/*29130*/"HEBREW LETTER PE WITH DAGESH"/* FB44 */,NULL, /*29132*/"HEBREW LETTER TSADI WITH DAGESH"/* FB46 */,/*29133*/"HEBREW LETTER QOF WITH DAGESH"/* FB47 */, /*29134*/"HEBREW LETTER RESH WITH DAGESH"/* FB48 */,/*29135*/"HEBREW LETTER SHIN WITH DAGESH"/* FB49 */, /*29136*/"HEBREW LETTER TAV WITH DAGESH"/* FB4A */,/*29137*/"HEBREW LETTER VAV WITH HOLAM"/* FB4B */, /*29138*/"HEBREW LETTER BET WITH RAFE"/* FB4C */,/*29139*/"HEBREW LETTER KAF WITH RAFE"/* FB4D */, /*29140*/"HEBREW LETTER PE WITH RAFE"/* FB4E */,/*29141*/"HEBREW LIGATURE ALEF LAMED"/* FB4F */, /*29142*/"ARABIC LETTER ALEF WASLA ISOLATED FORM"/* FB50 */,/*29143*/"ARABIC LETTER ALEF WASLA FINAL FORM"/* FB51 */, /*29144*/"ARABIC LETTER BEEH ISOLATED FORM"/* FB52 */,/*29145*/"ARABIC LETTER BEEH FINAL FORM"/* FB53 */, /*29146*/"ARABIC LETTER BEEH INITIAL FORM"/* FB54 */,/*29147*/"ARABIC LETTER BEEH MEDIAL FORM"/* FB55 */, /*29148*/"ARABIC LETTER PEH ISOLATED FORM"/* FB56 */,/*29149*/"ARABIC LETTER PEH FINAL FORM"/* FB57 */, /*29150*/"ARABIC LETTER PEH INITIAL FORM"/* FB58 */,/*29151*/"ARABIC LETTER PEH MEDIAL FORM"/* FB59 */, /*29152*/"ARABIC LETTER BEHEH ISOLATED FORM"/* FB5A */,/*29153*/"ARABIC LETTER BEHEH FINAL FORM"/* FB5B */, /*29154*/"ARABIC LETTER BEHEH INITIAL FORM"/* FB5C */,/*29155*/"ARABIC LETTER BEHEH MEDIAL FORM"/* FB5D */, /*29156*/"ARABIC LETTER TTEHEH ISOLATED FORM"/* FB5E */,/*29157*/"ARABIC LETTER TTEHEH FINAL FORM"/* FB5F */, /*29158*/"ARABIC LETTER TTEHEH INITIAL FORM"/* FB60 */,/*29159*/"ARABIC LETTER TTEHEH MEDIAL FORM"/* FB61 */, /*29160*/"ARABIC LETTER TEHEH ISOLATED FORM"/* FB62 */,/*29161*/"ARABIC LETTER TEHEH FINAL FORM"/* FB63 */, /*29162*/"ARABIC LETTER TEHEH INITIAL FORM"/* FB64 */,/*29163*/"ARABIC LETTER TEHEH MEDIAL FORM"/* FB65 */, /*29164*/"ARABIC LETTER TTEH ISOLATED FORM"/* FB66 */,/*29165*/"ARABIC LETTER TTEH FINAL FORM"/* FB67 */, /*29166*/"ARABIC LETTER TTEH INITIAL FORM"/* FB68 */,/*29167*/"ARABIC LETTER TTEH MEDIAL FORM"/* FB69 */, /*29168*/"ARABIC LETTER VEH ISOLATED FORM"/* FB6A */,/*29169*/"ARABIC LETTER VEH FINAL FORM"/* FB6B */, /*29170*/"ARABIC LETTER VEH INITIAL FORM"/* FB6C */,/*29171*/"ARABIC LETTER VEH MEDIAL FORM"/* FB6D */, /*29172*/"ARABIC LETTER PEHEH ISOLATED FORM"/* FB6E */,/*29173*/"ARABIC LETTER PEHEH FINAL FORM"/* FB6F */, /*29174*/"ARABIC LETTER PEHEH INITIAL FORM"/* FB70 */,/*29175*/"ARABIC LETTER PEHEH MEDIAL FORM"/* FB71 */, /*29176*/"ARABIC LETTER DYEH ISOLATED FORM"/* FB72 */,/*29177*/"ARABIC LETTER DYEH FINAL FORM"/* FB73 */, /*29178*/"ARABIC LETTER DYEH INITIAL FORM"/* FB74 */,/*29179*/"ARABIC LETTER DYEH MEDIAL FORM"/* FB75 */, /*29180*/"ARABIC LETTER NYEH ISOLATED FORM"/* FB76 */,/*29181*/"ARABIC LETTER NYEH FINAL FORM"/* FB77 */, /*29182*/"ARABIC LETTER NYEH INITIAL FORM"/* FB78 */,/*29183*/"ARABIC LETTER NYEH MEDIAL FORM"/* FB79 */, /*29184*/"ARABIC LETTER TCHEH ISOLATED FORM"/* FB7A */,/*29185*/"ARABIC LETTER TCHEH FINAL FORM"/* FB7B */, /*29186*/"ARABIC LETTER TCHEH INITIAL FORM"/* FB7C */,/*29187*/"ARABIC LETTER TCHEH MEDIAL FORM"/* FB7D */, /*29188*/"ARABIC LETTER TCHEHEH ISOLATED FORM"/* FB7E */,/*29189*/"ARABIC LETTER TCHEHEH FINAL FORM"/* FB7F */, /*29190*/"ARABIC LETTER TCHEHEH INITIAL FORM"/* FB80 */,/*29191*/"ARABIC LETTER TCHEHEH MEDIAL FORM"/* FB81 */, /*29192*/"ARABIC LETTER DDAHAL ISOLATED FORM"/* FB82 */,/*29193*/"ARABIC LETTER DDAHAL FINAL FORM"/* FB83 */, /*29194*/"ARABIC LETTER DAHAL ISOLATED FORM"/* FB84 */,/*29195*/"ARABIC LETTER DAHAL FINAL FORM"/* FB85 */, /*29196*/"ARABIC LETTER DUL ISOLATED FORM"/* FB86 */,/*29197*/"ARABIC LETTER DUL FINAL FORM"/* FB87 */, /*29198*/"ARABIC LETTER DDAL ISOLATED FORM"/* FB88 */,/*29199*/"ARABIC LETTER DDAL FINAL FORM"/* FB89 */, /*29200*/"ARABIC LETTER JEH ISOLATED FORM"/* FB8A */,/*29201*/"ARABIC LETTER JEH FINAL FORM"/* FB8B */, /*29202*/"ARABIC LETTER RREH ISOLATED FORM"/* FB8C */,/*29203*/"ARABIC LETTER RREH FINAL FORM"/* FB8D */, /*29204*/"ARABIC LETTER KEHEH ISOLATED FORM"/* FB8E */,/*29205*/"ARABIC LETTER KEHEH FINAL FORM"/* FB8F */, /*29206*/"ARABIC LETTER KEHEH INITIAL FORM"/* FB90 */,/*29207*/"ARABIC LETTER KEHEH MEDIAL FORM"/* FB91 */, /*29208*/"ARABIC LETTER GAF ISOLATED FORM"/* FB92 */,/*29209*/"ARABIC LETTER GAF FINAL FORM"/* FB93 */, /*29210*/"ARABIC LETTER GAF INITIAL FORM"/* FB94 */,/*29211*/"ARABIC LETTER GAF MEDIAL FORM"/* FB95 */, /*29212*/"ARABIC LETTER GUEH ISOLATED FORM"/* FB96 */,/*29213*/"ARABIC LETTER GUEH FINAL FORM"/* FB97 */, /*29214*/"ARABIC LETTER GUEH INITIAL FORM"/* FB98 */,/*29215*/"ARABIC LETTER GUEH MEDIAL FORM"/* FB99 */, /*29216*/"ARABIC LETTER NGOEH ISOLATED FORM"/* FB9A */,/*29217*/"ARABIC LETTER NGOEH FINAL FORM"/* FB9B */, /*29218*/"ARABIC LETTER NGOEH INITIAL FORM"/* FB9C */,/*29219*/"ARABIC LETTER NGOEH MEDIAL FORM"/* FB9D */, /*29220*/"ARABIC LETTER NOON GHUNNA ISOLATED FORM"/* FB9E */,/*29221*/"ARABIC LETTER NOON GHUNNA FINAL FORM"/* FB9F */, /*29222*/"ARABIC LETTER RNOON ISOLATED FORM"/* FBA0 */,/*29223*/"ARABIC LETTER RNOON FINAL FORM"/* FBA1 */, /*29224*/"ARABIC LETTER RNOON INITIAL FORM"/* FBA2 */,/*29225*/"ARABIC LETTER RNOON MEDIAL FORM"/* FBA3 */, /*29226*/"ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM"/* FBA4 */, /*29227*/"ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM"/* FBA5 */, /*29228*/"ARABIC LETTER HEH GOAL ISOLATED FORM"/* FBA6 */,/*29229*/"ARABIC LETTER HEH GOAL FINAL FORM"/* FBA7 */, /*29230*/"ARABIC LETTER HEH GOAL INITIAL FORM"/* FBA8 */,/*29231*/"ARABIC LETTER HEH GOAL MEDIAL FORM"/* FBA9 */, /*29232*/"ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM"/* FBAA */, /*29233*/"ARABIC LETTER HEH DOACHASHMEE FINAL FORM"/* FBAB */, /*29234*/"ARABIC LETTER HEH DOACHASHMEE INITIAL FORM"/* FBAC */, /*29235*/"ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM"/* FBAD */, /*29236*/"ARABIC LETTER YEH BARREE ISOLATED FORM"/* FBAE */,/*29237*/"ARABIC LETTER YEH BARREE FINAL FORM"/* FBAF */, /*29238*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM"/* FBB0 */, /*29239*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM"/* FBB1 */,/*29240*/"ARABIC SYMBOL DOT ABOVE"/* FBB2 */, /*29241*/"ARABIC SYMBOL DOT BELOW"/* FBB3 */,/*29242*/"ARABIC SYMBOL TWO DOTS ABOVE"/* FBB4 */, /*29243*/"ARABIC SYMBOL TWO DOTS BELOW"/* FBB5 */,/*29244*/"ARABIC SYMBOL THREE DOTS ABOVE"/* FBB6 */, /*29245*/"ARABIC SYMBOL THREE DOTS BELOW"/* FBB7 */, /*29246*/"ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE"/* FBB8 */, /*29247*/"ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW"/* FBB9 */, /*29248*/"ARABIC SYMBOL FOUR DOTS ABOVE"/* FBBA */,/*29249*/"ARABIC SYMBOL FOUR DOTS BELOW"/* FBBB */, /*29250*/"ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW"/* FBBC */, /*29251*/"ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE"/* FBBD */, /*29252*/"ARABIC SYMBOL TWO DOTS VERTICALLY BELOW"/* FBBE */,/*29253*/"ARABIC SYMBOL RING"/* FBBF */, /*29254*/"ARABIC SYMBOL SMALL TAH ABOVE"/* FBC0 */,/*29255*/"ARABIC SYMBOL SMALL TAH BELOW"/* FBC1 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*29273*/"ARABIC LETTER NG ISOLATED FORM"/* FBD3 */,/*29274*/"ARABIC LETTER NG FINAL FORM"/* FBD4 */, /*29275*/"ARABIC LETTER NG INITIAL FORM"/* FBD5 */,/*29276*/"ARABIC LETTER NG MEDIAL FORM"/* FBD6 */, /*29277*/"ARABIC LETTER U ISOLATED FORM"/* FBD7 */,/*29278*/"ARABIC LETTER U FINAL FORM"/* FBD8 */, /*29279*/"ARABIC LETTER OE ISOLATED FORM"/* FBD9 */,/*29280*/"ARABIC LETTER OE FINAL FORM"/* FBDA */, /*29281*/"ARABIC LETTER YU ISOLATED FORM"/* FBDB */,/*29282*/"ARABIC LETTER YU FINAL FORM"/* FBDC */, /*29283*/"ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM"/* FBDD */,/*29284*/"ARABIC LETTER VE ISOLATED FORM"/* FBDE */, /*29285*/"ARABIC LETTER VE FINAL FORM"/* FBDF */,/*29286*/"ARABIC LETTER KIRGHIZ OE ISOLATED FORM"/* FBE0 */, /*29287*/"ARABIC LETTER KIRGHIZ OE FINAL FORM"/* FBE1 */,/*29288*/"ARABIC LETTER KIRGHIZ YU ISOLATED FORM"/* FBE2 */, /*29289*/"ARABIC LETTER KIRGHIZ YU FINAL FORM"/* FBE3 */,/*29290*/"ARABIC LETTER E ISOLATED FORM"/* FBE4 */, /*29291*/"ARABIC LETTER E FINAL FORM"/* FBE5 */,/*29292*/"ARABIC LETTER E INITIAL FORM"/* FBE6 */, /*29293*/"ARABIC LETTER E MEDIAL FORM"/* FBE7 */, /*29294*/"ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM"/* FBE8 */, /*29295*/"ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM"/* FBE9 */, /*29296*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM"/* FBEA */, /*29297*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM"/* FBEB */, /*29298*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM"/* FBEC */, /*29299*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM"/* FBED */, /*29300*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM"/* FBEE */, /*29301*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM"/* FBEF */, /*29302*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM"/* FBF0 */, /*29303*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM"/* FBF1 */, /*29304*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM"/* FBF2 */, /*29305*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM"/* FBF3 */, /*29306*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM"/* FBF4 */, /*29307*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM"/* FBF5 */, /*29308*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM"/* FBF6 */, /*29309*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM"/* FBF7 */, /*29310*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM"/* FBF8 */, /*29311*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"/* FBF9 */, /*29312*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"/* FBFA */, /*29313*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM"/* FBFB */, /*29314*/"ARABIC LETTER FARSI YEH ISOLATED FORM"/* FBFC */,/*29315*/"ARABIC LETTER FARSI YEH FINAL FORM"/* FBFD */, /*29316*/"ARABIC LETTER FARSI YEH INITIAL FORM"/* FBFE */,/*29317*/"ARABIC LETTER FARSI YEH MEDIAL FORM"/* FBFF */, /*29318*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM"/* FC00 */, /*29319*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM"/* FC01 */, /*29320*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM"/* FC02 */, /*29321*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"/* FC03 */, /*29322*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM"/* FC04 */, /*29323*/"ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM"/* FC05 */, /*29324*/"ARABIC LIGATURE BEH WITH HAH ISOLATED FORM"/* FC06 */, /*29325*/"ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM"/* FC07 */, /*29326*/"ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM"/* FC08 */, /*29327*/"ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM"/* FC09 */, /*29328*/"ARABIC LIGATURE BEH WITH YEH ISOLATED FORM"/* FC0A */, /*29329*/"ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM"/* FC0B */, /*29330*/"ARABIC LIGATURE TEH WITH HAH ISOLATED FORM"/* FC0C */, /*29331*/"ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM"/* FC0D */, /*29332*/"ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM"/* FC0E */, /*29333*/"ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM"/* FC0F */, /*29334*/"ARABIC LIGATURE TEH WITH YEH ISOLATED FORM"/* FC10 */, /*29335*/"ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM"/* FC11 */, /*29336*/"ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM"/* FC12 */, /*29337*/"ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM"/* FC13 */, /*29338*/"ARABIC LIGATURE THEH WITH YEH ISOLATED FORM"/* FC14 */, /*29339*/"ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM"/* FC15 */, /*29340*/"ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM"/* FC16 */, /*29341*/"ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM"/* FC17 */, /*29342*/"ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM"/* FC18 */, /*29343*/"ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM"/* FC19 */, /*29344*/"ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM"/* FC1A */, /*29345*/"ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM"/* FC1B */, /*29346*/"ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM"/* FC1C */, /*29347*/"ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM"/* FC1D */, /*29348*/"ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM"/* FC1E */, /*29349*/"ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM"/* FC1F */, /*29350*/"ARABIC LIGATURE SAD WITH HAH ISOLATED FORM"/* FC20 */, /*29351*/"ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM"/* FC21 */, /*29352*/"ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM"/* FC22 */, /*29353*/"ARABIC LIGATURE DAD WITH HAH ISOLATED FORM"/* FC23 */, /*29354*/"ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM"/* FC24 */, /*29355*/"ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM"/* FC25 */, /*29356*/"ARABIC LIGATURE TAH WITH HAH ISOLATED FORM"/* FC26 */, /*29357*/"ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM"/* FC27 */, /*29358*/"ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM"/* FC28 */, /*29359*/"ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM"/* FC29 */, /*29360*/"ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM"/* FC2A */, /*29361*/"ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM"/* FC2B */, /*29362*/"ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM"/* FC2C */, /*29363*/"ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM"/* FC2D */, /*29364*/"ARABIC LIGATURE FEH WITH HAH ISOLATED FORM"/* FC2E */, /*29365*/"ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM"/* FC2F */, /*29366*/"ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM"/* FC30 */, /*29367*/"ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM"/* FC31 */, /*29368*/"ARABIC LIGATURE FEH WITH YEH ISOLATED FORM"/* FC32 */, /*29369*/"ARABIC LIGATURE QAF WITH HAH ISOLATED FORM"/* FC33 */, /*29370*/"ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM"/* FC34 */, /*29371*/"ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM"/* FC35 */, /*29372*/"ARABIC LIGATURE QAF WITH YEH ISOLATED FORM"/* FC36 */, /*29373*/"ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM"/* FC37 */, /*29374*/"ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM"/* FC38 */, /*29375*/"ARABIC LIGATURE KAF WITH HAH ISOLATED FORM"/* FC39 */, /*29376*/"ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM"/* FC3A */, /*29377*/"ARABIC LIGATURE KAF WITH LAM ISOLATED FORM"/* FC3B */, /*29378*/"ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM"/* FC3C */, /*29379*/"ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM"/* FC3D */, /*29380*/"ARABIC LIGATURE KAF WITH YEH ISOLATED FORM"/* FC3E */, /*29381*/"ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM"/* FC3F */, /*29382*/"ARABIC LIGATURE LAM WITH HAH ISOLATED FORM"/* FC40 */, /*29383*/"ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM"/* FC41 */, /*29384*/"ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM"/* FC42 */, /*29385*/"ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM"/* FC43 */, /*29386*/"ARABIC LIGATURE LAM WITH YEH ISOLATED FORM"/* FC44 */, /*29387*/"ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM"/* FC45 */, /*29388*/"ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM"/* FC46 */, /*29389*/"ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM"/* FC47 */, /*29390*/"ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM"/* FC48 */, /*29391*/"ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM"/* FC49 */, /*29392*/"ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM"/* FC4A */, /*29393*/"ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM"/* FC4B */, /*29394*/"ARABIC LIGATURE NOON WITH HAH ISOLATED FORM"/* FC4C */, /*29395*/"ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM"/* FC4D */, /*29396*/"ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM"/* FC4E */, /*29397*/"ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM"/* FC4F */, /*29398*/"ARABIC LIGATURE NOON WITH YEH ISOLATED FORM"/* FC50 */, /*29399*/"ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM"/* FC51 */, /*29400*/"ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM"/* FC52 */, /*29401*/"ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM"/* FC53 */, /*29402*/"ARABIC LIGATURE HEH WITH YEH ISOLATED FORM"/* FC54 */, /*29403*/"ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM"/* FC55 */, /*29404*/"ARABIC LIGATURE YEH WITH HAH ISOLATED FORM"/* FC56 */, /*29405*/"ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM"/* FC57 */, /*29406*/"ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM"/* FC58 */, /*29407*/"ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM"/* FC59 */, /*29408*/"ARABIC LIGATURE YEH WITH YEH ISOLATED FORM"/* FC5A */, /*29409*/"ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5B */, /*29410*/"ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5C */, /*29411*/"ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5D */, /*29412*/"ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM"/* FC5E */, /*29413*/"ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM"/* FC5F */, /*29414*/"ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM"/* FC60 */, /*29415*/"ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM"/* FC61 */, /*29416*/"ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM"/* FC62 */, /*29417*/"ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC63 */, /*29418*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM"/* FC64 */, /*29419*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM"/* FC65 */, /*29420*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM"/* FC66 */, /*29421*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM"/* FC67 */, /*29422*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"/* FC68 */, /*29423*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM"/* FC69 */, /*29424*/"ARABIC LIGATURE BEH WITH REH FINAL FORM"/* FC6A */, /*29425*/"ARABIC LIGATURE BEH WITH ZAIN FINAL FORM"/* FC6B */, /*29426*/"ARABIC LIGATURE BEH WITH MEEM FINAL FORM"/* FC6C */, /*29427*/"ARABIC LIGATURE BEH WITH NOON FINAL FORM"/* FC6D */, /*29428*/"ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM"/* FC6E */, /*29429*/"ARABIC LIGATURE BEH WITH YEH FINAL FORM"/* FC6F */, /*29430*/"ARABIC LIGATURE TEH WITH REH FINAL FORM"/* FC70 */, /*29431*/"ARABIC LIGATURE TEH WITH ZAIN FINAL FORM"/* FC71 */, /*29432*/"ARABIC LIGATURE TEH WITH MEEM FINAL FORM"/* FC72 */, /*29433*/"ARABIC LIGATURE TEH WITH NOON FINAL FORM"/* FC73 */, /*29434*/"ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM"/* FC74 */, /*29435*/"ARABIC LIGATURE TEH WITH YEH FINAL FORM"/* FC75 */, /*29436*/"ARABIC LIGATURE THEH WITH REH FINAL FORM"/* FC76 */, /*29437*/"ARABIC LIGATURE THEH WITH ZAIN FINAL FORM"/* FC77 */, /*29438*/"ARABIC LIGATURE THEH WITH MEEM FINAL FORM"/* FC78 */, /*29439*/"ARABIC LIGATURE THEH WITH NOON FINAL FORM"/* FC79 */, /*29440*/"ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM"/* FC7A */, /*29441*/"ARABIC LIGATURE THEH WITH YEH FINAL FORM"/* FC7B */, /*29442*/"ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM"/* FC7C */, /*29443*/"ARABIC LIGATURE FEH WITH YEH FINAL FORM"/* FC7D */, /*29444*/"ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM"/* FC7E */, /*29445*/"ARABIC LIGATURE QAF WITH YEH FINAL FORM"/* FC7F */, /*29446*/"ARABIC LIGATURE KAF WITH ALEF FINAL FORM"/* FC80 */, /*29447*/"ARABIC LIGATURE KAF WITH LAM FINAL FORM"/* FC81 */, /*29448*/"ARABIC LIGATURE KAF WITH MEEM FINAL FORM"/* FC82 */, /*29449*/"ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM"/* FC83 */, /*29450*/"ARABIC LIGATURE KAF WITH YEH FINAL FORM"/* FC84 */, /*29451*/"ARABIC LIGATURE LAM WITH MEEM FINAL FORM"/* FC85 */, /*29452*/"ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM"/* FC86 */, /*29453*/"ARABIC LIGATURE LAM WITH YEH FINAL FORM"/* FC87 */, /*29454*/"ARABIC LIGATURE MEEM WITH ALEF FINAL FORM"/* FC88 */, /*29455*/"ARABIC LIGATURE MEEM WITH MEEM FINAL FORM"/* FC89 */, /*29456*/"ARABIC LIGATURE NOON WITH REH FINAL FORM"/* FC8A */, /*29457*/"ARABIC LIGATURE NOON WITH ZAIN FINAL FORM"/* FC8B */, /*29458*/"ARABIC LIGATURE NOON WITH MEEM FINAL FORM"/* FC8C */, /*29459*/"ARABIC LIGATURE NOON WITH NOON FINAL FORM"/* FC8D */, /*29460*/"ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM"/* FC8E */, /*29461*/"ARABIC LIGATURE NOON WITH YEH FINAL FORM"/* FC8F */, /*29462*/"ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM"/* FC90 */, /*29463*/"ARABIC LIGATURE YEH WITH REH FINAL FORM"/* FC91 */, /*29464*/"ARABIC LIGATURE YEH WITH ZAIN FINAL FORM"/* FC92 */, /*29465*/"ARABIC LIGATURE YEH WITH MEEM FINAL FORM"/* FC93 */, /*29466*/"ARABIC LIGATURE YEH WITH NOON FINAL FORM"/* FC94 */, /*29467*/"ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM"/* FC95 */, /*29468*/"ARABIC LIGATURE YEH WITH YEH FINAL FORM"/* FC96 */, /*29469*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM"/* FC97 */, /*29470*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM"/* FC98 */, /*29471*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM"/* FC99 */, /*29472*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM"/* FC9A */, /*29473*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM"/* FC9B */, /*29474*/"ARABIC LIGATURE BEH WITH JEEM INITIAL FORM"/* FC9C */, /*29475*/"ARABIC LIGATURE BEH WITH HAH INITIAL FORM"/* FC9D */, /*29476*/"ARABIC LIGATURE BEH WITH KHAH INITIAL FORM"/* FC9E */, /*29477*/"ARABIC LIGATURE BEH WITH MEEM INITIAL FORM"/* FC9F */, /*29478*/"ARABIC LIGATURE BEH WITH HEH INITIAL FORM"/* FCA0 */, /*29479*/"ARABIC LIGATURE TEH WITH JEEM INITIAL FORM"/* FCA1 */, /*29480*/"ARABIC LIGATURE TEH WITH HAH INITIAL FORM"/* FCA2 */, /*29481*/"ARABIC LIGATURE TEH WITH KHAH INITIAL FORM"/* FCA3 */, /*29482*/"ARABIC LIGATURE TEH WITH MEEM INITIAL FORM"/* FCA4 */, /*29483*/"ARABIC LIGATURE TEH WITH HEH INITIAL FORM"/* FCA5 */, /*29484*/"ARABIC LIGATURE THEH WITH MEEM INITIAL FORM"/* FCA6 */, /*29485*/"ARABIC LIGATURE JEEM WITH HAH INITIAL FORM"/* FCA7 */, /*29486*/"ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM"/* FCA8 */, /*29487*/"ARABIC LIGATURE HAH WITH JEEM INITIAL FORM"/* FCA9 */, /*29488*/"ARABIC LIGATURE HAH WITH MEEM INITIAL FORM"/* FCAA */, /*29489*/"ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM"/* FCAB */, /*29490*/"ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM"/* FCAC */, /*29491*/"ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM"/* FCAD */, /*29492*/"ARABIC LIGATURE SEEN WITH HAH INITIAL FORM"/* FCAE */, /*29493*/"ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM"/* FCAF */, /*29494*/"ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM"/* FCB0 */, /*29495*/"ARABIC LIGATURE SAD WITH HAH INITIAL FORM"/* FCB1 */, /*29496*/"ARABIC LIGATURE SAD WITH KHAH INITIAL FORM"/* FCB2 */, /*29497*/"ARABIC LIGATURE SAD WITH MEEM INITIAL FORM"/* FCB3 */, /*29498*/"ARABIC LIGATURE DAD WITH JEEM INITIAL FORM"/* FCB4 */, /*29499*/"ARABIC LIGATURE DAD WITH HAH INITIAL FORM"/* FCB5 */, /*29500*/"ARABIC LIGATURE DAD WITH KHAH INITIAL FORM"/* FCB6 */, /*29501*/"ARABIC LIGATURE DAD WITH MEEM INITIAL FORM"/* FCB7 */, /*29502*/"ARABIC LIGATURE TAH WITH HAH INITIAL FORM"/* FCB8 */, /*29503*/"ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM"/* FCB9 */, /*29504*/"ARABIC LIGATURE AIN WITH JEEM INITIAL FORM"/* FCBA */, /*29505*/"ARABIC LIGATURE AIN WITH MEEM INITIAL FORM"/* FCBB */, /*29506*/"ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM"/* FCBC */, /*29507*/"ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM"/* FCBD */, /*29508*/"ARABIC LIGATURE FEH WITH JEEM INITIAL FORM"/* FCBE */, /*29509*/"ARABIC LIGATURE FEH WITH HAH INITIAL FORM"/* FCBF */, /*29510*/"ARABIC LIGATURE FEH WITH KHAH INITIAL FORM"/* FCC0 */, /*29511*/"ARABIC LIGATURE FEH WITH MEEM INITIAL FORM"/* FCC1 */, /*29512*/"ARABIC LIGATURE QAF WITH HAH INITIAL FORM"/* FCC2 */, /*29513*/"ARABIC LIGATURE QAF WITH MEEM INITIAL FORM"/* FCC3 */, /*29514*/"ARABIC LIGATURE KAF WITH JEEM INITIAL FORM"/* FCC4 */, /*29515*/"ARABIC LIGATURE KAF WITH HAH INITIAL FORM"/* FCC5 */, /*29516*/"ARABIC LIGATURE KAF WITH KHAH INITIAL FORM"/* FCC6 */, /*29517*/"ARABIC LIGATURE KAF WITH LAM INITIAL FORM"/* FCC7 */, /*29518*/"ARABIC LIGATURE KAF WITH MEEM INITIAL FORM"/* FCC8 */, /*29519*/"ARABIC LIGATURE LAM WITH JEEM INITIAL FORM"/* FCC9 */, /*29520*/"ARABIC LIGATURE LAM WITH HAH INITIAL FORM"/* FCCA */, /*29521*/"ARABIC LIGATURE LAM WITH KHAH INITIAL FORM"/* FCCB */, /*29522*/"ARABIC LIGATURE LAM WITH MEEM INITIAL FORM"/* FCCC */, /*29523*/"ARABIC LIGATURE LAM WITH HEH INITIAL FORM"/* FCCD */, /*29524*/"ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM"/* FCCE */, /*29525*/"ARABIC LIGATURE MEEM WITH HAH INITIAL FORM"/* FCCF */, /*29526*/"ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM"/* FCD0 */, /*29527*/"ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM"/* FCD1 */, /*29528*/"ARABIC LIGATURE NOON WITH JEEM INITIAL FORM"/* FCD2 */, /*29529*/"ARABIC LIGATURE NOON WITH HAH INITIAL FORM"/* FCD3 */, /*29530*/"ARABIC LIGATURE NOON WITH KHAH INITIAL FORM"/* FCD4 */, /*29531*/"ARABIC LIGATURE NOON WITH MEEM INITIAL FORM"/* FCD5 */, /*29532*/"ARABIC LIGATURE NOON WITH HEH INITIAL FORM"/* FCD6 */, /*29533*/"ARABIC LIGATURE HEH WITH JEEM INITIAL FORM"/* FCD7 */, /*29534*/"ARABIC LIGATURE HEH WITH MEEM INITIAL FORM"/* FCD8 */, /*29535*/"ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM"/* FCD9 */, /*29536*/"ARABIC LIGATURE YEH WITH JEEM INITIAL FORM"/* FCDA */, /*29537*/"ARABIC LIGATURE YEH WITH HAH INITIAL FORM"/* FCDB */, /*29538*/"ARABIC LIGATURE YEH WITH KHAH INITIAL FORM"/* FCDC */, /*29539*/"ARABIC LIGATURE YEH WITH MEEM INITIAL FORM"/* FCDD */, /*29540*/"ARABIC LIGATURE YEH WITH HEH INITIAL FORM"/* FCDE */, /*29541*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM"/* FCDF */, /*29542*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM"/* FCE0 */, /*29543*/"ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM"/* FCE1 */, /*29544*/"ARABIC LIGATURE BEH WITH HEH MEDIAL FORM"/* FCE2 */, /*29545*/"ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM"/* FCE3 */, /*29546*/"ARABIC LIGATURE TEH WITH HEH MEDIAL FORM"/* FCE4 */, /*29547*/"ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM"/* FCE5 */, /*29548*/"ARABIC LIGATURE THEH WITH HEH MEDIAL FORM"/* FCE6 */, /*29549*/"ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM"/* FCE7 */, /*29550*/"ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM"/* FCE8 */, /*29551*/"ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM"/* FCE9 */, /*29552*/"ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM"/* FCEA */, /*29553*/"ARABIC LIGATURE KAF WITH LAM MEDIAL FORM"/* FCEB */, /*29554*/"ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM"/* FCEC */, /*29555*/"ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM"/* FCED */, /*29556*/"ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM"/* FCEE */, /*29557*/"ARABIC LIGATURE NOON WITH HEH MEDIAL FORM"/* FCEF */, /*29558*/"ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM"/* FCF0 */, /*29559*/"ARABIC LIGATURE YEH WITH HEH MEDIAL FORM"/* FCF1 */, /*29560*/"ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM"/* FCF2 */, /*29561*/"ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM"/* FCF3 */, /*29562*/"ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM"/* FCF4 */, /*29563*/"ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM"/* FCF5 */, /*29564*/"ARABIC LIGATURE TAH WITH YEH ISOLATED FORM"/* FCF6 */, /*29565*/"ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM"/* FCF7 */, /*29566*/"ARABIC LIGATURE AIN WITH YEH ISOLATED FORM"/* FCF8 */, /*29567*/"ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM"/* FCF9 */, /*29568*/"ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM"/* FCFA */, /*29569*/"ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM"/* FCFB */, /*29570*/"ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM"/* FCFC */, /*29571*/"ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM"/* FCFD */, /*29572*/"ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM"/* FCFE */, /*29573*/"ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM"/* FCFF */, /*29574*/"ARABIC LIGATURE HAH WITH YEH ISOLATED FORM"/* FD00 */, /*29575*/"ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM"/* FD01 */, /*29576*/"ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM"/* FD02 */, /*29577*/"ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM"/* FD03 */, /*29578*/"ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM"/* FD04 */, /*29579*/"ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM"/* FD05 */, /*29580*/"ARABIC LIGATURE SAD WITH YEH ISOLATED FORM"/* FD06 */, /*29581*/"ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM"/* FD07 */, /*29582*/"ARABIC LIGATURE DAD WITH YEH ISOLATED FORM"/* FD08 */, /*29583*/"ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM"/* FD09 */, /*29584*/"ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM"/* FD0A */, /*29585*/"ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM"/* FD0B */, /*29586*/"ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM"/* FD0C */, /*29587*/"ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM"/* FD0D */, /*29588*/"ARABIC LIGATURE SEEN WITH REH ISOLATED FORM"/* FD0E */, /*29589*/"ARABIC LIGATURE SAD WITH REH ISOLATED FORM"/* FD0F */, /*29590*/"ARABIC LIGATURE DAD WITH REH ISOLATED FORM"/* FD10 */, /*29591*/"ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM"/* FD11 */, /*29592*/"ARABIC LIGATURE TAH WITH YEH FINAL FORM"/* FD12 */, /*29593*/"ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM"/* FD13 */, /*29594*/"ARABIC LIGATURE AIN WITH YEH FINAL FORM"/* FD14 */, /*29595*/"ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM"/* FD15 */, /*29596*/"ARABIC LIGATURE GHAIN WITH YEH FINAL FORM"/* FD16 */, /*29597*/"ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM"/* FD17 */, /*29598*/"ARABIC LIGATURE SEEN WITH YEH FINAL FORM"/* FD18 */, /*29599*/"ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM"/* FD19 */, /*29600*/"ARABIC LIGATURE SHEEN WITH YEH FINAL FORM"/* FD1A */, /*29601*/"ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM"/* FD1B */, /*29602*/"ARABIC LIGATURE HAH WITH YEH FINAL FORM"/* FD1C */, /*29603*/"ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM"/* FD1D */, /*29604*/"ARABIC LIGATURE JEEM WITH YEH FINAL FORM"/* FD1E */, /*29605*/"ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM"/* FD1F */, /*29606*/"ARABIC LIGATURE KHAH WITH YEH FINAL FORM"/* FD20 */, /*29607*/"ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM"/* FD21 */, /*29608*/"ARABIC LIGATURE SAD WITH YEH FINAL FORM"/* FD22 */, /*29609*/"ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM"/* FD23 */, /*29610*/"ARABIC LIGATURE DAD WITH YEH FINAL FORM"/* FD24 */, /*29611*/"ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM"/* FD25 */, /*29612*/"ARABIC LIGATURE SHEEN WITH HAH FINAL FORM"/* FD26 */, /*29613*/"ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM"/* FD27 */, /*29614*/"ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM"/* FD28 */, /*29615*/"ARABIC LIGATURE SHEEN WITH REH FINAL FORM"/* FD29 */, /*29616*/"ARABIC LIGATURE SEEN WITH REH FINAL FORM"/* FD2A */, /*29617*/"ARABIC LIGATURE SAD WITH REH FINAL FORM"/* FD2B */, /*29618*/"ARABIC LIGATURE DAD WITH REH FINAL FORM"/* FD2C */, /*29619*/"ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM"/* FD2D */, /*29620*/"ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM"/* FD2E */, /*29621*/"ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM"/* FD2F */, /*29622*/"ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM"/* FD30 */, /*29623*/"ARABIC LIGATURE SEEN WITH HEH INITIAL FORM"/* FD31 */, /*29624*/"ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM"/* FD32 */, /*29625*/"ARABIC LIGATURE TAH WITH MEEM INITIAL FORM"/* FD33 */, /*29626*/"ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM"/* FD34 */, /*29627*/"ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM"/* FD35 */, /*29628*/"ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM"/* FD36 */, /*29629*/"ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM"/* FD37 */, /*29630*/"ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM"/* FD38 */, /*29631*/"ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM"/* FD39 */, /*29632*/"ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM"/* FD3A */, /*29633*/"ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM"/* FD3B */, /*29634*/"ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM"/* FD3C */, /*29635*/"ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM"/* FD3D */,/*29636*/"ORNATE LEFT PARENTHESIS"/* FD3E */, /*29637*/"ORNATE RIGHT PARENTHESIS"/* FD3F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*29654*/"ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM"/* FD50 */, /*29655*/"ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM"/* FD51 */, /*29656*/"ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM"/* FD52 */, /*29657*/"ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM"/* FD53 */, /*29658*/"ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM"/* FD54 */, /*29659*/"ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM"/* FD55 */, /*29660*/"ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM"/* FD56 */, /*29661*/"ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM"/* FD57 */, /*29662*/"ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM"/* FD58 */, /*29663*/"ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM"/* FD59 */, /*29664*/"ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM"/* FD5A */, /*29665*/"ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD5B */, /*29666*/"ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM"/* FD5C */, /*29667*/"ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM"/* FD5D */, /*29668*/"ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FD5E */, /*29669*/"ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM"/* FD5F */, /*29670*/"ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM"/* FD60 */, /*29671*/"ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM"/* FD61 */, /*29672*/"ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM"/* FD62 */, /*29673*/"ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM"/* FD63 */, /*29674*/"ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM"/* FD64 */, /*29675*/"ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM"/* FD65 */, /*29676*/"ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM"/* FD66 */, /*29677*/"ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM"/* FD67 */, /*29678*/"ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM"/* FD68 */, /*29679*/"ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM"/* FD69 */, /*29680*/"ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM"/* FD6A */, /*29681*/"ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM"/* FD6B */, /*29682*/"ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM"/* FD6C */, /*29683*/"ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM"/* FD6D */, /*29684*/"ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD6E */, /*29685*/"ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM"/* FD6F */, /*29686*/"ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM"/* FD70 */, /*29687*/"ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM"/* FD71 */, /*29688*/"ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM"/* FD72 */, /*29689*/"ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM"/* FD73 */, /*29690*/"ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM"/* FD74 */, /*29691*/"ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM"/* FD75 */, /*29692*/"ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM"/* FD76 */, /*29693*/"ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM"/* FD77 */, /*29694*/"ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD78 */, /*29695*/"ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM"/* FD79 */, /*29696*/"ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM"/* FD7A */, /*29697*/"ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD7B */, /*29698*/"ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM"/* FD7C */, /*29699*/"ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM"/* FD7D */, /*29700*/"ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM"/* FD7E */, /*29701*/"ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM"/* FD7F */, /*29702*/"ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM"/* FD80 */, /*29703*/"ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM"/* FD81 */, /*29704*/"ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD82 */, /*29705*/"ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM"/* FD83 */, /*29706*/"ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM"/* FD84 */, /*29707*/"ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM"/* FD85 */, /*29708*/"ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM"/* FD86 */, /*29709*/"ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM"/* FD87 */, /*29710*/"ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM"/* FD88 */, /*29711*/"ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM"/* FD89 */, /*29712*/"ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM"/* FD8A */, /*29713*/"ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM"/* FD8B */, /*29714*/"ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM"/* FD8C */, /*29715*/"ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM"/* FD8D */, /*29716*/"ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM"/* FD8E */, /*29717*/"ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM"/* FD8F */,NULL,NULL, /*29720*/"ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM"/* FD92 */, /*29721*/"ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM"/* FD93 */, /*29722*/"ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM"/* FD94 */, /*29723*/"ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM"/* FD95 */, /*29724*/"ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD96 */, /*29725*/"ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM"/* FD97 */, /*29726*/"ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM"/* FD98 */, /*29727*/"ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FD99 */, /*29728*/"ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM"/* FD9A */, /*29729*/"ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD9B */, /*29730*/"ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM"/* FD9C */, /*29731*/"ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM"/* FD9D */, /*29732*/"ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM"/* FD9E */, /*29733*/"ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM"/* FD9F */, /*29734*/"ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FDA0 */, /*29735*/"ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM"/* FDA1 */, /*29736*/"ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM"/* FDA2 */, /*29737*/"ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM"/* FDA3 */, /*29738*/"ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FDA4 */, /*29739*/"ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM"/* FDA5 */, /*29740*/"ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FDA6 */, /*29741*/"ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FDA7 */, /*29742*/"ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM"/* FDA8 */, /*29743*/"ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM"/* FDA9 */, /*29744*/"ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM"/* FDAA */, /*29745*/"ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM"/* FDAB */, /*29746*/"ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM"/* FDAC */, /*29747*/"ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM"/* FDAD */, /*29748*/"ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM"/* FDAE */, /*29749*/"ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM"/* FDAF */, /*29750*/"ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM"/* FDB0 */, /*29751*/"ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM"/* FDB1 */, /*29752*/"ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM"/* FDB2 */, /*29753*/"ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM"/* FDB3 */, /*29754*/"ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM"/* FDB4 */, /*29755*/"ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM"/* FDB5 */, /*29756*/"ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM"/* FDB6 */, /*29757*/"ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM"/* FDB7 */, /*29758*/"ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM"/* FDB8 */, /*29759*/"ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM"/* FDB9 */, /*29760*/"ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM"/* FDBA */, /*29761*/"ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM"/* FDBB */, /*29762*/"ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM"/* FDBC */, /*29763*/"ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM"/* FDBD */, /*29764*/"ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM"/* FDBE */, /*29765*/"ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM"/* FDBF */, /*29766*/"ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM"/* FDC0 */, /*29767*/"ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM"/* FDC1 */, /*29768*/"ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM"/* FDC2 */, /*29769*/"ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM"/* FDC3 */, /*29770*/"ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM"/* FDC4 */, /*29771*/"ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM"/* FDC5 */, /*29772*/"ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM"/* FDC6 */, /*29773*/"ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM"/* FDC7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29814*/"ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM"/* FDF0 */, /*29815*/"ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM"/* FDF1 */, /*29816*/"ARABIC LIGATURE ALLAH ISOLATED FORM"/* FDF2 */,/*29817*/"ARABIC LIGATURE AKBAR ISOLATED FORM"/* FDF3 */, /*29818*/"ARABIC LIGATURE MOHAMMAD ISOLATED FORM"/* FDF4 */,/*29819*/"ARABIC LIGATURE SALAM ISOLATED FORM"/* FDF5 */, /*29820*/"ARABIC LIGATURE RASOUL ISOLATED FORM"/* FDF6 */,/*29821*/"ARABIC LIGATURE ALAYHE ISOLATED FORM"/* FDF7 */, /*29822*/"ARABIC LIGATURE WASALLAM ISOLATED FORM"/* FDF8 */,/*29823*/"ARABIC LIGATURE SALLA ISOLATED FORM"/* FDF9 */, /*29824*/"ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM"/* FDFA */,/*29825*/"ARABIC LIGATURE JALLAJALALOUHOU"/* FDFB */, /*29826*/"RIAL SIGN"/* FDFC */,/*29827*/"ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM"/* FDFD */,NULL,NULL, /*29830*/"VARIATION SELECTOR-1"/* FE00 */,/*29831*/"VARIATION SELECTOR-2"/* FE01 */, /*29832*/"VARIATION SELECTOR-3"/* FE02 */,/*29833*/"VARIATION SELECTOR-4"/* FE03 */, /*29834*/"VARIATION SELECTOR-5"/* FE04 */,/*29835*/"VARIATION SELECTOR-6"/* FE05 */, /*29836*/"VARIATION SELECTOR-7"/* FE06 */,/*29837*/"VARIATION SELECTOR-8"/* FE07 */, /*29838*/"VARIATION SELECTOR-9"/* FE08 */,/*29839*/"VARIATION SELECTOR-10"/* FE09 */, /*29840*/"VARIATION SELECTOR-11"/* FE0A */,/*29841*/"VARIATION SELECTOR-12"/* FE0B */, /*29842*/"VARIATION SELECTOR-13"/* FE0C */,/*29843*/"VARIATION SELECTOR-14"/* FE0D */, /*29844*/"VARIATION SELECTOR-15"/* FE0E */,/*29845*/"VARIATION SELECTOR-16"/* FE0F */, /*29846*/"PRESENTATION FORM FOR VERTICAL COMMA"/* FE10 */, /*29847*/"PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA"/* FE11 */, /*29848*/"PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP"/* FE12 */, /*29849*/"PRESENTATION FORM FOR VERTICAL COLON"/* FE13 */,/*29850*/"PRESENTATION FORM FOR VERTICAL SEMICOLON"/* FE14 */, /*29851*/"PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK"/* FE15 */, /*29852*/"PRESENTATION FORM FOR VERTICAL QUESTION MARK"/* FE16 */, /*29853*/"PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET"/* FE17 */, /*29854*/"PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET"/* FE18 */, /*29855*/"PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS"/* FE19 */,NULL,NULL,NULL,NULL,NULL,NULL, /*29862*/"COMBINING LIGATURE LEFT HALF"/* FE20 */,/*29863*/"COMBINING LIGATURE RIGHT HALF"/* FE21 */, /*29864*/"COMBINING DOUBLE TILDE LEFT HALF"/* FE22 */,/*29865*/"COMBINING DOUBLE TILDE RIGHT HALF"/* FE23 */, /*29866*/"COMBINING MACRON LEFT HALF"/* FE24 */,/*29867*/"COMBINING MACRON RIGHT HALF"/* FE25 */, /*29868*/"COMBINING CONJOINING MACRON"/* FE26 */,/*29869*/"COMBINING LIGATURE LEFT HALF BELOW"/* FE27 */, /*29870*/"COMBINING LIGATURE RIGHT HALF BELOW"/* FE28 */,/*29871*/"COMBINING TILDE LEFT HALF BELOW"/* FE29 */, /*29872*/"COMBINING TILDE RIGHT HALF BELOW"/* FE2A */,/*29873*/"COMBINING MACRON LEFT HALF BELOW"/* FE2B */, /*29874*/"COMBINING MACRON RIGHT HALF BELOW"/* FE2C */,/*29875*/"COMBINING CONJOINING MACRON BELOW"/* FE2D */, /*29876*/"COMBINING CYRILLIC TITLO LEFT HALF"/* FE2E */,/*29877*/"COMBINING CYRILLIC TITLO RIGHT HALF"/* FE2F */, /*29878*/"PRESENTATION FORM FOR VERTICAL TWO DOT LEADER"/* FE30 */, /*29879*/"PRESENTATION FORM FOR VERTICAL EM DASH"/* FE31 */,/*29880*/"PRESENTATION FORM FOR VERTICAL EN DASH"/* FE32 */, /*29881*/"PRESENTATION FORM FOR VERTICAL LOW LINE"/* FE33 */, /*29882*/"PRESENTATION FORM FOR VERTICAL WAVY LOW LINE"/* FE34 */, /*29883*/"PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS"/* FE35 */, /*29884*/"PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS"/* FE36 */, /*29885*/"PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET"/* FE37 */, /*29886*/"PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET"/* FE38 */, /*29887*/"PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET"/* FE39 */, /*29888*/"PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET"/* FE3A */, /*29889*/"PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET"/* FE3B */, /*29890*/"PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET"/* FE3C */, /*29891*/"PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET"/* FE3D */, /*29892*/"PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET"/* FE3E */, /*29893*/"PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET"/* FE3F */, /*29894*/"PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET"/* FE40 */, /*29895*/"PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET"/* FE41 */, /*29896*/"PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET"/* FE42 */, /*29897*/"PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET"/* FE43 */, /*29898*/"PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET"/* FE44 */,/*29899*/"SESAME DOT"/* FE45 */, /*29900*/"WHITE SESAME DOT"/* FE46 */,/*29901*/"PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET"/* FE47 */, /*29902*/"PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET"/* FE48 */,/*29903*/"DASHED OVERLINE"/* FE49 */, /*29904*/"CENTRELINE OVERLINE"/* FE4A */,/*29905*/"WAVY OVERLINE"/* FE4B */,/*29906*/"DOUBLE WAVY OVERLINE"/* FE4C */, /*29907*/"DASHED LOW LINE"/* FE4D */,/*29908*/"CENTRELINE LOW LINE"/* FE4E */,/*29909*/"WAVY LOW LINE"/* FE4F */, /*29910*/"SMALL COMMA"/* FE50 */,/*29911*/"SMALL IDEOGRAPHIC COMMA"/* FE51 */,/*29912*/"SMALL FULL STOP"/* FE52 */,NULL, /*29914*/"SMALL SEMICOLON"/* FE54 */,/*29915*/"SMALL COLON"/* FE55 */,/*29916*/"SMALL QUESTION MARK"/* FE56 */, /*29917*/"SMALL EXCLAMATION MARK"/* FE57 */,/*29918*/"SMALL EM DASH"/* FE58 */, /*29919*/"SMALL LEFT PARENTHESIS"/* FE59 */,/*29920*/"SMALL RIGHT PARENTHESIS"/* FE5A */, /*29921*/"SMALL LEFT CURLY BRACKET"/* FE5B */,/*29922*/"SMALL RIGHT CURLY BRACKET"/* FE5C */, /*29923*/"SMALL LEFT TORTOISE SHELL BRACKET"/* FE5D */,/*29924*/"SMALL RIGHT TORTOISE SHELL BRACKET"/* FE5E */, /*29925*/"SMALL NUMBER SIGN"/* FE5F */,/*29926*/"SMALL AMPERSAND"/* FE60 */,/*29927*/"SMALL ASTERISK"/* FE61 */, /*29928*/"SMALL PLUS SIGN"/* FE62 */,/*29929*/"SMALL HYPHEN-MINUS"/* FE63 */,/*29930*/"SMALL LESS-THAN SIGN"/* FE64 */, /*29931*/"SMALL GREATER-THAN SIGN"/* FE65 */,/*29932*/"SMALL EQUALS SIGN"/* FE66 */,NULL, /*29934*/"SMALL REVERSE SOLIDUS"/* FE68 */,/*29935*/"SMALL DOLLAR SIGN"/* FE69 */, /*29936*/"SMALL PERCENT SIGN"/* FE6A */,/*29937*/"SMALL COMMERCIAL AT"/* FE6B */,NULL,NULL,NULL,NULL, /*29942*/"ARABIC FATHATAN ISOLATED FORM"/* FE70 */,/*29943*/"ARABIC TATWEEL WITH FATHATAN ABOVE"/* FE71 */, /*29944*/"ARABIC DAMMATAN ISOLATED FORM"/* FE72 */,/*29945*/"ARABIC TAIL FRAGMENT"/* FE73 */, /*29946*/"ARABIC KASRATAN ISOLATED FORM"/* FE74 */,NULL,/*29948*/"ARABIC FATHA ISOLATED FORM"/* FE76 */, /*29949*/"ARABIC FATHA MEDIAL FORM"/* FE77 */,/*29950*/"ARABIC DAMMA ISOLATED FORM"/* FE78 */, /*29951*/"ARABIC DAMMA MEDIAL FORM"/* FE79 */,/*29952*/"ARABIC KASRA ISOLATED FORM"/* FE7A */, /*29953*/"ARABIC KASRA MEDIAL FORM"/* FE7B */,/*29954*/"ARABIC SHADDA ISOLATED FORM"/* FE7C */, /*29955*/"ARABIC SHADDA MEDIAL FORM"/* FE7D */,/*29956*/"ARABIC SUKUN ISOLATED FORM"/* FE7E */, /*29957*/"ARABIC SUKUN MEDIAL FORM"/* FE7F */,/*29958*/"ARABIC LETTER HAMZA ISOLATED FORM"/* FE80 */, /*29959*/"ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM"/* FE81 */, /*29960*/"ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM"/* FE82 */, /*29961*/"ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM"/* FE83 */, /*29962*/"ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM"/* FE84 */, /*29963*/"ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM"/* FE85 */, /*29964*/"ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM"/* FE86 */, /*29965*/"ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM"/* FE87 */, /*29966*/"ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM"/* FE88 */, /*29967*/"ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM"/* FE89 */, /*29968*/"ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM"/* FE8A */, /*29969*/"ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM"/* FE8B */, /*29970*/"ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM"/* FE8C */, /*29971*/"ARABIC LETTER ALEF ISOLATED FORM"/* FE8D */,/*29972*/"ARABIC LETTER ALEF FINAL FORM"/* FE8E */, /*29973*/"ARABIC LETTER BEH ISOLATED FORM"/* FE8F */,/*29974*/"ARABIC LETTER BEH FINAL FORM"/* FE90 */, /*29975*/"ARABIC LETTER BEH INITIAL FORM"/* FE91 */,/*29976*/"ARABIC LETTER BEH MEDIAL FORM"/* FE92 */, /*29977*/"ARABIC LETTER TEH MARBUTA ISOLATED FORM"/* FE93 */,/*29978*/"ARABIC LETTER TEH MARBUTA FINAL FORM"/* FE94 */, /*29979*/"ARABIC LETTER TEH ISOLATED FORM"/* FE95 */,/*29980*/"ARABIC LETTER TEH FINAL FORM"/* FE96 */, /*29981*/"ARABIC LETTER TEH INITIAL FORM"/* FE97 */,/*29982*/"ARABIC LETTER TEH MEDIAL FORM"/* FE98 */, /*29983*/"ARABIC LETTER THEH ISOLATED FORM"/* FE99 */,/*29984*/"ARABIC LETTER THEH FINAL FORM"/* FE9A */, /*29985*/"ARABIC LETTER THEH INITIAL FORM"/* FE9B */,/*29986*/"ARABIC LETTER THEH MEDIAL FORM"/* FE9C */, /*29987*/"ARABIC LETTER JEEM ISOLATED FORM"/* FE9D */,/*29988*/"ARABIC LETTER JEEM FINAL FORM"/* FE9E */, /*29989*/"ARABIC LETTER JEEM INITIAL FORM"/* FE9F */,/*29990*/"ARABIC LETTER JEEM MEDIAL FORM"/* FEA0 */, /*29991*/"ARABIC LETTER HAH ISOLATED FORM"/* FEA1 */,/*29992*/"ARABIC LETTER HAH FINAL FORM"/* FEA2 */, /*29993*/"ARABIC LETTER HAH INITIAL FORM"/* FEA3 */,/*29994*/"ARABIC LETTER HAH MEDIAL FORM"/* FEA4 */, /*29995*/"ARABIC LETTER KHAH ISOLATED FORM"/* FEA5 */,/*29996*/"ARABIC LETTER KHAH FINAL FORM"/* FEA6 */, /*29997*/"ARABIC LETTER KHAH INITIAL FORM"/* FEA7 */,/*29998*/"ARABIC LETTER KHAH MEDIAL FORM"/* FEA8 */, /*29999*/"ARABIC LETTER DAL ISOLATED FORM"/* FEA9 */,/*30000*/"ARABIC LETTER DAL FINAL FORM"/* FEAA */, /*30001*/"ARABIC LETTER THAL ISOLATED FORM"/* FEAB */,/*30002*/"ARABIC LETTER THAL FINAL FORM"/* FEAC */, /*30003*/"ARABIC LETTER REH ISOLATED FORM"/* FEAD */,/*30004*/"ARABIC LETTER REH FINAL FORM"/* FEAE */, /*30005*/"ARABIC LETTER ZAIN ISOLATED FORM"/* FEAF */,/*30006*/"ARABIC LETTER ZAIN FINAL FORM"/* FEB0 */, /*30007*/"ARABIC LETTER SEEN ISOLATED FORM"/* FEB1 */,/*30008*/"ARABIC LETTER SEEN FINAL FORM"/* FEB2 */, /*30009*/"ARABIC LETTER SEEN INITIAL FORM"/* FEB3 */,/*30010*/"ARABIC LETTER SEEN MEDIAL FORM"/* FEB4 */, /*30011*/"ARABIC LETTER SHEEN ISOLATED FORM"/* FEB5 */,/*30012*/"ARABIC LETTER SHEEN FINAL FORM"/* FEB6 */, /*30013*/"ARABIC LETTER SHEEN INITIAL FORM"/* FEB7 */,/*30014*/"ARABIC LETTER SHEEN MEDIAL FORM"/* FEB8 */, /*30015*/"ARABIC LETTER SAD ISOLATED FORM"/* FEB9 */,/*30016*/"ARABIC LETTER SAD FINAL FORM"/* FEBA */, /*30017*/"ARABIC LETTER SAD INITIAL FORM"/* FEBB */,/*30018*/"ARABIC LETTER SAD MEDIAL FORM"/* FEBC */, /*30019*/"ARABIC LETTER DAD ISOLATED FORM"/* FEBD */,/*30020*/"ARABIC LETTER DAD FINAL FORM"/* FEBE */, /*30021*/"ARABIC LETTER DAD INITIAL FORM"/* FEBF */,/*30022*/"ARABIC LETTER DAD MEDIAL FORM"/* FEC0 */, /*30023*/"ARABIC LETTER TAH ISOLATED FORM"/* FEC1 */,/*30024*/"ARABIC LETTER TAH FINAL FORM"/* FEC2 */, /*30025*/"ARABIC LETTER TAH INITIAL FORM"/* FEC3 */,/*30026*/"ARABIC LETTER TAH MEDIAL FORM"/* FEC4 */, /*30027*/"ARABIC LETTER ZAH ISOLATED FORM"/* FEC5 */,/*30028*/"ARABIC LETTER ZAH FINAL FORM"/* FEC6 */, /*30029*/"ARABIC LETTER ZAH INITIAL FORM"/* FEC7 */,/*30030*/"ARABIC LETTER ZAH MEDIAL FORM"/* FEC8 */, /*30031*/"ARABIC LETTER AIN ISOLATED FORM"/* FEC9 */,/*30032*/"ARABIC LETTER AIN FINAL FORM"/* FECA */, /*30033*/"ARABIC LETTER AIN INITIAL FORM"/* FECB */,/*30034*/"ARABIC LETTER AIN MEDIAL FORM"/* FECC */, /*30035*/"ARABIC LETTER GHAIN ISOLATED FORM"/* FECD */,/*30036*/"ARABIC LETTER GHAIN FINAL FORM"/* FECE */, /*30037*/"ARABIC LETTER GHAIN INITIAL FORM"/* FECF */,/*30038*/"ARABIC LETTER GHAIN MEDIAL FORM"/* FED0 */, /*30039*/"ARABIC LETTER FEH ISOLATED FORM"/* FED1 */,/*30040*/"ARABIC LETTER FEH FINAL FORM"/* FED2 */, /*30041*/"ARABIC LETTER FEH INITIAL FORM"/* FED3 */,/*30042*/"ARABIC LETTER FEH MEDIAL FORM"/* FED4 */, /*30043*/"ARABIC LETTER QAF ISOLATED FORM"/* FED5 */,/*30044*/"ARABIC LETTER QAF FINAL FORM"/* FED6 */, /*30045*/"ARABIC LETTER QAF INITIAL FORM"/* FED7 */,/*30046*/"ARABIC LETTER QAF MEDIAL FORM"/* FED8 */, /*30047*/"ARABIC LETTER KAF ISOLATED FORM"/* FED9 */,/*30048*/"ARABIC LETTER KAF FINAL FORM"/* FEDA */, /*30049*/"ARABIC LETTER KAF INITIAL FORM"/* FEDB */,/*30050*/"ARABIC LETTER KAF MEDIAL FORM"/* FEDC */, /*30051*/"ARABIC LETTER LAM ISOLATED FORM"/* FEDD */,/*30052*/"ARABIC LETTER LAM FINAL FORM"/* FEDE */, /*30053*/"ARABIC LETTER LAM INITIAL FORM"/* FEDF */,/*30054*/"ARABIC LETTER LAM MEDIAL FORM"/* FEE0 */, /*30055*/"ARABIC LETTER MEEM ISOLATED FORM"/* FEE1 */,/*30056*/"ARABIC LETTER MEEM FINAL FORM"/* FEE2 */, /*30057*/"ARABIC LETTER MEEM INITIAL FORM"/* FEE3 */,/*30058*/"ARABIC LETTER MEEM MEDIAL FORM"/* FEE4 */, /*30059*/"ARABIC LETTER NOON ISOLATED FORM"/* FEE5 */,/*30060*/"ARABIC LETTER NOON FINAL FORM"/* FEE6 */, /*30061*/"ARABIC LETTER NOON INITIAL FORM"/* FEE7 */,/*30062*/"ARABIC LETTER NOON MEDIAL FORM"/* FEE8 */, /*30063*/"ARABIC LETTER HEH ISOLATED FORM"/* FEE9 */,/*30064*/"ARABIC LETTER HEH FINAL FORM"/* FEEA */, /*30065*/"ARABIC LETTER HEH INITIAL FORM"/* FEEB */,/*30066*/"ARABIC LETTER HEH MEDIAL FORM"/* FEEC */, /*30067*/"ARABIC LETTER WAW ISOLATED FORM"/* FEED */,/*30068*/"ARABIC LETTER WAW FINAL FORM"/* FEEE */, /*30069*/"ARABIC LETTER ALEF MAKSURA ISOLATED FORM"/* FEEF */,/*30070*/"ARABIC LETTER ALEF MAKSURA FINAL FORM"/* FEF0 */, /*30071*/"ARABIC LETTER YEH ISOLATED FORM"/* FEF1 */,/*30072*/"ARABIC LETTER YEH FINAL FORM"/* FEF2 */, /*30073*/"ARABIC LETTER YEH INITIAL FORM"/* FEF3 */,/*30074*/"ARABIC LETTER YEH MEDIAL FORM"/* FEF4 */, /*30075*/"ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM"/* FEF5 */, /*30076*/"ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM"/* FEF6 */, /*30077*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM"/* FEF7 */, /*30078*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM"/* FEF8 */, /*30079*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM"/* FEF9 */, /*30080*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM"/* FEFA */, /*30081*/"ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM"/* FEFB */, /*30082*/"ARABIC LIGATURE LAM WITH ALEF FINAL FORM"/* FEFC */,NULL,NULL,/*30085*/"ZERO WIDTH NO-BREAK SPACE"/* FEFF */, NULL,/*30087*/"FULLWIDTH EXCLAMATION MARK"/* FF01 */,/*30088*/"FULLWIDTH QUOTATION MARK"/* FF02 */, /*30089*/"FULLWIDTH NUMBER SIGN"/* FF03 */,/*30090*/"FULLWIDTH DOLLAR SIGN"/* FF04 */, /*30091*/"FULLWIDTH PERCENT SIGN"/* FF05 */,/*30092*/"FULLWIDTH AMPERSAND"/* FF06 */, /*30093*/"FULLWIDTH APOSTROPHE"/* FF07 */,/*30094*/"FULLWIDTH LEFT PARENTHESIS"/* FF08 */, /*30095*/"FULLWIDTH RIGHT PARENTHESIS"/* FF09 */,/*30096*/"FULLWIDTH ASTERISK"/* FF0A */, /*30097*/"FULLWIDTH PLUS SIGN"/* FF0B */,/*30098*/"FULLWIDTH COMMA"/* FF0C */, /*30099*/"FULLWIDTH HYPHEN-MINUS"/* FF0D */,/*30100*/"FULLWIDTH FULL STOP"/* FF0E */, /*30101*/"FULLWIDTH SOLIDUS"/* FF0F */,/*30102*/"FULLWIDTH DIGIT ZERO"/* FF10 */, /*30103*/"FULLWIDTH DIGIT ONE"/* FF11 */,/*30104*/"FULLWIDTH DIGIT TWO"/* FF12 */, /*30105*/"FULLWIDTH DIGIT THREE"/* FF13 */,/*30106*/"FULLWIDTH DIGIT FOUR"/* FF14 */, /*30107*/"FULLWIDTH DIGIT FIVE"/* FF15 */,/*30108*/"FULLWIDTH DIGIT SIX"/* FF16 */, /*30109*/"FULLWIDTH DIGIT SEVEN"/* FF17 */,/*30110*/"FULLWIDTH DIGIT EIGHT"/* FF18 */, /*30111*/"FULLWIDTH DIGIT NINE"/* FF19 */,/*30112*/"FULLWIDTH COLON"/* FF1A */,/*30113*/"FULLWIDTH SEMICOLON"/* FF1B */, /*30114*/"FULLWIDTH LESS-THAN SIGN"/* FF1C */,/*30115*/"FULLWIDTH EQUALS SIGN"/* FF1D */, /*30116*/"FULLWIDTH GREATER-THAN SIGN"/* FF1E */,/*30117*/"FULLWIDTH QUESTION MARK"/* FF1F */, /*30118*/"FULLWIDTH COMMERCIAL AT"/* FF20 */,/*30119*/"FULLWIDTH LATIN CAPITAL LETTER A"/* FF21 */, /*30120*/"FULLWIDTH LATIN CAPITAL LETTER B"/* FF22 */,/*30121*/"FULLWIDTH LATIN CAPITAL LETTER C"/* FF23 */, /*30122*/"FULLWIDTH LATIN CAPITAL LETTER D"/* FF24 */,/*30123*/"FULLWIDTH LATIN CAPITAL LETTER E"/* FF25 */, /*30124*/"FULLWIDTH LATIN CAPITAL LETTER F"/* FF26 */,/*30125*/"FULLWIDTH LATIN CAPITAL LETTER G"/* FF27 */, /*30126*/"FULLWIDTH LATIN CAPITAL LETTER H"/* FF28 */,/*30127*/"FULLWIDTH LATIN CAPITAL LETTER I"/* FF29 */, /*30128*/"FULLWIDTH LATIN CAPITAL LETTER J"/* FF2A */,/*30129*/"FULLWIDTH LATIN CAPITAL LETTER K"/* FF2B */, /*30130*/"FULLWIDTH LATIN CAPITAL LETTER L"/* FF2C */,/*30131*/"FULLWIDTH LATIN CAPITAL LETTER M"/* FF2D */, /*30132*/"FULLWIDTH LATIN CAPITAL LETTER N"/* FF2E */,/*30133*/"FULLWIDTH LATIN CAPITAL LETTER O"/* FF2F */, /*30134*/"FULLWIDTH LATIN CAPITAL LETTER P"/* FF30 */,/*30135*/"FULLWIDTH LATIN CAPITAL LETTER Q"/* FF31 */, /*30136*/"FULLWIDTH LATIN CAPITAL LETTER R"/* FF32 */,/*30137*/"FULLWIDTH LATIN CAPITAL LETTER S"/* FF33 */, /*30138*/"FULLWIDTH LATIN CAPITAL LETTER T"/* FF34 */,/*30139*/"FULLWIDTH LATIN CAPITAL LETTER U"/* FF35 */, /*30140*/"FULLWIDTH LATIN CAPITAL LETTER V"/* FF36 */,/*30141*/"FULLWIDTH LATIN CAPITAL LETTER W"/* FF37 */, /*30142*/"FULLWIDTH LATIN CAPITAL LETTER X"/* FF38 */,/*30143*/"FULLWIDTH LATIN CAPITAL LETTER Y"/* FF39 */, /*30144*/"FULLWIDTH LATIN CAPITAL LETTER Z"/* FF3A */,/*30145*/"FULLWIDTH LEFT SQUARE BRACKET"/* FF3B */, /*30146*/"FULLWIDTH REVERSE SOLIDUS"/* FF3C */,/*30147*/"FULLWIDTH RIGHT SQUARE BRACKET"/* FF3D */, /*30148*/"FULLWIDTH CIRCUMFLEX ACCENT"/* FF3E */,/*30149*/"FULLWIDTH LOW LINE"/* FF3F */, /*30150*/"FULLWIDTH GRAVE ACCENT"/* FF40 */,/*30151*/"FULLWIDTH LATIN SMALL LETTER A"/* FF41 */, /*30152*/"FULLWIDTH LATIN SMALL LETTER B"/* FF42 */,/*30153*/"FULLWIDTH LATIN SMALL LETTER C"/* FF43 */, /*30154*/"FULLWIDTH LATIN SMALL LETTER D"/* FF44 */,/*30155*/"FULLWIDTH LATIN SMALL LETTER E"/* FF45 */, /*30156*/"FULLWIDTH LATIN SMALL LETTER F"/* FF46 */,/*30157*/"FULLWIDTH LATIN SMALL LETTER G"/* FF47 */, /*30158*/"FULLWIDTH LATIN SMALL LETTER H"/* FF48 */,/*30159*/"FULLWIDTH LATIN SMALL LETTER I"/* FF49 */, /*30160*/"FULLWIDTH LATIN SMALL LETTER J"/* FF4A */,/*30161*/"FULLWIDTH LATIN SMALL LETTER K"/* FF4B */, /*30162*/"FULLWIDTH LATIN SMALL LETTER L"/* FF4C */,/*30163*/"FULLWIDTH LATIN SMALL LETTER M"/* FF4D */, /*30164*/"FULLWIDTH LATIN SMALL LETTER N"/* FF4E */,/*30165*/"FULLWIDTH LATIN SMALL LETTER O"/* FF4F */, /*30166*/"FULLWIDTH LATIN SMALL LETTER P"/* FF50 */,/*30167*/"FULLWIDTH LATIN SMALL LETTER Q"/* FF51 */, /*30168*/"FULLWIDTH LATIN SMALL LETTER R"/* FF52 */,/*30169*/"FULLWIDTH LATIN SMALL LETTER S"/* FF53 */, /*30170*/"FULLWIDTH LATIN SMALL LETTER T"/* FF54 */,/*30171*/"FULLWIDTH LATIN SMALL LETTER U"/* FF55 */, /*30172*/"FULLWIDTH LATIN SMALL LETTER V"/* FF56 */,/*30173*/"FULLWIDTH LATIN SMALL LETTER W"/* FF57 */, /*30174*/"FULLWIDTH LATIN SMALL LETTER X"/* FF58 */,/*30175*/"FULLWIDTH LATIN SMALL LETTER Y"/* FF59 */, /*30176*/"FULLWIDTH LATIN SMALL LETTER Z"/* FF5A */,/*30177*/"FULLWIDTH LEFT CURLY BRACKET"/* FF5B */, /*30178*/"FULLWIDTH VERTICAL LINE"/* FF5C */,/*30179*/"FULLWIDTH RIGHT CURLY BRACKET"/* FF5D */, /*30180*/"FULLWIDTH TILDE"/* FF5E */,/*30181*/"FULLWIDTH LEFT WHITE PARENTHESIS"/* FF5F */, /*30182*/"FULLWIDTH RIGHT WHITE PARENTHESIS"/* FF60 */,/*30183*/"HALFWIDTH IDEOGRAPHIC FULL STOP"/* FF61 */, /*30184*/"HALFWIDTH LEFT CORNER BRACKET"/* FF62 */,/*30185*/"HALFWIDTH RIGHT CORNER BRACKET"/* FF63 */, /*30186*/"HALFWIDTH IDEOGRAPHIC COMMA"/* FF64 */,/*30187*/"HALFWIDTH KATAKANA MIDDLE DOT"/* FF65 */, /*30188*/"HALFWIDTH KATAKANA LETTER WO"/* FF66 */,/*30189*/"HALFWIDTH KATAKANA LETTER SMALL A"/* FF67 */, /*30190*/"HALFWIDTH KATAKANA LETTER SMALL I"/* FF68 */,/*30191*/"HALFWIDTH KATAKANA LETTER SMALL U"/* FF69 */, /*30192*/"HALFWIDTH KATAKANA LETTER SMALL E"/* FF6A */,/*30193*/"HALFWIDTH KATAKANA LETTER SMALL O"/* FF6B */, /*30194*/"HALFWIDTH KATAKANA LETTER SMALL YA"/* FF6C */,/*30195*/"HALFWIDTH KATAKANA LETTER SMALL YU"/* FF6D */, /*30196*/"HALFWIDTH KATAKANA LETTER SMALL YO"/* FF6E */,/*30197*/"HALFWIDTH KATAKANA LETTER SMALL TU"/* FF6F */, /*30198*/"HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK"/* FF70 */,/*30199*/"HALFWIDTH KATAKANA LETTER A"/* FF71 */, /*30200*/"HALFWIDTH KATAKANA LETTER I"/* FF72 */,/*30201*/"HALFWIDTH KATAKANA LETTER U"/* FF73 */, /*30202*/"HALFWIDTH KATAKANA LETTER E"/* FF74 */,/*30203*/"HALFWIDTH KATAKANA LETTER O"/* FF75 */, /*30204*/"HALFWIDTH KATAKANA LETTER KA"/* FF76 */,/*30205*/"HALFWIDTH KATAKANA LETTER KI"/* FF77 */, /*30206*/"HALFWIDTH KATAKANA LETTER KU"/* FF78 */,/*30207*/"HALFWIDTH KATAKANA LETTER KE"/* FF79 */, /*30208*/"HALFWIDTH KATAKANA LETTER KO"/* FF7A */,/*30209*/"HALFWIDTH KATAKANA LETTER SA"/* FF7B */, /*30210*/"HALFWIDTH KATAKANA LETTER SI"/* FF7C */,/*30211*/"HALFWIDTH KATAKANA LETTER SU"/* FF7D */, /*30212*/"HALFWIDTH KATAKANA LETTER SE"/* FF7E */,/*30213*/"HALFWIDTH KATAKANA LETTER SO"/* FF7F */, /*30214*/"HALFWIDTH KATAKANA LETTER TA"/* FF80 */,/*30215*/"HALFWIDTH KATAKANA LETTER TI"/* FF81 */, /*30216*/"HALFWIDTH KATAKANA LETTER TU"/* FF82 */,/*30217*/"HALFWIDTH KATAKANA LETTER TE"/* FF83 */, /*30218*/"HALFWIDTH KATAKANA LETTER TO"/* FF84 */,/*30219*/"HALFWIDTH KATAKANA LETTER NA"/* FF85 */, /*30220*/"HALFWIDTH KATAKANA LETTER NI"/* FF86 */,/*30221*/"HALFWIDTH KATAKANA LETTER NU"/* FF87 */, /*30222*/"HALFWIDTH KATAKANA LETTER NE"/* FF88 */,/*30223*/"HALFWIDTH KATAKANA LETTER NO"/* FF89 */, /*30224*/"HALFWIDTH KATAKANA LETTER HA"/* FF8A */,/*30225*/"HALFWIDTH KATAKANA LETTER HI"/* FF8B */, /*30226*/"HALFWIDTH KATAKANA LETTER HU"/* FF8C */,/*30227*/"HALFWIDTH KATAKANA LETTER HE"/* FF8D */, /*30228*/"HALFWIDTH KATAKANA LETTER HO"/* FF8E */,/*30229*/"HALFWIDTH KATAKANA LETTER MA"/* FF8F */, /*30230*/"HALFWIDTH KATAKANA LETTER MI"/* FF90 */,/*30231*/"HALFWIDTH KATAKANA LETTER MU"/* FF91 */, /*30232*/"HALFWIDTH KATAKANA LETTER ME"/* FF92 */,/*30233*/"HALFWIDTH KATAKANA LETTER MO"/* FF93 */, /*30234*/"HALFWIDTH KATAKANA LETTER YA"/* FF94 */,/*30235*/"HALFWIDTH KATAKANA LETTER YU"/* FF95 */, /*30236*/"HALFWIDTH KATAKANA LETTER YO"/* FF96 */,/*30237*/"HALFWIDTH KATAKANA LETTER RA"/* FF97 */, /*30238*/"HALFWIDTH KATAKANA LETTER RI"/* FF98 */,/*30239*/"HALFWIDTH KATAKANA LETTER RU"/* FF99 */, /*30240*/"HALFWIDTH KATAKANA LETTER RE"/* FF9A */,/*30241*/"HALFWIDTH KATAKANA LETTER RO"/* FF9B */, /*30242*/"HALFWIDTH KATAKANA LETTER WA"/* FF9C */,/*30243*/"HALFWIDTH KATAKANA LETTER N"/* FF9D */, /*30244*/"HALFWIDTH KATAKANA VOICED SOUND MARK"/* FF9E */,/*30245*/"HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK"/* FF9F */, /*30246*/"HALFWIDTH HANGUL FILLER"/* FFA0 */,/*30247*/"HALFWIDTH HANGUL LETTER KIYEOK"/* FFA1 */, /*30248*/"HALFWIDTH HANGUL LETTER SSANGKIYEOK"/* FFA2 */,/*30249*/"HALFWIDTH HANGUL LETTER KIYEOK-SIOS"/* FFA3 */, /*30250*/"HALFWIDTH HANGUL LETTER NIEUN"/* FFA4 */,/*30251*/"HALFWIDTH HANGUL LETTER NIEUN-CIEUC"/* FFA5 */, /*30252*/"HALFWIDTH HANGUL LETTER NIEUN-HIEUH"/* FFA6 */,/*30253*/"HALFWIDTH HANGUL LETTER TIKEUT"/* FFA7 */, /*30254*/"HALFWIDTH HANGUL LETTER SSANGTIKEUT"/* FFA8 */,/*30255*/"HALFWIDTH HANGUL LETTER RIEUL"/* FFA9 */, /*30256*/"HALFWIDTH HANGUL LETTER RIEUL-KIYEOK"/* FFAA */,/*30257*/"HALFWIDTH HANGUL LETTER RIEUL-MIEUM"/* FFAB */, /*30258*/"HALFWIDTH HANGUL LETTER RIEUL-PIEUP"/* FFAC */,/*30259*/"HALFWIDTH HANGUL LETTER RIEUL-SIOS"/* FFAD */, /*30260*/"HALFWIDTH HANGUL LETTER RIEUL-THIEUTH"/* FFAE */,/*30261*/"HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH"/* FFAF */, /*30262*/"HALFWIDTH HANGUL LETTER RIEUL-HIEUH"/* FFB0 */,/*30263*/"HALFWIDTH HANGUL LETTER MIEUM"/* FFB1 */, /*30264*/"HALFWIDTH HANGUL LETTER PIEUP"/* FFB2 */,/*30265*/"HALFWIDTH HANGUL LETTER SSANGPIEUP"/* FFB3 */, /*30266*/"HALFWIDTH HANGUL LETTER PIEUP-SIOS"/* FFB4 */,/*30267*/"HALFWIDTH HANGUL LETTER SIOS"/* FFB5 */, /*30268*/"HALFWIDTH HANGUL LETTER SSANGSIOS"/* FFB6 */,/*30269*/"HALFWIDTH HANGUL LETTER IEUNG"/* FFB7 */, /*30270*/"HALFWIDTH HANGUL LETTER CIEUC"/* FFB8 */,/*30271*/"HALFWIDTH HANGUL LETTER SSANGCIEUC"/* FFB9 */, /*30272*/"HALFWIDTH HANGUL LETTER CHIEUCH"/* FFBA */,/*30273*/"HALFWIDTH HANGUL LETTER KHIEUKH"/* FFBB */, /*30274*/"HALFWIDTH HANGUL LETTER THIEUTH"/* FFBC */,/*30275*/"HALFWIDTH HANGUL LETTER PHIEUPH"/* FFBD */, /*30276*/"HALFWIDTH HANGUL LETTER HIEUH"/* FFBE */,NULL,NULL,NULL,/*30280*/"HALFWIDTH HANGUL LETTER A"/* FFC2 */, /*30281*/"HALFWIDTH HANGUL LETTER AE"/* FFC3 */,/*30282*/"HALFWIDTH HANGUL LETTER YA"/* FFC4 */, /*30283*/"HALFWIDTH HANGUL LETTER YAE"/* FFC5 */,/*30284*/"HALFWIDTH HANGUL LETTER EO"/* FFC6 */, /*30285*/"HALFWIDTH HANGUL LETTER E"/* FFC7 */,NULL,NULL,/*30288*/"HALFWIDTH HANGUL LETTER YEO"/* FFCA */, /*30289*/"HALFWIDTH HANGUL LETTER YE"/* FFCB */,/*30290*/"HALFWIDTH HANGUL LETTER O"/* FFCC */, /*30291*/"HALFWIDTH HANGUL LETTER WA"/* FFCD */,/*30292*/"HALFWIDTH HANGUL LETTER WAE"/* FFCE */, /*30293*/"HALFWIDTH HANGUL LETTER OE"/* FFCF */,NULL,NULL,/*30296*/"HALFWIDTH HANGUL LETTER YO"/* FFD2 */, /*30297*/"HALFWIDTH HANGUL LETTER U"/* FFD3 */,/*30298*/"HALFWIDTH HANGUL LETTER WEO"/* FFD4 */, /*30299*/"HALFWIDTH HANGUL LETTER WE"/* FFD5 */,/*30300*/"HALFWIDTH HANGUL LETTER WI"/* FFD6 */, /*30301*/"HALFWIDTH HANGUL LETTER YU"/* FFD7 */,NULL,NULL,/*30304*/"HALFWIDTH HANGUL LETTER EU"/* FFDA */, /*30305*/"HALFWIDTH HANGUL LETTER YI"/* FFDB */,/*30306*/"HALFWIDTH HANGUL LETTER I"/* FFDC */,NULL,NULL,NULL, /*30310*/"FULLWIDTH CENT SIGN"/* FFE0 */,/*30311*/"FULLWIDTH POUND SIGN"/* FFE1 */, /*30312*/"FULLWIDTH NOT SIGN"/* FFE2 */,/*30313*/"FULLWIDTH MACRON"/* FFE3 */,/*30314*/"FULLWIDTH BROKEN BAR"/* FFE4 */, /*30315*/"FULLWIDTH YEN SIGN"/* FFE5 */,/*30316*/"FULLWIDTH WON SIGN"/* FFE6 */,NULL, /*30318*/"HALFWIDTH FORMS LIGHT VERTICAL"/* FFE8 */,/*30319*/"HALFWIDTH LEFTWARDS ARROW"/* FFE9 */, /*30320*/"HALFWIDTH UPWARDS ARROW"/* FFEA */,/*30321*/"HALFWIDTH RIGHTWARDS ARROW"/* FFEB */, /*30322*/"HALFWIDTH DOWNWARDS ARROW"/* FFEC */,/*30323*/"HALFWIDTH BLACK SQUARE"/* FFED */, /*30324*/"HALFWIDTH WHITE CIRCLE"/* FFEE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30335*/"INTERLINEAR ANNOTATION ANCHOR"/* FFF9 */,/*30336*/"INTERLINEAR ANNOTATION SEPARATOR"/* FFFA */, /*30337*/"INTERLINEAR ANNOTATION TERMINATOR"/* FFFB */,/*30338*/"OBJECT REPLACEMENT CHARACTER"/* FFFC */, /*30339*/"REPLACEMENT CHARACTER"/* FFFD */,/*30340*/"LINEAR B SYLLABLE B008 A"/* 10000 */, /*30341*/"LINEAR B SYLLABLE B038 E"/* 10001 */,/*30342*/"LINEAR B SYLLABLE B028 I"/* 10002 */, /*30343*/"LINEAR B SYLLABLE B061 O"/* 10003 */,/*30344*/"LINEAR B SYLLABLE B010 U"/* 10004 */, /*30345*/"LINEAR B SYLLABLE B001 DA"/* 10005 */,/*30346*/"LINEAR B SYLLABLE B045 DE"/* 10006 */, /*30347*/"LINEAR B SYLLABLE B007 DI"/* 10007 */,/*30348*/"LINEAR B SYLLABLE B014 DO"/* 10008 */, /*30349*/"LINEAR B SYLLABLE B051 DU"/* 10009 */,/*30350*/"LINEAR B SYLLABLE B057 JA"/* 1000A */, /*30351*/"LINEAR B SYLLABLE B046 JE"/* 1000B */,NULL,/*30353*/"LINEAR B SYLLABLE B036 JO"/* 1000D */, /*30354*/"LINEAR B SYLLABLE B065 JU"/* 1000E */,/*30355*/"LINEAR B SYLLABLE B077 KA"/* 1000F */, /*30356*/"LINEAR B SYLLABLE B044 KE"/* 10010 */,/*30357*/"LINEAR B SYLLABLE B067 KI"/* 10011 */, /*30358*/"LINEAR B SYLLABLE B070 KO"/* 10012 */,/*30359*/"LINEAR B SYLLABLE B081 KU"/* 10013 */, /*30360*/"LINEAR B SYLLABLE B080 MA"/* 10014 */,/*30361*/"LINEAR B SYLLABLE B013 ME"/* 10015 */, /*30362*/"LINEAR B SYLLABLE B073 MI"/* 10016 */,/*30363*/"LINEAR B SYLLABLE B015 MO"/* 10017 */, /*30364*/"LINEAR B SYLLABLE B023 MU"/* 10018 */,/*30365*/"LINEAR B SYLLABLE B006 NA"/* 10019 */, /*30366*/"LINEAR B SYLLABLE B024 NE"/* 1001A */,/*30367*/"LINEAR B SYLLABLE B030 NI"/* 1001B */, /*30368*/"LINEAR B SYLLABLE B052 NO"/* 1001C */,/*30369*/"LINEAR B SYLLABLE B055 NU"/* 1001D */, /*30370*/"LINEAR B SYLLABLE B003 PA"/* 1001E */,/*30371*/"LINEAR B SYLLABLE B072 PE"/* 1001F */, /*30372*/"LINEAR B SYLLABLE B039 PI"/* 10020 */,/*30373*/"LINEAR B SYLLABLE B011 PO"/* 10021 */, /*30374*/"LINEAR B SYLLABLE B050 PU"/* 10022 */,/*30375*/"LINEAR B SYLLABLE B016 QA"/* 10023 */, /*30376*/"LINEAR B SYLLABLE B078 QE"/* 10024 */,/*30377*/"LINEAR B SYLLABLE B021 QI"/* 10025 */, /*30378*/"LINEAR B SYLLABLE B032 QO"/* 10026 */,NULL,/*30380*/"LINEAR B SYLLABLE B060 RA"/* 10028 */, /*30381*/"LINEAR B SYLLABLE B027 RE"/* 10029 */,/*30382*/"LINEAR B SYLLABLE B053 RI"/* 1002A */, /*30383*/"LINEAR B SYLLABLE B002 RO"/* 1002B */,/*30384*/"LINEAR B SYLLABLE B026 RU"/* 1002C */, /*30385*/"LINEAR B SYLLABLE B031 SA"/* 1002D */,/*30386*/"LINEAR B SYLLABLE B009 SE"/* 1002E */, /*30387*/"LINEAR B SYLLABLE B041 SI"/* 1002F */,/*30388*/"LINEAR B SYLLABLE B012 SO"/* 10030 */, /*30389*/"LINEAR B SYLLABLE B058 SU"/* 10031 */,/*30390*/"LINEAR B SYLLABLE B059 TA"/* 10032 */, /*30391*/"LINEAR B SYLLABLE B004 TE"/* 10033 */,/*30392*/"LINEAR B SYLLABLE B037 TI"/* 10034 */, /*30393*/"LINEAR B SYLLABLE B005 TO"/* 10035 */,/*30394*/"LINEAR B SYLLABLE B069 TU"/* 10036 */, /*30395*/"LINEAR B SYLLABLE B054 WA"/* 10037 */,/*30396*/"LINEAR B SYLLABLE B075 WE"/* 10038 */, /*30397*/"LINEAR B SYLLABLE B040 WI"/* 10039 */,/*30398*/"LINEAR B SYLLABLE B042 WO"/* 1003A */,NULL, /*30400*/"LINEAR B SYLLABLE B017 ZA"/* 1003C */,/*30401*/"LINEAR B SYLLABLE B074 ZE"/* 1003D */,NULL, /*30403*/"LINEAR B SYLLABLE B020 ZO"/* 1003F */,/*30404*/"LINEAR B SYLLABLE B025 A2"/* 10040 */, /*30405*/"LINEAR B SYLLABLE B043 A3"/* 10041 */,/*30406*/"LINEAR B SYLLABLE B085 AU"/* 10042 */, /*30407*/"LINEAR B SYLLABLE B071 DWE"/* 10043 */,/*30408*/"LINEAR B SYLLABLE B090 DWO"/* 10044 */, /*30409*/"LINEAR B SYLLABLE B048 NWA"/* 10045 */,/*30410*/"LINEAR B SYLLABLE B029 PU2"/* 10046 */, /*30411*/"LINEAR B SYLLABLE B062 PTE"/* 10047 */,/*30412*/"LINEAR B SYLLABLE B076 RA2"/* 10048 */, /*30413*/"LINEAR B SYLLABLE B033 RA3"/* 10049 */,/*30414*/"LINEAR B SYLLABLE B068 RO2"/* 1004A */, /*30415*/"LINEAR B SYLLABLE B066 TA2"/* 1004B */,/*30416*/"LINEAR B SYLLABLE B087 TWE"/* 1004C */, /*30417*/"LINEAR B SYLLABLE B091 TWO"/* 1004D */,NULL,NULL,/*30420*/"LINEAR B SYMBOL B018"/* 10050 */, /*30421*/"LINEAR B SYMBOL B019"/* 10051 */,/*30422*/"LINEAR B SYMBOL B022"/* 10052 */, /*30423*/"LINEAR B SYMBOL B034"/* 10053 */,/*30424*/"LINEAR B SYMBOL B047"/* 10054 */, /*30425*/"LINEAR B SYMBOL B049"/* 10055 */,/*30426*/"LINEAR B SYMBOL B056"/* 10056 */, /*30427*/"LINEAR B SYMBOL B063"/* 10057 */,/*30428*/"LINEAR B SYMBOL B064"/* 10058 */, /*30429*/"LINEAR B SYMBOL B079"/* 10059 */,/*30430*/"LINEAR B SYMBOL B082"/* 1005A */, /*30431*/"LINEAR B SYMBOL B083"/* 1005B */,/*30432*/"LINEAR B SYMBOL B086"/* 1005C */, /*30433*/"LINEAR B SYMBOL B089"/* 1005D */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30468*/"LINEAR B IDEOGRAM B100 MAN"/* 10080 */,/*30469*/"LINEAR B IDEOGRAM B102 WOMAN"/* 10081 */, /*30470*/"LINEAR B IDEOGRAM B104 DEER"/* 10082 */,/*30471*/"LINEAR B IDEOGRAM B105 EQUID"/* 10083 */, /*30472*/"LINEAR B IDEOGRAM B105F MARE"/* 10084 */,/*30473*/"LINEAR B IDEOGRAM B105M STALLION"/* 10085 */, /*30474*/"LINEAR B IDEOGRAM B106F EWE"/* 10086 */,/*30475*/"LINEAR B IDEOGRAM B106M RAM"/* 10087 */, /*30476*/"LINEAR B IDEOGRAM B107F SHE-GOAT"/* 10088 */,/*30477*/"LINEAR B IDEOGRAM B107M HE-GOAT"/* 10089 */, /*30478*/"LINEAR B IDEOGRAM B108F SOW"/* 1008A */,/*30479*/"LINEAR B IDEOGRAM B108M BOAR"/* 1008B */, /*30480*/"LINEAR B IDEOGRAM B109F COW"/* 1008C */,/*30481*/"LINEAR B IDEOGRAM B109M BULL"/* 1008D */, /*30482*/"LINEAR B IDEOGRAM B120 WHEAT"/* 1008E */,/*30483*/"LINEAR B IDEOGRAM B121 BARLEY"/* 1008F */, /*30484*/"LINEAR B IDEOGRAM B122 OLIVE"/* 10090 */,/*30485*/"LINEAR B IDEOGRAM B123 SPICE"/* 10091 */, /*30486*/"LINEAR B IDEOGRAM B125 CYPERUS"/* 10092 */,/*30487*/"LINEAR B MONOGRAM B127 KAPO"/* 10093 */, /*30488*/"LINEAR B MONOGRAM B128 KANAKO"/* 10094 */,/*30489*/"LINEAR B IDEOGRAM B130 OIL"/* 10095 */, /*30490*/"LINEAR B IDEOGRAM B131 WINE"/* 10096 */,/*30491*/"LINEAR B IDEOGRAM B132"/* 10097 */, /*30492*/"LINEAR B MONOGRAM B133 AREPA"/* 10098 */,/*30493*/"LINEAR B MONOGRAM B135 MERI"/* 10099 */, /*30494*/"LINEAR B IDEOGRAM B140 BRONZE"/* 1009A */,/*30495*/"LINEAR B IDEOGRAM B141 GOLD"/* 1009B */, /*30496*/"LINEAR B IDEOGRAM B142"/* 1009C */,/*30497*/"LINEAR B IDEOGRAM B145 WOOL"/* 1009D */, /*30498*/"LINEAR B IDEOGRAM B146"/* 1009E */,/*30499*/"LINEAR B IDEOGRAM B150"/* 1009F */, /*30500*/"LINEAR B IDEOGRAM B151 HORN"/* 100A0 */,/*30501*/"LINEAR B IDEOGRAM B152"/* 100A1 */, /*30502*/"LINEAR B IDEOGRAM B153"/* 100A2 */,/*30503*/"LINEAR B IDEOGRAM B154"/* 100A3 */, /*30504*/"LINEAR B MONOGRAM B156 TURO2"/* 100A4 */,/*30505*/"LINEAR B IDEOGRAM B157"/* 100A5 */, /*30506*/"LINEAR B IDEOGRAM B158"/* 100A6 */,/*30507*/"LINEAR B IDEOGRAM B159 CLOTH"/* 100A7 */, /*30508*/"LINEAR B IDEOGRAM B160"/* 100A8 */,/*30509*/"LINEAR B IDEOGRAM B161"/* 100A9 */, /*30510*/"LINEAR B IDEOGRAM B162 GARMENT"/* 100AA */,/*30511*/"LINEAR B IDEOGRAM B163 ARMOUR"/* 100AB */, /*30512*/"LINEAR B IDEOGRAM B164"/* 100AC */,/*30513*/"LINEAR B IDEOGRAM B165"/* 100AD */, /*30514*/"LINEAR B IDEOGRAM B166"/* 100AE */,/*30515*/"LINEAR B IDEOGRAM B167"/* 100AF */, /*30516*/"LINEAR B IDEOGRAM B168"/* 100B0 */,/*30517*/"LINEAR B IDEOGRAM B169"/* 100B1 */, /*30518*/"LINEAR B IDEOGRAM B170"/* 100B2 */,/*30519*/"LINEAR B IDEOGRAM B171"/* 100B3 */, /*30520*/"LINEAR B IDEOGRAM B172"/* 100B4 */,/*30521*/"LINEAR B IDEOGRAM B173 MONTH"/* 100B5 */, /*30522*/"LINEAR B IDEOGRAM B174"/* 100B6 */,/*30523*/"LINEAR B IDEOGRAM B176 TREE"/* 100B7 */, /*30524*/"LINEAR B IDEOGRAM B177"/* 100B8 */,/*30525*/"LINEAR B IDEOGRAM B178"/* 100B9 */, /*30526*/"LINEAR B IDEOGRAM B179"/* 100BA */,/*30527*/"LINEAR B IDEOGRAM B180"/* 100BB */, /*30528*/"LINEAR B IDEOGRAM B181"/* 100BC */,/*30529*/"LINEAR B IDEOGRAM B182"/* 100BD */, /*30530*/"LINEAR B IDEOGRAM B183"/* 100BE */,/*30531*/"LINEAR B IDEOGRAM B184"/* 100BF */, /*30532*/"LINEAR B IDEOGRAM B185"/* 100C0 */,/*30533*/"LINEAR B IDEOGRAM B189"/* 100C1 */, /*30534*/"LINEAR B IDEOGRAM B190"/* 100C2 */,/*30535*/"LINEAR B IDEOGRAM B191 HELMET"/* 100C3 */, /*30536*/"LINEAR B IDEOGRAM B220 FOOTSTOOL"/* 100C4 */,/*30537*/"LINEAR B IDEOGRAM B225 BATHTUB"/* 100C5 */, /*30538*/"LINEAR B IDEOGRAM B230 SPEAR"/* 100C6 */,/*30539*/"LINEAR B IDEOGRAM B231 ARROW"/* 100C7 */, /*30540*/"LINEAR B IDEOGRAM B232"/* 100C8 */,/*30541*/"LINEAR B IDEOGRAM B233 SWORD"/* 100C9 */, /*30542*/"LINEAR B IDEOGRAM B234"/* 100CA */,/*30543*/"LINEAR B IDEOGRAM B236"/* 100CB */, /*30544*/"LINEAR B IDEOGRAM B240 WHEELED CHARIOT"/* 100CC */,/*30545*/"LINEAR B IDEOGRAM B241 CHARIOT"/* 100CD */, /*30546*/"LINEAR B IDEOGRAM B242 CHARIOT FRAME"/* 100CE */,/*30547*/"LINEAR B IDEOGRAM B243 WHEEL"/* 100CF */, /*30548*/"LINEAR B IDEOGRAM B245"/* 100D0 */,/*30549*/"LINEAR B IDEOGRAM B246"/* 100D1 */, /*30550*/"LINEAR B MONOGRAM B247 DIPTE"/* 100D2 */,/*30551*/"LINEAR B IDEOGRAM B248"/* 100D3 */, /*30552*/"LINEAR B IDEOGRAM B249"/* 100D4 */,/*30553*/"LINEAR B IDEOGRAM B251"/* 100D5 */, /*30554*/"LINEAR B IDEOGRAM B252"/* 100D6 */,/*30555*/"LINEAR B IDEOGRAM B253"/* 100D7 */, /*30556*/"LINEAR B IDEOGRAM B254 DART"/* 100D8 */,/*30557*/"LINEAR B IDEOGRAM B255"/* 100D9 */, /*30558*/"LINEAR B IDEOGRAM B256"/* 100DA */,/*30559*/"LINEAR B IDEOGRAM B257"/* 100DB */, /*30560*/"LINEAR B IDEOGRAM B258"/* 100DC */,/*30561*/"LINEAR B IDEOGRAM B259"/* 100DD */, /*30562*/"LINEAR B IDEOGRAM VESSEL B155"/* 100DE */,/*30563*/"LINEAR B IDEOGRAM VESSEL B200"/* 100DF */, /*30564*/"LINEAR B IDEOGRAM VESSEL B201"/* 100E0 */,/*30565*/"LINEAR B IDEOGRAM VESSEL B202"/* 100E1 */, /*30566*/"LINEAR B IDEOGRAM VESSEL B203"/* 100E2 */,/*30567*/"LINEAR B IDEOGRAM VESSEL B204"/* 100E3 */, /*30568*/"LINEAR B IDEOGRAM VESSEL B205"/* 100E4 */,/*30569*/"LINEAR B IDEOGRAM VESSEL B206"/* 100E5 */, /*30570*/"LINEAR B IDEOGRAM VESSEL B207"/* 100E6 */,/*30571*/"LINEAR B IDEOGRAM VESSEL B208"/* 100E7 */, /*30572*/"LINEAR B IDEOGRAM VESSEL B209"/* 100E8 */,/*30573*/"LINEAR B IDEOGRAM VESSEL B210"/* 100E9 */, /*30574*/"LINEAR B IDEOGRAM VESSEL B211"/* 100EA */,/*30575*/"LINEAR B IDEOGRAM VESSEL B212"/* 100EB */, /*30576*/"LINEAR B IDEOGRAM VESSEL B213"/* 100EC */,/*30577*/"LINEAR B IDEOGRAM VESSEL B214"/* 100ED */, /*30578*/"LINEAR B IDEOGRAM VESSEL B215"/* 100EE */,/*30579*/"LINEAR B IDEOGRAM VESSEL B216"/* 100EF */, /*30580*/"LINEAR B IDEOGRAM VESSEL B217"/* 100F0 */,/*30581*/"LINEAR B IDEOGRAM VESSEL B218"/* 100F1 */, /*30582*/"LINEAR B IDEOGRAM VESSEL B219"/* 100F2 */,/*30583*/"LINEAR B IDEOGRAM VESSEL B221"/* 100F3 */, /*30584*/"LINEAR B IDEOGRAM VESSEL B222"/* 100F4 */,/*30585*/"LINEAR B IDEOGRAM VESSEL B226"/* 100F5 */, /*30586*/"LINEAR B IDEOGRAM VESSEL B227"/* 100F6 */,/*30587*/"LINEAR B IDEOGRAM VESSEL B228"/* 100F7 */, /*30588*/"LINEAR B IDEOGRAM VESSEL B229"/* 100F8 */,/*30589*/"LINEAR B IDEOGRAM VESSEL B250"/* 100F9 */, /*30590*/"LINEAR B IDEOGRAM VESSEL B305"/* 100FA */,NULL,NULL,NULL,NULL,NULL, /*30596*/"AEGEAN WORD SEPARATOR LINE"/* 10100 */,/*30597*/"AEGEAN WORD SEPARATOR DOT"/* 10101 */, /*30598*/"AEGEAN CHECK MARK"/* 10102 */,NULL,NULL,NULL,NULL,/*30603*/"AEGEAN NUMBER ONE"/* 10107 */, /*30604*/"AEGEAN NUMBER TWO"/* 10108 */,/*30605*/"AEGEAN NUMBER THREE"/* 10109 */, /*30606*/"AEGEAN NUMBER FOUR"/* 1010A */,/*30607*/"AEGEAN NUMBER FIVE"/* 1010B */, /*30608*/"AEGEAN NUMBER SIX"/* 1010C */,/*30609*/"AEGEAN NUMBER SEVEN"/* 1010D */, /*30610*/"AEGEAN NUMBER EIGHT"/* 1010E */,/*30611*/"AEGEAN NUMBER NINE"/* 1010F */, /*30612*/"AEGEAN NUMBER TEN"/* 10110 */,/*30613*/"AEGEAN NUMBER TWENTY"/* 10111 */, /*30614*/"AEGEAN NUMBER THIRTY"/* 10112 */,/*30615*/"AEGEAN NUMBER FORTY"/* 10113 */, /*30616*/"AEGEAN NUMBER FIFTY"/* 10114 */,/*30617*/"AEGEAN NUMBER SIXTY"/* 10115 */, /*30618*/"AEGEAN NUMBER SEVENTY"/* 10116 */,/*30619*/"AEGEAN NUMBER EIGHTY"/* 10117 */, /*30620*/"AEGEAN NUMBER NINETY"/* 10118 */,/*30621*/"AEGEAN NUMBER ONE HUNDRED"/* 10119 */, /*30622*/"AEGEAN NUMBER TWO HUNDRED"/* 1011A */,/*30623*/"AEGEAN NUMBER THREE HUNDRED"/* 1011B */, /*30624*/"AEGEAN NUMBER FOUR HUNDRED"/* 1011C */,/*30625*/"AEGEAN NUMBER FIVE HUNDRED"/* 1011D */, /*30626*/"AEGEAN NUMBER SIX HUNDRED"/* 1011E */,/*30627*/"AEGEAN NUMBER SEVEN HUNDRED"/* 1011F */, /*30628*/"AEGEAN NUMBER EIGHT HUNDRED"/* 10120 */,/*30629*/"AEGEAN NUMBER NINE HUNDRED"/* 10121 */, /*30630*/"AEGEAN NUMBER ONE THOUSAND"/* 10122 */,/*30631*/"AEGEAN NUMBER TWO THOUSAND"/* 10123 */, /*30632*/"AEGEAN NUMBER THREE THOUSAND"/* 10124 */,/*30633*/"AEGEAN NUMBER FOUR THOUSAND"/* 10125 */, /*30634*/"AEGEAN NUMBER FIVE THOUSAND"/* 10126 */,/*30635*/"AEGEAN NUMBER SIX THOUSAND"/* 10127 */, /*30636*/"AEGEAN NUMBER SEVEN THOUSAND"/* 10128 */,/*30637*/"AEGEAN NUMBER EIGHT THOUSAND"/* 10129 */, /*30638*/"AEGEAN NUMBER NINE THOUSAND"/* 1012A */,/*30639*/"AEGEAN NUMBER TEN THOUSAND"/* 1012B */, /*30640*/"AEGEAN NUMBER TWENTY THOUSAND"/* 1012C */,/*30641*/"AEGEAN NUMBER THIRTY THOUSAND"/* 1012D */, /*30642*/"AEGEAN NUMBER FORTY THOUSAND"/* 1012E */,/*30643*/"AEGEAN NUMBER FIFTY THOUSAND"/* 1012F */, /*30644*/"AEGEAN NUMBER SIXTY THOUSAND"/* 10130 */,/*30645*/"AEGEAN NUMBER SEVENTY THOUSAND"/* 10131 */, /*30646*/"AEGEAN NUMBER EIGHTY THOUSAND"/* 10132 */,/*30647*/"AEGEAN NUMBER NINETY THOUSAND"/* 10133 */,NULL,NULL,NULL, /*30651*/"AEGEAN WEIGHT BASE UNIT"/* 10137 */,/*30652*/"AEGEAN WEIGHT FIRST SUBUNIT"/* 10138 */, /*30653*/"AEGEAN WEIGHT SECOND SUBUNIT"/* 10139 */,/*30654*/"AEGEAN WEIGHT THIRD SUBUNIT"/* 1013A */, /*30655*/"AEGEAN WEIGHT FOURTH SUBUNIT"/* 1013B */,/*30656*/"AEGEAN DRY MEASURE FIRST SUBUNIT"/* 1013C */, /*30657*/"AEGEAN LIQUID MEASURE FIRST SUBUNIT"/* 1013D */,/*30658*/"AEGEAN MEASURE SECOND SUBUNIT"/* 1013E */, /*30659*/"AEGEAN MEASURE THIRD SUBUNIT"/* 1013F */,/*30660*/"GREEK ACROPHONIC ATTIC ONE QUARTER"/* 10140 */, /*30661*/"GREEK ACROPHONIC ATTIC ONE HALF"/* 10141 */,/*30662*/"GREEK ACROPHONIC ATTIC ONE DRACHMA"/* 10142 */, /*30663*/"GREEK ACROPHONIC ATTIC FIVE"/* 10143 */,/*30664*/"GREEK ACROPHONIC ATTIC FIFTY"/* 10144 */, /*30665*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED"/* 10145 */,/*30666*/"GREEK ACROPHONIC ATTIC FIVE THOUSAND"/* 10146 */, /*30667*/"GREEK ACROPHONIC ATTIC FIFTY THOUSAND"/* 10147 */,/*30668*/"GREEK ACROPHONIC ATTIC FIVE TALENTS"/* 10148 */, /*30669*/"GREEK ACROPHONIC ATTIC TEN TALENTS"/* 10149 */,/*30670*/"GREEK ACROPHONIC ATTIC FIFTY TALENTS"/* 1014A */, /*30671*/"GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS"/* 1014B */, /*30672*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS"/* 1014C */, /*30673*/"GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS"/* 1014D */, /*30674*/"GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS"/* 1014E */, /*30675*/"GREEK ACROPHONIC ATTIC FIVE STATERS"/* 1014F */,/*30676*/"GREEK ACROPHONIC ATTIC TEN STATERS"/* 10150 */, /*30677*/"GREEK ACROPHONIC ATTIC FIFTY STATERS"/* 10151 */, /*30678*/"GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS"/* 10152 */, /*30679*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS"/* 10153 */, /*30680*/"GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS"/* 10154 */, /*30681*/"GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS"/* 10155 */, /*30682*/"GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS"/* 10156 */, /*30683*/"GREEK ACROPHONIC ATTIC TEN MNAS"/* 10157 */,/*30684*/"GREEK ACROPHONIC HERAEUM ONE PLETHRON"/* 10158 */, /*30685*/"GREEK ACROPHONIC THESPIAN ONE"/* 10159 */,/*30686*/"GREEK ACROPHONIC HERMIONIAN ONE"/* 1015A */, /*30687*/"GREEK ACROPHONIC EPIDAUREAN TWO"/* 1015B */,/*30688*/"GREEK ACROPHONIC THESPIAN TWO"/* 1015C */, /*30689*/"GREEK ACROPHONIC CYRENAIC TWO DRACHMAS"/* 1015D */, /*30690*/"GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS"/* 1015E */,/*30691*/"GREEK ACROPHONIC TROEZENIAN FIVE"/* 1015F */, /*30692*/"GREEK ACROPHONIC TROEZENIAN TEN"/* 10160 */, /*30693*/"GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM"/* 10161 */, /*30694*/"GREEK ACROPHONIC HERMIONIAN TEN"/* 10162 */,/*30695*/"GREEK ACROPHONIC MESSENIAN TEN"/* 10163 */, /*30696*/"GREEK ACROPHONIC THESPIAN TEN"/* 10164 */,/*30697*/"GREEK ACROPHONIC THESPIAN THIRTY"/* 10165 */, /*30698*/"GREEK ACROPHONIC TROEZENIAN FIFTY"/* 10166 */, /*30699*/"GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM"/* 10167 */, /*30700*/"GREEK ACROPHONIC HERMIONIAN FIFTY"/* 10168 */,/*30701*/"GREEK ACROPHONIC THESPIAN FIFTY"/* 10169 */, /*30702*/"GREEK ACROPHONIC THESPIAN ONE HUNDRED"/* 1016A */, /*30703*/"GREEK ACROPHONIC THESPIAN THREE HUNDRED"/* 1016B */, /*30704*/"GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED"/* 1016C */, /*30705*/"GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED"/* 1016D */, /*30706*/"GREEK ACROPHONIC THESPIAN FIVE HUNDRED"/* 1016E */, /*30707*/"GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED"/* 1016F */,/*30708*/"GREEK ACROPHONIC NAXIAN FIVE HUNDRED"/* 10170 */, /*30709*/"GREEK ACROPHONIC THESPIAN ONE THOUSAND"/* 10171 */, /*30710*/"GREEK ACROPHONIC THESPIAN FIVE THOUSAND"/* 10172 */,/*30711*/"GREEK ACROPHONIC DELPHIC FIVE MNAS"/* 10173 */, /*30712*/"GREEK ACROPHONIC STRATIAN FIFTY MNAS"/* 10174 */,/*30713*/"GREEK ONE HALF SIGN"/* 10175 */, /*30714*/"GREEK ONE HALF SIGN ALTERNATE FORM"/* 10176 */,/*30715*/"GREEK TWO THIRDS SIGN"/* 10177 */, /*30716*/"GREEK THREE QUARTERS SIGN"/* 10178 */,/*30717*/"GREEK YEAR SIGN"/* 10179 */, /*30718*/"GREEK TALENT SIGN"/* 1017A */,/*30719*/"GREEK DRACHMA SIGN"/* 1017B */,/*30720*/"GREEK OBOL SIGN"/* 1017C */, /*30721*/"GREEK TWO OBOLS SIGN"/* 1017D */,/*30722*/"GREEK THREE OBOLS SIGN"/* 1017E */, /*30723*/"GREEK FOUR OBOLS SIGN"/* 1017F */,/*30724*/"GREEK FIVE OBOLS SIGN"/* 10180 */, /*30725*/"GREEK METRETES SIGN"/* 10181 */,/*30726*/"GREEK KYATHOS BASE SIGN"/* 10182 */, /*30727*/"GREEK LITRA SIGN"/* 10183 */,/*30728*/"GREEK OUNKIA SIGN"/* 10184 */,/*30729*/"GREEK XESTES SIGN"/* 10185 */, /*30730*/"GREEK ARTABE SIGN"/* 10186 */,/*30731*/"GREEK AROURA SIGN"/* 10187 */,/*30732*/"GREEK GRAMMA SIGN"/* 10188 */, /*30733*/"GREEK TRYBLION BASE SIGN"/* 10189 */,/*30734*/"GREEK ZERO SIGN"/* 1018A */, /*30735*/"GREEK ONE QUARTER SIGN"/* 1018B */,/*30736*/"GREEK SINUSOID SIGN"/* 1018C */,NULL,NULL,NULL, /*30740*/"ROMAN SEXTANS SIGN"/* 10190 */,/*30741*/"ROMAN UNCIA SIGN"/* 10191 */, /*30742*/"ROMAN SEMUNCIA SIGN"/* 10192 */,/*30743*/"ROMAN SEXTULA SIGN"/* 10193 */, /*30744*/"ROMAN DIMIDIA SEXTULA SIGN"/* 10194 */,/*30745*/"ROMAN SILIQUA SIGN"/* 10195 */, /*30746*/"ROMAN DENARIUS SIGN"/* 10196 */,/*30747*/"ROMAN QUINARIUS SIGN"/* 10197 */, /*30748*/"ROMAN SESTERTIUS SIGN"/* 10198 */,/*30749*/"ROMAN DUPONDIUS SIGN"/* 10199 */, /*30750*/"ROMAN AS SIGN"/* 1019A */,/*30751*/"ROMAN CENTURIAL SIGN"/* 1019B */,NULL,NULL,NULL,NULL, /*30756*/"GREEK SYMBOL TAU RHO"/* 101A0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*30804*/"PHAISTOS DISC SIGN PEDESTRIAN"/* 101D0 */, /*30805*/"PHAISTOS DISC SIGN PLUMED HEAD"/* 101D1 */,/*30806*/"PHAISTOS DISC SIGN TATTOOED HEAD"/* 101D2 */, /*30807*/"PHAISTOS DISC SIGN CAPTIVE"/* 101D3 */,/*30808*/"PHAISTOS DISC SIGN CHILD"/* 101D4 */, /*30809*/"PHAISTOS DISC SIGN WOMAN"/* 101D5 */,/*30810*/"PHAISTOS DISC SIGN HELMET"/* 101D6 */, /*30811*/"PHAISTOS DISC SIGN GAUNTLET"/* 101D7 */,/*30812*/"PHAISTOS DISC SIGN TIARA"/* 101D8 */, /*30813*/"PHAISTOS DISC SIGN ARROW"/* 101D9 */,/*30814*/"PHAISTOS DISC SIGN BOW"/* 101DA */, /*30815*/"PHAISTOS DISC SIGN SHIELD"/* 101DB */,/*30816*/"PHAISTOS DISC SIGN CLUB"/* 101DC */, /*30817*/"PHAISTOS DISC SIGN MANACLES"/* 101DD */,/*30818*/"PHAISTOS DISC SIGN MATTOCK"/* 101DE */, /*30819*/"PHAISTOS DISC SIGN SAW"/* 101DF */,/*30820*/"PHAISTOS DISC SIGN LID"/* 101E0 */, /*30821*/"PHAISTOS DISC SIGN BOOMERANG"/* 101E1 */,/*30822*/"PHAISTOS DISC SIGN CARPENTRY PLANE"/* 101E2 */, /*30823*/"PHAISTOS DISC SIGN DOLIUM"/* 101E3 */,/*30824*/"PHAISTOS DISC SIGN COMB"/* 101E4 */, /*30825*/"PHAISTOS DISC SIGN SLING"/* 101E5 */,/*30826*/"PHAISTOS DISC SIGN COLUMN"/* 101E6 */, /*30827*/"PHAISTOS DISC SIGN BEEHIVE"/* 101E7 */,/*30828*/"PHAISTOS DISC SIGN SHIP"/* 101E8 */, /*30829*/"PHAISTOS DISC SIGN HORN"/* 101E9 */,/*30830*/"PHAISTOS DISC SIGN HIDE"/* 101EA */, /*30831*/"PHAISTOS DISC SIGN BULLS LEG"/* 101EB */,/*30832*/"PHAISTOS DISC SIGN CAT"/* 101EC */, /*30833*/"PHAISTOS DISC SIGN RAM"/* 101ED */,/*30834*/"PHAISTOS DISC SIGN EAGLE"/* 101EE */, /*30835*/"PHAISTOS DISC SIGN DOVE"/* 101EF */,/*30836*/"PHAISTOS DISC SIGN TUNNY"/* 101F0 */, /*30837*/"PHAISTOS DISC SIGN BEE"/* 101F1 */,/*30838*/"PHAISTOS DISC SIGN PLANE TREE"/* 101F2 */, /*30839*/"PHAISTOS DISC SIGN VINE"/* 101F3 */,/*30840*/"PHAISTOS DISC SIGN PAPYRUS"/* 101F4 */, /*30841*/"PHAISTOS DISC SIGN ROSETTE"/* 101F5 */,/*30842*/"PHAISTOS DISC SIGN LILY"/* 101F6 */, /*30843*/"PHAISTOS DISC SIGN OX BACK"/* 101F7 */,/*30844*/"PHAISTOS DISC SIGN FLUTE"/* 101F8 */, /*30845*/"PHAISTOS DISC SIGN GRATER"/* 101F9 */,/*30846*/"PHAISTOS DISC SIGN STRAINER"/* 101FA */, /*30847*/"PHAISTOS DISC SIGN SMALL AXE"/* 101FB */,/*30848*/"PHAISTOS DISC SIGN WAVY BAND"/* 101FC */, /*30849*/"PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE"/* 101FD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30980*/"LYCIAN LETTER A"/* 10280 */,/*30981*/"LYCIAN LETTER E"/* 10281 */,/*30982*/"LYCIAN LETTER B"/* 10282 */, /*30983*/"LYCIAN LETTER BH"/* 10283 */,/*30984*/"LYCIAN LETTER G"/* 10284 */,/*30985*/"LYCIAN LETTER D"/* 10285 */, /*30986*/"LYCIAN LETTER I"/* 10286 */,/*30987*/"LYCIAN LETTER W"/* 10287 */,/*30988*/"LYCIAN LETTER Z"/* 10288 */, /*30989*/"LYCIAN LETTER TH"/* 10289 */,/*30990*/"LYCIAN LETTER J"/* 1028A */,/*30991*/"LYCIAN LETTER K"/* 1028B */, /*30992*/"LYCIAN LETTER Q"/* 1028C */,/*30993*/"LYCIAN LETTER L"/* 1028D */,/*30994*/"LYCIAN LETTER M"/* 1028E */, /*30995*/"LYCIAN LETTER N"/* 1028F */,/*30996*/"LYCIAN LETTER MM"/* 10290 */,/*30997*/"LYCIAN LETTER NN"/* 10291 */, /*30998*/"LYCIAN LETTER U"/* 10292 */,/*30999*/"LYCIAN LETTER P"/* 10293 */,/*31000*/"LYCIAN LETTER KK"/* 10294 */, /*31001*/"LYCIAN LETTER R"/* 10295 */,/*31002*/"LYCIAN LETTER S"/* 10296 */,/*31003*/"LYCIAN LETTER T"/* 10297 */, /*31004*/"LYCIAN LETTER TT"/* 10298 */,/*31005*/"LYCIAN LETTER AN"/* 10299 */,/*31006*/"LYCIAN LETTER EN"/* 1029A */, /*31007*/"LYCIAN LETTER H"/* 1029B */,/*31008*/"LYCIAN LETTER X"/* 1029C */,NULL,NULL,NULL, /*31012*/"CARIAN LETTER A"/* 102A0 */,/*31013*/"CARIAN LETTER P2"/* 102A1 */,/*31014*/"CARIAN LETTER D"/* 102A2 */, /*31015*/"CARIAN LETTER L"/* 102A3 */,/*31016*/"CARIAN LETTER UUU"/* 102A4 */,/*31017*/"CARIAN LETTER R"/* 102A5 */, /*31018*/"CARIAN LETTER LD"/* 102A6 */,/*31019*/"CARIAN LETTER A2"/* 102A7 */,/*31020*/"CARIAN LETTER Q"/* 102A8 */, /*31021*/"CARIAN LETTER B"/* 102A9 */,/*31022*/"CARIAN LETTER M"/* 102AA */,/*31023*/"CARIAN LETTER O"/* 102AB */, /*31024*/"CARIAN LETTER D2"/* 102AC */,/*31025*/"CARIAN LETTER T"/* 102AD */,/*31026*/"CARIAN LETTER SH"/* 102AE */, /*31027*/"CARIAN LETTER SH2"/* 102AF */,/*31028*/"CARIAN LETTER S"/* 102B0 */,/*31029*/"CARIAN LETTER C-18"/* 102B1 */, /*31030*/"CARIAN LETTER U"/* 102B2 */,/*31031*/"CARIAN LETTER NN"/* 102B3 */,/*31032*/"CARIAN LETTER X"/* 102B4 */, /*31033*/"CARIAN LETTER N"/* 102B5 */,/*31034*/"CARIAN LETTER TT2"/* 102B6 */,/*31035*/"CARIAN LETTER P"/* 102B7 */, /*31036*/"CARIAN LETTER SS"/* 102B8 */,/*31037*/"CARIAN LETTER I"/* 102B9 */,/*31038*/"CARIAN LETTER E"/* 102BA */, /*31039*/"CARIAN LETTER UUUU"/* 102BB */,/*31040*/"CARIAN LETTER K"/* 102BC */,/*31041*/"CARIAN LETTER K2"/* 102BD */, /*31042*/"CARIAN LETTER ND"/* 102BE */,/*31043*/"CARIAN LETTER UU"/* 102BF */,/*31044*/"CARIAN LETTER G"/* 102C0 */, /*31045*/"CARIAN LETTER G2"/* 102C1 */,/*31046*/"CARIAN LETTER ST"/* 102C2 */,/*31047*/"CARIAN LETTER ST2"/* 102C3 */, /*31048*/"CARIAN LETTER NG"/* 102C4 */,/*31049*/"CARIAN LETTER II"/* 102C5 */,/*31050*/"CARIAN LETTER C-39"/* 102C6 */, /*31051*/"CARIAN LETTER TT"/* 102C7 */,/*31052*/"CARIAN LETTER UUU2"/* 102C8 */,/*31053*/"CARIAN LETTER RR"/* 102C9 */, /*31054*/"CARIAN LETTER MB"/* 102CA */,/*31055*/"CARIAN LETTER MB2"/* 102CB */,/*31056*/"CARIAN LETTER MB3"/* 102CC */, /*31057*/"CARIAN LETTER MB4"/* 102CD */,/*31058*/"CARIAN LETTER LD2"/* 102CE */,/*31059*/"CARIAN LETTER E2"/* 102CF */, /*31060*/"CARIAN LETTER UUU3"/* 102D0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31076*/"COPTIC EPACT THOUSANDS MARK"/* 102E0 */,/*31077*/"COPTIC EPACT DIGIT ONE"/* 102E1 */, /*31078*/"COPTIC EPACT DIGIT TWO"/* 102E2 */,/*31079*/"COPTIC EPACT DIGIT THREE"/* 102E3 */, /*31080*/"COPTIC EPACT DIGIT FOUR"/* 102E4 */,/*31081*/"COPTIC EPACT DIGIT FIVE"/* 102E5 */, /*31082*/"COPTIC EPACT DIGIT SIX"/* 102E6 */,/*31083*/"COPTIC EPACT DIGIT SEVEN"/* 102E7 */, /*31084*/"COPTIC EPACT DIGIT EIGHT"/* 102E8 */,/*31085*/"COPTIC EPACT DIGIT NINE"/* 102E9 */, /*31086*/"COPTIC EPACT NUMBER TEN"/* 102EA */,/*31087*/"COPTIC EPACT NUMBER TWENTY"/* 102EB */, /*31088*/"COPTIC EPACT NUMBER THIRTY"/* 102EC */,/*31089*/"COPTIC EPACT NUMBER FORTY"/* 102ED */, /*31090*/"COPTIC EPACT NUMBER FIFTY"/* 102EE */,/*31091*/"COPTIC EPACT NUMBER SIXTY"/* 102EF */, /*31092*/"COPTIC EPACT NUMBER SEVENTY"/* 102F0 */,/*31093*/"COPTIC EPACT NUMBER EIGHTY"/* 102F1 */, /*31094*/"COPTIC EPACT NUMBER NINETY"/* 102F2 */,/*31095*/"COPTIC EPACT NUMBER ONE HUNDRED"/* 102F3 */, /*31096*/"COPTIC EPACT NUMBER TWO HUNDRED"/* 102F4 */,/*31097*/"COPTIC EPACT NUMBER THREE HUNDRED"/* 102F5 */, /*31098*/"COPTIC EPACT NUMBER FOUR HUNDRED"/* 102F6 */,/*31099*/"COPTIC EPACT NUMBER FIVE HUNDRED"/* 102F7 */, /*31100*/"COPTIC EPACT NUMBER SIX HUNDRED"/* 102F8 */,/*31101*/"COPTIC EPACT NUMBER SEVEN HUNDRED"/* 102F9 */, /*31102*/"COPTIC EPACT NUMBER EIGHT HUNDRED"/* 102FA */,/*31103*/"COPTIC EPACT NUMBER NINE HUNDRED"/* 102FB */,NULL,NULL, NULL,NULL,/*31108*/"OLD ITALIC LETTER A"/* 10300 */,/*31109*/"OLD ITALIC LETTER BE"/* 10301 */, /*31110*/"OLD ITALIC LETTER KE"/* 10302 */,/*31111*/"OLD ITALIC LETTER DE"/* 10303 */, /*31112*/"OLD ITALIC LETTER E"/* 10304 */,/*31113*/"OLD ITALIC LETTER VE"/* 10305 */, /*31114*/"OLD ITALIC LETTER ZE"/* 10306 */,/*31115*/"OLD ITALIC LETTER HE"/* 10307 */, /*31116*/"OLD ITALIC LETTER THE"/* 10308 */,/*31117*/"OLD ITALIC LETTER I"/* 10309 */, /*31118*/"OLD ITALIC LETTER KA"/* 1030A */,/*31119*/"OLD ITALIC LETTER EL"/* 1030B */, /*31120*/"OLD ITALIC LETTER EM"/* 1030C */,/*31121*/"OLD ITALIC LETTER EN"/* 1030D */, /*31122*/"OLD ITALIC LETTER ESH"/* 1030E */,/*31123*/"OLD ITALIC LETTER O"/* 1030F */, /*31124*/"OLD ITALIC LETTER PE"/* 10310 */,/*31125*/"OLD ITALIC LETTER SHE"/* 10311 */, /*31126*/"OLD ITALIC LETTER KU"/* 10312 */,/*31127*/"OLD ITALIC LETTER ER"/* 10313 */, /*31128*/"OLD ITALIC LETTER ES"/* 10314 */,/*31129*/"OLD ITALIC LETTER TE"/* 10315 */, /*31130*/"OLD ITALIC LETTER U"/* 10316 */,/*31131*/"OLD ITALIC LETTER EKS"/* 10317 */, /*31132*/"OLD ITALIC LETTER PHE"/* 10318 */,/*31133*/"OLD ITALIC LETTER KHE"/* 10319 */, /*31134*/"OLD ITALIC LETTER EF"/* 1031A */,/*31135*/"OLD ITALIC LETTER ERS"/* 1031B */, /*31136*/"OLD ITALIC LETTER CHE"/* 1031C */,/*31137*/"OLD ITALIC LETTER II"/* 1031D */, /*31138*/"OLD ITALIC LETTER UU"/* 1031E */,/*31139*/"OLD ITALIC LETTER ESS"/* 1031F */, /*31140*/"OLD ITALIC NUMERAL ONE"/* 10320 */,/*31141*/"OLD ITALIC NUMERAL FIVE"/* 10321 */, /*31142*/"OLD ITALIC NUMERAL TEN"/* 10322 */,/*31143*/"OLD ITALIC NUMERAL FIFTY"/* 10323 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*31156*/"GOTHIC LETTER AHSA"/* 10330 */,/*31157*/"GOTHIC LETTER BAIRKAN"/* 10331 */, /*31158*/"GOTHIC LETTER GIBA"/* 10332 */,/*31159*/"GOTHIC LETTER DAGS"/* 10333 */, /*31160*/"GOTHIC LETTER AIHVUS"/* 10334 */,/*31161*/"GOTHIC LETTER QAIRTHRA"/* 10335 */, /*31162*/"GOTHIC LETTER IUJA"/* 10336 */,/*31163*/"GOTHIC LETTER HAGL"/* 10337 */, /*31164*/"GOTHIC LETTER THIUTH"/* 10338 */,/*31165*/"GOTHIC LETTER EIS"/* 10339 */, /*31166*/"GOTHIC LETTER KUSMA"/* 1033A */,/*31167*/"GOTHIC LETTER LAGUS"/* 1033B */, /*31168*/"GOTHIC LETTER MANNA"/* 1033C */,/*31169*/"GOTHIC LETTER NAUTHS"/* 1033D */, /*31170*/"GOTHIC LETTER JER"/* 1033E */,/*31171*/"GOTHIC LETTER URUS"/* 1033F */, /*31172*/"GOTHIC LETTER PAIRTHRA"/* 10340 */,/*31173*/"GOTHIC LETTER NINETY"/* 10341 */, /*31174*/"GOTHIC LETTER RAIDA"/* 10342 */,/*31175*/"GOTHIC LETTER SAUIL"/* 10343 */, /*31176*/"GOTHIC LETTER TEIWS"/* 10344 */,/*31177*/"GOTHIC LETTER WINJA"/* 10345 */, /*31178*/"GOTHIC LETTER FAIHU"/* 10346 */,/*31179*/"GOTHIC LETTER IGGWS"/* 10347 */, /*31180*/"GOTHIC LETTER HWAIR"/* 10348 */,/*31181*/"GOTHIC LETTER OTHAL"/* 10349 */, /*31182*/"GOTHIC LETTER NINE HUNDRED"/* 1034A */,NULL,NULL,NULL,NULL,NULL,/*31188*/"OLD PERMIC LETTER AN"/* 10350 */, /*31189*/"OLD PERMIC LETTER BUR"/* 10351 */,/*31190*/"OLD PERMIC LETTER GAI"/* 10352 */, /*31191*/"OLD PERMIC LETTER DOI"/* 10353 */,/*31192*/"OLD PERMIC LETTER E"/* 10354 */, /*31193*/"OLD PERMIC LETTER ZHOI"/* 10355 */,/*31194*/"OLD PERMIC LETTER DZHOI"/* 10356 */, /*31195*/"OLD PERMIC LETTER ZATA"/* 10357 */,/*31196*/"OLD PERMIC LETTER DZITA"/* 10358 */, /*31197*/"OLD PERMIC LETTER I"/* 10359 */,/*31198*/"OLD PERMIC LETTER KOKE"/* 1035A */, /*31199*/"OLD PERMIC LETTER LEI"/* 1035B */,/*31200*/"OLD PERMIC LETTER MENOE"/* 1035C */, /*31201*/"OLD PERMIC LETTER NENOE"/* 1035D */,/*31202*/"OLD PERMIC LETTER VOOI"/* 1035E */, /*31203*/"OLD PERMIC LETTER PEEI"/* 1035F */,/*31204*/"OLD PERMIC LETTER REI"/* 10360 */, /*31205*/"OLD PERMIC LETTER SII"/* 10361 */,/*31206*/"OLD PERMIC LETTER TAI"/* 10362 */, /*31207*/"OLD PERMIC LETTER U"/* 10363 */,/*31208*/"OLD PERMIC LETTER CHERY"/* 10364 */, /*31209*/"OLD PERMIC LETTER SHOOI"/* 10365 */,/*31210*/"OLD PERMIC LETTER SHCHOOI"/* 10366 */, /*31211*/"OLD PERMIC LETTER YRY"/* 10367 */,/*31212*/"OLD PERMIC LETTER YERU"/* 10368 */, /*31213*/"OLD PERMIC LETTER O"/* 10369 */,/*31214*/"OLD PERMIC LETTER OO"/* 1036A */, /*31215*/"OLD PERMIC LETTER EF"/* 1036B */,/*31216*/"OLD PERMIC LETTER HA"/* 1036C */, /*31217*/"OLD PERMIC LETTER TSIU"/* 1036D */,/*31218*/"OLD PERMIC LETTER VER"/* 1036E */, /*31219*/"OLD PERMIC LETTER YER"/* 1036F */,/*31220*/"OLD PERMIC LETTER YERI"/* 10370 */, /*31221*/"OLD PERMIC LETTER YAT"/* 10371 */,/*31222*/"OLD PERMIC LETTER IE"/* 10372 */, /*31223*/"OLD PERMIC LETTER YU"/* 10373 */,/*31224*/"OLD PERMIC LETTER YA"/* 10374 */, /*31225*/"OLD PERMIC LETTER IA"/* 10375 */,/*31226*/"COMBINING OLD PERMIC LETTER AN"/* 10376 */, /*31227*/"COMBINING OLD PERMIC LETTER DOI"/* 10377 */,/*31228*/"COMBINING OLD PERMIC LETTER ZATA"/* 10378 */, /*31229*/"COMBINING OLD PERMIC LETTER NENOE"/* 10379 */,/*31230*/"COMBINING OLD PERMIC LETTER SII"/* 1037A */,NULL,NULL, NULL,NULL,NULL,/*31236*/"UGARITIC LETTER ALPA"/* 10380 */,/*31237*/"UGARITIC LETTER BETA"/* 10381 */, /*31238*/"UGARITIC LETTER GAMLA"/* 10382 */,/*31239*/"UGARITIC LETTER KHA"/* 10383 */, /*31240*/"UGARITIC LETTER DELTA"/* 10384 */,/*31241*/"UGARITIC LETTER HO"/* 10385 */, /*31242*/"UGARITIC LETTER WO"/* 10386 */,/*31243*/"UGARITIC LETTER ZETA"/* 10387 */, /*31244*/"UGARITIC LETTER HOTA"/* 10388 */,/*31245*/"UGARITIC LETTER TET"/* 10389 */, /*31246*/"UGARITIC LETTER YOD"/* 1038A */,/*31247*/"UGARITIC LETTER KAF"/* 1038B */, /*31248*/"UGARITIC LETTER SHIN"/* 1038C */,/*31249*/"UGARITIC LETTER LAMDA"/* 1038D */, /*31250*/"UGARITIC LETTER MEM"/* 1038E */,/*31251*/"UGARITIC LETTER DHAL"/* 1038F */, /*31252*/"UGARITIC LETTER NUN"/* 10390 */,/*31253*/"UGARITIC LETTER ZU"/* 10391 */, /*31254*/"UGARITIC LETTER SAMKA"/* 10392 */,/*31255*/"UGARITIC LETTER AIN"/* 10393 */, /*31256*/"UGARITIC LETTER PU"/* 10394 */,/*31257*/"UGARITIC LETTER SADE"/* 10395 */, /*31258*/"UGARITIC LETTER QOPA"/* 10396 */,/*31259*/"UGARITIC LETTER RASHA"/* 10397 */, /*31260*/"UGARITIC LETTER THANNA"/* 10398 */,/*31261*/"UGARITIC LETTER GHAIN"/* 10399 */, /*31262*/"UGARITIC LETTER TO"/* 1039A */,/*31263*/"UGARITIC LETTER I"/* 1039B */,/*31264*/"UGARITIC LETTER U"/* 1039C */, /*31265*/"UGARITIC LETTER SSU"/* 1039D */,NULL,/*31267*/"UGARITIC WORD DIVIDER"/* 1039F */, /*31268*/"OLD PERSIAN SIGN A"/* 103A0 */,/*31269*/"OLD PERSIAN SIGN I"/* 103A1 */, /*31270*/"OLD PERSIAN SIGN U"/* 103A2 */,/*31271*/"OLD PERSIAN SIGN KA"/* 103A3 */, /*31272*/"OLD PERSIAN SIGN KU"/* 103A4 */,/*31273*/"OLD PERSIAN SIGN GA"/* 103A5 */, /*31274*/"OLD PERSIAN SIGN GU"/* 103A6 */,/*31275*/"OLD PERSIAN SIGN XA"/* 103A7 */, /*31276*/"OLD PERSIAN SIGN CA"/* 103A8 */,/*31277*/"OLD PERSIAN SIGN JA"/* 103A9 */, /*31278*/"OLD PERSIAN SIGN JI"/* 103AA */,/*31279*/"OLD PERSIAN SIGN TA"/* 103AB */, /*31280*/"OLD PERSIAN SIGN TU"/* 103AC */,/*31281*/"OLD PERSIAN SIGN DA"/* 103AD */, /*31282*/"OLD PERSIAN SIGN DI"/* 103AE */,/*31283*/"OLD PERSIAN SIGN DU"/* 103AF */, /*31284*/"OLD PERSIAN SIGN THA"/* 103B0 */,/*31285*/"OLD PERSIAN SIGN PA"/* 103B1 */, /*31286*/"OLD PERSIAN SIGN BA"/* 103B2 */,/*31287*/"OLD PERSIAN SIGN FA"/* 103B3 */, /*31288*/"OLD PERSIAN SIGN NA"/* 103B4 */,/*31289*/"OLD PERSIAN SIGN NU"/* 103B5 */, /*31290*/"OLD PERSIAN SIGN MA"/* 103B6 */,/*31291*/"OLD PERSIAN SIGN MI"/* 103B7 */, /*31292*/"OLD PERSIAN SIGN MU"/* 103B8 */,/*31293*/"OLD PERSIAN SIGN YA"/* 103B9 */, /*31294*/"OLD PERSIAN SIGN VA"/* 103BA */,/*31295*/"OLD PERSIAN SIGN VI"/* 103BB */, /*31296*/"OLD PERSIAN SIGN RA"/* 103BC */,/*31297*/"OLD PERSIAN SIGN RU"/* 103BD */, /*31298*/"OLD PERSIAN SIGN LA"/* 103BE */,/*31299*/"OLD PERSIAN SIGN SA"/* 103BF */, /*31300*/"OLD PERSIAN SIGN ZA"/* 103C0 */,/*31301*/"OLD PERSIAN SIGN SHA"/* 103C1 */, /*31302*/"OLD PERSIAN SIGN SSA"/* 103C2 */,/*31303*/"OLD PERSIAN SIGN HA"/* 103C3 */,NULL,NULL,NULL,NULL, /*31308*/"OLD PERSIAN SIGN AURAMAZDAA"/* 103C8 */,/*31309*/"OLD PERSIAN SIGN AURAMAZDAA-2"/* 103C9 */, /*31310*/"OLD PERSIAN SIGN AURAMAZDAAHA"/* 103CA */,/*31311*/"OLD PERSIAN SIGN XSHAAYATHIYA"/* 103CB */, /*31312*/"OLD PERSIAN SIGN DAHYAAUSH"/* 103CC */,/*31313*/"OLD PERSIAN SIGN DAHYAAUSH-2"/* 103CD */, /*31314*/"OLD PERSIAN SIGN BAGA"/* 103CE */,/*31315*/"OLD PERSIAN SIGN BUUMISH"/* 103CF */, /*31316*/"OLD PERSIAN WORD DIVIDER"/* 103D0 */,/*31317*/"OLD PERSIAN NUMBER ONE"/* 103D1 */, /*31318*/"OLD PERSIAN NUMBER TWO"/* 103D2 */,/*31319*/"OLD PERSIAN NUMBER TEN"/* 103D3 */, /*31320*/"OLD PERSIAN NUMBER TWENTY"/* 103D4 */,/*31321*/"OLD PERSIAN NUMBER HUNDRED"/* 103D5 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31364*/"DESERET CAPITAL LETTER LONG I"/* 10400 */,/*31365*/"DESERET CAPITAL LETTER LONG E"/* 10401 */, /*31366*/"DESERET CAPITAL LETTER LONG A"/* 10402 */,/*31367*/"DESERET CAPITAL LETTER LONG AH"/* 10403 */, /*31368*/"DESERET CAPITAL LETTER LONG O"/* 10404 */,/*31369*/"DESERET CAPITAL LETTER LONG OO"/* 10405 */, /*31370*/"DESERET CAPITAL LETTER SHORT I"/* 10406 */,/*31371*/"DESERET CAPITAL LETTER SHORT E"/* 10407 */, /*31372*/"DESERET CAPITAL LETTER SHORT A"/* 10408 */,/*31373*/"DESERET CAPITAL LETTER SHORT AH"/* 10409 */, /*31374*/"DESERET CAPITAL LETTER SHORT O"/* 1040A */,/*31375*/"DESERET CAPITAL LETTER SHORT OO"/* 1040B */, /*31376*/"DESERET CAPITAL LETTER AY"/* 1040C */,/*31377*/"DESERET CAPITAL LETTER OW"/* 1040D */, /*31378*/"DESERET CAPITAL LETTER WU"/* 1040E */,/*31379*/"DESERET CAPITAL LETTER YEE"/* 1040F */, /*31380*/"DESERET CAPITAL LETTER H"/* 10410 */,/*31381*/"DESERET CAPITAL LETTER PEE"/* 10411 */, /*31382*/"DESERET CAPITAL LETTER BEE"/* 10412 */,/*31383*/"DESERET CAPITAL LETTER TEE"/* 10413 */, /*31384*/"DESERET CAPITAL LETTER DEE"/* 10414 */,/*31385*/"DESERET CAPITAL LETTER CHEE"/* 10415 */, /*31386*/"DESERET CAPITAL LETTER JEE"/* 10416 */,/*31387*/"DESERET CAPITAL LETTER KAY"/* 10417 */, /*31388*/"DESERET CAPITAL LETTER GAY"/* 10418 */,/*31389*/"DESERET CAPITAL LETTER EF"/* 10419 */, /*31390*/"DESERET CAPITAL LETTER VEE"/* 1041A */,/*31391*/"DESERET CAPITAL LETTER ETH"/* 1041B */, /*31392*/"DESERET CAPITAL LETTER THEE"/* 1041C */,/*31393*/"DESERET CAPITAL LETTER ES"/* 1041D */, /*31394*/"DESERET CAPITAL LETTER ZEE"/* 1041E */,/*31395*/"DESERET CAPITAL LETTER ESH"/* 1041F */, /*31396*/"DESERET CAPITAL LETTER ZHEE"/* 10420 */,/*31397*/"DESERET CAPITAL LETTER ER"/* 10421 */, /*31398*/"DESERET CAPITAL LETTER EL"/* 10422 */,/*31399*/"DESERET CAPITAL LETTER EM"/* 10423 */, /*31400*/"DESERET CAPITAL LETTER EN"/* 10424 */,/*31401*/"DESERET CAPITAL LETTER ENG"/* 10425 */, /*31402*/"DESERET CAPITAL LETTER OI"/* 10426 */,/*31403*/"DESERET CAPITAL LETTER EW"/* 10427 */, /*31404*/"DESERET SMALL LETTER LONG I"/* 10428 */,/*31405*/"DESERET SMALL LETTER LONG E"/* 10429 */, /*31406*/"DESERET SMALL LETTER LONG A"/* 1042A */,/*31407*/"DESERET SMALL LETTER LONG AH"/* 1042B */, /*31408*/"DESERET SMALL LETTER LONG O"/* 1042C */,/*31409*/"DESERET SMALL LETTER LONG OO"/* 1042D */, /*31410*/"DESERET SMALL LETTER SHORT I"/* 1042E */,/*31411*/"DESERET SMALL LETTER SHORT E"/* 1042F */, /*31412*/"DESERET SMALL LETTER SHORT A"/* 10430 */,/*31413*/"DESERET SMALL LETTER SHORT AH"/* 10431 */, /*31414*/"DESERET SMALL LETTER SHORT O"/* 10432 */,/*31415*/"DESERET SMALL LETTER SHORT OO"/* 10433 */, /*31416*/"DESERET SMALL LETTER AY"/* 10434 */,/*31417*/"DESERET SMALL LETTER OW"/* 10435 */, /*31418*/"DESERET SMALL LETTER WU"/* 10436 */,/*31419*/"DESERET SMALL LETTER YEE"/* 10437 */, /*31420*/"DESERET SMALL LETTER H"/* 10438 */,/*31421*/"DESERET SMALL LETTER PEE"/* 10439 */, /*31422*/"DESERET SMALL LETTER BEE"/* 1043A */,/*31423*/"DESERET SMALL LETTER TEE"/* 1043B */, /*31424*/"DESERET SMALL LETTER DEE"/* 1043C */,/*31425*/"DESERET SMALL LETTER CHEE"/* 1043D */, /*31426*/"DESERET SMALL LETTER JEE"/* 1043E */,/*31427*/"DESERET SMALL LETTER KAY"/* 1043F */, /*31428*/"DESERET SMALL LETTER GAY"/* 10440 */,/*31429*/"DESERET SMALL LETTER EF"/* 10441 */, /*31430*/"DESERET SMALL LETTER VEE"/* 10442 */,/*31431*/"DESERET SMALL LETTER ETH"/* 10443 */, /*31432*/"DESERET SMALL LETTER THEE"/* 10444 */,/*31433*/"DESERET SMALL LETTER ES"/* 10445 */, /*31434*/"DESERET SMALL LETTER ZEE"/* 10446 */,/*31435*/"DESERET SMALL LETTER ESH"/* 10447 */, /*31436*/"DESERET SMALL LETTER ZHEE"/* 10448 */,/*31437*/"DESERET SMALL LETTER ER"/* 10449 */, /*31438*/"DESERET SMALL LETTER EL"/* 1044A */,/*31439*/"DESERET SMALL LETTER EM"/* 1044B */, /*31440*/"DESERET SMALL LETTER EN"/* 1044C */,/*31441*/"DESERET SMALL LETTER ENG"/* 1044D */, /*31442*/"DESERET SMALL LETTER OI"/* 1044E */,/*31443*/"DESERET SMALL LETTER EW"/* 1044F */, /*31444*/"SHAVIAN LETTER PEEP"/* 10450 */,/*31445*/"SHAVIAN LETTER TOT"/* 10451 */, /*31446*/"SHAVIAN LETTER KICK"/* 10452 */,/*31447*/"SHAVIAN LETTER FEE"/* 10453 */, /*31448*/"SHAVIAN LETTER THIGH"/* 10454 */,/*31449*/"SHAVIAN LETTER SO"/* 10455 */, /*31450*/"SHAVIAN LETTER SURE"/* 10456 */,/*31451*/"SHAVIAN LETTER CHURCH"/* 10457 */, /*31452*/"SHAVIAN LETTER YEA"/* 10458 */,/*31453*/"SHAVIAN LETTER HUNG"/* 10459 */, /*31454*/"SHAVIAN LETTER BIB"/* 1045A */,/*31455*/"SHAVIAN LETTER DEAD"/* 1045B */, /*31456*/"SHAVIAN LETTER GAG"/* 1045C */,/*31457*/"SHAVIAN LETTER VOW"/* 1045D */, /*31458*/"SHAVIAN LETTER THEY"/* 1045E */,/*31459*/"SHAVIAN LETTER ZOO"/* 1045F */, /*31460*/"SHAVIAN LETTER MEASURE"/* 10460 */,/*31461*/"SHAVIAN LETTER JUDGE"/* 10461 */, /*31462*/"SHAVIAN LETTER WOE"/* 10462 */,/*31463*/"SHAVIAN LETTER HA-HA"/* 10463 */, /*31464*/"SHAVIAN LETTER LOLL"/* 10464 */,/*31465*/"SHAVIAN LETTER MIME"/* 10465 */, /*31466*/"SHAVIAN LETTER IF"/* 10466 */,/*31467*/"SHAVIAN LETTER EGG"/* 10467 */, /*31468*/"SHAVIAN LETTER ASH"/* 10468 */,/*31469*/"SHAVIAN LETTER ADO"/* 10469 */, /*31470*/"SHAVIAN LETTER ON"/* 1046A */,/*31471*/"SHAVIAN LETTER WOOL"/* 1046B */, /*31472*/"SHAVIAN LETTER OUT"/* 1046C */,/*31473*/"SHAVIAN LETTER AH"/* 1046D */, /*31474*/"SHAVIAN LETTER ROAR"/* 1046E */,/*31475*/"SHAVIAN LETTER NUN"/* 1046F */, /*31476*/"SHAVIAN LETTER EAT"/* 10470 */,/*31477*/"SHAVIAN LETTER AGE"/* 10471 */, /*31478*/"SHAVIAN LETTER ICE"/* 10472 */,/*31479*/"SHAVIAN LETTER UP"/* 10473 */, /*31480*/"SHAVIAN LETTER OAK"/* 10474 */,/*31481*/"SHAVIAN LETTER OOZE"/* 10475 */, /*31482*/"SHAVIAN LETTER OIL"/* 10476 */,/*31483*/"SHAVIAN LETTER AWE"/* 10477 */, /*31484*/"SHAVIAN LETTER ARE"/* 10478 */,/*31485*/"SHAVIAN LETTER OR"/* 10479 */, /*31486*/"SHAVIAN LETTER AIR"/* 1047A */,/*31487*/"SHAVIAN LETTER ERR"/* 1047B */, /*31488*/"SHAVIAN LETTER ARRAY"/* 1047C */,/*31489*/"SHAVIAN LETTER EAR"/* 1047D */, /*31490*/"SHAVIAN LETTER IAN"/* 1047E */,/*31491*/"SHAVIAN LETTER YEW"/* 1047F */, /*31492*/"OSMANYA LETTER ALEF"/* 10480 */,/*31493*/"OSMANYA LETTER BA"/* 10481 */, /*31494*/"OSMANYA LETTER TA"/* 10482 */,/*31495*/"OSMANYA LETTER JA"/* 10483 */,/*31496*/"OSMANYA LETTER XA"/* 10484 */, /*31497*/"OSMANYA LETTER KHA"/* 10485 */,/*31498*/"OSMANYA LETTER DEEL"/* 10486 */, /*31499*/"OSMANYA LETTER RA"/* 10487 */,/*31500*/"OSMANYA LETTER SA"/* 10488 */, /*31501*/"OSMANYA LETTER SHIIN"/* 10489 */,/*31502*/"OSMANYA LETTER DHA"/* 1048A */, /*31503*/"OSMANYA LETTER CAYN"/* 1048B */,/*31504*/"OSMANYA LETTER GA"/* 1048C */, /*31505*/"OSMANYA LETTER FA"/* 1048D */,/*31506*/"OSMANYA LETTER QAAF"/* 1048E */, /*31507*/"OSMANYA LETTER KAAF"/* 1048F */,/*31508*/"OSMANYA LETTER LAAN"/* 10490 */, /*31509*/"OSMANYA LETTER MIIN"/* 10491 */,/*31510*/"OSMANYA LETTER NUUN"/* 10492 */, /*31511*/"OSMANYA LETTER WAW"/* 10493 */,/*31512*/"OSMANYA LETTER HA"/* 10494 */,/*31513*/"OSMANYA LETTER YA"/* 10495 */, /*31514*/"OSMANYA LETTER A"/* 10496 */,/*31515*/"OSMANYA LETTER E"/* 10497 */,/*31516*/"OSMANYA LETTER I"/* 10498 */, /*31517*/"OSMANYA LETTER O"/* 10499 */,/*31518*/"OSMANYA LETTER U"/* 1049A */,/*31519*/"OSMANYA LETTER AA"/* 1049B */, /*31520*/"OSMANYA LETTER EE"/* 1049C */,/*31521*/"OSMANYA LETTER OO"/* 1049D */,NULL,NULL, /*31524*/"OSMANYA DIGIT ZERO"/* 104A0 */,/*31525*/"OSMANYA DIGIT ONE"/* 104A1 */,/*31526*/"OSMANYA DIGIT TWO"/* 104A2 */, /*31527*/"OSMANYA DIGIT THREE"/* 104A3 */,/*31528*/"OSMANYA DIGIT FOUR"/* 104A4 */, /*31529*/"OSMANYA DIGIT FIVE"/* 104A5 */,/*31530*/"OSMANYA DIGIT SIX"/* 104A6 */, /*31531*/"OSMANYA DIGIT SEVEN"/* 104A7 */,/*31532*/"OSMANYA DIGIT EIGHT"/* 104A8 */, /*31533*/"OSMANYA DIGIT NINE"/* 104A9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31620*/"ELBASAN LETTER A"/* 10500 */,/*31621*/"ELBASAN LETTER BE"/* 10501 */,/*31622*/"ELBASAN LETTER CE"/* 10502 */, /*31623*/"ELBASAN LETTER CHE"/* 10503 */,/*31624*/"ELBASAN LETTER DE"/* 10504 */, /*31625*/"ELBASAN LETTER NDE"/* 10505 */,/*31626*/"ELBASAN LETTER DHE"/* 10506 */, /*31627*/"ELBASAN LETTER EI"/* 10507 */,/*31628*/"ELBASAN LETTER E"/* 10508 */,/*31629*/"ELBASAN LETTER FE"/* 10509 */, /*31630*/"ELBASAN LETTER GE"/* 1050A */,/*31631*/"ELBASAN LETTER GJE"/* 1050B */,/*31632*/"ELBASAN LETTER HE"/* 1050C */, /*31633*/"ELBASAN LETTER I"/* 1050D */,/*31634*/"ELBASAN LETTER JE"/* 1050E */,/*31635*/"ELBASAN LETTER KE"/* 1050F */, /*31636*/"ELBASAN LETTER LE"/* 10510 */,/*31637*/"ELBASAN LETTER LLE"/* 10511 */,/*31638*/"ELBASAN LETTER ME"/* 10512 */, /*31639*/"ELBASAN LETTER NE"/* 10513 */,/*31640*/"ELBASAN LETTER NA"/* 10514 */,/*31641*/"ELBASAN LETTER NJE"/* 10515 */, /*31642*/"ELBASAN LETTER O"/* 10516 */,/*31643*/"ELBASAN LETTER PE"/* 10517 */,/*31644*/"ELBASAN LETTER QE"/* 10518 */, /*31645*/"ELBASAN LETTER RE"/* 10519 */,/*31646*/"ELBASAN LETTER RRE"/* 1051A */,/*31647*/"ELBASAN LETTER SE"/* 1051B */, /*31648*/"ELBASAN LETTER SHE"/* 1051C */,/*31649*/"ELBASAN LETTER TE"/* 1051D */, /*31650*/"ELBASAN LETTER THE"/* 1051E */,/*31651*/"ELBASAN LETTER U"/* 1051F */,/*31652*/"ELBASAN LETTER VE"/* 10520 */, /*31653*/"ELBASAN LETTER XE"/* 10521 */,/*31654*/"ELBASAN LETTER Y"/* 10522 */,/*31655*/"ELBASAN LETTER ZE"/* 10523 */, /*31656*/"ELBASAN LETTER ZHE"/* 10524 */,/*31657*/"ELBASAN LETTER GHE"/* 10525 */, /*31658*/"ELBASAN LETTER GHAMMA"/* 10526 */,/*31659*/"ELBASAN LETTER KHE"/* 10527 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*31668*/"CAUCASIAN ALBANIAN LETTER ALT"/* 10530 */,/*31669*/"CAUCASIAN ALBANIAN LETTER BET"/* 10531 */, /*31670*/"CAUCASIAN ALBANIAN LETTER GIM"/* 10532 */,/*31671*/"CAUCASIAN ALBANIAN LETTER DAT"/* 10533 */, /*31672*/"CAUCASIAN ALBANIAN LETTER EB"/* 10534 */,/*31673*/"CAUCASIAN ALBANIAN LETTER ZARL"/* 10535 */, /*31674*/"CAUCASIAN ALBANIAN LETTER EYN"/* 10536 */,/*31675*/"CAUCASIAN ALBANIAN LETTER ZHIL"/* 10537 */, /*31676*/"CAUCASIAN ALBANIAN LETTER TAS"/* 10538 */,/*31677*/"CAUCASIAN ALBANIAN LETTER CHA"/* 10539 */, /*31678*/"CAUCASIAN ALBANIAN LETTER YOWD"/* 1053A */,/*31679*/"CAUCASIAN ALBANIAN LETTER ZHA"/* 1053B */, /*31680*/"CAUCASIAN ALBANIAN LETTER IRB"/* 1053C */,/*31681*/"CAUCASIAN ALBANIAN LETTER SHA"/* 1053D */, /*31682*/"CAUCASIAN ALBANIAN LETTER LAN"/* 1053E */,/*31683*/"CAUCASIAN ALBANIAN LETTER INYA"/* 1053F */, /*31684*/"CAUCASIAN ALBANIAN LETTER XEYN"/* 10540 */,/*31685*/"CAUCASIAN ALBANIAN LETTER DYAN"/* 10541 */, /*31686*/"CAUCASIAN ALBANIAN LETTER CAR"/* 10542 */,/*31687*/"CAUCASIAN ALBANIAN LETTER JHOX"/* 10543 */, /*31688*/"CAUCASIAN ALBANIAN LETTER KAR"/* 10544 */,/*31689*/"CAUCASIAN ALBANIAN LETTER LYIT"/* 10545 */, /*31690*/"CAUCASIAN ALBANIAN LETTER HEYT"/* 10546 */,/*31691*/"CAUCASIAN ALBANIAN LETTER QAY"/* 10547 */, /*31692*/"CAUCASIAN ALBANIAN LETTER AOR"/* 10548 */,/*31693*/"CAUCASIAN ALBANIAN LETTER CHOY"/* 10549 */, /*31694*/"CAUCASIAN ALBANIAN LETTER CHI"/* 1054A */,/*31695*/"CAUCASIAN ALBANIAN LETTER CYAY"/* 1054B */, /*31696*/"CAUCASIAN ALBANIAN LETTER MAQ"/* 1054C */,/*31697*/"CAUCASIAN ALBANIAN LETTER QAR"/* 1054D */, /*31698*/"CAUCASIAN ALBANIAN LETTER NOWC"/* 1054E */,/*31699*/"CAUCASIAN ALBANIAN LETTER DZYAY"/* 1054F */, /*31700*/"CAUCASIAN ALBANIAN LETTER SHAK"/* 10550 */,/*31701*/"CAUCASIAN ALBANIAN LETTER JAYN"/* 10551 */, /*31702*/"CAUCASIAN ALBANIAN LETTER ON"/* 10552 */,/*31703*/"CAUCASIAN ALBANIAN LETTER TYAY"/* 10553 */, /*31704*/"CAUCASIAN ALBANIAN LETTER FAM"/* 10554 */,/*31705*/"CAUCASIAN ALBANIAN LETTER DZAY"/* 10555 */, /*31706*/"CAUCASIAN ALBANIAN LETTER CHAT"/* 10556 */,/*31707*/"CAUCASIAN ALBANIAN LETTER PEN"/* 10557 */, /*31708*/"CAUCASIAN ALBANIAN LETTER GHEYS"/* 10558 */,/*31709*/"CAUCASIAN ALBANIAN LETTER RAT"/* 10559 */, /*31710*/"CAUCASIAN ALBANIAN LETTER SEYK"/* 1055A */,/*31711*/"CAUCASIAN ALBANIAN LETTER VEYZ"/* 1055B */, /*31712*/"CAUCASIAN ALBANIAN LETTER TIWR"/* 1055C */,/*31713*/"CAUCASIAN ALBANIAN LETTER SHOY"/* 1055D */, /*31714*/"CAUCASIAN ALBANIAN LETTER IWN"/* 1055E */,/*31715*/"CAUCASIAN ALBANIAN LETTER CYAW"/* 1055F */, /*31716*/"CAUCASIAN ALBANIAN LETTER CAYN"/* 10560 */,/*31717*/"CAUCASIAN ALBANIAN LETTER YAYD"/* 10561 */, /*31718*/"CAUCASIAN ALBANIAN LETTER PIWR"/* 10562 */,/*31719*/"CAUCASIAN ALBANIAN LETTER KIW"/* 10563 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*31731*/"CAUCASIAN ALBANIAN CITATION MARK"/* 1056F */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31876*/"LINEAR A SIGN AB001"/* 10600 */,/*31877*/"LINEAR A SIGN AB002"/* 10601 */, /*31878*/"LINEAR A SIGN AB003"/* 10602 */,/*31879*/"LINEAR A SIGN AB004"/* 10603 */, /*31880*/"LINEAR A SIGN AB005"/* 10604 */,/*31881*/"LINEAR A SIGN AB006"/* 10605 */, /*31882*/"LINEAR A SIGN AB007"/* 10606 */,/*31883*/"LINEAR A SIGN AB008"/* 10607 */, /*31884*/"LINEAR A SIGN AB009"/* 10608 */,/*31885*/"LINEAR A SIGN AB010"/* 10609 */, /*31886*/"LINEAR A SIGN AB011"/* 1060A */,/*31887*/"LINEAR A SIGN AB013"/* 1060B */, /*31888*/"LINEAR A SIGN AB016"/* 1060C */,/*31889*/"LINEAR A SIGN AB017"/* 1060D */, /*31890*/"LINEAR A SIGN AB020"/* 1060E */,/*31891*/"LINEAR A SIGN AB021"/* 1060F */, /*31892*/"LINEAR A SIGN AB021F"/* 10610 */,/*31893*/"LINEAR A SIGN AB021M"/* 10611 */, /*31894*/"LINEAR A SIGN AB022"/* 10612 */,/*31895*/"LINEAR A SIGN AB022F"/* 10613 */, /*31896*/"LINEAR A SIGN AB022M"/* 10614 */,/*31897*/"LINEAR A SIGN AB023"/* 10615 */, /*31898*/"LINEAR A SIGN AB023M"/* 10616 */,/*31899*/"LINEAR A SIGN AB024"/* 10617 */, /*31900*/"LINEAR A SIGN AB026"/* 10618 */,/*31901*/"LINEAR A SIGN AB027"/* 10619 */, /*31902*/"LINEAR A SIGN AB028"/* 1061A */,/*31903*/"LINEAR A SIGN A028B"/* 1061B */, /*31904*/"LINEAR A SIGN AB029"/* 1061C */,/*31905*/"LINEAR A SIGN AB030"/* 1061D */, /*31906*/"LINEAR A SIGN AB031"/* 1061E */,/*31907*/"LINEAR A SIGN AB034"/* 1061F */, /*31908*/"LINEAR A SIGN AB037"/* 10620 */,/*31909*/"LINEAR A SIGN AB038"/* 10621 */, /*31910*/"LINEAR A SIGN AB039"/* 10622 */,/*31911*/"LINEAR A SIGN AB040"/* 10623 */, /*31912*/"LINEAR A SIGN AB041"/* 10624 */,/*31913*/"LINEAR A SIGN AB044"/* 10625 */, /*31914*/"LINEAR A SIGN AB045"/* 10626 */,/*31915*/"LINEAR A SIGN AB046"/* 10627 */, /*31916*/"LINEAR A SIGN AB047"/* 10628 */,/*31917*/"LINEAR A SIGN AB048"/* 10629 */, /*31918*/"LINEAR A SIGN AB049"/* 1062A */,/*31919*/"LINEAR A SIGN AB050"/* 1062B */, /*31920*/"LINEAR A SIGN AB051"/* 1062C */,/*31921*/"LINEAR A SIGN AB053"/* 1062D */, /*31922*/"LINEAR A SIGN AB054"/* 1062E */,/*31923*/"LINEAR A SIGN AB055"/* 1062F */, /*31924*/"LINEAR A SIGN AB056"/* 10630 */,/*31925*/"LINEAR A SIGN AB057"/* 10631 */, /*31926*/"LINEAR A SIGN AB058"/* 10632 */,/*31927*/"LINEAR A SIGN AB059"/* 10633 */, /*31928*/"LINEAR A SIGN AB060"/* 10634 */,/*31929*/"LINEAR A SIGN AB061"/* 10635 */, /*31930*/"LINEAR A SIGN AB065"/* 10636 */,/*31931*/"LINEAR A SIGN AB066"/* 10637 */, /*31932*/"LINEAR A SIGN AB067"/* 10638 */,/*31933*/"LINEAR A SIGN AB069"/* 10639 */, /*31934*/"LINEAR A SIGN AB070"/* 1063A */,/*31935*/"LINEAR A SIGN AB073"/* 1063B */, /*31936*/"LINEAR A SIGN AB074"/* 1063C */,/*31937*/"LINEAR A SIGN AB076"/* 1063D */, /*31938*/"LINEAR A SIGN AB077"/* 1063E */,/*31939*/"LINEAR A SIGN AB078"/* 1063F */, /*31940*/"LINEAR A SIGN AB079"/* 10640 */,/*31941*/"LINEAR A SIGN AB080"/* 10641 */, /*31942*/"LINEAR A SIGN AB081"/* 10642 */,/*31943*/"LINEAR A SIGN AB082"/* 10643 */, /*31944*/"LINEAR A SIGN AB085"/* 10644 */,/*31945*/"LINEAR A SIGN AB086"/* 10645 */, /*31946*/"LINEAR A SIGN AB087"/* 10646 */,/*31947*/"LINEAR A SIGN A100-102"/* 10647 */, /*31948*/"LINEAR A SIGN AB118"/* 10648 */,/*31949*/"LINEAR A SIGN AB120"/* 10649 */, /*31950*/"LINEAR A SIGN A120B"/* 1064A */,/*31951*/"LINEAR A SIGN AB122"/* 1064B */, /*31952*/"LINEAR A SIGN AB123"/* 1064C */,/*31953*/"LINEAR A SIGN AB131A"/* 1064D */, /*31954*/"LINEAR A SIGN AB131B"/* 1064E */,/*31955*/"LINEAR A SIGN A131C"/* 1064F */, /*31956*/"LINEAR A SIGN AB164"/* 10650 */,/*31957*/"LINEAR A SIGN AB171"/* 10651 */, /*31958*/"LINEAR A SIGN AB180"/* 10652 */,/*31959*/"LINEAR A SIGN AB188"/* 10653 */, /*31960*/"LINEAR A SIGN AB191"/* 10654 */,/*31961*/"LINEAR A SIGN A301"/* 10655 */, /*31962*/"LINEAR A SIGN A302"/* 10656 */,/*31963*/"LINEAR A SIGN A303"/* 10657 */, /*31964*/"LINEAR A SIGN A304"/* 10658 */,/*31965*/"LINEAR A SIGN A305"/* 10659 */, /*31966*/"LINEAR A SIGN A306"/* 1065A */,/*31967*/"LINEAR A SIGN A307"/* 1065B */, /*31968*/"LINEAR A SIGN A308"/* 1065C */,/*31969*/"LINEAR A SIGN A309A"/* 1065D */, /*31970*/"LINEAR A SIGN A309B"/* 1065E */,/*31971*/"LINEAR A SIGN A309C"/* 1065F */, /*31972*/"LINEAR A SIGN A310"/* 10660 */,/*31973*/"LINEAR A SIGN A311"/* 10661 */, /*31974*/"LINEAR A SIGN A312"/* 10662 */,/*31975*/"LINEAR A SIGN A313A"/* 10663 */, /*31976*/"LINEAR A SIGN A313B"/* 10664 */,/*31977*/"LINEAR A SIGN A313C"/* 10665 */, /*31978*/"LINEAR A SIGN A314"/* 10666 */,/*31979*/"LINEAR A SIGN A315"/* 10667 */, /*31980*/"LINEAR A SIGN A316"/* 10668 */,/*31981*/"LINEAR A SIGN A317"/* 10669 */, /*31982*/"LINEAR A SIGN A318"/* 1066A */,/*31983*/"LINEAR A SIGN A319"/* 1066B */, /*31984*/"LINEAR A SIGN A320"/* 1066C */,/*31985*/"LINEAR A SIGN A321"/* 1066D */, /*31986*/"LINEAR A SIGN A322"/* 1066E */,/*31987*/"LINEAR A SIGN A323"/* 1066F */, /*31988*/"LINEAR A SIGN A324"/* 10670 */,/*31989*/"LINEAR A SIGN A325"/* 10671 */, /*31990*/"LINEAR A SIGN A326"/* 10672 */,/*31991*/"LINEAR A SIGN A327"/* 10673 */, /*31992*/"LINEAR A SIGN A328"/* 10674 */,/*31993*/"LINEAR A SIGN A329"/* 10675 */, /*31994*/"LINEAR A SIGN A330"/* 10676 */,/*31995*/"LINEAR A SIGN A331"/* 10677 */, /*31996*/"LINEAR A SIGN A332"/* 10678 */,/*31997*/"LINEAR A SIGN A333"/* 10679 */, /*31998*/"LINEAR A SIGN A334"/* 1067A */,/*31999*/"LINEAR A SIGN A335"/* 1067B */, /*32000*/"LINEAR A SIGN A336"/* 1067C */,/*32001*/"LINEAR A SIGN A337"/* 1067D */, /*32002*/"LINEAR A SIGN A338"/* 1067E */,/*32003*/"LINEAR A SIGN A339"/* 1067F */, /*32004*/"LINEAR A SIGN A340"/* 10680 */,/*32005*/"LINEAR A SIGN A341"/* 10681 */, /*32006*/"LINEAR A SIGN A342"/* 10682 */,/*32007*/"LINEAR A SIGN A343"/* 10683 */, /*32008*/"LINEAR A SIGN A344"/* 10684 */,/*32009*/"LINEAR A SIGN A345"/* 10685 */, /*32010*/"LINEAR A SIGN A346"/* 10686 */,/*32011*/"LINEAR A SIGN A347"/* 10687 */, /*32012*/"LINEAR A SIGN A348"/* 10688 */,/*32013*/"LINEAR A SIGN A349"/* 10689 */, /*32014*/"LINEAR A SIGN A350"/* 1068A */,/*32015*/"LINEAR A SIGN A351"/* 1068B */, /*32016*/"LINEAR A SIGN A352"/* 1068C */,/*32017*/"LINEAR A SIGN A353"/* 1068D */, /*32018*/"LINEAR A SIGN A354"/* 1068E */,/*32019*/"LINEAR A SIGN A355"/* 1068F */, /*32020*/"LINEAR A SIGN A356"/* 10690 */,/*32021*/"LINEAR A SIGN A357"/* 10691 */, /*32022*/"LINEAR A SIGN A358"/* 10692 */,/*32023*/"LINEAR A SIGN A359"/* 10693 */, /*32024*/"LINEAR A SIGN A360"/* 10694 */,/*32025*/"LINEAR A SIGN A361"/* 10695 */, /*32026*/"LINEAR A SIGN A362"/* 10696 */,/*32027*/"LINEAR A SIGN A363"/* 10697 */, /*32028*/"LINEAR A SIGN A364"/* 10698 */,/*32029*/"LINEAR A SIGN A365"/* 10699 */, /*32030*/"LINEAR A SIGN A366"/* 1069A */,/*32031*/"LINEAR A SIGN A367"/* 1069B */, /*32032*/"LINEAR A SIGN A368"/* 1069C */,/*32033*/"LINEAR A SIGN A369"/* 1069D */, /*32034*/"LINEAR A SIGN A370"/* 1069E */,/*32035*/"LINEAR A SIGN A371"/* 1069F */, /*32036*/"LINEAR A SIGN A400-VAS"/* 106A0 */,/*32037*/"LINEAR A SIGN A401-VAS"/* 106A1 */, /*32038*/"LINEAR A SIGN A402-VAS"/* 106A2 */,/*32039*/"LINEAR A SIGN A403-VAS"/* 106A3 */, /*32040*/"LINEAR A SIGN A404-VAS"/* 106A4 */,/*32041*/"LINEAR A SIGN A405-VAS"/* 106A5 */, /*32042*/"LINEAR A SIGN A406-VAS"/* 106A6 */,/*32043*/"LINEAR A SIGN A407-VAS"/* 106A7 */, /*32044*/"LINEAR A SIGN A408-VAS"/* 106A8 */,/*32045*/"LINEAR A SIGN A409-VAS"/* 106A9 */, /*32046*/"LINEAR A SIGN A410-VAS"/* 106AA */,/*32047*/"LINEAR A SIGN A411-VAS"/* 106AB */, /*32048*/"LINEAR A SIGN A412-VAS"/* 106AC */,/*32049*/"LINEAR A SIGN A413-VAS"/* 106AD */, /*32050*/"LINEAR A SIGN A414-VAS"/* 106AE */,/*32051*/"LINEAR A SIGN A415-VAS"/* 106AF */, /*32052*/"LINEAR A SIGN A416-VAS"/* 106B0 */,/*32053*/"LINEAR A SIGN A417-VAS"/* 106B1 */, /*32054*/"LINEAR A SIGN A418-VAS"/* 106B2 */,/*32055*/"LINEAR A SIGN A501"/* 106B3 */, /*32056*/"LINEAR A SIGN A502"/* 106B4 */,/*32057*/"LINEAR A SIGN A503"/* 106B5 */, /*32058*/"LINEAR A SIGN A504"/* 106B6 */,/*32059*/"LINEAR A SIGN A505"/* 106B7 */, /*32060*/"LINEAR A SIGN A506"/* 106B8 */,/*32061*/"LINEAR A SIGN A508"/* 106B9 */, /*32062*/"LINEAR A SIGN A509"/* 106BA */,/*32063*/"LINEAR A SIGN A510"/* 106BB */, /*32064*/"LINEAR A SIGN A511"/* 106BC */,/*32065*/"LINEAR A SIGN A512"/* 106BD */, /*32066*/"LINEAR A SIGN A513"/* 106BE */,/*32067*/"LINEAR A SIGN A515"/* 106BF */, /*32068*/"LINEAR A SIGN A516"/* 106C0 */,/*32069*/"LINEAR A SIGN A520"/* 106C1 */, /*32070*/"LINEAR A SIGN A521"/* 106C2 */,/*32071*/"LINEAR A SIGN A523"/* 106C3 */, /*32072*/"LINEAR A SIGN A524"/* 106C4 */,/*32073*/"LINEAR A SIGN A525"/* 106C5 */, /*32074*/"LINEAR A SIGN A526"/* 106C6 */,/*32075*/"LINEAR A SIGN A527"/* 106C7 */, /*32076*/"LINEAR A SIGN A528"/* 106C8 */,/*32077*/"LINEAR A SIGN A529"/* 106C9 */, /*32078*/"LINEAR A SIGN A530"/* 106CA */,/*32079*/"LINEAR A SIGN A531"/* 106CB */, /*32080*/"LINEAR A SIGN A532"/* 106CC */,/*32081*/"LINEAR A SIGN A534"/* 106CD */, /*32082*/"LINEAR A SIGN A535"/* 106CE */,/*32083*/"LINEAR A SIGN A536"/* 106CF */, /*32084*/"LINEAR A SIGN A537"/* 106D0 */,/*32085*/"LINEAR A SIGN A538"/* 106D1 */, /*32086*/"LINEAR A SIGN A539"/* 106D2 */,/*32087*/"LINEAR A SIGN A540"/* 106D3 */, /*32088*/"LINEAR A SIGN A541"/* 106D4 */,/*32089*/"LINEAR A SIGN A542"/* 106D5 */, /*32090*/"LINEAR A SIGN A545"/* 106D6 */,/*32091*/"LINEAR A SIGN A547"/* 106D7 */, /*32092*/"LINEAR A SIGN A548"/* 106D8 */,/*32093*/"LINEAR A SIGN A549"/* 106D9 */, /*32094*/"LINEAR A SIGN A550"/* 106DA */,/*32095*/"LINEAR A SIGN A551"/* 106DB */, /*32096*/"LINEAR A SIGN A552"/* 106DC */,/*32097*/"LINEAR A SIGN A553"/* 106DD */, /*32098*/"LINEAR A SIGN A554"/* 106DE */,/*32099*/"LINEAR A SIGN A555"/* 106DF */, /*32100*/"LINEAR A SIGN A556"/* 106E0 */,/*32101*/"LINEAR A SIGN A557"/* 106E1 */, /*32102*/"LINEAR A SIGN A559"/* 106E2 */,/*32103*/"LINEAR A SIGN A563"/* 106E3 */, /*32104*/"LINEAR A SIGN A564"/* 106E4 */,/*32105*/"LINEAR A SIGN A565"/* 106E5 */, /*32106*/"LINEAR A SIGN A566"/* 106E6 */,/*32107*/"LINEAR A SIGN A568"/* 106E7 */, /*32108*/"LINEAR A SIGN A569"/* 106E8 */,/*32109*/"LINEAR A SIGN A570"/* 106E9 */, /*32110*/"LINEAR A SIGN A571"/* 106EA */,/*32111*/"LINEAR A SIGN A572"/* 106EB */, /*32112*/"LINEAR A SIGN A573"/* 106EC */,/*32113*/"LINEAR A SIGN A574"/* 106ED */, /*32114*/"LINEAR A SIGN A575"/* 106EE */,/*32115*/"LINEAR A SIGN A576"/* 106EF */, /*32116*/"LINEAR A SIGN A577"/* 106F0 */,/*32117*/"LINEAR A SIGN A578"/* 106F1 */, /*32118*/"LINEAR A SIGN A579"/* 106F2 */,/*32119*/"LINEAR A SIGN A580"/* 106F3 */, /*32120*/"LINEAR A SIGN A581"/* 106F4 */,/*32121*/"LINEAR A SIGN A582"/* 106F5 */, /*32122*/"LINEAR A SIGN A583"/* 106F6 */,/*32123*/"LINEAR A SIGN A584"/* 106F7 */, /*32124*/"LINEAR A SIGN A585"/* 106F8 */,/*32125*/"LINEAR A SIGN A586"/* 106F9 */, /*32126*/"LINEAR A SIGN A587"/* 106FA */,/*32127*/"LINEAR A SIGN A588"/* 106FB */, /*32128*/"LINEAR A SIGN A589"/* 106FC */,/*32129*/"LINEAR A SIGN A591"/* 106FD */, /*32130*/"LINEAR A SIGN A592"/* 106FE */,/*32131*/"LINEAR A SIGN A594"/* 106FF */, /*32132*/"LINEAR A SIGN A595"/* 10700 */,/*32133*/"LINEAR A SIGN A596"/* 10701 */, /*32134*/"LINEAR A SIGN A598"/* 10702 */,/*32135*/"LINEAR A SIGN A600"/* 10703 */, /*32136*/"LINEAR A SIGN A601"/* 10704 */,/*32137*/"LINEAR A SIGN A602"/* 10705 */, /*32138*/"LINEAR A SIGN A603"/* 10706 */,/*32139*/"LINEAR A SIGN A604"/* 10707 */, /*32140*/"LINEAR A SIGN A606"/* 10708 */,/*32141*/"LINEAR A SIGN A608"/* 10709 */, /*32142*/"LINEAR A SIGN A609"/* 1070A */,/*32143*/"LINEAR A SIGN A610"/* 1070B */, /*32144*/"LINEAR A SIGN A611"/* 1070C */,/*32145*/"LINEAR A SIGN A612"/* 1070D */, /*32146*/"LINEAR A SIGN A613"/* 1070E */,/*32147*/"LINEAR A SIGN A614"/* 1070F */, /*32148*/"LINEAR A SIGN A615"/* 10710 */,/*32149*/"LINEAR A SIGN A616"/* 10711 */, /*32150*/"LINEAR A SIGN A617"/* 10712 */,/*32151*/"LINEAR A SIGN A618"/* 10713 */, /*32152*/"LINEAR A SIGN A619"/* 10714 */,/*32153*/"LINEAR A SIGN A620"/* 10715 */, /*32154*/"LINEAR A SIGN A621"/* 10716 */,/*32155*/"LINEAR A SIGN A622"/* 10717 */, /*32156*/"LINEAR A SIGN A623"/* 10718 */,/*32157*/"LINEAR A SIGN A624"/* 10719 */, /*32158*/"LINEAR A SIGN A626"/* 1071A */,/*32159*/"LINEAR A SIGN A627"/* 1071B */, /*32160*/"LINEAR A SIGN A628"/* 1071C */,/*32161*/"LINEAR A SIGN A629"/* 1071D */, /*32162*/"LINEAR A SIGN A634"/* 1071E */,/*32163*/"LINEAR A SIGN A637"/* 1071F */, /*32164*/"LINEAR A SIGN A638"/* 10720 */,/*32165*/"LINEAR A SIGN A640"/* 10721 */, /*32166*/"LINEAR A SIGN A642"/* 10722 */,/*32167*/"LINEAR A SIGN A643"/* 10723 */, /*32168*/"LINEAR A SIGN A644"/* 10724 */,/*32169*/"LINEAR A SIGN A645"/* 10725 */, /*32170*/"LINEAR A SIGN A646"/* 10726 */,/*32171*/"LINEAR A SIGN A648"/* 10727 */, /*32172*/"LINEAR A SIGN A649"/* 10728 */,/*32173*/"LINEAR A SIGN A651"/* 10729 */, /*32174*/"LINEAR A SIGN A652"/* 1072A */,/*32175*/"LINEAR A SIGN A653"/* 1072B */, /*32176*/"LINEAR A SIGN A654"/* 1072C */,/*32177*/"LINEAR A SIGN A655"/* 1072D */, /*32178*/"LINEAR A SIGN A656"/* 1072E */,/*32179*/"LINEAR A SIGN A657"/* 1072F */, /*32180*/"LINEAR A SIGN A658"/* 10730 */,/*32181*/"LINEAR A SIGN A659"/* 10731 */, /*32182*/"LINEAR A SIGN A660"/* 10732 */,/*32183*/"LINEAR A SIGN A661"/* 10733 */, /*32184*/"LINEAR A SIGN A662"/* 10734 */,/*32185*/"LINEAR A SIGN A663"/* 10735 */, /*32186*/"LINEAR A SIGN A664"/* 10736 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32196*/"LINEAR A SIGN A701 A"/* 10740 */,/*32197*/"LINEAR A SIGN A702 B"/* 10741 */, /*32198*/"LINEAR A SIGN A703 D"/* 10742 */,/*32199*/"LINEAR A SIGN A704 E"/* 10743 */, /*32200*/"LINEAR A SIGN A705 F"/* 10744 */,/*32201*/"LINEAR A SIGN A706 H"/* 10745 */, /*32202*/"LINEAR A SIGN A707 J"/* 10746 */,/*32203*/"LINEAR A SIGN A708 K"/* 10747 */, /*32204*/"LINEAR A SIGN A709 L"/* 10748 */,/*32205*/"LINEAR A SIGN A709-2 L2"/* 10749 */, /*32206*/"LINEAR A SIGN A709-3 L3"/* 1074A */,/*32207*/"LINEAR A SIGN A709-4 L4"/* 1074B */, /*32208*/"LINEAR A SIGN A709-6 L6"/* 1074C */,/*32209*/"LINEAR A SIGN A710 W"/* 1074D */, /*32210*/"LINEAR A SIGN A711 X"/* 1074E */,/*32211*/"LINEAR A SIGN A712 Y"/* 1074F */, /*32212*/"LINEAR A SIGN A713 OMEGA"/* 10750 */,/*32213*/"LINEAR A SIGN A714 ABB"/* 10751 */, /*32214*/"LINEAR A SIGN A715 BB"/* 10752 */,/*32215*/"LINEAR A SIGN A717 DD"/* 10753 */, /*32216*/"LINEAR A SIGN A726 EYYY"/* 10754 */,/*32217*/"LINEAR A SIGN A732 JE"/* 10755 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*32228*/"LINEAR A SIGN A800"/* 10760 */,/*32229*/"LINEAR A SIGN A801"/* 10761 */, /*32230*/"LINEAR A SIGN A802"/* 10762 */,/*32231*/"LINEAR A SIGN A803"/* 10763 */, /*32232*/"LINEAR A SIGN A804"/* 10764 */,/*32233*/"LINEAR A SIGN A805"/* 10765 */, /*32234*/"LINEAR A SIGN A806"/* 10766 */,/*32235*/"LINEAR A SIGN A807"/* 10767 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*32388*/"CYPRIOT SYLLABLE A"/* 10800 */,/*32389*/"CYPRIOT SYLLABLE E"/* 10801 */, /*32390*/"CYPRIOT SYLLABLE I"/* 10802 */,/*32391*/"CYPRIOT SYLLABLE O"/* 10803 */, /*32392*/"CYPRIOT SYLLABLE U"/* 10804 */,/*32393*/"CYPRIOT SYLLABLE JA"/* 10805 */,NULL,NULL, /*32396*/"CYPRIOT SYLLABLE JO"/* 10808 */,NULL,/*32398*/"CYPRIOT SYLLABLE KA"/* 1080A */, /*32399*/"CYPRIOT SYLLABLE KE"/* 1080B */,/*32400*/"CYPRIOT SYLLABLE KI"/* 1080C */, /*32401*/"CYPRIOT SYLLABLE KO"/* 1080D */,/*32402*/"CYPRIOT SYLLABLE KU"/* 1080E */, /*32403*/"CYPRIOT SYLLABLE LA"/* 1080F */,/*32404*/"CYPRIOT SYLLABLE LE"/* 10810 */, /*32405*/"CYPRIOT SYLLABLE LI"/* 10811 */,/*32406*/"CYPRIOT SYLLABLE LO"/* 10812 */, /*32407*/"CYPRIOT SYLLABLE LU"/* 10813 */,/*32408*/"CYPRIOT SYLLABLE MA"/* 10814 */, /*32409*/"CYPRIOT SYLLABLE ME"/* 10815 */,/*32410*/"CYPRIOT SYLLABLE MI"/* 10816 */, /*32411*/"CYPRIOT SYLLABLE MO"/* 10817 */,/*32412*/"CYPRIOT SYLLABLE MU"/* 10818 */, /*32413*/"CYPRIOT SYLLABLE NA"/* 10819 */,/*32414*/"CYPRIOT SYLLABLE NE"/* 1081A */, /*32415*/"CYPRIOT SYLLABLE NI"/* 1081B */,/*32416*/"CYPRIOT SYLLABLE NO"/* 1081C */, /*32417*/"CYPRIOT SYLLABLE NU"/* 1081D */,/*32418*/"CYPRIOT SYLLABLE PA"/* 1081E */, /*32419*/"CYPRIOT SYLLABLE PE"/* 1081F */,/*32420*/"CYPRIOT SYLLABLE PI"/* 10820 */, /*32421*/"CYPRIOT SYLLABLE PO"/* 10821 */,/*32422*/"CYPRIOT SYLLABLE PU"/* 10822 */, /*32423*/"CYPRIOT SYLLABLE RA"/* 10823 */,/*32424*/"CYPRIOT SYLLABLE RE"/* 10824 */, /*32425*/"CYPRIOT SYLLABLE RI"/* 10825 */,/*32426*/"CYPRIOT SYLLABLE RO"/* 10826 */, /*32427*/"CYPRIOT SYLLABLE RU"/* 10827 */,/*32428*/"CYPRIOT SYLLABLE SA"/* 10828 */, /*32429*/"CYPRIOT SYLLABLE SE"/* 10829 */,/*32430*/"CYPRIOT SYLLABLE SI"/* 1082A */, /*32431*/"CYPRIOT SYLLABLE SO"/* 1082B */,/*32432*/"CYPRIOT SYLLABLE SU"/* 1082C */, /*32433*/"CYPRIOT SYLLABLE TA"/* 1082D */,/*32434*/"CYPRIOT SYLLABLE TE"/* 1082E */, /*32435*/"CYPRIOT SYLLABLE TI"/* 1082F */,/*32436*/"CYPRIOT SYLLABLE TO"/* 10830 */, /*32437*/"CYPRIOT SYLLABLE TU"/* 10831 */,/*32438*/"CYPRIOT SYLLABLE WA"/* 10832 */, /*32439*/"CYPRIOT SYLLABLE WE"/* 10833 */,/*32440*/"CYPRIOT SYLLABLE WI"/* 10834 */, /*32441*/"CYPRIOT SYLLABLE WO"/* 10835 */,NULL,/*32443*/"CYPRIOT SYLLABLE XA"/* 10837 */, /*32444*/"CYPRIOT SYLLABLE XE"/* 10838 */,NULL,NULL,NULL,/*32448*/"CYPRIOT SYLLABLE ZA"/* 1083C */,NULL,NULL, /*32451*/"CYPRIOT SYLLABLE ZO"/* 1083F */,/*32452*/"IMPERIAL ARAMAIC LETTER ALEPH"/* 10840 */, /*32453*/"IMPERIAL ARAMAIC LETTER BETH"/* 10841 */,/*32454*/"IMPERIAL ARAMAIC LETTER GIMEL"/* 10842 */, /*32455*/"IMPERIAL ARAMAIC LETTER DALETH"/* 10843 */,/*32456*/"IMPERIAL ARAMAIC LETTER HE"/* 10844 */, /*32457*/"IMPERIAL ARAMAIC LETTER WAW"/* 10845 */,/*32458*/"IMPERIAL ARAMAIC LETTER ZAYIN"/* 10846 */, /*32459*/"IMPERIAL ARAMAIC LETTER HETH"/* 10847 */,/*32460*/"IMPERIAL ARAMAIC LETTER TETH"/* 10848 */, /*32461*/"IMPERIAL ARAMAIC LETTER YODH"/* 10849 */,/*32462*/"IMPERIAL ARAMAIC LETTER KAPH"/* 1084A */, /*32463*/"IMPERIAL ARAMAIC LETTER LAMEDH"/* 1084B */,/*32464*/"IMPERIAL ARAMAIC LETTER MEM"/* 1084C */, /*32465*/"IMPERIAL ARAMAIC LETTER NUN"/* 1084D */,/*32466*/"IMPERIAL ARAMAIC LETTER SAMEKH"/* 1084E */, /*32467*/"IMPERIAL ARAMAIC LETTER AYIN"/* 1084F */,/*32468*/"IMPERIAL ARAMAIC LETTER PE"/* 10850 */, /*32469*/"IMPERIAL ARAMAIC LETTER SADHE"/* 10851 */,/*32470*/"IMPERIAL ARAMAIC LETTER QOPH"/* 10852 */, /*32471*/"IMPERIAL ARAMAIC LETTER RESH"/* 10853 */,/*32472*/"IMPERIAL ARAMAIC LETTER SHIN"/* 10854 */, /*32473*/"IMPERIAL ARAMAIC LETTER TAW"/* 10855 */,NULL,/*32475*/"IMPERIAL ARAMAIC SECTION SIGN"/* 10857 */, /*32476*/"IMPERIAL ARAMAIC NUMBER ONE"/* 10858 */,/*32477*/"IMPERIAL ARAMAIC NUMBER TWO"/* 10859 */, /*32478*/"IMPERIAL ARAMAIC NUMBER THREE"/* 1085A */,/*32479*/"IMPERIAL ARAMAIC NUMBER TEN"/* 1085B */, /*32480*/"IMPERIAL ARAMAIC NUMBER TWENTY"/* 1085C */,/*32481*/"IMPERIAL ARAMAIC NUMBER ONE HUNDRED"/* 1085D */, /*32482*/"IMPERIAL ARAMAIC NUMBER ONE THOUSAND"/* 1085E */,/*32483*/"IMPERIAL ARAMAIC NUMBER TEN THOUSAND"/* 1085F */, /*32484*/"PALMYRENE LETTER ALEPH"/* 10860 */,/*32485*/"PALMYRENE LETTER BETH"/* 10861 */, /*32486*/"PALMYRENE LETTER GIMEL"/* 10862 */,/*32487*/"PALMYRENE LETTER DALETH"/* 10863 */, /*32488*/"PALMYRENE LETTER HE"/* 10864 */,/*32489*/"PALMYRENE LETTER WAW"/* 10865 */, /*32490*/"PALMYRENE LETTER ZAYIN"/* 10866 */,/*32491*/"PALMYRENE LETTER HETH"/* 10867 */, /*32492*/"PALMYRENE LETTER TETH"/* 10868 */,/*32493*/"PALMYRENE LETTER YODH"/* 10869 */, /*32494*/"PALMYRENE LETTER KAPH"/* 1086A */,/*32495*/"PALMYRENE LETTER LAMEDH"/* 1086B */, /*32496*/"PALMYRENE LETTER MEM"/* 1086C */,/*32497*/"PALMYRENE LETTER FINAL NUN"/* 1086D */, /*32498*/"PALMYRENE LETTER NUN"/* 1086E */,/*32499*/"PALMYRENE LETTER SAMEKH"/* 1086F */, /*32500*/"PALMYRENE LETTER AYIN"/* 10870 */,/*32501*/"PALMYRENE LETTER PE"/* 10871 */, /*32502*/"PALMYRENE LETTER SADHE"/* 10872 */,/*32503*/"PALMYRENE LETTER QOPH"/* 10873 */, /*32504*/"PALMYRENE LETTER RESH"/* 10874 */,/*32505*/"PALMYRENE LETTER SHIN"/* 10875 */, /*32506*/"PALMYRENE LETTER TAW"/* 10876 */,/*32507*/"PALMYRENE LEFT-POINTING FLEURON"/* 10877 */, /*32508*/"PALMYRENE RIGHT-POINTING FLEURON"/* 10878 */,/*32509*/"PALMYRENE NUMBER ONE"/* 10879 */, /*32510*/"PALMYRENE NUMBER TWO"/* 1087A */,/*32511*/"PALMYRENE NUMBER THREE"/* 1087B */, /*32512*/"PALMYRENE NUMBER FOUR"/* 1087C */,/*32513*/"PALMYRENE NUMBER FIVE"/* 1087D */, /*32514*/"PALMYRENE NUMBER TEN"/* 1087E */,/*32515*/"PALMYRENE NUMBER TWENTY"/* 1087F */, /*32516*/"NABATAEAN LETTER FINAL ALEPH"/* 10880 */,/*32517*/"NABATAEAN LETTER ALEPH"/* 10881 */, /*32518*/"NABATAEAN LETTER FINAL BETH"/* 10882 */,/*32519*/"NABATAEAN LETTER BETH"/* 10883 */, /*32520*/"NABATAEAN LETTER GIMEL"/* 10884 */,/*32521*/"NABATAEAN LETTER DALETH"/* 10885 */, /*32522*/"NABATAEAN LETTER FINAL HE"/* 10886 */,/*32523*/"NABATAEAN LETTER HE"/* 10887 */, /*32524*/"NABATAEAN LETTER WAW"/* 10888 */,/*32525*/"NABATAEAN LETTER ZAYIN"/* 10889 */, /*32526*/"NABATAEAN LETTER HETH"/* 1088A */,/*32527*/"NABATAEAN LETTER TETH"/* 1088B */, /*32528*/"NABATAEAN LETTER FINAL YODH"/* 1088C */,/*32529*/"NABATAEAN LETTER YODH"/* 1088D */, /*32530*/"NABATAEAN LETTER FINAL KAPH"/* 1088E */,/*32531*/"NABATAEAN LETTER KAPH"/* 1088F */, /*32532*/"NABATAEAN LETTER FINAL LAMEDH"/* 10890 */,/*32533*/"NABATAEAN LETTER LAMEDH"/* 10891 */, /*32534*/"NABATAEAN LETTER FINAL MEM"/* 10892 */,/*32535*/"NABATAEAN LETTER MEM"/* 10893 */, /*32536*/"NABATAEAN LETTER FINAL NUN"/* 10894 */,/*32537*/"NABATAEAN LETTER NUN"/* 10895 */, /*32538*/"NABATAEAN LETTER SAMEKH"/* 10896 */,/*32539*/"NABATAEAN LETTER AYIN"/* 10897 */, /*32540*/"NABATAEAN LETTER PE"/* 10898 */,/*32541*/"NABATAEAN LETTER SADHE"/* 10899 */, /*32542*/"NABATAEAN LETTER QOPH"/* 1089A */,/*32543*/"NABATAEAN LETTER RESH"/* 1089B */, /*32544*/"NABATAEAN LETTER FINAL SHIN"/* 1089C */,/*32545*/"NABATAEAN LETTER SHIN"/* 1089D */, /*32546*/"NABATAEAN LETTER TAW"/* 1089E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32555*/"NABATAEAN NUMBER ONE"/* 108A7 */,/*32556*/"NABATAEAN NUMBER TWO"/* 108A8 */, /*32557*/"NABATAEAN NUMBER THREE"/* 108A9 */,/*32558*/"NABATAEAN NUMBER FOUR"/* 108AA */, /*32559*/"NABATAEAN CRUCIFORM NUMBER FOUR"/* 108AB */,/*32560*/"NABATAEAN NUMBER FIVE"/* 108AC */, /*32561*/"NABATAEAN NUMBER TEN"/* 108AD */,/*32562*/"NABATAEAN NUMBER TWENTY"/* 108AE */, /*32563*/"NABATAEAN NUMBER ONE HUNDRED"/* 108AF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*32612*/"HATRAN LETTER ALEPH"/* 108E0 */, /*32613*/"HATRAN LETTER BETH"/* 108E1 */,/*32614*/"HATRAN LETTER GIMEL"/* 108E2 */, /*32615*/"HATRAN LETTER DALETH-RESH"/* 108E3 */,/*32616*/"HATRAN LETTER HE"/* 108E4 */, /*32617*/"HATRAN LETTER WAW"/* 108E5 */,/*32618*/"HATRAN LETTER ZAYN"/* 108E6 */, /*32619*/"HATRAN LETTER HETH"/* 108E7 */,/*32620*/"HATRAN LETTER TETH"/* 108E8 */, /*32621*/"HATRAN LETTER YODH"/* 108E9 */,/*32622*/"HATRAN LETTER KAPH"/* 108EA */, /*32623*/"HATRAN LETTER LAMEDH"/* 108EB */,/*32624*/"HATRAN LETTER MEM"/* 108EC */, /*32625*/"HATRAN LETTER NUN"/* 108ED */,/*32626*/"HATRAN LETTER SAMEKH"/* 108EE */, /*32627*/"HATRAN LETTER AYN"/* 108EF */,/*32628*/"HATRAN LETTER PE"/* 108F0 */,/*32629*/"HATRAN LETTER SADHE"/* 108F1 */, /*32630*/"HATRAN LETTER QOPH"/* 108F2 */,NULL,/*32632*/"HATRAN LETTER SHIN"/* 108F4 */, /*32633*/"HATRAN LETTER TAW"/* 108F5 */,NULL,NULL,NULL,NULL,NULL,/*32639*/"HATRAN NUMBER ONE"/* 108FB */, /*32640*/"HATRAN NUMBER FIVE"/* 108FC */,/*32641*/"HATRAN NUMBER TEN"/* 108FD */, /*32642*/"HATRAN NUMBER TWENTY"/* 108FE */,/*32643*/"HATRAN NUMBER ONE HUNDRED"/* 108FF */, /*32644*/"PHOENICIAN LETTER ALF"/* 10900 */,/*32645*/"PHOENICIAN LETTER BET"/* 10901 */, /*32646*/"PHOENICIAN LETTER GAML"/* 10902 */,/*32647*/"PHOENICIAN LETTER DELT"/* 10903 */, /*32648*/"PHOENICIAN LETTER HE"/* 10904 */,/*32649*/"PHOENICIAN LETTER WAU"/* 10905 */, /*32650*/"PHOENICIAN LETTER ZAI"/* 10906 */,/*32651*/"PHOENICIAN LETTER HET"/* 10907 */, /*32652*/"PHOENICIAN LETTER TET"/* 10908 */,/*32653*/"PHOENICIAN LETTER YOD"/* 10909 */, /*32654*/"PHOENICIAN LETTER KAF"/* 1090A */,/*32655*/"PHOENICIAN LETTER LAMD"/* 1090B */, /*32656*/"PHOENICIAN LETTER MEM"/* 1090C */,/*32657*/"PHOENICIAN LETTER NUN"/* 1090D */, /*32658*/"PHOENICIAN LETTER SEMK"/* 1090E */,/*32659*/"PHOENICIAN LETTER AIN"/* 1090F */, /*32660*/"PHOENICIAN LETTER PE"/* 10910 */,/*32661*/"PHOENICIAN LETTER SADE"/* 10911 */, /*32662*/"PHOENICIAN LETTER QOF"/* 10912 */,/*32663*/"PHOENICIAN LETTER ROSH"/* 10913 */, /*32664*/"PHOENICIAN LETTER SHIN"/* 10914 */,/*32665*/"PHOENICIAN LETTER TAU"/* 10915 */, /*32666*/"PHOENICIAN NUMBER ONE"/* 10916 */,/*32667*/"PHOENICIAN NUMBER TEN"/* 10917 */, /*32668*/"PHOENICIAN NUMBER TWENTY"/* 10918 */,/*32669*/"PHOENICIAN NUMBER ONE HUNDRED"/* 10919 */, /*32670*/"PHOENICIAN NUMBER TWO"/* 1091A */,/*32671*/"PHOENICIAN NUMBER THREE"/* 1091B */,NULL,NULL,NULL, /*32675*/"PHOENICIAN WORD SEPARATOR"/* 1091F */,/*32676*/"LYDIAN LETTER A"/* 10920 */, /*32677*/"LYDIAN LETTER B"/* 10921 */,/*32678*/"LYDIAN LETTER G"/* 10922 */,/*32679*/"LYDIAN LETTER D"/* 10923 */, /*32680*/"LYDIAN LETTER E"/* 10924 */,/*32681*/"LYDIAN LETTER V"/* 10925 */,/*32682*/"LYDIAN LETTER I"/* 10926 */, /*32683*/"LYDIAN LETTER Y"/* 10927 */,/*32684*/"LYDIAN LETTER K"/* 10928 */,/*32685*/"LYDIAN LETTER L"/* 10929 */, /*32686*/"LYDIAN LETTER M"/* 1092A */,/*32687*/"LYDIAN LETTER N"/* 1092B */,/*32688*/"LYDIAN LETTER O"/* 1092C */, /*32689*/"LYDIAN LETTER R"/* 1092D */,/*32690*/"LYDIAN LETTER SS"/* 1092E */,/*32691*/"LYDIAN LETTER T"/* 1092F */, /*32692*/"LYDIAN LETTER U"/* 10930 */,/*32693*/"LYDIAN LETTER F"/* 10931 */,/*32694*/"LYDIAN LETTER Q"/* 10932 */, /*32695*/"LYDIAN LETTER S"/* 10933 */,/*32696*/"LYDIAN LETTER TT"/* 10934 */,/*32697*/"LYDIAN LETTER AN"/* 10935 */, /*32698*/"LYDIAN LETTER EN"/* 10936 */,/*32699*/"LYDIAN LETTER LY"/* 10937 */,/*32700*/"LYDIAN LETTER NN"/* 10938 */, /*32701*/"LYDIAN LETTER C"/* 10939 */,NULL,NULL,NULL,NULL,NULL,/*32707*/"LYDIAN TRIANGULAR MARK"/* 1093F */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32772*/"MEROITIC HIEROGLYPHIC LETTER A"/* 10980 */,/*32773*/"MEROITIC HIEROGLYPHIC LETTER E"/* 10981 */, /*32774*/"MEROITIC HIEROGLYPHIC LETTER I"/* 10982 */,/*32775*/"MEROITIC HIEROGLYPHIC LETTER O"/* 10983 */, /*32776*/"MEROITIC HIEROGLYPHIC LETTER YA"/* 10984 */,/*32777*/"MEROITIC HIEROGLYPHIC LETTER WA"/* 10985 */, /*32778*/"MEROITIC HIEROGLYPHIC LETTER BA"/* 10986 */,/*32779*/"MEROITIC HIEROGLYPHIC LETTER BA-2"/* 10987 */, /*32780*/"MEROITIC HIEROGLYPHIC LETTER PA"/* 10988 */,/*32781*/"MEROITIC HIEROGLYPHIC LETTER MA"/* 10989 */, /*32782*/"MEROITIC HIEROGLYPHIC LETTER NA"/* 1098A */,/*32783*/"MEROITIC HIEROGLYPHIC LETTER NA-2"/* 1098B */, /*32784*/"MEROITIC HIEROGLYPHIC LETTER NE"/* 1098C */,/*32785*/"MEROITIC HIEROGLYPHIC LETTER NE-2"/* 1098D */, /*32786*/"MEROITIC HIEROGLYPHIC LETTER RA"/* 1098E */,/*32787*/"MEROITIC HIEROGLYPHIC LETTER RA-2"/* 1098F */, /*32788*/"MEROITIC HIEROGLYPHIC LETTER LA"/* 10990 */,/*32789*/"MEROITIC HIEROGLYPHIC LETTER KHA"/* 10991 */, /*32790*/"MEROITIC HIEROGLYPHIC LETTER HHA"/* 10992 */,/*32791*/"MEROITIC HIEROGLYPHIC LETTER SA"/* 10993 */, /*32792*/"MEROITIC HIEROGLYPHIC LETTER SA-2"/* 10994 */,/*32793*/"MEROITIC HIEROGLYPHIC LETTER SE"/* 10995 */, /*32794*/"MEROITIC HIEROGLYPHIC LETTER KA"/* 10996 */,/*32795*/"MEROITIC HIEROGLYPHIC LETTER QA"/* 10997 */, /*32796*/"MEROITIC HIEROGLYPHIC LETTER TA"/* 10998 */,/*32797*/"MEROITIC HIEROGLYPHIC LETTER TA-2"/* 10999 */, /*32798*/"MEROITIC HIEROGLYPHIC LETTER TE"/* 1099A */,/*32799*/"MEROITIC HIEROGLYPHIC LETTER TE-2"/* 1099B */, /*32800*/"MEROITIC HIEROGLYPHIC LETTER TO"/* 1099C */,/*32801*/"MEROITIC HIEROGLYPHIC LETTER DA"/* 1099D */, /*32802*/"MEROITIC HIEROGLYPHIC SYMBOL VIDJ"/* 1099E */,/*32803*/"MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2"/* 1099F */, /*32804*/"MEROITIC CURSIVE LETTER A"/* 109A0 */,/*32805*/"MEROITIC CURSIVE LETTER E"/* 109A1 */, /*32806*/"MEROITIC CURSIVE LETTER I"/* 109A2 */,/*32807*/"MEROITIC CURSIVE LETTER O"/* 109A3 */, /*32808*/"MEROITIC CURSIVE LETTER YA"/* 109A4 */,/*32809*/"MEROITIC CURSIVE LETTER WA"/* 109A5 */, /*32810*/"MEROITIC CURSIVE LETTER BA"/* 109A6 */,/*32811*/"MEROITIC CURSIVE LETTER PA"/* 109A7 */, /*32812*/"MEROITIC CURSIVE LETTER MA"/* 109A8 */,/*32813*/"MEROITIC CURSIVE LETTER NA"/* 109A9 */, /*32814*/"MEROITIC CURSIVE LETTER NE"/* 109AA */,/*32815*/"MEROITIC CURSIVE LETTER RA"/* 109AB */, /*32816*/"MEROITIC CURSIVE LETTER LA"/* 109AC */,/*32817*/"MEROITIC CURSIVE LETTER KHA"/* 109AD */, /*32818*/"MEROITIC CURSIVE LETTER HHA"/* 109AE */,/*32819*/"MEROITIC CURSIVE LETTER SA"/* 109AF */, /*32820*/"MEROITIC CURSIVE LETTER ARCHAIC SA"/* 109B0 */,/*32821*/"MEROITIC CURSIVE LETTER SE"/* 109B1 */, /*32822*/"MEROITIC CURSIVE LETTER KA"/* 109B2 */,/*32823*/"MEROITIC CURSIVE LETTER QA"/* 109B3 */, /*32824*/"MEROITIC CURSIVE LETTER TA"/* 109B4 */,/*32825*/"MEROITIC CURSIVE LETTER TE"/* 109B5 */, /*32826*/"MEROITIC CURSIVE LETTER TO"/* 109B6 */,/*32827*/"MEROITIC CURSIVE LETTER DA"/* 109B7 */,NULL,NULL,NULL,NULL, /*32832*/"MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS"/* 109BC */,/*32833*/"MEROITIC CURSIVE FRACTION ONE HALF"/* 109BD */, /*32834*/"MEROITIC CURSIVE LOGOGRAM RMT"/* 109BE */,/*32835*/"MEROITIC CURSIVE LOGOGRAM IMN"/* 109BF */, /*32836*/"MEROITIC CURSIVE NUMBER ONE"/* 109C0 */,/*32837*/"MEROITIC CURSIVE NUMBER TWO"/* 109C1 */, /*32838*/"MEROITIC CURSIVE NUMBER THREE"/* 109C2 */,/*32839*/"MEROITIC CURSIVE NUMBER FOUR"/* 109C3 */, /*32840*/"MEROITIC CURSIVE NUMBER FIVE"/* 109C4 */,/*32841*/"MEROITIC CURSIVE NUMBER SIX"/* 109C5 */, /*32842*/"MEROITIC CURSIVE NUMBER SEVEN"/* 109C6 */,/*32843*/"MEROITIC CURSIVE NUMBER EIGHT"/* 109C7 */, /*32844*/"MEROITIC CURSIVE NUMBER NINE"/* 109C8 */,/*32845*/"MEROITIC CURSIVE NUMBER TEN"/* 109C9 */, /*32846*/"MEROITIC CURSIVE NUMBER TWENTY"/* 109CA */,/*32847*/"MEROITIC CURSIVE NUMBER THIRTY"/* 109CB */, /*32848*/"MEROITIC CURSIVE NUMBER FORTY"/* 109CC */,/*32849*/"MEROITIC CURSIVE NUMBER FIFTY"/* 109CD */, /*32850*/"MEROITIC CURSIVE NUMBER SIXTY"/* 109CE */,/*32851*/"MEROITIC CURSIVE NUMBER SEVENTY"/* 109CF */,NULL,NULL, /*32854*/"MEROITIC CURSIVE NUMBER ONE HUNDRED"/* 109D2 */,/*32855*/"MEROITIC CURSIVE NUMBER TWO HUNDRED"/* 109D3 */, /*32856*/"MEROITIC CURSIVE NUMBER THREE HUNDRED"/* 109D4 */,/*32857*/"MEROITIC CURSIVE NUMBER FOUR HUNDRED"/* 109D5 */, /*32858*/"MEROITIC CURSIVE NUMBER FIVE HUNDRED"/* 109D6 */,/*32859*/"MEROITIC CURSIVE NUMBER SIX HUNDRED"/* 109D7 */, /*32860*/"MEROITIC CURSIVE NUMBER SEVEN HUNDRED"/* 109D8 */,/*32861*/"MEROITIC CURSIVE NUMBER EIGHT HUNDRED"/* 109D9 */, /*32862*/"MEROITIC CURSIVE NUMBER NINE HUNDRED"/* 109DA */,/*32863*/"MEROITIC CURSIVE NUMBER ONE THOUSAND"/* 109DB */, /*32864*/"MEROITIC CURSIVE NUMBER TWO THOUSAND"/* 109DC */,/*32865*/"MEROITIC CURSIVE NUMBER THREE THOUSAND"/* 109DD */, /*32866*/"MEROITIC CURSIVE NUMBER FOUR THOUSAND"/* 109DE */,/*32867*/"MEROITIC CURSIVE NUMBER FIVE THOUSAND"/* 109DF */, /*32868*/"MEROITIC CURSIVE NUMBER SIX THOUSAND"/* 109E0 */,/*32869*/"MEROITIC CURSIVE NUMBER SEVEN THOUSAND"/* 109E1 */, /*32870*/"MEROITIC CURSIVE NUMBER EIGHT THOUSAND"/* 109E2 */,/*32871*/"MEROITIC CURSIVE NUMBER NINE THOUSAND"/* 109E3 */, /*32872*/"MEROITIC CURSIVE NUMBER TEN THOUSAND"/* 109E4 */,/*32873*/"MEROITIC CURSIVE NUMBER TWENTY THOUSAND"/* 109E5 */, /*32874*/"MEROITIC CURSIVE NUMBER THIRTY THOUSAND"/* 109E6 */, /*32875*/"MEROITIC CURSIVE NUMBER FORTY THOUSAND"/* 109E7 */, /*32876*/"MEROITIC CURSIVE NUMBER FIFTY THOUSAND"/* 109E8 */, /*32877*/"MEROITIC CURSIVE NUMBER SIXTY THOUSAND"/* 109E9 */, /*32878*/"MEROITIC CURSIVE NUMBER SEVENTY THOUSAND"/* 109EA */, /*32879*/"MEROITIC CURSIVE NUMBER EIGHTY THOUSAND"/* 109EB */, /*32880*/"MEROITIC CURSIVE NUMBER NINETY THOUSAND"/* 109EC */, /*32881*/"MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND"/* 109ED */, /*32882*/"MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND"/* 109EE */, /*32883*/"MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND"/* 109EF */, /*32884*/"MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND"/* 109F0 */, /*32885*/"MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND"/* 109F1 */, /*32886*/"MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND"/* 109F2 */, /*32887*/"MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND"/* 109F3 */, /*32888*/"MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND"/* 109F4 */, /*32889*/"MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND"/* 109F5 */, /*32890*/"MEROITIC CURSIVE FRACTION ONE TWELFTH"/* 109F6 */,/*32891*/"MEROITIC CURSIVE FRACTION TWO TWELFTHS"/* 109F7 */, /*32892*/"MEROITIC CURSIVE FRACTION THREE TWELFTHS"/* 109F8 */, /*32893*/"MEROITIC CURSIVE FRACTION FOUR TWELFTHS"/* 109F9 */, /*32894*/"MEROITIC CURSIVE FRACTION FIVE TWELFTHS"/* 109FA */, /*32895*/"MEROITIC CURSIVE FRACTION SIX TWELFTHS"/* 109FB */, /*32896*/"MEROITIC CURSIVE FRACTION SEVEN TWELFTHS"/* 109FC */, /*32897*/"MEROITIC CURSIVE FRACTION EIGHT TWELFTHS"/* 109FD */, /*32898*/"MEROITIC CURSIVE FRACTION NINE TWELFTHS"/* 109FE */, /*32899*/"MEROITIC CURSIVE FRACTION TEN TWELFTHS"/* 109FF */,/*32900*/"KHAROSHTHI LETTER A"/* 10A00 */, /*32901*/"KHAROSHTHI VOWEL SIGN I"/* 10A01 */,/*32902*/"KHAROSHTHI VOWEL SIGN U"/* 10A02 */, /*32903*/"KHAROSHTHI VOWEL SIGN VOCALIC R"/* 10A03 */,NULL,/*32905*/"KHAROSHTHI VOWEL SIGN E"/* 10A05 */, /*32906*/"KHAROSHTHI VOWEL SIGN O"/* 10A06 */,NULL,NULL,NULL,NULL,NULL, /*32912*/"KHAROSHTHI VOWEL LENGTH MARK"/* 10A0C */,/*32913*/"KHAROSHTHI SIGN DOUBLE RING BELOW"/* 10A0D */, /*32914*/"KHAROSHTHI SIGN ANUSVARA"/* 10A0E */,/*32915*/"KHAROSHTHI SIGN VISARGA"/* 10A0F */, /*32916*/"KHAROSHTHI LETTER KA"/* 10A10 */,/*32917*/"KHAROSHTHI LETTER KHA"/* 10A11 */, /*32918*/"KHAROSHTHI LETTER GA"/* 10A12 */,/*32919*/"KHAROSHTHI LETTER GHA"/* 10A13 */,NULL, /*32921*/"KHAROSHTHI LETTER CA"/* 10A15 */,/*32922*/"KHAROSHTHI LETTER CHA"/* 10A16 */, /*32923*/"KHAROSHTHI LETTER JA"/* 10A17 */,NULL,/*32925*/"KHAROSHTHI LETTER NYA"/* 10A19 */, /*32926*/"KHAROSHTHI LETTER TTA"/* 10A1A */,/*32927*/"KHAROSHTHI LETTER TTHA"/* 10A1B */, /*32928*/"KHAROSHTHI LETTER DDA"/* 10A1C */,/*32929*/"KHAROSHTHI LETTER DDHA"/* 10A1D */, /*32930*/"KHAROSHTHI LETTER NNA"/* 10A1E */,/*32931*/"KHAROSHTHI LETTER TA"/* 10A1F */, /*32932*/"KHAROSHTHI LETTER THA"/* 10A20 */,/*32933*/"KHAROSHTHI LETTER DA"/* 10A21 */, /*32934*/"KHAROSHTHI LETTER DHA"/* 10A22 */,/*32935*/"KHAROSHTHI LETTER NA"/* 10A23 */, /*32936*/"KHAROSHTHI LETTER PA"/* 10A24 */,/*32937*/"KHAROSHTHI LETTER PHA"/* 10A25 */, /*32938*/"KHAROSHTHI LETTER BA"/* 10A26 */,/*32939*/"KHAROSHTHI LETTER BHA"/* 10A27 */, /*32940*/"KHAROSHTHI LETTER MA"/* 10A28 */,/*32941*/"KHAROSHTHI LETTER YA"/* 10A29 */, /*32942*/"KHAROSHTHI LETTER RA"/* 10A2A */,/*32943*/"KHAROSHTHI LETTER LA"/* 10A2B */, /*32944*/"KHAROSHTHI LETTER VA"/* 10A2C */,/*32945*/"KHAROSHTHI LETTER SHA"/* 10A2D */, /*32946*/"KHAROSHTHI LETTER SSA"/* 10A2E */,/*32947*/"KHAROSHTHI LETTER SA"/* 10A2F */, /*32948*/"KHAROSHTHI LETTER ZA"/* 10A30 */,/*32949*/"KHAROSHTHI LETTER HA"/* 10A31 */, /*32950*/"KHAROSHTHI LETTER KKA"/* 10A32 */,/*32951*/"KHAROSHTHI LETTER TTTHA"/* 10A33 */,NULL,NULL,NULL,NULL, /*32956*/"KHAROSHTHI SIGN BAR ABOVE"/* 10A38 */,/*32957*/"KHAROSHTHI SIGN CAUDA"/* 10A39 */, /*32958*/"KHAROSHTHI SIGN DOT BELOW"/* 10A3A */,NULL,NULL,NULL,NULL,/*32963*/"KHAROSHTHI VIRAMA"/* 10A3F */, /*32964*/"KHAROSHTHI DIGIT ONE"/* 10A40 */,/*32965*/"KHAROSHTHI DIGIT TWO"/* 10A41 */, /*32966*/"KHAROSHTHI DIGIT THREE"/* 10A42 */,/*32967*/"KHAROSHTHI DIGIT FOUR"/* 10A43 */, /*32968*/"KHAROSHTHI NUMBER TEN"/* 10A44 */,/*32969*/"KHAROSHTHI NUMBER TWENTY"/* 10A45 */, /*32970*/"KHAROSHTHI NUMBER ONE HUNDRED"/* 10A46 */,/*32971*/"KHAROSHTHI NUMBER ONE THOUSAND"/* 10A47 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*32980*/"KHAROSHTHI PUNCTUATION DOT"/* 10A50 */, /*32981*/"KHAROSHTHI PUNCTUATION SMALL CIRCLE"/* 10A51 */,/*32982*/"KHAROSHTHI PUNCTUATION CIRCLE"/* 10A52 */, /*32983*/"KHAROSHTHI PUNCTUATION CRESCENT BAR"/* 10A53 */,/*32984*/"KHAROSHTHI PUNCTUATION MANGALAM"/* 10A54 */, /*32985*/"KHAROSHTHI PUNCTUATION LOTUS"/* 10A55 */,/*32986*/"KHAROSHTHI PUNCTUATION DANDA"/* 10A56 */, /*32987*/"KHAROSHTHI PUNCTUATION DOUBLE DANDA"/* 10A57 */,/*32988*/"KHAROSHTHI PUNCTUATION LINES"/* 10A58 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*32996*/"OLD SOUTH ARABIAN LETTER HE"/* 10A60 */, /*32997*/"OLD SOUTH ARABIAN LETTER LAMEDH"/* 10A61 */,/*32998*/"OLD SOUTH ARABIAN LETTER HETH"/* 10A62 */, /*32999*/"OLD SOUTH ARABIAN LETTER MEM"/* 10A63 */,/*33000*/"OLD SOUTH ARABIAN LETTER QOPH"/* 10A64 */, /*33001*/"OLD SOUTH ARABIAN LETTER WAW"/* 10A65 */,/*33002*/"OLD SOUTH ARABIAN LETTER SHIN"/* 10A66 */, /*33003*/"OLD SOUTH ARABIAN LETTER RESH"/* 10A67 */,/*33004*/"OLD SOUTH ARABIAN LETTER BETH"/* 10A68 */, /*33005*/"OLD SOUTH ARABIAN LETTER TAW"/* 10A69 */,/*33006*/"OLD SOUTH ARABIAN LETTER SAT"/* 10A6A */, /*33007*/"OLD SOUTH ARABIAN LETTER KAPH"/* 10A6B */,/*33008*/"OLD SOUTH ARABIAN LETTER NUN"/* 10A6C */, /*33009*/"OLD SOUTH ARABIAN LETTER KHETH"/* 10A6D */,/*33010*/"OLD SOUTH ARABIAN LETTER SADHE"/* 10A6E */, /*33011*/"OLD SOUTH ARABIAN LETTER SAMEKH"/* 10A6F */,/*33012*/"OLD SOUTH ARABIAN LETTER FE"/* 10A70 */, /*33013*/"OLD SOUTH ARABIAN LETTER ALEF"/* 10A71 */,/*33014*/"OLD SOUTH ARABIAN LETTER AYN"/* 10A72 */, /*33015*/"OLD SOUTH ARABIAN LETTER DHADHE"/* 10A73 */,/*33016*/"OLD SOUTH ARABIAN LETTER GIMEL"/* 10A74 */, /*33017*/"OLD SOUTH ARABIAN LETTER DALETH"/* 10A75 */,/*33018*/"OLD SOUTH ARABIAN LETTER GHAYN"/* 10A76 */, /*33019*/"OLD SOUTH ARABIAN LETTER TETH"/* 10A77 */,/*33020*/"OLD SOUTH ARABIAN LETTER ZAYN"/* 10A78 */, /*33021*/"OLD SOUTH ARABIAN LETTER DHALETH"/* 10A79 */,/*33022*/"OLD SOUTH ARABIAN LETTER YODH"/* 10A7A */, /*33023*/"OLD SOUTH ARABIAN LETTER THAW"/* 10A7B */,/*33024*/"OLD SOUTH ARABIAN LETTER THETH"/* 10A7C */, /*33025*/"OLD SOUTH ARABIAN NUMBER ONE"/* 10A7D */,/*33026*/"OLD SOUTH ARABIAN NUMBER FIFTY"/* 10A7E */, /*33027*/"OLD SOUTH ARABIAN NUMERIC INDICATOR"/* 10A7F */,/*33028*/"OLD NORTH ARABIAN LETTER HEH"/* 10A80 */, /*33029*/"OLD NORTH ARABIAN LETTER LAM"/* 10A81 */,/*33030*/"OLD NORTH ARABIAN LETTER HAH"/* 10A82 */, /*33031*/"OLD NORTH ARABIAN LETTER MEEM"/* 10A83 */,/*33032*/"OLD NORTH ARABIAN LETTER QAF"/* 10A84 */, /*33033*/"OLD NORTH ARABIAN LETTER WAW"/* 10A85 */,/*33034*/"OLD NORTH ARABIAN LETTER ES-2"/* 10A86 */, /*33035*/"OLD NORTH ARABIAN LETTER REH"/* 10A87 */,/*33036*/"OLD NORTH ARABIAN LETTER BEH"/* 10A88 */, /*33037*/"OLD NORTH ARABIAN LETTER TEH"/* 10A89 */,/*33038*/"OLD NORTH ARABIAN LETTER ES-1"/* 10A8A */, /*33039*/"OLD NORTH ARABIAN LETTER KAF"/* 10A8B */,/*33040*/"OLD NORTH ARABIAN LETTER NOON"/* 10A8C */, /*33041*/"OLD NORTH ARABIAN LETTER KHAH"/* 10A8D */,/*33042*/"OLD NORTH ARABIAN LETTER SAD"/* 10A8E */, /*33043*/"OLD NORTH ARABIAN LETTER ES-3"/* 10A8F */,/*33044*/"OLD NORTH ARABIAN LETTER FEH"/* 10A90 */, /*33045*/"OLD NORTH ARABIAN LETTER ALEF"/* 10A91 */,/*33046*/"OLD NORTH ARABIAN LETTER AIN"/* 10A92 */, /*33047*/"OLD NORTH ARABIAN LETTER DAD"/* 10A93 */,/*33048*/"OLD NORTH ARABIAN LETTER GEEM"/* 10A94 */, /*33049*/"OLD NORTH ARABIAN LETTER DAL"/* 10A95 */,/*33050*/"OLD NORTH ARABIAN LETTER GHAIN"/* 10A96 */, /*33051*/"OLD NORTH ARABIAN LETTER TAH"/* 10A97 */,/*33052*/"OLD NORTH ARABIAN LETTER ZAIN"/* 10A98 */, /*33053*/"OLD NORTH ARABIAN LETTER THAL"/* 10A99 */,/*33054*/"OLD NORTH ARABIAN LETTER YEH"/* 10A9A */, /*33055*/"OLD NORTH ARABIAN LETTER THEH"/* 10A9B */,/*33056*/"OLD NORTH ARABIAN LETTER ZAH"/* 10A9C */, /*33057*/"OLD NORTH ARABIAN NUMBER ONE"/* 10A9D */,/*33058*/"OLD NORTH ARABIAN NUMBER TEN"/* 10A9E */, /*33059*/"OLD NORTH ARABIAN NUMBER TWENTY"/* 10A9F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*33092*/"MANICHAEAN LETTER ALEPH"/* 10AC0 */,/*33093*/"MANICHAEAN LETTER BETH"/* 10AC1 */, /*33094*/"MANICHAEAN LETTER BHETH"/* 10AC2 */,/*33095*/"MANICHAEAN LETTER GIMEL"/* 10AC3 */, /*33096*/"MANICHAEAN LETTER GHIMEL"/* 10AC4 */,/*33097*/"MANICHAEAN LETTER DALETH"/* 10AC5 */, /*33098*/"MANICHAEAN LETTER HE"/* 10AC6 */,/*33099*/"MANICHAEAN LETTER WAW"/* 10AC7 */, /*33100*/"MANICHAEAN SIGN UD"/* 10AC8 */,/*33101*/"MANICHAEAN LETTER ZAYIN"/* 10AC9 */, /*33102*/"MANICHAEAN LETTER ZHAYIN"/* 10ACA */,/*33103*/"MANICHAEAN LETTER JAYIN"/* 10ACB */, /*33104*/"MANICHAEAN LETTER JHAYIN"/* 10ACC */,/*33105*/"MANICHAEAN LETTER HETH"/* 10ACD */, /*33106*/"MANICHAEAN LETTER TETH"/* 10ACE */,/*33107*/"MANICHAEAN LETTER YODH"/* 10ACF */, /*33108*/"MANICHAEAN LETTER KAPH"/* 10AD0 */,/*33109*/"MANICHAEAN LETTER XAPH"/* 10AD1 */, /*33110*/"MANICHAEAN LETTER KHAPH"/* 10AD2 */,/*33111*/"MANICHAEAN LETTER LAMEDH"/* 10AD3 */, /*33112*/"MANICHAEAN LETTER DHAMEDH"/* 10AD4 */,/*33113*/"MANICHAEAN LETTER THAMEDH"/* 10AD5 */, /*33114*/"MANICHAEAN LETTER MEM"/* 10AD6 */,/*33115*/"MANICHAEAN LETTER NUN"/* 10AD7 */, /*33116*/"MANICHAEAN LETTER SAMEKH"/* 10AD8 */,/*33117*/"MANICHAEAN LETTER AYIN"/* 10AD9 */, /*33118*/"MANICHAEAN LETTER AAYIN"/* 10ADA */,/*33119*/"MANICHAEAN LETTER PE"/* 10ADB */, /*33120*/"MANICHAEAN LETTER FE"/* 10ADC */,/*33121*/"MANICHAEAN LETTER SADHE"/* 10ADD */, /*33122*/"MANICHAEAN LETTER QOPH"/* 10ADE */,/*33123*/"MANICHAEAN LETTER XOPH"/* 10ADF */, /*33124*/"MANICHAEAN LETTER QHOPH"/* 10AE0 */,/*33125*/"MANICHAEAN LETTER RESH"/* 10AE1 */, /*33126*/"MANICHAEAN LETTER SHIN"/* 10AE2 */,/*33127*/"MANICHAEAN LETTER SSHIN"/* 10AE3 */, /*33128*/"MANICHAEAN LETTER TAW"/* 10AE4 */,/*33129*/"MANICHAEAN ABBREVIATION MARK ABOVE"/* 10AE5 */, /*33130*/"MANICHAEAN ABBREVIATION MARK BELOW"/* 10AE6 */,NULL,NULL,NULL,NULL,/*33135*/"MANICHAEAN NUMBER ONE"/* 10AEB */, /*33136*/"MANICHAEAN NUMBER FIVE"/* 10AEC */,/*33137*/"MANICHAEAN NUMBER TEN"/* 10AED */, /*33138*/"MANICHAEAN NUMBER TWENTY"/* 10AEE */,/*33139*/"MANICHAEAN NUMBER ONE HUNDRED"/* 10AEF */, /*33140*/"MANICHAEAN PUNCTUATION STAR"/* 10AF0 */,/*33141*/"MANICHAEAN PUNCTUATION FLEURON"/* 10AF1 */, /*33142*/"MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT"/* 10AF2 */, /*33143*/"MANICHAEAN PUNCTUATION DOT WITHIN DOT"/* 10AF3 */,/*33144*/"MANICHAEAN PUNCTUATION DOT"/* 10AF4 */, /*33145*/"MANICHAEAN PUNCTUATION TWO DOTS"/* 10AF5 */,/*33146*/"MANICHAEAN PUNCTUATION LINE FILLER"/* 10AF6 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33156*/"AVESTAN LETTER A"/* 10B00 */,/*33157*/"AVESTAN LETTER AA"/* 10B01 */, /*33158*/"AVESTAN LETTER AO"/* 10B02 */,/*33159*/"AVESTAN LETTER AAO"/* 10B03 */,/*33160*/"AVESTAN LETTER AN"/* 10B04 */, /*33161*/"AVESTAN LETTER AAN"/* 10B05 */,/*33162*/"AVESTAN LETTER AE"/* 10B06 */, /*33163*/"AVESTAN LETTER AEE"/* 10B07 */,/*33164*/"AVESTAN LETTER E"/* 10B08 */,/*33165*/"AVESTAN LETTER EE"/* 10B09 */, /*33166*/"AVESTAN LETTER O"/* 10B0A */,/*33167*/"AVESTAN LETTER OO"/* 10B0B */,/*33168*/"AVESTAN LETTER I"/* 10B0C */, /*33169*/"AVESTAN LETTER II"/* 10B0D */,/*33170*/"AVESTAN LETTER U"/* 10B0E */,/*33171*/"AVESTAN LETTER UU"/* 10B0F */, /*33172*/"AVESTAN LETTER KE"/* 10B10 */,/*33173*/"AVESTAN LETTER XE"/* 10B11 */,/*33174*/"AVESTAN LETTER XYE"/* 10B12 */, /*33175*/"AVESTAN LETTER XVE"/* 10B13 */,/*33176*/"AVESTAN LETTER GE"/* 10B14 */, /*33177*/"AVESTAN LETTER GGE"/* 10B15 */,/*33178*/"AVESTAN LETTER GHE"/* 10B16 */, /*33179*/"AVESTAN LETTER CE"/* 10B17 */,/*33180*/"AVESTAN LETTER JE"/* 10B18 */,/*33181*/"AVESTAN LETTER TE"/* 10B19 */, /*33182*/"AVESTAN LETTER THE"/* 10B1A */,/*33183*/"AVESTAN LETTER DE"/* 10B1B */, /*33184*/"AVESTAN LETTER DHE"/* 10B1C */,/*33185*/"AVESTAN LETTER TTE"/* 10B1D */, /*33186*/"AVESTAN LETTER PE"/* 10B1E */,/*33187*/"AVESTAN LETTER FE"/* 10B1F */,/*33188*/"AVESTAN LETTER BE"/* 10B20 */, /*33189*/"AVESTAN LETTER BHE"/* 10B21 */,/*33190*/"AVESTAN LETTER NGE"/* 10B22 */, /*33191*/"AVESTAN LETTER NGYE"/* 10B23 */,/*33192*/"AVESTAN LETTER NGVE"/* 10B24 */, /*33193*/"AVESTAN LETTER NE"/* 10B25 */,/*33194*/"AVESTAN LETTER NYE"/* 10B26 */, /*33195*/"AVESTAN LETTER NNE"/* 10B27 */,/*33196*/"AVESTAN LETTER ME"/* 10B28 */, /*33197*/"AVESTAN LETTER HME"/* 10B29 */,/*33198*/"AVESTAN LETTER YYE"/* 10B2A */, /*33199*/"AVESTAN LETTER YE"/* 10B2B */,/*33200*/"AVESTAN LETTER VE"/* 10B2C */,/*33201*/"AVESTAN LETTER RE"/* 10B2D */, /*33202*/"AVESTAN LETTER LE"/* 10B2E */,/*33203*/"AVESTAN LETTER SE"/* 10B2F */,/*33204*/"AVESTAN LETTER ZE"/* 10B30 */, /*33205*/"AVESTAN LETTER SHE"/* 10B31 */,/*33206*/"AVESTAN LETTER ZHE"/* 10B32 */, /*33207*/"AVESTAN LETTER SHYE"/* 10B33 */,/*33208*/"AVESTAN LETTER SSHE"/* 10B34 */, /*33209*/"AVESTAN LETTER HE"/* 10B35 */,NULL,NULL,NULL,/*33213*/"AVESTAN ABBREVIATION MARK"/* 10B39 */, /*33214*/"TINY TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3A */, /*33215*/"SMALL TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3B */, /*33216*/"LARGE TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3C */, /*33217*/"LARGE ONE DOT OVER TWO DOTS PUNCTUATION"/* 10B3D */, /*33218*/"LARGE TWO RINGS OVER ONE RING PUNCTUATION"/* 10B3E */, /*33219*/"LARGE ONE RING OVER TWO RINGS PUNCTUATION"/* 10B3F */, /*33220*/"INSCRIPTIONAL PARTHIAN LETTER ALEPH"/* 10B40 */,/*33221*/"INSCRIPTIONAL PARTHIAN LETTER BETH"/* 10B41 */, /*33222*/"INSCRIPTIONAL PARTHIAN LETTER GIMEL"/* 10B42 */,/*33223*/"INSCRIPTIONAL PARTHIAN LETTER DALETH"/* 10B43 */, /*33224*/"INSCRIPTIONAL PARTHIAN LETTER HE"/* 10B44 */,/*33225*/"INSCRIPTIONAL PARTHIAN LETTER WAW"/* 10B45 */, /*33226*/"INSCRIPTIONAL PARTHIAN LETTER ZAYIN"/* 10B46 */,/*33227*/"INSCRIPTIONAL PARTHIAN LETTER HETH"/* 10B47 */, /*33228*/"INSCRIPTIONAL PARTHIAN LETTER TETH"/* 10B48 */,/*33229*/"INSCRIPTIONAL PARTHIAN LETTER YODH"/* 10B49 */, /*33230*/"INSCRIPTIONAL PARTHIAN LETTER KAPH"/* 10B4A */,/*33231*/"INSCRIPTIONAL PARTHIAN LETTER LAMEDH"/* 10B4B */, /*33232*/"INSCRIPTIONAL PARTHIAN LETTER MEM"/* 10B4C */,/*33233*/"INSCRIPTIONAL PARTHIAN LETTER NUN"/* 10B4D */, /*33234*/"INSCRIPTIONAL PARTHIAN LETTER SAMEKH"/* 10B4E */,/*33235*/"INSCRIPTIONAL PARTHIAN LETTER AYIN"/* 10B4F */, /*33236*/"INSCRIPTIONAL PARTHIAN LETTER PE"/* 10B50 */,/*33237*/"INSCRIPTIONAL PARTHIAN LETTER SADHE"/* 10B51 */, /*33238*/"INSCRIPTIONAL PARTHIAN LETTER QOPH"/* 10B52 */,/*33239*/"INSCRIPTIONAL PARTHIAN LETTER RESH"/* 10B53 */, /*33240*/"INSCRIPTIONAL PARTHIAN LETTER SHIN"/* 10B54 */,/*33241*/"INSCRIPTIONAL PARTHIAN LETTER TAW"/* 10B55 */,NULL, NULL,/*33244*/"INSCRIPTIONAL PARTHIAN NUMBER ONE"/* 10B58 */,/*33245*/"INSCRIPTIONAL PARTHIAN NUMBER TWO"/* 10B59 */, /*33246*/"INSCRIPTIONAL PARTHIAN NUMBER THREE"/* 10B5A */,/*33247*/"INSCRIPTIONAL PARTHIAN NUMBER FOUR"/* 10B5B */, /*33248*/"INSCRIPTIONAL PARTHIAN NUMBER TEN"/* 10B5C */,/*33249*/"INSCRIPTIONAL PARTHIAN NUMBER TWENTY"/* 10B5D */, /*33250*/"INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED"/* 10B5E */, /*33251*/"INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND"/* 10B5F */, /*33252*/"INSCRIPTIONAL PAHLAVI LETTER ALEPH"/* 10B60 */,/*33253*/"INSCRIPTIONAL PAHLAVI LETTER BETH"/* 10B61 */, /*33254*/"INSCRIPTIONAL PAHLAVI LETTER GIMEL"/* 10B62 */,/*33255*/"INSCRIPTIONAL PAHLAVI LETTER DALETH"/* 10B63 */, /*33256*/"INSCRIPTIONAL PAHLAVI LETTER HE"/* 10B64 */,/*33257*/"INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH"/* 10B65 */, /*33258*/"INSCRIPTIONAL PAHLAVI LETTER ZAYIN"/* 10B66 */,/*33259*/"INSCRIPTIONAL PAHLAVI LETTER HETH"/* 10B67 */, /*33260*/"INSCRIPTIONAL PAHLAVI LETTER TETH"/* 10B68 */,/*33261*/"INSCRIPTIONAL PAHLAVI LETTER YODH"/* 10B69 */, /*33262*/"INSCRIPTIONAL PAHLAVI LETTER KAPH"/* 10B6A */,/*33263*/"INSCRIPTIONAL PAHLAVI LETTER LAMEDH"/* 10B6B */, /*33264*/"INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH"/* 10B6C */,/*33265*/"INSCRIPTIONAL PAHLAVI LETTER NUN"/* 10B6D */, /*33266*/"INSCRIPTIONAL PAHLAVI LETTER SAMEKH"/* 10B6E */,/*33267*/"INSCRIPTIONAL PAHLAVI LETTER PE"/* 10B6F */, /*33268*/"INSCRIPTIONAL PAHLAVI LETTER SADHE"/* 10B70 */,/*33269*/"INSCRIPTIONAL PAHLAVI LETTER SHIN"/* 10B71 */, /*33270*/"INSCRIPTIONAL PAHLAVI LETTER TAW"/* 10B72 */,NULL,NULL,NULL,NULL,NULL, /*33276*/"INSCRIPTIONAL PAHLAVI NUMBER ONE"/* 10B78 */,/*33277*/"INSCRIPTIONAL PAHLAVI NUMBER TWO"/* 10B79 */, /*33278*/"INSCRIPTIONAL PAHLAVI NUMBER THREE"/* 10B7A */,/*33279*/"INSCRIPTIONAL PAHLAVI NUMBER FOUR"/* 10B7B */, /*33280*/"INSCRIPTIONAL PAHLAVI NUMBER TEN"/* 10B7C */,/*33281*/"INSCRIPTIONAL PAHLAVI NUMBER TWENTY"/* 10B7D */, /*33282*/"INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED"/* 10B7E */, /*33283*/"INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND"/* 10B7F */,/*33284*/"PSALTER PAHLAVI LETTER ALEPH"/* 10B80 */, /*33285*/"PSALTER PAHLAVI LETTER BETH"/* 10B81 */,/*33286*/"PSALTER PAHLAVI LETTER GIMEL"/* 10B82 */, /*33287*/"PSALTER PAHLAVI LETTER DALETH"/* 10B83 */,/*33288*/"PSALTER PAHLAVI LETTER HE"/* 10B84 */, /*33289*/"PSALTER PAHLAVI LETTER WAW-AYIN-RESH"/* 10B85 */,/*33290*/"PSALTER PAHLAVI LETTER ZAYIN"/* 10B86 */, /*33291*/"PSALTER PAHLAVI LETTER HETH"/* 10B87 */,/*33292*/"PSALTER PAHLAVI LETTER YODH"/* 10B88 */, /*33293*/"PSALTER PAHLAVI LETTER KAPH"/* 10B89 */,/*33294*/"PSALTER PAHLAVI LETTER LAMEDH"/* 10B8A */, /*33295*/"PSALTER PAHLAVI LETTER MEM-QOPH"/* 10B8B */,/*33296*/"PSALTER PAHLAVI LETTER NUN"/* 10B8C */, /*33297*/"PSALTER PAHLAVI LETTER SAMEKH"/* 10B8D */,/*33298*/"PSALTER PAHLAVI LETTER PE"/* 10B8E */, /*33299*/"PSALTER PAHLAVI LETTER SADHE"/* 10B8F */,/*33300*/"PSALTER PAHLAVI LETTER SHIN"/* 10B90 */, /*33301*/"PSALTER PAHLAVI LETTER TAW"/* 10B91 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*33309*/"PSALTER PAHLAVI SECTION MARK"/* 10B99 */,/*33310*/"PSALTER PAHLAVI TURNED SECTION MARK"/* 10B9A */, /*33311*/"PSALTER PAHLAVI FOUR DOTS WITH CROSS"/* 10B9B */,/*33312*/"PSALTER PAHLAVI FOUR DOTS WITH DOT"/* 10B9C */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33325*/"PSALTER PAHLAVI NUMBER ONE"/* 10BA9 */, /*33326*/"PSALTER PAHLAVI NUMBER TWO"/* 10BAA */,/*33327*/"PSALTER PAHLAVI NUMBER THREE"/* 10BAB */, /*33328*/"PSALTER PAHLAVI NUMBER FOUR"/* 10BAC */,/*33329*/"PSALTER PAHLAVI NUMBER TEN"/* 10BAD */, /*33330*/"PSALTER PAHLAVI NUMBER TWENTY"/* 10BAE */,/*33331*/"PSALTER PAHLAVI NUMBER ONE HUNDRED"/* 10BAF */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*33412*/"OLD TURKIC LETTER ORKHON A"/* 10C00 */, /*33413*/"OLD TURKIC LETTER YENISEI A"/* 10C01 */,/*33414*/"OLD TURKIC LETTER YENISEI AE"/* 10C02 */, /*33415*/"OLD TURKIC LETTER ORKHON I"/* 10C03 */,/*33416*/"OLD TURKIC LETTER YENISEI I"/* 10C04 */, /*33417*/"OLD TURKIC LETTER YENISEI E"/* 10C05 */,/*33418*/"OLD TURKIC LETTER ORKHON O"/* 10C06 */, /*33419*/"OLD TURKIC LETTER ORKHON OE"/* 10C07 */,/*33420*/"OLD TURKIC LETTER YENISEI OE"/* 10C08 */, /*33421*/"OLD TURKIC LETTER ORKHON AB"/* 10C09 */,/*33422*/"OLD TURKIC LETTER YENISEI AB"/* 10C0A */, /*33423*/"OLD TURKIC LETTER ORKHON AEB"/* 10C0B */,/*33424*/"OLD TURKIC LETTER YENISEI AEB"/* 10C0C */, /*33425*/"OLD TURKIC LETTER ORKHON AG"/* 10C0D */,/*33426*/"OLD TURKIC LETTER YENISEI AG"/* 10C0E */, /*33427*/"OLD TURKIC LETTER ORKHON AEG"/* 10C0F */,/*33428*/"OLD TURKIC LETTER YENISEI AEG"/* 10C10 */, /*33429*/"OLD TURKIC LETTER ORKHON AD"/* 10C11 */,/*33430*/"OLD TURKIC LETTER YENISEI AD"/* 10C12 */, /*33431*/"OLD TURKIC LETTER ORKHON AED"/* 10C13 */,/*33432*/"OLD TURKIC LETTER ORKHON EZ"/* 10C14 */, /*33433*/"OLD TURKIC LETTER YENISEI EZ"/* 10C15 */,/*33434*/"OLD TURKIC LETTER ORKHON AY"/* 10C16 */, /*33435*/"OLD TURKIC LETTER YENISEI AY"/* 10C17 */,/*33436*/"OLD TURKIC LETTER ORKHON AEY"/* 10C18 */, /*33437*/"OLD TURKIC LETTER YENISEI AEY"/* 10C19 */,/*33438*/"OLD TURKIC LETTER ORKHON AEK"/* 10C1A */, /*33439*/"OLD TURKIC LETTER YENISEI AEK"/* 10C1B */,/*33440*/"OLD TURKIC LETTER ORKHON OEK"/* 10C1C */, /*33441*/"OLD TURKIC LETTER YENISEI OEK"/* 10C1D */,/*33442*/"OLD TURKIC LETTER ORKHON AL"/* 10C1E */, /*33443*/"OLD TURKIC LETTER YENISEI AL"/* 10C1F */,/*33444*/"OLD TURKIC LETTER ORKHON AEL"/* 10C20 */, /*33445*/"OLD TURKIC LETTER ORKHON ELT"/* 10C21 */,/*33446*/"OLD TURKIC LETTER ORKHON EM"/* 10C22 */, /*33447*/"OLD TURKIC LETTER ORKHON AN"/* 10C23 */,/*33448*/"OLD TURKIC LETTER ORKHON AEN"/* 10C24 */, /*33449*/"OLD TURKIC LETTER YENISEI AEN"/* 10C25 */,/*33450*/"OLD TURKIC LETTER ORKHON ENT"/* 10C26 */, /*33451*/"OLD TURKIC LETTER YENISEI ENT"/* 10C27 */,/*33452*/"OLD TURKIC LETTER ORKHON ENC"/* 10C28 */, /*33453*/"OLD TURKIC LETTER YENISEI ENC"/* 10C29 */,/*33454*/"OLD TURKIC LETTER ORKHON ENY"/* 10C2A */, /*33455*/"OLD TURKIC LETTER YENISEI ENY"/* 10C2B */,/*33456*/"OLD TURKIC LETTER YENISEI ANG"/* 10C2C */, /*33457*/"OLD TURKIC LETTER ORKHON ENG"/* 10C2D */,/*33458*/"OLD TURKIC LETTER YENISEI AENG"/* 10C2E */, /*33459*/"OLD TURKIC LETTER ORKHON EP"/* 10C2F */,/*33460*/"OLD TURKIC LETTER ORKHON OP"/* 10C30 */, /*33461*/"OLD TURKIC LETTER ORKHON IC"/* 10C31 */,/*33462*/"OLD TURKIC LETTER ORKHON EC"/* 10C32 */, /*33463*/"OLD TURKIC LETTER YENISEI EC"/* 10C33 */,/*33464*/"OLD TURKIC LETTER ORKHON AQ"/* 10C34 */, /*33465*/"OLD TURKIC LETTER YENISEI AQ"/* 10C35 */,/*33466*/"OLD TURKIC LETTER ORKHON IQ"/* 10C36 */, /*33467*/"OLD TURKIC LETTER YENISEI IQ"/* 10C37 */,/*33468*/"OLD TURKIC LETTER ORKHON OQ"/* 10C38 */, /*33469*/"OLD TURKIC LETTER YENISEI OQ"/* 10C39 */,/*33470*/"OLD TURKIC LETTER ORKHON AR"/* 10C3A */, /*33471*/"OLD TURKIC LETTER YENISEI AR"/* 10C3B */,/*33472*/"OLD TURKIC LETTER ORKHON AER"/* 10C3C */, /*33473*/"OLD TURKIC LETTER ORKHON AS"/* 10C3D */,/*33474*/"OLD TURKIC LETTER ORKHON AES"/* 10C3E */, /*33475*/"OLD TURKIC LETTER ORKHON ASH"/* 10C3F */,/*33476*/"OLD TURKIC LETTER YENISEI ASH"/* 10C40 */, /*33477*/"OLD TURKIC LETTER ORKHON ESH"/* 10C41 */,/*33478*/"OLD TURKIC LETTER YENISEI ESH"/* 10C42 */, /*33479*/"OLD TURKIC LETTER ORKHON AT"/* 10C43 */,/*33480*/"OLD TURKIC LETTER YENISEI AT"/* 10C44 */, /*33481*/"OLD TURKIC LETTER ORKHON AET"/* 10C45 */,/*33482*/"OLD TURKIC LETTER YENISEI AET"/* 10C46 */, /*33483*/"OLD TURKIC LETTER ORKHON OT"/* 10C47 */,/*33484*/"OLD TURKIC LETTER ORKHON BASH"/* 10C48 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*33540*/"OLD HUNGARIAN CAPITAL LETTER A"/* 10C80 */, /*33541*/"OLD HUNGARIAN CAPITAL LETTER AA"/* 10C81 */,/*33542*/"OLD HUNGARIAN CAPITAL LETTER EB"/* 10C82 */, /*33543*/"OLD HUNGARIAN CAPITAL LETTER AMB"/* 10C83 */,/*33544*/"OLD HUNGARIAN CAPITAL LETTER EC"/* 10C84 */, /*33545*/"OLD HUNGARIAN CAPITAL LETTER ENC"/* 10C85 */,/*33546*/"OLD HUNGARIAN CAPITAL LETTER ECS"/* 10C86 */, /*33547*/"OLD HUNGARIAN CAPITAL LETTER ED"/* 10C87 */,/*33548*/"OLD HUNGARIAN CAPITAL LETTER AND"/* 10C88 */, /*33549*/"OLD HUNGARIAN CAPITAL LETTER E"/* 10C89 */,/*33550*/"OLD HUNGARIAN CAPITAL LETTER CLOSE E"/* 10C8A */, /*33551*/"OLD HUNGARIAN CAPITAL LETTER EE"/* 10C8B */,/*33552*/"OLD HUNGARIAN CAPITAL LETTER EF"/* 10C8C */, /*33553*/"OLD HUNGARIAN CAPITAL LETTER EG"/* 10C8D */,/*33554*/"OLD HUNGARIAN CAPITAL LETTER EGY"/* 10C8E */, /*33555*/"OLD HUNGARIAN CAPITAL LETTER EH"/* 10C8F */,/*33556*/"OLD HUNGARIAN CAPITAL LETTER I"/* 10C90 */, /*33557*/"OLD HUNGARIAN CAPITAL LETTER II"/* 10C91 */,/*33558*/"OLD HUNGARIAN CAPITAL LETTER EJ"/* 10C92 */, /*33559*/"OLD HUNGARIAN CAPITAL LETTER EK"/* 10C93 */,/*33560*/"OLD HUNGARIAN CAPITAL LETTER AK"/* 10C94 */, /*33561*/"OLD HUNGARIAN CAPITAL LETTER UNK"/* 10C95 */,/*33562*/"OLD HUNGARIAN CAPITAL LETTER EL"/* 10C96 */, /*33563*/"OLD HUNGARIAN CAPITAL LETTER ELY"/* 10C97 */,/*33564*/"OLD HUNGARIAN CAPITAL LETTER EM"/* 10C98 */, /*33565*/"OLD HUNGARIAN CAPITAL LETTER EN"/* 10C99 */,/*33566*/"OLD HUNGARIAN CAPITAL LETTER ENY"/* 10C9A */, /*33567*/"OLD HUNGARIAN CAPITAL LETTER O"/* 10C9B */,/*33568*/"OLD HUNGARIAN CAPITAL LETTER OO"/* 10C9C */, /*33569*/"OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE"/* 10C9D */, /*33570*/"OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE"/* 10C9E */,/*33571*/"OLD HUNGARIAN CAPITAL LETTER OEE"/* 10C9F */, /*33572*/"OLD HUNGARIAN CAPITAL LETTER EP"/* 10CA0 */,/*33573*/"OLD HUNGARIAN CAPITAL LETTER EMP"/* 10CA1 */, /*33574*/"OLD HUNGARIAN CAPITAL LETTER ER"/* 10CA2 */,/*33575*/"OLD HUNGARIAN CAPITAL LETTER SHORT ER"/* 10CA3 */, /*33576*/"OLD HUNGARIAN CAPITAL LETTER ES"/* 10CA4 */,/*33577*/"OLD HUNGARIAN CAPITAL LETTER ESZ"/* 10CA5 */, /*33578*/"OLD HUNGARIAN CAPITAL LETTER ET"/* 10CA6 */,/*33579*/"OLD HUNGARIAN CAPITAL LETTER ENT"/* 10CA7 */, /*33580*/"OLD HUNGARIAN CAPITAL LETTER ETY"/* 10CA8 */,/*33581*/"OLD HUNGARIAN CAPITAL LETTER ECH"/* 10CA9 */, /*33582*/"OLD HUNGARIAN CAPITAL LETTER U"/* 10CAA */,/*33583*/"OLD HUNGARIAN CAPITAL LETTER UU"/* 10CAB */, /*33584*/"OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE"/* 10CAC */, /*33585*/"OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE"/* 10CAD */,/*33586*/"OLD HUNGARIAN CAPITAL LETTER EV"/* 10CAE */, /*33587*/"OLD HUNGARIAN CAPITAL LETTER EZ"/* 10CAF */,/*33588*/"OLD HUNGARIAN CAPITAL LETTER EZS"/* 10CB0 */, /*33589*/"OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN"/* 10CB1 */,/*33590*/"OLD HUNGARIAN CAPITAL LETTER US"/* 10CB2 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33604*/"OLD HUNGARIAN SMALL LETTER A"/* 10CC0 */, /*33605*/"OLD HUNGARIAN SMALL LETTER AA"/* 10CC1 */,/*33606*/"OLD HUNGARIAN SMALL LETTER EB"/* 10CC2 */, /*33607*/"OLD HUNGARIAN SMALL LETTER AMB"/* 10CC3 */,/*33608*/"OLD HUNGARIAN SMALL LETTER EC"/* 10CC4 */, /*33609*/"OLD HUNGARIAN SMALL LETTER ENC"/* 10CC5 */,/*33610*/"OLD HUNGARIAN SMALL LETTER ECS"/* 10CC6 */, /*33611*/"OLD HUNGARIAN SMALL LETTER ED"/* 10CC7 */,/*33612*/"OLD HUNGARIAN SMALL LETTER AND"/* 10CC8 */, /*33613*/"OLD HUNGARIAN SMALL LETTER E"/* 10CC9 */,/*33614*/"OLD HUNGARIAN SMALL LETTER CLOSE E"/* 10CCA */, /*33615*/"OLD HUNGARIAN SMALL LETTER EE"/* 10CCB */,/*33616*/"OLD HUNGARIAN SMALL LETTER EF"/* 10CCC */, /*33617*/"OLD HUNGARIAN SMALL LETTER EG"/* 10CCD */,/*33618*/"OLD HUNGARIAN SMALL LETTER EGY"/* 10CCE */, /*33619*/"OLD HUNGARIAN SMALL LETTER EH"/* 10CCF */,/*33620*/"OLD HUNGARIAN SMALL LETTER I"/* 10CD0 */, /*33621*/"OLD HUNGARIAN SMALL LETTER II"/* 10CD1 */,/*33622*/"OLD HUNGARIAN SMALL LETTER EJ"/* 10CD2 */, /*33623*/"OLD HUNGARIAN SMALL LETTER EK"/* 10CD3 */,/*33624*/"OLD HUNGARIAN SMALL LETTER AK"/* 10CD4 */, /*33625*/"OLD HUNGARIAN SMALL LETTER UNK"/* 10CD5 */,/*33626*/"OLD HUNGARIAN SMALL LETTER EL"/* 10CD6 */, /*33627*/"OLD HUNGARIAN SMALL LETTER ELY"/* 10CD7 */,/*33628*/"OLD HUNGARIAN SMALL LETTER EM"/* 10CD8 */, /*33629*/"OLD HUNGARIAN SMALL LETTER EN"/* 10CD9 */,/*33630*/"OLD HUNGARIAN SMALL LETTER ENY"/* 10CDA */, /*33631*/"OLD HUNGARIAN SMALL LETTER O"/* 10CDB */,/*33632*/"OLD HUNGARIAN SMALL LETTER OO"/* 10CDC */, /*33633*/"OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE"/* 10CDD */, /*33634*/"OLD HUNGARIAN SMALL LETTER RUDIMENTA OE"/* 10CDE */,/*33635*/"OLD HUNGARIAN SMALL LETTER OEE"/* 10CDF */, /*33636*/"OLD HUNGARIAN SMALL LETTER EP"/* 10CE0 */,/*33637*/"OLD HUNGARIAN SMALL LETTER EMP"/* 10CE1 */, /*33638*/"OLD HUNGARIAN SMALL LETTER ER"/* 10CE2 */,/*33639*/"OLD HUNGARIAN SMALL LETTER SHORT ER"/* 10CE3 */, /*33640*/"OLD HUNGARIAN SMALL LETTER ES"/* 10CE4 */,/*33641*/"OLD HUNGARIAN SMALL LETTER ESZ"/* 10CE5 */, /*33642*/"OLD HUNGARIAN SMALL LETTER ET"/* 10CE6 */,/*33643*/"OLD HUNGARIAN SMALL LETTER ENT"/* 10CE7 */, /*33644*/"OLD HUNGARIAN SMALL LETTER ETY"/* 10CE8 */,/*33645*/"OLD HUNGARIAN SMALL LETTER ECH"/* 10CE9 */, /*33646*/"OLD HUNGARIAN SMALL LETTER U"/* 10CEA */,/*33647*/"OLD HUNGARIAN SMALL LETTER UU"/* 10CEB */, /*33648*/"OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE"/* 10CEC */, /*33649*/"OLD HUNGARIAN SMALL LETTER RUDIMENTA UE"/* 10CED */,/*33650*/"OLD HUNGARIAN SMALL LETTER EV"/* 10CEE */, /*33651*/"OLD HUNGARIAN SMALL LETTER EZ"/* 10CEF */,/*33652*/"OLD HUNGARIAN SMALL LETTER EZS"/* 10CF0 */, /*33653*/"OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN"/* 10CF1 */,/*33654*/"OLD HUNGARIAN SMALL LETTER US"/* 10CF2 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33662*/"OLD HUNGARIAN NUMBER ONE"/* 10CFA */, /*33663*/"OLD HUNGARIAN NUMBER FIVE"/* 10CFB */,/*33664*/"OLD HUNGARIAN NUMBER TEN"/* 10CFC */, /*33665*/"OLD HUNGARIAN NUMBER FIFTY"/* 10CFD */,/*33666*/"OLD HUNGARIAN NUMBER ONE HUNDRED"/* 10CFE */, /*33667*/"OLD HUNGARIAN NUMBER ONE THOUSAND"/* 10CFF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*34020*/"RUMI DIGIT ONE"/* 10E60 */,/*34021*/"RUMI DIGIT TWO"/* 10E61 */, /*34022*/"RUMI DIGIT THREE"/* 10E62 */,/*34023*/"RUMI DIGIT FOUR"/* 10E63 */,/*34024*/"RUMI DIGIT FIVE"/* 10E64 */, /*34025*/"RUMI DIGIT SIX"/* 10E65 */,/*34026*/"RUMI DIGIT SEVEN"/* 10E66 */,/*34027*/"RUMI DIGIT EIGHT"/* 10E67 */, /*34028*/"RUMI DIGIT NINE"/* 10E68 */,/*34029*/"RUMI NUMBER TEN"/* 10E69 */,/*34030*/"RUMI NUMBER TWENTY"/* 10E6A */, /*34031*/"RUMI NUMBER THIRTY"/* 10E6B */,/*34032*/"RUMI NUMBER FORTY"/* 10E6C */,/*34033*/"RUMI NUMBER FIFTY"/* 10E6D */, /*34034*/"RUMI NUMBER SIXTY"/* 10E6E */,/*34035*/"RUMI NUMBER SEVENTY"/* 10E6F */, /*34036*/"RUMI NUMBER EIGHTY"/* 10E70 */,/*34037*/"RUMI NUMBER NINETY"/* 10E71 */, /*34038*/"RUMI NUMBER ONE HUNDRED"/* 10E72 */,/*34039*/"RUMI NUMBER TWO HUNDRED"/* 10E73 */, /*34040*/"RUMI NUMBER THREE HUNDRED"/* 10E74 */,/*34041*/"RUMI NUMBER FOUR HUNDRED"/* 10E75 */, /*34042*/"RUMI NUMBER FIVE HUNDRED"/* 10E76 */,/*34043*/"RUMI NUMBER SIX HUNDRED"/* 10E77 */, /*34044*/"RUMI NUMBER SEVEN HUNDRED"/* 10E78 */,/*34045*/"RUMI NUMBER EIGHT HUNDRED"/* 10E79 */, /*34046*/"RUMI NUMBER NINE HUNDRED"/* 10E7A */,/*34047*/"RUMI FRACTION ONE HALF"/* 10E7B */, /*34048*/"RUMI FRACTION ONE QUARTER"/* 10E7C */,/*34049*/"RUMI FRACTION ONE THIRD"/* 10E7D */, /*34050*/"RUMI FRACTION TWO THIRDS"/* 10E7E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*34436*/"BRAHMI SIGN CANDRABINDU"/* 11000 */, /*34437*/"BRAHMI SIGN ANUSVARA"/* 11001 */,/*34438*/"BRAHMI SIGN VISARGA"/* 11002 */, /*34439*/"BRAHMI SIGN JIHVAMULIYA"/* 11003 */,/*34440*/"BRAHMI SIGN UPADHMANIYA"/* 11004 */, /*34441*/"BRAHMI LETTER A"/* 11005 */,/*34442*/"BRAHMI LETTER AA"/* 11006 */,/*34443*/"BRAHMI LETTER I"/* 11007 */, /*34444*/"BRAHMI LETTER II"/* 11008 */,/*34445*/"BRAHMI LETTER U"/* 11009 */,/*34446*/"BRAHMI LETTER UU"/* 1100A */, /*34447*/"BRAHMI LETTER VOCALIC R"/* 1100B */,/*34448*/"BRAHMI LETTER VOCALIC RR"/* 1100C */, /*34449*/"BRAHMI LETTER VOCALIC L"/* 1100D */,/*34450*/"BRAHMI LETTER VOCALIC LL"/* 1100E */, /*34451*/"BRAHMI LETTER E"/* 1100F */,/*34452*/"BRAHMI LETTER AI"/* 11010 */,/*34453*/"BRAHMI LETTER O"/* 11011 */, /*34454*/"BRAHMI LETTER AU"/* 11012 */,/*34455*/"BRAHMI LETTER KA"/* 11013 */,/*34456*/"BRAHMI LETTER KHA"/* 11014 */, /*34457*/"BRAHMI LETTER GA"/* 11015 */,/*34458*/"BRAHMI LETTER GHA"/* 11016 */,/*34459*/"BRAHMI LETTER NGA"/* 11017 */, /*34460*/"BRAHMI LETTER CA"/* 11018 */,/*34461*/"BRAHMI LETTER CHA"/* 11019 */,/*34462*/"BRAHMI LETTER JA"/* 1101A */, /*34463*/"BRAHMI LETTER JHA"/* 1101B */,/*34464*/"BRAHMI LETTER NYA"/* 1101C */,/*34465*/"BRAHMI LETTER TTA"/* 1101D */, /*34466*/"BRAHMI LETTER TTHA"/* 1101E */,/*34467*/"BRAHMI LETTER DDA"/* 1101F */, /*34468*/"BRAHMI LETTER DDHA"/* 11020 */,/*34469*/"BRAHMI LETTER NNA"/* 11021 */,/*34470*/"BRAHMI LETTER TA"/* 11022 */, /*34471*/"BRAHMI LETTER THA"/* 11023 */,/*34472*/"BRAHMI LETTER DA"/* 11024 */,/*34473*/"BRAHMI LETTER DHA"/* 11025 */, /*34474*/"BRAHMI LETTER NA"/* 11026 */,/*34475*/"BRAHMI LETTER PA"/* 11027 */,/*34476*/"BRAHMI LETTER PHA"/* 11028 */, /*34477*/"BRAHMI LETTER BA"/* 11029 */,/*34478*/"BRAHMI LETTER BHA"/* 1102A */,/*34479*/"BRAHMI LETTER MA"/* 1102B */, /*34480*/"BRAHMI LETTER YA"/* 1102C */,/*34481*/"BRAHMI LETTER RA"/* 1102D */,/*34482*/"BRAHMI LETTER LA"/* 1102E */, /*34483*/"BRAHMI LETTER VA"/* 1102F */,/*34484*/"BRAHMI LETTER SHA"/* 11030 */,/*34485*/"BRAHMI LETTER SSA"/* 11031 */, /*34486*/"BRAHMI LETTER SA"/* 11032 */,/*34487*/"BRAHMI LETTER HA"/* 11033 */,/*34488*/"BRAHMI LETTER LLA"/* 11034 */, /*34489*/"BRAHMI LETTER OLD TAMIL LLLA"/* 11035 */,/*34490*/"BRAHMI LETTER OLD TAMIL RRA"/* 11036 */, /*34491*/"BRAHMI LETTER OLD TAMIL NNNA"/* 11037 */,/*34492*/"BRAHMI VOWEL SIGN AA"/* 11038 */, /*34493*/"BRAHMI VOWEL SIGN BHATTIPROLU AA"/* 11039 */,/*34494*/"BRAHMI VOWEL SIGN I"/* 1103A */, /*34495*/"BRAHMI VOWEL SIGN II"/* 1103B */,/*34496*/"BRAHMI VOWEL SIGN U"/* 1103C */, /*34497*/"BRAHMI VOWEL SIGN UU"/* 1103D */,/*34498*/"BRAHMI VOWEL SIGN VOCALIC R"/* 1103E */, /*34499*/"BRAHMI VOWEL SIGN VOCALIC RR"/* 1103F */,/*34500*/"BRAHMI VOWEL SIGN VOCALIC L"/* 11040 */, /*34501*/"BRAHMI VOWEL SIGN VOCALIC LL"/* 11041 */,/*34502*/"BRAHMI VOWEL SIGN E"/* 11042 */, /*34503*/"BRAHMI VOWEL SIGN AI"/* 11043 */,/*34504*/"BRAHMI VOWEL SIGN O"/* 11044 */, /*34505*/"BRAHMI VOWEL SIGN AU"/* 11045 */,/*34506*/"BRAHMI VIRAMA"/* 11046 */,/*34507*/"BRAHMI DANDA"/* 11047 */, /*34508*/"BRAHMI DOUBLE DANDA"/* 11048 */,/*34509*/"BRAHMI PUNCTUATION DOT"/* 11049 */, /*34510*/"BRAHMI PUNCTUATION DOUBLE DOT"/* 1104A */,/*34511*/"BRAHMI PUNCTUATION LINE"/* 1104B */, /*34512*/"BRAHMI PUNCTUATION CRESCENT BAR"/* 1104C */,/*34513*/"BRAHMI PUNCTUATION LOTUS"/* 1104D */,NULL,NULL,NULL,NULL, /*34518*/"BRAHMI NUMBER ONE"/* 11052 */,/*34519*/"BRAHMI NUMBER TWO"/* 11053 */, /*34520*/"BRAHMI NUMBER THREE"/* 11054 */,/*34521*/"BRAHMI NUMBER FOUR"/* 11055 */, /*34522*/"BRAHMI NUMBER FIVE"/* 11056 */,/*34523*/"BRAHMI NUMBER SIX"/* 11057 */, /*34524*/"BRAHMI NUMBER SEVEN"/* 11058 */,/*34525*/"BRAHMI NUMBER EIGHT"/* 11059 */, /*34526*/"BRAHMI NUMBER NINE"/* 1105A */,/*34527*/"BRAHMI NUMBER TEN"/* 1105B */, /*34528*/"BRAHMI NUMBER TWENTY"/* 1105C */,/*34529*/"BRAHMI NUMBER THIRTY"/* 1105D */, /*34530*/"BRAHMI NUMBER FORTY"/* 1105E */,/*34531*/"BRAHMI NUMBER FIFTY"/* 1105F */, /*34532*/"BRAHMI NUMBER SIXTY"/* 11060 */,/*34533*/"BRAHMI NUMBER SEVENTY"/* 11061 */, /*34534*/"BRAHMI NUMBER EIGHTY"/* 11062 */,/*34535*/"BRAHMI NUMBER NINETY"/* 11063 */, /*34536*/"BRAHMI NUMBER ONE HUNDRED"/* 11064 */,/*34537*/"BRAHMI NUMBER ONE THOUSAND"/* 11065 */, /*34538*/"BRAHMI DIGIT ZERO"/* 11066 */,/*34539*/"BRAHMI DIGIT ONE"/* 11067 */,/*34540*/"BRAHMI DIGIT TWO"/* 11068 */, /*34541*/"BRAHMI DIGIT THREE"/* 11069 */,/*34542*/"BRAHMI DIGIT FOUR"/* 1106A */,/*34543*/"BRAHMI DIGIT FIVE"/* 1106B */, /*34544*/"BRAHMI DIGIT SIX"/* 1106C */,/*34545*/"BRAHMI DIGIT SEVEN"/* 1106D */,/*34546*/"BRAHMI DIGIT EIGHT"/* 1106E */, /*34547*/"BRAHMI DIGIT NINE"/* 1106F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34563*/"BRAHMI NUMBER JOINER"/* 1107F */,/*34564*/"KAITHI SIGN CANDRABINDU"/* 11080 */, /*34565*/"KAITHI SIGN ANUSVARA"/* 11081 */,/*34566*/"KAITHI SIGN VISARGA"/* 11082 */, /*34567*/"KAITHI LETTER A"/* 11083 */,/*34568*/"KAITHI LETTER AA"/* 11084 */,/*34569*/"KAITHI LETTER I"/* 11085 */, /*34570*/"KAITHI LETTER II"/* 11086 */,/*34571*/"KAITHI LETTER U"/* 11087 */,/*34572*/"KAITHI LETTER UU"/* 11088 */, /*34573*/"KAITHI LETTER E"/* 11089 */,/*34574*/"KAITHI LETTER AI"/* 1108A */,/*34575*/"KAITHI LETTER O"/* 1108B */, /*34576*/"KAITHI LETTER AU"/* 1108C */,/*34577*/"KAITHI LETTER KA"/* 1108D */,/*34578*/"KAITHI LETTER KHA"/* 1108E */, /*34579*/"KAITHI LETTER GA"/* 1108F */,/*34580*/"KAITHI LETTER GHA"/* 11090 */,/*34581*/"KAITHI LETTER NGA"/* 11091 */, /*34582*/"KAITHI LETTER CA"/* 11092 */,/*34583*/"KAITHI LETTER CHA"/* 11093 */,/*34584*/"KAITHI LETTER JA"/* 11094 */, /*34585*/"KAITHI LETTER JHA"/* 11095 */,/*34586*/"KAITHI LETTER NYA"/* 11096 */,/*34587*/"KAITHI LETTER TTA"/* 11097 */, /*34588*/"KAITHI LETTER TTHA"/* 11098 */,/*34589*/"KAITHI LETTER DDA"/* 11099 */, /*34590*/"KAITHI LETTER DDDHA"/* 1109A */,/*34591*/"KAITHI LETTER DDHA"/* 1109B */, /*34592*/"KAITHI LETTER RHA"/* 1109C */,/*34593*/"KAITHI LETTER NNA"/* 1109D */,/*34594*/"KAITHI LETTER TA"/* 1109E */, /*34595*/"KAITHI LETTER THA"/* 1109F */,/*34596*/"KAITHI LETTER DA"/* 110A0 */,/*34597*/"KAITHI LETTER DHA"/* 110A1 */, /*34598*/"KAITHI LETTER NA"/* 110A2 */,/*34599*/"KAITHI LETTER PA"/* 110A3 */,/*34600*/"KAITHI LETTER PHA"/* 110A4 */, /*34601*/"KAITHI LETTER BA"/* 110A5 */,/*34602*/"KAITHI LETTER BHA"/* 110A6 */,/*34603*/"KAITHI LETTER MA"/* 110A7 */, /*34604*/"KAITHI LETTER YA"/* 110A8 */,/*34605*/"KAITHI LETTER RA"/* 110A9 */,/*34606*/"KAITHI LETTER LA"/* 110AA */, /*34607*/"KAITHI LETTER VA"/* 110AB */,/*34608*/"KAITHI LETTER SHA"/* 110AC */,/*34609*/"KAITHI LETTER SSA"/* 110AD */, /*34610*/"KAITHI LETTER SA"/* 110AE */,/*34611*/"KAITHI LETTER HA"/* 110AF */,/*34612*/"KAITHI VOWEL SIGN AA"/* 110B0 */, /*34613*/"KAITHI VOWEL SIGN I"/* 110B1 */,/*34614*/"KAITHI VOWEL SIGN II"/* 110B2 */, /*34615*/"KAITHI VOWEL SIGN U"/* 110B3 */,/*34616*/"KAITHI VOWEL SIGN UU"/* 110B4 */, /*34617*/"KAITHI VOWEL SIGN E"/* 110B5 */,/*34618*/"KAITHI VOWEL SIGN AI"/* 110B6 */, /*34619*/"KAITHI VOWEL SIGN O"/* 110B7 */,/*34620*/"KAITHI VOWEL SIGN AU"/* 110B8 */, /*34621*/"KAITHI SIGN VIRAMA"/* 110B9 */,/*34622*/"KAITHI SIGN NUKTA"/* 110BA */, /*34623*/"KAITHI ABBREVIATION SIGN"/* 110BB */,/*34624*/"KAITHI ENUMERATION SIGN"/* 110BC */, /*34625*/"KAITHI NUMBER SIGN"/* 110BD */,/*34626*/"KAITHI SECTION MARK"/* 110BE */, /*34627*/"KAITHI DOUBLE SECTION MARK"/* 110BF */,/*34628*/"KAITHI DANDA"/* 110C0 */, /*34629*/"KAITHI DOUBLE DANDA"/* 110C1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34644*/"SORA SOMPENG LETTER SAH"/* 110D0 */,/*34645*/"SORA SOMPENG LETTER TAH"/* 110D1 */, /*34646*/"SORA SOMPENG LETTER BAH"/* 110D2 */,/*34647*/"SORA SOMPENG LETTER CAH"/* 110D3 */, /*34648*/"SORA SOMPENG LETTER DAH"/* 110D4 */,/*34649*/"SORA SOMPENG LETTER GAH"/* 110D5 */, /*34650*/"SORA SOMPENG LETTER MAH"/* 110D6 */,/*34651*/"SORA SOMPENG LETTER NGAH"/* 110D7 */, /*34652*/"SORA SOMPENG LETTER LAH"/* 110D8 */,/*34653*/"SORA SOMPENG LETTER NAH"/* 110D9 */, /*34654*/"SORA SOMPENG LETTER VAH"/* 110DA */,/*34655*/"SORA SOMPENG LETTER PAH"/* 110DB */, /*34656*/"SORA SOMPENG LETTER YAH"/* 110DC */,/*34657*/"SORA SOMPENG LETTER RAH"/* 110DD */, /*34658*/"SORA SOMPENG LETTER HAH"/* 110DE */,/*34659*/"SORA SOMPENG LETTER KAH"/* 110DF */, /*34660*/"SORA SOMPENG LETTER JAH"/* 110E0 */,/*34661*/"SORA SOMPENG LETTER NYAH"/* 110E1 */, /*34662*/"SORA SOMPENG LETTER AH"/* 110E2 */,/*34663*/"SORA SOMPENG LETTER EEH"/* 110E3 */, /*34664*/"SORA SOMPENG LETTER IH"/* 110E4 */,/*34665*/"SORA SOMPENG LETTER UH"/* 110E5 */, /*34666*/"SORA SOMPENG LETTER OH"/* 110E6 */,/*34667*/"SORA SOMPENG LETTER EH"/* 110E7 */, /*34668*/"SORA SOMPENG LETTER MAE"/* 110E8 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34676*/"SORA SOMPENG DIGIT ZERO"/* 110F0 */,/*34677*/"SORA SOMPENG DIGIT ONE"/* 110F1 */, /*34678*/"SORA SOMPENG DIGIT TWO"/* 110F2 */,/*34679*/"SORA SOMPENG DIGIT THREE"/* 110F3 */, /*34680*/"SORA SOMPENG DIGIT FOUR"/* 110F4 */,/*34681*/"SORA SOMPENG DIGIT FIVE"/* 110F5 */, /*34682*/"SORA SOMPENG DIGIT SIX"/* 110F6 */,/*34683*/"SORA SOMPENG DIGIT SEVEN"/* 110F7 */, /*34684*/"SORA SOMPENG DIGIT EIGHT"/* 110F8 */,/*34685*/"SORA SOMPENG DIGIT NINE"/* 110F9 */,NULL,NULL,NULL,NULL,NULL, NULL,/*34692*/"CHAKMA SIGN CANDRABINDU"/* 11100 */,/*34693*/"CHAKMA SIGN ANUSVARA"/* 11101 */, /*34694*/"CHAKMA SIGN VISARGA"/* 11102 */,/*34695*/"CHAKMA LETTER AA"/* 11103 */,/*34696*/"CHAKMA LETTER I"/* 11104 */, /*34697*/"CHAKMA LETTER U"/* 11105 */,/*34698*/"CHAKMA LETTER E"/* 11106 */,/*34699*/"CHAKMA LETTER KAA"/* 11107 */, /*34700*/"CHAKMA LETTER KHAA"/* 11108 */,/*34701*/"CHAKMA LETTER GAA"/* 11109 */, /*34702*/"CHAKMA LETTER GHAA"/* 1110A */,/*34703*/"CHAKMA LETTER NGAA"/* 1110B */, /*34704*/"CHAKMA LETTER CAA"/* 1110C */,/*34705*/"CHAKMA LETTER CHAA"/* 1110D */,/*34706*/"CHAKMA LETTER JAA"/* 1110E */, /*34707*/"CHAKMA LETTER JHAA"/* 1110F */,/*34708*/"CHAKMA LETTER NYAA"/* 11110 */, /*34709*/"CHAKMA LETTER TTAA"/* 11111 */,/*34710*/"CHAKMA LETTER TTHAA"/* 11112 */, /*34711*/"CHAKMA LETTER DDAA"/* 11113 */,/*34712*/"CHAKMA LETTER DDHAA"/* 11114 */, /*34713*/"CHAKMA LETTER NNAA"/* 11115 */,/*34714*/"CHAKMA LETTER TAA"/* 11116 */, /*34715*/"CHAKMA LETTER THAA"/* 11117 */,/*34716*/"CHAKMA LETTER DAA"/* 11118 */, /*34717*/"CHAKMA LETTER DHAA"/* 11119 */,/*34718*/"CHAKMA LETTER NAA"/* 1111A */,/*34719*/"CHAKMA LETTER PAA"/* 1111B */, /*34720*/"CHAKMA LETTER PHAA"/* 1111C */,/*34721*/"CHAKMA LETTER BAA"/* 1111D */, /*34722*/"CHAKMA LETTER BHAA"/* 1111E */,/*34723*/"CHAKMA LETTER MAA"/* 1111F */, /*34724*/"CHAKMA LETTER YYAA"/* 11120 */,/*34725*/"CHAKMA LETTER YAA"/* 11121 */,/*34726*/"CHAKMA LETTER RAA"/* 11122 */, /*34727*/"CHAKMA LETTER LAA"/* 11123 */,/*34728*/"CHAKMA LETTER WAA"/* 11124 */,/*34729*/"CHAKMA LETTER SAA"/* 11125 */, /*34730*/"CHAKMA LETTER HAA"/* 11126 */,/*34731*/"CHAKMA VOWEL SIGN A"/* 11127 */, /*34732*/"CHAKMA VOWEL SIGN I"/* 11128 */,/*34733*/"CHAKMA VOWEL SIGN II"/* 11129 */, /*34734*/"CHAKMA VOWEL SIGN U"/* 1112A */,/*34735*/"CHAKMA VOWEL SIGN UU"/* 1112B */, /*34736*/"CHAKMA VOWEL SIGN E"/* 1112C */,/*34737*/"CHAKMA VOWEL SIGN AI"/* 1112D */, /*34738*/"CHAKMA VOWEL SIGN O"/* 1112E */,/*34739*/"CHAKMA VOWEL SIGN AU"/* 1112F */, /*34740*/"CHAKMA VOWEL SIGN OI"/* 11130 */,/*34741*/"CHAKMA O MARK"/* 11131 */,/*34742*/"CHAKMA AU MARK"/* 11132 */, /*34743*/"CHAKMA VIRAMA"/* 11133 */,/*34744*/"CHAKMA MAAYYAA"/* 11134 */,NULL,/*34746*/"CHAKMA DIGIT ZERO"/* 11136 */, /*34747*/"CHAKMA DIGIT ONE"/* 11137 */,/*34748*/"CHAKMA DIGIT TWO"/* 11138 */,/*34749*/"CHAKMA DIGIT THREE"/* 11139 */, /*34750*/"CHAKMA DIGIT FOUR"/* 1113A */,/*34751*/"CHAKMA DIGIT FIVE"/* 1113B */,/*34752*/"CHAKMA DIGIT SIX"/* 1113C */, /*34753*/"CHAKMA DIGIT SEVEN"/* 1113D */,/*34754*/"CHAKMA DIGIT EIGHT"/* 1113E */, /*34755*/"CHAKMA DIGIT NINE"/* 1113F */,/*34756*/"CHAKMA SECTION MARK"/* 11140 */,/*34757*/"CHAKMA DANDA"/* 11141 */, /*34758*/"CHAKMA DOUBLE DANDA"/* 11142 */,/*34759*/"CHAKMA QUESTION MARK"/* 11143 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*34772*/"MAHAJANI LETTER A"/* 11150 */,/*34773*/"MAHAJANI LETTER I"/* 11151 */, /*34774*/"MAHAJANI LETTER U"/* 11152 */,/*34775*/"MAHAJANI LETTER E"/* 11153 */,/*34776*/"MAHAJANI LETTER O"/* 11154 */, /*34777*/"MAHAJANI LETTER KA"/* 11155 */,/*34778*/"MAHAJANI LETTER KHA"/* 11156 */, /*34779*/"MAHAJANI LETTER GA"/* 11157 */,/*34780*/"MAHAJANI LETTER GHA"/* 11158 */, /*34781*/"MAHAJANI LETTER CA"/* 11159 */,/*34782*/"MAHAJANI LETTER CHA"/* 1115A */, /*34783*/"MAHAJANI LETTER JA"/* 1115B */,/*34784*/"MAHAJANI LETTER JHA"/* 1115C */, /*34785*/"MAHAJANI LETTER NYA"/* 1115D */,/*34786*/"MAHAJANI LETTER TTA"/* 1115E */, /*34787*/"MAHAJANI LETTER TTHA"/* 1115F */,/*34788*/"MAHAJANI LETTER DDA"/* 11160 */, /*34789*/"MAHAJANI LETTER DDHA"/* 11161 */,/*34790*/"MAHAJANI LETTER NNA"/* 11162 */, /*34791*/"MAHAJANI LETTER TA"/* 11163 */,/*34792*/"MAHAJANI LETTER THA"/* 11164 */, /*34793*/"MAHAJANI LETTER DA"/* 11165 */,/*34794*/"MAHAJANI LETTER DHA"/* 11166 */, /*34795*/"MAHAJANI LETTER NA"/* 11167 */,/*34796*/"MAHAJANI LETTER PA"/* 11168 */, /*34797*/"MAHAJANI LETTER PHA"/* 11169 */,/*34798*/"MAHAJANI LETTER BA"/* 1116A */, /*34799*/"MAHAJANI LETTER BHA"/* 1116B */,/*34800*/"MAHAJANI LETTER MA"/* 1116C */, /*34801*/"MAHAJANI LETTER RA"/* 1116D */,/*34802*/"MAHAJANI LETTER LA"/* 1116E */, /*34803*/"MAHAJANI LETTER VA"/* 1116F */,/*34804*/"MAHAJANI LETTER SA"/* 11170 */, /*34805*/"MAHAJANI LETTER HA"/* 11171 */,/*34806*/"MAHAJANI LETTER RRA"/* 11172 */, /*34807*/"MAHAJANI SIGN NUKTA"/* 11173 */,/*34808*/"MAHAJANI ABBREVIATION SIGN"/* 11174 */, /*34809*/"MAHAJANI SECTION MARK"/* 11175 */,/*34810*/"MAHAJANI LIGATURE SHRI"/* 11176 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*34820*/"SHARADA SIGN CANDRABINDU"/* 11180 */,/*34821*/"SHARADA SIGN ANUSVARA"/* 11181 */, /*34822*/"SHARADA SIGN VISARGA"/* 11182 */,/*34823*/"SHARADA LETTER A"/* 11183 */, /*34824*/"SHARADA LETTER AA"/* 11184 */,/*34825*/"SHARADA LETTER I"/* 11185 */,/*34826*/"SHARADA LETTER II"/* 11186 */, /*34827*/"SHARADA LETTER U"/* 11187 */,/*34828*/"SHARADA LETTER UU"/* 11188 */, /*34829*/"SHARADA LETTER VOCALIC R"/* 11189 */,/*34830*/"SHARADA LETTER VOCALIC RR"/* 1118A */, /*34831*/"SHARADA LETTER VOCALIC L"/* 1118B */,/*34832*/"SHARADA LETTER VOCALIC LL"/* 1118C */, /*34833*/"SHARADA LETTER E"/* 1118D */,/*34834*/"SHARADA LETTER AI"/* 1118E */,/*34835*/"SHARADA LETTER O"/* 1118F */, /*34836*/"SHARADA LETTER AU"/* 11190 */,/*34837*/"SHARADA LETTER KA"/* 11191 */,/*34838*/"SHARADA LETTER KHA"/* 11192 */, /*34839*/"SHARADA LETTER GA"/* 11193 */,/*34840*/"SHARADA LETTER GHA"/* 11194 */, /*34841*/"SHARADA LETTER NGA"/* 11195 */,/*34842*/"SHARADA LETTER CA"/* 11196 */, /*34843*/"SHARADA LETTER CHA"/* 11197 */,/*34844*/"SHARADA LETTER JA"/* 11198 */, /*34845*/"SHARADA LETTER JHA"/* 11199 */,/*34846*/"SHARADA LETTER NYA"/* 1119A */, /*34847*/"SHARADA LETTER TTA"/* 1119B */,/*34848*/"SHARADA LETTER TTHA"/* 1119C */, /*34849*/"SHARADA LETTER DDA"/* 1119D */,/*34850*/"SHARADA LETTER DDHA"/* 1119E */, /*34851*/"SHARADA LETTER NNA"/* 1119F */,/*34852*/"SHARADA LETTER TA"/* 111A0 */, /*34853*/"SHARADA LETTER THA"/* 111A1 */,/*34854*/"SHARADA LETTER DA"/* 111A2 */, /*34855*/"SHARADA LETTER DHA"/* 111A3 */,/*34856*/"SHARADA LETTER NA"/* 111A4 */,/*34857*/"SHARADA LETTER PA"/* 111A5 */, /*34858*/"SHARADA LETTER PHA"/* 111A6 */,/*34859*/"SHARADA LETTER BA"/* 111A7 */, /*34860*/"SHARADA LETTER BHA"/* 111A8 */,/*34861*/"SHARADA LETTER MA"/* 111A9 */,/*34862*/"SHARADA LETTER YA"/* 111AA */, /*34863*/"SHARADA LETTER RA"/* 111AB */,/*34864*/"SHARADA LETTER LA"/* 111AC */,/*34865*/"SHARADA LETTER LLA"/* 111AD */, /*34866*/"SHARADA LETTER VA"/* 111AE */,/*34867*/"SHARADA LETTER SHA"/* 111AF */, /*34868*/"SHARADA LETTER SSA"/* 111B0 */,/*34869*/"SHARADA LETTER SA"/* 111B1 */,/*34870*/"SHARADA LETTER HA"/* 111B2 */, /*34871*/"SHARADA VOWEL SIGN AA"/* 111B3 */,/*34872*/"SHARADA VOWEL SIGN I"/* 111B4 */, /*34873*/"SHARADA VOWEL SIGN II"/* 111B5 */,/*34874*/"SHARADA VOWEL SIGN U"/* 111B6 */, /*34875*/"SHARADA VOWEL SIGN UU"/* 111B7 */,/*34876*/"SHARADA VOWEL SIGN VOCALIC R"/* 111B8 */, /*34877*/"SHARADA VOWEL SIGN VOCALIC RR"/* 111B9 */,/*34878*/"SHARADA VOWEL SIGN VOCALIC L"/* 111BA */, /*34879*/"SHARADA VOWEL SIGN VOCALIC LL"/* 111BB */,/*34880*/"SHARADA VOWEL SIGN E"/* 111BC */, /*34881*/"SHARADA VOWEL SIGN AI"/* 111BD */,/*34882*/"SHARADA VOWEL SIGN O"/* 111BE */, /*34883*/"SHARADA VOWEL SIGN AU"/* 111BF */,/*34884*/"SHARADA SIGN VIRAMA"/* 111C0 */, /*34885*/"SHARADA SIGN AVAGRAHA"/* 111C1 */,/*34886*/"SHARADA SIGN JIHVAMULIYA"/* 111C2 */, /*34887*/"SHARADA SIGN UPADHMANIYA"/* 111C3 */,/*34888*/"SHARADA OM"/* 111C4 */,/*34889*/"SHARADA DANDA"/* 111C5 */, /*34890*/"SHARADA DOUBLE DANDA"/* 111C6 */,/*34891*/"SHARADA ABBREVIATION SIGN"/* 111C7 */, /*34892*/"SHARADA SEPARATOR"/* 111C8 */,/*34893*/"SHARADA SANDHI MARK"/* 111C9 */, /*34894*/"SHARADA SIGN NUKTA"/* 111CA */,/*34895*/"SHARADA VOWEL MODIFIER MARK"/* 111CB */, /*34896*/"SHARADA EXTRA SHORT VOWEL MARK"/* 111CC */,/*34897*/"SHARADA SUTRA MARK"/* 111CD */,NULL,NULL, /*34900*/"SHARADA DIGIT ZERO"/* 111D0 */,/*34901*/"SHARADA DIGIT ONE"/* 111D1 */,/*34902*/"SHARADA DIGIT TWO"/* 111D2 */, /*34903*/"SHARADA DIGIT THREE"/* 111D3 */,/*34904*/"SHARADA DIGIT FOUR"/* 111D4 */, /*34905*/"SHARADA DIGIT FIVE"/* 111D5 */,/*34906*/"SHARADA DIGIT SIX"/* 111D6 */, /*34907*/"SHARADA DIGIT SEVEN"/* 111D7 */,/*34908*/"SHARADA DIGIT EIGHT"/* 111D8 */, /*34909*/"SHARADA DIGIT NINE"/* 111D9 */,/*34910*/"SHARADA EKAM"/* 111DA */,/*34911*/"SHARADA SIGN SIDDHAM"/* 111DB */, /*34912*/"SHARADA HEADSTROKE"/* 111DC */,/*34913*/"SHARADA CONTINUATION SIGN"/* 111DD */, /*34914*/"SHARADA SECTION MARK-1"/* 111DE */,/*34915*/"SHARADA SECTION MARK-2"/* 111DF */,NULL, /*34917*/"SINHALA ARCHAIC DIGIT ONE"/* 111E1 */,/*34918*/"SINHALA ARCHAIC DIGIT TWO"/* 111E2 */, /*34919*/"SINHALA ARCHAIC DIGIT THREE"/* 111E3 */,/*34920*/"SINHALA ARCHAIC DIGIT FOUR"/* 111E4 */, /*34921*/"SINHALA ARCHAIC DIGIT FIVE"/* 111E5 */,/*34922*/"SINHALA ARCHAIC DIGIT SIX"/* 111E6 */, /*34923*/"SINHALA ARCHAIC DIGIT SEVEN"/* 111E7 */,/*34924*/"SINHALA ARCHAIC DIGIT EIGHT"/* 111E8 */, /*34925*/"SINHALA ARCHAIC DIGIT NINE"/* 111E9 */,/*34926*/"SINHALA ARCHAIC NUMBER TEN"/* 111EA */, /*34927*/"SINHALA ARCHAIC NUMBER TWENTY"/* 111EB */,/*34928*/"SINHALA ARCHAIC NUMBER THIRTY"/* 111EC */, /*34929*/"SINHALA ARCHAIC NUMBER FORTY"/* 111ED */,/*34930*/"SINHALA ARCHAIC NUMBER FIFTY"/* 111EE */, /*34931*/"SINHALA ARCHAIC NUMBER SIXTY"/* 111EF */,/*34932*/"SINHALA ARCHAIC NUMBER SEVENTY"/* 111F0 */, /*34933*/"SINHALA ARCHAIC NUMBER EIGHTY"/* 111F1 */,/*34934*/"SINHALA ARCHAIC NUMBER NINETY"/* 111F2 */, /*34935*/"SINHALA ARCHAIC NUMBER ONE HUNDRED"/* 111F3 */,/*34936*/"SINHALA ARCHAIC NUMBER ONE THOUSAND"/* 111F4 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*34948*/"KHOJKI LETTER A"/* 11200 */, /*34949*/"KHOJKI LETTER AA"/* 11201 */,/*34950*/"KHOJKI LETTER I"/* 11202 */,/*34951*/"KHOJKI LETTER U"/* 11203 */, /*34952*/"KHOJKI LETTER E"/* 11204 */,/*34953*/"KHOJKI LETTER AI"/* 11205 */,/*34954*/"KHOJKI LETTER O"/* 11206 */, /*34955*/"KHOJKI LETTER AU"/* 11207 */,/*34956*/"KHOJKI LETTER KA"/* 11208 */,/*34957*/"KHOJKI LETTER KHA"/* 11209 */, /*34958*/"KHOJKI LETTER GA"/* 1120A */,/*34959*/"KHOJKI LETTER GGA"/* 1120B */,/*34960*/"KHOJKI LETTER GHA"/* 1120C */, /*34961*/"KHOJKI LETTER NGA"/* 1120D */,/*34962*/"KHOJKI LETTER CA"/* 1120E */,/*34963*/"KHOJKI LETTER CHA"/* 1120F */, /*34964*/"KHOJKI LETTER JA"/* 11210 */,/*34965*/"KHOJKI LETTER JJA"/* 11211 */,NULL, /*34967*/"KHOJKI LETTER NYA"/* 11213 */,/*34968*/"KHOJKI LETTER TTA"/* 11214 */,/*34969*/"KHOJKI LETTER TTHA"/* 11215 */, /*34970*/"KHOJKI LETTER DDA"/* 11216 */,/*34971*/"KHOJKI LETTER DDHA"/* 11217 */,/*34972*/"KHOJKI LETTER NNA"/* 11218 */, /*34973*/"KHOJKI LETTER TA"/* 11219 */,/*34974*/"KHOJKI LETTER THA"/* 1121A */,/*34975*/"KHOJKI LETTER DA"/* 1121B */, /*34976*/"KHOJKI LETTER DDDA"/* 1121C */,/*34977*/"KHOJKI LETTER DHA"/* 1121D */,/*34978*/"KHOJKI LETTER NA"/* 1121E */, /*34979*/"KHOJKI LETTER PA"/* 1121F */,/*34980*/"KHOJKI LETTER PHA"/* 11220 */,/*34981*/"KHOJKI LETTER BA"/* 11221 */, /*34982*/"KHOJKI LETTER BBA"/* 11222 */,/*34983*/"KHOJKI LETTER BHA"/* 11223 */,/*34984*/"KHOJKI LETTER MA"/* 11224 */, /*34985*/"KHOJKI LETTER YA"/* 11225 */,/*34986*/"KHOJKI LETTER RA"/* 11226 */,/*34987*/"KHOJKI LETTER LA"/* 11227 */, /*34988*/"KHOJKI LETTER VA"/* 11228 */,/*34989*/"KHOJKI LETTER SA"/* 11229 */,/*34990*/"KHOJKI LETTER HA"/* 1122A */, /*34991*/"KHOJKI LETTER LLA"/* 1122B */,/*34992*/"KHOJKI VOWEL SIGN AA"/* 1122C */, /*34993*/"KHOJKI VOWEL SIGN I"/* 1122D */,/*34994*/"KHOJKI VOWEL SIGN II"/* 1122E */, /*34995*/"KHOJKI VOWEL SIGN U"/* 1122F */,/*34996*/"KHOJKI VOWEL SIGN E"/* 11230 */, /*34997*/"KHOJKI VOWEL SIGN AI"/* 11231 */,/*34998*/"KHOJKI VOWEL SIGN O"/* 11232 */, /*34999*/"KHOJKI VOWEL SIGN AU"/* 11233 */,/*35000*/"KHOJKI SIGN ANUSVARA"/* 11234 */, /*35001*/"KHOJKI SIGN VIRAMA"/* 11235 */,/*35002*/"KHOJKI SIGN NUKTA"/* 11236 */, /*35003*/"KHOJKI SIGN SHADDA"/* 11237 */,/*35004*/"KHOJKI DANDA"/* 11238 */,/*35005*/"KHOJKI DOUBLE DANDA"/* 11239 */, /*35006*/"KHOJKI WORD SEPARATOR"/* 1123A */,/*35007*/"KHOJKI SECTION MARK"/* 1123B */, /*35008*/"KHOJKI DOUBLE SECTION MARK"/* 1123C */,/*35009*/"KHOJKI ABBREVIATION SIGN"/* 1123D */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*35076*/"MULTANI LETTER A"/* 11280 */, /*35077*/"MULTANI LETTER I"/* 11281 */,/*35078*/"MULTANI LETTER U"/* 11282 */,/*35079*/"MULTANI LETTER E"/* 11283 */, /*35080*/"MULTANI LETTER KA"/* 11284 */,/*35081*/"MULTANI LETTER KHA"/* 11285 */,/*35082*/"MULTANI LETTER GA"/* 11286 */, NULL,/*35084*/"MULTANI LETTER GHA"/* 11288 */,NULL,/*35086*/"MULTANI LETTER CA"/* 1128A */, /*35087*/"MULTANI LETTER CHA"/* 1128B */,/*35088*/"MULTANI LETTER JA"/* 1128C */, /*35089*/"MULTANI LETTER JJA"/* 1128D */,NULL,/*35091*/"MULTANI LETTER NYA"/* 1128F */, /*35092*/"MULTANI LETTER TTA"/* 11290 */,/*35093*/"MULTANI LETTER TTHA"/* 11291 */, /*35094*/"MULTANI LETTER DDA"/* 11292 */,/*35095*/"MULTANI LETTER DDDA"/* 11293 */, /*35096*/"MULTANI LETTER DDHA"/* 11294 */,/*35097*/"MULTANI LETTER NNA"/* 11295 */, /*35098*/"MULTANI LETTER TA"/* 11296 */,/*35099*/"MULTANI LETTER THA"/* 11297 */,/*35100*/"MULTANI LETTER DA"/* 11298 */, /*35101*/"MULTANI LETTER DHA"/* 11299 */,/*35102*/"MULTANI LETTER NA"/* 1129A */,/*35103*/"MULTANI LETTER PA"/* 1129B */, /*35104*/"MULTANI LETTER PHA"/* 1129C */,/*35105*/"MULTANI LETTER BA"/* 1129D */,NULL, /*35107*/"MULTANI LETTER BHA"/* 1129F */,/*35108*/"MULTANI LETTER MA"/* 112A0 */,/*35109*/"MULTANI LETTER YA"/* 112A1 */, /*35110*/"MULTANI LETTER RA"/* 112A2 */,/*35111*/"MULTANI LETTER LA"/* 112A3 */,/*35112*/"MULTANI LETTER VA"/* 112A4 */, /*35113*/"MULTANI LETTER SA"/* 112A5 */,/*35114*/"MULTANI LETTER HA"/* 112A6 */,/*35115*/"MULTANI LETTER RRA"/* 112A7 */, /*35116*/"MULTANI LETTER RHA"/* 112A8 */,/*35117*/"MULTANI SECTION MARK"/* 112A9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*35124*/"KHUDAWADI LETTER A"/* 112B0 */,/*35125*/"KHUDAWADI LETTER AA"/* 112B1 */, /*35126*/"KHUDAWADI LETTER I"/* 112B2 */,/*35127*/"KHUDAWADI LETTER II"/* 112B3 */, /*35128*/"KHUDAWADI LETTER U"/* 112B4 */,/*35129*/"KHUDAWADI LETTER UU"/* 112B5 */, /*35130*/"KHUDAWADI LETTER E"/* 112B6 */,/*35131*/"KHUDAWADI LETTER AI"/* 112B7 */, /*35132*/"KHUDAWADI LETTER O"/* 112B8 */,/*35133*/"KHUDAWADI LETTER AU"/* 112B9 */, /*35134*/"KHUDAWADI LETTER KA"/* 112BA */,/*35135*/"KHUDAWADI LETTER KHA"/* 112BB */, /*35136*/"KHUDAWADI LETTER GA"/* 112BC */,/*35137*/"KHUDAWADI LETTER GGA"/* 112BD */, /*35138*/"KHUDAWADI LETTER GHA"/* 112BE */,/*35139*/"KHUDAWADI LETTER NGA"/* 112BF */, /*35140*/"KHUDAWADI LETTER CA"/* 112C0 */,/*35141*/"KHUDAWADI LETTER CHA"/* 112C1 */, /*35142*/"KHUDAWADI LETTER JA"/* 112C2 */,/*35143*/"KHUDAWADI LETTER JJA"/* 112C3 */, /*35144*/"KHUDAWADI LETTER JHA"/* 112C4 */,/*35145*/"KHUDAWADI LETTER NYA"/* 112C5 */, /*35146*/"KHUDAWADI LETTER TTA"/* 112C6 */,/*35147*/"KHUDAWADI LETTER TTHA"/* 112C7 */, /*35148*/"KHUDAWADI LETTER DDA"/* 112C8 */,/*35149*/"KHUDAWADI LETTER DDDA"/* 112C9 */, /*35150*/"KHUDAWADI LETTER RRA"/* 112CA */,/*35151*/"KHUDAWADI LETTER DDHA"/* 112CB */, /*35152*/"KHUDAWADI LETTER NNA"/* 112CC */,/*35153*/"KHUDAWADI LETTER TA"/* 112CD */, /*35154*/"KHUDAWADI LETTER THA"/* 112CE */,/*35155*/"KHUDAWADI LETTER DA"/* 112CF */, /*35156*/"KHUDAWADI LETTER DHA"/* 112D0 */,/*35157*/"KHUDAWADI LETTER NA"/* 112D1 */, /*35158*/"KHUDAWADI LETTER PA"/* 112D2 */,/*35159*/"KHUDAWADI LETTER PHA"/* 112D3 */, /*35160*/"KHUDAWADI LETTER BA"/* 112D4 */,/*35161*/"KHUDAWADI LETTER BBA"/* 112D5 */, /*35162*/"KHUDAWADI LETTER BHA"/* 112D6 */,/*35163*/"KHUDAWADI LETTER MA"/* 112D7 */, /*35164*/"KHUDAWADI LETTER YA"/* 112D8 */,/*35165*/"KHUDAWADI LETTER RA"/* 112D9 */, /*35166*/"KHUDAWADI LETTER LA"/* 112DA */,/*35167*/"KHUDAWADI LETTER VA"/* 112DB */, /*35168*/"KHUDAWADI LETTER SHA"/* 112DC */,/*35169*/"KHUDAWADI LETTER SA"/* 112DD */, /*35170*/"KHUDAWADI LETTER HA"/* 112DE */,/*35171*/"KHUDAWADI SIGN ANUSVARA"/* 112DF */, /*35172*/"KHUDAWADI VOWEL SIGN AA"/* 112E0 */,/*35173*/"KHUDAWADI VOWEL SIGN I"/* 112E1 */, /*35174*/"KHUDAWADI VOWEL SIGN II"/* 112E2 */,/*35175*/"KHUDAWADI VOWEL SIGN U"/* 112E3 */, /*35176*/"KHUDAWADI VOWEL SIGN UU"/* 112E4 */,/*35177*/"KHUDAWADI VOWEL SIGN E"/* 112E5 */, /*35178*/"KHUDAWADI VOWEL SIGN AI"/* 112E6 */,/*35179*/"KHUDAWADI VOWEL SIGN O"/* 112E7 */, /*35180*/"KHUDAWADI VOWEL SIGN AU"/* 112E8 */,/*35181*/"KHUDAWADI SIGN NUKTA"/* 112E9 */, /*35182*/"KHUDAWADI SIGN VIRAMA"/* 112EA */,NULL,NULL,NULL,NULL,NULL,/*35188*/"KHUDAWADI DIGIT ZERO"/* 112F0 */, /*35189*/"KHUDAWADI DIGIT ONE"/* 112F1 */,/*35190*/"KHUDAWADI DIGIT TWO"/* 112F2 */, /*35191*/"KHUDAWADI DIGIT THREE"/* 112F3 */,/*35192*/"KHUDAWADI DIGIT FOUR"/* 112F4 */, /*35193*/"KHUDAWADI DIGIT FIVE"/* 112F5 */,/*35194*/"KHUDAWADI DIGIT SIX"/* 112F6 */, /*35195*/"KHUDAWADI DIGIT SEVEN"/* 112F7 */,/*35196*/"KHUDAWADI DIGIT EIGHT"/* 112F8 */, /*35197*/"KHUDAWADI DIGIT NINE"/* 112F9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*35204*/"GRANTHA SIGN COMBINING ANUSVARA ABOVE"/* 11300 */,/*35205*/"GRANTHA SIGN CANDRABINDU"/* 11301 */, /*35206*/"GRANTHA SIGN ANUSVARA"/* 11302 */,/*35207*/"GRANTHA SIGN VISARGA"/* 11303 */,NULL, /*35209*/"GRANTHA LETTER A"/* 11305 */,/*35210*/"GRANTHA LETTER AA"/* 11306 */,/*35211*/"GRANTHA LETTER I"/* 11307 */, /*35212*/"GRANTHA LETTER II"/* 11308 */,/*35213*/"GRANTHA LETTER U"/* 11309 */,/*35214*/"GRANTHA LETTER UU"/* 1130A */, /*35215*/"GRANTHA LETTER VOCALIC R"/* 1130B */,/*35216*/"GRANTHA LETTER VOCALIC L"/* 1130C */,NULL,NULL, /*35219*/"GRANTHA LETTER EE"/* 1130F */,/*35220*/"GRANTHA LETTER AI"/* 11310 */,NULL,NULL, /*35223*/"GRANTHA LETTER OO"/* 11313 */,/*35224*/"GRANTHA LETTER AU"/* 11314 */,/*35225*/"GRANTHA LETTER KA"/* 11315 */, /*35226*/"GRANTHA LETTER KHA"/* 11316 */,/*35227*/"GRANTHA LETTER GA"/* 11317 */, /*35228*/"GRANTHA LETTER GHA"/* 11318 */,/*35229*/"GRANTHA LETTER NGA"/* 11319 */, /*35230*/"GRANTHA LETTER CA"/* 1131A */,/*35231*/"GRANTHA LETTER CHA"/* 1131B */,/*35232*/"GRANTHA LETTER JA"/* 1131C */, /*35233*/"GRANTHA LETTER JHA"/* 1131D */,/*35234*/"GRANTHA LETTER NYA"/* 1131E */, /*35235*/"GRANTHA LETTER TTA"/* 1131F */,/*35236*/"GRANTHA LETTER TTHA"/* 11320 */, /*35237*/"GRANTHA LETTER DDA"/* 11321 */,/*35238*/"GRANTHA LETTER DDHA"/* 11322 */, /*35239*/"GRANTHA LETTER NNA"/* 11323 */,/*35240*/"GRANTHA LETTER TA"/* 11324 */, /*35241*/"GRANTHA LETTER THA"/* 11325 */,/*35242*/"GRANTHA LETTER DA"/* 11326 */, /*35243*/"GRANTHA LETTER DHA"/* 11327 */,/*35244*/"GRANTHA LETTER NA"/* 11328 */,NULL, /*35246*/"GRANTHA LETTER PA"/* 1132A */,/*35247*/"GRANTHA LETTER PHA"/* 1132B */,/*35248*/"GRANTHA LETTER BA"/* 1132C */, /*35249*/"GRANTHA LETTER BHA"/* 1132D */,/*35250*/"GRANTHA LETTER MA"/* 1132E */,/*35251*/"GRANTHA LETTER YA"/* 1132F */, /*35252*/"GRANTHA LETTER RA"/* 11330 */,NULL,/*35254*/"GRANTHA LETTER LA"/* 11332 */, /*35255*/"GRANTHA LETTER LLA"/* 11333 */,NULL,/*35257*/"GRANTHA LETTER VA"/* 11335 */, /*35258*/"GRANTHA LETTER SHA"/* 11336 */,/*35259*/"GRANTHA LETTER SSA"/* 11337 */, /*35260*/"GRANTHA LETTER SA"/* 11338 */,/*35261*/"GRANTHA LETTER HA"/* 11339 */,NULL,NULL, /*35264*/"GRANTHA SIGN NUKTA"/* 1133C */,/*35265*/"GRANTHA SIGN AVAGRAHA"/* 1133D */, /*35266*/"GRANTHA VOWEL SIGN AA"/* 1133E */,/*35267*/"GRANTHA VOWEL SIGN I"/* 1133F */, /*35268*/"GRANTHA VOWEL SIGN II"/* 11340 */,/*35269*/"GRANTHA VOWEL SIGN U"/* 11341 */, /*35270*/"GRANTHA VOWEL SIGN UU"/* 11342 */,/*35271*/"GRANTHA VOWEL SIGN VOCALIC R"/* 11343 */, /*35272*/"GRANTHA VOWEL SIGN VOCALIC RR"/* 11344 */,NULL,NULL,/*35275*/"GRANTHA VOWEL SIGN EE"/* 11347 */, /*35276*/"GRANTHA VOWEL SIGN AI"/* 11348 */,NULL,NULL,/*35279*/"GRANTHA VOWEL SIGN OO"/* 1134B */, /*35280*/"GRANTHA VOWEL SIGN AU"/* 1134C */,/*35281*/"GRANTHA SIGN VIRAMA"/* 1134D */,NULL,NULL, /*35284*/"GRANTHA OM"/* 11350 */,NULL,NULL,NULL,NULL,NULL,NULL,/*35291*/"GRANTHA AU LENGTH MARK"/* 11357 */,NULL,NULL, NULL,NULL,NULL,/*35297*/"GRANTHA SIGN PLUTA"/* 1135D */,/*35298*/"GRANTHA LETTER VEDIC ANUSVARA"/* 1135E */, /*35299*/"GRANTHA LETTER VEDIC DOUBLE ANUSVARA"/* 1135F */,/*35300*/"GRANTHA LETTER VOCALIC RR"/* 11360 */, /*35301*/"GRANTHA LETTER VOCALIC LL"/* 11361 */,/*35302*/"GRANTHA VOWEL SIGN VOCALIC L"/* 11362 */, /*35303*/"GRANTHA VOWEL SIGN VOCALIC LL"/* 11363 */,NULL,NULL,/*35306*/"COMBINING GRANTHA DIGIT ZERO"/* 11366 */, /*35307*/"COMBINING GRANTHA DIGIT ONE"/* 11367 */,/*35308*/"COMBINING GRANTHA DIGIT TWO"/* 11368 */, /*35309*/"COMBINING GRANTHA DIGIT THREE"/* 11369 */,/*35310*/"COMBINING GRANTHA DIGIT FOUR"/* 1136A */, /*35311*/"COMBINING GRANTHA DIGIT FIVE"/* 1136B */,/*35312*/"COMBINING GRANTHA DIGIT SIX"/* 1136C */,NULL,NULL,NULL, /*35316*/"COMBINING GRANTHA LETTER A"/* 11370 */,/*35317*/"COMBINING GRANTHA LETTER KA"/* 11371 */, /*35318*/"COMBINING GRANTHA LETTER NA"/* 11372 */,/*35319*/"COMBINING GRANTHA LETTER VI"/* 11373 */, /*35320*/"COMBINING GRANTHA LETTER PA"/* 11374 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*35588*/"TIRHUTA ANJI"/* 11480 */, /*35589*/"TIRHUTA LETTER A"/* 11481 */,/*35590*/"TIRHUTA LETTER AA"/* 11482 */,/*35591*/"TIRHUTA LETTER I"/* 11483 */, /*35592*/"TIRHUTA LETTER II"/* 11484 */,/*35593*/"TIRHUTA LETTER U"/* 11485 */,/*35594*/"TIRHUTA LETTER UU"/* 11486 */, /*35595*/"TIRHUTA LETTER VOCALIC R"/* 11487 */,/*35596*/"TIRHUTA LETTER VOCALIC RR"/* 11488 */, /*35597*/"TIRHUTA LETTER VOCALIC L"/* 11489 */,/*35598*/"TIRHUTA LETTER VOCALIC LL"/* 1148A */, /*35599*/"TIRHUTA LETTER E"/* 1148B */,/*35600*/"TIRHUTA LETTER AI"/* 1148C */,/*35601*/"TIRHUTA LETTER O"/* 1148D */, /*35602*/"TIRHUTA LETTER AU"/* 1148E */,/*35603*/"TIRHUTA LETTER KA"/* 1148F */,/*35604*/"TIRHUTA LETTER KHA"/* 11490 */, /*35605*/"TIRHUTA LETTER GA"/* 11491 */,/*35606*/"TIRHUTA LETTER GHA"/* 11492 */, /*35607*/"TIRHUTA LETTER NGA"/* 11493 */,/*35608*/"TIRHUTA LETTER CA"/* 11494 */, /*35609*/"TIRHUTA LETTER CHA"/* 11495 */,/*35610*/"TIRHUTA LETTER JA"/* 11496 */, /*35611*/"TIRHUTA LETTER JHA"/* 11497 */,/*35612*/"TIRHUTA LETTER NYA"/* 11498 */, /*35613*/"TIRHUTA LETTER TTA"/* 11499 */,/*35614*/"TIRHUTA LETTER TTHA"/* 1149A */, /*35615*/"TIRHUTA LETTER DDA"/* 1149B */,/*35616*/"TIRHUTA LETTER DDHA"/* 1149C */, /*35617*/"TIRHUTA LETTER NNA"/* 1149D */,/*35618*/"TIRHUTA LETTER TA"/* 1149E */, /*35619*/"TIRHUTA LETTER THA"/* 1149F */,/*35620*/"TIRHUTA LETTER DA"/* 114A0 */, /*35621*/"TIRHUTA LETTER DHA"/* 114A1 */,/*35622*/"TIRHUTA LETTER NA"/* 114A2 */,/*35623*/"TIRHUTA LETTER PA"/* 114A3 */, /*35624*/"TIRHUTA LETTER PHA"/* 114A4 */,/*35625*/"TIRHUTA LETTER BA"/* 114A5 */, /*35626*/"TIRHUTA LETTER BHA"/* 114A6 */,/*35627*/"TIRHUTA LETTER MA"/* 114A7 */,/*35628*/"TIRHUTA LETTER YA"/* 114A8 */, /*35629*/"TIRHUTA LETTER RA"/* 114A9 */,/*35630*/"TIRHUTA LETTER LA"/* 114AA */,/*35631*/"TIRHUTA LETTER VA"/* 114AB */, /*35632*/"TIRHUTA LETTER SHA"/* 114AC */,/*35633*/"TIRHUTA LETTER SSA"/* 114AD */, /*35634*/"TIRHUTA LETTER SA"/* 114AE */,/*35635*/"TIRHUTA LETTER HA"/* 114AF */, /*35636*/"TIRHUTA VOWEL SIGN AA"/* 114B0 */,/*35637*/"TIRHUTA VOWEL SIGN I"/* 114B1 */, /*35638*/"TIRHUTA VOWEL SIGN II"/* 114B2 */,/*35639*/"TIRHUTA VOWEL SIGN U"/* 114B3 */, /*35640*/"TIRHUTA VOWEL SIGN UU"/* 114B4 */,/*35641*/"TIRHUTA VOWEL SIGN VOCALIC R"/* 114B5 */, /*35642*/"TIRHUTA VOWEL SIGN VOCALIC RR"/* 114B6 */,/*35643*/"TIRHUTA VOWEL SIGN VOCALIC L"/* 114B7 */, /*35644*/"TIRHUTA VOWEL SIGN VOCALIC LL"/* 114B8 */,/*35645*/"TIRHUTA VOWEL SIGN E"/* 114B9 */, /*35646*/"TIRHUTA VOWEL SIGN SHORT E"/* 114BA */,/*35647*/"TIRHUTA VOWEL SIGN AI"/* 114BB */, /*35648*/"TIRHUTA VOWEL SIGN O"/* 114BC */,/*35649*/"TIRHUTA VOWEL SIGN SHORT O"/* 114BD */, /*35650*/"TIRHUTA VOWEL SIGN AU"/* 114BE */,/*35651*/"TIRHUTA SIGN CANDRABINDU"/* 114BF */, /*35652*/"TIRHUTA SIGN ANUSVARA"/* 114C0 */,/*35653*/"TIRHUTA SIGN VISARGA"/* 114C1 */, /*35654*/"TIRHUTA SIGN VIRAMA"/* 114C2 */,/*35655*/"TIRHUTA SIGN NUKTA"/* 114C3 */, /*35656*/"TIRHUTA SIGN AVAGRAHA"/* 114C4 */,/*35657*/"TIRHUTA GVANG"/* 114C5 */, /*35658*/"TIRHUTA ABBREVIATION SIGN"/* 114C6 */,/*35659*/"TIRHUTA OM"/* 114C7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*35668*/"TIRHUTA DIGIT ZERO"/* 114D0 */,/*35669*/"TIRHUTA DIGIT ONE"/* 114D1 */,/*35670*/"TIRHUTA DIGIT TWO"/* 114D2 */, /*35671*/"TIRHUTA DIGIT THREE"/* 114D3 */,/*35672*/"TIRHUTA DIGIT FOUR"/* 114D4 */, /*35673*/"TIRHUTA DIGIT FIVE"/* 114D5 */,/*35674*/"TIRHUTA DIGIT SIX"/* 114D6 */, /*35675*/"TIRHUTA DIGIT SEVEN"/* 114D7 */,/*35676*/"TIRHUTA DIGIT EIGHT"/* 114D8 */, /*35677*/"TIRHUTA DIGIT NINE"/* 114D9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*35844*/"SIDDHAM LETTER A"/* 11580 */,/*35845*/"SIDDHAM LETTER AA"/* 11581 */, /*35846*/"SIDDHAM LETTER I"/* 11582 */,/*35847*/"SIDDHAM LETTER II"/* 11583 */,/*35848*/"SIDDHAM LETTER U"/* 11584 */, /*35849*/"SIDDHAM LETTER UU"/* 11585 */,/*35850*/"SIDDHAM LETTER VOCALIC R"/* 11586 */, /*35851*/"SIDDHAM LETTER VOCALIC RR"/* 11587 */,/*35852*/"SIDDHAM LETTER VOCALIC L"/* 11588 */, /*35853*/"SIDDHAM LETTER VOCALIC LL"/* 11589 */,/*35854*/"SIDDHAM LETTER E"/* 1158A */, /*35855*/"SIDDHAM LETTER AI"/* 1158B */,/*35856*/"SIDDHAM LETTER O"/* 1158C */,/*35857*/"SIDDHAM LETTER AU"/* 1158D */, /*35858*/"SIDDHAM LETTER KA"/* 1158E */,/*35859*/"SIDDHAM LETTER KHA"/* 1158F */,/*35860*/"SIDDHAM LETTER GA"/* 11590 */, /*35861*/"SIDDHAM LETTER GHA"/* 11591 */,/*35862*/"SIDDHAM LETTER NGA"/* 11592 */, /*35863*/"SIDDHAM LETTER CA"/* 11593 */,/*35864*/"SIDDHAM LETTER CHA"/* 11594 */,/*35865*/"SIDDHAM LETTER JA"/* 11595 */, /*35866*/"SIDDHAM LETTER JHA"/* 11596 */,/*35867*/"SIDDHAM LETTER NYA"/* 11597 */, /*35868*/"SIDDHAM LETTER TTA"/* 11598 */,/*35869*/"SIDDHAM LETTER TTHA"/* 11599 */, /*35870*/"SIDDHAM LETTER DDA"/* 1159A */,/*35871*/"SIDDHAM LETTER DDHA"/* 1159B */, /*35872*/"SIDDHAM LETTER NNA"/* 1159C */,/*35873*/"SIDDHAM LETTER TA"/* 1159D */, /*35874*/"SIDDHAM LETTER THA"/* 1159E */,/*35875*/"SIDDHAM LETTER DA"/* 1159F */, /*35876*/"SIDDHAM LETTER DHA"/* 115A0 */,/*35877*/"SIDDHAM LETTER NA"/* 115A1 */,/*35878*/"SIDDHAM LETTER PA"/* 115A2 */, /*35879*/"SIDDHAM LETTER PHA"/* 115A3 */,/*35880*/"SIDDHAM LETTER BA"/* 115A4 */, /*35881*/"SIDDHAM LETTER BHA"/* 115A5 */,/*35882*/"SIDDHAM LETTER MA"/* 115A6 */,/*35883*/"SIDDHAM LETTER YA"/* 115A7 */, /*35884*/"SIDDHAM LETTER RA"/* 115A8 */,/*35885*/"SIDDHAM LETTER LA"/* 115A9 */,/*35886*/"SIDDHAM LETTER VA"/* 115AA */, /*35887*/"SIDDHAM LETTER SHA"/* 115AB */,/*35888*/"SIDDHAM LETTER SSA"/* 115AC */, /*35889*/"SIDDHAM LETTER SA"/* 115AD */,/*35890*/"SIDDHAM LETTER HA"/* 115AE */, /*35891*/"SIDDHAM VOWEL SIGN AA"/* 115AF */,/*35892*/"SIDDHAM VOWEL SIGN I"/* 115B0 */, /*35893*/"SIDDHAM VOWEL SIGN II"/* 115B1 */,/*35894*/"SIDDHAM VOWEL SIGN U"/* 115B2 */, /*35895*/"SIDDHAM VOWEL SIGN UU"/* 115B3 */,/*35896*/"SIDDHAM VOWEL SIGN VOCALIC R"/* 115B4 */, /*35897*/"SIDDHAM VOWEL SIGN VOCALIC RR"/* 115B5 */,NULL,NULL,/*35900*/"SIDDHAM VOWEL SIGN E"/* 115B8 */, /*35901*/"SIDDHAM VOWEL SIGN AI"/* 115B9 */,/*35902*/"SIDDHAM VOWEL SIGN O"/* 115BA */, /*35903*/"SIDDHAM VOWEL SIGN AU"/* 115BB */,/*35904*/"SIDDHAM SIGN CANDRABINDU"/* 115BC */, /*35905*/"SIDDHAM SIGN ANUSVARA"/* 115BD */,/*35906*/"SIDDHAM SIGN VISARGA"/* 115BE */, /*35907*/"SIDDHAM SIGN VIRAMA"/* 115BF */,/*35908*/"SIDDHAM SIGN NUKTA"/* 115C0 */, /*35909*/"SIDDHAM SIGN SIDDHAM"/* 115C1 */,/*35910*/"SIDDHAM DANDA"/* 115C2 */, /*35911*/"SIDDHAM DOUBLE DANDA"/* 115C3 */,/*35912*/"SIDDHAM SEPARATOR DOT"/* 115C4 */, /*35913*/"SIDDHAM SEPARATOR BAR"/* 115C5 */,/*35914*/"SIDDHAM REPETITION MARK-1"/* 115C6 */, /*35915*/"SIDDHAM REPETITION MARK-2"/* 115C7 */,/*35916*/"SIDDHAM REPETITION MARK-3"/* 115C8 */, /*35917*/"SIDDHAM END OF TEXT MARK"/* 115C9 */, /*35918*/"SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS"/* 115CA */, /*35919*/"SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS"/* 115CB */, /*35920*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS"/* 115CC */, /*35921*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS"/* 115CD */, /*35922*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS"/* 115CE */, /*35923*/"SIDDHAM SECTION MARK DOUBLE RING"/* 115CF */,/*35924*/"SIDDHAM SECTION MARK DOUBLE RING WITH RAYS"/* 115D0 */, /*35925*/"SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS"/* 115D1 */, /*35926*/"SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS"/* 115D2 */, /*35927*/"SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS"/* 115D3 */, /*35928*/"SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS"/* 115D4 */, /*35929*/"SIDDHAM SECTION MARK WITH CIRCLES AND RAYS"/* 115D5 */, /*35930*/"SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES"/* 115D6 */, /*35931*/"SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES"/* 115D7 */, /*35932*/"SIDDHAM LETTER THREE-CIRCLE ALTERNATE I"/* 115D8 */, /*35933*/"SIDDHAM LETTER TWO-CIRCLE ALTERNATE I"/* 115D9 */,/*35934*/"SIDDHAM LETTER TWO-CIRCLE ALTERNATE II"/* 115DA */, /*35935*/"SIDDHAM LETTER ALTERNATE U"/* 115DB */,/*35936*/"SIDDHAM VOWEL SIGN ALTERNATE U"/* 115DC */, /*35937*/"SIDDHAM VOWEL SIGN ALTERNATE UU"/* 115DD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*35972*/"MODI LETTER A"/* 11600 */,/*35973*/"MODI LETTER AA"/* 11601 */,/*35974*/"MODI LETTER I"/* 11602 */, /*35975*/"MODI LETTER II"/* 11603 */,/*35976*/"MODI LETTER U"/* 11604 */,/*35977*/"MODI LETTER UU"/* 11605 */, /*35978*/"MODI LETTER VOCALIC R"/* 11606 */,/*35979*/"MODI LETTER VOCALIC RR"/* 11607 */, /*35980*/"MODI LETTER VOCALIC L"/* 11608 */,/*35981*/"MODI LETTER VOCALIC LL"/* 11609 */, /*35982*/"MODI LETTER E"/* 1160A */,/*35983*/"MODI LETTER AI"/* 1160B */,/*35984*/"MODI LETTER O"/* 1160C */, /*35985*/"MODI LETTER AU"/* 1160D */,/*35986*/"MODI LETTER KA"/* 1160E */,/*35987*/"MODI LETTER KHA"/* 1160F */, /*35988*/"MODI LETTER GA"/* 11610 */,/*35989*/"MODI LETTER GHA"/* 11611 */,/*35990*/"MODI LETTER NGA"/* 11612 */, /*35991*/"MODI LETTER CA"/* 11613 */,/*35992*/"MODI LETTER CHA"/* 11614 */,/*35993*/"MODI LETTER JA"/* 11615 */, /*35994*/"MODI LETTER JHA"/* 11616 */,/*35995*/"MODI LETTER NYA"/* 11617 */,/*35996*/"MODI LETTER TTA"/* 11618 */, /*35997*/"MODI LETTER TTHA"/* 11619 */,/*35998*/"MODI LETTER DDA"/* 1161A */,/*35999*/"MODI LETTER DDHA"/* 1161B */, /*36000*/"MODI LETTER NNA"/* 1161C */,/*36001*/"MODI LETTER TA"/* 1161D */,/*36002*/"MODI LETTER THA"/* 1161E */, /*36003*/"MODI LETTER DA"/* 1161F */,/*36004*/"MODI LETTER DHA"/* 11620 */,/*36005*/"MODI LETTER NA"/* 11621 */, /*36006*/"MODI LETTER PA"/* 11622 */,/*36007*/"MODI LETTER PHA"/* 11623 */,/*36008*/"MODI LETTER BA"/* 11624 */, /*36009*/"MODI LETTER BHA"/* 11625 */,/*36010*/"MODI LETTER MA"/* 11626 */,/*36011*/"MODI LETTER YA"/* 11627 */, /*36012*/"MODI LETTER RA"/* 11628 */,/*36013*/"MODI LETTER LA"/* 11629 */,/*36014*/"MODI LETTER VA"/* 1162A */, /*36015*/"MODI LETTER SHA"/* 1162B */,/*36016*/"MODI LETTER SSA"/* 1162C */,/*36017*/"MODI LETTER SA"/* 1162D */, /*36018*/"MODI LETTER HA"/* 1162E */,/*36019*/"MODI LETTER LLA"/* 1162F */,/*36020*/"MODI VOWEL SIGN AA"/* 11630 */, /*36021*/"MODI VOWEL SIGN I"/* 11631 */,/*36022*/"MODI VOWEL SIGN II"/* 11632 */,/*36023*/"MODI VOWEL SIGN U"/* 11633 */, /*36024*/"MODI VOWEL SIGN UU"/* 11634 */,/*36025*/"MODI VOWEL SIGN VOCALIC R"/* 11635 */, /*36026*/"MODI VOWEL SIGN VOCALIC RR"/* 11636 */,/*36027*/"MODI VOWEL SIGN VOCALIC L"/* 11637 */, /*36028*/"MODI VOWEL SIGN VOCALIC LL"/* 11638 */,/*36029*/"MODI VOWEL SIGN E"/* 11639 */, /*36030*/"MODI VOWEL SIGN AI"/* 1163A */,/*36031*/"MODI VOWEL SIGN O"/* 1163B */, /*36032*/"MODI VOWEL SIGN AU"/* 1163C */,/*36033*/"MODI SIGN ANUSVARA"/* 1163D */, /*36034*/"MODI SIGN VISARGA"/* 1163E */,/*36035*/"MODI SIGN VIRAMA"/* 1163F */, /*36036*/"MODI SIGN ARDHACANDRA"/* 11640 */,/*36037*/"MODI DANDA"/* 11641 */,/*36038*/"MODI DOUBLE DANDA"/* 11642 */, /*36039*/"MODI ABBREVIATION SIGN"/* 11643 */,/*36040*/"MODI SIGN HUVA"/* 11644 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*36052*/"MODI DIGIT ZERO"/* 11650 */,/*36053*/"MODI DIGIT ONE"/* 11651 */, /*36054*/"MODI DIGIT TWO"/* 11652 */,/*36055*/"MODI DIGIT THREE"/* 11653 */,/*36056*/"MODI DIGIT FOUR"/* 11654 */, /*36057*/"MODI DIGIT FIVE"/* 11655 */,/*36058*/"MODI DIGIT SIX"/* 11656 */,/*36059*/"MODI DIGIT SEVEN"/* 11657 */, /*36060*/"MODI DIGIT EIGHT"/* 11658 */,/*36061*/"MODI DIGIT NINE"/* 11659 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*36100*/"TAKRI LETTER A"/* 11680 */,/*36101*/"TAKRI LETTER AA"/* 11681 */, /*36102*/"TAKRI LETTER I"/* 11682 */,/*36103*/"TAKRI LETTER II"/* 11683 */,/*36104*/"TAKRI LETTER U"/* 11684 */, /*36105*/"TAKRI LETTER UU"/* 11685 */,/*36106*/"TAKRI LETTER E"/* 11686 */,/*36107*/"TAKRI LETTER AI"/* 11687 */, /*36108*/"TAKRI LETTER O"/* 11688 */,/*36109*/"TAKRI LETTER AU"/* 11689 */,/*36110*/"TAKRI LETTER KA"/* 1168A */, /*36111*/"TAKRI LETTER KHA"/* 1168B */,/*36112*/"TAKRI LETTER GA"/* 1168C */,/*36113*/"TAKRI LETTER GHA"/* 1168D */, /*36114*/"TAKRI LETTER NGA"/* 1168E */,/*36115*/"TAKRI LETTER CA"/* 1168F */,/*36116*/"TAKRI LETTER CHA"/* 11690 */, /*36117*/"TAKRI LETTER JA"/* 11691 */,/*36118*/"TAKRI LETTER JHA"/* 11692 */,/*36119*/"TAKRI LETTER NYA"/* 11693 */, /*36120*/"TAKRI LETTER TTA"/* 11694 */,/*36121*/"TAKRI LETTER TTHA"/* 11695 */,/*36122*/"TAKRI LETTER DDA"/* 11696 */, /*36123*/"TAKRI LETTER DDHA"/* 11697 */,/*36124*/"TAKRI LETTER NNA"/* 11698 */,/*36125*/"TAKRI LETTER TA"/* 11699 */, /*36126*/"TAKRI LETTER THA"/* 1169A */,/*36127*/"TAKRI LETTER DA"/* 1169B */,/*36128*/"TAKRI LETTER DHA"/* 1169C */, /*36129*/"TAKRI LETTER NA"/* 1169D */,/*36130*/"TAKRI LETTER PA"/* 1169E */,/*36131*/"TAKRI LETTER PHA"/* 1169F */, /*36132*/"TAKRI LETTER BA"/* 116A0 */,/*36133*/"TAKRI LETTER BHA"/* 116A1 */,/*36134*/"TAKRI LETTER MA"/* 116A2 */, /*36135*/"TAKRI LETTER YA"/* 116A3 */,/*36136*/"TAKRI LETTER RA"/* 116A4 */,/*36137*/"TAKRI LETTER LA"/* 116A5 */, /*36138*/"TAKRI LETTER VA"/* 116A6 */,/*36139*/"TAKRI LETTER SHA"/* 116A7 */,/*36140*/"TAKRI LETTER SA"/* 116A8 */, /*36141*/"TAKRI LETTER HA"/* 116A9 */,/*36142*/"TAKRI LETTER RRA"/* 116AA */,/*36143*/"TAKRI SIGN ANUSVARA"/* 116AB */, /*36144*/"TAKRI SIGN VISARGA"/* 116AC */,/*36145*/"TAKRI VOWEL SIGN AA"/* 116AD */, /*36146*/"TAKRI VOWEL SIGN I"/* 116AE */,/*36147*/"TAKRI VOWEL SIGN II"/* 116AF */, /*36148*/"TAKRI VOWEL SIGN U"/* 116B0 */,/*36149*/"TAKRI VOWEL SIGN UU"/* 116B1 */, /*36150*/"TAKRI VOWEL SIGN E"/* 116B2 */,/*36151*/"TAKRI VOWEL SIGN AI"/* 116B3 */, /*36152*/"TAKRI VOWEL SIGN O"/* 116B4 */,/*36153*/"TAKRI VOWEL SIGN AU"/* 116B5 */, /*36154*/"TAKRI SIGN VIRAMA"/* 116B6 */,/*36155*/"TAKRI SIGN NUKTA"/* 116B7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36164*/"TAKRI DIGIT ZERO"/* 116C0 */,/*36165*/"TAKRI DIGIT ONE"/* 116C1 */,/*36166*/"TAKRI DIGIT TWO"/* 116C2 */, /*36167*/"TAKRI DIGIT THREE"/* 116C3 */,/*36168*/"TAKRI DIGIT FOUR"/* 116C4 */,/*36169*/"TAKRI DIGIT FIVE"/* 116C5 */, /*36170*/"TAKRI DIGIT SIX"/* 116C6 */,/*36171*/"TAKRI DIGIT SEVEN"/* 116C7 */,/*36172*/"TAKRI DIGIT EIGHT"/* 116C8 */, /*36173*/"TAKRI DIGIT NINE"/* 116C9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*36228*/"AHOM LETTER KA"/* 11700 */, /*36229*/"AHOM LETTER KHA"/* 11701 */,/*36230*/"AHOM LETTER NGA"/* 11702 */,/*36231*/"AHOM LETTER NA"/* 11703 */, /*36232*/"AHOM LETTER TA"/* 11704 */,/*36233*/"AHOM LETTER ALTERNATE TA"/* 11705 */,/*36234*/"AHOM LETTER PA"/* 11706 */, /*36235*/"AHOM LETTER PHA"/* 11707 */,/*36236*/"AHOM LETTER BA"/* 11708 */,/*36237*/"AHOM LETTER MA"/* 11709 */, /*36238*/"AHOM LETTER JA"/* 1170A */,/*36239*/"AHOM LETTER CHA"/* 1170B */,/*36240*/"AHOM LETTER THA"/* 1170C */, /*36241*/"AHOM LETTER RA"/* 1170D */,/*36242*/"AHOM LETTER LA"/* 1170E */,/*36243*/"AHOM LETTER SA"/* 1170F */, /*36244*/"AHOM LETTER NYA"/* 11710 */,/*36245*/"AHOM LETTER HA"/* 11711 */,/*36246*/"AHOM LETTER A"/* 11712 */, /*36247*/"AHOM LETTER DA"/* 11713 */,/*36248*/"AHOM LETTER DHA"/* 11714 */,/*36249*/"AHOM LETTER GA"/* 11715 */, /*36250*/"AHOM LETTER ALTERNATE GA"/* 11716 */,/*36251*/"AHOM LETTER GHA"/* 11717 */, /*36252*/"AHOM LETTER BHA"/* 11718 */,/*36253*/"AHOM LETTER JHA"/* 11719 */,NULL,NULL,NULL, /*36257*/"AHOM CONSONANT SIGN MEDIAL LA"/* 1171D */,/*36258*/"AHOM CONSONANT SIGN MEDIAL RA"/* 1171E */, /*36259*/"AHOM CONSONANT SIGN MEDIAL LIGATING RA"/* 1171F */,/*36260*/"AHOM VOWEL SIGN A"/* 11720 */, /*36261*/"AHOM VOWEL SIGN AA"/* 11721 */,/*36262*/"AHOM VOWEL SIGN I"/* 11722 */, /*36263*/"AHOM VOWEL SIGN II"/* 11723 */,/*36264*/"AHOM VOWEL SIGN U"/* 11724 */, /*36265*/"AHOM VOWEL SIGN UU"/* 11725 */,/*36266*/"AHOM VOWEL SIGN E"/* 11726 */, /*36267*/"AHOM VOWEL SIGN AW"/* 11727 */,/*36268*/"AHOM VOWEL SIGN O"/* 11728 */, /*36269*/"AHOM VOWEL SIGN AI"/* 11729 */,/*36270*/"AHOM VOWEL SIGN AM"/* 1172A */,/*36271*/"AHOM SIGN KILLER"/* 1172B */, NULL,NULL,NULL,NULL,/*36276*/"AHOM DIGIT ZERO"/* 11730 */,/*36277*/"AHOM DIGIT ONE"/* 11731 */, /*36278*/"AHOM DIGIT TWO"/* 11732 */,/*36279*/"AHOM DIGIT THREE"/* 11733 */,/*36280*/"AHOM DIGIT FOUR"/* 11734 */, /*36281*/"AHOM DIGIT FIVE"/* 11735 */,/*36282*/"AHOM DIGIT SIX"/* 11736 */,/*36283*/"AHOM DIGIT SEVEN"/* 11737 */, /*36284*/"AHOM DIGIT EIGHT"/* 11738 */,/*36285*/"AHOM DIGIT NINE"/* 11739 */,/*36286*/"AHOM NUMBER TEN"/* 1173A */, /*36287*/"AHOM NUMBER TWENTY"/* 1173B */,/*36288*/"AHOM SIGN SMALL SECTION"/* 1173C */, /*36289*/"AHOM SIGN SECTION"/* 1173D */,/*36290*/"AHOM SIGN RULAI"/* 1173E */,/*36291*/"AHOM SYMBOL VI"/* 1173F */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36644*/"WARANG CITI CAPITAL LETTER NGAA"/* 118A0 */,/*36645*/"WARANG CITI CAPITAL LETTER A"/* 118A1 */, /*36646*/"WARANG CITI CAPITAL LETTER WI"/* 118A2 */,/*36647*/"WARANG CITI CAPITAL LETTER YU"/* 118A3 */, /*36648*/"WARANG CITI CAPITAL LETTER YA"/* 118A4 */,/*36649*/"WARANG CITI CAPITAL LETTER YO"/* 118A5 */, /*36650*/"WARANG CITI CAPITAL LETTER II"/* 118A6 */,/*36651*/"WARANG CITI CAPITAL LETTER UU"/* 118A7 */, /*36652*/"WARANG CITI CAPITAL LETTER E"/* 118A8 */,/*36653*/"WARANG CITI CAPITAL LETTER O"/* 118A9 */, /*36654*/"WARANG CITI CAPITAL LETTER ANG"/* 118AA */,/*36655*/"WARANG CITI CAPITAL LETTER GA"/* 118AB */, /*36656*/"WARANG CITI CAPITAL LETTER KO"/* 118AC */,/*36657*/"WARANG CITI CAPITAL LETTER ENY"/* 118AD */, /*36658*/"WARANG CITI CAPITAL LETTER YUJ"/* 118AE */,/*36659*/"WARANG CITI CAPITAL LETTER UC"/* 118AF */, /*36660*/"WARANG CITI CAPITAL LETTER ENN"/* 118B0 */,/*36661*/"WARANG CITI CAPITAL LETTER ODD"/* 118B1 */, /*36662*/"WARANG CITI CAPITAL LETTER TTE"/* 118B2 */,/*36663*/"WARANG CITI CAPITAL LETTER NUNG"/* 118B3 */, /*36664*/"WARANG CITI CAPITAL LETTER DA"/* 118B4 */,/*36665*/"WARANG CITI CAPITAL LETTER AT"/* 118B5 */, /*36666*/"WARANG CITI CAPITAL LETTER AM"/* 118B6 */,/*36667*/"WARANG CITI CAPITAL LETTER BU"/* 118B7 */, /*36668*/"WARANG CITI CAPITAL LETTER PU"/* 118B8 */,/*36669*/"WARANG CITI CAPITAL LETTER HIYO"/* 118B9 */, /*36670*/"WARANG CITI CAPITAL LETTER HOLO"/* 118BA */,/*36671*/"WARANG CITI CAPITAL LETTER HORR"/* 118BB */, /*36672*/"WARANG CITI CAPITAL LETTER HAR"/* 118BC */,/*36673*/"WARANG CITI CAPITAL LETTER SSUU"/* 118BD */, /*36674*/"WARANG CITI CAPITAL LETTER SII"/* 118BE */,/*36675*/"WARANG CITI CAPITAL LETTER VIYO"/* 118BF */, /*36676*/"WARANG CITI SMALL LETTER NGAA"/* 118C0 */,/*36677*/"WARANG CITI SMALL LETTER A"/* 118C1 */, /*36678*/"WARANG CITI SMALL LETTER WI"/* 118C2 */,/*36679*/"WARANG CITI SMALL LETTER YU"/* 118C3 */, /*36680*/"WARANG CITI SMALL LETTER YA"/* 118C4 */,/*36681*/"WARANG CITI SMALL LETTER YO"/* 118C5 */, /*36682*/"WARANG CITI SMALL LETTER II"/* 118C6 */,/*36683*/"WARANG CITI SMALL LETTER UU"/* 118C7 */, /*36684*/"WARANG CITI SMALL LETTER E"/* 118C8 */,/*36685*/"WARANG CITI SMALL LETTER O"/* 118C9 */, /*36686*/"WARANG CITI SMALL LETTER ANG"/* 118CA */,/*36687*/"WARANG CITI SMALL LETTER GA"/* 118CB */, /*36688*/"WARANG CITI SMALL LETTER KO"/* 118CC */,/*36689*/"WARANG CITI SMALL LETTER ENY"/* 118CD */, /*36690*/"WARANG CITI SMALL LETTER YUJ"/* 118CE */,/*36691*/"WARANG CITI SMALL LETTER UC"/* 118CF */, /*36692*/"WARANG CITI SMALL LETTER ENN"/* 118D0 */,/*36693*/"WARANG CITI SMALL LETTER ODD"/* 118D1 */, /*36694*/"WARANG CITI SMALL LETTER TTE"/* 118D2 */,/*36695*/"WARANG CITI SMALL LETTER NUNG"/* 118D3 */, /*36696*/"WARANG CITI SMALL LETTER DA"/* 118D4 */,/*36697*/"WARANG CITI SMALL LETTER AT"/* 118D5 */, /*36698*/"WARANG CITI SMALL LETTER AM"/* 118D6 */,/*36699*/"WARANG CITI SMALL LETTER BU"/* 118D7 */, /*36700*/"WARANG CITI SMALL LETTER PU"/* 118D8 */,/*36701*/"WARANG CITI SMALL LETTER HIYO"/* 118D9 */, /*36702*/"WARANG CITI SMALL LETTER HOLO"/* 118DA */,/*36703*/"WARANG CITI SMALL LETTER HORR"/* 118DB */, /*36704*/"WARANG CITI SMALL LETTER HAR"/* 118DC */,/*36705*/"WARANG CITI SMALL LETTER SSUU"/* 118DD */, /*36706*/"WARANG CITI SMALL LETTER SII"/* 118DE */,/*36707*/"WARANG CITI SMALL LETTER VIYO"/* 118DF */, /*36708*/"WARANG CITI DIGIT ZERO"/* 118E0 */,/*36709*/"WARANG CITI DIGIT ONE"/* 118E1 */, /*36710*/"WARANG CITI DIGIT TWO"/* 118E2 */,/*36711*/"WARANG CITI DIGIT THREE"/* 118E3 */, /*36712*/"WARANG CITI DIGIT FOUR"/* 118E4 */,/*36713*/"WARANG CITI DIGIT FIVE"/* 118E5 */, /*36714*/"WARANG CITI DIGIT SIX"/* 118E6 */,/*36715*/"WARANG CITI DIGIT SEVEN"/* 118E7 */, /*36716*/"WARANG CITI DIGIT EIGHT"/* 118E8 */,/*36717*/"WARANG CITI DIGIT NINE"/* 118E9 */, /*36718*/"WARANG CITI NUMBER TEN"/* 118EA */,/*36719*/"WARANG CITI NUMBER TWENTY"/* 118EB */, /*36720*/"WARANG CITI NUMBER THIRTY"/* 118EC */,/*36721*/"WARANG CITI NUMBER FORTY"/* 118ED */, /*36722*/"WARANG CITI NUMBER FIFTY"/* 118EE */,/*36723*/"WARANG CITI NUMBER SIXTY"/* 118EF */, /*36724*/"WARANG CITI NUMBER SEVENTY"/* 118F0 */,/*36725*/"WARANG CITI NUMBER EIGHTY"/* 118F1 */, /*36726*/"WARANG CITI NUMBER NINETY"/* 118F2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36739*/"WARANG CITI OM"/* 118FF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*37188*/"PAU CIN HAU LETTER PA"/* 11AC0 */,/*37189*/"PAU CIN HAU LETTER KA"/* 11AC1 */, /*37190*/"PAU CIN HAU LETTER LA"/* 11AC2 */,/*37191*/"PAU CIN HAU LETTER MA"/* 11AC3 */, /*37192*/"PAU CIN HAU LETTER DA"/* 11AC4 */,/*37193*/"PAU CIN HAU LETTER ZA"/* 11AC5 */, /*37194*/"PAU CIN HAU LETTER VA"/* 11AC6 */,/*37195*/"PAU CIN HAU LETTER NGA"/* 11AC7 */, /*37196*/"PAU CIN HAU LETTER HA"/* 11AC8 */,/*37197*/"PAU CIN HAU LETTER GA"/* 11AC9 */, /*37198*/"PAU CIN HAU LETTER KHA"/* 11ACA */,/*37199*/"PAU CIN HAU LETTER SA"/* 11ACB */, /*37200*/"PAU CIN HAU LETTER BA"/* 11ACC */,/*37201*/"PAU CIN HAU LETTER CA"/* 11ACD */, /*37202*/"PAU CIN HAU LETTER TA"/* 11ACE */,/*37203*/"PAU CIN HAU LETTER THA"/* 11ACF */, /*37204*/"PAU CIN HAU LETTER NA"/* 11AD0 */,/*37205*/"PAU CIN HAU LETTER PHA"/* 11AD1 */, /*37206*/"PAU CIN HAU LETTER RA"/* 11AD2 */,/*37207*/"PAU CIN HAU LETTER FA"/* 11AD3 */, /*37208*/"PAU CIN HAU LETTER CHA"/* 11AD4 */,/*37209*/"PAU CIN HAU LETTER A"/* 11AD5 */, /*37210*/"PAU CIN HAU LETTER E"/* 11AD6 */,/*37211*/"PAU CIN HAU LETTER I"/* 11AD7 */, /*37212*/"PAU CIN HAU LETTER O"/* 11AD8 */,/*37213*/"PAU CIN HAU LETTER U"/* 11AD9 */, /*37214*/"PAU CIN HAU LETTER UA"/* 11ADA */,/*37215*/"PAU CIN HAU LETTER IA"/* 11ADB */, /*37216*/"PAU CIN HAU LETTER FINAL P"/* 11ADC */,/*37217*/"PAU CIN HAU LETTER FINAL K"/* 11ADD */, /*37218*/"PAU CIN HAU LETTER FINAL T"/* 11ADE */,/*37219*/"PAU CIN HAU LETTER FINAL M"/* 11ADF */, /*37220*/"PAU CIN HAU LETTER FINAL N"/* 11AE0 */,/*37221*/"PAU CIN HAU LETTER FINAL L"/* 11AE1 */, /*37222*/"PAU CIN HAU LETTER FINAL W"/* 11AE2 */,/*37223*/"PAU CIN HAU LETTER FINAL NG"/* 11AE3 */, /*37224*/"PAU CIN HAU LETTER FINAL Y"/* 11AE4 */,/*37225*/"PAU CIN HAU RISING TONE LONG"/* 11AE5 */, /*37226*/"PAU CIN HAU RISING TONE"/* 11AE6 */,/*37227*/"PAU CIN HAU SANDHI GLOTTAL STOP"/* 11AE7 */, /*37228*/"PAU CIN HAU RISING TONE LONG FINAL"/* 11AE8 */,/*37229*/"PAU CIN HAU RISING TONE FINAL"/* 11AE9 */, /*37230*/"PAU CIN HAU SANDHI GLOTTAL STOP FINAL"/* 11AEA */,/*37231*/"PAU CIN HAU SANDHI TONE LONG"/* 11AEB */, /*37232*/"PAU CIN HAU SANDHI TONE"/* 11AEC */,/*37233*/"PAU CIN HAU SANDHI TONE LONG FINAL"/* 11AED */, /*37234*/"PAU CIN HAU SANDHI TONE FINAL"/* 11AEE */,/*37235*/"PAU CIN HAU MID-LEVEL TONE"/* 11AEF */, /*37236*/"PAU CIN HAU GLOTTAL STOP VARIANT"/* 11AF0 */,/*37237*/"PAU CIN HAU MID-LEVEL TONE LONG FINAL"/* 11AF1 */, /*37238*/"PAU CIN HAU MID-LEVEL TONE FINAL"/* 11AF2 */,/*37239*/"PAU CIN HAU LOW-FALLING TONE LONG"/* 11AF3 */, /*37240*/"PAU CIN HAU LOW-FALLING TONE"/* 11AF4 */,/*37241*/"PAU CIN HAU GLOTTAL STOP"/* 11AF5 */, /*37242*/"PAU CIN HAU LOW-FALLING TONE LONG FINAL"/* 11AF6 */,/*37243*/"PAU CIN HAU LOW-FALLING TONE FINAL"/* 11AF7 */, /*37244*/"PAU CIN HAU GLOTTAL STOP FINAL"/* 11AF8 */,/*37245*/"CUNEIFORM SIGN A"/* 12000 */, /*37246*/"CUNEIFORM SIGN A TIMES A"/* 12001 */,/*37247*/"CUNEIFORM SIGN A TIMES BAD"/* 12002 */, /*37248*/"CUNEIFORM SIGN A TIMES GAN2 TENU"/* 12003 */,/*37249*/"CUNEIFORM SIGN A TIMES HA"/* 12004 */, /*37250*/"CUNEIFORM SIGN A TIMES IGI"/* 12005 */,/*37251*/"CUNEIFORM SIGN A TIMES LAGAR GUNU"/* 12006 */, /*37252*/"CUNEIFORM SIGN A TIMES MUSH"/* 12007 */,/*37253*/"CUNEIFORM SIGN A TIMES SAG"/* 12008 */, /*37254*/"CUNEIFORM SIGN A2"/* 12009 */,/*37255*/"CUNEIFORM SIGN AB"/* 1200A */, /*37256*/"CUNEIFORM SIGN AB TIMES ASH2"/* 1200B */,/*37257*/"CUNEIFORM SIGN AB TIMES DUN3 GUNU"/* 1200C */, /*37258*/"CUNEIFORM SIGN AB TIMES GAL"/* 1200D */,/*37259*/"CUNEIFORM SIGN AB TIMES GAN2 TENU"/* 1200E */, /*37260*/"CUNEIFORM SIGN AB TIMES HA"/* 1200F */,/*37261*/"CUNEIFORM SIGN AB TIMES IGI GUNU"/* 12010 */, /*37262*/"CUNEIFORM SIGN AB TIMES IMIN"/* 12011 */,/*37263*/"CUNEIFORM SIGN AB TIMES LAGAB"/* 12012 */, /*37264*/"CUNEIFORM SIGN AB TIMES SHESH"/* 12013 */,/*37265*/"CUNEIFORM SIGN AB TIMES U PLUS U PLUS U"/* 12014 */, /*37266*/"CUNEIFORM SIGN AB GUNU"/* 12015 */,/*37267*/"CUNEIFORM SIGN AB2"/* 12016 */, /*37268*/"CUNEIFORM SIGN AB2 TIMES BALAG"/* 12017 */,/*37269*/"CUNEIFORM SIGN AB2 TIMES GAN2 TENU"/* 12018 */, /*37270*/"CUNEIFORM SIGN AB2 TIMES ME PLUS EN"/* 12019 */,/*37271*/"CUNEIFORM SIGN AB2 TIMES SHA3"/* 1201A */, /*37272*/"CUNEIFORM SIGN AB2 TIMES TAK4"/* 1201B */,/*37273*/"CUNEIFORM SIGN AD"/* 1201C */, /*37274*/"CUNEIFORM SIGN AK"/* 1201D */,/*37275*/"CUNEIFORM SIGN AK TIMES ERIN2"/* 1201E */, /*37276*/"CUNEIFORM SIGN AK TIMES SHITA PLUS GISH"/* 1201F */,/*37277*/"CUNEIFORM SIGN AL"/* 12020 */, /*37278*/"CUNEIFORM SIGN AL TIMES AL"/* 12021 */,/*37279*/"CUNEIFORM SIGN AL TIMES DIM2"/* 12022 */, /*37280*/"CUNEIFORM SIGN AL TIMES GISH"/* 12023 */,/*37281*/"CUNEIFORM SIGN AL TIMES HA"/* 12024 */, /*37282*/"CUNEIFORM SIGN AL TIMES KAD3"/* 12025 */,/*37283*/"CUNEIFORM SIGN AL TIMES KI"/* 12026 */, /*37284*/"CUNEIFORM SIGN AL TIMES SHE"/* 12027 */,/*37285*/"CUNEIFORM SIGN AL TIMES USH"/* 12028 */, /*37286*/"CUNEIFORM SIGN ALAN"/* 12029 */,/*37287*/"CUNEIFORM SIGN ALEPH"/* 1202A */, /*37288*/"CUNEIFORM SIGN AMAR"/* 1202B */,/*37289*/"CUNEIFORM SIGN AMAR TIMES SHE"/* 1202C */, /*37290*/"CUNEIFORM SIGN AN"/* 1202D */,/*37291*/"CUNEIFORM SIGN AN OVER AN"/* 1202E */, /*37292*/"CUNEIFORM SIGN AN THREE TIMES"/* 1202F */, /*37293*/"CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA"/* 12030 */, /*37294*/"CUNEIFORM SIGN AN PLUS NAGA SQUARED"/* 12031 */,/*37295*/"CUNEIFORM SIGN ANSHE"/* 12032 */, /*37296*/"CUNEIFORM SIGN APIN"/* 12033 */,/*37297*/"CUNEIFORM SIGN ARAD"/* 12034 */, /*37298*/"CUNEIFORM SIGN ARAD TIMES KUR"/* 12035 */,/*37299*/"CUNEIFORM SIGN ARKAB"/* 12036 */, /*37300*/"CUNEIFORM SIGN ASAL2"/* 12037 */,/*37301*/"CUNEIFORM SIGN ASH"/* 12038 */, /*37302*/"CUNEIFORM SIGN ASH ZIDA TENU"/* 12039 */,/*37303*/"CUNEIFORM SIGN ASH KABA TENU"/* 1203A */, /*37304*/"CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP"/* 1203B */, /*37305*/"CUNEIFORM SIGN ASH OVER ASH OVER ASH"/* 1203C */, /*37306*/"CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH"/* 1203D */, /*37307*/"CUNEIFORM SIGN ASH2"/* 1203E */,/*37308*/"CUNEIFORM SIGN ASHGAB"/* 1203F */, /*37309*/"CUNEIFORM SIGN BA"/* 12040 */,/*37310*/"CUNEIFORM SIGN BAD"/* 12041 */, /*37311*/"CUNEIFORM SIGN BAG3"/* 12042 */,/*37312*/"CUNEIFORM SIGN BAHAR2"/* 12043 */, /*37313*/"CUNEIFORM SIGN BAL"/* 12044 */,/*37314*/"CUNEIFORM SIGN BAL OVER BAL"/* 12045 */, /*37315*/"CUNEIFORM SIGN BALAG"/* 12046 */,/*37316*/"CUNEIFORM SIGN BAR"/* 12047 */, /*37317*/"CUNEIFORM SIGN BARA2"/* 12048 */,/*37318*/"CUNEIFORM SIGN BI"/* 12049 */, /*37319*/"CUNEIFORM SIGN BI TIMES A"/* 1204A */,/*37320*/"CUNEIFORM SIGN BI TIMES GAR"/* 1204B */, /*37321*/"CUNEIFORM SIGN BI TIMES IGI GUNU"/* 1204C */,/*37322*/"CUNEIFORM SIGN BU"/* 1204D */, /*37323*/"CUNEIFORM SIGN BU OVER BU AB"/* 1204E */,/*37324*/"CUNEIFORM SIGN BU OVER BU UN"/* 1204F */, /*37325*/"CUNEIFORM SIGN BU CROSSING BU"/* 12050 */,/*37326*/"CUNEIFORM SIGN BULUG"/* 12051 */, /*37327*/"CUNEIFORM SIGN BULUG OVER BULUG"/* 12052 */,/*37328*/"CUNEIFORM SIGN BUR"/* 12053 */, /*37329*/"CUNEIFORM SIGN BUR2"/* 12054 */,/*37330*/"CUNEIFORM SIGN DA"/* 12055 */, /*37331*/"CUNEIFORM SIGN DAG"/* 12056 */,/*37332*/"CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH"/* 12057 */, /*37333*/"CUNEIFORM SIGN DAG KISIM5 TIMES AMAR"/* 12058 */,/*37334*/"CUNEIFORM SIGN DAG KISIM5 TIMES BALAG"/* 12059 */, /*37335*/"CUNEIFORM SIGN DAG KISIM5 TIMES BI"/* 1205A */,/*37336*/"CUNEIFORM SIGN DAG KISIM5 TIMES GA"/* 1205B */, /*37337*/"CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH"/* 1205C */, /*37338*/"CUNEIFORM SIGN DAG KISIM5 TIMES GI"/* 1205D */,/*37339*/"CUNEIFORM SIGN DAG KISIM5 TIMES GIR2"/* 1205E */, /*37340*/"CUNEIFORM SIGN DAG KISIM5 TIMES GUD"/* 1205F */,/*37341*/"CUNEIFORM SIGN DAG KISIM5 TIMES HA"/* 12060 */, /*37342*/"CUNEIFORM SIGN DAG KISIM5 TIMES IR"/* 12061 */, /*37343*/"CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU"/* 12062 */, /*37344*/"CUNEIFORM SIGN DAG KISIM5 TIMES KAK"/* 12063 */,/*37345*/"CUNEIFORM SIGN DAG KISIM5 TIMES LA"/* 12064 */, /*37346*/"CUNEIFORM SIGN DAG KISIM5 TIMES LU"/* 12065 */, /*37347*/"CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2"/* 12066 */, /*37348*/"CUNEIFORM SIGN DAG KISIM5 TIMES LUM"/* 12067 */,/*37349*/"CUNEIFORM SIGN DAG KISIM5 TIMES NE"/* 12068 */, /*37350*/"CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP"/* 12069 */, /*37351*/"CUNEIFORM SIGN DAG KISIM5 TIMES SI"/* 1206A */,/*37352*/"CUNEIFORM SIGN DAG KISIM5 TIMES TAK4"/* 1206B */, /*37353*/"CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2"/* 1206C */, /*37354*/"CUNEIFORM SIGN DAG KISIM5 TIMES USH"/* 1206D */,/*37355*/"CUNEIFORM SIGN DAM"/* 1206E */, /*37356*/"CUNEIFORM SIGN DAR"/* 1206F */,/*37357*/"CUNEIFORM SIGN DARA3"/* 12070 */, /*37358*/"CUNEIFORM SIGN DARA4"/* 12071 */,/*37359*/"CUNEIFORM SIGN DI"/* 12072 */, /*37360*/"CUNEIFORM SIGN DIB"/* 12073 */,/*37361*/"CUNEIFORM SIGN DIM"/* 12074 */, /*37362*/"CUNEIFORM SIGN DIM TIMES SHE"/* 12075 */,/*37363*/"CUNEIFORM SIGN DIM2"/* 12076 */, /*37364*/"CUNEIFORM SIGN DIN"/* 12077 */,/*37365*/"CUNEIFORM SIGN DIN KASKAL U GUNU DISH"/* 12078 */, /*37366*/"CUNEIFORM SIGN DISH"/* 12079 */,/*37367*/"CUNEIFORM SIGN DU"/* 1207A */, /*37368*/"CUNEIFORM SIGN DU OVER DU"/* 1207B */,/*37369*/"CUNEIFORM SIGN DU GUNU"/* 1207C */, /*37370*/"CUNEIFORM SIGN DU SHESHIG"/* 1207D */,/*37371*/"CUNEIFORM SIGN DUB"/* 1207E */, /*37372*/"CUNEIFORM SIGN DUB TIMES ESH2"/* 1207F */,/*37373*/"CUNEIFORM SIGN DUB2"/* 12080 */, /*37374*/"CUNEIFORM SIGN DUG"/* 12081 */,/*37375*/"CUNEIFORM SIGN DUGUD"/* 12082 */, /*37376*/"CUNEIFORM SIGN DUH"/* 12083 */,/*37377*/"CUNEIFORM SIGN DUN"/* 12084 */, /*37378*/"CUNEIFORM SIGN DUN3"/* 12085 */,/*37379*/"CUNEIFORM SIGN DUN3 GUNU"/* 12086 */, /*37380*/"CUNEIFORM SIGN DUN3 GUNU GUNU"/* 12087 */,/*37381*/"CUNEIFORM SIGN DUN4"/* 12088 */, /*37382*/"CUNEIFORM SIGN DUR2"/* 12089 */,/*37383*/"CUNEIFORM SIGN E"/* 1208A */, /*37384*/"CUNEIFORM SIGN E TIMES PAP"/* 1208B */,/*37385*/"CUNEIFORM SIGN E OVER E NUN OVER NUN"/* 1208C */, /*37386*/"CUNEIFORM SIGN E2"/* 1208D */,/*37387*/"CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA"/* 1208E */, /*37388*/"CUNEIFORM SIGN E2 TIMES GAR"/* 1208F */,/*37389*/"CUNEIFORM SIGN E2 TIMES MI"/* 12090 */, /*37390*/"CUNEIFORM SIGN E2 TIMES SAL"/* 12091 */,/*37391*/"CUNEIFORM SIGN E2 TIMES SHE"/* 12092 */, /*37392*/"CUNEIFORM SIGN E2 TIMES U"/* 12093 */,/*37393*/"CUNEIFORM SIGN EDIN"/* 12094 */, /*37394*/"CUNEIFORM SIGN EGIR"/* 12095 */,/*37395*/"CUNEIFORM SIGN EL"/* 12096 */, /*37396*/"CUNEIFORM SIGN EN"/* 12097 */,/*37397*/"CUNEIFORM SIGN EN TIMES GAN2"/* 12098 */, /*37398*/"CUNEIFORM SIGN EN TIMES GAN2 TENU"/* 12099 */,/*37399*/"CUNEIFORM SIGN EN TIMES ME"/* 1209A */, /*37400*/"CUNEIFORM SIGN EN CROSSING EN"/* 1209B */,/*37401*/"CUNEIFORM SIGN EN OPPOSING EN"/* 1209C */, /*37402*/"CUNEIFORM SIGN EN SQUARED"/* 1209D */,/*37403*/"CUNEIFORM SIGN EREN"/* 1209E */, /*37404*/"CUNEIFORM SIGN ERIN2"/* 1209F */,/*37405*/"CUNEIFORM SIGN ESH2"/* 120A0 */, /*37406*/"CUNEIFORM SIGN EZEN"/* 120A1 */,/*37407*/"CUNEIFORM SIGN EZEN TIMES A"/* 120A2 */, /*37408*/"CUNEIFORM SIGN EZEN TIMES A PLUS LAL"/* 120A3 */, /*37409*/"CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL"/* 120A4 */,/*37410*/"CUNEIFORM SIGN EZEN TIMES AN"/* 120A5 */, /*37411*/"CUNEIFORM SIGN EZEN TIMES BAD"/* 120A6 */,/*37412*/"CUNEIFORM SIGN EZEN TIMES DUN3 GUNU"/* 120A7 */, /*37413*/"CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU"/* 120A8 */,/*37414*/"CUNEIFORM SIGN EZEN TIMES HA"/* 120A9 */, /*37415*/"CUNEIFORM SIGN EZEN TIMES HA GUNU"/* 120AA */,/*37416*/"CUNEIFORM SIGN EZEN TIMES IGI GUNU"/* 120AB */, /*37417*/"CUNEIFORM SIGN EZEN TIMES KASKAL"/* 120AC */,/*37418*/"CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED"/* 120AD */, /*37419*/"CUNEIFORM SIGN EZEN TIMES KU3"/* 120AE */,/*37420*/"CUNEIFORM SIGN EZEN TIMES LA"/* 120AF */, /*37421*/"CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL"/* 120B0 */,/*37422*/"CUNEIFORM SIGN EZEN TIMES LI"/* 120B1 */, /*37423*/"CUNEIFORM SIGN EZEN TIMES LU"/* 120B2 */,/*37424*/"CUNEIFORM SIGN EZEN TIMES U2"/* 120B3 */, /*37425*/"CUNEIFORM SIGN EZEN TIMES UD"/* 120B4 */,/*37426*/"CUNEIFORM SIGN GA"/* 120B5 */, /*37427*/"CUNEIFORM SIGN GA GUNU"/* 120B6 */,/*37428*/"CUNEIFORM SIGN GA2"/* 120B7 */, /*37429*/"CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA"/* 120B8 */, /*37430*/"CUNEIFORM SIGN GA2 TIMES A PLUS HA"/* 120B9 */,/*37431*/"CUNEIFORM SIGN GA2 TIMES A PLUS IGI"/* 120BA */, /*37432*/"CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB"/* 120BB */,/*37433*/"CUNEIFORM SIGN GA2 TIMES AN"/* 120BC */, /*37434*/"CUNEIFORM SIGN GA2 TIMES ASH"/* 120BD */,/*37435*/"CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL"/* 120BE */, /*37436*/"CUNEIFORM SIGN GA2 TIMES BAD"/* 120BF */,/*37437*/"CUNEIFORM SIGN GA2 TIMES BAR PLUS RA"/* 120C0 */, /*37438*/"CUNEIFORM SIGN GA2 TIMES BUR"/* 120C1 */,/*37439*/"CUNEIFORM SIGN GA2 TIMES BUR PLUS RA"/* 120C2 */, /*37440*/"CUNEIFORM SIGN GA2 TIMES DA"/* 120C3 */,/*37441*/"CUNEIFORM SIGN GA2 TIMES DI"/* 120C4 */, /*37442*/"CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE"/* 120C5 */,/*37443*/"CUNEIFORM SIGN GA2 TIMES DUB"/* 120C6 */, /*37444*/"CUNEIFORM SIGN GA2 TIMES EL"/* 120C7 */,/*37445*/"CUNEIFORM SIGN GA2 TIMES EL PLUS LA"/* 120C8 */, /*37446*/"CUNEIFORM SIGN GA2 TIMES EN"/* 120C9 */,/*37447*/"CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU"/* 120CA */, /*37448*/"CUNEIFORM SIGN GA2 TIMES GAN2 TENU"/* 120CB */,/*37449*/"CUNEIFORM SIGN GA2 TIMES GAR"/* 120CC */, /*37450*/"CUNEIFORM SIGN GA2 TIMES GI"/* 120CD */,/*37451*/"CUNEIFORM SIGN GA2 TIMES GI4"/* 120CE */, /*37452*/"CUNEIFORM SIGN GA2 TIMES GI4 PLUS A"/* 120CF */,/*37453*/"CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU"/* 120D0 */, /*37454*/"CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2"/* 120D1 */,/*37455*/"CUNEIFORM SIGN GA2 TIMES HAL"/* 120D2 */, /*37456*/"CUNEIFORM SIGN GA2 TIMES HAL PLUS LA"/* 120D3 */,/*37457*/"CUNEIFORM SIGN GA2 TIMES HI PLUS LI"/* 120D4 */, /*37458*/"CUNEIFORM SIGN GA2 TIMES HUB2"/* 120D5 */,/*37459*/"CUNEIFORM SIGN GA2 TIMES IGI GUNU"/* 120D6 */, /*37460*/"CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH"/* 120D7 */,/*37461*/"CUNEIFORM SIGN GA2 TIMES KAK"/* 120D8 */, /*37462*/"CUNEIFORM SIGN GA2 TIMES KASKAL"/* 120D9 */,/*37463*/"CUNEIFORM SIGN GA2 TIMES KID"/* 120DA */, /*37464*/"CUNEIFORM SIGN GA2 TIMES KID PLUS LAL"/* 120DB */,/*37465*/"CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN"/* 120DC */, /*37466*/"CUNEIFORM SIGN GA2 TIMES LA"/* 120DD */,/*37467*/"CUNEIFORM SIGN GA2 TIMES ME PLUS EN"/* 120DE */, /*37468*/"CUNEIFORM SIGN GA2 TIMES MI"/* 120DF */,/*37469*/"CUNEIFORM SIGN GA2 TIMES NUN"/* 120E0 */, /*37470*/"CUNEIFORM SIGN GA2 TIMES NUN OVER NUN"/* 120E1 */,/*37471*/"CUNEIFORM SIGN GA2 TIMES PA"/* 120E2 */, /*37472*/"CUNEIFORM SIGN GA2 TIMES SAL"/* 120E3 */,/*37473*/"CUNEIFORM SIGN GA2 TIMES SAR"/* 120E4 */, /*37474*/"CUNEIFORM SIGN GA2 TIMES SHE"/* 120E5 */,/*37475*/"CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR"/* 120E6 */, /*37476*/"CUNEIFORM SIGN GA2 TIMES SHID"/* 120E7 */,/*37477*/"CUNEIFORM SIGN GA2 TIMES SUM"/* 120E8 */, /*37478*/"CUNEIFORM SIGN GA2 TIMES TAK4"/* 120E9 */,/*37479*/"CUNEIFORM SIGN GA2 TIMES U"/* 120EA */, /*37480*/"CUNEIFORM SIGN GA2 TIMES UD"/* 120EB */,/*37481*/"CUNEIFORM SIGN GA2 TIMES UD PLUS DU"/* 120EC */, /*37482*/"CUNEIFORM SIGN GA2 OVER GA2"/* 120ED */,/*37483*/"CUNEIFORM SIGN GABA"/* 120EE */, /*37484*/"CUNEIFORM SIGN GABA CROSSING GABA"/* 120EF */,/*37485*/"CUNEIFORM SIGN GAD"/* 120F0 */, /*37486*/"CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR"/* 120F1 */,/*37487*/"CUNEIFORM SIGN GAL"/* 120F2 */, /*37488*/"CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR"/* 120F3 */,/*37489*/"CUNEIFORM SIGN GALAM"/* 120F4 */, /*37490*/"CUNEIFORM SIGN GAM"/* 120F5 */,/*37491*/"CUNEIFORM SIGN GAN"/* 120F6 */, /*37492*/"CUNEIFORM SIGN GAN2"/* 120F7 */,/*37493*/"CUNEIFORM SIGN GAN2 TENU"/* 120F8 */, /*37494*/"CUNEIFORM SIGN GAN2 OVER GAN2"/* 120F9 */,/*37495*/"CUNEIFORM SIGN GAN2 CROSSING GAN2"/* 120FA */, /*37496*/"CUNEIFORM SIGN GAR"/* 120FB */,/*37497*/"CUNEIFORM SIGN GAR3"/* 120FC */, /*37498*/"CUNEIFORM SIGN GASHAN"/* 120FD */,/*37499*/"CUNEIFORM SIGN GESHTIN"/* 120FE */, /*37500*/"CUNEIFORM SIGN GESHTIN TIMES KUR"/* 120FF */,/*37501*/"CUNEIFORM SIGN GI"/* 12100 */, /*37502*/"CUNEIFORM SIGN GI TIMES E"/* 12101 */,/*37503*/"CUNEIFORM SIGN GI TIMES U"/* 12102 */, /*37504*/"CUNEIFORM SIGN GI CROSSING GI"/* 12103 */,/*37505*/"CUNEIFORM SIGN GI4"/* 12104 */, /*37506*/"CUNEIFORM SIGN GI4 OVER GI4"/* 12105 */,/*37507*/"CUNEIFORM SIGN GI4 CROSSING GI4"/* 12106 */, /*37508*/"CUNEIFORM SIGN GIDIM"/* 12107 */,/*37509*/"CUNEIFORM SIGN GIR2"/* 12108 */, /*37510*/"CUNEIFORM SIGN GIR2 GUNU"/* 12109 */,/*37511*/"CUNEIFORM SIGN GIR3"/* 1210A */, /*37512*/"CUNEIFORM SIGN GIR3 TIMES A PLUS IGI"/* 1210B */,/*37513*/"CUNEIFORM SIGN GIR3 TIMES GAN2 TENU"/* 1210C */, /*37514*/"CUNEIFORM SIGN GIR3 TIMES IGI"/* 1210D */,/*37515*/"CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI"/* 1210E */, /*37516*/"CUNEIFORM SIGN GIR3 TIMES PA"/* 1210F */,/*37517*/"CUNEIFORM SIGN GISAL"/* 12110 */, /*37518*/"CUNEIFORM SIGN GISH"/* 12111 */,/*37519*/"CUNEIFORM SIGN GISH CROSSING GISH"/* 12112 */, /*37520*/"CUNEIFORM SIGN GISH TIMES BAD"/* 12113 */,/*37521*/"CUNEIFORM SIGN GISH TIMES TAK4"/* 12114 */, /*37522*/"CUNEIFORM SIGN GISH TENU"/* 12115 */,/*37523*/"CUNEIFORM SIGN GU"/* 12116 */, /*37524*/"CUNEIFORM SIGN GU CROSSING GU"/* 12117 */,/*37525*/"CUNEIFORM SIGN GU2"/* 12118 */, /*37526*/"CUNEIFORM SIGN GU2 TIMES KAK"/* 12119 */,/*37527*/"CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU"/* 1211A */, /*37528*/"CUNEIFORM SIGN GU2 TIMES NUN"/* 1211B */,/*37529*/"CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2"/* 1211C */, /*37530*/"CUNEIFORM SIGN GU2 GUNU"/* 1211D */,/*37531*/"CUNEIFORM SIGN GUD"/* 1211E */, /*37532*/"CUNEIFORM SIGN GUD TIMES A PLUS KUR"/* 1211F */,/*37533*/"CUNEIFORM SIGN GUD TIMES KUR"/* 12120 */, /*37534*/"CUNEIFORM SIGN GUD OVER GUD LUGAL"/* 12121 */,/*37535*/"CUNEIFORM SIGN GUL"/* 12122 */, /*37536*/"CUNEIFORM SIGN GUM"/* 12123 */,/*37537*/"CUNEIFORM SIGN GUM TIMES SHE"/* 12124 */, /*37538*/"CUNEIFORM SIGN GUR"/* 12125 */,/*37539*/"CUNEIFORM SIGN GUR7"/* 12126 */, /*37540*/"CUNEIFORM SIGN GURUN"/* 12127 */,/*37541*/"CUNEIFORM SIGN GURUSH"/* 12128 */, /*37542*/"CUNEIFORM SIGN HA"/* 12129 */,/*37543*/"CUNEIFORM SIGN HA TENU"/* 1212A */, /*37544*/"CUNEIFORM SIGN HA GUNU"/* 1212B */,/*37545*/"CUNEIFORM SIGN HAL"/* 1212C */, /*37546*/"CUNEIFORM SIGN HI"/* 1212D */,/*37547*/"CUNEIFORM SIGN HI TIMES ASH"/* 1212E */, /*37548*/"CUNEIFORM SIGN HI TIMES ASH2"/* 1212F */,/*37549*/"CUNEIFORM SIGN HI TIMES BAD"/* 12130 */, /*37550*/"CUNEIFORM SIGN HI TIMES DISH"/* 12131 */,/*37551*/"CUNEIFORM SIGN HI TIMES GAD"/* 12132 */, /*37552*/"CUNEIFORM SIGN HI TIMES KIN"/* 12133 */,/*37553*/"CUNEIFORM SIGN HI TIMES NUN"/* 12134 */, /*37554*/"CUNEIFORM SIGN HI TIMES SHE"/* 12135 */,/*37555*/"CUNEIFORM SIGN HI TIMES U"/* 12136 */, /*37556*/"CUNEIFORM SIGN HU"/* 12137 */,/*37557*/"CUNEIFORM SIGN HUB2"/* 12138 */, /*37558*/"CUNEIFORM SIGN HUB2 TIMES AN"/* 12139 */,/*37559*/"CUNEIFORM SIGN HUB2 TIMES HAL"/* 1213A */, /*37560*/"CUNEIFORM SIGN HUB2 TIMES KASKAL"/* 1213B */,/*37561*/"CUNEIFORM SIGN HUB2 TIMES LISH"/* 1213C */, /*37562*/"CUNEIFORM SIGN HUB2 TIMES UD"/* 1213D */,/*37563*/"CUNEIFORM SIGN HUL2"/* 1213E */, /*37564*/"CUNEIFORM SIGN I"/* 1213F */,/*37565*/"CUNEIFORM SIGN I A"/* 12140 */,/*37566*/"CUNEIFORM SIGN IB"/* 12141 */, /*37567*/"CUNEIFORM SIGN IDIM"/* 12142 */,/*37568*/"CUNEIFORM SIGN IDIM OVER IDIM BUR"/* 12143 */, /*37569*/"CUNEIFORM SIGN IDIM OVER IDIM SQUARED"/* 12144 */,/*37570*/"CUNEIFORM SIGN IG"/* 12145 */, /*37571*/"CUNEIFORM SIGN IGI"/* 12146 */,/*37572*/"CUNEIFORM SIGN IGI DIB"/* 12147 */, /*37573*/"CUNEIFORM SIGN IGI RI"/* 12148 */,/*37574*/"CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD"/* 12149 */, /*37575*/"CUNEIFORM SIGN IGI GUNU"/* 1214A */,/*37576*/"CUNEIFORM SIGN IL"/* 1214B */, /*37577*/"CUNEIFORM SIGN IL TIMES GAN2 TENU"/* 1214C */,/*37578*/"CUNEIFORM SIGN IL2"/* 1214D */, /*37579*/"CUNEIFORM SIGN IM"/* 1214E */,/*37580*/"CUNEIFORM SIGN IM TIMES TAK4"/* 1214F */, /*37581*/"CUNEIFORM SIGN IM CROSSING IM"/* 12150 */,/*37582*/"CUNEIFORM SIGN IM OPPOSING IM"/* 12151 */, /*37583*/"CUNEIFORM SIGN IM SQUARED"/* 12152 */,/*37584*/"CUNEIFORM SIGN IMIN"/* 12153 */, /*37585*/"CUNEIFORM SIGN IN"/* 12154 */,/*37586*/"CUNEIFORM SIGN IR"/* 12155 */,/*37587*/"CUNEIFORM SIGN ISH"/* 12156 */, /*37588*/"CUNEIFORM SIGN KA"/* 12157 */,/*37589*/"CUNEIFORM SIGN KA TIMES A"/* 12158 */, /*37590*/"CUNEIFORM SIGN KA TIMES AD"/* 12159 */,/*37591*/"CUNEIFORM SIGN KA TIMES AD PLUS KU3"/* 1215A */, /*37592*/"CUNEIFORM SIGN KA TIMES ASH2"/* 1215B */,/*37593*/"CUNEIFORM SIGN KA TIMES BAD"/* 1215C */, /*37594*/"CUNEIFORM SIGN KA TIMES BALAG"/* 1215D */,/*37595*/"CUNEIFORM SIGN KA TIMES BAR"/* 1215E */, /*37596*/"CUNEIFORM SIGN KA TIMES BI"/* 1215F */,/*37597*/"CUNEIFORM SIGN KA TIMES ERIN2"/* 12160 */, /*37598*/"CUNEIFORM SIGN KA TIMES ESH2"/* 12161 */,/*37599*/"CUNEIFORM SIGN KA TIMES GA"/* 12162 */, /*37600*/"CUNEIFORM SIGN KA TIMES GAL"/* 12163 */,/*37601*/"CUNEIFORM SIGN KA TIMES GAN2 TENU"/* 12164 */, /*37602*/"CUNEIFORM SIGN KA TIMES GAR"/* 12165 */,/*37603*/"CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A"/* 12166 */, /*37604*/"CUNEIFORM SIGN KA TIMES GI"/* 12167 */,/*37605*/"CUNEIFORM SIGN KA TIMES GIR2"/* 12168 */, /*37606*/"CUNEIFORM SIGN KA TIMES GISH PLUS SAR"/* 12169 */, /*37607*/"CUNEIFORM SIGN KA TIMES GISH CROSSING GISH"/* 1216A */,/*37608*/"CUNEIFORM SIGN KA TIMES GU"/* 1216B */, /*37609*/"CUNEIFORM SIGN KA TIMES GUR7"/* 1216C */,/*37610*/"CUNEIFORM SIGN KA TIMES IGI"/* 1216D */, /*37611*/"CUNEIFORM SIGN KA TIMES IM"/* 1216E */,/*37612*/"CUNEIFORM SIGN KA TIMES KAK"/* 1216F */, /*37613*/"CUNEIFORM SIGN KA TIMES KI"/* 12170 */,/*37614*/"CUNEIFORM SIGN KA TIMES KID"/* 12171 */, /*37615*/"CUNEIFORM SIGN KA TIMES LI"/* 12172 */,/*37616*/"CUNEIFORM SIGN KA TIMES LU"/* 12173 */, /*37617*/"CUNEIFORM SIGN KA TIMES ME"/* 12174 */,/*37618*/"CUNEIFORM SIGN KA TIMES ME PLUS DU"/* 12175 */, /*37619*/"CUNEIFORM SIGN KA TIMES ME PLUS GI"/* 12176 */,/*37620*/"CUNEIFORM SIGN KA TIMES ME PLUS TE"/* 12177 */, /*37621*/"CUNEIFORM SIGN KA TIMES MI"/* 12178 */,/*37622*/"CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ"/* 12179 */, /*37623*/"CUNEIFORM SIGN KA TIMES NE"/* 1217A */,/*37624*/"CUNEIFORM SIGN KA TIMES NUN"/* 1217B */, /*37625*/"CUNEIFORM SIGN KA TIMES PI"/* 1217C */,/*37626*/"CUNEIFORM SIGN KA TIMES RU"/* 1217D */, /*37627*/"CUNEIFORM SIGN KA TIMES SA"/* 1217E */,/*37628*/"CUNEIFORM SIGN KA TIMES SAR"/* 1217F */, /*37629*/"CUNEIFORM SIGN KA TIMES SHA"/* 12180 */,/*37630*/"CUNEIFORM SIGN KA TIMES SHE"/* 12181 */, /*37631*/"CUNEIFORM SIGN KA TIMES SHID"/* 12182 */,/*37632*/"CUNEIFORM SIGN KA TIMES SHU"/* 12183 */, /*37633*/"CUNEIFORM SIGN KA TIMES SIG"/* 12184 */,/*37634*/"CUNEIFORM SIGN KA TIMES SUHUR"/* 12185 */, /*37635*/"CUNEIFORM SIGN KA TIMES TAR"/* 12186 */,/*37636*/"CUNEIFORM SIGN KA TIMES U"/* 12187 */, /*37637*/"CUNEIFORM SIGN KA TIMES U2"/* 12188 */,/*37638*/"CUNEIFORM SIGN KA TIMES UD"/* 12189 */, /*37639*/"CUNEIFORM SIGN KA TIMES UMUM TIMES PA"/* 1218A */,/*37640*/"CUNEIFORM SIGN KA TIMES USH"/* 1218B */, /*37641*/"CUNEIFORM SIGN KA TIMES ZI"/* 1218C */,/*37642*/"CUNEIFORM SIGN KA2"/* 1218D */, /*37643*/"CUNEIFORM SIGN KA2 CROSSING KA2"/* 1218E */,/*37644*/"CUNEIFORM SIGN KAB"/* 1218F */, /*37645*/"CUNEIFORM SIGN KAD2"/* 12190 */,/*37646*/"CUNEIFORM SIGN KAD3"/* 12191 */, /*37647*/"CUNEIFORM SIGN KAD4"/* 12192 */,/*37648*/"CUNEIFORM SIGN KAD5"/* 12193 */, /*37649*/"CUNEIFORM SIGN KAD5 OVER KAD5"/* 12194 */,/*37650*/"CUNEIFORM SIGN KAK"/* 12195 */, /*37651*/"CUNEIFORM SIGN KAK TIMES IGI GUNU"/* 12196 */,/*37652*/"CUNEIFORM SIGN KAL"/* 12197 */, /*37653*/"CUNEIFORM SIGN KAL TIMES BAD"/* 12198 */,/*37654*/"CUNEIFORM SIGN KAL CROSSING KAL"/* 12199 */, /*37655*/"CUNEIFORM SIGN KAM2"/* 1219A */,/*37656*/"CUNEIFORM SIGN KAM4"/* 1219B */, /*37657*/"CUNEIFORM SIGN KASKAL"/* 1219C */,/*37658*/"CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U"/* 1219D */, /*37659*/"CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U"/* 1219E */, /*37660*/"CUNEIFORM SIGN KESH2"/* 1219F */,/*37661*/"CUNEIFORM SIGN KI"/* 121A0 */, /*37662*/"CUNEIFORM SIGN KI TIMES BAD"/* 121A1 */,/*37663*/"CUNEIFORM SIGN KI TIMES U"/* 121A2 */, /*37664*/"CUNEIFORM SIGN KI TIMES UD"/* 121A3 */,/*37665*/"CUNEIFORM SIGN KID"/* 121A4 */, /*37666*/"CUNEIFORM SIGN KIN"/* 121A5 */,/*37667*/"CUNEIFORM SIGN KISAL"/* 121A6 */, /*37668*/"CUNEIFORM SIGN KISH"/* 121A7 */,/*37669*/"CUNEIFORM SIGN KISIM5"/* 121A8 */, /*37670*/"CUNEIFORM SIGN KISIM5 OVER KISIM5"/* 121A9 */,/*37671*/"CUNEIFORM SIGN KU"/* 121AA */, /*37672*/"CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2"/* 121AB */, /*37673*/"CUNEIFORM SIGN KU3"/* 121AC */,/*37674*/"CUNEIFORM SIGN KU4"/* 121AD */, /*37675*/"CUNEIFORM SIGN KU4 VARIANT FORM"/* 121AE */,/*37676*/"CUNEIFORM SIGN KU7"/* 121AF */, /*37677*/"CUNEIFORM SIGN KUL"/* 121B0 */,/*37678*/"CUNEIFORM SIGN KUL GUNU"/* 121B1 */, /*37679*/"CUNEIFORM SIGN KUN"/* 121B2 */,/*37680*/"CUNEIFORM SIGN KUR"/* 121B3 */, /*37681*/"CUNEIFORM SIGN KUR OPPOSING KUR"/* 121B4 */,/*37682*/"CUNEIFORM SIGN KUSHU2"/* 121B5 */, /*37683*/"CUNEIFORM SIGN KWU318"/* 121B6 */,/*37684*/"CUNEIFORM SIGN LA"/* 121B7 */, /*37685*/"CUNEIFORM SIGN LAGAB"/* 121B8 */,/*37686*/"CUNEIFORM SIGN LAGAB TIMES A"/* 121B9 */, /*37687*/"CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA"/* 121BA */, /*37688*/"CUNEIFORM SIGN LAGAB TIMES A PLUS GAR"/* 121BB */,/*37689*/"CUNEIFORM SIGN LAGAB TIMES A PLUS LAL"/* 121BC */, /*37690*/"CUNEIFORM SIGN LAGAB TIMES AL"/* 121BD */,/*37691*/"CUNEIFORM SIGN LAGAB TIMES AN"/* 121BE */, /*37692*/"CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU"/* 121BF */,/*37693*/"CUNEIFORM SIGN LAGAB TIMES BAD"/* 121C0 */, /*37694*/"CUNEIFORM SIGN LAGAB TIMES BI"/* 121C1 */,/*37695*/"CUNEIFORM SIGN LAGAB TIMES DAR"/* 121C2 */, /*37696*/"CUNEIFORM SIGN LAGAB TIMES EN"/* 121C3 */,/*37697*/"CUNEIFORM SIGN LAGAB TIMES GA"/* 121C4 */, /*37698*/"CUNEIFORM SIGN LAGAB TIMES GAR"/* 121C5 */,/*37699*/"CUNEIFORM SIGN LAGAB TIMES GUD"/* 121C6 */, /*37700*/"CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD"/* 121C7 */,/*37701*/"CUNEIFORM SIGN LAGAB TIMES HA"/* 121C8 */, /*37702*/"CUNEIFORM SIGN LAGAB TIMES HAL"/* 121C9 */,/*37703*/"CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN"/* 121CA */, /*37704*/"CUNEIFORM SIGN LAGAB TIMES IGI GUNU"/* 121CB */,/*37705*/"CUNEIFORM SIGN LAGAB TIMES IM"/* 121CC */, /*37706*/"CUNEIFORM SIGN LAGAB TIMES IM PLUS HA"/* 121CD */,/*37707*/"CUNEIFORM SIGN LAGAB TIMES IM PLUS LU"/* 121CE */, /*37708*/"CUNEIFORM SIGN LAGAB TIMES KI"/* 121CF */,/*37709*/"CUNEIFORM SIGN LAGAB TIMES KIN"/* 121D0 */, /*37710*/"CUNEIFORM SIGN LAGAB TIMES KU3"/* 121D1 */,/*37711*/"CUNEIFORM SIGN LAGAB TIMES KUL"/* 121D2 */, /*37712*/"CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A"/* 121D3 */, /*37713*/"CUNEIFORM SIGN LAGAB TIMES LAGAB"/* 121D4 */,/*37714*/"CUNEIFORM SIGN LAGAB TIMES LISH"/* 121D5 */, /*37715*/"CUNEIFORM SIGN LAGAB TIMES LU"/* 121D6 */,/*37716*/"CUNEIFORM SIGN LAGAB TIMES LUL"/* 121D7 */, /*37717*/"CUNEIFORM SIGN LAGAB TIMES ME"/* 121D8 */,/*37718*/"CUNEIFORM SIGN LAGAB TIMES ME PLUS EN"/* 121D9 */, /*37719*/"CUNEIFORM SIGN LAGAB TIMES MUSH"/* 121DA */,/*37720*/"CUNEIFORM SIGN LAGAB TIMES NE"/* 121DB */, /*37721*/"CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM"/* 121DC */, /*37722*/"CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2"/* 121DD */, /*37723*/"CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU"/* 121DE */, /*37724*/"CUNEIFORM SIGN LAGAB TIMES SHU2"/* 121DF */,/*37725*/"CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2"/* 121E0 */, /*37726*/"CUNEIFORM SIGN LAGAB TIMES SUM"/* 121E1 */,/*37727*/"CUNEIFORM SIGN LAGAB TIMES TAG"/* 121E2 */, /*37728*/"CUNEIFORM SIGN LAGAB TIMES TAK4"/* 121E3 */, /*37729*/"CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA"/* 121E4 */, /*37730*/"CUNEIFORM SIGN LAGAB TIMES U"/* 121E5 */,/*37731*/"CUNEIFORM SIGN LAGAB TIMES U PLUS A"/* 121E6 */, /*37732*/"CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U"/* 121E7 */, /*37733*/"CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH"/* 121E8 */,/*37734*/"CUNEIFORM SIGN LAGAB TIMES UD"/* 121E9 */, /*37735*/"CUNEIFORM SIGN LAGAB TIMES USH"/* 121EA */,/*37736*/"CUNEIFORM SIGN LAGAB SQUARED"/* 121EB */, /*37737*/"CUNEIFORM SIGN LAGAR"/* 121EC */,/*37738*/"CUNEIFORM SIGN LAGAR TIMES SHE"/* 121ED */, /*37739*/"CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM"/* 121EE */,/*37740*/"CUNEIFORM SIGN LAGAR GUNU"/* 121EF */, /*37741*/"CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE"/* 121F0 */,/*37742*/"CUNEIFORM SIGN LAHSHU"/* 121F1 */, /*37743*/"CUNEIFORM SIGN LAL"/* 121F2 */,/*37744*/"CUNEIFORM SIGN LAL TIMES LAL"/* 121F3 */, /*37745*/"CUNEIFORM SIGN LAM"/* 121F4 */,/*37746*/"CUNEIFORM SIGN LAM TIMES KUR"/* 121F5 */, /*37747*/"CUNEIFORM SIGN LAM TIMES KUR PLUS RU"/* 121F6 */,/*37748*/"CUNEIFORM SIGN LI"/* 121F7 */, /*37749*/"CUNEIFORM SIGN LIL"/* 121F8 */,/*37750*/"CUNEIFORM SIGN LIMMU2"/* 121F9 */, /*37751*/"CUNEIFORM SIGN LISH"/* 121FA */,/*37752*/"CUNEIFORM SIGN LU"/* 121FB */, /*37753*/"CUNEIFORM SIGN LU TIMES BAD"/* 121FC */,/*37754*/"CUNEIFORM SIGN LU2"/* 121FD */, /*37755*/"CUNEIFORM SIGN LU2 TIMES AL"/* 121FE */,/*37756*/"CUNEIFORM SIGN LU2 TIMES BAD"/* 121FF */, /*37757*/"CUNEIFORM SIGN LU2 TIMES ESH2"/* 12200 */,/*37758*/"CUNEIFORM SIGN LU2 TIMES ESH2 TENU"/* 12201 */, /*37759*/"CUNEIFORM SIGN LU2 TIMES GAN2 TENU"/* 12202 */,/*37760*/"CUNEIFORM SIGN LU2 TIMES HI TIMES BAD"/* 12203 */, /*37761*/"CUNEIFORM SIGN LU2 TIMES IM"/* 12204 */,/*37762*/"CUNEIFORM SIGN LU2 TIMES KAD2"/* 12205 */, /*37763*/"CUNEIFORM SIGN LU2 TIMES KAD3"/* 12206 */,/*37764*/"CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH"/* 12207 */, /*37765*/"CUNEIFORM SIGN LU2 TIMES KI"/* 12208 */,/*37766*/"CUNEIFORM SIGN LU2 TIMES LA PLUS ASH"/* 12209 */, /*37767*/"CUNEIFORM SIGN LU2 TIMES LAGAB"/* 1220A */,/*37768*/"CUNEIFORM SIGN LU2 TIMES ME PLUS EN"/* 1220B */, /*37769*/"CUNEIFORM SIGN LU2 TIMES NE"/* 1220C */,/*37770*/"CUNEIFORM SIGN LU2 TIMES NU"/* 1220D */, /*37771*/"CUNEIFORM SIGN LU2 TIMES SI PLUS ASH"/* 1220E */,/*37772*/"CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU"/* 1220F */, /*37773*/"CUNEIFORM SIGN LU2 TIMES TUG2"/* 12210 */,/*37774*/"CUNEIFORM SIGN LU2 TENU"/* 12211 */, /*37775*/"CUNEIFORM SIGN LU2 CROSSING LU2"/* 12212 */,/*37776*/"CUNEIFORM SIGN LU2 OPPOSING LU2"/* 12213 */, /*37777*/"CUNEIFORM SIGN LU2 SQUARED"/* 12214 */,/*37778*/"CUNEIFORM SIGN LU2 SHESHIG"/* 12215 */, /*37779*/"CUNEIFORM SIGN LU3"/* 12216 */,/*37780*/"CUNEIFORM SIGN LUGAL"/* 12217 */, /*37781*/"CUNEIFORM SIGN LUGAL OVER LUGAL"/* 12218 */,/*37782*/"CUNEIFORM SIGN LUGAL OPPOSING LUGAL"/* 12219 */, /*37783*/"CUNEIFORM SIGN LUGAL SHESHIG"/* 1221A */,/*37784*/"CUNEIFORM SIGN LUH"/* 1221B */, /*37785*/"CUNEIFORM SIGN LUL"/* 1221C */,/*37786*/"CUNEIFORM SIGN LUM"/* 1221D */, /*37787*/"CUNEIFORM SIGN LUM OVER LUM"/* 1221E */,/*37788*/"CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR"/* 1221F */, /*37789*/"CUNEIFORM SIGN MA"/* 12220 */,/*37790*/"CUNEIFORM SIGN MA TIMES TAK4"/* 12221 */, /*37791*/"CUNEIFORM SIGN MA GUNU"/* 12222 */,/*37792*/"CUNEIFORM SIGN MA2"/* 12223 */, /*37793*/"CUNEIFORM SIGN MAH"/* 12224 */,/*37794*/"CUNEIFORM SIGN MAR"/* 12225 */, /*37795*/"CUNEIFORM SIGN MASH"/* 12226 */,/*37796*/"CUNEIFORM SIGN MASH2"/* 12227 */, /*37797*/"CUNEIFORM SIGN ME"/* 12228 */,/*37798*/"CUNEIFORM SIGN MES"/* 12229 */,/*37799*/"CUNEIFORM SIGN MI"/* 1222A */, /*37800*/"CUNEIFORM SIGN MIN"/* 1222B */,/*37801*/"CUNEIFORM SIGN MU"/* 1222C */, /*37802*/"CUNEIFORM SIGN MU OVER MU"/* 1222D */,/*37803*/"CUNEIFORM SIGN MUG"/* 1222E */, /*37804*/"CUNEIFORM SIGN MUG GUNU"/* 1222F */,/*37805*/"CUNEIFORM SIGN MUNSUB"/* 12230 */, /*37806*/"CUNEIFORM SIGN MURGU2"/* 12231 */,/*37807*/"CUNEIFORM SIGN MUSH"/* 12232 */, /*37808*/"CUNEIFORM SIGN MUSH TIMES A"/* 12233 */,/*37809*/"CUNEIFORM SIGN MUSH TIMES KUR"/* 12234 */, /*37810*/"CUNEIFORM SIGN MUSH TIMES ZA"/* 12235 */,/*37811*/"CUNEIFORM SIGN MUSH OVER MUSH"/* 12236 */, /*37812*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA"/* 12237 */, /*37813*/"CUNEIFORM SIGN MUSH CROSSING MUSH"/* 12238 */,/*37814*/"CUNEIFORM SIGN MUSH3"/* 12239 */, /*37815*/"CUNEIFORM SIGN MUSH3 TIMES A"/* 1223A */,/*37816*/"CUNEIFORM SIGN MUSH3 TIMES A PLUS DI"/* 1223B */, /*37817*/"CUNEIFORM SIGN MUSH3 TIMES DI"/* 1223C */,/*37818*/"CUNEIFORM SIGN MUSH3 GUNU"/* 1223D */, /*37819*/"CUNEIFORM SIGN NA"/* 1223E */,/*37820*/"CUNEIFORM SIGN NA2"/* 1223F */, /*37821*/"CUNEIFORM SIGN NAGA"/* 12240 */,/*37822*/"CUNEIFORM SIGN NAGA INVERTED"/* 12241 */, /*37823*/"CUNEIFORM SIGN NAGA TIMES SHU TENU"/* 12242 */,/*37824*/"CUNEIFORM SIGN NAGA OPPOSING NAGA"/* 12243 */, /*37825*/"CUNEIFORM SIGN NAGAR"/* 12244 */,/*37826*/"CUNEIFORM SIGN NAM NUTILLU"/* 12245 */, /*37827*/"CUNEIFORM SIGN NAM"/* 12246 */,/*37828*/"CUNEIFORM SIGN NAM2"/* 12247 */, /*37829*/"CUNEIFORM SIGN NE"/* 12248 */,/*37830*/"CUNEIFORM SIGN NE TIMES A"/* 12249 */, /*37831*/"CUNEIFORM SIGN NE TIMES UD"/* 1224A */,/*37832*/"CUNEIFORM SIGN NE SHESHIG"/* 1224B */, /*37833*/"CUNEIFORM SIGN NI"/* 1224C */,/*37834*/"CUNEIFORM SIGN NI TIMES E"/* 1224D */, /*37835*/"CUNEIFORM SIGN NI2"/* 1224E */,/*37836*/"CUNEIFORM SIGN NIM"/* 1224F */, /*37837*/"CUNEIFORM SIGN NIM TIMES GAN2 TENU"/* 12250 */, /*37838*/"CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU"/* 12251 */,/*37839*/"CUNEIFORM SIGN NINDA2"/* 12252 */, /*37840*/"CUNEIFORM SIGN NINDA2 TIMES AN"/* 12253 */,/*37841*/"CUNEIFORM SIGN NINDA2 TIMES ASH"/* 12254 */, /*37842*/"CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH"/* 12255 */,/*37843*/"CUNEIFORM SIGN NINDA2 TIMES GUD"/* 12256 */, /*37844*/"CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU"/* 12257 */,/*37845*/"CUNEIFORM SIGN NINDA2 TIMES NE"/* 12258 */, /*37846*/"CUNEIFORM SIGN NINDA2 TIMES NUN"/* 12259 */,/*37847*/"CUNEIFORM SIGN NINDA2 TIMES SHE"/* 1225A */, /*37848*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN"/* 1225B */, /*37849*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH"/* 1225C */, /*37850*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH"/* 1225D */, /*37851*/"CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH"/* 1225E */,/*37852*/"CUNEIFORM SIGN NINDA2 TIMES USH"/* 1225F */, /*37853*/"CUNEIFORM SIGN NISAG"/* 12260 */,/*37854*/"CUNEIFORM SIGN NU"/* 12261 */, /*37855*/"CUNEIFORM SIGN NU11"/* 12262 */,/*37856*/"CUNEIFORM SIGN NUN"/* 12263 */, /*37857*/"CUNEIFORM SIGN NUN LAGAR TIMES GAR"/* 12264 */,/*37858*/"CUNEIFORM SIGN NUN LAGAR TIMES MASH"/* 12265 */, /*37859*/"CUNEIFORM SIGN NUN LAGAR TIMES SAL"/* 12266 */, /*37860*/"CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL"/* 12267 */, /*37861*/"CUNEIFORM SIGN NUN LAGAR TIMES USH"/* 12268 */,/*37862*/"CUNEIFORM SIGN NUN TENU"/* 12269 */, /*37863*/"CUNEIFORM SIGN NUN OVER NUN"/* 1226A */,/*37864*/"CUNEIFORM SIGN NUN CROSSING NUN"/* 1226B */, /*37865*/"CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR"/* 1226C */,/*37866*/"CUNEIFORM SIGN NUNUZ"/* 1226D */, /*37867*/"CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB"/* 1226E */,/*37868*/"CUNEIFORM SIGN NUNUZ AB2 TIMES BI"/* 1226F */, /*37869*/"CUNEIFORM SIGN NUNUZ AB2 TIMES DUG"/* 12270 */,/*37870*/"CUNEIFORM SIGN NUNUZ AB2 TIMES GUD"/* 12271 */, /*37871*/"CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU"/* 12272 */,/*37872*/"CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3"/* 12273 */, /*37873*/"CUNEIFORM SIGN NUNUZ AB2 TIMES LA"/* 12274 */,/*37874*/"CUNEIFORM SIGN NUNUZ AB2 TIMES NE"/* 12275 */, /*37875*/"CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3"/* 12276 */,/*37876*/"CUNEIFORM SIGN NUNUZ AB2 TIMES U2"/* 12277 */, /*37877*/"CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI"/* 12278 */,/*37878*/"CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U"/* 12279 */, /*37879*/"CUNEIFORM SIGN PA"/* 1227A */,/*37880*/"CUNEIFORM SIGN PAD"/* 1227B */, /*37881*/"CUNEIFORM SIGN PAN"/* 1227C */,/*37882*/"CUNEIFORM SIGN PAP"/* 1227D */, /*37883*/"CUNEIFORM SIGN PESH2"/* 1227E */,/*37884*/"CUNEIFORM SIGN PI"/* 1227F */, /*37885*/"CUNEIFORM SIGN PI TIMES A"/* 12280 */,/*37886*/"CUNEIFORM SIGN PI TIMES AB"/* 12281 */, /*37887*/"CUNEIFORM SIGN PI TIMES BI"/* 12282 */,/*37888*/"CUNEIFORM SIGN PI TIMES BU"/* 12283 */, /*37889*/"CUNEIFORM SIGN PI TIMES E"/* 12284 */,/*37890*/"CUNEIFORM SIGN PI TIMES I"/* 12285 */, /*37891*/"CUNEIFORM SIGN PI TIMES IB"/* 12286 */,/*37892*/"CUNEIFORM SIGN PI TIMES U"/* 12287 */, /*37893*/"CUNEIFORM SIGN PI TIMES U2"/* 12288 */,/*37894*/"CUNEIFORM SIGN PI CROSSING PI"/* 12289 */, /*37895*/"CUNEIFORM SIGN PIRIG"/* 1228A */,/*37896*/"CUNEIFORM SIGN PIRIG TIMES KAL"/* 1228B */, /*37897*/"CUNEIFORM SIGN PIRIG TIMES UD"/* 1228C */,/*37898*/"CUNEIFORM SIGN PIRIG TIMES ZA"/* 1228D */, /*37899*/"CUNEIFORM SIGN PIRIG OPPOSING PIRIG"/* 1228E */,/*37900*/"CUNEIFORM SIGN RA"/* 1228F */, /*37901*/"CUNEIFORM SIGN RAB"/* 12290 */,/*37902*/"CUNEIFORM SIGN RI"/* 12291 */,/*37903*/"CUNEIFORM SIGN RU"/* 12292 */, /*37904*/"CUNEIFORM SIGN SA"/* 12293 */,/*37905*/"CUNEIFORM SIGN SAG NUTILLU"/* 12294 */, /*37906*/"CUNEIFORM SIGN SAG"/* 12295 */,/*37907*/"CUNEIFORM SIGN SAG TIMES A"/* 12296 */, /*37908*/"CUNEIFORM SIGN SAG TIMES DU"/* 12297 */,/*37909*/"CUNEIFORM SIGN SAG TIMES DUB"/* 12298 */, /*37910*/"CUNEIFORM SIGN SAG TIMES HA"/* 12299 */,/*37911*/"CUNEIFORM SIGN SAG TIMES KAK"/* 1229A */, /*37912*/"CUNEIFORM SIGN SAG TIMES KUR"/* 1229B */,/*37913*/"CUNEIFORM SIGN SAG TIMES LUM"/* 1229C */, /*37914*/"CUNEIFORM SIGN SAG TIMES MI"/* 1229D */,/*37915*/"CUNEIFORM SIGN SAG TIMES NUN"/* 1229E */, /*37916*/"CUNEIFORM SIGN SAG TIMES SAL"/* 1229F */,/*37917*/"CUNEIFORM SIGN SAG TIMES SHID"/* 122A0 */, /*37918*/"CUNEIFORM SIGN SAG TIMES TAB"/* 122A1 */,/*37919*/"CUNEIFORM SIGN SAG TIMES U2"/* 122A2 */, /*37920*/"CUNEIFORM SIGN SAG TIMES UB"/* 122A3 */,/*37921*/"CUNEIFORM SIGN SAG TIMES UM"/* 122A4 */, /*37922*/"CUNEIFORM SIGN SAG TIMES UR"/* 122A5 */,/*37923*/"CUNEIFORM SIGN SAG TIMES USH"/* 122A6 */, /*37924*/"CUNEIFORM SIGN SAG OVER SAG"/* 122A7 */,/*37925*/"CUNEIFORM SIGN SAG GUNU"/* 122A8 */, /*37926*/"CUNEIFORM SIGN SAL"/* 122A9 */,/*37927*/"CUNEIFORM SIGN SAL LAGAB TIMES ASH2"/* 122AA */, /*37928*/"CUNEIFORM SIGN SANGA2"/* 122AB */,/*37929*/"CUNEIFORM SIGN SAR"/* 122AC */, /*37930*/"CUNEIFORM SIGN SHA"/* 122AD */,/*37931*/"CUNEIFORM SIGN SHA3"/* 122AE */, /*37932*/"CUNEIFORM SIGN SHA3 TIMES A"/* 122AF */,/*37933*/"CUNEIFORM SIGN SHA3 TIMES BAD"/* 122B0 */, /*37934*/"CUNEIFORM SIGN SHA3 TIMES GISH"/* 122B1 */,/*37935*/"CUNEIFORM SIGN SHA3 TIMES NE"/* 122B2 */, /*37936*/"CUNEIFORM SIGN SHA3 TIMES SHU2"/* 122B3 */,/*37937*/"CUNEIFORM SIGN SHA3 TIMES TUR"/* 122B4 */, /*37938*/"CUNEIFORM SIGN SHA3 TIMES U"/* 122B5 */,/*37939*/"CUNEIFORM SIGN SHA3 TIMES U PLUS A"/* 122B6 */, /*37940*/"CUNEIFORM SIGN SHA6"/* 122B7 */,/*37941*/"CUNEIFORM SIGN SHAB6"/* 122B8 */, /*37942*/"CUNEIFORM SIGN SHAR2"/* 122B9 */,/*37943*/"CUNEIFORM SIGN SHE"/* 122BA */, /*37944*/"CUNEIFORM SIGN SHE HU"/* 122BB */,/*37945*/"CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR"/* 122BC */, /*37946*/"CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR"/* 122BD */,/*37947*/"CUNEIFORM SIGN SHEG9"/* 122BE */, /*37948*/"CUNEIFORM SIGN SHEN"/* 122BF */,/*37949*/"CUNEIFORM SIGN SHESH"/* 122C0 */, /*37950*/"CUNEIFORM SIGN SHESH2"/* 122C1 */,/*37951*/"CUNEIFORM SIGN SHESHLAM"/* 122C2 */, /*37952*/"CUNEIFORM SIGN SHID"/* 122C3 */,/*37953*/"CUNEIFORM SIGN SHID TIMES A"/* 122C4 */, /*37954*/"CUNEIFORM SIGN SHID TIMES IM"/* 122C5 */,/*37955*/"CUNEIFORM SIGN SHIM"/* 122C6 */, /*37956*/"CUNEIFORM SIGN SHIM TIMES A"/* 122C7 */,/*37957*/"CUNEIFORM SIGN SHIM TIMES BAL"/* 122C8 */, /*37958*/"CUNEIFORM SIGN SHIM TIMES BULUG"/* 122C9 */,/*37959*/"CUNEIFORM SIGN SHIM TIMES DIN"/* 122CA */, /*37960*/"CUNEIFORM SIGN SHIM TIMES GAR"/* 122CB */,/*37961*/"CUNEIFORM SIGN SHIM TIMES IGI"/* 122CC */, /*37962*/"CUNEIFORM SIGN SHIM TIMES IGI GUNU"/* 122CD */,/*37963*/"CUNEIFORM SIGN SHIM TIMES KUSHU2"/* 122CE */, /*37964*/"CUNEIFORM SIGN SHIM TIMES LUL"/* 122CF */,/*37965*/"CUNEIFORM SIGN SHIM TIMES MUG"/* 122D0 */, /*37966*/"CUNEIFORM SIGN SHIM TIMES SAL"/* 122D1 */,/*37967*/"CUNEIFORM SIGN SHINIG"/* 122D2 */, /*37968*/"CUNEIFORM SIGN SHIR"/* 122D3 */,/*37969*/"CUNEIFORM SIGN SHIR TENU"/* 122D4 */, /*37970*/"CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR"/* 122D5 */,/*37971*/"CUNEIFORM SIGN SHITA"/* 122D6 */, /*37972*/"CUNEIFORM SIGN SHU"/* 122D7 */,/*37973*/"CUNEIFORM SIGN SHU OVER INVERTED SHU"/* 122D8 */, /*37974*/"CUNEIFORM SIGN SHU2"/* 122D9 */,/*37975*/"CUNEIFORM SIGN SHUBUR"/* 122DA */, /*37976*/"CUNEIFORM SIGN SI"/* 122DB */,/*37977*/"CUNEIFORM SIGN SI GUNU"/* 122DC */, /*37978*/"CUNEIFORM SIGN SIG"/* 122DD */,/*37979*/"CUNEIFORM SIGN SIG4"/* 122DE */, /*37980*/"CUNEIFORM SIGN SIG4 OVER SIG4 SHU2"/* 122DF */,/*37981*/"CUNEIFORM SIGN SIK2"/* 122E0 */, /*37982*/"CUNEIFORM SIGN SILA3"/* 122E1 */,/*37983*/"CUNEIFORM SIGN SU"/* 122E2 */, /*37984*/"CUNEIFORM SIGN SU OVER SU"/* 122E3 */,/*37985*/"CUNEIFORM SIGN SUD"/* 122E4 */, /*37986*/"CUNEIFORM SIGN SUD2"/* 122E5 */,/*37987*/"CUNEIFORM SIGN SUHUR"/* 122E6 */, /*37988*/"CUNEIFORM SIGN SUM"/* 122E7 */,/*37989*/"CUNEIFORM SIGN SUMASH"/* 122E8 */, /*37990*/"CUNEIFORM SIGN SUR"/* 122E9 */,/*37991*/"CUNEIFORM SIGN SUR9"/* 122EA */, /*37992*/"CUNEIFORM SIGN TA"/* 122EB */,/*37993*/"CUNEIFORM SIGN TA ASTERISK"/* 122EC */, /*37994*/"CUNEIFORM SIGN TA TIMES HI"/* 122ED */,/*37995*/"CUNEIFORM SIGN TA TIMES MI"/* 122EE */, /*37996*/"CUNEIFORM SIGN TA GUNU"/* 122EF */,/*37997*/"CUNEIFORM SIGN TAB"/* 122F0 */, /*37998*/"CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH"/* 122F1 */, /*37999*/"CUNEIFORM SIGN TAB SQUARED"/* 122F2 */,/*38000*/"CUNEIFORM SIGN TAG"/* 122F3 */, /*38001*/"CUNEIFORM SIGN TAG TIMES BI"/* 122F4 */,/*38002*/"CUNEIFORM SIGN TAG TIMES GUD"/* 122F5 */, /*38003*/"CUNEIFORM SIGN TAG TIMES SHE"/* 122F6 */,/*38004*/"CUNEIFORM SIGN TAG TIMES SHU"/* 122F7 */, /*38005*/"CUNEIFORM SIGN TAG TIMES TUG2"/* 122F8 */,/*38006*/"CUNEIFORM SIGN TAG TIMES UD"/* 122F9 */, /*38007*/"CUNEIFORM SIGN TAK4"/* 122FA */,/*38008*/"CUNEIFORM SIGN TAR"/* 122FB */, /*38009*/"CUNEIFORM SIGN TE"/* 122FC */,/*38010*/"CUNEIFORM SIGN TE GUNU"/* 122FD */, /*38011*/"CUNEIFORM SIGN TI"/* 122FE */,/*38012*/"CUNEIFORM SIGN TI TENU"/* 122FF */, /*38013*/"CUNEIFORM SIGN TIL"/* 12300 */,/*38014*/"CUNEIFORM SIGN TIR"/* 12301 */, /*38015*/"CUNEIFORM SIGN TIR TIMES TAK4"/* 12302 */,/*38016*/"CUNEIFORM SIGN TIR OVER TIR"/* 12303 */, /*38017*/"CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR"/* 12304 */,/*38018*/"CUNEIFORM SIGN TU"/* 12305 */, /*38019*/"CUNEIFORM SIGN TUG2"/* 12306 */,/*38020*/"CUNEIFORM SIGN TUK"/* 12307 */, /*38021*/"CUNEIFORM SIGN TUM"/* 12308 */,/*38022*/"CUNEIFORM SIGN TUR"/* 12309 */, /*38023*/"CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA"/* 1230A */,/*38024*/"CUNEIFORM SIGN U"/* 1230B */, /*38025*/"CUNEIFORM SIGN U GUD"/* 1230C */,/*38026*/"CUNEIFORM SIGN U U U"/* 1230D */, /*38027*/"CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR"/* 1230E */, /*38028*/"CUNEIFORM SIGN U OVER U SUR OVER SUR"/* 1230F */, /*38029*/"CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED"/* 12310 */,/*38030*/"CUNEIFORM SIGN U2"/* 12311 */, /*38031*/"CUNEIFORM SIGN UB"/* 12312 */,/*38032*/"CUNEIFORM SIGN UD"/* 12313 */, /*38033*/"CUNEIFORM SIGN UD KUSHU2"/* 12314 */,/*38034*/"CUNEIFORM SIGN UD TIMES BAD"/* 12315 */, /*38035*/"CUNEIFORM SIGN UD TIMES MI"/* 12316 */,/*38036*/"CUNEIFORM SIGN UD TIMES U PLUS U PLUS U"/* 12317 */, /*38037*/"CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU"/* 12318 */,/*38038*/"CUNEIFORM SIGN UD GUNU"/* 12319 */, /*38039*/"CUNEIFORM SIGN UD SHESHIG"/* 1231A */,/*38040*/"CUNEIFORM SIGN UD SHESHIG TIMES BAD"/* 1231B */, /*38041*/"CUNEIFORM SIGN UDUG"/* 1231C */,/*38042*/"CUNEIFORM SIGN UM"/* 1231D */, /*38043*/"CUNEIFORM SIGN UM TIMES LAGAB"/* 1231E */,/*38044*/"CUNEIFORM SIGN UM TIMES ME PLUS DA"/* 1231F */, /*38045*/"CUNEIFORM SIGN UM TIMES SHA3"/* 12320 */,/*38046*/"CUNEIFORM SIGN UM TIMES U"/* 12321 */, /*38047*/"CUNEIFORM SIGN UMBIN"/* 12322 */,/*38048*/"CUNEIFORM SIGN UMUM"/* 12323 */, /*38049*/"CUNEIFORM SIGN UMUM TIMES KASKAL"/* 12324 */,/*38050*/"CUNEIFORM SIGN UMUM TIMES PA"/* 12325 */, /*38051*/"CUNEIFORM SIGN UN"/* 12326 */,/*38052*/"CUNEIFORM SIGN UN GUNU"/* 12327 */, /*38053*/"CUNEIFORM SIGN UR"/* 12328 */,/*38054*/"CUNEIFORM SIGN UR CROSSING UR"/* 12329 */, /*38055*/"CUNEIFORM SIGN UR SHESHIG"/* 1232A */,/*38056*/"CUNEIFORM SIGN UR2"/* 1232B */, /*38057*/"CUNEIFORM SIGN UR2 TIMES A PLUS HA"/* 1232C */,/*38058*/"CUNEIFORM SIGN UR2 TIMES A PLUS NA"/* 1232D */, /*38059*/"CUNEIFORM SIGN UR2 TIMES AL"/* 1232E */,/*38060*/"CUNEIFORM SIGN UR2 TIMES HA"/* 1232F */, /*38061*/"CUNEIFORM SIGN UR2 TIMES NUN"/* 12330 */,/*38062*/"CUNEIFORM SIGN UR2 TIMES U2"/* 12331 */, /*38063*/"CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH"/* 12332 */,/*38064*/"CUNEIFORM SIGN UR2 TIMES U2 PLUS BI"/* 12333 */, /*38065*/"CUNEIFORM SIGN UR4"/* 12334 */,/*38066*/"CUNEIFORM SIGN URI"/* 12335 */, /*38067*/"CUNEIFORM SIGN URI3"/* 12336 */,/*38068*/"CUNEIFORM SIGN URU"/* 12337 */, /*38069*/"CUNEIFORM SIGN URU TIMES A"/* 12338 */,/*38070*/"CUNEIFORM SIGN URU TIMES ASHGAB"/* 12339 */, /*38071*/"CUNEIFORM SIGN URU TIMES BAR"/* 1233A */,/*38072*/"CUNEIFORM SIGN URU TIMES DUN"/* 1233B */, /*38073*/"CUNEIFORM SIGN URU TIMES GA"/* 1233C */,/*38074*/"CUNEIFORM SIGN URU TIMES GAL"/* 1233D */, /*38075*/"CUNEIFORM SIGN URU TIMES GAN2 TENU"/* 1233E */,/*38076*/"CUNEIFORM SIGN URU TIMES GAR"/* 1233F */, /*38077*/"CUNEIFORM SIGN URU TIMES GU"/* 12340 */,/*38078*/"CUNEIFORM SIGN URU TIMES HA"/* 12341 */, /*38079*/"CUNEIFORM SIGN URU TIMES IGI"/* 12342 */,/*38080*/"CUNEIFORM SIGN URU TIMES IM"/* 12343 */, /*38081*/"CUNEIFORM SIGN URU TIMES ISH"/* 12344 */,/*38082*/"CUNEIFORM SIGN URU TIMES KI"/* 12345 */, /*38083*/"CUNEIFORM SIGN URU TIMES LUM"/* 12346 */,/*38084*/"CUNEIFORM SIGN URU TIMES MIN"/* 12347 */, /*38085*/"CUNEIFORM SIGN URU TIMES PA"/* 12348 */,/*38086*/"CUNEIFORM SIGN URU TIMES SHE"/* 12349 */, /*38087*/"CUNEIFORM SIGN URU TIMES SIG4"/* 1234A */,/*38088*/"CUNEIFORM SIGN URU TIMES TU"/* 1234B */, /*38089*/"CUNEIFORM SIGN URU TIMES U PLUS GUD"/* 1234C */,/*38090*/"CUNEIFORM SIGN URU TIMES UD"/* 1234D */, /*38091*/"CUNEIFORM SIGN URU TIMES URUDA"/* 1234E */,/*38092*/"CUNEIFORM SIGN URUDA"/* 1234F */, /*38093*/"CUNEIFORM SIGN URUDA TIMES U"/* 12350 */,/*38094*/"CUNEIFORM SIGN USH"/* 12351 */, /*38095*/"CUNEIFORM SIGN USH TIMES A"/* 12352 */,/*38096*/"CUNEIFORM SIGN USH TIMES KU"/* 12353 */, /*38097*/"CUNEIFORM SIGN USH TIMES KUR"/* 12354 */,/*38098*/"CUNEIFORM SIGN USH TIMES TAK4"/* 12355 */, /*38099*/"CUNEIFORM SIGN USHX"/* 12356 */,/*38100*/"CUNEIFORM SIGN USH2"/* 12357 */, /*38101*/"CUNEIFORM SIGN USHUMX"/* 12358 */,/*38102*/"CUNEIFORM SIGN UTUKI"/* 12359 */, /*38103*/"CUNEIFORM SIGN UZ3"/* 1235A */,/*38104*/"CUNEIFORM SIGN UZ3 TIMES KASKAL"/* 1235B */, /*38105*/"CUNEIFORM SIGN UZU"/* 1235C */,/*38106*/"CUNEIFORM SIGN ZA"/* 1235D */, /*38107*/"CUNEIFORM SIGN ZA TENU"/* 1235E */,/*38108*/"CUNEIFORM SIGN ZA SQUARED TIMES KUR"/* 1235F */, /*38109*/"CUNEIFORM SIGN ZAG"/* 12360 */,/*38110*/"CUNEIFORM SIGN ZAMX"/* 12361 */, /*38111*/"CUNEIFORM SIGN ZE2"/* 12362 */,/*38112*/"CUNEIFORM SIGN ZI"/* 12363 */, /*38113*/"CUNEIFORM SIGN ZI OVER ZI"/* 12364 */,/*38114*/"CUNEIFORM SIGN ZI3"/* 12365 */, /*38115*/"CUNEIFORM SIGN ZIB"/* 12366 */,/*38116*/"CUNEIFORM SIGN ZIB KABA TENU"/* 12367 */, /*38117*/"CUNEIFORM SIGN ZIG"/* 12368 */,/*38118*/"CUNEIFORM SIGN ZIZ2"/* 12369 */, /*38119*/"CUNEIFORM SIGN ZU"/* 1236A */,/*38120*/"CUNEIFORM SIGN ZU5"/* 1236B */, /*38121*/"CUNEIFORM SIGN ZU5 TIMES A"/* 1236C */,/*38122*/"CUNEIFORM SIGN ZUBUR"/* 1236D */, /*38123*/"CUNEIFORM SIGN ZUM"/* 1236E */,/*38124*/"CUNEIFORM SIGN KAP ELAMITE"/* 1236F */, /*38125*/"CUNEIFORM SIGN AB TIMES NUN"/* 12370 */,/*38126*/"CUNEIFORM SIGN AB2 TIMES A"/* 12371 */, /*38127*/"CUNEIFORM SIGN AMAR TIMES KUG"/* 12372 */,/*38128*/"CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH"/* 12373 */, /*38129*/"CUNEIFORM SIGN DAG3"/* 12374 */,/*38130*/"CUNEIFORM SIGN DISH PLUS SHU"/* 12375 */, /*38131*/"CUNEIFORM SIGN DUB TIMES SHE"/* 12376 */,/*38132*/"CUNEIFORM SIGN EZEN TIMES GUD"/* 12377 */, /*38133*/"CUNEIFORM SIGN EZEN TIMES SHE"/* 12378 */,/*38134*/"CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A"/* 12379 */, /*38135*/"CUNEIFORM SIGN GA2 TIMES ASH2"/* 1237A */,/*38136*/"CUNEIFORM SIGN GE22"/* 1237B */, /*38137*/"CUNEIFORM SIGN GIG"/* 1237C */,/*38138*/"CUNEIFORM SIGN HUSH"/* 1237D */, /*38139*/"CUNEIFORM SIGN KA TIMES ANSHE"/* 1237E */,/*38140*/"CUNEIFORM SIGN KA TIMES ASH3"/* 1237F */, /*38141*/"CUNEIFORM SIGN KA TIMES GISH"/* 12380 */,/*38142*/"CUNEIFORM SIGN KA TIMES GUD"/* 12381 */, /*38143*/"CUNEIFORM SIGN KA TIMES HI TIMES ASH2"/* 12382 */,/*38144*/"CUNEIFORM SIGN KA TIMES LUM"/* 12383 */, /*38145*/"CUNEIFORM SIGN KA TIMES PA"/* 12384 */,/*38146*/"CUNEIFORM SIGN KA TIMES SHUL"/* 12385 */, /*38147*/"CUNEIFORM SIGN KA TIMES TU"/* 12386 */,/*38148*/"CUNEIFORM SIGN KA TIMES UR2"/* 12387 */, /*38149*/"CUNEIFORM SIGN LAGAB TIMES GI"/* 12388 */,/*38150*/"CUNEIFORM SIGN LU2 SHESHIG TIMES BAD"/* 12389 */, /*38151*/"CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL"/* 1238A */,/*38152*/"CUNEIFORM SIGN LU2 TIMES SHU"/* 1238B */, /*38153*/"CUNEIFORM SIGN MESH"/* 1238C */,/*38154*/"CUNEIFORM SIGN MUSH3 TIMES ZA"/* 1238D */, /*38155*/"CUNEIFORM SIGN NA4"/* 1238E */,/*38156*/"CUNEIFORM SIGN NIN"/* 1238F */, /*38157*/"CUNEIFORM SIGN NIN9"/* 12390 */,/*38158*/"CUNEIFORM SIGN NINDA2 TIMES BAL"/* 12391 */, /*38159*/"CUNEIFORM SIGN NINDA2 TIMES GI"/* 12392 */,/*38160*/"CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES"/* 12393 */, /*38161*/"CUNEIFORM SIGN PESH2 ASTERISK"/* 12394 */,/*38162*/"CUNEIFORM SIGN PIR2"/* 12395 */, /*38163*/"CUNEIFORM SIGN SAG TIMES IGI GUNU"/* 12396 */,/*38164*/"CUNEIFORM SIGN TI2"/* 12397 */, /*38165*/"CUNEIFORM SIGN UM TIMES ME"/* 12398 */,/*38166*/"CUNEIFORM SIGN U U"/* 12399 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*38269*/"CUNEIFORM NUMERIC SIGN TWO ASH"/* 12400 */,/*38270*/"CUNEIFORM NUMERIC SIGN THREE ASH"/* 12401 */, /*38271*/"CUNEIFORM NUMERIC SIGN FOUR ASH"/* 12402 */,/*38272*/"CUNEIFORM NUMERIC SIGN FIVE ASH"/* 12403 */, /*38273*/"CUNEIFORM NUMERIC SIGN SIX ASH"/* 12404 */,/*38274*/"CUNEIFORM NUMERIC SIGN SEVEN ASH"/* 12405 */, /*38275*/"CUNEIFORM NUMERIC SIGN EIGHT ASH"/* 12406 */,/*38276*/"CUNEIFORM NUMERIC SIGN NINE ASH"/* 12407 */, /*38277*/"CUNEIFORM NUMERIC SIGN THREE DISH"/* 12408 */,/*38278*/"CUNEIFORM NUMERIC SIGN FOUR DISH"/* 12409 */, /*38279*/"CUNEIFORM NUMERIC SIGN FIVE DISH"/* 1240A */,/*38280*/"CUNEIFORM NUMERIC SIGN SIX DISH"/* 1240B */, /*38281*/"CUNEIFORM NUMERIC SIGN SEVEN DISH"/* 1240C */,/*38282*/"CUNEIFORM NUMERIC SIGN EIGHT DISH"/* 1240D */, /*38283*/"CUNEIFORM NUMERIC SIGN NINE DISH"/* 1240E */,/*38284*/"CUNEIFORM NUMERIC SIGN FOUR U"/* 1240F */, /*38285*/"CUNEIFORM NUMERIC SIGN FIVE U"/* 12410 */,/*38286*/"CUNEIFORM NUMERIC SIGN SIX U"/* 12411 */, /*38287*/"CUNEIFORM NUMERIC SIGN SEVEN U"/* 12412 */,/*38288*/"CUNEIFORM NUMERIC SIGN EIGHT U"/* 12413 */, /*38289*/"CUNEIFORM NUMERIC SIGN NINE U"/* 12414 */,/*38290*/"CUNEIFORM NUMERIC SIGN ONE GESH2"/* 12415 */, /*38291*/"CUNEIFORM NUMERIC SIGN TWO GESH2"/* 12416 */,/*38292*/"CUNEIFORM NUMERIC SIGN THREE GESH2"/* 12417 */, /*38293*/"CUNEIFORM NUMERIC SIGN FOUR GESH2"/* 12418 */,/*38294*/"CUNEIFORM NUMERIC SIGN FIVE GESH2"/* 12419 */, /*38295*/"CUNEIFORM NUMERIC SIGN SIX GESH2"/* 1241A */,/*38296*/"CUNEIFORM NUMERIC SIGN SEVEN GESH2"/* 1241B */, /*38297*/"CUNEIFORM NUMERIC SIGN EIGHT GESH2"/* 1241C */,/*38298*/"CUNEIFORM NUMERIC SIGN NINE GESH2"/* 1241D */, /*38299*/"CUNEIFORM NUMERIC SIGN ONE GESHU"/* 1241E */,/*38300*/"CUNEIFORM NUMERIC SIGN TWO GESHU"/* 1241F */, /*38301*/"CUNEIFORM NUMERIC SIGN THREE GESHU"/* 12420 */,/*38302*/"CUNEIFORM NUMERIC SIGN FOUR GESHU"/* 12421 */, /*38303*/"CUNEIFORM NUMERIC SIGN FIVE GESHU"/* 12422 */,/*38304*/"CUNEIFORM NUMERIC SIGN TWO SHAR2"/* 12423 */, /*38305*/"CUNEIFORM NUMERIC SIGN THREE SHAR2"/* 12424 */, /*38306*/"CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM"/* 12425 */, /*38307*/"CUNEIFORM NUMERIC SIGN FOUR SHAR2"/* 12426 */,/*38308*/"CUNEIFORM NUMERIC SIGN FIVE SHAR2"/* 12427 */, /*38309*/"CUNEIFORM NUMERIC SIGN SIX SHAR2"/* 12428 */,/*38310*/"CUNEIFORM NUMERIC SIGN SEVEN SHAR2"/* 12429 */, /*38311*/"CUNEIFORM NUMERIC SIGN EIGHT SHAR2"/* 1242A */,/*38312*/"CUNEIFORM NUMERIC SIGN NINE SHAR2"/* 1242B */, /*38313*/"CUNEIFORM NUMERIC SIGN ONE SHARU"/* 1242C */,/*38314*/"CUNEIFORM NUMERIC SIGN TWO SHARU"/* 1242D */, /*38315*/"CUNEIFORM NUMERIC SIGN THREE SHARU"/* 1242E */, /*38316*/"CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM"/* 1242F */, /*38317*/"CUNEIFORM NUMERIC SIGN FOUR SHARU"/* 12430 */,/*38318*/"CUNEIFORM NUMERIC SIGN FIVE SHARU"/* 12431 */, /*38319*/"CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH"/* 12432 */, /*38320*/"CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN"/* 12433 */, /*38321*/"CUNEIFORM NUMERIC SIGN ONE BURU"/* 12434 */,/*38322*/"CUNEIFORM NUMERIC SIGN TWO BURU"/* 12435 */, /*38323*/"CUNEIFORM NUMERIC SIGN THREE BURU"/* 12436 */, /*38324*/"CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM"/* 12437 */, /*38325*/"CUNEIFORM NUMERIC SIGN FOUR BURU"/* 12438 */,/*38326*/"CUNEIFORM NUMERIC SIGN FIVE BURU"/* 12439 */, /*38327*/"CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16"/* 1243A */, /*38328*/"CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21"/* 1243B */, /*38329*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU"/* 1243C */, /*38330*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4"/* 1243D */, /*38331*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A"/* 1243E */, /*38332*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B"/* 1243F */, /*38333*/"CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9"/* 12440 */, /*38334*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3"/* 12441 */, /*38335*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A"/* 12442 */, /*38336*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B"/* 12443 */, /*38337*/"CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU"/* 12444 */, /*38338*/"CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3"/* 12445 */, /*38339*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU"/* 12446 */, /*38340*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3"/* 12447 */, /*38341*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4"/* 12448 */, /*38342*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A"/* 12449 */, /*38343*/"CUNEIFORM NUMERIC SIGN TWO ASH TENU"/* 1244A */,/*38344*/"CUNEIFORM NUMERIC SIGN THREE ASH TENU"/* 1244B */, /*38345*/"CUNEIFORM NUMERIC SIGN FOUR ASH TENU"/* 1244C */,/*38346*/"CUNEIFORM NUMERIC SIGN FIVE ASH TENU"/* 1244D */, /*38347*/"CUNEIFORM NUMERIC SIGN SIX ASH TENU"/* 1244E */,/*38348*/"CUNEIFORM NUMERIC SIGN ONE BAN2"/* 1244F */, /*38349*/"CUNEIFORM NUMERIC SIGN TWO BAN2"/* 12450 */,/*38350*/"CUNEIFORM NUMERIC SIGN THREE BAN2"/* 12451 */, /*38351*/"CUNEIFORM NUMERIC SIGN FOUR BAN2"/* 12452 */, /*38352*/"CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM"/* 12453 */, /*38353*/"CUNEIFORM NUMERIC SIGN FIVE BAN2"/* 12454 */, /*38354*/"CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM"/* 12455 */, /*38355*/"CUNEIFORM NUMERIC SIGN NIGIDAMIN"/* 12456 */,/*38356*/"CUNEIFORM NUMERIC SIGN NIGIDAESH"/* 12457 */, /*38357*/"CUNEIFORM NUMERIC SIGN ONE ESHE3"/* 12458 */,/*38358*/"CUNEIFORM NUMERIC SIGN TWO ESHE3"/* 12459 */, /*38359*/"CUNEIFORM NUMERIC SIGN ONE THIRD DISH"/* 1245A */,/*38360*/"CUNEIFORM NUMERIC SIGN TWO THIRDS DISH"/* 1245B */, /*38361*/"CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH"/* 1245C */, /*38362*/"CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A"/* 1245D */, /*38363*/"CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A"/* 1245E */, /*38364*/"CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH"/* 1245F */,/*38365*/"CUNEIFORM NUMERIC SIGN ONE QUARTER ASH"/* 12460 */, /*38366*/"CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH"/* 12461 */, /*38367*/"CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER"/* 12462 */, /*38368*/"CUNEIFORM NUMERIC SIGN ONE QUARTER GUR"/* 12463 */,/*38369*/"CUNEIFORM NUMERIC SIGN ONE HALF GUR"/* 12464 */, /*38370*/"CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD"/* 12465 */, /*38371*/"CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS"/* 12466 */, /*38372*/"CUNEIFORM NUMERIC SIGN ELAMITE FORTY"/* 12467 */,/*38373*/"CUNEIFORM NUMERIC SIGN ELAMITE FIFTY"/* 12468 */, /*38374*/"CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM"/* 12469 */, /*38375*/"CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM"/* 1246A */, /*38376*/"CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM"/* 1246B */, /*38377*/"CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM"/* 1246C */, /*38378*/"CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM"/* 1246D */, /*38379*/"CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM"/* 1246E */,NULL, /*38381*/"CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER"/* 12470 */, /*38382*/"CUNEIFORM PUNCTUATION SIGN VERTICAL COLON"/* 12471 */, /*38383*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON"/* 12472 */, /*38384*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON"/* 12473 */, /*38385*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON"/* 12474 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*38397*/"CUNEIFORM SIGN AB TIMES NUN TENU"/* 12480 */,/*38398*/"CUNEIFORM SIGN AB TIMES SHU2"/* 12481 */, /*38399*/"CUNEIFORM SIGN AD TIMES ESH2"/* 12482 */,/*38400*/"CUNEIFORM SIGN BAD TIMES DISH TENU"/* 12483 */, /*38401*/"CUNEIFORM SIGN BAHAR2 TIMES AB2"/* 12484 */,/*38402*/"CUNEIFORM SIGN BAHAR2 TIMES NI"/* 12485 */, /*38403*/"CUNEIFORM SIGN BAHAR2 TIMES ZA"/* 12486 */,/*38404*/"CUNEIFORM SIGN BU OVER BU TIMES NA2"/* 12487 */, /*38405*/"CUNEIFORM SIGN DA TIMES TAK4"/* 12488 */,/*38406*/"CUNEIFORM SIGN DAG TIMES KUR"/* 12489 */, /*38407*/"CUNEIFORM SIGN DIM TIMES IGI"/* 1248A */,/*38408*/"CUNEIFORM SIGN DIM TIMES U U U"/* 1248B */, /*38409*/"CUNEIFORM SIGN DIM2 TIMES UD"/* 1248C */,/*38410*/"CUNEIFORM SIGN DUG TIMES ANSHE"/* 1248D */, /*38411*/"CUNEIFORM SIGN DUG TIMES ASH"/* 1248E */,/*38412*/"CUNEIFORM SIGN DUG TIMES ASH AT LEFT"/* 1248F */, /*38413*/"CUNEIFORM SIGN DUG TIMES DIN"/* 12490 */,/*38414*/"CUNEIFORM SIGN DUG TIMES DUN"/* 12491 */, /*38415*/"CUNEIFORM SIGN DUG TIMES ERIN2"/* 12492 */,/*38416*/"CUNEIFORM SIGN DUG TIMES GA"/* 12493 */, /*38417*/"CUNEIFORM SIGN DUG TIMES GI"/* 12494 */,/*38418*/"CUNEIFORM SIGN DUG TIMES GIR2 GUNU"/* 12495 */, /*38419*/"CUNEIFORM SIGN DUG TIMES GISH"/* 12496 */,/*38420*/"CUNEIFORM SIGN DUG TIMES HA"/* 12497 */, /*38421*/"CUNEIFORM SIGN DUG TIMES HI"/* 12498 */,/*38422*/"CUNEIFORM SIGN DUG TIMES IGI GUNU"/* 12499 */, /*38423*/"CUNEIFORM SIGN DUG TIMES KASKAL"/* 1249A */,/*38424*/"CUNEIFORM SIGN DUG TIMES KUR"/* 1249B */, /*38425*/"CUNEIFORM SIGN DUG TIMES KUSHU2"/* 1249C */,/*38426*/"CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL"/* 1249D */, /*38427*/"CUNEIFORM SIGN DUG TIMES LAK-020"/* 1249E */,/*38428*/"CUNEIFORM SIGN DUG TIMES LAM"/* 1249F */, /*38429*/"CUNEIFORM SIGN DUG TIMES LAM TIMES KUR"/* 124A0 */, /*38430*/"CUNEIFORM SIGN DUG TIMES LUH PLUS GISH"/* 124A1 */,/*38431*/"CUNEIFORM SIGN DUG TIMES MASH"/* 124A2 */, /*38432*/"CUNEIFORM SIGN DUG TIMES MES"/* 124A3 */,/*38433*/"CUNEIFORM SIGN DUG TIMES MI"/* 124A4 */, /*38434*/"CUNEIFORM SIGN DUG TIMES NI"/* 124A5 */,/*38435*/"CUNEIFORM SIGN DUG TIMES PI"/* 124A6 */, /*38436*/"CUNEIFORM SIGN DUG TIMES SHE"/* 124A7 */,/*38437*/"CUNEIFORM SIGN DUG TIMES SI GUNU"/* 124A8 */, /*38438*/"CUNEIFORM SIGN E2 TIMES KUR"/* 124A9 */,/*38439*/"CUNEIFORM SIGN E2 TIMES PAP"/* 124AA */, /*38440*/"CUNEIFORM SIGN ERIN2 X"/* 124AB */,/*38441*/"CUNEIFORM SIGN ESH2 CROSSING ESH2"/* 124AC */, /*38442*/"CUNEIFORM SIGN EZEN SHESHIG TIMES ASH"/* 124AD */,/*38443*/"CUNEIFORM SIGN EZEN SHESHIG TIMES HI"/* 124AE */, /*38444*/"CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU"/* 124AF */, /*38445*/"CUNEIFORM SIGN EZEN SHESHIG TIMES LA"/* 124B0 */,/*38446*/"CUNEIFORM SIGN EZEN SHESHIG TIMES LAL"/* 124B1 */, /*38447*/"CUNEIFORM SIGN EZEN SHESHIG TIMES ME"/* 124B2 */,/*38448*/"CUNEIFORM SIGN EZEN SHESHIG TIMES MES"/* 124B3 */, /*38449*/"CUNEIFORM SIGN EZEN SHESHIG TIMES SU"/* 124B4 */,/*38450*/"CUNEIFORM SIGN EZEN TIMES SU"/* 124B5 */, /*38451*/"CUNEIFORM SIGN GA2 TIMES BAHAR2"/* 124B6 */,/*38452*/"CUNEIFORM SIGN GA2 TIMES DIM GUNU"/* 124B7 */, /*38453*/"CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU"/* 124B8 */, /*38454*/"CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL"/* 124B9 */,/*38455*/"CUNEIFORM SIGN GA2 TIMES EREN"/* 124BA */, /*38456*/"CUNEIFORM SIGN GA2 TIMES GA"/* 124BB */,/*38457*/"CUNEIFORM SIGN GA2 TIMES GAR PLUS DI"/* 124BC */, /*38458*/"CUNEIFORM SIGN GA2 TIMES GAR PLUS NE"/* 124BD */,/*38459*/"CUNEIFORM SIGN GA2 TIMES HA PLUS A"/* 124BE */, /*38460*/"CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL"/* 124BF */,/*38461*/"CUNEIFORM SIGN GA2 TIMES LAM"/* 124C0 */, /*38462*/"CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR"/* 124C1 */,/*38463*/"CUNEIFORM SIGN GA2 TIMES LUH"/* 124C2 */, /*38464*/"CUNEIFORM SIGN GA2 TIMES MUSH"/* 124C3 */,/*38465*/"CUNEIFORM SIGN GA2 TIMES NE"/* 124C4 */, /*38466*/"CUNEIFORM SIGN GA2 TIMES NE PLUS E2"/* 124C5 */,/*38467*/"CUNEIFORM SIGN GA2 TIMES NE PLUS GI"/* 124C6 */, /*38468*/"CUNEIFORM SIGN GA2 TIMES SHIM"/* 124C7 */,/*38469*/"CUNEIFORM SIGN GA2 TIMES ZIZ2"/* 124C8 */, /*38470*/"CUNEIFORM SIGN GABA ROTATED NINETY DEGREES"/* 124C9 */,/*38471*/"CUNEIFORM SIGN GESHTIN TIMES U"/* 124CA */, /*38472*/"CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH"/* 124CB */, /*38473*/"CUNEIFORM SIGN GU2 TIMES IGI GUNU"/* 124CC */,/*38474*/"CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4"/* 124CD */, /*38475*/"CUNEIFORM SIGN HA TENU GUNU"/* 124CE */,/*38476*/"CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH"/* 124CF */, /*38477*/"CUNEIFORM SIGN KA TIMES BU"/* 124D0 */,/*38478*/"CUNEIFORM SIGN KA TIMES KA"/* 124D1 */, /*38479*/"CUNEIFORM SIGN KA TIMES U U U"/* 124D2 */,/*38480*/"CUNEIFORM SIGN KA TIMES UR"/* 124D3 */, /*38481*/"CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU"/* 124D4 */,/*38482*/"CUNEIFORM SIGN LAK-003"/* 124D5 */, /*38483*/"CUNEIFORM SIGN LAK-021"/* 124D6 */,/*38484*/"CUNEIFORM SIGN LAK-025"/* 124D7 */, /*38485*/"CUNEIFORM SIGN LAK-030"/* 124D8 */,/*38486*/"CUNEIFORM SIGN LAK-050"/* 124D9 */, /*38487*/"CUNEIFORM SIGN LAK-051"/* 124DA */,/*38488*/"CUNEIFORM SIGN LAK-062"/* 124DB */, /*38489*/"CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU"/* 124DC */,/*38490*/"CUNEIFORM SIGN LAK-080"/* 124DD */, /*38491*/"CUNEIFORM SIGN LAK-081 OVER LAK-081"/* 124DE */,/*38492*/"CUNEIFORM SIGN LAK-092"/* 124DF */, /*38493*/"CUNEIFORM SIGN LAK-130"/* 124E0 */,/*38494*/"CUNEIFORM SIGN LAK-142"/* 124E1 */, /*38495*/"CUNEIFORM SIGN LAK-210"/* 124E2 */,/*38496*/"CUNEIFORM SIGN LAK-219"/* 124E3 */, /*38497*/"CUNEIFORM SIGN LAK-220"/* 124E4 */,/*38498*/"CUNEIFORM SIGN LAK-225"/* 124E5 */, /*38499*/"CUNEIFORM SIGN LAK-228"/* 124E6 */,/*38500*/"CUNEIFORM SIGN LAK-238"/* 124E7 */, /*38501*/"CUNEIFORM SIGN LAK-265"/* 124E8 */,/*38502*/"CUNEIFORM SIGN LAK-266"/* 124E9 */, /*38503*/"CUNEIFORM SIGN LAK-343"/* 124EA */,/*38504*/"CUNEIFORM SIGN LAK-347"/* 124EB */, /*38505*/"CUNEIFORM SIGN LAK-348"/* 124EC */,/*38506*/"CUNEIFORM SIGN LAK-383"/* 124ED */, /*38507*/"CUNEIFORM SIGN LAK-384"/* 124EE */,/*38508*/"CUNEIFORM SIGN LAK-390"/* 124EF */, /*38509*/"CUNEIFORM SIGN LAK-441"/* 124F0 */,/*38510*/"CUNEIFORM SIGN LAK-449"/* 124F1 */, /*38511*/"CUNEIFORM SIGN LAK-449 TIMES GU"/* 124F2 */,/*38512*/"CUNEIFORM SIGN LAK-449 TIMES IGI"/* 124F3 */, /*38513*/"CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3"/* 124F4 */, /*38514*/"CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3"/* 124F5 */, /*38515*/"CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA"/* 124F6 */,/*38516*/"CUNEIFORM SIGN LAK-450"/* 124F7 */, /*38517*/"CUNEIFORM SIGN LAK-457"/* 124F8 */,/*38518*/"CUNEIFORM SIGN LAK-470"/* 124F9 */, /*38519*/"CUNEIFORM SIGN LAK-483"/* 124FA */,/*38520*/"CUNEIFORM SIGN LAK-490"/* 124FB */, /*38521*/"CUNEIFORM SIGN LAK-492"/* 124FC */,/*38522*/"CUNEIFORM SIGN LAK-493"/* 124FD */, /*38523*/"CUNEIFORM SIGN LAK-495"/* 124FE */,/*38524*/"CUNEIFORM SIGN LAK-550"/* 124FF */, /*38525*/"CUNEIFORM SIGN LAK-608"/* 12500 */,/*38526*/"CUNEIFORM SIGN LAK-617"/* 12501 */, /*38527*/"CUNEIFORM SIGN LAK-617 TIMES ASH"/* 12502 */,/*38528*/"CUNEIFORM SIGN LAK-617 TIMES BAD"/* 12503 */, /*38529*/"CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU"/* 12504 */,/*38530*/"CUNEIFORM SIGN LAK-617 TIMES KU3"/* 12505 */, /*38531*/"CUNEIFORM SIGN LAK-617 TIMES LA"/* 12506 */,/*38532*/"CUNEIFORM SIGN LAK-617 TIMES TAR"/* 12507 */, /*38533*/"CUNEIFORM SIGN LAK-617 TIMES TE"/* 12508 */,/*38534*/"CUNEIFORM SIGN LAK-617 TIMES U2"/* 12509 */, /*38535*/"CUNEIFORM SIGN LAK-617 TIMES UD"/* 1250A */,/*38536*/"CUNEIFORM SIGN LAK-617 TIMES URUDA"/* 1250B */, /*38537*/"CUNEIFORM SIGN LAK-636"/* 1250C */,/*38538*/"CUNEIFORM SIGN LAK-648"/* 1250D */, /*38539*/"CUNEIFORM SIGN LAK-648 TIMES DUB"/* 1250E */,/*38540*/"CUNEIFORM SIGN LAK-648 TIMES GA"/* 1250F */, /*38541*/"CUNEIFORM SIGN LAK-648 TIMES IGI"/* 12510 */,/*38542*/"CUNEIFORM SIGN LAK-648 TIMES IGI GUNU"/* 12511 */, /*38543*/"CUNEIFORM SIGN LAK-648 TIMES NI"/* 12512 */, /*38544*/"CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3"/* 12513 */, /*38545*/"CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI"/* 12514 */,/*38546*/"CUNEIFORM SIGN LAK-648 TIMES UD"/* 12515 */, /*38547*/"CUNEIFORM SIGN LAK-648 TIMES URUDA"/* 12516 */,/*38548*/"CUNEIFORM SIGN LAK-724"/* 12517 */, /*38549*/"CUNEIFORM SIGN LAK-749"/* 12518 */,/*38550*/"CUNEIFORM SIGN LU2 GUNU TIMES ASH"/* 12519 */, /*38551*/"CUNEIFORM SIGN LU2 TIMES DISH"/* 1251A */,/*38552*/"CUNEIFORM SIGN LU2 TIMES HAL"/* 1251B */, /*38553*/"CUNEIFORM SIGN LU2 TIMES PAP"/* 1251C */,/*38554*/"CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3"/* 1251D */, /*38555*/"CUNEIFORM SIGN LU2 TIMES TAK4"/* 1251E */,/*38556*/"CUNEIFORM SIGN MI PLUS ZA7"/* 1251F */, /*38557*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES GA"/* 12520 */, /*38558*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK"/* 12521 */,/*38559*/"CUNEIFORM SIGN NINDA2 TIMES DIM GUNU"/* 12522 */, /*38560*/"CUNEIFORM SIGN NINDA2 TIMES GISH"/* 12523 */,/*38561*/"CUNEIFORM SIGN NINDA2 TIMES GUL"/* 12524 */, /*38562*/"CUNEIFORM SIGN NINDA2 TIMES HI"/* 12525 */,/*38563*/"CUNEIFORM SIGN NINDA2 TIMES KESH2"/* 12526 */, /*38564*/"CUNEIFORM SIGN NINDA2 TIMES LAK-050"/* 12527 */,/*38565*/"CUNEIFORM SIGN NINDA2 TIMES MASH"/* 12528 */, /*38566*/"CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP"/* 12529 */,/*38567*/"CUNEIFORM SIGN NINDA2 TIMES U"/* 1252A */, /*38568*/"CUNEIFORM SIGN NINDA2 TIMES U PLUS U"/* 1252B */,/*38569*/"CUNEIFORM SIGN NINDA2 TIMES URUDA"/* 1252C */, /*38570*/"CUNEIFORM SIGN SAG GUNU TIMES HA"/* 1252D */,/*38571*/"CUNEIFORM SIGN SAG TIMES EN"/* 1252E */, /*38572*/"CUNEIFORM SIGN SAG TIMES SHE AT LEFT"/* 1252F */,/*38573*/"CUNEIFORM SIGN SAG TIMES TAK4"/* 12530 */, /*38574*/"CUNEIFORM SIGN SHA6 TENU"/* 12531 */,/*38575*/"CUNEIFORM SIGN SHE OVER SHE"/* 12532 */, /*38576*/"CUNEIFORM SIGN SHE PLUS HUB2"/* 12533 */,/*38577*/"CUNEIFORM SIGN SHE PLUS NAM2"/* 12534 */, /*38578*/"CUNEIFORM SIGN SHE PLUS SAR"/* 12535 */,/*38579*/"CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI"/* 12536 */, /*38580*/"CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN"/* 12537 */,/*38581*/"CUNEIFORM SIGN SI TIMES TAK4"/* 12538 */, /*38582*/"CUNEIFORM SIGN TAK4 PLUS SAG"/* 12539 */,/*38583*/"CUNEIFORM SIGN TUM TIMES GAN2 TENU"/* 1253A */, /*38584*/"CUNEIFORM SIGN TUM TIMES THREE DISH"/* 1253B */,/*38585*/"CUNEIFORM SIGN UR2 INVERTED"/* 1253C */, /*38586*/"CUNEIFORM SIGN UR2 TIMES UD"/* 1253D */,/*38587*/"CUNEIFORM SIGN URU TIMES DARA3"/* 1253E */, /*38588*/"CUNEIFORM SIGN URU TIMES LAK-668"/* 1253F */,/*38589*/"CUNEIFORM SIGN URU TIMES LU3"/* 12540 */, /*38590*/"CUNEIFORM SIGN ZA7"/* 12541 */,/*38591*/"CUNEIFORM SIGN ZU OVER ZU PLUS SAR"/* 12542 */, /*38592*/"CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU"/* 12543 */,/*38593*/"EGYPTIAN HIEROGLYPH A001"/* 13000 */, /*38594*/"EGYPTIAN HIEROGLYPH A002"/* 13001 */,/*38595*/"EGYPTIAN HIEROGLYPH A003"/* 13002 */, /*38596*/"EGYPTIAN HIEROGLYPH A004"/* 13003 */,/*38597*/"EGYPTIAN HIEROGLYPH A005"/* 13004 */, /*38598*/"EGYPTIAN HIEROGLYPH A005A"/* 13005 */,/*38599*/"EGYPTIAN HIEROGLYPH A006"/* 13006 */, /*38600*/"EGYPTIAN HIEROGLYPH A006A"/* 13007 */,/*38601*/"EGYPTIAN HIEROGLYPH A006B"/* 13008 */, /*38602*/"EGYPTIAN HIEROGLYPH A007"/* 13009 */,/*38603*/"EGYPTIAN HIEROGLYPH A008"/* 1300A */, /*38604*/"EGYPTIAN HIEROGLYPH A009"/* 1300B */,/*38605*/"EGYPTIAN HIEROGLYPH A010"/* 1300C */, /*38606*/"EGYPTIAN HIEROGLYPH A011"/* 1300D */,/*38607*/"EGYPTIAN HIEROGLYPH A012"/* 1300E */, /*38608*/"EGYPTIAN HIEROGLYPH A013"/* 1300F */,/*38609*/"EGYPTIAN HIEROGLYPH A014"/* 13010 */, /*38610*/"EGYPTIAN HIEROGLYPH A014A"/* 13011 */,/*38611*/"EGYPTIAN HIEROGLYPH A015"/* 13012 */, /*38612*/"EGYPTIAN HIEROGLYPH A016"/* 13013 */,/*38613*/"EGYPTIAN HIEROGLYPH A017"/* 13014 */, /*38614*/"EGYPTIAN HIEROGLYPH A017A"/* 13015 */,/*38615*/"EGYPTIAN HIEROGLYPH A018"/* 13016 */, /*38616*/"EGYPTIAN HIEROGLYPH A019"/* 13017 */,/*38617*/"EGYPTIAN HIEROGLYPH A020"/* 13018 */, /*38618*/"EGYPTIAN HIEROGLYPH A021"/* 13019 */,/*38619*/"EGYPTIAN HIEROGLYPH A022"/* 1301A */, /*38620*/"EGYPTIAN HIEROGLYPH A023"/* 1301B */,/*38621*/"EGYPTIAN HIEROGLYPH A024"/* 1301C */, /*38622*/"EGYPTIAN HIEROGLYPH A025"/* 1301D */,/*38623*/"EGYPTIAN HIEROGLYPH A026"/* 1301E */, /*38624*/"EGYPTIAN HIEROGLYPH A027"/* 1301F */,/*38625*/"EGYPTIAN HIEROGLYPH A028"/* 13020 */, /*38626*/"EGYPTIAN HIEROGLYPH A029"/* 13021 */,/*38627*/"EGYPTIAN HIEROGLYPH A030"/* 13022 */, /*38628*/"EGYPTIAN HIEROGLYPH A031"/* 13023 */,/*38629*/"EGYPTIAN HIEROGLYPH A032"/* 13024 */, /*38630*/"EGYPTIAN HIEROGLYPH A032A"/* 13025 */,/*38631*/"EGYPTIAN HIEROGLYPH A033"/* 13026 */, /*38632*/"EGYPTIAN HIEROGLYPH A034"/* 13027 */,/*38633*/"EGYPTIAN HIEROGLYPH A035"/* 13028 */, /*38634*/"EGYPTIAN HIEROGLYPH A036"/* 13029 */,/*38635*/"EGYPTIAN HIEROGLYPH A037"/* 1302A */, /*38636*/"EGYPTIAN HIEROGLYPH A038"/* 1302B */,/*38637*/"EGYPTIAN HIEROGLYPH A039"/* 1302C */, /*38638*/"EGYPTIAN HIEROGLYPH A040"/* 1302D */,/*38639*/"EGYPTIAN HIEROGLYPH A040A"/* 1302E */, /*38640*/"EGYPTIAN HIEROGLYPH A041"/* 1302F */,/*38641*/"EGYPTIAN HIEROGLYPH A042"/* 13030 */, /*38642*/"EGYPTIAN HIEROGLYPH A042A"/* 13031 */,/*38643*/"EGYPTIAN HIEROGLYPH A043"/* 13032 */, /*38644*/"EGYPTIAN HIEROGLYPH A043A"/* 13033 */,/*38645*/"EGYPTIAN HIEROGLYPH A044"/* 13034 */, /*38646*/"EGYPTIAN HIEROGLYPH A045"/* 13035 */,/*38647*/"EGYPTIAN HIEROGLYPH A045A"/* 13036 */, /*38648*/"EGYPTIAN HIEROGLYPH A046"/* 13037 */,/*38649*/"EGYPTIAN HIEROGLYPH A047"/* 13038 */, /*38650*/"EGYPTIAN HIEROGLYPH A048"/* 13039 */,/*38651*/"EGYPTIAN HIEROGLYPH A049"/* 1303A */, /*38652*/"EGYPTIAN HIEROGLYPH A050"/* 1303B */,/*38653*/"EGYPTIAN HIEROGLYPH A051"/* 1303C */, /*38654*/"EGYPTIAN HIEROGLYPH A052"/* 1303D */,/*38655*/"EGYPTIAN HIEROGLYPH A053"/* 1303E */, /*38656*/"EGYPTIAN HIEROGLYPH A054"/* 1303F */,/*38657*/"EGYPTIAN HIEROGLYPH A055"/* 13040 */, /*38658*/"EGYPTIAN HIEROGLYPH A056"/* 13041 */,/*38659*/"EGYPTIAN HIEROGLYPH A057"/* 13042 */, /*38660*/"EGYPTIAN HIEROGLYPH A058"/* 13043 */,/*38661*/"EGYPTIAN HIEROGLYPH A059"/* 13044 */, /*38662*/"EGYPTIAN HIEROGLYPH A060"/* 13045 */,/*38663*/"EGYPTIAN HIEROGLYPH A061"/* 13046 */, /*38664*/"EGYPTIAN HIEROGLYPH A062"/* 13047 */,/*38665*/"EGYPTIAN HIEROGLYPH A063"/* 13048 */, /*38666*/"EGYPTIAN HIEROGLYPH A064"/* 13049 */,/*38667*/"EGYPTIAN HIEROGLYPH A065"/* 1304A */, /*38668*/"EGYPTIAN HIEROGLYPH A066"/* 1304B */,/*38669*/"EGYPTIAN HIEROGLYPH A067"/* 1304C */, /*38670*/"EGYPTIAN HIEROGLYPH A068"/* 1304D */,/*38671*/"EGYPTIAN HIEROGLYPH A069"/* 1304E */, /*38672*/"EGYPTIAN HIEROGLYPH A070"/* 1304F */,/*38673*/"EGYPTIAN HIEROGLYPH B001"/* 13050 */, /*38674*/"EGYPTIAN HIEROGLYPH B002"/* 13051 */,/*38675*/"EGYPTIAN HIEROGLYPH B003"/* 13052 */, /*38676*/"EGYPTIAN HIEROGLYPH B004"/* 13053 */,/*38677*/"EGYPTIAN HIEROGLYPH B005"/* 13054 */, /*38678*/"EGYPTIAN HIEROGLYPH B005A"/* 13055 */,/*38679*/"EGYPTIAN HIEROGLYPH B006"/* 13056 */, /*38680*/"EGYPTIAN HIEROGLYPH B007"/* 13057 */,/*38681*/"EGYPTIAN HIEROGLYPH B008"/* 13058 */, /*38682*/"EGYPTIAN HIEROGLYPH B009"/* 13059 */,/*38683*/"EGYPTIAN HIEROGLYPH C001"/* 1305A */, /*38684*/"EGYPTIAN HIEROGLYPH C002"/* 1305B */,/*38685*/"EGYPTIAN HIEROGLYPH C002A"/* 1305C */, /*38686*/"EGYPTIAN HIEROGLYPH C002B"/* 1305D */,/*38687*/"EGYPTIAN HIEROGLYPH C002C"/* 1305E */, /*38688*/"EGYPTIAN HIEROGLYPH C003"/* 1305F */,/*38689*/"EGYPTIAN HIEROGLYPH C004"/* 13060 */, /*38690*/"EGYPTIAN HIEROGLYPH C005"/* 13061 */,/*38691*/"EGYPTIAN HIEROGLYPH C006"/* 13062 */, /*38692*/"EGYPTIAN HIEROGLYPH C007"/* 13063 */,/*38693*/"EGYPTIAN HIEROGLYPH C008"/* 13064 */, /*38694*/"EGYPTIAN HIEROGLYPH C009"/* 13065 */,/*38695*/"EGYPTIAN HIEROGLYPH C010"/* 13066 */, /*38696*/"EGYPTIAN HIEROGLYPH C010A"/* 13067 */,/*38697*/"EGYPTIAN HIEROGLYPH C011"/* 13068 */, /*38698*/"EGYPTIAN HIEROGLYPH C012"/* 13069 */,/*38699*/"EGYPTIAN HIEROGLYPH C013"/* 1306A */, /*38700*/"EGYPTIAN HIEROGLYPH C014"/* 1306B */,/*38701*/"EGYPTIAN HIEROGLYPH C015"/* 1306C */, /*38702*/"EGYPTIAN HIEROGLYPH C016"/* 1306D */,/*38703*/"EGYPTIAN HIEROGLYPH C017"/* 1306E */, /*38704*/"EGYPTIAN HIEROGLYPH C018"/* 1306F */,/*38705*/"EGYPTIAN HIEROGLYPH C019"/* 13070 */, /*38706*/"EGYPTIAN HIEROGLYPH C020"/* 13071 */,/*38707*/"EGYPTIAN HIEROGLYPH C021"/* 13072 */, /*38708*/"EGYPTIAN HIEROGLYPH C022"/* 13073 */,/*38709*/"EGYPTIAN HIEROGLYPH C023"/* 13074 */, /*38710*/"EGYPTIAN HIEROGLYPH C024"/* 13075 */,/*38711*/"EGYPTIAN HIEROGLYPH D001"/* 13076 */, /*38712*/"EGYPTIAN HIEROGLYPH D002"/* 13077 */,/*38713*/"EGYPTIAN HIEROGLYPH D003"/* 13078 */, /*38714*/"EGYPTIAN HIEROGLYPH D004"/* 13079 */,/*38715*/"EGYPTIAN HIEROGLYPH D005"/* 1307A */, /*38716*/"EGYPTIAN HIEROGLYPH D006"/* 1307B */,/*38717*/"EGYPTIAN HIEROGLYPH D007"/* 1307C */, /*38718*/"EGYPTIAN HIEROGLYPH D008"/* 1307D */,/*38719*/"EGYPTIAN HIEROGLYPH D008A"/* 1307E */, /*38720*/"EGYPTIAN HIEROGLYPH D009"/* 1307F */,/*38721*/"EGYPTIAN HIEROGLYPH D010"/* 13080 */, /*38722*/"EGYPTIAN HIEROGLYPH D011"/* 13081 */,/*38723*/"EGYPTIAN HIEROGLYPH D012"/* 13082 */, /*38724*/"EGYPTIAN HIEROGLYPH D013"/* 13083 */,/*38725*/"EGYPTIAN HIEROGLYPH D014"/* 13084 */, /*38726*/"EGYPTIAN HIEROGLYPH D015"/* 13085 */,/*38727*/"EGYPTIAN HIEROGLYPH D016"/* 13086 */, /*38728*/"EGYPTIAN HIEROGLYPH D017"/* 13087 */,/*38729*/"EGYPTIAN HIEROGLYPH D018"/* 13088 */, /*38730*/"EGYPTIAN HIEROGLYPH D019"/* 13089 */,/*38731*/"EGYPTIAN HIEROGLYPH D020"/* 1308A */, /*38732*/"EGYPTIAN HIEROGLYPH D021"/* 1308B */,/*38733*/"EGYPTIAN HIEROGLYPH D022"/* 1308C */, /*38734*/"EGYPTIAN HIEROGLYPH D023"/* 1308D */,/*38735*/"EGYPTIAN HIEROGLYPH D024"/* 1308E */, /*38736*/"EGYPTIAN HIEROGLYPH D025"/* 1308F */,/*38737*/"EGYPTIAN HIEROGLYPH D026"/* 13090 */, /*38738*/"EGYPTIAN HIEROGLYPH D027"/* 13091 */,/*38739*/"EGYPTIAN HIEROGLYPH D027A"/* 13092 */, /*38740*/"EGYPTIAN HIEROGLYPH D028"/* 13093 */,/*38741*/"EGYPTIAN HIEROGLYPH D029"/* 13094 */, /*38742*/"EGYPTIAN HIEROGLYPH D030"/* 13095 */,/*38743*/"EGYPTIAN HIEROGLYPH D031"/* 13096 */, /*38744*/"EGYPTIAN HIEROGLYPH D031A"/* 13097 */,/*38745*/"EGYPTIAN HIEROGLYPH D032"/* 13098 */, /*38746*/"EGYPTIAN HIEROGLYPH D033"/* 13099 */,/*38747*/"EGYPTIAN HIEROGLYPH D034"/* 1309A */, /*38748*/"EGYPTIAN HIEROGLYPH D034A"/* 1309B */,/*38749*/"EGYPTIAN HIEROGLYPH D035"/* 1309C */, /*38750*/"EGYPTIAN HIEROGLYPH D036"/* 1309D */,/*38751*/"EGYPTIAN HIEROGLYPH D037"/* 1309E */, /*38752*/"EGYPTIAN HIEROGLYPH D038"/* 1309F */,/*38753*/"EGYPTIAN HIEROGLYPH D039"/* 130A0 */, /*38754*/"EGYPTIAN HIEROGLYPH D040"/* 130A1 */,/*38755*/"EGYPTIAN HIEROGLYPH D041"/* 130A2 */, /*38756*/"EGYPTIAN HIEROGLYPH D042"/* 130A3 */,/*38757*/"EGYPTIAN HIEROGLYPH D043"/* 130A4 */, /*38758*/"EGYPTIAN HIEROGLYPH D044"/* 130A5 */,/*38759*/"EGYPTIAN HIEROGLYPH D045"/* 130A6 */, /*38760*/"EGYPTIAN HIEROGLYPH D046"/* 130A7 */,/*38761*/"EGYPTIAN HIEROGLYPH D046A"/* 130A8 */, /*38762*/"EGYPTIAN HIEROGLYPH D047"/* 130A9 */,/*38763*/"EGYPTIAN HIEROGLYPH D048"/* 130AA */, /*38764*/"EGYPTIAN HIEROGLYPH D048A"/* 130AB */,/*38765*/"EGYPTIAN HIEROGLYPH D049"/* 130AC */, /*38766*/"EGYPTIAN HIEROGLYPH D050"/* 130AD */,/*38767*/"EGYPTIAN HIEROGLYPH D050A"/* 130AE */, /*38768*/"EGYPTIAN HIEROGLYPH D050B"/* 130AF */,/*38769*/"EGYPTIAN HIEROGLYPH D050C"/* 130B0 */, /*38770*/"EGYPTIAN HIEROGLYPH D050D"/* 130B1 */,/*38771*/"EGYPTIAN HIEROGLYPH D050E"/* 130B2 */, /*38772*/"EGYPTIAN HIEROGLYPH D050F"/* 130B3 */,/*38773*/"EGYPTIAN HIEROGLYPH D050G"/* 130B4 */, /*38774*/"EGYPTIAN HIEROGLYPH D050H"/* 130B5 */,/*38775*/"EGYPTIAN HIEROGLYPH D050I"/* 130B6 */, /*38776*/"EGYPTIAN HIEROGLYPH D051"/* 130B7 */,/*38777*/"EGYPTIAN HIEROGLYPH D052"/* 130B8 */, /*38778*/"EGYPTIAN HIEROGLYPH D052A"/* 130B9 */,/*38779*/"EGYPTIAN HIEROGLYPH D053"/* 130BA */, /*38780*/"EGYPTIAN HIEROGLYPH D054"/* 130BB */,/*38781*/"EGYPTIAN HIEROGLYPH D054A"/* 130BC */, /*38782*/"EGYPTIAN HIEROGLYPH D055"/* 130BD */,/*38783*/"EGYPTIAN HIEROGLYPH D056"/* 130BE */, /*38784*/"EGYPTIAN HIEROGLYPH D057"/* 130BF */,/*38785*/"EGYPTIAN HIEROGLYPH D058"/* 130C0 */, /*38786*/"EGYPTIAN HIEROGLYPH D059"/* 130C1 */,/*38787*/"EGYPTIAN HIEROGLYPH D060"/* 130C2 */, /*38788*/"EGYPTIAN HIEROGLYPH D061"/* 130C3 */,/*38789*/"EGYPTIAN HIEROGLYPH D062"/* 130C4 */, /*38790*/"EGYPTIAN HIEROGLYPH D063"/* 130C5 */,/*38791*/"EGYPTIAN HIEROGLYPH D064"/* 130C6 */, /*38792*/"EGYPTIAN HIEROGLYPH D065"/* 130C7 */,/*38793*/"EGYPTIAN HIEROGLYPH D066"/* 130C8 */, /*38794*/"EGYPTIAN HIEROGLYPH D067"/* 130C9 */,/*38795*/"EGYPTIAN HIEROGLYPH D067A"/* 130CA */, /*38796*/"EGYPTIAN HIEROGLYPH D067B"/* 130CB */,/*38797*/"EGYPTIAN HIEROGLYPH D067C"/* 130CC */, /*38798*/"EGYPTIAN HIEROGLYPH D067D"/* 130CD */,/*38799*/"EGYPTIAN HIEROGLYPH D067E"/* 130CE */, /*38800*/"EGYPTIAN HIEROGLYPH D067F"/* 130CF */,/*38801*/"EGYPTIAN HIEROGLYPH D067G"/* 130D0 */, /*38802*/"EGYPTIAN HIEROGLYPH D067H"/* 130D1 */,/*38803*/"EGYPTIAN HIEROGLYPH E001"/* 130D2 */, /*38804*/"EGYPTIAN HIEROGLYPH E002"/* 130D3 */,/*38805*/"EGYPTIAN HIEROGLYPH E003"/* 130D4 */, /*38806*/"EGYPTIAN HIEROGLYPH E004"/* 130D5 */,/*38807*/"EGYPTIAN HIEROGLYPH E005"/* 130D6 */, /*38808*/"EGYPTIAN HIEROGLYPH E006"/* 130D7 */,/*38809*/"EGYPTIAN HIEROGLYPH E007"/* 130D8 */, /*38810*/"EGYPTIAN HIEROGLYPH E008"/* 130D9 */,/*38811*/"EGYPTIAN HIEROGLYPH E008A"/* 130DA */, /*38812*/"EGYPTIAN HIEROGLYPH E009"/* 130DB */,/*38813*/"EGYPTIAN HIEROGLYPH E009A"/* 130DC */, /*38814*/"EGYPTIAN HIEROGLYPH E010"/* 130DD */,/*38815*/"EGYPTIAN HIEROGLYPH E011"/* 130DE */, /*38816*/"EGYPTIAN HIEROGLYPH E012"/* 130DF */,/*38817*/"EGYPTIAN HIEROGLYPH E013"/* 130E0 */, /*38818*/"EGYPTIAN HIEROGLYPH E014"/* 130E1 */,/*38819*/"EGYPTIAN HIEROGLYPH E015"/* 130E2 */, /*38820*/"EGYPTIAN HIEROGLYPH E016"/* 130E3 */,/*38821*/"EGYPTIAN HIEROGLYPH E016A"/* 130E4 */, /*38822*/"EGYPTIAN HIEROGLYPH E017"/* 130E5 */,/*38823*/"EGYPTIAN HIEROGLYPH E017A"/* 130E6 */, /*38824*/"EGYPTIAN HIEROGLYPH E018"/* 130E7 */,/*38825*/"EGYPTIAN HIEROGLYPH E019"/* 130E8 */, /*38826*/"EGYPTIAN HIEROGLYPH E020"/* 130E9 */,/*38827*/"EGYPTIAN HIEROGLYPH E020A"/* 130EA */, /*38828*/"EGYPTIAN HIEROGLYPH E021"/* 130EB */,/*38829*/"EGYPTIAN HIEROGLYPH E022"/* 130EC */, /*38830*/"EGYPTIAN HIEROGLYPH E023"/* 130ED */,/*38831*/"EGYPTIAN HIEROGLYPH E024"/* 130EE */, /*38832*/"EGYPTIAN HIEROGLYPH E025"/* 130EF */,/*38833*/"EGYPTIAN HIEROGLYPH E026"/* 130F0 */, /*38834*/"EGYPTIAN HIEROGLYPH E027"/* 130F1 */,/*38835*/"EGYPTIAN HIEROGLYPH E028"/* 130F2 */, /*38836*/"EGYPTIAN HIEROGLYPH E028A"/* 130F3 */,/*38837*/"EGYPTIAN HIEROGLYPH E029"/* 130F4 */, /*38838*/"EGYPTIAN HIEROGLYPH E030"/* 130F5 */,/*38839*/"EGYPTIAN HIEROGLYPH E031"/* 130F6 */, /*38840*/"EGYPTIAN HIEROGLYPH E032"/* 130F7 */,/*38841*/"EGYPTIAN HIEROGLYPH E033"/* 130F8 */, /*38842*/"EGYPTIAN HIEROGLYPH E034"/* 130F9 */,/*38843*/"EGYPTIAN HIEROGLYPH E034A"/* 130FA */, /*38844*/"EGYPTIAN HIEROGLYPH E036"/* 130FB */,/*38845*/"EGYPTIAN HIEROGLYPH E037"/* 130FC */, /*38846*/"EGYPTIAN HIEROGLYPH E038"/* 130FD */,/*38847*/"EGYPTIAN HIEROGLYPH F001"/* 130FE */, /*38848*/"EGYPTIAN HIEROGLYPH F001A"/* 130FF */,/*38849*/"EGYPTIAN HIEROGLYPH F002"/* 13100 */, /*38850*/"EGYPTIAN HIEROGLYPH F003"/* 13101 */,/*38851*/"EGYPTIAN HIEROGLYPH F004"/* 13102 */, /*38852*/"EGYPTIAN HIEROGLYPH F005"/* 13103 */,/*38853*/"EGYPTIAN HIEROGLYPH F006"/* 13104 */, /*38854*/"EGYPTIAN HIEROGLYPH F007"/* 13105 */,/*38855*/"EGYPTIAN HIEROGLYPH F008"/* 13106 */, /*38856*/"EGYPTIAN HIEROGLYPH F009"/* 13107 */,/*38857*/"EGYPTIAN HIEROGLYPH F010"/* 13108 */, /*38858*/"EGYPTIAN HIEROGLYPH F011"/* 13109 */,/*38859*/"EGYPTIAN HIEROGLYPH F012"/* 1310A */, /*38860*/"EGYPTIAN HIEROGLYPH F013"/* 1310B */,/*38861*/"EGYPTIAN HIEROGLYPH F013A"/* 1310C */, /*38862*/"EGYPTIAN HIEROGLYPH F014"/* 1310D */,/*38863*/"EGYPTIAN HIEROGLYPH F015"/* 1310E */, /*38864*/"EGYPTIAN HIEROGLYPH F016"/* 1310F */,/*38865*/"EGYPTIAN HIEROGLYPH F017"/* 13110 */, /*38866*/"EGYPTIAN HIEROGLYPH F018"/* 13111 */,/*38867*/"EGYPTIAN HIEROGLYPH F019"/* 13112 */, /*38868*/"EGYPTIAN HIEROGLYPH F020"/* 13113 */,/*38869*/"EGYPTIAN HIEROGLYPH F021"/* 13114 */, /*38870*/"EGYPTIAN HIEROGLYPH F021A"/* 13115 */,/*38871*/"EGYPTIAN HIEROGLYPH F022"/* 13116 */, /*38872*/"EGYPTIAN HIEROGLYPH F023"/* 13117 */,/*38873*/"EGYPTIAN HIEROGLYPH F024"/* 13118 */, /*38874*/"EGYPTIAN HIEROGLYPH F025"/* 13119 */,/*38875*/"EGYPTIAN HIEROGLYPH F026"/* 1311A */, /*38876*/"EGYPTIAN HIEROGLYPH F027"/* 1311B */,/*38877*/"EGYPTIAN HIEROGLYPH F028"/* 1311C */, /*38878*/"EGYPTIAN HIEROGLYPH F029"/* 1311D */,/*38879*/"EGYPTIAN HIEROGLYPH F030"/* 1311E */, /*38880*/"EGYPTIAN HIEROGLYPH F031"/* 1311F */,/*38881*/"EGYPTIAN HIEROGLYPH F031A"/* 13120 */, /*38882*/"EGYPTIAN HIEROGLYPH F032"/* 13121 */,/*38883*/"EGYPTIAN HIEROGLYPH F033"/* 13122 */, /*38884*/"EGYPTIAN HIEROGLYPH F034"/* 13123 */,/*38885*/"EGYPTIAN HIEROGLYPH F035"/* 13124 */, /*38886*/"EGYPTIAN HIEROGLYPH F036"/* 13125 */,/*38887*/"EGYPTIAN HIEROGLYPH F037"/* 13126 */, /*38888*/"EGYPTIAN HIEROGLYPH F037A"/* 13127 */,/*38889*/"EGYPTIAN HIEROGLYPH F038"/* 13128 */, /*38890*/"EGYPTIAN HIEROGLYPH F038A"/* 13129 */,/*38891*/"EGYPTIAN HIEROGLYPH F039"/* 1312A */, /*38892*/"EGYPTIAN HIEROGLYPH F040"/* 1312B */,/*38893*/"EGYPTIAN HIEROGLYPH F041"/* 1312C */, /*38894*/"EGYPTIAN HIEROGLYPH F042"/* 1312D */,/*38895*/"EGYPTIAN HIEROGLYPH F043"/* 1312E */, /*38896*/"EGYPTIAN HIEROGLYPH F044"/* 1312F */,/*38897*/"EGYPTIAN HIEROGLYPH F045"/* 13130 */, /*38898*/"EGYPTIAN HIEROGLYPH F045A"/* 13131 */,/*38899*/"EGYPTIAN HIEROGLYPH F046"/* 13132 */, /*38900*/"EGYPTIAN HIEROGLYPH F046A"/* 13133 */,/*38901*/"EGYPTIAN HIEROGLYPH F047"/* 13134 */, /*38902*/"EGYPTIAN HIEROGLYPH F047A"/* 13135 */,/*38903*/"EGYPTIAN HIEROGLYPH F048"/* 13136 */, /*38904*/"EGYPTIAN HIEROGLYPH F049"/* 13137 */,/*38905*/"EGYPTIAN HIEROGLYPH F050"/* 13138 */, /*38906*/"EGYPTIAN HIEROGLYPH F051"/* 13139 */,/*38907*/"EGYPTIAN HIEROGLYPH F051A"/* 1313A */, /*38908*/"EGYPTIAN HIEROGLYPH F051B"/* 1313B */,/*38909*/"EGYPTIAN HIEROGLYPH F051C"/* 1313C */, /*38910*/"EGYPTIAN HIEROGLYPH F052"/* 1313D */,/*38911*/"EGYPTIAN HIEROGLYPH F053"/* 1313E */, /*38912*/"EGYPTIAN HIEROGLYPH G001"/* 1313F */,/*38913*/"EGYPTIAN HIEROGLYPH G002"/* 13140 */, /*38914*/"EGYPTIAN HIEROGLYPH G003"/* 13141 */,/*38915*/"EGYPTIAN HIEROGLYPH G004"/* 13142 */, /*38916*/"EGYPTIAN HIEROGLYPH G005"/* 13143 */,/*38917*/"EGYPTIAN HIEROGLYPH G006"/* 13144 */, /*38918*/"EGYPTIAN HIEROGLYPH G006A"/* 13145 */,/*38919*/"EGYPTIAN HIEROGLYPH G007"/* 13146 */, /*38920*/"EGYPTIAN HIEROGLYPH G007A"/* 13147 */,/*38921*/"EGYPTIAN HIEROGLYPH G007B"/* 13148 */, /*38922*/"EGYPTIAN HIEROGLYPH G008"/* 13149 */,/*38923*/"EGYPTIAN HIEROGLYPH G009"/* 1314A */, /*38924*/"EGYPTIAN HIEROGLYPH G010"/* 1314B */,/*38925*/"EGYPTIAN HIEROGLYPH G011"/* 1314C */, /*38926*/"EGYPTIAN HIEROGLYPH G011A"/* 1314D */,/*38927*/"EGYPTIAN HIEROGLYPH G012"/* 1314E */, /*38928*/"EGYPTIAN HIEROGLYPH G013"/* 1314F */,/*38929*/"EGYPTIAN HIEROGLYPH G014"/* 13150 */, /*38930*/"EGYPTIAN HIEROGLYPH G015"/* 13151 */,/*38931*/"EGYPTIAN HIEROGLYPH G016"/* 13152 */, /*38932*/"EGYPTIAN HIEROGLYPH G017"/* 13153 */,/*38933*/"EGYPTIAN HIEROGLYPH G018"/* 13154 */, /*38934*/"EGYPTIAN HIEROGLYPH G019"/* 13155 */,/*38935*/"EGYPTIAN HIEROGLYPH G020"/* 13156 */, /*38936*/"EGYPTIAN HIEROGLYPH G020A"/* 13157 */,/*38937*/"EGYPTIAN HIEROGLYPH G021"/* 13158 */, /*38938*/"EGYPTIAN HIEROGLYPH G022"/* 13159 */,/*38939*/"EGYPTIAN HIEROGLYPH G023"/* 1315A */, /*38940*/"EGYPTIAN HIEROGLYPH G024"/* 1315B */,/*38941*/"EGYPTIAN HIEROGLYPH G025"/* 1315C */, /*38942*/"EGYPTIAN HIEROGLYPH G026"/* 1315D */,/*38943*/"EGYPTIAN HIEROGLYPH G026A"/* 1315E */, /*38944*/"EGYPTIAN HIEROGLYPH G027"/* 1315F */,/*38945*/"EGYPTIAN HIEROGLYPH G028"/* 13160 */, /*38946*/"EGYPTIAN HIEROGLYPH G029"/* 13161 */,/*38947*/"EGYPTIAN HIEROGLYPH G030"/* 13162 */, /*38948*/"EGYPTIAN HIEROGLYPH G031"/* 13163 */,/*38949*/"EGYPTIAN HIEROGLYPH G032"/* 13164 */, /*38950*/"EGYPTIAN HIEROGLYPH G033"/* 13165 */,/*38951*/"EGYPTIAN HIEROGLYPH G034"/* 13166 */, /*38952*/"EGYPTIAN HIEROGLYPH G035"/* 13167 */,/*38953*/"EGYPTIAN HIEROGLYPH G036"/* 13168 */, /*38954*/"EGYPTIAN HIEROGLYPH G036A"/* 13169 */,/*38955*/"EGYPTIAN HIEROGLYPH G037"/* 1316A */, /*38956*/"EGYPTIAN HIEROGLYPH G037A"/* 1316B */,/*38957*/"EGYPTIAN HIEROGLYPH G038"/* 1316C */, /*38958*/"EGYPTIAN HIEROGLYPH G039"/* 1316D */,/*38959*/"EGYPTIAN HIEROGLYPH G040"/* 1316E */, /*38960*/"EGYPTIAN HIEROGLYPH G041"/* 1316F */,/*38961*/"EGYPTIAN HIEROGLYPH G042"/* 13170 */, /*38962*/"EGYPTIAN HIEROGLYPH G043"/* 13171 */,/*38963*/"EGYPTIAN HIEROGLYPH G043A"/* 13172 */, /*38964*/"EGYPTIAN HIEROGLYPH G044"/* 13173 */,/*38965*/"EGYPTIAN HIEROGLYPH G045"/* 13174 */, /*38966*/"EGYPTIAN HIEROGLYPH G045A"/* 13175 */,/*38967*/"EGYPTIAN HIEROGLYPH G046"/* 13176 */, /*38968*/"EGYPTIAN HIEROGLYPH G047"/* 13177 */,/*38969*/"EGYPTIAN HIEROGLYPH G048"/* 13178 */, /*38970*/"EGYPTIAN HIEROGLYPH G049"/* 13179 */,/*38971*/"EGYPTIAN HIEROGLYPH G050"/* 1317A */, /*38972*/"EGYPTIAN HIEROGLYPH G051"/* 1317B */,/*38973*/"EGYPTIAN HIEROGLYPH G052"/* 1317C */, /*38974*/"EGYPTIAN HIEROGLYPH G053"/* 1317D */,/*38975*/"EGYPTIAN HIEROGLYPH G054"/* 1317E */, /*38976*/"EGYPTIAN HIEROGLYPH H001"/* 1317F */,/*38977*/"EGYPTIAN HIEROGLYPH H002"/* 13180 */, /*38978*/"EGYPTIAN HIEROGLYPH H003"/* 13181 */,/*38979*/"EGYPTIAN HIEROGLYPH H004"/* 13182 */, /*38980*/"EGYPTIAN HIEROGLYPH H005"/* 13183 */,/*38981*/"EGYPTIAN HIEROGLYPH H006"/* 13184 */, /*38982*/"EGYPTIAN HIEROGLYPH H006A"/* 13185 */,/*38983*/"EGYPTIAN HIEROGLYPH H007"/* 13186 */, /*38984*/"EGYPTIAN HIEROGLYPH H008"/* 13187 */,/*38985*/"EGYPTIAN HIEROGLYPH I001"/* 13188 */, /*38986*/"EGYPTIAN HIEROGLYPH I002"/* 13189 */,/*38987*/"EGYPTIAN HIEROGLYPH I003"/* 1318A */, /*38988*/"EGYPTIAN HIEROGLYPH I004"/* 1318B */,/*38989*/"EGYPTIAN HIEROGLYPH I005"/* 1318C */, /*38990*/"EGYPTIAN HIEROGLYPH I005A"/* 1318D */,/*38991*/"EGYPTIAN HIEROGLYPH I006"/* 1318E */, /*38992*/"EGYPTIAN HIEROGLYPH I007"/* 1318F */,/*38993*/"EGYPTIAN HIEROGLYPH I008"/* 13190 */, /*38994*/"EGYPTIAN HIEROGLYPH I009"/* 13191 */,/*38995*/"EGYPTIAN HIEROGLYPH I009A"/* 13192 */, /*38996*/"EGYPTIAN HIEROGLYPH I010"/* 13193 */,/*38997*/"EGYPTIAN HIEROGLYPH I010A"/* 13194 */, /*38998*/"EGYPTIAN HIEROGLYPH I011"/* 13195 */,/*38999*/"EGYPTIAN HIEROGLYPH I011A"/* 13196 */, /*39000*/"EGYPTIAN HIEROGLYPH I012"/* 13197 */,/*39001*/"EGYPTIAN HIEROGLYPH I013"/* 13198 */, /*39002*/"EGYPTIAN HIEROGLYPH I014"/* 13199 */,/*39003*/"EGYPTIAN HIEROGLYPH I015"/* 1319A */, /*39004*/"EGYPTIAN HIEROGLYPH K001"/* 1319B */,/*39005*/"EGYPTIAN HIEROGLYPH K002"/* 1319C */, /*39006*/"EGYPTIAN HIEROGLYPH K003"/* 1319D */,/*39007*/"EGYPTIAN HIEROGLYPH K004"/* 1319E */, /*39008*/"EGYPTIAN HIEROGLYPH K005"/* 1319F */,/*39009*/"EGYPTIAN HIEROGLYPH K006"/* 131A0 */, /*39010*/"EGYPTIAN HIEROGLYPH K007"/* 131A1 */,/*39011*/"EGYPTIAN HIEROGLYPH K008"/* 131A2 */, /*39012*/"EGYPTIAN HIEROGLYPH L001"/* 131A3 */,/*39013*/"EGYPTIAN HIEROGLYPH L002"/* 131A4 */, /*39014*/"EGYPTIAN HIEROGLYPH L002A"/* 131A5 */,/*39015*/"EGYPTIAN HIEROGLYPH L003"/* 131A6 */, /*39016*/"EGYPTIAN HIEROGLYPH L004"/* 131A7 */,/*39017*/"EGYPTIAN HIEROGLYPH L005"/* 131A8 */, /*39018*/"EGYPTIAN HIEROGLYPH L006"/* 131A9 */,/*39019*/"EGYPTIAN HIEROGLYPH L006A"/* 131AA */, /*39020*/"EGYPTIAN HIEROGLYPH L007"/* 131AB */,/*39021*/"EGYPTIAN HIEROGLYPH L008"/* 131AC */, /*39022*/"EGYPTIAN HIEROGLYPH M001"/* 131AD */,/*39023*/"EGYPTIAN HIEROGLYPH M001A"/* 131AE */, /*39024*/"EGYPTIAN HIEROGLYPH M001B"/* 131AF */,/*39025*/"EGYPTIAN HIEROGLYPH M002"/* 131B0 */, /*39026*/"EGYPTIAN HIEROGLYPH M003"/* 131B1 */,/*39027*/"EGYPTIAN HIEROGLYPH M003A"/* 131B2 */, /*39028*/"EGYPTIAN HIEROGLYPH M004"/* 131B3 */,/*39029*/"EGYPTIAN HIEROGLYPH M005"/* 131B4 */, /*39030*/"EGYPTIAN HIEROGLYPH M006"/* 131B5 */,/*39031*/"EGYPTIAN HIEROGLYPH M007"/* 131B6 */, /*39032*/"EGYPTIAN HIEROGLYPH M008"/* 131B7 */,/*39033*/"EGYPTIAN HIEROGLYPH M009"/* 131B8 */, /*39034*/"EGYPTIAN HIEROGLYPH M010"/* 131B9 */,/*39035*/"EGYPTIAN HIEROGLYPH M010A"/* 131BA */, /*39036*/"EGYPTIAN HIEROGLYPH M011"/* 131BB */,/*39037*/"EGYPTIAN HIEROGLYPH M012"/* 131BC */, /*39038*/"EGYPTIAN HIEROGLYPH M012A"/* 131BD */,/*39039*/"EGYPTIAN HIEROGLYPH M012B"/* 131BE */, /*39040*/"EGYPTIAN HIEROGLYPH M012C"/* 131BF */,/*39041*/"EGYPTIAN HIEROGLYPH M012D"/* 131C0 */, /*39042*/"EGYPTIAN HIEROGLYPH M012E"/* 131C1 */,/*39043*/"EGYPTIAN HIEROGLYPH M012F"/* 131C2 */, /*39044*/"EGYPTIAN HIEROGLYPH M012G"/* 131C3 */,/*39045*/"EGYPTIAN HIEROGLYPH M012H"/* 131C4 */, /*39046*/"EGYPTIAN HIEROGLYPH M013"/* 131C5 */,/*39047*/"EGYPTIAN HIEROGLYPH M014"/* 131C6 */, /*39048*/"EGYPTIAN HIEROGLYPH M015"/* 131C7 */,/*39049*/"EGYPTIAN HIEROGLYPH M015A"/* 131C8 */, /*39050*/"EGYPTIAN HIEROGLYPH M016"/* 131C9 */,/*39051*/"EGYPTIAN HIEROGLYPH M016A"/* 131CA */, /*39052*/"EGYPTIAN HIEROGLYPH M017"/* 131CB */,/*39053*/"EGYPTIAN HIEROGLYPH M017A"/* 131CC */, /*39054*/"EGYPTIAN HIEROGLYPH M018"/* 131CD */,/*39055*/"EGYPTIAN HIEROGLYPH M019"/* 131CE */, /*39056*/"EGYPTIAN HIEROGLYPH M020"/* 131CF */,/*39057*/"EGYPTIAN HIEROGLYPH M021"/* 131D0 */, /*39058*/"EGYPTIAN HIEROGLYPH M022"/* 131D1 */,/*39059*/"EGYPTIAN HIEROGLYPH M022A"/* 131D2 */, /*39060*/"EGYPTIAN HIEROGLYPH M023"/* 131D3 */,/*39061*/"EGYPTIAN HIEROGLYPH M024"/* 131D4 */, /*39062*/"EGYPTIAN HIEROGLYPH M024A"/* 131D5 */,/*39063*/"EGYPTIAN HIEROGLYPH M025"/* 131D6 */, /*39064*/"EGYPTIAN HIEROGLYPH M026"/* 131D7 */,/*39065*/"EGYPTIAN HIEROGLYPH M027"/* 131D8 */, /*39066*/"EGYPTIAN HIEROGLYPH M028"/* 131D9 */,/*39067*/"EGYPTIAN HIEROGLYPH M028A"/* 131DA */, /*39068*/"EGYPTIAN HIEROGLYPH M029"/* 131DB */,/*39069*/"EGYPTIAN HIEROGLYPH M030"/* 131DC */, /*39070*/"EGYPTIAN HIEROGLYPH M031"/* 131DD */,/*39071*/"EGYPTIAN HIEROGLYPH M031A"/* 131DE */, /*39072*/"EGYPTIAN HIEROGLYPH M032"/* 131DF */,/*39073*/"EGYPTIAN HIEROGLYPH M033"/* 131E0 */, /*39074*/"EGYPTIAN HIEROGLYPH M033A"/* 131E1 */,/*39075*/"EGYPTIAN HIEROGLYPH M033B"/* 131E2 */, /*39076*/"EGYPTIAN HIEROGLYPH M034"/* 131E3 */,/*39077*/"EGYPTIAN HIEROGLYPH M035"/* 131E4 */, /*39078*/"EGYPTIAN HIEROGLYPH M036"/* 131E5 */,/*39079*/"EGYPTIAN HIEROGLYPH M037"/* 131E6 */, /*39080*/"EGYPTIAN HIEROGLYPH M038"/* 131E7 */,/*39081*/"EGYPTIAN HIEROGLYPH M039"/* 131E8 */, /*39082*/"EGYPTIAN HIEROGLYPH M040"/* 131E9 */,/*39083*/"EGYPTIAN HIEROGLYPH M040A"/* 131EA */, /*39084*/"EGYPTIAN HIEROGLYPH M041"/* 131EB */,/*39085*/"EGYPTIAN HIEROGLYPH M042"/* 131EC */, /*39086*/"EGYPTIAN HIEROGLYPH M043"/* 131ED */,/*39087*/"EGYPTIAN HIEROGLYPH M044"/* 131EE */, /*39088*/"EGYPTIAN HIEROGLYPH N001"/* 131EF */,/*39089*/"EGYPTIAN HIEROGLYPH N002"/* 131F0 */, /*39090*/"EGYPTIAN HIEROGLYPH N003"/* 131F1 */,/*39091*/"EGYPTIAN HIEROGLYPH N004"/* 131F2 */, /*39092*/"EGYPTIAN HIEROGLYPH N005"/* 131F3 */,/*39093*/"EGYPTIAN HIEROGLYPH N006"/* 131F4 */, /*39094*/"EGYPTIAN HIEROGLYPH N007"/* 131F5 */,/*39095*/"EGYPTIAN HIEROGLYPH N008"/* 131F6 */, /*39096*/"EGYPTIAN HIEROGLYPH N009"/* 131F7 */,/*39097*/"EGYPTIAN HIEROGLYPH N010"/* 131F8 */, /*39098*/"EGYPTIAN HIEROGLYPH N011"/* 131F9 */,/*39099*/"EGYPTIAN HIEROGLYPH N012"/* 131FA */, /*39100*/"EGYPTIAN HIEROGLYPH N013"/* 131FB */,/*39101*/"EGYPTIAN HIEROGLYPH N014"/* 131FC */, /*39102*/"EGYPTIAN HIEROGLYPH N015"/* 131FD */,/*39103*/"EGYPTIAN HIEROGLYPH N016"/* 131FE */, /*39104*/"EGYPTIAN HIEROGLYPH N017"/* 131FF */,/*39105*/"EGYPTIAN HIEROGLYPH N018"/* 13200 */, /*39106*/"EGYPTIAN HIEROGLYPH N018A"/* 13201 */,/*39107*/"EGYPTIAN HIEROGLYPH N018B"/* 13202 */, /*39108*/"EGYPTIAN HIEROGLYPH N019"/* 13203 */,/*39109*/"EGYPTIAN HIEROGLYPH N020"/* 13204 */, /*39110*/"EGYPTIAN HIEROGLYPH N021"/* 13205 */,/*39111*/"EGYPTIAN HIEROGLYPH N022"/* 13206 */, /*39112*/"EGYPTIAN HIEROGLYPH N023"/* 13207 */,/*39113*/"EGYPTIAN HIEROGLYPH N024"/* 13208 */, /*39114*/"EGYPTIAN HIEROGLYPH N025"/* 13209 */,/*39115*/"EGYPTIAN HIEROGLYPH N025A"/* 1320A */, /*39116*/"EGYPTIAN HIEROGLYPH N026"/* 1320B */,/*39117*/"EGYPTIAN HIEROGLYPH N027"/* 1320C */, /*39118*/"EGYPTIAN HIEROGLYPH N028"/* 1320D */,/*39119*/"EGYPTIAN HIEROGLYPH N029"/* 1320E */, /*39120*/"EGYPTIAN HIEROGLYPH N030"/* 1320F */,/*39121*/"EGYPTIAN HIEROGLYPH N031"/* 13210 */, /*39122*/"EGYPTIAN HIEROGLYPH N032"/* 13211 */,/*39123*/"EGYPTIAN HIEROGLYPH N033"/* 13212 */, /*39124*/"EGYPTIAN HIEROGLYPH N033A"/* 13213 */,/*39125*/"EGYPTIAN HIEROGLYPH N034"/* 13214 */, /*39126*/"EGYPTIAN HIEROGLYPH N034A"/* 13215 */,/*39127*/"EGYPTIAN HIEROGLYPH N035"/* 13216 */, /*39128*/"EGYPTIAN HIEROGLYPH N035A"/* 13217 */,/*39129*/"EGYPTIAN HIEROGLYPH N036"/* 13218 */, /*39130*/"EGYPTIAN HIEROGLYPH N037"/* 13219 */,/*39131*/"EGYPTIAN HIEROGLYPH N037A"/* 1321A */, /*39132*/"EGYPTIAN HIEROGLYPH N038"/* 1321B */,/*39133*/"EGYPTIAN HIEROGLYPH N039"/* 1321C */, /*39134*/"EGYPTIAN HIEROGLYPH N040"/* 1321D */,/*39135*/"EGYPTIAN HIEROGLYPH N041"/* 1321E */, /*39136*/"EGYPTIAN HIEROGLYPH N042"/* 1321F */,/*39137*/"EGYPTIAN HIEROGLYPH NL001"/* 13220 */, /*39138*/"EGYPTIAN HIEROGLYPH NL002"/* 13221 */,/*39139*/"EGYPTIAN HIEROGLYPH NL003"/* 13222 */, /*39140*/"EGYPTIAN HIEROGLYPH NL004"/* 13223 */,/*39141*/"EGYPTIAN HIEROGLYPH NL005"/* 13224 */, /*39142*/"EGYPTIAN HIEROGLYPH NL005A"/* 13225 */,/*39143*/"EGYPTIAN HIEROGLYPH NL006"/* 13226 */, /*39144*/"EGYPTIAN HIEROGLYPH NL007"/* 13227 */,/*39145*/"EGYPTIAN HIEROGLYPH NL008"/* 13228 */, /*39146*/"EGYPTIAN HIEROGLYPH NL009"/* 13229 */,/*39147*/"EGYPTIAN HIEROGLYPH NL010"/* 1322A */, /*39148*/"EGYPTIAN HIEROGLYPH NL011"/* 1322B */,/*39149*/"EGYPTIAN HIEROGLYPH NL012"/* 1322C */, /*39150*/"EGYPTIAN HIEROGLYPH NL013"/* 1322D */,/*39151*/"EGYPTIAN HIEROGLYPH NL014"/* 1322E */, /*39152*/"EGYPTIAN HIEROGLYPH NL015"/* 1322F */,/*39153*/"EGYPTIAN HIEROGLYPH NL016"/* 13230 */, /*39154*/"EGYPTIAN HIEROGLYPH NL017"/* 13231 */,/*39155*/"EGYPTIAN HIEROGLYPH NL017A"/* 13232 */, /*39156*/"EGYPTIAN HIEROGLYPH NL018"/* 13233 */,/*39157*/"EGYPTIAN HIEROGLYPH NL019"/* 13234 */, /*39158*/"EGYPTIAN HIEROGLYPH NL020"/* 13235 */,/*39159*/"EGYPTIAN HIEROGLYPH NU001"/* 13236 */, /*39160*/"EGYPTIAN HIEROGLYPH NU002"/* 13237 */,/*39161*/"EGYPTIAN HIEROGLYPH NU003"/* 13238 */, /*39162*/"EGYPTIAN HIEROGLYPH NU004"/* 13239 */,/*39163*/"EGYPTIAN HIEROGLYPH NU005"/* 1323A */, /*39164*/"EGYPTIAN HIEROGLYPH NU006"/* 1323B */,/*39165*/"EGYPTIAN HIEROGLYPH NU007"/* 1323C */, /*39166*/"EGYPTIAN HIEROGLYPH NU008"/* 1323D */,/*39167*/"EGYPTIAN HIEROGLYPH NU009"/* 1323E */, /*39168*/"EGYPTIAN HIEROGLYPH NU010"/* 1323F */,/*39169*/"EGYPTIAN HIEROGLYPH NU010A"/* 13240 */, /*39170*/"EGYPTIAN HIEROGLYPH NU011"/* 13241 */,/*39171*/"EGYPTIAN HIEROGLYPH NU011A"/* 13242 */, /*39172*/"EGYPTIAN HIEROGLYPH NU012"/* 13243 */,/*39173*/"EGYPTIAN HIEROGLYPH NU013"/* 13244 */, /*39174*/"EGYPTIAN HIEROGLYPH NU014"/* 13245 */,/*39175*/"EGYPTIAN HIEROGLYPH NU015"/* 13246 */, /*39176*/"EGYPTIAN HIEROGLYPH NU016"/* 13247 */,/*39177*/"EGYPTIAN HIEROGLYPH NU017"/* 13248 */, /*39178*/"EGYPTIAN HIEROGLYPH NU018"/* 13249 */,/*39179*/"EGYPTIAN HIEROGLYPH NU018A"/* 1324A */, /*39180*/"EGYPTIAN HIEROGLYPH NU019"/* 1324B */,/*39181*/"EGYPTIAN HIEROGLYPH NU020"/* 1324C */, /*39182*/"EGYPTIAN HIEROGLYPH NU021"/* 1324D */,/*39183*/"EGYPTIAN HIEROGLYPH NU022"/* 1324E */, /*39184*/"EGYPTIAN HIEROGLYPH NU022A"/* 1324F */,/*39185*/"EGYPTIAN HIEROGLYPH O001"/* 13250 */, /*39186*/"EGYPTIAN HIEROGLYPH O001A"/* 13251 */,/*39187*/"EGYPTIAN HIEROGLYPH O002"/* 13252 */, /*39188*/"EGYPTIAN HIEROGLYPH O003"/* 13253 */,/*39189*/"EGYPTIAN HIEROGLYPH O004"/* 13254 */, /*39190*/"EGYPTIAN HIEROGLYPH O005"/* 13255 */,/*39191*/"EGYPTIAN HIEROGLYPH O005A"/* 13256 */, /*39192*/"EGYPTIAN HIEROGLYPH O006"/* 13257 */,/*39193*/"EGYPTIAN HIEROGLYPH O006A"/* 13258 */, /*39194*/"EGYPTIAN HIEROGLYPH O006B"/* 13259 */,/*39195*/"EGYPTIAN HIEROGLYPH O006C"/* 1325A */, /*39196*/"EGYPTIAN HIEROGLYPH O006D"/* 1325B */,/*39197*/"EGYPTIAN HIEROGLYPH O006E"/* 1325C */, /*39198*/"EGYPTIAN HIEROGLYPH O006F"/* 1325D */,/*39199*/"EGYPTIAN HIEROGLYPH O007"/* 1325E */, /*39200*/"EGYPTIAN HIEROGLYPH O008"/* 1325F */,/*39201*/"EGYPTIAN HIEROGLYPH O009"/* 13260 */, /*39202*/"EGYPTIAN HIEROGLYPH O010"/* 13261 */,/*39203*/"EGYPTIAN HIEROGLYPH O010A"/* 13262 */, /*39204*/"EGYPTIAN HIEROGLYPH O010B"/* 13263 */,/*39205*/"EGYPTIAN HIEROGLYPH O010C"/* 13264 */, /*39206*/"EGYPTIAN HIEROGLYPH O011"/* 13265 */,/*39207*/"EGYPTIAN HIEROGLYPH O012"/* 13266 */, /*39208*/"EGYPTIAN HIEROGLYPH O013"/* 13267 */,/*39209*/"EGYPTIAN HIEROGLYPH O014"/* 13268 */, /*39210*/"EGYPTIAN HIEROGLYPH O015"/* 13269 */,/*39211*/"EGYPTIAN HIEROGLYPH O016"/* 1326A */, /*39212*/"EGYPTIAN HIEROGLYPH O017"/* 1326B */,/*39213*/"EGYPTIAN HIEROGLYPH O018"/* 1326C */, /*39214*/"EGYPTIAN HIEROGLYPH O019"/* 1326D */,/*39215*/"EGYPTIAN HIEROGLYPH O019A"/* 1326E */, /*39216*/"EGYPTIAN HIEROGLYPH O020"/* 1326F */,/*39217*/"EGYPTIAN HIEROGLYPH O020A"/* 13270 */, /*39218*/"EGYPTIAN HIEROGLYPH O021"/* 13271 */,/*39219*/"EGYPTIAN HIEROGLYPH O022"/* 13272 */, /*39220*/"EGYPTIAN HIEROGLYPH O023"/* 13273 */,/*39221*/"EGYPTIAN HIEROGLYPH O024"/* 13274 */, /*39222*/"EGYPTIAN HIEROGLYPH O024A"/* 13275 */,/*39223*/"EGYPTIAN HIEROGLYPH O025"/* 13276 */, /*39224*/"EGYPTIAN HIEROGLYPH O025A"/* 13277 */,/*39225*/"EGYPTIAN HIEROGLYPH O026"/* 13278 */, /*39226*/"EGYPTIAN HIEROGLYPH O027"/* 13279 */,/*39227*/"EGYPTIAN HIEROGLYPH O028"/* 1327A */, /*39228*/"EGYPTIAN HIEROGLYPH O029"/* 1327B */,/*39229*/"EGYPTIAN HIEROGLYPH O029A"/* 1327C */, /*39230*/"EGYPTIAN HIEROGLYPH O030"/* 1327D */,/*39231*/"EGYPTIAN HIEROGLYPH O030A"/* 1327E */, /*39232*/"EGYPTIAN HIEROGLYPH O031"/* 1327F */,/*39233*/"EGYPTIAN HIEROGLYPH O032"/* 13280 */, /*39234*/"EGYPTIAN HIEROGLYPH O033"/* 13281 */,/*39235*/"EGYPTIAN HIEROGLYPH O033A"/* 13282 */, /*39236*/"EGYPTIAN HIEROGLYPH O034"/* 13283 */,/*39237*/"EGYPTIAN HIEROGLYPH O035"/* 13284 */, /*39238*/"EGYPTIAN HIEROGLYPH O036"/* 13285 */,/*39239*/"EGYPTIAN HIEROGLYPH O036A"/* 13286 */, /*39240*/"EGYPTIAN HIEROGLYPH O036B"/* 13287 */,/*39241*/"EGYPTIAN HIEROGLYPH O036C"/* 13288 */, /*39242*/"EGYPTIAN HIEROGLYPH O036D"/* 13289 */,/*39243*/"EGYPTIAN HIEROGLYPH O037"/* 1328A */, /*39244*/"EGYPTIAN HIEROGLYPH O038"/* 1328B */,/*39245*/"EGYPTIAN HIEROGLYPH O039"/* 1328C */, /*39246*/"EGYPTIAN HIEROGLYPH O040"/* 1328D */,/*39247*/"EGYPTIAN HIEROGLYPH O041"/* 1328E */, /*39248*/"EGYPTIAN HIEROGLYPH O042"/* 1328F */,/*39249*/"EGYPTIAN HIEROGLYPH O043"/* 13290 */, /*39250*/"EGYPTIAN HIEROGLYPH O044"/* 13291 */,/*39251*/"EGYPTIAN HIEROGLYPH O045"/* 13292 */, /*39252*/"EGYPTIAN HIEROGLYPH O046"/* 13293 */,/*39253*/"EGYPTIAN HIEROGLYPH O047"/* 13294 */, /*39254*/"EGYPTIAN HIEROGLYPH O048"/* 13295 */,/*39255*/"EGYPTIAN HIEROGLYPH O049"/* 13296 */, /*39256*/"EGYPTIAN HIEROGLYPH O050"/* 13297 */,/*39257*/"EGYPTIAN HIEROGLYPH O050A"/* 13298 */, /*39258*/"EGYPTIAN HIEROGLYPH O050B"/* 13299 */,/*39259*/"EGYPTIAN HIEROGLYPH O051"/* 1329A */, /*39260*/"EGYPTIAN HIEROGLYPH P001"/* 1329B */,/*39261*/"EGYPTIAN HIEROGLYPH P001A"/* 1329C */, /*39262*/"EGYPTIAN HIEROGLYPH P002"/* 1329D */,/*39263*/"EGYPTIAN HIEROGLYPH P003"/* 1329E */, /*39264*/"EGYPTIAN HIEROGLYPH P003A"/* 1329F */,/*39265*/"EGYPTIAN HIEROGLYPH P004"/* 132A0 */, /*39266*/"EGYPTIAN HIEROGLYPH P005"/* 132A1 */,/*39267*/"EGYPTIAN HIEROGLYPH P006"/* 132A2 */, /*39268*/"EGYPTIAN HIEROGLYPH P007"/* 132A3 */,/*39269*/"EGYPTIAN HIEROGLYPH P008"/* 132A4 */, /*39270*/"EGYPTIAN HIEROGLYPH P009"/* 132A5 */,/*39271*/"EGYPTIAN HIEROGLYPH P010"/* 132A6 */, /*39272*/"EGYPTIAN HIEROGLYPH P011"/* 132A7 */,/*39273*/"EGYPTIAN HIEROGLYPH Q001"/* 132A8 */, /*39274*/"EGYPTIAN HIEROGLYPH Q002"/* 132A9 */,/*39275*/"EGYPTIAN HIEROGLYPH Q003"/* 132AA */, /*39276*/"EGYPTIAN HIEROGLYPH Q004"/* 132AB */,/*39277*/"EGYPTIAN HIEROGLYPH Q005"/* 132AC */, /*39278*/"EGYPTIAN HIEROGLYPH Q006"/* 132AD */,/*39279*/"EGYPTIAN HIEROGLYPH Q007"/* 132AE */, /*39280*/"EGYPTIAN HIEROGLYPH R001"/* 132AF */,/*39281*/"EGYPTIAN HIEROGLYPH R002"/* 132B0 */, /*39282*/"EGYPTIAN HIEROGLYPH R002A"/* 132B1 */,/*39283*/"EGYPTIAN HIEROGLYPH R003"/* 132B2 */, /*39284*/"EGYPTIAN HIEROGLYPH R003A"/* 132B3 */,/*39285*/"EGYPTIAN HIEROGLYPH R003B"/* 132B4 */, /*39286*/"EGYPTIAN HIEROGLYPH R004"/* 132B5 */,/*39287*/"EGYPTIAN HIEROGLYPH R005"/* 132B6 */, /*39288*/"EGYPTIAN HIEROGLYPH R006"/* 132B7 */,/*39289*/"EGYPTIAN HIEROGLYPH R007"/* 132B8 */, /*39290*/"EGYPTIAN HIEROGLYPH R008"/* 132B9 */,/*39291*/"EGYPTIAN HIEROGLYPH R009"/* 132BA */, /*39292*/"EGYPTIAN HIEROGLYPH R010"/* 132BB */,/*39293*/"EGYPTIAN HIEROGLYPH R010A"/* 132BC */, /*39294*/"EGYPTIAN HIEROGLYPH R011"/* 132BD */,/*39295*/"EGYPTIAN HIEROGLYPH R012"/* 132BE */, /*39296*/"EGYPTIAN HIEROGLYPH R013"/* 132BF */,/*39297*/"EGYPTIAN HIEROGLYPH R014"/* 132C0 */, /*39298*/"EGYPTIAN HIEROGLYPH R015"/* 132C1 */,/*39299*/"EGYPTIAN HIEROGLYPH R016"/* 132C2 */, /*39300*/"EGYPTIAN HIEROGLYPH R016A"/* 132C3 */,/*39301*/"EGYPTIAN HIEROGLYPH R017"/* 132C4 */, /*39302*/"EGYPTIAN HIEROGLYPH R018"/* 132C5 */,/*39303*/"EGYPTIAN HIEROGLYPH R019"/* 132C6 */, /*39304*/"EGYPTIAN HIEROGLYPH R020"/* 132C7 */,/*39305*/"EGYPTIAN HIEROGLYPH R021"/* 132C8 */, /*39306*/"EGYPTIAN HIEROGLYPH R022"/* 132C9 */,/*39307*/"EGYPTIAN HIEROGLYPH R023"/* 132CA */, /*39308*/"EGYPTIAN HIEROGLYPH R024"/* 132CB */,/*39309*/"EGYPTIAN HIEROGLYPH R025"/* 132CC */, /*39310*/"EGYPTIAN HIEROGLYPH R026"/* 132CD */,/*39311*/"EGYPTIAN HIEROGLYPH R027"/* 132CE */, /*39312*/"EGYPTIAN HIEROGLYPH R028"/* 132CF */,/*39313*/"EGYPTIAN HIEROGLYPH R029"/* 132D0 */, /*39314*/"EGYPTIAN HIEROGLYPH S001"/* 132D1 */,/*39315*/"EGYPTIAN HIEROGLYPH S002"/* 132D2 */, /*39316*/"EGYPTIAN HIEROGLYPH S002A"/* 132D3 */,/*39317*/"EGYPTIAN HIEROGLYPH S003"/* 132D4 */, /*39318*/"EGYPTIAN HIEROGLYPH S004"/* 132D5 */,/*39319*/"EGYPTIAN HIEROGLYPH S005"/* 132D6 */, /*39320*/"EGYPTIAN HIEROGLYPH S006"/* 132D7 */,/*39321*/"EGYPTIAN HIEROGLYPH S006A"/* 132D8 */, /*39322*/"EGYPTIAN HIEROGLYPH S007"/* 132D9 */,/*39323*/"EGYPTIAN HIEROGLYPH S008"/* 132DA */, /*39324*/"EGYPTIAN HIEROGLYPH S009"/* 132DB */,/*39325*/"EGYPTIAN HIEROGLYPH S010"/* 132DC */, /*39326*/"EGYPTIAN HIEROGLYPH S011"/* 132DD */,/*39327*/"EGYPTIAN HIEROGLYPH S012"/* 132DE */, /*39328*/"EGYPTIAN HIEROGLYPH S013"/* 132DF */,/*39329*/"EGYPTIAN HIEROGLYPH S014"/* 132E0 */, /*39330*/"EGYPTIAN HIEROGLYPH S014A"/* 132E1 */,/*39331*/"EGYPTIAN HIEROGLYPH S014B"/* 132E2 */, /*39332*/"EGYPTIAN HIEROGLYPH S015"/* 132E3 */,/*39333*/"EGYPTIAN HIEROGLYPH S016"/* 132E4 */, /*39334*/"EGYPTIAN HIEROGLYPH S017"/* 132E5 */,/*39335*/"EGYPTIAN HIEROGLYPH S017A"/* 132E6 */, /*39336*/"EGYPTIAN HIEROGLYPH S018"/* 132E7 */,/*39337*/"EGYPTIAN HIEROGLYPH S019"/* 132E8 */, /*39338*/"EGYPTIAN HIEROGLYPH S020"/* 132E9 */,/*39339*/"EGYPTIAN HIEROGLYPH S021"/* 132EA */, /*39340*/"EGYPTIAN HIEROGLYPH S022"/* 132EB */,/*39341*/"EGYPTIAN HIEROGLYPH S023"/* 132EC */, /*39342*/"EGYPTIAN HIEROGLYPH S024"/* 132ED */,/*39343*/"EGYPTIAN HIEROGLYPH S025"/* 132EE */, /*39344*/"EGYPTIAN HIEROGLYPH S026"/* 132EF */,/*39345*/"EGYPTIAN HIEROGLYPH S026A"/* 132F0 */, /*39346*/"EGYPTIAN HIEROGLYPH S026B"/* 132F1 */,/*39347*/"EGYPTIAN HIEROGLYPH S027"/* 132F2 */, /*39348*/"EGYPTIAN HIEROGLYPH S028"/* 132F3 */,/*39349*/"EGYPTIAN HIEROGLYPH S029"/* 132F4 */, /*39350*/"EGYPTIAN HIEROGLYPH S030"/* 132F5 */,/*39351*/"EGYPTIAN HIEROGLYPH S031"/* 132F6 */, /*39352*/"EGYPTIAN HIEROGLYPH S032"/* 132F7 */,/*39353*/"EGYPTIAN HIEROGLYPH S033"/* 132F8 */, /*39354*/"EGYPTIAN HIEROGLYPH S034"/* 132F9 */,/*39355*/"EGYPTIAN HIEROGLYPH S035"/* 132FA */, /*39356*/"EGYPTIAN HIEROGLYPH S035A"/* 132FB */,/*39357*/"EGYPTIAN HIEROGLYPH S036"/* 132FC */, /*39358*/"EGYPTIAN HIEROGLYPH S037"/* 132FD */,/*39359*/"EGYPTIAN HIEROGLYPH S038"/* 132FE */, /*39360*/"EGYPTIAN HIEROGLYPH S039"/* 132FF */,/*39361*/"EGYPTIAN HIEROGLYPH S040"/* 13300 */, /*39362*/"EGYPTIAN HIEROGLYPH S041"/* 13301 */,/*39363*/"EGYPTIAN HIEROGLYPH S042"/* 13302 */, /*39364*/"EGYPTIAN HIEROGLYPH S043"/* 13303 */,/*39365*/"EGYPTIAN HIEROGLYPH S044"/* 13304 */, /*39366*/"EGYPTIAN HIEROGLYPH S045"/* 13305 */,/*39367*/"EGYPTIAN HIEROGLYPH S046"/* 13306 */, /*39368*/"EGYPTIAN HIEROGLYPH T001"/* 13307 */,/*39369*/"EGYPTIAN HIEROGLYPH T002"/* 13308 */, /*39370*/"EGYPTIAN HIEROGLYPH T003"/* 13309 */,/*39371*/"EGYPTIAN HIEROGLYPH T003A"/* 1330A */, /*39372*/"EGYPTIAN HIEROGLYPH T004"/* 1330B */,/*39373*/"EGYPTIAN HIEROGLYPH T005"/* 1330C */, /*39374*/"EGYPTIAN HIEROGLYPH T006"/* 1330D */,/*39375*/"EGYPTIAN HIEROGLYPH T007"/* 1330E */, /*39376*/"EGYPTIAN HIEROGLYPH T007A"/* 1330F */,/*39377*/"EGYPTIAN HIEROGLYPH T008"/* 13310 */, /*39378*/"EGYPTIAN HIEROGLYPH T008A"/* 13311 */,/*39379*/"EGYPTIAN HIEROGLYPH T009"/* 13312 */, /*39380*/"EGYPTIAN HIEROGLYPH T009A"/* 13313 */,/*39381*/"EGYPTIAN HIEROGLYPH T010"/* 13314 */, /*39382*/"EGYPTIAN HIEROGLYPH T011"/* 13315 */,/*39383*/"EGYPTIAN HIEROGLYPH T011A"/* 13316 */, /*39384*/"EGYPTIAN HIEROGLYPH T012"/* 13317 */,/*39385*/"EGYPTIAN HIEROGLYPH T013"/* 13318 */, /*39386*/"EGYPTIAN HIEROGLYPH T014"/* 13319 */,/*39387*/"EGYPTIAN HIEROGLYPH T015"/* 1331A */, /*39388*/"EGYPTIAN HIEROGLYPH T016"/* 1331B */,/*39389*/"EGYPTIAN HIEROGLYPH T016A"/* 1331C */, /*39390*/"EGYPTIAN HIEROGLYPH T017"/* 1331D */,/*39391*/"EGYPTIAN HIEROGLYPH T018"/* 1331E */, /*39392*/"EGYPTIAN HIEROGLYPH T019"/* 1331F */,/*39393*/"EGYPTIAN HIEROGLYPH T020"/* 13320 */, /*39394*/"EGYPTIAN HIEROGLYPH T021"/* 13321 */,/*39395*/"EGYPTIAN HIEROGLYPH T022"/* 13322 */, /*39396*/"EGYPTIAN HIEROGLYPH T023"/* 13323 */,/*39397*/"EGYPTIAN HIEROGLYPH T024"/* 13324 */, /*39398*/"EGYPTIAN HIEROGLYPH T025"/* 13325 */,/*39399*/"EGYPTIAN HIEROGLYPH T026"/* 13326 */, /*39400*/"EGYPTIAN HIEROGLYPH T027"/* 13327 */,/*39401*/"EGYPTIAN HIEROGLYPH T028"/* 13328 */, /*39402*/"EGYPTIAN HIEROGLYPH T029"/* 13329 */,/*39403*/"EGYPTIAN HIEROGLYPH T030"/* 1332A */, /*39404*/"EGYPTIAN HIEROGLYPH T031"/* 1332B */,/*39405*/"EGYPTIAN HIEROGLYPH T032"/* 1332C */, /*39406*/"EGYPTIAN HIEROGLYPH T032A"/* 1332D */,/*39407*/"EGYPTIAN HIEROGLYPH T033"/* 1332E */, /*39408*/"EGYPTIAN HIEROGLYPH T033A"/* 1332F */,/*39409*/"EGYPTIAN HIEROGLYPH T034"/* 13330 */, /*39410*/"EGYPTIAN HIEROGLYPH T035"/* 13331 */,/*39411*/"EGYPTIAN HIEROGLYPH T036"/* 13332 */, /*39412*/"EGYPTIAN HIEROGLYPH U001"/* 13333 */,/*39413*/"EGYPTIAN HIEROGLYPH U002"/* 13334 */, /*39414*/"EGYPTIAN HIEROGLYPH U003"/* 13335 */,/*39415*/"EGYPTIAN HIEROGLYPH U004"/* 13336 */, /*39416*/"EGYPTIAN HIEROGLYPH U005"/* 13337 */,/*39417*/"EGYPTIAN HIEROGLYPH U006"/* 13338 */, /*39418*/"EGYPTIAN HIEROGLYPH U006A"/* 13339 */,/*39419*/"EGYPTIAN HIEROGLYPH U006B"/* 1333A */, /*39420*/"EGYPTIAN HIEROGLYPH U007"/* 1333B */,/*39421*/"EGYPTIAN HIEROGLYPH U008"/* 1333C */, /*39422*/"EGYPTIAN HIEROGLYPH U009"/* 1333D */,/*39423*/"EGYPTIAN HIEROGLYPH U010"/* 1333E */, /*39424*/"EGYPTIAN HIEROGLYPH U011"/* 1333F */,/*39425*/"EGYPTIAN HIEROGLYPH U012"/* 13340 */, /*39426*/"EGYPTIAN HIEROGLYPH U013"/* 13341 */,/*39427*/"EGYPTIAN HIEROGLYPH U014"/* 13342 */, /*39428*/"EGYPTIAN HIEROGLYPH U015"/* 13343 */,/*39429*/"EGYPTIAN HIEROGLYPH U016"/* 13344 */, /*39430*/"EGYPTIAN HIEROGLYPH U017"/* 13345 */,/*39431*/"EGYPTIAN HIEROGLYPH U018"/* 13346 */, /*39432*/"EGYPTIAN HIEROGLYPH U019"/* 13347 */,/*39433*/"EGYPTIAN HIEROGLYPH U020"/* 13348 */, /*39434*/"EGYPTIAN HIEROGLYPH U021"/* 13349 */,/*39435*/"EGYPTIAN HIEROGLYPH U022"/* 1334A */, /*39436*/"EGYPTIAN HIEROGLYPH U023"/* 1334B */,/*39437*/"EGYPTIAN HIEROGLYPH U023A"/* 1334C */, /*39438*/"EGYPTIAN HIEROGLYPH U024"/* 1334D */,/*39439*/"EGYPTIAN HIEROGLYPH U025"/* 1334E */, /*39440*/"EGYPTIAN HIEROGLYPH U026"/* 1334F */,/*39441*/"EGYPTIAN HIEROGLYPH U027"/* 13350 */, /*39442*/"EGYPTIAN HIEROGLYPH U028"/* 13351 */,/*39443*/"EGYPTIAN HIEROGLYPH U029"/* 13352 */, /*39444*/"EGYPTIAN HIEROGLYPH U029A"/* 13353 */,/*39445*/"EGYPTIAN HIEROGLYPH U030"/* 13354 */, /*39446*/"EGYPTIAN HIEROGLYPH U031"/* 13355 */,/*39447*/"EGYPTIAN HIEROGLYPH U032"/* 13356 */, /*39448*/"EGYPTIAN HIEROGLYPH U032A"/* 13357 */,/*39449*/"EGYPTIAN HIEROGLYPH U033"/* 13358 */, /*39450*/"EGYPTIAN HIEROGLYPH U034"/* 13359 */,/*39451*/"EGYPTIAN HIEROGLYPH U035"/* 1335A */, /*39452*/"EGYPTIAN HIEROGLYPH U036"/* 1335B */,/*39453*/"EGYPTIAN HIEROGLYPH U037"/* 1335C */, /*39454*/"EGYPTIAN HIEROGLYPH U038"/* 1335D */,/*39455*/"EGYPTIAN HIEROGLYPH U039"/* 1335E */, /*39456*/"EGYPTIAN HIEROGLYPH U040"/* 1335F */,/*39457*/"EGYPTIAN HIEROGLYPH U041"/* 13360 */, /*39458*/"EGYPTIAN HIEROGLYPH U042"/* 13361 */,/*39459*/"EGYPTIAN HIEROGLYPH V001"/* 13362 */, /*39460*/"EGYPTIAN HIEROGLYPH V001A"/* 13363 */,/*39461*/"EGYPTIAN HIEROGLYPH V001B"/* 13364 */, /*39462*/"EGYPTIAN HIEROGLYPH V001C"/* 13365 */,/*39463*/"EGYPTIAN HIEROGLYPH V001D"/* 13366 */, /*39464*/"EGYPTIAN HIEROGLYPH V001E"/* 13367 */,/*39465*/"EGYPTIAN HIEROGLYPH V001F"/* 13368 */, /*39466*/"EGYPTIAN HIEROGLYPH V001G"/* 13369 */,/*39467*/"EGYPTIAN HIEROGLYPH V001H"/* 1336A */, /*39468*/"EGYPTIAN HIEROGLYPH V001I"/* 1336B */,/*39469*/"EGYPTIAN HIEROGLYPH V002"/* 1336C */, /*39470*/"EGYPTIAN HIEROGLYPH V002A"/* 1336D */,/*39471*/"EGYPTIAN HIEROGLYPH V003"/* 1336E */, /*39472*/"EGYPTIAN HIEROGLYPH V004"/* 1336F */,/*39473*/"EGYPTIAN HIEROGLYPH V005"/* 13370 */, /*39474*/"EGYPTIAN HIEROGLYPH V006"/* 13371 */,/*39475*/"EGYPTIAN HIEROGLYPH V007"/* 13372 */, /*39476*/"EGYPTIAN HIEROGLYPH V007A"/* 13373 */,/*39477*/"EGYPTIAN HIEROGLYPH V007B"/* 13374 */, /*39478*/"EGYPTIAN HIEROGLYPH V008"/* 13375 */,/*39479*/"EGYPTIAN HIEROGLYPH V009"/* 13376 */, /*39480*/"EGYPTIAN HIEROGLYPH V010"/* 13377 */,/*39481*/"EGYPTIAN HIEROGLYPH V011"/* 13378 */, /*39482*/"EGYPTIAN HIEROGLYPH V011A"/* 13379 */,/*39483*/"EGYPTIAN HIEROGLYPH V011B"/* 1337A */, /*39484*/"EGYPTIAN HIEROGLYPH V011C"/* 1337B */,/*39485*/"EGYPTIAN HIEROGLYPH V012"/* 1337C */, /*39486*/"EGYPTIAN HIEROGLYPH V012A"/* 1337D */,/*39487*/"EGYPTIAN HIEROGLYPH V012B"/* 1337E */, /*39488*/"EGYPTIAN HIEROGLYPH V013"/* 1337F */,/*39489*/"EGYPTIAN HIEROGLYPH V014"/* 13380 */, /*39490*/"EGYPTIAN HIEROGLYPH V015"/* 13381 */,/*39491*/"EGYPTIAN HIEROGLYPH V016"/* 13382 */, /*39492*/"EGYPTIAN HIEROGLYPH V017"/* 13383 */,/*39493*/"EGYPTIAN HIEROGLYPH V018"/* 13384 */, /*39494*/"EGYPTIAN HIEROGLYPH V019"/* 13385 */,/*39495*/"EGYPTIAN HIEROGLYPH V020"/* 13386 */, /*39496*/"EGYPTIAN HIEROGLYPH V020A"/* 13387 */,/*39497*/"EGYPTIAN HIEROGLYPH V020B"/* 13388 */, /*39498*/"EGYPTIAN HIEROGLYPH V020C"/* 13389 */,/*39499*/"EGYPTIAN HIEROGLYPH V020D"/* 1338A */, /*39500*/"EGYPTIAN HIEROGLYPH V020E"/* 1338B */,/*39501*/"EGYPTIAN HIEROGLYPH V020F"/* 1338C */, /*39502*/"EGYPTIAN HIEROGLYPH V020G"/* 1338D */,/*39503*/"EGYPTIAN HIEROGLYPH V020H"/* 1338E */, /*39504*/"EGYPTIAN HIEROGLYPH V020I"/* 1338F */,/*39505*/"EGYPTIAN HIEROGLYPH V020J"/* 13390 */, /*39506*/"EGYPTIAN HIEROGLYPH V020K"/* 13391 */,/*39507*/"EGYPTIAN HIEROGLYPH V020L"/* 13392 */, /*39508*/"EGYPTIAN HIEROGLYPH V021"/* 13393 */,/*39509*/"EGYPTIAN HIEROGLYPH V022"/* 13394 */, /*39510*/"EGYPTIAN HIEROGLYPH V023"/* 13395 */,/*39511*/"EGYPTIAN HIEROGLYPH V023A"/* 13396 */, /*39512*/"EGYPTIAN HIEROGLYPH V024"/* 13397 */,/*39513*/"EGYPTIAN HIEROGLYPH V025"/* 13398 */, /*39514*/"EGYPTIAN HIEROGLYPH V026"/* 13399 */,/*39515*/"EGYPTIAN HIEROGLYPH V027"/* 1339A */, /*39516*/"EGYPTIAN HIEROGLYPH V028"/* 1339B */,/*39517*/"EGYPTIAN HIEROGLYPH V028A"/* 1339C */, /*39518*/"EGYPTIAN HIEROGLYPH V029"/* 1339D */,/*39519*/"EGYPTIAN HIEROGLYPH V029A"/* 1339E */, /*39520*/"EGYPTIAN HIEROGLYPH V030"/* 1339F */,/*39521*/"EGYPTIAN HIEROGLYPH V030A"/* 133A0 */, /*39522*/"EGYPTIAN HIEROGLYPH V031"/* 133A1 */,/*39523*/"EGYPTIAN HIEROGLYPH V031A"/* 133A2 */, /*39524*/"EGYPTIAN HIEROGLYPH V032"/* 133A3 */,/*39525*/"EGYPTIAN HIEROGLYPH V033"/* 133A4 */, /*39526*/"EGYPTIAN HIEROGLYPH V033A"/* 133A5 */,/*39527*/"EGYPTIAN HIEROGLYPH V034"/* 133A6 */, /*39528*/"EGYPTIAN HIEROGLYPH V035"/* 133A7 */,/*39529*/"EGYPTIAN HIEROGLYPH V036"/* 133A8 */, /*39530*/"EGYPTIAN HIEROGLYPH V037"/* 133A9 */,/*39531*/"EGYPTIAN HIEROGLYPH V037A"/* 133AA */, /*39532*/"EGYPTIAN HIEROGLYPH V038"/* 133AB */,/*39533*/"EGYPTIAN HIEROGLYPH V039"/* 133AC */, /*39534*/"EGYPTIAN HIEROGLYPH V040"/* 133AD */,/*39535*/"EGYPTIAN HIEROGLYPH V040A"/* 133AE */, /*39536*/"EGYPTIAN HIEROGLYPH W001"/* 133AF */,/*39537*/"EGYPTIAN HIEROGLYPH W002"/* 133B0 */, /*39538*/"EGYPTIAN HIEROGLYPH W003"/* 133B1 */,/*39539*/"EGYPTIAN HIEROGLYPH W003A"/* 133B2 */, /*39540*/"EGYPTIAN HIEROGLYPH W004"/* 133B3 */,/*39541*/"EGYPTIAN HIEROGLYPH W005"/* 133B4 */, /*39542*/"EGYPTIAN HIEROGLYPH W006"/* 133B5 */,/*39543*/"EGYPTIAN HIEROGLYPH W007"/* 133B6 */, /*39544*/"EGYPTIAN HIEROGLYPH W008"/* 133B7 */,/*39545*/"EGYPTIAN HIEROGLYPH W009"/* 133B8 */, /*39546*/"EGYPTIAN HIEROGLYPH W009A"/* 133B9 */,/*39547*/"EGYPTIAN HIEROGLYPH W010"/* 133BA */, /*39548*/"EGYPTIAN HIEROGLYPH W010A"/* 133BB */,/*39549*/"EGYPTIAN HIEROGLYPH W011"/* 133BC */, /*39550*/"EGYPTIAN HIEROGLYPH W012"/* 133BD */,/*39551*/"EGYPTIAN HIEROGLYPH W013"/* 133BE */, /*39552*/"EGYPTIAN HIEROGLYPH W014"/* 133BF */,/*39553*/"EGYPTIAN HIEROGLYPH W014A"/* 133C0 */, /*39554*/"EGYPTIAN HIEROGLYPH W015"/* 133C1 */,/*39555*/"EGYPTIAN HIEROGLYPH W016"/* 133C2 */, /*39556*/"EGYPTIAN HIEROGLYPH W017"/* 133C3 */,/*39557*/"EGYPTIAN HIEROGLYPH W017A"/* 133C4 */, /*39558*/"EGYPTIAN HIEROGLYPH W018"/* 133C5 */,/*39559*/"EGYPTIAN HIEROGLYPH W018A"/* 133C6 */, /*39560*/"EGYPTIAN HIEROGLYPH W019"/* 133C7 */,/*39561*/"EGYPTIAN HIEROGLYPH W020"/* 133C8 */, /*39562*/"EGYPTIAN HIEROGLYPH W021"/* 133C9 */,/*39563*/"EGYPTIAN HIEROGLYPH W022"/* 133CA */, /*39564*/"EGYPTIAN HIEROGLYPH W023"/* 133CB */,/*39565*/"EGYPTIAN HIEROGLYPH W024"/* 133CC */, /*39566*/"EGYPTIAN HIEROGLYPH W024A"/* 133CD */,/*39567*/"EGYPTIAN HIEROGLYPH W025"/* 133CE */, /*39568*/"EGYPTIAN HIEROGLYPH X001"/* 133CF */,/*39569*/"EGYPTIAN HIEROGLYPH X002"/* 133D0 */, /*39570*/"EGYPTIAN HIEROGLYPH X003"/* 133D1 */,/*39571*/"EGYPTIAN HIEROGLYPH X004"/* 133D2 */, /*39572*/"EGYPTIAN HIEROGLYPH X004A"/* 133D3 */,/*39573*/"EGYPTIAN HIEROGLYPH X004B"/* 133D4 */, /*39574*/"EGYPTIAN HIEROGLYPH X005"/* 133D5 */,/*39575*/"EGYPTIAN HIEROGLYPH X006"/* 133D6 */, /*39576*/"EGYPTIAN HIEROGLYPH X006A"/* 133D7 */,/*39577*/"EGYPTIAN HIEROGLYPH X007"/* 133D8 */, /*39578*/"EGYPTIAN HIEROGLYPH X008"/* 133D9 */,/*39579*/"EGYPTIAN HIEROGLYPH X008A"/* 133DA */, /*39580*/"EGYPTIAN HIEROGLYPH Y001"/* 133DB */,/*39581*/"EGYPTIAN HIEROGLYPH Y001A"/* 133DC */, /*39582*/"EGYPTIAN HIEROGLYPH Y002"/* 133DD */,/*39583*/"EGYPTIAN HIEROGLYPH Y003"/* 133DE */, /*39584*/"EGYPTIAN HIEROGLYPH Y004"/* 133DF */,/*39585*/"EGYPTIAN HIEROGLYPH Y005"/* 133E0 */, /*39586*/"EGYPTIAN HIEROGLYPH Y006"/* 133E1 */,/*39587*/"EGYPTIAN HIEROGLYPH Y007"/* 133E2 */, /*39588*/"EGYPTIAN HIEROGLYPH Y008"/* 133E3 */,/*39589*/"EGYPTIAN HIEROGLYPH Z001"/* 133E4 */, /*39590*/"EGYPTIAN HIEROGLYPH Z002"/* 133E5 */,/*39591*/"EGYPTIAN HIEROGLYPH Z002A"/* 133E6 */, /*39592*/"EGYPTIAN HIEROGLYPH Z002B"/* 133E7 */,/*39593*/"EGYPTIAN HIEROGLYPH Z002C"/* 133E8 */, /*39594*/"EGYPTIAN HIEROGLYPH Z002D"/* 133E9 */,/*39595*/"EGYPTIAN HIEROGLYPH Z003"/* 133EA */, /*39596*/"EGYPTIAN HIEROGLYPH Z003A"/* 133EB */,/*39597*/"EGYPTIAN HIEROGLYPH Z003B"/* 133EC */, /*39598*/"EGYPTIAN HIEROGLYPH Z004"/* 133ED */,/*39599*/"EGYPTIAN HIEROGLYPH Z004A"/* 133EE */, /*39600*/"EGYPTIAN HIEROGLYPH Z005"/* 133EF */,/*39601*/"EGYPTIAN HIEROGLYPH Z005A"/* 133F0 */, /*39602*/"EGYPTIAN HIEROGLYPH Z006"/* 133F1 */,/*39603*/"EGYPTIAN HIEROGLYPH Z007"/* 133F2 */, /*39604*/"EGYPTIAN HIEROGLYPH Z008"/* 133F3 */,/*39605*/"EGYPTIAN HIEROGLYPH Z009"/* 133F4 */, /*39606*/"EGYPTIAN HIEROGLYPH Z010"/* 133F5 */,/*39607*/"EGYPTIAN HIEROGLYPH Z011"/* 133F6 */, /*39608*/"EGYPTIAN HIEROGLYPH Z012"/* 133F7 */,/*39609*/"EGYPTIAN HIEROGLYPH Z013"/* 133F8 */, /*39610*/"EGYPTIAN HIEROGLYPH Z014"/* 133F9 */,/*39611*/"EGYPTIAN HIEROGLYPH Z015"/* 133FA */, /*39612*/"EGYPTIAN HIEROGLYPH Z015A"/* 133FB */,/*39613*/"EGYPTIAN HIEROGLYPH Z015B"/* 133FC */, /*39614*/"EGYPTIAN HIEROGLYPH Z015C"/* 133FD */,/*39615*/"EGYPTIAN HIEROGLYPH Z015D"/* 133FE */, /*39616*/"EGYPTIAN HIEROGLYPH Z015E"/* 133FF */,/*39617*/"EGYPTIAN HIEROGLYPH Z015F"/* 13400 */, /*39618*/"EGYPTIAN HIEROGLYPH Z015G"/* 13401 */,/*39619*/"EGYPTIAN HIEROGLYPH Z015H"/* 13402 */, /*39620*/"EGYPTIAN HIEROGLYPH Z015I"/* 13403 */,/*39621*/"EGYPTIAN HIEROGLYPH Z016"/* 13404 */, /*39622*/"EGYPTIAN HIEROGLYPH Z016A"/* 13405 */,/*39623*/"EGYPTIAN HIEROGLYPH Z016B"/* 13406 */, /*39624*/"EGYPTIAN HIEROGLYPH Z016C"/* 13407 */,/*39625*/"EGYPTIAN HIEROGLYPH Z016D"/* 13408 */, /*39626*/"EGYPTIAN HIEROGLYPH Z016E"/* 13409 */,/*39627*/"EGYPTIAN HIEROGLYPH Z016F"/* 1340A */, /*39628*/"EGYPTIAN HIEROGLYPH Z016G"/* 1340B */,/*39629*/"EGYPTIAN HIEROGLYPH Z016H"/* 1340C */, /*39630*/"EGYPTIAN HIEROGLYPH AA001"/* 1340D */,/*39631*/"EGYPTIAN HIEROGLYPH AA002"/* 1340E */, /*39632*/"EGYPTIAN HIEROGLYPH AA003"/* 1340F */,/*39633*/"EGYPTIAN HIEROGLYPH AA004"/* 13410 */, /*39634*/"EGYPTIAN HIEROGLYPH AA005"/* 13411 */,/*39635*/"EGYPTIAN HIEROGLYPH AA006"/* 13412 */, /*39636*/"EGYPTIAN HIEROGLYPH AA007"/* 13413 */,/*39637*/"EGYPTIAN HIEROGLYPH AA007A"/* 13414 */, /*39638*/"EGYPTIAN HIEROGLYPH AA007B"/* 13415 */,/*39639*/"EGYPTIAN HIEROGLYPH AA008"/* 13416 */, /*39640*/"EGYPTIAN HIEROGLYPH AA009"/* 13417 */,/*39641*/"EGYPTIAN HIEROGLYPH AA010"/* 13418 */, /*39642*/"EGYPTIAN HIEROGLYPH AA011"/* 13419 */,/*39643*/"EGYPTIAN HIEROGLYPH AA012"/* 1341A */, /*39644*/"EGYPTIAN HIEROGLYPH AA013"/* 1341B */,/*39645*/"EGYPTIAN HIEROGLYPH AA014"/* 1341C */, /*39646*/"EGYPTIAN HIEROGLYPH AA015"/* 1341D */,/*39647*/"EGYPTIAN HIEROGLYPH AA016"/* 1341E */, /*39648*/"EGYPTIAN HIEROGLYPH AA017"/* 1341F */,/*39649*/"EGYPTIAN HIEROGLYPH AA018"/* 13420 */, /*39650*/"EGYPTIAN HIEROGLYPH AA019"/* 13421 */,/*39651*/"EGYPTIAN HIEROGLYPH AA020"/* 13422 */, /*39652*/"EGYPTIAN HIEROGLYPH AA021"/* 13423 */,/*39653*/"EGYPTIAN HIEROGLYPH AA022"/* 13424 */, /*39654*/"EGYPTIAN HIEROGLYPH AA023"/* 13425 */,/*39655*/"EGYPTIAN HIEROGLYPH AA024"/* 13426 */, /*39656*/"EGYPTIAN HIEROGLYPH AA025"/* 13427 */,/*39657*/"EGYPTIAN HIEROGLYPH AA026"/* 13428 */, /*39658*/"EGYPTIAN HIEROGLYPH AA027"/* 13429 */,/*39659*/"EGYPTIAN HIEROGLYPH AA028"/* 1342A */, /*39660*/"EGYPTIAN HIEROGLYPH AA029"/* 1342B */,/*39661*/"EGYPTIAN HIEROGLYPH AA030"/* 1342C */, /*39662*/"EGYPTIAN HIEROGLYPH AA031"/* 1342D */,/*39663*/"EGYPTIAN HIEROGLYPH AA032"/* 1342E */, /*39664*/"ANATOLIAN HIEROGLYPH A001"/* 14400 */,/*39665*/"ANATOLIAN HIEROGLYPH A002"/* 14401 */, /*39666*/"ANATOLIAN HIEROGLYPH A003"/* 14402 */,/*39667*/"ANATOLIAN HIEROGLYPH A004"/* 14403 */, /*39668*/"ANATOLIAN HIEROGLYPH A005"/* 14404 */,/*39669*/"ANATOLIAN HIEROGLYPH A006"/* 14405 */, /*39670*/"ANATOLIAN HIEROGLYPH A007"/* 14406 */,/*39671*/"ANATOLIAN HIEROGLYPH A008"/* 14407 */, /*39672*/"ANATOLIAN HIEROGLYPH A009"/* 14408 */,/*39673*/"ANATOLIAN HIEROGLYPH A010"/* 14409 */, /*39674*/"ANATOLIAN HIEROGLYPH A010A"/* 1440A */,/*39675*/"ANATOLIAN HIEROGLYPH A011"/* 1440B */, /*39676*/"ANATOLIAN HIEROGLYPH A012"/* 1440C */,/*39677*/"ANATOLIAN HIEROGLYPH A013"/* 1440D */, /*39678*/"ANATOLIAN HIEROGLYPH A014"/* 1440E */,/*39679*/"ANATOLIAN HIEROGLYPH A015"/* 1440F */, /*39680*/"ANATOLIAN HIEROGLYPH A016"/* 14410 */,/*39681*/"ANATOLIAN HIEROGLYPH A017"/* 14411 */, /*39682*/"ANATOLIAN HIEROGLYPH A018"/* 14412 */,/*39683*/"ANATOLIAN HIEROGLYPH A019"/* 14413 */, /*39684*/"ANATOLIAN HIEROGLYPH A020"/* 14414 */,/*39685*/"ANATOLIAN HIEROGLYPH A021"/* 14415 */, /*39686*/"ANATOLIAN HIEROGLYPH A022"/* 14416 */,/*39687*/"ANATOLIAN HIEROGLYPH A023"/* 14417 */, /*39688*/"ANATOLIAN HIEROGLYPH A024"/* 14418 */,/*39689*/"ANATOLIAN HIEROGLYPH A025"/* 14419 */, /*39690*/"ANATOLIAN HIEROGLYPH A026"/* 1441A */,/*39691*/"ANATOLIAN HIEROGLYPH A026A"/* 1441B */, /*39692*/"ANATOLIAN HIEROGLYPH A027"/* 1441C */,/*39693*/"ANATOLIAN HIEROGLYPH A028"/* 1441D */, /*39694*/"ANATOLIAN HIEROGLYPH A029"/* 1441E */,/*39695*/"ANATOLIAN HIEROGLYPH A030"/* 1441F */, /*39696*/"ANATOLIAN HIEROGLYPH A031"/* 14420 */,/*39697*/"ANATOLIAN HIEROGLYPH A032"/* 14421 */, /*39698*/"ANATOLIAN HIEROGLYPH A033"/* 14422 */,/*39699*/"ANATOLIAN HIEROGLYPH A034"/* 14423 */, /*39700*/"ANATOLIAN HIEROGLYPH A035"/* 14424 */,/*39701*/"ANATOLIAN HIEROGLYPH A036"/* 14425 */, /*39702*/"ANATOLIAN HIEROGLYPH A037"/* 14426 */,/*39703*/"ANATOLIAN HIEROGLYPH A038"/* 14427 */, /*39704*/"ANATOLIAN HIEROGLYPH A039"/* 14428 */,/*39705*/"ANATOLIAN HIEROGLYPH A039A"/* 14429 */, /*39706*/"ANATOLIAN HIEROGLYPH A040"/* 1442A */,/*39707*/"ANATOLIAN HIEROGLYPH A041"/* 1442B */, /*39708*/"ANATOLIAN HIEROGLYPH A041A"/* 1442C */,/*39709*/"ANATOLIAN HIEROGLYPH A042"/* 1442D */, /*39710*/"ANATOLIAN HIEROGLYPH A043"/* 1442E */,/*39711*/"ANATOLIAN HIEROGLYPH A044"/* 1442F */, /*39712*/"ANATOLIAN HIEROGLYPH A045"/* 14430 */,/*39713*/"ANATOLIAN HIEROGLYPH A045A"/* 14431 */, /*39714*/"ANATOLIAN HIEROGLYPH A046"/* 14432 */,/*39715*/"ANATOLIAN HIEROGLYPH A046A"/* 14433 */, /*39716*/"ANATOLIAN HIEROGLYPH A046B"/* 14434 */,/*39717*/"ANATOLIAN HIEROGLYPH A047"/* 14435 */, /*39718*/"ANATOLIAN HIEROGLYPH A048"/* 14436 */,/*39719*/"ANATOLIAN HIEROGLYPH A049"/* 14437 */, /*39720*/"ANATOLIAN HIEROGLYPH A050"/* 14438 */,/*39721*/"ANATOLIAN HIEROGLYPH A051"/* 14439 */, /*39722*/"ANATOLIAN HIEROGLYPH A052"/* 1443A */,/*39723*/"ANATOLIAN HIEROGLYPH A053"/* 1443B */, /*39724*/"ANATOLIAN HIEROGLYPH A054"/* 1443C */,/*39725*/"ANATOLIAN HIEROGLYPH A055"/* 1443D */, /*39726*/"ANATOLIAN HIEROGLYPH A056"/* 1443E */,/*39727*/"ANATOLIAN HIEROGLYPH A057"/* 1443F */, /*39728*/"ANATOLIAN HIEROGLYPH A058"/* 14440 */,/*39729*/"ANATOLIAN HIEROGLYPH A059"/* 14441 */, /*39730*/"ANATOLIAN HIEROGLYPH A060"/* 14442 */,/*39731*/"ANATOLIAN HIEROGLYPH A061"/* 14443 */, /*39732*/"ANATOLIAN HIEROGLYPH A062"/* 14444 */,/*39733*/"ANATOLIAN HIEROGLYPH A063"/* 14445 */, /*39734*/"ANATOLIAN HIEROGLYPH A064"/* 14446 */,/*39735*/"ANATOLIAN HIEROGLYPH A065"/* 14447 */, /*39736*/"ANATOLIAN HIEROGLYPH A066"/* 14448 */,/*39737*/"ANATOLIAN HIEROGLYPH A066A"/* 14449 */, /*39738*/"ANATOLIAN HIEROGLYPH A066B"/* 1444A */,/*39739*/"ANATOLIAN HIEROGLYPH A066C"/* 1444B */, /*39740*/"ANATOLIAN HIEROGLYPH A067"/* 1444C */,/*39741*/"ANATOLIAN HIEROGLYPH A068"/* 1444D */, /*39742*/"ANATOLIAN HIEROGLYPH A069"/* 1444E */,/*39743*/"ANATOLIAN HIEROGLYPH A070"/* 1444F */, /*39744*/"ANATOLIAN HIEROGLYPH A071"/* 14450 */,/*39745*/"ANATOLIAN HIEROGLYPH A072"/* 14451 */, /*39746*/"ANATOLIAN HIEROGLYPH A073"/* 14452 */,/*39747*/"ANATOLIAN HIEROGLYPH A074"/* 14453 */, /*39748*/"ANATOLIAN HIEROGLYPH A075"/* 14454 */,/*39749*/"ANATOLIAN HIEROGLYPH A076"/* 14455 */, /*39750*/"ANATOLIAN HIEROGLYPH A077"/* 14456 */,/*39751*/"ANATOLIAN HIEROGLYPH A078"/* 14457 */, /*39752*/"ANATOLIAN HIEROGLYPH A079"/* 14458 */,/*39753*/"ANATOLIAN HIEROGLYPH A080"/* 14459 */, /*39754*/"ANATOLIAN HIEROGLYPH A081"/* 1445A */,/*39755*/"ANATOLIAN HIEROGLYPH A082"/* 1445B */, /*39756*/"ANATOLIAN HIEROGLYPH A083"/* 1445C */,/*39757*/"ANATOLIAN HIEROGLYPH A084"/* 1445D */, /*39758*/"ANATOLIAN HIEROGLYPH A085"/* 1445E */,/*39759*/"ANATOLIAN HIEROGLYPH A086"/* 1445F */, /*39760*/"ANATOLIAN HIEROGLYPH A087"/* 14460 */,/*39761*/"ANATOLIAN HIEROGLYPH A088"/* 14461 */, /*39762*/"ANATOLIAN HIEROGLYPH A089"/* 14462 */,/*39763*/"ANATOLIAN HIEROGLYPH A090"/* 14463 */, /*39764*/"ANATOLIAN HIEROGLYPH A091"/* 14464 */,/*39765*/"ANATOLIAN HIEROGLYPH A092"/* 14465 */, /*39766*/"ANATOLIAN HIEROGLYPH A093"/* 14466 */,/*39767*/"ANATOLIAN HIEROGLYPH A094"/* 14467 */, /*39768*/"ANATOLIAN HIEROGLYPH A095"/* 14468 */,/*39769*/"ANATOLIAN HIEROGLYPH A096"/* 14469 */, /*39770*/"ANATOLIAN HIEROGLYPH A097"/* 1446A */,/*39771*/"ANATOLIAN HIEROGLYPH A097A"/* 1446B */, /*39772*/"ANATOLIAN HIEROGLYPH A098"/* 1446C */,/*39773*/"ANATOLIAN HIEROGLYPH A098A"/* 1446D */, /*39774*/"ANATOLIAN HIEROGLYPH A099"/* 1446E */,/*39775*/"ANATOLIAN HIEROGLYPH A100"/* 1446F */, /*39776*/"ANATOLIAN HIEROGLYPH A100A"/* 14470 */,/*39777*/"ANATOLIAN HIEROGLYPH A101"/* 14471 */, /*39778*/"ANATOLIAN HIEROGLYPH A101A"/* 14472 */,/*39779*/"ANATOLIAN HIEROGLYPH A102"/* 14473 */, /*39780*/"ANATOLIAN HIEROGLYPH A102A"/* 14474 */,/*39781*/"ANATOLIAN HIEROGLYPH A103"/* 14475 */, /*39782*/"ANATOLIAN HIEROGLYPH A104"/* 14476 */,/*39783*/"ANATOLIAN HIEROGLYPH A104A"/* 14477 */, /*39784*/"ANATOLIAN HIEROGLYPH A104B"/* 14478 */,/*39785*/"ANATOLIAN HIEROGLYPH A104C"/* 14479 */, /*39786*/"ANATOLIAN HIEROGLYPH A105"/* 1447A */,/*39787*/"ANATOLIAN HIEROGLYPH A105A"/* 1447B */, /*39788*/"ANATOLIAN HIEROGLYPH A105B"/* 1447C */,/*39789*/"ANATOLIAN HIEROGLYPH A106"/* 1447D */, /*39790*/"ANATOLIAN HIEROGLYPH A107"/* 1447E */,/*39791*/"ANATOLIAN HIEROGLYPH A107A"/* 1447F */, /*39792*/"ANATOLIAN HIEROGLYPH A107B"/* 14480 */,/*39793*/"ANATOLIAN HIEROGLYPH A107C"/* 14481 */, /*39794*/"ANATOLIAN HIEROGLYPH A108"/* 14482 */,/*39795*/"ANATOLIAN HIEROGLYPH A109"/* 14483 */, /*39796*/"ANATOLIAN HIEROGLYPH A110"/* 14484 */,/*39797*/"ANATOLIAN HIEROGLYPH A110A"/* 14485 */, /*39798*/"ANATOLIAN HIEROGLYPH A110B"/* 14486 */,/*39799*/"ANATOLIAN HIEROGLYPH A111"/* 14487 */, /*39800*/"ANATOLIAN HIEROGLYPH A112"/* 14488 */,/*39801*/"ANATOLIAN HIEROGLYPH A113"/* 14489 */, /*39802*/"ANATOLIAN HIEROGLYPH A114"/* 1448A */,/*39803*/"ANATOLIAN HIEROGLYPH A115"/* 1448B */, /*39804*/"ANATOLIAN HIEROGLYPH A115A"/* 1448C */,/*39805*/"ANATOLIAN HIEROGLYPH A116"/* 1448D */, /*39806*/"ANATOLIAN HIEROGLYPH A117"/* 1448E */,/*39807*/"ANATOLIAN HIEROGLYPH A118"/* 1448F */, /*39808*/"ANATOLIAN HIEROGLYPH A119"/* 14490 */,/*39809*/"ANATOLIAN HIEROGLYPH A120"/* 14491 */, /*39810*/"ANATOLIAN HIEROGLYPH A121"/* 14492 */,/*39811*/"ANATOLIAN HIEROGLYPH A122"/* 14493 */, /*39812*/"ANATOLIAN HIEROGLYPH A123"/* 14494 */,/*39813*/"ANATOLIAN HIEROGLYPH A124"/* 14495 */, /*39814*/"ANATOLIAN HIEROGLYPH A125"/* 14496 */,/*39815*/"ANATOLIAN HIEROGLYPH A125A"/* 14497 */, /*39816*/"ANATOLIAN HIEROGLYPH A126"/* 14498 */,/*39817*/"ANATOLIAN HIEROGLYPH A127"/* 14499 */, /*39818*/"ANATOLIAN HIEROGLYPH A128"/* 1449A */,/*39819*/"ANATOLIAN HIEROGLYPH A129"/* 1449B */, /*39820*/"ANATOLIAN HIEROGLYPH A130"/* 1449C */,/*39821*/"ANATOLIAN HIEROGLYPH A131"/* 1449D */, /*39822*/"ANATOLIAN HIEROGLYPH A132"/* 1449E */,/*39823*/"ANATOLIAN HIEROGLYPH A133"/* 1449F */, /*39824*/"ANATOLIAN HIEROGLYPH A134"/* 144A0 */,/*39825*/"ANATOLIAN HIEROGLYPH A135"/* 144A1 */, /*39826*/"ANATOLIAN HIEROGLYPH A135A"/* 144A2 */,/*39827*/"ANATOLIAN HIEROGLYPH A136"/* 144A3 */, /*39828*/"ANATOLIAN HIEROGLYPH A137"/* 144A4 */,/*39829*/"ANATOLIAN HIEROGLYPH A138"/* 144A5 */, /*39830*/"ANATOLIAN HIEROGLYPH A139"/* 144A6 */,/*39831*/"ANATOLIAN HIEROGLYPH A140"/* 144A7 */, /*39832*/"ANATOLIAN HIEROGLYPH A141"/* 144A8 */,/*39833*/"ANATOLIAN HIEROGLYPH A142"/* 144A9 */, /*39834*/"ANATOLIAN HIEROGLYPH A143"/* 144AA */,/*39835*/"ANATOLIAN HIEROGLYPH A144"/* 144AB */, /*39836*/"ANATOLIAN HIEROGLYPH A145"/* 144AC */,/*39837*/"ANATOLIAN HIEROGLYPH A146"/* 144AD */, /*39838*/"ANATOLIAN HIEROGLYPH A147"/* 144AE */,/*39839*/"ANATOLIAN HIEROGLYPH A148"/* 144AF */, /*39840*/"ANATOLIAN HIEROGLYPH A149"/* 144B0 */,/*39841*/"ANATOLIAN HIEROGLYPH A150"/* 144B1 */, /*39842*/"ANATOLIAN HIEROGLYPH A151"/* 144B2 */,/*39843*/"ANATOLIAN HIEROGLYPH A152"/* 144B3 */, /*39844*/"ANATOLIAN HIEROGLYPH A153"/* 144B4 */,/*39845*/"ANATOLIAN HIEROGLYPH A154"/* 144B5 */, /*39846*/"ANATOLIAN HIEROGLYPH A155"/* 144B6 */,/*39847*/"ANATOLIAN HIEROGLYPH A156"/* 144B7 */, /*39848*/"ANATOLIAN HIEROGLYPH A157"/* 144B8 */,/*39849*/"ANATOLIAN HIEROGLYPH A158"/* 144B9 */, /*39850*/"ANATOLIAN HIEROGLYPH A159"/* 144BA */,/*39851*/"ANATOLIAN HIEROGLYPH A160"/* 144BB */, /*39852*/"ANATOLIAN HIEROGLYPH A161"/* 144BC */,/*39853*/"ANATOLIAN HIEROGLYPH A162"/* 144BD */, /*39854*/"ANATOLIAN HIEROGLYPH A163"/* 144BE */,/*39855*/"ANATOLIAN HIEROGLYPH A164"/* 144BF */, /*39856*/"ANATOLIAN HIEROGLYPH A165"/* 144C0 */,/*39857*/"ANATOLIAN HIEROGLYPH A166"/* 144C1 */, /*39858*/"ANATOLIAN HIEROGLYPH A167"/* 144C2 */,/*39859*/"ANATOLIAN HIEROGLYPH A168"/* 144C3 */, /*39860*/"ANATOLIAN HIEROGLYPH A169"/* 144C4 */,/*39861*/"ANATOLIAN HIEROGLYPH A170"/* 144C5 */, /*39862*/"ANATOLIAN HIEROGLYPH A171"/* 144C6 */,/*39863*/"ANATOLIAN HIEROGLYPH A172"/* 144C7 */, /*39864*/"ANATOLIAN HIEROGLYPH A173"/* 144C8 */,/*39865*/"ANATOLIAN HIEROGLYPH A174"/* 144C9 */, /*39866*/"ANATOLIAN HIEROGLYPH A175"/* 144CA */,/*39867*/"ANATOLIAN HIEROGLYPH A176"/* 144CB */, /*39868*/"ANATOLIAN HIEROGLYPH A177"/* 144CC */,/*39869*/"ANATOLIAN HIEROGLYPH A178"/* 144CD */, /*39870*/"ANATOLIAN HIEROGLYPH A179"/* 144CE */,/*39871*/"ANATOLIAN HIEROGLYPH A180"/* 144CF */, /*39872*/"ANATOLIAN HIEROGLYPH A181"/* 144D0 */,/*39873*/"ANATOLIAN HIEROGLYPH A182"/* 144D1 */, /*39874*/"ANATOLIAN HIEROGLYPH A183"/* 144D2 */,/*39875*/"ANATOLIAN HIEROGLYPH A184"/* 144D3 */, /*39876*/"ANATOLIAN HIEROGLYPH A185"/* 144D4 */,/*39877*/"ANATOLIAN HIEROGLYPH A186"/* 144D5 */, /*39878*/"ANATOLIAN HIEROGLYPH A187"/* 144D6 */,/*39879*/"ANATOLIAN HIEROGLYPH A188"/* 144D7 */, /*39880*/"ANATOLIAN HIEROGLYPH A189"/* 144D8 */,/*39881*/"ANATOLIAN HIEROGLYPH A190"/* 144D9 */, /*39882*/"ANATOLIAN HIEROGLYPH A191"/* 144DA */,/*39883*/"ANATOLIAN HIEROGLYPH A192"/* 144DB */, /*39884*/"ANATOLIAN HIEROGLYPH A193"/* 144DC */,/*39885*/"ANATOLIAN HIEROGLYPH A194"/* 144DD */, /*39886*/"ANATOLIAN HIEROGLYPH A195"/* 144DE */,/*39887*/"ANATOLIAN HIEROGLYPH A196"/* 144DF */, /*39888*/"ANATOLIAN HIEROGLYPH A197"/* 144E0 */,/*39889*/"ANATOLIAN HIEROGLYPH A198"/* 144E1 */, /*39890*/"ANATOLIAN HIEROGLYPH A199"/* 144E2 */,/*39891*/"ANATOLIAN HIEROGLYPH A200"/* 144E3 */, /*39892*/"ANATOLIAN HIEROGLYPH A201"/* 144E4 */,/*39893*/"ANATOLIAN HIEROGLYPH A202"/* 144E5 */, /*39894*/"ANATOLIAN HIEROGLYPH A202A"/* 144E6 */,/*39895*/"ANATOLIAN HIEROGLYPH A202B"/* 144E7 */, /*39896*/"ANATOLIAN HIEROGLYPH A203"/* 144E8 */,/*39897*/"ANATOLIAN HIEROGLYPH A204"/* 144E9 */, /*39898*/"ANATOLIAN HIEROGLYPH A205"/* 144EA */,/*39899*/"ANATOLIAN HIEROGLYPH A206"/* 144EB */, /*39900*/"ANATOLIAN HIEROGLYPH A207"/* 144EC */,/*39901*/"ANATOLIAN HIEROGLYPH A207A"/* 144ED */, /*39902*/"ANATOLIAN HIEROGLYPH A208"/* 144EE */,/*39903*/"ANATOLIAN HIEROGLYPH A209"/* 144EF */, /*39904*/"ANATOLIAN HIEROGLYPH A209A"/* 144F0 */,/*39905*/"ANATOLIAN HIEROGLYPH A210"/* 144F1 */, /*39906*/"ANATOLIAN HIEROGLYPH A211"/* 144F2 */,/*39907*/"ANATOLIAN HIEROGLYPH A212"/* 144F3 */, /*39908*/"ANATOLIAN HIEROGLYPH A213"/* 144F4 */,/*39909*/"ANATOLIAN HIEROGLYPH A214"/* 144F5 */, /*39910*/"ANATOLIAN HIEROGLYPH A215"/* 144F6 */,/*39911*/"ANATOLIAN HIEROGLYPH A215A"/* 144F7 */, /*39912*/"ANATOLIAN HIEROGLYPH A216"/* 144F8 */,/*39913*/"ANATOLIAN HIEROGLYPH A216A"/* 144F9 */, /*39914*/"ANATOLIAN HIEROGLYPH A217"/* 144FA */,/*39915*/"ANATOLIAN HIEROGLYPH A218"/* 144FB */, /*39916*/"ANATOLIAN HIEROGLYPH A219"/* 144FC */,/*39917*/"ANATOLIAN HIEROGLYPH A220"/* 144FD */, /*39918*/"ANATOLIAN HIEROGLYPH A221"/* 144FE */,/*39919*/"ANATOLIAN HIEROGLYPH A222"/* 144FF */, /*39920*/"ANATOLIAN HIEROGLYPH A223"/* 14500 */,/*39921*/"ANATOLIAN HIEROGLYPH A224"/* 14501 */, /*39922*/"ANATOLIAN HIEROGLYPH A225"/* 14502 */,/*39923*/"ANATOLIAN HIEROGLYPH A226"/* 14503 */, /*39924*/"ANATOLIAN HIEROGLYPH A227"/* 14504 */,/*39925*/"ANATOLIAN HIEROGLYPH A227A"/* 14505 */, /*39926*/"ANATOLIAN HIEROGLYPH A228"/* 14506 */,/*39927*/"ANATOLIAN HIEROGLYPH A229"/* 14507 */, /*39928*/"ANATOLIAN HIEROGLYPH A230"/* 14508 */,/*39929*/"ANATOLIAN HIEROGLYPH A231"/* 14509 */, /*39930*/"ANATOLIAN HIEROGLYPH A232"/* 1450A */,/*39931*/"ANATOLIAN HIEROGLYPH A233"/* 1450B */, /*39932*/"ANATOLIAN HIEROGLYPH A234"/* 1450C */,/*39933*/"ANATOLIAN HIEROGLYPH A235"/* 1450D */, /*39934*/"ANATOLIAN HIEROGLYPH A236"/* 1450E */,/*39935*/"ANATOLIAN HIEROGLYPH A237"/* 1450F */, /*39936*/"ANATOLIAN HIEROGLYPH A238"/* 14510 */,/*39937*/"ANATOLIAN HIEROGLYPH A239"/* 14511 */, /*39938*/"ANATOLIAN HIEROGLYPH A240"/* 14512 */,/*39939*/"ANATOLIAN HIEROGLYPH A241"/* 14513 */, /*39940*/"ANATOLIAN HIEROGLYPH A242"/* 14514 */,/*39941*/"ANATOLIAN HIEROGLYPH A243"/* 14515 */, /*39942*/"ANATOLIAN HIEROGLYPH A244"/* 14516 */,/*39943*/"ANATOLIAN HIEROGLYPH A245"/* 14517 */, /*39944*/"ANATOLIAN HIEROGLYPH A246"/* 14518 */,/*39945*/"ANATOLIAN HIEROGLYPH A247"/* 14519 */, /*39946*/"ANATOLIAN HIEROGLYPH A248"/* 1451A */,/*39947*/"ANATOLIAN HIEROGLYPH A249"/* 1451B */, /*39948*/"ANATOLIAN HIEROGLYPH A250"/* 1451C */,/*39949*/"ANATOLIAN HIEROGLYPH A251"/* 1451D */, /*39950*/"ANATOLIAN HIEROGLYPH A252"/* 1451E */,/*39951*/"ANATOLIAN HIEROGLYPH A253"/* 1451F */, /*39952*/"ANATOLIAN HIEROGLYPH A254"/* 14520 */,/*39953*/"ANATOLIAN HIEROGLYPH A255"/* 14521 */, /*39954*/"ANATOLIAN HIEROGLYPH A256"/* 14522 */,/*39955*/"ANATOLIAN HIEROGLYPH A257"/* 14523 */, /*39956*/"ANATOLIAN HIEROGLYPH A258"/* 14524 */,/*39957*/"ANATOLIAN HIEROGLYPH A259"/* 14525 */, /*39958*/"ANATOLIAN HIEROGLYPH A260"/* 14526 */,/*39959*/"ANATOLIAN HIEROGLYPH A261"/* 14527 */, /*39960*/"ANATOLIAN HIEROGLYPH A262"/* 14528 */,/*39961*/"ANATOLIAN HIEROGLYPH A263"/* 14529 */, /*39962*/"ANATOLIAN HIEROGLYPH A264"/* 1452A */,/*39963*/"ANATOLIAN HIEROGLYPH A265"/* 1452B */, /*39964*/"ANATOLIAN HIEROGLYPH A266"/* 1452C */,/*39965*/"ANATOLIAN HIEROGLYPH A267"/* 1452D */, /*39966*/"ANATOLIAN HIEROGLYPH A267A"/* 1452E */,/*39967*/"ANATOLIAN HIEROGLYPH A268"/* 1452F */, /*39968*/"ANATOLIAN HIEROGLYPH A269"/* 14530 */,/*39969*/"ANATOLIAN HIEROGLYPH A270"/* 14531 */, /*39970*/"ANATOLIAN HIEROGLYPH A271"/* 14532 */,/*39971*/"ANATOLIAN HIEROGLYPH A272"/* 14533 */, /*39972*/"ANATOLIAN HIEROGLYPH A273"/* 14534 */,/*39973*/"ANATOLIAN HIEROGLYPH A274"/* 14535 */, /*39974*/"ANATOLIAN HIEROGLYPH A275"/* 14536 */,/*39975*/"ANATOLIAN HIEROGLYPH A276"/* 14537 */, /*39976*/"ANATOLIAN HIEROGLYPH A277"/* 14538 */,/*39977*/"ANATOLIAN HIEROGLYPH A278"/* 14539 */, /*39978*/"ANATOLIAN HIEROGLYPH A279"/* 1453A */,/*39979*/"ANATOLIAN HIEROGLYPH A280"/* 1453B */, /*39980*/"ANATOLIAN HIEROGLYPH A281"/* 1453C */,/*39981*/"ANATOLIAN HIEROGLYPH A282"/* 1453D */, /*39982*/"ANATOLIAN HIEROGLYPH A283"/* 1453E */,/*39983*/"ANATOLIAN HIEROGLYPH A284"/* 1453F */, /*39984*/"ANATOLIAN HIEROGLYPH A285"/* 14540 */,/*39985*/"ANATOLIAN HIEROGLYPH A286"/* 14541 */, /*39986*/"ANATOLIAN HIEROGLYPH A287"/* 14542 */,/*39987*/"ANATOLIAN HIEROGLYPH A288"/* 14543 */, /*39988*/"ANATOLIAN HIEROGLYPH A289"/* 14544 */,/*39989*/"ANATOLIAN HIEROGLYPH A289A"/* 14545 */, /*39990*/"ANATOLIAN HIEROGLYPH A290"/* 14546 */,/*39991*/"ANATOLIAN HIEROGLYPH A291"/* 14547 */, /*39992*/"ANATOLIAN HIEROGLYPH A292"/* 14548 */,/*39993*/"ANATOLIAN HIEROGLYPH A293"/* 14549 */, /*39994*/"ANATOLIAN HIEROGLYPH A294"/* 1454A */,/*39995*/"ANATOLIAN HIEROGLYPH A294A"/* 1454B */, /*39996*/"ANATOLIAN HIEROGLYPH A295"/* 1454C */,/*39997*/"ANATOLIAN HIEROGLYPH A296"/* 1454D */, /*39998*/"ANATOLIAN HIEROGLYPH A297"/* 1454E */,/*39999*/"ANATOLIAN HIEROGLYPH A298"/* 1454F */, /*40000*/"ANATOLIAN HIEROGLYPH A299"/* 14550 */,/*40001*/"ANATOLIAN HIEROGLYPH A299A"/* 14551 */, /*40002*/"ANATOLIAN HIEROGLYPH A300"/* 14552 */,/*40003*/"ANATOLIAN HIEROGLYPH A301"/* 14553 */, /*40004*/"ANATOLIAN HIEROGLYPH A302"/* 14554 */,/*40005*/"ANATOLIAN HIEROGLYPH A303"/* 14555 */, /*40006*/"ANATOLIAN HIEROGLYPH A304"/* 14556 */,/*40007*/"ANATOLIAN HIEROGLYPH A305"/* 14557 */, /*40008*/"ANATOLIAN HIEROGLYPH A306"/* 14558 */,/*40009*/"ANATOLIAN HIEROGLYPH A307"/* 14559 */, /*40010*/"ANATOLIAN HIEROGLYPH A308"/* 1455A */,/*40011*/"ANATOLIAN HIEROGLYPH A309"/* 1455B */, /*40012*/"ANATOLIAN HIEROGLYPH A309A"/* 1455C */,/*40013*/"ANATOLIAN HIEROGLYPH A310"/* 1455D */, /*40014*/"ANATOLIAN HIEROGLYPH A311"/* 1455E */,/*40015*/"ANATOLIAN HIEROGLYPH A312"/* 1455F */, /*40016*/"ANATOLIAN HIEROGLYPH A313"/* 14560 */,/*40017*/"ANATOLIAN HIEROGLYPH A314"/* 14561 */, /*40018*/"ANATOLIAN HIEROGLYPH A315"/* 14562 */,/*40019*/"ANATOLIAN HIEROGLYPH A316"/* 14563 */, /*40020*/"ANATOLIAN HIEROGLYPH A317"/* 14564 */,/*40021*/"ANATOLIAN HIEROGLYPH A318"/* 14565 */, /*40022*/"ANATOLIAN HIEROGLYPH A319"/* 14566 */,/*40023*/"ANATOLIAN HIEROGLYPH A320"/* 14567 */, /*40024*/"ANATOLIAN HIEROGLYPH A321"/* 14568 */,/*40025*/"ANATOLIAN HIEROGLYPH A322"/* 14569 */, /*40026*/"ANATOLIAN HIEROGLYPH A323"/* 1456A */,/*40027*/"ANATOLIAN HIEROGLYPH A324"/* 1456B */, /*40028*/"ANATOLIAN HIEROGLYPH A325"/* 1456C */,/*40029*/"ANATOLIAN HIEROGLYPH A326"/* 1456D */, /*40030*/"ANATOLIAN HIEROGLYPH A327"/* 1456E */,/*40031*/"ANATOLIAN HIEROGLYPH A328"/* 1456F */, /*40032*/"ANATOLIAN HIEROGLYPH A329"/* 14570 */,/*40033*/"ANATOLIAN HIEROGLYPH A329A"/* 14571 */, /*40034*/"ANATOLIAN HIEROGLYPH A330"/* 14572 */,/*40035*/"ANATOLIAN HIEROGLYPH A331"/* 14573 */, /*40036*/"ANATOLIAN HIEROGLYPH A332A"/* 14574 */,/*40037*/"ANATOLIAN HIEROGLYPH A332B"/* 14575 */, /*40038*/"ANATOLIAN HIEROGLYPH A332C"/* 14576 */,/*40039*/"ANATOLIAN HIEROGLYPH A333"/* 14577 */, /*40040*/"ANATOLIAN HIEROGLYPH A334"/* 14578 */,/*40041*/"ANATOLIAN HIEROGLYPH A335"/* 14579 */, /*40042*/"ANATOLIAN HIEROGLYPH A336"/* 1457A */,/*40043*/"ANATOLIAN HIEROGLYPH A336A"/* 1457B */, /*40044*/"ANATOLIAN HIEROGLYPH A336B"/* 1457C */,/*40045*/"ANATOLIAN HIEROGLYPH A336C"/* 1457D */, /*40046*/"ANATOLIAN HIEROGLYPH A337"/* 1457E */,/*40047*/"ANATOLIAN HIEROGLYPH A338"/* 1457F */, /*40048*/"ANATOLIAN HIEROGLYPH A339"/* 14580 */,/*40049*/"ANATOLIAN HIEROGLYPH A340"/* 14581 */, /*40050*/"ANATOLIAN HIEROGLYPH A341"/* 14582 */,/*40051*/"ANATOLIAN HIEROGLYPH A342"/* 14583 */, /*40052*/"ANATOLIAN HIEROGLYPH A343"/* 14584 */,/*40053*/"ANATOLIAN HIEROGLYPH A344"/* 14585 */, /*40054*/"ANATOLIAN HIEROGLYPH A345"/* 14586 */,/*40055*/"ANATOLIAN HIEROGLYPH A346"/* 14587 */, /*40056*/"ANATOLIAN HIEROGLYPH A347"/* 14588 */,/*40057*/"ANATOLIAN HIEROGLYPH A348"/* 14589 */, /*40058*/"ANATOLIAN HIEROGLYPH A349"/* 1458A */,/*40059*/"ANATOLIAN HIEROGLYPH A350"/* 1458B */, /*40060*/"ANATOLIAN HIEROGLYPH A351"/* 1458C */,/*40061*/"ANATOLIAN HIEROGLYPH A352"/* 1458D */, /*40062*/"ANATOLIAN HIEROGLYPH A353"/* 1458E */,/*40063*/"ANATOLIAN HIEROGLYPH A354"/* 1458F */, /*40064*/"ANATOLIAN HIEROGLYPH A355"/* 14590 */,/*40065*/"ANATOLIAN HIEROGLYPH A356"/* 14591 */, /*40066*/"ANATOLIAN HIEROGLYPH A357"/* 14592 */,/*40067*/"ANATOLIAN HIEROGLYPH A358"/* 14593 */, /*40068*/"ANATOLIAN HIEROGLYPH A359"/* 14594 */,/*40069*/"ANATOLIAN HIEROGLYPH A359A"/* 14595 */, /*40070*/"ANATOLIAN HIEROGLYPH A360"/* 14596 */,/*40071*/"ANATOLIAN HIEROGLYPH A361"/* 14597 */, /*40072*/"ANATOLIAN HIEROGLYPH A362"/* 14598 */,/*40073*/"ANATOLIAN HIEROGLYPH A363"/* 14599 */, /*40074*/"ANATOLIAN HIEROGLYPH A364"/* 1459A */,/*40075*/"ANATOLIAN HIEROGLYPH A364A"/* 1459B */, /*40076*/"ANATOLIAN HIEROGLYPH A365"/* 1459C */,/*40077*/"ANATOLIAN HIEROGLYPH A366"/* 1459D */, /*40078*/"ANATOLIAN HIEROGLYPH A367"/* 1459E */,/*40079*/"ANATOLIAN HIEROGLYPH A368"/* 1459F */, /*40080*/"ANATOLIAN HIEROGLYPH A368A"/* 145A0 */,/*40081*/"ANATOLIAN HIEROGLYPH A369"/* 145A1 */, /*40082*/"ANATOLIAN HIEROGLYPH A370"/* 145A2 */,/*40083*/"ANATOLIAN HIEROGLYPH A371"/* 145A3 */, /*40084*/"ANATOLIAN HIEROGLYPH A371A"/* 145A4 */,/*40085*/"ANATOLIAN HIEROGLYPH A372"/* 145A5 */, /*40086*/"ANATOLIAN HIEROGLYPH A373"/* 145A6 */,/*40087*/"ANATOLIAN HIEROGLYPH A374"/* 145A7 */, /*40088*/"ANATOLIAN HIEROGLYPH A375"/* 145A8 */,/*40089*/"ANATOLIAN HIEROGLYPH A376"/* 145A9 */, /*40090*/"ANATOLIAN HIEROGLYPH A377"/* 145AA */,/*40091*/"ANATOLIAN HIEROGLYPH A378"/* 145AB */, /*40092*/"ANATOLIAN HIEROGLYPH A379"/* 145AC */,/*40093*/"ANATOLIAN HIEROGLYPH A380"/* 145AD */, /*40094*/"ANATOLIAN HIEROGLYPH A381"/* 145AE */,/*40095*/"ANATOLIAN HIEROGLYPH A381A"/* 145AF */, /*40096*/"ANATOLIAN HIEROGLYPH A382"/* 145B0 */,/*40097*/"ANATOLIAN HIEROGLYPH A383 RA OR RI"/* 145B1 */, /*40098*/"ANATOLIAN HIEROGLYPH A383A"/* 145B2 */,/*40099*/"ANATOLIAN HIEROGLYPH A384"/* 145B3 */, /*40100*/"ANATOLIAN HIEROGLYPH A385"/* 145B4 */,/*40101*/"ANATOLIAN HIEROGLYPH A386"/* 145B5 */, /*40102*/"ANATOLIAN HIEROGLYPH A386A"/* 145B6 */,/*40103*/"ANATOLIAN HIEROGLYPH A387"/* 145B7 */, /*40104*/"ANATOLIAN HIEROGLYPH A388"/* 145B8 */,/*40105*/"ANATOLIAN HIEROGLYPH A389"/* 145B9 */, /*40106*/"ANATOLIAN HIEROGLYPH A390"/* 145BA */,/*40107*/"ANATOLIAN HIEROGLYPH A391"/* 145BB */, /*40108*/"ANATOLIAN HIEROGLYPH A392"/* 145BC */,/*40109*/"ANATOLIAN HIEROGLYPH A393 EIGHT"/* 145BD */, /*40110*/"ANATOLIAN HIEROGLYPH A394"/* 145BE */,/*40111*/"ANATOLIAN HIEROGLYPH A395"/* 145BF */, /*40112*/"ANATOLIAN HIEROGLYPH A396"/* 145C0 */,/*40113*/"ANATOLIAN HIEROGLYPH A397"/* 145C1 */, /*40114*/"ANATOLIAN HIEROGLYPH A398"/* 145C2 */,/*40115*/"ANATOLIAN HIEROGLYPH A399"/* 145C3 */, /*40116*/"ANATOLIAN HIEROGLYPH A400"/* 145C4 */,/*40117*/"ANATOLIAN HIEROGLYPH A401"/* 145C5 */, /*40118*/"ANATOLIAN HIEROGLYPH A402"/* 145C6 */,/*40119*/"ANATOLIAN HIEROGLYPH A403"/* 145C7 */, /*40120*/"ANATOLIAN HIEROGLYPH A404"/* 145C8 */,/*40121*/"ANATOLIAN HIEROGLYPH A405"/* 145C9 */, /*40122*/"ANATOLIAN HIEROGLYPH A406"/* 145CA */,/*40123*/"ANATOLIAN HIEROGLYPH A407"/* 145CB */, /*40124*/"ANATOLIAN HIEROGLYPH A408"/* 145CC */,/*40125*/"ANATOLIAN HIEROGLYPH A409"/* 145CD */, /*40126*/"ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK"/* 145CE */, /*40127*/"ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK"/* 145CF */,/*40128*/"ANATOLIAN HIEROGLYPH A411"/* 145D0 */, /*40129*/"ANATOLIAN HIEROGLYPH A412"/* 145D1 */,/*40130*/"ANATOLIAN HIEROGLYPH A413"/* 145D2 */, /*40131*/"ANATOLIAN HIEROGLYPH A414"/* 145D3 */,/*40132*/"ANATOLIAN HIEROGLYPH A415"/* 145D4 */, /*40133*/"ANATOLIAN HIEROGLYPH A416"/* 145D5 */,/*40134*/"ANATOLIAN HIEROGLYPH A417"/* 145D6 */, /*40135*/"ANATOLIAN HIEROGLYPH A418"/* 145D7 */,/*40136*/"ANATOLIAN HIEROGLYPH A419"/* 145D8 */, /*40137*/"ANATOLIAN HIEROGLYPH A420"/* 145D9 */,/*40138*/"ANATOLIAN HIEROGLYPH A421"/* 145DA */, /*40139*/"ANATOLIAN HIEROGLYPH A422"/* 145DB */,/*40140*/"ANATOLIAN HIEROGLYPH A423"/* 145DC */, /*40141*/"ANATOLIAN HIEROGLYPH A424"/* 145DD */,/*40142*/"ANATOLIAN HIEROGLYPH A425"/* 145DE */, /*40143*/"ANATOLIAN HIEROGLYPH A426"/* 145DF */,/*40144*/"ANATOLIAN HIEROGLYPH A427"/* 145E0 */, /*40145*/"ANATOLIAN HIEROGLYPH A428"/* 145E1 */,/*40146*/"ANATOLIAN HIEROGLYPH A429"/* 145E2 */, /*40147*/"ANATOLIAN HIEROGLYPH A430"/* 145E3 */,/*40148*/"ANATOLIAN HIEROGLYPH A431"/* 145E4 */, /*40149*/"ANATOLIAN HIEROGLYPH A432"/* 145E5 */,/*40150*/"ANATOLIAN HIEROGLYPH A433"/* 145E6 */, /*40151*/"ANATOLIAN HIEROGLYPH A434"/* 145E7 */,/*40152*/"ANATOLIAN HIEROGLYPH A435"/* 145E8 */, /*40153*/"ANATOLIAN HIEROGLYPH A436"/* 145E9 */,/*40154*/"ANATOLIAN HIEROGLYPH A437"/* 145EA */, /*40155*/"ANATOLIAN HIEROGLYPH A438"/* 145EB */,/*40156*/"ANATOLIAN HIEROGLYPH A439"/* 145EC */, /*40157*/"ANATOLIAN HIEROGLYPH A440"/* 145ED */,/*40158*/"ANATOLIAN HIEROGLYPH A441"/* 145EE */, /*40159*/"ANATOLIAN HIEROGLYPH A442"/* 145EF */,/*40160*/"ANATOLIAN HIEROGLYPH A443"/* 145F0 */, /*40161*/"ANATOLIAN HIEROGLYPH A444"/* 145F1 */,/*40162*/"ANATOLIAN HIEROGLYPH A445"/* 145F2 */, /*40163*/"ANATOLIAN HIEROGLYPH A446"/* 145F3 */,/*40164*/"ANATOLIAN HIEROGLYPH A447"/* 145F4 */, /*40165*/"ANATOLIAN HIEROGLYPH A448"/* 145F5 */,/*40166*/"ANATOLIAN HIEROGLYPH A449"/* 145F6 */, /*40167*/"ANATOLIAN HIEROGLYPH A450"/* 145F7 */,/*40168*/"ANATOLIAN HIEROGLYPH A450A"/* 145F8 */, /*40169*/"ANATOLIAN HIEROGLYPH A451"/* 145F9 */,/*40170*/"ANATOLIAN HIEROGLYPH A452"/* 145FA */, /*40171*/"ANATOLIAN HIEROGLYPH A453"/* 145FB */,/*40172*/"ANATOLIAN HIEROGLYPH A454"/* 145FC */, /*40173*/"ANATOLIAN HIEROGLYPH A455"/* 145FD */,/*40174*/"ANATOLIAN HIEROGLYPH A456"/* 145FE */, /*40175*/"ANATOLIAN HIEROGLYPH A457"/* 145FF */,/*40176*/"ANATOLIAN HIEROGLYPH A457A"/* 14600 */, /*40177*/"ANATOLIAN HIEROGLYPH A458"/* 14601 */,/*40178*/"ANATOLIAN HIEROGLYPH A459"/* 14602 */, /*40179*/"ANATOLIAN HIEROGLYPH A460"/* 14603 */,/*40180*/"ANATOLIAN HIEROGLYPH A461"/* 14604 */, /*40181*/"ANATOLIAN HIEROGLYPH A462"/* 14605 */,/*40182*/"ANATOLIAN HIEROGLYPH A463"/* 14606 */, /*40183*/"ANATOLIAN HIEROGLYPH A464"/* 14607 */,/*40184*/"ANATOLIAN HIEROGLYPH A465"/* 14608 */, /*40185*/"ANATOLIAN HIEROGLYPH A466"/* 14609 */,/*40186*/"ANATOLIAN HIEROGLYPH A467"/* 1460A */, /*40187*/"ANATOLIAN HIEROGLYPH A468"/* 1460B */,/*40188*/"ANATOLIAN HIEROGLYPH A469"/* 1460C */, /*40189*/"ANATOLIAN HIEROGLYPH A470"/* 1460D */,/*40190*/"ANATOLIAN HIEROGLYPH A471"/* 1460E */, /*40191*/"ANATOLIAN HIEROGLYPH A472"/* 1460F */,/*40192*/"ANATOLIAN HIEROGLYPH A473"/* 14610 */, /*40193*/"ANATOLIAN HIEROGLYPH A474"/* 14611 */,/*40194*/"ANATOLIAN HIEROGLYPH A475"/* 14612 */, /*40195*/"ANATOLIAN HIEROGLYPH A476"/* 14613 */,/*40196*/"ANATOLIAN HIEROGLYPH A477"/* 14614 */, /*40197*/"ANATOLIAN HIEROGLYPH A478"/* 14615 */,/*40198*/"ANATOLIAN HIEROGLYPH A479"/* 14616 */, /*40199*/"ANATOLIAN HIEROGLYPH A480"/* 14617 */,/*40200*/"ANATOLIAN HIEROGLYPH A481"/* 14618 */, /*40201*/"ANATOLIAN HIEROGLYPH A482"/* 14619 */,/*40202*/"ANATOLIAN HIEROGLYPH A483"/* 1461A */, /*40203*/"ANATOLIAN HIEROGLYPH A484"/* 1461B */,/*40204*/"ANATOLIAN HIEROGLYPH A485"/* 1461C */, /*40205*/"ANATOLIAN HIEROGLYPH A486"/* 1461D */,/*40206*/"ANATOLIAN HIEROGLYPH A487"/* 1461E */, /*40207*/"ANATOLIAN HIEROGLYPH A488"/* 1461F */,/*40208*/"ANATOLIAN HIEROGLYPH A489"/* 14620 */, /*40209*/"ANATOLIAN HIEROGLYPH A490"/* 14621 */,/*40210*/"ANATOLIAN HIEROGLYPH A491"/* 14622 */, /*40211*/"ANATOLIAN HIEROGLYPH A492"/* 14623 */,/*40212*/"ANATOLIAN HIEROGLYPH A493"/* 14624 */, /*40213*/"ANATOLIAN HIEROGLYPH A494"/* 14625 */,/*40214*/"ANATOLIAN HIEROGLYPH A495"/* 14626 */, /*40215*/"ANATOLIAN HIEROGLYPH A496"/* 14627 */,/*40216*/"ANATOLIAN HIEROGLYPH A497"/* 14628 */, /*40217*/"ANATOLIAN HIEROGLYPH A501"/* 14629 */,/*40218*/"ANATOLIAN HIEROGLYPH A502"/* 1462A */, /*40219*/"ANATOLIAN HIEROGLYPH A503"/* 1462B */,/*40220*/"ANATOLIAN HIEROGLYPH A504"/* 1462C */, /*40221*/"ANATOLIAN HIEROGLYPH A505"/* 1462D */,/*40222*/"ANATOLIAN HIEROGLYPH A506"/* 1462E */, /*40223*/"ANATOLIAN HIEROGLYPH A507"/* 1462F */,/*40224*/"ANATOLIAN HIEROGLYPH A508"/* 14630 */, /*40225*/"ANATOLIAN HIEROGLYPH A509"/* 14631 */,/*40226*/"ANATOLIAN HIEROGLYPH A510"/* 14632 */, /*40227*/"ANATOLIAN HIEROGLYPH A511"/* 14633 */,/*40228*/"ANATOLIAN HIEROGLYPH A512"/* 14634 */, /*40229*/"ANATOLIAN HIEROGLYPH A513"/* 14635 */,/*40230*/"ANATOLIAN HIEROGLYPH A514"/* 14636 */, /*40231*/"ANATOLIAN HIEROGLYPH A515"/* 14637 */,/*40232*/"ANATOLIAN HIEROGLYPH A516"/* 14638 */, /*40233*/"ANATOLIAN HIEROGLYPH A517"/* 14639 */,/*40234*/"ANATOLIAN HIEROGLYPH A518"/* 1463A */, /*40235*/"ANATOLIAN HIEROGLYPH A519"/* 1463B */,/*40236*/"ANATOLIAN HIEROGLYPH A520"/* 1463C */, /*40237*/"ANATOLIAN HIEROGLYPH A521"/* 1463D */,/*40238*/"ANATOLIAN HIEROGLYPH A522"/* 1463E */, /*40239*/"ANATOLIAN HIEROGLYPH A523"/* 1463F */,/*40240*/"ANATOLIAN HIEROGLYPH A524"/* 14640 */, /*40241*/"ANATOLIAN HIEROGLYPH A525"/* 14641 */,/*40242*/"ANATOLIAN HIEROGLYPH A526"/* 14642 */, /*40243*/"ANATOLIAN HIEROGLYPH A527"/* 14643 */,/*40244*/"ANATOLIAN HIEROGLYPH A528"/* 14644 */, /*40245*/"ANATOLIAN HIEROGLYPH A529"/* 14645 */,/*40246*/"ANATOLIAN HIEROGLYPH A530"/* 14646 */, /*40247*/"BAMUM LETTER PHASE-A NGKUE MFON"/* 16800 */,/*40248*/"BAMUM LETTER PHASE-A GBIEE FON"/* 16801 */, /*40249*/"BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE"/* 16802 */, /*40250*/"BAMUM LETTER PHASE-A PON MFON PIPAEMBA"/* 16803 */,/*40251*/"BAMUM LETTER PHASE-A NAA MFON"/* 16804 */, /*40252*/"BAMUM LETTER PHASE-A SHUENSHUET"/* 16805 */,/*40253*/"BAMUM LETTER PHASE-A TITA MFON"/* 16806 */, /*40254*/"BAMUM LETTER PHASE-A NZA MFON"/* 16807 */,/*40255*/"BAMUM LETTER PHASE-A SHINDA PA NJI"/* 16808 */, /*40256*/"BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE"/* 16809 */, /*40257*/"BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA"/* 1680A */,/*40258*/"BAMUM LETTER PHASE-A MAEMBGBIEE"/* 1680B */, /*40259*/"BAMUM LETTER PHASE-A TU MAEMBA"/* 1680C */,/*40260*/"BAMUM LETTER PHASE-A NGANGU"/* 1680D */, /*40261*/"BAMUM LETTER PHASE-A MAEMVEUX"/* 1680E */,/*40262*/"BAMUM LETTER PHASE-A MANSUAE"/* 1680F */, /*40263*/"BAMUM LETTER PHASE-A MVEUAENGAM"/* 16810 */,/*40264*/"BAMUM LETTER PHASE-A SEUNYAM"/* 16811 */, /*40265*/"BAMUM LETTER PHASE-A NTOQPEN"/* 16812 */,/*40266*/"BAMUM LETTER PHASE-A KEUKEUTNDA"/* 16813 */, /*40267*/"BAMUM LETTER PHASE-A NKINDI"/* 16814 */,/*40268*/"BAMUM LETTER PHASE-A SUU"/* 16815 */, /*40269*/"BAMUM LETTER PHASE-A NGKUENZEUM"/* 16816 */,/*40270*/"BAMUM LETTER PHASE-A LAPAQ"/* 16817 */, /*40271*/"BAMUM LETTER PHASE-A LET KUT"/* 16818 */,/*40272*/"BAMUM LETTER PHASE-A NTAP MFAA"/* 16819 */, /*40273*/"BAMUM LETTER PHASE-A MAEKEUP"/* 1681A */,/*40274*/"BAMUM LETTER PHASE-A PASHAE"/* 1681B */, /*40275*/"BAMUM LETTER PHASE-A GHEUAERAE"/* 1681C */,/*40276*/"BAMUM LETTER PHASE-A PAMSHAE"/* 1681D */, /*40277*/"BAMUM LETTER PHASE-A MON NGGEUAET"/* 1681E */,/*40278*/"BAMUM LETTER PHASE-A NZUN MEUT"/* 1681F */, /*40279*/"BAMUM LETTER PHASE-A U YUQ NAE"/* 16820 */,/*40280*/"BAMUM LETTER PHASE-A GHEUAEGHEUAE"/* 16821 */, /*40281*/"BAMUM LETTER PHASE-A NTAP NTAA"/* 16822 */,/*40282*/"BAMUM LETTER PHASE-A SISA"/* 16823 */, /*40283*/"BAMUM LETTER PHASE-A MGBASA"/* 16824 */,/*40284*/"BAMUM LETTER PHASE-A MEUNJOMNDEUQ"/* 16825 */, /*40285*/"BAMUM LETTER PHASE-A MOOMPUQ"/* 16826 */,/*40286*/"BAMUM LETTER PHASE-A KAFA"/* 16827 */, /*40287*/"BAMUM LETTER PHASE-A PA LEERAEWA"/* 16828 */,/*40288*/"BAMUM LETTER PHASE-A NDA LEERAEWA"/* 16829 */, /*40289*/"BAMUM LETTER PHASE-A PET"/* 1682A */,/*40290*/"BAMUM LETTER PHASE-A MAEMKPEN"/* 1682B */, /*40291*/"BAMUM LETTER PHASE-A NIKA"/* 1682C */,/*40292*/"BAMUM LETTER PHASE-A PUP"/* 1682D */, /*40293*/"BAMUM LETTER PHASE-A TUAEP"/* 1682E */,/*40294*/"BAMUM LETTER PHASE-A LUAEP"/* 1682F */, /*40295*/"BAMUM LETTER PHASE-A SONJAM"/* 16830 */,/*40296*/"BAMUM LETTER PHASE-A TEUTEUWEN"/* 16831 */, /*40297*/"BAMUM LETTER PHASE-A MAENYI"/* 16832 */,/*40298*/"BAMUM LETTER PHASE-A KET"/* 16833 */, /*40299*/"BAMUM LETTER PHASE-A NDAANGGEUAET"/* 16834 */,/*40300*/"BAMUM LETTER PHASE-A KUOQ"/* 16835 */, /*40301*/"BAMUM LETTER PHASE-A MOOMEUT"/* 16836 */,/*40302*/"BAMUM LETTER PHASE-A SHUM"/* 16837 */, /*40303*/"BAMUM LETTER PHASE-A LOMMAE"/* 16838 */,/*40304*/"BAMUM LETTER PHASE-A FIRI"/* 16839 */, /*40305*/"BAMUM LETTER PHASE-A ROM"/* 1683A */,/*40306*/"BAMUM LETTER PHASE-A KPOQ"/* 1683B */, /*40307*/"BAMUM LETTER PHASE-A SOQ"/* 1683C */,/*40308*/"BAMUM LETTER PHASE-A MAP PIEET"/* 1683D */, /*40309*/"BAMUM LETTER PHASE-A SHIRAE"/* 1683E */,/*40310*/"BAMUM LETTER PHASE-A NTAP"/* 1683F */, /*40311*/"BAMUM LETTER PHASE-A SHOQ NSHUT YUM"/* 16840 */,/*40312*/"BAMUM LETTER PHASE-A NYIT MONGKEUAEQ"/* 16841 */, /*40313*/"BAMUM LETTER PHASE-A PAARAE"/* 16842 */,/*40314*/"BAMUM LETTER PHASE-A NKAARAE"/* 16843 */, /*40315*/"BAMUM LETTER PHASE-A UNKNOWN"/* 16844 */,/*40316*/"BAMUM LETTER PHASE-A NGGEN"/* 16845 */, /*40317*/"BAMUM LETTER PHASE-A MAESI"/* 16846 */,/*40318*/"BAMUM LETTER PHASE-A NJAM"/* 16847 */, /*40319*/"BAMUM LETTER PHASE-A MBANYI"/* 16848 */,/*40320*/"BAMUM LETTER PHASE-A NYET"/* 16849 */, /*40321*/"BAMUM LETTER PHASE-A TEUAEN"/* 1684A */,/*40322*/"BAMUM LETTER PHASE-A SOT"/* 1684B */, /*40323*/"BAMUM LETTER PHASE-A PAAM"/* 1684C */,/*40324*/"BAMUM LETTER PHASE-A NSHIEE"/* 1684D */, /*40325*/"BAMUM LETTER PHASE-A MAEM"/* 1684E */,/*40326*/"BAMUM LETTER PHASE-A NYI"/* 1684F */, /*40327*/"BAMUM LETTER PHASE-A KAQ"/* 16850 */,/*40328*/"BAMUM LETTER PHASE-A NSHA"/* 16851 */, /*40329*/"BAMUM LETTER PHASE-A VEE"/* 16852 */,/*40330*/"BAMUM LETTER PHASE-A LU"/* 16853 */, /*40331*/"BAMUM LETTER PHASE-A NEN"/* 16854 */,/*40332*/"BAMUM LETTER PHASE-A NAQ"/* 16855 */, /*40333*/"BAMUM LETTER PHASE-A MBAQ"/* 16856 */,/*40334*/"BAMUM LETTER PHASE-B NSHUET"/* 16857 */, /*40335*/"BAMUM LETTER PHASE-B TU MAEMGBIEE"/* 16858 */,/*40336*/"BAMUM LETTER PHASE-B SIEE"/* 16859 */, /*40337*/"BAMUM LETTER PHASE-B SET TU"/* 1685A */,/*40338*/"BAMUM LETTER PHASE-B LOM NTEUM"/* 1685B */, /*40339*/"BAMUM LETTER PHASE-B MBA MAELEE"/* 1685C */,/*40340*/"BAMUM LETTER PHASE-B KIEEM"/* 1685D */, /*40341*/"BAMUM LETTER PHASE-B YEURAE"/* 1685E */,/*40342*/"BAMUM LETTER PHASE-B MBAARAE"/* 1685F */, /*40343*/"BAMUM LETTER PHASE-B KAM"/* 16860 */,/*40344*/"BAMUM LETTER PHASE-B PEESHI"/* 16861 */, /*40345*/"BAMUM LETTER PHASE-B YAFU LEERAEWA"/* 16862 */,/*40346*/"BAMUM LETTER PHASE-B LAM NSHUT NYAM"/* 16863 */, /*40347*/"BAMUM LETTER PHASE-B NTIEE SHEUOQ"/* 16864 */,/*40348*/"BAMUM LETTER PHASE-B NDU NJAA"/* 16865 */, /*40349*/"BAMUM LETTER PHASE-B GHEUGHEUAEM"/* 16866 */,/*40350*/"BAMUM LETTER PHASE-B PIT"/* 16867 */, /*40351*/"BAMUM LETTER PHASE-B TU NSIEE"/* 16868 */,/*40352*/"BAMUM LETTER PHASE-B SHET NJAQ"/* 16869 */, /*40353*/"BAMUM LETTER PHASE-B SHEUAEQTU"/* 1686A */,/*40354*/"BAMUM LETTER PHASE-B MFON TEUAEQ"/* 1686B */, /*40355*/"BAMUM LETTER PHASE-B MBIT MBAAKET"/* 1686C */,/*40356*/"BAMUM LETTER PHASE-B NYI NTEUM"/* 1686D */, /*40357*/"BAMUM LETTER PHASE-B KEUPUQ"/* 1686E */,/*40358*/"BAMUM LETTER PHASE-B GHEUGHEN"/* 1686F */, /*40359*/"BAMUM LETTER PHASE-B KEUYEUX"/* 16870 */,/*40360*/"BAMUM LETTER PHASE-B LAANAE"/* 16871 */, /*40361*/"BAMUM LETTER PHASE-B PARUM"/* 16872 */,/*40362*/"BAMUM LETTER PHASE-B VEUM"/* 16873 */, /*40363*/"BAMUM LETTER PHASE-B NGKINDI MVOP"/* 16874 */,/*40364*/"BAMUM LETTER PHASE-B NGGEU MBU"/* 16875 */, /*40365*/"BAMUM LETTER PHASE-B WUAET"/* 16876 */,/*40366*/"BAMUM LETTER PHASE-B SAKEUAE"/* 16877 */, /*40367*/"BAMUM LETTER PHASE-B TAAM"/* 16878 */,/*40368*/"BAMUM LETTER PHASE-B MEUQ"/* 16879 */, /*40369*/"BAMUM LETTER PHASE-B NGGUOQ"/* 1687A */,/*40370*/"BAMUM LETTER PHASE-B NGGUOQ LARGE"/* 1687B */, /*40371*/"BAMUM LETTER PHASE-B MFIYAQ"/* 1687C */,/*40372*/"BAMUM LETTER PHASE-B SUE"/* 1687D */, /*40373*/"BAMUM LETTER PHASE-B MBEURI"/* 1687E */,/*40374*/"BAMUM LETTER PHASE-B MONTIEEN"/* 1687F */, /*40375*/"BAMUM LETTER PHASE-B NYAEMAE"/* 16880 */,/*40376*/"BAMUM LETTER PHASE-B PUNGAAM"/* 16881 */, /*40377*/"BAMUM LETTER PHASE-B MEUT NGGEET"/* 16882 */,/*40378*/"BAMUM LETTER PHASE-B FEUX"/* 16883 */, /*40379*/"BAMUM LETTER PHASE-B MBUOQ"/* 16884 */,/*40380*/"BAMUM LETTER PHASE-B FEE"/* 16885 */, /*40381*/"BAMUM LETTER PHASE-B KEUAEM"/* 16886 */,/*40382*/"BAMUM LETTER PHASE-B MA NJEUAENA"/* 16887 */, /*40383*/"BAMUM LETTER PHASE-B MA NJUQA"/* 16888 */,/*40384*/"BAMUM LETTER PHASE-B LET"/* 16889 */, /*40385*/"BAMUM LETTER PHASE-B NGGAAM"/* 1688A */,/*40386*/"BAMUM LETTER PHASE-B NSEN"/* 1688B */, /*40387*/"BAMUM LETTER PHASE-B MA"/* 1688C */,/*40388*/"BAMUM LETTER PHASE-B KIQ"/* 1688D */, /*40389*/"BAMUM LETTER PHASE-B NGOM"/* 1688E */,/*40390*/"BAMUM LETTER PHASE-C NGKUE MAEMBA"/* 1688F */, /*40391*/"BAMUM LETTER PHASE-C NZA"/* 16890 */,/*40392*/"BAMUM LETTER PHASE-C YUM"/* 16891 */, /*40393*/"BAMUM LETTER PHASE-C WANGKUOQ"/* 16892 */,/*40394*/"BAMUM LETTER PHASE-C NGGEN"/* 16893 */, /*40395*/"BAMUM LETTER PHASE-C NDEUAEREE"/* 16894 */,/*40396*/"BAMUM LETTER PHASE-C NGKAQ"/* 16895 */, /*40397*/"BAMUM LETTER PHASE-C GHARAE"/* 16896 */,/*40398*/"BAMUM LETTER PHASE-C MBEEKEET"/* 16897 */, /*40399*/"BAMUM LETTER PHASE-C GBAYI"/* 16898 */,/*40400*/"BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN"/* 16899 */, /*40401*/"BAMUM LETTER PHASE-C NTU MBIT"/* 1689A */,/*40402*/"BAMUM LETTER PHASE-C MBEUM"/* 1689B */, /*40403*/"BAMUM LETTER PHASE-C PIRIEEN"/* 1689C */,/*40404*/"BAMUM LETTER PHASE-C NDOMBU"/* 1689D */, /*40405*/"BAMUM LETTER PHASE-C MBAA CABBAGE-TREE"/* 1689E */,/*40406*/"BAMUM LETTER PHASE-C KEUSHEUAEP"/* 1689F */, /*40407*/"BAMUM LETTER PHASE-C GHAP"/* 168A0 */,/*40408*/"BAMUM LETTER PHASE-C KEUKAQ"/* 168A1 */, /*40409*/"BAMUM LETTER PHASE-C YU MUOMAE"/* 168A2 */,/*40410*/"BAMUM LETTER PHASE-C NZEUM"/* 168A3 */, /*40411*/"BAMUM LETTER PHASE-C MBUE"/* 168A4 */,/*40412*/"BAMUM LETTER PHASE-C NSEUAEN"/* 168A5 */, /*40413*/"BAMUM LETTER PHASE-C MBIT"/* 168A6 */,/*40414*/"BAMUM LETTER PHASE-C YEUQ"/* 168A7 */, /*40415*/"BAMUM LETTER PHASE-C KPARAQ"/* 168A8 */,/*40416*/"BAMUM LETTER PHASE-C KAA"/* 168A9 */, /*40417*/"BAMUM LETTER PHASE-C SEUX"/* 168AA */,/*40418*/"BAMUM LETTER PHASE-C NDIDA"/* 168AB */, /*40419*/"BAMUM LETTER PHASE-C TAASHAE"/* 168AC */,/*40420*/"BAMUM LETTER PHASE-C NJUEQ"/* 168AD */, /*40421*/"BAMUM LETTER PHASE-C TITA YUE"/* 168AE */,/*40422*/"BAMUM LETTER PHASE-C SUAET"/* 168AF */, /*40423*/"BAMUM LETTER PHASE-C NGGUAEN NYAM"/* 168B0 */,/*40424*/"BAMUM LETTER PHASE-C VEUX"/* 168B1 */, /*40425*/"BAMUM LETTER PHASE-C NANSANAQ"/* 168B2 */,/*40426*/"BAMUM LETTER PHASE-C MA KEUAERI"/* 168B3 */, /*40427*/"BAMUM LETTER PHASE-C NTAA"/* 168B4 */,/*40428*/"BAMUM LETTER PHASE-C NGGUON"/* 168B5 */, /*40429*/"BAMUM LETTER PHASE-C LAP"/* 168B6 */,/*40430*/"BAMUM LETTER PHASE-C MBIRIEEN"/* 168B7 */, /*40431*/"BAMUM LETTER PHASE-C MGBASAQ"/* 168B8 */,/*40432*/"BAMUM LETTER PHASE-C NTEUNGBA"/* 168B9 */, /*40433*/"BAMUM LETTER PHASE-C TEUTEUX"/* 168BA */,/*40434*/"BAMUM LETTER PHASE-C NGGUM"/* 168BB */, /*40435*/"BAMUM LETTER PHASE-C FUE"/* 168BC */,/*40436*/"BAMUM LETTER PHASE-C NDEUT"/* 168BD */, /*40437*/"BAMUM LETTER PHASE-C NSA"/* 168BE */,/*40438*/"BAMUM LETTER PHASE-C NSHAQ"/* 168BF */, /*40439*/"BAMUM LETTER PHASE-C BUNG"/* 168C0 */,/*40440*/"BAMUM LETTER PHASE-C VEUAEPEN"/* 168C1 */, /*40441*/"BAMUM LETTER PHASE-C MBERAE"/* 168C2 */,/*40442*/"BAMUM LETTER PHASE-C RU"/* 168C3 */, /*40443*/"BAMUM LETTER PHASE-C NJAEM"/* 168C4 */,/*40444*/"BAMUM LETTER PHASE-C LAM"/* 168C5 */, /*40445*/"BAMUM LETTER PHASE-C TITUAEP"/* 168C6 */,/*40446*/"BAMUM LETTER PHASE-C NSUOT NGOM"/* 168C7 */, /*40447*/"BAMUM LETTER PHASE-C NJEEEE"/* 168C8 */,/*40448*/"BAMUM LETTER PHASE-C KET"/* 168C9 */, /*40449*/"BAMUM LETTER PHASE-C NGGU"/* 168CA */,/*40450*/"BAMUM LETTER PHASE-C MAESI"/* 168CB */, /*40451*/"BAMUM LETTER PHASE-C MBUAEM"/* 168CC */,/*40452*/"BAMUM LETTER PHASE-C LU"/* 168CD */, /*40453*/"BAMUM LETTER PHASE-C KUT"/* 168CE */,/*40454*/"BAMUM LETTER PHASE-C NJAM"/* 168CF */, /*40455*/"BAMUM LETTER PHASE-C NGOM"/* 168D0 */,/*40456*/"BAMUM LETTER PHASE-C WUP"/* 168D1 */, /*40457*/"BAMUM LETTER PHASE-C NGGUEET"/* 168D2 */,/*40458*/"BAMUM LETTER PHASE-C NSOM"/* 168D3 */, /*40459*/"BAMUM LETTER PHASE-C NTEN"/* 168D4 */,/*40460*/"BAMUM LETTER PHASE-C KUOP NKAARAE"/* 168D5 */, /*40461*/"BAMUM LETTER PHASE-C NSUN"/* 168D6 */,/*40462*/"BAMUM LETTER PHASE-C NDAM"/* 168D7 */, /*40463*/"BAMUM LETTER PHASE-C MA NSIEE"/* 168D8 */,/*40464*/"BAMUM LETTER PHASE-C YAA"/* 168D9 */, /*40465*/"BAMUM LETTER PHASE-C NDAP"/* 168DA */,/*40466*/"BAMUM LETTER PHASE-C SHUEQ"/* 168DB */, /*40467*/"BAMUM LETTER PHASE-C SETFON"/* 168DC */,/*40468*/"BAMUM LETTER PHASE-C MBI"/* 168DD */, /*40469*/"BAMUM LETTER PHASE-C MAEMBA"/* 168DE */,/*40470*/"BAMUM LETTER PHASE-C MBANYI"/* 168DF */, /*40471*/"BAMUM LETTER PHASE-C KEUSEUX"/* 168E0 */,/*40472*/"BAMUM LETTER PHASE-C MBEUX"/* 168E1 */, /*40473*/"BAMUM LETTER PHASE-C KEUM"/* 168E2 */,/*40474*/"BAMUM LETTER PHASE-C MBAA PICKET"/* 168E3 */, /*40475*/"BAMUM LETTER PHASE-C YUWOQ"/* 168E4 */,/*40476*/"BAMUM LETTER PHASE-C NJEUX"/* 168E5 */, /*40477*/"BAMUM LETTER PHASE-C MIEE"/* 168E6 */,/*40478*/"BAMUM LETTER PHASE-C MUAE"/* 168E7 */, /*40479*/"BAMUM LETTER PHASE-C SHIQ"/* 168E8 */,/*40480*/"BAMUM LETTER PHASE-C KEN LAW"/* 168E9 */, /*40481*/"BAMUM LETTER PHASE-C KEN FATIGUE"/* 168EA */,/*40482*/"BAMUM LETTER PHASE-C NGAQ"/* 168EB */, /*40483*/"BAMUM LETTER PHASE-C NAQ"/* 168EC */,/*40484*/"BAMUM LETTER PHASE-C LIQ"/* 168ED */, /*40485*/"BAMUM LETTER PHASE-C PIN"/* 168EE */,/*40486*/"BAMUM LETTER PHASE-C PEN"/* 168EF */, /*40487*/"BAMUM LETTER PHASE-C TET"/* 168F0 */,/*40488*/"BAMUM LETTER PHASE-D MBUO"/* 168F1 */, /*40489*/"BAMUM LETTER PHASE-D WAP"/* 168F2 */,/*40490*/"BAMUM LETTER PHASE-D NJI"/* 168F3 */, /*40491*/"BAMUM LETTER PHASE-D MFON"/* 168F4 */,/*40492*/"BAMUM LETTER PHASE-D NJIEE"/* 168F5 */, /*40493*/"BAMUM LETTER PHASE-D LIEE"/* 168F6 */,/*40494*/"BAMUM LETTER PHASE-D NJEUT"/* 168F7 */, /*40495*/"BAMUM LETTER PHASE-D NSHEE"/* 168F8 */,/*40496*/"BAMUM LETTER PHASE-D NGGAAMAE"/* 168F9 */, /*40497*/"BAMUM LETTER PHASE-D NYAM"/* 168FA */,/*40498*/"BAMUM LETTER PHASE-D WUAEN"/* 168FB */, /*40499*/"BAMUM LETTER PHASE-D NGKUN"/* 168FC */,/*40500*/"BAMUM LETTER PHASE-D SHEE"/* 168FD */, /*40501*/"BAMUM LETTER PHASE-D NGKAP"/* 168FE */,/*40502*/"BAMUM LETTER PHASE-D KEUAETMEUN"/* 168FF */, /*40503*/"BAMUM LETTER PHASE-D TEUT"/* 16900 */,/*40504*/"BAMUM LETTER PHASE-D SHEUAE"/* 16901 */, /*40505*/"BAMUM LETTER PHASE-D NJAP"/* 16902 */,/*40506*/"BAMUM LETTER PHASE-D SUE"/* 16903 */, /*40507*/"BAMUM LETTER PHASE-D KET"/* 16904 */,/*40508*/"BAMUM LETTER PHASE-D YAEMMAE"/* 16905 */, /*40509*/"BAMUM LETTER PHASE-D KUOM"/* 16906 */,/*40510*/"BAMUM LETTER PHASE-D SAP"/* 16907 */, /*40511*/"BAMUM LETTER PHASE-D MFEUT"/* 16908 */,/*40512*/"BAMUM LETTER PHASE-D NDEUX"/* 16909 */, /*40513*/"BAMUM LETTER PHASE-D MALEERI"/* 1690A */,/*40514*/"BAMUM LETTER PHASE-D MEUT"/* 1690B */, /*40515*/"BAMUM LETTER PHASE-D SEUAEQ"/* 1690C */,/*40516*/"BAMUM LETTER PHASE-D YEN"/* 1690D */, /*40517*/"BAMUM LETTER PHASE-D NJEUAEM"/* 1690E */,/*40518*/"BAMUM LETTER PHASE-D KEUOT MBUAE"/* 1690F */, /*40519*/"BAMUM LETTER PHASE-D NGKEURI"/* 16910 */,/*40520*/"BAMUM LETTER PHASE-D TU"/* 16911 */, /*40521*/"BAMUM LETTER PHASE-D GHAA"/* 16912 */,/*40522*/"BAMUM LETTER PHASE-D NGKYEE"/* 16913 */, /*40523*/"BAMUM LETTER PHASE-D FEUFEUAET"/* 16914 */,/*40524*/"BAMUM LETTER PHASE-D NDEE"/* 16915 */, /*40525*/"BAMUM LETTER PHASE-D MGBOFUM"/* 16916 */,/*40526*/"BAMUM LETTER PHASE-D LEUAEP"/* 16917 */, /*40527*/"BAMUM LETTER PHASE-D NDON"/* 16918 */,/*40528*/"BAMUM LETTER PHASE-D MONI"/* 16919 */, /*40529*/"BAMUM LETTER PHASE-D MGBEUN"/* 1691A */,/*40530*/"BAMUM LETTER PHASE-D PUUT"/* 1691B */, /*40531*/"BAMUM LETTER PHASE-D MGBIEE"/* 1691C */,/*40532*/"BAMUM LETTER PHASE-D MFO"/* 1691D */, /*40533*/"BAMUM LETTER PHASE-D LUM"/* 1691E */,/*40534*/"BAMUM LETTER PHASE-D NSIEEP"/* 1691F */, /*40535*/"BAMUM LETTER PHASE-D MBAA"/* 16920 */,/*40536*/"BAMUM LETTER PHASE-D KWAET"/* 16921 */, /*40537*/"BAMUM LETTER PHASE-D NYET"/* 16922 */,/*40538*/"BAMUM LETTER PHASE-D TEUAEN"/* 16923 */, /*40539*/"BAMUM LETTER PHASE-D SOT"/* 16924 */,/*40540*/"BAMUM LETTER PHASE-D YUWOQ"/* 16925 */, /*40541*/"BAMUM LETTER PHASE-D KEUM"/* 16926 */,/*40542*/"BAMUM LETTER PHASE-D RAEM"/* 16927 */, /*40543*/"BAMUM LETTER PHASE-D TEEEE"/* 16928 */,/*40544*/"BAMUM LETTER PHASE-D NGKEUAEQ"/* 16929 */, /*40545*/"BAMUM LETTER PHASE-D MFEUAE"/* 1692A */,/*40546*/"BAMUM LETTER PHASE-D NSIEET"/* 1692B */, /*40547*/"BAMUM LETTER PHASE-D KEUP"/* 1692C */,/*40548*/"BAMUM LETTER PHASE-D PIP"/* 1692D */, /*40549*/"BAMUM LETTER PHASE-D PEUTAE"/* 1692E */,/*40550*/"BAMUM LETTER PHASE-D NYUE"/* 1692F */, /*40551*/"BAMUM LETTER PHASE-D LET"/* 16930 */,/*40552*/"BAMUM LETTER PHASE-D NGGAAM"/* 16931 */, /*40553*/"BAMUM LETTER PHASE-D MFIEE"/* 16932 */,/*40554*/"BAMUM LETTER PHASE-D NGGWAEN"/* 16933 */, /*40555*/"BAMUM LETTER PHASE-D YUOM"/* 16934 */,/*40556*/"BAMUM LETTER PHASE-D PAP"/* 16935 */, /*40557*/"BAMUM LETTER PHASE-D YUOP"/* 16936 */,/*40558*/"BAMUM LETTER PHASE-D NDAM"/* 16937 */, /*40559*/"BAMUM LETTER PHASE-D NTEUM"/* 16938 */,/*40560*/"BAMUM LETTER PHASE-D SUAE"/* 16939 */, /*40561*/"BAMUM LETTER PHASE-D KUN"/* 1693A */,/*40562*/"BAMUM LETTER PHASE-D NGGEUX"/* 1693B */, /*40563*/"BAMUM LETTER PHASE-D NGKIEE"/* 1693C */,/*40564*/"BAMUM LETTER PHASE-D TUOT"/* 1693D */, /*40565*/"BAMUM LETTER PHASE-D MEUN"/* 1693E */,/*40566*/"BAMUM LETTER PHASE-D KUQ"/* 1693F */, /*40567*/"BAMUM LETTER PHASE-D NSUM"/* 16940 */,/*40568*/"BAMUM LETTER PHASE-D TEUN"/* 16941 */, /*40569*/"BAMUM LETTER PHASE-D MAENJET"/* 16942 */,/*40570*/"BAMUM LETTER PHASE-D NGGAP"/* 16943 */, /*40571*/"BAMUM LETTER PHASE-D LEUM"/* 16944 */,/*40572*/"BAMUM LETTER PHASE-D NGGUOM"/* 16945 */, /*40573*/"BAMUM LETTER PHASE-D NSHUT"/* 16946 */,/*40574*/"BAMUM LETTER PHASE-D NJUEQ"/* 16947 */, /*40575*/"BAMUM LETTER PHASE-D GHEUAE"/* 16948 */,/*40576*/"BAMUM LETTER PHASE-D KU"/* 16949 */, /*40577*/"BAMUM LETTER PHASE-D REN OLD"/* 1694A */,/*40578*/"BAMUM LETTER PHASE-D TAE"/* 1694B */, /*40579*/"BAMUM LETTER PHASE-D TOQ"/* 1694C */,/*40580*/"BAMUM LETTER PHASE-D NYI"/* 1694D */, /*40581*/"BAMUM LETTER PHASE-D RII"/* 1694E */,/*40582*/"BAMUM LETTER PHASE-D LEEEE"/* 1694F */, /*40583*/"BAMUM LETTER PHASE-D MEEEE"/* 16950 */,/*40584*/"BAMUM LETTER PHASE-D M"/* 16951 */, /*40585*/"BAMUM LETTER PHASE-D SUU"/* 16952 */,/*40586*/"BAMUM LETTER PHASE-D MU"/* 16953 */, /*40587*/"BAMUM LETTER PHASE-D SHII"/* 16954 */,/*40588*/"BAMUM LETTER PHASE-D SHEUX"/* 16955 */, /*40589*/"BAMUM LETTER PHASE-D KYEE"/* 16956 */,/*40590*/"BAMUM LETTER PHASE-D NU"/* 16957 */, /*40591*/"BAMUM LETTER PHASE-D SHU"/* 16958 */,/*40592*/"BAMUM LETTER PHASE-D NTEE"/* 16959 */, /*40593*/"BAMUM LETTER PHASE-D PEE"/* 1695A */,/*40594*/"BAMUM LETTER PHASE-D NI"/* 1695B */, /*40595*/"BAMUM LETTER PHASE-D SHOQ"/* 1695C */,/*40596*/"BAMUM LETTER PHASE-D PUQ"/* 1695D */, /*40597*/"BAMUM LETTER PHASE-D MVOP"/* 1695E */,/*40598*/"BAMUM LETTER PHASE-D LOQ"/* 1695F */, /*40599*/"BAMUM LETTER PHASE-D REN MUCH"/* 16960 */,/*40600*/"BAMUM LETTER PHASE-D TI"/* 16961 */, /*40601*/"BAMUM LETTER PHASE-D NTUU"/* 16962 */,/*40602*/"BAMUM LETTER PHASE-D MBAA SEVEN"/* 16963 */, /*40603*/"BAMUM LETTER PHASE-D SAQ"/* 16964 */,/*40604*/"BAMUM LETTER PHASE-D FAA"/* 16965 */, /*40605*/"BAMUM LETTER PHASE-E NDAP"/* 16966 */,/*40606*/"BAMUM LETTER PHASE-E TOON"/* 16967 */, /*40607*/"BAMUM LETTER PHASE-E MBEUM"/* 16968 */,/*40608*/"BAMUM LETTER PHASE-E LAP"/* 16969 */, /*40609*/"BAMUM LETTER PHASE-E VOM"/* 1696A */,/*40610*/"BAMUM LETTER PHASE-E LOON"/* 1696B */, /*40611*/"BAMUM LETTER PHASE-E PAA"/* 1696C */,/*40612*/"BAMUM LETTER PHASE-E SOM"/* 1696D */, /*40613*/"BAMUM LETTER PHASE-E RAQ"/* 1696E */,/*40614*/"BAMUM LETTER PHASE-E NSHUOP"/* 1696F */, /*40615*/"BAMUM LETTER PHASE-E NDUN"/* 16970 */,/*40616*/"BAMUM LETTER PHASE-E PUAE"/* 16971 */, /*40617*/"BAMUM LETTER PHASE-E TAM"/* 16972 */,/*40618*/"BAMUM LETTER PHASE-E NGKA"/* 16973 */, /*40619*/"BAMUM LETTER PHASE-E KPEUX"/* 16974 */,/*40620*/"BAMUM LETTER PHASE-E WUO"/* 16975 */, /*40621*/"BAMUM LETTER PHASE-E SEE"/* 16976 */,/*40622*/"BAMUM LETTER PHASE-E NGGEUAET"/* 16977 */, /*40623*/"BAMUM LETTER PHASE-E PAAM"/* 16978 */,/*40624*/"BAMUM LETTER PHASE-E TOO"/* 16979 */, /*40625*/"BAMUM LETTER PHASE-E KUOP"/* 1697A */,/*40626*/"BAMUM LETTER PHASE-E LOM"/* 1697B */, /*40627*/"BAMUM LETTER PHASE-E NSHIEE"/* 1697C */,/*40628*/"BAMUM LETTER PHASE-E NGOP"/* 1697D */, /*40629*/"BAMUM LETTER PHASE-E MAEM"/* 1697E */,/*40630*/"BAMUM LETTER PHASE-E NGKEUX"/* 1697F */, /*40631*/"BAMUM LETTER PHASE-E NGOQ"/* 16980 */,/*40632*/"BAMUM LETTER PHASE-E NSHUE"/* 16981 */, /*40633*/"BAMUM LETTER PHASE-E RIMGBA"/* 16982 */,/*40634*/"BAMUM LETTER PHASE-E NJEUX"/* 16983 */, /*40635*/"BAMUM LETTER PHASE-E PEEM"/* 16984 */,/*40636*/"BAMUM LETTER PHASE-E SAA"/* 16985 */, /*40637*/"BAMUM LETTER PHASE-E NGGURAE"/* 16986 */,/*40638*/"BAMUM LETTER PHASE-E MGBA"/* 16987 */, /*40639*/"BAMUM LETTER PHASE-E GHEUX"/* 16988 */,/*40640*/"BAMUM LETTER PHASE-E NGKEUAEM"/* 16989 */, /*40641*/"BAMUM LETTER PHASE-E NJAEMLI"/* 1698A */,/*40642*/"BAMUM LETTER PHASE-E MAP"/* 1698B */, /*40643*/"BAMUM LETTER PHASE-E LOOT"/* 1698C */,/*40644*/"BAMUM LETTER PHASE-E NGGEEEE"/* 1698D */, /*40645*/"BAMUM LETTER PHASE-E NDIQ"/* 1698E */,/*40646*/"BAMUM LETTER PHASE-E TAEN NTEUM"/* 1698F */, /*40647*/"BAMUM LETTER PHASE-E SET"/* 16990 */,/*40648*/"BAMUM LETTER PHASE-E PUM"/* 16991 */, /*40649*/"BAMUM LETTER PHASE-E NDAA SOFTNESS"/* 16992 */,/*40650*/"BAMUM LETTER PHASE-E NGGUAESHAE NYAM"/* 16993 */, /*40651*/"BAMUM LETTER PHASE-E YIEE"/* 16994 */,/*40652*/"BAMUM LETTER PHASE-E GHEUN"/* 16995 */, /*40653*/"BAMUM LETTER PHASE-E TUAE"/* 16996 */,/*40654*/"BAMUM LETTER PHASE-E YEUAE"/* 16997 */, /*40655*/"BAMUM LETTER PHASE-E PO"/* 16998 */,/*40656*/"BAMUM LETTER PHASE-E TUMAE"/* 16999 */, /*40657*/"BAMUM LETTER PHASE-E KEUAE"/* 1699A */,/*40658*/"BAMUM LETTER PHASE-E SUAEN"/* 1699B */, /*40659*/"BAMUM LETTER PHASE-E TEUAEQ"/* 1699C */,/*40660*/"BAMUM LETTER PHASE-E VEUAE"/* 1699D */, /*40661*/"BAMUM LETTER PHASE-E WEUX"/* 1699E */,/*40662*/"BAMUM LETTER PHASE-E LAAM"/* 1699F */, /*40663*/"BAMUM LETTER PHASE-E PU"/* 169A0 */,/*40664*/"BAMUM LETTER PHASE-E TAAQ"/* 169A1 */, /*40665*/"BAMUM LETTER PHASE-E GHAAMAE"/* 169A2 */,/*40666*/"BAMUM LETTER PHASE-E NGEUREUT"/* 169A3 */, /*40667*/"BAMUM LETTER PHASE-E SHEUAEQ"/* 169A4 */,/*40668*/"BAMUM LETTER PHASE-E MGBEN"/* 169A5 */, /*40669*/"BAMUM LETTER PHASE-E MBEE"/* 169A6 */,/*40670*/"BAMUM LETTER PHASE-E NZAQ"/* 169A7 */, /*40671*/"BAMUM LETTER PHASE-E NKOM"/* 169A8 */,/*40672*/"BAMUM LETTER PHASE-E GBET"/* 169A9 */, /*40673*/"BAMUM LETTER PHASE-E TUM"/* 169AA */,/*40674*/"BAMUM LETTER PHASE-E KUET"/* 169AB */, /*40675*/"BAMUM LETTER PHASE-E YAP"/* 169AC */,/*40676*/"BAMUM LETTER PHASE-E NYI CLEAVER"/* 169AD */, /*40677*/"BAMUM LETTER PHASE-E YIT"/* 169AE */,/*40678*/"BAMUM LETTER PHASE-E MFEUQ"/* 169AF */, /*40679*/"BAMUM LETTER PHASE-E NDIAQ"/* 169B0 */,/*40680*/"BAMUM LETTER PHASE-E PIEEQ"/* 169B1 */, /*40681*/"BAMUM LETTER PHASE-E YUEQ"/* 169B2 */,/*40682*/"BAMUM LETTER PHASE-E LEUAEM"/* 169B3 */, /*40683*/"BAMUM LETTER PHASE-E FUE"/* 169B4 */,/*40684*/"BAMUM LETTER PHASE-E GBEUX"/* 169B5 */, /*40685*/"BAMUM LETTER PHASE-E NGKUP"/* 169B6 */,/*40686*/"BAMUM LETTER PHASE-E KET"/* 169B7 */, /*40687*/"BAMUM LETTER PHASE-E MAE"/* 169B8 */,/*40688*/"BAMUM LETTER PHASE-E NGKAAMI"/* 169B9 */, /*40689*/"BAMUM LETTER PHASE-E GHET"/* 169BA */,/*40690*/"BAMUM LETTER PHASE-E FA"/* 169BB */, /*40691*/"BAMUM LETTER PHASE-E NTUM"/* 169BC */,/*40692*/"BAMUM LETTER PHASE-E PEUT"/* 169BD */, /*40693*/"BAMUM LETTER PHASE-E YEUM"/* 169BE */,/*40694*/"BAMUM LETTER PHASE-E NGGEUAE"/* 169BF */, /*40695*/"BAMUM LETTER PHASE-E NYI BETWEEN"/* 169C0 */,/*40696*/"BAMUM LETTER PHASE-E NZUQ"/* 169C1 */, /*40697*/"BAMUM LETTER PHASE-E POON"/* 169C2 */,/*40698*/"BAMUM LETTER PHASE-E MIEE"/* 169C3 */, /*40699*/"BAMUM LETTER PHASE-E FUET"/* 169C4 */,/*40700*/"BAMUM LETTER PHASE-E NAE"/* 169C5 */, /*40701*/"BAMUM LETTER PHASE-E MUAE"/* 169C6 */,/*40702*/"BAMUM LETTER PHASE-E GHEUAE"/* 169C7 */, /*40703*/"BAMUM LETTER PHASE-E FU I"/* 169C8 */,/*40704*/"BAMUM LETTER PHASE-E MVI"/* 169C9 */, /*40705*/"BAMUM LETTER PHASE-E PUAQ"/* 169CA */,/*40706*/"BAMUM LETTER PHASE-E NGKUM"/* 169CB */, /*40707*/"BAMUM LETTER PHASE-E KUT"/* 169CC */,/*40708*/"BAMUM LETTER PHASE-E PIET"/* 169CD */, /*40709*/"BAMUM LETTER PHASE-E NTAP"/* 169CE */,/*40710*/"BAMUM LETTER PHASE-E YEUAET"/* 169CF */, /*40711*/"BAMUM LETTER PHASE-E NGGUP"/* 169D0 */,/*40712*/"BAMUM LETTER PHASE-E PA PEOPLE"/* 169D1 */, /*40713*/"BAMUM LETTER PHASE-E FU CALL"/* 169D2 */,/*40714*/"BAMUM LETTER PHASE-E FOM"/* 169D3 */, /*40715*/"BAMUM LETTER PHASE-E NJEE"/* 169D4 */,/*40716*/"BAMUM LETTER PHASE-E A"/* 169D5 */, /*40717*/"BAMUM LETTER PHASE-E TOQ"/* 169D6 */,/*40718*/"BAMUM LETTER PHASE-E O"/* 169D7 */, /*40719*/"BAMUM LETTER PHASE-E I"/* 169D8 */,/*40720*/"BAMUM LETTER PHASE-E LAQ"/* 169D9 */, /*40721*/"BAMUM LETTER PHASE-E PA PLURAL"/* 169DA */,/*40722*/"BAMUM LETTER PHASE-E TAA"/* 169DB */, /*40723*/"BAMUM LETTER PHASE-E TAQ"/* 169DC */,/*40724*/"BAMUM LETTER PHASE-E NDAA MY HOUSE"/* 169DD */, /*40725*/"BAMUM LETTER PHASE-E SHIQ"/* 169DE */,/*40726*/"BAMUM LETTER PHASE-E YEUX"/* 169DF */, /*40727*/"BAMUM LETTER PHASE-E NGUAE"/* 169E0 */,/*40728*/"BAMUM LETTER PHASE-E YUAEN"/* 169E1 */, /*40729*/"BAMUM LETTER PHASE-E YOQ SWIMMING"/* 169E2 */,/*40730*/"BAMUM LETTER PHASE-E YOQ COVER"/* 169E3 */, /*40731*/"BAMUM LETTER PHASE-E YUQ"/* 169E4 */,/*40732*/"BAMUM LETTER PHASE-E YUN"/* 169E5 */, /*40733*/"BAMUM LETTER PHASE-E KEUX"/* 169E6 */,/*40734*/"BAMUM LETTER PHASE-E PEUX"/* 169E7 */, /*40735*/"BAMUM LETTER PHASE-E NJEE EPOCH"/* 169E8 */,/*40736*/"BAMUM LETTER PHASE-E PUE"/* 169E9 */, /*40737*/"BAMUM LETTER PHASE-E WUE"/* 169EA */,/*40738*/"BAMUM LETTER PHASE-E FEE"/* 169EB */, /*40739*/"BAMUM LETTER PHASE-E VEE"/* 169EC */,/*40740*/"BAMUM LETTER PHASE-E LU"/* 169ED */, /*40741*/"BAMUM LETTER PHASE-E MI"/* 169EE */,/*40742*/"BAMUM LETTER PHASE-E REUX"/* 169EF */, /*40743*/"BAMUM LETTER PHASE-E RAE"/* 169F0 */,/*40744*/"BAMUM LETTER PHASE-E NGUAET"/* 169F1 */, /*40745*/"BAMUM LETTER PHASE-E NGA"/* 169F2 */,/*40746*/"BAMUM LETTER PHASE-E SHO"/* 169F3 */, /*40747*/"BAMUM LETTER PHASE-E SHOQ"/* 169F4 */,/*40748*/"BAMUM LETTER PHASE-E FU REMEDY"/* 169F5 */, /*40749*/"BAMUM LETTER PHASE-E NA"/* 169F6 */,/*40750*/"BAMUM LETTER PHASE-E PI"/* 169F7 */, /*40751*/"BAMUM LETTER PHASE-E LOQ"/* 169F8 */,/*40752*/"BAMUM LETTER PHASE-E KO"/* 169F9 */, /*40753*/"BAMUM LETTER PHASE-E MEN"/* 169FA */,/*40754*/"BAMUM LETTER PHASE-E MA"/* 169FB */, /*40755*/"BAMUM LETTER PHASE-E MAQ"/* 169FC */,/*40756*/"BAMUM LETTER PHASE-E TEU"/* 169FD */, /*40757*/"BAMUM LETTER PHASE-E KI"/* 169FE */,/*40758*/"BAMUM LETTER PHASE-E MON"/* 169FF */, /*40759*/"BAMUM LETTER PHASE-E TEN"/* 16A00 */,/*40760*/"BAMUM LETTER PHASE-E FAQ"/* 16A01 */, /*40761*/"BAMUM LETTER PHASE-E GHOM"/* 16A02 */,/*40762*/"BAMUM LETTER PHASE-F KA"/* 16A03 */, /*40763*/"BAMUM LETTER PHASE-F U"/* 16A04 */,/*40764*/"BAMUM LETTER PHASE-F KU"/* 16A05 */, /*40765*/"BAMUM LETTER PHASE-F EE"/* 16A06 */,/*40766*/"BAMUM LETTER PHASE-F REE"/* 16A07 */, /*40767*/"BAMUM LETTER PHASE-F TAE"/* 16A08 */,/*40768*/"BAMUM LETTER PHASE-F NYI"/* 16A09 */, /*40769*/"BAMUM LETTER PHASE-F LA"/* 16A0A */,/*40770*/"BAMUM LETTER PHASE-F RII"/* 16A0B */, /*40771*/"BAMUM LETTER PHASE-F RIEE"/* 16A0C */,/*40772*/"BAMUM LETTER PHASE-F MEEEE"/* 16A0D */, /*40773*/"BAMUM LETTER PHASE-F TAA"/* 16A0E */,/*40774*/"BAMUM LETTER PHASE-F NDAA"/* 16A0F */, /*40775*/"BAMUM LETTER PHASE-F NJAEM"/* 16A10 */,/*40776*/"BAMUM LETTER PHASE-F M"/* 16A11 */, /*40777*/"BAMUM LETTER PHASE-F SUU"/* 16A12 */,/*40778*/"BAMUM LETTER PHASE-F SHII"/* 16A13 */, /*40779*/"BAMUM LETTER PHASE-F SI"/* 16A14 */,/*40780*/"BAMUM LETTER PHASE-F SEUX"/* 16A15 */, /*40781*/"BAMUM LETTER PHASE-F KYEE"/* 16A16 */,/*40782*/"BAMUM LETTER PHASE-F KET"/* 16A17 */, /*40783*/"BAMUM LETTER PHASE-F NUAE"/* 16A18 */,/*40784*/"BAMUM LETTER PHASE-F NU"/* 16A19 */, /*40785*/"BAMUM LETTER PHASE-F NJUAE"/* 16A1A */,/*40786*/"BAMUM LETTER PHASE-F YOQ"/* 16A1B */, /*40787*/"BAMUM LETTER PHASE-F SHU"/* 16A1C */,/*40788*/"BAMUM LETTER PHASE-F YA"/* 16A1D */, /*40789*/"BAMUM LETTER PHASE-F NSHA"/* 16A1E */,/*40790*/"BAMUM LETTER PHASE-F PEUX"/* 16A1F */, /*40791*/"BAMUM LETTER PHASE-F NTEE"/* 16A20 */,/*40792*/"BAMUM LETTER PHASE-F WUE"/* 16A21 */, /*40793*/"BAMUM LETTER PHASE-F PEE"/* 16A22 */,/*40794*/"BAMUM LETTER PHASE-F RU"/* 16A23 */, /*40795*/"BAMUM LETTER PHASE-F NI"/* 16A24 */,/*40796*/"BAMUM LETTER PHASE-F REUX"/* 16A25 */, /*40797*/"BAMUM LETTER PHASE-F KEN"/* 16A26 */,/*40798*/"BAMUM LETTER PHASE-F NGKWAEN"/* 16A27 */, /*40799*/"BAMUM LETTER PHASE-F NGGA"/* 16A28 */,/*40800*/"BAMUM LETTER PHASE-F SHO"/* 16A29 */, /*40801*/"BAMUM LETTER PHASE-F PUAE"/* 16A2A */,/*40802*/"BAMUM LETTER PHASE-F FOM"/* 16A2B */, /*40803*/"BAMUM LETTER PHASE-F WA"/* 16A2C */,/*40804*/"BAMUM LETTER PHASE-F LI"/* 16A2D */, /*40805*/"BAMUM LETTER PHASE-F LOQ"/* 16A2E */,/*40806*/"BAMUM LETTER PHASE-F KO"/* 16A2F */, /*40807*/"BAMUM LETTER PHASE-F MBEN"/* 16A30 */,/*40808*/"BAMUM LETTER PHASE-F REN"/* 16A31 */, /*40809*/"BAMUM LETTER PHASE-F MA"/* 16A32 */,/*40810*/"BAMUM LETTER PHASE-F MO"/* 16A33 */, /*40811*/"BAMUM LETTER PHASE-F MBAA"/* 16A34 */,/*40812*/"BAMUM LETTER PHASE-F TET"/* 16A35 */, /*40813*/"BAMUM LETTER PHASE-F KPA"/* 16A36 */,/*40814*/"BAMUM LETTER PHASE-F SAMBA"/* 16A37 */, /*40815*/"BAMUM LETTER PHASE-F VUEQ"/* 16A38 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*40823*/"MRO LETTER TA"/* 16A40 */, /*40824*/"MRO LETTER NGI"/* 16A41 */,/*40825*/"MRO LETTER YO"/* 16A42 */,/*40826*/"MRO LETTER MIM"/* 16A43 */, /*40827*/"MRO LETTER BA"/* 16A44 */,/*40828*/"MRO LETTER DA"/* 16A45 */,/*40829*/"MRO LETTER A"/* 16A46 */, /*40830*/"MRO LETTER PHI"/* 16A47 */,/*40831*/"MRO LETTER KHAI"/* 16A48 */,/*40832*/"MRO LETTER HAO"/* 16A49 */, /*40833*/"MRO LETTER DAI"/* 16A4A */,/*40834*/"MRO LETTER CHU"/* 16A4B */,/*40835*/"MRO LETTER KEAAE"/* 16A4C */, /*40836*/"MRO LETTER OL"/* 16A4D */,/*40837*/"MRO LETTER MAEM"/* 16A4E */,/*40838*/"MRO LETTER NIN"/* 16A4F */, /*40839*/"MRO LETTER PA"/* 16A50 */,/*40840*/"MRO LETTER OO"/* 16A51 */,/*40841*/"MRO LETTER O"/* 16A52 */, /*40842*/"MRO LETTER RO"/* 16A53 */,/*40843*/"MRO LETTER SHI"/* 16A54 */,/*40844*/"MRO LETTER THEA"/* 16A55 */, /*40845*/"MRO LETTER EA"/* 16A56 */,/*40846*/"MRO LETTER WA"/* 16A57 */,/*40847*/"MRO LETTER E"/* 16A58 */, /*40848*/"MRO LETTER KO"/* 16A59 */,/*40849*/"MRO LETTER LAN"/* 16A5A */,/*40850*/"MRO LETTER LA"/* 16A5B */, /*40851*/"MRO LETTER HAI"/* 16A5C */,/*40852*/"MRO LETTER RI"/* 16A5D */,/*40853*/"MRO LETTER TEK"/* 16A5E */,NULL, /*40855*/"MRO DIGIT ZERO"/* 16A60 */,/*40856*/"MRO DIGIT ONE"/* 16A61 */,/*40857*/"MRO DIGIT TWO"/* 16A62 */, /*40858*/"MRO DIGIT THREE"/* 16A63 */,/*40859*/"MRO DIGIT FOUR"/* 16A64 */,/*40860*/"MRO DIGIT FIVE"/* 16A65 */, /*40861*/"MRO DIGIT SIX"/* 16A66 */,/*40862*/"MRO DIGIT SEVEN"/* 16A67 */,/*40863*/"MRO DIGIT EIGHT"/* 16A68 */, /*40864*/"MRO DIGIT NINE"/* 16A69 */,NULL,NULL,NULL,NULL,/*40869*/"MRO DANDA"/* 16A6E */, /*40870*/"MRO DOUBLE DANDA"/* 16A6F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*40967*/"BASSA VAH LETTER ENNI"/* 16AD0 */, /*40968*/"BASSA VAH LETTER KA"/* 16AD1 */,/*40969*/"BASSA VAH LETTER SE"/* 16AD2 */, /*40970*/"BASSA VAH LETTER FA"/* 16AD3 */,/*40971*/"BASSA VAH LETTER MBE"/* 16AD4 */, /*40972*/"BASSA VAH LETTER YIE"/* 16AD5 */,/*40973*/"BASSA VAH LETTER GAH"/* 16AD6 */, /*40974*/"BASSA VAH LETTER DHII"/* 16AD7 */,/*40975*/"BASSA VAH LETTER KPAH"/* 16AD8 */, /*40976*/"BASSA VAH LETTER JO"/* 16AD9 */,/*40977*/"BASSA VAH LETTER HWAH"/* 16ADA */, /*40978*/"BASSA VAH LETTER WA"/* 16ADB */,/*40979*/"BASSA VAH LETTER ZO"/* 16ADC */, /*40980*/"BASSA VAH LETTER GBU"/* 16ADD */,/*40981*/"BASSA VAH LETTER DO"/* 16ADE */, /*40982*/"BASSA VAH LETTER CE"/* 16ADF */,/*40983*/"BASSA VAH LETTER UWU"/* 16AE0 */, /*40984*/"BASSA VAH LETTER TO"/* 16AE1 */,/*40985*/"BASSA VAH LETTER BA"/* 16AE2 */, /*40986*/"BASSA VAH LETTER VU"/* 16AE3 */,/*40987*/"BASSA VAH LETTER YEIN"/* 16AE4 */, /*40988*/"BASSA VAH LETTER PA"/* 16AE5 */,/*40989*/"BASSA VAH LETTER WADDA"/* 16AE6 */, /*40990*/"BASSA VAH LETTER A"/* 16AE7 */,/*40991*/"BASSA VAH LETTER O"/* 16AE8 */, /*40992*/"BASSA VAH LETTER OO"/* 16AE9 */,/*40993*/"BASSA VAH LETTER U"/* 16AEA */, /*40994*/"BASSA VAH LETTER EE"/* 16AEB */,/*40995*/"BASSA VAH LETTER E"/* 16AEC */, /*40996*/"BASSA VAH LETTER I"/* 16AED */,NULL,NULL,/*40999*/"BASSA VAH COMBINING HIGH TONE"/* 16AF0 */, /*41000*/"BASSA VAH COMBINING LOW TONE"/* 16AF1 */,/*41001*/"BASSA VAH COMBINING MID TONE"/* 16AF2 */, /*41002*/"BASSA VAH COMBINING LOW-MID TONE"/* 16AF3 */,/*41003*/"BASSA VAH COMBINING HIGH-LOW TONE"/* 16AF4 */, /*41004*/"BASSA VAH FULL STOP"/* 16AF5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*41015*/"PAHAWH HMONG VOWEL KEEB"/* 16B00 */,/*41016*/"PAHAWH HMONG VOWEL KEEV"/* 16B01 */, /*41017*/"PAHAWH HMONG VOWEL KIB"/* 16B02 */,/*41018*/"PAHAWH HMONG VOWEL KIV"/* 16B03 */, /*41019*/"PAHAWH HMONG VOWEL KAUB"/* 16B04 */,/*41020*/"PAHAWH HMONG VOWEL KAUV"/* 16B05 */, /*41021*/"PAHAWH HMONG VOWEL KUB"/* 16B06 */,/*41022*/"PAHAWH HMONG VOWEL KUV"/* 16B07 */, /*41023*/"PAHAWH HMONG VOWEL KEB"/* 16B08 */,/*41024*/"PAHAWH HMONG VOWEL KEV"/* 16B09 */, /*41025*/"PAHAWH HMONG VOWEL KAIB"/* 16B0A */,/*41026*/"PAHAWH HMONG VOWEL KAIV"/* 16B0B */, /*41027*/"PAHAWH HMONG VOWEL KOOB"/* 16B0C */,/*41028*/"PAHAWH HMONG VOWEL KOOV"/* 16B0D */, /*41029*/"PAHAWH HMONG VOWEL KAWB"/* 16B0E */,/*41030*/"PAHAWH HMONG VOWEL KAWV"/* 16B0F */, /*41031*/"PAHAWH HMONG VOWEL KUAB"/* 16B10 */,/*41032*/"PAHAWH HMONG VOWEL KUAV"/* 16B11 */, /*41033*/"PAHAWH HMONG VOWEL KOB"/* 16B12 */,/*41034*/"PAHAWH HMONG VOWEL KOV"/* 16B13 */, /*41035*/"PAHAWH HMONG VOWEL KIAB"/* 16B14 */,/*41036*/"PAHAWH HMONG VOWEL KIAV"/* 16B15 */, /*41037*/"PAHAWH HMONG VOWEL KAB"/* 16B16 */,/*41038*/"PAHAWH HMONG VOWEL KAV"/* 16B17 */, /*41039*/"PAHAWH HMONG VOWEL KWB"/* 16B18 */,/*41040*/"PAHAWH HMONG VOWEL KWV"/* 16B19 */, /*41041*/"PAHAWH HMONG VOWEL KAAB"/* 16B1A */,/*41042*/"PAHAWH HMONG VOWEL KAAV"/* 16B1B */, /*41043*/"PAHAWH HMONG CONSONANT VAU"/* 16B1C */,/*41044*/"PAHAWH HMONG CONSONANT NTSAU"/* 16B1D */, /*41045*/"PAHAWH HMONG CONSONANT LAU"/* 16B1E */,/*41046*/"PAHAWH HMONG CONSONANT HAU"/* 16B1F */, /*41047*/"PAHAWH HMONG CONSONANT NLAU"/* 16B20 */,/*41048*/"PAHAWH HMONG CONSONANT RAU"/* 16B21 */, /*41049*/"PAHAWH HMONG CONSONANT NKAU"/* 16B22 */,/*41050*/"PAHAWH HMONG CONSONANT QHAU"/* 16B23 */, /*41051*/"PAHAWH HMONG CONSONANT YAU"/* 16B24 */,/*41052*/"PAHAWH HMONG CONSONANT HLAU"/* 16B25 */, /*41053*/"PAHAWH HMONG CONSONANT MAU"/* 16B26 */,/*41054*/"PAHAWH HMONG CONSONANT CHAU"/* 16B27 */, /*41055*/"PAHAWH HMONG CONSONANT NCHAU"/* 16B28 */,/*41056*/"PAHAWH HMONG CONSONANT HNAU"/* 16B29 */, /*41057*/"PAHAWH HMONG CONSONANT PLHAU"/* 16B2A */,/*41058*/"PAHAWH HMONG CONSONANT NTHAU"/* 16B2B */, /*41059*/"PAHAWH HMONG CONSONANT NAU"/* 16B2C */,/*41060*/"PAHAWH HMONG CONSONANT AU"/* 16B2D */, /*41061*/"PAHAWH HMONG CONSONANT XAU"/* 16B2E */,/*41062*/"PAHAWH HMONG CONSONANT CAU"/* 16B2F */, /*41063*/"PAHAWH HMONG MARK CIM TUB"/* 16B30 */,/*41064*/"PAHAWH HMONG MARK CIM SO"/* 16B31 */, /*41065*/"PAHAWH HMONG MARK CIM KES"/* 16B32 */,/*41066*/"PAHAWH HMONG MARK CIM KHAV"/* 16B33 */, /*41067*/"PAHAWH HMONG MARK CIM SUAM"/* 16B34 */,/*41068*/"PAHAWH HMONG MARK CIM HOM"/* 16B35 */, /*41069*/"PAHAWH HMONG MARK CIM TAUM"/* 16B36 */,/*41070*/"PAHAWH HMONG SIGN VOS THOM"/* 16B37 */, /*41071*/"PAHAWH HMONG SIGN VOS TSHAB CEEB"/* 16B38 */,/*41072*/"PAHAWH HMONG SIGN CIM CHEEM"/* 16B39 */, /*41073*/"PAHAWH HMONG SIGN VOS THIAB"/* 16B3A */,/*41074*/"PAHAWH HMONG SIGN VOS FEEM"/* 16B3B */, /*41075*/"PAHAWH HMONG SIGN XYEEM NTXIV"/* 16B3C */,/*41076*/"PAHAWH HMONG SIGN XYEEM RHO"/* 16B3D */, /*41077*/"PAHAWH HMONG SIGN XYEEM TOV"/* 16B3E */,/*41078*/"PAHAWH HMONG SIGN XYEEM FAIB"/* 16B3F */, /*41079*/"PAHAWH HMONG SIGN VOS SEEV"/* 16B40 */,/*41080*/"PAHAWH HMONG SIGN MEEJ SUAB"/* 16B41 */, /*41081*/"PAHAWH HMONG SIGN VOS NRUA"/* 16B42 */,/*41082*/"PAHAWH HMONG SIGN IB YAM"/* 16B43 */, /*41083*/"PAHAWH HMONG SIGN XAUS"/* 16B44 */,/*41084*/"PAHAWH HMONG SIGN CIM TSOV ROG"/* 16B45 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*41095*/"PAHAWH HMONG DIGIT ZERO"/* 16B50 */,/*41096*/"PAHAWH HMONG DIGIT ONE"/* 16B51 */, /*41097*/"PAHAWH HMONG DIGIT TWO"/* 16B52 */,/*41098*/"PAHAWH HMONG DIGIT THREE"/* 16B53 */, /*41099*/"PAHAWH HMONG DIGIT FOUR"/* 16B54 */,/*41100*/"PAHAWH HMONG DIGIT FIVE"/* 16B55 */, /*41101*/"PAHAWH HMONG DIGIT SIX"/* 16B56 */,/*41102*/"PAHAWH HMONG DIGIT SEVEN"/* 16B57 */, /*41103*/"PAHAWH HMONG DIGIT EIGHT"/* 16B58 */,/*41104*/"PAHAWH HMONG DIGIT NINE"/* 16B59 */,NULL, /*41106*/"PAHAWH HMONG NUMBER TENS"/* 16B5B */,/*41107*/"PAHAWH HMONG NUMBER HUNDREDS"/* 16B5C */, /*41108*/"PAHAWH HMONG NUMBER TEN THOUSANDS"/* 16B5D */,/*41109*/"PAHAWH HMONG NUMBER MILLIONS"/* 16B5E */, /*41110*/"PAHAWH HMONG NUMBER HUNDRED MILLIONS"/* 16B5F */,/*41111*/"PAHAWH HMONG NUMBER TEN BILLIONS"/* 16B60 */, /*41112*/"PAHAWH HMONG NUMBER TRILLIONS"/* 16B61 */,NULL,/*41114*/"PAHAWH HMONG SIGN VOS LUB"/* 16B63 */, /*41115*/"PAHAWH HMONG SIGN XYOO"/* 16B64 */,/*41116*/"PAHAWH HMONG SIGN HLI"/* 16B65 */, /*41117*/"PAHAWH HMONG SIGN THIRD-STAGE HLI"/* 16B66 */,/*41118*/"PAHAWH HMONG SIGN ZWJ THAJ"/* 16B67 */, /*41119*/"PAHAWH HMONG SIGN HNUB"/* 16B68 */,/*41120*/"PAHAWH HMONG SIGN NQIG"/* 16B69 */, /*41121*/"PAHAWH HMONG SIGN XIAB"/* 16B6A */,/*41122*/"PAHAWH HMONG SIGN NTUJ"/* 16B6B */, /*41123*/"PAHAWH HMONG SIGN AV"/* 16B6C */,/*41124*/"PAHAWH HMONG SIGN TXHEEJ CEEV"/* 16B6D */, /*41125*/"PAHAWH HMONG SIGN MEEJ TSEEB"/* 16B6E */,/*41126*/"PAHAWH HMONG SIGN TAU"/* 16B6F */, /*41127*/"PAHAWH HMONG SIGN LOS"/* 16B70 */,/*41128*/"PAHAWH HMONG SIGN MUS"/* 16B71 */, /*41129*/"PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG"/* 16B72 */,/*41130*/"PAHAWH HMONG SIGN CIM CUAM TSHOOJ"/* 16B73 */, /*41131*/"PAHAWH HMONG SIGN CIM TXWV"/* 16B74 */,/*41132*/"PAHAWH HMONG SIGN CIM TXWV CHWV"/* 16B75 */, /*41133*/"PAHAWH HMONG SIGN CIM PUB DAWB"/* 16B76 */,/*41134*/"PAHAWH HMONG SIGN CIM NRES TOS"/* 16B77 */,NULL,NULL,NULL, NULL,NULL,/*41140*/"PAHAWH HMONG CLAN SIGN TSHEEJ"/* 16B7D */,/*41141*/"PAHAWH HMONG CLAN SIGN YEEG"/* 16B7E */, /*41142*/"PAHAWH HMONG CLAN SIGN LIS"/* 16B7F */,/*41143*/"PAHAWH HMONG CLAN SIGN LAUJ"/* 16B80 */, /*41144*/"PAHAWH HMONG CLAN SIGN XYOOJ"/* 16B81 */,/*41145*/"PAHAWH HMONG CLAN SIGN KOO"/* 16B82 */, /*41146*/"PAHAWH HMONG CLAN SIGN HAWJ"/* 16B83 */,/*41147*/"PAHAWH HMONG CLAN SIGN MUAS"/* 16B84 */, /*41148*/"PAHAWH HMONG CLAN SIGN THOJ"/* 16B85 */,/*41149*/"PAHAWH HMONG CLAN SIGN TSAB"/* 16B86 */, /*41150*/"PAHAWH HMONG CLAN SIGN PHAB"/* 16B87 */,/*41151*/"PAHAWH HMONG CLAN SIGN KHAB"/* 16B88 */, /*41152*/"PAHAWH HMONG CLAN SIGN HAM"/* 16B89 */,/*41153*/"PAHAWH HMONG CLAN SIGN VAJ"/* 16B8A */, /*41154*/"PAHAWH HMONG CLAN SIGN FAJ"/* 16B8B */,/*41155*/"PAHAWH HMONG CLAN SIGN YAJ"/* 16B8C */, /*41156*/"PAHAWH HMONG CLAN SIGN TSWB"/* 16B8D */,/*41157*/"PAHAWH HMONG CLAN SIGN KWM"/* 16B8E */, /*41158*/"PAHAWH HMONG CLAN SIGN VWJ"/* 16B8F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*42039*/"MIAO LETTER PA"/* 16F00 */,/*42040*/"MIAO LETTER BA"/* 16F01 */, /*42041*/"MIAO LETTER YI PA"/* 16F02 */,/*42042*/"MIAO LETTER PLA"/* 16F03 */,/*42043*/"MIAO LETTER MA"/* 16F04 */, /*42044*/"MIAO LETTER MHA"/* 16F05 */,/*42045*/"MIAO LETTER ARCHAIC MA"/* 16F06 */,/*42046*/"MIAO LETTER FA"/* 16F07 */, /*42047*/"MIAO LETTER VA"/* 16F08 */,/*42048*/"MIAO LETTER VFA"/* 16F09 */,/*42049*/"MIAO LETTER TA"/* 16F0A */, /*42050*/"MIAO LETTER DA"/* 16F0B */,/*42051*/"MIAO LETTER YI TTA"/* 16F0C */,/*42052*/"MIAO LETTER YI TA"/* 16F0D */, /*42053*/"MIAO LETTER TTA"/* 16F0E */,/*42054*/"MIAO LETTER DDA"/* 16F0F */,/*42055*/"MIAO LETTER NA"/* 16F10 */, /*42056*/"MIAO LETTER NHA"/* 16F11 */,/*42057*/"MIAO LETTER YI NNA"/* 16F12 */, /*42058*/"MIAO LETTER ARCHAIC NA"/* 16F13 */,/*42059*/"MIAO LETTER NNA"/* 16F14 */, /*42060*/"MIAO LETTER NNHA"/* 16F15 */,/*42061*/"MIAO LETTER LA"/* 16F16 */,/*42062*/"MIAO LETTER LYA"/* 16F17 */, /*42063*/"MIAO LETTER LHA"/* 16F18 */,/*42064*/"MIAO LETTER LHYA"/* 16F19 */,/*42065*/"MIAO LETTER TLHA"/* 16F1A */, /*42066*/"MIAO LETTER DLHA"/* 16F1B */,/*42067*/"MIAO LETTER TLHYA"/* 16F1C */,/*42068*/"MIAO LETTER DLHYA"/* 16F1D */, /*42069*/"MIAO LETTER KA"/* 16F1E */,/*42070*/"MIAO LETTER GA"/* 16F1F */,/*42071*/"MIAO LETTER YI KA"/* 16F20 */, /*42072*/"MIAO LETTER QA"/* 16F21 */,/*42073*/"MIAO LETTER QGA"/* 16F22 */,/*42074*/"MIAO LETTER NGA"/* 16F23 */, /*42075*/"MIAO LETTER NGHA"/* 16F24 */,/*42076*/"MIAO LETTER ARCHAIC NGA"/* 16F25 */, /*42077*/"MIAO LETTER HA"/* 16F26 */,/*42078*/"MIAO LETTER XA"/* 16F27 */,/*42079*/"MIAO LETTER GHA"/* 16F28 */, /*42080*/"MIAO LETTER GHHA"/* 16F29 */,/*42081*/"MIAO LETTER TSSA"/* 16F2A */,/*42082*/"MIAO LETTER DZZA"/* 16F2B */, /*42083*/"MIAO LETTER NYA"/* 16F2C */,/*42084*/"MIAO LETTER NYHA"/* 16F2D */,/*42085*/"MIAO LETTER TSHA"/* 16F2E */, /*42086*/"MIAO LETTER DZHA"/* 16F2F */,/*42087*/"MIAO LETTER YI TSHA"/* 16F30 */, /*42088*/"MIAO LETTER YI DZHA"/* 16F31 */,/*42089*/"MIAO LETTER REFORMED TSHA"/* 16F32 */, /*42090*/"MIAO LETTER SHA"/* 16F33 */,/*42091*/"MIAO LETTER SSA"/* 16F34 */,/*42092*/"MIAO LETTER ZHA"/* 16F35 */, /*42093*/"MIAO LETTER ZSHA"/* 16F36 */,/*42094*/"MIAO LETTER TSA"/* 16F37 */,/*42095*/"MIAO LETTER DZA"/* 16F38 */, /*42096*/"MIAO LETTER YI TSA"/* 16F39 */,/*42097*/"MIAO LETTER SA"/* 16F3A */,/*42098*/"MIAO LETTER ZA"/* 16F3B */, /*42099*/"MIAO LETTER ZSA"/* 16F3C */,/*42100*/"MIAO LETTER ZZA"/* 16F3D */,/*42101*/"MIAO LETTER ZZSA"/* 16F3E */, /*42102*/"MIAO LETTER ARCHAIC ZZA"/* 16F3F */,/*42103*/"MIAO LETTER ZZYA"/* 16F40 */, /*42104*/"MIAO LETTER ZZSYA"/* 16F41 */,/*42105*/"MIAO LETTER WA"/* 16F42 */,/*42106*/"MIAO LETTER AH"/* 16F43 */, /*42107*/"MIAO LETTER HHA"/* 16F44 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*42119*/"MIAO LETTER NASALIZATION"/* 16F50 */,/*42120*/"MIAO SIGN ASPIRATION"/* 16F51 */, /*42121*/"MIAO SIGN REFORMED VOICING"/* 16F52 */,/*42122*/"MIAO SIGN REFORMED ASPIRATION"/* 16F53 */, /*42123*/"MIAO VOWEL SIGN A"/* 16F54 */,/*42124*/"MIAO VOWEL SIGN AA"/* 16F55 */, /*42125*/"MIAO VOWEL SIGN AHH"/* 16F56 */,/*42126*/"MIAO VOWEL SIGN AN"/* 16F57 */, /*42127*/"MIAO VOWEL SIGN ANG"/* 16F58 */,/*42128*/"MIAO VOWEL SIGN O"/* 16F59 */, /*42129*/"MIAO VOWEL SIGN OO"/* 16F5A */,/*42130*/"MIAO VOWEL SIGN WO"/* 16F5B */, /*42131*/"MIAO VOWEL SIGN W"/* 16F5C */,/*42132*/"MIAO VOWEL SIGN E"/* 16F5D */,/*42133*/"MIAO VOWEL SIGN EN"/* 16F5E */, /*42134*/"MIAO VOWEL SIGN ENG"/* 16F5F */,/*42135*/"MIAO VOWEL SIGN OEY"/* 16F60 */, /*42136*/"MIAO VOWEL SIGN I"/* 16F61 */,/*42137*/"MIAO VOWEL SIGN IA"/* 16F62 */, /*42138*/"MIAO VOWEL SIGN IAN"/* 16F63 */,/*42139*/"MIAO VOWEL SIGN IANG"/* 16F64 */, /*42140*/"MIAO VOWEL SIGN IO"/* 16F65 */,/*42141*/"MIAO VOWEL SIGN IE"/* 16F66 */, /*42142*/"MIAO VOWEL SIGN II"/* 16F67 */,/*42143*/"MIAO VOWEL SIGN IU"/* 16F68 */, /*42144*/"MIAO VOWEL SIGN ING"/* 16F69 */,/*42145*/"MIAO VOWEL SIGN U"/* 16F6A */, /*42146*/"MIAO VOWEL SIGN UA"/* 16F6B */,/*42147*/"MIAO VOWEL SIGN UAN"/* 16F6C */, /*42148*/"MIAO VOWEL SIGN UANG"/* 16F6D */,/*42149*/"MIAO VOWEL SIGN UU"/* 16F6E */, /*42150*/"MIAO VOWEL SIGN UEI"/* 16F6F */,/*42151*/"MIAO VOWEL SIGN UNG"/* 16F70 */, /*42152*/"MIAO VOWEL SIGN Y"/* 16F71 */,/*42153*/"MIAO VOWEL SIGN YI"/* 16F72 */, /*42154*/"MIAO VOWEL SIGN AE"/* 16F73 */,/*42155*/"MIAO VOWEL SIGN AEE"/* 16F74 */, /*42156*/"MIAO VOWEL SIGN ERR"/* 16F75 */,/*42157*/"MIAO VOWEL SIGN ROUNDED ERR"/* 16F76 */, /*42158*/"MIAO VOWEL SIGN ER"/* 16F77 */,/*42159*/"MIAO VOWEL SIGN ROUNDED ER"/* 16F78 */, /*42160*/"MIAO VOWEL SIGN AI"/* 16F79 */,/*42161*/"MIAO VOWEL SIGN EI"/* 16F7A */, /*42162*/"MIAO VOWEL SIGN AU"/* 16F7B */,/*42163*/"MIAO VOWEL SIGN OU"/* 16F7C */, /*42164*/"MIAO VOWEL SIGN N"/* 16F7D */,/*42165*/"MIAO VOWEL SIGN NG"/* 16F7E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*42182*/"MIAO TONE RIGHT"/* 16F8F */,/*42183*/"MIAO TONE TOP RIGHT"/* 16F90 */, /*42184*/"MIAO TONE ABOVE"/* 16F91 */,/*42185*/"MIAO TONE BELOW"/* 16F92 */,/*42186*/"MIAO LETTER TONE-2"/* 16F93 */, /*42187*/"MIAO LETTER TONE-3"/* 16F94 */,/*42188*/"MIAO LETTER TONE-4"/* 16F95 */, /*42189*/"MIAO LETTER TONE-5"/* 16F96 */,/*42190*/"MIAO LETTER TONE-6"/* 16F97 */, /*42191*/"MIAO LETTER TONE-7"/* 16F98 */,/*42192*/"MIAO LETTER TONE-8"/* 16F99 */, /*42193*/"MIAO LETTER REFORMED TONE-1"/* 16F9A */,/*42194*/"MIAO LETTER REFORMED TONE-2"/* 16F9B */, /*42195*/"MIAO LETTER REFORMED TONE-4"/* 16F9C */,/*42196*/"MIAO LETTER REFORMED TONE-5"/* 16F9D */, /*42197*/"MIAO LETTER REFORMED TONE-6"/* 16F9E */,/*42198*/"MIAO LETTER REFORMED TONE-8"/* 16F9F */, /*42199*/"KATAKANA LETTER ARCHAIC E"/* 1B000 */,/*42200*/"HIRAGANA LETTER ARCHAIC YE"/* 1B001 */, /*42201*/"DUPLOYAN LETTER H"/* 1BC00 */,/*42202*/"DUPLOYAN LETTER X"/* 1BC01 */,/*42203*/"DUPLOYAN LETTER P"/* 1BC02 */, /*42204*/"DUPLOYAN LETTER T"/* 1BC03 */,/*42205*/"DUPLOYAN LETTER F"/* 1BC04 */,/*42206*/"DUPLOYAN LETTER K"/* 1BC05 */, /*42207*/"DUPLOYAN LETTER L"/* 1BC06 */,/*42208*/"DUPLOYAN LETTER B"/* 1BC07 */,/*42209*/"DUPLOYAN LETTER D"/* 1BC08 */, /*42210*/"DUPLOYAN LETTER V"/* 1BC09 */,/*42211*/"DUPLOYAN LETTER G"/* 1BC0A */,/*42212*/"DUPLOYAN LETTER R"/* 1BC0B */, /*42213*/"DUPLOYAN LETTER P N"/* 1BC0C */,/*42214*/"DUPLOYAN LETTER D S"/* 1BC0D */, /*42215*/"DUPLOYAN LETTER F N"/* 1BC0E */,/*42216*/"DUPLOYAN LETTER K M"/* 1BC0F */, /*42217*/"DUPLOYAN LETTER R S"/* 1BC10 */,/*42218*/"DUPLOYAN LETTER TH"/* 1BC11 */, /*42219*/"DUPLOYAN LETTER SLOAN DH"/* 1BC12 */,/*42220*/"DUPLOYAN LETTER DH"/* 1BC13 */, /*42221*/"DUPLOYAN LETTER KK"/* 1BC14 */,/*42222*/"DUPLOYAN LETTER SLOAN J"/* 1BC15 */, /*42223*/"DUPLOYAN LETTER HL"/* 1BC16 */,/*42224*/"DUPLOYAN LETTER LH"/* 1BC17 */, /*42225*/"DUPLOYAN LETTER RH"/* 1BC18 */,/*42226*/"DUPLOYAN LETTER M"/* 1BC19 */,/*42227*/"DUPLOYAN LETTER N"/* 1BC1A */, /*42228*/"DUPLOYAN LETTER J"/* 1BC1B */,/*42229*/"DUPLOYAN LETTER S"/* 1BC1C */, /*42230*/"DUPLOYAN LETTER M N"/* 1BC1D */,/*42231*/"DUPLOYAN LETTER N M"/* 1BC1E */, /*42232*/"DUPLOYAN LETTER J M"/* 1BC1F */,/*42233*/"DUPLOYAN LETTER S J"/* 1BC20 */, /*42234*/"DUPLOYAN LETTER M WITH DOT"/* 1BC21 */,/*42235*/"DUPLOYAN LETTER N WITH DOT"/* 1BC22 */, /*42236*/"DUPLOYAN LETTER J WITH DOT"/* 1BC23 */,/*42237*/"DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE"/* 1BC24 */, /*42238*/"DUPLOYAN LETTER S WITH DOT"/* 1BC25 */,/*42239*/"DUPLOYAN LETTER S WITH DOT BELOW"/* 1BC26 */, /*42240*/"DUPLOYAN LETTER M S"/* 1BC27 */,/*42241*/"DUPLOYAN LETTER N S"/* 1BC28 */, /*42242*/"DUPLOYAN LETTER J S"/* 1BC29 */,/*42243*/"DUPLOYAN LETTER S S"/* 1BC2A */, /*42244*/"DUPLOYAN LETTER M N S"/* 1BC2B */,/*42245*/"DUPLOYAN LETTER N M S"/* 1BC2C */, /*42246*/"DUPLOYAN LETTER J M S"/* 1BC2D */,/*42247*/"DUPLOYAN LETTER S J S"/* 1BC2E */, /*42248*/"DUPLOYAN LETTER J S WITH DOT"/* 1BC2F */,/*42249*/"DUPLOYAN LETTER J N"/* 1BC30 */, /*42250*/"DUPLOYAN LETTER J N S"/* 1BC31 */,/*42251*/"DUPLOYAN LETTER S T"/* 1BC32 */, /*42252*/"DUPLOYAN LETTER S T R"/* 1BC33 */,/*42253*/"DUPLOYAN LETTER S P"/* 1BC34 */, /*42254*/"DUPLOYAN LETTER S P R"/* 1BC35 */,/*42255*/"DUPLOYAN LETTER T S"/* 1BC36 */, /*42256*/"DUPLOYAN LETTER T R S"/* 1BC37 */,/*42257*/"DUPLOYAN LETTER W"/* 1BC38 */, /*42258*/"DUPLOYAN LETTER WH"/* 1BC39 */,/*42259*/"DUPLOYAN LETTER W R"/* 1BC3A */, /*42260*/"DUPLOYAN LETTER S N"/* 1BC3B */,/*42261*/"DUPLOYAN LETTER S M"/* 1BC3C */, /*42262*/"DUPLOYAN LETTER K R S"/* 1BC3D */,/*42263*/"DUPLOYAN LETTER G R S"/* 1BC3E */, /*42264*/"DUPLOYAN LETTER S K"/* 1BC3F */,/*42265*/"DUPLOYAN LETTER S K R"/* 1BC40 */, /*42266*/"DUPLOYAN LETTER A"/* 1BC41 */,/*42267*/"DUPLOYAN LETTER SLOAN OW"/* 1BC42 */, /*42268*/"DUPLOYAN LETTER OA"/* 1BC43 */,/*42269*/"DUPLOYAN LETTER O"/* 1BC44 */, /*42270*/"DUPLOYAN LETTER AOU"/* 1BC45 */,/*42271*/"DUPLOYAN LETTER I"/* 1BC46 */, /*42272*/"DUPLOYAN LETTER E"/* 1BC47 */,/*42273*/"DUPLOYAN LETTER IE"/* 1BC48 */, /*42274*/"DUPLOYAN LETTER SHORT I"/* 1BC49 */,/*42275*/"DUPLOYAN LETTER UI"/* 1BC4A */, /*42276*/"DUPLOYAN LETTER EE"/* 1BC4B */,/*42277*/"DUPLOYAN LETTER SLOAN EH"/* 1BC4C */, /*42278*/"DUPLOYAN LETTER ROMANIAN I"/* 1BC4D */,/*42279*/"DUPLOYAN LETTER SLOAN EE"/* 1BC4E */, /*42280*/"DUPLOYAN LETTER LONG I"/* 1BC4F */,/*42281*/"DUPLOYAN LETTER YE"/* 1BC50 */, /*42282*/"DUPLOYAN LETTER U"/* 1BC51 */,/*42283*/"DUPLOYAN LETTER EU"/* 1BC52 */, /*42284*/"DUPLOYAN LETTER XW"/* 1BC53 */,/*42285*/"DUPLOYAN LETTER U N"/* 1BC54 */, /*42286*/"DUPLOYAN LETTER LONG U"/* 1BC55 */,/*42287*/"DUPLOYAN LETTER ROMANIAN U"/* 1BC56 */, /*42288*/"DUPLOYAN LETTER UH"/* 1BC57 */,/*42289*/"DUPLOYAN LETTER SLOAN U"/* 1BC58 */, /*42290*/"DUPLOYAN LETTER OOH"/* 1BC59 */,/*42291*/"DUPLOYAN LETTER OW"/* 1BC5A */, /*42292*/"DUPLOYAN LETTER OU"/* 1BC5B */,/*42293*/"DUPLOYAN LETTER WA"/* 1BC5C */, /*42294*/"DUPLOYAN LETTER WO"/* 1BC5D */,/*42295*/"DUPLOYAN LETTER WI"/* 1BC5E */, /*42296*/"DUPLOYAN LETTER WEI"/* 1BC5F */,/*42297*/"DUPLOYAN LETTER WOW"/* 1BC60 */, /*42298*/"DUPLOYAN LETTER NASAL U"/* 1BC61 */,/*42299*/"DUPLOYAN LETTER NASAL O"/* 1BC62 */, /*42300*/"DUPLOYAN LETTER NASAL I"/* 1BC63 */,/*42301*/"DUPLOYAN LETTER NASAL A"/* 1BC64 */, /*42302*/"DUPLOYAN LETTER PERNIN AN"/* 1BC65 */,/*42303*/"DUPLOYAN LETTER PERNIN AM"/* 1BC66 */, /*42304*/"DUPLOYAN LETTER SLOAN EN"/* 1BC67 */,/*42305*/"DUPLOYAN LETTER SLOAN AN"/* 1BC68 */, /*42306*/"DUPLOYAN LETTER SLOAN ON"/* 1BC69 */,/*42307*/"DUPLOYAN LETTER VOCALIC M"/* 1BC6A */,NULL,NULL,NULL,NULL,NULL, /*42313*/"DUPLOYAN AFFIX LEFT HORIZONTAL SECANT"/* 1BC70 */,/*42314*/"DUPLOYAN AFFIX MID HORIZONTAL SECANT"/* 1BC71 */, /*42315*/"DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT"/* 1BC72 */,/*42316*/"DUPLOYAN AFFIX LOW VERTICAL SECANT"/* 1BC73 */, /*42317*/"DUPLOYAN AFFIX MID VERTICAL SECANT"/* 1BC74 */,/*42318*/"DUPLOYAN AFFIX HIGH VERTICAL SECANT"/* 1BC75 */, /*42319*/"DUPLOYAN AFFIX ATTACHED SECANT"/* 1BC76 */,/*42320*/"DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT"/* 1BC77 */, /*42321*/"DUPLOYAN AFFIX ATTACHED TANGENT"/* 1BC78 */,/*42322*/"DUPLOYAN AFFIX ATTACHED TAIL"/* 1BC79 */, /*42323*/"DUPLOYAN AFFIX ATTACHED E HOOK"/* 1BC7A */,/*42324*/"DUPLOYAN AFFIX ATTACHED I HOOK"/* 1BC7B */, /*42325*/"DUPLOYAN AFFIX ATTACHED TANGENT HOOK"/* 1BC7C */,NULL,NULL,NULL, /*42329*/"DUPLOYAN AFFIX HIGH ACUTE"/* 1BC80 */,/*42330*/"DUPLOYAN AFFIX HIGH TIGHT ACUTE"/* 1BC81 */, /*42331*/"DUPLOYAN AFFIX HIGH GRAVE"/* 1BC82 */,/*42332*/"DUPLOYAN AFFIX HIGH LONG GRAVE"/* 1BC83 */, /*42333*/"DUPLOYAN AFFIX HIGH DOT"/* 1BC84 */,/*42334*/"DUPLOYAN AFFIX HIGH CIRCLE"/* 1BC85 */, /*42335*/"DUPLOYAN AFFIX HIGH LINE"/* 1BC86 */,/*42336*/"DUPLOYAN AFFIX HIGH WAVE"/* 1BC87 */, /*42337*/"DUPLOYAN AFFIX HIGH VERTICAL"/* 1BC88 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*42345*/"DUPLOYAN AFFIX LOW ACUTE"/* 1BC90 */,/*42346*/"DUPLOYAN AFFIX LOW TIGHT ACUTE"/* 1BC91 */, /*42347*/"DUPLOYAN AFFIX LOW GRAVE"/* 1BC92 */,/*42348*/"DUPLOYAN AFFIX LOW LONG GRAVE"/* 1BC93 */, /*42349*/"DUPLOYAN AFFIX LOW DOT"/* 1BC94 */,/*42350*/"DUPLOYAN AFFIX LOW CIRCLE"/* 1BC95 */, /*42351*/"DUPLOYAN AFFIX LOW LINE"/* 1BC96 */,/*42352*/"DUPLOYAN AFFIX LOW WAVE"/* 1BC97 */, /*42353*/"DUPLOYAN AFFIX LOW VERTICAL"/* 1BC98 */,/*42354*/"DUPLOYAN AFFIX LOW ARROW"/* 1BC99 */,NULL,NULL, /*42357*/"DUPLOYAN SIGN O WITH CROSS"/* 1BC9C */,/*42358*/"DUPLOYAN THICK LETTER SELECTOR"/* 1BC9D */, /*42359*/"DUPLOYAN DOUBLE MARK"/* 1BC9E */,/*42360*/"DUPLOYAN PUNCTUATION CHINOOK FULL STOP"/* 1BC9F */, /*42361*/"SHORTHAND FORMAT LETTER OVERLAP"/* 1BCA0 */,/*42362*/"SHORTHAND FORMAT CONTINUING OVERLAP"/* 1BCA1 */, /*42363*/"SHORTHAND FORMAT DOWN STEP"/* 1BCA2 */,/*42364*/"SHORTHAND FORMAT UP STEP"/* 1BCA3 */, /*42365*/"BYZANTINE MUSICAL SYMBOL PSILI"/* 1D000 */,/*42366*/"BYZANTINE MUSICAL SYMBOL DASEIA"/* 1D001 */, /*42367*/"BYZANTINE MUSICAL SYMBOL PERISPOMENI"/* 1D002 */, /*42368*/"BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON"/* 1D003 */, /*42369*/"BYZANTINE MUSICAL SYMBOL OXEIA DIPLI"/* 1D004 */, /*42370*/"BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON"/* 1D005 */, /*42371*/"BYZANTINE MUSICAL SYMBOL VAREIA DIPLI"/* 1D006 */,/*42372*/"BYZANTINE MUSICAL SYMBOL KATHISTI"/* 1D007 */, /*42373*/"BYZANTINE MUSICAL SYMBOL SYRMATIKI"/* 1D008 */,/*42374*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI"/* 1D009 */, /*42375*/"BYZANTINE MUSICAL SYMBOL YPOKRISIS"/* 1D00A */,/*42376*/"BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI"/* 1D00B */, /*42377*/"BYZANTINE MUSICAL SYMBOL KREMASTI"/* 1D00C */,/*42378*/"BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON"/* 1D00D */, /*42379*/"BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON"/* 1D00E */,/*42380*/"BYZANTINE MUSICAL SYMBOL TELEIA"/* 1D00F */, /*42381*/"BYZANTINE MUSICAL SYMBOL KENTIMATA"/* 1D010 */,/*42382*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS"/* 1D011 */, /*42383*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI"/* 1D012 */,/*42384*/"BYZANTINE MUSICAL SYMBOL SYNEVMA"/* 1D013 */, /*42385*/"BYZANTINE MUSICAL SYMBOL THITA"/* 1D014 */,/*42386*/"BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION"/* 1D015 */, /*42387*/"BYZANTINE MUSICAL SYMBOL GORGON ARCHAION"/* 1D016 */,/*42388*/"BYZANTINE MUSICAL SYMBOL PSILON"/* 1D017 */, /*42389*/"BYZANTINE MUSICAL SYMBOL CHAMILON"/* 1D018 */,/*42390*/"BYZANTINE MUSICAL SYMBOL VATHY"/* 1D019 */, /*42391*/"BYZANTINE MUSICAL SYMBOL ISON ARCHAION"/* 1D01A */, /*42392*/"BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION"/* 1D01B */, /*42393*/"BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION"/* 1D01C */, /*42394*/"BYZANTINE MUSICAL SYMBOL SAXIMATA"/* 1D01D */,/*42395*/"BYZANTINE MUSICAL SYMBOL PARICHON"/* 1D01E */, /*42396*/"BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA"/* 1D01F */, /*42397*/"BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION"/* 1D020 */, /*42398*/"BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION"/* 1D021 */, /*42399*/"BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION"/* 1D022 */,/*42400*/"BYZANTINE MUSICAL SYMBOL APOTHEMA"/* 1D023 */, /*42401*/"BYZANTINE MUSICAL SYMBOL KLASMA"/* 1D024 */,/*42402*/"BYZANTINE MUSICAL SYMBOL REVMA"/* 1D025 */, /*42403*/"BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION"/* 1D026 */,/*42404*/"BYZANTINE MUSICAL SYMBOL TINAGMA"/* 1D027 */, /*42405*/"BYZANTINE MUSICAL SYMBOL ANATRICHISMA"/* 1D028 */,/*42406*/"BYZANTINE MUSICAL SYMBOL SEISMA"/* 1D029 */, /*42407*/"BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION"/* 1D02A */, /*42408*/"BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU"/* 1D02B */, /*42409*/"BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION"/* 1D02C */,/*42410*/"BYZANTINE MUSICAL SYMBOL THEMA"/* 1D02D */, /*42411*/"BYZANTINE MUSICAL SYMBOL LEMOI"/* 1D02E */,/*42412*/"BYZANTINE MUSICAL SYMBOL DYO"/* 1D02F */, /*42413*/"BYZANTINE MUSICAL SYMBOL TRIA"/* 1D030 */,/*42414*/"BYZANTINE MUSICAL SYMBOL TESSERA"/* 1D031 */, /*42415*/"BYZANTINE MUSICAL SYMBOL KRATIMATA"/* 1D032 */,/*42416*/"BYZANTINE MUSICAL SYMBOL APESO EXO NEO"/* 1D033 */, /*42417*/"BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION"/* 1D034 */,/*42418*/"BYZANTINE MUSICAL SYMBOL IMIFTHORA"/* 1D035 */, /*42419*/"BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION"/* 1D036 */, /*42420*/"BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON"/* 1D037 */,/*42421*/"BYZANTINE MUSICAL SYMBOL PELASTON"/* 1D038 */, /*42422*/"BYZANTINE MUSICAL SYMBOL PSIFISTON"/* 1D039 */,/*42423*/"BYZANTINE MUSICAL SYMBOL KONTEVMA"/* 1D03A */, /*42424*/"BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION"/* 1D03B */,/*42425*/"BYZANTINE MUSICAL SYMBOL RAPISMA"/* 1D03C */, /*42426*/"BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION"/* 1D03D */, /*42427*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION"/* 1D03E */, /*42428*/"BYZANTINE MUSICAL SYMBOL ICHADIN"/* 1D03F */,/*42429*/"BYZANTINE MUSICAL SYMBOL NANA"/* 1D040 */, /*42430*/"BYZANTINE MUSICAL SYMBOL PETASMA"/* 1D041 */,/*42431*/"BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO"/* 1D042 */, /*42432*/"BYZANTINE MUSICAL SYMBOL TROMIKON ALLO"/* 1D043 */,/*42433*/"BYZANTINE MUSICAL SYMBOL STRAGGISMATA"/* 1D044 */, /*42434*/"BYZANTINE MUSICAL SYMBOL GRONTHISMATA"/* 1D045 */,/*42435*/"BYZANTINE MUSICAL SYMBOL ISON NEO"/* 1D046 */, /*42436*/"BYZANTINE MUSICAL SYMBOL OLIGON NEO"/* 1D047 */,/*42437*/"BYZANTINE MUSICAL SYMBOL OXEIA NEO"/* 1D048 */, /*42438*/"BYZANTINE MUSICAL SYMBOL PETASTI"/* 1D049 */,/*42439*/"BYZANTINE MUSICAL SYMBOL KOUFISMA"/* 1D04A */, /*42440*/"BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA"/* 1D04B */, /*42441*/"BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA"/* 1D04C */, /*42442*/"BYZANTINE MUSICAL SYMBOL PELASTON NEO"/* 1D04D */, /*42443*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO"/* 1D04E */, /*42444*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO"/* 1D04F */,/*42445*/"BYZANTINE MUSICAL SYMBOL YPSILI"/* 1D050 */, /*42446*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO"/* 1D051 */, /*42447*/"BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO"/* 1D052 */, /*42448*/"BYZANTINE MUSICAL SYMBOL YPORROI"/* 1D053 */,/*42449*/"BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON"/* 1D054 */, /*42450*/"BYZANTINE MUSICAL SYMBOL ELAFRON"/* 1D055 */,/*42451*/"BYZANTINE MUSICAL SYMBOL CHAMILI"/* 1D056 */, /*42452*/"BYZANTINE MUSICAL SYMBOL MIKRON ISON"/* 1D057 */,/*42453*/"BYZANTINE MUSICAL SYMBOL VAREIA NEO"/* 1D058 */, /*42454*/"BYZANTINE MUSICAL SYMBOL PIASMA NEO"/* 1D059 */,/*42455*/"BYZANTINE MUSICAL SYMBOL PSIFISTON NEO"/* 1D05A */, /*42456*/"BYZANTINE MUSICAL SYMBOL OMALON"/* 1D05B */,/*42457*/"BYZANTINE MUSICAL SYMBOL ANTIKENOMA"/* 1D05C */, /*42458*/"BYZANTINE MUSICAL SYMBOL LYGISMA"/* 1D05D */,/*42459*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO"/* 1D05E */, /*42460*/"BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO"/* 1D05F */, /*42461*/"BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA"/* 1D060 */,/*42462*/"BYZANTINE MUSICAL SYMBOL KYLISMA"/* 1D061 */, /*42463*/"BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA"/* 1D062 */, /*42464*/"BYZANTINE MUSICAL SYMBOL TROMIKON NEO"/* 1D063 */,/*42465*/"BYZANTINE MUSICAL SYMBOL EKSTREPTON"/* 1D064 */, /*42466*/"BYZANTINE MUSICAL SYMBOL SYNAGMA NEO"/* 1D065 */,/*42467*/"BYZANTINE MUSICAL SYMBOL SYRMA"/* 1D066 */, /*42468*/"BYZANTINE MUSICAL SYMBOL CHOREVMA NEO"/* 1D067 */,/*42469*/"BYZANTINE MUSICAL SYMBOL EPEGERMA"/* 1D068 */, /*42470*/"BYZANTINE MUSICAL SYMBOL SEISMA NEO"/* 1D069 */,/*42471*/"BYZANTINE MUSICAL SYMBOL XIRON KLASMA"/* 1D06A */, /*42472*/"BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON"/* 1D06B */, /*42473*/"BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA"/* 1D06C */, /*42474*/"BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA"/* 1D06D */, /*42475*/"BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA"/* 1D06E */, /*42476*/"BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA"/* 1D06F */, /*42477*/"BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA"/* 1D070 */, /*42478*/"BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA"/* 1D071 */, /*42479*/"BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON"/* 1D072 */, /*42480*/"BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON"/* 1D073 */, /*42481*/"BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON"/* 1D074 */, /*42482*/"BYZANTINE MUSICAL SYMBOL OYRANISMA NEO"/* 1D075 */, /*42483*/"BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO"/* 1D076 */, /*42484*/"BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO"/* 1D077 */, /*42485*/"BYZANTINE MUSICAL SYMBOL THEMA APLOUN"/* 1D078 */, /*42486*/"BYZANTINE MUSICAL SYMBOL THES KAI APOTHES"/* 1D079 */,/*42487*/"BYZANTINE MUSICAL SYMBOL KATAVASMA"/* 1D07A */, /*42488*/"BYZANTINE MUSICAL SYMBOL ENDOFONON"/* 1D07B */,/*42489*/"BYZANTINE MUSICAL SYMBOL YFEN KATO"/* 1D07C */, /*42490*/"BYZANTINE MUSICAL SYMBOL YFEN ANO"/* 1D07D */,/*42491*/"BYZANTINE MUSICAL SYMBOL STAVROS"/* 1D07E */, /*42492*/"BYZANTINE MUSICAL SYMBOL KLASMA ANO"/* 1D07F */,/*42493*/"BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION"/* 1D080 */, /*42494*/"BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION"/* 1D081 */, /*42495*/"BYZANTINE MUSICAL SYMBOL KRATIMA ALLO"/* 1D082 */,/*42496*/"BYZANTINE MUSICAL SYMBOL KRATIMA NEO"/* 1D083 */, /*42497*/"BYZANTINE MUSICAL SYMBOL APODERMA NEO"/* 1D084 */,/*42498*/"BYZANTINE MUSICAL SYMBOL APLI"/* 1D085 */, /*42499*/"BYZANTINE MUSICAL SYMBOL DIPLI"/* 1D086 */,/*42500*/"BYZANTINE MUSICAL SYMBOL TRIPLI"/* 1D087 */, /*42501*/"BYZANTINE MUSICAL SYMBOL TETRAPLI"/* 1D088 */,/*42502*/"BYZANTINE MUSICAL SYMBOL KORONIS"/* 1D089 */, /*42503*/"BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU"/* 1D08A */, /*42504*/"BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON"/* 1D08B */, /*42505*/"BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON"/* 1D08C */, /*42506*/"BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON"/* 1D08D */, /*42507*/"BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU"/* 1D08E */, /*42508*/"BYZANTINE MUSICAL SYMBOL GORGON NEO ANO"/* 1D08F */, /*42509*/"BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA"/* 1D090 */, /*42510*/"BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA"/* 1D091 */, /*42511*/"BYZANTINE MUSICAL SYMBOL DIGORGON"/* 1D092 */, /*42512*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO"/* 1D093 */, /*42513*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO"/* 1D094 */, /*42514*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA"/* 1D095 */, /*42515*/"BYZANTINE MUSICAL SYMBOL TRIGORGON"/* 1D096 */,/*42516*/"BYZANTINE MUSICAL SYMBOL ARGON"/* 1D097 */, /*42517*/"BYZANTINE MUSICAL SYMBOL IMIDIARGON"/* 1D098 */,/*42518*/"BYZANTINE MUSICAL SYMBOL DIARGON"/* 1D099 */, /*42519*/"BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI"/* 1D09A */, /*42520*/"BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI"/* 1D09B */,/*42521*/"BYZANTINE MUSICAL SYMBOL AGOGI ARGI"/* 1D09C */, /*42522*/"BYZANTINE MUSICAL SYMBOL AGOGI METRIA"/* 1D09D */,/*42523*/"BYZANTINE MUSICAL SYMBOL AGOGI MESI"/* 1D09E */, /*42524*/"BYZANTINE MUSICAL SYMBOL AGOGI GORGI"/* 1D09F */, /*42525*/"BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI"/* 1D0A0 */, /*42526*/"BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI"/* 1D0A1 */, /*42527*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS"/* 1D0A2 */, /*42528*/"BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS"/* 1D0A3 */, /*42529*/"BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS"/* 1D0A4 */, /*42530*/"BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS"/* 1D0A5 */, /*42531*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS"/* 1D0A6 */, /*42532*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS"/* 1D0A7 */, /*42533*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS"/* 1D0A8 */, /*42534*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS"/* 1D0A9 */, /*42535*/"BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS"/* 1D0AA */, /*42536*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS"/* 1D0AB */, /*42537*/"BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS"/* 1D0AC */, /*42538*/"BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS"/* 1D0AD */, /*42539*/"BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS"/* 1D0AE */, /*42540*/"BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS"/* 1D0AF */, /*42541*/"BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS"/* 1D0B0 */, /*42542*/"BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS"/* 1D0B1 */, /*42543*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS"/* 1D0B2 */, /*42544*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS"/* 1D0B3 */, /*42545*/"BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN"/* 1D0B4 */, /*42546*/"BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN"/* 1D0B5 */, /*42547*/"BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU"/* 1D0B6 */, /*42548*/"BYZANTINE MUSICAL SYMBOL IMIFONON"/* 1D0B7 */,/*42549*/"BYZANTINE MUSICAL SYMBOL IMIFTHORON"/* 1D0B8 */, /*42550*/"BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU"/* 1D0B9 */, /*42551*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA"/* 1D0BA */, /*42552*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA"/* 1D0BB */, /*42553*/"BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS"/* 1D0BC */, /*42554*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI"/* 1D0BD */, /*42555*/"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI"/* 1D0BE */, /*42556*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE"/* 1D0BF */, /*42557*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO"/* 1D0C0 */, /*42558*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO"/* 1D0C1 */, /*42559*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO"/* 1D0C2 */, /*42560*/"BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS"/* 1D0C3 */, /*42561*/"BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS"/* 1D0C4 */, /*42562*/"BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS"/* 1D0C5 */, /*42563*/"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI"/* 1D0C6 */, /*42564*/"BYZANTINE MUSICAL SYMBOL FTHORA NENANO"/* 1D0C7 */,/*42565*/"BYZANTINE MUSICAL SYMBOL CHROA ZYGOS"/* 1D0C8 */, /*42566*/"BYZANTINE MUSICAL SYMBOL CHROA KLITON"/* 1D0C9 */,/*42567*/"BYZANTINE MUSICAL SYMBOL CHROA SPATHI"/* 1D0CA */, /*42568*/"BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION"/* 1D0CB */, /*42569*/"BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA"/* 1D0CC */, /*42570*/"BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION"/* 1D0CD */, /*42571*/"BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION"/* 1D0CE */, /*42572*/"BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION"/* 1D0CF */, /*42573*/"BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA"/* 1D0D0 */, /*42574*/"BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA"/* 1D0D1 */, /*42575*/"BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA"/* 1D0D2 */, /*42576*/"BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA"/* 1D0D3 */, /*42577*/"BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA"/* 1D0D4 */, /*42578*/"BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA"/* 1D0D5 */, /*42579*/"BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA"/* 1D0D6 */, /*42580*/"BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA"/* 1D0D7 */, /*42581*/"BYZANTINE MUSICAL SYMBOL GENIKI DIESIS"/* 1D0D8 */, /*42582*/"BYZANTINE MUSICAL SYMBOL GENIKI YFESIS"/* 1D0D9 */, /*42583*/"BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI"/* 1D0DA */, /*42584*/"BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI"/* 1D0DB */, /*42585*/"BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI"/* 1D0DC */, /*42586*/"BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS"/* 1D0DD */, /*42587*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS"/* 1D0DE */, /*42588*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU"/* 1D0DF */, /*42589*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU"/* 1D0E0 */, /*42590*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU"/* 1D0E1 */, /*42591*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS"/* 1D0E2 */, /*42592*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU"/* 1D0E3 */, /*42593*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU"/* 1D0E4 */, /*42594*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU"/* 1D0E5 */, /*42595*/"BYZANTINE MUSICAL SYMBOL DIGRAMMA GG"/* 1D0E6 */,/*42596*/"BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU"/* 1D0E7 */, /*42597*/"BYZANTINE MUSICAL SYMBOL STIGMA"/* 1D0E8 */,/*42598*/"BYZANTINE MUSICAL SYMBOL ARKTIKO PA"/* 1D0E9 */, /*42599*/"BYZANTINE MUSICAL SYMBOL ARKTIKO VOU"/* 1D0EA */,/*42600*/"BYZANTINE MUSICAL SYMBOL ARKTIKO GA"/* 1D0EB */, /*42601*/"BYZANTINE MUSICAL SYMBOL ARKTIKO DI"/* 1D0EC */,/*42602*/"BYZANTINE MUSICAL SYMBOL ARKTIKO KE"/* 1D0ED */, /*42603*/"BYZANTINE MUSICAL SYMBOL ARKTIKO ZO"/* 1D0EE */,/*42604*/"BYZANTINE MUSICAL SYMBOL ARKTIKO NI"/* 1D0EF */, /*42605*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO"/* 1D0F0 */, /*42606*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO"/* 1D0F1 */, /*42607*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO"/* 1D0F2 */, /*42608*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO"/* 1D0F3 */, /*42609*/"BYZANTINE MUSICAL SYMBOL KLASMA KATO"/* 1D0F4 */, /*42610*/"BYZANTINE MUSICAL SYMBOL GORGON NEO KATO"/* 1D0F5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*42621*/"MUSICAL SYMBOL SINGLE BARLINE"/* 1D100 */,/*42622*/"MUSICAL SYMBOL DOUBLE BARLINE"/* 1D101 */, /*42623*/"MUSICAL SYMBOL FINAL BARLINE"/* 1D102 */,/*42624*/"MUSICAL SYMBOL REVERSE FINAL BARLINE"/* 1D103 */, /*42625*/"MUSICAL SYMBOL DASHED BARLINE"/* 1D104 */,/*42626*/"MUSICAL SYMBOL SHORT BARLINE"/* 1D105 */, /*42627*/"MUSICAL SYMBOL LEFT REPEAT SIGN"/* 1D106 */,/*42628*/"MUSICAL SYMBOL RIGHT REPEAT SIGN"/* 1D107 */, /*42629*/"MUSICAL SYMBOL REPEAT DOTS"/* 1D108 */,/*42630*/"MUSICAL SYMBOL DAL SEGNO"/* 1D109 */, /*42631*/"MUSICAL SYMBOL DA CAPO"/* 1D10A */,/*42632*/"MUSICAL SYMBOL SEGNO"/* 1D10B */, /*42633*/"MUSICAL SYMBOL CODA"/* 1D10C */,/*42634*/"MUSICAL SYMBOL REPEATED FIGURE-1"/* 1D10D */, /*42635*/"MUSICAL SYMBOL REPEATED FIGURE-2"/* 1D10E */,/*42636*/"MUSICAL SYMBOL REPEATED FIGURE-3"/* 1D10F */, /*42637*/"MUSICAL SYMBOL FERMATA"/* 1D110 */,/*42638*/"MUSICAL SYMBOL FERMATA BELOW"/* 1D111 */, /*42639*/"MUSICAL SYMBOL BREATH MARK"/* 1D112 */,/*42640*/"MUSICAL SYMBOL CAESURA"/* 1D113 */, /*42641*/"MUSICAL SYMBOL BRACE"/* 1D114 */,/*42642*/"MUSICAL SYMBOL BRACKET"/* 1D115 */, /*42643*/"MUSICAL SYMBOL ONE-LINE STAFF"/* 1D116 */,/*42644*/"MUSICAL SYMBOL TWO-LINE STAFF"/* 1D117 */, /*42645*/"MUSICAL SYMBOL THREE-LINE STAFF"/* 1D118 */,/*42646*/"MUSICAL SYMBOL FOUR-LINE STAFF"/* 1D119 */, /*42647*/"MUSICAL SYMBOL FIVE-LINE STAFF"/* 1D11A */,/*42648*/"MUSICAL SYMBOL SIX-LINE STAFF"/* 1D11B */, /*42649*/"MUSICAL SYMBOL SIX-STRING FRETBOARD"/* 1D11C */,/*42650*/"MUSICAL SYMBOL FOUR-STRING FRETBOARD"/* 1D11D */, /*42651*/"MUSICAL SYMBOL G CLEF"/* 1D11E */,/*42652*/"MUSICAL SYMBOL G CLEF OTTAVA ALTA"/* 1D11F */, /*42653*/"MUSICAL SYMBOL G CLEF OTTAVA BASSA"/* 1D120 */,/*42654*/"MUSICAL SYMBOL C CLEF"/* 1D121 */, /*42655*/"MUSICAL SYMBOL F CLEF"/* 1D122 */,/*42656*/"MUSICAL SYMBOL F CLEF OTTAVA ALTA"/* 1D123 */, /*42657*/"MUSICAL SYMBOL F CLEF OTTAVA BASSA"/* 1D124 */,/*42658*/"MUSICAL SYMBOL DRUM CLEF-1"/* 1D125 */, /*42659*/"MUSICAL SYMBOL DRUM CLEF-2"/* 1D126 */,NULL,NULL,/*42662*/"MUSICAL SYMBOL MULTIPLE MEASURE REST"/* 1D129 */, /*42663*/"MUSICAL SYMBOL DOUBLE SHARP"/* 1D12A */,/*42664*/"MUSICAL SYMBOL DOUBLE FLAT"/* 1D12B */, /*42665*/"MUSICAL SYMBOL FLAT UP"/* 1D12C */,/*42666*/"MUSICAL SYMBOL FLAT DOWN"/* 1D12D */, /*42667*/"MUSICAL SYMBOL NATURAL UP"/* 1D12E */,/*42668*/"MUSICAL SYMBOL NATURAL DOWN"/* 1D12F */, /*42669*/"MUSICAL SYMBOL SHARP UP"/* 1D130 */,/*42670*/"MUSICAL SYMBOL SHARP DOWN"/* 1D131 */, /*42671*/"MUSICAL SYMBOL QUARTER TONE SHARP"/* 1D132 */,/*42672*/"MUSICAL SYMBOL QUARTER TONE FLAT"/* 1D133 */, /*42673*/"MUSICAL SYMBOL COMMON TIME"/* 1D134 */,/*42674*/"MUSICAL SYMBOL CUT TIME"/* 1D135 */, /*42675*/"MUSICAL SYMBOL OTTAVA ALTA"/* 1D136 */,/*42676*/"MUSICAL SYMBOL OTTAVA BASSA"/* 1D137 */, /*42677*/"MUSICAL SYMBOL QUINDICESIMA ALTA"/* 1D138 */,/*42678*/"MUSICAL SYMBOL QUINDICESIMA BASSA"/* 1D139 */, /*42679*/"MUSICAL SYMBOL MULTI REST"/* 1D13A */,/*42680*/"MUSICAL SYMBOL WHOLE REST"/* 1D13B */, /*42681*/"MUSICAL SYMBOL HALF REST"/* 1D13C */,/*42682*/"MUSICAL SYMBOL QUARTER REST"/* 1D13D */, /*42683*/"MUSICAL SYMBOL EIGHTH REST"/* 1D13E */,/*42684*/"MUSICAL SYMBOL SIXTEENTH REST"/* 1D13F */, /*42685*/"MUSICAL SYMBOL THIRTY-SECOND REST"/* 1D140 */,/*42686*/"MUSICAL SYMBOL SIXTY-FOURTH REST"/* 1D141 */, /*42687*/"MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST"/* 1D142 */,/*42688*/"MUSICAL SYMBOL X NOTEHEAD"/* 1D143 */, /*42689*/"MUSICAL SYMBOL PLUS NOTEHEAD"/* 1D144 */,/*42690*/"MUSICAL SYMBOL CIRCLE X NOTEHEAD"/* 1D145 */, /*42691*/"MUSICAL SYMBOL SQUARE NOTEHEAD WHITE"/* 1D146 */,/*42692*/"MUSICAL SYMBOL SQUARE NOTEHEAD BLACK"/* 1D147 */, /*42693*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE"/* 1D148 */, /*42694*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK"/* 1D149 */, /*42695*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE"/* 1D14A */, /*42696*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK"/* 1D14B */, /*42697*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE"/* 1D14C */, /*42698*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK"/* 1D14D */, /*42699*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE"/* 1D14E */, /*42700*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK"/* 1D14F */, /*42701*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE"/* 1D150 */, /*42702*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK"/* 1D151 */, /*42703*/"MUSICAL SYMBOL MOON NOTEHEAD WHITE"/* 1D152 */,/*42704*/"MUSICAL SYMBOL MOON NOTEHEAD BLACK"/* 1D153 */, /*42705*/"MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE"/* 1D154 */, /*42706*/"MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK"/* 1D155 */, /*42707*/"MUSICAL SYMBOL PARENTHESIS NOTEHEAD"/* 1D156 */,/*42708*/"MUSICAL SYMBOL VOID NOTEHEAD"/* 1D157 */, /*42709*/"MUSICAL SYMBOL NOTEHEAD BLACK"/* 1D158 */,/*42710*/"MUSICAL SYMBOL NULL NOTEHEAD"/* 1D159 */, /*42711*/"MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE"/* 1D15A */,/*42712*/"MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK"/* 1D15B */, /*42713*/"MUSICAL SYMBOL BREVE"/* 1D15C */,/*42714*/"MUSICAL SYMBOL WHOLE NOTE"/* 1D15D */, /*42715*/"MUSICAL SYMBOL HALF NOTE"/* 1D15E */,/*42716*/"MUSICAL SYMBOL QUARTER NOTE"/* 1D15F */, /*42717*/"MUSICAL SYMBOL EIGHTH NOTE"/* 1D160 */,/*42718*/"MUSICAL SYMBOL SIXTEENTH NOTE"/* 1D161 */, /*42719*/"MUSICAL SYMBOL THIRTY-SECOND NOTE"/* 1D162 */,/*42720*/"MUSICAL SYMBOL SIXTY-FOURTH NOTE"/* 1D163 */, /*42721*/"MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE"/* 1D164 */,/*42722*/"MUSICAL SYMBOL COMBINING STEM"/* 1D165 */, /*42723*/"MUSICAL SYMBOL COMBINING SPRECHGESANG STEM"/* 1D166 */, /*42724*/"MUSICAL SYMBOL COMBINING TREMOLO-1"/* 1D167 */,/*42725*/"MUSICAL SYMBOL COMBINING TREMOLO-2"/* 1D168 */, /*42726*/"MUSICAL SYMBOL COMBINING TREMOLO-3"/* 1D169 */,/*42727*/"MUSICAL SYMBOL FINGERED TREMOLO-1"/* 1D16A */, /*42728*/"MUSICAL SYMBOL FINGERED TREMOLO-2"/* 1D16B */,/*42729*/"MUSICAL SYMBOL FINGERED TREMOLO-3"/* 1D16C */, /*42730*/"MUSICAL SYMBOL COMBINING AUGMENTATION DOT"/* 1D16D */,/*42731*/"MUSICAL SYMBOL COMBINING FLAG-1"/* 1D16E */, /*42732*/"MUSICAL SYMBOL COMBINING FLAG-2"/* 1D16F */,/*42733*/"MUSICAL SYMBOL COMBINING FLAG-3"/* 1D170 */, /*42734*/"MUSICAL SYMBOL COMBINING FLAG-4"/* 1D171 */,/*42735*/"MUSICAL SYMBOL COMBINING FLAG-5"/* 1D172 */, /*42736*/"MUSICAL SYMBOL BEGIN BEAM"/* 1D173 */,/*42737*/"MUSICAL SYMBOL END BEAM"/* 1D174 */, /*42738*/"MUSICAL SYMBOL BEGIN TIE"/* 1D175 */,/*42739*/"MUSICAL SYMBOL END TIE"/* 1D176 */, /*42740*/"MUSICAL SYMBOL BEGIN SLUR"/* 1D177 */,/*42741*/"MUSICAL SYMBOL END SLUR"/* 1D178 */, /*42742*/"MUSICAL SYMBOL BEGIN PHRASE"/* 1D179 */,/*42743*/"MUSICAL SYMBOL END PHRASE"/* 1D17A */, /*42744*/"MUSICAL SYMBOL COMBINING ACCENT"/* 1D17B */,/*42745*/"MUSICAL SYMBOL COMBINING STACCATO"/* 1D17C */, /*42746*/"MUSICAL SYMBOL COMBINING TENUTO"/* 1D17D */,/*42747*/"MUSICAL SYMBOL COMBINING STACCATISSIMO"/* 1D17E */, /*42748*/"MUSICAL SYMBOL COMBINING MARCATO"/* 1D17F */,/*42749*/"MUSICAL SYMBOL COMBINING MARCATO-STACCATO"/* 1D180 */, /*42750*/"MUSICAL SYMBOL COMBINING ACCENT-STACCATO"/* 1D181 */,/*42751*/"MUSICAL SYMBOL COMBINING LOURE"/* 1D182 */, /*42752*/"MUSICAL SYMBOL ARPEGGIATO UP"/* 1D183 */,/*42753*/"MUSICAL SYMBOL ARPEGGIATO DOWN"/* 1D184 */, /*42754*/"MUSICAL SYMBOL COMBINING DOIT"/* 1D185 */,/*42755*/"MUSICAL SYMBOL COMBINING RIP"/* 1D186 */, /*42756*/"MUSICAL SYMBOL COMBINING FLIP"/* 1D187 */,/*42757*/"MUSICAL SYMBOL COMBINING SMEAR"/* 1D188 */, /*42758*/"MUSICAL SYMBOL COMBINING BEND"/* 1D189 */,/*42759*/"MUSICAL SYMBOL COMBINING DOUBLE TONGUE"/* 1D18A */, /*42760*/"MUSICAL SYMBOL COMBINING TRIPLE TONGUE"/* 1D18B */,/*42761*/"MUSICAL SYMBOL RINFORZANDO"/* 1D18C */, /*42762*/"MUSICAL SYMBOL SUBITO"/* 1D18D */,/*42763*/"MUSICAL SYMBOL Z"/* 1D18E */, /*42764*/"MUSICAL SYMBOL PIANO"/* 1D18F */,/*42765*/"MUSICAL SYMBOL MEZZO"/* 1D190 */, /*42766*/"MUSICAL SYMBOL FORTE"/* 1D191 */,/*42767*/"MUSICAL SYMBOL CRESCENDO"/* 1D192 */, /*42768*/"MUSICAL SYMBOL DECRESCENDO"/* 1D193 */,/*42769*/"MUSICAL SYMBOL GRACE NOTE SLASH"/* 1D194 */, /*42770*/"MUSICAL SYMBOL GRACE NOTE NO SLASH"/* 1D195 */,/*42771*/"MUSICAL SYMBOL TR"/* 1D196 */, /*42772*/"MUSICAL SYMBOL TURN"/* 1D197 */,/*42773*/"MUSICAL SYMBOL INVERTED TURN"/* 1D198 */, /*42774*/"MUSICAL SYMBOL TURN SLASH"/* 1D199 */,/*42775*/"MUSICAL SYMBOL TURN UP"/* 1D19A */, /*42776*/"MUSICAL SYMBOL ORNAMENT STROKE-1"/* 1D19B */,/*42777*/"MUSICAL SYMBOL ORNAMENT STROKE-2"/* 1D19C */, /*42778*/"MUSICAL SYMBOL ORNAMENT STROKE-3"/* 1D19D */,/*42779*/"MUSICAL SYMBOL ORNAMENT STROKE-4"/* 1D19E */, /*42780*/"MUSICAL SYMBOL ORNAMENT STROKE-5"/* 1D19F */,/*42781*/"MUSICAL SYMBOL ORNAMENT STROKE-6"/* 1D1A0 */, /*42782*/"MUSICAL SYMBOL ORNAMENT STROKE-7"/* 1D1A1 */,/*42783*/"MUSICAL SYMBOL ORNAMENT STROKE-8"/* 1D1A2 */, /*42784*/"MUSICAL SYMBOL ORNAMENT STROKE-9"/* 1D1A3 */,/*42785*/"MUSICAL SYMBOL ORNAMENT STROKE-10"/* 1D1A4 */, /*42786*/"MUSICAL SYMBOL ORNAMENT STROKE-11"/* 1D1A5 */,/*42787*/"MUSICAL SYMBOL HAUPTSTIMME"/* 1D1A6 */, /*42788*/"MUSICAL SYMBOL NEBENSTIMME"/* 1D1A7 */,/*42789*/"MUSICAL SYMBOL END OF STIMME"/* 1D1A8 */, /*42790*/"MUSICAL SYMBOL DEGREE SLASH"/* 1D1A9 */,/*42791*/"MUSICAL SYMBOL COMBINING DOWN BOW"/* 1D1AA */, /*42792*/"MUSICAL SYMBOL COMBINING UP BOW"/* 1D1AB */,/*42793*/"MUSICAL SYMBOL COMBINING HARMONIC"/* 1D1AC */, /*42794*/"MUSICAL SYMBOL COMBINING SNAP PIZZICATO"/* 1D1AD */,/*42795*/"MUSICAL SYMBOL PEDAL MARK"/* 1D1AE */, /*42796*/"MUSICAL SYMBOL PEDAL UP MARK"/* 1D1AF */,/*42797*/"MUSICAL SYMBOL HALF PEDAL MARK"/* 1D1B0 */, /*42798*/"MUSICAL SYMBOL GLISSANDO UP"/* 1D1B1 */,/*42799*/"MUSICAL SYMBOL GLISSANDO DOWN"/* 1D1B2 */, /*42800*/"MUSICAL SYMBOL WITH FINGERNAILS"/* 1D1B3 */,/*42801*/"MUSICAL SYMBOL DAMP"/* 1D1B4 */, /*42802*/"MUSICAL SYMBOL DAMP ALL"/* 1D1B5 */,/*42803*/"MUSICAL SYMBOL MAXIMA"/* 1D1B6 */, /*42804*/"MUSICAL SYMBOL LONGA"/* 1D1B7 */,/*42805*/"MUSICAL SYMBOL BREVIS"/* 1D1B8 */, /*42806*/"MUSICAL SYMBOL SEMIBREVIS WHITE"/* 1D1B9 */,/*42807*/"MUSICAL SYMBOL SEMIBREVIS BLACK"/* 1D1BA */, /*42808*/"MUSICAL SYMBOL MINIMA"/* 1D1BB */,/*42809*/"MUSICAL SYMBOL MINIMA BLACK"/* 1D1BC */, /*42810*/"MUSICAL SYMBOL SEMIMINIMA WHITE"/* 1D1BD */,/*42811*/"MUSICAL SYMBOL SEMIMINIMA BLACK"/* 1D1BE */, /*42812*/"MUSICAL SYMBOL FUSA WHITE"/* 1D1BF */,/*42813*/"MUSICAL SYMBOL FUSA BLACK"/* 1D1C0 */, /*42814*/"MUSICAL SYMBOL LONGA PERFECTA REST"/* 1D1C1 */,/*42815*/"MUSICAL SYMBOL LONGA IMPERFECTA REST"/* 1D1C2 */, /*42816*/"MUSICAL SYMBOL BREVIS REST"/* 1D1C3 */,/*42817*/"MUSICAL SYMBOL SEMIBREVIS REST"/* 1D1C4 */, /*42818*/"MUSICAL SYMBOL MINIMA REST"/* 1D1C5 */,/*42819*/"MUSICAL SYMBOL SEMIMINIMA REST"/* 1D1C6 */, /*42820*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA"/* 1D1C7 */, /*42821*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA"/* 1D1C8 */, /*42822*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1"/* 1D1C9 */, /*42823*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA"/* 1D1CA */, /*42824*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA"/* 1D1CB */, /*42825*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1"/* 1D1CC */, /*42826*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2"/* 1D1CD */, /*42827*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3"/* 1D1CE */, /*42828*/"MUSICAL SYMBOL CROIX"/* 1D1CF */,/*42829*/"MUSICAL SYMBOL GREGORIAN C CLEF"/* 1D1D0 */, /*42830*/"MUSICAL SYMBOL GREGORIAN F CLEF"/* 1D1D1 */,/*42831*/"MUSICAL SYMBOL SQUARE B"/* 1D1D2 */, /*42832*/"MUSICAL SYMBOL VIRGA"/* 1D1D3 */,/*42833*/"MUSICAL SYMBOL PODATUS"/* 1D1D4 */, /*42834*/"MUSICAL SYMBOL CLIVIS"/* 1D1D5 */,/*42835*/"MUSICAL SYMBOL SCANDICUS"/* 1D1D6 */, /*42836*/"MUSICAL SYMBOL CLIMACUS"/* 1D1D7 */,/*42837*/"MUSICAL SYMBOL TORCULUS"/* 1D1D8 */, /*42838*/"MUSICAL SYMBOL PORRECTUS"/* 1D1D9 */,/*42839*/"MUSICAL SYMBOL PORRECTUS FLEXUS"/* 1D1DA */, /*42840*/"MUSICAL SYMBOL SCANDICUS FLEXUS"/* 1D1DB */,/*42841*/"MUSICAL SYMBOL TORCULUS RESUPINUS"/* 1D1DC */, /*42842*/"MUSICAL SYMBOL PES SUBPUNCTIS"/* 1D1DD */,/*42843*/"MUSICAL SYMBOL KIEVAN C CLEF"/* 1D1DE */, /*42844*/"MUSICAL SYMBOL KIEVAN END OF PIECE"/* 1D1DF */,/*42845*/"MUSICAL SYMBOL KIEVAN FINAL NOTE"/* 1D1E0 */, /*42846*/"MUSICAL SYMBOL KIEVAN RECITATIVE MARK"/* 1D1E1 */,/*42847*/"MUSICAL SYMBOL KIEVAN WHOLE NOTE"/* 1D1E2 */, /*42848*/"MUSICAL SYMBOL KIEVAN HALF NOTE"/* 1D1E3 */,/*42849*/"MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN"/* 1D1E4 */, /*42850*/"MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP"/* 1D1E5 */, /*42851*/"MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN"/* 1D1E6 */, /*42852*/"MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP"/* 1D1E7 */,/*42853*/"MUSICAL SYMBOL KIEVAN FLAT SIGN"/* 1D1E8 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*42877*/"GREEK VOCAL NOTATION SYMBOL-1"/* 1D200 */,/*42878*/"GREEK VOCAL NOTATION SYMBOL-2"/* 1D201 */, /*42879*/"GREEK VOCAL NOTATION SYMBOL-3"/* 1D202 */,/*42880*/"GREEK VOCAL NOTATION SYMBOL-4"/* 1D203 */, /*42881*/"GREEK VOCAL NOTATION SYMBOL-5"/* 1D204 */,/*42882*/"GREEK VOCAL NOTATION SYMBOL-6"/* 1D205 */, /*42883*/"GREEK VOCAL NOTATION SYMBOL-7"/* 1D206 */,/*42884*/"GREEK VOCAL NOTATION SYMBOL-8"/* 1D207 */, /*42885*/"GREEK VOCAL NOTATION SYMBOL-9"/* 1D208 */,/*42886*/"GREEK VOCAL NOTATION SYMBOL-10"/* 1D209 */, /*42887*/"GREEK VOCAL NOTATION SYMBOL-11"/* 1D20A */,/*42888*/"GREEK VOCAL NOTATION SYMBOL-12"/* 1D20B */, /*42889*/"GREEK VOCAL NOTATION SYMBOL-13"/* 1D20C */,/*42890*/"GREEK VOCAL NOTATION SYMBOL-14"/* 1D20D */, /*42891*/"GREEK VOCAL NOTATION SYMBOL-15"/* 1D20E */,/*42892*/"GREEK VOCAL NOTATION SYMBOL-16"/* 1D20F */, /*42893*/"GREEK VOCAL NOTATION SYMBOL-17"/* 1D210 */,/*42894*/"GREEK VOCAL NOTATION SYMBOL-18"/* 1D211 */, /*42895*/"GREEK VOCAL NOTATION SYMBOL-19"/* 1D212 */,/*42896*/"GREEK VOCAL NOTATION SYMBOL-20"/* 1D213 */, /*42897*/"GREEK VOCAL NOTATION SYMBOL-21"/* 1D214 */,/*42898*/"GREEK VOCAL NOTATION SYMBOL-22"/* 1D215 */, /*42899*/"GREEK VOCAL NOTATION SYMBOL-23"/* 1D216 */,/*42900*/"GREEK VOCAL NOTATION SYMBOL-24"/* 1D217 */, /*42901*/"GREEK VOCAL NOTATION SYMBOL-50"/* 1D218 */,/*42902*/"GREEK VOCAL NOTATION SYMBOL-51"/* 1D219 */, /*42903*/"GREEK VOCAL NOTATION SYMBOL-52"/* 1D21A */,/*42904*/"GREEK VOCAL NOTATION SYMBOL-53"/* 1D21B */, /*42905*/"GREEK VOCAL NOTATION SYMBOL-54"/* 1D21C */,/*42906*/"GREEK INSTRUMENTAL NOTATION SYMBOL-1"/* 1D21D */, /*42907*/"GREEK INSTRUMENTAL NOTATION SYMBOL-2"/* 1D21E */,/*42908*/"GREEK INSTRUMENTAL NOTATION SYMBOL-4"/* 1D21F */, /*42909*/"GREEK INSTRUMENTAL NOTATION SYMBOL-5"/* 1D220 */,/*42910*/"GREEK INSTRUMENTAL NOTATION SYMBOL-7"/* 1D221 */, /*42911*/"GREEK INSTRUMENTAL NOTATION SYMBOL-8"/* 1D222 */,/*42912*/"GREEK INSTRUMENTAL NOTATION SYMBOL-11"/* 1D223 */, /*42913*/"GREEK INSTRUMENTAL NOTATION SYMBOL-12"/* 1D224 */,/*42914*/"GREEK INSTRUMENTAL NOTATION SYMBOL-13"/* 1D225 */, /*42915*/"GREEK INSTRUMENTAL NOTATION SYMBOL-14"/* 1D226 */,/*42916*/"GREEK INSTRUMENTAL NOTATION SYMBOL-17"/* 1D227 */, /*42917*/"GREEK INSTRUMENTAL NOTATION SYMBOL-18"/* 1D228 */,/*42918*/"GREEK INSTRUMENTAL NOTATION SYMBOL-19"/* 1D229 */, /*42919*/"GREEK INSTRUMENTAL NOTATION SYMBOL-23"/* 1D22A */,/*42920*/"GREEK INSTRUMENTAL NOTATION SYMBOL-24"/* 1D22B */, /*42921*/"GREEK INSTRUMENTAL NOTATION SYMBOL-25"/* 1D22C */,/*42922*/"GREEK INSTRUMENTAL NOTATION SYMBOL-26"/* 1D22D */, /*42923*/"GREEK INSTRUMENTAL NOTATION SYMBOL-27"/* 1D22E */,/*42924*/"GREEK INSTRUMENTAL NOTATION SYMBOL-29"/* 1D22F */, /*42925*/"GREEK INSTRUMENTAL NOTATION SYMBOL-30"/* 1D230 */,/*42926*/"GREEK INSTRUMENTAL NOTATION SYMBOL-32"/* 1D231 */, /*42927*/"GREEK INSTRUMENTAL NOTATION SYMBOL-36"/* 1D232 */,/*42928*/"GREEK INSTRUMENTAL NOTATION SYMBOL-37"/* 1D233 */, /*42929*/"GREEK INSTRUMENTAL NOTATION SYMBOL-38"/* 1D234 */,/*42930*/"GREEK INSTRUMENTAL NOTATION SYMBOL-39"/* 1D235 */, /*42931*/"GREEK INSTRUMENTAL NOTATION SYMBOL-40"/* 1D236 */,/*42932*/"GREEK INSTRUMENTAL NOTATION SYMBOL-42"/* 1D237 */, /*42933*/"GREEK INSTRUMENTAL NOTATION SYMBOL-43"/* 1D238 */,/*42934*/"GREEK INSTRUMENTAL NOTATION SYMBOL-45"/* 1D239 */, /*42935*/"GREEK INSTRUMENTAL NOTATION SYMBOL-47"/* 1D23A */,/*42936*/"GREEK INSTRUMENTAL NOTATION SYMBOL-48"/* 1D23B */, /*42937*/"GREEK INSTRUMENTAL NOTATION SYMBOL-49"/* 1D23C */,/*42938*/"GREEK INSTRUMENTAL NOTATION SYMBOL-50"/* 1D23D */, /*42939*/"GREEK INSTRUMENTAL NOTATION SYMBOL-51"/* 1D23E */,/*42940*/"GREEK INSTRUMENTAL NOTATION SYMBOL-52"/* 1D23F */, /*42941*/"GREEK INSTRUMENTAL NOTATION SYMBOL-53"/* 1D240 */,/*42942*/"GREEK INSTRUMENTAL NOTATION SYMBOL-54"/* 1D241 */, /*42943*/"COMBINING GREEK MUSICAL TRISEME"/* 1D242 */,/*42944*/"COMBINING GREEK MUSICAL TETRASEME"/* 1D243 */, /*42945*/"COMBINING GREEK MUSICAL PENTASEME"/* 1D244 */,/*42946*/"GREEK MUSICAL LEIMMA"/* 1D245 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*43133*/"MONOGRAM FOR EARTH"/* 1D300 */, /*43134*/"DIGRAM FOR HEAVENLY EARTH"/* 1D301 */,/*43135*/"DIGRAM FOR HUMAN EARTH"/* 1D302 */, /*43136*/"DIGRAM FOR EARTHLY HEAVEN"/* 1D303 */,/*43137*/"DIGRAM FOR EARTHLY HUMAN"/* 1D304 */, /*43138*/"DIGRAM FOR EARTH"/* 1D305 */,/*43139*/"TETRAGRAM FOR CENTRE"/* 1D306 */, /*43140*/"TETRAGRAM FOR FULL CIRCLE"/* 1D307 */,/*43141*/"TETRAGRAM FOR MIRED"/* 1D308 */, /*43142*/"TETRAGRAM FOR BARRIER"/* 1D309 */,/*43143*/"TETRAGRAM FOR KEEPING SMALL"/* 1D30A */, /*43144*/"TETRAGRAM FOR CONTRARIETY"/* 1D30B */,/*43145*/"TETRAGRAM FOR ASCENT"/* 1D30C */, /*43146*/"TETRAGRAM FOR OPPOSITION"/* 1D30D */,/*43147*/"TETRAGRAM FOR BRANCHING OUT"/* 1D30E */, /*43148*/"TETRAGRAM FOR DEFECTIVENESS OR DISTORTION"/* 1D30F */,/*43149*/"TETRAGRAM FOR DIVERGENCE"/* 1D310 */, /*43150*/"TETRAGRAM FOR YOUTHFULNESS"/* 1D311 */,/*43151*/"TETRAGRAM FOR INCREASE"/* 1D312 */, /*43152*/"TETRAGRAM FOR PENETRATION"/* 1D313 */,/*43153*/"TETRAGRAM FOR REACH"/* 1D314 */, /*43154*/"TETRAGRAM FOR CONTACT"/* 1D315 */,/*43155*/"TETRAGRAM FOR HOLDING BACK"/* 1D316 */, /*43156*/"TETRAGRAM FOR WAITING"/* 1D317 */,/*43157*/"TETRAGRAM FOR FOLLOWING"/* 1D318 */, /*43158*/"TETRAGRAM FOR ADVANCE"/* 1D319 */,/*43159*/"TETRAGRAM FOR RELEASE"/* 1D31A */, /*43160*/"TETRAGRAM FOR RESISTANCE"/* 1D31B */,/*43161*/"TETRAGRAM FOR EASE"/* 1D31C */, /*43162*/"TETRAGRAM FOR JOY"/* 1D31D */,/*43163*/"TETRAGRAM FOR CONTENTION"/* 1D31E */, /*43164*/"TETRAGRAM FOR ENDEAVOUR"/* 1D31F */,/*43165*/"TETRAGRAM FOR DUTIES"/* 1D320 */, /*43166*/"TETRAGRAM FOR CHANGE"/* 1D321 */,/*43167*/"TETRAGRAM FOR DECISIVENESS"/* 1D322 */, /*43168*/"TETRAGRAM FOR BOLD RESOLUTION"/* 1D323 */,/*43169*/"TETRAGRAM FOR PACKING"/* 1D324 */, /*43170*/"TETRAGRAM FOR LEGION"/* 1D325 */,/*43171*/"TETRAGRAM FOR CLOSENESS"/* 1D326 */, /*43172*/"TETRAGRAM FOR KINSHIP"/* 1D327 */,/*43173*/"TETRAGRAM FOR GATHERING"/* 1D328 */, /*43174*/"TETRAGRAM FOR STRENGTH"/* 1D329 */,/*43175*/"TETRAGRAM FOR PURITY"/* 1D32A */, /*43176*/"TETRAGRAM FOR FULLNESS"/* 1D32B */,/*43177*/"TETRAGRAM FOR RESIDENCE"/* 1D32C */, /*43178*/"TETRAGRAM FOR LAW OR MODEL"/* 1D32D */,/*43179*/"TETRAGRAM FOR RESPONSE"/* 1D32E */, /*43180*/"TETRAGRAM FOR GOING TO MEET"/* 1D32F */,/*43181*/"TETRAGRAM FOR ENCOUNTERS"/* 1D330 */, /*43182*/"TETRAGRAM FOR STOVE"/* 1D331 */,/*43183*/"TETRAGRAM FOR GREATNESS"/* 1D332 */, /*43184*/"TETRAGRAM FOR ENLARGEMENT"/* 1D333 */,/*43185*/"TETRAGRAM FOR PATTERN"/* 1D334 */, /*43186*/"TETRAGRAM FOR RITUAL"/* 1D335 */,/*43187*/"TETRAGRAM FOR FLIGHT"/* 1D336 */, /*43188*/"TETRAGRAM FOR VASTNESS OR WASTING"/* 1D337 */,/*43189*/"TETRAGRAM FOR CONSTANCY"/* 1D338 */, /*43190*/"TETRAGRAM FOR MEASURE"/* 1D339 */,/*43191*/"TETRAGRAM FOR ETERNITY"/* 1D33A */, /*43192*/"TETRAGRAM FOR UNITY"/* 1D33B */,/*43193*/"TETRAGRAM FOR DIMINISHMENT"/* 1D33C */, /*43194*/"TETRAGRAM FOR CLOSED MOUTH"/* 1D33D */,/*43195*/"TETRAGRAM FOR GUARDEDNESS"/* 1D33E */, /*43196*/"TETRAGRAM FOR GATHERING IN"/* 1D33F */,/*43197*/"TETRAGRAM FOR MASSING"/* 1D340 */, /*43198*/"TETRAGRAM FOR ACCUMULATION"/* 1D341 */,/*43199*/"TETRAGRAM FOR EMBELLISHMENT"/* 1D342 */, /*43200*/"TETRAGRAM FOR DOUBT"/* 1D343 */,/*43201*/"TETRAGRAM FOR WATCH"/* 1D344 */, /*43202*/"TETRAGRAM FOR SINKING"/* 1D345 */,/*43203*/"TETRAGRAM FOR INNER"/* 1D346 */, /*43204*/"TETRAGRAM FOR DEPARTURE"/* 1D347 */,/*43205*/"TETRAGRAM FOR DARKENING"/* 1D348 */, /*43206*/"TETRAGRAM FOR DIMMING"/* 1D349 */,/*43207*/"TETRAGRAM FOR EXHAUSTION"/* 1D34A */, /*43208*/"TETRAGRAM FOR SEVERANCE"/* 1D34B */,/*43209*/"TETRAGRAM FOR STOPPAGE"/* 1D34C */, /*43210*/"TETRAGRAM FOR HARDNESS"/* 1D34D */,/*43211*/"TETRAGRAM FOR COMPLETION"/* 1D34E */, /*43212*/"TETRAGRAM FOR CLOSURE"/* 1D34F */,/*43213*/"TETRAGRAM FOR FAILURE"/* 1D350 */, /*43214*/"TETRAGRAM FOR AGGRAVATION"/* 1D351 */,/*43215*/"TETRAGRAM FOR COMPLIANCE"/* 1D352 */, /*43216*/"TETRAGRAM FOR ON THE VERGE"/* 1D353 */,/*43217*/"TETRAGRAM FOR DIFFICULTIES"/* 1D354 */, /*43218*/"TETRAGRAM FOR LABOURING"/* 1D355 */,/*43219*/"TETRAGRAM FOR FOSTERING"/* 1D356 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*43229*/"COUNTING ROD UNIT DIGIT ONE"/* 1D360 */,/*43230*/"COUNTING ROD UNIT DIGIT TWO"/* 1D361 */, /*43231*/"COUNTING ROD UNIT DIGIT THREE"/* 1D362 */,/*43232*/"COUNTING ROD UNIT DIGIT FOUR"/* 1D363 */, /*43233*/"COUNTING ROD UNIT DIGIT FIVE"/* 1D364 */,/*43234*/"COUNTING ROD UNIT DIGIT SIX"/* 1D365 */, /*43235*/"COUNTING ROD UNIT DIGIT SEVEN"/* 1D366 */,/*43236*/"COUNTING ROD UNIT DIGIT EIGHT"/* 1D367 */, /*43237*/"COUNTING ROD UNIT DIGIT NINE"/* 1D368 */,/*43238*/"COUNTING ROD TENS DIGIT ONE"/* 1D369 */, /*43239*/"COUNTING ROD TENS DIGIT TWO"/* 1D36A */,/*43240*/"COUNTING ROD TENS DIGIT THREE"/* 1D36B */, /*43241*/"COUNTING ROD TENS DIGIT FOUR"/* 1D36C */,/*43242*/"COUNTING ROD TENS DIGIT FIVE"/* 1D36D */, /*43243*/"COUNTING ROD TENS DIGIT SIX"/* 1D36E */,/*43244*/"COUNTING ROD TENS DIGIT SEVEN"/* 1D36F */, /*43245*/"COUNTING ROD TENS DIGIT EIGHT"/* 1D370 */,/*43246*/"COUNTING ROD TENS DIGIT NINE"/* 1D371 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*43389*/"MATHEMATICAL BOLD CAPITAL A"/* 1D400 */,/*43390*/"MATHEMATICAL BOLD CAPITAL B"/* 1D401 */, /*43391*/"MATHEMATICAL BOLD CAPITAL C"/* 1D402 */,/*43392*/"MATHEMATICAL BOLD CAPITAL D"/* 1D403 */, /*43393*/"MATHEMATICAL BOLD CAPITAL E"/* 1D404 */,/*43394*/"MATHEMATICAL BOLD CAPITAL F"/* 1D405 */, /*43395*/"MATHEMATICAL BOLD CAPITAL G"/* 1D406 */,/*43396*/"MATHEMATICAL BOLD CAPITAL H"/* 1D407 */, /*43397*/"MATHEMATICAL BOLD CAPITAL I"/* 1D408 */,/*43398*/"MATHEMATICAL BOLD CAPITAL J"/* 1D409 */, /*43399*/"MATHEMATICAL BOLD CAPITAL K"/* 1D40A */,/*43400*/"MATHEMATICAL BOLD CAPITAL L"/* 1D40B */, /*43401*/"MATHEMATICAL BOLD CAPITAL M"/* 1D40C */,/*43402*/"MATHEMATICAL BOLD CAPITAL N"/* 1D40D */, /*43403*/"MATHEMATICAL BOLD CAPITAL O"/* 1D40E */,/*43404*/"MATHEMATICAL BOLD CAPITAL P"/* 1D40F */, /*43405*/"MATHEMATICAL BOLD CAPITAL Q"/* 1D410 */,/*43406*/"MATHEMATICAL BOLD CAPITAL R"/* 1D411 */, /*43407*/"MATHEMATICAL BOLD CAPITAL S"/* 1D412 */,/*43408*/"MATHEMATICAL BOLD CAPITAL T"/* 1D413 */, /*43409*/"MATHEMATICAL BOLD CAPITAL U"/* 1D414 */,/*43410*/"MATHEMATICAL BOLD CAPITAL V"/* 1D415 */, /*43411*/"MATHEMATICAL BOLD CAPITAL W"/* 1D416 */,/*43412*/"MATHEMATICAL BOLD CAPITAL X"/* 1D417 */, /*43413*/"MATHEMATICAL BOLD CAPITAL Y"/* 1D418 */,/*43414*/"MATHEMATICAL BOLD CAPITAL Z"/* 1D419 */, /*43415*/"MATHEMATICAL BOLD SMALL A"/* 1D41A */,/*43416*/"MATHEMATICAL BOLD SMALL B"/* 1D41B */, /*43417*/"MATHEMATICAL BOLD SMALL C"/* 1D41C */,/*43418*/"MATHEMATICAL BOLD SMALL D"/* 1D41D */, /*43419*/"MATHEMATICAL BOLD SMALL E"/* 1D41E */,/*43420*/"MATHEMATICAL BOLD SMALL F"/* 1D41F */, /*43421*/"MATHEMATICAL BOLD SMALL G"/* 1D420 */,/*43422*/"MATHEMATICAL BOLD SMALL H"/* 1D421 */, /*43423*/"MATHEMATICAL BOLD SMALL I"/* 1D422 */,/*43424*/"MATHEMATICAL BOLD SMALL J"/* 1D423 */, /*43425*/"MATHEMATICAL BOLD SMALL K"/* 1D424 */,/*43426*/"MATHEMATICAL BOLD SMALL L"/* 1D425 */, /*43427*/"MATHEMATICAL BOLD SMALL M"/* 1D426 */,/*43428*/"MATHEMATICAL BOLD SMALL N"/* 1D427 */, /*43429*/"MATHEMATICAL BOLD SMALL O"/* 1D428 */,/*43430*/"MATHEMATICAL BOLD SMALL P"/* 1D429 */, /*43431*/"MATHEMATICAL BOLD SMALL Q"/* 1D42A */,/*43432*/"MATHEMATICAL BOLD SMALL R"/* 1D42B */, /*43433*/"MATHEMATICAL BOLD SMALL S"/* 1D42C */,/*43434*/"MATHEMATICAL BOLD SMALL T"/* 1D42D */, /*43435*/"MATHEMATICAL BOLD SMALL U"/* 1D42E */,/*43436*/"MATHEMATICAL BOLD SMALL V"/* 1D42F */, /*43437*/"MATHEMATICAL BOLD SMALL W"/* 1D430 */,/*43438*/"MATHEMATICAL BOLD SMALL X"/* 1D431 */, /*43439*/"MATHEMATICAL BOLD SMALL Y"/* 1D432 */,/*43440*/"MATHEMATICAL BOLD SMALL Z"/* 1D433 */, /*43441*/"MATHEMATICAL ITALIC CAPITAL A"/* 1D434 */,/*43442*/"MATHEMATICAL ITALIC CAPITAL B"/* 1D435 */, /*43443*/"MATHEMATICAL ITALIC CAPITAL C"/* 1D436 */,/*43444*/"MATHEMATICAL ITALIC CAPITAL D"/* 1D437 */, /*43445*/"MATHEMATICAL ITALIC CAPITAL E"/* 1D438 */,/*43446*/"MATHEMATICAL ITALIC CAPITAL F"/* 1D439 */, /*43447*/"MATHEMATICAL ITALIC CAPITAL G"/* 1D43A */,/*43448*/"MATHEMATICAL ITALIC CAPITAL H"/* 1D43B */, /*43449*/"MATHEMATICAL ITALIC CAPITAL I"/* 1D43C */,/*43450*/"MATHEMATICAL ITALIC CAPITAL J"/* 1D43D */, /*43451*/"MATHEMATICAL ITALIC CAPITAL K"/* 1D43E */,/*43452*/"MATHEMATICAL ITALIC CAPITAL L"/* 1D43F */, /*43453*/"MATHEMATICAL ITALIC CAPITAL M"/* 1D440 */,/*43454*/"MATHEMATICAL ITALIC CAPITAL N"/* 1D441 */, /*43455*/"MATHEMATICAL ITALIC CAPITAL O"/* 1D442 */,/*43456*/"MATHEMATICAL ITALIC CAPITAL P"/* 1D443 */, /*43457*/"MATHEMATICAL ITALIC CAPITAL Q"/* 1D444 */,/*43458*/"MATHEMATICAL ITALIC CAPITAL R"/* 1D445 */, /*43459*/"MATHEMATICAL ITALIC CAPITAL S"/* 1D446 */,/*43460*/"MATHEMATICAL ITALIC CAPITAL T"/* 1D447 */, /*43461*/"MATHEMATICAL ITALIC CAPITAL U"/* 1D448 */,/*43462*/"MATHEMATICAL ITALIC CAPITAL V"/* 1D449 */, /*43463*/"MATHEMATICAL ITALIC CAPITAL W"/* 1D44A */,/*43464*/"MATHEMATICAL ITALIC CAPITAL X"/* 1D44B */, /*43465*/"MATHEMATICAL ITALIC CAPITAL Y"/* 1D44C */,/*43466*/"MATHEMATICAL ITALIC CAPITAL Z"/* 1D44D */, /*43467*/"MATHEMATICAL ITALIC SMALL A"/* 1D44E */,/*43468*/"MATHEMATICAL ITALIC SMALL B"/* 1D44F */, /*43469*/"MATHEMATICAL ITALIC SMALL C"/* 1D450 */,/*43470*/"MATHEMATICAL ITALIC SMALL D"/* 1D451 */, /*43471*/"MATHEMATICAL ITALIC SMALL E"/* 1D452 */,/*43472*/"MATHEMATICAL ITALIC SMALL F"/* 1D453 */, /*43473*/"MATHEMATICAL ITALIC SMALL G"/* 1D454 */,NULL,/*43475*/"MATHEMATICAL ITALIC SMALL I"/* 1D456 */, /*43476*/"MATHEMATICAL ITALIC SMALL J"/* 1D457 */,/*43477*/"MATHEMATICAL ITALIC SMALL K"/* 1D458 */, /*43478*/"MATHEMATICAL ITALIC SMALL L"/* 1D459 */,/*43479*/"MATHEMATICAL ITALIC SMALL M"/* 1D45A */, /*43480*/"MATHEMATICAL ITALIC SMALL N"/* 1D45B */,/*43481*/"MATHEMATICAL ITALIC SMALL O"/* 1D45C */, /*43482*/"MATHEMATICAL ITALIC SMALL P"/* 1D45D */,/*43483*/"MATHEMATICAL ITALIC SMALL Q"/* 1D45E */, /*43484*/"MATHEMATICAL ITALIC SMALL R"/* 1D45F */,/*43485*/"MATHEMATICAL ITALIC SMALL S"/* 1D460 */, /*43486*/"MATHEMATICAL ITALIC SMALL T"/* 1D461 */,/*43487*/"MATHEMATICAL ITALIC SMALL U"/* 1D462 */, /*43488*/"MATHEMATICAL ITALIC SMALL V"/* 1D463 */,/*43489*/"MATHEMATICAL ITALIC SMALL W"/* 1D464 */, /*43490*/"MATHEMATICAL ITALIC SMALL X"/* 1D465 */,/*43491*/"MATHEMATICAL ITALIC SMALL Y"/* 1D466 */, /*43492*/"MATHEMATICAL ITALIC SMALL Z"/* 1D467 */,/*43493*/"MATHEMATICAL BOLD ITALIC CAPITAL A"/* 1D468 */, /*43494*/"MATHEMATICAL BOLD ITALIC CAPITAL B"/* 1D469 */,/*43495*/"MATHEMATICAL BOLD ITALIC CAPITAL C"/* 1D46A */, /*43496*/"MATHEMATICAL BOLD ITALIC CAPITAL D"/* 1D46B */,/*43497*/"MATHEMATICAL BOLD ITALIC CAPITAL E"/* 1D46C */, /*43498*/"MATHEMATICAL BOLD ITALIC CAPITAL F"/* 1D46D */,/*43499*/"MATHEMATICAL BOLD ITALIC CAPITAL G"/* 1D46E */, /*43500*/"MATHEMATICAL BOLD ITALIC CAPITAL H"/* 1D46F */,/*43501*/"MATHEMATICAL BOLD ITALIC CAPITAL I"/* 1D470 */, /*43502*/"MATHEMATICAL BOLD ITALIC CAPITAL J"/* 1D471 */,/*43503*/"MATHEMATICAL BOLD ITALIC CAPITAL K"/* 1D472 */, /*43504*/"MATHEMATICAL BOLD ITALIC CAPITAL L"/* 1D473 */,/*43505*/"MATHEMATICAL BOLD ITALIC CAPITAL M"/* 1D474 */, /*43506*/"MATHEMATICAL BOLD ITALIC CAPITAL N"/* 1D475 */,/*43507*/"MATHEMATICAL BOLD ITALIC CAPITAL O"/* 1D476 */, /*43508*/"MATHEMATICAL BOLD ITALIC CAPITAL P"/* 1D477 */,/*43509*/"MATHEMATICAL BOLD ITALIC CAPITAL Q"/* 1D478 */, /*43510*/"MATHEMATICAL BOLD ITALIC CAPITAL R"/* 1D479 */,/*43511*/"MATHEMATICAL BOLD ITALIC CAPITAL S"/* 1D47A */, /*43512*/"MATHEMATICAL BOLD ITALIC CAPITAL T"/* 1D47B */,/*43513*/"MATHEMATICAL BOLD ITALIC CAPITAL U"/* 1D47C */, /*43514*/"MATHEMATICAL BOLD ITALIC CAPITAL V"/* 1D47D */,/*43515*/"MATHEMATICAL BOLD ITALIC CAPITAL W"/* 1D47E */, /*43516*/"MATHEMATICAL BOLD ITALIC CAPITAL X"/* 1D47F */,/*43517*/"MATHEMATICAL BOLD ITALIC CAPITAL Y"/* 1D480 */, /*43518*/"MATHEMATICAL BOLD ITALIC CAPITAL Z"/* 1D481 */,/*43519*/"MATHEMATICAL BOLD ITALIC SMALL A"/* 1D482 */, /*43520*/"MATHEMATICAL BOLD ITALIC SMALL B"/* 1D483 */,/*43521*/"MATHEMATICAL BOLD ITALIC SMALL C"/* 1D484 */, /*43522*/"MATHEMATICAL BOLD ITALIC SMALL D"/* 1D485 */,/*43523*/"MATHEMATICAL BOLD ITALIC SMALL E"/* 1D486 */, /*43524*/"MATHEMATICAL BOLD ITALIC SMALL F"/* 1D487 */,/*43525*/"MATHEMATICAL BOLD ITALIC SMALL G"/* 1D488 */, /*43526*/"MATHEMATICAL BOLD ITALIC SMALL H"/* 1D489 */,/*43527*/"MATHEMATICAL BOLD ITALIC SMALL I"/* 1D48A */, /*43528*/"MATHEMATICAL BOLD ITALIC SMALL J"/* 1D48B */,/*43529*/"MATHEMATICAL BOLD ITALIC SMALL K"/* 1D48C */, /*43530*/"MATHEMATICAL BOLD ITALIC SMALL L"/* 1D48D */,/*43531*/"MATHEMATICAL BOLD ITALIC SMALL M"/* 1D48E */, /*43532*/"MATHEMATICAL BOLD ITALIC SMALL N"/* 1D48F */,/*43533*/"MATHEMATICAL BOLD ITALIC SMALL O"/* 1D490 */, /*43534*/"MATHEMATICAL BOLD ITALIC SMALL P"/* 1D491 */,/*43535*/"MATHEMATICAL BOLD ITALIC SMALL Q"/* 1D492 */, /*43536*/"MATHEMATICAL BOLD ITALIC SMALL R"/* 1D493 */,/*43537*/"MATHEMATICAL BOLD ITALIC SMALL S"/* 1D494 */, /*43538*/"MATHEMATICAL BOLD ITALIC SMALL T"/* 1D495 */,/*43539*/"MATHEMATICAL BOLD ITALIC SMALL U"/* 1D496 */, /*43540*/"MATHEMATICAL BOLD ITALIC SMALL V"/* 1D497 */,/*43541*/"MATHEMATICAL BOLD ITALIC SMALL W"/* 1D498 */, /*43542*/"MATHEMATICAL BOLD ITALIC SMALL X"/* 1D499 */,/*43543*/"MATHEMATICAL BOLD ITALIC SMALL Y"/* 1D49A */, /*43544*/"MATHEMATICAL BOLD ITALIC SMALL Z"/* 1D49B */,/*43545*/"MATHEMATICAL SCRIPT CAPITAL A"/* 1D49C */,NULL, /*43547*/"MATHEMATICAL SCRIPT CAPITAL C"/* 1D49E */,/*43548*/"MATHEMATICAL SCRIPT CAPITAL D"/* 1D49F */,NULL,NULL, /*43551*/"MATHEMATICAL SCRIPT CAPITAL G"/* 1D4A2 */,NULL,NULL,/*43554*/"MATHEMATICAL SCRIPT CAPITAL J"/* 1D4A5 */, /*43555*/"MATHEMATICAL SCRIPT CAPITAL K"/* 1D4A6 */,NULL,NULL,/*43558*/"MATHEMATICAL SCRIPT CAPITAL N"/* 1D4A9 */, /*43559*/"MATHEMATICAL SCRIPT CAPITAL O"/* 1D4AA */,/*43560*/"MATHEMATICAL SCRIPT CAPITAL P"/* 1D4AB */, /*43561*/"MATHEMATICAL SCRIPT CAPITAL Q"/* 1D4AC */,NULL,/*43563*/"MATHEMATICAL SCRIPT CAPITAL S"/* 1D4AE */, /*43564*/"MATHEMATICAL SCRIPT CAPITAL T"/* 1D4AF */,/*43565*/"MATHEMATICAL SCRIPT CAPITAL U"/* 1D4B0 */, /*43566*/"MATHEMATICAL SCRIPT CAPITAL V"/* 1D4B1 */,/*43567*/"MATHEMATICAL SCRIPT CAPITAL W"/* 1D4B2 */, /*43568*/"MATHEMATICAL SCRIPT CAPITAL X"/* 1D4B3 */,/*43569*/"MATHEMATICAL SCRIPT CAPITAL Y"/* 1D4B4 */, /*43570*/"MATHEMATICAL SCRIPT CAPITAL Z"/* 1D4B5 */,/*43571*/"MATHEMATICAL SCRIPT SMALL A"/* 1D4B6 */, /*43572*/"MATHEMATICAL SCRIPT SMALL B"/* 1D4B7 */,/*43573*/"MATHEMATICAL SCRIPT SMALL C"/* 1D4B8 */, /*43574*/"MATHEMATICAL SCRIPT SMALL D"/* 1D4B9 */,NULL,/*43576*/"MATHEMATICAL SCRIPT SMALL F"/* 1D4BB */,NULL, /*43578*/"MATHEMATICAL SCRIPT SMALL H"/* 1D4BD */,/*43579*/"MATHEMATICAL SCRIPT SMALL I"/* 1D4BE */, /*43580*/"MATHEMATICAL SCRIPT SMALL J"/* 1D4BF */,/*43581*/"MATHEMATICAL SCRIPT SMALL K"/* 1D4C0 */, /*43582*/"MATHEMATICAL SCRIPT SMALL L"/* 1D4C1 */,/*43583*/"MATHEMATICAL SCRIPT SMALL M"/* 1D4C2 */, /*43584*/"MATHEMATICAL SCRIPT SMALL N"/* 1D4C3 */,NULL,/*43586*/"MATHEMATICAL SCRIPT SMALL P"/* 1D4C5 */, /*43587*/"MATHEMATICAL SCRIPT SMALL Q"/* 1D4C6 */,/*43588*/"MATHEMATICAL SCRIPT SMALL R"/* 1D4C7 */, /*43589*/"MATHEMATICAL SCRIPT SMALL S"/* 1D4C8 */,/*43590*/"MATHEMATICAL SCRIPT SMALL T"/* 1D4C9 */, /*43591*/"MATHEMATICAL SCRIPT SMALL U"/* 1D4CA */,/*43592*/"MATHEMATICAL SCRIPT SMALL V"/* 1D4CB */, /*43593*/"MATHEMATICAL SCRIPT SMALL W"/* 1D4CC */,/*43594*/"MATHEMATICAL SCRIPT SMALL X"/* 1D4CD */, /*43595*/"MATHEMATICAL SCRIPT SMALL Y"/* 1D4CE */,/*43596*/"MATHEMATICAL SCRIPT SMALL Z"/* 1D4CF */, /*43597*/"MATHEMATICAL BOLD SCRIPT CAPITAL A"/* 1D4D0 */,/*43598*/"MATHEMATICAL BOLD SCRIPT CAPITAL B"/* 1D4D1 */, /*43599*/"MATHEMATICAL BOLD SCRIPT CAPITAL C"/* 1D4D2 */,/*43600*/"MATHEMATICAL BOLD SCRIPT CAPITAL D"/* 1D4D3 */, /*43601*/"MATHEMATICAL BOLD SCRIPT CAPITAL E"/* 1D4D4 */,/*43602*/"MATHEMATICAL BOLD SCRIPT CAPITAL F"/* 1D4D5 */, /*43603*/"MATHEMATICAL BOLD SCRIPT CAPITAL G"/* 1D4D6 */,/*43604*/"MATHEMATICAL BOLD SCRIPT CAPITAL H"/* 1D4D7 */, /*43605*/"MATHEMATICAL BOLD SCRIPT CAPITAL I"/* 1D4D8 */,/*43606*/"MATHEMATICAL BOLD SCRIPT CAPITAL J"/* 1D4D9 */, /*43607*/"MATHEMATICAL BOLD SCRIPT CAPITAL K"/* 1D4DA */,/*43608*/"MATHEMATICAL BOLD SCRIPT CAPITAL L"/* 1D4DB */, /*43609*/"MATHEMATICAL BOLD SCRIPT CAPITAL M"/* 1D4DC */,/*43610*/"MATHEMATICAL BOLD SCRIPT CAPITAL N"/* 1D4DD */, /*43611*/"MATHEMATICAL BOLD SCRIPT CAPITAL O"/* 1D4DE */,/*43612*/"MATHEMATICAL BOLD SCRIPT CAPITAL P"/* 1D4DF */, /*43613*/"MATHEMATICAL BOLD SCRIPT CAPITAL Q"/* 1D4E0 */,/*43614*/"MATHEMATICAL BOLD SCRIPT CAPITAL R"/* 1D4E1 */, /*43615*/"MATHEMATICAL BOLD SCRIPT CAPITAL S"/* 1D4E2 */,/*43616*/"MATHEMATICAL BOLD SCRIPT CAPITAL T"/* 1D4E3 */, /*43617*/"MATHEMATICAL BOLD SCRIPT CAPITAL U"/* 1D4E4 */,/*43618*/"MATHEMATICAL BOLD SCRIPT CAPITAL V"/* 1D4E5 */, /*43619*/"MATHEMATICAL BOLD SCRIPT CAPITAL W"/* 1D4E6 */,/*43620*/"MATHEMATICAL BOLD SCRIPT CAPITAL X"/* 1D4E7 */, /*43621*/"MATHEMATICAL BOLD SCRIPT CAPITAL Y"/* 1D4E8 */,/*43622*/"MATHEMATICAL BOLD SCRIPT CAPITAL Z"/* 1D4E9 */, /*43623*/"MATHEMATICAL BOLD SCRIPT SMALL A"/* 1D4EA */,/*43624*/"MATHEMATICAL BOLD SCRIPT SMALL B"/* 1D4EB */, /*43625*/"MATHEMATICAL BOLD SCRIPT SMALL C"/* 1D4EC */,/*43626*/"MATHEMATICAL BOLD SCRIPT SMALL D"/* 1D4ED */, /*43627*/"MATHEMATICAL BOLD SCRIPT SMALL E"/* 1D4EE */,/*43628*/"MATHEMATICAL BOLD SCRIPT SMALL F"/* 1D4EF */, /*43629*/"MATHEMATICAL BOLD SCRIPT SMALL G"/* 1D4F0 */,/*43630*/"MATHEMATICAL BOLD SCRIPT SMALL H"/* 1D4F1 */, /*43631*/"MATHEMATICAL BOLD SCRIPT SMALL I"/* 1D4F2 */,/*43632*/"MATHEMATICAL BOLD SCRIPT SMALL J"/* 1D4F3 */, /*43633*/"MATHEMATICAL BOLD SCRIPT SMALL K"/* 1D4F4 */,/*43634*/"MATHEMATICAL BOLD SCRIPT SMALL L"/* 1D4F5 */, /*43635*/"MATHEMATICAL BOLD SCRIPT SMALL M"/* 1D4F6 */,/*43636*/"MATHEMATICAL BOLD SCRIPT SMALL N"/* 1D4F7 */, /*43637*/"MATHEMATICAL BOLD SCRIPT SMALL O"/* 1D4F8 */,/*43638*/"MATHEMATICAL BOLD SCRIPT SMALL P"/* 1D4F9 */, /*43639*/"MATHEMATICAL BOLD SCRIPT SMALL Q"/* 1D4FA */,/*43640*/"MATHEMATICAL BOLD SCRIPT SMALL R"/* 1D4FB */, /*43641*/"MATHEMATICAL BOLD SCRIPT SMALL S"/* 1D4FC */,/*43642*/"MATHEMATICAL BOLD SCRIPT SMALL T"/* 1D4FD */, /*43643*/"MATHEMATICAL BOLD SCRIPT SMALL U"/* 1D4FE */,/*43644*/"MATHEMATICAL BOLD SCRIPT SMALL V"/* 1D4FF */, /*43645*/"MATHEMATICAL BOLD SCRIPT SMALL W"/* 1D500 */,/*43646*/"MATHEMATICAL BOLD SCRIPT SMALL X"/* 1D501 */, /*43647*/"MATHEMATICAL BOLD SCRIPT SMALL Y"/* 1D502 */,/*43648*/"MATHEMATICAL BOLD SCRIPT SMALL Z"/* 1D503 */, /*43649*/"MATHEMATICAL FRAKTUR CAPITAL A"/* 1D504 */,/*43650*/"MATHEMATICAL FRAKTUR CAPITAL B"/* 1D505 */,NULL, /*43652*/"MATHEMATICAL FRAKTUR CAPITAL D"/* 1D507 */,/*43653*/"MATHEMATICAL FRAKTUR CAPITAL E"/* 1D508 */, /*43654*/"MATHEMATICAL FRAKTUR CAPITAL F"/* 1D509 */,/*43655*/"MATHEMATICAL FRAKTUR CAPITAL G"/* 1D50A */,NULL,NULL, /*43658*/"MATHEMATICAL FRAKTUR CAPITAL J"/* 1D50D */,/*43659*/"MATHEMATICAL FRAKTUR CAPITAL K"/* 1D50E */, /*43660*/"MATHEMATICAL FRAKTUR CAPITAL L"/* 1D50F */,/*43661*/"MATHEMATICAL FRAKTUR CAPITAL M"/* 1D510 */, /*43662*/"MATHEMATICAL FRAKTUR CAPITAL N"/* 1D511 */,/*43663*/"MATHEMATICAL FRAKTUR CAPITAL O"/* 1D512 */, /*43664*/"MATHEMATICAL FRAKTUR CAPITAL P"/* 1D513 */,/*43665*/"MATHEMATICAL FRAKTUR CAPITAL Q"/* 1D514 */,NULL, /*43667*/"MATHEMATICAL FRAKTUR CAPITAL S"/* 1D516 */,/*43668*/"MATHEMATICAL FRAKTUR CAPITAL T"/* 1D517 */, /*43669*/"MATHEMATICAL FRAKTUR CAPITAL U"/* 1D518 */,/*43670*/"MATHEMATICAL FRAKTUR CAPITAL V"/* 1D519 */, /*43671*/"MATHEMATICAL FRAKTUR CAPITAL W"/* 1D51A */,/*43672*/"MATHEMATICAL FRAKTUR CAPITAL X"/* 1D51B */, /*43673*/"MATHEMATICAL FRAKTUR CAPITAL Y"/* 1D51C */,NULL,/*43675*/"MATHEMATICAL FRAKTUR SMALL A"/* 1D51E */, /*43676*/"MATHEMATICAL FRAKTUR SMALL B"/* 1D51F */,/*43677*/"MATHEMATICAL FRAKTUR SMALL C"/* 1D520 */, /*43678*/"MATHEMATICAL FRAKTUR SMALL D"/* 1D521 */,/*43679*/"MATHEMATICAL FRAKTUR SMALL E"/* 1D522 */, /*43680*/"MATHEMATICAL FRAKTUR SMALL F"/* 1D523 */,/*43681*/"MATHEMATICAL FRAKTUR SMALL G"/* 1D524 */, /*43682*/"MATHEMATICAL FRAKTUR SMALL H"/* 1D525 */,/*43683*/"MATHEMATICAL FRAKTUR SMALL I"/* 1D526 */, /*43684*/"MATHEMATICAL FRAKTUR SMALL J"/* 1D527 */,/*43685*/"MATHEMATICAL FRAKTUR SMALL K"/* 1D528 */, /*43686*/"MATHEMATICAL FRAKTUR SMALL L"/* 1D529 */,/*43687*/"MATHEMATICAL FRAKTUR SMALL M"/* 1D52A */, /*43688*/"MATHEMATICAL FRAKTUR SMALL N"/* 1D52B */,/*43689*/"MATHEMATICAL FRAKTUR SMALL O"/* 1D52C */, /*43690*/"MATHEMATICAL FRAKTUR SMALL P"/* 1D52D */,/*43691*/"MATHEMATICAL FRAKTUR SMALL Q"/* 1D52E */, /*43692*/"MATHEMATICAL FRAKTUR SMALL R"/* 1D52F */,/*43693*/"MATHEMATICAL FRAKTUR SMALL S"/* 1D530 */, /*43694*/"MATHEMATICAL FRAKTUR SMALL T"/* 1D531 */,/*43695*/"MATHEMATICAL FRAKTUR SMALL U"/* 1D532 */, /*43696*/"MATHEMATICAL FRAKTUR SMALL V"/* 1D533 */,/*43697*/"MATHEMATICAL FRAKTUR SMALL W"/* 1D534 */, /*43698*/"MATHEMATICAL FRAKTUR SMALL X"/* 1D535 */,/*43699*/"MATHEMATICAL FRAKTUR SMALL Y"/* 1D536 */, /*43700*/"MATHEMATICAL FRAKTUR SMALL Z"/* 1D537 */,/*43701*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL A"/* 1D538 */, /*43702*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL B"/* 1D539 */,NULL, /*43704*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL D"/* 1D53B */,/*43705*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL E"/* 1D53C */, /*43706*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL F"/* 1D53D */,/*43707*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL G"/* 1D53E */, NULL,/*43709*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL I"/* 1D540 */, /*43710*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL J"/* 1D541 */,/*43711*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL K"/* 1D542 */, /*43712*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL L"/* 1D543 */,/*43713*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL M"/* 1D544 */, NULL,/*43715*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL O"/* 1D546 */,NULL,NULL,NULL, /*43719*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL S"/* 1D54A */,/*43720*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL T"/* 1D54B */, /*43721*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL U"/* 1D54C */,/*43722*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL V"/* 1D54D */, /*43723*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL W"/* 1D54E */,/*43724*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL X"/* 1D54F */, /*43725*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL Y"/* 1D550 */,NULL,/*43727*/"MATHEMATICAL DOUBLE-STRUCK SMALL A"/* 1D552 */, /*43728*/"MATHEMATICAL DOUBLE-STRUCK SMALL B"/* 1D553 */,/*43729*/"MATHEMATICAL DOUBLE-STRUCK SMALL C"/* 1D554 */, /*43730*/"MATHEMATICAL DOUBLE-STRUCK SMALL D"/* 1D555 */,/*43731*/"MATHEMATICAL DOUBLE-STRUCK SMALL E"/* 1D556 */, /*43732*/"MATHEMATICAL DOUBLE-STRUCK SMALL F"/* 1D557 */,/*43733*/"MATHEMATICAL DOUBLE-STRUCK SMALL G"/* 1D558 */, /*43734*/"MATHEMATICAL DOUBLE-STRUCK SMALL H"/* 1D559 */,/*43735*/"MATHEMATICAL DOUBLE-STRUCK SMALL I"/* 1D55A */, /*43736*/"MATHEMATICAL DOUBLE-STRUCK SMALL J"/* 1D55B */,/*43737*/"MATHEMATICAL DOUBLE-STRUCK SMALL K"/* 1D55C */, /*43738*/"MATHEMATICAL DOUBLE-STRUCK SMALL L"/* 1D55D */,/*43739*/"MATHEMATICAL DOUBLE-STRUCK SMALL M"/* 1D55E */, /*43740*/"MATHEMATICAL DOUBLE-STRUCK SMALL N"/* 1D55F */,/*43741*/"MATHEMATICAL DOUBLE-STRUCK SMALL O"/* 1D560 */, /*43742*/"MATHEMATICAL DOUBLE-STRUCK SMALL P"/* 1D561 */,/*43743*/"MATHEMATICAL DOUBLE-STRUCK SMALL Q"/* 1D562 */, /*43744*/"MATHEMATICAL DOUBLE-STRUCK SMALL R"/* 1D563 */,/*43745*/"MATHEMATICAL DOUBLE-STRUCK SMALL S"/* 1D564 */, /*43746*/"MATHEMATICAL DOUBLE-STRUCK SMALL T"/* 1D565 */,/*43747*/"MATHEMATICAL DOUBLE-STRUCK SMALL U"/* 1D566 */, /*43748*/"MATHEMATICAL DOUBLE-STRUCK SMALL V"/* 1D567 */,/*43749*/"MATHEMATICAL DOUBLE-STRUCK SMALL W"/* 1D568 */, /*43750*/"MATHEMATICAL DOUBLE-STRUCK SMALL X"/* 1D569 */,/*43751*/"MATHEMATICAL DOUBLE-STRUCK SMALL Y"/* 1D56A */, /*43752*/"MATHEMATICAL DOUBLE-STRUCK SMALL Z"/* 1D56B */,/*43753*/"MATHEMATICAL BOLD FRAKTUR CAPITAL A"/* 1D56C */, /*43754*/"MATHEMATICAL BOLD FRAKTUR CAPITAL B"/* 1D56D */,/*43755*/"MATHEMATICAL BOLD FRAKTUR CAPITAL C"/* 1D56E */, /*43756*/"MATHEMATICAL BOLD FRAKTUR CAPITAL D"/* 1D56F */,/*43757*/"MATHEMATICAL BOLD FRAKTUR CAPITAL E"/* 1D570 */, /*43758*/"MATHEMATICAL BOLD FRAKTUR CAPITAL F"/* 1D571 */,/*43759*/"MATHEMATICAL BOLD FRAKTUR CAPITAL G"/* 1D572 */, /*43760*/"MATHEMATICAL BOLD FRAKTUR CAPITAL H"/* 1D573 */,/*43761*/"MATHEMATICAL BOLD FRAKTUR CAPITAL I"/* 1D574 */, /*43762*/"MATHEMATICAL BOLD FRAKTUR CAPITAL J"/* 1D575 */,/*43763*/"MATHEMATICAL BOLD FRAKTUR CAPITAL K"/* 1D576 */, /*43764*/"MATHEMATICAL BOLD FRAKTUR CAPITAL L"/* 1D577 */,/*43765*/"MATHEMATICAL BOLD FRAKTUR CAPITAL M"/* 1D578 */, /*43766*/"MATHEMATICAL BOLD FRAKTUR CAPITAL N"/* 1D579 */,/*43767*/"MATHEMATICAL BOLD FRAKTUR CAPITAL O"/* 1D57A */, /*43768*/"MATHEMATICAL BOLD FRAKTUR CAPITAL P"/* 1D57B */,/*43769*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Q"/* 1D57C */, /*43770*/"MATHEMATICAL BOLD FRAKTUR CAPITAL R"/* 1D57D */,/*43771*/"MATHEMATICAL BOLD FRAKTUR CAPITAL S"/* 1D57E */, /*43772*/"MATHEMATICAL BOLD FRAKTUR CAPITAL T"/* 1D57F */,/*43773*/"MATHEMATICAL BOLD FRAKTUR CAPITAL U"/* 1D580 */, /*43774*/"MATHEMATICAL BOLD FRAKTUR CAPITAL V"/* 1D581 */,/*43775*/"MATHEMATICAL BOLD FRAKTUR CAPITAL W"/* 1D582 */, /*43776*/"MATHEMATICAL BOLD FRAKTUR CAPITAL X"/* 1D583 */,/*43777*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Y"/* 1D584 */, /*43778*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Z"/* 1D585 */,/*43779*/"MATHEMATICAL BOLD FRAKTUR SMALL A"/* 1D586 */, /*43780*/"MATHEMATICAL BOLD FRAKTUR SMALL B"/* 1D587 */,/*43781*/"MATHEMATICAL BOLD FRAKTUR SMALL C"/* 1D588 */, /*43782*/"MATHEMATICAL BOLD FRAKTUR SMALL D"/* 1D589 */,/*43783*/"MATHEMATICAL BOLD FRAKTUR SMALL E"/* 1D58A */, /*43784*/"MATHEMATICAL BOLD FRAKTUR SMALL F"/* 1D58B */,/*43785*/"MATHEMATICAL BOLD FRAKTUR SMALL G"/* 1D58C */, /*43786*/"MATHEMATICAL BOLD FRAKTUR SMALL H"/* 1D58D */,/*43787*/"MATHEMATICAL BOLD FRAKTUR SMALL I"/* 1D58E */, /*43788*/"MATHEMATICAL BOLD FRAKTUR SMALL J"/* 1D58F */,/*43789*/"MATHEMATICAL BOLD FRAKTUR SMALL K"/* 1D590 */, /*43790*/"MATHEMATICAL BOLD FRAKTUR SMALL L"/* 1D591 */,/*43791*/"MATHEMATICAL BOLD FRAKTUR SMALL M"/* 1D592 */, /*43792*/"MATHEMATICAL BOLD FRAKTUR SMALL N"/* 1D593 */,/*43793*/"MATHEMATICAL BOLD FRAKTUR SMALL O"/* 1D594 */, /*43794*/"MATHEMATICAL BOLD FRAKTUR SMALL P"/* 1D595 */,/*43795*/"MATHEMATICAL BOLD FRAKTUR SMALL Q"/* 1D596 */, /*43796*/"MATHEMATICAL BOLD FRAKTUR SMALL R"/* 1D597 */,/*43797*/"MATHEMATICAL BOLD FRAKTUR SMALL S"/* 1D598 */, /*43798*/"MATHEMATICAL BOLD FRAKTUR SMALL T"/* 1D599 */,/*43799*/"MATHEMATICAL BOLD FRAKTUR SMALL U"/* 1D59A */, /*43800*/"MATHEMATICAL BOLD FRAKTUR SMALL V"/* 1D59B */,/*43801*/"MATHEMATICAL BOLD FRAKTUR SMALL W"/* 1D59C */, /*43802*/"MATHEMATICAL BOLD FRAKTUR SMALL X"/* 1D59D */,/*43803*/"MATHEMATICAL BOLD FRAKTUR SMALL Y"/* 1D59E */, /*43804*/"MATHEMATICAL BOLD FRAKTUR SMALL Z"/* 1D59F */,/*43805*/"MATHEMATICAL SANS-SERIF CAPITAL A"/* 1D5A0 */, /*43806*/"MATHEMATICAL SANS-SERIF CAPITAL B"/* 1D5A1 */,/*43807*/"MATHEMATICAL SANS-SERIF CAPITAL C"/* 1D5A2 */, /*43808*/"MATHEMATICAL SANS-SERIF CAPITAL D"/* 1D5A3 */,/*43809*/"MATHEMATICAL SANS-SERIF CAPITAL E"/* 1D5A4 */, /*43810*/"MATHEMATICAL SANS-SERIF CAPITAL F"/* 1D5A5 */,/*43811*/"MATHEMATICAL SANS-SERIF CAPITAL G"/* 1D5A6 */, /*43812*/"MATHEMATICAL SANS-SERIF CAPITAL H"/* 1D5A7 */,/*43813*/"MATHEMATICAL SANS-SERIF CAPITAL I"/* 1D5A8 */, /*43814*/"MATHEMATICAL SANS-SERIF CAPITAL J"/* 1D5A9 */,/*43815*/"MATHEMATICAL SANS-SERIF CAPITAL K"/* 1D5AA */, /*43816*/"MATHEMATICAL SANS-SERIF CAPITAL L"/* 1D5AB */,/*43817*/"MATHEMATICAL SANS-SERIF CAPITAL M"/* 1D5AC */, /*43818*/"MATHEMATICAL SANS-SERIF CAPITAL N"/* 1D5AD */,/*43819*/"MATHEMATICAL SANS-SERIF CAPITAL O"/* 1D5AE */, /*43820*/"MATHEMATICAL SANS-SERIF CAPITAL P"/* 1D5AF */,/*43821*/"MATHEMATICAL SANS-SERIF CAPITAL Q"/* 1D5B0 */, /*43822*/"MATHEMATICAL SANS-SERIF CAPITAL R"/* 1D5B1 */,/*43823*/"MATHEMATICAL SANS-SERIF CAPITAL S"/* 1D5B2 */, /*43824*/"MATHEMATICAL SANS-SERIF CAPITAL T"/* 1D5B3 */,/*43825*/"MATHEMATICAL SANS-SERIF CAPITAL U"/* 1D5B4 */, /*43826*/"MATHEMATICAL SANS-SERIF CAPITAL V"/* 1D5B5 */,/*43827*/"MATHEMATICAL SANS-SERIF CAPITAL W"/* 1D5B6 */, /*43828*/"MATHEMATICAL SANS-SERIF CAPITAL X"/* 1D5B7 */,/*43829*/"MATHEMATICAL SANS-SERIF CAPITAL Y"/* 1D5B8 */, /*43830*/"MATHEMATICAL SANS-SERIF CAPITAL Z"/* 1D5B9 */,/*43831*/"MATHEMATICAL SANS-SERIF SMALL A"/* 1D5BA */, /*43832*/"MATHEMATICAL SANS-SERIF SMALL B"/* 1D5BB */,/*43833*/"MATHEMATICAL SANS-SERIF SMALL C"/* 1D5BC */, /*43834*/"MATHEMATICAL SANS-SERIF SMALL D"/* 1D5BD */,/*43835*/"MATHEMATICAL SANS-SERIF SMALL E"/* 1D5BE */, /*43836*/"MATHEMATICAL SANS-SERIF SMALL F"/* 1D5BF */,/*43837*/"MATHEMATICAL SANS-SERIF SMALL G"/* 1D5C0 */, /*43838*/"MATHEMATICAL SANS-SERIF SMALL H"/* 1D5C1 */,/*43839*/"MATHEMATICAL SANS-SERIF SMALL I"/* 1D5C2 */, /*43840*/"MATHEMATICAL SANS-SERIF SMALL J"/* 1D5C3 */,/*43841*/"MATHEMATICAL SANS-SERIF SMALL K"/* 1D5C4 */, /*43842*/"MATHEMATICAL SANS-SERIF SMALL L"/* 1D5C5 */,/*43843*/"MATHEMATICAL SANS-SERIF SMALL M"/* 1D5C6 */, /*43844*/"MATHEMATICAL SANS-SERIF SMALL N"/* 1D5C7 */,/*43845*/"MATHEMATICAL SANS-SERIF SMALL O"/* 1D5C8 */, /*43846*/"MATHEMATICAL SANS-SERIF SMALL P"/* 1D5C9 */,/*43847*/"MATHEMATICAL SANS-SERIF SMALL Q"/* 1D5CA */, /*43848*/"MATHEMATICAL SANS-SERIF SMALL R"/* 1D5CB */,/*43849*/"MATHEMATICAL SANS-SERIF SMALL S"/* 1D5CC */, /*43850*/"MATHEMATICAL SANS-SERIF SMALL T"/* 1D5CD */,/*43851*/"MATHEMATICAL SANS-SERIF SMALL U"/* 1D5CE */, /*43852*/"MATHEMATICAL SANS-SERIF SMALL V"/* 1D5CF */,/*43853*/"MATHEMATICAL SANS-SERIF SMALL W"/* 1D5D0 */, /*43854*/"MATHEMATICAL SANS-SERIF SMALL X"/* 1D5D1 */,/*43855*/"MATHEMATICAL SANS-SERIF SMALL Y"/* 1D5D2 */, /*43856*/"MATHEMATICAL SANS-SERIF SMALL Z"/* 1D5D3 */,/*43857*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL A"/* 1D5D4 */, /*43858*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL B"/* 1D5D5 */, /*43859*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL C"/* 1D5D6 */, /*43860*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL D"/* 1D5D7 */, /*43861*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL E"/* 1D5D8 */, /*43862*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL F"/* 1D5D9 */, /*43863*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL G"/* 1D5DA */, /*43864*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL H"/* 1D5DB */, /*43865*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL I"/* 1D5DC */, /*43866*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL J"/* 1D5DD */, /*43867*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL K"/* 1D5DE */, /*43868*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL L"/* 1D5DF */, /*43869*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL M"/* 1D5E0 */, /*43870*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL N"/* 1D5E1 */, /*43871*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL O"/* 1D5E2 */, /*43872*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL P"/* 1D5E3 */, /*43873*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Q"/* 1D5E4 */, /*43874*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL R"/* 1D5E5 */, /*43875*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL S"/* 1D5E6 */, /*43876*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL T"/* 1D5E7 */, /*43877*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL U"/* 1D5E8 */, /*43878*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL V"/* 1D5E9 */, /*43879*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL W"/* 1D5EA */, /*43880*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL X"/* 1D5EB */, /*43881*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Y"/* 1D5EC */, /*43882*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Z"/* 1D5ED */,/*43883*/"MATHEMATICAL SANS-SERIF BOLD SMALL A"/* 1D5EE */, /*43884*/"MATHEMATICAL SANS-SERIF BOLD SMALL B"/* 1D5EF */,/*43885*/"MATHEMATICAL SANS-SERIF BOLD SMALL C"/* 1D5F0 */, /*43886*/"MATHEMATICAL SANS-SERIF BOLD SMALL D"/* 1D5F1 */,/*43887*/"MATHEMATICAL SANS-SERIF BOLD SMALL E"/* 1D5F2 */, /*43888*/"MATHEMATICAL SANS-SERIF BOLD SMALL F"/* 1D5F3 */,/*43889*/"MATHEMATICAL SANS-SERIF BOLD SMALL G"/* 1D5F4 */, /*43890*/"MATHEMATICAL SANS-SERIF BOLD SMALL H"/* 1D5F5 */,/*43891*/"MATHEMATICAL SANS-SERIF BOLD SMALL I"/* 1D5F6 */, /*43892*/"MATHEMATICAL SANS-SERIF BOLD SMALL J"/* 1D5F7 */,/*43893*/"MATHEMATICAL SANS-SERIF BOLD SMALL K"/* 1D5F8 */, /*43894*/"MATHEMATICAL SANS-SERIF BOLD SMALL L"/* 1D5F9 */,/*43895*/"MATHEMATICAL SANS-SERIF BOLD SMALL M"/* 1D5FA */, /*43896*/"MATHEMATICAL SANS-SERIF BOLD SMALL N"/* 1D5FB */,/*43897*/"MATHEMATICAL SANS-SERIF BOLD SMALL O"/* 1D5FC */, /*43898*/"MATHEMATICAL SANS-SERIF BOLD SMALL P"/* 1D5FD */,/*43899*/"MATHEMATICAL SANS-SERIF BOLD SMALL Q"/* 1D5FE */, /*43900*/"MATHEMATICAL SANS-SERIF BOLD SMALL R"/* 1D5FF */,/*43901*/"MATHEMATICAL SANS-SERIF BOLD SMALL S"/* 1D600 */, /*43902*/"MATHEMATICAL SANS-SERIF BOLD SMALL T"/* 1D601 */,/*43903*/"MATHEMATICAL SANS-SERIF BOLD SMALL U"/* 1D602 */, /*43904*/"MATHEMATICAL SANS-SERIF BOLD SMALL V"/* 1D603 */,/*43905*/"MATHEMATICAL SANS-SERIF BOLD SMALL W"/* 1D604 */, /*43906*/"MATHEMATICAL SANS-SERIF BOLD SMALL X"/* 1D605 */,/*43907*/"MATHEMATICAL SANS-SERIF BOLD SMALL Y"/* 1D606 */, /*43908*/"MATHEMATICAL SANS-SERIF BOLD SMALL Z"/* 1D607 */, /*43909*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL A"/* 1D608 */, /*43910*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL B"/* 1D609 */, /*43911*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL C"/* 1D60A */, /*43912*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL D"/* 1D60B */, /*43913*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL E"/* 1D60C */, /*43914*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL F"/* 1D60D */, /*43915*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL G"/* 1D60E */, /*43916*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL H"/* 1D60F */, /*43917*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL I"/* 1D610 */, /*43918*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL J"/* 1D611 */, /*43919*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL K"/* 1D612 */, /*43920*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL L"/* 1D613 */, /*43921*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL M"/* 1D614 */, /*43922*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL N"/* 1D615 */, /*43923*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL O"/* 1D616 */, /*43924*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL P"/* 1D617 */, /*43925*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q"/* 1D618 */, /*43926*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL R"/* 1D619 */, /*43927*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL S"/* 1D61A */, /*43928*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL T"/* 1D61B */, /*43929*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL U"/* 1D61C */, /*43930*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL V"/* 1D61D */, /*43931*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL W"/* 1D61E */, /*43932*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL X"/* 1D61F */, /*43933*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y"/* 1D620 */, /*43934*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z"/* 1D621 */, /*43935*/"MATHEMATICAL SANS-SERIF ITALIC SMALL A"/* 1D622 */, /*43936*/"MATHEMATICAL SANS-SERIF ITALIC SMALL B"/* 1D623 */, /*43937*/"MATHEMATICAL SANS-SERIF ITALIC SMALL C"/* 1D624 */, /*43938*/"MATHEMATICAL SANS-SERIF ITALIC SMALL D"/* 1D625 */, /*43939*/"MATHEMATICAL SANS-SERIF ITALIC SMALL E"/* 1D626 */, /*43940*/"MATHEMATICAL SANS-SERIF ITALIC SMALL F"/* 1D627 */, /*43941*/"MATHEMATICAL SANS-SERIF ITALIC SMALL G"/* 1D628 */, /*43942*/"MATHEMATICAL SANS-SERIF ITALIC SMALL H"/* 1D629 */, /*43943*/"MATHEMATICAL SANS-SERIF ITALIC SMALL I"/* 1D62A */, /*43944*/"MATHEMATICAL SANS-SERIF ITALIC SMALL J"/* 1D62B */, /*43945*/"MATHEMATICAL SANS-SERIF ITALIC SMALL K"/* 1D62C */, /*43946*/"MATHEMATICAL SANS-SERIF ITALIC SMALL L"/* 1D62D */, /*43947*/"MATHEMATICAL SANS-SERIF ITALIC SMALL M"/* 1D62E */, /*43948*/"MATHEMATICAL SANS-SERIF ITALIC SMALL N"/* 1D62F */, /*43949*/"MATHEMATICAL SANS-SERIF ITALIC SMALL O"/* 1D630 */, /*43950*/"MATHEMATICAL SANS-SERIF ITALIC SMALL P"/* 1D631 */, /*43951*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Q"/* 1D632 */, /*43952*/"MATHEMATICAL SANS-SERIF ITALIC SMALL R"/* 1D633 */, /*43953*/"MATHEMATICAL SANS-SERIF ITALIC SMALL S"/* 1D634 */, /*43954*/"MATHEMATICAL SANS-SERIF ITALIC SMALL T"/* 1D635 */, /*43955*/"MATHEMATICAL SANS-SERIF ITALIC SMALL U"/* 1D636 */, /*43956*/"MATHEMATICAL SANS-SERIF ITALIC SMALL V"/* 1D637 */, /*43957*/"MATHEMATICAL SANS-SERIF ITALIC SMALL W"/* 1D638 */, /*43958*/"MATHEMATICAL SANS-SERIF ITALIC SMALL X"/* 1D639 */, /*43959*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Y"/* 1D63A */, /*43960*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Z"/* 1D63B */, /*43961*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A"/* 1D63C */, /*43962*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B"/* 1D63D */, /*43963*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C"/* 1D63E */, /*43964*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D"/* 1D63F */, /*43965*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E"/* 1D640 */, /*43966*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F"/* 1D641 */, /*43967*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G"/* 1D642 */, /*43968*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H"/* 1D643 */, /*43969*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I"/* 1D644 */, /*43970*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J"/* 1D645 */, /*43971*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K"/* 1D646 */, /*43972*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L"/* 1D647 */, /*43973*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M"/* 1D648 */, /*43974*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N"/* 1D649 */, /*43975*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O"/* 1D64A */, /*43976*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P"/* 1D64B */, /*43977*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q"/* 1D64C */, /*43978*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R"/* 1D64D */, /*43979*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S"/* 1D64E */, /*43980*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T"/* 1D64F */, /*43981*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U"/* 1D650 */, /*43982*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V"/* 1D651 */, /*43983*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W"/* 1D652 */, /*43984*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X"/* 1D653 */, /*43985*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y"/* 1D654 */, /*43986*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z"/* 1D655 */, /*43987*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A"/* 1D656 */, /*43988*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B"/* 1D657 */, /*43989*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C"/* 1D658 */, /*43990*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D"/* 1D659 */, /*43991*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E"/* 1D65A */, /*43992*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F"/* 1D65B */, /*43993*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G"/* 1D65C */, /*43994*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H"/* 1D65D */, /*43995*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I"/* 1D65E */, /*43996*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J"/* 1D65F */, /*43997*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K"/* 1D660 */, /*43998*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L"/* 1D661 */, /*43999*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M"/* 1D662 */, /*44000*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N"/* 1D663 */, /*44001*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O"/* 1D664 */, /*44002*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P"/* 1D665 */, /*44003*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q"/* 1D666 */, /*44004*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R"/* 1D667 */, /*44005*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S"/* 1D668 */, /*44006*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T"/* 1D669 */, /*44007*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U"/* 1D66A */, /*44008*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V"/* 1D66B */, /*44009*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W"/* 1D66C */, /*44010*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X"/* 1D66D */, /*44011*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y"/* 1D66E */, /*44012*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z"/* 1D66F */,/*44013*/"MATHEMATICAL MONOSPACE CAPITAL A"/* 1D670 */, /*44014*/"MATHEMATICAL MONOSPACE CAPITAL B"/* 1D671 */,/*44015*/"MATHEMATICAL MONOSPACE CAPITAL C"/* 1D672 */, /*44016*/"MATHEMATICAL MONOSPACE CAPITAL D"/* 1D673 */,/*44017*/"MATHEMATICAL MONOSPACE CAPITAL E"/* 1D674 */, /*44018*/"MATHEMATICAL MONOSPACE CAPITAL F"/* 1D675 */,/*44019*/"MATHEMATICAL MONOSPACE CAPITAL G"/* 1D676 */, /*44020*/"MATHEMATICAL MONOSPACE CAPITAL H"/* 1D677 */,/*44021*/"MATHEMATICAL MONOSPACE CAPITAL I"/* 1D678 */, /*44022*/"MATHEMATICAL MONOSPACE CAPITAL J"/* 1D679 */,/*44023*/"MATHEMATICAL MONOSPACE CAPITAL K"/* 1D67A */, /*44024*/"MATHEMATICAL MONOSPACE CAPITAL L"/* 1D67B */,/*44025*/"MATHEMATICAL MONOSPACE CAPITAL M"/* 1D67C */, /*44026*/"MATHEMATICAL MONOSPACE CAPITAL N"/* 1D67D */,/*44027*/"MATHEMATICAL MONOSPACE CAPITAL O"/* 1D67E */, /*44028*/"MATHEMATICAL MONOSPACE CAPITAL P"/* 1D67F */,/*44029*/"MATHEMATICAL MONOSPACE CAPITAL Q"/* 1D680 */, /*44030*/"MATHEMATICAL MONOSPACE CAPITAL R"/* 1D681 */,/*44031*/"MATHEMATICAL MONOSPACE CAPITAL S"/* 1D682 */, /*44032*/"MATHEMATICAL MONOSPACE CAPITAL T"/* 1D683 */,/*44033*/"MATHEMATICAL MONOSPACE CAPITAL U"/* 1D684 */, /*44034*/"MATHEMATICAL MONOSPACE CAPITAL V"/* 1D685 */,/*44035*/"MATHEMATICAL MONOSPACE CAPITAL W"/* 1D686 */, /*44036*/"MATHEMATICAL MONOSPACE CAPITAL X"/* 1D687 */,/*44037*/"MATHEMATICAL MONOSPACE CAPITAL Y"/* 1D688 */, /*44038*/"MATHEMATICAL MONOSPACE CAPITAL Z"/* 1D689 */,/*44039*/"MATHEMATICAL MONOSPACE SMALL A"/* 1D68A */, /*44040*/"MATHEMATICAL MONOSPACE SMALL B"/* 1D68B */,/*44041*/"MATHEMATICAL MONOSPACE SMALL C"/* 1D68C */, /*44042*/"MATHEMATICAL MONOSPACE SMALL D"/* 1D68D */,/*44043*/"MATHEMATICAL MONOSPACE SMALL E"/* 1D68E */, /*44044*/"MATHEMATICAL MONOSPACE SMALL F"/* 1D68F */,/*44045*/"MATHEMATICAL MONOSPACE SMALL G"/* 1D690 */, /*44046*/"MATHEMATICAL MONOSPACE SMALL H"/* 1D691 */,/*44047*/"MATHEMATICAL MONOSPACE SMALL I"/* 1D692 */, /*44048*/"MATHEMATICAL MONOSPACE SMALL J"/* 1D693 */,/*44049*/"MATHEMATICAL MONOSPACE SMALL K"/* 1D694 */, /*44050*/"MATHEMATICAL MONOSPACE SMALL L"/* 1D695 */,/*44051*/"MATHEMATICAL MONOSPACE SMALL M"/* 1D696 */, /*44052*/"MATHEMATICAL MONOSPACE SMALL N"/* 1D697 */,/*44053*/"MATHEMATICAL MONOSPACE SMALL O"/* 1D698 */, /*44054*/"MATHEMATICAL MONOSPACE SMALL P"/* 1D699 */,/*44055*/"MATHEMATICAL MONOSPACE SMALL Q"/* 1D69A */, /*44056*/"MATHEMATICAL MONOSPACE SMALL R"/* 1D69B */,/*44057*/"MATHEMATICAL MONOSPACE SMALL S"/* 1D69C */, /*44058*/"MATHEMATICAL MONOSPACE SMALL T"/* 1D69D */,/*44059*/"MATHEMATICAL MONOSPACE SMALL U"/* 1D69E */, /*44060*/"MATHEMATICAL MONOSPACE SMALL V"/* 1D69F */,/*44061*/"MATHEMATICAL MONOSPACE SMALL W"/* 1D6A0 */, /*44062*/"MATHEMATICAL MONOSPACE SMALL X"/* 1D6A1 */,/*44063*/"MATHEMATICAL MONOSPACE SMALL Y"/* 1D6A2 */, /*44064*/"MATHEMATICAL MONOSPACE SMALL Z"/* 1D6A3 */,/*44065*/"MATHEMATICAL ITALIC SMALL DOTLESS I"/* 1D6A4 */, /*44066*/"MATHEMATICAL ITALIC SMALL DOTLESS J"/* 1D6A5 */,NULL,NULL, /*44069*/"MATHEMATICAL BOLD CAPITAL ALPHA"/* 1D6A8 */,/*44070*/"MATHEMATICAL BOLD CAPITAL BETA"/* 1D6A9 */, /*44071*/"MATHEMATICAL BOLD CAPITAL GAMMA"/* 1D6AA */,/*44072*/"MATHEMATICAL BOLD CAPITAL DELTA"/* 1D6AB */, /*44073*/"MATHEMATICAL BOLD CAPITAL EPSILON"/* 1D6AC */,/*44074*/"MATHEMATICAL BOLD CAPITAL ZETA"/* 1D6AD */, /*44075*/"MATHEMATICAL BOLD CAPITAL ETA"/* 1D6AE */,/*44076*/"MATHEMATICAL BOLD CAPITAL THETA"/* 1D6AF */, /*44077*/"MATHEMATICAL BOLD CAPITAL IOTA"/* 1D6B0 */,/*44078*/"MATHEMATICAL BOLD CAPITAL KAPPA"/* 1D6B1 */, /*44079*/"MATHEMATICAL BOLD CAPITAL LAMDA"/* 1D6B2 */,/*44080*/"MATHEMATICAL BOLD CAPITAL MU"/* 1D6B3 */, /*44081*/"MATHEMATICAL BOLD CAPITAL NU"/* 1D6B4 */,/*44082*/"MATHEMATICAL BOLD CAPITAL XI"/* 1D6B5 */, /*44083*/"MATHEMATICAL BOLD CAPITAL OMICRON"/* 1D6B6 */,/*44084*/"MATHEMATICAL BOLD CAPITAL PI"/* 1D6B7 */, /*44085*/"MATHEMATICAL BOLD CAPITAL RHO"/* 1D6B8 */,/*44086*/"MATHEMATICAL BOLD CAPITAL THETA SYMBOL"/* 1D6B9 */, /*44087*/"MATHEMATICAL BOLD CAPITAL SIGMA"/* 1D6BA */,/*44088*/"MATHEMATICAL BOLD CAPITAL TAU"/* 1D6BB */, /*44089*/"MATHEMATICAL BOLD CAPITAL UPSILON"/* 1D6BC */,/*44090*/"MATHEMATICAL BOLD CAPITAL PHI"/* 1D6BD */, /*44091*/"MATHEMATICAL BOLD CAPITAL CHI"/* 1D6BE */,/*44092*/"MATHEMATICAL BOLD CAPITAL PSI"/* 1D6BF */, /*44093*/"MATHEMATICAL BOLD CAPITAL OMEGA"/* 1D6C0 */,/*44094*/"MATHEMATICAL BOLD NABLA"/* 1D6C1 */, /*44095*/"MATHEMATICAL BOLD SMALL ALPHA"/* 1D6C2 */,/*44096*/"MATHEMATICAL BOLD SMALL BETA"/* 1D6C3 */, /*44097*/"MATHEMATICAL BOLD SMALL GAMMA"/* 1D6C4 */,/*44098*/"MATHEMATICAL BOLD SMALL DELTA"/* 1D6C5 */, /*44099*/"MATHEMATICAL BOLD SMALL EPSILON"/* 1D6C6 */,/*44100*/"MATHEMATICAL BOLD SMALL ZETA"/* 1D6C7 */, /*44101*/"MATHEMATICAL BOLD SMALL ETA"/* 1D6C8 */,/*44102*/"MATHEMATICAL BOLD SMALL THETA"/* 1D6C9 */, /*44103*/"MATHEMATICAL BOLD SMALL IOTA"/* 1D6CA */,/*44104*/"MATHEMATICAL BOLD SMALL KAPPA"/* 1D6CB */, /*44105*/"MATHEMATICAL BOLD SMALL LAMDA"/* 1D6CC */,/*44106*/"MATHEMATICAL BOLD SMALL MU"/* 1D6CD */, /*44107*/"MATHEMATICAL BOLD SMALL NU"/* 1D6CE */,/*44108*/"MATHEMATICAL BOLD SMALL XI"/* 1D6CF */, /*44109*/"MATHEMATICAL BOLD SMALL OMICRON"/* 1D6D0 */,/*44110*/"MATHEMATICAL BOLD SMALL PI"/* 1D6D1 */, /*44111*/"MATHEMATICAL BOLD SMALL RHO"/* 1D6D2 */,/*44112*/"MATHEMATICAL BOLD SMALL FINAL SIGMA"/* 1D6D3 */, /*44113*/"MATHEMATICAL BOLD SMALL SIGMA"/* 1D6D4 */,/*44114*/"MATHEMATICAL BOLD SMALL TAU"/* 1D6D5 */, /*44115*/"MATHEMATICAL BOLD SMALL UPSILON"/* 1D6D6 */,/*44116*/"MATHEMATICAL BOLD SMALL PHI"/* 1D6D7 */, /*44117*/"MATHEMATICAL BOLD SMALL CHI"/* 1D6D8 */,/*44118*/"MATHEMATICAL BOLD SMALL PSI"/* 1D6D9 */, /*44119*/"MATHEMATICAL BOLD SMALL OMEGA"/* 1D6DA */,/*44120*/"MATHEMATICAL BOLD PARTIAL DIFFERENTIAL"/* 1D6DB */, /*44121*/"MATHEMATICAL BOLD EPSILON SYMBOL"/* 1D6DC */,/*44122*/"MATHEMATICAL BOLD THETA SYMBOL"/* 1D6DD */, /*44123*/"MATHEMATICAL BOLD KAPPA SYMBOL"/* 1D6DE */,/*44124*/"MATHEMATICAL BOLD PHI SYMBOL"/* 1D6DF */, /*44125*/"MATHEMATICAL BOLD RHO SYMBOL"/* 1D6E0 */,/*44126*/"MATHEMATICAL BOLD PI SYMBOL"/* 1D6E1 */, /*44127*/"MATHEMATICAL ITALIC CAPITAL ALPHA"/* 1D6E2 */,/*44128*/"MATHEMATICAL ITALIC CAPITAL BETA"/* 1D6E3 */, /*44129*/"MATHEMATICAL ITALIC CAPITAL GAMMA"/* 1D6E4 */,/*44130*/"MATHEMATICAL ITALIC CAPITAL DELTA"/* 1D6E5 */, /*44131*/"MATHEMATICAL ITALIC CAPITAL EPSILON"/* 1D6E6 */,/*44132*/"MATHEMATICAL ITALIC CAPITAL ZETA"/* 1D6E7 */, /*44133*/"MATHEMATICAL ITALIC CAPITAL ETA"/* 1D6E8 */,/*44134*/"MATHEMATICAL ITALIC CAPITAL THETA"/* 1D6E9 */, /*44135*/"MATHEMATICAL ITALIC CAPITAL IOTA"/* 1D6EA */,/*44136*/"MATHEMATICAL ITALIC CAPITAL KAPPA"/* 1D6EB */, /*44137*/"MATHEMATICAL ITALIC CAPITAL LAMDA"/* 1D6EC */,/*44138*/"MATHEMATICAL ITALIC CAPITAL MU"/* 1D6ED */, /*44139*/"MATHEMATICAL ITALIC CAPITAL NU"/* 1D6EE */,/*44140*/"MATHEMATICAL ITALIC CAPITAL XI"/* 1D6EF */, /*44141*/"MATHEMATICAL ITALIC CAPITAL OMICRON"/* 1D6F0 */,/*44142*/"MATHEMATICAL ITALIC CAPITAL PI"/* 1D6F1 */, /*44143*/"MATHEMATICAL ITALIC CAPITAL RHO"/* 1D6F2 */,/*44144*/"MATHEMATICAL ITALIC CAPITAL THETA SYMBOL"/* 1D6F3 */, /*44145*/"MATHEMATICAL ITALIC CAPITAL SIGMA"/* 1D6F4 */,/*44146*/"MATHEMATICAL ITALIC CAPITAL TAU"/* 1D6F5 */, /*44147*/"MATHEMATICAL ITALIC CAPITAL UPSILON"/* 1D6F6 */,/*44148*/"MATHEMATICAL ITALIC CAPITAL PHI"/* 1D6F7 */, /*44149*/"MATHEMATICAL ITALIC CAPITAL CHI"/* 1D6F8 */,/*44150*/"MATHEMATICAL ITALIC CAPITAL PSI"/* 1D6F9 */, /*44151*/"MATHEMATICAL ITALIC CAPITAL OMEGA"/* 1D6FA */,/*44152*/"MATHEMATICAL ITALIC NABLA"/* 1D6FB */, /*44153*/"MATHEMATICAL ITALIC SMALL ALPHA"/* 1D6FC */,/*44154*/"MATHEMATICAL ITALIC SMALL BETA"/* 1D6FD */, /*44155*/"MATHEMATICAL ITALIC SMALL GAMMA"/* 1D6FE */,/*44156*/"MATHEMATICAL ITALIC SMALL DELTA"/* 1D6FF */, /*44157*/"MATHEMATICAL ITALIC SMALL EPSILON"/* 1D700 */,/*44158*/"MATHEMATICAL ITALIC SMALL ZETA"/* 1D701 */, /*44159*/"MATHEMATICAL ITALIC SMALL ETA"/* 1D702 */,/*44160*/"MATHEMATICAL ITALIC SMALL THETA"/* 1D703 */, /*44161*/"MATHEMATICAL ITALIC SMALL IOTA"/* 1D704 */,/*44162*/"MATHEMATICAL ITALIC SMALL KAPPA"/* 1D705 */, /*44163*/"MATHEMATICAL ITALIC SMALL LAMDA"/* 1D706 */,/*44164*/"MATHEMATICAL ITALIC SMALL MU"/* 1D707 */, /*44165*/"MATHEMATICAL ITALIC SMALL NU"/* 1D708 */,/*44166*/"MATHEMATICAL ITALIC SMALL XI"/* 1D709 */, /*44167*/"MATHEMATICAL ITALIC SMALL OMICRON"/* 1D70A */,/*44168*/"MATHEMATICAL ITALIC SMALL PI"/* 1D70B */, /*44169*/"MATHEMATICAL ITALIC SMALL RHO"/* 1D70C */,/*44170*/"MATHEMATICAL ITALIC SMALL FINAL SIGMA"/* 1D70D */, /*44171*/"MATHEMATICAL ITALIC SMALL SIGMA"/* 1D70E */,/*44172*/"MATHEMATICAL ITALIC SMALL TAU"/* 1D70F */, /*44173*/"MATHEMATICAL ITALIC SMALL UPSILON"/* 1D710 */,/*44174*/"MATHEMATICAL ITALIC SMALL PHI"/* 1D711 */, /*44175*/"MATHEMATICAL ITALIC SMALL CHI"/* 1D712 */,/*44176*/"MATHEMATICAL ITALIC SMALL PSI"/* 1D713 */, /*44177*/"MATHEMATICAL ITALIC SMALL OMEGA"/* 1D714 */,/*44178*/"MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL"/* 1D715 */, /*44179*/"MATHEMATICAL ITALIC EPSILON SYMBOL"/* 1D716 */,/*44180*/"MATHEMATICAL ITALIC THETA SYMBOL"/* 1D717 */, /*44181*/"MATHEMATICAL ITALIC KAPPA SYMBOL"/* 1D718 */,/*44182*/"MATHEMATICAL ITALIC PHI SYMBOL"/* 1D719 */, /*44183*/"MATHEMATICAL ITALIC RHO SYMBOL"/* 1D71A */,/*44184*/"MATHEMATICAL ITALIC PI SYMBOL"/* 1D71B */, /*44185*/"MATHEMATICAL BOLD ITALIC CAPITAL ALPHA"/* 1D71C */,/*44186*/"MATHEMATICAL BOLD ITALIC CAPITAL BETA"/* 1D71D */, /*44187*/"MATHEMATICAL BOLD ITALIC CAPITAL GAMMA"/* 1D71E */, /*44188*/"MATHEMATICAL BOLD ITALIC CAPITAL DELTA"/* 1D71F */, /*44189*/"MATHEMATICAL BOLD ITALIC CAPITAL EPSILON"/* 1D720 */, /*44190*/"MATHEMATICAL BOLD ITALIC CAPITAL ZETA"/* 1D721 */,/*44191*/"MATHEMATICAL BOLD ITALIC CAPITAL ETA"/* 1D722 */, /*44192*/"MATHEMATICAL BOLD ITALIC CAPITAL THETA"/* 1D723 */,/*44193*/"MATHEMATICAL BOLD ITALIC CAPITAL IOTA"/* 1D724 */, /*44194*/"MATHEMATICAL BOLD ITALIC CAPITAL KAPPA"/* 1D725 */, /*44195*/"MATHEMATICAL BOLD ITALIC CAPITAL LAMDA"/* 1D726 */,/*44196*/"MATHEMATICAL BOLD ITALIC CAPITAL MU"/* 1D727 */, /*44197*/"MATHEMATICAL BOLD ITALIC CAPITAL NU"/* 1D728 */,/*44198*/"MATHEMATICAL BOLD ITALIC CAPITAL XI"/* 1D729 */, /*44199*/"MATHEMATICAL BOLD ITALIC CAPITAL OMICRON"/* 1D72A */,/*44200*/"MATHEMATICAL BOLD ITALIC CAPITAL PI"/* 1D72B */, /*44201*/"MATHEMATICAL BOLD ITALIC CAPITAL RHO"/* 1D72C */, /*44202*/"MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL"/* 1D72D */, /*44203*/"MATHEMATICAL BOLD ITALIC CAPITAL SIGMA"/* 1D72E */,/*44204*/"MATHEMATICAL BOLD ITALIC CAPITAL TAU"/* 1D72F */, /*44205*/"MATHEMATICAL BOLD ITALIC CAPITAL UPSILON"/* 1D730 */, /*44206*/"MATHEMATICAL BOLD ITALIC CAPITAL PHI"/* 1D731 */,/*44207*/"MATHEMATICAL BOLD ITALIC CAPITAL CHI"/* 1D732 */, /*44208*/"MATHEMATICAL BOLD ITALIC CAPITAL PSI"/* 1D733 */,/*44209*/"MATHEMATICAL BOLD ITALIC CAPITAL OMEGA"/* 1D734 */, /*44210*/"MATHEMATICAL BOLD ITALIC NABLA"/* 1D735 */,/*44211*/"MATHEMATICAL BOLD ITALIC SMALL ALPHA"/* 1D736 */, /*44212*/"MATHEMATICAL BOLD ITALIC SMALL BETA"/* 1D737 */,/*44213*/"MATHEMATICAL BOLD ITALIC SMALL GAMMA"/* 1D738 */, /*44214*/"MATHEMATICAL BOLD ITALIC SMALL DELTA"/* 1D739 */,/*44215*/"MATHEMATICAL BOLD ITALIC SMALL EPSILON"/* 1D73A */, /*44216*/"MATHEMATICAL BOLD ITALIC SMALL ZETA"/* 1D73B */,/*44217*/"MATHEMATICAL BOLD ITALIC SMALL ETA"/* 1D73C */, /*44218*/"MATHEMATICAL BOLD ITALIC SMALL THETA"/* 1D73D */,/*44219*/"MATHEMATICAL BOLD ITALIC SMALL IOTA"/* 1D73E */, /*44220*/"MATHEMATICAL BOLD ITALIC SMALL KAPPA"/* 1D73F */,/*44221*/"MATHEMATICAL BOLD ITALIC SMALL LAMDA"/* 1D740 */, /*44222*/"MATHEMATICAL BOLD ITALIC SMALL MU"/* 1D741 */,/*44223*/"MATHEMATICAL BOLD ITALIC SMALL NU"/* 1D742 */, /*44224*/"MATHEMATICAL BOLD ITALIC SMALL XI"/* 1D743 */,/*44225*/"MATHEMATICAL BOLD ITALIC SMALL OMICRON"/* 1D744 */, /*44226*/"MATHEMATICAL BOLD ITALIC SMALL PI"/* 1D745 */,/*44227*/"MATHEMATICAL BOLD ITALIC SMALL RHO"/* 1D746 */, /*44228*/"MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA"/* 1D747 */, /*44229*/"MATHEMATICAL BOLD ITALIC SMALL SIGMA"/* 1D748 */,/*44230*/"MATHEMATICAL BOLD ITALIC SMALL TAU"/* 1D749 */, /*44231*/"MATHEMATICAL BOLD ITALIC SMALL UPSILON"/* 1D74A */,/*44232*/"MATHEMATICAL BOLD ITALIC SMALL PHI"/* 1D74B */, /*44233*/"MATHEMATICAL BOLD ITALIC SMALL CHI"/* 1D74C */,/*44234*/"MATHEMATICAL BOLD ITALIC SMALL PSI"/* 1D74D */, /*44235*/"MATHEMATICAL BOLD ITALIC SMALL OMEGA"/* 1D74E */, /*44236*/"MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL"/* 1D74F */, /*44237*/"MATHEMATICAL BOLD ITALIC EPSILON SYMBOL"/* 1D750 */, /*44238*/"MATHEMATICAL BOLD ITALIC THETA SYMBOL"/* 1D751 */,/*44239*/"MATHEMATICAL BOLD ITALIC KAPPA SYMBOL"/* 1D752 */, /*44240*/"MATHEMATICAL BOLD ITALIC PHI SYMBOL"/* 1D753 */,/*44241*/"MATHEMATICAL BOLD ITALIC RHO SYMBOL"/* 1D754 */, /*44242*/"MATHEMATICAL BOLD ITALIC PI SYMBOL"/* 1D755 */, /*44243*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA"/* 1D756 */, /*44244*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA"/* 1D757 */, /*44245*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA"/* 1D758 */, /*44246*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA"/* 1D759 */, /*44247*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON"/* 1D75A */, /*44248*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA"/* 1D75B */, /*44249*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA"/* 1D75C */, /*44250*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA"/* 1D75D */, /*44251*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA"/* 1D75E */, /*44252*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA"/* 1D75F */, /*44253*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA"/* 1D760 */, /*44254*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL MU"/* 1D761 */, /*44255*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL NU"/* 1D762 */, /*44256*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL XI"/* 1D763 */, /*44257*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON"/* 1D764 */, /*44258*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PI"/* 1D765 */, /*44259*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO"/* 1D766 */, /*44260*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL"/* 1D767 */, /*44261*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA"/* 1D768 */, /*44262*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU"/* 1D769 */, /*44263*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON"/* 1D76A */, /*44264*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI"/* 1D76B */, /*44265*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI"/* 1D76C */, /*44266*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI"/* 1D76D */, /*44267*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA"/* 1D76E */, /*44268*/"MATHEMATICAL SANS-SERIF BOLD NABLA"/* 1D76F */,/*44269*/"MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA"/* 1D770 */, /*44270*/"MATHEMATICAL SANS-SERIF BOLD SMALL BETA"/* 1D771 */, /*44271*/"MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA"/* 1D772 */, /*44272*/"MATHEMATICAL SANS-SERIF BOLD SMALL DELTA"/* 1D773 */, /*44273*/"MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON"/* 1D774 */, /*44274*/"MATHEMATICAL SANS-SERIF BOLD SMALL ZETA"/* 1D775 */, /*44275*/"MATHEMATICAL SANS-SERIF BOLD SMALL ETA"/* 1D776 */, /*44276*/"MATHEMATICAL SANS-SERIF BOLD SMALL THETA"/* 1D777 */, /*44277*/"MATHEMATICAL SANS-SERIF BOLD SMALL IOTA"/* 1D778 */, /*44278*/"MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA"/* 1D779 */, /*44279*/"MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA"/* 1D77A */, /*44280*/"MATHEMATICAL SANS-SERIF BOLD SMALL MU"/* 1D77B */,/*44281*/"MATHEMATICAL SANS-SERIF BOLD SMALL NU"/* 1D77C */, /*44282*/"MATHEMATICAL SANS-SERIF BOLD SMALL XI"/* 1D77D */, /*44283*/"MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON"/* 1D77E */, /*44284*/"MATHEMATICAL SANS-SERIF BOLD SMALL PI"/* 1D77F */,/*44285*/"MATHEMATICAL SANS-SERIF BOLD SMALL RHO"/* 1D780 */, /*44286*/"MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA"/* 1D781 */, /*44287*/"MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA"/* 1D782 */, /*44288*/"MATHEMATICAL SANS-SERIF BOLD SMALL TAU"/* 1D783 */, /*44289*/"MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON"/* 1D784 */, /*44290*/"MATHEMATICAL SANS-SERIF BOLD SMALL PHI"/* 1D785 */, /*44291*/"MATHEMATICAL SANS-SERIF BOLD SMALL CHI"/* 1D786 */, /*44292*/"MATHEMATICAL SANS-SERIF BOLD SMALL PSI"/* 1D787 */, /*44293*/"MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA"/* 1D788 */, /*44294*/"MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL"/* 1D789 */, /*44295*/"MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL"/* 1D78A */, /*44296*/"MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL"/* 1D78B */, /*44297*/"MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL"/* 1D78C */, /*44298*/"MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL"/* 1D78D */, /*44299*/"MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL"/* 1D78E */, /*44300*/"MATHEMATICAL SANS-SERIF BOLD PI SYMBOL"/* 1D78F */, /*44301*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA"/* 1D790 */, /*44302*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA"/* 1D791 */, /*44303*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA"/* 1D792 */, /*44304*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA"/* 1D793 */, /*44305*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON"/* 1D794 */, /*44306*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA"/* 1D795 */, /*44307*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA"/* 1D796 */, /*44308*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA"/* 1D797 */, /*44309*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA"/* 1D798 */, /*44310*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA"/* 1D799 */, /*44311*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA"/* 1D79A */, /*44312*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU"/* 1D79B */, /*44313*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU"/* 1D79C */, /*44314*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI"/* 1D79D */, /*44315*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON"/* 1D79E */, /*44316*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI"/* 1D79F */, /*44317*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO"/* 1D7A0 */, /*44318*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL"/* 1D7A1 */, /*44319*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA"/* 1D7A2 */, /*44320*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU"/* 1D7A3 */, /*44321*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON"/* 1D7A4 */, /*44322*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI"/* 1D7A5 */, /*44323*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI"/* 1D7A6 */, /*44324*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI"/* 1D7A7 */, /*44325*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA"/* 1D7A8 */, /*44326*/"MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA"/* 1D7A9 */, /*44327*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA"/* 1D7AA */, /*44328*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA"/* 1D7AB */, /*44329*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA"/* 1D7AC */, /*44330*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA"/* 1D7AD */, /*44331*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON"/* 1D7AE */, /*44332*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA"/* 1D7AF */, /*44333*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA"/* 1D7B0 */, /*44334*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA"/* 1D7B1 */, /*44335*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA"/* 1D7B2 */, /*44336*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA"/* 1D7B3 */, /*44337*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA"/* 1D7B4 */, /*44338*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU"/* 1D7B5 */, /*44339*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU"/* 1D7B6 */, /*44340*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI"/* 1D7B7 */, /*44341*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON"/* 1D7B8 */, /*44342*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI"/* 1D7B9 */, /*44343*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO"/* 1D7BA */, /*44344*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA"/* 1D7BB */, /*44345*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA"/* 1D7BC */, /*44346*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU"/* 1D7BD */, /*44347*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON"/* 1D7BE */, /*44348*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI"/* 1D7BF */, /*44349*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI"/* 1D7C0 */, /*44350*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI"/* 1D7C1 */, /*44351*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA"/* 1D7C2 */, /*44352*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL"/* 1D7C3 */, /*44353*/"MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL"/* 1D7C4 */, /*44354*/"MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL"/* 1D7C5 */, /*44355*/"MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL"/* 1D7C6 */, /*44356*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL"/* 1D7C7 */, /*44357*/"MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL"/* 1D7C8 */, /*44358*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL"/* 1D7C9 */, /*44359*/"MATHEMATICAL BOLD CAPITAL DIGAMMA"/* 1D7CA */,/*44360*/"MATHEMATICAL BOLD SMALL DIGAMMA"/* 1D7CB */,NULL,NULL, /*44363*/"MATHEMATICAL BOLD DIGIT ZERO"/* 1D7CE */,/*44364*/"MATHEMATICAL BOLD DIGIT ONE"/* 1D7CF */, /*44365*/"MATHEMATICAL BOLD DIGIT TWO"/* 1D7D0 */,/*44366*/"MATHEMATICAL BOLD DIGIT THREE"/* 1D7D1 */, /*44367*/"MATHEMATICAL BOLD DIGIT FOUR"/* 1D7D2 */,/*44368*/"MATHEMATICAL BOLD DIGIT FIVE"/* 1D7D3 */, /*44369*/"MATHEMATICAL BOLD DIGIT SIX"/* 1D7D4 */,/*44370*/"MATHEMATICAL BOLD DIGIT SEVEN"/* 1D7D5 */, /*44371*/"MATHEMATICAL BOLD DIGIT EIGHT"/* 1D7D6 */,/*44372*/"MATHEMATICAL BOLD DIGIT NINE"/* 1D7D7 */, /*44373*/"MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO"/* 1D7D8 */,/*44374*/"MATHEMATICAL DOUBLE-STRUCK DIGIT ONE"/* 1D7D9 */, /*44375*/"MATHEMATICAL DOUBLE-STRUCK DIGIT TWO"/* 1D7DA */,/*44376*/"MATHEMATICAL DOUBLE-STRUCK DIGIT THREE"/* 1D7DB */, /*44377*/"MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR"/* 1D7DC */,/*44378*/"MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE"/* 1D7DD */, /*44379*/"MATHEMATICAL DOUBLE-STRUCK DIGIT SIX"/* 1D7DE */,/*44380*/"MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN"/* 1D7DF */, /*44381*/"MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT"/* 1D7E0 */,/*44382*/"MATHEMATICAL DOUBLE-STRUCK DIGIT NINE"/* 1D7E1 */, /*44383*/"MATHEMATICAL SANS-SERIF DIGIT ZERO"/* 1D7E2 */,/*44384*/"MATHEMATICAL SANS-SERIF DIGIT ONE"/* 1D7E3 */, /*44385*/"MATHEMATICAL SANS-SERIF DIGIT TWO"/* 1D7E4 */,/*44386*/"MATHEMATICAL SANS-SERIF DIGIT THREE"/* 1D7E5 */, /*44387*/"MATHEMATICAL SANS-SERIF DIGIT FOUR"/* 1D7E6 */,/*44388*/"MATHEMATICAL SANS-SERIF DIGIT FIVE"/* 1D7E7 */, /*44389*/"MATHEMATICAL SANS-SERIF DIGIT SIX"/* 1D7E8 */,/*44390*/"MATHEMATICAL SANS-SERIF DIGIT SEVEN"/* 1D7E9 */, /*44391*/"MATHEMATICAL SANS-SERIF DIGIT EIGHT"/* 1D7EA */,/*44392*/"MATHEMATICAL SANS-SERIF DIGIT NINE"/* 1D7EB */, /*44393*/"MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO"/* 1D7EC */, /*44394*/"MATHEMATICAL SANS-SERIF BOLD DIGIT ONE"/* 1D7ED */, /*44395*/"MATHEMATICAL SANS-SERIF BOLD DIGIT TWO"/* 1D7EE */, /*44396*/"MATHEMATICAL SANS-SERIF BOLD DIGIT THREE"/* 1D7EF */, /*44397*/"MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR"/* 1D7F0 */, /*44398*/"MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE"/* 1D7F1 */, /*44399*/"MATHEMATICAL SANS-SERIF BOLD DIGIT SIX"/* 1D7F2 */, /*44400*/"MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN"/* 1D7F3 */, /*44401*/"MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT"/* 1D7F4 */, /*44402*/"MATHEMATICAL SANS-SERIF BOLD DIGIT NINE"/* 1D7F5 */,/*44403*/"MATHEMATICAL MONOSPACE DIGIT ZERO"/* 1D7F6 */, /*44404*/"MATHEMATICAL MONOSPACE DIGIT ONE"/* 1D7F7 */,/*44405*/"MATHEMATICAL MONOSPACE DIGIT TWO"/* 1D7F8 */, /*44406*/"MATHEMATICAL MONOSPACE DIGIT THREE"/* 1D7F9 */,/*44407*/"MATHEMATICAL MONOSPACE DIGIT FOUR"/* 1D7FA */, /*44408*/"MATHEMATICAL MONOSPACE DIGIT FIVE"/* 1D7FB */,/*44409*/"MATHEMATICAL MONOSPACE DIGIT SIX"/* 1D7FC */, /*44410*/"MATHEMATICAL MONOSPACE DIGIT SEVEN"/* 1D7FD */,/*44411*/"MATHEMATICAL MONOSPACE DIGIT EIGHT"/* 1D7FE */, /*44412*/"MATHEMATICAL MONOSPACE DIGIT NINE"/* 1D7FF */,/*44413*/"SIGNWRITING HAND-FIST INDEX"/* 1D800 */, /*44414*/"SIGNWRITING HAND-CIRCLE INDEX"/* 1D801 */,/*44415*/"SIGNWRITING HAND-CUP INDEX"/* 1D802 */, /*44416*/"SIGNWRITING HAND-OVAL INDEX"/* 1D803 */,/*44417*/"SIGNWRITING HAND-HINGE INDEX"/* 1D804 */, /*44418*/"SIGNWRITING HAND-ANGLE INDEX"/* 1D805 */,/*44419*/"SIGNWRITING HAND-FIST INDEX BENT"/* 1D806 */, /*44420*/"SIGNWRITING HAND-CIRCLE INDEX BENT"/* 1D807 */, /*44421*/"SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT"/* 1D808 */, /*44422*/"SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE"/* 1D809 */, /*44423*/"SIGNWRITING HAND-FIST INDEX CUPPED"/* 1D80A */,/*44424*/"SIGNWRITING HAND-FIST INDEX HINGED"/* 1D80B */, /*44425*/"SIGNWRITING HAND-FIST INDEX HINGED LOW"/* 1D80C */,/*44426*/"SIGNWRITING HAND-CIRCLE INDEX HINGE"/* 1D80D */, /*44427*/"SIGNWRITING HAND-FIST INDEX MIDDLE"/* 1D80E */,/*44428*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE"/* 1D80F */, /*44429*/"SIGNWRITING HAND-FIST INDEX MIDDLE BENT"/* 1D810 */, /*44430*/"SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES"/* 1D811 */, /*44431*/"SIGNWRITING HAND-FIST INDEX MIDDLE HINGED"/* 1D812 */, /*44432*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED"/* 1D813 */, /*44433*/"SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP"/* 1D814 */, /*44434*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED"/* 1D815 */, /*44435*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT"/* 1D816 */, /*44436*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT"/* 1D817 */, /*44437*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED"/* 1D818 */, /*44438*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED"/* 1D819 */, /*44439*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED"/* 1D81A */, /*44440*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED"/* 1D81B */, /*44441*/"SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX"/* 1D81C */, /*44442*/"SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE"/* 1D81D */, /*44443*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB"/* 1D81E */, /*44444*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB"/* 1D81F */, /*44445*/"SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT"/* 1D820 */, /*44446*/"SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT"/* 1D821 */, /*44447*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT"/* 1D822 */, /*44448*/"SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE"/* 1D823 */, /*44449*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE"/* 1D824 */, /*44450*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED"/* 1D825 */, /*44451*/"SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE"/* 1D826 */, /*44452*/"SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD"/* 1D827 */, /*44453*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED"/* 1D828 */, /*44454*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED"/* 1D829 */, /*44455*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED"/* 1D82A */, /*44456*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED"/* 1D82B */, /*44457*/"SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT"/* 1D82C */, /*44458*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE"/* 1D82D */, /*44459*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED"/* 1D82E */, /*44460*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT"/* 1D82F */, /*44461*/"SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP"/* 1D830 */, /*44462*/"SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP"/* 1D831 */, /*44463*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE"/* 1D832 */, /*44464*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE"/* 1D833 */, /*44465*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD"/* 1D834 */, /*44466*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD"/* 1D835 */, /*44467*/"SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP"/* 1D836 */, /*44468*/"SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP"/* 1D837 */, /*44469*/"SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP"/* 1D838 */, /*44470*/"SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED"/* 1D839 */, /*44471*/"SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP"/* 1D83A */, /*44472*/"SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP"/* 1D83B */, /*44473*/"SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP"/* 1D83C */, /*44474*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED"/* 1D83D */, /*44475*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT"/* 1D83E */, /*44476*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED"/* 1D83F */, /*44477*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP"/* 1D840 */, /*44478*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED"/* 1D841 */, /*44479*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP"/* 1D842 */, /*44480*/"SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED"/* 1D843 */, /*44481*/"SIGNWRITING HAND-FLAT FOUR FINGERS"/* 1D844 */,/*44482*/"SIGNWRITING HAND-FLAT FOUR FINGERS BENT"/* 1D845 */, /*44483*/"SIGNWRITING HAND-FLAT FOUR FINGERS HINGED"/* 1D846 */, /*44484*/"SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED"/* 1D847 */, /*44485*/"SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT"/* 1D848 */, /*44486*/"SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED"/* 1D849 */, /*44487*/"SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT"/* 1D84A */, /*44488*/"SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED"/* 1D84B */, /*44489*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD"/* 1D84C */, /*44490*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD"/* 1D84D */, /*44491*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT"/* 1D84E */, /*44492*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT"/* 1D84F */, /*44493*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT"/* 1D850 */, /*44494*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT"/* 1D851 */, /*44495*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD"/* 1D852 */, /*44496*/"SIGNWRITING HAND-CUP FIVE FINGERS SPREAD"/* 1D853 */, /*44497*/"SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN"/* 1D854 */, /*44498*/"SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN"/* 1D855 */, /*44499*/"SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD"/* 1D856 */, /*44500*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED"/* 1D857 */, /*44501*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE"/* 1D858 */, /*44502*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB"/* 1D859 */, /*44503*/"SIGNWRITING HAND-FLAT"/* 1D85A */,/*44504*/"SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS"/* 1D85B */, /*44505*/"SIGNWRITING HAND-FLAT HEEL"/* 1D85C */,/*44506*/"SIGNWRITING HAND-FLAT THUMB SIDE"/* 1D85D */, /*44507*/"SIGNWRITING HAND-FLAT HEEL THUMB SIDE"/* 1D85E */,/*44508*/"SIGNWRITING HAND-FLAT THUMB BENT"/* 1D85F */, /*44509*/"SIGNWRITING HAND-FLAT THUMB FORWARD"/* 1D860 */, /*44510*/"SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE"/* 1D861 */, /*44511*/"SIGNWRITING HAND-FLAT SPLIT CENTRE"/* 1D862 */, /*44512*/"SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE"/* 1D863 */, /*44513*/"SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT"/* 1D864 */, /*44514*/"SIGNWRITING HAND-FLAT SPLIT LITTLE"/* 1D865 */,/*44515*/"SIGNWRITING HAND-CLAW"/* 1D866 */, /*44516*/"SIGNWRITING HAND-CLAW THUMB SIDE"/* 1D867 */,/*44517*/"SIGNWRITING HAND-CLAW NO THUMB"/* 1D868 */, /*44518*/"SIGNWRITING HAND-CLAW THUMB FORWARD"/* 1D869 */,/*44519*/"SIGNWRITING HAND-HOOK CURLICUE"/* 1D86A */, /*44520*/"SIGNWRITING HAND-HOOK"/* 1D86B */,/*44521*/"SIGNWRITING HAND-CUP OPEN"/* 1D86C */, /*44522*/"SIGNWRITING HAND-CUP"/* 1D86D */,/*44523*/"SIGNWRITING HAND-CUP OPEN THUMB SIDE"/* 1D86E */, /*44524*/"SIGNWRITING HAND-CUP THUMB SIDE"/* 1D86F */,/*44525*/"SIGNWRITING HAND-CUP OPEN NO THUMB"/* 1D870 */, /*44526*/"SIGNWRITING HAND-CUP NO THUMB"/* 1D871 */,/*44527*/"SIGNWRITING HAND-CUP OPEN THUMB FORWARD"/* 1D872 */, /*44528*/"SIGNWRITING HAND-CUP THUMB FORWARD"/* 1D873 */,/*44529*/"SIGNWRITING HAND-CURLICUE OPEN"/* 1D874 */, /*44530*/"SIGNWRITING HAND-CURLICUE"/* 1D875 */,/*44531*/"SIGNWRITING HAND-CIRCLE"/* 1D876 */, /*44532*/"SIGNWRITING HAND-OVAL"/* 1D877 */,/*44533*/"SIGNWRITING HAND-OVAL THUMB SIDE"/* 1D878 */, /*44534*/"SIGNWRITING HAND-OVAL NO THUMB"/* 1D879 */,/*44535*/"SIGNWRITING HAND-OVAL THUMB FORWARD"/* 1D87A */, /*44536*/"SIGNWRITING HAND-HINGE OPEN"/* 1D87B */,/*44537*/"SIGNWRITING HAND-HINGE OPEN THUMB FORWARD"/* 1D87C */, /*44538*/"SIGNWRITING HAND-HINGE"/* 1D87D */,/*44539*/"SIGNWRITING HAND-HINGE SMALL"/* 1D87E */, /*44540*/"SIGNWRITING HAND-HINGE OPEN THUMB SIDE"/* 1D87F */,/*44541*/"SIGNWRITING HAND-HINGE THUMB SIDE"/* 1D880 */, /*44542*/"SIGNWRITING HAND-HINGE OPEN NO THUMB"/* 1D881 */,/*44543*/"SIGNWRITING HAND-HINGE NO THUMB"/* 1D882 */, /*44544*/"SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX"/* 1D883 */, /*44545*/"SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING"/* 1D884 */,/*44546*/"SIGNWRITING HAND-ANGLE"/* 1D885 */, /*44547*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING"/* 1D886 */, /*44548*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING"/* 1D887 */, /*44549*/"SIGNWRITING HAND-HINGE INDEX MIDDLE RING"/* 1D888 */, /*44550*/"SIGNWRITING HAND-ANGLE INDEX MIDDLE RING"/* 1D889 */,/*44551*/"SIGNWRITING HAND-HINGE LITTLE"/* 1D88A */, /*44552*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT"/* 1D88B */, /*44553*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED"/* 1D88C */, /*44554*/"SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED"/* 1D88D */, /*44555*/"SIGNWRITING HAND-FIST LITTLE DOWN"/* 1D88E */, /*44556*/"SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT"/* 1D88F */, /*44557*/"SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED"/* 1D890 */, /*44558*/"SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED"/* 1D891 */, /*44559*/"SIGNWRITING HAND-FIST LITTLE UP"/* 1D892 */,/*44560*/"SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP"/* 1D893 */, /*44561*/"SIGNWRITING HAND-CIRCLE LITTLE UP"/* 1D894 */,/*44562*/"SIGNWRITING HAND-OVAL LITTLE UP"/* 1D895 */, /*44563*/"SIGNWRITING HAND-ANGLE LITTLE UP"/* 1D896 */,/*44564*/"SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE"/* 1D897 */, /*44565*/"SIGNWRITING HAND-FIST LITTLE BENT"/* 1D898 */,/*44566*/"SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB"/* 1D899 */, /*44567*/"SIGNWRITING HAND-FIST LITTLE THUMB"/* 1D89A */,/*44568*/"SIGNWRITING HAND-HINGE LITTLE THUMB"/* 1D89B */, /*44569*/"SIGNWRITING HAND-FIST LITTLE INDEX THUMB"/* 1D89C */, /*44570*/"SIGNWRITING HAND-HINGE LITTLE INDEX THUMB"/* 1D89D */, /*44571*/"SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT"/* 1D89E */, /*44572*/"SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB"/* 1D89F */, /*44573*/"SIGNWRITING HAND-FIST LITTLE INDEX"/* 1D8A0 */,/*44574*/"SIGNWRITING HAND-CIRCLE LITTLE INDEX"/* 1D8A1 */, /*44575*/"SIGNWRITING HAND-HINGE LITTLE INDEX"/* 1D8A2 */,/*44576*/"SIGNWRITING HAND-ANGLE LITTLE INDEX"/* 1D8A3 */, /*44577*/"SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE"/* 1D8A4 */, /*44578*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE"/* 1D8A5 */, /*44579*/"SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE"/* 1D8A6 */,/*44580*/"SIGNWRITING HAND-HINGE RING"/* 1D8A7 */, /*44581*/"SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE"/* 1D8A8 */, /*44582*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE"/* 1D8A9 */, /*44583*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE"/* 1D8AA */, /*44584*/"SIGNWRITING HAND-FIST RING DOWN"/* 1D8AB */, /*44585*/"SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE"/* 1D8AC */, /*44586*/"SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS"/* 1D8AD */, /*44587*/"SIGNWRITING HAND-FIST RING UP"/* 1D8AE */,/*44588*/"SIGNWRITING HAND-FIST RING RAISED KNUCKLE"/* 1D8AF */, /*44589*/"SIGNWRITING HAND-FIST RING LITTLE"/* 1D8B0 */,/*44590*/"SIGNWRITING HAND-CIRCLE RING LITTLE"/* 1D8B1 */, /*44591*/"SIGNWRITING HAND-OVAL RING LITTLE"/* 1D8B2 */,/*44592*/"SIGNWRITING HAND-ANGLE RING LITTLE"/* 1D8B3 */, /*44593*/"SIGNWRITING HAND-FIST RING MIDDLE"/* 1D8B4 */, /*44594*/"SIGNWRITING HAND-FIST RING MIDDLE CONJOINED"/* 1D8B5 */, /*44595*/"SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES"/* 1D8B6 */, /*44596*/"SIGNWRITING HAND-FIST RING INDEX"/* 1D8B7 */,/*44597*/"SIGNWRITING HAND-FIST RING THUMB"/* 1D8B8 */, /*44598*/"SIGNWRITING HAND-HOOK RING THUMB"/* 1D8B9 */,/*44599*/"SIGNWRITING HAND-FIST INDEX RING LITTLE"/* 1D8BA */, /*44600*/"SIGNWRITING HAND-CIRCLE INDEX RING LITTLE"/* 1D8BB */, /*44601*/"SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON"/* 1D8BC */, /*44602*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT"/* 1D8BD */, /*44603*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE IN"/* 1D8BE */, /*44604*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER"/* 1D8BF */, /*44605*/"SIGNWRITING HAND-CUP INDEX RING LITTLE"/* 1D8C0 */, /*44606*/"SIGNWRITING HAND-HINGE INDEX RING LITTLE"/* 1D8C1 */, /*44607*/"SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT"/* 1D8C2 */, /*44608*/"SIGNWRITING HAND-ANGLE INDEX RING LITTLE"/* 1D8C3 */,/*44609*/"SIGNWRITING HAND-FIST MIDDLE DOWN"/* 1D8C4 */, /*44610*/"SIGNWRITING HAND-HINGE MIDDLE"/* 1D8C5 */,/*44611*/"SIGNWRITING HAND-FIST MIDDLE UP"/* 1D8C6 */, /*44612*/"SIGNWRITING HAND-CIRCLE MIDDLE UP"/* 1D8C7 */, /*44613*/"SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE"/* 1D8C8 */, /*44614*/"SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE"/* 1D8C9 */, /*44615*/"SIGNWRITING HAND-HOOK MIDDLE THUMB"/* 1D8CA */,/*44616*/"SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE"/* 1D8CB */, /*44617*/"SIGNWRITING HAND-FIST MIDDLE LITTLE"/* 1D8CC */,/*44618*/"SIGNWRITING HAND-FIST MIDDLE RING LITTLE"/* 1D8CD */, /*44619*/"SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE"/* 1D8CE */, /*44620*/"SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON"/* 1D8CF */, /*44621*/"SIGNWRITING HAND-CUP MIDDLE RING LITTLE"/* 1D8D0 */, /*44622*/"SIGNWRITING HAND-HINGE MIDDLE RING LITTLE"/* 1D8D1 */, /*44623*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT"/* 1D8D2 */, /*44624*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN"/* 1D8D3 */, /*44625*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE"/* 1D8D4 */, /*44626*/"SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT"/* 1D8D5 */, /*44627*/"SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED"/* 1D8D6 */, /*44628*/"SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE"/* 1D8D7 */, /*44629*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT"/* 1D8D8 */, /*44630*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN"/* 1D8D9 */, /*44631*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED"/* 1D8DA */, /*44632*/"SIGNWRITING HAND-HINGE INDEX HINGED"/* 1D8DB */,/*44633*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE"/* 1D8DC */, /*44634*/"SIGNWRITING HAND-HINGE INDEX THUMB SIDE"/* 1D8DD */, /*44635*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL"/* 1D8DE */, /*44636*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED"/* 1D8DF */, /*44637*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT"/* 1D8E0 */, /*44638*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT"/* 1D8E1 */, /*44639*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT"/* 1D8E2 */, /*44640*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE"/* 1D8E3 */, /*44641*/"SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT"/* 1D8E4 */, /*44642*/"SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT"/* 1D8E5 */, /*44643*/"SIGNWRITING HAND-FIST INDEX THUMB HOOK"/* 1D8E6 */, /*44644*/"SIGNWRITING HAND-FIST INDEX THUMB CURLICUE"/* 1D8E7 */, /*44645*/"SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE"/* 1D8E8 */, /*44646*/"SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE"/* 1D8E9 */, /*44647*/"SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER"/* 1D8EA */, /*44648*/"SIGNWRITING HAND-FIST INDEX THUMB CIRCLE"/* 1D8EB */,/*44649*/"SIGNWRITING HAND-CUP INDEX THUMB"/* 1D8EC */, /*44650*/"SIGNWRITING HAND-CUP INDEX THUMB OPEN"/* 1D8ED */, /*44651*/"SIGNWRITING HAND-HINGE INDEX THUMB OPEN"/* 1D8EE */, /*44652*/"SIGNWRITING HAND-HINGE INDEX THUMB LARGE"/* 1D8EF */,/*44653*/"SIGNWRITING HAND-HINGE INDEX THUMB"/* 1D8F0 */, /*44654*/"SIGNWRITING HAND-HINGE INDEX THUMB SMALL"/* 1D8F1 */, /*44655*/"SIGNWRITING HAND-ANGLE INDEX THUMB OUT"/* 1D8F2 */,/*44656*/"SIGNWRITING HAND-ANGLE INDEX THUMB IN"/* 1D8F3 */, /*44657*/"SIGNWRITING HAND-ANGLE INDEX THUMB"/* 1D8F4 */,/*44658*/"SIGNWRITING HAND-FIST THUMB"/* 1D8F5 */, /*44659*/"SIGNWRITING HAND-FIST THUMB HEEL"/* 1D8F6 */,/*44660*/"SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL"/* 1D8F7 */, /*44661*/"SIGNWRITING HAND-FIST THUMB SIDE CONJOINED"/* 1D8F8 */, /*44662*/"SIGNWRITING HAND-FIST THUMB SIDE BENT"/* 1D8F9 */,/*44663*/"SIGNWRITING HAND-FIST THUMB FORWARD"/* 1D8FA */, /*44664*/"SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE"/* 1D8FB */, /*44665*/"SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING"/* 1D8FC */, /*44666*/"SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE"/* 1D8FD */, /*44667*/"SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS"/* 1D8FE */, /*44668*/"SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS"/* 1D8FF */, /*44669*/"SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS"/* 1D900 */, /*44670*/"SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS"/* 1D901 */, /*44671*/"SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES"/* 1D902 */,/*44672*/"SIGNWRITING HAND-FIST"/* 1D903 */, /*44673*/"SIGNWRITING HAND-FIST HEEL"/* 1D904 */,/*44674*/"SIGNWRITING TOUCH SINGLE"/* 1D905 */, /*44675*/"SIGNWRITING TOUCH MULTIPLE"/* 1D906 */,/*44676*/"SIGNWRITING TOUCH BETWEEN"/* 1D907 */, /*44677*/"SIGNWRITING GRASP SINGLE"/* 1D908 */,/*44678*/"SIGNWRITING GRASP MULTIPLE"/* 1D909 */, /*44679*/"SIGNWRITING GRASP BETWEEN"/* 1D90A */,/*44680*/"SIGNWRITING STRIKE SINGLE"/* 1D90B */, /*44681*/"SIGNWRITING STRIKE MULTIPLE"/* 1D90C */,/*44682*/"SIGNWRITING STRIKE BETWEEN"/* 1D90D */, /*44683*/"SIGNWRITING BRUSH SINGLE"/* 1D90E */,/*44684*/"SIGNWRITING BRUSH MULTIPLE"/* 1D90F */, /*44685*/"SIGNWRITING BRUSH BETWEEN"/* 1D910 */,/*44686*/"SIGNWRITING RUB SINGLE"/* 1D911 */, /*44687*/"SIGNWRITING RUB MULTIPLE"/* 1D912 */,/*44688*/"SIGNWRITING RUB BETWEEN"/* 1D913 */, /*44689*/"SIGNWRITING SURFACE SYMBOLS"/* 1D914 */,/*44690*/"SIGNWRITING SURFACE BETWEEN"/* 1D915 */, /*44691*/"SIGNWRITING SQUEEZE LARGE SINGLE"/* 1D916 */,/*44692*/"SIGNWRITING SQUEEZE SMALL SINGLE"/* 1D917 */, /*44693*/"SIGNWRITING SQUEEZE LARGE MULTIPLE"/* 1D918 */,/*44694*/"SIGNWRITING SQUEEZE SMALL MULTIPLE"/* 1D919 */, /*44695*/"SIGNWRITING SQUEEZE SEQUENTIAL"/* 1D91A */,/*44696*/"SIGNWRITING FLICK LARGE SINGLE"/* 1D91B */, /*44697*/"SIGNWRITING FLICK SMALL SINGLE"/* 1D91C */,/*44698*/"SIGNWRITING FLICK LARGE MULTIPLE"/* 1D91D */, /*44699*/"SIGNWRITING FLICK SMALL MULTIPLE"/* 1D91E */,/*44700*/"SIGNWRITING FLICK SEQUENTIAL"/* 1D91F */, /*44701*/"SIGNWRITING SQUEEZE FLICK ALTERNATING"/* 1D920 */, /*44702*/"SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE"/* 1D921 */, /*44703*/"SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL"/* 1D922 */, /*44704*/"SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL"/* 1D923 */, /*44705*/"SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL"/* 1D924 */, /*44706*/"SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE"/* 1D925 */, /*44707*/"SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL"/* 1D926 */, /*44708*/"SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS"/* 1D927 */, /*44709*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT"/* 1D928 */, /*44710*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT"/* 1D929 */, /*44711*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL"/* 1D92A */, /*44712*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM"/* 1D92B */, /*44713*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE"/* 1D92C */, /*44714*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST"/* 1D92D */, /*44715*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX"/* 1D92E */, /*44716*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT"/* 1D92F */, /*44717*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX"/* 1D930 */, /*44718*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING"/* 1D931 */, /*44719*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX"/* 1D932 */, /*44720*/"SIGNWRITING MOVEMENT-WALLPLANE CROSS"/* 1D933 */, /*44721*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT"/* 1D934 */, /*44722*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX"/* 1D935 */, /*44723*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING"/* 1D936 */, /*44724*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX"/* 1D937 */, /*44725*/"SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL"/* 1D938 */, /*44726*/"SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM"/* 1D939 */, /*44727*/"SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE"/* 1D93A */, /*44728*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL"/* 1D93B */, /*44729*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM"/* 1D93C */, /*44730*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE"/* 1D93D */, /*44731*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION"/* 1D93E */, /*44732*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL"/* 1D93F */, /*44733*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM"/* 1D940 */, /*44734*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE"/* 1D941 */, /*44735*/"SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL"/* 1D942 */, /*44736*/"SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM"/* 1D943 */, /*44737*/"SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE"/* 1D944 */, /*44738*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL"/* 1D945 */, /*44739*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM"/* 1D946 */, /*44740*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE"/* 1D947 */, /*44741*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL"/* 1D948 */, /*44742*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM"/* 1D949 */, /*44743*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE"/* 1D94A */, /*44744*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE"/* 1D94B */, /*44745*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE"/* 1D94C */, /*44746*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING"/* 1D94D */, /*44747*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE"/* 1D94E */, /*44748*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE"/* 1D94F */, /*44749*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING"/* 1D950 */, /*44750*/"SIGNWRITING TRAVEL-WALLPLANE SHAKING"/* 1D951 */, /*44751*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE"/* 1D952 */, /*44752*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE"/* 1D953 */, /*44753*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE"/* 1D954 */, /*44754*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL"/* 1D955 */, /*44755*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM"/* 1D956 */, /*44756*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE"/* 1D957 */, /*44757*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST"/* 1D958 */, /*44758*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL"/* 1D959 */, /*44759*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM"/* 1D95A */, /*44760*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE"/* 1D95B */, /*44761*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST"/* 1D95C */, /*44762*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL"/* 1D95D */, /*44763*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM"/* 1D95E */, /*44764*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE"/* 1D95F */, /*44765*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST"/* 1D960 */, /*44766*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL"/* 1D961 */, /*44767*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM"/* 1D962 */, /*44768*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE"/* 1D963 */, /*44769*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST"/* 1D964 */, /*44770*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL"/* 1D965 */, /*44771*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM"/* 1D966 */, /*44772*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE"/* 1D967 */, /*44773*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST"/* 1D968 */, /*44774*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX"/* 1D969 */, /*44775*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT"/* 1D96A */, /*44776*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX"/* 1D96B */, /*44777*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING"/* 1D96C */, /*44778*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX"/* 1D96D */, /*44779*/"SIGNWRITING MOVEMENT-FLOORPLANE CROSS"/* 1D96E */, /*44780*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT"/* 1D96F */, /*44781*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX"/* 1D970 */, /*44782*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT"/* 1D971 */, /*44783*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX"/* 1D972 */, /*44784*/"SIGNWRITING MOVEMENT-FLOORPLANE BEND"/* 1D973 */, /*44785*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL"/* 1D974 */, /*44786*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM"/* 1D975 */, /*44787*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE"/* 1D976 */, /*44788*/"SIGNWRITING MOVEMENT-FLOORPLANE CHECK"/* 1D977 */, /*44789*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL"/* 1D978 */, /*44790*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM"/* 1D979 */, /*44791*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE"/* 1D97A */, /*44792*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL"/* 1D97B */, /*44793*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM"/* 1D97C */, /*44794*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE"/* 1D97D */, /*44795*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL"/* 1D97E */, /*44796*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM"/* 1D97F */, /*44797*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE"/* 1D980 */, /*44798*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE"/* 1D981 */, /*44799*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE"/* 1D982 */, /*44800*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING"/* 1D983 */, /*44801*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE"/* 1D984 */, /*44802*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE"/* 1D985 */, /*44803*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING"/* 1D986 */, /*44804*/"SIGNWRITING TRAVEL-FLOORPLANE SHAKING"/* 1D987 */, /*44805*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL"/* 1D988 */, /*44806*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM"/* 1D989 */, /*44807*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE"/* 1D98A */, /*44808*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST"/* 1D98B */, /*44809*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL"/* 1D98C */, /*44810*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM"/* 1D98D */, /*44811*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE"/* 1D98E */, /*44812*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST"/* 1D98F */, /*44813*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL"/* 1D990 */, /*44814*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM"/* 1D991 */, /*44815*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL"/* 1D992 */, /*44816*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM"/* 1D993 */, /*44817*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE"/* 1D994 */, /*44818*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL"/* 1D995 */, /*44819*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM"/* 1D996 */, /*44820*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE"/* 1D997 */, /*44821*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE"/* 1D998 */, /*44822*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL"/* 1D999 */, /*44823*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM"/* 1D99A */, /*44824*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE"/* 1D99B */, /*44825*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL"/* 1D99C */, /*44826*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM"/* 1D99D */, /*44827*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE"/* 1D99E */, /*44828*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT"/* 1D99F */, /*44829*/"SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL"/* 1D9A0 */, /*44830*/"SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM"/* 1D9A1 */, /*44831*/"SIGNWRITING ROTATION-WALLPLANE SINGLE"/* 1D9A2 */,/*44832*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE"/* 1D9A3 */, /*44833*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATE"/* 1D9A4 */, /*44834*/"SIGNWRITING MOVEMENT-WALLPLANE SHAKING"/* 1D9A5 */, /*44835*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL"/* 1D9A6 */, /*44836*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL"/* 1D9A7 */, /*44837*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL"/* 1D9A8 */, /*44838*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL"/* 1D9A9 */, /*44839*/"SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL"/* 1D9AA */, /*44840*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL"/* 1D9AB */, /*44841*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL"/* 1D9AC */, /*44842*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST"/* 1D9AD */, /*44843*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST"/* 1D9AE */, /*44844*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST"/* 1D9AF */, /*44845*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST"/* 1D9B0 */, /*44846*/"SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST"/* 1D9B1 */, /*44847*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST"/* 1D9B2 */, /*44848*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST"/* 1D9B3 */, /*44849*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL"/* 1D9B4 */, /*44850*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM"/* 1D9B5 */, /*44851*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE"/* 1D9B6 */, /*44852*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL"/* 1D9B7 */, /*44853*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE"/* 1D9B8 */, /*44854*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE"/* 1D9B9 */, /*44855*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE"/* 1D9BA */, /*44856*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE"/* 1D9BB */, /*44857*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE"/* 1D9BC */, /*44858*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE"/* 1D9BD */, /*44859*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE"/* 1D9BE */, /*44860*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE"/* 1D9BF */, /*44861*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE"/* 1D9C0 */, /*44862*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL"/* 1D9C1 */, /*44863*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE"/* 1D9C2 */, /*44864*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING"/* 1D9C3 */, /*44865*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING"/* 1D9C4 */, /*44866*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING"/* 1D9C5 */, /*44867*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL"/* 1D9C6 */, /*44868*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE"/* 1D9C7 */, /*44869*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE"/* 1D9C8 */, /*44870*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE"/* 1D9C9 */, /*44871*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE"/* 1D9CA */, /*44872*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE"/* 1D9CB */, /*44873*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE"/* 1D9CC */, /*44874*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE"/* 1D9CD */, /*44875*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE"/* 1D9CE */, /*44876*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE"/* 1D9CF */, /*44877*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL"/* 1D9D0 */, /*44878*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE"/* 1D9D1 */, /*44879*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR"/* 1D9D2 */, /*44880*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR"/* 1D9D3 */, /*44881*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR"/* 1D9D4 */, /*44882*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL"/* 1D9D5 */, /*44883*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM"/* 1D9D6 */, /*44884*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE"/* 1D9D7 */, /*44885*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST"/* 1D9D8 */, /*44886*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED"/* 1D9D9 */, /*44887*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL"/* 1D9DA */, /*44888*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL"/* 1D9DB */, /*44889*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE"/* 1D9DC */, /*44890*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL"/* 1D9DD */, /*44891*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE"/* 1D9DE */, /*44892*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE"/* 1D9DF */, /*44893*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE"/* 1D9E0 */, /*44894*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING"/* 1D9E1 */, /*44895*/"SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL"/* 1D9E2 */, /*44896*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE"/* 1D9E3 */, /*44897*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE"/* 1D9E4 */, /*44898*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE"/* 1D9E5 */, /*44899*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE"/* 1D9E6 */, /*44900*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE"/* 1D9E7 */, /*44901*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE"/* 1D9E8 */, /*44902*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE"/* 1D9E9 */, /*44903*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE"/* 1D9EA */, /*44904*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE"/* 1D9EB */, /*44905*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE"/* 1D9EC */, /*44906*/"SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE"/* 1D9ED */, /*44907*/"SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE"/* 1D9EE */, /*44908*/"SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE"/* 1D9EF */, /*44909*/"SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE"/* 1D9F0 */, /*44910*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE"/* 1D9F1 */, /*44911*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE"/* 1D9F2 */, /*44912*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE"/* 1D9F3 */, /*44913*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE"/* 1D9F4 */, /*44914*/"SIGNWRITING DYNAMIC ARROWHEAD SMALL"/* 1D9F5 */,/*44915*/"SIGNWRITING DYNAMIC ARROWHEAD LARGE"/* 1D9F6 */, /*44916*/"SIGNWRITING DYNAMIC FAST"/* 1D9F7 */,/*44917*/"SIGNWRITING DYNAMIC SLOW"/* 1D9F8 */, /*44918*/"SIGNWRITING DYNAMIC TENSE"/* 1D9F9 */,/*44919*/"SIGNWRITING DYNAMIC RELAXED"/* 1D9FA */, /*44920*/"SIGNWRITING DYNAMIC SIMULTANEOUS"/* 1D9FB */, /*44921*/"SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING"/* 1D9FC */, /*44922*/"SIGNWRITING DYNAMIC EVERY OTHER TIME"/* 1D9FD */,/*44923*/"SIGNWRITING DYNAMIC GRADUAL"/* 1D9FE */, /*44924*/"SIGNWRITING HEAD"/* 1D9FF */,/*44925*/"SIGNWRITING HEAD RIM"/* 1DA00 */, /*44926*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT"/* 1DA01 */, /*44927*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT"/* 1DA02 */, /*44928*/"SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT"/* 1DA03 */, /*44929*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE"/* 1DA04 */, /*44930*/"SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE"/* 1DA05 */,/*44931*/"SIGNWRITING HEAD MOVEMENT CIRCLE"/* 1DA06 */, /*44932*/"SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING"/* 1DA07 */, /*44933*/"SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN"/* 1DA08 */, /*44934*/"SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING"/* 1DA09 */, /*44935*/"SIGNWRITING EYEBROWS STRAIGHT UP"/* 1DA0A */,/*44936*/"SIGNWRITING EYEBROWS STRAIGHT NEUTRAL"/* 1DA0B */, /*44937*/"SIGNWRITING EYEBROWS STRAIGHT DOWN"/* 1DA0C */,/*44938*/"SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN"/* 1DA0D */, /*44939*/"SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL"/* 1DA0E */, /*44940*/"SIGNWRITING DREAMY EYEBROWS UP NEUTRAL"/* 1DA0F */, /*44941*/"SIGNWRITING DREAMY EYEBROWS NEUTRAL UP"/* 1DA10 */,/*44942*/"SIGNWRITING FOREHEAD NEUTRAL"/* 1DA11 */, /*44943*/"SIGNWRITING FOREHEAD CONTACT"/* 1DA12 */,/*44944*/"SIGNWRITING FOREHEAD WRINKLED"/* 1DA13 */, /*44945*/"SIGNWRITING EYES OPEN"/* 1DA14 */,/*44946*/"SIGNWRITING EYES SQUEEZED"/* 1DA15 */, /*44947*/"SIGNWRITING EYES CLOSED"/* 1DA16 */,/*44948*/"SIGNWRITING EYE BLINK SINGLE"/* 1DA17 */, /*44949*/"SIGNWRITING EYE BLINK MULTIPLE"/* 1DA18 */,/*44950*/"SIGNWRITING EYES HALF OPEN"/* 1DA19 */, /*44951*/"SIGNWRITING EYES WIDE OPEN"/* 1DA1A */,/*44952*/"SIGNWRITING EYES HALF CLOSED"/* 1DA1B */, /*44953*/"SIGNWRITING EYES WIDENING MOVEMENT"/* 1DA1C */,/*44954*/"SIGNWRITING EYE WINK"/* 1DA1D */, /*44955*/"SIGNWRITING EYELASHES UP"/* 1DA1E */,/*44956*/"SIGNWRITING EYELASHES DOWN"/* 1DA1F */, /*44957*/"SIGNWRITING EYELASHES FLUTTERING"/* 1DA20 */,/*44958*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT"/* 1DA21 */, /*44959*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE"/* 1DA22 */, /*44960*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING"/* 1DA23 */, /*44961*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT"/* 1DA24 */, /*44962*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE"/* 1DA25 */, /*44963*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING"/* 1DA26 */, /*44964*/"SIGNWRITING EYEGAZE-WALLPLANE CURVED"/* 1DA27 */,/*44965*/"SIGNWRITING EYEGAZE-FLOORPLANE CURVED"/* 1DA28 */, /*44966*/"SIGNWRITING EYEGAZE-WALLPLANE CIRCLING"/* 1DA29 */,/*44967*/"SIGNWRITING CHEEKS PUFFED"/* 1DA2A */, /*44968*/"SIGNWRITING CHEEKS NEUTRAL"/* 1DA2B */,/*44969*/"SIGNWRITING CHEEKS SUCKED"/* 1DA2C */, /*44970*/"SIGNWRITING TENSE CHEEKS HIGH"/* 1DA2D */,/*44971*/"SIGNWRITING TENSE CHEEKS MIDDLE"/* 1DA2E */, /*44972*/"SIGNWRITING TENSE CHEEKS LOW"/* 1DA2F */,/*44973*/"SIGNWRITING EARS"/* 1DA30 */, /*44974*/"SIGNWRITING NOSE NEUTRAL"/* 1DA31 */,/*44975*/"SIGNWRITING NOSE CONTACT"/* 1DA32 */, /*44976*/"SIGNWRITING NOSE WRINKLES"/* 1DA33 */,/*44977*/"SIGNWRITING NOSE WIGGLES"/* 1DA34 */, /*44978*/"SIGNWRITING AIR BLOWING OUT"/* 1DA35 */,/*44979*/"SIGNWRITING AIR SUCKING IN"/* 1DA36 */, /*44980*/"SIGNWRITING AIR BLOW SMALL ROTATIONS"/* 1DA37 */,/*44981*/"SIGNWRITING AIR SUCK SMALL ROTATIONS"/* 1DA38 */, /*44982*/"SIGNWRITING BREATH INHALE"/* 1DA39 */,/*44983*/"SIGNWRITING BREATH EXHALE"/* 1DA3A */, /*44984*/"SIGNWRITING MOUTH CLOSED NEUTRAL"/* 1DA3B */,/*44985*/"SIGNWRITING MOUTH CLOSED FORWARD"/* 1DA3C */, /*44986*/"SIGNWRITING MOUTH CLOSED CONTACT"/* 1DA3D */,/*44987*/"SIGNWRITING MOUTH SMILE"/* 1DA3E */, /*44988*/"SIGNWRITING MOUTH SMILE WRINKLED"/* 1DA3F */,/*44989*/"SIGNWRITING MOUTH SMILE OPEN"/* 1DA40 */, /*44990*/"SIGNWRITING MOUTH FROWN"/* 1DA41 */,/*44991*/"SIGNWRITING MOUTH FROWN WRINKLED"/* 1DA42 */, /*44992*/"SIGNWRITING MOUTH FROWN OPEN"/* 1DA43 */,/*44993*/"SIGNWRITING MOUTH OPEN CIRCLE"/* 1DA44 */, /*44994*/"SIGNWRITING MOUTH OPEN FORWARD"/* 1DA45 */,/*44995*/"SIGNWRITING MOUTH OPEN WRINKLED"/* 1DA46 */, /*44996*/"SIGNWRITING MOUTH OPEN OVAL"/* 1DA47 */,/*44997*/"SIGNWRITING MOUTH OPEN OVAL WRINKLED"/* 1DA48 */, /*44998*/"SIGNWRITING MOUTH OPEN OVAL YAWN"/* 1DA49 */,/*44999*/"SIGNWRITING MOUTH OPEN RECTANGLE"/* 1DA4A */, /*45000*/"SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED"/* 1DA4B */, /*45001*/"SIGNWRITING MOUTH OPEN RECTANGLE YAWN"/* 1DA4C */,/*45002*/"SIGNWRITING MOUTH KISS"/* 1DA4D */, /*45003*/"SIGNWRITING MOUTH KISS FORWARD"/* 1DA4E */,/*45004*/"SIGNWRITING MOUTH KISS WRINKLED"/* 1DA4F */, /*45005*/"SIGNWRITING MOUTH TENSE"/* 1DA50 */,/*45006*/"SIGNWRITING MOUTH TENSE FORWARD"/* 1DA51 */, /*45007*/"SIGNWRITING MOUTH TENSE SUCKED"/* 1DA52 */,/*45008*/"SIGNWRITING LIPS PRESSED TOGETHER"/* 1DA53 */, /*45009*/"SIGNWRITING LIP LOWER OVER UPPER"/* 1DA54 */,/*45010*/"SIGNWRITING LIP UPPER OVER LOWER"/* 1DA55 */, /*45011*/"SIGNWRITING MOUTH CORNERS"/* 1DA56 */,/*45012*/"SIGNWRITING MOUTH WRINKLES SINGLE"/* 1DA57 */, /*45013*/"SIGNWRITING MOUTH WRINKLES DOUBLE"/* 1DA58 */,/*45014*/"SIGNWRITING TONGUE STICKING OUT FAR"/* 1DA59 */, /*45015*/"SIGNWRITING TONGUE LICKING LIPS"/* 1DA5A */,/*45016*/"SIGNWRITING TONGUE TIP BETWEEN LIPS"/* 1DA5B */, /*45017*/"SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH"/* 1DA5C */, /*45018*/"SIGNWRITING TONGUE INSIDE MOUTH RELAXED"/* 1DA5D */, /*45019*/"SIGNWRITING TONGUE MOVES AGAINST CHEEK"/* 1DA5E */, /*45020*/"SIGNWRITING TONGUE CENTRE STICKING OUT"/* 1DA5F */, /*45021*/"SIGNWRITING TONGUE CENTRE INSIDE MOUTH"/* 1DA60 */,/*45022*/"SIGNWRITING TEETH"/* 1DA61 */, /*45023*/"SIGNWRITING TEETH MOVEMENT"/* 1DA62 */,/*45024*/"SIGNWRITING TEETH ON TONGUE"/* 1DA63 */, /*45025*/"SIGNWRITING TEETH ON TONGUE MOVEMENT"/* 1DA64 */,/*45026*/"SIGNWRITING TEETH ON LIPS"/* 1DA65 */, /*45027*/"SIGNWRITING TEETH ON LIPS MOVEMENT"/* 1DA66 */,/*45028*/"SIGNWRITING TEETH BITE LIPS"/* 1DA67 */, /*45029*/"SIGNWRITING MOVEMENT-WALLPLANE JAW"/* 1DA68 */,/*45030*/"SIGNWRITING MOVEMENT-FLOORPLANE JAW"/* 1DA69 */, /*45031*/"SIGNWRITING NECK"/* 1DA6A */,/*45032*/"SIGNWRITING HAIR"/* 1DA6B */, /*45033*/"SIGNWRITING EXCITEMENT"/* 1DA6C */,/*45034*/"SIGNWRITING SHOULDER HIP SPINE"/* 1DA6D */, /*45035*/"SIGNWRITING SHOULDER HIP POSITIONS"/* 1DA6E */,/*45036*/"SIGNWRITING WALLPLANE SHOULDER HIP MOVE"/* 1DA6F */, /*45037*/"SIGNWRITING FLOORPLANE SHOULDER HIP MOVE"/* 1DA70 */, /*45038*/"SIGNWRITING SHOULDER TILTING FROM WAIST"/* 1DA71 */, /*45039*/"SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH"/* 1DA72 */, /*45040*/"SIGNWRITING TORSO-WALLPLANE CURVED BEND"/* 1DA73 */, /*45041*/"SIGNWRITING TORSO-FLOORPLANE TWISTING"/* 1DA74 */, /*45042*/"SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS"/* 1DA75 */,/*45043*/"SIGNWRITING LIMB COMBINATION"/* 1DA76 */, /*45044*/"SIGNWRITING LIMB LENGTH-1"/* 1DA77 */,/*45045*/"SIGNWRITING LIMB LENGTH-2"/* 1DA78 */, /*45046*/"SIGNWRITING LIMB LENGTH-3"/* 1DA79 */,/*45047*/"SIGNWRITING LIMB LENGTH-4"/* 1DA7A */, /*45048*/"SIGNWRITING LIMB LENGTH-5"/* 1DA7B */,/*45049*/"SIGNWRITING LIMB LENGTH-6"/* 1DA7C */, /*45050*/"SIGNWRITING LIMB LENGTH-7"/* 1DA7D */,/*45051*/"SIGNWRITING FINGER"/* 1DA7E */, /*45052*/"SIGNWRITING LOCATION-WALLPLANE SPACE"/* 1DA7F */,/*45053*/"SIGNWRITING LOCATION-FLOORPLANE SPACE"/* 1DA80 */, /*45054*/"SIGNWRITING LOCATION HEIGHT"/* 1DA81 */,/*45055*/"SIGNWRITING LOCATION WIDTH"/* 1DA82 */, /*45056*/"SIGNWRITING LOCATION DEPTH"/* 1DA83 */,/*45057*/"SIGNWRITING LOCATION HEAD NECK"/* 1DA84 */, /*45058*/"SIGNWRITING LOCATION TORSO"/* 1DA85 */,/*45059*/"SIGNWRITING LOCATION LIMBS DIGITS"/* 1DA86 */, /*45060*/"SIGNWRITING COMMA"/* 1DA87 */,/*45061*/"SIGNWRITING FULL STOP"/* 1DA88 */, /*45062*/"SIGNWRITING SEMICOLON"/* 1DA89 */,/*45063*/"SIGNWRITING COLON"/* 1DA8A */, /*45064*/"SIGNWRITING PARENTHESIS"/* 1DA8B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45080*/"SIGNWRITING FILL MODIFIER-2"/* 1DA9B */,/*45081*/"SIGNWRITING FILL MODIFIER-3"/* 1DA9C */, /*45082*/"SIGNWRITING FILL MODIFIER-4"/* 1DA9D */,/*45083*/"SIGNWRITING FILL MODIFIER-5"/* 1DA9E */, /*45084*/"SIGNWRITING FILL MODIFIER-6"/* 1DA9F */,NULL,/*45086*/"SIGNWRITING ROTATION MODIFIER-2"/* 1DAA1 */, /*45087*/"SIGNWRITING ROTATION MODIFIER-3"/* 1DAA2 */,/*45088*/"SIGNWRITING ROTATION MODIFIER-4"/* 1DAA3 */, /*45089*/"SIGNWRITING ROTATION MODIFIER-5"/* 1DAA4 */,/*45090*/"SIGNWRITING ROTATION MODIFIER-6"/* 1DAA5 */, /*45091*/"SIGNWRITING ROTATION MODIFIER-7"/* 1DAA6 */,/*45092*/"SIGNWRITING ROTATION MODIFIER-8"/* 1DAA7 */, /*45093*/"SIGNWRITING ROTATION MODIFIER-9"/* 1DAA8 */,/*45094*/"SIGNWRITING ROTATION MODIFIER-10"/* 1DAA9 */, /*45095*/"SIGNWRITING ROTATION MODIFIER-11"/* 1DAAA */,/*45096*/"SIGNWRITING ROTATION MODIFIER-12"/* 1DAAB */, /*45097*/"SIGNWRITING ROTATION MODIFIER-13"/* 1DAAC */,/*45098*/"SIGNWRITING ROTATION MODIFIER-14"/* 1DAAD */, /*45099*/"SIGNWRITING ROTATION MODIFIER-15"/* 1DAAE */,/*45100*/"SIGNWRITING ROTATION MODIFIER-16"/* 1DAAF */, /*45101*/"MENDE KIKAKUI SYLLABLE M001 KI"/* 1E800 */,/*45102*/"MENDE KIKAKUI SYLLABLE M002 KA"/* 1E801 */, /*45103*/"MENDE KIKAKUI SYLLABLE M003 KU"/* 1E802 */,/*45104*/"MENDE KIKAKUI SYLLABLE M065 KEE"/* 1E803 */, /*45105*/"MENDE KIKAKUI SYLLABLE M095 KE"/* 1E804 */,/*45106*/"MENDE KIKAKUI SYLLABLE M076 KOO"/* 1E805 */, /*45107*/"MENDE KIKAKUI SYLLABLE M048 KO"/* 1E806 */,/*45108*/"MENDE KIKAKUI SYLLABLE M179 KUA"/* 1E807 */, /*45109*/"MENDE KIKAKUI SYLLABLE M004 WI"/* 1E808 */,/*45110*/"MENDE KIKAKUI SYLLABLE M005 WA"/* 1E809 */, /*45111*/"MENDE KIKAKUI SYLLABLE M006 WU"/* 1E80A */,/*45112*/"MENDE KIKAKUI SYLLABLE M126 WEE"/* 1E80B */, /*45113*/"MENDE KIKAKUI SYLLABLE M118 WE"/* 1E80C */,/*45114*/"MENDE KIKAKUI SYLLABLE M114 WOO"/* 1E80D */, /*45115*/"MENDE KIKAKUI SYLLABLE M045 WO"/* 1E80E */,/*45116*/"MENDE KIKAKUI SYLLABLE M194 WUI"/* 1E80F */, /*45117*/"MENDE KIKAKUI SYLLABLE M143 WEI"/* 1E810 */,/*45118*/"MENDE KIKAKUI SYLLABLE M061 WVI"/* 1E811 */, /*45119*/"MENDE KIKAKUI SYLLABLE M049 WVA"/* 1E812 */,/*45120*/"MENDE KIKAKUI SYLLABLE M139 WVE"/* 1E813 */, /*45121*/"MENDE KIKAKUI SYLLABLE M007 MIN"/* 1E814 */,/*45122*/"MENDE KIKAKUI SYLLABLE M008 MAN"/* 1E815 */, /*45123*/"MENDE KIKAKUI SYLLABLE M009 MUN"/* 1E816 */,/*45124*/"MENDE KIKAKUI SYLLABLE M059 MEN"/* 1E817 */, /*45125*/"MENDE KIKAKUI SYLLABLE M094 MON"/* 1E818 */,/*45126*/"MENDE KIKAKUI SYLLABLE M154 MUAN"/* 1E819 */, /*45127*/"MENDE KIKAKUI SYLLABLE M189 MUEN"/* 1E81A */,/*45128*/"MENDE KIKAKUI SYLLABLE M010 BI"/* 1E81B */, /*45129*/"MENDE KIKAKUI SYLLABLE M011 BA"/* 1E81C */,/*45130*/"MENDE KIKAKUI SYLLABLE M012 BU"/* 1E81D */, /*45131*/"MENDE KIKAKUI SYLLABLE M150 BEE"/* 1E81E */,/*45132*/"MENDE KIKAKUI SYLLABLE M097 BE"/* 1E81F */, /*45133*/"MENDE KIKAKUI SYLLABLE M103 BOO"/* 1E820 */,/*45134*/"MENDE KIKAKUI SYLLABLE M138 BO"/* 1E821 */, /*45135*/"MENDE KIKAKUI SYLLABLE M013 I"/* 1E822 */,/*45136*/"MENDE KIKAKUI SYLLABLE M014 A"/* 1E823 */, /*45137*/"MENDE KIKAKUI SYLLABLE M015 U"/* 1E824 */,/*45138*/"MENDE KIKAKUI SYLLABLE M163 EE"/* 1E825 */, /*45139*/"MENDE KIKAKUI SYLLABLE M100 E"/* 1E826 */,/*45140*/"MENDE KIKAKUI SYLLABLE M165 OO"/* 1E827 */, /*45141*/"MENDE KIKAKUI SYLLABLE M147 O"/* 1E828 */,/*45142*/"MENDE KIKAKUI SYLLABLE M137 EI"/* 1E829 */, /*45143*/"MENDE KIKAKUI SYLLABLE M131 IN"/* 1E82A */,/*45144*/"MENDE KIKAKUI SYLLABLE M135 IN"/* 1E82B */, /*45145*/"MENDE KIKAKUI SYLLABLE M195 AN"/* 1E82C */,/*45146*/"MENDE KIKAKUI SYLLABLE M178 EN"/* 1E82D */, /*45147*/"MENDE KIKAKUI SYLLABLE M019 SI"/* 1E82E */,/*45148*/"MENDE KIKAKUI SYLLABLE M020 SA"/* 1E82F */, /*45149*/"MENDE KIKAKUI SYLLABLE M021 SU"/* 1E830 */,/*45150*/"MENDE KIKAKUI SYLLABLE M162 SEE"/* 1E831 */, /*45151*/"MENDE KIKAKUI SYLLABLE M116 SE"/* 1E832 */,/*45152*/"MENDE KIKAKUI SYLLABLE M136 SOO"/* 1E833 */, /*45153*/"MENDE KIKAKUI SYLLABLE M079 SO"/* 1E834 */,/*45154*/"MENDE KIKAKUI SYLLABLE M196 SIA"/* 1E835 */, /*45155*/"MENDE KIKAKUI SYLLABLE M025 LI"/* 1E836 */,/*45156*/"MENDE KIKAKUI SYLLABLE M026 LA"/* 1E837 */, /*45157*/"MENDE KIKAKUI SYLLABLE M027 LU"/* 1E838 */,/*45158*/"MENDE KIKAKUI SYLLABLE M084 LEE"/* 1E839 */, /*45159*/"MENDE KIKAKUI SYLLABLE M073 LE"/* 1E83A */,/*45160*/"MENDE KIKAKUI SYLLABLE M054 LOO"/* 1E83B */, /*45161*/"MENDE KIKAKUI SYLLABLE M153 LO"/* 1E83C */,/*45162*/"MENDE KIKAKUI SYLLABLE M110 LONG LE"/* 1E83D */, /*45163*/"MENDE KIKAKUI SYLLABLE M016 DI"/* 1E83E */,/*45164*/"MENDE KIKAKUI SYLLABLE M017 DA"/* 1E83F */, /*45165*/"MENDE KIKAKUI SYLLABLE M018 DU"/* 1E840 */,/*45166*/"MENDE KIKAKUI SYLLABLE M089 DEE"/* 1E841 */, /*45167*/"MENDE KIKAKUI SYLLABLE M180 DOO"/* 1E842 */,/*45168*/"MENDE KIKAKUI SYLLABLE M181 DO"/* 1E843 */, /*45169*/"MENDE KIKAKUI SYLLABLE M022 TI"/* 1E844 */,/*45170*/"MENDE KIKAKUI SYLLABLE M023 TA"/* 1E845 */, /*45171*/"MENDE KIKAKUI SYLLABLE M024 TU"/* 1E846 */,/*45172*/"MENDE KIKAKUI SYLLABLE M091 TEE"/* 1E847 */, /*45173*/"MENDE KIKAKUI SYLLABLE M055 TE"/* 1E848 */,/*45174*/"MENDE KIKAKUI SYLLABLE M104 TOO"/* 1E849 */, /*45175*/"MENDE KIKAKUI SYLLABLE M069 TO"/* 1E84A */,/*45176*/"MENDE KIKAKUI SYLLABLE M028 JI"/* 1E84B */, /*45177*/"MENDE KIKAKUI SYLLABLE M029 JA"/* 1E84C */,/*45178*/"MENDE KIKAKUI SYLLABLE M030 JU"/* 1E84D */, /*45179*/"MENDE KIKAKUI SYLLABLE M157 JEE"/* 1E84E */,/*45180*/"MENDE KIKAKUI SYLLABLE M113 JE"/* 1E84F */, /*45181*/"MENDE KIKAKUI SYLLABLE M160 JOO"/* 1E850 */,/*45182*/"MENDE KIKAKUI SYLLABLE M063 JO"/* 1E851 */, /*45183*/"MENDE KIKAKUI SYLLABLE M175 LONG JO"/* 1E852 */,/*45184*/"MENDE KIKAKUI SYLLABLE M031 YI"/* 1E853 */, /*45185*/"MENDE KIKAKUI SYLLABLE M032 YA"/* 1E854 */,/*45186*/"MENDE KIKAKUI SYLLABLE M033 YU"/* 1E855 */, /*45187*/"MENDE KIKAKUI SYLLABLE M109 YEE"/* 1E856 */,/*45188*/"MENDE KIKAKUI SYLLABLE M080 YE"/* 1E857 */, /*45189*/"MENDE KIKAKUI SYLLABLE M141 YOO"/* 1E858 */,/*45190*/"MENDE KIKAKUI SYLLABLE M121 YO"/* 1E859 */, /*45191*/"MENDE KIKAKUI SYLLABLE M034 FI"/* 1E85A */,/*45192*/"MENDE KIKAKUI SYLLABLE M035 FA"/* 1E85B */, /*45193*/"MENDE KIKAKUI SYLLABLE M036 FU"/* 1E85C */,/*45194*/"MENDE KIKAKUI SYLLABLE M078 FEE"/* 1E85D */, /*45195*/"MENDE KIKAKUI SYLLABLE M075 FE"/* 1E85E */,/*45196*/"MENDE KIKAKUI SYLLABLE M133 FOO"/* 1E85F */, /*45197*/"MENDE KIKAKUI SYLLABLE M088 FO"/* 1E860 */,/*45198*/"MENDE KIKAKUI SYLLABLE M197 FUA"/* 1E861 */, /*45199*/"MENDE KIKAKUI SYLLABLE M101 FAN"/* 1E862 */,/*45200*/"MENDE KIKAKUI SYLLABLE M037 NIN"/* 1E863 */, /*45201*/"MENDE KIKAKUI SYLLABLE M038 NAN"/* 1E864 */,/*45202*/"MENDE KIKAKUI SYLLABLE M039 NUN"/* 1E865 */, /*45203*/"MENDE KIKAKUI SYLLABLE M117 NEN"/* 1E866 */,/*45204*/"MENDE KIKAKUI SYLLABLE M169 NON"/* 1E867 */, /*45205*/"MENDE KIKAKUI SYLLABLE M176 HI"/* 1E868 */,/*45206*/"MENDE KIKAKUI SYLLABLE M041 HA"/* 1E869 */, /*45207*/"MENDE KIKAKUI SYLLABLE M186 HU"/* 1E86A */,/*45208*/"MENDE KIKAKUI SYLLABLE M040 HEE"/* 1E86B */, /*45209*/"MENDE KIKAKUI SYLLABLE M096 HE"/* 1E86C */,/*45210*/"MENDE KIKAKUI SYLLABLE M042 HOO"/* 1E86D */, /*45211*/"MENDE KIKAKUI SYLLABLE M140 HO"/* 1E86E */,/*45212*/"MENDE KIKAKUI SYLLABLE M083 HEEI"/* 1E86F */, /*45213*/"MENDE KIKAKUI SYLLABLE M128 HOOU"/* 1E870 */,/*45214*/"MENDE KIKAKUI SYLLABLE M053 HIN"/* 1E871 */, /*45215*/"MENDE KIKAKUI SYLLABLE M130 HAN"/* 1E872 */,/*45216*/"MENDE KIKAKUI SYLLABLE M087 HUN"/* 1E873 */, /*45217*/"MENDE KIKAKUI SYLLABLE M052 HEN"/* 1E874 */,/*45218*/"MENDE KIKAKUI SYLLABLE M193 HON"/* 1E875 */, /*45219*/"MENDE KIKAKUI SYLLABLE M046 HUAN"/* 1E876 */,/*45220*/"MENDE KIKAKUI SYLLABLE M090 NGGI"/* 1E877 */, /*45221*/"MENDE KIKAKUI SYLLABLE M043 NGGA"/* 1E878 */,/*45222*/"MENDE KIKAKUI SYLLABLE M082 NGGU"/* 1E879 */, /*45223*/"MENDE KIKAKUI SYLLABLE M115 NGGEE"/* 1E87A */,/*45224*/"MENDE KIKAKUI SYLLABLE M146 NGGE"/* 1E87B */, /*45225*/"MENDE KIKAKUI SYLLABLE M156 NGGOO"/* 1E87C */,/*45226*/"MENDE KIKAKUI SYLLABLE M120 NGGO"/* 1E87D */, /*45227*/"MENDE KIKAKUI SYLLABLE M159 NGGAA"/* 1E87E */,/*45228*/"MENDE KIKAKUI SYLLABLE M127 NGGUA"/* 1E87F */, /*45229*/"MENDE KIKAKUI SYLLABLE M086 LONG NGGE"/* 1E880 */,/*45230*/"MENDE KIKAKUI SYLLABLE M106 LONG NGGOO"/* 1E881 */, /*45231*/"MENDE KIKAKUI SYLLABLE M183 LONG NGGO"/* 1E882 */,/*45232*/"MENDE KIKAKUI SYLLABLE M155 GI"/* 1E883 */, /*45233*/"MENDE KIKAKUI SYLLABLE M111 GA"/* 1E884 */,/*45234*/"MENDE KIKAKUI SYLLABLE M168 GU"/* 1E885 */, /*45235*/"MENDE KIKAKUI SYLLABLE M190 GEE"/* 1E886 */,/*45236*/"MENDE KIKAKUI SYLLABLE M166 GUEI"/* 1E887 */, /*45237*/"MENDE KIKAKUI SYLLABLE M167 GUAN"/* 1E888 */,/*45238*/"MENDE KIKAKUI SYLLABLE M184 NGEN"/* 1E889 */, /*45239*/"MENDE KIKAKUI SYLLABLE M057 NGON"/* 1E88A */,/*45240*/"MENDE KIKAKUI SYLLABLE M177 NGUAN"/* 1E88B */, /*45241*/"MENDE KIKAKUI SYLLABLE M068 PI"/* 1E88C */,/*45242*/"MENDE KIKAKUI SYLLABLE M099 PA"/* 1E88D */, /*45243*/"MENDE KIKAKUI SYLLABLE M050 PU"/* 1E88E */,/*45244*/"MENDE KIKAKUI SYLLABLE M081 PEE"/* 1E88F */, /*45245*/"MENDE KIKAKUI SYLLABLE M051 PE"/* 1E890 */,/*45246*/"MENDE KIKAKUI SYLLABLE M102 POO"/* 1E891 */, /*45247*/"MENDE KIKAKUI SYLLABLE M066 PO"/* 1E892 */,/*45248*/"MENDE KIKAKUI SYLLABLE M145 MBI"/* 1E893 */, /*45249*/"MENDE KIKAKUI SYLLABLE M062 MBA"/* 1E894 */,/*45250*/"MENDE KIKAKUI SYLLABLE M122 MBU"/* 1E895 */, /*45251*/"MENDE KIKAKUI SYLLABLE M047 MBEE"/* 1E896 */,/*45252*/"MENDE KIKAKUI SYLLABLE M188 MBEE"/* 1E897 */, /*45253*/"MENDE KIKAKUI SYLLABLE M072 MBE"/* 1E898 */,/*45254*/"MENDE KIKAKUI SYLLABLE M172 MBOO"/* 1E899 */, /*45255*/"MENDE KIKAKUI SYLLABLE M174 MBO"/* 1E89A */,/*45256*/"MENDE KIKAKUI SYLLABLE M187 MBUU"/* 1E89B */, /*45257*/"MENDE KIKAKUI SYLLABLE M161 LONG MBE"/* 1E89C */,/*45258*/"MENDE KIKAKUI SYLLABLE M105 LONG MBOO"/* 1E89D */, /*45259*/"MENDE KIKAKUI SYLLABLE M142 LONG MBO"/* 1E89E */,/*45260*/"MENDE KIKAKUI SYLLABLE M132 KPI"/* 1E89F */, /*45261*/"MENDE KIKAKUI SYLLABLE M092 KPA"/* 1E8A0 */,/*45262*/"MENDE KIKAKUI SYLLABLE M074 KPU"/* 1E8A1 */, /*45263*/"MENDE KIKAKUI SYLLABLE M044 KPEE"/* 1E8A2 */,/*45264*/"MENDE KIKAKUI SYLLABLE M108 KPE"/* 1E8A3 */, /*45265*/"MENDE KIKAKUI SYLLABLE M112 KPOO"/* 1E8A4 */,/*45266*/"MENDE KIKAKUI SYLLABLE M158 KPO"/* 1E8A5 */, /*45267*/"MENDE KIKAKUI SYLLABLE M124 GBI"/* 1E8A6 */,/*45268*/"MENDE KIKAKUI SYLLABLE M056 GBA"/* 1E8A7 */, /*45269*/"MENDE KIKAKUI SYLLABLE M148 GBU"/* 1E8A8 */,/*45270*/"MENDE KIKAKUI SYLLABLE M093 GBEE"/* 1E8A9 */, /*45271*/"MENDE KIKAKUI SYLLABLE M107 GBE"/* 1E8AA */,/*45272*/"MENDE KIKAKUI SYLLABLE M071 GBOO"/* 1E8AB */, /*45273*/"MENDE KIKAKUI SYLLABLE M070 GBO"/* 1E8AC */,/*45274*/"MENDE KIKAKUI SYLLABLE M171 RA"/* 1E8AD */, /*45275*/"MENDE KIKAKUI SYLLABLE M123 NDI"/* 1E8AE */,/*45276*/"MENDE KIKAKUI SYLLABLE M129 NDA"/* 1E8AF */, /*45277*/"MENDE KIKAKUI SYLLABLE M125 NDU"/* 1E8B0 */,/*45278*/"MENDE KIKAKUI SYLLABLE M191 NDEE"/* 1E8B1 */, /*45279*/"MENDE KIKAKUI SYLLABLE M119 NDE"/* 1E8B2 */,/*45280*/"MENDE KIKAKUI SYLLABLE M067 NDOO"/* 1E8B3 */, /*45281*/"MENDE KIKAKUI SYLLABLE M064 NDO"/* 1E8B4 */,/*45282*/"MENDE KIKAKUI SYLLABLE M152 NJA"/* 1E8B5 */, /*45283*/"MENDE KIKAKUI SYLLABLE M192 NJU"/* 1E8B6 */,/*45284*/"MENDE KIKAKUI SYLLABLE M149 NJEE"/* 1E8B7 */, /*45285*/"MENDE KIKAKUI SYLLABLE M134 NJOO"/* 1E8B8 */,/*45286*/"MENDE KIKAKUI SYLLABLE M182 VI"/* 1E8B9 */, /*45287*/"MENDE KIKAKUI SYLLABLE M185 VA"/* 1E8BA */,/*45288*/"MENDE KIKAKUI SYLLABLE M151 VU"/* 1E8BB */, /*45289*/"MENDE KIKAKUI SYLLABLE M173 VEE"/* 1E8BC */,/*45290*/"MENDE KIKAKUI SYLLABLE M085 VE"/* 1E8BD */, /*45291*/"MENDE KIKAKUI SYLLABLE M144 VOO"/* 1E8BE */,/*45292*/"MENDE KIKAKUI SYLLABLE M077 VO"/* 1E8BF */, /*45293*/"MENDE KIKAKUI SYLLABLE M164 NYIN"/* 1E8C0 */,/*45294*/"MENDE KIKAKUI SYLLABLE M058 NYAN"/* 1E8C1 */, /*45295*/"MENDE KIKAKUI SYLLABLE M170 NYUN"/* 1E8C2 */,/*45296*/"MENDE KIKAKUI SYLLABLE M098 NYEN"/* 1E8C3 */, /*45297*/"MENDE KIKAKUI SYLLABLE M060 NYON"/* 1E8C4 */,NULL,NULL,/*45300*/"MENDE KIKAKUI DIGIT ONE"/* 1E8C7 */, /*45301*/"MENDE KIKAKUI DIGIT TWO"/* 1E8C8 */,/*45302*/"MENDE KIKAKUI DIGIT THREE"/* 1E8C9 */, /*45303*/"MENDE KIKAKUI DIGIT FOUR"/* 1E8CA */,/*45304*/"MENDE KIKAKUI DIGIT FIVE"/* 1E8CB */, /*45305*/"MENDE KIKAKUI DIGIT SIX"/* 1E8CC */,/*45306*/"MENDE KIKAKUI DIGIT SEVEN"/* 1E8CD */, /*45307*/"MENDE KIKAKUI DIGIT EIGHT"/* 1E8CE */,/*45308*/"MENDE KIKAKUI DIGIT NINE"/* 1E8CF */, /*45309*/"MENDE KIKAKUI COMBINING NUMBER TEENS"/* 1E8D0 */,/*45310*/"MENDE KIKAKUI COMBINING NUMBER TENS"/* 1E8D1 */, /*45311*/"MENDE KIKAKUI COMBINING NUMBER HUNDREDS"/* 1E8D2 */, /*45312*/"MENDE KIKAKUI COMBINING NUMBER THOUSANDS"/* 1E8D3 */, /*45313*/"MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS"/* 1E8D4 */, /*45314*/"MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS"/* 1E8D5 */, /*45315*/"MENDE KIKAKUI COMBINING NUMBER MILLIONS"/* 1E8D6 */,/*45316*/"ARABIC MATHEMATICAL ALEF"/* 1EE00 */, /*45317*/"ARABIC MATHEMATICAL BEH"/* 1EE01 */,/*45318*/"ARABIC MATHEMATICAL JEEM"/* 1EE02 */, /*45319*/"ARABIC MATHEMATICAL DAL"/* 1EE03 */,NULL,/*45321*/"ARABIC MATHEMATICAL WAW"/* 1EE05 */, /*45322*/"ARABIC MATHEMATICAL ZAIN"/* 1EE06 */,/*45323*/"ARABIC MATHEMATICAL HAH"/* 1EE07 */, /*45324*/"ARABIC MATHEMATICAL TAH"/* 1EE08 */,/*45325*/"ARABIC MATHEMATICAL YEH"/* 1EE09 */, /*45326*/"ARABIC MATHEMATICAL KAF"/* 1EE0A */,/*45327*/"ARABIC MATHEMATICAL LAM"/* 1EE0B */, /*45328*/"ARABIC MATHEMATICAL MEEM"/* 1EE0C */,/*45329*/"ARABIC MATHEMATICAL NOON"/* 1EE0D */, /*45330*/"ARABIC MATHEMATICAL SEEN"/* 1EE0E */,/*45331*/"ARABIC MATHEMATICAL AIN"/* 1EE0F */, /*45332*/"ARABIC MATHEMATICAL FEH"/* 1EE10 */,/*45333*/"ARABIC MATHEMATICAL SAD"/* 1EE11 */, /*45334*/"ARABIC MATHEMATICAL QAF"/* 1EE12 */,/*45335*/"ARABIC MATHEMATICAL REH"/* 1EE13 */, /*45336*/"ARABIC MATHEMATICAL SHEEN"/* 1EE14 */,/*45337*/"ARABIC MATHEMATICAL TEH"/* 1EE15 */, /*45338*/"ARABIC MATHEMATICAL THEH"/* 1EE16 */,/*45339*/"ARABIC MATHEMATICAL KHAH"/* 1EE17 */, /*45340*/"ARABIC MATHEMATICAL THAL"/* 1EE18 */,/*45341*/"ARABIC MATHEMATICAL DAD"/* 1EE19 */, /*45342*/"ARABIC MATHEMATICAL ZAH"/* 1EE1A */,/*45343*/"ARABIC MATHEMATICAL GHAIN"/* 1EE1B */, /*45344*/"ARABIC MATHEMATICAL DOTLESS BEH"/* 1EE1C */,/*45345*/"ARABIC MATHEMATICAL DOTLESS NOON"/* 1EE1D */, /*45346*/"ARABIC MATHEMATICAL DOTLESS FEH"/* 1EE1E */,/*45347*/"ARABIC MATHEMATICAL DOTLESS QAF"/* 1EE1F */,NULL, /*45349*/"ARABIC MATHEMATICAL INITIAL BEH"/* 1EE21 */,/*45350*/"ARABIC MATHEMATICAL INITIAL JEEM"/* 1EE22 */,NULL, /*45352*/"ARABIC MATHEMATICAL INITIAL HEH"/* 1EE24 */,NULL,NULL,/*45355*/"ARABIC MATHEMATICAL INITIAL HAH"/* 1EE27 */, NULL,/*45357*/"ARABIC MATHEMATICAL INITIAL YEH"/* 1EE29 */,/*45358*/"ARABIC MATHEMATICAL INITIAL KAF"/* 1EE2A */, /*45359*/"ARABIC MATHEMATICAL INITIAL LAM"/* 1EE2B */,/*45360*/"ARABIC MATHEMATICAL INITIAL MEEM"/* 1EE2C */, /*45361*/"ARABIC MATHEMATICAL INITIAL NOON"/* 1EE2D */,/*45362*/"ARABIC MATHEMATICAL INITIAL SEEN"/* 1EE2E */, /*45363*/"ARABIC MATHEMATICAL INITIAL AIN"/* 1EE2F */,/*45364*/"ARABIC MATHEMATICAL INITIAL FEH"/* 1EE30 */, /*45365*/"ARABIC MATHEMATICAL INITIAL SAD"/* 1EE31 */,/*45366*/"ARABIC MATHEMATICAL INITIAL QAF"/* 1EE32 */,NULL, /*45368*/"ARABIC MATHEMATICAL INITIAL SHEEN"/* 1EE34 */,/*45369*/"ARABIC MATHEMATICAL INITIAL TEH"/* 1EE35 */, /*45370*/"ARABIC MATHEMATICAL INITIAL THEH"/* 1EE36 */,/*45371*/"ARABIC MATHEMATICAL INITIAL KHAH"/* 1EE37 */,NULL, /*45373*/"ARABIC MATHEMATICAL INITIAL DAD"/* 1EE39 */,NULL,/*45375*/"ARABIC MATHEMATICAL INITIAL GHAIN"/* 1EE3B */,NULL, NULL,NULL,NULL,NULL,NULL,/*45382*/"ARABIC MATHEMATICAL TAILED JEEM"/* 1EE42 */,NULL,NULL,NULL,NULL, /*45387*/"ARABIC MATHEMATICAL TAILED HAH"/* 1EE47 */,NULL,/*45389*/"ARABIC MATHEMATICAL TAILED YEH"/* 1EE49 */,NULL, /*45391*/"ARABIC MATHEMATICAL TAILED LAM"/* 1EE4B */,NULL,/*45393*/"ARABIC MATHEMATICAL TAILED NOON"/* 1EE4D */, /*45394*/"ARABIC MATHEMATICAL TAILED SEEN"/* 1EE4E */,/*45395*/"ARABIC MATHEMATICAL TAILED AIN"/* 1EE4F */,NULL, /*45397*/"ARABIC MATHEMATICAL TAILED SAD"/* 1EE51 */,/*45398*/"ARABIC MATHEMATICAL TAILED QAF"/* 1EE52 */,NULL, /*45400*/"ARABIC MATHEMATICAL TAILED SHEEN"/* 1EE54 */,NULL,NULL,/*45403*/"ARABIC MATHEMATICAL TAILED KHAH"/* 1EE57 */, NULL,/*45405*/"ARABIC MATHEMATICAL TAILED DAD"/* 1EE59 */,NULL,/*45407*/"ARABIC MATHEMATICAL TAILED GHAIN"/* 1EE5B */, NULL,/*45409*/"ARABIC MATHEMATICAL TAILED DOTLESS NOON"/* 1EE5D */,NULL, /*45411*/"ARABIC MATHEMATICAL TAILED DOTLESS QAF"/* 1EE5F */,NULL, /*45413*/"ARABIC MATHEMATICAL STRETCHED BEH"/* 1EE61 */,/*45414*/"ARABIC MATHEMATICAL STRETCHED JEEM"/* 1EE62 */,NULL, /*45416*/"ARABIC MATHEMATICAL STRETCHED HEH"/* 1EE64 */,NULL,NULL, /*45419*/"ARABIC MATHEMATICAL STRETCHED HAH"/* 1EE67 */,/*45420*/"ARABIC MATHEMATICAL STRETCHED TAH"/* 1EE68 */, /*45421*/"ARABIC MATHEMATICAL STRETCHED YEH"/* 1EE69 */,/*45422*/"ARABIC MATHEMATICAL STRETCHED KAF"/* 1EE6A */,NULL, /*45424*/"ARABIC MATHEMATICAL STRETCHED MEEM"/* 1EE6C */,/*45425*/"ARABIC MATHEMATICAL STRETCHED NOON"/* 1EE6D */, /*45426*/"ARABIC MATHEMATICAL STRETCHED SEEN"/* 1EE6E */,/*45427*/"ARABIC MATHEMATICAL STRETCHED AIN"/* 1EE6F */, /*45428*/"ARABIC MATHEMATICAL STRETCHED FEH"/* 1EE70 */,/*45429*/"ARABIC MATHEMATICAL STRETCHED SAD"/* 1EE71 */, /*45430*/"ARABIC MATHEMATICAL STRETCHED QAF"/* 1EE72 */,NULL,/*45432*/"ARABIC MATHEMATICAL STRETCHED SHEEN"/* 1EE74 */, /*45433*/"ARABIC MATHEMATICAL STRETCHED TEH"/* 1EE75 */,/*45434*/"ARABIC MATHEMATICAL STRETCHED THEH"/* 1EE76 */, /*45435*/"ARABIC MATHEMATICAL STRETCHED KHAH"/* 1EE77 */,NULL,/*45437*/"ARABIC MATHEMATICAL STRETCHED DAD"/* 1EE79 */, /*45438*/"ARABIC MATHEMATICAL STRETCHED ZAH"/* 1EE7A */,/*45439*/"ARABIC MATHEMATICAL STRETCHED GHAIN"/* 1EE7B */, /*45440*/"ARABIC MATHEMATICAL STRETCHED DOTLESS BEH"/* 1EE7C */,NULL, /*45442*/"ARABIC MATHEMATICAL STRETCHED DOTLESS FEH"/* 1EE7E */,NULL, /*45444*/"ARABIC MATHEMATICAL LOOPED ALEF"/* 1EE80 */,/*45445*/"ARABIC MATHEMATICAL LOOPED BEH"/* 1EE81 */, /*45446*/"ARABIC MATHEMATICAL LOOPED JEEM"/* 1EE82 */,/*45447*/"ARABIC MATHEMATICAL LOOPED DAL"/* 1EE83 */, /*45448*/"ARABIC MATHEMATICAL LOOPED HEH"/* 1EE84 */,/*45449*/"ARABIC MATHEMATICAL LOOPED WAW"/* 1EE85 */, /*45450*/"ARABIC MATHEMATICAL LOOPED ZAIN"/* 1EE86 */,/*45451*/"ARABIC MATHEMATICAL LOOPED HAH"/* 1EE87 */, /*45452*/"ARABIC MATHEMATICAL LOOPED TAH"/* 1EE88 */,/*45453*/"ARABIC MATHEMATICAL LOOPED YEH"/* 1EE89 */,NULL, /*45455*/"ARABIC MATHEMATICAL LOOPED LAM"/* 1EE8B */,/*45456*/"ARABIC MATHEMATICAL LOOPED MEEM"/* 1EE8C */, /*45457*/"ARABIC MATHEMATICAL LOOPED NOON"/* 1EE8D */,/*45458*/"ARABIC MATHEMATICAL LOOPED SEEN"/* 1EE8E */, /*45459*/"ARABIC MATHEMATICAL LOOPED AIN"/* 1EE8F */,/*45460*/"ARABIC MATHEMATICAL LOOPED FEH"/* 1EE90 */, /*45461*/"ARABIC MATHEMATICAL LOOPED SAD"/* 1EE91 */,/*45462*/"ARABIC MATHEMATICAL LOOPED QAF"/* 1EE92 */, /*45463*/"ARABIC MATHEMATICAL LOOPED REH"/* 1EE93 */,/*45464*/"ARABIC MATHEMATICAL LOOPED SHEEN"/* 1EE94 */, /*45465*/"ARABIC MATHEMATICAL LOOPED TEH"/* 1EE95 */,/*45466*/"ARABIC MATHEMATICAL LOOPED THEH"/* 1EE96 */, /*45467*/"ARABIC MATHEMATICAL LOOPED KHAH"/* 1EE97 */,/*45468*/"ARABIC MATHEMATICAL LOOPED THAL"/* 1EE98 */, /*45469*/"ARABIC MATHEMATICAL LOOPED DAD"/* 1EE99 */,/*45470*/"ARABIC MATHEMATICAL LOOPED ZAH"/* 1EE9A */, /*45471*/"ARABIC MATHEMATICAL LOOPED GHAIN"/* 1EE9B */,NULL,NULL,NULL,NULL,NULL, /*45477*/"ARABIC MATHEMATICAL DOUBLE-STRUCK BEH"/* 1EEA1 */,/*45478*/"ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM"/* 1EEA2 */, /*45479*/"ARABIC MATHEMATICAL DOUBLE-STRUCK DAL"/* 1EEA3 */,NULL, /*45481*/"ARABIC MATHEMATICAL DOUBLE-STRUCK WAW"/* 1EEA5 */,/*45482*/"ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN"/* 1EEA6 */, /*45483*/"ARABIC MATHEMATICAL DOUBLE-STRUCK HAH"/* 1EEA7 */,/*45484*/"ARABIC MATHEMATICAL DOUBLE-STRUCK TAH"/* 1EEA8 */, /*45485*/"ARABIC MATHEMATICAL DOUBLE-STRUCK YEH"/* 1EEA9 */,NULL, /*45487*/"ARABIC MATHEMATICAL DOUBLE-STRUCK LAM"/* 1EEAB */,/*45488*/"ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM"/* 1EEAC */, /*45489*/"ARABIC MATHEMATICAL DOUBLE-STRUCK NOON"/* 1EEAD */, /*45490*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN"/* 1EEAE */,/*45491*/"ARABIC MATHEMATICAL DOUBLE-STRUCK AIN"/* 1EEAF */, /*45492*/"ARABIC MATHEMATICAL DOUBLE-STRUCK FEH"/* 1EEB0 */,/*45493*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SAD"/* 1EEB1 */, /*45494*/"ARABIC MATHEMATICAL DOUBLE-STRUCK QAF"/* 1EEB2 */,/*45495*/"ARABIC MATHEMATICAL DOUBLE-STRUCK REH"/* 1EEB3 */, /*45496*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN"/* 1EEB4 */, /*45497*/"ARABIC MATHEMATICAL DOUBLE-STRUCK TEH"/* 1EEB5 */,/*45498*/"ARABIC MATHEMATICAL DOUBLE-STRUCK THEH"/* 1EEB6 */, /*45499*/"ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH"/* 1EEB7 */, /*45500*/"ARABIC MATHEMATICAL DOUBLE-STRUCK THAL"/* 1EEB8 */,/*45501*/"ARABIC MATHEMATICAL DOUBLE-STRUCK DAD"/* 1EEB9 */, /*45502*/"ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH"/* 1EEBA */, /*45503*/"ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN"/* 1EEBB */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45556*/"ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL"/* 1EEF0 */, /*45557*/"ARABIC MATHEMATICAL OPERATOR HAH WITH DAL"/* 1EEF1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45828*/"MAHJONG TILE EAST WIND"/* 1F000 */,/*45829*/"MAHJONG TILE SOUTH WIND"/* 1F001 */, /*45830*/"MAHJONG TILE WEST WIND"/* 1F002 */,/*45831*/"MAHJONG TILE NORTH WIND"/* 1F003 */, /*45832*/"MAHJONG TILE RED DRAGON"/* 1F004 */,/*45833*/"MAHJONG TILE GREEN DRAGON"/* 1F005 */, /*45834*/"MAHJONG TILE WHITE DRAGON"/* 1F006 */,/*45835*/"MAHJONG TILE ONE OF CHARACTERS"/* 1F007 */, /*45836*/"MAHJONG TILE TWO OF CHARACTERS"/* 1F008 */,/*45837*/"MAHJONG TILE THREE OF CHARACTERS"/* 1F009 */, /*45838*/"MAHJONG TILE FOUR OF CHARACTERS"/* 1F00A */,/*45839*/"MAHJONG TILE FIVE OF CHARACTERS"/* 1F00B */, /*45840*/"MAHJONG TILE SIX OF CHARACTERS"/* 1F00C */,/*45841*/"MAHJONG TILE SEVEN OF CHARACTERS"/* 1F00D */, /*45842*/"MAHJONG TILE EIGHT OF CHARACTERS"/* 1F00E */,/*45843*/"MAHJONG TILE NINE OF CHARACTERS"/* 1F00F */, /*45844*/"MAHJONG TILE ONE OF BAMBOOS"/* 1F010 */,/*45845*/"MAHJONG TILE TWO OF BAMBOOS"/* 1F011 */, /*45846*/"MAHJONG TILE THREE OF BAMBOOS"/* 1F012 */,/*45847*/"MAHJONG TILE FOUR OF BAMBOOS"/* 1F013 */, /*45848*/"MAHJONG TILE FIVE OF BAMBOOS"/* 1F014 */,/*45849*/"MAHJONG TILE SIX OF BAMBOOS"/* 1F015 */, /*45850*/"MAHJONG TILE SEVEN OF BAMBOOS"/* 1F016 */,/*45851*/"MAHJONG TILE EIGHT OF BAMBOOS"/* 1F017 */, /*45852*/"MAHJONG TILE NINE OF BAMBOOS"/* 1F018 */,/*45853*/"MAHJONG TILE ONE OF CIRCLES"/* 1F019 */, /*45854*/"MAHJONG TILE TWO OF CIRCLES"/* 1F01A */,/*45855*/"MAHJONG TILE THREE OF CIRCLES"/* 1F01B */, /*45856*/"MAHJONG TILE FOUR OF CIRCLES"/* 1F01C */,/*45857*/"MAHJONG TILE FIVE OF CIRCLES"/* 1F01D */, /*45858*/"MAHJONG TILE SIX OF CIRCLES"/* 1F01E */,/*45859*/"MAHJONG TILE SEVEN OF CIRCLES"/* 1F01F */, /*45860*/"MAHJONG TILE EIGHT OF CIRCLES"/* 1F020 */,/*45861*/"MAHJONG TILE NINE OF CIRCLES"/* 1F021 */, /*45862*/"MAHJONG TILE PLUM"/* 1F022 */,/*45863*/"MAHJONG TILE ORCHID"/* 1F023 */, /*45864*/"MAHJONG TILE BAMBOO"/* 1F024 */,/*45865*/"MAHJONG TILE CHRYSANTHEMUM"/* 1F025 */, /*45866*/"MAHJONG TILE SPRING"/* 1F026 */,/*45867*/"MAHJONG TILE SUMMER"/* 1F027 */, /*45868*/"MAHJONG TILE AUTUMN"/* 1F028 */,/*45869*/"MAHJONG TILE WINTER"/* 1F029 */, /*45870*/"MAHJONG TILE JOKER"/* 1F02A */,/*45871*/"MAHJONG TILE BACK"/* 1F02B */,NULL,NULL,NULL,NULL, /*45876*/"DOMINO TILE HORIZONTAL BACK"/* 1F030 */,/*45877*/"DOMINO TILE HORIZONTAL-00-00"/* 1F031 */, /*45878*/"DOMINO TILE HORIZONTAL-00-01"/* 1F032 */,/*45879*/"DOMINO TILE HORIZONTAL-00-02"/* 1F033 */, /*45880*/"DOMINO TILE HORIZONTAL-00-03"/* 1F034 */,/*45881*/"DOMINO TILE HORIZONTAL-00-04"/* 1F035 */, /*45882*/"DOMINO TILE HORIZONTAL-00-05"/* 1F036 */,/*45883*/"DOMINO TILE HORIZONTAL-00-06"/* 1F037 */, /*45884*/"DOMINO TILE HORIZONTAL-01-00"/* 1F038 */,/*45885*/"DOMINO TILE HORIZONTAL-01-01"/* 1F039 */, /*45886*/"DOMINO TILE HORIZONTAL-01-02"/* 1F03A */,/*45887*/"DOMINO TILE HORIZONTAL-01-03"/* 1F03B */, /*45888*/"DOMINO TILE HORIZONTAL-01-04"/* 1F03C */,/*45889*/"DOMINO TILE HORIZONTAL-01-05"/* 1F03D */, /*45890*/"DOMINO TILE HORIZONTAL-01-06"/* 1F03E */,/*45891*/"DOMINO TILE HORIZONTAL-02-00"/* 1F03F */, /*45892*/"DOMINO TILE HORIZONTAL-02-01"/* 1F040 */,/*45893*/"DOMINO TILE HORIZONTAL-02-02"/* 1F041 */, /*45894*/"DOMINO TILE HORIZONTAL-02-03"/* 1F042 */,/*45895*/"DOMINO TILE HORIZONTAL-02-04"/* 1F043 */, /*45896*/"DOMINO TILE HORIZONTAL-02-05"/* 1F044 */,/*45897*/"DOMINO TILE HORIZONTAL-02-06"/* 1F045 */, /*45898*/"DOMINO TILE HORIZONTAL-03-00"/* 1F046 */,/*45899*/"DOMINO TILE HORIZONTAL-03-01"/* 1F047 */, /*45900*/"DOMINO TILE HORIZONTAL-03-02"/* 1F048 */,/*45901*/"DOMINO TILE HORIZONTAL-03-03"/* 1F049 */, /*45902*/"DOMINO TILE HORIZONTAL-03-04"/* 1F04A */,/*45903*/"DOMINO TILE HORIZONTAL-03-05"/* 1F04B */, /*45904*/"DOMINO TILE HORIZONTAL-03-06"/* 1F04C */,/*45905*/"DOMINO TILE HORIZONTAL-04-00"/* 1F04D */, /*45906*/"DOMINO TILE HORIZONTAL-04-01"/* 1F04E */,/*45907*/"DOMINO TILE HORIZONTAL-04-02"/* 1F04F */, /*45908*/"DOMINO TILE HORIZONTAL-04-03"/* 1F050 */,/*45909*/"DOMINO TILE HORIZONTAL-04-04"/* 1F051 */, /*45910*/"DOMINO TILE HORIZONTAL-04-05"/* 1F052 */,/*45911*/"DOMINO TILE HORIZONTAL-04-06"/* 1F053 */, /*45912*/"DOMINO TILE HORIZONTAL-05-00"/* 1F054 */,/*45913*/"DOMINO TILE HORIZONTAL-05-01"/* 1F055 */, /*45914*/"DOMINO TILE HORIZONTAL-05-02"/* 1F056 */,/*45915*/"DOMINO TILE HORIZONTAL-05-03"/* 1F057 */, /*45916*/"DOMINO TILE HORIZONTAL-05-04"/* 1F058 */,/*45917*/"DOMINO TILE HORIZONTAL-05-05"/* 1F059 */, /*45918*/"DOMINO TILE HORIZONTAL-05-06"/* 1F05A */,/*45919*/"DOMINO TILE HORIZONTAL-06-00"/* 1F05B */, /*45920*/"DOMINO TILE HORIZONTAL-06-01"/* 1F05C */,/*45921*/"DOMINO TILE HORIZONTAL-06-02"/* 1F05D */, /*45922*/"DOMINO TILE HORIZONTAL-06-03"/* 1F05E */,/*45923*/"DOMINO TILE HORIZONTAL-06-04"/* 1F05F */, /*45924*/"DOMINO TILE HORIZONTAL-06-05"/* 1F060 */,/*45925*/"DOMINO TILE HORIZONTAL-06-06"/* 1F061 */, /*45926*/"DOMINO TILE VERTICAL BACK"/* 1F062 */,/*45927*/"DOMINO TILE VERTICAL-00-00"/* 1F063 */, /*45928*/"DOMINO TILE VERTICAL-00-01"/* 1F064 */,/*45929*/"DOMINO TILE VERTICAL-00-02"/* 1F065 */, /*45930*/"DOMINO TILE VERTICAL-00-03"/* 1F066 */,/*45931*/"DOMINO TILE VERTICAL-00-04"/* 1F067 */, /*45932*/"DOMINO TILE VERTICAL-00-05"/* 1F068 */,/*45933*/"DOMINO TILE VERTICAL-00-06"/* 1F069 */, /*45934*/"DOMINO TILE VERTICAL-01-00"/* 1F06A */,/*45935*/"DOMINO TILE VERTICAL-01-01"/* 1F06B */, /*45936*/"DOMINO TILE VERTICAL-01-02"/* 1F06C */,/*45937*/"DOMINO TILE VERTICAL-01-03"/* 1F06D */, /*45938*/"DOMINO TILE VERTICAL-01-04"/* 1F06E */,/*45939*/"DOMINO TILE VERTICAL-01-05"/* 1F06F */, /*45940*/"DOMINO TILE VERTICAL-01-06"/* 1F070 */,/*45941*/"DOMINO TILE VERTICAL-02-00"/* 1F071 */, /*45942*/"DOMINO TILE VERTICAL-02-01"/* 1F072 */,/*45943*/"DOMINO TILE VERTICAL-02-02"/* 1F073 */, /*45944*/"DOMINO TILE VERTICAL-02-03"/* 1F074 */,/*45945*/"DOMINO TILE VERTICAL-02-04"/* 1F075 */, /*45946*/"DOMINO TILE VERTICAL-02-05"/* 1F076 */,/*45947*/"DOMINO TILE VERTICAL-02-06"/* 1F077 */, /*45948*/"DOMINO TILE VERTICAL-03-00"/* 1F078 */,/*45949*/"DOMINO TILE VERTICAL-03-01"/* 1F079 */, /*45950*/"DOMINO TILE VERTICAL-03-02"/* 1F07A */,/*45951*/"DOMINO TILE VERTICAL-03-03"/* 1F07B */, /*45952*/"DOMINO TILE VERTICAL-03-04"/* 1F07C */,/*45953*/"DOMINO TILE VERTICAL-03-05"/* 1F07D */, /*45954*/"DOMINO TILE VERTICAL-03-06"/* 1F07E */,/*45955*/"DOMINO TILE VERTICAL-04-00"/* 1F07F */, /*45956*/"DOMINO TILE VERTICAL-04-01"/* 1F080 */,/*45957*/"DOMINO TILE VERTICAL-04-02"/* 1F081 */, /*45958*/"DOMINO TILE VERTICAL-04-03"/* 1F082 */,/*45959*/"DOMINO TILE VERTICAL-04-04"/* 1F083 */, /*45960*/"DOMINO TILE VERTICAL-04-05"/* 1F084 */,/*45961*/"DOMINO TILE VERTICAL-04-06"/* 1F085 */, /*45962*/"DOMINO TILE VERTICAL-05-00"/* 1F086 */,/*45963*/"DOMINO TILE VERTICAL-05-01"/* 1F087 */, /*45964*/"DOMINO TILE VERTICAL-05-02"/* 1F088 */,/*45965*/"DOMINO TILE VERTICAL-05-03"/* 1F089 */, /*45966*/"DOMINO TILE VERTICAL-05-04"/* 1F08A */,/*45967*/"DOMINO TILE VERTICAL-05-05"/* 1F08B */, /*45968*/"DOMINO TILE VERTICAL-05-06"/* 1F08C */,/*45969*/"DOMINO TILE VERTICAL-06-00"/* 1F08D */, /*45970*/"DOMINO TILE VERTICAL-06-01"/* 1F08E */,/*45971*/"DOMINO TILE VERTICAL-06-02"/* 1F08F */, /*45972*/"DOMINO TILE VERTICAL-06-03"/* 1F090 */,/*45973*/"DOMINO TILE VERTICAL-06-04"/* 1F091 */, /*45974*/"DOMINO TILE VERTICAL-06-05"/* 1F092 */,/*45975*/"DOMINO TILE VERTICAL-06-06"/* 1F093 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*45988*/"PLAYING CARD BACK"/* 1F0A0 */, /*45989*/"PLAYING CARD ACE OF SPADES"/* 1F0A1 */,/*45990*/"PLAYING CARD TWO OF SPADES"/* 1F0A2 */, /*45991*/"PLAYING CARD THREE OF SPADES"/* 1F0A3 */,/*45992*/"PLAYING CARD FOUR OF SPADES"/* 1F0A4 */, /*45993*/"PLAYING CARD FIVE OF SPADES"/* 1F0A5 */,/*45994*/"PLAYING CARD SIX OF SPADES"/* 1F0A6 */, /*45995*/"PLAYING CARD SEVEN OF SPADES"/* 1F0A7 */,/*45996*/"PLAYING CARD EIGHT OF SPADES"/* 1F0A8 */, /*45997*/"PLAYING CARD NINE OF SPADES"/* 1F0A9 */,/*45998*/"PLAYING CARD TEN OF SPADES"/* 1F0AA */, /*45999*/"PLAYING CARD JACK OF SPADES"/* 1F0AB */,/*46000*/"PLAYING CARD KNIGHT OF SPADES"/* 1F0AC */, /*46001*/"PLAYING CARD QUEEN OF SPADES"/* 1F0AD */,/*46002*/"PLAYING CARD KING OF SPADES"/* 1F0AE */,NULL,NULL, /*46005*/"PLAYING CARD ACE OF HEARTS"/* 1F0B1 */,/*46006*/"PLAYING CARD TWO OF HEARTS"/* 1F0B2 */, /*46007*/"PLAYING CARD THREE OF HEARTS"/* 1F0B3 */,/*46008*/"PLAYING CARD FOUR OF HEARTS"/* 1F0B4 */, /*46009*/"PLAYING CARD FIVE OF HEARTS"/* 1F0B5 */,/*46010*/"PLAYING CARD SIX OF HEARTS"/* 1F0B6 */, /*46011*/"PLAYING CARD SEVEN OF HEARTS"/* 1F0B7 */,/*46012*/"PLAYING CARD EIGHT OF HEARTS"/* 1F0B8 */, /*46013*/"PLAYING CARD NINE OF HEARTS"/* 1F0B9 */,/*46014*/"PLAYING CARD TEN OF HEARTS"/* 1F0BA */, /*46015*/"PLAYING CARD JACK OF HEARTS"/* 1F0BB */,/*46016*/"PLAYING CARD KNIGHT OF HEARTS"/* 1F0BC */, /*46017*/"PLAYING CARD QUEEN OF HEARTS"/* 1F0BD */,/*46018*/"PLAYING CARD KING OF HEARTS"/* 1F0BE */, /*46019*/"PLAYING CARD RED JOKER"/* 1F0BF */,NULL,/*46021*/"PLAYING CARD ACE OF DIAMONDS"/* 1F0C1 */, /*46022*/"PLAYING CARD TWO OF DIAMONDS"/* 1F0C2 */,/*46023*/"PLAYING CARD THREE OF DIAMONDS"/* 1F0C3 */, /*46024*/"PLAYING CARD FOUR OF DIAMONDS"/* 1F0C4 */,/*46025*/"PLAYING CARD FIVE OF DIAMONDS"/* 1F0C5 */, /*46026*/"PLAYING CARD SIX OF DIAMONDS"/* 1F0C6 */,/*46027*/"PLAYING CARD SEVEN OF DIAMONDS"/* 1F0C7 */, /*46028*/"PLAYING CARD EIGHT OF DIAMONDS"/* 1F0C8 */,/*46029*/"PLAYING CARD NINE OF DIAMONDS"/* 1F0C9 */, /*46030*/"PLAYING CARD TEN OF DIAMONDS"/* 1F0CA */,/*46031*/"PLAYING CARD JACK OF DIAMONDS"/* 1F0CB */, /*46032*/"PLAYING CARD KNIGHT OF DIAMONDS"/* 1F0CC */,/*46033*/"PLAYING CARD QUEEN OF DIAMONDS"/* 1F0CD */, /*46034*/"PLAYING CARD KING OF DIAMONDS"/* 1F0CE */,/*46035*/"PLAYING CARD BLACK JOKER"/* 1F0CF */,NULL, /*46037*/"PLAYING CARD ACE OF CLUBS"/* 1F0D1 */,/*46038*/"PLAYING CARD TWO OF CLUBS"/* 1F0D2 */, /*46039*/"PLAYING CARD THREE OF CLUBS"/* 1F0D3 */,/*46040*/"PLAYING CARD FOUR OF CLUBS"/* 1F0D4 */, /*46041*/"PLAYING CARD FIVE OF CLUBS"/* 1F0D5 */,/*46042*/"PLAYING CARD SIX OF CLUBS"/* 1F0D6 */, /*46043*/"PLAYING CARD SEVEN OF CLUBS"/* 1F0D7 */,/*46044*/"PLAYING CARD EIGHT OF CLUBS"/* 1F0D8 */, /*46045*/"PLAYING CARD NINE OF CLUBS"/* 1F0D9 */,/*46046*/"PLAYING CARD TEN OF CLUBS"/* 1F0DA */, /*46047*/"PLAYING CARD JACK OF CLUBS"/* 1F0DB */,/*46048*/"PLAYING CARD KNIGHT OF CLUBS"/* 1F0DC */, /*46049*/"PLAYING CARD QUEEN OF CLUBS"/* 1F0DD */,/*46050*/"PLAYING CARD KING OF CLUBS"/* 1F0DE */, /*46051*/"PLAYING CARD WHITE JOKER"/* 1F0DF */,/*46052*/"PLAYING CARD FOOL"/* 1F0E0 */, /*46053*/"PLAYING CARD TRUMP-1"/* 1F0E1 */,/*46054*/"PLAYING CARD TRUMP-2"/* 1F0E2 */, /*46055*/"PLAYING CARD TRUMP-3"/* 1F0E3 */,/*46056*/"PLAYING CARD TRUMP-4"/* 1F0E4 */, /*46057*/"PLAYING CARD TRUMP-5"/* 1F0E5 */,/*46058*/"PLAYING CARD TRUMP-6"/* 1F0E6 */, /*46059*/"PLAYING CARD TRUMP-7"/* 1F0E7 */,/*46060*/"PLAYING CARD TRUMP-8"/* 1F0E8 */, /*46061*/"PLAYING CARD TRUMP-9"/* 1F0E9 */,/*46062*/"PLAYING CARD TRUMP-10"/* 1F0EA */, /*46063*/"PLAYING CARD TRUMP-11"/* 1F0EB */,/*46064*/"PLAYING CARD TRUMP-12"/* 1F0EC */, /*46065*/"PLAYING CARD TRUMP-13"/* 1F0ED */,/*46066*/"PLAYING CARD TRUMP-14"/* 1F0EE */, /*46067*/"PLAYING CARD TRUMP-15"/* 1F0EF */,/*46068*/"PLAYING CARD TRUMP-16"/* 1F0F0 */, /*46069*/"PLAYING CARD TRUMP-17"/* 1F0F1 */,/*46070*/"PLAYING CARD TRUMP-18"/* 1F0F2 */, /*46071*/"PLAYING CARD TRUMP-19"/* 1F0F3 */,/*46072*/"PLAYING CARD TRUMP-20"/* 1F0F4 */, /*46073*/"PLAYING CARD TRUMP-21"/* 1F0F5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*46084*/"DIGIT ZERO FULL STOP"/* 1F100 */,/*46085*/"DIGIT ZERO COMMA"/* 1F101 */,/*46086*/"DIGIT ONE COMMA"/* 1F102 */, /*46087*/"DIGIT TWO COMMA"/* 1F103 */,/*46088*/"DIGIT THREE COMMA"/* 1F104 */,/*46089*/"DIGIT FOUR COMMA"/* 1F105 */, /*46090*/"DIGIT FIVE COMMA"/* 1F106 */,/*46091*/"DIGIT SIX COMMA"/* 1F107 */,/*46092*/"DIGIT SEVEN COMMA"/* 1F108 */, /*46093*/"DIGIT EIGHT COMMA"/* 1F109 */,/*46094*/"DIGIT NINE COMMA"/* 1F10A */, /*46095*/"DINGBAT CIRCLED SANS-SERIF DIGIT ZERO"/* 1F10B */, /*46096*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO"/* 1F10C */,NULL,NULL,NULL, /*46100*/"PARENTHESIZED LATIN CAPITAL LETTER A"/* 1F110 */,/*46101*/"PARENTHESIZED LATIN CAPITAL LETTER B"/* 1F111 */, /*46102*/"PARENTHESIZED LATIN CAPITAL LETTER C"/* 1F112 */,/*46103*/"PARENTHESIZED LATIN CAPITAL LETTER D"/* 1F113 */, /*46104*/"PARENTHESIZED LATIN CAPITAL LETTER E"/* 1F114 */,/*46105*/"PARENTHESIZED LATIN CAPITAL LETTER F"/* 1F115 */, /*46106*/"PARENTHESIZED LATIN CAPITAL LETTER G"/* 1F116 */,/*46107*/"PARENTHESIZED LATIN CAPITAL LETTER H"/* 1F117 */, /*46108*/"PARENTHESIZED LATIN CAPITAL LETTER I"/* 1F118 */,/*46109*/"PARENTHESIZED LATIN CAPITAL LETTER J"/* 1F119 */, /*46110*/"PARENTHESIZED LATIN CAPITAL LETTER K"/* 1F11A */,/*46111*/"PARENTHESIZED LATIN CAPITAL LETTER L"/* 1F11B */, /*46112*/"PARENTHESIZED LATIN CAPITAL LETTER M"/* 1F11C */,/*46113*/"PARENTHESIZED LATIN CAPITAL LETTER N"/* 1F11D */, /*46114*/"PARENTHESIZED LATIN CAPITAL LETTER O"/* 1F11E */,/*46115*/"PARENTHESIZED LATIN CAPITAL LETTER P"/* 1F11F */, /*46116*/"PARENTHESIZED LATIN CAPITAL LETTER Q"/* 1F120 */,/*46117*/"PARENTHESIZED LATIN CAPITAL LETTER R"/* 1F121 */, /*46118*/"PARENTHESIZED LATIN CAPITAL LETTER S"/* 1F122 */,/*46119*/"PARENTHESIZED LATIN CAPITAL LETTER T"/* 1F123 */, /*46120*/"PARENTHESIZED LATIN CAPITAL LETTER U"/* 1F124 */,/*46121*/"PARENTHESIZED LATIN CAPITAL LETTER V"/* 1F125 */, /*46122*/"PARENTHESIZED LATIN CAPITAL LETTER W"/* 1F126 */,/*46123*/"PARENTHESIZED LATIN CAPITAL LETTER X"/* 1F127 */, /*46124*/"PARENTHESIZED LATIN CAPITAL LETTER Y"/* 1F128 */,/*46125*/"PARENTHESIZED LATIN CAPITAL LETTER Z"/* 1F129 */, /*46126*/"TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S"/* 1F12A */, /*46127*/"CIRCLED ITALIC LATIN CAPITAL LETTER C"/* 1F12B */,/*46128*/"CIRCLED ITALIC LATIN CAPITAL LETTER R"/* 1F12C */, /*46129*/"CIRCLED CD"/* 1F12D */,/*46130*/"CIRCLED WZ"/* 1F12E */,NULL, /*46132*/"SQUARED LATIN CAPITAL LETTER A"/* 1F130 */,/*46133*/"SQUARED LATIN CAPITAL LETTER B"/* 1F131 */, /*46134*/"SQUARED LATIN CAPITAL LETTER C"/* 1F132 */,/*46135*/"SQUARED LATIN CAPITAL LETTER D"/* 1F133 */, /*46136*/"SQUARED LATIN CAPITAL LETTER E"/* 1F134 */,/*46137*/"SQUARED LATIN CAPITAL LETTER F"/* 1F135 */, /*46138*/"SQUARED LATIN CAPITAL LETTER G"/* 1F136 */,/*46139*/"SQUARED LATIN CAPITAL LETTER H"/* 1F137 */, /*46140*/"SQUARED LATIN CAPITAL LETTER I"/* 1F138 */,/*46141*/"SQUARED LATIN CAPITAL LETTER J"/* 1F139 */, /*46142*/"SQUARED LATIN CAPITAL LETTER K"/* 1F13A */,/*46143*/"SQUARED LATIN CAPITAL LETTER L"/* 1F13B */, /*46144*/"SQUARED LATIN CAPITAL LETTER M"/* 1F13C */,/*46145*/"SQUARED LATIN CAPITAL LETTER N"/* 1F13D */, /*46146*/"SQUARED LATIN CAPITAL LETTER O"/* 1F13E */,/*46147*/"SQUARED LATIN CAPITAL LETTER P"/* 1F13F */, /*46148*/"SQUARED LATIN CAPITAL LETTER Q"/* 1F140 */,/*46149*/"SQUARED LATIN CAPITAL LETTER R"/* 1F141 */, /*46150*/"SQUARED LATIN CAPITAL LETTER S"/* 1F142 */,/*46151*/"SQUARED LATIN CAPITAL LETTER T"/* 1F143 */, /*46152*/"SQUARED LATIN CAPITAL LETTER U"/* 1F144 */,/*46153*/"SQUARED LATIN CAPITAL LETTER V"/* 1F145 */, /*46154*/"SQUARED LATIN CAPITAL LETTER W"/* 1F146 */,/*46155*/"SQUARED LATIN CAPITAL LETTER X"/* 1F147 */, /*46156*/"SQUARED LATIN CAPITAL LETTER Y"/* 1F148 */,/*46157*/"SQUARED LATIN CAPITAL LETTER Z"/* 1F149 */, /*46158*/"SQUARED HV"/* 1F14A */,/*46159*/"SQUARED MV"/* 1F14B */,/*46160*/"SQUARED SD"/* 1F14C */, /*46161*/"SQUARED SS"/* 1F14D */,/*46162*/"SQUARED PPV"/* 1F14E */,/*46163*/"SQUARED WC"/* 1F14F */, /*46164*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER A"/* 1F150 */, /*46165*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER B"/* 1F151 */, /*46166*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER C"/* 1F152 */, /*46167*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER D"/* 1F153 */, /*46168*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER E"/* 1F154 */, /*46169*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER F"/* 1F155 */, /*46170*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER G"/* 1F156 */, /*46171*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER H"/* 1F157 */, /*46172*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER I"/* 1F158 */, /*46173*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER J"/* 1F159 */, /*46174*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER K"/* 1F15A */, /*46175*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER L"/* 1F15B */, /*46176*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER M"/* 1F15C */, /*46177*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER N"/* 1F15D */, /*46178*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER O"/* 1F15E */, /*46179*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER P"/* 1F15F */, /*46180*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Q"/* 1F160 */, /*46181*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER R"/* 1F161 */, /*46182*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER S"/* 1F162 */, /*46183*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER T"/* 1F163 */, /*46184*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER U"/* 1F164 */, /*46185*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER V"/* 1F165 */, /*46186*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER W"/* 1F166 */, /*46187*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER X"/* 1F167 */, /*46188*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Y"/* 1F168 */, /*46189*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Z"/* 1F169 */,/*46190*/"RAISED MC SIGN"/* 1F16A */, /*46191*/"RAISED MD SIGN"/* 1F16B */,NULL,NULL,NULL,NULL,/*46196*/"NEGATIVE SQUARED LATIN CAPITAL LETTER A"/* 1F170 */, /*46197*/"NEGATIVE SQUARED LATIN CAPITAL LETTER B"/* 1F171 */, /*46198*/"NEGATIVE SQUARED LATIN CAPITAL LETTER C"/* 1F172 */, /*46199*/"NEGATIVE SQUARED LATIN CAPITAL LETTER D"/* 1F173 */, /*46200*/"NEGATIVE SQUARED LATIN CAPITAL LETTER E"/* 1F174 */, /*46201*/"NEGATIVE SQUARED LATIN CAPITAL LETTER F"/* 1F175 */, /*46202*/"NEGATIVE SQUARED LATIN CAPITAL LETTER G"/* 1F176 */, /*46203*/"NEGATIVE SQUARED LATIN CAPITAL LETTER H"/* 1F177 */, /*46204*/"NEGATIVE SQUARED LATIN CAPITAL LETTER I"/* 1F178 */, /*46205*/"NEGATIVE SQUARED LATIN CAPITAL LETTER J"/* 1F179 */, /*46206*/"NEGATIVE SQUARED LATIN CAPITAL LETTER K"/* 1F17A */, /*46207*/"NEGATIVE SQUARED LATIN CAPITAL LETTER L"/* 1F17B */, /*46208*/"NEGATIVE SQUARED LATIN CAPITAL LETTER M"/* 1F17C */, /*46209*/"NEGATIVE SQUARED LATIN CAPITAL LETTER N"/* 1F17D */, /*46210*/"NEGATIVE SQUARED LATIN CAPITAL LETTER O"/* 1F17E */, /*46211*/"NEGATIVE SQUARED LATIN CAPITAL LETTER P"/* 1F17F */, /*46212*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Q"/* 1F180 */, /*46213*/"NEGATIVE SQUARED LATIN CAPITAL LETTER R"/* 1F181 */, /*46214*/"NEGATIVE SQUARED LATIN CAPITAL LETTER S"/* 1F182 */, /*46215*/"NEGATIVE SQUARED LATIN CAPITAL LETTER T"/* 1F183 */, /*46216*/"NEGATIVE SQUARED LATIN CAPITAL LETTER U"/* 1F184 */, /*46217*/"NEGATIVE SQUARED LATIN CAPITAL LETTER V"/* 1F185 */, /*46218*/"NEGATIVE SQUARED LATIN CAPITAL LETTER W"/* 1F186 */, /*46219*/"NEGATIVE SQUARED LATIN CAPITAL LETTER X"/* 1F187 */, /*46220*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Y"/* 1F188 */, /*46221*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Z"/* 1F189 */, /*46222*/"CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P"/* 1F18A */,/*46223*/"NEGATIVE SQUARED IC"/* 1F18B */, /*46224*/"NEGATIVE SQUARED PA"/* 1F18C */,/*46225*/"NEGATIVE SQUARED SA"/* 1F18D */, /*46226*/"NEGATIVE SQUARED AB"/* 1F18E */,/*46227*/"NEGATIVE SQUARED WC"/* 1F18F */,/*46228*/"SQUARE DJ"/* 1F190 */, /*46229*/"SQUARED CL"/* 1F191 */,/*46230*/"SQUARED COOL"/* 1F192 */,/*46231*/"SQUARED FREE"/* 1F193 */, /*46232*/"SQUARED ID"/* 1F194 */,/*46233*/"SQUARED NEW"/* 1F195 */,/*46234*/"SQUARED NG"/* 1F196 */, /*46235*/"SQUARED OK"/* 1F197 */,/*46236*/"SQUARED SOS"/* 1F198 */, /*46237*/"SQUARED UP WITH EXCLAMATION MARK"/* 1F199 */,/*46238*/"SQUARED VS"/* 1F19A */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*46314*/"REGIONAL INDICATOR SYMBOL LETTER A"/* 1F1E6 */,/*46315*/"REGIONAL INDICATOR SYMBOL LETTER B"/* 1F1E7 */, /*46316*/"REGIONAL INDICATOR SYMBOL LETTER C"/* 1F1E8 */,/*46317*/"REGIONAL INDICATOR SYMBOL LETTER D"/* 1F1E9 */, /*46318*/"REGIONAL INDICATOR SYMBOL LETTER E"/* 1F1EA */,/*46319*/"REGIONAL INDICATOR SYMBOL LETTER F"/* 1F1EB */, /*46320*/"REGIONAL INDICATOR SYMBOL LETTER G"/* 1F1EC */,/*46321*/"REGIONAL INDICATOR SYMBOL LETTER H"/* 1F1ED */, /*46322*/"REGIONAL INDICATOR SYMBOL LETTER I"/* 1F1EE */,/*46323*/"REGIONAL INDICATOR SYMBOL LETTER J"/* 1F1EF */, /*46324*/"REGIONAL INDICATOR SYMBOL LETTER K"/* 1F1F0 */,/*46325*/"REGIONAL INDICATOR SYMBOL LETTER L"/* 1F1F1 */, /*46326*/"REGIONAL INDICATOR SYMBOL LETTER M"/* 1F1F2 */,/*46327*/"REGIONAL INDICATOR SYMBOL LETTER N"/* 1F1F3 */, /*46328*/"REGIONAL INDICATOR SYMBOL LETTER O"/* 1F1F4 */,/*46329*/"REGIONAL INDICATOR SYMBOL LETTER P"/* 1F1F5 */, /*46330*/"REGIONAL INDICATOR SYMBOL LETTER Q"/* 1F1F6 */,/*46331*/"REGIONAL INDICATOR SYMBOL LETTER R"/* 1F1F7 */, /*46332*/"REGIONAL INDICATOR SYMBOL LETTER S"/* 1F1F8 */,/*46333*/"REGIONAL INDICATOR SYMBOL LETTER T"/* 1F1F9 */, /*46334*/"REGIONAL INDICATOR SYMBOL LETTER U"/* 1F1FA */,/*46335*/"REGIONAL INDICATOR SYMBOL LETTER V"/* 1F1FB */, /*46336*/"REGIONAL INDICATOR SYMBOL LETTER W"/* 1F1FC */,/*46337*/"REGIONAL INDICATOR SYMBOL LETTER X"/* 1F1FD */, /*46338*/"REGIONAL INDICATOR SYMBOL LETTER Y"/* 1F1FE */,/*46339*/"REGIONAL INDICATOR SYMBOL LETTER Z"/* 1F1FF */, /*46340*/"SQUARE HIRAGANA HOKA"/* 1F200 */,/*46341*/"SQUARED KATAKANA KOKO"/* 1F201 */, /*46342*/"SQUARED KATAKANA SA"/* 1F202 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*46356*/"SQUARED CJK UNIFIED IDEOGRAPH-624B"/* 1F210 */,/*46357*/"SQUARED CJK UNIFIED IDEOGRAPH-5B57"/* 1F211 */, /*46358*/"SQUARED CJK UNIFIED IDEOGRAPH-53CC"/* 1F212 */,/*46359*/"SQUARED KATAKANA DE"/* 1F213 */, /*46360*/"SQUARED CJK UNIFIED IDEOGRAPH-4E8C"/* 1F214 */,/*46361*/"SQUARED CJK UNIFIED IDEOGRAPH-591A"/* 1F215 */, /*46362*/"SQUARED CJK UNIFIED IDEOGRAPH-89E3"/* 1F216 */,/*46363*/"SQUARED CJK UNIFIED IDEOGRAPH-5929"/* 1F217 */, /*46364*/"SQUARED CJK UNIFIED IDEOGRAPH-4EA4"/* 1F218 */,/*46365*/"SQUARED CJK UNIFIED IDEOGRAPH-6620"/* 1F219 */, /*46366*/"SQUARED CJK UNIFIED IDEOGRAPH-7121"/* 1F21A */,/*46367*/"SQUARED CJK UNIFIED IDEOGRAPH-6599"/* 1F21B */, /*46368*/"SQUARED CJK UNIFIED IDEOGRAPH-524D"/* 1F21C */,/*46369*/"SQUARED CJK UNIFIED IDEOGRAPH-5F8C"/* 1F21D */, /*46370*/"SQUARED CJK UNIFIED IDEOGRAPH-518D"/* 1F21E */,/*46371*/"SQUARED CJK UNIFIED IDEOGRAPH-65B0"/* 1F21F */, /*46372*/"SQUARED CJK UNIFIED IDEOGRAPH-521D"/* 1F220 */,/*46373*/"SQUARED CJK UNIFIED IDEOGRAPH-7D42"/* 1F221 */, /*46374*/"SQUARED CJK UNIFIED IDEOGRAPH-751F"/* 1F222 */,/*46375*/"SQUARED CJK UNIFIED IDEOGRAPH-8CA9"/* 1F223 */, /*46376*/"SQUARED CJK UNIFIED IDEOGRAPH-58F0"/* 1F224 */,/*46377*/"SQUARED CJK UNIFIED IDEOGRAPH-5439"/* 1F225 */, /*46378*/"SQUARED CJK UNIFIED IDEOGRAPH-6F14"/* 1F226 */,/*46379*/"SQUARED CJK UNIFIED IDEOGRAPH-6295"/* 1F227 */, /*46380*/"SQUARED CJK UNIFIED IDEOGRAPH-6355"/* 1F228 */,/*46381*/"SQUARED CJK UNIFIED IDEOGRAPH-4E00"/* 1F229 */, /*46382*/"SQUARED CJK UNIFIED IDEOGRAPH-4E09"/* 1F22A */,/*46383*/"SQUARED CJK UNIFIED IDEOGRAPH-904A"/* 1F22B */, /*46384*/"SQUARED CJK UNIFIED IDEOGRAPH-5DE6"/* 1F22C */,/*46385*/"SQUARED CJK UNIFIED IDEOGRAPH-4E2D"/* 1F22D */, /*46386*/"SQUARED CJK UNIFIED IDEOGRAPH-53F3"/* 1F22E */,/*46387*/"SQUARED CJK UNIFIED IDEOGRAPH-6307"/* 1F22F */, /*46388*/"SQUARED CJK UNIFIED IDEOGRAPH-8D70"/* 1F230 */,/*46389*/"SQUARED CJK UNIFIED IDEOGRAPH-6253"/* 1F231 */, /*46390*/"SQUARED CJK UNIFIED IDEOGRAPH-7981"/* 1F232 */,/*46391*/"SQUARED CJK UNIFIED IDEOGRAPH-7A7A"/* 1F233 */, /*46392*/"SQUARED CJK UNIFIED IDEOGRAPH-5408"/* 1F234 */,/*46393*/"SQUARED CJK UNIFIED IDEOGRAPH-6E80"/* 1F235 */, /*46394*/"SQUARED CJK UNIFIED IDEOGRAPH-6709"/* 1F236 */,/*46395*/"SQUARED CJK UNIFIED IDEOGRAPH-6708"/* 1F237 */, /*46396*/"SQUARED CJK UNIFIED IDEOGRAPH-7533"/* 1F238 */,/*46397*/"SQUARED CJK UNIFIED IDEOGRAPH-5272"/* 1F239 */, /*46398*/"SQUARED CJK UNIFIED IDEOGRAPH-55B6"/* 1F23A */,NULL,NULL,NULL,NULL,NULL, /*46404*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C"/* 1F240 */, /*46405*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09"/* 1F241 */, /*46406*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C"/* 1F242 */, /*46407*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89"/* 1F243 */, /*46408*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9"/* 1F244 */, /*46409*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253"/* 1F245 */, /*46410*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7"/* 1F246 */, /*46411*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD"/* 1F247 */, /*46412*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557"/* 1F248 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*46420*/"CIRCLED IDEOGRAPH ADVANTAGE"/* 1F250 */,/*46421*/"CIRCLED IDEOGRAPH ACCEPT"/* 1F251 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*46596*/"CYCLONE"/* 1F300 */,/*46597*/"FOGGY"/* 1F301 */,/*46598*/"CLOSED UMBRELLA"/* 1F302 */, /*46599*/"NIGHT WITH STARS"/* 1F303 */,/*46600*/"SUNRISE OVER MOUNTAINS"/* 1F304 */,/*46601*/"SUNRISE"/* 1F305 */, /*46602*/"CITYSCAPE AT DUSK"/* 1F306 */,/*46603*/"SUNSET OVER BUILDINGS"/* 1F307 */,/*46604*/"RAINBOW"/* 1F308 */, /*46605*/"BRIDGE AT NIGHT"/* 1F309 */,/*46606*/"WATER WAVE"/* 1F30A */,/*46607*/"VOLCANO"/* 1F30B */, /*46608*/"MILKY WAY"/* 1F30C */,/*46609*/"EARTH GLOBE EUROPE-AFRICA"/* 1F30D */, /*46610*/"EARTH GLOBE AMERICAS"/* 1F30E */,/*46611*/"EARTH GLOBE ASIA-AUSTRALIA"/* 1F30F */, /*46612*/"GLOBE WITH MERIDIANS"/* 1F310 */,/*46613*/"NEW MOON SYMBOL"/* 1F311 */, /*46614*/"WAXING CRESCENT MOON SYMBOL"/* 1F312 */,/*46615*/"FIRST QUARTER MOON SYMBOL"/* 1F313 */, /*46616*/"WAXING GIBBOUS MOON SYMBOL"/* 1F314 */,/*46617*/"FULL MOON SYMBOL"/* 1F315 */, /*46618*/"WANING GIBBOUS MOON SYMBOL"/* 1F316 */,/*46619*/"LAST QUARTER MOON SYMBOL"/* 1F317 */, /*46620*/"WANING CRESCENT MOON SYMBOL"/* 1F318 */,/*46621*/"CRESCENT MOON"/* 1F319 */, /*46622*/"NEW MOON WITH FACE"/* 1F31A */,/*46623*/"FIRST QUARTER MOON WITH FACE"/* 1F31B */, /*46624*/"LAST QUARTER MOON WITH FACE"/* 1F31C */,/*46625*/"FULL MOON WITH FACE"/* 1F31D */, /*46626*/"SUN WITH FACE"/* 1F31E */,/*46627*/"GLOWING STAR"/* 1F31F */,/*46628*/"SHOOTING STAR"/* 1F320 */, /*46629*/"THERMOMETER"/* 1F321 */,/*46630*/"BLACK DROPLET"/* 1F322 */,/*46631*/"WHITE SUN"/* 1F323 */, /*46632*/"WHITE SUN WITH SMALL CLOUD"/* 1F324 */,/*46633*/"WHITE SUN BEHIND CLOUD"/* 1F325 */, /*46634*/"WHITE SUN BEHIND CLOUD WITH RAIN"/* 1F326 */,/*46635*/"CLOUD WITH RAIN"/* 1F327 */, /*46636*/"CLOUD WITH SNOW"/* 1F328 */,/*46637*/"CLOUD WITH LIGHTNING"/* 1F329 */, /*46638*/"CLOUD WITH TORNADO"/* 1F32A */,/*46639*/"FOG"/* 1F32B */,/*46640*/"WIND BLOWING FACE"/* 1F32C */, /*46641*/"HOT DOG"/* 1F32D */,/*46642*/"TACO"/* 1F32E */,/*46643*/"BURRITO"/* 1F32F */,/*46644*/"CHESTNUT"/* 1F330 */, /*46645*/"SEEDLING"/* 1F331 */,/*46646*/"EVERGREEN TREE"/* 1F332 */,/*46647*/"DECIDUOUS TREE"/* 1F333 */, /*46648*/"PALM TREE"/* 1F334 */,/*46649*/"CACTUS"/* 1F335 */,/*46650*/"HOT PEPPER"/* 1F336 */, /*46651*/"TULIP"/* 1F337 */,/*46652*/"CHERRY BLOSSOM"/* 1F338 */,/*46653*/"ROSE"/* 1F339 */, /*46654*/"HIBISCUS"/* 1F33A */,/*46655*/"SUNFLOWER"/* 1F33B */,/*46656*/"BLOSSOM"/* 1F33C */, /*46657*/"EAR OF MAIZE"/* 1F33D */,/*46658*/"EAR OF RICE"/* 1F33E */,/*46659*/"HERB"/* 1F33F */, /*46660*/"FOUR LEAF CLOVER"/* 1F340 */,/*46661*/"MAPLE LEAF"/* 1F341 */,/*46662*/"FALLEN LEAF"/* 1F342 */, /*46663*/"LEAF FLUTTERING IN WIND"/* 1F343 */,/*46664*/"MUSHROOM"/* 1F344 */,/*46665*/"TOMATO"/* 1F345 */, /*46666*/"AUBERGINE"/* 1F346 */,/*46667*/"GRAPES"/* 1F347 */,/*46668*/"MELON"/* 1F348 */, /*46669*/"WATERMELON"/* 1F349 */,/*46670*/"TANGERINE"/* 1F34A */,/*46671*/"LEMON"/* 1F34B */, /*46672*/"BANANA"/* 1F34C */,/*46673*/"PINEAPPLE"/* 1F34D */,/*46674*/"RED APPLE"/* 1F34E */, /*46675*/"GREEN APPLE"/* 1F34F */,/*46676*/"PEAR"/* 1F350 */,/*46677*/"PEACH"/* 1F351 */,/*46678*/"CHERRIES"/* 1F352 */, /*46679*/"STRAWBERRY"/* 1F353 */,/*46680*/"HAMBURGER"/* 1F354 */,/*46681*/"SLICE OF PIZZA"/* 1F355 */, /*46682*/"MEAT ON BONE"/* 1F356 */,/*46683*/"POULTRY LEG"/* 1F357 */,/*46684*/"RICE CRACKER"/* 1F358 */, /*46685*/"RICE BALL"/* 1F359 */,/*46686*/"COOKED RICE"/* 1F35A */,/*46687*/"CURRY AND RICE"/* 1F35B */, /*46688*/"STEAMING BOWL"/* 1F35C */,/*46689*/"SPAGHETTI"/* 1F35D */,/*46690*/"BREAD"/* 1F35E */, /*46691*/"FRENCH FRIES"/* 1F35F */,/*46692*/"ROASTED SWEET POTATO"/* 1F360 */,/*46693*/"DANGO"/* 1F361 */, /*46694*/"ODEN"/* 1F362 */,/*46695*/"SUSHI"/* 1F363 */,/*46696*/"FRIED SHRIMP"/* 1F364 */, /*46697*/"FISH CAKE WITH SWIRL DESIGN"/* 1F365 */,/*46698*/"SOFT ICE CREAM"/* 1F366 */,/*46699*/"SHAVED ICE"/* 1F367 */, /*46700*/"ICE CREAM"/* 1F368 */,/*46701*/"DOUGHNUT"/* 1F369 */,/*46702*/"COOKIE"/* 1F36A */, /*46703*/"CHOCOLATE BAR"/* 1F36B */,/*46704*/"CANDY"/* 1F36C */,/*46705*/"LOLLIPOP"/* 1F36D */, /*46706*/"CUSTARD"/* 1F36E */,/*46707*/"HONEY POT"/* 1F36F */,/*46708*/"SHORTCAKE"/* 1F370 */, /*46709*/"BENTO BOX"/* 1F371 */,/*46710*/"POT OF FOOD"/* 1F372 */,/*46711*/"COOKING"/* 1F373 */, /*46712*/"FORK AND KNIFE"/* 1F374 */,/*46713*/"TEACUP WITHOUT HANDLE"/* 1F375 */, /*46714*/"SAKE BOTTLE AND CUP"/* 1F376 */,/*46715*/"WINE GLASS"/* 1F377 */,/*46716*/"COCKTAIL GLASS"/* 1F378 */, /*46717*/"TROPICAL DRINK"/* 1F379 */,/*46718*/"BEER MUG"/* 1F37A */,/*46719*/"CLINKING BEER MUGS"/* 1F37B */, /*46720*/"BABY BOTTLE"/* 1F37C */,/*46721*/"FORK AND KNIFE WITH PLATE"/* 1F37D */, /*46722*/"BOTTLE WITH POPPING CORK"/* 1F37E */,/*46723*/"POPCORN"/* 1F37F */,/*46724*/"RIBBON"/* 1F380 */, /*46725*/"WRAPPED PRESENT"/* 1F381 */,/*46726*/"BIRTHDAY CAKE"/* 1F382 */,/*46727*/"JACK-O-LANTERN"/* 1F383 */, /*46728*/"CHRISTMAS TREE"/* 1F384 */,/*46729*/"FATHER CHRISTMAS"/* 1F385 */,/*46730*/"FIREWORKS"/* 1F386 */, /*46731*/"FIREWORK SPARKLER"/* 1F387 */,/*46732*/"BALLOON"/* 1F388 */,/*46733*/"PARTY POPPER"/* 1F389 */, /*46734*/"CONFETTI BALL"/* 1F38A */,/*46735*/"TANABATA TREE"/* 1F38B */,/*46736*/"CROSSED FLAGS"/* 1F38C */, /*46737*/"PINE DECORATION"/* 1F38D */,/*46738*/"JAPANESE DOLLS"/* 1F38E */,/*46739*/"CARP STREAMER"/* 1F38F */, /*46740*/"WIND CHIME"/* 1F390 */,/*46741*/"MOON VIEWING CEREMONY"/* 1F391 */,/*46742*/"SCHOOL SATCHEL"/* 1F392 */, /*46743*/"GRADUATION CAP"/* 1F393 */,/*46744*/"HEART WITH TIP ON THE LEFT"/* 1F394 */, /*46745*/"BOUQUET OF FLOWERS"/* 1F395 */,/*46746*/"MILITARY MEDAL"/* 1F396 */,/*46747*/"REMINDER RIBBON"/* 1F397 */, /*46748*/"MUSICAL KEYBOARD WITH JACKS"/* 1F398 */,/*46749*/"STUDIO MICROPHONE"/* 1F399 */, /*46750*/"LEVEL SLIDER"/* 1F39A */,/*46751*/"CONTROL KNOBS"/* 1F39B */, /*46752*/"BEAMED ASCENDING MUSICAL NOTES"/* 1F39C */,/*46753*/"BEAMED DESCENDING MUSICAL NOTES"/* 1F39D */, /*46754*/"FILM FRAMES"/* 1F39E */,/*46755*/"ADMISSION TICKETS"/* 1F39F */,/*46756*/"CAROUSEL HORSE"/* 1F3A0 */, /*46757*/"FERRIS WHEEL"/* 1F3A1 */,/*46758*/"ROLLER COASTER"/* 1F3A2 */,/*46759*/"FISHING POLE AND FISH"/* 1F3A3 */, /*46760*/"MICROPHONE"/* 1F3A4 */,/*46761*/"MOVIE CAMERA"/* 1F3A5 */,/*46762*/"CINEMA"/* 1F3A6 */, /*46763*/"HEADPHONE"/* 1F3A7 */,/*46764*/"ARTIST PALETTE"/* 1F3A8 */,/*46765*/"TOP HAT"/* 1F3A9 */, /*46766*/"CIRCUS TENT"/* 1F3AA */,/*46767*/"TICKET"/* 1F3AB */,/*46768*/"CLAPPER BOARD"/* 1F3AC */, /*46769*/"PERFORMING ARTS"/* 1F3AD */,/*46770*/"VIDEO GAME"/* 1F3AE */,/*46771*/"DIRECT HIT"/* 1F3AF */, /*46772*/"SLOT MACHINE"/* 1F3B0 */,/*46773*/"BILLIARDS"/* 1F3B1 */,/*46774*/"GAME DIE"/* 1F3B2 */, /*46775*/"BOWLING"/* 1F3B3 */,/*46776*/"FLOWER PLAYING CARDS"/* 1F3B4 */,/*46777*/"MUSICAL NOTE"/* 1F3B5 */, /*46778*/"MULTIPLE MUSICAL NOTES"/* 1F3B6 */,/*46779*/"SAXOPHONE"/* 1F3B7 */,/*46780*/"GUITAR"/* 1F3B8 */, /*46781*/"MUSICAL KEYBOARD"/* 1F3B9 */,/*46782*/"TRUMPET"/* 1F3BA */,/*46783*/"VIOLIN"/* 1F3BB */, /*46784*/"MUSICAL SCORE"/* 1F3BC */,/*46785*/"RUNNING SHIRT WITH SASH"/* 1F3BD */, /*46786*/"TENNIS RACQUET AND BALL"/* 1F3BE */,/*46787*/"SKI AND SKI BOOT"/* 1F3BF */, /*46788*/"BASKETBALL AND HOOP"/* 1F3C0 */,/*46789*/"CHEQUERED FLAG"/* 1F3C1 */,/*46790*/"SNOWBOARDER"/* 1F3C2 */, /*46791*/"RUNNER"/* 1F3C3 */,/*46792*/"SURFER"/* 1F3C4 */,/*46793*/"SPORTS MEDAL"/* 1F3C5 */, /*46794*/"TROPHY"/* 1F3C6 */,/*46795*/"HORSE RACING"/* 1F3C7 */,/*46796*/"AMERICAN FOOTBALL"/* 1F3C8 */, /*46797*/"RUGBY FOOTBALL"/* 1F3C9 */,/*46798*/"SWIMMER"/* 1F3CA */,/*46799*/"WEIGHT LIFTER"/* 1F3CB */, /*46800*/"GOLFER"/* 1F3CC */,/*46801*/"RACING MOTORCYCLE"/* 1F3CD */,/*46802*/"RACING CAR"/* 1F3CE */, /*46803*/"CRICKET BAT AND BALL"/* 1F3CF */,/*46804*/"VOLLEYBALL"/* 1F3D0 */, /*46805*/"FIELD HOCKEY STICK AND BALL"/* 1F3D1 */,/*46806*/"ICE HOCKEY STICK AND PUCK"/* 1F3D2 */, /*46807*/"TABLE TENNIS PADDLE AND BALL"/* 1F3D3 */,/*46808*/"SNOW CAPPED MOUNTAIN"/* 1F3D4 */, /*46809*/"CAMPING"/* 1F3D5 */,/*46810*/"BEACH WITH UMBRELLA"/* 1F3D6 */,/*46811*/"BUILDING CONSTRUCTION"/* 1F3D7 */, /*46812*/"HOUSE BUILDINGS"/* 1F3D8 */,/*46813*/"CITYSCAPE"/* 1F3D9 */,/*46814*/"DERELICT HOUSE BUILDING"/* 1F3DA */, /*46815*/"CLASSICAL BUILDING"/* 1F3DB */,/*46816*/"DESERT"/* 1F3DC */,/*46817*/"DESERT ISLAND"/* 1F3DD */, /*46818*/"NATIONAL PARK"/* 1F3DE */,/*46819*/"STADIUM"/* 1F3DF */,/*46820*/"HOUSE BUILDING"/* 1F3E0 */, /*46821*/"HOUSE WITH GARDEN"/* 1F3E1 */,/*46822*/"OFFICE BUILDING"/* 1F3E2 */,/*46823*/"JAPANESE POST OFFICE"/* 1F3E3 */, /*46824*/"EUROPEAN POST OFFICE"/* 1F3E4 */,/*46825*/"HOSPITAL"/* 1F3E5 */,/*46826*/"BANK"/* 1F3E6 */, /*46827*/"AUTOMATED TELLER MACHINE"/* 1F3E7 */,/*46828*/"HOTEL"/* 1F3E8 */,/*46829*/"LOVE HOTEL"/* 1F3E9 */, /*46830*/"CONVENIENCE STORE"/* 1F3EA */,/*46831*/"SCHOOL"/* 1F3EB */,/*46832*/"DEPARTMENT STORE"/* 1F3EC */, /*46833*/"FACTORY"/* 1F3ED */,/*46834*/"IZAKAYA LANTERN"/* 1F3EE */,/*46835*/"JAPANESE CASTLE"/* 1F3EF */, /*46836*/"EUROPEAN CASTLE"/* 1F3F0 */,/*46837*/"WHITE PENNANT"/* 1F3F1 */,/*46838*/"BLACK PENNANT"/* 1F3F2 */, /*46839*/"WAVING WHITE FLAG"/* 1F3F3 */,/*46840*/"WAVING BLACK FLAG"/* 1F3F4 */,/*46841*/"ROSETTE"/* 1F3F5 */, /*46842*/"BLACK ROSETTE"/* 1F3F6 */,/*46843*/"LABEL"/* 1F3F7 */,/*46844*/"BADMINTON RACQUET AND SHUTTLECOCK"/* 1F3F8 */, /*46845*/"BOW AND ARROW"/* 1F3F9 */,/*46846*/"AMPHORA"/* 1F3FA */, /*46847*/"EMOJI MODIFIER FITZPATRICK TYPE-1-2"/* 1F3FB */,/*46848*/"EMOJI MODIFIER FITZPATRICK TYPE-3"/* 1F3FC */, /*46849*/"EMOJI MODIFIER FITZPATRICK TYPE-4"/* 1F3FD */,/*46850*/"EMOJI MODIFIER FITZPATRICK TYPE-5"/* 1F3FE */, /*46851*/"EMOJI MODIFIER FITZPATRICK TYPE-6"/* 1F3FF */,/*46852*/"RAT"/* 1F400 */,/*46853*/"MOUSE"/* 1F401 */, /*46854*/"OX"/* 1F402 */,/*46855*/"WATER BUFFALO"/* 1F403 */,/*46856*/"COW"/* 1F404 */,/*46857*/"TIGER"/* 1F405 */, /*46858*/"LEOPARD"/* 1F406 */,/*46859*/"RABBIT"/* 1F407 */,/*46860*/"CAT"/* 1F408 */,/*46861*/"DRAGON"/* 1F409 */, /*46862*/"CROCODILE"/* 1F40A */,/*46863*/"WHALE"/* 1F40B */,/*46864*/"SNAIL"/* 1F40C */,/*46865*/"SNAKE"/* 1F40D */, /*46866*/"HORSE"/* 1F40E */,/*46867*/"RAM"/* 1F40F */,/*46868*/"GOAT"/* 1F410 */,/*46869*/"SHEEP"/* 1F411 */, /*46870*/"MONKEY"/* 1F412 */,/*46871*/"ROOSTER"/* 1F413 */,/*46872*/"CHICKEN"/* 1F414 */,/*46873*/"DOG"/* 1F415 */, /*46874*/"PIG"/* 1F416 */,/*46875*/"BOAR"/* 1F417 */,/*46876*/"ELEPHANT"/* 1F418 */,/*46877*/"OCTOPUS"/* 1F419 */, /*46878*/"SPIRAL SHELL"/* 1F41A */,/*46879*/"BUG"/* 1F41B */,/*46880*/"ANT"/* 1F41C */,/*46881*/"HONEYBEE"/* 1F41D */, /*46882*/"LADY BEETLE"/* 1F41E */,/*46883*/"FISH"/* 1F41F */,/*46884*/"TROPICAL FISH"/* 1F420 */, /*46885*/"BLOWFISH"/* 1F421 */,/*46886*/"TURTLE"/* 1F422 */,/*46887*/"HATCHING CHICK"/* 1F423 */, /*46888*/"BABY CHICK"/* 1F424 */,/*46889*/"FRONT-FACING BABY CHICK"/* 1F425 */,/*46890*/"BIRD"/* 1F426 */, /*46891*/"PENGUIN"/* 1F427 */,/*46892*/"KOALA"/* 1F428 */,/*46893*/"POODLE"/* 1F429 */, /*46894*/"DROMEDARY CAMEL"/* 1F42A */,/*46895*/"BACTRIAN CAMEL"/* 1F42B */,/*46896*/"DOLPHIN"/* 1F42C */, /*46897*/"MOUSE FACE"/* 1F42D */,/*46898*/"COW FACE"/* 1F42E */,/*46899*/"TIGER FACE"/* 1F42F */, /*46900*/"RABBIT FACE"/* 1F430 */,/*46901*/"CAT FACE"/* 1F431 */,/*46902*/"DRAGON FACE"/* 1F432 */, /*46903*/"SPOUTING WHALE"/* 1F433 */,/*46904*/"HORSE FACE"/* 1F434 */,/*46905*/"MONKEY FACE"/* 1F435 */, /*46906*/"DOG FACE"/* 1F436 */,/*46907*/"PIG FACE"/* 1F437 */,/*46908*/"FROG FACE"/* 1F438 */, /*46909*/"HAMSTER FACE"/* 1F439 */,/*46910*/"WOLF FACE"/* 1F43A */,/*46911*/"BEAR FACE"/* 1F43B */, /*46912*/"PANDA FACE"/* 1F43C */,/*46913*/"PIG NOSE"/* 1F43D */,/*46914*/"PAW PRINTS"/* 1F43E */, /*46915*/"CHIPMUNK"/* 1F43F */,/*46916*/"EYES"/* 1F440 */,/*46917*/"EYE"/* 1F441 */,/*46918*/"EAR"/* 1F442 */, /*46919*/"NOSE"/* 1F443 */,/*46920*/"MOUTH"/* 1F444 */,/*46921*/"TONGUE"/* 1F445 */, /*46922*/"WHITE UP POINTING BACKHAND INDEX"/* 1F446 */,/*46923*/"WHITE DOWN POINTING BACKHAND INDEX"/* 1F447 */, /*46924*/"WHITE LEFT POINTING BACKHAND INDEX"/* 1F448 */,/*46925*/"WHITE RIGHT POINTING BACKHAND INDEX"/* 1F449 */, /*46926*/"FISTED HAND SIGN"/* 1F44A */,/*46927*/"WAVING HAND SIGN"/* 1F44B */,/*46928*/"OK HAND SIGN"/* 1F44C */, /*46929*/"THUMBS UP SIGN"/* 1F44D */,/*46930*/"THUMBS DOWN SIGN"/* 1F44E */,/*46931*/"CLAPPING HANDS SIGN"/* 1F44F */, /*46932*/"OPEN HANDS SIGN"/* 1F450 */,/*46933*/"CROWN"/* 1F451 */,/*46934*/"WOMANS HAT"/* 1F452 */, /*46935*/"EYEGLASSES"/* 1F453 */,/*46936*/"NECKTIE"/* 1F454 */,/*46937*/"T-SHIRT"/* 1F455 */,/*46938*/"JEANS"/* 1F456 */, /*46939*/"DRESS"/* 1F457 */,/*46940*/"KIMONO"/* 1F458 */,/*46941*/"BIKINI"/* 1F459 */, /*46942*/"WOMANS CLOTHES"/* 1F45A */,/*46943*/"PURSE"/* 1F45B */,/*46944*/"HANDBAG"/* 1F45C */, /*46945*/"POUCH"/* 1F45D */,/*46946*/"MANS SHOE"/* 1F45E */,/*46947*/"ATHLETIC SHOE"/* 1F45F */, /*46948*/"HIGH-HEELED SHOE"/* 1F460 */,/*46949*/"WOMANS SANDAL"/* 1F461 */,/*46950*/"WOMANS BOOTS"/* 1F462 */, /*46951*/"FOOTPRINTS"/* 1F463 */,/*46952*/"BUST IN SILHOUETTE"/* 1F464 */,/*46953*/"BUSTS IN SILHOUETTE"/* 1F465 */, /*46954*/"BOY"/* 1F466 */,/*46955*/"GIRL"/* 1F467 */,/*46956*/"MAN"/* 1F468 */,/*46957*/"WOMAN"/* 1F469 */, /*46958*/"FAMILY"/* 1F46A */,/*46959*/"MAN AND WOMAN HOLDING HANDS"/* 1F46B */, /*46960*/"TWO MEN HOLDING HANDS"/* 1F46C */,/*46961*/"TWO WOMEN HOLDING HANDS"/* 1F46D */, /*46962*/"POLICE OFFICER"/* 1F46E */,/*46963*/"WOMAN WITH BUNNY EARS"/* 1F46F */,/*46964*/"BRIDE WITH VEIL"/* 1F470 */, /*46965*/"PERSON WITH BLOND HAIR"/* 1F471 */,/*46966*/"MAN WITH GUA PI MAO"/* 1F472 */, /*46967*/"MAN WITH TURBAN"/* 1F473 */,/*46968*/"OLDER MAN"/* 1F474 */,/*46969*/"OLDER WOMAN"/* 1F475 */, /*46970*/"BABY"/* 1F476 */,/*46971*/"CONSTRUCTION WORKER"/* 1F477 */,/*46972*/"PRINCESS"/* 1F478 */, /*46973*/"JAPANESE OGRE"/* 1F479 */,/*46974*/"JAPANESE GOBLIN"/* 1F47A */,/*46975*/"GHOST"/* 1F47B */, /*46976*/"BABY ANGEL"/* 1F47C */,/*46977*/"EXTRATERRESTRIAL ALIEN"/* 1F47D */,/*46978*/"ALIEN MONSTER"/* 1F47E */, /*46979*/"IMP"/* 1F47F */,/*46980*/"SKULL"/* 1F480 */,/*46981*/"INFORMATION DESK PERSON"/* 1F481 */, /*46982*/"GUARDSMAN"/* 1F482 */,/*46983*/"DANCER"/* 1F483 */,/*46984*/"LIPSTICK"/* 1F484 */, /*46985*/"NAIL POLISH"/* 1F485 */,/*46986*/"FACE MASSAGE"/* 1F486 */,/*46987*/"HAIRCUT"/* 1F487 */, /*46988*/"BARBER POLE"/* 1F488 */,/*46989*/"SYRINGE"/* 1F489 */,/*46990*/"PILL"/* 1F48A */, /*46991*/"KISS MARK"/* 1F48B */,/*46992*/"LOVE LETTER"/* 1F48C */,/*46993*/"RING"/* 1F48D */, /*46994*/"GEM STONE"/* 1F48E */,/*46995*/"KISS"/* 1F48F */,/*46996*/"BOUQUET"/* 1F490 */, /*46997*/"COUPLE WITH HEART"/* 1F491 */,/*46998*/"WEDDING"/* 1F492 */,/*46999*/"BEATING HEART"/* 1F493 */, /*47000*/"BROKEN HEART"/* 1F494 */,/*47001*/"TWO HEARTS"/* 1F495 */,/*47002*/"SPARKLING HEART"/* 1F496 */, /*47003*/"GROWING HEART"/* 1F497 */,/*47004*/"HEART WITH ARROW"/* 1F498 */,/*47005*/"BLUE HEART"/* 1F499 */, /*47006*/"GREEN HEART"/* 1F49A */,/*47007*/"YELLOW HEART"/* 1F49B */,/*47008*/"PURPLE HEART"/* 1F49C */, /*47009*/"HEART WITH RIBBON"/* 1F49D */,/*47010*/"REVOLVING HEARTS"/* 1F49E */,/*47011*/"HEART DECORATION"/* 1F49F */, /*47012*/"DIAMOND SHAPE WITH A DOT INSIDE"/* 1F4A0 */,/*47013*/"ELECTRIC LIGHT BULB"/* 1F4A1 */, /*47014*/"ANGER SYMBOL"/* 1F4A2 */,/*47015*/"BOMB"/* 1F4A3 */,/*47016*/"SLEEPING SYMBOL"/* 1F4A4 */, /*47017*/"COLLISION SYMBOL"/* 1F4A5 */,/*47018*/"SPLASHING SWEAT SYMBOL"/* 1F4A6 */,/*47019*/"DROPLET"/* 1F4A7 */, /*47020*/"DASH SYMBOL"/* 1F4A8 */,/*47021*/"PILE OF POO"/* 1F4A9 */,/*47022*/"FLEXED BICEPS"/* 1F4AA */, /*47023*/"DIZZY SYMBOL"/* 1F4AB */,/*47024*/"SPEECH BALLOON"/* 1F4AC */,/*47025*/"THOUGHT BALLOON"/* 1F4AD */, /*47026*/"WHITE FLOWER"/* 1F4AE */,/*47027*/"HUNDRED POINTS SYMBOL"/* 1F4AF */,/*47028*/"MONEY BAG"/* 1F4B0 */, /*47029*/"CURRENCY EXCHANGE"/* 1F4B1 */,/*47030*/"HEAVY DOLLAR SIGN"/* 1F4B2 */,/*47031*/"CREDIT CARD"/* 1F4B3 */, /*47032*/"BANKNOTE WITH YEN SIGN"/* 1F4B4 */,/*47033*/"BANKNOTE WITH DOLLAR SIGN"/* 1F4B5 */, /*47034*/"BANKNOTE WITH EURO SIGN"/* 1F4B6 */,/*47035*/"BANKNOTE WITH POUND SIGN"/* 1F4B7 */, /*47036*/"MONEY WITH WINGS"/* 1F4B8 */,/*47037*/"CHART WITH UPWARDS TREND AND YEN SIGN"/* 1F4B9 */, /*47038*/"SEAT"/* 1F4BA */,/*47039*/"PERSONAL COMPUTER"/* 1F4BB */,/*47040*/"BRIEFCASE"/* 1F4BC */, /*47041*/"MINIDISC"/* 1F4BD */,/*47042*/"FLOPPY DISK"/* 1F4BE */,/*47043*/"OPTICAL DISC"/* 1F4BF */, /*47044*/"DVD"/* 1F4C0 */,/*47045*/"FILE FOLDER"/* 1F4C1 */,/*47046*/"OPEN FILE FOLDER"/* 1F4C2 */, /*47047*/"PAGE WITH CURL"/* 1F4C3 */,/*47048*/"PAGE FACING UP"/* 1F4C4 */,/*47049*/"CALENDAR"/* 1F4C5 */, /*47050*/"TEAR-OFF CALENDAR"/* 1F4C6 */,/*47051*/"CARD INDEX"/* 1F4C7 */,/*47052*/"CHART WITH UPWARDS TREND"/* 1F4C8 */, /*47053*/"CHART WITH DOWNWARDS TREND"/* 1F4C9 */,/*47054*/"BAR CHART"/* 1F4CA */,/*47055*/"CLIPBOARD"/* 1F4CB */, /*47056*/"PUSHPIN"/* 1F4CC */,/*47057*/"ROUND PUSHPIN"/* 1F4CD */,/*47058*/"PAPERCLIP"/* 1F4CE */, /*47059*/"STRAIGHT RULER"/* 1F4CF */,/*47060*/"TRIANGULAR RULER"/* 1F4D0 */,/*47061*/"BOOKMARK TABS"/* 1F4D1 */, /*47062*/"LEDGER"/* 1F4D2 */,/*47063*/"NOTEBOOK"/* 1F4D3 */,/*47064*/"NOTEBOOK WITH DECORATIVE COVER"/* 1F4D4 */, /*47065*/"CLOSED BOOK"/* 1F4D5 */,/*47066*/"OPEN BOOK"/* 1F4D6 */,/*47067*/"GREEN BOOK"/* 1F4D7 */, /*47068*/"BLUE BOOK"/* 1F4D8 */,/*47069*/"ORANGE BOOK"/* 1F4D9 */,/*47070*/"BOOKS"/* 1F4DA */, /*47071*/"NAME BADGE"/* 1F4DB */,/*47072*/"SCROLL"/* 1F4DC */,/*47073*/"MEMO"/* 1F4DD */, /*47074*/"TELEPHONE RECEIVER"/* 1F4DE */,/*47075*/"PAGER"/* 1F4DF */,/*47076*/"FAX MACHINE"/* 1F4E0 */, /*47077*/"SATELLITE ANTENNA"/* 1F4E1 */,/*47078*/"PUBLIC ADDRESS LOUDSPEAKER"/* 1F4E2 */, /*47079*/"CHEERING MEGAPHONE"/* 1F4E3 */,/*47080*/"OUTBOX TRAY"/* 1F4E4 */,/*47081*/"INBOX TRAY"/* 1F4E5 */, /*47082*/"PACKAGE"/* 1F4E6 */,/*47083*/"E-MAIL SYMBOL"/* 1F4E7 */,/*47084*/"INCOMING ENVELOPE"/* 1F4E8 */, /*47085*/"ENVELOPE WITH DOWNWARDS ARROW ABOVE"/* 1F4E9 */,/*47086*/"CLOSED MAILBOX WITH LOWERED FLAG"/* 1F4EA */, /*47087*/"CLOSED MAILBOX WITH RAISED FLAG"/* 1F4EB */,/*47088*/"OPEN MAILBOX WITH RAISED FLAG"/* 1F4EC */, /*47089*/"OPEN MAILBOX WITH LOWERED FLAG"/* 1F4ED */,/*47090*/"POSTBOX"/* 1F4EE */,/*47091*/"POSTAL HORN"/* 1F4EF */, /*47092*/"NEWSPAPER"/* 1F4F0 */,/*47093*/"MOBILE PHONE"/* 1F4F1 */, /*47094*/"MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT"/* 1F4F2 */,/*47095*/"VIBRATION MODE"/* 1F4F3 */, /*47096*/"MOBILE PHONE OFF"/* 1F4F4 */,/*47097*/"NO MOBILE PHONES"/* 1F4F5 */,/*47098*/"ANTENNA WITH BARS"/* 1F4F6 */, /*47099*/"CAMERA"/* 1F4F7 */,/*47100*/"CAMERA WITH FLASH"/* 1F4F8 */,/*47101*/"VIDEO CAMERA"/* 1F4F9 */, /*47102*/"TELEVISION"/* 1F4FA */,/*47103*/"RADIO"/* 1F4FB */,/*47104*/"VIDEOCASSETTE"/* 1F4FC */, /*47105*/"FILM PROJECTOR"/* 1F4FD */,/*47106*/"PORTABLE STEREO"/* 1F4FE */,/*47107*/"PRAYER BEADS"/* 1F4FF */, /*47108*/"TWISTED RIGHTWARDS ARROWS"/* 1F500 */, /*47109*/"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS"/* 1F501 */, /*47110*/"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY"/* 1F502 */, /*47111*/"CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS"/* 1F503 */, /*47112*/"ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS"/* 1F504 */,/*47113*/"LOW BRIGHTNESS SYMBOL"/* 1F505 */, /*47114*/"HIGH BRIGHTNESS SYMBOL"/* 1F506 */,/*47115*/"SPEAKER WITH CANCELLATION STROKE"/* 1F507 */, /*47116*/"SPEAKER"/* 1F508 */,/*47117*/"SPEAKER WITH ONE SOUND WAVE"/* 1F509 */, /*47118*/"SPEAKER WITH THREE SOUND WAVES"/* 1F50A */,/*47119*/"BATTERY"/* 1F50B */,/*47120*/"ELECTRIC PLUG"/* 1F50C */, /*47121*/"LEFT-POINTING MAGNIFYING GLASS"/* 1F50D */,/*47122*/"RIGHT-POINTING MAGNIFYING GLASS"/* 1F50E */, /*47123*/"LOCK WITH INK PEN"/* 1F50F */,/*47124*/"CLOSED LOCK WITH KEY"/* 1F510 */,/*47125*/"KEY"/* 1F511 */, /*47126*/"LOCK"/* 1F512 */,/*47127*/"OPEN LOCK"/* 1F513 */,/*47128*/"BELL"/* 1F514 */, /*47129*/"BELL WITH CANCELLATION STROKE"/* 1F515 */,/*47130*/"BOOKMARK"/* 1F516 */,/*47131*/"LINK SYMBOL"/* 1F517 */, /*47132*/"RADIO BUTTON"/* 1F518 */,/*47133*/"BACK WITH LEFTWARDS ARROW ABOVE"/* 1F519 */, /*47134*/"END WITH LEFTWARDS ARROW ABOVE"/* 1F51A */, /*47135*/"ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE"/* 1F51B */, /*47136*/"SOON WITH RIGHTWARDS ARROW ABOVE"/* 1F51C */,/*47137*/"TOP WITH UPWARDS ARROW ABOVE"/* 1F51D */, /*47138*/"NO ONE UNDER EIGHTEEN SYMBOL"/* 1F51E */,/*47139*/"KEYCAP TEN"/* 1F51F */, /*47140*/"INPUT SYMBOL FOR LATIN CAPITAL LETTERS"/* 1F520 */,/*47141*/"INPUT SYMBOL FOR LATIN SMALL LETTERS"/* 1F521 */, /*47142*/"INPUT SYMBOL FOR NUMBERS"/* 1F522 */,/*47143*/"INPUT SYMBOL FOR SYMBOLS"/* 1F523 */, /*47144*/"INPUT SYMBOL FOR LATIN LETTERS"/* 1F524 */,/*47145*/"FIRE"/* 1F525 */,/*47146*/"ELECTRIC TORCH"/* 1F526 */, /*47147*/"WRENCH"/* 1F527 */,/*47148*/"HAMMER"/* 1F528 */,/*47149*/"NUT AND BOLT"/* 1F529 */,/*47150*/"HOCHO"/* 1F52A */, /*47151*/"PISTOL"/* 1F52B */,/*47152*/"MICROSCOPE"/* 1F52C */,/*47153*/"TELESCOPE"/* 1F52D */, /*47154*/"CRYSTAL BALL"/* 1F52E */,/*47155*/"SIX POINTED STAR WITH MIDDLE DOT"/* 1F52F */, /*47156*/"JAPANESE SYMBOL FOR BEGINNER"/* 1F530 */,/*47157*/"TRIDENT EMBLEM"/* 1F531 */, /*47158*/"BLACK SQUARE BUTTON"/* 1F532 */,/*47159*/"WHITE SQUARE BUTTON"/* 1F533 */, /*47160*/"LARGE RED CIRCLE"/* 1F534 */,/*47161*/"LARGE BLUE CIRCLE"/* 1F535 */, /*47162*/"LARGE ORANGE DIAMOND"/* 1F536 */,/*47163*/"LARGE BLUE DIAMOND"/* 1F537 */, /*47164*/"SMALL ORANGE DIAMOND"/* 1F538 */,/*47165*/"SMALL BLUE DIAMOND"/* 1F539 */, /*47166*/"UP-POINTING RED TRIANGLE"/* 1F53A */,/*47167*/"DOWN-POINTING RED TRIANGLE"/* 1F53B */, /*47168*/"UP-POINTING SMALL RED TRIANGLE"/* 1F53C */,/*47169*/"DOWN-POINTING SMALL RED TRIANGLE"/* 1F53D */, /*47170*/"LOWER RIGHT SHADOWED WHITE CIRCLE"/* 1F53E */,/*47171*/"UPPER RIGHT SHADOWED WHITE CIRCLE"/* 1F53F */, /*47172*/"CIRCLED CROSS POMMEE"/* 1F540 */,/*47173*/"CROSS POMMEE WITH HALF-CIRCLE BELOW"/* 1F541 */, /*47174*/"CROSS POMMEE"/* 1F542 */,/*47175*/"NOTCHED LEFT SEMICIRCLE WITH THREE DOTS"/* 1F543 */, /*47176*/"NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS"/* 1F544 */,/*47177*/"SYMBOL FOR MARKS CHAPTER"/* 1F545 */, /*47178*/"WHITE LATIN CROSS"/* 1F546 */,/*47179*/"HEAVY LATIN CROSS"/* 1F547 */,/*47180*/"CELTIC CROSS"/* 1F548 */, /*47181*/"OM SYMBOL"/* 1F549 */,/*47182*/"DOVE OF PEACE"/* 1F54A */,/*47183*/"KAABA"/* 1F54B */, /*47184*/"MOSQUE"/* 1F54C */,/*47185*/"SYNAGOGUE"/* 1F54D */,/*47186*/"MENORAH WITH NINE BRANCHES"/* 1F54E */, /*47187*/"BOWL OF HYGIEIA"/* 1F54F */,/*47188*/"CLOCK FACE ONE OCLOCK"/* 1F550 */, /*47189*/"CLOCK FACE TWO OCLOCK"/* 1F551 */,/*47190*/"CLOCK FACE THREE OCLOCK"/* 1F552 */, /*47191*/"CLOCK FACE FOUR OCLOCK"/* 1F553 */,/*47192*/"CLOCK FACE FIVE OCLOCK"/* 1F554 */, /*47193*/"CLOCK FACE SIX OCLOCK"/* 1F555 */,/*47194*/"CLOCK FACE SEVEN OCLOCK"/* 1F556 */, /*47195*/"CLOCK FACE EIGHT OCLOCK"/* 1F557 */,/*47196*/"CLOCK FACE NINE OCLOCK"/* 1F558 */, /*47197*/"CLOCK FACE TEN OCLOCK"/* 1F559 */,/*47198*/"CLOCK FACE ELEVEN OCLOCK"/* 1F55A */, /*47199*/"CLOCK FACE TWELVE OCLOCK"/* 1F55B */,/*47200*/"CLOCK FACE ONE-THIRTY"/* 1F55C */, /*47201*/"CLOCK FACE TWO-THIRTY"/* 1F55D */,/*47202*/"CLOCK FACE THREE-THIRTY"/* 1F55E */, /*47203*/"CLOCK FACE FOUR-THIRTY"/* 1F55F */,/*47204*/"CLOCK FACE FIVE-THIRTY"/* 1F560 */, /*47205*/"CLOCK FACE SIX-THIRTY"/* 1F561 */,/*47206*/"CLOCK FACE SEVEN-THIRTY"/* 1F562 */, /*47207*/"CLOCK FACE EIGHT-THIRTY"/* 1F563 */,/*47208*/"CLOCK FACE NINE-THIRTY"/* 1F564 */, /*47209*/"CLOCK FACE TEN-THIRTY"/* 1F565 */,/*47210*/"CLOCK FACE ELEVEN-THIRTY"/* 1F566 */, /*47211*/"CLOCK FACE TWELVE-THIRTY"/* 1F567 */,/*47212*/"RIGHT SPEAKER"/* 1F568 */, /*47213*/"RIGHT SPEAKER WITH ONE SOUND WAVE"/* 1F569 */,/*47214*/"RIGHT SPEAKER WITH THREE SOUND WAVES"/* 1F56A */, /*47215*/"BULLHORN"/* 1F56B */,/*47216*/"BULLHORN WITH SOUND WAVES"/* 1F56C */,/*47217*/"RINGING BELL"/* 1F56D */, /*47218*/"BOOK"/* 1F56E */,/*47219*/"CANDLE"/* 1F56F */,/*47220*/"MANTELPIECE CLOCK"/* 1F570 */, /*47221*/"BLACK SKULL AND CROSSBONES"/* 1F571 */,/*47222*/"NO PIRACY"/* 1F572 */,/*47223*/"HOLE"/* 1F573 */, /*47224*/"MAN IN BUSINESS SUIT LEVITATING"/* 1F574 */,/*47225*/"SLEUTH OR SPY"/* 1F575 */, /*47226*/"DARK SUNGLASSES"/* 1F576 */,/*47227*/"SPIDER"/* 1F577 */,/*47228*/"SPIDER WEB"/* 1F578 */, /*47229*/"JOYSTICK"/* 1F579 */,NULL,/*47231*/"LEFT HAND TELEPHONE RECEIVER"/* 1F57B */, /*47232*/"TELEPHONE RECEIVER WITH PAGE"/* 1F57C */,/*47233*/"RIGHT HAND TELEPHONE RECEIVER"/* 1F57D */, /*47234*/"WHITE TOUCHTONE TELEPHONE"/* 1F57E */,/*47235*/"BLACK TOUCHTONE TELEPHONE"/* 1F57F */, /*47236*/"TELEPHONE ON TOP OF MODEM"/* 1F580 */,/*47237*/"CLAMSHELL MOBILE PHONE"/* 1F581 */, /*47238*/"BACK OF ENVELOPE"/* 1F582 */,/*47239*/"STAMPED ENVELOPE"/* 1F583 */, /*47240*/"ENVELOPE WITH LIGHTNING"/* 1F584 */,/*47241*/"FLYING ENVELOPE"/* 1F585 */, /*47242*/"PEN OVER STAMPED ENVELOPE"/* 1F586 */,/*47243*/"LINKED PAPERCLIPS"/* 1F587 */, /*47244*/"BLACK PUSHPIN"/* 1F588 */,/*47245*/"LOWER LEFT PENCIL"/* 1F589 */, /*47246*/"LOWER LEFT BALLPOINT PEN"/* 1F58A */,/*47247*/"LOWER LEFT FOUNTAIN PEN"/* 1F58B */, /*47248*/"LOWER LEFT PAINTBRUSH"/* 1F58C */,/*47249*/"LOWER LEFT CRAYON"/* 1F58D */, /*47250*/"LEFT WRITING HAND"/* 1F58E */,/*47251*/"TURNED OK HAND SIGN"/* 1F58F */, /*47252*/"RAISED HAND WITH FINGERS SPLAYED"/* 1F590 */,/*47253*/"REVERSED RAISED HAND WITH FINGERS SPLAYED"/* 1F591 */, /*47254*/"REVERSED THUMBS UP SIGN"/* 1F592 */,/*47255*/"REVERSED THUMBS DOWN SIGN"/* 1F593 */, /*47256*/"REVERSED VICTORY HAND"/* 1F594 */,/*47257*/"REVERSED HAND WITH MIDDLE FINGER EXTENDED"/* 1F595 */, /*47258*/"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS"/* 1F596 */, /*47259*/"WHITE DOWN POINTING LEFT HAND INDEX"/* 1F597 */,/*47260*/"SIDEWAYS WHITE LEFT POINTING INDEX"/* 1F598 */, /*47261*/"SIDEWAYS WHITE RIGHT POINTING INDEX"/* 1F599 */,/*47262*/"SIDEWAYS BLACK LEFT POINTING INDEX"/* 1F59A */, /*47263*/"SIDEWAYS BLACK RIGHT POINTING INDEX"/* 1F59B */,/*47264*/"BLACK LEFT POINTING BACKHAND INDEX"/* 1F59C */, /*47265*/"BLACK RIGHT POINTING BACKHAND INDEX"/* 1F59D */,/*47266*/"SIDEWAYS WHITE UP POINTING INDEX"/* 1F59E */, /*47267*/"SIDEWAYS WHITE DOWN POINTING INDEX"/* 1F59F */,/*47268*/"SIDEWAYS BLACK UP POINTING INDEX"/* 1F5A0 */, /*47269*/"SIDEWAYS BLACK DOWN POINTING INDEX"/* 1F5A1 */,/*47270*/"BLACK UP POINTING BACKHAND INDEX"/* 1F5A2 */, /*47271*/"BLACK DOWN POINTING BACKHAND INDEX"/* 1F5A3 */,NULL,/*47273*/"DESKTOP COMPUTER"/* 1F5A5 */, /*47274*/"KEYBOARD AND MOUSE"/* 1F5A6 */,/*47275*/"THREE NETWORKED COMPUTERS"/* 1F5A7 */,/*47276*/"PRINTER"/* 1F5A8 */, /*47277*/"POCKET CALCULATOR"/* 1F5A9 */,/*47278*/"BLACK HARD SHELL FLOPPY DISK"/* 1F5AA */, /*47279*/"WHITE HARD SHELL FLOPPY DISK"/* 1F5AB */,/*47280*/"SOFT SHELL FLOPPY DISK"/* 1F5AC */, /*47281*/"TAPE CARTRIDGE"/* 1F5AD */,/*47282*/"WIRED KEYBOARD"/* 1F5AE */,/*47283*/"ONE BUTTON MOUSE"/* 1F5AF */, /*47284*/"TWO BUTTON MOUSE"/* 1F5B0 */,/*47285*/"THREE BUTTON MOUSE"/* 1F5B1 */,/*47286*/"TRACKBALL"/* 1F5B2 */, /*47287*/"OLD PERSONAL COMPUTER"/* 1F5B3 */,/*47288*/"HARD DISK"/* 1F5B4 */,/*47289*/"SCREEN"/* 1F5B5 */, /*47290*/"PRINTER ICON"/* 1F5B6 */,/*47291*/"FAX ICON"/* 1F5B7 */,/*47292*/"OPTICAL DISC ICON"/* 1F5B8 */, /*47293*/"DOCUMENT WITH TEXT"/* 1F5B9 */,/*47294*/"DOCUMENT WITH TEXT AND PICTURE"/* 1F5BA */, /*47295*/"DOCUMENT WITH PICTURE"/* 1F5BB */,/*47296*/"FRAME WITH PICTURE"/* 1F5BC */, /*47297*/"FRAME WITH TILES"/* 1F5BD */,/*47298*/"FRAME WITH AN X"/* 1F5BE */,/*47299*/"BLACK FOLDER"/* 1F5BF */, /*47300*/"FOLDER"/* 1F5C0 */,/*47301*/"OPEN FOLDER"/* 1F5C1 */,/*47302*/"CARD INDEX DIVIDERS"/* 1F5C2 */, /*47303*/"CARD FILE BOX"/* 1F5C3 */,/*47304*/"FILE CABINET"/* 1F5C4 */,/*47305*/"EMPTY NOTE"/* 1F5C5 */, /*47306*/"EMPTY NOTE PAGE"/* 1F5C6 */,/*47307*/"EMPTY NOTE PAD"/* 1F5C7 */,/*47308*/"NOTE"/* 1F5C8 */, /*47309*/"NOTE PAGE"/* 1F5C9 */,/*47310*/"NOTE PAD"/* 1F5CA */,/*47311*/"EMPTY DOCUMENT"/* 1F5CB */, /*47312*/"EMPTY PAGE"/* 1F5CC */,/*47313*/"EMPTY PAGES"/* 1F5CD */,/*47314*/"DOCUMENT"/* 1F5CE */, /*47315*/"PAGE"/* 1F5CF */,/*47316*/"PAGES"/* 1F5D0 */,/*47317*/"WASTEBASKET"/* 1F5D1 */, /*47318*/"SPIRAL NOTE PAD"/* 1F5D2 */,/*47319*/"SPIRAL CALENDAR PAD"/* 1F5D3 */,/*47320*/"DESKTOP WINDOW"/* 1F5D4 */, /*47321*/"MINIMIZE"/* 1F5D5 */,/*47322*/"MAXIMIZE"/* 1F5D6 */,/*47323*/"OVERLAP"/* 1F5D7 */, /*47324*/"CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS"/* 1F5D8 */,/*47325*/"CANCELLATION X"/* 1F5D9 */, /*47326*/"INCREASE FONT SIZE SYMBOL"/* 1F5DA */,/*47327*/"DECREASE FONT SIZE SYMBOL"/* 1F5DB */, /*47328*/"COMPRESSION"/* 1F5DC */,/*47329*/"OLD KEY"/* 1F5DD */,/*47330*/"ROLLED-UP NEWSPAPER"/* 1F5DE */, /*47331*/"PAGE WITH CIRCLED TEXT"/* 1F5DF */,/*47332*/"STOCK CHART"/* 1F5E0 */,/*47333*/"DAGGER KNIFE"/* 1F5E1 */, /*47334*/"LIPS"/* 1F5E2 */,/*47335*/"SPEAKING HEAD IN SILHOUETTE"/* 1F5E3 */,/*47336*/"THREE RAYS ABOVE"/* 1F5E4 */, /*47337*/"THREE RAYS BELOW"/* 1F5E5 */,/*47338*/"THREE RAYS LEFT"/* 1F5E6 */,/*47339*/"THREE RAYS RIGHT"/* 1F5E7 */, /*47340*/"LEFT SPEECH BUBBLE"/* 1F5E8 */,/*47341*/"RIGHT SPEECH BUBBLE"/* 1F5E9 */, /*47342*/"TWO SPEECH BUBBLES"/* 1F5EA */,/*47343*/"THREE SPEECH BUBBLES"/* 1F5EB */, /*47344*/"LEFT THOUGHT BUBBLE"/* 1F5EC */,/*47345*/"RIGHT THOUGHT BUBBLE"/* 1F5ED */, /*47346*/"LEFT ANGER BUBBLE"/* 1F5EE */,/*47347*/"RIGHT ANGER BUBBLE"/* 1F5EF */,/*47348*/"MOOD BUBBLE"/* 1F5F0 */, /*47349*/"LIGHTNING MOOD BUBBLE"/* 1F5F1 */,/*47350*/"LIGHTNING MOOD"/* 1F5F2 */, /*47351*/"BALLOT BOX WITH BALLOT"/* 1F5F3 */,/*47352*/"BALLOT SCRIPT X"/* 1F5F4 */, /*47353*/"BALLOT BOX WITH SCRIPT X"/* 1F5F5 */,/*47354*/"BALLOT BOLD SCRIPT X"/* 1F5F6 */, /*47355*/"BALLOT BOX WITH BOLD SCRIPT X"/* 1F5F7 */,/*47356*/"LIGHT CHECK MARK"/* 1F5F8 */, /*47357*/"BALLOT BOX WITH BOLD CHECK"/* 1F5F9 */,/*47358*/"WORLD MAP"/* 1F5FA */,/*47359*/"MOUNT FUJI"/* 1F5FB */, /*47360*/"TOKYO TOWER"/* 1F5FC */,/*47361*/"STATUE OF LIBERTY"/* 1F5FD */,/*47362*/"SILHOUETTE OF JAPAN"/* 1F5FE */, /*47363*/"MOYAI"/* 1F5FF */,/*47364*/"GRINNING FACE"/* 1F600 */,/*47365*/"GRINNING FACE WITH SMILING EYES"/* 1F601 */, /*47366*/"FACE WITH TEARS OF JOY"/* 1F602 */,/*47367*/"SMILING FACE WITH OPEN MOUTH"/* 1F603 */, /*47368*/"SMILING FACE WITH OPEN MOUTH AND SMILING EYES"/* 1F604 */, /*47369*/"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT"/* 1F605 */, /*47370*/"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES"/* 1F606 */,/*47371*/"SMILING FACE WITH HALO"/* 1F607 */, /*47372*/"SMILING FACE WITH HORNS"/* 1F608 */,/*47373*/"WINKING FACE"/* 1F609 */, /*47374*/"SMILING FACE WITH SMILING EYES"/* 1F60A */,/*47375*/"FACE SAVOURING DELICIOUS FOOD"/* 1F60B */, /*47376*/"RELIEVED FACE"/* 1F60C */,/*47377*/"SMILING FACE WITH HEART-SHAPED EYES"/* 1F60D */, /*47378*/"SMILING FACE WITH SUNGLASSES"/* 1F60E */,/*47379*/"SMIRKING FACE"/* 1F60F */, /*47380*/"NEUTRAL FACE"/* 1F610 */,/*47381*/"EXPRESSIONLESS FACE"/* 1F611 */,/*47382*/"UNAMUSED FACE"/* 1F612 */, /*47383*/"FACE WITH COLD SWEAT"/* 1F613 */,/*47384*/"PENSIVE FACE"/* 1F614 */,/*47385*/"CONFUSED FACE"/* 1F615 */, /*47386*/"CONFOUNDED FACE"/* 1F616 */,/*47387*/"KISSING FACE"/* 1F617 */,/*47388*/"FACE THROWING A KISS"/* 1F618 */, /*47389*/"KISSING FACE WITH SMILING EYES"/* 1F619 */,/*47390*/"KISSING FACE WITH CLOSED EYES"/* 1F61A */, /*47391*/"FACE WITH STUCK-OUT TONGUE"/* 1F61B */,/*47392*/"FACE WITH STUCK-OUT TONGUE AND WINKING EYE"/* 1F61C */, /*47393*/"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES"/* 1F61D */,/*47394*/"DISAPPOINTED FACE"/* 1F61E */, /*47395*/"WORRIED FACE"/* 1F61F */,/*47396*/"ANGRY FACE"/* 1F620 */,/*47397*/"POUTING FACE"/* 1F621 */, /*47398*/"CRYING FACE"/* 1F622 */,/*47399*/"PERSEVERING FACE"/* 1F623 */,/*47400*/"FACE WITH LOOK OF TRIUMPH"/* 1F624 */, /*47401*/"DISAPPOINTED BUT RELIEVED FACE"/* 1F625 */,/*47402*/"FROWNING FACE WITH OPEN MOUTH"/* 1F626 */, /*47403*/"ANGUISHED FACE"/* 1F627 */,/*47404*/"FEARFUL FACE"/* 1F628 */,/*47405*/"WEARY FACE"/* 1F629 */, /*47406*/"SLEEPY FACE"/* 1F62A */,/*47407*/"TIRED FACE"/* 1F62B */,/*47408*/"GRIMACING FACE"/* 1F62C */, /*47409*/"LOUDLY CRYING FACE"/* 1F62D */,/*47410*/"FACE WITH OPEN MOUTH"/* 1F62E */,/*47411*/"HUSHED FACE"/* 1F62F */, /*47412*/"FACE WITH OPEN MOUTH AND COLD SWEAT"/* 1F630 */,/*47413*/"FACE SCREAMING IN FEAR"/* 1F631 */, /*47414*/"ASTONISHED FACE"/* 1F632 */,/*47415*/"FLUSHED FACE"/* 1F633 */,/*47416*/"SLEEPING FACE"/* 1F634 */, /*47417*/"DIZZY FACE"/* 1F635 */,/*47418*/"FACE WITHOUT MOUTH"/* 1F636 */,/*47419*/"FACE WITH MEDICAL MASK"/* 1F637 */, /*47420*/"GRINNING CAT FACE WITH SMILING EYES"/* 1F638 */,/*47421*/"CAT FACE WITH TEARS OF JOY"/* 1F639 */, /*47422*/"SMILING CAT FACE WITH OPEN MOUTH"/* 1F63A */,/*47423*/"SMILING CAT FACE WITH HEART-SHAPED EYES"/* 1F63B */, /*47424*/"CAT FACE WITH WRY SMILE"/* 1F63C */,/*47425*/"KISSING CAT FACE WITH CLOSED EYES"/* 1F63D */, /*47426*/"POUTING CAT FACE"/* 1F63E */,/*47427*/"CRYING CAT FACE"/* 1F63F */,/*47428*/"WEARY CAT FACE"/* 1F640 */, /*47429*/"SLIGHTLY FROWNING FACE"/* 1F641 */,/*47430*/"SLIGHTLY SMILING FACE"/* 1F642 */, /*47431*/"UPSIDE-DOWN FACE"/* 1F643 */,/*47432*/"FACE WITH ROLLING EYES"/* 1F644 */, /*47433*/"FACE WITH NO GOOD GESTURE"/* 1F645 */,/*47434*/"FACE WITH OK GESTURE"/* 1F646 */, /*47435*/"PERSON BOWING DEEPLY"/* 1F647 */,/*47436*/"SEE-NO-EVIL MONKEY"/* 1F648 */, /*47437*/"HEAR-NO-EVIL MONKEY"/* 1F649 */,/*47438*/"SPEAK-NO-EVIL MONKEY"/* 1F64A */, /*47439*/"HAPPY PERSON RAISING ONE HAND"/* 1F64B */,/*47440*/"PERSON RAISING BOTH HANDS IN CELEBRATION"/* 1F64C */, /*47441*/"PERSON FROWNING"/* 1F64D */,/*47442*/"PERSON WITH POUTING FACE"/* 1F64E */, /*47443*/"PERSON WITH FOLDED HANDS"/* 1F64F */,/*47444*/"NORTH WEST POINTING LEAF"/* 1F650 */, /*47445*/"SOUTH WEST POINTING LEAF"/* 1F651 */,/*47446*/"NORTH EAST POINTING LEAF"/* 1F652 */, /*47447*/"SOUTH EAST POINTING LEAF"/* 1F653 */,/*47448*/"TURNED NORTH WEST POINTING LEAF"/* 1F654 */, /*47449*/"TURNED SOUTH WEST POINTING LEAF"/* 1F655 */,/*47450*/"TURNED NORTH EAST POINTING LEAF"/* 1F656 */, /*47451*/"TURNED SOUTH EAST POINTING LEAF"/* 1F657 */,/*47452*/"NORTH WEST POINTING VINE LEAF"/* 1F658 */, /*47453*/"SOUTH WEST POINTING VINE LEAF"/* 1F659 */,/*47454*/"NORTH EAST POINTING VINE LEAF"/* 1F65A */, /*47455*/"SOUTH EAST POINTING VINE LEAF"/* 1F65B */,/*47456*/"HEAVY NORTH WEST POINTING VINE LEAF"/* 1F65C */, /*47457*/"HEAVY SOUTH WEST POINTING VINE LEAF"/* 1F65D */,/*47458*/"HEAVY NORTH EAST POINTING VINE LEAF"/* 1F65E */, /*47459*/"HEAVY SOUTH EAST POINTING VINE LEAF"/* 1F65F */,/*47460*/"NORTH WEST POINTING BUD"/* 1F660 */, /*47461*/"SOUTH WEST POINTING BUD"/* 1F661 */,/*47462*/"NORTH EAST POINTING BUD"/* 1F662 */, /*47463*/"SOUTH EAST POINTING BUD"/* 1F663 */,/*47464*/"HEAVY NORTH WEST POINTING BUD"/* 1F664 */, /*47465*/"HEAVY SOUTH WEST POINTING BUD"/* 1F665 */,/*47466*/"HEAVY NORTH EAST POINTING BUD"/* 1F666 */, /*47467*/"HEAVY SOUTH EAST POINTING BUD"/* 1F667 */,/*47468*/"HOLLOW QUILT SQUARE ORNAMENT"/* 1F668 */, /*47469*/"HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE"/* 1F669 */,/*47470*/"SOLID QUILT SQUARE ORNAMENT"/* 1F66A */, /*47471*/"SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE"/* 1F66B */,/*47472*/"LEFTWARDS ROCKET"/* 1F66C */, /*47473*/"UPWARDS ROCKET"/* 1F66D */,/*47474*/"RIGHTWARDS ROCKET"/* 1F66E */,/*47475*/"DOWNWARDS ROCKET"/* 1F66F */, /*47476*/"SCRIPT LIGATURE ET ORNAMENT"/* 1F670 */,/*47477*/"HEAVY SCRIPT LIGATURE ET ORNAMENT"/* 1F671 */, /*47478*/"LIGATURE OPEN ET ORNAMENT"/* 1F672 */,/*47479*/"HEAVY LIGATURE OPEN ET ORNAMENT"/* 1F673 */, /*47480*/"HEAVY AMPERSAND ORNAMENT"/* 1F674 */,/*47481*/"SWASH AMPERSAND ORNAMENT"/* 1F675 */, /*47482*/"SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 1F676 */, /*47483*/"SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 1F677 */, /*47484*/"SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 1F678 */, /*47485*/"HEAVY INTERROBANG ORNAMENT"/* 1F679 */,/*47486*/"SANS-SERIF INTERROBANG ORNAMENT"/* 1F67A */, /*47487*/"HEAVY SANS-SERIF INTERROBANG ORNAMENT"/* 1F67B */,/*47488*/"VERY HEAVY SOLIDUS"/* 1F67C */, /*47489*/"VERY HEAVY REVERSE SOLIDUS"/* 1F67D */,/*47490*/"CHECKER BOARD"/* 1F67E */, /*47491*/"REVERSE CHECKER BOARD"/* 1F67F */,/*47492*/"ROCKET"/* 1F680 */,/*47493*/"HELICOPTER"/* 1F681 */, /*47494*/"STEAM LOCOMOTIVE"/* 1F682 */,/*47495*/"RAILWAY CAR"/* 1F683 */,/*47496*/"HIGH-SPEED TRAIN"/* 1F684 */, /*47497*/"HIGH-SPEED TRAIN WITH BULLET NOSE"/* 1F685 */,/*47498*/"TRAIN"/* 1F686 */,/*47499*/"METRO"/* 1F687 */, /*47500*/"LIGHT RAIL"/* 1F688 */,/*47501*/"STATION"/* 1F689 */,/*47502*/"TRAM"/* 1F68A */,/*47503*/"TRAM CAR"/* 1F68B */, /*47504*/"BUS"/* 1F68C */,/*47505*/"ONCOMING BUS"/* 1F68D */,/*47506*/"TROLLEYBUS"/* 1F68E */, /*47507*/"BUS STOP"/* 1F68F */,/*47508*/"MINIBUS"/* 1F690 */,/*47509*/"AMBULANCE"/* 1F691 */, /*47510*/"FIRE ENGINE"/* 1F692 */,/*47511*/"POLICE CAR"/* 1F693 */,/*47512*/"ONCOMING POLICE CAR"/* 1F694 */, /*47513*/"TAXI"/* 1F695 */,/*47514*/"ONCOMING TAXI"/* 1F696 */,/*47515*/"AUTOMOBILE"/* 1F697 */, /*47516*/"ONCOMING AUTOMOBILE"/* 1F698 */,/*47517*/"RECREATIONAL VEHICLE"/* 1F699 */, /*47518*/"DELIVERY TRUCK"/* 1F69A */,/*47519*/"ARTICULATED LORRY"/* 1F69B */,/*47520*/"TRACTOR"/* 1F69C */, /*47521*/"MONORAIL"/* 1F69D */,/*47522*/"MOUNTAIN RAILWAY"/* 1F69E */,/*47523*/"SUSPENSION RAILWAY"/* 1F69F */, /*47524*/"MOUNTAIN CABLEWAY"/* 1F6A0 */,/*47525*/"AERIAL TRAMWAY"/* 1F6A1 */,/*47526*/"SHIP"/* 1F6A2 */, /*47527*/"ROWBOAT"/* 1F6A3 */,/*47528*/"SPEEDBOAT"/* 1F6A4 */,/*47529*/"HORIZONTAL TRAFFIC LIGHT"/* 1F6A5 */, /*47530*/"VERTICAL TRAFFIC LIGHT"/* 1F6A6 */,/*47531*/"CONSTRUCTION SIGN"/* 1F6A7 */, /*47532*/"POLICE CARS REVOLVING LIGHT"/* 1F6A8 */,/*47533*/"TRIANGULAR FLAG ON POST"/* 1F6A9 */, /*47534*/"DOOR"/* 1F6AA */,/*47535*/"NO ENTRY SIGN"/* 1F6AB */,/*47536*/"SMOKING SYMBOL"/* 1F6AC */, /*47537*/"NO SMOKING SYMBOL"/* 1F6AD */,/*47538*/"PUT LITTER IN ITS PLACE SYMBOL"/* 1F6AE */, /*47539*/"DO NOT LITTER SYMBOL"/* 1F6AF */,/*47540*/"POTABLE WATER SYMBOL"/* 1F6B0 */, /*47541*/"NON-POTABLE WATER SYMBOL"/* 1F6B1 */,/*47542*/"BICYCLE"/* 1F6B2 */,/*47543*/"NO BICYCLES"/* 1F6B3 */, /*47544*/"BICYCLIST"/* 1F6B4 */,/*47545*/"MOUNTAIN BICYCLIST"/* 1F6B5 */,/*47546*/"PEDESTRIAN"/* 1F6B6 */, /*47547*/"NO PEDESTRIANS"/* 1F6B7 */,/*47548*/"CHILDREN CROSSING"/* 1F6B8 */,/*47549*/"MENS SYMBOL"/* 1F6B9 */, /*47550*/"WOMENS SYMBOL"/* 1F6BA */,/*47551*/"RESTROOM"/* 1F6BB */,/*47552*/"BABY SYMBOL"/* 1F6BC */, /*47553*/"TOILET"/* 1F6BD */,/*47554*/"WATER CLOSET"/* 1F6BE */,/*47555*/"SHOWER"/* 1F6BF */,/*47556*/"BATH"/* 1F6C0 */, /*47557*/"BATHTUB"/* 1F6C1 */,/*47558*/"PASSPORT CONTROL"/* 1F6C2 */,/*47559*/"CUSTOMS"/* 1F6C3 */, /*47560*/"BAGGAGE CLAIM"/* 1F6C4 */,/*47561*/"LEFT LUGGAGE"/* 1F6C5 */, /*47562*/"TRIANGLE WITH ROUNDED CORNERS"/* 1F6C6 */,/*47563*/"PROHIBITED SIGN"/* 1F6C7 */, /*47564*/"CIRCLED INFORMATION SOURCE"/* 1F6C8 */,/*47565*/"BOYS SYMBOL"/* 1F6C9 */,/*47566*/"GIRLS SYMBOL"/* 1F6CA */, /*47567*/"COUCH AND LAMP"/* 1F6CB */,/*47568*/"SLEEPING ACCOMMODATION"/* 1F6CC */,/*47569*/"SHOPPING BAGS"/* 1F6CD */, /*47570*/"BELLHOP BELL"/* 1F6CE */,/*47571*/"BED"/* 1F6CF */,/*47572*/"PLACE OF WORSHIP"/* 1F6D0 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*47588*/"HAMMER AND WRENCH"/* 1F6E0 */, /*47589*/"SHIELD"/* 1F6E1 */,/*47590*/"OIL DRUM"/* 1F6E2 */,/*47591*/"MOTORWAY"/* 1F6E3 */, /*47592*/"RAILWAY TRACK"/* 1F6E4 */,/*47593*/"MOTOR BOAT"/* 1F6E5 */,/*47594*/"UP-POINTING MILITARY AIRPLANE"/* 1F6E6 */, /*47595*/"UP-POINTING AIRPLANE"/* 1F6E7 */,/*47596*/"UP-POINTING SMALL AIRPLANE"/* 1F6E8 */, /*47597*/"SMALL AIRPLANE"/* 1F6E9 */,/*47598*/"NORTHEAST-POINTING AIRPLANE"/* 1F6EA */, /*47599*/"AIRPLANE DEPARTURE"/* 1F6EB */,/*47600*/"AIRPLANE ARRIVING"/* 1F6EC */,NULL,NULL,NULL, /*47604*/"SATELLITE"/* 1F6F0 */,/*47605*/"ONCOMING FIRE ENGINE"/* 1F6F1 */,/*47606*/"DIESEL LOCOMOTIVE"/* 1F6F2 */, /*47607*/"PASSENGER SHIP"/* 1F6F3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*47620*/"ALCHEMICAL SYMBOL FOR QUINTESSENCE"/* 1F700 */,/*47621*/"ALCHEMICAL SYMBOL FOR AIR"/* 1F701 */, /*47622*/"ALCHEMICAL SYMBOL FOR FIRE"/* 1F702 */,/*47623*/"ALCHEMICAL SYMBOL FOR EARTH"/* 1F703 */, /*47624*/"ALCHEMICAL SYMBOL FOR WATER"/* 1F704 */,/*47625*/"ALCHEMICAL SYMBOL FOR AQUAFORTIS"/* 1F705 */, /*47626*/"ALCHEMICAL SYMBOL FOR AQUA REGIA"/* 1F706 */,/*47627*/"ALCHEMICAL SYMBOL FOR AQUA REGIA-2"/* 1F707 */, /*47628*/"ALCHEMICAL SYMBOL FOR AQUA VITAE"/* 1F708 */,/*47629*/"ALCHEMICAL SYMBOL FOR AQUA VITAE-2"/* 1F709 */, /*47630*/"ALCHEMICAL SYMBOL FOR VINEGAR"/* 1F70A */,/*47631*/"ALCHEMICAL SYMBOL FOR VINEGAR-2"/* 1F70B */, /*47632*/"ALCHEMICAL SYMBOL FOR VINEGAR-3"/* 1F70C */,/*47633*/"ALCHEMICAL SYMBOL FOR SULFUR"/* 1F70D */, /*47634*/"ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR"/* 1F70E */,/*47635*/"ALCHEMICAL SYMBOL FOR BLACK SULFUR"/* 1F70F */, /*47636*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE"/* 1F710 */, /*47637*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2"/* 1F711 */, /*47638*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3"/* 1F712 */,/*47639*/"ALCHEMICAL SYMBOL FOR CINNABAR"/* 1F713 */, /*47640*/"ALCHEMICAL SYMBOL FOR SALT"/* 1F714 */,/*47641*/"ALCHEMICAL SYMBOL FOR NITRE"/* 1F715 */, /*47642*/"ALCHEMICAL SYMBOL FOR VITRIOL"/* 1F716 */,/*47643*/"ALCHEMICAL SYMBOL FOR VITRIOL-2"/* 1F717 */, /*47644*/"ALCHEMICAL SYMBOL FOR ROCK SALT"/* 1F718 */,/*47645*/"ALCHEMICAL SYMBOL FOR ROCK SALT-2"/* 1F719 */, /*47646*/"ALCHEMICAL SYMBOL FOR GOLD"/* 1F71A */,/*47647*/"ALCHEMICAL SYMBOL FOR SILVER"/* 1F71B */, /*47648*/"ALCHEMICAL SYMBOL FOR IRON ORE"/* 1F71C */,/*47649*/"ALCHEMICAL SYMBOL FOR IRON ORE-2"/* 1F71D */, /*47650*/"ALCHEMICAL SYMBOL FOR CROCUS OF IRON"/* 1F71E */,/*47651*/"ALCHEMICAL SYMBOL FOR REGULUS OF IRON"/* 1F71F */, /*47652*/"ALCHEMICAL SYMBOL FOR COPPER ORE"/* 1F720 */,/*47653*/"ALCHEMICAL SYMBOL FOR IRON-COPPER ORE"/* 1F721 */, /*47654*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER"/* 1F722 */, /*47655*/"ALCHEMICAL SYMBOL FOR CROCUS OF COPPER"/* 1F723 */, /*47656*/"ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2"/* 1F724 */, /*47657*/"ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE"/* 1F725 */, /*47658*/"ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE"/* 1F726 */, /*47659*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER"/* 1F727 */, /*47660*/"ALCHEMICAL SYMBOL FOR VERDIGRIS"/* 1F728 */,/*47661*/"ALCHEMICAL SYMBOL FOR TIN ORE"/* 1F729 */, /*47662*/"ALCHEMICAL SYMBOL FOR LEAD ORE"/* 1F72A */,/*47663*/"ALCHEMICAL SYMBOL FOR ANTIMONY ORE"/* 1F72B */, /*47664*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY"/* 1F72C */, /*47665*/"ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY"/* 1F72D */, /*47666*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY"/* 1F72E */, /*47667*/"ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY"/* 1F72F */, /*47668*/"ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY"/* 1F730 */, /*47669*/"ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2"/* 1F731 */,/*47670*/"ALCHEMICAL SYMBOL FOR REGULUS"/* 1F732 */, /*47671*/"ALCHEMICAL SYMBOL FOR REGULUS-2"/* 1F733 */,/*47672*/"ALCHEMICAL SYMBOL FOR REGULUS-3"/* 1F734 */, /*47673*/"ALCHEMICAL SYMBOL FOR REGULUS-4"/* 1F735 */,/*47674*/"ALCHEMICAL SYMBOL FOR ALKALI"/* 1F736 */, /*47675*/"ALCHEMICAL SYMBOL FOR ALKALI-2"/* 1F737 */,/*47676*/"ALCHEMICAL SYMBOL FOR MARCASITE"/* 1F738 */, /*47677*/"ALCHEMICAL SYMBOL FOR SAL-AMMONIAC"/* 1F739 */,/*47678*/"ALCHEMICAL SYMBOL FOR ARSENIC"/* 1F73A */, /*47679*/"ALCHEMICAL SYMBOL FOR REALGAR"/* 1F73B */,/*47680*/"ALCHEMICAL SYMBOL FOR REALGAR-2"/* 1F73C */, /*47681*/"ALCHEMICAL SYMBOL FOR AURIPIGMENT"/* 1F73D */,/*47682*/"ALCHEMICAL SYMBOL FOR BISMUTH ORE"/* 1F73E */, /*47683*/"ALCHEMICAL SYMBOL FOR TARTAR"/* 1F73F */,/*47684*/"ALCHEMICAL SYMBOL FOR TARTAR-2"/* 1F740 */, /*47685*/"ALCHEMICAL SYMBOL FOR QUICK LIME"/* 1F741 */,/*47686*/"ALCHEMICAL SYMBOL FOR BORAX"/* 1F742 */, /*47687*/"ALCHEMICAL SYMBOL FOR BORAX-2"/* 1F743 */,/*47688*/"ALCHEMICAL SYMBOL FOR BORAX-3"/* 1F744 */, /*47689*/"ALCHEMICAL SYMBOL FOR ALUM"/* 1F745 */,/*47690*/"ALCHEMICAL SYMBOL FOR OIL"/* 1F746 */, /*47691*/"ALCHEMICAL SYMBOL FOR SPIRIT"/* 1F747 */,/*47692*/"ALCHEMICAL SYMBOL FOR TINCTURE"/* 1F748 */, /*47693*/"ALCHEMICAL SYMBOL FOR GUM"/* 1F749 */,/*47694*/"ALCHEMICAL SYMBOL FOR WAX"/* 1F74A */, /*47695*/"ALCHEMICAL SYMBOL FOR POWDER"/* 1F74B */,/*47696*/"ALCHEMICAL SYMBOL FOR CALX"/* 1F74C */, /*47697*/"ALCHEMICAL SYMBOL FOR TUTTY"/* 1F74D */,/*47698*/"ALCHEMICAL SYMBOL FOR CAPUT MORTUUM"/* 1F74E */, /*47699*/"ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE"/* 1F74F */,/*47700*/"ALCHEMICAL SYMBOL FOR CADUCEUS"/* 1F750 */, /*47701*/"ALCHEMICAL SYMBOL FOR TRIDENT"/* 1F751 */,/*47702*/"ALCHEMICAL SYMBOL FOR STARRED TRIDENT"/* 1F752 */, /*47703*/"ALCHEMICAL SYMBOL FOR LODESTONE"/* 1F753 */,/*47704*/"ALCHEMICAL SYMBOL FOR SOAP"/* 1F754 */, /*47705*/"ALCHEMICAL SYMBOL FOR URINE"/* 1F755 */,/*47706*/"ALCHEMICAL SYMBOL FOR HORSE DUNG"/* 1F756 */, /*47707*/"ALCHEMICAL SYMBOL FOR ASHES"/* 1F757 */,/*47708*/"ALCHEMICAL SYMBOL FOR POT ASHES"/* 1F758 */, /*47709*/"ALCHEMICAL SYMBOL FOR BRICK"/* 1F759 */,/*47710*/"ALCHEMICAL SYMBOL FOR POWDERED BRICK"/* 1F75A */, /*47711*/"ALCHEMICAL SYMBOL FOR AMALGAM"/* 1F75B */,/*47712*/"ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM"/* 1F75C */, /*47713*/"ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2"/* 1F75D */, /*47714*/"ALCHEMICAL SYMBOL FOR SUBLIMATION"/* 1F75E */,/*47715*/"ALCHEMICAL SYMBOL FOR PRECIPITATE"/* 1F75F */, /*47716*/"ALCHEMICAL SYMBOL FOR DISTILL"/* 1F760 */,/*47717*/"ALCHEMICAL SYMBOL FOR DISSOLVE"/* 1F761 */, /*47718*/"ALCHEMICAL SYMBOL FOR DISSOLVE-2"/* 1F762 */,/*47719*/"ALCHEMICAL SYMBOL FOR PURIFY"/* 1F763 */, /*47720*/"ALCHEMICAL SYMBOL FOR PUTREFACTION"/* 1F764 */,/*47721*/"ALCHEMICAL SYMBOL FOR CRUCIBLE"/* 1F765 */, /*47722*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-2"/* 1F766 */,/*47723*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-3"/* 1F767 */, /*47724*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-4"/* 1F768 */,/*47725*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-5"/* 1F769 */, /*47726*/"ALCHEMICAL SYMBOL FOR ALEMBIC"/* 1F76A */,/*47727*/"ALCHEMICAL SYMBOL FOR BATH OF MARY"/* 1F76B */, /*47728*/"ALCHEMICAL SYMBOL FOR BATH OF VAPOURS"/* 1F76C */,/*47729*/"ALCHEMICAL SYMBOL FOR RETORT"/* 1F76D */, /*47730*/"ALCHEMICAL SYMBOL FOR HOUR"/* 1F76E */,/*47731*/"ALCHEMICAL SYMBOL FOR NIGHT"/* 1F76F */, /*47732*/"ALCHEMICAL SYMBOL FOR DAY-NIGHT"/* 1F770 */,/*47733*/"ALCHEMICAL SYMBOL FOR MONTH"/* 1F771 */, /*47734*/"ALCHEMICAL SYMBOL FOR HALF DRAM"/* 1F772 */,/*47735*/"ALCHEMICAL SYMBOL FOR HALF OUNCE"/* 1F773 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*47748*/"BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F780 */, /*47749*/"BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F781 */, /*47750*/"BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F782 */, /*47751*/"BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F783 */,/*47752*/"BLACK SLIGHTLY SMALL CIRCLE"/* 1F784 */, /*47753*/"MEDIUM BOLD WHITE CIRCLE"/* 1F785 */,/*47754*/"BOLD WHITE CIRCLE"/* 1F786 */, /*47755*/"HEAVY WHITE CIRCLE"/* 1F787 */,/*47756*/"VERY HEAVY WHITE CIRCLE"/* 1F788 */, /*47757*/"EXTREMELY HEAVY WHITE CIRCLE"/* 1F789 */,/*47758*/"WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE"/* 1F78A */, /*47759*/"ROUND TARGET"/* 1F78B */,/*47760*/"BLACK TINY SQUARE"/* 1F78C */, /*47761*/"BLACK SLIGHTLY SMALL SQUARE"/* 1F78D */,/*47762*/"LIGHT WHITE SQUARE"/* 1F78E */, /*47763*/"MEDIUM WHITE SQUARE"/* 1F78F */,/*47764*/"BOLD WHITE SQUARE"/* 1F790 */, /*47765*/"HEAVY WHITE SQUARE"/* 1F791 */,/*47766*/"VERY HEAVY WHITE SQUARE"/* 1F792 */, /*47767*/"EXTREMELY HEAVY WHITE SQUARE"/* 1F793 */,/*47768*/"WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE"/* 1F794 */, /*47769*/"WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE"/* 1F795 */,/*47770*/"SQUARE TARGET"/* 1F796 */, /*47771*/"BLACK TINY DIAMOND"/* 1F797 */,/*47772*/"BLACK VERY SMALL DIAMOND"/* 1F798 */, /*47773*/"BLACK MEDIUM SMALL DIAMOND"/* 1F799 */,/*47774*/"WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND"/* 1F79A */, /*47775*/"WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND"/* 1F79B */,/*47776*/"DIAMOND TARGET"/* 1F79C */, /*47777*/"BLACK TINY LOZENGE"/* 1F79D */,/*47778*/"BLACK VERY SMALL LOZENGE"/* 1F79E */, /*47779*/"BLACK MEDIUM SMALL LOZENGE"/* 1F79F */,/*47780*/"WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE"/* 1F7A0 */, /*47781*/"THIN GREEK CROSS"/* 1F7A1 */,/*47782*/"LIGHT GREEK CROSS"/* 1F7A2 */,/*47783*/"MEDIUM GREEK CROSS"/* 1F7A3 */, /*47784*/"BOLD GREEK CROSS"/* 1F7A4 */,/*47785*/"VERY BOLD GREEK CROSS"/* 1F7A5 */, /*47786*/"VERY HEAVY GREEK CROSS"/* 1F7A6 */,/*47787*/"EXTREMELY HEAVY GREEK CROSS"/* 1F7A7 */, /*47788*/"THIN SALTIRE"/* 1F7A8 */,/*47789*/"LIGHT SALTIRE"/* 1F7A9 */,/*47790*/"MEDIUM SALTIRE"/* 1F7AA */, /*47791*/"BOLD SALTIRE"/* 1F7AB */,/*47792*/"HEAVY SALTIRE"/* 1F7AC */,/*47793*/"VERY HEAVY SALTIRE"/* 1F7AD */, /*47794*/"EXTREMELY HEAVY SALTIRE"/* 1F7AE */,/*47795*/"LIGHT FIVE SPOKED ASTERISK"/* 1F7AF */, /*47796*/"MEDIUM FIVE SPOKED ASTERISK"/* 1F7B0 */,/*47797*/"BOLD FIVE SPOKED ASTERISK"/* 1F7B1 */, /*47798*/"HEAVY FIVE SPOKED ASTERISK"/* 1F7B2 */,/*47799*/"VERY HEAVY FIVE SPOKED ASTERISK"/* 1F7B3 */, /*47800*/"EXTREMELY HEAVY FIVE SPOKED ASTERISK"/* 1F7B4 */,/*47801*/"LIGHT SIX SPOKED ASTERISK"/* 1F7B5 */, /*47802*/"MEDIUM SIX SPOKED ASTERISK"/* 1F7B6 */,/*47803*/"BOLD SIX SPOKED ASTERISK"/* 1F7B7 */, /*47804*/"HEAVY SIX SPOKED ASTERISK"/* 1F7B8 */,/*47805*/"VERY HEAVY SIX SPOKED ASTERISK"/* 1F7B9 */, /*47806*/"EXTREMELY HEAVY SIX SPOKED ASTERISK"/* 1F7BA */,/*47807*/"LIGHT EIGHT SPOKED ASTERISK"/* 1F7BB */, /*47808*/"MEDIUM EIGHT SPOKED ASTERISK"/* 1F7BC */,/*47809*/"BOLD EIGHT SPOKED ASTERISK"/* 1F7BD */, /*47810*/"HEAVY EIGHT SPOKED ASTERISK"/* 1F7BE */,/*47811*/"VERY HEAVY EIGHT SPOKED ASTERISK"/* 1F7BF */, /*47812*/"LIGHT THREE POINTED BLACK STAR"/* 1F7C0 */,/*47813*/"MEDIUM THREE POINTED BLACK STAR"/* 1F7C1 */, /*47814*/"THREE POINTED BLACK STAR"/* 1F7C2 */,/*47815*/"MEDIUM THREE POINTED PINWHEEL STAR"/* 1F7C3 */, /*47816*/"LIGHT FOUR POINTED BLACK STAR"/* 1F7C4 */,/*47817*/"MEDIUM FOUR POINTED BLACK STAR"/* 1F7C5 */, /*47818*/"FOUR POINTED BLACK STAR"/* 1F7C6 */,/*47819*/"MEDIUM FOUR POINTED PINWHEEL STAR"/* 1F7C7 */, /*47820*/"REVERSE LIGHT FOUR POINTED PINWHEEL STAR"/* 1F7C8 */,/*47821*/"LIGHT FIVE POINTED BLACK STAR"/* 1F7C9 */, /*47822*/"HEAVY FIVE POINTED BLACK STAR"/* 1F7CA */,/*47823*/"MEDIUM SIX POINTED BLACK STAR"/* 1F7CB */, /*47824*/"HEAVY SIX POINTED BLACK STAR"/* 1F7CC */,/*47825*/"SIX POINTED PINWHEEL STAR"/* 1F7CD */, /*47826*/"MEDIUM EIGHT POINTED BLACK STAR"/* 1F7CE */,/*47827*/"HEAVY EIGHT POINTED BLACK STAR"/* 1F7CF */, /*47828*/"VERY HEAVY EIGHT POINTED BLACK STAR"/* 1F7D0 */,/*47829*/"HEAVY EIGHT POINTED PINWHEEL STAR"/* 1F7D1 */, /*47830*/"LIGHT TWELVE POINTED BLACK STAR"/* 1F7D2 */,/*47831*/"HEAVY TWELVE POINTED BLACK STAR"/* 1F7D3 */, /*47832*/"HEAVY TWELVE POINTED PINWHEEL STAR"/* 1F7D4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*47876*/"LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F800 */, /*47877*/"UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F801 */, /*47878*/"RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F802 */, /*47879*/"DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F803 */, /*47880*/"LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F804 */, /*47881*/"UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F805 */, /*47882*/"RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F806 */, /*47883*/"DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F807 */, /*47884*/"LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F808 */, /*47885*/"UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F809 */, /*47886*/"RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F80A */, /*47887*/"DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F80B */,NULL,NULL,NULL,NULL, /*47892*/"LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F810 */, /*47893*/"UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F811 */, /*47894*/"RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F812 */, /*47895*/"DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F813 */, /*47896*/"LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F814 */, /*47897*/"UPWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F815 */, /*47898*/"RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F816 */, /*47899*/"DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F817 */, /*47900*/"HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F818 */, /*47901*/"HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F819 */, /*47902*/"HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F81A */, /*47903*/"HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F81B */, /*47904*/"HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81C */, /*47905*/"HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81D */, /*47906*/"HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81E */, /*47907*/"HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81F */, /*47908*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F820 */, /*47909*/"UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F821 */, /*47910*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F822 */, /*47911*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F823 */, /*47912*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F824 */, /*47913*/"UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F825 */, /*47914*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F826 */, /*47915*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F827 */, /*47916*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F828 */, /*47917*/"UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F829 */, /*47918*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F82A */, /*47919*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F82B */, /*47920*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82C */, /*47921*/"UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82D */, /*47922*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82E */, /*47923*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82F */, /*47924*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F830 */, /*47925*/"UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F831 */, /*47926*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F832 */, /*47927*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F833 */, /*47928*/"LEFTWARDS FINGER-POST ARROW"/* 1F834 */,/*47929*/"UPWARDS FINGER-POST ARROW"/* 1F835 */, /*47930*/"RIGHTWARDS FINGER-POST ARROW"/* 1F836 */,/*47931*/"DOWNWARDS FINGER-POST ARROW"/* 1F837 */, /*47932*/"LEFTWARDS SQUARED ARROW"/* 1F838 */,/*47933*/"UPWARDS SQUARED ARROW"/* 1F839 */, /*47934*/"RIGHTWARDS SQUARED ARROW"/* 1F83A */,/*47935*/"DOWNWARDS SQUARED ARROW"/* 1F83B */, /*47936*/"LEFTWARDS COMPRESSED ARROW"/* 1F83C */,/*47937*/"UPWARDS COMPRESSED ARROW"/* 1F83D */, /*47938*/"RIGHTWARDS COMPRESSED ARROW"/* 1F83E */,/*47939*/"DOWNWARDS COMPRESSED ARROW"/* 1F83F */, /*47940*/"LEFTWARDS HEAVY COMPRESSED ARROW"/* 1F840 */,/*47941*/"UPWARDS HEAVY COMPRESSED ARROW"/* 1F841 */, /*47942*/"RIGHTWARDS HEAVY COMPRESSED ARROW"/* 1F842 */,/*47943*/"DOWNWARDS HEAVY COMPRESSED ARROW"/* 1F843 */, /*47944*/"LEFTWARDS HEAVY ARROW"/* 1F844 */,/*47945*/"UPWARDS HEAVY ARROW"/* 1F845 */, /*47946*/"RIGHTWARDS HEAVY ARROW"/* 1F846 */,/*47947*/"DOWNWARDS HEAVY ARROW"/* 1F847 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*47956*/"LEFTWARDS SANS-SERIF ARROW"/* 1F850 */,/*47957*/"UPWARDS SANS-SERIF ARROW"/* 1F851 */, /*47958*/"RIGHTWARDS SANS-SERIF ARROW"/* 1F852 */,/*47959*/"DOWNWARDS SANS-SERIF ARROW"/* 1F853 */, /*47960*/"NORTH WEST SANS-SERIF ARROW"/* 1F854 */,/*47961*/"NORTH EAST SANS-SERIF ARROW"/* 1F855 */, /*47962*/"SOUTH EAST SANS-SERIF ARROW"/* 1F856 */,/*47963*/"SOUTH WEST SANS-SERIF ARROW"/* 1F857 */, /*47964*/"LEFT RIGHT SANS-SERIF ARROW"/* 1F858 */,/*47965*/"UP DOWN SANS-SERIF ARROW"/* 1F859 */,NULL,NULL,NULL,NULL, NULL,NULL,/*47972*/"WIDE-HEADED LEFTWARDS LIGHT BARB ARROW"/* 1F860 */, /*47973*/"WIDE-HEADED UPWARDS LIGHT BARB ARROW"/* 1F861 */,/*47974*/"WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW"/* 1F862 */, /*47975*/"WIDE-HEADED DOWNWARDS LIGHT BARB ARROW"/* 1F863 */, /*47976*/"WIDE-HEADED NORTH WEST LIGHT BARB ARROW"/* 1F864 */, /*47977*/"WIDE-HEADED NORTH EAST LIGHT BARB ARROW"/* 1F865 */, /*47978*/"WIDE-HEADED SOUTH EAST LIGHT BARB ARROW"/* 1F866 */, /*47979*/"WIDE-HEADED SOUTH WEST LIGHT BARB ARROW"/* 1F867 */,/*47980*/"WIDE-HEADED LEFTWARDS BARB ARROW"/* 1F868 */, /*47981*/"WIDE-HEADED UPWARDS BARB ARROW"/* 1F869 */,/*47982*/"WIDE-HEADED RIGHTWARDS BARB ARROW"/* 1F86A */, /*47983*/"WIDE-HEADED DOWNWARDS BARB ARROW"/* 1F86B */,/*47984*/"WIDE-HEADED NORTH WEST BARB ARROW"/* 1F86C */, /*47985*/"WIDE-HEADED NORTH EAST BARB ARROW"/* 1F86D */,/*47986*/"WIDE-HEADED SOUTH EAST BARB ARROW"/* 1F86E */, /*47987*/"WIDE-HEADED SOUTH WEST BARB ARROW"/* 1F86F */,/*47988*/"WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW"/* 1F870 */, /*47989*/"WIDE-HEADED UPWARDS MEDIUM BARB ARROW"/* 1F871 */, /*47990*/"WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW"/* 1F872 */, /*47991*/"WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW"/* 1F873 */, /*47992*/"WIDE-HEADED NORTH WEST MEDIUM BARB ARROW"/* 1F874 */, /*47993*/"WIDE-HEADED NORTH EAST MEDIUM BARB ARROW"/* 1F875 */, /*47994*/"WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW"/* 1F876 */, /*47995*/"WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW"/* 1F877 */, /*47996*/"WIDE-HEADED LEFTWARDS HEAVY BARB ARROW"/* 1F878 */,/*47997*/"WIDE-HEADED UPWARDS HEAVY BARB ARROW"/* 1F879 */, /*47998*/"WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW"/* 1F87A */, /*47999*/"WIDE-HEADED DOWNWARDS HEAVY BARB ARROW"/* 1F87B */, /*48000*/"WIDE-HEADED NORTH WEST HEAVY BARB ARROW"/* 1F87C */, /*48001*/"WIDE-HEADED NORTH EAST HEAVY BARB ARROW"/* 1F87D */, /*48002*/"WIDE-HEADED SOUTH EAST HEAVY BARB ARROW"/* 1F87E */, /*48003*/"WIDE-HEADED SOUTH WEST HEAVY BARB ARROW"/* 1F87F */, /*48004*/"WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW"/* 1F880 */, /*48005*/"WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW"/* 1F881 */, /*48006*/"WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW"/* 1F882 */, /*48007*/"WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW"/* 1F883 */, /*48008*/"WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW"/* 1F884 */, /*48009*/"WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW"/* 1F885 */, /*48010*/"WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW"/* 1F886 */, /*48011*/"WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW"/* 1F887 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48020*/"LEFTWARDS TRIANGLE ARROWHEAD"/* 1F890 */,/*48021*/"UPWARDS TRIANGLE ARROWHEAD"/* 1F891 */, /*48022*/"RIGHTWARDS TRIANGLE ARROWHEAD"/* 1F892 */,/*48023*/"DOWNWARDS TRIANGLE ARROWHEAD"/* 1F893 */, /*48024*/"LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F894 */, /*48025*/"UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F895 */, /*48026*/"RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F896 */, /*48027*/"DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F897 */, /*48028*/"LEFTWARDS ARROW WITH NOTCHED TAIL"/* 1F898 */,/*48029*/"UPWARDS ARROW WITH NOTCHED TAIL"/* 1F899 */, /*48030*/"RIGHTWARDS ARROW WITH NOTCHED TAIL"/* 1F89A */,/*48031*/"DOWNWARDS ARROW WITH NOTCHED TAIL"/* 1F89B */, /*48032*/"HEAVY ARROW SHAFT WIDTH ONE"/* 1F89C */,/*48033*/"HEAVY ARROW SHAFT WIDTH TWO THIRDS"/* 1F89D */, /*48034*/"HEAVY ARROW SHAFT WIDTH ONE HALF"/* 1F89E */,/*48035*/"HEAVY ARROW SHAFT WIDTH ONE THIRD"/* 1F89F */, /*48036*/"LEFTWARDS BOTTOM-SHADED WHITE ARROW"/* 1F8A0 */,/*48037*/"RIGHTWARDS BOTTOM SHADED WHITE ARROW"/* 1F8A1 */, /*48038*/"LEFTWARDS TOP SHADED WHITE ARROW"/* 1F8A2 */,/*48039*/"RIGHTWARDS TOP SHADED WHITE ARROW"/* 1F8A3 */, /*48040*/"LEFTWARDS LEFT-SHADED WHITE ARROW"/* 1F8A4 */,/*48041*/"RIGHTWARDS RIGHT-SHADED WHITE ARROW"/* 1F8A5 */, /*48042*/"LEFTWARDS RIGHT-SHADED WHITE ARROW"/* 1F8A6 */,/*48043*/"RIGHTWARDS LEFT-SHADED WHITE ARROW"/* 1F8A7 */, /*48044*/"LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW"/* 1F8A8 */, /*48045*/"RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW"/* 1F8A9 */, /*48046*/"LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW"/* 1F8AA */, /*48047*/"RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW"/* 1F8AB */,/*48048*/"WHITE ARROW SHAFT WIDTH ONE"/* 1F8AC */, /*48049*/"WHITE ARROW SHAFT WIDTH TWO THIRDS"/* 1F8AD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*48148*/"ZIPPER-MOUTH FACE"/* 1F910 */, /*48149*/"MONEY-MOUTH FACE"/* 1F911 */,/*48150*/"FACE WITH THERMOMETER"/* 1F912 */,/*48151*/"NERD FACE"/* 1F913 */, /*48152*/"THINKING FACE"/* 1F914 */,/*48153*/"FACE WITH HEAD-BANDAGE"/* 1F915 */,/*48154*/"ROBOT FACE"/* 1F916 */, /*48155*/"HUGGING FACE"/* 1F917 */,/*48156*/"SIGN OF THE HORNS"/* 1F918 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48260*/"CRAB"/* 1F980 */,/*48261*/"LION FACE"/* 1F981 */,/*48262*/"SCORPION"/* 1F982 */,/*48263*/"TURKEY"/* 1F983 */, /*48264*/"UNICORN FACE"/* 1F984 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48324*/"CHEESE WEDGE"/* 1F9C0 */,/*48325*/""/* 20000 */, /*48326*/""/* 20001 */,/*48327*/""/* 20002 */, /*48328*/NULL/* 20003 */,/*48329*/NULL/* 20004 */,/*48330*/NULL/* 20005 */,/*48331*/NULL/* 20006 */, /*48332*/NULL/* 20007 */,/*48333*/NULL/* 20008 */,/*48334*/NULL/* 20009 */,/*48335*/NULL/* 2000A */, /*48336*/NULL/* 2000B */,/*48337*/NULL/* 2000C */,/*48338*/NULL/* 2000D */,/*48339*/NULL/* 2000E */, /*48340*/NULL/* 2000F */,/*48341*/NULL/* 20010 */,/*48342*/NULL/* 20011 */,/*48343*/NULL/* 20012 */, /*48344*/NULL/* 20013 */,/*48345*/NULL/* 20014 */,/*48346*/NULL/* 20015 */,/*48347*/NULL/* 20016 */, /*48348*/NULL/* 20017 */,/*48349*/NULL/* 20018 */,/*48350*/NULL/* 20019 */,/*48351*/NULL/* 2001A */, /*48352*/""/* 2001B */,/*48353*/NULL/* 2001C */,/*48354*/NULL/* 2001D */, /*48355*/NULL/* 2001E */,/*48356*/NULL/* 2001F */,/*48357*/NULL/* 20020 */,/*48358*/NULL/* 20021 */, /*48359*/NULL/* 20022 */,/*48360*/NULL/* 20023 */,/*48361*/NULL/* 20024 */,/*48362*/NULL/* 20025 */, /*48363*/NULL/* 20026 */,/*48364*/NULL/* 20027 */,/*48365*/NULL/* 20028 */,/*48366*/NULL/* 20029 */, /*48367*/NULL/* 2002A */,/*48368*/NULL/* 2002B */,/*48369*/NULL/* 2002C */,/*48370*/NULL/* 2002D */, /*48371*/NULL/* 2002E */,/*48372*/NULL/* 2002F */,/*48373*/NULL/* 20030 */,/*48374*/NULL/* 20031 */, /*48375*/NULL/* 20032 */,/*48376*/NULL/* 20033 */,/*48377*/""/* 20034 */, /*48378*/NULL/* 20035 */,/*48379*/NULL/* 20036 */,/*48380*/NULL/* 20037 */,/*48381*/NULL/* 20038 */, /*48382*/NULL/* 20039 */,/*48383*/NULL/* 2003A */,/*48384*/NULL/* 2003B */,/*48385*/NULL/* 2003C */, /*48386*/NULL/* 2003D */,/*48387*/NULL/* 2003E */,/*48388*/NULL/* 2003F */,/*48389*/NULL/* 20040 */, /*48390*/NULL/* 20041 */,/*48391*/NULL/* 20042 */,/*48392*/NULL/* 20043 */,/*48393*/NULL/* 20044 */, /*48394*/NULL/* 20045 */,/*48395*/NULL/* 20046 */,/*48396*/NULL/* 20047 */,/*48397*/NULL/* 20048 */, /*48398*/NULL/* 20049 */,/*48399*/NULL/* 2004A */,/*48400*/NULL/* 2004B */,/*48401*/NULL/* 2004C */, /*48402*/""/* 2004D */,/*48403*/NULL/* 2004E */,/*48404*/NULL/* 2004F */, /*48405*/NULL/* 20050 */,/*48406*/NULL/* 20051 */,/*48407*/NULL/* 20052 */,/*48408*/NULL/* 20053 */, /*48409*/NULL/* 20054 */,/*48410*/NULL/* 20055 */,/*48411*/NULL/* 20056 */,/*48412*/NULL/* 20057 */, /*48413*/NULL/* 20058 */,/*48414*/NULL/* 20059 */,/*48415*/NULL/* 2005A */,/*48416*/NULL/* 2005B */, /*48417*/NULL/* 2005C */,/*48418*/NULL/* 2005D */,/*48419*/NULL/* 2005E */,/*48420*/NULL/* 2005F */, /*48421*/NULL/* 20060 */,/*48422*/NULL/* 20061 */,/*48423*/NULL/* 20062 */,/*48424*/NULL/* 20063 */, /*48425*/""/* 20064 */,/*48426*/""/* 20065 */, /*48427*/""/* 200E2 */,/*48428*/""/* 200E3 */, /*48429*/NULL/* 200E4 */,/*48430*/NULL/* 200E5 */,/*48431*/NULL/* 200E6 */,/*48432*/NULL/* 200E7 */, /*48433*/NULL/* 200E8 */,/*48434*/NULL/* 200E9 */,/*48435*/NULL/* 200EA */,/*48436*/NULL/* 200EB */, /*48437*/NULL/* 200EC */,/*48438*/NULL/* 200ED */,/*48439*/NULL/* 200EE */,/*48440*/NULL/* 200EF */, /*48441*/NULL/* 200F0 */,/*48442*/NULL/* 200F1 */,/*48443*/NULL/* 200F2 */,/*48444*/NULL/* 200F3 */, /*48445*/NULL/* 200F4 */,/*48446*/NULL/* 200F5 */,/*48447*/NULL/* 200F6 */,/*48448*/NULL/* 200F7 */, /*48449*/NULL/* 200F8 */,/*48450*/NULL/* 200F9 */,/*48451*/NULL/* 200FA */,/*48452*/NULL/* 200FB */, /*48453*/""/* 200FC */,/*48454*/NULL/* 200FD */,/*48455*/NULL/* 200FE */, /*48456*/NULL/* 200FF */,/*48457*/NULL/* 20100 */,/*48458*/NULL/* 20101 */,/*48459*/NULL/* 20102 */, /*48460*/NULL/* 20103 */,/*48461*/NULL/* 20104 */,/*48462*/NULL/* 20105 */,/*48463*/NULL/* 20106 */, /*48464*/NULL/* 20107 */,/*48465*/NULL/* 20108 */,/*48466*/NULL/* 20109 */,/*48467*/NULL/* 2010A */, /*48468*/NULL/* 2010B */,/*48469*/NULL/* 2010C */,/*48470*/NULL/* 2010D */,/*48471*/NULL/* 2010E */, /*48472*/NULL/* 2010F */,/*48473*/NULL/* 20110 */,/*48474*/NULL/* 20111 */,/*48475*/NULL/* 20112 */, /*48476*/NULL/* 20113 */,/*48477*/NULL/* 20114 */,/*48478*/""/* 20115 */, /*48479*/NULL/* 20116 */,/*48480*/NULL/* 20117 */,/*48481*/NULL/* 20118 */,/*48482*/NULL/* 20119 */, /*48483*/NULL/* 2011A */,/*48484*/NULL/* 2011B */,/*48485*/NULL/* 2011C */,/*48486*/NULL/* 2011D */, /*48487*/NULL/* 2011E */,/*48488*/NULL/* 2011F */,/*48489*/NULL/* 20120 */, /*48490*/""/* 20121 */,/*48491*/""/* 20122 */, /*48492*/""/* 2092A */,/*48493*/""/* 2092B */, /*48494*/NULL/* 2092C */,/*48495*/NULL/* 2092D */,/*48496*/NULL/* 2092E */,/*48497*/NULL/* 2092F */, /*48498*/NULL/* 20930 */,/*48499*/NULL/* 20931 */,/*48500*/NULL/* 20932 */,/*48501*/NULL/* 20933 */, /*48502*/NULL/* 20934 */,/*48503*/NULL/* 20935 */,/*48504*/NULL/* 20936 */,/*48505*/NULL/* 20937 */, /*48506*/NULL/* 20938 */,/*48507*/NULL/* 20939 */,/*48508*/NULL/* 2093A */,/*48509*/NULL/* 2093B */, /*48510*/NULL/* 2093C */,/*48511*/NULL/* 2093D */,/*48512*/NULL/* 2093E */,/*48513*/NULL/* 2093F */, /*48514*/NULL/* 20940 */,/*48515*/NULL/* 20941 */,/*48516*/NULL/* 20942 */,/*48517*/NULL/* 20943 */, /*48518*/""/* 20944 */,/*48519*/NULL/* 20945 */,/*48520*/NULL/* 20946 */, /*48521*/NULL/* 20947 */,/*48522*/NULL/* 20948 */,/*48523*/NULL/* 20949 */,/*48524*/NULL/* 2094A */, /*48525*/NULL/* 2094B */,/*48526*/NULL/* 2094C */,/*48527*/NULL/* 2094D */,/*48528*/NULL/* 2094E */, /*48529*/NULL/* 2094F */,/*48530*/NULL/* 20950 */,/*48531*/NULL/* 20951 */,/*48532*/NULL/* 20952 */, /*48533*/NULL/* 20953 */,/*48534*/NULL/* 20954 */,/*48535*/NULL/* 20955 */,/*48536*/NULL/* 20956 */, /*48537*/NULL/* 20957 */,/*48538*/NULL/* 20958 */,/*48539*/NULL/* 20959 */,/*48540*/NULL/* 2095A */, /*48541*/NULL/* 2095B */,/*48542*/NULL/* 2095C */,/*48543*/""/* 2095D */, /*48544*/NULL/* 2095E */,/*48545*/NULL/* 2095F */,/*48546*/NULL/* 20960 */,/*48547*/NULL/* 20961 */, /*48548*/NULL/* 20962 */,/*48549*/NULL/* 20963 */,/*48550*/NULL/* 20964 */,/*48551*/NULL/* 20965 */, /*48552*/NULL/* 20966 */,/*48553*/NULL/* 20967 */,/*48554*/NULL/* 20968 */,/*48555*/NULL/* 20969 */, /*48556*/NULL/* 2096A */,/*48557*/NULL/* 2096B */,/*48558*/NULL/* 2096C */,/*48559*/NULL/* 2096D */, /*48560*/NULL/* 2096E */,/*48561*/NULL/* 2096F */,/*48562*/NULL/* 20970 */,/*48563*/NULL/* 20971 */, /*48564*/NULL/* 20972 */,/*48565*/NULL/* 20973 */,/*48566*/NULL/* 20974 */,/*48567*/NULL/* 20975 */, /*48568*/""/* 20976 */,/*48569*/NULL/* 20977 */,/*48570*/NULL/* 20978 */, /*48571*/NULL/* 20979 */,/*48572*/NULL/* 2097A */,/*48573*/NULL/* 2097B */,/*48574*/NULL/* 2097C */, /*48575*/NULL/* 2097D */,/*48576*/NULL/* 2097E */,/*48577*/NULL/* 2097F */,/*48578*/NULL/* 20980 */, /*48579*/NULL/* 20981 */,/*48580*/NULL/* 20982 */,/*48581*/""/* 20983 */, /*48582*/""/* 20984 */,/*48583*/NULL/* 20985 */,/*48584*/NULL/* 20986 */, /*48585*/NULL/* 20987 */,/*48586*/NULL/* 20988 */,/*48587*/NULL/* 20989 */,/*48588*/NULL/* 2098A */, /*48589*/NULL/* 2098B */,/*48590*/""/* 2098C */, /*48591*/""/* 2098D */,/*48592*/NULL/* 2098E */,/*48593*/NULL/* 2098F */, /*48594*/NULL/* 20990 */,/*48595*/NULL/* 20991 */,/*48596*/NULL/* 20992 */,/*48597*/NULL/* 20993 */, /*48598*/NULL/* 20994 */,/*48599*/NULL/* 20995 */,/*48600*/NULL/* 20996 */,/*48601*/NULL/* 20997 */, /*48602*/NULL/* 20998 */,/*48603*/NULL/* 20999 */,/*48604*/NULL/* 2099A */,/*48605*/NULL/* 2099B */, /*48606*/""/* 2099C */,/*48607*/""/* 2099D */, /*48608*/""/* 20AEA */,/*48609*/""/* 20AEB */, /*48610*/NULL/* 20AEC */,/*48611*/NULL/* 20AED */,/*48612*/NULL/* 20AEE */,/*48613*/NULL/* 20AEF */, /*48614*/NULL/* 20AF0 */,/*48615*/NULL/* 20AF1 */,/*48616*/NULL/* 20AF2 */,/*48617*/NULL/* 20AF3 */, /*48618*/NULL/* 20AF4 */,/*48619*/NULL/* 20AF5 */,/*48620*/NULL/* 20AF6 */,/*48621*/NULL/* 20AF7 */, /*48622*/NULL/* 20AF8 */,/*48623*/NULL/* 20AF9 */,/*48624*/NULL/* 20AFA */,/*48625*/NULL/* 20AFB */, /*48626*/NULL/* 20AFC */,/*48627*/""/* 20AFD */, /*48628*/""/* 20AFE */,/*48629*/NULL/* 20AFF */,/*48630*/NULL/* 20B00 */, /*48631*/NULL/* 20B01 */,/*48632*/NULL/* 20B02 */,/*48633*/NULL/* 20B03 */,/*48634*/NULL/* 20B04 */, /*48635*/NULL/* 20B05 */,/*48636*/NULL/* 20B06 */,/*48637*/NULL/* 20B07 */,/*48638*/NULL/* 20B08 */, /*48639*/NULL/* 20B09 */,/*48640*/NULL/* 20B0A */,/*48641*/NULL/* 20B0B */,/*48642*/NULL/* 20B0C */, /*48643*/NULL/* 20B0D */,/*48644*/NULL/* 20B0E */,/*48645*/NULL/* 20B0F */,/*48646*/NULL/* 20B10 */, /*48647*/NULL/* 20B11 */,/*48648*/NULL/* 20B12 */,/*48649*/NULL/* 20B13 */,/*48650*/NULL/* 20B14 */, /*48651*/NULL/* 20B15 */,/*48652*/NULL/* 20B16 */,/*48653*/""/* 20B17 */, /*48654*/NULL/* 20B18 */,/*48655*/""/* 20B19 */, /*48656*/""/* 20B1A */,/*48657*/""/* 22390 */, /*48658*/""/* 22391 */,/*48659*/""/* 22998 */, /*48660*/""/* 22999 */,/*48661*/""/* 23B1B */, /*48662*/""/* 23B1C */,/*48663*/""/* 2626D */, /*48664*/""/* 2626E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*48706*/""/* 2A700 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48718*/""/* 2B740 */,NULL,NULL,/*48721*/""/* 2B820 */, /*48722*/"CJK COMPATIBILITY IDEOGRAPH-2F800"/* 2F800 */,/*48723*/"CJK COMPATIBILITY IDEOGRAPH-2F801"/* 2F801 */, /*48724*/"CJK COMPATIBILITY IDEOGRAPH-2F802"/* 2F802 */,/*48725*/"CJK COMPATIBILITY IDEOGRAPH-2F803"/* 2F803 */, /*48726*/"CJK COMPATIBILITY IDEOGRAPH-2F804"/* 2F804 */,/*48727*/"CJK COMPATIBILITY IDEOGRAPH-2F805"/* 2F805 */, /*48728*/"CJK COMPATIBILITY IDEOGRAPH-2F806"/* 2F806 */,/*48729*/"CJK COMPATIBILITY IDEOGRAPH-2F807"/* 2F807 */, /*48730*/"CJK COMPATIBILITY IDEOGRAPH-2F808"/* 2F808 */,/*48731*/"CJK COMPATIBILITY IDEOGRAPH-2F809"/* 2F809 */, /*48732*/"CJK COMPATIBILITY IDEOGRAPH-2F80A"/* 2F80A */,/*48733*/"CJK COMPATIBILITY IDEOGRAPH-2F80B"/* 2F80B */, /*48734*/"CJK COMPATIBILITY IDEOGRAPH-2F80C"/* 2F80C */,/*48735*/"CJK COMPATIBILITY IDEOGRAPH-2F80D"/* 2F80D */, /*48736*/"CJK COMPATIBILITY IDEOGRAPH-2F80E"/* 2F80E */,/*48737*/"CJK COMPATIBILITY IDEOGRAPH-2F80F"/* 2F80F */, /*48738*/"CJK COMPATIBILITY IDEOGRAPH-2F810"/* 2F810 */,/*48739*/"CJK COMPATIBILITY IDEOGRAPH-2F811"/* 2F811 */, /*48740*/"CJK COMPATIBILITY IDEOGRAPH-2F812"/* 2F812 */,/*48741*/"CJK COMPATIBILITY IDEOGRAPH-2F813"/* 2F813 */, /*48742*/"CJK COMPATIBILITY IDEOGRAPH-2F814"/* 2F814 */,/*48743*/"CJK COMPATIBILITY IDEOGRAPH-2F815"/* 2F815 */, /*48744*/"CJK COMPATIBILITY IDEOGRAPH-2F816"/* 2F816 */,/*48745*/"CJK COMPATIBILITY IDEOGRAPH-2F817"/* 2F817 */, /*48746*/"CJK COMPATIBILITY IDEOGRAPH-2F818"/* 2F818 */,/*48747*/"CJK COMPATIBILITY IDEOGRAPH-2F819"/* 2F819 */, /*48748*/"CJK COMPATIBILITY IDEOGRAPH-2F81A"/* 2F81A */,/*48749*/"CJK COMPATIBILITY IDEOGRAPH-2F81B"/* 2F81B */, /*48750*/"CJK COMPATIBILITY IDEOGRAPH-2F81C"/* 2F81C */,/*48751*/"CJK COMPATIBILITY IDEOGRAPH-2F81D"/* 2F81D */, /*48752*/"CJK COMPATIBILITY IDEOGRAPH-2F81E"/* 2F81E */,/*48753*/"CJK COMPATIBILITY IDEOGRAPH-2F81F"/* 2F81F */, /*48754*/"CJK COMPATIBILITY IDEOGRAPH-2F820"/* 2F820 */,/*48755*/"CJK COMPATIBILITY IDEOGRAPH-2F821"/* 2F821 */, /*48756*/"CJK COMPATIBILITY IDEOGRAPH-2F822"/* 2F822 */,/*48757*/"CJK COMPATIBILITY IDEOGRAPH-2F823"/* 2F823 */, /*48758*/"CJK COMPATIBILITY IDEOGRAPH-2F824"/* 2F824 */,/*48759*/"CJK COMPATIBILITY IDEOGRAPH-2F825"/* 2F825 */, /*48760*/"CJK COMPATIBILITY IDEOGRAPH-2F826"/* 2F826 */,/*48761*/"CJK COMPATIBILITY IDEOGRAPH-2F827"/* 2F827 */, /*48762*/"CJK COMPATIBILITY IDEOGRAPH-2F828"/* 2F828 */,/*48763*/"CJK COMPATIBILITY IDEOGRAPH-2F829"/* 2F829 */, /*48764*/"CJK COMPATIBILITY IDEOGRAPH-2F82A"/* 2F82A */,/*48765*/"CJK COMPATIBILITY IDEOGRAPH-2F82B"/* 2F82B */, /*48766*/"CJK COMPATIBILITY IDEOGRAPH-2F82C"/* 2F82C */,/*48767*/"CJK COMPATIBILITY IDEOGRAPH-2F82D"/* 2F82D */, /*48768*/"CJK COMPATIBILITY IDEOGRAPH-2F82E"/* 2F82E */,/*48769*/"CJK COMPATIBILITY IDEOGRAPH-2F82F"/* 2F82F */, /*48770*/"CJK COMPATIBILITY IDEOGRAPH-2F830"/* 2F830 */,/*48771*/"CJK COMPATIBILITY IDEOGRAPH-2F831"/* 2F831 */, /*48772*/"CJK COMPATIBILITY IDEOGRAPH-2F832"/* 2F832 */,/*48773*/"CJK COMPATIBILITY IDEOGRAPH-2F833"/* 2F833 */, /*48774*/"CJK COMPATIBILITY IDEOGRAPH-2F834"/* 2F834 */,/*48775*/"CJK COMPATIBILITY IDEOGRAPH-2F835"/* 2F835 */, /*48776*/"CJK COMPATIBILITY IDEOGRAPH-2F836"/* 2F836 */,/*48777*/"CJK COMPATIBILITY IDEOGRAPH-2F837"/* 2F837 */, /*48778*/"CJK COMPATIBILITY IDEOGRAPH-2F838"/* 2F838 */,/*48779*/"CJK COMPATIBILITY IDEOGRAPH-2F839"/* 2F839 */, /*48780*/"CJK COMPATIBILITY IDEOGRAPH-2F83A"/* 2F83A */,/*48781*/"CJK COMPATIBILITY IDEOGRAPH-2F83B"/* 2F83B */, /*48782*/"CJK COMPATIBILITY IDEOGRAPH-2F83C"/* 2F83C */,/*48783*/"CJK COMPATIBILITY IDEOGRAPH-2F83D"/* 2F83D */, /*48784*/"CJK COMPATIBILITY IDEOGRAPH-2F83E"/* 2F83E */,/*48785*/"CJK COMPATIBILITY IDEOGRAPH-2F83F"/* 2F83F */, /*48786*/"CJK COMPATIBILITY IDEOGRAPH-2F840"/* 2F840 */,/*48787*/"CJK COMPATIBILITY IDEOGRAPH-2F841"/* 2F841 */, /*48788*/"CJK COMPATIBILITY IDEOGRAPH-2F842"/* 2F842 */,/*48789*/"CJK COMPATIBILITY IDEOGRAPH-2F843"/* 2F843 */, /*48790*/"CJK COMPATIBILITY IDEOGRAPH-2F844"/* 2F844 */,/*48791*/"CJK COMPATIBILITY IDEOGRAPH-2F845"/* 2F845 */, /*48792*/"CJK COMPATIBILITY IDEOGRAPH-2F846"/* 2F846 */,/*48793*/"CJK COMPATIBILITY IDEOGRAPH-2F847"/* 2F847 */, /*48794*/"CJK COMPATIBILITY IDEOGRAPH-2F848"/* 2F848 */,/*48795*/"CJK COMPATIBILITY IDEOGRAPH-2F849"/* 2F849 */, /*48796*/"CJK COMPATIBILITY IDEOGRAPH-2F84A"/* 2F84A */,/*48797*/"CJK COMPATIBILITY IDEOGRAPH-2F84B"/* 2F84B */, /*48798*/"CJK COMPATIBILITY IDEOGRAPH-2F84C"/* 2F84C */,/*48799*/"CJK COMPATIBILITY IDEOGRAPH-2F84D"/* 2F84D */, /*48800*/"CJK COMPATIBILITY IDEOGRAPH-2F84E"/* 2F84E */,/*48801*/"CJK COMPATIBILITY IDEOGRAPH-2F84F"/* 2F84F */, /*48802*/"CJK COMPATIBILITY IDEOGRAPH-2F850"/* 2F850 */,/*48803*/"CJK COMPATIBILITY IDEOGRAPH-2F851"/* 2F851 */, /*48804*/"CJK COMPATIBILITY IDEOGRAPH-2F852"/* 2F852 */,/*48805*/"CJK COMPATIBILITY IDEOGRAPH-2F853"/* 2F853 */, /*48806*/"CJK COMPATIBILITY IDEOGRAPH-2F854"/* 2F854 */,/*48807*/"CJK COMPATIBILITY IDEOGRAPH-2F855"/* 2F855 */, /*48808*/"CJK COMPATIBILITY IDEOGRAPH-2F856"/* 2F856 */,/*48809*/"CJK COMPATIBILITY IDEOGRAPH-2F857"/* 2F857 */, /*48810*/"CJK COMPATIBILITY IDEOGRAPH-2F858"/* 2F858 */,/*48811*/"CJK COMPATIBILITY IDEOGRAPH-2F859"/* 2F859 */, /*48812*/"CJK COMPATIBILITY IDEOGRAPH-2F85A"/* 2F85A */,/*48813*/"CJK COMPATIBILITY IDEOGRAPH-2F85B"/* 2F85B */, /*48814*/"CJK COMPATIBILITY IDEOGRAPH-2F85C"/* 2F85C */,/*48815*/"CJK COMPATIBILITY IDEOGRAPH-2F85D"/* 2F85D */, /*48816*/"CJK COMPATIBILITY IDEOGRAPH-2F85E"/* 2F85E */,/*48817*/"CJK COMPATIBILITY IDEOGRAPH-2F85F"/* 2F85F */, /*48818*/"CJK COMPATIBILITY IDEOGRAPH-2F860"/* 2F860 */,/*48819*/"CJK COMPATIBILITY IDEOGRAPH-2F861"/* 2F861 */, /*48820*/"CJK COMPATIBILITY IDEOGRAPH-2F862"/* 2F862 */,/*48821*/"CJK COMPATIBILITY IDEOGRAPH-2F863"/* 2F863 */, /*48822*/"CJK COMPATIBILITY IDEOGRAPH-2F864"/* 2F864 */,/*48823*/"CJK COMPATIBILITY IDEOGRAPH-2F865"/* 2F865 */, /*48824*/"CJK COMPATIBILITY IDEOGRAPH-2F866"/* 2F866 */,/*48825*/"CJK COMPATIBILITY IDEOGRAPH-2F867"/* 2F867 */, /*48826*/"CJK COMPATIBILITY IDEOGRAPH-2F868"/* 2F868 */,/*48827*/"CJK COMPATIBILITY IDEOGRAPH-2F869"/* 2F869 */, /*48828*/"CJK COMPATIBILITY IDEOGRAPH-2F86A"/* 2F86A */,/*48829*/"CJK COMPATIBILITY IDEOGRAPH-2F86B"/* 2F86B */, /*48830*/"CJK COMPATIBILITY IDEOGRAPH-2F86C"/* 2F86C */,/*48831*/"CJK COMPATIBILITY IDEOGRAPH-2F86D"/* 2F86D */, /*48832*/"CJK COMPATIBILITY IDEOGRAPH-2F86E"/* 2F86E */,/*48833*/"CJK COMPATIBILITY IDEOGRAPH-2F86F"/* 2F86F */, /*48834*/"CJK COMPATIBILITY IDEOGRAPH-2F870"/* 2F870 */,/*48835*/"CJK COMPATIBILITY IDEOGRAPH-2F871"/* 2F871 */, /*48836*/"CJK COMPATIBILITY IDEOGRAPH-2F872"/* 2F872 */,/*48837*/"CJK COMPATIBILITY IDEOGRAPH-2F873"/* 2F873 */, /*48838*/"CJK COMPATIBILITY IDEOGRAPH-2F874"/* 2F874 */,/*48839*/"CJK COMPATIBILITY IDEOGRAPH-2F875"/* 2F875 */, /*48840*/"CJK COMPATIBILITY IDEOGRAPH-2F876"/* 2F876 */,/*48841*/"CJK COMPATIBILITY IDEOGRAPH-2F877"/* 2F877 */, /*48842*/"CJK COMPATIBILITY IDEOGRAPH-2F878"/* 2F878 */,/*48843*/"CJK COMPATIBILITY IDEOGRAPH-2F879"/* 2F879 */, /*48844*/"CJK COMPATIBILITY IDEOGRAPH-2F87A"/* 2F87A */,/*48845*/"CJK COMPATIBILITY IDEOGRAPH-2F87B"/* 2F87B */, /*48846*/"CJK COMPATIBILITY IDEOGRAPH-2F87C"/* 2F87C */,/*48847*/"CJK COMPATIBILITY IDEOGRAPH-2F87D"/* 2F87D */, /*48848*/"CJK COMPATIBILITY IDEOGRAPH-2F87E"/* 2F87E */,/*48849*/"CJK COMPATIBILITY IDEOGRAPH-2F87F"/* 2F87F */, /*48850*/"CJK COMPATIBILITY IDEOGRAPH-2F880"/* 2F880 */,/*48851*/"CJK COMPATIBILITY IDEOGRAPH-2F881"/* 2F881 */, /*48852*/"CJK COMPATIBILITY IDEOGRAPH-2F882"/* 2F882 */,/*48853*/"CJK COMPATIBILITY IDEOGRAPH-2F883"/* 2F883 */, /*48854*/"CJK COMPATIBILITY IDEOGRAPH-2F884"/* 2F884 */,/*48855*/"CJK COMPATIBILITY IDEOGRAPH-2F885"/* 2F885 */, /*48856*/"CJK COMPATIBILITY IDEOGRAPH-2F886"/* 2F886 */,/*48857*/"CJK COMPATIBILITY IDEOGRAPH-2F887"/* 2F887 */, /*48858*/"CJK COMPATIBILITY IDEOGRAPH-2F888"/* 2F888 */,/*48859*/"CJK COMPATIBILITY IDEOGRAPH-2F889"/* 2F889 */, /*48860*/"CJK COMPATIBILITY IDEOGRAPH-2F88A"/* 2F88A */,/*48861*/"CJK COMPATIBILITY IDEOGRAPH-2F88B"/* 2F88B */, /*48862*/"CJK COMPATIBILITY IDEOGRAPH-2F88C"/* 2F88C */,/*48863*/"CJK COMPATIBILITY IDEOGRAPH-2F88D"/* 2F88D */, /*48864*/"CJK COMPATIBILITY IDEOGRAPH-2F88E"/* 2F88E */,/*48865*/"CJK COMPATIBILITY IDEOGRAPH-2F88F"/* 2F88F */, /*48866*/"CJK COMPATIBILITY IDEOGRAPH-2F890"/* 2F890 */,/*48867*/"CJK COMPATIBILITY IDEOGRAPH-2F891"/* 2F891 */, /*48868*/"CJK COMPATIBILITY IDEOGRAPH-2F892"/* 2F892 */,/*48869*/"CJK COMPATIBILITY IDEOGRAPH-2F893"/* 2F893 */, /*48870*/"CJK COMPATIBILITY IDEOGRAPH-2F894"/* 2F894 */,/*48871*/"CJK COMPATIBILITY IDEOGRAPH-2F895"/* 2F895 */, /*48872*/"CJK COMPATIBILITY IDEOGRAPH-2F896"/* 2F896 */,/*48873*/"CJK COMPATIBILITY IDEOGRAPH-2F897"/* 2F897 */, /*48874*/"CJK COMPATIBILITY IDEOGRAPH-2F898"/* 2F898 */,/*48875*/"CJK COMPATIBILITY IDEOGRAPH-2F899"/* 2F899 */, /*48876*/"CJK COMPATIBILITY IDEOGRAPH-2F89A"/* 2F89A */,/*48877*/"CJK COMPATIBILITY IDEOGRAPH-2F89B"/* 2F89B */, /*48878*/"CJK COMPATIBILITY IDEOGRAPH-2F89C"/* 2F89C */,/*48879*/"CJK COMPATIBILITY IDEOGRAPH-2F89D"/* 2F89D */, /*48880*/"CJK COMPATIBILITY IDEOGRAPH-2F89E"/* 2F89E */,/*48881*/"CJK COMPATIBILITY IDEOGRAPH-2F89F"/* 2F89F */, /*48882*/"CJK COMPATIBILITY IDEOGRAPH-2F8A0"/* 2F8A0 */,/*48883*/"CJK COMPATIBILITY IDEOGRAPH-2F8A1"/* 2F8A1 */, /*48884*/"CJK COMPATIBILITY IDEOGRAPH-2F8A2"/* 2F8A2 */,/*48885*/"CJK COMPATIBILITY IDEOGRAPH-2F8A3"/* 2F8A3 */, /*48886*/"CJK COMPATIBILITY IDEOGRAPH-2F8A4"/* 2F8A4 */,/*48887*/"CJK COMPATIBILITY IDEOGRAPH-2F8A5"/* 2F8A5 */, /*48888*/"CJK COMPATIBILITY IDEOGRAPH-2F8A6"/* 2F8A6 */,/*48889*/"CJK COMPATIBILITY IDEOGRAPH-2F8A7"/* 2F8A7 */, /*48890*/"CJK COMPATIBILITY IDEOGRAPH-2F8A8"/* 2F8A8 */,/*48891*/"CJK COMPATIBILITY IDEOGRAPH-2F8A9"/* 2F8A9 */, /*48892*/"CJK COMPATIBILITY IDEOGRAPH-2F8AA"/* 2F8AA */,/*48893*/"CJK COMPATIBILITY IDEOGRAPH-2F8AB"/* 2F8AB */, /*48894*/"CJK COMPATIBILITY IDEOGRAPH-2F8AC"/* 2F8AC */,/*48895*/"CJK COMPATIBILITY IDEOGRAPH-2F8AD"/* 2F8AD */, /*48896*/"CJK COMPATIBILITY IDEOGRAPH-2F8AE"/* 2F8AE */,/*48897*/"CJK COMPATIBILITY IDEOGRAPH-2F8AF"/* 2F8AF */, /*48898*/"CJK COMPATIBILITY IDEOGRAPH-2F8B0"/* 2F8B0 */,/*48899*/"CJK COMPATIBILITY IDEOGRAPH-2F8B1"/* 2F8B1 */, /*48900*/"CJK COMPATIBILITY IDEOGRAPH-2F8B2"/* 2F8B2 */,/*48901*/"CJK COMPATIBILITY IDEOGRAPH-2F8B3"/* 2F8B3 */, /*48902*/"CJK COMPATIBILITY IDEOGRAPH-2F8B4"/* 2F8B4 */,/*48903*/"CJK COMPATIBILITY IDEOGRAPH-2F8B5"/* 2F8B5 */, /*48904*/"CJK COMPATIBILITY IDEOGRAPH-2F8B6"/* 2F8B6 */,/*48905*/"CJK COMPATIBILITY IDEOGRAPH-2F8B7"/* 2F8B7 */, /*48906*/"CJK COMPATIBILITY IDEOGRAPH-2F8B8"/* 2F8B8 */,/*48907*/"CJK COMPATIBILITY IDEOGRAPH-2F8B9"/* 2F8B9 */, /*48908*/"CJK COMPATIBILITY IDEOGRAPH-2F8BA"/* 2F8BA */,/*48909*/"CJK COMPATIBILITY IDEOGRAPH-2F8BB"/* 2F8BB */, /*48910*/"CJK COMPATIBILITY IDEOGRAPH-2F8BC"/* 2F8BC */,/*48911*/"CJK COMPATIBILITY IDEOGRAPH-2F8BD"/* 2F8BD */, /*48912*/"CJK COMPATIBILITY IDEOGRAPH-2F8BE"/* 2F8BE */,/*48913*/"CJK COMPATIBILITY IDEOGRAPH-2F8BF"/* 2F8BF */, /*48914*/"CJK COMPATIBILITY IDEOGRAPH-2F8C0"/* 2F8C0 */,/*48915*/"CJK COMPATIBILITY IDEOGRAPH-2F8C1"/* 2F8C1 */, /*48916*/"CJK COMPATIBILITY IDEOGRAPH-2F8C2"/* 2F8C2 */,/*48917*/"CJK COMPATIBILITY IDEOGRAPH-2F8C3"/* 2F8C3 */, /*48918*/"CJK COMPATIBILITY IDEOGRAPH-2F8C4"/* 2F8C4 */,/*48919*/"CJK COMPATIBILITY IDEOGRAPH-2F8C5"/* 2F8C5 */, /*48920*/"CJK COMPATIBILITY IDEOGRAPH-2F8C6"/* 2F8C6 */,/*48921*/"CJK COMPATIBILITY IDEOGRAPH-2F8C7"/* 2F8C7 */, /*48922*/"CJK COMPATIBILITY IDEOGRAPH-2F8C8"/* 2F8C8 */,/*48923*/"CJK COMPATIBILITY IDEOGRAPH-2F8C9"/* 2F8C9 */, /*48924*/"CJK COMPATIBILITY IDEOGRAPH-2F8CA"/* 2F8CA */,/*48925*/"CJK COMPATIBILITY IDEOGRAPH-2F8CB"/* 2F8CB */, /*48926*/"CJK COMPATIBILITY IDEOGRAPH-2F8CC"/* 2F8CC */,/*48927*/"CJK COMPATIBILITY IDEOGRAPH-2F8CD"/* 2F8CD */, /*48928*/"CJK COMPATIBILITY IDEOGRAPH-2F8CE"/* 2F8CE */,/*48929*/"CJK COMPATIBILITY IDEOGRAPH-2F8CF"/* 2F8CF */, /*48930*/"CJK COMPATIBILITY IDEOGRAPH-2F8D0"/* 2F8D0 */,/*48931*/"CJK COMPATIBILITY IDEOGRAPH-2F8D1"/* 2F8D1 */, /*48932*/"CJK COMPATIBILITY IDEOGRAPH-2F8D2"/* 2F8D2 */,/*48933*/"CJK COMPATIBILITY IDEOGRAPH-2F8D3"/* 2F8D3 */, /*48934*/"CJK COMPATIBILITY IDEOGRAPH-2F8D4"/* 2F8D4 */,/*48935*/"CJK COMPATIBILITY IDEOGRAPH-2F8D5"/* 2F8D5 */, /*48936*/"CJK COMPATIBILITY IDEOGRAPH-2F8D6"/* 2F8D6 */,/*48937*/"CJK COMPATIBILITY IDEOGRAPH-2F8D7"/* 2F8D7 */, /*48938*/"CJK COMPATIBILITY IDEOGRAPH-2F8D8"/* 2F8D8 */,/*48939*/"CJK COMPATIBILITY IDEOGRAPH-2F8D9"/* 2F8D9 */, /*48940*/"CJK COMPATIBILITY IDEOGRAPH-2F8DA"/* 2F8DA */,/*48941*/"CJK COMPATIBILITY IDEOGRAPH-2F8DB"/* 2F8DB */, /*48942*/"CJK COMPATIBILITY IDEOGRAPH-2F8DC"/* 2F8DC */,/*48943*/"CJK COMPATIBILITY IDEOGRAPH-2F8DD"/* 2F8DD */, /*48944*/"CJK COMPATIBILITY IDEOGRAPH-2F8DE"/* 2F8DE */,/*48945*/"CJK COMPATIBILITY IDEOGRAPH-2F8DF"/* 2F8DF */, /*48946*/"CJK COMPATIBILITY IDEOGRAPH-2F8E0"/* 2F8E0 */,/*48947*/"CJK COMPATIBILITY IDEOGRAPH-2F8E1"/* 2F8E1 */, /*48948*/"CJK COMPATIBILITY IDEOGRAPH-2F8E2"/* 2F8E2 */,/*48949*/"CJK COMPATIBILITY IDEOGRAPH-2F8E3"/* 2F8E3 */, /*48950*/"CJK COMPATIBILITY IDEOGRAPH-2F8E4"/* 2F8E4 */,/*48951*/"CJK COMPATIBILITY IDEOGRAPH-2F8E5"/* 2F8E5 */, /*48952*/"CJK COMPATIBILITY IDEOGRAPH-2F8E6"/* 2F8E6 */,/*48953*/"CJK COMPATIBILITY IDEOGRAPH-2F8E7"/* 2F8E7 */, /*48954*/"CJK COMPATIBILITY IDEOGRAPH-2F8E8"/* 2F8E8 */,/*48955*/"CJK COMPATIBILITY IDEOGRAPH-2F8E9"/* 2F8E9 */, /*48956*/"CJK COMPATIBILITY IDEOGRAPH-2F8EA"/* 2F8EA */,/*48957*/"CJK COMPATIBILITY IDEOGRAPH-2F8EB"/* 2F8EB */, /*48958*/"CJK COMPATIBILITY IDEOGRAPH-2F8EC"/* 2F8EC */,/*48959*/"CJK COMPATIBILITY IDEOGRAPH-2F8ED"/* 2F8ED */, /*48960*/"CJK COMPATIBILITY IDEOGRAPH-2F8EE"/* 2F8EE */,/*48961*/"CJK COMPATIBILITY IDEOGRAPH-2F8EF"/* 2F8EF */, /*48962*/"CJK COMPATIBILITY IDEOGRAPH-2F8F0"/* 2F8F0 */,/*48963*/"CJK COMPATIBILITY IDEOGRAPH-2F8F1"/* 2F8F1 */, /*48964*/"CJK COMPATIBILITY IDEOGRAPH-2F8F2"/* 2F8F2 */,/*48965*/"CJK COMPATIBILITY IDEOGRAPH-2F8F3"/* 2F8F3 */, /*48966*/"CJK COMPATIBILITY IDEOGRAPH-2F8F4"/* 2F8F4 */,/*48967*/"CJK COMPATIBILITY IDEOGRAPH-2F8F5"/* 2F8F5 */, /*48968*/"CJK COMPATIBILITY IDEOGRAPH-2F8F6"/* 2F8F6 */,/*48969*/"CJK COMPATIBILITY IDEOGRAPH-2F8F7"/* 2F8F7 */, /*48970*/"CJK COMPATIBILITY IDEOGRAPH-2F8F8"/* 2F8F8 */,/*48971*/"CJK COMPATIBILITY IDEOGRAPH-2F8F9"/* 2F8F9 */, /*48972*/"CJK COMPATIBILITY IDEOGRAPH-2F8FA"/* 2F8FA */,/*48973*/"CJK COMPATIBILITY IDEOGRAPH-2F8FB"/* 2F8FB */, /*48974*/"CJK COMPATIBILITY IDEOGRAPH-2F8FC"/* 2F8FC */,/*48975*/"CJK COMPATIBILITY IDEOGRAPH-2F8FD"/* 2F8FD */, /*48976*/"CJK COMPATIBILITY IDEOGRAPH-2F8FE"/* 2F8FE */,/*48977*/"CJK COMPATIBILITY IDEOGRAPH-2F8FF"/* 2F8FF */, /*48978*/"CJK COMPATIBILITY IDEOGRAPH-2F900"/* 2F900 */,/*48979*/"CJK COMPATIBILITY IDEOGRAPH-2F901"/* 2F901 */, /*48980*/"CJK COMPATIBILITY IDEOGRAPH-2F902"/* 2F902 */,/*48981*/"CJK COMPATIBILITY IDEOGRAPH-2F903"/* 2F903 */, /*48982*/"CJK COMPATIBILITY IDEOGRAPH-2F904"/* 2F904 */,/*48983*/"CJK COMPATIBILITY IDEOGRAPH-2F905"/* 2F905 */, /*48984*/"CJK COMPATIBILITY IDEOGRAPH-2F906"/* 2F906 */,/*48985*/"CJK COMPATIBILITY IDEOGRAPH-2F907"/* 2F907 */, /*48986*/"CJK COMPATIBILITY IDEOGRAPH-2F908"/* 2F908 */,/*48987*/"CJK COMPATIBILITY IDEOGRAPH-2F909"/* 2F909 */, /*48988*/"CJK COMPATIBILITY IDEOGRAPH-2F90A"/* 2F90A */,/*48989*/"CJK COMPATIBILITY IDEOGRAPH-2F90B"/* 2F90B */, /*48990*/"CJK COMPATIBILITY IDEOGRAPH-2F90C"/* 2F90C */,/*48991*/"CJK COMPATIBILITY IDEOGRAPH-2F90D"/* 2F90D */, /*48992*/"CJK COMPATIBILITY IDEOGRAPH-2F90E"/* 2F90E */,/*48993*/"CJK COMPATIBILITY IDEOGRAPH-2F90F"/* 2F90F */, /*48994*/"CJK COMPATIBILITY IDEOGRAPH-2F910"/* 2F910 */,/*48995*/"CJK COMPATIBILITY IDEOGRAPH-2F911"/* 2F911 */, /*48996*/"CJK COMPATIBILITY IDEOGRAPH-2F912"/* 2F912 */,/*48997*/"CJK COMPATIBILITY IDEOGRAPH-2F913"/* 2F913 */, /*48998*/"CJK COMPATIBILITY IDEOGRAPH-2F914"/* 2F914 */,/*48999*/"CJK COMPATIBILITY IDEOGRAPH-2F915"/* 2F915 */, /*49000*/"CJK COMPATIBILITY IDEOGRAPH-2F916"/* 2F916 */,/*49001*/"CJK COMPATIBILITY IDEOGRAPH-2F917"/* 2F917 */, /*49002*/"CJK COMPATIBILITY IDEOGRAPH-2F918"/* 2F918 */,/*49003*/"CJK COMPATIBILITY IDEOGRAPH-2F919"/* 2F919 */, /*49004*/"CJK COMPATIBILITY IDEOGRAPH-2F91A"/* 2F91A */,/*49005*/"CJK COMPATIBILITY IDEOGRAPH-2F91B"/* 2F91B */, /*49006*/"CJK COMPATIBILITY IDEOGRAPH-2F91C"/* 2F91C */,/*49007*/"CJK COMPATIBILITY IDEOGRAPH-2F91D"/* 2F91D */, /*49008*/"CJK COMPATIBILITY IDEOGRAPH-2F91E"/* 2F91E */,/*49009*/"CJK COMPATIBILITY IDEOGRAPH-2F91F"/* 2F91F */, /*49010*/"CJK COMPATIBILITY IDEOGRAPH-2F920"/* 2F920 */,/*49011*/"CJK COMPATIBILITY IDEOGRAPH-2F921"/* 2F921 */, /*49012*/"CJK COMPATIBILITY IDEOGRAPH-2F922"/* 2F922 */,/*49013*/"CJK COMPATIBILITY IDEOGRAPH-2F923"/* 2F923 */, /*49014*/"CJK COMPATIBILITY IDEOGRAPH-2F924"/* 2F924 */,/*49015*/"CJK COMPATIBILITY IDEOGRAPH-2F925"/* 2F925 */, /*49016*/"CJK COMPATIBILITY IDEOGRAPH-2F926"/* 2F926 */,/*49017*/"CJK COMPATIBILITY IDEOGRAPH-2F927"/* 2F927 */, /*49018*/"CJK COMPATIBILITY IDEOGRAPH-2F928"/* 2F928 */,/*49019*/"CJK COMPATIBILITY IDEOGRAPH-2F929"/* 2F929 */, /*49020*/"CJK COMPATIBILITY IDEOGRAPH-2F92A"/* 2F92A */,/*49021*/"CJK COMPATIBILITY IDEOGRAPH-2F92B"/* 2F92B */, /*49022*/"CJK COMPATIBILITY IDEOGRAPH-2F92C"/* 2F92C */,/*49023*/"CJK COMPATIBILITY IDEOGRAPH-2F92D"/* 2F92D */, /*49024*/"CJK COMPATIBILITY IDEOGRAPH-2F92E"/* 2F92E */,/*49025*/"CJK COMPATIBILITY IDEOGRAPH-2F92F"/* 2F92F */, /*49026*/"CJK COMPATIBILITY IDEOGRAPH-2F930"/* 2F930 */,/*49027*/"CJK COMPATIBILITY IDEOGRAPH-2F931"/* 2F931 */, /*49028*/"CJK COMPATIBILITY IDEOGRAPH-2F932"/* 2F932 */,/*49029*/"CJK COMPATIBILITY IDEOGRAPH-2F933"/* 2F933 */, /*49030*/"CJK COMPATIBILITY IDEOGRAPH-2F934"/* 2F934 */,/*49031*/"CJK COMPATIBILITY IDEOGRAPH-2F935"/* 2F935 */, /*49032*/"CJK COMPATIBILITY IDEOGRAPH-2F936"/* 2F936 */,/*49033*/"CJK COMPATIBILITY IDEOGRAPH-2F937"/* 2F937 */, /*49034*/"CJK COMPATIBILITY IDEOGRAPH-2F938"/* 2F938 */,/*49035*/"CJK COMPATIBILITY IDEOGRAPH-2F939"/* 2F939 */, /*49036*/"CJK COMPATIBILITY IDEOGRAPH-2F93A"/* 2F93A */,/*49037*/"CJK COMPATIBILITY IDEOGRAPH-2F93B"/* 2F93B */, /*49038*/"CJK COMPATIBILITY IDEOGRAPH-2F93C"/* 2F93C */,/*49039*/"CJK COMPATIBILITY IDEOGRAPH-2F93D"/* 2F93D */, /*49040*/"CJK COMPATIBILITY IDEOGRAPH-2F93E"/* 2F93E */,/*49041*/"CJK COMPATIBILITY IDEOGRAPH-2F93F"/* 2F93F */, /*49042*/"CJK COMPATIBILITY IDEOGRAPH-2F940"/* 2F940 */,/*49043*/"CJK COMPATIBILITY IDEOGRAPH-2F941"/* 2F941 */, /*49044*/"CJK COMPATIBILITY IDEOGRAPH-2F942"/* 2F942 */,/*49045*/"CJK COMPATIBILITY IDEOGRAPH-2F943"/* 2F943 */, /*49046*/"CJK COMPATIBILITY IDEOGRAPH-2F944"/* 2F944 */,/*49047*/"CJK COMPATIBILITY IDEOGRAPH-2F945"/* 2F945 */, /*49048*/"CJK COMPATIBILITY IDEOGRAPH-2F946"/* 2F946 */,/*49049*/"CJK COMPATIBILITY IDEOGRAPH-2F947"/* 2F947 */, /*49050*/"CJK COMPATIBILITY IDEOGRAPH-2F948"/* 2F948 */,/*49051*/"CJK COMPATIBILITY IDEOGRAPH-2F949"/* 2F949 */, /*49052*/"CJK COMPATIBILITY IDEOGRAPH-2F94A"/* 2F94A */,/*49053*/"CJK COMPATIBILITY IDEOGRAPH-2F94B"/* 2F94B */, /*49054*/"CJK COMPATIBILITY IDEOGRAPH-2F94C"/* 2F94C */,/*49055*/"CJK COMPATIBILITY IDEOGRAPH-2F94D"/* 2F94D */, /*49056*/"CJK COMPATIBILITY IDEOGRAPH-2F94E"/* 2F94E */,/*49057*/"CJK COMPATIBILITY IDEOGRAPH-2F94F"/* 2F94F */, /*49058*/"CJK COMPATIBILITY IDEOGRAPH-2F950"/* 2F950 */,/*49059*/"CJK COMPATIBILITY IDEOGRAPH-2F951"/* 2F951 */, /*49060*/"CJK COMPATIBILITY IDEOGRAPH-2F952"/* 2F952 */,/*49061*/"CJK COMPATIBILITY IDEOGRAPH-2F953"/* 2F953 */, /*49062*/"CJK COMPATIBILITY IDEOGRAPH-2F954"/* 2F954 */,/*49063*/"CJK COMPATIBILITY IDEOGRAPH-2F955"/* 2F955 */, /*49064*/"CJK COMPATIBILITY IDEOGRAPH-2F956"/* 2F956 */,/*49065*/"CJK COMPATIBILITY IDEOGRAPH-2F957"/* 2F957 */, /*49066*/"CJK COMPATIBILITY IDEOGRAPH-2F958"/* 2F958 */,/*49067*/"CJK COMPATIBILITY IDEOGRAPH-2F959"/* 2F959 */, /*49068*/"CJK COMPATIBILITY IDEOGRAPH-2F95A"/* 2F95A */,/*49069*/"CJK COMPATIBILITY IDEOGRAPH-2F95B"/* 2F95B */, /*49070*/"CJK COMPATIBILITY IDEOGRAPH-2F95C"/* 2F95C */,/*49071*/"CJK COMPATIBILITY IDEOGRAPH-2F95D"/* 2F95D */, /*49072*/"CJK COMPATIBILITY IDEOGRAPH-2F95E"/* 2F95E */,/*49073*/"CJK COMPATIBILITY IDEOGRAPH-2F95F"/* 2F95F */, /*49074*/"CJK COMPATIBILITY IDEOGRAPH-2F960"/* 2F960 */,/*49075*/"CJK COMPATIBILITY IDEOGRAPH-2F961"/* 2F961 */, /*49076*/"CJK COMPATIBILITY IDEOGRAPH-2F962"/* 2F962 */,/*49077*/"CJK COMPATIBILITY IDEOGRAPH-2F963"/* 2F963 */, /*49078*/"CJK COMPATIBILITY IDEOGRAPH-2F964"/* 2F964 */,/*49079*/"CJK COMPATIBILITY IDEOGRAPH-2F965"/* 2F965 */, /*49080*/"CJK COMPATIBILITY IDEOGRAPH-2F966"/* 2F966 */,/*49081*/"CJK COMPATIBILITY IDEOGRAPH-2F967"/* 2F967 */, /*49082*/"CJK COMPATIBILITY IDEOGRAPH-2F968"/* 2F968 */,/*49083*/"CJK COMPATIBILITY IDEOGRAPH-2F969"/* 2F969 */, /*49084*/"CJK COMPATIBILITY IDEOGRAPH-2F96A"/* 2F96A */,/*49085*/"CJK COMPATIBILITY IDEOGRAPH-2F96B"/* 2F96B */, /*49086*/"CJK COMPATIBILITY IDEOGRAPH-2F96C"/* 2F96C */,/*49087*/"CJK COMPATIBILITY IDEOGRAPH-2F96D"/* 2F96D */, /*49088*/"CJK COMPATIBILITY IDEOGRAPH-2F96E"/* 2F96E */,/*49089*/"CJK COMPATIBILITY IDEOGRAPH-2F96F"/* 2F96F */, /*49090*/"CJK COMPATIBILITY IDEOGRAPH-2F970"/* 2F970 */,/*49091*/"CJK COMPATIBILITY IDEOGRAPH-2F971"/* 2F971 */, /*49092*/"CJK COMPATIBILITY IDEOGRAPH-2F972"/* 2F972 */,/*49093*/"CJK COMPATIBILITY IDEOGRAPH-2F973"/* 2F973 */, /*49094*/"CJK COMPATIBILITY IDEOGRAPH-2F974"/* 2F974 */,/*49095*/"CJK COMPATIBILITY IDEOGRAPH-2F975"/* 2F975 */, /*49096*/"CJK COMPATIBILITY IDEOGRAPH-2F976"/* 2F976 */,/*49097*/"CJK COMPATIBILITY IDEOGRAPH-2F977"/* 2F977 */, /*49098*/"CJK COMPATIBILITY IDEOGRAPH-2F978"/* 2F978 */,/*49099*/"CJK COMPATIBILITY IDEOGRAPH-2F979"/* 2F979 */, /*49100*/"CJK COMPATIBILITY IDEOGRAPH-2F97A"/* 2F97A */,/*49101*/"CJK COMPATIBILITY IDEOGRAPH-2F97B"/* 2F97B */, /*49102*/"CJK COMPATIBILITY IDEOGRAPH-2F97C"/* 2F97C */,/*49103*/"CJK COMPATIBILITY IDEOGRAPH-2F97D"/* 2F97D */, /*49104*/"CJK COMPATIBILITY IDEOGRAPH-2F97E"/* 2F97E */,/*49105*/"CJK COMPATIBILITY IDEOGRAPH-2F97F"/* 2F97F */, /*49106*/"CJK COMPATIBILITY IDEOGRAPH-2F980"/* 2F980 */,/*49107*/"CJK COMPATIBILITY IDEOGRAPH-2F981"/* 2F981 */, /*49108*/"CJK COMPATIBILITY IDEOGRAPH-2F982"/* 2F982 */,/*49109*/"CJK COMPATIBILITY IDEOGRAPH-2F983"/* 2F983 */, /*49110*/"CJK COMPATIBILITY IDEOGRAPH-2F984"/* 2F984 */,/*49111*/"CJK COMPATIBILITY IDEOGRAPH-2F985"/* 2F985 */, /*49112*/"CJK COMPATIBILITY IDEOGRAPH-2F986"/* 2F986 */,/*49113*/"CJK COMPATIBILITY IDEOGRAPH-2F987"/* 2F987 */, /*49114*/"CJK COMPATIBILITY IDEOGRAPH-2F988"/* 2F988 */,/*49115*/"CJK COMPATIBILITY IDEOGRAPH-2F989"/* 2F989 */, /*49116*/"CJK COMPATIBILITY IDEOGRAPH-2F98A"/* 2F98A */,/*49117*/"CJK COMPATIBILITY IDEOGRAPH-2F98B"/* 2F98B */, /*49118*/"CJK COMPATIBILITY IDEOGRAPH-2F98C"/* 2F98C */,/*49119*/"CJK COMPATIBILITY IDEOGRAPH-2F98D"/* 2F98D */, /*49120*/"CJK COMPATIBILITY IDEOGRAPH-2F98E"/* 2F98E */,/*49121*/"CJK COMPATIBILITY IDEOGRAPH-2F98F"/* 2F98F */, /*49122*/"CJK COMPATIBILITY IDEOGRAPH-2F990"/* 2F990 */,/*49123*/"CJK COMPATIBILITY IDEOGRAPH-2F991"/* 2F991 */, /*49124*/"CJK COMPATIBILITY IDEOGRAPH-2F992"/* 2F992 */,/*49125*/"CJK COMPATIBILITY IDEOGRAPH-2F993"/* 2F993 */, /*49126*/"CJK COMPATIBILITY IDEOGRAPH-2F994"/* 2F994 */,/*49127*/"CJK COMPATIBILITY IDEOGRAPH-2F995"/* 2F995 */, /*49128*/"CJK COMPATIBILITY IDEOGRAPH-2F996"/* 2F996 */,/*49129*/"CJK COMPATIBILITY IDEOGRAPH-2F997"/* 2F997 */, /*49130*/"CJK COMPATIBILITY IDEOGRAPH-2F998"/* 2F998 */,/*49131*/"CJK COMPATIBILITY IDEOGRAPH-2F999"/* 2F999 */, /*49132*/"CJK COMPATIBILITY IDEOGRAPH-2F99A"/* 2F99A */,/*49133*/"CJK COMPATIBILITY IDEOGRAPH-2F99B"/* 2F99B */, /*49134*/"CJK COMPATIBILITY IDEOGRAPH-2F99C"/* 2F99C */,/*49135*/"CJK COMPATIBILITY IDEOGRAPH-2F99D"/* 2F99D */, /*49136*/"CJK COMPATIBILITY IDEOGRAPH-2F99E"/* 2F99E */,/*49137*/"CJK COMPATIBILITY IDEOGRAPH-2F99F"/* 2F99F */, /*49138*/"CJK COMPATIBILITY IDEOGRAPH-2F9A0"/* 2F9A0 */,/*49139*/"CJK COMPATIBILITY IDEOGRAPH-2F9A1"/* 2F9A1 */, /*49140*/"CJK COMPATIBILITY IDEOGRAPH-2F9A2"/* 2F9A2 */,/*49141*/"CJK COMPATIBILITY IDEOGRAPH-2F9A3"/* 2F9A3 */, /*49142*/"CJK COMPATIBILITY IDEOGRAPH-2F9A4"/* 2F9A4 */,/*49143*/"CJK COMPATIBILITY IDEOGRAPH-2F9A5"/* 2F9A5 */, /*49144*/"CJK COMPATIBILITY IDEOGRAPH-2F9A6"/* 2F9A6 */,/*49145*/"CJK COMPATIBILITY IDEOGRAPH-2F9A7"/* 2F9A7 */, /*49146*/"CJK COMPATIBILITY IDEOGRAPH-2F9A8"/* 2F9A8 */,/*49147*/"CJK COMPATIBILITY IDEOGRAPH-2F9A9"/* 2F9A9 */, /*49148*/"CJK COMPATIBILITY IDEOGRAPH-2F9AA"/* 2F9AA */,/*49149*/"CJK COMPATIBILITY IDEOGRAPH-2F9AB"/* 2F9AB */, /*49150*/"CJK COMPATIBILITY IDEOGRAPH-2F9AC"/* 2F9AC */,/*49151*/"CJK COMPATIBILITY IDEOGRAPH-2F9AD"/* 2F9AD */, /*49152*/"CJK COMPATIBILITY IDEOGRAPH-2F9AE"/* 2F9AE */,/*49153*/"CJK COMPATIBILITY IDEOGRAPH-2F9AF"/* 2F9AF */, /*49154*/"CJK COMPATIBILITY IDEOGRAPH-2F9B0"/* 2F9B0 */,/*49155*/"CJK COMPATIBILITY IDEOGRAPH-2F9B1"/* 2F9B1 */, /*49156*/"CJK COMPATIBILITY IDEOGRAPH-2F9B2"/* 2F9B2 */,/*49157*/"CJK COMPATIBILITY IDEOGRAPH-2F9B3"/* 2F9B3 */, /*49158*/"CJK COMPATIBILITY IDEOGRAPH-2F9B4"/* 2F9B4 */,/*49159*/"CJK COMPATIBILITY IDEOGRAPH-2F9B5"/* 2F9B5 */, /*49160*/"CJK COMPATIBILITY IDEOGRAPH-2F9B6"/* 2F9B6 */,/*49161*/"CJK COMPATIBILITY IDEOGRAPH-2F9B7"/* 2F9B7 */, /*49162*/"CJK COMPATIBILITY IDEOGRAPH-2F9B8"/* 2F9B8 */,/*49163*/"CJK COMPATIBILITY IDEOGRAPH-2F9B9"/* 2F9B9 */, /*49164*/"CJK COMPATIBILITY IDEOGRAPH-2F9BA"/* 2F9BA */,/*49165*/"CJK COMPATIBILITY IDEOGRAPH-2F9BB"/* 2F9BB */, /*49166*/"CJK COMPATIBILITY IDEOGRAPH-2F9BC"/* 2F9BC */,/*49167*/"CJK COMPATIBILITY IDEOGRAPH-2F9BD"/* 2F9BD */, /*49168*/"CJK COMPATIBILITY IDEOGRAPH-2F9BE"/* 2F9BE */,/*49169*/"CJK COMPATIBILITY IDEOGRAPH-2F9BF"/* 2F9BF */, /*49170*/"CJK COMPATIBILITY IDEOGRAPH-2F9C0"/* 2F9C0 */,/*49171*/"CJK COMPATIBILITY IDEOGRAPH-2F9C1"/* 2F9C1 */, /*49172*/"CJK COMPATIBILITY IDEOGRAPH-2F9C2"/* 2F9C2 */,/*49173*/"CJK COMPATIBILITY IDEOGRAPH-2F9C3"/* 2F9C3 */, /*49174*/"CJK COMPATIBILITY IDEOGRAPH-2F9C4"/* 2F9C4 */,/*49175*/"CJK COMPATIBILITY IDEOGRAPH-2F9C5"/* 2F9C5 */, /*49176*/"CJK COMPATIBILITY IDEOGRAPH-2F9C6"/* 2F9C6 */,/*49177*/"CJK COMPATIBILITY IDEOGRAPH-2F9C7"/* 2F9C7 */, /*49178*/"CJK COMPATIBILITY IDEOGRAPH-2F9C8"/* 2F9C8 */,/*49179*/"CJK COMPATIBILITY IDEOGRAPH-2F9C9"/* 2F9C9 */, /*49180*/"CJK COMPATIBILITY IDEOGRAPH-2F9CA"/* 2F9CA */,/*49181*/"CJK COMPATIBILITY IDEOGRAPH-2F9CB"/* 2F9CB */, /*49182*/"CJK COMPATIBILITY IDEOGRAPH-2F9CC"/* 2F9CC */,/*49183*/"CJK COMPATIBILITY IDEOGRAPH-2F9CD"/* 2F9CD */, /*49184*/"CJK COMPATIBILITY IDEOGRAPH-2F9CE"/* 2F9CE */,/*49185*/"CJK COMPATIBILITY IDEOGRAPH-2F9CF"/* 2F9CF */, /*49186*/"CJK COMPATIBILITY IDEOGRAPH-2F9D0"/* 2F9D0 */,/*49187*/"CJK COMPATIBILITY IDEOGRAPH-2F9D1"/* 2F9D1 */, /*49188*/"CJK COMPATIBILITY IDEOGRAPH-2F9D2"/* 2F9D2 */,/*49189*/"CJK COMPATIBILITY IDEOGRAPH-2F9D3"/* 2F9D3 */, /*49190*/"CJK COMPATIBILITY IDEOGRAPH-2F9D4"/* 2F9D4 */,/*49191*/"CJK COMPATIBILITY IDEOGRAPH-2F9D5"/* 2F9D5 */, /*49192*/"CJK COMPATIBILITY IDEOGRAPH-2F9D6"/* 2F9D6 */,/*49193*/"CJK COMPATIBILITY IDEOGRAPH-2F9D7"/* 2F9D7 */, /*49194*/"CJK COMPATIBILITY IDEOGRAPH-2F9D8"/* 2F9D8 */,/*49195*/"CJK COMPATIBILITY IDEOGRAPH-2F9D9"/* 2F9D9 */, /*49196*/"CJK COMPATIBILITY IDEOGRAPH-2F9DA"/* 2F9DA */,/*49197*/"CJK COMPATIBILITY IDEOGRAPH-2F9DB"/* 2F9DB */, /*49198*/"CJK COMPATIBILITY IDEOGRAPH-2F9DC"/* 2F9DC */,/*49199*/"CJK COMPATIBILITY IDEOGRAPH-2F9DD"/* 2F9DD */, /*49200*/"CJK COMPATIBILITY IDEOGRAPH-2F9DE"/* 2F9DE */,/*49201*/"CJK COMPATIBILITY IDEOGRAPH-2F9DF"/* 2F9DF */, /*49202*/"CJK COMPATIBILITY IDEOGRAPH-2F9E0"/* 2F9E0 */,/*49203*/"CJK COMPATIBILITY IDEOGRAPH-2F9E1"/* 2F9E1 */, /*49204*/"CJK COMPATIBILITY IDEOGRAPH-2F9E2"/* 2F9E2 */,/*49205*/"CJK COMPATIBILITY IDEOGRAPH-2F9E3"/* 2F9E3 */, /*49206*/"CJK COMPATIBILITY IDEOGRAPH-2F9E4"/* 2F9E4 */,/*49207*/"CJK COMPATIBILITY IDEOGRAPH-2F9E5"/* 2F9E5 */, /*49208*/"CJK COMPATIBILITY IDEOGRAPH-2F9E6"/* 2F9E6 */,/*49209*/"CJK COMPATIBILITY IDEOGRAPH-2F9E7"/* 2F9E7 */, /*49210*/"CJK COMPATIBILITY IDEOGRAPH-2F9E8"/* 2F9E8 */,/*49211*/"CJK COMPATIBILITY IDEOGRAPH-2F9E9"/* 2F9E9 */, /*49212*/"CJK COMPATIBILITY IDEOGRAPH-2F9EA"/* 2F9EA */,/*49213*/"CJK COMPATIBILITY IDEOGRAPH-2F9EB"/* 2F9EB */, /*49214*/"CJK COMPATIBILITY IDEOGRAPH-2F9EC"/* 2F9EC */,/*49215*/"CJK COMPATIBILITY IDEOGRAPH-2F9ED"/* 2F9ED */, /*49216*/"CJK COMPATIBILITY IDEOGRAPH-2F9EE"/* 2F9EE */,/*49217*/"CJK COMPATIBILITY IDEOGRAPH-2F9EF"/* 2F9EF */, /*49218*/"CJK COMPATIBILITY IDEOGRAPH-2F9F0"/* 2F9F0 */,/*49219*/"CJK COMPATIBILITY IDEOGRAPH-2F9F1"/* 2F9F1 */, /*49220*/"CJK COMPATIBILITY IDEOGRAPH-2F9F2"/* 2F9F2 */,/*49221*/"CJK COMPATIBILITY IDEOGRAPH-2F9F3"/* 2F9F3 */, /*49222*/"CJK COMPATIBILITY IDEOGRAPH-2F9F4"/* 2F9F4 */,/*49223*/"CJK COMPATIBILITY IDEOGRAPH-2F9F5"/* 2F9F5 */, /*49224*/"CJK COMPATIBILITY IDEOGRAPH-2F9F6"/* 2F9F6 */,/*49225*/"CJK COMPATIBILITY IDEOGRAPH-2F9F7"/* 2F9F7 */, /*49226*/"CJK COMPATIBILITY IDEOGRAPH-2F9F8"/* 2F9F8 */,/*49227*/"CJK COMPATIBILITY IDEOGRAPH-2F9F9"/* 2F9F9 */, /*49228*/"CJK COMPATIBILITY IDEOGRAPH-2F9FA"/* 2F9FA */,/*49229*/"CJK COMPATIBILITY IDEOGRAPH-2F9FB"/* 2F9FB */, /*49230*/"CJK COMPATIBILITY IDEOGRAPH-2F9FC"/* 2F9FC */,/*49231*/"CJK COMPATIBILITY IDEOGRAPH-2F9FD"/* 2F9FD */, /*49232*/"CJK COMPATIBILITY IDEOGRAPH-2F9FE"/* 2F9FE */,/*49233*/"CJK COMPATIBILITY IDEOGRAPH-2F9FF"/* 2F9FF */, /*49234*/"CJK COMPATIBILITY IDEOGRAPH-2FA00"/* 2FA00 */,/*49235*/"CJK COMPATIBILITY IDEOGRAPH-2FA01"/* 2FA01 */, /*49236*/"CJK COMPATIBILITY IDEOGRAPH-2FA02"/* 2FA02 */,/*49237*/"CJK COMPATIBILITY IDEOGRAPH-2FA03"/* 2FA03 */, /*49238*/"CJK COMPATIBILITY IDEOGRAPH-2FA04"/* 2FA04 */,/*49239*/"CJK COMPATIBILITY IDEOGRAPH-2FA05"/* 2FA05 */, /*49240*/"CJK COMPATIBILITY IDEOGRAPH-2FA06"/* 2FA06 */,/*49241*/"CJK COMPATIBILITY IDEOGRAPH-2FA07"/* 2FA07 */, /*49242*/"CJK COMPATIBILITY IDEOGRAPH-2FA08"/* 2FA08 */,/*49243*/"CJK COMPATIBILITY IDEOGRAPH-2FA09"/* 2FA09 */, /*49244*/"CJK COMPATIBILITY IDEOGRAPH-2FA0A"/* 2FA0A */,/*49245*/"CJK COMPATIBILITY IDEOGRAPH-2FA0B"/* 2FA0B */, /*49246*/"CJK COMPATIBILITY IDEOGRAPH-2FA0C"/* 2FA0C */,/*49247*/"CJK COMPATIBILITY IDEOGRAPH-2FA0D"/* 2FA0D */, /*49248*/"CJK COMPATIBILITY IDEOGRAPH-2FA0E"/* 2FA0E */,/*49249*/"CJK COMPATIBILITY IDEOGRAPH-2FA0F"/* 2FA0F */, /*49250*/"CJK COMPATIBILITY IDEOGRAPH-2FA10"/* 2FA10 */,/*49251*/"CJK COMPATIBILITY IDEOGRAPH-2FA11"/* 2FA11 */, /*49252*/"CJK COMPATIBILITY IDEOGRAPH-2FA12"/* 2FA12 */,/*49253*/"CJK COMPATIBILITY IDEOGRAPH-2FA13"/* 2FA13 */, /*49254*/"CJK COMPATIBILITY IDEOGRAPH-2FA14"/* 2FA14 */,/*49255*/"CJK COMPATIBILITY IDEOGRAPH-2FA15"/* 2FA15 */, /*49256*/"CJK COMPATIBILITY IDEOGRAPH-2FA16"/* 2FA16 */,/*49257*/"CJK COMPATIBILITY IDEOGRAPH-2FA17"/* 2FA17 */, /*49258*/"CJK COMPATIBILITY IDEOGRAPH-2FA18"/* 2FA18 */,/*49259*/"CJK COMPATIBILITY IDEOGRAPH-2FA19"/* 2FA19 */, /*49260*/"CJK COMPATIBILITY IDEOGRAPH-2FA1A"/* 2FA1A */,/*49261*/"CJK COMPATIBILITY IDEOGRAPH-2FA1B"/* 2FA1B */, /*49262*/"CJK COMPATIBILITY IDEOGRAPH-2FA1C"/* 2FA1C */,/*49263*/"CJK COMPATIBILITY IDEOGRAPH-2FA1D"/* 2FA1D */, /*49264*/"LANGUAGE TAG"/* E0001 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*49295*/"TAG SPACE"/* E0020 */, /*49296*/"TAG EXCLAMATION MARK"/* E0021 */,/*49297*/"TAG QUOTATION MARK"/* E0022 */, /*49298*/"TAG NUMBER SIGN"/* E0023 */,/*49299*/"TAG DOLLAR SIGN"/* E0024 */,/*49300*/"TAG PERCENT SIGN"/* E0025 */, /*49301*/"TAG AMPERSAND"/* E0026 */,/*49302*/"TAG APOSTROPHE"/* E0027 */,/*49303*/"TAG LEFT PARENTHESIS"/* E0028 */, /*49304*/"TAG RIGHT PARENTHESIS"/* E0029 */,/*49305*/"TAG ASTERISK"/* E002A */,/*49306*/"TAG PLUS SIGN"/* E002B */, /*49307*/"TAG COMMA"/* E002C */,/*49308*/"TAG HYPHEN-MINUS"/* E002D */,/*49309*/"TAG FULL STOP"/* E002E */, /*49310*/"TAG SOLIDUS"/* E002F */,/*49311*/"TAG DIGIT ZERO"/* E0030 */,/*49312*/"TAG DIGIT ONE"/* E0031 */, /*49313*/"TAG DIGIT TWO"/* E0032 */,/*49314*/"TAG DIGIT THREE"/* E0033 */,/*49315*/"TAG DIGIT FOUR"/* E0034 */, /*49316*/"TAG DIGIT FIVE"/* E0035 */,/*49317*/"TAG DIGIT SIX"/* E0036 */,/*49318*/"TAG DIGIT SEVEN"/* E0037 */, /*49319*/"TAG DIGIT EIGHT"/* E0038 */,/*49320*/"TAG DIGIT NINE"/* E0039 */,/*49321*/"TAG COLON"/* E003A */, /*49322*/"TAG SEMICOLON"/* E003B */,/*49323*/"TAG LESS-THAN SIGN"/* E003C */,/*49324*/"TAG EQUALS SIGN"/* E003D */, /*49325*/"TAG GREATER-THAN SIGN"/* E003E */,/*49326*/"TAG QUESTION MARK"/* E003F */, /*49327*/"TAG COMMERCIAL AT"/* E0040 */,/*49328*/"TAG LATIN CAPITAL LETTER A"/* E0041 */, /*49329*/"TAG LATIN CAPITAL LETTER B"/* E0042 */,/*49330*/"TAG LATIN CAPITAL LETTER C"/* E0043 */, /*49331*/"TAG LATIN CAPITAL LETTER D"/* E0044 */,/*49332*/"TAG LATIN CAPITAL LETTER E"/* E0045 */, /*49333*/"TAG LATIN CAPITAL LETTER F"/* E0046 */,/*49334*/"TAG LATIN CAPITAL LETTER G"/* E0047 */, /*49335*/"TAG LATIN CAPITAL LETTER H"/* E0048 */,/*49336*/"TAG LATIN CAPITAL LETTER I"/* E0049 */, /*49337*/"TAG LATIN CAPITAL LETTER J"/* E004A */,/*49338*/"TAG LATIN CAPITAL LETTER K"/* E004B */, /*49339*/"TAG LATIN CAPITAL LETTER L"/* E004C */,/*49340*/"TAG LATIN CAPITAL LETTER M"/* E004D */, /*49341*/"TAG LATIN CAPITAL LETTER N"/* E004E */,/*49342*/"TAG LATIN CAPITAL LETTER O"/* E004F */, /*49343*/"TAG LATIN CAPITAL LETTER P"/* E0050 */,/*49344*/"TAG LATIN CAPITAL LETTER Q"/* E0051 */, /*49345*/"TAG LATIN CAPITAL LETTER R"/* E0052 */,/*49346*/"TAG LATIN CAPITAL LETTER S"/* E0053 */, /*49347*/"TAG LATIN CAPITAL LETTER T"/* E0054 */,/*49348*/"TAG LATIN CAPITAL LETTER U"/* E0055 */, /*49349*/"TAG LATIN CAPITAL LETTER V"/* E0056 */,/*49350*/"TAG LATIN CAPITAL LETTER W"/* E0057 */, /*49351*/"TAG LATIN CAPITAL LETTER X"/* E0058 */,/*49352*/"TAG LATIN CAPITAL LETTER Y"/* E0059 */, /*49353*/"TAG LATIN CAPITAL LETTER Z"/* E005A */,/*49354*/"TAG LEFT SQUARE BRACKET"/* E005B */, /*49355*/"TAG REVERSE SOLIDUS"/* E005C */,/*49356*/"TAG RIGHT SQUARE BRACKET"/* E005D */, /*49357*/"TAG CIRCUMFLEX ACCENT"/* E005E */,/*49358*/"TAG LOW LINE"/* E005F */,/*49359*/"TAG GRAVE ACCENT"/* E0060 */, /*49360*/"TAG LATIN SMALL LETTER A"/* E0061 */,/*49361*/"TAG LATIN SMALL LETTER B"/* E0062 */, /*49362*/"TAG LATIN SMALL LETTER C"/* E0063 */,/*49363*/"TAG LATIN SMALL LETTER D"/* E0064 */, /*49364*/"TAG LATIN SMALL LETTER E"/* E0065 */,/*49365*/"TAG LATIN SMALL LETTER F"/* E0066 */, /*49366*/"TAG LATIN SMALL LETTER G"/* E0067 */,/*49367*/"TAG LATIN SMALL LETTER H"/* E0068 */, /*49368*/"TAG LATIN SMALL LETTER I"/* E0069 */,/*49369*/"TAG LATIN SMALL LETTER J"/* E006A */, /*49370*/"TAG LATIN SMALL LETTER K"/* E006B */,/*49371*/"TAG LATIN SMALL LETTER L"/* E006C */, /*49372*/"TAG LATIN SMALL LETTER M"/* E006D */,/*49373*/"TAG LATIN SMALL LETTER N"/* E006E */, /*49374*/"TAG LATIN SMALL LETTER O"/* E006F */,/*49375*/"TAG LATIN SMALL LETTER P"/* E0070 */, /*49376*/"TAG LATIN SMALL LETTER Q"/* E0071 */,/*49377*/"TAG LATIN SMALL LETTER R"/* E0072 */, /*49378*/"TAG LATIN SMALL LETTER S"/* E0073 */,/*49379*/"TAG LATIN SMALL LETTER T"/* E0074 */, /*49380*/"TAG LATIN SMALL LETTER U"/* E0075 */,/*49381*/"TAG LATIN SMALL LETTER V"/* E0076 */, /*49382*/"TAG LATIN SMALL LETTER W"/* E0077 */,/*49383*/"TAG LATIN SMALL LETTER X"/* E0078 */, /*49384*/"TAG LATIN SMALL LETTER Y"/* E0079 */,/*49385*/"TAG LATIN SMALL LETTER Z"/* E007A */, /*49386*/"TAG LEFT CURLY BRACKET"/* E007B */,/*49387*/"TAG VERTICAL LINE"/* E007C */, /*49388*/"TAG RIGHT CURLY BRACKET"/* E007D */,/*49389*/"TAG TILDE"/* E007E */,/*49390*/"CANCEL TAG"/* E007F */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*49519*/"VARIATION SELECTOR-17"/* E0100 */,/*49520*/"VARIATION SELECTOR-18"/* E0101 */, /*49521*/"VARIATION SELECTOR-19"/* E0102 */,/*49522*/"VARIATION SELECTOR-20"/* E0103 */, /*49523*/"VARIATION SELECTOR-21"/* E0104 */,/*49524*/"VARIATION SELECTOR-22"/* E0105 */, /*49525*/"VARIATION SELECTOR-23"/* E0106 */,/*49526*/"VARIATION SELECTOR-24"/* E0107 */, /*49527*/"VARIATION SELECTOR-25"/* E0108 */,/*49528*/"VARIATION SELECTOR-26"/* E0109 */, /*49529*/"VARIATION SELECTOR-27"/* E010A */,/*49530*/"VARIATION SELECTOR-28"/* E010B */, /*49531*/"VARIATION SELECTOR-29"/* E010C */,/*49532*/"VARIATION SELECTOR-30"/* E010D */, /*49533*/"VARIATION SELECTOR-31"/* E010E */,/*49534*/"VARIATION SELECTOR-32"/* E010F */, /*49535*/"VARIATION SELECTOR-33"/* E0110 */,/*49536*/"VARIATION SELECTOR-34"/* E0111 */, /*49537*/"VARIATION SELECTOR-35"/* E0112 */,/*49538*/"VARIATION SELECTOR-36"/* E0113 */, /*49539*/"VARIATION SELECTOR-37"/* E0114 */,/*49540*/"VARIATION SELECTOR-38"/* E0115 */, /*49541*/"VARIATION SELECTOR-39"/* E0116 */,/*49542*/"VARIATION SELECTOR-40"/* E0117 */, /*49543*/"VARIATION SELECTOR-41"/* E0118 */,/*49544*/"VARIATION SELECTOR-42"/* E0119 */, /*49545*/"VARIATION SELECTOR-43"/* E011A */,/*49546*/"VARIATION SELECTOR-44"/* E011B */, /*49547*/"VARIATION SELECTOR-45"/* E011C */,/*49548*/"VARIATION SELECTOR-46"/* E011D */, /*49549*/"VARIATION SELECTOR-47"/* E011E */,/*49550*/"VARIATION SELECTOR-48"/* E011F */, /*49551*/"VARIATION SELECTOR-49"/* E0120 */,/*49552*/"VARIATION SELECTOR-50"/* E0121 */, /*49553*/"VARIATION SELECTOR-51"/* E0122 */,/*49554*/"VARIATION SELECTOR-52"/* E0123 */, /*49555*/"VARIATION SELECTOR-53"/* E0124 */,/*49556*/"VARIATION SELECTOR-54"/* E0125 */, /*49557*/"VARIATION SELECTOR-55"/* E0126 */,/*49558*/"VARIATION SELECTOR-56"/* E0127 */, /*49559*/"VARIATION SELECTOR-57"/* E0128 */,/*49560*/"VARIATION SELECTOR-58"/* E0129 */, /*49561*/"VARIATION SELECTOR-59"/* E012A */,/*49562*/"VARIATION SELECTOR-60"/* E012B */, /*49563*/"VARIATION SELECTOR-61"/* E012C */,/*49564*/"VARIATION SELECTOR-62"/* E012D */, /*49565*/"VARIATION SELECTOR-63"/* E012E */,/*49566*/"VARIATION SELECTOR-64"/* E012F */, /*49567*/"VARIATION SELECTOR-65"/* E0130 */,/*49568*/"VARIATION SELECTOR-66"/* E0131 */, /*49569*/"VARIATION SELECTOR-67"/* E0132 */,/*49570*/"VARIATION SELECTOR-68"/* E0133 */, /*49571*/"VARIATION SELECTOR-69"/* E0134 */,/*49572*/"VARIATION SELECTOR-70"/* E0135 */, /*49573*/"VARIATION SELECTOR-71"/* E0136 */,/*49574*/"VARIATION SELECTOR-72"/* E0137 */, /*49575*/"VARIATION SELECTOR-73"/* E0138 */,/*49576*/"VARIATION SELECTOR-74"/* E0139 */, /*49577*/"VARIATION SELECTOR-75"/* E013A */,/*49578*/"VARIATION SELECTOR-76"/* E013B */, /*49579*/"VARIATION SELECTOR-77"/* E013C */,/*49580*/"VARIATION SELECTOR-78"/* E013D */, /*49581*/"VARIATION SELECTOR-79"/* E013E */,/*49582*/"VARIATION SELECTOR-80"/* E013F */, /*49583*/"VARIATION SELECTOR-81"/* E0140 */,/*49584*/"VARIATION SELECTOR-82"/* E0141 */, /*49585*/"VARIATION SELECTOR-83"/* E0142 */,/*49586*/"VARIATION SELECTOR-84"/* E0143 */, /*49587*/"VARIATION SELECTOR-85"/* E0144 */,/*49588*/"VARIATION SELECTOR-86"/* E0145 */, /*49589*/"VARIATION SELECTOR-87"/* E0146 */,/*49590*/"VARIATION SELECTOR-88"/* E0147 */, /*49591*/"VARIATION SELECTOR-89"/* E0148 */,/*49592*/"VARIATION SELECTOR-90"/* E0149 */, /*49593*/"VARIATION SELECTOR-91"/* E014A */,/*49594*/"VARIATION SELECTOR-92"/* E014B */, /*49595*/"VARIATION SELECTOR-93"/* E014C */,/*49596*/"VARIATION SELECTOR-94"/* E014D */, /*49597*/"VARIATION SELECTOR-95"/* E014E */,/*49598*/"VARIATION SELECTOR-96"/* E014F */, /*49599*/"VARIATION SELECTOR-97"/* E0150 */,/*49600*/"VARIATION SELECTOR-98"/* E0151 */, /*49601*/"VARIATION SELECTOR-99"/* E0152 */,/*49602*/"VARIATION SELECTOR-100"/* E0153 */, /*49603*/"VARIATION SELECTOR-101"/* E0154 */,/*49604*/"VARIATION SELECTOR-102"/* E0155 */, /*49605*/"VARIATION SELECTOR-103"/* E0156 */,/*49606*/"VARIATION SELECTOR-104"/* E0157 */, /*49607*/"VARIATION SELECTOR-105"/* E0158 */,/*49608*/"VARIATION SELECTOR-106"/* E0159 */, /*49609*/"VARIATION SELECTOR-107"/* E015A */,/*49610*/"VARIATION SELECTOR-108"/* E015B */, /*49611*/"VARIATION SELECTOR-109"/* E015C */,/*49612*/"VARIATION SELECTOR-110"/* E015D */, /*49613*/"VARIATION SELECTOR-111"/* E015E */,/*49614*/"VARIATION SELECTOR-112"/* E015F */, /*49615*/"VARIATION SELECTOR-113"/* E0160 */,/*49616*/"VARIATION SELECTOR-114"/* E0161 */, /*49617*/"VARIATION SELECTOR-115"/* E0162 */,/*49618*/"VARIATION SELECTOR-116"/* E0163 */, /*49619*/"VARIATION SELECTOR-117"/* E0164 */,/*49620*/"VARIATION SELECTOR-118"/* E0165 */, /*49621*/"VARIATION SELECTOR-119"/* E0166 */,/*49622*/"VARIATION SELECTOR-120"/* E0167 */, /*49623*/"VARIATION SELECTOR-121"/* E0168 */,/*49624*/"VARIATION SELECTOR-122"/* E0169 */, /*49625*/"VARIATION SELECTOR-123"/* E016A */,/*49626*/"VARIATION SELECTOR-124"/* E016B */, /*49627*/"VARIATION SELECTOR-125"/* E016C */,/*49628*/"VARIATION SELECTOR-126"/* E016D */, /*49629*/"VARIATION SELECTOR-127"/* E016E */,/*49630*/"VARIATION SELECTOR-128"/* E016F */, /*49631*/"VARIATION SELECTOR-129"/* E0170 */,/*49632*/"VARIATION SELECTOR-130"/* E0171 */, /*49633*/"VARIATION SELECTOR-131"/* E0172 */,/*49634*/"VARIATION SELECTOR-132"/* E0173 */, /*49635*/"VARIATION SELECTOR-133"/* E0174 */,/*49636*/"VARIATION SELECTOR-134"/* E0175 */, /*49637*/"VARIATION SELECTOR-135"/* E0176 */,/*49638*/"VARIATION SELECTOR-136"/* E0177 */, /*49639*/"VARIATION SELECTOR-137"/* E0178 */,/*49640*/"VARIATION SELECTOR-138"/* E0179 */, /*49641*/"VARIATION SELECTOR-139"/* E017A */,/*49642*/"VARIATION SELECTOR-140"/* E017B */, /*49643*/"VARIATION SELECTOR-141"/* E017C */,/*49644*/"VARIATION SELECTOR-142"/* E017D */, /*49645*/"VARIATION SELECTOR-143"/* E017E */,/*49646*/"VARIATION SELECTOR-144"/* E017F */, /*49647*/"VARIATION SELECTOR-145"/* E0180 */,/*49648*/"VARIATION SELECTOR-146"/* E0181 */, /*49649*/"VARIATION SELECTOR-147"/* E0182 */,/*49650*/"VARIATION SELECTOR-148"/* E0183 */, /*49651*/"VARIATION SELECTOR-149"/* E0184 */,/*49652*/"VARIATION SELECTOR-150"/* E0185 */, /*49653*/"VARIATION SELECTOR-151"/* E0186 */,/*49654*/"VARIATION SELECTOR-152"/* E0187 */, /*49655*/"VARIATION SELECTOR-153"/* E0188 */,/*49656*/"VARIATION SELECTOR-154"/* E0189 */, /*49657*/"VARIATION SELECTOR-155"/* E018A */,/*49658*/"VARIATION SELECTOR-156"/* E018B */, /*49659*/"VARIATION SELECTOR-157"/* E018C */,/*49660*/"VARIATION SELECTOR-158"/* E018D */, /*49661*/"VARIATION SELECTOR-159"/* E018E */,/*49662*/"VARIATION SELECTOR-160"/* E018F */, /*49663*/"VARIATION SELECTOR-161"/* E0190 */,/*49664*/"VARIATION SELECTOR-162"/* E0191 */, /*49665*/"VARIATION SELECTOR-163"/* E0192 */,/*49666*/"VARIATION SELECTOR-164"/* E0193 */, /*49667*/"VARIATION SELECTOR-165"/* E0194 */,/*49668*/"VARIATION SELECTOR-166"/* E0195 */, /*49669*/"VARIATION SELECTOR-167"/* E0196 */,/*49670*/"VARIATION SELECTOR-168"/* E0197 */, /*49671*/"VARIATION SELECTOR-169"/* E0198 */,/*49672*/"VARIATION SELECTOR-170"/* E0199 */, /*49673*/"VARIATION SELECTOR-171"/* E019A */,/*49674*/"VARIATION SELECTOR-172"/* E019B */, /*49675*/"VARIATION SELECTOR-173"/* E019C */,/*49676*/"VARIATION SELECTOR-174"/* E019D */, /*49677*/"VARIATION SELECTOR-175"/* E019E */,/*49678*/"VARIATION SELECTOR-176"/* E019F */, /*49679*/"VARIATION SELECTOR-177"/* E01A0 */,/*49680*/"VARIATION SELECTOR-178"/* E01A1 */, /*49681*/"VARIATION SELECTOR-179"/* E01A2 */,/*49682*/"VARIATION SELECTOR-180"/* E01A3 */, /*49683*/"VARIATION SELECTOR-181"/* E01A4 */,/*49684*/"VARIATION SELECTOR-182"/* E01A5 */, /*49685*/"VARIATION SELECTOR-183"/* E01A6 */,/*49686*/"VARIATION SELECTOR-184"/* E01A7 */, /*49687*/"VARIATION SELECTOR-185"/* E01A8 */,/*49688*/"VARIATION SELECTOR-186"/* E01A9 */, /*49689*/"VARIATION SELECTOR-187"/* E01AA */,/*49690*/"VARIATION SELECTOR-188"/* E01AB */, /*49691*/"VARIATION SELECTOR-189"/* E01AC */,/*49692*/"VARIATION SELECTOR-190"/* E01AD */, /*49693*/"VARIATION SELECTOR-191"/* E01AE */,/*49694*/"VARIATION SELECTOR-192"/* E01AF */, /*49695*/"VARIATION SELECTOR-193"/* E01B0 */,/*49696*/"VARIATION SELECTOR-194"/* E01B1 */, /*49697*/"VARIATION SELECTOR-195"/* E01B2 */,/*49698*/"VARIATION SELECTOR-196"/* E01B3 */, /*49699*/"VARIATION SELECTOR-197"/* E01B4 */,/*49700*/"VARIATION SELECTOR-198"/* E01B5 */, /*49701*/"VARIATION SELECTOR-199"/* E01B6 */,/*49702*/"VARIATION SELECTOR-200"/* E01B7 */, /*49703*/"VARIATION SELECTOR-201"/* E01B8 */,/*49704*/"VARIATION SELECTOR-202"/* E01B9 */, /*49705*/"VARIATION SELECTOR-203"/* E01BA */,/*49706*/"VARIATION SELECTOR-204"/* E01BB */, /*49707*/"VARIATION SELECTOR-205"/* E01BC */,/*49708*/"VARIATION SELECTOR-206"/* E01BD */, /*49709*/"VARIATION SELECTOR-207"/* E01BE */,/*49710*/"VARIATION SELECTOR-208"/* E01BF */, /*49711*/"VARIATION SELECTOR-209"/* E01C0 */,/*49712*/"VARIATION SELECTOR-210"/* E01C1 */, /*49713*/"VARIATION SELECTOR-211"/* E01C2 */,/*49714*/"VARIATION SELECTOR-212"/* E01C3 */, /*49715*/"VARIATION SELECTOR-213"/* E01C4 */,/*49716*/"VARIATION SELECTOR-214"/* E01C5 */, /*49717*/"VARIATION SELECTOR-215"/* E01C6 */,/*49718*/"VARIATION SELECTOR-216"/* E01C7 */, /*49719*/"VARIATION SELECTOR-217"/* E01C8 */,/*49720*/"VARIATION SELECTOR-218"/* E01C9 */, /*49721*/"VARIATION SELECTOR-219"/* E01CA */,/*49722*/"VARIATION SELECTOR-220"/* E01CB */, /*49723*/"VARIATION SELECTOR-221"/* E01CC */,/*49724*/"VARIATION SELECTOR-222"/* E01CD */, /*49725*/"VARIATION SELECTOR-223"/* E01CE */,/*49726*/"VARIATION SELECTOR-224"/* E01CF */, /*49727*/"VARIATION SELECTOR-225"/* E01D0 */,/*49728*/"VARIATION SELECTOR-226"/* E01D1 */, /*49729*/"VARIATION SELECTOR-227"/* E01D2 */,/*49730*/"VARIATION SELECTOR-228"/* E01D3 */, /*49731*/"VARIATION SELECTOR-229"/* E01D4 */,/*49732*/"VARIATION SELECTOR-230"/* E01D5 */, /*49733*/"VARIATION SELECTOR-231"/* E01D6 */,/*49734*/"VARIATION SELECTOR-232"/* E01D7 */, /*49735*/"VARIATION SELECTOR-233"/* E01D8 */,/*49736*/"VARIATION SELECTOR-234"/* E01D9 */, /*49737*/"VARIATION SELECTOR-235"/* E01DA */,/*49738*/"VARIATION SELECTOR-236"/* E01DB */, /*49739*/"VARIATION SELECTOR-237"/* E01DC */,/*49740*/"VARIATION SELECTOR-238"/* E01DD */, /*49741*/"VARIATION SELECTOR-239"/* E01DE */,/*49742*/"VARIATION SELECTOR-240"/* E01DF */, /*49743*/"VARIATION SELECTOR-241"/* E01E0 */,/*49744*/"VARIATION SELECTOR-242"/* E01E1 */, /*49745*/"VARIATION SELECTOR-243"/* E01E2 */,/*49746*/"VARIATION SELECTOR-244"/* E01E3 */, /*49747*/"VARIATION SELECTOR-245"/* E01E4 */,/*49748*/"VARIATION SELECTOR-246"/* E01E5 */, /*49749*/"VARIATION SELECTOR-247"/* E01E6 */,/*49750*/"VARIATION SELECTOR-248"/* E01E7 */, /*49751*/"VARIATION SELECTOR-249"/* E01E8 */,/*49752*/"VARIATION SELECTOR-250"/* E01E9 */, /*49753*/"VARIATION SELECTOR-251"/* E01EA */,/*49754*/"VARIATION SELECTOR-252"/* E01EB */, /*49755*/"VARIATION SELECTOR-253"/* E01EC */,/*49756*/"VARIATION SELECTOR-254"/* E01ED */, /*49757*/"VARIATION SELECTOR-255"/* E01EE */,/*49758*/"VARIATION SELECTOR-256"/* E01EF */, /*49759*/""/* F0000 */,/*49760*/""/* F0001 */, /*49761*/""/* 100000 */,/*49762*/""/* 100001 */, /*49763*/"Out of Range"/* 110000 */ }; static const MVMuint32 props_bitfield[9999][7] = { {0,0,0,0,0,0,0},/*1*/{0,4096u,65537u,69927872u,805503666u,0,3221225472u}/* 0000 */, /*2*/{0,4096u,65537u,69731264u,6488754u,0,3221487872u}/* 0009 */, /*3*/{0,4096u,65537u,69675968u,539099826u,0,3221487872u}/* 000A */, /*4*/{0,4096u,65537u,69743552u,6488754u,0,3221487872u}/* 000B */, /*5*/{0,4096u,65537u,69809088u,6488754u,0,3221487872u}/* 000C */, /*6*/{0,4096u,65536u,69673920u,269550258u,0,3221487872u}/* 000D */, /*7*/{0,4096u,65537u,69665728u,805503666u,0,3221225472u}/* 001C */, /*8*/{0,4096u,65537u,69731264u,805503666u,0,3221225472u}/* 001F */, /*9*/{0,4096u,65537u,69796608u,1885340336u,131072u,3221487904u}/* 0020 */, /*10*/{0,4096u,65537u,69862848u,12583600u,131072u,3222818816u}/* 0021 */, /*11*/{0,4096u,65537u,69864896u,13632176u,131072u,3222929408u}/* 0022 */, /*12*/{0,4096u,65537u,69469632u,688u,131072u,3222798336u}/* 0023 */, /*13*/{0,4096u,65537u,69469760u,688u,131072u,3221782528u}/* 0024 */, /*14*/{0,4096u,65537u,69862848u,688u,131072u,3222798336u}/* 0026 */, /*15*/{0,4096u,65537u,69866944u,13632176u,2147614720u,3222929408u}/* 0027 */, /*16*/{0,4104u,65537u,69862656u,13632180u,131072u,3222798336u}/* 0028 */, /*17*/{0,4112u,65537u,69862720u,13632180u,131072u,3222798336u}/* 0029 */, /*18*/{0,4096u,65537u,69404160u,688u,131074u,3221782528u}/* 002B */, /*19*/{0,4096u,65537u,69627328u,14680752u,131072u,3222802432u}/* 002C */, /*20*/{0,4096u,65537u,69403840u,14680752u,8527872u,3222798336u}/* 002D */, /*21*/{0,4096u,65537u,69629376u,11535024u,2147614720u,3222818816u}/* 002E */, /*22*/{0,4096u,65537u,69600704u,688u,131072u,3222798336u}/* 002F */, /*23*/{0,4096u,33620993u,69368385u,44047024u,148481u,3221225600u}/* 0030 */, /*24*/{0,4096u,453051905u,69368385u,44047024u,148481u,3221225600u}/* 0031 */, /*25*/{0,4096u,486607361u,69368385u,44047024u,148481u,3221225600u}/* 0032 */, /*26*/{0,4096u,520161281u,69368385u,44047024u,148481u,3221225600u}/* 0033 */, /*27*/{0,4096u,553717761u,69368385u,44047024u,148481u,3221225600u}/* 0034 */, /*28*/{0,4096u,587271169u,69368385u,44047024u,148481u,3221225600u}/* 0035 */, /*29*/{0,4096u,620828161u,69368385u,44047024u,148481u,3221225600u}/* 0036 */, /*30*/{0,4096u,654380545u,69368385u,44047024u,148481u,3221225600u}/* 0037 */, /*31*/{0,4096u,687938561u,69368385u,44047024u,148481u,3221225600u}/* 0038 */, /*32*/{0,4096u,721490945u,69368385u,44047024u,148481u,3221225600u}/* 0039 */, /*33*/{0,4096u,65537u,69625280u,14680752u,2147614720u,3222802432u}/* 003A */, /*34*/{0,4096u,65537u,69889472u,688u,131072u,3222802432u}/* 003B */, /*35*/{0,4120u,65537u,69862912u,692u,131074u,3221782528u}/* 003C */, /*36*/{0,4096u,65537u,69862912u,688u,131074u,3221782528u}/* 003D */, /*37*/{0,4128u,65537u,69862912u,692u,131074u,3221782528u}/* 003E */, /*38*/{128u,2101248u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0041 */, /*39*/{256u,4198400u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0042 */, /*40*/{384u,6295552u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0043 */, /*41*/{512u,8392704u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0044 */, /*42*/{640u,10489856u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0045 */, /*43*/{768u,12587008u,131073u,69228609u,8389361u,2080523872u,3221226688u}/* 0046 */, /*44*/{896u,14684160u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0047 */, /*45*/{1024u,16781312u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0048 */, /*46*/{1152u,18878464u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0049 */, /*47*/{1280u,20975616u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004A */, /*48*/{1408u,23072768u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004B */, /*49*/{1536u,25169920u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004C */, /*50*/{1664u,27267072u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004D */, /*51*/{1792u,29364224u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004E */, /*52*/{1920u,31461376u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 004F */, /*53*/{2048u,33558528u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0050 */, /*54*/{2176u,35655680u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0051 */, /*55*/{2304u,37752832u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0052 */, /*56*/{2432u,39849984u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0053 */, /*57*/{2560u,41947136u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0054 */, /*58*/{2688u,44044288u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0055 */, /*59*/{2816u,46141440u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0056 */, /*60*/{2944u,48238592u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0057 */, /*61*/{3072u,50335744u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0058 */, /*62*/{3200u,52432896u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0059 */, /*63*/{3328u,54530048u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 005A */, /*64*/{0,4136u,65537u,69862656u,13632180u,131072u,3222798336u}/* 005B */, /*65*/{0,4144u,65537u,69862720u,13632180u,131072u,3222798336u}/* 005D */, /*66*/{0,4096u,65537u,69863040u,688u,2148663298u,3225976832u}/* 005E */, /*67*/{0,4096u,65537u,69895552u,688u,132096u,3222274176u}/* 005F */, /*68*/{0,4096u,65537u,69863040u,688u,2148663296u,3221782528u}/* 0060 */, /*69*/{3456u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0061 */, /*70*/{3584u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0062 */, /*71*/{3712u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0063 */, /*72*/{3840u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0064 */, /*73*/{3968u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0065 */, /*74*/{4096u,4096u,131073u,69228673u,7340784u,1392658024u,3221225664u}/* 0066 */, /*75*/{4224u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0067 */, /*76*/{4352u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0068 */, /*77*/{4480u,4096u,131073u,69228672u,7340784u,1392641640u,3221233856u}/* 0069 */, /*78*/{4608u,4096u,131073u,69228672u,7340784u,1392641640u,3221233856u}/* 006A */, /*79*/{4736u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 006B */, /*80*/{4864u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 006C */, /*81*/{4992u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 006D */, /*82*/{5120u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 006E */, /*83*/{5248u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 006F */, /*84*/{5376u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0070 */, /*85*/{5504u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0071 */, /*86*/{5632u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0072 */, /*87*/{5760u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0073 */, /*88*/{5888u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0074 */, /*89*/{6016u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0075 */, /*90*/{6144u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0076 */, /*91*/{6272u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0077 */, /*92*/{6400u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0078 */, /*93*/{6528u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0079 */, /*94*/{6656u,4096u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 007A */, /*95*/{0,4152u,65537u,69862656u,13632180u,131072u,3222798336u}/* 007B */, /*96*/{0,4160u,65537u,69862720u,13632180u,131072u,3222798336u}/* 007D */, /*97*/{0,8192u,65537u,69927872u,805503666u,0,3221225472u}/* 0080 */, /*98*/{0,8192u,65537u,69678016u,2420310706u,0,3221487872u}/* 0085 */, /*99*/{524288u,8192u,65537u,69600008u,1348468912u,67239936u,2147483936u}/* 00A0 */, /*100*/{0,8192u,65537u,69862848u,688u,131072u,3222798336u}/* 00A1 */, /*101*/{0,8192u,65537u,69469760u,688u,131072u,3221782528u}/* 00A2 */, /*102*/{0,8192u,65537u,69863104u,688u,131072u,3221782528u}/* 00A6 */, /*103*/{1048576u,8192u,65537u,69863044u,176u,2215772160u,2147516416u}/* 00A8 */, /*104*/{1572864u,8192u,131073u,69228884u,7340272u,1140983368u,2155872448u}/* 00AA */, /*105*/{0,8264u,65537u,69863168u,13632180u,131072u,3222929408u}/* 00AB */, /*106*/{0,8192u,65537u,69862912u,688u,131074u,3221782528u}/* 00AC */, /*107*/{0,8192u,65537u,69946368u,5440178u,2218795008u,3221225472u}/* 00AD */, /*108*/{2097152u,8192u,65537u,69863044u,176u,2215772160u,2147516416u}/* 00AF */, /*109*/{0,8192u,65537u,69469888u,688u,131072u,3221782528u}/* 00B0 */, /*110*/{0,8192u,65537u,69469696u,688u,131074u,3221782528u}/* 00B1 */, /*111*/{2621440u,8192u,486607361u,69337812u,33558704u,67239937u,2147483648u}/* 00B2 */, /*112*/{3145728u,8192u,520161281u,69337812u,33558704u,67239937u,2147483648u}/* 00B3 */, /*113*/{3670016u,8192u,65537u,69863044u,176u,2215772160u,2147516416u}/* 00B4 */, /*114*/{4201088u,56631296u,65537u,69228676u,7340273u,1996621416u,2147483840u}/* 00B5 */, /*115*/{0,8192u,65537u,69887424u,688u,2149188608u,3255828608u}/* 00B7 */, /*116*/{4718592u,8192u,65537u,69863044u,176u,2215772160u,2147516416u}/* 00B8 */, /*117*/{5242880u,8192u,453051905u,69337812u,33558704u,67239937u,2147483648u}/* 00B9 */, /*118*/{5767168u,8192u,131073u,69228884u,7340272u,1140983368u,2155872448u}/* 00BA */, /*119*/{0,8272u,65537u,69863232u,13632180u,131072u,3222929408u}/* 00BB */, /*120*/{6291456u,8192u,201393665u,69862114u,184551600u,67239937u,2147483648u}/* 00BC */, /*121*/{6815744u,8192u,285279745u,69862114u,16779440u,67239937u,2147483648u}/* 00BD */, /*122*/{7340032u,8192u,369166337u,69862114u,184551600u,67239937u,2147483648u}/* 00BE */, /*123*/{7871232u,58728448u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C0 */, /*124*/{8395648u,60825600u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C1 */, /*125*/{8920064u,62922752u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C2 */, /*126*/{9444480u,65019904u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C3 */, /*127*/{9968896u,67117056u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C4 */, /*128*/{10493312u,69214208u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C5 */, /*129*/{7680u,71311360u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 00C6 */, /*130*/{11017856u,73408512u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C7 */, /*131*/{11542272u,75505664u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C8 */, /*132*/{12066688u,77602816u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00C9 */, /*133*/{12591104u,79699968u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CA */, /*134*/{13115520u,81797120u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CB */, /*135*/{13639936u,83894272u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CC */, /*136*/{14164352u,85991424u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CD */, /*137*/{14688768u,88088576u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CE */, /*138*/{15213184u,90185728u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00CF */, /*139*/{8960u,92282880u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 00D0 */, /*140*/{15737728u,94380032u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D1 */, /*141*/{16262144u,96477184u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D2 */, /*142*/{16786560u,98574336u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D3 */, /*143*/{17310976u,100671488u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D4 */, /*144*/{17835392u,102768640u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D5 */, /*145*/{18359808u,104865792u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D6 */, /*146*/{9856u,106962944u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 00D8 */, /*147*/{18884352u,109060096u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00D9 */, /*148*/{19408768u,111157248u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00DA */, /*149*/{19933184u,113254400u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00DB */, /*150*/{20457600u,115351552u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00DC */, /*151*/{20982016u,117448704u,131073u,69228610u,8389361u,2080507488u,1216u}/* 00DD */, /*152*/{10624u,119545856u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 00DE */, /*153*/{1u,2105344u,131073u,69228672u,7340784u,1996621416u,3221225664u}/* 00DF */, /*154*/{21506560u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E0 */, /*155*/{22030976u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E1 */, /*156*/{22555392u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E2 */, /*157*/{23079808u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E3 */, /*158*/{23604224u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E4 */, /*159*/{24128640u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E5 */, /*160*/{11520u,8192u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 00E6 */, /*161*/{24653184u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E7 */, /*162*/{25177600u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E8 */, /*163*/{25702016u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00E9 */, /*164*/{26226432u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00EA */, /*165*/{26750848u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00EB */, /*166*/{27275264u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00EC */, /*167*/{27799680u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00ED */, /*168*/{28324096u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00EE */, /*169*/{28848512u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00EF */, /*170*/{12800u,8192u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 00F0 */, /*171*/{29373056u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F1 */, /*172*/{29897472u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F2 */, /*173*/{30421888u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F3 */, /*174*/{30946304u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F4 */, /*175*/{31470720u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F5 */, /*176*/{31995136u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F6 */, /*177*/{13696u,8192u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 00F8 */, /*178*/{32519680u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00F9 */, /*179*/{33044096u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00FA */, /*180*/{33568512u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00FB */, /*181*/{34092928u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00FC */, /*182*/{34617344u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00FD */, /*183*/{14464u,8192u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 00FE */, /*184*/{35141888u,8192u,131073u,69228674u,7340784u,1392641640u,192u}/* 00FF */, /*185*/{35666304u,121647104u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0100 */, /*186*/{36190720u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0101 */, /*187*/{36715136u,123744256u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0102 */, /*188*/{37239552u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0103 */, /*189*/{37763968u,125841408u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0104 */, /*190*/{38288384u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0105 */, /*191*/{38812800u,127938560u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0106 */, /*192*/{39337216u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0107 */, /*193*/{39861632u,130035712u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0108 */, /*194*/{40386048u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0109 */, /*195*/{40910464u,132132864u,131073u,69228610u,8389361u,2080507488u,1216u}/* 010A */, /*196*/{41434880u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 010B */, /*197*/{41959296u,134230016u,131073u,69228610u,8389361u,2080507488u,1216u}/* 010C */, /*198*/{42483712u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 010D */, /*199*/{43008128u,136327168u,131073u,69228610u,8389361u,2080507488u,1216u}/* 010E */, /*200*/{43532544u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 010F */, /*201*/{16768u,138424320u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0110 */, /*202*/{16896u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0111 */, /*203*/{44057216u,140521472u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0112 */, /*204*/{44581632u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0113 */, /*205*/{45106048u,142618624u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0114 */, /*206*/{45630464u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0115 */, /*207*/{46154880u,144715776u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0116 */, /*208*/{46679296u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0117 */, /*209*/{47203712u,146812928u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0118 */, /*210*/{47728128u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0119 */, /*211*/{48252544u,148910080u,131073u,69228610u,8389361u,2080507488u,1216u}/* 011A */, /*212*/{48776960u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 011B */, /*213*/{49301376u,151007232u,131073u,69228610u,8389361u,2080507488u,1216u}/* 011C */, /*214*/{49825792u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 011D */, /*215*/{50350208u,153104384u,131073u,69228610u,8389361u,2080507488u,1216u}/* 011E */, /*216*/{50874624u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 011F */, /*217*/{51399040u,155201536u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0120 */, /*218*/{51923456u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0121 */, /*219*/{52447872u,157298688u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0122 */, /*220*/{52972288u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0123 */, /*221*/{53496704u,159395840u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0124 */, /*222*/{54021120u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0125 */, /*223*/{19584u,161492992u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0126 */, /*224*/{19712u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0127 */, /*225*/{54545792u,163590144u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0128 */, /*226*/{55070208u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0129 */, /*227*/{55594624u,165687296u,131073u,69228610u,8389361u,2080507488u,1216u}/* 012A */, /*228*/{56119040u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 012B */, /*229*/{56643456u,167784448u,131073u,69228610u,8389361u,2080507488u,1216u}/* 012C */, /*230*/{57167872u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 012D */, /*231*/{57692288u,169881600u,131073u,69228610u,8389361u,2080507488u,1216u}/* 012E */, /*232*/{58216704u,12288u,131073u,69228674u,7340784u,1392641640u,8384u}/* 012F */, /*233*/{58741122u,4206592u,131073u,69228610u,8389360u,2080507488u,1216u}/* 0130 */, /*234*/{20992u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0131 */, /*235*/{59265664u,171978752u,131073u,69228612u,8388849u,2080507488u,2147484864u}/* 0132 */, /*236*/{59790080u,12288u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 0133 */, /*237*/{60314496u,174075904u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0134 */, /*238*/{60838912u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0135 */, /*239*/{61363328u,176173056u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0136 */, /*240*/{61887744u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0137 */, /*241*/{0,12288u,131073u,69228672u,7340784u,1073874536u,3221225664u}/* 0138 */, /*242*/{62412160u,178270208u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0139 */, /*243*/{62936576u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 013A */, /*244*/{63460992u,180367360u,131073u,69228610u,8389361u,2080507488u,1216u}/* 013B */, /*245*/{63985408u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 013C */, /*246*/{64509824u,182464512u,131073u,69228610u,8389361u,2080507488u,1216u}/* 013D */, /*247*/{65034240u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 013E */, /*248*/{65558656u,184561664u,131073u,69228612u,8388849u,2080507488u,2147484864u}/* 013F */, /*249*/{66083072u,12288u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 0140 */, /*250*/{22912u,186658816u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0141 */, /*251*/{23040u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0142 */, /*252*/{66607744u,188755968u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0143 */, /*253*/{67132160u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0144 */, /*254*/{67656576u,190853120u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0145 */, /*255*/{68180992u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0146 */, /*256*/{68705408u,192950272u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0147 */, /*257*/{69229824u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0148 */, /*258*/{69730320u,6303744u,131073u,69228676u,7340272u,1998718568u,2147483840u}/* 0149 */, /*259*/{23936u,195047424u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 014A */, /*260*/{24064u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 014B */, /*261*/{70278784u,197144576u,131073u,69228610u,8389361u,2080507488u,1216u}/* 014C */, /*262*/{70803200u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 014D */, /*263*/{71327616u,199241728u,131073u,69228610u,8389361u,2080507488u,1216u}/* 014E */, /*264*/{71852032u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 014F */, /*265*/{72376448u,201338880u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0150 */, /*266*/{72900864u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0151 */, /*267*/{24960u,203436032u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0152 */, /*268*/{25088u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0153 */, /*269*/{73425536u,205533184u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0154 */, /*270*/{73949952u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0155 */, /*271*/{74474368u,207630336u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0156 */, /*272*/{74998784u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0157 */, /*273*/{75523200u,209727488u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0158 */, /*274*/{76047616u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0159 */, /*275*/{76572032u,211824640u,131073u,69228610u,8389361u,2080507488u,1216u}/* 015A */, /*276*/{77096448u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 015B */, /*277*/{77620864u,213921792u,131073u,69228610u,8389361u,2080507488u,1216u}/* 015C */, /*278*/{78145280u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 015D */, /*279*/{78669696u,216018944u,131073u,69228610u,8389361u,2080507488u,1216u}/* 015E */, /*280*/{79194112u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 015F */, /*281*/{79718528u,218116096u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0160 */, /*282*/{80242944u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0161 */, /*283*/{80767360u,220213248u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0162 */, /*284*/{81291776u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0163 */, /*285*/{81816192u,222310400u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0164 */, /*286*/{82340608u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0165 */, /*287*/{27520u,224407552u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0166 */, /*288*/{27648u,12288u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0167 */, /*289*/{82865280u,226504704u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0168 */, /*290*/{83389696u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0169 */, /*291*/{83914112u,228601856u,131073u,69228610u,8389361u,2080507488u,1216u}/* 016A */, /*292*/{84438528u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 016B */, /*293*/{84962944u,230699008u,131073u,69228610u,8389361u,2080507488u,1216u}/* 016C */, /*294*/{85487360u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 016D */, /*295*/{86011776u,232796160u,131073u,69228610u,8389361u,2080507488u,1216u}/* 016E */, /*296*/{86536192u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 016F */, /*297*/{87060608u,234893312u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0170 */, /*298*/{87585024u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0171 */, /*299*/{88109440u,236990464u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0172 */, /*300*/{88633856u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0173 */, /*301*/{89158272u,239087616u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0174 */, /*302*/{89682688u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0175 */, /*303*/{90207104u,241184768u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0176 */, /*304*/{90731520u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 0177 */, /*305*/{91255936u,243281920u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0178 */, /*306*/{91780352u,245379072u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0179 */, /*307*/{92304768u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 017A */, /*308*/{92829184u,247476224u,131073u,69228610u,8389361u,2080507488u,1216u}/* 017B */, /*309*/{93353600u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 017C */, /*310*/{93878016u,249573376u,131073u,69228610u,8389361u,2080507488u,1216u}/* 017D */, /*311*/{94402432u,12288u,131073u,69228674u,7340784u,1392641640u,192u}/* 017E */, /*312*/{94926848u,251670528u,131073u,69228676u,7340273u,1996621416u,2147483840u}/* 017F */, /*313*/{30848u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0180 */, /*314*/{30976u,253771776u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0181 */, /*315*/{31104u,255868928u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0182 */, /*316*/{31232u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0183 */, /*317*/{31360u,257966080u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0184 */, /*318*/{31488u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0185 */, /*319*/{31616u,260063232u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0186 */, /*320*/{31744u,262160384u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0187 */, /*321*/{31872u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0188 */, /*322*/{32000u,264257536u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0189 */, /*323*/{32128u,266354688u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 018A */, /*324*/{32256u,268451840u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 018B */, /*325*/{32384u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 018C */, /*326*/{0,16384u,131073u,69228672u,7340784u,1073874536u,3221225664u}/* 018D */, /*327*/{32512u,270548992u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 018E */, /*328*/{32640u,272646144u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 018F */, /*329*/{32768u,274743296u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0190 */, /*330*/{32896u,276840448u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0191 */, /*331*/{33024u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0192 */, /*332*/{33152u,278937600u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0193 */, /*333*/{33280u,281034752u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0194 */, /*334*/{33408u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0195 */, /*335*/{33536u,283131904u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0196 */, /*336*/{33664u,285229056u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0197 */, /*337*/{33792u,287326208u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 0198 */, /*338*/{33920u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0199 */, /*339*/{34048u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 019A */, /*340*/{34176u,289423360u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 019C */, /*341*/{34304u,291520512u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 019D */, /*342*/{34432u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 019E */, /*343*/{34560u,293617664u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 019F */, /*344*/{95455104u,295714816u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01A0 */, /*345*/{95979520u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01A1 */, /*346*/{34944u,297811968u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01A2 */, /*347*/{35072u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01A3 */, /*348*/{35200u,299909120u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01A4 */, /*349*/{35328u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01A5 */, /*350*/{35456u,302006272u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01A6 */, /*351*/{35584u,304103424u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01A7 */, /*352*/{35712u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01A8 */, /*353*/{35840u,306200576u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01A9 */, /*354*/{35968u,308297728u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01AC */, /*355*/{36096u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01AD */, /*356*/{36224u,310394880u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01AE */, /*357*/{96505344u,312492032u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01AF */, /*358*/{97029760u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01B0 */, /*359*/{36608u,314589184u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B1 */, /*360*/{36736u,316686336u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B2 */, /*361*/{36864u,318783488u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B3 */, /*362*/{36992u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01B4 */, /*363*/{37120u,320880640u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B5 */, /*364*/{37248u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01B6 */, /*365*/{37376u,322977792u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B7 */, /*366*/{37504u,325074944u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01B8 */, /*367*/{37632u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01B9 */, /*368*/{0,16384u,131073u,69228864u,9437936u,132672u,3221225664u}/* 01BB */, /*369*/{37760u,327172096u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01BC */, /*370*/{37888u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01BD */, /*371*/{38016u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01BF */, /*372*/{97555712u,329269248u,131073u,69228612u,8388849u,2114061920u,2147484864u}/* 01C4 */, /*373*/{98080128u,331366400u,131073u,69228740u,8388849u,2097284704u,2147483840u}/* 01C5 */, /*374*/{98604544u,16384u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 01C6 */, /*375*/{99128960u,333463552u,131073u,69228612u,8388849u,2114061920u,2147484864u}/* 01C7 */, /*376*/{99653376u,335560704u,131073u,69228740u,8388849u,2097284704u,2147483840u}/* 01C8 */, /*377*/{100177792u,16384u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 01C9 */, /*378*/{100702208u,337657856u,131073u,69228612u,8388849u,2114061920u,2147484864u}/* 01CA */, /*379*/{101226624u,339755008u,131073u,69228740u,8388849u,2097284704u,2147483840u}/* 01CB */, /*380*/{101751040u,16384u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 01CC */, /*381*/{102275456u,341852160u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01CD */, /*382*/{102799872u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01CE */, /*383*/{103324288u,343949312u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01CF */, /*384*/{103848704u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01D0 */, /*385*/{104373120u,346046464u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01D1 */, /*386*/{104897536u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01D2 */, /*387*/{105421952u,348143616u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01D3 */, /*388*/{105946368u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01D4 */, /*389*/{106470784u,350240768u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01D5 */, /*390*/{106995200u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01D6 */, /*391*/{107519616u,352337920u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01D7 */, /*392*/{108044032u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01D8 */, /*393*/{108568448u,354435072u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01D9 */, /*394*/{109092864u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01DA */, /*395*/{109617280u,356532224u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01DB */, /*396*/{110141696u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01DC */, /*397*/{41344u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01DD */, /*398*/{110666240u,358629376u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01DE */, /*399*/{111190656u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01DF */, /*400*/{111715072u,360726528u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01E0 */, /*401*/{112239488u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01E1 */, /*402*/{112763904u,362823680u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01E2 */, /*403*/{113288320u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01E3 */, /*404*/{42240u,364920832u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 01E4 */, /*405*/{42368u,16384u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 01E5 */, /*406*/{113812992u,367017984u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01E6 */, /*407*/{114337408u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01E7 */, /*408*/{114861824u,369115136u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01E8 */, /*409*/{115386240u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01E9 */, /*410*/{115910656u,371212288u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01EA */, /*411*/{116435072u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01EB */, /*412*/{116959488u,373309440u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01EC */, /*413*/{117483904u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01ED */, /*414*/{118008320u,375406592u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01EE */, /*415*/{118532736u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01EF */, /*416*/{119013395u,8404992u,131073u,69228674u,7340784u,1392641640u,192u}/* 01F0 */, /*417*/{119581440u,377503744u,131073u,69228612u,8388849u,2114061920u,2147484864u}/* 01F1 */, /*418*/{120105856u,379600896u,131073u,69228740u,8388849u,2097284704u,2147483840u}/* 01F2 */, /*419*/{120630272u,16384u,131073u,69228676u,7340272u,1459750504u,2147483840u}/* 01F3 */, /*420*/{121154688u,381698048u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01F4 */, /*421*/{121679104u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01F5 */, /*422*/{44416u,383795200u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 01F6 */, /*423*/{44544u,385892352u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 01F7 */, /*424*/{122203776u,387989504u,131073u,75520066u,8389361u,2080507488u,1216u}/* 01F8 */, /*425*/{122728192u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 01F9 */, /*426*/{123252608u,390086656u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01FA */, /*427*/{123777024u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01FB */, /*428*/{124301440u,392183808u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01FC */, /*429*/{124825856u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01FD */, /*430*/{125350272u,394280960u,131073u,69228610u,8389361u,2080507488u,1216u}/* 01FE */, /*431*/{125874688u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 01FF */, /*432*/{126399104u,396378112u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0200 */, /*433*/{126923520u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0201 */, /*434*/{127447936u,398475264u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0202 */, /*435*/{127972352u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0203 */, /*436*/{128496768u,400572416u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0204 */, /*437*/{129021184u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0205 */, /*438*/{129545600u,402669568u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0206 */, /*439*/{130070016u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0207 */, /*440*/{130594432u,404766720u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0208 */, /*441*/{131118848u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0209 */, /*442*/{131643264u,406863872u,131073u,69228610u,8389361u,2080507488u,1216u}/* 020A */, /*443*/{132167680u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 020B */, /*444*/{132692096u,408961024u,131073u,69228610u,8389361u,2080507488u,1216u}/* 020C */, /*445*/{133216512u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 020D */, /*446*/{133740928u,411058176u,131073u,69228610u,8389361u,2080507488u,1216u}/* 020E */, /*447*/{134265344u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 020F */, /*448*/{134789760u,413155328u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0210 */, /*449*/{135314176u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0211 */, /*450*/{135838592u,415252480u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0212 */, /*451*/{136363008u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0213 */, /*452*/{136887424u,417349632u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0214 */, /*453*/{137411840u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0215 */, /*454*/{137936256u,419446784u,131073u,69228610u,8389361u,2080507488u,1216u}/* 0216 */, /*455*/{138460672u,16384u,131073u,69228674u,7340784u,1392641640u,192u}/* 0217 */, /*456*/{138985088u,421543936u,131073u,75520066u,8389361u,2080507488u,1216u}/* 0218 */, /*457*/{139509504u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 0219 */, /*458*/{140033920u,423641088u,131073u,75520066u,8389361u,2080507488u,1216u}/* 021A */, /*459*/{140558336u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 021B */, /*460*/{49280u,425738240u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 021C */, /*461*/{49408u,16384u,131073u,75520128u,7340784u,1392641640u,3221225664u}/* 021D */, /*462*/{141083008u,427835392u,131073u,75520066u,8389361u,2080507488u,1216u}/* 021E */, /*463*/{141607424u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 021F */, /*464*/{49792u,429932544u,131073u,79714368u,8389361u,2080507488u,3221226688u}/* 0220 */, /*465*/{0,16384u,131073u,81811584u,7340784u,1073874536u,3221225664u}/* 0221 */, /*466*/{49920u,432029696u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 0222 */, /*467*/{50048u,16384u,131073u,75520128u,7340784u,1392641640u,3221225664u}/* 0223 */, /*468*/{50176u,434126848u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 0224 */, /*469*/{50304u,16384u,131073u,75520128u,7340784u,1392641640u,3221225664u}/* 0225 */, /*470*/{142132480u,436224000u,131073u,75520066u,8389361u,2080507488u,1216u}/* 0226 */, /*471*/{142656896u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 0227 */, /*472*/{143181312u,438321152u,131073u,75520066u,8389361u,2080507488u,1216u}/* 0228 */, /*473*/{143705728u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 0229 */, /*474*/{144230144u,440418304u,131073u,75520066u,8389361u,2080507488u,1216u}/* 022A */, /*475*/{144754560u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 022B */, /*476*/{145278976u,442515456u,131073u,75520066u,8389361u,2080507488u,1216u}/* 022C */, /*477*/{145803392u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 022D */, /*478*/{146327808u,444612608u,131073u,75520066u,8389361u,2080507488u,1216u}/* 022E */, /*479*/{146852224u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 022F */, /*480*/{147376640u,446709760u,131073u,75520066u,8389361u,2080507488u,1216u}/* 0230 */, /*481*/{147901056u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 0231 */, /*482*/{148425472u,448806912u,131073u,75520066u,8389361u,2080507488u,1216u}/* 0232 */, /*483*/{148949888u,16384u,131073u,75520130u,7340784u,1392641640u,192u}/* 0233 */, /*484*/{0,16384u,131073u,83908736u,7340784u,1073874536u,3221225664u}/* 0237 */, /*485*/{52224u,450904064u,131073u,83908672u,8389361u,2080507488u,3221226688u}/* 023A */, /*486*/{52352u,453001216u,131073u,83908672u,8389361u,2080507488u,3221226688u}/* 023B */, /*487*/{52480u,16384u,131073u,83908736u,7340784u,1392641640u,3221225664u}/* 023C */, /*488*/{52608u,455098368u,131073u,83908672u,8389361u,2080507488u,3221226688u}/* 023D */, /*489*/{52736u,457195520u,131073u,83908672u,8389361u,2080507488u,3221226688u}/* 023E */, /*490*/{52864u,16384u,131073u,83908736u,7340784u,1392641640u,3221225664u}/* 023F */, /*491*/{52992u,16384u,131073u,83908736u,7340784u,1392641640u,3221225664u}/* 0240 */, /*492*/{53120u,459292672u,131073u,83908672u,8389361u,2080507488u,3221226688u}/* 0241 */, /*493*/{53248u,16384u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 0242 */, /*494*/{53376u,461389824u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 0243 */, /*495*/{53504u,463486976u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 0244 */, /*496*/{53632u,465584128u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 0245 */, /*497*/{53760u,467681280u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 0246 */, /*498*/{53888u,16384u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 0247 */, /*499*/{54016u,469778432u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 0248 */, /*500*/{54144u,16384u,131073u,86005888u,7340784u,1392641640u,3221233856u}/* 0249 */, /*501*/{54272u,471875584u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 024A */, /*502*/{54400u,16384u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 024B */, /*503*/{54528u,473972736u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 024C */, /*504*/{54656u,16384u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 024D */, /*505*/{54784u,476069888u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 024E */, /*506*/{54912u,16384u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 024F */, /*507*/{55040u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0250 */, /*508*/{55168u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0251 */, /*509*/{55296u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0252 */, /*510*/{55424u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0253 */, /*511*/{55552u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0254 */, /*512*/{0,20480u,131073u,69228672u,7340784u,1073874536u,3221225664u}/* 0255 */, /*513*/{55680u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0256 */, /*514*/{55808u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0257 */, /*515*/{55936u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0259 */, /*516*/{56064u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 025B */, /*517*/{56192u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 025C */, /*518*/{56320u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0260 */, /*519*/{56448u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0261 */, /*520*/{56576u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0263 */, /*521*/{56704u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0265 */, /*522*/{56832u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0266 */, /*523*/{56960u,20480u,131073u,69228672u,7340784u,1392641640u,3221233856u}/* 0268 */, /*524*/{57088u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0269 */, /*525*/{57216u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 026B */, /*526*/{57344u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 026C */, /*527*/{57472u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 026F */, /*528*/{57600u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0271 */, /*529*/{57728u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0272 */, /*530*/{57856u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0275 */, /*531*/{57984u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 027D */, /*532*/{58112u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0280 */, /*533*/{58240u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0283 */, /*534*/{58368u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0287 */, /*535*/{58496u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0288 */, /*536*/{58624u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0289 */, /*537*/{58752u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 028A */, /*538*/{58880u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 028B */, /*539*/{59008u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 028C */, /*540*/{59136u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 0292 */, /*541*/{0,20480u,131073u,69228864u,9437936u,132672u,3221225664u}/* 0294 */, /*542*/{59264u,20480u,131073u,69228672u,7340784u,1392641640u,3221233856u}/* 029D */, /*543*/{59392u,20480u,131073u,69228672u,7340784u,1392641640u,3221225664u}/* 029E */, /*544*/{0,20480u,131073u,75520128u,7340784u,1073874536u,3221225664u}/* 02A9 */, /*545*/{0,20480u,131073u,81811584u,7340784u,1073874536u,3221225664u}/* 02AE */, /*546*/{149422080u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B0 */, /*547*/{149946368u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B1 */, /*548*/{150470656u,24576u,131073u,69228820u,7340272u,3289515592u,2155880640u}/* 02B2 */, /*549*/{150994944u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B3 */, /*550*/{151519232u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B4 */, /*551*/{152043520u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B5 */, /*552*/{152567808u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B6 */, /*553*/{153092096u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B7 */, /*554*/{153616384u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02B8 */, /*555*/{0,24576u,65537u,69884160u,9437936u,2148664896u,3221225664u}/* 02B9 */, /*556*/{0,24576u,65537u,69228800u,9437936u,2148664896u,3221225664u}/* 02BB */, /*557*/{0,24576u,65537u,69228800u,7340784u,3222406728u,3229614272u}/* 02C0 */, /*558*/{0,24576u,65537u,69863040u,688u,2148663296u,3221258240u}/* 02C2 */, /*559*/{0,24576u,65537u,69228800u,9437936u,2149189184u,3221225664u}/* 02D0 */, /*560*/{0,24576u,65537u,69887616u,688u,2148663296u,3221258240u}/* 02D7 */, /*561*/{154140672u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02D8 */, /*562*/{154664960u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02D9 */, /*563*/{155189248u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02DA */, /*564*/{155713536u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02DB */, /*565*/{156237824u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02DC */, /*566*/{156762112u,24576u,65537u,69863044u,176u,2215772160u,2147516416u}/* 02DD */, /*567*/{0,24576u,65537u,76154496u,688u,2148663296u,3221258240u}/* 02DF */, /*568*/{157286400u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02E0 */, /*569*/{157810688u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02E1 */, /*570*/{158334976u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02E2 */, /*571*/{158859264u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02E3 */, /*572*/{159383552u,24576u,131073u,69228820u,7340272u,3289515592u,2155872448u}/* 02E4 */, /*573*/{0,24576u,2293761u,76154496u,688u,2148663296u,3221258240u}/* 02EA */, /*574*/{0,24576u,65537u,76175616u,9437936u,2148664896u,3221225664u}/* 02EC */, /*575*/{0,24576u,65537u,75520256u,9437936u,2148664896u,3221225664u}/* 02EE */, /*576*/{0,24576u,65537u,82445952u,688u,2148663296u,3221258240u}/* 02EF */, /*577*/{0,28672u,2686976u,3425450368u,808715568u,2148598788u,3221225600u}/* 0300 */, /*578*/{0,28672u,2686976u,3425450368u,808714928u,2148598788u,3221225600u}/* 0305 */, /*579*/{0,28672u,2686976u,3492559232u,808714928u,2148598788u,3221225600u}/* 0315 */, /*580*/{0,28672u,2686976u,3089906048u,808714928u,2148598788u,3221225600u}/* 0316 */, /*581*/{0,28672u,2686976u,2955688320u,808715568u,2148598788u,3221225600u}/* 031B */, /*582*/{0,28672u,2686976u,2821470592u,808714928u,2148598788u,3221225600u}/* 0321 */, /*583*/{0,28672u,2686976u,3089906048u,808715568u,2148598788u,3221225600u}/* 0323 */, /*584*/{0,28672u,2686976u,2821470592u,808715568u,2148598788u,3221225600u}/* 0327 */, /*585*/{0,28672u,2686976u,137116032u,808714928u,2148598788u,3221225600u}/* 0334 */, /*586*/{0,28672u,2686976u,137116032u,808715568u,2148598788u,3221225600u}/* 0338 */, /*587*/{159907840u,28672u,2686976u,3425450370u,808714288u,2215969796u,128u}/* 0340 */, /*588*/{160432128u,28672u,2686976u,3425450370u,808714288u,2215969796u,128u}/* 0341 */, /*589*/{160956416u,28672u,2686976u,3425450370u,808714288u,2215969796u,128u}/* 0343 */, /*590*/{161480704u,28672u,2686976u,3425450370u,808714288u,2215969796u,128u}/* 0344 */, /*591*/{59520u,478179328u,2686976u,3693885824u,808715633u,4145087500u,3498049664u}/* 0345 */, /*592*/{0,28672u,2686976u,3431741824u,808714928u,2148598788u,3221225600u}/* 0346 */, /*593*/{0,28672u,2686976u,3096197504u,808714928u,2148598788u,3221225600u}/* 0347 */, /*594*/{0,28672u,2686976u,80492928u,1345585840u,2218853380u,3355443328u}/* 034F */, /*595*/{0,28672u,2686976u,3438033280u,808714928u,2148598788u,3221225600u}/* 0350 */, /*596*/{0,28672u,2686976u,3102488960u,808714928u,2148598788u,3221225600u}/* 0353 */, /*597*/{0,28672u,2686976u,3507239296u,808714928u,2147550212u,3221225600u}/* 0358 */, /*598*/{0,28672u,2686976u,3104586112u,808714928u,2147550212u,3221225600u}/* 0359 */, /*599*/{0,28672u,2686976u,3440130432u,808714928u,2147550212u,3221225600u}/* 035B */, /*600*/{0,28672u,2686976u,3574348160u,1345585840u,2147550212u,3221225600u}/* 035C */, /*601*/{0,28672u,2686976u,3639359872u,1345585840u,2148598788u,3221225600u}/* 035D */, /*602*/{0,28672u,2686976u,3572251008u,1345585840u,2148598788u,3221225600u}/* 035F */, /*603*/{0,28672u,2686976u,3626776960u,1345585840u,2148598788u,3221225600u}/* 0360 */, /*604*/{0,28672u,2686976u,3565959552u,1345585840u,2148598788u,3221225600u}/* 0362 */, /*605*/{0,28672u,2686976u,3435936128u,808714928u,2147550212u,3221225600u}/* 0363 */, /*606*/{59648u,480280576u,196609u,88102976u,8389361u,2080507488u,3221226688u}/* 0370 */, /*607*/{59776u,32768u,196609u,88103040u,7340784u,1392641640u,3221225664u}/* 0371 */, /*608*/{59904u,482377728u,196609u,88102976u,8389361u,2080507488u,3221226688u}/* 0372 */, /*609*/{60032u,32768u,196609u,88103040u,7340784u,1392641640u,3221225664u}/* 0373 */, /*610*/{162004992u,32768u,65536u,69884162u,9437296u,2216035904u,192u}/* 0374 */, /*611*/{0,32768u,196609u,69863040u,688u,2148663296u,3221258240u}/* 0375 */, /*612*/{60160u,484474880u,196609u,88102976u,8389361u,2080507488u,3221226688u}/* 0376 */, /*613*/{60288u,32768u,196609u,88103040u,7340784u,1392641640u,3221225664u}/* 0377 */, /*614*/{162529280u,32768u,196609u,69228804u,7340272u,3289515592u,2155872256u}/* 037A */, /*615*/{60416u,32768u,196609u,86005888u,7340784u,1392641640u,3221225664u}/* 037B */, /*616*/{60544u,32768u,196609u,86005888u,7340784u,1392641640u,3221225664u}/* 037C */, /*617*/{60672u,32768u,196609u,86005888u,7340784u,1392641640u,3221225664u}/* 037D */, /*618*/{163053568u,32768u,65536u,69889474u,48u,67502080u,1052672u}/* 037E */, /*619*/{60800u,486572032u,196609u,100685888u,8389361u,2080507488u,3221226688u}/* 037F */, /*620*/{163577856u,32768u,196609u,69863044u,176u,2215772160u,2147516416u}/* 0384 */, /*621*/{164102144u,32768u,65537u,69863042u,176u,2215772160u,32768u}/* 0385 */, /*622*/{164687360u,488669184u,196609u,69228610u,8389361u,2080507488u,1216u}/* 0386 */, /*623*/{165150720u,32768u,65536u,69887426u,48u,2214986752u,34607232u}/* 0387 */, /*624*/{165736064u,490766336u,196609u,69228610u,8389361u,2080507488u,1216u}/* 0388 */, /*625*/{166260480u,492863488u,196609u,69228610u,8389361u,2080507488u,1216u}/* 0389 */, /*626*/{166784896u,494960640u,196609u,69228610u,8389361u,2080507488u,1216u}/* 038A */, /*627*/{167309312u,497057792u,196609u,69228610u,8389361u,2080507488u,1216u}/* 038C */, /*628*/{167833728u,499154944u,196609u,69228610u,8389361u,2080507488u,1216u}/* 038E */, /*629*/{168358144u,501252096u,196609u,69228610u,8389361u,2080507488u,1216u}/* 038F */, /*630*/{168820753u,10518528u,196609u,69228674u,7340784u,1392641640u,192u}/* 0390 */, /*631*/{61824u,503349248u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0391 */, /*632*/{61952u,505446400u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0392 */, /*633*/{62080u,507543552u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0393 */, /*634*/{62208u,509640704u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0394 */, /*635*/{62336u,511737856u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0395 */, /*636*/{62464u,513835008u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0396 */, /*637*/{62592u,515932160u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0397 */, /*638*/{62720u,518029312u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0398 */, /*639*/{62848u,520126464u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 0399 */, /*640*/{62976u,522223616u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039A */, /*641*/{63104u,524320768u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039B */, /*642*/{63232u,526417920u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039C */, /*643*/{63360u,528515072u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039D */, /*644*/{63488u,530612224u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039E */, /*645*/{63616u,532709376u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 039F */, /*646*/{63744u,534806528u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A0 */, /*647*/{63872u,536903680u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A1 */, /*648*/{64000u,539000832u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A3 */, /*649*/{64128u,541097984u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A4 */, /*650*/{64256u,543195136u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A5 */, /*651*/{64384u,545292288u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A6 */, /*652*/{64512u,547389440u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A7 */, /*653*/{64640u,549486592u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A8 */, /*654*/{64768u,551583744u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03A9 */, /*655*/{169409920u,553680896u,196609u,69228610u,8389361u,2080507488u,1216u}/* 03AA */, /*656*/{169934336u,555778048u,196609u,69228610u,8389361u,2080507488u,1216u}/* 03AB */, /*657*/{170458752u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03AC */, /*658*/{170983168u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03AD */, /*659*/{171507584u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03AE */, /*660*/{172032000u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03AF */, /*661*/{172490770u,12615680u,196609u,69228674u,7340784u,1392641640u,192u}/* 03B0 */, /*662*/{65664u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B1 */, /*663*/{65792u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B2 */, /*664*/{65920u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B3 */, /*665*/{66048u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B4 */, /*666*/{66176u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B5 */, /*667*/{66304u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B6 */, /*668*/{66432u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B7 */, /*669*/{66560u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B8 */, /*670*/{66688u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03B9 */, /*671*/{66816u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BA */, /*672*/{66944u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BB */, /*673*/{67072u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BC */, /*674*/{67200u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BD */, /*675*/{67328u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BE */, /*676*/{67456u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03BF */, /*677*/{67584u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C0 */, /*678*/{67712u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C1 */, /*679*/{67840u,557875200u,196609u,69228672u,7340785u,1996621416u,3221225664u}/* 03C2 */, /*680*/{67968u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C3 */, /*681*/{68096u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C4 */, /*682*/{68224u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C5 */, /*683*/{68352u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C6 */, /*684*/{68480u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C7 */, /*685*/{68608u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C8 */, /*686*/{68736u,32768u,196609u,69228672u,7340784u,1392641640u,3221225664u}/* 03C9 */, /*687*/{173083904u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03CA */, /*688*/{173608320u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03CB */, /*689*/{174132736u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03CC */, /*690*/{174657152u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03CD */, /*691*/{175181568u,32768u,196609u,69228674u,7340784u,1392641640u,192u}/* 03CE */, /*692*/{69504u,559972352u,196609u,88102976u,8389361u,2080507488u,3221226688u}/* 03CF */, /*693*/{175706112u,562069504u,196609u,69228676u,7340273u,1996621418u,2151678144u}/* 03D0 */, /*694*/{176230528u,564166656u,196609u,69228676u,7340273u,1996621418u,2151678144u}/* 03D1 */, /*695*/{176685056u,32768u,196609u,69228612u,8388848u,1140983394u,2151679168u}/* 03D2 */, /*696*/{177209344u,32768u,196609u,69228610u,8388848u,1140983392u,1216u}/* 03D3 */, /*697*/{177733632u,32768u,196609u,69228610u,8388848u,1140983392u,1216u}/* 03D4 */, /*698*/{178327808u,566263808u,196609u,69228676u,7340273u,1996621418u,2151678144u}/* 03D5 */, /*699*/{178852224u,568360960u,196609u,69228676u,7340273u,1996621416u,2147483840u}/* 03D6 */, /*700*/{70144u,32768u,196609u,75520128u,7340784u,1392641640u,3221225664u}/* 03D7 */, /*701*/{70272u,570458112u,196609u,79714368u,8389361u,2080507488u,3221226688u}/* 03D8 */, /*702*/{70400u,32768u,196609u,79714432u,7340784u,1392641640u,3221225664u}/* 03D9 */, /*703*/{70528u,572555264u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03DA */, /*704*/{70656u,32768u,196609u,75520128u,7340784u,1392641640u,3221225664u}/* 03DB */, /*705*/{70784u,574652416u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03DC */, /*706*/{70912u,32768u,196609u,75520128u,7340784u,1392641640u,3221225664u}/* 03DD */, /*707*/{71040u,576749568u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03DE */, /*708*/{71168u,32768u,196609u,75520128u,7340784u,1392641640u,3221225664u}/* 03DF */, /*709*/{71296u,578846720u,196609u,69228608u,8389361u,2080507488u,3221226688u}/* 03E0 */, /*710*/{71424u,32768u,196609u,75520128u,7340784u,1392641640u,3221225664u}/* 03E1 */, /*711*/{71552u,580943872u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03E2 */, /*712*/{71680u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03E3 */, /*713*/{71808u,583041024u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03E4 */, /*714*/{71936u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03E5 */, /*715*/{72064u,585138176u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03E6 */, /*716*/{72192u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03E7 */, /*717*/{72320u,587235328u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03E8 */, /*718*/{72448u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03E9 */, /*719*/{72576u,589332480u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03EA */, /*720*/{72704u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03EB */, /*721*/{72832u,591429632u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03EC */, /*722*/{72960u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03ED */, /*723*/{73088u,593526784u,3604481u,69228608u,8389361u,2080507488u,3221226688u}/* 03EE */, /*724*/{73216u,32768u,3604481u,69228672u,7340784u,1392641640u,3221225664u}/* 03EF */, /*725*/{179379840u,595623936u,196609u,69228676u,7340273u,1996621418u,2151678144u}/* 03F0 */, /*726*/{179904256u,597721088u,196609u,69228676u,7340273u,1996621418u,2151678144u}/* 03F1 */, /*727*/{180428672u,32768u,196609u,69228676u,7340272u,1459750504u,2147483840u}/* 03F2 */, /*728*/{73728u,32768u,196609u,69228672u,7340784u,1392641640u,3221233856u}/* 03F3 */, /*729*/{180953216u,599818240u,196609u,77617220u,8388849u,2080507490u,2151679168u}/* 03F4 */, /*730*/{181477632u,601915392u,196609u,77617284u,7340273u,1996621418u,2151678144u}/* 03F5 */, /*731*/{0,32768u,196609u,80348672u,688u,131074u,3221258240u}/* 03F6 */, /*732*/{74112u,604012544u,196609u,81811520u,8389361u,2080507488u,3221226688u}/* 03F7 */, /*733*/{74240u,32768u,196609u,81811584u,7340784u,1392641640u,3221225664u}/* 03F8 */, /*734*/{182002304u,606109696u,196609u,81811524u,8388849u,2080507488u,2147484864u}/* 03F9 */, /*735*/{74496u,608206848u,196609u,81811520u,8389361u,2080507488u,3221226688u}/* 03FA */, /*736*/{74624u,32768u,196609u,81811584u,7340784u,1392641640u,3221225664u}/* 03FB */, /*737*/{0,32768u,196609u,83908736u,7340784u,1073874536u,3221225664u}/* 03FC */, /*738*/{74752u,610304000u,196609u,83908672u,8389361u,2080507488u,3221226688u}/* 03FD */, /*739*/{74880u,612401152u,196609u,83908672u,8389361u,2080507488u,3221226688u}/* 03FE */, /*740*/{75008u,614498304u,196609u,83908672u,8389361u,2080507488u,3221226688u}/* 03FF */, /*741*/{182527360u,616599552u,262145u,75520066u,8389361u,2080507488u,1216u}/* 0400 */, /*742*/{183051776u,618696704u,262145u,69228610u,8389361u,2080507488u,1216u}/* 0401 */, /*743*/{75392u,620793856u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0402 */, /*744*/{183576320u,622891008u,262145u,69228610u,8389361u,2080507488u,1216u}/* 0403 */, /*745*/{75648u,624988160u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0404 */, /*746*/{75776u,627085312u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0405 */, /*747*/{75904u,629182464u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0406 */, /*748*/{184101120u,631279616u,262145u,69228610u,8389361u,2080507488u,1216u}/* 0407 */, /*749*/{76160u,633376768u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0408 */, /*750*/{76288u,635473920u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0409 */, /*751*/{76416u,637571072u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 040A */, /*752*/{76544u,639668224u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 040B */, /*753*/{184626048u,641765376u,262145u,69228610u,8389361u,2080507488u,1216u}/* 040C */, /*754*/{185150464u,643862528u,262145u,75520066u,8389361u,2080507488u,1216u}/* 040D */, /*755*/{185674880u,645959680u,262145u,69228610u,8389361u,2080507488u,1216u}/* 040E */, /*756*/{77056u,648056832u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 040F */, /*757*/{77184u,650153984u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0410 */, /*758*/{77312u,652251136u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0411 */, /*759*/{77440u,654348288u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0412 */, /*760*/{77568u,656445440u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0413 */, /*761*/{77696u,658542592u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0414 */, /*762*/{77824u,660639744u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0415 */, /*763*/{77952u,662736896u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0416 */, /*764*/{78080u,664834048u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0417 */, /*765*/{78208u,666931200u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0418 */, /*766*/{186200576u,669028352u,262145u,69228610u,8389361u,2080507488u,1216u}/* 0419 */, /*767*/{78464u,671125504u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041A */, /*768*/{78592u,673222656u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041B */, /*769*/{78720u,675319808u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041C */, /*770*/{78848u,677416960u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041D */, /*771*/{78976u,679514112u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041E */, /*772*/{79104u,681611264u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 041F */, /*773*/{79232u,683708416u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0420 */, /*774*/{79360u,685805568u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0421 */, /*775*/{79488u,687902720u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0422 */, /*776*/{79616u,689999872u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0423 */, /*777*/{79744u,692097024u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0424 */, /*778*/{79872u,694194176u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0425 */, /*779*/{80000u,696291328u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0426 */, /*780*/{80128u,698388480u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0427 */, /*781*/{80256u,700485632u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0428 */, /*782*/{80384u,702582784u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0429 */, /*783*/{80512u,704679936u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042A */, /*784*/{80640u,706777088u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042B */, /*785*/{80768u,708874240u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042C */, /*786*/{80896u,710971392u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042D */, /*787*/{81024u,713068544u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042E */, /*788*/{81152u,715165696u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 042F */, /*789*/{81280u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0430 */, /*790*/{81408u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0431 */, /*791*/{81536u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0432 */, /*792*/{81664u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0433 */, /*793*/{81792u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0434 */, /*794*/{81920u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0435 */, /*795*/{82048u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0436 */, /*796*/{82176u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0437 */, /*797*/{82304u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0438 */, /*798*/{186728960u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 0439 */, /*799*/{82560u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043A */, /*800*/{82688u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043B */, /*801*/{82816u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043C */, /*802*/{82944u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043D */, /*803*/{83072u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043E */, /*804*/{83200u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 043F */, /*805*/{83328u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0440 */, /*806*/{83456u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0441 */, /*807*/{83584u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0442 */, /*808*/{83712u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0443 */, /*809*/{83840u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0444 */, /*810*/{83968u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0445 */, /*811*/{84096u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0446 */, /*812*/{84224u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0447 */, /*813*/{84352u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0448 */, /*814*/{84480u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0449 */, /*815*/{84608u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044A */, /*816*/{84736u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044B */, /*817*/{84864u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044C */, /*818*/{84992u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044D */, /*819*/{85120u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044E */, /*820*/{85248u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 044F */, /*821*/{187256192u,36864u,262145u,75520130u,7340784u,1392641640u,192u}/* 0450 */, /*822*/{187780608u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 0451 */, /*823*/{85632u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0452 */, /*824*/{188305152u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 0453 */, /*825*/{85888u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0454 */, /*826*/{86016u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0455 */, /*827*/{86144u,36864u,262145u,69228672u,7340784u,1392641640u,3221233856u}/* 0456 */, /*828*/{188829952u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 0457 */, /*829*/{86400u,36864u,262145u,69228672u,7340784u,1392641640u,3221233856u}/* 0458 */, /*830*/{86528u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0459 */, /*831*/{86656u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 045A */, /*832*/{86784u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 045B */, /*833*/{189354880u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 045C */, /*834*/{189879296u,36864u,262145u,75520130u,7340784u,1392641640u,192u}/* 045D */, /*835*/{190403712u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 045E */, /*836*/{87296u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 045F */, /*837*/{87424u,717262848u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0460 */, /*838*/{87552u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0461 */, /*839*/{87680u,719360000u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0462 */, /*840*/{87808u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0463 */, /*841*/{87936u,721457152u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0464 */, /*842*/{88064u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0465 */, /*843*/{88192u,723554304u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0466 */, /*844*/{88320u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0467 */, /*845*/{88448u,725651456u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0468 */, /*846*/{88576u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0469 */, /*847*/{88704u,727748608u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 046A */, /*848*/{88832u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 046B */, /*849*/{88960u,729845760u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 046C */, /*850*/{89088u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 046D */, /*851*/{89216u,731942912u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 046E */, /*852*/{89344u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 046F */, /*853*/{89472u,734040064u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0470 */, /*854*/{89600u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0471 */, /*855*/{89728u,736137216u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0472 */, /*856*/{89856u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0473 */, /*857*/{89984u,738234368u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0474 */, /*858*/{90112u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0475 */, /*859*/{190931072u,740331520u,262145u,69228610u,8389361u,2080507488u,1216u}/* 0476 */, /*860*/{191455488u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 0477 */, /*861*/{90496u,742428672u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0478 */, /*862*/{90624u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0479 */, /*863*/{90752u,744525824u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 047A */, /*864*/{90880u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 047B */, /*865*/{91008u,746622976u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 047C */, /*866*/{91136u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 047D */, /*867*/{91264u,748720128u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 047E */, /*868*/{91392u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 047F */, /*869*/{91520u,750817280u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0480 */, /*870*/{91648u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0481 */, /*871*/{0,36864u,262145u,69207744u,688u,131072u,3221258240u}/* 0482 */, /*872*/{0,36864u,262144u,3425450368u,808714928u,2148598788u,3221225600u}/* 0483 */, /*873*/{0,36864u,2686976u,3425450368u,808714928u,2148598788u,3221225600u}/* 0485 */, /*874*/{0,36864u,262144u,3444324736u,808714928u,2148598788u,3221225600u}/* 0487 */, /*875*/{0,36864u,262144u,76298688u,808714928u,2147549188u,3221225472u}/* 0488 */, /*876*/{91776u,752914432u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 048A */, /*877*/{91904u,36864u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 048B */, /*878*/{92032u,755011584u,262145u,75520064u,8389361u,2080507488u,3221226688u}/* 048C */, /*879*/{92160u,36864u,262145u,75520128u,7340784u,1392641640u,3221225664u}/* 048D */, /*880*/{92288u,757108736u,262145u,75520064u,8389361u,2080507488u,3221226688u}/* 048E */, /*881*/{92416u,36864u,262145u,75520128u,7340784u,1392641640u,3221225664u}/* 048F */, /*882*/{92544u,759205888u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0490 */, /*883*/{92672u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0491 */, /*884*/{92800u,761303040u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0492 */, /*885*/{92928u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0493 */, /*886*/{93056u,763400192u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0494 */, /*887*/{93184u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0495 */, /*888*/{93312u,765497344u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0496 */, /*889*/{93440u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0497 */, /*890*/{93568u,767594496u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 0498 */, /*891*/{93696u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 0499 */, /*892*/{93824u,769691648u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 049A */, /*893*/{93952u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 049B */, /*894*/{94080u,771788800u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 049C */, /*895*/{94208u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 049D */, /*896*/{94336u,773885952u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 049E */, /*897*/{94464u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 049F */, /*898*/{94592u,775983104u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04A0 */, /*899*/{94720u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04A1 */, /*900*/{94848u,778080256u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04A2 */, /*901*/{94976u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04A3 */, /*902*/{95104u,780177408u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04A4 */, /*903*/{95232u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04A5 */, /*904*/{95360u,782274560u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04A6 */, /*905*/{95488u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04A7 */, /*906*/{95616u,784371712u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04A8 */, /*907*/{95744u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04A9 */, /*908*/{95872u,786468864u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04AA */, /*909*/{96000u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04AB */, /*910*/{96128u,788566016u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04AC */, /*911*/{96256u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04AD */, /*912*/{96384u,790663168u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04AE */, /*913*/{96512u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04AF */, /*914*/{96640u,792760320u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04B0 */, /*915*/{96768u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04B1 */, /*916*/{96896u,794857472u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04B2 */, /*917*/{97024u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04B3 */, /*918*/{97152u,796954624u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04B4 */, /*919*/{97280u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04B5 */, /*920*/{97408u,799051776u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04B6 */, /*921*/{97536u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04B7 */, /*922*/{97664u,801148928u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04B8 */, /*923*/{97792u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04B9 */, /*924*/{97920u,803246080u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04BA */, /*925*/{98048u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04BB */, /*926*/{98176u,805343232u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04BC */, /*927*/{98304u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04BD */, /*928*/{98432u,807440384u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04BE */, /*929*/{98560u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04BF */, /*930*/{98688u,809537536u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04C0 */, /*931*/{191988224u,811634688u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04C1 */, /*932*/{192512640u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04C2 */, /*933*/{99072u,813731840u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04C3 */, /*934*/{99200u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04C4 */, /*935*/{99328u,815828992u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 04C5 */, /*936*/{99456u,36864u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 04C6 */, /*937*/{99584u,817926144u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04C7 */, /*938*/{99712u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04C8 */, /*939*/{99840u,820023296u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 04C9 */, /*940*/{99968u,36864u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 04CA */, /*941*/{100096u,822120448u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04CB */, /*942*/{100224u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04CC */, /*943*/{100352u,824217600u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 04CD */, /*944*/{100480u,36864u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 04CE */, /*945*/{100608u,36864u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 04CF */, /*946*/{193038720u,826314752u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04D0 */, /*947*/{193563136u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04D1 */, /*948*/{194087552u,828411904u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04D2 */, /*949*/{194611968u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04D3 */, /*950*/{101248u,830509056u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04D4 */, /*951*/{101376u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04D5 */, /*952*/{195136640u,832606208u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04D6 */, /*953*/{195661056u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04D7 */, /*954*/{101760u,834703360u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04D8 */, /*955*/{101888u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04D9 */, /*956*/{196185728u,836800512u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04DA */, /*957*/{196710144u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04DB */, /*958*/{197234560u,838897664u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04DC */, /*959*/{197758976u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04DD */, /*960*/{198283392u,840994816u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04DE */, /*961*/{198807808u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04DF */, /*962*/{102784u,843091968u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04E0 */, /*963*/{102912u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04E1 */, /*964*/{199332480u,845189120u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04E2 */, /*965*/{199856896u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04E3 */, /*966*/{200381312u,847286272u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04E4 */, /*967*/{200905728u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04E5 */, /*968*/{201430144u,849383424u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04E6 */, /*969*/{201954560u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04E7 */, /*970*/{103808u,851480576u,262145u,69228608u,8389361u,2080507488u,3221226688u}/* 04E8 */, /*971*/{103936u,36864u,262145u,69228672u,7340784u,1392641640u,3221225664u}/* 04E9 */, /*972*/{202479232u,853577728u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04EA */, /*973*/{203003648u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04EB */, /*974*/{203528064u,855674880u,262145u,75520066u,8389361u,2080507488u,1216u}/* 04EC */, /*975*/{204052480u,36864u,262145u,75520130u,7340784u,1392641640u,192u}/* 04ED */, /*976*/{204576896u,857772032u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04EE */, /*977*/{205101312u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04EF */, /*978*/{205625728u,859869184u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04F0 */, /*979*/{206150144u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04F1 */, /*980*/{206674560u,861966336u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04F2 */, /*981*/{207198976u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04F3 */, /*982*/{207723392u,864063488u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04F4 */, /*983*/{208247808u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04F5 */, /*984*/{105600u,866160640u,262145u,83908672u,8389361u,2080507488u,3221226688u}/* 04F6 */, /*985*/{105728u,36864u,262145u,83908736u,7340784u,1392641640u,3221225664u}/* 04F7 */, /*986*/{208772480u,868257792u,262145u,69228610u,8389361u,2080507488u,1216u}/* 04F8 */, /*987*/{209296896u,36864u,262145u,69228674u,7340784u,1392641640u,192u}/* 04F9 */, /*988*/{106112u,870354944u,262145u,86005824u,8389361u,2080507488u,3221226688u}/* 04FA */, /*989*/{106240u,36864u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 04FB */, /*990*/{106368u,872452096u,262145u,86005824u,8389361u,2080507488u,3221226688u}/* 04FC */, /*991*/{106496u,36864u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 04FD */, /*992*/{106624u,874549248u,262145u,86005824u,8389361u,2080507488u,3221226688u}/* 04FE */, /*993*/{106752u,36864u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 04FF */, /*994*/{106880u,876650496u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 0500 */, /*995*/{107008u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 0501 */, /*996*/{107136u,878747648u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 0502 */, /*997*/{107264u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 0503 */, /*998*/{107392u,880844800u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 0504 */, /*999*/{107520u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 0505 */, /*1000*/{107648u,882941952u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 0506 */, /*1001*/{107776u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 0507 */, /*1002*/{107904u,885039104u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 0508 */, /*1003*/{108032u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 0509 */, /*1004*/{108160u,887136256u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 050A */, /*1005*/{108288u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 050B */, /*1006*/{108416u,889233408u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 050C */, /*1007*/{108544u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 050D */, /*1008*/{108672u,891330560u,262145u,79714368u,8389361u,2080507488u,3221226688u}/* 050E */, /*1009*/{108800u,40960u,262145u,79714432u,7340784u,1392641640u,3221225664u}/* 050F */, /*1010*/{108928u,893427712u,262145u,86005824u,8389361u,2080507488u,3221226688u}/* 0510 */, /*1011*/{109056u,40960u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 0511 */, /*1012*/{109184u,895524864u,262145u,86005824u,8389361u,2080507488u,3221226688u}/* 0512 */, /*1013*/{109312u,40960u,262145u,86005888u,7340784u,1392641640u,3221225664u}/* 0513 */, /*1014*/{109440u,897622016u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 0514 */, /*1015*/{109568u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 0515 */, /*1016*/{109696u,899719168u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 0516 */, /*1017*/{109824u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 0517 */, /*1018*/{109952u,901816320u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 0518 */, /*1019*/{110080u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 0519 */, /*1020*/{110208u,903913472u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 051A */, /*1021*/{110336u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 051B */, /*1022*/{110464u,906010624u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 051C */, /*1023*/{110592u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 051D */, /*1024*/{110720u,908107776u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 051E */, /*1025*/{110848u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 051F */, /*1026*/{110976u,910204928u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 0520 */, /*1027*/{111104u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 0521 */, /*1028*/{111232u,912302080u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* 0522 */, /*1029*/{111360u,40960u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* 0523 */, /*1030*/{111488u,914399232u,262145u,90200128u,8389361u,2080507488u,3221226688u}/* 0524 */, /*1031*/{111616u,40960u,262145u,90200192u,7340784u,1392641640u,3221225664u}/* 0525 */, /*1032*/{111744u,916496384u,262145u,92297280u,8389361u,2080507488u,3221226688u}/* 0526 */, /*1033*/{111872u,40960u,262145u,92297344u,7340784u,1392641640u,3221225664u}/* 0527 */, /*1034*/{112000u,918593536u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* 0528 */, /*1035*/{112128u,40960u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* 0529 */, /*1036*/{112256u,920690688u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* 052A */, /*1037*/{112384u,40960u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* 052B */, /*1038*/{112512u,922787840u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* 052C */, /*1039*/{112640u,40960u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* 052D */, /*1040*/{112768u,924884992u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* 052E */, /*1041*/{112896u,40960u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* 052F */, /*1042*/{113024u,926986240u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0531 */, /*1043*/{113152u,929083392u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0532 */, /*1044*/{113280u,931180544u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0533 */, /*1045*/{113408u,933277696u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0534 */, /*1046*/{113536u,935374848u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0535 */, /*1047*/{113664u,937472000u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0536 */, /*1048*/{113792u,939569152u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0537 */, /*1049*/{113920u,941666304u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0538 */, /*1050*/{114048u,943763456u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0539 */, /*1051*/{114176u,945860608u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053A */, /*1052*/{114304u,947957760u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053B */, /*1053*/{114432u,950054912u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053C */, /*1054*/{114560u,952152064u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053D */, /*1055*/{114688u,954249216u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053E */, /*1056*/{114816u,956346368u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 053F */, /*1057*/{114944u,958443520u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0540 */, /*1058*/{115072u,960540672u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0541 */, /*1059*/{115200u,962637824u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0542 */, /*1060*/{115328u,964734976u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0543 */, /*1061*/{115456u,966832128u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0544 */, /*1062*/{115584u,968929280u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0545 */, /*1063*/{115712u,971026432u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0546 */, /*1064*/{115840u,973123584u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0547 */, /*1065*/{115968u,975220736u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0548 */, /*1066*/{116096u,977317888u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0549 */, /*1067*/{116224u,979415040u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054A */, /*1068*/{116352u,981512192u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054B */, /*1069*/{116480u,983609344u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054C */, /*1070*/{116608u,985706496u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054D */, /*1071*/{116736u,987803648u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054E */, /*1072*/{116864u,989900800u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 054F */, /*1073*/{116992u,991997952u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0550 */, /*1074*/{117120u,994095104u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0551 */, /*1075*/{117248u,996192256u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0552 */, /*1076*/{117376u,998289408u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0553 */, /*1077*/{117504u,1000386560u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0554 */, /*1078*/{117632u,1002483712u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0555 */, /*1079*/{117760u,1004580864u,327681u,69228608u,8389361u,2080507488u,3221226688u}/* 0556 */, /*1080*/{0,45056u,327681u,69228800u,9437936u,2148664896u,3221225664u}/* 0559 */, /*1081*/{0,45056u,327681u,69207488u,688u,131072u,3222274048u}/* 055A */, /*1082*/{0,45056u,327681u,69207488u,14680752u,131072u,3222274048u}/* 055D */, /*1083*/{117888u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0561 */, /*1084*/{118016u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0562 */, /*1085*/{118144u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0563 */, /*1086*/{118272u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0564 */, /*1087*/{118400u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0565 */, /*1088*/{118528u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0566 */, /*1089*/{118656u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0567 */, /*1090*/{118784u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0568 */, /*1091*/{118912u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0569 */, /*1092*/{119040u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056A */, /*1093*/{119168u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056B */, /*1094*/{119296u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056C */, /*1095*/{119424u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056D */, /*1096*/{119552u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056E */, /*1097*/{119680u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 056F */, /*1098*/{119808u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0570 */, /*1099*/{119936u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0571 */, /*1100*/{120064u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0572 */, /*1101*/{120192u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0573 */, /*1102*/{120320u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0574 */, /*1103*/{120448u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0575 */, /*1104*/{120576u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0576 */, /*1105*/{120704u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0577 */, /*1106*/{120832u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0578 */, /*1107*/{120960u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0579 */, /*1108*/{121088u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057A */, /*1109*/{121216u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057B */, /*1110*/{121344u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057C */, /*1111*/{121472u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057D */, /*1112*/{121600u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057E */, /*1113*/{121728u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 057F */, /*1114*/{121856u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0580 */, /*1115*/{121984u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0581 */, /*1116*/{122112u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0582 */, /*1117*/{122240u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0583 */, /*1118*/{122368u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0584 */, /*1119*/{122496u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0585 */, /*1120*/{122624u,45056u,327681u,69228672u,7340784u,1392641640u,3221225664u}/* 0586 */, /*1121*/{209715210u,14725120u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* 0587 */, /*1122*/{0,45056u,65537u,69234112u,12583600u,131072u,3222294528u}/* 0589 */, /*1123*/{0,45056u,327681u,76154048u,688u,8527872u,3222274048u}/* 058A */, /*1124*/{0,45056u,327681u,101320384u,688u,131072u,3221258240u}/* 058D */, /*1125*/{0,45056u,327681u,94635584u,688u,131072u,3221258240u}/* 058F */, /*1126*/{0,49152u,393216u,3092003200u,808714928u,2148598788u,3221225600u}/* 0591 */, /*1127*/{0,49152u,393216u,3427547520u,808714928u,2148598788u,3221225600u}/* 0592 */, /*1128*/{0,49152u,393216u,3159112064u,808714928u,2148598788u,3221225600u}/* 059A */, /*1129*/{0,49152u,393216u,3104586112u,808714928u,2147550212u,3221225600u}/* 05A2 */, /*1130*/{0,49152u,393216u,3360438656u,808714928u,2148598788u,3221225600u}/* 05AE */, /*1131*/{0,49152u,393216u,405551488u,808714992u,2148598788u,3489661056u}/* 05B0 */, /*1132*/{0,49152u,393216u,472660352u,808714992u,2148598788u,3489661056u}/* 05B1 */, /*1133*/{0,49152u,393216u,539769216u,808714992u,2148598788u,3489661056u}/* 05B2 */, /*1134*/{0,49152u,393216u,606878080u,808714992u,2148598788u,3489661056u}/* 05B3 */, /*1135*/{0,49152u,393216u,673986944u,808714992u,2148598788u,3489661056u}/* 05B4 */, /*1136*/{0,49152u,393216u,741095808u,808714992u,2148598788u,3489661056u}/* 05B5 */, /*1137*/{0,49152u,393216u,808204672u,808714992u,2148598788u,3489661056u}/* 05B6 */, /*1138*/{0,49152u,393216u,875313536u,808714992u,2148598788u,3489661056u}/* 05B7 */, /*1139*/{0,49152u,393216u,942422400u,808714992u,2148598788u,3489661056u}/* 05B8 */, /*1140*/{0,49152u,393216u,1009531264u,808714992u,2148598788u,3489661056u}/* 05B9 */, /*1141*/{0,49152u,393216u,1026308480u,808714992u,2148598788u,3489661056u}/* 05BA */, /*1142*/{0,49152u,393216u,1076640128u,808714992u,2148598788u,3489661056u}/* 05BB */, /*1143*/{0,49152u,393216u,1143748992u,808714992u,2148598788u,3489661056u}/* 05BC */, /*1144*/{0,49152u,393216u,1210857856u,808714992u,2148598788u,3489661056u}/* 05BD */, /*1145*/{0,49152u,393217u,69272768u,688u,8519680u,3222274048u}/* 05BE */, /*1146*/{0,49152u,393216u,1277966720u,808714992u,2148598788u,3489661056u}/* 05BF */, /*1147*/{0,49152u,393217u,69273024u,688u,131072u,3222274048u}/* 05C0 */, /*1148*/{0,49152u,393216u,1345075584u,808714992u,2148598788u,3489661056u}/* 05C1 */, /*1149*/{0,49152u,393216u,1412184448u,808714992u,2148598788u,3489661056u}/* 05C2 */, /*1150*/{0,49152u,393217u,69273024u,688u,131072u,3222278144u}/* 05C3 */, /*1151*/{0,49152u,393216u,3427547520u,808714992u,2148598788u,3489661056u}/* 05C4 */, /*1152*/{0,49152u,393216u,3104586112u,808714992u,2147550212u,3489661056u}/* 05C5 */, /*1153*/{0,49152u,393217u,83953088u,688u,131072u,3222274048u}/* 05C6 */, /*1154*/{0,49152u,393216u,957102464u,808714992u,2147550212u,3489661056u}/* 05C7 */, /*1155*/{0,49152u,393217u,69278016u,9437936u,132672u,3221225664u}/* 05D0 */, /*1156*/{0,49152u,393217u,69295552u,9437872u,131072u,3222274048u}/* 05F3 */, /*1157*/{0,49152u,393217u,69297600u,688u,2147614720u,3222274048u}/* 05F4 */, /*1158*/{0,53248u,458753u,82136064u,5440178u,2147483648u,3221225472u}/* 0600 */, /*1159*/{0,53248u,458753u,94718976u,5440178u,2147483648u,3221225472u}/* 0604 */, /*1160*/{0,53248u,65537u,101010432u,5440178u,2147483648u,3221225472u}/* 0605 */, /*1161*/{0,53248u,458753u,88737280u,688u,131074u,3221258240u}/* 0606 */, /*1162*/{0,53248u,458753u,88933888u,688u,131074u,3221258240u}/* 0608 */, /*1163*/{0,53248u,458753u,88344000u,688u,131072u,3222274048u}/* 0609 */, /*1164*/{0,53248u,458753u,84739648u,688u,131072u,3221258240u}/* 060B */, /*1165*/{0,53248u,65537u,69627328u,14680752u,131072u,3222278144u}/* 060C */, /*1166*/{0,53248u,458753u,82668992u,14680752u,131072u,3222274048u}/* 060D */, /*1167*/{0,53248u,458753u,82446016u,688u,131072u,3221258240u}/* 060E */, /*1168*/{0,53248u,458752u,3438033280u,808714992u,2147550212u,3489661056u}/* 0610 */, /*1169*/{0,53248u,458752u,3444324736u,808714992u,2147550212u,3489661056u}/* 0616 */, /*1170*/{0,53248u,458752u,1766603136u,808714992u,2147550212u,3489661056u}/* 0618 */, /*1171*/{0,53248u,458752u,1833712000u,808714992u,2147550212u,3489661056u}/* 0619 */, /*1172*/{0,53248u,458752u,1900820864u,808714992u,2147550212u,3489661056u}/* 061A */, /*1173*/{0,53248u,65537u,70059456u,688u,131072u,3222278144u}/* 061B */, /*1174*/{0,53248u,65537u,99437568u,810746554u,2218786816u,3221225472u}/* 061C */, /*1175*/{0,53248u,458753u,84739520u,688u,131072u,3222274048u}/* 061E */, /*1176*/{0,53248u,65537u,70059456u,12583600u,131072u,3222294528u}/* 061F */, /*1177*/{0,53249u,458757u,93149504u,9437936u,132672u,3221225664u}/* 0620 */, /*1178*/{0,53248u,458753u,70080832u,9437936u,132672u,3221225664u}/* 0621 */, /*1179*/{210239488u,53250u,458761u,70080834u,9437936u,132672u,192u}/* 0622 */, /*1180*/{210763776u,53250u,458761u,70080834u,9437936u,132672u,192u}/* 0623 */, /*1181*/{211288064u,53250u,458765u,70080834u,9437936u,132672u,192u}/* 0624 */, /*1182*/{211812352u,53250u,458761u,70080834u,9437936u,132672u,192u}/* 0625 */, /*1183*/{212336640u,53249u,458757u,70080834u,9437936u,132672u,192u}/* 0626 */, /*1184*/{0,53250u,458761u,70080832u,9437936u,132672u,3221225664u}/* 0627 */, /*1185*/{0,53249u,458769u,70080832u,9437936u,132672u,3221225664u}/* 0628 */, /*1186*/{0,53250u,458773u,70080832u,9437936u,132672u,3221225664u}/* 0629 */, /*1187*/{0,53249u,458777u,70080832u,9437936u,132672u,3221225664u}/* 062C */, /*1188*/{0,53250u,458781u,70080832u,9437936u,132672u,3221225664u}/* 062F */, /*1189*/{0,53250u,458785u,70080832u,9437936u,132672u,3221225664u}/* 0631 */, /*1190*/{0,53249u,458789u,70080832u,9437936u,132672u,3221225664u}/* 0633 */, /*1191*/{0,53249u,458793u,70080832u,9437936u,132672u,3221225664u}/* 0635 */, /*1192*/{0,53249u,458797u,70080832u,9437936u,132672u,3221225664u}/* 0637 */, /*1193*/{0,53249u,458801u,70080832u,9437936u,132672u,3221225664u}/* 0639 */, /*1194*/{0,53249u,458805u,88955200u,9437936u,132672u,3221225664u}/* 063B */, /*1195*/{0,53249u,458809u,88955200u,9437936u,132672u,3221225664u}/* 063D */, /*1196*/{0,53251u,65537u,70080768u,9437936u,2148140608u,3221225664u}/* 0640 */, /*1197*/{0,53249u,458813u,70080832u,9437936u,132672u,3221225664u}/* 0641 */, /*1198*/{0,53249u,458817u,70080832u,9437936u,132672u,3221225664u}/* 0642 */, /*1199*/{0,53249u,458821u,70080832u,9437936u,132672u,3221225664u}/* 0643 */, /*1200*/{0,53249u,458825u,70080832u,9437936u,132672u,3221225664u}/* 0644 */, /*1201*/{0,53249u,458829u,70080832u,9437936u,132672u,3221225664u}/* 0645 */, /*1202*/{0,53249u,458833u,70080832u,9437936u,132672u,3221225664u}/* 0646 */, /*1203*/{0,53249u,458837u,70080832u,9437936u,132672u,3221225664u}/* 0647 */, /*1204*/{0,53250u,458765u,70080832u,9437936u,132672u,3221225664u}/* 0648 */, /*1205*/{0,53249u,458757u,70080832u,9437936u,132672u,3221225664u}/* 0649 */, /*1206*/{0,53248u,2686976u,1546402176u,808714992u,2148598788u,3489661056u}/* 064B */, /*1207*/{0,53248u,2686976u,1613511040u,808714992u,2148598788u,3489661056u}/* 064C */, /*1208*/{0,53248u,2686976u,1680619904u,808714992u,2148598788u,3489661056u}/* 064D */, /*1209*/{0,53248u,2686976u,1747728768u,808714992u,2148598788u,3489661056u}/* 064E */, /*1210*/{0,53248u,2686976u,1814837632u,808714992u,2148598788u,3489661056u}/* 064F */, /*1211*/{0,53248u,2686976u,1881946496u,808714992u,2148598788u,3489661056u}/* 0650 */, /*1212*/{0,53248u,2686976u,1949055360u,808714992u,2148598788u,3489661056u}/* 0651 */, /*1213*/{0,53248u,2686976u,2016164224u,808714992u,2148598788u,3489661056u}/* 0652 */, /*1214*/{0,53248u,2686976u,3431741824u,808715632u,2147550212u,3489661056u}/* 0653 */, /*1215*/{0,53248u,2686976u,3096197504u,808715632u,2147550212u,3489661056u}/* 0655 */, /*1216*/{0,53248u,458752u,3102488960u,808714992u,2147550212u,3489661056u}/* 0656 */, /*1217*/{0,53248u,458752u,3438033280u,808714992u,2148598788u,3489661056u}/* 0657 */, /*1218*/{0,53248u,458752u,3438033280u,808714928u,2148598788u,3221225600u}/* 0658 */, /*1219*/{0,53248u,458752u,3440130432u,808714992u,2147550212u,3489661056u}/* 0659 */, /*1220*/{0,53248u,458752u,3104586112u,808714992u,2147550212u,3489661056u}/* 065C */, /*1221*/{0,53248u,458752u,3112974720u,808714992u,2147550212u,3489661056u}/* 065F */, /*1222*/{0,53248u,34014209u,69564992u,44047024u,132097u,3221225600u}/* 0660 */, /*1223*/{0,53248u,453445121u,69564992u,44047024u,132097u,3221225600u}/* 0661 */, /*1224*/{0,53248u,487000577u,69564992u,44047024u,132097u,3221225600u}/* 0662 */, /*1225*/{0,53248u,520554497u,69564992u,44047024u,132097u,3221225600u}/* 0663 */, /*1226*/{0,53248u,554110977u,69564992u,44047024u,132097u,3221225600u}/* 0664 */, /*1227*/{0,53248u,587664385u,69564992u,44047024u,132097u,3221225600u}/* 0665 */, /*1228*/{0,53248u,621221377u,69564992u,44047024u,132097u,3221225600u}/* 0666 */, /*1229*/{0,53248u,654773761u,69564992u,44047024u,132097u,3221225600u}/* 0667 */, /*1230*/{0,53248u,688331777u,69564992u,44047024u,132097u,3221225600u}/* 0668 */, /*1231*/{0,53248u,721884161u,69564992u,44047024u,132097u,3221225600u}/* 0669 */, /*1232*/{0,53248u,458753u,69469632u,688u,131072u,3222274048u}/* 066A */, /*1233*/{0,53248u,458753u,69565888u,10486448u,131072u,3222274048u}/* 066B */, /*1234*/{0,53248u,458753u,69561792u,10486448u,131072u,3222274048u}/* 066C */, /*1235*/{0,53248u,458753u,70059456u,688u,131072u,3222274048u}/* 066D */, /*1236*/{0,53249u,458769u,80566592u,9437936u,132672u,3221225664u}/* 066E */, /*1237*/{0,53249u,458817u,80566592u,9437936u,132672u,3221225664u}/* 066F */, /*1238*/{0,53248u,2686976u,2083273088u,808714992u,2147550212u,3489661056u}/* 0670 */, /*1239*/{0,53250u,458761u,70080832u,9437936u,2229824u,3221225664u}/* 0673 */, /*1240*/{212860928u,53250u,458761u,70080836u,9437424u,67241536u,2147483840u}/* 0675 */, /*1241*/{213385216u,53250u,458765u,70080836u,9437424u,67241536u,2147483840u}/* 0676 */, /*1242*/{213909504u,53250u,458765u,70080836u,9437424u,67241536u,2147483840u}/* 0677 */, /*1243*/{214433792u,53249u,458757u,70080836u,9437424u,67241536u,2147483840u}/* 0678 */, /*1244*/{0,53249u,458805u,70080832u,9437936u,132672u,3221225664u}/* 06A9 */, /*1245*/{0,53249u,458841u,70080832u,9437936u,132672u,3221225664u}/* 06AA */, /*1246*/{0,53249u,458825u,76372288u,9437936u,132672u,3221225664u}/* 06B8 */, /*1247*/{0,53249u,458833u,76372288u,9437936u,132672u,3221225664u}/* 06B9 */, /*1248*/{0,53249u,458845u,70080832u,9437936u,132672u,3221225664u}/* 06BD */, /*1249*/{0,53249u,458849u,70080832u,9437936u,132672u,3221225664u}/* 06BE */, /*1250*/{0,53249u,458777u,76372288u,9437936u,132672u,3221225664u}/* 06BF */, /*1251*/{214958080u,53250u,458773u,70080834u,9437936u,132672u,192u}/* 06C0 */, /*1252*/{0,53249u,458853u,70080832u,9437936u,132672u,3221225664u}/* 06C1 */, /*1253*/{215482368u,53249u,458853u,70080834u,9437936u,132672u,192u}/* 06C2 */, /*1254*/{0,53250u,458857u,70080832u,9437936u,132672u,3221225664u}/* 06C3 */, /*1255*/{0,53249u,458809u,70080832u,9437936u,132672u,3221225664u}/* 06CC */, /*1256*/{0,53250u,458861u,70080832u,9437936u,132672u,3221225664u}/* 06CD */, /*1257*/{0,53250u,458765u,76372288u,9437936u,132672u,3221225664u}/* 06CF */, /*1258*/{0,53250u,458865u,70080832u,9437936u,132672u,3221225664u}/* 06D2 */, /*1259*/{216006656u,53250u,458865u,70080834u,9437936u,132672u,192u}/* 06D3 */, /*1260*/{0,53248u,458753u,70059456u,12583600u,131072u,3222294528u}/* 06D4 */, /*1261*/{0,53248u,458752u,3425450368u,808714992u,2147550212u,3489661056u}/* 06D6 */, /*1262*/{0,53248u,65537u,69553152u,5440178u,2147483648u,3221225472u}/* 06DD */, /*1263*/{0,53248u,458753u,69863104u,688u,131072u,3221258240u}/* 06DE */, /*1264*/{0,53248u,458752u,3425450368u,808714928u,2148598788u,3221225600u}/* 06DF */, /*1265*/{0,53248u,458752u,3089906048u,808714992u,2147550212u,3489661056u}/* 06E3 */, /*1266*/{0,53248u,458753u,70080768u,9437936u,2148664896u,3221225664u}/* 06E5 */, /*1267*/{0,53248u,458752u,3089906048u,808714928u,2148598788u,3221225600u}/* 06EA */, /*1268*/{0,53250u,458781u,82663744u,9437936u,132672u,3221225664u}/* 06EE */, /*1269*/{0,53250u,458785u,82663744u,9437936u,132672u,3221225664u}/* 06EF */, /*1270*/{0,53248u,34014209u,69368384u,44047024u,132097u,3221225600u}/* 06F0 */, /*1271*/{0,53248u,453445121u,69368384u,44047024u,132097u,3221225600u}/* 06F1 */, /*1272*/{0,53248u,487000577u,69368384u,44047024u,132097u,3221225600u}/* 06F2 */, /*1273*/{0,53248u,520554497u,69368384u,44047024u,132097u,3221225600u}/* 06F3 */, /*1274*/{0,53248u,554110977u,69368384u,44047024u,132097u,3221225600u}/* 06F4 */, /*1275*/{0,53248u,587664385u,69368384u,44047024u,132097u,3221225600u}/* 06F5 */, /*1276*/{0,53248u,621221377u,69368384u,44047024u,132097u,3221225600u}/* 06F6 */, /*1277*/{0,53248u,654773761u,69368384u,44047024u,132097u,3221225600u}/* 06F7 */, /*1278*/{0,53248u,688331777u,69368384u,44047024u,132097u,3221225600u}/* 06F8 */, /*1279*/{0,53248u,721884161u,69368384u,44047024u,132097u,3221225600u}/* 06F9 */, /*1280*/{0,53249u,458789u,76372288u,9437936u,132672u,3221225664u}/* 06FA */, /*1281*/{0,53249u,458793u,76372288u,9437936u,132672u,3221225664u}/* 06FB */, /*1282*/{0,53249u,458801u,76372288u,9437936u,132672u,3221225664u}/* 06FC */, /*1283*/{0,53248u,458753u,76351168u,688u,131072u,3221258240u}/* 06FD */, /*1284*/{0,53249u,458849u,82663744u,9437936u,132672u,3221225664u}/* 06FF */, /*1285*/{0,57344u,524289u,76350912u,12583600u,131072u,3222294528u}/* 0700 */, /*1286*/{0,57344u,524289u,76350912u,688u,131072u,3222278144u}/* 0703 */, /*1287*/{0,57344u,524289u,76350912u,688u,131072u,3222274048u}/* 070B */, /*1288*/{0,57344u,524289u,76368896u,5440178u,2147483648u,3221225472u}/* 070F */, /*1289*/{0,57346u,524405u,76372288u,9437936u,132672u,3221225664u}/* 0710 */, /*1290*/{0,57344u,524288u,2156673408u,808714992u,2147550212u,3489661056u}/* 0711 */, /*1291*/{0,57345u,524409u,76372288u,9437936u,132672u,3221225664u}/* 0712 */, /*1292*/{0,57345u,524413u,76372288u,9437936u,132672u,3221225664u}/* 0713 */, /*1293*/{0,57346u,524417u,76372288u,9437936u,132672u,3221225664u}/* 0715 */, /*1294*/{0,57346u,524421u,76372288u,9437936u,132672u,3221225664u}/* 0717 */, /*1295*/{0,57346u,524425u,76372288u,9437936u,132672u,3221225664u}/* 0718 */, /*1296*/{0,57346u,524429u,76372288u,9437936u,132672u,3221225664u}/* 0719 */, /*1297*/{0,57345u,524433u,76372288u,9437936u,132672u,3221225664u}/* 071A */, /*1298*/{0,57345u,524437u,76372288u,9437936u,132672u,3221225664u}/* 071B */, /*1299*/{0,57345u,524441u,76372288u,9437936u,132672u,3221225664u}/* 071D */, /*1300*/{0,57346u,524445u,76372288u,9437936u,132672u,3221225664u}/* 071E */, /*1301*/{0,57345u,524449u,76372288u,9437936u,132672u,3221225664u}/* 071F */, /*1302*/{0,57345u,524453u,76372288u,9437936u,132672u,3221225664u}/* 0720 */, /*1303*/{0,57345u,524457u,76372288u,9437936u,132672u,3221225664u}/* 0721 */, /*1304*/{0,57345u,524461u,76372288u,9437936u,132672u,3221225664u}/* 0722 */, /*1305*/{0,57345u,524465u,76372288u,9437936u,132672u,3221225664u}/* 0723 */, /*1306*/{0,57345u,524469u,76372288u,9437936u,132672u,3221225664u}/* 0724 */, /*1307*/{0,57345u,524473u,76372288u,9437936u,132672u,3221225664u}/* 0725 */, /*1308*/{0,57345u,524477u,76372288u,9437936u,132672u,3221225664u}/* 0726 */, /*1309*/{0,57345u,524481u,76372288u,9437936u,132672u,3221225664u}/* 0727 */, /*1310*/{0,57346u,524485u,76372288u,9437936u,132672u,3221225664u}/* 0728 */, /*1311*/{0,57345u,524489u,76372288u,9437936u,132672u,3221225664u}/* 0729 */, /*1312*/{0,57345u,524493u,76372288u,9437936u,132672u,3221225664u}/* 072B */, /*1313*/{0,57346u,524497u,76372288u,9437936u,132672u,3221225664u}/* 072C */, /*1314*/{0,57345u,524409u,82663744u,9437936u,132672u,3221225664u}/* 072D */, /*1315*/{0,57345u,524413u,82663744u,9437936u,132672u,3221225664u}/* 072E */, /*1316*/{0,57346u,524417u,82663744u,9437936u,132672u,3221225664u}/* 072F */, /*1317*/{0,57344u,524288u,3431741824u,808714992u,2148598788u,3489661056u}/* 0730 */, /*1318*/{0,57344u,524288u,3096197504u,808714992u,2148598788u,3489661056u}/* 0731 */, /*1319*/{0,57344u,524288u,3431741824u,808714928u,2148598788u,3221225600u}/* 0740 */, /*1320*/{0,57344u,524288u,3096197504u,808714928u,2148598788u,3221225600u}/* 0742 */, /*1321*/{0,57346u,524501u,82663744u,9437936u,132672u,3221225664u}/* 074D */, /*1322*/{0,57345u,524505u,82663744u,9437936u,132672u,3221225664u}/* 074E */, /*1323*/{0,57345u,524509u,82663744u,9437936u,132672u,3221225664u}/* 074F */, /*1324*/{0,61441u,458769u,84760896u,9437936u,132672u,3221225664u}/* 0750 */, /*1325*/{0,61441u,458777u,84760896u,9437936u,132672u,3221225664u}/* 0757 */, /*1326*/{0,61442u,458781u,84760896u,9437936u,132672u,3221225664u}/* 0759 */, /*1327*/{0,61442u,458785u,84760896u,9437936u,132672u,3221225664u}/* 075B */, /*1328*/{0,61441u,458789u,84760896u,9437936u,132672u,3221225664u}/* 075C */, /*1329*/{0,61441u,458801u,84760896u,9437936u,132672u,3221225664u}/* 075D */, /*1330*/{0,61441u,458813u,84760896u,9437936u,132672u,3221225664u}/* 0760 */, /*1331*/{0,61441u,458805u,84760896u,9437936u,132672u,3221225664u}/* 0762 */, /*1332*/{0,61441u,458829u,84760896u,9437936u,132672u,3221225664u}/* 0765 */, /*1333*/{0,61441u,458833u,84760896u,9437936u,132672u,3221225664u}/* 0767 */, /*1334*/{0,61441u,458825u,84760896u,9437936u,132672u,3221225664u}/* 076A */, /*1335*/{0,61441u,458777u,88955200u,9437936u,132672u,3221225664u}/* 076E */, /*1336*/{0,61441u,458789u,88955200u,9437936u,132672u,3221225664u}/* 0770 */, /*1337*/{0,61442u,458785u,88955200u,9437936u,132672u,3221225664u}/* 0771 */, /*1338*/{0,61442u,458761u,88955200u,9437936u,132672u,3221225664u}/* 0773 */, /*1339*/{0,61441u,458809u,88955200u,9437936u,132672u,3221225664u}/* 0775 */, /*1340*/{0,61441u,458757u,88955200u,9437936u,132672u,3221225664u}/* 0777 */, /*1341*/{0,61442u,458765u,88955200u,9437936u,132672u,3221225664u}/* 0778 */, /*1342*/{0,61441u,458977u,88955200u,9437936u,132672u,3221225664u}/* 077A */, /*1343*/{0,61441u,458821u,88955200u,9437936u,132672u,3221225664u}/* 077F */, /*1344*/{0,65536u,589825u,76372288u,9437936u,132672u,3221225664u}/* 0780 */, /*1345*/{0,65536u,589824u,76298624u,808714992u,2148598788u,3489661056u}/* 07A6 */, /*1346*/{0,65536u,589825u,80566592u,9437936u,132672u,3221225664u}/* 07B1 */, /*1347*/{0,69632u,37880833u,86080064u,44047024u,132097u,3221225600u}/* 07C0 */, /*1348*/{0,69632u,457311745u,86080064u,44047024u,132097u,3221225600u}/* 07C1 */, /*1349*/{0,69632u,490867201u,86080064u,44047024u,132097u,3221225600u}/* 07C2 */, /*1350*/{0,69632u,524421121u,86080064u,44047024u,132097u,3221225600u}/* 07C3 */, /*1351*/{0,69632u,557977601u,86080064u,44047024u,132097u,3221225600u}/* 07C4 */, /*1352*/{0,69632u,591531009u,86080064u,44047024u,132097u,3221225600u}/* 07C5 */, /*1353*/{0,69632u,625088001u,86080064u,44047024u,132097u,3221225600u}/* 07C6 */, /*1354*/{0,69632u,658640385u,86080064u,44047024u,132097u,3221225600u}/* 07C7 */, /*1355*/{0,69632u,692198401u,86080064u,44047024u,132097u,3221225600u}/* 07C8 */, /*1356*/{0,69632u,725750785u,86080064u,44047024u,132097u,3221225600u}/* 07C9 */, /*1357*/{0,69633u,4325377u,86071616u,9437936u,132672u,3221225664u}/* 07CA */, /*1358*/{0,69632u,4325376u,3442227584u,808714928u,2148598788u,3221225600u}/* 07EB */, /*1359*/{0,69632u,4325376u,3106683264u,808714928u,2148598788u,3221225600u}/* 07F2 */, /*1360*/{0,69632u,4325377u,86071552u,9437936u,2148664896u,3221225664u}/* 07F4 */, /*1361*/{0,69632u,4325377u,86640320u,688u,131072u,3221258240u}/* 07F6 */, /*1362*/{0,69632u,4325377u,86640064u,688u,131072u,3222274048u}/* 07F7 */, /*1363*/{0,69632u,4325377u,86666688u,14680752u,131072u,3222278144u}/* 07F8 */, /*1364*/{0,69632u,4325377u,86640064u,12583600u,131072u,3222294528u}/* 07F9 */, /*1365*/{0,69635u,4325377u,86071552u,9437936u,2148140608u,3221225664u}/* 07FA */, /*1366*/{0,73728u,5373953u,90265920u,9437936u,132672u,3221225664u}/* 0800 */, /*1367*/{0,73728u,5373952u,3446421888u,808714992u,2147550212u,3489661056u}/* 0816 */, /*1368*/{0,73728u,5373952u,3446421888u,808714928u,2148598788u,3221225600u}/* 0818 */, /*1369*/{0,73728u,5373953u,90265856u,9437936u,2147616320u,3221225664u}/* 081A */, /*1370*/{0,73728u,5373952u,3446421888u,808714928u,2147550212u,3221225600u}/* 082D */, /*1371*/{0,73728u,5373953u,90244544u,688u,131072u,3222278144u}/* 0830 */, /*1372*/{0,77826u,6225921u,92363072u,9437936u,132672u,3221225664u}/* 0840 */, /*1373*/{0,77825u,6225921u,92363072u,9437936u,132672u,3221225664u}/* 0841 */, /*1374*/{0,77824u,6225921u,92363072u,9437936u,132672u,3221225664u}/* 0856 */, /*1375*/{0,77824u,6225920u,3112974720u,808714928u,2147550212u,3221225600u}/* 0859 */, /*1376*/{0,77824u,6225921u,92341696u,688u,131072u,3222278144u}/* 085E */, /*1377*/{0,81921u,458769u,95246656u,9437936u,132672u,3221225664u}/* 08A0 */, /*1378*/{0,81921u,458769u,101538112u,9437936u,132672u,3221225664u}/* 08A1 */, /*1379*/{0,81921u,458777u,95246656u,9437936u,132672u,3221225664u}/* 08A2 */, /*1380*/{0,81921u,458797u,95246656u,9437936u,132672u,3221225664u}/* 08A3 */, /*1381*/{0,81921u,458813u,95246656u,9437936u,132672u,3221225664u}/* 08A4 */, /*1382*/{0,81921u,458817u,95246656u,9437936u,132672u,3221225664u}/* 08A5 */, /*1383*/{0,81921u,458825u,95246656u,9437936u,132672u,3221225664u}/* 08A6 */, /*1384*/{0,81921u,458829u,95246656u,9437936u,132672u,3221225664u}/* 08A7 */, /*1385*/{0,81921u,458757u,95246656u,9437936u,132672u,3221225664u}/* 08A8 */, /*1386*/{0,81922u,458785u,95246656u,9437936u,132672u,3221225664u}/* 08AA */, /*1387*/{0,81922u,458765u,95246656u,9437936u,132672u,3221225664u}/* 08AB */, /*1388*/{0,81922u,458981u,95246656u,9437936u,132672u,3221225664u}/* 08AC */, /*1389*/{0,81920u,458753u,101538112u,9437936u,132672u,3221225664u}/* 08AD */, /*1390*/{0,81922u,458781u,101538112u,9437936u,132672u,3221225664u}/* 08AE */, /*1391*/{0,81921u,458793u,101538112u,9437936u,132672u,3221225664u}/* 08AF */, /*1392*/{0,81921u,458805u,101538112u,9437936u,132672u,3221225664u}/* 08B0 */, /*1393*/{0,81922u,458985u,101538112u,9437936u,132672u,3221225664u}/* 08B1 */, /*1394*/{0,81922u,458785u,101538112u,9437936u,132672u,3221225664u}/* 08B2 */, /*1395*/{0,81921u,458801u,103635264u,9437936u,132672u,3221225664u}/* 08B3 */, /*1396*/{0,81921u,458821u,103635264u,9437936u,132672u,3221225664u}/* 08B4 */, /*1397*/{0,81920u,458752u,3123460480u,808714992u,2148598788u,3489661056u}/* 08E3 */, /*1398*/{0,81920u,458752u,3450616192u,808714992u,2148598788u,3489661056u}/* 08E4 */, /*1399*/{0,81920u,458752u,3115071872u,808714992u,2148598788u,3489661056u}/* 08E6 */, /*1400*/{0,81920u,458752u,3450616192u,808714928u,2148598788u,3221225600u}/* 08EA */, /*1401*/{0,81920u,458752u,3115071872u,808714928u,2148598788u,3221225600u}/* 08ED */, /*1402*/{0,81920u,458752u,1571568000u,808714992u,2148598788u,3489661056u}/* 08F0 */, /*1403*/{0,81920u,458752u,1638676864u,808714992u,2148598788u,3489661056u}/* 08F1 */, /*1404*/{0,81920u,458752u,1705785728u,808714992u,2148598788u,3489661056u}/* 08F2 */, /*1405*/{0,81920u,458752u,3456907648u,808714992u,2147550212u,3489661056u}/* 08FF */, /*1406*/{0,86016u,655360u,90978688u,808714992u,2147550212u,3489661056u}/* 0900 */, /*1407*/{0,86016u,655360u,70007168u,808714992u,2147550212u,3489661056u}/* 0901 */, /*1408*/{0,86016u,655360u,69220864u,808846064u,132100u,3489661056u}/* 0903 */, /*1409*/{0,86016u,655361u,81811776u,9437936u,132672u,3221225664u}/* 0904 */, /*1410*/{0,86016u,655361u,69228864u,9437936u,132672u,3221225664u}/* 0905 */, /*1411*/{216530944u,86016u,655361u,69228866u,9437936u,132672u,192u}/* 0929 */, /*1412*/{217055232u,86016u,655361u,69228866u,9437936u,132672u,192u}/* 0931 */, /*1413*/{217579520u,86016u,655361u,69228866u,9437936u,132672u,192u}/* 0934 */, /*1414*/{0,86016u,655360u,93075840u,808714992u,2147550212u,3489661056u}/* 093A */, /*1415*/{0,86016u,655360u,92289536u,808846064u,132100u,3489661056u}/* 093B */, /*1416*/{0,86016u,655360u,204224896u,808715568u,2148598788u,3221225600u}/* 093C */, /*1417*/{0,86016u,655360u,338442624u,808714928u,2148631556u,3221225600u}/* 094D */, /*1418*/{0,86016u,655360u,90192384u,808846064u,132100u,3489661056u}/* 094E */, /*1419*/{0,86016u,2686976u,3425450368u,808714928u,2148598788u,3221225600u}/* 0951 */, /*1420*/{0,86016u,2686976u,3089906048u,808714928u,2148598788u,3221225600u}/* 0952 */, /*1421*/{0,86016u,655360u,3425450368u,808714928u,2148598788u,3221225600u}/* 0953 */, /*1422*/{218103808u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 0958 */, /*1423*/{218628096u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 0959 */, /*1424*/{219152384u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095A */, /*1425*/{219676672u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095B */, /*1426*/{220200960u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095C */, /*1427*/{220725248u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095D */, /*1428*/{221249536u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095E */, /*1429*/{221773824u,86016u,655360u,69228866u,9437296u,67503680u,192u}/* 095F */, /*1430*/{0,86016u,65537u,69207488u,12583600u,131072u,3222294528u}/* 0964 */, /*1431*/{0,86016u,34210817u,69237312u,44047024u,132097u,3221225600u}/* 0966 */, /*1432*/{0,86016u,453641729u,69237312u,44047024u,132097u,3221225600u}/* 0967 */, /*1433*/{0,86016u,487197185u,69237312u,44047024u,132097u,3221225600u}/* 0968 */, /*1434*/{0,86016u,520751105u,69237312u,44047024u,132097u,3221225600u}/* 0969 */, /*1435*/{0,86016u,554307585u,69237312u,44047024u,132097u,3221225600u}/* 096A */, /*1436*/{0,86016u,587860993u,69237312u,44047024u,132097u,3221225600u}/* 096B */, /*1437*/{0,86016u,621417985u,69237312u,44047024u,132097u,3221225600u}/* 096C */, /*1438*/{0,86016u,654970369u,69237312u,44047024u,132097u,3221225600u}/* 096D */, /*1439*/{0,86016u,688528385u,69237312u,44047024u,132097u,3221225600u}/* 096E */, /*1440*/{0,86016u,722080769u,69237312u,44047024u,132097u,3221225600u}/* 096F */, /*1441*/{0,86016u,655361u,69207488u,688u,131072u,3222274048u}/* 0970 */, /*1442*/{0,86016u,655361u,88103168u,9437936u,2148664896u,3221225664u}/* 0971 */, /*1443*/{0,86016u,655361u,88103232u,9437936u,132672u,3221225664u}/* 0972 */, /*1444*/{0,86016u,655361u,92297536u,9437936u,132672u,3221225664u}/* 0973 */, /*1445*/{0,86016u,655361u,100686144u,9437936u,132672u,3221225664u}/* 0978 */, /*1446*/{0,86016u,655361u,90200384u,9437936u,132672u,3221225664u}/* 0979 */, /*1447*/{0,86016u,655361u,86006080u,9437936u,132672u,3221225664u}/* 097B */, /*1448*/{0,86016u,655361u,83908928u,9437936u,132672u,3221225664u}/* 097D */, /*1449*/{0,90112u,720897u,100686144u,9437936u,132672u,3221225664u}/* 0980 */, /*1450*/{0,90112u,720896u,70007168u,808714992u,2147550212u,3489661056u}/* 0981 */, /*1451*/{0,90112u,720896u,69220864u,808846064u,132100u,3489661056u}/* 0982 */, /*1452*/{0,90112u,720897u,69228864u,9437936u,132672u,3221225664u}/* 0985 */, /*1453*/{0,90112u,720896u,204224896u,808714928u,2148598788u,3221225600u}/* 09BC */, /*1454*/{0,90112u,720897u,81811776u,9437936u,132672u,3221225664u}/* 09BD */, /*1455*/{0,90112u,720896u,69220864u,808715632u,66564u,3556769920u}/* 09BE */, /*1456*/{222298112u,90112u,720896u,69220866u,808846064u,132100u,268435584u}/* 09CB */, /*1457*/{222822400u,90112u,720896u,69220866u,808846064u,132100u,268435584u}/* 09CC */, /*1458*/{0,90112u,720896u,338442624u,808714928u,2148631556u,3221225600u}/* 09CD */, /*1459*/{0,90112u,720897u,83908928u,9437936u,132672u,3221225664u}/* 09CE */, /*1460*/{223346688u,90112u,720896u,69228866u,9437296u,67503680u,192u}/* 09DC */, /*1461*/{223870976u,90112u,720896u,69228866u,9437296u,67503680u,192u}/* 09DD */, /*1462*/{224395264u,90112u,720896u,69228866u,9437296u,67503680u,192u}/* 09DF */, /*1463*/{0,90112u,34276353u,69237312u,44047024u,132097u,3221225600u}/* 09E6 */, /*1464*/{0,90112u,453707265u,69237312u,44047024u,132097u,3221225600u}/* 09E7 */, /*1465*/{0,90112u,487262721u,69237312u,44047024u,132097u,3221225600u}/* 09E8 */, /*1466*/{0,90112u,520816641u,69237312u,44047024u,132097u,3221225600u}/* 09E9 */, /*1467*/{0,90112u,554373121u,69237312u,44047024u,132097u,3221225600u}/* 09EA */, /*1468*/{0,90112u,587926529u,69237312u,44047024u,132097u,3221225600u}/* 09EB */, /*1469*/{0,90112u,621483521u,69237312u,44047024u,132097u,3221225600u}/* 09EC */, /*1470*/{0,90112u,655035905u,69237312u,44047024u,132097u,3221225600u}/* 09ED */, /*1471*/{0,90112u,688593921u,69237312u,44047024u,132097u,3221225600u}/* 09EE */, /*1472*/{0,90112u,722146305u,69237312u,44047024u,132097u,3221225600u}/* 09EF */, /*1473*/{0,90112u,720897u,69469760u,688u,131072u,3221258240u}/* 09F2 */, /*1474*/{0,90112u,51054081u,69206720u,50334384u,131073u,3221225472u}/* 09F4 */, /*1475*/{0,90112u,118162945u,69206720u,117443248u,131073u,3221225472u}/* 09F5 */, /*1476*/{0,90112u,168495105u,69206720u,50334384u,131073u,3221225472u}/* 09F6 */, /*1477*/{0,90112u,202049025u,69206720u,184552112u,131073u,3221225472u}/* 09F7 */, /*1478*/{0,90112u,369821697u,69206720u,184552112u,131073u,3221225472u}/* 09F8 */, /*1479*/{0,90112u,839591425u,69206720u,33557168u,131073u,3221225472u}/* 09F9 */, /*1480*/{0,90112u,720897u,69207744u,688u,131072u,3221258240u}/* 09FA */, /*1481*/{0,90112u,720897u,90441280u,688u,131072u,3221258240u}/* 09FB */, /*1482*/{0,94208u,786432u,82590080u,808714992u,2147550212u,3489661056u}/* 0A01 */, /*1483*/{0,94208u,786432u,70007168u,808714992u,2147550212u,3489661056u}/* 0A02 */, /*1484*/{0,94208u,786432u,81803776u,808846064u,132100u,3489661056u}/* 0A03 */, /*1485*/{0,94208u,786433u,69228864u,9437936u,132672u,3221225664u}/* 0A05 */, /*1486*/{224919552u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A33 */, /*1487*/{225443840u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A36 */, /*1488*/{0,94208u,786432u,204224896u,808714928u,2148598788u,3221225600u}/* 0A3C */, /*1489*/{0,94208u,786432u,69220864u,808846064u,132100u,3489661056u}/* 0A3E */, /*1490*/{0,94208u,786432u,338442624u,808714928u,2148631556u,3221225600u}/* 0A4D */, /*1491*/{0,94208u,786432u,88881536u,808714992u,2147550212u,3489661056u}/* 0A51 */, /*1492*/{225968128u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A59 */, /*1493*/{226492416u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A5A */, /*1494*/{227016704u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A5B */, /*1495*/{227540992u,94208u,786432u,69228866u,9437296u,67503680u,192u}/* 0A5E */, /*1496*/{0,94208u,34341889u,69237312u,44047024u,132097u,3221225600u}/* 0A66 */, /*1497*/{0,94208u,453772801u,69237312u,44047024u,132097u,3221225600u}/* 0A67 */, /*1498*/{0,94208u,487328257u,69237312u,44047024u,132097u,3221225600u}/* 0A68 */, /*1499*/{0,94208u,520882177u,69237312u,44047024u,132097u,3221225600u}/* 0A69 */, /*1500*/{0,94208u,554438657u,69237312u,44047024u,132097u,3221225600u}/* 0A6A */, /*1501*/{0,94208u,587992065u,69237312u,44047024u,132097u,3221225600u}/* 0A6B */, /*1502*/{0,94208u,621549057u,69237312u,44047024u,132097u,3221225600u}/* 0A6C */, /*1503*/{0,94208u,655101441u,69237312u,44047024u,132097u,3221225600u}/* 0A6D */, /*1504*/{0,94208u,688659457u,69237312u,44047024u,132097u,3221225600u}/* 0A6E */, /*1505*/{0,94208u,722211841u,69237312u,44047024u,132097u,3221225600u}/* 0A6F */, /*1506*/{0,98304u,851968u,70007168u,808714992u,2147550212u,3489661056u}/* 0A81 */, /*1507*/{0,98304u,851968u,69220864u,808846064u,132100u,3489661056u}/* 0A83 */, /*1508*/{0,98304u,851969u,69228864u,9437936u,132672u,3221225664u}/* 0A85 */, /*1509*/{0,98304u,851969u,81811776u,9437936u,132672u,3221225664u}/* 0A8C */, /*1510*/{0,98304u,851968u,204224896u,808714928u,2148598788u,3221225600u}/* 0ABC */, /*1511*/{0,98304u,851968u,338442624u,808714928u,2148631556u,3221225600u}/* 0ACD */, /*1512*/{0,98304u,851968u,82590080u,808714992u,2147550212u,3489661056u}/* 0AE2 */, /*1513*/{0,98304u,34407425u,69237312u,44047024u,132097u,3221225600u}/* 0AE6 */, /*1514*/{0,98304u,453838337u,69237312u,44047024u,132097u,3221225600u}/* 0AE7 */, /*1515*/{0,98304u,487393793u,69237312u,44047024u,132097u,3221225600u}/* 0AE8 */, /*1516*/{0,98304u,520947713u,69237312u,44047024u,132097u,3221225600u}/* 0AE9 */, /*1517*/{0,98304u,554504193u,69237312u,44047024u,132097u,3221225600u}/* 0AEA */, /*1518*/{0,98304u,588057601u,69237312u,44047024u,132097u,3221225600u}/* 0AEB */, /*1519*/{0,98304u,621614593u,69237312u,44047024u,132097u,3221225600u}/* 0AEC */, /*1520*/{0,98304u,655166977u,69237312u,44047024u,132097u,3221225600u}/* 0AED */, /*1521*/{0,98304u,688724993u,69237312u,44047024u,132097u,3221225600u}/* 0AEE */, /*1522*/{0,98304u,722277377u,69237312u,44047024u,132097u,3221225600u}/* 0AEF */, /*1523*/{0,98304u,851969u,94373312u,688u,131072u,3222274048u}/* 0AF0 */, /*1524*/{0,98304u,851969u,82052672u,688u,131072u,3221258240u}/* 0AF1 */, /*1525*/{0,98304u,851969u,102783296u,9437936u,132672u,3221225664u}/* 0AF9 */, /*1526*/{0,102400u,917504u,70007168u,808714992u,2147550212u,3489661056u}/* 0B01 */, /*1527*/{0,102400u,917504u,69220864u,808846064u,132100u,3489661056u}/* 0B02 */, /*1528*/{0,102400u,917505u,69228864u,9437936u,132672u,3221225664u}/* 0B05 */, /*1529*/{0,102400u,917505u,81811776u,9437936u,132672u,3221225664u}/* 0B35 */, /*1530*/{0,102400u,917504u,204224896u,808714928u,2148598788u,3221225600u}/* 0B3C */, /*1531*/{0,102400u,917504u,69220864u,808715632u,66564u,3556769920u}/* 0B3E */, /*1532*/{0,102400u,917504u,88881536u,808714992u,2147550212u,3489661056u}/* 0B44 */, /*1533*/{228065280u,102400u,917504u,69220866u,808846064u,132100u,268435584u}/* 0B48 */, /*1534*/{228589568u,102400u,917504u,69220866u,808846064u,132100u,268435584u}/* 0B4B */, /*1535*/{229113856u,102400u,917504u,69220866u,808846064u,132100u,268435584u}/* 0B4C */, /*1536*/{0,102400u,917504u,338442624u,808714928u,2148631556u,3221225600u}/* 0B4D */, /*1537*/{0,102400u,917504u,70007168u,808715632u,2147550212u,3489661056u}/* 0B56 */, /*1538*/{229638144u,102400u,917504u,69228866u,9437296u,67503680u,192u}/* 0B5C */, /*1539*/{230162432u,102400u,917504u,69228866u,9437296u,67503680u,192u}/* 0B5D */, /*1540*/{0,102400u,34472961u,69237312u,44047024u,132097u,3221225600u}/* 0B66 */, /*1541*/{0,102400u,453903873u,69237312u,44047024u,132097u,3221225600u}/* 0B67 */, /*1542*/{0,102400u,487459329u,69237312u,44047024u,132097u,3221225600u}/* 0B68 */, /*1543*/{0,102400u,521013249u,69237312u,44047024u,132097u,3221225600u}/* 0B69 */, /*1544*/{0,102400u,554569729u,69237312u,44047024u,132097u,3221225600u}/* 0B6A */, /*1545*/{0,102400u,588123137u,69237312u,44047024u,132097u,3221225600u}/* 0B6B */, /*1546*/{0,102400u,621680129u,69237312u,44047024u,132097u,3221225600u}/* 0B6C */, /*1547*/{0,102400u,655232513u,69237312u,44047024u,132097u,3221225600u}/* 0B6D */, /*1548*/{0,102400u,688790529u,69237312u,44047024u,132097u,3221225600u}/* 0B6E */, /*1549*/{0,102400u,722342913u,69237312u,44047024u,132097u,3221225600u}/* 0B6F */, /*1550*/{0,102400u,917505u,69207744u,688u,131072u,3221258240u}/* 0B70 */, /*1551*/{0,102400u,202245633u,92275392u,184552112u,131073u,3221225472u}/* 0B72 */, /*1552*/{0,102400u,286131713u,92275392u,16779952u,131073u,3221225472u}/* 0B73 */, /*1553*/{0,102400u,370018305u,92275392u,184552112u,131073u,3221225472u}/* 0B74 */, /*1554*/{0,102400u,51250689u,92275392u,50334384u,131073u,3221225472u}/* 0B75 */, /*1555*/{0,102400u,118359553u,92275392u,117443248u,131073u,3221225472u}/* 0B76 */, /*1556*/{0,102400u,168691713u,92275392u,50334384u,131073u,3221225472u}/* 0B77 */, /*1557*/{0,106496u,983040u,70007168u,808714992u,2147550212u,3489661056u}/* 0B82 */, /*1558*/{0,106496u,983041u,69228864u,9437936u,132672u,3221225664u}/* 0B83 */, /*1559*/{230686720u,106496u,983041u,69228866u,9437936u,132672u,192u}/* 0B94 */, /*1560*/{0,106496u,983041u,83908928u,9437936u,132672u,3221225664u}/* 0BB6 */, /*1561*/{0,106496u,983040u,69220864u,808715632u,66564u,3556769920u}/* 0BBE */, /*1562*/{0,106496u,983040u,69220864u,808846064u,132100u,3489661056u}/* 0BBF */, /*1563*/{231211008u,106496u,983040u,69220866u,808846064u,132100u,268435584u}/* 0BCA */, /*1564*/{231735296u,106496u,983040u,69220866u,808846064u,132100u,268435584u}/* 0BCB */, /*1565*/{232259584u,106496u,983040u,69220866u,808846064u,132100u,268435584u}/* 0BCC */, /*1566*/{0,106496u,983040u,338442624u,808714928u,2148631556u,3221225600u}/* 0BCD */, /*1567*/{0,106496u,983041u,88103232u,9437936u,132672u,3221225664u}/* 0BD0 */, /*1568*/{0,106496u,34538497u,83917376u,44047024u,132097u,3221225600u}/* 0BE6 */, /*1569*/{0,106496u,453969409u,69237312u,44047024u,132097u,3221225600u}/* 0BE7 */, /*1570*/{0,106496u,487524865u,69237312u,44047024u,132097u,3221225600u}/* 0BE8 */, /*1571*/{0,106496u,521078785u,69237312u,44047024u,132097u,3221225600u}/* 0BE9 */, /*1572*/{0,106496u,554635265u,69237312u,44047024u,132097u,3221225600u}/* 0BEA */, /*1573*/{0,106496u,588188673u,69237312u,44047024u,132097u,3221225600u}/* 0BEB */, /*1574*/{0,106496u,621745665u,69237312u,44047024u,132097u,3221225600u}/* 0BEC */, /*1575*/{0,106496u,655298049u,69237312u,44047024u,132097u,3221225600u}/* 0BED */, /*1576*/{0,106496u,688856065u,69237312u,44047024u,132097u,3221225600u}/* 0BEE */, /*1577*/{0,106496u,722408449u,69237312u,44047024u,132097u,3221225600u}/* 0BEF */, /*1578*/{0,106496u,739188737u,69206720u,33557168u,131073u,3221225472u}/* 0BF0 */, /*1579*/{0,106496u,1494184449u,69206720u,33557168u,131073u,3221225472u}/* 0BF1 */, /*1580*/{0,106496u,1645184001u,69206720u,33557168u,131073u,3221225472u}/* 0BF2 */, /*1581*/{0,106496u,983041u,82446016u,688u,131072u,3221258240u}/* 0BF3 */, /*1582*/{0,106496u,983041u,82052672u,688u,131072u,3221258240u}/* 0BF9 */, /*1583*/{0,110592u,1048576u,101464448u,808714992u,2147550212u,3489661056u}/* 0C00 */, /*1584*/{0,110592u,1048576u,69220864u,808846064u,132100u,3489661056u}/* 0C01 */, /*1585*/{0,110592u,1048577u,69228864u,9437936u,132672u,3221225664u}/* 0C05 */, /*1586*/{0,110592u,1048577u,100686144u,9437936u,132672u,3221225664u}/* 0C34 */, /*1587*/{0,110592u,1048577u,88103232u,9437936u,132672u,3221225664u}/* 0C3D */, /*1588*/{0,110592u,1048576u,70007168u,808714992u,2147550212u,3489661056u}/* 0C3E */, /*1589*/{232783872u,110592u,1048576u,70007170u,808714992u,2147550212u,268435584u}/* 0C48 */, /*1590*/{0,110592u,1048576u,338442624u,808714928u,2148631556u,3221225600u}/* 0C4D */, /*1591*/{0,110592u,1048576u,2217490816u,808714992u,2147550212u,3489661056u}/* 0C55 */, /*1592*/{0,110592u,1048576u,2284599680u,808715632u,2147550212u,3489661056u}/* 0C56 */, /*1593*/{0,110592u,1048577u,102783296u,9437936u,132672u,3221225664u}/* 0C5A */, /*1594*/{0,110592u,1048576u,88881536u,808714992u,2147550212u,3489661056u}/* 0C62 */, /*1595*/{0,110592u,34604033u,69237312u,44047024u,132097u,3221225600u}/* 0C66 */, /*1596*/{0,110592u,454034945u,69237312u,44047024u,132097u,3221225600u}/* 0C67 */, /*1597*/{0,110592u,487590401u,69237312u,44047024u,132097u,3221225600u}/* 0C68 */, /*1598*/{0,110592u,521144321u,69237312u,44047024u,132097u,3221225600u}/* 0C69 */, /*1599*/{0,110592u,554700801u,69237312u,44047024u,132097u,3221225600u}/* 0C6A */, /*1600*/{0,110592u,588254209u,69237312u,44047024u,132097u,3221225600u}/* 0C6B */, /*1601*/{0,110592u,621811201u,69237312u,44047024u,132097u,3221225600u}/* 0C6C */, /*1602*/{0,110592u,655363585u,69237312u,44047024u,132097u,3221225600u}/* 0C6D */, /*1603*/{0,110592u,688921601u,69237312u,44047024u,132097u,3221225600u}/* 0C6E */, /*1604*/{0,110592u,722473985u,69237312u,44047024u,132097u,3221225600u}/* 0C6F */, /*1605*/{0,110592u,34604033u,88736448u,33557168u,131073u,3221225472u}/* 0C78 */, /*1606*/{0,110592u,454034945u,88736448u,33557168u,131073u,3221225472u}/* 0C79 */, /*1607*/{0,110592u,487590401u,88736448u,33557168u,131073u,3221225472u}/* 0C7A */, /*1608*/{0,110592u,521144321u,88736448u,33557168u,131073u,3221225472u}/* 0C7B */, /*1609*/{0,110592u,1048577u,88082112u,688u,131072u,3221258240u}/* 0C7F */, /*1610*/{0,114688u,1114112u,101464448u,808714992u,2147550212u,3489661056u}/* 0C81 */, /*1611*/{0,114688u,1114112u,69220864u,808846064u,132100u,3489661056u}/* 0C82 */, /*1612*/{0,114688u,1114113u,69228864u,9437936u,132672u,3221225664u}/* 0C85 */, /*1613*/{0,114688u,1114112u,216807808u,808714928u,2148598788u,3221225600u}/* 0CBC */, /*1614*/{0,114688u,1114113u,81811776u,9437936u,132672u,3221225664u}/* 0CBD */, /*1615*/{0,114688u,1114112u,69220736u,808714992u,2147550212u,3489661056u}/* 0CBF */, /*1616*/{233308160u,114688u,1114112u,69220866u,808846064u,132100u,268435584u}/* 0CC0 */, /*1617*/{0,114688u,1114112u,69220864u,808715632u,66564u,3556769920u}/* 0CC2 */, /*1618*/{233832448u,114688u,1114112u,69220866u,808846064u,132100u,268435584u}/* 0CC7 */, /*1619*/{234356736u,114688u,1114112u,69220866u,808846064u,132100u,268435584u}/* 0CC8 */, /*1620*/{234881024u,114688u,1114112u,69220866u,808846064u,132100u,268435584u}/* 0CCA */, /*1621*/{235405312u,114688u,1114112u,69220866u,808846064u,132100u,268435584u}/* 0CCB */, /*1622*/{0,114688u,1114112u,70007168u,808714992u,2147550212u,3489661056u}/* 0CCC */, /*1623*/{0,114688u,1114112u,338442624u,808714928u,2148631556u,3221225600u}/* 0CCD */, /*1624*/{0,114688u,1114112u,86784384u,808714992u,2147550212u,3489661056u}/* 0CE2 */, /*1625*/{0,114688u,34669569u,69237312u,44047024u,132097u,3221225600u}/* 0CE6 */, /*1626*/{0,114688u,454100481u,69237312u,44047024u,132097u,3221225600u}/* 0CE7 */, /*1627*/{0,114688u,487655937u,69237312u,44047024u,132097u,3221225600u}/* 0CE8 */, /*1628*/{0,114688u,521209857u,69237312u,44047024u,132097u,3221225600u}/* 0CE9 */, /*1629*/{0,114688u,554766337u,69237312u,44047024u,132097u,3221225600u}/* 0CEA */, /*1630*/{0,114688u,588319745u,69237312u,44047024u,132097u,3221225600u}/* 0CEB */, /*1631*/{0,114688u,621876737u,69237312u,44047024u,132097u,3221225600u}/* 0CEC */, /*1632*/{0,114688u,655429121u,69237312u,44047024u,132097u,3221225600u}/* 0CED */, /*1633*/{0,114688u,688987137u,69237312u,44047024u,132097u,3221225600u}/* 0CEE */, /*1634*/{0,114688u,722539521u,69237312u,44047024u,132097u,3221225600u}/* 0CEF */, /*1635*/{0,114688u,1114113u,86006080u,9437936u,132672u,3221225664u}/* 0CF1 */, /*1636*/{0,118784u,1179648u,101464448u,808714992u,2147550212u,3489661056u}/* 0D01 */, /*1637*/{0,118784u,1179648u,69220864u,808846064u,132100u,3489661056u}/* 0D02 */, /*1638*/{0,118784u,1179649u,69228864u,9437936u,132672u,3221225664u}/* 0D05 */, /*1639*/{0,118784u,1179649u,92297536u,9437936u,132672u,3221225664u}/* 0D29 */, /*1640*/{0,118784u,1179649u,88103232u,9437936u,132672u,3221225664u}/* 0D3D */, /*1641*/{0,118784u,1179648u,69220864u,808715632u,66564u,3556769920u}/* 0D3E */, /*1642*/{0,118784u,1179648u,70007168u,808714992u,2147550212u,3489661056u}/* 0D41 */, /*1643*/{0,118784u,1179648u,88881536u,808714992u,2147550212u,3489661056u}/* 0D44 */, /*1644*/{235929600u,118784u,1179648u,69220866u,808846064u,132100u,268435584u}/* 0D4A */, /*1645*/{236453888u,118784u,1179648u,69220866u,808846064u,132100u,268435584u}/* 0D4B */, /*1646*/{236978176u,118784u,1179648u,69220866u,808846064u,132100u,268435584u}/* 0D4C */, /*1647*/{0,118784u,1179648u,338442624u,808714928u,2148631556u,3221225600u}/* 0D4D */, /*1648*/{0,118784u,1179649u,102783296u,9437936u,132672u,3221225664u}/* 0D5F */, /*1649*/{0,118784u,34735105u,69237312u,44047024u,132097u,3221225600u}/* 0D66 */, /*1650*/{0,118784u,454166017u,69237312u,44047024u,132097u,3221225600u}/* 0D67 */, /*1651*/{0,118784u,487721473u,69237312u,44047024u,132097u,3221225600u}/* 0D68 */, /*1652*/{0,118784u,521275393u,69237312u,44047024u,132097u,3221225600u}/* 0D69 */, /*1653*/{0,118784u,554831873u,69237312u,44047024u,132097u,3221225600u}/* 0D6A */, /*1654*/{0,118784u,588385281u,69237312u,44047024u,132097u,3221225600u}/* 0D6B */, /*1655*/{0,118784u,621942273u,69237312u,44047024u,132097u,3221225600u}/* 0D6C */, /*1656*/{0,118784u,655494657u,69237312u,44047024u,132097u,3221225600u}/* 0D6D */, /*1657*/{0,118784u,689052673u,69237312u,44047024u,132097u,3221225600u}/* 0D6E */, /*1658*/{0,118784u,722605057u,69237312u,44047024u,132097u,3221225600u}/* 0D6F */, /*1659*/{0,118784u,739385345u,88081088u,33557168u,131073u,3221225472u}/* 0D70 */, /*1660*/{0,118784u,1494381057u,88081088u,33557168u,131073u,3221225472u}/* 0D71 */, /*1661*/{0,118784u,1645380609u,88081088u,33557168u,131073u,3221225472u}/* 0D72 */, /*1662*/{0,118784u,202507777u,88081088u,184552112u,131073u,3221225472u}/* 0D73 */, /*1663*/{0,118784u,286393857u,88081088u,16779952u,131073u,3221225472u}/* 0D74 */, /*1664*/{0,118784u,370280449u,88081088u,184552112u,131073u,3221225472u}/* 0D75 */, /*1665*/{0,118784u,1179649u,88082112u,688u,131072u,3221258240u}/* 0D79 */, /*1666*/{0,122880u,1245184u,75512320u,808846064u,132100u,3489661056u}/* 0D82 */, /*1667*/{0,122880u,1245185u,75520320u,9437936u,132672u,3221225664u}/* 0D85 */, /*1668*/{0,122880u,1245184u,344734080u,808715568u,2148631556u,3221225600u}/* 0DCA */, /*1669*/{0,122880u,1245184u,75512320u,808715632u,66564u,3556769920u}/* 0DCF */, /*1670*/{0,122880u,1245184u,76298624u,808714992u,2147550212u,3489661056u}/* 0DD2 */, /*1671*/{237502464u,122880u,1245184u,75512322u,808846064u,132100u,268435584u}/* 0DDA */, /*1672*/{238026752u,122880u,1245184u,75512322u,808846064u,132100u,268435584u}/* 0DDC */, /*1673*/{238551040u,122880u,1245184u,75512322u,808846064u,132100u,268435584u}/* 0DDD */, /*1674*/{239075328u,122880u,1245184u,75512322u,808846064u,132100u,268435584u}/* 0DDE */, /*1675*/{0,122880u,34800641u,100694592u,44047024u,132097u,3221225600u}/* 0DE6 */, /*1676*/{0,122880u,454231553u,100694592u,44047024u,132097u,3221225600u}/* 0DE7 */, /*1677*/{0,122880u,487787009u,100694592u,44047024u,132097u,3221225600u}/* 0DE8 */, /*1678*/{0,122880u,521340929u,100694592u,44047024u,132097u,3221225600u}/* 0DE9 */, /*1679*/{0,122880u,554897409u,100694592u,44047024u,132097u,3221225600u}/* 0DEA */, /*1680*/{0,122880u,588450817u,100694592u,44047024u,132097u,3221225600u}/* 0DEB */, /*1681*/{0,122880u,622007809u,100694592u,44047024u,132097u,3221225600u}/* 0DEC */, /*1682*/{0,122880u,655560193u,100694592u,44047024u,132097u,3221225600u}/* 0DED */, /*1683*/{0,122880u,689118209u,100694592u,44047024u,132097u,3221225600u}/* 0DEE */, /*1684*/{0,122880u,722670593u,100694592u,44047024u,132097u,3221225600u}/* 0DEF */, /*1685*/{0,122880u,1245185u,75498944u,688u,131072u,3222274048u}/* 0DF4 */, /*1686*/{0,126976u,1310721u,69206336u,9437936u,132672u,3221225664u}/* 0E01 */, /*1687*/{0,126976u,1310720u,70007168u,3408624u,2147550212u,3489661056u}/* 0E31 */, /*1688*/{239599616u,126976u,1310720u,69206340u,9830640u,67241536u,2147483776u}/* 0E33 */, /*1689*/{0,126976u,1310720u,2351708544u,3408624u,2147550212u,3489661056u}/* 0E38 */, /*1690*/{0,126976u,1310720u,338442624u,3408624u,2147582980u,3489661056u}/* 0E3A */, /*1691*/{0,126976u,65537u,69469760u,688u,131072u,3221258240u}/* 0E3F */, /*1692*/{0,126976u,1310721u,69206336u,9437936u,132688u,3221225664u}/* 0E40 */, /*1693*/{0,126976u,1310721u,69206272u,9437936u,2148140608u,3221225664u}/* 0E46 */, /*1694*/{0,126976u,1310720u,70007168u,3408560u,2148598788u,3221225600u}/* 0E47 */, /*1695*/{0,126976u,1310720u,2418817408u,3408560u,2148598788u,3221225600u}/* 0E48 */, /*1696*/{0,126976u,1310721u,69207488u,688u,131072u,3222274048u}/* 0E4F */, /*1697*/{0,126976u,34866177u,69237312u,44047024u,132097u,3221225600u}/* 0E50 */, /*1698*/{0,126976u,454297089u,69237312u,44047024u,132097u,3221225600u}/* 0E51 */, /*1699*/{0,126976u,487852545u,69237312u,44047024u,132097u,3221225600u}/* 0E52 */, /*1700*/{0,126976u,521406465u,69237312u,44047024u,132097u,3221225600u}/* 0E53 */, /*1701*/{0,126976u,554962945u,69237312u,44047024u,132097u,3221225600u}/* 0E54 */, /*1702*/{0,126976u,588516353u,69237312u,44047024u,132097u,3221225600u}/* 0E55 */, /*1703*/{0,126976u,622073345u,69237312u,44047024u,132097u,3221225600u}/* 0E56 */, /*1704*/{0,126976u,655625729u,69237312u,44047024u,132097u,3221225600u}/* 0E57 */, /*1705*/{0,126976u,689183745u,69237312u,44047024u,132097u,3221225600u}/* 0E58 */, /*1706*/{0,126976u,722736129u,69237312u,44047024u,132097u,3221225600u}/* 0E59 */, /*1707*/{0,126976u,1310721u,69207488u,688u,131072u,3222278144u}/* 0E5A */, /*1708*/{0,131072u,1376257u,69206336u,9437936u,132672u,3221225664u}/* 0E81 */, /*1709*/{0,131072u,1376256u,70007168u,3408624u,2147550212u,3489661056u}/* 0EB1 */, /*1710*/{240123904u,131072u,1376256u,69206340u,9830640u,67241536u,2147483776u}/* 0EB3 */, /*1711*/{0,131072u,1376256u,2485926272u,3408624u,2147550212u,3489661056u}/* 0EB8 */, /*1712*/{0,131072u,1376257u,69206336u,9437936u,132688u,3221225664u}/* 0EC0 */, /*1713*/{0,131072u,1376257u,69206272u,9437936u,2148140608u,3221225664u}/* 0EC6 */, /*1714*/{0,131072u,1376256u,2553035136u,3408560u,2148598788u,3221225600u}/* 0EC8 */, /*1715*/{0,131072u,1376256u,70007168u,3408560u,2148598788u,3221225600u}/* 0ECC */, /*1716*/{0,131072u,34931713u,69237312u,44047024u,132097u,3221225600u}/* 0ED0 */, /*1717*/{0,131072u,454362625u,69237312u,44047024u,132097u,3221225600u}/* 0ED1 */, /*1718*/{0,131072u,487918081u,69237312u,44047024u,132097u,3221225600u}/* 0ED2 */, /*1719*/{0,131072u,521472001u,69237312u,44047024u,132097u,3221225600u}/* 0ED3 */, /*1720*/{0,131072u,555028481u,69237312u,44047024u,132097u,3221225600u}/* 0ED4 */, /*1721*/{0,131072u,588581889u,69237312u,44047024u,132097u,3221225600u}/* 0ED5 */, /*1722*/{0,131072u,622138881u,69237312u,44047024u,132097u,3221225600u}/* 0ED6 */, /*1723*/{0,131072u,655691265u,69237312u,44047024u,132097u,3221225600u}/* 0ED7 */, /*1724*/{0,131072u,689249281u,69237312u,44047024u,132097u,3221225600u}/* 0ED8 */, /*1725*/{0,131072u,722801665u,69237312u,44047024u,132097u,3221225600u}/* 0ED9 */, /*1726*/{240648192u,131072u,1376257u,69206340u,9437424u,67241536u,2147483840u}/* 0EDC */, /*1727*/{241172480u,131072u,1376257u,69206340u,9437424u,67241536u,2147483840u}/* 0EDD */, /*1728*/{0,131072u,1376257u,94372160u,9437936u,132672u,3221225664u}/* 0EDE */, /*1729*/{0,135168u,1441793u,71326016u,9437936u,132672u,3221225664u}/* 0F00 */, /*1730*/{0,135168u,1441793u,71304896u,688u,131072u,3221258240u}/* 0F01 */, /*1731*/{0,135168u,1441793u,71304640u,688u,131072u,3222274048u}/* 0F04 */, /*1732*/{0,135168u,1441793u,71304640u,1342177968u,131072u,3222278144u}/* 0F08 */, /*1733*/{241696768u,135168u,1441793u,71304648u,1342177456u,67239936u,2148532224u}/* 0F0C */, /*1734*/{0,135168u,1441793u,71304640u,688u,131072u,3222278144u}/* 0F0D */, /*1735*/{0,135168u,1441792u,3092003200u,808714928u,2148598788u,3221225600u}/* 0F18 */, /*1736*/{0,135168u,34997249u,71334464u,44047024u,132097u,3221225600u}/* 0F20 */, /*1737*/{0,135168u,454428161u,71334464u,44047024u,132097u,3221225600u}/* 0F21 */, /*1738*/{0,135168u,487983617u,71334464u,44047024u,132097u,3221225600u}/* 0F22 */, /*1739*/{0,135168u,521537537u,71334464u,44047024u,132097u,3221225600u}/* 0F23 */, /*1740*/{0,135168u,555094017u,71334464u,44047024u,132097u,3221225600u}/* 0F24 */, /*1741*/{0,135168u,588647425u,71334464u,44047024u,132097u,3221225600u}/* 0F25 */, /*1742*/{0,135168u,622204417u,71334464u,44047024u,132097u,3221225600u}/* 0F26 */, /*1743*/{0,135168u,655756801u,71334464u,44047024u,132097u,3221225600u}/* 0F27 */, /*1744*/{0,135168u,689314817u,71334464u,44047024u,132097u,3221225600u}/* 0F28 */, /*1745*/{0,135168u,722867201u,71334464u,44047024u,132097u,3221225600u}/* 0F29 */, /*1746*/{0,135168u,286656001u,71303872u,16779952u,131073u,3221225472u}/* 0F2A */, /*1747*/{0,135168u,471205889u,71303872u,16779952u,131073u,3221225472u}/* 0F2B */, /*1748*/{0,135168u,504761345u,71303872u,16779952u,131073u,3221225472u}/* 0F2C */, /*1749*/{0,135168u,538316289u,71303872u,16779952u,131073u,3221225472u}/* 0F2D */, /*1750*/{0,135168u,571872257u,71303872u,16779952u,131073u,3221225472u}/* 0F2E */, /*1751*/{0,135168u,605426177u,71303872u,16779952u,131073u,3221225472u}/* 0F2F */, /*1752*/{0,135168u,638982145u,71303872u,16779952u,131073u,3221225472u}/* 0F30 */, /*1753*/{0,135168u,672537089u,71303872u,16779952u,131073u,3221225472u}/* 0F31 */, /*1754*/{0,135168u,706092545u,71303872u,16779952u,131073u,3221225472u}/* 0F32 */, /*1755*/{0,135168u,18219521u,71303872u,16779952u,131073u,3221225472u}/* 0F33 */, /*1756*/{0,135168u,1441792u,2957785472u,808714928u,2148598788u,3221225600u}/* 0F39 */, /*1757*/{0,135256u,1441793u,71959808u,13632180u,131072u,3222274048u}/* 0F3A */, /*1758*/{0,135264u,1441793u,71959872u,13632180u,131072u,3222274048u}/* 0F3B */, /*1759*/{0,135272u,1441793u,71959808u,13632180u,131072u,3222274048u}/* 0F3C */, /*1760*/{0,135280u,1441793u,71959872u,13632180u,131072u,3222274048u}/* 0F3D */, /*1761*/{0,135168u,1441792u,71318016u,808846000u,1180676u,3221225600u}/* 0F3E */, /*1762*/{242221056u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F43 */, /*1763*/{242745344u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F4D */, /*1764*/{243269632u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F52 */, /*1765*/{243793920u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F57 */, /*1766*/{244318208u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F5C */, /*1767*/{244842496u,135168u,1441792u,71326018u,9437296u,67503680u,192u}/* 0F69 */, /*1768*/{0,135168u,1441793u,75520320u,9437936u,132672u,3221225664u}/* 0F6A */, /*1769*/{0,135168u,1441793u,88103232u,9437936u,132672u,3221225664u}/* 0F6B */, /*1770*/{0,135168u,1441792u,2622241152u,808714992u,2147550212u,3489661056u}/* 0F71 */, /*1771*/{0,135168u,1441792u,2689350016u,808714992u,2147550212u,3489661056u}/* 0F72 */, /*1772*/{245366784u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F73 */, /*1773*/{0,135168u,1441792u,2756458880u,808714992u,2147550212u,3489661056u}/* 0F74 */, /*1774*/{245891072u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F75 */, /*1775*/{246415360u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F76 */, /*1776*/{246939648u,135168u,1441792u,72104324u,808714480u,2216756228u,2415919232u}/* 0F77 */, /*1777*/{247463936u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F78 */, /*1778*/{247988224u,135168u,1441792u,72104324u,808714480u,2216756228u,2415919232u}/* 0F79 */, /*1779*/{0,135168u,1441792u,72104320u,808714992u,2147550212u,3489661056u}/* 0F7E */, /*1780*/{0,135168u,1441792u,71318016u,3539696u,132100u,3489661056u}/* 0F7F */, /*1781*/{248512512u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F81 */, /*1782*/{0,135168u,1441792u,3427547520u,808714928u,2148598788u,3221225600u}/* 0F82 */, /*1783*/{0,135168u,1441792u,340539776u,808714928u,2148631556u,3221225600u}/* 0F84 */, /*1784*/{0,135168u,1441793u,92297536u,9437936u,132672u,3221225664u}/* 0F8C */, /*1785*/{0,135168u,1441792u,93075840u,808714992u,2147550212u,3489661056u}/* 0F8D */, /*1786*/{249036800u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F93 */, /*1787*/{0,135168u,1441792u,76298624u,808714992u,2147550212u,3489661056u}/* 0F96 */, /*1788*/{249561088u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0F9D */, /*1789*/{250085376u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0FA2 */, /*1790*/{250609664u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0FA7 */, /*1791*/{251133952u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0FAC */, /*1792*/{251658240u,135168u,1441792u,72104322u,808714352u,2214921220u,268435584u}/* 0FB9 */, /*1793*/{0,135168u,1441793u,75499200u,688u,131072u,3221258240u}/* 0FBE */, /*1794*/{0,135168u,1441792u,3096197504u,808714928u,2148598788u,3221225600u}/* 0FC6 */, /*1795*/{0,135168u,1441793u,88082112u,688u,131072u,3221258240u}/* 0FCE */, /*1796*/{0,135168u,1441793u,83887552u,688u,131072u,3222274048u}/* 0FD0 */, /*1797*/{0,135168u,1441793u,88081856u,688u,131072u,3222274048u}/* 0FD2 */, /*1798*/{0,135168u,65537u,90179264u,688u,131072u,3221258240u}/* 0FD5 */, /*1799*/{0,135168u,1441793u,92276160u,1342177968u,131072u,3222274048u}/* 0FD9 */, /*1800*/{0,139264u,1507329u,75497792u,9437936u,132672u,3221225664u}/* 1000 */, /*1801*/{0,139264u,1507329u,88080704u,9437936u,132672u,3221225664u}/* 1022 */, /*1802*/{252182528u,139264u,1507329u,75497794u,9437936u,132672u,192u}/* 1026 */, /*1803*/{0,139264u,1507328u,88095232u,3146480u,132100u,3489661056u}/* 102B */, /*1804*/{0,139264u,1507328u,75512320u,3146480u,132100u,3489661056u}/* 102C */, /*1805*/{0,139264u,1507328u,76298624u,3408624u,2147550212u,3489661056u}/* 102D */, /*1806*/{0,139264u,1507328u,76298624u,3409264u,2147550212u,3489661056u}/* 102E */, /*1807*/{0,139264u,1507328u,75512320u,3539696u,132100u,3489661056u}/* 1031 */, /*1808*/{0,139264u,1507328u,88881536u,3408624u,2147550212u,3489661056u}/* 1033 */, /*1809*/{0,139264u,1507328u,210516352u,3408560u,2148598788u,3221225600u}/* 1037 */, /*1810*/{0,139264u,1507328u,344734080u,3408560u,2148631556u,3221225600u}/* 1039 */, /*1811*/{0,139264u,1507328u,357316992u,3408560u,2148631556u,3221225600u}/* 103A */, /*1812*/{0,139264u,1507328u,88095232u,3539696u,132100u,3489661056u}/* 103B */, /*1813*/{0,139264u,35062785u,75528768u,44047024u,132097u,3221225600u}/* 1040 */, /*1814*/{0,139264u,454493697u,75528768u,44047024u,132097u,3221225600u}/* 1041 */, /*1815*/{0,139264u,488049153u,75528768u,44047024u,132097u,3221225600u}/* 1042 */, /*1816*/{0,139264u,521603073u,75528768u,44047024u,132097u,3221225600u}/* 1043 */, /*1817*/{0,139264u,555159553u,75528768u,44047024u,132097u,3221225600u}/* 1044 */, /*1818*/{0,139264u,588712961u,75528768u,44047024u,132097u,3221225600u}/* 1045 */, /*1819*/{0,139264u,622269953u,75528768u,44047024u,132097u,3221225600u}/* 1046 */, /*1820*/{0,139264u,655822337u,75528768u,44047024u,132097u,3221225600u}/* 1047 */, /*1821*/{0,139264u,689380353u,75528768u,44047024u,132097u,3221225600u}/* 1048 */, /*1822*/{0,139264u,722932737u,75528768u,44047024u,132097u,3221225600u}/* 1049 */, /*1823*/{0,139264u,1507329u,75498944u,12583600u,131072u,3222294528u}/* 104A */, /*1824*/{0,139264u,1507329u,75498944u,688u,131072u,3222274048u}/* 104C */, /*1825*/{0,139264u,1507328u,88095232u,3146416u,132100u,3221225600u}/* 1063 */, /*1826*/{0,139264u,1507328u,88095232u,3146416u,1180676u,3221225600u}/* 1087 */, /*1827*/{0,139264u,1507328u,3108780416u,3408560u,2148598788u,3221225600u}/* 108D */, /*1828*/{0,139264u,35062785u,88111680u,44047024u,132097u,3221225600u}/* 1090 */, /*1829*/{0,139264u,454493697u,88111680u,44047024u,132097u,3221225600u}/* 1091 */, /*1830*/{0,139264u,488049153u,88111680u,44047024u,132097u,3221225600u}/* 1092 */, /*1831*/{0,139264u,521603073u,88111680u,44047024u,132097u,3221225600u}/* 1093 */, /*1832*/{0,139264u,555159553u,88111680u,44047024u,132097u,3221225600u}/* 1094 */, /*1833*/{0,139264u,588712961u,88111680u,44047024u,132097u,3221225600u}/* 1095 */, /*1834*/{0,139264u,622269953u,88111680u,44047024u,132097u,3221225600u}/* 1096 */, /*1835*/{0,139264u,655822337u,88111680u,44047024u,132097u,3221225600u}/* 1097 */, /*1836*/{0,139264u,689380353u,88111680u,44047024u,132097u,3221225600u}/* 1098 */, /*1837*/{0,139264u,722932737u,88111680u,44047024u,132097u,3221225600u}/* 1099 */, /*1838*/{0,139264u,1507328u,90192384u,3146416u,1180676u,3221225600u}/* 109A */, /*1839*/{0,139264u,1507328u,90192384u,3146480u,132100u,3489661056u}/* 109C */, /*1840*/{0,139264u,1507328u,90978688u,3408624u,2147550212u,3489661056u}/* 109D */, /*1841*/{0,139264u,1507329u,88082112u,688u,131072u,3221258240u}/* 109E */, /*1842*/{122752u,1006776320u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A0 */, /*1843*/{122880u,1008873472u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A1 */, /*1844*/{123008u,1010970624u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A2 */, /*1845*/{123136u,1013067776u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A3 */, /*1846*/{123264u,1015164928u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A4 */, /*1847*/{123392u,1017262080u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A5 */, /*1848*/{123520u,1019359232u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A6 */, /*1849*/{123648u,1021456384u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A7 */, /*1850*/{123776u,1023553536u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A8 */, /*1851*/{123904u,1025650688u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10A9 */, /*1852*/{124032u,1027747840u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AA */, /*1853*/{124160u,1029844992u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AB */, /*1854*/{124288u,1031942144u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AC */, /*1855*/{124416u,1034039296u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AD */, /*1856*/{124544u,1036136448u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AE */, /*1857*/{124672u,1038233600u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10AF */, /*1858*/{124800u,1040330752u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B0 */, /*1859*/{124928u,1042427904u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B1 */, /*1860*/{125056u,1044525056u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B2 */, /*1861*/{125184u,1046622208u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B3 */, /*1862*/{125312u,1048719360u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B4 */, /*1863*/{125440u,1050816512u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B5 */, /*1864*/{125568u,1052913664u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B6 */, /*1865*/{125696u,1055010816u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B7 */, /*1866*/{125824u,1057107968u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B8 */, /*1867*/{125952u,1059205120u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10B9 */, /*1868*/{126080u,1061302272u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BA */, /*1869*/{126208u,1063399424u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BB */, /*1870*/{126336u,1065496576u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BC */, /*1871*/{126464u,1067593728u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BD */, /*1872*/{126592u,1069690880u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BE */, /*1873*/{126720u,1071788032u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10BF */, /*1874*/{126848u,1073885184u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C0 */, /*1875*/{126976u,1075982336u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C1 */, /*1876*/{127104u,1078079488u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C2 */, /*1877*/{127232u,1080176640u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C3 */, /*1878*/{127360u,1082273792u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C4 */, /*1879*/{127488u,1084370944u,1572865u,69228608u,8389361u,2080507488u,3221226688u}/* 10C5 */, /*1880*/{127616u,1086468096u,1572865u,94394432u,8389361u,2080507488u,3221226688u}/* 10C7 */, /*1881*/{127744u,1088565248u,1572865u,94394432u,8389361u,2080507488u,3221226688u}/* 10CD */, /*1882*/{0,143360u,1572865u,69228864u,9437936u,132672u,3221225664u}/* 10D0 */, /*1883*/{0,143360u,1572865u,79714624u,9437936u,132672u,3221225664u}/* 10F7 */, /*1884*/{0,143360u,1572865u,83908928u,9437936u,132672u,3221225664u}/* 10F9 */, /*1885*/{0,143360u,65537u,69207488u,688u,131072u,3222274048u}/* 10FB */, /*1886*/{252706816u,143360u,1572865u,83908884u,9437424u,2214725184u,2147483840u}/* 10FC */, /*1887*/{0,143360u,1572865u,94394688u,9437936u,132672u,3221225664u}/* 10FD */, /*1888*/{0,147456u,1638400u,69228864u,2962694896u,132672u,3221225664u}/* 1100 */, /*1889*/{0,147456u,1638400u,90200384u,2962694896u,132672u,3221225664u}/* 115A */, /*1890*/{0,147456u,1638400u,69228864u,2962694896u,71435840u,3355443392u}/* 115F */, /*1891*/{0,147456u,1638400u,69228864u,3231204080u,71435840u,3355443392u}/* 1160 */, /*1892*/{0,147456u,1638400u,69228864u,3231204720u,132672u,3221225664u}/* 1161 */, /*1893*/{0,147456u,1638400u,69228864u,3231204080u,132672u,3221225664u}/* 1176 */, /*1894*/{0,147456u,1638400u,90200384u,3231204080u,132672u,3221225664u}/* 11A3 */, /*1895*/{0,147456u,1638400u,69228864u,3499713904u,132672u,3221225664u}/* 11A8 */, /*1896*/{0,147456u,1638400u,69228864u,3499713264u,132672u,3221225664u}/* 11C3 */, /*1897*/{0,147456u,1638400u,90200384u,3499713264u,132672u,3221225664u}/* 11FA */, /*1898*/{0,151552u,1703937u,75520320u,9437936u,132672u,3221225664u}/* 1200 */, /*1899*/{0,151552u,1703937u,83908928u,9437936u,132672u,3221225664u}/* 1207 */, /*1900*/{0,151552u,1703936u,3448519040u,808714928u,2147550212u,3221225600u}/* 135D */, /*1901*/{0,151552u,1703936u,3440130432u,808714992u,2147550212u,3489661056u}/* 135F */, /*1902*/{0,151552u,1703937u,83887552u,688u,131072u,3222274048u}/* 1360 */, /*1903*/{0,151552u,1703937u,75498944u,688u,131072u,3222278144u}/* 1361 */, /*1904*/{0,151552u,1703937u,75498944u,12583600u,131072u,3222294528u}/* 1362 */, /*1905*/{0,151552u,454690305u,75498176u,33559216u,132097u,3254780032u}/* 1369 */, /*1906*/{0,151552u,488245761u,75498176u,33559216u,132097u,3254780032u}/* 136A */, /*1907*/{0,151552u,521799681u,75498176u,33559216u,132097u,3254780032u}/* 136B */, /*1908*/{0,151552u,555356161u,75498176u,33559216u,132097u,3254780032u}/* 136C */, /*1909*/{0,151552u,588909569u,75498176u,33559216u,132097u,3254780032u}/* 136D */, /*1910*/{0,151552u,622466561u,75498176u,33559216u,132097u,3254780032u}/* 136E */, /*1911*/{0,151552u,656018945u,75498176u,33559216u,132097u,3254780032u}/* 136F */, /*1912*/{0,151552u,689576961u,75498176u,33559216u,132097u,3254780032u}/* 1370 */, /*1913*/{0,151552u,723129345u,75498176u,33559216u,132097u,3254780032u}/* 1371 */, /*1914*/{0,151552u,739909633u,75498176u,33557168u,131073u,3221225472u}/* 1372 */, /*1915*/{0,151552u,907684865u,75498176u,33557168u,131073u,3221225472u}/* 1373 */, /*1916*/{0,151552u,1075462145u,75498176u,33557168u,131073u,3221225472u}/* 1374 */, /*1917*/{0,151552u,1243239425u,75498176u,33557168u,131073u,3221225472u}/* 1375 */, /*1918*/{0,151552u,1411016705u,75498176u,33557168u,131073u,3221225472u}/* 1376 */, /*1919*/{0,151552u,1427794433u,75498176u,33557168u,131073u,3221225472u}/* 1377 */, /*1920*/{0,151552u,1444572161u,75498176u,33557168u,131073u,3221225472u}/* 1378 */, /*1921*/{0,151552u,1461349889u,75498176u,33557168u,131073u,3221225472u}/* 1379 */, /*1922*/{0,151552u,1478127617u,75498176u,33557168u,131073u,3221225472u}/* 137A */, /*1923*/{0,151552u,1494905345u,75498176u,33557168u,131073u,3221225472u}/* 137B */, /*1924*/{0,151552u,1796904449u,75498176u,33557168u,131073u,3221225472u}/* 137C */, /*1925*/{0,155648u,1703937u,83908928u,9437936u,132672u,3221225664u}/* 1380 */, /*1926*/{0,155648u,1703937u,84543168u,688u,131072u,3221258240u}/* 1390 */, /*1927*/{127872u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A0 */, /*1928*/{128000u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A1 */, /*1929*/{128128u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A2 */, /*1930*/{128256u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A3 */, /*1931*/{128384u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A4 */, /*1932*/{128512u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A5 */, /*1933*/{128640u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A6 */, /*1934*/{128768u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A7 */, /*1935*/{128896u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A8 */, /*1936*/{129024u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13A9 */, /*1937*/{129152u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AA */, /*1938*/{129280u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AB */, /*1939*/{129408u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AC */, /*1940*/{129536u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AD */, /*1941*/{129664u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AE */, /*1942*/{129792u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13AF */, /*1943*/{129920u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B0 */, /*1944*/{130048u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B1 */, /*1945*/{130176u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B2 */, /*1946*/{130304u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B3 */, /*1947*/{130432u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B4 */, /*1948*/{130560u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B5 */, /*1949*/{130688u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B6 */, /*1950*/{130816u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B7 */, /*1951*/{130944u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B8 */, /*1952*/{131072u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13B9 */, /*1953*/{131200u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BA */, /*1954*/{131328u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BB */, /*1955*/{131456u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BC */, /*1956*/{131584u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BD */, /*1957*/{131712u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BE */, /*1958*/{131840u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13BF */, /*1959*/{131968u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C0 */, /*1960*/{132096u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C1 */, /*1961*/{132224u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C2 */, /*1962*/{132352u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C3 */, /*1963*/{132480u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C4 */, /*1964*/{132608u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C5 */, /*1965*/{132736u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C6 */, /*1966*/{132864u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C7 */, /*1967*/{132992u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C8 */, /*1968*/{133120u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13C9 */, /*1969*/{133248u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CA */, /*1970*/{133376u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CB */, /*1971*/{133504u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CC */, /*1972*/{133632u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CD */, /*1973*/{133760u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CE */, /*1974*/{133888u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13CF */, /*1975*/{134016u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D0 */, /*1976*/{134144u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D1 */, /*1977*/{134272u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D2 */, /*1978*/{134400u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D3 */, /*1979*/{134528u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D4 */, /*1980*/{134656u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D5 */, /*1981*/{134784u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D6 */, /*1982*/{134912u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D7 */, /*1983*/{135040u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D8 */, /*1984*/{135168u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13D9 */, /*1985*/{135296u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DA */, /*1986*/{135424u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DB */, /*1987*/{135552u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DC */, /*1988*/{135680u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DD */, /*1989*/{135808u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DE */, /*1990*/{135936u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13DF */, /*1991*/{136064u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E0 */, /*1992*/{136192u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E1 */, /*1993*/{136320u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E2 */, /*1994*/{136448u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E3 */, /*1995*/{136576u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E4 */, /*1996*/{136704u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E5 */, /*1997*/{136832u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E6 */, /*1998*/{136960u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E7 */, /*1999*/{137088u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E8 */, /*2000*/{137216u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13E9 */, /*2001*/{137344u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13EA */, /*2002*/{137472u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13EB */, /*2003*/{137600u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13EC */, /*2004*/{137728u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13ED */, /*2005*/{137856u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13EE */, /*2006*/{137984u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13EF */, /*2007*/{138112u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13F0 */, /*2008*/{138240u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13F1 */, /*2009*/{138368u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13F2 */, /*2010*/{138496u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13F3 */, /*2011*/{138624u,159744u,1769473u,75520064u,8389360u,1476527712u,3221226688u}/* 13F4 */, /*2012*/{138752u,159744u,1769473u,102783040u,8389360u,1476527712u,3221226688u}/* 13F5 */, /*2013*/{138880u,1090678784u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13F8 */, /*2014*/{139008u,1092775936u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13F9 */, /*2015*/{139136u,1094873088u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13FA */, /*2016*/{139264u,1096970240u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13FB */, /*2017*/{139392u,1099067392u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13FC */, /*2018*/{139520u,1101164544u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* 13FD */, /*2019*/{0,163840u,1835009u,90834112u,688u,8519680u,3222274048u}/* 1400 */, /*2020*/{0,163840u,1835009u,75520320u,9437936u,132672u,3221225664u}/* 1401 */, /*2021*/{0,163840u,1835009u,75498944u,688u,131072u,3222278144u}/* 166D */, /*2022*/{0,163840u,1835009u,75498944u,12583600u,131072u,3222294528u}/* 166E */, /*2023*/{0,163840u,1835009u,90200384u,9437936u,132672u,3221225664u}/* 1677 */, /*2024*/{0,167936u,1900545u,76088064u,6292144u,131072u,3221225760u}/* 1680 */, /*2025*/{0,167936u,1900545u,75520320u,9437936u,132672u,3221225664u}/* 1681 */, /*2026*/{0,168056u,1900545u,76154112u,13632180u,131072u,3222274048u}/* 169B */, /*2027*/{0,168064u,1900545u,76154176u,13632180u,131072u,3222274048u}/* 169C */, /*2028*/{0,172032u,1966081u,75520320u,9437936u,132672u,3221225664u}/* 16A0 */, /*2029*/{0,172032u,65537u,75498944u,688u,131072u,3222278144u}/* 16EB */, /*2030*/{0,172032u,857611777u,75520640u,42994416u,132609u,3221225664u}/* 16EE */, /*2031*/{0,172032u,874391553u,75520640u,42994416u,132609u,3221225664u}/* 16EF */, /*2032*/{0,172032u,891169281u,75520640u,42994416u,132609u,3221225664u}/* 16F0 */, /*2033*/{0,172032u,1966081u,100686144u,9437936u,132672u,3221225664u}/* 16F1 */, /*2034*/{0,176128u,2752513u,79714624u,9437936u,132672u,3221225664u}/* 1700 */, /*2035*/{0,176128u,2752512u,80492928u,808714992u,2147550212u,3489661056u}/* 1712 */, /*2036*/{0,176128u,2752512u,348928384u,808714928u,2147582980u,3221225600u}/* 1714 */, /*2037*/{0,180224u,2818049u,79714624u,9437936u,132672u,3221225664u}/* 1720 */, /*2038*/{0,180224u,2818048u,80492928u,808714992u,2147550212u,3489661056u}/* 1732 */, /*2039*/{0,180224u,2818048u,348928384u,808714928u,2147582980u,3221225600u}/* 1734 */, /*2040*/{0,180224u,65537u,79693248u,12583600u,131072u,3222294528u}/* 1735 */, /*2041*/{0,184320u,2883585u,79714624u,9437936u,132672u,3221225664u}/* 1740 */, /*2042*/{0,184320u,2883584u,80492928u,808714992u,2147550212u,3489661056u}/* 1752 */, /*2043*/{0,188416u,2949121u,79714624u,9437936u,132672u,3221225664u}/* 1760 */, /*2044*/{0,188416u,2949120u,80492928u,808714992u,2147550212u,3489661056u}/* 1772 */, /*2045*/{0,192512u,2031617u,75497792u,9437936u,132672u,3221225664u}/* 1780 */, /*2046*/{0,192512u,2031617u,75497792u,9437936u,2229824u,3221225664u}/* 17A3 */, /*2047*/{0,192512u,2031616u,76298624u,3408560u,2218853380u,3355443328u}/* 17B4 */, /*2048*/{0,192512u,2031616u,75512320u,3539696u,132100u,3489661056u}/* 17B6 */, /*2049*/{0,192512u,2031616u,76298624u,3408624u,2147550212u,3489661056u}/* 17B7 */, /*2050*/{0,192512u,2031616u,76298624u,3408560u,2148598788u,3221225600u}/* 17C9 */, /*2051*/{0,192512u,2031616u,344734080u,3408560u,2148631556u,3221225600u}/* 17D2 */, /*2052*/{0,192512u,2031617u,75498944u,688u,131072u,3222278144u}/* 17D4 */, /*2053*/{0,192512u,2031617u,75497728u,9437936u,2147616320u,3221225664u}/* 17D7 */, /*2054*/{0,192512u,2031617u,75498944u,688u,131072u,3222274048u}/* 17D8 */, /*2055*/{0,192512u,2031617u,75761216u,688u,131072u,3221258240u}/* 17DB */, /*2056*/{0,192512u,2031616u,3438033280u,3408560u,2148598788u,3221225600u}/* 17DD */, /*2057*/{0,192512u,35587073u,75528768u,44047024u,132097u,3221225600u}/* 17E0 */, /*2058*/{0,192512u,455017985u,75528768u,44047024u,132097u,3221225600u}/* 17E1 */, /*2059*/{0,192512u,488573441u,75528768u,44047024u,132097u,3221225600u}/* 17E2 */, /*2060*/{0,192512u,522127361u,75528768u,44047024u,132097u,3221225600u}/* 17E3 */, /*2061*/{0,192512u,555683841u,75528768u,44047024u,132097u,3221225600u}/* 17E4 */, /*2062*/{0,192512u,589237249u,75528768u,44047024u,132097u,3221225600u}/* 17E5 */, /*2063*/{0,192512u,622794241u,75528768u,44047024u,132097u,3221225600u}/* 17E6 */, /*2064*/{0,192512u,656346625u,75528768u,44047024u,132097u,3221225600u}/* 17E7 */, /*2065*/{0,192512u,689904641u,75528768u,44047024u,132097u,3221225600u}/* 17E8 */, /*2066*/{0,192512u,723457025u,75528768u,44047024u,132097u,3221225600u}/* 17E9 */, /*2067*/{0,192512u,35587073u,82444992u,33557168u,131073u,3221225472u}/* 17F0 */, /*2068*/{0,192512u,455017985u,82444992u,33557168u,131073u,3221225472u}/* 17F1 */, /*2069*/{0,192512u,488573441u,82444992u,33557168u,131073u,3221225472u}/* 17F2 */, /*2070*/{0,192512u,522127361u,82444992u,33557168u,131073u,3221225472u}/* 17F3 */, /*2071*/{0,192512u,555683841u,82444992u,33557168u,131073u,3221225472u}/* 17F4 */, /*2072*/{0,192512u,589237249u,82444992u,33557168u,131073u,3221225472u}/* 17F5 */, /*2073*/{0,192512u,622794241u,82444992u,33557168u,131073u,3221225472u}/* 17F6 */, /*2074*/{0,192512u,656346625u,82444992u,33557168u,131073u,3221225472u}/* 17F7 */, /*2075*/{0,192512u,689904641u,82444992u,33557168u,131073u,3221225472u}/* 17F8 */, /*2076*/{0,192512u,723457025u,82444992u,33557168u,131073u,3221225472u}/* 17F9 */, /*2077*/{0,196608u,2097153u,76154304u,688u,131072u,3222274048u}/* 1800 */, /*2078*/{0,196608u,65537u,76154304u,14680752u,131072u,3222278144u}/* 1802 */, /*2079*/{0,196608u,65537u,76154304u,12583600u,131072u,3222294528u}/* 1803 */, /*2080*/{0,196608u,2097153u,76154304u,688u,131072u,3222278144u}/* 1804 */, /*2081*/{0,196608u,65537u,76154304u,688u,131072u,3222278144u}/* 1805 */, /*2082*/{0,196608u,2097153u,76154048u,688u,8527872u,3222274048u}/* 1806 */, /*2083*/{0,196609u,2097153u,76154304u,688u,131072u,3222274048u}/* 1807 */, /*2084*/{0,196608u,2097153u,76154304u,14680752u,131072u,3222278144u}/* 1808 */, /*2085*/{0,196608u,2097153u,76154304u,12583600u,131072u,3222294528u}/* 1809 */, /*2086*/{0,196611u,2097153u,76154304u,688u,655360u,3222274048u}/* 180A */, /*2087*/{0,196608u,2097152u,76298624u,808714928u,2218853380u,3221226112u}/* 180B */, /*2088*/{0,196608u,2097153u,76237824u,1347617458u,2218786816u,3221225472u}/* 180E */, /*2089*/{0,196608u,35652609u,75528768u,44047024u,132097u,3221225600u}/* 1810 */, /*2090*/{0,196608u,455083521u,75528768u,44047024u,132097u,3221225600u}/* 1811 */, /*2091*/{0,196608u,488638977u,75528768u,44047024u,132097u,3221225600u}/* 1812 */, /*2092*/{0,196608u,522192897u,75528768u,44047024u,132097u,3221225600u}/* 1813 */, /*2093*/{0,196608u,555749377u,75528768u,44047024u,132097u,3221225600u}/* 1814 */, /*2094*/{0,196608u,589302785u,75528768u,44047024u,132097u,3221225600u}/* 1815 */, /*2095*/{0,196608u,622859777u,75528768u,44047024u,132097u,3221225600u}/* 1816 */, /*2096*/{0,196608u,656412161u,75528768u,44047024u,132097u,3221225600u}/* 1817 */, /*2097*/{0,196608u,689970177u,75528768u,44047024u,132097u,3221225600u}/* 1818 */, /*2098*/{0,196608u,723522561u,75528768u,44047024u,132097u,3221225600u}/* 1819 */, /*2099*/{0,196609u,2097153u,75520320u,9437936u,132672u,3221225664u}/* 1820 */, /*2100*/{0,196609u,2097153u,75520256u,9437936u,2148140608u,3221225664u}/* 1843 */, /*2101*/{0,196608u,2097153u,75520320u,9437936u,132672u,3221225664u}/* 1880 */, /*2102*/{0,196608u,2097152u,3364632960u,808714992u,2147550212u,3489661056u}/* 18A9 */, /*2103*/{0,196609u,2097153u,88103232u,9437936u,132672u,3221225664u}/* 18AA */, /*2104*/{0,200704u,1835009u,90200384u,9437936u,132672u,3221225664u}/* 18B0 */, /*2105*/{0,204800u,3014657u,81811776u,9437936u,132672u,3221225664u}/* 1900 */, /*2106*/{0,204800u,3014657u,100686144u,9437936u,132672u,3221225664u}/* 191D */, /*2107*/{0,204800u,3014656u,82590080u,808714992u,2147550212u,3489661056u}/* 1920 */, /*2108*/{0,204800u,3014656u,81803776u,808846064u,132100u,3489661056u}/* 1923 */, /*2109*/{0,204800u,3014656u,3169597824u,808714928u,2148598788u,3221225600u}/* 1939 */, /*2110*/{0,204800u,3014656u,3438033280u,808714928u,2148598788u,3221225600u}/* 193A */, /*2111*/{0,204800u,3014656u,3102488960u,808714928u,2148598788u,3221225600u}/* 193B */, /*2112*/{0,204800u,3014657u,82446016u,688u,131072u,3221258240u}/* 1940 */, /*2113*/{0,204800u,3014657u,82445760u,12583600u,131072u,3222294528u}/* 1944 */, /*2114*/{0,204800u,36570113u,81820224u,44047024u,132097u,3221225600u}/* 1946 */, /*2115*/{0,204800u,456001025u,81820224u,44047024u,132097u,3221225600u}/* 1947 */, /*2116*/{0,204800u,489556481u,81820224u,44047024u,132097u,3221225600u}/* 1948 */, /*2117*/{0,204800u,523110401u,81820224u,44047024u,132097u,3221225600u}/* 1949 */, /*2118*/{0,204800u,556666881u,81820224u,44047024u,132097u,3221225600u}/* 194A */, /*2119*/{0,204800u,590220289u,81820224u,44047024u,132097u,3221225600u}/* 194B */, /*2120*/{0,204800u,623777281u,81820224u,44047024u,132097u,3221225600u}/* 194C */, /*2121*/{0,204800u,657329665u,81820224u,44047024u,132097u,3221225600u}/* 194D */, /*2122*/{0,204800u,690887681u,81820224u,44047024u,132097u,3221225600u}/* 194E */, /*2123*/{0,204800u,724440065u,81820224u,44047024u,132097u,3221225600u}/* 194F */, /*2124*/{0,208896u,3080193u,81789248u,9437936u,132672u,3221225664u}/* 1950 */, /*2125*/{0,212992u,3670017u,83886400u,9437936u,132672u,3221225664u}/* 1980 */, /*2126*/{0,212992u,3670017u,90177856u,9437936u,132672u,3221225664u}/* 19AA */, /*2127*/{0,212992u,3670017u,83886400u,9437936u,132688u,3221225664u}/* 19B5 */, /*2128*/{0,212992u,37225473u,83917376u,44047024u,132097u,3221225600u}/* 19D0 */, /*2129*/{0,212992u,456656385u,83917376u,44047024u,132097u,3221225600u}/* 19D1 */, /*2130*/{0,212992u,490211841u,83917376u,44047024u,132097u,3221225600u}/* 19D2 */, /*2131*/{0,212992u,523765761u,83917376u,44047024u,132097u,3221225600u}/* 19D3 */, /*2132*/{0,212992u,557322241u,83917376u,44047024u,132097u,3221225600u}/* 19D4 */, /*2133*/{0,212992u,590875649u,83917376u,44047024u,132097u,3221225600u}/* 19D5 */, /*2134*/{0,212992u,624432641u,83917376u,44047024u,132097u,3221225600u}/* 19D6 */, /*2135*/{0,212992u,657985025u,83917376u,44047024u,132097u,3221225600u}/* 19D7 */, /*2136*/{0,212992u,691543041u,83917376u,44047024u,132097u,3221225600u}/* 19D8 */, /*2137*/{0,212992u,725095425u,83917376u,44047024u,132097u,3221225600u}/* 19D9 */, /*2138*/{0,212992u,456656385u,90178240u,33559216u,132097u,3254780032u}/* 19DA */, /*2139*/{0,212992u,3670017u,84543168u,688u,131072u,3221258240u}/* 19DE */, /*2140*/{0,217088u,2031617u,82446016u,688u,131072u,3221258240u}/* 19E0 */, /*2141*/{0,221184u,3538945u,83908928u,9437936u,132672u,3221225664u}/* 1A00 */, /*2142*/{0,221184u,3538944u,3440130432u,808714992u,2147550212u,3489661056u}/* 1A17 */, /*2143*/{0,221184u,3538944u,3104586112u,808714992u,2147550212u,3489661056u}/* 1A18 */, /*2144*/{0,221184u,3538944u,83900928u,808846064u,132100u,3489661056u}/* 1A19 */, /*2145*/{0,221184u,3538944u,84687232u,808714992u,2147550212u,3489661056u}/* 1A1B */, /*2146*/{0,221184u,3538945u,83887552u,688u,131072u,3222274048u}/* 1A1E */, /*2147*/{0,225280u,5111809u,90177856u,9437936u,132672u,3221225664u}/* 1A20 */, /*2148*/{0,225280u,5111808u,90192384u,3539696u,132100u,3489661056u}/* 1A55 */, /*2149*/{0,225280u,5111808u,90978688u,3408624u,2147550212u,3489661056u}/* 1A56 */, /*2150*/{0,225280u,5111808u,359414144u,3408560u,2147582980u,3221225600u}/* 1A60 */, /*2151*/{0,225280u,5111808u,90192384u,3146480u,132100u,3489661056u}/* 1A61 */, /*2152*/{0,225280u,5111808u,3446421888u,3408560u,2148598788u,3221225600u}/* 1A75 */, /*2153*/{0,225280u,5111808u,3110877568u,808714928u,2148598788u,3221225600u}/* 1A7F */, /*2154*/{0,225280u,38667265u,90208832u,44047024u,132097u,3221225600u}/* 1A80 */, /*2155*/{0,225280u,458098177u,90208832u,44047024u,132097u,3221225600u}/* 1A81 */, /*2156*/{0,225280u,491653633u,90208832u,44047024u,132097u,3221225600u}/* 1A82 */, /*2157*/{0,225280u,525207553u,90208832u,44047024u,132097u,3221225600u}/* 1A83 */, /*2158*/{0,225280u,558764033u,90208832u,44047024u,132097u,3221225600u}/* 1A84 */, /*2159*/{0,225280u,592317441u,90208832u,44047024u,132097u,3221225600u}/* 1A85 */, /*2160*/{0,225280u,625874433u,90208832u,44047024u,132097u,3221225600u}/* 1A86 */, /*2161*/{0,225280u,659426817u,90208832u,44047024u,132097u,3221225600u}/* 1A87 */, /*2162*/{0,225280u,692984833u,90208832u,44047024u,132097u,3221225600u}/* 1A88 */, /*2163*/{0,225280u,726537217u,90208832u,44047024u,132097u,3221225600u}/* 1A89 */, /*2164*/{0,225280u,5111809u,90179008u,688u,131072u,3222274048u}/* 1AA0 */, /*2165*/{0,225280u,5111809u,90177792u,9437936u,2148140608u,3221225664u}/* 1AA7 */, /*2166*/{0,225280u,5111809u,90179008u,12583600u,131072u,3222294528u}/* 1AA8 */, /*2167*/{0,229376u,2686976u,3456907648u,808714928u,2148598788u,3221225600u}/* 1AB0 */, /*2168*/{0,229376u,2686976u,3121363328u,808714928u,2148598788u,3221225600u}/* 1AB5 */, /*2169*/{0,229376u,2686976u,101464512u,808714928u,2147549188u,3221225472u}/* 1ABE */, /*2170*/{0,233472u,4063232u,86784384u,808714992u,2147550212u,3489661056u}/* 1B00 */, /*2171*/{0,233472u,4063232u,85998080u,808846064u,132100u,3489661056u}/* 1B04 */, /*2172*/{0,233472u,4063233u,86006080u,9437936u,132672u,3221225664u}/* 1B05 */, /*2173*/{253231104u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B06 */, /*2174*/{253755392u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B08 */, /*2175*/{254279680u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B0A */, /*2176*/{254803968u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B0C */, /*2177*/{255328256u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B0E */, /*2178*/{255852544u,233472u,4063233u,86006082u,9437936u,132672u,192u}/* 1B12 */, /*2179*/{0,233472u,4063232u,221002112u,808714928u,2148598788u,3221225600u}/* 1B34 */, /*2180*/{0,233472u,4063232u,85998080u,808846704u,132100u,3489661056u}/* 1B35 */, /*2181*/{256376832u,233472u,4063232u,85998082u,808846064u,132100u,268435584u}/* 1B3B */, /*2182*/{256901120u,233472u,4063232u,85998082u,808846064u,132100u,268435584u}/* 1B3D */, /*2183*/{257425408u,233472u,4063232u,85998082u,808846064u,132100u,268435584u}/* 1B40 */, /*2184*/{257949696u,233472u,4063232u,85998082u,808846064u,132100u,268435584u}/* 1B41 */, /*2185*/{258473984u,233472u,4063232u,85998082u,808846064u,132100u,268435584u}/* 1B43 */, /*2186*/{0,233472u,4063232u,354433536u,808846000u,1213444u,3221225600u}/* 1B44 */, /*2187*/{0,233472u,37618689u,86014528u,44047024u,132097u,3221225600u}/* 1B50 */, /*2188*/{0,233472u,457049601u,86014528u,44047024u,132097u,3221225600u}/* 1B51 */, /*2189*/{0,233472u,490605057u,86014528u,44047024u,132097u,3221225600u}/* 1B52 */, /*2190*/{0,233472u,524158977u,86014528u,44047024u,132097u,3221225600u}/* 1B53 */, /*2191*/{0,233472u,557715457u,86014528u,44047024u,132097u,3221225600u}/* 1B54 */, /*2192*/{0,233472u,591268865u,86014528u,44047024u,132097u,3221225600u}/* 1B55 */, /*2193*/{0,233472u,624825857u,86014528u,44047024u,132097u,3221225600u}/* 1B56 */, /*2194*/{0,233472u,658378241u,86014528u,44047024u,132097u,3221225600u}/* 1B57 */, /*2195*/{0,233472u,691936257u,86014528u,44047024u,132097u,3221225600u}/* 1B58 */, /*2196*/{0,233472u,725488641u,86014528u,44047024u,132097u,3221225600u}/* 1B59 */, /*2197*/{0,233472u,4063233u,85984704u,12583600u,131072u,3222294528u}/* 1B5A */, /*2198*/{0,233472u,4063233u,85984704u,688u,131072u,3222274048u}/* 1B5C */, /*2199*/{0,233472u,4063233u,85984704u,688u,131072u,3222278144u}/* 1B5D */, /*2200*/{0,233472u,4063233u,85984960u,688u,131072u,3221258240u}/* 1B61 */, /*2201*/{0,233472u,4063232u,3442227584u,808714928u,2148598788u,3221225600u}/* 1B6B */, /*2202*/{0,233472u,4063232u,3106683264u,808714928u,2148598788u,3221225600u}/* 1B6C */, /*2203*/{0,237568u,4390912u,88881536u,808714992u,2147550212u,3489661056u}/* 1B80 */, /*2204*/{0,237568u,4390912u,88095232u,808846064u,132100u,3489661056u}/* 1B82 */, /*2205*/{0,237568u,4390913u,88103232u,9437936u,132672u,3221225664u}/* 1B83 */, /*2206*/{0,237568u,4390912u,356530688u,808846000u,1213444u,3221225600u}/* 1BAA */, /*2207*/{0,237568u,4390912u,363608448u,808714928u,2148631556u,3221225600u}/* 1BAB */, /*2208*/{0,237568u,4390912u,95172992u,808714992u,2147550212u,3489661056u}/* 1BAC */, /*2209*/{0,237568u,37946369u,88111680u,44047024u,132097u,3221225600u}/* 1BB0 */, /*2210*/{0,237568u,457377281u,88111680u,44047024u,132097u,3221225600u}/* 1BB1 */, /*2211*/{0,237568u,490932737u,88111680u,44047024u,132097u,3221225600u}/* 1BB2 */, /*2212*/{0,237568u,524486657u,88111680u,44047024u,132097u,3221225600u}/* 1BB3 */, /*2213*/{0,237568u,558043137u,88111680u,44047024u,132097u,3221225600u}/* 1BB4 */, /*2214*/{0,237568u,591596545u,88111680u,44047024u,132097u,3221225600u}/* 1BB5 */, /*2215*/{0,237568u,625153537u,88111680u,44047024u,132097u,3221225600u}/* 1BB6 */, /*2216*/{0,237568u,658705921u,88111680u,44047024u,132097u,3221225600u}/* 1BB7 */, /*2217*/{0,237568u,692263937u,88111680u,44047024u,132097u,3221225600u}/* 1BB8 */, /*2218*/{0,237568u,725816321u,88111680u,44047024u,132097u,3221225600u}/* 1BB9 */, /*2219*/{0,237568u,4390913u,94394688u,9437936u,132672u,3221225664u}/* 1BBA */, /*2220*/{0,241664u,6094849u,92297536u,9437936u,132672u,3221225664u}/* 1BC0 */, /*2221*/{0,241664u,6094848u,227293568u,808714928u,2147550212u,3221225600u}/* 1BE6 */, /*2222*/{0,241664u,6094848u,92289536u,808846064u,132100u,3489661056u}/* 1BE7 */, /*2223*/{0,241664u,6094848u,93075840u,808714992u,2147550212u,3489661056u}/* 1BE8 */, /*2224*/{0,241664u,6094848u,360724992u,808846000u,164868u,3221225600u}/* 1BF2 */, /*2225*/{0,241664u,6094849u,92276160u,688u,131072u,3222274048u}/* 1BFC */, /*2226*/{0,245760u,4456449u,88103232u,9437936u,132672u,3221225664u}/* 1C00 */, /*2227*/{0,245760u,4456448u,88095232u,808846064u,132100u,3489661056u}/* 1C24 */, /*2228*/{0,245760u,4456448u,88881536u,808714992u,2147550212u,3489661056u}/* 1C2C */, /*2229*/{0,245760u,4456448u,88881536u,808714928u,2149123076u,3221225600u}/* 1C36 */, /*2230*/{0,245760u,4456448u,223099264u,808714928u,2148598788u,3221225600u}/* 1C37 */, /*2231*/{0,245760u,4456449u,88081856u,12583600u,131072u,3222294528u}/* 1C3B */, /*2232*/{0,245760u,4456449u,88081856u,688u,131072u,3222278144u}/* 1C3D */, /*2233*/{0,245760u,38011905u,88111680u,44047024u,132097u,3221225600u}/* 1C40 */, /*2234*/{0,245760u,457442817u,88111680u,44047024u,132097u,3221225600u}/* 1C41 */, /*2235*/{0,245760u,490998273u,88111680u,44047024u,132097u,3221225600u}/* 1C42 */, /*2236*/{0,245760u,524552193u,88111680u,44047024u,132097u,3221225600u}/* 1C43 */, /*2237*/{0,245760u,558108673u,88111680u,44047024u,132097u,3221225600u}/* 1C44 */, /*2238*/{0,245760u,591662081u,88111680u,44047024u,132097u,3221225600u}/* 1C45 */, /*2239*/{0,245760u,625219073u,88111680u,44047024u,132097u,3221225600u}/* 1C46 */, /*2240*/{0,245760u,658771457u,88111680u,44047024u,132097u,3221225600u}/* 1C47 */, /*2241*/{0,245760u,692329473u,88111680u,44047024u,132097u,3221225600u}/* 1C48 */, /*2242*/{0,245760u,725881857u,88111680u,44047024u,132097u,3221225600u}/* 1C49 */, /*2243*/{0,249856u,38077441u,88111680u,44047024u,132097u,3221225600u}/* 1C50 */, /*2244*/{0,249856u,457508353u,88111680u,44047024u,132097u,3221225600u}/* 1C51 */, /*2245*/{0,249856u,491063809u,88111680u,44047024u,132097u,3221225600u}/* 1C52 */, /*2246*/{0,249856u,524617729u,88111680u,44047024u,132097u,3221225600u}/* 1C53 */, /*2247*/{0,249856u,558174209u,88111680u,44047024u,132097u,3221225600u}/* 1C54 */, /*2248*/{0,249856u,591727617u,88111680u,44047024u,132097u,3221225600u}/* 1C55 */, /*2249*/{0,249856u,625284609u,88111680u,44047024u,132097u,3221225600u}/* 1C56 */, /*2250*/{0,249856u,658836993u,88111680u,44047024u,132097u,3221225600u}/* 1C57 */, /*2251*/{0,249856u,692395009u,88111680u,44047024u,132097u,3221225600u}/* 1C58 */, /*2252*/{0,249856u,725947393u,88111680u,44047024u,132097u,3221225600u}/* 1C59 */, /*2253*/{0,249856u,4521985u,88103232u,9437936u,132672u,3221225664u}/* 1C5A */, /*2254*/{0,249856u,4521985u,88103168u,9437936u,2148664896u,3221225664u}/* 1C78 */, /*2255*/{0,249856u,4521985u,88103168u,9437936u,2149189184u,3221225664u}/* 1C7B */, /*2256*/{0,249856u,4521985u,88081856u,12583600u,131072u,3222294528u}/* 1C7E */, /*2257*/{0,253952u,4390913u,94373312u,688u,131072u,3222274048u}/* 1CC0 */, /*2258*/{0,258048u,2686976u,3446421888u,808714928u,2148598788u,3221225600u}/* 1CD0 */, /*2259*/{0,258048u,65537u,90179008u,688u,1179648u,3222274048u}/* 1CD3 */, /*2260*/{0,258048u,2686976u,158087552u,808714928u,2148598788u,3221225600u}/* 1CD4 */, /*2261*/{0,258048u,2686976u,3110877568u,808714928u,2148598788u,3221225600u}/* 1CD5 */, /*2262*/{0,258048u,65536u,90192384u,808846000u,1180676u,3221225600u}/* 1CE1 */, /*2263*/{0,258048u,65537u,90200384u,9437936u,132672u,3221225664u}/* 1CE9 */, /*2264*/{0,258048u,65536u,90192384u,808846064u,132100u,3489661056u}/* 1CF2 */, /*2265*/{0,258048u,65536u,94386688u,808846064u,132100u,3489661056u}/* 1CF3 */, /*2266*/{0,258048u,2686976u,3450616192u,808714928u,2148598788u,3221225600u}/* 1CF4 */, /*2267*/{0,258048u,65537u,94394688u,9437936u,132672u,3221225664u}/* 1CF5 */, /*2268*/{0,258048u,2686976u,3456907648u,808714928u,2148598788u,3221225600u}/* 1CF8 */, /*2269*/{0,262144u,131073u,81811584u,7340784u,1073874536u,3221225664u}/* 1D00 */, /*2270*/{0,262144u,196609u,81811584u,7340784u,1073874536u,3221225664u}/* 1D26 */, /*2271*/{0,262144u,262145u,81811584u,7340784u,1073874536u,3221225664u}/* 1D2B */, /*2272*/{258998272u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D2C */, /*2273*/{259522560u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D2D */, /*2274*/{260046848u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D2E */, /*2275*/{0,262144u,131073u,81811712u,7340784u,3222406728u,3229614272u}/* 1D2F */, /*2276*/{260571136u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D30 */, /*2277*/{261095424u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D31 */, /*2278*/{261619712u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D32 */, /*2279*/{262144000u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D33 */, /*2280*/{262668288u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D34 */, /*2281*/{263192576u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D35 */, /*2282*/{263716864u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D36 */, /*2283*/{264241152u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D37 */, /*2284*/{264765440u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D38 */, /*2285*/{265289728u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D39 */, /*2286*/{265814016u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D3A */, /*2287*/{266338304u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D3C */, /*2288*/{266862592u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D3D */, /*2289*/{267386880u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D3E */, /*2290*/{267911168u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D3F */, /*2291*/{268435456u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D40 */, /*2292*/{268959744u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D41 */, /*2293*/{269484032u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D42 */, /*2294*/{270008320u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D43 */, /*2295*/{270532608u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D44 */, /*2296*/{271056896u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D45 */, /*2297*/{271581184u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D46 */, /*2298*/{272105472u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D47 */, /*2299*/{272629760u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D48 */, /*2300*/{273154048u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D49 */, /*2301*/{273678336u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D4A */, /*2302*/{274202624u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D4B */, /*2303*/{274726912u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D4C */, /*2304*/{275251200u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D4D */, /*2305*/{275775488u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D4F */, /*2306*/{276299776u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D50 */, /*2307*/{276824064u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D51 */, /*2308*/{277348352u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D52 */, /*2309*/{277872640u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D53 */, /*2310*/{278396928u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D54 */, /*2311*/{278921216u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D55 */, /*2312*/{279445504u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D56 */, /*2313*/{279969792u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D57 */, /*2314*/{280494080u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D58 */, /*2315*/{281018368u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D59 */, /*2316*/{281542656u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5A */, /*2317*/{282066944u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5B */, /*2318*/{282591232u,262144u,131073u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5C */, /*2319*/{283115520u,262144u,196609u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5D */, /*2320*/{283639808u,262144u,196609u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5E */, /*2321*/{284164096u,262144u,196609u,81811732u,7340272u,3289515592u,2155872448u}/* 1D5F */, /*2322*/{284688384u,262144u,196609u,81811732u,7340272u,3289515592u,2155872448u}/* 1D60 */, /*2323*/{285212672u,262144u,196609u,81811732u,7340272u,3289515592u,2155872448u}/* 1D61 */, /*2324*/{285736960u,262144u,131073u,81811734u,7340272u,3289515592u,2155880640u}/* 1D62 */, /*2325*/{286261248u,262144u,131073u,81811734u,7340272u,3289515592u,2155872448u}/* 1D63 */, /*2326*/{286785536u,262144u,131073u,81811734u,7340272u,3289515592u,2155872448u}/* 1D64 */, /*2327*/{287309824u,262144u,131073u,81811734u,7340272u,3289515592u,2155872448u}/* 1D65 */, /*2328*/{287834112u,262144u,196609u,81811734u,7340272u,3289515592u,2155872448u}/* 1D66 */, /*2329*/{288358400u,262144u,196609u,81811734u,7340272u,3289515592u,2155872448u}/* 1D67 */, /*2330*/{288882688u,262144u,196609u,81811734u,7340272u,3289515592u,2155872448u}/* 1D68 */, /*2331*/{289406976u,262144u,196609u,81811734u,7340272u,3289515592u,2155872448u}/* 1D69 */, /*2332*/{289931264u,262144u,196609u,81811734u,7340272u,3289515592u,2155872448u}/* 1D6A */, /*2333*/{0,262144u,131073u,83908736u,7340784u,1073874536u,3221225664u}/* 1D6C */, /*2334*/{290455552u,262144u,262145u,83908884u,7340272u,3288467016u,2155872448u}/* 1D78 */, /*2335*/{139648u,262144u,131073u,83908736u,7340784u,1392641640u,3221225664u}/* 1D79 */, /*2336*/{139776u,262144u,131073u,83908736u,7340784u,1392641640u,3221225664u}/* 1D7D */, /*2337*/{0,266240u,131073u,83908736u,7340784u,1073874536u,3221225664u}/* 1D80 */, /*2338*/{0,266240u,131073u,83908736u,7340784u,1073874536u,3221233856u}/* 1D96 */, /*2339*/{290979840u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1D9B */, /*2340*/{291504128u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1D9C */, /*2341*/{292028416u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1D9D */, /*2342*/{292552704u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1D9E */, /*2343*/{293076992u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1D9F */, /*2344*/{293601280u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA0 */, /*2345*/{294125568u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA1 */, /*2346*/{294649856u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA2 */, /*2347*/{295174144u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA3 */, /*2348*/{295698432u,266240u,131073u,83908884u,7340272u,3288467016u,2155880640u}/* 1DA4 */, /*2349*/{296222720u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA5 */, /*2350*/{296747008u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA6 */, /*2351*/{297271296u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA7 */, /*2352*/{297795584u,266240u,131073u,83908884u,7340272u,3288467016u,2155880640u}/* 1DA8 */, /*2353*/{298319872u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DA9 */, /*2354*/{298844160u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAA */, /*2355*/{299368448u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAB */, /*2356*/{299892736u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAC */, /*2357*/{300417024u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAD */, /*2358*/{300941312u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAE */, /*2359*/{301465600u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DAF */, /*2360*/{301989888u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB0 */, /*2361*/{302514176u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB1 */, /*2362*/{303038464u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB2 */, /*2363*/{303562752u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB3 */, /*2364*/{304087040u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB4 */, /*2365*/{304611328u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB5 */, /*2366*/{305135616u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB6 */, /*2367*/{305659904u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB7 */, /*2368*/{306184192u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB8 */, /*2369*/{306708480u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DB9 */, /*2370*/{307232768u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBA */, /*2371*/{307757056u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBB */, /*2372*/{308281344u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBC */, /*2373*/{308805632u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBD */, /*2374*/{309329920u,266240u,131073u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBE */, /*2375*/{309854208u,266240u,196609u,83908884u,7340272u,3288467016u,2155872448u}/* 1DBF */, /*2376*/{0,270336u,2686976u,3440130432u,808714928u,2147550212u,3221225600u}/* 1DC0 */, /*2377*/{0,270336u,2686976u,3104586112u,808714928u,2147550212u,3221225600u}/* 1DC2 */, /*2378*/{0,270336u,2686976u,3442227584u,808714928u,2148598788u,3221225600u}/* 1DC4 */, /*2379*/{0,270336u,2686976u,3106683264u,808714928u,2148598788u,3221225600u}/* 1DCA */, /*2380*/{0,270336u,2686976u,3444324736u,808714928u,2148598788u,3221225600u}/* 1DCB */, /*2381*/{0,270336u,2686976u,3645651328u,808714928u,2148598788u,3221225600u}/* 1DCD */, /*2382*/{0,270336u,2686976u,2907453824u,808714928u,2148598788u,3221225600u}/* 1DCE */, /*2383*/{0,270336u,2686976u,3108780416u,808714928u,2148598788u,3221225600u}/* 1DCF */, /*2384*/{0,270336u,2686976u,2840344960u,808714928u,2147550212u,3221225600u}/* 1DD0 */, /*2385*/{0,270336u,2686976u,3444324736u,808714928u,2147550212u,3221225600u}/* 1DD1 */, /*2386*/{0,270336u,2686976u,3456907648u,808714992u,2147550212u,3489661056u}/* 1DE7 */, /*2387*/{0,270336u,2686976u,3456907648u,808714928u,2148598788u,3221225600u}/* 1DF5 */, /*2388*/{0,270336u,2686976u,3582736768u,808714928u,2147550212u,3221225600u}/* 1DFC */, /*2389*/{0,270336u,2686976u,3110877568u,808714928u,2148598788u,3221225600u}/* 1DFD */, /*2390*/{310518400u,1103376384u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E00 */, /*2391*/{311042816u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E01 */, /*2392*/{311567232u,1105473536u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E02 */, /*2393*/{312091648u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E03 */, /*2394*/{312616064u,1107570688u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E04 */, /*2395*/{313140480u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E05 */, /*2396*/{313664896u,1109667840u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E06 */, /*2397*/{314189312u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E07 */, /*2398*/{314713728u,1111764992u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E08 */, /*2399*/{315238144u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E09 */, /*2400*/{315762560u,1113862144u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E0A */, /*2401*/{316286976u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E0B */, /*2402*/{316811392u,1115959296u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E0C */, /*2403*/{317335808u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E0D */, /*2404*/{317860224u,1118056448u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E0E */, /*2405*/{318384640u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E0F */, /*2406*/{318909056u,1120153600u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E10 */, /*2407*/{319433472u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E11 */, /*2408*/{319957888u,1122250752u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E12 */, /*2409*/{320482304u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E13 */, /*2410*/{321006720u,1124347904u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E14 */, /*2411*/{321531136u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E15 */, /*2412*/{322055552u,1126445056u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E16 */, /*2413*/{322579968u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E17 */, /*2414*/{323104384u,1128542208u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E18 */, /*2415*/{323628800u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E19 */, /*2416*/{324153216u,1130639360u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E1A */, /*2417*/{324677632u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E1B */, /*2418*/{325202048u,1132736512u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E1C */, /*2419*/{325726464u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E1D */, /*2420*/{326250880u,1134833664u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E1E */, /*2421*/{326775296u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E1F */, /*2422*/{327299712u,1136930816u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E20 */, /*2423*/{327824128u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E21 */, /*2424*/{328348544u,1139027968u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E22 */, /*2425*/{328872960u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E23 */, /*2426*/{329397376u,1141125120u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E24 */, /*2427*/{329921792u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E25 */, /*2428*/{330446208u,1143222272u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E26 */, /*2429*/{330970624u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E27 */, /*2430*/{331495040u,1145319424u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E28 */, /*2431*/{332019456u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E29 */, /*2432*/{332543872u,1147416576u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E2A */, /*2433*/{333068288u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E2B */, /*2434*/{333592704u,1149513728u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E2C */, /*2435*/{334117120u,274432u,131073u,69228674u,7340784u,1392641640u,8384u}/* 1E2D */, /*2436*/{334641536u,1151610880u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E2E */, /*2437*/{335165952u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E2F */, /*2438*/{335690368u,1153708032u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E30 */, /*2439*/{336214784u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E31 */, /*2440*/{336739200u,1155805184u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E32 */, /*2441*/{337263616u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E33 */, /*2442*/{337788032u,1157902336u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E34 */, /*2443*/{338312448u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E35 */, /*2444*/{338836864u,1159999488u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E36 */, /*2445*/{339361280u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E37 */, /*2446*/{339885696u,1162096640u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E38 */, /*2447*/{340410112u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E39 */, /*2448*/{340934528u,1164193792u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E3A */, /*2449*/{341458944u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E3B */, /*2450*/{341983360u,1166290944u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E3C */, /*2451*/{342507776u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E3D */, /*2452*/{343032192u,1168388096u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E3E */, /*2453*/{343556608u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E3F */, /*2454*/{344081024u,1170485248u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E40 */, /*2455*/{344605440u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E41 */, /*2456*/{345129856u,1172582400u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E42 */, /*2457*/{345654272u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E43 */, /*2458*/{346178688u,1174679552u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E44 */, /*2459*/{346703104u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E45 */, /*2460*/{347227520u,1176776704u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E46 */, /*2461*/{347751936u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E47 */, /*2462*/{348276352u,1178873856u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E48 */, /*2463*/{348800768u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E49 */, /*2464*/{349325184u,1180971008u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E4A */, /*2465*/{349849600u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E4B */, /*2466*/{350374016u,1183068160u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E4C */, /*2467*/{350898432u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E4D */, /*2468*/{351422848u,1185165312u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E4E */, /*2469*/{351947264u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E4F */, /*2470*/{352471680u,1187262464u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E50 */, /*2471*/{352996096u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E51 */, /*2472*/{353520512u,1189359616u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E52 */, /*2473*/{354044928u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E53 */, /*2474*/{354569344u,1191456768u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E54 */, /*2475*/{355093760u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E55 */, /*2476*/{355618176u,1193553920u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E56 */, /*2477*/{356142592u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E57 */, /*2478*/{356667008u,1195651072u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E58 */, /*2479*/{357191424u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E59 */, /*2480*/{357715840u,1197748224u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E5A */, /*2481*/{358240256u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E5B */, /*2482*/{358764672u,1199845376u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E5C */, /*2483*/{359289088u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E5D */, /*2484*/{359813504u,1201942528u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E5E */, /*2485*/{360337920u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E5F */, /*2486*/{360862336u,1204039680u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E60 */, /*2487*/{361386752u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E61 */, /*2488*/{361911168u,1206136832u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E62 */, /*2489*/{362435584u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E63 */, /*2490*/{362960000u,1208233984u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E64 */, /*2491*/{363484416u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E65 */, /*2492*/{364008832u,1210331136u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E66 */, /*2493*/{364533248u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E67 */, /*2494*/{365057664u,1212428288u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E68 */, /*2495*/{365582080u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E69 */, /*2496*/{366106496u,1214525440u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E6A */, /*2497*/{366630912u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E6B */, /*2498*/{367155328u,1216622592u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E6C */, /*2499*/{367679744u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E6D */, /*2500*/{368204160u,1218719744u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E6E */, /*2501*/{368728576u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E6F */, /*2502*/{369252992u,1220816896u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E70 */, /*2503*/{369777408u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E71 */, /*2504*/{370301824u,1222914048u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E72 */, /*2505*/{370826240u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E73 */, /*2506*/{371350656u,1225011200u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E74 */, /*2507*/{371875072u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E75 */, /*2508*/{372399488u,1227108352u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E76 */, /*2509*/{372923904u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E77 */, /*2510*/{373448320u,1229205504u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E78 */, /*2511*/{373972736u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E79 */, /*2512*/{374497152u,1231302656u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E7A */, /*2513*/{375021568u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E7B */, /*2514*/{375545984u,1233399808u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E7C */, /*2515*/{376070400u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E7D */, /*2516*/{376594816u,1235496960u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E7E */, /*2517*/{377119232u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E7F */, /*2518*/{377643648u,1237594112u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E80 */, /*2519*/{378168064u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E81 */, /*2520*/{378692480u,1239691264u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E82 */, /*2521*/{379216896u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E83 */, /*2522*/{379741312u,1241788416u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E84 */, /*2523*/{380265728u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E85 */, /*2524*/{380790144u,1243885568u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E86 */, /*2525*/{381314560u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E87 */, /*2526*/{381838976u,1245982720u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E88 */, /*2527*/{382363392u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E89 */, /*2528*/{382887808u,1248079872u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E8A */, /*2529*/{383412224u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E8B */, /*2530*/{383936640u,1250177024u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E8C */, /*2531*/{384461056u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E8D */, /*2532*/{384985472u,1252274176u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E8E */, /*2533*/{385509888u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E8F */, /*2534*/{386034304u,1254371328u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E90 */, /*2535*/{386558720u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E91 */, /*2536*/{387083136u,1256468480u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E92 */, /*2537*/{387607552u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E93 */, /*2538*/{388131968u,1258565632u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1E94 */, /*2539*/{388656384u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E95 */, /*2540*/{389021716u,17051648u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E96 */, /*2541*/{389546005u,19148800u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E97 */, /*2542*/{390070294u,21245952u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E98 */, /*2543*/{390594583u,23343104u,131073u,69228674u,7340784u,1392641640u,192u}/* 1E99 */, /*2544*/{391118872u,25440256u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* 1E9A */, /*2545*/{391802240u,1260662784u,131073u,71325826u,7340273u,1996621416u,192u}/* 1E9B */, /*2546*/{0,274432u,131073u,88103040u,7340784u,1073874536u,3221225664u}/* 1E9C */, /*2547*/{159232u,27537408u,131073u,88102976u,8389360u,2080507488u,3221226688u}/* 1E9E */, /*2548*/{392326784u,1262759936u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EA0 */, /*2549*/{392851200u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EA1 */, /*2550*/{393375616u,1264857088u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EA2 */, /*2551*/{393900032u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EA3 */, /*2552*/{394424448u,1266954240u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EA4 */, /*2553*/{394948864u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EA5 */, /*2554*/{395473280u,1269051392u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EA6 */, /*2555*/{395997696u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EA7 */, /*2556*/{396522112u,1271148544u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EA8 */, /*2557*/{397046528u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EA9 */, /*2558*/{397570944u,1273245696u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EAA */, /*2559*/{398095360u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EAB */, /*2560*/{398619776u,1275342848u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EAC */, /*2561*/{399144192u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EAD */, /*2562*/{399668608u,1277440000u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EAE */, /*2563*/{400193024u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EAF */, /*2564*/{400717440u,1279537152u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EB0 */, /*2565*/{401241856u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EB1 */, /*2566*/{401766272u,1281634304u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EB2 */, /*2567*/{402290688u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EB3 */, /*2568*/{402815104u,1283731456u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EB4 */, /*2569*/{403339520u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EB5 */, /*2570*/{403863936u,1285828608u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EB6 */, /*2571*/{404388352u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EB7 */, /*2572*/{404912768u,1287925760u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EB8 */, /*2573*/{405437184u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EB9 */, /*2574*/{405961600u,1290022912u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EBA */, /*2575*/{406486016u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EBB */, /*2576*/{407010432u,1292120064u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EBC */, /*2577*/{407534848u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EBD */, /*2578*/{408059264u,1294217216u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EBE */, /*2579*/{408583680u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EBF */, /*2580*/{409108096u,1296314368u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EC0 */, /*2581*/{409632512u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EC1 */, /*2582*/{410156928u,1298411520u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EC2 */, /*2583*/{410681344u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EC3 */, /*2584*/{411205760u,1300508672u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EC4 */, /*2585*/{411730176u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EC5 */, /*2586*/{412254592u,1302605824u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EC6 */, /*2587*/{412779008u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EC7 */, /*2588*/{413303424u,1304702976u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EC8 */, /*2589*/{413827840u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EC9 */, /*2590*/{414352256u,1306800128u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ECA */, /*2591*/{414876672u,274432u,131073u,69228674u,7340784u,1392641640u,8384u}/* 1ECB */, /*2592*/{415401088u,1308897280u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ECC */, /*2593*/{415925504u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ECD */, /*2594*/{416449920u,1310994432u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ECE */, /*2595*/{416974336u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ECF */, /*2596*/{417498752u,1313091584u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ED0 */, /*2597*/{418023168u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ED1 */, /*2598*/{418547584u,1315188736u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ED2 */, /*2599*/{419072000u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ED3 */, /*2600*/{419596416u,1317285888u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ED4 */, /*2601*/{420120832u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ED5 */, /*2602*/{420645248u,1319383040u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ED6 */, /*2603*/{421169664u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ED7 */, /*2604*/{421694080u,1321480192u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1ED8 */, /*2605*/{422218496u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1ED9 */, /*2606*/{422742912u,1323577344u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EDA */, /*2607*/{423267328u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EDB */, /*2608*/{423791744u,1325674496u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EDC */, /*2609*/{424316160u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EDD */, /*2610*/{424840576u,1327771648u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EDE */, /*2611*/{425364992u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EDF */, /*2612*/{425889408u,1329868800u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EE0 */, /*2613*/{426413824u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EE1 */, /*2614*/{426938240u,1331965952u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EE2 */, /*2615*/{427462656u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EE3 */, /*2616*/{427987072u,1334063104u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EE4 */, /*2617*/{428511488u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EE5 */, /*2618*/{429035904u,1336160256u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EE6 */, /*2619*/{429560320u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EE7 */, /*2620*/{430084736u,1338257408u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EE8 */, /*2621*/{430609152u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EE9 */, /*2622*/{431133568u,1340354560u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EEA */, /*2623*/{431657984u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EEB */, /*2624*/{432182400u,1342451712u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EEC */, /*2625*/{432706816u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EED */, /*2626*/{433231232u,1344548864u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EEE */, /*2627*/{433755648u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EEF */, /*2628*/{434280064u,1346646016u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EF0 */, /*2629*/{434804480u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EF1 */, /*2630*/{435328896u,1348743168u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EF2 */, /*2631*/{435853312u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EF3 */, /*2632*/{436377728u,1350840320u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EF4 */, /*2633*/{436902144u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EF5 */, /*2634*/{437426560u,1352937472u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EF6 */, /*2635*/{437950976u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EF7 */, /*2636*/{438475392u,1355034624u,131073u,69228610u,8389361u,2080507488u,1216u}/* 1EF8 */, /*2637*/{438999808u,274432u,131073u,69228674u,7340784u,1392641640u,192u}/* 1EF9 */, /*2638*/{170880u,1357131776u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 1EFA */, /*2639*/{171008u,274432u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* 1EFB */, /*2640*/{171136u,1359228928u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 1EFC */, /*2641*/{171264u,274432u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* 1EFD */, /*2642*/{171392u,1361326080u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 1EFE */, /*2643*/{171520u,274432u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* 1EFF */, /*2644*/{439524992u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F00 */, /*2645*/{440049408u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F01 */, /*2646*/{440573824u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F02 */, /*2647*/{441098240u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F03 */, /*2648*/{441622656u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F04 */, /*2649*/{442147072u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F05 */, /*2650*/{442671488u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F06 */, /*2651*/{443195904u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F07 */, /*2652*/{443720320u,1363427328u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F08 */, /*2653*/{444244736u,1365524480u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F09 */, /*2654*/{444769152u,1367621632u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0A */, /*2655*/{445293568u,1369718784u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0B */, /*2656*/{445817984u,1371815936u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0C */, /*2657*/{446342400u,1373913088u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0D */, /*2658*/{446866816u,1376010240u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0E */, /*2659*/{447391232u,1378107392u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F0F */, /*2660*/{447915648u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F10 */, /*2661*/{448440064u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F11 */, /*2662*/{448964480u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F12 */, /*2663*/{449488896u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F13 */, /*2664*/{450013312u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F14 */, /*2665*/{450537728u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F15 */, /*2666*/{451062144u,1380204544u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F18 */, /*2667*/{451586560u,1382301696u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F19 */, /*2668*/{452110976u,1384398848u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F1A */, /*2669*/{452635392u,1386496000u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F1B */, /*2670*/{453159808u,1388593152u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F1C */, /*2671*/{453684224u,1390690304u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F1D */, /*2672*/{454208640u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F20 */, /*2673*/{454733056u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F21 */, /*2674*/{455257472u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F22 */, /*2675*/{455781888u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F23 */, /*2676*/{456306304u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F24 */, /*2677*/{456830720u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F25 */, /*2678*/{457355136u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F26 */, /*2679*/{457879552u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F27 */, /*2680*/{458403968u,1392787456u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F28 */, /*2681*/{458928384u,1394884608u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F29 */, /*2682*/{459452800u,1396981760u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2A */, /*2683*/{459977216u,1399078912u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2B */, /*2684*/{460501632u,1401176064u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2C */, /*2685*/{461026048u,1403273216u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2D */, /*2686*/{461550464u,1405370368u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2E */, /*2687*/{462074880u,1407467520u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F2F */, /*2688*/{462599296u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F30 */, /*2689*/{463123712u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F31 */, /*2690*/{463648128u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F32 */, /*2691*/{464172544u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F33 */, /*2692*/{464696960u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F34 */, /*2693*/{465221376u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F35 */, /*2694*/{465745792u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F36 */, /*2695*/{466270208u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F37 */, /*2696*/{466794624u,1409564672u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F38 */, /*2697*/{467319040u,1411661824u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F39 */, /*2698*/{467843456u,1413758976u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3A */, /*2699*/{468367872u,1415856128u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3B */, /*2700*/{468892288u,1417953280u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3C */, /*2701*/{469416704u,1420050432u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3D */, /*2702*/{469941120u,1422147584u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3E */, /*2703*/{470465536u,1424244736u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F3F */, /*2704*/{470989952u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F40 */, /*2705*/{471514368u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F41 */, /*2706*/{472038784u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F42 */, /*2707*/{472563200u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F43 */, /*2708*/{473087616u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F44 */, /*2709*/{473612032u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F45 */, /*2710*/{474136448u,1426341888u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F48 */, /*2711*/{474660864u,1428439040u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F49 */, /*2712*/{475185280u,1430536192u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F4A */, /*2713*/{475709696u,1432633344u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F4B */, /*2714*/{476234112u,1434730496u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F4C */, /*2715*/{476758528u,1436827648u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F4D */, /*2716*/{477102105u,29638656u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F50 */, /*2717*/{477807232u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F51 */, /*2718*/{478150682u,31735808u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F52 */, /*2719*/{478855936u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F53 */, /*2720*/{479199259u,33832960u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F54 */, /*2721*/{479904640u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F55 */, /*2722*/{480247836u,35930112u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F56 */, /*2723*/{480953344u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F57 */, /*2724*/{481477760u,1438924800u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F59 */, /*2725*/{482002176u,1441021952u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F5B */, /*2726*/{482526592u,1443119104u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F5D */, /*2727*/{483051008u,1445216256u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F5F */, /*2728*/{483575424u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F60 */, /*2729*/{484099840u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F61 */, /*2730*/{484624256u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F62 */, /*2731*/{485148672u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F63 */, /*2732*/{485673088u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F64 */, /*2733*/{486197504u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F65 */, /*2734*/{486721920u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F66 */, /*2735*/{487246336u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F67 */, /*2736*/{487770752u,1447313408u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F68 */, /*2737*/{488295168u,1449410560u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F69 */, /*2738*/{488819584u,1451507712u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6A */, /*2739*/{489344000u,1453604864u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6B */, /*2740*/{489868416u,1455702016u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6C */, /*2741*/{490392832u,1457799168u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6D */, /*2742*/{490917248u,1459896320u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6E */, /*2743*/{491441664u,1461993472u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1F6F */, /*2744*/{491966080u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F70 */, /*2745*/{492490496u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F71 */, /*2746*/{493014912u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F72 */, /*2747*/{493539328u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F73 */, /*2748*/{494063744u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F74 */, /*2749*/{494588160u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F75 */, /*2750*/{495112576u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F76 */, /*2751*/{495636992u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F77 */, /*2752*/{496161408u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F78 */, /*2753*/{496685824u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F79 */, /*2754*/{497210240u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F7A */, /*2755*/{497734656u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F7B */, /*2756*/{498259072u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1F7C */, /*2757*/{498783488u,278528u,196608u,69228674u,7340144u,1460012648u,192u}/* 1F7D */, /*2758*/{499307945u,38027264u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F80 */, /*2759*/{499832362u,40124416u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F81 */, /*2760*/{500356779u,42221568u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F82 */, /*2761*/{500881196u,44318720u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F83 */, /*2762*/{501405613u,46415872u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F84 */, /*2763*/{501930030u,48513024u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F85 */, /*2764*/{502454447u,50610176u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F86 */, /*2765*/{502978864u,52707328u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F87 */, /*2766*/{503503281u,54804480u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F88 */, /*2767*/{504027698u,56901632u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F89 */, /*2768*/{504552115u,58998784u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8A */, /*2769*/{505076532u,61095936u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8B */, /*2770*/{505600949u,63193088u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8C */, /*2771*/{506125366u,65290240u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8D */, /*2772*/{506649783u,67387392u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8E */, /*2773*/{507174200u,69484544u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F8F */, /*2774*/{507698617u,71581696u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F90 */, /*2775*/{508223034u,73678848u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F91 */, /*2776*/{508747451u,75776000u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F92 */, /*2777*/{509271868u,77873152u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F93 */, /*2778*/{509796285u,79970304u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F94 */, /*2779*/{510320702u,82067456u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F95 */, /*2780*/{510845119u,84164608u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F96 */, /*2781*/{511369536u,86261760u,196609u,69228674u,7340784u,1996621416u,192u}/* 1F97 */, /*2782*/{511893953u,88358912u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F98 */, /*2783*/{512418370u,90456064u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F99 */, /*2784*/{512942787u,92553216u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9A */, /*2785*/{513467204u,94650368u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9B */, /*2786*/{513991621u,96747520u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9C */, /*2787*/{514516038u,98844672u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9D */, /*2788*/{515040455u,100941824u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9E */, /*2789*/{515564872u,103038976u,196609u,69228738u,8389360u,2097284704u,192u}/* 1F9F */, /*2790*/{516089289u,105136128u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA0 */, /*2791*/{516613706u,107233280u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA1 */, /*2792*/{517138123u,109330432u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA2 */, /*2793*/{517662540u,111427584u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA3 */, /*2794*/{518186957u,113524736u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA4 */, /*2795*/{518711374u,115621888u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA5 */, /*2796*/{519235791u,117719040u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA6 */, /*2797*/{519760208u,119816192u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FA7 */, /*2798*/{520284625u,121913344u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FA8 */, /*2799*/{520809042u,124010496u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FA9 */, /*2800*/{521333459u,126107648u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAA */, /*2801*/{521857876u,128204800u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAB */, /*2802*/{522382293u,130301952u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAC */, /*2803*/{522906710u,132399104u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAD */, /*2804*/{523431127u,134496256u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAE */, /*2805*/{523955544u,136593408u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FAF */, /*2806*/{524479872u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FB0 */, /*2807*/{525004288u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FB1 */, /*2808*/{525336671u,138690560u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FB2 */, /*2809*/{526053081u,140787712u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FB3 */, /*2810*/{526385248u,142884864u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FB4 */, /*2811*/{526909469u,144982016u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FB6 */, /*2812*/{527433829u,147079168u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FB7 */, /*2813*/{528150272u,1464090624u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FB8 */, /*2814*/{528674688u,1466187776u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FB9 */, /*2815*/{529199104u,1468284928u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FBA */, /*2816*/{529723520u,1470382080u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FBB */, /*2817*/{530248026u,149176320u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FBC */, /*2818*/{530579456u,278528u,196609u,69863044u,176u,2215772160u,2147516416u}/* 1FBD */, /*2819*/{531296640u,1472479232u,196608u,69228674u,7340145u,1460012648u,192u}/* 1FBE */, /*2820*/{531628032u,278528u,196609u,69863044u,176u,2215772160u,2147516416u}/* 1FBF */, /*2821*/{532152320u,278528u,196609u,69863044u,176u,2215772160u,2147516416u}/* 1FC0 */, /*2822*/{532676608u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FC1 */, /*2823*/{533200993u,151273472u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FC2 */, /*2824*/{533918299u,153370624u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FC3 */, /*2825*/{534249570u,155467776u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FC4 */, /*2826*/{534773790u,157564928u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FC6 */, /*2827*/{535298150u,159662080u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FC7 */, /*2828*/{536015488u,1474576384u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FC8 */, /*2829*/{536539904u,1476673536u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FC9 */, /*2830*/{537064320u,1478770688u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FCA */, /*2831*/{537588736u,1480867840u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FCB */, /*2832*/{538113244u,161759232u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FCC */, /*2833*/{538443776u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FCD */, /*2834*/{538968064u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FCE */, /*2835*/{539492352u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FCF */, /*2836*/{540210432u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FD0 */, /*2837*/{540734848u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FD1 */, /*2838*/{541065247u,163856384u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FD2 */, /*2839*/{541589536u,165953536u,196608u,69228674u,7340144u,1460012648u,192u}/* 1FD3 */, /*2840*/{542113825u,168050688u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FD6 */, /*2841*/{542638114u,170147840u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FD7 */, /*2842*/{543356416u,1482964992u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FD8 */, /*2843*/{543880832u,1485062144u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FD9 */, /*2844*/{544405248u,1487159296u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FDA */, /*2845*/{544929664u,1489256448u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FDB */, /*2846*/{545259520u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FDD */, /*2847*/{545783808u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FDE */, /*2848*/{546308096u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FDF */, /*2849*/{547026944u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE0 */, /*2850*/{547551360u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE1 */, /*2851*/{547880995u,172244992u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE2 */, /*2852*/{548405284u,174342144u,196608u,69228674u,7340144u,1460012648u,192u}/* 1FE3 */, /*2853*/{548929573u,176439296u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE4 */, /*2854*/{549648640u,278528u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE5 */, /*2855*/{549978150u,178536448u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE6 */, /*2856*/{550502439u,180633600u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FE7 */, /*2857*/{551221632u,1491353600u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FE8 */, /*2858*/{551746048u,1493450752u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FE9 */, /*2859*/{552270464u,1495547904u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FEA */, /*2860*/{552794880u,1497645056u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FEB */, /*2861*/{553319296u,1499742208u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FEC */, /*2862*/{553648128u,278528u,196609u,69863042u,176u,2215772160u,32768u}/* 1FED */, /*2863*/{554172416u,278528u,196608u,69863042u,48u,2216034304u,32768u}/* 1FEE */, /*2864*/{554696704u,278528u,196608u,69863042u,48u,2216034304u,32768u}/* 1FEF */, /*2865*/{555221091u,182730752u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FF2 */, /*2866*/{555940957u,184827904u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FF3 */, /*2867*/{556269668u,186925056u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FF4 */, /*2868*/{556793896u,189022208u,196609u,69228674u,7340784u,1392641640u,192u}/* 1FF6 */, /*2869*/{557318247u,191119360u,196609u,69228674u,7340784u,1996621416u,192u}/* 1FF7 */, /*2870*/{558038144u,1501839360u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FF8 */, /*2871*/{558562560u,1503936512u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FF9 */, /*2872*/{559086976u,1506033664u,196609u,69228610u,8389361u,2080507488u,1216u}/* 1FFA */, /*2873*/{559611392u,1508130816u,196608u,69228610u,8388721u,2080769632u,1216u}/* 1FFB */, /*2874*/{560135902u,193216512u,196609u,69228738u,8389360u,2097284704u,192u}/* 1FFC */, /*2875*/{560463872u,278528u,196608u,69863042u,48u,2216034304u,32768u}/* 1FFD */, /*2876*/{560988160u,278528u,196609u,69863044u,176u,2215772160u,2147516416u}/* 1FFE */, /*2877*/{561512448u,282624u,65536u,69796610u,6291504u,67502080u,288u}/* 2000 */, /*2878*/{562036736u,282624u,65536u,69796610u,6291504u,67502080u,288u}/* 2001 */, /*2879*/{562561024u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2002 */, /*2880*/{563085312u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2003 */, /*2881*/{563609600u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2004 */, /*2882*/{564133888u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2005 */, /*2883*/{564658176u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2006 */, /*2884*/{565182464u,282624u,65537u,69796616u,1348468912u,67239936u,2147483936u}/* 2007 */, /*2885*/{565706752u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2008 */, /*2886*/{566231040u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 2009 */, /*2887*/{566755328u,282624u,65537u,69796612u,6291632u,67239936u,2147483936u}/* 200A */, /*2888*/{0,282624u,65537u,69927936u,2152923826u,2218786816u,3221225472u}/* 200B */, /*2889*/{0,282624u,2686976u,69942272u,808714930u,2218852480u,3288334336u}/* 200C */, /*2890*/{0,282627u,2686976u,69942272u,808714930u,2218852480u,3288334336u}/* 200D */, /*2891*/{0,282624u,65537u,69225472u,810746554u,2218786816u,3221487616u}/* 200E */, /*2892*/{0,282624u,65537u,69291008u,810746554u,2218786816u,3221487616u}/* 200F */, /*2893*/{0,282624u,65537u,69862592u,688u,8527872u,3222798336u}/* 2010 */, /*2894*/{567279616u,282624u,65537u,69862600u,1342177456u,75636736u,2149056512u}/* 2011 */, /*2895*/{0,282624u,65537u,69862592u,688u,8519680u,3222798336u}/* 2012 */, /*2896*/{0,282624u,65537u,69862592u,14680752u,8519680u,3222798336u}/* 2013 */, /*2897*/{0,282624u,65537u,69862848u,688u,131074u,3226992640u}/* 2016 */, /*2898*/{567803904u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 2017 */, /*2899*/{0,282624u,65537u,69891840u,13632176u,2147614720u,3222929408u}/* 2018 */, /*2900*/{0,282624u,65537u,69891904u,13632176u,2147614720u,3222929408u}/* 2019 */, /*2901*/{0,282624u,65537u,69862656u,13632176u,131072u,3222929408u}/* 201A */, /*2902*/{0,282624u,65537u,69863168u,13632176u,131072u,3222929408u}/* 201B */, /*2903*/{0,282624u,65537u,69863232u,13632176u,131072u,3222929408u}/* 201D */, /*2904*/{0,282624u,65537u,69862848u,688u,131072u,3222798336u}/* 2020 */, /*2905*/{568328192u,282624u,65537u,69891524u,11534512u,2214723584u,2149056512u}/* 2024 */, /*2906*/{568852480u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 2025 */, /*2907*/{569376768u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 2026 */, /*2908*/{0,282624u,65537u,69887424u,688u,2147614720u,3222798336u}/* 2027 */, /*2909*/{0,282624u,65537u,69808960u,4391600u,0,3221487904u}/* 2028 */, /*2910*/{0,282624u,65537u,69677952u,4391600u,0,3221487904u}/* 2029 */, /*2911*/{0,282624u,65537u,70274048u,810746554u,2218786816u,3221225472u}/* 202A */, /*2912*/{0,282624u,65537u,70339584u,810746554u,2218786816u,3221225472u}/* 202B */, /*2913*/{0,282624u,65537u,70405120u,810746554u,2218786816u,3221225472u}/* 202C */, /*2914*/{0,282624u,65537u,70142976u,810746554u,2218786816u,3221225472u}/* 202D */, /*2915*/{0,282624u,65537u,70208512u,810746554u,2218786816u,3221225472u}/* 202E */, /*2916*/{569901056u,282624u,65537u,75891464u,1348468912u,67239936u,2147483936u}/* 202F */, /*2917*/{0,282624u,65537u,69469632u,688u,131072u,3222798336u}/* 2030 */, /*2918*/{0,282624u,65537u,69469632u,688u,131074u,3226992640u}/* 2032 */, /*2919*/{570425344u,282624u,65537u,69469636u,176u,67239938u,2153250816u}/* 2033 */, /*2920*/{570949632u,282624u,65537u,69469636u,176u,67239938u,2153250816u}/* 2034 */, /*2921*/{571473920u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 2036 */, /*2922*/{571998208u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 2037 */, /*2923*/{0,282760u,65537u,69863168u,13632180u,131072u,3222929408u}/* 2039 */, /*2924*/{0,282768u,65537u,69863232u,13632180u,131072u,3222929408u}/* 203A */, /*2925*/{572522496u,282624u,65537u,69862852u,12583088u,67239936u,2149076992u}/* 203C */, /*2926*/{0,282624u,65537u,69862848u,12583600u,131072u,3222818816u}/* 203D */, /*2927*/{573046784u,282624u,65537u,69862852u,176u,67239936u,2149056512u}/* 203E */, /*2928*/{0,282624u,65537u,69895552u,688u,132096u,3222274176u}/* 203F */, /*2929*/{0,282624u,65537u,69895552u,688u,132098u,3226468480u}/* 2040 */, /*2930*/{0,282624u,65537u,69627392u,688u,131074u,3221782528u}/* 2044 */, /*2931*/{0,282776u,65537u,69862656u,13632180u,131072u,3222798336u}/* 2045 */, /*2932*/{0,282784u,65537u,69862720u,13632180u,131072u,3222798336u}/* 2046 */, /*2933*/{573571072u,282624u,65537u,80348612u,12583088u,67239936u,2149076992u}/* 2047 */, /*2934*/{574095360u,282624u,65537u,76154308u,12583088u,67239936u,2149076992u}/* 2048 */, /*2935*/{574619648u,282624u,65537u,76154308u,12583088u,67239936u,2149076992u}/* 2049 */, /*2936*/{0,282624u,65537u,76154304u,688u,131072u,3222798336u}/* 204A */, /*2937*/{0,282624u,65537u,80348608u,688u,131072u,3222798336u}/* 204E */, /*2938*/{0,282624u,65537u,80348672u,688u,131074u,3221782528u}/* 2052 */, /*2939*/{0,282624u,65537u,82445760u,688u,8519680u,3222798336u}/* 2053 */, /*2940*/{0,282624u,65537u,82478464u,688u,132096u,3222274176u}/* 2054 */, /*2941*/{0,282624u,65537u,84542912u,688u,131072u,3222798336u}/* 2055 */, /*2942*/{575143936u,282624u,65537u,80348612u,176u,67239936u,2149056512u}/* 2057 */, /*2943*/{575668224u,282624u,65537u,80282372u,6291632u,67239936u,2147483936u}/* 205F */, /*2944*/{0,282624u,65537u,80432128u,2689794738u,2218786816u,3221225472u}/* 2060 */, /*2945*/{0,282624u,65537u,80432128u,5440178u,2218786818u,3225419776u}/* 2061 */, /*2946*/{0,282624u,65537u,88820736u,5440178u,2218786818u,3225419776u}/* 2064 */, /*2947*/{0,282624u,65537u,99830784u,810746554u,2218786816u,3355443200u}/* 2066 */, /*2948*/{0,282624u,65537u,99896320u,810746554u,2218786816u,3221225472u}/* 2067 */, /*2949*/{0,282624u,65537u,99961856u,810746554u,2218786816u,3221225472u}/* 2068 */, /*2950*/{0,282624u,65537u,100027392u,810746554u,2218786816u,3221225472u}/* 2069 */, /*2951*/{0,282624u,65537u,69946368u,810746546u,2220883968u,3221225472u}/* 206A */, /*2952*/{576192512u,286720u,33620993u,69337812u,33558704u,67239937u,2147483648u}/* 2070 */, /*2953*/{576716800u,286720u,131073u,79714580u,7340272u,3288467016u,2155880640u}/* 2071 */, /*2954*/{577241088u,286720u,553717761u,69337812u,33558704u,67239937u,2147483648u}/* 2074 */, /*2955*/{577765376u,286720u,587271169u,69337812u,33558704u,67239937u,2147483648u}/* 2075 */, /*2956*/{578289664u,286720u,620828161u,69337812u,33558704u,67239937u,2147483648u}/* 2076 */, /*2957*/{578813952u,286720u,654380545u,69337812u,33558704u,67239937u,2147483648u}/* 2077 */, /*2958*/{579338240u,286720u,687938561u,69337812u,33558704u,67239937u,2147483648u}/* 2078 */, /*2959*/{579862528u,286720u,721490945u,69337812u,33558704u,67239937u,2147483648u}/* 2079 */, /*2960*/{580386816u,286720u,65537u,69404180u,176u,67239938u,2147516416u}/* 207A */, /*2961*/{580911104u,286720u,65537u,69404180u,176u,75628546u,2147516416u}/* 207B */, /*2962*/{581435392u,286720u,65537u,69862932u,176u,67239938u,2147516416u}/* 207C */, /*2963*/{581959680u,286888u,65537u,69862676u,13631668u,67239938u,2152726528u}/* 207D */, /*2964*/{582483968u,286896u,65537u,69862740u,13631668u,67239938u,2152726528u}/* 207E */, /*2965*/{583008256u,286720u,131073u,69228820u,7340272u,3288467016u,2155872448u}/* 207F */, /*2966*/{583532544u,286720u,33620993u,69337814u,33558704u,67239937u,2147483648u}/* 2080 */, /*2967*/{584056832u,286720u,453051905u,69337814u,33558704u,67239937u,2147483648u}/* 2081 */, /*2968*/{584581120u,286720u,486607361u,69337814u,33558704u,67239937u,2147483648u}/* 2082 */, /*2969*/{585105408u,286720u,520161281u,69337814u,33558704u,67239937u,2147483648u}/* 2083 */, /*2970*/{585629696u,286720u,553717761u,69337814u,33558704u,67239937u,2147483648u}/* 2084 */, /*2971*/{586153984u,286720u,587271169u,69337814u,33558704u,67239937u,2147483648u}/* 2085 */, /*2972*/{586678272u,286720u,620828161u,69337814u,33558704u,67239937u,2147483648u}/* 2086 */, /*2973*/{587202560u,286720u,654380545u,69337814u,33558704u,67239937u,2147483648u}/* 2087 */, /*2974*/{587726848u,286720u,687938561u,69337814u,33558704u,67239937u,2147483648u}/* 2088 */, /*2975*/{588251136u,286720u,721490945u,69337814u,33558704u,67239937u,2147483648u}/* 2089 */, /*2976*/{588775424u,286720u,65537u,69404182u,176u,67239938u,2147516416u}/* 208A */, /*2977*/{589299712u,286720u,65537u,69404182u,176u,75628546u,2147516416u}/* 208B */, /*2978*/{589824000u,286720u,65537u,69862934u,176u,67239938u,2147516416u}/* 208C */, /*2979*/{590348288u,286904u,65537u,69862678u,13631668u,67239938u,2152726528u}/* 208D */, /*2980*/{590872576u,286912u,65537u,69862742u,13631668u,67239938u,2152726528u}/* 208E */, /*2981*/{591396864u,286720u,131073u,83908886u,7340272u,3288467016u,2155872448u}/* 2090 */, /*2982*/{591921152u,286720u,131073u,83908886u,7340272u,3288467016u,2155872448u}/* 2091 */, /*2983*/{592445440u,286720u,131073u,83908886u,7340272u,3288467016u,2155872448u}/* 2092 */, /*2984*/{592969728u,286720u,131073u,83908886u,7340272u,3288467016u,2155872448u}/* 2093 */, /*2985*/{593494016u,286720u,131073u,83908886u,7340272u,3288467016u,2155872448u}/* 2094 */, /*2986*/{594018304u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 2095 */, /*2987*/{594542592u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 2096 */, /*2988*/{595066880u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 2097 */, /*2989*/{595591168u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 2098 */, /*2990*/{596115456u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 2099 */, /*2991*/{596639744u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 209A */, /*2992*/{597164032u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 209B */, /*2993*/{597688320u,286720u,131073u,92297494u,7340272u,3288467016u,2155872448u}/* 209C */, /*2994*/{0,290816u,65537u,69469760u,688u,131072u,3221258240u}/* 20A0 */, /*2995*/{598212608u,290816u,65537u,69469764u,176u,67239936u,2147516416u}/* 20A8 */, /*2996*/{0,290816u,65537u,71566912u,688u,131072u,3221258240u}/* 20AB */, /*2997*/{0,290816u,65537u,73664064u,688u,131072u,3221258240u}/* 20AC */, /*2998*/{0,290816u,65537u,75761216u,688u,131072u,3221258240u}/* 20AD */, /*2999*/{0,290816u,65537u,79955520u,688u,131072u,3221258240u}/* 20B0 */, /*3000*/{0,290816u,65537u,84149824u,688u,131072u,3221258240u}/* 20B2 */, /*3001*/{0,290816u,65537u,90441280u,688u,131072u,3221258240u}/* 20B6 */, /*3002*/{0,290816u,65537u,92538432u,688u,131072u,3221258240u}/* 20B9 */, /*3003*/{0,290816u,65537u,96732736u,688u,131072u,3221258240u}/* 20BA */, /*3004*/{0,290816u,65537u,100927040u,688u,131072u,3221258240u}/* 20BB */, /*3005*/{0,290816u,65537u,103024192u,688u,131072u,3221258240u}/* 20BE */, /*3006*/{0,294912u,2686976u,3425450368u,808714928u,2147550214u,3225419904u}/* 20D0 */, /*3007*/{0,294912u,2686976u,137116032u,808714928u,2147550214u,3225419904u}/* 20D2 */, /*3008*/{0,294912u,2686976u,70007232u,808714928u,2147549188u,3221225472u}/* 20DD */, /*3009*/{0,294912u,2686976u,76298688u,808714928u,2147549188u,3221225472u}/* 20E2 */, /*3010*/{0,294912u,2686976u,80492992u,808714928u,2147549188u,3221225472u}/* 20E4 */, /*3011*/{0,294912u,2686976u,147601792u,808714928u,2147550214u,3225419904u}/* 20E5 */, /*3012*/{0,294912u,2686976u,3435936128u,808714928u,2147550212u,3221225600u}/* 20E7 */, /*3013*/{0,294912u,2686976u,3100391808u,808714928u,2147550212u,3221225600u}/* 20E8 */, /*3014*/{0,294912u,2686976u,147601792u,808714928u,2147550212u,3221225600u}/* 20EA */, /*3015*/{0,294912u,2686976u,151796096u,808714928u,2147550214u,3225419904u}/* 20EB */, /*3016*/{0,294912u,2686976u,3106683264u,808714928u,2147550214u,3225419904u}/* 20EC */, /*3017*/{0,294912u,2686976u,3444324736u,808714928u,2147550212u,3221225600u}/* 20F0 */, /*3018*/{598736896u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2100 */, /*3019*/{599261184u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2101 */, /*3020*/{599785472u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2102 */, /*3021*/{600309760u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2103 */, /*3022*/{0,299008u,65537u,69863104u,688u,131072u,3221258240u}/* 2104 */, /*3023*/{600834048u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2105 */, /*3024*/{601358336u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2106 */, /*3025*/{601882624u,299008u,65537u,69228612u,8388848u,1140983394u,2151679168u}/* 2107 */, /*3026*/{602406912u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2109 */, /*3027*/{602931200u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 210A */, /*3028*/{603455488u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 210B */, /*3029*/{603979776u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 210C */, /*3030*/{604504064u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 210D */, /*3031*/{605028352u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 210E */, /*3032*/{605552640u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 210F */, /*3033*/{606076928u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2110 */, /*3034*/{606601216u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2111 */, /*3035*/{607125504u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2112 */, /*3036*/{607649792u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 2113 */, /*3037*/{608174080u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2115 */, /*3038*/{608698368u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2116 */, /*3039*/{0,299008u,65537u,69862912u,688u,132610u,3238035648u}/* 2118 */, /*3040*/{609222656u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2119 */, /*3041*/{609746944u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 211A */, /*3042*/{610271232u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 211B */, /*3043*/{610795520u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 211C */, /*3044*/{611319808u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 211D */, /*3045*/{611844096u,299008u,65537u,69863124u,176u,67239936u,2147516416u}/* 2120 */, /*3046*/{612368384u,299008u,65537u,69863108u,176u,67239936u,2147516416u}/* 2121 */, /*3047*/{612892672u,299008u,65537u,69863124u,176u,67239936u,2147516416u}/* 2122 */, /*3048*/{613416960u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2124 */, /*3049*/{614137600u,1510248448u,196608u,69228610u,8388721u,2080769632u,1216u}/* 2126 */, /*3050*/{614465536u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2128 */, /*3051*/{0,299008u,65537u,69863104u,688u,131074u,3225452544u}/* 2129 */, /*3052*/{615186304u,1512345600u,131072u,69228610u,8388721u,2080769632u,1216u}/* 212A */, /*3053*/{615710720u,1514442752u,131072u,69228610u,8388721u,2080769632u,1216u}/* 212B */, /*3054*/{616038400u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 212C */, /*3055*/{616562688u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 212D */, /*3056*/{0,299008u,65537u,69469888u,688u,132608u,3238035648u}/* 212E */, /*3057*/{617086976u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 212F */, /*3058*/{617611264u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2130 */, /*3059*/{618135552u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2131 */, /*3060*/{196736u,1516539904u,131073u,69228608u,8389361u,2080507488u,3221226688u}/* 2132 */, /*3061*/{618659840u,299008u,65537u,69228614u,8388848u,1140983394u,2151679168u}/* 2133 */, /*3062*/{619184128u,299008u,65537u,69228678u,7340272u,1140983402u,2151678144u}/* 2134 */, /*3063*/{619708416u,299008u,65537u,69228868u,9437424u,67241538u,2151678144u}/* 2135 */, /*3064*/{620232704u,299008u,65537u,69228868u,9437424u,67241538u,2151678144u}/* 2136 */, /*3065*/{620756992u,299008u,65537u,69228868u,9437424u,67241538u,2151678144u}/* 2137 */, /*3066*/{621281280u,299008u,65537u,69228868u,9437424u,67241538u,2151678144u}/* 2138 */, /*3067*/{621805568u,299008u,65537u,75520134u,7340272u,1140983400u,2147483840u}/* 2139 */, /*3068*/{0,299008u,65537u,76154560u,688u,131072u,3221258240u}/* 213A */, /*3069*/{622329856u,299008u,65537u,82446020u,176u,67239936u,2147516416u}/* 213B */, /*3070*/{622854144u,299008u,65537u,83908742u,7340272u,1140983402u,2151678144u}/* 213C */, /*3071*/{623378432u,299008u,65537u,79714438u,7340272u,1140983402u,2151678144u}/* 213D */, /*3072*/{623902720u,299008u,65537u,79714374u,8388848u,1140983394u,2151679168u}/* 213E */, /*3073*/{624427008u,299008u,65537u,79714374u,8388848u,1140983394u,2151679168u}/* 213F */, /*3074*/{624951296u,299008u,65537u,80348678u,180u,67239938u,2147516416u}/* 2140 */, /*3075*/{0,299008u,65537u,80348672u,688u,131074u,3221258240u}/* 2141 */, /*3076*/{625475584u,299008u,65537u,79714374u,8388848u,1140983394u,2151679168u}/* 2145 */, /*3077*/{625999872u,299008u,65537u,79714438u,7340272u,1140983402u,2151678144u}/* 2146 */, /*3078*/{626524160u,299008u,65537u,79714438u,7340272u,1140983402u,2151678144u}/* 2147 */, /*3079*/{627048448u,299008u,65537u,79714438u,7340272u,1140983402u,2151686336u}/* 2148 */, /*3080*/{627572736u,299008u,65537u,79714438u,7340272u,1140983402u,2151686336u}/* 2149 */, /*3081*/{0,299008u,65537u,80348864u,688u,131072u,3221258240u}/* 214A */, /*3082*/{0,299008u,65537u,84543168u,688u,131072u,3221258240u}/* 214C */, /*3083*/{0,299008u,65537u,86640320u,688u,131072u,3221258240u}/* 214D */, /*3084*/{196864u,299008u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 214E */, /*3085*/{0,299008u,65537u,88082112u,688u,131072u,3221258240u}/* 214F */, /*3086*/{628097024u,303104u,134284801u,90833634u,134219952u,67239937u,2147483648u}/* 2150 */, /*3087*/{628621312u,303104u,100730369u,90833634u,100665520u,67239937u,2147483648u}/* 2151 */, /*3088*/{629145600u,303104u,83953153u,90833634u,83888304u,67239937u,2147483648u}/* 2152 */, /*3089*/{629669888u,303104u,218170881u,69862114u,201328816u,67239937u,2147483648u}/* 2153 */, /*3090*/{630194176u,303104u,352389633u,69862114u,201328816u,67239937u,2147483648u}/* 2154 */, /*3091*/{630718464u,303104u,184616449u,69862114u,167774384u,67239937u,2147483648u}/* 2155 */, /*3092*/{631242752u,303104u,251726337u,69862114u,167774384u,67239937u,2147483648u}/* 2156 */, /*3093*/{631767040u,303104u,318834689u,69862114u,167774384u,67239937u,2147483648u}/* 2157 */, /*3094*/{632291328u,303104u,385945601u,69862114u,167774384u,67239937u,2147483648u}/* 2158 */, /*3095*/{632815616u,303104u,151062017u,69862114u,150997168u,67239937u,2147483648u}/* 2159 */, /*3096*/{633339904u,303104u,402721793u,69862114u,150997168u,67239937u,2147483648u}/* 215A */, /*3097*/{633864192u,303104u,117507585u,69862114u,117442736u,67239937u,2147483648u}/* 215B */, /*3098*/{634388480u,303104u,234948609u,69862114u,117442736u,67239937u,2147483648u}/* 215C */, /*3099*/{634912768u,303104u,335612929u,69862114u,117442736u,67239937u,2147483648u}/* 215D */, /*3100*/{635437056u,303104u,419499521u,69862114u,117442736u,67239937u,2147483648u}/* 215E */, /*3101*/{635961344u,303104u,453051905u,69862114u,33556656u,67239937u,2147483648u}/* 215F */, /*3102*/{636682624u,1518641152u,453117441u,69229188u,41945329u,2080507393u,2149582016u}/* 2160 */, /*3103*/{637207040u,1520738304u,486672897u,69229188u,41945329u,2080507393u,2149582016u}/* 2161 */, /*3104*/{637731456u,1522835456u,520226817u,69229188u,41945329u,2080507393u,2149582016u}/* 2162 */, /*3105*/{638255872u,1524932608u,553783297u,69229188u,41945329u,2080507393u,2149582016u}/* 2163 */, /*3106*/{638780288u,1527029760u,587336705u,69229188u,41945329u,2080507393u,2149582016u}/* 2164 */, /*3107*/{639304704u,1529126912u,620893697u,69229188u,41945329u,2080507393u,2149582016u}/* 2165 */, /*3108*/{639829120u,1531224064u,654446081u,69229188u,41945329u,2080507393u,2149582016u}/* 2166 */, /*3109*/{640353536u,1533321216u,688004097u,69229188u,41945329u,2080507393u,2149582016u}/* 2167 */, /*3110*/{640877952u,1535418368u,721556481u,69229188u,41945329u,2080507393u,2149582016u}/* 2168 */, /*3111*/{641402368u,1537515520u,738336769u,69229188u,41945329u,2080507393u,2149582016u}/* 2169 */, /*3112*/{641926784u,1539612672u,755110401u,69229188u,41945329u,2080507393u,2149582016u}/* 216A */, /*3113*/{642451200u,1541709824u,771891713u,69229188u,41945329u,2080507393u,2149582016u}/* 216B */, /*3114*/{642975616u,1543806976u,1409443841u,69229188u,41945329u,2080507393u,2149582016u}/* 216C */, /*3115*/{643500032u,1545904128u,1493332481u,69229188u,41945329u,2080507393u,2149582016u}/* 216D */, /*3116*/{644024448u,1548001280u,1560443393u,69229188u,41945329u,2080507393u,2149582016u}/* 216E */, /*3117*/{644548864u,1550098432u,1644332033u,69229188u,41945329u,2080507393u,2149582016u}/* 216F */, /*3118*/{645073280u,303104u,453117441u,69229188u,40896752u,1459750409u,2155872448u}/* 2170 */, /*3119*/{645597696u,303104u,486672897u,69229188u,40896752u,1459750409u,2155872448u}/* 2171 */, /*3120*/{646122112u,303104u,520226817u,69229188u,40896752u,1459750409u,2155872448u}/* 2172 */, /*3121*/{646646528u,303104u,553783297u,69229188u,40896752u,1459750409u,2155872448u}/* 2173 */, /*3122*/{647170944u,303104u,587336705u,69229188u,40896752u,1459750409u,2155872448u}/* 2174 */, /*3123*/{647695360u,303104u,620893697u,69229188u,40896752u,1459750409u,2155872448u}/* 2175 */, /*3124*/{648219776u,303104u,654446081u,69229188u,40896752u,1459750409u,2155872448u}/* 2176 */, /*3125*/{648744192u,303104u,688004097u,69229188u,40896752u,1459750409u,2155872448u}/* 2177 */, /*3126*/{649268608u,303104u,721556481u,69229188u,40896752u,1459750409u,2155872448u}/* 2178 */, /*3127*/{649793024u,303104u,738336769u,69229188u,40896752u,1459750409u,2155872448u}/* 2179 */, /*3128*/{650317440u,303104u,755110401u,69229188u,40896752u,1459750409u,2155872448u}/* 217A */, /*3129*/{650841856u,303104u,771891713u,69229188u,40896752u,1459750409u,2155872448u}/* 217B */, /*3130*/{651366272u,303104u,1409443841u,69229188u,40896752u,1459750409u,2155872448u}/* 217C */, /*3131*/{651890688u,303104u,1493332481u,69229188u,40896752u,1459750409u,2155872448u}/* 217D */, /*3132*/{652415104u,303104u,1560443393u,69229188u,40896752u,1459750409u,2155872448u}/* 217E */, /*3133*/{652939520u,303104u,1644332033u,69229188u,40896752u,1459750409u,2155872448u}/* 217F */, /*3134*/{0,303104u,1644332033u,69229184u,42994416u,132609u,3221225664u}/* 2180 */, /*3135*/{0,303104u,1711442945u,69229184u,42994416u,132609u,3221225664u}/* 2181 */, /*3136*/{0,303104u,1795331585u,69229184u,42994416u,132609u,3221225664u}/* 2182 */, /*3137*/{201088u,1552195584u,131073u,75520064u,8389361u,2080507488u,3221226688u}/* 2183 */, /*3138*/{201216u,303104u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2184 */, /*3139*/{0,303104u,620893697u,88103552u,42994416u,132609u,3221225664u}/* 2185 */, /*3140*/{0,303104u,1409443841u,88103552u,42994416u,132609u,3221225664u}/* 2186 */, /*3141*/{0,303104u,1862442497u,88103552u,42994416u,132609u,3221225664u}/* 2187 */, /*3142*/{0,303104u,1946331137u,88103552u,42994416u,132609u,3221225664u}/* 2188 */, /*3143*/{653262848u,303104u,33620993u,90833634u,33556656u,67239937u,2147483648u}/* 2189 */, /*3144*/{0,303104u,65537u,103417536u,688u,131072u,3221258240u}/* 218A */, /*3145*/{0,307200u,65537u,69862912u,688u,131074u,3221782528u}/* 2190 */, /*3146*/{0,307200u,65537u,69863104u,688u,131074u,3225976832u}/* 2195 */, /*3147*/{653787136u,307200u,65537u,69862914u,688u,131074u,557056u}/* 219A */, /*3148*/{654311424u,307200u,65537u,69862914u,688u,131074u,557056u}/* 219B */, /*3149*/{0,307200u,65537u,69863104u,688u,131072u,3221782528u}/* 21A8 */, /*3150*/{654835712u,307200u,65537u,69862914u,688u,131074u,557056u}/* 21AE */, /*3151*/{655360000u,307200u,65537u,69863106u,688u,131074u,4751360u}/* 21CD */, /*3152*/{655884288u,307200u,65537u,69862914u,688u,131074u,557056u}/* 21CE */, /*3153*/{656408576u,307200u,65537u,69862914u,688u,131074u,557056u}/* 21CF */, /*3154*/{0,307200u,65537u,76154560u,688u,131072u,3221782528u}/* 21EB */, /*3155*/{0,307200u,65537u,80348672u,688u,131074u,3221782528u}/* 21F4 */, /*3156*/{0,311296u,65537u,69862912u,688u,131074u,3221782528u}/* 2200 */, /*3157*/{0,311296u,65537u,69862912u,692u,131074u,3221782528u}/* 2201 */, /*3158*/{656932864u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2204 */, /*3159*/{0,311496u,65537u,69862912u,692u,131074u,3221782528u}/* 2208 */, /*3160*/{657457152u,311504u,65537u,69862914u,692u,131074u,557056u}/* 2209 */, /*3161*/{0,311512u,65537u,69862912u,692u,131074u,3221782528u}/* 220A */, /*3162*/{0,311520u,65537u,69862912u,692u,131074u,3221782528u}/* 220B */, /*3163*/{657981440u,311528u,65537u,69862914u,692u,131074u,557056u}/* 220C */, /*3164*/{0,311536u,65537u,69862912u,692u,131074u,3221782528u}/* 220D */, /*3165*/{0,311296u,65537u,69404160u,688u,8519682u,3221782528u}/* 2212 */, /*3166*/{0,311296u,65537u,69469696u,688u,131074u,3221782528u}/* 2213 */, /*3167*/{0,311544u,65537u,69862912u,692u,131074u,3221782528u}/* 2215 */, /*3168*/{658505728u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2224 */, /*3169*/{659030016u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2226 */, /*3170*/{659554304u,311296u,65537u,69862916u,180u,67239938u,2148040704u}/* 222C */, /*3171*/{660078592u,311296u,65537u,69862916u,180u,67239938u,2148040704u}/* 222D */, /*3172*/{660602880u,311296u,65537u,69862916u,180u,67239938u,2148040704u}/* 222F */, /*3173*/{661127168u,311296u,65537u,69862916u,180u,67239938u,2148040704u}/* 2230 */, /*3174*/{0,311552u,65537u,69862912u,692u,131074u,3221782528u}/* 223C */, /*3175*/{0,311560u,65537u,69862912u,692u,131074u,3221782528u}/* 223D */, /*3176*/{661651456u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2241 */, /*3177*/{0,311568u,65537u,69862912u,692u,131074u,3221782528u}/* 2243 */, /*3178*/{662175744u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2244 */, /*3179*/{662700032u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2247 */, /*3180*/{663224320u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2249 */, /*3181*/{0,311576u,65537u,69862912u,692u,131074u,3221782528u}/* 2252 */, /*3182*/{0,311584u,65537u,69862912u,692u,131074u,3221782528u}/* 2253 */, /*3183*/{0,311592u,65537u,69862912u,692u,131074u,3221782528u}/* 2254 */, /*3184*/{0,311600u,65537u,69862912u,692u,131074u,3221782528u}/* 2255 */, /*3185*/{663748608u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2260 */, /*3186*/{664272896u,311296u,65537u,69862914u,692u,131074u,557056u}/* 2262 */, /*3187*/{0,311608u,65537u,69862912u,692u,131074u,3221782528u}/* 2264 */, /*3188*/{0,311616u,65537u,69862912u,692u,131074u,3221782528u}/* 2265 */, /*3189*/{0,311624u,65537u,69862912u,692u,131074u,3221782528u}/* 2266 */, /*3190*/{0,311632u,65537u,69862912u,692u,131074u,3221782528u}/* 2267 */, /*3191*/{0,311640u,65537u,69862912u,692u,131074u,3221782528u}/* 2268 */, /*3192*/{0,311648u,65537u,69862912u,692u,131074u,3221782528u}/* 2269 */, /*3193*/{0,311656u,65537u,69862912u,692u,131074u,3221782528u}/* 226A */, /*3194*/{0,311664u,65537u,69862912u,692u,131074u,3221782528u}/* 226B */, /*3195*/{664797184u,311296u,65537u,69862914u,688u,131074u,557056u}/* 226D */, /*3196*/{665321472u,311672u,65537u,69862914u,692u,131074u,557056u}/* 226E */, /*3197*/{665845760u,311680u,65537u,69862914u,692u,131074u,557056u}/* 226F */, /*3198*/{666370048u,311688u,65537u,69862914u,692u,131074u,557056u}/* 2270 */, /*3199*/{666894336u,311696u,65537u,69862914u,692u,131074u,557056u}/* 2271 */, /*3200*/{0,311704u,65537u,69862912u,692u,131074u,3221782528u}/* 2272 */, /*3201*/{0,311712u,65537u,69862912u,692u,131074u,3221782528u}/* 2273 */, /*3202*/{667418624u,311720u,65537u,69862914u,692u,131074u,557056u}/* 2274 */, /*3203*/{667942912u,311728u,65537u,69862914u,692u,131074u,557056u}/* 2275 */, /*3204*/{0,311736u,65537u,69862912u,692u,131074u,3221782528u}/* 2276 */, /*3205*/{0,311744u,65537u,69862912u,692u,131074u,3221782528u}/* 2277 */, /*3206*/{668467200u,311752u,65537u,69862914u,692u,131074u,557056u}/* 2278 */, /*3207*/{668991488u,311760u,65537u,69862914u,692u,131074u,557056u}/* 2279 */, /*3208*/{0,311768u,65537u,69862912u,692u,131074u,3221782528u}/* 227A */, /*3209*/{0,311776u,65537u,69862912u,692u,131074u,3221782528u}/* 227B */, /*3210*/{0,311784u,65537u,69862912u,692u,131074u,3221782528u}/* 227C */, /*3211*/{0,311792u,65537u,69862912u,692u,131074u,3221782528u}/* 227D */, /*3212*/{0,311800u,65537u,69862912u,692u,131074u,3221782528u}/* 227E */, /*3213*/{0,311808u,65537u,69862912u,692u,131074u,3221782528u}/* 227F */, /*3214*/{669515776u,311816u,65537u,69862914u,692u,131074u,557056u}/* 2280 */, /*3215*/{670040064u,311824u,65537u,69862914u,692u,131074u,557056u}/* 2281 */, /*3216*/{0,311832u,65537u,69862912u,692u,131074u,3221782528u}/* 2282 */, /*3217*/{0,311840u,65537u,69862912u,692u,131074u,3221782528u}/* 2283 */, /*3218*/{670564352u,311848u,65537u,69862914u,692u,131074u,557056u}/* 2284 */, /*3219*/{671088640u,311856u,65537u,69862914u,692u,131074u,557056u}/* 2285 */, /*3220*/{0,311864u,65537u,69862912u,692u,131074u,3221782528u}/* 2286 */, /*3221*/{0,311872u,65537u,69862912u,692u,131074u,3221782528u}/* 2287 */, /*3222*/{671612928u,311880u,65537u,69862914u,692u,131074u,557056u}/* 2288 */, /*3223*/{672137216u,311888u,65537u,69862914u,692u,131074u,557056u}/* 2289 */, /*3224*/{0,311896u,65537u,69862912u,692u,131074u,3221782528u}/* 228A */, /*3225*/{0,311904u,65537u,69862912u,692u,131074u,3221782528u}/* 228B */, /*3226*/{0,311912u,65537u,69862912u,692u,131074u,3221782528u}/* 228F */, /*3227*/{0,311920u,65537u,69862912u,692u,131074u,3221782528u}/* 2290 */, /*3228*/{0,311928u,65537u,69862912u,692u,131074u,3221782528u}/* 2291 */, /*3229*/{0,311936u,65537u,69862912u,692u,131074u,3221782528u}/* 2292 */, /*3230*/{0,311944u,65537u,69862912u,692u,131074u,3221782528u}/* 2298 */, /*3231*/{0,311952u,65537u,69862912u,692u,131074u,3221782528u}/* 22A2 */, /*3232*/{0,311960u,65537u,69862912u,692u,131074u,3221782528u}/* 22A3 */, /*3233*/{0,311968u,65537u,69862912u,692u,131074u,3221782528u}/* 22A6 */, /*3234*/{0,311976u,65537u,69862912u,692u,131074u,3221782528u}/* 22A8 */, /*3235*/{0,311984u,65537u,69862912u,692u,131074u,3221782528u}/* 22A9 */, /*3236*/{0,311992u,65537u,69862912u,692u,131074u,3221782528u}/* 22AB */, /*3237*/{672661504u,311296u,65537u,69862914u,692u,131074u,557056u}/* 22AC */, /*3238*/{673185792u,311296u,65537u,69862914u,692u,131074u,557056u}/* 22AD */, /*3239*/{673710080u,311296u,65537u,69862914u,692u,131074u,557056u}/* 22AE */, /*3240*/{674234368u,311296u,65537u,69862914u,692u,131074u,557056u}/* 22AF */, /*3241*/{0,312000u,65537u,69862912u,692u,131074u,3221782528u}/* 22B0 */, /*3242*/{0,312008u,65537u,69862912u,692u,131074u,3221782528u}/* 22B1 */, /*3243*/{0,312016u,65537u,69862912u,692u,131074u,3221782528u}/* 22B2 */, /*3244*/{0,312024u,65537u,69862912u,692u,131074u,3221782528u}/* 22B3 */, /*3245*/{0,312032u,65537u,69862912u,692u,131074u,3221782528u}/* 22B4 */, /*3246*/{0,312040u,65537u,69862912u,692u,131074u,3221782528u}/* 22B5 */, /*3247*/{0,312048u,65537u,69862912u,692u,131074u,3221782528u}/* 22B6 */, /*3248*/{0,312056u,65537u,69862912u,692u,131074u,3221782528u}/* 22B7 */, /*3249*/{0,312064u,65537u,69862912u,692u,131074u,3221782528u}/* 22C9 */, /*3250*/{0,312072u,65537u,69862912u,692u,131074u,3221782528u}/* 22CA */, /*3251*/{0,312080u,65537u,69862912u,692u,131074u,3221782528u}/* 22CB */, /*3252*/{0,312088u,65537u,69862912u,692u,131074u,3221782528u}/* 22CC */, /*3253*/{0,312096u,65537u,69862912u,692u,131074u,3221782528u}/* 22CD */, /*3254*/{0,312104u,65537u,69862912u,692u,131074u,3221782528u}/* 22D0 */, /*3255*/{0,312112u,65537u,69862912u,692u,131074u,3221782528u}/* 22D1 */, /*3256*/{0,312120u,65537u,69862912u,692u,131074u,3221782528u}/* 22D6 */, /*3257*/{0,312128u,65537u,69862912u,692u,131074u,3221782528u}/* 22D7 */, /*3258*/{0,312136u,65537u,69862912u,692u,131074u,3221782528u}/* 22D8 */, /*3259*/{0,312144u,65537u,69862912u,692u,131074u,3221782528u}/* 22D9 */, /*3260*/{0,312152u,65537u,69862912u,692u,131074u,3221782528u}/* 22DA */, /*3261*/{0,312160u,65537u,69862912u,692u,131074u,3221782528u}/* 22DB */, /*3262*/{0,312168u,65537u,69862912u,692u,131074u,3221782528u}/* 22DC */, /*3263*/{0,312176u,65537u,69862912u,692u,131074u,3221782528u}/* 22DD */, /*3264*/{0,312184u,65537u,69862912u,692u,131074u,3221782528u}/* 22DE */, /*3265*/{0,312192u,65537u,69862912u,692u,131074u,3221782528u}/* 22DF */, /*3266*/{674758656u,312200u,65537u,69862914u,692u,131074u,557056u}/* 22E0 */, /*3267*/{675282944u,312208u,65537u,69862914u,692u,131074u,557056u}/* 22E1 */, /*3268*/{675807232u,312216u,65537u,69862914u,692u,131074u,557056u}/* 22E2 */, /*3269*/{676331520u,312224u,65537u,69862914u,692u,131074u,557056u}/* 22E3 */, /*3270*/{0,312232u,65537u,69862912u,692u,131074u,3221782528u}/* 22E4 */, /*3271*/{0,312240u,65537u,69862912u,692u,131074u,3221782528u}/* 22E5 */, /*3272*/{0,312248u,65537u,69862912u,692u,131074u,3221782528u}/* 22E6 */, /*3273*/{0,312256u,65537u,69862912u,692u,131074u,3221782528u}/* 22E7 */, /*3274*/{0,312264u,65537u,69862912u,692u,131074u,3221782528u}/* 22E8 */, /*3275*/{0,312272u,65537u,69862912u,692u,131074u,3221782528u}/* 22E9 */, /*3276*/{676855808u,312280u,65537u,69862914u,692u,131074u,557056u}/* 22EA */, /*3277*/{677380096u,312288u,65537u,69862914u,692u,131074u,557056u}/* 22EB */, /*3278*/{677904384u,312296u,65537u,69862914u,692u,131074u,557056u}/* 22EC */, /*3279*/{678428672u,312304u,65537u,69862914u,692u,131074u,557056u}/* 22ED */, /*3280*/{0,312312u,65537u,69862912u,692u,131074u,3221782528u}/* 22F0 */, /*3281*/{0,312320u,65537u,69862912u,692u,131074u,3221782528u}/* 22F1 */, /*3282*/{0,312328u,65537u,80348672u,692u,131074u,3221782528u}/* 22F2 */, /*3283*/{0,312336u,65537u,80348672u,692u,131074u,3221782528u}/* 22F3 */, /*3284*/{0,312344u,65537u,80348672u,692u,131074u,3221782528u}/* 22F4 */, /*3285*/{0,311296u,65537u,80348672u,692u,131074u,3221782528u}/* 22F5 */, /*3286*/{0,312352u,65537u,80348672u,692u,131074u,3221782528u}/* 22F6 */, /*3287*/{0,312360u,65537u,80348672u,692u,131074u,3221782528u}/* 22F7 */, /*3288*/{0,312368u,65537u,80348672u,692u,131074u,3221782528u}/* 22FA */, /*3289*/{0,312376u,65537u,80348672u,692u,131074u,3221782528u}/* 22FB */, /*3290*/{0,312384u,65537u,80348672u,692u,131074u,3221782528u}/* 22FC */, /*3291*/{0,312392u,65537u,80348672u,692u,131074u,3221782528u}/* 22FD */, /*3292*/{0,312400u,65537u,80348672u,692u,131074u,3221782528u}/* 22FE */, /*3293*/{0,315392u,65537u,69863104u,688u,131072u,3221782528u}/* 2300 */, /*3294*/{0,315392u,65537u,76154560u,688u,131072u,3221782528u}/* 2301 */, /*3295*/{0,316504u,65537u,69862656u,13632180u,131074u,3226992640u}/* 2308 */, /*3296*/{0,316512u,65537u,69862720u,13632180u,131074u,3226992640u}/* 2309 */, /*3297*/{0,316520u,65537u,69862656u,13632180u,131074u,3226992640u}/* 230A */, /*3298*/{0,316528u,65537u,69862720u,13632180u,131074u,3226992640u}/* 230B */, /*3299*/{0,315392u,65537u,69862912u,692u,131074u,3221782528u}/* 2320 */, /*3300*/{678952960u,316536u,65536u,69862658u,13631540u,69599232u,1572864u}/* 2329 */, /*3301*/{679477248u,316544u,65536u,69862722u,13631540u,69599232u,1572864u}/* 232A */, /*3302*/{0,315392u,65537u,69207744u,688u,131072u,3221782528u}/* 2336 */, /*3303*/{0,315392u,65537u,80348672u,688u,131074u,3221782528u}/* 237C */, /*3304*/{0,315392u,65537u,75499200u,688u,131072u,3221782528u}/* 2395 */, /*3305*/{0,315392u,65537u,80348864u,688u,131074u,3225976832u}/* 23B4 */, /*3306*/{0,315392u,65537u,80348864u,688u,131072u,3221782528u}/* 23B6 */, /*3307*/{0,315392u,65537u,82446016u,688u,131072u,3221782528u}/* 23CF */, /*3308*/{0,315392u,65537u,82446016u,688u,131074u,3225976832u}/* 23D0 */, /*3309*/{0,315392u,65537u,84543168u,688u,131072u,3221782528u}/* 23D1 */, /*3310*/{0,315392u,65537u,86640128u,688u,131074u,3221782528u}/* 23DC */, /*3311*/{0,315392u,65537u,86640320u,688u,131074u,3225976832u}/* 23E2 */, /*3312*/{0,315392u,65537u,86640320u,688u,131072u,3221782528u}/* 23E3 */, /*3313*/{0,315392u,65537u,90834624u,688u,131072u,3221782528u}/* 23E8 */, /*3314*/{0,315392u,65537u,92931776u,688u,131072u,3221782528u}/* 23E9 */, /*3315*/{0,315392u,65537u,101320384u,688u,131072u,3221782528u}/* 23F4 */, /*3316*/{0,319488u,65537u,69863104u,688u,131072u,3221782528u}/* 2400 */, /*3317*/{0,319488u,65537u,76154560u,688u,131072u,3221782528u}/* 2425 */, /*3318*/{0,323584u,65537u,69863104u,688u,131072u,3221782528u}/* 2440 */, /*3319*/{680001536u,327680u,453051905u,69862098u,33558704u,67239937u,2148007936u}/* 2460 */, /*3320*/{680525824u,327680u,486607361u,69862098u,33558704u,67239937u,2147483648u}/* 2461 */, /*3321*/{681050112u,327680u,520161281u,69862098u,33558704u,67239937u,2147483648u}/* 2462 */, /*3322*/{681574400u,327680u,553717761u,69862098u,33558704u,67239937u,2147483648u}/* 2463 */, /*3323*/{682098688u,327680u,587271169u,69862098u,33558704u,67239937u,2147483648u}/* 2464 */, /*3324*/{682622976u,327680u,620828161u,69862098u,33558704u,67239937u,2147483648u}/* 2465 */, /*3325*/{683147264u,327680u,654380545u,69862098u,33558704u,67239937u,2147483648u}/* 2466 */, /*3326*/{683671552u,327680u,687938561u,69862098u,33558704u,67239937u,2147483648u}/* 2467 */, /*3327*/{684195840u,327680u,721490945u,69862098u,33558704u,67239937u,2147483648u}/* 2468 */, /*3328*/{684720128u,327680u,738271233u,69862098u,33556656u,67239937u,2147483648u}/* 2469 */, /*3329*/{685244416u,327680u,755044865u,69862098u,33556656u,67239937u,2147483648u}/* 246A */, /*3330*/{685768704u,327680u,771826177u,69862098u,33556656u,67239937u,2147483648u}/* 246B */, /*3331*/{686292992u,327680u,788600833u,69862098u,33556656u,67239937u,2147483648u}/* 246C */, /*3332*/{686817280u,327680u,805381121u,69862098u,33556656u,67239937u,2147483648u}/* 246D */, /*3333*/{687341568u,327680u,822155777u,69862098u,33556656u,67239937u,2147483648u}/* 246E */, /*3334*/{687865856u,327680u,838936065u,69862098u,33556656u,67239937u,2147483648u}/* 246F */, /*3335*/{688390144u,327680u,855711233u,69862098u,33556656u,67239937u,2147483648u}/* 2470 */, /*3336*/{688914432u,327680u,872491009u,69862098u,33556656u,67239937u,2147483648u}/* 2471 */, /*3337*/{689438720u,327680u,889268737u,69862098u,33556656u,67239937u,2147483648u}/* 2472 */, /*3338*/{689963008u,327680u,906046465u,69862098u,33556656u,67239937u,2147483648u}/* 2473 */, /*3339*/{690487296u,327680u,453051905u,69862084u,33558704u,67239937u,2147483648u}/* 2474 */, /*3340*/{691011584u,327680u,486607361u,69862084u,33558704u,67239937u,2147483648u}/* 2475 */, /*3341*/{691535872u,327680u,520161281u,69862084u,33558704u,67239937u,2147483648u}/* 2476 */, /*3342*/{692060160u,327680u,553717761u,69862084u,33558704u,67239937u,2147483648u}/* 2477 */, /*3343*/{692584448u,327680u,587271169u,69862084u,33558704u,67239937u,2147483648u}/* 2478 */, /*3344*/{693108736u,327680u,620828161u,69862084u,33558704u,67239937u,2147483648u}/* 2479 */, /*3345*/{693633024u,327680u,654380545u,69862084u,33558704u,67239937u,2147483648u}/* 247A */, /*3346*/{694157312u,327680u,687938561u,69862084u,33558704u,67239937u,2147483648u}/* 247B */, /*3347*/{694681600u,327680u,721490945u,69862084u,33558704u,67239937u,2147483648u}/* 247C */, /*3348*/{695205888u,327680u,738271233u,69862084u,33556656u,67239937u,2147483648u}/* 247D */, /*3349*/{695730176u,327680u,755044865u,69862084u,33556656u,67239937u,2147483648u}/* 247E */, /*3350*/{696254464u,327680u,771826177u,69862084u,33556656u,67239937u,2147483648u}/* 247F */, /*3351*/{696778752u,327680u,788600833u,69862084u,33556656u,67239937u,2147483648u}/* 2480 */, /*3352*/{697303040u,327680u,805381121u,69862084u,33556656u,67239937u,2147483648u}/* 2481 */, /*3353*/{697827328u,327680u,822155777u,69862084u,33556656u,67239937u,2147483648u}/* 2482 */, /*3354*/{698351616u,327680u,838936065u,69862084u,33556656u,67239937u,2147483648u}/* 2483 */, /*3355*/{698875904u,327680u,855711233u,69862084u,33556656u,67239937u,2147483648u}/* 2484 */, /*3356*/{699400192u,327680u,872491009u,69862084u,33556656u,67239937u,2147483648u}/* 2485 */, /*3357*/{699924480u,327680u,889268737u,69862084u,33556656u,67239937u,2147483648u}/* 2486 */, /*3358*/{700448768u,327680u,906046465u,69862084u,33556656u,67239937u,2147483648u}/* 2487 */, /*3359*/{700973056u,327680u,453051905u,69337796u,33558704u,67239937u,2147483648u}/* 2488 */, /*3360*/{701497344u,327680u,486607361u,69337796u,33558704u,67239937u,2147483648u}/* 2489 */, /*3361*/{702021632u,327680u,520161281u,69337796u,33558704u,67239937u,2147483648u}/* 248A */, /*3362*/{702545920u,327680u,553717761u,69337796u,33558704u,67239937u,2147483648u}/* 248B */, /*3363*/{703070208u,327680u,587271169u,69337796u,33558704u,67239937u,2147483648u}/* 248C */, /*3364*/{703594496u,327680u,620828161u,69337796u,33558704u,67239937u,2147483648u}/* 248D */, /*3365*/{704118784u,327680u,654380545u,69337796u,33558704u,67239937u,2147483648u}/* 248E */, /*3366*/{704643072u,327680u,687938561u,69337796u,33558704u,67239937u,2147483648u}/* 248F */, /*3367*/{705167360u,327680u,721490945u,69337796u,33558704u,67239937u,2147483648u}/* 2490 */, /*3368*/{705691648u,327680u,738271233u,69337796u,33556656u,67239937u,2147483648u}/* 2491 */, /*3369*/{706215936u,327680u,755044865u,69337796u,33556656u,67239937u,2147483648u}/* 2492 */, /*3370*/{706740224u,327680u,771826177u,69337796u,33556656u,67239937u,2147483648u}/* 2493 */, /*3371*/{707264512u,327680u,788600833u,69337796u,33556656u,67239937u,2147483648u}/* 2494 */, /*3372*/{707788800u,327680u,805381121u,69337796u,33556656u,67239937u,2147483648u}/* 2495 */, /*3373*/{708313088u,327680u,822155777u,69337796u,33556656u,67239937u,2147483648u}/* 2496 */, /*3374*/{708837376u,327680u,838936065u,69337796u,33556656u,67239937u,2147483648u}/* 2497 */, /*3375*/{709361664u,327680u,855711233u,69337796u,33556656u,67239937u,2147483648u}/* 2498 */, /*3376*/{709885952u,327680u,872491009u,69337796u,33556656u,67239937u,2147483648u}/* 2499 */, /*3377*/{710410240u,327680u,889268737u,69337796u,33556656u,67239937u,2147483648u}/* 249A */, /*3378*/{710934528u,327680u,906046465u,69337796u,33556656u,67239937u,2147483648u}/* 249B */, /*3379*/{711458816u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 249C */, /*3380*/{711983104u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 249D */, /*3381*/{712507392u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 249E */, /*3382*/{713031680u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 249F */, /*3383*/{713555968u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A0 */, /*3384*/{714080256u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A1 */, /*3385*/{714604544u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A2 */, /*3386*/{715128832u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A3 */, /*3387*/{715653120u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A4 */, /*3388*/{716177408u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A5 */, /*3389*/{716701696u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A6 */, /*3390*/{717225984u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A7 */, /*3391*/{717750272u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A8 */, /*3392*/{718274560u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24A9 */, /*3393*/{718798848u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AA */, /*3394*/{719323136u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AB */, /*3395*/{719847424u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AC */, /*3396*/{720371712u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AD */, /*3397*/{720896000u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AE */, /*3398*/{721420288u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24AF */, /*3399*/{721944576u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B0 */, /*3400*/{722468864u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B1 */, /*3401*/{722993152u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B2 */, /*3402*/{723517440u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B3 */, /*3403*/{724041728u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B4 */, /*3404*/{724566016u,327680u,65537u,69207748u,176u,67239936u,2147516416u}/* 24B5 */, /*3405*/{725291648u,1554317312u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24B6 */, /*3406*/{725816064u,1556414464u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24B7 */, /*3407*/{726340480u,1558511616u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24B8 */, /*3408*/{726864896u,1560608768u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24B9 */, /*3409*/{727389312u,1562705920u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BA */, /*3410*/{727913728u,1564803072u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BB */, /*3411*/{728438144u,1566900224u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BC */, /*3412*/{728962560u,1568997376u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BD */, /*3413*/{729486976u,1571094528u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BE */, /*3414*/{730011392u,1573191680u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24BF */, /*3415*/{730535808u,1575288832u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C0 */, /*3416*/{731060224u,1577385984u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C1 */, /*3417*/{731584640u,1579483136u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C2 */, /*3418*/{732109056u,1581580288u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C3 */, /*3419*/{732633472u,1583677440u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C4 */, /*3420*/{733157888u,1585774592u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C5 */, /*3421*/{733682304u,1587871744u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C6 */, /*3422*/{734206720u,1589968896u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C7 */, /*3423*/{734731136u,1592066048u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C8 */, /*3424*/{735255552u,1594163200u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24C9 */, /*3425*/{735779968u,1596260352u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CA */, /*3426*/{736304384u,1598357504u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CB */, /*3427*/{736828800u,1600454656u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CC */, /*3428*/{737353216u,1602551808u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CD */, /*3429*/{737877632u,1604648960u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CE */, /*3430*/{738402048u,1606746112u,65537u,69230290u,8388849u,2080505856u,2418050048u}/* 24CF */, /*3431*/{738926464u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D0 */, /*3432*/{739450880u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D1 */, /*3433*/{739975296u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D2 */, /*3434*/{740499712u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D3 */, /*3435*/{741024128u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D4 */, /*3436*/{741548544u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D5 */, /*3437*/{742072960u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D6 */, /*3438*/{742597376u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D7 */, /*3439*/{743121792u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D8 */, /*3440*/{743646208u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24D9 */, /*3441*/{744170624u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DA */, /*3442*/{744695040u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DB */, /*3443*/{745219456u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DC */, /*3444*/{745743872u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DD */, /*3445*/{746268288u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DE */, /*3446*/{746792704u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24DF */, /*3447*/{747317120u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E0 */, /*3448*/{747841536u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E1 */, /*3449*/{748365952u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E2 */, /*3450*/{748890368u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E3 */, /*3451*/{749414784u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E4 */, /*3452*/{749939200u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E5 */, /*3453*/{750463616u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E6 */, /*3454*/{750988032u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E7 */, /*3455*/{751512448u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E8 */, /*3456*/{752036864u,327680u,65537u,69230290u,7340272u,1459748872u,2424340480u}/* 24E9 */, /*3457*/{752353280u,327680u,33620993u,69862098u,33558704u,67239937u,2147483648u}/* 24EA */, /*3458*/{0,327680u,755044865u,80347840u,33557168u,131073u,3221225472u}/* 24EB */, /*3459*/{0,327680u,771826177u,80347840u,33557168u,131073u,3221225472u}/* 24EC */, /*3460*/{0,327680u,788600833u,80347840u,33557168u,131073u,3221225472u}/* 24ED */, /*3461*/{0,327680u,805381121u,80347840u,33557168u,131073u,3221225472u}/* 24EE */, /*3462*/{0,327680u,822155777u,80347840u,33557168u,131073u,3221225472u}/* 24EF */, /*3463*/{0,327680u,838936065u,80347840u,33557168u,131073u,3221225472u}/* 24F0 */, /*3464*/{0,327680u,855711233u,80347840u,33557168u,131073u,3221225472u}/* 24F1 */, /*3465*/{0,327680u,872491009u,80347840u,33557168u,131073u,3221225472u}/* 24F2 */, /*3466*/{0,327680u,889268737u,80347840u,33557168u,131073u,3221225472u}/* 24F3 */, /*3467*/{0,327680u,906046465u,80347840u,33557168u,131073u,3221225472u}/* 24F4 */, /*3468*/{0,327680u,453051905u,80347840u,33559216u,131073u,3221225472u}/* 24F5 */, /*3469*/{0,327680u,486607361u,80347840u,33559216u,131073u,3221225472u}/* 24F6 */, /*3470*/{0,327680u,520161281u,80347840u,33559216u,131073u,3221225472u}/* 24F7 */, /*3471*/{0,327680u,553717761u,80347840u,33559216u,131073u,3221225472u}/* 24F8 */, /*3472*/{0,327680u,587271169u,80347840u,33559216u,131073u,3221225472u}/* 24F9 */, /*3473*/{0,327680u,620828161u,80347840u,33559216u,131073u,3221225472u}/* 24FA */, /*3474*/{0,327680u,654380545u,80347840u,33559216u,131073u,3221225472u}/* 24FB */, /*3475*/{0,327680u,687938561u,80347840u,33559216u,131073u,3221225472u}/* 24FC */, /*3476*/{0,327680u,721490945u,80347840u,33559216u,131073u,3221225472u}/* 24FD */, /*3477*/{0,327680u,738271233u,80347840u,33557168u,131073u,3221225472u}/* 24FE */, /*3478*/{0,327680u,33620993u,82444992u,33559216u,131073u,3221225472u}/* 24FF */, /*3479*/{0,331776u,65537u,69863104u,688u,131072u,3221782528u}/* 2500 */, /*3480*/{0,335872u,65537u,69863104u,688u,131072u,3221782528u}/* 2580 */, /*3481*/{0,335872u,65537u,80348864u,688u,131072u,3221782528u}/* 2596 */, /*3482*/{0,339968u,65537u,69863104u,688u,131074u,3225976832u}/* 25A0 */, /*3483*/{0,339968u,65537u,69863104u,688u,131072u,3221782528u}/* 25A2 */, /*3484*/{0,339968u,65537u,69862912u,688u,131074u,3221782528u}/* 25B7 */, /*3485*/{0,339968u,65537u,76154560u,688u,131072u,3221782528u}/* 25F0 */, /*3486*/{0,339968u,65537u,80348672u,688u,131074u,3221782528u}/* 25F8 */, /*3487*/{0,344064u,65537u,69863104u,688u,131072u,3221782528u}/* 2600 */, /*3488*/{0,344064u,65537u,69863104u,688u,131074u,3225976832u}/* 2605 */, /*3489*/{0,344064u,65537u,82446016u,688u,131072u,3221782528u}/* 2614 */, /*3490*/{0,344064u,65537u,80348864u,688u,131072u,3221782528u}/* 2616 */, /*3491*/{0,344064u,65537u,84543168u,688u,131072u,3221782528u}/* 2618 */, /*3492*/{0,344064u,65537u,76154560u,688u,131072u,3221782528u}/* 2619 */, /*3493*/{0,344064u,65537u,69862912u,688u,131074u,3221782528u}/* 266F */, /*3494*/{0,344064u,65537u,88737472u,688u,131072u,3221782528u}/* 269D */, /*3495*/{0,344064u,65537u,90834624u,688u,131072u,3221782528u}/* 269E */, /*3496*/{0,344064u,65537u,83887808u,688u,131072u,3221782528u}/* 26AC */, /*3497*/{0,344064u,65537u,86640320u,688u,131072u,3221782528u}/* 26B2 */, /*3498*/{0,344064u,65537u,92931776u,688u,131072u,3221782528u}/* 26CE */, /*3499*/{0,348160u,65537u,101320384u,688u,131072u,3221782528u}/* 2700 */, /*3500*/{0,348160u,65537u,69863104u,688u,131072u,3221782528u}/* 2701 */, /*3501*/{0,348160u,65537u,92931776u,688u,131072u,3221782528u}/* 2705 */, /*3502*/{0,348160u,65537u,90834624u,688u,131072u,3221782528u}/* 2757 */, /*3503*/{0,348160u,65537u,69863104u,13632176u,131072u,3221782528u}/* 275B */, /*3504*/{0,348160u,65537u,92931776u,13632176u,131072u,3221782528u}/* 275F */, /*3505*/{0,349320u,65537u,80348416u,13632180u,131072u,3222798336u}/* 2768 */, /*3506*/{0,349328u,65537u,80348480u,13632180u,131072u,3222798336u}/* 2769 */, /*3507*/{0,349336u,65537u,80348416u,13632180u,131072u,3222798336u}/* 276A */, /*3508*/{0,349344u,65537u,80348480u,13632180u,131072u,3222798336u}/* 276B */, /*3509*/{0,349352u,65537u,80348416u,13632180u,131072u,3222798336u}/* 276C */, /*3510*/{0,349360u,65537u,80348480u,13632180u,131072u,3222798336u}/* 276D */, /*3511*/{0,349368u,65537u,80348416u,13632180u,131072u,3222798336u}/* 276E */, /*3512*/{0,349376u,65537u,80348480u,13632180u,131072u,3222798336u}/* 276F */, /*3513*/{0,349384u,65537u,80348416u,13632180u,131072u,3222798336u}/* 2770 */, /*3514*/{0,349392u,65537u,80348480u,13632180u,131072u,3222798336u}/* 2771 */, /*3515*/{0,349400u,65537u,80348416u,13632180u,131072u,3222798336u}/* 2772 */, /*3516*/{0,349408u,65537u,80348480u,13632180u,131072u,3222798336u}/* 2773 */, /*3517*/{0,349416u,65537u,80348416u,13632180u,131072u,3222798336u}/* 2774 */, /*3518*/{0,349424u,65537u,80348480u,13632180u,131072u,3222798336u}/* 2775 */, /*3519*/{0,348160u,453051905u,69862080u,33559216u,131073u,3221225472u}/* 2776 */, /*3520*/{0,348160u,486607361u,69862080u,33559216u,131073u,3221225472u}/* 2777 */, /*3521*/{0,348160u,520161281u,69862080u,33559216u,131073u,3221225472u}/* 2778 */, /*3522*/{0,348160u,553717761u,69862080u,33559216u,131073u,3221225472u}/* 2779 */, /*3523*/{0,348160u,587271169u,69862080u,33559216u,131073u,3221225472u}/* 277A */, /*3524*/{0,348160u,620828161u,69862080u,33559216u,131073u,3221225472u}/* 277B */, /*3525*/{0,348160u,654380545u,69862080u,33559216u,131073u,3221225472u}/* 277C */, /*3526*/{0,348160u,687938561u,69862080u,33559216u,131073u,3221225472u}/* 277D */, /*3527*/{0,348160u,721490945u,69862080u,33559216u,131073u,3221225472u}/* 277E */, /*3528*/{0,348160u,738271233u,69862080u,33557168u,131073u,3221225472u}/* 277F */, /*3529*/{0,352256u,65537u,84542976u,692u,131074u,3221782528u}/* 27C0 */, /*3530*/{0,352256u,65537u,84542976u,688u,131074u,3221782528u}/* 27C1 */, /*3531*/{0,353528u,65537u,84542976u,692u,131074u,3221782528u}/* 27C3 */, /*3532*/{0,353536u,65537u,84542976u,692u,131074u,3221782528u}/* 27C4 */, /*3533*/{0,353544u,65537u,84542720u,13632180u,131074u,3226992640u}/* 27C5 */, /*3534*/{0,353552u,65537u,84542784u,13632180u,131074u,3226992640u}/* 27C6 */, /*3535*/{0,352256u,65537u,86640128u,688u,131074u,3221782528u}/* 27C7 */, /*3536*/{0,353560u,65537u,86640128u,692u,131074u,3221782528u}/* 27C8 */, /*3537*/{0,353568u,65537u,86640128u,692u,131074u,3221782528u}/* 27C9 */, /*3538*/{0,353576u,65537u,95028736u,692u,131074u,3221782528u}/* 27CB */, /*3539*/{0,352256u,65537u,88737280u,692u,131074u,3221782528u}/* 27CC */, /*3540*/{0,353584u,65537u,95028736u,692u,131074u,3221782528u}/* 27CD */, /*3541*/{0,352256u,65537u,92931584u,688u,131074u,3221782528u}/* 27CE */, /*3542*/{0,352256u,65537u,80348672u,688u,131074u,3221782528u}/* 27D0 */, /*3543*/{0,352256u,65537u,80348672u,692u,131074u,3221782528u}/* 27D3 */, /*3544*/{0,353592u,65537u,80348672u,692u,131074u,3221782528u}/* 27D5 */, /*3545*/{0,353600u,65537u,80348672u,692u,131074u,3221782528u}/* 27D6 */, /*3546*/{0,353608u,65537u,80348672u,692u,131074u,3221782528u}/* 27DD */, /*3547*/{0,353616u,65537u,80348672u,692u,131074u,3221782528u}/* 27DE */, /*3548*/{0,353624u,65537u,80348672u,692u,131074u,3221782528u}/* 27E2 */, /*3549*/{0,353632u,65537u,80348672u,692u,131074u,3221782528u}/* 27E3 */, /*3550*/{0,353640u,65537u,80348672u,692u,131074u,3221782528u}/* 27E4 */, /*3551*/{0,353648u,65537u,80348672u,692u,131074u,3221782528u}/* 27E5 */, /*3552*/{0,353656u,65537u,80348416u,13632180u,131074u,3226992640u}/* 27E6 */, /*3553*/{0,353664u,65537u,80348480u,13632180u,131074u,3226992640u}/* 27E7 */, /*3554*/{0,353672u,65537u,80348416u,13632180u,131074u,3226992640u}/* 27E8 */, /*3555*/{0,353680u,65537u,80348480u,13632180u,131074u,3226992640u}/* 27E9 */, /*3556*/{0,353688u,65537u,80348416u,13632180u,131074u,3226992640u}/* 27EA */, /*3557*/{0,353696u,65537u,80348480u,13632180u,131074u,3226992640u}/* 27EB */, /*3558*/{0,353704u,65537u,88737024u,13632180u,131074u,3226992640u}/* 27EC */, /*3559*/{0,353712u,65537u,88737088u,13632180u,131074u,3226992640u}/* 27ED */, /*3560*/{0,353720u,65537u,88737024u,13632180u,131074u,3226992640u}/* 27EE */, /*3561*/{0,353728u,65537u,88737088u,13632180u,131074u,3226992640u}/* 27EF */, /*3562*/{0,356352u,65537u,80348672u,688u,131074u,3221782528u}/* 27F0 */, /*3563*/{0,360448u,3473409u,75499200u,688u,131072u,3221782528u}/* 2800 */, /*3564*/{0,364544u,65537u,80348672u,688u,131074u,3221782528u}/* 2900 */, /*3565*/{0,368640u,65537u,80348672u,688u,131074u,3221782528u}/* 2980 */, /*3566*/{0,370120u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2983 */, /*3567*/{0,370128u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2984 */, /*3568*/{0,370136u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2985 */, /*3569*/{0,370144u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2986 */, /*3570*/{0,370152u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2987 */, /*3571*/{0,370160u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2988 */, /*3572*/{0,370168u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2989 */, /*3573*/{0,370176u,65537u,80348480u,13632180u,131074u,3226992640u}/* 298A */, /*3574*/{0,370184u,65537u,80348416u,13632180u,131074u,3226992640u}/* 298B */, /*3575*/{0,370192u,65537u,80348480u,13632180u,131074u,3226992640u}/* 298C */, /*3576*/{0,370200u,65537u,80348416u,13632180u,131074u,3226992640u}/* 298D */, /*3577*/{0,370208u,65537u,80348480u,13632180u,131074u,3226992640u}/* 298E */, /*3578*/{0,370216u,65537u,80348416u,13632180u,131074u,3226992640u}/* 298F */, /*3579*/{0,370224u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2990 */, /*3580*/{0,370232u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2991 */, /*3581*/{0,370240u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2992 */, /*3582*/{0,370248u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2993 */, /*3583*/{0,370256u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2994 */, /*3584*/{0,370264u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2995 */, /*3585*/{0,370272u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2996 */, /*3586*/{0,370280u,65537u,80348416u,13632180u,131074u,3226992640u}/* 2997 */, /*3587*/{0,370288u,65537u,80348480u,13632180u,131074u,3226992640u}/* 2998 */, /*3588*/{0,368640u,65537u,80348672u,692u,131074u,3221782528u}/* 299B */, /*3589*/{0,370296u,65537u,80348672u,692u,131074u,3221782528u}/* 29B8 */, /*3590*/{0,370304u,65537u,80348672u,692u,131074u,3221782528u}/* 29C0 */, /*3591*/{0,370312u,65537u,80348672u,692u,131074u,3221782528u}/* 29C1 */, /*3592*/{0,370320u,65537u,80348672u,692u,131074u,3221782528u}/* 29C4 */, /*3593*/{0,370328u,65537u,80348672u,692u,131074u,3221782528u}/* 29C5 */, /*3594*/{0,370336u,65537u,80348672u,692u,131074u,3221782528u}/* 29CF */, /*3595*/{0,370344u,65537u,80348672u,692u,131074u,3221782528u}/* 29D0 */, /*3596*/{0,370352u,65537u,80348672u,692u,131074u,3221782528u}/* 29D1 */, /*3597*/{0,370360u,65537u,80348672u,692u,131074u,3221782528u}/* 29D2 */, /*3598*/{0,370368u,65537u,80348672u,692u,131074u,3221782528u}/* 29D4 */, /*3599*/{0,370376u,65537u,80348672u,692u,131074u,3221782528u}/* 29D5 */, /*3600*/{0,370384u,65537u,80348416u,13632180u,131074u,3226992640u}/* 29D8 */, /*3601*/{0,370392u,65537u,80348480u,13632180u,131074u,3226992640u}/* 29D9 */, /*3602*/{0,370400u,65537u,80348416u,13632180u,131074u,3226992640u}/* 29DA */, /*3603*/{0,370408u,65537u,80348480u,13632180u,131074u,3226992640u}/* 29DB */, /*3604*/{0,370416u,65537u,80348672u,692u,131074u,3221782528u}/* 29F5 */, /*3605*/{0,370424u,65537u,80348672u,692u,131074u,3221782528u}/* 29F8 */, /*3606*/{0,370432u,65537u,80348672u,692u,131074u,3221782528u}/* 29F9 */, /*3607*/{0,370440u,65537u,80348416u,13632180u,131074u,3226992640u}/* 29FC */, /*3608*/{0,370448u,65537u,80348480u,13632180u,131074u,3226992640u}/* 29FD */, /*3609*/{0,372736u,65537u,80348672u,688u,131074u,3221782528u}/* 2A00 */, /*3610*/{0,372736u,65537u,80348672u,692u,131074u,3221782528u}/* 2A0A */, /*3611*/{752877568u,372736u,65537u,80348676u,180u,67239938u,2148040704u}/* 2A0C */, /*3612*/{0,374552u,65537u,80348672u,692u,131074u,3221782528u}/* 2A2B */, /*3613*/{0,374560u,65537u,80348672u,692u,131074u,3221782528u}/* 2A2C */, /*3614*/{0,374568u,65537u,80348672u,692u,131074u,3221782528u}/* 2A2D */, /*3615*/{0,374576u,65537u,80348672u,692u,131074u,3221782528u}/* 2A2E */, /*3616*/{0,374584u,65537u,80348672u,692u,131074u,3221782528u}/* 2A34 */, /*3617*/{0,374592u,65537u,80348672u,692u,131074u,3221782528u}/* 2A35 */, /*3618*/{0,374600u,65537u,80348672u,692u,131074u,3221782528u}/* 2A3C */, /*3619*/{0,374608u,65537u,80348672u,692u,131074u,3221782528u}/* 2A3D */, /*3620*/{0,374616u,65537u,80348672u,692u,131074u,3221782528u}/* 2A64 */, /*3621*/{0,374624u,65537u,80348672u,692u,131074u,3221782528u}/* 2A65 */, /*3622*/{753401856u,372736u,65537u,80348676u,180u,67239938u,2148040704u}/* 2A74 */, /*3623*/{753926144u,372736u,65537u,80348676u,176u,67239938u,2148040704u}/* 2A75 */, /*3624*/{754450432u,372736u,65537u,80348676u,176u,67239938u,2148040704u}/* 2A76 */, /*3625*/{0,374632u,65537u,80348672u,692u,131074u,3221782528u}/* 2A79 */, /*3626*/{0,374640u,65537u,80348672u,692u,131074u,3221782528u}/* 2A7A */, /*3627*/{0,374648u,65537u,80348672u,692u,131074u,3221782528u}/* 2A7D */, /*3628*/{0,374656u,65537u,80348672u,692u,131074u,3221782528u}/* 2A7E */, /*3629*/{0,374664u,65537u,80348672u,692u,131074u,3221782528u}/* 2A7F */, /*3630*/{0,374672u,65537u,80348672u,692u,131074u,3221782528u}/* 2A80 */, /*3631*/{0,374680u,65537u,80348672u,692u,131074u,3221782528u}/* 2A81 */, /*3632*/{0,374688u,65537u,80348672u,692u,131074u,3221782528u}/* 2A82 */, /*3633*/{0,374696u,65537u,80348672u,692u,131074u,3221782528u}/* 2A83 */, /*3634*/{0,374704u,65537u,80348672u,692u,131074u,3221782528u}/* 2A84 */, /*3635*/{0,374712u,65537u,80348672u,692u,131074u,3221782528u}/* 2A8B */, /*3636*/{0,374720u,65537u,80348672u,692u,131074u,3221782528u}/* 2A8C */, /*3637*/{0,374728u,65537u,80348672u,692u,131074u,3221782528u}/* 2A91 */, /*3638*/{0,374736u,65537u,80348672u,692u,131074u,3221782528u}/* 2A92 */, /*3639*/{0,374744u,65537u,80348672u,692u,131074u,3221782528u}/* 2A93 */, /*3640*/{0,374752u,65537u,80348672u,692u,131074u,3221782528u}/* 2A94 */, /*3641*/{0,374760u,65537u,80348672u,692u,131074u,3221782528u}/* 2A95 */, /*3642*/{0,374768u,65537u,80348672u,692u,131074u,3221782528u}/* 2A96 */, /*3643*/{0,374776u,65537u,80348672u,692u,131074u,3221782528u}/* 2A97 */, /*3644*/{0,374784u,65537u,80348672u,692u,131074u,3221782528u}/* 2A98 */, /*3645*/{0,374792u,65537u,80348672u,692u,131074u,3221782528u}/* 2A99 */, /*3646*/{0,374800u,65537u,80348672u,692u,131074u,3221782528u}/* 2A9A */, /*3647*/{0,374808u,65537u,80348672u,692u,131074u,3221782528u}/* 2A9B */, /*3648*/{0,374816u,65537u,80348672u,692u,131074u,3221782528u}/* 2A9C */, /*3649*/{0,374824u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA1 */, /*3650*/{0,374832u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA2 */, /*3651*/{0,374840u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA6 */, /*3652*/{0,374848u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA7 */, /*3653*/{0,374856u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA8 */, /*3654*/{0,374864u,65537u,80348672u,692u,131074u,3221782528u}/* 2AA9 */, /*3655*/{0,374872u,65537u,80348672u,692u,131074u,3221782528u}/* 2AAA */, /*3656*/{0,374880u,65537u,80348672u,692u,131074u,3221782528u}/* 2AAB */, /*3657*/{0,374888u,65537u,80348672u,692u,131074u,3221782528u}/* 2AAC */, /*3658*/{0,374896u,65537u,80348672u,692u,131074u,3221782528u}/* 2AAD */, /*3659*/{0,374904u,65537u,80348672u,692u,131074u,3221782528u}/* 2AAF */, /*3660*/{0,374912u,65537u,80348672u,692u,131074u,3221782528u}/* 2AB0 */, /*3661*/{0,374920u,65537u,80348672u,692u,131074u,3221782528u}/* 2AB3 */, /*3662*/{0,374928u,65537u,80348672u,692u,131074u,3221782528u}/* 2AB4 */, /*3663*/{0,374936u,65537u,80348672u,692u,131074u,3221782528u}/* 2ABB */, /*3664*/{0,374944u,65537u,80348672u,692u,131074u,3221782528u}/* 2ABC */, /*3665*/{0,374952u,65537u,80348672u,692u,131074u,3221782528u}/* 2ABD */, /*3666*/{0,374960u,65537u,80348672u,692u,131074u,3221782528u}/* 2ABE */, /*3667*/{0,374968u,65537u,80348672u,692u,131074u,3221782528u}/* 2ABF */, /*3668*/{0,374976u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC0 */, /*3669*/{0,374984u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC1 */, /*3670*/{0,374992u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC2 */, /*3671*/{0,375000u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC3 */, /*3672*/{0,375008u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC4 */, /*3673*/{0,375016u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC5 */, /*3674*/{0,375024u,65537u,80348672u,692u,131074u,3221782528u}/* 2AC6 */, /*3675*/{0,375032u,65537u,80348672u,692u,131074u,3221782528u}/* 2ACD */, /*3676*/{0,375040u,65537u,80348672u,692u,131074u,3221782528u}/* 2ACE */, /*3677*/{0,375048u,65537u,80348672u,692u,131074u,3221782528u}/* 2ACF */, /*3678*/{0,375056u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD0 */, /*3679*/{0,375064u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD1 */, /*3680*/{0,375072u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD2 */, /*3681*/{0,375080u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD3 */, /*3682*/{0,375088u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD4 */, /*3683*/{0,375096u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD5 */, /*3684*/{0,375104u,65537u,80348672u,692u,131074u,3221782528u}/* 2AD6 */, /*3685*/{754974720u,372736u,65536u,80348674u,52u,67502082u,557056u}/* 2ADC */, /*3686*/{0,375112u,65537u,80348672u,692u,131074u,3221782528u}/* 2ADE */, /*3687*/{0,375120u,65537u,80348672u,692u,131074u,3221782528u}/* 2AE3 */, /*3688*/{0,375128u,65537u,80348672u,692u,131074u,3221782528u}/* 2AE4 */, /*3689*/{0,375136u,65537u,80348672u,692u,131074u,3221782528u}/* 2AE5 */, /*3690*/{0,375144u,65537u,80348672u,692u,131074u,3221782528u}/* 2AEC */, /*3691*/{0,375152u,65537u,80348672u,692u,131074u,3221782528u}/* 2AED */, /*3692*/{0,375160u,65537u,80348672u,692u,131074u,3221782528u}/* 2AF7 */, /*3693*/{0,375168u,65537u,80348672u,692u,131074u,3221782528u}/* 2AF8 */, /*3694*/{0,375176u,65537u,80348672u,692u,131074u,3221782528u}/* 2AF9 */, /*3695*/{0,375184u,65537u,80348672u,692u,131074u,3221782528u}/* 2AFA */, /*3696*/{0,376832u,65537u,82446016u,688u,131072u,3221782528u}/* 2B00 */, /*3697*/{0,376832u,65537u,84543168u,688u,131072u,3221782528u}/* 2B0E */, /*3698*/{0,376832u,65537u,86640320u,688u,131072u,3221782528u}/* 2B14 */, /*3699*/{0,376832u,65537u,88737472u,688u,131072u,3221782528u}/* 2B1B */, /*3700*/{0,376832u,65537u,88737280u,688u,131074u,3221782528u}/* 2B30 */, /*3701*/{0,376832u,65537u,101320384u,688u,131072u,3221782528u}/* 2B4D */, /*3702*/{0,376832u,65537u,90834624u,688u,131072u,3221782528u}/* 2B55 */, /*3703*/{0,376832u,65537u,103417536u,688u,131072u,3221782528u}/* 2BEC */, /*3704*/{208000u,1608896512u,3735553u,83908672u,8389361u,2080507488u,3221750976u}/* 2C00 */, /*3705*/{208128u,1610993664u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C01 */, /*3706*/{208256u,1613090816u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C02 */, /*3707*/{208384u,1615187968u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C03 */, /*3708*/{208512u,1617285120u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C04 */, /*3709*/{208640u,1619382272u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C05 */, /*3710*/{208768u,1621479424u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C06 */, /*3711*/{208896u,1623576576u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C07 */, /*3712*/{209024u,1625673728u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C08 */, /*3713*/{209152u,1627770880u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C09 */, /*3714*/{209280u,1629868032u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0A */, /*3715*/{209408u,1631965184u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0B */, /*3716*/{209536u,1634062336u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0C */, /*3717*/{209664u,1636159488u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0D */, /*3718*/{209792u,1638256640u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0E */, /*3719*/{209920u,1640353792u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C0F */, /*3720*/{210048u,1642450944u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C10 */, /*3721*/{210176u,1644548096u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C11 */, /*3722*/{210304u,1646645248u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C12 */, /*3723*/{210432u,1648742400u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C13 */, /*3724*/{210560u,1650839552u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C14 */, /*3725*/{210688u,1652936704u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C15 */, /*3726*/{210816u,1655033856u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C16 */, /*3727*/{210944u,1657131008u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C17 */, /*3728*/{211072u,1659228160u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C18 */, /*3729*/{211200u,1661325312u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C19 */, /*3730*/{211328u,1663422464u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1A */, /*3731*/{211456u,1665519616u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1B */, /*3732*/{211584u,1667616768u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1C */, /*3733*/{211712u,1669713920u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1D */, /*3734*/{211840u,1671811072u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1E */, /*3735*/{211968u,1673908224u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C1F */, /*3736*/{212096u,1676005376u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C20 */, /*3737*/{212224u,1678102528u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C21 */, /*3738*/{212352u,1680199680u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C22 */, /*3739*/{212480u,1682296832u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C23 */, /*3740*/{212608u,1684393984u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C24 */, /*3741*/{212736u,1686491136u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C25 */, /*3742*/{212864u,1688588288u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C26 */, /*3743*/{212992u,1690685440u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C27 */, /*3744*/{213120u,1692782592u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C28 */, /*3745*/{213248u,1694879744u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C29 */, /*3746*/{213376u,1696976896u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C2A */, /*3747*/{213504u,1699074048u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C2B */, /*3748*/{213632u,1701171200u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C2C */, /*3749*/{213760u,1703268352u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C2D */, /*3750*/{213888u,1705365504u,3735553u,83908672u,8389361u,2080507488u,3221226688u}/* 2C2E */, /*3751*/{214016u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C30 */, /*3752*/{214144u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C31 */, /*3753*/{214272u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C32 */, /*3754*/{214400u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C33 */, /*3755*/{214528u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C34 */, /*3756*/{214656u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C35 */, /*3757*/{214784u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C36 */, /*3758*/{214912u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C37 */, /*3759*/{215040u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C38 */, /*3760*/{215168u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C39 */, /*3761*/{215296u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3A */, /*3762*/{215424u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3B */, /*3763*/{215552u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3C */, /*3764*/{215680u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3D */, /*3765*/{215808u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3E */, /*3766*/{215936u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C3F */, /*3767*/{216064u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C40 */, /*3768*/{216192u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C41 */, /*3769*/{216320u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C42 */, /*3770*/{216448u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C43 */, /*3771*/{216576u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C44 */, /*3772*/{216704u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C45 */, /*3773*/{216832u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C46 */, /*3774*/{216960u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C47 */, /*3775*/{217088u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C48 */, /*3776*/{217216u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C49 */, /*3777*/{217344u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4A */, /*3778*/{217472u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4B */, /*3779*/{217600u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4C */, /*3780*/{217728u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4D */, /*3781*/{217856u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4E */, /*3782*/{217984u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C4F */, /*3783*/{218112u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C50 */, /*3784*/{218240u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C51 */, /*3785*/{218368u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C52 */, /*3786*/{218496u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C53 */, /*3787*/{218624u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C54 */, /*3788*/{218752u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C55 */, /*3789*/{218880u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C56 */, /*3790*/{219008u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C57 */, /*3791*/{219136u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C58 */, /*3792*/{219264u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C59 */, /*3793*/{219392u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C5A */, /*3794*/{219520u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C5B */, /*3795*/{219648u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C5C */, /*3796*/{219776u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C5D */, /*3797*/{219904u,380928u,3735553u,83908736u,7340784u,1392641640u,3221225664u}/* 2C5E */, /*3798*/{220032u,1707466752u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C60 */, /*3799*/{220160u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C61 */, /*3800*/{220288u,1709563904u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C62 */, /*3801*/{220416u,1711661056u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C63 */, /*3802*/{220544u,1713758208u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C64 */, /*3803*/{220672u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C65 */, /*3804*/{220800u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C66 */, /*3805*/{220928u,1715855360u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C67 */, /*3806*/{221056u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C68 */, /*3807*/{221184u,1717952512u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C69 */, /*3808*/{221312u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C6A */, /*3809*/{221440u,1720049664u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C6B */, /*3810*/{221568u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C6C */, /*3811*/{221696u,1722146816u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 2C6D */, /*3812*/{221824u,1724243968u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 2C6E */, /*3813*/{221952u,1726341120u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 2C6F */, /*3814*/{222080u,1728438272u,131073u,90200128u,8389361u,2080507488u,3221226688u}/* 2C70 */, /*3815*/{0,385024u,131073u,88103040u,7340784u,1073874536u,3221225664u}/* 2C71 */, /*3816*/{222208u,1730535424u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* 2C72 */, /*3817*/{222336u,385024u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* 2C73 */, /*3818*/{0,385024u,131073u,86005888u,7340784u,1073874536u,3221225664u}/* 2C74 */, /*3819*/{222464u,1732632576u,131073u,86005824u,8389361u,2080507488u,3221226688u}/* 2C75 */, /*3820*/{222592u,385024u,131073u,86005888u,7340784u,1392641640u,3221225664u}/* 2C76 */, /*3821*/{755499008u,385024u,131073u,88103190u,7340272u,3288467016u,2155880640u}/* 2C7C */, /*3822*/{756023296u,385024u,131073u,88103188u,7340272u,3288467016u,2155872448u}/* 2C7D */, /*3823*/{222720u,1734729728u,131073u,90200128u,8389361u,2080507488u,3221226688u}/* 2C7E */, /*3824*/{222848u,1736826880u,131073u,90200128u,8389361u,2080507488u,3221226688u}/* 2C7F */, /*3825*/{222976u,1738928128u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C80 */, /*3826*/{223104u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C81 */, /*3827*/{223232u,1741025280u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C82 */, /*3828*/{223360u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C83 */, /*3829*/{223488u,1743122432u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C84 */, /*3830*/{223616u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C85 */, /*3831*/{223744u,1745219584u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C86 */, /*3832*/{223872u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C87 */, /*3833*/{224000u,1747316736u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C88 */, /*3834*/{224128u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C89 */, /*3835*/{224256u,1749413888u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C8A */, /*3836*/{224384u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C8B */, /*3837*/{224512u,1751511040u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C8C */, /*3838*/{224640u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C8D */, /*3839*/{224768u,1753608192u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C8E */, /*3840*/{224896u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C8F */, /*3841*/{225024u,1755705344u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C90 */, /*3842*/{225152u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C91 */, /*3843*/{225280u,1757802496u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C92 */, /*3844*/{225408u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C93 */, /*3845*/{225536u,1759899648u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C94 */, /*3846*/{225664u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C95 */, /*3847*/{225792u,1761996800u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C96 */, /*3848*/{225920u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C97 */, /*3849*/{226048u,1764093952u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C98 */, /*3850*/{226176u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C99 */, /*3851*/{226304u,1766191104u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C9A */, /*3852*/{226432u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C9B */, /*3853*/{226560u,1768288256u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C9C */, /*3854*/{226688u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C9D */, /*3855*/{226816u,1770385408u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2C9E */, /*3856*/{226944u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2C9F */, /*3857*/{227072u,1772482560u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CA0 */, /*3858*/{227200u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CA1 */, /*3859*/{227328u,1774579712u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CA2 */, /*3860*/{227456u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CA3 */, /*3861*/{227584u,1776676864u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CA4 */, /*3862*/{227712u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CA5 */, /*3863*/{227840u,1778774016u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CA6 */, /*3864*/{227968u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CA7 */, /*3865*/{228096u,1780871168u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CA8 */, /*3866*/{228224u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CA9 */, /*3867*/{228352u,1782968320u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CAA */, /*3868*/{228480u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CAB */, /*3869*/{228608u,1785065472u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CAC */, /*3870*/{228736u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CAD */, /*3871*/{228864u,1787162624u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CAE */, /*3872*/{228992u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CAF */, /*3873*/{229120u,1789259776u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CB0 */, /*3874*/{229248u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CB1 */, /*3875*/{229376u,1791356928u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CB2 */, /*3876*/{229504u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CB3 */, /*3877*/{229632u,1793454080u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CB4 */, /*3878*/{229760u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CB5 */, /*3879*/{229888u,1795551232u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CB6 */, /*3880*/{230016u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CB7 */, /*3881*/{230144u,1797648384u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CB8 */, /*3882*/{230272u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CB9 */, /*3883*/{230400u,1799745536u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CBA */, /*3884*/{230528u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CBB */, /*3885*/{230656u,1801842688u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CBC */, /*3886*/{230784u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CBD */, /*3887*/{230912u,1803939840u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CBE */, /*3888*/{231040u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CBF */, /*3889*/{231168u,1806036992u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CC0 */, /*3890*/{231296u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CC1 */, /*3891*/{231424u,1808134144u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CC2 */, /*3892*/{231552u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CC3 */, /*3893*/{231680u,1810231296u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CC4 */, /*3894*/{231808u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CC5 */, /*3895*/{231936u,1812328448u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CC6 */, /*3896*/{232064u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CC7 */, /*3897*/{232192u,1814425600u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CC8 */, /*3898*/{232320u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CC9 */, /*3899*/{232448u,1816522752u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CCA */, /*3900*/{232576u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CCB */, /*3901*/{232704u,1818619904u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CCC */, /*3902*/{232832u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CCD */, /*3903*/{232960u,1820717056u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CCE */, /*3904*/{233088u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CCF */, /*3905*/{233216u,1822814208u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CD0 */, /*3906*/{233344u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CD1 */, /*3907*/{233472u,1824911360u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CD2 */, /*3908*/{233600u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CD3 */, /*3909*/{233728u,1827008512u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CD4 */, /*3910*/{233856u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CD5 */, /*3911*/{233984u,1829105664u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CD6 */, /*3912*/{234112u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CD7 */, /*3913*/{234240u,1831202816u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CD8 */, /*3914*/{234368u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CD9 */, /*3915*/{234496u,1833299968u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CDA */, /*3916*/{234624u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CDB */, /*3917*/{234752u,1835397120u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CDC */, /*3918*/{234880u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CDD */, /*3919*/{235008u,1837494272u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CDE */, /*3920*/{235136u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CDF */, /*3921*/{235264u,1839591424u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CE0 */, /*3922*/{235392u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CE1 */, /*3923*/{235520u,1841688576u,3604481u,83908672u,8389361u,2080507488u,3221226688u}/* 2CE2 */, /*3924*/{235648u,389120u,3604481u,83908736u,7340784u,1392641640u,3221225664u}/* 2CE3 */, /*3925*/{0,389120u,3604481u,83908736u,7340784u,1073874536u,3221225664u}/* 2CE4 */, /*3926*/{0,389120u,3604481u,84543168u,688u,131072u,3221258240u}/* 2CE5 */, /*3927*/{235776u,1843785728u,3604481u,90200128u,8389361u,2080507488u,3221226688u}/* 2CEB */, /*3928*/{235904u,389120u,3604481u,90200192u,7340784u,1392641640u,3221225664u}/* 2CEC */, /*3929*/{236032u,1845882880u,3604481u,90200128u,8389361u,2080507488u,3221226688u}/* 2CED */, /*3930*/{236160u,389120u,3604481u,90200192u,7340784u,1392641640u,3221225664u}/* 2CEE */, /*3931*/{0,389120u,3604480u,3446421888u,808714928u,2148598788u,3221225600u}/* 2CEF */, /*3932*/{236288u,1847980032u,3604481u,94394432u,8389361u,2080507488u,3221226688u}/* 2CF2 */, /*3933*/{236416u,389120u,3604481u,94394496u,7340784u,1392641640u,3221225664u}/* 2CF3 */, /*3934*/{0,389120u,3604481u,84542912u,688u,131072u,3222274048u}/* 2CF9 */, /*3935*/{0,389120u,288818689u,84542144u,16779952u,131073u,3221225472u}/* 2CFD */, /*3936*/{236544u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D00 */, /*3937*/{236672u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D01 */, /*3938*/{236800u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D02 */, /*3939*/{236928u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D03 */, /*3940*/{237056u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D04 */, /*3941*/{237184u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D05 */, /*3942*/{237312u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D06 */, /*3943*/{237440u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D07 */, /*3944*/{237568u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D08 */, /*3945*/{237696u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D09 */, /*3946*/{237824u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0A */, /*3947*/{237952u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0B */, /*3948*/{238080u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0C */, /*3949*/{238208u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0D */, /*3950*/{238336u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0E */, /*3951*/{238464u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D0F */, /*3952*/{238592u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D10 */, /*3953*/{238720u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D11 */, /*3954*/{238848u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D12 */, /*3955*/{238976u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D13 */, /*3956*/{239104u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D14 */, /*3957*/{239232u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D15 */, /*3958*/{239360u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D16 */, /*3959*/{239488u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D17 */, /*3960*/{239616u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D18 */, /*3961*/{239744u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D19 */, /*3962*/{239872u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1A */, /*3963*/{240000u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1B */, /*3964*/{240128u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1C */, /*3965*/{240256u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1D */, /*3966*/{240384u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1E */, /*3967*/{240512u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D1F */, /*3968*/{240640u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D20 */, /*3969*/{240768u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D21 */, /*3970*/{240896u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D22 */, /*3971*/{241024u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D23 */, /*3972*/{241152u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D24 */, /*3973*/{241280u,393216u,1572865u,83908736u,7340784u,1392641640u,3221225664u}/* 2D25 */, /*3974*/{241408u,393216u,1572865u,94394496u,7340784u,1392641640u,3221225664u}/* 2D27 */, /*3975*/{241536u,393216u,1572865u,94394496u,7340784u,1392641640u,3221225664u}/* 2D2D */, /*3976*/{0,397312u,3801089u,83908928u,9437936u,132672u,3221225664u}/* 2D30 */, /*3977*/{0,397312u,3801089u,94394688u,9437936u,132672u,3221225664u}/* 2D66 */, /*3978*/{756547584u,397312u,3801089u,83908884u,9437424u,2214725184u,2147483840u}/* 2D6F */, /*3979*/{0,397312u,3801089u,92276160u,688u,131072u,3222274048u}/* 2D70 */, /*3980*/{0,397312u,3801088u,361511296u,808714928u,2147582980u,3221225600u}/* 2D7F */, /*3981*/{0,401408u,1703937u,83908928u,9437936u,132672u,3221225664u}/* 2D80 */, /*3982*/{0,405504u,262144u,3444324736u,808714992u,2147550212u,3489661056u}/* 2DE0 */, /*3983*/{0,409600u,65537u,84542912u,13632176u,131072u,3222798336u}/* 2E00 */, /*3984*/{0,412056u,65537u,84543232u,13632180u,131072u,3222798336u}/* 2E02 */, /*3985*/{0,412064u,65537u,84543296u,13632180u,131072u,3222798336u}/* 2E03 */, /*3986*/{0,412072u,65537u,84543232u,13632180u,131072u,3222798336u}/* 2E04 */, /*3987*/{0,412080u,65537u,84543296u,13632180u,131072u,3222798336u}/* 2E05 */, /*3988*/{0,412088u,65537u,84543232u,13632180u,131072u,3222798336u}/* 2E09 */, /*3989*/{0,412096u,65537u,84543296u,13632180u,131072u,3222798336u}/* 2E0A */, /*3990*/{0,412104u,65537u,84543232u,13632180u,131072u,3222798336u}/* 2E0C */, /*3991*/{0,412112u,65537u,84543296u,13632180u,131072u,3222798336u}/* 2E0D */, /*3992*/{0,409600u,65537u,84542912u,688u,131072u,3222798336u}/* 2E0E */, /*3993*/{0,409600u,65537u,84542656u,688u,8527872u,3222798336u}/* 2E17 */, /*3994*/{0,409600u,65537u,88737216u,688u,131072u,3222798336u}/* 2E18 */, /*3995*/{0,409600u,65537u,88736960u,688u,8519680u,3222798336u}/* 2E1A */, /*3996*/{0,412120u,65537u,84543232u,13632180u,131072u,3222798336u}/* 2E1C */, /*3997*/{0,412128u,65537u,84543296u,13632180u,131072u,3222798336u}/* 2E1D */, /*3998*/{0,412136u,65537u,88737536u,13632180u,131072u,3222798336u}/* 2E20 */, /*3999*/{0,412144u,65537u,88737600u,13632180u,131072u,3222798336u}/* 2E21 */, /*4000*/{0,412152u,65537u,88737024u,13632180u,131072u,3222798336u}/* 2E22 */, /*4001*/{0,412160u,65537u,88737088u,13632180u,131072u,3222798336u}/* 2E23 */, /*4002*/{0,412168u,65537u,88737024u,13632180u,131072u,3222798336u}/* 2E24 */, /*4003*/{0,412176u,65537u,88737088u,13632180u,131072u,3222798336u}/* 2E25 */, /*4004*/{0,412184u,65537u,88737024u,13632180u,131072u,3222798336u}/* 2E26 */, /*4005*/{0,412192u,65537u,88737088u,13632180u,131072u,3222798336u}/* 2E27 */, /*4006*/{0,412200u,65537u,88737024u,13632180u,131072u,3222798336u}/* 2E28 */, /*4007*/{0,412208u,65537u,88737088u,13632180u,131072u,3222798336u}/* 2E29 */, /*4008*/{0,409600u,65537u,88737216u,12583600u,131072u,3222818816u}/* 2E2E */, /*4009*/{0,409600u,65537u,88758528u,9437936u,2148663360u,3221749760u}/* 2E2F */, /*4010*/{0,409600u,65537u,90834368u,688u,131072u,3222798336u}/* 2E31 */, /*4011*/{0,409600u,65537u,95028672u,688u,131072u,3222798336u}/* 2E32 */, /*4012*/{0,409600u,65537u,95028416u,688u,8519680u,3222798336u}/* 2E3A */, /*4013*/{0,409600u,65537u,101320128u,12583600u,131072u,3222818816u}/* 2E3C */, /*4014*/{0,409600u,65537u,101320128u,688u,131072u,3222798336u}/* 2E3D */, /*4015*/{0,409600u,65537u,101319872u,688u,8519680u,3222798336u}/* 2E40 */, /*4016*/{0,409600u,65537u,101320128u,688u,131072u,3222802432u}/* 2E41 */, /*4017*/{0,409600u,65537u,101319936u,13632176u,131072u,3222929408u}/* 2E42 */, /*4018*/{0,413696u,2359297u,76154560u,688u,131072u,3221848064u}/* 2E80 */, /*4019*/{0,413696u,2359297u,76154560u,688u,131072u,3221323776u}/* 2E81 */, /*4020*/{757071872u,413696u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2E9F */, /*4021*/{757596160u,413696u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2EF3 */, /*4022*/{758120448u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F00 */, /*4023*/{758644736u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F01 */, /*4024*/{759169024u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F02 */, /*4025*/{759693312u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F03 */, /*4026*/{760217600u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F04 */, /*4027*/{760741888u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F05 */, /*4028*/{761266176u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F06 */, /*4029*/{761790464u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F07 */, /*4030*/{762314752u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F08 */, /*4031*/{762839040u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F09 */, /*4032*/{763363328u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0A */, /*4033*/{763887616u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0B */, /*4034*/{764411904u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0C */, /*4035*/{764936192u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0D */, /*4036*/{765460480u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0E */, /*4037*/{765984768u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F0F */, /*4038*/{766509056u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F10 */, /*4039*/{767033344u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F11 */, /*4040*/{767557632u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F12 */, /*4041*/{768081920u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F13 */, /*4042*/{768606208u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F14 */, /*4043*/{769130496u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F15 */, /*4044*/{769654784u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F16 */, /*4045*/{770179072u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F17 */, /*4046*/{770703360u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F18 */, /*4047*/{771227648u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F19 */, /*4048*/{771751936u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1A */, /*4049*/{772276224u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1B */, /*4050*/{772800512u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1C */, /*4051*/{773324800u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1D */, /*4052*/{773849088u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1E */, /*4053*/{774373376u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F1F */, /*4054*/{774897664u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F20 */, /*4055*/{775421952u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F21 */, /*4056*/{775946240u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F22 */, /*4057*/{776470528u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F23 */, /*4058*/{776994816u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F24 */, /*4059*/{777519104u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F25 */, /*4060*/{778043392u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F26 */, /*4061*/{778567680u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F27 */, /*4062*/{779091968u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F28 */, /*4063*/{779616256u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F29 */, /*4064*/{780140544u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2A */, /*4065*/{780664832u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2B */, /*4066*/{781189120u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2C */, /*4067*/{781713408u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2D */, /*4068*/{782237696u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2E */, /*4069*/{782761984u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F2F */, /*4070*/{783286272u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F30 */, /*4071*/{783810560u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F31 */, /*4072*/{784334848u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F32 */, /*4073*/{784859136u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F33 */, /*4074*/{785383424u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F34 */, /*4075*/{785907712u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F35 */, /*4076*/{786432000u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F36 */, /*4077*/{786956288u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F37 */, /*4078*/{787480576u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F38 */, /*4079*/{788004864u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F39 */, /*4080*/{788529152u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3A */, /*4081*/{789053440u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3B */, /*4082*/{789577728u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3C */, /*4083*/{790102016u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3D */, /*4084*/{790626304u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3E */, /*4085*/{791150592u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F3F */, /*4086*/{791674880u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F40 */, /*4087*/{792199168u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F41 */, /*4088*/{792723456u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F42 */, /*4089*/{793247744u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F43 */, /*4090*/{793772032u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F44 */, /*4091*/{794296320u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F45 */, /*4092*/{794820608u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F46 */, /*4093*/{795344896u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F47 */, /*4094*/{795869184u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F48 */, /*4095*/{796393472u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F49 */, /*4096*/{796917760u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4A */, /*4097*/{797442048u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4B */, /*4098*/{797966336u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4C */, /*4099*/{798490624u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4D */, /*4100*/{799014912u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4E */, /*4101*/{799539200u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F4F */, /*4102*/{800063488u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F50 */, /*4103*/{800587776u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F51 */, /*4104*/{801112064u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F52 */, /*4105*/{801636352u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F53 */, /*4106*/{802160640u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F54 */, /*4107*/{802684928u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F55 */, /*4108*/{803209216u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F56 */, /*4109*/{803733504u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F57 */, /*4110*/{804257792u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F58 */, /*4111*/{804782080u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F59 */, /*4112*/{805306368u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5A */, /*4113*/{805830656u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5B */, /*4114*/{806354944u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5C */, /*4115*/{806879232u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5D */, /*4116*/{807403520u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5E */, /*4117*/{807927808u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F5F */, /*4118*/{808452096u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F60 */, /*4119*/{808976384u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F61 */, /*4120*/{809500672u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F62 */, /*4121*/{810024960u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F63 */, /*4122*/{810549248u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F64 */, /*4123*/{811073536u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F65 */, /*4124*/{811597824u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F66 */, /*4125*/{812122112u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F67 */, /*4126*/{812646400u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F68 */, /*4127*/{813170688u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F69 */, /*4128*/{813694976u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6A */, /*4129*/{814219264u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6B */, /*4130*/{814743552u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6C */, /*4131*/{815267840u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6D */, /*4132*/{815792128u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6E */, /*4133*/{816316416u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F6F */, /*4134*/{816840704u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F70 */, /*4135*/{817364992u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F71 */, /*4136*/{817889280u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F72 */, /*4137*/{818413568u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F73 */, /*4138*/{818937856u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F74 */, /*4139*/{819462144u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F75 */, /*4140*/{819986432u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F76 */, /*4141*/{820510720u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F77 */, /*4142*/{821035008u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F78 */, /*4143*/{821559296u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F79 */, /*4144*/{822083584u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7A */, /*4145*/{822607872u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7B */, /*4146*/{823132160u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7C */, /*4147*/{823656448u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7D */, /*4148*/{824180736u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7E */, /*4149*/{824705024u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F7F */, /*4150*/{825229312u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F80 */, /*4151*/{825753600u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F81 */, /*4152*/{826277888u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F82 */, /*4153*/{826802176u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F83 */, /*4154*/{827326464u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F84 */, /*4155*/{827850752u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F85 */, /*4156*/{828375040u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F86 */, /*4157*/{828899328u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F87 */, /*4158*/{829423616u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F88 */, /*4159*/{829947904u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F89 */, /*4160*/{830472192u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8A */, /*4161*/{830996480u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8B */, /*4162*/{831520768u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8C */, /*4163*/{832045056u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8D */, /*4164*/{832569344u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8E */, /*4165*/{833093632u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F8F */, /*4166*/{833617920u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F90 */, /*4167*/{834142208u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F91 */, /*4168*/{834666496u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F92 */, /*4169*/{835190784u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F93 */, /*4170*/{835715072u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F94 */, /*4171*/{836239360u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F95 */, /*4172*/{836763648u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F96 */, /*4173*/{837287936u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F97 */, /*4174*/{837812224u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F98 */, /*4175*/{838336512u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F99 */, /*4176*/{838860800u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9A */, /*4177*/{839385088u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9B */, /*4178*/{839909376u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9C */, /*4179*/{840433664u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9D */, /*4180*/{840957952u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9E */, /*4181*/{841482240u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2F9F */, /*4182*/{842006528u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA0 */, /*4183*/{842530816u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA1 */, /*4184*/{843055104u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA2 */, /*4185*/{843579392u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA3 */, /*4186*/{844103680u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA4 */, /*4187*/{844627968u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA5 */, /*4188*/{845152256u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA6 */, /*4189*/{845676544u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA7 */, /*4190*/{846200832u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA8 */, /*4191*/{846725120u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FA9 */, /*4192*/{847249408u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAA */, /*4193*/{847773696u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAB */, /*4194*/{848297984u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAC */, /*4195*/{848822272u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAD */, /*4196*/{849346560u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAE */, /*4197*/{849870848u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FAF */, /*4198*/{850395136u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB0 */, /*4199*/{850919424u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB1 */, /*4200*/{851443712u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB2 */, /*4201*/{851968000u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB3 */, /*4202*/{852492288u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB4 */, /*4203*/{853016576u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB5 */, /*4204*/{853540864u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB6 */, /*4205*/{854065152u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB7 */, /*4206*/{854589440u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB8 */, /*4207*/{855113728u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FB9 */, /*4208*/{855638016u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBA */, /*4209*/{856162304u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBB */, /*4210*/{856686592u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBC */, /*4211*/{857210880u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBD */, /*4212*/{857735168u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBE */, /*4213*/{858259456u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FBF */, /*4214*/{858783744u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC0 */, /*4215*/{859308032u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC1 */, /*4216*/{859832320u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC2 */, /*4217*/{860356608u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC3 */, /*4218*/{860880896u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC4 */, /*4219*/{861405184u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC5 */, /*4220*/{861929472u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC6 */, /*4221*/{862453760u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC7 */, /*4222*/{862978048u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC8 */, /*4223*/{863502336u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FC9 */, /*4224*/{864026624u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCA */, /*4225*/{864550912u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCB */, /*4226*/{865075200u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCC */, /*4227*/{865599488u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCD */, /*4228*/{866123776u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCE */, /*4229*/{866648064u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FCF */, /*4230*/{867172352u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD0 */, /*4231*/{867696640u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD1 */, /*4232*/{868220928u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD2 */, /*4233*/{868745216u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD3 */, /*4234*/{869269504u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD4 */, /*4235*/{869793792u,417792u,2359297u,76154564u,176u,67239936u,2147581952u}/* 2FD5 */, /*4236*/{0,421888u,65537u,76154560u,688u,135168u,3221258240u}/* 2FF0 */, /*4237*/{0,421888u,65537u,76154560u,688u,133120u,3221258240u}/* 2FF2 */, /*4238*/{870318080u,425984u,65537u,69796634u,6291632u,67239936u,2147483936u}/* 3000 */, /*4239*/{0,425984u,65537u,69862848u,14680752u,131072u,3222802432u}/* 3001 */, /*4240*/{0,425984u,65537u,69862848u,12583600u,131072u,3222818816u}/* 3002 */, /*4241*/{0,425984u,65537u,69862848u,688u,131072u,3222798336u}/* 3003 */, /*4242*/{0,425984u,65537u,69863104u,688u,131072u,3221258240u}/* 3004 */, /*4243*/{0,425984u,2359297u,69228800u,9437936u,2148140608u,3221225664u}/* 3005 */, /*4244*/{0,425984u,65537u,69206336u,9437936u,132928u,3221225664u}/* 3006 */, /*4245*/{0,425984u,35914753u,69206656u,42994416u,132865u,3221225664u}/* 3007 */, /*4246*/{0,428600u,65537u,69862656u,13632180u,131072u,3222798336u}/* 3008 */, /*4247*/{0,428608u,65537u,69862720u,13632180u,131072u,3222798336u}/* 3009 */, /*4248*/{0,428616u,65537u,69862656u,13632180u,131072u,3222798336u}/* 300A */, /*4249*/{0,428624u,65537u,69862720u,13632180u,131072u,3222798336u}/* 300B */, /*4250*/{0,428632u,65537u,69862656u,13632180u,131072u,3222929408u}/* 300C */, /*4251*/{0,428640u,65537u,69862720u,13632180u,131072u,3222929408u}/* 300D */, /*4252*/{0,428648u,65537u,69862656u,13632180u,131072u,3222929408u}/* 300E */, /*4253*/{0,428656u,65537u,69862720u,13632180u,131072u,3222929408u}/* 300F */, /*4254*/{0,428664u,65537u,69862656u,13632180u,131072u,3222798336u}/* 3010 */, /*4255*/{0,428672u,65537u,69862720u,13632180u,131072u,3222798336u}/* 3011 */, /*4256*/{0,425984u,65537u,69863104u,688u,131072u,3221782528u}/* 3012 */, /*4257*/{0,428680u,65537u,69862656u,13632180u,131072u,3222798336u}/* 3014 */, /*4258*/{0,428688u,65537u,69862720u,13632180u,131072u,3222798336u}/* 3015 */, /*4259*/{0,428696u,65537u,69862656u,13632180u,131072u,3222798336u}/* 3016 */, /*4260*/{0,428704u,65537u,69862720u,13632180u,131072u,3222798336u}/* 3017 */, /*4261*/{0,428712u,65537u,69862656u,13632180u,131072u,3222798336u}/* 3018 */, /*4262*/{0,428720u,65537u,69862720u,13632180u,131072u,3222798336u}/* 3019 */, /*4263*/{0,428728u,65537u,69862656u,13632180u,131072u,3222798336u}/* 301A */, /*4264*/{0,428736u,65537u,69862720u,13632180u,131072u,3222798336u}/* 301B */, /*4265*/{0,425984u,65537u,69862592u,688u,8519680u,3222798336u}/* 301C */, /*4266*/{0,425984u,65537u,69862656u,13632176u,131072u,3222929408u}/* 301D */, /*4267*/{0,425984u,65537u,69862720u,13632176u,131072u,3222929408u}/* 301E */, /*4268*/{0,425984u,455345665u,69206656u,42994416u,132865u,3221225664u}/* 3021 */, /*4269*/{0,425984u,488901121u,69206656u,42994416u,132865u,3221225664u}/* 3022 */, /*4270*/{0,425984u,522455041u,69206656u,42994416u,132865u,3221225664u}/* 3023 */, /*4271*/{0,425984u,556011521u,69206656u,42994416u,132865u,3221225664u}/* 3024 */, /*4272*/{0,425984u,589564929u,69206656u,42994416u,132865u,3221225664u}/* 3025 */, /*4273*/{0,425984u,623121921u,69206656u,42994416u,132865u,3221225664u}/* 3026 */, /*4274*/{0,425984u,656674305u,69206656u,42994416u,132865u,3221225664u}/* 3027 */, /*4275*/{0,425984u,690232321u,69206656u,42994416u,132865u,3221225664u}/* 3028 */, /*4276*/{0,425984u,723784705u,69206656u,42994416u,132865u,3221225664u}/* 3029 */, /*4277*/{0,425984u,2686976u,3022797184u,808714928u,2148598788u,3221225600u}/* 302A */, /*4278*/{0,425984u,2686976u,3358341504u,808714928u,2148598788u,3221225600u}/* 302B */, /*4279*/{0,425984u,2686976u,3492559232u,808714928u,2148598788u,3221225600u}/* 302C */, /*4280*/{0,425984u,2686976u,3157014912u,808714928u,2148598788u,3221225600u}/* 302D */, /*4281*/{0,425984u,1638400u,3223337472u,808714928u,1115140u,3288334464u}/* 302E */, /*4282*/{0,425984u,65537u,69226752u,9437936u,2148140608u,3221225664u}/* 3031 */, /*4283*/{0,425984u,65537u,69226752u,814744304u,2148140608u,3221225664u}/* 3035 */, /*4284*/{870842368u,425984u,65537u,69863108u,176u,67239936u,2147516416u}/* 3036 */, /*4285*/{871366656u,425984u,740564993u,75498116u,42993904u,67241729u,2147483840u}/* 3038 */, /*4286*/{871890944u,425984u,908340225u,75498116u,42993904u,67241729u,2147483840u}/* 3039 */, /*4287*/{872415232u,425984u,1076117505u,75498116u,42993904u,67241729u,2147483840u}/* 303A */, /*4288*/{0,425984u,2359297u,79714560u,9437936u,2147616320u,3221225664u}/* 303B */, /*4289*/{0,425984u,65537u,79714624u,9437936u,132672u,3221225664u}/* 303C */, /*4290*/{0,425984u,65537u,80348608u,688u,131072u,3222274048u}/* 303D */, /*4291*/{0,425984u,65537u,76154560u,688u,131072u,3221258240u}/* 303E */, /*4292*/{0,430080u,2162689u,69206336u,9437936u,132672u,3221225664u}/* 3041 */, /*4293*/{872939520u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 304C */, /*4294*/{873463808u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 304E */, /*4295*/{873988096u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3050 */, /*4296*/{874512384u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3052 */, /*4297*/{875036672u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3054 */, /*4298*/{875560960u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3056 */, /*4299*/{876085248u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3058 */, /*4300*/{876609536u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 305A */, /*4301*/{877133824u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 305C */, /*4302*/{877658112u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 305E */, /*4303*/{878182400u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3060 */, /*4304*/{878706688u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3062 */, /*4305*/{879230976u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3065 */, /*4306*/{879755264u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3067 */, /*4307*/{880279552u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3069 */, /*4308*/{880803840u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3070 */, /*4309*/{881328128u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3071 */, /*4310*/{881852416u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3073 */, /*4311*/{882376704u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3074 */, /*4312*/{882900992u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3076 */, /*4313*/{883425280u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3077 */, /*4314*/{883949568u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3079 */, /*4315*/{884473856u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 307A */, /*4316*/{884998144u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 307C */, /*4317*/{885522432u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 307D */, /*4318*/{886046720u,430080u,2162689u,69206338u,9437936u,132672u,192u}/* 3094 */, /*4319*/{0,430080u,2162689u,79692096u,9437936u,132672u,3221225664u}/* 3095 */, /*4320*/{0,430080u,2686976u,271333760u,808715568u,2148598788u,3221225600u}/* 3099 */, /*4321*/{886571008u,430080u,65537u,69883524u,176u,2215773696u,2164293632u}/* 309B */, /*4322*/{887095296u,430080u,65537u,69883524u,176u,2215773696u,2164293632u}/* 309C */, /*4323*/{0,430080u,2162689u,69206272u,9437936u,2148140608u,3221225664u}/* 309D */, /*4324*/{887619584u,430080u,2162689u,69206274u,9437936u,2148140608u,192u}/* 309E */, /*4325*/{888143872u,430080u,2162689u,79692120u,9437424u,67241536u,2147483840u}/* 309F */, /*4326*/{0,434176u,65537u,80368832u,688u,8519680u,3222274048u}/* 30A0 */, /*4327*/{0,434176u,2228225u,69226816u,9437936u,132672u,3221225664u}/* 30A1 */, /*4328*/{888668160u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30AC */, /*4329*/{889192448u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30AE */, /*4330*/{889716736u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30B0 */, /*4331*/{890241024u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30B2 */, /*4332*/{890765312u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30B4 */, /*4333*/{891289600u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30B6 */, /*4334*/{891813888u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30B8 */, /*4335*/{892338176u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30BA */, /*4336*/{892862464u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30BC */, /*4337*/{893386752u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30BE */, /*4338*/{893911040u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30C0 */, /*4339*/{894435328u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30C2 */, /*4340*/{894959616u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30C5 */, /*4341*/{895483904u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30C7 */, /*4342*/{896008192u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30C9 */, /*4343*/{896532480u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D0 */, /*4344*/{897056768u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D1 */, /*4345*/{897581056u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D3 */, /*4346*/{898105344u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D4 */, /*4347*/{898629632u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D6 */, /*4348*/{899153920u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D7 */, /*4349*/{899678208u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30D9 */, /*4350*/{900202496u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30DA */, /*4351*/{900726784u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30DC */, /*4352*/{901251072u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30DD */, /*4353*/{901775360u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30F4 */, /*4354*/{902299648u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30F7 */, /*4355*/{902823936u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30F8 */, /*4356*/{903348224u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30F9 */, /*4357*/{903872512u,434176u,2228225u,69226818u,9437936u,132672u,192u}/* 30FA */, /*4358*/{0,434176u,65537u,69862848u,688u,139264u,3222274048u}/* 30FB */, /*4359*/{0,434176u,65537u,69226752u,9437936u,2149189184u,3221225664u}/* 30FC */, /*4360*/{0,434176u,2228225u,69226752u,9437936u,2148140608u,3221225664u}/* 30FD */, /*4361*/{904396800u,434176u,2228225u,69226754u,9437936u,2148140608u,192u}/* 30FE */, /*4362*/{904921088u,434176u,2228225u,79712600u,9437424u,67241536u,2147483840u}/* 30FF */, /*4363*/{0,438272u,2293761u,69228864u,9437936u,132672u,3221225664u}/* 3105 */, /*4364*/{0,438272u,2293761u,88103232u,9437936u,132672u,3221225664u}/* 312D */, /*4365*/{905445376u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3131 */, /*4366*/{905969664u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3132 */, /*4367*/{906493952u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3133 */, /*4368*/{907018240u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3134 */, /*4369*/{907542528u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3135 */, /*4370*/{908066816u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3136 */, /*4371*/{908591104u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3137 */, /*4372*/{909115392u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3138 */, /*4373*/{909639680u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3139 */, /*4374*/{910163968u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313A */, /*4375*/{910688256u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313B */, /*4376*/{911212544u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313C */, /*4377*/{911736832u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313D */, /*4378*/{912261120u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313E */, /*4379*/{912785408u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 313F */, /*4380*/{913309696u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3140 */, /*4381*/{913833984u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3141 */, /*4382*/{914358272u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3142 */, /*4383*/{914882560u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3143 */, /*4384*/{915406848u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3144 */, /*4385*/{915931136u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3145 */, /*4386*/{916455424u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3146 */, /*4387*/{916979712u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3147 */, /*4388*/{917504000u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3148 */, /*4389*/{918028288u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3149 */, /*4390*/{918552576u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314A */, /*4391*/{919076864u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314B */, /*4392*/{919601152u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314C */, /*4393*/{920125440u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314D */, /*4394*/{920649728u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314E */, /*4395*/{921174016u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 314F */, /*4396*/{921698304u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3150 */, /*4397*/{922222592u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3151 */, /*4398*/{922746880u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3152 */, /*4399*/{923271168u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3153 */, /*4400*/{923795456u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3154 */, /*4401*/{924319744u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3155 */, /*4402*/{924844032u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3156 */, /*4403*/{925368320u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3157 */, /*4404*/{925892608u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3158 */, /*4405*/{926416896u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3159 */, /*4406*/{926941184u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315A */, /*4407*/{927465472u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315B */, /*4408*/{927989760u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315C */, /*4409*/{928514048u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315D */, /*4410*/{929038336u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315E */, /*4411*/{929562624u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 315F */, /*4412*/{930086912u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3160 */, /*4413*/{930611200u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3161 */, /*4414*/{931135488u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3162 */, /*4415*/{931659776u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3163 */, /*4416*/{932184064u,442368u,1638401u,69228868u,9437424u,71435840u,2281701568u}/* 3164 */, /*4417*/{932708352u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3165 */, /*4418*/{933232640u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3166 */, /*4419*/{933756928u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3167 */, /*4420*/{934281216u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3168 */, /*4421*/{934805504u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3169 */, /*4422*/{935329792u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316A */, /*4423*/{935854080u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316B */, /*4424*/{936378368u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316C */, /*4425*/{936902656u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316D */, /*4426*/{937426944u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316E */, /*4427*/{937951232u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 316F */, /*4428*/{938475520u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3170 */, /*4429*/{938999808u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3171 */, /*4430*/{939524096u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3172 */, /*4431*/{940048384u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3173 */, /*4432*/{940572672u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3174 */, /*4433*/{941096960u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3175 */, /*4434*/{941621248u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3176 */, /*4435*/{942145536u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3177 */, /*4436*/{942669824u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3178 */, /*4437*/{943194112u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3179 */, /*4438*/{943718400u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317A */, /*4439*/{944242688u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317B */, /*4440*/{944766976u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317C */, /*4441*/{945291264u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317D */, /*4442*/{945815552u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317E */, /*4443*/{946339840u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 317F */, /*4444*/{946864128u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3180 */, /*4445*/{947388416u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3181 */, /*4446*/{947912704u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3182 */, /*4447*/{948436992u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3183 */, /*4448*/{948961280u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3184 */, /*4449*/{949485568u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3185 */, /*4450*/{950009856u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3186 */, /*4451*/{950534144u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3187 */, /*4452*/{951058432u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3188 */, /*4453*/{951582720u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 3189 */, /*4454*/{952107008u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 318A */, /*4455*/{952631296u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 318B */, /*4456*/{953155584u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 318C */, /*4457*/{953679872u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 318D */, /*4458*/{954204160u,442368u,1638401u,69228868u,9437424u,67241536u,2147483840u}/* 318E */, /*4459*/{0,446464u,65537u,69207744u,688u,131072u,3221258240u}/* 3190 */, /*4460*/{954728448u,446464u,453051905u,69206740u,33556656u,67239937u,2147483648u}/* 3192 */, /*4461*/{955252736u,446464u,486607361u,69206740u,33556656u,67239937u,2147483648u}/* 3193 */, /*4462*/{955777024u,446464u,520161281u,69206740u,33556656u,67239937u,2147483648u}/* 3194 */, /*4463*/{956301312u,446464u,553717761u,69206740u,33556656u,67239937u,2147483648u}/* 3195 */, /*4464*/{956825600u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 3196 */, /*4465*/{957349888u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 3197 */, /*4466*/{957874176u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 3198 */, /*4467*/{958398464u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 3199 */, /*4468*/{958922752u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319A */, /*4469*/{959447040u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319B */, /*4470*/{959971328u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319C */, /*4471*/{960495616u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319D */, /*4472*/{961019904u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319E */, /*4473*/{961544192u,446464u,65537u,69207764u,176u,67239936u,2147516416u}/* 319F */, /*4474*/{0,450560u,2293761u,75520320u,9437936u,132672u,3221225664u}/* 31A0 */, /*4475*/{0,450560u,2293761u,92297536u,9437936u,132672u,3221225664u}/* 31B8 */, /*4476*/{0,454656u,65537u,84543168u,688u,131072u,3221258240u}/* 31C0 */, /*4477*/{0,454656u,65537u,88737472u,688u,131072u,3221258240u}/* 31D0 */, /*4478*/{0,458752u,2228225u,79712576u,9437936u,132672u,3221225664u}/* 31F0 */, /*4479*/{962068480u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3200 */, /*4480*/{962592768u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3201 */, /*4481*/{963117056u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3202 */, /*4482*/{963641344u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3203 */, /*4483*/{964165632u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3204 */, /*4484*/{964689920u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3205 */, /*4485*/{965214208u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3206 */, /*4486*/{965738496u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3207 */, /*4487*/{966262784u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3208 */, /*4488*/{966787072u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3209 */, /*4489*/{967311360u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320A */, /*4490*/{967835648u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320B */, /*4491*/{968359936u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320C */, /*4492*/{968884224u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320D */, /*4493*/{969408512u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320E */, /*4494*/{969932800u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 320F */, /*4495*/{970457088u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3210 */, /*4496*/{970981376u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3211 */, /*4497*/{971505664u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3212 */, /*4498*/{972029952u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3213 */, /*4499*/{972554240u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3214 */, /*4500*/{973078528u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3215 */, /*4501*/{973602816u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3216 */, /*4502*/{974127104u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3217 */, /*4503*/{974651392u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3218 */, /*4504*/{975175680u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 3219 */, /*4505*/{975699968u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 321A */, /*4506*/{976224256u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 321B */, /*4507*/{976748544u,462848u,1638401u,69207748u,176u,67239936u,2147516416u}/* 321C */, /*4508*/{977272832u,462848u,1638401u,82446020u,176u,67239936u,2147516416u}/* 321D */, /*4509*/{977797120u,462848u,1638401u,82446020u,176u,67239936u,2147516416u}/* 321E */, /*4510*/{978321408u,462848u,453051905u,69206724u,33556656u,67239937u,2147483648u}/* 3220 */, /*4511*/{978845696u,462848u,486607361u,69206724u,33556656u,67239937u,2147483648u}/* 3221 */, /*4512*/{979369984u,462848u,520161281u,69206724u,33556656u,67239937u,2147483648u}/* 3222 */, /*4513*/{979894272u,462848u,553717761u,69206724u,33556656u,67239937u,2147483648u}/* 3223 */, /*4514*/{980418560u,462848u,587271169u,69206724u,33556656u,67239937u,2147483648u}/* 3224 */, /*4515*/{980942848u,462848u,620828161u,69206724u,33556656u,67239937u,2147483648u}/* 3225 */, /*4516*/{981467136u,462848u,654380545u,69206724u,33556656u,67239937u,2147483648u}/* 3226 */, /*4517*/{981991424u,462848u,687938561u,69206724u,33556656u,67239937u,2147483648u}/* 3227 */, /*4518*/{982515712u,462848u,721490945u,69206724u,33556656u,67239937u,2147483648u}/* 3228 */, /*4519*/{983040000u,462848u,738271233u,69206724u,33556656u,67239937u,2147483648u}/* 3229 */, /*4520*/{983564288u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322A */, /*4521*/{984088576u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322B */, /*4522*/{984612864u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322C */, /*4523*/{985137152u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322D */, /*4524*/{985661440u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322E */, /*4525*/{986185728u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 322F */, /*4526*/{986710016u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3230 */, /*4527*/{987234304u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3231 */, /*4528*/{987758592u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3232 */, /*4529*/{988282880u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3233 */, /*4530*/{988807168u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3234 */, /*4531*/{989331456u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3235 */, /*4532*/{989855744u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3236 */, /*4533*/{990380032u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3237 */, /*4534*/{990904320u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3238 */, /*4535*/{991428608u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3239 */, /*4536*/{991952896u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323A */, /*4537*/{992477184u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323B */, /*4538*/{993001472u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323C */, /*4539*/{993525760u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323D */, /*4540*/{994050048u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323E */, /*4541*/{994574336u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 323F */, /*4542*/{995098624u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3240 */, /*4543*/{995622912u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3241 */, /*4544*/{996147200u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3242 */, /*4545*/{996671488u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 3243 */, /*4546*/{997195776u,462848u,65537u,90179282u,176u,67239936u,2147516416u}/* 3244 */, /*4547*/{997720064u,462848u,65537u,90179282u,176u,67239936u,2147516416u}/* 3245 */, /*4548*/{998244352u,462848u,65537u,90179282u,176u,67239936u,2147516416u}/* 3246 */, /*4549*/{998768640u,462848u,65537u,90179282u,176u,67239936u,2147516416u}/* 3247 */, /*4550*/{0,462848u,738271233u,90178240u,33557168u,131073u,3221225472u}/* 3248 */, /*4551*/{0,462848u,906046465u,90178240u,33557168u,131073u,3221225472u}/* 3249 */, /*4552*/{0,462848u,1073823745u,90178240u,33557168u,131073u,3221225472u}/* 324A */, /*4553*/{0,462848u,1241601025u,90178240u,33557168u,131073u,3221225472u}/* 324B */, /*4554*/{0,462848u,1409378305u,90178240u,33557168u,131073u,3221225472u}/* 324C */, /*4555*/{0,462848u,1426156033u,90178240u,33557168u,131073u,3221225472u}/* 324D */, /*4556*/{0,462848u,1442933761u,90178240u,33557168u,131073u,3221225472u}/* 324E */, /*4557*/{0,462848u,1459711489u,90178240u,33557168u,131073u,3221225472u}/* 324F */, /*4558*/{999292928u,462848u,65537u,82446048u,176u,67239936u,2147516416u}/* 3250 */, /*4559*/{999817216u,462848u,922824193u,80347858u,33556656u,67239937u,2147483648u}/* 3251 */, /*4560*/{1000341504u,462848u,939601921u,80347858u,33556656u,67239937u,2147483648u}/* 3252 */, /*4561*/{1000865792u,462848u,956379649u,80347858u,33556656u,67239937u,2147483648u}/* 3253 */, /*4562*/{1001390080u,462848u,973157377u,80347858u,33556656u,67239937u,2147483648u}/* 3254 */, /*4563*/{1001914368u,462848u,989935105u,80347858u,33556656u,67239937u,2147483648u}/* 3255 */, /*4564*/{1002438656u,462848u,1006712833u,80347858u,33556656u,67239937u,2147483648u}/* 3256 */, /*4565*/{1002962944u,462848u,1023490561u,80347858u,33556656u,67239937u,2147483648u}/* 3257 */, /*4566*/{1003487232u,462848u,1040268289u,80347858u,33556656u,67239937u,2147483648u}/* 3258 */, /*4567*/{1004011520u,462848u,1057046017u,80347858u,33556656u,67239937u,2147483648u}/* 3259 */, /*4568*/{1004535808u,462848u,1073823745u,80347858u,33556656u,67239937u,2147483648u}/* 325A */, /*4569*/{1005060096u,462848u,1090601473u,80347858u,33556656u,67239937u,2147483648u}/* 325B */, /*4570*/{1005584384u,462848u,1107379201u,80347858u,33556656u,67239937u,2147483648u}/* 325C */, /*4571*/{1006108672u,462848u,1124156929u,80347858u,33556656u,67239937u,2147483648u}/* 325D */, /*4572*/{1006632960u,462848u,1140934657u,80347858u,33556656u,67239937u,2147483648u}/* 325E */, /*4573*/{1007157248u,462848u,1157712385u,80347858u,33556656u,67239937u,2147483648u}/* 325F */, /*4574*/{1007681536u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3260 */, /*4575*/{1008205824u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3261 */, /*4576*/{1008730112u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3262 */, /*4577*/{1009254400u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3263 */, /*4578*/{1009778688u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3264 */, /*4579*/{1010302976u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3265 */, /*4580*/{1010827264u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3266 */, /*4581*/{1011351552u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3267 */, /*4582*/{1011875840u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3268 */, /*4583*/{1012400128u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3269 */, /*4584*/{1012924416u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326A */, /*4585*/{1013448704u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326B */, /*4586*/{1013972992u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326C */, /*4587*/{1014497280u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326D */, /*4588*/{1015021568u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326E */, /*4589*/{1015545856u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 326F */, /*4590*/{1016070144u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3270 */, /*4591*/{1016594432u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3271 */, /*4592*/{1017118720u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3272 */, /*4593*/{1017643008u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3273 */, /*4594*/{1018167296u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3274 */, /*4595*/{1018691584u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3275 */, /*4596*/{1019215872u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3276 */, /*4597*/{1019740160u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3277 */, /*4598*/{1020264448u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3278 */, /*4599*/{1020788736u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 3279 */, /*4600*/{1021313024u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 327A */, /*4601*/{1021837312u,462848u,1638401u,69207762u,176u,67239936u,2147516416u}/* 327B */, /*4602*/{1022361600u,462848u,1638401u,82446034u,176u,67239936u,2147516416u}/* 327C */, /*4603*/{1022885888u,462848u,1638401u,82446034u,176u,67239936u,2147516416u}/* 327D */, /*4604*/{1023410176u,462848u,1638401u,84543186u,176u,67239936u,2147516416u}/* 327E */, /*4605*/{0,462848u,65537u,69207744u,688u,131072u,3221258240u}/* 327F */, /*4606*/{1023934464u,462848u,453051905u,69206738u,33556656u,67239937u,2147483648u}/* 3280 */, /*4607*/{1024458752u,462848u,486607361u,69206738u,33556656u,67239937u,2147483648u}/* 3281 */, /*4608*/{1024983040u,462848u,520161281u,69206738u,33556656u,67239937u,2147483648u}/* 3282 */, /*4609*/{1025507328u,462848u,553717761u,69206738u,33556656u,67239937u,2147483648u}/* 3283 */, /*4610*/{1026031616u,462848u,587271169u,69206738u,33556656u,67239937u,2147483648u}/* 3284 */, /*4611*/{1026555904u,462848u,620828161u,69206738u,33556656u,67239937u,2147483648u}/* 3285 */, /*4612*/{1027080192u,462848u,654380545u,69206738u,33556656u,67239937u,2147483648u}/* 3286 */, /*4613*/{1027604480u,462848u,687938561u,69206738u,33556656u,67239937u,2147483648u}/* 3287 */, /*4614*/{1028128768u,462848u,721490945u,69206738u,33556656u,67239937u,2147483648u}/* 3288 */, /*4615*/{1028653056u,462848u,738271233u,69206738u,33556656u,67239937u,2147483648u}/* 3289 */, /*4616*/{1029177344u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328A */, /*4617*/{1029701632u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328B */, /*4618*/{1030225920u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328C */, /*4619*/{1030750208u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328D */, /*4620*/{1031274496u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328E */, /*4621*/{1031798784u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 328F */, /*4622*/{1032323072u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3290 */, /*4623*/{1032847360u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3291 */, /*4624*/{1033371648u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3292 */, /*4625*/{1033895936u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3293 */, /*4626*/{1034420224u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3294 */, /*4627*/{1034944512u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3295 */, /*4628*/{1035468800u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3296 */, /*4629*/{1035993088u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3297 */, /*4630*/{1036517376u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3298 */, /*4631*/{1037041664u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 3299 */, /*4632*/{1037565952u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329A */, /*4633*/{1038090240u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329B */, /*4634*/{1038614528u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329C */, /*4635*/{1039138816u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329D */, /*4636*/{1039663104u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329E */, /*4637*/{1040187392u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 329F */, /*4638*/{1040711680u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A0 */, /*4639*/{1041235968u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A1 */, /*4640*/{1041760256u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A2 */, /*4641*/{1042284544u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A3 */, /*4642*/{1042808832u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A4 */, /*4643*/{1043333120u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A5 */, /*4644*/{1043857408u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A6 */, /*4645*/{1044381696u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A7 */, /*4646*/{1044905984u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A8 */, /*4647*/{1045430272u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32A9 */, /*4648*/{1045954560u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AA */, /*4649*/{1046478848u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AB */, /*4650*/{1047003136u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AC */, /*4651*/{1047527424u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AD */, /*4652*/{1048051712u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AE */, /*4653*/{1048576000u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32AF */, /*4654*/{1049100288u,462848u,65537u,69207762u,176u,67239936u,2147516416u}/* 32B0 */, /*4655*/{1049624576u,462848u,1174490113u,80347858u,33556656u,67239937u,2147483648u}/* 32B1 */, /*4656*/{1050148864u,462848u,1191267841u,80347858u,33556656u,67239937u,2147483648u}/* 32B2 */, /*4657*/{1050673152u,462848u,1208045569u,80347858u,33556656u,67239937u,2147483648u}/* 32B3 */, /*4658*/{1051197440u,462848u,1224823297u,80347858u,33556656u,67239937u,2147483648u}/* 32B4 */, /*4659*/{1051721728u,462848u,1241601025u,80347858u,33556656u,67239937u,2147483648u}/* 32B5 */, /*4660*/{1052246016u,462848u,1258378753u,80347858u,33556656u,67239937u,2147483648u}/* 32B6 */, /*4661*/{1052770304u,462848u,1275156481u,80347858u,33556656u,67239937u,2147483648u}/* 32B7 */, /*4662*/{1053294592u,462848u,1291934209u,80347858u,33556656u,67239937u,2147483648u}/* 32B8 */, /*4663*/{1053818880u,462848u,1308711937u,80347858u,33556656u,67239937u,2147483648u}/* 32B9 */, /*4664*/{1054343168u,462848u,1325489665u,80347858u,33556656u,67239937u,2147483648u}/* 32BA */, /*4665*/{1054867456u,462848u,1342267393u,80347858u,33556656u,67239937u,2147483648u}/* 32BB */, /*4666*/{1055391744u,462848u,1359045121u,80347858u,33556656u,67239937u,2147483648u}/* 32BC */, /*4667*/{1055916032u,462848u,1375822849u,80347858u,33556656u,67239937u,2147483648u}/* 32BD */, /*4668*/{1056440320u,462848u,1392600577u,80347858u,33556656u,67239937u,2147483648u}/* 32BE */, /*4669*/{1056964608u,462848u,1409378305u,80347858u,33556656u,67239937u,2147483648u}/* 32BF */, /*4670*/{1057488896u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C0 */, /*4671*/{1058013184u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C1 */, /*4672*/{1058537472u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C2 */, /*4673*/{1059061760u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C3 */, /*4674*/{1059586048u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C4 */, /*4675*/{1060110336u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C5 */, /*4676*/{1060634624u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C6 */, /*4677*/{1061158912u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C7 */, /*4678*/{1061683200u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C8 */, /*4679*/{1062207488u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32C9 */, /*4680*/{1062731776u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32CA */, /*4681*/{1063256064u,462848u,65537u,69207748u,176u,67239936u,2147516416u}/* 32CB */, /*4682*/{1063780352u,462848u,65537u,82446048u,176u,67239936u,2147516416u}/* 32CC */, /*4683*/{1064304640u,462848u,65537u,82446048u,176u,67239936u,2147516416u}/* 32CD */, /*4684*/{1064828928u,462848u,65537u,82446048u,176u,67239936u,2147516416u}/* 32CE */, /*4685*/{1065353216u,462848u,65537u,82446048u,176u,67239936u,2147516416u}/* 32CF */, /*4686*/{1065877504u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D0 */, /*4687*/{1066401792u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D1 */, /*4688*/{1066926080u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D2 */, /*4689*/{1067450368u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D3 */, /*4690*/{1067974656u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D4 */, /*4691*/{1068498944u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D5 */, /*4692*/{1069023232u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D6 */, /*4693*/{1069547520u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D7 */, /*4694*/{1070071808u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D8 */, /*4695*/{1070596096u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32D9 */, /*4696*/{1071120384u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DA */, /*4697*/{1071644672u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DB */, /*4698*/{1072168960u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DC */, /*4699*/{1072693248u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DD */, /*4700*/{1073217536u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DE */, /*4701*/{1073741824u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32DF */, /*4702*/{1074266112u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E0 */, /*4703*/{1074790400u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E1 */, /*4704*/{1075314688u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E2 */, /*4705*/{1075838976u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E3 */, /*4706*/{1076363264u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E4 */, /*4707*/{1076887552u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E5 */, /*4708*/{1077411840u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E6 */, /*4709*/{1077936128u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E7 */, /*4710*/{1078460416u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E8 */, /*4711*/{1078984704u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32E9 */, /*4712*/{1079508992u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32EA */, /*4713*/{1080033280u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32EB */, /*4714*/{1080557568u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32EC */, /*4715*/{1081081856u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32ED */, /*4716*/{1081606144u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32EE */, /*4717*/{1082130432u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32EF */, /*4718*/{1082654720u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F0 */, /*4719*/{1083179008u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F1 */, /*4720*/{1083703296u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F2 */, /*4721*/{1084227584u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F3 */, /*4722*/{1084751872u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F4 */, /*4723*/{1085276160u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F5 */, /*4724*/{1085800448u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F6 */, /*4725*/{1086324736u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F7 */, /*4726*/{1086849024u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F8 */, /*4727*/{1087373312u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32F9 */, /*4728*/{1087897600u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32FA */, /*4729*/{1088421888u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32FB */, /*4730*/{1088946176u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32FC */, /*4731*/{1089470464u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32FD */, /*4732*/{1089994752u,462848u,2228225u,69228242u,176u,67239936u,2147516416u}/* 32FE */, /*4733*/{1090519040u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3300 */, /*4734*/{1091043328u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3301 */, /*4735*/{1091567616u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3302 */, /*4736*/{1092091904u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3303 */, /*4737*/{1092616192u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3304 */, /*4738*/{1093140480u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3305 */, /*4739*/{1093664768u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3306 */, /*4740*/{1094189056u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3307 */, /*4741*/{1094713344u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3308 */, /*4742*/{1095237632u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3309 */, /*4743*/{1095761920u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330A */, /*4744*/{1096286208u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330B */, /*4745*/{1096810496u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330C */, /*4746*/{1097334784u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330D */, /*4747*/{1097859072u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330E */, /*4748*/{1098383360u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 330F */, /*4749*/{1098907648u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3310 */, /*4750*/{1099431936u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3311 */, /*4751*/{1099956224u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3312 */, /*4752*/{1100480512u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3313 */, /*4753*/{1101004800u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3314 */, /*4754*/{1101529088u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3315 */, /*4755*/{1102053376u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3316 */, /*4756*/{1102577664u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3317 */, /*4757*/{1103101952u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3318 */, /*4758*/{1103626240u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3319 */, /*4759*/{1104150528u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331A */, /*4760*/{1104674816u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331B */, /*4761*/{1105199104u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331C */, /*4762*/{1105723392u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331D */, /*4763*/{1106247680u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331E */, /*4764*/{1106771968u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 331F */, /*4765*/{1107296256u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3320 */, /*4766*/{1107820544u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3321 */, /*4767*/{1108344832u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3322 */, /*4768*/{1108869120u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3323 */, /*4769*/{1109393408u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3324 */, /*4770*/{1109917696u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3325 */, /*4771*/{1110441984u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3326 */, /*4772*/{1110966272u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3327 */, /*4773*/{1111490560u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3328 */, /*4774*/{1112014848u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3329 */, /*4775*/{1112539136u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332A */, /*4776*/{1113063424u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332B */, /*4777*/{1113587712u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332C */, /*4778*/{1114112000u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332D */, /*4779*/{1114636288u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332E */, /*4780*/{1115160576u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 332F */, /*4781*/{1115684864u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3330 */, /*4782*/{1116209152u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3331 */, /*4783*/{1116733440u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3332 */, /*4784*/{1117257728u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3333 */, /*4785*/{1117782016u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3334 */, /*4786*/{1118306304u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3335 */, /*4787*/{1118830592u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3336 */, /*4788*/{1119354880u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3337 */, /*4789*/{1119879168u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3338 */, /*4790*/{1120403456u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3339 */, /*4791*/{1120927744u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333A */, /*4792*/{1121452032u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333B */, /*4793*/{1121976320u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333C */, /*4794*/{1122500608u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333D */, /*4795*/{1123024896u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333E */, /*4796*/{1123549184u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 333F */, /*4797*/{1124073472u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3340 */, /*4798*/{1124597760u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3341 */, /*4799*/{1125122048u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3342 */, /*4800*/{1125646336u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3343 */, /*4801*/{1126170624u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3344 */, /*4802*/{1126694912u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3345 */, /*4803*/{1127219200u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3346 */, /*4804*/{1127743488u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3347 */, /*4805*/{1128267776u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3348 */, /*4806*/{1128792064u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3349 */, /*4807*/{1129316352u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334A */, /*4808*/{1129840640u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334B */, /*4809*/{1130364928u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334C */, /*4810*/{1130889216u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334D */, /*4811*/{1131413504u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334E */, /*4812*/{1131937792u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 334F */, /*4813*/{1132462080u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3350 */, /*4814*/{1132986368u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3351 */, /*4815*/{1133510656u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3352 */, /*4816*/{1134034944u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3353 */, /*4817*/{1134559232u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3354 */, /*4818*/{1135083520u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3355 */, /*4819*/{1135607808u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3356 */, /*4820*/{1136132096u,466944u,2228225u,69228256u,176u,67239936u,2147516416u}/* 3357 */, /*4821*/{1136656384u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3358 */, /*4822*/{1137180672u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3359 */, /*4823*/{1137704960u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335A */, /*4824*/{1138229248u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335B */, /*4825*/{1138753536u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335C */, /*4826*/{1139277824u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335D */, /*4827*/{1139802112u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335E */, /*4828*/{1140326400u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 335F */, /*4829*/{1140850688u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3360 */, /*4830*/{1141374976u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3361 */, /*4831*/{1141899264u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3362 */, /*4832*/{1142423552u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3363 */, /*4833*/{1142947840u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3364 */, /*4834*/{1143472128u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3365 */, /*4835*/{1143996416u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3366 */, /*4836*/{1144520704u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3367 */, /*4837*/{1145044992u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3368 */, /*4838*/{1145569280u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3369 */, /*4839*/{1146093568u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336A */, /*4840*/{1146617856u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336B */, /*4841*/{1147142144u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336C */, /*4842*/{1147666432u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336D */, /*4843*/{1148190720u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336E */, /*4844*/{1148715008u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 336F */, /*4845*/{1149239296u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 3370 */, /*4846*/{1149763584u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3371 */, /*4847*/{1150287872u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3372 */, /*4848*/{1150812160u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3373 */, /*4849*/{1151336448u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3374 */, /*4850*/{1151860736u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3375 */, /*4851*/{1152385024u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3376 */, /*4852*/{1152909312u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 3377 */, /*4853*/{1153433600u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 3378 */, /*4854*/{1153957888u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 3379 */, /*4855*/{1154482176u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 337A */, /*4856*/{1155006464u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 337B */, /*4857*/{1155530752u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 337C */, /*4858*/{1156055040u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 337D */, /*4859*/{1156579328u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 337E */, /*4860*/{1157103616u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 337F */, /*4861*/{1157627904u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3380 */, /*4862*/{1158152192u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3381 */, /*4863*/{1158676480u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3382 */, /*4864*/{1159200768u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3383 */, /*4865*/{1159725056u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3384 */, /*4866*/{1160249344u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3385 */, /*4867*/{1160773632u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3386 */, /*4868*/{1161297920u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3387 */, /*4869*/{1161822208u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3388 */, /*4870*/{1162346496u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3389 */, /*4871*/{1162870784u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338A */, /*4872*/{1163395072u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338B */, /*4873*/{1163919360u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338C */, /*4874*/{1164443648u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338D */, /*4875*/{1164967936u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338E */, /*4876*/{1165492224u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 338F */, /*4877*/{1166016512u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3390 */, /*4878*/{1166540800u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3391 */, /*4879*/{1167065088u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3392 */, /*4880*/{1167589376u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3393 */, /*4881*/{1168113664u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3394 */, /*4882*/{1168637952u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3395 */, /*4883*/{1169162240u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3396 */, /*4884*/{1169686528u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3397 */, /*4885*/{1170210816u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3398 */, /*4886*/{1170735104u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 3399 */, /*4887*/{1171259392u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339A */, /*4888*/{1171783680u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339B */, /*4889*/{1172307968u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339C */, /*4890*/{1172832256u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339D */, /*4891*/{1173356544u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339E */, /*4892*/{1173880832u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 339F */, /*4893*/{1174405120u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A0 */, /*4894*/{1174929408u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A1 */, /*4895*/{1175453696u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A2 */, /*4896*/{1175977984u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A3 */, /*4897*/{1176502272u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A4 */, /*4898*/{1177026560u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A5 */, /*4899*/{1177550848u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A6 */, /*4900*/{1178075136u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A7 */, /*4901*/{1178599424u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A8 */, /*4902*/{1179123712u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33A9 */, /*4903*/{1179648000u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AA */, /*4904*/{1180172288u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AB */, /*4905*/{1180696576u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AC */, /*4906*/{1181220864u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AD */, /*4907*/{1181745152u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AE */, /*4908*/{1182269440u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33AF */, /*4909*/{1182793728u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B0 */, /*4910*/{1183318016u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B1 */, /*4911*/{1183842304u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B2 */, /*4912*/{1184366592u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B3 */, /*4913*/{1184890880u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B4 */, /*4914*/{1185415168u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B5 */, /*4915*/{1185939456u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B6 */, /*4916*/{1186463744u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B7 */, /*4917*/{1186988032u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B8 */, /*4918*/{1187512320u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33B9 */, /*4919*/{1188036608u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BA */, /*4920*/{1188560896u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BB */, /*4921*/{1189085184u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BC */, /*4922*/{1189609472u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BD */, /*4923*/{1190133760u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BE */, /*4924*/{1190658048u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33BF */, /*4925*/{1191182336u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C0 */, /*4926*/{1191706624u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C1 */, /*4927*/{1192230912u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C2 */, /*4928*/{1192755200u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C3 */, /*4929*/{1193279488u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C4 */, /*4930*/{1193803776u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C5 */, /*4931*/{1194328064u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C6 */, /*4932*/{1194852352u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C7 */, /*4933*/{1195376640u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C8 */, /*4934*/{1195900928u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33C9 */, /*4935*/{1196425216u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CA */, /*4936*/{1196949504u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CB */, /*4937*/{1197473792u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CC */, /*4938*/{1197998080u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CD */, /*4939*/{1198522368u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CE */, /*4940*/{1199046656u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33CF */, /*4941*/{1199570944u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D0 */, /*4942*/{1200095232u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D1 */, /*4943*/{1200619520u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D2 */, /*4944*/{1201143808u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D3 */, /*4945*/{1201668096u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D4 */, /*4946*/{1202192384u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D5 */, /*4947*/{1202716672u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D6 */, /*4948*/{1203240960u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D7 */, /*4949*/{1203765248u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D8 */, /*4950*/{1204289536u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33D9 */, /*4951*/{1204813824u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33DA */, /*4952*/{1205338112u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33DB */, /*4953*/{1205862400u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33DC */, /*4954*/{1206386688u,466944u,65537u,69207776u,176u,67239936u,2147516416u}/* 33DD */, /*4955*/{1206910976u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 33DE */, /*4956*/{1207435264u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 33DF */, /*4957*/{1207959552u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E0 */, /*4958*/{1208483840u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E1 */, /*4959*/{1209008128u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E2 */, /*4960*/{1209532416u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E3 */, /*4961*/{1210056704u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E4 */, /*4962*/{1210580992u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E5 */, /*4963*/{1211105280u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E6 */, /*4964*/{1211629568u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E7 */, /*4965*/{1212153856u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E8 */, /*4966*/{1212678144u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33E9 */, /*4967*/{1213202432u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33EA */, /*4968*/{1213726720u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33EB */, /*4969*/{1214251008u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33EC */, /*4970*/{1214775296u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33ED */, /*4971*/{1215299584u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33EE */, /*4972*/{1215823872u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33EF */, /*4973*/{1216348160u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F0 */, /*4974*/{1216872448u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F1 */, /*4975*/{1217396736u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F2 */, /*4976*/{1217921024u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F3 */, /*4977*/{1218445312u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F4 */, /*4978*/{1218969600u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F5 */, /*4979*/{1219493888u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F6 */, /*4980*/{1220018176u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F7 */, /*4981*/{1220542464u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F8 */, /*4982*/{1221066752u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33F9 */, /*4983*/{1221591040u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33FA */, /*4984*/{1222115328u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33FB */, /*4985*/{1222639616u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33FC */, /*4986*/{1223163904u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33FD */, /*4987*/{1223688192u,466944u,65537u,69207748u,176u,67239936u,2147516416u}/* 33FE */, /*4988*/{1224212480u,466944u,65537u,82446048u,176u,67239936u,2147516416u}/* 33FF */, /*4989*/{0,471040u,2359297u,75497792u,9437936u,132928u,3221227712u}/* 3400 */, /*4990*/{0,471040u,589564929u,75497792u,42994416u,132928u,3221227712u}/* 3405 */, /*4991*/{0,471040u,488901121u,75497792u,42994416u,132928u,3221227712u}/* 3483 */, /*4992*/{0,471040u,656674305u,75497792u,42994416u,132928u,3221227712u}/* 3B4D */, /*4993*/{0,475136u,65537u,82446016u,688u,131072u,3221258240u}/* 4DC0 */, /*4994*/{0,479232u,455345665u,69206336u,42994416u,132928u,3221227712u}/* 4E00 */, /*4995*/{0,479232u,2359297u,69206336u,9437936u,132928u,3221227712u}/* 4E01 */, /*4996*/{0,479232u,656674305u,69206336u,42994416u,132928u,3221227712u}/* 4E03 */, /*4997*/{0,479232u,1797559809u,69206336u,42994416u,132928u,3221227712u}/* 4E07 */, /*4998*/{0,479232u,522455041u,69206336u,42994416u,132928u,3221227712u}/* 4E09 */, /*4999*/{0,479232u,723784705u,69206336u,42994416u,132928u,3221227712u}/* 4E5D */, /*5000*/{0,479232u,488901121u,69206336u,42994416u,132928u,3221227712u}/* 4E8C */, /*5001*/{0,479232u,589564929u,69206336u,42994416u,132928u,3221227712u}/* 4E94 */, /*5002*/{0,479232u,556011521u,69206336u,42994416u,132928u,3221227712u}/* 4E96 */, /*5003*/{0,479232u,2149892097u,69206336u,42994416u,132928u,3221227712u}/* 4EBF */, /*5004*/{0,479232u,740564993u,69206336u,42994416u,132928u,3221227712u}/* 4EC0 */, /*5005*/{0,479232u,1646560257u,69206336u,42994416u,132928u,3221227712u}/* 4EDF */, /*5006*/{0,479232u,1495560705u,69206336u,42994416u,132928u,3221227712u}/* 4F70 */, /*5007*/{0,479232u,2183447553u,69206336u,42994416u,132928u,3221227712u}/* 5146 */, /*5008*/{0,479232u,690232321u,69206336u,42994416u,132928u,3221227712u}/* 516B */, /*5009*/{0,479232u,623121921u,69206336u,42994416u,132928u,3221227712u}/* 516D */, /*5010*/{0,479232u,908340225u,69206336u,42994416u,132928u,3221227712u}/* 5344 */, /*5011*/{0,479232u,1076117505u,69206336u,42994416u,132928u,3221227712u}/* 5345 */, /*5012*/{0,479232u,1243894785u,69206336u,42994416u,132928u,3221227712u}/* 534C */, /*5013*/{0,479232u,35914753u,69206336u,42994416u,132928u,3221227712u}/* 96F6 */, /*5014*/{0,479232u,2359297u,83886400u,9437936u,132928u,3221227712u}/* 9FA6 */, /*5015*/{0,479232u,2359297u,88080704u,9437936u,132928u,3221227712u}/* 9FBC */, /*5016*/{0,479232u,2359297u,90177856u,9437936u,132928u,3221227712u}/* 9FC4 */, /*5017*/{0,479232u,2359297u,94372160u,9437936u,132928u,3221227712u}/* 9FCC */, /*5018*/{0,479232u,2359297u,102760768u,9437936u,132928u,3221227712u}/* 9FCD */, /*5019*/{0,483328u,2424833u,75520320u,9437936u,132672u,3221225664u}/* A000 */, /*5020*/{0,483328u,2424833u,75520256u,9437936u,2148140608u,3221225664u}/* A015 */, /*5021*/{0,487424u,2424833u,76154560u,688u,131072u,3221258240u}/* A490 */, /*5022*/{0,487424u,2424833u,80348864u,688u,131072u,3221258240u}/* A4A2 */, /*5023*/{0,491520u,5439489u,90200384u,9437936u,132672u,3221225664u}/* A4D0 */, /*5024*/{0,491520u,5439489u,90200320u,9437936u,2147616320u,3221225664u}/* A4F8 */, /*5025*/{0,491520u,5439489u,90179008u,688u,131072u,3222278144u}/* A4FE */, /*5026*/{0,491520u,5439489u,90179008u,12583600u,131072u,3222294528u}/* A4FF */, /*5027*/{0,495616u,4587521u,88103232u,9437936u,132672u,3221225664u}/* A500 */, /*5028*/{0,495616u,4587521u,88103168u,9437936u,2148140608u,3221225664u}/* A60C */, /*5029*/{0,495616u,4587521u,88737216u,688u,131072u,3222278144u}/* A60D */, /*5030*/{0,495616u,4587521u,88737216u,12583600u,131072u,3222294528u}/* A60E */, /*5031*/{0,495616u,38142977u,88111680u,44047024u,132097u,3221225600u}/* A620 */, /*5032*/{0,495616u,457573889u,88111680u,44047024u,132097u,3221225600u}/* A621 */, /*5033*/{0,495616u,491129345u,88111680u,44047024u,132097u,3221225600u}/* A622 */, /*5034*/{0,495616u,524683265u,88111680u,44047024u,132097u,3221225600u}/* A623 */, /*5035*/{0,495616u,558239745u,88111680u,44047024u,132097u,3221225600u}/* A624 */, /*5036*/{0,495616u,591793153u,88111680u,44047024u,132097u,3221225600u}/* A625 */, /*5037*/{0,495616u,625350145u,88111680u,44047024u,132097u,3221225600u}/* A626 */, /*5038*/{0,495616u,658902529u,88111680u,44047024u,132097u,3221225600u}/* A627 */, /*5039*/{0,495616u,692460545u,88111680u,44047024u,132097u,3221225600u}/* A628 */, /*5040*/{0,495616u,726012929u,88111680u,44047024u,132097u,3221225600u}/* A629 */, /*5041*/{241664u,1850187776u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A640 */, /*5042*/{241792u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A641 */, /*5043*/{241920u,1852284928u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A642 */, /*5044*/{242048u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A643 */, /*5045*/{242176u,1854382080u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A644 */, /*5046*/{242304u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A645 */, /*5047*/{242432u,1856479232u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A646 */, /*5048*/{242560u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A647 */, /*5049*/{242688u,1858576384u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A648 */, /*5050*/{242816u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A649 */, /*5051*/{242944u,1860673536u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A64A */, /*5052*/{243072u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A64B */, /*5053*/{243200u,1862770688u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A64C */, /*5054*/{243328u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A64D */, /*5055*/{243456u,1864867840u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A64E */, /*5056*/{243584u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A64F */, /*5057*/{243712u,1866964992u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A650 */, /*5058*/{243840u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A651 */, /*5059*/{243968u,1869062144u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A652 */, /*5060*/{244096u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A653 */, /*5061*/{244224u,1871159296u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A654 */, /*5062*/{244352u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A655 */, /*5063*/{244480u,1873256448u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A656 */, /*5064*/{244608u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A657 */, /*5065*/{244736u,1875353600u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A658 */, /*5066*/{244864u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A659 */, /*5067*/{244992u,1877450752u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A65A */, /*5068*/{245120u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A65B */, /*5069*/{245248u,1879547904u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A65C */, /*5070*/{245376u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A65D */, /*5071*/{245504u,1881645056u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A65E */, /*5072*/{245632u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A65F */, /*5073*/{245760u,1883742208u,262145u,92297280u,8389361u,2080507488u,3221226688u}/* A660 */, /*5074*/{245888u,499712u,262145u,92297344u,7340784u,1392641640u,3221225664u}/* A661 */, /*5075*/{246016u,1885839360u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A662 */, /*5076*/{246144u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A663 */, /*5077*/{246272u,1887936512u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A664 */, /*5078*/{246400u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A665 */, /*5079*/{246528u,1890033664u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A666 */, /*5080*/{246656u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A667 */, /*5081*/{246784u,1892130816u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A668 */, /*5082*/{246912u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A669 */, /*5083*/{247040u,1894227968u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A66A */, /*5084*/{247168u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A66B */, /*5085*/{247296u,1896325120u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A66C */, /*5086*/{247424u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A66D */, /*5087*/{0,499712u,262145u,88103232u,9437936u,132672u,3221225664u}/* A66E */, /*5088*/{0,499712u,262144u,3444324736u,808714928u,2148598788u,3221225600u}/* A66F */, /*5089*/{0,499712u,262144u,88881600u,808714928u,2147549188u,3221225472u}/* A670 */, /*5090*/{0,499712u,262145u,88737216u,688u,131072u,3222274048u}/* A673 */, /*5091*/{0,499712u,262144u,3450616192u,808714992u,2147550212u,3489661056u}/* A674 */, /*5092*/{0,499712u,262145u,88758528u,9437936u,2148664896u,3221225664u}/* A67F */, /*5093*/{247552u,1898422272u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A680 */, /*5094*/{247680u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A681 */, /*5095*/{247808u,1900519424u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A682 */, /*5096*/{247936u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A683 */, /*5097*/{248064u,1902616576u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A684 */, /*5098*/{248192u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A685 */, /*5099*/{248320u,1904713728u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A686 */, /*5100*/{248448u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A687 */, /*5101*/{248576u,1906810880u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A688 */, /*5102*/{248704u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A689 */, /*5103*/{248832u,1908908032u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A68A */, /*5104*/{248960u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A68B */, /*5105*/{249088u,1911005184u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A68C */, /*5106*/{249216u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A68D */, /*5107*/{249344u,1913102336u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A68E */, /*5108*/{249472u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A68F */, /*5109*/{249600u,1915199488u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A690 */, /*5110*/{249728u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A691 */, /*5111*/{249856u,1917296640u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A692 */, /*5112*/{249984u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A693 */, /*5113*/{250112u,1919393792u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A694 */, /*5114*/{250240u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A695 */, /*5115*/{250368u,1921490944u,262145u,88102976u,8389361u,2080507488u,3221226688u}/* A696 */, /*5116*/{250496u,499712u,262145u,88103040u,7340784u,1392641640u,3221225664u}/* A697 */, /*5117*/{250624u,1923588096u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* A698 */, /*5118*/{250752u,499712u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* A699 */, /*5119*/{250880u,1925685248u,262145u,100685888u,8389361u,2080507488u,3221226688u}/* A69A */, /*5120*/{251008u,499712u,262145u,100685952u,7340784u,1392641640u,3221225664u}/* A69B */, /*5121*/{1224736768u,499712u,262145u,100686100u,7340272u,3289515592u,2155872448u}/* A69C */, /*5122*/{1225261056u,499712u,262145u,100686100u,7340272u,3289515592u,2155872448u}/* A69D */, /*5123*/{0,499712u,262144u,3459004800u,808714992u,2147550212u,3489661056u}/* A69E */, /*5124*/{0,503808u,5505025u,90200384u,9437936u,132672u,3221225664u}/* A6A0 */, /*5125*/{0,503808u,458491393u,90200704u,42994416u,132609u,3221225664u}/* A6E6 */, /*5126*/{0,503808u,492046849u,90200704u,42994416u,132609u,3221225664u}/* A6E7 */, /*5127*/{0,503808u,525600769u,90200704u,42994416u,132609u,3221225664u}/* A6E8 */, /*5128*/{0,503808u,559157249u,90200704u,42994416u,132609u,3221225664u}/* A6E9 */, /*5129*/{0,503808u,592710657u,90200704u,42994416u,132609u,3221225664u}/* A6EA */, /*5130*/{0,503808u,626267649u,90200704u,42994416u,132609u,3221225664u}/* A6EB */, /*5131*/{0,503808u,659820033u,90200704u,42994416u,132609u,3221225664u}/* A6EC */, /*5132*/{0,503808u,693378049u,90200704u,42994416u,132609u,3221225664u}/* A6ED */, /*5133*/{0,503808u,726930433u,90200704u,42994416u,132609u,3221225664u}/* A6EE */, /*5134*/{0,503808u,39060481u,90200704u,42994416u,132609u,3221225664u}/* A6EF */, /*5135*/{0,503808u,5505024u,3446421888u,808714928u,2148598788u,3221225600u}/* A6F0 */, /*5136*/{0,503808u,5505025u,90179008u,688u,131072u,3222274048u}/* A6F2 */, /*5137*/{0,503808u,5505025u,90179008u,12583600u,131072u,3222294528u}/* A6F3 */, /*5138*/{0,503808u,5505025u,90179008u,688u,131072u,3222278144u}/* A6F4 */, /*5139*/{0,507904u,65537u,84543104u,688u,2147614720u,3221258240u}/* A700 */, /*5140*/{0,507904u,65537u,86661376u,9437936u,2148664896u,3221225664u}/* A717 */, /*5141*/{0,507904u,65537u,88758528u,9437936u,2148664896u,3221225664u}/* A71B */, /*5142*/{0,512000u,65537u,86640256u,688u,2148663296u,3221258240u}/* A720 */, /*5143*/{251136u,1927794688u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A722 */, /*5144*/{251264u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A723 */, /*5145*/{251392u,1929891840u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A724 */, /*5146*/{251520u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A725 */, /*5147*/{251648u,1931988992u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A726 */, /*5148*/{251776u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A727 */, /*5149*/{251904u,1934086144u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A728 */, /*5150*/{252032u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A729 */, /*5151*/{252160u,1936183296u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A72A */, /*5152*/{252288u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A72B */, /*5153*/{252416u,1938280448u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A72C */, /*5154*/{252544u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A72D */, /*5155*/{252672u,1940377600u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A72E */, /*5156*/{252800u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A72F */, /*5157*/{0,512000u,131073u,88103040u,7340784u,1073874536u,3221225664u}/* A730 */, /*5158*/{252928u,1942474752u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A732 */, /*5159*/{253056u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A733 */, /*5160*/{253184u,1944571904u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A734 */, /*5161*/{253312u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A735 */, /*5162*/{253440u,1946669056u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A736 */, /*5163*/{253568u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A737 */, /*5164*/{253696u,1948766208u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A738 */, /*5165*/{253824u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A739 */, /*5166*/{253952u,1950863360u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A73A */, /*5167*/{254080u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A73B */, /*5168*/{254208u,1952960512u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A73C */, /*5169*/{254336u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A73D */, /*5170*/{254464u,1955057664u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A73E */, /*5171*/{254592u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A73F */, /*5172*/{254720u,1957154816u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A740 */, /*5173*/{254848u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A741 */, /*5174*/{254976u,1959251968u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A742 */, /*5175*/{255104u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A743 */, /*5176*/{255232u,1961349120u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A744 */, /*5177*/{255360u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A745 */, /*5178*/{255488u,1963446272u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A746 */, /*5179*/{255616u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A747 */, /*5180*/{255744u,1965543424u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A748 */, /*5181*/{255872u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A749 */, /*5182*/{256000u,1967640576u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A74A */, /*5183*/{256128u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A74B */, /*5184*/{256256u,1969737728u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A74C */, /*5185*/{256384u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A74D */, /*5186*/{256512u,1971834880u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A74E */, /*5187*/{256640u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A74F */, /*5188*/{256768u,1973932032u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A750 */, /*5189*/{256896u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A751 */, /*5190*/{257024u,1976029184u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A752 */, /*5191*/{257152u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A753 */, /*5192*/{257280u,1978126336u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A754 */, /*5193*/{257408u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A755 */, /*5194*/{257536u,1980223488u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A756 */, /*5195*/{257664u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A757 */, /*5196*/{257792u,1982320640u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A758 */, /*5197*/{257920u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A759 */, /*5198*/{258048u,1984417792u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A75A */, /*5199*/{258176u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A75B */, /*5200*/{258304u,1986514944u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A75C */, /*5201*/{258432u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A75D */, /*5202*/{258560u,1988612096u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A75E */, /*5203*/{258688u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A75F */, /*5204*/{258816u,1990709248u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A760 */, /*5205*/{258944u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A761 */, /*5206*/{259072u,1992806400u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A762 */, /*5207*/{259200u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A763 */, /*5208*/{259328u,1994903552u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A764 */, /*5209*/{259456u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A765 */, /*5210*/{259584u,1997000704u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A766 */, /*5211*/{259712u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A767 */, /*5212*/{259840u,1999097856u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A768 */, /*5213*/{259968u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A769 */, /*5214*/{260096u,2001195008u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A76A */, /*5215*/{260224u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A76B */, /*5216*/{260352u,2003292160u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A76C */, /*5217*/{260480u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A76D */, /*5218*/{260608u,2005389312u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A76E */, /*5219*/{260736u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A76F */, /*5220*/{1225785344u,512000u,131073u,88103188u,7340272u,3288467016u,2155872448u}/* A770 */, /*5221*/{260864u,2007486464u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A779 */, /*5222*/{260992u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A77A */, /*5223*/{261120u,2009583616u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A77B */, /*5224*/{261248u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A77C */, /*5225*/{261376u,2011680768u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A77D */, /*5226*/{261504u,2013777920u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A77E */, /*5227*/{261632u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A77F */, /*5228*/{261760u,2015875072u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A780 */, /*5229*/{261888u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A781 */, /*5230*/{262016u,2017972224u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A782 */, /*5231*/{262144u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A783 */, /*5232*/{262272u,2020069376u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A784 */, /*5233*/{262400u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A785 */, /*5234*/{262528u,2022166528u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A786 */, /*5235*/{262656u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A787 */, /*5236*/{0,512000u,65537u,88758528u,9437936u,2148664896u,3221225664u}/* A788 */, /*5237*/{0,512000u,65537u,88082048u,688u,2147614720u,3221258240u}/* A789 */, /*5238*/{262784u,2024263680u,131073u,88102976u,8389361u,2080507488u,3221226688u}/* A78B */, /*5239*/{262912u,512000u,131073u,88103040u,7340784u,1392641640u,3221225664u}/* A78C */, /*5240*/{263040u,2026360832u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A78D */, /*5241*/{0,512000u,131073u,92297344u,7340784u,1073874536u,3221225664u}/* A78E */, /*5242*/{0,512000u,131073u,102783296u,9437936u,132672u,3221225664u}/* A78F */, /*5243*/{263168u,2028457984u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A790 */, /*5244*/{263296u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A791 */, /*5245*/{263424u,2030555136u,131073u,94394432u,8389361u,2080507488u,3221226688u}/* A792 */, /*5246*/{263552u,512000u,131073u,94394496u,7340784u,1392641640u,3221225664u}/* A793 */, /*5247*/{0,512000u,131073u,100685952u,7340784u,1073874536u,3221225664u}/* A794 */, /*5248*/{263680u,2032652288u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A796 */, /*5249*/{263808u,512000u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* A797 */, /*5250*/{263936u,2034749440u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A798 */, /*5251*/{264064u,512000u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* A799 */, /*5252*/{264192u,2036846592u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A79A */, /*5253*/{264320u,512000u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* A79B */, /*5254*/{264448u,2038943744u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A79C */, /*5255*/{264576u,512000u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* A79D */, /*5256*/{264704u,2041040896u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A79E */, /*5257*/{264832u,512000u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* A79F */, /*5258*/{264960u,2043138048u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A7A0 */, /*5259*/{265088u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A7A1 */, /*5260*/{265216u,2045235200u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A7A2 */, /*5261*/{265344u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A7A3 */, /*5262*/{265472u,2047332352u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A7A4 */, /*5263*/{265600u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A7A5 */, /*5264*/{265728u,2049429504u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A7A6 */, /*5265*/{265856u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A7A7 */, /*5266*/{265984u,2051526656u,131073u,92297280u,8389361u,2080507488u,3221226688u}/* A7A8 */, /*5267*/{266112u,512000u,131073u,92297344u,7340784u,1392641640u,3221225664u}/* A7A9 */, /*5268*/{266240u,2053623808u,131073u,94394432u,8389361u,2080507488u,3221226688u}/* A7AA */, /*5269*/{266368u,2055720960u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A7AB */, /*5270*/{266496u,2057818112u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A7AC */, /*5271*/{266624u,2059915264u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A7AD */, /*5272*/{266752u,2062012416u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A7B0 */, /*5273*/{266880u,2064109568u,131073u,100685888u,8389361u,2080507488u,3221226688u}/* A7B1 */, /*5274*/{267008u,2066206720u,131073u,102783040u,8389361u,2080507488u,3221226688u}/* A7B2 */, /*5275*/{267136u,2068303872u,131073u,102783040u,8389361u,2080507488u,3221226688u}/* A7B3 */, /*5276*/{267264u,2070401024u,131073u,102783040u,8389361u,2080507488u,3221226688u}/* A7B4 */, /*5277*/{267392u,512000u,131073u,102783104u,7340784u,1392641640u,3221225664u}/* A7B5 */, /*5278*/{267520u,2072498176u,131073u,102783040u,8389361u,2080507488u,3221226688u}/* A7B6 */, /*5279*/{267648u,512000u,131073u,102783104u,7340784u,1392641640u,3221225664u}/* A7B7 */, /*5280*/{0,512000u,131073u,100686144u,9437936u,132672u,3221225664u}/* A7F7 */, /*5281*/{1226309632u,512000u,131073u,94394644u,7340272u,3289515592u,2155872448u}/* A7F8 */, /*5282*/{1226833920u,512000u,131073u,94394644u,7340272u,3289515592u,2155872448u}/* A7F9 */, /*5283*/{0,512000u,131073u,88103232u,9437936u,132672u,3221225664u}/* A7FB */, /*5284*/{0,516096u,3866625u,83908928u,9437936u,132672u,3221225664u}/* A800 */, /*5285*/{0,516096u,3866624u,84687232u,808714928u,2147550212u,3221225600u}/* A802 */, /*5286*/{0,516096u,3866624u,353122688u,808714928u,2147582980u,3221225600u}/* A806 */, /*5287*/{0,516096u,3866624u,83900928u,808846064u,132100u,3489661056u}/* A823 */, /*5288*/{0,516096u,3866624u,84687232u,808714992u,2147550212u,3489661056u}/* A825 */, /*5289*/{0,516096u,3866625u,84543168u,688u,131072u,3221258240u}/* A828 */, /*5290*/{0,520192u,201393665u,90178240u,184552112u,131073u,3221225472u}/* A830 */, /*5291*/{0,520192u,285279745u,90178240u,16779952u,131073u,3221225472u}/* A831 */, /*5292*/{0,520192u,369166337u,90178240u,184552112u,131073u,3221225472u}/* A832 */, /*5293*/{0,520192u,50398721u,90178240u,50334384u,131073u,3221225472u}/* A833 */, /*5294*/{0,520192u,117507585u,90178240u,117443248u,131073u,3221225472u}/* A834 */, /*5295*/{0,520192u,167839745u,90178240u,50334384u,131073u,3221225472u}/* A835 */, /*5296*/{0,520192u,65537u,90179264u,688u,131072u,3221258240u}/* A836 */, /*5297*/{0,520192u,65537u,90441280u,688u,131072u,3221258240u}/* A838 */, /*5298*/{0,520192u,65537u,90441408u,688u,131072u,3221258240u}/* A839 */, /*5299*/{0,524289u,4259841u,86006080u,9437936u,132672u,3221225664u}/* A840 */, /*5300*/{0,524292u,4259841u,86006080u,9437936u,132672u,3221225664u}/* A872 */, /*5301*/{0,524288u,4259841u,86006080u,9437936u,132672u,3221225664u}/* A873 */, /*5302*/{0,524288u,4259841u,86640064u,688u,131072u,3222274048u}/* A874 */, /*5303*/{0,524288u,4259841u,86640064u,12583600u,131072u,3222294528u}/* A876 */, /*5304*/{0,528384u,4653056u,88095232u,808846064u,132100u,3489661056u}/* A880 */, /*5305*/{0,528384u,4653057u,88103232u,9437936u,132672u,3221225664u}/* A882 */, /*5306*/{0,528384u,4653056u,357316992u,808714928u,2148631556u,3221225600u}/* A8C4 */, /*5307*/{0,528384u,4653057u,88081856u,12583600u,131072u,3222294528u}/* A8CE */, /*5308*/{0,528384u,38208513u,88111680u,44047024u,132097u,3221225600u}/* A8D0 */, /*5309*/{0,528384u,457639425u,88111680u,44047024u,132097u,3221225600u}/* A8D1 */, /*5310*/{0,528384u,491194881u,88111680u,44047024u,132097u,3221225600u}/* A8D2 */, /*5311*/{0,528384u,524748801u,88111680u,44047024u,132097u,3221225600u}/* A8D3 */, /*5312*/{0,528384u,558305281u,88111680u,44047024u,132097u,3221225600u}/* A8D4 */, /*5313*/{0,528384u,591858689u,88111680u,44047024u,132097u,3221225600u}/* A8D5 */, /*5314*/{0,528384u,625415681u,88111680u,44047024u,132097u,3221225600u}/* A8D6 */, /*5315*/{0,528384u,658968065u,88111680u,44047024u,132097u,3221225600u}/* A8D7 */, /*5316*/{0,528384u,692526081u,88111680u,44047024u,132097u,3221225600u}/* A8D8 */, /*5317*/{0,528384u,726078465u,88111680u,44047024u,132097u,3221225600u}/* A8D9 */, /*5318*/{0,532480u,655360u,3446421888u,808714928u,2148598788u,3221225600u}/* A8E0 */, /*5319*/{0,532480u,655361u,90200384u,9437936u,132672u,3221225664u}/* A8F2 */, /*5320*/{0,532480u,655361u,90179008u,688u,131072u,3222274048u}/* A8F8 */, /*5321*/{0,532480u,655361u,102761920u,688u,131072u,3222274048u}/* A8FC */, /*5322*/{0,532480u,655361u,102783296u,9437936u,132672u,3221225664u}/* A8FD */, /*5323*/{0,536576u,38274049u,88111680u,44047024u,132097u,3221225600u}/* A900 */, /*5324*/{0,536576u,457704961u,88111680u,44047024u,132097u,3221225600u}/* A901 */, /*5325*/{0,536576u,491260417u,88111680u,44047024u,132097u,3221225600u}/* A902 */, /*5326*/{0,536576u,524814337u,88111680u,44047024u,132097u,3221225600u}/* A903 */, /*5327*/{0,536576u,558370817u,88111680u,44047024u,132097u,3221225600u}/* A904 */, /*5328*/{0,536576u,591924225u,88111680u,44047024u,132097u,3221225600u}/* A905 */, /*5329*/{0,536576u,625481217u,88111680u,44047024u,132097u,3221225600u}/* A906 */, /*5330*/{0,536576u,659033601u,88111680u,44047024u,132097u,3221225600u}/* A907 */, /*5331*/{0,536576u,692591617u,88111680u,44047024u,132097u,3221225600u}/* A908 */, /*5332*/{0,536576u,726144001u,88111680u,44047024u,132097u,3221225600u}/* A909 */, /*5333*/{0,536576u,4718593u,88103232u,9437936u,132672u,3221225664u}/* A90A */, /*5334*/{0,536576u,4718592u,88881536u,808714992u,2147550212u,3489661056u}/* A926 */, /*5335*/{0,536576u,4718592u,3108780416u,808714928u,2148598788u,3221225600u}/* A92B */, /*5336*/{0,536576u,65537u,88081856u,688u,1179648u,3222274048u}/* A92E */, /*5337*/{0,536576u,4718593u,88081856u,12583600u,131072u,3222294528u}/* A92F */, /*5338*/{0,540672u,4784129u,88103232u,9437936u,132672u,3221225664u}/* A930 */, /*5339*/{0,540672u,4784128u,88881536u,808714992u,2147550212u,3489661056u}/* A947 */, /*5340*/{0,540672u,4784128u,88095232u,808846064u,132100u,3489661056u}/* A952 */, /*5341*/{0,540672u,4784128u,356530688u,808846000u,1213444u,3221225600u}/* A953 */, /*5342*/{0,540672u,4784129u,88081856u,688u,131072u,3222274048u}/* A95F */, /*5343*/{0,544768u,1638400u,90200384u,2962694896u,132672u,3221225664u}/* A960 */, /*5344*/{0,548864u,5570560u,90978688u,808714992u,2147550212u,3489661056u}/* A980 */, /*5345*/{0,548864u,5570560u,90192384u,808846064u,132100u,3489661056u}/* A983 */, /*5346*/{0,548864u,5570561u,90200384u,9437936u,132672u,3221225664u}/* A984 */, /*5347*/{0,548864u,5570560u,225196416u,808714928u,2148598788u,3221225600u}/* A9B3 */, /*5348*/{0,548864u,5570560u,358627840u,808846000u,1213444u,3221225600u}/* A9C0 */, /*5349*/{0,548864u,5570561u,90179008u,688u,131072u,3222274048u}/* A9C1 */, /*5350*/{0,548864u,5570561u,90179008u,688u,131072u,3222278144u}/* A9C7 */, /*5351*/{0,548864u,5570561u,90179008u,12583600u,131072u,3222294528u}/* A9C8 */, /*5352*/{0,548864u,65537u,90200320u,9437936u,2148140608u,3221225664u}/* A9CF */, /*5353*/{0,548864u,39126017u,90208832u,44047024u,132097u,3221225600u}/* A9D0 */, /*5354*/{0,548864u,458556929u,90208832u,44047024u,132097u,3221225600u}/* A9D1 */, /*5355*/{0,548864u,492112385u,90208832u,44047024u,132097u,3221225600u}/* A9D2 */, /*5356*/{0,548864u,525666305u,90208832u,44047024u,132097u,3221225600u}/* A9D3 */, /*5357*/{0,548864u,559222785u,90208832u,44047024u,132097u,3221225600u}/* A9D4 */, /*5358*/{0,548864u,592776193u,90208832u,44047024u,132097u,3221225600u}/* A9D5 */, /*5359*/{0,548864u,626333185u,90208832u,44047024u,132097u,3221225600u}/* A9D6 */, /*5360*/{0,548864u,659885569u,90208832u,44047024u,132097u,3221225600u}/* A9D7 */, /*5361*/{0,548864u,693443585u,90208832u,44047024u,132097u,3221225600u}/* A9D8 */, /*5362*/{0,548864u,726995969u,90208832u,44047024u,132097u,3221225600u}/* A9D9 */, /*5363*/{0,552960u,1507329u,100663616u,9437936u,132672u,3221225664u}/* A9E0 */, /*5364*/{0,552960u,1507328u,101464448u,3408560u,2148598788u,3221225600u}/* A9E5 */, /*5365*/{0,552960u,1507329u,100663552u,9437936u,2148140608u,3221225664u}/* A9E6 */, /*5366*/{0,552960u,35062785u,100694592u,44047024u,132097u,3221225600u}/* A9F0 */, /*5367*/{0,552960u,454493697u,100694592u,44047024u,132097u,3221225600u}/* A9F1 */, /*5368*/{0,552960u,488049153u,100694592u,44047024u,132097u,3221225600u}/* A9F2 */, /*5369*/{0,552960u,521603073u,100694592u,44047024u,132097u,3221225600u}/* A9F3 */, /*5370*/{0,552960u,555159553u,100694592u,44047024u,132097u,3221225600u}/* A9F4 */, /*5371*/{0,552960u,588712961u,100694592u,44047024u,132097u,3221225600u}/* A9F5 */, /*5372*/{0,552960u,622269953u,100694592u,44047024u,132097u,3221225600u}/* A9F6 */, /*5373*/{0,552960u,655822337u,100694592u,44047024u,132097u,3221225600u}/* A9F7 */, /*5374*/{0,552960u,689380353u,100694592u,44047024u,132097u,3221225600u}/* A9F8 */, /*5375*/{0,552960u,722932737u,100694592u,44047024u,132097u,3221225600u}/* A9F9 */, /*5376*/{0,557056u,5046273u,88103232u,9437936u,132672u,3221225664u}/* AA00 */, /*5377*/{0,557056u,5046272u,88881536u,808714992u,2147550212u,3489661056u}/* AA29 */, /*5378*/{0,557056u,5046272u,88095232u,808846064u,132100u,3489661056u}/* AA2F */, /*5379*/{0,557056u,38601729u,88111680u,44047024u,132097u,3221225600u}/* AA50 */, /*5380*/{0,557056u,458032641u,88111680u,44047024u,132097u,3221225600u}/* AA51 */, /*5381*/{0,557056u,491588097u,88111680u,44047024u,132097u,3221225600u}/* AA52 */, /*5382*/{0,557056u,525142017u,88111680u,44047024u,132097u,3221225600u}/* AA53 */, /*5383*/{0,557056u,558698497u,88111680u,44047024u,132097u,3221225600u}/* AA54 */, /*5384*/{0,557056u,592251905u,88111680u,44047024u,132097u,3221225600u}/* AA55 */, /*5385*/{0,557056u,625808897u,88111680u,44047024u,132097u,3221225600u}/* AA56 */, /*5386*/{0,557056u,659361281u,88111680u,44047024u,132097u,3221225600u}/* AA57 */, /*5387*/{0,557056u,692919297u,88111680u,44047024u,132097u,3221225600u}/* AA58 */, /*5388*/{0,557056u,726471681u,88111680u,44047024u,132097u,3221225600u}/* AA59 */, /*5389*/{0,557056u,5046273u,88081856u,688u,131072u,3222274048u}/* AA5C */, /*5390*/{0,557056u,5046273u,88081856u,12583600u,131072u,3222294528u}/* AA5D */, /*5391*/{0,561152u,1507329u,90177856u,9437936u,132672u,3221225664u}/* AA60 */, /*5392*/{0,561152u,1507329u,90177792u,9437936u,2148140608u,3221225664u}/* AA70 */, /*5393*/{0,561152u,1507329u,90179264u,688u,131072u,3221258240u}/* AA77 */, /*5394*/{0,561152u,1507328u,90192384u,3146416u,1180676u,3221225600u}/* AA7B */, /*5395*/{0,561152u,1507328u,101464448u,3408560u,2148598788u,3221225600u}/* AA7C */, /*5396*/{0,561152u,1507328u,100678144u,3146416u,1180676u,3221225600u}/* AA7D */, /*5397*/{0,561152u,1507329u,100663616u,9437936u,132672u,3221225664u}/* AA7E */, /*5398*/{0,565248u,5177345u,90177856u,9437936u,132672u,3221225664u}/* AA80 */, /*5399*/{0,565248u,5177344u,3446421888u,3408624u,2147550212u,3489661056u}/* AAB0 */, /*5400*/{0,565248u,5177344u,3110877568u,3408624u,2147550212u,3489661056u}/* AAB4 */, /*5401*/{0,565248u,5177345u,90177856u,9437936u,132688u,3221225664u}/* AAB5 */, /*5402*/{0,565248u,5177344u,3446421888u,3408560u,2148598788u,3221225600u}/* AABF */, /*5403*/{0,565248u,5177345u,90177856u,9437936u,1181248u,3221225664u}/* AAC0 */, /*5404*/{0,565248u,5177345u,90177792u,9437936u,2148140608u,3221225664u}/* AADD */, /*5405*/{0,565248u,5177345u,90179008u,688u,131072u,3222274048u}/* AADE */, /*5406*/{0,565248u,5177345u,90179008u,688u,131072u,3222278144u}/* AADF */, /*5407*/{0,569344u,5636097u,94394688u,9437936u,132672u,3221225664u}/* AAE0 */, /*5408*/{0,569344u,5636096u,94386688u,808846064u,132100u,3489661056u}/* AAEB */, /*5409*/{0,569344u,5636096u,95172992u,808714992u,2147550212u,3489661056u}/* AAEC */, /*5410*/{0,569344u,5636097u,94373312u,12583600u,131072u,3222294528u}/* AAF0 */, /*5411*/{0,569344u,5636097u,94394624u,9437936u,2148140608u,3221225664u}/* AAF3 */, /*5412*/{0,569344u,5636096u,363608448u,808714928u,2148631556u,3221225600u}/* AAF6 */, /*5413*/{0,573440u,1703937u,92297536u,9437936u,132672u,3221225664u}/* AB01 */, /*5414*/{0,577536u,131073u,100685952u,7340784u,1073874536u,3221225664u}/* AB30 */, /*5415*/{267776u,577536u,131073u,100685952u,7340784u,1392641640u,3221225664u}/* AB53 */, /*5416*/{0,577536u,65537u,100664960u,688u,2148663296u,3221258240u}/* AB5B */, /*5417*/{1227358208u,577536u,131073u,100686100u,7340272u,3289515592u,2155872448u}/* AB5C */, /*5418*/{1227882496u,577536u,131073u,100686100u,7340272u,3289515592u,2155872448u}/* AB5D */, /*5419*/{1228406784u,577536u,131073u,100686100u,7340272u,3289515592u,2155872448u}/* AB5E */, /*5420*/{1228931072u,577536u,131073u,100686100u,7340272u,3289515592u,2155872448u}/* AB5F */, /*5421*/{0,577536u,131073u,102783104u,7340784u,1073874536u,3221225664u}/* AB60 */, /*5422*/{0,577536u,196609u,100685952u,7340784u,1073874536u,3221225664u}/* AB65 */, /*5423*/{267904u,2074664960u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB70 */, /*5424*/{268032u,2076762112u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB71 */, /*5425*/{268160u,2078859264u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB72 */, /*5426*/{268288u,2080956416u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB73 */, /*5427*/{268416u,2083053568u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB74 */, /*5428*/{268544u,2085150720u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB75 */, /*5429*/{268672u,2087247872u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB76 */, /*5430*/{268800u,2089345024u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB77 */, /*5431*/{268928u,2091442176u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB78 */, /*5432*/{269056u,2093539328u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB79 */, /*5433*/{269184u,2095636480u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7A */, /*5434*/{269312u,2097733632u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7B */, /*5435*/{269440u,2099830784u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7C */, /*5436*/{269568u,2101927936u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7D */, /*5437*/{269696u,2104025088u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7E */, /*5438*/{269824u,2106122240u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB7F */, /*5439*/{269952u,2108219392u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB80 */, /*5440*/{270080u,2110316544u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB81 */, /*5441*/{270208u,2112413696u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB82 */, /*5442*/{270336u,2114510848u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB83 */, /*5443*/{270464u,2116608000u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB84 */, /*5444*/{270592u,2118705152u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB85 */, /*5445*/{270720u,2120802304u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB86 */, /*5446*/{270848u,2122899456u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB87 */, /*5447*/{270976u,2124996608u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB88 */, /*5448*/{271104u,2127093760u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB89 */, /*5449*/{271232u,2129190912u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8A */, /*5450*/{271360u,2131288064u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8B */, /*5451*/{271488u,2133385216u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8C */, /*5452*/{271616u,2135482368u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8D */, /*5453*/{271744u,2137579520u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8E */, /*5454*/{271872u,2139676672u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB8F */, /*5455*/{272000u,2141773824u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB90 */, /*5456*/{272128u,2143870976u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB91 */, /*5457*/{272256u,2145968128u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB92 */, /*5458*/{272384u,2148065280u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB93 */, /*5459*/{272512u,2150162432u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB94 */, /*5460*/{272640u,2152259584u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB95 */, /*5461*/{272768u,2154356736u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB96 */, /*5462*/{272896u,2156453888u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB97 */, /*5463*/{273024u,2158551040u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB98 */, /*5464*/{273152u,2160648192u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB99 */, /*5465*/{273280u,2162745344u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9A */, /*5466*/{273408u,2164842496u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9B */, /*5467*/{273536u,2166939648u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9C */, /*5468*/{273664u,2169036800u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9D */, /*5469*/{273792u,2171133952u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9E */, /*5470*/{273920u,2173231104u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* AB9F */, /*5471*/{274048u,2175328256u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA0 */, /*5472*/{274176u,2177425408u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA1 */, /*5473*/{274304u,2179522560u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA2 */, /*5474*/{274432u,2181619712u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA3 */, /*5475*/{274560u,2183716864u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA4 */, /*5476*/{274688u,2185814016u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA5 */, /*5477*/{274816u,2187911168u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA6 */, /*5478*/{274944u,2190008320u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA7 */, /*5479*/{275072u,2192105472u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA8 */, /*5480*/{275200u,2194202624u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABA9 */, /*5481*/{275328u,2196299776u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAA */, /*5482*/{275456u,2198396928u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAB */, /*5483*/{275584u,2200494080u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAC */, /*5484*/{275712u,2202591232u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAD */, /*5485*/{275840u,2204688384u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAE */, /*5486*/{275968u,2206785536u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABAF */, /*5487*/{276096u,2208882688u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB0 */, /*5488*/{276224u,2210979840u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB1 */, /*5489*/{276352u,2213076992u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB2 */, /*5490*/{276480u,2215174144u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB3 */, /*5491*/{276608u,2217271296u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB4 */, /*5492*/{276736u,2219368448u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB5 */, /*5493*/{276864u,2221465600u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB6 */, /*5494*/{276992u,2223562752u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB7 */, /*5495*/{277120u,2225659904u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB8 */, /*5496*/{277248u,2227757056u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABB9 */, /*5497*/{277376u,2229854208u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBA */, /*5498*/{277504u,2231951360u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBB */, /*5499*/{277632u,2234048512u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBC */, /*5500*/{277760u,2236145664u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBD */, /*5501*/{277888u,2238242816u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBE */, /*5502*/{278016u,2240339968u,1769473u,102783104u,7340785u,1996621416u,3221225664u}/* ABBF */, /*5503*/{0,585728u,5636097u,90200384u,9437936u,132672u,3221225664u}/* ABC0 */, /*5504*/{0,585728u,5636096u,90192384u,808846064u,132100u,3489661056u}/* ABE3 */, /*5505*/{0,585728u,5636096u,90978688u,808714992u,2147550212u,3489661056u}/* ABE5 */, /*5506*/{0,585728u,5636097u,90179008u,12583600u,131072u,3222294528u}/* ABEB */, /*5507*/{0,585728u,5636096u,90192384u,808846000u,1180676u,3221225600u}/* ABEC */, /*5508*/{0,585728u,5636096u,359414144u,808714928u,2148631556u,3221225600u}/* ABED */, /*5509*/{0,585728u,39191553u,90208832u,44047024u,132097u,3221225600u}/* ABF0 */, /*5510*/{0,585728u,458622465u,90208832u,44047024u,132097u,3221225600u}/* ABF1 */, /*5511*/{0,585728u,492177921u,90208832u,44047024u,132097u,3221225600u}/* ABF2 */, /*5512*/{0,585728u,525731841u,90208832u,44047024u,132097u,3221225600u}/* ABF3 */, /*5513*/{0,585728u,559288321u,90208832u,44047024u,132097u,3221225600u}/* ABF4 */, /*5514*/{0,585728u,592841729u,90208832u,44047024u,132097u,3221225600u}/* ABF5 */, /*5515*/{0,585728u,626398721u,90208832u,44047024u,132097u,3221225600u}/* ABF6 */, /*5516*/{0,585728u,659951105u,90208832u,44047024u,132097u,3221225600u}/* ABF7 */, /*5517*/{0,585728u,693509121u,90208832u,44047024u,132097u,3221225600u}/* ABF8 */, /*5518*/{0,585728u,727061505u,90208832u,44047024u,132097u,3221225600u}/* ABF9 */, /*5519*/{0,589824u,1638400u,71326018u,3768222448u,132672u,192u}/* AC00 */, /*5520*/{0,589824u,1638400u,71326018u,4036731632u,132672u,192u}/* AC01 */, /*5521*/{0,593920u,1638400u,90200384u,3231204080u,132672u,3221225664u}/* D7B0 */, /*5522*/{0,593920u,1638400u,90200384u,3499713264u,132672u,3221225664u}/* D7CB */, /*5523*/{0,598016u,1u,71304320u,1073939122u,0,3221225472u}/* D800 */, /*5524*/{0,602112u,1u,71304320u,1073939122u,0,3221225472u}/* DB80 */, /*5525*/{0,606208u,1u,71304320u,1073939122u,0,3221225472u}/* DC00 */, /*5526*/{0,610304u,1u,69207104u,690u,0,3221225472u}/* E000 */, /*5527*/{1229455360u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F900 */, /*5528*/{1229979648u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F901 */, /*5529*/{1230503936u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F902 */, /*5530*/{1231028224u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F903 */, /*5531*/{1231552512u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F904 */, /*5532*/{1232076800u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F905 */, /*5533*/{1232601088u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F906 */, /*5534*/{1233125376u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F907 */, /*5535*/{1233649664u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F908 */, /*5536*/{1234173952u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F909 */, /*5537*/{1234698240u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90A */, /*5538*/{1235222528u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90B */, /*5539*/{1235746816u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90C */, /*5540*/{1236271104u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90D */, /*5541*/{1236795392u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90E */, /*5542*/{1237319680u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F90F */, /*5543*/{1237843968u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F910 */, /*5544*/{1238368256u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F911 */, /*5545*/{1238892544u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F912 */, /*5546*/{1239416832u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F913 */, /*5547*/{1239941120u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F914 */, /*5548*/{1240465408u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F915 */, /*5549*/{1240989696u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F916 */, /*5550*/{1241513984u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F917 */, /*5551*/{1242038272u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F918 */, /*5552*/{1242562560u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F919 */, /*5553*/{1243086848u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91A */, /*5554*/{1243611136u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91B */, /*5555*/{1244135424u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91C */, /*5556*/{1244659712u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91D */, /*5557*/{1245184000u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91E */, /*5558*/{1245708288u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F91F */, /*5559*/{1246232576u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F920 */, /*5560*/{1246756864u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F921 */, /*5561*/{1247281152u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F922 */, /*5562*/{1247805440u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F923 */, /*5563*/{1248329728u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F924 */, /*5564*/{1248854016u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F925 */, /*5565*/{1249378304u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F926 */, /*5566*/{1249902592u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F927 */, /*5567*/{1250426880u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F928 */, /*5568*/{1250951168u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F929 */, /*5569*/{1251475456u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92A */, /*5570*/{1251999744u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92B */, /*5571*/{1252524032u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92C */, /*5572*/{1253048320u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92D */, /*5573*/{1253572608u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92E */, /*5574*/{1254096896u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F92F */, /*5575*/{1254621184u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F930 */, /*5576*/{1255145472u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F931 */, /*5577*/{1255669760u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F932 */, /*5578*/{1256194048u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F933 */, /*5579*/{1256718336u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F934 */, /*5580*/{1257242624u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F935 */, /*5581*/{1257766912u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F936 */, /*5582*/{1258291200u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F937 */, /*5583*/{1258815488u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F938 */, /*5584*/{1259339776u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F939 */, /*5585*/{1259864064u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93A */, /*5586*/{1260388352u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93B */, /*5587*/{1260912640u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93C */, /*5588*/{1261436928u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93D */, /*5589*/{1261961216u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93E */, /*5590*/{1262485504u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F93F */, /*5591*/{1263009792u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F940 */, /*5592*/{1263534080u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F941 */, /*5593*/{1264058368u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F942 */, /*5594*/{1264582656u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F943 */, /*5595*/{1265106944u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F944 */, /*5596*/{1265631232u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F945 */, /*5597*/{1266155520u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F946 */, /*5598*/{1266679808u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F947 */, /*5599*/{1267204096u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F948 */, /*5600*/{1267728384u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F949 */, /*5601*/{1268252672u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94A */, /*5602*/{1268776960u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94B */, /*5603*/{1269301248u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94C */, /*5604*/{1269825536u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94D */, /*5605*/{1270349824u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94E */, /*5606*/{1270874112u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F94F */, /*5607*/{1271398400u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F950 */, /*5608*/{1271922688u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F951 */, /*5609*/{1272446976u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F952 */, /*5610*/{1272971264u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F953 */, /*5611*/{1273495552u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F954 */, /*5612*/{1274019840u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F955 */, /*5613*/{1274544128u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F956 */, /*5614*/{1275068416u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F957 */, /*5615*/{1275592704u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F958 */, /*5616*/{1276116992u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F959 */, /*5617*/{1276641280u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95A */, /*5618*/{1277165568u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95B */, /*5619*/{1277689856u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95C */, /*5620*/{1278214144u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95D */, /*5621*/{1278738432u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95E */, /*5622*/{1279262720u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F95F */, /*5623*/{1279787008u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F960 */, /*5624*/{1280311296u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F961 */, /*5625*/{1280835584u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F962 */, /*5626*/{1281359872u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F963 */, /*5627*/{1281884160u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F964 */, /*5628*/{1282408448u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F965 */, /*5629*/{1282932736u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F966 */, /*5630*/{1283457024u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F967 */, /*5631*/{1283981312u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F968 */, /*5632*/{1284505600u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F969 */, /*5633*/{1285029888u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F96A */, /*5634*/{1285554176u,614400u,522455040u,69206338u,42993776u,67503936u,192u}/* F96B */, /*5635*/{1286078464u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F96C */, /*5636*/{1286602752u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F96D */, /*5637*/{1287127040u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F96E */, /*5638*/{1287651328u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F96F */, /*5639*/{1288175616u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F970 */, /*5640*/{1288699904u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F971 */, /*5641*/{1289224192u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F972 */, /*5642*/{1289748480u,614400u,740564992u,69206338u,42993776u,67503936u,192u}/* F973 */, /*5643*/{1290272768u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F974 */, /*5644*/{1290797056u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F975 */, /*5645*/{1291321344u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F976 */, /*5646*/{1291845632u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F977 */, /*5647*/{1292369920u,614400u,488901120u,69206338u,42993776u,67503936u,192u}/* F978 */, /*5648*/{1292894208u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F979 */, /*5649*/{1293418496u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97A */, /*5650*/{1293942784u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97B */, /*5651*/{1294467072u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97C */, /*5652*/{1294991360u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97D */, /*5653*/{1295515648u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97E */, /*5654*/{1296039936u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F97F */, /*5655*/{1296564224u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F980 */, /*5656*/{1297088512u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F981 */, /*5657*/{1297612800u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F982 */, /*5658*/{1298137088u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F983 */, /*5659*/{1298661376u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F984 */, /*5660*/{1299185664u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F985 */, /*5661*/{1299709952u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F986 */, /*5662*/{1300234240u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F987 */, /*5663*/{1300758528u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F988 */, /*5664*/{1301282816u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F989 */, /*5665*/{1301807104u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98A */, /*5666*/{1302331392u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98B */, /*5667*/{1302855680u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98C */, /*5668*/{1303379968u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98D */, /*5669*/{1303904256u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98E */, /*5670*/{1304428544u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F98F */, /*5671*/{1304952832u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F990 */, /*5672*/{1305477120u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F991 */, /*5673*/{1306001408u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F992 */, /*5674*/{1306525696u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F993 */, /*5675*/{1307049984u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F994 */, /*5676*/{1307574272u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F995 */, /*5677*/{1308098560u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F996 */, /*5678*/{1308622848u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F997 */, /*5679*/{1309147136u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F998 */, /*5680*/{1309671424u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F999 */, /*5681*/{1310195712u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99A */, /*5682*/{1310720000u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99B */, /*5683*/{1311244288u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99C */, /*5684*/{1311768576u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99D */, /*5685*/{1312292864u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99E */, /*5686*/{1312817152u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F99F */, /*5687*/{1313341440u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A0 */, /*5688*/{1313865728u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A1 */, /*5689*/{1314390016u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A2 */, /*5690*/{1314914304u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A3 */, /*5691*/{1315438592u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A4 */, /*5692*/{1315962880u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A5 */, /*5693*/{1316487168u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A6 */, /*5694*/{1317011456u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A7 */, /*5695*/{1317535744u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A8 */, /*5696*/{1318060032u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9A9 */, /*5697*/{1318584320u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AA */, /*5698*/{1319108608u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AB */, /*5699*/{1319632896u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AC */, /*5700*/{1320157184u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AD */, /*5701*/{1320681472u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AE */, /*5702*/{1321205760u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9AF */, /*5703*/{1321730048u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B0 */, /*5704*/{1322254336u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B1 */, /*5705*/{1322778624u,614400u,35914752u,69206338u,42993776u,67503936u,192u}/* F9B2 */, /*5706*/{1323302912u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B3 */, /*5707*/{1323827200u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B4 */, /*5708*/{1324351488u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B5 */, /*5709*/{1324875776u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B6 */, /*5710*/{1325400064u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B7 */, /*5711*/{1325924352u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B8 */, /*5712*/{1326448640u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9B9 */, /*5713*/{1326972928u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BA */, /*5714*/{1327497216u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BB */, /*5715*/{1328021504u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BC */, /*5716*/{1328545792u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BD */, /*5717*/{1329070080u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BE */, /*5718*/{1329594368u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9BF */, /*5719*/{1330118656u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C0 */, /*5720*/{1330642944u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C1 */, /*5721*/{1331167232u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C2 */, /*5722*/{1331691520u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C3 */, /*5723*/{1332215808u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C4 */, /*5724*/{1332740096u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C5 */, /*5725*/{1333264384u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C6 */, /*5726*/{1333788672u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C7 */, /*5727*/{1334312960u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C8 */, /*5728*/{1334837248u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9C9 */, /*5729*/{1335361536u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CA */, /*5730*/{1335885824u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CB */, /*5731*/{1336410112u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CC */, /*5732*/{1336934400u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CD */, /*5733*/{1337458688u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CE */, /*5734*/{1337982976u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9CF */, /*5735*/{1338507264u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D0 */, /*5736*/{1339031552u,614400u,623121920u,69206338u,42993776u,67503936u,192u}/* F9D1 */, /*5737*/{1339555840u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D2 */, /*5738*/{1340080128u,614400u,623121920u,69206338u,42993776u,67503936u,192u}/* F9D3 */, /*5739*/{1340604416u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D4 */, /*5740*/{1341128704u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D5 */, /*5741*/{1341652992u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D6 */, /*5742*/{1342177280u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D7 */, /*5743*/{1342701568u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D8 */, /*5744*/{1343225856u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9D9 */, /*5745*/{1343750144u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DA */, /*5746*/{1344274432u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DB */, /*5747*/{1344798720u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DC */, /*5748*/{1345323008u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DD */, /*5749*/{1345847296u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DE */, /*5750*/{1346371584u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9DF */, /*5751*/{1346895872u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E0 */, /*5752*/{1347420160u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E1 */, /*5753*/{1347944448u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E2 */, /*5754*/{1348468736u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E3 */, /*5755*/{1348993024u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E4 */, /*5756*/{1349517312u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E5 */, /*5757*/{1350041600u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E6 */, /*5758*/{1350565888u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E7 */, /*5759*/{1351090176u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E8 */, /*5760*/{1351614464u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9E9 */, /*5761*/{1352138752u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9EA */, /*5762*/{1352663040u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9EB */, /*5763*/{1353187328u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9EC */, /*5764*/{1353711616u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9ED */, /*5765*/{1354235904u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9EE */, /*5766*/{1354760192u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9EF */, /*5767*/{1355284480u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F0 */, /*5768*/{1355808768u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F1 */, /*5769*/{1356333056u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F2 */, /*5770*/{1356857344u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F3 */, /*5771*/{1357381632u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F4 */, /*5772*/{1357905920u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F5 */, /*5773*/{1358430208u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F6 */, /*5774*/{1358954496u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F7 */, /*5775*/{1359478784u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F8 */, /*5776*/{1360003072u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9F9 */, /*5777*/{1360527360u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9FA */, /*5778*/{1361051648u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9FB */, /*5779*/{1361575936u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9FC */, /*5780*/{1362100224u,614400u,740564992u,69206338u,42993776u,67503936u,192u}/* F9FD */, /*5781*/{1362624512u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9FE */, /*5782*/{1363148800u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* F9FF */, /*5783*/{1363673088u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA00 */, /*5784*/{1364197376u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA01 */, /*5785*/{1364721664u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA02 */, /*5786*/{1365245952u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA03 */, /*5787*/{1365770240u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA04 */, /*5788*/{1366294528u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA05 */, /*5789*/{1366818816u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA06 */, /*5790*/{1367343104u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA07 */, /*5791*/{1367867392u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA08 */, /*5792*/{1368391680u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA09 */, /*5793*/{1368915968u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA0A */, /*5794*/{1369440256u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA0B */, /*5795*/{1369964544u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA0C */, /*5796*/{1370488832u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA0D */, /*5797*/{0,614400u,2359297u,69206336u,9437936u,132928u,3221227712u}/* FA0E */, /*5798*/{1371013120u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA10 */, /*5799*/{1371537408u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA12 */, /*5800*/{1372061696u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA15 */, /*5801*/{1372585984u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA16 */, /*5802*/{1373110272u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA17 */, /*5803*/{1373634560u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA18 */, /*5804*/{1374158848u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA19 */, /*5805*/{1374683136u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA1A */, /*5806*/{1375207424u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA1B */, /*5807*/{1375731712u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA1C */, /*5808*/{1376256000u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA1D */, /*5809*/{1376780288u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA1E */, /*5810*/{1377304576u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA20 */, /*5811*/{1377828864u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA22 */, /*5812*/{1378353152u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA25 */, /*5813*/{1378877440u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA26 */, /*5814*/{1379401728u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA2A */, /*5815*/{1379926016u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA2B */, /*5816*/{1380450304u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA2C */, /*5817*/{1380974592u,614400u,2359296u,69206338u,9437296u,67503936u,192u}/* FA2D */, /*5818*/{1381498880u,614400u,2359296u,94372162u,9437296u,67503936u,192u}/* FA2E */, /*5819*/{1382023168u,614400u,2359296u,94372162u,9437296u,67503936u,192u}/* FA2F */, /*5820*/{1382547456u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA30 */, /*5821*/{1383071744u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA31 */, /*5822*/{1383596032u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA32 */, /*5823*/{1384120320u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA33 */, /*5824*/{1384644608u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA34 */, /*5825*/{1385168896u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA35 */, /*5826*/{1385693184u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA36 */, /*5827*/{1386217472u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA37 */, /*5828*/{1386741760u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA38 */, /*5829*/{1387266048u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA39 */, /*5830*/{1387790336u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3A */, /*5831*/{1388314624u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3B */, /*5832*/{1388838912u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3C */, /*5833*/{1389363200u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3D */, /*5834*/{1389887488u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3E */, /*5835*/{1390411776u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA3F */, /*5836*/{1390936064u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA40 */, /*5837*/{1391460352u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA41 */, /*5838*/{1391984640u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA42 */, /*5839*/{1392508928u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA43 */, /*5840*/{1393033216u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA44 */, /*5841*/{1393557504u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA45 */, /*5842*/{1394081792u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA46 */, /*5843*/{1394606080u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA47 */, /*5844*/{1395130368u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA48 */, /*5845*/{1395654656u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA49 */, /*5846*/{1396178944u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4A */, /*5847*/{1396703232u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4B */, /*5848*/{1397227520u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4C */, /*5849*/{1397751808u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4D */, /*5850*/{1398276096u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4E */, /*5851*/{1398800384u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA4F */, /*5852*/{1399324672u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA50 */, /*5853*/{1399848960u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA51 */, /*5854*/{1400373248u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA52 */, /*5855*/{1400897536u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA53 */, /*5856*/{1401421824u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA54 */, /*5857*/{1401946112u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA55 */, /*5858*/{1402470400u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA56 */, /*5859*/{1402994688u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA57 */, /*5860*/{1403518976u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA58 */, /*5861*/{1404043264u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA59 */, /*5862*/{1404567552u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5A */, /*5863*/{1405091840u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5B */, /*5864*/{1405616128u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5C */, /*5865*/{1406140416u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5D */, /*5866*/{1406664704u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5E */, /*5867*/{1407188992u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA5F */, /*5868*/{1407713280u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA60 */, /*5869*/{1408237568u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA61 */, /*5870*/{1408761856u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA62 */, /*5871*/{1409286144u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA63 */, /*5872*/{1409810432u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA64 */, /*5873*/{1410334720u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA65 */, /*5874*/{1410859008u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA66 */, /*5875*/{1411383296u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA67 */, /*5876*/{1411907584u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA68 */, /*5877*/{1412431872u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA69 */, /*5878*/{1412956160u,614400u,2359296u,79692098u,9437296u,67503936u,192u}/* FA6A */, /*5879*/{1413480448u,614400u,2359296u,90177858u,9437296u,67503936u,192u}/* FA6B */, /*5880*/{1414004736u,614400u,2359296u,90177858u,9437296u,67503936u,192u}/* FA6C */, /*5881*/{1414529024u,614400u,2359296u,90177858u,9437296u,67503936u,192u}/* FA6D */, /*5882*/{1415053312u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA70 */, /*5883*/{1415577600u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA71 */, /*5884*/{1416101888u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA72 */, /*5885*/{1416626176u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA73 */, /*5886*/{1417150464u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA74 */, /*5887*/{1417674752u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA75 */, /*5888*/{1418199040u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA76 */, /*5889*/{1418723328u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA77 */, /*5890*/{1419247616u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA78 */, /*5891*/{1419771904u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA79 */, /*5892*/{1420296192u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7A */, /*5893*/{1420820480u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7B */, /*5894*/{1421344768u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7C */, /*5895*/{1421869056u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7D */, /*5896*/{1422393344u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7E */, /*5897*/{1422917632u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA7F */, /*5898*/{1423441920u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA80 */, /*5899*/{1423966208u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA81 */, /*5900*/{1424490496u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA82 */, /*5901*/{1425014784u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA83 */, /*5902*/{1425539072u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA84 */, /*5903*/{1426063360u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA85 */, /*5904*/{1426587648u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA86 */, /*5905*/{1427111936u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA87 */, /*5906*/{1427636224u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA88 */, /*5907*/{1428160512u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA89 */, /*5908*/{1428684800u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8A */, /*5909*/{1429209088u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8B */, /*5910*/{1429733376u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8C */, /*5911*/{1430257664u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8D */, /*5912*/{1430781952u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8E */, /*5913*/{1431306240u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA8F */, /*5914*/{1431830528u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA90 */, /*5915*/{1432354816u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA91 */, /*5916*/{1432879104u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA92 */, /*5917*/{1433403392u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA93 */, /*5918*/{1433927680u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA94 */, /*5919*/{1434451968u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA95 */, /*5920*/{1434976256u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA96 */, /*5921*/{1435500544u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA97 */, /*5922*/{1436024832u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA98 */, /*5923*/{1436549120u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA99 */, /*5924*/{1437073408u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9A */, /*5925*/{1437597696u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9B */, /*5926*/{1438121984u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9C */, /*5927*/{1438646272u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9D */, /*5928*/{1439170560u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9E */, /*5929*/{1439694848u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FA9F */, /*5930*/{1440219136u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA0 */, /*5931*/{1440743424u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA1 */, /*5932*/{1441267712u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA2 */, /*5933*/{1441792000u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA3 */, /*5934*/{1442316288u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA4 */, /*5935*/{1442840576u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA5 */, /*5936*/{1443364864u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA6 */, /*5937*/{1443889152u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA7 */, /*5938*/{1444413440u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA8 */, /*5939*/{1444937728u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAA9 */, /*5940*/{1445462016u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAA */, /*5941*/{1445986304u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAB */, /*5942*/{1446510592u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAC */, /*5943*/{1447034880u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAD */, /*5944*/{1447559168u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAE */, /*5945*/{1448083456u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAAF */, /*5946*/{1448607744u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB0 */, /*5947*/{1449132032u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB1 */, /*5948*/{1449656320u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB2 */, /*5949*/{1450180608u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB3 */, /*5950*/{1450704896u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB4 */, /*5951*/{1451229184u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB5 */, /*5952*/{1451753472u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB6 */, /*5953*/{1452277760u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB7 */, /*5954*/{1452802048u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB8 */, /*5955*/{1453326336u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAB9 */, /*5956*/{1453850624u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABA */, /*5957*/{1454374912u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABB */, /*5958*/{1454899200u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABC */, /*5959*/{1455423488u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABD */, /*5960*/{1455947776u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABE */, /*5961*/{1456472064u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FABF */, /*5962*/{1456996352u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC0 */, /*5963*/{1457520640u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC1 */, /*5964*/{1458044928u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC2 */, /*5965*/{1458569216u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC3 */, /*5966*/{1459093504u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC4 */, /*5967*/{1459617792u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC5 */, /*5968*/{1460142080u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC6 */, /*5969*/{1460666368u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC7 */, /*5970*/{1461190656u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC8 */, /*5971*/{1461714944u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAC9 */, /*5972*/{1462239232u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACA */, /*5973*/{1462763520u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACB */, /*5974*/{1463287808u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACC */, /*5975*/{1463812096u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACD */, /*5976*/{1464336384u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACE */, /*5977*/{1464860672u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FACF */, /*5978*/{1465384960u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD0 */, /*5979*/{1465909248u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD1 */, /*5980*/{1466433536u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD2 */, /*5981*/{1466957824u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD3 */, /*5982*/{1467482112u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD4 */, /*5983*/{1468006400u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD5 */, /*5984*/{1468530688u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD6 */, /*5985*/{1469054976u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD7 */, /*5986*/{1469579264u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD8 */, /*5987*/{1470103552u,614400u,2359296u,83886402u,9437296u,67503936u,192u}/* FAD9 */, /*5988*/{1470627843u,195653632u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB00 */, /*5989*/{1471152132u,197750784u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB01 */, /*5990*/{1471676421u,199847936u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB02 */, /*5991*/{1472200710u,201945088u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB03 */, /*5992*/{1472724999u,204042240u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB04 */, /*5993*/{1473249288u,206139392u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB05 */, /*5994*/{1473773577u,208236544u,131073u,69228676u,7340272u,1996621416u,2147483840u}/* FB06 */, /*5995*/{1474297867u,210333696u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* FB13 */, /*5996*/{1474822156u,212430848u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* FB14 */, /*5997*/{1475346445u,214528000u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* FB15 */, /*5998*/{1475870734u,216625152u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* FB16 */, /*5999*/{1476395023u,218722304u,327681u,69228676u,7340272u,1996621416u,2147483840u}/* FB17 */, /*6000*/{1476919296u,618496u,393216u,75569474u,9437296u,67503680u,192u}/* FB1D */, /*6001*/{0,618496u,393216u,1479293312u,808714992u,2148598788u,3489661056u}/* FB1E */, /*6002*/{1477443584u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB1F */, /*6003*/{1477967872u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB20 */, /*6004*/{1478492160u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB21 */, /*6005*/{1479016448u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB22 */, /*6006*/{1479540736u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB23 */, /*6007*/{1480065024u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB24 */, /*6008*/{1480589312u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB25 */, /*6009*/{1481113600u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB26 */, /*6010*/{1481637888u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB27 */, /*6011*/{1482162176u,618496u,393217u,69278022u,9437424u,67241536u,2147483840u}/* FB28 */, /*6012*/{1482686464u,618496u,393217u,69404166u,176u,67239938u,2147516416u}/* FB29 */, /*6013*/{1483210752u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2A */, /*6014*/{1483735040u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2B */, /*6015*/{1484259328u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2C */, /*6016*/{1484783616u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2D */, /*6017*/{1485307904u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2E */, /*6018*/{1485832192u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB2F */, /*6019*/{1486356480u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB30 */, /*6020*/{1486880768u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB31 */, /*6021*/{1487405056u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB32 */, /*6022*/{1487929344u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB33 */, /*6023*/{1488453632u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB34 */, /*6024*/{1488977920u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB35 */, /*6025*/{1489502208u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB36 */, /*6026*/{1490026496u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB38 */, /*6027*/{1490550784u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB39 */, /*6028*/{1491075072u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB3A */, /*6029*/{1491599360u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB3B */, /*6030*/{1492123648u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB3C */, /*6031*/{1492647936u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB3E */, /*6032*/{1493172224u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB40 */, /*6033*/{1493696512u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB41 */, /*6034*/{1494220800u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB43 */, /*6035*/{1494745088u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB44 */, /*6036*/{1495269376u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB46 */, /*6037*/{1495793664u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB47 */, /*6038*/{1496317952u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB48 */, /*6039*/{1496842240u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB49 */, /*6040*/{1497366528u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB4A */, /*6041*/{1497890816u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB4B */, /*6042*/{1498415104u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB4C */, /*6043*/{1498939392u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB4D */, /*6044*/{1499463680u,618496u,393216u,69278018u,9437296u,67503680u,192u}/* FB4E */, /*6045*/{1499987968u,618496u,393217u,69278020u,9437424u,67241536u,2147483840u}/* FB4F */, /*6046*/{1500512256u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB50 */, /*6047*/{1501036544u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB51 */, /*6048*/{1501560832u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB52 */, /*6049*/{1502085120u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB53 */, /*6050*/{1502609408u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB54 */, /*6051*/{1503133696u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB55 */, /*6052*/{1503657984u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB56 */, /*6053*/{1504182272u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB57 */, /*6054*/{1504706560u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB58 */, /*6055*/{1505230848u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB59 */, /*6056*/{1505755136u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB5A */, /*6057*/{1506279424u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB5B */, /*6058*/{1506803712u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB5C */, /*6059*/{1507328000u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB5D */, /*6060*/{1507852288u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB5E */, /*6061*/{1508376576u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB5F */, /*6062*/{1508900864u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB60 */, /*6063*/{1509425152u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB61 */, /*6064*/{1509949440u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB62 */, /*6065*/{1510473728u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB63 */, /*6066*/{1510998016u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB64 */, /*6067*/{1511522304u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB65 */, /*6068*/{1512046592u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB66 */, /*6069*/{1512570880u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB67 */, /*6070*/{1513095168u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB68 */, /*6071*/{1513619456u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB69 */, /*6072*/{1514143744u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB6A */, /*6073*/{1514668032u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB6B */, /*6074*/{1515192320u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB6C */, /*6075*/{1515716608u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB6D */, /*6076*/{1516240896u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB6E */, /*6077*/{1516765184u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB6F */, /*6078*/{1517289472u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB70 */, /*6079*/{1517813760u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB71 */, /*6080*/{1518338048u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB72 */, /*6081*/{1518862336u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB73 */, /*6082*/{1519386624u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB74 */, /*6083*/{1519910912u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB75 */, /*6084*/{1520435200u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB76 */, /*6085*/{1520959488u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB77 */, /*6086*/{1521483776u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB78 */, /*6087*/{1522008064u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB79 */, /*6088*/{1522532352u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB7A */, /*6089*/{1523056640u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB7B */, /*6090*/{1523580928u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB7C */, /*6091*/{1524105216u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB7D */, /*6092*/{1524629504u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB7E */, /*6093*/{1525153792u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB7F */, /*6094*/{1525678080u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB80 */, /*6095*/{1526202368u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB81 */, /*6096*/{1526726656u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB82 */, /*6097*/{1527250944u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB83 */, /*6098*/{1527775232u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB84 */, /*6099*/{1528299520u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB85 */, /*6100*/{1528823808u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB86 */, /*6101*/{1529348096u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB87 */, /*6102*/{1529872384u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB88 */, /*6103*/{1530396672u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB89 */, /*6104*/{1530920960u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB8A */, /*6105*/{1531445248u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB8B */, /*6106*/{1531969536u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB8C */, /*6107*/{1532493824u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB8D */, /*6108*/{1533018112u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB8E */, /*6109*/{1533542400u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB8F */, /*6110*/{1534066688u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB90 */, /*6111*/{1534590976u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB91 */, /*6112*/{1535115264u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB92 */, /*6113*/{1535639552u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB93 */, /*6114*/{1536163840u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB94 */, /*6115*/{1536688128u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB95 */, /*6116*/{1537212416u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB96 */, /*6117*/{1537736704u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB97 */, /*6118*/{1538260992u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB98 */, /*6119*/{1538785280u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB99 */, /*6120*/{1539309568u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB9A */, /*6121*/{1539833856u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB9B */, /*6122*/{1540358144u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FB9C */, /*6123*/{1540882432u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FB9D */, /*6124*/{1541406720u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FB9E */, /*6125*/{1541931008u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FB9F */, /*6126*/{1542455296u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBA0 */, /*6127*/{1542979584u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBA1 */, /*6128*/{1543503872u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBA2 */, /*6129*/{1544028160u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBA3 */, /*6130*/{1544552448u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBA4 */, /*6131*/{1545076736u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBA5 */, /*6132*/{1545601024u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBA6 */, /*6133*/{1546125312u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBA7 */, /*6134*/{1546649600u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBA8 */, /*6135*/{1547173888u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBA9 */, /*6136*/{1547698176u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBAA */, /*6137*/{1548222464u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBAB */, /*6138*/{1548746752u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBAC */, /*6139*/{1549271040u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBAD */, /*6140*/{1549795328u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBAE */, /*6141*/{1550319616u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBAF */, /*6142*/{1550843904u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBB0 */, /*6143*/{1551368192u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBB1 */, /*6144*/{0,622592u,458753u,93128320u,688u,2147614720u,3221258240u}/* FBB2 */, /*6145*/{1551892480u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBD3 */, /*6146*/{1552416768u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBD4 */, /*6147*/{1552941056u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBD5 */, /*6148*/{1553465344u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBD6 */, /*6149*/{1553989632u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBD7 */, /*6150*/{1554513920u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBD8 */, /*6151*/{1555038208u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBD9 */, /*6152*/{1555562496u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBDA */, /*6153*/{1556086784u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBDB */, /*6154*/{1556611072u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBDC */, /*6155*/{1557135360u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBDD */, /*6156*/{1557659648u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBDE */, /*6157*/{1558183936u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBDF */, /*6158*/{1558708224u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBE0 */, /*6159*/{1559232512u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBE1 */, /*6160*/{1559756800u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBE2 */, /*6161*/{1560281088u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBE3 */, /*6162*/{1560805376u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBE4 */, /*6163*/{1561329664u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBE5 */, /*6164*/{1561853952u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBE6 */, /*6165*/{1562378240u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBE7 */, /*6166*/{1562902528u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBE8 */, /*6167*/{1563426816u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBE9 */, /*6168*/{1563951104u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBEA */, /*6169*/{1564475392u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBEB */, /*6170*/{1564999680u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBEC */, /*6171*/{1565523968u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBED */, /*6172*/{1566048256u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBEE */, /*6173*/{1566572544u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBEF */, /*6174*/{1567096832u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBF0 */, /*6175*/{1567621120u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBF1 */, /*6176*/{1568145408u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBF2 */, /*6177*/{1568669696u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBF3 */, /*6178*/{1569193984u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBF4 */, /*6179*/{1569718272u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBF5 */, /*6180*/{1570242560u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBF6 */, /*6181*/{1570766848u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBF7 */, /*6182*/{1571291136u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBF8 */, /*6183*/{1571815424u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBF9 */, /*6184*/{1572339712u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBFA */, /*6185*/{1572864000u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBFB */, /*6186*/{1573388288u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FBFC */, /*6187*/{1573912576u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FBFD */, /*6188*/{1574436864u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FBFE */, /*6189*/{1574961152u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FBFF */, /*6190*/{1575485440u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC00 */, /*6191*/{1576009728u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC01 */, /*6192*/{1576534016u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC02 */, /*6193*/{1577058304u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC03 */, /*6194*/{1577582592u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC04 */, /*6195*/{1578106880u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC05 */, /*6196*/{1578631168u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC06 */, /*6197*/{1579155456u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC07 */, /*6198*/{1579679744u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC08 */, /*6199*/{1580204032u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC09 */, /*6200*/{1580728320u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0A */, /*6201*/{1581252608u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0B */, /*6202*/{1581776896u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0C */, /*6203*/{1582301184u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0D */, /*6204*/{1582825472u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0E */, /*6205*/{1583349760u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC0F */, /*6206*/{1583874048u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC10 */, /*6207*/{1584398336u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC11 */, /*6208*/{1584922624u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC12 */, /*6209*/{1585446912u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC13 */, /*6210*/{1585971200u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC14 */, /*6211*/{1586495488u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC15 */, /*6212*/{1587019776u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC16 */, /*6213*/{1587544064u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC17 */, /*6214*/{1588068352u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC18 */, /*6215*/{1588592640u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC19 */, /*6216*/{1589116928u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1A */, /*6217*/{1589641216u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1B */, /*6218*/{1590165504u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1C */, /*6219*/{1590689792u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1D */, /*6220*/{1591214080u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1E */, /*6221*/{1591738368u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC1F */, /*6222*/{1592262656u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC20 */, /*6223*/{1592786944u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC21 */, /*6224*/{1593311232u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC22 */, /*6225*/{1593835520u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC23 */, /*6226*/{1594359808u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC24 */, /*6227*/{1594884096u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC25 */, /*6228*/{1595408384u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC26 */, /*6229*/{1595932672u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC27 */, /*6230*/{1596456960u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC28 */, /*6231*/{1596981248u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC29 */, /*6232*/{1597505536u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2A */, /*6233*/{1598029824u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2B */, /*6234*/{1598554112u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2C */, /*6235*/{1599078400u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2D */, /*6236*/{1599602688u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2E */, /*6237*/{1600126976u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC2F */, /*6238*/{1600651264u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC30 */, /*6239*/{1601175552u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC31 */, /*6240*/{1601699840u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC32 */, /*6241*/{1602224128u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC33 */, /*6242*/{1602748416u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC34 */, /*6243*/{1603272704u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC35 */, /*6244*/{1603796992u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC36 */, /*6245*/{1604321280u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC37 */, /*6246*/{1604845568u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC38 */, /*6247*/{1605369856u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC39 */, /*6248*/{1605894144u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3A */, /*6249*/{1606418432u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3B */, /*6250*/{1606942720u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3C */, /*6251*/{1607467008u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3D */, /*6252*/{1607991296u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3E */, /*6253*/{1608515584u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC3F */, /*6254*/{1609039872u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC40 */, /*6255*/{1609564160u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC41 */, /*6256*/{1610088448u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC42 */, /*6257*/{1610612736u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC43 */, /*6258*/{1611137024u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC44 */, /*6259*/{1611661312u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC45 */, /*6260*/{1612185600u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC46 */, /*6261*/{1612709888u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC47 */, /*6262*/{1613234176u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC48 */, /*6263*/{1613758464u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC49 */, /*6264*/{1614282752u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4A */, /*6265*/{1614807040u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4B */, /*6266*/{1615331328u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4C */, /*6267*/{1615855616u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4D */, /*6268*/{1616379904u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4E */, /*6269*/{1616904192u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC4F */, /*6270*/{1617428480u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC50 */, /*6271*/{1617952768u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC51 */, /*6272*/{1618477056u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC52 */, /*6273*/{1619001344u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC53 */, /*6274*/{1619525632u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC54 */, /*6275*/{1620049920u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC55 */, /*6276*/{1620574208u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC56 */, /*6277*/{1621098496u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC57 */, /*6278*/{1621622784u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC58 */, /*6279*/{1622147072u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC59 */, /*6280*/{1622671360u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC5A */, /*6281*/{1623195648u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC5B */, /*6282*/{1623719936u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC5C */, /*6283*/{1624244224u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FC5D */, /*6284*/{1624768512u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC5E */, /*6285*/{1625292800u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC5F */, /*6286*/{1625817088u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC60 */, /*6287*/{1626341376u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC61 */, /*6288*/{1626865664u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC62 */, /*6289*/{1627389952u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FC63 */, /*6290*/{1627914240u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC64 */, /*6291*/{1628438528u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC65 */, /*6292*/{1628962816u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC66 */, /*6293*/{1629487104u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC67 */, /*6294*/{1630011392u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC68 */, /*6295*/{1630535680u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC69 */, /*6296*/{1631059968u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6A */, /*6297*/{1631584256u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6B */, /*6298*/{1632108544u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6C */, /*6299*/{1632632832u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6D */, /*6300*/{1633157120u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6E */, /*6301*/{1633681408u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC6F */, /*6302*/{1634205696u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC70 */, /*6303*/{1634729984u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC71 */, /*6304*/{1635254272u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC72 */, /*6305*/{1635778560u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC73 */, /*6306*/{1636302848u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC74 */, /*6307*/{1636827136u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC75 */, /*6308*/{1637351424u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC76 */, /*6309*/{1637875712u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC77 */, /*6310*/{1638400000u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC78 */, /*6311*/{1638924288u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC79 */, /*6312*/{1639448576u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7A */, /*6313*/{1639972864u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7B */, /*6314*/{1640497152u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7C */, /*6315*/{1641021440u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7D */, /*6316*/{1641545728u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7E */, /*6317*/{1642070016u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC7F */, /*6318*/{1642594304u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC80 */, /*6319*/{1643118592u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC81 */, /*6320*/{1643642880u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC82 */, /*6321*/{1644167168u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC83 */, /*6322*/{1644691456u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC84 */, /*6323*/{1645215744u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC85 */, /*6324*/{1645740032u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC86 */, /*6325*/{1646264320u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC87 */, /*6326*/{1646788608u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC88 */, /*6327*/{1647312896u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC89 */, /*6328*/{1647837184u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8A */, /*6329*/{1648361472u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8B */, /*6330*/{1648885760u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8C */, /*6331*/{1649410048u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8D */, /*6332*/{1649934336u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8E */, /*6333*/{1650458624u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC8F */, /*6334*/{1650982912u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC90 */, /*6335*/{1651507200u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC91 */, /*6336*/{1652031488u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC92 */, /*6337*/{1652555776u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC93 */, /*6338*/{1653080064u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC94 */, /*6339*/{1653604352u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC95 */, /*6340*/{1654128640u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FC96 */, /*6341*/{1654652928u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC97 */, /*6342*/{1655177216u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC98 */, /*6343*/{1655701504u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC99 */, /*6344*/{1656225792u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9A */, /*6345*/{1656750080u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9B */, /*6346*/{1657274368u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9C */, /*6347*/{1657798656u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9D */, /*6348*/{1658322944u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9E */, /*6349*/{1658847232u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FC9F */, /*6350*/{1659371520u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA0 */, /*6351*/{1659895808u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA1 */, /*6352*/{1660420096u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA2 */, /*6353*/{1660944384u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA3 */, /*6354*/{1661468672u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA4 */, /*6355*/{1661992960u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA5 */, /*6356*/{1662517248u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA6 */, /*6357*/{1663041536u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA7 */, /*6358*/{1663565824u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA8 */, /*6359*/{1664090112u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCA9 */, /*6360*/{1664614400u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAA */, /*6361*/{1665138688u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAB */, /*6362*/{1665662976u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAC */, /*6363*/{1666187264u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAD */, /*6364*/{1666711552u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAE */, /*6365*/{1667235840u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCAF */, /*6366*/{1667760128u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB0 */, /*6367*/{1668284416u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB1 */, /*6368*/{1668808704u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB2 */, /*6369*/{1669332992u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB3 */, /*6370*/{1669857280u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB4 */, /*6371*/{1670381568u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB5 */, /*6372*/{1670905856u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB6 */, /*6373*/{1671430144u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB7 */, /*6374*/{1671954432u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB8 */, /*6375*/{1672478720u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCB9 */, /*6376*/{1673003008u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBA */, /*6377*/{1673527296u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBB */, /*6378*/{1674051584u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBC */, /*6379*/{1674575872u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBD */, /*6380*/{1675100160u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBE */, /*6381*/{1675624448u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCBF */, /*6382*/{1676148736u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC0 */, /*6383*/{1676673024u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC1 */, /*6384*/{1677197312u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC2 */, /*6385*/{1677721600u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC3 */, /*6386*/{1678245888u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC4 */, /*6387*/{1678770176u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC5 */, /*6388*/{1679294464u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC6 */, /*6389*/{1679818752u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC7 */, /*6390*/{1680343040u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC8 */, /*6391*/{1680867328u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCC9 */, /*6392*/{1681391616u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCA */, /*6393*/{1681915904u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCB */, /*6394*/{1682440192u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCC */, /*6395*/{1682964480u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCD */, /*6396*/{1683488768u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCE */, /*6397*/{1684013056u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCCF */, /*6398*/{1684537344u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD0 */, /*6399*/{1685061632u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD1 */, /*6400*/{1685585920u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD2 */, /*6401*/{1686110208u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD3 */, /*6402*/{1686634496u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD4 */, /*6403*/{1687158784u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD5 */, /*6404*/{1687683072u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD6 */, /*6405*/{1688207360u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD7 */, /*6406*/{1688731648u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD8 */, /*6407*/{1689255936u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCD9 */, /*6408*/{1689780224u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCDA */, /*6409*/{1690304512u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCDB */, /*6410*/{1690828800u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCDC */, /*6411*/{1691353088u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCDD */, /*6412*/{1691877376u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FCDE */, /*6413*/{1692401664u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCDF */, /*6414*/{1692925952u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE0 */, /*6415*/{1693450240u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE1 */, /*6416*/{1693974528u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE2 */, /*6417*/{1694498816u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE3 */, /*6418*/{1695023104u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE4 */, /*6419*/{1695547392u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE5 */, /*6420*/{1696071680u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE6 */, /*6421*/{1696595968u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE7 */, /*6422*/{1697120256u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE8 */, /*6423*/{1697644544u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCE9 */, /*6424*/{1698168832u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCEA */, /*6425*/{1698693120u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCEB */, /*6426*/{1699217408u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCEC */, /*6427*/{1699741696u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCED */, /*6428*/{1700265984u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCEE */, /*6429*/{1700790272u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCEF */, /*6430*/{1701314560u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCF0 */, /*6431*/{1701838848u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCF1 */, /*6432*/{1702363136u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCF2 */, /*6433*/{1702887424u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCF3 */, /*6434*/{1703411712u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FCF4 */, /*6435*/{1703936000u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCF5 */, /*6436*/{1704460288u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCF6 */, /*6437*/{1704984576u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCF7 */, /*6438*/{1705508864u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCF8 */, /*6439*/{1706033152u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCF9 */, /*6440*/{1706557440u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFA */, /*6441*/{1707081728u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFB */, /*6442*/{1707606016u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFC */, /*6443*/{1708130304u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFD */, /*6444*/{1708654592u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFE */, /*6445*/{1709178880u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FCFF */, /*6446*/{1709703168u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD00 */, /*6447*/{1710227456u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD01 */, /*6448*/{1710751744u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD02 */, /*6449*/{1711276032u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD03 */, /*6450*/{1711800320u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD04 */, /*6451*/{1712324608u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD05 */, /*6452*/{1712848896u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD06 */, /*6453*/{1713373184u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD07 */, /*6454*/{1713897472u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD08 */, /*6455*/{1714421760u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD09 */, /*6456*/{1714946048u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0A */, /*6457*/{1715470336u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0B */, /*6458*/{1715994624u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0C */, /*6459*/{1716518912u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0D */, /*6460*/{1717043200u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0E */, /*6461*/{1717567488u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD0F */, /*6462*/{1718091776u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD10 */, /*6463*/{1718616064u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD11 */, /*6464*/{1719140352u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD12 */, /*6465*/{1719664640u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD13 */, /*6466*/{1720188928u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD14 */, /*6467*/{1720713216u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD15 */, /*6468*/{1721237504u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD16 */, /*6469*/{1721761792u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD17 */, /*6470*/{1722286080u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD18 */, /*6471*/{1722810368u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD19 */, /*6472*/{1723334656u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1A */, /*6473*/{1723858944u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1B */, /*6474*/{1724383232u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1C */, /*6475*/{1724907520u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1D */, /*6476*/{1725431808u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1E */, /*6477*/{1725956096u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD1F */, /*6478*/{1726480384u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD20 */, /*6479*/{1727004672u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD21 */, /*6480*/{1727528960u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD22 */, /*6481*/{1728053248u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD23 */, /*6482*/{1728577536u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD24 */, /*6483*/{1729101824u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD25 */, /*6484*/{1729626112u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD26 */, /*6485*/{1730150400u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD27 */, /*6486*/{1730674688u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD28 */, /*6487*/{1731198976u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD29 */, /*6488*/{1731723264u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD2A */, /*6489*/{1732247552u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD2B */, /*6490*/{1732771840u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD2C */, /*6491*/{1733296128u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD2D */, /*6492*/{1733820416u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD2E */, /*6493*/{1734344704u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD2F */, /*6494*/{1734868992u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD30 */, /*6495*/{1735393280u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD31 */, /*6496*/{1735917568u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD32 */, /*6497*/{1736441856u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD33 */, /*6498*/{1736966144u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD34 */, /*6499*/{1737490432u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD35 */, /*6500*/{1738014720u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD36 */, /*6501*/{1738539008u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD37 */, /*6502*/{1739063296u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD38 */, /*6503*/{1739587584u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD39 */, /*6504*/{1740111872u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD3A */, /*6505*/{1740636160u,622592u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FD3B */, /*6506*/{1741160448u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD3C */, /*6507*/{1741684736u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FD3D */, /*6508*/{0,622592u,65537u,69862720u,13632176u,131072u,3222798336u}/* FD3E */, /*6509*/{0,622592u,65537u,69862656u,13632176u,131072u,3222798336u}/* FD3F */, /*6510*/{1742209024u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD50 */, /*6511*/{1742733312u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD51 */, /*6512*/{1743257600u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD52 */, /*6513*/{1743781888u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD53 */, /*6514*/{1744306176u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD54 */, /*6515*/{1744830464u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD55 */, /*6516*/{1745354752u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD56 */, /*6517*/{1745879040u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD57 */, /*6518*/{1746403328u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD58 */, /*6519*/{1746927616u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD59 */, /*6520*/{1747451904u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD5A */, /*6521*/{1747976192u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD5B */, /*6522*/{1748500480u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD5C */, /*6523*/{1749024768u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD5D */, /*6524*/{1749549056u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD5E */, /*6525*/{1750073344u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD5F */, /*6526*/{1750597632u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD60 */, /*6527*/{1751121920u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD61 */, /*6528*/{1751646208u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD62 */, /*6529*/{1752170496u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD63 */, /*6530*/{1752694784u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD64 */, /*6531*/{1753219072u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD65 */, /*6532*/{1753743360u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD66 */, /*6533*/{1754267648u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD67 */, /*6534*/{1754791936u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD68 */, /*6535*/{1755316224u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD69 */, /*6536*/{1755840512u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD6A */, /*6537*/{1756364800u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD6B */, /*6538*/{1756889088u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD6C */, /*6539*/{1757413376u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD6D */, /*6540*/{1757937664u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD6E */, /*6541*/{1758461952u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD6F */, /*6542*/{1758986240u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD70 */, /*6543*/{1759510528u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD71 */, /*6544*/{1760034816u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD72 */, /*6545*/{1760559104u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD73 */, /*6546*/{1761083392u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD74 */, /*6547*/{1761607680u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD75 */, /*6548*/{1762131968u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD76 */, /*6549*/{1762656256u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD77 */, /*6550*/{1763180544u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD78 */, /*6551*/{1763704832u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD79 */, /*6552*/{1764229120u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD7A */, /*6553*/{1764753408u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD7B */, /*6554*/{1765277696u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD7C */, /*6555*/{1765801984u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD7D */, /*6556*/{1766326272u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD7E */, /*6557*/{1766850560u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD7F */, /*6558*/{1767374848u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD80 */, /*6559*/{1767899136u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD81 */, /*6560*/{1768423424u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD82 */, /*6561*/{1768947712u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD83 */, /*6562*/{1769472000u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD84 */, /*6563*/{1769996288u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD85 */, /*6564*/{1770520576u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD86 */, /*6565*/{1771044864u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD87 */, /*6566*/{1771569152u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD88 */, /*6567*/{1772093440u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD89 */, /*6568*/{1772617728u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD8A */, /*6569*/{1773142016u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD8B */, /*6570*/{1773666304u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD8C */, /*6571*/{1774190592u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD8D */, /*6572*/{1774714880u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD8E */, /*6573*/{1775239168u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD8F */, /*6574*/{1775763456u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD92 */, /*6575*/{1776287744u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD93 */, /*6576*/{1776812032u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD94 */, /*6577*/{1777336320u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD95 */, /*6578*/{1777860608u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD96 */, /*6579*/{1778384896u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD97 */, /*6580*/{1778909184u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD98 */, /*6581*/{1779433472u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD99 */, /*6582*/{1779957760u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD9A */, /*6583*/{1780482048u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD9B */, /*6584*/{1781006336u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD9C */, /*6585*/{1781530624u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FD9D */, /*6586*/{1782054912u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD9E */, /*6587*/{1782579200u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FD9F */, /*6588*/{1783103488u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA0 */, /*6589*/{1783627776u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA1 */, /*6590*/{1784152064u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA2 */, /*6591*/{1784676352u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA3 */, /*6592*/{1785200640u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA4 */, /*6593*/{1785724928u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA5 */, /*6594*/{1786249216u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA6 */, /*6595*/{1786773504u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA7 */, /*6596*/{1787297792u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA8 */, /*6597*/{1787822080u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDA9 */, /*6598*/{1788346368u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAA */, /*6599*/{1788870656u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAB */, /*6600*/{1789394944u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAC */, /*6601*/{1789919232u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAD */, /*6602*/{1790443520u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAE */, /*6603*/{1790967808u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDAF */, /*6604*/{1791492096u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB0 */, /*6605*/{1792016384u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB1 */, /*6606*/{1792540672u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB2 */, /*6607*/{1793064960u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB3 */, /*6608*/{1793589248u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDB4 */, /*6609*/{1794113536u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDB5 */, /*6610*/{1794637824u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB6 */, /*6611*/{1795162112u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB7 */, /*6612*/{1795686400u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDB8 */, /*6613*/{1796210688u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDB9 */, /*6614*/{1796734976u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDBA */, /*6615*/{1797259264u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDBB */, /*6616*/{1797783552u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDBC */, /*6617*/{1798307840u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDBD */, /*6618*/{1798832128u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDBE */, /*6619*/{1799356416u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDBF */, /*6620*/{1799880704u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDC0 */, /*6621*/{1800404992u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDC1 */, /*6622*/{1800929280u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDC2 */, /*6623*/{1801453568u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDC3 */, /*6624*/{1801977856u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDC4 */, /*6625*/{1802502144u,622592u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FDC5 */, /*6626*/{1803026432u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDC6 */, /*6627*/{1803550720u,622592u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FDC7 */, /*6628*/{1804075008u,622592u,458753u,78469456u,9437424u,67241536u,2684354752u}/* FDF0 */, /*6629*/{1804599296u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF1 */, /*6630*/{1805123584u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF2 */, /*6631*/{1805647872u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF3 */, /*6632*/{1806172160u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF4 */, /*6633*/{1806696448u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF5 */, /*6634*/{1807220736u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF6 */, /*6635*/{1807745024u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF7 */, /*6636*/{1808269312u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF8 */, /*6637*/{1808793600u,622592u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FDF9 */, /*6638*/{1809317888u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FDFA */, /*6639*/{1809842176u,622592u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FDFB */, /*6640*/{1810366464u,622592u,458753u,80545360u,176u,67239936u,2147516416u}/* FDFC */, /*6641*/{0,622592u,458753u,82446016u,688u,131072u,3221258240u}/* FDFD */, /*6642*/{0,626688u,2686976u,80492928u,808714928u,2218853380u,3221226112u}/* FE00 */, /*6643*/{1810890752u,630784u,65537u,84569560u,14680240u,67239936u,2148532224u}/* FE10 */, /*6644*/{1811415040u,630784u,65537u,84542936u,14680240u,67239936u,2148532224u}/* FE11 */, /*6645*/{1811939328u,630784u,65537u,84542936u,176u,67239936u,2148532224u}/* FE12 */, /*6646*/{1812463616u,630784u,65537u,84567512u,14680240u,2214723584u,2148532224u}/* FE13 */, /*6647*/{1812987904u,630784u,65537u,84569560u,176u,67239936u,2148532224u}/* FE14 */, /*6648*/{1813512192u,630784u,65537u,84542936u,176u,67239936u,2148532224u}/* FE15 */, /*6649*/{1814036480u,630784u,65537u,84542936u,176u,67239936u,2148532224u}/* FE16 */, /*6650*/{1814560768u,630784u,65537u,84542744u,13631664u,67239936u,2148532224u}/* FE17 */, /*6651*/{1815085056u,630784u,65537u,84542808u,13631664u,67239936u,2148532224u}/* FE18 */, /*6652*/{1815609344u,630784u,65537u,84542936u,176u,67239936u,2148532224u}/* FE19 */, /*6653*/{0,634880u,2686976u,3425450368u,808714928u,2148598788u,3221225600u}/* FE20 */, /*6654*/{0,634880u,2686976u,3444324736u,808714928u,2148598788u,3221225600u}/* FE24 */, /*6655*/{0,634880u,2686976u,3121363328u,808714928u,2148598788u,3221225600u}/* FE27 */, /*6656*/{0,634880u,262144u,3459004800u,808714928u,2148598788u,3221225600u}/* FE2E */, /*6657*/{1816133632u,638976u,65537u,69862872u,176u,67239936u,2148532224u}/* FE30 */, /*6658*/{1816657920u,638976u,65537u,69862616u,14680240u,75628544u,2148532224u}/* FE31 */, /*6659*/{1817182208u,638976u,65537u,69862616u,14680240u,75628544u,2148532224u}/* FE32 */, /*6660*/{1817706496u,638976u,65537u,69895576u,176u,67240960u,2148532352u}/* FE33 */, /*6661*/{1818230784u,638976u,65537u,69895576u,176u,67240960u,2148532352u}/* FE34 */, /*6662*/{1818755072u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE35 */, /*6663*/{1819279360u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE36 */, /*6664*/{1819803648u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE37 */, /*6665*/{1820327936u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE38 */, /*6666*/{1820852224u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE39 */, /*6667*/{1821376512u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE3A */, /*6668*/{1821900800u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE3B */, /*6669*/{1822425088u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE3C */, /*6670*/{1822949376u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE3D */, /*6671*/{1823473664u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE3E */, /*6672*/{1823997952u,638976u,65537u,69862680u,13631664u,67239936u,2148532224u}/* FE3F */, /*6673*/{1824522240u,638976u,65537u,69862744u,13631664u,67239936u,2148532224u}/* FE40 */, /*6674*/{1825046528u,638976u,65537u,69862680u,13631664u,67239936u,2148663296u}/* FE41 */, /*6675*/{1825570816u,638976u,65537u,69862744u,13631664u,67239936u,2148663296u}/* FE42 */, /*6676*/{1826095104u,638976u,65537u,69862680u,13631664u,67239936u,2148663296u}/* FE43 */, /*6677*/{1826619392u,638976u,65537u,69862744u,13631664u,67239936u,2148663296u}/* FE44 */, /*6678*/{0,638976u,65537u,80348608u,688u,131072u,3222798336u}/* FE45 */, /*6679*/{1827143680u,638976u,65537u,82445592u,13631664u,67239936u,2148532224u}/* FE47 */, /*6680*/{1827667968u,638976u,65537u,82445656u,13631664u,67239936u,2148532224u}/* FE48 */, /*6681*/{1828192256u,638976u,65537u,69862852u,176u,67239936u,2148532224u}/* FE49 */, /*6682*/{1828716544u,638976u,65537u,69862852u,176u,67239936u,2148532224u}/* FE4A */, /*6683*/{1829240832u,638976u,65537u,69862852u,176u,67239936u,2148532224u}/* FE4B */, /*6684*/{1829765120u,638976u,65537u,69862852u,176u,67239936u,2148532224u}/* FE4C */, /*6685*/{1830289408u,638976u,65537u,69895556u,176u,67240960u,2148532352u}/* FE4D */, /*6686*/{1830813696u,638976u,65537u,69895556u,176u,67240960u,2148532352u}/* FE4E */, /*6687*/{1831337984u,638976u,65537u,69895556u,176u,67240960u,2148532352u}/* FE4F */, /*6688*/{1831862272u,643072u,65537u,69627358u,14680240u,67239936u,2148536320u}/* FE50 */, /*6689*/{1832386560u,643072u,65537u,69862878u,14680240u,67239936u,2148536320u}/* FE51 */, /*6690*/{1832910848u,643072u,65537u,69629406u,11534512u,2214723584u,2148552704u}/* FE52 */, /*6691*/{1833435136u,643072u,65537u,69889502u,176u,67239936u,2148536320u}/* FE54 */, /*6692*/{1833959424u,643072u,65537u,69625310u,14680240u,2214723584u,2148536320u}/* FE55 */, /*6693*/{1834483712u,643072u,65537u,69862878u,12583088u,67239936u,2148552704u}/* FE56 */, /*6694*/{1835008000u,643072u,65537u,69862878u,12583088u,67239936u,2148552704u}/* FE57 */, /*6695*/{1835532288u,643072u,65537u,69862622u,14680240u,75628544u,2148532224u}/* FE58 */, /*6696*/{1836056576u,645832u,65537u,69862686u,13631668u,67239936u,2148532224u}/* FE59 */, /*6697*/{1836580864u,645840u,65537u,69862750u,13631668u,67239936u,2148532224u}/* FE5A */, /*6698*/{1837105152u,645848u,65537u,69862686u,13631668u,67239936u,2148532224u}/* FE5B */, /*6699*/{1837629440u,645856u,65537u,69862750u,13631668u,67239936u,2148532224u}/* FE5C */, /*6700*/{1838153728u,645864u,65537u,69862686u,13631668u,67239936u,2148532224u}/* FE5D */, /*6701*/{1838678016u,645872u,65537u,69862750u,13631668u,67239936u,2148532224u}/* FE5E */, /*6702*/{1839202304u,643072u,65537u,69469662u,176u,67239936u,2148532224u}/* FE5F */, /*6703*/{1839726592u,643072u,65537u,69862878u,176u,67239936u,2148532224u}/* FE60 */, /*6704*/{1840250880u,643072u,65537u,69862878u,176u,67239938u,2152726528u}/* FE61 */, /*6705*/{1840775168u,643072u,65537u,69404190u,176u,67239938u,2147516416u}/* FE62 */, /*6706*/{1841299456u,643072u,65537u,69403870u,14680240u,75636738u,2152726528u}/* FE63 */, /*6707*/{1841823744u,645880u,65537u,69862942u,180u,67239938u,2147516416u}/* FE64 */, /*6708*/{1842348032u,645888u,65537u,69862942u,180u,67239938u,2147516416u}/* FE65 */, /*6709*/{1842872320u,643072u,65537u,69862942u,176u,67239938u,2147516416u}/* FE66 */, /*6710*/{1843396608u,643072u,65537u,69862878u,176u,67239938u,2152726528u}/* FE68 */, /*6711*/{1843920896u,643072u,65537u,69469790u,176u,67239936u,2147516416u}/* FE69 */, /*6712*/{1844445184u,643072u,65537u,69469662u,176u,67239936u,2148532224u}/* FE6A */, /*6713*/{1844969472u,643072u,65537u,69862878u,176u,67239936u,2148532224u}/* FE6B */, /*6714*/{1845493760u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE70 */, /*6715*/{1846018048u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE71 */, /*6716*/{1846542336u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE72 */, /*6717*/{0,647168u,458753u,80566592u,9437936u,132672u,3221225664u}/* FE73 */, /*6718*/{1847066624u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE74 */, /*6719*/{1847590912u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE76 */, /*6720*/{1848115200u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE77 */, /*6721*/{1848639488u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE78 */, /*6722*/{1849163776u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE79 */, /*6723*/{1849688064u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE7A */, /*6724*/{1850212352u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE7B */, /*6725*/{1850736640u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE7C */, /*6726*/{1851260928u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE7D */, /*6727*/{1851785216u,647168u,458753u,70080848u,9437424u,67241536u,2147483648u}/* FE7E */, /*6728*/{1852309504u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE7F */, /*6729*/{1852833792u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE80 */, /*6730*/{1853358080u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE81 */, /*6731*/{1853882368u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE82 */, /*6732*/{1854406656u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE83 */, /*6733*/{1854930944u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE84 */, /*6734*/{1855455232u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE85 */, /*6735*/{1855979520u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE86 */, /*6736*/{1856503808u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE87 */, /*6737*/{1857028096u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE88 */, /*6738*/{1857552384u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE89 */, /*6739*/{1858076672u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE8A */, /*6740*/{1858600960u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FE8B */, /*6741*/{1859125248u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE8C */, /*6742*/{1859649536u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE8D */, /*6743*/{1860173824u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE8E */, /*6744*/{1860698112u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE8F */, /*6745*/{1861222400u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE90 */, /*6746*/{1861746688u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FE91 */, /*6747*/{1862270976u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE92 */, /*6748*/{1862795264u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE93 */, /*6749*/{1863319552u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE94 */, /*6750*/{1863843840u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE95 */, /*6751*/{1864368128u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE96 */, /*6752*/{1864892416u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FE97 */, /*6753*/{1865416704u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE98 */, /*6754*/{1865940992u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE99 */, /*6755*/{1866465280u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE9A */, /*6756*/{1866989568u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FE9B */, /*6757*/{1867513856u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FE9C */, /*6758*/{1868038144u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FE9D */, /*6759*/{1868562432u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FE9E */, /*6760*/{1869086720u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FE9F */, /*6761*/{1869611008u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEA0 */, /*6762*/{1870135296u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEA1 */, /*6763*/{1870659584u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEA2 */, /*6764*/{1871183872u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEA3 */, /*6765*/{1871708160u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEA4 */, /*6766*/{1872232448u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEA5 */, /*6767*/{1872756736u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEA6 */, /*6768*/{1873281024u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEA7 */, /*6769*/{1873805312u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEA8 */, /*6770*/{1874329600u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEA9 */, /*6771*/{1874853888u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEAA */, /*6772*/{1875378176u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEAB */, /*6773*/{1875902464u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEAC */, /*6774*/{1876426752u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEAD */, /*6775*/{1876951040u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEAE */, /*6776*/{1877475328u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEAF */, /*6777*/{1877999616u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEB0 */, /*6778*/{1878523904u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEB1 */, /*6779*/{1879048192u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEB2 */, /*6780*/{1879572480u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEB3 */, /*6781*/{1880096768u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEB4 */, /*6782*/{1880621056u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEB5 */, /*6783*/{1881145344u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEB6 */, /*6784*/{1881669632u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEB7 */, /*6785*/{1882193920u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEB8 */, /*6786*/{1882718208u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEB9 */, /*6787*/{1883242496u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEBA */, /*6788*/{1883766784u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEBB */, /*6789*/{1884291072u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEBC */, /*6790*/{1884815360u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEBD */, /*6791*/{1885339648u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEBE */, /*6792*/{1885863936u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEBF */, /*6793*/{1886388224u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEC0 */, /*6794*/{1886912512u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEC1 */, /*6795*/{1887436800u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEC2 */, /*6796*/{1887961088u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEC3 */, /*6797*/{1888485376u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEC4 */, /*6798*/{1889009664u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEC5 */, /*6799*/{1889533952u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEC6 */, /*6800*/{1890058240u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEC7 */, /*6801*/{1890582528u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEC8 */, /*6802*/{1891106816u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEC9 */, /*6803*/{1891631104u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FECA */, /*6804*/{1892155392u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FECB */, /*6805*/{1892679680u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FECC */, /*6806*/{1893203968u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FECD */, /*6807*/{1893728256u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FECE */, /*6808*/{1894252544u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FECF */, /*6809*/{1894776832u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FED0 */, /*6810*/{1895301120u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FED1 */, /*6811*/{1895825408u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FED2 */, /*6812*/{1896349696u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FED3 */, /*6813*/{1896873984u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FED4 */, /*6814*/{1897398272u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FED5 */, /*6815*/{1897922560u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FED6 */, /*6816*/{1898446848u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FED7 */, /*6817*/{1898971136u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FED8 */, /*6818*/{1899495424u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FED9 */, /*6819*/{1900019712u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEDA */, /*6820*/{1900544000u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEDB */, /*6821*/{1901068288u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEDC */, /*6822*/{1901592576u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEDD */, /*6823*/{1902116864u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEDE */, /*6824*/{1902641152u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEDF */, /*6825*/{1903165440u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEE0 */, /*6826*/{1903689728u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEE1 */, /*6827*/{1904214016u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEE2 */, /*6828*/{1904738304u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEE3 */, /*6829*/{1905262592u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEE4 */, /*6830*/{1905786880u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEE5 */, /*6831*/{1906311168u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEE6 */, /*6832*/{1906835456u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEE7 */, /*6833*/{1907359744u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEE8 */, /*6834*/{1907884032u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEE9 */, /*6835*/{1908408320u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEEA */, /*6836*/{1908932608u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEEB */, /*6837*/{1909456896u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEEC */, /*6838*/{1909981184u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEED */, /*6839*/{1910505472u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEEE */, /*6840*/{1911029760u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEEF */, /*6841*/{1911554048u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEF0 */, /*6842*/{1912078336u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEF1 */, /*6843*/{1912602624u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEF2 */, /*6844*/{1913126912u,647168u,458753u,70080842u,9437424u,67241536u,2147483840u}/* FEF3 */, /*6845*/{1913651200u,647168u,458753u,70080844u,9437424u,67241536u,2147483840u}/* FEF4 */, /*6846*/{1914175488u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEF5 */, /*6847*/{1914699776u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEF6 */, /*6848*/{1915224064u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEF7 */, /*6849*/{1915748352u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEF8 */, /*6850*/{1916272640u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEF9 */, /*6851*/{1916796928u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEFA */, /*6852*/{1917321216u,647168u,458753u,70080848u,9437424u,67241536u,2147483840u}/* FEFB */, /*6853*/{1917845504u,647168u,458753u,70080846u,9437424u,67241536u,2147483840u}/* FEFC */, /*6854*/{0,647168u,65537u,69946368u,2689794738u,2218786816u,3221225472u}/* FEFF */, /*6855*/{1918369792u,651264u,65537u,69862874u,12583088u,67239936u,2148552704u}/* FF01 */, /*6856*/{1918894080u,651264u,65537u,69862874u,176u,67239936u,2148663296u}/* FF02 */, /*6857*/{1919418368u,651264u,65537u,69469658u,176u,67239936u,2148532224u}/* FF03 */, /*6858*/{1919942656u,651264u,65537u,69469786u,176u,67239936u,2147516416u}/* FF04 */, /*6859*/{1920466944u,651264u,65537u,69469658u,176u,67239936u,2148532224u}/* FF05 */, /*6860*/{1920991232u,651264u,65537u,69862874u,176u,67239936u,2148532224u}/* FF06 */, /*6861*/{1921515520u,651264u,65537u,69891546u,176u,2214723584u,2148663296u}/* FF07 */, /*6862*/{1922039808u,654088u,65537u,69862682u,13631668u,67239936u,2148532224u}/* FF08 */, /*6863*/{1922564096u,654096u,65537u,69862746u,13631668u,67239936u,2148532224u}/* FF09 */, /*6864*/{1923088384u,651264u,65537u,69862874u,176u,67239936u,2148532224u}/* FF0A */, /*6865*/{1923612672u,651264u,65537u,69404186u,176u,67239938u,2147516416u}/* FF0B */, /*6866*/{1924136960u,651264u,65537u,69627354u,14680240u,67239936u,2148536320u}/* FF0C */, /*6867*/{1924661248u,651264u,65537u,69403866u,14680240u,75636736u,2148532224u}/* FF0D */, /*6868*/{1925185536u,651264u,65537u,69629402u,11534512u,2214723584u,2148552704u}/* FF0E */, /*6869*/{1925709824u,651264u,65537u,69600730u,176u,67239936u,2148532224u}/* FF0F */, /*6870*/{1926234112u,651264u,33620993u,69337690u,33560752u,67257345u,2147483776u}/* FF10 */, /*6871*/{1926758400u,651264u,453051905u,69337690u,33560752u,67257345u,2147483776u}/* FF11 */, /*6872*/{1927282688u,651264u,486607361u,69337690u,33560752u,67257345u,2147483776u}/* FF12 */, /*6873*/{1927806976u,651264u,520161281u,69337690u,33560752u,67257345u,2147483776u}/* FF13 */, /*6874*/{1928331264u,651264u,553717761u,69337690u,33560752u,67257345u,2147483776u}/* FF14 */, /*6875*/{1928855552u,651264u,587271169u,69337690u,33560752u,67257345u,2147483776u}/* FF15 */, /*6876*/{1929379840u,651264u,620828161u,69337690u,33560752u,67257345u,2147483776u}/* FF16 */, /*6877*/{1929904128u,651264u,654380545u,69337690u,33560752u,67257345u,2147483776u}/* FF17 */, /*6878*/{1930428416u,651264u,687938561u,69337690u,33560752u,67257345u,2147483776u}/* FF18 */, /*6879*/{1930952704u,651264u,721490945u,69337690u,33560752u,67257345u,2147483776u}/* FF19 */, /*6880*/{1931476992u,651264u,65537u,69625306u,14680240u,2214723584u,2148536320u}/* FF1A */, /*6881*/{1932001280u,651264u,65537u,69889498u,176u,67239936u,2148536320u}/* FF1B */, /*6882*/{1932525568u,654104u,65537u,69862938u,180u,67239938u,2147516416u}/* FF1C */, /*6883*/{1933049856u,651264u,65537u,69862938u,176u,67239938u,2147516416u}/* FF1D */, /*6884*/{1933574144u,654112u,65537u,69862938u,180u,67239938u,2147516416u}/* FF1E */, /*6885*/{1934098432u,651264u,65537u,69862874u,12583088u,67239936u,2148552704u}/* FF1F */, /*6886*/{1934622720u,651264u,65537u,69862874u,176u,67239936u,2148532224u}/* FF20 */, /*6887*/{1935425152u,2242506752u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF21 */, /*6888*/{1935949568u,2244603904u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF22 */, /*6889*/{1936473984u,2246701056u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF23 */, /*6890*/{1936998400u,2248798208u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF24 */, /*6891*/{1937522816u,2250895360u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF25 */, /*6892*/{1938047232u,2252992512u,131073u,69228634u,8388849u,2080523872u,2147484864u}/* FF26 */, /*6893*/{1938571648u,2255089664u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF27 */, /*6894*/{1939096064u,2257186816u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF28 */, /*6895*/{1939620480u,2259283968u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF29 */, /*6896*/{1940144896u,2261381120u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2A */, /*6897*/{1940669312u,2263478272u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2B */, /*6898*/{1941193728u,2265575424u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2C */, /*6899*/{1941718144u,2267672576u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2D */, /*6900*/{1942242560u,2269769728u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2E */, /*6901*/{1942766976u,2271866880u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF2F */, /*6902*/{1943291392u,2273964032u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF30 */, /*6903*/{1943815808u,2276061184u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF31 */, /*6904*/{1944340224u,2278158336u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF32 */, /*6905*/{1944864640u,2280255488u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF33 */, /*6906*/{1945389056u,2282352640u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF34 */, /*6907*/{1945913472u,2284449792u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF35 */, /*6908*/{1946437888u,2286546944u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF36 */, /*6909*/{1946962304u,2288644096u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF37 */, /*6910*/{1947486720u,2290741248u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF38 */, /*6911*/{1948011136u,2292838400u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF39 */, /*6912*/{1948535552u,2294935552u,131073u,69228634u,8388849u,2080507488u,2147484864u}/* FF3A */, /*6913*/{1948778496u,654120u,65537u,69862682u,13631668u,67239936u,2148532224u}/* FF3B */, /*6914*/{1949302784u,651264u,65537u,69862874u,176u,67239938u,2152726528u}/* FF3C */, /*6915*/{1949827072u,654128u,65537u,69862746u,13631668u,67239936u,2148532224u}/* FF3D */, /*6916*/{1950351360u,651264u,65537u,69863066u,176u,2215772162u,2151710720u}/* FF3E */, /*6917*/{1950875648u,651264u,65537u,69895578u,176u,67240960u,2148532352u}/* FF3F */, /*6918*/{1951399936u,651264u,65537u,69863066u,176u,2215772160u,2147516416u}/* FF40 */, /*6919*/{1952205696u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF41 */, /*6920*/{1952730112u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF42 */, /*6921*/{1953254528u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF43 */, /*6922*/{1953778944u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF44 */, /*6923*/{1954303360u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF45 */, /*6924*/{1954827776u,651264u,131073u,69228698u,7340272u,1459766888u,2147483840u}/* FF46 */, /*6925*/{1955352192u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF47 */, /*6926*/{1955876608u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF48 */, /*6927*/{1956401024u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF49 */, /*6928*/{1956925440u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4A */, /*6929*/{1957449856u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4B */, /*6930*/{1957974272u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4C */, /*6931*/{1958498688u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4D */, /*6932*/{1959023104u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4E */, /*6933*/{1959547520u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF4F */, /*6934*/{1960071936u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF50 */, /*6935*/{1960596352u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF51 */, /*6936*/{1961120768u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF52 */, /*6937*/{1961645184u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF53 */, /*6938*/{1962169600u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF54 */, /*6939*/{1962694016u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF55 */, /*6940*/{1963218432u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF56 */, /*6941*/{1963742848u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF57 */, /*6942*/{1964267264u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF58 */, /*6943*/{1964791680u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF59 */, /*6944*/{1965316096u,651264u,131073u,69228698u,7340272u,1459750504u,2147483840u}/* FF5A */, /*6945*/{1965555712u,654136u,65537u,69862682u,13631668u,67239936u,2148532224u}/* FF5B */, /*6946*/{1966080000u,651264u,65537u,69862938u,176u,67239938u,2147516416u}/* FF5C */, /*6947*/{1966604288u,654144u,65537u,69862746u,13631668u,67239936u,2148532224u}/* FF5D */, /*6948*/{1967128576u,651264u,65537u,69862938u,176u,67239938u,2147516416u}/* FF5E */, /*6949*/{1967652864u,654152u,65537u,80348442u,13631668u,67239936u,2148532224u}/* FF5F */, /*6950*/{1968177152u,654160u,65537u,80348506u,13631668u,67239936u,2148532224u}/* FF60 */, /*6951*/{1968701440u,651264u,65537u,69862876u,12583088u,67239936u,2148552704u}/* FF61 */, /*6952*/{1969225728u,654168u,65537u,69862684u,13631668u,67239936u,2148663296u}/* FF62 */, /*6953*/{1969750016u,654176u,65537u,69862748u,13631668u,67239936u,2148663296u}/* FF63 */, /*6954*/{1970274304u,651264u,65537u,69862876u,14680240u,67239936u,2148536320u}/* FF64 */, /*6955*/{1970798592u,651264u,65537u,69862876u,176u,67248128u,2148532224u}/* FF65 */, /*6956*/{1971322880u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF66 */, /*6957*/{1971847168u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF67 */, /*6958*/{1972371456u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF68 */, /*6959*/{1972895744u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF69 */, /*6960*/{1973420032u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6A */, /*6961*/{1973944320u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6B */, /*6962*/{1974468608u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6C */, /*6963*/{1974992896u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6D */, /*6964*/{1975517184u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6E */, /*6965*/{1976041472u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF6F */, /*6966*/{1976565760u,651264u,65537u,69226780u,9437424u,2216298048u,2147483840u}/* FF70 */, /*6967*/{1977090048u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF71 */, /*6968*/{1977614336u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF72 */, /*6969*/{1978138624u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF73 */, /*6970*/{1978662912u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF74 */, /*6971*/{1979187200u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF75 */, /*6972*/{1979711488u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF76 */, /*6973*/{1980235776u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF77 */, /*6974*/{1980760064u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF78 */, /*6975*/{1981284352u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF79 */, /*6976*/{1981808640u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7A */, /*6977*/{1982332928u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7B */, /*6978*/{1982857216u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7C */, /*6979*/{1983381504u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7D */, /*6980*/{1983905792u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7E */, /*6981*/{1984430080u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF7F */, /*6982*/{1984954368u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF80 */, /*6983*/{1985478656u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF81 */, /*6984*/{1986002944u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF82 */, /*6985*/{1986527232u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF83 */, /*6986*/{1987051520u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF84 */, /*6987*/{1987575808u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF85 */, /*6988*/{1988100096u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF86 */, /*6989*/{1988624384u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF87 */, /*6990*/{1989148672u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF88 */, /*6991*/{1989672960u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF89 */, /*6992*/{1990197248u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8A */, /*6993*/{1990721536u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8B */, /*6994*/{1991245824u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8C */, /*6995*/{1991770112u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8D */, /*6996*/{1992294400u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8E */, /*6997*/{1992818688u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF8F */, /*6998*/{1993342976u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF90 */, /*6999*/{1993867264u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF91 */, /*7000*/{1994391552u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF92 */, /*7001*/{1994915840u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF93 */, /*7002*/{1995440128u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF94 */, /*7003*/{1995964416u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF95 */, /*7004*/{1996488704u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF96 */, /*7005*/{1997012992u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF97 */, /*7006*/{1997537280u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF98 */, /*7007*/{1998061568u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF99 */, /*7008*/{1998585856u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF9A */, /*7009*/{1999110144u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF9B */, /*7010*/{1999634432u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF9C */, /*7011*/{2000158720u,651264u,2228225u,69226844u,9437424u,67241536u,2147483840u}/* FF9D */, /*7012*/{2000683008u,651264u,65536u,69220636u,3408112u,2215708224u,2214592640u}/* FF9E */, /*7013*/{2001207296u,651264u,65536u,69220636u,3408112u,2215708224u,2214592640u}/* FF9F */, /*7014*/{2001731584u,651264u,1638401u,69228892u,9437424u,71435840u,2281701568u}/* FFA0 */, /*7015*/{2002255872u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA1 */, /*7016*/{2002780160u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA2 */, /*7017*/{2003304448u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA3 */, /*7018*/{2003828736u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA4 */, /*7019*/{2004353024u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA5 */, /*7020*/{2004877312u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA6 */, /*7021*/{2005401600u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA7 */, /*7022*/{2005925888u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA8 */, /*7023*/{2006450176u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFA9 */, /*7024*/{2006974464u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAA */, /*7025*/{2007498752u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAB */, /*7026*/{2008023040u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAC */, /*7027*/{2008547328u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAD */, /*7028*/{2009071616u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAE */, /*7029*/{2009595904u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFAF */, /*7030*/{2010120192u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB0 */, /*7031*/{2010644480u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB1 */, /*7032*/{2011168768u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB2 */, /*7033*/{2011693056u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB3 */, /*7034*/{2012217344u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB4 */, /*7035*/{2012741632u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB5 */, /*7036*/{2013265920u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB6 */, /*7037*/{2013790208u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB7 */, /*7038*/{2014314496u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB8 */, /*7039*/{2014838784u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFB9 */, /*7040*/{2015363072u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFBA */, /*7041*/{2015887360u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFBB */, /*7042*/{2016411648u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFBC */, /*7043*/{2016935936u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFBD */, /*7044*/{2017460224u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFBE */, /*7045*/{2017984512u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC2 */, /*7046*/{2018508800u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC3 */, /*7047*/{2019033088u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC4 */, /*7048*/{2019557376u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC5 */, /*7049*/{2020081664u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC6 */, /*7050*/{2020605952u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFC7 */, /*7051*/{2021130240u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCA */, /*7052*/{2021654528u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCB */, /*7053*/{2022178816u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCC */, /*7054*/{2022703104u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCD */, /*7055*/{2023227392u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCE */, /*7056*/{2023751680u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFCF */, /*7057*/{2024275968u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD2 */, /*7058*/{2024800256u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD3 */, /*7059*/{2025324544u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD4 */, /*7060*/{2025848832u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD5 */, /*7061*/{2026373120u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD6 */, /*7062*/{2026897408u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFD7 */, /*7063*/{2027421696u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFDA */, /*7064*/{2027945984u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFDB */, /*7065*/{2028470272u,651264u,1638401u,69228892u,9437424u,67241536u,2147483840u}/* FFDC */, /*7066*/{2028994560u,651264u,65537u,69469786u,176u,67239936u,2147516416u}/* FFE0 */, /*7067*/{2029518848u,651264u,65537u,69469786u,176u,67239936u,2147516416u}/* FFE1 */, /*7068*/{2030043136u,651264u,65537u,69862938u,176u,67239938u,2147516416u}/* FFE2 */, /*7069*/{2030567424u,651264u,65537u,69863066u,176u,2215772160u,2147516416u}/* FFE3 */, /*7070*/{2031091712u,651264u,65537u,69863130u,176u,67239936u,2147516416u}/* FFE4 */, /*7071*/{2031616000u,651264u,65537u,69469786u,176u,67239936u,2147516416u}/* FFE5 */, /*7072*/{2032140288u,651264u,65537u,69469786u,176u,67239936u,2147516416u}/* FFE6 */, /*7073*/{2032664576u,651264u,65537u,69863132u,176u,67239936u,2147516416u}/* FFE8 */, /*7074*/{2033188864u,651264u,65537u,69862940u,176u,67239938u,2147516416u}/* FFE9 */, /*7075*/{2033713152u,651264u,65537u,69862940u,176u,67239938u,2147516416u}/* FFEA */, /*7076*/{2034237440u,651264u,65537u,69862940u,176u,67239938u,2147516416u}/* FFEB */, /*7077*/{2034761728u,651264u,65537u,69862940u,176u,67239938u,2147516416u}/* FFEC */, /*7078*/{2035286016u,651264u,65537u,69863132u,176u,67239936u,2147516416u}/* FFED */, /*7079*/{2035810304u,651264u,65537u,69863132u,176u,67239936u,2147516416u}/* FFEE */, /*7080*/{0,655360u,65537u,76172288u,810746546u,2218786816u,3355443200u}/* FFF9 */, /*7081*/{0,655360u,65537u,76172288u,810746546u,2147483648u,3221225472u}/* FFFA */, /*7082*/{0,655360u,65537u,74057408u,1610613424u,131072u,3221258240u}/* FFFC */, /*7083*/{0,655360u,65537u,69863104u,688u,131072u,3221258240u}/* FFFD */, /*7084*/{0,659456u,3145729u,81811776u,9437936u,132672u,3758096576u}/* 10000 */, /*7085*/{0,659456u,3145729u,81811776u,9437936u,132672u,3221225664u}/* 10001 */, /*7086*/{0,663552u,3145729u,81811776u,9437936u,132672u,3221225664u}/* 10080 */, /*7087*/{0,667648u,65537u,81790400u,688u,131072u,3222274048u}/* 10100 */, /*7088*/{0,667648u,65537u,82445760u,688u,131072u,3222274048u}/* 10101 */, /*7089*/{0,667648u,453051905u,81789632u,33557168u,131073u,3221225472u}/* 10107 */, /*7090*/{0,667648u,486607361u,81789632u,33557168u,131073u,3221225472u}/* 10108 */, /*7091*/{0,667648u,520161281u,81789632u,33557168u,131073u,3221225472u}/* 10109 */, /*7092*/{0,667648u,553717761u,81789632u,33557168u,131073u,3221225472u}/* 1010A */, /*7093*/{0,667648u,587271169u,81789632u,33557168u,131073u,3221225472u}/* 1010B */, /*7094*/{0,667648u,620828161u,81789632u,33557168u,131073u,3221225472u}/* 1010C */, /*7095*/{0,667648u,654380545u,81789632u,33557168u,131073u,3221225472u}/* 1010D */, /*7096*/{0,667648u,687938561u,81789632u,33557168u,131073u,3221225472u}/* 1010E */, /*7097*/{0,667648u,721490945u,81789632u,33557168u,131073u,3221225472u}/* 1010F */, /*7098*/{0,667648u,738271233u,81789632u,33557168u,131073u,3221225472u}/* 10110 */, /*7099*/{0,667648u,906046465u,81789632u,33557168u,131073u,3221225472u}/* 10111 */, /*7100*/{0,667648u,1073823745u,81789632u,33557168u,131073u,3221225472u}/* 10112 */, /*7101*/{0,667648u,1241601025u,81789632u,33557168u,131073u,3221225472u}/* 10113 */, /*7102*/{0,667648u,1409378305u,81789632u,33557168u,131073u,3221225472u}/* 10114 */, /*7103*/{0,667648u,1426156033u,81789632u,33557168u,131073u,3221225472u}/* 10115 */, /*7104*/{0,667648u,1442933761u,81789632u,33557168u,131073u,3221225472u}/* 10116 */, /*7105*/{0,667648u,1459711489u,81789632u,33557168u,131073u,3221225472u}/* 10117 */, /*7106*/{0,667648u,1476489217u,81789632u,33557168u,131073u,3221225472u}/* 10118 */, /*7107*/{0,667648u,1493266945u,81789632u,33557168u,131073u,3221225472u}/* 10119 */, /*7108*/{0,667648u,1510044673u,81789632u,33557168u,131073u,3221225472u}/* 1011A */, /*7109*/{0,667648u,1526822401u,81789632u,33557168u,131073u,3221225472u}/* 1011B */, /*7110*/{0,667648u,1543600129u,81789632u,33557168u,131073u,3221225472u}/* 1011C */, /*7111*/{0,667648u,1560377857u,81789632u,33557168u,131073u,3221225472u}/* 1011D */, /*7112*/{0,667648u,1577155585u,81789632u,33557168u,131073u,3221225472u}/* 1011E */, /*7113*/{0,667648u,1593933313u,81789632u,33557168u,131073u,3221225472u}/* 1011F */, /*7114*/{0,667648u,1610711041u,81789632u,33557168u,131073u,3221225472u}/* 10120 */, /*7115*/{0,667648u,1627488769u,81789632u,33557168u,131073u,3221225472u}/* 10121 */, /*7116*/{0,667648u,1644266497u,81789632u,33557168u,131073u,3221225472u}/* 10122 */, /*7117*/{0,667648u,1661044225u,81789632u,33557168u,131073u,3221225472u}/* 10123 */, /*7118*/{0,667648u,1677821953u,81789632u,33557168u,131073u,3221225472u}/* 10124 */, /*7119*/{0,667648u,1694599681u,81789632u,33557168u,131073u,3221225472u}/* 10125 */, /*7120*/{0,667648u,1711377409u,81789632u,33557168u,131073u,3221225472u}/* 10126 */, /*7121*/{0,667648u,1728155137u,81789632u,33557168u,131073u,3221225472u}/* 10127 */, /*7122*/{0,667648u,1744932865u,81789632u,33557168u,131073u,3221225472u}/* 10128 */, /*7123*/{0,667648u,1761710593u,81789632u,33557168u,131073u,3221225472u}/* 10129 */, /*7124*/{0,667648u,1778488321u,81789632u,33557168u,131073u,3221225472u}/* 1012A */, /*7125*/{0,667648u,1795266049u,81789632u,33557168u,131073u,3221225472u}/* 1012B */, /*7126*/{0,667648u,1812043777u,81789632u,33557168u,131073u,3221225472u}/* 1012C */, /*7127*/{0,667648u,1828821505u,81789632u,33557168u,131073u,3221225472u}/* 1012D */, /*7128*/{0,667648u,1845599233u,81789632u,33557168u,131073u,3221225472u}/* 1012E */, /*7129*/{0,667648u,1862376961u,81789632u,33557168u,131073u,3221225472u}/* 1012F */, /*7130*/{0,667648u,1879154689u,81789632u,33557168u,131073u,3221225472u}/* 10130 */, /*7131*/{0,667648u,1895932417u,81789632u,33557168u,131073u,3221225472u}/* 10131 */, /*7132*/{0,667648u,1912710145u,81789632u,33557168u,131073u,3221225472u}/* 10132 */, /*7133*/{0,667648u,1929487873u,81789632u,33557168u,131073u,3221225472u}/* 10133 */, /*7134*/{0,667648u,65537u,81790656u,688u,131072u,3221258240u}/* 10137 */, /*7135*/{0,671744u,201524737u,84564608u,193989360u,132609u,3221225664u}/* 10140 */, /*7136*/{0,671744u,285410817u,84564608u,26217200u,132609u,3221225664u}/* 10141 */, /*7137*/{0,671744u,453182977u,84564608u,42994416u,132609u,3221225664u}/* 10142 */, /*7138*/{0,671744u,587402241u,84564608u,42994416u,132609u,3221225664u}/* 10143 */, /*7139*/{0,671744u,1409509377u,84564608u,42994416u,132609u,3221225664u}/* 10144 */, /*7140*/{0,671744u,1560508929u,84564608u,42994416u,132609u,3221225664u}/* 10145 */, /*7141*/{0,671744u,1711508481u,84564608u,42994416u,132609u,3221225664u}/* 10146 */, /*7142*/{0,671744u,1862508033u,84564608u,42994416u,132609u,3221225664u}/* 10147 */, /*7143*/{0,671744u,738402305u,84564608u,42994416u,132609u,3221225664u}/* 10149 */, /*7144*/{0,671744u,1493398017u,84564608u,42994416u,132609u,3221225664u}/* 1014B */, /*7145*/{0,671744u,1644397569u,84564608u,42994416u,132609u,3221225664u}/* 1014D */, /*7146*/{0,671744u,1795397121u,84564608u,42994416u,132609u,3221225664u}/* 10155 */, /*7147*/{0,671744u,486738433u,84564608u,42994416u,132609u,3221225664u}/* 1015B */, /*7148*/{0,671744u,1073954817u,84564608u,42994416u,132609u,3221225664u}/* 10165 */, /*7149*/{0,671744u,1526953473u,84564608u,42994416u,132609u,3221225664u}/* 1016B */, /*7150*/{0,671744u,285410817u,84542144u,16779952u,131073u,3221225472u}/* 10175 */, /*7151*/{0,671744u,352520705u,84542144u,201329328u,131073u,3221225472u}/* 10177 */, /*7152*/{0,671744u,369297409u,84542144u,184552112u,131073u,3221225472u}/* 10178 */, /*7153*/{0,671744u,196609u,84543168u,688u,131072u,3221258240u}/* 10179 */, /*7154*/{0,671744u,33752065u,84542144u,33557168u,131073u,3221225472u}/* 1018A */, /*7155*/{0,671744u,201524737u,101319360u,184552112u,131073u,3221225472u}/* 1018B */, /*7156*/{0,671744u,196609u,101320384u,688u,131072u,3221258240u}/* 1018C */, /*7157*/{0,675840u,65537u,88737472u,688u,131072u,3221258240u}/* 10190 */, /*7158*/{0,675840u,196609u,101320384u,688u,131072u,3221258240u}/* 101A0 */, /*7159*/{0,679936u,65537u,88082112u,688u,131072u,3221258240u}/* 101D0 */, /*7160*/{0,679936u,2686976u,3108780416u,808714928u,2147550212u,3221225600u}/* 101FD */, /*7161*/{0,684032u,4849665u,88103232u,9437936u,132672u,3221225664u}/* 10280 */, /*7162*/{0,688128u,4915201u,88103232u,9437936u,132672u,3221225664u}/* 102A0 */, /*7163*/{0,692224u,2686976u,3121363328u,808714928u,2148598788u,3221225600u}/* 102E0 */, /*7164*/{0,692224u,453051905u,100795072u,33557168u,131073u,3221225472u}/* 102E1 */, /*7165*/{0,692224u,486607361u,100795072u,33557168u,131073u,3221225472u}/* 102E2 */, /*7166*/{0,692224u,520161281u,100795072u,33557168u,131073u,3221225472u}/* 102E3 */, /*7167*/{0,692224u,553717761u,100795072u,33557168u,131073u,3221225472u}/* 102E4 */, /*7168*/{0,692224u,587271169u,100795072u,33557168u,131073u,3221225472u}/* 102E5 */, /*7169*/{0,692224u,620828161u,100795072u,33557168u,131073u,3221225472u}/* 102E6 */, /*7170*/{0,692224u,654380545u,100795072u,33557168u,131073u,3221225472u}/* 102E7 */, /*7171*/{0,692224u,687938561u,100795072u,33557168u,131073u,3221225472u}/* 102E8 */, /*7172*/{0,692224u,721490945u,100795072u,33557168u,131073u,3221225472u}/* 102E9 */, /*7173*/{0,692224u,738271233u,100795072u,33557168u,131073u,3221225472u}/* 102EA */, /*7174*/{0,692224u,906046465u,100795072u,33557168u,131073u,3221225472u}/* 102EB */, /*7175*/{0,692224u,1073823745u,100795072u,33557168u,131073u,3221225472u}/* 102EC */, /*7176*/{0,692224u,1241601025u,100795072u,33557168u,131073u,3221225472u}/* 102ED */, /*7177*/{0,692224u,1409378305u,100795072u,33557168u,131073u,3221225472u}/* 102EE */, /*7178*/{0,692224u,1426156033u,100795072u,33557168u,131073u,3221225472u}/* 102EF */, /*7179*/{0,692224u,1442933761u,100795072u,33557168u,131073u,3221225472u}/* 102F0 */, /*7180*/{0,692224u,1459711489u,100795072u,33557168u,131073u,3221225472u}/* 102F1 */, /*7181*/{0,692224u,1476489217u,100795072u,33557168u,131073u,3221225472u}/* 102F2 */, /*7182*/{0,692224u,1493266945u,100795072u,33557168u,131073u,3221225472u}/* 102F3 */, /*7183*/{0,692224u,1510044673u,100795072u,33557168u,131073u,3221225472u}/* 102F4 */, /*7184*/{0,692224u,1526822401u,100795072u,33557168u,131073u,3221225472u}/* 102F5 */, /*7185*/{0,692224u,1543600129u,100795072u,33557168u,131073u,3221225472u}/* 102F6 */, /*7186*/{0,692224u,1560377857u,100795072u,33557168u,131073u,3221225472u}/* 102F7 */, /*7187*/{0,692224u,1577155585u,100795072u,33557168u,131073u,3221225472u}/* 102F8 */, /*7188*/{0,692224u,1593933313u,100795072u,33557168u,131073u,3221225472u}/* 102F9 */, /*7189*/{0,692224u,1610711041u,100795072u,33557168u,131073u,3221225472u}/* 102FA */, /*7190*/{0,692224u,1627488769u,100795072u,33557168u,131073u,3221225472u}/* 102FB */, /*7191*/{0,696320u,2490369u,77617472u,9437936u,132672u,3221225664u}/* 10300 */, /*7192*/{0,696320u,2490369u,100686144u,9437936u,132672u,3221225664u}/* 1031F */, /*7193*/{0,696320u,455476737u,77595328u,33557168u,131073u,3221225472u}/* 10320 */, /*7194*/{0,696320u,589696001u,77595328u,33557168u,131073u,3221225472u}/* 10321 */, /*7195*/{0,696320u,740696065u,77595328u,33557168u,131073u,3221225472u}/* 10322 */, /*7196*/{0,696320u,1411803137u,77595328u,33557168u,131073u,3221225472u}/* 10323 */, /*7197*/{0,700416u,2555905u,77617472u,9437936u,132672u,3221225664u}/* 10330 */, /*7198*/{0,700416u,1478979585u,77617792u,42994416u,132609u,3221225664u}/* 10341 */, /*7199*/{0,700416u,1629979137u,77617792u,42994416u,132609u,3221225664u}/* 1034A */, /*7200*/{0,704512u,7864321u,100686144u,9437936u,132672u,3221225664u}/* 10350 */, /*7201*/{0,704512u,7864320u,3456907648u,808714992u,2147550212u,3489661056u}/* 10376 */, /*7202*/{0,708608u,3211265u,81811776u,9437936u,132672u,3221225664u}/* 10380 */, /*7203*/{0,708608u,3211265u,81790400u,688u,131072u,3222278144u}/* 1039F */, /*7204*/{0,712704u,3932161u,83908928u,9437936u,132672u,3221225664u}/* 103A0 */, /*7205*/{0,712704u,3932161u,83887552u,688u,131072u,3222278144u}/* 103D0 */, /*7206*/{0,712704u,456918529u,83909248u,42994416u,132609u,3221225664u}/* 103D1 */, /*7207*/{0,712704u,490473985u,83909248u,42994416u,132609u,3221225664u}/* 103D2 */, /*7208*/{0,712704u,742137857u,83909248u,42994416u,132609u,3221225664u}/* 103D3 */, /*7209*/{0,712704u,909913089u,83909248u,42994416u,132609u,3221225664u}/* 103D4 */, /*7210*/{0,712704u,1497133569u,83909248u,42994416u,132609u,3221225664u}/* 103D5 */, /*7211*/{284800u,2297098240u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10400 */, /*7212*/{284928u,2299195392u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10401 */, /*7213*/{285056u,2301292544u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10402 */, /*7214*/{285184u,2303389696u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10403 */, /*7215*/{285312u,2305486848u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10404 */, /*7216*/{285440u,2307584000u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10405 */, /*7217*/{285568u,2309681152u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10406 */, /*7218*/{285696u,2311778304u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10407 */, /*7219*/{285824u,2313875456u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10408 */, /*7220*/{285952u,2315972608u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10409 */, /*7221*/{286080u,2318069760u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040A */, /*7222*/{286208u,2320166912u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040B */, /*7223*/{286336u,2322264064u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040C */, /*7224*/{286464u,2324361216u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040D */, /*7225*/{286592u,2326458368u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040E */, /*7226*/{286720u,2328555520u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1040F */, /*7227*/{286848u,2330652672u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10410 */, /*7228*/{286976u,2332749824u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10411 */, /*7229*/{287104u,2334846976u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10412 */, /*7230*/{287232u,2336944128u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10413 */, /*7231*/{287360u,2339041280u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10414 */, /*7232*/{287488u,2341138432u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10415 */, /*7233*/{287616u,2343235584u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10416 */, /*7234*/{287744u,2345332736u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10417 */, /*7235*/{287872u,2347429888u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10418 */, /*7236*/{288000u,2349527040u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10419 */, /*7237*/{288128u,2351624192u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041A */, /*7238*/{288256u,2353721344u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041B */, /*7239*/{288384u,2355818496u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041C */, /*7240*/{288512u,2357915648u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041D */, /*7241*/{288640u,2360012800u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041E */, /*7242*/{288768u,2362109952u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 1041F */, /*7243*/{288896u,2364207104u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10420 */, /*7244*/{289024u,2366304256u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10421 */, /*7245*/{289152u,2368401408u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10422 */, /*7246*/{289280u,2370498560u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10423 */, /*7247*/{289408u,2372595712u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10424 */, /*7248*/{289536u,2374692864u,2621441u,77617216u,8389361u,2080507488u,3221226688u}/* 10425 */, /*7249*/{289664u,2376790016u,2621441u,81811520u,8389361u,2080507488u,3221226688u}/* 10426 */, /*7250*/{289792u,2378887168u,2621441u,81811520u,8389361u,2080507488u,3221226688u}/* 10427 */, /*7251*/{289920u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10428 */, /*7252*/{290048u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10429 */, /*7253*/{290176u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042A */, /*7254*/{290304u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042B */, /*7255*/{290432u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042C */, /*7256*/{290560u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042D */, /*7257*/{290688u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042E */, /*7258*/{290816u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1042F */, /*7259*/{290944u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10430 */, /*7260*/{291072u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10431 */, /*7261*/{291200u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10432 */, /*7262*/{291328u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10433 */, /*7263*/{291456u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10434 */, /*7264*/{291584u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10435 */, /*7265*/{291712u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10436 */, /*7266*/{291840u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10437 */, /*7267*/{291968u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10438 */, /*7268*/{292096u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10439 */, /*7269*/{292224u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043A */, /*7270*/{292352u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043B */, /*7271*/{292480u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043C */, /*7272*/{292608u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043D */, /*7273*/{292736u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043E */, /*7274*/{292864u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1043F */, /*7275*/{292992u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10440 */, /*7276*/{293120u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10441 */, /*7277*/{293248u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10442 */, /*7278*/{293376u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10443 */, /*7279*/{293504u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10444 */, /*7280*/{293632u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10445 */, /*7281*/{293760u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10446 */, /*7282*/{293888u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10447 */, /*7283*/{294016u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10448 */, /*7284*/{294144u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 10449 */, /*7285*/{294272u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1044A */, /*7286*/{294400u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1044B */, /*7287*/{294528u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1044C */, /*7288*/{294656u,716800u,2621441u,77617280u,7340784u,1392641640u,3221225664u}/* 1044D */, /*7289*/{294784u,716800u,2621441u,81811584u,7340784u,1392641640u,3221225664u}/* 1044E */, /*7290*/{294912u,716800u,2621441u,81811584u,7340784u,1392641640u,3221225664u}/* 1044F */, /*7291*/{0,720896u,3276801u,81811776u,9437936u,132672u,3221225664u}/* 10450 */, /*7292*/{0,724992u,3342337u,81811776u,9437936u,132672u,3221225664u}/* 10480 */, /*7293*/{0,724992u,36897793u,81820224u,44047024u,132097u,3221225600u}/* 104A0 */, /*7294*/{0,724992u,456328705u,81820224u,44047024u,132097u,3221225600u}/* 104A1 */, /*7295*/{0,724992u,489884161u,81820224u,44047024u,132097u,3221225600u}/* 104A2 */, /*7296*/{0,724992u,523438081u,81820224u,44047024u,132097u,3221225600u}/* 104A3 */, /*7297*/{0,724992u,556994561u,81820224u,44047024u,132097u,3221225600u}/* 104A4 */, /*7298*/{0,724992u,590547969u,81820224u,44047024u,132097u,3221225600u}/* 104A5 */, /*7299*/{0,724992u,624104961u,81820224u,44047024u,132097u,3221225600u}/* 104A6 */, /*7300*/{0,724992u,657657345u,81820224u,44047024u,132097u,3221225600u}/* 104A7 */, /*7301*/{0,724992u,691215361u,81820224u,44047024u,132097u,3221225600u}/* 104A8 */, /*7302*/{0,724992u,724767745u,81820224u,44047024u,132097u,3221225600u}/* 104A9 */, /*7303*/{0,729088u,6946817u,100686144u,9437936u,132672u,3221225664u}/* 10500 */, /*7304*/{0,733184u,6750209u,100686144u,9437936u,132672u,3221225664u}/* 10530 */, /*7305*/{0,733184u,6750209u,100664768u,688u,131072u,3222274048u}/* 1056F */, /*7306*/{0,737280u,7208961u,100686144u,9437936u,132672u,3221225664u}/* 10600 */, /*7307*/{0,741376u,3407873u,81877312u,9437936u,132672u,3221225664u}/* 10800 */, /*7308*/{0,745472u,5701633u,90265920u,9437936u,132672u,3221225664u}/* 10840 */, /*7309*/{0,745472u,5701633u,90244544u,688u,131072u,3222278144u}/* 10857 */, /*7310*/{0,745472u,458688001u,90243776u,33557168u,131073u,3221225472u}/* 10858 */, /*7311*/{0,745472u,492243457u,90243776u,33557168u,131073u,3221225472u}/* 10859 */, /*7312*/{0,745472u,525797377u,90243776u,33557168u,131073u,3221225472u}/* 1085A */, /*7313*/{0,745472u,743907329u,90243776u,33557168u,131073u,3221225472u}/* 1085B */, /*7314*/{0,745472u,911682561u,90243776u,33557168u,131073u,3221225472u}/* 1085C */, /*7315*/{0,745472u,1498903041u,90243776u,33557168u,131073u,3221225472u}/* 1085D */, /*7316*/{0,745472u,1649902593u,90243776u,33557168u,131073u,3221225472u}/* 1085E */, /*7317*/{0,745472u,1800902145u,90243776u,33557168u,131073u,3221225472u}/* 1085F */, /*7318*/{0,749568u,7733249u,100751680u,9437936u,132672u,3221225664u}/* 10860 */, /*7319*/{0,749568u,7733249u,100730560u,688u,131072u,3221258240u}/* 10877 */, /*7320*/{0,749568u,460719617u,100729536u,33557168u,131073u,3221225472u}/* 10879 */, /*7321*/{0,749568u,494275073u,100729536u,33557168u,131073u,3221225472u}/* 1087A */, /*7322*/{0,749568u,527828993u,100729536u,33557168u,131073u,3221225472u}/* 1087B */, /*7323*/{0,749568u,561385473u,100729536u,33557168u,131073u,3221225472u}/* 1087C */, /*7324*/{0,749568u,594938881u,100729536u,33557168u,131073u,3221225472u}/* 1087D */, /*7325*/{0,749568u,745938945u,100729536u,33557168u,131073u,3221225472u}/* 1087E */, /*7326*/{0,749568u,913714177u,100729536u,33557168u,131073u,3221225472u}/* 1087F */, /*7327*/{0,753664u,7667713u,100751680u,9437936u,132672u,3221225664u}/* 10880 */, /*7328*/{0,753664u,460654081u,100729536u,33557168u,131073u,3221225472u}/* 108A7 */, /*7329*/{0,753664u,494209537u,100729536u,33557168u,131073u,3221225472u}/* 108A8 */, /*7330*/{0,753664u,527763457u,100729536u,33557168u,131073u,3221225472u}/* 108A9 */, /*7331*/{0,753664u,561319937u,100729536u,33557168u,131073u,3221225472u}/* 108AA */, /*7332*/{0,753664u,594873345u,100729536u,33557168u,131073u,3221225472u}/* 108AC */, /*7333*/{0,753664u,745873409u,100729536u,33557168u,131073u,3221225472u}/* 108AD */, /*7334*/{0,753664u,913648641u,100729536u,33557168u,131073u,3221225472u}/* 108AE */, /*7335*/{0,753664u,1500869121u,100729536u,33557168u,131073u,3221225472u}/* 108AF */, /*7336*/{0,757760u,8388609u,102848832u,9437936u,132672u,3221225664u}/* 108E0 */, /*7337*/{0,757760u,461374977u,102826688u,33557168u,131073u,3221225472u}/* 108FB */, /*7338*/{0,757760u,595594241u,102826688u,33557168u,131073u,3221225472u}/* 108FC */, /*7339*/{0,757760u,746594305u,102826688u,33557168u,131073u,3221225472u}/* 108FD */, /*7340*/{0,757760u,914369537u,102826688u,33557168u,131073u,3221225472u}/* 108FE */, /*7341*/{0,757760u,1501590017u,102826688u,33557168u,131073u,3221225472u}/* 108FF */, /*7342*/{0,761856u,4194305u,86071616u,9437936u,132672u,3221225664u}/* 10900 */, /*7343*/{0,761856u,457180673u,86049472u,33557168u,131073u,3221225472u}/* 10916 */, /*7344*/{0,761856u,742400001u,86049472u,33557168u,131073u,3221225472u}/* 10917 */, /*7345*/{0,761856u,910175233u,86049472u,33557168u,131073u,3221225472u}/* 10918 */, /*7346*/{0,761856u,1497395713u,86049472u,33557168u,131073u,3221225472u}/* 10919 */, /*7347*/{0,761856u,490736129u,90243776u,33557168u,131073u,3221225472u}/* 1091A */, /*7348*/{0,761856u,524290049u,90243776u,33557168u,131073u,3221225472u}/* 1091B */, /*7349*/{0,761856u,4194305u,86640064u,688u,131072u,3222278144u}/* 1091F */, /*7350*/{0,765952u,4980737u,88168768u,9437936u,132672u,3221225664u}/* 10920 */, /*7351*/{0,765952u,4980737u,88147392u,688u,131072u,3222274048u}/* 1093F */, /*7352*/{0,770048u,6422529u,94460224u,9437936u,132672u,3221225664u}/* 10980 */, /*7353*/{0,774144u,6356993u,94460224u,9437936u,132672u,3221225664u}/* 109A0 */, /*7354*/{0,774144u,442569217u,102826688u,67111600u,131073u,3221225472u}/* 109BC */, /*7355*/{0,774144u,291571201u,102826688u,16779952u,131073u,3221225472u}/* 109BD */, /*7356*/{0,774144u,459343361u,102826688u,33557168u,131073u,3221225472u}/* 109C0 */, /*7357*/{0,774144u,492898817u,102826688u,33557168u,131073u,3221225472u}/* 109C1 */, /*7358*/{0,774144u,526452737u,102826688u,33557168u,131073u,3221225472u}/* 109C2 */, /*7359*/{0,774144u,560009217u,102826688u,33557168u,131073u,3221225472u}/* 109C3 */, /*7360*/{0,774144u,593562625u,102826688u,33557168u,131073u,3221225472u}/* 109C4 */, /*7361*/{0,774144u,627119617u,102826688u,33557168u,131073u,3221225472u}/* 109C5 */, /*7362*/{0,774144u,660672001u,102826688u,33557168u,131073u,3221225472u}/* 109C6 */, /*7363*/{0,774144u,694230017u,102826688u,33557168u,131073u,3221225472u}/* 109C7 */, /*7364*/{0,774144u,727782401u,102826688u,33557168u,131073u,3221225472u}/* 109C8 */, /*7365*/{0,774144u,744562689u,102826688u,33557168u,131073u,3221225472u}/* 109C9 */, /*7366*/{0,774144u,912337921u,102826688u,33557168u,131073u,3221225472u}/* 109CA */, /*7367*/{0,774144u,1080115201u,102826688u,33557168u,131073u,3221225472u}/* 109CB */, /*7368*/{0,774144u,1247892481u,102826688u,33557168u,131073u,3221225472u}/* 109CC */, /*7369*/{0,774144u,1415669761u,102826688u,33557168u,131073u,3221225472u}/* 109CD */, /*7370*/{0,774144u,1432447489u,102826688u,33557168u,131073u,3221225472u}/* 109CE */, /*7371*/{0,774144u,1449225217u,102826688u,33557168u,131073u,3221225472u}/* 109CF */, /*7372*/{0,774144u,1499558401u,102826688u,33557168u,131073u,3221225472u}/* 109D2 */, /*7373*/{0,774144u,1516336129u,102826688u,33557168u,131073u,3221225472u}/* 109D3 */, /*7374*/{0,774144u,1533113857u,102826688u,33557168u,131073u,3221225472u}/* 109D4 */, /*7375*/{0,774144u,1549891585u,102826688u,33557168u,131073u,3221225472u}/* 109D5 */, /*7376*/{0,774144u,1566669313u,102826688u,33557168u,131073u,3221225472u}/* 109D6 */, /*7377*/{0,774144u,1583447041u,102826688u,33557168u,131073u,3221225472u}/* 109D7 */, /*7378*/{0,774144u,1600224769u,102826688u,33557168u,131073u,3221225472u}/* 109D8 */, /*7379*/{0,774144u,1617002497u,102826688u,33557168u,131073u,3221225472u}/* 109D9 */, /*7380*/{0,774144u,1633780225u,102826688u,33557168u,131073u,3221225472u}/* 109DA */, /*7381*/{0,774144u,1650557953u,102826688u,33557168u,131073u,3221225472u}/* 109DB */, /*7382*/{0,774144u,1667335681u,102826688u,33557168u,131073u,3221225472u}/* 109DC */, /*7383*/{0,774144u,1684113409u,102826688u,33557168u,131073u,3221225472u}/* 109DD */, /*7384*/{0,774144u,1700891137u,102826688u,33557168u,131073u,3221225472u}/* 109DE */, /*7385*/{0,774144u,1717668865u,102826688u,33557168u,131073u,3221225472u}/* 109DF */, /*7386*/{0,774144u,1734446593u,102826688u,33557168u,131073u,3221225472u}/* 109E0 */, /*7387*/{0,774144u,1751224321u,102826688u,33557168u,131073u,3221225472u}/* 109E1 */, /*7388*/{0,774144u,1768002049u,102826688u,33557168u,131073u,3221225472u}/* 109E2 */, /*7389*/{0,774144u,1784779777u,102826688u,33557168u,131073u,3221225472u}/* 109E3 */, /*7390*/{0,774144u,1801557505u,102826688u,33557168u,131073u,3221225472u}/* 109E4 */, /*7391*/{0,774144u,1818335233u,102826688u,33557168u,131073u,3221225472u}/* 109E5 */, /*7392*/{0,774144u,1835112961u,102826688u,33557168u,131073u,3221225472u}/* 109E6 */, /*7393*/{0,774144u,1851890689u,102826688u,33557168u,131073u,3221225472u}/* 109E7 */, /*7394*/{0,774144u,1868668417u,102826688u,33557168u,131073u,3221225472u}/* 109E8 */, /*7395*/{0,774144u,1885446145u,102826688u,33557168u,131073u,3221225472u}/* 109E9 */, /*7396*/{0,774144u,1902223873u,102826688u,33557168u,131073u,3221225472u}/* 109EA */, /*7397*/{0,774144u,1919001601u,102826688u,33557168u,131073u,3221225472u}/* 109EB */, /*7398*/{0,774144u,1935779329u,102826688u,33557168u,131073u,3221225472u}/* 109EC */, /*7399*/{0,774144u,1952557057u,102826688u,33557168u,131073u,3221225472u}/* 109ED */, /*7400*/{0,774144u,1969334785u,102826688u,33557168u,131073u,3221225472u}/* 109EE */, /*7401*/{0,774144u,2002890241u,102826688u,33557168u,131073u,3221225472u}/* 109EF */, /*7402*/{0,774144u,2019667969u,102826688u,33557168u,131073u,3221225472u}/* 109F0 */, /*7403*/{0,774144u,2053223425u,102826688u,33557168u,131073u,3221225472u}/* 109F1 */, /*7404*/{0,774144u,2070001153u,102826688u,33557168u,131073u,3221225472u}/* 109F2 */, /*7405*/{0,774144u,2086778881u,102826688u,33557168u,131073u,3221225472u}/* 109F3 */, /*7406*/{0,774144u,2103556609u,102826688u,33557168u,131073u,3221225472u}/* 109F4 */, /*7407*/{0,774144u,2120334337u,102826688u,33557168u,131073u,3221225472u}/* 109F5 */, /*7408*/{0,774144u,73467393u,102826688u,67111600u,131073u,3221225472u}/* 109F6 */, /*7409*/{0,774144u,157353473u,102826688u,150997680u,131073u,3221225472u}/* 109F7 */, /*7410*/{0,774144u,207685121u,102826688u,184552112u,131073u,3221225472u}/* 109F8 */, /*7411*/{0,774144u,224462337u,102826688u,201329328u,131073u,3221225472u}/* 109F9 */, /*7412*/{0,774144u,274795521u,102826688u,67111600u,131073u,3221225472u}/* 109FA */, /*7413*/{0,774144u,308350465u,102826688u,67111600u,131073u,3221225472u}/* 109FC */, /*7414*/{0,774144u,358681089u,102826688u,201329328u,131073u,3221225472u}/* 109FD */, /*7415*/{0,774144u,375457793u,102826688u,184552112u,131073u,3221225472u}/* 109FE */, /*7416*/{0,774144u,409013249u,102826688u,150997680u,131073u,3221225472u}/* 109FF */, /*7417*/{0,778240u,3997697u,83974464u,9437936u,132672u,3221225664u}/* 10A00 */, /*7418*/{0,778240u,3997696u,84687232u,808714992u,2147550212u,3489661056u}/* 10A01 */, /*7419*/{0,778240u,3997696u,3104586112u,808714992u,2147550212u,3489661056u}/* 10A0D */, /*7420*/{0,778240u,3997696u,3440130432u,808714992u,2147550212u,3489661056u}/* 10A0F */, /*7421*/{0,778240u,3997696u,3440130432u,808714928u,2147550212u,3221225600u}/* 10A38 */, /*7422*/{0,778240u,3997696u,151796096u,808714928u,2147550212u,3221225600u}/* 10A39 */, /*7423*/{0,778240u,3997696u,3104586112u,808714928u,2147550212u,3221225600u}/* 10A3A */, /*7424*/{0,778240u,3997696u,353122688u,808714928u,2147582980u,3221225600u}/* 10A3F */, /*7425*/{0,778240u,456984065u,83952320u,33559216u,131073u,3221225472u}/* 10A40 */, /*7426*/{0,778240u,490539521u,83952320u,33559216u,131073u,3221225472u}/* 10A41 */, /*7427*/{0,778240u,524093441u,83952320u,33559216u,131073u,3221225472u}/* 10A42 */, /*7428*/{0,778240u,557649921u,83952320u,33559216u,131073u,3221225472u}/* 10A43 */, /*7429*/{0,778240u,742203393u,83952320u,33557168u,131073u,3221225472u}/* 10A44 */, /*7430*/{0,778240u,909978625u,83952320u,33557168u,131073u,3221225472u}/* 10A45 */, /*7431*/{0,778240u,1497199105u,83952320u,33557168u,131073u,3221225472u}/* 10A46 */, /*7432*/{0,778240u,1648198657u,83952320u,33557168u,131073u,3221225472u}/* 10A47 */, /*7433*/{0,778240u,3997697u,83953088u,688u,131072u,3222274048u}/* 10A50 */, /*7434*/{0,778240u,3997697u,83953088u,12583600u,131072u,3222294528u}/* 10A56 */, /*7435*/{0,782336u,5767169u,90265920u,9437936u,132672u,3221225664u}/* 10A60 */, /*7436*/{0,782336u,458753537u,90243776u,33557168u,131073u,3221225472u}/* 10A7D */, /*7437*/{0,782336u,1415079937u,90243776u,33557168u,131073u,3221225472u}/* 10A7E */, /*7438*/{0,782336u,5767169u,90244544u,688u,131072u,3222274048u}/* 10A7F */, /*7439*/{0,786432u,7602177u,100751680u,9437936u,132672u,3221225664u}/* 10A80 */, /*7440*/{0,786432u,460588545u,100729536u,33557168u,131073u,3221225472u}/* 10A9D */, /*7441*/{0,786432u,745807873u,100729536u,33557168u,131073u,3221225472u}/* 10A9E */, /*7442*/{0,786432u,913583105u,100729536u,33557168u,131073u,3221225472u}/* 10A9F */, /*7443*/{0,790529u,7340269u,100751680u,9437936u,132672u,3221225664u}/* 10AC0 */, /*7444*/{0,790529u,7340273u,100751680u,9437936u,132672u,3221225664u}/* 10AC1 */, /*7445*/{0,790529u,7340277u,100751680u,9437936u,132672u,3221225664u}/* 10AC3 */, /*7446*/{0,790530u,7340281u,100751680u,9437936u,132672u,3221225664u}/* 10AC5 */, /*7447*/{0,790528u,7340033u,100751680u,9437936u,132672u,3221225664u}/* 10AC6 */, /*7448*/{0,790530u,7340285u,100751680u,9437936u,132672u,3221225664u}/* 10AC7 */, /*7449*/{0,790528u,7340033u,100730560u,688u,131072u,3221258240u}/* 10AC8 */, /*7450*/{0,790530u,7340289u,100751680u,9437936u,132672u,3221225664u}/* 10AC9 */, /*7451*/{0,790532u,7340293u,100751680u,9437936u,132672u,3221225664u}/* 10ACD */, /*7452*/{0,790530u,7340297u,100751680u,9437936u,132672u,3221225664u}/* 10ACE */, /*7453*/{0,790530u,7340301u,100751680u,9437936u,132672u,3221225664u}/* 10ACF */, /*7454*/{0,790530u,7340305u,100751680u,9437936u,132672u,3221225664u}/* 10AD0 */, /*7455*/{0,790529u,7340309u,100751680u,9437936u,132672u,3221225664u}/* 10AD3 */, /*7456*/{0,790529u,7340313u,100751680u,9437936u,132672u,3221225664u}/* 10AD4 */, /*7457*/{0,790529u,7340317u,100751680u,9437936u,132672u,3221225664u}/* 10AD5 */, /*7458*/{0,790529u,7340321u,100751680u,9437936u,132672u,3221225664u}/* 10AD6 */, /*7459*/{0,790532u,7340325u,100751680u,9437936u,132672u,3221225664u}/* 10AD7 */, /*7460*/{0,790529u,7340329u,100751680u,9437936u,132672u,3221225664u}/* 10AD8 */, /*7461*/{0,790529u,7340333u,100751680u,9437936u,132672u,3221225664u}/* 10AD9 */, /*7462*/{0,790529u,7340337u,100751680u,9437936u,132672u,3221225664u}/* 10ADB */, /*7463*/{0,790530u,7340341u,100751680u,9437936u,132672u,3221225664u}/* 10ADD */, /*7464*/{0,790529u,7340345u,100751680u,9437936u,132672u,3221225664u}/* 10ADE */, /*7465*/{0,790530u,7340349u,100751680u,9437936u,132672u,3221225664u}/* 10AE1 */, /*7466*/{0,790530u,7340353u,100751680u,9437936u,132672u,3221225664u}/* 10AE4 */, /*7467*/{0,790528u,7340032u,3456907648u,808714928u,2148598788u,3221225600u}/* 10AE5 */, /*7468*/{0,790528u,7340032u,3121363328u,808714928u,2148598788u,3221225600u}/* 10AE6 */, /*7469*/{0,790529u,460326725u,100729536u,33557168u,131073u,3221225472u}/* 10AEB */, /*7470*/{0,790529u,594545993u,100729536u,33557168u,131073u,3221225472u}/* 10AEC */, /*7471*/{0,790529u,745546061u,100729536u,33557168u,131073u,3221225472u}/* 10AED */, /*7472*/{0,790529u,913321297u,100729536u,33557168u,131073u,3221225472u}/* 10AEE */, /*7473*/{0,790530u,1500541781u,100729536u,33557168u,131073u,3221225472u}/* 10AEF */, /*7474*/{0,790528u,7340033u,100730304u,688u,131072u,3222278144u}/* 10AF0 */, /*7475*/{0,790528u,7340033u,100730304u,688u,131072u,3222274048u}/* 10AF6 */, /*7476*/{0,794624u,5242881u,90265920u,9437936u,132672u,3221225664u}/* 10B00 */, /*7477*/{0,794624u,5242881u,90834368u,688u,131072u,3222274048u}/* 10B39 */, /*7478*/{0,794624u,5242881u,90834368u,688u,131072u,3222278144u}/* 10B3A */, /*7479*/{0,798720u,5832705u,90265920u,9437936u,132672u,3221225664u}/* 10B40 */, /*7480*/{0,798720u,458819073u,90243776u,33557168u,131073u,3221225472u}/* 10B58 */, /*7481*/{0,798720u,492374529u,90243776u,33557168u,131073u,3221225472u}/* 10B59 */, /*7482*/{0,798720u,525928449u,90243776u,33557168u,131073u,3221225472u}/* 10B5A */, /*7483*/{0,798720u,559484929u,90243776u,33557168u,131073u,3221225472u}/* 10B5B */, /*7484*/{0,798720u,744038401u,90243776u,33557168u,131073u,3221225472u}/* 10B5C */, /*7485*/{0,798720u,911813633u,90243776u,33557168u,131073u,3221225472u}/* 10B5D */, /*7486*/{0,798720u,1499034113u,90243776u,33557168u,131073u,3221225472u}/* 10B5E */, /*7487*/{0,798720u,1650033665u,90243776u,33557168u,131073u,3221225472u}/* 10B5F */, /*7488*/{0,802816u,5898241u,90265920u,9437936u,132672u,3221225664u}/* 10B60 */, /*7489*/{0,802816u,458884609u,90243776u,33557168u,131073u,3221225472u}/* 10B78 */, /*7490*/{0,802816u,492440065u,90243776u,33557168u,131073u,3221225472u}/* 10B79 */, /*7491*/{0,802816u,525993985u,90243776u,33557168u,131073u,3221225472u}/* 10B7A */, /*7492*/{0,802816u,559550465u,90243776u,33557168u,131073u,3221225472u}/* 10B7B */, /*7493*/{0,802816u,744103937u,90243776u,33557168u,131073u,3221225472u}/* 10B7C */, /*7494*/{0,802816u,911879169u,90243776u,33557168u,131073u,3221225472u}/* 10B7D */, /*7495*/{0,802816u,1499099649u,90243776u,33557168u,131073u,3221225472u}/* 10B7E */, /*7496*/{0,802816u,1650099201u,90243776u,33557168u,131073u,3221225472u}/* 10B7F */, /*7497*/{0,806913u,7929857u,100751680u,9437936u,132672u,3221225664u}/* 10B80 */, /*7498*/{0,806914u,7929857u,100751680u,9437936u,132672u,3221225664u}/* 10B81 */, /*7499*/{0,806912u,7929857u,100730304u,688u,131072u,3222278144u}/* 10B99 */, /*7500*/{0,806914u,460916225u,100729536u,33557168u,131073u,3221225472u}/* 10BA9 */, /*7501*/{0,806914u,494471681u,100729536u,33557168u,131073u,3221225472u}/* 10BAA */, /*7502*/{0,806914u,528025601u,100729536u,33557168u,131073u,3221225472u}/* 10BAB */, /*7503*/{0,806914u,561582081u,100729536u,33557168u,131073u,3221225472u}/* 10BAC */, /*7504*/{0,806913u,746135553u,100729536u,33557168u,131073u,3221225472u}/* 10BAD */, /*7505*/{0,806913u,913910785u,100729536u,33557168u,131073u,3221225472u}/* 10BAE */, /*7506*/{0,806912u,1501131265u,100729536u,33557168u,131073u,3221225472u}/* 10BAF */, /*7507*/{0,811008u,5963777u,90265920u,9437936u,132672u,3221225664u}/* 10C00 */, /*7508*/{295040u,2381082624u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C80 */, /*7509*/{295168u,2383179776u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C81 */, /*7510*/{295296u,2385276928u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C82 */, /*7511*/{295424u,2387374080u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C83 */, /*7512*/{295552u,2389471232u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C84 */, /*7513*/{295680u,2391568384u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C85 */, /*7514*/{295808u,2393665536u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C86 */, /*7515*/{295936u,2395762688u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C87 */, /*7516*/{296064u,2397859840u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C88 */, /*7517*/{296192u,2399956992u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C89 */, /*7518*/{296320u,2402054144u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8A */, /*7519*/{296448u,2404151296u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8B */, /*7520*/{296576u,2406248448u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8C */, /*7521*/{296704u,2408345600u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8D */, /*7522*/{296832u,2410442752u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8E */, /*7523*/{296960u,2412539904u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C8F */, /*7524*/{297088u,2414637056u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C90 */, /*7525*/{297216u,2416734208u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C91 */, /*7526*/{297344u,2418831360u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C92 */, /*7527*/{297472u,2420928512u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C93 */, /*7528*/{297600u,2423025664u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C94 */, /*7529*/{297728u,2425122816u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C95 */, /*7530*/{297856u,2427219968u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C96 */, /*7531*/{297984u,2429317120u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C97 */, /*7532*/{298112u,2431414272u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C98 */, /*7533*/{298240u,2433511424u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C99 */, /*7534*/{298368u,2435608576u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9A */, /*7535*/{298496u,2437705728u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9B */, /*7536*/{298624u,2439802880u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9C */, /*7537*/{298752u,2441900032u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9D */, /*7538*/{298880u,2443997184u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9E */, /*7539*/{299008u,2446094336u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10C9F */, /*7540*/{299136u,2448191488u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA0 */, /*7541*/{299264u,2450288640u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA1 */, /*7542*/{299392u,2452385792u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA2 */, /*7543*/{299520u,2454482944u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA3 */, /*7544*/{299648u,2456580096u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA4 */, /*7545*/{299776u,2458677248u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA5 */, /*7546*/{299904u,2460774400u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA6 */, /*7547*/{300032u,2462871552u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA7 */, /*7548*/{300160u,2464968704u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA8 */, /*7549*/{300288u,2467065856u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CA9 */, /*7550*/{300416u,2469163008u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAA */, /*7551*/{300544u,2471260160u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAB */, /*7552*/{300672u,2473357312u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAC */, /*7553*/{300800u,2475454464u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAD */, /*7554*/{300928u,2477551616u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAE */, /*7555*/{301056u,2479648768u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CAF */, /*7556*/{301184u,2481745920u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CB0 */, /*7557*/{301312u,2483843072u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CB1 */, /*7558*/{301440u,2485940224u,8519681u,102848576u,8389361u,2080507488u,3221226688u}/* 10CB2 */, /*7559*/{301568u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC0 */, /*7560*/{301696u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC1 */, /*7561*/{301824u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC2 */, /*7562*/{301952u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC3 */, /*7563*/{302080u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC4 */, /*7564*/{302208u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC5 */, /*7565*/{302336u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC6 */, /*7566*/{302464u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC7 */, /*7567*/{302592u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC8 */, /*7568*/{302720u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CC9 */, /*7569*/{302848u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCA */, /*7570*/{302976u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCB */, /*7571*/{303104u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCC */, /*7572*/{303232u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCD */, /*7573*/{303360u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCE */, /*7574*/{303488u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CCF */, /*7575*/{303616u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD0 */, /*7576*/{303744u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD1 */, /*7577*/{303872u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD2 */, /*7578*/{304000u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD3 */, /*7579*/{304128u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD4 */, /*7580*/{304256u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD5 */, /*7581*/{304384u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD6 */, /*7582*/{304512u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD7 */, /*7583*/{304640u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD8 */, /*7584*/{304768u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CD9 */, /*7585*/{304896u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDA */, /*7586*/{305024u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDB */, /*7587*/{305152u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDC */, /*7588*/{305280u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDD */, /*7589*/{305408u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDE */, /*7590*/{305536u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CDF */, /*7591*/{305664u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE0 */, /*7592*/{305792u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE1 */, /*7593*/{305920u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE2 */, /*7594*/{306048u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE3 */, /*7595*/{306176u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE4 */, /*7596*/{306304u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE5 */, /*7597*/{306432u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE6 */, /*7598*/{306560u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE7 */, /*7599*/{306688u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE8 */, /*7600*/{306816u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CE9 */, /*7601*/{306944u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CEA */, /*7602*/{307072u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CEB */, /*7603*/{307200u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CEC */, /*7604*/{307328u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CED */, /*7605*/{307456u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CEE */, /*7606*/{307584u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CEF */, /*7607*/{307712u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CF0 */, /*7608*/{307840u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CF1 */, /*7609*/{307968u,815104u,8519681u,102848640u,7340784u,1392641640u,3221225664u}/* 10CF2 */, /*7610*/{0,815104u,461506049u,102826688u,33557168u,131073u,3221225472u}/* 10CFA */, /*7611*/{0,815104u,595725313u,102826688u,33557168u,131073u,3221225472u}/* 10CFB */, /*7612*/{0,815104u,746725377u,102826688u,33557168u,131073u,3221225472u}/* 10CFC */, /*7613*/{0,815104u,1417832449u,102826688u,33557168u,131073u,3221225472u}/* 10CFD */, /*7614*/{0,815104u,1501721089u,102826688u,33557168u,131073u,3221225472u}/* 10CFE */, /*7615*/{0,815104u,1652720641u,102826688u,33557168u,131073u,3221225472u}/* 10CFF */, /*7616*/{0,819200u,453445121u,90505920u,33559216u,131073u,3221225472u}/* 10E60 */, /*7617*/{0,819200u,487000577u,90505920u,33559216u,131073u,3221225472u}/* 10E61 */, /*7618*/{0,819200u,520554497u,90505920u,33559216u,131073u,3221225472u}/* 10E62 */, /*7619*/{0,819200u,554110977u,90505920u,33559216u,131073u,3221225472u}/* 10E63 */, /*7620*/{0,819200u,587664385u,90505920u,33559216u,131073u,3221225472u}/* 10E64 */, /*7621*/{0,819200u,621221377u,90505920u,33559216u,131073u,3221225472u}/* 10E65 */, /*7622*/{0,819200u,654773761u,90505920u,33559216u,131073u,3221225472u}/* 10E66 */, /*7623*/{0,819200u,688331777u,90505920u,33559216u,131073u,3221225472u}/* 10E67 */, /*7624*/{0,819200u,721884161u,90505920u,33559216u,131073u,3221225472u}/* 10E68 */, /*7625*/{0,819200u,738664449u,90505920u,33557168u,131073u,3221225472u}/* 10E69 */, /*7626*/{0,819200u,906439681u,90505920u,33557168u,131073u,3221225472u}/* 10E6A */, /*7627*/{0,819200u,1074216961u,90505920u,33557168u,131073u,3221225472u}/* 10E6B */, /*7628*/{0,819200u,1241994241u,90505920u,33557168u,131073u,3221225472u}/* 10E6C */, /*7629*/{0,819200u,1409771521u,90505920u,33557168u,131073u,3221225472u}/* 10E6D */, /*7630*/{0,819200u,1426549249u,90505920u,33557168u,131073u,3221225472u}/* 10E6E */, /*7631*/{0,819200u,1443326977u,90505920u,33557168u,131073u,3221225472u}/* 10E6F */, /*7632*/{0,819200u,1460104705u,90505920u,33557168u,131073u,3221225472u}/* 10E70 */, /*7633*/{0,819200u,1476882433u,90505920u,33557168u,131073u,3221225472u}/* 10E71 */, /*7634*/{0,819200u,1493660161u,90505920u,33557168u,131073u,3221225472u}/* 10E72 */, /*7635*/{0,819200u,1510437889u,90505920u,33557168u,131073u,3221225472u}/* 10E73 */, /*7636*/{0,819200u,1527215617u,90505920u,33557168u,131073u,3221225472u}/* 10E74 */, /*7637*/{0,819200u,1543993345u,90505920u,33557168u,131073u,3221225472u}/* 10E75 */, /*7638*/{0,819200u,1560771073u,90505920u,33557168u,131073u,3221225472u}/* 10E76 */, /*7639*/{0,819200u,1577548801u,90505920u,33557168u,131073u,3221225472u}/* 10E77 */, /*7640*/{0,819200u,1594326529u,90505920u,33557168u,131073u,3221225472u}/* 10E78 */, /*7641*/{0,819200u,1611104257u,90505920u,33557168u,131073u,3221225472u}/* 10E79 */, /*7642*/{0,819200u,1627881985u,90505920u,33557168u,131073u,3221225472u}/* 10E7A */, /*7643*/{0,819200u,285672961u,90505920u,16779952u,131073u,3221225472u}/* 10E7B */, /*7644*/{0,819200u,201786881u,90505920u,184552112u,131073u,3221225472u}/* 10E7C */, /*7645*/{0,819200u,218564097u,90505920u,201329328u,131073u,3221225472u}/* 10E7D */, /*7646*/{0,819200u,352782849u,90505920u,201329328u,131073u,3221225472u}/* 10E7E */, /*7647*/{0,823296u,6160384u,92289536u,808846064u,132100u,3489661056u}/* 11000 */, /*7648*/{0,823296u,6160384u,93075840u,808714992u,2147550212u,3489661056u}/* 11001 */, /*7649*/{0,823296u,6160385u,92297536u,9437936u,132672u,3221225664u}/* 11003 */, /*7650*/{0,823296u,6160384u,361511296u,808714928u,2147582980u,3221225600u}/* 11046 */, /*7651*/{0,823296u,6160385u,92276160u,12583600u,131072u,3222294528u}/* 11047 */, /*7652*/{0,823296u,6160385u,92276160u,688u,131072u,3222278144u}/* 11049 */, /*7653*/{0,823296u,459146753u,92930752u,33559216u,131073u,3221225472u}/* 11052 */, /*7654*/{0,823296u,492702209u,92930752u,33559216u,131073u,3221225472u}/* 11053 */, /*7655*/{0,823296u,526256129u,92930752u,33559216u,131073u,3221225472u}/* 11054 */, /*7656*/{0,823296u,559812609u,92930752u,33559216u,131073u,3221225472u}/* 11055 */, /*7657*/{0,823296u,593366017u,92930752u,33559216u,131073u,3221225472u}/* 11056 */, /*7658*/{0,823296u,626923009u,92930752u,33559216u,131073u,3221225472u}/* 11057 */, /*7659*/{0,823296u,660475393u,92930752u,33559216u,131073u,3221225472u}/* 11058 */, /*7660*/{0,823296u,694033409u,92930752u,33559216u,131073u,3221225472u}/* 11059 */, /*7661*/{0,823296u,727585793u,92930752u,33559216u,131073u,3221225472u}/* 1105A */, /*7662*/{0,823296u,744366081u,92930752u,33557168u,131073u,3221225472u}/* 1105B */, /*7663*/{0,823296u,912141313u,92930752u,33557168u,131073u,3221225472u}/* 1105C */, /*7664*/{0,823296u,1079918593u,92930752u,33557168u,131073u,3221225472u}/* 1105D */, /*7665*/{0,823296u,1247695873u,92930752u,33557168u,131073u,3221225472u}/* 1105E */, /*7666*/{0,823296u,1415473153u,92930752u,33557168u,131073u,3221225472u}/* 1105F */, /*7667*/{0,823296u,1432250881u,92930752u,33557168u,131073u,3221225472u}/* 11060 */, /*7668*/{0,823296u,1449028609u,92930752u,33557168u,131073u,3221225472u}/* 11061 */, /*7669*/{0,823296u,1465806337u,92930752u,33557168u,131073u,3221225472u}/* 11062 */, /*7670*/{0,823296u,1482584065u,92930752u,33557168u,131073u,3221225472u}/* 11063 */, /*7671*/{0,823296u,1499361793u,92930752u,33557168u,131073u,3221225472u}/* 11064 */, /*7672*/{0,823296u,1650361345u,92930752u,33557168u,131073u,3221225472u}/* 11065 */, /*7673*/{0,823296u,39715841u,92305984u,44047024u,132097u,3221225600u}/* 11066 */, /*7674*/{0,823296u,459146753u,92305984u,44047024u,132097u,3221225600u}/* 11067 */, /*7675*/{0,823296u,492702209u,92305984u,44047024u,132097u,3221225600u}/* 11068 */, /*7676*/{0,823296u,526256129u,92305984u,44047024u,132097u,3221225600u}/* 11069 */, /*7677*/{0,823296u,559812609u,92305984u,44047024u,132097u,3221225600u}/* 1106A */, /*7678*/{0,823296u,593366017u,92305984u,44047024u,132097u,3221225600u}/* 1106B */, /*7679*/{0,823296u,626923009u,92305984u,44047024u,132097u,3221225600u}/* 1106C */, /*7680*/{0,823296u,660475393u,92305984u,44047024u,132097u,3221225600u}/* 1106D */, /*7681*/{0,823296u,694033409u,92305984u,44047024u,132097u,3221225600u}/* 1106E */, /*7682*/{0,823296u,727585793u,92305984u,44047024u,132097u,3221225600u}/* 1106F */, /*7683*/{0,823296u,6160384u,369899904u,808714928u,2147582980u,3221225600u}/* 1107F */, /*7684*/{0,827392u,6029312u,90978688u,808714928u,2147550212u,3221225600u}/* 11080 */, /*7685*/{0,827392u,6029312u,90192384u,808846064u,132100u,3489661056u}/* 11082 */, /*7686*/{0,827392u,6029313u,90200384u,9437936u,132672u,3221225664u}/* 11083 */, /*7687*/{2036334592u,827392u,6029313u,90200386u,9437936u,132672u,192u}/* 1109A */, /*7688*/{2036858880u,827392u,6029313u,90200386u,9437936u,132672u,192u}/* 1109C */, /*7689*/{2037383168u,827392u,6029313u,90200386u,9437936u,132672u,192u}/* 110AB */, /*7690*/{0,827392u,6029312u,90978688u,808714992u,2147550212u,3489661056u}/* 110B3 */, /*7691*/{0,827392u,6029312u,359414144u,808714928u,2148631556u,3221225600u}/* 110B9 */, /*7692*/{0,827392u,6029312u,225196416u,808715568u,2148598788u,3221225600u}/* 110BA */, /*7693*/{0,827392u,6029313u,90179008u,688u,131072u,3222274048u}/* 110BB */, /*7694*/{0,827392u,6029313u,90196992u,5440178u,2147483648u,3221225472u}/* 110BD */, /*7695*/{0,827392u,6029313u,90179008u,12583600u,131072u,3222294528u}/* 110BE */, /*7696*/{0,831488u,6619137u,94394688u,9437936u,132672u,3221225664u}/* 110D0 */, /*7697*/{0,831488u,40174593u,94403136u,44047024u,132097u,3221225600u}/* 110F0 */, /*7698*/{0,831488u,459605505u,94403136u,44047024u,132097u,3221225600u}/* 110F1 */, /*7699*/{0,831488u,493160961u,94403136u,44047024u,132097u,3221225600u}/* 110F2 */, /*7700*/{0,831488u,526714881u,94403136u,44047024u,132097u,3221225600u}/* 110F3 */, /*7701*/{0,831488u,560271361u,94403136u,44047024u,132097u,3221225600u}/* 110F4 */, /*7702*/{0,831488u,593824769u,94403136u,44047024u,132097u,3221225600u}/* 110F5 */, /*7703*/{0,831488u,627381761u,94403136u,44047024u,132097u,3221225600u}/* 110F6 */, /*7704*/{0,831488u,660934145u,94403136u,44047024u,132097u,3221225600u}/* 110F7 */, /*7705*/{0,831488u,694492161u,94403136u,44047024u,132097u,3221225600u}/* 110F8 */, /*7706*/{0,831488u,728044545u,94403136u,44047024u,132097u,3221225600u}/* 110F9 */, /*7707*/{0,835584u,6291456u,3450616192u,808714992u,2147550212u,3489661056u}/* 11100 */, /*7708*/{0,835584u,6291457u,94394688u,9437936u,132672u,3221225664u}/* 11103 */, /*7709*/{0,835584u,6291456u,95172992u,808715632u,2147550212u,3489661056u}/* 11127 */, /*7710*/{0,835584u,6291456u,95172992u,808714992u,2147550212u,3489661056u}/* 11128 */, /*7711*/{0,835584u,6291456u,94386688u,808846064u,132100u,3489661056u}/* 1112C */, /*7712*/{2037907456u,835584u,6291456u,95172994u,808714992u,2147550212u,268435584u}/* 1112E */, /*7713*/{2038431744u,835584u,6291456u,95172994u,808714992u,2147550212u,268435584u}/* 1112F */, /*7714*/{0,835584u,6291456u,363608448u,808714928u,2148631556u,3221225600u}/* 11133 */, /*7715*/{0,835584u,39846913u,94403136u,44047024u,132097u,3221225600u}/* 11136 */, /*7716*/{0,835584u,459277825u,94403136u,44047024u,132097u,3221225600u}/* 11137 */, /*7717*/{0,835584u,492833281u,94403136u,44047024u,132097u,3221225600u}/* 11138 */, /*7718*/{0,835584u,526387201u,94403136u,44047024u,132097u,3221225600u}/* 11139 */, /*7719*/{0,835584u,559943681u,94403136u,44047024u,132097u,3221225600u}/* 1113A */, /*7720*/{0,835584u,593497089u,94403136u,44047024u,132097u,3221225600u}/* 1113B */, /*7721*/{0,835584u,627054081u,94403136u,44047024u,132097u,3221225600u}/* 1113C */, /*7722*/{0,835584u,660606465u,94403136u,44047024u,132097u,3221225600u}/* 1113D */, /*7723*/{0,835584u,694164481u,94403136u,44047024u,132097u,3221225600u}/* 1113E */, /*7724*/{0,835584u,727716865u,94403136u,44047024u,132097u,3221225600u}/* 1113F */, /*7725*/{0,835584u,6291457u,94373312u,688u,131072u,3222274048u}/* 11140 */, /*7726*/{0,835584u,6291457u,94373312u,12583600u,131072u,3222294528u}/* 11141 */, /*7727*/{0,839680u,7274497u,100686144u,9437936u,132672u,3221225664u}/* 11150 */, /*7728*/{0,839680u,7274496u,235682176u,808714928u,2148598788u,3221225600u}/* 11173 */, /*7729*/{0,839680u,7274497u,100664768u,688u,131072u,3222274048u}/* 11174 */, /*7730*/{0,843776u,6553600u,95172992u,808714992u,2147550212u,3489661056u}/* 11180 */, /*7731*/{0,843776u,6553600u,94386688u,808846064u,132100u,3489661056u}/* 11182 */, /*7732*/{0,843776u,6553601u,94394688u,9437936u,132672u,3221225664u}/* 11183 */, /*7733*/{0,843776u,6553600u,362822144u,808846000u,1213444u,3221225600u}/* 111C0 */, /*7734*/{0,843776u,6553601u,94373312u,12583600u,131072u,3222294528u}/* 111C5 */, /*7735*/{0,843776u,6553601u,94373312u,688u,131072u,3222274048u}/* 111C7 */, /*7736*/{0,843776u,6553601u,102761920u,688u,131072u,3222274048u}/* 111C9 */, /*7737*/{0,843776u,6553600u,237779328u,808714928u,2148598788u,3221225600u}/* 111CA */, /*7738*/{0,843776u,6553600u,103561600u,808714928u,2148598788u,3221225600u}/* 111CB */, /*7739*/{0,843776u,6553601u,100664768u,12583600u,131072u,3222294528u}/* 111CD */, /*7740*/{0,843776u,40109057u,94403136u,44047024u,132097u,3221225600u}/* 111D0 */, /*7741*/{0,843776u,459539969u,94403136u,44047024u,132097u,3221225600u}/* 111D1 */, /*7742*/{0,843776u,493095425u,94403136u,44047024u,132097u,3221225600u}/* 111D2 */, /*7743*/{0,843776u,526649345u,94403136u,44047024u,132097u,3221225600u}/* 111D3 */, /*7744*/{0,843776u,560205825u,94403136u,44047024u,132097u,3221225600u}/* 111D4 */, /*7745*/{0,843776u,593759233u,94403136u,44047024u,132097u,3221225600u}/* 111D5 */, /*7746*/{0,843776u,627316225u,94403136u,44047024u,132097u,3221225600u}/* 111D6 */, /*7747*/{0,843776u,660868609u,94403136u,44047024u,132097u,3221225600u}/* 111D7 */, /*7748*/{0,843776u,694426625u,94403136u,44047024u,132097u,3221225600u}/* 111D8 */, /*7749*/{0,843776u,727979009u,94403136u,44047024u,132097u,3221225600u}/* 111D9 */, /*7750*/{0,843776u,6553601u,100686144u,9437936u,132672u,3221225664u}/* 111DA */, /*7751*/{0,843776u,6553601u,102783296u,9437936u,132672u,3221225664u}/* 111DC */, /*7752*/{0,843776u,6553601u,102761920u,12583600u,131072u,3222294528u}/* 111DE */, /*7753*/{0,847872u,454231553u,100664000u,33557168u,131073u,3221225472u}/* 111E1 */, /*7754*/{0,847872u,487787009u,100664000u,33557168u,131073u,3221225472u}/* 111E2 */, /*7755*/{0,847872u,521340929u,100664000u,33557168u,131073u,3221225472u}/* 111E3 */, /*7756*/{0,847872u,554897409u,100664000u,33557168u,131073u,3221225472u}/* 111E4 */, /*7757*/{0,847872u,588450817u,100664000u,33557168u,131073u,3221225472u}/* 111E5 */, /*7758*/{0,847872u,622007809u,100664000u,33557168u,131073u,3221225472u}/* 111E6 */, /*7759*/{0,847872u,655560193u,100664000u,33557168u,131073u,3221225472u}/* 111E7 */, /*7760*/{0,847872u,689118209u,100664000u,33557168u,131073u,3221225472u}/* 111E8 */, /*7761*/{0,847872u,722670593u,100664000u,33557168u,131073u,3221225472u}/* 111E9 */, /*7762*/{0,847872u,739450881u,100664000u,33557168u,131073u,3221225472u}/* 111EA */, /*7763*/{0,847872u,907226113u,100664000u,33557168u,131073u,3221225472u}/* 111EB */, /*7764*/{0,847872u,1075003393u,100664000u,33557168u,131073u,3221225472u}/* 111EC */, /*7765*/{0,847872u,1242780673u,100664000u,33557168u,131073u,3221225472u}/* 111ED */, /*7766*/{0,847872u,1410557953u,100664000u,33557168u,131073u,3221225472u}/* 111EE */, /*7767*/{0,847872u,1427335681u,100664000u,33557168u,131073u,3221225472u}/* 111EF */, /*7768*/{0,847872u,1444113409u,100664000u,33557168u,131073u,3221225472u}/* 111F0 */, /*7769*/{0,847872u,1460891137u,100664000u,33557168u,131073u,3221225472u}/* 111F1 */, /*7770*/{0,847872u,1477668865u,100664000u,33557168u,131073u,3221225472u}/* 111F2 */, /*7771*/{0,847872u,1494446593u,100664000u,33557168u,131073u,3221225472u}/* 111F3 */, /*7772*/{0,847872u,1645446145u,100664000u,33557168u,131073u,3221225472u}/* 111F4 */, /*7773*/{0,851968u,7143425u,100686144u,9437936u,132672u,3221225664u}/* 11200 */, /*7774*/{0,851968u,7143424u,100678144u,808846064u,132100u,3489661056u}/* 1122C */, /*7775*/{0,851968u,7143424u,101464448u,808714992u,2147550212u,3489661056u}/* 1122F */, /*7776*/{0,851968u,7143424u,369113600u,808846000u,1213444u,3221225600u}/* 11235 */, /*7777*/{0,851968u,7143424u,235682176u,808714928u,2148598788u,3221225600u}/* 11236 */, /*7778*/{0,851968u,7143425u,100664768u,12583600u,131072u,3222294528u}/* 11238 */, /*7779*/{0,851968u,7143425u,100664768u,688u,131072u,3222278144u}/* 1123A */, /*7780*/{0,851968u,7143425u,100664768u,688u,131072u,3222274048u}/* 1123D */, /*7781*/{0,856064u,8454145u,102783296u,9437936u,132672u,3221225664u}/* 11280 */, /*7782*/{0,856064u,8454145u,102761920u,12583600u,131072u,3222294528u}/* 112A9 */, /*7783*/{0,860160u,8060929u,100686144u,9437936u,132672u,3221225664u}/* 112B0 */, /*7784*/{0,860160u,8060928u,101464448u,808714992u,2147550212u,3489661056u}/* 112DF */, /*7785*/{0,860160u,8060928u,100678144u,808846064u,132100u,3489661056u}/* 112E0 */, /*7786*/{0,860160u,8060928u,235682176u,808714928u,2148598788u,3221225600u}/* 112E9 */, /*7787*/{0,860160u,8060928u,369899904u,808714928u,2148631556u,3221225600u}/* 112EA */, /*7788*/{0,860160u,41616385u,100694592u,44047024u,132097u,3221225600u}/* 112F0 */, /*7789*/{0,860160u,461047297u,100694592u,44047024u,132097u,3221225600u}/* 112F1 */, /*7790*/{0,860160u,494602753u,100694592u,44047024u,132097u,3221225600u}/* 112F2 */, /*7791*/{0,860160u,528156673u,100694592u,44047024u,132097u,3221225600u}/* 112F3 */, /*7792*/{0,860160u,561713153u,100694592u,44047024u,132097u,3221225600u}/* 112F4 */, /*7793*/{0,860160u,595266561u,100694592u,44047024u,132097u,3221225600u}/* 112F5 */, /*7794*/{0,860160u,628823553u,100694592u,44047024u,132097u,3221225600u}/* 112F6 */, /*7795*/{0,860160u,662375937u,100694592u,44047024u,132097u,3221225600u}/* 112F7 */, /*7796*/{0,860160u,695933953u,100694592u,44047024u,132097u,3221225600u}/* 112F8 */, /*7797*/{0,860160u,729486337u,100694592u,44047024u,132097u,3221225600u}/* 112F9 */, /*7798*/{0,864256u,7012352u,103561600u,808714992u,2147550212u,3489661056u}/* 11300 */, /*7799*/{0,864256u,7012352u,101464448u,808714992u,2147550212u,3489661056u}/* 11301 */, /*7800*/{0,864256u,7012352u,100678144u,808846064u,132100u,3489661056u}/* 11302 */, /*7801*/{0,864256u,7012353u,100686144u,9437936u,132672u,3221225664u}/* 11305 */, /*7802*/{0,864256u,7012352u,235682176u,808714928u,2148598788u,3221225600u}/* 1133C */, /*7803*/{0,864256u,7012352u,100678144u,808715632u,66564u,3556769920u}/* 1133E */, /*7804*/{2038956032u,864256u,7012352u,100678146u,808846064u,132100u,268435584u}/* 1134B */, /*7805*/{2039480320u,864256u,7012352u,100678146u,808846064u,132100u,268435584u}/* 1134C */, /*7806*/{0,864256u,7012352u,369113600u,808846000u,1213444u,3221225600u}/* 1134D */, /*7807*/{0,864256u,7012353u,102783296u,9437936u,132672u,3221225664u}/* 11350 */, /*7808*/{0,864256u,7012353u,100686144u,9437936u,656960u,3221225664u}/* 1135D */, /*7809*/{0,864256u,7012352u,3456907648u,808714928u,2148598788u,3221225600u}/* 11366 */, /*7810*/{0,868352u,8126465u,100686144u,9437936u,132672u,3221225664u}/* 11480 */, /*7811*/{0,868352u,8126464u,100678144u,808715632u,66564u,3556769920u}/* 114B0 */, /*7812*/{0,868352u,8126464u,100678144u,808846064u,132100u,3489661056u}/* 114B1 */, /*7813*/{0,868352u,8126464u,101464448u,808714992u,2147550212u,3489661056u}/* 114B3 */, /*7814*/{0,868352u,8126464u,101464448u,808715632u,2147550212u,3489661056u}/* 114BA */, /*7815*/{2040004608u,868352u,8126464u,100678146u,808846064u,132100u,268435584u}/* 114BB */, /*7816*/{2040528896u,868352u,8126464u,100678146u,808846064u,132100u,268435584u}/* 114BC */, /*7817*/{2041053184u,868352u,8126464u,100678146u,808846064u,132100u,268435584u}/* 114BE */, /*7818*/{0,868352u,8126464u,369899904u,808714928u,2148631556u,3221225600u}/* 114C2 */, /*7819*/{0,868352u,8126464u,235682176u,808714928u,2148598788u,3221225600u}/* 114C3 */, /*7820*/{0,868352u,8126465u,100664768u,688u,131072u,3222274048u}/* 114C6 */, /*7821*/{0,868352u,41681921u,100694592u,44047024u,132097u,3221225600u}/* 114D0 */, /*7822*/{0,868352u,461112833u,100694592u,44047024u,132097u,3221225600u}/* 114D1 */, /*7823*/{0,868352u,494668289u,100694592u,44047024u,132097u,3221225600u}/* 114D2 */, /*7824*/{0,868352u,528222209u,100694592u,44047024u,132097u,3221225600u}/* 114D3 */, /*7825*/{0,868352u,561778689u,100694592u,44047024u,132097u,3221225600u}/* 114D4 */, /*7826*/{0,868352u,595332097u,100694592u,44047024u,132097u,3221225600u}/* 114D5 */, /*7827*/{0,868352u,628889089u,100694592u,44047024u,132097u,3221225600u}/* 114D6 */, /*7828*/{0,868352u,662441473u,100694592u,44047024u,132097u,3221225600u}/* 114D7 */, /*7829*/{0,868352u,695999489u,100694592u,44047024u,132097u,3221225600u}/* 114D8 */, /*7830*/{0,868352u,729551873u,100694592u,44047024u,132097u,3221225600u}/* 114D9 */, /*7831*/{0,872448u,7995393u,100686144u,9437936u,132672u,3221225664u}/* 11580 */, /*7832*/{0,872448u,7995392u,100678144u,808715632u,66564u,3556769920u}/* 115AF */, /*7833*/{0,872448u,7995392u,100678144u,808846064u,132100u,3489661056u}/* 115B0 */, /*7834*/{0,872448u,7995392u,101464448u,808714992u,2147550212u,3489661056u}/* 115B2 */, /*7835*/{2041577472u,872448u,7995392u,100678146u,808846064u,132100u,268435584u}/* 115BA */, /*7836*/{2042101760u,872448u,7995392u,100678146u,808846064u,132100u,268435584u}/* 115BB */, /*7837*/{0,872448u,7995392u,369899904u,808714928u,2148631556u,3221225600u}/* 115BF */, /*7838*/{0,872448u,7995392u,235682176u,808714928u,2148598788u,3221225600u}/* 115C0 */, /*7839*/{0,872448u,7995393u,100664768u,688u,131072u,3222274048u}/* 115C1 */, /*7840*/{0,872448u,7995393u,100664768u,12583600u,131072u,3222294528u}/* 115C2 */, /*7841*/{0,872448u,7995393u,100664768u,688u,131072u,3222278144u}/* 115C4 */, /*7842*/{0,872448u,7995393u,100664768u,688u,655360u,3222274048u}/* 115C6 */, /*7843*/{0,872448u,7995393u,102761920u,12583600u,131072u,3222294528u}/* 115CA */, /*7844*/{0,872448u,7995393u,102783296u,9437936u,132672u,3221225664u}/* 115D8 */, /*7845*/{0,872448u,7995392u,103561600u,808714992u,2147550212u,3489661056u}/* 115DC */, /*7846*/{0,876544u,7471105u,100686144u,9437936u,132672u,3221225664u}/* 11600 */, /*7847*/{0,876544u,7471104u,100678144u,808846064u,132100u,3489661056u}/* 11630 */, /*7848*/{0,876544u,7471104u,101464448u,808714992u,2147550212u,3489661056u}/* 11633 */, /*7849*/{0,876544u,7471104u,369899904u,808714928u,2148631556u,3221225600u}/* 1163F */, /*7850*/{0,876544u,7471105u,100664768u,12583600u,131072u,3222294528u}/* 11641 */, /*7851*/{0,876544u,7471105u,100664768u,688u,131072u,3222274048u}/* 11643 */, /*7852*/{0,876544u,41026561u,100694592u,44047024u,132097u,3221225600u}/* 11650 */, /*7853*/{0,876544u,460457473u,100694592u,44047024u,132097u,3221225600u}/* 11651 */, /*7854*/{0,876544u,494012929u,100694592u,44047024u,132097u,3221225600u}/* 11652 */, /*7855*/{0,876544u,527566849u,100694592u,44047024u,132097u,3221225600u}/* 11653 */, /*7856*/{0,876544u,561123329u,100694592u,44047024u,132097u,3221225600u}/* 11654 */, /*7857*/{0,876544u,594676737u,100694592u,44047024u,132097u,3221225600u}/* 11655 */, /*7858*/{0,876544u,628233729u,100694592u,44047024u,132097u,3221225600u}/* 11656 */, /*7859*/{0,876544u,661786113u,100694592u,44047024u,132097u,3221225600u}/* 11657 */, /*7860*/{0,876544u,695344129u,100694592u,44047024u,132097u,3221225600u}/* 11658 */, /*7861*/{0,876544u,728896513u,100694592u,44047024u,132097u,3221225600u}/* 11659 */, /*7862*/{0,880640u,6684673u,94394688u,9437936u,132672u,3221225664u}/* 11680 */, /*7863*/{0,880640u,6684672u,95172992u,808714992u,2147550212u,3489661056u}/* 116AB */, /*7864*/{0,880640u,6684672u,94386688u,808846064u,132100u,3489661056u}/* 116AC */, /*7865*/{0,880640u,6684672u,362822144u,808846000u,1213444u,3221225600u}/* 116B6 */, /*7866*/{0,880640u,6684672u,229390720u,808714928u,2148598788u,3221225600u}/* 116B7 */, /*7867*/{0,880640u,40240129u,94403136u,44047024u,132097u,3221225600u}/* 116C0 */, /*7868*/{0,880640u,459671041u,94403136u,44047024u,132097u,3221225600u}/* 116C1 */, /*7869*/{0,880640u,493226497u,94403136u,44047024u,132097u,3221225600u}/* 116C2 */, /*7870*/{0,880640u,526780417u,94403136u,44047024u,132097u,3221225600u}/* 116C3 */, /*7871*/{0,880640u,560336897u,94403136u,44047024u,132097u,3221225600u}/* 116C4 */, /*7872*/{0,880640u,593890305u,94403136u,44047024u,132097u,3221225600u}/* 116C5 */, /*7873*/{0,880640u,627447297u,94403136u,44047024u,132097u,3221225600u}/* 116C6 */, /*7874*/{0,880640u,660999681u,94403136u,44047024u,132097u,3221225600u}/* 116C7 */, /*7875*/{0,880640u,694557697u,94403136u,44047024u,132097u,3221225600u}/* 116C8 */, /*7876*/{0,880640u,728110081u,94403136u,44047024u,132097u,3221225600u}/* 116C9 */, /*7877*/{0,884736u,8257537u,102760768u,9437936u,132672u,3221225664u}/* 11700 */, /*7878*/{0,884736u,8257536u,103561600u,3408624u,2147550212u,3489661056u}/* 1171D */, /*7879*/{0,884736u,8257536u,102775296u,3539696u,132100u,3489661056u}/* 11720 */, /*7880*/{0,884736u,8257536u,371997056u,3408560u,2148631556u,3221225600u}/* 1172B */, /*7881*/{0,884736u,41812993u,102791744u,44047024u,132097u,3221225600u}/* 11730 */, /*7882*/{0,884736u,461243905u,102791744u,44047024u,132097u,3221225600u}/* 11731 */, /*7883*/{0,884736u,494799361u,102791744u,44047024u,132097u,3221225600u}/* 11732 */, /*7884*/{0,884736u,528353281u,102791744u,44047024u,132097u,3221225600u}/* 11733 */, /*7885*/{0,884736u,561909761u,102791744u,44047024u,132097u,3221225600u}/* 11734 */, /*7886*/{0,884736u,595463169u,102791744u,44047024u,132097u,3221225600u}/* 11735 */, /*7887*/{0,884736u,629020161u,102791744u,44047024u,132097u,3221225600u}/* 11736 */, /*7888*/{0,884736u,662572545u,102791744u,44047024u,132097u,3221225600u}/* 11737 */, /*7889*/{0,884736u,696130561u,102791744u,44047024u,132097u,3221225600u}/* 11738 */, /*7890*/{0,884736u,729682945u,102791744u,44047024u,132097u,3221225600u}/* 11739 */, /*7891*/{0,884736u,746463233u,102761152u,33557168u,131073u,3221225472u}/* 1173A */, /*7892*/{0,884736u,914238465u,102761152u,33557168u,131073u,3221225472u}/* 1173B */, /*7893*/{0,884736u,8257537u,102761920u,12583600u,131072u,3222294528u}/* 1173C */, /*7894*/{0,884736u,8257537u,102762176u,688u,131072u,3221258240u}/* 1173F */, /*7895*/{308096u,2488111104u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A0 */, /*7896*/{308224u,2490208256u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A1 */, /*7897*/{308352u,2492305408u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A2 */, /*7898*/{308480u,2494402560u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A3 */, /*7899*/{308608u,2496499712u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A4 */, /*7900*/{308736u,2498596864u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A5 */, /*7901*/{308864u,2500694016u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A6 */, /*7902*/{308992u,2502791168u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A7 */, /*7903*/{309120u,2504888320u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A8 */, /*7904*/{309248u,2506985472u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118A9 */, /*7905*/{309376u,2509082624u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AA */, /*7906*/{309504u,2511179776u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AB */, /*7907*/{309632u,2513276928u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AC */, /*7908*/{309760u,2515374080u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AD */, /*7909*/{309888u,2517471232u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AE */, /*7910*/{310016u,2519568384u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118AF */, /*7911*/{310144u,2521665536u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B0 */, /*7912*/{310272u,2523762688u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B1 */, /*7913*/{310400u,2525859840u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B2 */, /*7914*/{310528u,2527956992u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B3 */, /*7915*/{310656u,2530054144u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B4 */, /*7916*/{310784u,2532151296u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B5 */, /*7917*/{310912u,2534248448u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B6 */, /*7918*/{311040u,2536345600u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B7 */, /*7919*/{311168u,2538442752u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B8 */, /*7920*/{311296u,2540539904u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118B9 */, /*7921*/{311424u,2542637056u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BA */, /*7922*/{311552u,2544734208u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BB */, /*7923*/{311680u,2546831360u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BC */, /*7924*/{311808u,2548928512u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BD */, /*7925*/{311936u,2551025664u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BE */, /*7926*/{312064u,2553122816u,8192001u,100685888u,8389361u,2080507488u,3221226688u}/* 118BF */, /*7927*/{312192u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C0 */, /*7928*/{312320u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C1 */, /*7929*/{312448u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C2 */, /*7930*/{312576u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C3 */, /*7931*/{312704u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C4 */, /*7932*/{312832u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C5 */, /*7933*/{312960u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C6 */, /*7934*/{313088u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C7 */, /*7935*/{313216u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C8 */, /*7936*/{313344u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118C9 */, /*7937*/{313472u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CA */, /*7938*/{313600u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CB */, /*7939*/{313728u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CC */, /*7940*/{313856u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CD */, /*7941*/{313984u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CE */, /*7942*/{314112u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118CF */, /*7943*/{314240u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D0 */, /*7944*/{314368u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D1 */, /*7945*/{314496u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D2 */, /*7946*/{314624u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D3 */, /*7947*/{314752u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D4 */, /*7948*/{314880u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D5 */, /*7949*/{315008u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D6 */, /*7950*/{315136u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D7 */, /*7951*/{315264u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D8 */, /*7952*/{315392u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118D9 */, /*7953*/{315520u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DA */, /*7954*/{315648u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DB */, /*7955*/{315776u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DC */, /*7956*/{315904u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DD */, /*7957*/{316032u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DE */, /*7958*/{316160u,888832u,8192001u,100685952u,7340784u,1392641640u,3221225664u}/* 118DF */, /*7959*/{0,888832u,41747457u,100694592u,44047024u,132097u,3221225600u}/* 118E0 */, /*7960*/{0,888832u,461178369u,100694592u,44047024u,132097u,3221225600u}/* 118E1 */, /*7961*/{0,888832u,494733825u,100694592u,44047024u,132097u,3221225600u}/* 118E2 */, /*7962*/{0,888832u,528287745u,100694592u,44047024u,132097u,3221225600u}/* 118E3 */, /*7963*/{0,888832u,561844225u,100694592u,44047024u,132097u,3221225600u}/* 118E4 */, /*7964*/{0,888832u,595397633u,100694592u,44047024u,132097u,3221225600u}/* 118E5 */, /*7965*/{0,888832u,628954625u,100694592u,44047024u,132097u,3221225600u}/* 118E6 */, /*7966*/{0,888832u,662507009u,100694592u,44047024u,132097u,3221225600u}/* 118E7 */, /*7967*/{0,888832u,696065025u,100694592u,44047024u,132097u,3221225600u}/* 118E8 */, /*7968*/{0,888832u,729617409u,100694592u,44047024u,132097u,3221225600u}/* 118E9 */, /*7969*/{0,888832u,746397697u,100664000u,33557168u,131073u,3221225472u}/* 118EA */, /*7970*/{0,888832u,914172929u,100664000u,33557168u,131073u,3221225472u}/* 118EB */, /*7971*/{0,888832u,1081950209u,100664000u,33557168u,131073u,3221225472u}/* 118EC */, /*7972*/{0,888832u,1249727489u,100664000u,33557168u,131073u,3221225472u}/* 118ED */, /*7973*/{0,888832u,1417504769u,100664000u,33557168u,131073u,3221225472u}/* 118EE */, /*7974*/{0,888832u,1434282497u,100664000u,33557168u,131073u,3221225472u}/* 118EF */, /*7975*/{0,888832u,1451060225u,100664000u,33557168u,131073u,3221225472u}/* 118F0 */, /*7976*/{0,888832u,1467837953u,100664000u,33557168u,131073u,3221225472u}/* 118F1 */, /*7977*/{0,888832u,1484615681u,100664000u,33557168u,131073u,3221225472u}/* 118F2 */, /*7978*/{0,888832u,8192001u,100686144u,9437936u,132672u,3221225664u}/* 118FF */, /*7979*/{0,892928u,7798785u,100686144u,9437936u,132672u,3221225664u}/* 11AC0 */, /*7980*/{0,897024u,4128769u,86006080u,9437936u,132672u,3221225664u}/* 12000 */, /*7981*/{0,897024u,4128769u,100686144u,9437936u,132672u,3221225664u}/* 1236F */, /*7982*/{0,897024u,4128769u,102783296u,9437936u,132672u,3221225664u}/* 12399 */, /*7983*/{0,901120u,490670593u,86006400u,42994416u,132609u,3221225664u}/* 12400 */, /*7984*/{0,901120u,524224513u,86006400u,42994416u,132609u,3221225664u}/* 12401 */, /*7985*/{0,901120u,557780993u,86006400u,42994416u,132609u,3221225664u}/* 12402 */, /*7986*/{0,901120u,591334401u,86006400u,42994416u,132609u,3221225664u}/* 12403 */, /*7987*/{0,901120u,624891393u,86006400u,42994416u,132609u,3221225664u}/* 12404 */, /*7988*/{0,901120u,658443777u,86006400u,42994416u,132609u,3221225664u}/* 12405 */, /*7989*/{0,901120u,692001793u,86006400u,42994416u,132609u,3221225664u}/* 12406 */, /*7990*/{0,901120u,725554177u,86006400u,42994416u,132609u,3221225664u}/* 12407 */, /*7991*/{0,901120u,457115137u,86006400u,42994416u,132609u,3221225664u}/* 12415 */, /*7992*/{0,901120u,1983884289u,86006400u,42994416u,132609u,3221225664u}/* 12432 */, /*7993*/{0,901120u,2034217473u,86006400u,42994416u,132609u,3221225664u}/* 12433 */, /*7994*/{0,901120u,222234113u,86006400u,210766576u,132609u,3221225664u}/* 1245A */, /*7995*/{0,901120u,356452865u,86006400u,210766576u,132609u,3221225664u}/* 1245B */, /*7996*/{0,901120u,406785025u,86006400u,160434928u,132609u,3221225664u}/* 1245C */, /*7997*/{0,901120u,121570817u,86006400u,126880496u,132609u,3221225664u}/* 1245F */, /*7998*/{0,901120u,205456897u,86006400u,193989360u,132609u,3221225664u}/* 12460 */, /*7999*/{0,901120u,155125249u,86006400u,160434928u,132609u,3221225664u}/* 12461 */, /*8000*/{0,901120u,205456897u,100686464u,193989360u,132609u,3221225664u}/* 12463 */, /*8001*/{0,901120u,289342977u,100686464u,26217200u,132609u,3221225664u}/* 12464 */, /*8002*/{0,901120u,222234113u,100686464u,210766576u,132609u,3221225664u}/* 12465 */, /*8003*/{0,901120u,356452865u,100686464u,210766576u,132609u,3221225664u}/* 12466 */, /*8004*/{0,901120u,1245664257u,100686464u,42994416u,132609u,3221225664u}/* 12467 */, /*8005*/{0,901120u,1413441537u,100686464u,42994416u,132609u,3221225664u}/* 12468 */, /*8006*/{0,901120u,557780993u,100686464u,42994416u,132609u,3221225664u}/* 12469 */, /*8007*/{0,901120u,591334401u,100686464u,42994416u,132609u,3221225664u}/* 1246A */, /*8008*/{0,901120u,624891393u,100686464u,42994416u,132609u,3221225664u}/* 1246B */, /*8009*/{0,901120u,658443777u,100686464u,42994416u,132609u,3221225664u}/* 1246C */, /*8010*/{0,901120u,692001793u,100686464u,42994416u,132609u,3221225664u}/* 1246D */, /*8011*/{0,901120u,725554177u,100686464u,42994416u,132609u,3221225664u}/* 1246E */, /*8012*/{0,901120u,4128769u,85984704u,688u,131072u,3222278144u}/* 12470 */, /*8013*/{0,901120u,4128769u,100664768u,688u,131072u,3222278144u}/* 12474 */, /*8014*/{0,905216u,4128769u,102783296u,9437936u,132672u,3221225664u}/* 12480 */, /*8015*/{0,909312u,5308417u,90200384u,9437936u,132672u,3221225664u}/* 13000 */, /*8016*/{0,913408u,8323073u,102783296u,9437936u,132672u,3221225664u}/* 14400 */, /*8017*/{0,917504u,5505025u,92297536u,9437936u,132672u,3221225664u}/* 16800 */, /*8018*/{0,921600u,7536641u,100686144u,9437936u,132672u,3221225664u}/* 16A40 */, /*8019*/{0,921600u,41092097u,100694592u,44047024u,132097u,3221225600u}/* 16A60 */, /*8020*/{0,921600u,460523009u,100694592u,44047024u,132097u,3221225600u}/* 16A61 */, /*8021*/{0,921600u,494078465u,100694592u,44047024u,132097u,3221225600u}/* 16A62 */, /*8022*/{0,921600u,527632385u,100694592u,44047024u,132097u,3221225600u}/* 16A63 */, /*8023*/{0,921600u,561188865u,100694592u,44047024u,132097u,3221225600u}/* 16A64 */, /*8024*/{0,921600u,594742273u,100694592u,44047024u,132097u,3221225600u}/* 16A65 */, /*8025*/{0,921600u,628299265u,100694592u,44047024u,132097u,3221225600u}/* 16A66 */, /*8026*/{0,921600u,661851649u,100694592u,44047024u,132097u,3221225600u}/* 16A67 */, /*8027*/{0,921600u,695409665u,100694592u,44047024u,132097u,3221225600u}/* 16A68 */, /*8028*/{0,921600u,728962049u,100694592u,44047024u,132097u,3221225600u}/* 16A69 */, /*8029*/{0,921600u,7536641u,100664768u,12583600u,131072u,3222294528u}/* 16A6E */, /*8030*/{0,925696u,6815745u,100686144u,9437936u,132672u,3221225664u}/* 16AD0 */, /*8031*/{0,925696u,6815744u,168573312u,808714928u,2148598788u,3221225600u}/* 16AF0 */, /*8032*/{0,925696u,6815745u,100664768u,12583600u,131072u,3222294528u}/* 16AF5 */, /*8033*/{0,929792u,7077889u,100686144u,9437936u,132672u,3221225664u}/* 16B00 */, /*8034*/{0,929792u,7077888u,3456907648u,808714992u,2147550212u,3489661056u}/* 16B30 */, /*8035*/{0,929792u,7077889u,100664768u,12583600u,131072u,3222294528u}/* 16B37 */, /*8036*/{0,929792u,7077889u,100664768u,688u,131072u,3222278144u}/* 16B39 */, /*8037*/{0,929792u,7077889u,100664768u,688u,131072u,3222274048u}/* 16B3A */, /*8038*/{0,929792u,7077889u,100665024u,688u,131072u,3221258240u}/* 16B3C */, /*8039*/{0,929792u,7077889u,100686080u,9437936u,2147616320u,3221225664u}/* 16B40 */, /*8040*/{0,929792u,7077889u,100686080u,9437936u,2148140608u,3221225664u}/* 16B42 */, /*8041*/{0,929792u,40633345u,100694592u,44047024u,132097u,3221225600u}/* 16B50 */, /*8042*/{0,929792u,460064257u,100694592u,44047024u,132097u,3221225600u}/* 16B51 */, /*8043*/{0,929792u,493619713u,100694592u,44047024u,132097u,3221225600u}/* 16B52 */, /*8044*/{0,929792u,527173633u,100694592u,44047024u,132097u,3221225600u}/* 16B53 */, /*8045*/{0,929792u,560730113u,100694592u,44047024u,132097u,3221225600u}/* 16B54 */, /*8046*/{0,929792u,594283521u,100694592u,44047024u,132097u,3221225600u}/* 16B55 */, /*8047*/{0,929792u,627840513u,100694592u,44047024u,132097u,3221225600u}/* 16B56 */, /*8048*/{0,929792u,661392897u,100694592u,44047024u,132097u,3221225600u}/* 16B57 */, /*8049*/{0,929792u,694950913u,100694592u,44047024u,132097u,3221225600u}/* 16B58 */, /*8050*/{0,929792u,728503297u,100694592u,44047024u,132097u,3221225600u}/* 16B59 */, /*8051*/{0,929792u,745283585u,100664000u,33557168u,131073u,3221225472u}/* 16B5B */, /*8052*/{0,929792u,1500279297u,100664000u,33557168u,131073u,3221225472u}/* 16B5C */, /*8053*/{0,929792u,1802278401u,100664000u,33557168u,131073u,3221225472u}/* 16B5D */, /*8054*/{0,929792u,2137832961u,100664000u,33557168u,131073u,3221225472u}/* 16B5E */, /*8055*/{0,929792u,2154610689u,100664000u,33557168u,131073u,3221225472u}/* 16B5F */, /*8056*/{0,929792u,2171388417u,100664000u,33557168u,131073u,3221225472u}/* 16B60 */, /*8057*/{0,929792u,2188166145u,100664000u,33557168u,131073u,3221225472u}/* 16B61 */, /*8058*/{0,933888u,6488065u,94394688u,9437936u,132672u,3221225664u}/* 16F00 */, /*8059*/{0,933888u,6488064u,94386688u,808846064u,132100u,3489661056u}/* 16F51 */, /*8060*/{0,933888u,6488064u,95172992u,808714928u,2148598788u,3221225600u}/* 16F8F */, /*8061*/{0,933888u,6488065u,94394624u,9437936u,2148664896u,3221225664u}/* 16F93 */, /*8062*/{0,937984u,2228225u,92295488u,9437936u,132672u,3221225664u}/* 1B000 */, /*8063*/{0,937984u,2162689u,92275008u,9437936u,132672u,3221225664u}/* 1B001 */, /*8064*/{0,942080u,6881281u,100686144u,9437936u,132672u,3221225664u}/* 1BC00 */, /*8065*/{0,942080u,6881281u,100665024u,688u,131072u,3221258240u}/* 1BC9C */, /*8066*/{0,942080u,6881280u,101464448u,808714928u,2147550212u,3221225600u}/* 1BC9D */, /*8067*/{0,942080u,6881280u,168573312u,808714992u,2147550212u,3489661056u}/* 1BC9E */, /*8068*/{0,942080u,6881281u,100664768u,12583600u,131072u,3222294528u}/* 1BC9F */, /*8069*/{0,946176u,65537u,101403648u,810746546u,2218786816u,3221225472u}/* 1BCA0 */, /*8070*/{0,950272u,65537u,77596352u,688u,131072u,3221258240u}/* 1D000 */, /*8071*/{0,954368u,65537u,77596352u,688u,131072u,3221258240u}/* 1D100 */, /*8072*/{0,954368u,65537u,88082112u,688u,131072u,3221258240u}/* 1D129 */, /*8073*/{2042626048u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D15E */, /*8074*/{2043150336u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D15F */, /*8075*/{2043674624u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D160 */, /*8076*/{2044198912u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D161 */, /*8077*/{2044723200u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D162 */, /*8078*/{2045247488u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D163 */, /*8079*/{2045771776u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D164 */, /*8080*/{0,954368u,65536u,2963290624u,808714928u,66564u,3288334464u}/* 1D165 */, /*8081*/{0,954368u,65536u,2963290624u,808846000u,132100u,3221225600u}/* 1D166 */, /*8082*/{0,954368u,2686976u,145504640u,808714928u,2148598788u,3221225600u}/* 1D167 */, /*8083*/{0,954368u,65536u,3298834944u,808846000u,1180676u,3221225600u}/* 1D16D */, /*8084*/{0,954368u,65536u,2963290624u,808714928u,1115140u,3288334464u}/* 1D16E */, /*8085*/{0,954368u,65537u,78334976u,810746546u,2218786816u,3221225472u}/* 1D173 */, /*8086*/{0,954368u,2686976u,3098294656u,808714928u,2148598788u,3221225600u}/* 1D17B */, /*8087*/{0,954368u,2686976u,3433838976u,808714928u,2148598788u,3221225600u}/* 1D185 */, /*8088*/{2046296064u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1BB */, /*8089*/{2046820352u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1BC */, /*8090*/{2047344640u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1BD */, /*8091*/{2047868928u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1BE */, /*8092*/{2048393216u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1BF */, /*8093*/{2048917504u,954368u,65536u,77596354u,48u,67502080u,32768u}/* 1D1C0 */, /*8094*/{0,954368u,65537u,102762176u,688u,131072u,3221258240u}/* 1D1DE */, /*8095*/{0,958464u,196609u,84543168u,688u,131072u,3221258240u}/* 1D200 */, /*8096*/{0,958464u,196608u,3440130432u,808714928u,2147550212u,3221225600u}/* 1D242 */, /*8097*/{0,962560u,65537u,82446016u,688u,131072u,3221258240u}/* 1D300 */, /*8098*/{0,966656u,453051905u,85983936u,33557168u,131073u,3221225472u}/* 1D360 */, /*8099*/{0,966656u,486607361u,85983936u,33557168u,131073u,3221225472u}/* 1D361 */, /*8100*/{0,966656u,520161281u,85983936u,33557168u,131073u,3221225472u}/* 1D362 */, /*8101*/{0,966656u,553717761u,85983936u,33557168u,131073u,3221225472u}/* 1D363 */, /*8102*/{0,966656u,587271169u,85983936u,33557168u,131073u,3221225472u}/* 1D364 */, /*8103*/{0,966656u,620828161u,85983936u,33557168u,131073u,3221225472u}/* 1D365 */, /*8104*/{0,966656u,654380545u,85983936u,33557168u,131073u,3221225472u}/* 1D366 */, /*8105*/{0,966656u,687938561u,85983936u,33557168u,131073u,3221225472u}/* 1D367 */, /*8106*/{0,966656u,721490945u,85983936u,33557168u,131073u,3221225472u}/* 1D368 */, /*8107*/{0,966656u,738271233u,85983936u,33557168u,131073u,3221225472u}/* 1D369 */, /*8108*/{0,966656u,906046465u,85983936u,33557168u,131073u,3221225472u}/* 1D36A */, /*8109*/{0,966656u,1073823745u,85983936u,33557168u,131073u,3221225472u}/* 1D36B */, /*8110*/{0,966656u,1241601025u,85983936u,33557168u,131073u,3221225472u}/* 1D36C */, /*8111*/{0,966656u,1409378305u,85983936u,33557168u,131073u,3221225472u}/* 1D36D */, /*8112*/{0,966656u,1426156033u,85983936u,33557168u,131073u,3221225472u}/* 1D36E */, /*8113*/{0,966656u,1442933761u,85983936u,33557168u,131073u,3221225472u}/* 1D36F */, /*8114*/{0,966656u,1459711489u,85983936u,33557168u,131073u,3221225472u}/* 1D370 */, /*8115*/{0,966656u,1476489217u,85983936u,33557168u,131073u,3221225472u}/* 1D371 */, /*8116*/{2049441792u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D400 */, /*8117*/{2049966080u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D401 */, /*8118*/{2050490368u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D402 */, /*8119*/{2051014656u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D403 */, /*8120*/{2051538944u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D404 */, /*8121*/{2052063232u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D405 */, /*8122*/{2052587520u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D406 */, /*8123*/{2053111808u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D407 */, /*8124*/{2053636096u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D408 */, /*8125*/{2054160384u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D409 */, /*8126*/{2054684672u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40A */, /*8127*/{2055208960u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40B */, /*8128*/{2055733248u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40C */, /*8129*/{2056257536u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40D */, /*8130*/{2056781824u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40E */, /*8131*/{2057306112u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D40F */, /*8132*/{2057830400u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D410 */, /*8133*/{2058354688u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D411 */, /*8134*/{2058878976u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D412 */, /*8135*/{2059403264u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D413 */, /*8136*/{2059927552u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D414 */, /*8137*/{2060451840u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D415 */, /*8138*/{2060976128u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D416 */, /*8139*/{2061500416u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D417 */, /*8140*/{2062024704u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D418 */, /*8141*/{2062548992u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D419 */, /*8142*/{2063073280u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41A */, /*8143*/{2063597568u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41B */, /*8144*/{2064121856u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41C */, /*8145*/{2064646144u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41D */, /*8146*/{2065170432u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41E */, /*8147*/{2065694720u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D41F */, /*8148*/{2066219008u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D420 */, /*8149*/{2066743296u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D421 */, /*8150*/{2067267584u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D422 */, /*8151*/{2067791872u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D423 */, /*8152*/{2068316160u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D424 */, /*8153*/{2068840448u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D425 */, /*8154*/{2069364736u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D426 */, /*8155*/{2069889024u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D427 */, /*8156*/{2070413312u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D428 */, /*8157*/{2070937600u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D429 */, /*8158*/{2071461888u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42A */, /*8159*/{2071986176u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42B */, /*8160*/{2072510464u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42C */, /*8161*/{2073034752u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42D */, /*8162*/{2073559040u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42E */, /*8163*/{2074083328u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D42F */, /*8164*/{2074607616u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D430 */, /*8165*/{2075131904u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D431 */, /*8166*/{2075656192u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D432 */, /*8167*/{2076180480u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D433 */, /*8168*/{2076704768u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D434 */, /*8169*/{2077229056u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D435 */, /*8170*/{2077753344u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D436 */, /*8171*/{2078277632u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D437 */, /*8172*/{2078801920u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D438 */, /*8173*/{2079326208u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D439 */, /*8174*/{2079850496u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43A */, /*8175*/{2080374784u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43B */, /*8176*/{2080899072u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43C */, /*8177*/{2081423360u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43D */, /*8178*/{2081947648u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43E */, /*8179*/{2082471936u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D43F */, /*8180*/{2082996224u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D440 */, /*8181*/{2083520512u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D441 */, /*8182*/{2084044800u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D442 */, /*8183*/{2084569088u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D443 */, /*8184*/{2085093376u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D444 */, /*8185*/{2085617664u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D445 */, /*8186*/{2086141952u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D446 */, /*8187*/{2086666240u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D447 */, /*8188*/{2087190528u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D448 */, /*8189*/{2087714816u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D449 */, /*8190*/{2088239104u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D44A */, /*8191*/{2088763392u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D44B */, /*8192*/{2089287680u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D44C */, /*8193*/{2089811968u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D44D */, /*8194*/{2090336256u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D44E */, /*8195*/{2090860544u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D44F */, /*8196*/{2091384832u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D450 */, /*8197*/{2091909120u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D451 */, /*8198*/{2092433408u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D452 */, /*8199*/{2092957696u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D453 */, /*8200*/{2093481984u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D454 */, /*8201*/{2094006272u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D456 */, /*8202*/{2094530560u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D457 */, /*8203*/{2095054848u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D458 */, /*8204*/{2095579136u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D459 */, /*8205*/{2096103424u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45A */, /*8206*/{2096627712u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45B */, /*8207*/{2097152000u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45C */, /*8208*/{2097676288u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45D */, /*8209*/{2098200576u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45E */, /*8210*/{2098724864u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D45F */, /*8211*/{2099249152u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D460 */, /*8212*/{2099773440u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D461 */, /*8213*/{2100297728u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D462 */, /*8214*/{2100822016u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D463 */, /*8215*/{2101346304u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D464 */, /*8216*/{2101870592u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D465 */, /*8217*/{2102394880u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D466 */, /*8218*/{2102919168u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D467 */, /*8219*/{2103443456u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D468 */, /*8220*/{2103967744u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D469 */, /*8221*/{2104492032u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46A */, /*8222*/{2105016320u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46B */, /*8223*/{2105540608u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46C */, /*8224*/{2106064896u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46D */, /*8225*/{2106589184u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46E */, /*8226*/{2107113472u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D46F */, /*8227*/{2107637760u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D470 */, /*8228*/{2108162048u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D471 */, /*8229*/{2108686336u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D472 */, /*8230*/{2109210624u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D473 */, /*8231*/{2109734912u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D474 */, /*8232*/{2110259200u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D475 */, /*8233*/{2110783488u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D476 */, /*8234*/{2111307776u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D477 */, /*8235*/{2111832064u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D478 */, /*8236*/{2112356352u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D479 */, /*8237*/{2112880640u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47A */, /*8238*/{2113404928u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47B */, /*8239*/{2113929216u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47C */, /*8240*/{2114453504u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47D */, /*8241*/{2114977792u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47E */, /*8242*/{2115502080u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D47F */, /*8243*/{2116026368u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D480 */, /*8244*/{2116550656u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D481 */, /*8245*/{2117074944u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D482 */, /*8246*/{2117599232u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D483 */, /*8247*/{2118123520u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D484 */, /*8248*/{2118647808u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D485 */, /*8249*/{2119172096u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D486 */, /*8250*/{2119696384u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D487 */, /*8251*/{2120220672u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D488 */, /*8252*/{2120744960u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D489 */, /*8253*/{2121269248u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D48A */, /*8254*/{2121793536u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D48B */, /*8255*/{2122317824u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D48C */, /*8256*/{2122842112u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D48D */, /*8257*/{2123366400u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D48E */, /*8258*/{2123890688u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D48F */, /*8259*/{2124414976u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D490 */, /*8260*/{2124939264u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D491 */, /*8261*/{2125463552u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D492 */, /*8262*/{2125987840u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D493 */, /*8263*/{2126512128u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D494 */, /*8264*/{2127036416u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D495 */, /*8265*/{2127560704u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D496 */, /*8266*/{2128084992u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D497 */, /*8267*/{2128609280u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D498 */, /*8268*/{2129133568u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D499 */, /*8269*/{2129657856u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D49A */, /*8270*/{2130182144u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D49B */, /*8271*/{2130706432u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D49C */, /*8272*/{2131230720u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D49E */, /*8273*/{2131755008u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D49F */, /*8274*/{2132279296u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4A2 */, /*8275*/{2132803584u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4A5 */, /*8276*/{2133327872u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4A6 */, /*8277*/{2133852160u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4A9 */, /*8278*/{2134376448u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4AA */, /*8279*/{2134900736u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4AB */, /*8280*/{2135425024u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4AC */, /*8281*/{2135949312u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4AE */, /*8282*/{2136473600u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4AF */, /*8283*/{2136997888u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B0 */, /*8284*/{2137522176u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B1 */, /*8285*/{2138046464u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B2 */, /*8286*/{2138570752u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B3 */, /*8287*/{2139095040u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B4 */, /*8288*/{2139619328u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4B5 */, /*8289*/{2140143616u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4B6 */, /*8290*/{2140667904u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4B7 */, /*8291*/{2141192192u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4B8 */, /*8292*/{2141716480u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4B9 */, /*8293*/{2142240768u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4BB */, /*8294*/{2142765056u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4BD */, /*8295*/{2143289344u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D4BE */, /*8296*/{2143813632u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D4BF */, /*8297*/{2144337920u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C0 */, /*8298*/{2144862208u,970752u,65537u,81811590u,7340272u,1140983402u,2151678144u}/* 1D4C1 */, /*8299*/{2145386496u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C2 */, /*8300*/{2145910784u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C3 */, /*8301*/{2146435072u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C5 */, /*8302*/{2146959360u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C6 */, /*8303*/{2147483648u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C7 */, /*8304*/{2148007936u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C8 */, /*8305*/{2148532224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4C9 */, /*8306*/{2149056512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CA */, /*8307*/{2149580800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CB */, /*8308*/{2150105088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CC */, /*8309*/{2150629376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CD */, /*8310*/{2151153664u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CE */, /*8311*/{2151677952u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4CF */, /*8312*/{2152202240u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D0 */, /*8313*/{2152726528u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D1 */, /*8314*/{2153250816u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D2 */, /*8315*/{2153775104u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D3 */, /*8316*/{2154299392u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D4 */, /*8317*/{2154823680u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D5 */, /*8318*/{2155347968u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D6 */, /*8319*/{2155872256u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D7 */, /*8320*/{2156396544u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D8 */, /*8321*/{2156920832u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4D9 */, /*8322*/{2157445120u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DA */, /*8323*/{2157969408u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DB */, /*8324*/{2158493696u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DC */, /*8325*/{2159017984u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DD */, /*8326*/{2159542272u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DE */, /*8327*/{2160066560u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4DF */, /*8328*/{2160590848u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E0 */, /*8329*/{2161115136u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E1 */, /*8330*/{2161639424u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E2 */, /*8331*/{2162163712u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E3 */, /*8332*/{2162688000u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E4 */, /*8333*/{2163212288u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E5 */, /*8334*/{2163736576u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E6 */, /*8335*/{2164260864u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E7 */, /*8336*/{2164785152u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E8 */, /*8337*/{2165309440u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D4E9 */, /*8338*/{2165833728u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4EA */, /*8339*/{2166358016u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4EB */, /*8340*/{2166882304u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4EC */, /*8341*/{2167406592u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4ED */, /*8342*/{2167930880u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4EE */, /*8343*/{2168455168u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4EF */, /*8344*/{2168979456u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F0 */, /*8345*/{2169503744u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F1 */, /*8346*/{2170028032u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D4F2 */, /*8347*/{2170552320u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D4F3 */, /*8348*/{2171076608u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F4 */, /*8349*/{2171600896u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F5 */, /*8350*/{2172125184u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F6 */, /*8351*/{2172649472u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F7 */, /*8352*/{2173173760u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F8 */, /*8353*/{2173698048u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4F9 */, /*8354*/{2174222336u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FA */, /*8355*/{2174746624u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FB */, /*8356*/{2175270912u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FC */, /*8357*/{2175795200u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FD */, /*8358*/{2176319488u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FE */, /*8359*/{2176843776u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D4FF */, /*8360*/{2177368064u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D500 */, /*8361*/{2177892352u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D501 */, /*8362*/{2178416640u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D502 */, /*8363*/{2178940928u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D503 */, /*8364*/{2179465216u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D504 */, /*8365*/{2179989504u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D505 */, /*8366*/{2180513792u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D507 */, /*8367*/{2181038080u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D508 */, /*8368*/{2181562368u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D509 */, /*8369*/{2182086656u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D50A */, /*8370*/{2182610944u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D50D */, /*8371*/{2183135232u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D50E */, /*8372*/{2183659520u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D50F */, /*8373*/{2184183808u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D510 */, /*8374*/{2184708096u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D511 */, /*8375*/{2185232384u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D512 */, /*8376*/{2185756672u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D513 */, /*8377*/{2186280960u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D514 */, /*8378*/{2186805248u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D516 */, /*8379*/{2187329536u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D517 */, /*8380*/{2187853824u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D518 */, /*8381*/{2188378112u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D519 */, /*8382*/{2188902400u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D51A */, /*8383*/{2189426688u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D51B */, /*8384*/{2189950976u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D51C */, /*8385*/{2190475264u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D51E */, /*8386*/{2190999552u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D51F */, /*8387*/{2191523840u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D520 */, /*8388*/{2192048128u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D521 */, /*8389*/{2192572416u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D522 */, /*8390*/{2193096704u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D523 */, /*8391*/{2193620992u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D524 */, /*8392*/{2194145280u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D525 */, /*8393*/{2194669568u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D526 */, /*8394*/{2195193856u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D527 */, /*8395*/{2195718144u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D528 */, /*8396*/{2196242432u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D529 */, /*8397*/{2196766720u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52A */, /*8398*/{2197291008u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52B */, /*8399*/{2197815296u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52C */, /*8400*/{2198339584u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52D */, /*8401*/{2198863872u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52E */, /*8402*/{2199388160u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D52F */, /*8403*/{2199912448u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D530 */, /*8404*/{2200436736u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D531 */, /*8405*/{2200961024u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D532 */, /*8406*/{2201485312u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D533 */, /*8407*/{2202009600u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D534 */, /*8408*/{2202533888u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D535 */, /*8409*/{2203058176u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D536 */, /*8410*/{2203582464u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D537 */, /*8411*/{2204106752u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D538 */, /*8412*/{2204631040u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D539 */, /*8413*/{2205155328u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D53B */, /*8414*/{2205679616u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D53C */, /*8415*/{2206203904u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D53D */, /*8416*/{2206728192u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D53E */, /*8417*/{2207252480u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D540 */, /*8418*/{2207776768u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D541 */, /*8419*/{2208301056u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D542 */, /*8420*/{2208825344u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D543 */, /*8421*/{2209349632u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D544 */, /*8422*/{2209873920u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D546 */, /*8423*/{2210398208u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54A */, /*8424*/{2210922496u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54B */, /*8425*/{2211446784u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54C */, /*8426*/{2211971072u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54D */, /*8427*/{2212495360u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54E */, /*8428*/{2213019648u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D54F */, /*8429*/{2213543936u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D550 */, /*8430*/{2214068224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D552 */, /*8431*/{2214592512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D553 */, /*8432*/{2215116800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D554 */, /*8433*/{2215641088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D555 */, /*8434*/{2216165376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D556 */, /*8435*/{2216689664u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D557 */, /*8436*/{2217213952u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D558 */, /*8437*/{2217738240u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D559 */, /*8438*/{2218262528u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D55A */, /*8439*/{2218786816u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D55B */, /*8440*/{2219311104u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D55C */, /*8441*/{2219835392u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D55D */, /*8442*/{2220359680u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D55E */, /*8443*/{2220883968u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D55F */, /*8444*/{2221408256u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D560 */, /*8445*/{2221932544u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D561 */, /*8446*/{2222456832u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D562 */, /*8447*/{2222981120u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D563 */, /*8448*/{2223505408u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D564 */, /*8449*/{2224029696u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D565 */, /*8450*/{2224553984u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D566 */, /*8451*/{2225078272u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D567 */, /*8452*/{2225602560u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D568 */, /*8453*/{2226126848u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D569 */, /*8454*/{2226651136u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D56A */, /*8455*/{2227175424u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D56B */, /*8456*/{2227699712u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D56C */, /*8457*/{2228224000u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D56D */, /*8458*/{2228748288u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D56E */, /*8459*/{2229272576u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D56F */, /*8460*/{2229796864u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D570 */, /*8461*/{2230321152u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D571 */, /*8462*/{2230845440u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D572 */, /*8463*/{2231369728u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D573 */, /*8464*/{2231894016u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D574 */, /*8465*/{2232418304u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D575 */, /*8466*/{2232942592u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D576 */, /*8467*/{2233466880u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D577 */, /*8468*/{2233991168u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D578 */, /*8469*/{2234515456u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D579 */, /*8470*/{2235039744u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57A */, /*8471*/{2235564032u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57B */, /*8472*/{2236088320u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57C */, /*8473*/{2236612608u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57D */, /*8474*/{2237136896u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57E */, /*8475*/{2237661184u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D57F */, /*8476*/{2238185472u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D580 */, /*8477*/{2238709760u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D581 */, /*8478*/{2239234048u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D582 */, /*8479*/{2239758336u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D583 */, /*8480*/{2240282624u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D584 */, /*8481*/{2240806912u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D585 */, /*8482*/{2241331200u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D586 */, /*8483*/{2241855488u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D587 */, /*8484*/{2242379776u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D588 */, /*8485*/{2242904064u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D589 */, /*8486*/{2243428352u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D58A */, /*8487*/{2243952640u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D58B */, /*8488*/{2244476928u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D58C */, /*8489*/{2245001216u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D58D */, /*8490*/{2245525504u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D58E */, /*8491*/{2246049792u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D58F */, /*8492*/{2246574080u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D590 */, /*8493*/{2247098368u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D591 */, /*8494*/{2247622656u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D592 */, /*8495*/{2248146944u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D593 */, /*8496*/{2248671232u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D594 */, /*8497*/{2249195520u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D595 */, /*8498*/{2249719808u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D596 */, /*8499*/{2250244096u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D597 */, /*8500*/{2250768384u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D598 */, /*8501*/{2251292672u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D599 */, /*8502*/{2251816960u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59A */, /*8503*/{2252341248u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59B */, /*8504*/{2252865536u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59C */, /*8505*/{2253389824u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59D */, /*8506*/{2253914112u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59E */, /*8507*/{2254438400u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D59F */, /*8508*/{2254962688u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A0 */, /*8509*/{2255486976u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A1 */, /*8510*/{2256011264u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A2 */, /*8511*/{2256535552u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A3 */, /*8512*/{2257059840u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A4 */, /*8513*/{2257584128u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A5 */, /*8514*/{2258108416u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A6 */, /*8515*/{2258632704u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A7 */, /*8516*/{2259156992u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A8 */, /*8517*/{2259681280u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5A9 */, /*8518*/{2260205568u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AA */, /*8519*/{2260729856u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AB */, /*8520*/{2261254144u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AC */, /*8521*/{2261778432u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AD */, /*8522*/{2262302720u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AE */, /*8523*/{2262827008u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5AF */, /*8524*/{2263351296u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B0 */, /*8525*/{2263875584u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B1 */, /*8526*/{2264399872u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B2 */, /*8527*/{2264924160u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B3 */, /*8528*/{2265448448u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B4 */, /*8529*/{2265972736u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B5 */, /*8530*/{2266497024u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B6 */, /*8531*/{2267021312u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B7 */, /*8532*/{2267545600u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B8 */, /*8533*/{2268069888u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5B9 */, /*8534*/{2268594176u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BA */, /*8535*/{2269118464u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BB */, /*8536*/{2269642752u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BC */, /*8537*/{2270167040u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BD */, /*8538*/{2270691328u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BE */, /*8539*/{2271215616u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5BF */, /*8540*/{2271739904u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C0 */, /*8541*/{2272264192u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C1 */, /*8542*/{2272788480u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D5C2 */, /*8543*/{2273312768u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D5C3 */, /*8544*/{2273837056u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C4 */, /*8545*/{2274361344u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C5 */, /*8546*/{2274885632u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C6 */, /*8547*/{2275409920u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C7 */, /*8548*/{2275934208u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C8 */, /*8549*/{2276458496u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5C9 */, /*8550*/{2276982784u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CA */, /*8551*/{2277507072u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CB */, /*8552*/{2278031360u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CC */, /*8553*/{2278555648u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CD */, /*8554*/{2279079936u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CE */, /*8555*/{2279604224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5CF */, /*8556*/{2280128512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5D0 */, /*8557*/{2280652800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5D1 */, /*8558*/{2281177088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5D2 */, /*8559*/{2281701376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5D3 */, /*8560*/{2282225664u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D4 */, /*8561*/{2282749952u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D5 */, /*8562*/{2283274240u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D6 */, /*8563*/{2283798528u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D7 */, /*8564*/{2284322816u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D8 */, /*8565*/{2284847104u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5D9 */, /*8566*/{2285371392u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DA */, /*8567*/{2285895680u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DB */, /*8568*/{2286419968u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DC */, /*8569*/{2286944256u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DD */, /*8570*/{2287468544u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DE */, /*8571*/{2287992832u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5DF */, /*8572*/{2288517120u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E0 */, /*8573*/{2289041408u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E1 */, /*8574*/{2289565696u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E2 */, /*8575*/{2290089984u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E3 */, /*8576*/{2290614272u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E4 */, /*8577*/{2291138560u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E5 */, /*8578*/{2291662848u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E6 */, /*8579*/{2292187136u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E7 */, /*8580*/{2292711424u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E8 */, /*8581*/{2293235712u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5E9 */, /*8582*/{2293760000u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5EA */, /*8583*/{2294284288u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5EB */, /*8584*/{2294808576u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5EC */, /*8585*/{2295332864u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D5ED */, /*8586*/{2295857152u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5EE */, /*8587*/{2296381440u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5EF */, /*8588*/{2296905728u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F0 */, /*8589*/{2297430016u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F1 */, /*8590*/{2297954304u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F2 */, /*8591*/{2298478592u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F3 */, /*8592*/{2299002880u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F4 */, /*8593*/{2299527168u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F5 */, /*8594*/{2300051456u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D5F6 */, /*8595*/{2300575744u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D5F7 */, /*8596*/{2301100032u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F8 */, /*8597*/{2301624320u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5F9 */, /*8598*/{2302148608u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FA */, /*8599*/{2302672896u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FB */, /*8600*/{2303197184u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FC */, /*8601*/{2303721472u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FD */, /*8602*/{2304245760u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FE */, /*8603*/{2304770048u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D5FF */, /*8604*/{2305294336u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D600 */, /*8605*/{2305818624u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D601 */, /*8606*/{2306342912u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D602 */, /*8607*/{2306867200u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D603 */, /*8608*/{2307391488u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D604 */, /*8609*/{2307915776u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D605 */, /*8610*/{2308440064u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D606 */, /*8611*/{2308964352u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D607 */, /*8612*/{2309488640u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D608 */, /*8613*/{2310012928u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D609 */, /*8614*/{2310537216u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60A */, /*8615*/{2311061504u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60B */, /*8616*/{2311585792u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60C */, /*8617*/{2312110080u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60D */, /*8618*/{2312634368u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60E */, /*8619*/{2313158656u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D60F */, /*8620*/{2313682944u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D610 */, /*8621*/{2314207232u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D611 */, /*8622*/{2314731520u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D612 */, /*8623*/{2315255808u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D613 */, /*8624*/{2315780096u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D614 */, /*8625*/{2316304384u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D615 */, /*8626*/{2316828672u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D616 */, /*8627*/{2317352960u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D617 */, /*8628*/{2317877248u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D618 */, /*8629*/{2318401536u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D619 */, /*8630*/{2318925824u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61A */, /*8631*/{2319450112u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61B */, /*8632*/{2319974400u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61C */, /*8633*/{2320498688u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61D */, /*8634*/{2321022976u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61E */, /*8635*/{2321547264u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D61F */, /*8636*/{2322071552u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D620 */, /*8637*/{2322595840u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D621 */, /*8638*/{2323120128u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D622 */, /*8639*/{2323644416u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D623 */, /*8640*/{2324168704u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D624 */, /*8641*/{2324692992u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D625 */, /*8642*/{2325217280u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D626 */, /*8643*/{2325741568u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D627 */, /*8644*/{2326265856u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D628 */, /*8645*/{2326790144u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D629 */, /*8646*/{2327314432u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D62A */, /*8647*/{2327838720u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D62B */, /*8648*/{2328363008u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D62C */, /*8649*/{2328887296u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D62D */, /*8650*/{2329411584u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D62E */, /*8651*/{2329935872u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D62F */, /*8652*/{2330460160u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D630 */, /*8653*/{2330984448u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D631 */, /*8654*/{2331508736u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D632 */, /*8655*/{2332033024u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D633 */, /*8656*/{2332557312u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D634 */, /*8657*/{2333081600u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D635 */, /*8658*/{2333605888u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D636 */, /*8659*/{2334130176u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D637 */, /*8660*/{2334654464u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D638 */, /*8661*/{2335178752u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D639 */, /*8662*/{2335703040u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D63A */, /*8663*/{2336227328u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D63B */, /*8664*/{2336751616u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D63C */, /*8665*/{2337275904u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D63D */, /*8666*/{2337800192u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D63E */, /*8667*/{2338324480u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D63F */, /*8668*/{2338848768u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D640 */, /*8669*/{2339373056u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D641 */, /*8670*/{2339897344u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D642 */, /*8671*/{2340421632u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D643 */, /*8672*/{2340945920u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D644 */, /*8673*/{2341470208u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D645 */, /*8674*/{2341994496u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D646 */, /*8675*/{2342518784u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D647 */, /*8676*/{2343043072u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D648 */, /*8677*/{2343567360u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D649 */, /*8678*/{2344091648u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64A */, /*8679*/{2344615936u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64B */, /*8680*/{2345140224u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64C */, /*8681*/{2345664512u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64D */, /*8682*/{2346188800u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64E */, /*8683*/{2346713088u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D64F */, /*8684*/{2347237376u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D650 */, /*8685*/{2347761664u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D651 */, /*8686*/{2348285952u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D652 */, /*8687*/{2348810240u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D653 */, /*8688*/{2349334528u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D654 */, /*8689*/{2349858816u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D655 */, /*8690*/{2350383104u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D656 */, /*8691*/{2350907392u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D657 */, /*8692*/{2351431680u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D658 */, /*8693*/{2351955968u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D659 */, /*8694*/{2352480256u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D65A */, /*8695*/{2353004544u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D65B */, /*8696*/{2353528832u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D65C */, /*8697*/{2354053120u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D65D */, /*8698*/{2354577408u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D65E */, /*8699*/{2355101696u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D65F */, /*8700*/{2355625984u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D660 */, /*8701*/{2356150272u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D661 */, /*8702*/{2356674560u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D662 */, /*8703*/{2357198848u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D663 */, /*8704*/{2357723136u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D664 */, /*8705*/{2358247424u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D665 */, /*8706*/{2358771712u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D666 */, /*8707*/{2359296000u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D667 */, /*8708*/{2359820288u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D668 */, /*8709*/{2360344576u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D669 */, /*8710*/{2360868864u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66A */, /*8711*/{2361393152u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66B */, /*8712*/{2361917440u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66C */, /*8713*/{2362441728u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66D */, /*8714*/{2362966016u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66E */, /*8715*/{2363490304u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D66F */, /*8716*/{2364014592u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D670 */, /*8717*/{2364538880u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D671 */, /*8718*/{2365063168u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D672 */, /*8719*/{2365587456u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D673 */, /*8720*/{2366111744u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D674 */, /*8721*/{2366636032u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D675 */, /*8722*/{2367160320u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D676 */, /*8723*/{2367684608u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D677 */, /*8724*/{2368208896u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D678 */, /*8725*/{2368733184u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D679 */, /*8726*/{2369257472u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67A */, /*8727*/{2369781760u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67B */, /*8728*/{2370306048u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67C */, /*8729*/{2370830336u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67D */, /*8730*/{2371354624u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67E */, /*8731*/{2371878912u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D67F */, /*8732*/{2372403200u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D680 */, /*8733*/{2372927488u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D681 */, /*8734*/{2373451776u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D682 */, /*8735*/{2373976064u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D683 */, /*8736*/{2374500352u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D684 */, /*8737*/{2375024640u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D685 */, /*8738*/{2375548928u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D686 */, /*8739*/{2376073216u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D687 */, /*8740*/{2376597504u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D688 */, /*8741*/{2377121792u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D689 */, /*8742*/{2377646080u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68A */, /*8743*/{2378170368u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68B */, /*8744*/{2378694656u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68C */, /*8745*/{2379218944u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68D */, /*8746*/{2379743232u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68E */, /*8747*/{2380267520u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D68F */, /*8748*/{2380791808u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D690 */, /*8749*/{2381316096u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D691 */, /*8750*/{2381840384u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D692 */, /*8751*/{2382364672u,970752u,65537u,77617286u,7340272u,1140983402u,2151686336u}/* 1D693 */, /*8752*/{2382888960u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D694 */, /*8753*/{2383413248u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D695 */, /*8754*/{2383937536u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D696 */, /*8755*/{2384461824u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D697 */, /*8756*/{2384986112u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D698 */, /*8757*/{2385510400u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D699 */, /*8758*/{2386034688u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69A */, /*8759*/{2386558976u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69B */, /*8760*/{2387083264u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69C */, /*8761*/{2387607552u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69D */, /*8762*/{2388131840u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69E */, /*8763*/{2388656128u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D69F */, /*8764*/{2389180416u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6A0 */, /*8765*/{2389704704u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6A1 */, /*8766*/{2390228992u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6A2 */, /*8767*/{2390753280u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6A3 */, /*8768*/{2391277568u,970752u,65537u,83908742u,7340272u,1140983402u,2151678144u}/* 1D6A4 */, /*8769*/{2391801856u,970752u,65537u,83908742u,7340272u,1140983402u,2151678144u}/* 1D6A5 */, /*8770*/{2392326144u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6A8 */, /*8771*/{2392850432u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6A9 */, /*8772*/{2393374720u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AA */, /*8773*/{2393899008u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AB */, /*8774*/{2394423296u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AC */, /*8775*/{2394947584u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AD */, /*8776*/{2395471872u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AE */, /*8777*/{2395996160u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6AF */, /*8778*/{2396520448u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B0 */, /*8779*/{2397044736u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B1 */, /*8780*/{2397569024u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B2 */, /*8781*/{2398093312u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B3 */, /*8782*/{2398617600u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B4 */, /*8783*/{2399141888u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B5 */, /*8784*/{2399666176u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B6 */, /*8785*/{2400190464u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B7 */, /*8786*/{2400714752u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B8 */, /*8787*/{2401239040u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6B9 */, /*8788*/{2401763328u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BA */, /*8789*/{2402287616u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BB */, /*8790*/{2402811904u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BC */, /*8791*/{2403336192u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BD */, /*8792*/{2403860480u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BE */, /*8793*/{2404384768u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6BF */, /*8794*/{2404909056u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6C0 */, /*8795*/{2405433344u,970752u,65537u,77596166u,176u,67239938u,2147516416u}/* 1D6C1 */, /*8796*/{2405957632u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C2 */, /*8797*/{2406481920u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C3 */, /*8798*/{2407006208u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C4 */, /*8799*/{2407530496u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C5 */, /*8800*/{2408054784u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C6 */, /*8801*/{2408579072u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C7 */, /*8802*/{2409103360u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C8 */, /*8803*/{2409627648u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6C9 */, /*8804*/{2410151936u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CA */, /*8805*/{2410676224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CB */, /*8806*/{2411200512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CC */, /*8807*/{2411724800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CD */, /*8808*/{2412249088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CE */, /*8809*/{2412773376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6CF */, /*8810*/{2413297664u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D0 */, /*8811*/{2413821952u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D1 */, /*8812*/{2414346240u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D2 */, /*8813*/{2414870528u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D3 */, /*8814*/{2415394816u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D4 */, /*8815*/{2415919104u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D5 */, /*8816*/{2416443392u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D6 */, /*8817*/{2416967680u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D7 */, /*8818*/{2417491968u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D8 */, /*8819*/{2418016256u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6D9 */, /*8820*/{2418540544u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6DA */, /*8821*/{2419064832u,970752u,65537u,78251526u,180u,67239938u,2147516416u}/* 1D6DB */, /*8822*/{2419589120u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6DC */, /*8823*/{2420113408u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6DD */, /*8824*/{2420637696u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6DE */, /*8825*/{2421161984u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6DF */, /*8826*/{2421686272u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6E0 */, /*8827*/{2422210560u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6E1 */, /*8828*/{2422734848u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E2 */, /*8829*/{2423259136u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E3 */, /*8830*/{2423783424u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E4 */, /*8831*/{2424307712u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E5 */, /*8832*/{2424832000u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E6 */, /*8833*/{2425356288u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E7 */, /*8834*/{2425880576u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E8 */, /*8835*/{2426404864u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6E9 */, /*8836*/{2426929152u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6EA */, /*8837*/{2427453440u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6EB */, /*8838*/{2427977728u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6EC */, /*8839*/{2428502016u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6ED */, /*8840*/{2429026304u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6EE */, /*8841*/{2429550592u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6EF */, /*8842*/{2430074880u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F0 */, /*8843*/{2430599168u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F1 */, /*8844*/{2431123456u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F2 */, /*8845*/{2431647744u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F3 */, /*8846*/{2432172032u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F4 */, /*8847*/{2432696320u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F5 */, /*8848*/{2433220608u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F6 */, /*8849*/{2433744896u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F7 */, /*8850*/{2434269184u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F8 */, /*8851*/{2434793472u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6F9 */, /*8852*/{2435317760u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D6FA */, /*8853*/{2435842048u,970752u,65537u,77596166u,176u,67239938u,2147516416u}/* 1D6FB */, /*8854*/{2436366336u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6FC */, /*8855*/{2436890624u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6FD */, /*8856*/{2437414912u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6FE */, /*8857*/{2437939200u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D6FF */, /*8858*/{2438463488u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D700 */, /*8859*/{2438987776u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D701 */, /*8860*/{2439512064u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D702 */, /*8861*/{2440036352u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D703 */, /*8862*/{2440560640u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D704 */, /*8863*/{2441084928u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D705 */, /*8864*/{2441609216u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D706 */, /*8865*/{2442133504u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D707 */, /*8866*/{2442657792u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D708 */, /*8867*/{2443182080u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D709 */, /*8868*/{2443706368u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70A */, /*8869*/{2444230656u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70B */, /*8870*/{2444754944u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70C */, /*8871*/{2445279232u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70D */, /*8872*/{2445803520u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70E */, /*8873*/{2446327808u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D70F */, /*8874*/{2446852096u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D710 */, /*8875*/{2447376384u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D711 */, /*8876*/{2447900672u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D712 */, /*8877*/{2448424960u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D713 */, /*8878*/{2448949248u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D714 */, /*8879*/{2449473536u,970752u,65537u,78251526u,180u,67239938u,2147516416u}/* 1D715 */, /*8880*/{2449997824u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D716 */, /*8881*/{2450522112u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D717 */, /*8882*/{2451046400u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D718 */, /*8883*/{2451570688u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D719 */, /*8884*/{2452094976u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D71A */, /*8885*/{2452619264u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D71B */, /*8886*/{2453143552u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D71C */, /*8887*/{2453667840u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D71D */, /*8888*/{2454192128u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D71E */, /*8889*/{2454716416u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D71F */, /*8890*/{2455240704u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D720 */, /*8891*/{2455764992u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D721 */, /*8892*/{2456289280u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D722 */, /*8893*/{2456813568u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D723 */, /*8894*/{2457337856u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D724 */, /*8895*/{2457862144u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D725 */, /*8896*/{2458386432u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D726 */, /*8897*/{2458910720u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D727 */, /*8898*/{2459435008u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D728 */, /*8899*/{2459959296u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D729 */, /*8900*/{2460483584u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72A */, /*8901*/{2461007872u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72B */, /*8902*/{2461532160u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72C */, /*8903*/{2462056448u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72D */, /*8904*/{2462580736u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72E */, /*8905*/{2463105024u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D72F */, /*8906*/{2463629312u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D730 */, /*8907*/{2464153600u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D731 */, /*8908*/{2464677888u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D732 */, /*8909*/{2465202176u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D733 */, /*8910*/{2465726464u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D734 */, /*8911*/{2466250752u,970752u,65537u,77596166u,176u,67239938u,2147516416u}/* 1D735 */, /*8912*/{2466775040u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D736 */, /*8913*/{2467299328u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D737 */, /*8914*/{2467823616u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D738 */, /*8915*/{2468347904u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D739 */, /*8916*/{2468872192u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73A */, /*8917*/{2469396480u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73B */, /*8918*/{2469920768u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73C */, /*8919*/{2470445056u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73D */, /*8920*/{2470969344u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73E */, /*8921*/{2471493632u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D73F */, /*8922*/{2472017920u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D740 */, /*8923*/{2472542208u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D741 */, /*8924*/{2473066496u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D742 */, /*8925*/{2473590784u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D743 */, /*8926*/{2474115072u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D744 */, /*8927*/{2474639360u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D745 */, /*8928*/{2475163648u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D746 */, /*8929*/{2475687936u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D747 */, /*8930*/{2476212224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D748 */, /*8931*/{2476736512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D749 */, /*8932*/{2477260800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D74A */, /*8933*/{2477785088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D74B */, /*8934*/{2478309376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D74C */, /*8935*/{2478833664u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D74D */, /*8936*/{2479357952u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D74E */, /*8937*/{2479882240u,970752u,65537u,78251526u,180u,67239938u,2147516416u}/* 1D74F */, /*8938*/{2480406528u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D750 */, /*8939*/{2480930816u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D751 */, /*8940*/{2481455104u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D752 */, /*8941*/{2481979392u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D753 */, /*8942*/{2482503680u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D754 */, /*8943*/{2483027968u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D755 */, /*8944*/{2483552256u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D756 */, /*8945*/{2484076544u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D757 */, /*8946*/{2484600832u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D758 */, /*8947*/{2485125120u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D759 */, /*8948*/{2485649408u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75A */, /*8949*/{2486173696u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75B */, /*8950*/{2486697984u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75C */, /*8951*/{2487222272u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75D */, /*8952*/{2487746560u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75E */, /*8953*/{2488270848u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D75F */, /*8954*/{2488795136u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D760 */, /*8955*/{2489319424u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D761 */, /*8956*/{2489843712u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D762 */, /*8957*/{2490368000u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D763 */, /*8958*/{2490892288u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D764 */, /*8959*/{2491416576u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D765 */, /*8960*/{2491940864u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D766 */, /*8961*/{2492465152u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D767 */, /*8962*/{2492989440u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D768 */, /*8963*/{2493513728u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D769 */, /*8964*/{2494038016u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D76A */, /*8965*/{2494562304u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D76B */, /*8966*/{2495086592u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D76C */, /*8967*/{2495610880u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D76D */, /*8968*/{2496135168u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D76E */, /*8969*/{2496659456u,970752u,65537u,77596166u,176u,67239938u,2147516416u}/* 1D76F */, /*8970*/{2497183744u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D770 */, /*8971*/{2497708032u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D771 */, /*8972*/{2498232320u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D772 */, /*8973*/{2498756608u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D773 */, /*8974*/{2499280896u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D774 */, /*8975*/{2499805184u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D775 */, /*8976*/{2500329472u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D776 */, /*8977*/{2500853760u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D777 */, /*8978*/{2501378048u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D778 */, /*8979*/{2501902336u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D779 */, /*8980*/{2502426624u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77A */, /*8981*/{2502950912u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77B */, /*8982*/{2503475200u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77C */, /*8983*/{2503999488u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77D */, /*8984*/{2504523776u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77E */, /*8985*/{2505048064u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D77F */, /*8986*/{2505572352u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D780 */, /*8987*/{2506096640u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D781 */, /*8988*/{2506620928u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D782 */, /*8989*/{2507145216u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D783 */, /*8990*/{2507669504u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D784 */, /*8991*/{2508193792u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D785 */, /*8992*/{2508718080u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D786 */, /*8993*/{2509242368u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D787 */, /*8994*/{2509766656u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D788 */, /*8995*/{2510290944u,970752u,65537u,78251526u,180u,67239938u,2147516416u}/* 1D789 */, /*8996*/{2510815232u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78A */, /*8997*/{2511339520u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78B */, /*8998*/{2511863808u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78C */, /*8999*/{2512388096u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78D */, /*9000*/{2512912384u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78E */, /*9001*/{2513436672u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D78F */, /*9002*/{2513960960u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D790 */, /*9003*/{2514485248u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D791 */, /*9004*/{2515009536u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D792 */, /*9005*/{2515533824u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D793 */, /*9006*/{2516058112u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D794 */, /*9007*/{2516582400u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D795 */, /*9008*/{2517106688u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D796 */, /*9009*/{2517630976u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D797 */, /*9010*/{2518155264u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D798 */, /*9011*/{2518679552u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D799 */, /*9012*/{2519203840u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79A */, /*9013*/{2519728128u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79B */, /*9014*/{2520252416u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79C */, /*9015*/{2520776704u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79D */, /*9016*/{2521300992u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79E */, /*9017*/{2521825280u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D79F */, /*9018*/{2522349568u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A0 */, /*9019*/{2522873856u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A1 */, /*9020*/{2523398144u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A2 */, /*9021*/{2523922432u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A3 */, /*9022*/{2524446720u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A4 */, /*9023*/{2524971008u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A5 */, /*9024*/{2525495296u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A6 */, /*9025*/{2526019584u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A7 */, /*9026*/{2526543872u,970752u,65537u,77617222u,8388848u,1140983394u,2151679168u}/* 1D7A8 */, /*9027*/{2527068160u,970752u,65537u,77596166u,176u,67239938u,2147516416u}/* 1D7A9 */, /*9028*/{2527592448u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AA */, /*9029*/{2528116736u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AB */, /*9030*/{2528641024u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AC */, /*9031*/{2529165312u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AD */, /*9032*/{2529689600u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AE */, /*9033*/{2530213888u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7AF */, /*9034*/{2530738176u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B0 */, /*9035*/{2531262464u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B1 */, /*9036*/{2531786752u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B2 */, /*9037*/{2532311040u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B3 */, /*9038*/{2532835328u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B4 */, /*9039*/{2533359616u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B5 */, /*9040*/{2533883904u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B6 */, /*9041*/{2534408192u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B7 */, /*9042*/{2534932480u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B8 */, /*9043*/{2535456768u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7B9 */, /*9044*/{2535981056u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BA */, /*9045*/{2536505344u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BB */, /*9046*/{2537029632u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BC */, /*9047*/{2537553920u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BD */, /*9048*/{2538078208u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BE */, /*9049*/{2538602496u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7BF */, /*9050*/{2539126784u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C0 */, /*9051*/{2539651072u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C1 */, /*9052*/{2540175360u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C2 */, /*9053*/{2540699648u,970752u,65537u,78251526u,180u,67239938u,2147516416u}/* 1D7C3 */, /*9054*/{2541223936u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C4 */, /*9055*/{2541748224u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C5 */, /*9056*/{2542272512u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C6 */, /*9057*/{2542796800u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C7 */, /*9058*/{2543321088u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C8 */, /*9059*/{2543845376u,970752u,65537u,77617286u,7340272u,1140983402u,2151678144u}/* 1D7C9 */, /*9060*/{2544369664u,970752u,65537u,86005830u,8388848u,1140983394u,2151679168u}/* 1D7CA */, /*9061*/{2544893952u,970752u,65537u,86005894u,7340272u,1140983402u,2151678144u}/* 1D7CB */, /*9062*/{2545418240u,970752u,33620993u,77756998u,44046512u,67240963u,2151678080u}/* 1D7CE */, /*9063*/{2545942528u,970752u,453051905u,77756998u,44046512u,67240963u,2151678080u}/* 1D7CF */, /*9064*/{2546466816u,970752u,486607361u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D0 */, /*9065*/{2546991104u,970752u,520161281u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D1 */, /*9066*/{2547515392u,970752u,553717761u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D2 */, /*9067*/{2548039680u,970752u,587271169u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D3 */, /*9068*/{2548563968u,970752u,620828161u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D4 */, /*9069*/{2549088256u,970752u,654380545u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D5 */, /*9070*/{2549612544u,970752u,687938561u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D6 */, /*9071*/{2550136832u,970752u,721490945u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D7 */, /*9072*/{2550661120u,970752u,33620993u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D8 */, /*9073*/{2551185408u,970752u,453051905u,77756998u,44046512u,67240963u,2151678080u}/* 1D7D9 */, /*9074*/{2551709696u,970752u,486607361u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DA */, /*9075*/{2552233984u,970752u,520161281u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DB */, /*9076*/{2552758272u,970752u,553717761u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DC */, /*9077*/{2553282560u,970752u,587271169u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DD */, /*9078*/{2553806848u,970752u,620828161u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DE */, /*9079*/{2554331136u,970752u,654380545u,77756998u,44046512u,67240963u,2151678080u}/* 1D7DF */, /*9080*/{2554855424u,970752u,687938561u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E0 */, /*9081*/{2555379712u,970752u,721490945u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E1 */, /*9082*/{2555904000u,970752u,33620993u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E2 */, /*9083*/{2556428288u,970752u,453051905u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E3 */, /*9084*/{2556952576u,970752u,486607361u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E4 */, /*9085*/{2557476864u,970752u,520161281u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E5 */, /*9086*/{2558001152u,970752u,553717761u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E6 */, /*9087*/{2558525440u,970752u,587271169u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E7 */, /*9088*/{2559049728u,970752u,620828161u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E8 */, /*9089*/{2559574016u,970752u,654380545u,77756998u,44046512u,67240963u,2151678080u}/* 1D7E9 */, /*9090*/{2560098304u,970752u,687938561u,77756998u,44046512u,67240963u,2151678080u}/* 1D7EA */, /*9091*/{2560622592u,970752u,721490945u,77756998u,44046512u,67240963u,2151678080u}/* 1D7EB */, /*9092*/{2561146880u,970752u,33620993u,77756998u,44046512u,67240963u,2151678080u}/* 1D7EC */, /*9093*/{2561671168u,970752u,453051905u,77756998u,44046512u,67240963u,2151678080u}/* 1D7ED */, /*9094*/{2562195456u,970752u,486607361u,77756998u,44046512u,67240963u,2151678080u}/* 1D7EE */, /*9095*/{2562719744u,970752u,520161281u,77756998u,44046512u,67240963u,2151678080u}/* 1D7EF */, /*9096*/{2563244032u,970752u,553717761u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F0 */, /*9097*/{2563768320u,970752u,587271169u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F1 */, /*9098*/{2564292608u,970752u,620828161u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F2 */, /*9099*/{2564816896u,970752u,654380545u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F3 */, /*9100*/{2565341184u,970752u,687938561u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F4 */, /*9101*/{2565865472u,970752u,721490945u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F5 */, /*9102*/{2566389760u,970752u,33620993u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F6 */, /*9103*/{2566914048u,970752u,453051905u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F7 */, /*9104*/{2567438336u,970752u,486607361u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F8 */, /*9105*/{2567962624u,970752u,520161281u,77756998u,44046512u,67240963u,2151678080u}/* 1D7F9 */, /*9106*/{2568486912u,970752u,553717761u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FA */, /*9107*/{2569011200u,970752u,587271169u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FB */, /*9108*/{2569535488u,970752u,620828161u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FC */, /*9109*/{2570059776u,970752u,654380545u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FD */, /*9110*/{2570584064u,970752u,687938561u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FE */, /*9111*/{2571108352u,970752u,721490945u,77756998u,44046512u,67240963u,2151678080u}/* 1D7FF */, /*9112*/{0,974848u,8585217u,102762176u,688u,131072u,3221258240u}/* 1D800 */, /*9113*/{0,974848u,8585216u,103561600u,808714928u,2147550212u,3221225600u}/* 1DA00 */, /*9114*/{0,974848u,8585217u,102761920u,688u,131072u,3222278144u}/* 1DA87 */, /*9115*/{0,974848u,8585217u,102761920u,12583600u,131072u,3222294528u}/* 1DA88 */, /*9116*/{0,974848u,8585217u,102761920u,688u,131072u,3222274048u}/* 1DA8B */, /*9117*/{0,978944u,7405569u,100751680u,9437936u,132672u,3221225664u}/* 1E800 */, /*9118*/{0,978944u,460391937u,100729536u,33557168u,131073u,3221225472u}/* 1E8C7 */, /*9119*/{0,978944u,493947393u,100729536u,33557168u,131073u,3221225472u}/* 1E8C8 */, /*9120*/{0,978944u,527501313u,100729536u,33557168u,131073u,3221225472u}/* 1E8C9 */, /*9121*/{0,978944u,561057793u,100729536u,33557168u,131073u,3221225472u}/* 1E8CA */, /*9122*/{0,978944u,594611201u,100729536u,33557168u,131073u,3221225472u}/* 1E8CB */, /*9123*/{0,978944u,628168193u,100729536u,33557168u,131073u,3221225472u}/* 1E8CC */, /*9124*/{0,978944u,661720577u,100729536u,33557168u,131073u,3221225472u}/* 1E8CD */, /*9125*/{0,978944u,695278593u,100729536u,33557168u,131073u,3221225472u}/* 1E8CE */, /*9126*/{0,978944u,728830977u,100729536u,33557168u,131073u,3221225472u}/* 1E8CF */, /*9127*/{0,978944u,7405568u,3121363328u,808714928u,2148598788u,3221225600u}/* 1E8D0 */, /*9128*/{2571632640u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE00 */, /*9129*/{2572156928u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE01 */, /*9130*/{2572681216u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE02 */, /*9131*/{2573205504u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE03 */, /*9132*/{2573729792u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE05 */, /*9133*/{2574254080u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE06 */, /*9134*/{2574778368u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE07 */, /*9135*/{2575302656u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE08 */, /*9136*/{2575826944u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE09 */, /*9137*/{2576351232u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0A */, /*9138*/{2576875520u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0B */, /*9139*/{2577399808u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0C */, /*9140*/{2577924096u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0D */, /*9141*/{2578448384u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0E */, /*9142*/{2578972672u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE0F */, /*9143*/{2579496960u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE10 */, /*9144*/{2580021248u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE11 */, /*9145*/{2580545536u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE12 */, /*9146*/{2581069824u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE13 */, /*9147*/{2581594112u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE14 */, /*9148*/{2582118400u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE15 */, /*9149*/{2582642688u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE16 */, /*9150*/{2583166976u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE17 */, /*9151*/{2583691264u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE18 */, /*9152*/{2584215552u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE19 */, /*9153*/{2584739840u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1A */, /*9154*/{2585264128u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1B */, /*9155*/{2585788416u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1C */, /*9156*/{2586312704u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1D */, /*9157*/{2586836992u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1E */, /*9158*/{2587361280u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE1F */, /*9159*/{2587885568u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE21 */, /*9160*/{2588409856u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE22 */, /*9161*/{2588934144u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE24 */, /*9162*/{2589458432u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE27 */, /*9163*/{2589982720u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE29 */, /*9164*/{2590507008u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2A */, /*9165*/{2591031296u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2B */, /*9166*/{2591555584u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2C */, /*9167*/{2592079872u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2D */, /*9168*/{2592604160u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2E */, /*9169*/{2593128448u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE2F */, /*9170*/{2593652736u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE30 */, /*9171*/{2594177024u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE31 */, /*9172*/{2594701312u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE32 */, /*9173*/{2595225600u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE34 */, /*9174*/{2595749888u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE35 */, /*9175*/{2596274176u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE36 */, /*9176*/{2596798464u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE37 */, /*9177*/{2597322752u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE39 */, /*9178*/{2597847040u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE3B */, /*9179*/{2598371328u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE42 */, /*9180*/{2598895616u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE47 */, /*9181*/{2599419904u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE49 */, /*9182*/{2599944192u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE4B */, /*9183*/{2600468480u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE4D */, /*9184*/{2600992768u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE4E */, /*9185*/{2601517056u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE4F */, /*9186*/{2602041344u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE51 */, /*9187*/{2602565632u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE52 */, /*9188*/{2603089920u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE54 */, /*9189*/{2603614208u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE57 */, /*9190*/{2604138496u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE59 */, /*9191*/{2604662784u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE5B */, /*9192*/{2605187072u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE5D */, /*9193*/{2605711360u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE5F */, /*9194*/{2606235648u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE61 */, /*9195*/{2606759936u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE62 */, /*9196*/{2607284224u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE64 */, /*9197*/{2607808512u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE67 */, /*9198*/{2608332800u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE68 */, /*9199*/{2608857088u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE69 */, /*9200*/{2609381376u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE6A */, /*9201*/{2609905664u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE6C */, /*9202*/{2610429952u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE6D */, /*9203*/{2610954240u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE6E */, /*9204*/{2611478528u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE6F */, /*9205*/{2612002816u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE70 */, /*9206*/{2612527104u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE71 */, /*9207*/{2613051392u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE72 */, /*9208*/{2613575680u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE74 */, /*9209*/{2614099968u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE75 */, /*9210*/{2614624256u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE76 */, /*9211*/{2615148544u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE77 */, /*9212*/{2615672832u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE79 */, /*9213*/{2616197120u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE7A */, /*9214*/{2616721408u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE7B */, /*9215*/{2617245696u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE7C */, /*9216*/{2617769984u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE7E */, /*9217*/{2618294272u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE80 */, /*9218*/{2618818560u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE81 */, /*9219*/{2619342848u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE82 */, /*9220*/{2619867136u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE83 */, /*9221*/{2620391424u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE84 */, /*9222*/{2620915712u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE85 */, /*9223*/{2621440000u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE86 */, /*9224*/{2621964288u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE87 */, /*9225*/{2622488576u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE88 */, /*9226*/{2623012864u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE89 */, /*9227*/{2623537152u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE8B */, /*9228*/{2624061440u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE8C */, /*9229*/{2624585728u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE8D */, /*9230*/{2625110016u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE8E */, /*9231*/{2625634304u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE8F */, /*9232*/{2626158592u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE90 */, /*9233*/{2626682880u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE91 */, /*9234*/{2627207168u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE92 */, /*9235*/{2627731456u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE93 */, /*9236*/{2628255744u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE94 */, /*9237*/{2628780032u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE95 */, /*9238*/{2629304320u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE96 */, /*9239*/{2629828608u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE97 */, /*9240*/{2630352896u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE98 */, /*9241*/{2630877184u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE99 */, /*9242*/{2631401472u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE9A */, /*9243*/{2631925760u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EE9B */, /*9244*/{2632450048u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA1 */, /*9245*/{2632974336u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA2 */, /*9246*/{2633498624u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA3 */, /*9247*/{2634022912u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA5 */, /*9248*/{2634547200u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA6 */, /*9249*/{2635071488u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA7 */, /*9250*/{2635595776u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA8 */, /*9251*/{2636120064u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEA9 */, /*9252*/{2636644352u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEAB */, /*9253*/{2637168640u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEAC */, /*9254*/{2637692928u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEAD */, /*9255*/{2638217216u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEAE */, /*9256*/{2638741504u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEAF */, /*9257*/{2639265792u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB0 */, /*9258*/{2639790080u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB1 */, /*9259*/{2640314368u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB2 */, /*9260*/{2640838656u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB3 */, /*9261*/{2641362944u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB4 */, /*9262*/{2641887232u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB5 */, /*9263*/{2642411520u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB6 */, /*9264*/{2642935808u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB7 */, /*9265*/{2643460096u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB8 */, /*9266*/{2643984384u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEB9 */, /*9267*/{2644508672u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEBA */, /*9268*/{2645032960u,983040u,458753u,95246662u,9437424u,67241538u,2151678144u}/* 1EEBB */, /*9269*/{0,983040u,458753u,95028736u,688u,131074u,3221258240u}/* 1EEF0 */, /*9270*/{0,987136u,65537u,88737472u,688u,131072u,3221258240u}/* 1F000 */, /*9271*/{0,991232u,65537u,88737472u,688u,131072u,3221258240u}/* 1F030 */, /*9272*/{0,995328u,65537u,92931776u,688u,131072u,3221258240u}/* 1F0A0 */, /*9273*/{0,995328u,65537u,101320384u,688u,131072u,3221258240u}/* 1F0BF */, /*9274*/{2645557248u,999424u,33620993u,90309316u,33558704u,67239937u,2147483648u}/* 1F100 */, /*9275*/{2646081536u,999424u,33620993u,90309316u,33558704u,67239937u,2147483648u}/* 1F101 */, /*9276*/{2646605824u,999424u,453051905u,90309316u,33558704u,67239937u,2147483648u}/* 1F102 */, /*9277*/{2647130112u,999424u,486607361u,90309316u,33558704u,67239937u,2147483648u}/* 1F103 */, /*9278*/{2647654400u,999424u,520161281u,90309316u,33558704u,67239937u,2147483648u}/* 1F104 */, /*9279*/{2648178688u,999424u,553717761u,90309316u,33558704u,67239937u,2147483648u}/* 1F105 */, /*9280*/{2648702976u,999424u,587271169u,90309316u,33558704u,67239937u,2147483648u}/* 1F106 */, /*9281*/{2649227264u,999424u,620828161u,90309316u,33558704u,67239937u,2147483648u}/* 1F107 */, /*9282*/{2649751552u,999424u,654380545u,90309316u,33558704u,67239937u,2147483648u}/* 1F108 */, /*9283*/{2650275840u,999424u,687938561u,90309316u,33558704u,67239937u,2147483648u}/* 1F109 */, /*9284*/{2650800128u,999424u,721490945u,90309316u,33558704u,67239937u,2147483648u}/* 1F10A */, /*9285*/{0,999424u,33620993u,101319360u,33557168u,131073u,3221225472u}/* 1F10B */, /*9286*/{2651324416u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F110 */, /*9287*/{2651848704u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F111 */, /*9288*/{2652372992u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F112 */, /*9289*/{2652897280u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F113 */, /*9290*/{2653421568u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F114 */, /*9291*/{2653945856u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F115 */, /*9292*/{2654470144u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F116 */, /*9293*/{2654994432u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F117 */, /*9294*/{2655518720u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F118 */, /*9295*/{2656043008u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F119 */, /*9296*/{2656567296u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11A */, /*9297*/{2657091584u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11B */, /*9298*/{2657615872u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11C */, /*9299*/{2658140160u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11D */, /*9300*/{2658664448u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11E */, /*9301*/{2659188736u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F11F */, /*9302*/{2659713024u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F120 */, /*9303*/{2660237312u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F121 */, /*9304*/{2660761600u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F122 */, /*9305*/{2661285888u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F123 */, /*9306*/{2661810176u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F124 */, /*9307*/{2662334464u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F125 */, /*9308*/{2662858752u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F126 */, /*9309*/{2663383040u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F127 */, /*9310*/{2663907328u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F128 */, /*9311*/{2664431616u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F129 */, /*9312*/{2664955904u,999424u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F12A */, /*9313*/{2665480192u,999424u,65537u,90179282u,176u,67239936u,2147516416u}/* 1F12B */, /*9314*/{2666004480u,999424u,65537u,90179282u,176u,67239936u,2147516416u}/* 1F12C */, /*9315*/{2666528768u,999424u,65537u,90179282u,176u,67239936u,2147516416u}/* 1F12D */, /*9316*/{2667053056u,999424u,65537u,90179282u,176u,67239936u,2147516416u}/* 1F12E */, /*9317*/{2667577344u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F130 */, /*9318*/{2668101632u,999424u,65537u,90201824u,8388848u,1140981760u,2418050048u}/* 1F131 */, /*9319*/{2668625920u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F132 */, /*9320*/{2669150208u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F133 */, /*9321*/{2669674496u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F134 */, /*9322*/{2670198784u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F135 */, /*9323*/{2670723072u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F136 */, /*9324*/{2671247360u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F137 */, /*9325*/{2671771648u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F138 */, /*9326*/{2672295936u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F139 */, /*9327*/{2672820224u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F13A */, /*9328*/{2673344512u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F13B */, /*9329*/{2673868800u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F13C */, /*9330*/{2674393088u,999424u,65537u,90201824u,8388848u,1140981760u,2418050048u}/* 1F13D */, /*9331*/{2674917376u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F13E */, /*9332*/{2675441664u,999424u,65537u,90201824u,8388848u,1140981760u,2418050048u}/* 1F13F */, /*9333*/{2675965952u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F140 */, /*9334*/{2676490240u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F141 */, /*9335*/{2677014528u,999424u,65537u,90201824u,8388848u,1140981760u,2418050048u}/* 1F142 */, /*9336*/{2677538816u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F143 */, /*9337*/{2678063104u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F144 */, /*9338*/{2678587392u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F145 */, /*9339*/{2679111680u,999424u,65537u,90201824u,8388848u,1140981760u,2418050048u}/* 1F146 */, /*9340*/{2679635968u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F147 */, /*9341*/{2680160256u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F148 */, /*9342*/{2680684544u,999424u,65537u,92298976u,8388848u,1140981760u,2418050048u}/* 1F149 */, /*9343*/{2681208832u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F14A */, /*9344*/{2681733120u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F14B */, /*9345*/{2682257408u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F14C */, /*9346*/{2682781696u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F14D */, /*9347*/{2683305984u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F14E */, /*9348*/{2683830272u,999424u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F14F */, /*9349*/{0,999424u,65537u,92298944u,8389360u,1073872896u,3491791872u}/* 1F150 */, /*9350*/{0,999424u,65537u,90201792u,8389360u,1073872896u,3491791872u}/* 1F157 */, /*9351*/{2684354560u,999424u,65537u,95028948u,176u,67239936u,2147516416u}/* 1F16A */, /*9352*/{2684878848u,999424u,65537u,95028948u,176u,67239936u,2147516416u}/* 1F16B */, /*9353*/{0,999424u,65537u,90179264u,688u,131072u,3221258240u}/* 1F18A */, /*9354*/{0,999424u,65537u,92276416u,688u,131072u,3221258240u}/* 1F18E */, /*9355*/{2685403136u,999424u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F190 */, /*9356*/{0,999424u,65536u,92292800u,328368u,131072u,3221258240u}/* 1F1E6 */, /*9357*/{2685927424u,1003520u,2162689u,90179296u,176u,67239936u,2147516416u}/* 1F200 */, /*9358*/{2686451712u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F201 */, /*9359*/{2686976000u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F202 */, /*9360*/{2687500288u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F210 */, /*9361*/{2688024576u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F211 */, /*9362*/{2688548864u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F212 */, /*9363*/{2689073152u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F213 */, /*9364*/{2689597440u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F214 */, /*9365*/{2690121728u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F215 */, /*9366*/{2690646016u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F216 */, /*9367*/{2691170304u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F217 */, /*9368*/{2691694592u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F218 */, /*9369*/{2692218880u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F219 */, /*9370*/{2692743168u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21A */, /*9371*/{2693267456u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21B */, /*9372*/{2693791744u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21C */, /*9373*/{2694316032u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21D */, /*9374*/{2694840320u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21E */, /*9375*/{2695364608u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F21F */, /*9376*/{2695888896u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F220 */, /*9377*/{2696413184u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F221 */, /*9378*/{2696937472u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F222 */, /*9379*/{2697461760u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F223 */, /*9380*/{2697986048u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F224 */, /*9381*/{2698510336u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F225 */, /*9382*/{2699034624u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F226 */, /*9383*/{2699558912u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F227 */, /*9384*/{2700083200u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F228 */, /*9385*/{2700607488u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F229 */, /*9386*/{2701131776u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22A */, /*9387*/{2701656064u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22B */, /*9388*/{2702180352u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22C */, /*9389*/{2702704640u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22D */, /*9390*/{2703228928u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22E */, /*9391*/{2703753216u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F22F */, /*9392*/{2704277504u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F230 */, /*9393*/{2704801792u,1003520u,65537u,90179296u,176u,67239936u,2147516416u}/* 1F231 */, /*9394*/{2705326080u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F232 */, /*9395*/{2705850368u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F233 */, /*9396*/{2706374656u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F234 */, /*9397*/{2706898944u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F235 */, /*9398*/{2707423232u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F236 */, /*9399*/{2707947520u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F237 */, /*9400*/{2708471808u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F238 */, /*9401*/{2708996096u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F239 */, /*9402*/{2709520384u,1003520u,65537u,92276448u,176u,67239936u,2147516416u}/* 1F23A */, /*9403*/{2710044672u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F240 */, /*9404*/{2710568960u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F241 */, /*9405*/{2711093248u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F242 */, /*9406*/{2711617536u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F243 */, /*9407*/{2712141824u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F244 */, /*9408*/{2712666112u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F245 */, /*9409*/{2713190400u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F246 */, /*9410*/{2713714688u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F247 */, /*9411*/{2714238976u,1003520u,65537u,90179268u,176u,67239936u,2147516416u}/* 1F248 */, /*9412*/{2714763264u,1003520u,65537u,92276434u,176u,67239936u,2147516416u}/* 1F250 */, /*9413*/{2715287552u,1003520u,65537u,92276434u,176u,67239936u,2147516416u}/* 1F251 */, /*9414*/{0,1007616u,65537u,92931776u,688u,131072u,3221258240u}/* 1F300 */, /*9415*/{0,1007616u,65537u,101320384u,688u,131072u,3221258240u}/* 1F321 */, /*9416*/{0,1007616u,65537u,103417536u,688u,131072u,3221258240u}/* 1F32D */, /*9417*/{0,1007616u,65537u,103417472u,688u,2147614720u,3221258240u}/* 1F3FB */, /*9418*/{0,1007616u,65537u,95028928u,688u,131072u,3221258240u}/* 1F540 */, /*9419*/{0,1011712u,65537u,95028928u,688u,131072u,3221258240u}/* 1F600 */, /*9420*/{0,1011712u,65537u,92931776u,688u,131072u,3221258240u}/* 1F601 */, /*9421*/{0,1011712u,65537u,101320384u,688u,131072u,3221258240u}/* 1F641 */, /*9422*/{0,1011712u,65537u,103417536u,688u,131072u,3221258240u}/* 1F643 */, /*9423*/{0,1015808u,65537u,101320384u,688u,131072u,3221258240u}/* 1F650 */, /*9424*/{0,1015808u,65537u,101320384u,13632176u,131072u,3221258240u}/* 1F676 */, /*9425*/{0,1019904u,65537u,92931776u,688u,131072u,3221258240u}/* 1F680 */, /*9426*/{0,1019904u,65537u,101320384u,688u,131072u,3221258240u}/* 1F6C6 */, /*9427*/{0,1019904u,65537u,103417536u,688u,131072u,3221258240u}/* 1F6D0 */, /*9428*/{0,1024000u,65537u,92931776u,688u,131072u,3221258240u}/* 1F700 */, /*9429*/{0,1028096u,65537u,101320384u,688u,131072u,3221258240u}/* 1F780 */, /*9430*/{0,1032192u,65537u,101320384u,688u,131072u,3221258240u}/* 1F800 */, /*9431*/{0,1036288u,65537u,103417536u,688u,131072u,3221258240u}/* 1F910 */, /*9432*/{0,1040384u,2359297u,77594944u,9437936u,132928u,3758098624u}/* 20000 */, /*9433*/{0,1040384u,656674305u,77594944u,42994416u,132928u,3221227712u}/* 20001 */, /*9434*/{0,1040384u,2359297u,77594944u,9437936u,132928u,3221227712u}/* 20002 */, /*9435*/{0,1040384u,556011521u,77594944u,42994416u,132928u,3221227712u}/* 20064 */, /*9436*/{0,1040384u,589564929u,77594944u,42994416u,132928u,3221227712u}/* 20121 */, /*9437*/{0,1040384u,455345665u,77594944u,42994416u,132928u,3221227712u}/* 2092A */, /*9438*/{0,1040384u,1076117505u,77594944u,42994416u,132928u,3221227712u}/* 20983 */, /*9439*/{0,1040384u,1243894785u,77594944u,42994416u,132928u,3221227712u}/* 2098C */, /*9440*/{0,1040384u,623121921u,77594944u,42994416u,132928u,3221227712u}/* 20AEA */, /*9441*/{0,1040384u,522455041u,77594944u,42994416u,132928u,3221227712u}/* 20AFD */, /*9442*/{0,1040384u,488901121u,77594944u,42994416u,132928u,3221227712u}/* 22390 */, /*9443*/{0,1044480u,2359297u,90177856u,9437936u,132928u,3221227712u}/* 2A700 */, /*9444*/{0,1048576u,2359297u,92275008u,9437936u,132928u,3221227712u}/* 2B740 */, /*9445*/{0,1052672u,2359297u,102760768u,9437936u,132928u,3221227712u}/* 2B820 */, /*9446*/{2715811840u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F800 */, /*9447*/{2716336128u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F801 */, /*9448*/{2716860416u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F802 */, /*9449*/{2717384704u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F803 */, /*9450*/{2717908992u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F804 */, /*9451*/{2718433280u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F805 */, /*9452*/{2718957568u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F806 */, /*9453*/{2719481856u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F807 */, /*9454*/{2720006144u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F808 */, /*9455*/{2720530432u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F809 */, /*9456*/{2721054720u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80A */, /*9457*/{2721579008u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80B */, /*9458*/{2722103296u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80C */, /*9459*/{2722627584u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80D */, /*9460*/{2723151872u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80E */, /*9461*/{2723676160u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F80F */, /*9462*/{2724200448u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F810 */, /*9463*/{2724724736u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F811 */, /*9464*/{2725249024u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F812 */, /*9465*/{2725773312u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F813 */, /*9466*/{2726297600u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F814 */, /*9467*/{2726821888u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F815 */, /*9468*/{2727346176u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F816 */, /*9469*/{2727870464u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F817 */, /*9470*/{2728394752u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F818 */, /*9471*/{2728919040u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F819 */, /*9472*/{2729443328u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81A */, /*9473*/{2729967616u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81B */, /*9474*/{2730491904u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81C */, /*9475*/{2731016192u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81D */, /*9476*/{2731540480u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81E */, /*9477*/{2732064768u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F81F */, /*9478*/{2732589056u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F820 */, /*9479*/{2733113344u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F821 */, /*9480*/{2733637632u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F822 */, /*9481*/{2734161920u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F823 */, /*9482*/{2734686208u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F824 */, /*9483*/{2735210496u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F825 */, /*9484*/{2735734784u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F826 */, /*9485*/{2736259072u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F827 */, /*9486*/{2736783360u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F828 */, /*9487*/{2737307648u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F829 */, /*9488*/{2737831936u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82A */, /*9489*/{2738356224u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82B */, /*9490*/{2738880512u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82C */, /*9491*/{2739404800u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82D */, /*9492*/{2739929088u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82E */, /*9493*/{2740453376u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F82F */, /*9494*/{2740977664u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F830 */, /*9495*/{2741501952u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F831 */, /*9496*/{2742026240u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F832 */, /*9497*/{2742550528u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F833 */, /*9498*/{2743074816u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F834 */, /*9499*/{2743599104u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F835 */, /*9500*/{2744123392u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F836 */, /*9501*/{2744647680u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F837 */, /*9502*/{2745171968u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F838 */, /*9503*/{2745696256u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F839 */, /*9504*/{2746220544u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83A */, /*9505*/{2746744832u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83B */, /*9506*/{2747269120u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83C */, /*9507*/{2747793408u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83D */, /*9508*/{2748317696u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83E */, /*9509*/{2748841984u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F83F */, /*9510*/{2749366272u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F840 */, /*9511*/{2749890560u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F841 */, /*9512*/{2750414848u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F842 */, /*9513*/{2750939136u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F843 */, /*9514*/{2751463424u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F844 */, /*9515*/{2751987712u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F845 */, /*9516*/{2752512000u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F846 */, /*9517*/{2753036288u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F847 */, /*9518*/{2753560576u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F848 */, /*9519*/{2754084864u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F849 */, /*9520*/{2754609152u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84A */, /*9521*/{2755133440u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84B */, /*9522*/{2755657728u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84C */, /*9523*/{2756182016u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84D */, /*9524*/{2756706304u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84E */, /*9525*/{2757230592u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F84F */, /*9526*/{2757754880u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F850 */, /*9527*/{2758279168u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F851 */, /*9528*/{2758803456u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F852 */, /*9529*/{2759327744u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F853 */, /*9530*/{2759852032u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F854 */, /*9531*/{2760376320u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F855 */, /*9532*/{2760900608u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F856 */, /*9533*/{2761424896u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F857 */, /*9534*/{2761949184u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F858 */, /*9535*/{2762473472u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F859 */, /*9536*/{2762997760u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85A */, /*9537*/{2763522048u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85B */, /*9538*/{2764046336u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85C */, /*9539*/{2764570624u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85D */, /*9540*/{2765094912u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85E */, /*9541*/{2765619200u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F85F */, /*9542*/{2766143488u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F860 */, /*9543*/{2766667776u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F861 */, /*9544*/{2767192064u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F862 */, /*9545*/{2767716352u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F863 */, /*9546*/{2768240640u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F864 */, /*9547*/{2768764928u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F865 */, /*9548*/{2769289216u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F866 */, /*9549*/{2769813504u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F867 */, /*9550*/{2770337792u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F868 */, /*9551*/{2770862080u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F869 */, /*9552*/{2771386368u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86A */, /*9553*/{2771910656u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86B */, /*9554*/{2772434944u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86C */, /*9555*/{2772959232u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86D */, /*9556*/{2773483520u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86E */, /*9557*/{2774007808u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F86F */, /*9558*/{2774532096u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F870 */, /*9559*/{2775056384u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F871 */, /*9560*/{2775580672u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F872 */, /*9561*/{2776104960u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F873 */, /*9562*/{2776629248u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F874 */, /*9563*/{2777153536u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F875 */, /*9564*/{2777677824u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F876 */, /*9565*/{2778202112u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F877 */, /*9566*/{2778726400u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F878 */, /*9567*/{2779250688u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F879 */, /*9568*/{2779774976u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87A */, /*9569*/{2780299264u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87B */, /*9570*/{2780823552u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87C */, /*9571*/{2781347840u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87D */, /*9572*/{2781872128u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87E */, /*9573*/{2782396416u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F87F */, /*9574*/{2782920704u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F880 */, /*9575*/{2783444992u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F881 */, /*9576*/{2783969280u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F882 */, /*9577*/{2784493568u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F883 */, /*9578*/{2785017856u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F884 */, /*9579*/{2785542144u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F885 */, /*9580*/{2786066432u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F886 */, /*9581*/{2786590720u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F887 */, /*9582*/{2787115008u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F888 */, /*9583*/{2787639296u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F889 */, /*9584*/{2788163584u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88A */, /*9585*/{2788687872u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88B */, /*9586*/{2789212160u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88C */, /*9587*/{2789736448u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88D */, /*9588*/{2790260736u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88E */, /*9589*/{2790785024u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F88F */, /*9590*/{2791309312u,1056768u,723784704u,77594946u,42993776u,67503936u,192u}/* 2F890 */, /*9591*/{2791833600u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F891 */, /*9592*/{2792357888u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F892 */, /*9593*/{2792882176u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F893 */, /*9594*/{2793406464u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F894 */, /*9595*/{2793930752u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F895 */, /*9596*/{2794455040u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F896 */, /*9597*/{2794979328u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F897 */, /*9598*/{2795503616u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F898 */, /*9599*/{2796027904u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F899 */, /*9600*/{2796552192u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89A */, /*9601*/{2797076480u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89B */, /*9602*/{2797600768u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89C */, /*9603*/{2798125056u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89D */, /*9604*/{2798649344u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89E */, /*9605*/{2799173632u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F89F */, /*9606*/{2799697920u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A0 */, /*9607*/{2800222208u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A1 */, /*9608*/{2800746496u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A2 */, /*9609*/{2801270784u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A3 */, /*9610*/{2801795072u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A4 */, /*9611*/{2802319360u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A5 */, /*9612*/{2802843648u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A6 */, /*9613*/{2803367936u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A7 */, /*9614*/{2803892224u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A8 */, /*9615*/{2804416512u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8A9 */, /*9616*/{2804940800u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AA */, /*9617*/{2805465088u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AB */, /*9618*/{2805989376u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AC */, /*9619*/{2806513664u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AD */, /*9620*/{2807037952u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AE */, /*9621*/{2807562240u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8AF */, /*9622*/{2808086528u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B0 */, /*9623*/{2808610816u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B1 */, /*9624*/{2809135104u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B2 */, /*9625*/{2809659392u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B3 */, /*9626*/{2810183680u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B4 */, /*9627*/{2810707968u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B5 */, /*9628*/{2811232256u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B6 */, /*9629*/{2811756544u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B7 */, /*9630*/{2812280832u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B8 */, /*9631*/{2812805120u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8B9 */, /*9632*/{2813329408u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BA */, /*9633*/{2813853696u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BB */, /*9634*/{2814377984u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BC */, /*9635*/{2814902272u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BD */, /*9636*/{2815426560u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BE */, /*9637*/{2815950848u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8BF */, /*9638*/{2816475136u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C0 */, /*9639*/{2816999424u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C1 */, /*9640*/{2817523712u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C2 */, /*9641*/{2818048000u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C3 */, /*9642*/{2818572288u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C4 */, /*9643*/{2819096576u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C5 */, /*9644*/{2819620864u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C6 */, /*9645*/{2820145152u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C7 */, /*9646*/{2820669440u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C8 */, /*9647*/{2821193728u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8C9 */, /*9648*/{2821718016u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CA */, /*9649*/{2822242304u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CB */, /*9650*/{2822766592u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CC */, /*9651*/{2823290880u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CD */, /*9652*/{2823815168u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CE */, /*9653*/{2824339456u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8CF */, /*9654*/{2824863744u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D0 */, /*9655*/{2825388032u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D1 */, /*9656*/{2825912320u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D2 */, /*9657*/{2826436608u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D3 */, /*9658*/{2826960896u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D4 */, /*9659*/{2827485184u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D5 */, /*9660*/{2828009472u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D6 */, /*9661*/{2828533760u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D7 */, /*9662*/{2829058048u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D8 */, /*9663*/{2829582336u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8D9 */, /*9664*/{2830106624u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DA */, /*9665*/{2830630912u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DB */, /*9666*/{2831155200u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DC */, /*9667*/{2831679488u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DD */, /*9668*/{2832203776u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DE */, /*9669*/{2832728064u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8DF */, /*9670*/{2833252352u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E0 */, /*9671*/{2833776640u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E1 */, /*9672*/{2834300928u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E2 */, /*9673*/{2834825216u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E3 */, /*9674*/{2835349504u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E4 */, /*9675*/{2835873792u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E5 */, /*9676*/{2836398080u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E6 */, /*9677*/{2836922368u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E7 */, /*9678*/{2837446656u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E8 */, /*9679*/{2837970944u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8E9 */, /*9680*/{2838495232u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8EA */, /*9681*/{2839019520u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8EB */, /*9682*/{2839543808u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8EC */, /*9683*/{2840068096u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8ED */, /*9684*/{2840592384u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8EE */, /*9685*/{2841116672u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8EF */, /*9686*/{2841640960u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F0 */, /*9687*/{2842165248u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F1 */, /*9688*/{2842689536u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F2 */, /*9689*/{2843213824u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F3 */, /*9690*/{2843738112u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F4 */, /*9691*/{2844262400u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F5 */, /*9692*/{2844786688u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F6 */, /*9693*/{2845310976u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F7 */, /*9694*/{2845835264u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F8 */, /*9695*/{2846359552u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8F9 */, /*9696*/{2846883840u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FA */, /*9697*/{2847408128u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FB */, /*9698*/{2847932416u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FC */, /*9699*/{2848456704u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FD */, /*9700*/{2848980992u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FE */, /*9701*/{2849505280u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F8FF */, /*9702*/{2850029568u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F900 */, /*9703*/{2850553856u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F901 */, /*9704*/{2851078144u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F902 */, /*9705*/{2851602432u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F903 */, /*9706*/{2852126720u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F904 */, /*9707*/{2852651008u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F905 */, /*9708*/{2853175296u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F906 */, /*9709*/{2853699584u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F907 */, /*9710*/{2854223872u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F908 */, /*9711*/{2854748160u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F909 */, /*9712*/{2855272448u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90A */, /*9713*/{2855796736u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90B */, /*9714*/{2856321024u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90C */, /*9715*/{2856845312u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90D */, /*9716*/{2857369600u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90E */, /*9717*/{2857893888u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F90F */, /*9718*/{2858418176u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F910 */, /*9719*/{2858942464u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F911 */, /*9720*/{2859466752u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F912 */, /*9721*/{2859991040u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F913 */, /*9722*/{2860515328u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F914 */, /*9723*/{2861039616u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F915 */, /*9724*/{2861563904u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F916 */, /*9725*/{2862088192u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F917 */, /*9726*/{2862612480u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F918 */, /*9727*/{2863136768u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F919 */, /*9728*/{2863661056u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91A */, /*9729*/{2864185344u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91B */, /*9730*/{2864709632u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91C */, /*9731*/{2865233920u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91D */, /*9732*/{2865758208u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91E */, /*9733*/{2866282496u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F91F */, /*9734*/{2866806784u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F920 */, /*9735*/{2867331072u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F921 */, /*9736*/{2867855360u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F922 */, /*9737*/{2868379648u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F923 */, /*9738*/{2868903936u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F924 */, /*9739*/{2869428224u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F925 */, /*9740*/{2869952512u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F926 */, /*9741*/{2870476800u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F927 */, /*9742*/{2871001088u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F928 */, /*9743*/{2871525376u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F929 */, /*9744*/{2872049664u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92A */, /*9745*/{2872573952u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92B */, /*9746*/{2873098240u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92C */, /*9747*/{2873622528u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92D */, /*9748*/{2874146816u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92E */, /*9749*/{2874671104u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F92F */, /*9750*/{2875195392u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F930 */, /*9751*/{2875719680u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F931 */, /*9752*/{2876243968u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F932 */, /*9753*/{2876768256u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F933 */, /*9754*/{2877292544u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F934 */, /*9755*/{2877816832u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F935 */, /*9756*/{2878341120u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F936 */, /*9757*/{2878865408u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F937 */, /*9758*/{2879389696u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F938 */, /*9759*/{2879913984u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F939 */, /*9760*/{2880438272u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93A */, /*9761*/{2880962560u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93B */, /*9762*/{2881486848u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93C */, /*9763*/{2882011136u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93D */, /*9764*/{2882535424u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93E */, /*9765*/{2883059712u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F93F */, /*9766*/{2883584000u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F940 */, /*9767*/{2884108288u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F941 */, /*9768*/{2884632576u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F942 */, /*9769*/{2885156864u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F943 */, /*9770*/{2885681152u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F944 */, /*9771*/{2886205440u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F945 */, /*9772*/{2886729728u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F946 */, /*9773*/{2887254016u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F947 */, /*9774*/{2887778304u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F948 */, /*9775*/{2888302592u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F949 */, /*9776*/{2888826880u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94A */, /*9777*/{2889351168u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94B */, /*9778*/{2889875456u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94C */, /*9779*/{2890399744u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94D */, /*9780*/{2890924032u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94E */, /*9781*/{2891448320u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F94F */, /*9782*/{2891972608u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F950 */, /*9783*/{2892496896u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F951 */, /*9784*/{2893021184u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F952 */, /*9785*/{2893545472u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F953 */, /*9786*/{2894069760u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F954 */, /*9787*/{2894594048u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F955 */, /*9788*/{2895118336u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F956 */, /*9789*/{2895642624u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F957 */, /*9790*/{2896166912u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F958 */, /*9791*/{2896691200u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F959 */, /*9792*/{2897215488u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95A */, /*9793*/{2897739776u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95B */, /*9794*/{2898264064u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95C */, /*9795*/{2898788352u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95D */, /*9796*/{2899312640u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95E */, /*9797*/{2899836928u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F95F */, /*9798*/{2900361216u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F960 */, /*9799*/{2900885504u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F961 */, /*9800*/{2901409792u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F962 */, /*9801*/{2901934080u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F963 */, /*9802*/{2902458368u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F964 */, /*9803*/{2902982656u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F965 */, /*9804*/{2903506944u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F966 */, /*9805*/{2904031232u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F967 */, /*9806*/{2904555520u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F968 */, /*9807*/{2905079808u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F969 */, /*9808*/{2905604096u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96A */, /*9809*/{2906128384u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96B */, /*9810*/{2906652672u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96C */, /*9811*/{2907176960u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96D */, /*9812*/{2907701248u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96E */, /*9813*/{2908225536u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F96F */, /*9814*/{2908749824u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F970 */, /*9815*/{2909274112u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F971 */, /*9816*/{2909798400u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F972 */, /*9817*/{2910322688u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F973 */, /*9818*/{2910846976u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F974 */, /*9819*/{2911371264u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F975 */, /*9820*/{2911895552u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F976 */, /*9821*/{2912419840u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F977 */, /*9822*/{2912944128u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F978 */, /*9823*/{2913468416u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F979 */, /*9824*/{2913992704u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97A */, /*9825*/{2914516992u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97B */, /*9826*/{2915041280u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97C */, /*9827*/{2915565568u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97D */, /*9828*/{2916089856u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97E */, /*9829*/{2916614144u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F97F */, /*9830*/{2917138432u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F980 */, /*9831*/{2917662720u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F981 */, /*9832*/{2918187008u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F982 */, /*9833*/{2918711296u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F983 */, /*9834*/{2919235584u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F984 */, /*9835*/{2919759872u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F985 */, /*9836*/{2920284160u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F986 */, /*9837*/{2920808448u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F987 */, /*9838*/{2921332736u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F988 */, /*9839*/{2921857024u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F989 */, /*9840*/{2922381312u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98A */, /*9841*/{2922905600u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98B */, /*9842*/{2923429888u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98C */, /*9843*/{2923954176u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98D */, /*9844*/{2924478464u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98E */, /*9845*/{2925002752u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F98F */, /*9846*/{2925527040u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F990 */, /*9847*/{2926051328u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F991 */, /*9848*/{2926575616u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F992 */, /*9849*/{2927099904u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F993 */, /*9850*/{2927624192u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F994 */, /*9851*/{2928148480u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F995 */, /*9852*/{2928672768u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F996 */, /*9853*/{2929197056u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F997 */, /*9854*/{2929721344u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F998 */, /*9855*/{2930245632u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F999 */, /*9856*/{2930769920u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99A */, /*9857*/{2931294208u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99B */, /*9858*/{2931818496u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99C */, /*9859*/{2932342784u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99D */, /*9860*/{2932867072u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99E */, /*9861*/{2933391360u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F99F */, /*9862*/{2933915648u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A0 */, /*9863*/{2934439936u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A1 */, /*9864*/{2934964224u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A2 */, /*9865*/{2935488512u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A3 */, /*9866*/{2936012800u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A4 */, /*9867*/{2936537088u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A5 */, /*9868*/{2937061376u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A6 */, /*9869*/{2937585664u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A7 */, /*9870*/{2938109952u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A8 */, /*9871*/{2938634240u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9A9 */, /*9872*/{2939158528u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AA */, /*9873*/{2939682816u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AB */, /*9874*/{2940207104u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AC */, /*9875*/{2940731392u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AD */, /*9876*/{2941255680u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AE */, /*9877*/{2941779968u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9AF */, /*9878*/{2942304256u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B0 */, /*9879*/{2942828544u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B1 */, /*9880*/{2943352832u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B2 */, /*9881*/{2943877120u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B3 */, /*9882*/{2944401408u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B4 */, /*9883*/{2944925696u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B5 */, /*9884*/{2945449984u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B6 */, /*9885*/{2945974272u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B7 */, /*9886*/{2946498560u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B8 */, /*9887*/{2947022848u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9B9 */, /*9888*/{2947547136u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BA */, /*9889*/{2948071424u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BB */, /*9890*/{2948595712u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BC */, /*9891*/{2949120000u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BD */, /*9892*/{2949644288u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BE */, /*9893*/{2950168576u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9BF */, /*9894*/{2950692864u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C0 */, /*9895*/{2951217152u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C1 */, /*9896*/{2951741440u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C2 */, /*9897*/{2952265728u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C3 */, /*9898*/{2952790016u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C4 */, /*9899*/{2953314304u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C5 */, /*9900*/{2953838592u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C6 */, /*9901*/{2954362880u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C7 */, /*9902*/{2954887168u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C8 */, /*9903*/{2955411456u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9C9 */, /*9904*/{2955935744u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CA */, /*9905*/{2956460032u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CB */, /*9906*/{2956984320u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CC */, /*9907*/{2957508608u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CD */, /*9908*/{2958032896u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CE */, /*9909*/{2958557184u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9CF */, /*9910*/{2959081472u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D0 */, /*9911*/{2959605760u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D1 */, /*9912*/{2960130048u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D2 */, /*9913*/{2960654336u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D3 */, /*9914*/{2961178624u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D4 */, /*9915*/{2961702912u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D5 */, /*9916*/{2962227200u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D6 */, /*9917*/{2962751488u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D7 */, /*9918*/{2963275776u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D8 */, /*9919*/{2963800064u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9D9 */, /*9920*/{2964324352u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DA */, /*9921*/{2964848640u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DB */, /*9922*/{2965372928u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DC */, /*9923*/{2965897216u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DD */, /*9924*/{2966421504u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DE */, /*9925*/{2966945792u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9DF */, /*9926*/{2967470080u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E0 */, /*9927*/{2967994368u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E1 */, /*9928*/{2968518656u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E2 */, /*9929*/{2969042944u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E3 */, /*9930*/{2969567232u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E4 */, /*9931*/{2970091520u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E5 */, /*9932*/{2970615808u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E6 */, /*9933*/{2971140096u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E7 */, /*9934*/{2971664384u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E8 */, /*9935*/{2972188672u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9E9 */, /*9936*/{2972712960u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9EA */, /*9937*/{2973237248u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9EB */, /*9938*/{2973761536u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9EC */, /*9939*/{2974285824u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9ED */, /*9940*/{2974810112u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9EE */, /*9941*/{2975334400u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9EF */, /*9942*/{2975858688u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F0 */, /*9943*/{2976382976u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F1 */, /*9944*/{2976907264u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F2 */, /*9945*/{2977431552u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F3 */, /*9946*/{2977955840u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F4 */, /*9947*/{2978480128u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F5 */, /*9948*/{2979004416u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F6 */, /*9949*/{2979528704u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F7 */, /*9950*/{2980052992u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F8 */, /*9951*/{2980577280u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9F9 */, /*9952*/{2981101568u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FA */, /*9953*/{2981625856u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FB */, /*9954*/{2982150144u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FC */, /*9955*/{2982674432u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FD */, /*9956*/{2983198720u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FE */, /*9957*/{2983723008u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2F9FF */, /*9958*/{2984247296u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA00 */, /*9959*/{2984771584u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA01 */, /*9960*/{2985295872u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA02 */, /*9961*/{2985820160u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA03 */, /*9962*/{2986344448u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA04 */, /*9963*/{2986868736u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA05 */, /*9964*/{2987393024u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA06 */, /*9965*/{2987917312u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA07 */, /*9966*/{2988441600u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA08 */, /*9967*/{2988965888u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA09 */, /*9968*/{2989490176u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0A */, /*9969*/{2990014464u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0B */, /*9970*/{2990538752u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0C */, /*9971*/{2991063040u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0D */, /*9972*/{2991587328u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0E */, /*9973*/{2992111616u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA0F */, /*9974*/{2992635904u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA10 */, /*9975*/{2993160192u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA11 */, /*9976*/{2993684480u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA12 */, /*9977*/{2994208768u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA13 */, /*9978*/{2994733056u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA14 */, /*9979*/{2995257344u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA15 */, /*9980*/{2995781632u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA16 */, /*9981*/{2996305920u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA17 */, /*9982*/{2996830208u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA18 */, /*9983*/{2997354496u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA19 */, /*9984*/{2997878784u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA1A */, /*9985*/{2998403072u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA1B */, /*9986*/{2998927360u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA1C */, /*9987*/{2999451648u,1056768u,2359296u,77594946u,9437296u,67503936u,192u}/* 2FA1D */, /*9988*/{0,1060864u,65537u,78334976u,810746546u,2220883968u,3892314112u}/* E0001 */, /*9989*/{0,1060864u,65537u,78334976u,810746546u,2218786816u,3355443200u}/* E0020 */, /*9990*/{0,1060864u,65537u,78334976u,810746546u,2218786816u,3221225472u}/* E0021 */, /*9991*/{0,1060864u,65537u,78334976u,810746546u,2220883968u,3221225472u}/* E007F */, /*9992*/{0,1064960u,2686976u,82590080u,808714928u,2218853380u,3355443840u}/* E0100 */, /*9993*/{0,1064960u,2686976u,82590080u,808714928u,2218853380u,3221226112u}/* E0101 */, /*9994*/{0,1069056u,1u,71304256u,197298u,71303168u,3892314112u}/* F0000 */, /*9995*/{0,1069056u,1u,71304256u,690u,0,3221225472u}/* F0001 */, /*9996*/{0,1073152u,1u,71304256u,690u,0,3758096384u}/* 100000 */, /*9997*/{0,1073152u,1u,71304256u,690u,0,3221225472u}/* 100001 */, /*9998*/{0,0,1u,71303168u,674u,0,3758096384u}/* 110000 */ }; static const MVMUnicodeNamedValue unicode_property_keypairs[3606] = { {"S",84},{"N",67},{"Symbol",84},{"Cased_Letter",62},{"Punctuation",79},{"Z",94},{"Number",67},{"mark",65},{"symbol",84}, {"LC",62},{"letter",61},{"s",84},{"c",34},{"combiningmark",65},{"other",34},{"z",94},{"CombiningMark",65},{"Mark",65}, {"Combining_Mark",65},{"Separator",94},{"number",67},{"Letter",61},{"CasedLetter",62},{"Other",34},{"M",65},{"C",34}, {"L",61},{"punctuation",79},{"n",67},{"casedletter",62},{"P",79},{"m",65},{"l",61},{"p",79},{"separator",94}, {"punct",79},{"lc",62},{"CWKCF",41},{"Pattern_Syntax",80},{"patsyn",80},{"PatternSyntax",80},{"patternsyntax",80}, {"IDS",58},{"Dep",46},{"ci",36},{"Case_Ignorable",36},{"caseignorable",36},{"CaseIgnorable",36},{"nfcquickcheck",28}, {"maybe",28},{"NFCQuickCheck",28},{"m",28},{"nfcqc",28},{"NFC_Quick_Check",28},{"M",28},{"Maybe",28},{"OAlpha",71}, {"NFKCQC",27},{"Lower",64},{"idstart",58},{"IDStart",58},{"ids",58},{"ID_Start",58},{"DI",45},{"AHex",20}, {"Changes_When_Titlecased",42},{"cwt",42},{"ChangesWhenTitlecased",42},{"changeswhentitlecased",42},{"OLower",76}, {"LOE",63},{"patws",81},{"patternwhitespace",81},{"Pattern_White_Space",81},{"PatternWhiteSpace",81},{"NFKDQC",69}, {"Bidi_M",33},{"Radical",83},{"cased",37},{"Cased",37},{"STerm",85},{"Ext",48},{"ASCIIHexDigit",20}, {"ASCII_Hex_Digit",20},{"asciihexdigit",20},{"ahex",20},{"OMath",77},{"ODI",72},{"JoinC",60},{"Diacritic",47}, {"diacritic",47},{"dia",47},{"xidstart",93},{"XID_Start",93},{"XIDStart",93},{"xids",93},{"Term",87},{"QMark",82}, {"nfdquickcheck",68},{"NFD_Quick_Check",68},{"NFDQuickCheck",68},{"nfdqc",68},{"GrLink",52},{"XIDS",93},{"Bidi_C",32}, {"odi",72},{"Other_Default_Ignorable_Code_Point",72},{"otherdefaultignorablecodepoint",72}, {"OtherDefaultIgnorableCodePoint",72},{"bidimirrored",33},{"bidim",33},{"BidiMirrored",33},{"Bidi_Mirrored",33}, {"olower",76},{"OtherLowercase",76},{"Other_Lowercase",76},{"otherlowercase",76},{"XID_Continue",92},{"xidcontinue",92}, {"XIDContinue",92},{"xidc",92},{"Math",66},{"BidiControl",32},{"bidic",32},{"Bidi_Control",32},{"bidicontrol",32}, {"Extender",48},{"extender",48},{"ext",48},{"Changes_When_Casemapped",39},{"cwcm",39},{"changeswhencasemapped",39}, {"ChangesWhenCasemapped",39},{"Comp_Ex",49},{"GraphemeLink",52},{"Grapheme_Link",52},{"grlink",52},{"graphemelink",52}, {"CWU",43},{"PatWS",81},{"NFD_QC",68},{"CI",36},{"Soft_Dotted",86},{"softdotted",86},{"SoftDotted",86},{"sd",86}, {"ChangesWhenLowercased",40},{"Changes_When_Lowercased",40},{"changeswhenlowercased",40},{"cwl",40},{"dash",44}, {"Dash",44},{"Hex_Digit",53},{"HexDigit",53},{"hexdigit",53},{"hex",53},{"graphemebase",50},{"Grapheme_Base",50}, {"grbase",50},{"GraphemeBase",50},{"IDSBinaryOperator",55},{"idsbinaryoperator",55},{"IDS_Binary_Operator",55}, {"idsb",55},{"Ideo",59},{"OGr_Ext",73},{"noncharactercodepoint",70},{"Noncharacter_Code_Point",70}, {"NoncharacterCodePoint",70},{"nchar",70},{"Dash",44},{"sterm",85},{"STerm",85},{"NFKDQuickCheck",69}, {"NFKD_Quick_Check",69},{"nfkdqc",69},{"nfkdquickcheck",69},{"NFKD_QC",69},{"OtherIDStart",75},{"otheridstart",75}, {"oids",75},{"Other_ID_Start",75},{"joincontrol",60},{"Join_Control",60},{"JoinControl",60},{"joinc",60}, {"graphemeextend",51},{"grext",51},{"GraphemeExtend",51},{"Grapheme_Extend",51},{"idcontinue",57},{"idc",57}, {"ID_Continue",57},{"IDContinue",57},{"OtherMath",77},{"othermath",77},{"omath",77},{"Other_Math",77},{"Hex",53}, {"othergraphemeextend",73},{"Other_Grapheme_Extend",73},{"ogrext",73},{"OtherGraphemeExtend",73},{"NFDQC",68}, {"CompEx",49},{"maybe",27},{"NFKCQuickCheck",27},{"m",27},{"nfkcqc",27},{"NFKC_Quick_Check",27},{"M",27}, {"nfkcquickcheck",27},{"Maybe",27},{"Pat_Syn",80},{"OtherAlphabetic",71},{"Other_Alphabetic",71},{"otheralphabetic",71}, {"oalpha",71},{"CWL",40},{"OUpper",78},{"GrBase",50},{"WSpace",91},{"lower",64},{"lowercase",64},{"Lowercase",64}, {"idstrinaryoperator",56},{"IDSTrinaryOperator",56},{"idst",56},{"IDS_Trinary_Operator",56},{"XIDC",92},{"Alpha",29}, {"Radical",83},{"radical",83},{"DefaultIgnorableCodePoint",45},{"di",45},{"defaultignorablecodepoint",45}, {"Default_Ignorable_Code_Point",45},{"whitespace",91},{"wspace",91},{"WhiteSpace",91},{"White_Space",91},{"PatSyn",80}, {"alpha",29},{"alphabetic",29},{"Alphabetic",29},{"IDSB",55},{"oupper",78},{"Other_Uppercase",78},{"otheruppercase",78}, {"OtherUppercase",78},{"NChar",70},{"Math",66},{"math",66},{"UIdeo",88},{"Hyphen",54},{"Quotation_Mark",82}, {"QuotationMark",82},{"quotationmark",82},{"qmark",82},{"CWCM",39},{"Dia",47},{"Ideographic",59},{"ideo",59}, {"ideographic",59},{"NFC_QC",28},{"GrExt",51},{"hyphen",54},{"Hyphen",54},{"changeswhennfkccasefolded",41}, {"ChangesWhenNFKCCasefolded",41},{"Changes_When_NFKC_Casefolded",41},{"cwkcf",41},{"Other_ID_Continue",74}, {"OtherIDContinue",74},{"otheridcontinue",74},{"oidc",74},{"Pat_WS",81},{"SD",86},{"Full_Composition_Exclusion",49}, {"fullcompositionexclusion",49},{"compex",49},{"FullCompositionExclusion",49},{"Upper",89},{"CWCF",38},{"OIDC",74}, {"IDST",56},{"Gr_Ext",51},{"VS",90},{"Join_C",60},{"Cased",37},{"CWT",42},{"BidiC",32},{"ChangesWhenCasefolded",38}, {"changeswhencasefolded",38},{"Changes_When_Casefolded",38},{"cwcf",38},{"Gr_Link",52},{"logicalorderexception",63}, {"Logical_Order_Exception",63},{"LogicalOrderException",63},{"loe",63},{"TerminalPunctuation",87}, {"terminalpunctuation",87},{"Terminal_Punctuation",87},{"term",87},{"OGrExt",73},{"deprecated",46},{"dep",46}, {"Deprecated",46},{"NFKC_QC",27},{"changeswhenuppercased",43},{"Changes_When_Uppercased",43}, {"ChangesWhenUppercased",43},{"cwu",43},{"uppercase",89},{"Uppercase",89},{"upper",89},{"Unified_Ideograph",88}, {"unifiedideograph",88},{"uideo",88},{"UnifiedIdeograph",88},{"IDC",57},{"NFCQC",28},{"OIDS",75},{"Gr_Base",50}, {"variationselector",90},{"VariationSelector",90},{"Variation_Selector",90},{"vs",90},{"BidiM",33},{"gc",17}, {"General_Category",17},{"GeneralCategory",17},{"generalcategory",17},{"Cc",17},{"cc",17},{"Control",17},{"control",17}, {"cntrl",17},{"Cf",17},{"cf",17},{"Format",17},{"format",17},{"Cn",17},{"cn",17},{"Unassigned",17},{"unassigned",17}, {"Co",17},{"co",17},{"Private_Use",17},{"PrivateUse",17},{"privateuse",17},{"Cs",17},{"cs",17},{"Surrogate",17}, {"surrogate",17},{"Ll",17},{"ll",17},{"Lowercase_Letter",17},{"LowercaseLetter",17},{"lowercaseletter",17},{"Lm",17}, {"lm",17},{"Modifier_Letter",17},{"ModifierLetter",17},{"modifierletter",17},{"Lo",17},{"lo",17},{"Other_Letter",17}, {"OtherLetter",17},{"otherletter",17},{"Lt",17},{"lt",17},{"Titlecase_Letter",17},{"TitlecaseLetter",17}, {"titlecaseletter",17},{"Lu",17},{"lu",17},{"Uppercase_Letter",17},{"UppercaseLetter",17},{"uppercaseletter",17}, {"Mc",17},{"mc",17},{"Spacing_Mark",17},{"SpacingMark",17},{"spacingmark",17},{"Me",17},{"me",17},{"Enclosing_Mark",17}, {"EnclosingMark",17},{"enclosingmark",17},{"Mn",17},{"mn",17},{"Nonspacing_Mark",17},{"NonspacingMark",17}, {"nonspacingmark",17},{"Nd",17},{"nd",17},{"Decimal_Number",17},{"DecimalNumber",17},{"decimalnumber",17},{"digit",17}, {"Nl",17},{"nl",17},{"Letter_Number",17},{"LetterNumber",17},{"letternumber",17},{"No",17},{"no",17},{"Other_Number",17}, {"OtherNumber",17},{"othernumber",17},{"Pc",17},{"pc",17},{"Connector_Punctuation",17},{"ConnectorPunctuation",17}, {"connectorpunctuation",17},{"Pd",17},{"pd",17},{"Dash_Punctuation",17},{"DashPunctuation",17},{"dashpunctuation",17}, {"Pe",17},{"pe",17},{"Close_Punctuation",17},{"ClosePunctuation",17},{"closepunctuation",17},{"Pf",17},{"pf",17}, {"Final_Punctuation",17},{"FinalPunctuation",17},{"finalpunctuation",17},{"Pi",17},{"pi",17},{"Initial_Punctuation",17}, {"InitialPunctuation",17},{"initialpunctuation",17},{"Po",17},{"po",17},{"Other_Punctuation",17},{"OtherPunctuation",17}, {"otherpunctuation",17},{"Ps",17},{"ps",17},{"Open_Punctuation",17},{"OpenPunctuation",17},{"openpunctuation",17}, {"Sc",17},{"sc",17},{"Currency_Symbol",17},{"CurrencySymbol",17},{"currencysymbol",17},{"Sk",17},{"sk",17}, {"Modifier_Symbol",17},{"ModifierSymbol",17},{"modifiersymbol",17},{"Sm",17},{"sm",17},{"Math_Symbol",17}, {"MathSymbol",17},{"mathsymbol",17},{"So",17},{"so",17},{"Other_Symbol",17},{"OtherSymbol",17},{"othersymbol",17}, {"Zl",17},{"zl",17},{"Line_Separator",17},{"LineSeparator",17},{"lineseparator",17},{"Zp",17},{"zp",17}, {"Paragraph_Separator",17},{"ParagraphSeparator",17},{"paragraphseparator",17},{"Zs",17},{"zs",17}, {"Space_Separator",17},{"SpaceSeparator",17},{"spaceseparator",17},{"sc",9},{"Script",9},{"script",9},{"Aghb",9}, {"aghb",9},{"Caucasian_Albanian",9},{"CaucasianAlbanian",9},{"caucasianalbanian",9},{"Ahom",9},{"ahom",9},{"Arab",9}, {"arab",9},{"Arabic",9},{"arabic",9},{"Armi",9},{"armi",9},{"Imperial_Aramaic",9},{"ImperialAramaic",9}, {"imperialaramaic",9},{"Armn",9},{"armn",9},{"Armenian",9},{"armenian",9},{"Avst",9},{"avst",9},{"Avestan",9}, {"avestan",9},{"Bali",9},{"bali",9},{"Balinese",9},{"balinese",9},{"Bamu",9},{"bamu",9},{"Bamum",9},{"bamum",9}, {"Bass",9},{"bass",9},{"Bassa_Vah",9},{"BassaVah",9},{"bassavah",9},{"Batk",9},{"batk",9},{"Batak",9},{"batak",9}, {"Beng",9},{"beng",9},{"Bengali",9},{"bengali",9},{"Bopo",9},{"bopo",9},{"Bopomofo",9},{"bopomofo",9},{"Brah",9}, {"brah",9},{"Brahmi",9},{"brahmi",9},{"Brai",9},{"brai",9},{"Braille",9},{"braille",9},{"Bugi",9},{"bugi",9}, {"Buginese",9},{"buginese",9},{"Buhd",9},{"buhd",9},{"Buhid",9},{"buhid",9},{"Cakm",9},{"cakm",9},{"Chakma",9}, {"chakma",9},{"Cans",9},{"cans",9},{"Canadian_Aboriginal",9},{"CanadianAboriginal",9},{"canadianaboriginal",9}, {"Cari",9},{"cari",9},{"Carian",9},{"carian",9},{"Cham",9},{"cham",9},{"Cher",9},{"cher",9},{"Cherokee",9}, {"cherokee",9},{"Copt",9},{"copt",9},{"Coptic",9},{"coptic",9},{"Qaac",9},{"qaac",9},{"Cprt",9},{"cprt",9},{"Cypriot",9}, {"cypriot",9},{"Cyrl",9},{"cyrl",9},{"Cyrillic",9},{"cyrillic",9},{"Deva",9},{"deva",9},{"Devanagari",9}, {"devanagari",9},{"Dsrt",9},{"dsrt",9},{"Deseret",9},{"deseret",9},{"Dupl",9},{"dupl",9},{"Duployan",9},{"duployan",9}, {"Egyp",9},{"egyp",9},{"Egyptian_Hieroglyphs",9},{"EgyptianHieroglyphs",9},{"egyptianhieroglyphs",9},{"Elba",9}, {"elba",9},{"Elbasan",9},{"elbasan",9},{"Ethi",9},{"ethi",9},{"Ethiopic",9},{"ethiopic",9},{"Geor",9},{"geor",9}, {"Georgian",9},{"georgian",9},{"Glag",9},{"glag",9},{"Glagolitic",9},{"glagolitic",9},{"Goth",9},{"goth",9},{"Gothic",9}, {"gothic",9},{"Gran",9},{"gran",9},{"Grantha",9},{"grantha",9},{"Grek",9},{"grek",9},{"Greek",9},{"greek",9},{"Gujr",9}, {"gujr",9},{"Gujarati",9},{"gujarati",9},{"Guru",9},{"guru",9},{"Gurmukhi",9},{"gurmukhi",9},{"Hang",9},{"hang",9}, {"Hangul",9},{"hangul",9},{"Hani",9},{"hani",9},{"Han",9},{"han",9},{"Hano",9},{"hano",9},{"Hanunoo",9},{"hanunoo",9}, {"Hatr",9},{"hatr",9},{"Hatran",9},{"hatran",9},{"Hebr",9},{"hebr",9},{"Hebrew",9},{"hebrew",9},{"Hira",9},{"hira",9}, {"Hiragana",9},{"hiragana",9},{"Hluw",9},{"hluw",9},{"Anatolian_Hieroglyphs",9},{"AnatolianHieroglyphs",9}, {"anatolianhieroglyphs",9},{"Hmng",9},{"hmng",9},{"Pahawh_Hmong",9},{"PahawhHmong",9},{"pahawhhmong",9},{"Hrkt",9}, {"hrkt",9},{"Katakana_Or_Hiragana",9},{"KatakanaOrHiragana",9},{"katakanaorhiragana",9},{"Hung",9},{"hung",9}, {"Old_Hungarian",9},{"OldHungarian",9},{"oldhungarian",9},{"Ital",9},{"ital",9},{"Old_Italic",9},{"OldItalic",9}, {"olditalic",9},{"Java",9},{"java",9},{"Javanese",9},{"javanese",9},{"Kali",9},{"kali",9},{"Kayah_Li",9},{"KayahLi",9}, {"kayahli",9},{"Kana",9},{"kana",9},{"Katakana",9},{"katakana",9},{"Khar",9},{"khar",9},{"Kharoshthi",9}, {"kharoshthi",9},{"Khmr",9},{"khmr",9},{"Khmer",9},{"khmer",9},{"Khoj",9},{"khoj",9},{"Khojki",9},{"khojki",9}, {"Knda",9},{"knda",9},{"Kannada",9},{"kannada",9},{"Kthi",9},{"kthi",9},{"Kaithi",9},{"kaithi",9},{"Lana",9},{"lana",9}, {"Tai_Tham",9},{"TaiTham",9},{"taitham",9},{"Laoo",9},{"laoo",9},{"Lao",9},{"lao",9},{"Latn",9},{"latn",9},{"Latin",9}, {"latin",9},{"Lepc",9},{"lepc",9},{"Lepcha",9},{"lepcha",9},{"Limb",9},{"limb",9},{"Limbu",9},{"limbu",9},{"Lina",9}, {"lina",9},{"Linear_A",9},{"LinearA",9},{"lineara",9},{"Linb",9},{"linb",9},{"Linear_B",9},{"LinearB",9},{"linearb",9}, {"Lisu",9},{"lisu",9},{"Lyci",9},{"lyci",9},{"Lycian",9},{"lycian",9},{"Lydi",9},{"lydi",9},{"Lydian",9},{"lydian",9}, {"Mahj",9},{"mahj",9},{"Mahajani",9},{"mahajani",9},{"Mand",9},{"mand",9},{"Mandaic",9},{"mandaic",9},{"Mani",9}, {"mani",9},{"Manichaean",9},{"manichaean",9},{"Mend",9},{"mend",9},{"Mende_Kikakui",9},{"MendeKikakui",9}, {"mendekikakui",9},{"Merc",9},{"merc",9},{"Meroitic_Cursive",9},{"MeroiticCursive",9},{"meroiticcursive",9},{"Mero",9}, {"mero",9},{"Meroitic_Hieroglyphs",9},{"MeroiticHieroglyphs",9},{"meroitichieroglyphs",9},{"Mlym",9},{"mlym",9}, {"Malayalam",9},{"malayalam",9},{"Modi",9},{"modi",9},{"Mong",9},{"mong",9},{"Mongolian",9},{"mongolian",9},{"Mroo",9}, {"mroo",9},{"Mro",9},{"mro",9},{"Mtei",9},{"mtei",9},{"Meetei_Mayek",9},{"MeeteiMayek",9},{"meeteimayek",9},{"Mult",9}, {"mult",9},{"Multani",9},{"multani",9},{"Mymr",9},{"mymr",9},{"Myanmar",9},{"myanmar",9},{"Narb",9},{"narb",9}, {"Old_North_Arabian",9},{"OldNorthArabian",9},{"oldnortharabian",9},{"Nbat",9},{"nbat",9},{"Nabataean",9}, {"nabataean",9},{"Nkoo",9},{"nkoo",9},{"Nko",9},{"nko",9},{"Ogam",9},{"ogam",9},{"Ogham",9},{"ogham",9},{"Olck",9}, {"olck",9},{"Ol_Chiki",9},{"OlChiki",9},{"olchiki",9},{"Orkh",9},{"orkh",9},{"Old_Turkic",9},{"OldTurkic",9}, {"oldturkic",9},{"Orya",9},{"orya",9},{"Oriya",9},{"oriya",9},{"Osma",9},{"osma",9},{"Osmanya",9},{"osmanya",9}, {"Palm",9},{"palm",9},{"Palmyrene",9},{"palmyrene",9},{"Pauc",9},{"pauc",9},{"Pau_Cin_Hau",9},{"PauCinHau",9}, {"paucinhau",9},{"Perm",9},{"perm",9},{"Old_Permic",9},{"OldPermic",9},{"oldpermic",9},{"Phag",9},{"phag",9}, {"Phags_Pa",9},{"PhagsPa",9},{"phagspa",9},{"Phli",9},{"phli",9},{"Inscriptional_Pahlavi",9},{"InscriptionalPahlavi",9}, {"inscriptionalpahlavi",9},{"Phlp",9},{"phlp",9},{"Psalter_Pahlavi",9},{"PsalterPahlavi",9},{"psalterpahlavi",9}, {"Phnx",9},{"phnx",9},{"Phoenician",9},{"phoenician",9},{"Plrd",9},{"plrd",9},{"Miao",9},{"miao",9},{"Prti",9}, {"prti",9},{"Inscriptional_Parthian",9},{"InscriptionalParthian",9},{"inscriptionalparthian",9},{"Rjng",9},{"rjng",9}, {"Rejang",9},{"rejang",9},{"Runr",9},{"runr",9},{"Runic",9},{"runic",9},{"Samr",9},{"samr",9},{"Samaritan",9}, {"samaritan",9},{"Sarb",9},{"sarb",9},{"Old_South_Arabian",9},{"OldSouthArabian",9},{"oldsoutharabian",9},{"Saur",9}, {"saur",9},{"Saurashtra",9},{"saurashtra",9},{"Sgnw",9},{"sgnw",9},{"SignWriting",9},{"signwriting",9},{"Shaw",9}, {"shaw",9},{"Shavian",9},{"shavian",9},{"Shrd",9},{"shrd",9},{"Sharada",9},{"sharada",9},{"Sidd",9},{"sidd",9}, {"Siddham",9},{"siddham",9},{"Sind",9},{"sind",9},{"Khudawadi",9},{"khudawadi",9},{"Sinh",9},{"sinh",9},{"Sinhala",9}, {"sinhala",9},{"Sora",9},{"sora",9},{"Sora_Sompeng",9},{"SoraSompeng",9},{"sorasompeng",9},{"Sund",9},{"sund",9}, {"Sundanese",9},{"sundanese",9},{"Sylo",9},{"sylo",9},{"Syloti_Nagri",9},{"SylotiNagri",9},{"sylotinagri",9},{"Syrc",9}, {"syrc",9},{"Syriac",9},{"syriac",9},{"Tagb",9},{"tagb",9},{"Tagbanwa",9},{"tagbanwa",9},{"Takr",9},{"takr",9}, {"Takri",9},{"takri",9},{"Tale",9},{"tale",9},{"Tai_Le",9},{"TaiLe",9},{"taile",9},{"Talu",9},{"talu",9}, {"New_Tai_Lue",9},{"NewTaiLue",9},{"newtailue",9},{"Taml",9},{"taml",9},{"Tamil",9},{"tamil",9},{"Tavt",9},{"tavt",9}, {"Tai_Viet",9},{"TaiViet",9},{"taiviet",9},{"Telu",9},{"telu",9},{"Telugu",9},{"telugu",9},{"Tfng",9},{"tfng",9}, {"Tifinagh",9},{"tifinagh",9},{"Tglg",9},{"tglg",9},{"Tagalog",9},{"tagalog",9},{"Thaa",9},{"thaa",9},{"Thaana",9}, {"thaana",9},{"Thai",9},{"thai",9},{"Tibt",9},{"tibt",9},{"Tibetan",9},{"tibetan",9},{"Tirh",9},{"tirh",9},{"Tirhuta",9}, {"tirhuta",9},{"Ugar",9},{"ugar",9},{"Ugaritic",9},{"ugaritic",9},{"Vaii",9},{"vaii",9},{"Vai",9},{"vai",9},{"Wara",9}, {"wara",9},{"Warang_Citi",9},{"WarangCiti",9},{"warangciti",9},{"Xpeo",9},{"xpeo",9},{"Old_Persian",9},{"OldPersian",9}, {"oldpersian",9},{"Xsux",9},{"xsux",9},{"Cuneiform",9},{"cuneiform",9},{"Yiii",9},{"yiii",9},{"Yi",9},{"yi",9}, {"Zinh",9},{"zinh",9},{"Inherited",9},{"inherited",9},{"Qaai",9},{"qaai",9},{"Zyyy",9},{"zyyy",9},{"Common",9}, {"common",9},{"Zzzz",9},{"zzzz",9},{"Unknown",9},{"unknown",9},{"S",84},{"s",84},{"Canonical_Combining_Class",13}, {"CanonicalCombiningClass",13},{"canonicalcombiningclass",13},{"cwkcf",41},{"changeswhennfkccasefolded",41},{"ids",58}, {"idstart",58},{"dep",46},{"deprecated",46},{"Changes_When_Casemapped",39},{"ChangesWhenCasemapped",39}, {"changeswhencasemapped",39},{"Numeric_Type",26},{"NumericType",26},{"numerictype",26},{"NFKC_Quick_Check",27}, {"NFKCQuickCheck",27},{"nfkcquickcheck",27},{"oalpha",71},{"otheralphabetic",71},{"lower",64},{"lowercase",64}, {"IDS_Binary_Operator",55},{"IDSBinaryOperator",55},{"idsbinaryoperator",55},{"GCB",24},{"gcb",24}, {"Grapheme_Cluster_Break",24},{"GraphemeClusterBreak",24},{"graphemeclusterbreak",24},{"CN",24},{"cn",24},{"Control",24}, {"control",24},{"CR",24},{"cr",24},{"EX",24},{"ex",24},{"Extend",24},{"extend",24},{"L",24},{"l",24},{"LF",24},{"lf",24}, {"LV",24},{"lv",24},{"LVT",24},{"lvt",24},{"PP",24},{"pp",24},{"Prepend",24},{"prepend",24},{"RI",24},{"ri",24}, {"Regional_Indicator",24},{"RegionalIndicator",24},{"regionalindicator",24},{"SM",24},{"sm",24},{"SpacingMark",24}, {"spacingmark",24},{"T",24},{"t",24},{"V",24},{"v",24},{"XX",24},{"xx",24},{"Other",24},{"other",24}, {"IDS_Trinary_Operator",56},{"IDSTrinaryOperator",56},{"idstrinaryoperator",56},{"Lowercase",64},{"lowercase",64}, {"di",45},{"defaultignorablecodepoint",45},{"ahex",20},{"asciihexdigit",20},{"Diacritic",47},{"diacritic",47},{"LC",62}, {"lc",62},{"olower",76},{"otherlowercase",76},{"NFD_Quick_Check",68},{"NFDQuickCheck",68},{"nfdquickcheck",68}, {"loe",63},{"logicalorderexception",63},{"NFKD_Quick_Check",69},{"NFKDQuickCheck",69},{"nfkdquickcheck",69}, {"Joining_Group",11},{"JoiningGroup",11},{"joininggroup",11},{"BidiM",33},{"bidim",33},{"bidimirrored",33}, {"Hex_Digit",53},{"HexDigit",53},{"hexdigit",53},{"radical",83},{"sterm",85},{"ext",48},{"extender",48},{"omath",77}, {"othermath",77},{"odi",72},{"otherdefaultignorablecodepoint",72},{"M",65},{"m",65},{"C",34},{"c",34},{"term",87}, {"terminalpunctuation",87},{"qmark",82},{"quotationmark",82},{"xids",93},{"xidstart",93},{"BidiC",32},{"bidic",32}, {"bidicontrol",32},{"blk",5},{"Block",5},{"block",5},{"Aegean_Numbers",5},{"AegeanNumbers",5},{"aegeannumbers",5}, {"Ahom",5},{"ahom",5},{"Alchemical",5},{"alchemical",5},{"Alchemical_Symbols",5},{"AlchemicalSymbols",5}, {"alchemicalsymbols",5},{"Alphabetic_PF",5},{"AlphabeticPF",5},{"alphabeticpf",5},{"Alphabetic_Presentation_Forms",5}, {"AlphabeticPresentationForms",5},{"alphabeticpresentationforms",5},{"Anatolian_Hieroglyphs",5}, {"AnatolianHieroglyphs",5},{"anatolianhieroglyphs",5},{"Ancient_Greek_Music",5},{"AncientGreekMusic",5}, {"ancientgreekmusic",5},{"Ancient_Greek_Musical_Notation",5},{"AncientGreekMusicalNotation",5}, {"ancientgreekmusicalnotation",5},{"Ancient_Greek_Numbers",5},{"AncientGreekNumbers",5},{"ancientgreeknumbers",5}, {"Ancient_Symbols",5},{"AncientSymbols",5},{"ancientsymbols",5},{"Arabic",5},{"arabic",5},{"Arabic_Ext_A",5}, {"ArabicExtA",5},{"arabicexta",5},{"Arabic_Extended_A",5},{"ArabicExtendedA",5},{"arabicextendeda",5},{"Arabic_Math",5}, {"ArabicMath",5},{"arabicmath",5},{"Arabic_Mathematical_Alphabetic_Symbols",5},{"ArabicMathematicalAlphabeticSymbols",5}, {"arabicmathematicalalphabeticsymbols",5},{"Arabic_PF_A",5},{"ArabicPFA",5},{"arabicpfa",5}, {"Arabic_Presentation_Forms_A",5},{"ArabicPresentationFormsA",5},{"arabicpresentationformsa",5}, {"Arabic_Presentation_Forms-A",5},{"ArabicPresentationForms-A",5},{"arabicpresentationforms-a",5},{"Arabic_PF_B",5}, {"ArabicPFB",5},{"arabicpfb",5},{"Arabic_Presentation_Forms_B",5},{"ArabicPresentationFormsB",5}, {"arabicpresentationformsb",5},{"Arabic_Sup",5},{"ArabicSup",5},{"arabicsup",5},{"Arabic_Supplement",5}, {"ArabicSupplement",5},{"arabicsupplement",5},{"Armenian",5},{"armenian",5},{"Arrows",5},{"arrows",5},{"ASCII",5}, {"ascii",5},{"Basic_Latin",5},{"BasicLatin",5},{"basiclatin",5},{"Avestan",5},{"avestan",5},{"Balinese",5}, {"balinese",5},{"Bamum",5},{"bamum",5},{"Bamum_Sup",5},{"BamumSup",5},{"bamumsup",5},{"Bamum_Supplement",5}, {"BamumSupplement",5},{"bamumsupplement",5},{"Bassa_Vah",5},{"BassaVah",5},{"bassavah",5},{"Batak",5},{"batak",5}, {"Bengali",5},{"bengali",5},{"Block_Elements",5},{"BlockElements",5},{"blockelements",5},{"Bopomofo",5},{"bopomofo",5}, {"Bopomofo_Ext",5},{"BopomofoExt",5},{"bopomofoext",5},{"Bopomofo_Extended",5},{"BopomofoExtended",5}, {"bopomofoextended",5},{"Box_Drawing",5},{"BoxDrawing",5},{"boxdrawing",5},{"Brahmi",5},{"brahmi",5},{"Braille",5}, {"braille",5},{"Braille_Patterns",5},{"BraillePatterns",5},{"braillepatterns",5},{"Buginese",5},{"buginese",5}, {"Buhid",5},{"buhid",5},{"Byzantine_Music",5},{"ByzantineMusic",5},{"byzantinemusic",5},{"Byzantine_Musical_Symbols",5}, {"ByzantineMusicalSymbols",5},{"byzantinemusicalsymbols",5},{"Carian",5},{"carian",5},{"Caucasian_Albanian",5}, {"CaucasianAlbanian",5},{"caucasianalbanian",5},{"Chakma",5},{"chakma",5},{"Cham",5},{"cham",5},{"Cherokee",5}, {"cherokee",5},{"Cherokee_Sup",5},{"CherokeeSup",5},{"cherokeesup",5},{"Cherokee_Supplement",5},{"CherokeeSupplement",5}, {"cherokeesupplement",5},{"CJK",5},{"cjk",5},{"CJK_Unified_Ideographs",5},{"CJKUnifiedIdeographs",5}, {"cjkunifiedideographs",5},{"CJK_Compat",5},{"CJKCompat",5},{"cjkcompat",5},{"CJK_Compatibility",5}, {"CJKCompatibility",5},{"cjkcompatibility",5},{"CJK_Compat_Forms",5},{"CJKCompatForms",5},{"cjkcompatforms",5}, {"CJK_Compatibility_Forms",5},{"CJKCompatibilityForms",5},{"cjkcompatibilityforms",5},{"CJK_Compat_Ideographs",5}, {"CJKCompatIdeographs",5},{"cjkcompatideographs",5},{"CJK_Compatibility_Ideographs",5},{"CJKCompatibilityIdeographs",5}, {"cjkcompatibilityideographs",5},{"CJK_Compat_Ideographs_Sup",5},{"CJKCompatIdeographsSup",5}, {"cjkcompatideographssup",5},{"CJK_Compatibility_Ideographs_Supplement",5},{"CJKCompatibilityIdeographsSupplement",5}, {"cjkcompatibilityideographssupplement",5},{"CJK_Ext_A",5},{"CJKExtA",5},{"cjkexta",5}, {"CJK_Unified_Ideographs_Extension_A",5},{"CJKUnifiedIdeographsExtensionA",5},{"cjkunifiedideographsextensiona",5}, {"CJK_Ext_B",5},{"CJKExtB",5},{"cjkextb",5},{"CJK_Unified_Ideographs_Extension_B",5}, {"CJKUnifiedIdeographsExtensionB",5},{"cjkunifiedideographsextensionb",5},{"CJK_Ext_C",5},{"CJKExtC",5},{"cjkextc",5}, {"CJK_Unified_Ideographs_Extension_C",5},{"CJKUnifiedIdeographsExtensionC",5},{"cjkunifiedideographsextensionc",5}, {"CJK_Ext_D",5},{"CJKExtD",5},{"cjkextd",5},{"CJK_Unified_Ideographs_Extension_D",5}, {"CJKUnifiedIdeographsExtensionD",5},{"cjkunifiedideographsextensiond",5},{"CJK_Ext_E",5},{"CJKExtE",5},{"cjkexte",5}, {"CJK_Unified_Ideographs_Extension_E",5},{"CJKUnifiedIdeographsExtensionE",5},{"cjkunifiedideographsextensione",5}, {"CJK_Radicals_Sup",5},{"CJKRadicalsSup",5},{"cjkradicalssup",5},{"CJK_Radicals_Supplement",5}, {"CJKRadicalsSupplement",5},{"cjkradicalssupplement",5},{"CJK_Strokes",5},{"CJKStrokes",5},{"cjkstrokes",5}, {"CJK_Symbols",5},{"CJKSymbols",5},{"cjksymbols",5},{"CJK_Symbols_And_Punctuation",5},{"CJKSymbolsAndPunctuation",5}, {"cjksymbolsandpunctuation",5},{"Compat_Jamo",5},{"CompatJamo",5},{"compatjamo",5},{"Hangul_Compatibility_Jamo",5}, {"HangulCompatibilityJamo",5},{"hangulcompatibilityjamo",5},{"Control_Pictures",5},{"ControlPictures",5}, {"controlpictures",5},{"Coptic",5},{"coptic",5},{"Coptic_Epact_Numbers",5},{"CopticEpactNumbers",5}, {"copticepactnumbers",5},{"Counting_Rod",5},{"CountingRod",5},{"countingrod",5},{"Counting_Rod_Numerals",5}, {"CountingRodNumerals",5},{"countingrodnumerals",5},{"Cuneiform",5},{"cuneiform",5},{"Cuneiform_Numbers",5}, {"CuneiformNumbers",5},{"cuneiformnumbers",5},{"Cuneiform_Numbers_And_Punctuation",5}, {"CuneiformNumbersAndPunctuation",5},{"cuneiformnumbersandpunctuation",5},{"Currency_Symbols",5},{"CurrencySymbols",5}, {"currencysymbols",5},{"Cypriot_Syllabary",5},{"CypriotSyllabary",5},{"cypriotsyllabary",5},{"Cyrillic",5}, {"cyrillic",5},{"Cyrillic_Ext_A",5},{"CyrillicExtA",5},{"cyrillicexta",5},{"Cyrillic_Extended_A",5}, {"CyrillicExtendedA",5},{"cyrillicextendeda",5},{"Cyrillic_Ext_B",5},{"CyrillicExtB",5},{"cyrillicextb",5}, {"Cyrillic_Extended_B",5},{"CyrillicExtendedB",5},{"cyrillicextendedb",5},{"Cyrillic_Sup",5},{"CyrillicSup",5}, {"cyrillicsup",5},{"Cyrillic_Supplement",5},{"CyrillicSupplement",5},{"cyrillicsupplement",5}, {"Cyrillic_Supplementary",5},{"CyrillicSupplementary",5},{"cyrillicsupplementary",5},{"Deseret",5},{"deseret",5}, {"Devanagari",5},{"devanagari",5},{"Devanagari_Ext",5},{"DevanagariExt",5},{"devanagariext",5},{"Devanagari_Extended",5}, {"DevanagariExtended",5},{"devanagariextended",5},{"Diacriticals",5},{"diacriticals",5}, {"Combining_Diacritical_Marks",5},{"CombiningDiacriticalMarks",5},{"combiningdiacriticalmarks",5},{"Diacriticals_Ext",5}, {"DiacriticalsExt",5},{"diacriticalsext",5},{"Combining_Diacritical_Marks_Extended",5}, {"CombiningDiacriticalMarksExtended",5},{"combiningdiacriticalmarksextended",5},{"Diacriticals_For_Symbols",5}, {"DiacriticalsForSymbols",5},{"diacriticalsforsymbols",5},{"Combining_Diacritical_Marks_For_Symbols",5}, {"CombiningDiacriticalMarksForSymbols",5},{"combiningdiacriticalmarksforsymbols",5},{"Combining_Marks_For_Symbols",5}, {"CombiningMarksForSymbols",5},{"combiningmarksforsymbols",5},{"Diacriticals_Sup",5},{"DiacriticalsSup",5}, {"diacriticalssup",5},{"Combining_Diacritical_Marks_Supplement",5},{"CombiningDiacriticalMarksSupplement",5}, {"combiningdiacriticalmarkssupplement",5},{"Dingbats",5},{"dingbats",5},{"Domino",5},{"domino",5},{"Domino_Tiles",5}, {"DominoTiles",5},{"dominotiles",5},{"Duployan",5},{"duployan",5},{"Early_Dynastic_Cuneiform",5}, {"EarlyDynasticCuneiform",5},{"earlydynasticcuneiform",5},{"Egyptian_Hieroglyphs",5},{"EgyptianHieroglyphs",5}, {"egyptianhieroglyphs",5},{"Elbasan",5},{"elbasan",5},{"Emoticons",5},{"emoticons",5},{"Enclosed_Alphanum",5}, {"EnclosedAlphanum",5},{"enclosedalphanum",5},{"Enclosed_Alphanumerics",5},{"EnclosedAlphanumerics",5}, {"enclosedalphanumerics",5},{"Enclosed_Alphanum_Sup",5},{"EnclosedAlphanumSup",5},{"enclosedalphanumsup",5}, {"Enclosed_Alphanumeric_Supplement",5},{"EnclosedAlphanumericSupplement",5},{"enclosedalphanumericsupplement",5}, {"Enclosed_CJK",5},{"EnclosedCJK",5},{"enclosedcjk",5},{"Enclosed_CJK_Letters_And_Months",5}, {"EnclosedCJKLettersAndMonths",5},{"enclosedcjklettersandmonths",5},{"Enclosed_Ideographic_Sup",5}, {"EnclosedIdeographicSup",5},{"enclosedideographicsup",5},{"Enclosed_Ideographic_Supplement",5}, {"EnclosedIdeographicSupplement",5},{"enclosedideographicsupplement",5},{"Ethiopic",5},{"ethiopic",5},{"Ethiopic_Ext",5}, {"EthiopicExt",5},{"ethiopicext",5},{"Ethiopic_Extended",5},{"EthiopicExtended",5},{"ethiopicextended",5}, {"Ethiopic_Ext_A",5},{"EthiopicExtA",5},{"ethiopicexta",5},{"Ethiopic_Extended_A",5},{"EthiopicExtendedA",5}, {"ethiopicextendeda",5},{"Ethiopic_Sup",5},{"EthiopicSup",5},{"ethiopicsup",5},{"Ethiopic_Supplement",5}, {"EthiopicSupplement",5},{"ethiopicsupplement",5},{"Geometric_Shapes",5},{"GeometricShapes",5},{"geometricshapes",5}, {"Geometric_Shapes_Ext",5},{"GeometricShapesExt",5},{"geometricshapesext",5},{"Geometric_Shapes_Extended",5}, {"GeometricShapesExtended",5},{"geometricshapesextended",5},{"Georgian",5},{"georgian",5},{"Georgian_Sup",5}, {"GeorgianSup",5},{"georgiansup",5},{"Georgian_Supplement",5},{"GeorgianSupplement",5},{"georgiansupplement",5}, {"Glagolitic",5},{"glagolitic",5},{"Gothic",5},{"gothic",5},{"Grantha",5},{"grantha",5},{"Greek",5},{"greek",5}, {"Greek_And_Coptic",5},{"GreekAndCoptic",5},{"greekandcoptic",5},{"Greek_Ext",5},{"GreekExt",5},{"greekext",5}, {"Greek_Extended",5},{"GreekExtended",5},{"greekextended",5},{"Gujarati",5},{"gujarati",5},{"Gurmukhi",5},{"gurmukhi",5}, {"Half_And_Full_Forms",5},{"HalfAndFullForms",5},{"halfandfullforms",5},{"Halfwidth_And_Fullwidth_Forms",5}, {"HalfwidthAndFullwidthForms",5},{"halfwidthandfullwidthforms",5},{"Half_Marks",5},{"HalfMarks",5},{"halfmarks",5}, {"Combining_Half_Marks",5},{"CombiningHalfMarks",5},{"combininghalfmarks",5},{"Hangul",5},{"hangul",5}, {"Hangul_Syllables",5},{"HangulSyllables",5},{"hangulsyllables",5},{"Hanunoo",5},{"hanunoo",5},{"Hatran",5},{"hatran",5}, {"Hebrew",5},{"hebrew",5},{"High_PU_Surrogates",5},{"HighPUSurrogates",5},{"highpusurrogates",5}, {"High_Private_Use_Surrogates",5},{"HighPrivateUseSurrogates",5},{"highprivateusesurrogates",5},{"High_Surrogates",5}, {"HighSurrogates",5},{"highsurrogates",5},{"Hiragana",5},{"hiragana",5},{"IDC",5},{"idc",5}, {"Ideographic_Description_Characters",5},{"IdeographicDescriptionCharacters",5},{"ideographicdescriptioncharacters",5}, {"Imperial_Aramaic",5},{"ImperialAramaic",5},{"imperialaramaic",5},{"Indic_Number_Forms",5},{"IndicNumberForms",5}, {"indicnumberforms",5},{"Common_Indic_Number_Forms",5},{"CommonIndicNumberForms",5},{"commonindicnumberforms",5}, {"Inscriptional_Pahlavi",5},{"InscriptionalPahlavi",5},{"inscriptionalpahlavi",5},{"Inscriptional_Parthian",5}, {"InscriptionalParthian",5},{"inscriptionalparthian",5},{"IPA_Ext",5},{"IPAExt",5},{"ipaext",5},{"IPA_Extensions",5}, {"IPAExtensions",5},{"ipaextensions",5},{"Jamo",5},{"jamo",5},{"Hangul_Jamo",5},{"HangulJamo",5},{"hanguljamo",5}, {"Jamo_Ext_A",5},{"JamoExtA",5},{"jamoexta",5},{"Hangul_Jamo_Extended_A",5},{"HangulJamoExtendedA",5}, {"hanguljamoextendeda",5},{"Jamo_Ext_B",5},{"JamoExtB",5},{"jamoextb",5},{"Hangul_Jamo_Extended_B",5}, {"HangulJamoExtendedB",5},{"hanguljamoextendedb",5},{"Javanese",5},{"javanese",5},{"Kaithi",5},{"kaithi",5}, {"Kana_Sup",5},{"KanaSup",5},{"kanasup",5},{"Kana_Supplement",5},{"KanaSupplement",5},{"kanasupplement",5},{"Kanbun",5}, {"kanbun",5},{"Kangxi",5},{"kangxi",5},{"Kangxi_Radicals",5},{"KangxiRadicals",5},{"kangxiradicals",5},{"Kannada",5}, {"kannada",5},{"Katakana",5},{"katakana",5},{"Katakana_Ext",5},{"KatakanaExt",5},{"katakanaext",5}, {"Katakana_Phonetic_Extensions",5},{"KatakanaPhoneticExtensions",5},{"katakanaphoneticextensions",5},{"Kayah_Li",5}, {"KayahLi",5},{"kayahli",5},{"Kharoshthi",5},{"kharoshthi",5},{"Khmer",5},{"khmer",5},{"Khmer_Symbols",5}, {"KhmerSymbols",5},{"khmersymbols",5},{"Khojki",5},{"khojki",5},{"Khudawadi",5},{"khudawadi",5},{"Lao",5},{"lao",5}, {"Latin_1_Sup",5},{"Latin1Sup",5},{"latin1sup",5},{"Latin_1_Supplement",5},{"Latin1Supplement",5},{"latin1supplement",5}, {"Latin_1",5},{"Latin1",5},{"latin1",5},{"Latin_Ext_A",5},{"LatinExtA",5},{"latinexta",5},{"Latin_Extended_A",5}, {"LatinExtendedA",5},{"latinextendeda",5},{"Latin_Ext_Additional",5},{"LatinExtAdditional",5},{"latinextadditional",5}, {"Latin_Extended_Additional",5},{"LatinExtendedAdditional",5},{"latinextendedadditional",5},{"Latin_Ext_B",5}, {"LatinExtB",5},{"latinextb",5},{"Latin_Extended_B",5},{"LatinExtendedB",5},{"latinextendedb",5},{"Latin_Ext_C",5}, {"LatinExtC",5},{"latinextc",5},{"Latin_Extended_C",5},{"LatinExtendedC",5},{"latinextendedc",5},{"Latin_Ext_D",5}, {"LatinExtD",5},{"latinextd",5},{"Latin_Extended_D",5},{"LatinExtendedD",5},{"latinextendedd",5},{"Latin_Ext_E",5}, {"LatinExtE",5},{"latinexte",5},{"Latin_Extended_E",5},{"LatinExtendedE",5},{"latinextendede",5},{"Lepcha",5}, {"lepcha",5},{"Letterlike_Symbols",5},{"LetterlikeSymbols",5},{"letterlikesymbols",5},{"Limbu",5},{"limbu",5}, {"Linear_A",5},{"LinearA",5},{"lineara",5},{"Linear_B_Ideograms",5},{"LinearBIdeograms",5},{"linearbideograms",5}, {"Linear_B_Syllabary",5},{"LinearBSyllabary",5},{"linearbsyllabary",5},{"Lisu",5},{"lisu",5},{"Low_Surrogates",5}, {"LowSurrogates",5},{"lowsurrogates",5},{"Lycian",5},{"lycian",5},{"Lydian",5},{"lydian",5},{"Mahajani",5}, {"mahajani",5},{"Mahjong",5},{"mahjong",5},{"Mahjong_Tiles",5},{"MahjongTiles",5},{"mahjongtiles",5},{"Malayalam",5}, {"malayalam",5},{"Mandaic",5},{"mandaic",5},{"Manichaean",5},{"manichaean",5},{"Math_Alphanum",5},{"MathAlphanum",5}, {"mathalphanum",5},{"Mathematical_Alphanumeric_Symbols",5},{"MathematicalAlphanumericSymbols",5}, {"mathematicalalphanumericsymbols",5},{"Math_Operators",5},{"MathOperators",5},{"mathoperators",5}, {"Mathematical_Operators",5},{"MathematicalOperators",5},{"mathematicaloperators",5},{"Meetei_Mayek",5}, {"MeeteiMayek",5},{"meeteimayek",5},{"Meetei_Mayek_Ext",5},{"MeeteiMayekExt",5},{"meeteimayekext",5}, {"Meetei_Mayek_Extensions",5},{"MeeteiMayekExtensions",5},{"meeteimayekextensions",5},{"Mende_Kikakui",5}, {"MendeKikakui",5},{"mendekikakui",5},{"Meroitic_Cursive",5},{"MeroiticCursive",5},{"meroiticcursive",5}, {"Meroitic_Hieroglyphs",5},{"MeroiticHieroglyphs",5},{"meroitichieroglyphs",5},{"Miao",5},{"miao",5},{"Misc_Arrows",5}, {"MiscArrows",5},{"miscarrows",5},{"Miscellaneous_Symbols_And_Arrows",5},{"MiscellaneousSymbolsAndArrows",5}, {"miscellaneoussymbolsandarrows",5},{"Misc_Math_Symbols_A",5},{"MiscMathSymbolsA",5},{"miscmathsymbolsa",5}, {"Miscellaneous_Mathematical_Symbols_A",5},{"MiscellaneousMathematicalSymbolsA",5}, {"miscellaneousmathematicalsymbolsa",5},{"Misc_Math_Symbols_B",5},{"MiscMathSymbolsB",5},{"miscmathsymbolsb",5}, {"Miscellaneous_Mathematical_Symbols_B",5},{"MiscellaneousMathematicalSymbolsB",5}, {"miscellaneousmathematicalsymbolsb",5},{"Misc_Pictographs",5},{"MiscPictographs",5},{"miscpictographs",5}, {"Miscellaneous_Symbols_And_Pictographs",5},{"MiscellaneousSymbolsAndPictographs",5}, {"miscellaneoussymbolsandpictographs",5},{"Misc_Symbols",5},{"MiscSymbols",5},{"miscsymbols",5}, {"Miscellaneous_Symbols",5},{"MiscellaneousSymbols",5},{"miscellaneoussymbols",5},{"Misc_Technical",5}, {"MiscTechnical",5},{"misctechnical",5},{"Miscellaneous_Technical",5},{"MiscellaneousTechnical",5}, {"miscellaneoustechnical",5},{"Modi",5},{"modi",5},{"Modifier_Letters",5},{"ModifierLetters",5},{"modifierletters",5}, {"Spacing_Modifier_Letters",5},{"SpacingModifierLetters",5},{"spacingmodifierletters",5},{"Modifier_Tone_Letters",5}, {"ModifierToneLetters",5},{"modifiertoneletters",5},{"Mongolian",5},{"mongolian",5},{"Mro",5},{"mro",5},{"Multani",5}, {"multani",5},{"Music",5},{"music",5},{"Musical_Symbols",5},{"MusicalSymbols",5},{"musicalsymbols",5},{"Myanmar",5}, {"myanmar",5},{"Myanmar_Ext_A",5},{"MyanmarExtA",5},{"myanmarexta",5},{"Myanmar_Extended_A",5},{"MyanmarExtendedA",5}, {"myanmarextendeda",5},{"Myanmar_Ext_B",5},{"MyanmarExtB",5},{"myanmarextb",5},{"Myanmar_Extended_B",5}, {"MyanmarExtendedB",5},{"myanmarextendedb",5},{"Nabataean",5},{"nabataean",5},{"NB",5},{"nb",5},{"No_Block",5}, {"NoBlock",5},{"noblock",5},{"New_Tai_Lue",5},{"NewTaiLue",5},{"newtailue",5},{"NKo",5},{"nko",5},{"Number_Forms",5}, {"NumberForms",5},{"numberforms",5},{"OCR",5},{"ocr",5},{"Optical_Character_Recognition",5}, {"OpticalCharacterRecognition",5},{"opticalcharacterrecognition",5},{"Ogham",5},{"ogham",5},{"Ol_Chiki",5},{"OlChiki",5}, {"olchiki",5},{"Old_Hungarian",5},{"OldHungarian",5},{"oldhungarian",5},{"Old_Italic",5},{"OldItalic",5},{"olditalic",5}, {"Old_North_Arabian",5},{"OldNorthArabian",5},{"oldnortharabian",5},{"Old_Permic",5},{"OldPermic",5},{"oldpermic",5}, {"Old_Persian",5},{"OldPersian",5},{"oldpersian",5},{"Old_South_Arabian",5},{"OldSouthArabian",5},{"oldsoutharabian",5}, {"Old_Turkic",5},{"OldTurkic",5},{"oldturkic",5},{"Oriya",5},{"oriya",5},{"Ornamental_Dingbats",5}, {"OrnamentalDingbats",5},{"ornamentaldingbats",5},{"Osmanya",5},{"osmanya",5},{"Pahawh_Hmong",5},{"PahawhHmong",5}, {"pahawhhmong",5},{"Palmyrene",5},{"palmyrene",5},{"Pau_Cin_Hau",5},{"PauCinHau",5},{"paucinhau",5},{"Phags_Pa",5}, {"PhagsPa",5},{"phagspa",5},{"Phaistos",5},{"phaistos",5},{"Phaistos_Disc",5},{"PhaistosDisc",5},{"phaistosdisc",5}, {"Phoenician",5},{"phoenician",5},{"Phonetic_Ext",5},{"PhoneticExt",5},{"phoneticext",5},{"Phonetic_Extensions",5}, {"PhoneticExtensions",5},{"phoneticextensions",5},{"Phonetic_Ext_Sup",5},{"PhoneticExtSup",5},{"phoneticextsup",5}, {"Phonetic_Extensions_Supplement",5},{"PhoneticExtensionsSupplement",5},{"phoneticextensionssupplement",5}, {"Playing_Cards",5},{"PlayingCards",5},{"playingcards",5},{"Psalter_Pahlavi",5},{"PsalterPahlavi",5}, {"psalterpahlavi",5},{"PUA",5},{"pua",5},{"Private_Use_Area",5},{"PrivateUseArea",5},{"privateusearea",5}, {"Private_Use",5},{"PrivateUse",5},{"privateuse",5},{"Punctuation",5},{"punctuation",5},{"General_Punctuation",5}, {"GeneralPunctuation",5},{"generalpunctuation",5},{"Rejang",5},{"rejang",5},{"Rumi",5},{"rumi",5}, {"Rumi_Numeral_Symbols",5},{"RumiNumeralSymbols",5},{"ruminumeralsymbols",5},{"Runic",5},{"runic",5},{"Samaritan",5}, {"samaritan",5},{"Saurashtra",5},{"saurashtra",5},{"Sharada",5},{"sharada",5},{"Shavian",5},{"shavian",5}, {"Shorthand_Format_Controls",5},{"ShorthandFormatControls",5},{"shorthandformatcontrols",5},{"Siddham",5},{"siddham",5}, {"Sinhala",5},{"sinhala",5},{"Sinhala_Archaic_Numbers",5},{"SinhalaArchaicNumbers",5},{"sinhalaarchaicnumbers",5}, {"Small_Forms",5},{"SmallForms",5},{"smallforms",5},{"Small_Form_Variants",5},{"SmallFormVariants",5}, {"smallformvariants",5},{"Sora_Sompeng",5},{"SoraSompeng",5},{"sorasompeng",5},{"Specials",5},{"specials",5}, {"Sundanese",5},{"sundanese",5},{"Sundanese_Sup",5},{"SundaneseSup",5},{"sundanesesup",5},{"Sundanese_Supplement",5}, {"SundaneseSupplement",5},{"sundanesesupplement",5},{"Sup_Arrows_A",5},{"SupArrowsA",5},{"suparrowsa",5}, {"Supplemental_Arrows_A",5},{"SupplementalArrowsA",5},{"supplementalarrowsa",5},{"Sup_Arrows_B",5},{"SupArrowsB",5}, {"suparrowsb",5},{"Supplemental_Arrows_B",5},{"SupplementalArrowsB",5},{"supplementalarrowsb",5},{"Sup_Arrows_C",5}, {"SupArrowsC",5},{"suparrowsc",5},{"Supplemental_Arrows_C",5},{"SupplementalArrowsC",5},{"supplementalarrowsc",5}, {"Sup_Math_Operators",5},{"SupMathOperators",5},{"supmathoperators",5},{"Supplemental_Mathematical_Operators",5}, {"SupplementalMathematicalOperators",5},{"supplementalmathematicaloperators",5},{"Sup_PUA_A",5},{"SupPUAA",5}, {"suppuaa",5},{"Supplementary_Private_Use_Area_A",5},{"SupplementaryPrivateUseAreaA",5}, {"supplementaryprivateuseareaa",5},{"Sup_PUA_B",5},{"SupPUAB",5},{"suppuab",5},{"Supplementary_Private_Use_Area_B",5}, {"SupplementaryPrivateUseAreaB",5},{"supplementaryprivateuseareab",5},{"Sup_Punctuation",5},{"SupPunctuation",5}, {"suppunctuation",5},{"Supplemental_Punctuation",5},{"SupplementalPunctuation",5},{"supplementalpunctuation",5}, {"Sup_Symbols_And_Pictographs",5},{"SupSymbolsAndPictographs",5},{"supsymbolsandpictographs",5}, {"Supplemental_Symbols_And_Pictographs",5},{"SupplementalSymbolsAndPictographs",5}, {"supplementalsymbolsandpictographs",5},{"Super_And_Sub",5},{"SuperAndSub",5},{"superandsub",5}, {"Superscripts_And_Subscripts",5},{"SuperscriptsAndSubscripts",5},{"superscriptsandsubscripts",5}, {"Sutton_SignWriting",5},{"SuttonSignWriting",5},{"suttonsignwriting",5},{"Syloti_Nagri",5},{"SylotiNagri",5}, {"sylotinagri",5},{"Syriac",5},{"syriac",5},{"Tagalog",5},{"tagalog",5},{"Tagbanwa",5},{"tagbanwa",5},{"Tags",5}, {"tags",5},{"Tai_Le",5},{"TaiLe",5},{"taile",5},{"Tai_Tham",5},{"TaiTham",5},{"taitham",5},{"Tai_Viet",5},{"TaiViet",5}, {"taiviet",5},{"Tai_Xuan_Jing",5},{"TaiXuanJing",5},{"taixuanjing",5},{"Tai_Xuan_Jing_Symbols",5}, {"TaiXuanJingSymbols",5},{"taixuanjingsymbols",5},{"Takri",5},{"takri",5},{"Tamil",5},{"tamil",5},{"Telugu",5}, {"telugu",5},{"Thaana",5},{"thaana",5},{"Thai",5},{"thai",5},{"Tibetan",5},{"tibetan",5},{"Tifinagh",5},{"tifinagh",5}, {"Tirhuta",5},{"tirhuta",5},{"Transport_And_Map",5},{"TransportAndMap",5},{"transportandmap",5}, {"Transport_And_Map_Symbols",5},{"TransportAndMapSymbols",5},{"transportandmapsymbols",5},{"UCAS",5},{"ucas",5}, {"Unified_Canadian_Aboriginal_Syllabics",5},{"UnifiedCanadianAboriginalSyllabics",5}, {"unifiedcanadianaboriginalsyllabics",5},{"Canadian_Syllabics",5},{"CanadianSyllabics",5},{"canadiansyllabics",5}, {"UCAS_Ext",5},{"UCASExt",5},{"ucasext",5},{"Unified_Canadian_Aboriginal_Syllabics_Extended",5}, {"UnifiedCanadianAboriginalSyllabicsExtended",5},{"unifiedcanadianaboriginalsyllabicsextended",5},{"Ugaritic",5}, {"ugaritic",5},{"Vai",5},{"vai",5},{"Vedic_Ext",5},{"VedicExt",5},{"vedicext",5},{"Vedic_Extensions",5}, {"VedicExtensions",5},{"vedicextensions",5},{"Vertical_Forms",5},{"VerticalForms",5},{"verticalforms",5},{"VS",5}, {"vs",5},{"Variation_Selectors",5},{"VariationSelectors",5},{"variationselectors",5},{"VS_Sup",5},{"VSSup",5}, {"vssup",5},{"Variation_Selectors_Supplement",5},{"VariationSelectorsSupplement",5},{"variationselectorssupplement",5}, {"Warang_Citi",5},{"WarangCiti",5},{"warangciti",5},{"Yi_Radicals",5},{"YiRadicals",5},{"yiradicals",5}, {"Yi_Syllables",5},{"YiSyllables",5},{"yisyllables",5},{"Yijing",5},{"yijing",5},{"Yijing_Hexagram_Symbols",5}, {"YijingHexagramSymbols",5},{"yijinghexagramsymbols",5},{"WB",16},{"wb",16},{"Word_Break",16},{"WordBreak",16}, {"wordbreak",16},{"CR",16},{"cr",16},{"DQ",16},{"dq",16},{"Double_Quote",16},{"DoubleQuote",16},{"doublequote",16}, {"EX",16},{"ex",16},{"ExtendNumLet",16},{"extendnumlet",16},{"Extend",16},{"extend",16},{"FO",16},{"fo",16}, {"Format",16},{"format",16},{"HL",16},{"hl",16},{"Hebrew_Letter",16},{"HebrewLetter",16},{"hebrewletter",16},{"KA",16}, {"ka",16},{"Katakana",16},{"katakana",16},{"LE",16},{"le",16},{"ALetter",16},{"aletter",16},{"LF",16},{"lf",16}, {"MB",16},{"mb",16},{"MidNumLet",16},{"midnumlet",16},{"ML",16},{"ml",16},{"MidLetter",16},{"midletter",16},{"MN",16}, {"mn",16},{"MidNum",16},{"midnum",16},{"NL",16},{"nl",16},{"Newline",16},{"newline",16},{"NU",16},{"nu",16}, {"Numeric",16},{"numeric",16},{"RI",16},{"ri",16},{"Regional_Indicator",16},{"RegionalIndicator",16}, {"regionalindicator",16},{"SQ",16},{"sq",16},{"Single_Quote",16},{"SingleQuote",16},{"singlequote",16},{"XX",16}, {"xx",16},{"Other",16},{"other",16},{"Bidi_Control",32},{"BidiControl",32},{"bidicontrol",32},{"Script",9},{"script",9}, {"Case_Change_Index",2},{"CaseChangeIndex",2},{"casechangeindex",2},{"N",67},{"n",67},{"Other_Math",77},{"OtherMath",77}, {"othermath",77},{"General_Category",17},{"GeneralCategory",17},{"generalcategory",17},{"Grapheme_Extend",51}, {"GraphemeExtend",51},{"graphemeextend",51},{"White_Space",91},{"WhiteSpace",91},{"whitespace",91},{"Z",94},{"z",94}, {"math",66},{"Unified_Ideograph",88},{"UnifiedIdeograph",88},{"unifiedideograph",88},{"Variation_Selector",90}, {"VariationSelector",90},{"variationselector",90},{"Other_Uppercase",78},{"OtherUppercase",78},{"otheruppercase",78}, {"Bidi_Mirroring_Glyph",6},{"BidiMirroringGlyph",6},{"bidimirroringglyph",6},{"Extender",48},{"extender",48}, {"CompEx",49},{"compex",49},{"fullcompositionexclusion",49},{"Digit",19},{"digit",19},{"cwu",43}, {"changeswhenuppercased",43},{"Soft_Dotted",86},{"SoftDotted",86},{"softdotted",86},{"NFDQC",68},{"nfdqc",68}, {"nfdquickcheck",68},{"Grapheme_Base",50},{"GraphemeBase",50},{"graphemebase",50},{"ci",36},{"caseignorable",36}, {"ASCII_Hex_Digit",20},{"ASCIIHexDigit",20},{"asciihexdigit",20},{"Changes_When_Casefolded",38}, {"ChangesWhenCasefolded",38},{"changeswhencasefolded",38},{"Bidi_Class",15},{"BidiClass",15},{"bidiclass",15}, {"Block",5},{"block",5},{"Other_Default_Ignorable_Code_Point",72},{"OtherDefaultIgnorableCodePoint",72}, {"otherdefaultignorablecodepoint",72},{"ideo",59},{"ideographic",59},{"OGrExt",73},{"ogrext",73}, {"othergraphemeextend",73},{"NFC_Quick_Check",28},{"NFCQuickCheck",28},{"nfcquickcheck",28},{"bc",15},{"Bidi_Class",15}, {"BidiClass",15},{"bidiclass",15},{"AL",15},{"al",15},{"Arabic_Letter",15},{"ArabicLetter",15},{"arabicletter",15}, {"AN",15},{"an",15},{"Arabic_Number",15},{"ArabicNumber",15},{"arabicnumber",15},{"B",15},{"b",15}, {"Paragraph_Separator",15},{"ParagraphSeparator",15},{"paragraphseparator",15},{"BN",15},{"bn",15}, {"Boundary_Neutral",15},{"BoundaryNeutral",15},{"boundaryneutral",15},{"CS",15},{"cs",15},{"Common_Separator",15}, {"CommonSeparator",15},{"commonseparator",15},{"EN",15},{"en",15},{"European_Number",15},{"EuropeanNumber",15}, {"europeannumber",15},{"ES",15},{"es",15},{"European_Separator",15},{"EuropeanSeparator",15},{"europeanseparator",15}, {"ET",15},{"et",15},{"European_Terminator",15},{"EuropeanTerminator",15},{"europeanterminator",15},{"FSI",15},{"fsi",15}, {"First_Strong_Isolate",15},{"FirstStrongIsolate",15},{"firststrongisolate",15},{"L",15},{"l",15},{"Left_To_Right",15}, {"LeftToRight",15},{"lefttoright",15},{"LRE",15},{"lre",15},{"Left_To_Right_Embedding",15},{"LeftToRightEmbedding",15}, {"lefttorightembedding",15},{"LRI",15},{"lri",15},{"Left_To_Right_Isolate",15},{"LeftToRightIsolate",15}, {"lefttorightisolate",15},{"LRO",15},{"lro",15},{"Left_To_Right_Override",15},{"LeftToRightOverride",15}, {"lefttorightoverride",15},{"NSM",15},{"nsm",15},{"Nonspacing_Mark",15},{"NonspacingMark",15},{"nonspacingmark",15}, {"ON",15},{"on",15},{"Other_Neutral",15},{"OtherNeutral",15},{"otherneutral",15},{"PDF",15},{"pdf",15}, {"Pop_Directional_Format",15},{"PopDirectionalFormat",15},{"popdirectionalformat",15},{"PDI",15},{"pdi",15}, {"Pop_Directional_Isolate",15},{"PopDirectionalIsolate",15},{"popdirectionalisolate",15},{"R",15},{"r",15}, {"Right_To_Left",15},{"RightToLeft",15},{"righttoleft",15},{"RLE",15},{"rle",15},{"Right_To_Left_Embedding",15}, {"RightToLeftEmbedding",15},{"righttoleftembedding",15},{"RLI",15},{"rli",15},{"Right_To_Left_Isolate",15}, {"RightToLeftIsolate",15},{"righttoleftisolate",15},{"RLO",15},{"rlo",15},{"Right_To_Left_Override",15}, {"RightToLeftOverride",15},{"righttoleftoverride",15},{"S",15},{"s",15},{"Segment_Separator",15},{"SegmentSeparator",15}, {"segmentseparator",15},{"WS",15},{"ws",15},{"White_Space",15},{"WhiteSpace",15},{"whitespace",15},{"dash",44}, {"Uppercase",89},{"uppercase",89},{"Ideographic",59},{"ideographic",59},{"NFKDQC",69},{"nfkdqc",69}, {"nfkdquickcheck",69},{"Terminal_Punctuation",87},{"TerminalPunctuation",87},{"terminalpunctuation",87},{"nv",8}, {"Numeric_Value",8},{"NumericValue",8},{"numericvalue",8},{"Sentence_Break",23},{"SentenceBreak",23}, {"sentencebreak",23},{"Full_Composition_Exclusion",49},{"FullCompositionExclusion",49},{"fullcompositionexclusion",49}, {"Numeric_Value",8},{"NumericValue",8},{"numericvalue",8},{"Changes_When_Uppercased",43},{"ChangesWhenUppercased",43}, {"changeswhenuppercased",43},{"Grapheme_Link",52},{"GraphemeLink",52},{"graphemelink",52},{"hex",53},{"hexdigit",53}, {"SB",23},{"sb",23},{"Sentence_Break",23},{"SentenceBreak",23},{"sentencebreak",23},{"AT",23},{"at",23},{"ATerm",23}, {"aterm",23},{"CL",23},{"cl",23},{"Close",23},{"close",23},{"CR",23},{"cr",23},{"EX",23},{"ex",23},{"Extend",23}, {"extend",23},{"FO",23},{"fo",23},{"Format",23},{"format",23},{"LE",23},{"le",23},{"OLetter",23},{"oletter",23}, {"LF",23},{"lf",23},{"LO",23},{"lo",23},{"Lower",23},{"lower",23},{"NU",23},{"nu",23},{"Numeric",23},{"numeric",23}, {"SC",23},{"sc",23},{"SContinue",23},{"scontinue",23},{"SE",23},{"se",23},{"Sep",23},{"sep",23},{"SP",23},{"sp",23}, {"Sp",23},{"ST",23},{"st",23},{"STerm",23},{"sterm",23},{"UP",23},{"up",23},{"Upper",23},{"upper",23},{"XX",23}, {"xx",23},{"Other",23},{"other",23},{"jg",11},{"Joining_Group",11},{"JoiningGroup",11},{"joininggroup",11},{"Ain",11}, {"ain",11},{"Alaph",11},{"alaph",11},{"Alef",11},{"alef",11},{"Beh",11},{"beh",11},{"Beth",11},{"beth",11}, {"Burushaski_Yeh_Barree",11},{"BurushaskiYehBarree",11},{"burushaskiyehbarree",11},{"Dal",11},{"dal",11}, {"Dalath_Rish",11},{"DalathRish",11},{"dalathrish",11},{"E",11},{"e",11},{"Farsi_Yeh",11},{"FarsiYeh",11}, {"farsiyeh",11},{"Fe",11},{"fe",11},{"Feh",11},{"feh",11},{"Final_Semkath",11},{"FinalSemkath",11},{"finalsemkath",11}, {"Gaf",11},{"gaf",11},{"Gamal",11},{"gamal",11},{"Hah",11},{"hah",11},{"He",11},{"he",11},{"Heh",11},{"heh",11}, {"Heh_Goal",11},{"HehGoal",11},{"hehgoal",11},{"Heth",11},{"heth",11},{"Kaf",11},{"kaf",11},{"Kaph",11},{"kaph",11}, {"Khaph",11},{"khaph",11},{"Knotted_Heh",11},{"KnottedHeh",11},{"knottedheh",11},{"Lam",11},{"lam",11},{"Lamadh",11}, {"lamadh",11},{"Manichaean_Aleph",11},{"ManichaeanAleph",11},{"manichaeanaleph",11},{"Manichaean_Ayin",11}, {"ManichaeanAyin",11},{"manichaeanayin",11},{"Manichaean_Beth",11},{"ManichaeanBeth",11},{"manichaeanbeth",11}, {"Manichaean_Daleth",11},{"ManichaeanDaleth",11},{"manichaeandaleth",11},{"Manichaean_Dhamedh",11}, {"ManichaeanDhamedh",11},{"manichaeandhamedh",11},{"Manichaean_Five",11},{"ManichaeanFive",11},{"manichaeanfive",11}, {"Manichaean_Gimel",11},{"ManichaeanGimel",11},{"manichaeangimel",11},{"Manichaean_Heth",11},{"ManichaeanHeth",11}, {"manichaeanheth",11},{"Manichaean_Hundred",11},{"ManichaeanHundred",11},{"manichaeanhundred",11},{"Manichaean_Kaph",11}, {"ManichaeanKaph",11},{"manichaeankaph",11},{"Manichaean_Lamedh",11},{"ManichaeanLamedh",11},{"manichaeanlamedh",11}, {"Manichaean_Mem",11},{"ManichaeanMem",11},{"manichaeanmem",11},{"Manichaean_Nun",11},{"ManichaeanNun",11}, {"manichaeannun",11},{"Manichaean_One",11},{"ManichaeanOne",11},{"manichaeanone",11},{"Manichaean_Pe",11}, {"ManichaeanPe",11},{"manichaeanpe",11},{"Manichaean_Qoph",11},{"ManichaeanQoph",11},{"manichaeanqoph",11}, {"Manichaean_Resh",11},{"ManichaeanResh",11},{"manichaeanresh",11},{"Manichaean_Sadhe",11},{"ManichaeanSadhe",11}, {"manichaeansadhe",11},{"Manichaean_Samekh",11},{"ManichaeanSamekh",11},{"manichaeansamekh",11},{"Manichaean_Taw",11}, {"ManichaeanTaw",11},{"manichaeantaw",11},{"Manichaean_Ten",11},{"ManichaeanTen",11},{"manichaeanten",11}, {"Manichaean_Teth",11},{"ManichaeanTeth",11},{"manichaeanteth",11},{"Manichaean_Thamedh",11},{"ManichaeanThamedh",11}, {"manichaeanthamedh",11},{"Manichaean_Twenty",11},{"ManichaeanTwenty",11},{"manichaeantwenty",11},{"Manichaean_Waw",11}, {"ManichaeanWaw",11},{"manichaeanwaw",11},{"Manichaean_Yodh",11},{"ManichaeanYodh",11},{"manichaeanyodh",11}, {"Manichaean_Zayin",11},{"ManichaeanZayin",11},{"manichaeanzayin",11},{"Meem",11},{"meem",11},{"Mim",11},{"mim",11}, {"No_Joining_Group",11},{"NoJoiningGroup",11},{"nojoininggroup",11},{"Noon",11},{"noon",11},{"Nun",11},{"nun",11}, {"Nya",11},{"nya",11},{"Pe",11},{"pe",11},{"Qaf",11},{"qaf",11},{"Qaph",11},{"qaph",11},{"Reh",11},{"reh",11}, {"Reversed_Pe",11},{"ReversedPe",11},{"reversedpe",11},{"Rohingya_Yeh",11},{"RohingyaYeh",11},{"rohingyayeh",11}, {"Sad",11},{"sad",11},{"Sadhe",11},{"sadhe",11},{"Seen",11},{"seen",11},{"Semkath",11},{"semkath",11},{"Shin",11}, {"shin",11},{"Straight_Waw",11},{"StraightWaw",11},{"straightwaw",11},{"Swash_Kaf",11},{"SwashKaf",11},{"swashkaf",11}, {"Syriac_Waw",11},{"SyriacWaw",11},{"syriacwaw",11},{"Tah",11},{"tah",11},{"Taw",11},{"taw",11},{"Teh_Marbuta",11}, {"TehMarbuta",11},{"tehmarbuta",11},{"Teh_Marbuta_Goal",11},{"TehMarbutaGoal",11},{"tehmarbutagoal",11}, {"Hamza_On_Heh_Goal",11},{"HamzaOnHehGoal",11},{"hamzaonhehgoal",11},{"Teth",11},{"teth",11},{"Waw",11},{"waw",11}, {"Yeh",11},{"yeh",11},{"Yeh_Barree",11},{"YehBarree",11},{"yehbarree",11},{"Yeh_With_Tail",11},{"YehWithTail",11}, {"yehwithtail",11},{"Yudh",11},{"yudh",11},{"Yudh_He",11},{"YudhHe",11},{"yudhhe",11},{"Zain",11},{"zain",11}, {"Zhain",11},{"zhain",11},{"Alphabetic",29},{"alphabetic",29},{"NFG_QC",12},{"NFGQC",12},{"nfgqc",12},{"Age",14}, {"age",14},{"Changes_When_Lowercased",40},{"ChangesWhenLowercased",40},{"changeswhenlowercased",40},{"PatSyn",80}, {"patsyn",80},{"patternsyntax",80},{"Decomp_Spec",1},{"DecompSpec",1},{"decompspec",1},{"Deprecated",46}, {"deprecated",46},{"cwl",40},{"changeswhenlowercased",40},{"oupper",78},{"otheruppercase",78},{"lb",21}, {"Line_Break",21},{"LineBreak",21},{"linebreak",21},{"AI",21},{"ai",21},{"Ambiguous",21},{"ambiguous",21},{"AL",21}, {"al",21},{"Alphabetic",21},{"alphabetic",21},{"B2",21},{"b2",21},{"Break_Both",21},{"BreakBoth",21},{"breakboth",21}, {"BA",21},{"ba",21},{"Break_After",21},{"BreakAfter",21},{"breakafter",21},{"BB",21},{"bb",21},{"Break_Before",21}, {"BreakBefore",21},{"breakbefore",21},{"BK",21},{"bk",21},{"Mandatory_Break",21},{"MandatoryBreak",21}, {"mandatorybreak",21},{"CB",21},{"cb",21},{"Contingent_Break",21},{"ContingentBreak",21},{"contingentbreak",21}, {"CJ",21},{"cj",21},{"Conditional_Japanese_Starter",21},{"ConditionalJapaneseStarter",21}, {"conditionaljapanesestarter",21},{"CL",21},{"cl",21},{"Close_Punctuation",21},{"ClosePunctuation",21}, {"closepunctuation",21},{"CM",21},{"cm",21},{"Combining_Mark",21},{"CombiningMark",21},{"combiningmark",21},{"CP",21}, {"cp",21},{"Close_Parenthesis",21},{"CloseParenthesis",21},{"closeparenthesis",21},{"CR",21},{"cr",21}, {"Carriage_Return",21},{"CarriageReturn",21},{"carriagereturn",21},{"EX",21},{"ex",21},{"Exclamation",21}, {"exclamation",21},{"GL",21},{"gl",21},{"Glue",21},{"glue",21},{"H2",21},{"h2",21},{"H3",21},{"h3",21},{"HL",21}, {"hl",21},{"Hebrew_Letter",21},{"HebrewLetter",21},{"hebrewletter",21},{"HY",21},{"hy",21},{"Hyphen",21},{"hyphen",21}, {"ID",21},{"id",21},{"Ideographic",21},{"ideographic",21},{"IN",21},{"in",21},{"Inseparable",21},{"inseparable",21}, {"Inseperable",21},{"inseperable",21},{"IS",21},{"is",21},{"Infix_Numeric",21},{"InfixNumeric",21},{"infixnumeric",21}, {"JL",21},{"jl",21},{"JT",21},{"jt",21},{"JV",21},{"jv",21},{"LF",21},{"lf",21},{"Line_Feed",21},{"LineFeed",21}, {"linefeed",21},{"NL",21},{"nl",21},{"Next_Line",21},{"NextLine",21},{"nextline",21},{"NS",21},{"ns",21}, {"Nonstarter",21},{"nonstarter",21},{"NU",21},{"nu",21},{"Numeric",21},{"numeric",21},{"OP",21},{"op",21}, {"Open_Punctuation",21},{"OpenPunctuation",21},{"openpunctuation",21},{"PO",21},{"po",21},{"Postfix_Numeric",21}, {"PostfixNumeric",21},{"postfixnumeric",21},{"PR",21},{"pr",21},{"Prefix_Numeric",21},{"PrefixNumeric",21}, {"prefixnumeric",21},{"QU",21},{"qu",21},{"Quotation",21},{"quotation",21},{"RI",21},{"ri",21},{"Regional_Indicator",21}, {"RegionalIndicator",21},{"regionalindicator",21},{"SA",21},{"sa",21},{"Complex_Context",21},{"ComplexContext",21}, {"complexcontext",21},{"SG",21},{"sg",21},{"Surrogate",21},{"surrogate",21},{"SP",21},{"sp",21},{"Space",21}, {"space",21},{"SY",21},{"sy",21},{"Break_Symbols",21},{"BreakSymbols",21},{"breaksymbols",21},{"WJ",21},{"wj",21}, {"Word_Joiner",21},{"WordJoiner",21},{"wordjoiner",21},{"XX",21},{"xx",21},{"Unknown",21},{"unknown",21},{"ZW",21}, {"zw",21},{"ZWSpace",21},{"zwspace",21},{"Other_Alphabetic",71},{"OtherAlphabetic",71},{"otheralphabetic",71}, {"Hangul_Syllable_Type",25},{"HangulSyllableType",25},{"hangulsyllabletype",25},{"ID_Start",58},{"IDStart",58}, {"idstart",58},{"wspace",91},{"whitespace",91},{"Case_Ignorable",36},{"CaseIgnorable",36},{"caseignorable",36}, {"Quotation_Mark",82},{"QuotationMark",82},{"quotationmark",82},{"xidc",92},{"xidcontinue",92},{"Decomposition_Type",18}, {"DecompositionType",18},{"decompositiontype",18},{"alpha",29},{"alphabetic",29},{"nt",26},{"Numeric_Type",26}, {"NumericType",26},{"numerictype",26},{"De",26},{"de",26},{"Decimal",26},{"decimal",26},{"Di",26},{"di",26},{"Digit",26}, {"digit",26},{"None",26},{"none",26},{"Nu",26},{"nu",26},{"Numeric",26},{"numeric",26},{"Changes_When_Titlecased",42}, {"ChangesWhenTitlecased",42},{"changeswhentitlecased",42},{"Logical_Order_Exception",63},{"LogicalOrderException",63}, {"logicalorderexception",63},{"L",61},{"l",61},{"idsb",55},{"idsbinaryoperator",55},{"nchar",70}, {"noncharactercodepoint",70},{"Numeric_Value_Numerator",10},{"NumericValueNumerator",10},{"numericvaluenumerator",10}, {"uideo",88},{"unifiedideograph",88},{"P",79},{"p",79},{"ID_Continue",57},{"IDContinue",57},{"idcontinue",57}, {"hyphen",54},{"Other_Grapheme_Extend",73},{"OtherGraphemeExtend",73},{"othergraphemeextend",73},{"cwcm",39}, {"changeswhencasemapped",39},{"dia",47},{"diacritic",47},{"NFCQC",28},{"nfcqc",28},{"nfcquickcheck",28},{"m",28}, {"maybe",28},{"hst",25},{"Hangul_Syllable_Type",25},{"HangulSyllableType",25},{"hangulsyllabletype",25},{"L",25}, {"l",25},{"Leading_Jamo",25},{"LeadingJamo",25},{"leadingjamo",25},{"LV",25},{"lv",25},{"LV_Syllable",25}, {"LVSyllable",25},{"lvsyllable",25},{"LVT",25},{"lvt",25},{"LVT_Syllable",25},{"LVTSyllable",25},{"lvtsyllable",25}, {"NA",25},{"na",25},{"Not_Applicable",25},{"NotApplicable",25},{"notapplicable",25},{"T",25},{"t",25}, {"Trailing_Jamo",25},{"TrailingJamo",25},{"trailingjamo",25},{"V",25},{"v",25},{"Vowel_Jamo",25},{"VowelJamo",25}, {"voweljamo",25},{"Grapheme_Cluster_Break",24},{"GraphemeClusterBreak",24},{"graphemeclusterbreak",24}, {"XID_Continue",92},{"XIDContinue",92},{"xidcontinue",92},{"XID_Start",93},{"XIDStart",93},{"xidstart",93}, {"Special_Casing",3},{"SpecialCasing",3},{"specialcasing",3},{"Other_ID_Start",75},{"OtherIDStart",75}, {"otheridstart",75},{"Other_Lowercase",76},{"OtherLowercase",76},{"otherlowercase",76},{"Pattern_Syntax",80}, {"PatternSyntax",80},{"patternsyntax",80},{"PatWS",81},{"patws",81},{"patternwhitespace",81},{"Other_ID_Continue",74}, {"OtherIDContinue",74},{"otheridcontinue",74},{"sd",86},{"softdotted",86},{"upper",89},{"uppercase",89}, {"Joining_Type",7},{"JoiningType",7},{"joiningtype",7},{"cwcf",38},{"changeswhencasefolded",38},{"oidc",74}, {"otheridcontinue",74},{"Pattern_White_Space",81},{"PatternWhiteSpace",81},{"patternwhitespace",81},{"idst",56}, {"idstrinaryoperator",56},{"Noncharacter_Code_Point",70},{"NoncharacterCodePoint",70},{"noncharactercodepoint",70}, {"GrExt",51},{"grext",51},{"graphemeextend",51},{"Changes_When_NFKC_Casefolded",41},{"ChangesWhenNFKCCasefolded",41}, {"changeswhennfkccasefolded",41},{"cf",4},{"Case_Folding",4},{"CaseFolding",4},{"casefolding",4},{"Bidi_Mirrored",33}, {"BidiMirrored",33},{"bidimirrored",33},{"vs",90},{"variationselector",90},{"Case_Folding_simple",35}, {"CaseFoldingsimple",35},{"casefoldingsimple",35},{"JoinC",60},{"joinc",60},{"joincontrol",60},{"cased",37},{"Any",30}, {"any",30},{"cwt",42},{"changeswhentitlecased",42},{"ccc",13},{"Canonical_Combining_Class",13}, {"CanonicalCombiningClass",13},{"canonicalcombiningclass",13},{"0",13},{"NR",13},{"nr",13},{"Not_Reordered",13}, {"NotReordered",13},{"notreordered",13},{"1",13},{"OV",13},{"ov",13},{"Overlay",13},{"overlay",13},{"7",13},{"NK",13}, {"nk",13},{"Nukta",13},{"nukta",13},{"8",13},{"KV",13},{"kv",13},{"Kana_Voicing",13},{"KanaVoicing",13}, {"kanavoicing",13},{"9",13},{"VR",13},{"vr",13},{"Virama",13},{"virama",13},{"10",13},{"CCC10",13},{"ccc10",13}, {"11",13},{"CCC11",13},{"ccc11",13},{"12",13},{"CCC12",13},{"ccc12",13},{"13",13},{"CCC13",13},{"ccc13",13},{"14",13}, {"CCC14",13},{"ccc14",13},{"15",13},{"CCC15",13},{"ccc15",13},{"16",13},{"CCC16",13},{"ccc16",13},{"17",13},{"CCC17",13}, {"ccc17",13},{"18",13},{"CCC18",13},{"ccc18",13},{"19",13},{"CCC19",13},{"ccc19",13},{"20",13},{"CCC20",13},{"ccc20",13}, {"21",13},{"CCC21",13},{"ccc21",13},{"22",13},{"CCC22",13},{"ccc22",13},{"23",13},{"CCC23",13},{"ccc23",13},{"24",13}, {"CCC24",13},{"ccc24",13},{"25",13},{"CCC25",13},{"ccc25",13},{"26",13},{"CCC26",13},{"ccc26",13},{"27",13},{"CCC27",13}, {"ccc27",13},{"28",13},{"CCC28",13},{"ccc28",13},{"29",13},{"CCC29",13},{"ccc29",13},{"30",13},{"CCC30",13},{"ccc30",13}, {"31",13},{"CCC31",13},{"ccc31",13},{"32",13},{"CCC32",13},{"ccc32",13},{"33",13},{"CCC33",13},{"ccc33",13},{"34",13}, {"CCC34",13},{"ccc34",13},{"35",13},{"CCC35",13},{"ccc35",13},{"36",13},{"CCC36",13},{"ccc36",13},{"84",13},{"CCC84",13}, {"ccc84",13},{"91",13},{"CCC91",13},{"ccc91",13},{"103",13},{"CCC103",13},{"ccc103",13},{"107",13},{"CCC107",13}, {"ccc107",13},{"118",13},{"CCC118",13},{"ccc118",13},{"122",13},{"CCC122",13},{"ccc122",13},{"129",13},{"CCC129",13}, {"ccc129",13},{"130",13},{"CCC130",13},{"ccc130",13},{"132",13},{"CCC132",13},{"ccc132",13},{"133",13},{"CCC133",13}, {"ccc133",13},{"RESERVED",13},{"reserved",13},{"200",13},{"ATBL",13},{"atbl",13},{"Attached_Below_Left",13}, {"AttachedBelowLeft",13},{"attachedbelowleft",13},{"202",13},{"ATB",13},{"atb",13},{"Attached_Below",13}, {"AttachedBelow",13},{"attachedbelow",13},{"214",13},{"ATA",13},{"ata",13},{"Attached_Above",13},{"AttachedAbove",13}, {"attachedabove",13},{"216",13},{"ATAR",13},{"atar",13},{"Attached_Above_Right",13},{"AttachedAboveRight",13}, {"attachedaboveright",13},{"218",13},{"BL",13},{"bl",13},{"Below_Left",13},{"BelowLeft",13},{"belowleft",13},{"220",13}, {"B",13},{"b",13},{"Below",13},{"below",13},{"222",13},{"BR",13},{"br",13},{"Below_Right",13},{"BelowRight",13}, {"belowright",13},{"224",13},{"L",13},{"l",13},{"Left",13},{"left",13},{"226",13},{"R",13},{"r",13},{"Right",13}, {"right",13},{"228",13},{"AL",13},{"al",13},{"Above_Left",13},{"AboveLeft",13},{"aboveleft",13},{"230",13},{"A",13}, {"a",13},{"Above",13},{"above",13},{"232",13},{"AR",13},{"ar",13},{"Above_Right",13},{"AboveRight",13},{"aboveright",13}, {"233",13},{"DB",13},{"db",13},{"Double_Below",13},{"DoubleBelow",13},{"doublebelow",13},{"234",13},{"DA",13},{"da",13}, {"Double_Above",13},{"DoubleAbove",13},{"doubleabove",13},{"240",13},{"IS",13},{"is",13},{"Iota_Subscript",13}, {"IotaSubscript",13},{"iotasubscript",13},{"dt",18},{"Decomposition_Type",18},{"DecompositionType",18}, {"decompositiontype",18},{"Can",18},{"can",18},{"Canonical",18},{"canonical",18},{"Com",18},{"com",18},{"Compat",18}, {"compat",18},{"Enc",18},{"enc",18},{"Circle",18},{"circle",18},{"Fin",18},{"fin",18},{"Final",18},{"final",18}, {"Font",18},{"font",18},{"Fra",18},{"fra",18},{"Fraction",18},{"fraction",18},{"Init",18},{"init",18},{"Initial",18}, {"initial",18},{"Iso",18},{"iso",18},{"Isolated",18},{"isolated",18},{"Med",18},{"med",18},{"Medial",18},{"medial",18}, {"Nar",18},{"nar",18},{"Narrow",18},{"narrow",18},{"Nb",18},{"nb",18},{"Nobreak",18},{"nobreak",18},{"None",18}, {"none",18},{"Sml",18},{"sml",18},{"Small",18},{"small",18},{"Sqr",18},{"sqr",18},{"Square",18},{"square",18},{"Sub",18}, {"sub",18},{"Sup",18},{"sup",18},{"Super",18},{"super",18},{"Vert",18},{"vert",18},{"Vertical",18},{"vertical",18}, {"Wide",18},{"wide",18},{"Word_Break",16},{"WordBreak",16},{"wordbreak",16},{"GrLink",52},{"grlink",52}, {"graphemelink",52},{"age",14},{"Age",14},{"1.1",14},{"V1_1",14},{"V11",14},{"v11",14},{"2.0",14},{"V2_0",14},{"V20",14}, {"v20",14},{"2.1",14},{"V2_1",14},{"V21",14},{"v21",14},{"3.0",14},{"V3_0",14},{"V30",14},{"v30",14},{"3.1",14}, {"V3_1",14},{"V31",14},{"v31",14},{"3.2",14},{"V3_2",14},{"V32",14},{"v32",14},{"4.0",14},{"V4_0",14},{"V40",14}, {"v40",14},{"4.1",14},{"V4_1",14},{"V41",14},{"v41",14},{"5.0",14},{"V5_0",14},{"V50",14},{"v50",14},{"5.1",14}, {"V5_1",14},{"V51",14},{"v51",14},{"5.2",14},{"V5_2",14},{"V52",14},{"v52",14},{"6.0",14},{"V6_0",14},{"V60",14}, {"v60",14},{"6.1",14},{"V6_1",14},{"V61",14},{"v61",14},{"6.2",14},{"V6_2",14},{"V62",14},{"v62",14},{"6.3",14}, {"V6_3",14},{"V63",14},{"v63",14},{"7.0",14},{"V7_0",14},{"V70",14},{"v70",14},{"8.0",14},{"V8_0",14},{"V80",14}, {"v80",14},{"NA",14},{"na",14},{"Unassigned",14},{"unassigned",14},{"Line_Break",21},{"LineBreak",21},{"linebreak",21}, {"Join_Control",60},{"JoinControl",60},{"joincontrol",60},{"NFKCQC",27},{"nfkcqc",27},{"nfkcquickcheck",27},{"m",27}, {"maybe",27},{"Assigned",31},{"assigned",31},{"jt",7},{"Joining_Type",7},{"JoiningType",7},{"joiningtype",7},{"C",7}, {"c",7},{"Join_Causing",7},{"JoinCausing",7},{"joincausing",7},{"D",7},{"d",7},{"Dual_Joining",7},{"DualJoining",7}, {"dualjoining",7},{"L",7},{"l",7},{"Left_Joining",7},{"LeftJoining",7},{"leftjoining",7},{"R",7},{"r",7}, {"Right_Joining",7},{"RightJoining",7},{"rightjoining",7},{"T",7},{"t",7},{"Transparent",7},{"transparent",7},{"U",7}, {"u",7},{"Non_Joining",7},{"NonJoining",7},{"nonjoining",7},{"Numeric_Value_Denominator",22}, {"NumericValueDenominator",22},{"numericvaluedenominator",22},{"idc",57},{"idcontinue",57},{"space",91},{"oids",75}, {"otheridstart",75},{"bmg",6},{"Bidi_Mirroring_Glyph",6},{"BidiMirroringGlyph",6},{"bidimirroringglyph",6},{"GrBase",50}, {"grbase",50},{"graphemebase",50},{"Default_Ignorable_Code_Point",45},{"DefaultIgnorableCodePoint",45}, {"defaultignorablecodepoint",45},{"Case_Folding",4},{"CaseFolding",4},{"casefolding",4} }; static MVMUnicodeNameRegistry **unicode_property_values_hashes; static const MVMUnicodeNamedValue unicode_property_value_keypairs[3181] = { {"LineSeparator",285212685},{"S",1409286145},{"OtherNumber",285212683},{"SpacingMark",285212680},{"mc",285212680}, {"connectorpunctuation",285212694},{"spacingmark",285212680},{"Spacing_Mark",285212680},{"Symbol",1409286145}, {"Surrogate",285212690},{"co",285212689},{"symbol",1409286145},{"ll",285212674},{"LC",1040187393}, {"Private_Use",285212689},{"Close_Punctuation",285212693},{"letter",1023410177},{"Modifier_Symbol",285212698}, {"combiningmark",1090519041},{"cs",285212690},{"Zl",285212685},{"ps",285212692},{"Math_Symbol",285212696}, {"Combining_Mark",1090519041},{"otherletter",285212677},{"ParagraphSeparator",285212686},{"Separator",1577058305}, {"ModifierSymbol",285212698},{"Letter",1023410177},{"CurrencySymbol",285212697},{"Po",285212695}, {"Connector_Punctuation",285212694},{"NonspacingMark",285212678},{"spaceseparator",285212684},{"No",285212683}, {"M",1090519041},{"privateuse",285212689},{"Zs",285212684},{"C",570425345},{"Enclosing_Mark",285212679}, {"otherpunctuation",285212695},{"Sm",285212696},{"Other_Letter",285212677},{"Lt",285212675},{"OtherLetter",285212677}, {"OtherPunctuation",285212695},{"lu",285212673},{"OpenPunctuation",285212692},{"N",1124073473},{"pf",285212701}, {"no",285212683},{"Cn",285212672},{"Punctuation",1325400065},{"Z",1577058305},{"Other_Punctuation",285212695}, {"lowercaseletter",285212674},{"Mc",285212680},{"me",285212679},{"cntrl",285212687},{"s",1409286145}, {"Final_Punctuation",285212701},{"othernumber",285212683},{"MathSymbol",285212696},{"paragraphseparator",285212686}, {"c",570425345},{"modifierletter",285212676},{"decimalnumber",285212681},{"Other_Symbol",285212699}, {"mathsymbol",285212696},{"CombiningMark",1090519041},{"ModifierLetter",285212676},{"nonspacingmark",285212678}, {"Pd",285212691},{"ConnectorPunctuation",285212694},{"CasedLetter",1040187393},{"ClosePunctuation",285212693}, {"Other",570425345},{"Space_Separator",285212684},{"Open_Punctuation",285212692},{"punctuation",1325400065}, {"control",285212687},{"Pf",285212701},{"UppercaseLetter",285212673},{"m",1090519041},{"Letter_Number",285212682}, {"mn",285212678},{"initialpunctuation",285212700},{"separator",1577058305},{"FinalPunctuation",285212701}, {"dashpunctuation",285212691},{"lc",1040187393},{"Ll",285212674},{"Sk",285212698},{"InitialPunctuation",285212700}, {"modifiersymbol",285212698},{"sc",285212697},{"letternumber",285212682},{"lm",285212676},{"cn",285212672}, {"Currency_Symbol",285212697},{"Initial_Punctuation",285212700},{"Cased_Letter",1040187393},{"mark",1090519041}, {"Number",1124073473},{"Lowercase_Letter",285212674},{"lo",285212677},{"po",285212695},{"lineseparator",285212685}, {"Ps",285212692},{"Lu",285212673},{"Line_Separator",285212685},{"zp",285212686},{"Uppercase_Letter",285212673}, {"Me",285212679},{"z",1577058305},{"surrogate",285212690},{"digit",285212681},{"number",1124073473},{"So",285212699}, {"DecimalNumber",285212681},{"Zp",285212686},{"zl",285212685},{"pc",285212694},{"LowercaseLetter",285212674}, {"openpunctuation",285212692},{"L",1023410177},{"Cc",285212687},{"P",1325400065},{"finalpunctuation",285212701}, {"Decimal_Number",285212681},{"Pi",285212700},{"othersymbol",285212699},{"punct",1325400065},{"sk",285212698}, {"EnclosingMark",285212679},{"Nonspacing_Mark",285212678},{"LetterNumber",285212682},{"Modifier_Letter",285212676}, {"pe",285212693},{"SpaceSeparator",285212684},{"Lm",285212676},{"Co",285212689},{"PrivateUse",285212689}, {"Paragraph_Separator",285212686},{"Nd",285212681},{"Dash_Punctuation",285212691},{"Format",285212688}, {"unassigned",285212672},{"cc",285212687},{"Cf",285212688},{"Mn",285212678},{"enclosingmark",285212679}, {"DashPunctuation",285212691},{"Pe",285212693},{"zs",285212684},{"so",285212699},{"Titlecase_Letter",285212675}, {"cf",285212688},{"nd",285212681},{"Cs",285212690},{"titlecaseletter",285212675},{"lt",285212675},{"Lo",285212677}, {"Other_Number",285212683},{"pd",285212691},{"Control",285212687},{"other",570425345},{"Sc",285212697}, {"Mark",1090519041},{"uppercaseletter",285212673},{"pi",285212700},{"TitlecaseLetter",285212675},{"n",1124073473}, {"OtherSymbol",285212699},{"casedletter",1040187393},{"closepunctuation",285212693},{"Unassigned",285212672}, {"Pc",285212694},{"sm",285212696},{"nl",285212682},{"l",1023410177},{"Nl",285212682},{"p",1325400065}, {"format",285212688},{"currencysymbol",285212697},{"Goth",150994983},{"Ital",150994982},{"pahawhhmong",150995052}, {"bamum",150995028},{"Brah",150995038},{"vaii",150995014},{"inscriptionalparthian",150995033},{"pauc",150995063}, {"cher",150994971},{"prti",150995033},{"Phag",150995009},{"armenian",150994949},{"Yiii",150994981},{"kana",150994978}, {"Glag",150995001},{"thaana",150994953},{"lepc",150995012},{"ImperialAramaic",150995031},{"copt",150994999}, {"Bali",150995006},{"sylo",150995003},{"mtei",150995030},{"Nabataean",150995061},{"buhid",150994988}, {"Armenian",150994949},{"limb",150994990},{"Palm",150995062},{"egyptianhieroglyphs",150995025},{"Cher",150994971}, {"Chakma",150995040},{"Old_Hungarian",150995074},{"sorasompeng",150995045},{"mro",150995059},{"LinearA",150995054}, {"devanagari",150994954},{"buginese",150994998},{"lana",150995022},{"Gurmukhi",150994956},{"siddham",150995066}, {"batak",150995037},{"hangul",150994969},{"Xsux",150995007},{"meroitichieroglyphs",150995042},{"Qaac",150994999}, {"shaw",150994994},{"Meetei_Mayek",150995030},{"Carian",150995019},{"sind",150995067},{"Shavian",150994994}, {"Lydian",150995020},{"Mongolian",150994976},{"mendekikakui",150995057},{"hiragana",150994977},{"lepcha",150995012}, {"Yi",150994981},{"zzzz",150994944},{"OldPersian",150995004},{"olck",150995013},{"beng",150994955},{"Braille",150994997}, {"Sidd",150995066},{"Khar",150995005},{"dupl",150995049},{"lycian",150995018},{"SignWriting",150995075}, {"rjng",150995017},{"Merc",150995041},{"Buhid",150994988},{"runr",150994974},{"Bassa_Vah",150995048},{"hano",150994987}, {"cans",150994972},{"Cakm",150995040},{"elba",150995050},{"Prti",150995033},{"Kannada",150994961},{"khmr",150994975}, {"Mandaic",150995039},{"gurmukhi",150994956},{"coptic",150994999},{"manichaean",150995056},{"zinh",150994985}, {"BassaVah",150995048},{"tirhuta",150995068},{"tibetan",150994966},{"meeteimayek",150995030},{"Tavt",150995023}, {"Qaai",150994985},{"InscriptionalPahlavi",150995034},{"Pahawh_Hmong",150995052},{"mymr",150994967},{"Hang",150994969}, {"Orkh",150995035},{"Bopomofo",150994979},{"Mroo",150995059},{"tglg",150994986},{"Gujr",150994957},{"mlym",150994962}, {"Orya",150994958},{"taiviet",150995023},{"orkh",150995035},{"Mong",150994976},{"mani",150995056}, {"MeroiticCursive",150995041},{"bamu",150995028},{"Lisu",150995027},{"khudawadi",150995067}, {"MeroiticHieroglyphs",150995042},{"bass",150995048},{"Lepcha",150995012},{"duployan",150995049},{"xsux",150995007}, {"InscriptionalParthian",150995033},{"Javanese",150995029},{"Duployan",150995049},{"brah",150995038},{"Batk",150995037}, {"meroiticcursive",150995041},{"cuneiform",150995007},{"Syrc",150994952},{"bali",150995006},{"unknown",150994944}, {"geor",150994968},{"syrc",150994952},{"tfng",150995002},{"Dupl",150995049},{"LinearB",150994992},{"Sarb",150995032}, {"Coptic",150994999},{"Sinhala",150994963},{"glagolitic",150995001},{"imperialaramaic",150995031},{"Armn",150994949}, {"kharoshthi",150995005},{"Cyrl",150994948},{"osma",150994995},{"CanadianAboriginal",150994972},{"ogam",150994973}, {"Hatr",150995072},{"lydi",150995020},{"katakana",150994978},{"Shrd",150995044},{"laoo",150994965},{"Bamum",150995028}, {"elbasan",150995050},{"batk",150995037},{"cherokee",150994971},{"ogham",150994973},{"Samaritan",150995026}, {"Khudawadi",150995067},{"Limbu",150994990},{"Caucasian_Albanian",150995047},{"ethiopic",150994970}, {"Hiragana",150994977},{"ahom",150995070},{"Inherited",150994985},{"bugi",150994998},{"sidd",150995066}, {"sund",150995011},{"Beng",150994955},{"Latin",150994946},{"Old_Turkic",150995035},{"Ol_Chiki",150995013}, {"olchiki",150995013},{"Dsrt",150994984},{"SoraSompeng",150995045},{"Java",150995029},{"Khmr",150994975}, {"Vaii",150995014},{"Shaw",150994994},{"cakm",150995040},{"Hebrew",150994950},{"Mahj",150995055},{"Nbat",150995061}, {"Tibt",150994966},{"Mult",150995073},{"Avestan",150995024},{"Avst",150995024},{"Cherokee",150994971},{"plrd",150995043}, {"Grek",150994947},{"CaucasianAlbanian",150995047},{"Taml",150994959},{"hmng",150995052},{"Tamil",150994959}, {"runic",150994974},{"nko",150995010},{"Lydi",150995020},{"Palmyrene",150995062},{"goth",150994983},{"palm",150995062}, {"arabic",150994951},{"phagspa",150995009},{"nkoo",150995010},{"oldsoutharabian",150995032},{"samaritan",150995026}, {"Deseret",150994984},{"Tifinagh",150995002},{"SylotiNagri",150995003},{"Takri",150995046},{"Ugaritic",150994993}, {"gujr",150994957},{"Batak",150995037},{"Kayah_Li",150995016},{"Thai",150994964},{"Vai",150995014}, {"oldturkic",150995035},{"Tai_Viet",150995023},{"Xpeo",150995004},{"Rejang",150995017},{"Hung",150995074}, {"bengali",150994955},{"Linb",150994992},{"mahj",150995055},{"Mymr",150994967},{"saurashtra",150995015}, {"Osmanya",150994995},{"xpeo",150995004},{"Sgnw",150995075},{"Lyci",150995018},{"gujarati",150994957}, {"Meroitic_Cursive",150995041},{"Phli",150995034},{"Cari",150995019},{"Talu",150995000},{"Multani",150995073}, {"ethi",150994970},{"Egyp",150995025},{"Mani",150995056},{"lisu",150995027},{"Old_Permic",150995064},{"Wara",150995069}, {"Tglg",150994986},{"avestan",150995024},{"tifinagh",150995002},{"Telugu",150994960},{"Plrd",150995043}, {"khmer",150994975},{"Ogham",150994973},{"thai",150994964},{"Meroitic_Hieroglyphs",150995042},{"Cyrillic",150994948}, {"mahajani",150995055},{"syriac",150994952},{"javanese",150995029},{"kali",150995016},{"Saurashtra",150995015}, {"phli",150995034},{"Cham",150995021},{"braille",150994997},{"tamil",150994959},{"Sora_Sompeng",150995045}, {"armi",150995031},{"linb",150994992},{"kannada",150994961},{"Phnx",150995008},{"mend",150995057},{"tale",150994991}, {"Elba",150995050},{"shavian",150994994},{"newtailue",150995000},{"Runr",150994974},{"Mero",150995042}, {"Psalter_Pahlavi",150995065},{"Olck",150995013},{"ugaritic",150994993},{"Syriac",150994952},{"perm",150995064}, {"Tagb",150994989},{"Phoenician",150995008},{"Devanagari",150994954},{"talu",150995000},{"carian",150995019}, {"sharada",150995044},{"Thaana",150994953},{"Anatolian_Hieroglyphs",150995071},{"cari",150995019}, {"Old_Italic",150994982},{"Lina",150995054},{"java",150995029},{"common",150994945},{"yiii",150994981}, {"Latn",150994946},{"Kana",150994978},{"gothic",150994983},{"Hluw",150995071},{"Ethiopic",150994970},{"hebr",150994950}, {"Inscriptional_Pahlavi",150995034},{"mandaic",150995039},{"tagb",150994989},{"Cprt",150994996},{"Zzzz",150994944}, {"deseret",150994984},{"TaiTham",150995022},{"taitham",150995022},{"Tagbanwa",150994989},{"inherited",150994985}, {"Buginese",150994998},{"Kthi",150995036},{"lina",150995054},{"Arabic",150994951},{"Zyyy",150994945}, {"Tai_Tham",150995022},{"palmyrene",150995062},{"Cans",150994972},{"psalterpahlavi",150995065},{"sarb",150995032}, {"oldpermic",150995064},{"Limb",150994990},{"lao",150994965},{"PauCinHau",150995063},{"cyrl",150994948}, {"Mend",150995057},{"nabataean",150995061},{"Syloti_Nagri",150995003},{"wara",150995069},{"limbu",150994990}, {"Gran",150995051},{"anatolianhieroglyphs",150995071},{"Warang_Citi",150995069},{"Runic",150994974},{"Brai",150994997}, {"Bopo",150994979},{"caucasianalbanian",150995047},{"Linear_A",150995054},{"MeeteiMayek",150995030},{"lyci",150995018}, {"tagbanwa",150994989},{"OldSouthArabian",150995032},{"PahawhHmong",150995052},{"Imperial_Aramaic",150995031}, {"knda",150994961},{"phoenician",150995008},{"cham",150995021},{"Bengali",150994955},{"tibt",150994966}, {"Buhd",150994988},{"Ogam",150994973},{"Ugar",150994993},{"Pau_Cin_Hau",150995063},{"shrd",150995044},{"Thaa",150994953}, {"mult",150995073},{"OldNorthArabian",150995060},{"sora",150995045},{"tirh",150995068},{"hatran",150995072}, {"Mlym",150994962},{"Phlp",150995065},{"oldpersian",150995004},{"modi",150995058},{"signwriting",150995075}, {"Deva",150994954},{"Laoo",150994965},{"Bugi",150994998},{"OldPermic",150995064},{"bassavah",150995048}, {"Tirhuta",150995068},{"osmanya",150994995},{"Gothic",150994983},{"phlp",150995065},{"canadianaboriginal",150994972}, {"PsalterPahlavi",150995065},{"Zinh",150994985},{"latin",150994946},{"mong",150994976},{"Malayalam",150994962}, {"armn",150994949},{"avst",150995024},{"Lana",150995022},{"taile",150994991},{"guru",150994956},{"brahmi",150995038}, {"gran",150995051},{"Sharada",150995044},{"Unknown",150994944},{"Hanunoo",150994987},{"Lycian",150995018}, {"oldnortharabian",150995060},{"sylotinagri",150995003},{"Geor",150994968},{"Katakana",150994978},{"Khojki",150995053}, {"Narb",150995060},{"Common",150994945},{"Myanmar",150994967},{"telu",150994960},{"Pauc",150995063},{"glag",150995001}, {"qaac",150994999},{"hanunoo",150994987},{"dsrt",150994984},{"Kaithi",150995036},{"AnatolianHieroglyphs",150995071}, {"buhd",150994988},{"multani",150995073},{"TaiViet",150995023},{"Sylo",150995003},{"TaiLe",150994991},{"bopo",150994979}, {"khar",150995005},{"aghb",150995047},{"Hebr",150994950},{"Tagalog",150994986},{"Miao",150995043},{"Telu",150994960}, {"zyyy",150994945},{"Linear_B",150994992},{"hluw",150995071},{"Knda",150994961},{"warangciti",150995069}, {"Lepc",150995012},{"Ethi",150994970},{"Samr",150995026},{"Hmng",150995052},{"orya",150994958},{"saur",150995015}, {"linearb",150994992},{"sundanese",150995011},{"Old_South_Arabian",150995032},{"Tale",150994991},{"lineara",150995054}, {"Cuneiform",150995007},{"thaa",150994953},{"mroo",150995059},{"khoj",150995053},{"Kharoshthi",150995005}, {"Modi",150995058},{"Copt",150994999},{"malayalam",150994962},{"Nko",150995010},{"oriya",150994958},{"hung",150995074}, {"hira",150994977},{"Mtei",150995030},{"Brahmi",150995038},{"tagalog",150994986},{"Tfng",150995002},{"arab",150994951}, {"vai",150995014},{"Lao",150994965},{"han",150994980},{"cprt",150994996},{"merc",150995041},{"Hano",150994987}, {"Manichaean",150995056},{"Osma",150994995},{"Old_Persian",150995004},{"mand",150995039},{"rejang",150995017}, {"MendeKikakui",150995057},{"Grantha",150995051},{"Bamu",150995028},{"takr",150995046},{"New_Tai_Lue",150995000}, {"Sund",150995011},{"Aghb",150995047},{"qaai",150994985},{"ugar",150994993},{"cyrillic",150994948}, {"Sundanese",150995011},{"NewTaiLue",150995000},{"Phags_Pa",150995009},{"balinese",150995006}, {"Inscriptional_Parthian",150995033},{"OldHungarian",150995074},{"Saur",150995015},{"yi",150994981},{"Guru",150994956}, {"EgyptianHieroglyphs",150995025},{"egyp",150995025},{"Rjng",150995017},{"brai",150994997},{"Khoj",150995053}, {"hang",150994969},{"Hatran",150995072},{"Old_North_Arabian",150995060},{"georgian",150994968},{"takri",150995046}, {"Glagolitic",150995001},{"sinhala",150994963},{"Tirh",150995068},{"Mro",150995059},{"kayahli",150995016}, {"Greek",150994947},{"phnx",150995008},{"Siddham",150995066},{"hebrew",150994950},{"ital",150994982}, {"Georgian",150994968},{"Mand",150995039},{"OldTurkic",150995035},{"Sora",150995045},{"Kali",150995016}, {"Armi",150995031},{"Mende_Kikakui",150995057},{"myanmar",150994967},{"greek",150994947},{"Han",150994980}, {"OldItalic",150994982},{"Mahajani",150995055},{"kthi",150995036},{"mongolian",150994976},{"kaithi",150995036}, {"sinh",150994963},{"cypriot",150994996},{"Nkoo",150995010},{"samr",150995026},{"Sinh",150994963},{"Khmer",150994975}, {"deva",150994954},{"lydian",150995020},{"chakma",150995040},{"Cypriot",150994996},{"oldhungarian",150995074}, {"Balinese",150995006},{"WarangCiti",150995069},{"hatr",150995072},{"tavt",150995023},{"grek",150994947}, {"Hira",150994977},{"phag",150995009},{"Hani",150994980},{"sgnw",150995075},{"Canadian_Aboriginal",150994972}, {"hani",150994980},{"Tai_Le",150994991},{"Elbasan",150995050},{"paucinhau",150995063},{"OlChiki",150995013}, {"taml",150994959},{"Bass",150995048},{"Takr",150995046},{"Sind",150995067},{"PhagsPa",150995009},{"Gujarati",150994957}, {"bopomofo",150994979},{"telugu",150994960},{"Perm",150995064},{"Hangul",150994969},{"miao",150995043}, {"narb",150995060},{"khojki",150995053},{"mero",150995042},{"Arab",150994951},{"inscriptionalpahlavi",150995034}, {"Tibetan",150994966},{"grantha",150995051},{"Ahom",150995070},{"nbat",150995061},{"KayahLi",150995016}, {"Egyptian_Hieroglyphs",150995025},{"Oriya",150994958},{"latn",150994946},{"olditalic",150994982},{"CWKCF",687865857}, {"Pattern_Syntax",1342177281},{"patsyn",1342177281},{"PatternSyntax",1342177281},{"patternsyntax",1342177281}, {"IDS",973078529},{"Dep",771751937},{"ci",603979777},{"Case_Ignorable",603979777},{"caseignorable",603979777}, {"CaseIgnorable",603979777},{"nfcquickcheck",469762049},{"NFCQuickCheck",469762049},{"NFC_Quick_Check",469762049}, {"nfcqc",469762049},{"OAlpha",1191182337},{"NFKCQC",452984833},{"Lower",1073741825},{"idstart",973078529}, {"IDStart",973078529},{"ids",973078529},{"ID_Start",973078529},{"SpacingMark",402653190},{"T",402653193}, {"LVT",402653195},{"spacingmark",402653190},{"cn",402653187},{"lv",402653194},{"CR",402653185},{"xx",402653184}, {"cr",402653185},{"RegionalIndicator",402653189},{"t",402653193},{"CN",402653187},{"EX",402653188},{"extend",402653188}, {"v",402653192},{"regionalindicator",402653189},{"other",402653184},{"Control",402653187},{"LF",402653186}, {"RI",402653189},{"LV",402653194},{"ri",402653189},{"V",402653192},{"Other",402653184},{"lvt",402653195}, {"XX",402653184},{"L",402653191},{"control",402653187},{"ex",402653188},{"sm",402653190},{"l",402653191}, {"Regional_Indicator",402653189},{"Extend",402653188},{"SM",402653190},{"lf",402653186},{"DI",754974721}, {"AHex",335544321},{"Changes_When_Titlecased",704643073},{"cwt",704643073},{"ChangesWhenTitlecased",704643073}, {"changeswhentitlecased",704643073},{"OLower",1275068417},{"LOE",1056964609},{"patws",1358954497}, {"patternwhitespace",1358954497},{"Pattern_White_Space",1358954497},{"PatternWhiteSpace",1358954497}, {"NFKDQC",1157627905},{"Bidi_M",553648129},{"Radical",1392508929},{"cased",620756993},{"Cased",620756993}, {"STerm",1426063361},{"Ext",805306369},{"ASCIIHexDigit",335544321},{"ASCII_Hex_Digit",335544321}, {"asciihexdigit",335544321},{"ahex",335544321},{"OMath",1291845633},{"ODI",1207959553},{"JoinC",1006632961}, {"Diacritic",788529153},{"diacritic",788529153},{"dia",788529153},{"xidstart",1560281089},{"XID_Start",1560281089}, {"XIDStart",1560281089},{"xids",1560281089},{"Term",1459617793},{"QMark",1375731713},{"nfdquickcheck",1140850689}, {"NFD_Quick_Check",1140850689},{"NFDQuickCheck",1140850689},{"nfdqc",1140850689},{"GrLink",872415233}, {"XIDS",1560281089},{"IPAExtensions",83886085},{"HighPUSurrogates",83886227}, {"CJK_Unified_Ideographs_Extension_A",83886195},{"PUA",83886229},{"pahawhhmong",83886307},{"dingbats",83886165}, {"bamum",83886203},{"CJK_Unified_Ideographs_Extension_E",83886337},{"inscriptionalparthian",83886275}, {"Unified_Canadian_Aboriginal_Syllabics",83886120},{"SuttonSignWriting",83886318},{"GeorgianSupplement",83886176}, {"CJKCompat",83886194},{"EnclosedIdeographicSup",83886325},{"Control_Pictures",83886158},{"CJK_Symbols",83886184}, {"Dingbats",83886165},{"cjkextb",83886334},{"VSSup",83886340},{"armenian",83886091},{"TaiXuanJingSymbols",83886315}, {"CJKCompatibilityForms",83886236},{"shorthandformatcontrols",83886311},{"ancientgreekmusicalnotation",83886314}, {"SupArrowsB",83886169},{"thaana",83886096},{"Enclosed_Alphanumeric_Supplement",83886324},{"ImperialAramaic",83886262}, {"CJK_Radicals_Sup",83886181},{"SupplementalMathematicalOperators",83886171},{"Diacriticals_Ext",83886136}, {"ControlPictures",83886158},{"MiscellaneousMathematicalSymbolsA",83886166},{"CJK_Compat_Forms",83886236}, {"MathematicalOperators",83886156},{"Nabataean",83886264},{"Latin_1",83886082},{"Latin_Ext_B",83886084}, {"buhid",83886125},{"GeneralPunctuation",83886149},{"Diacriticals_Sup",83886146},{"mathalphanum",83886317}, {"meeteimayekext",83886219},{"hangulsyllables",83886224},{"Armenian",83886091},{"suppuab",83886342}, {"Kana_Supplement",83886309},{"Misc_Arrows",83886172},{"mathoperators",83886156},{"Yijing_Hexagram_Symbols",83886196}, {"smallformvariants",83886237},{"ShorthandFormatControls",83886311},{"egyptianhieroglyphs",83886302}, {"CombiningDiacriticalMarksSupplement",83886146},{"Chakma",83886284},{"opticalcharacterrecognition",83886159}, {"CombiningHalfMarks",83886235},{"Ancient_Symbols",83886245},{"alphabeticpf",83886231},{"Old_Hungarian",83886279}, {"LatinExtD",83886205},{"Small_Form_Variants",83886237},{"VariationSelectorsSupplement",83886340}, {"sorasompeng",83886283},{"mro",83886305},{"LinearA",83886260},{"devanagari",83886101},{"buginese",83886134}, {"mathematicalalphanumericsymbols",83886317},{"Sup_Symbols_And_Pictographs",83886333}, {"unifiedcanadianaboriginalsyllabicsextended",83886129},{"arabicpresentationformsb",83886238},{"Gurmukhi",83886103}, {"greekext",83886148},{"enclosedideographicsupplement",83886325},{"siddham",83886293}, {"phoneticextensionssupplement",83886145},{"Mathematical_Alphanumeric_Symbols",83886317},{"batak",83886139}, {"hangul",83886224},{"controlpictures",83886158},{"meroitichieroglyphs",83886268},{"SupArrowsC",83886332}, {"Katakana_Phonetic_Extensions",83886192},{"cjkunifiedideographsextensione",83886337},{"CJKExtB",83886334}, {"enclosedideographicsup",83886325},{"Common_Indic_Number_Forms",83886207},{"Meetei_Mayek",83886223},{"Carian",83886248}, {"arabicsup",83886095},{"sinhalaarchaicnumbers",83886287},{"JamoExtB",83886225},{"alchemical",83886330}, {"supplementalmathematicaloperators",83886171},{"Shavian",83886256},{"Lydian",83886267},{"Latin_1_Supplement",83886082}, {"Mongolian",83886128},{"mendekikakui",83886319},{"PrivateUseArea",83886229},{"latinextb",83886084}, {"hiragana",83886185},{"lepcha",83886140},{"supsymbolsandpictographs",83886333},{"CJK",83886197},{"OldPersian",83886254}, {"MiscArrows",83886172},{"Geometric_Shapes_Ext",83886331},{"Braille",83886168},{"EthiopicExtendedA",83886220}, {"CyrillicExtB",83886202},{"ancientgreeknumbers",83886244},{"NKo",83886097},{"Shorthand_Format_Controls",83886311}, {"punctuation",83886149},{"enclosedalphanumericsupplement",83886324},{"bamumsup",83886304},{"Musical_Symbols",83886313}, {"Kangxi",83886182},{"lycian",83886247},{"taixuanjing",83886315},{"Geometric_Shapes",83886163},{"LatinExtB",83886084}, {"katakanaext",83886192},{"suppuaa",83886341},{"PhoneticExtensionsSupplement",83886145},{"khmersymbols",83886133}, {"CJK_Radicals_Supplement",83886181},{"jamo",83886116},{"Buhid",83886125},{"Katakana_Ext",83886192}, {"Alchemical_Symbols",83886330},{"Bassa_Vah",83886306},{"Latin_Ext_A",83886083}, {"CJK_Unified_Ideographs_Extension_B",83886334},{"cjkcompatibilityideographssupplement",83886338}, {"IPA_Extensions",83886085},{"Kannada",83886108},{"ArabicMathematicalAlphabeticSymbols",83886320}, {"alchemicalsymbols",83886330},{"bamumsupplement",83886304},{"geometricshapes",83886163},{"Greek_And_Coptic",83886088}, {"rumi",83886280},{"MyanmarExtendedB",83886215},{"ethiopicext",83886178},{"myanmarextb",83886215},{"Mandaic",83886099}, {"cypriotsyllabary",83886261},{"gurmukhi",83886103},{"coptic",83886175},{"supplementalarrowsb",83886169}, {"Superscripts_And_Subscripts",83886150},{"SupplementalSymbolsAndPictographs",83886333},{"manichaean",83886273}, {"CJKRadicalsSup",83886181},{"Phaistos_Disc",83886246},{"phoneticext",83886144},{"EnclosedAlphanumSup",83886324}, {"cjkunifiedideographsextensionc",83886335},{"CherokeeSup",83886222},{"BassaVah",83886306},{"tirhuta",83886292}, {"tibetan",83886113},{"SupSymbolsAndPictographs",83886333},{"HangulCompatibilityJamo",83886188}, {"CJK_Compat_Ideographs_Sup",83886338},{"dominotiles",83886322},{"Indic_Number_Forms",83886207},{"bopomofoext",83886190}, {"suparrowsa",83886167},{"meeteimayek",83886223},{"Combining_Marks_For_Symbols",83886152}, {"hangulcompatibilityjamo",83886188},{"diacriticalsext",83886136},{"GeometricShapes",83886163},{"BopomofoExt",83886190}, {"NumberForms",83886154},{"Pahawh_Hmong",83886307},{"InscriptionalPahlavi",83886276},{"pua",83886229}, {"arabicpfb",83886238},{"sundanesesupplement",83886142},{"DominoTiles",83886322}, {"Combining_Diacritical_Marks_Supplement",83886146},{"arabicmath",83886320},{"Bopomofo",83886187}, {"Miscellaneous_Technical",83886157},{"EthiopicSup",83886118},{"mahjongtiles",83886321},{"CJKCompatibility",83886194}, {"Block_Elements",83886162},{"CJK_Strokes",83886191},{"PrivateUse",83886229},{"noblock",83886080}, {"georgiansup",83886176},{"enclosedalphanumsup",83886324},{"Vedic_Extensions",83886143},{"taiviet",83886218}, {"KhmerSymbols",83886133},{"Alphabetic_PF",83886231},{"AlphabeticPF",83886231},{"ArabicPresentationFormsA",83886232}, {"ByzantineMusicalSymbols",83886312},{"PlayingCards",83886323},{"Tai_Xuan_Jing_Symbols",83886315}, {"MeroiticCursive",83886269},{"Lisu",83886200},{"EnclosedAlphanum",83886160},{"khudawadi",83886290}, {"arabicpresentationformsa",83886232},{"SuperscriptsAndSubscripts",83886150},{"MeroiticHieroglyphs",83886268}, {"LatinExtendedE",83886221},{"EarlyDynasticCuneiform",83886301},{"ASCII",83886081},{"Misc_Pictographs",83886326}, {"latinextendedb",83886084},{"Playing_Cards",83886323},{"Lepcha",83886140},{"duployan",83886310}, {"Sundanese_Supplement",83886142},{"AncientGreekMusicalNotation",83886314},{"Javanese",83886214}, {"InscriptionalParthian",83886275},{"RumiNumeralSymbols",83886280},{"Duployan",83886310}, {"combiningmarksforsymbols",83886152},{"CJKCompatibilityIdeographsSupplement",83886338},{"miscpictographs",83886326}, {"cjkstrokes",83886191},{"CyrillicExtendedA",83886179},{"Low_Surrogates",83886228},{"meroiticcursive",83886269}, {"cuneiform",83886299},{"Variation_Selectors_Supplement",83886340},{"myanmarextendedb",83886215},{"latin1",83886082}, {"Latin_Ext_D",83886205},{"halfmarks",83886235},{"ethiopicextended",83886178},{"Currency_Symbols",83886151}, {"Coptic",83886175},{"Unified_Canadian_Aboriginal_Syllabics_Extended",83886129}, {"CuneiformNumbersAndPunctuation",83886300},{"Sinhala",83886110},{"imperialaramaic",83886262},{"glagolitic",83886173}, {"kharoshthi",83886270},{"UnifiedCanadianAboriginalSyllabicsExtended",83886129},{"BraillePatterns",83886168}, {"SundaneseSup",83886142},{"UnifiedCanadianAboriginalSyllabics",83886120},{"MyanmarExtB",83886215}, {"MyanmarExtendedA",83886217},{"Yi_Syllables",83886198},{"JamoExtA",83886213},{"supmathoperators",83886171}, {"Alchemical",83886330},{"suttonsignwriting",83886318},{"Combining_Diacritical_Marks",83886087}, {"CJKUnifiedIdeographsExtensionB",83886334},{"enclosedcjk",83886193},{"Misc_Math_Symbols_B",83886170}, {"SmallForms",83886237},{"Arabic_Ext_A",83886100},{"musicalsymbols",83886313},{"Hangul_Compatibility_Jamo",83886188}, {"ocr",83886159},{"Phonetic_Extensions",83886144},{"supplementalsymbolsandpictographs",83886333},{"katakana",83886186}, {"Tags",83886339},{"miscellaneousmathematicalsymbolsa",83886166},{"SupplementalPunctuation",83886180}, {"LatinExtA",83886083},{"braillepatterns",83886168},{"cjkunifiedideographsextensiond",83886336}, {"Bamum_Supplement",83886304},{"smallforms",83886237},{"enclosedcjklettersandmonths",83886193}, {"AncientGreekNumbers",83886244},{"Cuneiform_Numbers",83886300},{"Bamum",83886203},{"letterlikesymbols",83886153}, {"elbasan",83886258},{"Yijing",83886196},{"linearbideograms",83886242},{"Halfwidth_And_Fullwidth_Forms",83886239}, {"cherokee",83886119},{"bopomofoextended",83886190},{"ogham",83886121},{"Vedic_Ext",83886143}, {"CommonIndicNumberForms",83886207},{"Alphabetic_Presentation_Forms",83886231},{"Samaritan",83886098}, {"Khudawadi",83886290},{"HangulJamoExtendedA",83886213},{"Arabic_Presentation_Forms_A",83886232}, {"cherokeesupplement",83886222},{"arabicmathematicalalphabeticsymbols",83886320},{"Limbu",83886130}, {"Hiragana",83886185},{"ethiopic",83886117},{"Caucasian_Albanian",83886259},{"ahom",83886296},{"Box_Drawing",83886161}, {"geometricshapesextended",83886331},{"Myanmar_Ext_B",83886215},{"SpacingModifierLetters",83886086}, {"Latin1Sup",83886082},{"blockelements",83886162},{"SupplementalArrowsB",83886169},{"Old_Turkic",83886278}, {"Latin_Extended_C",83886174},{"Ol_Chiki",83886141},{"CJKUnifiedIdeographs",83886197},{"olchiki",83886141}, {"Sup_Punctuation",83886180},{"SoraSompeng",83886283},{"ethiopicextendeda",83886220},{"jamoexta",83886213}, {"Kanbun",83886189},{"Hebrew",83886092},{"CJKExtD",83886336},{"Cyrillic_Extended_A",83886179}, {"DiacriticalsExt",83886136},{"AlchemicalSymbols",83886330},{"DevanagariExt",83886210},{"latinextendeda",83886083}, {"Supplemental_Arrows_C",83886332},{"MeeteiMayekExt",83886219},{"Avestan",83886274},{"Cherokee",83886119}, {"Meetei_Mayek_Ext",83886219},{"GreekExtended",83886148},{"Counting_Rod_Numerals",83886316}, {"Latin_Extended_A",83886083},{"KangxiRadicals",83886182},{"CombiningDiacriticalMarks",83886087}, {"ornamentaldingbats",83886328},{"combiningdiacriticalmarkssupplement",83886146},{"CaucasianAlbanian",83886259}, {"taixuanjingsymbols",83886315},{"variationselectorssupplement",83886340},{"byzantinemusicalsymbols",83886312}, {"Tamil",83886106},{"CanadianSyllabics",83886120},{"specials",83886240},{"ethiopicsup",83886118}, {"cuneiformnumbers",83886300},{"Diacriticals",83886087},{"HangulSyllables",83886224},{"Bamum_Sup",83886304}, {"runic",83886122},{"nko",83886097},{"Cyrillic_Ext_A",83886179},{"Palmyrene",83886263},{"Emoticons",83886327}, {"arabic",83886093},{"Latin_Ext_C",83886174},{"cuneiformnumbersandpunctuation",83886300},{"VedicExt",83886143}, {"cyrillicsup",83886090},{"cjkextd",83886336},{"phagspa",83886208},{"ipaextensions",83886085},{"IPAExt",83886085}, {"Transport_And_Map_Symbols",83886329},{"samaritan",83886098},{"oldsoutharabian",83886271},{"Number_Forms",83886154}, {"lowsurrogates",83886228},{"Miscellaneous_Mathematical_Symbols_B",83886170},{"HangulJamoExtendedB",83886225}, {"transportandmapsymbols",83886329},{"Math_Operators",83886156},{"cjkunifiedideographsextensiona",83886195}, {"Arabic_Presentation_Forms_B",83886238},{"IPA_Ext",83886085},{"Deseret",83886255},{"Tifinagh",83886177}, {"SylotiNagri",83886206},{"diacriticalssup",83886146},{"CyrillicSup",83886090},{"Takri",83886295},{"cjkcompat",83886194}, {"SupPunctuation",83886180},{"MiscMathSymbolsB",83886170},{"Khmer_Symbols",83886133},{"Ugaritic",83886253}, {"SundaneseSupplement",83886142},{"Kayah_Li",83886211},{"CombiningDiacriticalMarksExtended",83886136},{"Batak",83886139}, {"yijinghexagramsymbols",83886196},{"CJK_Compatibility_Ideographs",83886230},{"Thai",83886111},{"KanaSup",83886309}, {"Vai",83886201},{"oldturkic",83886278},{"Tai_Viet",83886218},{"GreekAndCoptic",83886088},{"Half_Marks",83886235}, {"Rejang",83886212},{"CombiningMarksForSymbols",83886152},{"arabicsupplement",83886095},{"Sup_PUA_B",83886342}, {"bengali",83886102},{"EthiopicExtA",83886220},{"EnclosedCJKLettersAndMonths",83886193},{"ByzantineMusic",83886312}, {"BopomofoExtended",83886190},{"Braille_Patterns",83886168},{"CountingRodNumerals",83886316}, {"supplementaryprivateuseareaa",83886341},{"cyrillicextendeda",83886179},{"SupArrowsA",83886167}, {"IdeographicDescriptionCharacters",83886183},{"Sup_Arrows_A",83886167},{"saurashtra",83886209}, {"PhoneticExtensions",83886144},{"commonindicnumberforms",83886207},{"NoBlock",83886080},{"Osmanya",83886257}, {"KatakanaExt",83886192},{"cjkexta",83886195},{"Sup_PUA_A",83886341},{"emoticons",83886327},{"OCR",83886159}, {"KanaSupplement",83886309},{"Ethiopic_Ext",83886178},{"Bopomofo_Extended",83886190},{"gujarati",83886104}, {"arabicextendeda",83886100},{"Meroitic_Cursive",83886269},{"Multani",83886289},{"BamumSup",83886304}, {"Sutton_SignWriting",83886318},{"yijing",83886196},{"General_Punctuation",83886149},{"music",83886313}, {"miscellaneoussymbols",83886164},{"ArabicExtendedA",83886100},{"MiscellaneousTechnical",83886157},{"lisu",83886200}, {"Old_Permic",83886252},{"combininghalfmarks",83886235},{"spacingmodifierletters",83886086},{"CJKExtC",83886335}, {"avestan",83886274},{"CJKExtA",83886195},{"tifinagh",83886177},{"ArabicExtA",83886100}, {"cjkcompatibilityforms",83886236},{"Telugu",83886107},{"myanmarexta",83886217},{"Transport_And_Map",83886329}, {"khmer",83886127},{"miscellaneoustechnical",83886157},{"Ogham",83886121},{"cyrillicsupplementary",83886090}, {"Ancient_Greek_Numbers",83886244},{"latinextendedd",83886205},{"thai",83886111},{"PhoneticExtSup",83886145}, {"Cyrillic_Extended_B",83886202},{"Misc_Symbols",83886164},{"Miscellaneous_Mathematical_Symbols_A",83886166}, {"OrnamentalDingbats",83886328},{"CJKUnifiedIdeographsExtensionA",83886195},{"SupplementalArrowsA",83886167}, {"Meroitic_Hieroglyphs",83886268},{"LatinExtendedC",83886174},{"LatinExtAdditional",83886147},{"Cyrillic",83886089}, {"CJKCompatIdeographs",83886230},{"mahajani",83886285},{"syriac",83886094},{"javanese",83886214}, {"Ethiopic_Supplement",83886118},{"Latin_Extended_B",83886084},{"Geometric_Shapes_Extended",83886331}, {"vedicextensions",83886143},{"supplementalarrowsc",83886332},{"Saurashtra",83886209},{"MeeteiMayekExtensions",83886219}, {"Ancient_Greek_Music",83886314},{"Bopomofo_Ext",83886190},{"braille",83886168},{"Cham",83886216}, {"Latin_1_Sup",83886082},{"Cyrillic_Ext_B",83886202},{"tamil",83886106},{"superandsub",83886150}, {"Sora_Sompeng",83886283},{"IDC",83886183},{"kannada",83886108},{"VariationSelectors",83886233}, {"LinearBSyllabary",83886241},{"Hangul_Syllables",83886224},{"vs",83886233}, {"unifiedcanadianaboriginalsyllabics",83886120},{"shavian",83886256},{"newtailue",83886132},{"Arabic_PF_A",83886232}, {"Sup_Math_Operators",83886171},{"Hangul_Jamo",83886116},{"diacriticals",83886087},{"cjksymbols",83886184}, {"variationselectors",83886233},{"numberforms",83886154},{"Psalter_Pahlavi",83886277}, {"High_Private_Use_Surrogates",83886227},{"YiRadicals",83886199},{"ugaritic",83886253},{"Private_Use",83886229}, {"MathAlphanum",83886317},{"Syriac",83886094},{"CJKUnifiedIdeographsExtensionD",83886336},{"MathOperators",83886156}, {"cjkcompatibilityideographs",83886230},{"CJK_Compat",83886194},{"MusicalSymbols",83886313}, {"OpticalCharacterRecognition",83886159},{"cjkradicalssup",83886181},{"Ethiopic_Extended",83886178}, {"Phoenician",83886266},{"EnclosedAlphanumerics",83886160},{"Devanagari",83886101},{"EthiopicExt",83886178}, {"Hangul_Jamo_Extended_A",83886213},{"sharada",83886286},{"carian",83886248},{"CJKSymbolsAndPunctuation",83886184}, {"Thaana",83886096},{"ideographicdescriptioncharacters",83886183},{"miscellaneoussymbolsandpictographs",83886326}, {"cjkunifiedideographsextensionb",83886334},{"Kana_Sup",83886309},{"privateuse",83886229}, {"Anatolian_Hieroglyphs",83886303},{"Cherokee_Supplement",83886222},{"meeteimayekextensions",83886219}, {"ancientgreekmusic",83886314},{"Old_Italic",83886250},{"Phonetic_Ext",83886144},{"phaistosdisc",83886246}, {"AegeanNumbers",83886243},{"Latin_Extended_D",83886205},{"alphabeticpresentationforms",83886231}, {"halfandfullforms",83886239},{"miscmathsymbolsb",83886170},{"Mahjong",83886321}, {"SupplementaryPrivateUseAreaA",83886341},{"cjkunifiedideographs",83886197},{"EnclosedCJK",83886193}, {"TransportAndMapSymbols",83886329},{"gothic",83886251},{"Ethiopic",83886117},{"LatinExtE",83886221}, {"Inscriptional_Pahlavi",83886276},{"mandaic",83886099},{"cjkcompatforms",83886236},{"kangxiradicals",83886182}, {"MiscMathSymbolsA",83886166},{"Cherokee_Sup",83886222},{"greekextended",83886148},{"TaiTham",83886135}, {"deseret",83886255},{"taitham",83886135},{"Tagbanwa",83886126},{"TaiXuanJing",83886315},{"Buginese",83886134}, {"CJK_Ext_E",83886337},{"Ethiopic_Ext_A",83886220},{"Arabic",83886093},{"PhoneticExt",83886144},{"Tai_Tham",83886135}, {"palmyrene",83886263},{"Letterlike_Symbols",83886153},{"psalterpahlavi",83886277},{"latinextendedc",83886174}, {"Supplemental_Mathematical_Operators",83886171},{"kanasupplement",83886309},{"oldpermic",83886252}, {"Arabic_Extended_A",83886100},{"CopticEpactNumbers",83886249},{"CJK_Unified_Ideographs_Extension_C",83886335}, {"PauCinHau",83886298},{"lao",83886112},{"nabataean",83886264},{"MiscellaneousSymbolsAndArrows",83886172}, {"Syloti_Nagri",83886206},{"Basic_Latin",83886081},{"limbu",83886130},{"currencysymbols",83886151}, {"Spacing_Modifier_Letters",83886086},{"boxdrawing",83886161},{"superscriptsandsubscripts",83886150}, {"mahjong",83886321},{"BamumSupplement",83886304},{"Variation_Selectors",83886233},{"SupPUAA",83886341}, {"KatakanaPhoneticExtensions",83886192},{"vssup",83886340},{"LatinExtendedD",83886205},{"latinextadditional",83886147}, {"anatolianhieroglyphs",83886303},{"Miscellaneous_Symbols",83886164}, {"Combining_Diacritical_Marks_For_Symbols",83886152},{"Warang_Citi",83886297},{"Runic",83886122}, {"modifierletters",83886086},{"Latin_Ext_E",83886221},{"LetterlikeSymbols",83886153},{"caucasianalbanian",83886259}, {"MeeteiMayek",83886223},{"Linear_A",83886260},{"CountingRod",83886316},{"tagbanwa",83886126},{"compatjamo",83886188}, {"Aegean_Numbers",83886243},{"Georgian_Sup",83886176},{"OldSouthArabian",83886271},{"UCASExt",83886129}, {"Misc_Math_Symbols_A",83886166},{"PahawhHmong",83886307},{"Greek_Ext",83886148},{"Jamo",83886116}, {"Imperial_Aramaic",83886262},{"Sinhala_Archaic_Numbers",83886287},{"LinearBIdeograms",83886242}, {"GeorgianSup",83886176},{"mathematicaloperators",83886156},{"Enclosed_Alphanum_Sup",83886324},{"CyrillicExtA",83886179}, {"HalfMarks",83886235},{"UCAS_Ext",83886129},{"ucasext",83886129},{"Latin_Extended_Additional",83886147}, {"phoenician",83886266},{"transportandmap",83886329},{"cham",83886216},{"latin1sup",83886082}, {"cyrillicsupplement",83886090},{"HalfwidthAndFullwidthForms",83886239},{"Jamo_Ext_A",83886213}, {"miscellaneousmathematicalsymbolsb",83886170},{"Bengali",83886102},{"supplementalpunctuation",83886180}, {"CJKUnifiedIdeographsExtensionE",83886337},{"Pau_Cin_Hau",83886298},{"MiscTechnical",83886157},{"CJKSymbols",83886184}, {"CyrillicSupplement",83886090},{"YiSyllables",83886198},{"CyrillicSupplementary",83886090}, {"YijingHexagramSymbols",83886196},{"OldNorthArabian",83886272},{"MiscellaneousSymbols",83886164},{"latinextd",83886205}, {"Super_And_Sub",83886150},{"CJK_Symbols_And_Punctuation",83886184},{"privateusearea",83886229},{"Arabic_PF_B",83886238}, {"diacriticalsforsymbols",83886152},{"hatran",83886265},{"oldpersian",83886254}, {"EnclosedIdeographicSupplement",83886325},{"Myanmar_Extended_B",83886215},{"Modifier_Tone_Letters",83886204}, {"modi",83886294},{"ethiopicsupplement",83886118},{"SinhalaArchaicNumbers",83886287},{"arabicexta",83886100}, {"CJKUnifiedIdeographsExtensionC",83886335},{"Diacriticals_For_Symbols",83886152},{"DiacriticalsForSymbols",83886152}, {"Linear_B_Syllabary",83886241},{"copticepactnumbers",83886249},{"Enclosed_CJK_Letters_And_Months",83886193}, {"jamoextb",83886225},{"AncientGreekMusic",83886314},{"OldPermic",83886252},{"Supplemental_Arrows_B",83886169}, {"Latin_Extended_E",83886221},{"bassavah",83886306},{"HalfAndFullForms",83886239},{"Tirhuta",83886292}, {"Supplemental_Symbols_And_Pictographs",83886333},{"osmanya",83886257},{"arrows",83886155}, {"cjkcompatideographs",83886230},{"Canadian_Syllabics",83886120},{"SupplementaryPrivateUseAreaB",83886342}, {"CyrillicExtendedB",83886202},{"Gothic",83886251},{"latin1supplement",83886082},{"CJK_Ext_D",83886336}, {"cjkcompatibility",83886194},{"PsalterPahlavi",83886277},{"Cyrillic_Supplement",83886090}, {"Phonetic_Extensions_Supplement",83886145},{"Music",83886313},{"BasicLatin",83886081},{"cyrillicextendedb",83886202}, {"SupplementalArrowsC",83886332},{"phoneticextensions",83886144},{"Ideographic_Description_Characters",83886183}, {"VedicExtensions",83886143},{"Malayalam",83886109},{"modifiertoneletters",83886204},{"SuperAndSub",83886150}, {"taile",83886131},{"Arabic_Mathematical_Alphabetic_Symbols",83886320},{"CherokeeSupplement",83886222}, {"miscmathsymbolsa",83886166},{"combiningdiacriticalmarks",83886087},{"DiacriticalsSup",83886146}, {"highpusurrogates",83886227},{"phoneticextsup",83886145},{"supplementalarrowsa",83886167},{"kanasup",83886309}, {"brahmi",83886281},{"VS",83886233},{"Sharada",83886286},{"Supplementary_Private_Use_Area_A",83886341}, {"Lycian",83886247},{"ArabicSupplement",83886095},{"Hanunoo",83886124},{"MiscellaneousSymbolsAndPictographs",83886326}, {"oldnortharabian",83886272},{"sylotinagri",83886206},{"cjkextc",83886335},{"latinexte",83886221}, {"CombiningDiacriticalMarksForSymbols",83886152},{"Katakana",83886186},{"Khojki",83886288},{"Counting_Rod",83886316}, {"LowSurrogates",83886228},{"High_Surrogates",83886226},{"latinexta",83886083},{"CJK_Ext_A",83886195}, {"Coptic_Epact_Numbers",83886249},{"ruminumeralsymbols",83886280},{"VerticalForms",83886234}, {"CJK_Unified_Ideographs_Extension_D",83886336},{"georgiansupplement",83886176},{"No_Block",83886080}, {"Myanmar",83886114},{"CJKRadicalsSupplement",83886181},{"CJKCompatForms",83886236},{"hanunoo",83886124}, {"verticalforms",83886234},{"Kaithi",83886282},{"AnatolianHieroglyphs",83886303},{"CJK_Compatibility",83886194}, {"TaiViet",83886218},{"multani",83886289},{"TaiLe",83886131},{"cherokeesup",83886222},{"SupPUAB",83886342}, {"Enclosed_CJK",83886193},{"Tagalog",83886123},{"Arabic_Supplement",83886095},{"Miao",83886308}, {"Cuneiform_Numbers_And_Punctuation",83886300},{"devanagariextended",83886210},{"Arabic_Sup",83886095}, {"AlphabeticPresentationForms",83886231},{"Supplemental_Punctuation",83886180},{"warangciti",83886297}, {"Combining_Half_Marks",83886235},{"Miscellaneous_Symbols_And_Arrows",83886172},{"CJKExtE",83886337}, {"ethiopicexta",83886220},{"halfwidthandfullwidthforms",83886239},{"katakanaphoneticextensions",83886192}, {"supplementaryprivateuseareab",83886342},{"sundanese",83886138},{"Enclosed_Alphanumerics",83886160}, {"misctechnical",83886157},{"Mathematical_Operators",83886156},{"Cyrillic_Sup",83886090},{"Old_South_Arabian",83886271}, {"phaistos",83886246},{"CurrencySymbols",83886151},{"lineara",83886260},{"Cuneiform",83886299},{"ArabicPFB",83886238}, {"HangulJamo",83886116},{"Rumi_Numeral_Symbols",83886280},{"IndicNumberForms",83886207}, {"Cyrillic_Supplementary",83886090},{"Jamo_Ext_B",83886225},{"Modi",83886294},{"Kharoshthi",83886270}, {"MiscPictographs",83886326},{"CJK_Unified_Ideographs",83886197},{"byzantinemusic",83886312}, {"Optical_Character_Recognition",83886159},{"malayalam",83886109},{"GreekExt",83886148},{"oriya",83886105}, {"Math_Alphanum",83886317},{"Domino",83886322},{"tagalog",83886123},{"Brahmi",83886281},{"arabicpfa",83886232}, {"AncientSymbols",83886245},{"NB",83886080},{"High_PU_Surrogates",83886227},{"PhaistosDisc",83886246}, {"Byzantine_Music",83886312},{"HighSurrogates",83886226},{"hanguljamoextendeda",83886213},{"ancientsymbols",83886245}, {"Devanagari_Ext",83886210},{"LatinExtendedB",83886084},{"canadiansyllabics",83886120},{"ucas",83886120}, {"vai",83886201},{"Lao",83886112},{"highsurrogates",83886226},{"ascii",83886081},{"generalpunctuation",83886149}, {"Early_Dynastic_Cuneiform",83886301},{"geometricshapesext",83886331},{"HighPrivateUseSurrogates",83886227}, {"Manichaean",83886273},{"rejang",83886212},{"Old_Persian",83886254},{"MendeKikakui",83886319},{"Punctuation",83886149}, {"cjkexte",83886337},{"MiscSymbols",83886164},{"Devanagari_Extended",83886210},{"Grantha",83886291}, {"enclosedalphanumerics",83886160},{"cjkcompatideographssup",83886338},{"CJKCompatibilityIdeographs",83886230}, {"UCAS",83886120},{"Sundanese_Sup",83886142},{"LatinExtendedA",83886083},{"Tai_Xuan_Jing",83886315}, {"suparrowsb",83886169},{"latinextendede",83886221},{"New_Tai_Lue",83886132},{"Linear_B_Ideograms",83886242}, {"Georgian_Supplement",83886176},{"Half_And_Full_Forms",83886239},{"Sundanese",83886138},{"Misc_Technical",83886157}, {"cyrillic",83886089},{"NewTaiLue",83886132},{"Phags_Pa",83886208},{"Ancient_Greek_Musical_Notation",83886314}, {"cyrillicexta",83886179},{"balinese",83886137},{"Inscriptional_Parthian",83886275}, {"MiscellaneousMathematicalSymbolsB",83886170},{"OldHungarian",83886279},{"Myanmar_Extended_A",83886217}, {"Latin1",83886082},{"cjksymbolsandpunctuation",83886184},{"domino",83886322},{"CypriotSyllabary",83886261}, {"Ethiopic_Sup",83886118},{"vedicext",83886143},{"Enclosed_Ideographic_Supplement",83886325}, {"EgyptianHieroglyphs",83886302},{"VS_Sup",83886340},{"MahjongTiles",83886321},{"myanmarextendeda",83886217}, {"Hatran",83886265},{"Supplementary_Private_Use_Area_B",83886342},{"countingrod",83886316}, {"Old_North_Arabian",83886272},{"EthiopicExtended",83886178},{"Enclosed_Alphanum",83886160},{"georgian",83886115}, {"takri",83886295},{"ArabicPFA",83886232},{"idc",83886183},{"ipaext",83886085},{"Private_Use_Area",83886229}, {"Glagolitic",83886173},{"Vertical_Forms",83886234},{"Sup_Arrows_C",83886332},{"Supplemental_Arrows_A",83886167}, {"sinhala",83886110},{"Domino_Tiles",83886322},{"EthiopicSupplement",83886118}, {"Miscellaneous_Symbols_And_Pictographs",83886326},{"linearbsyllabary",83886241},{"CJK_Ext_B",83886334}, {"CompatJamo",83886188},{"ModifierToneLetters",83886204},{"Mro",83886305},{"miscsymbols",83886164},{"kayahli",83886211}, {"CJK_Compatibility_Ideographs_Supplement",83886338},{"Greek",83886088},{"Siddham",83886293},{"Mahjong_Tiles",83886321}, {"Small_Forms",83886237},{"nb",83886080},{"CJK_Compatibility_Forms",83886236},{"hebrew",83886092}, {"basiclatin",83886081},{"Byzantine_Musical_Symbols",83886312},{"EnclosedAlphanumericSupplement",83886324}, {"Modifier_Letters",83886086},{"miscellaneoussymbolsandarrows",83886172},{"enclosedalphanum",83886160}, {"Georgian",83886115},{"OldTurkic",83886278},{"Hangul_Jamo_Extended_B",83886225},{"myanmar",83886114}, {"Mende_Kikakui",83886319},{"GeometricShapesExtended",83886331},{"greek",83886088},{"OldItalic",83886250}, {"SmallFormVariants",83886237},{"Mahajani",83886285},{"highprivateusesurrogates",83886227}, {"combiningdiacriticalmarksextended",83886136},{"Phaistos",83886246},{"hanguljamo",83886116},{"mongolian",83886128}, {"latinextendedadditional",83886147},{"ArabicPresentationFormsB",83886238},{"kanbun",83886189},{"suparrowsc",83886332}, {"LatinExtendedAdditional",83886147},{"kaithi",83886282},{"combiningdiacriticalmarksforsymbols",83886152}, {"ModifierLetters",83886086},{"sundanesesup",83886142},{"Kangxi_Radicals",83886182},{"indicnumberforms",83886207}, {"GeometricShapesExt",83886331},{"Khmer",83886127},{"aegeannumbers",83886243},{"tags",83886339}, {"Enclosed_Ideographic_Sup",83886325},{"lydian",83886267},{"chakma",83886284},{"Ethiopic_Extended_A",83886220}, {"hanguljamoextendedb",83886225},{"Myanmar_Ext_A",83886217},{"oldhungarian",83886279}, {"MathematicalAlphanumericSymbols",83886317},{"Balinese",83886137},{"Arrows",83886155},{"WarangCiti",83886297}, {"miscarrows",83886172},{"Combining_Diacritical_Marks_Extended",83886136},{"Phonetic_Ext_Sup",83886145}, {"yisyllables",83886198},{"cyrillicextb",83886202},{"CJK_Compat_Ideographs",83886230},{"devanagariext",83886210}, {"latinextc",83886174},{"Greek_Extended",83886148},{"Specials",83886240},{"Tai_Le",83886131}, {"Cypriot_Syllabary",83886261},{"Meetei_Mayek_Extensions",83886219},{"CuneiformNumbers",83886300},{"Elbasan",83886258}, {"paucinhau",83886298},{"earlydynasticcuneiform",83886301},{"OlChiki",83886141},{"MyanmarExtA",83886217}, {"playingcards",83886323},{"CJKStrokes",83886191},{"suppunctuation",83886180},{"Compat_Jamo",83886188}, {"greekandcoptic",83886088},{"Latin_Ext_Additional",83886147},{"PhagsPa",83886208},{"ArabicMath",83886320}, {"Yi_Radicals",83886199},{"CJKCompatIdeographsSup",83886338},{"bopomofo",83886187},{"Gujarati",83886104}, {"kangxi",83886182},{"TransportAndMap",83886329},{"telugu",83886107},{"BlockElements",83886162},{"cjk",83886197}, {"yiradicals",83886199},{"Arabic_Math",83886320},{"Hangul",83886224},{"SupMathOperators",83886171}, {"Sup_Arrows_B",83886169},{"miao",83886308},{"Latin1Supplement",83886082},{"countingrodnumerals",83886316}, {"Rumi",83886280},{"Ornamental_Dingbats",83886328},{"khojki",83886288},{"cjkradicalssupplement",83886181}, {"CJK_Ext_C",83886335},{"Tibetan",83886113},{"inscriptionalpahlavi",83886276},{"LatinExtC",83886174},{"Ahom",83886296}, {"DevanagariExtended",83886210},{"grantha",83886291},{"KayahLi",83886211},{"Egyptian_Hieroglyphs",83886302}, {"Oriya",83886105},{"BoxDrawing",83886161},{"olditalic",83886250},{"ArabicSup",83886095},{"Bidi_C",536870913}, {"odi",1207959553},{"Other_Default_Ignorable_Code_Point",1207959553},{"otherdefaultignorablecodepoint",1207959553}, {"OtherDefaultIgnorableCodePoint",1207959553},{"HebrewLetter",268435459},{"le",268435467},{"xx",268435456}, {"SingleQuote",268435458},{"nu",268435471},{"cr",268435460},{"Numeric",268435471},{"extendnumlet",268435472}, {"Hebrew_Letter",268435459},{"EX",268435472},{"extend",268435463},{"ml",268435468},{"MN",268435469},{"DQ",268435457}, {"regionalindicator",268435464},{"midnumlet",268435470},{"katakana",268435466},{"LF",268435461}, {"DoubleQuote",268435457},{"ri",268435464},{"hebrewletter",268435459},{"XX",268435456},{"ka",268435466},{"sq",268435458}, {"ALetter",268435467},{"Extend",268435463},{"LE",268435467},{"numeric",268435471},{"lf",268435461},{"ML",268435468}, {"SQ",268435458},{"NL",268435462},{"CR",268435460},{"Format",268435465},{"fo",268435465},{"RegionalIndicator",268435464}, {"Single_Quote",268435458},{"ExtendNumLet",268435472},{"newline",268435462},{"Newline",268435462},{"MB",268435470}, {"MidLetter",268435468},{"other",268435456},{"NU",268435471},{"midnum",268435469},{"dq",268435457}, {"doublequote",268435457},{"RI",268435464},{"Katakana",268435466},{"hl",268435459},{"Double_Quote",268435457}, {"Other",268435456},{"MidNum",268435469},{"HL",268435459},{"singlequote",268435458},{"aletter",268435467}, {"midletter",268435468},{"ex",268435472},{"mb",268435470},{"nl",268435462},{"KA",268435466},{"FO",268435465}, {"mn",268435469},{"Regional_Indicator",268435464},{"format",268435465},{"MidNumLet",268435470}, {"bidimirrored",553648129},{"bidim",553648129},{"BidiMirrored",553648129},{"Bidi_Mirrored",553648129}, {"olower",1275068417},{"OtherLowercase",1275068417},{"Other_Lowercase",1275068417},{"otherlowercase",1275068417}, {"XID_Continue",1543503873},{"xidcontinue",1543503873},{"XIDContinue",1543503873},{"xidc",1543503873}, {"Math",1107296257},{"BidiControl",536870913},{"bidic",536870913},{"Bidi_Control",536870913},{"bidicontrol",536870913}, {"Extender",805306369},{"extender",805306369},{"ext",805306369},{"Changes_When_Casemapped",654311425},{"cwcm",654311425}, {"changeswhencasemapped",654311425},{"ChangesWhenCasemapped",654311425},{"Comp_Ex",822083585},{"GraphemeLink",872415233}, {"Grapheme_Link",872415233},{"grlink",872415233},{"graphemelink",872415233},{"CWU",721420289},{"PatWS",1358954497}, {"NFD_QC",1140850689},{"CI",603979777},{"Soft_Dotted",1442840577},{"softdotted",1442840577},{"SoftDotted",1442840577}, {"sd",1442840577},{"ChangesWhenLowercased",671088641},{"Changes_When_Lowercased",671088641}, {"changeswhenlowercased",671088641},{"cwl",671088641},{"dash",738197505},{"Dash",738197505},{"Hex_Digit",889192449}, {"HexDigit",889192449},{"hexdigit",889192449},{"hex",889192449},{"graphemebase",838860801},{"Grapheme_Base",838860801}, {"grbase",838860801},{"GraphemeBase",838860801},{"Ideo",989855745},{"IDSBinaryOperator",922746881}, {"idsbinaryoperator",922746881},{"IDS_Binary_Operator",922746881},{"idsb",922746881},{"OGr_Ext",1224736769}, {"S",251658248},{"rlo",251658255},{"PopDirectionalFormat",251658258},{"LRO",251658254},{"BoundaryNeutral",251658251}, {"lefttoright",251658240},{"rle",251658257},{"FSI",251658261},{"LeftToRightOverride",251658254},{"on",251658250}, {"BN",251658251},{"RLE",251658257},{"LeftToRight",251658240},{"Pop_Directional_Format",251658258},{"PDI",251658262}, {"lri",251658259},{"LeftToRightIsolate",251658259},{"firststrongisolate",251658261},{"LRE",251658256}, {"Left_To_Right_Isolate",251658259},{"lro",251658254},{"al",251658253},{"PDF",251658258}, {"RightToLeftOverride",251658255},{"commonseparator",251658246},{"WS",251658249},{"otherneutral",251658250}, {"b",251658247},{"nsm",251658252},{"cs",251658246},{"popdirectionalformat",251658258},{"ES",251658243}, {"RightToLeftIsolate",251658260},{"EN",251658242},{"ParagraphSeparator",251658247},{"righttoleftisolate",251658260}, {"AL",251658253},{"NonspacingMark",251658252},{"LRI",251658259},{"Pop_Directional_Isolate",251658262}, {"Right_To_Left_Override",251658255},{"rli",251658260},{"europeanterminator",251658244},{"L",251658240}, {"WhiteSpace",251658249},{"righttoleftembedding",251658257},{"ON",251658250},{"EuropeanSeparator",251658243}, {"europeanseparator",251658243},{"Left_To_Right_Embedding",251658256},{"europeannumber",251658242}, {"ArabicLetter",251658253},{"RightToLeft",251658241},{"AN",251658245},{"lefttorightisolate",251658259}, {"Common_Separator",251658246},{"Right_To_Left_Isolate",251658260},{"Nonspacing_Mark",251658252}, {"LeftToRightEmbedding",251658256},{"an",251658245},{"PopDirectionalIsolate",251658262},{"European_Number",251658242}, {"ET",251658244},{"whitespace",251658249},{"RightToLeftEmbedding",251658257},{"righttoleft",251658241}, {"Paragraph_Separator",251658247},{"Left_To_Right",251658240},{"pdi",251658262},{"OtherNeutral",251658250}, {"es",251658243},{"popdirectionalisolate",251658262},{"White_Space",251658249},{"RLO",251658255}, {"lefttorightembedding",251658256},{"European_Separator",251658243},{"Left_To_Right_Override",251658254}, {"et",251658244},{"European_Terminator",251658244},{"Other_Neutral",251658250},{"pdf",251658258},{"s",251658248}, {"Right_To_Left",251658241},{"B",251658247},{"arabicletter",251658253},{"en",251658242},{"paragraphseparator",251658247}, {"EuropeanNumber",251658242},{"arabicnumber",251658245},{"EuropeanTerminator",251658244},{"CommonSeparator",251658246}, {"nonspacingmark",251658252},{"r",251658241},{"Segment_Separator",251658248},{"Arabic_Number",251658245}, {"Right_To_Left_Embedding",251658257},{"FirstStrongIsolate",251658261},{"ws",251658249},{"boundaryneutral",251658251}, {"fsi",251658261},{"segmentseparator",251658248},{"bn",251658251},{"First_Strong_Isolate",251658261}, {"righttoleftoverride",251658255},{"NSM",251658252},{"ArabicNumber",251658245},{"SegmentSeparator",251658248}, {"lefttorightoverride",251658254},{"Arabic_Letter",251658253},{"RLI",251658260},{"CS",251658246},{"l",251658240}, {"lre",251658256},{"R",251658241},{"Boundary_Neutral",251658251},{"noncharactercodepoint",1174405121}, {"Noncharacter_Code_Point",1174405121},{"NoncharacterCodePoint",1174405121},{"nchar",1174405121},{"Dash",738197505}, {"sterm",1426063361},{"STerm",1426063361},{"NFKDQuickCheck",1157627905},{"NFKD_Quick_Check",1157627905}, {"nfkdqc",1157627905},{"nfkdquickcheck",1157627905},{"NFKD_QC",1157627905},{"OtherIDStart",1258291201}, {"otheridstart",1258291201},{"oids",1258291201},{"Other_ID_Start",1258291201},{"joincontrol",1006632961}, {"Join_Control",1006632961},{"JoinControl",1006632961},{"joinc",1006632961},{"idcontinue",956301313},{"idc",956301313}, {"ID_Continue",956301313},{"IDContinue",956301313},{"graphemeextend",855638017},{"grext",855638017}, {"GraphemeExtend",855638017},{"Grapheme_Extend",855638017},{"OtherMath",1291845633},{"othermath",1291845633}, {"omath",1291845633},{"Other_Math",1291845633},{"sp",385875974},{"SC",385875982},{"sc",385875982},{"ATerm",385875979}, {"le",385875977},{"AT",385875979},{"CR",385875969},{"xx",385875968},{"Sp",385875974},{"nu",385875978}, {"Format",385875973},{"fo",385875973},{"aterm",385875979},{"cr",385875969},{"Lower",385875975},{"lo",385875975}, {"Numeric",385875978},{"OLetter",385875977},{"Upper",385875976},{"SE",385875972},{"EX",385875971},{"extend",385875971}, {"st",385875980},{"other",385875968},{"NU",385875978},{"lower",385875975},{"SP",385875974},{"LF",385875970}, {"ST",385875980},{"cl",385875981},{"STerm",385875980},{"up",385875976},{"scontinue",385875982},{"Other",385875968}, {"close",385875981},{"oletter",385875977},{"UP",385875976},{"XX",385875968},{"at",385875979},{"Sep",385875972}, {"upper",385875976},{"LO",385875975},{"sterm",385875980},{"ex",385875971},{"FO",385875973},{"sep",385875972}, {"se",385875972},{"SContinue",385875982},{"Extend",385875971},{"format",385875973},{"LE",385875977},{"Close",385875981}, {"numeric",385875978},{"lf",385875970},{"CL",385875981},{"Hex",889192449},{"othergraphemeextend",1224736769}, {"Other_Grapheme_Extend",1224736769},{"ogrext",1224736769},{"OtherGraphemeExtend",1224736769},{"swashkaf",184549398}, {"Seen",184549385},{"Straight_Waw",184549434},{"RohingyaYeh",184549433},{"Beth",184549406},{"Semkath",184549420}, {"Manichaean_Gimel",184549437},{"ManichaeanTen",184549459},{"hah",184549382},{"Syriac_Waw",184549410}, {"Manichaean_Yodh",184549443},{"manichaeanlamedh",184549445},{"Kaf",184549393},{"fe",184549431}, {"ManichaeanLamedh",184549445},{"manichaeanten",184549459},{"manichaeanmem",184549448},{"manichaeanwaw",184549439}, {"lamadh",184549417},{"e",184549422},{"Yeh_Barree",184549404},{"nya",184549399},{"Nun",184549419},{"lam",184549394}, {"syriacwaw",184549410},{"Manichaean_Ten",184549459},{"Manichaean_Mem",184549448},{"Manichaean_Sadhe",184549453}, {"ain",184549388},{"KnottedHeh",184549400},{"heh",184549397},{"qaph",184549426},{"Heth",184549412},{"teth",184549413}, {"dalathrish",184549408},{"Yudh_He",184549415},{"noon",184549396},{"mim",184549418},{"ManichaeanHeth",184549441}, {"Heh_Goal",184549401},{"manichaeandhamedh",184549446},{"ManichaeanSamekh",184549450},{"khaph",184549430}, {"Manichaean_Pe",184549452},{"Manichaean_Waw",184549439},{"straightwaw",184549434},{"Sad",184549386},{"Nya",184549399}, {"qaf",184549392},{"NoJoiningGroup",184549376},{"kaph",184549416},{"Ain",184549388},{"Rohingya_Yeh",184549433}, {"Farsi_Yeh",184549390},{"Manichaean_Aleph",184549435},{"reversedpe",184549424},{"Manichaean_Qoph",184549454}, {"yudhhe",184549415},{"ManichaeanResh",184549455},{"kaf",184549393},{"ManichaeanZayin",184549440},{"farsiyeh",184549390}, {"Knotted_Heh",184549400},{"yeh",184549377},{"beth",184549406},{"Qaph",184549426},{"Reversed_Pe",184549424}, {"hamzaonhehgoal",184549402},{"Shin",184549427},{"seen",184549385},{"Manichaean_Hundred",184549461}, {"Manichaean_Resh",184549455},{"Manichaean_One",184549457},{"Manichaean_Kaph",184549444},{"manichaeanhundred",184549461}, {"He",184549409},{"nojoininggroup",184549376},{"Manichaean_Zayin",184549440},{"manichaeansamekh",184549450}, {"BurushaskiYehBarree",184549432},{"Alaph",184549405},{"SwashKaf",184549398},{"shin",184549427},{"reh",184549384}, {"manichaeanbeth",184549436},{"YudhHe",184549415},{"ManichaeanFive",184549458},{"ManichaeanOne",184549457}, {"ManichaeanDaleth",184549438},{"No_Joining_Group",184549376},{"ManichaeanSadhe",184549453},{"feh",184549391}, {"TehMarbutaGoal",184549402},{"manichaeanfive",184549458},{"ManichaeanDhamedh",184549446},{"Hah",184549382}, {"Yeh",184549377},{"ReversedPe",184549424},{"HamzaOnHehGoal",184549402},{"Hamza_On_Heh_Goal",184549402}, {"ManichaeanTeth",184549442},{"ManichaeanMem",184549448},{"alef",184549378},{"rohingyayeh",184549433}, {"Manichaean_Taw",184549456},{"Mim",184549418},{"alaph",184549405},{"TehMarbuta",184549381},{"Reh",184549384}, {"manichaeanresh",184549455},{"Fe",184549431},{"ManichaeanTaw",184549456},{"sadhe",184549425},{"Taw",184549428}, {"semkath",184549420},{"E",184549422},{"Gamal",184549407},{"manichaeanayin",184549451},{"Lamadh",184549417}, {"ManichaeanWaw",184549439},{"Noon",184549396},{"manichaeannun",184549449},{"hehgoal",184549401}, {"manichaeanpe",184549452},{"manichaeangimel",184549437},{"Manichaean_Lamedh",184549445},{"Meem",184549395}, {"Yeh_With_Tail",184549403},{"tehmarbutagoal",184549402},{"manichaeantwenty",184549460},{"Teh_Marbuta_Goal",184549402}, {"Dal",184549383},{"meem",184549395},{"Kaph",184549416},{"Manichaean_Twenty",184549460}, {"burushaskiyehbarree",184549432},{"tehmarbuta",184549381},{"Manichaean_Heth",184549441}, {"Burushaski_Yeh_Barree",184549432},{"SyriacWaw",184549410},{"Manichaean_Dhamedh",184549446},{"beh",184549380}, {"ManichaeanNun",184549449},{"Manichaean_Teth",184549442},{"Sadhe",184549425},{"Heh",184549397}, {"manichaeanone",184549457},{"ManichaeanQoph",184549454},{"Feh",184549391},{"Manichaean_Nun",184549449}, {"HehGoal",184549401},{"FarsiYeh",184549390},{"knottedheh",184549400},{"YehWithTail",184549403}, {"Manichaean_Daleth",184549438},{"Manichaean_Samekh",184549450},{"Qaf",184549392},{"pe",184549423}, {"DalathRish",184549408},{"FinalSemkath",184549421},{"ManichaeanHundred",184549461},{"manichaeanteth",184549442}, {"Swash_Kaf",184549398},{"Lam",184549394},{"ManichaeanBeth",184549436},{"ManichaeanPe",184549452},{"Beh",184549380}, {"Zhain",184549429},{"YehBarree",184549404},{"Pe",184549423},{"Teth",184549413},{"ManichaeanGimel",184549437}, {"taw",184549428},{"gamal",184549407},{"manichaeankaph",184549444},{"manichaeanqoph",184549454}, {"Teh_Marbuta",184549381},{"zhain",184549429},{"sad",184549386},{"Manichaean_Ayin",184549451}, {"manichaeandaleth",184549438},{"Waw",184549379},{"manichaeanheth",184549441},{"waw",184549379}, {"manichaeansadhe",184549453},{"ManichaeanTwenty",184549460},{"manichaeanaleph",184549435}, {"ManichaeanThamedh",184549447},{"Yudh",184549414},{"Alef",184549378},{"manichaeanyodh",184549443}, {"Manichaean_Thamedh",184549447},{"zain",184549411},{"yehwithtail",184549403},{"ManichaeanYodh",184549443}, {"Dalath_Rish",184549408},{"yudh",184549414},{"manichaeanzayin",184549440},{"ManichaeanAleph",184549435}, {"gaf",184549389},{"Manichaean_Beth",184549436},{"heth",184549412},{"yehbarree",184549404},{"Tah",184549387}, {"ManichaeanAyin",184549451},{"he",184549409},{"Final_Semkath",184549421},{"StraightWaw",184549434},{"Khaph",184549430}, {"finalsemkath",184549421},{"manichaeantaw",184549456},{"Zain",184549411},{"nun",184549419}, {"Manichaean_Five",184549458},{"dal",184549383},{"ManichaeanKaph",184549444},{"manichaeanthamedh",184549447}, {"tah",184549387},{"Gaf",184549389},{"NFDQC",1140850689},{"CompEx",822083585},{"NFKCQuickCheck",452984833}, {"NFKC_Quick_Check",452984833},{"nfkcquickcheck",452984833},{"nfkcqc",452984833},{"Pat_Syn",1342177281}, {"OtherAlphabetic",1191182337},{"Other_Alphabetic",1191182337},{"otheralphabetic",1191182337},{"oalpha",1191182337}, {"CWL",671088641},{"OUpper",1308622849},{"sp",352321543},{"JL",352321547},{"carriagereturn",352321537},{"GL",352321541}, {"contingentbreak",352321542},{"NL",352321545},{"Line_Feed",352321538},{"CB",352321542},{"gl",352321541}, {"Surrogate",352321540},{"CR",352321537},{"cb",352321542},{"MandatoryBreak",352321536},{"Space",352321543}, {"cr",352321537},{"ZW",352321544},{"sg",352321540},{"jl",352321547},{"ZWSpace",352321544},{"H3",352321551}, {"Carriage_Return",352321537},{"NextLine",352321545},{"glue",352321541},{"Mandatory_Break",352321536}, {"Word_Joiner",352321546},{"H2",352321550},{"Glue",352321541},{"wordjoiner",352321546},{"bk",352321536}, {"combiningmark",352321539},{"SP",352321543},{"linefeed",352321538},{"LF",352321538},{"CombiningMark",352321539}, {"surrogate",352321540},{"Combining_Mark",352321539},{"mandatorybreak",352321536},{"JV",352321548}, {"LineFeed",352321538},{"WJ",352321546},{"CarriageReturn",352321537},{"wj",352321546},{"zw",352321544}, {"WordJoiner",352321546},{"Contingent_Break",352321542},{"jt",352321549},{"Next_Line",352321545}, {"ContingentBreak",352321542},{"BK",352321536},{"CM",352321539},{"space",352321543},{"cm",352321539}, {"zwspace",352321544},{"SG",352321540},{"nl",352321545},{"h2",352321550},{"nextline",352321545},{"JT",352321549}, {"lf",352321538},{"h3",352321551},{"jv",352321548},{"GrBase",838860801},{"WSpace",1526726657},{"lower",1073741825}, {"lowercase",1073741825},{"Lowercase",1073741825},{"XIDC",1543503873},{"idstrinaryoperator",939524097}, {"IDSTrinaryOperator",939524097},{"idst",939524097},{"IDS_Trinary_Operator",939524097},{"Alpha",486539265}, {"Radical",1392508929},{"radical",1392508929},{"whitespace",1526726657},{"wspace",1526726657},{"WhiteSpace",1526726657}, {"White_Space",1526726657},{"DefaultIgnorableCodePoint",754974721},{"di",754974721}, {"defaultignorablecodepoint",754974721},{"Default_Ignorable_Code_Point",754974721},{"none",436207616},{"None",436207616}, {"Decimal",436207619},{"De",436207619},{"nu",436207617},{"de",436207619},{"numeric",436207617},{"Numeric",436207617}, {"decimal",436207619},{"Nu",436207617},{"PatSyn",1342177281},{"alpha",486539265},{"alphabetic",486539265}, {"Alphabetic",486539265},{"IDSB",922746881},{"oupper",1308622849},{"Other_Uppercase",1308622849}, {"otheruppercase",1308622849},{"OtherUppercase",1308622849},{"NChar",1174405121},{"Math",1107296257},{"math",1107296257}, {"UIdeo",1476395009},{"Hyphen",905969665},{"Quotation_Mark",1375731713},{"QuotationMark",1375731713}, {"quotationmark",1375731713},{"qmark",1375731713},{"CWCM",654311425},{"Dia",788529153},{"Ideographic",989855745}, {"ideo",989855745},{"ideographic",989855745},{"NFC_QC",469762049},{"maybe",469762050},{"M",469762050}, {"Maybe",469762050},{"m",469762050},{"T",419430403},{"LVT",419430405},{"Vowel_Jamo",419430402},{"lv",419430404}, {"LV",419430404},{"V",419430402},{"trailingjamo",419430403},{"lvtsyllable",419430405},{"lvt",419430405}, {"notapplicable",419430400},{"Not_Applicable",419430400},{"Leading_Jamo",419430401},{"voweljamo",419430402}, {"LVTSyllable",419430405},{"L",419430401},{"LV_Syllable",419430404},{"t",419430403},{"NA",419430400}, {"TrailingJamo",419430403},{"LVT_Syllable",419430405},{"leadingjamo",419430401},{"v",419430402},{"VowelJamo",419430402}, {"LeadingJamo",419430401},{"Trailing_Jamo",419430403},{"l",419430401},{"lvsyllable",419430404}, {"NotApplicable",419430400},{"LVSyllable",419430404},{"na",419430400},{"GrExt",855638017},{"hyphen",905969665}, {"Hyphen",905969665},{"changeswhennfkccasefolded",687865857},{"ChangesWhenNFKCCasefolded",687865857}, {"Changes_When_NFKC_Casefolded",687865857},{"cwkcf",687865857},{"S",1409286145},{"terminalpunctuation",1459617793}, {"BidiMirrored",553648129},{"Changes_When_Casemapped",654311425},{"IDS_Binary_Operator",922746881}, {"ChangesWhenUppercased",721420289},{"IDS_Trinary_Operator",939524097},{"IDContinue",956301313},{"Lowercase",1073741825}, {"changeswhencasemapped",654311425},{"TerminalPunctuation",1459617793},{"softdotted",1442840577},{"Diacritic",788529153}, {"idstart",973078529},{"LC",1040187393},{"ChangesWhenTitlecased",704643073},{"JoinControl",1006632961}, {"otherlowercase",1275068417},{"deprecated",771751937},{"ChangesWhenLowercased",671088641},{"NFKDQC",1157627905}, {"Hex_Digit",889192449},{"Radical",1392508929},{"ChangesWhenCasemapped",654311425},{"IDSBinaryOperator",922746881}, {"idstrinaryoperator",939524097},{"xidstart",1560281089},{"cased",620756993},{"STerm",1426063361}, {"lowercase",1073741825},{"GraphemeBase",838860801},{"FullCompositionExclusion",822083585}, {"DefaultIgnorableCodePoint",754974721},{"M",1090519041},{"C",570425345},{"othergraphemeextend",1224736769}, {"changeswhennfkccasefolded",687865857},{"OtherLowercase",1275068417},{"caseignorable",603979777}, {"graphemelink",872415233},{"nfdqc",1140850689},{"XIDContinue",1543503873},{"bidimirrored",553648129}, {"ChangesWhenCasefolded",637534209},{"VariationSelector",1509949441},{"Bidi_Control",536870913},{"N",1124073473}, {"UnifiedIdeograph",1476395009},{"Other_Math",1291845633},{"Grapheme_Extend",855638017},{"White_Space",1526726657}, {"Math",1107296257},{"Z",1577058305},{"idcontinue",956301313},{"Unified_Ideograph",1476395009}, {"Variation_Selector",1509949441},{"Other_Uppercase",1308622849},{"Extender",805306369},{"s",1409286145}, {"Soft_Dotted",1442840577},{"NFD_QC",1140850689},{"Grapheme_Base",838860801},{"c",570425345}, {"ASCII_Hex_Digit",335544321},{"alphabetic",486539265},{"Changes_When_Casefolded",637534209},{"hexdigit",889192449}, {"dash",738197505},{"changeswhenlowercased",671088641},{"OtherMath",1291845633},{"CaseFoldingsimple",587202561}, {"Other_Default_Ignorable_Code_Point",1207959553},{"xidcontinue",1543503873},{"quotationmark",1375731713}, {"Dash",738197505},{"Ideographic",989855745},{"Uppercase",1493172225},{"OtherIDStart",1258291201}, {"otheridstart",1258291201},{"nfkdqc",1157627905},{"sterm",1426063361},{"NFKD_QC",1157627905},{"m",1090519041}, {"Terminal_Punctuation",1459617793},{"Full_Composition_Exclusion",822083585},{"Changes_When_Uppercased",721420289}, {"QuotationMark",1375731713},{"Grapheme_Link",872415233},{"lc",1040187393},{"Alphabetic",486539265}, {"Changes_When_Lowercased",671088641},{"NFDQC",1140850689},{"extender",805306369},{"Deprecated",771751937}, {"patternsyntax",1342177281},{"patternwhitespace",1358954497},{"HexDigit",889192449},{"changeswhentitlecased",704643073}, {"OtherIDContinue",1241513985},{"logicalorderexception",1056964609},{"Other_Alphabetic",1191182337}, {"ID_Start",973078529},{"Quotation_Mark",1375731713},{"Case_Ignorable",603979777},{"changeswhenuppercased",721420289}, {"assigned",520093697},{"z",1577058305},{"radical",1392508929},{"OtherDefaultIgnorableCodePoint",1207959553}, {"OtherGraphemeExtend",1224736769},{"Changes_When_Titlecased",704643073},{"Logical_Order_Exception",1056964609}, {"unifiedideograph",1476395009},{"ChangesWhenNFKCCasefolded",687865857},{"L",1023410177},{"WhiteSpace",1526726657}, {"XIDStart",1560281089},{"math",1107296257},{"P",1325400065},{"any",503316481},{"ID_Continue",956301313}, {"casefoldingsimple",587202561},{"Other_Grapheme_Extend",1224736769},{"Hyphen",905969665}, {"noncharactercodepoint",1174405121},{"graphemebase",838860801},{"SoftDotted",1442840577},{"IDStart",973078529}, {"fullcompositionexclusion",822083585},{"ideographic",989855745},{"hyphen",905969665},{"IDSTrinaryOperator",939524097}, {"XID_Continue",1543503873},{"whitespace",1526726657},{"XID_Start",1560281089},{"Other_Lowercase",1275068417}, {"Other_ID_Start",1258291201},{"OtherUppercase",1308622849},{"Pattern_Syntax",1342177281},{"ASCIIHexDigit",335544321}, {"idsbinaryoperator",922746881},{"asciihexdigit",335544321},{"Other_ID_Continue",1241513985}, {"otheruppercase",1308622849},{"PatternSyntax",1342177281},{"Pattern_White_Space",1358954497}, {"Noncharacter_Code_Point",1174405121},{"diacritic",788529153},{"bidicontrol",536870913}, {"Changes_When_NFKC_Casefolded",687865857},{"Bidi_Mirrored",553648129},{"OtherAlphabetic",1191182337}, {"Case_Folding_simple",587202561},{"otheralphabetic",1191182337},{"Cased",620756993}, {"NoncharacterCodePoint",1174405121},{"Any",503316481},{"BidiControl",536870913},{"joincontrol",1006632961}, {"graphemeextend",855638017},{"PatternWhiteSpace",1358954497},{"CaseIgnorable",603979777},{"otheridcontinue",1241513985}, {"uppercase",1493172225},{"GraphemeLink",872415233},{"defaultignorablecodepoint",754974721},{"Join_Control",1006632961}, {"LogicalOrderException",1056964609},{"Assigned",520093697},{"otherdefaultignorablecodepoint",1207959553}, {"variationselector",1509949441},{"n",1124073473},{"GraphemeExtend",855638017},{"l",1023410177},{"p",1325400065}, {"changeswhencasefolded",637534209},{"othermath",1291845633},{"Default_Ignorable_Code_Point",754974721}, {"Other_ID_Continue",1241513985},{"OtherIDContinue",1241513985},{"otheridcontinue",1241513985},{"oidc",1241513985}, {"Pat_WS",1358954497},{"SD",1442840577},{"Full_Composition_Exclusion",822083585},{"fullcompositionexclusion",822083585}, {"compex",822083585},{"FullCompositionExclusion",822083585},{"Upper",1493172225},{"CWCF",637534209},{"OIDC",1241513985}, {"IDST",939524097},{"Gr_Ext",855638017},{"VS",1509949441},{"Cased",620756993},{"Join_C",1006632961},{"CWT",704643073}, {"32",218103836},{"118",218103845},{"da",218103862},{"DoubleAbove",218103862},{"ccc32",218103836},{"18",218103822}, {"16",218103820},{"84",218103841},{"27",218103831},{"233",218103861},{"doublebelow",218103861},{"DoubleBelow",218103861}, {"br",218103855},{"ccc19",218103823},{"KV",218103812},{"AboveRight",218103860},{"IotaSubscript",218103863}, {"220",218103854},{"20",218103824},{"CCC13",218103817},{"CCC91",218103842},{"CCC11",218103815}, {"Attached_Above_Right",218103852},{"CCC103",218103843},{"CCC29",218103833},{"31",218103835},{"35",218103839}, {"11",218103815},{"Double_Below",218103861},{"CCC32",218103836},{"is",218103863},{"aboveright",218103860}, {"AttachedBelow",218103850},{"ccc21",218103825},{"CCC20",218103824},{"kanavoicing",218103812},{"29",218103833}, {"AttachedAboveRight",218103852},{"226",218103857},{"15",218103819},{"right",218103857},{"Below_Left",218103853}, {"CCC23",218103827},{"ccc132",218103849},{"kv",218103812},{"left",218103856},{"CCC36",218103840},{"CCC26",218103830}, {"a",218103859},{"129",218103847},{"belowleft",218103853},{"BelowLeft",218103853},{"ccc16",218103820},{"17",218103821}, {"ccc27",218103831},{"NR",218103809},{"ccc84",218103841},{"CCC22",218103826},{"DB",218103861},{"ATAR",218103852}, {"228",218103858},{"OV",218103810},{"virama",218103813},{"B",218103854},{"218",218103853},{"202",218103850}, {"14",218103818},{"CCC132",218103849},{"24",218103828},{"224",218103856},{"KanaVoicing",218103812},{"ccc25",218103829}, {"overlay",218103810},{"ccc36",218103840},{"Right",218103857},{"234",218103862},{"CCC31",218103835},{"ccc33",218103837}, {"0",218103809},{"Below",218103854},{"Above_Right",218103860},{"23",218103827},{"BelowRight",218103855}, {"ccc10",218103814},{"nk",218103811},{"CCC14",218103818},{"CCC25",218103829},{"ccc11",218103815},{"Overlay",218103810}, {"AR",218103860},{"attachedbelow",218103850},{"8",218103812},{"BR",218103855},{"CCC34",218103838}, {"iotasubscript",218103863},{"R",218103857},{"216",218103852},{"vr",218103813},{"doubleabove",218103862}, {"DA",218103862},{"ccc29",218103833},{"NK",218103811},{"ccc118",218103845},{"atb",218103850},{"33",218103837}, {"db",218103861},{"AboveLeft",218103858},{"21",218103825},{"ccc91",218103842},{"ccc107",218103844},{"7",218103811}, {"ccc31",218103835},{"26",218103830},{"CCC84",218103841},{"CCC21",218103825},{"CCC24",218103828}, {"AttachedAbove",218103851},{"ccc13",218103817},{"ccc122",218103846},{"nr",218103809},{"240",218103863},{"ov",218103810}, {"CCC130",218103848},{"belowright",218103855},{"230",218103859},{"al",218103858},{"ccc17",218103821},{"103",218103843}, {"b",218103854},{"232",218103860},{"BL",218103853},{"10",218103814},{"CCC28",218103832},{"CCC12",218103816}, {"Below_Right",218103855},{"AL",218103858},{"ccc15",218103819},{"91",218103842},{"CCC118",218103845},{"107",218103844}, {"Above_Left",218103858},{"CCC15",218103819},{"214",218103851},{"Virama",218103813},{"VR",218103813},{"L",218103856}, {"below",218103854},{"CCC17",218103821},{"Kana_Voicing",218103812},{"ccc30",218103834},{"Above",218103859}, {"Attached_Below",218103850},{"notreordered",218103809},{"12",218103816},{"attachedabove",218103851}, {"Not_Reordered",218103809},{"NotReordered",218103809},{"ATB",218103850},{"Iota_Subscript",218103863}, {"CCC18",218103822},{"19",218103823},{"ccc103",218103843},{"ccc23",218103827},{"ccc130",218103848},{"IS",218103863}, {"CCC16",218103820},{"ccc22",218103826},{"CCC122",218103846},{"CCC107",218103844},{"Attached_Above",218103851}, {"1",218103810},{"30",218103834},{"ccc18",218103822},{"222",218103855},{"CCC30",218103834},{"ccc12",218103816}, {"Nukta",218103811},{"nukta",218103811},{"25",218103829},{"28",218103832},{"ccc35",218103839},{"CCC27",218103831}, {"Double_Above",218103862},{"Left",218103856},{"attachedaboveright",218103852},{"ccc20",218103824},{"CCC129",218103847}, {"CCC10",218103814},{"130",218103848},{"r",218103857},{"122",218103846},{"ccc34",218103838},{"ccc129",218103847}, {"ATA",218103851},{"22",218103826},{"above",218103859},{"aboveleft",218103858},{"ccc24",218103828},{"13",218103817}, {"CCC33",218103837},{"A",218103859},{"ccc26",218103830},{"36",218103840},{"9",218103813},{"ar",218103860}, {"l",218103856},{"atar",218103852},{"ata",218103851},{"ccc28",218103832},{"34",218103838},{"ccc14",218103818}, {"132",218103849},{"CCC35",218103839},{"bl",218103853},{"CCC19",218103823},{"fra",301989905},{"Circle",301989897}, {"Enc",301989897},{"init",301989893},{"Font",301989891},{"nb",301989892},{"Final",301989895},{"wide",301989901}, {"Init",301989893},{"canonical",301989889},{"Vert",301989900},{"Can",301989889},{"med",301989894},{"final",301989895}, {"Narrow",301989902},{"Nb",301989892},{"Nar",301989902},{"Sub",301989899},{"Sqr",301989904},{"small",301989903}, {"none",301989888},{"Iso",301989896},{"Nobreak",301989892},{"enc",301989897},{"fraction",301989905},{"Com",301989890}, {"Canonical",301989889},{"super",301989898},{"nar",301989902},{"can",301989889},{"Sup",301989898},{"com",301989890}, {"isolated",301989896},{"narrow",301989902},{"sml",301989903},{"Medial",301989894},{"square",301989904}, {"font",301989891},{"medial",301989894},{"fin",301989895},{"Fraction",301989905},{"sup",301989898},{"Fin",301989895}, {"Compat",301989890},{"None",301989888},{"circle",301989897},{"Super",301989898},{"Initial",301989893}, {"Square",301989904},{"vertical",301989900},{"Sml",301989903},{"vert",301989900},{"Small",301989903},{"Med",301989894}, {"nobreak",301989892},{"iso",301989896},{"Wide",301989901},{"Isolated",301989896},{"Fra",301989905},{"compat",301989890}, {"sub",301989899},{"sqr",301989904},{"Vertical",301989900},{"initial",301989893},{"BidiC",536870913}, {"ChangesWhenCasefolded",637534209},{"changeswhencasefolded",637534209},{"Changes_When_Casefolded",637534209}, {"cwcf",637534209},{"Gr_Link",872415233},{"v41",234881032},{"V11",234881025},{"V60",234881036},{"v21",234881027}, {"v32",234881030},{"V21",234881027},{"unassigned",234881024},{"V63",234881039},{"V30",234881028},{"V2_0",234881026}, {"V6_2",234881038},{"NA",234881024},{"v70",234881040},{"V52",234881035},{"V6_0",234881036},{"V5_2",234881035}, {"V31",234881029},{"v80",234881041},{"V7_0",234881040},{"v11",234881025},{"V5_0",234881033},{"V2_1",234881027}, {"V40",234881031},{"V20",234881026},{"V8_0",234881041},{"v51",234881034},{"V1_1",234881025},{"v62",234881038}, {"V3_0",234881028},{"v50",234881033},{"V4_1",234881032},{"V3_2",234881030},{"v61",234881037},{"v20",234881026}, {"V3_1",234881029},{"V62",234881038},{"V61",234881037},{"v60",234881036},{"v63",234881039},{"V51",234881034}, {"V6_3",234881039},{"V6_1",234881037},{"V32",234881030},{"V70",234881040},{"V41",234881032},{"Unassigned",234881024}, {"v52",234881035},{"V4_0",234881031},{"V50",234881033},{"V5_1",234881034},{"v40",234881031},{"v31",234881029}, {"na",234881024},{"V80",234881041},{"v30",234881028},{"logicalorderexception",1056964609}, {"Logical_Order_Exception",1056964609},{"LogicalOrderException",1056964609},{"loe",1056964609}, {"TerminalPunctuation",1459617793},{"terminalpunctuation",1459617793},{"Terminal_Punctuation",1459617793}, {"term",1459617793},{"OGrExt",1224736769},{"deprecated",771751937},{"dep",771751937},{"Deprecated",771751937}, {"maybe",452984834},{"NFKC_QC",452984833},{"M",452984834},{"Maybe",452984834},{"m",452984834}, {"changeswhenuppercased",721420289},{"Changes_When_Uppercased",721420289},{"ChangesWhenUppercased",721420289}, {"cwu",721420289},{"r",117440514},{"Join_Causing",117440515},{"Non_Joining",117440512},{"nonjoining",117440512}, {"NonJoining",117440512},{"DualJoining",117440513},{"d",117440513},{"u",117440512},{"C",117440515}, {"Left_Joining",117440516},{"L",117440516},{"Dual_Joining",117440513},{"leftjoining",117440516}, {"Right_Joining",117440514},{"JoinCausing",117440515},{"RightJoining",117440514},{"dualjoining",117440513}, {"l",117440516},{"c",117440515},{"D",117440513},{"LeftJoining",117440516},{"R",117440514},{"rightjoining",117440514}, {"joincausing",117440515},{"U",117440512},{"uppercase",1493172225},{"Uppercase",1493172225},{"upper",1493172225}, {"Unified_Ideograph",1476395009},{"unifiedideograph",1476395009},{"uideo",1476395009},{"UnifiedIdeograph",1476395009}, {"IDC",956301313},{"NFCQC",469762049},{"OIDS",1258291201},{"Gr_Base",838860801},{"variationselector",1509949441}, {"VariationSelector",1509949441},{"Variation_Selector",1509949441},{"vs",1509949441},{"BidiM",553648129} }; static char *Decomp_Spec_enums[5722] = { "", "0020", "0020 0308", "0061", "0020 0304", "0032", "0033", "0020 0301", "03BC", "0020 0327", "0031", "006F", "0031 2044 0034", "0031 2044 0032", "0033 2044 0034", "0041 0300", "0041 0301", "0041 0302", "0041 0303", "0041 0308", "0041 030A", "0043 0327", "0045 0300", "0045 0301", "0045 0302", "0045 0308", "0049 0300", "0049 0301", "0049 0302", "0049 0308", "004E 0303", "004F 0300", "004F 0301", "004F 0302", "004F 0303", "004F 0308", "0055 0300", "0055 0301", "0055 0302", "0055 0308", "0059 0301", "0061 0300", "0061 0301", "0061 0302", "0061 0303", "0061 0308", "0061 030A", "0063 0327", "0065 0300", "0065 0301", "0065 0302", "0065 0308", "0069 0300", "0069 0301", "0069 0302", "0069 0308", "006E 0303", "006F 0300", "006F 0301", "006F 0302", "006F 0303", "006F 0308", "0075 0300", "0075 0301", "0075 0302", "0075 0308", "0079 0301", "0079 0308", "0041 0304", "0061 0304", "0041 0306", "0061 0306", "0041 0328", "0061 0328", "0043 0301", "0063 0301", "0043 0302", "0063 0302", "0043 0307", "0063 0307", "0043 030C", "0063 030C", "0044 030C", "0064 030C", "0045 0304", "0065 0304", "0045 0306", "0065 0306", "0045 0307", "0065 0307", "0045 0328", "0065 0328", "0045 030C", "0065 030C", "0047 0302", "0067 0302", "0047 0306", "0067 0306", "0047 0307", "0067 0307", "0047 0327", "0067 0327", "0048 0302", "0068 0302", "0049 0303", "0069 0303", "0049 0304", "0069 0304", "0049 0306", "0069 0306", "0049 0328", "0069 0328", "0049 0307", "0049 004A", "0069 006A", "004A 0302", "006A 0302", "004B 0327", "006B 0327", "004C 0301", "006C 0301", "004C 0327", "006C 0327", "004C 030C", "006C 030C", "004C 00B7", "006C 00B7", "004E 0301", "006E 0301", "004E 0327", "006E 0327", "004E 030C", "006E 030C", "02BC 006E", "004F 0304", "006F 0304", "004F 0306", "006F 0306", "004F 030B", "006F 030B", "0052 0301", "0072 0301", "0052 0327", "0072 0327", "0052 030C", "0072 030C", "0053 0301", "0073 0301", "0053 0302", "0073 0302", "0053 0327", "0073 0327", "0053 030C", "0073 030C", "0054 0327", "0074 0327", "0054 030C", "0074 030C", "0055 0303", "0075 0303", "0055 0304", "0075 0304", "0055 0306", "0075 0306", "0055 030A", "0075 030A", "0055 030B", "0075 030B", "0055 0328", "0075 0328", "0057 0302", "0077 0302", "0059 0302", "0079 0302", "0059 0308", "005A 0301", "007A 0301", "005A 0307", "007A 0307", "005A 030C", "007A 030C", "0073", "004F 031B", "006F 031B", "0055 031B", "0075 031B", "0044 017D", "0044 017E", "0064 017E", "004C 004A", "004C 006A", "006C 006A", "004E 004A", "004E 006A", "006E 006A", "0041 030C", "0061 030C", "0049 030C", "0069 030C", "004F 030C", "006F 030C", "0055 030C", "0075 030C", "00DC 0304", "00FC 0304", "00DC 0301", "00FC 0301", "00DC 030C", "00FC 030C", "00DC 0300", "00FC 0300", "00C4 0304", "00E4 0304", "0226 0304", "0227 0304", "00C6 0304", "00E6 0304", "0047 030C", "0067 030C", "004B 030C", "006B 030C", "004F 0328", "006F 0328", "01EA 0304", "01EB 0304", "01B7 030C", "0292 030C", "006A 030C", "0044 005A", "0044 007A", "0064 007A", "0047 0301", "0067 0301", "004E 0300", "006E 0300", "00C5 0301", "00E5 0301", "00C6 0301", "00E6 0301", "00D8 0301", "00F8 0301", "0041 030F", "0061 030F", "0041 0311", "0061 0311", "0045 030F", "0065 030F", "0045 0311", "0065 0311", "0049 030F", "0069 030F", "0049 0311", "0069 0311", "004F 030F", "006F 030F", "004F 0311", "006F 0311", "0052 030F", "0072 030F", "0052 0311", "0072 0311", "0055 030F", "0075 030F", "0055 0311", "0075 0311", "0053 0326", "0073 0326", "0054 0326", "0074 0326", "0048 030C", "0068 030C", "0041 0307", "0061 0307", "0045 0327", "0065 0327", "00D6 0304", "00F6 0304", "00D5 0304", "00F5 0304", "004F 0307", "006F 0307", "022E 0304", "022F 0304", "0059 0304", "0079 0304", "0068", "0266", "006A", "0072", "0279", "027B", "0281", "0077", "0079", "0020 0306", "0020 0307", "0020 030A", "0020 0328", "0020 0303", "0020 030B", "0263", "006C", "0073", "0078", "0295", "0300", "0301", "0313", "0308 0301", "02B9", "0020 0345", "003B", "0020 0301", "00A8 0301", "0391 0301", "00B7", "0395 0301", "0397 0301", "0399 0301", "039F 0301", "03A5 0301", "03A9 0301", "03CA 0301", "0399 0308", "03A5 0308", "03B1 0301", "03B5 0301", "03B7 0301", "03B9 0301", "03CB 0301", "03B9 0308", "03C5 0308", "03BF 0301", "03C5 0301", "03C9 0301", "03B2", "03B8", "03A5", "03D2 0301", "03D2 0308", "03C6", "03C0", "03BA", "03C1", "03C2", "0398", "03B5", "03A3", "0415 0300", "0415 0308", "0413 0301", "0406 0308", "041A 0301", "0418 0300", "0423 0306", "0418 0306", "0438 0306", "0435 0300", "0435 0308", "0433 0301", "0456 0308", "043A 0301", "0438 0300", "0443 0306", "0474 030F", "0475 030F", "0416 0306", "0436 0306", "0410 0306", "0430 0306", "0410 0308", "0430 0308", "0415 0306", "0435 0306", "04D8 0308", "04D9 0308", "0416 0308", "0436 0308", "0417 0308", "0437 0308", "0418 0304", "0438 0304", "0418 0308", "0438 0308", "041E 0308", "043E 0308", "04E8 0308", "04E9 0308", "042D 0308", "044D 0308", "0423 0304", "0443 0304", "0423 0308", "0443 0308", "0423 030B", "0443 030B", "0427 0308", "0447 0308", "042B 0308", "044B 0308", "0565 0582", "0627 0653", "0627 0654", "0648 0654", "0627 0655", "064A 0654", "0627 0674", "0648 0674", "06C7 0674", "064A 0674", "06D5 0654", "06C1 0654", "06D2 0654", "0928 093C", "0930 093C", "0933 093C", "0915 093C", "0916 093C", "0917 093C", "091C 093C", "0921 093C", "0922 093C", "092B 093C", "092F 093C", "09C7 09BE", "09C7 09D7", "09A1 09BC", "09A2 09BC", "09AF 09BC", "0A32 0A3C", "0A38 0A3C", "0A16 0A3C", "0A17 0A3C", "0A1C 0A3C", "0A2B 0A3C", "0B47 0B56", "0B47 0B3E", "0B47 0B57", "0B21 0B3C", "0B22 0B3C", "0B92 0BD7", "0BC6 0BBE", "0BC7 0BBE", "0BC6 0BD7", "0C46 0C56", "0CBF 0CD5", "0CC6 0CD5", "0CC6 0CD6", "0CC6 0CC2", "0CCA 0CD5", "0D46 0D3E", "0D47 0D3E", "0D46 0D57", "0DD9 0DCA", "0DD9 0DCF", "0DDC 0DCA", "0DD9 0DDF", "0E4D 0E32", "0ECD 0EB2", "0EAB 0E99", "0EAB 0EA1", "0F0B", "0F42 0FB7", "0F4C 0FB7", "0F51 0FB7", "0F56 0FB7", "0F5B 0FB7", "0F40 0FB5", "0F71 0F72", "0F71 0F74", "0FB2 0F80", "0FB2 0F81", "0FB3 0F80", "0FB3 0F81", "0F71 0F80", "0F92 0FB7", "0F9C 0FB7", "0FA1 0FB7", "0FA6 0FB7", "0FAB 0FB7", "0F90 0FB5", "1025 102E", "10DC", "1B05 1B35", "1B07 1B35", "1B09 1B35", "1B0B 1B35", "1B0D 1B35", "1B11 1B35", "1B3A 1B35", "1B3C 1B35", "1B3E 1B35", "1B3F 1B35", "1B42 1B35", "0041", "00C6", "0042", "0044", "0045", "018E", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0222", "0050", "0052", "0054", "0055", "0057", "0061", "0250", "0251", "1D02", "0062", "0064", "0065", "0259", "025B", "025C", "0067", "006B", "006D", "014B", "006F", "0254", "1D16", "1D17", "0070", "0074", "0075", "1D1D", "026F", "0076", "1D25", "03B2", "03B3", "03B4", "03C6", "03C7", "0069", "0072", "0075", "0076", "03B2", "03B3", "03C1", "03C6", "03C7", "043D", "0252", "0063", "0255", "00F0", "025C", "0066", "025F", "0261", "0265", "0268", "0269", "026A", "1D7B", "029D", "026D", "1D85", "029F", "0271", "0270", "0272", "0273", "0274", "0275", "0278", "0282", "0283", "01AB", "0289", "028A", "1D1C", "028B", "028C", "007A", "0290", "0291", "0292", "03B8", "0041 0325", "0061 0325", "0042 0307", "0062 0307", "0042 0323", "0062 0323", "0042 0331", "0062 0331", "00C7 0301", "00E7 0301", "0044 0307", "0064 0307", "0044 0323", "0064 0323", "0044 0331", "0064 0331", "0044 0327", "0064 0327", "0044 032D", "0064 032D", "0112 0300", "0113 0300", "0112 0301", "0113 0301", "0045 032D", "0065 032D", "0045 0330", "0065 0330", "0228 0306", "0229 0306", "0046 0307", "0066 0307", "0047 0304", "0067 0304", "0048 0307", "0068 0307", "0048 0323", "0068 0323", "0048 0308", "0068 0308", "0048 0327", "0068 0327", "0048 032E", "0068 032E", "0049 0330", "0069 0330", "00CF 0301", "00EF 0301", "004B 0301", "006B 0301", "004B 0323", "006B 0323", "004B 0331", "006B 0331", "004C 0323", "006C 0323", "1E36 0304", "1E37 0304", "004C 0331", "006C 0331", "004C 032D", "006C 032D", "004D 0301", "006D 0301", "004D 0307", "006D 0307", "004D 0323", "006D 0323", "004E 0307", "006E 0307", "004E 0323", "006E 0323", "004E 0331", "006E 0331", "004E 032D", "006E 032D", "00D5 0301", "00F5 0301", "00D5 0308", "00F5 0308", "014C 0300", "014D 0300", "014C 0301", "014D 0301", "0050 0301", "0070 0301", "0050 0307", "0070 0307", "0052 0307", "0072 0307", "0052 0323", "0072 0323", "1E5A 0304", "1E5B 0304", "0052 0331", "0072 0331", "0053 0307", "0073 0307", "0053 0323", "0073 0323", "015A 0307", "015B 0307", "0160 0307", "0161 0307", "1E62 0307", "1E63 0307", "0054 0307", "0074 0307", "0054 0323", "0074 0323", "0054 0331", "0074 0331", "0054 032D", "0074 032D", "0055 0324", "0075 0324", "0055 0330", "0075 0330", "0055 032D", "0075 032D", "0168 0301", "0169 0301", "016A 0308", "016B 0308", "0056 0303", "0076 0303", "0056 0323", "0076 0323", "0057 0300", "0077 0300", "0057 0301", "0077 0301", "0057 0308", "0077 0308", "0057 0307", "0077 0307", "0057 0323", "0077 0323", "0058 0307", "0078 0307", "0058 0308", "0078 0308", "0059 0307", "0079 0307", "005A 0302", "007A 0302", "005A 0323", "007A 0323", "005A 0331", "007A 0331", "0068 0331", "0074 0308", "0077 030A", "0079 030A", "0061 02BE", "017F 0307", "0041 0323", "0061 0323", "0041 0309", "0061 0309", "00C2 0301", "00E2 0301", "00C2 0300", "00E2 0300", "00C2 0309", "00E2 0309", "00C2 0303", "00E2 0303", "1EA0 0302", "1EA1 0302", "0102 0301", "0103 0301", "0102 0300", "0103 0300", "0102 0309", "0103 0309", "0102 0303", "0103 0303", "1EA0 0306", "1EA1 0306", "0045 0323", "0065 0323", "0045 0309", "0065 0309", "0045 0303", "0065 0303", "00CA 0301", "00EA 0301", "00CA 0300", "00EA 0300", "00CA 0309", "00EA 0309", "00CA 0303", "00EA 0303", "1EB8 0302", "1EB9 0302", "0049 0309", "0069 0309", "0049 0323", "0069 0323", "004F 0323", "006F 0323", "004F 0309", "006F 0309", "00D4 0301", "00F4 0301", "00D4 0300", "00F4 0300", "00D4 0309", "00F4 0309", "00D4 0303", "00F4 0303", "1ECC 0302", "1ECD 0302", "01A0 0301", "01A1 0301", "01A0 0300", "01A1 0300", "01A0 0309", "01A1 0309", "01A0 0303", "01A1 0303", "01A0 0323", "01A1 0323", "0055 0323", "0075 0323", "0055 0309", "0075 0309", "01AF 0301", "01B0 0301", "01AF 0300", "01B0 0300", "01AF 0309", "01B0 0309", "01AF 0303", "01B0 0303", "01AF 0323", "01B0 0323", "0059 0300", "0079 0300", "0059 0323", "0079 0323", "0059 0309", "0079 0309", "0059 0303", "0079 0303", "03B1 0313", "03B1 0314", "1F00 0300", "1F01 0300", "1F00 0301", "1F01 0301", "1F00 0342", "1F01 0342", "0391 0313", "0391 0314", "1F08 0300", "1F09 0300", "1F08 0301", "1F09 0301", "1F08 0342", "1F09 0342", "03B5 0313", "03B5 0314", "1F10 0300", "1F11 0300", "1F10 0301", "1F11 0301", "0395 0313", "0395 0314", "1F18 0300", "1F19 0300", "1F18 0301", "1F19 0301", "03B7 0313", "03B7 0314", "1F20 0300", "1F21 0300", "1F20 0301", "1F21 0301", "1F20 0342", "1F21 0342", "0397 0313", "0397 0314", "1F28 0300", "1F29 0300", "1F28 0301", "1F29 0301", "1F28 0342", "1F29 0342", "03B9 0313", "03B9 0314", "1F30 0300", "1F31 0300", "1F30 0301", "1F31 0301", "1F30 0342", "1F31 0342", "0399 0313", "0399 0314", "1F38 0300", "1F39 0300", "1F38 0301", "1F39 0301", "1F38 0342", "1F39 0342", "03BF 0313", "03BF 0314", "1F40 0300", "1F41 0300", "1F40 0301", "1F41 0301", "039F 0313", "039F 0314", "1F48 0300", "1F49 0300", "1F48 0301", "1F49 0301", "03C5 0313", "03C5 0314", "1F50 0300", "1F51 0300", "1F50 0301", "1F51 0301", "1F50 0342", "1F51 0342", "03A5 0314", "1F59 0300", "1F59 0301", "1F59 0342", "03C9 0313", "03C9 0314", "1F60 0300", "1F61 0300", "1F60 0301", "1F61 0301", "1F60 0342", "1F61 0342", "03A9 0313", "03A9 0314", "1F68 0300", "1F69 0300", "1F68 0301", "1F69 0301", "1F68 0342", "1F69 0342", "03B1 0300", "03AC", "03B5 0300", "03AD", "03B7 0300", "03AE", "03B9 0300", "03AF", "03BF 0300", "03CC", "03C5 0300", "03CD", "03C9 0300", "03CE", "1F00 0345", "1F01 0345", "1F02 0345", "1F03 0345", "1F04 0345", "1F05 0345", "1F06 0345", "1F07 0345", "1F08 0345", "1F09 0345", "1F0A 0345", "1F0B 0345", "1F0C 0345", "1F0D 0345", "1F0E 0345", "1F0F 0345", "1F20 0345", "1F21 0345", "1F22 0345", "1F23 0345", "1F24 0345", "1F25 0345", "1F26 0345", "1F27 0345", "1F28 0345", "1F29 0345", "1F2A 0345", "1F2B 0345", "1F2C 0345", "1F2D 0345", "1F2E 0345", "1F2F 0345", "1F60 0345", "1F61 0345", "1F62 0345", "1F63 0345", "1F64 0345", "1F65 0345", "1F66 0345", "1F67 0345", "1F68 0345", "1F69 0345", "1F6A 0345", "1F6B 0345", "1F6C 0345", "1F6D 0345", "1F6E 0345", "1F6F 0345", "03B1 0306", "03B1 0304", "1F70 0345", "03B1 0345", "03AC 0345", "03B1 0342", "1FB6 0345", "0391 0306", "0391 0304", "0391 0300", "0386", "0391 0345", "0020 0313", "03B9", "0020 0313", "0020 0342", "00A8 0342", "1F74 0345", "03B7 0345", "03AE 0345", "03B7 0342", "1FC6 0345", "0395 0300", "0388", "0397 0300", "0389", "0397 0345", "1FBF 0300", "1FBF 0301", "1FBF 0342", "03B9 0306", "03B9 0304", "03CA 0300", "0390", "03B9 0342", "03CA 0342", "0399 0306", "0399 0304", "0399 0300", "038A", "1FFE 0300", "1FFE 0301", "1FFE 0342", "03C5 0306", "03C5 0304", "03CB 0300", "03B0", "03C1 0313", "03C1 0314", "03C5 0342", "03CB 0342", "03A5 0306", "03A5 0304", "03A5 0300", "038E", "03A1 0314", "00A8 0300", "0385", "0060", "1F7C 0345", "03C9 0345", "03CE 0345", "03C9 0342", "1FF6 0345", "039F 0300", "038C", "03A9 0300", "038F", "03A9 0345", "00B4", "0020 0314", "2002", "2003", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "2010", "0020 0333", "002E", "002E 002E", "002E 002E 002E", "0020", "2032 2032", "2032 2032 2032", "2035 2035", "2035 2035 2035", "0021 0021", "0020 0305", "003F 003F", "003F 0021", "0021 003F", "2032 2032 2032 2032", "0020", "0030", "0069", "0034", "0035", "0036", "0037", "0038", "0039", "002B", "2212", "003D", "0028", "0029", "006E", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "002B", "2212", "003D", "0028", "0029", "0061", "0065", "006F", "0078", "0259", "0068", "006B", "006C", "006D", "006E", "0070", "0073", "0074", "0052 0073", "0061 002F 0063", "0061 002F 0073", "0043", "00B0 0043", "0063 002F 006F", "0063 002F 0075", "0190", "00B0 0046", "0067", "0048", "0048", "0048", "0068", "0127", "0049", "0049", "004C", "006C", "004E", "004E 006F", "0050", "0051", "0052", "0052", "0052", "0053 004D", "0054 0045 004C", "0054 004D", "005A", "03A9", "005A", "004B", "00C5", "0042", "0043", "0065", "0045", "0046", "004D", "006F", "05D0", "05D1", "05D2", "05D3", "0069", "0046 0041 0058", "03C0", "03B3", "0393", "03A0", "2211", "0044", "0064", "0065", "0069", "006A", "0031 2044 0037", "0031 2044 0039", "0031 2044 0031 0030", "0031 2044 0033", "0032 2044 0033", "0031 2044 0035", "0032 2044 0035", "0033 2044 0035", "0034 2044 0035", "0031 2044 0036", "0035 2044 0036", "0031 2044 0038", "0033 2044 0038", "0035 2044 0038", "0037 2044 0038", "0031 2044", "0049", "0049 0049", "0049 0049 0049", "0049 0056", "0056", "0056 0049", "0056 0049 0049", "0056 0049 0049 0049", "0049 0058", "0058", "0058 0049", "0058 0049 0049", "004C", "0043", "0044", "004D", "0069", "0069 0069", "0069 0069 0069", "0069 0076", "0076", "0076 0069", "0076 0069 0069", "0076 0069 0069 0069", "0069 0078", "0078", "0078 0069", "0078 0069 0069", "006C", "0063", "0064", "006D", "0030 2044 0033", "2190 0338", "2192 0338", "2194 0338", "21D0 0338", "21D4 0338", "21D2 0338", "2203 0338", "2208 0338", "220B 0338", "2223 0338", "2225 0338", "222B 222B", "222B 222B 222B", "222E 222E", "222E 222E 222E", "223C 0338", "2243 0338", "2245 0338", "2248 0338", "003D 0338", "2261 0338", "224D 0338", "003C 0338", "003E 0338", "2264 0338", "2265 0338", "2272 0338", "2273 0338", "2276 0338", "2277 0338", "227A 0338", "227B 0338", "2282 0338", "2283 0338", "2286 0338", "2287 0338", "22A2 0338", "22A8 0338", "22A9 0338", "22AB 0338", "227C 0338", "227D 0338", "2291 0338", "2292 0338", "22B2 0338", "22B3 0338", "22B4 0338", "22B5 0338", "3008", "3009", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0031 0030", "0031 0031", "0031 0032", "0031 0033", "0031 0034", "0031 0035", "0031 0036", "0031 0037", "0031 0038", "0031 0039", "0032 0030", "0028 0031 0029", "0028 0032 0029", "0028 0033 0029", "0028 0034 0029", "0028 0035 0029", "0028 0036 0029", "0028 0037 0029", "0028 0038 0029", "0028 0039 0029", "0028 0031 0030 0029", "0028 0031 0031 0029", "0028 0031 0032 0029", "0028 0031 0033 0029", "0028 0031 0034 0029", "0028 0031 0035 0029", "0028 0031 0036 0029", "0028 0031 0037 0029", "0028 0031 0038 0029", "0028 0031 0039 0029", "0028 0032 0030 0029", "0031 002E", "0032 002E", "0033 002E", "0034 002E", "0035 002E", "0036 002E", "0037 002E", "0038 002E", "0039 002E", "0031 0030 002E", "0031 0031 002E", "0031 0032 002E", "0031 0033 002E", "0031 0034 002E", "0031 0035 002E", "0031 0036 002E", "0031 0037 002E", "0031 0038 002E", "0031 0039 002E", "0032 0030 002E", "0028 0061 0029", "0028 0062 0029", "0028 0063 0029", "0028 0064 0029", "0028 0065 0029", "0028 0066 0029", "0028 0067 0029", "0028 0068 0029", "0028 0069 0029", "0028 006A 0029", "0028 006B 0029", "0028 006C 0029", "0028 006D 0029", "0028 006E 0029", "0028 006F 0029", "0028 0070 0029", "0028 0071 0029", "0028 0072 0029", "0028 0073 0029", "0028 0074 0029", "0028 0075 0029", "0028 0076 0029", "0028 0077 0029", "0028 0078 0029", "0028 0079 0029", "0028 007A 0029", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0030", "222B 222B 222B 222B", "003A 003A 003D", "003D 003D", "003D 003D 003D", "2ADD 0338", "006A", "0056", "2D61", "6BCD", "9F9F", "4E00", "4E28", "4E36", "4E3F", "4E59", "4E85", "4E8C", "4EA0", "4EBA", "513F", "5165", "516B", "5182", "5196", "51AB", "51E0", "51F5", "5200", "529B", "52F9", "5315", "531A", "5338", "5341", "535C", "5369", "5382", "53B6", "53C8", "53E3", "56D7", "571F", "58EB", "5902", "590A", "5915", "5927", "5973", "5B50", "5B80", "5BF8", "5C0F", "5C22", "5C38", "5C6E", "5C71", "5DDB", "5DE5", "5DF1", "5DFE", "5E72", "5E7A", "5E7F", "5EF4", "5EFE", "5F0B", "5F13", "5F50", "5F61", "5F73", "5FC3", "6208", "6236", "624B", "652F", "6534", "6587", "6597", "65A4", "65B9", "65E0", "65E5", "66F0", "6708", "6728", "6B20", "6B62", "6B79", "6BB3", "6BCB", "6BD4", "6BDB", "6C0F", "6C14", "6C34", "706B", "722A", "7236", "723B", "723F", "7247", "7259", "725B", "72AC", "7384", "7389", "74DC", "74E6", "7518", "751F", "7528", "7530", "758B", "7592", "7676", "767D", "76AE", "76BF", "76EE", "77DB", "77E2", "77F3", "793A", "79B8", "79BE", "7A74", "7ACB", "7AF9", "7C73", "7CF8", "7F36", "7F51", "7F8A", "7FBD", "8001", "800C", "8012", "8033", "807F", "8089", "81E3", "81EA", "81F3", "81FC", "820C", "821B", "821F", "826E", "8272", "8278", "864D", "866B", "8840", "884C", "8863", "897E", "898B", "89D2", "8A00", "8C37", "8C46", "8C55", "8C78", "8C9D", "8D64", "8D70", "8DB3", "8EAB", "8ECA", "8F9B", "8FB0", "8FB5", "9091", "9149", "91C6", "91CC", "91D1", "9577", "9580", "961C", "96B6", "96B9", "96E8", "9751", "975E", "9762", "9769", "97CB", "97ED", "97F3", "9801", "98A8", "98DB", "98DF", "9996", "9999", "99AC", "9AA8", "9AD8", "9ADF", "9B25", "9B2F", "9B32", "9B3C", "9B5A", "9CE5", "9E75", "9E7F", "9EA5", "9EBB", "9EC3", "9ECD", "9ED1", "9EF9", "9EFD", "9F0E", "9F13", "9F20", "9F3B", "9F4A", "9F52", "9F8D", "9F9C", "9FA0", "0020", "3012", "5341", "5344", "5345", "304B 3099", "304D 3099", "304F 3099", "3051 3099", "3053 3099", "3055 3099", "3057 3099", "3059 3099", "305B 3099", "305D 3099", "305F 3099", "3061 3099", "3064 3099", "3066 3099", "3068 3099", "306F 3099", "306F 309A", "3072 3099", "3072 309A", "3075 3099", "3075 309A", "3078 3099", "3078 309A", "307B 3099", "307B 309A", "3046 3099", "0020 3099", "0020 309A", "309D 3099", "3088 308A", "30AB 3099", "30AD 3099", "30AF 3099", "30B1 3099", "30B3 3099", "30B5 3099", "30B7 3099", "30B9 3099", "30BB 3099", "30BD 3099", "30BF 3099", "30C1 3099", "30C4 3099", "30C6 3099", "30C8 3099", "30CF 3099", "30CF 309A", "30D2 3099", "30D2 309A", "30D5 3099", "30D5 309A", "30D8 3099", "30D8 309A", "30DB 3099", "30DB 309A", "30A6 3099", "30EF 3099", "30F0 3099", "30F1 3099", "30F2 3099", "30FD 3099", "30B3 30C8", "1100", "1101", "11AA", "1102", "11AC", "11AD", "1103", "1104", "1105", "11B0", "11B1", "11B2", "11B3", "11B4", "11B5", "111A", "1106", "1107", "1108", "1121", "1109", "110A", "110B", "110C", "110D", "110E", "110F", "1110", "1111", "1112", "1161", "1162", "1163", "1164", "1165", "1166", "1167", "1168", "1169", "116A", "116B", "116C", "116D", "116E", "116F", "1170", "1171", "1172", "1173", "1174", "1175", "1160", "1114", "1115", "11C7", "11C8", "11CC", "11CE", "11D3", "11D7", "11D9", "111C", "11DD", "11DF", "111D", "111E", "1120", "1122", "1123", "1127", "1129", "112B", "112C", "112D", "112E", "112F", "1132", "1136", "1140", "1147", "114C", "11F1", "11F2", "1157", "1158", "1159", "1184", "1185", "1188", "1191", "1192", "1194", "119E", "11A1", "4E00", "4E8C", "4E09", "56DB", "4E0A", "4E2D", "4E0B", "7532", "4E59", "4E19", "4E01", "5929", "5730", "4EBA", "0028 1100 0029", "0028 1102 0029", "0028 1103 0029", "0028 1105 0029", "0028 1106 0029", "0028 1107 0029", "0028 1109 0029", "0028 110B 0029", "0028 110C 0029", "0028 110E 0029", "0028 110F 0029", "0028 1110 0029", "0028 1111 0029", "0028 1112 0029", "0028 1100 1161 0029", "0028 1102 1161 0029", "0028 1103 1161 0029", "0028 1105 1161 0029", "0028 1106 1161 0029", "0028 1107 1161 0029", "0028 1109 1161 0029", "0028 110B 1161 0029", "0028 110C 1161 0029", "0028 110E 1161 0029", "0028 110F 1161 0029", "0028 1110 1161 0029", "0028 1111 1161 0029", "0028 1112 1161 0029", "0028 110C 116E 0029", "0028 110B 1169 110C 1165 11AB 0029", "0028 110B 1169 1112 116E 0029", "0028 4E00 0029", "0028 4E8C 0029", "0028 4E09 0029", "0028 56DB 0029", "0028 4E94 0029", "0028 516D 0029", "0028 4E03 0029", "0028 516B 0029", "0028 4E5D 0029", "0028 5341 0029", "0028 6708 0029", "0028 706B 0029", "0028 6C34 0029", "0028 6728 0029", "0028 91D1 0029", "0028 571F 0029", "0028 65E5 0029", "0028 682A 0029", "0028 6709 0029", "0028 793E 0029", "0028 540D 0029", "0028 7279 0029", "0028 8CA1 0029", "0028 795D 0029", "0028 52B4 0029", "0028 4EE3 0029", "0028 547C 0029", "0028 5B66 0029", "0028 76E3 0029", "0028 4F01 0029", "0028 8CC7 0029", "0028 5354 0029", "0028 796D 0029", "0028 4F11 0029", "0028 81EA 0029", "0028 81F3 0029", "554F", "5E7C", "6587", "7B8F", "0050 0054 0045", "0032 0031", "0032 0032", "0032 0033", "0032 0034", "0032 0035", "0032 0036", "0032 0037", "0032 0038", "0032 0039", "0033 0030", "0033 0031", "0033 0032", "0033 0033", "0033 0034", "0033 0035", "1100", "1102", "1103", "1105", "1106", "1107", "1109", "110B", "110C", "110E", "110F", "1110", "1111", "1112", "1100 1161", "1102 1161", "1103 1161", "1105 1161", "1106 1161", "1107 1161", "1109 1161", "110B 1161", "110C 1161", "110E 1161", "110F 1161", "1110 1161", "1111 1161", "1112 1161", "110E 1161 11B7 1100 1169", "110C 116E 110B 1174", "110B 116E", "4E00", "4E8C", "4E09", "56DB", "4E94", "516D", "4E03", "516B", "4E5D", "5341", "6708", "706B", "6C34", "6728", "91D1", "571F", "65E5", "682A", "6709", "793E", "540D", "7279", "8CA1", "795D", "52B4", "79D8", "7537", "5973", "9069", "512A", "5370", "6CE8", "9805", "4F11", "5199", "6B63", "4E0A", "4E2D", "4E0B", "5DE6", "53F3", "533B", "5B97", "5B66", "76E3", "4F01", "8CC7", "5354", "591C", "0033 0036", "0033 0037", "0033 0038", "0033 0039", "0034 0030", "0034 0031", "0034 0032", "0034 0033", "0034 0034", "0034 0035", "0034 0036", "0034 0037", "0034 0038", "0034 0039", "0035 0030", "0031 6708", "0032 6708", "0033 6708", "0034 6708", "0035 6708", "0036 6708", "0037 6708", "0038 6708", "0039 6708", "0031 0030 6708", "0031 0031 6708", "0031 0032 6708", "0048 0067", "0065 0072 0067", "0065 0056", "004C 0054 0044", "30A2", "30A4", "30A6", "30A8", "30AA", "30AB", "30AD", "30AF", "30B1", "30B3", "30B5", "30B7", "30B9", "30BB", "30BD", "30BF", "30C1", "30C4", "30C6", "30C8", "30CA", "30CB", "30CC", "30CD", "30CE", "30CF", "30D2", "30D5", "30D8", "30DB", "30DE", "30DF", "30E0", "30E1", "30E2", "30E4", "30E6", "30E8", "30E9", "30EA", "30EB", "30EC", "30ED", "30EF", "30F0", "30F1", "30F2", "30A2 30D1 30FC 30C8", "30A2 30EB 30D5 30A1", "30A2 30F3 30DA 30A2", "30A2 30FC 30EB", "30A4 30CB 30F3 30B0", "30A4 30F3 30C1", "30A6 30A9 30F3", "30A8 30B9 30AF 30FC 30C9", "30A8 30FC 30AB 30FC", "30AA 30F3 30B9", "30AA 30FC 30E0", "30AB 30A4 30EA", "30AB 30E9 30C3 30C8", "30AB 30ED 30EA 30FC", "30AC 30ED 30F3", "30AC 30F3 30DE", "30AE 30AC", "30AE 30CB 30FC", "30AD 30E5 30EA 30FC", "30AE 30EB 30C0 30FC", "30AD 30ED", "30AD 30ED 30B0 30E9 30E0", "30AD 30ED 30E1 30FC 30C8 30EB", "30AD 30ED 30EF 30C3 30C8", "30B0 30E9 30E0", "30B0 30E9 30E0 30C8 30F3", "30AF 30EB 30BC 30A4 30ED", "30AF 30ED 30FC 30CD", "30B1 30FC 30B9", "30B3 30EB 30CA", "30B3 30FC 30DD", "30B5 30A4 30AF 30EB", "30B5 30F3 30C1 30FC 30E0", "30B7 30EA 30F3 30B0", "30BB 30F3 30C1", "30BB 30F3 30C8", "30C0 30FC 30B9", "30C7 30B7", "30C9 30EB", "30C8 30F3", "30CA 30CE", "30CE 30C3 30C8", "30CF 30A4 30C4", "30D1 30FC 30BB 30F3 30C8", "30D1 30FC 30C4", "30D0 30FC 30EC 30EB", "30D4 30A2 30B9 30C8 30EB", "30D4 30AF 30EB", "30D4 30B3", "30D3 30EB", "30D5 30A1 30E9 30C3 30C9", "30D5 30A3 30FC 30C8", "30D6 30C3 30B7 30A7 30EB", "30D5 30E9 30F3", "30D8 30AF 30BF 30FC 30EB", "30DA 30BD", "30DA 30CB 30D2", "30D8 30EB 30C4", "30DA 30F3 30B9", "30DA 30FC 30B8", "30D9 30FC 30BF", "30DD 30A4 30F3 30C8", "30DC 30EB 30C8", "30DB 30F3", "30DD 30F3 30C9", "30DB 30FC 30EB", "30DB 30FC 30F3", "30DE 30A4 30AF 30ED", "30DE 30A4 30EB", "30DE 30C3 30CF", "30DE 30EB 30AF", "30DE 30F3 30B7 30E7 30F3", "30DF 30AF 30ED 30F3", "30DF 30EA", "30DF 30EA 30D0 30FC 30EB", "30E1 30AC", "30E1 30AC 30C8 30F3", "30E1 30FC 30C8 30EB", "30E4 30FC 30C9", "30E4 30FC 30EB", "30E6 30A2 30F3", "30EA 30C3 30C8 30EB", "30EA 30E9", "30EB 30D4 30FC", "30EB 30FC 30D6 30EB", "30EC 30E0", "30EC 30F3 30C8 30B2 30F3", "30EF 30C3 30C8", "0030 70B9", "0031 70B9", "0032 70B9", "0033 70B9", "0034 70B9", "0035 70B9", "0036 70B9", "0037 70B9", "0038 70B9", "0039 70B9", "0031 0030 70B9", "0031 0031 70B9", "0031 0032 70B9", "0031 0033 70B9", "0031 0034 70B9", "0031 0035 70B9", "0031 0036 70B9", "0031 0037 70B9", "0031 0038 70B9", "0031 0039 70B9", "0032 0030 70B9", "0032 0031 70B9", "0032 0032 70B9", "0032 0033 70B9", "0032 0034 70B9", "0068 0050 0061", "0064 0061", "0041 0055", "0062 0061 0072", "006F 0056", "0070 0063", "0064 006D", "0064 006D 00B2", "0064 006D 00B3", "0049 0055", "5E73 6210", "662D 548C", "5927 6B63", "660E 6CBB", "682A 5F0F 4F1A 793E", "0070 0041", "006E 0041", "03BC 0041", "006D 0041", "006B 0041", "004B 0042", "004D 0042", "0047 0042", "0063 0061 006C", "006B 0063 0061 006C", "0070 0046", "006E 0046", "03BC 0046", "03BC 0067", "006D 0067", "006B 0067", "0048 007A", "006B 0048 007A", "004D 0048 007A", "0047 0048 007A", "0054 0048 007A", "03BC 2113", "006D 2113", "0064 2113", "006B 2113", "0066 006D", "006E 006D", "03BC 006D", "006D 006D", "0063 006D", "006B 006D", "006D 006D 00B2", "0063 006D 00B2", "006D 00B2", "006B 006D 00B2", "006D 006D 00B3", "0063 006D 00B3", "006D 00B3", "006B 006D 00B3", "006D 2215 0073", "006D 2215 0073 00B2", "0050 0061", "006B 0050 0061", "004D 0050 0061", "0047 0050 0061", "0072 0061 0064", "0072 0061 0064 2215 0073", "0072 0061 0064 2215 0073 00B2", "0070 0073", "006E 0073", "03BC 0073", "006D 0073", "0070 0056", "006E 0056", "03BC 0056", "006D 0056", "006B 0056", "004D 0056", "0070 0057", "006E 0057", "03BC 0057", "006D 0057", "006B 0057", "004D 0057", "006B 03A9", "004D 03A9", "0061 002E 006D 002E", "0042 0071", "0063 0063", "0063 0064", "0043 2215 006B 0067", "0043 006F 002E", "0064 0042", "0047 0079", "0068 0061", "0048 0050", "0069 006E", "004B 004B", "004B 004D", "006B 0074", "006C 006D", "006C 006E", "006C 006F 0067", "006C 0078", "006D 0062", "006D 0069 006C", "006D 006F 006C", "0050 0048", "0070 002E 006D 002E", "0050 0050 004D", "0050 0052", "0073 0072", "0053 0076", "0057 0062", "0056 2215 006D", "0041 2215 006D", "0031 65E5", "0032 65E5", "0033 65E5", "0034 65E5", "0035 65E5", "0036 65E5", "0037 65E5", "0038 65E5", "0039 65E5", "0031 0030 65E5", "0031 0031 65E5", "0031 0032 65E5", "0031 0033 65E5", "0031 0034 65E5", "0031 0035 65E5", "0031 0036 65E5", "0031 0037 65E5", "0031 0038 65E5", "0031 0039 65E5", "0032 0030 65E5", "0032 0031 65E5", "0032 0032 65E5", "0032 0033 65E5", "0032 0034 65E5", "0032 0035 65E5", "0032 0036 65E5", "0032 0037 65E5", "0032 0038 65E5", "0032 0039 65E5", "0033 0030 65E5", "0033 0031 65E5", "0067 0061 006C", "044A", "044C", "A76F", "0126", "0153", "A727", "AB37", "026B", "AB52", "8C48", "66F4", "8ECA", "8CC8", "6ED1", "4E32", "53E5", "9F9C", "9F9C", "5951", "91D1", "5587", "5948", "61F6", "7669", "7F85", "863F", "87BA", "88F8", "908F", "6A02", "6D1B", "70D9", "73DE", "843D", "916A", "99F1", "4E82", "5375", "6B04", "721B", "862D", "9E1E", "5D50", "6FEB", "85CD", "8964", "62C9", "81D8", "881F", "5ECA", "6717", "6D6A", "72FC", "90CE", "4F86", "51B7", "52DE", "64C4", "6AD3", "7210", "76E7", "8001", "8606", "865C", "8DEF", "9732", "9B6F", "9DFA", "788C", "797F", "7DA0", "83C9", "9304", "9E7F", "8AD6", "58DF", "5F04", "7C60", "807E", "7262", "78CA", "8CC2", "96F7", "58D8", "5C62", "6A13", "6DDA", "6F0F", "7D2F", "7E37", "964B", "52D2", "808B", "51DC", "51CC", "7A1C", "7DBE", "83F1", "9675", "8B80", "62CF", "6A02", "8AFE", "4E39", "5BE7", "6012", "7387", "7570", "5317", "78FB", "4FBF", "5FA9", "4E0D", "6CCC", "6578", "7D22", "53C3", "585E", "7701", "8449", "8AAA", "6BBA", "8FB0", "6C88", "62FE", "82E5", "63A0", "7565", "4EAE", "5169", "51C9", "6881", "7CE7", "826F", "8AD2", "91CF", "52F5", "5442", "5973", "5EEC", "65C5", "6FFE", "792A", "95AD", "9A6A", "9E97", "9ECE", "529B", "66C6", "6B77", "8F62", "5E74", "6190", "6200", "649A", "6F23", "7149", "7489", "79CA", "7DF4", "806F", "8F26", "84EE", "9023", "934A", "5217", "52A3", "54BD", "70C8", "88C2", "8AAA", "5EC9", "5FF5", "637B", "6BAE", "7C3E", "7375", "4EE4", "56F9", "5BE7", "5DBA", "601C", "73B2", "7469", "7F9A", "8046", "9234", "96F6", "9748", "9818", "4F8B", "79AE", "91B4", "96B8", "60E1", "4E86", "50DA", "5BEE", "5C3F", "6599", "6A02", "71CE", "7642", "84FC", "907C", "9F8D", "6688", "962E", "5289", "677B", "67F3", "6D41", "6E9C", "7409", "7559", "786B", "7D10", "985E", "516D", "622E", "9678", "502B", "5D19", "6DEA", "8F2A", "5F8B", "6144", "6817", "7387", "9686", "5229", "540F", "5C65", "6613", "674E", "68A8", "6CE5", "7406", "75E2", "7F79", "88CF", "88E1", "91CC", "96E2", "533F", "6EBA", "541D", "71D0", "7498", "85FA", "96A3", "9C57", "9E9F", "6797", "6DCB", "81E8", "7ACB", "7B20", "7C92", "72C0", "7099", "8B58", "4EC0", "8336", "523A", "5207", "5EA6", "62D3", "7CD6", "5B85", "6D1E", "66B4", "8F3B", "884C", "964D", "898B", "5ED3", "5140", "55C0", "585A", "6674", "51DE", "732A", "76CA", "793C", "795E", "7965", "798F", "9756", "7CBE", "7FBD", "8612", "8AF8", "9038", "90FD", "98EF", "98FC", "9928", "9DB4", "90DE", "96B7", "4FAE", "50E7", "514D", "52C9", "52E4", "5351", "559D", "5606", "5668", "5840", "58A8", "5C64", "5C6E", "6094", "6168", "618E", "61F2", "654F", "65E2", "6691", "6885", "6D77", "6E1A", "6F22", "716E", "722B", "7422", "7891", "793E", "7949", "7948", "7950", "7956", "795D", "798D", "798E", "7A40", "7A81", "7BC0", "7DF4", "7E09", "7E41", "7F72", "8005", "81ED", "8279", "8279", "8457", "8910", "8996", "8B01", "8B39", "8CD3", "8D08", "8FB6", "9038", "96E3", "97FF", "983B", "6075", "242EE", "8218", "4E26", "51B5", "5168", "4F80", "5145", "5180", "52C7", "52FA", "559D", "5555", "5599", "55E2", "585A", "58B3", "5944", "5954", "5A62", "5B28", "5ED2", "5ED9", "5F69", "5FAD", "60D8", "614E", "6108", "618E", "6160", "61F2", "6234", "63C4", "641C", "6452", "6556", "6674", "6717", "671B", "6756", "6B79", "6BBA", "6D41", "6EDB", "6ECB", "6F22", "701E", "716E", "77A7", "7235", "72AF", "732A", "7471", "7506", "753B", "761D", "761F", "76CA", "76DB", "76F4", "774A", "7740", "78CC", "7AB1", "7BC0", "7C7B", "7D5B", "7DF4", "7F3E", "8005", "8352", "83EF", "8779", "8941", "8986", "8996", "8ABF", "8AF8", "8ACB", "8B01", "8AFE", "8AED", "8B39", "8B8A", "8D08", "8F38", "9072", "9199", "9276", "967C", "96E3", "9756", "97DB", "97FF", "980B", "983B", "9B12", "9F9C", "2284A", "22844", "233D5", "3B9D", "4018", "4039", "25249", "25CD0", "27ED3", "9F43", "9F8E", "0066 0066", "0066 0069", "0066 006C", "0066 0066 0069", "0066 0066 006C", "017F 0074", "0073 0074", "0574 0576", "0574 0565", "0574 056B", "057E 0576", "0574 056D", "05D9 05B4", "05F2 05B7", "05E2", "05D0", "05D3", "05D4", "05DB", "05DC", "05DD", "05E8", "05EA", "002B", "05E9 05C1", "05E9 05C2", "FB49 05C1", "FB49 05C2", "05D0 05B7", "05D0 05B8", "05D0 05BC", "05D1 05BC", "05D2 05BC", "05D3 05BC", "05D4 05BC", "05D5 05BC", "05D6 05BC", "05D8 05BC", "05D9 05BC", "05DA 05BC", "05DB 05BC", "05DC 05BC", "05DE 05BC", "05E0 05BC", "05E1 05BC", "05E3 05BC", "05E4 05BC", "05E6 05BC", "05E7 05BC", "05E8 05BC", "05E9 05BC", "05EA 05BC", "05D5 05B9", "05D1 05BF", "05DB 05BF", "05E4 05BF", "05D0 05DC", "0671", "0671", "067B", "067B", "067B", "067B", "067E", "067E", "067E", "067E", "0680", "0680", "0680", "0680", "067A", "067A", "067A", "067A", "067F", "067F", "067F", "067F", "0679", "0679", "0679", "0679", "06A4", "06A4", "06A4", "06A4", "06A6", "06A6", "06A6", "06A6", "0684", "0684", "0684", "0684", "0683", "0683", "0683", "0683", "0686", "0686", "0686", "0686", "0687", "0687", "0687", "0687", "068D", "068D", "068C", "068C", "068E", "068E", "0688", "0688", "0698", "0698", "0691", "0691", "06A9", "06A9", "06A9", "06A9", "06AF", "06AF", "06AF", "06AF", "06B3", "06B3", "06B3", "06B3", "06B1", "06B1", "06B1", "06B1", "06BA", "06BA", "06BB", "06BB", "06BB", "06BB", "06C0", "06C0", "06C1", "06C1", "06C1", "06C1", "06BE", "06BE", "06BE", "06BE", "06D2", "06D2", "06D3", "06D3", "06AD", "06AD", "06AD", "06AD", "06C7", "06C7", "06C6", "06C6", "06C8", "06C8", "0677", "06CB", "06CB", "06C5", "06C5", "06C9", "06C9", "06D0", "06D0", "06D0", "06D0", "0649", "0649", "0626 0627", "0626 0627", "0626 06D5", "0626 06D5", "0626 0648", "0626 0648", "0626 06C7", "0626 06C7", "0626 06C6", "0626 06C6", "0626 06C8", "0626 06C8", "0626 06D0", "0626 06D0", "0626 06D0", "0626 0649", "0626 0649", "0626 0649", "06CC", "06CC", "06CC", "06CC", "0626 062C", "0626 062D", "0626 0645", "0626 0649", "0626 064A", "0628 062C", "0628 062D", "0628 062E", "0628 0645", "0628 0649", "0628 064A", "062A 062C", "062A 062D", "062A 062E", "062A 0645", "062A 0649", "062A 064A", "062B 062C", "062B 0645", "062B 0649", "062B 064A", "062C 062D", "062C 0645", "062D 062C", "062D 0645", "062E 062C", "062E 062D", "062E 0645", "0633 062C", "0633 062D", "0633 062E", "0633 0645", "0635 062D", "0635 0645", "0636 062C", "0636 062D", "0636 062E", "0636 0645", "0637 062D", "0637 0645", "0638 0645", "0639 062C", "0639 0645", "063A 062C", "063A 0645", "0641 062C", "0641 062D", "0641 062E", "0641 0645", "0641 0649", "0641 064A", "0642 062D", "0642 0645", "0642 0649", "0642 064A", "0643 0627", "0643 062C", "0643 062D", "0643 062E", "0643 0644", "0643 0645", "0643 0649", "0643 064A", "0644 062C", "0644 062D", "0644 062E", "0644 0645", "0644 0649", "0644 064A", "0645 062C", "0645 062D", "0645 062E", "0645 0645", "0645 0649", "0645 064A", "0646 062C", "0646 062D", "0646 062E", "0646 0645", "0646 0649", "0646 064A", "0647 062C", "0647 0645", "0647 0649", "0647 064A", "064A 062C", "064A 062D", "064A 062E", "064A 0645", "064A 0649", "064A 064A", "0630 0670", "0631 0670", "0649 0670", "0020 064C 0651", "0020 064D 0651", "0020 064E 0651", "0020 064F 0651", "0020 0650 0651", "0020 0651 0670", "0626 0631", "0626 0632", "0626 0645", "0626 0646", "0626 0649", "0626 064A", "0628 0631", "0628 0632", "0628 0645", "0628 0646", "0628 0649", "0628 064A", "062A 0631", "062A 0632", "062A 0645", "062A 0646", "062A 0649", "062A 064A", "062B 0631", "062B 0632", "062B 0645", "062B 0646", "062B 0649", "062B 064A", "0641 0649", "0641 064A", "0642 0649", "0642 064A", "0643 0627", "0643 0644", "0643 0645", "0643 0649", "0643 064A", "0644 0645", "0644 0649", "0644 064A", "0645 0627", "0645 0645", "0646 0631", "0646 0632", "0646 0645", "0646 0646", "0646 0649", "0646 064A", "0649 0670", "064A 0631", "064A 0632", "064A 0645", "064A 0646", "064A 0649", "064A 064A", "0626 062C", "0626 062D", "0626 062E", "0626 0645", "0626 0647", "0628 062C", "0628 062D", "0628 062E", "0628 0645", "0628 0647", "062A 062C", "062A 062D", "062A 062E", "062A 0645", "062A 0647", "062B 0645", "062C 062D", "062C 0645", "062D 062C", "062D 0645", "062E 062C", "062E 0645", "0633 062C", "0633 062D", "0633 062E", "0633 0645", "0635 062D", "0635 062E", "0635 0645", "0636 062C", "0636 062D", "0636 062E", "0636 0645", "0637 062D", "0638 0645", "0639 062C", "0639 0645", "063A 062C", "063A 0645", "0641 062C", "0641 062D", "0641 062E", "0641 0645", "0642 062D", "0642 0645", "0643 062C", "0643 062D", "0643 062E", "0643 0644", "0643 0645", "0644 062C", "0644 062D", "0644 062E", "0644 0645", "0644 0647", "0645 062C", "0645 062D", "0645 062E", "0645 0645", "0646 062C", "0646 062D", "0646 062E", "0646 0645", "0646 0647", "0647 062C", "0647 0645", "0647 0670", "064A 062C", "064A 062D", "064A 062E", "064A 0645", "064A 0647", "0626 0645", "0626 0647", "0628 0645", "0628 0647", "062A 0645", "062A 0647", "062B 0645", "062B 0647", "0633 0645", "0633 0647", "0634 0645", "0634 0647", "0643 0644", "0643 0645", "0644 0645", "0646 0645", "0646 0647", "064A 0645", "064A 0647", "0640 064E 0651", "0640 064F 0651", "0640 0650 0651", "0637 0649", "0637 064A", "0639 0649", "0639 064A", "063A 0649", "063A 064A", "0633 0649", "0633 064A", "0634 0649", "0634 064A", "062D 0649", "062D 064A", "062C 0649", "062C 064A", "062E 0649", "062E 064A", "0635 0649", "0635 064A", "0636 0649", "0636 064A", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0634 0631", "0633 0631", "0635 0631", "0636 0631", "0637 0649", "0637 064A", "0639 0649", "0639 064A", "063A 0649", "063A 064A", "0633 0649", "0633 064A", "0634 0649", "0634 064A", "062D 0649", "062D 064A", "062C 0649", "062C 064A", "062E 0649", "062E 064A", "0635 0649", "0635 064A", "0636 0649", "0636 064A", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0634 0631", "0633 0631", "0635 0631", "0636 0631", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0633 0647", "0634 0647", "0637 0645", "0633 062C", "0633 062D", "0633 062E", "0634 062C", "0634 062D", "0634 062E", "0637 0645", "0638 0645", "0627 064B", "0627 064B", "062A 062C 0645", "062A 062D 062C", "062A 062D 062C", "062A 062D 0645", "062A 062E 0645", "062A 0645 062C", "062A 0645 062D", "062A 0645 062E", "062C 0645 062D", "062C 0645 062D", "062D 0645 064A", "062D 0645 0649", "0633 062D 062C", "0633 062C 062D", "0633 062C 0649", "0633 0645 062D", "0633 0645 062D", "0633 0645 062C", "0633 0645 0645", "0633 0645 0645", "0635 062D 062D", "0635 062D 062D", "0635 0645 0645", "0634 062D 0645", "0634 062D 0645", "0634 062C 064A", "0634 0645 062E", "0634 0645 062E", "0634 0645 0645", "0634 0645 0645", "0636 062D 0649", "0636 062E 0645", "0636 062E 0645", "0637 0645 062D", "0637 0645 062D", "0637 0645 0645", "0637 0645 064A", "0639 062C 0645", "0639 0645 0645", "0639 0645 0645", "0639 0645 0649", "063A 0645 0645", "063A 0645 064A", "063A 0645 0649", "0641 062E 0645", "0641 062E 0645", "0642 0645 062D", "0642 0645 0645", "0644 062D 0645", "0644 062D 064A", "0644 062D 0649", "0644 062C 062C", "0644 062C 062C", "0644 062E 0645", "0644 062E 0645", "0644 0645 062D", "0644 0645 062D", "0645 062D 062C", "0645 062D 0645", "0645 062D 064A", "0645 062C 062D", "0645 062C 0645", "0645 062E 062C", "0645 062E 0645", "0645 062C 062E", "0647 0645 062C", "0647 0645 0645", "0646 062D 0645", "0646 062D 0649", "0646 062C 0645", "0646 062C 0645", "0646 062C 0649", "0646 0645 064A", "0646 0645 0649", "064A 0645 0645", "064A 0645 0645", "0628 062E 064A", "062A 062C 064A", "062A 062C 0649", "062A 062E 064A", "062A 062E 0649", "062A 0645 064A", "062A 0645 0649", "062C 0645 064A", "062C 062D 0649", "062C 0645 0649", "0633 062E 0649", "0635 062D 064A", "0634 062D 064A", "0636 062D 064A", "0644 062C 064A", "0644 0645 064A", "064A 062D 064A", "064A 062C 064A", "064A 0645 064A", "0645 0645 064A", "0642 0645 064A", "0646 062D 064A", "0642 0645 062D", "0644 062D 0645", "0639 0645 064A", "0643 0645 064A", "0646 062C 062D", "0645 062E 064A", "0644 062C 0645", "0643 0645 0645", "0644 062C 0645", "0646 062C 062D", "062C 062D 064A", "062D 062C 064A", "0645 062C 064A", "0641 0645 064A", "0628 062D 064A", "0643 0645 0645", "0639 062C 0645", "0635 0645 0645", "0633 062E 064A", "0646 062C 064A", "0635 0644 06D2", "0642 0644 06D2", "0627 0644 0644 0647", "0627 0643 0628 0631", "0645 062D 0645 062F", "0635 0644 0639 0645", "0631 0633 0648 0644", "0639 0644 064A 0647", "0648 0633 0644 0645", "0635 0644 0649", "0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645", "062C 0644 0020 062C 0644 0627 0644 0647", "0631 06CC 0627 0644", "002C", "3001", "3002", "003A", "003B", "0021", "003F", "3016", "3017", "2026", "2025", "2014", "2013", "005F", "005F", "0028", "0029", "007B", "007D", "3014", "3015", "3010", "3011", "300A", "300B", "3008", "3009", "300C", "300D", "300E", "300F", "005B", "005D", "203E", "203E", "203E", "203E", "005F", "005F", "005F", "002C", "3001", "002E", "003B", "003A", "003F", "0021", "2014", "0028", "0029", "007B", "007D", "3014", "3015", "0023", "0026", "002A", "002B", "002D", "003C", "003E", "003D", "005C", "0024", "0025", "0040", "0020 064B", "0640 064B", "0020 064C", "0020 064D", "0020 064E", "0640 064E", "0020 064F", "0640 064F", "0020 0650", "0640 0650", "0020 0651", "0640 0651", "0020 0652", "0640 0652", "0621", "0622", "0622", "0623", "0623", "0624", "0624", "0625", "0625", "0626", "0626", "0626", "0626", "0627", "0627", "0628", "0628", "0628", "0628", "0629", "0629", "062A", "062A", "062A", "062A", "062B", "062B", "062B", "062B", "062C", "062C", "062C", "062C", "062D", "062D", "062D", "062D", "062E", "062E", "062E", "062E", "062F", "062F", "0630", "0630", "0631", "0631", "0632", "0632", "0633", "0633", "0633", "0633", "0634", "0634", "0634", "0634", "0635", "0635", "0635", "0635", "0636", "0636", "0636", "0636", "0637", "0637", "0637", "0637", "0638", "0638", "0638", "0638", "0639", "0639", "0639", "0639", "063A", "063A", "063A", "063A", "0641", "0641", "0641", "0641", "0642", "0642", "0642", "0642", "0643", "0643", "0643", "0643", "0644", "0644", "0644", "0644", "0645", "0645", "0645", "0645", "0646", "0646", "0646", "0646", "0647", "0647", "0647", "0647", "0648", "0648", "0649", "0649", "064A", "064A", "064A", "064A", "0644 0622", "0644 0622", "0644 0623", "0644 0623", "0644 0625", "0644 0625", "0644 0627", "0644 0627", "0021", "0022", "0023", "0024", "0025", "0026", "0027", "0028", "0029", "002A", "002B", "002C", "002D", "002E", "002F", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "003A", "003B", "003C", "003D", "003E", "003F", "0040", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "005B", "005C", "005D", "005E", "005F", "0060", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "007B", "007C", "007D", "007E", "2985", "2986", "3002", "300C", "300D", "3001", "30FB", "30F2", "30A1", "30A3", "30A5", "30A7", "30A9", "30E3", "30E5", "30E7", "30C3", "30FC", "30A2", "30A4", "30A6", "30A8", "30AA", "30AB", "30AD", "30AF", "30B1", "30B3", "30B5", "30B7", "30B9", "30BB", "30BD", "30BF", "30C1", "30C4", "30C6", "30C8", "30CA", "30CB", "30CC", "30CD", "30CE", "30CF", "30D2", "30D5", "30D8", "30DB", "30DE", "30DF", "30E0", "30E1", "30E2", "30E4", "30E6", "30E8", "30E9", "30EA", "30EB", "30EC", "30ED", "30EF", "30F3", "3099", "309A", "3164", "3131", "3132", "3133", "3134", "3135", "3136", "3137", "3138", "3139", "313A", "313B", "313C", "313D", "313E", "313F", "3140", "3141", "3142", "3143", "3144", "3145", "3146", "3147", "3148", "3149", "314A", "314B", "314C", "314D", "314E", "314F", "3150", "3151", "3152", "3153", "3154", "3155", "3156", "3157", "3158", "3159", "315A", "315B", "315C", "315D", "315E", "315F", "3160", "3161", "3162", "3163", "00A2", "00A3", "00AC", "00AF", "00A6", "00A5", "20A9", "2502", "2190", "2191", "2192", "2193", "25A0", "25CB", "11099 110BA", "1109B 110BA", "110A5 110BA", "11131 11127", "11132 11127", "11347 1133E", "11347 11357", "114B9 114BA", "114B9 114B0", "114B9 114BD", "115B8 115AF", "115B9 115AF", "1D157 1D165", "1D158 1D165", "1D15F 1D16E", "1D15F 1D16F", "1D15F 1D170", "1D15F 1D171", "1D15F 1D172", "1D1B9 1D165", "1D1BA 1D165", "1D1BB 1D16E", "1D1BC 1D16E", "1D1BB 1D16F", "1D1BC 1D16F", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0043", "0044", "0047", "004A", "004B", "004E", "004F", "0050", "0051", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0066", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0044", "0045", "0046", "0047", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0044", "0045", "0046", "0047", "0049", "004A", "004B", "004C", "004D", "004F", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0131", "0237", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "03DC", "03DD", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0627", "0628", "062C", "062F", "0648", "0632", "062D", "0637", "064A", "0643", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "066E", "06BA", "06A1", "066F", "0628", "062C", "0647", "062D", "064A", "0643", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0634", "062A", "062B", "062E", "0636", "063A", "062C", "062D", "064A", "0644", "0646", "0633", "0639", "0635", "0642", "0634", "062E", "0636", "063A", "06BA", "066F", "0628", "062C", "0647", "062D", "0637", "064A", "0643", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0634", "062A", "062B", "062E", "0636", "0638", "063A", "066E", "06A1", "0627", "0628", "062C", "062F", "0647", "0648", "0632", "062D", "0637", "064A", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "0628", "062C", "062F", "0648", "0632", "062D", "0637", "064A", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "0030 002E", "0030 002C", "0031 002C", "0032 002C", "0033 002C", "0034 002C", "0035 002C", "0036 002C", "0037 002C", "0038 002C", "0039 002C", "0028 0041 0029", "0028 0042 0029", "0028 0043 0029", "0028 0044 0029", "0028 0045 0029", "0028 0046 0029", "0028 0047 0029", "0028 0048 0029", "0028 0049 0029", "0028 004A 0029", "0028 004B 0029", "0028 004C 0029", "0028 004D 0029", "0028 004E 0029", "0028 004F 0029", "0028 0050 0029", "0028 0051 0029", "0028 0052 0029", "0028 0053 0029", "0028 0054 0029", "0028 0055 0029", "0028 0056 0029", "0028 0057 0029", "0028 0058 0029", "0028 0059 0029", "0028 005A 0029", "3014 0053 3015", "0043", "0052", "0043 0044", "0057 005A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0048 0056", "004D 0056", "0053 0044", "0053 0053", "0050 0050 0056", "0057 0043", "004D 0043", "004D 0044", "0044 004A", "307B 304B", "30B3 30B3", "30B5", "624B", "5B57", "53CC", "30C7", "4E8C", "591A", "89E3", "5929", "4EA4", "6620", "7121", "6599", "524D", "5F8C", "518D", "65B0", "521D", "7D42", "751F", "8CA9", "58F0", "5439", "6F14", "6295", "6355", "4E00", "4E09", "904A", "5DE6", "4E2D", "53F3", "6307", "8D70", "6253", "7981", "7A7A", "5408", "6E80", "6709", "6708", "7533", "5272", "55B6", "3014 672C 3015", "3014 4E09 3015", "3014 4E8C 3015", "3014 5B89 3015", "3014 70B9 3015", "3014 6253 3015", "3014 76D7 3015", "3014 52DD 3015", "3014 6557 3015", "5F97", "53EF", "4E3D", "4E38", "4E41", "20122", "4F60", "4FAE", "4FBB", "5002", "507A", "5099", "50E7", "50CF", "349E", "2063A", "514D", "5154", "5164", "5177", "2051C", "34B9", "5167", "518D", "2054B", "5197", "51A4", "4ECC", "51AC", "51B5", "291DF", "51F5", "5203", "34DF", "523B", "5246", "5272", "5277", "3515", "52C7", "52C9", "52E4", "52FA", "5305", "5306", "5317", "5349", "5351", "535A", "5373", "537D", "537F", "537F", "537F", "20A2C", "7070", "53CA", "53DF", "20B63", "53EB", "53F1", "5406", "549E", "5438", "5448", "5468", "54A2", "54F6", "5510", "5553", "5563", "5584", "5584", "5599", "55AB", "55B3", "55C2", "5716", "5606", "5717", "5651", "5674", "5207", "58EE", "57CE", "57F4", "580D", "578B", "5832", "5831", "58AC", "214E4", "58F2", "58F7", "5906", "591A", "5922", "5962", "216A8", "216EA", "59EC", "5A1B", "5A27", "59D8", "5A66", "36EE", "36FC", "5B08", "5B3E", "5B3E", "219C8", "5BC3", "5BD8", "5BE7", "5BF3", "21B18", "5BFF", "5C06", "5F53", "5C22", "3781", "5C60", "5C6E", "5CC0", "5C8D", "21DE4", "5D43", "21DE6", "5D6E", "5D6B", "5D7C", "5DE1", "5DE2", "382F", "5DFD", "5E28", "5E3D", "5E69", "3862", "22183", "387C", "5EB0", "5EB3", "5EB6", "5ECA", "2A392", "5EFE", "22331", "22331", "8201", "5F22", "5F22", "38C7", "232B8", "261DA", "5F62", "5F6B", "38E3", "5F9A", "5FCD", "5FD7", "5FF9", "6081", "393A", "391C", "6094", "226D4", "60C7", "6148", "614C", "614E", "614C", "617A", "618E", "61B2", "61A4", "61AF", "61DE", "61F2", "61F6", "6210", "621B", "625D", "62B1", "62D4", "6350", "22B0C", "633D", "62FC", "6368", "6383", "63E4", "22BF1", "6422", "63C5", "63A9", "3A2E", "6469", "647E", "649D", "6477", "3A6C", "654F", "656C", "2300A", "65E3", "66F8", "6649", "3B19", "6691", "3B08", "3AE4", "5192", "5195", "6700", "669C", "80AD", "43D9", "6717", "671B", "6721", "675E", "6753", "233C3", "3B49", "67FA", "6785", "6852", "6885", "2346D", "688E", "681F", "6914", "3B9D", "6942", "69A3", "69EA", "6AA8", "236A3", "6ADB", "3C18", "6B21", "238A7", "6B54", "3C4E", "6B72", "6B9F", "6BBA", "6BBB", "23A8D", "21D0B", "23AFA", "6C4E", "23CBC", "6CBF", "6CCD", "6C67", "6D16", "6D3E", "6D77", "6D41", "6D69", "6D78", "6D85", "23D1E", "6D34", "6E2F", "6E6E", "3D33", "6ECB", "6EC7", "23ED1", "6DF9", "6F6E", "23F5E", "23F8E", "6FC6", "7039", "701E", "701B", "3D96", "704A", "707D", "7077", "70AD", "20525", "7145", "24263", "719C", "243AB", "7228", "7235", "7250", "24608", "7280", "7295", "24735", "24814", "737A", "738B", "3EAC", "73A5", "3EB8", "3EB8", "7447", "745C", "7471", "7485", "74CA", "3F1B", "7524", "24C36", "753E", "24C92", "7570", "2219F", "7610", "24FA1", "24FB8", "25044", "3FFC", "4008", "76F4", "250F3", "250F2", "25119", "25133", "771E", "771F", "771F", "774A", "4039", "778B", "4046", "4096", "2541D", "784E", "788C", "78CC", "40E3", "25626", "7956", "2569A", "256C5", "798F", "79EB", "412F", "7A40", "7A4A", "7A4F", "2597C", "25AA7", "25AA7", "7AEE", "4202", "25BAB", "7BC6", "7BC9", "4227", "25C80", "7CD2", "42A0", "7CE8", "7CE3", "7D00", "25F86", "7D63", "4301", "7DC7", "7E02", "7E45", "4334", "26228", "26247", "4359", "262D9", "7F7A", "2633E", "7F95", "7FFA", "8005", "264DA", "26523", "8060", "265A8", "8070", "2335F", "43D5", "80B2", "8103", "440B", "813E", "5AB5", "267A7", "267B5", "23393", "2339C", "8201", "8204", "8F9E", "446B", "8291", "828B", "829D", "52B3", "82B1", "82B3", "82BD", "82E6", "26B3C", "82E5", "831D", "8363", "83AD", "8323", "83BD", "83E7", "8457", "8353", "83CA", "83CC", "83DC", "26C36", "26D6B", "26CD5", "452B", "84F1", "84F3", "8516", "273CA", "8564", "26F2C", "455D", "4561", "26FB1", "270D2", "456B", "8650", "865C", "8667", "8669", "86A9", "8688", "870E", "86E2", "8779", "8728", "876B", "8786", "45D7", "87E1", "8801", "45F9", "8860", "8863", "27667", "88D7", "88DE", "4635", "88FA", "34BB", "278AE", "27966", "46BE", "46C7", "8AA0", "8AED", "8B8A", "8C55", "27CA8", "8CAB", "8CC1", "8D1B", "8D77", "27F2F", "20804", "8DCB", "8DBC", "8DF0", "208DE", "8ED4", "8F38", "285D2", "285ED", "9094", "90F1", "9111", "2872E", "911B", "9238", "92D7", "92D8", "927C", "93F9", "9415", "28BFA", "958B", "4995", "95B7", "28D77", "49E6", "96C3", "5DB2", "9723", "29145", "2921A", "4A6E", "4A76", "97E0", "2940A", "4AB2", "29496", "980B", "980B", "9829", "295B6", "98E2", "4B33", "9929", "99A7", "99C2", "99FE", "4BCE", "29B30", "9B12", "9C40", "9CFD", "4CCE", "4CED", "9D67", "2A0CE", "4CF8", "2A105", "2A20E", "2A291", "9EBB", "4D56", "9EF9", "9EFE", "9F05", "9F0F", "9F16", "9F3B", "2A600", }; static char *Block_enums[263] = { "No_Block", "Basic Latin", "Latin-1 Supplement", "Latin Extended-A", "Latin Extended-B", "IPA Extensions", "Spacing Modifier Letters", "Combining Diacritical Marks", "Greek and Coptic", "Cyrillic", "Cyrillic Supplement", "Armenian", "Hebrew", "Arabic", "Syriac", "Arabic Supplement", "Thaana", "NKo", "Samaritan", "Mandaic", "Arabic Extended-A", "Devanagari", "Bengali", "Gurmukhi", "Gujarati", "Oriya", "Tamil", "Telugu", "Kannada", "Malayalam", "Sinhala", "Thai", "Lao", "Tibetan", "Myanmar", "Georgian", "Hangul Jamo", "Ethiopic", "Ethiopic Supplement", "Cherokee", "Unified Canadian Aboriginal Syllabics", "Ogham", "Runic", "Tagalog", "Hanunoo", "Buhid", "Tagbanwa", "Khmer", "Mongolian", "Unified Canadian Aboriginal Syllabics Extended", "Limbu", "Tai Le", "New Tai Lue", "Khmer Symbols", "Buginese", "Tai Tham", "Combining Diacritical Marks Extended", "Balinese", "Sundanese", "Batak", "Lepcha", "Ol Chiki", "Sundanese Supplement", "Vedic Extensions", "Phonetic Extensions", "Phonetic Extensions Supplement", "Combining Diacritical Marks Supplement", "Latin Extended Additional", "Greek Extended", "General Punctuation", "Superscripts and Subscripts", "Currency Symbols", "Combining Diacritical Marks for Symbols", "Letterlike Symbols", "Number Forms", "Arrows", "Mathematical Operators", "Miscellaneous Technical", "Control Pictures", "Optical Character Recognition", "Enclosed Alphanumerics", "Box Drawing", "Block Elements", "Geometric Shapes", "Miscellaneous Symbols", "Dingbats", "Miscellaneous Mathematical Symbols-A", "Supplemental Arrows-A", "Braille Patterns", "Supplemental Arrows-B", "Miscellaneous Mathematical Symbols-B", "Supplemental Mathematical Operators", "Miscellaneous Symbols and Arrows", "Glagolitic", "Latin Extended-C", "Coptic", "Georgian Supplement", "Tifinagh", "Ethiopic Extended", "Cyrillic Extended-A", "Supplemental Punctuation", "CJK Radicals Supplement", "Kangxi Radicals", "Ideographic Description Characters", "CJK Symbols and Punctuation", "Hiragana", "Katakana", "Bopomofo", "Hangul Compatibility Jamo", "Kanbun", "Bopomofo Extended", "CJK Strokes", "Katakana Phonetic Extensions", "Enclosed CJK Letters and Months", "CJK Compatibility", "CJK Unified Ideographs Extension A", "Yijing Hexagram Symbols", "CJK Unified Ideographs", "Yi Syllables", "Yi Radicals", "Lisu", "Vai", "Cyrillic Extended-B", "Bamum", "Modifier Tone Letters", "Latin Extended-D", "Syloti Nagri", "Common Indic Number Forms", "Phags-pa", "Saurashtra", "Devanagari Extended", "Kayah Li", "Rejang", "Hangul Jamo Extended-A", "Javanese", "Myanmar Extended-B", "Cham", "Myanmar Extended-A", "Tai Viet", "Meetei Mayek Extensions", "Ethiopic Extended-A", "Latin Extended-E", "Cherokee Supplement", "Meetei Mayek", "Hangul Syllables", "Hangul Jamo Extended-B", "High Surrogates", "High Private Use Surrogates", "Low Surrogates", "Private Use Area", "CJK Compatibility Ideographs", "Alphabetic Presentation Forms", "Arabic Presentation Forms-A", "Variation Selectors", "Vertical Forms", "Combining Half Marks", "CJK Compatibility Forms", "Small Form Variants", "Arabic Presentation Forms-B", "Halfwidth and Fullwidth Forms", "Specials", "Linear B Syllabary", "Linear B Ideograms", "Aegean Numbers", "Ancient Greek Numbers", "Ancient Symbols", "Phaistos Disc", "Lycian", "Carian", "Coptic Epact Numbers", "Old Italic", "Gothic", "Old Permic", "Ugaritic", "Old Persian", "Deseret", "Shavian", "Osmanya", "Elbasan", "Caucasian Albanian", "Linear A", "Cypriot Syllabary", "Imperial Aramaic", "Palmyrene", "Nabataean", "Hatran", "Phoenician", "Lydian", "Meroitic Hieroglyphs", "Meroitic Cursive", "Kharoshthi", "Old South Arabian", "Old North Arabian", "Manichaean", "Avestan", "Inscriptional Parthian", "Inscriptional Pahlavi", "Psalter Pahlavi", "Old Turkic", "Old Hungarian", "Rumi Numeral Symbols", "Brahmi", "Kaithi", "Sora Sompeng", "Chakma", "Mahajani", "Sharada", "Sinhala Archaic Numbers", "Khojki", "Multani", "Khudawadi", "Grantha", "Tirhuta", "Siddham", "Modi", "Takri", "Ahom", "Warang Citi", "Pau Cin Hau", "Cuneiform", "Cuneiform Numbers and Punctuation", "Early Dynastic Cuneiform", "Egyptian Hieroglyphs", "Anatolian Hieroglyphs", "Bamum Supplement", "Mro", "Bassa Vah", "Pahawh Hmong", "Miao", "Kana Supplement", "Duployan", "Shorthand Format Controls", "Byzantine Musical Symbols", "Musical Symbols", "Ancient Greek Musical Notation", "Tai Xuan Jing Symbols", "Counting Rod Numerals", "Mathematical Alphanumeric Symbols", "Sutton SignWriting", "Mende Kikakui", "Arabic Mathematical Alphabetic Symbols", "Mahjong Tiles", "Domino Tiles", "Playing Cards", "Enclosed Alphanumeric Supplement", "Enclosed Ideographic Supplement", "Miscellaneous Symbols and Pictographs", "Emoticons", "Ornamental Dingbats", "Transport and Map Symbols", "Alchemical Symbols", "Geometric Shapes Extended", "Supplemental Arrows-C", "Supplemental Symbols and Pictographs", "CJK Unified Ideographs Extension B", "CJK Unified Ideographs Extension C", "CJK Unified Ideographs Extension D", "CJK Unified Ideographs Extension E", "CJK Compatibility Ideographs Supplement", "Tags", "Variation Selectors Supplement", "Supplementary Private Use Area-A", "Supplementary Private Use Area-B", }; static char *Bidi_Mirroring_Glyph_enums[365] = { "", "0029", "0028", "003E", "003C", "005D", "005B", "007D", "007B", "00BB", "00AB", "0F3B", "0F3A", "0F3D", "0F3C", "169C", "169B", "203A", "2039", "2046", "2045", "207E", "207D", "208E", "208D", "220B", "220C", "220D", "2208", "2209", "220A", "29F5", "223D", "223C", "22CD", "2253", "2252", "2255", "2254", "2265", "2264", "2267", "2266", "2269", "2268", "226B", "226A", "226F", "226E", "2271", "2270", "2273", "2272", "2275", "2274", "2277", "2276", "2279", "2278", "227B", "227A", "227D", "227C", "227F", "227E", "2281", "2280", "2283", "2282", "2285", "2284", "2287", "2286", "2289", "2288", "228B", "228A", "2290", "228F", "2292", "2291", "29B8", "22A3", "22A2", "2ADE", "2AE4", "2AE3", "2AE5", "22B1", "22B0", "22B3", "22B2", "22B5", "22B4", "22B7", "22B6", "22CA", "22C9", "22CC", "22CB", "2243", "22D1", "22D0", "22D7", "22D6", "22D9", "22D8", "22DB", "22DA", "22DD", "22DC", "22DF", "22DE", "22E1", "22E0", "22E3", "22E2", "22E5", "22E4", "22E7", "22E6", "22E9", "22E8", "22EB", "22EA", "22ED", "22EC", "22F1", "22F0", "22FA", "22FB", "22FC", "22FD", "22FE", "22F2", "22F3", "22F4", "22F6", "22F7", "2309", "2308", "230B", "230A", "232A", "2329", "2769", "2768", "276B", "276A", "276D", "276C", "276F", "276E", "2771", "2770", "2773", "2772", "2775", "2774", "27C4", "27C3", "27C6", "27C5", "27C9", "27C8", "27CD", "27CB", "27D6", "27D5", "27DE", "27DD", "27E3", "27E2", "27E5", "27E4", "27E7", "27E6", "27E9", "27E8", "27EB", "27EA", "27ED", "27EC", "27EF", "27EE", "2984", "2983", "2986", "2985", "2988", "2987", "298A", "2989", "298C", "298B", "2990", "298F", "298E", "298D", "2992", "2991", "2994", "2993", "2996", "2995", "2998", "2997", "2298", "29C1", "29C0", "29C5", "29C4", "29D0", "29CF", "29D2", "29D1", "29D5", "29D4", "29D9", "29D8", "29DB", "29DA", "2215", "29F9", "29F8", "29FD", "29FC", "2A2C", "2A2B", "2A2E", "2A2D", "2A35", "2A34", "2A3D", "2A3C", "2A65", "2A64", "2A7A", "2A79", "2A7E", "2A7D", "2A80", "2A7F", "2A82", "2A81", "2A84", "2A83", "2A8C", "2A8B", "2A92", "2A91", "2A94", "2A93", "2A96", "2A95", "2A98", "2A97", "2A9A", "2A99", "2A9C", "2A9B", "2AA2", "2AA1", "2AA7", "2AA6", "2AA9", "2AA8", "2AAB", "2AAA", "2AAD", "2AAC", "2AB0", "2AAF", "2AB4", "2AB3", "2ABC", "2ABB", "2ABE", "2ABD", "2AC0", "2ABF", "2AC2", "2AC1", "2AC4", "2AC3", "2AC6", "2AC5", "2ACE", "2ACD", "2AD0", "2ACF", "2AD2", "2AD1", "2AD4", "2AD3", "2AD6", "2AD5", "22A6", "22A9", "22A8", "22AB", "2AED", "2AEC", "2AF8", "2AF7", "2AFA", "2AF9", "2E03", "2E02", "2E05", "2E04", "2E0A", "2E09", "2E0D", "2E0C", "2E1D", "2E1C", "2E21", "2E20", "2E23", "2E22", "2E25", "2E24", "2E27", "2E26", "2E29", "2E28", "3009", "3008", "300B", "300A", "300D", "300C", "300F", "300E", "3011", "3010", "3015", "3014", "3017", "3016", "3019", "3018", "301B", "301A", "FE5A", "FE59", "FE5C", "FE5B", "FE5E", "FE5D", "FE65", "FE64", "FF09", "FF08", "FF1E", "FF1C", "FF3D", "FF3B", "FF5D", "FF5B", "FF60", "FF5F", "FF63", "FF62", }; static char *Joining_Type_enums[5] = { "U", "D", "R", "C", "L", }; static char *Numeric_Value_enums[131] = { "NaN", "-0.5", "0.0", "0.0625", "0.08333333", "0.1", "0.11111111", "0.125", "0.14285714", "0.16666667", "0.1875", "0.2", "0.25", "0.33333333", "0.375", "0.4", "0.41666667", "0.5", "0.58333333", "0.6", "0.625", "0.66666667", "0.75", "0.8", "0.83333333", "0.875", "0.91666667", "1.0", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5", "8.0", "8.5", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "20.0", "21.0", "22.0", "23.0", "24.0", "25.0", "26.0", "27.0", "28.0", "29.0", "30.0", "31.0", "32.0", "33.0", "34.0", "35.0", "36.0", "37.0", "38.0", "39.0", "40.0", "41.0", "42.0", "43.0", "44.0", "45.0", "46.0", "47.0", "48.0", "49.0", "50.0", "60.0", "70.0", "80.0", "90.0", "100.0", "200.0", "300.0", "400.0", "500.0", "600.0", "700.0", "800.0", "900.0", "1000.0", "2000.0", "3000.0", "4000.0", "5000.0", "6000.0", "7000.0", "8000.0", "9000.0", "10000.0", "20000.0", "30000.0", "40000.0", "50000.0", "60000.0", "70000.0", "80000.0", "90000.0", "100000.0", "200000.0", "216000.0", "300000.0", "400000.0", "432000.0", "500000.0", "600000.0", "700000.0", "800000.0", "900000.0", "1000000.0", "100000000.0", "10000000000.0", "1000000000000.0", }; static char *Script_enums[132] = { "Unknown", "Common", "Latin", "Greek", "Cyrillic", "Armenian", "Hebrew", "Arabic", "Syriac", "Thaana", "Devanagari", "Bengali", "Gurmukhi", "Gujarati", "Oriya", "Tamil", "Telugu", "Kannada", "Malayalam", "Sinhala", "Thai", "Lao", "Tibetan", "Myanmar", "Georgian", "Hangul", "Ethiopic", "Cherokee", "Canadian_Aboriginal", "Ogham", "Runic", "Khmer", "Mongolian", "Hiragana", "Katakana", "Bopomofo", "Han", "Yi", "Old_Italic", "Gothic", "Deseret", "Inherited", "Tagalog", "Hanunoo", "Buhid", "Tagbanwa", "Limbu", "Tai_Le", "Linear_B", "Ugaritic", "Shavian", "Osmanya", "Cypriot", "Braille", "Buginese", "Coptic", "New_Tai_Lue", "Glagolitic", "Tifinagh", "Syloti_Nagri", "Old_Persian", "Kharoshthi", "Balinese", "Cuneiform", "Phoenician", "Phags_Pa", "Nko", "Sundanese", "Lepcha", "Ol_Chiki", "Vai", "Saurashtra", "Kayah_Li", "Rejang", "Lycian", "Carian", "Lydian", "Cham", "Tai_Tham", "Tai_Viet", "Avestan", "Egyptian_Hieroglyphs", "Samaritan", "Lisu", "Bamum", "Javanese", "Meetei_Mayek", "Imperial_Aramaic", "Old_South_Arabian", "Inscriptional_Parthian", "Inscriptional_Pahlavi", "Old_Turkic", "Kaithi", "Batak", "Brahmi", "Mandaic", "Chakma", "Meroitic_Cursive", "Meroitic_Hieroglyphs", "Miao", "Sharada", "Sora_Sompeng", "Takri", "Caucasian_Albanian", "Bassa_Vah", "Duployan", "Elbasan", "Grantha", "Pahawh_Hmong", "Khojki", "Linear_A", "Mahajani", "Manichaean", "Mende_Kikakui", "Modi", "Mro", "Old_North_Arabian", "Nabataean", "Palmyrene", "Pau_Cin_Hau", "Old_Permic", "Psalter_Pahlavi", "Siddham", "Khudawadi", "Tirhuta", "Warang_Citi", "Ahom", "Anatolian_Hieroglyphs", "Hatran", "Multani", "Old_Hungarian", "SignWriting", }; static char *Numeric_Value_Numerator_enums[99] = { "NaN", "-1", "0", "1", "3", "2", "5", "7", "4", "11", "9", "6", "13", "15", "8", "17", "10", "12", "14", "16", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "60", "70", "80", "90", "100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "2000", "3000", "4000", "5000", "6000", "7000", "8000", "9000", "10000", "20000", "30000", "40000", "50000", "60000", "70000", "80000", "90000", "100000", "200000", "216000", "300000", "400000", "432000", "500000", "600000", "700000", "800000", "900000", "1000000", "100000000", "10000000000", "1000000000000", }; static char *Joining_Group_enums[86] = { "No_Joining_Group", "YEH", "ALEF", "WAW", "BEH", "TEH MARBUTA", "HAH", "DAL", "REH", "SEEN", "SAD", "TAH", "AIN", "GAF", "FARSI YEH", "FEH", "QAF", "KAF", "LAM", "MEEM", "NOON", "HEH", "SWASH KAF", "NYA", "KNOTTED HEH", "HEH GOAL", "TEH MARBUTA GOAL", "YEH WITH TAIL", "YEH BARREE", "ALAPH", "BETH", "GAMAL", "DALATH RISH", "HE", "SYRIAC WAW", "ZAIN", "HETH", "TETH", "YUDH", "YUDH HE", "KAPH", "LAMADH", "MIM", "NUN", "SEMKATH", "FINAL SEMKATH", "E", "PE", "REVERSED PE", "SADHE", "QAPH", "SHIN", "TAW", "ZHAIN", "KHAPH", "FE", "BURUSHASKI YEH BARREE", "ROHINGYA YEH", "STRAIGHT WAW", "MANICHAEAN ALEPH", "MANICHAEAN BETH", "MANICHAEAN GIMEL", "MANICHAEAN DALETH", "MANICHAEAN WAW", "MANICHAEAN ZAYIN", "MANICHAEAN HETH", "MANICHAEAN TETH", "MANICHAEAN YODH", "MANICHAEAN KAPH", "MANICHAEAN LAMEDH", "MANICHAEAN DHAMEDH", "MANICHAEAN THAMEDH", "MANICHAEAN MEM", "MANICHAEAN NUN", "MANICHAEAN SAMEKH", "MANICHAEAN AYIN", "MANICHAEAN PE", "MANICHAEAN SADHE", "MANICHAEAN QOPH", "MANICHAEAN RESH", "MANICHAEAN TAW", "MANICHAEAN ONE", "MANICHAEAN FIVE", "MANICHAEAN TEN", "MANICHAEAN TWENTY", "MANICHAEAN HUNDRED", }; static char *NFG_QC_enums[3] = { "N", "Y", "M", }; static char *Canonical_Combining_Class_enums[56] = { "Not_Reordered", "0", "1", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "84", "91", "103", "107", "118", "122", "129", "130", "132", "202", "214", "216", "218", "220", "222", "224", "226", "228", "230", "232", "233", "234", "240", }; static char *Age_enums[18] = { "Unassigned", "1.1", "2.0", "2.1", "3.0", "3.1", "3.2", "4.0", "4.1", "5.0", "5.1", "5.2", "6.0", "6.1", "6.2", "6.3", "7.0", "8.0", }; static char *Bidi_Class_enums[23] = { "L", "R", "EN", "ES", "ET", "AN", "CS", "B", "S", "WS", "ON", "BN", "NSM", "AL", "LRO", "RLO", "LRE", "RLE", "PDF", "LRI", "RLI", "FSI", "PDI", }; static char *Word_Break_enums[17] = { "Other", "Double_Quote", "Single_Quote", "Hebrew_Letter", "CR", "LF", "Newline", "Extend", "Regional_Indicator", "Format", "Katakana", "ALetter", "MidLetter", "MidNum", "MidNumLet", "Numeric", "ExtendNumLet", }; static char *General_Category_enums[30] = { "Cn", "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Me", "Mc", "Nd", "Nl", "No", "Zs", "Zl", "Zp", "Cc", "Cf", "Co", "Cs", "Pd", "Ps", "Pe", "Pc", "Po", "Sm", "Sc", "Sk", "So", "Pi", "Pf", }; static char *Decomposition_Type_enums[18] = { "None", "Canonical", "Compat", "Font", "Nobreak", "Initial", "Medial", "Final", "Isolated", "Circle", "Super", "Sub", "Vertical", "Wide", "Narrow", "Small", "Square", "Fraction", }; static char *Line_Break_enums[16] = { "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW", "NL", "WJ", "JL", "JV", "JT", "H2", "H3", }; static char *Numeric_Value_Denominator_enums[13] = { "NaN", "2", "1", "16", "12", "10", "9", "8", "7", "6", "5", "4", "3", }; static char *Sentence_Break_enums[15] = { "Other", "CR", "LF", "Extend", "Sep", "Format", "Sp", "Lower", "Upper", "OLetter", "Numeric", "ATerm", "STerm", "Close", "SContinue", }; static char *Grapheme_Cluster_Break_enums[12] = { "Other", "CR", "LF", "Control", "Extend", "Regional_Indicator", "SpacingMark", "L", "V", "T", "LV", "LVT", }; static char *Hangul_Syllable_Type_enums[6] = { "Not_Applicable", "L", "V", "T", "LV", "LVT", }; static char *Numeric_Type_enums[4] = { "None", "Numeric", "", "Decimal", }; static char *NFKC_QC_enums[3] = { "N", "Y", "M", }; static char *NFC_QC_enums[3] = { "N", "Y", "M", }; static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint32 codepoint); static const char *bogus = ""; /* only for table too short; return null string for no mapping */ static const char* MVM_unicode_get_property_str(MVMThreadContext *tc, MVMint32 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; if (codepoint_row == -1) /* non-existent codepoint; XXX should throw? */ return ""; bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return ""; case MVM_UNICODE_PROPERTY_DECOMP_SPEC: /* Decomp_Spec bits:13 offset:0 */ result_val |= ((props_bitfield[bitfield_row][0] & 0xfff80000) >> 19); /* mask: 11111111111110000000000000000000 */ return result_val < 5722 ? Decomp_Spec_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_BLOCK: /* Block bits:9 offset:11 */ result_val |= ((props_bitfield[bitfield_row][1] & 0x1ff000) >> 12); /* mask: 00000000000111111111000000000000 */ return result_val < 263 ? Block_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_BIDI_MIRRORING_GLYPH: /* Bidi_Mirroring_Glyph bits:9 offset:20 */ result_val |= ((props_bitfield[bitfield_row][1] & 0xff8) >> 3); /* mask: 00000000000000000000111111111000 */ return result_val < 365 ? Bidi_Mirroring_Glyph_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_JOINING_TYPE: /* Joining_Type bits:3 offset:29 */ result_val |= ((props_bitfield[bitfield_row][1] & 0x7) >> 0); /* mask: 00000000000000000000000000000111 */ return result_val < 5 ? Joining_Type_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE: /* Numeric_Value bits:8 offset:0 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xff000000) >> 24); /* mask: 11111111000000000000000000000000 */ return result_val < 131 ? Numeric_Value_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_SCRIPT: /* Script bits:8 offset:8 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xff0000) >> 16); /* mask: 00000000111111110000000000000000 */ return result_val < 132 ? Script_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR: /* Numeric_Value_Numerator bits:7 offset:16 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xfe00) >> 9); /* mask: 00000000000000001111111000000000 */ return result_val < 99 ? Numeric_Value_Numerator_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_JOINING_GROUP: /* Joining_Group bits:7 offset:23 */ result_val |= ((props_bitfield[bitfield_row][2] & 0x1fc) >> 2); /* mask: 00000000000000000000000111111100 */ return result_val < 86 ? Joining_Group_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NFG_QC: /* NFG_QC bits:2 offset:30 */ result_val |= ((props_bitfield[bitfield_row][2] & 0x3) >> 0); /* mask: 00000000000000000000000000000011 */ return result_val < 3 ? NFG_QC_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS: /* Canonical_Combining_Class bits:6 offset:0 */ result_val |= ((props_bitfield[bitfield_row][3] & 0xfc000000) >> 26); /* mask: 11111100000000000000000000000000 */ return result_val < 56 ? Canonical_Combining_Class_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_AGE: /* Age bits:5 offset:6 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x3e00000) >> 21); /* mask: 00000011111000000000000000000000 */ return result_val < 18 ? Age_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_BIDI_CLASS: /* Bidi_Class bits:5 offset:11 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x1f0000) >> 16); /* mask: 00000000000111110000000000000000 */ return result_val < 23 ? Bidi_Class_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_WORD_BREAK: /* Word_Break bits:5 offset:16 */ result_val |= ((props_bitfield[bitfield_row][3] & 0xf800) >> 11); /* mask: 00000000000000001111100000000000 */ return result_val < 17 ? Word_Break_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_GENERAL_CATEGORY: /* General_Category bits:5 offset:21 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x7c0) >> 6); /* mask: 00000000000000000000011111000000 */ return result_val < 30 ? General_Category_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE: /* Decomposition_Type bits:5 offset:26 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x3e) >> 1); /* mask: 00000000000000000000000000111110 */ return result_val < 18 ? Decomposition_Type_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_LINE_BREAK: /* Line_Break bits:4 offset:0 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xf0000000) >> 28); /* mask: 11110000000000000000000000000000 */ return result_val < 16 ? Line_Break_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR: /* Numeric_Value_Denominator bits:4 offset:4 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xf000000) >> 24); /* mask: 00001111000000000000000000000000 */ return result_val < 13 ? Numeric_Value_Denominator_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_SENTENCE_BREAK: /* Sentence_Break bits:4 offset:8 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xf00000) >> 20); /* mask: 00000000111100000000000000000000 */ return result_val < 15 ? Sentence_Break_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK: /* Grapheme_Cluster_Break bits:4 offset:12 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xf0000) >> 16); /* mask: 00000000000011110000000000000000 */ return result_val < 12 ? Grapheme_Cluster_Break_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE: /* Hangul_Syllable_Type bits:3 offset:16 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xe000) >> 13); /* mask: 00000000000000001110000000000000 */ return result_val < 6 ? Hangul_Syllable_Type_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_TYPE: /* Numeric_Type bits:2 offset:19 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x1800) >> 11); /* mask: 00000000000000000001100000000000 */ return result_val < 4 ? Numeric_Type_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NFKC_QC: /* NFKC_QC bits:2 offset:21 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x600) >> 9); /* mask: 00000000000000000000011000000000 */ return result_val < 3 ? NFKC_QC_enums[result_val] : bogus; case MVM_UNICODE_PROPERTY_NFC_QC: /* NFC_QC bits:2 offset:23 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x180) >> 7); /* mask: 00000000000000000000000110000000 */ return result_val < 3 ? NFC_QC_enums[result_val] : bogus; default: return ""; } } static MVMint32 MVM_unicode_get_property_int(MVMThreadContext *tc, MVMint32 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; if (codepoint_row == -1) /* non-existent codepoint; XXX should throw? */ return 0; bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return 0; case MVM_UNICODE_PROPERTY_DECOMP_SPEC: /* Decomp_Spec bits:13 offset:0 */ return ((props_bitfield[bitfield_row][0] & 0xfff80000) >> 19); /* mask: 11111111111110000000000000000000 */ case MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX: /* Case_Change_Index bits:12 offset:13 */ return ((props_bitfield[bitfield_row][0] & 0x7ff80) >> 7); /* mask: 00000000000001111111111110000000 */ case MVM_UNICODE_PROPERTY_SPECIAL_CASING: /* Special_Casing bits:7 offset:25 */ return ((props_bitfield[bitfield_row][0] & 0x7f) >> 0); /* mask: 00000000000000000000000001111111 */ case MVM_UNICODE_PROPERTY_CASE_FOLDING: /* Case_Folding bits:11 offset:0 */ return ((props_bitfield[bitfield_row][1] & 0xffe00000) >> 21); /* mask: 11111111111000000000000000000000 */ case MVM_UNICODE_PROPERTY_BLOCK: /* Block bits:9 offset:11 */ return ((props_bitfield[bitfield_row][1] & 0x1ff000) >> 12); /* mask: 00000000000111111111000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_MIRRORING_GLYPH: /* Bidi_Mirroring_Glyph bits:9 offset:20 */ return ((props_bitfield[bitfield_row][1] & 0xff8) >> 3); /* mask: 00000000000000000000111111111000 */ case MVM_UNICODE_PROPERTY_JOINING_TYPE: /* Joining_Type bits:3 offset:29 */ return ((props_bitfield[bitfield_row][1] & 0x7) >> 0); /* mask: 00000000000000000000000000000111 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE: /* Numeric_Value bits:8 offset:0 */ return ((props_bitfield[bitfield_row][2] & 0xff000000) >> 24); /* mask: 11111111000000000000000000000000 */ case MVM_UNICODE_PROPERTY_SCRIPT: /* Script bits:8 offset:8 */ return ((props_bitfield[bitfield_row][2] & 0xff0000) >> 16); /* mask: 00000000111111110000000000000000 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR: /* Numeric_Value_Numerator bits:7 offset:16 */ return ((props_bitfield[bitfield_row][2] & 0xfe00) >> 9); /* mask: 00000000000000001111111000000000 */ case MVM_UNICODE_PROPERTY_JOINING_GROUP: /* Joining_Group bits:7 offset:23 */ return ((props_bitfield[bitfield_row][2] & 0x1fc) >> 2); /* mask: 00000000000000000000000111111100 */ case MVM_UNICODE_PROPERTY_NFG_QC: /* NFG_QC bits:2 offset:30 */ return ((props_bitfield[bitfield_row][2] & 0x3) >> 0); /* mask: 00000000000000000000000000000011 */ case MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS: /* Canonical_Combining_Class bits:6 offset:0 */ return ((props_bitfield[bitfield_row][3] & 0xfc000000) >> 26); /* mask: 11111100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_AGE: /* Age bits:5 offset:6 */ return ((props_bitfield[bitfield_row][3] & 0x3e00000) >> 21); /* mask: 00000011111000000000000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_CLASS: /* Bidi_Class bits:5 offset:11 */ return ((props_bitfield[bitfield_row][3] & 0x1f0000) >> 16); /* mask: 00000000000111110000000000000000 */ case MVM_UNICODE_PROPERTY_WORD_BREAK: /* Word_Break bits:5 offset:16 */ return ((props_bitfield[bitfield_row][3] & 0xf800) >> 11); /* mask: 00000000000000001111100000000000 */ case MVM_UNICODE_PROPERTY_GENERAL_CATEGORY: /* General_Category bits:5 offset:21 */ return ((props_bitfield[bitfield_row][3] & 0x7c0) >> 6); /* mask: 00000000000000000000011111000000 */ case MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE: /* Decomposition_Type bits:5 offset:26 */ return ((props_bitfield[bitfield_row][3] & 0x3e) >> 1); /* mask: 00000000000000000000000000111110 */ case MVM_UNICODE_PROPERTY_DIGIT: /* Digit bits:2 offset:0 */ return ((props_bitfield[bitfield_row][0] & 0xc0000000) >> 30); /* mask: 11000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT: /* ASCII_Hex_Digit bits:1 offset:31 */ return ((props_bitfield[bitfield_row][3] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_LINE_BREAK: /* Line_Break bits:4 offset:0 */ return ((props_bitfield[bitfield_row][4] & 0xf0000000) >> 28); /* mask: 11110000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR: /* Numeric_Value_Denominator bits:4 offset:4 */ return ((props_bitfield[bitfield_row][4] & 0xf000000) >> 24); /* mask: 00001111000000000000000000000000 */ case MVM_UNICODE_PROPERTY_SENTENCE_BREAK: /* Sentence_Break bits:4 offset:8 */ return ((props_bitfield[bitfield_row][4] & 0xf00000) >> 20); /* mask: 00000000111100000000000000000000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK: /* Grapheme_Cluster_Break bits:4 offset:12 */ return ((props_bitfield[bitfield_row][4] & 0xf0000) >> 16); /* mask: 00000000000011110000000000000000 */ case MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE: /* Hangul_Syllable_Type bits:3 offset:16 */ return ((props_bitfield[bitfield_row][4] & 0xe000) >> 13); /* mask: 00000000000000001110000000000000 */ case MVM_UNICODE_PROPERTY_NUMERIC_TYPE: /* Numeric_Type bits:2 offset:19 */ return ((props_bitfield[bitfield_row][4] & 0x1800) >> 11); /* mask: 00000000000000000001100000000000 */ case MVM_UNICODE_PROPERTY_NFKC_QC: /* NFKC_QC bits:2 offset:21 */ return ((props_bitfield[bitfield_row][4] & 0x600) >> 9); /* mask: 00000000000000000000011000000000 */ case MVM_UNICODE_PROPERTY_NFC_QC: /* NFC_QC bits:2 offset:23 */ return ((props_bitfield[bitfield_row][4] & 0x180) >> 7); /* mask: 00000000000000000000000110000000 */ case MVM_UNICODE_PROPERTY_ALPHABETIC: /* Alphabetic bits:1 offset:25 */ return ((props_bitfield[bitfield_row][4] & 0x40) >> 6); /* mask: 00000000000000000000000001000000 */ case MVM_UNICODE_PROPERTY_ANY: /* Any bits:1 offset:26 */ return ((props_bitfield[bitfield_row][4] & 0x20) >> 5); /* mask: 00000000000000000000000000100000 */ case MVM_UNICODE_PROPERTY_ASSIGNED: /* Assigned bits:1 offset:27 */ return ((props_bitfield[bitfield_row][4] & 0x10) >> 4); /* mask: 00000000000000000000000000010000 */ case MVM_UNICODE_PROPERTY_BIDI_CONTROL: /* Bidi_Control bits:1 offset:28 */ return ((props_bitfield[bitfield_row][4] & 0x8) >> 3); /* mask: 00000000000000000000000000001000 */ case MVM_UNICODE_PROPERTY_BIDI_MIRRORED: /* Bidi_Mirrored bits:1 offset:29 */ return ((props_bitfield[bitfield_row][4] & 0x4) >> 2); /* mask: 00000000000000000000000000000100 */ case MVM_UNICODE_PROPERTY_C: /* C bits:1 offset:30 */ return ((props_bitfield[bitfield_row][4] & 0x2) >> 1); /* mask: 00000000000000000000000000000010 */ case MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE: /* Case_Folding_simple bits:1 offset:31 */ return ((props_bitfield[bitfield_row][4] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_CASE_IGNORABLE: /* Case_Ignorable bits:1 offset:0 */ return ((props_bitfield[bitfield_row][5] & 0x80000000) >> 31); /* mask: 10000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CASED: /* Cased bits:1 offset:1 */ return ((props_bitfield[bitfield_row][5] & 0x40000000) >> 30); /* mask: 01000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEFOLDED: /* Changes_When_Casefolded bits:1 offset:2 */ return ((props_bitfield[bitfield_row][5] & 0x20000000) >> 29); /* mask: 00100000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEMAPPED: /* Changes_When_Casemapped bits:1 offset:3 */ return ((props_bitfield[bitfield_row][5] & 0x10000000) >> 28); /* mask: 00010000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_LOWERCASED: /* Changes_When_Lowercased bits:1 offset:4 */ return ((props_bitfield[bitfield_row][5] & 0x8000000) >> 27); /* mask: 00001000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED: /* Changes_When_NFKC_Casefolded bits:1 offset:5 */ return ((props_bitfield[bitfield_row][5] & 0x4000000) >> 26); /* mask: 00000100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_TITLECASED: /* Changes_When_Titlecased bits:1 offset:6 */ return ((props_bitfield[bitfield_row][5] & 0x2000000) >> 25); /* mask: 00000010000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_UPPERCASED: /* Changes_When_Uppercased bits:1 offset:7 */ return ((props_bitfield[bitfield_row][5] & 0x1000000) >> 24); /* mask: 00000001000000000000000000000000 */ case MVM_UNICODE_PROPERTY_DASH: /* Dash bits:1 offset:8 */ return ((props_bitfield[bitfield_row][5] & 0x800000) >> 23); /* mask: 00000000100000000000000000000000 */ case MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT: /* Default_Ignorable_Code_Point bits:1 offset:9 */ return ((props_bitfield[bitfield_row][5] & 0x400000) >> 22); /* mask: 00000000010000000000000000000000 */ case MVM_UNICODE_PROPERTY_DEPRECATED: /* Deprecated bits:1 offset:10 */ return ((props_bitfield[bitfield_row][5] & 0x200000) >> 21); /* mask: 00000000001000000000000000000000 */ case MVM_UNICODE_PROPERTY_DIACRITIC: /* Diacritic bits:1 offset:11 */ return ((props_bitfield[bitfield_row][5] & 0x100000) >> 20); /* mask: 00000000000100000000000000000000 */ case MVM_UNICODE_PROPERTY_EXTENDER: /* Extender bits:1 offset:12 */ return ((props_bitfield[bitfield_row][5] & 0x80000) >> 19); /* mask: 00000000000010000000000000000000 */ case MVM_UNICODE_PROPERTY_FULL_COMPOSITION_EXCLUSION: /* Full_Composition_Exclusion bits:1 offset:13 */ return ((props_bitfield[bitfield_row][5] & 0x40000) >> 18); /* mask: 00000000000001000000000000000000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_BASE: /* Grapheme_Base bits:1 offset:14 */ return ((props_bitfield[bitfield_row][5] & 0x20000) >> 17); /* mask: 00000000000000100000000000000000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND: /* Grapheme_Extend bits:1 offset:15 */ return ((props_bitfield[bitfield_row][5] & 0x10000) >> 16); /* mask: 00000000000000010000000000000000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_LINK: /* Grapheme_Link bits:1 offset:16 */ return ((props_bitfield[bitfield_row][5] & 0x8000) >> 15); /* mask: 00000000000000001000000000000000 */ case MVM_UNICODE_PROPERTY_HEX_DIGIT: /* Hex_Digit bits:1 offset:17 */ return ((props_bitfield[bitfield_row][5] & 0x4000) >> 14); /* mask: 00000000000000000100000000000000 */ case MVM_UNICODE_PROPERTY_HYPHEN: /* Hyphen bits:1 offset:18 */ return ((props_bitfield[bitfield_row][5] & 0x2000) >> 13); /* mask: 00000000000000000010000000000000 */ case MVM_UNICODE_PROPERTY_IDS_BINARY_OPERATOR: /* IDS_Binary_Operator bits:1 offset:19 */ return ((props_bitfield[bitfield_row][5] & 0x1000) >> 12); /* mask: 00000000000000000001000000000000 */ case MVM_UNICODE_PROPERTY_IDS_TRINARY_OPERATOR: /* IDS_Trinary_Operator bits:1 offset:20 */ return ((props_bitfield[bitfield_row][5] & 0x800) >> 11); /* mask: 00000000000000000000100000000000 */ case MVM_UNICODE_PROPERTY_ID_CONTINUE: /* ID_Continue bits:1 offset:21 */ return ((props_bitfield[bitfield_row][5] & 0x400) >> 10); /* mask: 00000000000000000000010000000000 */ case MVM_UNICODE_PROPERTY_ID_START: /* ID_Start bits:1 offset:22 */ return ((props_bitfield[bitfield_row][5] & 0x200) >> 9); /* mask: 00000000000000000000001000000000 */ case MVM_UNICODE_PROPERTY_IDEOGRAPHIC: /* Ideographic bits:1 offset:23 */ return ((props_bitfield[bitfield_row][5] & 0x100) >> 8); /* mask: 00000000000000000000000100000000 */ case MVM_UNICODE_PROPERTY_JOIN_CONTROL: /* Join_Control bits:1 offset:24 */ return ((props_bitfield[bitfield_row][5] & 0x80) >> 7); /* mask: 00000000000000000000000010000000 */ case MVM_UNICODE_PROPERTY_L: /* L bits:1 offset:25 */ return ((props_bitfield[bitfield_row][5] & 0x40) >> 6); /* mask: 00000000000000000000000001000000 */ case MVM_UNICODE_PROPERTY_LC: /* LC bits:1 offset:26 */ return ((props_bitfield[bitfield_row][5] & 0x20) >> 5); /* mask: 00000000000000000000000000100000 */ case MVM_UNICODE_PROPERTY_LOGICAL_ORDER_EXCEPTION: /* Logical_Order_Exception bits:1 offset:27 */ return ((props_bitfield[bitfield_row][5] & 0x10) >> 4); /* mask: 00000000000000000000000000010000 */ case MVM_UNICODE_PROPERTY_LOWERCASE: /* Lowercase bits:1 offset:28 */ return ((props_bitfield[bitfield_row][5] & 0x8) >> 3); /* mask: 00000000000000000000000000001000 */ case MVM_UNICODE_PROPERTY_M: /* M bits:1 offset:29 */ return ((props_bitfield[bitfield_row][5] & 0x4) >> 2); /* mask: 00000000000000000000000000000100 */ case MVM_UNICODE_PROPERTY_MATH: /* Math bits:1 offset:30 */ return ((props_bitfield[bitfield_row][5] & 0x2) >> 1); /* mask: 00000000000000000000000000000010 */ case MVM_UNICODE_PROPERTY_N: /* N bits:1 offset:31 */ return ((props_bitfield[bitfield_row][5] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_NFD_QC: /* NFD_QC bits:1 offset:0 */ return ((props_bitfield[bitfield_row][6] & 0x80000000) >> 31); /* mask: 10000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_NFKD_QC: /* NFKD_QC bits:1 offset:1 */ return ((props_bitfield[bitfield_row][6] & 0x40000000) >> 30); /* mask: 01000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_NONCHARACTER_CODE_POINT: /* Noncharacter_Code_Point bits:1 offset:2 */ return ((props_bitfield[bitfield_row][6] & 0x20000000) >> 29); /* mask: 00100000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_ALPHABETIC: /* Other_Alphabetic bits:1 offset:3 */ return ((props_bitfield[bitfield_row][6] & 0x10000000) >> 28); /* mask: 00010000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT: /* Other_Default_Ignorable_Code_Point bits:1 offset:4 */ return ((props_bitfield[bitfield_row][6] & 0x8000000) >> 27); /* mask: 00001000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_GRAPHEME_EXTEND: /* Other_Grapheme_Extend bits:1 offset:5 */ return ((props_bitfield[bitfield_row][6] & 0x4000000) >> 26); /* mask: 00000100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_ID_CONTINUE: /* Other_ID_Continue bits:1 offset:6 */ return ((props_bitfield[bitfield_row][6] & 0x2000000) >> 25); /* mask: 00000010000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_ID_START: /* Other_ID_Start bits:1 offset:7 */ return ((props_bitfield[bitfield_row][6] & 0x1000000) >> 24); /* mask: 00000001000000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_LOWERCASE: /* Other_Lowercase bits:1 offset:8 */ return ((props_bitfield[bitfield_row][6] & 0x800000) >> 23); /* mask: 00000000100000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_MATH: /* Other_Math bits:1 offset:9 */ return ((props_bitfield[bitfield_row][6] & 0x400000) >> 22); /* mask: 00000000010000000000000000000000 */ case MVM_UNICODE_PROPERTY_OTHER_UPPERCASE: /* Other_Uppercase bits:1 offset:10 */ return ((props_bitfield[bitfield_row][6] & 0x200000) >> 21); /* mask: 00000000001000000000000000000000 */ case MVM_UNICODE_PROPERTY_P: /* P bits:1 offset:11 */ return ((props_bitfield[bitfield_row][6] & 0x100000) >> 20); /* mask: 00000000000100000000000000000000 */ case MVM_UNICODE_PROPERTY_PATTERN_SYNTAX: /* Pattern_Syntax bits:1 offset:12 */ return ((props_bitfield[bitfield_row][6] & 0x80000) >> 19); /* mask: 00000000000010000000000000000000 */ case MVM_UNICODE_PROPERTY_PATTERN_WHITE_SPACE: /* Pattern_White_Space bits:1 offset:13 */ return ((props_bitfield[bitfield_row][6] & 0x40000) >> 18); /* mask: 00000000000001000000000000000000 */ case MVM_UNICODE_PROPERTY_QUOTATION_MARK: /* Quotation_Mark bits:1 offset:14 */ return ((props_bitfield[bitfield_row][6] & 0x20000) >> 17); /* mask: 00000000000000100000000000000000 */ case MVM_UNICODE_PROPERTY_RADICAL: /* Radical bits:1 offset:15 */ return ((props_bitfield[bitfield_row][6] & 0x10000) >> 16); /* mask: 00000000000000010000000000000000 */ case MVM_UNICODE_PROPERTY_S: /* S bits:1 offset:16 */ return ((props_bitfield[bitfield_row][6] & 0x8000) >> 15); /* mask: 00000000000000001000000000000000 */ case MVM_UNICODE_PROPERTY_STERM: /* STerm bits:1 offset:17 */ return ((props_bitfield[bitfield_row][6] & 0x4000) >> 14); /* mask: 00000000000000000100000000000000 */ case MVM_UNICODE_PROPERTY_SOFT_DOTTED: /* Soft_Dotted bits:1 offset:18 */ return ((props_bitfield[bitfield_row][6] & 0x2000) >> 13); /* mask: 00000000000000000010000000000000 */ case MVM_UNICODE_PROPERTY_TERMINAL_PUNCTUATION: /* Terminal_Punctuation bits:1 offset:19 */ return ((props_bitfield[bitfield_row][6] & 0x1000) >> 12); /* mask: 00000000000000000001000000000000 */ case MVM_UNICODE_PROPERTY_UNIFIED_IDEOGRAPH: /* Unified_Ideograph bits:1 offset:20 */ return ((props_bitfield[bitfield_row][6] & 0x800) >> 11); /* mask: 00000000000000000000100000000000 */ case MVM_UNICODE_PROPERTY_UPPERCASE: /* Uppercase bits:1 offset:21 */ return ((props_bitfield[bitfield_row][6] & 0x400) >> 10); /* mask: 00000000000000000000010000000000 */ case MVM_UNICODE_PROPERTY_VARIATION_SELECTOR: /* Variation_Selector bits:1 offset:22 */ return ((props_bitfield[bitfield_row][6] & 0x200) >> 9); /* mask: 00000000000000000000001000000000 */ case MVM_UNICODE_PROPERTY_WHITE_SPACE: /* White_Space bits:1 offset:23 */ return ((props_bitfield[bitfield_row][6] & 0x100) >> 8); /* mask: 00000000000000000000000100000000 */ case MVM_UNICODE_PROPERTY_XID_CONTINUE: /* XID_Continue bits:1 offset:24 */ return ((props_bitfield[bitfield_row][6] & 0x80) >> 7); /* mask: 00000000000000000000000010000000 */ case MVM_UNICODE_PROPERTY_XID_START: /* XID_Start bits:1 offset:25 */ return ((props_bitfield[bitfield_row][6] & 0x40) >> 6); /* mask: 00000000000000000000000001000000 */ case MVM_UNICODE_PROPERTY_Z: /* Z bits:1 offset:26 */ return ((props_bitfield[bitfield_row][6] & 0x20) >> 5); /* mask: 00000000000000000000000000100000 */ default: return 0; } } struct UnicodeBlock { MVMGrapheme32 start; MVMGrapheme32 end; char *name; size_t name_len; char *alias; size_t alias_len; }; static struct UnicodeBlock unicode_blocks[] = { { 0x0000, 0x007F, "BasicLatin", 10, "basiclatin", 10 }, { 0x0080, 0x00FF, "Latin1Supplement", 16, "latin1supplement", 16 }, { 0x0100, 0x017F, "LatinExtendedA", 14, "latinextendeda", 14 }, { 0x0180, 0x024F, "LatinExtendedB", 14, "latinextendedb", 14 }, { 0x0250, 0x02AF, "IPAExtensions", 13, "ipaextensions", 13 }, { 0x02B0, 0x02FF, "SpacingModifierLetters", 22, "spacingmodifierletters", 22 }, { 0x0300, 0x036F, "CombiningDiacriticalMarks", 25, "combiningdiacriticalmarks", 25 }, { 0x0370, 0x03FF, "GreekandCoptic", 14, "greekandcoptic", 14 }, { 0x0400, 0x04FF, "Cyrillic", 8, "cyrillic", 8 }, { 0x0500, 0x052F, "CyrillicSupplement", 18, "cyrillicsupplement", 18 }, { 0x0530, 0x058F, "Armenian", 8, "armenian", 8 }, { 0x0590, 0x05FF, "Hebrew", 6, "hebrew", 6 }, { 0x0600, 0x06FF, "Arabic", 6, "arabic", 6 }, { 0x0700, 0x074F, "Syriac", 6, "syriac", 6 }, { 0x0750, 0x077F, "ArabicSupplement", 16, "arabicsupplement", 16 }, { 0x0780, 0x07BF, "Thaana", 6, "thaana", 6 }, { 0x07C0, 0x07FF, "NKo", 3, "nko", 3 }, { 0x0800, 0x083F, "Samaritan", 9, "samaritan", 9 }, { 0x0840, 0x085F, "Mandaic", 7, "mandaic", 7 }, { 0x08A0, 0x08FF, "ArabicExtendedA", 15, "arabicextendeda", 15 }, { 0x0900, 0x097F, "Devanagari", 10, "devanagari", 10 }, { 0x0980, 0x09FF, "Bengali", 7, "bengali", 7 }, { 0x0A00, 0x0A7F, "Gurmukhi", 8, "gurmukhi", 8 }, { 0x0A80, 0x0AFF, "Gujarati", 8, "gujarati", 8 }, { 0x0B00, 0x0B7F, "Oriya", 5, "oriya", 5 }, { 0x0B80, 0x0BFF, "Tamil", 5, "tamil", 5 }, { 0x0C00, 0x0C7F, "Telugu", 6, "telugu", 6 }, { 0x0C80, 0x0CFF, "Kannada", 7, "kannada", 7 }, { 0x0D00, 0x0D7F, "Malayalam", 9, "malayalam", 9 }, { 0x0D80, 0x0DFF, "Sinhala", 7, "sinhala", 7 }, { 0x0E00, 0x0E7F, "Thai", 4, "thai", 4 }, { 0x0E80, 0x0EFF, "Lao", 3, "lao", 3 }, { 0x0F00, 0x0FFF, "Tibetan", 7, "tibetan", 7 }, { 0x1000, 0x109F, "Myanmar", 7, "myanmar", 7 }, { 0x10A0, 0x10FF, "Georgian", 8, "georgian", 8 }, { 0x1100, 0x11FF, "HangulJamo", 10, "hanguljamo", 10 }, { 0x1200, 0x137F, "Ethiopic", 8, "ethiopic", 8 }, { 0x1380, 0x139F, "EthiopicSupplement", 18, "ethiopicsupplement", 18 }, { 0x13A0, 0x13FF, "Cherokee", 8, "cherokee", 8 }, { 0x1400, 0x167F, "UnifiedCanadianAboriginalSyllabics", 34, "unifiedcanadianaboriginalsyllabics", 34 }, { 0x1680, 0x169F, "Ogham", 5, "ogham", 5 }, { 0x16A0, 0x16FF, "Runic", 5, "runic", 5 }, { 0x1700, 0x171F, "Tagalog", 7, "tagalog", 7 }, { 0x1720, 0x173F, "Hanunoo", 7, "hanunoo", 7 }, { 0x1740, 0x175F, "Buhid", 5, "buhid", 5 }, { 0x1760, 0x177F, "Tagbanwa", 8, "tagbanwa", 8 }, { 0x1780, 0x17FF, "Khmer", 5, "khmer", 5 }, { 0x1800, 0x18AF, "Mongolian", 9, "mongolian", 9 }, { 0x18B0, 0x18FF, "UnifiedCanadianAboriginalSyllabicsExtended", 42, "unifiedcanadianaboriginalsyllabicsextended", 42 }, { 0x1900, 0x194F, "Limbu", 5, "limbu", 5 }, { 0x1950, 0x197F, "TaiLe", 5, "taile", 5 }, { 0x1980, 0x19DF, "NewTaiLue", 9, "newtailue", 9 }, { 0x19E0, 0x19FF, "KhmerSymbols", 12, "khmersymbols", 12 }, { 0x1A00, 0x1A1F, "Buginese", 8, "buginese", 8 }, { 0x1A20, 0x1AAF, "TaiTham", 7, "taitham", 7 }, { 0x1AB0, 0x1AFF, "CombiningDiacriticalMarksExtended", 33, "combiningdiacriticalmarksextended", 33 }, { 0x1B00, 0x1B7F, "Balinese", 8, "balinese", 8 }, { 0x1B80, 0x1BBF, "Sundanese", 9, "sundanese", 9 }, { 0x1BC0, 0x1BFF, "Batak", 5, "batak", 5 }, { 0x1C00, 0x1C4F, "Lepcha", 6, "lepcha", 6 }, { 0x1C50, 0x1C7F, "OlChiki", 7, "olchiki", 7 }, { 0x1CC0, 0x1CCF, "SundaneseSupplement", 19, "sundanesesupplement", 19 }, { 0x1CD0, 0x1CFF, "VedicExtensions", 15, "vedicextensions", 15 }, { 0x1D00, 0x1D7F, "PhoneticExtensions", 18, "phoneticextensions", 18 }, { 0x1D80, 0x1DBF, "PhoneticExtensionsSupplement", 28, "phoneticextensionssupplement", 28 }, { 0x1DC0, 0x1DFF, "CombiningDiacriticalMarksSupplement", 35, "combiningdiacriticalmarkssupplement", 35 }, { 0x1E00, 0x1EFF, "LatinExtendedAdditional", 23, "latinextendedadditional", 23 }, { 0x1F00, 0x1FFF, "GreekExtended", 13, "greekextended", 13 }, { 0x2000, 0x206F, "GeneralPunctuation", 18, "generalpunctuation", 18 }, { 0x2070, 0x209F, "SuperscriptsandSubscripts", 25, "superscriptsandsubscripts", 25 }, { 0x20A0, 0x20CF, "CurrencySymbols", 15, "currencysymbols", 15 }, { 0x20D0, 0x20FF, "CombiningDiacriticalMarksforSymbols", 35, "combiningdiacriticalmarksforsymbols", 35 }, { 0x2100, 0x214F, "LetterlikeSymbols", 17, "letterlikesymbols", 17 }, { 0x2150, 0x218F, "NumberForms", 11, "numberforms", 11 }, { 0x2190, 0x21FF, "Arrows", 6, "arrows", 6 }, { 0x2200, 0x22FF, "MathematicalOperators", 21, "mathematicaloperators", 21 }, { 0x2300, 0x23FF, "MiscellaneousTechnical", 22, "miscellaneoustechnical", 22 }, { 0x2400, 0x243F, "ControlPictures", 15, "controlpictures", 15 }, { 0x2440, 0x245F, "OpticalCharacterRecognition", 27, "opticalcharacterrecognition", 27 }, { 0x2460, 0x24FF, "EnclosedAlphanumerics", 21, "enclosedalphanumerics", 21 }, { 0x2500, 0x257F, "BoxDrawing", 10, "boxdrawing", 10 }, { 0x2580, 0x259F, "BlockElements", 13, "blockelements", 13 }, { 0x25A0, 0x25FF, "GeometricShapes", 15, "geometricshapes", 15 }, { 0x2600, 0x26FF, "MiscellaneousSymbols", 20, "miscellaneoussymbols", 20 }, { 0x2700, 0x27BF, "Dingbats", 8, "dingbats", 8 }, { 0x27C0, 0x27EF, "MiscellaneousMathematicalSymbolsA", 33, "miscellaneousmathematicalsymbolsa", 33 }, { 0x27F0, 0x27FF, "SupplementalArrowsA", 19, "supplementalarrowsa", 19 }, { 0x2800, 0x28FF, "BraillePatterns", 15, "braillepatterns", 15 }, { 0x2900, 0x297F, "SupplementalArrowsB", 19, "supplementalarrowsb", 19 }, { 0x2980, 0x29FF, "MiscellaneousMathematicalSymbolsB", 33, "miscellaneousmathematicalsymbolsb", 33 }, { 0x2A00, 0x2AFF, "SupplementalMathematicalOperators", 33, "supplementalmathematicaloperators", 33 }, { 0x2B00, 0x2BFF, "MiscellaneousSymbolsandArrows", 29, "miscellaneoussymbolsandarrows", 29 }, { 0x2C00, 0x2C5F, "Glagolitic", 10, "glagolitic", 10 }, { 0x2C60, 0x2C7F, "LatinExtendedC", 14, "latinextendedc", 14 }, { 0x2C80, 0x2CFF, "Coptic", 6, "coptic", 6 }, { 0x2D00, 0x2D2F, "GeorgianSupplement", 18, "georgiansupplement", 18 }, { 0x2D30, 0x2D7F, "Tifinagh", 8, "tifinagh", 8 }, { 0x2D80, 0x2DDF, "EthiopicExtended", 16, "ethiopicextended", 16 }, { 0x2DE0, 0x2DFF, "CyrillicExtendedA", 17, "cyrillicextendeda", 17 }, { 0x2E00, 0x2E7F, "SupplementalPunctuation", 23, "supplementalpunctuation", 23 }, { 0x2E80, 0x2EFF, "CJKRadicalsSupplement", 21, "cjkradicalssupplement", 21 }, { 0x2F00, 0x2FDF, "KangxiRadicals", 14, "kangxiradicals", 14 }, { 0x2FF0, 0x2FFF, "IdeographicDescriptionCharacters", 32, "ideographicdescriptioncharacters", 32 }, { 0x3000, 0x303F, "CJKSymbolsandPunctuation", 24, "cjksymbolsandpunctuation", 24 }, { 0x3040, 0x309F, "Hiragana", 8, "hiragana", 8 }, { 0x30A0, 0x30FF, "Katakana", 8, "katakana", 8 }, { 0x3100, 0x312F, "Bopomofo", 8, "bopomofo", 8 }, { 0x3130, 0x318F, "HangulCompatibilityJamo", 23, "hangulcompatibilityjamo", 23 }, { 0x3190, 0x319F, "Kanbun", 6, "kanbun", 6 }, { 0x31A0, 0x31BF, "BopomofoExtended", 16, "bopomofoextended", 16 }, { 0x31C0, 0x31EF, "CJKStrokes", 10, "cjkstrokes", 10 }, { 0x31F0, 0x31FF, "KatakanaPhoneticExtensions", 26, "katakanaphoneticextensions", 26 }, { 0x3200, 0x32FF, "EnclosedCJKLettersandMonths", 27, "enclosedcjklettersandmonths", 27 }, { 0x3300, 0x33FF, "CJKCompatibility", 16, "cjkcompatibility", 16 }, { 0x3400, 0x4DBF, "CJKUnifiedIdeographsExtensionA", 30, "cjkunifiedideographsextensiona", 30 }, { 0x4DC0, 0x4DFF, "YijingHexagramSymbols", 21, "yijinghexagramsymbols", 21 }, { 0x4E00, 0x9FFF, "CJKUnifiedIdeographs", 20, "cjkunifiedideographs", 20 }, { 0xA000, 0xA48F, "YiSyllables", 11, "yisyllables", 11 }, { 0xA490, 0xA4CF, "YiRadicals", 10, "yiradicals", 10 }, { 0xA4D0, 0xA4FF, "Lisu", 4, "lisu", 4 }, { 0xA500, 0xA63F, "Vai", 3, "vai", 3 }, { 0xA640, 0xA69F, "CyrillicExtendedB", 17, "cyrillicextendedb", 17 }, { 0xA6A0, 0xA6FF, "Bamum", 5, "bamum", 5 }, { 0xA700, 0xA71F, "ModifierToneLetters", 19, "modifiertoneletters", 19 }, { 0xA720, 0xA7FF, "LatinExtendedD", 14, "latinextendedd", 14 }, { 0xA800, 0xA82F, "SylotiNagri", 11, "sylotinagri", 11 }, { 0xA830, 0xA83F, "CommonIndicNumberForms", 22, "commonindicnumberforms", 22 }, { 0xA840, 0xA87F, "Phagspa", 7, "phagspa", 7 }, { 0xA880, 0xA8DF, "Saurashtra", 10, "saurashtra", 10 }, { 0xA8E0, 0xA8FF, "DevanagariExtended", 18, "devanagariextended", 18 }, { 0xA900, 0xA92F, "KayahLi", 7, "kayahli", 7 }, { 0xA930, 0xA95F, "Rejang", 6, "rejang", 6 }, { 0xA960, 0xA97F, "HangulJamoExtendedA", 19, "hanguljamoextendeda", 19 }, { 0xA980, 0xA9DF, "Javanese", 8, "javanese", 8 }, { 0xA9E0, 0xA9FF, "MyanmarExtendedB", 16, "myanmarextendedb", 16 }, { 0xAA00, 0xAA5F, "Cham", 4, "cham", 4 }, { 0xAA60, 0xAA7F, "MyanmarExtendedA", 16, "myanmarextendeda", 16 }, { 0xAA80, 0xAADF, "TaiViet", 7, "taiviet", 7 }, { 0xAAE0, 0xAAFF, "MeeteiMayekExtensions", 21, "meeteimayekextensions", 21 }, { 0xAB00, 0xAB2F, "EthiopicExtendedA", 17, "ethiopicextendeda", 17 }, { 0xAB30, 0xAB6F, "LatinExtendedE", 14, "latinextendede", 14 }, { 0xAB70, 0xABBF, "CherokeeSupplement", 18, "cherokeesupplement", 18 }, { 0xABC0, 0xABFF, "MeeteiMayek", 11, "meeteimayek", 11 }, { 0xAC00, 0xD7AF, "HangulSyllables", 15, "hangulsyllables", 15 }, { 0xD7B0, 0xD7FF, "HangulJamoExtendedB", 19, "hanguljamoextendedb", 19 }, { 0xD800, 0xDB7F, "HighSurrogates", 14, "highsurrogates", 14 }, { 0xDB80, 0xDBFF, "HighPrivateUseSurrogates", 24, "highprivateusesurrogates", 24 }, { 0xDC00, 0xDFFF, "LowSurrogates", 13, "lowsurrogates", 13 }, { 0xE000, 0xF8FF, "PrivateUseArea", 14, "privateusearea", 14 }, { 0xF900, 0xFAFF, "CJKCompatibilityIdeographs", 26, "cjkcompatibilityideographs", 26 }, { 0xFB00, 0xFB4F, "AlphabeticPresentationForms", 27, "alphabeticpresentationforms", 27 }, { 0xFB50, 0xFDFF, "ArabicPresentationFormsA", 24, "arabicpresentationformsa", 24 }, { 0xFE00, 0xFE0F, "VariationSelectors", 18, "variationselectors", 18 }, { 0xFE10, 0xFE1F, "VerticalForms", 13, "verticalforms", 13 }, { 0xFE20, 0xFE2F, "CombiningHalfMarks", 18, "combininghalfmarks", 18 }, { 0xFE30, 0xFE4F, "CJKCompatibilityForms", 21, "cjkcompatibilityforms", 21 }, { 0xFE50, 0xFE6F, "SmallFormVariants", 17, "smallformvariants", 17 }, { 0xFE70, 0xFEFF, "ArabicPresentationFormsB", 24, "arabicpresentationformsb", 24 }, { 0xFF00, 0xFFEF, "HalfwidthandFullwidthForms", 26, "halfwidthandfullwidthforms", 26 }, { 0xFFF0, 0xFFFF, "Specials", 8, "specials", 8 }, { 0x10000, 0x1007F, "LinearBSyllabary", 16, "linearbsyllabary", 16 }, { 0x10080, 0x100FF, "LinearBIdeograms", 16, "linearbideograms", 16 }, { 0x10100, 0x1013F, "AegeanNumbers", 13, "aegeannumbers", 13 }, { 0x10140, 0x1018F, "AncientGreekNumbers", 19, "ancientgreeknumbers", 19 }, { 0x10190, 0x101CF, "AncientSymbols", 14, "ancientsymbols", 14 }, { 0x101D0, 0x101FF, "PhaistosDisc", 12, "phaistosdisc", 12 }, { 0x10280, 0x1029F, "Lycian", 6, "lycian", 6 }, { 0x102A0, 0x102DF, "Carian", 6, "carian", 6 }, { 0x102E0, 0x102FF, "CopticEpactNumbers", 18, "copticepactnumbers", 18 }, { 0x10300, 0x1032F, "OldItalic", 9, "olditalic", 9 }, { 0x10330, 0x1034F, "Gothic", 6, "gothic", 6 }, { 0x10350, 0x1037F, "OldPermic", 9, "oldpermic", 9 }, { 0x10380, 0x1039F, "Ugaritic", 8, "ugaritic", 8 }, { 0x103A0, 0x103DF, "OldPersian", 10, "oldpersian", 10 }, { 0x10400, 0x1044F, "Deseret", 7, "deseret", 7 }, { 0x10450, 0x1047F, "Shavian", 7, "shavian", 7 }, { 0x10480, 0x104AF, "Osmanya", 7, "osmanya", 7 }, { 0x10500, 0x1052F, "Elbasan", 7, "elbasan", 7 }, { 0x10530, 0x1056F, "CaucasianAlbanian", 17, "caucasianalbanian", 17 }, { 0x10600, 0x1077F, "LinearA", 7, "lineara", 7 }, { 0x10800, 0x1083F, "CypriotSyllabary", 16, "cypriotsyllabary", 16 }, { 0x10840, 0x1085F, "ImperialAramaic", 15, "imperialaramaic", 15 }, { 0x10860, 0x1087F, "Palmyrene", 9, "palmyrene", 9 }, { 0x10880, 0x108AF, "Nabataean", 9, "nabataean", 9 }, { 0x108E0, 0x108FF, "Hatran", 6, "hatran", 6 }, { 0x10900, 0x1091F, "Phoenician", 10, "phoenician", 10 }, { 0x10920, 0x1093F, "Lydian", 6, "lydian", 6 }, { 0x10980, 0x1099F, "MeroiticHieroglyphs", 19, "meroitichieroglyphs", 19 }, { 0x109A0, 0x109FF, "MeroiticCursive", 15, "meroiticcursive", 15 }, { 0x10A00, 0x10A5F, "Kharoshthi", 10, "kharoshthi", 10 }, { 0x10A60, 0x10A7F, "OldSouthArabian", 15, "oldsoutharabian", 15 }, { 0x10A80, 0x10A9F, "OldNorthArabian", 15, "oldnortharabian", 15 }, { 0x10AC0, 0x10AFF, "Manichaean", 10, "manichaean", 10 }, { 0x10B00, 0x10B3F, "Avestan", 7, "avestan", 7 }, { 0x10B40, 0x10B5F, "InscriptionalParthian", 21, "inscriptionalparthian", 21 }, { 0x10B60, 0x10B7F, "InscriptionalPahlavi", 20, "inscriptionalpahlavi", 20 }, { 0x10B80, 0x10BAF, "PsalterPahlavi", 14, "psalterpahlavi", 14 }, { 0x10C00, 0x10C4F, "OldTurkic", 9, "oldturkic", 9 }, { 0x10C80, 0x10CFF, "OldHungarian", 12, "oldhungarian", 12 }, { 0x10E60, 0x10E7F, "RumiNumeralSymbols", 18, "ruminumeralsymbols", 18 }, { 0x11000, 0x1107F, "Brahmi", 6, "brahmi", 6 }, { 0x11080, 0x110CF, "Kaithi", 6, "kaithi", 6 }, { 0x110D0, 0x110FF, "SoraSompeng", 11, "sorasompeng", 11 }, { 0x11100, 0x1114F, "Chakma", 6, "chakma", 6 }, { 0x11150, 0x1117F, "Mahajani", 8, "mahajani", 8 }, { 0x11180, 0x111DF, "Sharada", 7, "sharada", 7 }, { 0x111E0, 0x111FF, "SinhalaArchaicNumbers", 21, "sinhalaarchaicnumbers", 21 }, { 0x11200, 0x1124F, "Khojki", 6, "khojki", 6 }, { 0x11280, 0x112AF, "Multani", 7, "multani", 7 }, { 0x112B0, 0x112FF, "Khudawadi", 9, "khudawadi", 9 }, { 0x11300, 0x1137F, "Grantha", 7, "grantha", 7 }, { 0x11480, 0x114DF, "Tirhuta", 7, "tirhuta", 7 }, { 0x11580, 0x115FF, "Siddham", 7, "siddham", 7 }, { 0x11600, 0x1165F, "Modi", 4, "modi", 4 }, { 0x11680, 0x116CF, "Takri", 5, "takri", 5 }, { 0x11700, 0x1173F, "Ahom", 4, "ahom", 4 }, { 0x118A0, 0x118FF, "WarangCiti", 10, "warangciti", 10 }, { 0x11AC0, 0x11AFF, "PauCinHau", 9, "paucinhau", 9 }, { 0x12000, 0x123FF, "Cuneiform", 9, "cuneiform", 9 }, { 0x12400, 0x1247F, "CuneiformNumbersandPunctuation", 30, "cuneiformnumbersandpunctuation", 30 }, { 0x12480, 0x1254F, "EarlyDynasticCuneiform", 22, "earlydynasticcuneiform", 22 }, { 0x13000, 0x1342F, "EgyptianHieroglyphs", 19, "egyptianhieroglyphs", 19 }, { 0x14400, 0x1467F, "AnatolianHieroglyphs", 20, "anatolianhieroglyphs", 20 }, { 0x16800, 0x16A3F, "BamumSupplement", 15, "bamumsupplement", 15 }, { 0x16A40, 0x16A6F, "Mro", 3, "mro", 3 }, { 0x16AD0, 0x16AFF, "BassaVah", 8, "bassavah", 8 }, { 0x16B00, 0x16B8F, "PahawhHmong", 11, "pahawhhmong", 11 }, { 0x16F00, 0x16F9F, "Miao", 4, "miao", 4 }, { 0x1B000, 0x1B0FF, "KanaSupplement", 14, "kanasupplement", 14 }, { 0x1BC00, 0x1BC9F, "Duployan", 8, "duployan", 8 }, { 0x1BCA0, 0x1BCAF, "ShorthandFormatControls", 23, "shorthandformatcontrols", 23 }, { 0x1D000, 0x1D0FF, "ByzantineMusicalSymbols", 23, "byzantinemusicalsymbols", 23 }, { 0x1D100, 0x1D1FF, "MusicalSymbols", 14, "musicalsymbols", 14 }, { 0x1D200, 0x1D24F, "AncientGreekMusicalNotation", 27, "ancientgreekmusicalnotation", 27 }, { 0x1D300, 0x1D35F, "TaiXuanJingSymbols", 18, "taixuanjingsymbols", 18 }, { 0x1D360, 0x1D37F, "CountingRodNumerals", 19, "countingrodnumerals", 19 }, { 0x1D400, 0x1D7FF, "MathematicalAlphanumericSymbols", 31, "mathematicalalphanumericsymbols", 31 }, { 0x1D800, 0x1DAAF, "SuttonSignWriting", 17, "suttonsignwriting", 17 }, { 0x1E800, 0x1E8DF, "MendeKikakui", 12, "mendekikakui", 12 }, { 0x1EE00, 0x1EEFF, "ArabicMathematicalAlphabeticSymbols", 35, "arabicmathematicalalphabeticsymbols", 35 }, { 0x1F000, 0x1F02F, "MahjongTiles", 12, "mahjongtiles", 12 }, { 0x1F030, 0x1F09F, "DominoTiles", 11, "dominotiles", 11 }, { 0x1F0A0, 0x1F0FF, "PlayingCards", 12, "playingcards", 12 }, { 0x1F100, 0x1F1FF, "EnclosedAlphanumericSupplement", 30, "enclosedalphanumericsupplement", 30 }, { 0x1F200, 0x1F2FF, "EnclosedIdeographicSupplement", 29, "enclosedideographicsupplement", 29 }, { 0x1F300, 0x1F5FF, "MiscellaneousSymbolsandPictographs", 34, "miscellaneoussymbolsandpictographs", 34 }, { 0x1F600, 0x1F64F, "Emoticons", 9, "emoticons", 9 }, { 0x1F650, 0x1F67F, "OrnamentalDingbats", 18, "ornamentaldingbats", 18 }, { 0x1F680, 0x1F6FF, "TransportandMapSymbols", 22, "transportandmapsymbols", 22 }, { 0x1F700, 0x1F77F, "AlchemicalSymbols", 17, "alchemicalsymbols", 17 }, { 0x1F780, 0x1F7FF, "GeometricShapesExtended", 23, "geometricshapesextended", 23 }, { 0x1F800, 0x1F8FF, "SupplementalArrowsC", 19, "supplementalarrowsc", 19 }, { 0x1F900, 0x1F9FF, "SupplementalSymbolsandPictographs", 33, "supplementalsymbolsandpictographs", 33 }, { 0x20000, 0x2A6DF, "CJKUnifiedIdeographsExtensionB", 30, "cjkunifiedideographsextensionb", 30 }, { 0x2A700, 0x2B73F, "CJKUnifiedIdeographsExtensionC", 30, "cjkunifiedideographsextensionc", 30 }, { 0x2B740, 0x2B81F, "CJKUnifiedIdeographsExtensionD", 30, "cjkunifiedideographsextensiond", 30 }, { 0x2B820, 0x2CEAF, "CJKUnifiedIdeographsExtensionE", 30, "cjkunifiedideographsextensione", 30 }, { 0x2F800, 0x2FA1F, "CJKCompatibilityIdeographsSupplement", 36, "cjkcompatibilityideographssupplement", 36 }, { 0xE0000, 0xE007F, "Tags", 4, "tags", 4 }, { 0xE0100, 0xE01EF, "VariationSelectorsSupplement", 28, "variationselectorssupplement", 28 }, { 0xF0000, 0xFFFFF, "SupplementaryPrivateUseAreaA", 28, "supplementaryprivateuseareaa", 28 }, { 0x100000, 0x10FFFF, "SupplementaryPrivateUseAreaB", 28, "supplementaryprivateuseareab", 28 } }; static int block_compare(const void *a, const void *b) { MVMGrapheme32 ord = *((MVMGrapheme32 *) a); struct UnicodeBlock *block = (struct UnicodeBlock *) b; if (ord < block->start) { return -1; } else if (ord > block->end) { return 1; } else { return 0; } } MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name) { MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, str, pos); MVMuint64 size; char *bname = MVM_string_ascii_encode(tc, block_name, &size); MVMint32 in_block = 0; struct UnicodeBlock *block = bsearch(&ord, unicode_blocks, sizeof(unicode_blocks) / sizeof(struct UnicodeBlock), sizeof(struct UnicodeBlock), block_compare); if (block) { in_block = strncmp(block->name, bname, block->name_len) == 0 || strncmp(block->alias, bname, block->alias_len) == 0; } MVM_free(bname); return in_block; } static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint32 codepoint) { MVMint32 plane = codepoint >> 16; if (codepoint < 0) { MVM_exception_throw_adhoc(tc, "should eventually be unreachable"); } if (plane == 0) { if (codepoint >= 0x3406) { /* */ if (codepoint >= 0x67D2) { /* */ if (codepoint >= 0x8CB4) { /* */ if (codepoint >= 0x96F7) { /* */ if (codepoint >= 0xDB80) { /* */ if (codepoint >= 0xE000) { /* */ if (codepoint >= 0xF900) { /* CJK COMPATIBILITY IDEOGRAPH-F900 */ if (codepoint >= 0xFFFE) { /* NULL */ return -1; } else { return codepoint - 35194; } } else { return 28549; /* F900 CJK COMPATIBILITY IDEOGRAPH-F900 */ } } else { if (codepoint >= 0xDC00) { /* */ return 28548; /* E000 */ } else { return 28547; /* DC00 */ } } } else { if (codepoint >= 0x9FA6) { /* */ if (codepoint >= 0xD800) { /* */ return 28546; /* DB80 */ } else { return codepoint - 26750; } } else { return 14119; /* 4E03 */ } } } else { if (codepoint >= 0x8D31) { /* */ if (codepoint >= 0x9621) { /* */ if (codepoint >= 0x9679) { /* */ if (codepoint >= 0x96F6) { /* */ return codepoint - 24528; } else { return 14117; /* 4E03 */ } } else { return codepoint - 24404; } } else { return 14028; /* 4E03 */ } } else { if (codepoint >= 0x8D30) { /* */ return codepoint - 22117; } else { return 14026; /* 4E03 */ } } } } else { if (codepoint >= 0x767E) { /* */ if (codepoint >= 0x8087) { /* */ if (codepoint >= 0x842C) { /* */ if (codepoint >= 0x842D) { /* */ if (codepoint >= 0x8CAE) { /* */ return codepoint - 21994; } else { return 14019; /* 4E03 */ } } else { return codepoint - 19818; } } else { return 14017; /* 4E03 */ } } else { if (codepoint >= 0x767F) { /* */ if (codepoint >= 0x8086) { /* */ return codepoint - 18886; } else { return 14015; /* 4E03 */ } } else { return codepoint - 16320; } } } else { if (codepoint >= 0x6F06) { /* */ if (codepoint >= 0x6F07) { /* */ if (codepoint >= 0x7396) { /* */ if (codepoint >= 0x7397) { /* */ return 14013; /* 4E03 */ } else { return codepoint - 15578; } } else { return 14011; /* 4E03 */ } } else { return codepoint - 14412; } } else { if (codepoint >= 0x67D3) { /* */ return 14009; /* 4E03 */ } else { return codepoint - 12570; } } } } } else { if (codepoint >= 0x534D) { /* */ if (codepoint >= 0x58FA) { /* */ if (codepoint >= 0x5EFE) { /* */ if (codepoint >= 0x5F11) { /* */ if (codepoint >= 0x62FE) { /* */ if (codepoint >= 0x634D) { /* */ return 14007; /* 4E03 */ } else { return codepoint - 11414; } } else { return 13927; /* 4E03 */ } } else { return codepoint - 10410; } } else { if (codepoint >= 0x5E7A) { /* */ if (codepoint >= 0x5E7B) { /* */ return 13907; /* 4E03 */ } else { return codepoint - 10280; } } else { return 13905; /* 4E03 */ } } } else { if (codepoint >= 0x53C5) { /* */ if (codepoint >= 0x56DB) { /* */ if (codepoint >= 0x56DC) { /* */ if (codepoint >= 0x58F1) { /* */ return codepoint - 8873; } else { return 13895; /* 4E03 */ } } else { return codepoint - 8341; } } else { return 13893; /* 4E03 */ } } else { if (codepoint >= 0x53C1) { /* */ return codepoint - 7552; } else { return 13888; /* 4E03 */ } } } } else { if (codepoint >= 0x3B4D) { /* */ if (codepoint >= 0x4F71) { /* */ if (codepoint >= 0x5104) { /* */ if (codepoint >= 0x516E) { /* */ if (codepoint >= 0x5341) { /* */ return codepoint - 7437; } else { return 13875; /* 4E03 */ } } else { return codepoint - 6971; } } else { return 13768; /* 4E03 */ } } else { if (codepoint >= 0x3B4E) { /* */ if (codepoint >= 0x4DC0) { /* HEXAGRAM FOR THE CREATIVE HEAVEN */ return codepoint - 6569; } else { return 13324; /* 3405 */ } } else { return codepoint - 1858; } } } else { if (codepoint >= 0x3484) { /* */ if (codepoint >= 0x382A) { /* */ if (codepoint >= 0x382B) { /* */ return 13322; /* 3405 */ } else { return codepoint - 1057; } } else { return 13320; /* 3405 */ } } else { if (codepoint >= 0x3483) { /* */ return codepoint - 124; } else { return 13318; /* 3405 */ } } } } } } else { return codepoint - 0; /* the fast path */ } } else { if (plane < 0 || plane > 16 || codepoint > 0x10FFFD) { return -1; } else { if (codepoint >= 0x2099D) { /* */ if (codepoint >= 0x2B740) { /* */ if (codepoint >= 0xE01F0) { /* NULL */ if (codepoint >= 0xFFFFE) { /* NULL */ if (codepoint >= 0x100001) { /* */ if (codepoint >= 0x10FFFE) { /* NULL */ if (codepoint >= 0x110000) { /* Out of Range */ return codepoint - 1064349; } else { return -1; } } else { return 49762; /* 110000 Out of Range */ } } else { if (codepoint >= 0x100000) { /* */ return codepoint - 998815; } else { return -1; } } } else { if (codepoint >= 0xF0000) { /* */ if (codepoint >= 0xF0001) { /* */ return 49760; /* 100000 */ } else { return codepoint - 933281; } } else { return -1; } } } else { if (codepoint >= 0x2CEA2) { /* NULL */ if (codepoint >= 0x2F800) { /* CJK COMPATIBILITY IDEOGRAPH-2F800 */ if (codepoint >= 0x2FA1E) { /* NULL */ if (codepoint >= 0xE0001) { /* LANGUAGE TAG */ return codepoint - 868241; } else { return -1; } } else { return codepoint - 145838; } } else { return -1; } } else { if (codepoint >= 0x2B820) { /* */ return 48721; /* 2F800 CJK COMPATIBILITY IDEOGRAPH-2F800 */ } else { return 48718; /* 2B820 */ } } } } else { if (codepoint >= 0x22998) { /* */ if (codepoint >= 0x23B1C) { /* */ if (codepoint >= 0x2626D) { /* */ if (codepoint >= 0x2626E) { /* */ if (codepoint >= 0x2A700) { /* */ return 48706; /* 2B740 */ } else { return 48664; /* 20064 */ } } else { return codepoint - 107606; } } else { return 48662; /* 20064 */ } } else { if (codepoint >= 0x22999) { /* */ if (codepoint >= 0x23B1B) { /* */ return codepoint - 97542; } else { return 48660; /* 20064 */ } } else { return codepoint - 93061; } } } else { if (codepoint >= 0x20B1A) { /* */ if (codepoint >= 0x22390) { /* */ if (codepoint >= 0x22391) { /* */ return 48658; /* 20064 */ } else { return codepoint - 91519; } } else { return 48656; /* 20064 */ } } else { if (codepoint >= 0x20AEA) { /* */ return codepoint - 85258; } else { return 48607; /* 20064 */ } } } } } else { if (codepoint >= 0x1BC00) { /* DUPLOYAN LETTER H */ if (codepoint >= 0x1EE00) { /* ARABIC MATHEMATICAL ALEF */ if (codepoint >= 0x20065) { /* */ if (codepoint >= 0x200E2) { /* */ if (codepoint >= 0x20122) { /* */ if (codepoint >= 0x2092A) { /* */ return codepoint - 84926; } else { return 48491; /* 20064 */ } } else { return codepoint - 82871; } } else { return 48426; /* 20064 */ } } else { if (codepoint >= 0x1F9C1) { /* NULL */ if (codepoint >= 0x20000) { /* */ return codepoint - 82747; } else { return -1; } } else { return codepoint - 81148; } } } else { if (codepoint >= 0x1D000) { /* BYZANTINE MUSICAL SYMBOL PSILI */ if (codepoint >= 0x1DAB0) { /* NULL */ if (codepoint >= 0x1E800) { /* MENDE KIKAKUI SYLLABLE M001 KI */ if (codepoint >= 0x1E8D7) { /* NULL */ return -1; } else { return codepoint - 79827; } } else { return -1; } } else { return codepoint - 76419; } } else { if (codepoint >= 0x1BCA4) { /* NULL */ return -1; } else { return codepoint - 71463; } } } } else { if (codepoint >= 0x1342F) { /* NULL */ if (codepoint >= 0x16800) { /* BAMUM LETTER PHASE-A NGKUE MFON */ if (codepoint >= 0x16FA0) { /* NULL */ if (codepoint >= 0x1B000) { /* KATAKANA LETTER ARCHAIC E */ if (codepoint >= 0x1B002) { /* NULL */ return -1; } else { return codepoint - 68393; } } else { return -1; } } else { return codepoint - 51913; } } else { if (codepoint >= 0x14400) { /* ANATOLIAN HIEROGLYPH A001 */ if (codepoint >= 0x14647) { /* NULL */ return -1; } else { return codepoint - 43280; } } else { return -1; } } } else { if (codepoint >= 0x12000) { /* CUNEIFORM SIGN A */ if (codepoint >= 0x12544) { /* NULL */ if (codepoint >= 0x13000) { /* EGYPTIAN HIEROGLYPH A001 */ return codepoint - 39231; } else { return -1; } } else { return codepoint - 36483; } } else { if (codepoint >= 0x11AF9) { /* NULL */ return -1; } else { return codepoint - 35196; } } } } } } } } /* Canonical composition lookup tables. */ static const MVMint32 comp_entry_0[] = {2,824,8814}; static const MVMint32 comp_entry_1[] = {2,824,8800}; static const MVMint32 comp_entry_2[] = {2,824,8815}; static const MVMint32 comp_entry_3[] = {32,808,260,772,256,783,512,771,195,770,194,785,514,805,7680,768,192,778,197,777,7842,769,193,803,7840,776,196,780,461,775,550,774,258}; static const MVMint32 comp_entry_4[] = {6,817,7686,803,7684,775,7682}; static const MVMint32 comp_entry_5[] = {10,775,266,807,199,770,264,780,268,769,262}; static const MVMint32 comp_entry_6[] = {12,775,7690,807,7696,803,7692,817,7694,780,270,813,7698}; static const MVMint32 comp_entry_7[] = {34,774,276,785,518,816,7706,803,7864,768,200,807,552,777,7866,808,280,813,7704,783,516,771,7868,775,278,772,274,769,201,770,202,780,282,776,203}; static const MVMint32 comp_entry_8[] = {2,775,7710}; static const MVMint32 comp_entry_9[] = {14,774,286,780,486,775,288,770,284,807,290,769,500,772,7712}; static const MVMint32 comp_entry_10[] = {14,814,7722,775,7714,803,7716,780,542,776,7718,807,7720,770,292}; static const MVMint32 comp_entry_11[] = {30,816,7724,808,302,777,7880,775,304,770,206,772,298,774,300,803,7882,769,205,768,204,771,296,783,520,776,207,785,522,780,463}; static const MVMint32 comp_entry_12[] = {2,770,308}; static const MVMint32 comp_entry_13[] = {10,803,7730,769,7728,780,488,817,7732,807,310}; static const MVMint32 comp_entry_14[] = {12,817,7738,769,313,807,315,780,317,803,7734,813,7740}; static const MVMint32 comp_entry_15[] = {6,803,7746,769,7742,775,7744}; static const MVMint32 comp_entry_16[] = {18,813,7754,768,504,807,325,803,7750,817,7752,780,327,769,323,771,209,775,7748}; static const MVMint32 comp_entry_17[] = {32,776,214,808,490,775,558,779,336,777,7886,795,416,780,465,769,211,783,524,768,210,772,332,785,526,770,212,774,334,803,7884,771,213}; static const MVMint32 comp_entry_18[] = {4,769,7764,775,7766}; static const MVMint32 comp_entry_19[] = {16,817,7774,780,344,803,7770,769,340,785,530,807,342,783,528,775,7768}; static const MVMint32 comp_entry_20[] = {14,807,350,770,348,803,7778,806,536,769,346,780,352,775,7776}; static const MVMint32 comp_entry_21[] = {14,817,7790,803,7788,813,7792,780,356,806,538,807,354,775,7786}; static const MVMint32 comp_entry_22[] = {38,777,7910,813,7798,774,364,768,217,778,366,816,7796,776,220,779,368,780,467,795,431,803,7908,769,218,771,360,804,7794,808,370,770,219,785,534,783,532,772,362}; static const MVMint32 comp_entry_23[] = {4,803,7806,771,7804}; static const MVMint32 comp_entry_24[] = {12,769,7810,776,7812,770,372,803,7816,775,7814,768,7808}; static const MVMint32 comp_entry_25[] = {4,775,7818,776,7820}; static const MVMint32 comp_entry_26[] = {18,775,7822,768,7922,770,374,769,221,771,7928,772,562,803,7924,776,376,777,7926}; static const MVMint32 comp_entry_27[] = {12,769,377,803,7826,780,381,770,7824,775,379,817,7828}; static const MVMint32 comp_entry_28[] = {32,780,462,774,259,775,551,771,227,805,7681,803,7841,776,228,778,229,769,225,768,224,772,257,777,7843,808,261,783,513,785,515,770,226}; static const MVMint32 comp_entry_29[] = {6,803,7685,775,7683,817,7687}; static const MVMint32 comp_entry_30[] = {10,775,267,780,269,769,263,807,231,770,265}; static const MVMint32 comp_entry_31[] = {12,803,7693,813,7699,807,7697,780,271,817,7695,775,7691}; static const MVMint32 comp_entry_32[] = {34,780,283,783,517,813,7705,776,235,769,233,775,279,771,7869,807,553,768,232,774,277,785,519,772,275,816,7707,808,281,803,7865,777,7867,770,234}; static const MVMint32 comp_entry_33[] = {2,775,7711}; static const MVMint32 comp_entry_34[] = {14,774,287,772,7713,769,501,780,487,807,291,775,289,770,285}; static const MVMint32 comp_entry_35[] = {16,780,543,770,293,776,7719,775,7715,817,7830,814,7723,803,7717,807,7721}; static const MVMint32 comp_entry_36[] = {28,785,523,803,7883,769,237,808,303,772,299,780,464,783,521,777,7881,771,297,774,301,768,236,776,239,816,7725,770,238}; static const MVMint32 comp_entry_37[] = {4,770,309,780,496}; static const MVMint32 comp_entry_38[] = {10,769,7729,803,7731,780,489,807,311,817,7733}; static const MVMint32 comp_entry_39[] = {12,780,318,769,314,813,7741,817,7739,803,7735,807,316}; static const MVMint32 comp_entry_40[] = {6,769,7743,803,7747,775,7745}; static const MVMint32 comp_entry_41[] = {18,813,7755,769,324,771,241,817,7753,807,326,768,505,780,328,775,7749,803,7751}; static const MVMint32 comp_entry_42[] = {32,770,244,783,525,774,335,779,337,776,246,772,333,795,417,785,527,775,559,803,7885,780,466,771,245,768,242,769,243,777,7887,808,491}; static const MVMint32 comp_entry_43[] = {4,769,7765,775,7767}; static const MVMint32 comp_entry_44[] = {16,785,531,780,345,769,341,817,7775,807,343,783,529,803,7771,775,7769}; static const MVMint32 comp_entry_45[] = {14,803,7779,770,349,806,537,780,353,807,351,775,7777,769,347}; static const MVMint32 comp_entry_46[] = {16,780,357,807,355,776,7831,806,539,803,7789,775,7787,813,7793,817,7791}; static const MVMint32 comp_entry_47[] = {38,768,249,777,7911,783,533,780,468,816,7797,771,361,803,7909,770,251,785,535,808,371,778,367,779,369,776,252,774,365,769,250,804,7795,813,7799,795,432,772,363}; static const MVMint32 comp_entry_48[] = {4,771,7805,803,7807}; static const MVMint32 comp_entry_49[] = {14,778,7832,775,7815,768,7809,803,7817,776,7813,769,7811,770,373}; static const MVMint32 comp_entry_50[] = {4,776,7821,775,7819}; static const MVMint32 comp_entry_51[] = {20,772,563,769,253,771,7929,803,7925,770,375,775,7823,776,255,778,7833,768,7923,777,7927}; static const MVMint32 comp_entry_52[] = {12,770,7825,769,378,817,7829,780,382,803,7827,775,380}; static const MVMint32 comp_entry_53[] = {6,769,901,768,8173,834,8129}; static const MVMint32 comp_entry_54[] = {8,769,7844,771,7850,777,7848,768,7846}; static const MVMint32 comp_entry_55[] = {2,772,478}; static const MVMint32 comp_entry_56[] = {2,769,506}; static const MVMint32 comp_entry_57[] = {4,769,508,772,482}; static const MVMint32 comp_entry_58[] = {2,769,7688}; static const MVMint32 comp_entry_59[] = {8,777,7874,768,7872,769,7870,771,7876}; static const MVMint32 comp_entry_60[] = {2,769,7726}; static const MVMint32 comp_entry_61[] = {8,768,7890,777,7892,771,7894,769,7888}; static const MVMint32 comp_entry_62[] = {6,772,556,769,7756,776,7758}; static const MVMint32 comp_entry_63[] = {2,772,554}; static const MVMint32 comp_entry_64[] = {2,769,510}; static const MVMint32 comp_entry_65[] = {8,769,471,768,475,780,473,772,469}; static const MVMint32 comp_entry_66[] = {8,777,7849,768,7847,769,7845,771,7851}; static const MVMint32 comp_entry_67[] = {2,772,479}; static const MVMint32 comp_entry_68[] = {2,769,507}; static const MVMint32 comp_entry_69[] = {4,772,483,769,509}; static const MVMint32 comp_entry_70[] = {2,769,7689}; static const MVMint32 comp_entry_71[] = {8,777,7875,768,7873,771,7877,769,7871}; static const MVMint32 comp_entry_72[] = {2,769,7727}; static const MVMint32 comp_entry_73[] = {8,777,7893,769,7889,768,7891,771,7895}; static const MVMint32 comp_entry_74[] = {6,776,7759,772,557,769,7757}; static const MVMint32 comp_entry_75[] = {2,772,555}; static const MVMint32 comp_entry_76[] = {2,769,511}; static const MVMint32 comp_entry_77[] = {8,768,476,780,474,769,472,772,470}; static const MVMint32 comp_entry_78[] = {8,777,7858,768,7856,771,7860,769,7854}; static const MVMint32 comp_entry_79[] = {8,769,7855,768,7857,777,7859,771,7861}; static const MVMint32 comp_entry_80[] = {4,768,7700,769,7702}; static const MVMint32 comp_entry_81[] = {4,769,7703,768,7701}; static const MVMint32 comp_entry_82[] = {4,768,7760,769,7762}; static const MVMint32 comp_entry_83[] = {4,768,7761,769,7763}; static const MVMint32 comp_entry_84[] = {2,775,7780}; static const MVMint32 comp_entry_85[] = {2,775,7781}; static const MVMint32 comp_entry_86[] = {2,775,7782}; static const MVMint32 comp_entry_87[] = {2,775,7783}; static const MVMint32 comp_entry_88[] = {2,769,7800}; static const MVMint32 comp_entry_89[] = {2,769,7801}; static const MVMint32 comp_entry_90[] = {2,776,7802}; static const MVMint32 comp_entry_91[] = {2,776,7803}; static const MVMint32 comp_entry_92[] = {2,775,7835}; static const MVMint32 comp_entry_93[] = {10,768,7900,771,7904,803,7906,777,7902,769,7898}; static const MVMint32 comp_entry_94[] = {10,803,7907,768,7901,777,7903,771,7905,769,7899}; static const MVMint32 comp_entry_95[] = {10,771,7918,768,7914,769,7912,777,7916,803,7920}; static const MVMint32 comp_entry_96[] = {10,803,7921,777,7917,771,7919,769,7913,768,7915}; static const MVMint32 comp_entry_97[] = {2,780,494}; static const MVMint32 comp_entry_98[] = {2,772,492}; static const MVMint32 comp_entry_99[] = {2,772,493}; static const MVMint32 comp_entry_100[] = {2,772,480}; static const MVMint32 comp_entry_101[] = {2,772,481}; static const MVMint32 comp_entry_102[] = {2,774,7708}; static const MVMint32 comp_entry_103[] = {2,774,7709}; static const MVMint32 comp_entry_104[] = {2,772,560}; static const MVMint32 comp_entry_105[] = {2,772,561}; static const MVMint32 comp_entry_106[] = {2,780,495}; static const MVMint32 comp_entry_107[] = {14,772,8121,837,8124,768,8122,774,8120,787,7944,788,7945,769,902}; static const MVMint32 comp_entry_108[] = {8,768,8136,787,7960,769,904,788,7961}; static const MVMint32 comp_entry_109[] = {10,768,8138,769,905,788,7977,837,8140,787,7976}; static const MVMint32 comp_entry_110[] = {14,772,8153,787,7992,776,938,768,8154,774,8152,788,7993,769,906}; static const MVMint32 comp_entry_111[] = {8,788,8009,769,908,768,8184,787,8008}; static const MVMint32 comp_entry_112[] = {2,788,8172}; static const MVMint32 comp_entry_113[] = {12,768,8170,774,8168,772,8169,769,910,788,8025,776,939}; static const MVMint32 comp_entry_114[] = {10,787,8040,768,8186,769,911,837,8188,788,8041}; static const MVMint32 comp_entry_115[] = {2,837,8116}; static const MVMint32 comp_entry_116[] = {2,837,8132}; static const MVMint32 comp_entry_117[] = {16,788,7937,774,8112,769,940,768,8048,787,7936,837,8115,772,8113,834,8118}; static const MVMint32 comp_entry_118[] = {8,769,941,768,8050,787,7952,788,7953}; static const MVMint32 comp_entry_119[] = {12,769,942,837,8131,787,7968,768,8052,834,8134,788,7969}; static const MVMint32 comp_entry_120[] = {16,774,8144,769,943,834,8150,768,8054,788,7985,787,7984,772,8145,776,970}; static const MVMint32 comp_entry_121[] = {8,787,8000,788,8001,768,8056,769,972}; static const MVMint32 comp_entry_122[] = {4,788,8165,787,8164}; static const MVMint32 comp_entry_123[] = {16,834,8166,776,971,774,8160,769,973,788,8017,787,8016,768,8058,772,8161}; static const MVMint32 comp_entry_124[] = {12,837,8179,834,8182,787,8032,769,974,768,8060,788,8033}; static const MVMint32 comp_entry_125[] = {6,834,8151,768,8146,769,912}; static const MVMint32 comp_entry_126[] = {6,834,8167,769,944,768,8162}; static const MVMint32 comp_entry_127[] = {2,837,8180}; static const MVMint32 comp_entry_128[] = {4,776,980,769,979}; static const MVMint32 comp_entry_129[] = {2,776,1031}; static const MVMint32 comp_entry_130[] = {4,776,1234,774,1232}; static const MVMint32 comp_entry_131[] = {2,769,1027}; static const MVMint32 comp_entry_132[] = {6,776,1025,768,1024,774,1238}; static const MVMint32 comp_entry_133[] = {4,776,1244,774,1217}; static const MVMint32 comp_entry_134[] = {2,776,1246}; static const MVMint32 comp_entry_135[] = {8,772,1250,776,1252,774,1049,768,1037}; static const MVMint32 comp_entry_136[] = {2,769,1036}; static const MVMint32 comp_entry_137[] = {2,776,1254}; static const MVMint32 comp_entry_138[] = {8,779,1266,774,1038,776,1264,772,1262}; static const MVMint32 comp_entry_139[] = {2,776,1268}; static const MVMint32 comp_entry_140[] = {2,776,1272}; static const MVMint32 comp_entry_141[] = {2,776,1260}; static const MVMint32 comp_entry_142[] = {4,774,1233,776,1235}; static const MVMint32 comp_entry_143[] = {2,769,1107}; static const MVMint32 comp_entry_144[] = {6,776,1105,768,1104,774,1239}; static const MVMint32 comp_entry_145[] = {4,774,1218,776,1245}; static const MVMint32 comp_entry_146[] = {2,776,1247}; static const MVMint32 comp_entry_147[] = {8,768,1117,774,1081,772,1251,776,1253}; static const MVMint32 comp_entry_148[] = {2,769,1116}; static const MVMint32 comp_entry_149[] = {2,776,1255}; static const MVMint32 comp_entry_150[] = {8,772,1263,779,1267,776,1265,774,1118}; static const MVMint32 comp_entry_151[] = {2,776,1269}; static const MVMint32 comp_entry_152[] = {2,776,1273}; static const MVMint32 comp_entry_153[] = {2,776,1261}; static const MVMint32 comp_entry_154[] = {2,776,1111}; static const MVMint32 comp_entry_155[] = {2,783,1142}; static const MVMint32 comp_entry_156[] = {2,783,1143}; static const MVMint32 comp_entry_157[] = {2,776,1242}; static const MVMint32 comp_entry_158[] = {2,776,1243}; static const MVMint32 comp_entry_159[] = {2,776,1258}; static const MVMint32 comp_entry_160[] = {2,776,1259}; static const MVMint32 comp_entry_161[] = {6,1619,1570,1621,1573,1620,1571}; static const MVMint32 comp_entry_162[] = {2,1620,1572}; static const MVMint32 comp_entry_163[] = {2,1620,1574}; static const MVMint32 comp_entry_164[] = {2,1620,1730}; static const MVMint32 comp_entry_165[] = {2,1620,1747}; static const MVMint32 comp_entry_166[] = {2,1620,1728}; static const MVMint32 comp_entry_167[] = {2,2364,2345}; static const MVMint32 comp_entry_168[] = {2,2364,2353}; static const MVMint32 comp_entry_169[] = {2,2364,2356}; static const MVMint32 comp_entry_170[] = {4,2519,2508,2494,2507}; static const MVMint32 comp_entry_171[] = {6,2902,2888,2903,2892,2878,2891}; static const MVMint32 comp_entry_172[] = {2,3031,2964}; static const MVMint32 comp_entry_173[] = {4,3031,3020,3006,3018}; static const MVMint32 comp_entry_174[] = {2,3006,3019}; static const MVMint32 comp_entry_175[] = {2,3158,3144}; static const MVMint32 comp_entry_176[] = {2,3285,3264}; static const MVMint32 comp_entry_177[] = {6,3286,3272,3266,3274,3285,3271}; static const MVMint32 comp_entry_178[] = {2,3285,3275}; static const MVMint32 comp_entry_179[] = {4,3415,3404,3390,3402}; static const MVMint32 comp_entry_180[] = {2,3390,3403}; static const MVMint32 comp_entry_181[] = {6,3551,3550,3535,3548,3530,3546}; static const MVMint32 comp_entry_182[] = {2,3530,3549}; static const MVMint32 comp_entry_183[] = {2,4142,4134}; static const MVMint32 comp_entry_184[] = {2,6965,6918}; static const MVMint32 comp_entry_185[] = {2,6965,6920}; static const MVMint32 comp_entry_186[] = {2,6965,6922}; static const MVMint32 comp_entry_187[] = {2,6965,6924}; static const MVMint32 comp_entry_188[] = {2,6965,6926}; static const MVMint32 comp_entry_189[] = {2,6965,6930}; static const MVMint32 comp_entry_190[] = {2,6965,6971}; static const MVMint32 comp_entry_191[] = {2,6965,6973}; static const MVMint32 comp_entry_192[] = {2,6965,6976}; static const MVMint32 comp_entry_193[] = {2,6965,6977}; static const MVMint32 comp_entry_194[] = {2,6965,6979}; static const MVMint32 comp_entry_195[] = {2,772,7736}; static const MVMint32 comp_entry_196[] = {2,772,7737}; static const MVMint32 comp_entry_197[] = {2,772,7772}; static const MVMint32 comp_entry_198[] = {2,772,7773}; static const MVMint32 comp_entry_199[] = {2,775,7784}; static const MVMint32 comp_entry_200[] = {2,775,7785}; static const MVMint32 comp_entry_201[] = {4,770,7852,774,7862}; static const MVMint32 comp_entry_202[] = {4,774,7863,770,7853}; static const MVMint32 comp_entry_203[] = {2,770,7878}; static const MVMint32 comp_entry_204[] = {2,770,7879}; static const MVMint32 comp_entry_205[] = {2,770,7896}; static const MVMint32 comp_entry_206[] = {2,770,7897}; static const MVMint32 comp_entry_207[] = {8,834,7942,769,7940,768,7938,837,8064}; static const MVMint32 comp_entry_208[] = {8,837,8065,769,7941,768,7939,834,7943}; static const MVMint32 comp_entry_209[] = {2,837,8066}; static const MVMint32 comp_entry_210[] = {2,837,8067}; static const MVMint32 comp_entry_211[] = {2,837,8068}; static const MVMint32 comp_entry_212[] = {2,837,8069}; static const MVMint32 comp_entry_213[] = {2,837,8070}; static const MVMint32 comp_entry_214[] = {2,837,8071}; static const MVMint32 comp_entry_215[] = {8,769,7948,834,7950,837,8072,768,7946}; static const MVMint32 comp_entry_216[] = {8,834,7951,768,7947,837,8073,769,7949}; static const MVMint32 comp_entry_217[] = {2,837,8074}; static const MVMint32 comp_entry_218[] = {2,837,8075}; static const MVMint32 comp_entry_219[] = {2,837,8076}; static const MVMint32 comp_entry_220[] = {2,837,8077}; static const MVMint32 comp_entry_221[] = {2,837,8078}; static const MVMint32 comp_entry_222[] = {2,837,8079}; static const MVMint32 comp_entry_223[] = {4,768,7954,769,7956}; static const MVMint32 comp_entry_224[] = {4,769,7957,768,7955}; static const MVMint32 comp_entry_225[] = {4,769,7964,768,7962}; static const MVMint32 comp_entry_226[] = {4,768,7963,769,7965}; static const MVMint32 comp_entry_227[] = {8,834,7974,768,7970,769,7972,837,8080}; static const MVMint32 comp_entry_228[] = {8,769,7973,837,8081,768,7971,834,7975}; static const MVMint32 comp_entry_229[] = {2,837,8082}; static const MVMint32 comp_entry_230[] = {2,837,8083}; static const MVMint32 comp_entry_231[] = {2,837,8084}; static const MVMint32 comp_entry_232[] = {2,837,8085}; static const MVMint32 comp_entry_233[] = {2,837,8086}; static const MVMint32 comp_entry_234[] = {2,837,8087}; static const MVMint32 comp_entry_235[] = {8,837,8088,768,7978,834,7982,769,7980}; static const MVMint32 comp_entry_236[] = {8,769,7981,834,7983,768,7979,837,8089}; static const MVMint32 comp_entry_237[] = {2,837,8090}; static const MVMint32 comp_entry_238[] = {2,837,8091}; static const MVMint32 comp_entry_239[] = {2,837,8092}; static const MVMint32 comp_entry_240[] = {2,837,8093}; static const MVMint32 comp_entry_241[] = {2,837,8094}; static const MVMint32 comp_entry_242[] = {2,837,8095}; static const MVMint32 comp_entry_243[] = {6,769,7988,834,7990,768,7986}; static const MVMint32 comp_entry_244[] = {6,769,7989,834,7991,768,7987}; static const MVMint32 comp_entry_245[] = {6,769,7996,768,7994,834,7998}; static const MVMint32 comp_entry_246[] = {6,768,7995,834,7999,769,7997}; static const MVMint32 comp_entry_247[] = {4,768,8002,769,8004}; static const MVMint32 comp_entry_248[] = {4,769,8005,768,8003}; static const MVMint32 comp_entry_249[] = {4,768,8010,769,8012}; static const MVMint32 comp_entry_250[] = {4,769,8013,768,8011}; static const MVMint32 comp_entry_251[] = {6,768,8018,769,8020,834,8022}; static const MVMint32 comp_entry_252[] = {6,769,8021,768,8019,834,8023}; static const MVMint32 comp_entry_253[] = {6,769,8029,768,8027,834,8031}; static const MVMint32 comp_entry_254[] = {8,768,8034,837,8096,834,8038,769,8036}; static const MVMint32 comp_entry_255[] = {8,837,8097,834,8039,769,8037,768,8035}; static const MVMint32 comp_entry_256[] = {2,837,8098}; static const MVMint32 comp_entry_257[] = {2,837,8099}; static const MVMint32 comp_entry_258[] = {2,837,8100}; static const MVMint32 comp_entry_259[] = {2,837,8101}; static const MVMint32 comp_entry_260[] = {2,837,8102}; static const MVMint32 comp_entry_261[] = {2,837,8103}; static const MVMint32 comp_entry_262[] = {8,837,8104,834,8046,768,8042,769,8044}; static const MVMint32 comp_entry_263[] = {8,837,8105,769,8045,768,8043,834,8047}; static const MVMint32 comp_entry_264[] = {2,837,8106}; static const MVMint32 comp_entry_265[] = {2,837,8107}; static const MVMint32 comp_entry_266[] = {2,837,8108}; static const MVMint32 comp_entry_267[] = {2,837,8109}; static const MVMint32 comp_entry_268[] = {2,837,8110}; static const MVMint32 comp_entry_269[] = {2,837,8111}; static const MVMint32 comp_entry_270[] = {2,837,8114}; static const MVMint32 comp_entry_271[] = {2,837,8130}; static const MVMint32 comp_entry_272[] = {2,837,8178}; static const MVMint32 comp_entry_273[] = {2,837,8119}; static const MVMint32 comp_entry_274[] = {6,768,8141,834,8143,769,8142}; static const MVMint32 comp_entry_275[] = {2,837,8135}; static const MVMint32 comp_entry_276[] = {2,837,8183}; static const MVMint32 comp_entry_277[] = {6,768,8157,834,8159,769,8158}; static const MVMint32 comp_entry_278[] = {2,824,8602}; static const MVMint32 comp_entry_279[] = {2,824,8603}; static const MVMint32 comp_entry_280[] = {2,824,8622}; static const MVMint32 comp_entry_281[] = {2,824,8653}; static const MVMint32 comp_entry_282[] = {2,824,8655}; static const MVMint32 comp_entry_283[] = {2,824,8654}; static const MVMint32 comp_entry_284[] = {2,824,8708}; static const MVMint32 comp_entry_285[] = {2,824,8713}; static const MVMint32 comp_entry_286[] = {2,824,8716}; static const MVMint32 comp_entry_287[] = {2,824,8740}; static const MVMint32 comp_entry_288[] = {2,824,8742}; static const MVMint32 comp_entry_289[] = {2,824,8769}; static const MVMint32 comp_entry_290[] = {2,824,8772}; static const MVMint32 comp_entry_291[] = {2,824,8775}; static const MVMint32 comp_entry_292[] = {2,824,8777}; static const MVMint32 comp_entry_293[] = {2,824,8813}; static const MVMint32 comp_entry_294[] = {2,824,8802}; static const MVMint32 comp_entry_295[] = {2,824,8816}; static const MVMint32 comp_entry_296[] = {2,824,8817}; static const MVMint32 comp_entry_297[] = {2,824,8820}; static const MVMint32 comp_entry_298[] = {2,824,8821}; static const MVMint32 comp_entry_299[] = {2,824,8824}; static const MVMint32 comp_entry_300[] = {2,824,8825}; static const MVMint32 comp_entry_301[] = {2,824,8832}; static const MVMint32 comp_entry_302[] = {2,824,8833}; static const MVMint32 comp_entry_303[] = {2,824,8928}; static const MVMint32 comp_entry_304[] = {2,824,8929}; static const MVMint32 comp_entry_305[] = {2,824,8836}; static const MVMint32 comp_entry_306[] = {2,824,8837}; static const MVMint32 comp_entry_307[] = {2,824,8840}; static const MVMint32 comp_entry_308[] = {2,824,8841}; static const MVMint32 comp_entry_309[] = {2,824,8930}; static const MVMint32 comp_entry_310[] = {2,824,8931}; static const MVMint32 comp_entry_311[] = {2,824,8876}; static const MVMint32 comp_entry_312[] = {2,824,8877}; static const MVMint32 comp_entry_313[] = {2,824,8878}; static const MVMint32 comp_entry_314[] = {2,824,8879}; static const MVMint32 comp_entry_315[] = {2,824,8938}; static const MVMint32 comp_entry_316[] = {2,824,8939}; static const MVMint32 comp_entry_317[] = {2,824,8940}; static const MVMint32 comp_entry_318[] = {2,824,8941}; static const MVMint32 comp_entry_319[] = {2,12441,12436}; static const MVMint32 comp_entry_320[] = {2,12441,12364}; static const MVMint32 comp_entry_321[] = {2,12441,12366}; static const MVMint32 comp_entry_322[] = {2,12441,12368}; static const MVMint32 comp_entry_323[] = {2,12441,12370}; static const MVMint32 comp_entry_324[] = {2,12441,12372}; static const MVMint32 comp_entry_325[] = {2,12441,12374}; static const MVMint32 comp_entry_326[] = {2,12441,12376}; static const MVMint32 comp_entry_327[] = {2,12441,12378}; static const MVMint32 comp_entry_328[] = {2,12441,12380}; static const MVMint32 comp_entry_329[] = {2,12441,12382}; static const MVMint32 comp_entry_330[] = {2,12441,12384}; static const MVMint32 comp_entry_331[] = {2,12441,12386}; static const MVMint32 comp_entry_332[] = {2,12441,12389}; static const MVMint32 comp_entry_333[] = {2,12441,12391}; static const MVMint32 comp_entry_334[] = {2,12441,12393}; static const MVMint32 comp_entry_335[] = {4,12442,12401,12441,12400}; static const MVMint32 comp_entry_336[] = {4,12441,12403,12442,12404}; static const MVMint32 comp_entry_337[] = {4,12441,12406,12442,12407}; static const MVMint32 comp_entry_338[] = {4,12442,12410,12441,12409}; static const MVMint32 comp_entry_339[] = {4,12442,12413,12441,12412}; static const MVMint32 comp_entry_340[] = {2,12441,12446}; static const MVMint32 comp_entry_341[] = {2,12441,12532}; static const MVMint32 comp_entry_342[] = {2,12441,12460}; static const MVMint32 comp_entry_343[] = {2,12441,12462}; static const MVMint32 comp_entry_344[] = {2,12441,12464}; static const MVMint32 comp_entry_345[] = {2,12441,12466}; static const MVMint32 comp_entry_346[] = {2,12441,12468}; static const MVMint32 comp_entry_347[] = {2,12441,12470}; static const MVMint32 comp_entry_348[] = {2,12441,12472}; static const MVMint32 comp_entry_349[] = {2,12441,12474}; static const MVMint32 comp_entry_350[] = {2,12441,12476}; static const MVMint32 comp_entry_351[] = {2,12441,12478}; static const MVMint32 comp_entry_352[] = {2,12441,12480}; static const MVMint32 comp_entry_353[] = {2,12441,12482}; static const MVMint32 comp_entry_354[] = {2,12441,12485}; static const MVMint32 comp_entry_355[] = {2,12441,12487}; static const MVMint32 comp_entry_356[] = {2,12441,12489}; static const MVMint32 comp_entry_357[] = {4,12442,12497,12441,12496}; static const MVMint32 comp_entry_358[] = {4,12442,12500,12441,12499}; static const MVMint32 comp_entry_359[] = {4,12442,12503,12441,12502}; static const MVMint32 comp_entry_360[] = {4,12442,12506,12441,12505}; static const MVMint32 comp_entry_361[] = {4,12442,12509,12441,12508}; static const MVMint32 comp_entry_362[] = {2,12441,12535}; static const MVMint32 comp_entry_363[] = {2,12441,12536}; static const MVMint32 comp_entry_364[] = {2,12441,12537}; static const MVMint32 comp_entry_365[] = {2,12441,12538}; static const MVMint32 comp_entry_366[] = {2,12441,12542}; static const MVMint32 comp_entry_367[] = {2,69818,69786}; static const MVMint32 comp_entry_368[] = {2,69818,69788}; static const MVMint32 comp_entry_369[] = {2,69818,69803}; static const MVMint32 comp_entry_370[] = {2,69927,69934}; static const MVMint32 comp_entry_371[] = {2,69927,69935}; static const MVMint32 comp_entry_372[] = {4,70487,70476,70462,70475}; static const MVMint32 comp_entry_373[] = {6,70842,70843,70845,70846,70832,70844}; static const MVMint32 comp_entry_374[] = {2,71087,71098}; static const MVMint32 comp_entry_375[] = {2,71087,71099}; static const MVMint32 *comp_l_empty[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_0[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_0,comp_entry_1,comp_entry_2,NULL,NULL,comp_entry_3,comp_entry_4,comp_entry_5,comp_entry_6,comp_entry_7,comp_entry_8,comp_entry_9,comp_entry_10,comp_entry_11,comp_entry_12,comp_entry_13,comp_entry_14,comp_entry_15,comp_entry_16,comp_entry_17,comp_entry_18,NULL,comp_entry_19,comp_entry_20,comp_entry_21,comp_entry_22,comp_entry_23,comp_entry_24,comp_entry_25,comp_entry_26,comp_entry_27,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_28,comp_entry_29,comp_entry_30,comp_entry_31,comp_entry_32,comp_entry_33,comp_entry_34,comp_entry_35,comp_entry_36,comp_entry_37,comp_entry_38,comp_entry_39,comp_entry_40,comp_entry_41,comp_entry_42,comp_entry_43,NULL,comp_entry_44,comp_entry_45,comp_entry_46,comp_entry_47,comp_entry_48,comp_entry_49,comp_entry_50,comp_entry_51,comp_entry_52,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_53,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_54,NULL,comp_entry_55,comp_entry_56,comp_entry_57,comp_entry_58,NULL,NULL,comp_entry_59,NULL,NULL,NULL,NULL,comp_entry_60,NULL,NULL,NULL,NULL,comp_entry_61,comp_entry_62,comp_entry_63,NULL,comp_entry_64,NULL,NULL,NULL,comp_entry_65,NULL,NULL,NULL,NULL,NULL,comp_entry_66,NULL,comp_entry_67,comp_entry_68,comp_entry_69,comp_entry_70,NULL,NULL,comp_entry_71,NULL,NULL,NULL,NULL,comp_entry_72,NULL,NULL,NULL,NULL,comp_entry_73,comp_entry_74,comp_entry_75,NULL,comp_entry_76,NULL,NULL,NULL,comp_entry_77,NULL,NULL,NULL,}; static const MVMint32 *comp_l_1[] = {NULL,NULL,comp_entry_78,comp_entry_79,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_80,comp_entry_81,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_82,comp_entry_83,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_84,comp_entry_85,NULL,NULL,NULL,NULL,comp_entry_86,comp_entry_87,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_88,comp_entry_89,comp_entry_90,comp_entry_91,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_92,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_93,comp_entry_94,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_95,comp_entry_96,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_97,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_98,comp_entry_99,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_2[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_100,comp_entry_101,comp_entry_102,comp_entry_103,NULL,NULL,NULL,NULL,comp_entry_104,comp_entry_105,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_106,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_3[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_107,NULL,NULL,NULL,comp_entry_108,NULL,comp_entry_109,NULL,comp_entry_110,NULL,NULL,NULL,NULL,NULL,comp_entry_111,NULL,comp_entry_112,NULL,NULL,NULL,comp_entry_113,NULL,NULL,NULL,comp_entry_114,NULL,NULL,comp_entry_115,NULL,comp_entry_116,NULL,NULL,comp_entry_117,NULL,NULL,NULL,comp_entry_118,NULL,comp_entry_119,NULL,comp_entry_120,NULL,NULL,NULL,NULL,NULL,comp_entry_121,NULL,comp_entry_122,NULL,NULL,NULL,comp_entry_123,NULL,NULL,NULL,comp_entry_124,comp_entry_125,comp_entry_126,NULL,NULL,comp_entry_127,NULL,NULL,NULL,comp_entry_128,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_4[] = {NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_129,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_130,NULL,NULL,comp_entry_131,NULL,comp_entry_132,comp_entry_133,comp_entry_134,comp_entry_135,NULL,comp_entry_136,NULL,NULL,NULL,comp_entry_137,NULL,NULL,NULL,NULL,comp_entry_138,NULL,NULL,NULL,comp_entry_139,NULL,NULL,NULL,comp_entry_140,NULL,comp_entry_141,NULL,NULL,comp_entry_142,NULL,NULL,comp_entry_143,NULL,comp_entry_144,comp_entry_145,comp_entry_146,comp_entry_147,NULL,comp_entry_148,NULL,NULL,NULL,comp_entry_149,NULL,NULL,NULL,NULL,comp_entry_150,NULL,NULL,NULL,comp_entry_151,NULL,NULL,NULL,comp_entry_152,NULL,comp_entry_153,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_154,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_155,comp_entry_156,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_157,comp_entry_158,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_159,comp_entry_160,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_5[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_161,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_162,NULL,comp_entry_163,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_164,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_165,NULL,NULL,comp_entry_166,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_6[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_167,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_168,NULL,NULL,comp_entry_169,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_170,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_7[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_171,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_172,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_173,comp_entry_174,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_8[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_175,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_176,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_177,NULL,NULL,NULL,comp_entry_178,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_9[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_179,comp_entry_180,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_181,NULL,NULL,comp_entry_182,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_10[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_183,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_11[] = {NULL,NULL,NULL,NULL,NULL,comp_entry_184,NULL,comp_entry_185,NULL,comp_entry_186,NULL,comp_entry_187,NULL,comp_entry_188,NULL,NULL,NULL,comp_entry_189,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_190,NULL,comp_entry_191,NULL,comp_entry_192,comp_entry_193,NULL,NULL,comp_entry_194,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_12[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_195,comp_entry_196,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_197,comp_entry_198,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_199,comp_entry_200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_201,comp_entry_202,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_203,comp_entry_204,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_205,comp_entry_206,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_13[] = {comp_entry_207,comp_entry_208,comp_entry_209,comp_entry_210,comp_entry_211,comp_entry_212,comp_entry_213,comp_entry_214,comp_entry_215,comp_entry_216,comp_entry_217,comp_entry_218,comp_entry_219,comp_entry_220,comp_entry_221,comp_entry_222,comp_entry_223,comp_entry_224,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_225,comp_entry_226,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_227,comp_entry_228,comp_entry_229,comp_entry_230,comp_entry_231,comp_entry_232,comp_entry_233,comp_entry_234,comp_entry_235,comp_entry_236,comp_entry_237,comp_entry_238,comp_entry_239,comp_entry_240,comp_entry_241,comp_entry_242,comp_entry_243,comp_entry_244,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_245,comp_entry_246,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_247,comp_entry_248,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_249,comp_entry_250,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_251,comp_entry_252,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_253,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_254,comp_entry_255,comp_entry_256,comp_entry_257,comp_entry_258,comp_entry_259,comp_entry_260,comp_entry_261,comp_entry_262,comp_entry_263,comp_entry_264,comp_entry_265,comp_entry_266,comp_entry_267,comp_entry_268,comp_entry_269,comp_entry_270,NULL,NULL,NULL,comp_entry_271,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_272,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_273,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_274,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_275,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_276,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_277,NULL,}; static const MVMint32 *comp_l_14[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_278,NULL,comp_entry_279,NULL,comp_entry_280,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_281,NULL,comp_entry_282,NULL,comp_entry_283,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_15[] = {NULL,NULL,NULL,comp_entry_284,NULL,NULL,NULL,NULL,comp_entry_285,NULL,NULL,comp_entry_286,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_287,NULL,comp_entry_288,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_289,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_290,NULL,comp_entry_291,NULL,NULL,comp_entry_292,NULL,NULL,NULL,NULL,comp_entry_293,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_294,NULL,NULL,comp_entry_295,comp_entry_296,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_297,comp_entry_298,NULL,NULL,comp_entry_299,comp_entry_300,NULL,NULL,comp_entry_301,comp_entry_302,comp_entry_303,comp_entry_304,NULL,NULL,NULL,NULL,comp_entry_305,comp_entry_306,NULL,NULL,comp_entry_307,comp_entry_308,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_309,comp_entry_310,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_311,NULL,NULL,NULL,NULL,NULL,comp_entry_312,comp_entry_313,NULL,comp_entry_314,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_315,comp_entry_316,comp_entry_317,comp_entry_318,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_16[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_319,NULL,NULL,NULL,NULL,comp_entry_320,NULL,comp_entry_321,NULL,comp_entry_322,NULL,comp_entry_323,NULL,comp_entry_324,NULL,comp_entry_325,NULL,comp_entry_326,NULL,comp_entry_327,NULL,comp_entry_328,NULL,comp_entry_329,NULL,comp_entry_330,NULL,comp_entry_331,NULL,NULL,comp_entry_332,NULL,comp_entry_333,NULL,comp_entry_334,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_335,NULL,NULL,comp_entry_336,NULL,NULL,comp_entry_337,NULL,NULL,comp_entry_338,NULL,NULL,comp_entry_339,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_340,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_341,NULL,NULL,NULL,NULL,comp_entry_342,NULL,comp_entry_343,NULL,comp_entry_344,NULL,comp_entry_345,NULL,comp_entry_346,NULL,comp_entry_347,NULL,comp_entry_348,NULL,comp_entry_349,NULL,comp_entry_350,NULL,comp_entry_351,NULL,comp_entry_352,NULL,comp_entry_353,NULL,NULL,comp_entry_354,NULL,comp_entry_355,NULL,comp_entry_356,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_357,NULL,NULL,comp_entry_358,NULL,NULL,comp_entry_359,NULL,NULL,comp_entry_360,NULL,NULL,comp_entry_361,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_362,comp_entry_363,comp_entry_364,comp_entry_365,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_366,NULL,NULL,}; static const MVMint32 *comp_l_17[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_367,NULL,comp_entry_368,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_369,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_18[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_370,comp_entry_371,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_19[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_372,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_20[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_373,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_21[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_374,comp_entry_375,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 **comp_u_empty[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 **comp_u_0[] = {comp_l_0,comp_l_1,comp_l_2,comp_l_3,comp_l_4,comp_l_empty,comp_l_5,comp_l_empty,comp_l_empty,comp_l_6,comp_l_empty,comp_l_7,comp_l_8,comp_l_9,comp_l_empty,comp_l_empty,comp_l_10,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_11,comp_l_empty,comp_l_empty,comp_l_12,comp_l_13,comp_l_empty,comp_l_14,comp_l_15,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_16,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,}; static const MVMint32 **comp_u_1[] = {comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_17,comp_l_18,comp_l_empty,comp_l_19,comp_l_20,comp_l_21,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,}; static const MVMint32 ***comp_p[] = {comp_u_0,comp_u_1,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,}; static const MVMint32 codepoint_extents[105][3] = { {0x0000,0,0}, {0x3406,2,13318}, {0x3483,0,13319}, {0x3484,2,13320}, {0x382a,0,13321}, {0x382b,2,13322}, {0x3b4d,0,13323}, {0x3b4e,2,13324}, {0x4dc0,0,13335}, {0x4f71,2,13768}, {0x5104,0,13769}, {0x516e,2,13875}, {0x5341,0,13876}, {0x534d,2,13888}, {0x53c1,0,13889}, {0x53c5,2,13893}, {0x56db,0,13894}, {0x56dc,2,13895}, {0x58f1,0,13896}, {0x58fa,2,13905}, {0x5e7a,0,13906}, {0x5e7b,2,13907}, {0x5efe,0,13908}, {0x5f11,2,13927}, {0x62fe,0,13928}, {0x634d,2,14007}, {0x67d2,0,14008}, {0x67d3,2,14009}, {0x6f06,0,14010}, {0x6f07,2,14011}, {0x7396,0,14012}, {0x7397,2,14013}, {0x767e,0,14014}, {0x767f,2,14015}, {0x8086,0,14016}, {0x8087,2,14017}, {0x842c,0,14018}, {0x842d,2,14019}, {0x8cae,0,14020}, {0x8cb4,2,14026}, {0x8d30,0,14027}, {0x8d31,2,14028}, {0x9621,0,14029}, {0x9679,2,14117}, {0x96f6,0,14118}, {0x96f7,2,14119}, {0x9fa6,0,14120}, {0xd800,2,28546}, {0xdb80,2,28547}, {0xdc00,2,28548}, {0xe000,2,28549}, {0xf900,0,28550}, {0xfffe,1,0}, {0x10000,0,30340}, {0x11af9,1,0}, {0x12000,0,37245}, {0x12544,1,0}, {0x13000,0,38593}, {0x1342f,1,0}, {0x14400,0,39664}, {0x14647,1,0}, {0x16800,0,40247}, {0x16fa0,1,0}, {0x1b000,0,42199}, {0x1b002,1,0}, {0x1bc00,0,42201}, {0x1bca4,1,0}, {0x1d000,0,42365}, {0x1dab0,1,0}, {0x1e800,0,45101}, {0x1e8d7,1,0}, {0x1ee00,0,45316}, {0x1f9c1,1,0}, {0x20000,0,48325}, {0x20065,2,48426}, {0x200e2,0,48427}, {0x20122,2,48491}, {0x2092a,0,48492}, {0x2099d,2,48607}, {0x20aea,0,48608}, {0x20b1a,2,48656}, {0x22390,0,48657}, {0x22391,2,48658}, {0x22998,0,48659}, {0x22999,2,48660}, {0x23b1b,0,48661}, {0x23b1c,2,48662}, {0x2626d,0,48663}, {0x2626e,2,48664}, {0x2a700,2,48706}, {0x2b740,2,48718}, {0x2b820,2,48721}, {0x2cea2,1,0}, {0x2f800,0,48722}, {0x2fa1e,1,0}, {0xe0001,0,49264}, {0xe01f0,1,0}, {0xf0000,0,49759}, {0xf0001,2,49760}, {0xffffe,1,0}, {0x100000,0,49761}, {0x100001,2,49762}, {0x10fffe,1,0}, {0x110000,0,49763}, {0x10FFFE,0} }; /* Lazily constructed hashtable of Unicode names to codepoints. Okay not to be threadsafe since its value is deterministic and I don't care about the tiny potential for a memory leak in the event of a race condition. */ static MVMUnicodeNameRegistry *codepoints_by_name = NULL; static void generate_codepoints_by_name(MVMThreadContext *tc) { MVMint32 extent_index = 0; MVMint32 codepoint = 0; MVMint32 codepoint_table_index = 0; MVMUnicodeNameRegistry *entry; for (; extent_index < MVM_NUM_UNICODE_EXTENTS; extent_index++) { MVMint32 length; codepoint = codepoint_extents[extent_index][0]; length = codepoint_extents[extent_index + 1][0] - codepoint_extents[extent_index][0]; if (codepoint_table_index >= MVM_CODEPOINT_NAMES_COUNT) continue; switch (codepoint_extents[extent_index][1]) { case 0: { MVMint32 extent_span_index = 0; codepoint_table_index = codepoint_extents[extent_index][2]; for (; extent_span_index < length && codepoint_table_index < MVM_CODEPOINT_NAMES_COUNT; extent_span_index++) { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint++; codepoint_table_index++; } break; } case 1: codepoint += length; break; case 2: { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint += length; codepoint_table_index++; break; } } } entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "LF"; entry->codepoint = 10; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "LF", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "FF"; entry->codepoint = 12; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "FF", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "CR"; entry->codepoint = 13; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "CR", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "NEL"; entry->codepoint = 133; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "NEL", 3, entry); } MoarVM-2015.11/src/strings/unicode_gen.h0000644000175000017500000001104512616160672016770 0ustar jnthnjnthn struct MVMUnicodeNamedValue { const char *name; MVMint32 value; }; #define num_unicode_property_keypairs 3606 #define MVM_NUM_UNICODE_EXTENTS 104 MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name); #define MVM_CODEPOINT_NAMES_COUNT 49764 #define MVM_NUM_PROPERTY_CODES 95 #define num_unicode_property_value_keypairs 3181 typedef enum { MVM_UNICODE_PROPERTY_DECOMP_SPEC = 1, MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX = 2, MVM_UNICODE_PROPERTY_SPECIAL_CASING = 3, MVM_UNICODE_PROPERTY_CASE_FOLDING = 4, MVM_UNICODE_PROPERTY_BLOCK = 5, MVM_UNICODE_PROPERTY_BIDI_MIRRORING_GLYPH = 6, MVM_UNICODE_PROPERTY_JOINING_TYPE = 7, MVM_UNICODE_PROPERTY_NUMERIC_VALUE = 8, MVM_UNICODE_PROPERTY_SCRIPT = 9, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR = 10, MVM_UNICODE_PROPERTY_JOINING_GROUP = 11, MVM_UNICODE_PROPERTY_NFG_QC = 12, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS = 13, MVM_UNICODE_PROPERTY_AGE = 14, MVM_UNICODE_PROPERTY_BIDI_CLASS = 15, MVM_UNICODE_PROPERTY_WORD_BREAK = 16, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY = 17, MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE = 18, MVM_UNICODE_PROPERTY_DIGIT = 19, MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT = 20, MVM_UNICODE_PROPERTY_LINE_BREAK = 21, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR = 22, MVM_UNICODE_PROPERTY_SENTENCE_BREAK = 23, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK = 24, MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE = 25, MVM_UNICODE_PROPERTY_NUMERIC_TYPE = 26, MVM_UNICODE_PROPERTY_NFKC_QC = 27, MVM_UNICODE_PROPERTY_NFC_QC = 28, MVM_UNICODE_PROPERTY_ALPHABETIC = 29, MVM_UNICODE_PROPERTY_ANY = 30, MVM_UNICODE_PROPERTY_ASSIGNED = 31, MVM_UNICODE_PROPERTY_BIDI_CONTROL = 32, MVM_UNICODE_PROPERTY_BIDI_MIRRORED = 33, MVM_UNICODE_PROPERTY_C = 34, MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE = 35, MVM_UNICODE_PROPERTY_CASE_IGNORABLE = 36, MVM_UNICODE_PROPERTY_CASED = 37, MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEFOLDED = 38, MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEMAPPED = 39, MVM_UNICODE_PROPERTY_CHANGES_WHEN_LOWERCASED = 40, MVM_UNICODE_PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED = 41, MVM_UNICODE_PROPERTY_CHANGES_WHEN_TITLECASED = 42, MVM_UNICODE_PROPERTY_CHANGES_WHEN_UPPERCASED = 43, MVM_UNICODE_PROPERTY_DASH = 44, MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 45, MVM_UNICODE_PROPERTY_DEPRECATED = 46, MVM_UNICODE_PROPERTY_DIACRITIC = 47, MVM_UNICODE_PROPERTY_EXTENDER = 48, MVM_UNICODE_PROPERTY_FULL_COMPOSITION_EXCLUSION = 49, MVM_UNICODE_PROPERTY_GRAPHEME_BASE = 50, MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND = 51, MVM_UNICODE_PROPERTY_GRAPHEME_LINK = 52, MVM_UNICODE_PROPERTY_HEX_DIGIT = 53, MVM_UNICODE_PROPERTY_HYPHEN = 54, MVM_UNICODE_PROPERTY_IDS_BINARY_OPERATOR = 55, MVM_UNICODE_PROPERTY_IDS_TRINARY_OPERATOR = 56, MVM_UNICODE_PROPERTY_ID_CONTINUE = 57, MVM_UNICODE_PROPERTY_ID_START = 58, MVM_UNICODE_PROPERTY_IDEOGRAPHIC = 59, MVM_UNICODE_PROPERTY_JOIN_CONTROL = 60, MVM_UNICODE_PROPERTY_L = 61, MVM_UNICODE_PROPERTY_LC = 62, MVM_UNICODE_PROPERTY_LOGICAL_ORDER_EXCEPTION = 63, MVM_UNICODE_PROPERTY_LOWERCASE = 64, MVM_UNICODE_PROPERTY_M = 65, MVM_UNICODE_PROPERTY_MATH = 66, MVM_UNICODE_PROPERTY_N = 67, MVM_UNICODE_PROPERTY_NFD_QC = 68, MVM_UNICODE_PROPERTY_NFKD_QC = 69, MVM_UNICODE_PROPERTY_NONCHARACTER_CODE_POINT = 70, MVM_UNICODE_PROPERTY_OTHER_ALPHABETIC = 71, MVM_UNICODE_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT = 72, MVM_UNICODE_PROPERTY_OTHER_GRAPHEME_EXTEND = 73, MVM_UNICODE_PROPERTY_OTHER_ID_CONTINUE = 74, MVM_UNICODE_PROPERTY_OTHER_ID_START = 75, MVM_UNICODE_PROPERTY_OTHER_LOWERCASE = 76, MVM_UNICODE_PROPERTY_OTHER_MATH = 77, MVM_UNICODE_PROPERTY_OTHER_UPPERCASE = 78, MVM_UNICODE_PROPERTY_P = 79, MVM_UNICODE_PROPERTY_PATTERN_SYNTAX = 80, MVM_UNICODE_PROPERTY_PATTERN_WHITE_SPACE = 81, MVM_UNICODE_PROPERTY_QUOTATION_MARK = 82, MVM_UNICODE_PROPERTY_RADICAL = 83, MVM_UNICODE_PROPERTY_S = 84, MVM_UNICODE_PROPERTY_STERM = 85, MVM_UNICODE_PROPERTY_SOFT_DOTTED = 86, MVM_UNICODE_PROPERTY_TERMINAL_PUNCTUATION = 87, MVM_UNICODE_PROPERTY_UNIFIED_IDEOGRAPH = 88, MVM_UNICODE_PROPERTY_UPPERCASE = 89, MVM_UNICODE_PROPERTY_VARIATION_SELECTOR = 90, MVM_UNICODE_PROPERTY_WHITE_SPACE = 91, MVM_UNICODE_PROPERTY_XID_CONTINUE = 92, MVM_UNICODE_PROPERTY_XID_START = 93, MVM_UNICODE_PROPERTY_Z = 94, } MVM_unicode_property_codes;MoarVM-2015.11/src/strings/unicode_ops.c0000644000175000017500000002365312616160670017021 0ustar jnthnjnthn /* Looks up a codepoint by name. Lazily constructs a hash. */ MVMGrapheme32 MVM_unicode_lookup_by_name(MVMThreadContext *tc, MVMString *name) { MVMuint64 size; char *cname = MVM_string_ascii_encode(tc, name, &size); MVMUnicodeNameRegistry *result; if (!codepoints_by_name) { generate_codepoints_by_name(tc); } HASH_FIND(hash_handle, codepoints_by_name, cname, strlen((const char *)cname), result); MVM_free(cname); return result ? result->codepoint : -1; } MVMString * MVM_unicode_get_name(MVMThreadContext *tc, MVMint64 codepoint) { const char *name; /* Catch out-of-bounds code points. */ if (codepoint < 0) { name = ""; } else if (codepoint > 0x10ffff) { name = ""; } /* Look up name. */ else { MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); if (codepoint_row != -1) { name = codepoint_names[codepoint_row]; if (!name) { while (codepoint_row && !codepoint_names[codepoint_row]) codepoint_row--; name = codepoint_names[codepoint_row]; if (!name || name[0] != '<') name = ""; } } else { name = ""; } } return MVM_string_ascii_decode(tc, tc->instance->VMString, name, strlen(name)); } MVMString * MVM_unicode_codepoint_get_property_str(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code) { const char * const str = MVM_unicode_get_property_str(tc, codepoint, property_code); if (!str) return tc->instance->str_consts.empty; return MVM_string_ascii_decode(tc, tc->instance->VMString, str, strlen(str)); } const char * MVM_unicode_codepoint_get_property_cstr(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code) { return MVM_unicode_get_property_str(tc, codepoint, property_code); } MVMint64 MVM_unicode_codepoint_get_property_int(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code); } MVMint64 MVM_unicode_codepoint_get_property_bool(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code) != 0; } MVMint64 MVM_unicode_codepoint_has_property_value(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code, MVMint64 property_value_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code) == property_value_code ? 1 : 0; } /* Looks if there is a case change for the provided codepoint. Since a case * change may produce multiple codepoints occasionally, then we return 0 if * the case change is a no-op, and otherwise the number of codepoints. The * codepoints argument will be set to a pointer to a buffer where those code * points can be read from. The caller must not mutate the buffer, nor free * it. */ MVMuint32 MVM_unicode_get_case_change(MVMThreadContext *tc, MVMCodepoint codepoint, MVMint32 case_, const MVMCodepoint **result) { if (case_ == MVM_unicode_case_change_type_fold) { MVMint32 folding_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_FOLDING); if (folding_index) { MVMint32 is_simple = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE); if (is_simple) { *result = &(CaseFolding_simple_table[folding_index]); return 1; } else { MVMint32 i = 3; while (i > 0 && CaseFolding_grows_table[folding_index][i - 1] == 0) i--; *result = &(CaseFolding_grows_table[folding_index][0]); return i; } } } else { MVMint32 special_casing_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_SPECIAL_CASING); if (special_casing_index) { MVMint32 i = 3; while (i > 0 && SpecialCasing_table[special_casing_index][case_][i - 1] == 0) i--; *result = SpecialCasing_table[special_casing_index][case_]; return i; } else { MVMint32 changes_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX); if (changes_index) { const MVMCodepoint *found = &(case_changes[changes_index][case_]); if (*found != 0) { *result = found; return 1; } } } } return 0; } /* XXX make all the statics members of the global MVM instance instead? */ static MVMUnicodeNameRegistry *property_codes_by_names_aliases; static void generate_property_codes_by_names_aliases(MVMThreadContext *tc) { MVMuint32 num_names = num_unicode_property_keypairs; while (num_names--) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)unicode_property_keypairs[num_names].name; entry->codepoint = unicode_property_keypairs[num_names].value; HASH_ADD_KEYPTR(hash_handle, property_codes_by_names_aliases, entry->name, strlen(entry->name), entry); } } MVMint32 MVM_unicode_name_to_property_code(MVMThreadContext *tc, MVMString *name) { MVMuint64 size; char *cname = MVM_string_ascii_encode(tc, name, &size); MVMUnicodeNameRegistry *result; if (!property_codes_by_names_aliases) { generate_property_codes_by_names_aliases(tc); } HASH_FIND(hash_handle, property_codes_by_names_aliases, cname, strlen((const char *)cname), result); MVM_free(cname); /* not really codepoint, really just an index */ return result ? result->codepoint : 0; } static void generate_unicode_property_values_hashes(MVMThreadContext *tc) { /* XXX make this synchronized, I guess... */ MVMUnicodeNameRegistry **hash_array = MVM_calloc(sizeof(MVMUnicodeNameRegistry *), MVM_NUM_PROPERTY_CODES); MVMuint32 index = 0; MVMUnicodeNameRegistry *entry = NULL, *binaries = NULL; for ( ; index < num_unicode_property_value_keypairs; index++) { MVMint32 property_code = unicode_property_value_keypairs[index].value >> 24; entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)unicode_property_value_keypairs[index].name; entry->codepoint = unicode_property_value_keypairs[index].value & 0xFFFFFF; HASH_ADD_KEYPTR(hash_handle, hash_array[property_code], entry->name, strlen(entry->name), entry); } for (index = 0; index < MVM_NUM_PROPERTY_CODES; index++) { if (!hash_array[index]) { if (!binaries) { MVMUnicodeNamedValue yes[8] = { {"T",1}, {"Y",1}, {"Yes",1}, {"yes",1}, {"True",1}, {"true",1}, {"t",1}, {"y",1} }; MVMUnicodeNamedValue no [8] = { {"F",0}, {"N",0}, {"No",0}, {"no",0}, {"False",0}, {"false",0}, {"f",0}, {"n",0} }; MVMuint8 i; for (i = 0; i < 8; i++) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)yes[i].name; entry->codepoint = yes[i].value; HASH_ADD_KEYPTR(hash_handle, binaries, yes[i].name, strlen(yes[i].name), entry); } for (i = 0; i < 8; i++) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)no[i].name; entry->codepoint = no[i].value; HASH_ADD_KEYPTR(hash_handle, binaries, no[i].name, strlen(no[i].name), entry); } } hash_array[index] = binaries; } } unicode_property_values_hashes = hash_array; } MVMint32 MVM_unicode_name_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, MVMString *name) { if (property_code <= 0 || property_code >= MVM_NUM_PROPERTY_CODES) { return 0; } else { MVMuint64 size; char *cname = MVM_string_ascii_encode(tc, name, &size); MVMUnicodeNameRegistry *result; if (!unicode_property_values_hashes) { generate_unicode_property_values_hashes(tc); } HASH_FIND(hash_handle, unicode_property_values_hashes[property_code], cname, strlen((const char *)cname), result); MVM_free(cname); /* not really codepoint, really just an index */ return result ? result->codepoint : 0; } } MVMint32 MVM_unicode_cname_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, const char *cname, size_t cname_length) { if (property_code <= 0 || property_code >= MVM_NUM_PROPERTY_CODES) { return 0; } else { MVMuint64 size; MVMUnicodeNameRegistry *result; if (!unicode_property_values_hashes) { generate_unicode_property_values_hashes(tc); } HASH_FIND(hash_handle, unicode_property_values_hashes[property_code], cname, cname_length, result); return result ? result->codepoint : 0; } } /* Look up the primary composite for a pair of codepoints, if it exists. * Returns 0 if not. */ MVMCodepoint MVM_unicode_find_primary_composite(MVMThreadContext *tc, MVMCodepoint l, MVMCodepoint c) { MVMint32 lower = l & 0xFF; MVMint32 upper = (l >> 8) & 0xFF; MVMint32 plane = (l >> 16) & 0xF; const MVMint32 *pcs = comp_p[plane][upper][lower]; if (pcs) { MVMint32 entries = pcs[0]; MVMint32 i; for (i = 1; i < entries; i += 2) if (pcs[i] == c) return pcs[i + 1]; } return 0; } MoarVM-2015.11/src/strings/utf16.c0000644000175000017500000001312412623370227015446 0ustar jnthnjnthn#include "moar.h" #define BOM_UTF16LE "\xff\xfe" #define BOM_UTF16BE "\xfe\xff" /* mostly from YAML-LibYAML */ /* Decodes the specified number of bytes of utf16 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf16_decode(MVMThreadContext *tc, const MVMObject *result_type, char *utf16_chars, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t str_pos = 0; MVMuint8 *utf16 = (MVMuint8 *)utf16_chars; MVMuint8 *utf16_end; /* set the default byte order */ #ifdef MVM_BIGENDIAN int low = 1; int high = 0; #else int low = 0; int high = 1; #endif MVMNormalizer norm; MVMint32 ready; if (bytes % 2) { MVM_exception_throw_adhoc(tc, "Malformed UTF-16; odd number of bytes"); } /* set the byte order if there's a BOM */ if (bytes >= 2) { if (!memcmp(utf16, BOM_UTF16LE, 2)) { low = 0; high = 1; utf16 += 2; } else if (!memcmp(utf16, BOM_UTF16BE, 2)) { low = 1; high = 0; utf16 += 2; } } utf16_end = utf16 + bytes; /* possibly allocating extra space; oh well */ result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes / 2); /* Need to normalize to NFG as we decode. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); for (; utf16 < utf16_end; utf16 += 2) { MVMuint32 value = (utf16[high] << 8) + utf16[low]; MVMuint32 value2; MVMGrapheme32 g; if ((value & 0xFC00) == 0xDC00) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; unexpected low surrogate"); } if ((value & 0xFC00) == 0xD800) { /* high surrogate */ utf16 += 2; if (utf16 == utf16_end) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; incomplete surrogate pair"); } value2 = (utf16[high] << 8) + utf16[low]; if ((value2 & 0xFC00) != 0xDC00) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; incomplete surrogate pair"); } value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF); } /* TODO: check for invalid values */ ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, value, &g); if (ready) { result->body.storage.blob_32[str_pos++] = g; while (--ready > 0) result->body.storage.blob_32[str_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } } /* Get any final graphemes from the normalizer, and clean it up. */ MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); while (ready--) result->body.storage.blob_32[str_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = str_pos; return result; } /* Encodes the specified substring to utf16. The result string is NULL terminated, but * the specified size is the non-null part. (This being UTF-16, there are 2 null bytes * on the end.) */ char * MVM_string_utf16_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - start : length); MVMuint16 *result; MVMuint16 *result_pos; MVMCodepointIter ci; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_utf16_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); /* Kke the result grow as needed instead of allocating so much to start? */ result = MVM_malloc(lengthu * 4 + 2); result_pos = result; MVM_string_ci_init(tc, &ci, str); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint value = MVM_string_ci_get_codepoint(tc, &ci); if (value < 0x10000) { result_pos[0] = value; result_pos++; } else if (value <= 0x1FFFFF) { value -= 0x10000; result_pos[0] = 0xD800 + (value >> 10); result_pos[1] = 0xDC00 + (value & 0x3FF); result_pos += 2; } else if (replacement) { /* XXX: May overflow */ memcpy(result_pos, repl_bytes, repl_length); result_pos += repl_length/2; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding UTF-16 string: could not encode codepoint %d", value); } } result_pos[0] = 0; if (output_size) *output_size = (char *)result_pos - (char *)result; MVM_free(repl_bytes); return (char *)result; } /* Encodes the whole string, double-NULL terminated. */ char * MVM_string_utf16_encode(MVMThreadContext *tc, MVMString *str) { return MVM_string_utf16_encode_substr(tc, str, NULL, 0, -1, NULL); } MoarVM-2015.11/src/strings/utf16.h0000644000175000017500000000053012620140151015434 0ustar jnthnjnthnMVMString * MVM_string_utf16_decode(MVMThreadContext *tc, const MVMObject *result_type, char *utf16, size_t bytes); char * MVM_string_utf16_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); char * MVM_string_utf16_encode(MVMThreadContext *tc, MVMString *str); MoarVM-2015.11/src/strings/utf8.c0000644000175000017500000004244112623370227015373 0ustar jnthnjnthn#include "moar.h" /* The below section has an MIT-style license, included here. // Copyright (c) 2008-2010 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. * * 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. */ #define UTF8_ACCEPT 0 #define UTF8_REJECT 12 static const MVMuint8 utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static MVMint32 decode_utf8_byte(MVMint32 *state, MVMGrapheme32 *codep, MVMuint8 byte) { MVMint32 type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } /* end Bjoern Hoehrmann section (some things were changed from the original) */ /* begin not_gerd section (modified from original) // Copyright 2012 not_gerd // see http://irclog.perlgeek.de/perl6/2012-06-04#i_5681122 Permission is granted to use, modify, and / or redistribute at will. This includes removing authorship notices, re-use of code parts in other software (with or without giving credit), and / or creating a commercial product based on it. This permission is not revocable by the author. This software is provided as-is. Use it at your own risk. There is no warranty whatsoever, neither expressed nor implied, and by using this software you accept that the author(s) shall not be held liable for any loss of data, loss of service, or other damages, be they incidental or consequential. Your only option other than accepting this is not to use the software at all. */ enum { CP_CHAR = 1 << 0, CP_LOW_SURROGATE = 1 << 1, CP_HIGH_SURROGATE = 1 << 2, CP_NONCHAR = 1 << 3, CP_OVERFLOW = 1 << 4, U8_SINGLE = 1 << 5, U8_DOUBLE = 1 << 6, U8_TRIPLE = 1 << 7, U8_QUAD = 1 << 8 }; static unsigned classify(MVMCodepoint cp) { if(cp <= 0x7F) return CP_CHAR | U8_SINGLE; if(cp <= 0x07FF) return CP_CHAR | U8_DOUBLE; if(0xD800 <= cp && cp <= 0xDBFF) return CP_HIGH_SURROGATE | U8_TRIPLE; if(0xDC00 <= cp && cp <= 0xDFFF) return CP_LOW_SURROGATE | U8_TRIPLE; if(0xFDD0 <= cp && cp <= 0xFDEF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0xFFFD) return CP_CHAR | U8_TRIPLE; if(cp == 0xFFFE || cp == 0xFFFF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0x10FFFF && ((cp & 0xFFFF) == 0xFFFE || (cp & 0xFFFF) == 0xFFFF)) return CP_NONCHAR | U8_QUAD; if(cp <= 0x10FFFF) return CP_CHAR | U8_QUAD; if(cp <= 0x1FFFFF) return CP_OVERFLOW | U8_QUAD; return 0; } static MVMint32 utf8_encode(MVMuint8 *bp, MVMCodepoint cp) { unsigned cc = classify(cp); if (!(cc & (CP_CHAR | CP_NONCHAR))) return 0; if (cc & U8_SINGLE) { bp[0] = (MVMuint8)cp; return 1; } if (cc & U8_DOUBLE) { bp[0] = (MVMuint8)(( 6 << 5) | (cp >> 6)); bp[1] = (MVMuint8)(( 2 << 6) | (cp & 0x3F)); return 2; } if (cc & U8_TRIPLE) { bp[0] = (MVMuint8)((14 << 4) | (cp >> 12)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 3; } if (cc & U8_QUAD) { bp[0] = (MVMuint8)((30 << 3) | (cp >> 18)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 12) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[3] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 4; } return 0; } /* end not_gerd section */ #define UTF8_MAXINC (32 * 1024 * 1024) /* Decodes the specified number of bytes of utf8 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); MVMint32 count = 0; MVMCodepoint codepoint; MVMint32 line_ending = 0; MVMint32 state = 0; MVMint32 bufsize = bytes; MVMGrapheme32 *buffer = MVM_malloc(sizeof(MVMGrapheme32) * bufsize); size_t orig_bytes; const char *orig_utf8; MVMint32 line; MVMint32 col; MVMint32 ready; /* Need to normalize to NFG as we decode. */ MVMNormalizer norm; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); orig_bytes = bytes; orig_utf8 = utf8; for (; bytes; ++utf8, --bytes) { switch(decode_utf8_byte(&state, &codepoint, (MVMuint8)*utf8)) { case UTF8_ACCEPT: { /* got a codepoint */ MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, codepoint, &g); if (ready) { while (count + ready >= bufsize) { /* if the buffer's full make a bigger one */ buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * ( bufsize >= UTF8_MAXINC ? (bufsize += UTF8_MAXINC) : (bufsize *= 2) )); } buffer[count++] = g; while (--ready > 0) buffer[count++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } break; } case UTF8_REJECT: /* found a malformed sequence; parse it again this time tracking * line and col numbers. */ MVM_unicode_normalizer_cleanup(tc, &norm); /* Since we'll throw. */ bytes = orig_bytes; utf8 = orig_utf8; state = 0; line = 1; col = 1; for (; bytes; ++utf8, --bytes) { switch(decode_utf8_byte(&state, &codepoint, (MVMuint8)*utf8)) { case UTF8_ACCEPT: /* this could be reorganized into several nested ugly if/else :/ */ if (!line_ending && (codepoint == 10 || codepoint == 13)) { /* Detect the style of line endings. * Select whichever comes first. * First or only part of first line ending. */ line_ending = codepoint; col = 1; line++; } else if (line_ending && codepoint == line_ending) { /* first or only part of next line ending */ col = 1; line++; } else if (codepoint == 10 || codepoint == 13) { /* second part of line ending; ignore */ } else /* non-line ending codepoint */ col++; break; case UTF8_REJECT: MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed UTF-8 at line %u col %u", line, col); } } MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Concurrent modification of UTF-8 input buffer!"); break; } } if (state != UTF8_ACCEPT) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed termination of UTF-8 string"); } /* Get any final graphemes from the normalizer, and clean it up. */ MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); if (ready) { if (count + ready >= bufsize) { buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * (count + ready)); } while (ready--) buffer[count++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } MVM_unicode_normalizer_cleanup(tc, &norm); /* just keep the same buffer as the MVMString's buffer. Later * we can add heuristics to resize it if we have enough free * memory */ if (bufsize - count > 4) { buffer = MVM_realloc(buffer, count * sizeof(MVMGrapheme32)); } result->body.storage.blob_32 = buffer; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = count; return result; } static MVMint32 its_the_bom(const char *utf8) { const MVMuint8 *uns_utf8 = (const MVMuint8 *)utf8; return uns_utf8[0] == 0xEF && uns_utf8[1] == 0xBB && uns_utf8[2] == 0xBF; } /* Same as MVM_string_utf8_decode, but strips a BOM if it finds one. */ MVMString * MVM_string_utf8_decode_strip_bom(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { if (bytes >= 3 && its_the_bom(utf8)) { utf8 += 3; bytes -= 3; } return MVM_string_utf8_decode(tc, result_type, utf8, bytes); } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ void MVM_string_utf8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 state = 0; MVMCodepoint codepoint = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, ready, at_start; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return; /* Rough starting-size estimate is number of bytes in the head buffer. */ bufsize = ds->bytes_head->length; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; at_start = ds->abs_byte_pos == 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; char *bytes = cur_bytes->bytes; if (at_start) { /* We're right at the start of the stream of things to decode. See * if we have a BOM, and skip over it if so. */ if (pos + 3 <= cur_bytes->length) { if (its_the_bom(bytes + pos)) { pos += 3; last_accept_bytes = cur_bytes; last_accept_pos = pos; } } at_start = 0; } while (pos < cur_bytes->length) { switch(decode_utf8_byte(&state, &codepoint, bytes[pos++])) { case UTF8_ACCEPT: { MVMint32 first = 1; MVMGrapheme32 g; last_accept_bytes = cur_bytes; last_accept_pos = pos; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &(ds->norm), codepoint, &g); while (ready--) { if (first) first = 0; else g = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); if (count == bufsize) { /* Valid character, but we filled the buffer. Attach this * one to the buffers linked list, and continue with a new * one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = g; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, g)) goto done; } break; } case UTF8_REJECT: MVM_exception_throw_adhoc(tc, "Malformed UTF-8"); break; } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); } /* Encodes the specified string to UTF-8. */ char * MVM_string_utf8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { MVMuint8 *result; size_t result_pos, result_limit; MVMCodepointIter ci; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length == -1) length = strgraphs; if (length < 0 || start + length > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_utf8_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); /* Guesstimate that we'll be within 2 bytes for most chars most of the * time, and give ourselves 4 bytes breathing space. */ result_limit = 2 * length; result = MVM_malloc(result_limit + 4); result_pos = 0; /* Iterate the codepoints and encode them. */ MVM_string_ci_init(tc, &ci, str); while (MVM_string_ci_has_more(tc, &ci)) { MVMint32 bytes; MVMCodepoint cp = MVM_string_ci_get_codepoint(tc, &ci); if (result_pos >= result_limit) { result_limit *= 2; result = MVM_realloc(result, result_limit + 4); } bytes = utf8_encode(result + result_pos, cp); if (bytes) result_pos += bytes; else if (replacement) { if (repl_length >= result_limit || result_pos >= result_limit - repl_length) { result_limit += repl_length; result = MVM_realloc(result, result_limit + 4); } memcpy(result + result_pos, repl_bytes, repl_length); result_pos += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding UTF-8 string: could not encode codepoint %d", cp); } } if (output_size) *output_size = (MVMuint64)result_pos; MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to UTF-8. */ char * MVM_string_utf8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size) { return MVM_string_utf8_encode_substr(tc, str, output_size, 0, -1, NULL); } /* Encodes the specified string to a UTF-8 C string. */ char * MVM_string_utf8_encode_C_string(MVMThreadContext *tc, MVMString *str) { MVMuint64 output_size; char * result; char * utf8_string = MVM_string_utf8_encode(tc, str, &output_size); /* this is almost always called from error-handling code. Don't care if it * contains embedded NULs. XXX TODO: Make sure all uses of this free what it returns */ result = MVM_malloc(output_size + 1); memcpy(result, utf8_string, output_size); MVM_free(utf8_string); result[output_size] = (char)0; return result; } MoarVM-2015.11/src/strings/utf8.h0000644000175000017500000000143212620140151015357 0ustar jnthnjnthnMVM_PUBLIC MVMString * MVM_string_utf8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC MVMString * MVM_string_utf8_decode_strip_bom(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC void MVM_string_utf8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); MVM_PUBLIC char * MVM_string_utf8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); MVM_PUBLIC char * MVM_string_utf8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size); MVM_PUBLIC char * MVM_string_utf8_encode_C_string(MVMThreadContext *tc, MVMString *str); MoarVM-2015.11/src/strings/utf8_c8.c0000644000175000017500000005130312623370227015762 0ustar jnthnjnthn#include "moar.h" /* UTF-8 Clean-8 is an encoder/decoder that primarily works as the UTF-8 one. * However, upon encountering a non-decodable character, it uses an NFG * synthetic to keep track of the original bytes involved. This means that * encoding back to UTF-8 Clean-8 will be able to recreate the bytes as they * originally existed. The synthetics contain 4 codepoints: * * * The codepoint 0x10FFFD (which is a private use codepoint) * * The codepoint 'x' * * The upper 4 bits of the non-decodable byte as a hex char (0..9A..F) * * The lower 4 bits as the non-decodable byte as a hex char (0..9A..F) * * Under normal UTF-8 encoding, this means the unrepresentable characters will * come out as something like `?xFF`. * * UTF-8 Clean-8 is used in places where MoarVM receives strings from the * operating system or passes strings to the operating system. This means that * code receiving strings from, say, reading a directory, and then opening the * files, will work out even if the fileanmes are unencodable in UTF-8. Same * goes for taking a file name and concatenating `.bak` on to it, for example. */ /* The below section has an MIT-style license, included here. // Copyright (c) 2008-2010 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. * * 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. */ #define UTF8_ACCEPT 0 #define UTF8_REJECT 12 static const MVMuint8 utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static MVMint32 decode_utf8_byte(MVMint32 *state, MVMGrapheme32 *codep, MVMuint8 byte) { MVMint32 type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } /* end Bjoern Hoehrmann section (some things were changed from the original) */ /* begin not_gerd section (modified from original) // Copyright 2012 not_gerd // see http://irclog.perlgeek.de/perl6/2012-06-04#i_5681122 Permission is granted to use, modify, and / or redistribute at will. This includes removing authorship notices, re-use of code parts in other software (with or without giving credit), and / or creating a commercial product based on it. This permission is not revocable by the author. This software is provided as-is. Use it at your own risk. There is no warranty whatsoever, neither expressed nor implied, and by using this software you accept that the author(s) shall not be held liable for any loss of data, loss of service, or other damages, be they incidental or consequential. Your only option other than accepting this is not to use the software at all. */ enum { CP_CHAR = 1 << 0, CP_LOW_SURROGATE = 1 << 1, CP_HIGH_SURROGATE = 1 << 2, CP_NONCHAR = 1 << 3, CP_OVERFLOW = 1 << 4, U8_SINGLE = 1 << 5, U8_DOUBLE = 1 << 6, U8_TRIPLE = 1 << 7, U8_QUAD = 1 << 8 }; static unsigned classify(MVMCodepoint cp) { if(cp <= 0x7F) return CP_CHAR | U8_SINGLE; if(cp <= 0x07FF) return CP_CHAR | U8_DOUBLE; if(0xD800 <= cp && cp <= 0xDBFF) return CP_HIGH_SURROGATE | U8_TRIPLE; if(0xDC00 <= cp && cp <= 0xDFFF) return CP_LOW_SURROGATE | U8_TRIPLE; if(0xFDD0 <= cp && cp <= 0xFDEF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0xFFFD) return CP_CHAR | U8_TRIPLE; if(cp == 0xFFFE || cp == 0xFFFF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0x10FFFF && ((cp & 0xFFFF) == 0xFFFE || (cp & 0xFFFF) == 0xFFFF)) return CP_NONCHAR | U8_QUAD; if(cp <= 0x10FFFF) return CP_CHAR | U8_QUAD; if(cp <= 0x1FFFFF) return CP_OVERFLOW | U8_QUAD; return 0; } static MVMint32 utf8_encode(MVMuint8 *bp, MVMCodepoint cp) { unsigned cc = classify(cp); if (!(cc & (CP_CHAR | CP_NONCHAR))) return 0; if (cc & U8_SINGLE) { bp[0] = (MVMuint8)cp; return 1; } if (cc & U8_DOUBLE) { bp[0] = (MVMuint8)(( 6 << 5) | (cp >> 6)); bp[1] = (MVMuint8)(( 2 << 6) | (cp & 0x3F)); return 2; } if (cc & U8_TRIPLE) { bp[0] = (MVMuint8)((14 << 4) | (cp >> 12)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 3; } if (cc & U8_QUAD) { bp[0] = (MVMuint8)((30 << 3) | (cp >> 18)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 12) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[3] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 4; } return 0; } /* end not_gerd section */ #define UTF8_MAXINC (32 * 1024 * 1024) static void ensure_buffer(MVMGrapheme32 **buffer, MVMint32 *bufsize, MVMint32 needed) { while (needed >= *bufsize) *buffer = MVM_realloc(*buffer, sizeof(MVMGrapheme32) * ( *bufsize >= UTF8_MAXINC ? (*bufsize += UTF8_MAXINC) : (*bufsize *= 2) )); } static void flush_normalizer(MVMThreadContext *tc, MVMNormalizer *norm, MVMGrapheme32 **buffer, MVMint32 *bufsize, MVMint32 *count) { MVMint32 ready; MVM_unicode_normalizer_eof(tc, norm); ready = MVM_unicode_normalizer_available(tc, norm); if (ready) { ensure_buffer(buffer, bufsize, *count + ready); while (ready--) (*buffer)[(*count)++] = MVM_unicode_normalizer_get_grapheme(tc, norm); } } static const MVMuint8 hex_chars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static MVMGrapheme32 synthetic_for(MVMThreadContext *tc, MVMuint8 invalid) { if (invalid > 0x7F) { /* A real invalid. */ MVMuint8 high = invalid >> 4; MVMuint8 low = invalid & 0x0F; MVMCodepoint cps[] = { 0x10FFFD, 'x', hex_chars[high], hex_chars[low] }; return MVM_nfg_codes_to_grapheme_utf8_c8(tc, cps, 4); } else { /* Was in things thrown out as invalid by the decoder, but has an * ASCII interpretation, so hand it back as is. */ return invalid; } } /* Decodes the specified number of bytes of utf8 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf8_c8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); MVMint32 count = 0; MVMCodepoint codepoint; MVMint32 line_ending = 0; MVMint32 state = 0; MVMint32 bufsize = bytes; MVMGrapheme32 *buffer = MVM_malloc(sizeof(MVMGrapheme32) * bufsize); size_t orig_bytes; const char *orig_utf8, *last_accept_utf8; MVMint32 line; MVMint32 col; MVMint32 ready; /* Need to normalize to NFG as we decode. */ MVMNormalizer norm; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); orig_bytes = bytes; orig_utf8 = utf8; last_accept_utf8 = utf8; for (; bytes; ++utf8, --bytes) { switch(decode_utf8_byte(&state, &codepoint, (MVMuint8)*utf8)) { case UTF8_ACCEPT: { /* got a codepoint */ MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, codepoint, &g); if (ready) { ensure_buffer(&buffer, &bufsize, count + ready); buffer[count++] = g; while (--ready > 0) buffer[count++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } last_accept_utf8 = utf8; break; } case UTF8_REJECT: flush_normalizer(tc, &norm, &buffer, &bufsize, &count); do { ensure_buffer(&buffer, &bufsize, count + 1); buffer[count++] = synthetic_for(tc, *((MVMuint8 *)last_accept_utf8 + 1)); } while (++last_accept_utf8 != utf8); state = UTF8_ACCEPT; break; } } if (state != UTF8_ACCEPT) { flush_normalizer(tc, &norm, &buffer, &bufsize, &count); do { ensure_buffer(&buffer, &bufsize, count + 1); buffer[count++] = synthetic_for(tc, *((MVMuint8 *)last_accept_utf8 + 1)); } while (++last_accept_utf8 != utf8); } /* Get any final graphemes from the normalizer, and clean it up. */ flush_normalizer(tc, &norm, &buffer, &bufsize, &count); MVM_unicode_normalizer_cleanup(tc, &norm); /* just keep the same buffer as the MVMString's buffer. Later * we can add heuristics to resize it if we have enough free * memory */ if (bufsize - count > 4) { buffer = MVM_realloc(buffer, count * sizeof(MVMGrapheme32)); } result->body.storage.blob_32 = buffer; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = count; return result; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ void MVM_string_utf8_c8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 state = 0; MVMCodepoint codepoint = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, ready; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return; /* Rough starting-size estimate is number of bytes in the head buffer. */ bufsize = ds->bytes_head->length; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; char *bytes = cur_bytes->bytes; while (pos < cur_bytes->length) { switch(decode_utf8_byte(&state, &codepoint, bytes[pos++])) { case UTF8_ACCEPT: { MVMint32 first = 1; MVMGrapheme32 g; last_accept_bytes = cur_bytes; last_accept_pos = pos; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &(ds->norm), codepoint, &g); while (ready--) { if (first) first = 0; else g = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); if (count == bufsize) { /* Valid character, but we filled the buffer. Attach this * one to the buffers linked list, and continue with a new * one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = g; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, g)) goto done; } break; } case UTF8_REJECT: { /* First, flush anything in the normalizer. */ MVMint32 ready; MVM_unicode_normalizer_eof(tc, &(ds->norm)); ready = MVM_unicode_normalizer_available(tc, &(ds->norm)); /* Get a new result buffer, if we'd overflow existing. We * should never be able to get an invalid sequence longer * than 4 bytes. */ if (count + ready + 4 >= bufsize) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); if (ready + 4 > bufsize) bufsize = ready + 4; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } /* Add chars from the normalizer; look out for any of them * being the separator. */ while (ready--) { MVMGrapheme32 g = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); buffer[count++] = g; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, g)) goto done; } /* Go through invalid bytes, making synthetics. */ do { if (last_accept_pos < last_accept_bytes->length) { /* Still some in the last accepted byte buffer. */ buffer[count++] = synthetic_for(tc, last_accept_bytes->bytes[last_accept_pos]); total++; last_accept_pos++; if (stopper_chars && *stopper_chars == total) goto done; } else if (last_accept_bytes->next) { /* Progress to next buffer. */ last_accept_bytes = last_accept_bytes->next; last_accept_pos = -1; } } while (last_accept_bytes != cur_bytes && last_accept_pos != pos - 1); /* Accept the invalid bytes. */ state = UTF8_ACCEPT; break; } } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); } /* Encodes the specified string to UTF-8. */ static void emit_cp(MVMThreadContext *tc, MVMCodepoint cp, MVMuint8 **result, size_t *result_pos, size_t *result_limit, MVMuint8 *repl_bytes, MVMuint64 repl_length) { MVMint32 bytes; if (*result_pos >= *result_limit) { *result_limit *= 2; *result = MVM_realloc(*result, *result_limit + 4); } bytes = utf8_encode(*result + *result_pos, cp); if (bytes) *result_pos += bytes; else if (repl_bytes) { if (repl_length >= *result_limit || *result_pos >= *result_limit - repl_length) { *result_limit += repl_length; *result = MVM_realloc(*result, *result_limit + 4); } memcpy(*result + *result_pos, repl_bytes, repl_length); *result_pos += repl_length; } else { MVM_free(*result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding UTF-8 string: could not encode codepoint %d", cp); } } static int hex2int(MVMThreadContext *tc, MVMCodepoint cp) { if (cp >= '0' && cp <= '9') return cp - '0'; else if (cp >= 'A' && cp <= 'F') return 10 + (cp - 'A'); else MVM_exception_throw_adhoc(tc, "UTF-8 C-8 encoding encountered corrupt synthetic"); } char * MVM_string_utf8_c8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { MVMuint8 *result; size_t result_pos, result_limit; MVMGraphemeIter gi; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length == -1) length = strgraphs; if (length < 0 || start + length > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_utf8_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); /* Guesstimate that we'll be within 2 bytes for most chars most of the * time, and give ourselves 4 bytes breathing space. */ result_limit = 2 * length; result = MVM_malloc(result_limit + 4); result_pos = 0; /* We iterate graphemes, looking out for any synthetics. If we find a * UTF-8 C-8 synthetic, then we spit out the raw byte. If we find any * other synthetic, we iterate its codepoints. */ MVM_string_gi_init(tc, &gi, str); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (g >= 0) { emit_cp(tc, g, &result, &result_pos, &result_limit, repl_bytes, repl_length); } else { MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); if (synth->is_utf8_c8) { /* UTF-8 C-8 synthetic; emit the byte. */ if (result_pos >= result_limit) { result_limit *= 2; result = MVM_realloc(result, result_limit + 1); } result[result_pos++] = (hex2int(tc, synth->combs[1]) << 4) + hex2int(tc, synth->combs[2]); } else { MVMint32 i; emit_cp(tc, synth->base, &result, &result_pos, &result_limit, repl_bytes, repl_length); for (i = 0; i < synth->num_combs; i++) emit_cp(tc, synth->combs[i], &result, &result_pos, &result_limit, repl_bytes, repl_length); } } } if (output_size) *output_size = (MVMuint64)result_pos; MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to UTF-8 C-8. */ char * MVM_string_utf8_c8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size) { return MVM_string_utf8_c8_encode_substr(tc, str, output_size, 0, MVM_string_graphs(tc, str), NULL); } /* Encodes the specified string to a UTF-8 C-8 C string. */ char * MVM_string_utf8_c8_encode_C_string(MVMThreadContext *tc, MVMString *str) { MVMuint64 output_size; char *result; char *utf8_string = MVM_string_utf8_c8_encode(tc, str, &output_size); result = MVM_malloc(output_size + 1); memcpy(result, utf8_string, output_size); MVM_free(utf8_string); result[output_size] = (char)0; return result; } MoarVM-2015.11/src/strings/utf8_c8.h0000644000175000017500000000123412623370227015765 0ustar jnthnjnthnMVM_PUBLIC MVMString * MVM_string_utf8_c8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC void MVM_string_utf8_c8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); MVM_PUBLIC char * MVM_string_utf8_c8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); MVM_PUBLIC char * MVM_string_utf8_c8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size); MVM_PUBLIC char * MVM_string_utf8_c8_encode_C_string(MVMThreadContext *tc, MVMString *str); MoarVM-2015.11/src/strings/windows1252.c0000644000175000017500000002727212623370227016516 0ustar jnthnjnthn#include "moar.h" #define WINDOWS1252_CHAR_TO_CP(character) codepoints[character]; static const MVMuint16 codepoints[] = { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, 0x20AC,0x0081,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, 0x02C6,0x2030,0x0160,0x2039,0x0152,0x008D,0x017D,0x008F, 0x0090,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, 0x02DC,0x2122,0x0161,0x203A,0x0153,0x009D,0x017E,0x0178, 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF }; static MVMuint8 windows1252_cp_to_char(MVMint32 codepoint) { if (codepoint > 8364 || codepoint < 0) return '\0'; if (codepoint <= 8216) { if (codepoint <= 352) { if (codepoint <= 143) { if (codepoint <= 141) { if (codepoint == 129) { return 129; } if (codepoint == 141) { return 141; } } else { if (codepoint == 143) { return 143; } } } else { if (codepoint <= 338) { if (codepoint == 144) { return 144; } if (codepoint == 338) { return 140; } } else { if (codepoint == 352) { return 138; } } } } else { if (codepoint <= 710) { if (codepoint <= 402) { if (codepoint == 381) { return 142; } if (codepoint == 402) { return 131; } } else { if (codepoint == 710) { return 136; } } } else { if (codepoint <= 8212) { if (codepoint == 8211) { return 150; } if (codepoint == 8212) { return 151; } } else { if (codepoint == 8216) { return 145; } } } } } else { if (codepoint <= 8224) { if (codepoint <= 8220) { if (codepoint <= 8218) { if (codepoint == 8217) { return 146; } if (codepoint == 8218) { return 130; } } else { if (codepoint == 8220) { return 147; } } } else { if (codepoint <= 8222) { if (codepoint == 8221) { return 148; } if (codepoint == 8222) { return 132; } } else { if (codepoint == 8224) { return 134; } } } } else { if (codepoint <= 8230) { if (codepoint <= 8226) { if (codepoint == 8225) { return 135; } if (codepoint == 8226) { return 149; } } else { if (codepoint == 8230) { return 133; } } } else { if (codepoint <= 8249) { if (codepoint == 8240) { return 137; } if (codepoint == 8249) { return 139; } } else { if (codepoint == 8364) { return 128; } } } } } return '\0'; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ void MVM_string_windows1252_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return; /* Take length of head buffer as initial guess. */ bufsize = ds->bytes_head->length; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; unsigned char *bytes = (unsigned char *)cur_bytes->bytes; while (pos < cur_bytes->length) { MVMGrapheme32 graph; MVMCodepoint codepoint = WINDOWS1252_CHAR_TO_CP(bytes[pos++]); if (last_was_cr) { if (codepoint == '\n') { graph = MVM_nfg_crlf_grapheme(tc); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (stopper_chars && *stopper_chars == total) goto done; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) goto done; } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); } /* Decodes the specified number of bytes of windows1252 into an NFG string, * creating a result of the specified type. The type must have the MVMString * REPR. */ MVMString * MVM_string_windows1252_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows1252_c, size_t bytes) { MVMuint8 *windows1252 = (MVMuint8 *)windows1252_c; MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t i, result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes); result_graphs = 0; for (i = 0; i < bytes; i++) { if (windows1252[i] == '\r' && i + 1 < bytes && windows1252[i + 1] == '\n') { result->body.storage.blob_32[result_graphs++] = MVM_nfg_crlf_grapheme(tc); i++; } else { result->body.storage.blob_32[result_graphs++] = WINDOWS1252_CHAR_TO_CP(windows1252[i]); } } result->body.num_graphs = result_graphs; return result; } /* Encodes the specified substring to Windows-1252. Anything outside of Windows-1252 range * will become a ?. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_windows1252_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { /* Windows-1252 is a single byte encoding, so each grapheme will just become * a single byte. */ MVMuint32 startu = (MVMuint32)start; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - startu : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = MVM_string_windows1252_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint codepoint = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } if ((codepoint >= 0 && codepoint < 128) || (codepoint >= 152 && codepoint < 256)) { result[i] = (MVMuint8)codepoint; i++; } else if ((result[i] = windows1252_cp_to_char(codepoint)) != '\0') { i++; } else if (replacement) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding Windows-1252 string: could not encode codepoint %d", codepoint); } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } MoarVM-2015.11/src/strings/windows1252.h0000644000175000017500000000070412620140151016476 0ustar jnthnjnthnMVMString * MVM_string_windows1252_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows1252, size_t bytes); MVM_PUBLIC void MVM_string_windows1252_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); char * MVM_string_windows1252_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); MoarVM-2015.11/src/types.h0000644000175000017500000002534612623370227014172 0ustar jnthnjnthn/* struct and union types are forward-declared for convenience */ typedef struct MVMActiveHandler MVMActiveHandler; typedef struct MVMArgInfo MVMArgInfo; typedef struct MVMArgProcContext MVMArgProcContext; typedef struct MVMArray MVMArray; typedef struct MVMArrayBody MVMArrayBody; typedef struct MVMArrayREPRData MVMArrayREPRData; typedef struct MVMAsyncTask MVMAsyncTask; typedef struct MVMAsyncTaskBody MVMAsyncTaskBody; typedef struct MVMAsyncTaskOps MVMAsyncTaskOps; typedef struct MVMAttributeIdentifier MVMAttributeIdentifier; typedef struct MVMBoolificationSpec MVMBoolificationSpec; typedef struct MVMBootTypes MVMBootTypes; typedef struct MVMBytecodeAnnotation MVMBytecodeAnnotation; typedef struct MVMCallCapture MVMCallCapture; typedef struct MVMCallCaptureBody MVMCallCaptureBody; typedef struct MVMCallsite MVMCallsite; typedef struct MVMCallsiteInterns MVMCallsiteInterns; typedef struct MVMCFunction MVMCFunction; typedef struct MVMCFunctionBody MVMCFunctionBody; typedef struct MVMCode MVMCode; typedef struct MVMCodeBody MVMCodeBody; typedef struct MVMCollectable MVMCollectable; typedef struct MVMCompUnit MVMCompUnit; typedef struct MVMCompUnitBody MVMCompUnitBody; typedef struct MVMConcatState MVMConcatState; typedef struct MVMContainerConfigurer MVMContainerConfigurer; typedef struct MVMContainerSpec MVMContainerSpec; typedef struct MVMContainerRegistry MVMContainerRegistry; typedef struct MVMContext MVMContext; typedef struct MVMContextBody MVMContextBody; typedef struct MVMContinuationTag MVMContinuationTag; typedef struct MVMDLLRegistry MVMDLLRegistry; typedef struct MVMDLLSym MVMDLLSym; typedef struct MVMDLLSymBody MVMDLLSymBody; typedef struct MVMException MVMException; typedef struct MVMExceptionBody MVMExceptionBody; typedef struct MVMExtOpRecord MVMExtOpRecord; typedef struct MVMExtOpRegistry MVMExtOpRegistry; typedef struct MVMExtRegistry MVMExtRegistry; typedef struct MVMFixedSizeAlloc MVMFixedSizeAlloc; typedef struct MVMFixedSizeAllocFreeListEntry MVMFixedSizeAllocFreeListEntry; typedef struct MVMFixedSizeAllocSafepointFreeListEntry MVMFixedSizeAllocSafepointFreeListEntry; typedef struct MVMFixedSizeAllocSizeClass MVMFixedSizeAllocSizeClass; typedef struct MVMFrame MVMFrame; typedef struct MVMFrameHandler MVMFrameHandler; typedef struct MVMGen2Allocator MVMGen2Allocator; typedef struct MVMGen2SizeClass MVMGen2SizeClass; typedef struct MVMGCPassedWork MVMGCPassedWork; typedef struct MVMGCWorklist MVMGCWorklist; typedef struct MVMHash MVMHash; typedef struct MVMHashAttrStore MVMHashAttrStore; typedef struct MVMHashAttrStoreBody MVMHashAttrStoreBody; typedef struct MVMHashBody MVMHashBody; typedef struct MVMHashEntry MVMHashEntry; typedef struct MVMHLLConfig MVMHLLConfig; typedef struct MVMIntConstCache MVMIntConstCache; typedef struct MVMInstance MVMInstance; typedef struct MVMInvocationSpec MVMInvocationSpec; typedef struct MVMIter MVMIter; typedef struct MVMIterBody MVMIterBody; typedef struct MVMKnowHOWAttributeREPR MVMKnowHOWAttributeREPR; typedef struct MVMKnowHOWAttributeREPRBody MVMKnowHOWAttributeREPRBody; typedef struct MVMKnowHOWREPR MVMKnowHOWREPR; typedef struct MVMKnowHOWREPRBody MVMKnowHOWREPRBody; typedef struct MVMLexicalRegistry MVMLexicalRegistry; typedef struct MVMLexotic MVMLexotic; typedef struct MVMLexoticBody MVMLexoticBody; typedef struct MVMLoadedCompUnitName MVMLoadedCompUnitName; typedef struct MVMNFA MVMNFA; typedef struct MVMNFABody MVMNFABody; typedef struct MVMNFAStateInfo MVMNFAStateInfo; typedef struct MVMNFGState MVMNFGState; typedef struct MVMNFGSynthetic MVMNFGSynthetic; typedef struct MVMNFGTrieNode MVMNFGTrieNode; typedef struct MVMNGFTrieNodeEntry MVMNGFTrieNodeEntry; typedef struct MVMNativeCall MVMNativeCall; typedef struct MVMNativeCallBody MVMNativeCallBody; typedef struct MVMNativeRef MVMNativeRef; typedef struct MVMNativeRefBody MVMNativeRefBody; typedef struct MVMNativeRefREPRData MVMNativeRefREPRData; typedef struct MVMNormalizer MVMNormalizer; typedef struct MVMNull MVMNull; typedef struct MVMNullBody MVMNullBody; typedef struct MVMCStr MVMCStr; typedef struct MVMCStrBody MVMCStrBody; typedef struct MVMCPointer MVMCPointer; typedef struct MVMCPointerBody MVMCPointerBody; typedef struct MVMCArray MVMCArray; typedef struct MVMCArrayBody MVMCArrayBody; typedef struct MVMCArrayREPRData MVMCArrayREPRData; typedef struct MVMCStruct MVMCStruct; typedef struct MVMCStructBody MVMCStructBody; typedef struct MVMCStructNameMap MVMCStructNameMap; typedef struct MVMCStructREPRData MVMCStructREPRData; typedef struct MVMCPPStruct MVMCPPStruct; typedef struct MVMCPPStructBody MVMCPPStructBody; typedef struct MVMCPPStructNameMap MVMCPPStructNameMap; typedef struct MVMCPPStructREPRData MVMCPPStructREPRData; typedef struct MVMCUnion MVMCUnion; typedef struct MVMCUnionBody MVMCUnionBody; typedef struct MVMCUnionNameMap MVMCUnionNameMap; typedef struct MVMCUnionREPRData MVMCUnionREPRData; typedef struct MVMMultiCache MVMMultiCache; typedef struct MVMMultiCacheBody MVMMultiCacheBody; typedef struct MVMMultiArityCache MVMMultiArityCache; typedef struct MVMMultiDimArray MVMMultiDimArray; typedef struct MVMMultiDimArrayBody MVMMultiDimArrayBody; typedef struct MVMMultiDimArrayREPRData MVMMultiDimArrayREPRData; typedef struct MVMContinuation MVMContinuation; typedef struct MVMContinuationBody MVMContinuationBody; typedef struct MVMReentrantMutex MVMReentrantMutex; typedef struct MVMReentrantMutexBody MVMReentrantMutexBody; typedef struct MVMConditionVariable MVMConditionVariable; typedef struct MVMConditionVariableBody MVMConditionVariableBody; typedef struct MVMSemaphore MVMSemaphore; typedef struct MVMSemaphoreBody MVMSemaphoreBody; typedef struct MVMConcBlockingQueue MVMConcBlockingQueue; typedef struct MVMConcBlockingQueueBody MVMConcBlockingQueueBody; typedef struct MVMConcBlockingQueueNode MVMConcBlockingQueueNode; typedef struct MVMConcBlockingQueueLocks MVMConcBlockingQueueLocks; typedef struct MVMObject MVMObject; typedef struct MVMObjectId MVMObjectId; typedef struct MVMObjectStooge MVMObjectStooge; typedef struct MVMOpInfo MVMOpInfo; typedef struct MVMOSHandle MVMOSHandle; typedef struct MVMOSHandleBody MVMOSHandleBody; typedef struct MVMP6bigint MVMP6bigint; typedef struct MVMP6bigintBody MVMP6bigintBody; typedef struct MVMP6int MVMP6int; typedef struct MVMP6intBody MVMP6intBody; typedef struct MVMP6intREPRData MVMP6intREPRData; typedef struct MVMP6num MVMP6num; typedef struct MVMP6numBody MVMP6numBody; typedef struct MVMP6numREPRData MVMP6numREPRData; typedef struct MVMP6opaque MVMP6opaque; typedef struct MVMP6opaqueBody MVMP6opaqueBody; typedef struct MVMP6opaqueBoxedTypeMap MVMP6opaqueBoxedTypeMap; typedef struct MVMP6opaqueNameMap MVMP6opaqueNameMap; typedef struct MVMP6opaqueREPRData MVMP6opaqueREPRData; typedef struct MVMP6str MVMP6str; typedef struct MVMP6strBody MVMP6strBody; typedef union MVMRegister MVMRegister; typedef struct MVMReprRegistry MVMReprRegistry; typedef struct MVMREPROps MVMREPROps; typedef struct MVMREPROps_Associative MVMREPROps_Associative; typedef struct MVMREPROps_Attribute MVMREPROps_Attribute; typedef struct MVMREPROps_Boxing MVMREPROps_Boxing; typedef struct MVMREPROps_Positional MVMREPROps_Positional; typedef struct MVMSerializationContext MVMSerializationContext; typedef struct MVMSerializationContextBody MVMSerializationContextBody; typedef struct MVMSerializationReader MVMSerializationReader; typedef struct MVMDeserializeWorklist MVMDeserializeWorklist; typedef struct MVMSerializationRoot MVMSerializationRoot; typedef struct MVMSerializationWriter MVMSerializationWriter; typedef struct MVMSpeshGraph MVMSpeshGraph; typedef struct MVMSpeshMemBlock MVMSpeshMemBlock; typedef struct MVMSpeshTemporary MVMSpeshTemporary; typedef struct MVMSpeshBB MVMSpeshBB; typedef struct MVMSpeshIns MVMSpeshIns; typedef union MVMSpeshOperand MVMSpeshOperand; typedef struct MVMSpeshAnn MVMSpeshAnn; typedef struct MVMSpeshFacts MVMSpeshFacts; typedef struct MVMSpeshCode MVMSpeshCode; typedef struct MVMSpeshCandidate MVMSpeshCandidate; typedef struct MVMSpeshGuard MVMSpeshGuard; typedef struct MVMSpeshLogGuard MVMSpeshLogGuard; typedef struct MVMSpeshCallInfo MVMSpeshCallInfo; typedef struct MVMSpeshInline MVMSpeshInline; typedef struct MVMSTable MVMSTable; typedef struct MVMStaticFrame MVMStaticFrame; typedef struct MVMStaticFrameBody MVMStaticFrameBody; typedef struct MVMStorageSpec MVMStorageSpec; typedef struct MVMString MVMString; typedef struct MVMStringBody MVMStringBody; typedef struct MVMStringConsts MVMStringConsts; typedef struct MVMStringStrand MVMStringStrand; typedef struct MVMGraphemeIter MVMGraphemeIter; typedef struct MVMCodepointIter MVMCodepointIter; typedef struct MVMThread MVMThread; typedef struct MVMThreadBody MVMThreadBody; typedef struct MVMThreadContext MVMThreadContext; typedef struct MVMUnicodeNamedValue MVMUnicodeNamedValue; typedef struct MVMUnicodeNameRegistry MVMUnicodeNameRegistry; typedef struct MVMUninstantiable MVMUninstantiable; typedef struct MVMWorkThread MVMWorkThread; typedef struct MVMIOOps MVMIOOps; typedef struct MVMIOClosable MVMIOClosable; typedef struct MVMIOEncodable MVMIOEncodable; typedef struct MVMIOSyncReadable MVMIOSyncReadable; typedef struct MVMIOSyncWritable MVMIOSyncWritable; typedef struct MVMIOAsyncReadable MVMIOAsyncReadable; typedef struct MVMIOAsyncWritable MVMIOAsyncWritable; typedef struct MVMIOSeekable MVMIOSeekable; typedef struct MVMIOSockety MVMIOSockety; typedef struct MVMIOPipeable MVMIOPipeable; typedef struct MVMIOPossiblyTTY MVMIOPossiblyTTY; typedef struct MVMIOLockable MVMIOLockable; typedef struct MVMIOSyncStreamData MVMIOSyncStreamData; typedef struct MVMIOSyncPipeData MVMIOSyncPipeData; typedef struct MVMDecodeStream MVMDecodeStream; typedef struct MVMDecodeStreamBytes MVMDecodeStreamBytes; typedef struct MVMDecodeStreamChars MVMDecodeStreamChars; typedef struct MVMDecodeStreamSeparators MVMDecodeStreamSeparators; typedef struct MVMNativeCallback MVMNativeCallback; typedef struct MVMNativeCallbackCacheHead MVMNativeCallbackCacheHead; typedef struct MVMJitGraph MVMJitGraph; typedef struct MVMJitNode MVMJitNode; typedef struct MVMJitDeopt MVMJitDeopt; typedef struct MVMJitInline MVMJitInline; typedef struct MVMJitHandler MVMJitHandler; typedef struct MVMJitPrimitive MVMJitPrimitive; typedef struct MVMJitBranch MVMJitBranch; typedef struct MVMJitCallC MVMJitCallC; typedef struct MVMJitCallArg MVMJitCallArg; typedef struct MVMJitLabel MVMJitLabel; typedef struct MVMJitGuard MVMJitGuard; typedef struct MVMJitInvoke MVMJitInvoke; typedef struct MVMJitJumpList MVMJitJumpList; typedef struct MVMJitControl MVMJitControl; typedef struct MVMJitCode MVMJitCode; typedef struct MVMProfileThreadData MVMProfileThreadData; typedef struct MVMProfileGC MVMProfileGC; typedef struct MVMProfileCallNode MVMProfileCallNode; typedef struct MVMProfileAllocationCount MVMProfileAllocationCount; typedef struct MVMProfileContinuationData MVMProfileContinuationData; MoarVM-2015.11/tools/colorize_spesh.p60000644000175000017500000000057712456307241016524 0ustar jnthnjnthnsub colorblock($num, $ver) { "\e[48;5;{ 0x10 + (($num + 1) * 31416) % 216 }m " ~ "\e[38;5;{ 0xE8 + 24 - ($num + $ver * 5) % 24 }m\c[ BLACK LEFT-POINTING TRIANGLE ]" ~ "\e[48;5;0m\c[ BLACK RIGHT-POINTING TRIANGLE ]" ~ "\e[m" } for lines() :eager -> $_ is copy { .subst( /r(<.digit>+) '(' (<.digit>+) ')' /, -> $/ { "r$0\($1\)" ~ colorblock($0, $1) }, :g ).say } MoarVM-2015.11/tools/count-jit-bail-ops.p60000755000175000017500000000045512456307241017112 0ustar jnthnjnthn#!/usr/bin/env perl6-m use v6; my %counts; my $logfile = @*ARGS ?? shift @*ARGS !! %*ENV; for lines($logfile.IO) -> $line { if $line ~~ /'BAIL:'/ { $line ~~ /'<' (\w+) '>'/; %counts{$/[0].Str}++; } } for %counts.sort(*.value).reverse -> $pair { say $pair; } MoarVM-2015.11/tools/dynvarcost0000755000175000017500000000211012456307241015330 0ustar jnthnjnthn#!/usr/bin/perl use v5.18; use strict; my $TRIES; my %tries; my $FCOST; my $ICOST; my $ECOST; my $XCOST; my %fcost; my %icost; my %ecost; my %xcost; while (<>) { my ($how, $name, $fcost, $icost, $ecost, $xcost) = split; $TRIES++; $tries{$name}++; $FCOST += $fcost; $ICOST += $icost; $ECOST += $ecost; $XCOST += $xcost; $fcost{$name} += $fcost; $icost{$name} += $icost; $ecost{$name} += $ecost; $xcost{$name} += $xcost; } say " TRIES FRAMES INLINES EMPTY TAKEN"; say " ======== =============== =============== =============== ==============="; output("TOTAL", $TRIES, $FCOST, $ICOST, $ECOST, $XCOST); say ""; for my $name (sort {$tries{$b} <=> $tries{$a}} keys %tries) { output($name, $tries{$name}, $fcost{$name}, $icost{$name}, $ecost{$name}, $xcost{$name}); } sub output { my ($name, $t, $f, $i, $e, $x) = @_; printf "%-22s %8d %9d %6.2f %9d %6.2f %9d %6.2f %9d %6.2f\n", $name, $t, $f, $f/$t, $i, $i/$t, $e, $e/$t, $x, $x/$t; } MoarVM-2015.11/tools/graph_spesh.p60000644000175000017500000002314112554473060015771 0ustar jnthnjnthn#!/usr/bin/env perl6 =begin pod The Speshlog Excerpt Grapher This little script will eat a piece of speshlog (it expects to be fed an excerpt that contains only a single Frame with all its BBs, but it'll get only slightly confused if BBs are missing) and outputs Graphviz' C Language to stdout. Ideally, you'd use C to generate an image file from the result or have it display the result "interactively" in a window: =code perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tsvg > helpful_graph.svg perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tpng > huge_image.png perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tx11 The -T flag for dot selects the output format. Using K<-Tx11> will open a window in which you can pan and zoom around in. If you get an error that MAST::Ops could not be found, please run C to generate that module. =end pod use lib $?FILE.path.parent.child("lib"); use MAST::Ops; my $current_bb; my %lit_real_serial; my %lit_str_serial; say 'digraph G {'; say ' graph [rankdir="TB"];'; say ' node [shape=record]'; my $insnum = 0; my $in_subgraph = 0; # if instruction-carrying lines appear before the first BB, we # shall gracefully invent a starting point. my $last_ins = "\"out of nowhere\""; my %bb_map; my @connections; my %bb_connections; my @dominance_conns; my @callsite_args; my %reg_writers; for lines() :eager -> $_ is copy { when / ^ ' ' $=[<[a..z I 0..9 _]>+] \s+ [ $=[ | r \s* $=[<.digit>+] \s* '(' \s* $=[<.digit>+] \s* ')' | liti <.digit>+ '(' ~ ')' <-[)]>+ | litn <.digit>+ '(' ~ ')' <-[)]>+ | lits '(' .*? ')' | lex '(' .*? ')' | sslot '(' + ')' | BB '(' + ')' | '' | '' ] ]* % [',' \s*] \s* $ / { say ""; print " \"{$}_{$insnum}\" "; say " ["; if $ eq "set" | "decont" { say " shape=Mrecord"; } my $previous_ins = $last_ins; my $current_ins = "\"{$}_{$insnum}\""; $last_ins = $current_ins ~ ":op"; my @back_connections; my @labelparts = qq[ $ ]; #note "---------------"; #note @.gist; #note "---------------"; my @props; my $opcode; my $arity; if %MAST::Ops::codes{$}:exists { $opcode = %MAST::Ops::codes{$}; $arity = @MAST::Ops::counts[$opcode]; my $offset = @MAST::Ops::offsets[$opcode]; @props = do for ^$arity { $%( flags => (my $flags = @MAST::Ops::values[$offset + $_]), rwmasked => (my $rwmasked = $flags +& %MAST::Ops::flags), type => ($flags +& %MAST::Ops::flags), is_sslot => ($flags +& %MAST::Ops::flags), targets_reg => ($rwmasked +& (%MAST::Ops::flags +| %MAST::Ops::flags)), writes_tgt => ($rwmasked +& (%MAST::Ops::flags +| %MAST::Ops::flags)), ) } } else { # we have an extop here. assume it writes to its first register and # has exactly as many arguments as it says in the spesh log. $arity = @.elems; @props = $%( flags => 0, rwmasked => (my $type = %MAST::Ops::flags), type => $type, targets_reg => 1, writes_tgt => 1 ), do for 1..^$arity { $%( flags => 0, rwmasked => (my $boringtype = %MAST::Ops::flags), type => $boringtype, targets_reg => @[$_].match(/r+'('+')'/) ?? 1 !! 0, writes_tgt => 0 ) }; } my @argument_names = @>>.Str>>.trans( "<" => "«", ">" => "»" ); if $arity && @props[0] { if @props[0] { %reg_writers{@argument_names[0]} = $current_ins ~ ":0"; } } my $first_read = @props[0] ?? 1 !! 0; for @argument_names.kv -> $k, $v { if $k >= $first_read and @props[$k] { if %reg_writers{$v}:exists { @back_connections.push: %reg_writers{$v} => $current_ins ~ ":$k"; } else { note "found register without writer: $v for instruction $current_ins argument $k (this is harmless)" } } @labelparts.push: "<$k> $v"; } if $arity && @props[0] { @labelparts = @labelparts[1, 0], @labelparts[2..*]; } # find outgoing connections for @argument_names.kv -> $k, $_ { if m/ BB '(' $=[+] ')' / -> $/ { @connections.push: $%( source_block => $current_bb, target_block => $, source_ins => $current_ins ~ ":<$k>" ); } } print " label=\"{ @labelparts.join(" | ") }\" rank=$insnum"; $insnum++; say " ];"; say ""; if $previous_ins ~~ / entry / { say " $previous_ins -> $last_ins [style=dotted];"; } else { say " $previous_ins -> $last_ins [color=lightgrey];"; } say ""; for @back_connections { say " $_.key() -> $_.value();"; } say ""; say ""; } when / ^ ' BB ' $=[<.digit>+] ' (' ~ ')' $=<[0..9 a..f x]>+ ':' $ / { %bb_map{~$} = ~$; %bb_map{~$} = ~$; if $in_subgraph { say " \"exit_$current_bb\";"; say " $last_ins -> \"exit_$current_bb\" [style=dotted];"; say " }" if $in_subgraph; } say " subgraph "; say "\"cluster_{~$}\" \{"; say " rankdir = TB;"; #say " label = \"$\";"; say " \"entry_$\" [label=\" entry of block $\"];"; $in_subgraph = True; $current_bb = ~$; $last_ins = "\"entry_$\""; } when / ^ ' ' 'Successors: ' [$=[<.digit>+]]* % ', ' $ / { %bb_connections{$current_bb} = @>>.Str; } when / ^ ' ' '[Annotation: ' $=[<[a..z A..Z 0..9 \ ]>+] / { my $previous_ins = $last_ins; $last_ins = "\"annotation_{$current_bb}_{$}_{(state $)++}\""; say " $last_ins [label=\"{$}\" shape=cds];"; if $last_ins ~~ / entry / { say " $previous_ins -> $last_ins [style=dotted];"; } else { say " $previous_ins -> $last_ins [color=lightgrey];"; } } when / ^ 'Finished specialization of ' / { } when / ^ ' ' \s* r $=[<.digit>+] '(' $=[<.digit>+] ')' ':' / { } when / ^ ' ' 'Dominance children: ' [$=[<.digit>+]]* % [',' <.ws>] / { for $.list -> $child { @dominance_conns.push($current_bb => $child.Int); } } when / ^ ' ' [ 'Instructions' | 'Predeccessors' ] / { } when /^ [ 'Facts' | '='+ ] / { } when /^ 'Spesh of \'' $=[<[a..z 0..9 _ ' -]>*] '\' (cuid: ' $=[<[a..z A..Z 0..9 _ . -]>+] ', file: ' $=[<-[:]>*] ':' $=[+] ')' $ / { say " file [shape=record label=\"\{ {$} | {$}:{$} | {$} \}\"];"; } when / ^ \s* $ / { } when /^ 'Callsite ' $=[<[a..f A..F 0..9 x]>+] ' (' $=[+] ' args, ' $=[+] ' pos)' $/ { say " callsite [shape=record label=\"\{ Callsite | {$} arguments, {$} of them positionals | {$} \}\"];"; } when / ^ ' - ' $=[<[a..z A..B 0..9 _ ' -]>+] $ / { @callsite_args.push: ~$; } when / ^ ' PHI' / { # we don't have a nice way to show PHI nodes yet, sadly. } when / ^ ['Stats:' | 'Logged values:'] / { } when / ^ ' ' \d+ [ 'spesh slots' | 'log values'] / { } when / ^ ' ' \s* [\d+]+ %% \s+ / { } default { say " unparsed_line_{(state $)++} [label=\"{$_}\"];"; } } say " }" if $in_subgraph; if @callsite_args { say @callsite_args.map({ "\"arg_{(state $)++}\" [label=\"$_\"]" }).join(';'); say "callsite -> " ~ (^@callsite_args).map({"\"arg_$_\""}).join(" -> ") ~ ";"; } for @connections { say "$_. -> \"entry_{ %bb_map{.} }\" [style=dotted];"; } for @dominance_conns { say "\"exit_$_.key()\" -> \"entry_%bb_map{$_.value}\" [style=tapered;penwidth=10;arrowhead=none;color=grey];"; } for %bb_connections.kv -> $k, $v { # bb 0 is special and has successors that it won't jump to. #note "marking successors for block $k"; #note $v.perl; #note ""; next unless @$v; my @candidates = do %bb_map{$k} == "0" ?? %bb_map{@$v} !! %bb_map{$v[*-1]}; for @candidates -> $cand { say "\"exit_$k\" -> \"entry_$cand\" [style=dotted];"; } } say '}'; MoarVM-2015.11/tools/interp_backtrace_enhancer.p60000644000175000017500000000116012554473060020626 0ustar jnthnjnthnmy $interp_c_file = $*PROGRAM-NAME.IO.parent.parent.child('src').child('core').child('interp.c'); my $cur_op = 'before_dispatch'; my %lines_to_op; for $interp_c_file.lines.kv -> $lineno, $line { if $line ~~ / ^ \s* 'OP(' $=<[a..z A..Z \- \_ 0..9]>+ '):' / { $cur_op = $; } elsif $line ~~ / ^ \s* 'default:' / { $cur_op ~= "_or_after_dispatch"; } %lines_to_op{$lineno} = $cur_op; } for lines() -> $_ is copy { $_ .= subst(rx/'interp.c:' $=<[0..9]>+ /, -> $/ { "interp.c:{$} ({%lines_to_op{$}})" }, :g); .say; } MoarVM-2015.11/tools/lib/MAST/.empty0000644000175000017500000000000012456307241015653 0ustar jnthnjnthnMoarVM-2015.11/tools/moar-gdb.py0000644000175000017500000007111712456307241015265 0ustar jnthnjnthn# -*- coding: utf-8 -*- # GDB will automatically load this module when you attach to the binary moar. # but first you'll have to tell gdb that it's okay to load it. gdb will instruct # you on how to do that. # If it doesn't, you may need to copy or symlink this script right next to the # moar binary in install/bin. # # cd /path/to/install/bin # ln -s path/to/moarvm/tools/moar-gdb.py # This script contains a few helpers to make debugging MoarVM a bit more pleasant. # # So far, there's: # # - A semi-functional pretty-printer for MVMString and MVMString* # - A non-working pretty-printer for MVMObject in general # - A command "moar-heap" that walks the nursery and gen2 and displays # statistics about the REPRs found in them, as well as a display of # the fragmentation of the gen2 pages. # - A command "diff-moar-heap" that diffs (so far only) the two last # snapshots of the nursery, or whatever snapshot number you supply # as the argument. # Here's the TODO list: # # - Figure out if the string pretty-printer is hosed wrt. ropes or if # it's something wrong with MaarVM's ropes in general. # - Implement diffing for the gen2 in some sensible manner # - The backtrace should also display a backtrace of the interpreter # state. That's relatively easy, as you can just dump_backtrace(tc). # Here's some wishlist items # # - Offer an HTML rendering of the stats, since gdb insists on printing # a pager header right in between our pretty gen2 graphs most of the time import gdb from collections import defaultdict from itertools import chain import math import random #import blessings import sys # These are the flags from MVMString's body.flags str_t_info = {0: 'blob_32', 1: 'blob_ascii', 2: 'blob_8', 3: 'strands'} # How big to make the histograms and such PRETTY_WIDTH=50 # This must be kept in sync with your MoarVM binary, otherwise we'll end up # reading bogus data from the gen2 pages. MVM_GEN2_PAGE_ITEMS = 256 MVM_GEN2_BIN_BITS = 3 MVM_GEN2_BINS = 32 # This ought to give the same results as the equivalent code in gen2. def bucket_index_to_size(idx): return (idx + 1) << MVM_GEN2_BIN_BITS # This is the size the gen2 pictures should have, just so we don't have to # calculate the same sqrt of a constant over and over again. MVM_GEN2_PAGE_CUBE_SIZE = int(math.sqrt(MVM_GEN2_PAGE_ITEMS)) # If you'd like more precision for the REPR histogram in the gen2, and have a # bit of extra patience, turn this up. EXTRA_SAMPLES = 2 # This corresponds to the defines in MVMArray.h for MVMArrayREPRData.slot_type. array_storage_types = [ 'obj', 'str', 'i64', 'i32', 'i16', 'i8', 'n64', 'n32', 'u64', 'u32', 'u16', 'u8' ] # These are used to display the hilbert curves extra-prettily. halfblocks = u"█▀▄ â–‘â–’â–“" def shade_block(u, d): if u == d == True: return halfblocks[0] elif u == True and d == False: return halfblocks[1] elif u == False and d == True: return halfblocks[2] elif u == d == False: return halfblocks[3] elif u == d == None: return halfblocks[4] elif u == None and d == False or u == False and d == None: return halfblocks[5] elif u == None and d == True or u == True and d == None: return halfblocks[6] # Precalculate which index into the gen2 page goes at which coordinates in # our super pretty hilbert curve. def generate_hilbert(amount): hilbert_coords = [] # adapted from the english wikipedia article on the Hilbert Curve n = int(math.sqrt(amount)) def rot(s, x, y, rx, ry): if ry == 0: if rx == 1: x = s - 1 - x y = s - 1 - y return (y, x) return (x, y) def xy2d(x, y): rx = 0 ry = 0 d = 0 s = int(n / 2) while s > 0: rx = (x & s) > 0 ry = (y & s) > 0 d += s * s * ((3 * rx) ^ ry) (x, y) = rot(s, x, y, rx, ry) s /= 2 return d for y in range(n): hilbert_coords.append([]) for x in range(n): hilbert_coords[-1].append(xy2d(x, y)) return hilbert_coords hilbert_coords = generate_hilbert(MVM_GEN2_PAGE_ITEMS) # Sizes are easier to read if they have .s in them. def prettify_size(num): rest = str(num) result = "" while len(rest) > 3: result = rest[-3:] + "." + result rest = rest[:-3] if len(rest) >= 1: result = rest + "." + result return result[:-1] class MVMStringPPrinter(object): """Whenever gdb encounters an MVMString or an MVMString*, this class gets instantiated and its to_string method tries its best to print out the actual contents of the MVMString's storage.""" def __init__(self, val, pointer = False): self.val = val self.pointer = pointer def stringify(self): stringtyp = str_t_info[int(self.val['body']['storage_type']) & 0b11] if stringtyp in ("blob_32", "blob_ascii", "blob_8"): zero_reached = False data = self.val['body']['storage'][stringtyp] i = 0 pieces = [] graphs = self.val['body']['num_graphs'] # XXX are the strings actually null-terminated, or do we have to # XXX check the graphs attribute? for i in range(graphs): pdata = int((data + i).dereference()) try: # ugh, unicode woes ... pieces.append(chr(pdata)) except: pieces.append("\\x%x" % pdata) return "".join(pieces) elif stringtyp == "strands": # XXX here be dragons and/or wrong code # XXX This is still true now i = 0 pieces = [] data = self.val['body']['storage']['strands'] end_reached = False previous_index = 0 previous_string = None while not end_reached: strand_data = (data + i).dereference() if strand_data['blob_string'] == 0: end_reached = True pieces.append(previous_string[1:-1]) else: the_string = strand_data['blob_string'].dereference() if previous_string is not None: pieces.append( str(previous_string)[1:-1][ int(strand_data['start']) : int(strand_data['end']) - previous_index] ) previous_string = str(the_string) previous_index = int(strand_data['end']) i = i + 1 return "r(" + ")(".join(pieces) + ")" else: return "string of type " + stringtyp def to_string(self): if self.pointer: return "pointer to '" + self.stringify() + "'" else: return "'" + self.stringify() + "'" # currently nonfunctional class MVMObjectPPrinter(object): def __init__(self, val, pointer = False): self.val = val self.pointer = pointer def stringify(self): if self.pointer: as_mvmobject = self.val.cast("MVMObject *").dereference() else: as_mvmobject = self.val.cast("MVMObject") _repr = as_mvmobject['st']['REPR'] reprname = _repr['name'].string() return str(self.val.type.name) + " of repr " + reprname def to_string(self): if self.pointer: return "pointer to " + self.stringify() else: return self.stringify() def show_histogram(hist, sort="value", multiply=False): """In the context of this function, a histogram is a hash from an object that is to be counted to the number the object was found. sort takes "value" or "key" and gives you the ability to either sort by "order of buckets" or by "frequency of occurence". when giving multiply a value, you'll get a display of key * value on the right of the histogram, useful for a "size of object" to "count of objects" histogram so you'll get a sum of the taken space The histogram will not include values that are less than 2, because that may sometimes lead to "long tail" trouble and buttloads of pages of output to scroll through.""" if len(hist) == 0: print "(empty histogram)" return if sort == "value": items = sorted(list(hist.iteritems()), key = lambda (k, v): -v) elif sort == "key": items = sorted(list(hist.iteritems()), key = lambda (k, v): k) else: print "sorting mode", sort, "not implemented" maximum = max(hist.values()) keymax = min(max([len(str(key)) for key in hist.keys()]), 20) lines_so_far = 0 group = -1 num_in_group = 0 for key, val in items: if lines_so_far < 50: try: str(key) except TypeError: key = repr(key) if val < 2: continue appendix = prettify_size(int(key) * int(val)).rjust(10) if multiply else "" print str(key).ljust(keymax + 1), ("[" + "=" * int((float(hist[key]) / maximum) * PRETTY_WIDTH)).ljust(PRETTY_WIDTH + 1), str(val).ljust(len(str(maximum)) + 2), appendix else: if val == group: num_in_group += 1 else: if num_in_group > 1: print num_in_group, " x ", group group = val num_in_group = 1 lines_so_far += 1 print def diff_histogram(hist_before, hist_after, sort="value", multiply=False): """Works almost exactly like show_histogram, but takes two histograms that should have matching keys and displays the difference both in graphical form and as numbers on the side.""" max_hist = defaultdict(int) min_hist = defaultdict(int) zip_hist = {} max_val = 0 max_key = 0 longest_key = "" for k,v in chain(hist_before.iteritems(), hist_after.iteritems()): max_hist[k] = max(max_hist[k], v) min_hist[k] = min(max_hist[k], v) max_val = max(max_val, v) max_key = max(max_key, k) longest_key = str(k) if len(str(k)) > len(longest_key) else longest_key for k in max_hist.keys(): zip_hist[k] = (hist_before[k], hist_after[k]) if sort == "value": items = sorted(list(zip_hist.iteritems()), key = lambda (k, (v1, v2)): -max(v1, v2)) elif sort == "key": items = sorted(list(zip_hist.iteritems()), key = lambda (k, (v1, v2)): k) else: print "sorting mode", sort, "not implemented" for key, (val1, val2) in items: lv, rv = min(val1, val2), max(val1, val2) lc, rc = ("+", "-") if val1 > val2 else ("-", "+") bars = "[" \ + lc * int((float(lv) / max_val) * PRETTY_WIDTH) \ + rc * int((float(rv - lv) / max_val) * PRETTY_WIDTH) values = str(val1).ljust(len(str(max_val)) + 1) \ + " -> " \ + str(val2).ljust(len(str(max_val)) + 1) appendix = prettify_size(int(key) * int(val1)).rjust(10) \ + " -> " \ + prettify_size(int(key) * int(val2)).rjust(10) \ if multiply else "" print str(key).ljust(len(longest_key) + 2), bars.ljust(PRETTY_WIDTH), values, appendix class CommonHeapData(object): """This base class holds a bunch of histograms and stuff that are interesting regardless of wether we are looking at nursery objects or gen2 objects.""" number_objects = None number_stables = None number_typeobs = None size_histogram = None repr_histogram = None opaq_histogram = None arrstr_hist = None arrusg_hist = None string_histogram = None generation = None def __init__(self, generation): self.generation = generation self.size_histogram = defaultdict(int) self.repr_histogram = defaultdict(int) self.opaq_histogram = defaultdict(int) self.arrstr_hist = defaultdict(int) self.arrusg_hist = defaultdict(int) self.string_histogram = defaultdict(int) self.number_objects = 0 self.number_stables = 0 self.number_typeobs = 0 def analyze_single_object(self, cursor): """Given a pointer into the nursery or gen2 that points at the beginning of a MVMObject of any sort, run a statistical analysis of what the object is and some extra info depending on its REPR. To make this scheme work well with the nursery analysis, it returns the size of the object analysed.""" stooge = cursor.cast(gdb.lookup_type("MVMObjectStooge").pointer()) size = stooge['common']['header']['size'] flags = int(stooge['common']['header']['flags']) is_typeobj = flags & 1 is_stable = flags & 2 STable = stooge['common']['st'].dereference() if not is_stable: REPR = STable["REPR"] REPRname = REPR["name"].string() if is_typeobj: self.number_typeobs += 1 else: self.number_objects += 1 else: REPR = None REPRname = "STable" self.number_stables += 1 self.size_histogram[int(size)] += 1 self.repr_histogram[REPRname] += 1 if REPRname == "P6opaque": self.opaq_histogram[int(size)] += 1 elif REPRname == "VMArray": slot_type = int(STable['REPR_data'].cast(gdb.lookup_type("MVMArrayREPRData").pointer())['slot_type']) self.arrstr_hist[array_storage_types[slot_type]] += 1 array_body = cursor.cast(gdb.lookup_type("MVMArray").pointer())['body'] if array_body['ssize'] == 0: usage_perc = "N/A" else: usage_perc = (int(array_body['elems'] * 10) / int(array_body['ssize'])) * 10 if usage_perc < 0 or usage_perc > 100: usage_perc = "inv" self.arrusg_hist[usage_perc] += 1 elif REPRname == "MVMString": try: casted = cursor.cast(gdb.lookup_type('MVMString').pointer()) self.string_histogram[MVMStringPPrinter(casted).stringify()] += 1 except gdb.MemoryError as e: print e print cursor.cast(gdb.lookup_type('MVMString').pointer()) pass return size class NurseryData(CommonHeapData): """The Nursery Data contains the current position where we allocate as well as the beginning and end of the given nursery.""" allocation_offs = None start_addr = None end_addr = None def __init__(self, generation, start_addr, end_addr, allocation_offs): super(NurseryData, self).__init__(generation) self.start_addr = gdb.Value(start_addr) self.end_addr = gdb.Value(end_addr) self.allocation_offs = allocation_offs def analyze(self, tc): print "starting to analyze the nursery:" cursor = gdb.Value(self.start_addr) info_step = int(self.allocation_offs - cursor) / 50 next_info = cursor + info_step print "_" * 50 while cursor < self.allocation_offs: size = self.analyze_single_object(cursor) cursor += size if cursor > next_info: next_info += info_step sys.stdout.write("-") sys.stdout.flush() print def summarize(self): print "nursery state:" sizes = (int(self.allocation_offs - self.start_addr), int(self.end_addr - self.allocation_offs)) relsizes = [1.0 * size / (float(int(self.end_addr - self.start_addr))) for size in sizes] print "[" + "=" * int(relsizes[0] * 20) + " " * int(relsizes[1] * 20) + "] ", int(relsizes[0] * 100),"%" print self.number_objects, "objects;", self.number_typeobs, " type objects;", self.number_stables, " STables" print "sizes of objects/stables:" show_histogram(self.size_histogram, "key", True) print "sizes of P6opaques only:" show_histogram(self.opaq_histogram, "key", True) print "REPRs:" show_histogram(self.repr_histogram) print "VMArray storage types:" show_histogram(self.arrstr_hist) print "VMArray usage percentages:" show_histogram(self.arrusg_hist, "key") print "strings:" show_histogram(self.string_histogram) def diff(self, other): print "nursery state --DIFF--:" print "sizes of objects/stables:" diff_histogram(self.size_histogram, other.size_histogram, "key", True) print "sizes of P6opaques only:" diff_histogram(self.opaq_histogram, other.opaq_histogram, "key", True) print "REPRs:" diff_histogram(self.repr_histogram, other.repr_histogram) print "VMArray storage types:" diff_histogram(self.arrstr_hist, other.arrstr_hist) print "VMArray usage percentages:" diff_histogram(self.arrusg_hist, other.arrusg_hist, "key") class Gen2Data(CommonHeapData): """One Gen2Data instance gets created per size class. Thus, every instance corresponds to an exact size of object. The class also handles the free list that is chained through the gen2, so that fragmentation can be determined and stale objects not sampled for analysis.""" size_bucket = None length_freelist = None bucket_size = None g2sc = None page_addrs = None pagebuckets = None empty = False cur_page = 0 repr_histogram = None size_histogram = None def sizes(self): # XXX this ought to return a tuple with the sizes we # accept in this bucket return bucket_index_to_size(self.size_bucket), bucket_index_to_size(self.size_bucket + 1) - 1 def __init__(self, generation, gen2sizeclass, size_bucket): super(Gen2Data, self).__init__(generation) self.size_bucket = size_bucket self.g2sc = gen2sizeclass self.bucket_size = bucket_index_to_size(self.size_bucket) self.repr_histogram = defaultdict(int) self.size_histogram = defaultdict(int) def analyze(self, tc): if int(self.g2sc['pages'].cast(gdb.lookup_type("int"))) == 0: self.empty = True return pagebuckets = [[True for i in range(MVM_GEN2_PAGE_ITEMS)] for i in range(int(self.g2sc['num_pages']))] page_addrs = [] self.page_addrs = page_addrs self.pagebuckets = pagebuckets self.cur_page = int(self.g2sc['cur_page']) # we need to make sure we don't accidentally run into free_list'd slots # that's why we just collect addresses up front and sample them later on. sample_stooges = [] page_cursor = self.g2sc['pages'] for page_idx in range(self.g2sc['num_pages']): # collect the page addresses so that we can match arbitrary # pointers to page index/bucket index pairs later on. page_addrs.append(page_cursor.dereference()) if page_idx == self.cur_page: # XXX cur_page is going to be removed from MoarVM, as it's only # XXX needed for this exact code here. # if the page we're looking at is the "current" page, we look # at the alloc_pos to find out where allocated objects stop. alloc_bucket_idx = int(int(self.g2sc['alloc_pos'] - page_cursor.dereference()) / self.bucket_size) pagebuckets[page_idx][alloc_bucket_idx:] = [False] * (MVM_GEN2_PAGE_ITEMS - alloc_bucket_idx) elif page_idx > self.cur_page: # if we're past the page we're currently allocating in, the # pages are empty by definition alloc_bucket_idx = 0 pagebuckets[page_idx] = [False] * MVM_GEN2_PAGE_ITEMS else: # otherwise, the whole page is potentially allocated objects. alloc_bucket_idx = MVM_GEN2_PAGE_ITEMS # sample a few objects for later analysis (after free list checking) samplecount = int(min(MVM_GEN2_PAGE_CUBE_SIZE * EXTRA_SAMPLES, alloc_bucket_idx / 4)) samples = sorted(random.sample(range(0, alloc_bucket_idx), samplecount)) for idx in samples: stooge = (page_cursor.dereference() + (idx * self.bucket_size)).cast(gdb.lookup_type("MVMObjectStooge").pointer()) sample_stooges.append((stooge, page_idx, idx)) page_cursor += 1 # now punch holes in our page_buckets free_cursor = self.g2sc['free_list'] def address_to_page_and_bucket(addr): for idx, base in enumerate(page_addrs): end = base + self.bucket_size * MVM_GEN2_PAGE_ITEMS if base <= addr < end: return idx, int((addr - base) / self.bucket_size) self.length_freelist = 0 while free_cursor.cast(gdb.lookup_type("int")) != 0: if free_cursor.dereference().cast(gdb.lookup_type("int")) != 0: result = address_to_page_and_bucket(free_cursor.dereference()) if result: page, bucket = result pagebuckets[page][bucket] = False self.length_freelist += 1 free_cursor = free_cursor.dereference().cast(gdb.lookup_type("char").pointer().pointer()) print "" #doubles = defaultdict(int) # now we can actually sample our objects for stooge, page, idx in sample_stooges: if pagebuckets[page][idx] != True: continue try: size = self.analyze_single_object(stooge) except Exception as e: print e #if len(doubles) > 10: #show_histogram(doubles) def summarize(self): print "size bucket:", self.bucket_size if self.empty: print "(unallocated)" return print "setting up stuff" cols_per_block = int(math.sqrt(MVM_GEN2_PAGE_ITEMS)) lines_per_block = cols_per_block / 2 outlines = [[] for i in range(lines_per_block + 1)] break_step = PRETTY_WIDTH / (lines_per_block + 1) next_break = break_step pgct = 0 fullpages = 0 drawn = False for pgnum, page in enumerate(self.pagebuckets): if pgnum > self.cur_page: break if not all(page) and any(page): # hacky "take two at a time" for outline, (line, nextline) in enumerate(zip(*[iter(hilbert_coords)] * 2)): for idx, (upper, lower) in enumerate(zip(line, nextline)): upper, lower = page[upper], page[lower] outlines[-lines_per_block + outline].append(shade_block(upper, lower)) outlines[-lines_per_block - 1].append(str(str(pgnum + 1) + "st pg").center(cols_per_block) + " ") pgct += 1 drawn = True else: fullpages += 1 drawn = False if pgct > next_break: outlines.extend([[] for i in range(lines_per_block + 2)]) next_break += break_step elif pgnum != self.cur_page and drawn: for line_num in range(lines_per_block): outlines[-line_num - 1].append(" ") print (u"\n".join(map(lambda l: u"".join(l), outlines))).encode("utf8") if fullpages > 0: print "(and", fullpages, "completely filled pages)", if self.cur_page < len(self.pagebuckets): print "(and", (len(self.pagebuckets) - self.cur_page + 1), "empty pages)", if self.length_freelist > 0: print "(freelist with", self.length_freelist, "entries)", print "" # does the allocator/copier set the size of the object to the exact bucket size # automatically? if len(self.size_histogram) > 1: print "sizes of objects/stables:" try: show_histogram(self.size_histogram, "key", True) except Exception as e: print e if len(self.repr_histogram) >= 1: print "REPRs:" try: show_histogram(self.repr_histogram) except Exception as e: print e print "strings:" show_histogram(self.string_histogram) class OverflowData(CommonHeapData): def analyze(self, tc): g2a = tc['gen2'] num_overflows = g2a["num_overflows"] for of_idx in range(num_overflows): of_obj = g2a["overflows"][of_idx] self.analyze_single_object(of_obj) def summarize(self): print "overflows in the gen2" print self.number_objects, "objects;", self.number_typeobs, " type objects;", self.number_stables, " STables" print "sizes of objects/stables:" show_histogram(self.size_histogram, "key", True) print "sizes of P6opaques only:" show_histogram(self.opaq_histogram, "key", True) print "REPRs:" show_histogram(self.repr_histogram) print "VMArray storage types:" show_histogram(self.arrstr_hist) print "VMArray usage percentages:" show_histogram(self.arrusg_hist, "key") print "strings:" show_histogram(self.string_histogram) class HeapData(object): run_nursery = None run_gen2 = None generation = None nursery_memory = [] class AnalyzeHeapCommand(gdb.Command): """Analyze the nursery and gen2 of MoarVM's garbage collector corresponding to the current tc, or the tc you pass as the first argument""" def __init__(self): super(AnalyzeHeapCommand, self).__init__("moar-heap", gdb.COMMAND_DATA) def invoke(self, arg, from_tty): tc = gdb.selected_frame().read_var(arg if arg else "tc") if not str(tc.type).startswith("MVMThreadContext"): raise ValueError("Please invoke the heap analyzer command on a MVMThreadContext, usually tc.") # find out the GC generation we're in (just a number increasing by 1 every time we GC) instance = tc['instance'] generation = instance['gc_seq_number'] nursery = NurseryData(generation, tc['nursery_tospace'], tc['nursery_alloc_limit'], tc['nursery_alloc']) nursery.analyze(tc) nursery_memory.append(nursery) #print "the current generation of the gc is", generation sizeclass_data = [] for sizeclass in range(MVM_GEN2_BINS): g2sc = Gen2Data(generation, tc['gen2']['size_classes'][sizeclass], sizeclass) sizeclass_data.append(g2sc) g2sc.analyze(tc) overflowdata = OverflowData(generation) overflowdata.analyze(tc) for g2sc in sizeclass_data: g2sc.summarize() nursery.summarize() overflowdata.summarize() class DiffHeapCommand(gdb.Command): """Display the difference between two snapshots of the nursery.""" def __init__(self): super(DiffHeapCommand, self).__init__("diff-moar-heap", gdb.COMMAND_DATA) def invoke(self, arg, from_tty): if arg != "": if " " in arg: pos1, pos2 = map(int, arg.split(" ")) else: pos1, pos2 = int(arg), int(arg - 1) else: pos1 = -1 pos2 = -2 assert len(nursery_memory) > max(pos1, pos2) nursery_memory[pos2].diff(nursery_memory[pos1]) def str_lookup_function(val): if str(val.type) == "MVMString": return MVMStringPPrinter(val) elif str(val.type) == "MVMString *": return MVMStringPPrinter(val, True) return None def mvmobject_lookup_function(val): pointer = str(val.type).endswith("*") if str(val.type).startswith("MVM"): try: val.cast(gdb.lookup_type("MVMObject" + (" *" if pointer else ""))) return MVMObjectPPrinter(val, pointer) except Exception as e: print "couldn't cast this:", e pass return None def register_printers(objfile): objfile.pretty_printers.append(str_lookup_function) print "MoarVM string pretty printer registered" # XXX since this is currently nonfunctional, just ignore it for now # objfile.pretty_printers.append(mvmobject_lookup_function) # print "MoarVM Object pretty printer registered" commands = [] def register_commands(objfile): commands.append(AnalyzeHeapCommand()) print "moar-heap registered" commands.append(DiffHeapCommand()) print "diff-moar-heap registered" # We have to introduce our classes to gdb so that they can be used if __name__ == "__main__": register_printers(gdb.current_objfile()) register_commands(gdb.current_objfile()) MoarVM-2015.11/tools/parse_jitgraph.p60000644000175000017500000002470112573775575016514 0ustar jnthnjnthnuse lib $?FILE.IO.parent.child("lib"); use MAST::Ops; role CLanguageBase { regex ws { :r [ | \s+ | '//' \N* \n | [ '/*' [<-[*]>+ || '*']* '*/' ] ]* [ | $ ] } regex curly_block { '{' [ | \s+ | | <-[ { ]>+ ]* '}' } } # Easiest thing first: op_to_func sub parse_op_to_func($source) { grammar OpToFuncGrammar does CLanguageBase { rule TOP { op_to_func '(' MVMThreadContext '*' tc ',' MVMint16 ')' '{' # introduction 'switch(' $=[<[a..z A..Z 0..9 _]>+] ')' '{' + default ':' [\N*\n]*? '}' .* } rule entry { [ case $=[ MVM_ <[a..z A..Z 0..9 _]>+ ] ':' ]+ return '&'? ';' { note "parsed an entry for $" } } } my $cut_off_source = $source.substr($source.index("op_to_func\(MVMThreadContext")); my $op_func_table = OpToFuncGrammar.parse($cut_off_source); note "parsed"; my %result; for $op_func_table.list -> $/ { %result{$>>.Str} = $.Str xx *; } return %result; } sub parse_consume_ins_reprops($source, %opcode_to_cfunc) { # first, we'll cut the relevant sections of the source out: # the part of jgb_consume_reprop after the type-specialized parts # and then all of jgb_consume_ins my @sourcelines = $source.lines; @sourcelines .= grep({ / "couldn't be devirtualized" | " jgb_consume_ins" / ^ff^ / "default:" / }); @sourcelines .= grep({ $_ !~~ / ^ \s* '/*' .*? '*/' \s* $ / }); @sourcelines .= grep({ $_ !~~ / ^ \s* $ / }); # chunkify based on case: and break; # we are a very simple parser so if we find a break that's not followed # by a new case (or a "}") we just skip ahead until we see the next case. my @chunks = gather loop { # find the first non-case line. my $until = @sourcelines.first-index({ $_ !~~ / "case MVM_".*?':' / }); my @case-lines = @sourcelines[^$until]; @sourcelines.shift for ^$until; # we'll put all case statements into a single string for easier combing my $casestring = [~] @case-lines; my @ops = $casestring.comb(/ "case " \s* <( 'MVM_'.*? )> \s* ':' /); # find the next case-line. $until = @sourcelines.first-index( / "case MVM_".*?':' / ); $until = +@sourcelines unless $until; # may have to slurp until EOF. my @implementationlines = @sourcelines[^$until]; @sourcelines.shift for ^$until; take @ops => @implementationlines; last unless @sourcelines; } # collect everything we've bailed on my @skipped_opcodes; # also collect everything we've had success with my @success_opcodes; chunkloop: for @chunks.kv -> $chunkidx, $_ { my @ops = .key.list; my @lines = .value.list; # what C variable refers to what piece of the op in the code my %var_sources; # do we have something to read out of a register or a # constant or something like that? my %reg_types; # what arguments do we push to the C stack for this? my @c_arguments; # keep lines in case we abort somewhere. my @lines_so_far; # put this outside of the while loop for the report error sub my $line; sub report_unhandled($reason?) { note ""; note "============="; note "handling @ops.join(', ')"; if $reason { note ""; note $reason; note ""; } .note for @lines_so_far; note $line; note ""; @skipped_opcodes.push: @ops.join(", "); next chunkloop; } # we expect the chunk to begin with some setup: # initialise local variables with # register numbers # literal numbers, a string index, ... while @lines { last if @lines[0] !~~ / ^ \s+ [MVMint|MVMuint] /; while ($line = @lines.shift) ~~ m:s/^ [MVMint|MVMuint][16|32|64] '=' 'ins->operands[' $=[\d+] ']' [ | $=".reg.orig" | $=".lit_str_idx" | $=[".lit_i16"|".lit_i64"] ] / { @lines_so_far.push: "var_source: $line"; %var_sources{$.Str} = $.Int; %reg_types{$.Int} = ( $ ?? 'register' !! $ ?? 'str_idx' !! $ ?? 'literal' !! die "kind of operand source not defined: $/.perl()"); } unless $line ~~ m:s/ MVMJitCallArg / { report_unhandled "this line surprised us (expected MVMJitCallArg):"; } # since we consume the line in the condition for the coming # loop, but we want to handle this current line there as well, # we just unshift it into the lines array again ... @lines.unshift($line); while ($line = @lines.shift) ~~ m:s/ ^ [MVMJitCallArg args"[]" "=" '{']? [ | '{' ',' [ '{' '}' | ] | '{' $="MVM_JIT_LITERAL" ',' '{' $=[\d+] '}' ] [ '}' '}' ';' | '}' ',' ] $ / { #say $/; given $.Str { when "MVM_JIT_INTERP_VAR" { given $ { when "MVM_JIT_INTERP_TC" { @c_arguments.push: "(carg (tc) ptr)"; } when "MVM_JIT_INTERP_CU" { @c_arguments.push: "(carg (cu) ptr)"; } when "MVM_JIT_INTERP_FRAME" { @c_arguments.push: "(carg (frame) ptr)"; } when "MVM_JIT_INTERP_PARAMS" { @c_arguments.push: "(carg (^params) ptr)"; } default { report_unhandled "this kind of interp var ($_) isn't handled yet"; } } } when "MVM_JIT_REG_VAL" { # later on: figure out if it's a str/obj or an # int register that the op(s) take here. @c_arguments.push: '(carg $' ~ %var_sources{$.Str} ~ " int)"; } when "MVM_JIT_REG_VAL_F" { @c_arguments.push: '(carg $' ~ %var_sources{$.Str} ~ " num)"; } when "MVM_JIT_LITERAL" { if defined try $.Int { @c_arguments.push: '(carg (const ' ~ $.Int ~ ' int_sz) int)'; } elsif $.Str ~~ %var_sources { my $source_register = %var_sources{$.Str}; if %reg_types{$source_register} eq 'literal' { @c_arguments.push: '(carg (copy $' ~ $source_register ~ '))'; } else { report_unhandled "expected $.Str() (from $source_register) to be declared as literal"; } } else { report_unhandled "didn't understand this kind of MVM_JIT_LITERAL."; } } default { report_unhandled "this line surprised us (expected jgb_append_call_c):"; } } @lines_so_far.push: "c_args: $line"; } $line = $line ~ @lines.shift unless $line ~~ m/ ';' $ /; unless $line ~~ m:s/ jgb_append_call_c '(' tc ',' jgb ',' op_to_func '(' tc ',' op ')' ',' \d+ ',' args ',' $=[ MVM_JIT_RV_VOID | MVM_JIT_RV_INT | MVM_JIT_RV_PTR | MVM_JIT_RV_NUM ] ',' $=[ '-1' | <.ident> ] ')' ';' / { report_unhandled "this line surprised us (expected jgb_append_call_c):"; } my %rv_to_returnkind = ( MVM_JIT_RV_VOID => 'void', MVM_JIT_RV_INT => 'int', MVM_JIT_RV_PTR => 'ptr', MVM_JIT_RV_NUM => 'num', ); for @ops -> $opname { note %opcode_to_cfunc{$opname} ~ " going to have a template built for it"; say "(template: $opname"; say " (call (^func {%opcode_to_cfunc{$opname}})"; say " (arglist {+@c_arguments}"; for @c_arguments -> $carg { say " $carg"; } say " )"; say " " ~ %rv_to_returnkind{$}; say " ) )"; say ""; @success_opcodes.push: $opname; } } } note "all successfully parsed opcodes:"; note " + $_" for @success_opcodes; note ""; note "all skipped operations:"; note " - $_" for @skipped_opcodes; } sub MAIN($graph_c_file? is copy) { $graph_c_file //= $?FILE.IO.parent.parent.child("src").child("jit").child("graph.c"); my $graph_c_source = slurp($graph_c_file); note "got the source"; my %opcode_to_cfunc = parse_op_to_func($graph_c_source); parse_consume_ins_reprops($graph_c_source, %opcode_to_cfunc); } MoarVM-2015.11/tools/release.sh0000755000175000017500000000061312520766031015171 0ustar jnthnjnthn#!/bin/sh VERSION=$1 exec >MANIFEST echo MANIFEST git ls-files | perl -ne "print unless /^3rdparty\/\w+$/" for submod in 3rdparty/dyncall/ 3rdparty/libuv/ 3rdparty/dynasm/; do cd $submod git ls-files | perl -pe "s{^}{$submod}" cd ../..; done [ -d MoarVM-$VERSION ] || ln -s . MoarVM-$VERSION perl -pe "s{^}{MoarVM-$VERSION/}" MANIFEST | tar zc -T - -f MoarVM-$VERSION.tar.gz rm MoarVM-$VERSION MoarVM-2015.11/tools/spesh_diff.p60000644000175000017500000001474012456307241015603 0ustar jnthnjnthnuse v6; multi sub MAIN() { say q:to/USAGE/; This tool can be used as followed: spesh_diff.p6 output_from_mvm.txt spesh_diff.p6 --matcher="'foobar'" output.txt spesh_diff.p6 --matcher="/^ to $/" output.txt spesh_diff.p6 --matcher="diff => / '+' .*? 'nyi' /" output.txt This tool takes the output MoarVM generates to a file when you call it with MVM_SPESH_LOG environment variable set to a filename and splits it into two folders, optionally selects a subset of the participating cuids and then diffs everything for you using git diff. It will output colors always, so if you want to use less to paginate, you will need to supply -r to less. You can supply any valid Perl 6 code for the matcher flag. If you don't supply a Pair, a Pair from name to your matcher will be generated for you. You can filter based on these properties: before all text in the "before" section after all text in the "after" section name the name of the method/sub/... cuid the cuid diff the output of the diff command (watch out, these contain ansi color codes) USAGE } class Spesh is rw { has @.beforelines; has @.afterlines; has $.before; has $.after; has Str $.name; has Str $.cuid; has Str $.diff; } enum Target ; sub supersmartmatch($thing) { given $thing { when Pair { say "making a supersmartmatcher for $thing.key() -> $thing.value().perl()"; return -> $to_match { $to_match."$thing.key()"() ~~ supersmartmatch($thing.value) } } when Str { return -> $to_match { $to_match ~~ / $($thing) / } } when Junction { return -> $to_match { $to_match ~~ supersmartmatch($thing) } } default { return $thing } } } multi sub MAIN($filename?, :$matcher?) { my %speshes; my Target $target; my $linecount; my Int $lines_total; if $filename { $lines_total = qqx/ wc -l '$filename' /.words[0].Int; $*ARGFILES = open($filename, :r); } else { $*ARGFILES = $*IN; } my $ssm = do if $matcher { my Mu $matcher_evald = EVAL $matcher; if $matcher_evald.WHAT ~~ Str | Regex | Junction { supersmartmatch (name => $matcher_evald); } else { supersmartmatch $matcher_evald; } } else { True } sub notegraph($kind) { state $printed = 0; state $few = 0; my $did_print = False; if $kind eq "." { if ++$few %% 50 { $*ERR.print("."); $did_print = True; } } else { $*ERR.print($kind); $did_print = True; } if $did_print and ++$printed %% 80 { if $lines_total { my $part = $linecount / $lines_total; $*ERR.print(($part * 100).fmt(" % 3.2f%%")); my $est_time_left = (1 - $part) * (now - INIT now) / $part; $*ERR.print(($est_time_left / 60).fmt(" %d") ~ ($est_time_left % 60).fmt(":%02ds")); } $*ERR.print("\n"); } } try mkdir "spesh_diffs_before"; try mkdir "spesh_diffs_after"; my Spesh $current; for lines(:eager) { my $line = $_; $linecount++; when /^' ' / { given $target { when Before { $current.beforelines.push: $line; notegraph("."); } when Specialized { $current.afterlines.push: $line; notegraph("."); } } } when /^ [$=I 'nserting logging for specialization of ' | $=F 'inished specialization of '] \' $=[<-[\']>*] \' ' (cuid: ' $=[<-[\)]>+] ')' / { my $cuid = $; if $ eq 'I' { # want to build a new one while %speshes{$cuid}:exists { $cuid ~= "_"; } $current .= new(name => $.Str, cuid => $.Str, diff => ""); %speshes{$current.cuid} = $current; } elsif $ eq 'F' { # want to find the last one added that exists. while %speshes{$cuid}:exists { $cuid ~= '_'; } # so we chop off a _ again $cuid = $cuid.substr(0, *-1); $current = %speshes{$cuid}; warn "couldn't find a before-image for cuid $cuid" unless $current; $target = Specialized; } notegraph($); } when /^ 'Before:'/ { $target = Before; } when /^ 'After:'/ { $current.before = $current.beforelines.join("\n"); $current.beforelines = @(); $target = Logged; } when /^ 'Facts:'/ { if $target ~~ Specialized { given $current { .after = .afterlines.join("\n"); .afterlines = @(); spurt "spesh_diffs_before/{.cuid}.txt", "{.name} (before)\n{.before}"; spurt "spesh_diffs_after/{.cuid}.txt", "{.name} (after)\n{.after}"; unless $matcher { .before = ""; .after = ""; } } } $target = Facts; } } say "we've parsed $linecount lines"; say "we have the following cuids:"; my @results; my @interesting; for %speshes.values { next if not .after.defined; @results.push: $_.diff = qq:x"git diff --patience --color=always --no-index spesh_diffs_before/{.cuid}.txt spesh_diffs_after/{.cuid}.txt"; my $matched = $matcher && $_ ~~ $ssm; @interesting.push: $_.diff if $matched; printf "%30s %s (%s)\n", .cuid, ($matched ?? "*" !! " "), .name; } for @interesting || @results { .say } if $matcher and 1 < @interesting < @results { note "matcher selected {+@interesting} out of {+@results} cuids"; } if $matcher and 0 == @interesting { note "matcher matched no cuids" } } MoarVM-2015.11/tools/ucd2c.pl0000755000175000017500000016702712616160672014574 0ustar jnthnjnthnuse v5.14; use warnings; use strict; use Data::Dumper; use Carp qw(cluck); $Data::Dumper::Maxdepth = 1; # Make C versions of the Unicode tables. my $DEBUG = $ENV{UCD2CDEBUG} // 0; my @name_lines; open(LOG, ">extents") or die "can't create extents: $!" if $DEBUG; my $LOG; my $db_sections = {}; my $h_sections = {}; my $planes = []; my $points_by_hex = {}; my $points_by_code = {}; my $enumerated_properties = {}; my $binary_properties = {}; my $first_point = undef; my $last_point = undef; my $aliases = {}; my $prop_names = {}; my $named_sequences = {}; my $bitfield_table = []; my $prop_codes = {}; my $all_properties = {}; my $allocated_properties; my $extents; my $property_index = 0; my $estimated_total_bytes = 0; my $total_bytes_saved = 0; my $wrap_to_columns = 120; my $compress_codepoints = 1; my $gap_length_threshold = 1000; my $span_length_threshold = 100; my $skip_most_mode = 0; my $bitfield_cell_bitwidth = 32; my %is_subtype = ( Digit => { of => 'Numeric_Type', } ); my $gc_alias_checkers = []; sub progress($); sub main { $db_sections->{'AAA_header'} = header(); # Load all the things UnicodeData( derived_property('BidiClass', 'Bidi_Class', {}, 0), derived_property('GeneralCategory', 'General_Category', {}, 0), derived_property('CombiningClass', 'Canonical_Combining_Class', { Not_Reordered => 0 }, 1) ); goto skip_most if $skip_most_mode; binary_props('extracted/DerivedBinaryProperties'); enumerated_property('ArabicShaping', 'Joining_Type', {}, 0, 2); enumerated_property('ArabicShaping', 'Joining_Group', {}, 0, 3); enumerated_property('BidiMirroring', 'Bidi_Mirroring_Glyph', { '' => 0 }, 1, 1); enumerated_property('Blocks', 'Block', { No_Block => 0 }, 1, 1); enumerated_property('extracted/DerivedDecompositionType', 'Decomposition_Type', { None => 0 }, 1, 1); CaseFolding(); SpecialCasing(); enumerated_property('DerivedAge', 'Age', { Unassigned => 0 }, 1, 1); binary_props('DerivedCoreProperties'); DerivedNormalizationProps(); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value', { NaN => 0 }, 1, 1); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value_Numerator', { NaN => 0 }, 1, sub { my @fraction = split('/', (shift->[3])); return $fraction[0]; }); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value_Denominator', { NaN => 0 }, 1, sub { my @fraction = split('/', (shift->[3])); return $fraction[1] || '1'; }); enumerated_property('extracted/DerivedNumericType', 'Numeric_Type', { None => 0 }, 1, 1); enumerated_property('HangulSyllableType', 'Hangul_Syllable_Type', { Not_Applicable => 0 }, 1, 1); Jamo(); LineBreak(); NameAliases(); NamedSequences(); binary_props('PropList'); enumerated_property('Scripts', 'Script', { Unknown => 0 }, 1, 1); # XXX StandardizedVariants.txt # no clue what this is break_property('Grapheme', 'Grapheme_Cluster_Break'); break_property('Sentence', 'Sentence_Break'); skip_most: break_property('Word', 'Word_Break'); tweak_nfg_qc(); # Allocate all the things progress "done.\nallocating bitfield..."; my $allocated_properties = allocate_bitfield(); # Compute all the things progress "done.\ncomputing all properties..."; compute_properties($allocated_properties); # Make the things less progress "...done.\ncomputing collapsed properties table..."; compute_bitfield($first_point); # Emit all the things progress "...done.\nemitting unicode_db.c..."; emit_bitfield($first_point); $extents = emit_codepoints_and_planes($first_point); emit_case_changes($first_point); emit_codepoint_row_lookup($extents); emit_property_value_lookup($allocated_properties); emit_names_hash_builder(); emit_unicode_property_keypairs(); emit_unicode_property_value_keypairs(); emit_block_lookup(); emit_composition_lookup(); print "done!"; write_file('src/strings/unicode_db.c', join_sections($db_sections)); write_file('src/strings/unicode_gen.h', join_sections($h_sections)); print "\nEstimated bytes demand paged from disk: ". thousands($estimated_total_bytes). ".\nEstimated bytes saved by various compressions: ". thousands($total_bytes_saved).".\n"; if ($DEBUG) { $LOG =~ s/('fate_really' => )(\d+)/$1$name_lines[$2]/g; print LOG $LOG; close LOG; } } sub thousands { my $in = shift; $in = reverse "$in"; # stringify or copy the string $in =~ s/(\d\d\d)(?=\d)/$1,/g; reverse $in } sub stack_lines { # interleave @$lines with separator $sep, using a different # separator $break every $num lines or when $wrap columns is reached my ($lines, $sep, $break, $num, $wrap) = @_; my $i = 1; my $out = ""; my $first = 1; my $length = 0; my $sep_length = length($sep); for (@$lines) { my $line_length = length($_); if ($first) { $first = 0; $length = $line_length; } else { if ($num && ($i++ % $num) || $wrap && $length + $sep_length + $line_length <= $wrap) { $out .= $sep; $length += $sep_length + $line_length; } else { $out .= $break; $length = $line_length; } } $out .= $_; } $out } sub join_sections { my $sections = shift; my $content = ""; $content .= "\n".$sections->{$_} for (sort keys %{$sections}); $content } sub apply_to_range { # apply a function to a range of codepoints. The starting and # ending codepoint of the range need not exist; the function will # be applied to all/any in between. my $range = shift; chomp($range); my $fn = shift; my ($first, $last) = split '\\.\\.', $range; $first ||= $range; $last ||= $first; my $point = $points_by_hex->{$first}; if (!$point) { # go backwards to find the last one # (much faster than going forwards for some reason) my $code = hex($first) - 1; $code-- until ($point = $points_by_code->{$code}); $point = $point->{next_point}; } my $last_point; do { $fn->($point); $last_point = $point; $point = $point->{next_point}; } while ($point && $point->{code} <= hex $last); #die "couldn't find code ".sprintf('%x', $last_point->{code} + 1). # " got ".$point->{code_str}." for range $first..$last" # unless $last_point->{code} == hex $last; # can't die there because some ranges end on points that don't exist (Blocks) } sub progress($) { my $txt = shift; local $| = 1; print $txt; } sub binary_props { # process a file, extracting binary properties and applying them to ranges my $fname = shift; # filename each_line($fname, sub { $_ = shift; my ($range, $pname) = split /\s*[;#]\s*/; # range, property name register_binary_property($pname); # define the property apply_to_range($range, sub { my $point = shift; $point->{$pname} = 1; # set the property }); }); } sub break_property { my ($fname, $pname) = @_; enumerated_property("auxiliary/${fname}BreakProperty", $pname, { Other => 0 }, 1, 1); } sub derived_property { # filename, property name, property object, starting counter my ($fname, $pname, $base, $j) = @_; # wrap the provided object as the enum key in a new one $base = { enum => $base }; each_line("extracted/Derived$fname", sub { $_ = shift; my ($range, $class) = split /\s*[;#]\s*/; unless (exists $base->{enum}->{$class}) { # haven't seen this property's value before # add it, and give it an index. print "\n adding derived property for $pname: $j $class" if $DEBUG; $base->{enum}->{$class} = $j++; } }); my @keys = (); # stash the keys in an array so they can be put in a table later for my $key (keys %{$base->{enum}}) { $keys[$base->{enum}->{$key}] = $key; } $base->{keys} = \@keys; $base->{bit_width} = least_int_ge_lg2($j); register_enumerated_property($pname, $base); } sub enumerated_property { my ($fname, $pname, $base, $j, $value_index) = @_; $base = { enum => $base }; each_line($fname, sub { $_ = shift; my @vals = split /\s*[#;]\s*/; my $range = $vals[0]; my $value = ref $value_index ? $value_index->(\@vals) : $vals[$value_index]; my $index = $base->{enum}->{$value}; # haven't seen this property value before # add it, and give it an index. print("\n adding enum property for $pname: $j $value") if $DEBUG and not defined $index; ($base->{enum}->{$value} = $index = $j++) unless defined $index; apply_to_range($range, sub { my $point = shift; $point->{$pname} = $index; # set the property's value index }); }); $base->{bit_width} = least_int_ge_lg2($j); print "\n bitwidth: ",$base->{bit_width},"\n" if $DEBUG; my @keys = (); # stash the keys in an array so they can be put in a table later for my $key (keys %{$base->{enum}}) { if ($is_subtype{$key}) { register_enumerated_property($key, {%$base}); delete $base->{enum}->{$key}; } else { $keys[$base->{enum}->{$key}] = $key; } } print "\n keys = @keys" if $DEBUG; $base->{keys} = \@keys; register_enumerated_property($pname, $base); } sub least_int_ge_lg2 { int(log(shift)/log(2) - 0.00001) + 1; } sub each_line { my ($fname, $fn, $force) = @_; progress "done.\nprocessing $fname.txt..."; map { chomp; $fn->($_) unless !$force && /^(?:#|\s*$)/; } @{read_file("UNIDATA/$fname.txt")}; } sub allocate_bitfield { my @biggest = map { $enumerated_properties->{$_} } sort { $enumerated_properties->{$b}->{bit_width} <=> $enumerated_properties->{$a}->{bit_width} } keys %$enumerated_properties; for (sort keys %$binary_properties) { push @biggest, $binary_properties->{$_}; } my $word_offset = 0; my $bit_offset = 0; my $allocated = []; my $index = 1; while (scalar @biggest) { my $i = -1; for(;;) { my $prop = $biggest[++$i]; if (!$prop) { while (scalar @biggest) { # ones bigger than 1 byte :(. Don't prefer these. $prop = shift @biggest; $prop->{word_offset} = $word_offset; $prop->{bit_offset} = $bit_offset; $bit_offset += $prop->{bit_width}; while ($bit_offset >= $bitfield_cell_bitwidth) { $word_offset++; $bit_offset -= $bitfield_cell_bitwidth; } push @$allocated, $prop; $prop->{field_index} = $index++; } last; } if ($is_subtype{$prop->{name}}) { $prop->{word_offset} = $enumerated_properties->{ $is_subtype{$prop->{name}}{of} }{word_offset}; $prop->{bit_offset} = $enumerated_properties->{ $is_subtype{$prop->{name}}{of} }{bit_offset}; push @$allocated, $prop; splice(@biggest, $i, 1); $prop->{field_index} = $index++; last; } elsif ($bit_offset + $prop->{bit_width} <= $bitfield_cell_bitwidth) { $prop->{word_offset} = $word_offset; $prop->{bit_offset} = $bit_offset; $bit_offset += $prop->{bit_width}; if ($bit_offset == $bitfield_cell_bitwidth) { $word_offset++; $bit_offset = 0; } push @$allocated, $prop; splice(@biggest, $i, 1); $prop->{field_index} = $index++; last; } } } $first_point->{bitfield_width} = $word_offset+1; $h_sections->{num_property_codes} = "#define MVM_NUM_PROPERTY_CODES $index\n"; $allocated } sub compute_properties { local $| = 1; my $fields = shift; for my $field (@$fields) { my $bit_offset = $field->{bit_offset}; my $bit_width = $field->{bit_width}; my $point = $first_point; print "\n $field->{name} bit width:$bit_width"; my $i = 0; my $bit = 0; my $mask = 0; while ($bit < $bitfield_cell_bitwidth) { $mask |= 2 ** $bit++; } while (defined $point) { if (defined $point->{$field->{name}}) { my $word_offset = $field->{word_offset}; # $x is one less than the number of words required to hold the field my $x = int(($bit_width - 1) / $bitfield_cell_bitwidth); # move us over to the last word $word_offset += $x; # loop until we fill all the words, starting with the most # significant byte portion. while ($x + 1) { $point->{bytes}->[ $word_offset - $x ] |= ( ( ($point->{$field->{name}} << ($bitfield_cell_bitwidth - $bit_offset - $bit_width) ) #>> ($bitfield_cell_bitwidth * $x) ) & $mask ); $x--; } } $point = $point->{next_point}; } } } sub emit_binary_search_algorithm { # $extents is arrayref to the heads of the gaps, spans, and # normal stretches of codepoints. $first and $last are the # indexes into $extents we're supposed to subdivide. # protocol: start output with a newline; don't end with a newline or indent my ($extents, $first, $mid, $last, $indent) = @_; my $out = ""; #${indent} /* got $first $mid $last */\n"; return $out.emit_extent_fate($extents->[$first], $indent) if $first == $last; $mid = $last if $first == $mid; my $new_mid_high = int(($last + $mid) / 2); my $new_mid_low = int(($mid - 1 + $first) / 2); my $high = emit_binary_search_algorithm($extents, $mid, $new_mid_high, $last, " $indent"); my $low = emit_binary_search_algorithm($extents, $first, $new_mid_low, $mid - 1, " $indent"); return $out." ${indent}if (codepoint >= 0x".uc(sprintf("%x", $extents->[$mid]->{code})).") {". " /* ".($extents->[$mid]->{name} || 'NULL')." */$high ${indent}} ${indent}else {$low ${indent}}"; } my $FATE_NORMAL = 0; my $FATE_NULL = 1; my $FATE_SPAN = 2; sub emit_extent_fate { my ($fate, $indent) = @_; my $type = $fate->{fate_type}; return "\n${indent}return -1;" if $type == $FATE_NULL; return "\n${indent}return " . ($fate->{code} - $fate->{fate_offset}) . "; /* ". "$bitfield_table->[$fate->{bitfield_index}]->{code_str}". " $bitfield_table->[$fate->{bitfield_index}]->{name} */" if $type == $FATE_SPAN; return "\n${indent}return codepoint - $fate->{fate_offset};" .($fate->{fate_offset} == 0 ? " /* the fast path */ " : ""); } sub add_extent($$) { my ($extents, $extent) = @_; if ($DEBUG) { $LOG .= "\n" . join '', grep /code|fate|name|bitfield/, sort split /^/m, "EXTENT " . Dumper($extent); } push @$extents, $extent; } sub emit_codepoints_and_planes { my @bitfield_index_lines; my $index = 0; my $bytes = 0; my $bytes_saved = 0; my $code_offset = 0; my $extents = []; my $last_code = -1; # trick my $last_point = undef; $first_point->{fate_type} = $FATE_NORMAL; $first_point->{fate_offset} = $code_offset; add_extent $extents, $first_point; my $span_length = 0; # a bunch of spaghetti code. Yes. for my $plane (@$planes) { my $toadd = undef; for my $point (@{$plane->{points}}) { # extremely simplistic compression of identical neighbors and gaps # this point is identical to the previous point if ($compress_codepoints && $last_point && $last_code == $point->{code} - 1 && $point->{name} eq $last_point->{name} && $last_point->{bitfield_index} == $point->{bitfield_index}) { # create a or extend the current span ++$last_code; if ($span_length) { ++$span_length; } else { $span_length = 2; } next; } # the span ended, either bridge it or skip it if ($span_length) { if ($span_length >= $span_length_threshold) { $bytes_saved += 10 * ($span_length - 1); if (!exists($last_point->{fate_type})) { add_extent $extents, $last_point; } $last_point->{fate_type} = $FATE_SPAN; $code_offset = $last_point->{code} - @name_lines + 1; $last_point->{fate_offset} = $code_offset; $last_point->{fate_really} = $last_point->{code} - $code_offset; $code_offset += $span_length - 1; $toadd = $point; $span_length = 0; } my $usually = 1; # occasionally change NULL to the name to cut name search time while ($span_length > 1) { # catch up to last code $last_point = $last_point->{next_point}; push @bitfield_index_lines, "/*$index*/$last_point->{bitfield_index}/*". "$last_point->{code_str} */"; push @name_lines, "/*$index*/". ($last_point->{name} =~ /^{name}\""). "/* $last_point->{code_str} */"; $code_offset = $last_point->{code} - @name_lines; $last_point->{fate_offset} = $code_offset; $last_point->{fate_really} = $last_point->{code} - $code_offset; $index++; $bytes += 10 + ($last_point->{name} =~ /^{name}) + 1); $span_length--; } $span_length = 0; } if ($compress_codepoints && $last_code < $point->{code} - ($point->{code} % 0x10000 ? $gap_length_threshold : 1)) { $bytes_saved += 10 * ($point->{code} - $last_code - 1); add_extent $extents, { fate_type => $FATE_NULL, code => $last_code + 1 }; $code_offset += ($point->{code} - $last_code - 1); $last_code = $point->{code} - 1; $toadd = $point; } while ($last_code < $point->{code} - 1) { push @bitfield_index_lines, "0"; push @name_lines, "NULL"; $last_code++; $index++; $bytes += 10; } die "$last_code ".Dumper($point) unless $last_code == $point->{code} - 1; if ($toadd && !exists($point->{fate_type})) { $point->{fate_type} = $FATE_NORMAL; $point->{fate_offset} = $code_offset; $point->{fate_really} = $point->{code} - $code_offset; add_extent $extents, $point; } $toadd = undef; # a normal codepoint that we don't want to compress push @bitfield_index_lines, "/*$index*/$point->{bitfield_index}/* $point->{code_str} */"; $bytes += 2; # hopefully these are compacted since they are trivially aligned being two bytes push @name_lines, "/*$index*/\"$point->{name}\"/* $point->{code_str} */"; $bytes += length($point->{name}) + 9; # 8 for the pointer, 1 for the NUL $last_code = $point->{code}; $point->{main_index} = $index++; $last_point = $point; } } print "\nSaved ".thousands($bytes_saved)." bytes by compressing big gaps into a binary search lookup.\n"; $total_bytes_saved += $bytes_saved; $estimated_total_bytes += $bytes; # jnthn: Would it still use the same amount of memory to combine these tables? XXX $db_sections->{BBB_codepoint_names} = "static const char *codepoint_names[$index] = {\n ". stack_lines(\@name_lines, ",", ",\n ", 0, $wrap_to_columns). "\n};"; $db_sections->{BBB_codepoint_bitfield_indexes} = "static const MVMuint16 codepoint_bitfield_indexes[$index] = {\n ". stack_lines(\@bitfield_index_lines, ",", ",\n ", 0, $wrap_to_columns). "\n};"; $h_sections->{codepoint_names_count} = "#define MVM_CODEPOINT_NAMES_COUNT $index"; $extents } sub emit_codepoint_row_lookup { my $extents = shift; my $SMP_start; my $i = 0; for (@$extents) { # handle the first recursion specially to optimize for most common BMP lookups if ($_->{code} >= 0x10000) { $SMP_start = $i; last; } $i++; } my $out = "static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint32 codepoint) {\n MVMint32 plane = codepoint >> 16; if (codepoint < 0) { MVM_exception_throw_adhoc(tc, \"should eventually be unreachable\"); } if (plane == 0) {" .emit_binary_search_algorithm($extents, 0, 1, $SMP_start - 1, " ")." } else { if (plane < 0 || plane > 16 || codepoint > 0x10FFFD) { return -1; } else {".emit_binary_search_algorithm($extents, $SMP_start, int(($SMP_start + scalar(@$extents)-1)/2), scalar(@$extents) - 1, " ")." } } }"; $db_sections->{codepoint_row_lookup} = $out; } sub emit_case_changes { my $point = shift; my @lines = (); my $out = ''; my $rows = 1; while ($point) { unless ($point->{Case_Change_Index}) { $point = $point->{next_point}; next; } push @lines, "/*$rows*/{0x".($point->{suc}||0).",0x".($point->{slc}||0).",0x".($point->{stc}||0)."}/* $point->{code_str} */"; $point = $point->{next_point}; $rows++; } $out = "static const MVMint32 case_changes[$rows][3] = {\n {0x0,0x0,0x0},\n ". stack_lines(\@lines, ",", ",\n ", 0, $wrap_to_columns)."\n};"; $db_sections->{BBB_case_changes} = $out; } sub emit_bitfield { my $point = shift; my $wide = $point->{bitfield_width}; my @lines = (); my $out = ''; my $rows = 1; my $line = "{"; my $first = 1; my $i = 0; for (; $i < $wide; ++$i) { $line .= "," unless $first; $first = 0; $line .= 0; } push @lines, "$line}"; while ($point) { $line = "/*$rows*/{"; $first = 1; for ($i = 0; $i < $wide; ++$i) { $_ = $point->{bytes}->[$i]; $line .= "," unless $first; $first = 0; $line .= (defined $_ ? $_."u" : 0); } push @$bitfield_table, $point; push @lines, ($line . "}/* $point->{code_str} */"); $point = $point->{next_emit_point}; $rows++; } my $bytes_wide = 2; $bytes_wide *= 2 while $bytes_wide < $wide; # assume the worst $estimated_total_bytes += $rows * $bytes_wide; # we hope it's all laid out with no gaps... my $val_type = $bitfield_cell_bitwidth == 8 ? 'MVMuint8' : $bitfield_cell_bitwidth == 16 ? 'MVMuint16' : $bitfield_cell_bitwidth == 32 ? 'MVMuint32' : $bitfield_cell_bitwidth == 64 ? 'MVMuint64' : die 'wut.'; $out = "static const $val_type props_bitfield[$rows][$wide] = {\n ". stack_lines(\@lines, ",", ",\n ", 0, $wrap_to_columns)."\n};"; $db_sections->{BBB_main_bitfield} = $out; } sub emit_property_value_lookup { my $allocated = shift; my $enumtables = "\n\n"; my $hout = "typedef enum {\n"; my $out = " static MVMint32 MVM_unicode_get_property_int(MVMThreadContext *tc, MVMint32 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; if (codepoint_row == -1) /* non-existent codepoint; XXX should throw? */ return 0; bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return 0;"; my $eout = " static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint32 codepoint); static const char *bogus = \"\"; /* only for table too short; return null string for no mapping */ static const char* MVM_unicode_get_property_str(MVMThreadContext *tc, MVMint32 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; if (codepoint_row == -1) /* non-existent codepoint; XXX should throw? */ return \"\"; bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return \"\";"; for my $prop (@$allocated) { my $enum = exists $prop->{keys}; my $esize = 0; if ($enum) { $enum = $prop->{name} . "_enums"; $esize = scalar @{$prop->{keys}}; $enumtables .= "static char *$enum\[$esize] = {"; $enumtables .= "\n \"$_\"," for @{$prop->{keys}}; $enumtables .= "\n};\n\n"; } $hout .= " ".uc("MVM_unicode_property_$prop->{name}")." = $prop->{field_index},\n"; $prop_names->{$prop->{name}} = $prop->{field_index}; $out .= " case ".uc("MVM_unicode_property_$prop->{name}").":"; $eout .= " case ".uc("MVM_unicode_property_$prop->{name}").":" if $enum; my $bit_width = $prop->{bit_width}; my $bit_offset = $prop->{bit_offset} // 0; my $word_offset = $prop->{word_offset} // 0; $out .= " /* $prop->{name} bits:$bit_width offset:$bit_offset */"; $eout .= " /* $prop->{name} bits:$bit_width offset:$bit_offset */" if $enum; my $one_word_only = $bit_offset + $bit_width <= $bitfield_cell_bitwidth ? 1 : 0; while ($bit_width > 0) { my $original_bit_offset = $bit_offset; my $binary_mask = 0; my $binary_string = ""; my $pos = 0; while ($bit_offset--) { $binary_string .= "0"; $pos++; } while ($pos < $bitfield_cell_bitwidth && $bit_width--) { $binary_string .= "1"; $binary_mask += 2 ** ($bitfield_cell_bitwidth - 1 - $pos++); } my $shift = $bitfield_cell_bitwidth - $pos; while ($pos++ < $bitfield_cell_bitwidth) { $binary_string .= "0"; } $out .= " ".($one_word_only ? 'return' : 'result_val |=')." ((props_bitfield[bitfield_row][$word_offset] & 0x". sprintf("%x",$binary_mask).") >> $shift); /* mask: $binary_string */"; $eout .= " result_val |= ((props_bitfield[bitfield_row][$word_offset] & 0x". sprintf("%x",$binary_mask).") >> $shift); /* mask: $binary_string */" if $enum; $word_offset++; $bit_offset = 0; } $out .= " "; $eout .= " " if $enum; $out .= "return result_val;" unless $one_word_only; $eout .= "return result_val < $esize ? $enum\[result_val] : bogus;" if $enum; } $out .= " default: return 0; } } "; $eout .= " default: return \"\"; } } "; # or should we try to stringify numeric value? $hout .= "} MVM_unicode_property_codes;"; $db_sections->{MVM_unicode_get_property_int} = $enumtables . $eout . $out; $h_sections->{property_code_definitions} = $hout; } sub emit_block_lookup { my $hout = "MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name);\n"; my $out = "struct UnicodeBlock { MVMGrapheme32 start; MVMGrapheme32 end; char *name; size_t name_len; char *alias; size_t alias_len; }; static struct UnicodeBlock unicode_blocks[] = { "; my @blocks; each_line('Blocks', sub { $_ = shift; my ($from, $to, $block_name) = /^(\w+)..(\w+); (.+)/; if ($from && $to && $block_name) { $block_name =~ s/[_\s-]//g; my $alias_name = lc($block_name); my $block_len = length $block_name; my $alias_len = length $alias_name; if ($block_len && $alias_len) { push @blocks, " { 0x$from, 0x$to, \"$block_name\", $block_len, \"$alias_name\", $alias_len }"; } } }); $out .= join(",\n", @blocks) . "\n"; $out .= "}; static int block_compare(const void *a, const void *b) { MVMGrapheme32 ord = *((MVMGrapheme32 *) a); struct UnicodeBlock *block = (struct UnicodeBlock *) b; if (ord < block->start) { return -1; } else if (ord > block->end) { return 1; } else { return 0; } } MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name) { MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, str, pos); MVMuint64 size; char *bname = MVM_string_ascii_encode(tc, block_name, &size); MVMint32 in_block = 0; struct UnicodeBlock *block = bsearch(&ord, unicode_blocks, sizeof(unicode_blocks) / sizeof(struct UnicodeBlock), sizeof(struct UnicodeBlock), block_compare); if (block) { in_block = strncmp(block->name, bname, block->name_len) == 0 || strncmp(block->alias, bname, block->alias_len) == 0; } MVM_free(bname); return in_block; }"; $db_sections->{block_lookup} = $out; $h_sections->{block_lookup} = $hout; } sub emit_names_hash_builder { my $num_extents = scalar(@$extents); my $out = " static const MVMint32 codepoint_extents[".($num_extents + 1)."][3] = {\n"; $estimated_total_bytes += 4 * 2 * ($num_extents + 1); for my $extent (@$extents) { $out .= sprintf(" {0x%04x,%d,%d},\n", $extent->{code}, $extent->{fate_type}, ($extent->{fate_really}//0)); } $h_sections->{MVM_NUM_UNICODE_EXTENTS} = "#define MVM_NUM_UNICODE_EXTENTS $num_extents\n"; $out .= <<"END"; {0x10FFFE,0} }; /* Lazily constructed hashtable of Unicode names to codepoints. Okay not to be threadsafe since its value is deterministic and I don't care about the tiny potential for a memory leak in the event of a race condition. */ static MVMUnicodeNameRegistry *codepoints_by_name = NULL; static void generate_codepoints_by_name(MVMThreadContext *tc) { MVMint32 extent_index = 0; MVMint32 codepoint = 0; MVMint32 codepoint_table_index = 0; MVMUnicodeNameRegistry *entry; for (; extent_index < MVM_NUM_UNICODE_EXTENTS; extent_index++) { MVMint32 length; codepoint = codepoint_extents[extent_index][0]; length = codepoint_extents[extent_index + 1][0] - codepoint_extents[extent_index][0]; if (codepoint_table_index >= MVM_CODEPOINT_NAMES_COUNT) continue; switch (codepoint_extents[extent_index][1]) { case $FATE_NORMAL: { MVMint32 extent_span_index = 0; codepoint_table_index = codepoint_extents[extent_index][2]; for (; extent_span_index < length && codepoint_table_index < MVM_CODEPOINT_NAMES_COUNT; extent_span_index++) { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint++; codepoint_table_index++; } break; } case $FATE_NULL: codepoint += length; break; case $FATE_SPAN: { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint += length; codepoint_table_index++; break; } } } entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "LF"; entry->codepoint = 10; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "LF", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "FF"; entry->codepoint = 12; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "FF", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "CR"; entry->codepoint = 13; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "CR", 2, entry); entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = "NEL"; entry->codepoint = 133; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, "NEL", 3, entry); } END $db_sections->{names_hash_builder} = $out; }#" sub emit_unicode_property_keypairs { my $hout = " struct MVMUnicodeNamedValue { const char *name; MVMint32 value; };"; my @lines = (); each_line('PropertyAliases', sub { $_ = shift; my @aliases = split /\s*[#;]\s*/; for my $name (@aliases) { if (exists $prop_names->{$name}) { for (@aliases) { $prop_names->{$_} = $prop_names->{$name} unless $_ eq $name; $prop_codes->{$_} = $name; } last; } } }); my %aliases; my %lines; each_line('PropertyValueAliases', sub { $_ = shift; if (/^# (\w+) \((\w+)\)/) { $aliases{$2} = [$1]; return } return if /^(?:#|\s*$)/; my @parts = split /\s*[#;]\s*/; my $propname = shift @parts; if (exists $prop_names->{$propname}) { if (($parts[0] eq 'Y' || $parts[0] eq 'N') && ($parts[1] eq 'Yes' || $parts[1] eq 'No')) { my $prop_val = $prop_names->{$propname}; for ($propname, @{$aliases{$propname} // []}) { $lines{$propname}->{$_} = "{\"$_\",$prop_val}"; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if s/_//g; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if y/A-Z/a-z/; } return } if ($parts[-1] =~ /\|/) { # it's a union pop @parts; my $unionname = $parts[0]; if (exists $binary_properties->{$unionname}) { my $prop_val = $binary_properties->{$unionname}->{field_index}; for (@parts) { $lines{$propname}->{$_} = "{\"$_\",$prop_val}"; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if s/_//g; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if y/A-Z/a-z/; } } } elsif (exists $prop_names->{$propname}) { for (@parts) { push @{ $aliases{$propname} }, $_ } } } }, 1); my %done; for my $propname (qw(gc sc), keys %lines) { for (keys %{$lines{$propname}}) { $done{"$propname$_"} ||= push @lines, $lines{$propname}->{$_}; } } for my $key (qw(gc sc), keys %$prop_names) { $_ = $key; $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}"; $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}" if s/_//g; $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}" if y/A-Z/a-z/; for (@{ $aliases{$key} }) { $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}"; $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}" if s/_//g; $done{"$key$_"} ||= push @lines, "{\"$_\",$prop_names->{$key}}" if y/A-Z/a-z/; } } $hout .= " #define num_unicode_property_keypairs ".scalar(@lines)."\n"; my $out = " static const MVMUnicodeNamedValue unicode_property_keypairs[".scalar(@lines)."] = { ".stack_lines(\@lines, ",", ",\n ", 0, $wrap_to_columns)." };"; $db_sections->{BBB_unicode_property_keypairs} = $out; $h_sections->{MVMUnicodeNamedValue} = $hout; } sub emit_unicode_property_value_keypairs { my $hout = ""; my @lines = (); my $property; for (keys %$enumerated_properties) { my $enum = $enumerated_properties->{$_}->{enum}; my $toadd = {}; for (keys %$enum) { my $key = lc("$_"); $key =~ s/[_\-\s]/./g; $toadd->{$key} = $enum->{$_}; } for (keys %$toadd) { $enum->{$_} = $toadd->{$_}; } } my %lines; my %aliases; for (keys %$binary_properties) { my $prop_val = ($prop_names->{$_} << 24) + 1; $lines{_custom_}->{$_} = "{\"$_\",$prop_val}"; $lines{_custom_}->{$_} = "{\"$_\",$prop_val}" if s/_//g; $lines{_custom_}->{$_} = "{\"$_\",$prop_val}" if y/A-Z/a-z/; } each_line('PropertyValueAliases', sub { $_ = shift; if (/^# (\w+) \((\w+)\)/) { $aliases{$2} = $1; return } return if /^(?:#|\s*$)/; my @parts = split /\s*[#;]\s*/; my $propname = shift @parts; if (exists $prop_names->{$propname}) { my $prop_val = $prop_names->{$propname} << 24; # emit binary properties if (($parts[0] eq 'Y' || $parts[0] eq 'N') && ($parts[1] eq 'Yes' || $parts[1] eq 'No')) { $prop_val++; # one bit width for ($propname, ($aliases{$propname} // ())) { $lines{$propname}->{$_} = "{\"$_\",$prop_val}"; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if s/_//g; $lines{$propname}->{$_} = "{\"$_\",$prop_val}" if y/A-Z/a-z/; } return } if ($parts[-1] =~ /\|/) { # it's a union pop @parts; my $unionname = $parts[0]; if (exists $binary_properties->{$unionname}) { my $prop_val = $binary_properties->{$unionname}->{field_index} << 24; my $value = $binary_properties->{$unionname}->{bit_width}; for (@parts) { $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}"; $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}" if s/_//g; $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}" if y/A-Z/a-z/; } die Dumper($propname) if /^letter$/ } return } my $key = $prop_codes->{$propname}; my $found = 0; my $enum = $all_properties->{$key}->{'enum'}; die $propname unless $enum; my $value; for (@parts) { my $alias = $_; $alias =~ s/[_\-\s]/./g; $alias = lc($alias); if (exists $enum->{$alias}) { $value = $enum->{$alias}; last; } } #die Dumper($enum) unless defined $value; unless (defined $value) { #print "warning: couldn't resolve property $propname property value alias $first\n"; return; } for (@parts) { s/[\-\s]/./g; next if /[\.\|]/; $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}"; $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}" if s/_//g; $lines{$propname}->{$_} = "{\"$_\",".($prop_val + $value)."}" if y/A-Z/a-z/; } } }, 1); my %done; # Aliases like L appear in several categories, but we prefere gc and sc. for my $propname (qw(gc sc), keys %lines) { for (keys %{$lines{$propname}}) { $done{"$propname$_"} ||= push @lines, $lines{$propname}->{$_}; } } $hout .= " #define num_unicode_property_value_keypairs ".scalar(@lines)."\n"; my $out = " static MVMUnicodeNameRegistry **unicode_property_values_hashes; static const MVMUnicodeNamedValue unicode_property_value_keypairs[".scalar(@lines)."] = { ".stack_lines(\@lines, ",", ",\n ", 0, $wrap_to_columns)." };"; $db_sections->{BBB_unicode_property_value_keypairs} = $out; $h_sections->{num_unicode_property_value_keypairs} = $hout; } sub emit_composition_lookup { # Build 3-level sparse array [plane][upper][lower] keyed on bits from the # first codepoint of the decomposition of a primary composite, mapped to # an array of [second codepoint, primary composite]. my @lookup; for my $point_hex (keys %$points_by_hex) { # Not interested in anything in the set of full composition exclusions. my $point = $points_by_hex->{$point_hex}; next if $point->{Full_Composition_Exclusion}; # Only interested in things that have a decomposition spec. next unless defined $point->{Decomp_Spec}; my $decomp_spec = $enumerated_properties->{Decomp_Spec}->{keys}->[$point->{Decomp_Spec}]; # Only interested in canonical decompositions. my $decomp_type = $enumerated_properties->{Decomposition_Type}->{keys}->[$point->{Decomposition_Type}]; next unless $decomp_type eq 'Canonical'; # Make an entry. my @decomp = split /\s+/, $decomp_spec; die "Canonical decomposition only supports two codepoints" unless @decomp == 2; my $plane = 0; if (length($decomp[0]) == 5) { $plane = hex(substr($decomp[0], 0, 1)); $decomp[0] = substr($decomp[0], 1); } elsif (length($decomp[0]) != 4) { die "Invalid codepoint " . $decomp[0] } my ($upper, $lower) = (hex(substr($decomp[0], 0, 2)), hex(substr($decomp[0], 2, 2))); push @{$lookup[$plane]->[$upper]->[$lower]}, hex($decomp[1]), hex($point_hex); } # Produce sparse lookup tables. my $entry_idx = 0; my $l_table_idx = 0; my $u_table_idx = 0; my $entries = ''; my $l_tables = 'static const MVMint32 *comp_l_empty[] = {' . ('NULL,' x 256) . "};\n"; my $u_tables = 'static const MVMint32 **comp_u_empty[] = {' . ('NULL,' x 256) . "};\n"; my $p_table = 'static const MVMint32 ***comp_p[] = {'; for (my $p = 0; $p < 17; $p++) { unless ($lookup[$p]) { $p_table .= 'comp_u_empty,'; next; } my $u_table_name = 'comp_u_' . $u_table_idx++; $u_tables .= 'static const MVMint32 **' . $u_table_name . '[] = {'; for (my $u = 0; $u < 256; $u++) { unless ($lookup[$p]->[$u]) { $u_tables .= 'comp_l_empty,'; next; } my $l_table_name = 'comp_l_' . $l_table_idx++; $l_tables .= 'static const MVMint32 *' . $l_table_name . '[] = {'; for (my $l = 0; $l < 256; $l++) { if ($lookup[$p]->[$u]->[$l]) { my @values = @{$lookup[$p]->[$u]->[$l]}; my $entry_name = 'comp_entry_' . $entry_idx++; $entries .= 'static const MVMint32 ' . $entry_name . '[] = {'; $entries .= join(',', scalar(@values), @values) . "};\n"; $l_tables .= $entry_name . ','; } else { $l_tables .= 'NULL,'; } } $l_tables .= "};\n"; $u_tables .= $l_table_name . ','; } $u_tables .= "};\n"; $p_table .= $u_table_name . ','; } $p_table .= "};\n"; # Put it all together and emit. my $tables = "$entries\n$l_tables\n$u_tables\n$p_table"; $db_sections->{composition_lookup} = "\n/* Canonical composition lookup tables. */\n$tables"; } sub compute_bitfield { my $point = shift; my $index = 1; my $prophash = {}; my $last_point = undef; my $bytes_saved = 0; while ($point) { my $line = ''; $line .= '.'.(defined $_ ? $_ : 0) for @{$point->{bytes}}; my $refer; if (defined($refer = $prophash->{$line})) { $bytes_saved += 20; $point->{bitfield_index} = $refer->{bitfield_index}; } else { $point->{bitfield_index} = $index++; $prophash->{$line} = $point; $last_point->{next_emit_point} = $point if $last_point; $last_point = $point; } $point = $point->{next_point}; } $total_bytes_saved += $bytes_saved; print "\nSaved ".thousands($bytes_saved)." bytes by uniquing the bitfield table.\n"; } sub header { '/* DO NOT MODIFY THIS FILE! YOU WILL LOSE YOUR CHANGES! This file is generated by ucd2c.pl from the Unicode database. from http://unicode.org/copyright.html#Exhibit1 on 2012-07-20: COPYRIGHT AND PERMISSION NOTICE Copyright ?1991-2012 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. */ #include "moar.h" '} sub read_file { my $fname = shift; open FILE, $fname or die "Couldn't open file '$fname': $!"; my @lines = (); while( ) { push @lines, $_; } close FILE; \@lines; } sub write_file { my ($fname, $contents) = @_; open FILE, ">$fname" or die "Couldn't open file '$fname': $!"; print FILE $contents; close FILE; } sub register_union { my ($unionname, $unionof) = @_; register_binary_property($unionname); push @$gc_alias_checkers, eval 'sub { return ((shift) =~ /^(?:'.$unionof.')$/) ? "'.$unionname.'" : 0; }'; } sub UnicodeData { my ($bidi_classes, $general_categories, $ccclasses) = @_; my $plane = { number => 0, points => [] }; register_binary_property('Any'); each_line('PropertyValueAliases', sub { $_ = shift; my @parts = split /\s*[#;]\s*/; my $propname = shift @parts; return if ($parts[0] eq 'Y' || $parts[0] eq 'N') && ($parts[1] eq 'Yes' || $parts[1] eq 'No'); if ($parts[-1] =~ /\|/) { # it's a union my $unionname = $parts[0]; my $unionof = pop @parts; $unionof =~ s/\s+//g; register_union($unionname, $unionof); } }); register_union('Assigned', 'C[cfos]|L[lmotu]|M[cen]|N[dlo]|P[cdefios]|S[ckmo]|Z[lps]'); push @$planes, $plane; my $ideograph_start; my $case_count = 1; my $decomp_keys = [ '' ]; my $decomp_index = 1; my $s = sub { $_ = shift; my ($code_str, $name, $gencat, $ccclass, $bidiclass, $decmpspec, $num1, $num2, $num3, $bidimirrored, $u1name, $isocomment, $suc, $slc, $stc) = split ';'; my $code = hex $code_str; my $plane_num = $code >> 16; if ($name eq '' || $name eq '') { $name = $u1name; } my $point = { code_str => $code_str, name => $name, gencat_name => $gencat, General_Category => $general_categories->{enum}->{$gencat}, Canonical_Combining_Class => $ccclasses->{enum}->{$ccclass}, Bidi_Class => $bidi_classes->{enum}->{$bidiclass}, suc => $suc, slc => $slc, stc => $stc, NFD_QC => 1, # these are defaults (inverted) NFC_QC => 1, # which will be unset as appropriate NFKD_QC => 1, NFKC_QC => 1, NFG_QC => 1, code => $code, Any => 1 }; $point->{Bidi_Mirrored} = 1 if $bidimirrored eq 'Y'; if ($decmpspec) { $decmpspec =~ s/<\w+>\s+//; $point->{Decomp_Spec} = $decomp_index; $decomp_keys->[$decomp_index++] = $decmpspec; } if ($suc || $slc || $stc) { $point->{Case_Change_Index} = $case_count++; } while ($plane->{number} < $plane_num) { push(@$planes, ($plane = { number => $plane->{number} + 1, points => [] })); } for my $checker (@$gc_alias_checkers) { my $res = $checker->($gencat); $point->{$res} = 1 if $res; } if ($name =~ /(Ideograph|Syllable|Private|Surrogate)(\s|.)*?First/) { $ideograph_start = $point; $point->{name} =~ s/, First//; } elsif ($ideograph_start) { $point->{name} = $ideograph_start->{name}; my $current = $ideograph_start; while ($current->{code} < $point->{code} - 1) { my $new = { Any => 1 }; for (keys %$current) { $new->{$_} = $current->{$_}; } $new->{code}++; $code_str = uc(sprintf '%04x', $new->{code}); $new->{code_str} = $code_str; push @{$plane->{points}}, $new; $points_by_hex->{$new->{code_str}} = $points_by_code->{$new->{code}} = $current = $current->{next_point} = $new; } $last_point = $current; $ideograph_start = 0; } push @{$plane->{points}}, $point; $points_by_hex->{$code_str} = $points_by_code->{$code} = $point; if ($last_point) { $last_point = $last_point->{next_point} = $point; } else { $last_point = $first_point = $point; } }; each_line('UnicodeData', $s); $s->("110000;Out of Range;Cn;0;L;;;;;N;;;;;"); register_enumerated_property('Case_Change_Index', { bit_width => least_int_ge_lg2($case_count) }); register_enumerated_property('Decomp_Spec', { 'keys' => $decomp_keys, bit_width => least_int_ge_lg2($decomp_index) }); } sub CaseFolding { my $simple_count = 1; my $grows_count = 1; my @simple; my @grows; each_line('CaseFolding', sub { $_ = shift; my ($left, $type, $right) = split /\s*;\s*/; return if $type eq 'S' || $type eq 'T'; if ($type eq 'C') { push @simple, $right; $points_by_hex->{$left}->{Case_Folding} = $simple_count; $simple_count++; $points_by_hex->{$left}->{Case_Folding_simple} = 1; } else { my @parts = split ' ', $right; push @grows, "{0x".($parts[0]).",0x".($parts[1] || 0).",0x".($parts[2] || 0)."}"; $points_by_hex->{$left}->{Case_Folding} = $grows_count; $grows_count++; } }); my $simple_out = "static const MVMint32 CaseFolding_simple_table[$simple_count] = {\n 0x0,\n 0x" .stack_lines(\@simple, ",0x", ",\n 0x", 0, $wrap_to_columns)."\n};"; my $grows_out = "static const MVMint32 CaseFolding_grows_table[$grows_count][3] = {\n {0x0,0x0,0x0},\n " .stack_lines(\@grows, ",", ",\n ", 0, $wrap_to_columns)."\n};"; my $bit_width = least_int_ge_lg2($simple_count); # XXX surely this will always be greater? my $index_base = { bit_width => $bit_width }; register_enumerated_property('Case_Folding', $index_base); register_binary_property('Case_Folding_simple'); $estimated_total_bytes += $simple_count * 8 + $grows_count * 32; # XXX guessing 32 here? $db_sections->{BBB_CaseFolding_simple} = $simple_out; $db_sections->{BBB_CaseFolding_grows} = $grows_out; } sub SpecialCasing { my $count = 1; my @entries; each_line('SpecialCasing', sub { $_ = shift; s/#.+//; my ($code, $lower, $title, $upper, $cond) = split /\s*;\s*/; return if $cond; sub threesome { my @things = split ' ', shift; push @things, 0 while @things < 3; join ", ", map { "0x$_" } @things } push @entries, "{ { " . threesome($upper) . " }, { " . threesome($lower) . " }, { " . threesome($title) . " } }"; $points_by_hex->{$code}->{Special_Casing} = $count; $count++; }); my $out = "static const MVMint32 SpecialCasing_table[$count][3][3] = {\n {0x0,0x0,0x0},\n " .stack_lines(\@entries, ",", ",\n ", 0, $wrap_to_columns)."\n};"; my $bit_width = least_int_ge_lg2($count); my $index_base = { bit_width => $bit_width }; register_enumerated_property('Special_Casing', $index_base); $estimated_total_bytes += $count * 4 * 3 * 3; $db_sections->{BBB_SpecialCasing} = $out; } sub DerivedNormalizationProps { my $binary = { Full_Composition_Exclusion => 1, Changes_When_NFKC_Casefolded => 1 }; my $inverted_binary = { NFD_QC => 1, NFKD_QC => 1 }; register_binary_property($_) for ((keys %$binary),(keys %$inverted_binary)); my $trinary = { NFC_QC => 1, NFKC_QC => 1, NFG_QC => 1, }; my $trinary_values = { 'N' => 0, 'Y' => 1, 'M' => 2 }; register_enumerated_property($_, { enum => $trinary_values, bit_width => 2, 'keys' => ['N','Y','M'] }) for (keys %$trinary); each_line('DerivedNormalizationProps', sub { $_ = shift; my ($range, $property_name, $value) = split /\s*[;#]\s*/; if (exists $binary->{$property_name}) { $value = 1; } elsif (exists $inverted_binary->{$property_name}) { $value = undef; } elsif (exists $trinary->{$property_name}) { $value = $trinary_values->{$value}; } #elsif ($property_name eq 'NFKC_Casefold') { # XXX see how this differs from CaseFolding.txt # my @parts = split ' ', $value; # $value = \@parts; # } else { return; # deprecated } apply_to_range($range, sub { my $point = shift; $point->{$property_name} = $value; }); # If it's the NFC_QC property, then use this as the default value for # NFG_QC also. if ($property_name eq 'NFC_QC') { apply_to_range($range, sub { my $point = shift; $point->{'NFG_QC'} = $value; }); } }); } sub Jamo { each_line('Jamo', sub { $_ = shift; my ($code_str, $name) = split /\s*[;#]\s*/; $points_by_hex->{$code_str}->{Jamo_Short_Name} = $name; }); } sub LineBreak { my $enum = {}; my $base = { enum => $enum }; my $j = 0; $enum->{$_} = $j++ for ("BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW", "NL", "WJ", "JL", "JV", "JT", "H2", "H3"); each_line('LineBreak', sub { $_ = shift; my ($range, $name) = split /\s*[;#]\s*/; return unless exists $enum->{$name}; # only normative apply_to_range($range, sub { my $point = shift; $point->{Line_Break} = $enum->{$name}; }); }); my @keys = (); for my $key (keys %{$base->{enum}}) { $keys[$base->{enum}->{$key}] = $key; } $base->{keys} = \@keys; $base->{bit_width} = int(log($j)/log(2) - 0.00001) + 1; register_enumerated_property('Line_Break', $base); } sub NameAliases { each_line('NameAliases', sub { $_ = shift; my ($code_str, $name) = split /\s*[;#]\s*/; $aliases->{$name} = hex $code_str; }); } sub NamedSequences { each_line('NamedSequences', sub { $_ = shift; my ($name, $codes) = split /\s*[;#]\s*/; my @parts = split ' ', $codes; $named_sequences->{$name} = \@parts; }); } sub tweak_nfg_qc { # See http://www.unicode.org/reports/tr29/tr29-27.html#Grapheme_Cluster_Boundary_Rules for my $point (values %$points_by_code) { my $code = $point->{'code'}; # \r if ($code == 0x0D) { $point->{'NFG_QC'} = 0; } # Hangul elsif ($point->{'Hangul_Syllable_Type'}) { $point->{'NFG_QC'} = 0; } # Regional indicators elsif ($code >= 0x1F1E6 && $code <= 0x1F1FF) { $point->{'NFG_QC'} = 0; } # Grapheme_Extend elsif ($point->{'Grapheme_Extend'}) { $point->{'NFG_QC'} = 0; } # SpacingMark, and a couple of specials elsif ($point->{'gencat_name'} eq 'Mc' || $code == 0x0E33 || $code == 0x0EB3) { $point->{'NFG_QC'} = 0; } } } sub register_binary_property { my $name = shift; $all_properties->{$name} = $binary_properties->{$name} = { property_index => $property_index++, name => $name, bit_width => 1 } unless exists $binary_properties->{$name}; } sub register_enumerated_property { my ($pname, $obj) = @_; die if exists $enumerated_properties->{$pname}; $all_properties->{$pname} = $enumerated_properties->{$pname} = $obj; $obj->{name} = $pname; $obj->{property_index} = $property_index++; $obj } main(); # vim: ft=perl6 expandtab sw=4 MoarVM-2015.11/tools/update_ops.p60000644000175000017500000002244312573775575015656 0ustar jnthnjnthn# This script processes the op list into a C header file that contains # info about the opcodes. constant $EXT_BASE = 1024; constant $EXT_CU_LIMIT = 1024; class Op { has $.code; has $.name; has $.mark; has @.operands; has %.adverbs; } sub MAIN($file = "src/core/oplist") { # Parse the ops file to get the various ops. my @ops = parse_ops($file); say "Parsed {+@ops} total ops from src/core/oplist"; # Generate header file. my $hf = open("src/core/ops.h", :w); $hf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $hf.say(""); $hf.say(opcode_defines(@ops)); $hf.say("#define MVM_OP_EXT_BASE $EXT_BASE"); $hf.say("#define MVM_OP_EXT_CU_LIMIT $EXT_CU_LIMIT"); $hf.say(''); $hf.say('MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op);'); $hf.close; # Generate C file my $cf = open("src/core/ops.c", :w); $cf.say('#include "moar.h"'); $cf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $cf.say(opcode_details(@ops)); $cf.say('MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op) {'); $cf.say(' if (op >= MVM_op_counts)'); $cf.say(' return NULL;'); $cf.say(' return &MVM_op_infos[op];'); $cf.say('}'); $cf.close; # Generate cgoto labels header. my $lf = open('src/core/oplabels.h', :w); $lf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $lf.say(""); $lf.say(op_labels(@ops)); $lf.close; my %op_constants = op_constants(@ops); # Generate NQP Ops file. my $nf = open("lib/MAST/Ops.nqp", :w); $nf.say("# This file is generated from $file by tools/update_ops.p6."); $nf.say(""); $nf.say(%op_constants); $nf.close; # Generate a p6 Ops file into the tools directory my $pf = open("tools/lib/MAST/Ops.pm", :w); $pf.say("# This file is generated from $file by tools/update_ops.p6."); $pf.say(""); $pf.say(%op_constants); $pf.close; say "Wrote src/core/ops.h, src/core/ops.c, src/core/oplabels.h, tools/lib/MAST/Ops.pm, and lib/MAST/Ops.nqp"; } # Parses ops and produces a bunch of Op objects. sub parse_ops($file) { my @ops; my int $i = 0; for lines($file.IO) -> $line { if $line !~~ /^\s*['#'|$]/ { my ($name, $mark, @operands) = $line.split(/\s+/); # Look for validation mark. unless $mark && $mark ~~ /^ <[:.+*-]> \w $/ { @operands.unshift($mark) if $mark; $mark = ' '; } # Look for operands that are actually adverbs. my %adverbs; while @operands && @operands[*-1] ~~ /^ ':' (\w+) $/ { %adverbs{$0} = 1; @operands.pop; } @ops.push(Op.new( code => $i, name => $name, mark => $mark, operands => @operands, adverbs => %adverbs )); $i = $i + 1; } } return @ops; } my $value_map = { 'MVM_operand_literal' => 0, 'MVM_operand_read_reg' => 1, 'MVM_operand_write_reg' => 2, 'MVM_operand_read_lex' => 3, 'MVM_operand_write_lex' => 4, 'MVM_operand_rw_mask' => 7, 'MVM_reg_int8' => 1, 'MVM_reg_int16' => 2, 'MVM_reg_int32' => 3, 'MVM_reg_int64' => 4, 'MVM_reg_num32' => 5, 'MVM_reg_num64' => 6, 'MVM_reg_str' => 7, 'MVM_reg_obj' => 8, 'MVM_operand_int8' => 8, 'MVM_operand_int16' => 16, 'MVM_operand_int32' => 24, 'MVM_operand_int64' => 32, 'MVM_operand_num32' => 40, 'MVM_operand_num64' => 48, 'MVM_operand_str' => 56, 'MVM_operand_obj' => 64, 'MVM_operand_ins' => 72, 'MVM_operand_type_var' => 80, 'MVM_operand_lex_outer' => 88, 'MVM_operand_coderef' => 96, 'MVM_operand_callsite' => 104, 'MVM_operand_type_mask' => 120, 'MVM_operand_spesh_slot' => 128 }; # Generates MAST::Ops constants module. sub op_constants(@ops) { my @offsets; my @counts; my @values; my $values_idx = 0; for @ops -> $op { my $last_idx = $values_idx; @offsets.push($values_idx); for $op.operands.map(&operand_flags_values) -> $operand { @values.push($operand); $values_idx++; } @counts.push($values_idx - $last_idx); } return ( NQP => ' class MAST::Ops {} BEGIN { MAST::Ops.WHO<@offsets> := nqp::list_i('~ join(",\n ", @offsets)~'); MAST::Ops.WHO<@counts> := nqp::list_i('~ join(",\n ", @counts)~'); MAST::Ops.WHO<@values> := nqp::list_i('~ join(",\n ", @values)~'); MAST::Ops.WHO<%codes> := nqp::hash('~ join(",\n ", @ops.map({ "'$_.name()', $_.code()" }))~'); MAST::Ops.WHO<@names> := nqp::list_s('~ join(",\n ", @ops.map({ "'$_.name()'" }))~'); }', P6 => ' unit module MAST::Ops; our %flags is export = ('~ join(",\n ", $value_map.pairs.map({ $_.perl }) )~'); our @offsets is export = '~ join(",\n ", @offsets)~'; our @counts = '~ join(",\n ", @counts)~'; our @values is export = '~ join(",\n ", @values)~'; our %codes is export = '~ join(",\n ", @ops.map({ "'$_.name()', $_.code()" }))~'; our @names is export = '~ join(",\n ", @ops.map({ "'$_.name()'" }))~'; ', ).hash; } # Generate labels for cgoto dispatch sub op_labels(@ops) { my @labels = @ops.map({ sprintf('&&OP_%s', $_.name) }); my @padding = 'NULL' xx $EXT_BASE - @ops; my @extlabels = '&&OP_CALL_EXTOP' xx $EXT_CU_LIMIT; return "static const void * const LABELS[] = \{\n { join(",\n ", @labels, @padding, @extlabels) }\n\};"; } # Creates the #defines for the ops. sub opcode_defines(@ops) { join "\n", gather { take "/* Op name defines. */"; for @ops -> $op { take "#define MVM_OP_$op.name() $op.code()"; } take ""; } } # Creates the static array of opcode info. sub opcode_details(@ops) { join "\n", gather { take "static const MVMOpInfo MVM_op_infos[] = \{"; for @ops -> $op { take " \{"; take " MVM_OP_$op.name(),"; take " \"$op.name()\","; take " \"$op.mark()\","; take " $op.operands.elems(),"; take " $($op.adverbs ?? '1' !! '0'),"; take " $( ($op.adverbs ?? 1 !! 0) + ($op.adverbs ?? 2 !! 0) + ($op.adverbs ?? 4 !! 0)),"; take " $($op.adverbs ?? '1' !! '0'),"; take " $(($op.adverbs ?? 1 !! 0) + ($op.adverbs ?? 2 !! 0)),"; if $op.operands { take " \{ $op.operands.map(&operand_flags).join(', ') }"; } #else { take " \{ }"; } take " }," } take "};\n"; take "static const unsigned short MVM_op_counts = {+@ops};\n"; } } # Figures out the various flags for an operand type. grammar OperandFlag { token TOP { | '(' [ | ] ')' | | } token rw { < rl wl r w > } token type { < int8 int16 int32 int64 num32 num64 str obj > } token type_var { '`1' } token special { < ins lo coderef callsite sslot > } } my %rwflags = ( r => 'MVM_operand_read_reg', w => 'MVM_operand_write_reg', rl => 'MVM_operand_read_lex', wl => 'MVM_operand_write_lex' ); sub operand_flags($operand) { if OperandFlag.parse($operand) -> (:$rw, :$type, :$type_var, :$special) { if $rw { %rwflags{$rw} ~ ' | ' ~ ($type ?? "MVM_operand_$type" !! 'MVM_operand_type_var') } elsif $type { "MVM_operand_$type" } elsif $special eq 'ins' { 'MVM_operand_ins' } elsif $special eq 'lo' { 'MVM_operand_lex_outer' } elsif $special eq 'coderef' { 'MVM_operand_coderef' } elsif $special eq 'callsite' { 'MVM_operand_callsite' } elsif $special eq 'sslot' { 'MVM_operand_spesh_slot' } else { die "Failed to process operand '$operand'"; } } else { die "Cannot parse operand '$operand'"; } } sub operand_flags_values($operand) { if OperandFlag.parse($operand) -> (:$rw, :$type, :$type_var, :$special) { if $rw { $value_map{%rwflags{$rw}} +| $value_map{($type ?? "MVM_operand_$type" !! 'MVM_operand_type_var')} } elsif $type { $value_map{"MVM_operand_$type"} } elsif $special eq 'ins' { $value_map{'MVM_operand_ins'} } elsif $special eq 'lo' { $value_map{'MVM_operand_lex_outer'} } elsif $special eq 'coderef' { $value_map{'MVM_operand_coderef'} } elsif $special eq 'callsite' { $value_map{'MVM_operand_callsite'} } elsif $special eq 'sslot' { $value_map{'MVM_operand_spesh_slot'} } else { die "Failed to process operand '$operand'"; } } else { die "Cannot parse operand '$operand'"; } } MoarVM-2015.11/3rdparty/dyncall/.gitignore0000644000175000017500000000010412456307246017242 0ustar jnthnjnthnConfigVars *.o *.obj *.a *.lib Makefile Makefile.config *.swp *.swo MoarVM-2015.11/3rdparty/dyncall/AUTHORS0000644000175000017500000000032212466674236016333 0ustar jnthnjnthnDaniel Adler Tassilo Philipp Olivier Chafik Erik Mackdanz Masanori Mitsugi MoarVM-2015.11/3rdparty/dyncall/BUGS0000644000175000017500000000054712466674236015757 0ustar jnthnjnthn- add support for SELinux; object files need to be tagged with section '.section .note.GNU-stack,"",%progbits' - dyncall sparc v7/v8: -xO3 on SunPro segfaults in tests. - dyncall sparc64 port: works fine on Debian 6, but has issues on OpenBSD and Solaris regarding passing of float and double values. - this BUGS file should be merged with ToDo or vice-versa MoarVM-2015.11/3rdparty/dyncall/CMakeLists.txt0000644000175000017500000000577312456307246020033 0ustar jnthnjnthn# Package: dyncall # File: CMakeLists.txt # Description: DynCall Project cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # cmake_minimum_required (VERSION 2.6) project(DynCall) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "dyncall enables dynamic invocation of machine-level function calls") set(CPACK_PACKAGE_VENDOR "dyncall project") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/doc/Description.txt") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/doc/License.txt") if(APPLE) set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/doc/Description.txt") endif(APPLE) set(CPACK_PACKAGE_NAME "dyncall") include(CPack) # add cmake modules shipped with the package to cmake's module path. # currently we have no use for this, but maybe later.. #set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/buildsys/cmake/Modules" "${CMAKE_MODULE_PATH}") if(MSVC) enable_language(ASM_MASM) #if(CMAKE_SIZEOF_VOID_P MATCHES 8) # set(CMAKE_ASM_COMPILER "ml64") #else() # set(CMAKE_ASM_COMPILER "ml") #endif() #set(CMAKE_ASM_COMPILER_ARG1 "/c") #set(CMAKE_ASM_MASM_SOURCE_FILE_EXTENSIONS asm) #set(CMAKE_ASM_MASM_COMPILE_OBJECT " /c /Fo ") elseif(CMAKE_COMPILER_IS_GNUCC) # when used in shared libraries, -fPIC is required by several architectures # and platforms (observed on AMD64, Solaris/Sparc). # we enable it per default here. add_definitions("-fPIC") # enable gcc as front-end to assembler for .S files set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}") set(CMAKE_ASM_COMPILER_ARG1 "${CPPFLAGS} -c") enable_language(ASM) elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro") set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}") set(CMAKE_ASM_COMPILER_ARG1 "${CPPFLAGS} -c") enable_language(ASM) endif() add_subdirectory(dynload) add_subdirectory(dyncall) add_subdirectory(dyncallback) add_subdirectory(doc/manual EXCLUDE_FROM_ALL) add_subdirectory(test EXCLUDE_FROM_ALL) # install cmake Find scripts (disabled per default) option(INSTALL_CMAKE_MODULES "install cmake modules to locate dyncall" "NO") if(INSTALL_CMAKE_MODULES) file(GLOB INSTALL_CMAKE_MODULES_FILES buildsys/cmake/Modules/Find*.cmake) install(FILES ${INSTALL_CMAKE_MODULES_FILES} DESTINATION ${CMAKE_ROOT}/Modules) endif(INSTALL_CMAKE_MODULES) MoarVM-2015.11/3rdparty/dyncall/ChangeLog0000644000175000017500000001770412466674236017051 0ustar jnthnjnthnThis file lists bigger/noteworthy changes, only... Version 0.9 (upcoming) dyncall: o ARM64 support o PPC64 support (thanks Masanori) o introduced dcArgF and dcVArgF for flexible/convenient argument binding (works like dcCallF/dcVCallF without the function call) o added -fPIC by default for FreeBSD o PPC32 linux syscall support dyncallback: o ARM64 support o PPC64 support (thanks Masanori) o PPC32 System V support (Linux) o fix for PPC32 Darwin/OS X o more intuitive specification of callback return type doc: o added ARM64 support info and calling convention documentation o added PPC64 support info tests: o callf test also tests new argf interface bindings: o erldc: Erlang binding (thanks Erik) Version 0.8 buildsys: o big simplification make-based build system, no more distinct GNU and BSD makefiles anymore o new, much simpler ./configure for new make-based build-system o support for in-source and out-of-source builds for make-based build systems o made configure.bat guess x64 as target arch for x64 windows hosts o based more sources on portasm generation dyncall: o fix for ARMv7 Thumb-2 code (tested on iPhone 4 CDMA / iOS 6.0.1) o bugfixes for -O2 builds for SPARC-v9 and SPARC-v7 o new optimized call kernel for SPARC-v9 without conditionals o bigger refactoring and optimization of mips o32 o x64 optimizations dyncallback: o added callback support for plan9 o big cleanup, removal of duplicate files after introduction of portasm o include path fixes for public facing APIs (removed relative paths) doc: o cleanup of manual and corrections o added info about newly supported and/or tested platforms (e.g. FreeBSD on ARM) o restructured folder layout for documentation o added API doc for dyncallback and dynload o added manpages for dyncallback and dynload tests: o added arm/thumb interwork test suite bindings: o godc: added bindings for Go o rbdc: fixed and extended ruby bindings o shdc: renamed shell binding to shdc and added feature to list shared-objects' symbols Version 0.7 architecture: o added subproject: portasm - portable (GNU AS,+Apple and MASM) assembly framework o added subproject: autovar - predefined macro framework (was dyncall_macros.h) o added support for sparc (32-bit) (tested on linux/debian,openbsd,solaris) o added support for sparc (64-bit) (tested on linux/debian,openbsd,solaris) o added support for Solaris and SunPro compiler for i386, x86_64, sparc and sparc64 o improved auto-detection via preprocessor defines dyncall updates: o uses portasm (GNU,Apple,Microsoft) common sources for x86,x64,ppc32,arm32_arm o bug fixes for x64/win64 calling convention o added support for mingw32-w64 on x64 o improved cdecl x86 calling convention: stack always 16 byte aligned o updated API and initial support for structs (for x86/AMD64) o initial support for syscalls on x86, added x86 int80h linux/bsd o added Minix port (stable) o optimized vector buffer for small type pushing o minor fix for amd64/sysv: alignment to 32-byte o bug fix for ppc32/sysv: ellipsis calls work now o updated API, introduced DC_CALL_C_ELLIPSIS_VARARGS o changed interface: dcMode does not reset internally anymore dyncallback updates: o uses portasm for x86,x64 o added Solaris/x86/sunpro port (stable) o added Minix port (unstable) o callback support for Darwin/ppc32 o updates source, uses relative includes dynload updates: o fixes for missing includes (dyncall_alloc.h) o fixes for self-resolving symbols on windows o removed Dbghelf.lib dependency o bug fixes for cygwin/x86 o fixes for beos/haiku o no dependencies to libdyncall sources. buildsys additions: o added zero-config (BSD,GNU,SUN) make files (Makefile.embedded) o added in/out-of-source configure2 w/ (BSD,GNU) make files (Makefile.generic') o added bootstrap lua script (download/build) o Nmakefile: more tests included (resolve_self) o improved cross-compilation for iOS (upgrade to 4.3 sdk) o darwin 8.0 support o added 'install' support for Makefile.embedded buildsys/gmake updates: o added support for msvc/x64 tool-chain o default settings for build-dir changed to '.' o cleanup: removed top-level Make{Prolog,Epilog,Rules} files and updated all sub-projects and tests o added support for DESTDIR staging installation o added support for manual page installation buildsys/cmake updates: o updated find module scripts (see cmake/Modules) o added support for using dyncall as sub-project (via *Config.cmake files) see details in README.CMake o fixes for msvc and ml o fixes for CPack o fixes for universal builds on Mac OS X o supports SunPro with *.S files. o added experimental 'dynMake' portable make-based build-system (not stable, yet) documentation updates: o added dyncallback documentation o updated dyncall documentation o minor updates tests: o added flexible test suite for calls (call_suite) based on Lua and C o added syscall test o updates to resolve-self test (adding additional link flags to export symbols) o improved dir name portability (renamed plain_c++ -> plain_cxx) o renamed *.cpp -> *.cc files (OpenBSD/Sun make has no implicit rules for cpp) Version 0.6 building: o new build systems: CMake and Plan9's mk o buildsys/gmake tool chain update: pcc and iphone sdk o x64 bugfix: added "-fPIC" even for static libs dynload updates: o enum symbols update: Mach-O and Win64 (thanks Olivier) o numerous convenience changes to dynload interface (thanks Olivier) o added support for resolving application images itself dyncall updates: o new platform support: arm/iphone (armv6), x86/Plan9 o new mips calling conventions: oabi, n64 (both endian models) o cleanup: unexported functions in MASM files, b/c export not needed (thanks Olivier) o interface update: added error reporting facility 'dcGetError' o bugfix for ppc32/sysv: ellipsis calls were broken o interface update: added new abstract mode for ellipsis calls (DC_CALL_C_ELLIPSIS) docs: o comprehensive update tests: o plain: split "plain" test up in C and C++ part o callbacksuite: added multiple configuration support for callback_suite Version 0.5 o renamed arm9 stuff to arm32 o added non-EABI ABI for arm32 (before, EABI was the default implementation) o added dyncallback support for x64/windows (thanks Olivier), x64/darwin, arm32/arm, arm32/thumb o synced documentation again with current state of the source (lots of small changes) o updated ruby binding to current state of signature string (still some features missing, though) o added a couple of new options to configure scripts (e.g. prefix-bd, new targets, etc.) o darwin universal binary support o added new tests callback_plain and calback_suite o added Haiku/BeOS support Version 0.4 o added 'doc' makefile target for coherency and ease of use o fixed nmake buildfiles and configure.bat (were out of date and wrong) o test suite clean up (GNUmake, BSDmake): target "config" modified, phony without dependencies to other builds o bugfix: GNU fastcall calling convention for float and double arguments was wrong. no skip of register. o update: x86win32* suite tests are built on cygwin now, added total result output o signature types change: C Strings: 'S' -> 'Z' long: 'l' -> 'j' long long: 'L' -> 'l' added unsigned integer type signature characters: upper case encoding o added: callbacks component (support only for some platforms ATM) o added: test cases for alloc_wx, thunk o updated Documentation Version 0.3 o added Linux PPC32 support o added ARM THUMB mode support o cosmetic changes, documentation updated o bugfix: on cygwin exported C symbols in GNU as are prefixed with '_' now. o removed scons build support Version 0.2 o added scons build support o configure variables all prefix CONFIG_* now o configure variable INSTALL_DIR changed to INSTALL_PREFIX o configure (shell version) option "--prefix" changed to "--prefix=" Version 0.1: o initial release MoarVM-2015.11/3rdparty/dyncall/LICENSE0000644000175000017500000000162412466674236016276 0ustar jnthnjnthnIf not stated otherwise inside a file, all files here are distributed in terms of: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. MoarVM-2015.11/3rdparty/dyncall/Makefile.M0000644000175000017500000000152112456307246017111 0ustar jnthnjnthn#include "buildsys/dynmake/Makefile.base.M" all: cd dyncall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd dynload _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd dyncallback _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean: cd dyncall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd dynload _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd dyncallback _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean tests: cd test _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) MoarVM-2015.11/3rdparty/dyncall/Makefile.embedded0000644000175000017500000000462212456307246020453 0ustar jnthnjnthnMAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} all: cd dynload && ${MAKE_CMD} cd dyncall && ${MAKE_CMD} cd dyncallback && ${MAKE_CMD} tests: cd test && ${MAKE_CMD} clean: cd dynload && ${MAKE_CMD} clean cd dyncall && ${MAKE_CMD} clean cd dyncallback && ${MAKE_CMD} clean cd test && ${MAKE_CMD} clean install: cd dynload && ${MAKE_CMD} install cd dyncall && ${MAKE_CMD} install cd dyncallback && ${MAKE_CMD} install bsd: ${MAKE_CMD} all linux: ${MAKE_CMD} all linux64: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all minix-gcc: cd dyncall && CC=gcc CFLAGS= ${MAKE_CMD} cd dyncallback && CC=gcc CFLAGS= ${MAKE_CMD} mingw32: ${MAKE_CMD} CC=gcc AS="gcc -c" all osx: ${MAKE_CMD} all osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="libtool" ARFLAGS="-static -o" ${MAKE_CMD} all osx-template: CC="${CC} ${OSX_ARCH}" AS="${AS} ${OSX_ARCH}" ${MAKE_CMD} osx-i386: OSX_ARCH="-arch i386" ${MAKE_CMD} osx-template sun: CFLAGS="${CFLAGS}" ${MAKE_CMD} all sun-64bit: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all sun-gcc: CC=gcc CFLAGS="${CFLAGS} -fPIC" ${MAKE_CMD} all sun-gcc-64bit: CC=gcc CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all ios-sdkroot: \ AS="${CC} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ CC="${CC} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ CXX="${CXX} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ LD="${LD} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ ASFLAGS="-isysroot ${IOS_SDKROOT}"\ CFLAGS="-isysroot ${IOS_SDKROOT}"\ CXXFLAGS="-isysroot ${IOS_SDKROOT}"\ LDFLAGS="-Wl,-syslibroot ${IOS_SDKROOT}"\ ${MAKE_CMD} all ios: IOS_SDKROOT="`xcode-select -print-path`/Platforms/iPhone${IOS_PLATFORM}.platform/Developer/SDKs/iPhone${IOS_PLATFORM}${IOS_SDK}.sdk" ${MAKE_CMD} ios-sdkroot ios-sim: IOS_PLATFORM="Simulator" ${MAKE_CMD} ios ios-os: IOS_PLATFORM="OS" ${MAKE_CMD} ios # NOTE iOS 6.1 does not support armv6 (has no libs) ios61-os: IOS_SDK="6.1" IOS_ARCH="-arch armv7" ${MAKE_CMD} ios-os ios61-os-no-thumb: IOS_SDK="6.1" IOS_ARCH="-arch armv7 -mno-thumb" ${MAKE_CMD} ios-os ios61-sim: IOS_SDK="6.1" IOS_ARCH="-arch i386" ${MAKE_CMD} ios-sim .PHONY: all tests clean install bsd linux linux64 minix-gcc mingw32 osx osx-universal sun sun-64bit sun-gcc sun-gcc-64bit MoarVM-2015.11/3rdparty/dyncall/Makefile.generic0000644000175000017500000000213012456307246020326 0ustar jnthnjnthn.PHONY: all clean install tests docs run-tests clean distclean libdyncall libdyncallback libdynload all: libdyncall libdyncallback libdynload install: all install-libdyncall install-libdyncallback install-libdynload libdyncall: cd dyncall && ${MAKE} all libdyncallback: cd dyncallback && ${MAKE} all libdynload: cd dynload && ${MAKE} all install-libdyncall: libdyncall cd dyncall && ${MAKE} install install-libdyncallback: libdyncallback cd dyncallback && ${MAKE} install install-libdynload: libdynload cd dynload && ${MAKE} install clean: cd dyncall && ${MAKE} $@ cd dynload && ${MAKE} $@ cd dyncallback && ${MAKE} $@ cd test && ${MAKE} $@ cd doc && ${MAKE} $@ tests: tests-libdyncall tests-libdyncallback tests-libdynload tests-libdyncall: libdyncall cd test && ${MAKE} all-dyncall tests-libdyncallback: libdyncallback cd test && ${MAKE} all-dyncallback tests-libdynload: libdynload cd test && ${MAKE} all-dynload docs: cd doc && ${MAKE} all run-tests: all cd test && ${MAKE} $@ distclean: clean rm -f Makefile.config find . -type f -name "Makefile.generic" | sed s/\.generic$$// | xargs rm MoarVM-2015.11/3rdparty/dyncall/Nmakefile0000644000175000017500000000301312456307246017072 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = . !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake DIRS = dyncall dynload dyncallback tests: dummy !echo Building tests ... && cd test && $(MAKE) /NOLOGO /F Nmakefile && cd .. doc: dummy !echo Building documentation ... && cd $@/manual && $(MAKE) /NOLOGO /F Nmakefile && cd .. # Pseudo-targets are always out of date... dummy: !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/README0000644000175000017500000000533212466674236016151 0ustar jnthnjnthndyncall - A Generic Dynamic FFI package ======================================= dyncall is a low-level toolkit providing a portable abstraction for handling native code dynamically at run time. It comprises three independent components, available as C libraries, namely: - 'dyncall' for making function calls, - 'dyncallback' or writing generic callback handlers, and - 'dynload' for loading code. The package provides abstractions to the Application Binary Interface of various hardware platforms such as x86, AMD64, ARM32/64, ARM32/64, PowerPCC32/64, MIPS32/64 and SPARC32/64. Our releases are thoroughly tested using a flexible test suite. A typical application for the use of dyncall is the back-end of a FFI (foreign function interface) for scripting languages to connect with the C/C++ world. The binary footprint of the package is approx. 10-20 kb, depending on the platform. A test suite and comprehensive documentation is available. Building the libraries ---------------------- Prequisites: - C compiler such as gcc, clang, sunpro or msvc. - Assembler such as gas (gnu/apple), fbe or masm. - Build system such as 'shell/make', cmake, nmake (windows) or mk (plan9). Supported Architectures and ABIs: --------------------------------- - x86 32/64-bit (cdecl, fastcall, stdcall, C++ this calls, syscalls, plan9) - ARM AArch32/64 (32: ARM/Thumb mode, v4t-v7, oabi/eabi, soft/hardfloat ABIs; 64: AAPCS64) - MIPS 32/64-bit (o32, n64, eabi) - PowerPC 32/64-bit (32: Mac OS X, System V; 64: System V little and big endian ELF ABI) - Sparc 32/64-bit (v7/8 and v9) NOTE: Callback support is currently available on x86-32/64, arm32 softfloat ABIs, arm64, PPC64 and PPC32 Linux/OS X. Supported Operating Systems: ---------------------------- - Android - *BSD - Haiku - iOS - Linux - Mac OS X - Microsoft Windows - Minix - Nintendo DS Homebrew - Plan9 / 9front - Playstation Portable Homebrew - ReactOS - Solaris Building the libraries ---------------------- Using configure shell script and GNU/BSD/Sun make system. $ ./configure $ make $ make install Testing: $ make tests $ make run-tests Build 'out-of-source' --------------------- $ cd $ /configure --prefix= $ make $ sudo make install Building using CMake -------------------- $ cmake $ make $ sudo make install Building on Windows ------------------- See doc/README.Windows Platform-specific build details ------------------------------- See doc/README.* Building the manual ------------------- Make sure pdflatex is installed and run $ make docs Please refer to http://www.dyncall.org, dyncall(3), dyncallback(3), the dyncall manual and platform-specific READMEs under doc/ for more information. MoarVM-2015.11/3rdparty/dyncall/ToDo0000644000175000017500000001040612466674236016057 0ustar jnthnjnthn0.9: ---- - ppc32 callback fixes on bsd - make install should install manpages - mailing list announcements (html email?) - fix for NDS: * ARM: - callback_plain retval wrong (not only platform) * THUMB: - ellipsis (might be test itself, not respecting fixed part of args) - retvals of call_suite (maybe all retvals, in general) - callback_plain retval - callf build-system: ------------- - cmake mac os x universal binary builds with *.S does not build multiple architectures portasm: -------- - add solaris support for x64 dyncall: -------- - support for return values: aggregate return values - support for argument values: structures, half-precision, vector types, long double - varargs for mips (might exist, but test all ABIs) - consider automatic type-promotion for arguments passed through DC_CALL_C_ELLIPSIS_VARARGS; this would make it easier to just pass arguments instead of having to know about the C type promotions - syscalls for x64 * bsd * linux - other syscalls dynload: -------- - bug: test/nm crashes on qemu mips linux o32 debian etch - test/resolve_self crashes/asserts on windows and bsds - rename SymsInit to InitSyms and similar for cleanup function to reflect naming in dyncall - get rid of Dl_info and friends (_GNU_SOURCE) in dynload/dynload_syms_elf.c for implementation of dlSymsNameFromValue(..) - check if PSP can support dynload (missing elf.h, dlfcn.h, etc.); fixup readme if successful dyncallback: ------------ - callback_plain's return value not correct anymore on NDS (maybe just broken testcode?) - add MIPS callbacks for eabi, n32, o32 (thunks are working) - finish PPC32 callbacks (see bugs section, below) bindings: --------- - release bindings as standalone packages (already done for rbdc as a gem and rdyncall on cran) * add note to documentation, where bindings are and that some bindings are svn-only ATM - add rdoc documentation to ruby gem - bring python up to latest - add pydoc for python - add manpage for shdc - expose callf-convenience functions to go - add godoc for godc - bring java up to latest - add javadoc to java - add more bindings - add callback support for erlang, go, java, lua, python and ruby (and shell? how?) - add call-conv-mode-support for rbdc through signature manual: ------- - finish tex4ht manual generation (use \ifhtml and \ifnhtml, ...) - provide more examples on how to use dyncall, dynload and dyncallback * e.g. enhance manual with a couple of examples (e.g. calling MessageBoxA on windows, etc.) - manuals for bindings (as stated in bindings-section, above) urgent issues: -------------- - finish SPARC/SPARC64 calling conventions in doc's callconv-appendix !!! - Haiku/gmake build doesn't build dynload due to the fact, that elf.h is not found on default installations (one has to install the system headers) * add to doc - Solaris/gmake build doesn't build dynload and tests anymore (maybe not even dyncallback) - test arm32/ATPCS/THUMB (and then change Status in doc Appendix) - look over code and fix TODO or @@@ marks - add ppc-support to doc (both, 32 and 64, as well as little and big endian remarks) nice to have: ------------- - update: microsoft visual c++ build files - integrate all test suites in solution file - consistency: on x64 platforms: make both ABIs available ('win64','sysv') for all x64 OS ports - microsoft build enhancement: autodetect assembly via C preprocessor (like with .S gcc files) - test/thunk: some platforms do not allow for allocation of executable code on heap and stack -- currently this test will crash, maybe we should collect information which platforms allow and which not. bugs: ----- - callbacks on ppc32 only work on linux and apple (osx abi), but not BSD - vararg function calls don't work for ARM THUMB mode (Daniel's new interface for modesetting for varag args should be used); adapt test/ellipsis and/or retest missing implementations (descending priority): ---------------------------------------------- - itanium - 68k, 88k, 6502, etc. - alpha - superh - cell - blackfin - z80 - hppa - vax - atmel avr - propeller - amd29k - arc - seaforth available hardware for outstanding ports: ----------------------------------------- - 68k: Tassilo's old Palm m100 (MC68EZ328 (16MHz)) - sh4: Tassilo's Dreamcast - sigmatel stmp3550b: Daniel's iPod Nano MoarVM-2015.11/3rdparty/dyncall/autovar/LICENSE.txt0000644000175000017500000000136512456307246020570 0ustar jnthnjnthnCopyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. MoarVM-2015.11/3rdparty/dyncall/autovar/README.txt0000644000175000017500000000127412456307246020442 0ustar jnthnjnthnautovar -- a small macro auto-detection library the following gives the list of variables available. for each variable, a separate header file is used. OS: Operating System ARCH: Architecture CC: C Compiler ABI: Application Binary Interface OSFAMILY: OS Roots the following gives the tree of variables OS: Win32 Win64 Darwin IOS MacOSX Linux FreeBSD OpenBSD NetBSD DragonFlyBSD SunOS Cygwin MinGW NDS PSP BeOS Plan9 VMS Minix Unknown ARCH: X86 X64 IA64 PPC PPC64 MIPS64 MIPS ARM THUMB SH SPARC64 SPARC ABI: PE Mach ELF ELF32 ELF64 OSFAMILY: Windows Unix CC: INTEL MSVC GNU WATCOM PCC SUN MoarVM-2015.11/3rdparty/dyncall/autovar/autovar_ABI.h0000644000175000017500000000245412456307246021252 0ustar jnthnjnthn/* Package: dyncall Library: autovar File: autovar/autovar_ABI.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_ABI_H #define AUTOVAR_ABI_H #include "autovar_OS.h" #if defined(OS_Win32) || defined(OS_Win64) || defined(OS_Cygwin) || defined(OS_MinGW) #define ABI_PE #elif defined(OS_Darwin) #define ABI_Mach #else #define ABI_ELF # if defined(__LP64__) || defined(_LP64) # define ABI_ELF64 # else # define ABI_ELF32 # endif #endif #endif /* AUTOVAR_ABI_H */ MoarVM-2015.11/3rdparty/dyncall/autovar/autovar_ARCH.h0000644000175000017500000000405112502366750021364 0ustar jnthnjnthn/* Package: dyncall Library: autovar File: autovar/autovar_ARCH.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_ARCH_H #define AUTOVAR_ARCH_H /* Check architecture. */ #if defined(_M_IX86) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__386__) || defined(__i386) # define ARCH_X86 #elif defined(_M_X64_) || defined(_M_AMD64) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) # define ARCH_X64 #elif defined(_M_IA64) || defined(__ia64__) # define ARCH_IA64 #elif defined(__ppc64__) || defined(_ARCH_PPC64) || defined(__power64__) # define ARCH_PPC64 #elif defined(_M_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__ppc__) || defined(__power__) # define ARCH_PPC #elif defined(__mips64__) || defined(__mips64) # define ARCH_MIPS64 #elif defined(_M_MRX000) || defined(__mips__) # define ARCH_MIPS #elif defined(__arm__) # define ARCH_ARM # if defined(__thumb__) # define ARCH_THUMB # endif #elif defined(__sh__) # define ARCH_SH #elif defined(__sparcv9) || ( defined(__sparc) && defined(__arch64__) ) # define ARCH_SPARC64 #elif defined(__sparc) # define ARCH_SPARC #endif #endif /* AUTOVAR_ARCH_H */ MoarVM-2015.11/3rdparty/dyncall/autovar/autovar_CC.h0000644000175000017500000000261112456307246021137 0ustar jnthnjnthn/* Package: dyncall Library: autovar File: autovar/autovar_CC.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_CC_H #define AUTOVAR_CC_H /* Compiler specific defines. Do not change the order, because */ /* some of the compilers define flags for compatible ones, too. */ #if defined(__INTEL_COMPILER) #define CC_INTEL #elif defined(_MSC_VER) #define CC_MSVC #elif defined(__GNUC__) #define CC_GNU #elif defined(__WATCOMC__) #define CC_WATCOM #elif defined(__PCC__) #define CC_PCC #elif defined(__SUNPRO_C) #define CC_SUN #endif #endif /* AUTOVAR_CC_H */ MoarVM-2015.11/3rdparty/dyncall/autovar/autovar_OS.h0000644000175000017500000000452512456307246021201 0ustar jnthnjnthn/* Package: dyncall Library: autovar File: autovar/autovar_OS.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_OS_H #define AUTOVAR_OS_H #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) # define OS_Win64 #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__WINDOWS__) || defined(_WINDOWS) # define OS_Win32 #elif defined(__APPLE__) || defined(__Darwin__) # define OS_Darwin # if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) # define OS_IOS # else /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */ # define OS_MacOSX # endif #elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__) # define OS_Linux #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) # define OS_FreeBSD #elif defined(__OpenBSD__) # define OS_OpenBSD #elif defined(__NetBSD__) # define OS_NetBSD #elif defined(__DragonFly__) # define OS_DragonFlyBSD #elif defined(__sun__) || defined(__sun) || defined(sun) # define OS_SunOS #elif defined(__CYGWIN__) # define OS_Cygwin #elif defined(__MINGW__) # define OS_MinGW #elif defined(__nds__) # define OS_NDS #elif defined(__psp__) || defined(PSP) # define OS_PSP #elif defined(__HAIKU__) || defined(__BEOS__) # define OS_BeOS #elif defined(Plan9) || defined(__Plan9__) # define OS_Plan9 #elif defined(__vms) # define OS_VMS #elif defined(__minix) # define OS_Minix #else # define OS_Unknown #endif /** Platforms. */ #if defined(__ANDROID__) # define OS_Android #endif #endif /* AUTOVAR_OS */ MoarVM-2015.11/3rdparty/dyncall/autovar/autovar_OSFAMILY.h0000644000175000017500000000233712456307246022102 0ustar jnthnjnthn/* Package: dyncall Library: autovar File: autovar/autovar_OSFAMILY.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef AUTOVAR_OSFAMILY_H #define AUTOVAR_OSFAMILY_H #include "autovar_OS.h" #if defined(OS_Win32) || defined(OS_Win64) #define OSFAMILY_Windows #elif defined(OS_NDS) || defined(OS_PSP) #define OSFAMILY_GameConsole #else #define OSFAMILY_Unix #endif #endif /* AUTOVAR_OSFAMILY_H */ MoarVM-2015.11/3rdparty/dyncall/buildsys/cmake/Modules/FindDynCall.cmake0000644000175000017500000000303112456307246024733 0ustar jnthnjnthn# - Try to find dyncall library # # The following variables will be defined: # # DYNCALL_FOUND # DYNCALL_INCLUDE_DIRS # DYNCALL_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/CMakeLists.txt # Description: CMake Module to find DynCall library # License: # # Copyright (c) 2010,2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNCALL_INCLUDE_DIR NAMES dyncall.h) find_library(DYNCALL_LIBRARY dyncall_s) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynCall DEFAULT_MSG DYNCALL_LIBRARY DYNCALL_INCLUDE_DIR) if(DYNCALL_FOUND) set(DYNCALL_INCLUDE_DIRS ${DYNCALL_INCLUDE_DIR}) set(DYNCALL_LIBRARIES ${DYNCALL_LIBRARY}) endif(DYNCALL_FOUND) mark_as_advanced(DYNCALL_INCLUDE_DIR DYNCALL_LIBRARY) MoarVM-2015.11/3rdparty/dyncall/buildsys/cmake/Modules/FindDynCallback.cmake0000644000175000017500000000315212456307246025560 0ustar jnthnjnthn# - Try to find DynLoad library # # The following variables will be defined: # # DYNCALLBACK_FOUND # DYNCALLBACK_INCLUDE_DIRS # DYNCALLBACK_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/FindDynLoad.cmake # Description: CMake Module to find dynload library # License: # # Copyright (c) 2010,2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNCALLBACK_INCLUDE_DIR NAMES dyncall_callback.h) find_library(DYNCALLBACK_LIBRARY dyncallback_s) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynCallback DEFAULT_MSG DYNCALLBACK_LIBRARY DYNCALLBACK_INCLUDE_DIR) if(DYNCALLBACK_FOUND) set(DYNCALLBACK_INCLUDE_DIRS ${DYNCALLBACK_INCLUDE_DIR}) set(DYNCALLBACK_LIBRARIES ${DYNCALLBACK_LIBRARY}) endif(DYNCALLBACK_FOUND) mark_as_advanced(DYNCALLBACK_INCLUDE_DIR DYNCALLBACK_LIBRARY) MoarVM-2015.11/3rdparty/dyncall/buildsys/cmake/Modules/FindDynLoad.cmake0000644000175000017500000000312312456307246024741 0ustar jnthnjnthn# - Try to find dynload library # # The following variables will be defined: # # DYNLOAD_FOUND # DYNLOAD_INCLUDE_DIRS # DYNLOAD_LIBRARIES # # ---------------------------------------------------------------------------- # # Package: dyncall # File: buildsys/cmake/Modules/FindDynLoad.cmake # Description: CMake Module to find dynload library # License: # # Copyright (c) 2010-2011 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # find_path(DYNLOAD_INCLUDE_DIR NAMES dynload.h) find_library(DYNLOAD_LIBRARY dynload_s) mark_as_advanced(DYNLOAD_INCLUDE_DIR DYNLOAD_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DynLoad DEFAULT_MSG DYNLOAD_LIBRARY DYNLOAD_INCLUDE_DIR) if(DYNLOAD_FOUND) set(DYNLOAD_INCLUDE_DIRS ${DYNLOAD_INCLUDE_DIR}) set(DYNLOAD_LIBRARIES ${DYNLOAD_LIBRARY}) endif(DYNLOAD_FOUND) mark_as_advanced(DYNLOAD_INCLUDE_DIR DYNLOAD_LIBRARY) MoarVM-2015.11/3rdparty/dyncall/buildsys/cmake/Modules/UseLATEX.cmake0000644000175000017500000010102612456307246024141 0ustar jnthnjnthn# File: UseLATEX.cmake # CMAKE commands to actually use the LaTeX compiler # Version: 1.7.2 # Author: Kenneth Moreland (kmorel at sandia dot gov) # # Copyright 2004 Sandia Corporation. # Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive # license for use of this work by or on behalf of the # U.S. Government. Redistribution and use in source and binary forms, with # or without modification, are permitted provided that this Notice and any # statement of authorship are reproduced on all copies. # # The following MACROS are defined: # # ADD_LATEX_DOCUMENT( # [BIBFILES ] # [INPUTS ] # [IMAGE_DIRS] # [IMAGES] # [CONFIGURE] # [DEPENDS] # [USE_INDEX] [USE_GLOSSARY] # [DEFAULT_PDF] [MANGLE_TARGET_NAMES]) # Adds targets that compile . The latex output is placed # in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is # not set. The latex program is picky about where files are located, # so all input files are copied from the source directory to the # output directory. This includes the target tex file, any tex file # listed with the INPUTS option, the bibliography files listed with # the BIBFILES option, and any .cls, .bst, and .clo files found in # the current source directory. Images found in the IMAGE_DIRS # directories or listed by IMAGES are also copied to the output # directory and coverted to an appropriate format if necessary. Any # tex files also listed with the CONFIGURE option are also processed # with the CMake CONFIGURE_FILE command (with the @ONLY flag. Any # file listed in CONFIGURE but not the target tex file or listed with # INPUTS has no effect. DEPENDS can be used to specify generated files # that are needed to compile the latex target. # # The following targets are made: # dvi: Makes .dvi # pdf: Makes .pdf using pdflatex. # safepdf: Makes .pdf using ps2pdf. If using the default # program arguments, this will ensure all fonts are # embedded and no lossy compression has been performed # on images. # ps: Makes .ps # html: Makes .html # auxclean: Deletes .aux. This is sometimes necessary # if a LaTeX error occurs and writes a bad aux file. # # The dvi target is added to the ALL. That is, it will be the target # built by default. If the DEFAULT_PDF argument is given, then the # pdf target will be the default instead of dvi. # # If the argument MANGLE_TARGET_NAMES is given, then each of the # target names above will be mangled with the name. This # is to make the targets unique if ADD_LATEX_DOCUMENT is called for # multiple documents. If the argument USE_INDEX is given, then # commands to build an index are made. If the argument USE_GLOSSARY # is given, then commands to build a glossary are made. # # History: # # 1.7.2 Use ps2pdf to convert eps to pdf to get around the problem with # ImageMagick dropping the bounding box (thanks to Lukasz Lis). # # 1.7.1 Fixed some dependency issues. # # 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulo). # # 1.6.1 Ported the makeglossaries command to CMake and embedded the port # into UseLATEX.cmake. # # 1.6.0 Allow the use of the makeglossaries command. Thanks to Oystein # S. Haaland for the patch. # # 1.5.0 Allow any type of file in the INPUTS lists, not just tex file # (suggested by Eric Noulard). As a consequence, the ability to # specify tex files without the .tex extension is removed. The removed # function is of dubious value anyway. # # When copying input files, skip over any file that exists in the # binary directory but does not exist in the source directory with the # assumption that these files were added by some other mechanism. I # find this useful when creating large documents with multiple # chapters that I want to build separately (for speed) as I work on # them. I use the same boilerplate as the starting point for all # and just copy it with different configurations. This was what the # separate ADD_LATEX_DOCUMENT method was supposed to originally be for. # Since its external use is pretty much deprecated, I removed that # documentation. # # 1.4.1 Copy .sty files along with the other class and package files. # # 1.4.0 Added a MANGLE_TARGET_NAMES option that will mangle the target names. # # Fixed problem with copying bib files that became apparent with # CMake 2.4. # # 1.3.0 Added a LATEX_OUTPUT_PATH variable that allows you or the user to # specify where the built latex documents to go. This is especially # handy if you want to do in-source builds. # # Removed the ADD_LATEX_IMAGES macro and absorbed the functionality # into ADD_LATEX_DOCUMENT. The old interface was always kind of # clunky anyway since you had to specify the image directory in both # places. It also made supporting LATEX_OUTPUT_PATH problematic. # # Added support for jpeg files. # # 1.2.0 Changed the configuration options yet again. Removed the NO_CONFIGURE # Replaced it with a CONFIGURE option that lists input files for which # configure should be run. # # The pdf target no longer depends on the dvi target. This allows you # to build latex documents that require pdflatex. Also added an option # to make the pdf target the default one. # # 1.1.1 Added the NO_CONFIGURE option. The @ character can be used when # specifying table column separators. If two or more are used, then # will incorrectly substitute them. # # 1.1.0 Added ability include multiple bib files. Added ability to do copy # sub-tex files for multipart tex files. # # 1.0.0 If both ps and pdf type images exist, just copy the one that # matches the current render mode. Replaced a bunch of STRING # commands with GET_FILENAME_COMPONENT commands that were made to do # the desired function. # # 0.4.0 First version posted to CMake Wiki. # ############################################################################# # Find the location of myself while originally executing. If you do this # inside of a macro, it will recode where the macro was invoked. ############################################################################# SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE} CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE ) ############################################################################# # Generic helper macros ############################################################################# # Helpful list macros. MACRO(LATEX_CAR var) SET(${var} ${ARGV1}) ENDMACRO(LATEX_CAR) MACRO(LATEX_CDR var junk) SET(${var} ${ARGN}) ENDMACRO(LATEX_CDR) MACRO(LATEX_LIST_CONTAINS var value) SET(${var}) FOREACH (value2 ${ARGN}) IF (${value} STREQUAL ${value2}) SET(${var} TRUE) ENDIF (${value} STREQUAL ${value2}) ENDFOREACH (value2) ENDMACRO(LATEX_LIST_CONTAINS) # Parse macro arguments. MACRO(LATEX_PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option}) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) IF (is_arg_name) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name) LATEX_LIST_CONTAINS(is_option ${arg} ${option_names}) IF (is_option) SET(${prefix}_${arg} TRUE) ELSE (is_option) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option) ENDIF (is_arg_name) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(LATEX_PARSE_ARGUMENTS) # Match the contents of a file to a regular expression. MACRO(LATEX_FILE_MATCH variable filename regexp default) # The FILE STRINGS command would be a bit better, but it's not supported on # older versions of CMake. FILE(READ ${filename} file_contents) STRING(REGEX MATCHALL "${regexp}" ${variable} ${file_contents} ) IF (NOT ${variable}) SET(${variable} "${default}") ENDIF (NOT ${variable}) ENDMACRO(LATEX_FILE_MATCH) ############################################################################# # Macros that perform processing during a LaTeX build. ############################################################################# MACRO(LATEX_MAKEGLOSSARIES) MESSAGE("**************************** In makeglossaries") IF (NOT LATEX_TARGET) MESSAGE(SEND_ERROR "Need to define LATEX_TARGET") ENDIF (NOT LATEX_TARGET) IF (NOT MAKEINDEX_COMPILER) MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER") ENDIF (NOT MAKEINDEX_COMPILER) SET(aux_file ${LATEX_TARGET}.aux) IF (NOT EXISTS ${aux_file}) MESSAGE(SEND_ERROR "${aux_file} does not exist. Run latex on your target file.") ENDIF (NOT EXISTS ${aux_file}) LATEX_FILE_MATCH(newglossary_lines ${aux_file} "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "@newglossary{main}{glg}{gls}{glo}" ) LATEX_FILE_MATCH(istfile_line ${aux_file} "@istfilename[ \t]*{([^}]*)}" "@istfilename{${LATEX_TARGET}.ist}" ) STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1" istfile ${istfile_line} ) FOREACH(newglossary ${newglossary_lines}) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "\\1" glossary_name ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\2" glossary_log ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\3" glossary_out ${newglossary} ) STRING(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\4" glossary_in ${newglossary} ) MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}") EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in} ) ENDFOREACH(newglossary) ENDMACRO(LATEX_MAKEGLOSSARIES) ############################################################################# # Helper macros for establishing LaTeX build. ############################################################################# MACRO(LATEX_NEEDIT VAR NAME) IF (NOT ${VAR}) MESSAGE(SEND_ERROR "I need the ${NAME} command.") ENDIF(NOT ${VAR}) ENDMACRO(LATEX_NEEDIT) MACRO(LATEX_WANTIT VAR NAME) IF (NOT ${VAR}) MESSAGE(STATUS "I could not find the ${NAME} command.") ENDIF(NOT ${VAR}) ENDMACRO(LATEX_WANTIT) MACRO(LATEX_SETUP_VARIABLES) SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}" CACHE PATH "If non empty, specifies the location to place LaTeX output." ) FIND_PACKAGE(LATEX) MARK_AS_ADVANCED(CLEAR LATEX_COMPILER PDFLATEX_COMPILER BIBTEX_COMPILER MAKEINDEX_COMPILER DVIPS_CONVERTER PS2PDF_CONVERTER LATEX2HTML_CONVERTER ) LATEX_NEEDIT(LATEX_COMPILER latex) LATEX_WANTIT(PDFLATEX_COMPILER pdflatex) LATEX_NEEDIT(BIBTEX_COMPILER bibtex) LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex) LATEX_WANTIT(DVIPS_CONVERTER dvips) LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf) LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html) SET(LATEX_COMPILER_FLAGS "-interaction=nonstopmode" CACHE STRING "Flags passed to latex.") SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS} CACHE STRING "Flags passed to pdflatex.") SET(BIBTEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to bibtex.") SET(MAKEINDEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeindex.") SET(MAKEGLOSSARIES_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeglossaries.") SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter" CACHE STRING "Flags passed to dvips.") SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode" CACHE STRING "Flags passed to ps2pdf.") SET(LATEX2HTML_CONVERTER_FLAGS "" CACHE STRING "Flags passed to latex2html.") MARK_AS_ADVANCED( LATEX_COMPILER_FLAGS PDFLATEX_COMPILER_FLAGS BIBTEX_COMPILER_FLAGS MAKEINDEX_COMPILER_FLAGS MAKEGLOSSARIES_COMPILER_FLAGS DVIPS_CONVERTER_FLAGS PS2PDF_CONVERTER_FLAGS LATEX2HTML_CONVERTER_FLAGS ) SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS) SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS) SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS) SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS) SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS) FIND_PROGRAM(IMAGEMAGICK_CONVERT convert DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)." ) IF (NOT IMAGEMAGICK_CONVERT) MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.") ENDIF (NOT IMAGEMAGICK_CONVERT) OPTION(LATEX_SMALL_IMAGES "If on, the raster images will be converted to 1/6 the original size. This is because papers usually require 600 dpi images whereas most monitors only require at most 96 dpi. Thus, smaller images make smaller files for web distributation and can make it faster to read dvi files." OFF) IF (LATEX_SMALL_IMAGES) SET(LATEX_RASTER_SCALE 16) SET(LATEX_OPPOSITE_RASTER_SCALE 100) ELSE (LATEX_SMALL_IMAGES) SET(LATEX_RASTER_SCALE 100) SET(LATEX_OPPOSITE_RASTER_SCALE 16) ENDIF (LATEX_SMALL_IMAGES) # Just holds extensions for known image types. They should all be lower case. SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps) SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS) SET(LATEX_DVI_IMAGE_EXTENSIONS ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}) SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf) SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg) SET(LATEX_PDF_IMAGE_EXTENSIONS ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) SET(LATEX_IMAGE_EXTENSIONS ${LATEX_DVI_IMAGE_EXTENSIONS} ${LATEX_PDF_IMAGE_EXTENSIONS}) ENDMACRO(LATEX_SETUP_VARIABLES) MACRO(LATEX_GET_OUTPUT_PATH var) SET(${var}) IF (LATEX_OUTPUT_PATH) IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") SET(${var} "${LATEX_OUTPUT_PATH}") ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") ELSE (LATEX_OUTPUT_PATH) IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") SET(${var} "${CMAKE_CURRENT_BINARY_DIR}") ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") ENDIF (LATEX_OUTPUT_PATH) ENDMACRO(LATEX_GET_OUTPUT_PATH) MACRO(LATEX_ADD_CONVERT_COMMAND output_path input_path output_extension input_extension flags) SET (converter ${IMAGEMAGICK_CONVERT}) SET (convert_flags "") # ImageMagick has broken eps to pdf conversion # use ps2pdf instead IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") IF (PS2PDF_CONVERTER) SET (converter ${PS2PDF_CONVERTER}) SET (convert_flags "-dEPSCrop ${flags}") ELSE (PS2PDF_CONVERTER) MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.") ENDIF (PS2PDF_CONVERTER) ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") SET (convert_flags ${flags}) ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") ADD_CUSTOM_COMMAND(OUTPUT ${output_path} COMMAND ${converter} ARGS ${convert_flags} ${input_path} ${output_path} DEPENDS ${input_path} ) ENDMACRO(LATEX_ADD_CONVERT_COMMAND) # Makes custom commands to convert a file to a particular type. MACRO(LATEX_CONVERT_IMAGE output_files input_file output_extension convert_flags output_extensions other_files) SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) LATEX_GET_OUTPUT_PATH(output_dir) GET_FILENAME_COMPONENT(extension "${input_file}" EXT) STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file "${input_file}") LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions}) IF (is_type) IF (convert_flags) LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) ELSE (convert_flags) # As a shortcut, we can just copy the file. ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file} DEPENDS ${input_dir}/${input_file} ) SET(${output_files} ${${output_files}} ${output_dir}/${input_file}) ENDIF (convert_flags) ELSE (is_type) SET(do_convert TRUE) # Check to see if there is another input file of the appropriate type. FOREACH(valid_extension ${output_extensions}) STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file "${input_file}") LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files}) IF (has_native_file) SET(do_convert FALSE) ENDIF (has_native_file) ENDFOREACH(valid_extension) # If we still need to convert, do it. IF (do_convert) LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) ENDIF (do_convert) ENDIF (is_type) ENDMACRO(LATEX_CONVERT_IMAGE) # Adds custom commands to process the given files for dvi and pdf builds. # Adds the output files to the given variables (does not replace). MACRO(LATEX_PROCESS_IMAGES dvi_outputs pdf_outputs) LATEX_GET_OUTPUT_PATH(output_dir) FOREACH(file ${ARGN}) IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") GET_FILENAME_COMPONENT(extension "${file}" EXT) SET(convert_flags) # Check to see if we need to downsample the image. LATEX_LIST_CONTAINS(is_raster extension ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) IF (LATEX_SMALL_IMAGES) IF (is_raster) SET(convert_flags -resize ${LATEX_RASTER_SCALE}%) ENDIF (is_raster) ENDIF (LATEX_SMALL_IMAGES) # Make sure the output directory exists. GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH) MAKE_DIRECTORY("${path}") # Do conversions for dvi. LATEX_CONVERT_IMAGE(${dvi_outputs} "${file}" .eps "${convert_flags}" "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") # Do conversions for pdf. IF (is_raster) LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .png "${convert_flags}" "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") ELSE (is_raster) LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .pdf "${convert_flags}" "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") ENDIF (is_raster) ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") MESSAGE("Could not find file \"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"") ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") ENDFOREACH(file) ENDMACRO(LATEX_PROCESS_IMAGES) MACRO(ADD_LATEX_IMAGES) MESSAGE("The ADD_LATEX_IMAGES macro is deprecated. Image directories are specified with LATEX_ADD_DOCUMENT.") ENDMACRO(ADD_LATEX_IMAGES) MACRO(LATEX_COPY_GLOBBED_FILES pattern dest) FILE(GLOB file_list ${pattern}) FOREACH(in_file ${file_list}) GET_FILENAME_COMPONENT(out_file ${in_file} NAME) CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY) ENDFOREACH(in_file) ENDMACRO(LATEX_COPY_GLOBBED_FILES) MACRO(LATEX_COPY_INPUT_FILE file) LATEX_GET_OUTPUT_PATH(output_dir) IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) GET_FILENAME_COMPONENT(path ${file} PATH) FILE(MAKE_DIRECTORY ${output_dir}/${path}) LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE}) IF (use_config) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} @ONLY ) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS ${CMAKE_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) ELSE (use_config) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) ENDIF (use_config) ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) IF (EXISTS ${output_dir}/${file}) # Special case: output exists but input does not. Assume that it was # created elsewhere and skip the input file copy. ELSE (EXISTS ${output_dir}/${file}) MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") ENDIF (EXISTS ${output_dir}/${file}) ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) ENDMACRO(LATEX_COPY_INPUT_FILE) ############################################################################# # Commands provided by the UseLATEX.cmake "package" ############################################################################# MACRO(LATEX_USAGE command message) MESSAGE(SEND_ERROR "${message}\nUsage: ${command}(\n [BIBFILES ...]\n [INPUTS ...]\n [IMAGE_DIRS ...]\n [IMAGES \n [CONFIGURE ...]\n [DEPENDS ...]\n [USE_INDEX] [USE_GLOSSARY] [DEFAULT_PDF] [MANGLE_TARGET_NAMES])" ) ENDMACRO(LATEX_USAGE command message) # Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the # variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and # LATEX_INPUTS. MACRO(PARSE_ADD_LATEX_ARGUMENTS command) LATEX_PARSE_ARGUMENTS( LATEX "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS" "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;DEFAULT_PDF;MANGLE_TARGET_NAMES" ${ARGN} ) # The first argument is the target latex file. IF (LATEX_DEFAULT_ARGS) LATEX_CAR(LATEX_MAIN_INPUT ${LATEX_DEFAULT_ARGS}) LATEX_CDR(LATEX_DEFAULT_ARGS ${LATEX_DEFAULT_ARGS}) GET_FILENAME_COMPONENT(LATEX_TARGET ${LATEX_MAIN_INPUT} NAME_WE) ELSE (LATEX_DEFAULT_ARGS) LATEX_USAGE(${command} "No tex file target given to ${command}.") ENDIF (LATEX_DEFAULT_ARGS) IF (LATEX_DEFAULT_ARGS) LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}") ENDIF (LATEX_DEFAULT_ARGS) # Backward compatibility between 1.6.0 and 1.6.1. IF (LATEX_USE_GLOSSARIES) SET(LATEX_USE_GLOSSARY TRUE) ENDIF (LATEX_USE_GLOSSARIES) ENDMACRO(PARSE_ADD_LATEX_ARGUMENTS) MACRO(ADD_LATEX_TARGETS) LATEX_GET_OUTPUT_PATH(output_dir) PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV}) # Set up target names. IF (LATEX_MANGLE_TARGET_NAMES) SET(dvi_target ${LATEX_TARGET}_dvi) SET(pdf_target ${LATEX_TARGET}_pdf) SET(ps_target ${LATEX_TARGET}_ps) SET(safepdf_target ${LATEX_TARGET}_safepdf) SET(html_target ${LATEX_TARGET}_html) SET(auxclean_target ${LATEX_TARGET}_auxclean) ELSE (LATEX_MANGLE_TARGET_NAMES) SET(dvi_target dvi) SET(pdf_target pdf) SET(ps_target ps) SET(safepdf_target safepdf) SET(html_target html) SET(auxclean_target auxclean) ENDIF (LATEX_MANGLE_TARGET_NAMES) # For each directory in LATEX_IMAGE_DIRS, glob all the image files and # place them in LATEX_IMAGES. FOREACH(dir ${LATEX_IMAGE_DIRS}) FOREACH(extension ${LATEX_IMAGE_EXTENSIONS}) FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) FOREACH(file ${files}) GET_FILENAME_COMPONENT(filename ${file} NAME) SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename}) ENDFOREACH(file) ENDFOREACH(extension) ENDFOREACH(dir) SET(dvi_images) SET(pdf_images) LATEX_PROCESS_IMAGES(dvi_images pdf_images ${LATEX_IMAGES}) SET(make_dvi_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_pdf_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images}) SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images}) FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input}) SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input}) ENDFOREACH(input) IF (LATEX_BIBFILES) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) FOREACH (bibfile ${LATEX_BIBFILES}) SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile}) SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile}) ENDFOREACH (bibfile ${LATEX_BIBFILES}) ENDIF (LATEX_BIBFILES) IF (LATEX_USE_INDEX) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) ENDIF (LATEX_USE_INDEX) IF (LATEX_USE_GLOSSARY) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${CMAKE_COMMAND} -D LATEX_BUILD_COMMAND=makeglossaries -D LATEX_TARGET=${LATEX_TARGET} -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} -P ${LATEX_USE_LATEX_LOCATION} ) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${CMAKE_COMMAND} -D LATEX_BUILD_COMMAND=makeglossaries -D LATEX_TARGET=${LATEX_TARGET} -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} -P ${LATEX_USE_LATEX_LOCATION} ) ENDIF (LATEX_USE_GLOSSARY) SET(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) SET(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) # Add commands and targets for building dvi outputs. ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi COMMAND ${make_dvi_command} DEPENDS ${make_dvi_depends} ) IF (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${dvi_target} DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ELSE (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${dvi_target} ALL DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ENDIF (LATEX_DEFAULT_PDF) # Add commands and targets for building pdf outputs (with pdflatex). IF (PDFLATEX_COMPILER) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf COMMAND ${make_pdf_command} DEPENDS ${make_pdf_depends} ) IF (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${pdf_target} ALL DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) ELSE (LATEX_DEFAULT_PDF) ADD_CUSTOM_TARGET(${pdf_target} DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) ENDIF (LATEX_DEFAULT_PDF) ENDIF (PDFLATEX_COMPILER) IF (DVIPS_CONVERTER) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) ADD_CUSTOM_TARGET(${ps_target} DEPENDS ${output_dir}/${LATEX_TARGET}.ps) IF (PS2PDF_CONVERTER) # Since both the pdf and safepdf targets have the same output, we # cannot properly do the dependencies for both. When selecting safepdf, # simply force a recompile every time. ADD_CUSTOM_TARGET(${safepdf_target} ${CMAKE_COMMAND} -E chdir ${output_dir} ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf ) ADD_DEPENDENCIES(${safepdf_target} ${ps_target}) ENDIF (PS2PDF_CONVERTER) ENDIF (DVIPS_CONVERTER) IF (LATEX2HTML_CONVERTER) ADD_CUSTOM_TARGET(${html_target} ${CMAKE_COMMAND} -E chdir ${output_dir} ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT} ) ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) ENDIF (LATEX2HTML_CONVERTER) ADD_CUSTOM_TARGET(${auxclean_target} ${CMAKE_COMMAND} -E remove ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.idx ${output_dir}/${LATEX_TARGET}.ind ) ENDMACRO(ADD_LATEX_TARGETS) MACRO(ADD_LATEX_DOCUMENT) LATEX_GET_OUTPUT_PATH(output_dir) IF (output_dir) PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV}) LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT}) FOREACH (bib_file ${LATEX_BIBFILES}) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} COPYONLY) ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${bib_file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ) ENDFOREACH (bib_file) FOREACH (input ${LATEX_INPUTS}) LATEX_COPY_INPUT_FILE(${input}) ENDFOREACH(input) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir}) LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir}) ADD_LATEX_TARGETS(${ARGV}) ENDIF (output_dir) ENDMACRO(ADD_LATEX_DOCUMENT) ############################################################################# # Actually do stuff ############################################################################# IF (LATEX_BUILD_COMMAND) SET(command_handled) IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) LATEX_MAKEGLOSSARIES() SET(command_handled TRUE) ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) IF (NOT command_handled) MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") ENDIF (NOT command_handled) ELSE (LATEX_BUILD_COMMAND) # Must be part of the actual configure (included from CMakeLists.txt). LATEX_SETUP_VARIABLES() ENDIF (LATEX_BUILD_COMMAND) MoarVM-2015.11/3rdparty/dyncall/buildsys/dynmake/Makefile.base.M0000644000175000017500000000362412456307246023316 0ustar jnthnjnthn#include "../../dyncall/dyncall_macros.h" #if defined(DC_WINDOWS) && defined(MAKE_CMD_nmake) /* Abstractions */ #define _(X) $(X) /* Standard variables */ #define _L(X) X.lib #define _O(X) X.obj #define TARGET @ #define PREREQS ** /* Makefile internal vars for platform abstraction */ MAKEFLAGS_USER = /NOLOGO MAKEFLAG_FILE = /f MAKE_DEFAULT_FILE = dynMakefile SHELL_COMMAND_SEPARATOR = && AR = lib ARFLAGS_USER = /NOLOGO ARFLAGS = ARFLAG_OUT_PREFIX = /OUT: CFLAGS_USER = /nologo /I..\dyncall /I..\dyncallback CFLAGS = _(CFLAGS) _(CFLAGS_USER) LDFLAGS_USER = /nologo /L..\dyncall /L..\dyncallback LDFLAGS = _(LDFLAGS) _(LDFLAGS_USER) LDFLAG_IN_PREFIX = LDFLAG_OUT_PREFIX = /OUT: ASFLAGS_USER = /nologo AFLAGS = _(AFLAGS) _(ASFLAGS_USER) /* Set AFLAGS (without 'S'), which is the standard nmake predefined macro for MASM */ ASFLAGS = _(AFLAGS) RM = del .SUFFIXES : .S .S.obj: cl /nologo /EP $< > $*.asm _(AS) _(ASFLAGS) /c $*.asm del $*.asm #else /* Abstractions */ #define _(X) ${X} /* Standard variables */ #define _L(X) lib##X.a #define _O(X) X.o #define TARGET @ #if defined(MAKE_CMD_gmake) || (defined(DC__OS_Linux) && !defined(MAKE_CMD_bsdmake)) || (defined(DC__OS_Darwin) && !defined(MAKE_CMD_bsdmake)) || (defined(DC__OS_SunOS) && !defined(MAKE_CMD_bsdmake)) # define PREREQS ^ #else # define PREREQS > #endif /* Makefile internal vars for platform abstraction */ MAKEFLAGS_USER = MAKEFLAG_FILE = -f MAKE_DEFAULT_FILE = dynMakefile SHELL_COMMAND_SEPARATOR = ; ARFLAG_OUT_PREFIX = CFLAGS_USER = -I ../dyncall -I ../dyncallback CFLAGS += _(CFLAGS_USER) LDFLAGS_USER = -L../../dyncall -L../../dyncallback LDFLAGS += _(LDFLAGS_USER) LDFLAG_IN_PREFIX = -l LDFLAG_OUT_PREFIX = -o ASFLAGS_USER = RM = rm -f #endif MoarVM-2015.11/3rdparty/dyncall/buildsys/dynmake/dynmake.bat0000644000175000017500000000014212456307246022662 0ustar jnthnjnthncl /nologo /DMAKE_CMD_%~n2 /EP Makefile.M 1> Makefile.dynmake %2 /NOLOGO /f Makefile.dynmake %1 MoarVM-2015.11/3rdparty/dyncall/buildsys/dynmake/dynmake.sh0000644000175000017500000000027112456307246022531 0ustar jnthnjnthn#!/bin/sh #cpp -D MAKE_CMD_$2 -P Makefile.M | sed "s/^ */ /" > Makefile.dynmake gcc -D MAKE_CMD_$2 -E -P -x c Makefile.M | sed "s/^ */ /" > Makefile.dynmake $2 -f Makefile.dynmake $1 MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/Makefile0000644000175000017500000000027212456307246021337 0ustar jnthnjnthnDL=wget all: lua-5.1.4 lua-5.1.4.tar.gz: ${DL} http://www.lua.org/ftp/lua-5.1.4.tar.gz lua-5.1.4: lua-5.1.4.tar.gz gunzip -c $? | tar xf - clean: rm -rf lua-5.1.4.tar.gz lua-5.1.4 MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/README.txt0000644000175000017500000000013112456307246021367 0ustar jnthnjnthnThis helper folder is used to bootstrap lua on platforms where there is no lua at all. MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/bootstrap.sh0000755000175000017500000000063112456307246022252 0ustar jnthnjnthn#!/bin/sh if [ -z "${DL}" ]; then DL=wget fi case `uname -s` in Darwin) LPLAF=macosx ;; Linux) LPLAF=linux ;; FreeBSD) LPLAF=freebsd ;; SunOS) LPLAF=solaris ;; AIX) LPLAF=aix ;; DragonFly) LPLAF=bsd ;; *BSD) LPLAF=bsd ;; *) LPLAF=posix ;; esac DL="${DL}" make -f `dirname $0`/Makefile lua-5.1.4 (cd lua-5.1.4; make ${LPLAF}) MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/cleanup.sh0000755000175000017500000000010512456307246021660 0ustar jnthnjnthn#!/bin/sh if [ -d lua-5.1.4 ]; then (cd lua-5.1.4;make clean) fi MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/mkfile0000644000175000017500000000226312456307246021073 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// VER = 5.1.4 LUA = lua-$VER TGZ = $LUA.tar.gz all:V: hget http://www.lua.org/ftp/$TGZ > $TGZ tar -xf $TGZ cd $LUA/src rm luac.c pcc *.c mv 8.out ../../lua cd ../.. rm -rf $LUA $TGZ MoarVM-2015.11/3rdparty/dyncall/buildsys/lua/setenv.sh0000644000175000017500000000005512456307246021536 0ustar jnthnjnthn# PATH=$PWD/lua-5.1.4/src:$PATH export PATH MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/app.mk0000644000175000017500000000233312456307246020636 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # Set Plan9's mk variables. TARG = ${APPLICATION} OFILES = `{echo $UNITS | sed 's/ |$/.$O /g'} LIB = $LIBS # Add some targets to create a local copy of the bin, named as desired. all:V: $TARG $TARG: $O.out cp $O.out $TARG MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/dirs.mk0000644000175000017500000000221112456307246021012 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// all: dirs dirs:VQ: $DIRS for (i in $DIRS) @{ echo Handling sub-directory $i... cd $i && rfork && rm /env/DIRS && $MK -f mkfile $MKFLAGS } MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/epilog.mk0000644000175000017500000000262012456307246021334 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # If we have subdirectories, handle them. <|if(! ~ x$DIRS x) { cat $TOP/buildsys/mk/dirs.mk }; echo # If we have a library to build, include lib.mk, if it is an application, # include app.mk, etc.. <|if(! ~ x$LIBRARY x) { cat $TOP/buildsys/mk/lib.mk /sys/src/cmd/mklib }; echo <|if(! ~ x$APPLICATION x) { cat $TOP/buildsys/mk/app.mk /sys/src/cmd/mkone }; echo # Overrides. <$TOP/buildsys/mk/pcc.mk MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/lib.mk0000644000175000017500000000213012456307246020617 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # Set Plan9's mk variables. LIB = lib${LIBRARY}_s.a$O OFILES = `{echo $UNITS | sed 's/ |$/.$O /g'} MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/pcc.mk0000644000175000017500000000704512456307246020630 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #@@@ add stuff for crosscompiling here. CC = pcc LD = pcc #@@@.if $(BUILD_CONFIG) == "debug" #@@@ add -g option or similar #@@@.endif CPPFLAGS = -D__Plan9__ -D__${objtype}__ CFLAGS = -D__Plan9__ -D__${objtype}__ -I$TOP/dyncall -I$TOP/dyncallback -c #CXXFLAGS = $CXXFLAGS -D__Plan9__ #ASFLAGS = -D__Plan9__ # JUST TEMPORARY AS LONG AS I'M WORKING ON IT - Plan9's sed doesn't support sed comments # /^$/d # Remove empty lines. # /^#.*/d # Remove comments. # s/^\.(globl|intel_syntax|file|section).*// # Remove some GAS directives. # s/(.*):/TEXT \1(SB), $0/g # Reformat function names. # s/%//g # Remove % register prefixes. # /^[ ]+/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ # Convert everything to uppercase. # s/([A-Z]+)[ ]*E(..)[, ]*E(..)/\1L \3, \2/ # Convert 32bit instructions with 2 register operands. # s/([A-Z]+)[ ]*E(..)[, ]*([0-9]+)/\1L $\3, \2/ # Convert 32bit instructions with register and constant as # s/([A-Z]+)[ ]*E(..)[, ]*\[E(..)\+([0-9]+)\]/\1L \4(\3), \2/ # Convert 32bit instructions with register and address as # s/([A-Z]+)[ ]*E(..)[, ]*\[E(..)\]/\1L 0(\3), \2/ # Convert 32bit instructions with register and address as # s/(CALL)[ ]*E(..)[ ]*$/\1 \2/ # Convert CALL instructions. # s/(CALL)[ ]*\[E(..)\+([0-9]+)\]/\1 \3(\2)/ # Convert CALL instructions with addressing mode. # s/([A-Z]+)[ ]*E(..)[ ]*$/\1L \2/ # Convert 32bit instructions with register operand. # s/([A-Z]+)[ ]*\[E(..)\+([0-9]+)\]/\1L \3(\2)/ # Convert 32bit instructions with address operand. # s/([A-Z]+)[ ]*\[E(..)\]/\1L 0(\2)/ # Convert 32bit instructions with address operand. # s/(REP)[ ]*(MOV)SB[ ]*$/\1; \2B SI, DI/ # Convert repeater prefix stuff. # s/(REP)[ ]*(MOV)SD[ ]*$/\1; \2L SI, DI/ # Convert repeater prefix stuff. # Step to transform .S into object files. %.$O: %.S cp $prereq $prereq.c pcc -E $CPPFLAGS $prereq.c > $stem.s # replace with cpp? pcc requires .c suffix rm $prereq.c $AS $AFLAGS $stem.s rm $stem.s MoarVM-2015.11/3rdparty/dyncall/buildsys/mk/prolog.mk0000644000175000017500000000240612456307246021361 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # 'all' is always our default target. all: , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # common nmake rules # common.nmake # #/////////////////////////////////////////////////// build: dirs $(TARGETS) dirs: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile && cd .. # !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $** && cd .. !ENDIF clean: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $@ && cd .. !ENDIF !IF (DEFINED(TARGETS) && "$(TARGETS)" != "") || (DEFINED(OBJS) && "$(OBJS)" != "") echo Cleaning $(MAKEDIR) ... del $(TARGETS) *.exp *.lib $(OBJS) # del $(TARGETS) $(TARGETS:.exe=.lib) $(TARGETS:.dll=.lib) $(TARGETS:.exe=.exp) $(TARGETS:.dll=.exp) $(OBJS) !ENDIF distclean: $(DIRS) !IF DEFINED(DIRS) && "$(DIRS)" != "" !echo Handling sub-directory $** ... && cd $** && $(MAKE) /NOLOGO /F Nmakefile $@ && cd .. !ENDIF !IF DEFINED(AUTOS) && "$(AUTOS)" != "" echo Cleaning auto-generated files in $(MAKEDIR) ... del $(AUTOS) !ENDIF !IF (DEFINED(TARGETS) && "$(TARGETS)" != "") || (DEFINED(OBJS) && "$(OBJS)" != "") echo Cleaning $(MAKEDIR) ... del $(TARGETS) *.exp *.lib $(OBJS) # del $(TARGETS) $(TARGETS:.exe=.lib) $(TARGETS:.dll=.lib) $(TARGETS:.exe=.exp) $(TARGETS:.dll=.exp) $(OBJS) !ENDIF MoarVM-2015.11/3rdparty/dyncall/buildsys/nmake/epilog.nmake0000644000175000017500000000224112456307246022503 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake rules # epilog.nmake # #/////////////////////////////////////////////////// !INCLUDE common.nmake MoarVM-2015.11/3rdparty/dyncall/buildsys/nmake/prolog.nmake0000644000175000017500000000417612456307246022537 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake rules # prolog.nmake # #/////////////////////////////////////////////////// .SILENT: # Default "build all" target. all: configure build # Check if library has been 'configured' properly. If not, tell the user and abort. !IF !DEFINED(CONFIG_OS) || !DEFINED(CONFIG_ARCH) configure: $(TOP)\ConfigVars $(TOP)\ConfigVars: echo "Library not configured properly! Run configure.bat from the library's root directory first!" !ELSE configure: !ENDIF # Include config rules. !IF EXISTS($(TOP)\ConfigVars) ! INCLUDE $(TOP)\ConfigVars !ENDIF # Include site rules. !IF EXISTS($(TOP)\SiteVars) ! INCLUDE $(TOP)\SiteVars !ENDIF # set BUILD_* from CONFIG_* variables !IF !DEFINED(BUILD_HOST) BUILD_HOST = $(CONFIG_HOST) !ENDIF !IF !DEFINED(BUILD_OS) BUILD_OS = $(CONFIG_OS) !ENDIF !IF !DEFINED(BUILD_ARCH) BUILD_ARCH = $(CONFIG_ARCH) !ENDIF !IF !DEFINED(BUILD_TOOL) BUILD_TOOL = $(CONFIG_TOOL) !ENDIF !IF !DEFINED(BUILD_ASM) BUILD_ASM = $(CONFIG_ASM) !ENDIF !IF !DEFINED(BUILD_CONFIG) BUILD_CONFIG = $(CONFIG_CONFIG) !ENDIF !IF "$(BUILD_TOOL)" != "" ! INCLUDE tool_$(BUILD_TOOL).nmake !ENDIF MoarVM-2015.11/3rdparty/dyncall/buildsys/nmake/tool_gcc.nmake0000644000175000017500000000504412456307246023021 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # GCC nmake rules # tool_gcc.nmake # #/////////////////////////////////////////////////// CC =arm-eabi-gcc CXX =arm-eabi-g++ AR =arm-eabi-ar AS =arm-eabi-as LD =arm-eabi-g++#arm-eabi-ld OCP =arm-eabi-objcopy !IF "$(BUILD_ARCH)" == "arm32_thumb" ASFLAGS = -g -mthumb -mthumb-interwork CFLAGS = -g -Wall -O2 -I$(TOP)\dyncall -I$(TOP)\dyncallback -fomit-frame-pointer -ffast-math -fno-strict-aliasing -mthumb -mthumb-interwork CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions LDFLAGS = -g -mno-fpu -mthumb -mthumb-interwork ARFLAGS = !ELSE IF "$(BUILD_ARCH)" == "arm32_arm" ASFLAGS = -g CFLAGS = -g -Wall -O2 -I$(TOP)\dyncall -I$(TOP)\dyncallback -fomit-frame-pointer -ffast-math -fno-strict-aliasing CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions LDFLAGS = -g -mno-fpu ARFLAGS = !ENDIF !IF "$(BUILD_OS)" == "nds" CFLAGS = $(CFLAGS) -DARM9 -mcpu=arm9tdmi -mtune=arm9tdmi -D__nds__ -I"$(DEVKITPRO_PATH)/libnds/include" CXXFLAGS = $(CXXFLAGS) -D__nds__ -I"$(DEVKITPRO_PATH)/libnds/include" LDFLAGS = $(LDFLAGS) -specs=ds_arm9.specs !ENDIF .SUFFIXES: .SUFFIXES: .o .so .a .arm9 .nds .pdf .c .cpp .S .tex .cc .S.o: echo .S.o: Assembling $< ... $(CC) $(ASFLAGS) $(CFLAGS) -o $@ -c $< .c.o: echo .c.o: Compiling $< ... $(CC) $(CFLAGS) -o $@ -c $< .cpp.o: echo .cpp.o: Compiling $< ... $(CXX) $(CXXFLAGS) -o $@ -c $< .cc.o: echo .cc.o: Compiling $< ... $(CXX) $(CXXFLAGS) -o $@ -c $< .tex.pdf: pdflatex $< MoarVM-2015.11/3rdparty/dyncall/buildsys/nmake/tool_msvc.nmake0000644000175000017500000000360012456307246023231 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # MSVC nmake rules # tool_MSVC.nmake # #/////////////////////////////////////////////////// CC =cl CXX =cl AR =lib !IF "$(BUILD_ARCH)" == "x64" AS =ml64 !ELSE IF "$(BUILD_ARCH)" == "x86" AS =ml !ENDIF LD =link ASFLAGS = /c /nologo CFLAGS = /EHsc /GR- /GS- /Ox /c /nologo /I$(TOP)\dyncall /I$(TOP)\dyncallback CXXFLAGS = $(CFLAGS) LDFLAGS = /OPT:REF /OPT:ICF /NOLOGO ARFLAGS = /NOLOGO .SUFFIXES: .SUFFIXES: .obj .exe .dll .lib .pdf .c .cpp .asm .tex .cc .asm.obj: echo .asm.obj: Assembling $< ... $(AS) $(ASFLAGS) /Fo$@ $< .c.obj: echo .c.obj: Compiling $< ... $(CC) $(CFLAGS) /Fo$@ $< .cpp.obj: echo .cpp.obj: Compiling $< ... $(CXX) $(CXXFLAGS) /Fo$@ $< .cc.obj: echo .cc.obj: Compiling $< ... $(CXX) $(CXXFLAGS) /Fo$@ $< .tex.pdf: pdflatex $< MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/batch-build-linux.sh0000644000175000017500000000037312502366750024453 0ustar jnthnjnthn# Build libraries. make -f Makefile.generc clean all # Build tests: dynload tests need '-ldl'. ( cd test ; make -f Makefile.generic clean ) ( cd test ; LDLIBS=-ldl make -f Makefile.generic all-dynload ) ( cd test ; make -f Makefile.generic all ) MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/batch-build-minix.sh0000644000175000017500000000051012456307246024434 0ustar jnthnjnthn#!/bin/sh # ---------------------------------------------------------- # # DynCall build script using Makefile.generic on Minix 3.1.8 # # ---------------------------------------------------------- # # build libs and tests, but exclude dynload ./configure make libdyncall libdyncallback tests-libdyncallback tests-libdyncall MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/batch-build-psp.sh0000644000175000017500000000053612456307246024122 0ustar jnthnjnthn#!/bin/sh # ------------------------------------------------------------- # # DynCall build script using Makefile.generic for PSP toolchain # # ------------------------------------------------------------- # # build libs and tests, but exclude dynload ./configure --target=PSP make libdyncall libdyncallback tests-libdyncallback tests-libdyncall MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/conf-nds.bat0000644000175000017500000000304012456307246023000 0ustar jnthnjnthn@ECHO OFF REM /////////////////////////////////////////////////////////////////////////// REM REM Copyright (c) 2007-2009 Daniel Adler , REM Tassilo Philipp REM REM Permission to use, copy, modify, and distribute this software for any REM purpose with or without fee is hereby granted, provided that the above REM copyright notice and this permission notice appear in all copies. REM REM THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES REM WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF REM MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR REM ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES REM WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN REM ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF REM OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. REM REM /////////////////////////////////////////////////////////////////////////// REM We need at least 2 characters in the path. IF [%DEVKITPRO:~0,1%]==[%DEVKITPRO%] ( GOTO END_ABORT ) REM Extract devkitPro path. IF [%DEVKITPRO:~0,1%]==[/] ( ECHO DEVKITPRO_PATH=%DEVKITPRO:~1,1%:%DEVKITPRO:~2%#>>ConfigVars ) ELSE IF [%DEVKITPRO:~1,1%]==[:] ( ECHO DEVKITPRO_PATH=%DEVKITPRO%#>>ConfigVars ) ELSE ( GOTO END_ABORT ) GOTO END :END_ABORT ECHO ERROR: Environment variable DEVKITPRO must be set to absolute devkitPro path. DEL ConfigVars :END MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/setenv-cross-ios.sh0000644000175000017500000000033312456307246024362 0ustar jnthnjnthn IOS_ARCH="armv6" IOS_SDK_VERSION="4.3" export TARGET_MACH="-arch ${IOS_ARCH}" export TARGET_ARCH="-arch ${IOS_ARCH} -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${IOS_SDK_VERSION}.sdk" MoarVM-2015.11/3rdparty/dyncall/buildsys/scripts/setenv-sdk-ios.sh0000644000175000017500000000133212456307246024012 0ustar jnthnjnthn#!/bin/sh #export PATH=`xcode-select -print-path`/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH} DEVELOPER=`xcode-select -print-path` # WORKS: P="${DEVELOPER}/Platforms/iPhoneOS.platform/Developer" P="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain" export MANPATH="$P/usr/share/man:${MANPATH}" export PATH="$P/usr/bin:${PATH}" #if [ -z "${DEVELOPER}" ]; then #DEVELOPER=/Developer #fi #export PATH="${DEVELOPER}/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH}" # export CPATH="$P/usr/include:${CPATH}" #if [ `exec sw_vers -productVersion` ]; then # case `sw_vers -productVersion` in # 10.*) # # ;; # esac #export PATH=${DEVELOPER}/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH} MoarVM-2015.11/3rdparty/dyncall/buildsys/vs2005/dyncall/dyncall.vcproj0000644000175000017500000001162312456307246024360 0ustar jnthnjnthn MoarVM-2015.11/3rdparty/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj0000644000175000017500000001007712456307246025612 0ustar jnthnjnthn MoarVM-2015.11/3rdparty/dyncall/buildsys/vs2005/vs2005.sln0000644000175000017500000000274512456307246021541 0ustar jnthnjnthn Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dyncall", "dyncall\dyncall.vcproj", "{DF67B85F-C8F8-4FB1-A701-867A9C835ABA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_plain", "test_plain\test_plain.vcproj", "{65E1A63C-079D-4F72-8307-E070A499D2EA}" ProjectSection(ProjectDependencies) = postProject {DF67B85F-C8F8-4FB1-A701-867A9C835ABA} = {DF67B85F-C8F8-4FB1-A701-867A9C835ABA} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Debug|Win32.ActiveCfg = Debug|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Debug|Win32.Build.0 = Debug|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Release|Win32.ActiveCfg = Release|Win32 {DF67B85F-C8F8-4FB1-A701-867A9C835ABA}.Release|Win32.Build.0 = Release|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Debug|Win32.ActiveCfg = Debug|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Debug|Win32.Build.0 = Debug|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Release|Win32.ActiveCfg = Release|Win32 {65E1A63C-079D-4F72-8307-E070A499D2EA}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal MoarVM-2015.11/3rdparty/dyncall/configure0000755000175000017500000001304312466674236017176 0ustar jnthnjnthn#!/bin/sh C=Makefile.config # get full path case $0 in /*) FULL=$0 ;; *) FULL=$PWD/$0 ;; esac printf "# auto-generated by $0\n" >$C while [ $# -gt 0 ]; do X=$1 shift 1 # Shell common: case $X in --help|-h|-?) cat < var1=name1.. --prefix= --target= MacOSX,iOS,iPhoneSimulator --sdk= EOF exit 1 ;; # GNU Compatibility: --prefix=*) PREFIX=`printf -- "${X}" | cut -c 10-` ;; --target=*) TARGET=`printf -- "${X}" | cut -c 10-` ;; --sdk=*) SDK=`printf -- "${X}" | cut -c 7-` ;; # Environment variables: [A-Za-z_]*=*) printf "${X}\n" >>$C k=`printf "${X}" | cut -d = -f 1` v=`printf "${X}" | cut -d = -f 2` export $k=$v ;; # Others fail: *) printf "error: invalid option ${X}\n" >&2 exit 1 ;; esac done printf "PREFIX=${PREFIX:=/usr/local}\n" >>$C case ${TARGET:=`uname`} in Linux) if [ -z "${CFLAGS}" ]; then printf "CFLAGS=-fPIC\n" >>$C fi printf "LDLIBS=-lm -ldl\n" >>$C ;; OpenBSD) printf "LDLIBS=-lm\n" >>$C ;; DragonFly) if [ -z "${CFLAGS}" ]; then printf "CFLAGS=-fPIC\n" >>$C fi ;; NetBSD) if [ -z "${CFLAGS}" ]; then printf "CFLAGS=-fPIC\n" >>$C fi printf "LDLIBS=-lm\n" >>$C ;; FreeBSD) if [ -z "${CFLAGS}" ]; then printf "CFLAGS=-fPIC\n" >>$C fi printf "LDLIBS=-lm\n" >>$C printf "RM=rm -f\n" >>$C ;; MacOSX|Darwin) # if Apple's libtool (not to be confused with GNU's) is available, which is according to libtool(1) "with -static [...] intended # to replace ar(5) and ranlib", use it - if it is shadowed by some install of GNU's libtool assume that a foreign environment is # intentionally used, and fall back to using 'ar rs' (the equivalent to 'libtool -static'), for compatibility: if libtool -V >/dev/null 2>/dev/null; then # Apple's libtool has -V for version, which GNU does not. printf "AR=libtool\n" >>$C printf "ARFLAGS=-static -o\n" >>$C else printf "AR=ar\n" >>$C printf "ARFLAGS=rs\n" >>$C fi if [ `uname -n` = 'iPhone' ]; then # building on iPhone itself, uname yields Darwin (gcc setup for current/correct arch) printf "CC=gcc\n" >>$C elif [ -z ${SDK} ]; then case `sw_vers -productVersion` in 10.4.*) ARCHS="-arch ppc -arch i386 -arch x86_64" ;; 10.[56].*) ARCHS="-arch i386 -arch x86_64 -arch ppc" ;; 10.6.*) ARCHS="-arch i386 -arch x86_64" ;; 10.10.*) ARCHS="-arch x86_64 -arch i386" ;; 10.[789].*) ARCHS="-arch x86_64 -arch i386" ;; esac printf "ASFLAGS=${ARCHS}\n" >>$C printf "CFLAGS=${ARCHS}\n" >>$C printf "CXXFLAGS=${ARCHS}\n" >>$C else SDKROOT="`xcode-select -print-path`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${SDK}.sdk" printf "CFLAGS=-isysroot ${SDKROOT}\n" >>$C printf "CXXFLAGS=-isysroot ${SDKROOT}\n" >>$C fi ;; iPhoneOS|iOS) SDKROOT="`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDK}.sdk" case "${SDK}" in 4.3) ARCHS="-arch armv6" ;; 6.1) ARCHS="-arch armv7" ;; 8.1) ARCHS="-arch arm64" ;; esac printf "ASFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "CFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "CXXFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "LDFLAGS=-Wl,-syslibroot ${SDKROOT}\n" >>$C ;; iPhoneSimulator) SDKROOT="`xcode-select -print-path`/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${SDK}.sdk" ARCHS="-arch i386" printf "ASFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "CFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "CXXFLAGS=${ARCHS} -isysroot ${SDKROOT}\n" >>$C printf "LDFLAGS=-Wl,-syslibroot ${SDKROOT}\n" >>$C ;; SunOS) X=`type CC` if [ $? -eq 0 ]; then printf "CXX=CC\n" >>$C fi printf "LDLIBS=-lm\n" >>$C ;; Minix) printf "CC=gcc\n" >>$C printf "CXX=g++\n">>$C printf "AR=ar\n" >>$C ;; PSP) SDKROOT="`psp-config --pspsdk-path`" printf "CC=psp-gcc\n" >>$C printf "CXX=psp-gcc\n">>$C # don't use psp-g++, buggy printf "AR=psp-ar\n" >>$C printf "CFLAGS=-I${SDKROOT}/include/\n" >>$C printf "CXXFLAGS=-I${SDKROOT}/include/\n" >>$C # Pulling in dyncall libs below is a hack, for some reason psp-ld is super-picky about order. # Use your C lib of choice, from the PSPSDK, or... #printf "LDLIBS=-L${SDKROOT}/lib/ -L`dirname ${FULL}`/dyncall -L`dirname ${FULL}`/dyncallback -ldyncall_s -ldyncallback_s -lm -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lstdc++ -lpsplibc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser \n" >>$C # ... newlib. printf "LDLIBS=-L${SDKROOT}/lib/ -L`dirname ${FULL}`/dyncall -L`dirname ${FULL}`/dyncallback -ldyncall_s -ldyncallback_s -lm -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lstdc++ -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser \n" >>$C ;; esac BLDTOP="$PWD" SRCTOP=`dirname ${FULL}` FILES=`( cd $SRCTOP ; find . -name "Makefile.generic" )` for FILE in $FILES ; do SRCFILE="$SRCTOP/$FILE" BLDFILE="$BLDTOP/$FILE" SRCDIR=`dirname $SRCFILE` BLDDIR=`dirname $BLDFILE` mkdir -p "$BLDDIR" cat <$BLDDIR/Makefile VPATH = $SRCDIR include $BLDTOP/Makefile.config include \${VPATH}/Makefile.generic EOF done MoarVM-2015.11/3rdparty/dyncall/configure.bat0000755000175000017500000001201712502366750017731 0ustar jnthnjnthn@ECHO OFF REM /////////////////////////////////////////////////////////////////////////// REM REM Copyright (c) 2007-2009 Daniel Adler , REM Tassilo Philipp REM REM Permission to use, copy, modify, and distribute this software for any REM purpose with or without fee is hereby granted, provided that the above REM copyright notice and this permission notice appear in all copies. REM REM THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES REM WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF REM MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR REM ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES REM WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN REM ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF REM OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. REM REM /////////////////////////////////////////////////////////////////////////// SETLOCAL REM Set default values. SET PACKAGE=dyncall SET CONFIG_HOST=windows SET CONFIG_OS=windows SET CONFIG_TOOL=msvc SET CONFIG_ASM=ml64 SET CONFIG_CONFIG=release IF [%PROCESSOR_ARCHITECTURE%] == [AMD64] ( SET CONFIG_ARCH=x64 ) ELSE IF [%PROCESSOR_ARCHITEW6432%] == [AMD64] ( SET CONFIG_ARCH=x64 ) ELSE ( SET CONFIG_ARCH=x86 SET CONFIG_ASM=ml ) REM Scan arguments. :MAIN_LOOP REM Help. IF [%1]==[] ( GOTO DONE ) ELSE IF [%1]==[/?] ( ECHO. ECHO.dyncall configuration shell-script ECHO.Usage: ECHO. configure.bat [ options ] ECHO. ECHO.Options: ECHO. /? print this page ECHO. ECHO. /prefix PATH set installation prefix ^(GNU make only^) ECHO. /prefix-bd PATH set build directory prefix ^(GNU make only^) ECHO. ^(only for use with gmake^) ECHO. ECHO. /target-x86 build for x86 architecture ^(default^) ECHO. /target-x64 build for x64 architecture ECHO. /target-psp build for PlayStation Portable ^(homebrew SDK^) ECHO. /target-nds-arm build for Nintendo DS ^(devkitPro, ARM mode^) ECHO. /target-nds-thumb build for Nintendo DS ^(devkitPro, THUMB mode^) ECHO. ECHO. /tool-msvc use Microsoft Visual C++ compiler ^(default^) ECHO. /tool-gcc use GNU Compiler Collection ECHO. ECHO. /asm-ml use Microsoft Macro Assembler ^(default^) ECHO. /asm-as use the GNU Assembler ECHO. /asm-nasm use NASM Assembler ECHO. ECHO. /config-release build release version ^(default^) ECHO. /config-debug build debug version GOTO:EOF ) ELSE IF [%1]==[/prefix] ( SET CONFIG_PREFIX=%2 SHIFT ) ELSE IF [%1]==[/prefix-bd] ( SET CONFIG_BUILDPREFIX=%2 SHIFT ) ELSE IF [%1]==[/target-x86] ( SET CONFIG_ARCH=x86 ) ELSE IF [%1]==[/target-x64] ( SET CONFIG_ARCH=x64 ) ELSE IF [%1]==[/target-psp] ( SET CONFIG_ARCH=mips32 SET CONFIG_OS=psp ) ELSE IF [%1]==[/target-nds-arm] ( SET CONFIG_ARCH=arm32_arm SET CONFIG_OS=nds ) ELSE IF [%1]==[/target-nds-thumb] ( SET CONFIG_ARCH=arm32_thumb SET CONFIG_OS=nds ) ELSE IF [%1]==[/tool-gcc] ( SET CONFIG_TOOL=gcc SET CONFIG_ASM=as ) ELSE IF [%1]==[/tool-msvc] ( SET CONFIG_TOOL=msvc SET CONFIG_ASM=ml ) ELSE IF [%1]==[/asm-as] ( SET CONFIG_ASM=as ) ELSE IF [%1]==[/asm-nasm] ( SET CONFIG_ASM=nasm ) ELSE IF [%1]==[/asm-ml] ( SET CONFIG_ASM=ml ) ELSE IF [%1]==[/config-release] ( SET CONFIG_CONFIG=release ) ELSE IF [%1]==[/config-debug] ( SET CONFIG_CONFIG=debug ) ELSE ( ECHO Unknown parameter '%1'. GOTO DONE ) SHIFT GOTO MAIN_LOOP :DONE IF [%CONFIG_PREFIX%]==[] ( SET CONFIG_PREFIX=%CD%\install_%CONFIG_OS%_%CONFIG_ARCH%_%CONFIG_TOOL%_%CONFIG_CONFIG% ) IF [%CONFIG_BUILDPREFIX%]==[] ( SET CONFIG_BUILDPREFIX=%CD%\build_out\%CONFIG_OS%_%CONFIG_ARCH%_%CONFIG_TOOL%_%CONFIG_CONFIG% ) ECHO # auto-generated by configure.bat >ConfigVars ECHO CONFIG_PACKAGE=%PACKAGE%#>>ConfigVars ECHO CONFIG_HOST=%CONFIG_HOST%#>>ConfigVars ECHO CONFIG_OS=%CONFIG_OS%#>>ConfigVars ECHO CONFIG_ARCH=%CONFIG_ARCH%#>>ConfigVars ECHO CONFIG_TOOL=%CONFIG_TOOL%#>>ConfigVars ECHO CONFIG_ASM=%CONFIG_ASM%#>>ConfigVars ECHO CONFIG_CONFIG=%CONFIG_CONFIG%#>>ConfigVars ECHO CONFIG_PREFIX=%CONFIG_PREFIX%#>>ConfigVars ECHO CONFIG_BUILDPREFIX=%CONFIG_BUILDPREFIX%#>>ConfigVars ECHO Writing following configuration to ConfigVars: ECHO. ECHO Host OS: %CONFIG_HOST% ECHO Target OS: %CONFIG_OS% ECHO Target Architecture: %CONFIG_ARCH% ECHO Compiler: %CONFIG_TOOL% ECHO Assembler: %CONFIG_ASM% ECHO Build configuration: %CONFIG_CONFIG% ECHO Install prefix: %CONFIG_PREFIX% ECHO Build prefix: %CONFIG_BUILDPREFIX% REM We have to transform some pathes for the nds/devkitPro build. IF [%CONFIG_OS%]==[nds] ( REM Check if DEVKITPRO is set. IF [%DEVKITPRO%]==[] ( ECHO ERROR: Environment variable DEVKITPRO must be set to absolute devkitPro path. ) ELSE ( buildsys\scripts\conf-nds.bat ) ) MoarVM-2015.11/3rdparty/dyncall/configure.rc0000755000175000017500000001355112456307246017576 0ustar jnthnjnthn#!/bin/rc #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// # --- configure settings ------------------------------------------------------ PACKAGE=dyncall CONFIG_PREFIX=/usr/local #@@@ # --- output error message ---------------------------------------------------- fn error { echo error: $* exit 1 } # --- output warning message -------------------------------------------------- fn warning { echo warning: $* } # --- output info message ----------------------------------------------------- fn info { echo $* } # --- print usage ------------------------------------------------------------- fn usage { echo $PACKAGE' configuration shell-script' echo 'Usage:' echo ' configure [ options ]' echo echo 'Options:' echo ' --help' echo ' -h print this page' #echo #echo ' --target-x86 build for x86 architecture platform' #echo ' --target-x64 build for x64 architecture platform' #echo ' --target-ppc32 build for ppc32 architecture platform' #echo ' --target-arm-arm build for ARM architecture platform (ARM mode)' #echo ' --target-arm-thumb build for ARM architecture platform (THUMB mode)' #echo #echo ' --tool-pcc use Portable C Compiler' #echo #echo ' --asm-xa use Plan9 Assemblers (0a, 1a, 2a, etc.)' #echo #echo ' --config-release build release version (default)' #echo ' --config-debug build debug version' echo exit 0 } # --- guess operating system ------------------------------------------------- CONFIG_OS=() fn guess_os { CONFIG_OS='plan9' info 'guess os '$CONFIG_OS } # --- guess architecture ----------------------------------------------------- CONFIG_ARCH=() fn guess_arch { CONFIG_ARCH='x86' switch($cputype) { case 386 CONFIG_ARCH='x86' case amd64 CONFIG_ARCH='x64' case arm CONFIG_ARCH='arm32_arm' case power CONFIG_ARCH='ppc32' case mips CONFIG_ARCH='mips32' case * warning 'unknown architecture '$cputype' - using default (x86)' } info 'guess arch '$CONFIG_ARCH } # --- guess tool chain ------------------------------------------------------- CONFIG_TOOL=() fn guess_tool { #CONFIG_TOOL=`{grep CC /$objtype/mkfile | sed s/CC.//} CONFIG_TOOL='pcc' info 'guess tool '$CONFIG_TOOL } # --- guess assembler -------------------------------------------------------- CONFIG_ASM=() fn guess_asm { CONFIG_ASM=`{grep AS /$objtype/mkfile | sed s/AS.//} info 'guess assembler '$CONFIG_ASM } # --- process arguments ------------------------------------------------------ fn args { while(! ~ $#* 0 && ~ $1 -*) { OPT=$1 shift switch($OPT) { case --help -h usage #case --target-x86 #CONFIG_ARCH='x86' #case --target-x64 #CONFIG_ARCH='x64' #case --target-ppc32 #CONFIG_ARCH='ppc32' #case --target-arm-arm #CONFIG_ARCH='arm32_arm' #case --target-arm-thumb #CONFIG_ARCH='arm32_thumb' #case --tool-pcc #CONFIG_TOOL=pcc #CONFIG_ASM=2a #case --tool-xa #CONFIG_ASM=2a #case --config-release #CONFIG_CONFIG=release #case --config-debug #CONFIG_CONFIG=debug case * warning 'unknown option '$OPT } } } # --- guess variables -------------------------------------------------------- fn guess { if(~ $#CONFIG_OS 0) { guess_os if(~ $#CONFIG_OS 0) { error 'unsupported operating system '$OS } } if(~ $#CONFIG_ARCH 0) { guess_arch if(~ $#CONFIG_ARCH 0) { error 'unsupported architecture '$ARCH } } if(~ $#CONFIG_TOOL 0) { guess_tool if(~ $#CONFIG_TOOL 0) { error 'no tool' } } if(~ $#CONFIG_ASM 0) { guess_asm if(~ $#CONFIG_ASM 0) { error 'no assembler tool' } } if(~ $#CONFIG_CONFIG 0) { CONFIG_CONFIG=release } } # --- set default variables -------------------------------------------------- fn set_defaults { CONFIG_HOST=$CONFIG_OS } # --- derive variables ------------------------------------------------------- fn derive_vars { BUILD_HOST=$CONFIG_HOST if(! ~ $CONFIG_HOST $CONFIG_OS) { BUILD_HOST=$CONFIG_HOST'_'$CONFIG_OS } } # --- write ConfigVars files ------------------------------------------------ fn output { echo '#auto-generated by '$PACKAGE'/configure' >$1 echo 'CONFIG_PACKAGE='$PACKAGE >>$1 echo 'CONFIG_HOST='$CONFIG_HOST >>$1 echo 'CONFIG_OS='$CONFIG_OS >>$1 echo 'CONFIG_ARCH='$CONFIG_ARCH >>$1 echo 'CONFIG_TOOL='$CONFIG_TOOL >>$1 echo 'CONFIG_ASM='$CONFIG_ASM >>$1 echo 'CONFIG_CONFIG='$CONFIG_CONFIG >>$1 echo 'CONFIG_PREFIX='$CONFIG_PREFIX >>$1 if(! ~ $#CONFIG_BUILDPREFIX 0) { echo 'CONFIG_BUILDPREFIX='$CONFIG_BUILDPREFIX >>$1 } echo '' >>$1 } # --- main ------------------------------------------------------------------- fn main { args $* info '* configure package '$PACKAGE guess set_defaults derive_vars output ConfigVars } main $* MoarVM-2015.11/3rdparty/dyncall/doc/Description.txt0000644000175000017500000000225612456307246021055 0ustar jnthnjnthnDynCall Project The dyncall library encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual "bind argument parameters from left to right and then call" interface allowing programmers to call C functions in a completely dynamic manner. In other words, instead of calling a function directly, the dyncall library provides a mechanism to push the function parameters manually and to issue the call afterwards. This means, that a program can determine at runtime what function to call, and what parameters to pass to it. The library is written in C and assembly and provides a very simple C interface to program against. The library comes in very handy to power flexible message systems, dynamic function call dispatch mechanisms, closure implementations or even to bridge different programming languages. When it comes to language bindings, the dyncall library provides a clean and portable C interface to dynamically issue calls to foreign code using small call kernels written in assembly. Instead of providing code for every bridged function call, which unnecessarily results in code bloat, only a couple of instructions are used to invoke every possible call. MoarVM-2015.11/3rdparty/dyncall/doc/License.txt0000644000175000017500000000150012456307246020143 0ustar jnthnjnthnCopyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. MoarVM-2015.11/3rdparty/dyncall/doc/Makefile.generic0000644000175000017500000000006012456307246021073 0ustar jnthnjnthn.PHONY: all all clean: cd manual && ${MAKE} $@ MoarVM-2015.11/3rdparty/dyncall/doc/README-Cross.txt0000644000175000017500000000106112456307246020607 0ustar jnthnjnthnCross-compilation of dyncall with gcc ===================================== Make sure cross-compile tools are installed and in your path, and set the CC, AR and LD envvars, explicitly (where $PREFIX is arm-eabi, etc., depending on the toolchain to be used): $ export CC=$PREFIX-gcc $ export AR=$PREFIX-ar $ export LD=$PREFIX-ld Also set CXX if you want to build the tests: $ export CXX=$PREFIX-g++ Then, build dyncall - one way would be to simply use Makefile.embedded: $ make -f Makefile.embedded sun $ (cd test; make -f Makefile.embedded) MoarVM-2015.11/3rdparty/dyncall/doc/README.CMake0000644000175000017500000000366212456307246017672 0ustar jnthnjnthnNotes on building DynCall with CMake ==================================== Build with CMake (in-source) ---------------------------- cd On Unix: cmake . make On Windows: cmake . -G "NMake Makefiles" nmake /f Makefile NOTE: Assembly Support is broken for Visual Studio Generators in CMake So we support NMake for now only. Install in a specific location ------------------------------ cmake -DCMAKE_INSTALL_PREFIX= Tested settings --------------- - CMake Unix Makefile generators on Mac OS X and Linux. Using from other CMake-based projects ------------------------------------- Under buildsys/cmake/Modules you find some Find*() scripts which you might find useful. Make Universal Binary --------------------- cmake -DCMAKE_OSX_ARCHITECTURES="i386;x86_64;ppc" CMake Framework --------------- The project name is "DynCall". Each library in the source tree represents a target (not a sub-project!). Support scripts for 'find_package' are at buildsys/cmake/Modules. find_package( [DynLoad | DynCall | DynCallback] ) will set the variables: Dyn*_INCLUDE_DIRS Dyn*_LIBRARIES Using dyncall libraries in other CMake projects ----------------------------------------------- find_package(DynLoad REQUIRED) add_includes(${DynLoad_INCLUDE_DIRS}) target_link_libraries( ... ${DynLoad_LIBRARIES}) Use as sub-project within CMake top-level project ------------------------------------------------- add_subdirectory(path/to/dyncall/project/tree) set(DynLoad_DIR ${DynCall_SOURCE_DIR}/dynload) set(DynCall_DIR ${DynCall_SOURCE_DIR}/dyncall) set(DynCallback_DIR ${DynCall_SOURCE_DIR}/dyncallback) has the effect, that the 'find_package' works from within the project source tree. Building for SPARC64 Architectures ---------------------------------- Supported Compilers: GCC, SunPro Add -m64 to C, C++ and ASM flags, e.g. $ cmake -DCMAKE_C_FLAGS=-m64 -DCMAKE_ASM_FLAGS=-m64 -DCMAKE_ASM_CXX_FLAGS=-m64 MoarVM-2015.11/3rdparty/dyncall/doc/README.Generic0000644000175000017500000001077412502366750020265 0ustar jnthnjnthnBuilding DynCall with generic makefiles ======================================= Description ----------- Makefile.generic is a simple and _hybrid_ make-based build system setup for dyncall, designed to work with with GNU and BSD make. This build-flavour supports two operating modes: Embedded and Configure. Project files are specified in Makefile.generic. History ------- During the integration of dyncall into the R package rdyncall, there was a need for a clean simple build system that could be launched from R and works with various make's such as GNU, BSD and sun make. Generic Usage ------------- [g|bsd]make [-f Makefile.generic] [all|clean|install|...] [INSTALL_TOP=] Embedded Mode ------------- Makefile.generic makefiles are taken "as-is" without the need for extra configuration. = ... bsdmake -f Makefile.generic = ... gmake -f Makefile.generic (Note that setting an env var as above (=) before running a command is shell specific. If your shell doesn't support this, set it according to the shell's style.) Example: dyncall libraries should compile fine on most platforms: BSDmake: $ bsdmake -f Makefile.generic GNUmake: $ make -f Makefile.generic The tests sometimes require special attention to additional 'usual' libraries such as math and dynamic linker run-time libs. $ LDLIBS="-lm -ldl" make -f Makefile.generic Configure Mode -------------- Usage: cd # build-dir can be arbitrary ..//configure [--prefix=] make make install [DESTDIR=] The configure script 'configure' writes 'Makefile' files that include 'Makefile.generic' and setup variables such as VPATH, {SRC,BLD}{TOP,DIR}. Two build types are supported: In-source and out-of-Source. in-source builds: Makefile's are created in parallel to the Makefile.generic files. out-of-source builds: the configure script is executed from a (possible empty) build directory. The source directory tree is duplicated into that directory. Useful Variables ---------------- For libraries: CC, CFLAGS, CPPFLAGS For tests: CXX, LDLIBS MAKE_CMD - The make tool (including -f flag) to run sub-directories. SRCTOP - Source top-level directory (defaults to relative top). BLDTOP - Build top-level directory (defaults to SRCTOP). SRCDIR - Source directory (defaults to '.'). BLDDIR - Build directory (defaults to SRCDIR). e.g. Makefile.generic in source-tree: SRCTOP ?= ../../../ # relative path to source-top BLDTOP ?= ${SRCTOP} # defaults for in-source builds SRCDIR ?= . # relative path to current directory BLDDIR ?= ${BLDDIR} # relative path to current directory Include Directories ------------------- Use -I${SRCTOP}/... to refer to other include directories. Link Directories ---------------- Use -L${BLDTOP}/... to refer to other build directories. Plaform Notes: -------------- Linux: - all: ok. make -f Makefile.generic all - tests: need 'm' and 'dl' libs. ( cd tests ; LDLIBS="-lm -ldl" make -f Makefile.generic ) - see batch script: buildsys/scripts/batch-build-linux.sh Minix: No dynload support. No '-fPIC' is allowed. - dynload: unsupport, no dynamic linker present in Minix 3. - dyn{call,callback}: ok, without '-fPIC'! ( cd dyncall ; CFLAGS= make -f Makefile.generic dyncall dyncallback ) - tests: ok ( cd test ; make -f Makefile.generic all-dyncall all-dyncallback ) - see batch script: buildsys/scripts/batch-build-minix.sh NetBSD/FreeBSD: - all: ok. make -f Makefile.generic all - tests: need math lib: ( cd tests ; LDLIBS="-lm" make -f Makefile.generic ) OpenBSD: - all: ok. make -f Makefile.generic all - tests: *.cpp implicit rule not set, therefore only c tests work: ( cd tests ; LDLIBS="-lm" make -f Makefile.generic all-c ) - install: ok. Haiku Alpha 2: - dynload: elf.h header found, install system source for dynload support - dyn{call,callback}: ok. make -f Makefile.generic dyncall dyncallback - tests: ok ( cd test ; make -f Makefile.generic all-dyncall all-dyncallback ) Build notes related to dyncall: ------------------------------- CFLAGS Use '-fPIC' for at least 64-bit systems and when you want the code to be included as a shared library or module image. LDLIBS Use '-lm' for test/suite - it uses pow function. Use '-ldl' for dynload examples such as test/nm and test/resolve_self on Linux. Feature: -------- configure --prefix= -> Makefile DESTDIR=variable make -f Makefile.generic DESTDIR= Todo: ----- - sun's make: CXX does not exist.. no rule for *.cpp files but *.cc. MoarVM-2015.11/3rdparty/dyncall/doc/README.MacOSX0000644000175000017500000000107012456307246017773 0ustar jnthnjnthnBuilding DynCall on Mac OS X ============================ The build system supports universal binaries (including static libraries). In addition, the desired SDK can be choosen. Configure switches related to Mac OS X: Operating System: --target=MacOSX (auto-detect) SDK: --sdk= (auto-detect) Architecture: not specified, builds universal binaries depending on SDK version Configure and build for host platform: ./configure make sudo make install Compile for Mac OS X 10.4u: configure --target=MacOSX --sdk=10.4u MoarVM-2015.11/3rdparty/dyncall/doc/README.Minix0000644000175000017500000000164712456307246017777 0ustar jnthnjnthnBuilding DynCall on Minix 3 =========================== Status: ------- - Compiles under GNU tool-chain on Minix 3.1.8 using script for Makefile.generic or by building specific make targets - dyncall: tests run ok. - dyncallback: minor bugs on dyncallback (some cases fail) - dynload: unsupported due to missing dynamic linker. - Integration of ACK tool-chain is in progress but not functional at the moment... Building: --------- 1) using configure and make: $ ./configure $ make libdyncall libdyncallback 2) or using build script for gcc (using Makefile.generic): $ sh buildsys/scripts/batch-build-minix.sh Minix facts: ------------ - posix make - ACK (Amsterdam Compiler Kit) compiler for C, Modula-2 and Pascal using own Assembly format - ACK Assembler: if very first character is '#' - C preprocessor is run.. - Minix 32-bit: - ACK 32-bit compiler: long long is not supported - Minix 16-bit: not yet reviewed... MoarVM-2015.11/3rdparty/dyncall/doc/README.NDS0000644000175000017500000000125112456307246017326 0ustar jnthnjnthnBuild instructions for DynCall on Nintendo DS using devkitPro and NMake under Windows ============================================= To build the library, you have to configure it first. Since the NDS build uses devkitPro and NMake, assure to have them in your %PATH%. To configure the library, call one of the following, depending if you want to use the processor in ARM or THUMB mode: configure.bat /tool-gcc /target-nds-arm configure.bat /tool-gcc /target-nds-thumb Note that the /tool-gcc flag is needed, because we're using devkitARM (via devkitPro) which is based on the GCC toolchain. The /target-nds-* flags don't imply this. Then, call: nmake /F Nmakefile MoarVM-2015.11/3rdparty/dyncall/doc/README.PSP0000644000175000017500000000135112456307246017345 0ustar jnthnjnthnCross-compile DynCall for PSP using PSP-SDK =========================================== Make sure the PSP SDK's is installed and that the build tools (e.g. psp-gcc) are in your PATH. Also make sure that your PSP SDK's include files are in your CPATH Status: ------- - dyncall: tests run ok. - dyncallback: all good. - dynload: unsupported due to missing dynamic linker and ELF headers. There are currently two ways to build dyncall for PSP. Build using configure and make: ------------------------------- $ ./configure --target=PSP $ make libdyncall libdyncallback Build using build script for gcc (using Makefile.generic): ---------------------------------------------------------- $ sh buildsys/scripts/batch-build-psp.sh MoarVM-2015.11/3rdparty/dyncall/doc/README.SunOS0000644000175000017500000000465412456307246017723 0ustar jnthnjnthnBuilding DynCall on Solaris and other SunOS distributions ========================================================= Current Status of Solaris Architectures: i386 : ok. AMD64 : ok. SPARC : no dyncallback support. SPARC64 : bugs in dyncall (see BUGS), no dyncallback support. Supported Compilers: SunPro C/C++ compiler and GCC. Supported Build-Systems: configure/make, Makefile.embedded and CMake. Details ======= It has been ported and tested for x86 and sparc32/64 on Solaris 10/X86 using the SunPro compiler suite and sun's make. The same goes for OpenSolaris distributions - the library builds and runs fine on Nexenta x86 and x64. On Solaris, it also cross-builds for amd64 just fine, but the we don't have access to a x64 Solaris to run the tests. Building DynCall: ----------------- $ ./configure $ make It is also possible to use 'Makefile.embedded' for sun make, GNU make and BSD make: Build with SUN make and compilers from sun using Makefile.embedded: ------------------------------------------------------------------- $ make -f Makefile.embedded sun $ (cd test; make -f Makefile.embedded sun) Build for sparc64 with SUN make and compilers from sun using Makefile.embedded: ------------------------------------------------------------------------------- $ make -f Makefile.embedded sun-64bit $ (cd test; make -f Makefile.embedded sun-64bit) Build with SUN make and GNU C compiler using Makefile.embedded: --------------------------------------------------------------- $ make -f Makefile.embedded sun-gcc $ (cd test; make -f Makefile.embedded sun-gcc) Build for sparc64 with SUN make and GNU C compiler using Makefile.embedded: --------------------------------------------------------------------------- $ make -f Makefile.embedded sun-gcc-64bit $ (cd test; make -f Makefile.embedded sun-gcc-64bit) NOTE: There are still issues with the sparc64 port on Solaris. Build with CMake, Sun make and SunPro for sparc64: -------------------------------------------------- $ cmake -DCMAKE_C_FLAGS=-m64 -DCMAKE_ASM_FLAGS=-m64 -DCMAKE_CXX_FLAGS=-m64 . $ make Installation ------------ $ make -f Makefile.embedded PREFIX= install Tested Platforms ---------------- x86/amd64: - using Solaris 10 using SunPro Tools - using Nexenta (SunOS 5.11 kernel) using GNU tools sparc 32/64 bit: - SunOS 5.1 using SunPro and GCC on a Sun Fire V440 via developer account thanks to gwdg.de! MoarVM-2015.11/3rdparty/dyncall/doc/README.Windows0000644000175000017500000000271612466674236020352 0ustar jnthnjnthnBulding DynCall on Windows ========================== Build using buildsys/nmake and MS Visual Studio Tools: ------------------------------------------------------ 32-bit: vcvarsall.bat x86 .\configure.bat /target-x86 nmake /f Nmakefile 64-bit: vcvarsall.bat amd64 .\configure.bat /target-x64 nmake /f Nmakefile Build/run tests: cd test nmake /f Nmakefile NOTE: if you encounter 'python'/'lua' not found messages (which is executed mistakenly for re-generation of test C code) timestamps are wrong; workaround: run "svn revert -R ." several times. Build using buildsys/gmake and MinGW or Cygwin: ----------------------------------------------- 32-bit: .\configure.bat /target-x86 /tool-gcc make 64-bit: .\configure.bat /target-x64 /tool-gcc make Build using Makefile.embedded and MinGW or Cygwin: -------------------------------------------------- > mingw32-make -f Makefile.embedded $ make -f Makefile.embedded CC=gcc Build using CMake and Nmake: ---------------------------- Put the appropriate tool-chain in path (32 or 64-bit version of MSVC), then: cmake -G "NMake Makefiles" %DYNCALL_SOURCE_DIR% nmake Build using CMake and Visual Studio: ------------------------------------ 32-bit: cmake . open DynCall.sln BROKEN: SAFE EH. BROKEN: Rules to assemble MASM files are still missing. MoarVM-2015.11/3rdparty/dyncall/doc/README.embedded0000644000175000017500000000574412456307246020446 0ustar jnthnjnthnMakefile.embedded - hybrid DynCall makefiles for GNU, BSD and SUN make ====================================================================== Brief overview -------------- This is one of the latest build systems designed for DynCall. It was designed for being embeddable in bigger 'make' based systems. It uses a very simple structure and it does not require any 'configure' phase. Instead the user can specify the CFLAGS and LDFLAGS by himself. For a couple of platforms, the make system supports phony targets of popular operating-systems such as 'bsd'. Building the library: --------------------- $ make -f Makefile.embedded Building the tests: ------------------- $ cd test ; make -f Makefile.embedded Installation: ------------- $ make -f Makefile.embedded PREFIX=/usr/local install Installation with support for DESTDIR: -------------------------------------- $ make -f Makefile.embedded DESTDIR=/tmp/staging PREFIX=/usr/local install Available variants: ------------------- bsd Free/Net/Open/DragonFly/Mir BSD linux Linux osx Mac OS X osx-universal Mac OS X universal binaries (i386,x86_64 and ppc) sun SunOS and Sun Pro compiler sun-64bit SunOS and Sun Pro compiler for sparc64(? amd64) sun-gcc SunOS and GCC compiler sun-gcc-64bit SunOS and GCC compiler for sparc64 (? amd64) ios61 iOS SDK 6.1 armv7 (untested!) ios61-nothumb iOS SDK 6.1 armv7 -mno-thumb (untested!) Tweaking the build: ------------------- $ VAR1= VAR2= .. make -f Makefile.embedded Adding a variant ----------------- Currently we deal with two files to specify a custom target. The top-level Makefile.embedded controls for building the libraries. Useful variables are AR, CC, CFLAGS and ASFLAGS. The test/Makefile.embedded file controls for building the tests. The tests currently involve sometimes C++ and some platforms need to link with the math library. Others need the dynamic linker. Useful variables are CXX, CC, CCC (Sun), CFLAGS, CCFLAGS (Sun), CXXFLAGS andLDFLAGS. Background ---------- During the preparation for the public release of the R package 'rdyncall' I was looking for a way to get DynCall integrated into an existing Make system such as offered by R for build R packages. It was inspired by the make files of Lua which are damn simple and don't need a configure but a user that knows the target platform name. The source package can be configured automatically during compilation and does not require explicit configuration anymore using "*.S" files that are Assembly files which are preprocessed by the C Preprocessor. This feature is available by GCC and SunPro compilers. Limitations ----------- Mac OS X universal static libraries require to use 'libtool -static -o libname.a obj1.o obj2.o ...' instead of 'ar cru libname.a obj1.o obj2.o'. We use predefined variables AR and ARFLAGS. The variant osx-universal uses AR=libtool. MoarVM-2015.11/3rdparty/dyncall/doc/README.iOS0000644000175000017500000000240312456307246017374 0ustar jnthnjnthnBuilding DynCall for apple's iOS platforms (iPod touch, iPhone, iPad) ===================================================================== Environment Setup for Cross-Compilation using iPhone SDK: $ source ./buildsys/scripts/setenv-sdk-ios.sh Package Configuration $ ./configure --target=iOS --sdk=. Tested SDK Versions 2.0 .. 4.0 , 6.1 Building $ make Details: Useful configure switches: --target=[iOS|iPhoneSimulator] --sdk= (tested versions 2.0..4.0, 6.1) Supported Tool-chains gcc and llvm-gcc Building with Makefile.embedded .. ARMv7 for iOS 6.1 $ make -f Makefile.embedded ios61-os $ cd test && make -f Makefile.embedded ios61-os ARMv7 (no thumb) for iOS 6.1 $ make -f Makefile.embedded ios61-os-nothumb $ cd test && make -f Makefile.embedded ios61-os-nothumb Simulator for iOS 6.1 $ make -f Makefile.embedded ios61-sim $ cd test && make -f Makefile.embedded ios61-sim Tested Mac OS X platforms: 10.[7,8] Tested Xcode toolchains: 4.6 Building with Makefile.generic .. $ source buildsys/scripts/setenv-sdk-ios.sh $ source buildsys/scripts/setenv-cross-ios.sh make -f Makefile.generic ... uses armv6 and sdk 3.2 as default, can be changed in 'setenv-cross-ios.sh'. MoarVM-2015.11/3rdparty/dyncall/doc/manual/CMakeLists.txt0000644000175000017500000000057512456307246022050 0ustar jnthnjnthnfind_package(LATEX) if(PDFLATEX_COMPILER) add_custom_command( OUTPUT manual.pdf COMMAND ${PDFLATEX_COMPILER} ARGS manual.tex DEPENDS manual.tex ) file(GLOB CLEAN_FILES *.aux *.log *.lof *.lol *.lot *.out *.toc) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEAN_FILES}") endif() add_custom_target(manual ALL echo DEPENDS manual.pdf) MoarVM-2015.11/3rdparty/dyncall/doc/manual/Makefile.generic0000644000175000017500000000163712466674236022372 0ustar jnthnjnthnall: manual.pdf sources: *.tex callconvs/*.tex dyncall_logo.* dyncall_watermark.* manual.pdf: sources # run twice for toc on some tex installs cd ${VPATH} && pdflatex -output-directory=${PWD} manual.tex cd ${VPATH} && pdflatex -output-directory=${PWD} manual.tex manual.html: manual_tex4ht.cfg sources # Create tex4ht.env from default one, but with better bitmaps cp $$(dirname $$(which tex4ht))/../share/texmf-dist/tex4ht/base/unix/tex4ht.env ${VPATH}/ cd ${VPATH} && sed -E -i '' 's/(Text|Graphics)(AlphaBits)=[1,2,3]([^0-9])/\1\2=4\3/g' tex4ht.env cd ${VPATH} && htlatex manual.tex manual_tex4ht " -cunihtf" clean: # pdf for i in pdf aux lof log lol lot out toc; do rm -f manual.$$i || true; done # html for i in 4ct 4tc css dvi html idv lg tmp xref; do rm -f manual.$$i || true; done for i in manual*x.png manual*.html texput.log manual_*.log zzmanual.eps zzmanual.ps tex4ht.env; do rm -f $$i || true; done MoarVM-2015.11/3rdparty/dyncall/doc/manual/Nmakefile0000644000175000017500000000227712456307246021127 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = .. !INCLUDE $(TOP)/buildsys/nmake/prolog.nmake TARGETS=manual.pdf manual.pdf: dummy # Pseudo-targets are always out of date... dummy: !INCLUDE $(TOP)/buildsys/nmake/epilog.nmake MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_arm32.tex0000644000175000017500000003507312466674236024633 0ustar jnthnjnthn% % Copyright (c) 2007,2010 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % % ================================================== % ARM32 % ================================================== \subsection{ARM32 Calling Convention} \paragraph{Overview} The ARM32 family of processors is based on the Advanced RISC Machines (ARM) processor architecture (32 bit RISC). The word size is 32 bits (and the programming model is LLP64).\\ Basically, this family of microprocessors can be run in 2 major modes:\\ \\ \begin{tabular}{2 B} \hline Mode & Description\\ \hline {\bf ARM} & 32bit instruction set\\ {\bf THUMB} & compressed instruction set using 16bit wide instruction encoding\\ \hline \end{tabular} \\ \\ For more details, take a look at the ARM-THUMB Procedure Call Standard (ATPCS) \cite{ATPCS}, the Procedure Call Standard for the ARM Architecture (AAPCS) \cite{AAPCS}, as well as the Debian ARM EABI port wiki \cite{armeabi}. \paragraph{\product{dyncall} support} Currently, the \product{dyncall} library supports the ARM and THUMB mode of the ARM32 family (ATPCS \cite{ATPCS} and EABI \cite{armeabi}), excluding manually triggered ARM-THUMB interworking calls. Although it's quite possible that the current implementation runs on other ARM processor families as well, please note that only the ARMv4t family has been thoroughly tested at the time of writing. Please report if the code runs on other ARM families, too.\\ It is important to note, that dyncall supports the ARM architecture calling convention variant {\bf with floating point hardware disabled} (meaning that the FPA and the VFP (scalar mode) procedure call standards are not supported). This processor family features some instruction sets accelerating DSP and multimedia application like the ARM Jazelle Technology (direct Java bytecode execution, providing acceleration for some bytecodes while calling software code for others), etc. that are not supported by the dyncall library.\\ \subsubsection{ATPCS ARM mode} \paragraph{Registers and register usage} In ARM mode, the ARM32 processor has sixteen 32 bit general purpose registers, namely r0-r15:\\ \\ \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf r0} & parameter 0, scratch, return value\\ {\bf r1} & parameter 1, scratch, return value\\ {\bf r2-r3} & parameters 2 and 3, scratch\\ {\bf r4-r10} & permanent\\ {\bf r11} & frame pointer, permanent\\ {\bf r12} & scratch\\ {\bf r13} & stack pointer, permanent\\ {\bf r14} & link register, permanent\\ {\bf r15} & program counter (note: due to pipeline, r15 points to 2 instructions ahead)\\ \hline \end{tabular} \caption{Register usage on arm32} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item first four words are passed using r0-r3 \item subsequent parameters are pushed onto the stack (in right to left order, such that the stack pointer points to the first of the remaining parameters) \item if the callee takes the address of one of the parameters and uses it to address other parameters (e.g. varargs) it has to copy - in its prolog - the first four words to a reserved stack area adjacent to the other parameters on the stack \item parameters \textless=\ 32 bits are passed as 32 bit words \item 64 bit parameters are passed as two 32 bit parts (even partly via the register and partly via the stack), although this doesn't seem to be specified in the ATPCS), with the loword coming first \item structures and unions are passed by value, with the first four words of the parameters in r0-r3 \item if return value is a structure, a pointer pointing to the return value's space is passed in r0, the first parameter in r1, etc... (see {\bf return values}) \item keeping the stack eight-byte aligned can improve memory access performance and is required by LDRD and STRD on ARMv5TE processors which are part of the ARM32 family, so, in order to avoid problems one should always align the stack (tests have shown, that GCC does care about the alignment when using the ellipsis) \end{itemize} \paragraph{Return values} \begin{itemize} \item return values \textless=\ 32 bits use r0 \item 64 bit return values use r0 and r1 \item if return value is a structure, the caller allocates space for the return value on the stack in its frame and passes a pointer to it in r0 \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} register save area & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} \mrlbrace{7}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~=~~} & r3 & \mrrbrace{4}{spill area (if needed)} & \mrrbrace{7}{current frame} \\ & r2 & & \\ & r1 & & \\ & r0 & & \\ \hhline{~-~~} register save area (with return address) & & & \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} parameter area & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on arm32} \end{figure} \newpage \subsubsection{ATPCS THUMB mode} \paragraph{Status} \begin{itemize} \item The ATPCS THUMB mode is untested. \item Ellipse calls may not work. \item C++ this calls do not work. \end{itemize} \paragraph{Registers and register usage} In THUMB mode, the ARM32 processor family supports eight 32 bit general purpose registers r0-r7 and access to high order registers r8-r15:\\ \\ \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf r0} & parameter 0, scratch, return value\\ {\bf r1} & parameter 1, scratch, return value\\ {\bf r2-r3} & parameters 2 and 3, scratch\\ {\bf r4-r6} & permanent\\ {\bf r7} & frame pointer, permanent\\ {\bf r8-r11} & permanent\\ {\bf r12} & scratch\\ {\bf r13} & stack pointer, permanent\\ {\bf r14} & link register, permanent\\ {\bf r15} & program counter (note: due to pipeline, r15 points to 2 instructions ahead)\\ \hline \end{tabular} \caption{Register usage on arm32 thumb mode} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item first four words are passed using r0-r3 \item subsequent parameters are pushed onto the stack (in right to left order, such that the stack pointer points to the first of the remaining parameters) \item if the callee takes the address of one of the parameters and uses it to address other parameters (e.g. varargs) it has to copy - in its prolog - the first four words to a reserved stack area adjacent to the other parameters on the stack \item parameters \textless=\ 32 bits are passed as 32 bit words \item 64 bit parameters are passed as two 32 bit parts (even partly via the register and partly via the stack), although this doesn't seem to be specified in the ATPCS), with the loword coming first \item structures and unions are passed by value, with the first four words of the parameters in r0-r3 \item if return value is a structure, a pointer pointing to the return value's space is passed in r0, the first parameter in r1, etc. (see {\bf return values}) \item keeping the stack eight-byte aligned can improve memory access performance and is required by LDRD and STRD on ARMv5TE processors which are part of the ARM32 family, so, in order to avoid problems one should always align the stack (tests have shown, that GCC does care about the alignment when using the ellipsis) \end{itemize} \paragraph{Return values} \begin{itemize} \item return values \textless=\ 32 bits use r0 \item 64 bit return values use r0 and r1 \item if return value is a structure, the caller allocates space for the return value on the stack in its frame and passes a pointer to it in r0 \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} register save area & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} \mrlbrace{7}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~=~~} & r3 & \mrrbrace{4}{spill area (if needed)} & \mrrbrace{7}{current frame} \\ & r2 & & \\ & r1 & & \\ & r0 & & \\ \hhline{~-~~} register save area (with return address) & & & \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} parameter area & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on arm32 thumb mode} \end{figure} \newpage \subsubsection{EABI (ARM and THUMB mode)} The ARM EABI is very similar to the ABI outlined in ARM-THUMB procedure call standard (ATPCS) \cite{ATPCS} - however, the EABI requires the stack to be 8-byte aligned at function entries, as well as 64 bit parameters. The latter are aligned on 8-byte boundaries on the stack and 2-registers for parameters passed via register. In order to achieve such an alignment, a register might have to be skipped for parameters passed via registers, or 4-bytes on the stack for parameters passed via the stack. Refer to the Debian ARM EABI port wiki for more information \cite{armeabi}. \paragraph{Status} \begin{itemize} \item The EABI THUMB mode is tested and works fine (contrary to the ATPCS). \item Ellipse calls do not work. \item C++ this calls do not work. \end{itemize} \newpage \subsubsection{ARM on Apple's iOS (Darwin) Platform} The iOS runs on ARMv6 (iOS 2.0) and ARMv7 (iOS 3.0) architectures. Typically code is compiled in Thumb mode. \paragraph{Register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf R0} & parameter 0, scratch, return value\\ {\bf R1} & parameter 1, scratch, return value\\ {\bf R2-R3} & parameters 2 and 3, scratch\\ {\bf R4-R6} & permanent\\ {\bf R7} & frame pointer, permanent\\ {\bf R8} & permanent\\ {\bf R9} & permanent(iOS 2.0) and scratch (since iOS 3.0)\\ {\bf R10-R11}& permanent\\ {\bf R12} & scratch, intra-procedure scratch register (IP) used by dynamic linker\\ {\bf R13} & stack pointer, permanent\\ {\bf R14} & link register, permanent\\ {\bf R15} & program counter (note: due to pipeline, r15 points to 2 instructions ahead)\\ {\bf CPSR} & Program status register\\ {\bf D0-D7} & scratch. aliases S0-S15, on ARMv7 alsa as Q0-Q3. Not accessible from Thumb mode on ARMv6.\\ {\bf D8-D15} & permanent, aliases S16-S31, on ARMv7 alsa as Q4-A7. Not accesible from Thumb mode on ARMv6.\\ {\bf D16-D31}& Only available in ARMv7, aliases Q8-Q15.\\ {\bf FPSCR} & VFP status register.\\ \hline \end{tabular} \caption{Register usage on ARM Apple iOS} \end{table} The ABI is based on the AAPCS but with some important differences listed below: \begin{itemize} \item R7 instead of R11 is used as frame pointer \item R9 is scratch since iOS 3.0, was preserved before. \end{itemize} \subsubsection{Architectures} The ARM architecture family contains several revisions with capabilities and extensions (such as thumb-interworking and more vector registers) The following table summaries important properties of the various architecture standards. % iPhone 3GS : ARM Cortex-A8 % Nintendo DS: ARM 7 and ARM 9 % ARM 7: ARMv4T % ARM 9: ARMv4T, HTC Wizard \begin{table}[h] \begin{tabular}{lll} Arch & Platforms & Details \\ \hline ARMv4 & & \\ \hline ARMv4T & ARM 7, ARM 9, Neo FreeRunner (OpenMoko) & \\ \hline ARMv5 & & BLX instruction available \\ \hline ARMv6 & & No vector registers available in thumb \\ \hline ARMv7 & iPod touch, iPhone 3GS/4 & \\ \hline \end{tabular} \caption{Overview of ARM Architecture, Platforms and Details} \end{table} \newpage MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_arm64.tex0000644000175000017500000001626212466674236024637 0ustar jnthnjnthn% % Copyright (c) 2014,2015 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % % ================================================== % ARM64 % ================================================== \subsection{ARM64 Calling Convention} \paragraph{Overview} ARMv8 introduced the AArch64 calling convention. ARM64 chips can be run in 64 or 32bit mode, but not by the same process. Interworking is only intre-process.\\ The word size is defined to be 32 bits, a dword 64 bits. Note that this is due to historical reasons (terminology didn't change from ARM32).\\ For more details, take a look at the Procedure Call Standard for the ARM 64-bit Architecture \cite{AAPCS64}. \paragraph{\product{dyncall} support} The \product{dyncall} library supports the ARM 64-bit AArch64 PCS ABI, for calls and callbacks. \subsubsection{AAPCS64 Calling Convention} \paragraph{Registers and register usage} ARM64 features thirty-one 64 bit general purpose registers, namely x0-x30. Also, there is SP, a register with restricted use, used for the stack pointer, and PC dedicated as program counter. Additionally, there are thirty-two 128 bit registers v0-v31, to be used as SIMD and floating point registers, referred to as q0-q31, d0-d31 and s0-s31, respectively, depending on their use:\\ \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf x0-x7} & parameters, scratch, return value\\ {\bf x8} & indirect result location pointer\\ {\bf x9-x15} & scratch\\ {\bf x16} & permanent in some cases, can have special function (IP0), see doc\\ {\bf x17} & permanent in some cases, can have special function (IP1), see doc\\ {\bf x18} & reserved as platform register, advised not to be used for handwritten, portable asm, see doc \\ {\bf x19-x28} & permanent\\ {\bf x29} & permanent, frame pointer\\ {\bf x30} & permanent, link register\\ {\bf SP} & permanent, stack pointer\\ {\bf PC} & program counter\\ \hline \end{tabular} \caption{Register usage on arm64} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item first 8 integer arguments are passed using x0-x7 \item first 8 floating point arguments are passed using d0-d7 \item subsequent parameters are pushed onto the stack \item if the callee takes the address of one of the parameters and uses it to address other parameters (e.g. varargs) it has to copy - in its prolog - the first 8 integer and 8 floating-point registers to a reserved stack area adjacent to the other parameters on the stack (only the unnamed parameters require saving, though) \item structures and unions are passed by value, with the first four words of the parameters in r0-r3 \item if return value is a structure, a pointer pointing to the return value's space is passed in r0, the first parameter in r1, etc... (see {\bf return values}) \item stack is required to be throughout eight-byte aligned \end{itemize} \paragraph{Return values} \begin{itemize} \item integer return values use x0 \item floating-point return values use d0 \item otherwise, the caller allocates space, passes pointer to it to the callee through x8, and callee writes return value to this space \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} register save area & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} \mrlbrace{13}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~=~~} & x0 & \mrrbrace{10}{spill area (if needed)} & \mrrbrace{15}{current frame} \\ & x1 & & \\ & \ldots & & \\ & x2 & & \\ & x7 & & \\ & d0 & & \\ & d1 & & \\ & \ldots & & \\ & d2 & & \\ & d7 & & \\ \hhline{~-~~} register save area & & & \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} link and frame register & x30 & & \\ & x29 & & \\ \hhline{~-~~} parameter area & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on arm64} \end{figure} \newpage MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_mips.tex0000644000175000017500000001503712466674236024655 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \subsection{MIPS Calling Convention} \paragraph{Overview} The MIPS family of processors is based on the MIPS processor architecture. Multiple revisions of the MIPS Instruction set exist, namely MIPS I, MIPS II, MIPS III, MIPS IV, MIPS32 and MIPS64. Today, MIPS32 and MIPS64 for 32-bit and 64-bit respectively.\\ Several add-on extensions exist for the MIPS family: \begin{description} \item [MIPS-3D] simple floating-point SIMD instructions dedicated to common 3D tasks. \item [MDMX] (MaDMaX) more extensive integer SIMD instruction set using 64 bit floating-point registers. \item [MIPS16e] adds compression to the instruction stream to make programs take up less room (allegedly a response to the THUMB instruction set of the ARM architecture). \item [MIPS MT] multithreading additions to the system similar to HyperThreading. \end{description} Unfortunately, there is actually no such thing as "The MIPS Calling Convention". Many possible conventions are used by many different environments such as \emph{32}, \emph{O64}, \emph{N32}, \emph{64} and \emph{EABI}. \paragraph{\product{dyncall} support} Currently, dyncall supports the EABI calling convention which is used on the Homebrew SDK for the Playstation Portable. As documentation for this EABI is unofficial, this port is currently experimental. \subsubsection{MIPS EABI 32-bit Calling Convention} \paragraph{Register usage} \begin{table}[h] \begin{tabular}{lll} \hline Name & Alias & Brief description\\ \hline {\bf \$0} & {\bf \$zero} & Hardware zero \\ {\bf \$1} & {\bf \$at} & Assembler temporary \\ {\bf \$2-\$3} & {\bf \$v0-\$v1} & Integer results \\ {\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments\\ {\bf \$12-\$15,\$24,\$25} & {\bf \$t4-\$t7,\$t8,\$t9} & Integer temporaries \\ {\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\ {\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\ {\bf \$26,\$27} & {\bf \$kt0,\$kt1} & Reserved for kernel \\ {\bf \$28} & {\bf \$gp} & Global pointer \\ {\bf \$29} & {\bf \$sp} & Stack pointer \\ {\bf \$30} & {\bf \$s8} & Frame pointer \\ {\bf \$31} & {\bf \$ra} & Return address \\ {\bf hi, lo} & & Multiply/divide special registers \\ {\bf \$f0,\$f2} & & Float results \\ {\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & Float temporaries \\ {\bf \$f12-\$f19} & & Float arguments \\ \end{tabular} \caption{Register usage on mips32 eabi calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item Stack parameter order: right-to-left \item Caller cleans up the stack \item Stack always aligned to 8 bytes. \item first 8 integers and floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively. \item if either integer or float registers are consumed up, the stack is used. \item 64-bit floats and integers are passed on two integer registers starting at an even register number, probably skipping one odd register. \item \$a0-\$a7 and \$f12-\$f19 are not required to be preserved. \item results are returned in \$v0 (32-bit integer), \$v0 and \$v1 (64-bit integer/float), \$f0 (32 bit float) and \$f0 and \$f2 (2 $\times$ 32 bit float e.g. complex). \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} register save area & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~=~~} register save area (with return address) & & & \mrrbrace{5}{current frame} \\ \hhline{~-~~} local data & & & \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \\ \\ \\ \caption{Stack layout on mips32 eabi calling convention} \end{figure} MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_mips64.tex0000644000175000017500000000236012456307246025013 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \subsection{MIPS64 Calling Convention} \paragraph{Overview} TBC. \paragraph{\product{dyncall} support} We are currently working on that. Our test machine is a Loongson-CPU 2F subnotebook with OpenBSD. MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_ppc32.tex0000644000175000017500000002726512466674236024642 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// % ================================================== % PowerPC 32 % ================================================== \subsection{PowerPC (32bit) Calling Convention} \paragraph{Overview} \begin{itemize} \item Word size is 32 bits \item Big endian (MSB) and litte endian (LSB) operating modes. \item Processor operates on floats in double precision floating point arithmetc (IEEE-754) values directly (single precision is converted on the fly) \item Apple Mac OS X/Darwin PPC is specified in "Mac OS X ABI Function Call Guide"\cite{ppcMacOSX}. It uses Big Endian (MSB). \item Linux PPC 32-bit ABI is specified in "LSB for PPC"\cite{ppc32LSB} which is based on "System V ABI". It uses Big Endian (MSB). \item PowerPC EABI is defined in the "PowerPC Embedded Application Binary Interface 32-Bit Implementation". \end{itemize} \paragraph{\product{dyncall} support} \product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB) on Darwin (tested on Apple Mac OS X) and Linux, however, fail for *BSD. \subsubsection{Mac OS X/Darwin} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf gpr0} & scratch\\ {\bf gpr1} & stack pointer\\ {\bf gpr2} & scratch\\ {\bf gpr3} & return value, parameter 0 if integer or pointer\\ {\bf gpr4-gpr10} & return value, parameter 1-7 for integer or pointer parameters\\ {\bf gpr11} & permanent\\ {\bf gpr12} & branch target for dynamic code generation\\ {\bf gpr13-31} & permanent\\ {\bf fpr0} & scratch\\ {\bf fpr1-fpr13} & parameter 0-12 for floating point (always double precision)\\ {\bf fpr14-fpr31} & permanent\\ {\bf v0-v1} & scratch\\ {\bf v2-v13} & vector parameters\\ {\bf v14-v19} & scratch\\ {\bf v20-v31} & permanent\\ {\bf lr} & scratch, link-register\\ {\bf ctr} & scratch, count-register\\ {\bf cr0-cr1} & scratch\\ {\bf cr2-cr4} & permanent\\ {\bf cr5-cr7} & scratch\\ \hline \end{tabular} \caption{Register usage on Darwin PowerPC 32-Bit} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left@@@? \item caller cleans up the stack@@@? \item the first 8 integer parameters are passed in registers gpr3-gpr10 \item the first 12 floating point parameters are passed in registers fpr1-fpr13 \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of the float - 1 register for single precision and 2 for double precision floating point values) \item the caller pushes subsequent parameters onto the stack \item for every parameter passed via a register, space is reserved in the stack parameter area (in order to spill the parameters if needed - e.g. varargs) \item ellipsis calls take floating point values in int and float registers (single precision floats are promoted to double precision as defined for ellipsis calls) \item all nonvector parameters are aligned on 4-byte boundaries \item vector parameters are aligned on 16-byte boundaries \item integer parameters \textless\ 32 bit occupy high-order bytes of their 4-byte area \item composite parameters with size of 1 or 2 bytes occupy low-order bytes of their 4-byte area. INCONSISTENT with other 32-bit PPC binary interfaces. In AIX and OS 9, padding bytes always follow the data structure \item composite parameters 3 bytes or larger in size occupy high-order bytes \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of integer \textless=\ 32bit or pointer type use gpr3 \item 64 bit integers use gpr3 and gpr4 (hiword in gpr3, loword in gpr4) \item floating point values are returned via fpr1 \item structures \textless=\ 64 bits use gpr3 and gpr4 \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed \end{itemize} \pagebreak \paragraph{Stack layout} Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{13}{caller's frame} \\ \hhline{~-~~} \mrlbrace{6}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ & \ldots & \mrrbrace{3}{spill area (as needed)} & \\ & \ldots & & \\ & gpr3 or fpr1 & & \\ \hhline{~-~~} \mrlbrace{6}{linkage area} & reserved & & \\ & reserved & & \\ & reserved & & \\ & return address & & \\ & reserved for callee & & \\ & saved by callee & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} linkage area & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on ppc32 Darwin} \end{figure} \subsubsection{System V PPC 32-bit} \paragraph{Status} \begin{itemize} \item C++ this calls do not work. \item Callbacks don't work on *BSD. \end{itemize} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf r0} & scratch\\ {\bf r1} & stack pointer\\ {\bf r2} & system-reserved\\ {\bf r3-r4} & parameter passing and return value\\ {\bf r5-r10} & parameter passing\\ {\bf r11-r12} & scratch\\ {\bf r13} & Small data area pointer register\\ {\bf r14-r30} & Local variables\\ {\bf r31} & Used for local variables or \emph{environment pointer}\\ {\bf f0} & scratch\\ {\bf f1} & parameter passing and return value\\ {\bf f2-f8} & parameter passing\\ {\bf f9-13} & scratch\\ {\bf f14-f31} & Local variables\\ {\bf cr0-cr7} & Conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ {\bf lr} & Link register (scratch)\\ {\bf ctr} & Count register (scratch) \\ {\bf xer} & Fixed-point exception register (scratch)\\ {\bf fpscr} & Floating-point Status and Control Register\\ % {\bf v0-v1} & scratch\\ % {\bf v2-v13} & vector parameters\\ % {\bf v14-v19} & scratch\\ % {\bf v20-v31} & permanent\\ % {\bf lr} & scratch, link-register\\ % {\bf ctr} & scratch, count-register\\ % {\bf cr0-cr1} & scratch\\ % {\bf cr2-cr4} & permanent\\ % {\bf cr5-cr7} & scratch\\ \hline \end{tabular} \caption{Register usage on System V ABI PowerPC Processor} \end{table} \paragraph{Parameter passing} \begin{itemize} \item Stack pointer (r1) is always 16-byte aligned. The EABI differs here - it is 8-byte alignment. \item 8 general-purpose registers (r3-r10) for integer and pointer types. \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types. \item Additional arguments are passed on the stack directly after the back-chain and saved return address (8 bytes structure) on the callers stack frame. \item 64-bit integer data types are passed in general-purpose registers as a whole in two 32-bit general purpose registers (an odd and an even e.g. r3 and r4), probably skipping an even integer register. or passed on the stack. They are never splitted into a register and stack part. \item Ellipse calls set CR bit 6 \end{itemize} \paragraph{Return values} \begin{itemize} \item 32-bit integers use register r3, 64-bit use registers r3 and r4 (hiword in r3, loword in r4). \item floating-point values are returned using register f1. \end{itemize} \pagebreak \paragraph{Stack layout} Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{6}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & saved return address (for callee) & & \\ \hhline{~-~~} & parent stack frame pointer & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \\ \\ \\ \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention} \end{figure} MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_ppc64.tex0000644000175000017500000000367412466674236024645 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// % ================================================== % PowerPC 64 % ================================================== \subsection{PowerPC (64bit) Calling Convention} \paragraph{Overview} \begin{itemize} \item Word size is 64 bits \item Big endian (MSB) and litte endian (LSB) operating modes. \item Apple Mac OS X/Darwin PPC is specified in "Mac OS X ABI Function Call Guide"\cite{ppcMacOSX}. It uses Big Endian (MSB). \item Linux PPC 64-bit ABI is specified in "64-bit PowerPC ELF Application Binary Interface Supplement"\cite{ppcelf64abi} which is based on "System V ABI". \end{itemize} \paragraph{\product{dyncall} support} \product{Dyncall} supports PowerPC (64bit) Big Endian and Little Endian ELF ABIs on System V systems (Linux, etc.). Mac OS X is not supported. \subsubsection{PPC64 ELF ABI} \paragraph{Registers and register usage} @@@ \paragraph{Parameter passing} @@@ \paragraph{Return values} @@@ \paragraph{Stack layout} @@@ MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_sparc.tex0000644000175000017500000001312312456307246025000 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2012 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \subsection{SPARC Calling Convention} \paragraph{Overview} The SPARC family of processors is based on the SPARC instruction set architecture, which comes in basically tree revisions, V7, V8 and V9. The former two are 32-bit whereas the latter refers to the 64-bit SPARC architecture (see next chapter). SPARC is big endian. \paragraph{\product{dyncall} support} \product{dyncall} fully supports the SPARC 32-bit instruction set (V7 and V8), \product{dyncallback} support is missing, though. \subsubsection{SPARC (32-bit) Calling Convention} \paragraph{Register usage} \begin{itemize} \item 32 32-bit integer/pointer registers \item 32 floating point registers (usable as 8 quad precision, 16 double precision or 32 single precision registers) \item 32 registers are accessible at a time (8 are global ones (g*), whereas the rest forms a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones) \item invoking a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore) \end{itemize} \begin{table}[h] \begin{tabular}{lll} \hline Name & Alias & Brief description\\ \hline {\bf \%g0} & & Read-only, hardwired to 0 \\ {\bf \%g1-\%g7} & & Global \\ {\bf \%o0 and \%i0} & & Output and input argument 0, return value \\ {\bf \%o1-\%o5 and \%i1-\%i5} & & Output and input argument registers \\ {\bf \%o6 and \%i6} & & Stack and frame pointer \\ {\bf \%o7 and \%i7} & & Return address (caller writes to o7, callee uses i7) \\ \end{tabular} \caption{Register usage on sparc calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item Stack parameter order: right-to-left @@@ really? \item Caller cleans up the stack @@@ really? \item Stack always aligned to 8 bytes. \item first 6 integers and floats are passed independently in registers using \%o0-\%o5 \item for every other argument the stack is used \item @@@ what about floats, 64bit integers, etc.? \item results are returned in \%i0, and structs/unions pass a pointer to them as a hidden stack parameter (see below) \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{10}{caller's frame} \\ \hhline{~-~~} padding & & & \\ \hhline{~-~~} \mrlbrace{7}{parameter area} & argument x & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & argument 6 & & \\ & input argument 5 spill & \mrrbrace{3}{spill area} & \\ & \ldots & & \\ & input argument 0 spill & & \\ & struct/union return pointer & & \\ \hhline{~-~~} register save area (\%i* and \%l*) & & & \\ \hhline{~=~~} local data and padding & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \\ \\ \\ \caption{Stack layout on sparc calling convention} \end{figure} MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_sparc64.tex0000644000175000017500000000310212456307246025146 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2012 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \subsection{SPARC64 Calling Convention} \paragraph{Overview} The SPARC family of processors is based on the SPARC instruction set architecture, which comes in basically tree revisions, V7, V8 and V9. The former two are 32-bit (see previous chapter) whereas the latter refers to the 64-bit SPARC architecture. SPARC is big endian. \paragraph{\product{dyncall} support} \product{dyncall} fully supports the SPARC 64-bit instruction set (V9), \product{dyncallback} support is missing, though. \subsubsection{SPARC (64-bit) Calling Convention} @@@ finish MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_x64.tex0000644000175000017500000002635012456307246024317 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// % ================================================== % x64 % ================================================== \subsection{x64 Calling Convention} \paragraph{Overview} The x64 (64bit) architecture designed by AMD is based on Intel's x86 (32bit) architecture, supporting it natively. It is sometimes referred to as x86-64, AMD64, or, cloned by Intel, EM64T or Intel64.\\ On this processor, a word is defined to be 16 bits in size, a dword 32 bits and a qword 64 bits. Note that this is due to historical reasons (terminology didn't change with the introduction of 32 and 64 bit processors).\\ The x64 calling convention for MS Windows \cite{x64Win} differs from the SystemV x64 calling convention \cite{x64SysV} used by Linux/*BSD/... Note that this is not the only difference between these operating systems. The 64 bit programming model in use by 64 bit windows is LLP64, meaning that the C types int and long remain 32 bits in size, whereas long long becomes 64 bits. Under Linux/*BSD/... it's LP64.\\ \\ Compared to the x86 architecture, the 64 bit versions of the registers are called rax, rbx, etc.. Furthermore, there are eight new general purpose registers r8-r15. \paragraph{\product{dyncall} support} \product{dyncall} supports the MS Windows and System V calling convention.\\ \\ \subsubsection{MS Windows} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf rax} & scratch, return value\\ {\bf rbx} & permanent\\ {\bf rcx} & scratch, parameter 0 if integer or pointer\\ {\bf rdx} & scratch, parameter 1 if integer or pointer\\ {\bf rdi} & permanent\\ {\bf rsi} & permanent\\ {\bf rbp} & permanent, may be used ase frame pointer\\ {\bf rsp} & stack pointer\\ {\bf r8-r9} & scratch, parameter 2 and 3 if integer or pointer\\ {\bf r10-r11} & scratch, permanent if required by caller (used for syscall/sysret)\\ {\bf r12-r15} & permanent\\ {\bf xmm0} & scratch, floating point parameter 0, floating point return value\\ {\bf xmm1-xmm3} & scratch, floating point parameters 1-3\\ {\bf xmm4-xmm5} & scratch, permanent if required by caller\\ {\bf xmm6-xmm15} & permanent\\ \hline \end{tabular} \caption{Register usage on x64 MS Windows platform} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item first 4 integer/pointer parameters are passed via rcx, rdx, r8, r9 (from left to right), others are pushed on stack (there is a preserve area for the first 4) \item float and double parameters are passed via xmm0l-xmm3l \item first 4 parameters are passed via the correct register depending on the parameter type - with mixed float and int parameters, some registers are left out (e.g. first parameter ends up in rcx or xmm0, second in rdx or xmm1, etc.) \item parameters in registers are right justified \item parameters \textless\ 64bits are not zero extended - zero the upper bits contiaining garbage if needed (but they are always passed as a qword) \item parameters \textgreater\ 64 bit are passed by reference \item if callee takes address of a parameter, first 4 parameters must be dumped (to the reserved space on the stack) - for floating point parameters, value must be stored in integer AND floating point register \item caller cleans up the stack, not the callee (like cdecl) \item stack is always 16byte aligned - since return address is 64 bits in size, stacks with an odd number of parameters are already aligned \item ellipsis calls take floating point values in int and float registers (single precision floats are promoted to double precision as defined for ellipsis calls) \item if size of parameters \textgreater\ 1 page of memory (usually between 4k and 64k), chkstk must be called \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 64 bits) are returned via the rax register \item floating point types are returned via the xmm0 register \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed \end{itemize} \paragraph{Stack layout} Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{9}{caller's frame} \\ \hhline{~-~~} \mrlbrace{7}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ & r9 or xmm3 & \mrrbrace{4}{spill area} & \\ & r8 or xmm2 & & \\ & rdx or xmm1 & & \\ & rcx or xmm0 & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x64 Microsoft platform} \end{figure} \newpage \subsubsection{System V (Linux / *BSD / MacOS X)} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf rax} & scratch, return value\\ {\bf rbx} & permanent\\ {\bf rcx} & scratch, parameter 3 if integer or pointer\\ {\bf rdx} & scratch, parameter 2 if integer or pointer, return value\\ {\bf rdi} & scratch, parameter 0 if integer or pointer\\ {\bf rsi} & scratch, parameter 1 if integer or pointer\\ {\bf rbp} & permanent, may be used ase frame pointer\\ {\bf rsp} & stack pointer\\ {\bf r8-r9} & scratch, parameter 4 and 5 if integer or pointer\\ {\bf r10-r11} & scratch\\ {\bf r12-r15} & permanent\\ {\bf xmm0} & scratch, floating point parameters 0, floating point return value\\ {\bf xmm1-xmm7} & scratch, floating point parameters 1-7\\ {\bf xmm8-xmm15} & scratch\\ {\bf st0-st1} & scratch, 16 byte floating point return value\\ {\bf st2-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x64 System V (Linux/*BSD)} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item first 6 integer/pointer parameters are passed via rdi, rsi, rdx, rcx, r8, r9 \item first 8 floating point parameters \textless=\ 64 bits are passed via xmm0l-xmm7l \item parameters in registers are right justified \item parameters that are not passed via registers are pushed onto the stack \item parameters \textless\ 64bits are not zero extended - zero the upper bits contiaining garbage if needed (but they are always passed as a qword) \item integer/pointer parameters \textgreater\ 64 bit are passed via 2 registers \item if callee takes address of a parameter, number of used xmm registers is passed silently in al (passed number mustn't be exact but an upper bound on the number of used xmm registers) \item stack is always 16byte aligned - since return address is 64 bits in size, stacks with an odd number of parameters are already aligned \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 64 bits) are returned via the rax register \item floating point types are returned via the xmm0 register \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed - the passed in address will be returned in rax \item floating point values \textgreater\ 64 bits are returned via st0 and st1 \end{itemize} \paragraph{Stack layout} Stack frame is always 16-byte aligned. Note that there is no spill area. Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x64 System V (Linux/*BSD)} \end{figure} MoarVM-2015.11/3rdparty/dyncall/doc/manual/callconvs/callconv_x86.tex0000644000175000017500000007331112456307246024322 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// % ================================================== % x86 % ================================================== \subsection{x86 Calling Conventions} \paragraph{Overview} There are numerous different calling conventions on the x86 processor architecture, like cdecl \cite{x86cdecl}, MS fastcall \cite{x86Winfastcall}, GNU fastcall \cite{x86GNUfastcall}, Borland fastcall \cite{x86Borlandfastcall}, Watcom fastcall \cite{x86Watcomfastcall}, Win32 stdcall \cite{x86Winstdcall}, MS thiscall \cite{x86Winthiscall}, GNU thiscall \cite{x86GNUthiscall}, the pascal calling convention \cite{x86Pascal} and a cdecl-like version for Plan9 \cite{x86Plan9} (dubbed plan9call by us), etc. \paragraph{\product{dyncall} support} Currently cdecl, stdcall, fastcall (MS and GNU), thiscall (MS and GNU) and plan9call are supported.\\ \\ \subsubsection{cdecl} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch\\ {\bf edx} & scratch, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 cdecl calling convention} \end{table} \pagebreak \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item all arguments are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers \item floating point types are returned via the st0 register \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 cdecl calling convention} \end{figure} \pagebreak \subsubsection{MS fastcall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch, parameter 0\\ {\bf edx} & scratch, parameter 1, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 fastcall (MS) calling convention} \end{table} \pagebreak \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item called function cleans up the stack \item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments) \item integer types 64 bits in size @@@ ? first in edx:eax ? \item if first argument is a 64 bit integer, it is passed via ecx and edx \item all other parameters are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify \item floating point types are returned via the st0 register@@@ really ? \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 fastcall (MS) calling convention} \end{figure} \pagebreak \subsubsection{GNU fastcall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch, parameter 0\\ {\bf edx} & scratch, parameter 1, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 fastcall (GNU) calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item called function cleans up the stack \item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments) \item if first argument is a 64 bit integer, it is pushed on the stack and the two registers are skipped \item all other parameters are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register. \item integers \textgreater\ 32 bits are returned via the eax and edx registers. \item floating point types are returned via the st0. \end{itemize} \pagebreak \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 fastcall (GNU) calling convention} \end{figure} \subsubsection{Borland fastcall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, parameter 0, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch, parameter 2\\ {\bf edx} & scratch, parameter 1, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 fastcall (Borland) calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: left-to-right \item called function cleans up the stack \item first three integers/pointers (\textless=\ 32bit) are passed via eax, ecx and edx (even if preceded by other arguments@@@?) \item integer types 64 bits in size @@@ ? \item all other parameters are pushed onto the stack \end{itemize} \pagebreak \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@ verify \item floating point types are returned via the st0 register@@@ really ? \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 fastcall (Borland) calling convention} \end{figure} \subsubsection{Watcom fastcall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, parameter 0, return value@@@\\ {\bf ebx} & scratch when used for parameter, parameter 2\\ {\bf ecx} & scratch when used for parameter, parameter 3\\ {\bf edx} & scratch when used for parameter, parameter 1, return value@@@\\ {\bf esi} & scratch when used for return pointer @@@??\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 fastcall (Watcom) calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item called function cleans up the stack \item first four integers/pointers (\textless=\ 32bit) are passed via eax, edx, ebx and ecx (even if preceded by other arguments@@@?) \item integer types 64 bits in size @@@ ? \item all other parameters are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register@@@verify, I thnik its esi? \item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@ verify \item floating point types are returned via the st0 register@@@ really ? \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 fastcall (Watcom) calling convention} \end{figure} \subsubsection{win32 stdcall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch\\ {\bf edx} & scratch, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 stdcall calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item Stack parameter order: right-to-left \item Called function cleans up the stack \item All parameters are pushed onto the stack \item Stack is usually 4 byte aligned (GCC \textgreater=\ 3.x seems to use a 16byte alignement@@@) \item Function name is decorated by prepending an underscore character and appending a '@' character and the number of bytes of stack space required \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers \item floating point types are returned via the st0 register \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 stdcall calling convention} \end{figure} \subsubsection{MS thiscall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch, parameter 0\\ {\bf edx} & scratch, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 thiscall (MS) calling convention} \end{table} \newpage \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item called function cleans up the stack \item first parameter (this pointer) is passed via ecx \item all other parameters are pushed onto the stack \item Function name is decorated by prepending a '@' character and appending a '@' character and the number of bytes (decimal) of stack space required \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify \item floating point types are returned via the st0 register@@@ really ? \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 thiscall (MS) calling convention} \end{figure} \subsubsection{GNU thiscall} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch\\ {\bf edx} & scratch, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 thiscall (GNU) calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack \item all parameters are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify \item floating point types are returned via the st0 register@@@ really ? \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 thiscall (GNU) calling convention} \end{figure} \subsubsection{pascal} The best known uses of the pascal calling convention are the 16 bit OS/2 APIs, Microsoft Windows 3.x and Borland Delphi 1.x. \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & permanent\\ {\bf ecx} & scratch\\ {\bf edx} & scratch, return value\\ {\bf esi} & permanent\\ {\bf edi} & permanent\\ {\bf ebp} & permanent\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 pascal calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: left-to-right \item called function cleans up the stack \item all parameters are pushed onto the stack \end{itemize} \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits are returned via the eax and edx registers \item floating point types are returned via the st0 register \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \caption{Stack layout on x86 pascal calling convention} \end{figure} \newpage \subsubsection{plan9call} \paragraph{Registers and register usage} \begin{table}[h] \begin{tabular}{3 B} \hline Name & Brief description\\ \hline {\bf eax} & scratch, return value\\ {\bf ebx} & scratch\\ {\bf ecx} & scratch\\ {\bf edx} & scratch\\ {\bf esi} & scratch\\ {\bf edi} & scratch\\ {\bf ebp} & scratch\\ {\bf esp} & stack pointer\\ {\bf st0} & scratch, floating point return value\\ {\bf st1-st7} & scratch\\ \hline \end{tabular} \caption{Register usage on x86 plan9call calling convention} \end{table} \paragraph{Parameter passing} \begin{itemize} \item stack parameter order: right-to-left \item caller cleans up the stack%@@@ doesn't belong to "parameter passing" \item all parameters are pushed onto the stack \end{itemize} \pagebreak \paragraph{Return values} \begin{itemize} \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register \item integers \textgreater\ 32 bits or structures are returned by the caller allocating the space and passing a pointer to the callee as a new, implicit first parameter (this means, on the stack) \item floating point types are returned via the st0 register (called F0 in plan9 8a's terms) \end{itemize} \paragraph{Stack layout} Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} \hhline{~-~~} & \vdots & & \\ \hhline{~=~~} local data & & & \mrrbrace{5}{caller's frame} \\ \hhline{~-~~} \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ & \ldots & & \\ & \ldots & & \\ \hhline{~-~~} & return address & & \\ \hhline{~=~~} local data & & & \mrrbrace{3}{current frame} \\ \hhline{~-~~} parameter area & & & \\ \hhline{~-~~} & \vdots & & \\ \hhline{~-~~} \end{tabular} \\ \\ \\ \caption{Stack layout on x86 plan9call calling convention} \end{figure} MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_logo.eps0000644000175000017500000005377712456307246022503 0ustar jnthnjnthn%!PS-Adobe-3.0 EPSF-3.0 %%Creator: 0.45pre1 %%Pages: 1 %%Orientation: Portrait %%BoundingBox: 28 43 573 661 %%HiResBoundingBox: 28.615222 43.973395 572.35188 660.44216 %%EndComments %%Page: 1 1 0 842 translate 0.8 -0.8 scale 0 0 0 setrgbcolor [] 0 setdash 1 setlinewidth 0 setlinejoin 0 setlinecap gsave [1 0 0 1 0 0] concat gsave [2.2965446 0 0 2.2965446 -189.23706 135.3048] concat gsave 0 0 0 setrgbcolor newpath 247.59 265.078 moveto 235.699 273.664 257.766 281.555 244.684 288.172 curveto 231.598 294.793 238.313 272.344 224.352 276.836 curveto 210.395 281.328 228.941 295.648 214.453 297.902 curveto 199.961 300.152 213.285 280.879 198.621 280.836 curveto 183.957 280.793 197.172 300.145 182.695 297.812 curveto 168.219 295.477 186.848 281.262 172.914 276.687 curveto 158.98 272.117 165.566 294.605 152.52 287.914 curveto 139.473 281.219 161.582 273.453 149.742 264.801 curveto 137.906 256.148 137.223 279.57 126.883 269.172 curveto 116.543 258.773 139.969 258.223 131.383 246.336 curveto 122.797 234.445 114.91 256.516 108.289 243.43 curveto 101.668 230.344 124.117 237.059 119.625 223.102 curveto 115.133 209.141 100.813 227.687 98.5586 213.199 curveto 96.3086 198.707 115.586 212.031 115.625 197.367 curveto 115.668 182.703 96.3164 195.918 98.6484 181.441 curveto 100.984 166.965 115.199 185.594 119.773 171.66 curveto 124.344 157.727 101.855 164.312 108.551 151.266 curveto 115.242 138.219 123.008 160.332 131.66 148.492 curveto 140.313 136.652 116.891 135.969 127.289 125.629 curveto 137.688 115.289 138.238 138.715 150.125 130.129 curveto 162.016 121.543 139.949 113.656 153.031 107.035 curveto 166.117 100.414 159.402 122.867 173.363 118.375 curveto 187.32 113.883 168.773 99.559 183.262 97.309 curveto 197.754 95.055 184.43 114.332 199.094 114.371 curveto 213.758 114.414 200.543 95.062 215.02 97.398 curveto 229.496 99.73 210.867 113.949 224.801 118.52 curveto 238.734 123.09 232.148 100.602 245.195 107.297 curveto 258.242 113.992 236.129 121.754 247.969 130.406 curveto 259.809 139.059 260.492 115.637 270.832 126.035 curveto 281.172 136.434 257.746 136.984 266.332 148.871 curveto 274.918 160.762 282.805 138.695 289.426 151.781 curveto 296.047 164.863 273.598 158.148 278.086 172.109 curveto 282.578 186.066 296.902 167.52 299.152 182.008 curveto 301.406 196.5 282.129 183.176 282.09 197.84 curveto 282.047 212.504 301.398 199.289 299.063 213.766 curveto 296.73 228.242 282.512 209.613 277.941 223.547 curveto 273.371 237.48 295.859 230.895 289.164 243.941 curveto 282.473 256.988 274.707 234.879 266.055 246.719 curveto 257.402 258.555 280.824 259.238 270.426 269.578 curveto 260.027 279.922 259.477 256.492 247.59 265.078 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 247.59 265.078 moveto 235.699 273.664 257.766 281.555 244.684 288.172 curveto 231.598 294.793 238.313 272.344 224.352 276.836 curveto 210.395 281.328 228.941 295.648 214.453 297.902 curveto 199.961 300.152 213.285 280.879 198.621 280.836 curveto 183.957 280.793 197.172 300.145 182.695 297.812 curveto 168.219 295.477 186.848 281.262 172.914 276.687 curveto 158.98 272.117 165.566 294.605 152.52 287.914 curveto 139.473 281.219 161.582 273.453 149.742 264.801 curveto 137.906 256.148 137.223 279.57 126.883 269.172 curveto 116.543 258.773 139.969 258.223 131.383 246.336 curveto 122.797 234.445 114.91 256.516 108.289 243.43 curveto 101.668 230.344 124.117 237.059 119.625 223.102 curveto 115.133 209.141 100.813 227.687 98.5586 213.199 curveto 96.3086 198.707 115.586 212.031 115.625 197.367 curveto 115.668 182.703 96.3164 195.918 98.6484 181.441 curveto 100.984 166.965 115.199 185.594 119.773 171.66 curveto 124.344 157.727 101.855 164.312 108.551 151.266 curveto 115.242 138.219 123.008 160.332 131.66 148.492 curveto 140.313 136.652 116.891 135.969 127.289 125.629 curveto 137.688 115.289 138.238 138.715 150.125 130.129 curveto 162.016 121.543 139.949 113.656 153.031 107.035 curveto 166.117 100.414 159.402 122.867 173.363 118.375 curveto 187.32 113.883 168.773 99.559 183.262 97.309 curveto 197.754 95.055 184.43 114.332 199.094 114.371 curveto 213.758 114.414 200.543 95.062 215.02 97.398 curveto 229.496 99.73 210.867 113.949 224.801 118.52 curveto 238.734 123.09 232.148 100.602 245.195 107.297 curveto 258.242 113.992 236.129 121.754 247.969 130.406 curveto 259.809 139.059 260.492 115.637 270.832 126.035 curveto 281.172 136.434 257.746 136.984 266.332 148.871 curveto 274.918 160.762 282.805 138.695 289.426 151.781 curveto 296.047 164.863 273.598 158.148 278.086 172.109 curveto 282.578 186.066 296.902 167.52 299.152 182.008 curveto 301.406 196.5 282.129 183.176 282.09 197.84 curveto 282.047 212.504 301.398 199.289 299.063 213.766 curveto 296.73 228.242 282.512 209.613 277.941 223.547 curveto 273.371 237.48 295.859 230.895 289.164 243.941 curveto 282.473 256.988 274.707 234.879 266.055 246.719 curveto 257.402 258.555 280.824 259.238 270.426 269.578 curveto 260.027 279.922 259.477 256.492 247.59 265.078 curveto closepath fill grestore 0 0 0 setrgbcolor [] 0 setdash 0.80000001 setlinewidth 0 setlinejoin 0 setlinecap newpath 247.59 265.078 moveto 235.699 273.664 257.766 281.555 244.684 288.172 curveto 231.598 294.793 238.313 272.344 224.352 276.836 curveto 210.395 281.328 228.941 295.648 214.453 297.902 curveto 199.961 300.152 213.285 280.879 198.621 280.836 curveto 183.957 280.793 197.172 300.145 182.695 297.812 curveto 168.219 295.477 186.848 281.262 172.914 276.687 curveto 158.98 272.117 165.566 294.605 152.52 287.914 curveto 139.473 281.219 161.582 273.453 149.742 264.801 curveto 137.906 256.148 137.223 279.57 126.883 269.172 curveto 116.543 258.773 139.969 258.223 131.383 246.336 curveto 122.797 234.445 114.91 256.516 108.289 243.43 curveto 101.668 230.344 124.117 237.059 119.625 223.102 curveto 115.133 209.141 100.813 227.687 98.5586 213.199 curveto 96.3086 198.707 115.586 212.031 115.625 197.367 curveto 115.668 182.703 96.3164 195.918 98.6484 181.441 curveto 100.984 166.965 115.199 185.594 119.773 171.66 curveto 124.344 157.727 101.855 164.312 108.551 151.266 curveto 115.242 138.219 123.008 160.332 131.66 148.492 curveto 140.313 136.652 116.891 135.969 127.289 125.629 curveto 137.688 115.289 138.238 138.715 150.125 130.129 curveto 162.016 121.543 139.949 113.656 153.031 107.035 curveto 166.117 100.414 159.402 122.867 173.363 118.375 curveto 187.32 113.883 168.773 99.559 183.262 97.309 curveto 197.754 95.055 184.43 114.332 199.094 114.371 curveto 213.758 114.414 200.543 95.062 215.02 97.398 curveto 229.496 99.73 210.867 113.949 224.801 118.52 curveto 238.734 123.09 232.148 100.602 245.195 107.297 curveto 258.242 113.992 236.129 121.754 247.969 130.406 curveto 259.809 139.059 260.492 115.637 270.832 126.035 curveto 281.172 136.434 257.746 136.984 266.332 148.871 curveto 274.918 160.762 282.805 138.695 289.426 151.781 curveto 296.047 164.863 273.598 158.148 278.086 172.109 curveto 282.578 186.066 296.902 167.52 299.152 182.008 curveto 301.406 196.5 282.129 183.176 282.09 197.84 curveto 282.047 212.504 301.398 199.289 299.063 213.766 curveto 296.73 228.242 282.512 209.613 277.941 223.547 curveto 273.371 237.48 295.859 230.895 289.164 243.941 curveto 282.473 256.988 274.707 234.879 266.055 246.719 curveto 257.402 258.555 280.824 259.238 270.426 269.578 curveto 260.027 279.922 259.477 256.492 247.59 265.078 curveto closepath stroke gsave 0 0 0 setrgbcolor newpath 354.973 349.148 moveto 345.719 361.668 345.527 339.457 333.348 349.156 curveto 321.172 358.855 342.773 364.012 328.5 370.227 curveto 314.227 376.441 325.164 357.113 309.77 359.422 curveto 294.375 361.734 310.504 377 295.035 375.246 curveto 279.566 373.492 298.703 362.223 284.215 356.527 curveto 269.727 350.828 276.063 372.113 263.543 362.859 curveto 251.023 353.609 273.23 353.418 263.535 341.238 curveto 253.836 329.062 248.68 350.664 242.465 336.391 curveto 236.246 322.117 255.574 333.055 253.266 317.66 curveto 250.957 302.266 235.688 318.395 237.441 302.926 curveto 239.195 287.457 250.465 306.594 256.164 292.105 curveto 261.863 277.617 240.574 283.953 249.828 271.434 curveto 259.082 258.914 259.273 281.121 271.449 271.422 curveto 283.629 261.727 262.027 256.566 276.301 250.352 curveto 290.574 244.137 279.633 263.465 295.031 261.156 curveto 310.426 258.848 294.297 243.578 309.766 245.332 curveto 325.234 247.086 306.098 258.355 320.586 264.055 curveto 335.07 269.75 328.738 248.465 341.258 257.719 curveto 353.777 266.973 331.57 267.16 341.266 279.34 curveto 350.965 291.52 356.121 269.918 362.336 284.191 curveto 368.551 298.465 349.223 287.523 351.535 302.918 curveto 353.844 318.316 369.109 302.187 367.355 317.656 curveto 365.602 333.125 354.336 313.988 348.637 328.473 curveto 342.938 342.961 364.227 336.629 354.973 349.148 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 354.973 349.148 moveto 345.719 361.668 345.527 339.457 333.348 349.156 curveto 321.172 358.855 342.773 364.012 328.5 370.227 curveto 314.227 376.441 325.164 357.113 309.77 359.422 curveto 294.375 361.734 310.504 377 295.035 375.246 curveto 279.566 373.492 298.703 362.223 284.215 356.527 curveto 269.727 350.828 276.063 372.113 263.543 362.859 curveto 251.023 353.609 273.23 353.418 263.535 341.238 curveto 253.836 329.062 248.68 350.664 242.465 336.391 curveto 236.246 322.117 255.574 333.055 253.266 317.66 curveto 250.957 302.266 235.688 318.395 237.441 302.926 curveto 239.195 287.457 250.465 306.594 256.164 292.105 curveto 261.863 277.617 240.574 283.953 249.828 271.434 curveto 259.082 258.914 259.273 281.121 271.449 271.422 curveto 283.629 261.727 262.027 256.566 276.301 250.352 curveto 290.574 244.137 279.633 263.465 295.031 261.156 curveto 310.426 258.848 294.297 243.578 309.766 245.332 curveto 325.234 247.086 306.098 258.355 320.586 264.055 curveto 335.07 269.75 328.738 248.465 341.258 257.719 curveto 353.777 266.973 331.57 267.16 341.266 279.34 curveto 350.965 291.52 356.121 269.918 362.336 284.191 curveto 368.551 298.465 349.223 287.523 351.535 302.918 curveto 353.844 318.316 369.109 302.187 367.355 317.656 curveto 365.602 333.125 354.336 313.988 348.637 328.473 curveto 342.938 342.961 364.227 336.629 354.973 349.148 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 307.188 310.25 moveto 307.188 312.992 304.969 315.223 302.238 315.223 curveto 299.504 315.223 297.289 312.992 297.289 310.25 curveto 297.289 307.504 299.504 305.277 302.238 305.277 curveto 304.969 305.277 307.188 307.504 307.188 310.25 curveto closepath fill grestore gsave 1 1 1 setrgbcolor newpath 307.188 310.25 moveto 307.188 312.992 304.969 315.223 302.238 315.223 curveto 299.504 315.223 297.289 312.992 297.289 310.25 curveto 297.289 307.504 299.504 305.277 302.238 305.277 curveto 304.969 305.277 307.188 307.504 307.188 310.25 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 273.918 198.176 moveto 273.918 239.805 240.289 273.59 198.855 273.59 curveto 157.426 273.59 123.797 239.805 123.797 198.176 curveto 123.797 156.547 157.426 122.758 198.855 122.758 curveto 240.289 122.758 273.918 156.547 273.918 198.176 curveto closepath fill grestore gsave 1 1 1 setrgbcolor newpath 273.918 198.176 moveto 273.918 239.805 240.289 273.59 198.855 273.59 curveto 157.426 273.59 123.797 239.805 123.797 198.176 curveto 123.797 156.547 157.426 122.758 198.855 122.758 curveto 240.289 122.758 273.918 156.547 273.918 198.176 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 203.785 198.195 moveto 203.785 200.941 201.566 203.168 198.836 203.168 curveto 196.105 203.168 193.887 200.941 193.887 198.195 curveto 193.887 195.449 196.105 193.223 198.836 193.223 curveto 201.566 193.223 203.785 195.449 203.785 198.195 curveto closepath fill grestore gsave 0 0 0 setrgbcolor newpath 203.785 198.195 moveto 203.785 200.941 201.566 203.168 198.836 203.168 curveto 196.105 203.168 193.887 200.941 193.887 198.195 curveto 193.887 195.449 196.105 193.223 198.836 193.223 curveto 201.566 193.223 203.785 195.449 203.785 198.195 curveto closepath fill grestore gsave [0.4354368 0 0 0.4354368 82.400777 -58.916687] concat gsave 0 0 0 setrgbcolor newpath 372.4375 226.8125 moveto 350.03614 226.99774 326.37254 235.86686 301.53125 253.375 curveto 368.53125 345.625 lineto 371.39273 344.04727 374.33807 342.1941 377.40625 339.96875 curveto 419.75 309.1875 lineto 431.09721 316.83039 443.82523 328.92944 457.9375 345.375 curveto 557.875 482.9375 lineto 569.15331 501.44535 576.62605 517.13205 580.25 530.09375 curveto 537.90625 560.875 lineto 534.83804 563.09806 532.16736 565.31878 529.78125 567.5625 curveto 596.78125 659.75 lineto 626.75298 637.33253 643.69738 612.67138 647.59375 585.75 curveto 651.58512 558.10191 635.79682 513.598 600.21875 452.15625 curveto 582.8125 425.21875 lineto 552.28125 381.71875 lineto 520.53125 339.46875 lineto 500.28125 314.625 lineto 452.84383 261.79529 415.32322 232.90591 387.71875 228.0625 curveto 382.68286 227.17934 377.60704 226.76975 372.4375 226.8125 curveto closepath 298.59375 255.53125 moveto 292.22542 260.26672 288.42952 265.62733 287.28125 271.59375 curveto 286.09854 277.70256 287.25876 283.07104 290.6875 287.78125 curveto 328.125 339.34375 lineto 337.38467 352.07348 349.72995 354.71426 365.25 347.3125 curveto 298.59375 255.53125 lineto closepath 527.15625 570.15625 moveto 515.3428 582.66092 514.16594 595.3595 523.53125 608.25 curveto 560.71875 659.46875 lineto 564.28758 664.37648 569.05433 667.18005 575.15625 667.84375 curveto 581.11347 668.50094 587.37058 666.49603 593.84375 661.90625 curveto 527.15625 570.15625 lineto closepath fill grestore grestore gsave [0.4354368 0 0 0.4354368 82.400777 -58.916687] concat gsave 0 0 0 setrgbcolor newpath 658.03125 626.5625 moveto 655.25013 626.68881 652.89528 628.64662 650.5 630.34375 curveto 645.86328 633.50839 641.64235 636.86247 638 641.6875 curveto 636.50265 643.53622 636.13403 645.73808 635.8125 648.3125 curveto 635.79309 648.61363 635.79586 648.91743 635.78125 649.21875 curveto 635.23223 649.19257 634.70569 649.15791 634.15625 649.09375 curveto 632.90004 648.82505 631.6188 648.56494 630.40625 648 curveto 629.26716 647.40749 628.11703 646.83331 626.96875 646.25 curveto 626.10755 645.68505 625.17836 645.1645 624.46875 644.3125 curveto 623.94054 642.88405 623.48803 641.40243 622.5625 640.34375 curveto 621.71048 638.89922 620.89835 637.66941 620.78125 635.6875 curveto 620.55619 633.53334 620.32635 631.3761 620.46875 629.1875 curveto 613.25 634.125 lineto 613.24081 636.35035 613.4845 638.53016 613.71875 640.71875 curveto 613.85195 642.89817 614.81159 644.35797 615.71875 646 curveto 616.57995 646.98751 616.99334 648.35779 617.46875 649.6875 curveto 618.15771 650.96897 619.23721 651.5114 620.25 652.21875 curveto 621.40746 652.85489 622.58337 653.44241 623.75 654.0625 curveto 624.99702 654.6619 626.29163 654.97031 627.59375 655.3125 curveto 629.14392 655.59038 630.71963 655.55329 632.28125 655.5625 curveto 633.40247 655.5625 634.53435 655.59144 635.65625 655.59375 curveto 635.65602 655.66675 635.65652 655.73949 635.65625 655.8125 curveto 635.50468 658.17335 636.22468 660.11922 636.96875 662.15625 curveto 637.87359 664.67786 639.42176 666.43805 640.9375 668.25 curveto 642.75866 670.26866 644.74418 671.94434 646.78125 673.53125 curveto 648.69198 674.7622 650.70926 675.69811 652.71875 676.59375 curveto 656.14519 677.86833 659.603 678.9573 663.09375 679.84375 curveto 664.02122 680.06128 664.94201 680.22593 665.875 680.375 curveto 665.76219 683.23707 665.89639 686.10725 666.03125 688.96875 curveto 666.10244 692.71901 667.28887 695.7388 668.6875 698.84375 curveto 670.90367 702.89715 674.1061 705.11973 677.40625 707.21875 curveto 680.51905 709.33564 683.68848 711.12476 686.96875 712.5 curveto 686.27445 713.84958 685.59527 715.21275 684.90625 716.5625 curveto 682.09758 722.75398 678.51334 728.5208 676.84375 735.5 curveto 675.95499 739.41102 676.12805 743.17354 676.65625 747.09375 curveto 676.74319 747.40856 676.86916 747.69777 676.96875 748 curveto 676.52343 748.36731 676.07405 748.71255 675.59375 749.09375 curveto 670.58669 754.22361 665.07597 758.95221 661.40625 765.0625 curveto 657.98224 768.95528 656.79145 775.20535 655.40625 780.0625 curveto 655.2626 780.90806 655.17126 781.73797 655.09375 782.59375 curveto 649.8835 782.96621 644.62777 782.87146 639.46875 783.84375 curveto 635.56462 784.53271 632.0128 786.6759 628.53125 789 curveto 622.53125 795.4375 lineto 625.97607 793.00776 629.52281 790.76565 633.40625 789.96875 curveto 639.26474 788.76536 645.21139 788.7314 651.125 788.28125 curveto 652.35836 788.26976 653.60825 788.24556 654.84375 788.25 curveto 654.84003 788.40659 654.81634 788.56232 654.8125 788.71875 curveto 654.55299 791.19672 655.30873 793.18268 656 795.34375 curveto 656.83365 797.38997 658.11847 798.37459 659.625 799.34375 curveto 661.09709 800.08094 662.63732 800.14753 664.1875 800.21875 curveto 669.26516 800.59538 669.3314 799.11144 675.34375 794.5 curveto 676.12458 792.20346 675.99662 789.97387 675.71875 787.5625 curveto 675.05505 784.64589 673.67862 783.925 671.6875 782.9375 curveto 668.45971 782.35662 665.19867 782.29356 661.9375 782.34375 curveto 661.99928 780.03433 662.13138 777.7163 662.5625 775.46875 curveto 663.21931 772.65089 665.09458 768.82277 666.65625 766.625 curveto 669.20204 762.82554 674.96145 757.26163 679.21875 752.75 curveto 680.48024 754.70163 681.99017 756.37702 683.53125 758 curveto 686.32155 761.1233 689.50188 762.95982 692.9375 764.3125 curveto 698.33668 765.34595 703.75165 760.99336 705.125 753.90625 curveto 705.07907 749.0904 703.10202 746.54029 700.5 743.75 curveto 697.42263 741.67852 693.98575 741.28994 690.59375 741.21875 curveto 687.88208 741.05633 685.78146 741.65596 683.8125 742.75 curveto 683.7427 742.52184 683.65599 742.29759 683.59375 742.0625 curveto 683.15281 738.33062 683.00463 734.75992 683.875 731.0625 curveto 685.46098 724.86821 688.28073 719.4255 690.90625 713.9375 curveto 691.22142 714.03134 691.52582 714.13349 691.84375 714.21875 curveto 696.29445 715.15115 700.80898 715.7729 705.3125 715.59375 curveto 712.04827 712.56001 715.54313 710.41086 715.4375 701.96875 curveto 714.16292 697.58235 711.70289 695.58585 708.6875 693.71875 curveto 702.80375 691.93433 701.13556 695.05715 695.1875 699.625 curveto 693.53745 701.46038 692.0678 703.5253 690.71875 705.71875 curveto 688.35474 704.56503 686.06885 703.15492 683.8125 701.53125 curveto 680.66394 699.5034 677.577 697.39496 675.46875 693.5 curveto 674.16891 690.53975 673.05511 687.64651 673 684.09375 curveto 672.95152 683.08548 672.91042 682.07355 672.875 681.0625 curveto 673.39623 681.09037 673.91645 681.10166 674.4375 681.125 curveto 680.69099 681.79789 681.20995 680.48892 687.8125 675.3125 curveto 688.98833 672.67377 689.34532 669.61282 689.6875 666.625 curveto 690.14451 664.07813 689.48216 662.14768 688.84375 659.90625 curveto 687.75059 657.69008 686.23662 657.37616 684.40625 656.9375 curveto 679.84991 657.2682 677.68005 660.39024 673.25 663.90625 curveto 671.64242 665.98692 670.31033 668.38726 668.875 670.65625 curveto 668.22014 671.50865 667.68792 672.40889 667.28125 673.34375 curveto 664.57176 672.59674 661.8957 671.71207 659.25 670.625 curveto 657.27727 669.75461 655.34822 668.76456 653.4375 667.6875 curveto 651.41884 666.19934 649.42459 664.62531 647.65625 662.625 curveto 646.22091 660.89341 644.74907 659.20782 643.90625 656.8125 curveto 643.7724 656.39254 643.63115 656.00124 643.5 655.59375 curveto 644.57691 655.47117 645.61819 655.10606 646.6875 654.65625 curveto 650.86951 652.64677 654.50896 649.03691 658.25 645.96875 curveto 659.64171 644.67809 660.68762 642.95584 661.71875 641.1875 curveto 662.92903 639.79809 663.36287 638.192 663.875 636.28125 curveto 664.2769 634.48765 664.0693 632.80647 663.90625 631.03125 curveto 663.44005 629.56835 662.50829 628.61573 661.65625 627.59375 curveto 660.54243 626.59935 659.29433 626.68878 658.03125 626.5625 curveto closepath 651.59375 632.9375 moveto 652.70528 632.94669 653.82545 632.75541 654.875 633.4375 curveto 655.57315 634.28952 656.43586 634.96251 656.8125 636.21875 curveto 656.84006 637.7804 657.06596 639.3538 656.625 640.90625 curveto 655.99804 642.54828 655.39699 644.08803 654.375 645.40625 curveto 653.69487 646.41725 653.04785 647.44777 652.3125 648.375 curveto 651.04694 648.99271 649.80651 649.46345 648.40625 649.25 curveto 646.96172 649.25 645.53825 649.22245 644.09375 649.25 curveto 643.65774 649.25226 643.21826 649.24788 642.78125 649.25 curveto 642.78082 647.36247 642.78858 645.46453 642.96875 643.59375 curveto 643.38213 641.22601 643.91759 639.27024 645.34375 637.59375 curveto 646.19916 636.54731 647.61346 635.06047 648.75 633.875 curveto 649.65408 633.38586 650.59819 633.04515 651.59375 632.9375 curveto closepath 678.1875 663.1875 moveto 679.71023 663.37727 680.96176 663.5183 681.9375 665.34375 curveto 682.48408 667.34404 682.95384 669.10601 682.53125 671.375 curveto 682.38459 672.63589 682.23887 673.8787 682 675.09375 curveto 681.58116 675.08836 681.16759 675.06947 680.75 675 curveto 678.17138 674.93272 675.57044 674.82459 673 674.5 curveto 673.03456 674.16414 673.07882 673.83509 673.125 673.5 curveto 673.73358 670.81764 674.60007 668.55909 676.125 666.53125 curveto 676.81974 665.43557 677.47675 664.27416 678.1875 663.1875 curveto closepath 700.5 699.40625 moveto 701.05272 699.40103 701.6068 699.45907 702.15625 699.625 curveto 704.99248 701.1522 707.3549 702.74812 708.46875 706.875 curveto 708.43173 707.89726 708.31328 708.77868 708.1875 709.5625 curveto 704.78983 709.55023 701.3882 709.01624 698.03125 708.4375 curveto 696.80899 708.12018 695.59215 707.71996 694.40625 707.28125 curveto 695.91621 704.55008 697.51405 701.90285 699.3125 699.53125 curveto 699.69159 699.47092 700.09085 699.41011 700.5 699.40625 curveto closepath 707 713.4375 moveto 706.73935 713.87833 706.68419 713.86452 707 713.4375 curveto closepath 689.71875 747 moveto 691.4837 747.02838 692.01015 748.328 693.90625 749.4375 curveto 696.21719 751.77455 697.96769 753.84841 698.0625 757.84375 curveto 695.14109 756.75553 692.4328 755.19472 690.03125 752.5 curveto 688.68709 751.09314 687.36714 749.5936 686.25 747.90625 curveto 687.81088 747.26499 688.91885 746.98714 689.71875 747 curveto closepath 662.53125 788.625 moveto 663.41661 788.72096 664.30614 788.81888 665.1875 788.96875 curveto 666.91909 789.6669 668.06375 790.13097 668.65625 792.625 curveto 668.69532 793.04687 668.72432 793.44288 668.75 793.84375 curveto 667.9077 793.78585 667.069 793.6661 666.25 793.34375 curveto 664.90422 792.47336 663.70365 791.91625 662.96875 789.96875 curveto 662.81877 789.51249 662.66908 789.0682 662.53125 788.625 curveto closepath fill grestore grestore grestore grestore showpage %%EOF MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_logo.pdf0000644000175000017500000004744712456307246022462 0ustar jnthnjnthn%PDF-1.4 %Âéî¡ 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Type /Page /Parent 2 0 R /MediaBox [ 0 0 595.27557373 841.88977051 ] /Resources 5 0 R /Contents 6 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> >> endobj 6 0 obj << /Length 7 0 R >> stream 0.8 0 0 -0.8 0 842 cm q 1 0 0 1 0 0 cm q 2.2965446 0 0 2.2965446 -189.23706 135.3048 cm q 0 0 0 rg 247.59 265.078 m 235.699 273.664 257.766 281.555 244.684 288.172 c 231.598 294.793 238.313 272.344 224.352 276.836 c 210.395 281.328 228.941 295.648 214.453 297.902 c 199.961 300.152 213.285 280.879 198.621 280.836 c 183.957 280.793 197.172 300.145 182.695 297.812 c 168.219 295.477 186.848 281.262 172.914 276.687 c 158.98 272.117 165.566 294.605 152.52 287.914 c 139.473 281.219 161.582 273.453 149.742 264.801 c 137.906 256.148 137.223 279.57 126.883 269.172 c 116.543 258.773 139.969 258.223 131.383 246.336 c 122.797 234.445 114.91 256.516 108.289 243.43 c 101.668 230.344 124.117 237.059 119.625 223.102 c 115.133 209.141 100.813 227.687 98.5586 213.199 c 96.3086 198.707 115.586 212.031 115.625 197.367 c 115.668 182.703 96.3164 195.918 98.6484 181.441 c 100.984 166.965 115.199 185.594 119.773 171.66 c 124.344 157.727 101.855 164.312 108.551 151.266 c 115.242 138.219 123.008 160.332 131.66 148.492 c 140.313 136.652 116.891 135.969 127.289 125.629 c 137.688 115.289 138.238 138.715 150.125 130.129 c 162.016 121.543 139.949 113.656 153.031 107.035 c 166.117 100.414 159.402 122.867 173.363 118.375 c 187.32 113.883 168.773 99.559 183.262 97.309 c 197.754 95.055 184.43 114.332 199.094 114.371 c 213.758 114.414 200.543 95.062 215.02 97.398 c 229.496 99.73 210.867 113.949 224.801 118.52 c 238.734 123.09 232.148 100.602 245.195 107.297 c 258.242 113.992 236.129 121.754 247.969 130.406 c 259.809 139.059 260.492 115.637 270.832 126.035 c 281.172 136.434 257.746 136.984 266.332 148.871 c 274.918 160.762 282.805 138.695 289.426 151.781 c 296.047 164.863 273.598 158.148 278.086 172.109 c 282.578 186.066 296.902 167.52 299.152 182.008 c 301.406 196.5 282.129 183.176 282.09 197.84 c 282.047 212.504 301.398 199.289 299.063 213.766 c 296.73 228.242 282.512 209.613 277.941 223.547 c 273.371 237.48 295.859 230.895 289.164 243.941 c 282.473 256.988 274.707 234.879 266.055 246.719 c 257.402 258.555 280.824 259.238 270.426 269.578 c 260.027 279.922 259.477 256.492 247.59 265.078 c h f Q q 0 0 0 rg 247.59 265.078 m 235.699 273.664 257.766 281.555 244.684 288.172 c 231.598 294.793 238.313 272.344 224.352 276.836 c 210.395 281.328 228.941 295.648 214.453 297.902 c 199.961 300.152 213.285 280.879 198.621 280.836 c 183.957 280.793 197.172 300.145 182.695 297.812 c 168.219 295.477 186.848 281.262 172.914 276.687 c 158.98 272.117 165.566 294.605 152.52 287.914 c 139.473 281.219 161.582 273.453 149.742 264.801 c 137.906 256.148 137.223 279.57 126.883 269.172 c 116.543 258.773 139.969 258.223 131.383 246.336 c 122.797 234.445 114.91 256.516 108.289 243.43 c 101.668 230.344 124.117 237.059 119.625 223.102 c 115.133 209.141 100.813 227.687 98.5586 213.199 c 96.3086 198.707 115.586 212.031 115.625 197.367 c 115.668 182.703 96.3164 195.918 98.6484 181.441 c 100.984 166.965 115.199 185.594 119.773 171.66 c 124.344 157.727 101.855 164.312 108.551 151.266 c 115.242 138.219 123.008 160.332 131.66 148.492 c 140.313 136.652 116.891 135.969 127.289 125.629 c 137.688 115.289 138.238 138.715 150.125 130.129 c 162.016 121.543 139.949 113.656 153.031 107.035 c 166.117 100.414 159.402 122.867 173.363 118.375 c 187.32 113.883 168.773 99.559 183.262 97.309 c 197.754 95.055 184.43 114.332 199.094 114.371 c 213.758 114.414 200.543 95.062 215.02 97.398 c 229.496 99.73 210.867 113.949 224.801 118.52 c 238.734 123.09 232.148 100.602 245.195 107.297 c 258.242 113.992 236.129 121.754 247.969 130.406 c 259.809 139.059 260.492 115.637 270.832 126.035 c 281.172 136.434 257.746 136.984 266.332 148.871 c 274.918 160.762 282.805 138.695 289.426 151.781 c 296.047 164.863 273.598 158.148 278.086 172.109 c 282.578 186.066 296.902 167.52 299.152 182.008 c 301.406 196.5 282.129 183.176 282.09 197.84 c 282.047 212.504 301.398 199.289 299.063 213.766 c 296.73 228.242 282.512 209.613 277.941 223.547 c 273.371 237.48 295.859 230.895 289.164 243.941 c 282.473 256.988 274.707 234.879 266.055 246.719 c 257.402 258.555 280.824 259.238 270.426 269.578 c 260.027 279.922 259.477 256.492 247.59 265.078 c h f Q q 0 0 0 RG [] 0 d 0.80000001 w 0 j 0 J 10 M 247.59 265.078 m 235.699 273.664 257.766 281.555 244.684 288.172 c 231.598 294.793 238.313 272.344 224.352 276.836 c 210.395 281.328 228.941 295.648 214.453 297.902 c 199.961 300.152 213.285 280.879 198.621 280.836 c 183.957 280.793 197.172 300.145 182.695 297.812 c 168.219 295.477 186.848 281.262 172.914 276.687 c 158.98 272.117 165.566 294.605 152.52 287.914 c 139.473 281.219 161.582 273.453 149.742 264.801 c 137.906 256.148 137.223 279.57 126.883 269.172 c 116.543 258.773 139.969 258.223 131.383 246.336 c 122.797 234.445 114.91 256.516 108.289 243.43 c 101.668 230.344 124.117 237.059 119.625 223.102 c 115.133 209.141 100.813 227.687 98.5586 213.199 c 96.3086 198.707 115.586 212.031 115.625 197.367 c 115.668 182.703 96.3164 195.918 98.6484 181.441 c 100.984 166.965 115.199 185.594 119.773 171.66 c 124.344 157.727 101.855 164.312 108.551 151.266 c 115.242 138.219 123.008 160.332 131.66 148.492 c 140.313 136.652 116.891 135.969 127.289 125.629 c 137.688 115.289 138.238 138.715 150.125 130.129 c 162.016 121.543 139.949 113.656 153.031 107.035 c 166.117 100.414 159.402 122.867 173.363 118.375 c 187.32 113.883 168.773 99.559 183.262 97.309 c 197.754 95.055 184.43 114.332 199.094 114.371 c 213.758 114.414 200.543 95.062 215.02 97.398 c 229.496 99.73 210.867 113.949 224.801 118.52 c 238.734 123.09 232.148 100.602 245.195 107.297 c 258.242 113.992 236.129 121.754 247.969 130.406 c 259.809 139.059 260.492 115.637 270.832 126.035 c 281.172 136.434 257.746 136.984 266.332 148.871 c 274.918 160.762 282.805 138.695 289.426 151.781 c 296.047 164.863 273.598 158.148 278.086 172.109 c 282.578 186.066 296.902 167.52 299.152 182.008 c 301.406 196.5 282.129 183.176 282.09 197.84 c 282.047 212.504 301.398 199.289 299.063 213.766 c 296.73 228.242 282.512 209.613 277.941 223.547 c 273.371 237.48 295.859 230.895 289.164 243.941 c 282.473 256.988 274.707 234.879 266.055 246.719 c 257.402 258.555 280.824 259.238 270.426 269.578 c 260.027 279.922 259.477 256.492 247.59 265.078 c h S Q q 0 0 0 rg 354.973 349.148 m 345.719 361.668 345.527 339.457 333.348 349.156 c 321.172 358.855 342.773 364.012 328.5 370.227 c 314.227 376.441 325.164 357.113 309.77 359.422 c 294.375 361.734 310.504 377 295.035 375.246 c 279.566 373.492 298.703 362.223 284.215 356.527 c 269.727 350.828 276.063 372.113 263.543 362.859 c 251.023 353.609 273.23 353.418 263.535 341.238 c 253.836 329.062 248.68 350.664 242.465 336.391 c 236.246 322.117 255.574 333.055 253.266 317.66 c 250.957 302.266 235.688 318.395 237.441 302.926 c 239.195 287.457 250.465 306.594 256.164 292.105 c 261.863 277.617 240.574 283.953 249.828 271.434 c 259.082 258.914 259.273 281.121 271.449 271.422 c 283.629 261.727 262.027 256.566 276.301 250.352 c 290.574 244.137 279.633 263.465 295.031 261.156 c 310.426 258.848 294.297 243.578 309.766 245.332 c 325.234 247.086 306.098 258.355 320.586 264.055 c 335.07 269.75 328.738 248.465 341.258 257.719 c 353.777 266.973 331.57 267.16 341.266 279.34 c 350.965 291.52 356.121 269.918 362.336 284.191 c 368.551 298.465 349.223 287.523 351.535 302.918 c 353.844 318.316 369.109 302.187 367.355 317.656 c 365.602 333.125 354.336 313.988 348.637 328.473 c 342.938 342.961 364.227 336.629 354.973 349.148 c h f Q q 0 0 0 rg 354.973 349.148 m 345.719 361.668 345.527 339.457 333.348 349.156 c 321.172 358.855 342.773 364.012 328.5 370.227 c 314.227 376.441 325.164 357.113 309.77 359.422 c 294.375 361.734 310.504 377 295.035 375.246 c 279.566 373.492 298.703 362.223 284.215 356.527 c 269.727 350.828 276.063 372.113 263.543 362.859 c 251.023 353.609 273.23 353.418 263.535 341.238 c 253.836 329.062 248.68 350.664 242.465 336.391 c 236.246 322.117 255.574 333.055 253.266 317.66 c 250.957 302.266 235.688 318.395 237.441 302.926 c 239.195 287.457 250.465 306.594 256.164 292.105 c 261.863 277.617 240.574 283.953 249.828 271.434 c 259.082 258.914 259.273 281.121 271.449 271.422 c 283.629 261.727 262.027 256.566 276.301 250.352 c 290.574 244.137 279.633 263.465 295.031 261.156 c 310.426 258.848 294.297 243.578 309.766 245.332 c 325.234 247.086 306.098 258.355 320.586 264.055 c 335.07 269.75 328.738 248.465 341.258 257.719 c 353.777 266.973 331.57 267.16 341.266 279.34 c 350.965 291.52 356.121 269.918 362.336 284.191 c 368.551 298.465 349.223 287.523 351.535 302.918 c 353.844 318.316 369.109 302.187 367.355 317.656 c 365.602 333.125 354.336 313.988 348.637 328.473 c 342.938 342.961 364.227 336.629 354.973 349.148 c h f Q q 0 0 0 rg 307.188 310.25 m 307.188 312.992 304.969 315.223 302.238 315.223 c 299.504 315.223 297.289 312.992 297.289 310.25 c 297.289 307.504 299.504 305.277 302.238 305.277 c 304.969 305.277 307.188 307.504 307.188 310.25 c h f Q q 1 1 1 rg 307.188 310.25 m 307.188 312.992 304.969 315.223 302.238 315.223 c 299.504 315.223 297.289 312.992 297.289 310.25 c 297.289 307.504 299.504 305.277 302.238 305.277 c 304.969 305.277 307.188 307.504 307.188 310.25 c h f Q q 0 0 0 rg 273.918 198.176 m 273.918 239.805 240.289 273.59 198.855 273.59 c 157.426 273.59 123.797 239.805 123.797 198.176 c 123.797 156.547 157.426 122.758 198.855 122.758 c 240.289 122.758 273.918 156.547 273.918 198.176 c h f Q q 1 1 1 rg 273.918 198.176 m 273.918 239.805 240.289 273.59 198.855 273.59 c 157.426 273.59 123.797 239.805 123.797 198.176 c 123.797 156.547 157.426 122.758 198.855 122.758 c 240.289 122.758 273.918 156.547 273.918 198.176 c h f Q q 0 0 0 rg 203.785 198.195 m 203.785 200.941 201.566 203.168 198.836 203.168 c 196.105 203.168 193.887 200.941 193.887 198.195 c 193.887 195.449 196.105 193.223 198.836 193.223 c 201.566 193.223 203.785 195.449 203.785 198.195 c h f Q q 0 0 0 rg 203.785 198.195 m 203.785 200.941 201.566 203.168 198.836 203.168 c 196.105 203.168 193.887 200.941 193.887 198.195 c 193.887 195.449 196.105 193.223 198.836 193.223 c 201.566 193.223 203.785 195.449 203.785 198.195 c h f Q q 0.4354368 0 0 0.4354368 82.400777 -58.916687 cm q 0 0 0 rg 372.4375 226.8125 m 350.03614 226.99774 326.37254 235.86686 301.53125 253.375 c 368.53125 345.625 l 371.39273 344.04727 374.33807 342.1941 377.40625 339.96875 c 419.75 309.1875 l 431.09721 316.83039 443.82523 328.92944 457.9375 345.375 c 557.875 482.9375 l 569.15331 501.44535 576.62605 517.13205 580.25 530.09375 c 537.90625 560.875 l 534.83804 563.09806 532.16736 565.31878 529.78125 567.5625 c 596.78125 659.75 l 626.75298 637.33253 643.69738 612.67138 647.59375 585.75 c 651.58512 558.10191 635.79682 513.598 600.21875 452.15625 c 582.8125 425.21875 l 552.28125 381.71875 l 520.53125 339.46875 l 500.28125 314.625 l 452.84383 261.79529 415.32322 232.90591 387.71875 228.0625 c 382.68286 227.17934 377.60704 226.76975 372.4375 226.8125 c h 298.59375 255.53125 m 292.22542 260.26672 288.42952 265.62733 287.28125 271.59375 c 286.09854 277.70256 287.25876 283.07104 290.6875 287.78125 c 328.125 339.34375 l 337.38467 352.07348 349.72995 354.71426 365.25 347.3125 c 298.59375 255.53125 l h 527.15625 570.15625 m 515.3428 582.66092 514.16594 595.3595 523.53125 608.25 c 560.71875 659.46875 l 564.28758 664.37648 569.05433 667.18005 575.15625 667.84375 c 581.11347 668.50094 587.37058 666.49603 593.84375 661.90625 c 527.15625 570.15625 l h f Q Q q 0.4354368 0 0 0.4354368 82.400777 -58.916687 cm q 0 0 0 rg 658.03125 626.5625 m 655.25013 626.68881 652.89528 628.64662 650.5 630.34375 c 645.86328 633.50839 641.64235 636.86247 638 641.6875 c 636.50265 643.53622 636.13403 645.73808 635.8125 648.3125 c 635.79309 648.61363 635.79586 648.91743 635.78125 649.21875 c 635.23223 649.19257 634.70569 649.15791 634.15625 649.09375 c 632.90004 648.82505 631.6188 648.56494 630.40625 648 c 629.26716 647.40749 628.11703 646.83331 626.96875 646.25 c 626.10755 645.68505 625.17836 645.1645 624.46875 644.3125 c 623.94054 642.88405 623.48803 641.40243 622.5625 640.34375 c 621.71048 638.89922 620.89835 637.66941 620.78125 635.6875 c 620.55619 633.53334 620.32635 631.3761 620.46875 629.1875 c 613.25 634.125 l 613.24081 636.35035 613.4845 638.53016 613.71875 640.71875 c 613.85195 642.89817 614.81159 644.35797 615.71875 646 c 616.57995 646.98751 616.99334 648.35779 617.46875 649.6875 c 618.15771 650.96897 619.23721 651.5114 620.25 652.21875 c 621.40746 652.85489 622.58337 653.44241 623.75 654.0625 c 624.99702 654.6619 626.29163 654.97031 627.59375 655.3125 c 629.14392 655.59038 630.71963 655.55329 632.28125 655.5625 c 633.40247 655.5625 634.53435 655.59144 635.65625 655.59375 c 635.65602 655.66675 635.65652 655.73949 635.65625 655.8125 c 635.50468 658.17335 636.22468 660.11922 636.96875 662.15625 c 637.87359 664.67786 639.42176 666.43805 640.9375 668.25 c 642.75866 670.26866 644.74418 671.94434 646.78125 673.53125 c 648.69198 674.7622 650.70926 675.69811 652.71875 676.59375 c 656.14519 677.86833 659.603 678.9573 663.09375 679.84375 c 664.02122 680.06128 664.94201 680.22593 665.875 680.375 c 665.76219 683.23707 665.89639 686.10725 666.03125 688.96875 c 666.10244 692.71901 667.28887 695.7388 668.6875 698.84375 c 670.90367 702.89715 674.1061 705.11973 677.40625 707.21875 c 680.51905 709.33564 683.68848 711.12476 686.96875 712.5 c 686.27445 713.84958 685.59527 715.21275 684.90625 716.5625 c 682.09758 722.75398 678.51334 728.5208 676.84375 735.5 c 675.95499 739.41102 676.12805 743.17354 676.65625 747.09375 c 676.74319 747.40856 676.86916 747.69777 676.96875 748 c 676.52343 748.36731 676.07405 748.71255 675.59375 749.09375 c 670.58669 754.22361 665.07597 758.95221 661.40625 765.0625 c 657.98224 768.95528 656.79145 775.20535 655.40625 780.0625 c 655.2626 780.90806 655.17126 781.73797 655.09375 782.59375 c 649.8835 782.96621 644.62777 782.87146 639.46875 783.84375 c 635.56462 784.53271 632.0128 786.6759 628.53125 789 c 622.53125 795.4375 l 625.97607 793.00776 629.52281 790.76565 633.40625 789.96875 c 639.26474 788.76536 645.21139 788.7314 651.125 788.28125 c 652.35836 788.26976 653.60825 788.24556 654.84375 788.25 c 654.84003 788.40659 654.81634 788.56232 654.8125 788.71875 c 654.55299 791.19672 655.30873 793.18268 656 795.34375 c 656.83365 797.38997 658.11847 798.37459 659.625 799.34375 c 661.09709 800.08094 662.63732 800.14753 664.1875 800.21875 c 669.26516 800.59538 669.3314 799.11144 675.34375 794.5 c 676.12458 792.20346 675.99662 789.97387 675.71875 787.5625 c 675.05505 784.64589 673.67862 783.925 671.6875 782.9375 c 668.45971 782.35662 665.19867 782.29356 661.9375 782.34375 c 661.99928 780.03433 662.13138 777.7163 662.5625 775.46875 c 663.21931 772.65089 665.09458 768.82277 666.65625 766.625 c 669.20204 762.82554 674.96145 757.26163 679.21875 752.75 c 680.48024 754.70163 681.99017 756.37702 683.53125 758 c 686.32155 761.1233 689.50188 762.95982 692.9375 764.3125 c 698.33668 765.34595 703.75165 760.99336 705.125 753.90625 c 705.07907 749.0904 703.10202 746.54029 700.5 743.75 c 697.42263 741.67852 693.98575 741.28994 690.59375 741.21875 c 687.88208 741.05633 685.78146 741.65596 683.8125 742.75 c 683.7427 742.52184 683.65599 742.29759 683.59375 742.0625 c 683.15281 738.33062 683.00463 734.75992 683.875 731.0625 c 685.46098 724.86821 688.28073 719.4255 690.90625 713.9375 c 691.22142 714.03134 691.52582 714.13349 691.84375 714.21875 c 696.29445 715.15115 700.80898 715.7729 705.3125 715.59375 c 712.04827 712.56001 715.54313 710.41086 715.4375 701.96875 c 714.16292 697.58235 711.70289 695.58585 708.6875 693.71875 c 702.80375 691.93433 701.13556 695.05715 695.1875 699.625 c 693.53745 701.46038 692.0678 703.5253 690.71875 705.71875 c 688.35474 704.56503 686.06885 703.15492 683.8125 701.53125 c 680.66394 699.5034 677.577 697.39496 675.46875 693.5 c 674.16891 690.53975 673.05511 687.64651 673 684.09375 c 672.95152 683.08548 672.91042 682.07355 672.875 681.0625 c 673.39623 681.09037 673.91645 681.10166 674.4375 681.125 c 680.69099 681.79789 681.20995 680.48892 687.8125 675.3125 c 688.98833 672.67377 689.34532 669.61282 689.6875 666.625 c 690.14451 664.07813 689.48216 662.14768 688.84375 659.90625 c 687.75059 657.69008 686.23662 657.37616 684.40625 656.9375 c 679.84991 657.2682 677.68005 660.39024 673.25 663.90625 c 671.64242 665.98692 670.31033 668.38726 668.875 670.65625 c 668.22014 671.50865 667.68792 672.40889 667.28125 673.34375 c 664.57176 672.59674 661.8957 671.71207 659.25 670.625 c 657.27727 669.75461 655.34822 668.76456 653.4375 667.6875 c 651.41884 666.19934 649.42459 664.62531 647.65625 662.625 c 646.22091 660.89341 644.74907 659.20782 643.90625 656.8125 c 643.7724 656.39254 643.63115 656.00124 643.5 655.59375 c 644.57691 655.47117 645.61819 655.10606 646.6875 654.65625 c 650.86951 652.64677 654.50896 649.03691 658.25 645.96875 c 659.64171 644.67809 660.68762 642.95584 661.71875 641.1875 c 662.92903 639.79809 663.36287 638.192 663.875 636.28125 c 664.2769 634.48765 664.0693 632.80647 663.90625 631.03125 c 663.44005 629.56835 662.50829 628.61573 661.65625 627.59375 c 660.54243 626.59935 659.29433 626.68878 658.03125 626.5625 c h 651.59375 632.9375 m 652.70528 632.94669 653.82545 632.75541 654.875 633.4375 c 655.57315 634.28952 656.43586 634.96251 656.8125 636.21875 c 656.84006 637.7804 657.06596 639.3538 656.625 640.90625 c 655.99804 642.54828 655.39699 644.08803 654.375 645.40625 c 653.69487 646.41725 653.04785 647.44777 652.3125 648.375 c 651.04694 648.99271 649.80651 649.46345 648.40625 649.25 c 646.96172 649.25 645.53825 649.22245 644.09375 649.25 c 643.65774 649.25226 643.21826 649.24788 642.78125 649.25 c 642.78082 647.36247 642.78858 645.46453 642.96875 643.59375 c 643.38213 641.22601 643.91759 639.27024 645.34375 637.59375 c 646.19916 636.54731 647.61346 635.06047 648.75 633.875 c 649.65408 633.38586 650.59819 633.04515 651.59375 632.9375 c h 678.1875 663.1875 m 679.71023 663.37727 680.96176 663.5183 681.9375 665.34375 c 682.48408 667.34404 682.95384 669.10601 682.53125 671.375 c 682.38459 672.63589 682.23887 673.8787 682 675.09375 c 681.58116 675.08836 681.16759 675.06947 680.75 675 c 678.17138 674.93272 675.57044 674.82459 673 674.5 c 673.03456 674.16414 673.07882 673.83509 673.125 673.5 c 673.73358 670.81764 674.60007 668.55909 676.125 666.53125 c 676.81974 665.43557 677.47675 664.27416 678.1875 663.1875 c h 700.5 699.40625 m 701.05272 699.40103 701.6068 699.45907 702.15625 699.625 c 704.99248 701.1522 707.3549 702.74812 708.46875 706.875 c 708.43173 707.89726 708.31328 708.77868 708.1875 709.5625 c 704.78983 709.55023 701.3882 709.01624 698.03125 708.4375 c 696.80899 708.12018 695.59215 707.71996 694.40625 707.28125 c 695.91621 704.55008 697.51405 701.90285 699.3125 699.53125 c 699.69159 699.47092 700.09085 699.41011 700.5 699.40625 c h 707 713.4375 m 706.73935 713.87833 706.68419 713.86452 707 713.4375 c h 689.71875 747 m 691.4837 747.02838 692.01015 748.328 693.90625 749.4375 c 696.21719 751.77455 697.96769 753.84841 698.0625 757.84375 c 695.14109 756.75553 692.4328 755.19472 690.03125 752.5 c 688.68709 751.09314 687.36714 749.5936 686.25 747.90625 c 687.81088 747.26499 688.91885 746.98714 689.71875 747 c h 662.53125 788.625 m 663.41661 788.72096 664.30614 788.81888 665.1875 788.96875 c 666.91909 789.6669 668.06375 790.13097 668.65625 792.625 c 668.69532 793.04687 668.72432 793.44288 668.75 793.84375 c 667.9077 793.78585 667.069 793.6661 666.25 793.34375 c 664.90422 792.47336 663.70365 791.91625 662.96875 789.96875 c 662.81877 789.51249 662.66908 789.0682 662.53125 788.625 c h f Q Q Q Q endstream endobj 7 0 obj 19365 endobj 5 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> endobj 1 0 obj << /Title(dyncall_logo.svg.eps) /Author(Admin) /Creator(www.inkscape.org) /Producer(Inkscape 0.45pre1) /CreationDate(D:20071206130538Z) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [ 4 0 R ] >> endobj xref 0 8 0000000000 65535 f 0000019785 00000 n 0000019949 00000 n 0000000015 00000 n 0000000068 00000 n 0000019716 00000 n 0000000276 00000 n 0000019695 00000 n trailer << /Size 7 /Root 3 0 R /Info 1 0 R >> startxref 20020 %%EOF MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_logo.svg0000644000175000017500000005253312456307246022500 0ustar jnthnjnthn image/svg+xml generated by pstoedit version:3.45 from dyncall_logo.eps MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_watermark.eps0000644000175000017500000007364312456307246023532 0ustar jnthnjnthn%!PS-Adobe-3.0 EPSF-3.0 %%Creator: 0.46 %%Pages: 1 %%Orientation: Portrait %%BoundingBox: 0 115 298 598 %%HiResBoundingBox: 0.59680556 115.88804 297.2909 597.45151 %%EndComments %%Page: 1 1 0 842 translate 0.8 -0.8 scale 0 0 0 setrgbcolor [] 0 setdash 1 setlinewidth 0 setlinejoin 0 setlinecap gsave [1 0 0 1 0 0] concat gsave [2.2965446 0 0 2.2965446 -189.23706 135.3048] concat gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave 0.90196079 0.90196079 0.90196079 setrgbcolor newpath 354.973 349.148 moveto 345.719 361.668 345.527 339.457 333.348 349.156 curveto 321.172 358.855 342.773 364.012 328.5 370.227 curveto 314.227 376.441 325.164 357.113 309.77 359.422 curveto 294.375 361.734 310.504 377 295.035 375.246 curveto 279.566 373.492 298.703 362.223 284.215 356.527 curveto 269.727 350.828 276.063 372.113 263.543 362.859 curveto 251.023 353.609 273.23 353.418 263.535 341.238 curveto 253.836 329.062 248.68 350.664 242.465 336.391 curveto 236.246 322.117 255.574 333.055 253.266 317.66 curveto 250.957 302.266 235.688 318.395 237.441 302.926 curveto 239.195 287.457 250.465 306.594 256.164 292.105 curveto 261.863 277.617 240.574 283.953 249.828 271.434 curveto 259.082 258.914 259.273 281.121 271.449 271.422 curveto 283.629 261.727 262.027 256.566 276.301 250.352 curveto 290.574 244.137 279.633 263.465 295.031 261.156 curveto 310.426 258.848 294.297 243.578 309.766 245.332 curveto 325.234 247.086 306.098 258.355 320.586 264.055 curveto 335.07 269.75 328.738 248.465 341.258 257.719 curveto 353.777 266.973 331.57 267.16 341.266 279.34 curveto 350.965 291.52 356.121 269.918 362.336 284.191 curveto 368.551 298.465 349.223 287.523 351.535 302.918 curveto 353.844 318.316 369.109 302.187 367.355 317.656 curveto 365.602 333.125 354.336 313.988 348.637 328.473 curveto 342.938 342.961 364.227 336.629 354.973 349.148 curveto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 0.80000001 setlinewidth 0 setlinejoin 0 setlinecap newpath 354.973 349.148 moveto 345.719 361.668 345.527 339.457 333.348 349.156 curveto 321.172 358.855 342.773 364.012 328.5 370.227 curveto 314.227 376.441 325.164 357.113 309.77 359.422 curveto 294.375 361.734 310.504 377 295.035 375.246 curveto 279.566 373.492 298.703 362.223 284.215 356.527 curveto 269.727 350.828 276.063 372.113 263.543 362.859 curveto 251.023 353.609 273.23 353.418 263.535 341.238 curveto 253.836 329.062 248.68 350.664 242.465 336.391 curveto 236.246 322.117 255.574 333.055 253.266 317.66 curveto 250.957 302.266 235.688 318.395 237.441 302.926 curveto 239.195 287.457 250.465 306.594 256.164 292.105 curveto 261.863 277.617 240.574 283.953 249.828 271.434 curveto 259.082 258.914 259.273 281.121 271.449 271.422 curveto 283.629 261.727 262.027 256.566 276.301 250.352 curveto 290.574 244.137 279.633 263.465 295.031 261.156 curveto 310.426 258.848 294.297 243.578 309.766 245.332 curveto 325.234 247.086 306.098 258.355 320.586 264.055 curveto 335.07 269.75 328.738 248.465 341.258 257.719 curveto 353.777 266.973 331.57 267.16 341.266 279.34 curveto 350.965 291.52 356.121 269.918 362.336 284.191 curveto 368.551 298.465 349.223 287.523 351.535 302.918 curveto 353.844 318.316 369.109 302.187 367.355 317.656 curveto 365.602 333.125 354.336 313.988 348.637 328.473 curveto 342.938 342.961 364.227 336.629 354.973 349.148 curveto closepath stroke grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave 1 1 1 setrgbcolor newpath 307.188 310.25 moveto 307.188 312.992 304.969 315.223 302.238 315.223 curveto 299.504 315.223 297.289 312.992 297.289 310.25 curveto 297.289 307.504 299.504 305.277 302.238 305.277 curveto 304.969 305.277 307.188 307.504 307.188 310.25 curveto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 0.80376798 setlinewidth 0 setlinejoin 0 setlinecap newpath 307.188 310.25 moveto 307.188 312.992 304.969 315.223 302.238 315.223 curveto 299.504 315.223 297.289 312.992 297.289 310.25 curveto 297.289 307.504 299.504 305.277 302.238 305.277 curveto 304.969 305.277 307.188 307.504 307.188 310.25 curveto closepath stroke grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave [0.4572086 0 0 0.4572086 176.55441 -80.651816] concat gsave 0.90196079 0.90196079 0.90196079 setrgbcolor newpath 78.875 389 moveto 55.84276 389.43987 79.380834 426.65068 49.3125 426.5625 curveto 21.06764 426.48738 40.280391 393.75196 23.625 389.3125 curveto 23.625 827.3125 lineto 38.095155 821.66378 20.746118 790.57562 48.25 790.65625 curveto 80.322887 790.7503 51.209558 832.88991 82.90625 827.96875 curveto 114.59419 823.03883 74.004704 791.73108 104.53125 781.90625 curveto 135.06655 772.08141 120.3785 821.16884 149 806.6875 curveto 177.61276 792.21489 129.36717 774.96666 155.375 756.1875 curveto 181.37407 737.40833 182.56796 788.65547 205.3125 766.03125 curveto 228.05485 743.41575 176.82429 741.91877 195.75 716.03125 curveto 214.67353 690.13497 231.67805 738.47369 246.3125 709.9375 curveto 260.95571 681.40348 211.75457 695.81779 221.75 665.34375 curveto 231.74762 634.86751 262.83479 675.59921 267.9375 643.9375 curveto 273.04458 612.27362 230.71846 641.19791 230.8125 609.125 curveto 230.8978 577.05211 273.08615 606.1967 268.15625 574.5 curveto 263.23508 542.81206 231.88733 583.3703 222.0625 552.84375 curveto 212.24641 522.30845 261.35636 536.98777 246.875 508.375 curveto 232.39365 479.75349 215.15418 528.00781 196.375 502 curveto 177.59583 476.00093 228.80299 474.80703 206.1875 452.0625 curveto 183.572 429.32015 182.08378 480.55071 156.1875 461.625 curveto 130.29122 442.70147 178.66121 425.73695 150.125 411.09375 curveto 121.58879 396.45054 136.0053 445.62043 105.53125 435.625 curveto 75.055008 425.62738 115.7867 394.538 84.125 389.4375 curveto 82.146007 389.11817 80.410483 388.97068 78.875 389 curveto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 1.7497483 setlinewidth 0 setlinejoin 0 setlinecap newpath 78.875 389 moveto 55.84276 389.43987 79.380834 426.65068 49.3125 426.5625 curveto 21.06764 426.48738 40.280391 393.75196 23.625 389.3125 curveto 23.625 827.3125 lineto 38.095155 821.66378 20.746118 790.57562 48.25 790.65625 curveto 80.322887 790.7503 51.209558 832.88991 82.90625 827.96875 curveto 114.59419 823.03883 74.004704 791.73108 104.53125 781.90625 curveto 135.06655 772.08141 120.3785 821.16884 149 806.6875 curveto 177.61276 792.21489 129.36717 774.96666 155.375 756.1875 curveto 181.37407 737.40833 182.56796 788.65547 205.3125 766.03125 curveto 228.05485 743.41575 176.82429 741.91877 195.75 716.03125 curveto 214.67353 690.13497 231.67805 738.47369 246.3125 709.9375 curveto 260.95571 681.40348 211.75457 695.81779 221.75 665.34375 curveto 231.74762 634.86751 262.83479 675.59921 267.9375 643.9375 curveto 273.04458 612.27362 230.71846 641.19791 230.8125 609.125 curveto 230.8978 577.05211 273.08615 606.1967 268.15625 574.5 curveto 263.23508 542.81206 231.88733 583.3703 222.0625 552.84375 curveto 212.24641 522.30845 261.35636 536.98777 246.875 508.375 curveto 232.39365 479.75349 215.15418 528.00781 196.375 502 curveto 177.59583 476.00093 228.80299 474.80703 206.1875 452.0625 curveto 183.572 429.32015 182.08378 480.55071 156.1875 461.625 curveto 130.29122 442.70147 178.66121 425.73695 150.125 411.09375 curveto 121.58879 396.45054 136.0053 445.62043 105.53125 435.625 curveto 75.055008 425.62738 115.7867 394.538 84.125 389.4375 curveto 82.146007 389.11817 80.410483 388.97068 78.875 389 curveto closepath stroke grestore grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave [0.4572086 0 0 0.4572086 176.55441 -80.651816] concat gsave 1 1 1 setrgbcolor newpath 48.78125 444.90625 moveto 40.23156 444.90625 31.823476 445.54431 23.625 446.8125 curveto 23.625 772.875 lineto 31.823476 774.14305 40.23156 774.78125 48.78125 774.78125 curveto 139.40509 774.78125 212.9375 700.89409 212.9375 609.84375 curveto 212.9375 518.79341 139.40509 444.90625 48.78125 444.90625 curveto closepath fill grestore 1 1 1 setrgbcolor [] 0 setdash 1.7579896 setlinewidth 0 setlinejoin 0 setlinecap newpath 48.78125 444.90625 moveto 40.23156 444.90625 31.823476 445.54431 23.625 446.8125 curveto 23.625 772.875 lineto 31.823476 774.14305 40.23156 774.78125 48.78125 774.78125 curveto 139.40509 774.78125 212.9375 700.89409 212.9375 609.84375 curveto 212.9375 518.79341 139.40509 444.90625 48.78125 444.90625 curveto closepath stroke grestore grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave 0.90196079 0.90196079 0.90196079 setrgbcolor newpath 203.785 198.195 moveto 203.785 200.941 201.566 203.168 198.836 203.168 curveto 196.105 203.168 193.887 200.941 193.887 198.195 curveto 193.887 195.449 196.105 193.223 198.836 193.223 curveto 201.566 193.223 203.785 195.449 203.785 198.195 curveto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 0.80376798 setlinewidth 0 setlinejoin 0 setlinecap newpath 203.785 198.195 moveto 203.785 200.941 201.566 203.168 198.836 203.168 curveto 196.105 203.168 193.887 200.941 193.887 198.195 curveto 193.887 195.449 196.105 193.223 198.836 193.223 curveto 201.566 193.223 203.785 195.449 203.785 198.195 curveto closepath stroke grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave [0.4354368 0 0 0.4354368 82.400777 -58.916687] concat gsave 0.90196079 0.90196079 0.90196079 setrgbcolor newpath 372.4375 226.8125 moveto 350.03614 226.99774 326.37254 235.86686 301.53125 253.375 curveto 368.53125 345.625 lineto 371.39273 344.04727 374.33807 342.1941 377.40625 339.96875 curveto 419.75 309.1875 lineto 431.09721 316.83039 443.82523 328.92944 457.9375 345.375 curveto 557.875 482.9375 lineto 569.15331 501.44535 576.62605 517.13205 580.25 530.09375 curveto 537.90625 560.875 lineto 534.83804 563.09806 532.16736 565.31878 529.78125 567.5625 curveto 596.78125 659.75 lineto 626.75298 637.33253 643.69738 612.67138 647.59375 585.75 curveto 651.58512 558.10191 635.79682 513.598 600.21875 452.15625 curveto 582.8125 425.21875 lineto 552.28125 381.71875 lineto 520.53125 339.46875 lineto 500.28125 314.625 lineto 452.84383 261.79529 415.32322 232.90591 387.71875 228.0625 curveto 382.68286 227.17934 377.60704 226.76975 372.4375 226.8125 curveto closepath 298.59375 255.53125 moveto 292.22542 260.26672 288.42952 265.62733 287.28125 271.59375 curveto 286.09854 277.70256 287.25876 283.07104 290.6875 287.78125 curveto 328.125 339.34375 lineto 337.38467 352.07348 349.72995 354.71426 365.25 347.3125 curveto 298.59375 255.53125 lineto closepath 527.15625 570.15625 moveto 515.3428 582.66092 514.16594 595.3595 523.53125 608.25 curveto 560.71875 659.46875 lineto 564.28758 664.37648 569.05433 667.18005 575.15625 667.84375 curveto 581.11347 668.50094 587.37058 666.49603 593.84375 661.90625 curveto 527.15625 570.15625 lineto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 0 setlinewidth 0 setlinejoin 0 setlinecap newpath 372.4375 226.8125 moveto 350.03614 226.99774 326.37254 235.86686 301.53125 253.375 curveto 368.53125 345.625 lineto 371.39273 344.04727 374.33807 342.1941 377.40625 339.96875 curveto 419.75 309.1875 lineto 431.09721 316.83039 443.82523 328.92944 457.9375 345.375 curveto 557.875 482.9375 lineto 569.15331 501.44535 576.62605 517.13205 580.25 530.09375 curveto 537.90625 560.875 lineto 534.83804 563.09806 532.16736 565.31878 529.78125 567.5625 curveto 596.78125 659.75 lineto 626.75298 637.33253 643.69738 612.67138 647.59375 585.75 curveto 651.58512 558.10191 635.79682 513.598 600.21875 452.15625 curveto 582.8125 425.21875 lineto 552.28125 381.71875 lineto 520.53125 339.46875 lineto 500.28125 314.625 lineto 452.84383 261.79529 415.32322 232.90591 387.71875 228.0625 curveto 382.68286 227.17934 377.60704 226.76975 372.4375 226.8125 curveto closepath 298.59375 255.53125 moveto 292.22542 260.26672 288.42952 265.62733 287.28125 271.59375 curveto 286.09854 277.70256 287.25876 283.07104 290.6875 287.78125 curveto 328.125 339.34375 lineto 337.38467 352.07348 349.72995 354.71426 365.25 347.3125 curveto 298.59375 255.53125 lineto closepath 527.15625 570.15625 moveto 515.3428 582.66092 514.16594 595.3595 523.53125 608.25 curveto 560.71875 659.46875 lineto 564.28758 664.37648 569.05433 667.18005 575.15625 667.84375 curveto 581.11347 668.50094 587.37058 666.49603 593.84375 661.90625 curveto 527.15625 570.15625 lineto closepath stroke grestore grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat gsave [0.4354368 0 0 0.4354368 82.400777 -58.916687] concat gsave 0.90196079 0.90196079 0.90196079 setrgbcolor newpath 658.03125 626.5625 moveto 655.25013 626.68881 652.89528 628.64662 650.5 630.34375 curveto 645.86328 633.50839 641.64235 636.86247 638 641.6875 curveto 636.50265 643.53622 636.13403 645.73808 635.8125 648.3125 curveto 635.79309 648.61363 635.79586 648.91743 635.78125 649.21875 curveto 635.23223 649.19257 634.70569 649.15791 634.15625 649.09375 curveto 632.90004 648.82505 631.6188 648.56494 630.40625 648 curveto 629.26716 647.40749 628.11703 646.83331 626.96875 646.25 curveto 626.10755 645.68505 625.17836 645.1645 624.46875 644.3125 curveto 623.94054 642.88405 623.48803 641.40243 622.5625 640.34375 curveto 621.71048 638.89922 620.89835 637.66941 620.78125 635.6875 curveto 620.55619 633.53334 620.32635 631.3761 620.46875 629.1875 curveto 613.25 634.125 lineto 613.24081 636.35035 613.4845 638.53016 613.71875 640.71875 curveto 613.85195 642.89817 614.81159 644.35797 615.71875 646 curveto 616.57995 646.98751 616.99334 648.35779 617.46875 649.6875 curveto 618.15771 650.96897 619.23721 651.5114 620.25 652.21875 curveto 621.40746 652.85489 622.58337 653.44241 623.75 654.0625 curveto 624.99702 654.6619 626.29163 654.97031 627.59375 655.3125 curveto 629.14392 655.59038 630.71963 655.55329 632.28125 655.5625 curveto 633.40247 655.5625 634.53435 655.59144 635.65625 655.59375 curveto 635.65602 655.66675 635.65652 655.73949 635.65625 655.8125 curveto 635.50468 658.17335 636.22468 660.11922 636.96875 662.15625 curveto 637.87359 664.67786 639.42176 666.43805 640.9375 668.25 curveto 642.75866 670.26866 644.74418 671.94434 646.78125 673.53125 curveto 648.69198 674.7622 650.70926 675.69811 652.71875 676.59375 curveto 656.14519 677.86833 659.603 678.9573 663.09375 679.84375 curveto 664.02122 680.06128 664.94201 680.22593 665.875 680.375 curveto 665.76219 683.23707 665.89639 686.10725 666.03125 688.96875 curveto 666.10244 692.71901 667.28887 695.7388 668.6875 698.84375 curveto 670.90367 702.89715 674.1061 705.11973 677.40625 707.21875 curveto 680.51905 709.33564 683.68848 711.12476 686.96875 712.5 curveto 686.27445 713.84958 685.59527 715.21275 684.90625 716.5625 curveto 682.09758 722.75398 678.51334 728.5208 676.84375 735.5 curveto 675.95499 739.41102 676.12805 743.17354 676.65625 747.09375 curveto 676.74319 747.40856 676.86916 747.69777 676.96875 748 curveto 676.52343 748.36731 676.07405 748.71255 675.59375 749.09375 curveto 670.58669 754.22361 665.07597 758.95221 661.40625 765.0625 curveto 657.98224 768.95528 656.79145 775.20535 655.40625 780.0625 curveto 655.2626 780.90806 655.17126 781.73797 655.09375 782.59375 curveto 649.8835 782.96621 644.62777 782.87146 639.46875 783.84375 curveto 635.56462 784.53271 632.0128 786.6759 628.53125 789 curveto 622.53125 795.4375 lineto 625.97607 793.00776 629.52281 790.76565 633.40625 789.96875 curveto 639.26474 788.76536 645.21139 788.7314 651.125 788.28125 curveto 652.35836 788.26976 653.60825 788.24556 654.84375 788.25 curveto 654.84003 788.40659 654.81634 788.56232 654.8125 788.71875 curveto 654.55299 791.19672 655.30873 793.18268 656 795.34375 curveto 656.83365 797.38997 658.11847 798.37459 659.625 799.34375 curveto 661.09709 800.08094 662.63732 800.14753 664.1875 800.21875 curveto 669.26516 800.59538 669.3314 799.11144 675.34375 794.5 curveto 676.12458 792.20346 675.99662 789.97387 675.71875 787.5625 curveto 675.05505 784.64589 673.67862 783.925 671.6875 782.9375 curveto 668.45971 782.35662 665.19867 782.29356 661.9375 782.34375 curveto 661.99928 780.03433 662.13138 777.7163 662.5625 775.46875 curveto 663.21931 772.65089 665.09458 768.82277 666.65625 766.625 curveto 669.20204 762.82554 674.96145 757.26163 679.21875 752.75 curveto 680.48024 754.70163 681.99017 756.37702 683.53125 758 curveto 686.32155 761.1233 689.50188 762.95982 692.9375 764.3125 curveto 698.33668 765.34595 703.75165 760.99336 705.125 753.90625 curveto 705.07907 749.0904 703.10202 746.54029 700.5 743.75 curveto 697.42263 741.67852 693.98575 741.28994 690.59375 741.21875 curveto 687.88208 741.05633 685.78146 741.65596 683.8125 742.75 curveto 683.7427 742.52184 683.65599 742.29759 683.59375 742.0625 curveto 683.15281 738.33062 683.00463 734.75992 683.875 731.0625 curveto 685.46098 724.86821 688.28073 719.4255 690.90625 713.9375 curveto 691.22142 714.03134 691.52582 714.13349 691.84375 714.21875 curveto 696.29445 715.15115 700.80898 715.7729 705.3125 715.59375 curveto 712.04827 712.56001 715.54313 710.41086 715.4375 701.96875 curveto 714.16292 697.58235 711.70289 695.58585 708.6875 693.71875 curveto 702.80375 691.93433 701.13556 695.05715 695.1875 699.625 curveto 693.53745 701.46038 692.0678 703.5253 690.71875 705.71875 curveto 688.35474 704.56503 686.06885 703.15492 683.8125 701.53125 curveto 680.66394 699.5034 677.577 697.39496 675.46875 693.5 curveto 674.16891 690.53975 673.05511 687.64651 673 684.09375 curveto 672.95152 683.08548 672.91042 682.07355 672.875 681.0625 curveto 673.39623 681.09037 673.91645 681.10166 674.4375 681.125 curveto 680.69099 681.79789 681.20995 680.48892 687.8125 675.3125 curveto 688.98833 672.67377 689.34532 669.61282 689.6875 666.625 curveto 690.14451 664.07813 689.48216 662.14768 688.84375 659.90625 curveto 687.75059 657.69008 686.23662 657.37616 684.40625 656.9375 curveto 679.84991 657.2682 677.68005 660.39024 673.25 663.90625 curveto 671.64242 665.98692 670.31033 668.38726 668.875 670.65625 curveto 668.22014 671.50865 667.68792 672.40889 667.28125 673.34375 curveto 664.57176 672.59674 661.8957 671.71207 659.25 670.625 curveto 657.27727 669.75461 655.34822 668.76456 653.4375 667.6875 curveto 651.41884 666.19934 649.42459 664.62531 647.65625 662.625 curveto 646.22091 660.89341 644.74907 659.20782 643.90625 656.8125 curveto 643.7724 656.39254 643.63115 656.00124 643.5 655.59375 curveto 644.57691 655.47117 645.61819 655.10606 646.6875 654.65625 curveto 650.86951 652.64677 654.50896 649.03691 658.25 645.96875 curveto 659.64171 644.67809 660.68762 642.95584 661.71875 641.1875 curveto 662.92903 639.79809 663.36287 638.192 663.875 636.28125 curveto 664.2769 634.48765 664.0693 632.80647 663.90625 631.03125 curveto 663.44005 629.56835 662.50829 628.61573 661.65625 627.59375 curveto 660.54243 626.59935 659.29433 626.68878 658.03125 626.5625 curveto closepath 651.59375 632.9375 moveto 652.70528 632.94669 653.82545 632.75541 654.875 633.4375 curveto 655.57315 634.28952 656.43586 634.96251 656.8125 636.21875 curveto 656.84006 637.7804 657.06596 639.3538 656.625 640.90625 curveto 655.99804 642.54828 655.39699 644.08803 654.375 645.40625 curveto 653.69487 646.41725 653.04785 647.44777 652.3125 648.375 curveto 651.04694 648.99271 649.80651 649.46345 648.40625 649.25 curveto 646.96172 649.25 645.53825 649.22245 644.09375 649.25 curveto 643.65774 649.25226 643.21826 649.24788 642.78125 649.25 curveto 642.78082 647.36247 642.78858 645.46453 642.96875 643.59375 curveto 643.38213 641.22601 643.91759 639.27024 645.34375 637.59375 curveto 646.19916 636.54731 647.61346 635.06047 648.75 633.875 curveto 649.65408 633.38586 650.59819 633.04515 651.59375 632.9375 curveto closepath 678.1875 663.1875 moveto 679.71023 663.37727 680.96176 663.5183 681.9375 665.34375 curveto 682.48408 667.34404 682.95384 669.10601 682.53125 671.375 curveto 682.38459 672.63589 682.23887 673.8787 682 675.09375 curveto 681.58116 675.08836 681.16759 675.06947 680.75 675 curveto 678.17138 674.93272 675.57044 674.82459 673 674.5 curveto 673.03456 674.16414 673.07882 673.83509 673.125 673.5 curveto 673.73358 670.81764 674.60007 668.55909 676.125 666.53125 curveto 676.81974 665.43557 677.47675 664.27416 678.1875 663.1875 curveto closepath 700.5 699.40625 moveto 701.05272 699.40103 701.6068 699.45907 702.15625 699.625 curveto 704.99248 701.1522 707.3549 702.74812 708.46875 706.875 curveto 708.43173 707.89726 708.31328 708.77868 708.1875 709.5625 curveto 704.78983 709.55023 701.3882 709.01624 698.03125 708.4375 curveto 696.80899 708.12018 695.59215 707.71996 694.40625 707.28125 curveto 695.91621 704.55008 697.51405 701.90285 699.3125 699.53125 curveto 699.69159 699.47092 700.09085 699.41011 700.5 699.40625 curveto closepath 707 713.4375 moveto 706.73935 713.87833 706.68419 713.86452 707 713.4375 curveto closepath 689.71875 747 moveto 691.4837 747.02838 692.01015 748.328 693.90625 749.4375 curveto 696.21719 751.77455 697.96769 753.84841 698.0625 757.84375 curveto 695.14109 756.75553 692.4328 755.19472 690.03125 752.5 curveto 688.68709 751.09314 687.36714 749.5936 686.25 747.90625 curveto 687.81088 747.26499 688.91885 746.98714 689.71875 747 curveto closepath 662.53125 788.625 moveto 663.41661 788.72096 664.30614 788.81888 665.1875 788.96875 curveto 666.91909 789.6669 668.06375 790.13097 668.65625 792.625 curveto 668.69532 793.04687 668.72432 793.44288 668.75 793.84375 curveto 667.9077 793.78585 667.069 793.6661 666.25 793.34375 curveto 664.90422 792.47336 663.70365 791.91625 662.96875 789.96875 curveto 662.81877 789.51249 662.66908 789.0682 662.53125 788.625 curveto closepath fill grestore 0.90196079 0.90196079 0.90196079 setrgbcolor [] 0 setdash 0 setlinewidth 0 setlinejoin 0 setlinecap newpath 658.03125 626.5625 moveto 655.25013 626.68881 652.89528 628.64662 650.5 630.34375 curveto 645.86328 633.50839 641.64235 636.86247 638 641.6875 curveto 636.50265 643.53622 636.13403 645.73808 635.8125 648.3125 curveto 635.79309 648.61363 635.79586 648.91743 635.78125 649.21875 curveto 635.23223 649.19257 634.70569 649.15791 634.15625 649.09375 curveto 632.90004 648.82505 631.6188 648.56494 630.40625 648 curveto 629.26716 647.40749 628.11703 646.83331 626.96875 646.25 curveto 626.10755 645.68505 625.17836 645.1645 624.46875 644.3125 curveto 623.94054 642.88405 623.48803 641.40243 622.5625 640.34375 curveto 621.71048 638.89922 620.89835 637.66941 620.78125 635.6875 curveto 620.55619 633.53334 620.32635 631.3761 620.46875 629.1875 curveto 613.25 634.125 lineto 613.24081 636.35035 613.4845 638.53016 613.71875 640.71875 curveto 613.85195 642.89817 614.81159 644.35797 615.71875 646 curveto 616.57995 646.98751 616.99334 648.35779 617.46875 649.6875 curveto 618.15771 650.96897 619.23721 651.5114 620.25 652.21875 curveto 621.40746 652.85489 622.58337 653.44241 623.75 654.0625 curveto 624.99702 654.6619 626.29163 654.97031 627.59375 655.3125 curveto 629.14392 655.59038 630.71963 655.55329 632.28125 655.5625 curveto 633.40247 655.5625 634.53435 655.59144 635.65625 655.59375 curveto 635.65602 655.66675 635.65652 655.73949 635.65625 655.8125 curveto 635.50468 658.17335 636.22468 660.11922 636.96875 662.15625 curveto 637.87359 664.67786 639.42176 666.43805 640.9375 668.25 curveto 642.75866 670.26866 644.74418 671.94434 646.78125 673.53125 curveto 648.69198 674.7622 650.70926 675.69811 652.71875 676.59375 curveto 656.14519 677.86833 659.603 678.9573 663.09375 679.84375 curveto 664.02122 680.06128 664.94201 680.22593 665.875 680.375 curveto 665.76219 683.23707 665.89639 686.10725 666.03125 688.96875 curveto 666.10244 692.71901 667.28887 695.7388 668.6875 698.84375 curveto 670.90367 702.89715 674.1061 705.11973 677.40625 707.21875 curveto 680.51905 709.33564 683.68848 711.12476 686.96875 712.5 curveto 686.27445 713.84958 685.59527 715.21275 684.90625 716.5625 curveto 682.09758 722.75398 678.51334 728.5208 676.84375 735.5 curveto 675.95499 739.41102 676.12805 743.17354 676.65625 747.09375 curveto 676.74319 747.40856 676.86916 747.69777 676.96875 748 curveto 676.52343 748.36731 676.07405 748.71255 675.59375 749.09375 curveto 670.58669 754.22361 665.07597 758.95221 661.40625 765.0625 curveto 657.98224 768.95528 656.79145 775.20535 655.40625 780.0625 curveto 655.2626 780.90806 655.17126 781.73797 655.09375 782.59375 curveto 649.8835 782.96621 644.62777 782.87146 639.46875 783.84375 curveto 635.56462 784.53271 632.0128 786.6759 628.53125 789 curveto 622.53125 795.4375 lineto 625.97607 793.00776 629.52281 790.76565 633.40625 789.96875 curveto 639.26474 788.76536 645.21139 788.7314 651.125 788.28125 curveto 652.35836 788.26976 653.60825 788.24556 654.84375 788.25 curveto 654.84003 788.40659 654.81634 788.56232 654.8125 788.71875 curveto 654.55299 791.19672 655.30873 793.18268 656 795.34375 curveto 656.83365 797.38997 658.11847 798.37459 659.625 799.34375 curveto 661.09709 800.08094 662.63732 800.14753 664.1875 800.21875 curveto 669.26516 800.59538 669.3314 799.11144 675.34375 794.5 curveto 676.12458 792.20346 675.99662 789.97387 675.71875 787.5625 curveto 675.05505 784.64589 673.67862 783.925 671.6875 782.9375 curveto 668.45971 782.35662 665.19867 782.29356 661.9375 782.34375 curveto 661.99928 780.03433 662.13138 777.7163 662.5625 775.46875 curveto 663.21931 772.65089 665.09458 768.82277 666.65625 766.625 curveto 669.20204 762.82554 674.96145 757.26163 679.21875 752.75 curveto 680.48024 754.70163 681.99017 756.37702 683.53125 758 curveto 686.32155 761.1233 689.50188 762.95982 692.9375 764.3125 curveto 698.33668 765.34595 703.75165 760.99336 705.125 753.90625 curveto 705.07907 749.0904 703.10202 746.54029 700.5 743.75 curveto 697.42263 741.67852 693.98575 741.28994 690.59375 741.21875 curveto 687.88208 741.05633 685.78146 741.65596 683.8125 742.75 curveto 683.7427 742.52184 683.65599 742.29759 683.59375 742.0625 curveto 683.15281 738.33062 683.00463 734.75992 683.875 731.0625 curveto 685.46098 724.86821 688.28073 719.4255 690.90625 713.9375 curveto 691.22142 714.03134 691.52582 714.13349 691.84375 714.21875 curveto 696.29445 715.15115 700.80898 715.7729 705.3125 715.59375 curveto 712.04827 712.56001 715.54313 710.41086 715.4375 701.96875 curveto 714.16292 697.58235 711.70289 695.58585 708.6875 693.71875 curveto 702.80375 691.93433 701.13556 695.05715 695.1875 699.625 curveto 693.53745 701.46038 692.0678 703.5253 690.71875 705.71875 curveto 688.35474 704.56503 686.06885 703.15492 683.8125 701.53125 curveto 680.66394 699.5034 677.577 697.39496 675.46875 693.5 curveto 674.16891 690.53975 673.05511 687.64651 673 684.09375 curveto 672.95152 683.08548 672.91042 682.07355 672.875 681.0625 curveto 673.39623 681.09037 673.91645 681.10166 674.4375 681.125 curveto 680.69099 681.79789 681.20995 680.48892 687.8125 675.3125 curveto 688.98833 672.67377 689.34532 669.61282 689.6875 666.625 curveto 690.14451 664.07813 689.48216 662.14768 688.84375 659.90625 curveto 687.75059 657.69008 686.23662 657.37616 684.40625 656.9375 curveto 679.84991 657.2682 677.68005 660.39024 673.25 663.90625 curveto 671.64242 665.98692 670.31033 668.38726 668.875 670.65625 curveto 668.22014 671.50865 667.68792 672.40889 667.28125 673.34375 curveto 664.57176 672.59674 661.8957 671.71207 659.25 670.625 curveto 657.27727 669.75461 655.34822 668.76456 653.4375 667.6875 curveto 651.41884 666.19934 649.42459 664.62531 647.65625 662.625 curveto 646.22091 660.89341 644.74907 659.20782 643.90625 656.8125 curveto 643.7724 656.39254 643.63115 656.00124 643.5 655.59375 curveto 644.57691 655.47117 645.61819 655.10606 646.6875 654.65625 curveto 650.86951 652.64677 654.50896 649.03691 658.25 645.96875 curveto 659.64171 644.67809 660.68762 642.95584 661.71875 641.1875 curveto 662.92903 639.79809 663.36287 638.192 663.875 636.28125 curveto 664.2769 634.48765 664.0693 632.80647 663.90625 631.03125 curveto 663.44005 629.56835 662.50829 628.61573 661.65625 627.59375 curveto 660.54243 626.59935 659.29433 626.68878 658.03125 626.5625 curveto closepath 651.59375 632.9375 moveto 652.70528 632.94669 653.82545 632.75541 654.875 633.4375 curveto 655.57315 634.28952 656.43586 634.96251 656.8125 636.21875 curveto 656.84006 637.7804 657.06596 639.3538 656.625 640.90625 curveto 655.99804 642.54828 655.39699 644.08803 654.375 645.40625 curveto 653.69487 646.41725 653.04785 647.44777 652.3125 648.375 curveto 651.04694 648.99271 649.80651 649.46345 648.40625 649.25 curveto 646.96172 649.25 645.53825 649.22245 644.09375 649.25 curveto 643.65774 649.25226 643.21826 649.24788 642.78125 649.25 curveto 642.78082 647.36247 642.78858 645.46453 642.96875 643.59375 curveto 643.38213 641.22601 643.91759 639.27024 645.34375 637.59375 curveto 646.19916 636.54731 647.61346 635.06047 648.75 633.875 curveto 649.65408 633.38586 650.59819 633.04515 651.59375 632.9375 curveto closepath 678.1875 663.1875 moveto 679.71023 663.37727 680.96176 663.5183 681.9375 665.34375 curveto 682.48408 667.34404 682.95384 669.10601 682.53125 671.375 curveto 682.38459 672.63589 682.23887 673.8787 682 675.09375 curveto 681.58116 675.08836 681.16759 675.06947 680.75 675 curveto 678.17138 674.93272 675.57044 674.82459 673 674.5 curveto 673.03456 674.16414 673.07882 673.83509 673.125 673.5 curveto 673.73358 670.81764 674.60007 668.55909 676.125 666.53125 curveto 676.81974 665.43557 677.47675 664.27416 678.1875 663.1875 curveto closepath 700.5 699.40625 moveto 701.05272 699.40103 701.6068 699.45907 702.15625 699.625 curveto 704.99248 701.1522 707.3549 702.74812 708.46875 706.875 curveto 708.43173 707.89726 708.31328 708.77868 708.1875 709.5625 curveto 704.78983 709.55023 701.3882 709.01624 698.03125 708.4375 curveto 696.80899 708.12018 695.59215 707.71996 694.40625 707.28125 curveto 695.91621 704.55008 697.51405 701.90285 699.3125 699.53125 curveto 699.69159 699.47092 700.09085 699.41011 700.5 699.40625 curveto closepath 707 713.4375 moveto 706.73935 713.87833 706.68419 713.86452 707 713.4375 curveto closepath 689.71875 747 moveto 691.4837 747.02838 692.01015 748.328 693.90625 749.4375 curveto 696.21719 751.77455 697.96769 753.84841 698.0625 757.84375 curveto 695.14109 756.75553 692.4328 755.19472 690.03125 752.5 curveto 688.68709 751.09314 687.36714 749.5936 686.25 747.90625 curveto 687.81088 747.26499 688.91885 746.98714 689.71875 747 curveto closepath 662.53125 788.625 moveto 663.41661 788.72096 664.30614 788.81888 665.1875 788.96875 curveto 666.91909 789.6669 668.06375 790.13097 668.65625 792.625 curveto 668.69532 793.04687 668.72432 793.44288 668.75 793.84375 curveto 667.9077 793.78585 667.069 793.6661 666.25 793.34375 curveto 664.90422 792.47336 663.70365 791.91625 662.96875 789.96875 curveto 662.81877 789.51249 662.66908 789.0682 662.53125 788.625 curveto closepath stroke grestore grestore gsave [0.7802343 0 0 0.7802343 -63.142369 43.042016] concat grestore grestore grestore showpage %%EOF MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_watermark.pdf0000644000175000017500000001343112456307246023501 0ustar jnthnjnthn%PDF-1.4 %µí®û 3 0 obj << /Length 4 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 595.275574 841.889771 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> stream xœÍš¹®&Ëq„ý~Š~¶j_\:È \A†p’f J†^_ñEVŸY8ˆ ÂÅÅ™¬¿kË%22»ÿr¥g§¼G¾ÿúÿõ§ûþ=Ýúïÿë¡ùÇ÷¡üä6æÜ÷ÿ\éþ'ýÿŸ×¿þ›L÷\9Ýÿ|ÿåÖ<ý÷;þ¬–ŸµöœùþøzI­í{¬ù¬<î¯w)ëÉ«Ý3õgŽ!yjËqYŸ]$çômFY÷Ç}å]ž½‡¦ägVÍГ:áLûÉ¥ß%Õ§ß3¯'UmzçUõ¯}Ï2žÝò÷zfÞ÷5ö~JmwžãmiòôV™ÒÛÓWñ¡Vßzb>3U-¡¿­è÷þô2ïk–þèÄL©õ©]û–¢ÕûGzæ’œÆÓY¢ICåÚ¼î΄¬Ý;§H^"KµjÏ¢‰ué÷ôÔ5µÀ|ÚäTºvÓc·§dÝ£èëkøò„Ù¥¹¡ œiëCªë[[×{éÏÔ|ýÝkÝ+=yêDc?ÝŠšYj:QãÁ['E­c4ÝyÜ»?£ëñVž±â4µµ{è¸#K52S×iZÕéšÑlí]²¯¯ÕûÓdç.¥×UïŸQõ¼Œ‚#ht%=.m¥f}êÚòšûêK*Ö?d‚¦ãtݾÍ—–tûÎesóéa—»÷å[ç$õÈ¡ºž¬)K?: vgJÝË6“Ǭ»Ù]Ï/«µË¶Y–ÂCúém<Ù»²#;߽ΧȶØßìR[‡[è÷¡Ë-J§Öí9¦¹p,×ë°6ÂõºdT„g¢Œ®(éYëÉ"¸@ïóR:ŽŸûN†ü’õK–š¹Âlö{, 4¦pÝÅÞã™ÝëºØ¦O»âU¤âµ—å¢'™±¤©®P›ÝºÝ~( ôð]´tÚ, Õ6VèåI©Ù(<¨)rû-§ÉRâЙ¤!fbuEXѵñ!œÂV¾8aßhXó1R¶[)”å¹èÞN7ëë6¨¯\¬¨°ê•0’Mp„R‹ýctp… ¯1åÏ2–\ÜŠß/¡Ò I׋I÷ŸS¿¿ÿp)æîß—½ä• \f¢ˆcèRI~ôõþ6ÒÄY·Pp {2"€U>eœVݲúç#RÌìëÛ Ÿrìññmh.ù»%¤Ê]¿mâÇç!ÎÏïÏôW¾¾íðç_Ü ÿÿHRò$ª šF¤(‡GuþÐßiÿ©]ÁYÇMžIËb1êþN©˜¸¯BAÎ&|¨5›ôi!òRP&-±J•-‹/5-=}±žr"ÈF¯5Rg;g7D:¶D¦Õ$eä€íþĈ?ƒÎ¯òMȯÔÂ>\?ÿj”D¼à ÚÚÐýhÿ=‚Ö¥Ð#@¿œ§ tt|–Bìwìÿþ€Äa¶óä¹ÎDÕlŸ Þ.öް {gþ{Ê/qEbùñ^÷´ò›5N| :¸œüMiå•åˆCä*ü°I§®t²?E¢Í™àú| ˆÏ;ýSôꟲ¢ 6xf7™0ÈðYþÈŸÛŸ÷pgúg†ôãmþf=+ú#çheÁÊW0‘d4PubrC”GW­²Àgý…Ë^bÙŠ»%×[Q³uCªqš£ºËošî'°{»« kQÎéºA¬^è}q¶œü„ˆä ^{ôŠÊŒÅNR®ßK'ù4€_®ð&Ý*µè©Y¶–µ}ÁÒfM%FŽ5VÔhuqAÿ¥"ØUò$©Æ¸Øa±÷’¦ð)Í÷if[áµ€RÍiÁÔ€9Ø´ø9…D…5cU)—£W¥Ô–Lñ…p Pí®¦SjSÄ¥€“º-™q{Šª¬£¼hÖ ª6tÖk$Ë-GÄ™EPôЈl×áòÖ³ ¯ó(Õ´Â^$œKÕ©WUì ‚¨_ùI)Ó6*üH¥ÁOnu •BÎ`SðQm˜M(0©°.™æÂ/XP"mý"—ÇWÄØ+T[*ü®£‹à¨b®”8ŠEF¥úÃmP1Yƒ” Wú$ñN詤PO*#Ø¥SöOÇýb0ÛΦ¤L8è?Yµõµ»B4ÜMÛÓ妘TåL£¸ÀJÁ q’бJ*ÎQU£ÁÛ¾+EVDDOòv„ gSÔ«d|Ÿ)Bá^åZ«Ãb•›Suáé­G˜þtî_^å\PÒX¨òË](( FVÇ©…ª"Z%‡+DÌZ[·•9¿8l»ªÈ”ƒè‘ ?DIçü¢M[÷ª‚q0L¯Ù¢ÖÀ$GÅt¥hR€7—õµ6÷|>î7jÉ€ù§,B:Ï1qäirÈϠ‘%“)Ë™YÆ,¾QÙ¡èBÓkˆÊTf(˜g=÷²\°t%M{B oÐÀ ZqKêâŧ*4zª™˜;(DìØ×”›Q]»äVá§«m…þÅÀê¡©D¦&pA=ƒJ•EH®òöÊ_7ÊŠ~‰Sh¦Ìˆ\`jæì;dNÕÞÀ`$á:Üg±®PX‹õx˜kÀ½1ªž«kŠcÑ68y‰f{B@çž>e2ãfdÁǸÊ–Û²"–ÝݧBQ+úÝ%yÅ«…îeš(ns¶Í•K¨zq^¬0ÝTa€b yÍn‚ºó«¹n¡=´C·µXÎ2Æ…-Lâ@¶ÑuV©Ûö5ç–.S"¸ÊvÝÄEh)‡1´r±W‘1k·OEAëÏÈÅ€cås…à¯üñÃçüAÎ+Âíó 0MŸ|ºÿcƽš¶ºÌVäs“ ¤Ä›ö˜1Kj.>¥Ô› ÷B…í›Sƒƒ+ÕÉó•躳§s¥R㈋ò¡Q5sšiìYd Ép  )›ï‹ Lì4ÈìîY!Æ¢#ººÈî@m—Y¢½WWú¡u1Ôõ(3žhJ±eŒ@c*®M¸qö¤‹Êø‰täp HØU„dG_![MBÑÊ1¦£¯¦?t“D¤ô]²âDIÞäFÚ*W¤‹‰‰”W)ʆ'ù&ô€)x‹r:)±ÌèmˆL7ϹOb3»ûðÎ%ç´^ærù¥J@9% DfbÆp§‘j\:•:ŸWäL´8XÞu1¡8&|?2üÃBÖ˜BUãçvª:–)\ €¼ &‘g<ùñëg§³ŸÊ¦^Æ^Í]P-¼­ÎæŽ[ü-ä•7pE'ǘµÉÑ^•Ü&ÅA³}™6«ù`ã‘D«}¾£§¾ÝìFN´z<´ödŸ‹Î+D‘J¢0ß!òÞ¦½íÔ}èiDqÈ3 ;гˆðMÓNn5R]ìQ¹÷4.úìÄ‚C ç§QLgY‹µ:?á‹~Ä °9„@úuúå LbÐpÞŒVØ1 †y„¼§¸;€)åê â4Û8‹¤Ð`œsê}'¿€¤!^pT“lÐãJPŒF‡Ö·_ù€Ýp”€Î͆º15…'ȦÔ0SÅ€ÍxB’@fÑ r…Ç@h}ÄçKïD–¼S»ø9J–9pD`à;ÇÁyš»jŒ8„íÉiÏWñÂ;,2È?áK%lºÆHÜ“µ´KøÿÚçgqï+îMåc¯£)»©IÃh¡|J xwÒzY¨õÐÌ:v!lÁDbh@z櫨j¥¯§œ 6ÝÅu0ðAhÞŽv•‡_¢²2Ò,Cùš¡«5"Tuþ²­z0þÕÝn³ì£¨TOÆF^B6õ4&¯ÛWwv@C‘]¼,ôƒÇ'¡>Ü¡,¿á‘¼ê;#€xE@Ñ" ¯ä’¬ÄÛ·«¨”>Ù—æ ¦[QúÉ£³±| ^:’n¢¦cjžh“!Њ÷KÈÅ+”€bäxá´º×T†r&]Îb±—Ñgâ.§)ïì'íÌtBЀÆûÙ/ ”hשêxµëÜ[£°×Ô ‘£9Ûâ¼ë%`¾b£¤Iô»É6:©‰Ý·S$e7 þ0õïä„ç‰â–yáe­Õšývœ„ß#lQçŠ' ÞË;7KÈVڧѽb¾ Ö†>jÛæ¨~ÂÍà‚ΩÍÉáïóÔ(¼ ÞöÒÃqÓŽJ 9ûI9ü$a*AìC*Î FDÐyçzö0½Ï¸y  rdî½CœíÄùà*C) ˜LævÜ$§KÎЕ;Ôb—æ>Òfò{#1ÒÔcÀõœ qªœŸí° &¼Œwy½á"|:Ç_'y7%Òì:6…ÉyµíèB yÏrîA'–‘P£Ø>ïéQ–-ªCDœÝÔÎâÕÕ`¸ý>…[,c<Æý„ôúˆ—ªÜõ!ó2™Z1¸§iv¼byCnUqnà†ê&9Và±ðeŸÄÉKF¸™s¯µ]^³\ÁÓ}ùP€Ê €$²B”5ªæiQùº³3Úyb„v]/,À¬»7û)bN¯­¸s{1RsÐ1²ò;ƒ—UßUJ¬~j©Ù Bp¹‚óÍ$ ¼vxš¯^³ãÙ¬£ŸVDŠ7ì¼]s š¢f#»º ÎP…(~ÇÑ·[**@‰°È'£b¦;ÇU=uÈÝtÁw´/à44Än\±øtÆU¼ûLq#â}6Y5ÊúԃʼžvN…Õé¤è‡¤Ó2)Ã1ˆô·UôS3Élw@—[[‘û5ª¶í¢M 9ÎÑ܇0µ[1c|2;’IR09+ÔËÌ ã;´±Ó7fúâ$~å$…š)À:fèü-Ñ‚bjNŸ«­ö)È# úá7ùnJ˜©ñJ‹.•aMWw¹J“"k(6”9)¬Ÿ7[tLÈf=Z½nd}ÂÀïŠÎˆé6ÝšÓê©çñ¿wF‰x?#ȼ°ÅGö'MßOyGZh¹…Çšªñ!е§(Ž{7_Qß$·:W¨—Z¤4~¼á=ÁèÇð6t_±»ðÀÆu¼ß¢D±†Ï÷ÀHd‚õ¯\Ëî6›ÛÌàHîgÎv°ª…]g”÷Éö¦T¼¨,ÕÜ÷#8•=_èEïÛ¼‡þ}X•ß»áÑ/Á‘Gà­¡Ìýo‚—·Üûe¥ËÉi´3ígÀŒkŸßgãã-Ë;"oÆKc†æ[§Xa¥õ]R^oÅHñ@‰ê7h*Ê™{Óm9Et$+T Ë²×ô‡]^•‰fÐV*õÓôq7’–ÄnÑûŽîÀ÷¶°}ù54ªM”p¥3‚ ¥8Û5û$M;E—6[ìA‰¯ó–e{‘:Ó™_p!góÈâÆ! &“;þ0Rp¨ØÂ‹}œŸï%ŠÅ8ßp/y•¨Ä¾ë=\ˆêñ½‰å 9ÇÏ=baz›ÇÁHyez“Rt­Ötç{¯˜ßç…V²e2Uhí[MñjѺާ€âÓˆäOmöK)k虌„Œ[ý4#,–ݪ ëO[¬øÓ0K2?¸ƒkQ½8Òòi1[CÑqÙ+¾qÑõB;˜Ó2€.—(åìZÚc›îDȬ¥â~+Zq±¾ƒšÃL3Å\®Ns鎑ß@\/cdÈŒeÅ— ¾Ôú÷ýµ­Šß<ºé0ý’™Z>»NÂ3ºŽä45Þ6D'{LóP†ÌÙÇŒvUëÑ–FRôcÊÉKJ—¹F‡&÷`|äOZÑm\Ápéßç~ •ÇH=Ò>Í'ÒjwW§vÓGjßkïÍ~!$uײ2Úió”ó}RdZð?+ë× üãõ‡ëUÝ¼Ç endstream endobj 4 0 obj 4850 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275574 841.889771 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 6 0 obj << /Creator (cairo 1.5.15 (http://cairographics.org)) /Producer (cairo 1.5.15 (http://cairographics.org)) >> endobj 7 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 8 0000000000 65535 f 0000005427 00000 n 0000005141 00000 n 0000000015 00000 n 0000005118 00000 n 0000005213 00000 n 0000005492 00000 n 0000005619 00000 n trailer << /Size 8 /Root 7 0 R /Info 6 0 R >> startxref 5671 %%EOF MoarVM-2015.11/3rdparty/dyncall/doc/manual/dyncall_watermark.svg0000644000175000017500000003646512456307246023543 0ustar jnthnjnthn generated by pstoedit version:3.45 from dyncall_logo.eps MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual.tex0000644000175000017500000001254512466674236021316 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007-2014 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// % Set the normal line height for the entire document (some command depend on it). \newcommand{\normallineheight}{10pt} \documentclass[\normallineheight,a4paper]{article} % Value multiplier. \newlength\mrbraceheight \newcommand{\tassimultiply}[2]{% \setlength{\mrbraceheight}{0pt}% \newcount\qq% \qq=1 % Subtract 1 by starting at 1 . \loop% \addtolength\mrbraceheight{#2}% \advance\qq by 1% \ifnum\qq < #1 \repeat% } % Conditional if tex4ht is on or not \newcommand{\ifhtml}[1]{% \ifx\HCode\Undef \else% #1% \fi% } \newcommand{\ifnhtml}[1]{% \ifx\HCode\Undef% #1% \fi% } % Packages. \usepackage{a4wide} \usepackage{multirow} \usepackage{hhline} \usepackage{color} \usepackage{colortbl} \usepackage{bigdelim} \usepackage{rotating} \usepackage{graphicx} \usepackage{moreverb} \usepackage{listings} \usepackage{hyperref} \ifnhtml{\usepackage{watermark}} % Define own commands and style. \newcommand{\dc}{\emph{dyncall}} \newcommand{\capi}[1]{% \noindent% % \begin{verbatim}% {\tt #1}% % \end{verbatim}% } \newcommand{\tab}{\indent} \newcommand{\shell}[1]{\noindent{\tt #1}} % Multiline table row with left or right curly brace. %\newcommand{\mrrbrace}[2]{\tassimultiply{#1}{5pt} \multirow{#1}{*}{$\smash{\left. {\vrule height 0pt depth \mrbraceheight width 0pt}\right\}}$#2}} \newcommand{\mrrbrace}[2]{\rdelim\}{#1}{\normallineheight} \multirow{#1}{*}{#2} } \newcommand{\mrlbrace}[2]{ \multirow{#1}{*}{#2} \ldelim\{{#1}{\normallineheight}} \newcommand{\tablewidth}{130mm} %\setlength{\oddsidemargin}{10mm} %\setlength{\textwidth}{140mm} %\setlength{\parindent}{0mm} %\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} \newcommand{\ninetyb}{\begin{sideways}} \newcommand{\ninetye}{\end{sideways}} \renewcommand{\paragraph}[1]{% \par\vspace{12pt}% \noindent% {\bf#1}% \par% \vspace{6pt}% }% % Set a watermark, but not when running htlatex \ifnhtml{% \watermark{% \begingroup% \setlength{\unitlength}{1mm}% \begin{picture}(0,0)(32,300)% \includegraphics[scale=1.0]{dyncall_watermark}% \end{picture}% \endgroup% }% } % Use a sans-serif font. \renewcommand{\familydefault}{\sfdefault} \definecolor{defbkgd}{gray}{1.0} \definecolor{gray1}{gray}{0.9} \definecolor{gray2}{gray}{0.8} \definecolor{gray3}{gray}{0.7} \definecolor{gray4}{gray}{0.6} \definecolor{lightgreen}{rgb}{0.0,1.0,0.0} \definecolor{darkgreen}{rgb}{0.0,0.6,0.0} % Define some column types for our colortables \usepackage{array} \newcommand{\cellcA}{} \newcommand{\cellcB}{} \newcommand{\cellcC}{} \newcommand{\cellcD}{} \newcolumntype{1}{l} \newcolumntype{2}{l} \newcolumntype{3}{l} \newcolumntype{4}{l} \newcolumntype{5}{r} \newcolumntype{6}{r} \newcolumntype{7}{r} \newcolumntype{8}{r} \newcolumntype{A}{p{\tablewidth}} \newcolumntype{B}{p{\tablewidth}} \newcolumntype{C}{p{\tablewidth}} \newcolumntype{D}{p{\tablewidth}} % listings package related settings \lstset{captionpos=b} \lstset{frame=tblr} \lstset{frameround=tttt} \lstset{basicstyle=\ttfamily} % text building blocks \newcommand{\group}[1]{{\it$<$#1$>$}} \newcommand{\sigchar}[1]{'{\tt #1}'} \newcommand{\sigstr}[1]{"{\tt #1}"} \newcommand{\cenum}[1]{#1} \newcommand{\product}[1]{\emph{#1}} % colors used to signalize undefined, not used, supported, etc. states. \newcommand{\marknull}{\cellcolor{white}} \newcommand{\markcmpl}{\cellcolor{lightgreen}} \newcommand{\markimpl}{\cellcolor{darkgreen}} \newcommand{\marknimp}{\cellcolor{red}} \newcommand{\markunkn}{\cellcolor{yellow}} \newcommand{\marknotx}{\cellcolor{gray1}} % table of contents config \setcounter{tocdepth}{3} \begin{document} % html output options (that need to come after \begin{document}).. \ifhtml{ \Configure{tableofcontents*}{chapter} } % main document content --> \input{manual_title} \newpage \tableofcontents \newpage \ifnhtml{ \listoftables \listoffigures \lstlistoflistings } \newpage \input{manual_motivation} \input{manual_overview} \input{manual_build} \input{manual_bindings} \input{manual_design} \input{manual_devel} \input{manual_epilog} \appendix \addtocontents{toc}{\protect\pagebreak} \input{manual_dyncall_api} \input{manual_dyncallback_api} \input{manual_dynload_api} \input{manual_cc} \input{manual_literature} \end{document} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_bindings.tex0000644000175000017500000002633712466674236023177 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Bindings to programming languages} Through binding of the \product{dyncall} library into a scripting environment, the scripting language can gain system programming status to a certain degree.\\ The \product{dyncall} library provides bindings to Erlang\cite{Erlang}, Java\cite{Java}, Lua\cite{Lua}, Python\cite{Python}, R\cite{R}, Ruby\cite{Ruby}, Go\cite{Go} and the shell/command line.\\ However, please note that some of these bindings are work-in-progress and not automatically tested, meaning it might require some additional work to make them work. \subsection{Common Architecture} The binding interfaces of the \product{dyncall} library to various scripting languages share a common set of functionality to invoke a function call. \subsubsection{Dynamic loading of code} The helper library \emph{dynload} which accompanies the \product{dyncall} library provides an abstract interface to operating-system specific mechanisms for loading and accessing executable code out of, but not limited to, shared libraries. \subsubsection{Functions} All bindings are based on a common interface convention providing a common set of the following 4 functions (exact spelling depending on the binding's scripting environment): \begin{description} \item [load] - load a module of compiled code \item [free] - unload a module of compiled code \item [find] - find function pointer by symbolic names \item [call] - invoke a function call \end{description} \pagebreak \subsubsection{Signatures} A signature is a character string that represents a function's arguments and return value types. It is used in the scripting language bindings invoke functions to perform automatic type-conversion of the languages' types to the low-level C/C++ data types. This is an essential part of mapping the more flexible and often abstract data types provided in scripting languages conveniently to the strict machine-level data types used by C-libraries. The high-level C interface functions \capi{dcCallF()}, \capi{dcVCallF()}, \capi{dcArgF()} and \capi{dcVArgF()} of the \product{dyncall} library also make use of this signature string format.\\ \\ The format of a \product{dyncall} signature string is as depicted below: \paragraph{\product{dyncall} signature string format} \begin{center} \group{input parameter type signature character}* \sigchar{)} \group{return type signature character} \\ \end{center} The \group{input parameter type signature character} sequence left to the \sigchar{)} is in left-to-right order of the corresponding C function parameter type list.\\ The special \group{return type signature character} \sigchar{v} specifies that the function does not return a value and corresponds to \capi{void} functions in C. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{cl} \hline Signature character & C/C++ data type \\ \hline \sigchar{B} & \_Bool, bool \\ \sigchar{c} & char \\ \sigchar{C} & unsigned char \\ \sigchar{s} & short \\ \sigchar{S} & unsigned short \\ \sigchar{i} & int \\ \sigchar{I} & unsigned int \\ \sigchar{j} & long \\ \sigchar{J} & unsigned long \\ \sigchar{l} & long long, int64\_t \\ \sigchar{L} & unsigned long long, uint64\_t \\ \sigchar{f} & float \\ \sigchar{d} & double \\ \sigchar{p} & void* \\ \sigchar{Z} & const char* (pointing to C string) \\ \sigchar{v} & void \\ \hline \end{tabular*} \caption{Type signature encoding for function call data types} \label{sigchar} \end{center} \end{table} Please note that using a \sigchar{(} at the beginning of a signature string is possible, although not required. The character doesn't have any meaning and will simply be ignored. However, using it prevents annoying syntax highlighting problems with some code editors. \pagebreak \paragraph{Examples of C function prototypes} \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{rll} \hline & C function prototype & dyncall signature \\ \hline void & f1(); & \sigstr{)v}\\ int & f2(int, int); & \sigstr{ii)i}\\ long long & f3(void*); & \sigstr{p)L}\\ void & f3(int**); & \sigstr{p)v}\\ double & f4(int, bool, char, double, const char*); & \sigstr{iBcdZ)d}\\ \hline \end{tabular*} \caption{Type signature examples of C function prototypes} \label{sigex} \end{center} \end{table} \subsection{Erlang language bindings} The OTP library application {\tt erldc} implements the Erlang language bindings. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Signature character & accepted Erlang data types\\ \hline \sigchar{B} & atoms 'true' and 'false' converted to bool\\ \sigchar{c}, \sigchar{C} & integer cast to (unsigned) char\\ \sigchar{s}, \sigchar{S} & integer cast to (unsigned) short\\ \sigchar{i}, \sigchar{I} & integer cast to (unsigned) int\\ \sigchar{j}, \sigchar{J} & integer cast to (unsigned) long\\ \sigchar{l}, \sigchar{L} & integer cast to (unsigned) long long\\ \sigchar{f} & decimal cast to float\\ \sigchar{d} & decimal cast to double\\ \sigchar{p} & binary (previously returned from call\_ptr or callf) cast to void*\\ \sigchar{Z} & string cast to void*\\ \sigchar{v} & no return type\\ \hline \end{tabular*} \caption{Type signature encoding for Erlang bindings} \label{Erlangsigchar} \end{center} \end{table} \pagebreak \subsection{Go language bindings} A Go binding is provided through the {\tt godc} package. Since Go's type system is basically a superset of C's, the type mapping from Go to C is straightforward. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Signature character & accepted Go data types\\ \hline \sigchar{B} & bool\\ \sigchar{c}, \sigchar{C} & int8, uint8\\ \sigchar{s}, \sigchar{S} & int16, uint16\\ \sigchar{i}, \sigchar{I} & int, uint\\ \sigchar{j}, \sigchar{J} & int32, uint32\\ \sigchar{l}, \sigchar{L} & int64, uint64\\ \sigchar{f} & float32\\ \sigchar{d} & float64\\ \sigchar{p}, \sigchar{Z} & uintptr, unsafe.Pointer\\ \sigchar{v} & no return type\\ \hline \end{tabular*} \caption{Type signature encoding for Go bindings} \label{Gosigchar} \end{center} \end{table} Note that passing a Go-{\tt string} directly to a C-function expecting a pointer is not directly possible. However, the binding comes with two helper functions, {\tt AllocCString(value string) unsafe.Pointer} and {\tt FreeCString(value unsafe.Pointer)} to help with converting a {\tt string} to an {\tt unsafe.Pointer} which then can be passed to {\tt ArgPointer(value unsafe.Pointer)}. Once you are done with this temporary string, free it using {\tt FreeCString(value unsafe.Pointer)}. \subsection{Python language bindings} The python module {\tt pydc} implements the Python language bindings, namely {\tt load}, {\tt find}, {\tt free}, {\tt call}. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Signature character & accepted Python data types\\ \hline \sigchar{B} & bool \\ \sigchar{c} & if string, take first item\\ \sigchar{s} & int, check in range\\ \sigchar{i} & int\\ \sigchar{j} & int\\ \sigchar{l} & long, casted to long long\\ \sigchar{f} & float\\ \sigchar{d} & double\\ \sigchar{p} & string or long casted to void*\\ \sigchar{v} & no return type\\ \hline \end{tabular*} \caption{Type signature encoding for Python bindings} \label{Pysigchar} \end{center} \end{table} \pagebreak \subsection{R language bindings} The R package {\tt rdyncall} implements the R langugae bindings providing the function {\tt .dyncall() }. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Signature character & accepted R data types\\ \hline \sigchar{B} & coerced to logical vector, first item\\ \sigchar{c} & coerced to integer vector, first item truncated char\\ \sigchar{C} & coerced to integer vector, first item truncated to unsigned char\\ \sigchar{s} & coerced to integer vector, first item truncated to short\\ \sigchar{S} & coerced to integer vector, first item truncated to unsigned short\\ \sigchar{i} & coerced to integer vector, first item\\ \sigchar{I} & coerced to integer vector, first item casted to unsigned int\\ \sigchar{j} & coerced to integer vector, first item\\ \sigchar{J} & coerced to integer vector, first item casted to unsigned long\\ \sigchar{l} & coerced to numeric, first item casted to long long\\ \sigchar{L} & coerced to numeric, first item casted to unsigned long long\\ \sigchar{f} & coerced to numeric, first item casted to float\\ \sigchar{d} & coerced to numeric, first item\\ \sigchar{p} & external pointer or coerced to string vector, first item\\ \sigchar{Z} & coerced to string vector, first item\\ \sigchar{v} & no return type\\ \hline \end{tabular*} \caption{Type signature encoding for R bindings} \label{Rsigchar} \end{center} \end{table} Some notes on the R Binding: \begin{itemize} \item Unsigned 32-bit integers are represented as signed integers in R. \item 64-bit integer types do not exist in R, therefore we use double floats to represent 64-bit integers (using only the 52-bit mantissa part). \end{itemize} \pagebreak \subsection{Ruby language bindings} The Ruby gem {\tt rbdc} implements the Ruby language bindings. \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Signature character & accepted Ruby data types\\ \hline \sigchar{B} & TrueClass, FalseClass, NilCalss, Fixnum casted to bool\\ \sigchar{c}, \sigchar{C} & Fixnum cast to (unsigned) char\\ \sigchar{s}, \sigchar{S} & Fixnum cast to (unsigned) short\\ \sigchar{i}, \sigchar{I} & Fixnum cast to (unsigned) int\\ \sigchar{j}, \sigchar{J} & Fixnum cast to (unsigned) long\\ \sigchar{l}, \sigchar{L} & Fixnum cast to (unsigned) long long\\ \sigchar{f} & Float cast to float\\ \sigchar{d} & Float cast to double\\ \sigchar{p}, \sigchar{Z} & String cast to void*\\ \sigchar{v} & no return type\\ \hline \end{tabular*} \caption{Type signature encoding for Ruby bindings} \label{Rubysigchar} \end{center} \end{table} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_build.tex0000644000175000017500000001535212466674236022474 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Building the library} The library has been built and used successfully on several platform/architecture configurations and build systems. Please see notes on specfic platforms to check if the target architecture is currently supported. \subsection{Requirements} The following tools are supported directly to build the \product{dyncall} library. However, as the number of source files to be compiled for a given platform is small, it shouldn't be difficult to build it manually with another toolchain. \begin{itemize} \item C compiler to build the \product{dyncall} library (GCC, Clang, SunPro or Microsoft C/C++ compiler) \item C++ compiler to build the optional test cases (GCC, Clang, SunPro or Microsoft C/C++ compiler) \item BSD make, GNU make, Microsoft nmake or mk (on Plan9) as automated build tools \item Python (optional - for generation of some test cases) \item Lua (optional - for generation of some test cases) \item CMake (optional support) \end{itemize} \subsection{Supported/tested platforms and build systems} Building \product{dyncall} is a straightforward two-step process, first configure, then make. The library should be able to be built with the default operating systems' build tools, so BSD make on BSD and derived systems, GNU make on GNU and compatible, mk on Plan9, nmake on Windows, etc.. This is a detailed overview of platforms and their build tools that are known to build \product{dyncall}:\\ \\ \begin{tabular}{l l l} {\bf{\large Platform}} & Build Tool(s) & Compiler, SDK \\ \hline {\bf{\large Windows}} & nmake,Visual Studio & cl, cygwin (gcc), mingw (gcc) \\ {\bf{\large Unix-like}} & GNU/BSD/Sun make & gcc, clang, sunc \\ {\bf{\large Plan9}} & mk & 8c \\ {\bf{\large Haiku/BeOS}} & GNU make & gcc \\ {\bf{\large iOS/iPhone}} & GNU make & gcc and iPhone SDK on Mac OS X \\ {\bf{\large Nintendo DS}} & nmake & devkitPro\cite{devkitPro} tools on Windows \\ {\bf{\large Playstation Portable}} & GNU make & psptoolchain\cite{psptoolchain} tools \\ \end{tabular}\\ \pagebreak \subsection{Build instructions} \begin{enumerate} \item Configure the source (not needed for Makefile.embedded) \paragraph{*nix flavour} \begin{lstlisting} ./configure [--option ...] \end{lstlisting} Available options (omit for defaults): \begin{tabular}{ll} {\tt --help} & display help \\ {\tt --prefix={\it path}} & specify installation prefix (Unix shell) \\ {\tt --target={\it platform}} & MacOSX,iOS,iPhoneSimulator,PSP,... \\ {\tt --sdk={\it version}} & SDK version \\ \end{tabular} \paragraph{Windows flavour, and cross-build from Windows (PSP, NDS, etc.)} \begin{lstlisting} .\configure [/option ...] \end{lstlisting} Available options: \begin{tabular}{ll} {\tt /?} & display help \\ {\tt /prefix {\it path}} & set installation prefix (GNU make only) \\ {\tt /prefix-bd {\it path}} & set build directory prefix (GNU make only) \\ {\tt /target-x86} & build for x86 architecture (default) \\ {\tt /target-x64} & build for x64 architecture \\ {\tt /target-psp} & build for PlayStation Portable (homebrew SDK) \\ {\tt /target-nds-arm} & build for Nintendo DS (devkitPro, ARM mode) \\ {\tt /target-nds-thumb} & build for Nintendo DS (devkitPro, THUMB mode) \\ {\tt /tool-msvc} & use Microsoft Visual C++ compiler (default) \\ {\tt /tool-gcc} & use GNU Compiler Collection \\ {\tt /asm-ml} & use Microsoft Macro Assembler (default) \\ {\tt /asm-as} & use the GNU Assembler \\ {\tt /asm-nasm} & use NASM Assembler \\ {\tt /config-release} & build release version (default) \\ {\tt /config-debug} & build debug version \\ \end{tabular} \paragraph{Plan 9 flavour} \begin{lstlisting} ./configure.rc [--option ...] \end{lstlisting} Available options (none, at the moment): \begin{tabular}{ll} {\tt --help} & display help \\ \end{tabular} \item Build the static libraries \product{dyncall}, \product{dynload} and \product{dyncallback} \begin{lstlisting} make # for {GNU,BSD} Make nmake /f Nmakefile # for NMake on Windows mk # for mk on Plan9 \end{lstlisting} \item Install libraries and includes (supported for GNU and BSD make based builds, only) \begin{lstlisting} make install \end{lstlisting} \item Optionally, build the test suite \begin{lstlisting} make tests # for {GNU,BSD} Make nmake /f Nmakefile tests # for NMake on Windows mk tests # for mk on Plan9 \end{lstlisting}% @@@ check Plan9, should work already \end{enumerate} \subsection{Build-tool specific notes} Some platforms require some manual tweaks: Problem: Build fails because CC and/or related are not set, or different compiler, linker, etc. should be used. Solution: Set the 'CC' and other environment variables explicitly to the desired tools. E.g.: \begin{lstlisting} CC=gcc make \end{lstlisting} Problem: On windows using mingw and msys/unixutils 'Make', the make uses 'cc' for C compilation, which does not exist in mingw. Solution: Set the 'CC' environment variable explicitly to 'gcc' (as in the example above). \subsection{Build with CMake} \begin{lstlisting} cmake -DCMAKE_INSTALL_PREFIX= make \end{lstlisting} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_cc.tex0000644000175000017500000000376712466674236021771 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage % ================================================== % Calling Conventions % ================================================== \section{Calling Conventions} \paragraph{Before we go any further\ldots} It is important to understand that this section isn't a general purpose description of the present calling conventions. It merely explains the calling conventions {\bf for the parameter/return types supported by \dc}, not for aggregates (structures, unions and classes), SIMD data types (\_\_m64, \_\_m128, \_\_m128i, \_\_m128d), etc.\\ We strongly advise the reader not to use this document as a general purpose calling convention reference. \input{callconvs/callconv_x86}\newpage \input{callconvs/callconv_x64}\newpage \input{callconvs/callconv_ppc32}\newpage \input{callconvs/callconv_ppc64}\newpage \input{callconvs/callconv_arm32}\newpage \input{callconvs/callconv_arm64}\newpage \input{callconvs/callconv_mips}\newpage \input{callconvs/callconv_sparc}\newpage \input{callconvs/callconv_sparc64} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_design.tex0000644000175000017500000000430412456307246022632 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Library Design} \subsection{Design considerations} The \product{dyncall} library encapsulates function call invocation semantics that depend on the compiler, operating system and architecture. The core library is driven by a function call invocation engine, named \emph{CallVM}, that encapsulates a call stack to foreign functions and manages the following three phases that constitute a truly dynamic function call: \begin{enumerate} \item Specify the calling convention. Some run-time platforms, such as Microsoft Windows on a 32-bit X86 architecture, even support multiple calling conventions. \item Specify the function call arguments in a specific order. The interface design dictates a \emph{left to right} order for C and C++ function calls in which the arguments are bound. \item Specify the target function address, expected return value and invoke the function call. \end{enumerate} The calling convention mode entirely depends on the way the foreign function has been compiled and specifies the low-level details on how a function actually expects input parameters (in memory, in registers or both) and how to return its result(s). MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_devel.tex0000644000175000017500000001157612466674236022500 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Developers} \subsection{Noteworthy files in the project root} \begin{verbatim} configure -- pre-make configuration tool (unix-shell) configure.bat -- pre-nmake configuration tool (windows batch) configure.rc -- pre-mk configuration tool (Plan 9's rc) CMakeLists.txt-- top-level project information for CMake Makefile -- GNU/BSD makefile (output of ./configure) Nmakefile -- MS nmake makefile mkfile -- Plan 9 mkfile LICENSE -- license information README -- quickstart doc buildsys/ -- build system details and extras doc/ -- platform specific readme's and manual dyncall/ -- dyncall library source code dyncallback/ -- dyncallback library source code dynload/ -- dynload library source code test/ -- test suites \end{verbatim} \subsection{Test suites} \begin{description} \item [plain] Simple, identity, unary function calls for all supported return types and calling conventions. \item [plain\_c++] Similar to plain, but for C++ thiscalls (GNU and MS calling convention). \item [suite] All combinations of parameter types and counts are tested on void function calls. A script written in Python ({\tt mkcase.py}) generates the tests up to an upper MAXARG limit. \item [suite\_floats] Based on suite. Test double/float variants with up to 10 arguments. \item [suite\_x86win32std] All combinations of parameter types and counts are tested on {\tt \_\_stdcall} void function calls. A script written in Python ({\tt mkcase.py}) generates the tests up to an upper MAXARG limit. This is a x86/Windows only test. \item [suite\_x86win32fast] All combinations of parameter types and counts are tested on {\tt \_\_fastcall} (MS or GNU, depending on the build tool) void function calls. A script written in Python ({\tt mkcase.py}) generates the tests up to an upper MAXARG limit. This is a x86/Windows only test. \item [ellipsis] All combinations of parameter types and counts are tested on void ellipsis function calls. A script written in Python ({\tt mkcase.py}) generates the tests up to an upper MAXARG limit. \item [suite2] Designed mass test suite for void function calls. Tests individual void functions with a varying count of arguments and type. \item [suite2\_win32std] Designed mass test suite for {\tt \_\_stdcall} void function calls. Tests individual void functions with a varying count of arguments and type. This is a x86/Windows only test. \item [suite2\_win32fast] Designed mass test suite for {\tt \_\_fastcall} (MS or GNU, depending on the build tool) void function calls. Tests individual void functions with a varying count of arguments and type. This is a x86/Windows only test. \item [suite3] All combinations of parameter types integer, long long, float and double and counts are tested on void function calls. A script written in Python ({\tt mkcase.py}) generates the tests up to an upper MAXARG limit. This is a modified version of suite. \item [call\_suite] General purpose test suite combining aspects from all others suites (usually enough for testing non-callback calls). A script written in Lua generates the tests. \item [callf] Tests the \emph{formatted call} \product{dyncall} C API. \item [malloc\_wx] Tests \emph{writable and executable memory allocation} used by the \product{dyncallback} C API. \item [thunk] Tests \emph{callbacks} for the \product{dyncallback} C API. \item [callback\_plain] Simple callback function test (useful for easy debugging of new ports). \item [callback\_suite] Mass test suite for callback function testing. Uses random function argument number and type. A script written in Lua generates the tests up to a given number of calls and type combinations. \item [resolv\_self] Test for dynload library to resolve symbols from application image itself. \end{description} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_dyncall_api.tex0000644000175000017500000002625112466674236023654 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2010 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{\emph{Dyncall} C library API} The library provides low-level functionality to make foreign function calls from different run-time environments. The flexibility is constrained by the set of supported types. \paragraph{C interface style conventions} This manual and the \product{dyncall} library's C interface {\tt "dyncall.h"} use the following C source code style. \begin{table}[h] \begin{center} \begin{tabular*}{0.8\textwidth}{llll} \hline Subject & C symbol & Details & Example \\ \hline Types & {\tt DC\group{type name}} & lower-case & \capi{DCint}, \capi{DCfloat}, \capi{DClong}, \ldots\\ Structures & {\tt DC\group{structure name}} & camel-case & \capi{DCCallVM}\\ Functions & {\tt dc\group{function name}} & camel-case & \capi{dcNewCallVM}, \capi{dcArgInt}, \ldots\\ \hline \end{tabular*} \caption{C interface conventions} \label{sourcecode} \end{center} \end{table} \subsection{Supported C/C++ argument and return types} \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Type alias & C/C++ data type\\ \hline DCbool & \_Bool, bool\\ DCchar & char\\ DCshort & short\\ DCint & int\\ DClong & long\\ DClonglong & long long\\ DCfloat & float\\ DCdouble & double\\ DCpointer & void*\\ DCvoid & void\\ \hline \end{tabular*} \caption{Supported C/C++ argument and return types} \label{types} \end{center} \end{table} \pagebreak \subsection{Call Virtual Machine - CallVM} This \emph{CallVM} is the main entry to the functionality of the library. \paragraph{Types} \begin{lstlisting}[language=c] typedef void DCCallVM; /* abstract handle */ \end{lstlisting} \paragraph{Details} The \emph{CallVM} is a state machine that manages all aspects of a function call from configuration, argument passing up the actual function call on the processor. \subsection{Allocation} \paragraph{Functions} \begin{lstlisting}[language=c] DCCallVM* dcNewCallVM (DCsize size); void dcFree(DCCallVM* vm); \end{lstlisting} \lstinline{dcNewCallVM} creates a new \emph{CallVM} object, where \lstinline{size} specifies the max size of the internal stack that will be allocated and used to bind arguments to. Use \lstinline{dcFree} to destroy the \emph{CallVM} object.\\ \\ This will allocate memory using the system allocators or custom ones provided custom \capi{dcAllocMem} and \capi{dcFreeMem} macros are defined to override the default behaviour. See \capi{dyncall\_alloc.h} for defails. \subsection{Error Reporting} \paragraph{Function} \begin{lstlisting}[language=c] DCint dcGetError(DCCallVM* vm); \end{lstlisting} Returns the most recent error state code out of the following: \paragraph{Errors} \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Constant & Description\\ \hline \lstinline@DC_ERROR_NONE@ & No error occured. \\ \lstinline@DC_ERROR_UNSUPPORTED_MODE@ & Unsupported mode, caused by \lstinline@dcMode()@ \\ \hline \end{tabular*} \caption{CallVM calling convention modes} \label{errorcodes} \end{center} \end{table} \pagebreak \subsection{Configuration} \paragraph{Function} \begin{lstlisting}[language=c] void dcMode (DCCallVM* vm, DCint mode); \end{lstlisting} Sets the calling convention to use. Note that some mode/platform combination don't make any sense (e.g. using a PowerPC calling convention on a MIPS platform) and are silently ignored. \paragraph{Modes} \begin{table}[h] \begin{center} \begin{tabular*}{0.75\textwidth}{ll} \hline Constant & Description\\ \hline \lstinline@DC_CALL_C_DEFAULT@ & C default function call for current platform\\ \lstinline@DC_CALL_C_ELLIPSIS@ & C ellipsis function call (named arguments (before '...'))\\ \lstinline@DC_CALL_C_ELLIPSIS_VARARGS@ & C ellipsis function call (variable/unnamed arguments (after '...'))\\ \lstinline@DC_CALL_C_X86_CDECL@ & C x86 platforms standard call\\ \lstinline@DC_CALL_C_X86_WIN32_STD@ & C x86 Windows standard call\\ \lstinline@DC_CALL_C_X86_WIN32_FAST_MS@ & C x86 Windows Microsoft fast call\\ \lstinline@DC_CALL_C_X86_WIN32_FAST_GNU@ & C x86 Windows GCC fast call\\ \lstinline@DC_CALL_C_X86_WIN32_THIS_MS@ & C x86 Windows Microsoft this call\\ \lstinline@DC_CALL_C_X86_WIN32_THIS_GNU@ & C x86 Windows GCC this call\\ \lstinline@DC_CALL_C_X86_PLAN9@ & C x86 Plan9 call\\ \lstinline@DC_CALL_C_X64_WIN64@ & C x64 Windows standard call\\ \lstinline@DC_CALL_C_X64_SYSV@ & C x64 System V standard call\\ \lstinline@DC_CALL_C_PPC32_DARWIN@ & C ppc32 Mac OS X standard call\\ \lstinline@DC_CALL_C_PPC32_OSX@ & alias for DC\_CALL\_C\_PPC32\_DARWIN\\ \lstinline@DC_CALL_C_PPC32_SYSV@ & C ppc32 SystemV standard call\\ \lstinline@DC_CALL_C_PPC32_LINUX@ & alias for DC\_CALL\_C\_PPC32\_SYSV\\ \lstinline@DC_CALL_C_PPC64@ & C ppc64 SystemV standard call\\ \lstinline@DC_CALL_C_PPC64_LINUX@ & alias for DC\_CALL\_C\_PPC64\\ \lstinline@DC_CALL_C_ARM_ARM@ & C arm call (arm mode)\\ \lstinline@DC_CALL_C_ARM_THUMB@ & C arm call (thumb mode)\\ \lstinline@DC_CALL_C_ARM_ARM_EABI@ & C arm eabi call (arm mode)\\ \lstinline@DC_CALL_C_ARM_THUMB_EABI@ & C arm eabi call (thumb mode)\\ \lstinline@DC_CALL_C_ARM_ARMHF@ & C arm call (arm hardfloat - e.g. raspberry pi)\\ \lstinline@DC_CALL_C_ARM64@ & C arm64 call (AArch64)\\ \lstinline@DC_CALL_C_MIPS32_EABI@ & C mips32 eabi call\\ \lstinline@DC_CALL_C_MIPS32_PSPSDK@ & alias for DC\_CALL\_C\_MIPS32\_EABI (deprecated)\\ \lstinline@DC_CALL_C_MIPS32_O32@ & C mips32 o32 call\\ \lstinline@DC_CALL_C_MIPS64_N64@ & C mips64 n64 call\\ \lstinline@DC_CALL_C_MIPS64_N32@ & C mips64 n32 call\\ \lstinline@DC_CALL_C_SPARC32@ & C sparc32 call\\ \lstinline@DC_CALL_C_SPARC64@ & C sparc64 call\\ \lstinline@DC_CALL_SYS_DEFAULT@ & C default syscall for current platform\\ \lstinline@DC_CALL_SYS_X86_INT80H_BSD@ & C syscall for x86 BSD platforms\\ \lstinline@DC_CALL_SYS_X86_INT80H_LINUX@ & C syscall for x86 Linux\\ \lstinline@DC_CALL_SYS_PPC32@ & C syscall for ppc32 Linux\\ \hline \end{tabular*} \caption{CallVM calling convention modes} \label{callingconventionmodes} \end{center} \end{table} \paragraph{Details} \lstinline@DC_CALL_C_DEFAULT@ is the default standard C call on the target platform. It uses the standard C calling convention. \lstinline@DC_CALL_C_ELLIPSIS@ is used for C ellipsis calls which allow to build up a variable argument list. On many platforms, there is only one C calling convention. The X86 platform provides a rich family of different calling conventions. \\ \subsection{Machine state reset} \begin{lstlisting}[language=c] void dcReset(DCCallVM* vm); \end{lstlisting} Resets the internal stack of arguments and prepares it for the selected mode. This function should be called after setting the call mode (using dcMode), but prior to binding arguments to the CallVM. Use it also when reusing a CallVM, as arguments don't get flushed automatically after a function call invocation.\\ \subsection{Argument binding} \paragraph{Functions} \begin{lstlisting}[language=c] void dcArgBool (DCCallVM* vm, DCbool arg); void dcArgChar (DCCallVM* vm, DCchar arg); void dcArgShort (DCCallVM* vm, DCshort arg); void dcArgInt (DCCallVM* vm, DCint arg); void dcArgLong (DCCallVM* vm, DClong arg); void dcArgLongLong(DCCallVM* vm, DClonglong arg); void dcArgFloat (DCCallVM* vm, DCfloat arg); void dcArgDouble (DCCallVM* vm, DCdouble arg); void dcArgPointer (DCCallVM* vm, DCpointer arg); \end{lstlisting} \paragraph{Details} Used to bind arguments of the named types to the CallVM object. Arguments should be bound in \emph{left-to-right} order regarding the C function prototype.\\ \subsection{Call invocation} \paragraph{Functions} \begin{lstlisting}[language=c] DCvoid dcCallVoid (DCCallVM* vm, DCpointer funcptr); DCbool dcCallBool (DCCallVM* vm, DCpointer funcptr); DCchar dcCallChar (DCCallVM* vm, DCpointer funcptr); DCshort dcCallShort (DCCallVM* vm, DCpointer funcptr); DCint dcCallInt (DCCallVM* vm, DCpointer funcptr); DClong dcCallLong (DCCallVM* vm, DCpointer funcptr); DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr); DCfloat dcCallFloat (DCCallVM* vm, DCpointer funcptr); DCdouble dcCallDouble (DCCallVM* vm, DCpointer funcptr); DCpointer dcCallPointer (DCCallVM* vm, DCpointer funcptr); \end{lstlisting} \paragraph{Details} Calls the function specified by \emph{funcptr} with the arguments bound to the \emph{CallVM} and returns. Use the function that corresponds to the dynamically called function's return value.\\ \\ After the invocation of the foreign function call, the argument values are still bound and a second call using the same arguments can be issued. If you need to clear the argument bindings, you have to reset the \emph{CallVM}. \subsection{Formatted argument binding and calls (ANSI C ellipsis interface)} \paragraph{Functions} \begin{lstlisting}[language=c] void dcArgF (DCCallVM* vm, const DCsigchar* signature, ...); void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args); void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...); void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args); \end{lstlisting} \paragraph{Details} These functions can be used to operate \product{dyncall} via a printf-style functional interface, using a signature string encoding the argument types and return type. \capi{dcArgF()} and \capi{dcVArgF()} just bind arguments to the \capi{DCCallVM} object, so any return value specified in the signature is ignored. \capi{dcCallF()} and \capi{dcVCallF()} also take a function pointer to call after binding the arguments. The return value will be stored in what \lstinline{result} points to. For more information about the signature format, refer to \ref{sigchar}. MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_dyncallback_api.tex0000644000175000017500000001007412466674236024471 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2013 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{\emph{Dyncallback} C library API} This library extends \product{dyncall} with function callback support, allowing the user to dynamically create a callback object that can be called directly, or passed to functions expecting a function-pointer as argument.\\ \\ Invoking a \product{dyncallback} calls into a user-defined unified handler that permits iteration and thus dynamic handling over the called-back-function's parameters.\\ \\ The flexibility is constrained by the set of supported types, though.\\ \\ For style conventions and supported types, see \product{dyncall} API section. In order to use \product{dyncallback}, include {\tt "dyncall\_callback.h"}. \subsection{Callback Object} The \emph{Callback Object} is the core component to this library. \paragraph{Types} \begin{lstlisting}[language=c] typedef struct DCCallback DCCallback; \end{lstlisting} \paragraph{Details} The \emph{Callback Object} is an object that mimics a fully typed function call to another function (a generic callback handler, in this case).\\ \\ This means, a pointer to this object is passed to a function accepting a pointer to a callback function \emph{as the very callback function pointer itself}. Or, if called directly, cast a pointer to this object to a function pointer and issue a call. \subsection{Allocation} \paragraph{Functions} \begin{lstlisting}[language=c] DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* funcptr, void* userdata); void dcbFreeCallback(DCCallback* pcb); \end{lstlisting} \lstinline{dcbNewCallback} creates and initializes a new \emph{Callback} object, where \lstinline{signature} is the needed function signature (format is the one outlined in the language bindings-section of this manual, see \ref{sigchar}) of the function to mimic, \lstinline{funcptr} is a pointer to a callback handler, and \lstinline{userdata} a pointer to custom data that might be useful in the handler. Use \lstinline{dcbFreeCallback} to destroy the \emph{Callback} object.\\ \\ As with \capi{dcNewCallVM}/\capi{dcFree}, this will allocate memory using the system allocators or custom overrides. \subsection{Callback handler} The unified callback handler's declaration used when creating a \capi{DCCallback} is: \begin{lstlisting} char cbHandler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata); \end{lstlisting} \capi{cb} is a pointer to the \capi{DCCallback} object in use, \capi{args} allows for dynamic iteration over the called-back-function's arguments (input) and \capi{result} is a pointer to a \capi{DCValue} object in order to store the callback's return value (output, to be set by handler).\\ Finally, \capi{userdata} is a pointer to some user defined data that can be set when creating the callback object. The handler itself returns a signature character (see \ref{sigchar}) specifying the data type used for \capi{result}. MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_dynload_api.tex0000644000175000017500000000372212456307246023647 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{\product{Dynload} C library API} The \product{dynload} library encapsulates dynamic loading mechanisms and gives access to functions in foreign dynamic libraries and code modules. \subsection{Loading code} \begin{lstlisting}[language=c,label=dl-load] void* dlLoadLibrary(const char* libpath); void dlFreeLibrary(void* libhandle); \end{lstlisting} \lstinline{dlLoadLibrary} loads a dynamic library at \lstinline{libpath} and returns a handle to it for use in \lstinline{dlFreeLibrary} and \lstinline{dlFindSymbol} calls. \lstinline{dlFreeLibrary} frees the loaded library with handle \lstinline{pLib}. \subsection{Retrieving functions} \begin{lstlisting}[language=c] void* dlFindSymbol(void* libhandle, const char* symbol); \end{lstlisting} returns a pointer to a symbol with name \lstinline{pSymbolName} in the library with handle \lstinline{pLib}, or returns a null pointer if the symbol cannot be found. MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_epilog.tex0000644000175000017500000001102012456307246022631 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Epilog} \subsection{Stability and security considerations} Since the \product{dyncall} library doesn't know anything about the called function itself (except its address), no parameter-type validation is done. This means that in order to avoid crashes, data corruption, etc., the user is required to ascertain the number and types of parameters. It is strongly advised to double check the parameter types of every function to be called, and not to call unknown functions at all.\\ Consider a simple program that issues a call by directly passing some unchecked command line arguments to the call itself, or even worse, by indirectly choosing a library and a function to call without verification. Such unchecked input data can quite easily be used to intentionally crash the program or to hijack it by taking over control of the program flow.\\ To put it in a nutshell, if not used with care, programs depending on the \product{dyncall}, \product{dyncallback} and \product{dynload} libraries, can be exploited as arbitrary function call dispatchers through manipulating of their input data. Successful exploits of programs like the example outlined above can be sed as very powerful tools for a wide variety of malicious attacks, \ldots \subsection{Embedding} The \product{dyncall} library strives to have a minimal set of dependencies, meaning no required runtime dependencies and usually only the necessary tools to build the library as build-time dependencies. The library uses some heap-memory to store the CallVM and uses by default the platform's \capi{malloc()} and \capi{free()} calls. However, providing custom \capi{dcAllocMem()} and \capi{dcFreeMem()} functions will override the default behaviour. See \shell{dyncall/dyncall\_alloc.h} for details. \subsection{Multi-threading} The \product{dyncall} library is thread-safe and reentrant, by means that it works correctly during execution of multiple threads if, and only if there is at most a single thread pushing arguments to one CallVM (invoking the call is always thread-safe, though). Since there's no limitation on the number of created CallVM objects, it is recommended to keep a copy for each thread if mutliple thread make use of \product{dyncall} at once. \subsection{Supported types} Currently, the \product{dyncall} library supports all of ANSI C's integer, floating point and pointer types as function call arguments as well as return values. Additionally, C++'s \capi{bool} and C99's \capi{\_Bool} types are supported. Due to the still rare and often incomplete support of the \capi{long double} type on various platforms, the latter is currently not officially supported. \subsection{Roadmap} The \product{dyncall} library should be extended by a wide variety of other calling conventions and ported to other and more esoteric platforms. With its low memory footprint it surely might come in handy on embedded systems. Furthermore, the authors plan to provide more scripting language bindings, examples, and other projects based on \product{dyncall}.\\ Besides \product{dyncall} and \product{dyncallback}, the \product{dynload} library needs to be extended with support for other shared library formats (e.g. AmigaOS .library or GEM \cite{.ldg} files). \subsection{Related libraries} Besides the \product{dyncall} library, there are other free and open projects with similar goals. The most noteworthy libraries are libffi \cite{libffi}, C/Invoke \cite{cinvoke} and libffcall \cite{libffcall}. MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_literature.tex0000644000175000017500000001471712466674236023561 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Literature} \begin{thebibliography}{14} \bibitem{Erlang} Erlang/OTP\\ \url{http://www.erlang.org} \bibitem{Java} Java Programming Language\\ \url{http://www.java.com/} \bibitem{Lua} The Programming Language Lua\\ \url{http://www.lua.org/} \bibitem{Python} Python Programming Language\\ \url{http://www.python.org/} \bibitem{R} The R Project for Statistical Computing\\ \url{http://www.r-project.org/} \bibitem{Ruby} Ruby Programming Language\\ \url{http://www.ruby-lang.org/} \bibitem{Go} Go Programming Language\\ \url{http://www.golang.org/} \bibitem{x86cdecl} cdecl calling convention / Calling conventions on the x86 platformn\\ \url{http://en.wikipedia.org/wiki/X86\_calling\_conventions#cdecl}\\ \url{http://www.angelcode.com/dev/callconv/callconv.html#thiscall} \bibitem{x86Winstdcall} Windows stdcall calling convention / Microsoft calling conventions\\ \url{http://msdn.microsoft.com/en-us/library/zxk0tw93(vs.71).aspx}\\ \url{http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html} \bibitem{x86Winfastcall} Windows fastcall calling convention / Microsoft calling conventions\\ \url{http://msdn.microsoft.com/en-us/library/Aa271991}\\ \url{http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html} \bibitem{x86GNUfastcall} GNU fastcall calling conventio / Calling conventions on the x86 platformn\\ \url{http://www.ohse.de/uwe/articles/gcc-attributes.html#func-fastcall}\\ \url{http://www.angelcode.com/dev/callconv/callconv.html#thiscall} \bibitem{x86Borlandfastcall} Borland register calling convention\\ \url{http://docwiki.embarcadero.com/RADStudio/en/Program\_Control#Register\_Convention} \bibitem{x86Watcomfastcall} Watcom 32-bit register-based calling convention\\ \url{http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/function-calling-conventions.html#Watcall32R} \url{http://www.openwatcom.org/index.php/Calling\_Conventions} \bibitem{x86Winthiscall} Microsoft calling conventions / Calling conventions on the x86 platform\\ \url{http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html}\\ \url{http://www.angelcode.com/dev/callconv/callconv.html#thiscall} \bibitem{x86GNUthiscall} Calling conventions on the x86 platform\\ \url{http://www.angelcode.com/dev/callconv/callconv.html#thiscall} \bibitem{x86Pascal} Pascal calling convention\\ \url{http://en.wikipedia.org/wiki/X86\_calling\_conventions#pascal}% better link?@@@ \bibitem{x86Plan9} Plan9 C compiler calling convention\\ \url{http://plan9.bell-labs.com/sys/doc/compiler.pdf}\\ \url{http://www.mail-archive.com/9fans@9fans.net/msg16421.html} \bibitem{ATPCS} ARM-THUMB Procedure Call Standard\\ \url{http://infocenter.arm.com/help/topic/com.arm.doc.dui0056d/DUI0056.pdf} \bibitem{AAPCS} Procedure Call Standard for the ARM Architecture\\ \url{http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042c/IHI0042C\_aapcs.pdf} \bibitem{AAPCS64} Procedure Call Standard for the ARM 64-bit Architecture\\ \url{http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B\_aapcs64.pdf} \bibitem{armeabi} Debian ARM EABI Port Wiki\\ \url{http://wiki.debian.org/ArmEabiPort} \bibitem{x64Win} MSDN: x64 Software Conventions\\ \url{http://msdn.microsoft.com/en-us/library/ms235286\%28VS.80\%29.aspx} \bibitem{x64SysV} System V Application Binary Interface - AMD64 Architecture Processor Supplement\\ \url{http://www.x86-64.org/documentation/abi.pdf} \bibitem{SPARCSysV} System V Application Binary Interface - SPARC Processor Supplement\\ \url{http://www.sparc.com/standards/psABI3rd.pdf} \bibitem{ppcMacOSX} Introduction to Mac OS X ABI Function Call Guide\\ \url{https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html} \bibitem{ppc32LSB} Linux Standard Base Core Specification for PPC32 3.2 - Chapter 8. Low Level System Information\\ \url{http://refspecs.linuxbase.org/LSB\_3.2.0/LSB-Core-PPC32/LSB-Core-PPC32/callingsequence.html} \bibitem{ppceabi} PowerPC Embedded Application Binary Interface 32-bit Implementation\\ \url{http://ftp.twaren.net/Unix/Sourceware/binutils/ppc-eabi-1995-01.pdf} \bibitem{ppceabiibm} Developing PowerPC Embedded Application Binary Interface (EABI)\\ \url{http://www.ibm.com/chips/techlib/techlib.nsf/techdocs/852569B20050FF778525699700} \bibitem{ppcelf64abi} 64-bit PowerPC ELF Application Binary Interface Supplement 1.9\\ \url{http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html} \bibitem{devkitPro} devkitPro - homebrew game development\\ \url{http://www.devkitpro.org/} \bibitem{psptoolchain} psptoolchain - all the homebrew related material ps2dev.org\\ \url{http://ps2dev.org/psp/} \bibitem{.ldg} a GEM Dynamical Library system for TOS computer\\ \url{http://ldg.sourceforge.net/} \bibitem{libffi} libffi - a portable foreign function interface library\\ \url{http://sources.redhat.com/libffi/} \bibitem{cinvoke} C/Invoke - library for connecting to C libraries at runtime\\ \url{http://www.nongnu.org/cinvoke/} \bibitem{libffcall} libffcall - foreign function call libraries\\ \url{http://www.haible.de/bruno/packages-ffcall.html} \bibitem{universalbinary} Universal Binary Programming Guidelines, Second Edition\\ \url{http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal\_binary/universal\_binary.pdf} \bibitem{seemipsruns} See Mips Run, Second Edition, 2006, Dominic Sweetman \end{thebibliography} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_motivation.tex0000644000175000017500000001415712456307246023561 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Motivation} Interoperability between programming languages is a desirable feature in complex software systems. While functions in scripting languages and virtual machine languages can be called in a dynamic manner, statically compiled programming languages such as C, C++ and Objective-C lack this ability.\\ The majority of systems use C function interfaces as their system-level interface. Calling these (foreign) functions from within a dynamic environment often involves the development of so called "glue code" on both sides, the use of external tools generating communication code, or integration of other middleware fulfilling that purpose. However, even inside a completely static environment, without having to bridge multiple languages, it can be very useful to call functions dynamically. Consider, for example, message systems, dynamic function call dispatch mechanisms, without even knowing about the target.\\ The \product{dyncall} library project provides a clean and portable C interface to dynamically issue calls to foreign code using small call kernels written in assembly. Instead of providing code for every bridged function call, which unnecessarily results in code bloat, only a modest number of instructions are used to invoke all the calls.\\ \subsection{Static function calls in C} The C programming language and its direct derivatives are limited in the way function calls are handled. A C compiler regards a function call as a fully qualified atomic operation. In such a statically typed environment, this includes the function call's argument arity and type, as well as the return type.\\ \subsection{Anatomy of machine-level calls} The process of calling a function on the machine level yields a common pattern: \begin{enumerate} \item The target function's calling convention dictates how the stack is prepared, arguments are passed, results are returned and how to clean up afterwards. \item Function call arguments are loaded in registers and on the stack according to the calling convention that take alignment constraints into account. \item Control flow transfer from caller to callee. \item Process return value, if any. Some calling conventions specify that the caller is responsible for cleaning up the argument stack. \end{enumerate} \newpage %\paragraph{Example} The following example depicts a C source and the corresponding assembly for the X86 32-bit processor architecture. \begin{lstlisting}[label=cfuncall,caption=C function call,language=C] extern void f(int x, double y,float z); void caller() { f(1,2.0,3.0f); } \end{lstlisting} \begin{lstlisting}[label=x86asm,caption=Assembly X86 32-bit function call,language={[x86masm]Assembler}] .global f ; external symbol 'f' caller: push 40400000H ; 3.0f (32 bit float) ; 2.0 (64 bit float) push 40000000H ; low DWORD push 0H ; high DWORD push 1H ; 1 (32 bit integer) call f ; call 'f' add esp, 16 ; cleanup stack \end{lstlisting} \begin{comment} Due to the statically compiled nature of the language itself, the abstraction to the underlying hardware machine These languages make an abstraction to the machine in a way, where a function call is an atomic operation that has to be fully qualified at compilation time. This library follows the approach to abstract the construction of a function call and provides a small and clean implementation that is extendable by ports to compilers, operating-systems and processor architectures. The library solely uses a small kernel function to perform the actual call and does not require just-in-time code generation. General-purpose programming languages such as C\footnote{and derived programming languages such as C++ and Objective-C} are powerful statically compiled programming languages that allow to implement low-level tasks. They abstract the underlying hardware to a degree where one is allowed to write functions that implement algorithms. At the same time, this Although C is very powerful and a portable language to implement time-critical and performance greedy application - it is limited in the way it handles calls to functions. General-purpose programming languages such as C and C++ are limited in the way function calls are handled. These languages make an abstraction to the underlying hardware architecture, so that writing algorithms can be done in a portable way. While C is quite flexible in case of pointer arithmetics and I/O in main memory, the flexibility ends at the function call. In contrast to implementing algorithms, the function call in C is something that is black-box to the language. One can either fully bind and call a function at once or none at all. construct a half-baked function-call without providing C code that performs a particular desired function call in regard to arity, argument type list, return type and calling convention. The compiler requires exact information about the desired calling convention, arity, argument- and return types. \end{comment} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_overview.tex0000644000175000017500000003446012502366750023232 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007,2009 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \newpage \section{Overview} The \product{dyncall} library encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual \begin{center} \emph{bind argument parameters from left to right and then call} \end{center} interface allowing programmers to call C functions in a completely dynamic manner. In other words, instead of calling a function directly, the \product{dyncall} library provides a mechanism to push the function parameters manually and to issue the call afterwards.\\ Since the idea behind this concept is similar to call dispatching mechanisms of virtual machines, the object that can be dynamically loaded with arguments, and then used to actually invoke the call, is called CallVM. It is possible to change the calling convention used by the CallVM at run-time. Due to the fact that nearly every platform comes with one or more distinct calling conventions, the \product{dyncall} library project intends to be a portable and open-source approach to the variety of compiler-specific binary interfaces, platform specific subtleties, and so on\ldots\\ \\ The core of the library consists of dynamic implementations of different calling conventions written in assembler. Although the library aims to be highly portable, some assembler code needs to be written for nearly every platform/compiler/OS combination. Unfortunately, there are architectures we just don't have at home or work. If you want to see \product{dyncall} running on such a platform, feel free to send in code and patches, or even to donate hardware you don't need anymore. Check the {\bf supported platforms} section for an overview of the supported platforms and the different calling convention sections for details about the support. \\ \begin{comment} @@@ A typical binary library consists of symbolic names that map to variables and functions, the latter being pre-compiled for a specific calling convention and architecture. Given \product{dyncall} has been ported to that binary platform, it is possible to call such a function dynamically without writing glue code or prototypes or even knowing its C declaration - all that is needed is a pointer to it.\\ To avoid confusion, note that from the point of view of the library all parameters are handled the same way, even though the implementation might use other ways to pass parameters in order to suit specific calling conventions.\\ \end{comment} \subsection{Features} \begin{itemize} \item A portable and extendable function call interface for the C programming language. \item Ports to major platforms including Windows, Mac OS X, Linux, BSD derivates, iPhone and embedded devices and more, including lesser known and/or older platforms like Plan 9, Playstation Portable, Nintendo DS, etc.. \item Add-on language bindings to Python, R, Ruby, Go, Erlang, Java, Lua, sh, ... \item High-level state machine design using C to model calling convention parameter transfer. \item One assembly \emph{hybrid} call routine per calling convention. \item Formatted call, vararg function API. \item Comprehensive test suite. \end{itemize} \pagebreak \subsection{Showcase} \paragraph{Foreign function call in C} This section demonstrates how the foreign function call is issued without, and then with, the help of the \product{dyncall} library and scripting language bindings. \begin{lstlisting}[language=c,caption=Foreign function call in C] double call_as_sqrt(void* funptr, double x) { return ( ( double (*)(double) )funptr)(x); } \end{lstlisting} \paragraph{\product{Dyncall} C library example} The same operation can be broken down into atomic pieces (specify calling convention, binding arguments, invoking the call) using the \dc\ library. \begin{lstlisting}[language=c,caption=Dyncall C library example] #include double call_as_sqrt(void* funptr, double x) { double r; DCCallVM* vm = dcNewCallVM(4096); dcMode(vm, DC_CALL_C_DEFAULT); dcReset(vm); dcArgDouble(vm, x); r = dcCallDouble(vm, funptr); dcFree(vm); return r; } \end{lstlisting} As you can see, this is more code after all, but completely dynamic. And definitely less than generated glue-code for each function call, if used correctly. The following are examples from script bindings: \paragraph{Python example} \begin{lstlisting}[language=python,caption=Dyncall Python bindings example] import pydc def call_as_sqrt(funptr,x): return pydc.call(funptr,"d)d", x) \end{lstlisting} \paragraph{R example} \begin{lstlisting}[language=R,caption=Dyncall R bindings example,escapeinside={TEX}{XET}] % escapeinside is a workaround for issues with '<' in lstlisting+tex4ht library(rdyncall) call.as.sqrt TEX\textlessXET- function(funptr,x) .dyncall(funptr,"d)d", x) \end{lstlisting} \pagebreak \subsection{Supported platforms/architectures} The feature matrix below gives a brief overview of the currently supported platforms. Different colors are used, where a green cell indicates a supported platform, yellow a platform that might work (but is untested) and red a platform that is currently unsupported. Gray cells are combinations that don't exist at the time of writing, or that are not taken into account.\\ Light green cells mark complete feature support, as in dyncall and dyncallback. Dark green means basic support but lacking features (e.g. dyncall support, but not dyncallback). Please note that a green cell (even a light-green one) doesn't imply that all existing calling conventions/features/build tools are supported for that platform (but the most important). For detailed info about a platform's support consult the calling convention appendix. \begin{table}[h] \begin{tabular}{r|*{15}{c}} & & & & & & & & & & & & & & & \\ & \ninetyb {\bf Alpha}\ninetye & \ninetyb {\bf ARM}\ninetye & \ninetyb {\bf ARM64}\ninetye & \ninetyb {\bf MIPS (32)}\ninetye & \ninetyb {\bf MIPS (64)}\ninetye & \ninetyb {\bf SuperH}\ninetye & \ninetyb {\bf PowerPC (32)}\ninetye & \ninetyb {\bf PowerPC (64)}\ninetye & \ninetyb {\bf m68k}\ninetye & \ninetyb {\bf m88k}\ninetye & \ninetyb {\bf x86}\ninetye & \ninetyb {\bf x64}\ninetye & \ninetyb {\bf Itanium}\ninetye & \ninetyb {\bf SPARC}\ninetye & \ninetyb {\bf SPARC64}\ninetye \\ \hline {\bf Windows family} & \marknotx & \markunkn & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknimp & \marknotx & \marknotx \\ {\bf Linux} & \marknimp & \markcmpl & \markcmpl & \markunkn & \markunkn & \marknotx & \markcmpl & \markcmpl & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknotx & \markimpl & \markimpl \\ {\bf Mac OS X/iOS/Darwin} & \marknotx & \markcmpl & \markcmpl & \marknotx & \marknotx & \marknotx & \markcmpl & \markunkn & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknotx & \marknotx & \marknotx \\ {\bf FreeBSD} & \marknimp & \markcmpl & \marknotx & \markunkn & \markunkn & \marknimp & \markimpl & \markunkn & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknimp & \markunkn & \markunkn \\ {\bf NetBSD} & \marknimp & \markcmpl & \marknotx & \markimpl & \markunkn & \marknimp & \markimpl & \markunkn & \marknimp & \marknimp & \markcmpl & \markcmpl & \marknimp & \markimpl & \markunkn \\ {\bf OpenBSD} & \marknimp & \markunkn & \marknotx & \markunkn & \markimpl & \marknimp & \markunkn & \markunkn & \marknimp & \marknimp & \markcmpl & \markcmpl & \marknimp & \markimpl & \markimpl \\ {\bf DragonFlyBSD} & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknotx & \marknotx & \marknotx \\ {\bf Solaris} & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \markcmpl & \markcmpl & \marknotx & \markimpl & \markimpl \\ {\bf Plan 9} & \marknimp & \marknimp & \marknotx & \marknimp & \marknotx & \marknotx & \marknimp & \marknotx & \marknotx & \marknotx & \markcmpl & \marknimp & \marknotx & \marknimp & \marknotx \\ {\bf Haiku/BeOS} & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \markcmpl & \marknotx & \marknotx & \marknotx & \marknotx \\ {\bf Minix} & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \markcmpl & \marknotx & \marknotx & \marknotx & \marknotx \\ {\bf Playstation Portable} & \marknotx & \marknotx & \marknotx & \markimpl & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx \\ {\bf Nintendo DS} & \marknotx & \markcmpl & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx & \marknotx \\ \end{tabular} \caption{Supported platforms} \end{table} MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_tex4ht.cfg0000644000175000017500000000245212466674236022551 0ustar jnthnjnthn\Preamble{xhtml,index=2,2,next,pic-tabular,charset="utf-8",p-width,pic-align} \Configure{VERSION}{} \Configure{VERSION}{} \Configure{DOCTYPE}{\HCode{\Hnewline}} \Configure{HTML}{\HCode{\Hnewline}}{\HCode{\Hnewline}} \Configure{@HEAD}{} \Configure{@HEAD}{\HCode{\Hnewline}} \Configure{@HEAD}{\HCode{\Hnewline}} \Configure{@HEAD}{\HCode{\Hnewline}} \Configure{@HEAD}{\HCode{\Hnewline}} \Configure{@HEAD}{\HCode{\Hnewline}} % should this really rely on online content (dyncall's .css) even for an offline build? @@@ \Configure{@HEAD}{\HCode{\Hnewline}} \Configure{@HEAD}{\HCode{dyncall.org - dyncall Manual\Hnewline}} %\DeclareMathSizes{12}{11}{7}{6} %\DeclareMathSizes{10}{9}{5}{4} %\DeclareMathSizes{11}{10}{6}{5} \begin{document} \EndPreamble MoarVM-2015.11/3rdparty/dyncall/doc/manual/manual_title.tex0000644000175000017500000000441712466674236022516 0ustar jnthnjnthn%////////////////////////////////////////////////////////////////////////////// % % Copyright (c) 2007-2014 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any % purpose with or without fee is hereby granted, provided that the above % copyright notice and this permission notice appear in all copies. % % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. % %////////////////////////////////////////////////////////////////////////////// \begin{titlepage} \begin{center}% {\Huge {\bf \product{dyncall}}}\\% \ \\% Version 0.8\\% \ \\% \ \\% \ \\% Daniel {\sc Adler} \small{\tt{(dadler@uni-goettingen.de)}}\\% Tassilo {\sc Philipp} \small{\tt{(tphilipp@potion-studios.com)}}% \end{center} % \begingroup% \setlength{\unitlength}{1mm}% \begin{picture}(0,0)(-38,110)% \includegraphics[scale=0.35]{dyncall_logo}% \end{picture}% \endgroup% %\begingroup %\setlength{\unitlength}{1bp}% %\begin{picture}(250,400)% %\end{picture}% %\endgroup % % %\setlength{\unitlength}{1mm} %\begin{picture}(60, 40) %\put(42,31){\circle*{1}} %\put(42,30){\circle{2}} %\put(40,31){\circle{4}} %\put(40,30){\circle{8}} %\put(41,31){\circle{16}} %\put(41,30){\circle{32}} %\put(19,31){\circle{1}} %\put(20,30){\circle*{2}} %\put(21,31){\circle{3}} %\put(19,30){\circle{4}} %\put(21,31){\circle{5}} %\put(20,30){\circle{6}} %\put(19,31){\circle{7}} %\put(20,30){\circle{8}} %\put(19,31){\circle{9}} %\put(20,30){\circle{10}} %\put(21,31){\circle{11}} %\put(20,30){\circle{12}} %\put(21,31){\circle{13}} %\put(20,30){\circle{14}} %\put(20,12){\circle*{3}} %\put(23,10){\circle*{2}} %\put(27, 9){\circle*{3}} %\put(32,10){\circle*{4}} %\put(37,12){\circle*{5}} %\end{picture} % \begin{center} \today \end{center} \end{titlepage} MoarVM-2015.11/3rdparty/dyncall/dynMakefile0000644000175000017500000000031012456307246017424 0ustar jnthnjnthnall: ./buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/dyncall/CMakeLists.txt0000644000175000017500000000302012456307246021440 0ustar jnthnjnthn# Package: dyncall # File: dyncall/CMakeLists.txt # Description: DynCall library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # if(MSVC) if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(ASM_SRC dyncall_call_x86_generic_masm.asm) else() set(ASM_SRC dyncall_call_x64_generic_masm.asm) endif() else() set(ASM_SRC dyncall_call.S) set_source_files_properties(${ASM_SRC} PROPERTIES LANGUAGE "C") endif() add_library(dyncall_s STATIC ${ASM_SRC} dyncall_vector.c dyncall_struct.c dyncall_api.c dyncall_callvm.c dyncall_callvm_base.c dyncall_callf.c ) install(TARGETS dyncall_s ARCHIVE DESTINATION lib ) install(FILES dyncall_macros.h dyncall_config.h dyncall_types.h dyncall.h dyncall_signature.h dyncall_value.h dyncall_callf.h DESTINATION include ) MoarVM-2015.11/3rdparty/dyncall/dyncall/DynCallConfig.cmake0000644000175000017500000000013212456307246022357 0ustar jnthnjnthnset(DYNCALL_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dyncall) set(DYNCALL_LIBRARIES dyncall_s) MoarVM-2015.11/3rdparty/dyncall/dyncall/Makefile.M0000644000175000017500000000050612456307246020541 0ustar jnthnjnthn#include "../buildsys/dynmake/Makefile.base.M" all: _L(dyncall_s) _L(dyncall_s): _O(dyncall_vector) _O(dyncall_api) _O(dyncall_callvm) _O(dyncall_callvm_base) _O(dyncall_call) _O(dyncall_callf) _O(dyncall_struct) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dyncall_s) MoarVM-2015.11/3rdparty/dyncall/dyncall/Makefile.embedded0000644000175000017500000000162712456307246022103 0ustar jnthnjnthnMAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} TARGET = libdyncall_s.a OBJS = dyncall_vector.o dyncall_api.o dyncall_callvm.o dyncall_callvm_base.o dyncall_call.o dyncall_callf.o dyncall_struct.o HEADERS = dyncall_macros.h dyncall_config.h dyncall_types.h dyncall.h dyncall_signature.h dyncall_value.h dyncall_callf.h dyncall_alloc.h all: ${TARGET} libdyncall_s.a: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib mkdir -p ${DESTDIR}${PREFIX}/man/man3 gzip -c dyncall.3 >${DESTDIR}${PREFIX}/man/man3/dyncall.3.gz .PHONY: all clean install osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="libtool" ARFLAGS="-static -o" ${MAKE_CMD} all MoarVM-2015.11/3rdparty/dyncall/dyncall/Makefile.generic0000644000175000017500000000115212456307246021757 0ustar jnthnjnthnLIBNAME = dyncall OBJS = dyncall_vector.o dyncall_api.o dyncall_callvm.o dyncall_callvm_base.o dyncall_call.o dyncall_callf.o dyncall_struct.o HEADERS = ${VPATH}/dyncall_macros.h ${VPATH}/dyncall_config.h ${VPATH}/dyncall_types.h ${VPATH}/dyncall.h ${VPATH}/dyncall_signature.h ${VPATH}/dyncall_value.h ${VPATH}/dyncall_callf.h ${VPATH}/dyncall_alloc.h LIB = lib${LIBNAME}_s.a .PHONY: all clean install all: ${LIB} ${LIB}: ${OBJS} ${AR} ${ARFLAGS} ${LIB} ${OBJS} clean: rm -f ${OBJS} ${LIB} install: all mkdir -p ${PREFIX}/lib mkdir -p ${PREFIX}/include cp ${LIB} ${PREFIX}/lib cp ${HEADERS} ${PREFIX}/include MoarVM-2015.11/3rdparty/dyncall/dyncall/Nmakefile0000644000175000017500000000377412456307246020536 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdyncall_s.lib #libdyncall.lib libdyncall.dll OBJS = dyncall_call_$(BUILD_ARCH)_generic_masm.obj dyncall_vector.obj dyncall_vector.obj dyncall_callvm.obj dyncall_callvm_base.obj dyncall_api.obj dyncall_callf.obj dyncall_struct.obj libdyncall_s.lib: $(OBJS) echo Creating library $@ ... $(AR) $(ARFLAGS) /OUT:"$@" $(OBJS) > nul libdyncall.dll libdyncall.lib: $(OBJS) echo Creating shared/import library $@ ... $(LD) /DLL $(LDFLAGS) $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdyncall_s.a OBJS = dyncall_call.o dyncall_vector.o dyncall_vector.o dyncall_callvm.o dyncall_callvm_base.o dyncall_api.o dyncall_callf.o libdyncall_s.a: $(OBJS) echo Creating library $@ ... $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/dyncall/README-Developer.txt0000644000175000017500000000216412456307246022331 0ustar jnthnjnthnBuild with GCC Tool-Chain: One assembly front-end *.S source file for all supported architectures: Usage: gcc -c dyncall_call.S -o dyncall_call.o Advantages: - works fine with universal binary builds (fat binaries), e.g.: gcc -arch i386 -arch ppc -arch x86_64 -c dyncall_call.S -o dyncall_call.o Details: Simplified assembly file compilation via using a gigantic C Preprocessor switch include. source file "dyncall_call.S" selects the appropriate GAS/Apple assembly file "dyncall_call__.[sS]". archs so far: arm32_thumb .s arm32_arm .s mips .s ppc32 .s x64 .s x86 .S [ uses C macros ] asmtools: gas - standard GNU assembler apple - apple's assembler (based on GNU but is significantly different in syntax) masm - Microsoft assembler x86 and x64 nasm - Netwide assembler for x86 and x64 NOTE: .S is used for preprocessing assembly files using gcc .s is used directly with as advantages: - one way to build the kernel: gcc -c dyncall_call.S -o dyncall_call.o - we can build now universal binaries MoarVM-2015.11/3rdparty/dyncall/dyncall/README.txt0000644000175000017500000000215412456307246020405 0ustar jnthnjnthnLibrary Design Overview: 1. Call Kernel 2. Utilities (memory and static sized vectors) 3. Call State Machine 4. Application Programming Interface 5. extension: high-level formatted C API (ellipsis style) 1. Call Kernel Assembly Implementation: gcc front-end: dyncall_call.S uses the C preprocessor will include the apropriate assembly source architecture/tool specific sources: dyncall_call__.[s|asm] 2. Utilities (memory and static sized vectors) 2.1 Memory Management C Interface: dyncall_alloc.h 2.2 Static-sized Vector C Interface: dyncall_vector.h C Implementation: dyncall_vector.c 3. Call State Machine C Implementation: Top-level: dynall_callvm.c Sub-levels: dyncall_callvm_.c 4. Application Programming Interface C Header: Top-level: dyncall.h Sub-level headers: dyncall_macros.h dyncall_config.h dyncall_types.h C Implementation: dyncall_api.c 5. Extension: High-level C API (ellipsis style) C Header: Top-level: dyncall_callf.h Sub-level headers: dyncall_value.h dyncall_signature.h C Implementation: dyncall_callf.c MoarVM-2015.11/3rdparty/dyncall/dyncall/TODO0000644000175000017500000000104612456307246017376 0ustar jnthnjnthn- implement structure passing for all calling conventinos and platforms - make sure that struct support for ellipsis calls are not forgotten (copy everything by value) - merge arm32_thumb_{gas/apple} and include thumb support for portasm - check dyncall_call_x64_traditional_cpp.S / try-sync with win64 masm - remove dyncall_call_x86_apple.s - x64 port cleanup: all x64 calling conventions on all platforms - remove dyncall_call_x86_masm.asm dyncall_call_x64_masm.asm - x64 verification: return values are passed via RAX and RDX, and XMM0 and XMM1. MoarVM-2015.11/3rdparty/dyncall/dyncall/dynMakefile0000644000175000017500000000031612456307246021060 0ustar jnthnjnthnall: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall.30000644000175000017500000001461712466674236020437 0ustar jnthnjnthn.\" Copyright (c) 2007-2013 Daniel Adler , .\" Tassilo Philipp .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .Dd $Mdocdate$ .Dt dyncall 3 .Os .Sh NAME .Nm dyncall .Nd encapsulation of architecture-, OS- and compiler-specific function call semantics .Sh SYNOPSIS .In dyncall.h .Ft DCCallVM * .Fn dcNewCallVM "DCsize size" .Ft void .Fn dcFree "DCCallVM * vm" .Ft void .Fn dcMode "DCCallVM * vm" "DCint mode" .Ft void .Fn dcReset "DCCallVM * vm" .Ft void .Fn dcArgBool "DCCallVM * vm" "DCbool arg" .Ft void .Fn dcArgChar "DCCallVM * vm" "DCchar arg" .Ft void .Fn dcArgShort "DCCallVM * vm" "DCshort arg" .Ft void .Fn dcArgInt "DCCallVM * vm" "DCint arg" .Ft void .Fn dcArgLong "DCCallVM * vm" "DClong arg" .Ft void .Fn dcArgLongLong "DCCallVM * vm" "DClonglong arg" .Ft void .Fn dcArgFloat "DCCallVM * vm" "DCfloat arg" .Ft void .Fn dcArgDouble "DCCallVM * vm" "DCdouble arg" .Ft void .Fn dcArgPointer "DCCallVM * vm" "DCpointer arg" .Ft DCvoid .Fn dcCallVoid "DCCallVM * vm" "DCpointer funcptr" .Ft DCbool .Fn dcCallBool "DCCallVM * vm" "DCpointer funcptr" .Ft DCchar .Fn dcCallChar "DCCallVM * vm" "DCpointer funcptr" .Ft DCshort .Fn dcCallShort "DCCallVM * vm" "DCpointer funcptr" .Ft DCint .Fn dcCallInt "DCCallVM * vm" "DCpointer funcptr" .Ft DClong .Fn dcCallLong "DCCallVM * vm" "DCpointer funcptr" .Ft DClonglong .Fn dcCallLongLong "DCCallVM * vm" "DCpointer funcptr" .Ft DCfloat .Fn dcCallFloat "DCCallVM * vm" "DCpointer funcptr" .Ft DCdouble .Fn dcCallDouble "DCCallVM * vm" "DCpointer funcptr" .Ft DCpointer .Fn dcCallPointer "DCCallVM * vm" "DCpointer funcptr" .Ft void .Fn dcArgF "DCCallVM * vm" "const DCsigchar * signature" "..." .Ft void .Fn dcVArgF "DCCallVM * vm" "const DCsigchar * signature" "va_list args" .Ft void .Fn dcCallF "DCCallVM * vm" "DCValue * result" "DCpointer funcptr" "const DCsigchar * signature" "..." .Ft void .Fn dcVCallF "DCCallVM * vm" "DCValue * result" "DCpointer funcptr" "const DCsigchar * signature" "va_list args" .Sh DESCRIPTION The .Nm library encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual "bind argument parameters from left to right and then call" interface allowing programmers to call C functions in a completely dynamic manner. .Pp In other words, instead of calling a function directly, the .Nm library provides a mechanism to push the function parameters manually and to issue the call afterwards. .Pp Since the idea behind this concept is similar to call dispatching mechanisms of virtual machines, the object that can be dynamically loaded with arguments, and then used to actually invoke the call, is called CallVM. It is possible to change the calling convention used by the CallVM at run-time. Due to the fact that nearly every platform comes with one or more distinct calling conventions, the .Nm library project intends to be a portable and open-source approach to the variety of compiler-specific binary interfaces, platform specific subtleties, and so on... .Pp .Fn dcNewCallVM creates a new CallVM object, where .Ar size specifies the max size of the internal stack that will be allocated and used to bind the arguments to. Use .Fn dcFree to destroy the CallVM object. .Pp .Fn dcMode sets the calling convention to use. See dyncall.h for a list of available modes. Note that some mode/platform combinations don't make any sense (e.g. using a PowerPC calling convention on a MIPS platform) and are silently ignored. .Pp .Fn dcReset resets the internal stack of arguments and prepares it for the selected mode. This function should be called after setting the call mode (using dcMode), but prior to binding arguments to the CallVM. Use it also when reusing a CallVM, as arguments don't get flushed automatically after a function call invocation. .Pp .Fn dcArgBool , .Fn dcArgChar , .Fn dcArgShort , .Fn dcArgInt , .Fn dcArgLong , .Fn dcArgLongLong , .Fn dcArgFloat , .Fn dcArgDouble and .Fn dcArgPointer are used to bind arguments of the named types to the CallVM object. Arguments should be bound in .Em "left to right" order regarding the C function prototype. .Pp .Fn dcCallVoid , .Fn dcCallBool , .Fn dcCallChar , .Fn dcCallShort , .Fn dcCallInt , .Fn dcCallLong , .Fn dcCallLongLong , .Fn dcCallFloat , .Fn dcCallDouble and .Fn dcCallPointer call the function with the bound arguments and returning the named type, where .Ar funcptr is a pointer to the function to call. After the invocation of the function call, the argument values are still bound to the CallVM and a second call using the same arguments can be issued. Call .Fn reset to clear the internal argument stack. .Pp .Fn dcArgF , .Fn dcVArgF , .Fn dcCallF and .Fn dcVCallF can be used to bind arguments in a printf-style call, using a signature string encoding the argument types and return type. The former 2 only bind the arguments to the .Ar vm object (and ignore return types specified in the signature), whereas the latter two issue a call to the given function pointer, afterwards. The return value will be stored in .Ar result . For information about the signature format, refer to the .Nm manual in PDF format. .Sh EXAMPLE Let's say, we want to make a call to the function: .Bd -literal -offset indent double sqrt(double x); .Ed .Pp Using the .Nm library, this function would be called as follows: .Bd -literal -offset indent double r; DCCallVM* vm = dcNewCallVM(4096); dcMode(vm, DC_CALL_C_DEFAULT); dcReset(vm); dcArgDouble(vm, 4.2373); r = dcCallDouble(vm, (DCpointer)&sqrt); dcFree(vm); .Ed .Sh SEE ALSO .Xr dyncallback 3 , .Xr dynload 3 and the .Nm manual (available in PDF format) for a way more detailed documentation of this library. .Sh AUTHORS .An "Daniel Adler" Aq dadler@uni-goettingen.de .An "Tassilo Philipp" Aq tphilipp@potion-studios.com MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall.h0000644000175000017500000001256312466674236020522 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall.h Description: public header for library dyncall License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall C API REVISION 2015/01/16 added SYS_PPC32 system call 2007/12/11 initial */ #ifndef DYNCALL_H #define DYNCALL_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCCallVM_ DCCallVM; typedef struct DCstruct_ DCstruct; /* Supported Calling Convention Modes */ #define DC_CALL_C_DEFAULT 0 #define DC_CALL_C_ELLIPSIS 100 #define DC_CALL_C_ELLIPSIS_VARARGS 101 #define DC_CALL_C_X86_CDECL 1 #define DC_CALL_C_X86_WIN32_STD 2 #define DC_CALL_C_X86_WIN32_FAST_MS 3 #define DC_CALL_C_X86_WIN32_FAST_GNU 4 #define DC_CALL_C_X86_WIN32_THIS_MS 5 #define DC_CALL_C_X86_WIN32_THIS_GNU 6 #define DC_CALL_C_X64_WIN64 7 #define DC_CALL_C_X64_SYSV 8 #define DC_CALL_C_PPC32_DARWIN 9 #define DC_CALL_C_PPC32_OSX DC_CALL_C_PPC32_DARWIN /* alias */ #define DC_CALL_C_ARM_ARM_EABI 10 #define DC_CALL_C_ARM_THUMB_EABI 11 #define DC_CALL_C_ARM_ARMHF 30 #define DC_CALL_C_MIPS32_EABI 12 #define DC_CALL_C_MIPS32_PSPSDK DC_CALL_C_MIPS32_EABI /* alias - deprecated. */ #define DC_CALL_C_PPC32_SYSV 13 #define DC_CALL_C_PPC32_LINUX DC_CALL_C_PPC32_SYSV /* alias */ #define DC_CALL_C_ARM_ARM 14 #define DC_CALL_C_ARM_THUMB 15 #define DC_CALL_C_MIPS32_O32 16 #define DC_CALL_C_MIPS64_N32 17 #define DC_CALL_C_MIPS64_N64 18 #define DC_CALL_C_X86_PLAN9 19 #define DC_CALL_C_SPARC32 20 #define DC_CALL_C_SPARC64 21 #define DC_CALL_C_ARM64 22 #define DC_CALL_C_PPC64 23 #define DC_CALL_C_PPC64_LINUX DC_CALL_C_PPC64 /* alias */ #define DC_CALL_SYS_DEFAULT 200 #define DC_CALL_SYS_X86_INT80H_LINUX 201 #define DC_CALL_SYS_X86_INT80H_BSD 202 #define DC_CALL_SYS_PPC32 210 /* Error codes. */ #define DC_ERROR_NONE 0 #define DC_ERROR_UNSUPPORTED_MODE -1 DC_API DCCallVM* dcNewCallVM (DCsize size); DC_API void dcFree (DCCallVM* vm); DC_API void dcReset (DCCallVM* vm); DC_API void dcMode (DCCallVM* vm, DCint mode); DC_API void dcArgBool (DCCallVM* vm, DCbool value); DC_API void dcArgChar (DCCallVM* vm, DCchar value); DC_API void dcArgShort (DCCallVM* vm, DCshort value); DC_API void dcArgInt (DCCallVM* vm, DCint value); DC_API void dcArgLong (DCCallVM* vm, DClong value); DC_API void dcArgLongLong (DCCallVM* vm, DClonglong value); DC_API void dcArgFloat (DCCallVM* vm, DCfloat value); DC_API void dcArgDouble (DCCallVM* vm, DCdouble value); DC_API void dcArgPointer (DCCallVM* vm, DCpointer value); DC_API void dcArgStruct (DCCallVM* vm, DCstruct* s, DCpointer value); DC_API void dcCallVoid (DCCallVM* vm, DCpointer funcptr); DC_API DCbool dcCallBool (DCCallVM* vm, DCpointer funcptr); DC_API DCchar dcCallChar (DCCallVM* vm, DCpointer funcptr); DC_API DCshort dcCallShort (DCCallVM* vm, DCpointer funcptr); DC_API DCint dcCallInt (DCCallVM* vm, DCpointer funcptr); DC_API DClong dcCallLong (DCCallVM* vm, DCpointer funcptr); DC_API DClonglong dcCallLongLong (DCCallVM* vm, DCpointer funcptr); DC_API DCfloat dcCallFloat (DCCallVM* vm, DCpointer funcptr); DC_API DCdouble dcCallDouble (DCCallVM* vm, DCpointer funcptr); DC_API DCpointer dcCallPointer (DCCallVM* vm, DCpointer funcptr); DC_API void dcCallStruct (DCCallVM* vm, DCpointer funcptr, DCstruct* s, DCpointer returnValue); DC_API DCint dcGetError (DCCallVM* vm); #define DEFAULT_ALIGNMENT 0 DC_API DCstruct* dcNewStruct (DCsize fieldCount, DCint alignment); DC_API void dcStructField (DCstruct* s, DCint type, DCint alignment, DCsize arrayLength); DC_API void dcSubStruct (DCstruct* s, DCsize fieldCount, DCint alignment, DCsize arrayLength); /* Each dcNewStruct or dcSubStruct call must be paired with a dcCloseStruct. */ DC_API void dcCloseStruct (DCstruct* s); DC_API DCsize dcStructSize (DCstruct* s); DC_API DCsize dcStructAlignment(DCstruct* s); DC_API void dcFreeStruct (DCstruct* s); DC_API DCstruct* dcDefineStruct (const char* signature); #ifdef __cplusplus } #endif #endif /* DYNCALL_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_alloc.h0000644000175000017500000000230212456307246021653 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_alloc.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ALLOC_H #define DYNCALL_ALLOC_H #ifndef dcAllocMem #include #define dcAllocMem malloc #endif #ifndef dcFreeMem #define dcFreeMem free #endif #endif /* DYNCALL_ALLOC_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_api.c0000644000175000017500000000724712456307246021342 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_api.c Description: C interface to call vm License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "dyncall_callvm.h" #include "dyncall_alloc.h" void dcReset(DCCallVM* vm) { vm->mVTpointer->reset(vm); } void dcFree(DCCallVM* vm) { vm->mVTpointer->free(vm); } void dcMode(DCCallVM* vm,DCint mode) { vm->mVTpointer->mode(vm,mode); /* dcReset(vm); -- in order to support ellipsis calls, we need to allow * a dcMode(callvm, DC_CALL_C_ELLIPSIS_VARARGS) */ } void dcArgBool(DCCallVM* vm,DCbool x) { vm->mVTpointer->argBool(vm, x); } void dcArgChar(DCCallVM* vm,DCchar x) { vm->mVTpointer->argChar(vm, x); } void dcArgShort(DCCallVM* vm,DCshort x) { vm->mVTpointer->argShort(vm, x); } void dcArgInt(DCCallVM* vm,DCint x) { vm->mVTpointer->argInt(vm, x); } void dcArgLong(DCCallVM* vm,DClong x) { vm->mVTpointer->argLong(vm, x); } void dcArgLongLong(DCCallVM* vm, DClonglong x) { vm->mVTpointer->argLongLong(vm, x); } void dcArgFloat(DCCallVM* vm, DCfloat x) { vm->mVTpointer->argFloat(vm, x); } void dcArgDouble(DCCallVM* vm, DCdouble x) { vm->mVTpointer->argDouble(vm, x); } void dcArgPointer(DCCallVM* vm, DCpointer x) { vm->mVTpointer->argPointer(vm, x); } void dcArgStruct(DCCallVM* vm, DCstruct* s, DCpointer x) { vm->mVTpointer->argStruct(vm, s, x); } void dcCallVoid(DCCallVM* vm, DCpointer funcptr) { vm->mVTpointer->callVoid(vm, funcptr); } DCchar dcCallChar(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callChar(vm, funcptr); } DCbool dcCallBool(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callBool(vm, funcptr); } DCshort dcCallShort(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callShort(vm, funcptr); } DCint dcCallInt(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callInt(vm, funcptr); } DClong dcCallLong(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callLong(vm, funcptr); } DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callLongLong(vm, funcptr); } DCfloat dcCallFloat(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callFloat(vm, funcptr); } DCdouble dcCallDouble(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callDouble(vm, funcptr); } DCpointer dcCallPointer(DCCallVM* vm, DCpointer funcptr) { return vm->mVTpointer->callPointer(vm, funcptr); } void dcCallStruct(DCCallVM* vm, DCpointer funcptr, DCstruct* s, DCpointer x) { vm->mVTpointer->callStruct(vm, funcptr, s, x); } DCint dcGetError(DCCallVM *vm) { return vm->mError; } const char* dcGetErrorString(int mode) { switch(mode) { case DC_ERROR_NONE: return "none"; case DC_ERROR_UNSUPPORTED_MODE: return "unsupported mode"; default: return "(unknown mode id)"; } } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call.S0000644000175000017500000000476412466674236021474 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call.S Description: assembly call kernel, auto-selected by gcc / Plan9 build system License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_macros.h" /* Plan9 */ #if defined(DC__OS_Plan9) # if defined(DC__Arch_Intel_x86) # include "dyncall_call_x86_8a.s" # else # error Unsupported Architecture on Plan9. # endif #elif defined(DC__C_MSVC) # if defined(DC__OS_Win32) # include "dyncall_call_x86_generic_masm.asm" # elif defined(DC__OS_Win64) # include "dyncall_call_x64_generic_masm.asm" # endif #else # if defined(DC__Arch_Intel_x86) # include "dyncall_call_x86.S" # elif defined(DC__Arch_AMD64) # include "dyncall_call_x64-att.S" # elif defined(DC__Arch_ARM_ARM) # if defined(DC__ABI_ARM_HF) # include "dyncall_call_arm32_arm_armhf.S" # else # include "dyncall_call_arm32_arm.S" # endif # elif defined(DC__Arch_ARM_THUMB) # if defined(DC__OS_Darwin) # include "dyncall_call_arm32_thumb_apple.s" # else # if defined(DC__ABI_ARM_HF) # include "dyncall_call_arm32_thumb_armhf.S" # else # include "dyncall_call_arm32_thumb_gas.s" # endif # endif # elif defined(DC__Arch_ARM64) # include "dyncall_call_arm64.S" # elif defined(DC__Arch_PPC32) # include "dyncall_call_ppc32.S" # elif defined(DC__Arch_PPC64) # include "dyncall_call_ppc64.S" # elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # include "dyncall_call_mips_gas.S" # elif defined(DC__Arch_Sparcv9) # include "dyncall_call_sparc_v9.S" # elif defined(DC__Arch_Sparc) # include "dyncall_call_sparc.S" # else # error Unsupported Architecture. # endif #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.S0000644000175000017500000000605412456307246023322 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm.S Description: Call Kernel for ARM 32-bit ARM Architecture License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-arm.S" /* ============================================================================ DynCall Call Kernel for ARM 32-bit ARM Architecture ---------------------------------------------------------------------------- C Interface: dcCall_arm32_arm(DCpointer target, DCpointer argv, DCsize size); This Call Kernel works across multiple OS. It has been tested on Nintendo DS, Linux and Darwin(iOS). */ .text .code 32 /* ARM mode */ .align 4 GLOBAL_C(dcCall_arm32_arm) ENTRY_C(dcCall_arm32_arm) /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ mov r12, r13 /* Stack ptr (r13) -> temporary (r12). */ stmdb r13!, {r4-r12, r14} /* Permanent registers and stack pointer (now in r12), etc... -> save area on stack (except counter). */ mov r11, r12 /* Set frame ptr. */ /* Call. */ mov r4, r0 /* r4 = 'fptr' (1st argument is passed in r0). */ mov r5, r1 /* r5 = 'args' (2nd argument is passed in r1). */ mov r6, r2 /* r6 = 'size' (3rd argument is passed in r2). */ ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ subs r6, r6, #16 /* Size of remaining arguments. */ ble call /* Jump to call if no more arguments. */ sub r13, r13, r6 /* Set stack pointer to top of stack. */ and r9, r6, #7 /* Align stack on 8 byte boundaries. */ sub r13, r13, r9 mov r8, r13 /* Temp. destination pointer. */ mov r9, #0 /* Init byte counter. */ pushArgs: ldrb r7, [r5, r9] /* Load a byte into r7. */ strb r7, [r8, r9] /* Push byte onto stack. */ add r9, r9, #1 /* Increment byte counter. */ cmp r9, r6 bne pushArgs call: /* 'blx %r4' workaround for ARMv4t: */ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx r4 /* Call (ARM/THUMB), available for ARMv4t. */ /* Epilog. */ ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (ignore temporary (r12), restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.h0000644000175000017500000000266212456307246023350 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit ARM32 family interface (ARM mode) REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALL_ARM32_ARM_H #define DYNCALL_CALL_ARM32_ARM_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** arm32 arm mode calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_arm32_arm(DCpointer target, DCpointer stackdata, DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.S0000755000175000017500000000642212456307246024501 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm_armhf.S Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float License: Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-arm.S" /* ============================================================================ DynCall Call Kernel for ARM 32-bit ARM Architecture Hard-Float ---------------------------------------------------------------------------- C Interface: dcCall_arm32_armhf (DCpointer target, DCpointer argv, DCsize size, DCfloat* regdata); This Call Kernel was tested on Raspberry Pi/Raspbian (Debian) */ .text .code 32 /* ARM mode */ .arch armv6 .fpu vfp GLOBAL_C(dcCall_arm32_armhf) ENTRY_C(dcCall_arm32_armhf) /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ mov r12 , r13 /* Stack ptr (r13) -> temporary (r12). */ stmdb r13!, {r4-r5, r11, r12, r14} /* Permanent registers and stack pointer (now in r12), etc... -> save area on stack (except counter). */ mov r11 , r12 /* Set frame ptr. */ mov r4 , r0 /* r4 = 'fptr' (1st argument is passed in r0). */ mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */ /* Load 16 single-precision registers (= 8 double-precision registers). */ flds s0, [r3,#0 ] flds s1, [r3,#4 ] flds s2, [r3,#8 ] flds s3, [r3,#12] flds s4, [r3,#16] flds s5, [r3,#20] flds s6, [r3,#24] flds s7, [r3,#28] flds s8, [r3,#32] flds s9, [r3,#36] flds s10, [r3,#40] flds s11, [r3,#44] flds s12, [r3,#48] flds s13, [r3,#52] flds s14, [r3,#56] flds s15, [r3,#60] sub r2 , r2 , #16 cmp r2, #0 ble armhf_call sub r13, r13, r2 and r13, r13, #-8 /* align 8-byte. */ mov r3, #0 /* Init byte counter. */ add r1 , r1 , #16 armhf_pushArgs: ldr r0, [r1, +r3] /* Load word into r0. */ str r0, [r13, +r3] /* Push word onto stack. */ add r3, r3, #4 /* Increment byte counter. */ cmp r2, r3 bne armhf_pushArgs armhf_call: ldmia r5, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t: */ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx r4 /* Call (ARM/THUMB), available for ARMv4t. */ /* Epilog. */ ldmdb r11, {r4-r5, r11, r13, r15} /* Restore permanent registers (ignore temporary (r12), restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.h0000755000175000017500000000241712456307246024526 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_arm_armhf.h Description: License: Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_ARM32_ARM_ARMHF_H #define DYNCALL_CALL_ARM32_ARM_ARMHF_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_arm32_armhf(DCpointer target, DCpointer stackdata, DCsize size, DCfloat* p_s16); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb.h0000644000175000017500000000327612456307246023712 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit ARM32 family interface (THUMB mode) REVISION 2008/08/12 initial */ #ifndef DYNCALL_CALL_ARM32_THUMB_H #define DYNCALL_CALL_ARM32_THUMB_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** arm32 thumb mode calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_arm32_thumb(DCpointer target, DCpointer stackdata, DCsize size); /* Internally used to avoid compiler overwriting r0 and r1 in call stub */ DClong dcCall_arm32_thumb_word (DCpointer target, DCpointer stackdata, DCsize size); DClonglong dcCall_arm32_thumb_dword(DCpointer target, DCpointer stackdata, DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM32_THUMB_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_apple.s0000644000175000017500000000540412456307246025101 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb_apple.s Description: ARM Thumb call kernel implementation for apple assembler. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .thumb .code 16 .globl _dcCall_arm32_thumb /* Main dyncall call. */ .thumb_func _dcCall_arm32_thumb: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ push {r4-r7, r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ mov r7, r13 /* Set frame ptr. */ /* Call. */ mov r4, r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ /* Disable 'thumb' address forcing... */ /* mov r0, #1 */ /* Assure that LSB is set to 1 (THUMB call). - Not Required and not useful for interworking calls */ /* orr r4, r0 */ mov r5, r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ mov r6, r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ cmp r6, #16 /* Jump to call if no more than 4 arguments. */ ble call sub r6, #16 /* Size of remaining arguments. */ mov r0, r13 /* Set stack pointer to top of stack. */ sub r0, r0, r6 lsr r0, #3 /* Align stack on 8 byte boundaries. */ lsl r0, #3 mov r13, r0 add r1, #16 /* Let r1 point to remaining arguments. */ mov r2, #0 /* Init byte counter to 0. */ .thumb_func pushArgs: ldrb r3, [r1, r2] /* Load a byte into r3. */ strb r3, [r0, r2] /* Push byte onto stack. */ add r2, r2, #1 /* Increment byte counter. */ cmp r2, r6 bne pushArgs .thumb_func call: ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t in THUMB: */ blx r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ /* Epilog. */ mov r13, r7 /* Reset stack ptr. */ pop {r4-r7, r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S0000755000175000017500000000713412456307246025042 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb_armhf.S Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float in Thumb code License: Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-arm.S" /* ============================================================================ DynCall Call Kernel for ARM 32-bit ARM Architecture Hard-Float ---------------------------------------------------------------------------- C Interface: dcCall_arm32_armhf (DCpointer target, DCpointer argv, DCsize size, DCfloat* regdata); This Call Kernel was tested on Raspberry Pi/Raspbian (Debian) */ .text .thumb #ifndef __thumb2__ .code 16 #endif // .arch armv6 // .fpu vfp GLOBAL_C(dcCall_arm32_armhf) .thumb_func ENTRY_C(dcCall_arm32_armhf) /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ // mov r12 , r13 /* Stack ptr (r13) -> temporary (r12). */ // stmdb r13!, {r4-r5, r11, r12, r14} /* Permanent registers and stack pointer (now in r12), etc... -> save area on stack (except counter). */ //mov r11 , r12 /* Set frame ptr. */ push {r4-r7, r14} mov r7 , r13 mov r4 , r0 /* r4 = 'fptr' (1st argument is passed in r0). */ mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */ /* Load 16 single-precision registers (= 8 double-precision registers). */ flds s0, [r3,#0 ] flds s1, [r3,#4 ] flds s2, [r3,#8 ] flds s3, [r3,#12] flds s4, [r3,#16] flds s5, [r3,#20] flds s6, [r3,#24] flds s7, [r3,#28] flds s8, [r3,#32] flds s9, [r3,#36] flds s10, [r3,#40] flds s11, [r3,#44] flds s12, [r3,#48] flds s13, [r3,#52] flds s14, [r3,#56] flds s15, [r3,#60] sub r2 , #16 cmp r2, #0 ble armhf_call // sub r13, r13, r2 // and r13, #-8 /* align 8-byte. */ mov r6, r13 sub r6 , r2 // mov r3 , #8 // neg r3 , r3 // and r6 , r3 lsr r6 , #3 lsl r6 , #3 mov r13, r6 mov r3, #0 /* Init byte counter. */ add r1 , #16 armhf_pushArgs: ldr r0, [r1, +r3] /* Load word into r0. */ // str r0, [r13, +r3] /* Push word onto stack. */ str r0, [r6, +r3] /* Push word onto stack. */ add r3, #4 /* Increment byte counter. */ cmp r2, r3 bne armhf_pushArgs armhf_call: ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t: */ // mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ mov r6, r15 add r6, #5 mov r14, r6 bx r4 /* Call (ARM/THUMB), available for ARMv4t. */ /* Epilog. */ // ldmdb r11, {r4-r5, r11, r13, r15} /* Restore permanent registers (ignore temporary (r12), restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ mov r13, r7 pop {r4-r7, r15} MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s0000644000175000017500000000643512456307246024557 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm32_thumb_gas.s Description: ARM Thumb call kernel implementation for GNU assembler. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text #if !defined(__thumb2__) .code 16 /* THUMB mode */ #endif .globl dcCall_arm32_thumb /* Main dyncall call. */ .thumb_func dcCall_arm32_thumb: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ push {%r4-%r7, %r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ mov %r7, %r13 /* Set frame ptr. */ /* Call. */ mov %r4, %r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ /* Disable 'thumb' address forcing... */ /* mov %r0, #1 */ /* Assure that LSB is set to 1 (THUMB call). - Not Required and not useful for interworking calls */ /* orr %r4, %r0 */ mov %r5, %r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ mov %r6, %r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ cmp %r6, #16 /* Jump to call if no more than 4 arguments. */ ble call sub %r6, #16 /* Size of remaining arguments. */ mov %r0, %r13 /* Set stack pointer to top of stack. */ sub %r0, %r0, %r6 lsr %r0, #3 /* Align stack on 8 byte boundaries. */ lsl %r0, #3 mov %r13, %r0 add %r1, #16 /* Let r1 point to remaining arguments. */ mov %r2, #0 /* Init byte counter to 0. */ .thumb_func pushArgs: ldrb %r3, [%r1, %r2] /* Load a byte into r3. */ strb %r3, [%r0, %r2] /* Push byte onto stack. */ add %r2, %r2, #1 /* Increment byte counter. */ cmp %r2, %r6 bne pushArgs .thumb_func call: ldmia %r5!, {%r0-%r3} /* Load first 4 arguments for new call into r0-r3. */ /* 'blx %r4' workaround for ARMv4t in THUMB: */ mov %r6, %r15 /* Load PC+2 instructions from here */ add %r6, #5 /* Increment by 2 instructions (Address of 'Epilog') and set bit 0 (THUMB) */ mov %r14, %r6 /* Store in link register. */ bx %r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ /* Epilog. */ mov %r13, %r7 /* Reset stack ptr. */ pop {%r4-%r7, %r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ /* Internally used to avoid compiler overwriting r0 and r1 in call stub */ .globl dcCall_arm32_thumb_word .thumb_func dcCall_arm32_thumb_word: b dcCall_arm32_thumb .globl dcCall_arm32_thumb_dword .thumb_func dcCall_arm32_thumb_dword: b dcCall_arm32_thumb MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm64.S0000755000175000017500000001063312466674236022500 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm64.S Description: Call Kernel for ARM 64-bit Architecture (aka ARM64, AArch64) Authors: DA License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-arm.S" /* ============================================================================ DynCall Call Kernel for ARM 64-bit ARM Architecture ---------------------------------------------------------------------------- C Interface: dcCall_arm64 (DCpointer target, DCpointer data, DCsize size, DCfloat* regdata); This Call Kernel was tested on Debian/qemu-debootstrap arm64 jessie. */ .text // // DynCall Back-End arm64 // // Supported ABIs: // - 'ARM 64-bit AArch64 PCS' (@dadler: work in progress) // // Useful Links: // - http://lxr.free-electrons.com/source/arch/arm64/kernel/stacktrace.c GLOBAL_C(dcCall_arm64) ENTRY_C(dcCall_arm64) // input: // x0: target (address of target) // x1: data (address of stack copy data) // x2: size (number of 'pair' 16-byte units) // x3: regdata (address of register data) // prolog: stp x29, x30, [sp, #-16]! // allocate frame mov x29, sp // load 64-bit floating-point registers ldr d0, [x3,#0 ] ldr d1, [x3,#8 ] ldr d2, [x3,#16] ldr d3, [x3,#24] ldr d4, [x3,#32] ldr d5, [x3,#40] ldr d6, [x3,#48] ldr d7, [x3,#56] // copy to stack sub sp, sp, x2 // create call-frame eor x4, x4, x4 // x4: cnt = 0 mov x5, x1 // x5: read pointer = data mov x6, sp // x6: write pointer = sp .next: cmp x4, x2 b.ge .done ldp x7, x9, [x5], #16 // get pair from data stp x7, x9, [x6], #16 // put to stack add x4, x4, 16 // advance 16 bytes b .next .done: // rescue temp int registers mov x9 , x0 // x9: target add x10, x3, 64 // x3: integer reg buffer // load 64-bit integer registers ( 8 x 64-bit ) // load register set ldr x0, [x10, #0] ldr x1, [x10, #8] ldr x2, [x10, #16] ldr x3, [x10, #24] ldr x4, [x10, #32] ldr x5, [x10, #40] ldr x6, [x10, #48] ldr x7, [x10, #56] // call target: blr x9 // epilog: mov sp, x29 ldp x29, x30, [sp], 16 ret #if 0 // epilog: add sp, x28, 0 // remove call record ret // -- OLD: str x27, [sp, 16] // use 1 local var (size) ldr q0, [x3,#0 ] ldr q1, [x3,#8 ] ldr q2, [x3,#16] ldr q3, [x3,#24] ldr q4, [x3,#32] ldr q5, [x3,#40] ldr q6, [x3,#48] ldr q7, [x3,#56] ldr d8, [x3,#32] ldr d9, [x3,#36] ldr d10, [x3,#40] ldr d11, [x3,#44] ldr d12, [x3,#48] ldr d13, [x3,#52] ldr d14, [x3,#56] ldr d15, [x3,#60] // load float ( 16 x 32-bit ) ldr s0, [x3,#0 ] ldr s1, [x3,#4 ] ldr s2, [x3,#8 ] ldr s3, [x3,#12] ldr s4, [x3,#16] ldr s5, [x3,#20] ldr s6, [x3,#24] ldr s7, [x3,#28] ldr s8, [x3,#32] ldr s9, [x3,#36] ldr s10, [x3,#40] ldr s11, [x3,#44] ldr s12, [x3,#48] ldr s13, [x3,#52] ldr s14, [x3,#56] ldr s15, [x3,#60] // call blr x0 // epilog ldp x29, x30, [sp], 32 ret // stack copy sub sp, sp, x2 // decrement stack by size (x2) eor x3, x3, x3 // x3 = counter, set to zero // .next: ldr x4, [x1, x3] // x4 = 64-bit stack data str x4, [sp, x3] // store to stack add x3, x3, #8 cmp x3, x2 blt .next // rescue int registers mov x9 , x0 // x9 = code ptr mov x10, x2 // load int ( 8 x 64-bit ) ldr x0, [sp, #0] ldr x1, [sp, #8] ldr x2, [sp, #16] ldr x3, [sp, #24] ldr x4, [sp, #32] ldr x5, [sp, #40] ldr x6, [sp, #48] ldr x7, [sp, #56] // call blr x9 // epilog ldp x29, x30, [sp], 32 ret #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_arm64.h0000755000175000017500000000240512466674236022523 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_arm64.h Description: ARM 64-bit License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_ARM64_DEBIAN_H #define DYNCALL_CALL_ARM64_DEBIAN_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_arm64(DCpointer target, DCpointer data, DCsize size, DCpointer regdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_ARM64_DEBIAN_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips.h0000644000175000017500000000273612456307246022537 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips.h Description: mips call-kernel C interfaces. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall MIPS call kernel C interface for all ABIs REVISION 2010/06/03 initial */ #ifndef DYNCALL_CALL_MIPS_H #define DYNCALL_CALL_MIPS_H /* supported abi-specific call kernels: */ #include "dyncall_call_mips_o32.h" #include "dyncall_call_mips_eabi.h" #include "dyncall_call_mips_n64.h" #include "dyncall_call_mips_n32.h" typedef void (*dcCall_mips_common) (DCpointer target, DCpointer regdata_abispecific, DCsize stacksize, DCpointer stackdata); #endif /* DYNCALL_CALL_MIPS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_eabi.h0000644000175000017500000000320512456307246023507 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_eabi.h Description: mips "eabi" abi call kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_EABI_H #define DYNCALL_CALL_MIPS_EABI_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* Call-kernel register data: Details: Two register content buffers for the corresponding register types integer and float are filled from CallVM code and then later at call-kernel loaded into the registers. */ struct DCRegData_mips_eabi { DCint mIntData[8]; DCfloat mSingleData[8]; }; /* Call kernel. */ void dcCall_mips_eabi(DCpointer target, struct DCRegData_mips_eabi* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_EABI_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_eabi_gas.s0000644000175000017500000000447512456307246024366 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_eabi_gas.s Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /*////////////////////////////////////////////////////////////////////// dyncall_call_mips_eabi_gas.s MIPS 32bit family of processors. 2008-01-03 //////////////////////////////////////////////////////////////////////*/ .text .globl dcCall_mips_eabi dcCall_mips_eabi: /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ addiu $sp,$sp,-16 sw $16,8($sp) sw $31,4($sp) sw $fp,0($sp) move $fp,$sp move $2, $0 add $2, 8 neg $2 and $sp, $2 add $6, 7 and $6, $2 move $12,$4 /* target function */ move $13,$5 /* register data */ move $16,$6 /* stack size */ sub $sp,$sp,$16 /* allocate stack frame */ /* copy stack data */ .next: beq $6,$0, .skip nop addiu $6,$6, -4 lw $2, 0($7) sw $2, 0($sp) addiu $7,$7, 4 addiu $sp,$sp, 4 j .next nop .skip: sub $sp,$sp,$16 /* load integer parameter registers */ lw $4 , 0($13) lw $5 , 4($13) lw $6 , 8($13) lw $7 ,12($13) lw $8 ,16($13) lw $9 ,20($13) lw $10,24($13) lw $11,28($13) /* load single-precise floating pointer parameter registers */ lwc1 $f12, 32($13) lwc1 $f13, 36($13) lwc1 $f14, 40($13) lwc1 $f15, 44($13) lwc1 $f16, 48($13) lwc1 $f17, 52($13) lwc1 $f18, 56($13) lwc1 $f19, 60($13) jal $12 nop /* add $sp,$sp,$16 */ move $sp,$fp lw $16,8($sp) lw $31,4($sp) lw $fp,0($sp) addiu $sp,$sp,16 j $31 nop MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_gas.S0000644000175000017500000000242312456307246023335 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_gas.S Description: auto-select (via gnu c preprocessor) mips abi call kernel License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(DC__ABI_MIPS_O32) #include "dyncall_call_mips_o32_gas.s" #elif defined(DC__ABI_MIPS_N64) #include "dyncall_call_mips_n64_gas.s" #elif defined(DC__ABI_MIPS_N32) #include "dyncall_call_mips_n32_gas.s" #else #include "dyncall_call_mips_eabi_gas.s" #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_n32.h0000644000175000017500000000407612456307246023220 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n32.h Description: mips "n32" ABI call-kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_N32_H #define DYNCALL_CALL_MIPS_N32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* two register-files for integer (promoted to 64-bit) and float (not promoted!) are used. arguments are transfered in a free slot on the corresponding register file. the other register-file will be skipped by one. float arguments are either loaded from single or double - a auto-conversion into double and then loaded as double precision turned out to fail for several tests. therefore a union for storage of float or double is used instead. a bitmask (mUseDouble) records which type is used and will be interpreted in the call-kernel. */ struct DCRegData_mips_n32 { DClonglong mIntData[8]; union { DCfloat f; DCdouble d; } mFloatData[8]; DClonglong mUseDouble; /* bitmask: lower 8 bits specifies to use float or double from union array. */ }; void dcCall_mips_n32(DCpointer target, struct DCRegData_mips_n32* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_N64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_n32_gas.s0000644000175000017500000000736512456307246024071 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n32_gas.s Description: mips "n32" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .section .mdebug.abiN32 .previous .abicalls .text .align 2 .globl dcCall_mips_n32 .ent dcCall_mips_n32 dcCall_mips_n32: /* Stack-frame prolog */ .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */ .mask 0xd0000000,-8 .fmask 0x00000000,0 subu $sp,$sp,64 sd $31,48($sp) /* save return address register (ra) */ sd $30,40($sp) /* save frame pointer register (fp) */ sd $28,32($sp) /* save global pointer register (gp) */ move $fp,$sp /* arguments: */ /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ /* allocate argument stack space */ subu $sp, $sp, $6 /* copy stack data */ /* n64 abi call assumptions: - stack data is 16-byte aligned. - no extra-storage for arguments passed via registers. */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip nop daddiu $6, $6, -8 ld $2, 0($12) sd $2, 0($14) daddiu $12,$12, 8 daddiu $14,$14, 8 b .next .skip: move $25, $4 /* load registers */ /* locals: */ /* $13 = register data */ /* $14 = useDouble flags */ move $13, $5 ld $14, 128($13) /* load integer parameter registers */ ld $4 , 0($13) ld $5 , 8($13) ld $6 ,16($13) ld $7 ,24($13) ld $8 ,32($13) ld $9 ,40($13) ld $10,48($13) ld $11,56($13) /* load float-or-double floating pointer parameter registers a 64-bit bitmask given at byte offset 128 of regdata indicates if loading a float (bit cleared) or double (bit set), starting at bit position 0 in bitmask. */ .t0: and $15, $14, 1 bgtz $15, .d0 .f0: l.s $f12, 64($13) j .t1 .d0: l.d $f12, 64($13) .t1: and $15, $14, 2 bgtz $15, .d1 .f1: l.s $f13, 72($13) j .t2 .d1: l.d $f13, 72($13) .t2: and $15, $14, 4 bgtz $15, .d2 .f2: l.s $f14, 80($13) j .t3 .d2: l.d $f14, 80($13) .t3: and $15, $14, 8 bgtz $15, .d3 .f3: l.s $f15, 88($13) j .t4 .d3: l.d $f15, 88($13) .t4: and $15, $14, 16 bgtz $15, .d4 .f4: l.s $f16, 96($13) j .t5 .d4: l.d $f16, 96($13) .t5: and $15, $14, 32 bgtz $15, .d5 .f5: l.s $f17,104($13) j .t6 .d5: l.d $f17,104($13) .t6: and $15, $14, 64 bgtz $15, .d6 .f6: l.s $f18,112($13) j .t7 .d6: l.d $f18,112($13) .t7: and $15, $14, 128 bgtz $15, .d7 .f7: l.s $f19,120($13) j .fregend .d7: l.d $f19,120($13) .fregend: /* jump-and-link to register $25 */ jal $31, $25 /* no nop according to gcc assembly output */ /* Stack-frame epilog */ move $sp,$fp ld $31,48($sp) /* restore ra register */ ld $fp,40($sp) /* restore fp register */ ld $28,32($sp) /* restore gp register */ daddu $sp,$sp,64 j $31 .end dcCall_mips_n64 .size dcCall_mips_n64, .-dcCall_mips_n64 MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_n64.h0000644000175000017500000000407612456307246023225 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n64.h Description: mips "n64" ABI call-kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_N64_H #define DYNCALL_CALL_MIPS_N64_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* two register-files for integer (promoted to 64-bit) and float (not promoted!) are used. arguments are transfered in a free slot on the corresponding register file. the other register-file will be skipped by one. float arguments are either loaded from single or double - a auto-conversion into double and then loaded as double precision turned out to fail for several tests. therefore a union for storage of float or double is used instead. a bitmask (mUseDouble) records which type is used and will be interpreted in the call-kernel. */ struct DCRegData_mips_n64 { DClonglong mIntData[8]; union { DCfloat f; DCdouble d; } mFloatData[8]; DClonglong mUseDouble; /* bitmask: lower 8 bits specifies to use float or double from union array. */ }; void dcCall_mips_n64(DCpointer target, struct DCRegData_mips_n64* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_N64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_n64_gas.s0000644000175000017500000000737612456307246024100 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_n64_gas.s Description: mips "n64" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .section .mdebug.abi64 .previous .abicalls .text .align 2 .globl dcCall_mips_n64 .ent dcCall_mips_n64 dcCall_mips_n64: /* Stack-frame prolog */ # .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */ # .mask 0xd0000000,-8 # .fmask 0x00000000,0 dsubu $sp,$sp,64 sd $31,48($sp) /* save return address register (ra) */ sd $30,40($sp) /* save frame pointer register (fp) */ sd $28,32($sp) /* save global pointer register (gp) */ move $fp,$sp /* arguments: */ /* $4 target function */ /* $5 register data */ /* $6 stack size */ /* $7 stack data */ /* allocate argument stack space */ dsubu $sp, $sp, $6 /* copy stack data */ /* n64 abi call assumptions: - stack data is 16-byte aligned. - no extra-storage for arguments passed via registers. */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip # nop daddiu $6, $6, -8 ld $2, 0($12) sd $2, 0($14) daddiu $12,$12, 8 daddiu $14,$14, 8 b .next .skip: move $25, $4 /* load registers */ /* locals: */ /* $13 = register data */ /* $14 = useDouble flags */ move $13, $5 ld $14, 128($13) /* load integer parameter registers */ ld $4 , 0($13) ld $5 , 8($13) ld $6 ,16($13) ld $7 ,24($13) ld $8 ,32($13) ld $9 ,40($13) ld $10,48($13) ld $11,56($13) /* load float-or-double floating pointer parameter registers a 64-bit bitmask given at byte offset 128 of regdata indicates if loading a float (bit cleared) or double (bit set), starting at bit position 0 in bitmask. */ .t0: and $15, $14, 1 bgtz $15, .d0 .f0: l.s $f12, 64($13) j .t1 .d0: l.d $f12, 64($13) .t1: and $15, $14, 2 bgtz $15, .d1 .f1: l.s $f13, 72($13) j .t2 .d1: l.d $f13, 72($13) .t2: and $15, $14, 4 bgtz $15, .d2 .f2: l.s $f14, 80($13) j .t3 .d2: l.d $f14, 80($13) .t3: and $15, $14, 8 bgtz $15, .d3 .f3: l.s $f15, 88($13) j .t4 .d3: l.d $f15, 88($13) .t4: and $15, $14, 16 bgtz $15, .d4 .f4: l.s $f16, 96($13) j .t5 .d4: l.d $f16, 96($13) .t5: and $15, $14, 32 bgtz $15, .d5 .f5: l.s $f17,104($13) j .t6 .d5: l.d $f17,104($13) .t6: and $15, $14, 64 bgtz $15, .d6 .f6: l.s $f18,112($13) j .t7 .d6: l.d $f18,112($13) .t7: and $15, $14, 128 bgtz $15, .d7 .f7: l.s $f19,120($13) j .fregend .d7: l.d $f19,120($13) .fregend: /* jump-and-link to register $25 */ jal $31, $25 /* no nop according to gcc assembly output */ /* Stack-frame epilog */ move $sp,$fp ld $ra,48($sp) /* restore ra register */ ld $fp,40($sp) /* restore fp register */ ld $gp,32($sp) /* restore gp register */ daddu $sp,$sp,64 j $ra .end dcCall_mips_n64 .size dcCall_mips_n64, .-dcCall_mips_n64 MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_o32.h0000644000175000017500000000350212456307246023212 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_o32.h Description: mips "o32" abi call kernel C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_MIPS_O32_H #define DYNCALL_CALL_MIPS_O32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* Call-kernel register data: Details: The structure holds the argument data for transfering float/double arguments via registers as well. The call-kernel implements loads two doubles, which involves four 32-bit floating pointer registers. Float arguments map as following: float argument 0 is at floats[1] and float argument 1 is at floats[3] of DCRegData_mips_o32 union. */ typedef struct DCRegData_mips_o32_ { union { double d; float f[2]; } u[2]; } DCRegData_mips_o32; /* Call kernel. */ void dcCall_mips_o32(DCpointer target, DCRegData_mips_o32* regdata, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_MIPS_O32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_mips_o32_gas.s0000644000175000017500000000507712456307246024070 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_mips_o32_gas.s Description: mips "o32" abi call kernel implementation in GNU Assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* $4 target function */ /* $5 register data */ /* $6 stack size (min 16-byte aligned to 8-bytes already) */ /* $7 stack data */ .section .mdebug.abi32 .previous .abicalls .text .align 2 .globl dcCall_mips_o32 .ent dcCall_mips_o32 .type dcCall_mips_o32, @function dcCall_mips_o32: .frame $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */ .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-8 sw $31,4($sp) /* save link register */ sw $fp,0($sp) /* save frame pointer */ nop move $fp,$sp /* frame pointer = sp */ sub $sp, $sp, $6 /* increment stack */ /* copy stack data */ /* $12 source pointer (parameter stack data) */ /* $14 destination (stack pointer) */ /* $6 byte count */ move $12, $7 move $14, $sp .next: beq $6, $0, .skip nop lw $2, 0($12) nop sw $2, 0($14) addiu $12,$12, 4 addiu $14,$14, 4 addiu $6, $6, -4 j .next nop .skip: /* load two double-precision floating-point argument registers ($f12, $f14) */ l.d $f12, 0($5) l.d $f14, 8($5) /* prepare call */ move $12, $7 /* $12 stack data */ move $25, $4 /* $25 target function */ /* load first four integer arguments ($4-$7) */ lw $4, 0($12) lw $5, 4($12) lw $6, 8($12) lw $7,12($12) /* call target function */ jalr $25 nop move $sp,$fp /* restore stack pointer */ nop lw $31,4($sp) /* restore return address */ lw $fp,0($sp) /* restore frame pointer */ addiu $sp,$sp,8 /* end stack frame */ j $31 /* return */ nop .set macro .set reorder .end dcCall_mips_o32 .ident "handwritten" MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_ppc32.S0000644000175000017500000001566712466674236022507 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc32.S Description: Call Kernel for PowerPC 32-bit Architecture License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" /* Call Kernel Implementations for PowerPC. Supported Calling Conventions: sysv, darwin, syscall */ .machine ppc .text /* ============================================================================ DynCall Call Kernels for PPC32 Architecture ------------------------------------------------------------------------- C Interface: struct DCRegData { int i[8]; double d[13]; }; dcCall_ppc32_XXX(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata); Where XXX is one of the following Calling Conventions: darwin, sysv ChangeLog: 2015-01-15: Added support for system calls. 2011-04-03: Using portasm. 2009-01-09: Added Support for System V ABI. 2007-11-28: Initial Support for Darwin. */ /*--------------------------------------------------------------------------- Call Kernel for ppc32 Darwin Input: r3 : target address ptr r4 : register data ptr (8 x GPR 32 bytes, 13 x FPR 64 bytes) r5 : stack data size r6 : stack data ptr Details: - Stack frames are always aligned on 16 byte - The GPR3 .. GPR10 are loaded - The FPR1 .. FPR13 are loaded - No support for Vector Parameters so far. - Parameter Area (min. 32 Bytes) - Linkage Area (24 Bytes) */ .align 2 GLOBAL_C(dcCall_ppc32_darwin) ENTRY_C(dcCall_ppc32_darwin) mflr r0 /* r0 = return address */ stw r0,8(r1) /* store return address in caller link-area */ /* compute aligned stack-size */ /* add link area and align to 16 byte border */ addi r0,r5,24+15 /* r0 = stacksize + link area */ rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */ /* r0 = r0 and -15 */ neg r2,r0 /* r2 = -stacksize */ stwux r1,r1,r2 /* r1 = r1 - stacksize */ /* copy stack data */ subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */ addi r7,r1,20 /* r7 = 4 bytes before target stack parameter-block */ srwi r5,r5,2 /* r5 = size in words */ cmpi cr0,r5,0 /* if stacksize != 0 .. */ beq cr0,.osx_done mtctr r5 /* copy loop */ .osx_next: lwzu r0, 4(r6) stwu r0, 4(r7) bdnz .osx_next .osx_done: mr r12, r3 /* r12 = target function */ mtctr r12 /* control register = target function */ mr r2, r4 /* r2 = reg data */ /* load 8 integer registers */ lwz r3 , 0(r2) lwz r4 , 4(r2) lwz r5 , 8(r2) lwz r6 ,12(r2) lwz r7 ,16(r2) lwz r8 ,20(r2) lwz r9 ,24(r2) lwz r10,28(r2) /* load 13 float registers */ lfd f1 ,32(r2) lfd f2 ,40(r2) lfd f3 ,48(r2) lfd f4 ,56(r2) lfd f5 ,64(r2) lfd f6 ,72(r2) lfd f7 ,80(r2) lfd f8 ,88(r2) lfd f9 ,96(r2) lfd f10,104(r2) lfd f11,112(r2) lfd f12,120(r2) lfd f13,128(r2) /* branch */ bctrl /* epilog */ lwz r1, 0(r1) /* restore stack */ lwz r0, 8(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr /* return */ /* ---------------------------------------------------------------------------- Call Kernel for ppc32 System Input: r3 : target address ptr r4 : register data ptr (8 x GPR 32 bytes, 8 x FPR 64 bytes) r5 : stack data size r6 : stack data ptr Details: - Stack frames are always aligned on 16 byte - Reserve GPR2 (System register) - The GPR3 .. GPR10 are loaded - The FPR1 .. FPR8 are loaded - No support for Vector Parameters so far. Frame structure: on entry, parent frame layout: offset 4: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) after frame initialization: stack size = ( (8+15) + stacksize ) & -(16) ... locals and register spills 8: parameter list area 4: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) */ .align 2 GLOBAL_C(dcCall_ppc32_sysv) ENTRY_C(dcCall_ppc32_sysv) mflr r0 /* r0 = return address */ stw r0,4(r1) /* store r0 to link-area */ /* compute aligned stack-size */ /* add link area (+8) and align to 16 byte (+15) */ /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address) */ addi r0,r5,8+15 /* r0 = r5 + 8 + 15 */ rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */ neg r0,r0 /* r0 = -r0 */ stwux r1,r1,r0 /* store r1 and decrement */ /* copy stack data */ subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */ /* 4 bytes before target stack parameter-block */ addi r7,r1,4 /* r7 = r1 + 8 offset - 4 displacement */ srwi r5,r5,2 /* r5 = size in words */ cmpi cr0,r5,0 /* if stacksize != 0 .. */ beq cr0,.sysv_done mtctr r5 /* copy loop */ .sysv_next: lwzu r0, 4(r6) stwu r0, 4(r7) bdnz .sysv_next .sysv_done: /* this call support using ctr branch register */ mr r12, r3 /* r12 = target function */ mtctr r12 /* control register = r12 */ mr r11, r4 /* r11 = reg data */ /* load 8 integer registers */ lwz r3 , 0(r11) lwz r4 , 4(r11) lwz r5 , 8(r11) lwz r6 ,12(r11) lwz r7 ,16(r11) lwz r8 ,20(r11) lwz r9 ,24(r11) lwz r10,28(r11) /* load 8 float registers */ lfd f1 ,32(r11) lfd f2 ,40(r11) lfd f3 ,48(r11) lfd f4 ,56(r11) lfd f5 ,64(r11) lfd f6 ,72(r11) lfd f7 ,80(r11) lfd f8 ,88(r11) creqv 6,6,6 /* used for ellipsis calls */ bctrl /* branch with this call support */ /* epilog */ lwz r1, 0(r1) /* restore stack */ lwz r0, 4(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr /* return */ .align 2 GLOBAL_C(dcCall_ppc32_syscall) ENTRY_C(dcCall_ppc32_syscall) mflr r0 /* r0 = return address */ stw r0,4(r1) /* store r0 to link-area */ li r0, -8 stwux r1,r1,r0 /* store r1 and decrement */ mr r0, r3 /* r0 = syscall number ( passed as 'target function' ) */ mr r11, r4 /* r11 = reg data */ lwz r3 , 0(r11) lwz r4 , 4(r11) lwz r5 , 8(r11) lwz r6 ,12(r11) lwz r7 ,16(r11) sc lwz r1, 0(r1) /* restore stack */ lwz r0, 4(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_ppc32.h0000644000175000017500000000317012466674236022516 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc32.h Description: License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_PPC32_H #define DYNCALL_PPC32_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif struct DCRegData_ppc32_ { DCint mIntData[8]; DCdouble mFloatData[13]; /* 13 for darwin, 8 for sysv */ }; /* ** PowerPC 32-bit calling convention call ** ** - hybrid return-type call (bool ... pointer) ** */ /* Darwin ABI */ void dcCall_ppc32_darwin (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata); /* System V (Linux) ABI */ void dcCall_ppc32_sysv (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_PPC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_ppc64.S0000644000175000017500000001166412466674236022505 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc64.S Description: Call Kernel for PowerPC 64-bit Architecture License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" /* Call Kernel Implementations for PowerPC64. */ /* ============================================================================ DynCall Call Kernels for PPC64 Architecture ------------------------------------------------------------------------- C Interface: struct DCRegData { int i[8]; double d[13]; }; dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata); ChangeLog: 2014-08-07: Initial Support */ /* ---------------------------------------------------------------------------- Call Kernel for ppc64 Input: r3 : target address ptr r4 : register data ptr (8 x GPR 64 bytes, 13 x FPR 64 bytes) r5 : stack data size r6 : stack data ptr Details: - Stack frames are always aligned on 16 byte - Reserve GPR2 (System register) - The GPR3 .. GPR10 are loaded - The FPR1 .. FPR8 are loaded - No support for Vector Parameters so far. - Parameter Area (min. v1:64 Bytes v2:0 Byte) - Frame Header Area (v1:48 Bytes v2:32 Bytes) Frame structure: on entry, parent frame layout: offset 16: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) after frame initialization: v1: stack size = ( (48+64+8+15) + stacksize ) & -(16) v2: stack size = ( (32+0+8+15) + stacksize ) & -(16) ... locals and register spills 48 or 32: parameter list area 16: LR save word (Callee stores LR in parent frame) 0: parent stack frame (back-chain) */ /* Constants */ #if DC__ABI_PPC64_ELF_V != 2 STACK_MIN = 120 /* v1 */ TOC_SAVE = 40 PARAM_SAVE = 48 #else STACK_MIN = 40 /* v2 */ TOC_SAVE = 24 PARAM_SAVE = 32 #endif .text .global dcCall_ppc64 .type dcCall_ppc64, @function #if DC__ABI_PPC64_ELF_V != 2 .section .opd, "aw" .align 3 #endif dcCall_ppc64: #if DC__ABI_PPC64_ELF_V != 2 .quad .dcCall_ppc64, .TOC.@tocbase, 0 .previous .global .dcCall_ppc64 .dcCall_ppc64: #else 0: addis r2, r12,.TOC.-0b@ha addi r2, r2,.TOC.-0b@l .localentry dcCall_ppc64,.-dcCall_ppc64 #endif mflr r0 /* r0 = return address */ std r0,16(r1) /* store r0 to link-area */ std r31,-8(r1) /* compute aligned stack-size */ /* add link area and align to 16 byte (+15) */ /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address) */ addi r0,r5,STACK_MIN+15 /* r0 = r5 + STACK_MIN + 15 */ rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */ neg r0,r0 /* r0 = -r0 */ stdux r1,r1,r0 /* store r1 and decrement */ /* copy stack data */ subi r6,r6,8 /* r6 = 8 bytes before source stack ptr */ addi r7,r1,PARAM_SAVE-8 /* r7 = 8 bytes before target stack parameter-block */ srwi r5,r5,3 /* r5 = size in double words */ cmpi cr0,r5,0 /* if stacksize != 0 .. */ beq cr0,.copy_done mtctr r5 /* copy loop */ .copy_next: ldu r0, 8(r6) stdu r0, 8(r7) bdnz .copy_next .copy_done: /* this call support using ctr branch register */ mr r12, r3 /* r12 = target function */ std r2,TOC_SAVE(r1) #if DC__ABI_PPC64_ELF_V != 2 ld r2,8(r12) ld r0,0(r12) mtctr r0 #else mtctr r12 #endif mr r11, r4 /* r11 = reg data */ /* load 8 integer registers */ ld r3 , 0(r11) ld r4 , 8(r11) ld r5 ,16(r11) ld r6 ,24(r11) ld r7 ,32(r11) ld r8 ,40(r11) ld r9 ,48(r11) ld r10,56(r11) /* load 13 float registers */ lfd f1 , 64(r11) lfd f2 , 72(r11) lfd f3 , 80(r11) lfd f4 , 88(r11) lfd f5 , 96(r11) lfd f6 ,104(r11) lfd f7 ,112(r11) lfd f8 ,120(r11) lfd f9 ,128(r11) lfd f10,136(r11) lfd f11,144(r11) lfd f12,152(r11) lfd f13,160(r11) bctrl /* branch with this call support */ /* epilog */ ld r2,TOC_SAVE(r1) ld r1, 0(r1) /* restore stack */ ld r31,-8(r1) ld r0,16(r1) /* r0 = return address */ mtlr r0 /* setup link register */ blr /* return */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_ppc64.h0000644000175000017500000000255012466674236022524 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_ppc64.h Description: License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_PPC64_H #define DYNCALL_PPC64_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif struct DCRegData_ppc64_ { DClonglong mIntData[8]; DCdouble mFloatData[13]; }; /* ** PowerPC 64-bit calling convention call ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_ppc64(DCpointer target, struct DCRegData_ppc64_* ppc64data, DCsize stksize, DCpointer stkdata); #ifdef __cplusplus } #endif #endif /* DYNCALL_PPC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc.S0000644000175000017500000001243112456307246022643 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc.S Description: Call kernel for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* --------------------------------------------------------------------------- call kernel for sparc 32-bit ---------------------------- tested on linux/debian [gcc54.fsffrance.org - thanx to the farm!] new C Interface: void dcCall_sparc (DCCallVM* callvm, DCpointer target); %i0 %1 we need to do that, due to the special property of sparc, its 'register windows' that propagate input registers.. otherwise, we would have a 'void' return-value layer which results in failure to propagate back return values. instead of implementing 'dummy'-C return-values, we call directly. in sparc, this is simply a leaf-function layer using %o3. old C Interface: void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); %i0 , %i1 , %i2 Input: i0 callvm i1 target old Input: i0 target i1 size i2 data Description: We need to raise a dynamic stack frame. Therefore we need to compute the stack size in the context of the caller as a leaf note (using o3 in addition). Then we raise the frame. sparc: - big endian sparc V8: - integer/pointer: 32 32-bit integers. - float: 8 quad precision, 16 double precision, 32 single precision. sparc V9: - integer/pointer: 32 64-bit integers. plan9: - completely different scheme - similar to mips/plan9. - registers are named r0 .. r31 r1 stack pointer r2 static base register .. to be continued.. Stack Layout 32-Bit Model: - sp+92 seventh argument - sp+68 first argument - sp+64 - 16 registers save area (in/local). XX: should be 8 byte aligned (min stack frame size is 96). ... 92: on stack argument 6 88: input argument 5 spill ... 68: input argument 0 spill 64: struct/union pointer return value 0: 16 registers save area Stack Layout 64-Bit Model: XX: should be 16 byte aligned (min stack frame size is 172). 168: on stack argument 6 136: input argument 0 spill 128: struct/union poiner return value 0: 16 registers save area Register Usage: %sp or %o6: stack pointer, always 8 (or 16?)-byte aligned. %fp or %i6: frame pointer. %i0 and %o0: integer and pointer return values. %i7 and %o7: return address. (caller puts return address to %o7, callee uses %i7) %f0 and %f1: return value (float). %i0..%i5: input argument registers %o0..%o5: output argument registers %g0: always zero, writes to it have no effect. Register Mappings: r0-7 -> globals r8-15 -> outs r16-r23 -> locals r24-r31 -> ins */ #if defined __arch64__ #define REGSIZE 8 #error invalid arch #else #define REGSIZE 4 #endif #define ALIGN 16 CALLVM_size = 12 CALLVM_dataoff = 16 .global dcCall_sparc dcCall_sparc: /* Basic Prolog: supports up to 6 arguments. */ /* new C interface */ /* o0-1: callvm,target */ or %o0, %g0, %o3 /* %o3: callvm */ or %o1, %g0, %o0 /* %o0: target */ ld [%o3+CALLVM_size], %o1 /* %o1: size */ add %o3, CALLVM_dataoff, %o2 /* %o2: data */ /*o0-2:target,size,data*/ /*leaf functions: may use the first six output registers.*/ /*o3-5:free to use */ /* Compute a matiching stack size (approximate): o3 = align(92+o1,16) */ add %o1, (16+1+6)*REGSIZE+ALIGN-1, %o3 and %o3, -ALIGN, %o3 neg %o3 /* Prolog. */ save %sp, %o3, %sp /* min stack size (16+1+6)*sizeof(ptr)=92 paddded to 8-byte alignment => min frame size of 96 bytes. */ /* Load output registers. */ ld [%i2 ],%o0 ld [%i2+REGSIZE*1 ],%o1 ld [%i2+REGSIZE*2 ],%o2 ld [%i2+REGSIZE*3 ],%o3 ld [%i2+REGSIZE*4 ],%o4 ld [%i2+REGSIZE*5 ],%o5 /* Copy on stack? */ sub %i1, REGSIZE*6, %i1 /* i1 = decrement copy size by 6 regs (=6 regs x 4 bytes = 24 bytes total). */ cmp %i1, 0 ble .do_call nop /* Copy loop: */ add %i2, REGSIZE*6, %i2 /* i2 = address of 7th word of args buffer. */ or %g0, %g0, %l0 /* l0 = offset initialized to 0. */ add %sp, (16+1+6)*REGSIZE, %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */ .next: ld [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */ st %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */ add %l0, REGSIZE, %l0 /* Increment offset. */ sub %i1, REGSIZE, %i1 /* Decrement copy size. */ cmp %i1, 0 bgt .next nop .do_call: call %i0 /* Call target. */ nop or %o0, %g0, %i0 or %o1, %g0, %i1 jmpl %i7 + 8, %g0 restore MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc.h0000644000175000017500000000220212456307246022663 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc.h Description: License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_SPARC_H #define DYNCALL_CALL_SPARC_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_SPARC_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc64.S0000644000175000017500000002027212456307246023017 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc64.S Description: Call kernel for sparc64 v9 ABI. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* --------------------------------------------------------------------------- call kernel for sparc64 v9 abi tested on sparc64/linux/debian [gcc54.fsffrance.org - thanx to the farm!] new C Interface: void dcCall_sparc (DCCallVM* callvm, DCpointer target); %i0 %1 see dyncall_call_sparc.S for details. old C Interface: void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); %i0 , %i1 , %i2 Input: i0 target i1 size i2 data */ #define REGSIZE 8 #define BIAS 2047 #define ALIGN 16 #define IREGS 6 #define FREGS 16 #define SREGS 16 #define IBASE 0 #define FBASE (IREGS*8) #define SHEAD ((16+6)*8) #define DHEAD ((IREGS+FREGS)*8)+SREGS*4 CALLVM_singleUseFlags = 24 CALLVM_size = 40 CALLVM_dataoff = 48 .global dcCall_sparc64 dcCall_sparc64: /* Basic Prolog: supports up to 6 arguments. */ /* new C interface */ /* o0-1: callvm,target */ or %o0, %g0, %o3 /* %o3: callvm */ or %o1, %g0, %o0 /* %o0: target */ ldx [%o3+CALLVM_size], %o1 /* %o1: size */ add %o3, CALLVM_dataoff, %o2 /* %o2: data */ ld [%o3+CALLVM_singleUseFlags], %o4 /* %o4: flags */ /*leaf functions: may use the first six output registers.*/ /*o0-2:target,size,data*/ /*o3-5:free to use */ /* Arguments: */ /* %o0 = ptr to target. */ /* %o1 = size of data. */ /* %o2 = data pointer. */ /* %o4 = use flags. */ /* Compute a matching stack size (approximate): o3 = align(o1+136,16) */ add %o1, SHEAD+ALIGN-1, %o3 and %o3, -ALIGN, %o3 neg %o3 /* Prolog. */ save %sp, %o3, %sp /* Arguments: */ /* %i0 = ptr to target. */ /* %i1 = size of data. */ /* %i2 = data pointer. */ /* %i3 = stack size. */ /* Load output registers. */ ldx [%i2+IBASE+REGSIZE*0 ],%o0 ldx [%i2+IBASE+REGSIZE*1 ],%o1 ldx [%i2+IBASE+REGSIZE*2 ],%o2 ldx [%i2+IBASE+REGSIZE*3 ],%o3 ldx [%i2+IBASE+REGSIZE*4 ],%o4 ldx [%i2+IBASE+REGSIZE*5 ],%o5 /* Load double-precision float registers. */ ldd [%i2+FBASE+REGSIZE*0 ],%f0 ldd [%i2+FBASE+REGSIZE*1 ],%f2 ldd [%i2+FBASE+REGSIZE*2 ],%f4 ldd [%i2+FBASE+REGSIZE*3 ],%f6 ldd [%i2+FBASE+REGSIZE*4 ],%f8 ldd [%i2+FBASE+REGSIZE*5 ],%f10 ldd [%i2+FBASE+REGSIZE*6 ],%f12 ldd [%i2+FBASE+REGSIZE*7 ],%f14 ldd [%i2+FBASE+REGSIZE*8 ],%f16 ldd [%i2+FBASE+REGSIZE*9 ],%f18 ldd [%i2+FBASE+REGSIZE*10],%f20 ldd [%i2+FBASE+REGSIZE*11],%f22 ldd [%i2+FBASE+REGSIZE*12],%f24 ldd [%i2+FBASE+REGSIZE*13],%f26 ldd [%i2+FBASE+REGSIZE*14],%f28 ldd [%i2+FBASE+REGSIZE*15],%f30 /* load single-precision float registers */ or %g0, 1, %l0 .f0: andcc %i4, %l0, %g0 beq .f1 nop ld [%i2+FBASE+REGSIZE*16+4*0 ], %f1 .f1: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f2 nop ld [%i2+FBASE+REGSIZE*16+4*1 ], %f3 .f2: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f3 nop ld [%i2+FBASE+REGSIZE*16+4*2 ], %f5 .f3: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f4 nop ld [%i2+FBASE+REGSIZE*16+4*3 ], %f7 .f4: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f5 nop ld [%i2+FBASE+REGSIZE*16+4*4 ], %f9 .f5: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f6 nop ld [%i2+FBASE+REGSIZE*16+4*5 ], %f11 .f6: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f7 nop ld [%i2+FBASE+REGSIZE*16+4*6 ], %f13 .f7: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f8 nop ld [%i2+FBASE+REGSIZE*16+4*7 ], %f15 .f8: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f9 nop ld [%i2+FBASE+REGSIZE*16+4*8 ], %f17 .f9: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f10 nop ld [%i2+FBASE+REGSIZE*16+4*9 ], %f19 .f10: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f11 nop ld [%i2+FBASE+REGSIZE*16+4*10], %f21 .f11: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f12 nop ld [%i2+FBASE+REGSIZE*16+4*11], %f23 .f12: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f13 nop ld [%i2+FBASE+REGSIZE*16+4*12], %f25 .f13: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f14 nop ld [%i2+FBASE+REGSIZE*16+4*13], %f27 .f14: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f15 nop ld [%i2+FBASE+REGSIZE*16+4*14], %f29 .f15: sll %l0, 1, %l0 andcc %i4, %l0, %g0 beq .f_end nop ld [%i2+FBASE+REGSIZE*16+4*15], %f31 .f_end: /* Skip Register Data, do we nee to copy on stack at all? */ sub %i1, DHEAD, %i1 /* skip data header. */ cmp %i1, 0 ble .do_call nop /* Copy loop: */ add %i2, DHEAD, %i2 /* i2 = skip data header. */ or %g0, %g0, %l0 /* l0 = offset initialized to 0. */ add %sp, BIAS+SHEAD, %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */ .next: ldx [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */ stx %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */ add %l0, REGSIZE, %l0 /* Increment offset. */ sub %i1, REGSIZE, %i1 /* Decrement copy size. */ cmp %i1, 0 bgt .next nop .do_call: call %i0 /* Call target. */ nop or %o0, %g0, %i0 jmpl %i7 + 8, %g0 restore /* return %i7 + 8 jmpl %i7 + 8, %g0 nop jmpl %i7 + 8, %g0 nop restore ret */ /* or %o0, %g0, %i0 or %o1, %g0, %i1 or %o2, %g0, %i2 or %o3, %g0, %i3 return %i7 + 8 nop Changes from v8: - fundamental data types - (un)signed int: 8,16,32,64 - float: 32,64,128 - float: IEEE 754 compilant 32 32-bit float registers f0,f1,..,f31 32 64-bit float registers f0,f2,..,f62 16 128-bit float registers f0,f4,..,f60 Description: We need to raise up a dynamic stack frame. Therefore we need to compute the stack size. We do this first, in the context of the caller as a leaf function (using o3 as scratch for addition). Then we raise the frame, ending up in o0-o3 is then i0-i3. Stack Layout: BIAS = 2047 BIAS+XX: should be 16 byte aligned. ... 136: argument overflow area 128: 1 extended word for struct/union poiner return value BIAS+ 0: 16 extended words for registers (in/local) save area [register window] Function Argument Passing: - integer %o0..%o5 (caller view). - floating-point %f0 .. %f15 - continuous memory starting at %sp+BIAS+136 (caller view). Register Usage: %fp0..%fp31 : floating-point arguments. %sp or %o6 : stack pointer, always 8 (or 16?)-byte aligned. %fp or %i6 : frame pointer. %i0 and %o0 : integer and pointer return values. %i7 and %o7 : return address. (caller puts return address to %o7, callee uses %i7) %fp0 and %fp1: return value (float). %i0..%i5 : input argument registers %o0..%o5 : output argument registers %g0 : always zero, writes to it have no effect. Register Mappings: r0-7 -> globals r8-15 -> outs r16-r23 -> locals r24-r31 -> ins Integer Register Overview Table: ID Class Name Description ------------------------------------------------------------------------------ 0 globals g0 always zero, writes to it have no effect 1 g1 2 g2 3 g3 4 g4 5 g5 6 g6 7 g7 8 out o0 [int/ptr] arg 0 and return 9 o1 arg 1 10 o2 arg 2 11 o3 arg 3 12 o4 arg 4 13 o5 arg 5 14 o6 stack pointer 15 o7 16 local l0 scratch 17 l1 18 l2 19 l3 20 l4 21 l5 22 l6 23 l7 24 in i0 [int/pt] arg 0 and return 25 i1 26 i2 27 i3 28 i4 29 i5 30 i6 frame pointer 31 i7 */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc64.h0000644000175000017500000000221412456307246023040 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc64.h Description: License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_SPARC64_H #define DYNCALL_CALL_SPARC64_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_sparc64 (DCpointer target, DCsize size, DCpointer data); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_SPARC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.S0000644000175000017500000001316712456307246023270 0ustar jnthnjnthn#define BIAS 2047 .global dcCall_v9 /* dcCall_sparc64( DCCallVM* , void * target ) */ /* o0 o1 */ dcCall_v9: or %o0, %g0, %o3 /* o3: callvm */ or %o1, %g0, %o0 /* o0: target */ ldx [%o3+24], %o1 /* o1: mVecSize */ add %o3, 32, %o2 /* o2: stack */ /* Compute a matching stack size (approximate): o3 = align(o1+136,16) */ add %o1, (16+1+6)*8+15, %o3 and %o3, -16, %o3 neg %o3 /* o3: -stacksize */ save %sp, %o3, %sp ldd [%i2+8*0 ],%f0 /* Load double-precision float registers. */ ldd [%i2+8*1 ],%f2 ldd [%i2+8*2 ],%f4 ldd [%i2+8*3 ],%f6 ldd [%i2+8*4 ],%f8 ldd [%i2+8*5 ],%f10 ldd [%i2+8*6 ],%f12 ldd [%i2+8*7 ],%f14 ldd [%i2+8*8 ],%f16 ldd [%i2+8*9 ],%f18 ldd [%i2+8*10],%f20 ldd [%i2+8*11],%f22 ldd [%i2+8*12],%f24 ldd [%i2+8*13],%f26 ldd [%i2+8*14],%f28 ldd [%i2+8*15],%f30 ldx [%i2+8*0],%o0 /* Load output registers. */ ldx [%i2+8*1],%o1 ldx [%i2+8*2],%o2 ldx [%i2+8*3],%o3 ldx [%i2+8*4],%o4 ldx [%i2+8*5],%o5 sub %i1, 48, %i1 cmp %i1, 0 ble .do_call nop /* Copy loop: */ add %i2, 48, %i2 /* skip homing area */ or %g0, %g0, %l0 /* l0 = offset initialized to 0. */ add %sp, BIAS+((16+6)*8), %l2 /* l2 = argument area on stack space (7th word). (64+4+6*4 = byte offset 92). */ .next: ldx [%i2+%l0],%l1 /* Read from arg buffer(%i2) to %l1. */ stx %l1, [%l2+%l0] /* Write %l1 to stack space(%l2). */ add %l0, 8, %l0 /* Increment offset. */ sub %i1, 8, %i1 /* Decrement copy size. */ cmp %i1, 0 bgt .next nop .do_call: call %i0 /* Call target. */ nop or %o0, %g0, %i0 jmpl %i7 + 8, %g0 restore /* or %o0, %g0, %i0 or %o1, %g0, %i1 or %o2, %g0, %i2 or %o3, %g0, %i3 return %i7 + 8 nop Changes from v8: - fundamental data types - (un)signed int: 8,16,32,64 - float: 32,64,128 - float: IEEE 754 compilant 32 32-bit float registers f0,f1,..,f31 32 64-bit float registers f0,f2,..,f62 16 128-bit float registers f0,f4,..,f60 Description: We need to raise up a dynamic stack frame. Therefore we need to compute the stack size. We do this first, in the context of the caller as a leaf function (using o3 as scratch for addition). Then we raise the frame, ending up in o0-o3 is then i0-i3. Stack Layout: BIAS = 2047 BIAS+XX: should be 16 byte aligned. ... 136: argument overflow area 128: 1 extended word for struct/union poiner return value BIAS+ 0: 16 extended words for registers (in/local) save area [register window] Function Argument Passing: - integer %o0..%o5 (caller view). - floating-point %f0 .. %f15 - continuous memory starting at %sp+BIAS+136 (caller view). Register Usage: %fp0..%fp31 : floating-point arguments. %sp or %o6 : stack pointer, always 8 (or 16?)-byte aligned. %fp or %i6 : frame pointer. %i0 and %o0 : integer and pointer return values. %i7 and %o7 : return address. (caller puts return address to %o7, callee uses %i7) %fp0 and %fp1: return value (float). %i0..%i5 : input argument registers %o0..%o5 : output argument registers %g0 : always zero, writes to it have no effect. Register Mappings: r0-7 -> globals r8-15 -> outs r16-r23 -> locals r24-r31 -> ins Integer Register Overview Table: ID Class Name Description ------------------------------------------------------------------------------ 0 globals g0 always zero, writes to it have no effect 1 g1 2 g2 3 g3 4 g4 5 g5 6 g6 7 g7 8 out o0 [int/ptr] arg 0 and return 9 o1 arg 1 10 o2 arg 2 11 o3 arg 3 12 o4 arg 4 13 o5 arg 5 14 o6 stack pointer 15 o7 16 local l0 scratch 17 l1 18 l2 19 l3 20 l4 21 l5 22 l6 23 l7 24 in i0 [int/pt] arg 0 and return 25 i1 26 i2 27 i3 28 i4 29 i5 30 i6 frame pointer 31 i7 */ /* --------------------------------------------------------------------------- call kernel for sparc64 v9 abi tested on sparc64/linux/debian [gcc54.fsffrance.org - thanx to the farm!] new C Interface: void dcCall_sparc (DCCallVM* callvm, DCpointer target); %i0 %1 see dyncall_call_sparc.S for details. old C Interface: void dcCall_sparc (DCpointer target, DCsize size, DCpointer data); %i0 , %i1 , %i2 Input: i0 target i1 size i2 data */ /* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc64.S Description: Call kernel for sparc64 v9 ABI. License: Copyright (c) 2011-2013 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if 0 #define REGSIZE 8 #define SHEAD ((16+6)*8) #define ALIGN 16 #define IREGS 6 #define FREGS 16 #define SREGS 16 #define IBASE 0 #define FBASE (IREGS*8) // #define DHEAD ((IREGS+FREGS)*8)+SREGS*4 CALLVM_regdata = 72 CALLVM_size = 208 CALLVM_buffer = 216 #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.h0000644000175000017500000000220112456307246023300 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_sparc_v9.h Description: License: Copyright (c) 2011-2013 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALL_SPARC_V9_H #define DYNCALL_CALL_SPARC_V9_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif void dcCall_v9 (DCCallVM* vm, DCpointer target); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_SPARC_v9_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x64-att.S0000644000175000017500000001103112456307246022735 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64-att.S Description: All x64 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64-att.S" BEGIN_ASM /*--------------------------------------------------------------------------- Call Kernel for x64 System V Input: RDI : size of arguments to be passed via stack RSI : pointer to arguments to be passed via the stack RDX : pointer to arguments of integral/pointer type to be passed via registers RCX : pointer to arguments of floating point type to be passed via registers R8 : target function pointer Notes: RSP+8: is always 16-byte aligned (32-byte align if __m256 is used) */ GLOBAL(dcCall_x64_sysv) BEGIN_PROC(dcCall_x64_sysv) PUSH(RBP) /* Pseudo-prolog - preserve RBP. */ PUSH(RBX) /* Preserve RBX and store pointer to function in it. */ MOV(RSP,RBP) /* Store stack pointer in RBP. */ MOV(R8 ,RBX) MOVSD(QWORD(RCX,0) ,XMM0) /* Copy first 8 floats to XMM0-XMM7. */ MOVSD(QWORD(RCX,8) ,XMM1) MOVSD(QWORD(RCX,16),XMM2) MOVSD(QWORD(RCX,24),XMM3) MOVSD(QWORD(RCX,32),XMM4) MOVSD(QWORD(RCX,40),XMM5) MOVSD(QWORD(RCX,48),XMM6) MOVSD(QWORD(RCX,56),XMM7) ADD(LIT(31),RDI) /* Align stack to 32-byte. */ AND(LIT(-32),RDI) ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */ SUB(RDI,RSP) /* Setup stack frame by subtracting the size of arguments. */ MOV(RDI,RCX) /* Store number of bytes to copy to stack in RCX (for rep movsb). */ MOV(RSP,RDI) /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ REP(MOVSB) /* copy bytes (@@@ should be optimized). */ MOV(QWORD(RDX,0),RDI) /* copy first six int/pointer arguments to RDI, RSI, RDX, RCX, R8, R9. */ MOV(QWORD(RDX,8),RSI) MOV(QWORD(RDX,24),RCX) MOV(QWORD(RDX,32),R8) MOV(QWORD(RDX,40),R9) MOV(QWORD(RDX,16),RDX) /* Set RDX last to not overwrite it to soon. */ MOVB(LIT(8),AL) /* Put upper bound of number of used xmm registers in AL. */ CALL_REG(RBX) /* Call function. */ MOV(RBP,RSP) /* Restore stack pointer. */ POP(RBX) /* Restore RBX. */ POP(RBP) /* Pseudo-epilog. */ RET() END_PROC(dcCALl_x64_sysv) /*--------------------------------------------------------------------------- Call Kernel for x64 Win64 Input: RCX : size of arguments to be passed via stack RDX : pointer to arguments to be passed via the stack R8 : pointer to arguments of integral/pointer type to be passed via registers R9 : target function pointer */ GLOBAL(dcCall_x64_win64) BEGIN_PROC(dcCall_x64_win64) PUSH(RBP) /* Pseudo-prolog - preserve RBP. */ PUSH(RSI) /* Preserve RSI and RDI. */ PUSH(RDI) MOV(RSP,RBP) /* Store stack pointer in RBP. */ ADD(LIT(15),RCX) /* Align stack size to 16 bytes. */ AND(LIT(-16),RCX) SUB(RCX,RSP) /* Setup stack frame by subtracting the size of the arguments. */ MOV(RDX, RSI) /* Let RSI point to the arguments. */ MOV(RSP, RDI) /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ MOV(R9, RAX) /* Put function address in RAX. */ REP(MOVSB) /* @@@ should be optimized (e.g. movq) */ MOV(QWORD(R8,0),RCX) /* Copy first four arguments to RCX, RDX, R9, R8 ( and XMM0-XMM3. ) */ MOV(QWORD(R8,8),RDX) MOV(QWORD(R8,24),R9) MOV(QWORD(R8,16),R8) MOVD(RCX, XMM0) MOVD(RDX, XMM1) MOVD(R8, XMM2) MOVD(R9, XMM3) PUSH(R9) /* Push first four arguments onto the stack preserve area. */ PUSH(R8) PUSH(RDX) PUSH(RCX) CALL_REG(RAX) /* Invoke function. */ MOV(RBP, RSP) /* Restore stack pointer (such that we can pop the preserved vALues). */ POP(RDI) /* Restore RSI and RDI. */ POP(RSI) POP(RBP) /* Pseudo-epilog. */ RET() END_PROC(dcCall_x64_win64) END_ASM MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x64.S0000644000175000017500000001110212456307246022146 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64.S Description: All x64 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64.S" BEGIN_ASM /*--------------------------------------------------------------------------- Call Kernel for x64 System V Input: RDI : size of arguments to be passed via stack RSI : pointer to arguments to be passed via the stack RDX : pointer to arguments of integral/pointer type to be passed via registers RCX : pointer to arguments of floating point type to be passed via registers R8 : target function pointer */ GLOBAL(dcCall_x64_sysv) BEGIN_PROC(dcCall_x64_sysv) push RBP /* Pseudo-prolog - preserve RBP. */ push RBX /* Preserve RBX and store pointer to function in it. */ mov RBP, RSP /* Store stack pointer in RBP. */ mov RBX, R8 movsd XMM0, qword ptr[RCX ] /* Copy first 8 floats to XMM0-XMM7 (this makes RCX free to use). */ movsd XMM1, qword ptr[RCX+ 8] movsd XMM2, qword ptr[RCX+16] movsd XMM3, qword ptr[RCX+24] movsd XMM4, qword ptr[RCX+32] movsd XMM5, qword ptr[RCX+40] movsd XMM6, qword ptr[RCX+48] movsd XMM7, qword ptr[RCX+56] sub RSP, RDI /* Setup stack frame by subtracting the size of the arguments. */ and RSP, -32 /* Align stack to 32-byte border. */ mov RCX, RDI /* Store number of bytes to copy to stack in RCX (for rep movsb). */ mov RDI, RSP /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ rep movsb /* @@@ should be optimized (e.g. movq) */ mov RDI, qword ptr[RDX ] /* Copy first six int/pointer arguments to RDI, RSI, RDX, RCX, R8, R9. */ mov RSI, qword ptr[RDX+ 8] mov RCX, qword ptr[RDX+24] mov R8, qword ptr[RDX+32] mov R9, qword ptr[RDX+40] mov RDX, qword ptr[RDX+16] /* Set RDX last to not overwrite it to soon. */ mov AL, 8 /* Put upper bound of number of used xmm registers in AL. */ call RBX /* Invoke function. */ mov RSP, RBP /* Restore stack pointer (such that we can pop the preserved vALues). */ pop RBX /* Restore RBX. */ pop RBP /* Pseudo-epilog. */ ret END_PROC(dcCall_x64_sysv) /*--------------------------------------------------------------------------- Call Kernel for x64 Win64 Input: RCX : size of arguments to be passed via stack RDX : pointer to arguments to be passed via the stack R8 : pointer to arguments of integral/pointer type to be passed via registers R9 : target function pointer */ GLOBAL(dcCall_x64_win64) BEGIN_PROC(dcCall_x64_win64) push RBP /* Pseudo-prolog - preserve RBP. */ push RSI /* Preserve RSI and RDI. */ push RDI /* and RSP, -16 /* Align frame to 16 bytes. */ mov RBP, RSP /* Store stack pointer in RBP. */ add RCX, 15 /* Align stack size to 16 bytes. */ and RCX, -16 sub RSP, RCX /* Setup stack frame by subtracting the size of the arguments. */ mov RSI, RDX /* Let RSI point to the arguments. */ mov RDI, RSP /* Store pointer to beginning of stack arguments in RDI (for rep movsb). */ mov RAX, R9 /* Put function address in RAX. */ rep movsb /* @@@ should be optimized (e.g. movq) */ mov RCX, qword ptr[R8 ] /* Copy first four arguments to RCX, RDX, R8, R9 and XMM0-XMM3. */ mov RDX, qword ptr[R8+ 8] mov R9, qword ptr[R8+24] /* Set R9 first to not overwrite R8 too soon. */ mov R8, qword ptr[R8+16] movd XMM0, RCX movd XMM1, RDX movd XMM2, R8 movd XMM3, R9 push R9 /* Push first four arguments onto the stack preserve area. */ push R8 push RDX push RCX call RAX /* Invoke function. */ mov RSP, RBP /* Restore stack pointer (such that we can pop the preserved vALues). */ pop RDI /* Restore RSI and RDI. */ pop RSI pop RBP /* Pseudo-epilog. */ ret END_PROC(dcCall_x64_win64) END_ASM MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x64.h0000644000175000017500000000277112456307246022207 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x64.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall x64 REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALL_X64_H #define DYNCALL_CALL_X64_H #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif /* ** x64 SystemV calling convention ** ** - hybrid return-type call (bool ... pointer) ** */ void dcCall_x64_sysv(DCsize stacksize, DCpointer stackdata, DCpointer regdata_i, DCpointer regdata_f, DCpointer target); void dcCall_x64_win64(DCsize stacksize, DCpointer stackdata, DCpointer regdata, DCpointer target); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_X64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x64_generic_masm.asm0000644000175000017500000000234512456307246025246 0ustar jnthnjnthn; auto-generated by gen-masm.sh .CODE dcCall_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP push RBX mov RBP,RSP mov RBX,R8 movsd XMM0,qword ptr [RCX+0] movsd XMM1,qword ptr [RCX+8] movsd XMM2,qword ptr [RCX+16] movsd XMM3,qword ptr [RCX+24] movsd XMM4,qword ptr [RCX+32] movsd XMM5,qword ptr [RCX+40] movsd XMM6,qword ptr [RCX+48] movsd XMM7,qword ptr [RCX+56] add RDI,31 and RDI,-32 add RDI,8 sub RSP,RDI mov RCX,RDI mov RDI,RSP rep movsb mov RDI,qword ptr [RDX+0] mov RSI,qword ptr [RDX+8] mov RCX,qword ptr [RDX+24] mov R8,qword ptr [RDX+32] mov R9,qword ptr [RDX+40] mov RDX,qword ptr [RDX+16] mov AL,8 call RBX mov RSP,RBP pop RBX pop RBP ret dcCALl_x64_sysv ENDP dcCall_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP push RSI push RDI mov RBP,RSP add RCX,15 and RCX,-16 sub RSP,RCX mov RSI,RDX mov RDI,RSP mov RAX,R9 rep movsb mov RCX,qword ptr [R8+0] mov RDX,qword ptr [R8+8] mov R9,qword ptr [R8+24] mov R8,qword ptr [R8+16] movd XMM0,RCX movd XMM1,RDX movd XMM2,R8 movd XMM3,R9 push R9 push R8 push RDX push RCX call RAX mov RSP,RBP pop RDI pop RSI pop RBP ret dcCall_x64_win64 ENDP END MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x86.S0000644000175000017500000001511612456307246022163 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86.S Description: All - except Plan9 - x86 abi call kernel implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x86.S" BEGIN_ASM /* ============================================================================ DynCall Call Kernels for X86 Architecture ---------------------------------------------------------------------------- C Interface: dcCall_x86_XXX(void* target, void* args, size_t size); ddCall_x86_sys_XXX(int_ptr target, void* args, size_t size); Where XXX is one of calling-conventions, cdecl, win32_msthis, win32_std, win32_fastcall. Parameter Stack layout: size := EBP + 16 args := EBP + 12 target := EBP + 8 NOTES: - epilog restore ESP serves callee cleanup - 16 byte alignment (to be compatible with darwin). */ /*--- default / cdecl -------------------------------------------------------- Details: - caller clean-up */ GLOBAL(dcCall_x86_cdecl) BEGIN_PROC(dcCall_x86_cdecl) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved registers. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = arg buffer ptr */ MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ ANDL(LIT(-16),ECX) MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ SUBL(ECX,ESP) /* allocate stack size */ MOVL(ESP,EDI) /* EDI = stack ptr */ /* work around for rep movsd (not supported by SunPro) SHRL(LIT(2),ECX) REP(MOVSD) */ REP(MOVSB) CALL_DWORD(EBP,8) ADDL(DWORD(EBP,16),ESP) POP(EDI) POP(ESI) MOVL(EBP,ESP) POP(EBP) RET() END_PROC(dcCall_x86_cdecl) /* ---- C++ this calls (microsoft) ------------------------------------------ Details: - this pointer is in ECX */ GLOBAL(dcCall_x86_win32_msthis) BEGIN_PROC(dcCall_x86_win32_msthis) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ MOVL(DWORD(ESI,0),EAX) /* EAX = this pointer. */ ADDL(LIT(4),ESI) /* increment args pointer by thisptr. */ SUBL(LIT(4),ECX) /* decrement size by sizeof(thisptr). */ SUBL(ECX,ESP) /* allocate argument-block on stack. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) /* copy arguments. */ MOVL(EAX,ECX) /* ECX = this pointer. */ CALL_DWORD(EBP,8) /* call function. */ POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_msthis) /*---- win32 stdcall --------------------------------------------------------- Details: - callee cleans up stack */ GLOBAL(dcCall_x86_win32_std) BEGIN_PROC(dcCall_x86_win32_std) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save ESI, EDI. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ SUBL(ECX,ESP) /* allocate size bytes on stack. */ MOVL(ESP,EDI) /* EDI = copy destination stack. */ REP(MOVSB) /* copy BYTEs. */ CALL_DWORD(EBP,8) /* call target. */ POP(EDI) /* restore EDI, ESI. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_std) /*---- win32 fastcall (GNU/Microsoft) ---------------------------------------- Details: - callee cleans up stack - first two integer (up to 32bits) are passed in ECX and EDX */ GLOBAL(dcCall_x86_win32_fast) BEGIN_PROC(dcCall_x86_win32_fast) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = copy source args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ MOVL(DWORD(ESI,0),EAX) /* EAX = first argument. */ MOVL(DWORD(ESI,4),EDX) /* EDX = second argument. */ ADDL(LIT(8),ESI) /* skip registers. */ SUBL(LIT(8),ECX) MOVL(ECX,DWORD(EBP,16)) /* save stack alloc size. */ SUBL(ECX,ESP) /* allocate stack. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) /* copy BYTEs. */ MOVL(EAX,ECX) /* ECX = first argument. */ CALL_DWORD(EBP,8) /* call target. */ POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_win32_fast) /*--- syscall int80 linux --------------------------------------------------- Details: - all arguments are passed via registers */ GLOBAL(dcCall_x86_sys_int80h_linux) BEGIN_PROC(dcCall_x86_sys_int80h_linux) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(EBX) /* save preserved. */ PUSH(ESI) PUSH(EDI) MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ MOVL(DWORD(EAX,4),ECX) MOVL(DWORD(EAX,8),EDX) MOVL(DWORD(EAX,12),ESI) MOVL(DWORD(EAX,16),EDI) MOVL(DWORD(EBP,8),EAX) /* EAX = syscall id. */ INT(LIT(HEX(80))) POP(EDI) /* restore preserved. */ POP(ESI) POP(EBX) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() END_PROC(dcCall_x86_sys_int80h_linux) /*--- syscall int80 bsd ----------------------------------------------------- Details: - all arguments are passed via stack */ GLOBAL(dcCall_x86_sys_int80h_bsd) BEGIN_PROC(dcCall_x86_sys_int80h_bsd) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ PUSH(EDI) MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ SUBL(ECX,ESP) /* allocate stack space. */ MOVL(ESP,EDI) /* EDI = stack args. */ REP(MOVSB) MOVL(DWORD(EBP,8),EAX) /* load system call id. */ CALL(_do_int) POP(EDI) /* restore preserved. */ POP(ESI) MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() _do_int: INT(LIT(HEX(80))) RET() END_PROC(dcCall_x86_sys_int80h_bsd) END_ASM MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x86.h0000644000175000017500000000403212456307246022203 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall 32bit Intel x86 family interface REVISION 2007/12/10 initial */ #ifndef DYNCALL_CALL_X86_H #define DYNCALL_CALL_X86_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif /* ** x86 calling convention calls ** ** - hybrid return-type call (bool ... pointer) ** */ #if defined(DC__OS_Plan9) /* No support for other cconvs on Plan9 and vice-versa. */ void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size); #else void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_sys_int80h_linux (DCpointer target, DCpointer stackdata, DCsize size); void dcCall_x86_sys_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size); #endif #ifdef __cplusplus } #endif #endif /* DYNCALL_CALL_X86_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x86_8a.s0000644000175000017500000001114212456307246022606 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_call_x86_8a.s Description: All x86 abi call kernel implementations in Plan9's assembler License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* 64 bit integer return value calls require caller to create space for return value, and pass a pointer to it as 1st argument. This main function handles all cases (32 and 64 bit integers, as well as floats and doubles), however, it has to be called through the 2 corresponding functions at the end of this file. In order to keep things simple, we basically put the pointer to the return value in EDX and call the other assembler code, above. If EDX is not null, then the code below will push it to the stack as first argument. */ call_main: /* Since all registers except SP are scratch, and we have a variable argument size depending on the function to call, we have to find a way to store and restore SP. The idea is to replace the return address with a custom one on the stack, and to put some logic there, jumping back to the real return address. This allows us, to put the SP somewhere next to the fake return address on the stack, so that we can get it back with a fixed offset (relative to the program counter, in our case). The only real issue with this approach would be a non-executable stack. However, Plan9 doesn't support w^x at the time of writing. */ /* On the stack at this point: RETADDR 0(SP) FUNPTR 4(SP) ARGS 8(SP) SIZE 12(SP) */ MOVL SP, BP /* base pointer for convenience */ PUSHL SP /* save stack pointer */ MOVL 8(BP), SI /* SI = pointer on args */ MOVL 12(BP), CX /* CX = size of args */ SUBL $16, SP /* Make some room for our SP-refetch logic */ MOVL SP, BX /* Copy address to new, executable stack space to BX */ /* This part fills our executable stack space with instructions. We need to get the program counter, first, with a little hack. */ MOVL $0x000003e8, 0(SP) /* Copy 'call (cur ip+8)' */ MOVL $0x00000000, 4(SP) /* '00' for call address, rest is garbage */ MOVL $0x5a909090, 8(SP) /* 'nop, nop, nop, pop edx' to get eip+5 in edx */ MOVL $0xc30b628b,12(SP) /* Restore stack ptr and return: 'mov [edx+11] to esp, ret' */ SUBL CX, SP /* allocate 'size' bytes on stack for args */ MOVL SP, DI /* DI = stack args */ SHRL $2, SP /* Align stack. */ SHLL $2, SP /* " " */ /* I didn't figure out how to use MOVSB with the 8a syntax. The following can probably be written in a better way. */ JMP copy_loop_cmp copy_loop: MOVL 0(SI), AX /* Copy args. */ MOVL AX, 0(DI) SUBL $4, CX ADDL $4, SI ADDL $4, DI copy_loop_cmp: CMPL CX, $0 JGT copy_loop /* Check if we need to push a pointer to long long that might be used as container for 64-bit return values. */ CMPL DX, $0 JEQ call_ffi PUSHL DX /* Now we try to fake a call, meaning setting up our fake return address, and then jumping to the FFI call. This should call the function, but the return will jump into our stack space we reserved above. */ call_ffi: PUSHL BX MOVL 4(BP), BX JMP BX /* Note that there is no return here, b/c the return is in the asm code above, that has been generated on the fly. */ /* Main call for 32 bit integer return values and floating point arguments. See call_main for explanation. */ TEXT dcCall_x86_plan9(SB), $0 MOVL $0, DX JMP call_main /* Call for 64 bit integer return values. See call_main for explanation. */ TEXT dcCall_x86_plan9_ll(SB), $0 MOVL 16(SP), DX /* Copy pointer to variable for return value. */ JMP call_main MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x86_generic_masm.asm0000644000175000017500000000453312456307246025253 0ustar jnthnjnthn; auto-generated by gen-masm.sh .386 .MODEL FLAT .CODE _dcCall_x86_cdecl PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] add ECX,15 and ECX,-16 mov dword ptr [EBP+16],ECX sub ESP,ECX mov EDI,ESP rep movsb call dword ptr [EBP+8] add ESP,dword ptr [EBP+16] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_cdecl ENDP _dcCall_x86_win32_msthis PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] mov EAX,dword ptr [ESI+0] add ESI,4 sub ECX,4 sub ESP,ECX mov EDI,ESP rep movsb mov ECX,EAX call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_msthis ENDP _dcCall_x86_win32_std PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] sub ESP,ECX mov EDI,ESP rep movsb call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_std ENDP _dcCall_x86_win32_fast PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] mov EAX,dword ptr [ESI+0] mov EDX,dword ptr [ESI+4] add ESI,8 sub ECX,8 mov dword ptr [EBP+16],ECX sub ESP,ECX mov EDI,ESP rep movsb mov ECX,EAX call dword ptr [EBP+8] pop EDI pop ESI mov ESP,EBP pop EBP ret _dcCall_x86_win32_fast ENDP _dcCall_x86_sys_int80h_linux PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push EBX push ESI push EDI mov EAX,dword ptr [EBP+12] mov EBX,dword ptr [EAX+0] mov ECX,dword ptr [EAX+4] mov EDX,dword ptr [EAX+8] mov ESI,dword ptr [EAX+12] mov EDI,dword ptr [EAX+16] mov EAX,dword ptr [EBP+8] int 80h pop EDI pop ESI pop EBX mov ESP,EBP pop EBP ret _dcCall_x86_sys_int80h_linux ENDP _dcCall_x86_sys_int80h_bsd PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] mov ECX,dword ptr [EBP+16] sub ESP,ECX mov EDI,ESP rep movsb mov EAX,dword ptr [EBP+8] call _do_int pop EDI pop ESI mov ESP,EBP pop EBP ret _do_int: int 80h ret _dcCall_x86_sys_int80h_bsd ENDP END MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_call_x86_nasm.asm0000644000175000017500000001365012456307246023560 0ustar jnthnjnthn;////////////////////////////////////////////////////////////////////////////// ; ; Copyright (c) 2007,2009 Daniel Adler , ; Tassilo Philipp ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ;////////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////// ; ; dyncall_call_x86_nasm.nasm ; ; X86 Calls for nasm assembler ; ;/////////////////////////////////////////////////////////////////////// BITS 32 section .text ;/////////////////////////////////////////////////////////////////////// ; CSYM macro ;/////////////////////////////////////////////////////////////////////// %ifdef BUILD_OS_windows %macro EXPORT_C 1 global _%1 _%1: %endmacro %else %macro EXPORT_C 1 global %1 %1: %endmacro %endif ; ----------------------------------------------------------------------------- ; Calling Convention x86 standard C ; - all arguments are on the stack ; - caller cleans up stack ; ; C proto ; dcCallC(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_cdecl push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 ; result ebp+20 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size sub esp, ecx ; cdecl call: allocate 'size' bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments call [ebp+8] ; call function add esp, [ebp+16] ; cdecl call: cleanup stack pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 microsoft thiscall ; - thispointer is in ECX, rest is on the stack ; - callee cleans up stack ; ; C proto ; dcCallThisMS(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_msthis push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size mov eax, [esi] ; eax = this pointer add esi, 4 ; increment args pointer by thisptr sub ecx, 4 ; decrement size by sizeof(thisptr) sub esp, ecx ; allocate argument-block on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments mov ecx, eax ; ecx = this pointer call [ebp+8] ; call function (thiscall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 win32 stdcall ; - all arguments are passed by stack ; - callee cleans up stack ; ; C proto ; dcCallStd(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_std push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size sub esp, ecx ; stdcall: allocate 'size'-8 bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments call [ebp+8] ; call function (stdcall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; ----------------------------------------------------------------------------- ; Calling Convention x86 win32 fastcall ; - first two integer (up to 32bits) are passed in ECX and EDX ; - others are passed on the stack ; - callee cleans up stack ; ; C proto ; dcCallFast(DCptr funptr, DCptr args, DCsize size) ; ----------------------------------------------------------------------------- EXPORT_C dcCall_x86_win32_fast push ebp ; prolog mov ebp, esp ; arguments: ; ; funptr ebp+8 ; args ebp+12 ; size ebp+16 push esi ; save esi, edi push edi mov esi, [ebp+12] ; esi = pointer on args mov ecx, [ebp+16] ; ecx = size mov eax, [esi] ; eax = first argument mov edx, [esi+4] ; edx = second argument add esi, 8 ; increment source pointer sub ecx, 8 ; decrement size by 8 sub esp, ecx ; fastcall: allocate 'size'-8 bytes on stack mov edi, esp ; edi = stack args rep movsb ; copy arguments mov ecx, eax ; ecx = first argument call [ebp+8] ; call function (fastcall: cleanup by callee) pop edi ; restore edi, esi pop esi mov esp, ebp ; epilog pop ebp ret ; Stack markings for ELF/GNU to specify no executable stack */ %ifidn __OUTPUT_FORMAT__,elf section .note.GNU-stack noalloc noexec nowrite progbits %endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callf.c0000644000175000017500000001143312502366750021637 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callf.c Description: formatted call C interface (extension module) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callf.h" // Shareable implementation for argument binding used in ArgF and CallF below. static void dcArgF_impl(DCCallVM* vm, const DCsigchar** sigptr, va_list args) { DCsigchar ch; dcReset(vm); while((ch=*(*sigptr)++) != '\0' && ch != DC_SIGCHAR_ENDARG) { switch(ch) { case DC_SIGCHAR_BOOL: dcArgBool (vm, (DCbool) va_arg(args, DCint )); break; case DC_SIGCHAR_CHAR: dcArgChar (vm, (DCchar) va_arg(args, DCint )); break; case DC_SIGCHAR_UCHAR: dcArgChar (vm, (DCchar)(DCuchar) va_arg(args, DCint )); break; case DC_SIGCHAR_SHORT: dcArgShort (vm, (DCshort) va_arg(args, DCint )); break; case DC_SIGCHAR_USHORT: dcArgShort (vm, (DCshort)(DCushort)va_arg(args, DCint )); break; case DC_SIGCHAR_INT: dcArgInt (vm, (DCint) va_arg(args, DCint )); break; case DC_SIGCHAR_UINT: dcArgInt (vm, (DCint)(DCuint) va_arg(args, DCint )); break; case DC_SIGCHAR_LONG: dcArgLong (vm, (DClong) va_arg(args, DClong )); break; case DC_SIGCHAR_ULONG: dcArgLong (vm, (DCulong) va_arg(args, DClong )); break; case DC_SIGCHAR_LONGLONG: dcArgLongLong(vm, (DClonglong) va_arg(args, DClonglong)); break; case DC_SIGCHAR_ULONGLONG: dcArgLongLong(vm, (DCulonglong) va_arg(args, DClonglong)); break; case DC_SIGCHAR_FLOAT: dcArgFloat (vm, (DCfloat) va_arg(args, DCdouble )); break; case DC_SIGCHAR_DOUBLE: dcArgDouble (vm, (DCdouble) va_arg(args, DCdouble )); break; case DC_SIGCHAR_POINTER: dcArgPointer (vm, (DCpointer) va_arg(args, DCpointer )); break; case DC_SIGCHAR_STRING: dcArgPointer (vm, (DCpointer) va_arg(args, DCpointer )); break; } } } void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args) { dcArgF_impl(vm, &signature, args); } void dcArgF(DCCallVM* vm, const DCsigchar* signature, ...) { va_list va; va_start(va, signature); dcVArgF(vm,signature,va); va_end(va); } void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args) { const DCsigchar* ptr = signature; dcArgF_impl(vm, &ptr, args); switch(*ptr) { case DC_SIGCHAR_VOID: dcCallVoid (vm,funcptr); break; case DC_SIGCHAR_BOOL: result->B = dcCallBool (vm,funcptr); break; case DC_SIGCHAR_CHAR: result->c = dcCallChar (vm,funcptr); break; case DC_SIGCHAR_UCHAR: result->C = (DCuchar)dcCallChar(vm,funcptr); break; case DC_SIGCHAR_SHORT: result->s = dcCallShort (vm,funcptr); break; case DC_SIGCHAR_USHORT: result->S = dcCallShort (vm,funcptr); break; case DC_SIGCHAR_INT: result->i = dcCallInt (vm,funcptr); break; case DC_SIGCHAR_UINT: result->I = dcCallInt (vm,funcptr); break; case DC_SIGCHAR_LONG: result->j = dcCallLong (vm,funcptr); break; case DC_SIGCHAR_ULONG: result->J = dcCallLong (vm,funcptr); break; case DC_SIGCHAR_LONGLONG: result->l = dcCallLongLong (vm,funcptr); break; case DC_SIGCHAR_ULONGLONG: result->L = dcCallLongLong (vm,funcptr); break; case DC_SIGCHAR_FLOAT: result->f = dcCallFloat (vm,funcptr); break; case DC_SIGCHAR_DOUBLE: result->d = dcCallDouble (vm,funcptr); break; case DC_SIGCHAR_POINTER: result->p = dcCallPointer (vm,funcptr); break; case DC_SIGCHAR_STRING: result->Z = dcCallPointer (vm,funcptr); break; } } void dcCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...) { va_list va; va_start(va, signature); dcVCallF(vm,result,funcptr,signature,va); va_end(va); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callf.h0000644000175000017500000000313712466674236021660 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callf.h Description: formatted call interface to dyncall License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall formatted calls C API REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLF_H #define DYNCALL_CALLF_H /* dyncall formatted calls */ #include "dyncall.h" #include "dyncall_signature.h" #include "dyncall_value.h" #include void dcArgF (DCCallVM* vm, const DCsigchar* signature, ...); void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args); void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...); void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args); #endif /* DYNCALL_CALLF_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm.c0000644000175000017500000000445312466674236022052 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm.c Description: auto-select default callvm (includes other C sources). License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_macros.h" #if defined(DC__Arch_Intel_x86) # include "dyncall_callvm_x86.c" #elif defined(DC__Arch_AMD64) # include "dyncall_callvm_x64.c" #elif defined(DC__Arch_PPC32) # include "dyncall_callvm_ppc32.c" #elif defined(DC__Arch_PPC64) # include "dyncall_callvm_ppc64.c" #elif defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # if defined(DC__ABI_MIPS_EABI) # include "dyncall_callvm_mips_eabi.c" # elif defined(DC__ABI_MIPS_O32) # include "dyncall_callvm_mips_o32.c" # elif defined(DC__ABI_MIPS_N64) # include "dyncall_callvm_mips_n64.c" # elif defined(DC__ABI_MIPS_N32) # include "dyncall_callvm_mips_n32.c" # else # error Unknown MIPS ABI. # endif /* DC__Arch_MIPS || DC__Arch_MIPS64 */ #elif defined(DC__Arch_ARM_ARM) # if defined(DC__ABI_ARM_HF) # include "dyncall_callvm_arm32_arm_armhf.c" # else # include "dyncall_callvm_arm32_arm.c" # endif #elif defined(DC__Arch_ARM_THUMB) # if defined(DC__ABI_ARM_HF) # include "dyncall_callvm_arm32_arm_armhf.c" # else # include "dyncall_callvm_arm32_thumb.c" # endif #elif defined(DC__Arch_ARM64) # include "dyncall_callvm_arm64.c" #elif defined(DC__Arch_Sparc) # include "dyncall_callvm_sparc.c" #elif defined(DC__Arch_Sparcv9) # include "dyncall_callvm_sparc_v9.c" #else # error unsupported platform #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm.h0000644000175000017500000000751212456307246022047 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm.h Description: Common call vm binary interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_H #define DYNCALL_CALLVM_H #include "dyncall.h" /* --- callvm virtual function table --------------------------------------- */ /* NOTE: if something changes in DCCallVM_, update offset marks in dyncall_call_sparc.S */ typedef struct DCCallVM_vt_ DCCallVM_vt; struct DCCallVM_ { DCCallVM_vt* mVTpointer; DCint mError; }; struct DCCallVM_vt_ { void (*free) (DCCallVM* vm); void (*reset) (DCCallVM* vm); void (*mode) (DCCallVM* vm,DCint mode); void (*argBool) (DCCallVM* vm,DCbool B); void (*argChar) (DCCallVM* vm,DCchar c); void (*argShort) (DCCallVM* vm,DCshort s); void (*argInt) (DCCallVM* vm,DCint i); void (*argLong) (DCCallVM* vm,DClong l); void (*argLongLong) (DCCallVM* vm,DClonglong L); void (*argFloat) (DCCallVM* vm,DCfloat f); void (*argDouble) (DCCallVM* vm,DCdouble d); void (*argPointer) (DCCallVM* vm,DCpointer p); void (*argStruct) (DCCallVM* vm,DCstruct* s, DCpointer p); void (*callVoid) (DCCallVM* vm,DCpointer funcptr); DCbool (*callBool) (DCCallVM* vm,DCpointer funcptr); DCchar (*callChar) (DCCallVM* vm,DCpointer funcptr); DCshort (*callShort) (DCCallVM* vm,DCpointer funcptr); DCint (*callInt) (DCCallVM* vm,DCpointer funcptr); DClong (*callLong) (DCCallVM* vm,DCpointer funcptr); DClonglong (*callLongLong) (DCCallVM* vm,DCpointer funcptr); DCfloat (*callFloat) (DCCallVM* vm,DCpointer funcptr); DCdouble (*callDouble) (DCCallVM* vm,DCpointer funcptr); DCpointer (*callPointer) (DCCallVM* vm,DCpointer funcptr); void (*callStruct) (DCCallVM* vm,DCpointer funcptr,DCstruct* s, DCpointer returnValue); }; typedef DCvoid (DCvoidvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCbool (DCboolvmfunc) (DCCallVM* vn,DCpointer funcptr); typedef DCchar (DCcharvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCshort (DCshortvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCint (DCintvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DClong (DClongvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DClonglong (DClonglongvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCfloat (DCfloatvmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCdouble (DCdoublevmfunc) (DCCallVM* vm,DCpointer funcptr); typedef DCpointer (DCpointervmfunc) (DCCallVM* vm,DCpointer funcptr); /* Common base functions for CallVM implementations. */ void dc_callvm_base_init(DCCallVM *pInstance, DCCallVM_vt* pVTable); #endif /* DYNCALL_CALLVM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.c0000644000175000017500000001605012456307246023702 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_arm.c Description: ARM 32-bit "arm" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armcall REVISION 2007/12/11 initial */ #include "dyncall_callvm_arm32_arm.h" #include "dyncall_alloc.h" static void dc_callvm_mode_arm32_arm(DCCallVM* in_self,DCint mode); static DCCallVM* dc_callvm_new_arm32_arm(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)dcAllocMem(sizeof(DCCallVM_arm32_arm)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_arm32_arm(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_arm32_arm(DCCallVM* in_self) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecReset(&self->mVecHead); } static void dc_callvm_argInt_arm32_arm(DCCallVM* in_self, DCint x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } static void dc_callvm_argBool_arm32_arm(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_arm32_arm(in_self, (DCint)x); } static void dc_callvm_argChar_arm32_arm(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argShort_arm32_arm(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argLong_arm32_arm(DCCallVM* in_self, DClong x) { dc_callvm_argInt_arm32_arm(in_self, x); } static void dc_callvm_argLongLong_arm32_arm(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argLongLong_arm32_arm_eabi(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_arm32_arm(DCCallVM* in_self, DCfloat x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_arm32_arm(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argDouble_arm32_arm_eabi(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_arm32_arm(DCCallVM* in_self, DCpointer x) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } /* Call. */ void dc_callvm_call_arm32_arm(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; dcCall_arm32_arm(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DCCallVM_vt gVT_arm32_arm = { &dc_callvm_free_arm32_arm , &dc_callvm_reset_arm32_arm , &dc_callvm_mode_arm32_arm , &dc_callvm_argBool_arm32_arm , &dc_callvm_argChar_arm32_arm , &dc_callvm_argShort_arm32_arm , &dc_callvm_argInt_arm32_arm , &dc_callvm_argLong_arm32_arm , &dc_callvm_argLongLong_arm32_arm , &dc_callvm_argFloat_arm32_arm , &dc_callvm_argDouble_arm32_arm , &dc_callvm_argPointer_arm32_arm , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_arm , (DCboolvmfunc*) &dc_callvm_call_arm32_arm , (DCcharvmfunc*) &dc_callvm_call_arm32_arm , (DCshortvmfunc*) &dc_callvm_call_arm32_arm , (DCintvmfunc*) &dc_callvm_call_arm32_arm , (DClongvmfunc*) &dc_callvm_call_arm32_arm , (DClonglongvmfunc*) &dc_callvm_call_arm32_arm , (DCfloatvmfunc*) &dc_callvm_call_arm32_arm , (DCdoublevmfunc*) &dc_callvm_call_arm32_arm , (DCpointervmfunc*) &dc_callvm_call_arm32_arm , NULL /* callStruct */ }; DCCallVM_vt gVT_arm32_arm_eabi = { &dc_callvm_free_arm32_arm , &dc_callvm_reset_arm32_arm , &dc_callvm_mode_arm32_arm , &dc_callvm_argBool_arm32_arm , &dc_callvm_argChar_arm32_arm , &dc_callvm_argShort_arm32_arm , &dc_callvm_argInt_arm32_arm , &dc_callvm_argLong_arm32_arm , &dc_callvm_argLongLong_arm32_arm_eabi , &dc_callvm_argFloat_arm32_arm , &dc_callvm_argDouble_arm32_arm_eabi , &dc_callvm_argPointer_arm32_arm , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_arm , (DCboolvmfunc*) &dc_callvm_call_arm32_arm , (DCcharvmfunc*) &dc_callvm_call_arm32_arm , (DCshortvmfunc*) &dc_callvm_call_arm32_arm , (DCintvmfunc*) &dc_callvm_call_arm32_arm , (DClongvmfunc*) &dc_callvm_call_arm32_arm , (DClonglongvmfunc*) &dc_callvm_call_arm32_arm , (DCfloatvmfunc*) &dc_callvm_call_arm32_arm , (DCdoublevmfunc*) &dc_callvm_call_arm32_arm , (DCpointervmfunc*) &dc_callvm_call_arm32_arm , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_arm32_arm(DCsize size) { /* Check OS if we need EABI as default. */ #if defined(DC__ABI_ARM_EABI) return dc_callvm_new_arm32_arm(&gVT_arm32_arm_eabi, size); #else return dc_callvm_new_arm32_arm(&gVT_arm32_arm, size); #endif } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_arm32_arm(size); } static void dc_callvm_mode_arm32_arm(DCCallVM* in_self,DCint mode) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*) in_self; DCCallVM_vt* vt; switch(mode) { /* Check OS if we need EABI as default. */ case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #if defined(DC__ABI_ARM_EABI) case DC_CALL_C_DEFAULT: vt = &gVT_arm32_arm_eabi; break; #else case DC_CALL_C_DEFAULT: vt = &gVT_arm32_arm; break; #endif case DC_CALL_C_ARM_ARM: vt = &gVT_arm32_arm; break; case DC_CALL_C_ARM_ARM_EABI: vt = &gVT_arm32_arm_eabi; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.h0000644000175000017500000000271512456307246023712 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_arm.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armcall REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLVM_ARM32_ARM_H #define DYNCALL_CALLVM_ARM32_ARM_H #include "dyncall_call_arm32_arm.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; DCpointer mpCallFunc; DCVecHead mVecHead; } DCCallVM_arm32_arm; DCCallVM* dcNewCallVM_arm32_arm(DCsize size); #endif /* DYNCALL_CALLVM_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c0000755000175000017500000001243412456307246025064 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/arm_armhf.c Description: ARM 'armhf' ABI implementation License: Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_arm32_arm_armhf.h" #include "dyncall_alloc.h" static DCCallVM* dc_callvm_new_arm32_armhf(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16); dc_callvm_base_init(&p->mInterface, vt); dcVecInit(&p->mVecHead, size); p->i = 0; p->s = 0; p->d = 0; return (DCCallVM*)p; } static void mode(DCCallVM* in_self,DCint mode); static void deinit(DCCallVM* in_self) { dcFreeMem(in_self); } static void reset(DCCallVM* in_p) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; p->i = 0; p->s = 0; p->d = 0; dcVecResize(&p->mVecHead, 16); } static void a_int(DCCallVM* in_self, DCint x) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_self; if (p->i < 16) { * (DCint*) dcVecAt(&p->mVecHead, p->i) = x; p->i += 4; } else { dcVecAppend(&p->mVecHead, &x, sizeof(DCint)); } } static void a_bool (DCCallVM* in_self, DCbool x) { a_int(in_self, (DCint)x); } static void a_char (DCCallVM* in_self, DCchar x) { a_int(in_self, x); } static void a_short (DCCallVM* in_self, DCshort x) { a_int(in_self, x); } static void a_long (DCCallVM* in_self, DClong x) { a_int(in_self, x); } static void a_longlong(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_self; p->i = (p->i+4) & -8; if (p->i < 16) { * (DClonglong*) dcVecAt(&p->mVecHead, p->i) = x; p->i += 8; } else { /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&p->mVecHead, dcVecSize(&p->mVecHead) & 4); dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong)); } } static void a_pointer(DCCallVM* in_p, DCpointer x) { a_int(in_p, (DCint) x ); } static void a_float(DCCallVM* in_p, DCfloat x) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; if (p->s < 16) { p->S[p->s++] = x; if (p->d < p->s) { p->d = (p->s+1) & ~(1U); } else { p->s = p->d; } } else { dcVecAppend(&p->mVecHead, &x, sizeof(DCfloat)); } } static void a_double(DCCallVM* in_p, DCdouble x) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; if (p->d < 16) { * (double*) &p->S[p->d] = x; p->d += 2; if (!(p->s & 1)) { /* if s is even it always equals d. otherwise, s points to an odd float register. */ p->s = p->d; } } else { p->s = 16; union { DCdouble d; DCchar b[8]; } v; // ,w; v.d = x; #if 0 w.b[0] = v.b[7]; w.b[1] = v.b[6]; w.b[2] = v.b[5]; w.b[3] = v.b[4]; w.b[4] = v.b[3]; w.b[5] = v.b[2]; w.b[6] = v.b[1]; w.b[7] = v.b[0]; #endif /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&p->mVecHead, dcVecSize(&p->mVecHead) & 4); dcVecAppend(&p->mVecHead, &v.b[0], sizeof(DCdouble)); } } void call(DCCallVM* in_p, DCpointer target) { DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; dcCall_arm32_armhf(target, dcVecData(&p->mVecHead), dcVecSize(&p->mVecHead), &p->S[0]); } DCCallVM_vt vt_armhf = { &deinit , &reset , &mode , &a_bool , &a_char , &a_short , &a_int , &a_long , &a_longlong , &a_float , &a_double , &a_pointer , NULL /* argStruct */ , (DCvoidvmfunc*) &call , (DCboolvmfunc*) &call , (DCcharvmfunc*) &call , (DCshortvmfunc*) &call , (DCintvmfunc*) &call , (DClongvmfunc*) &call , (DClonglongvmfunc*) &call , (DCfloatvmfunc*) &call , (DCdoublevmfunc*) &call , (DCpointervmfunc*) &call , NULL /* callStruct */ }; DCCallVM* dcNewCallVM(DCsize size) { #if defined(DC__ABI_ARM_EABI) return dc_callvm_new_arm32_arm(&eabi, size); #elif defined(DC__ABI_ARM_HF) return dc_callvm_new_arm32_armhf(&vt_armhf, size); #elif defined(DC__ABI_ARM_OABI) return dc_callvm_new_arm32_arm(&oabi, size); #else #error unknown ARM abi #endif } static void mode(DCCallVM* in_self,DCint mode) { DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: case DC_CALL_C_ARM_ARMHF: vt = &vt_armhf; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.h0000755000175000017500000000307212456307246025067 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_armhf.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armcall REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLVM_ARM32_ARM_ARMHF_H #define DYNCALL_CALLVM_ARM32_ARM_ARMHF_H #include "dyncall_call_arm32_arm_armhf.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; unsigned int i; unsigned int s; unsigned int d; DCfloat S[16]; DCpointer mpCallFunc; DCVecHead mVecHead; } DCCallVM_arm32_armhf; DCCallVM* dcNewCallVM_arm32_armhf(DCsize size); #endif /* DYNCALL_CALLVM_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.c0000644000175000017500000002024712456307246024245 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_thumb.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armthumbcall REVISION 2007/12/11 initial */ #include "dyncall_callvm_arm32_thumb.h" #include "dyncall_alloc.h" static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self,DCint mode); static DCCallVM* dc_callvm_new_arm32_thumb(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)dcAllocMem(sizeof(DCCallVM_arm32_thumb)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_arm32_thumb(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_arm32_thumb(DCCallVM* in_self) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecReset(&self->mVecHead); } static void dc_callvm_argInt_arm32_thumb(DCCallVM* in_self, DCint x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } static void dc_callvm_argBool_arm32_thumb(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_arm32_thumb(in_self, (DCint)x); } static void dc_callvm_argChar_arm32_thumb(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argShort_arm32_thumb(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argLong_arm32_thumb(DCCallVM* in_self, DClong x) { dc_callvm_argInt_arm32_thumb(in_self, x); } static void dc_callvm_argLongLong_arm32_thumb(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argLongLong_arm32_thumb_eabi(DCCallVM* in_self, DClonglong x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_arm32_thumb(DCCallVM* in_self, DCfloat x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_arm32_thumb(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argDouble_arm32_thumb_eabi(DCCallVM* in_self, DCdouble x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_arm32_thumb(DCCallVM* in_self, DCpointer x) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } typedef void (*call_void) (DCpointer target, DCpointer data, DCsize size); typedef DClong (*call_word) (DCpointer target, DCpointer data, DCsize size); typedef DClonglong (*call_dword) (DCpointer target, DCpointer data, DCsize size); /* Call. */ void dc_callvm_call_arm32_thumb(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; dcCall_arm32_thumb(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } #if 0 DClong dc_callvm_call_arm32_thumb_word(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; // return dcCall_arm32_thumb_word(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); return ( (call_word) dcCall_arm32_thumb) (target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DClonglong dc_callvm_call_arm32_thumb_dword(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self; // return dcCall_arm32_thumb_dword(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); return ( (call_dword) dcCall_arm32_thumb ) (target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } #endif DCCallVM_vt gVT_arm32_thumb = { &dc_callvm_free_arm32_thumb , &dc_callvm_reset_arm32_thumb , &dc_callvm_mode_arm32_thumb , &dc_callvm_argBool_arm32_thumb , &dc_callvm_argChar_arm32_thumb , &dc_callvm_argShort_arm32_thumb , &dc_callvm_argInt_arm32_thumb , &dc_callvm_argLong_arm32_thumb , &dc_callvm_argLongLong_arm32_thumb , &dc_callvm_argFloat_arm32_thumb , &dc_callvm_argDouble_arm32_thumb , &dc_callvm_argPointer_arm32_thumb , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb , (DCintvmfunc*) &dc_callvm_call_arm32_thumb , (DClongvmfunc*) &dc_callvm_call_arm32_thumb , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb , NULL /* callStruct */ }; DCCallVM_vt gVT_arm32_thumb_eabi = { &dc_callvm_free_arm32_thumb , &dc_callvm_reset_arm32_thumb , &dc_callvm_mode_arm32_thumb , &dc_callvm_argBool_arm32_thumb , &dc_callvm_argChar_arm32_thumb , &dc_callvm_argShort_arm32_thumb , &dc_callvm_argInt_arm32_thumb , &dc_callvm_argLong_arm32_thumb , &dc_callvm_argLongLong_arm32_thumb_eabi , &dc_callvm_argFloat_arm32_thumb , &dc_callvm_argDouble_arm32_thumb_eabi , &dc_callvm_argPointer_arm32_thumb , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb , (DCintvmfunc*) &dc_callvm_call_arm32_thumb , (DClongvmfunc*) &dc_callvm_call_arm32_thumb , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_arm32_thumb(DCsize size) { /* Check OS if we need EABI as default. */ #if defined(DC__ABI_ARM_EABI) return dc_callvm_new_arm32_thumb(&gVT_arm32_thumb_eabi, size); #else return dc_callvm_new_arm32_thumb(&gVT_arm32_thumb, size); #endif } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_arm32_thumb(size); } static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self,DCint mode) { DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*) in_self; DCCallVM_vt* vt; switch(mode) { /* Check OS if we need EABI as default. */ case DC_CALL_C_ELLIPSIS: #if defined(DC__ABI_ARM_EABI) case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb_eabi; break; #else case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb; break; #endif case DC_CALL_C_ARM_THUMB: vt = &gVT_arm32_thumb; break; case DC_CALL_C_ARM_THUMB_EABI: vt = &gVT_arm32_thumb_eabi; break; default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.h0000644000175000017500000000274012456307246024250 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm32_thumb.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit ARM32 family of processors SUPPORTED CALLING CONVENTIONS armthumbcall REVISION 2008/08/12 initial */ #ifndef DYNCALL_CALLVM_ARM32_THUMB_H #define DYNCALL_CALLVM_ARM32_THUMB_H #include "dyncall_call_arm32_thumb.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; DCpointer mpCallFunc; DCVecHead mVecHead; } DCCallVM_arm32_thumb; DCCallVM* dcNewCallVM_arm32_thumb(DCsize size); #endif /* DYNCALL_CALLVM_ARM32_THUMB_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm64.c0000755000175000017500000000773512466674236023074 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm64.c Description: ARM 64-bit ABI implementation License: Copyright (c) 2007-2012 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_arm64.h" #include "dyncall_alloc.h" static DCCallVM* dc_callvm_new_arm64(DCCallVM_vt* vt, DCsize size) { DCCallVM_arm64* p = (DCCallVM_arm64*) dcAllocMem(size); dc_callvm_base_init(&p->mInterface, vt); dcVecInit(&p->mVecHead, size); p->i = 0; p->f = 0; return (DCCallVM*)p; } static void reset(DCCallVM* in_p) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; p->i = 0; p->f = 0; dcVecReset(&p->mVecHead); } static void mode(DCCallVM* in_self,DCint mode); static void deinit(DCCallVM* in_self) { dcFreeMem(in_self); } static void a_i64(DCCallVM* in_self, DClonglong x) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_self; if (p->i < 8) { p->I[p->i] = x; p->i++; } else { dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong)); } } static void a_bool (DCCallVM* self, DCbool x) { a_i64(self, (DClonglong)x); } static void a_char (DCCallVM* self, DCchar x) { a_i64(self, x); } static void a_short (DCCallVM* self, DCshort x) { a_i64(self, x); } static void a_int (DCCallVM* self, DCint x) { a_i64(self, x); } static void a_long (DCCallVM* self, DClong x) { a_i64(self, x); } static void a_pointer (DCCallVM* self, DCpointer x) { a_i64(self, (DClonglong) x ); } static void a_float(DCCallVM* in_p, DCfloat x) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->f < 8) { p->u.S[ p->f << 1 ] = x; p->f++; } else { dcVecAppend(&p->mVecHead, &x, sizeof(DCfloat)); dcVecSkip(&p->mVecHead, 4); /* align to 8-bytes */ } } static void a_double(DCCallVM* in_p, DCdouble x) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->f < 8) { p->u.D[ p->f ] = x; p->f++; } else { dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble)); } } void call(DCCallVM* in_p, DCpointer target) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; /* ** copy 'size' argument is given in number of 16-byte 'pair' blocks. */ dcCall_arm64(target, dcVecData(&p->mVecHead), ( dcVecSize(&p->mVecHead) + 15 ) & -16, &p->u.S[0]); } DCCallVM_vt vt_arm64 = { &deinit , &reset , &mode , &a_bool , &a_char , &a_short , &a_int , &a_long , &a_i64 , &a_float , &a_double , &a_pointer , NULL /* argStruct */ , (DCvoidvmfunc*) &call , (DCboolvmfunc*) &call , (DCcharvmfunc*) &call , (DCshortvmfunc*) &call , (DCintvmfunc*) &call , (DClongvmfunc*) &call , (DClonglongvmfunc*) &call , (DCfloatvmfunc*) &call , (DCdoublevmfunc*) &call , (DCpointervmfunc*) &call , NULL /* callStruct */ }; DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_arm64(&vt_arm64, size); } static void mode(DCCallVM* in_self,DCint mode) { DCCallVM_arm64* self = (DCCallVM_arm64*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: case DC_CALL_C_ARM64: vt = &vt_arm64; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_arm64.h0000755000175000017500000000302312466674236023063 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_arm64.h Description: License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_ARM64_H #define DYNCALL_CALLVM_ARM64_H #include "dyncall_call_arm64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; unsigned int i; /* int register counter */ unsigned int f; /* float register counter */ union { /* float register buffer */ DCfloat S[16]; DCdouble D[8]; } u; unsigned long long I[8]; /* int register buffer */ DCVecHead mVecHead; /* argument buffer head */ } DCCallVM_arm64; DCCallVM* dcNewCallVM_arm64(DCsize size); #endif /* DYNCALL_CALLVM_ARM64_DEBIAN_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_base.c0000644000175000017500000000225112456307246023027 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_base.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm.h" void dc_callvm_base_init(DCCallVM* pInstance, DCCallVM_vt* pVTable) { pInstance->mVTpointer = pVTable; pInstance->mError = DC_ERROR_NONE; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips.c0000644000175000017500000000243412456307246023070 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips.c Description: ARM 32-bit "thumb" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(__GNUC__) #if defined(DC__ABI_MIPS_O32) #include "dyncall_callvm_mips_o32.c" #elif defined(DC__ABI_MIPS_N64) #include "dyncall_callvm_mips_n64.c" #elif defined(DC__ABI_MIPS_N32) #include "dyncall_callvm_mips_n32.c" #else #include "dyncall_callvm_mips_eabi.c" #endif #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips.h0000644000175000017500000000227012456307246023073 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_H #define DYNCALL_CALLVM_MIPS_H /* Suported ABIs: */ #include "dyncall_callvm_mips_o32.h" #include "dyncall_callvm_mips_eabi.h" #include "dyncall_callvm_mips_n64.h" #endif /* DYNCALL_CALLVM_MIPS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.c0000644000175000017500000001263012456307246024047 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_eabi.c Description: Implementation of Call VM for mips "eabi" abi. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_mips_eabi.h" #include "dyncall_alloc.h" static void dc_callvm_reset_mips_eabi(DCCallVM* in_self) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; self->mSingleRegs = 0; } static DCCallVM* dc_callvm_new_mips_eabi(DCCallVM_vt* vt, DCsize size) { /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)dcAllocMem(sizeof(DCCallVM_mips_eabi)+size+16); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_eabi( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_eabi(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_mode_mips_eabi(DCCallVM* in_self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_MIPS32_EABI: break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; } } /* arg int -- fillup integer register file OR push on stack */ static void dc_callvm_argInt_mips_eabi(DCCallVM* in_self, DCint i) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; else dcVecAppend(&self->mVecHead, &i, sizeof(DCint)); } static void dc_callvm_argPointer_mips_eabi(DCCallVM* in_self, DCpointer x) { dc_callvm_argInt_mips_eabi(in_self, * (DCint*) &x ); } static void dc_callvm_argBool_mips_eabi(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argChar_mips_eabi(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argShort_mips_eabi(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argLong_mips_eabi(DCCallVM* in_self, DClong x) { dc_callvm_argInt_mips_eabi(in_self, (DCint)x); } static void dc_callvm_argLongLong_mips_eabi(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; if (self->mIntRegs < 7) { DCint* p = (DCint*) &Lv; /* skip odd register (align 64 bit) */ self->mIntRegs += self->mIntRegs & 1; self->mRegData.mIntData[self->mIntRegs++] = p[0]; self->mRegData.mIntData[self->mIntRegs++] = p[1]; } else { self->mIntRegs = 8; /* 64 bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } } static void dc_callvm_argFloat_mips_eabi(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; if (self->mSingleRegs < 8) { self->mRegData.mSingleData[self->mSingleRegs++] = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); } } static void dc_callvm_argDouble_mips_eabi(DCCallVM* in_self, DCdouble x) { DClonglong* p = (DClonglong*) &x; dc_callvm_argLongLong_mips_eabi(in_self, *p); } /* Call. */ void dc_callvm_call_mips_eabi(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; dcCall_mips_eabi(target, &self->mRegData, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } DCCallVM_vt gVT_mips_eabi = { &dc_callvm_free_mips_eabi , &dc_callvm_reset_mips_eabi , &dc_callvm_mode_mips_eabi , &dc_callvm_argBool_mips_eabi , &dc_callvm_argChar_mips_eabi , &dc_callvm_argShort_mips_eabi , &dc_callvm_argInt_mips_eabi , &dc_callvm_argLong_mips_eabi , &dc_callvm_argLongLong_mips_eabi , &dc_callvm_argFloat_mips_eabi , &dc_callvm_argDouble_mips_eabi , &dc_callvm_argPointer_mips_eabi , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_eabi , (DCboolvmfunc*) &dc_callvm_call_mips_eabi , (DCcharvmfunc*) &dc_callvm_call_mips_eabi , (DCshortvmfunc*) &dc_callvm_call_mips_eabi , (DCintvmfunc*) &dc_callvm_call_mips_eabi , (DClongvmfunc*) &dc_callvm_call_mips_eabi , (DClonglongvmfunc*) &dc_callvm_call_mips_eabi , (DCfloatvmfunc*) &dc_callvm_call_mips_eabi , (DCdoublevmfunc*) &dc_callvm_call_mips_eabi , (DCpointervmfunc*) &dc_callvm_call_mips_eabi , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_mips_eabi(DCsize size) { return dc_callvm_new_mips_eabi(&gVT_mips_eabi, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_eabi(size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.h0000644000175000017500000000277312456307246024063 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_eabi.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 32bit MIPS family of processors SUPPORTED CALLING CONVENTIONS eabi REVISION 2008/01/03 initial */ #ifndef DYNCALL_CALLVM_MIPS_EABI_H #define DYNCALL_CALLVM_MIPS_EABI_H #include "dyncall_call_mips_eabi.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; int mIntRegs; int mSingleRegs; struct DCRegData_mips_eabi mRegData; DCVecHead mVecHead; } DCCallVM_mips_eabi; DCCallVM* dcNewCallVM_mips_eabi(DCsize size); #endif /* DYNCALL_CALLVM_MIPS_EABI_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n32.c0000644000175000017500000001720512456307246023554 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n32.c Description: mips "n32" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 64bit MIPS family of processors SUPPORTED CALLING CONVENTIONS n32 REVISION 2010/05/30 initial in contrast to o32, there is no space reserved for parameters passed over registers. more registers are used and registers are always used. stack is always 16-byte aligned at entry (call to call-kernel automatically aligns argument stack. integer and float register-file is interleaved either taking one slot up skipping the other. */ #include "dyncall_callvm_mips_n32.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_n32(DCCallVM* in_self) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; dcVecReset(&self->mVecHead); self->mRegCount = 0; self->mRegData.mUseDouble = 0LL; } static DCCallVM* dc_callvm_new_mips_n32(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)dcAllocMem(sizeof(DCCallVM_mips_n32)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_n32( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_n32(DCCallVM* in_self) { dcFreeMem(in_self); } /* pass arguments : - promote to 64-bit integer. - fill up integers and float - left-to-right otherwise go over stack. */ /* arg int -- fillup 64-bit integer register file OR push on stack */ static void dc_callvm_argLongLong_mips_n32(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; /* fillup integer register file */ if (self->mRegCount < 8) self->mRegData.mIntData[self->mRegCount++] = Lv; else dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } static void dc_callvm_argInt_mips_n32(DCCallVM* in_self, DCint i) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong) i ); } static void dc_callvm_argPointer_mips_n32(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_mips_n32(in_self, * (DClonglong*) &x ); } static void dc_callvm_argBool_mips_n32(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argChar_mips_n32(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argShort_mips_n32(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argLong_mips_n32(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_mips_n32(in_self, (DClonglong)x); } static void dc_callvm_argDouble_mips_n32(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; if (self->mRegCount < 8) { self->mRegData.mUseDouble |= 1<<( self->mRegCount ); self->mRegData.mFloatData[self->mRegCount++].d = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } } static void dc_callvm_argFloat_mips_n32(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; if (self->mRegCount < 8) { /*self->mRegData.mFloatData[self->mRegCount++].d = (DCdouble) x;*/ self->mRegData.mFloatData[self->mRegCount++].f = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); dcVecSkip(&self->mVecHead, sizeof(DCfloat) ); } } /* Ellipsis calls: - float is promoted to double (due to ANSI C). - double is passed via integer register-file (due to MIPS ABI). */ static void dc_callvm_argDouble_mips_n32_ellipsis(DCCallVM* in_self, DCdouble x) { dc_callvm_argLongLong_mips_n32(in_self, * ( (DClonglong*) &x ) ); } static void dc_callvm_argFloat_mips_n32_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_mips_n32_ellipsis(in_self, (DCdouble) x ); } /* Call. */ void dc_callvm_call_mips_n32(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_n32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } /* Forward Declaration. */ static void dc_callvm_mode_mips_n32(DCCallVM* in_self,DCint mode); DCCallVM_vt gVT_mips_n32 = { &dc_callvm_free_mips_n32 , &dc_callvm_reset_mips_n32 , &dc_callvm_mode_mips_n32 , &dc_callvm_argBool_mips_n32 , &dc_callvm_argChar_mips_n32 , &dc_callvm_argShort_mips_n32 , &dc_callvm_argInt_mips_n32 , &dc_callvm_argLong_mips_n32 , &dc_callvm_argLongLong_mips_n32 , &dc_callvm_argFloat_mips_n32 , &dc_callvm_argDouble_mips_n32 , &dc_callvm_argPointer_mips_n32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n32 , (DCboolvmfunc*) &dc_callvm_call_mips_n32 , (DCcharvmfunc*) &dc_callvm_call_mips_n32 , (DCshortvmfunc*) &dc_callvm_call_mips_n32 , (DCintvmfunc*) &dc_callvm_call_mips_n32 , (DClongvmfunc*) &dc_callvm_call_mips_n32 , (DClonglongvmfunc*) &dc_callvm_call_mips_n32 , (DCfloatvmfunc*) &dc_callvm_call_mips_n32 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 , NULL /* callStruct */ }; DCCallVM_vt gVT_mips_n32_ellipsis = { &dc_callvm_free_mips_n32 , &dc_callvm_reset_mips_n32 , &dc_callvm_mode_mips_n32 , &dc_callvm_argBool_mips_n32 , &dc_callvm_argChar_mips_n32 , &dc_callvm_argShort_mips_n32 , &dc_callvm_argInt_mips_n32 , &dc_callvm_argLong_mips_n32 , &dc_callvm_argLongLong_mips_n32 , &dc_callvm_argFloat_mips_n32_ellipsis , &dc_callvm_argDouble_mips_n32_ellipsis , &dc_callvm_argPointer_mips_n32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n32 , (DCboolvmfunc*) &dc_callvm_call_mips_n32 , (DCcharvmfunc*) &dc_callvm_call_mips_n32 , (DCshortvmfunc*) &dc_callvm_call_mips_n32 , (DCintvmfunc*) &dc_callvm_call_mips_n32 , (DClongvmfunc*) &dc_callvm_call_mips_n32 , (DClonglongvmfunc*) &dc_callvm_call_mips_n32 , (DCfloatvmfunc*) &dc_callvm_call_mips_n32 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 , NULL /* callStruct */ }; static void dc_callvm_mode_mips_n32(DCCallVM* self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: self->mVTpointer = &gVT_mips_n32; break; case DC_CALL_C_ELLIPSIS: self->mVTpointer = &gVT_mips_n32_ellipsis; break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } DCCallVM* dcNewCallVM_mips_n32(DCsize size) { return dc_callvm_new_mips_n32(&gVT_mips_n32, size); } DCCallVM* dcNewCallVM_mips_n32_ellipsis(DCsize size) { return dc_callvm_new_mips_n32(&gVT_mips_n32_ellipsis, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_n32(size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.c0000644000175000017500000001720512456307246023561 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n64.c Description: mips "n64" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for 64bit MIPS family of processors SUPPORTED CALLING CONVENTIONS n64 REVISION 2010/05/30 initial in contrast to o32, there is no space reserved for parameters passed over registers. more registers are used and registers are always used. stack is always 16-byte aligned at entry (call to call-kernel automatically aligns argument stack. integer and float register-file is interleaved either taking one slot up skipping the other. */ #include "dyncall_callvm_mips_n64.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_n64(DCCallVM* in_self) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; dcVecReset(&self->mVecHead); self->mRegCount = 0; self->mRegData.mUseDouble = 0LL; } static DCCallVM* dc_callvm_new_mips_n64(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)dcAllocMem(sizeof(DCCallVM_mips_n64)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_n64( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_n64(DCCallVM* in_self) { dcFreeMem(in_self); } /* pass arguments : - promote to 64-bit integer. - fill up integers and float - left-to-right otherwise go over stack. */ /* arg int -- fillup 64-bit integer register file OR push on stack */ static void dc_callvm_argLongLong_mips_n64(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; /* fillup integer register file */ if (self->mRegCount < 8) self->mRegData.mIntData[self->mRegCount++] = Lv; else dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); } static void dc_callvm_argInt_mips_n64(DCCallVM* in_self, DCint i) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong) i ); } static void dc_callvm_argPointer_mips_n64(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_mips_n64(in_self, * (DClonglong*) &x ); } static void dc_callvm_argBool_mips_n64(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argChar_mips_n64(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argShort_mips_n64(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argLong_mips_n64(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x); } static void dc_callvm_argDouble_mips_n64(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; if (self->mRegCount < 8) { self->mRegData.mUseDouble |= 1<<( self->mRegCount ); self->mRegData.mFloatData[self->mRegCount++].d = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } } static void dc_callvm_argFloat_mips_n64(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; if (self->mRegCount < 8) { /*self->mRegData.mFloatData[self->mRegCount++].d = (DCdouble) x;*/ self->mRegData.mFloatData[self->mRegCount++].f = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); dcVecSkip(&self->mVecHead, sizeof(DCfloat) ); } } /* Ellipsis calls: - float is promoted to double (due to ANSI C). - double is passed via integer register-file (due to MIPS ABI). */ static void dc_callvm_argDouble_mips_n64_ellipsis(DCCallVM* in_self, DCdouble x) { dc_callvm_argLongLong_mips_n64(in_self, * ( (DClonglong*) &x ) ); } static void dc_callvm_argFloat_mips_n64_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_mips_n64_ellipsis(in_self, (DCdouble) x ); } /* Call. */ void dc_callvm_call_mips_n64(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_n64(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } /* Forward Declaration. */ static void dc_callvm_mode_mips_n64(DCCallVM* in_self,DCint mode); DCCallVM_vt gVT_mips_n64 = { &dc_callvm_free_mips_n64 , &dc_callvm_reset_mips_n64 , &dc_callvm_mode_mips_n64 , &dc_callvm_argBool_mips_n64 , &dc_callvm_argChar_mips_n64 , &dc_callvm_argShort_mips_n64 , &dc_callvm_argInt_mips_n64 , &dc_callvm_argLong_mips_n64 , &dc_callvm_argLongLong_mips_n64 , &dc_callvm_argFloat_mips_n64 , &dc_callvm_argDouble_mips_n64 , &dc_callvm_argPointer_mips_n64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n64 , (DCboolvmfunc*) &dc_callvm_call_mips_n64 , (DCcharvmfunc*) &dc_callvm_call_mips_n64 , (DCshortvmfunc*) &dc_callvm_call_mips_n64 , (DCintvmfunc*) &dc_callvm_call_mips_n64 , (DClongvmfunc*) &dc_callvm_call_mips_n64 , (DClonglongvmfunc*) &dc_callvm_call_mips_n64 , (DCfloatvmfunc*) &dc_callvm_call_mips_n64 , (DCdoublevmfunc*) &dc_callvm_call_mips_n64 , (DCpointervmfunc*) &dc_callvm_call_mips_n64 , NULL /* callStruct */ }; DCCallVM_vt gVT_mips_n64_ellipsis = { &dc_callvm_free_mips_n64 , &dc_callvm_reset_mips_n64 , &dc_callvm_mode_mips_n64 , &dc_callvm_argBool_mips_n64 , &dc_callvm_argChar_mips_n64 , &dc_callvm_argShort_mips_n64 , &dc_callvm_argInt_mips_n64 , &dc_callvm_argLong_mips_n64 , &dc_callvm_argLongLong_mips_n64 , &dc_callvm_argFloat_mips_n64_ellipsis , &dc_callvm_argDouble_mips_n64_ellipsis , &dc_callvm_argPointer_mips_n64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_n64 , (DCboolvmfunc*) &dc_callvm_call_mips_n64 , (DCcharvmfunc*) &dc_callvm_call_mips_n64 , (DCshortvmfunc*) &dc_callvm_call_mips_n64 , (DCintvmfunc*) &dc_callvm_call_mips_n64 , (DClongvmfunc*) &dc_callvm_call_mips_n64 , (DClonglongvmfunc*) &dc_callvm_call_mips_n64 , (DCfloatvmfunc*) &dc_callvm_call_mips_n64 , (DCdoublevmfunc*) &dc_callvm_call_mips_n64 , (DCpointervmfunc*) &dc_callvm_call_mips_n64 , NULL /* callStruct */ }; static void dc_callvm_mode_mips_n64(DCCallVM* self,DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: self->mVTpointer = &gVT_mips_n64; break; case DC_CALL_C_ELLIPSIS: self->mVTpointer = &gVT_mips_n64_ellipsis; break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } DCCallVM* dcNewCallVM_mips_n64(DCsize size) { return dc_callvm_new_mips_n64(&gVT_mips_n64, size); } DCCallVM* dcNewCallVM_mips_n64_ellipsis(DCsize size) { return dc_callvm_new_mips_n64(&gVT_mips_n64_ellipsis, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_n64(size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.h0000644000175000017500000000267612456307246023574 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_n64.h Description: mips "n64" ABI callvm C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_N64_H #define DYNCALL_CALLVM_MIPS_N64_H #include "dyncall_call_mips_n64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" #ifdef __cplusplus extern "C" { #endif typedef struct { DCCallVM mInterface; int mRegCount; struct DCRegData_mips_n64 mRegData; DCVecHead mVecHead; } DCCallVM_mips_n64; DCCallVM* dcNewCallVM_mips_n64(DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALLVM_MIPS_N64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.c0000644000175000017500000001516412456307246023557 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_o32.c Description: mips "o32" ABI callvm implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for mips o32 abi REVISION 2010/06/03 initial NOTES: we need an argument counter for supporting floating point arguments correctly. first two (if any) double/float arguments are mapped via a common structure -- code must take care to write the right float argument indices which differs on C and Assembly-side depending on endianness. (therefore both sources have two variants 'mipseb' and 'mipsel'.) (only for the first two float/double arguments) see float/double handling although, the abi does not expect usage of floats if first argument is not floating point, the call kernel can be used universal for all cases. */ #include "dyncall_callvm_mips_o32.h" #include "dyncall_alloc.h" #include "dyncall_utils.h" static void dc_callvm_reset_mips_o32(DCCallVM* in_self) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecReset(&self->mVecHead); self->mArgCount = 0; } static DCCallVM* dc_callvm_new_mips_o32(DCCallVM_vt* vt, DCsize size) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead, size); dc_callvm_reset_mips_o32( (DCCallVM*) self ); return (DCCallVM*)self; } static void dc_callvm_free_mips_o32(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_mode_mips_o32(DCCallVM* self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_MIPS32_O32: break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* arg int -- fillup integer register file OR push on stack */ static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecAppend(&self->mVecHead, &i, sizeof(DCint)); self->mArgCount++; } static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x) { dc_callvm_argInt_mips_o32(in_self, * (DCint*) &x ); } static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argChar_mips_o32(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argShort_mips_o32(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argLong_mips_o32(DCCallVM* in_self, DClong x) { dc_callvm_argInt_mips_o32(in_self, (DCint)x); } static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong Lv) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &Lv, sizeof(DClonglong)); self->mArgCount += 1; } static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); if (self->mArgCount < 2) { #if defined(__MIPSEL__) self->mRegData.u[self->mArgCount].f[0] = x; #else self->mRegData.u[self->mArgCount].f[1] = x; #endif #if 0 self->mRegData.u[self->mArgCount].f[1] = x; call kernel mips: lwc1 $f12, 4($5) <--- byte offset 4 lwc1 $f13, 0($5) lwc1 $f14, 12($5) <--- byte offset 12 lwc1 $f15, 8($5) mipsel: lwc1 $f12, 0($5) <--- byte offset 4 lwc1 $f13, 4($5) lwc1 $f14, 8($5) <--- byte offset 12 lwc1 $f15, 12($5) #if defined(__MIPSEL__) /* index 0 and 2 */ self->mRegData.floats[self->mArgCount*2] = x; #else /* index 1 and 3 */ self->mRegData.floats[self->mArgCount*2+1] = x; #endif #endif } self->mArgCount++; } static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* 64-bit values need to be aligned on 8 byte boundaries */ dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4); dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); if (self->mArgCount < 2) self->mRegData.u[self->mArgCount].d = x; self->mArgCount++; } /* Call. */ void dc_callvm_call_mips_o32(DCCallVM* in_self, DCpointer target) { DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; /* at minimum provide 16-bytes which hold the first four integer register as spill area and are automatically loaded to $4-$7 */ size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); } DCCallVM_vt gVT_mips_o32 = { &dc_callvm_free_mips_o32 , &dc_callvm_reset_mips_o32 , &dc_callvm_mode_mips_o32 , &dc_callvm_argBool_mips_o32 , &dc_callvm_argChar_mips_o32 , &dc_callvm_argShort_mips_o32 , &dc_callvm_argInt_mips_o32 , &dc_callvm_argLong_mips_o32 , &dc_callvm_argLongLong_mips_o32 , &dc_callvm_argFloat_mips_o32 , &dc_callvm_argDouble_mips_o32 , &dc_callvm_argPointer_mips_o32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_mips_o32 , (DCboolvmfunc*) &dc_callvm_call_mips_o32 , (DCcharvmfunc*) &dc_callvm_call_mips_o32 , (DCshortvmfunc*) &dc_callvm_call_mips_o32 , (DCintvmfunc*) &dc_callvm_call_mips_o32 , (DClongvmfunc*) &dc_callvm_call_mips_o32 , (DClonglongvmfunc*) &dc_callvm_call_mips_o32 , (DCfloatvmfunc*) &dc_callvm_call_mips_o32 , (DCdoublevmfunc*) &dc_callvm_call_mips_o32 , (DCpointervmfunc*) &dc_callvm_call_mips_o32 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_mips_o32(DCsize size) { return dc_callvm_new_mips_o32(&gVT_mips_o32, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_mips_o32(size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.h0000644000175000017500000000262312456307246023560 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_mips_o32.h Description: mips "o32" ABI callvm C interface. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_MIPS_O32_H #define DYNCALL_CALLVM_MIPS_O32_H #include "dyncall_call_mips_o32.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; int mArgCount; DCRegData_mips_o32 mRegData; DCVecHead mVecHead; } DCCallVM_mips_o32; DCCallVM* dcNewCallVM_mips_o32(DCsize size); #endif /* DYNCALL_CALLVM_MIPS_O32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.c0000644000175000017500000002712412466674236023061 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc32.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for ppc32 architectures SUPPORTED CALLING CONVENTIONS ppc32/osx ppc32/linux (sysv abi) ppc32/syscall REVISION 2015/01/15 added syscall (tested on Linux) 2009/01/09 added System V ABI support 2007/12/11 initial support for Darwin ABI */ #include "dyncall_callvm_ppc32.h" #include "dyncall_call_ppc32.h" #include "dyncall_alloc.h" #include "dyncall_macros.h" #include "dyncall_types.h" #include "dyncall_utils.h" /* Support for Mac OS X (Darwin) and Systen V ABI for Power PC 32-bit */ #if defined(DC__OS_Darwin) #define DC__ABI_Darwin #elif defined(DC__OS_Linux) || defined(DC__OS_FreeBSD) || defined(DC__OS_OpenBSD) || defined(DC__OS_NetBSD) || defined(DC__OS_DragonFlyBSD) || defined(DC__OS_SunOS) #define DC__ABI_SysV #else #error Unsupported OS for ppc32 architecture. #endif static void dc_callvm_free_ppc32(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_ppc32(DCCallVM* in_self) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; self->mFloatRegs = 0; } /* OS X/Darwin: fillup integer register file AND push on stack (for ellipsis) */ static void dc_callvm_argInt_ppc32_darwin(DCCallVM* in_self, DCint i) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; /* AND push onto stack */ dcVecAppend(&self->mVecHead,&i,sizeof(DCint)); } static void dc_callvm_argInt_ppc32_sysv(DCCallVM* in_self, DCint i) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = i; /* OR push onto stack */ else dcVecAppend(&self->mVecHead,&i,sizeof(DCint)); } /** floating-point **/ /* double*/ static void dc_callvm_argDouble_ppc32_darwin(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = d; /* skip two integer register file entries */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0]; if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1]; } /* push on stack */ dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble)); } #if 0 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 8) { self->mRegData.mFloatData[self->mFloatRegs++] = d; /* skip two integer register file entries */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0]; if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1]; } /* push on stack */ dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble)); } #endif static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 8) self->mRegData.mFloatData[self->mFloatRegs++] = d; else /* OR push data on stack */ { /* align stack to 8 byte boundary */ dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL ); /* AND push data */ dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble)); } } /* Floating-point */ /* darwin: * - skip one integer register file entry (write in - for ellipsis calls) * sysv: * - */ static void dc_callvm_argFloat_ppc32_darwin(DCCallVM* in_self, DCfloat f) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f); } /* AND skip one integer register file entry (write in - for ellipsis calls) */ if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = *( (DCint*) &f ); /* AND push on stack */ dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat)); } static void dc_callvm_argFloat_ppc32_sysv(DCCallVM* in_self, DCfloat f) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* Put as float register (casted to double) */ if (self->mFloatRegs < 8) self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f); else /* OR put float on stack */ dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat)); } /* long long integer */ static void dc_callvm_argLongLong_ppc32_darwin(DCCallVM* in_self, DClonglong L) { DCint* p = (DCint*) &L; dcArgInt(in_self, p[0]); dcArgInt(in_self, p[1]); } static void dc_callvm_argLongLong_ppc32_sysv(DCCallVM* in_self, DClonglong L) { DCint* p = (DCint*) &L; DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; /* fillup integer register file */ if (self->mIntRegs < 7) { /* next free integer register is even (r0, r2, r3) ? */ /* if not, skip one integer */ if (self->mIntRegs & 1) self->mIntRegs++; self->mRegData.mIntData[self->mIntRegs++] = p[0]; self->mRegData.mIntData[self->mIntRegs++] = p[1]; } /* OR push onto stack */ else { /* in case, mIntRegs == 7, set it to 8 */ self->mIntRegs = 8; /* align stack to 8 byte boundary */ dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7 ) & (-8UL) ); /* push data */ dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong)); } } static void dc_callvm_argBool_ppc32(DCCallVM* in_self, DCbool x) { /* promote to integer */ dcArgInt(in_self, (x == 0) ? DC_FALSE : DC_TRUE ); } static void dc_callvm_argChar_ppc32(DCCallVM* in_self, DCchar ch) { /* promote to integer */ dcArgInt(in_self, (DCint) ch ); } static void dc_callvm_argShort_ppc32(DCCallVM* in_self, DCshort s) { /* promote to integer */ dcArgInt(in_self, (DCint) s ); } static void dc_callvm_argLong_ppc32(DCCallVM* in_self, DClong l) { /* promote to integer */ dcArgInt(in_self, (DCint) l ); } static void dc_callvm_argPointer_ppc32(DCCallVM* in_self, DCpointer p) { /* promote to integer */ dcArgInt(in_self, *(DCint*) &p ); } void dc_callvm_call_ppc32_darwin(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self; dcCall_ppc32_darwin( target, &self->mRegData, DC_MAX(dcVecSize(&self->mVecHead), 8*4), dcVecData(&self->mVecHead) ); } void dc_callvm_call_ppc32_sysv(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self; dcCall_ppc32_sysv( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead)); } void dc_callvm_call_ppc32_syscall(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self; dcCall_ppc32_syscall( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead)); } void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_ppc32_darwin = { &dc_callvm_free_ppc32 , &dc_callvm_reset_ppc32 , &dc_callvm_mode_ppc32 , &dc_callvm_argBool_ppc32 , &dc_callvm_argChar_ppc32 , &dc_callvm_argShort_ppc32 , &dc_callvm_argInt_ppc32_darwin , &dc_callvm_argLong_ppc32 , &dc_callvm_argLongLong_ppc32_darwin , &dc_callvm_argFloat_ppc32_darwin , &dc_callvm_argDouble_ppc32_darwin , &dc_callvm_argPointer_ppc32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc32_darwin , (DCboolvmfunc*) &dc_callvm_call_ppc32_darwin , (DCcharvmfunc*) &dc_callvm_call_ppc32_darwin , (DCshortvmfunc*) &dc_callvm_call_ppc32_darwin , (DCintvmfunc*) &dc_callvm_call_ppc32_darwin , (DClongvmfunc*) &dc_callvm_call_ppc32_darwin , (DClonglongvmfunc*) &dc_callvm_call_ppc32_darwin , (DCfloatvmfunc*) &dc_callvm_call_ppc32_darwin , (DCdoublevmfunc*) &dc_callvm_call_ppc32_darwin , (DCpointervmfunc*) &dc_callvm_call_ppc32_darwin , NULL /* callStruct */ }; DCCallVM_vt gVT_ppc32_sysv = { &dc_callvm_free_ppc32 , &dc_callvm_reset_ppc32 , &dc_callvm_mode_ppc32 , &dc_callvm_argBool_ppc32 , &dc_callvm_argChar_ppc32 , &dc_callvm_argShort_ppc32 , &dc_callvm_argInt_ppc32_sysv , &dc_callvm_argLong_ppc32 , &dc_callvm_argLongLong_ppc32_sysv , &dc_callvm_argFloat_ppc32_sysv , &dc_callvm_argDouble_ppc32_sysv , &dc_callvm_argPointer_ppc32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc32_sysv , (DCboolvmfunc*) &dc_callvm_call_ppc32_sysv , (DCcharvmfunc*) &dc_callvm_call_ppc32_sysv , (DCshortvmfunc*) &dc_callvm_call_ppc32_sysv , (DCintvmfunc*) &dc_callvm_call_ppc32_sysv , (DClongvmfunc*) &dc_callvm_call_ppc32_sysv , (DClonglongvmfunc*) &dc_callvm_call_ppc32_sysv , (DCfloatvmfunc*) &dc_callvm_call_ppc32_sysv , (DCdoublevmfunc*) &dc_callvm_call_ppc32_sysv , (DCpointervmfunc*) &dc_callvm_call_ppc32_sysv , NULL /* callStruct */ }; DCCallVM_vt gVT_ppc32_syscall = { &dc_callvm_free_ppc32 , &dc_callvm_reset_ppc32 , &dc_callvm_mode_ppc32 , &dc_callvm_argBool_ppc32 , &dc_callvm_argChar_ppc32 , &dc_callvm_argShort_ppc32 , &dc_callvm_argInt_ppc32_sysv , &dc_callvm_argLong_ppc32 , &dc_callvm_argLongLong_ppc32_sysv , &dc_callvm_argFloat_ppc32_sysv , &dc_callvm_argDouble_ppc32_sysv , &dc_callvm_argPointer_ppc32 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc32_syscall , (DCboolvmfunc*) &dc_callvm_call_ppc32_syscall , (DCcharvmfunc*) &dc_callvm_call_ppc32_syscall , (DCshortvmfunc*) &dc_callvm_call_ppc32_syscall , (DCintvmfunc*) &dc_callvm_call_ppc32_syscall , (DClongvmfunc*) &dc_callvm_call_ppc32_syscall , (DClonglongvmfunc*) &dc_callvm_call_ppc32_syscall , (DCfloatvmfunc*) &dc_callvm_call_ppc32_syscall , (DCdoublevmfunc*) &dc_callvm_call_ppc32_syscall , (DCpointervmfunc*) &dc_callvm_call_ppc32_syscall , NULL /* callStruct */ }; void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode) { DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_PPC32_OSX: #if defined(DC__ABI_Darwin) case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #endif vt = &gVT_ppc32_darwin; break; case DC_CALL_C_PPC32_SYSV: #if defined(DC__ABI_SysV) case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: #endif vt = &gVT_ppc32_sysv; break; case DC_CALL_SYS_DEFAULT: case DC_CALL_SYS_PPC32: vt = &gVT_ppc32_syscall; break; default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } dc_callvm_base_init(&self->mInterface, vt); } DCCallVM* dcNewCallVM(DCsize size) { DCCallVM_ppc32* self = (DCCallVM_ppc32*)dcAllocMem(sizeof(DCCallVM_ppc32)+size); dcVecInit(&self->mVecHead, size); self->mIntRegs = 0; self->mFloatRegs = 0; dc_callvm_mode_ppc32( (DCCallVM*) self, DC_CALL_C_DEFAULT ); return (DCCallVM*)self; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.h0000644000175000017500000000304312456307246023051 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc32.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_PPC32_H #define DYNCALL_CALLVM_PPC32_H /* dyncall callvm for 32bit ppc architectures SUPPORTED CALLING CONVENTIONS standard and ... (ellipsis) calls REVISION 2007/12/11 initial */ #include "dyncall_call_ppc32.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_ppc32_ DCCallVM_ppc32; struct DCCallVM_ppc32_ { DCCallVM mInterface; int mIntRegs; int mFloatRegs; struct DCRegData_ppc32_ mRegData; DCVecHead mVecHead; }; DCCallVM* dcNewCallVM_ppc32(DCsize size); #endif /* DYNCALL_CALLVM_PPC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.c0000644000175000017500000001730212466674236023063 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc64.c Description: License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for ppc64 architectures SUPPORTED CALLING CONVENTIONS ppc64/linux REVISION 2014/08/07 initial support */ #include "dyncall_callvm_ppc64.h" #include "dyncall_call_ppc64.h" #include "dyncall_alloc.h" #include "dyncall_macros.h" #include "dyncall_types.h" /* Support for Power PC 64-bit */ static void dc_callvm_free_ppc64(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_ppc64(DCCallVM* in_self) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; self->mFloatRegs = 0; } /* fillup integer register file AND push on stack (for ellipsis) */ static void dc_callvm_argInt_ppc64(DCCallVM* in_self, DCint i) { /* promote to longlong */ dcArgLongLong(in_self, (DClonglong)i); } /** floating-point **/ /* double*/ static void dc_callvm_argDouble_ppc64(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self; if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = d; if (self->mIntRegs < 8) { self->mRegData.mIntData[self->mIntRegs++] = *( (DClonglong*) &d ); #if DC__ABI_PPC64_ELF_V == 2 return; #endif } } #if DC__ABI_PPC64_ELF_V == 2 if (dcVecSize(&self->mVecHead) == 0) { dcVecSkip(&self->mVecHead,sizeof(DClonglong)*8); } #endif /* push on stack */ dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble)); } #if DC__ABI_PPC64_ELF_V == 2 static void dc_callvm_argDouble_ppc64_ellipsis(DCCallVM* in_self, DCdouble d) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self; if (dcVecSize(&self->mVecHead) == 0) dcVecSkip(&self->mVecHead,(sizeof(DClonglong))*(self->mIntRegs)); if (self->mFloatRegs < 13) { self->mRegData.mFloatData[self->mFloatRegs++] = d; if (self->mIntRegs < 8) { self->mRegData.mIntData[self->mIntRegs++] = *( (DClonglong*) &d ); } } /* push on stack */ dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble)); } #endif /* Floating-point */ static void dc_callvm_argFloat_ppc64(DCCallVM* in_self, DCfloat f) { /* promote to double */ dcArgDouble(in_self, (DCdouble) f ); } /* long long integer */ static void dc_callvm_argLongLong_ppc64(DCCallVM* in_self, DClonglong L) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self; /* fillup integer register file */ if (self->mIntRegs < 8) { self->mRegData.mIntData[self->mIntRegs++] = L; #if DC__ABI_PPC64_ELF_V == 2 return; #endif } #if DC__ABI_PPC64_ELF_V == 2 if (dcVecSize(&self->mVecHead) == 0) { dcVecSkip(&self->mVecHead,sizeof(DClonglong)*8); } #endif /* push on stack */ dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong)); } #if DC__ABI_PPC64_ELF_V == 2 static void dc_callvm_argLongLong_ppc64_ellipsis(DCCallVM* in_self, DClonglong L) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self; if (dcVecSize(&self->mVecHead) == 0) dcVecSkip(&self->mVecHead,(sizeof(DClonglong))*(self->mIntRegs)); if (self->mIntRegs < 8) self->mRegData.mIntData[self->mIntRegs++] = L; /* push on stack */ dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong)); } #endif static void dc_callvm_argBool_ppc64(DCCallVM* in_self, DCbool x) { /* promote to longlong */ dcArgLongLong(in_self, (DClonglong) x ); } static void dc_callvm_argChar_ppc64(DCCallVM* in_self, DCchar ch) { /* promote to longlong */ dcArgLongLong(in_self, (DClonglong) ch ); } static void dc_callvm_argShort_ppc64(DCCallVM* in_self, DCshort s) { /* promote to longlong */ dcArgLongLong(in_self, (DClonglong) s ); } static void dc_callvm_argLong_ppc64(DCCallVM* in_self, DClong l) { /* promote to longlong */ dcArgLongLong(in_self, (DClonglong) l ); } static void dc_callvm_argPointer_ppc64(DCCallVM* in_self, DCpointer p) { /* promote to longlong */ dcArgLongLong(in_self, *(DClonglong *) &p ); } void dc_callvm_call_ppc64(DCCallVM* in_self, DCpointer target) { DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self; int size = dcVecSize(&self->mVecHead); if (size < 64) { dcVecSkip(&self->mVecHead, 64-size); } dcCall_ppc64( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead)); } void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_ppc64 = { &dc_callvm_free_ppc64 , &dc_callvm_reset_ppc64 , &dc_callvm_mode_ppc64 , &dc_callvm_argBool_ppc64 , &dc_callvm_argChar_ppc64 , &dc_callvm_argShort_ppc64 , &dc_callvm_argInt_ppc64 , &dc_callvm_argLong_ppc64 , &dc_callvm_argLongLong_ppc64 , &dc_callvm_argFloat_ppc64 , &dc_callvm_argDouble_ppc64 , &dc_callvm_argPointer_ppc64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc64 , (DCboolvmfunc*) &dc_callvm_call_ppc64 , (DCcharvmfunc*) &dc_callvm_call_ppc64 , (DCshortvmfunc*) &dc_callvm_call_ppc64 , (DCintvmfunc*) &dc_callvm_call_ppc64 , (DClongvmfunc*) &dc_callvm_call_ppc64 , (DClonglongvmfunc*) &dc_callvm_call_ppc64 , (DCfloatvmfunc*) &dc_callvm_call_ppc64 , (DCdoublevmfunc*) &dc_callvm_call_ppc64 , (DCpointervmfunc*) &dc_callvm_call_ppc64 , NULL /* callStruct */ }; #if DC__ABI_PPC64_ELF_V == 2 DCCallVM_vt gVT_ppc64_ellipsis = { &dc_callvm_free_ppc64 , &dc_callvm_reset_ppc64 , &dc_callvm_mode_ppc64 , &dc_callvm_argBool_ppc64 , &dc_callvm_argChar_ppc64 , &dc_callvm_argShort_ppc64 , &dc_callvm_argInt_ppc64 , &dc_callvm_argLong_ppc64 , &dc_callvm_argLongLong_ppc64_ellipsis , &dc_callvm_argFloat_ppc64 , &dc_callvm_argDouble_ppc64_ellipsis , &dc_callvm_argPointer_ppc64 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_ppc64 , (DCboolvmfunc*) &dc_callvm_call_ppc64 , (DCcharvmfunc*) &dc_callvm_call_ppc64 , (DCshortvmfunc*) &dc_callvm_call_ppc64 , (DCintvmfunc*) &dc_callvm_call_ppc64 , (DClongvmfunc*) &dc_callvm_call_ppc64 , (DClonglongvmfunc*) &dc_callvm_call_ppc64 , (DCfloatvmfunc*) &dc_callvm_call_ppc64 , (DCdoublevmfunc*) &dc_callvm_call_ppc64 , (DCpointervmfunc*) &dc_callvm_call_ppc64 , NULL /* callStruct */ }; #endif void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode) { DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_PPC64: case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: #if DC__ABI_PPC64_ELF_V == 2 vt = &gVT_ppc64; break; case DC_CALL_C_ELLIPSIS_VARARGS: vt = &gVT_ppc64_ellipsis; break; #else case DC_CALL_C_ELLIPSIS_VARARGS: vt = &gVT_ppc64; break; #endif default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } dc_callvm_base_init(&self->mInterface, vt); } DCCallVM* dcNewCallVM(DCsize size) { DCCallVM_ppc64* self = (DCCallVM_ppc64*)dcAllocMem(sizeof(DCCallVM_ppc64)+size); dcVecInit(&self->mVecHead, size); self->mIntRegs = 0; self->mFloatRegs = 0; dc_callvm_mode_ppc64( (DCCallVM*) self, DC_CALL_C_DEFAULT ); return (DCCallVM*)self; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.h0000644000175000017500000000273612466674236023075 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_ppc64.h Description: License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_PPC64_H #define DYNCALL_CALLVM_PPC64_H /* dyncall callvm for 64bit ppc architectures SUPPORTED CALLING CONVENTIONS standard and ... (ellipsis) calls REVISION 2014/08/07 initial */ #include "dyncall_call_ppc64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_ppc64_ DCCallVM_ppc64; struct DCCallVM_ppc64_ { DCCallVM mInterface; int mIntRegs; int mFloatRegs; struct DCRegData_ppc64_ mRegData; DCVecHead mVecHead; }; DCCallVM* dcNewCallVM_ppc64(DCsize size); #endif /* DYNCALL_CALLVM_PPC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc.c0000644000175000017500000001157412456307246023235 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc.c Description: Call VM for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_sparc.h" #include "dyncall_call_sparc.h" #include "dyncall_utils.h" #include "dyncall_alloc.h" #define DEFAULT_STACK_ALIGN 16 /* Construtor. */ /* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */ static DCCallVM* dc_callvm_new_sparc(DCCallVM_vt* vt, DCsize size) { size=DC_MAX(size,sizeof(void*)*(6+1)); DCCallVM_sparc* self = (DCCallVM_sparc*) dcAllocMem(sizeof(DCCallVM_sparc)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead,size); return (DCCallVM*)self; } /* Destructor. */ static void dc_callvm_free_sparc(DCCallVM* in_self) { dcFreeMem(in_self); } /* Reset argument buffer. */ static void dc_callvm_reset_sparc(DCCallVM* in_self) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecReset(&self->mVecHead); } /* Load integer 32-bit. */ static void dc_callvm_argInt_sparc(DCCallVM* in_self, DCint x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } /* we propagate Bool,Char,Short to Int. */ static void dc_callvm_argBool_sparc(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } static void dc_callvm_argChar_sparc(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } static void dc_callvm_argShort_sparc(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_sparc(in_self, (DCint)x); } /* handle others Pointer, Long, LongLong, Float and Double as-is. */ static void dc_callvm_argPointer_sparc(DCCallVM* in_self, DCpointer x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } static void dc_callvm_argLong_sparc(DCCallVM* in_self, DClong x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClong)); } static void dc_callvm_argLongLong_sparc(DCCallVM* in_self, DClonglong x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argFloat_sparc(DCCallVM* in_self, DCfloat x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)); } static void dc_callvm_argDouble_sparc(DCCallVM* in_self, DCdouble x) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } /* mode: only a single mode available currently. */ static void dc_callvm_mode_sparc(DCCallVM* in_self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_SPARC32: break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* we call directly with 'RTYPE dcCall(DCCallVM* in_self, DCpointer target)' */ #if 0 /* call: delegate to default call kernel */ static void dc_callvm_call_sparc(DCCallVM* in_self, DCpointer target) { DCCallVM_sparc* self = (DCCallVM_sparc*)in_self; dcCall_sparc(target, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } #endif /* CallVM virtual table. */ DCCallVM_vt gVT_sparc = { &dc_callvm_free_sparc, &dc_callvm_reset_sparc, &dc_callvm_mode_sparc, &dc_callvm_argBool_sparc, &dc_callvm_argChar_sparc, &dc_callvm_argShort_sparc, &dc_callvm_argInt_sparc, &dc_callvm_argLong_sparc, &dc_callvm_argLongLong_sparc, &dc_callvm_argFloat_sparc, &dc_callvm_argDouble_sparc, &dc_callvm_argPointer_sparc, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc, (DCboolvmfunc*) &dcCall_sparc, (DCcharvmfunc*) &dcCall_sparc, (DCshortvmfunc*) &dcCall_sparc, (DCintvmfunc*) &dcCall_sparc, (DClongvmfunc*) &dcCall_sparc, (DClonglongvmfunc*) &dcCall_sparc, (DCfloatvmfunc*) &dcCall_sparc, (DCdoublevmfunc*) &dcCall_sparc, (DCpointervmfunc*) &dcCall_sparc, NULL /* callStruct */ }; /* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_sparc(&gVT_sparc,size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc.h0000644000175000017500000000257612456307246023244 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc.h Description: Call VM for sparc processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_SPARC_H #define DYNCALL_CALLVM_SPARC_H #include "dyncall_callvm.h" #include "dyncall_vector.h" /* NOTE: if something changes here, update offset marks in dyncall_call_sparc.S */ typedef struct DCCallVM_sparc_ DCCallVM_sparc; struct DCCallVM_sparc_ { DCCallVM mInterface; /* 8 bytes (vtable,errorid) */ DCVecHead mVecHead; /* 8 bytes (max,size) */ }; DCCallVM* dcNewCallVM_sparc(DCsize size); #endif /* DYNCALL_CALLVM_SPARC_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.c0000644000175000017500000001715712466674236023421 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc64.c Description: Call VM for sparc64 64-bit processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_sparc64.h" #include "dyncall_call_sparc64.h" #include "dyncall_alloc.h" #define IREGS 6 #define FREGS 16 #define SREGS 16 #define DHEAD (IREGS+FREGS)*8+SREGS*4 /* Reset argument buffer. */ static void dc_callvm_reset_sparc64(DCCallVM* in_self) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcVecResize(&self->mVecHead,DHEAD); self->mIntRegs = 0; self->mFloatRegs = 0; self->mUseSingleFlags = 0; } /* Construtor. */ /* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */ static DCCallVM* dc_callvm_new_sparc64(DCCallVM_vt* vt, DCsize size) { DCCallVM_sparc64* self = (DCCallVM_sparc64*) dcAllocMem(sizeof(DCCallVM_sparc64)+DHEAD+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead,DHEAD+size); dc_callvm_reset_sparc64(&self->mInterface); return (DCCallVM*)self; } /* Destructor. */ static void dc_callvm_free_sparc64(DCCallVM* in_self) { dcFreeMem(in_self); } /* all integers are promoted to 64-bit. */ static void dc_callvm_argLongLong_sparc64(DCCallVM* in_self, DClonglong x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; if (self->mIntRegs < IREGS) { * ( (DClonglong*) ( dcVecAt(&self->mVecHead, (self->mIntRegs++)*8) ) ) = x; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } if (self->mFloatRegs < FREGS) self->mFloatRegs++; } static void dc_callvm_argLong_sparc64 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argInt_sparc64 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argBool_sparc64 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argChar_sparc64 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argShort_sparc64 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argPointer_sparc64(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_sparc64(in_self, (DClonglong) x ); } static void dc_callvm_argDouble_sparc64(DCCallVM* in_self, DCdouble x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; if (self->mFloatRegs < FREGS) { * ((double*)dcVecAt(&self->mVecHead,(IREGS+(self->mFloatRegs++))*8)) = x; } if (self->mIntRegs < IREGS) { self->mIntRegs++; } else { dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } } static void dc_callvm_argDouble_sparc64_ellipsis(DCCallVM* in_self, DCdouble x) { union { long long l; double d; } u; u.d = x; dc_callvm_argLongLong_sparc64(in_self, u.l); } static void dc_callvm_argFloat_sparc64_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_sparc64_ellipsis(in_self, (DCdouble) x); } static void dc_callvm_argFloat_sparc64(DCCallVM* in_self, DCfloat x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; if (self->mFloatRegs < FREGS) { self->mUseSingleFlags |= 1<mFloatRegs; * ((float*)dcVecAt(&self->mVecHead,(IREGS+FREGS)*8 + (self->mFloatRegs++)*4)) = x; } if (self->mIntRegs < IREGS) { self->mIntRegs++; } else { union { DCdouble d; DClonglong l; DCfloat f[2]; } u; u.f[1] = x; dcVecAppend(&self->mVecHead, &u.l, sizeof(DClonglong)); } } #if 0 /* call: delegate to default call kernel */ static void dc_callvm_call_sparc64(DCCallVM* in_self, DCpointer target) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcCall_sparc64(target, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } #endif static void dc_callvm_mode_sparc64(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_sparc64_ellipsis = { &dc_callvm_free_sparc64, &dc_callvm_reset_sparc64, &dc_callvm_mode_sparc64, &dc_callvm_argBool_sparc64, &dc_callvm_argChar_sparc64, &dc_callvm_argShort_sparc64, &dc_callvm_argInt_sparc64, &dc_callvm_argLong_sparc64, &dc_callvm_argLongLong_sparc64, &dc_callvm_argFloat_sparc64_ellipsis, &dc_callvm_argDouble_sparc64_ellipsis, &dc_callvm_argPointer_sparc64, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc64, (DCboolvmfunc*) &dcCall_sparc64, (DCcharvmfunc*) &dcCall_sparc64, (DCshortvmfunc*) &dcCall_sparc64, (DCintvmfunc*) &dcCall_sparc64, (DClongvmfunc*) &dcCall_sparc64, (DClonglongvmfunc*) &dcCall_sparc64, (DCfloatvmfunc*) &dcCall_sparc64, (DCdoublevmfunc*) &dcCall_sparc64, (DCpointervmfunc*) &dcCall_sparc64, NULL /* callStruct */ }; /* CallVM virtual table. */ DCCallVM_vt gVT_sparc64 = { &dc_callvm_free_sparc64, &dc_callvm_reset_sparc64, &dc_callvm_mode_sparc64, &dc_callvm_argBool_sparc64, &dc_callvm_argChar_sparc64, &dc_callvm_argShort_sparc64, &dc_callvm_argInt_sparc64, &dc_callvm_argLong_sparc64, &dc_callvm_argLongLong_sparc64, &dc_callvm_argFloat_sparc64, &dc_callvm_argDouble_sparc64, &dc_callvm_argPointer_sparc64, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_sparc64, (DCboolvmfunc*) &dcCall_sparc64, (DCcharvmfunc*) &dcCall_sparc64, (DCshortvmfunc*) &dcCall_sparc64, (DCintvmfunc*) &dcCall_sparc64, (DClongvmfunc*) &dcCall_sparc64, (DClonglongvmfunc*) &dcCall_sparc64, (DCfloatvmfunc*) &dcCall_sparc64, (DCdoublevmfunc*) &dcCall_sparc64, (DCpointervmfunc*) &dcCall_sparc64, NULL /* callStruct */ }; /* mode: only a single mode available currently. */ static void dc_callvm_mode_sparc64(DCCallVM* in_self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_SPARC64: in_self->mVTpointer = &gVT_sparc64; break; case DC_CALL_C_ELLIPSIS_VARARGS: in_self->mVTpointer = &gVT_sparc64_ellipsis; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_sparc64(&gVT_sparc64,size); } #if 0 /* Load integer 32-bit. */ static void dc_callvm_argInt_sparc64(DCCallVM* in_self, DCint x) { DCCallVM_sparc64* self = (DCCallVM_sparc64*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint)); } /* we propagate Bool,Char,Short,Int to LongLong. */ static void dc_callvm_argBool_sparc64(DCCallVM* in_self, DCbool x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } static void dc_callvm_argChar_sparc64(DCCallVM* in_self, DCchar x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } static void dc_callvm_argShort_sparc64(DCCallVM* in_self, DCshort x) { dc_callvm_argInt_sparc64(in_self, (DCint)x); } #endif MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.h0000644000175000017500000000264412456307246023412 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc64.h Description: Call VM for sparc64 processor architecture. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_SPARC_H #define DYNCALL_CALLVM_SPARC_H #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_sparc64_ DCCallVM_sparc64; struct DCCallVM_sparc64_ { DCCallVM mInterface; /* 12:8 -> 16 */ int mIntRegs; /* 16 */ int mFloatRegs; /* 20 */ unsigned int mUseSingleFlags; /* 24 */ DCVecHead mVecHead; /* 36:16, 28 => 40 */ }; DCCallVM* dcNewCallVM_sparc64(DCsize size); #endif /* DYNCALL_CALLVM_SPARC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.c0000644000175000017500000001242512466674236023656 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_v9.c Description: Call VM for sparc-v9 ABI. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_sparc_v9.h" #include "dyncall_call_sparc_v9.h" #include "dyncall_alloc.h" /* Reset argument buffer. */ static void dc_callvm_reset_v9(DCCallVM* in_self) { DCCallVM_v9* self = (DCCallVM_v9*)in_self; dcVecResize(&self->mVecHead,0); } /* Construtor. */ static DCCallVM* dc_callvm_new_v9(DCCallVM_vt* vt, DCsize size) { DCCallVM_v9* self = (DCCallVM_v9*) dcAllocMem(sizeof(DCCallVM_v9)+size); dc_callvm_base_init(&self->mInterface, vt); dcVecInit(&self->mVecHead,size); dc_callvm_reset_v9(&self->mInterface); return (DCCallVM*)self; } /* Destructor. */ static void dc_callvm_free_v9(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_argLongLong_v9(DCCallVM* in_self, DClonglong x) { DCCallVM_v9* self = (DCCallVM_v9*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } /* all integers are promoted to 64-bit. */ static void dc_callvm_argLong_v9 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argInt_v9 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argBool_v9 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argChar_v9 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argShort_v9 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argPointer_v9(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } static void dc_callvm_argDouble_v9(DCCallVM* in_self, DCdouble x) { DCCallVM_v9* self = (DCCallVM_v9*)in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argDouble_v9_ellipsis(DCCallVM* in_self, DCdouble x) { union { long long l; double d; } u; u.d = x; dc_callvm_argLongLong_v9(in_self, u.l); } static void dc_callvm_argFloat_v9_ellipsis(DCCallVM* in_self, DCfloat x) { dc_callvm_argDouble_v9_ellipsis(in_self, (DCdouble) x); } static void dc_callvm_argFloat_v9(DCCallVM* in_self, DCfloat x) { union { double d; float f[2]; } u; u.f[1] = x; dc_callvm_argDouble_v9(in_self, u.d); } static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode); DCCallVM_vt gVT_v9_ellipsis = { &dc_callvm_free_v9, &dc_callvm_reset_v9, &dc_callvm_mode_v9, &dc_callvm_argBool_v9, &dc_callvm_argChar_v9, &dc_callvm_argShort_v9, &dc_callvm_argInt_v9, &dc_callvm_argLong_v9, &dc_callvm_argLongLong_v9, &dc_callvm_argFloat_v9_ellipsis, &dc_callvm_argDouble_v9_ellipsis, &dc_callvm_argPointer_v9, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_v9, (DCboolvmfunc*) &dcCall_v9, (DCcharvmfunc*) &dcCall_v9, (DCshortvmfunc*) &dcCall_v9, (DCintvmfunc*) &dcCall_v9, (DClongvmfunc*) &dcCall_v9, (DClonglongvmfunc*) &dcCall_v9, (DCfloatvmfunc*) &dcCall_v9, (DCdoublevmfunc*) &dcCall_v9, (DCpointervmfunc*) &dcCall_v9, NULL /* callStruct */ }; /* CallVM virtual table. */ DCCallVM_vt gVT_v9 = { &dc_callvm_free_v9, &dc_callvm_reset_v9, &dc_callvm_mode_v9, &dc_callvm_argBool_v9, &dc_callvm_argChar_v9, &dc_callvm_argShort_v9, &dc_callvm_argInt_v9, &dc_callvm_argLong_v9, &dc_callvm_argLongLong_v9, &dc_callvm_argFloat_v9, &dc_callvm_argDouble_v9, &dc_callvm_argPointer_v9, NULL /* argStruct */, (DCvoidvmfunc*) &dcCall_v9, (DCboolvmfunc*) &dcCall_v9, (DCcharvmfunc*) &dcCall_v9, (DCshortvmfunc*) &dcCall_v9, (DCintvmfunc*) &dcCall_v9, (DClongvmfunc*) &dcCall_v9, (DClonglongvmfunc*) &dcCall_v9, (DCfloatvmfunc*) &dcCall_v9, (DCdoublevmfunc*) &dcCall_v9, (DCpointervmfunc*) &dcCall_v9, NULL /* callStruct */ }; /* mode: only a single mode available currently. */ static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: case DC_CALL_C_SPARC64: in_self->mVTpointer = &gVT_v9; break; case DC_CALL_C_ELLIPSIS_VARARGS: in_self->mVTpointer = &gVT_v9_ellipsis; break; default: in_self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } /* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { return dc_callvm_new_v9(&gVT_v9,size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.h0000644000175000017500000000256212456307246023655 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_sparc_v9.h Description: Call VM for sparc-v9 ABI. License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_SPARC_V9_H #define DYNCALL_CALLVM_SPARC_V9_H #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct { DCCallVM mInterface; /* 0: +12:8 = 16*/ DCVecHead mVecHead; /* 16 152: mTotalSize +8 */ /* 24 160: mSize +8 */ /* 32 168: mData */ } DCCallVM_v9; DCCallVM* dcNewCallVM_v9(DCsize size); #endif /* DYNCALL_CALLVM_SPARC_V9_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_x64.c0000644000175000017500000001352312456307246022542 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x64.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* MS Windows x64 calling convention, AMD64 SystemV ABI. */ #include "dyncall_callvm_x64.h" #include "dyncall_alloc.h" #include "dyncall_struct.h" static DCCallVM* dc_callvm_new_x64(DCCallVM_vt* vt, DCsize size) { DCCallVM_x64* self = (DCCallVM_x64*)dcAllocMem(sizeof(DCCallVM_x64)+size); dc_callvm_base_init(&self->mInterface, vt); /* Since we store register parameters in DCCallVM_x64 directly, adjust the stack size. */ size -= sizeof(DCRegData_x64); size = (((signed long)size) < 0) ? 0 : size; self->mRegCount.i = self->mRegCount.f = 0; dcVecInit(&self->mVecHead, size); return (DCCallVM*)self; } static void dc_callvm_free_x64(DCCallVM* in_self) { dcFreeMem(in_self); } static void dc_callvm_reset_x64(DCCallVM* in_self) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; dcVecReset(&self->mVecHead); self->mRegCount.i = self->mRegCount.f = 0; } static void dc_callvm_mode_x64(DCCallVM* self, DCint mode) { switch(mode) { case DC_CALL_C_DEFAULT: case DC_CALL_C_ELLIPSIS: break; default: self->mError = DC_ERROR_UNSUPPORTED_MODE; break; } } static void dc_callvm_argLongLong_x64(DCCallVM* in_self, DClonglong x) { /* A long long always has 64 bits on the supported x64 platforms (lp64 on unix and llp64 on windows). */ DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.i < numIntRegs) self->mRegData.i[self->mRegCount.i++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); } static void dc_callvm_argBool_x64(DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_x64(in_self, (DClonglong)x); } static void dc_callvm_argChar_x64(DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argShort_x64(DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argInt_x64(DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argLong_x64(DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_x64(in_self, x); } static void dc_callvm_argFloat_x64(DCCallVM* in_self, DCfloat x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; /* Although not promoted to doubles, floats are stored with 64bits in this API.*/ union { DCdouble d; DCfloat f; } f; f.f = x; if(self->mRegCount.f < numFloatRegs) *(DCfloat*)&self->mRegData.f[self->mRegCount.f++] = x; else dcVecAppend(&self->mVecHead, &f.f, sizeof(DCdouble)); } static void dc_callvm_argDouble_x64(DCCallVM* in_self, DCdouble x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.f < numFloatRegs) self->mRegData.f[self->mRegCount.f++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); } static void dc_callvm_argPointer_x64(DCCallVM* in_self, DCpointer x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; if(self->mRegCount.i < numIntRegs) *(DCpointer*)&self->mRegData.i[self->mRegCount.i++] = x; else dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer)); } static void dc_callvm_argStruct_x64(DCCallVM* in_self, DCstruct* s, DCpointer x) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; dcVecAppend(&self->mVecHead, x, s->size); /*printf("dc_callvm_argStruct_x64 size = %d\n", (int)s->size);@@@*/ if (s->size <= 64) dcArgStructUnroll(in_self, s, x); /*else@@@*/ /* dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer));@@@*/ } /* Call. */ void dc_callvm_call_x64(DCCallVM* in_self, DCpointer target) { DCCallVM_x64* self = (DCCallVM_x64*)in_self; #if defined(DC_UNIX) dcCall_x64_sysv( #else dcCall_x64_win64( #endif dcVecSize(&self->mVecHead), /* Size of stack data. */ dcVecData(&self->mVecHead), /* Pointer to stack arguments. */ self->mRegData.i, /* Pointer to register arguments (ints on SysV). */ #if defined(DC_UNIX) self->mRegData.f, /* Pointer to floating point register arguments. */ #endif target ); } DCCallVM_vt gVT_x64 = { &dc_callvm_free_x64 , &dc_callvm_reset_x64 , &dc_callvm_mode_x64 , &dc_callvm_argBool_x64 , &dc_callvm_argChar_x64 , &dc_callvm_argShort_x64 , &dc_callvm_argInt_x64 , &dc_callvm_argLong_x64 , &dc_callvm_argLongLong_x64 , &dc_callvm_argFloat_x64 , &dc_callvm_argDouble_x64 , &dc_callvm_argPointer_x64 , &dc_callvm_argStruct_x64 , (DCvoidvmfunc*) &dc_callvm_call_x64 , (DCboolvmfunc*) &dc_callvm_call_x64 , (DCcharvmfunc*) &dc_callvm_call_x64 , (DCshortvmfunc*) &dc_callvm_call_x64 , (DCintvmfunc*) &dc_callvm_call_x64 , (DClongvmfunc*) &dc_callvm_call_x64 , (DClonglongvmfunc*) &dc_callvm_call_x64 , (DCfloatvmfunc*) &dc_callvm_call_x64 , (DCdoublevmfunc*) &dc_callvm_call_x64 , (DCpointervmfunc*) &dc_callvm_call_x64 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x64(DCsize size) { return dc_callvm_new_x64(&gVT_x64, size); } DCCallVM* dcNewCallVM(DCsize size) { return dcNewCallVM_x64(size); } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_x64.h0000644000175000017500000000503712456307246022550 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x64.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall callvm for x64 architecture SUPPORTED CALLING CONVENTIONS MS Windows x64 calling convention, AMD64 SystemV ABI REVISION 2007/12/11 initial */ #ifndef DYNCALL_CALLVM_X64_H #define DYNCALL_CALLVM_X64_H #include "dyncall_macros.h" #include "dyncall_call_x64.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" #if defined(DC_WINDOWS) typedef long long int64; /* llp64 */ #define numIntRegs 4 #define numFloatRegs 4 #define DCRegCount_x64 DCRegCount_x64_u #define DCRegData_x64 DCRegData_x64_u #elif defined(DC_UNIX) typedef long int64; /* lp64 */ #define numIntRegs 6 #define numFloatRegs 8 #define DCRegCount_x64 DCRegCount_x64_s #define DCRegData_x64 DCRegData_x64_s #else #error Unsupported OS. #endif typedef union { int i; int f; } DCRegCount_x64_u; typedef struct { int i; int f; } DCRegCount_x64_s; typedef union { int64 i[numIntRegs ]; double f[numFloatRegs]; } DCRegData_x64_u; typedef struct { int64 i[numIntRegs ]; double f[numFloatRegs]; } DCRegData_x64_s; typedef struct { DCCallVM mInterface; /* This CallVM interface. */ DCpointer mpCallFunc; /* Function to call. */ DCRegCount_x64 mRegCount; /* Number of int/sse registers used for parameter passing. */ DCRegData_x64 mRegData; /* Parameters to be passed via registers. */ DCVecHead mVecHead; /* Parameters to be pushed onto stack. */ } DCCallVM_x64; DCCallVM* dcNewCallVM_x64(DCsize size); #endif /* DYNCALL_CALLVM_X64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_x86.c0000644000175000017500000004626712456307246022561 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x86.c Description: Call VM for x86 architecture implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callvm_x86.h" #include "dyncall_alloc.h" void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode); /* call vm allocator */ static DCCallVM* dc_callvm_new_x86(DCCallVM_vt* vt, DCsize size) { DCCallVM_x86* self = (DCCallVM_x86*) dcAllocMem( sizeof(DCCallVM_x86)+size ); dc_callvm_base_init(&self->mInterface, vt); self->mIntRegs = 0; dcVecInit(&self->mVecHead, size); return (DCCallVM*) self; } /* call vm destructor */ static void dc_callvm_free_x86(DCCallVM* in_self) { dcFreeMem(in_self); } /* reset */ static void dc_callvm_reset_x86(DCCallVM* in_self) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecReset(&self->mVecHead); self->mIntRegs = 0; } /* arg (bool,char,short,long auto-promoted) to int */ static void dc_callvm_argInt_x86(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promoted to int */ static void dc_callvm_argBool_x86(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg char - promoted to int */ static void dc_callvm_argChar_x86(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg short - promoted to int */ static void dc_callvm_argShort_x86(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg long - promoted to int */ static void dc_callvm_argLong_x86(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86(in_self, v); } /* arg long long */ static void dc_callvm_argLongLong_x86(DCCallVM* in_self, DClonglong x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong) ); } /* arg float */ static void dc_callvm_argFloat_x86(DCCallVM* in_self, DCfloat x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) ); } /* arg double */ static void dc_callvm_argDouble_x86(DCCallVM* in_self, DCdouble x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) ); } /* arg pointer */ static void dc_callvm_argPointer_x86(DCCallVM* in_self, DCpointer x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer) ); } /* Plan9 specific calling convention. */ #if defined(DC__OS_Plan9) /* call 'plan9' */ void dc_callvm_call_x86_plan9(DCCallVM* in_self, DCpointer target) { /* Calls with 32-bit return values have it returned via EAX, so we don't */ /* need to do anything special here. */ DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_plan9(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); } DClonglong dc_callvm_call_x86_plan9_ll(DCCallVM* in_self, DCpointer target) { /* Call for 64 bit integer return values is a bit different, call a */ /* different assembler stub that stores the return value in a variable */ /* for us, and return the latter. */ DClonglong ret; DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_plan9_ll(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead), &ret ); return ret; } DCCallVM_vt gVT_x86_plan9 = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_plan9 , (DCboolvmfunc*) &dc_callvm_call_x86_plan9 , (DCcharvmfunc*) &dc_callvm_call_x86_plan9 , (DCshortvmfunc*) &dc_callvm_call_x86_plan9 , (DCintvmfunc*) &dc_callvm_call_x86_plan9 , (DClongvmfunc*) &dc_callvm_call_x86_plan9 , (DClonglongvmfunc*) &dc_callvm_call_x86_plan9_ll , (DCfloatvmfunc*) &dc_callvm_call_x86_plan9 , (DCdoublevmfunc*) &dc_callvm_call_x86_plan9 , (DCpointervmfunc*) &dc_callvm_call_x86_plan9 , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_plan9(DCsize size) { return dc_callvm_new_x86( &gVT_x86_plan9, size ); } #else /* call 'cdecl' */ void dc_callvm_call_x86_cdecl(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_cdecl( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } DCCallVM_vt gVT_x86_cdecl = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_cdecl , (DCboolvmfunc*) &dc_callvm_call_x86_cdecl , (DCcharvmfunc*) &dc_callvm_call_x86_cdecl , (DCshortvmfunc*) &dc_callvm_call_x86_cdecl , (DCintvmfunc*) &dc_callvm_call_x86_cdecl , (DClongvmfunc*) &dc_callvm_call_x86_cdecl , (DClonglongvmfunc*) &dc_callvm_call_x86_cdecl , (DCfloatvmfunc*) &dc_callvm_call_x86_cdecl , (DCdoublevmfunc*) &dc_callvm_call_x86_cdecl , (DCpointervmfunc*) &dc_callvm_call_x86_cdecl , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_cdecl(DCsize size) { return dc_callvm_new_x86( &gVT_x86_cdecl, size ); } /* --- stdcall -------------------------------------------------------------- */ /* call win32/std */ void dc_callvm_call_x86_win32_std(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_std( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* win32/std vtable */ DCCallVM_vt gVT_x86_win32_std = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_std , (DCboolvmfunc*) &dc_callvm_call_x86_win32_std , (DCcharvmfunc*) &dc_callvm_call_x86_win32_std , (DCshortvmfunc*) &dc_callvm_call_x86_win32_std , (DCintvmfunc*) &dc_callvm_call_x86_win32_std , (DClongvmfunc*) &dc_callvm_call_x86_win32_std , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_std , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_std , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_std , (DCpointervmfunc*) &dc_callvm_call_x86_win32_std , NULL /* callStruct */ }; /* win32/std callvm allocator */ DCCallVM* dcNewCallVM_x86_win32_std(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_std, size ); } /* --- fastcall common (ms/gnu) -------------------------------------------- */ /* call win32 ms fast */ static void dc_callvm_call_x86_win32_fast(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_fast( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* reset - always resize to 8 bytes (stores ECX and EDX) */ static void dc_callvm_reset_x86_win32_fast(DCCallVM* in_self) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcVecResize(&self->mVecHead, sizeof(DCint) * 2 ); self->mIntRegs = 0; } /* --- fastcall ms --------------------------------------------------------- */ /* arg int - probably hold in ECX and EDX */ static void dc_callvm_argInt_x86_win32_fast_ms(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; if (self->mIntRegs < 2) { *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x; ++( self->mIntRegs ); } else dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promote to int */ static void dc_callvm_argBool_x86_win32_fast_ms(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg char - promote to int */ static void dc_callvm_argChar_x86_win32_fast_ms(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg short - promote to int */ static void dc_callvm_argShort_x86_win32_fast_ms(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg long - promote to int */ static void dc_callvm_argLong_x86_win32_fast_ms(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* arg pointer - promote to int */ static void dc_callvm_argPointer_x86_win32_fast_ms(DCCallVM* in_self, DCpointer x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_ms(in_self,v); } /* win32/fast vt */ DCCallVM_vt gVT_x86_win32_fast_ms = { &dc_callvm_free_x86 , &dc_callvm_reset_x86_win32_fast , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86_win32_fast_ms , &dc_callvm_argChar_x86_win32_fast_ms , &dc_callvm_argShort_x86_win32_fast_ms , &dc_callvm_argInt_x86_win32_fast_ms , &dc_callvm_argLong_x86_win32_fast_ms , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86_win32_fast_ms , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_win32_fast_ms(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_fast_ms, size ); } /* --- gnu fastcall -------------------------------------------------------- */ /* arg int - probably hold in ECX and EDX */ static void dc_callvm_argInt_x86_win32_fast_gnu(DCCallVM* in_self, DCint x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; if (self->mIntRegs < 2) { *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x; ++( self->mIntRegs ); } else dcVecAppend(&self->mVecHead, &x, sizeof(DCint) ); } /* arg bool - promote to int */ static void dc_callvm_argBool_x86_win32_fast_gnu(DCCallVM* in_self, DCbool x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg char - promote to int */ static void dc_callvm_argChar_x86_win32_fast_gnu(DCCallVM* in_self, DCchar x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg short - promote to int */ static void dc_callvm_argShort_x86_win32_fast_gnu(DCCallVM* in_self, DCshort x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg long - promote to int */ static void dc_callvm_argLong_x86_win32_fast_gnu(DCCallVM* in_self, DClong x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg pointer - promote to int */ static void dc_callvm_argPointer_x86_win32_fast_gnu(DCCallVM* in_self, DCpointer x) { DCint v = (DCint) x; dc_callvm_argInt_x86_win32_fast_gnu(in_self,v); } /* arg long long - skip registers and push on stack */ static void dc_callvm_argLongLong_x86_win32_fast_gnu(DCCallVM* in_self, DClonglong x) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; self->mIntRegs = 2; dc_callvm_argLongLong_x86(in_self,x); } /* win32/fast/gnu vt */ DCCallVM_vt gVT_x86_win32_fast_gnu = { &dc_callvm_free_x86 , &dc_callvm_reset_x86_win32_fast , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86_win32_fast_gnu , &dc_callvm_argChar_x86_win32_fast_gnu , &dc_callvm_argShort_x86_win32_fast_gnu , &dc_callvm_argInt_x86_win32_fast_gnu , &dc_callvm_argLong_x86_win32_fast_gnu , &dc_callvm_argLongLong_x86_win32_fast_gnu , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86_win32_fast_gnu , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast , NULL /* callStruct */ }; DCCallVM* dcNewCallVM_x86_win32_fast_gnu(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_fast_gnu, size ); } /* --- this ms ------------------------------------------------------------- */ /* call win32/this/ms */ void dc_callvm_call_x86_win32_this_ms(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_win32_msthis( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } /* win32/this/ms vt */ DCCallVM_vt gVT_x86_win32_this_ms = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCboolvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCcharvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCshortvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCintvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DClongvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_this_ms , (DCpointervmfunc*) &dc_callvm_call_x86_win32_this_ms , NULL /* callStruct */ }; /* --- syscall ------------------------------------------------------------- */ /* call syscall */ void dc_callvm_call_x86_sys_int80h_linux(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_sys_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } void dc_callvm_call_x86_sys_int80h_bsd(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; dcCall_x86_sys_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } DCCallVM_vt gVT_x86_sys_int80h_linux = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_linux , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_linux , NULL /* callStruct */ }; DCCallVM_vt gVT_x86_sys_int80h_bsd = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 , &dc_callvm_mode_x86 , &dc_callvm_argBool_x86 , &dc_callvm_argChar_x86 , &dc_callvm_argShort_x86 , &dc_callvm_argInt_x86 , &dc_callvm_argLong_x86 , &dc_callvm_argLongLong_x86 , &dc_callvm_argFloat_x86 , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_bsd , NULL /* callStruct */ }; /* win32/this/ms callvm allocator */ DCCallVM* dcNewCallVM_x86_win32_this_ms(DCsize size) { return dc_callvm_new_x86( &gVT_x86_win32_this_ms, size ); } #endif /* mode */ void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; DCCallVM_vt* vt; switch(mode) { case DC_CALL_C_ELLIPSIS: case DC_CALL_C_ELLIPSIS_VARARGS: case DC_CALL_C_DEFAULT: #if defined(DC_PLAN9) /* Plan9 (and forks) have their own calling convention (and no support for foreign ones). */ case DC_CALL_C_X86_PLAN9: vt = &gVT_x86_plan9; break; #else case DC_CALL_C_X86_CDECL: vt = &gVT_x86_cdecl; break; case DC_CALL_C_X86_WIN32_STD: vt = &gVT_x86_win32_std; break; case DC_CALL_C_X86_WIN32_FAST_MS: vt = &gVT_x86_win32_fast_ms; break; case DC_CALL_C_X86_WIN32_THIS_MS: vt = &gVT_x86_win32_this_ms; break; case DC_CALL_C_X86_WIN32_FAST_GNU: vt = &gVT_x86_win32_fast_gnu; break; case DC_CALL_C_X86_WIN32_THIS_GNU: vt = &gVT_x86_cdecl; break; case DC_CALL_SYS_DEFAULT: # if defined DC_UNIX # if defined DC__OS_Linux vt = &gVT_x86_sys_int80h_linux; break; # else vt = &gVT_x86_sys_int80h_bsd; break; # endif # else self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; # endif case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break; case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_sys_int80h_bsd; break; #endif default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } self->mInterface.mVTpointer = vt; } /* new */ DCCallVM* dcNewCallVM(DCsize size) { #if defined(DC__OS_Plan9) return dcNewCallVM_x86_plan9(size); #else return dcNewCallVM_x86_cdecl(size); #endif } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_callvm_x86.h0000644000175000017500000000400112456307246022542 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callvm_x86.h Description: Call virtual machine for x86 architecture header License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLVM_X86_H #define DYNCALL_CALLVM_X86_H /* dyncall callvm for 32bit X86 architectures Copyright 2007 Daniel Adler. SUPPORTED CALLING CONVENTIONS cdecl,stdcall,fastcall,thiscall,msthiscall REVISION 2007/12/10 initial */ #include "dyncall_call_x86.h" #include "dyncall_callvm.h" #include "dyncall_vector.h" typedef struct DCCallVM_x86_ DCCallVM_x86; struct DCCallVM_x86_ { DCCallVM mInterface; DCpointer mpCallFunc; int mIntRegs; /* used by fastcall implementation */ DCVecHead mVecHead; }; /* Plan9 has no support for OS foreign calling conventions at the time, and vice-versa. */ #if defined(DC__OS_Plan9) DCCallVM* dcNewCallVM_x86_plan9(DCsize size); #else DCCallVM* dcNewCallVM_x86_cdecl(DCsize size); DCCallVM* dcNewCallVM_x86_win32_std(DCsize size); DCCallVM* dcNewCallVM_x86_win32_fast_ms(DCsize size); DCCallVM* dcNewCallVM_x86_win32_fast_gnu(DCsize size); DCCallVM* dcNewCallVM_x86_win32_this_ms(DCsize size); #endif #endif /* DYNCALL_CALLVM_X86_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_config.h0000644000175000017500000000241712456307246022035 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_config.h Description: Macro configuration file for non-standard C types License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall type configuration REVISION 2007/12/11 initial */ #ifndef DYNCALL_CONFIG_H #define DYNCALL_CONFIG_H #include "dyncall_macros.h" #define DC_BOOL int #define DC_LONG_LONG long long #define DC_POINTER void* #endif /* DYNCALL_CONFIG_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_macros.h0000644000175000017500000001764612466674236022075 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_macros.h Description: Platform detection macros License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall macros Platform detection, specific defines and configuration. The purpose of this file is to provide coherent platform and compiler specific defines. So instead of defines like WIN32, _OpenBSD_ or __GNUC__, one should use DC__OS_Win32, DC__OS_OpenBSD or DC__C_GNU, respectively. REVISION 2007/12/11 initial */ #ifndef DYNCALL_MACROS_H #define DYNCALL_MACROS_H /* Platform specific defines. */ /* MS Windows XP x64/Vista64 or later. */ #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) #define DC__OS_Win64 /* MS Windows NT/95/98/ME/2000/XP/Vista32. */ #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__WINDOWS__) || defined(_WINDOWS) #define DC__OS_Win32 /* All the OS' based on Darwin OS (MacOS X, OpenDarwin). Note that '__APPLE__' may be defined for classic MacOS, too. */ /* __MACOSX__ is not defined in gcc assembler mode (switch: -S) */ /* @@@ TODO: Check for Classic OS */ #elif defined(__APPLE__) || defined(__Darwin__) # define DC__OS_Darwin # if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) # define DC__OS_IPhone # else /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */ # define DC__OS_MacOSX # endif /* The most popular open source Unix-like OS - Linux. */ #elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__) #define DC__OS_Linux /* The most powerful open source Unix-like OS - FreeBSD. */ #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #define DC__OS_FreeBSD /* The most secure open source Unix-like OS - OpenBSD. */ #elif defined(__OpenBSD__) #define DC__OS_OpenBSD /* The most portable open source Unix-like OS - NetBSD. */ #elif defined(__NetBSD__) #define DC__OS_NetBSD /* The FreeBSD fork having heavy clusterization in mind - DragonFlyBSD. */ #elif defined(__DragonFly__) #define DC__OS_DragonFlyBSD /* Sun's Unix-like OS - SunOS / Solaris. */ #elif defined(__sun__) || defined(__sun) || defined(sun) #define DC__OS_SunOS /* The "Linux-like environment for Windows" - Cygwin. */ #elif defined(__CYGWIN__) #define DC__OS_Cygwin /* The "Minimalist GNU for Windows" - MinGW. */ #elif defined(__MINGW__)/*@@@*/ #define DC__OS_MinGW /* The Nintendo DS (homebrew) using devkitpro. */ #elif defined(__nds__) #define DC__OS_NDS /* The PlayStation Portable (homebrew) SDK. */ #elif defined(__psp__) || defined(PSP) #define DC__OS_PSP /* Haiku (BeOS alike). */ #elif defined(__HAIKU__) #define DC__OS_BeOS /* The Unix successor - Plan9 from Bell Labs */ #elif defined(Plan9) || defined(__Plan9__) #define DC__OS_Plan9 /* Digital's Unix-like OS - VMS */ #elif defined(__vms) #define DC__OS_VMS #elif defined(__minix) #define DC__OS_Minix #else #error Unsupported OS. #endif /* Compiler specific defines. Do not change the order, because */ /* some of the compilers define flags for compatible ones, too. */ /* Intel's C/C++ compiler. */ #if defined(__INTEL_COMPILER) #define DC__C_Intel /* MS C/C++ compiler. */ #elif defined(_MSC_VER) #define DC__C_MSVC /* LLVM clang. */ #elif defined(__clang__) #define DC__C_CLANG /* The GNU Compiler Collection - GCC. */ #elif defined(__GNUC__) #define DC__C_GNU /* Watcom compiler. */ #elif defined(__WATCOMC__) #define DC__C_WATCOM /* Portable C Compiler. */ #elif defined(__PCC__) #define DC__C_PCC /* Sun Pro C. */ #elif defined(__SUNPRO_C) #define DC__C_SUNPRO /* Undetected C Compiler. */ #else #define DC__C_UNKNOWN #endif /* Architecture. */ /* Check architecture. */ #if defined(_M_IX86) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__386__) || defined(__i386) # define DC__Arch_Intel_x86 #elif defined(_M_X64_) || defined(_M_AMD64) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) # define DC__Arch_AMD64 #elif defined(_M_IA64) || defined(__ia64__) # define DC__Arch_Itanium #elif defined(_M_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__ppc__) || defined(__power__) # if defined(__ppc64__) || defined(_ARCH_PPC64) || defined(__power64__) || defined(__powerpc64__) # define DC__Arch_PPC64 # else # define DC__Arch_PPC32 # endif #elif defined(__mips64__) || defined(__mips64) # define DC__Arch_MIPS64 #elif defined(_M_MRX000) || defined(__mips__) || defined(__mips) || defined(_mips) # define DC__Arch_MIPS #elif defined(__arm__) # define DC__Arch_ARM #elif defined(__aarch64__) # define DC__Arch_ARM64 #elif defined(__sh__) # define DC__Arch_SuperH #elif defined(__sparcv9) || defined(__sparc64__) || ( defined(__sparc) && defined(__arch64__) ) /* this could be needed on Linux/GNU sparc64 in the future: || ( defined(__sparc) && defined(__arch64__) ) */ # define DC__Arch_Sparcv9 #elif defined(__sparc) # define DC__Arch_Sparc #endif /* Rough OS classification. */ #if defined(DC__OS_Win32) || defined(DC__OS_Win64) # define DC_WINDOWS #elif defined(DC__OS_Plan9) # define DC_PLAN9 #elif defined(DC__OS_NDS) || defined(DC__OS_PSP) # define DC_OTHER #else # define DC_UNIX #endif /* Misc machine-dependent modes, ABIs, etc.. */ #if defined(__arm__) && !defined(__thumb__) # define DC__Arch_ARM_ARM #elif defined(__arm__) && defined(__thumb__) # define DC__Arch_ARM_THUMB #endif #if defined(DC__Arch_ARM_ARM) || defined(DC__Arch_ARM_THUMB) # if defined(__ARM_EABI__) || defined(DC__OS_NDS) # if defined (__ARM_PCS_VFP) && (__ARM_PCS_VFP == 1) # define DC__ABI_ARM_HF # else # define DC__ABI_ARM_EABI # endif # elif defined(__APCS_32__) # define DC__ABI_ARM_OABI # endif #endif /* ARM */ #if defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64) # if defined(_ABIO32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2) # define DC__ABI_MIPS_O32 # elif defined(_ABIN32) # define DC__ABI_MIPS_N32 # elif defined(_ABI64) # define DC__ABI_MIPS_N64 # else # define DC__ABI_MIPS_EABI # endif #endif /* MIPS */ #if defined(DC__Arch_PPC64) # if defined(_CALL_ELF) # define DC__ABI_PPC64_ELF_V _CALL_ELF # else # define DC__ABI_PPC64_ELF_V 0 /* 0 means not explicitly set, otherwise this is 1 (big endian) and 2 (little endian) */ # endif #endif /* MIPS */ /* Endian detection. */ #if defined(DC__Arch_Intel_x86) || defined(DC__Arch_AMD64) /* always little */ # define DC__Endian_LITTLE #elif defined(DC__Arch_Sparc) /*always big until v9*/ # define DC__Endian_BIG #else /* all others are bi-endian */ /* @@@check flags used on following bi-endianness archs: DC__Arch_ARM DC__Arch_ARM64 DC__Arch_Itanium DC__Arch_MIPS DC__Arch_MIPS64 DC__Arch_PPC32 DC__Arch_PPC64 DC__Arch_Sparcv9 DC__Arch_SuperH */ # if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(_BIG_ENDIAN) || defined(MIPSEB) # define DC__Endian_BIG # elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(_LITTLE_ENDIAN) || defined(MIPSEL) # define DC__Endian_LITTLE # endif /* no else, leave unset if not sure */ #endif /* Internal macro/tag. */ #if !defined(DC_API) #define DC_API #endif #endif /* DYNCALL_MACROS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_signature.h0000644000175000017500000000417212456307246022571 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_signature.h Description: Type and calling-convention signature character defines License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall signature characters REVISION 2007/12/11 initial */ #ifndef DYNCALL_SIGNATURE_H #define DYNCALL_SIGNATURE_H typedef char DCsigchar; #define DC_SIGCHAR_VOID 'v' #define DC_SIGCHAR_BOOL 'B' #define DC_SIGCHAR_CHAR 'c' #define DC_SIGCHAR_UCHAR 'C' #define DC_SIGCHAR_SHORT 's' #define DC_SIGCHAR_USHORT 'S' #define DC_SIGCHAR_INT 'i' #define DC_SIGCHAR_UINT 'I' #define DC_SIGCHAR_LONG 'j' #define DC_SIGCHAR_ULONG 'J' #define DC_SIGCHAR_LONGLONG 'l' #define DC_SIGCHAR_ULONGLONG 'L' #define DC_SIGCHAR_FLOAT 'f' #define DC_SIGCHAR_DOUBLE 'd' #define DC_SIGCHAR_POINTER 'p' #define DC_SIGCHAR_STRING 'Z' #define DC_SIGCHAR_STRUCT 'T' #define DC_SIGCHAR_ENDARG ')' /* also works for end struct */ /* callback signatures */ #define DC_SIGCHAR_CC_PREFIX '_' #define DC_SIGCHAR_CC_ELLIPSIS 'e' #define DC_SIGCHAR_CC_STDCALL 's' #define DC_SIGCHAR_CC_FASTCALL_GNU 'f' #define DC_SIGCHAR_CC_FASTCALL_MS 'F' #define DC_SIGCHAR_CC_THISCALL_MS '+' #endif /* DYNCALL_SIGNATURE_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_struct.c0000644000175000017500000001507212456307246022110 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_struct.c Description: C interface to compute struct size License: Copyright (c) 2010-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "dyncall_signature.h" #include "dyncall_struct.h" #include "dyncall_alloc.h" #include #include DCstruct* dcNewStruct(DCsize fieldCount, DCint alignment) { DCstruct* s = (DCstruct*)dcAllocMem(sizeof(DCstruct)); s->pCurrentStruct = s; s->pLastStruct = NULL; s->nextField = 0; s->fieldCount = fieldCount; s->alignment = alignment; s->size = 0; s->pFields = (DCfield*)dcAllocMem(fieldCount * sizeof(DCfield)); return s; } void dcStructField(DCstruct* s, DCint type, DCint alignment, DCsize arrayLength) { DCfield *f; if (type == DC_SIGCHAR_STRING) { assert(!"Use dcSubStruct instead !!!"); return; } assert(s && s->pCurrentStruct); assert(s->pCurrentStruct->nextField <= (DCint)s->pCurrentStruct->fieldCount - 1); f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++); f->type = type; f->alignment = alignment; f->arrayLength = arrayLength; f->pSubStruct = NULL; switch (type) { case DC_SIGCHAR_BOOL: f->size = sizeof(DCbool); break; case DC_SIGCHAR_CHAR: case DC_SIGCHAR_UCHAR: f->size = sizeof(DCchar); break; case DC_SIGCHAR_SHORT: case DC_SIGCHAR_USHORT: f->size = sizeof(DCshort); break; case DC_SIGCHAR_INT: case DC_SIGCHAR_UINT: f->size = sizeof(DCint); break; case DC_SIGCHAR_LONG: case DC_SIGCHAR_ULONG: f->size = sizeof(DClong); break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: f->size = sizeof(DClonglong); break; case DC_SIGCHAR_FLOAT: f->size = sizeof(DCfloat); break; case DC_SIGCHAR_DOUBLE: f->size = sizeof(DCdouble); break; case DC_SIGCHAR_POINTER: case DC_SIGCHAR_STRING: f->size = sizeof(DCpointer); break; default: assert(0); } } void dcSubStruct(DCstruct* s, DCsize fieldCount, DCint alignment, DCsize arrayLength) { DCfield *f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++); f->type = DC_SIGCHAR_STRUCT; f->arrayLength = arrayLength; f->alignment = alignment; f->pSubStruct = dcNewStruct(fieldCount, alignment); f->pSubStruct->pLastStruct = s->pCurrentStruct; s->pCurrentStruct = f->pSubStruct; } static void dcAlign(DCsize *size, DCsize alignment) { DCsize mod = (*size) % alignment; if (mod) { DCsize rest = alignment - mod; (*size) += rest; } } static void dcComputeStructSize(DCstruct* s) { DCsize i; assert(s); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; DCsize fieldAlignment; if (f->type == DC_SIGCHAR_STRUCT) { dcComputeStructSize(f->pSubStruct); f->size = f->pSubStruct->size; fieldAlignment = f->pSubStruct->alignment; } else { fieldAlignment = f->size; } if (!f->alignment) f->alignment = fieldAlignment; if (f->alignment > s->alignment) s->alignment = f->alignment; f->size *= f->arrayLength; /*printf("FIELD %d, size = %d, alignment = %d\n", (int)i, (int)f->size, (int)f->alignment);@@@*/ } for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; dcAlign(&s->size, f->alignment); s->size += f->size; } dcAlign(&s->size, s->alignment); /*printf("STRUCT size = %d, alignment = %d\n", (int)s->size, (int)s->alignment);@@@*/ } void dcCloseStruct(DCstruct* s) { assert(s); assert(s->pCurrentStruct); assert(s->pCurrentStruct->nextField == s->pCurrentStruct->fieldCount); if (!s->pCurrentStruct->pLastStruct) { dcComputeStructSize(s->pCurrentStruct); } s->pCurrentStruct = s->pCurrentStruct->pLastStruct; } void dcFreeStruct(DCstruct* s) { DCsize i; assert(s); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; if (f->type == DC_SIGCHAR_STRUCT) dcFreeStruct(f->pSubStruct); } free(s->pFields); free(s); } DCsize dcStructSize(DCstruct* s) { assert(!s->pCurrentStruct && "Struct was not closed"); return s->size; } DCsize dcStructAlignment(DCstruct* s) { assert(!s->pCurrentStruct && "Struct was not closed"); return s->alignment; } void dcArgStructUnroll(DCCallVM* vm, DCstruct* s, DCpointer value) { DCsize i; /*printf("UNROLLING STRUCT !\n");@@@*/ assert(s && value); for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; DCpointer p = (char*)value + f->offset; switch(f->type) { case DC_SIGCHAR_STRUCT: dcArgStruct(vm, f->pSubStruct, p); break; case DC_SIGCHAR_BOOL: dcArgBool (vm, *(DCbool*)p); break; case DC_SIGCHAR_CHAR: case DC_SIGCHAR_UCHAR: dcArgChar (vm, *(DCchar*)p); break; case DC_SIGCHAR_SHORT: case DC_SIGCHAR_USHORT: dcArgShort (vm, *(DCshort*)p); break; case DC_SIGCHAR_INT: case DC_SIGCHAR_UINT: dcArgInt (vm, *(DCint*)p); break; case DC_SIGCHAR_LONG: case DC_SIGCHAR_ULONG: dcArgLong (vm, *(DCulong*)p); break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: dcArgLongLong (vm, *(DCulonglong*)p); break; case DC_SIGCHAR_FLOAT: dcArgFloat (vm, *(DCfloat*)p); break; case DC_SIGCHAR_DOUBLE: dcArgDouble (vm, *(DCdouble*)p); break; case DC_SIGCHAR_POINTER: case DC_SIGCHAR_STRING: dcArgPointer (vm, *(DCpointer**)p); break; default: assert(0); } } } static DCint readInt(const char** ptr) { return strtol(*ptr, (char**)ptr, 10);/*@@@ enough*/ } DCstruct* dcDefineStruct(const char* signature) { DCstruct* s; const char* ptr = signature; DCint fieldCount = readInt(&ptr); s = dcNewStruct(fieldCount, DEFAULT_ALIGNMENT); while (*ptr) { char type = *(ptr++); if (type == DC_SIGCHAR_STRUCT) { /*dcSubStruct( @@@*/ } else { dcStructField(s, type, DEFAULT_ALIGNMENT, readInt(&ptr)); } } dcCloseStruct(s); return s; } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_struct.h0000644000175000017500000000317312456307246022114 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_struct.h Description: C interface to compute struct size License: Copyright (c) 2010-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall struct metadata structures REVISION 2007/12/11 initial */ #ifndef DYNCALL_STRUCT_H #define DYNCALL_STRUCT_H #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCfield_ { DCsize offset, size, alignment, arrayLength; DCint type; DCstruct* pSubStruct; } DCfield; struct DCstruct_ { DCfield *pFields; DCsize size, alignment, fieldCount; /* struct building uses a state machine. */ DCint nextField; /* == -1 if struct is closed */ DCstruct *pCurrentStruct, *pLastStruct; /* == this, unless we're in a sub struct */ }; /* Helper. */ void dcArgStructUnroll(DCCallVM* vm, DCstruct* s, DCpointer value); #ifdef __cplusplus } #endif #endif /* DYNCALL_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_types.h0000644000175000017500000000352012456307246021730 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_types.h Description: Typedefs License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall argument- and return-types REVISION 2007/12/11 initial */ #ifndef DYNCALL_TYPES_H #define DYNCALL_TYPES_H #include #include "dyncall_config.h" #ifdef __cplusplus extern "C" { #endif typedef void DCvoid; typedef DC_BOOL DCbool; typedef char DCchar; typedef unsigned char DCuchar; typedef short DCshort; typedef unsigned short DCushort; typedef int DCint; typedef unsigned int DCuint; typedef long DClong; typedef unsigned long DCulong; typedef DC_LONG_LONG DClonglong; typedef unsigned DC_LONG_LONG DCulonglong; typedef float DCfloat; typedef double DCdouble; typedef DC_POINTER DCpointer; typedef const char* DCstring; typedef size_t DCsize; #define DC_TRUE 1 #define DC_FALSE 0 #ifdef __cplusplus } #endif #endif /* DYNCALL_TYPES_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_utils.h0000644000175000017500000000225112456307246021724 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_utils.h Description: Type and calling-convention signature character defines License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_UTILS_H #define DYNCALL_UTILS_H /* C portable macros. */ #ifndef DC_MAX #define DC_MAX(a,b) ((a)>=(b))?(a):(b) #endif #endif /* DYNCALL_UTILS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_value.h0000644000175000017500000000353312466674236021713 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_value.h Description: Value variant type License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dyncall value variant a value variant union-type that carries all supported dyncall types. REVISION 2007/12/11 initial */ #ifndef DYNCALL_VALUE_H #define DYNCALL_VALUE_H #include "dyncall_types.h" #ifdef __cplusplus extern "C" { #endif typedef union DCValue_ DCValue; union DCValue_ { DCbool B; #if defined (DC__Arch_PPC32) && defined(DC__Endian_BIG) struct { DCchar c_pad[3]; DCchar c; }; struct { DCuchar C_pad[3]; DCuchar C; }; struct { DCshort s_pad; DCshort s; }; struct { DCshort S_pad; DCshort S; }; #else DCchar c; DCuchar C; DCshort s; DCushort S; #endif DCint i; DCuint I; DClong j; DCulong J; DClonglong l; DCulonglong L; DCfloat f; DCdouble d; DCpointer p; DCstring Z; }; #ifdef __cplusplus } #endif #endif /* DYNCALL_VALUE_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_vector.c0000644000175000017500000000362412456307246022066 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_vector.c Description: Simple dynamic vector container type implementation License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_vector.h" #include void dcVecAppend(DCVecHead* pHead, const void* pData, size_t size) { size_t newSize = pHead->mSize + size; if(newSize <= pHead->mTotal) { void* dst = (DCchar*)dcVecData(pHead) + pHead->mSize; switch (size) { case 1: *(DCchar *)dst = *(const DCchar *)pData; break; case 2: *(DCshort *)dst = *(const DCshort *)pData; break; case 4: *(DCint *)dst = *(const DCint *)pData; break; case 8: *(DCint *)( ( (char*)dst )+4) = *(const DCint *)( ( (char*)pData )+4); *(DCint *)dst = *(const DCint *)pData; break; /* On sparc 32-bit, this one crashes if ptrs are not aligned. case 8: *(DClonglong*)dst = *(const DClonglong*)pData; break; */ default: memcpy(dst, pData, size); /* for all the rest. */ } pHead->mSize = newSize; } /*else @@@ warning? error?*/ } MoarVM-2015.11/3rdparty/dyncall/dyncall/dyncall_vector.h0000644000175000017500000000334712456307246022075 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_vector.h Description: Simple dynamic vector container type header License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DC_VECTOR_H #define DC_VECTOR_H #include "dyncall_types.h" typedef struct { DCsize mTotal; DCsize mSize; } DCVecHead; #define DC_SIZEOF_DCVector(size) (sizeof(DCVecHead)+size) #define dcVecInit(p,size) (p)->mTotal=size;(p)->mSize=0 #define dcVecReset(p) (p)->mSize=0 #define dcVecResize(p,size) (p)->mSize=(size) #define dcVecSkip(p,size) (p)->mSize+=(size) #define dcVecData(p) ( (unsigned char*) (((DCVecHead*)(p))+1) ) #define dcVecAt(p,index) ( dcVecData(p)+index ) #define dcVecSize(p) ( (p)->mSize ) /* #include #define dcVecAppend(p,s,n) memcpy( dcVecData(p)+p->mSize, s, n );p->mSize+=n */ void dcVecAppend(DCVecHead* pHead, const void* source, size_t length); #endif /* DC_VECTOR_H */ MoarVM-2015.11/3rdparty/dyncall/dyncall/gen-masm.sh0000755000175000017500000000071512466674236020762 0ustar jnthnjnthn#!/bin/sh # Uses portasm to generates MASM sources for intel platforms. printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x86_generic_masm.asm printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x64_generic_masm.asm gcc -E -P -DGEN_MASM dyncall_call_x86.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x86_generic_masm.asm gcc -E -P -DGEN_MASM dyncall_call_x64-att.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x64_generic_masm.asm MoarVM-2015.11/3rdparty/dyncall/dyncall/mkfile0000644000175000017500000000230512456307246020077 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = .. <$TOP/buildsys/mk/prolog.mk LIBRARY = dyncall UNITS = $UNITS dyncall_vector dyncall_api dyncall_callf dyncall_call dyncall_callvm dyncall_callvm_base dyncall_struct <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/dyncallback/CMakeLists.txt0000644000175000017500000000316312456307246022271 0ustar jnthnjnthn# Package: dyncall # File: dyncallback/CMakeLists.txt # Description: DynCallback library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # include_directories(${PROJECT_SOURCE_DIR}/dyncall) if(MSVC) if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(ASM_SRC dyncall_callback_x86_masm.asm) else() set(ASM_SRC dyncall_callback_x64_masm.asm) endif() else() set(ASM_SRC dyncall_callback_arch.S) set_source_files_properties(${ASM_SRC} PROPERTIES LANGUAGE "C") endif() add_library(dyncallback_s STATIC ${ASM_SRC} dyncall_thunk.c dyncall_alloc_wx.c dyncall_args.c dyncall_callback.c ) install(TARGETS dyncallback_s ARCHIVE DESTINATION lib ) install(FILES dyncall_thunk.h dyncall_thunk_x86.h dyncall_thunk_ppc32.h dyncall_thunk_x64.h dyncall_thunk_arm32_arm.h dyncall_thunk_arm32_thumb.h dyncall_alloc_wx.h dyncall_args.h dyncall_callback.h DESTINATION include ) MoarVM-2015.11/3rdparty/dyncall/dyncallback/DynCallbackConfig.cmake0000644000175000017500000000015112456307246024022 0ustar jnthnjnthnset(DYNCALLBACK_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dyncallback) set(DYNCALLBACK_LIBRARIES dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/dyncallback/Makefile.M0000644000175000017500000000050312456307246021357 0ustar jnthnjnthn#include "../buildsys/dynmake/Makefile.base.M" all: _L(dyncallback_s) _L(dyncallback_s): _O(dyncall_thunk) _O(dyncall_alloc_wx) _O(dyncall_args) _O(dyncall_callback) _O(dyncall_callback_arch) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/dyncallback/Makefile.embedded0000644000175000017500000000074212456307246022721 0ustar jnthnjnthnTARGET = libdyncallback_s.a OBJS = dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_arch.o dyncall_thunk.o CFLAGS += -I../dyncall HEADERS = dyncall_callback.h dyncall_args.h all: ${TARGET} ${TARGET}: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib .PHONY: all clean install MoarVM-2015.11/3rdparty/dyncall/dyncallback/Makefile.generic0000644000175000017500000000131112466674236022604 0ustar jnthnjnthnLIBNAME = dyncallback OBJS = dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_arch.o dyncall_thunk.o HEADERS = ${VPATH}/dyncall_thunk.h ${VPATH}/dyncall_thunk_x86.h ${VPATH}/dyncall_thunk_ppc32.h ${VPATH}/dyncall_thunk_x64.h ${VPATH}/dyncall_thunk_arm32_arm.h ${VPATH}/dyncall_thunk_arm32_thumb.h ${VPATH}/dyncall_thunk_arm64.h ${VPATH}/dyncall_args.h ${VPATH}/dyncall_callback.h TOP = ${VPATH}/.. CFLAGS += -I${TOP}/dyncall LIB = lib${LIBNAME}_s.a .PHONY: all clean install all: ${LIB} ${LIB}: ${OBJS} ${AR} ${ARFLAGS} ${LIB} ${OBJS} clean: rm -f ${OBJS} ${LIB} install: all mkdir -p ${PREFIX}/lib mkdir -p ${PREFIX}/include cp ${LIB} ${PREFIX}/lib cp ${HEADERS} ${PREFIX}/include MoarVM-2015.11/3rdparty/dyncall/dyncallback/Nmakefile0000644000175000017500000000444412456307246021352 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdyncallback_s.lib #libdyncallback.lib libdyncallback.dll OBJS = dyncall_thunk.obj dyncall_alloc_wx.obj dyncall_args.obj dyncall_callback.obj dyncall_callback_$(BUILD_ARCH)_masm.obj libdyncallback_s.lib: $(OBJS) echo Creating library $@ ... $(AR) $(ARFLAGS) /OUT:"$@" $(OBJS) > nul libdyncallback.dll libdyncallback.lib: $(OBJS) echo Creating shared/import library $@ ... $(LD) /DLL $(LDFLAGS) $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdyncallback_s.a OBJS = dyncall_thunk.o dyncall_alloc_wx.o dyncall_args.o dyncall_callback.o dyncall_callback_$(BUILD_ARCH)_gas.o libdyncallback_s.a: $(OBJS) echo Creating library $@ ... $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ELSE TARGETS = libdyncallback_s.a #OBJS = dyncall_thunk.obj dyncall_alloc_wx.obj dyncall_args.obj dyncall_callback.obj dyncall_callback_$(BUILD_ARCH).obj libdyncallback_s.a:# $(OBJS) echo Not building dyncallback: There is no dyncallback support on this platform. # echo Creating library $@ ... # $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/dyncallback/README.txt0000644000175000017500000000013312456307246021221 0ustar jnthnjnthncomponents: - alloc_wx - thunk BUGS call back failures for x64 apple: lppffldplfffddd)i MoarVM-2015.11/3rdparty/dyncall/dyncallback/TODO0000644000175000017500000000022512456307246020215 0ustar jnthnjnthnURGENT: - discuss character literal return value specifiers (e.g. cmp %al, 'i'), we might wanna use just an int for the size - psp mips support MoarVM-2015.11/3rdparty/dyncall/dyncallback/dynMakefile0000644000175000017500000000031612456307246021701 0ustar jnthnjnthnall: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_alloc_wx.c0000644000175000017500000000236712456307246023220 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx.c Description: Allocate write/executable memory - Implementation back-end selector (mmap or win32) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC_WINDOWS) #include "dyncall_alloc_wx_win32.c" #elif defined(DC_UNIX) #include "dyncall_alloc_wx_mmap.c" #else #include "dyncall_alloc_wx_malloc.c" #endif MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_alloc_wx.h0000644000175000017500000000245112466674236023226 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx.h Description: Allocate write/executable memory - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ALLOC_WX_HPP #define DYNCALL_ALLOC_WX_HPP #include "dyncall_types.h" typedef int DCerror; #ifdef __cplusplus extern "C" { #endif DCerror dcAllocWX(DCsize size, void** p); void dcFreeWX (void* p, DCsize size); #ifdef __cplusplus } #endif #endif /* DYNCALL_ALLOC_WX_HPP */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_malloc.c0000644000175000017500000000231712456307246024542 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_malloc.c Description: Allocate write/executable memory - Fallback implementation based License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include int dcAllocWX(size_t size, void** pp) { *pp = malloc(size); return 0; } void dcFreeWX(void* p, size_t size) { free(p); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_mmap.c0000644000175000017500000000253312456307246024225 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_mmap.c Description: Allocate write/executable memory - Implementation for posix License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include #include int dcAllocWX(size_t size, void** pp) { void* p = mmap(0, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if (p == ( (void*)-1 ) ) return -1; *pp = p; return 0; } void dcFreeWX(void* p, size_t size) { munmap(p, size); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_alloc_wx_win32.c0000644000175000017500000000255712456307246024243 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_alloc_wx_win32.c Description: Allocate write/executable memory - Implementation for win32 platform License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_alloc_wx.h" #include #include int dcAllocWX(size_t size, void** ptr) { LPVOID p = VirtualAlloc(0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (p == NULL) return -1; *ptr = p; return 0; } void dcFreeWX(void* p, size_t size) { BOOL b = VirtualFree( p, 0, MEM_RELEASE); assert(b); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args.c0000644000175000017500000000342712466674236022351 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args.c Description: Callback's Arguments VM - Implementation back-end selector License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__Arch_Intel_x86) #include "dyncall_args_x86.c" #elif defined (DC__Arch_AMD64) #include "dyncall_args_x64.c" #elif defined (DC__Arch_PPC32) # if defined (DC__OS_Darwin) # include "dyncall_args_ppc32.c" # else # include "dyncall_args_ppc32_sysv.c" # endif #elif defined (DC__Arch_PPC64) #include "dyncall_args_ppc64.c" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_args_arm32_arm.c" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_args_arm32_thumb.c" #elif defined (DC__Arch_MIPS) #include "dyncall_args_mips.c" #elif defined (DC__Arch_Sparc) #include "dyncall_args_sparc32.c" #elif defined (DC__Arch_Sparcv9) #include "dyncall_args_sparc64.c" #elif defined (DC__Arch_ARM64) #include "dyncall_args_arm64.c" #endif MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args.h0000644000175000017500000000367512456307246022354 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args.h Description: Callback's Arguments VM - Interface License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ARGS_H #define DYNCALL_ARGS_H /* * dyncall args C API * * dyncall args provides serialized access to arguments of a function call. * related concepts: callback * */ #include "dyncall.h" #ifdef __cplusplus extern "C" { #endif typedef struct DCArgs DCArgs; DC_API DCbool dcbArgBool (DCArgs*); DC_API DCchar dcbArgChar (DCArgs*); DC_API DCshort dcbArgShort (DCArgs*); DC_API DCint dcbArgInt (DCArgs*); DC_API DClong dcbArgLong (DCArgs*); DC_API DClonglong dcbArgLongLong (DCArgs*); DC_API DCuchar dcbArgUChar (DCArgs*); DC_API DCushort dcbArgUShort (DCArgs*); DC_API DCuint dcbArgUInt (DCArgs*); DC_API DCulong dcbArgULong (DCArgs*); DC_API DCulonglong dcbArgULongLong(DCArgs*); DC_API DCfloat dcbArgFloat (DCArgs*); DC_API DCdouble dcbArgDouble (DCArgs*); DC_API DCpointer dcbArgPointer (DCArgs*); #ifdef __cplusplus } #endif #endif /* DYNCALL_ARGS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.c0000644000175000017500000000662112456307246024204 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_arm.c Description: Callback's Arguments VM - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_arm32_arm.h" static void arm_align_64(DCArgs* args) { /* Look at signature to see if current calling convention needs alignment */ /* or not (e.g. EABI has different alignment). If nothing specified, fall */ /* back to default behaviour for this platform. */ /* @@@ check signature string */ int sig = #if defined(DC__ABI_ARM_EABI) 0; /* EABI */ #else 1; /* ATPCS */ #endif if(sig == 0) { if(args->reg_count < 4) args->reg_count = (args->reg_count+1)&~1; if(args->reg_count >= 4 && (int)args->stack_ptr & 4) ++args->stack_ptr; } } static void* arm_word(DCArgs* args) { if(args->reg_count < 4) return &args->reg_data[args->reg_count++]; else return (void*)args->stack_ptr++; } static DCdouble arm_double(DCArgs* args) { union { DCdouble d; DClong l[2]; } d; arm_align_64(args); d.l[0] = *(DClong*)arm_word(args); d.l[1] = *(DClong*)arm_word(args); return d.d; } static DClonglong arm_longlong(DCArgs* args) { union { DClonglong ll; DClong l[2]; } ll; arm_align_64(args); ll.l[0] = *(DClong*)arm_word(args); ll.l[1] = *(DClong*)arm_word(args); return ll.ll; } // ---------------------------------------------------------------------------- // C API implementation: // base operations: DClonglong dcbArgLongLong (DCArgs* p) { return arm_longlong(p); } DClong dcbArgLong (DCArgs* p) { return *(DClong*)arm_word(p); } DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgLong(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgLong(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgLong(p); } DCbool dcbArgBool (DCArgs* p) { return (dcbArgLong(p) == 0) ? 0 : 1; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong)dcbArgLongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLong(p); } DCdouble dcbArgDouble (DCArgs* p) { return arm_double(p); } DCfloat dcbArgFloat (DCArgs* p) { return *(DCfloat*) arm_word(p); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.h0000644000175000017500000000240612456307246024206 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_arm.h Description: Callback's Arguments VM - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_ARM32_ARM_H #define DYNCALLBACK_ARGS_ARM32_ARM_H #include "dyncall_args.h" struct DCArgs { /* Don't change order! */ long reg_data[4]; int reg_count; long* stack_ptr; }; #endif /* DYNCALLBACK_ARGS_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.c0000644000175000017500000000221012456307246024532 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_thumb.c Description: Callback's Arguments VM - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_arm32_thumb.h" #include "dyncall_args_arm32_arm.c" /* Uses same code as ARM mode. */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.h0000644000175000017500000000232512456307246024546 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm32_thumb.h Description: Callback's Arguments VM - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_ARM32_THUMB_H #define DYNCALLBACK_ARGS_ARM32_THUMB_H #include "dyncall_args_arm32_arm.h" /* Uses same code as ARM mode. */ #endif /* DYNCALLBACK_ARGS_ARM32_THUMB_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_arm64.c0000644000175000017500000000501112466674236023351 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_arm64.c Description: Callback's Arguments VM - Implementation for ARM64 / ARMv8 / AAPCS64 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args.h" #include typedef union { struct { double value; } d; struct { float value; } f; } DCFPU_t; struct DCArgs { /* buffers and stack-pointer: */ uint64_t I[8]; DCFPU_t F[8]; uint64_t* sp; /* counters: */ int i; int f; int s; int reserved; }; DClonglong dcbArgLongLong (DCArgs* p) { if (p->i < 8) { return p->I[p->i++]; } else { return *(p->sp)++; } } DCdouble dcbArgDouble (DCArgs* p) { return (p->f < 8) ? p->F[p->f++].d.value : * ( (double*) (p->sp++) ); } DCfloat dcbArgFloat (DCArgs* p) { return (p->f < 8) ? p->F[p->f++].f.value : * ( (float*) (p->sp++) ); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgLongLong(p); } DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgLongLong(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgLongLong(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgLongLong(p); } DCbool dcbArgBool (DCArgs* p) { return dcbArgLongLong(p) & 0x1; } DCpointer dcbArgPointer(DCArgs* p) { return (DCpointer) dcbArgLongLong(p); } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_mips.c0000644000175000017500000000521012456307246023362 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_mips.c Description: Callback's Arguments VM - Implementation for MIPS License: Copyright (c) 2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_mips.h" DCint dcbArgInt(DCArgs* p) { DCint value; if(p->ireg_count < 8) value = p->ireg_data[p->ireg_count++]; else { value = *((int*)p->stackptr); p->stackptr += sizeof(int); } return value; } DCuint dcbArgUInt(DCArgs* p) { return (DCuint)dcbArgInt(p); } DCulonglong dcbArgULongLong(DCArgs* p) { DCulonglong value; p->ireg_count += (p->ireg_count & 1); // Skip one reg if not aligned. value = ((DCulonglong)dcbArgUInt(p)) << 32; value |= dcbArgUInt(p); return value; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer(DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCfloat dcbArgFloat(DCArgs* p) { DCfloat result; if(p->freg_count < 8) result = (DCfloat)p->freg_data[p->freg_count++]; else { result = *((float*)p->stackptr); p->stackptr += sizeof(float); } return result; } DCdouble dcbArgDouble(DCArgs* p) { union { DCdouble result; DCfloat f[2]; } d; p->freg_count += (p->freg_count & 1); // Skip one reg if not aligned. d.f[0] = dcbArgFloat(p); d.f[1] = dcbArgFloat(p); return d.result; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_mips.h0000644000175000017500000000243412456307246023374 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_mips.h Description: Callback's Arguments VM - Header for MIPS License: Copyright (c) 2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_MIPS_H #define DYNCALLBACK_ARGS_MIPS_H #include "dyncall_args.h" struct DCArgs { int ireg_data[8]; float freg_data[8]; int ireg_count; int freg_count; unsigned char* stackptr; }; #endif /* DYNCALLBACK_ARGS_MIPS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_ppc32.c0000644000175000017500000000544712456307246023355 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc32.c Description: Callback's Arguments VM - Implementation for ppc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_ppc32.h" DCint dcbArgInt (DCArgs* p) { DCint value; if (p->ireg_count < 8) value = p->ireg_data[p->ireg_count++]; else value = *( (int*) p->stackptr ); p->stackptr += sizeof(int); return value; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCulonglong dcbArgULongLong (DCArgs* p) { DCulonglong value; value = ( (DCulonglong) dcbArgUInt(p) ) << 16UL; value |= dcbArgUInt(p); return value; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { DCdouble result; if (p->ireg_count < 7) { p->ireg_count+=2; } else if (p->ireg_count == 7) { p->ireg_count = 8; } if (p->freg_count < 13) { result = p->freg_data[p->freg_count++]; } else { result = * ( (double*) p->stackptr ); } p->stackptr += sizeof(double); return result; } DCfloat dcbArgFloat (DCArgs* p) { DCfloat result; if (p->ireg_count < 8) p->ireg_count++; if (p->freg_count < 13) { result = (DCfloat) p->freg_data[p->freg_count++]; } else { result = * ( (float*) p->stackptr ); } p->stackptr += sizeof(float); return result; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_ppc32.h0000644000175000017500000000315712466674236023365 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc32.h Description: Callback's Arguments VM - Header for ppc32 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_PPC32_H #define DYNCALLBACK_ARGS_PPC32_H #include "dyncall_args.h" /* Common Args iterator for Apple and System V ABI. */ struct DCArgs { int ireg_data[8]; /* offset: 0 size: 4*8 = 32 */ double freg_data[13]; /* offset: 32 size: 8*13= 104 */ unsigned char* stackptr; /* offset: 136 size: 4 */ int ireg_count; /* offset: 140 size: 4 */ int freg_count; /* offset: 144 size: 4 */ }; /* total size: 148 */ #endif /* DYNCALLBACK_ARGS_PPC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_ppc32_sysv.c0000644000175000017500000000623312466674236024442 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc32_sysv.c Description: Callback's Args Implementation for PowerPC 32-bit System V ABI License: Copyright (c) 2015 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_ppc32.h" DCint dcbArgInt (DCArgs* p) { DCint value; if (p->ireg_count < 8) value = p->ireg_data[p->ireg_count++]; else { value = *( (int*) p->stackptr ); p->stackptr += sizeof(int); } return value; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCulonglong dcbArgULongLong (DCArgs* p) { DCulonglong value; if (p->ireg_count < 7) { /* next free integer register is even (r0, r2, r3) ? */ /* if not, skip one integer */ p->ireg_count = (p->ireg_count + 1) & -2; value = * (unsigned long long*) ( & p->ireg_data[p->ireg_count] ); p->ireg_count += 2; } else { p->ireg_count = 8; /* 64-bit values are naturally aligned on stack */ p->stackptr = (unsigned char*) ( ( ( (ptrdiff_t) (p->stackptr) ) + 7) & ( (ptrdiff_t) -8 ) ); value = * ( (unsigned long long*) p->stackptr ); p->stackptr += sizeof(unsigned long long); } return value; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { DCdouble result; if (p->freg_count < 8) { result = p->freg_data[p->freg_count++]; } else { p->stackptr = (unsigned char*) ( ( ( (ptrdiff_t) (p->stackptr) ) + 7) & ( (ptrdiff_t) -8 ) ); result = * ( (double*) p->stackptr ); p->stackptr += sizeof(double); } return result; } DCfloat dcbArgFloat (DCArgs* p) { DCfloat result; if (p->freg_count < 8) { result = (DCfloat) p->freg_data[p->freg_count++]; } else { result = * ( (float*) p->stackptr ); p->stackptr += sizeof(float); } return result; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_ppc64.c0000644000175000017500000000471112466674236023362 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc64.c Description: Callback's Arguments VM - Implementation for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_ppc64.h" DCint dcbArgInt (DCArgs* p) { return (DCint) dcbArgLongLong(p); } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgLongLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } DClonglong dcbArgLongLong(DCArgs* p) { DClonglong value; if (p->ireg_count < 8) { value = p->ireg_data[p->ireg_count++]; } else { value = *( (long long*) p->stackptr ); } p->stackptr += sizeof(long long); return value; } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgLongLong(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLongLong(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgLongLong(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgLongLong(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgLongLong(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgLongLong(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgLongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgLongLong(p); } DCdouble dcbArgDouble (DCArgs* p) { DCdouble result; if (p->freg_count < 13) { result = p->freg_data[p->freg_count++]; if (p->ireg_count < 8) { p->ireg_count++; } } else { result = * ( (double*) p->stackptr ); } p->stackptr += sizeof(double); return result; } DCfloat dcbArgFloat (DCArgs* p) { return (DCfloat)dcbArgDouble(p); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_ppc64.h0000644000175000017500000000235012466674236023364 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_ppc64.h Description: Callback's Arguments VM - Header for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_PPC64_H #define DYNCALLBACK_ARGS_PPC64_H #include "dyncall_args.h" struct DCArgs { long long ireg_data[8]; double freg_data[13]; unsigned char* stackptr; int ireg_count; int freg_count; }; #endif /* DYNCALLBACK_ARGS_PPC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_sparc32.c0000644000175000017500000000376212456307246023701 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc32.c Description: Callback's Arguments VM - Implementation for sparc32 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_sparc32.h" DCint dcbArgInt (DCArgs* p) { return 0; } DCuint dcbArgUInt (DCArgs* p) { return 0; } DCulonglong dcbArgULongLong (DCArgs* p) { return 0; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { return 0.0; } DCfloat dcbArgFloat (DCArgs* p) { return 0.0f; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_sparc32.h0000644000175000017500000000225712456307246023704 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc32.h Description: Callback's Arguments VM - Header for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_SPARC32_H #define DYNCALLBACK_ARGS_SPARC32_H #include "dyncall_args.h" struct DCArgs { int dummy; }; #endif /* DYNCALLBACK_ARGS_SPARC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_sparc64.c0000644000175000017500000000376212456307246023706 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc64.c Description: Callback's Arguments VM - Implementation for sparc64 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_sparc64.h" DCint dcbArgInt (DCArgs* p) { return 0; } DCuint dcbArgUInt (DCArgs* p) { return 0; } DCulonglong dcbArgULongLong (DCArgs* p) { return 0; } DClonglong dcbArgLongLong(DCArgs* p) { return (DClonglong)dcbArgULongLong(p); } DClong dcbArgLong (DCArgs* p) { return (DClong) dcbArgUInt(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgUInt(p); } DCchar dcbArgChar (DCArgs* p) { return (DCchar) dcbArgUInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgUInt(p); } DCshort dcbArgShort (DCArgs* p) { return (DCshort) dcbArgUInt(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort)dcbArgUInt(p); } DCbool dcbArgBool (DCArgs* p) { return (DCbool) dcbArgUInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer)dcbArgUInt(p); } DCdouble dcbArgDouble (DCArgs* p) { return 0.0; } DCfloat dcbArgFloat (DCArgs* p) { return 0.0f; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_sparc64.h0000644000175000017500000000227112456307246023705 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_sparc64.h Description: Callback's Arguments VM - Header for sparc32 - not yet License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_SPARC64_H #define DYNCALLBACK_ARGS_SPARC64_H #include "dyncall_args.h" struct DCArgs { int dummy; }; #endif /* DYNCALLBACK_ARGS_SPARC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_x64.c0000644000175000017500000000510612456307246023037 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x64.c Description: Callback's Arguments VM - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_x64.h" static int64* arg_i64(DCArgs* args) { if (args->reg_count.i < numIntRegs) return &args->reg_data.i[args->reg_count.i++]; else return args->stack_ptr++; } static double* arg_f64(DCArgs* args) { if (args->reg_count.f < numFloatRegs) return &args->reg_data.f[args->reg_count.f++]; else { return (double*)args->stack_ptr++; } } // ---------------------------------------------------------------------------- // C API implementation: // base operations: DClonglong dcbArgLongLong (DCArgs* p) { return *arg_i64(p); } DCint dcbArgInt (DCArgs* p) { return (int) dcbArgLongLong(p); } DClong dcbArgLong (DCArgs* p) { return (long) dcbArgLongLong(p); } DCchar dcbArgChar (DCArgs* p) { return (char) dcbArgLongLong(p); } DCshort dcbArgShort (DCArgs* p) { return (short) dcbArgLongLong(p); } DCbool dcbArgBool (DCArgs* p) { return (dcbArgInt(p) == 0) ? 0 : 1; } DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgLongLong(p); } DCdouble dcbArgDouble (DCArgs* p) { return *arg_f64(p); } DCfloat dcbArgFloat (DCArgs* p) { return *(float*)arg_f64(p); } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_x64.h0000644000175000017500000000261012466674236023050 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x64.h Description: Callback's Arguments VM - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALLBACK_ARGS_X64_H #define DYNCALLBACK_ARGS_X64_H #include "dyncall_args.h" #include "dyncall_callvm_x64.h" /* reuse structures */ struct DCArgs { /* state */ int64* stack_ptr; DCRegCount_x64 reg_count; /* @@@ win64 version should maybe force alignment to 8 in order to be secure */ /* reg data */ DCRegData_x64_s reg_data; }; #endif /* DYNCALLBACK_ARGS_X64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_x86.c0000644000175000017500000000740112456307246023043 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x86.c Description: Callback's Arguments VM - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_args_x86.h" /* ---------------------------------------------------------------------------- */ /* C API implementation: */ /* base operations */ DCint dcbArgInt (DCArgs* p) { return p->vt->i32(p); } DClonglong dcbArgLongLong(DCArgs* p) { return p->vt->i64(p); } DCfloat dcbArgFloat (DCArgs* p) { return p->vt->f32(p); } DCdouble dcbArgDouble (DCArgs* p) { return p->vt->f64(p); } /* promote to integer: bool, char, short, long and pointer */ DCbool dcbArgBool (DCArgs* p) { return ( dcbArgInt(p) == 0 ) ? 0 : 1; } DCchar dcbArgChar (DCArgs* p) { return (char) dcbArgInt(p); } DCshort dcbArgShort (DCArgs* p) { return (short) dcbArgInt(p); } DClong dcbArgLong (DCArgs* p) { return (long) dcbArgInt(p); } DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgInt(p); } /* unsigned types */ DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } /* ---------------------------------------------------------------------------- */ /* virtual tables: */ /* cdecl calling convention */ static int default_i32(DCArgs* args) { return *args->stack_ptr++; } static long long default_i64(DCArgs* args) { long long result = * (long long*) args->stack_ptr; args->stack_ptr += 2; return result; } static float default_f32(DCArgs* args) { float result = * ( (float*) args->stack_ptr ); args->stack_ptr++; return result; } static double default_f64(DCArgs* args) { double result = * ( (double*) args->stack_ptr ); args->stack_ptr += 2; return result; } DCArgsVT dcArgsVT_default = { default_i32, default_i64, default_f32, default_f64 }; /* thiscall (microsoft) calling convention */ static int this_i32(DCArgs* args) { if(args->fast_data[0]) { /* ecx register = this pointer */ int thisArg = args->fast_data[0]; args->fast_data[0] = 0; return thisArg; } return *args->stack_ptr++; } DCArgsVT dcArgsVT_this_ms = { this_i32, default_i64, default_f32, default_f64 }; /* fastcall (microsoft) calling convention */ static int fast_i32(DCArgs* args) { if(args->fast_count < 2) return args->fast_data[args->fast_count++]; else return default_i32(args); } DCArgsVT dcArgsVT_fast_ms = { fast_i32, default_i64, default_f32, default_f64 }; /* fastcall (gnu) calling convention */ static long long fast_gnu_i64(DCArgs* args) { args->fast_count += 2; return default_i64(args); } DCArgsVT dcArgsVT_fast_gnu = { fast_i32, fast_gnu_i64, default_f32, default_f64 }; MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_args_x86.h0000644000175000017500000000305112456307246023045 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_args_x86.h Description: Callback's Arguments VM - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_ARGS_X86_H_ #define DYNCALL_ARGS_X86_H_ #include "dyncall_args.h" typedef struct { DCint (*i32)(DCArgs*); DClonglong (*i64)(DCArgs*); DCfloat (*f32)(DCArgs*); DCdouble (*f64)(DCArgs*); } DCArgsVT; extern DCArgsVT dcArgsVT_default; extern DCArgsVT dcArgsVT_this_ms; extern DCArgsVT dcArgsVT_fast_ms; extern DCArgsVT dcArgsVT_fast_gnu; struct DCArgs { /* callmode */ DCArgsVT* vt; /* state */ int* stack_ptr; /* fast data / 'this-ptr' info */ int fast_data[2]; int fast_count; }; #endif /* DYNCALL_ARGS_X86_H_ */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback.c0000644000175000017500000000333512466674236023147 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback.c Description: Callback - Implementation back-end selector License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__Arch_Intel_x86) #include "dyncall_callback_x86.c" #elif defined (DC__Arch_AMD64) #include "dyncall_callback_x64.c" #elif defined (DC__Arch_PPC32) #include "dyncall_callback_ppc32.c" #elif defined (DC__Arch_PPC64) #include "dyncall_callback_ppc64.c" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_callback_arm32_arm.c" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_callback_arm32_thumb.c" #elif defined (DC__Arch_MIPS) #include "dyncall_callback_mips.c" #elif defined (DC__Arch_Sparc) #include "dyncall_callback_sparc32.c" #elif defined (DC__Arch_Sparcv9) #include "dyncall_callback_sparc64.c" #elif defined (DC__Arch_ARM64) #include "dyncall_callback_arm64.c" #endif MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback.h0000644000175000017500000000337212466674236023155 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback.h Description: Callback - Interface License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_H #define DYNCALL_CALLBACK_H #include "dyncall_args.h" #include "dyncall_signature.h" #include "dyncall_value.h" typedef struct DCCallback DCCallback; // TODO: return value is the type encoded as a signature char (character of the set [vBcCsSiIjJlLfd]). typedef char (DCCallbackHandler)(DCCallback* pcb, DCArgs* args, DCValue* result, void* userdata); #ifdef __cplusplus extern "C" { #endif DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* funcptr, void* userdata); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata); void dcbFreeCallback(DCCallback* pcb); void* dcbGetUserData (DCCallback* pcb); #ifdef __cplusplus } #endif #endif /* DYNCALL_CALLBACK_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arch.S0000644000175000017500000000524512466674236024126 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arch.S Description: Callback Thunk - Implementation Back-end selector License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../dyncall/dyncall_macros.h" #if defined(DC__C_MSVC) # if defined(DC__OS_Win32) # include "dyncall_callback_x86_masm.asm" # elif defined(DC__OS_Win64) # include "dyncall_callback_x64_masm.asm" # endif #elif defined(DC__OS_Plan9) # if defined(DC__Arch_Intel_x86) # include "dyncall_callback_x86_8a.s" # else # error Unsupported Architecture on Plan9. # endif #elif defined(DC__OS_Darwin) # if defined(DC__Arch_PPC32) # include "dyncall_callback_ppc32_apple.s" # elif defined(DC__Arch_ARM_ARM) # include "dyncall_callback_arm32_arm_apple.s" # elif defined(DC__Arch_ARM_THUMB) # include "dyncall_callback_arm32_thumb_apple.s" # elif defined(DC__Arch_AMD64) # include "dyncall_callback_x64.S" # elif defined(DC__Arch_Intel_x86) # include "dyncall_callback_x86.S" # elif defined(DC__Arch_ARM64) # include "dyncall_callback_arm64.s" # else // e.g. PowerPC G5, which is PPC64, etc. # error Unsupported Architecture on Darwin/OS X. # endif #else # if defined(DC__Arch_Intel_x86) # include "dyncall_callback_x86.S" # elif defined(DC__Arch_AMD64) # include "dyncall_callback_x64.S" # elif defined(DC__Arch_PPC32) # include "dyncall_callback_ppc32.S" # elif defined(DC__Arch_PPC64) # include "dyncall_callback_ppc64.S" # elif defined(DC__Arch_ARM_ARM) # include "dyncall_callback_arm32_arm_gas.s" # elif defined(DC__Arch_ARM_THUMB) # include "dyncall_callback_arm32_thumb_gas.s" # elif defined(DC__Arch_Sparc) # include "dyncall_callback_sparc32.s" # elif defined(DC__Arch_Sparcv9) # include "dyncall_callback_sparc64.s" # elif defined(DC__Arch_ARM64) # include "dyncall_callback_arm64.s" # endif #endif MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.c0000644000175000017500000000350212456307246024777 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm.c Description: Callback - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_arm32_arm.h" #include "dyncall_args_arm32_arm.h" #include "dyncall_alloc_wx.h" #include "dyncall_signature.h" extern void dcCallbackThunkEntry(); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { pcb->handler = handler; pcb->userdata = userdata; } DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**)&pcb); if(err || !pcb) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.h0000644000175000017500000000257112456307246025011 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm.h Description: Callback - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_ARM32_ARM_H_ #define DYNCALL_CALLBACK_ARM32_ARM_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_arm32_arm.h" struct DCCallback { DCThunk thunk; // offset 0 DCCallbackHandler* handler; // offset 12 void* userdata; // offset 16 }; #endif /* DYNCALL_CALLBACK_ARM32_ARM_H_ */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s0000644000175000017500000000547212456307246026210 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm_apple.s Description: Callback Thunk - Implementation for ARM32 (ARM mode) for Apple's as License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 32 /* ARM mode */ .globl _dcCallbackThunkEntry .align 4 /* sizes */ .set DCThunk_size , 8 .set DCArgs_size , 24 .set DCValue_size , 8 /* struct DCCallback offsets and size */ .set CTX_thunk , 0 .set CTX_handler , 12 .set CTX_userdata , 16 .set DCCallback_size, 20 /* Called by thunk - thunk stores pointer to DCCallback in r12 */ _dcCallbackThunkEntry: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ stmdb r13, {r4-r11, r13, r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ mov r11, r13 /* Set frame pointer. */ sub r13, r13, #40 /* Adjust stack pointer. */ /* Grab arguments. */ mov r4, #0 stmdb r13!, {r0-r4, r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */ /* Prepare callback handler call. */ mov r0, r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ mov r1, r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ sub r13, r13, #DCValue_size /* Make room for return value. */ mov r2, r13 /* Parameter 2 (r2) = results pointer. */ ldr r3, [r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ /* Call. */ ldr r4, [r12, #CTX_handler] /* Load callback handler pointer into r4. */ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx r4 /* Call. */ /* Return value. */ ldmia r13, {r0, r1} /* Load return value in r0 and r1. */ /* Epilog. */ ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s0000644000175000017500000000550412456307246025655 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_arm_gas.s Description: Callback Thunk - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .text .code 32 /* ARM mode */ .globl dcCallbackThunkEntry /* sizes */ .set DCThunk_size , 8 .set DCArgs_size , 24 .set DCValue_size , 8 /* struct DCCallback offsets and size */ .set CTX_thunk , 0 .set CTX_handler , 12 .set CTX_userdata , 16 .set DCCallback_size, 20 /* Called by thunk - thunk stores pointer to DCCallback in r12 */ dcCallbackThunkEntry: /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ stmdb %r13, {%r4-%r11, %r13, %r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ mov %r11, %r13 /* Set frame pointer. */ sub %r13, %r13, #40 /* Adjust stack pointer. */ /* Grab arguments. */ mov %r4, #0 stmdb %r13!, {%r0-%r4, %r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */ /* Prepare callback handler call. */ mov %r0, %r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ mov %r1, %r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ sub %r13, %r13, #DCValue_size /* Make room for return value. */ mov %r2, %r13 /* Parameter 2 (r2) = results pointer. */ ldr %r3, [%r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ /* Call. */ ldr %r4, [%r12, #CTX_handler] /* Load callback handler pointer into r4. */ mov %r14, %r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ bx %r4 /* Call. */ /* Return value. */ ldmia %r13, {%r0, %r1} /* Load return value in r0 and r1. */ /* Epilog. */ ldmdb %r11, {%r4-%r11, %r13, %r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.c0000644000175000017500000000220512456307246025336 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb.c Description: Callback - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_arm32_thumb.h" #include "dyncall_callback_arm32_arm.c" /* Uses same code as ARM mode. */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.h0000644000175000017500000000232212456307246025343 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb.h Description: Callback - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_ARM32_THUMB_H_ #define DYNCALL_CALLBACK_ARM32_THUMB_H_ #include "dyncall_callback_arm32_arm.h" /* Uses same code as ARM mode. */ #endif /* DYNCALL_CALLBACK_ARM32_THUMB_H_ */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_apple.s0000644000175000017500000000260112456307246026537 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb_gas.s Description: Callback Thunk - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* We can use the ARM mode callback code here, because the thunk switches */ /* into ARM mode, the parameters passed use the same registers/stack spase */ /* as the ARM mode, and the bx instruction switches back to THUMB mode, if */ /* the function to be called has a "THUMB function address" (=address+1). */ .include "dyncall_callback_arm32_arm_apple.s" MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_gas.s0000644000175000017500000000257712456307246026224 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm32_thumb_gas.s Description: Callback Thunk - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* We can use the ARM mode callback code here, because the thunk switches */ /* into ARM mode, the parameters passed use the same registers/stack space */ /* as the ARM mode, and the bx instruction switches back to THUMB mode, if */ /* the function to be called has a "THUMB function address" (=address+1). */ .include "dyncall_callback_arm32_arm_gas.s" MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm64.c0000644000175000017500000000420412466674236024154 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm64.c Description: Callback - Implementation for ARM64 / ARMv8 / AAPCS64 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_alloc_wx.h" #include "dyncall_thunk.h" extern void dcCallbackThunkEntry(); struct DCCallback { // off size // ----|----- DCThunk thunk; // 0 32 DCCallbackHandler* handler; // 32 8 void* userdata; // 40 8 // // size 48 // aligned 48 }; void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { pcb->handler = handler; pcb->userdata = userdata; } DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_arm64.s0000644000175000017500000000477312466674236024207 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_arm64.s Description: Callback Thunk - Implementation for ARM64 / ARMv8 / AAPCS64 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // struct DCCallback // type off size // ---------|------|------ // DCThunk | 0 | 32 // handler | 32 | 8 // userdata | 40 | 8 #include "../portasm/portasm-arm.S" .align 4 GLOBAL_C(dcCallbackThunkEntry) ENTRY_C(dcCallbackThunkEntry) // input: // x9: DCCallback* pcb // x0..x7 ?? GP regs // d0..d7 ?? FP/SIMD regs // sp... ?? arguments on stack // // locals: // type off size // ---------|------|------ // Frame 0 16 // DCArgs 16 168 // DCValue 184 16 // // size 200 // aligned 208 // // locals: // x10: sp // x11: DCArgs* args mov x10, sp stp x29, x30, [sp, #-208 ]! mov x29, sp add x11, x29 , #16 // save integer registers stp x0, x1, [x11, #0 ] stp x2, x3, [x11, #16] stp x4, x5, [x11, #32] stp x6, x7, [x11, #48] stp d0, d1, [x11, #64] stp d2, d3, [x11, #80] stp d4, d5, [x11, #96] stp d6, d7, [x11, #112] eor x12, x12, x12 stp x10,x12,[x11, #128] // sp=sp, i=0, f=0 str x12, [x11, #144] // s=0, reserved=0 // call handler: // args: // x0: DCCallback* pcb // x1: DCArgs* args // x2: DCValue* result // x3: void* userdata mov x0 , x9 add x1 , x29 , #16 add x2 , x29 , #184 ldr x3 , [x9 , #40] ldr x11, [x9 , #32] blr x11 and w0, w0, #255 cmp w0, 'f' b.eq .retf cmp w0, 'd' b.eq .retf .reti: ldr x0, [x29, #184] b .ret .retf: ldr d0, [x29, #184] .ret: ldp x29, x30, [sp], #208 ret MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_mips.c0000644000175000017500000000336712456307246024175 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_mips.c Description: Callback - Implementation Header for MIPS License: Copyright (c) 2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_mips.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; pcb->handler = handler; pcb->userdata = userdata; } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**)&pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_mips.h0000644000175000017500000000257012456307246024175 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_mips.h Description: Callback - Header for MIPS License: Copyright (c) 2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_MIPS_H #define DYNCALL_CALLBACK_MIPS_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_mips.h" struct DCCallback { DCThunk thunk; /* offset 0, size 20 */ DCCallbackHandler* handler; /* offset 20, size 4 */ void* userdata; /* offset 24, size 4 */ }; #endif /* DYNCALL_CALLBACK_MIPS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.S0000644000175000017500000000747612466674236024150 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.S Description: Callback Thunk Entry for PowerPC 32-bit System V Big-Endian ABI License: Copyright (c) 2015 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" .machine ppc .text .align 2 /* Struct DCCallback */ DCB_THUNK = 0 DCB_HANDLER = 24 DCB_CLEANUP = 28 DCB_USERDATA = 32 /* Struct DCArgs */ ARGS_IREGS = 0 ARGS_FREGS = ARGS_IREGS + 4*8 ARGS_SP = ARGS_FREGS + 8*13 ARGS_ICNT = ARGS_SP + 4 ARGS_FCNT = ARGS_ICNT + 4 ARGS_SIZE = ARGS_FCNT + 4 /* Struct DCValue */ RESULT_SIZE = 8 /* Stack Offsets: */ SP_PREV = 0 SP_LR = (SP_PREV + 4) SP_PAR = SP_LR + 4 PAR_SZ = 0 SP_ARGS = SP_PAR + PAR_SZ SP_IREGS = SP_ARGS + ARGS_IREGS SP_FREGS = SP_ARGS + ARGS_FREGS SP_SP = SP_ARGS + ARGS_SP SP_ICNT = SP_ARGS + ARGS_ICNT SP_FCNT = SP_ARGS + ARGS_FCNT SP_RESULT = SP_ARGS + ARGS_SIZE SP_SIZE = SP_RESULT + RESULT_SIZE #define ALIGN(M,X) ( M+(X-1) & (-X) ) FRAMESIZE = ALIGN(SP_SIZE,16) GLOBAL_C(dcCallbackThunkEntry) ENTRY_C(dcCallbackThunkEntry) /* -------------------------------------------------------------------------- Input: r1 Stack Pointer r3-r10 Integer Arguments f1-f8 Floating-point Arguments r11 Thunk Pointer */ /* prolog */ mflr r0 stw r0, SP_LR(r1) /* store return address */ addi r12, r1, SP_PAR /* temporary r12: parameter area on callers stack frame */ stwu r1, -FRAMESIZE(r1) stw r3, SP_IREGS + 0*4(r1) /* spill 8 integer parameter registers */ stw r4, SP_IREGS + 1*4(r1) stw r5, SP_IREGS + 2*4(r1) stw r6, SP_IREGS + 3*4(r1) stw r7, SP_IREGS + 4*4(r1) stw r8, SP_IREGS + 5*4(r1) stw r9, SP_IREGS + 6*4(r1) stw r10,SP_IREGS + 7*4(r1) stfd f1, SP_FREGS + 0*8(r1) /* spill 8 (of 13) float parameter registers */ stfd f2, SP_FREGS + 1*8(r1) stfd f3, SP_FREGS + 2*8(r1) stfd f4, SP_FREGS + 3*8(r1) stfd f5, SP_FREGS + 4*8(r1) stfd f6, SP_FREGS + 5*8(r1) stfd f7, SP_FREGS + 6*8(r1) stfd f8, SP_FREGS + 7*8(r1) stw r12, SP_SP(r1) /* init stack pointer */ xor r0, r0, r0 /* init register counters */ stw r0, SP_ICNT(r1) stw r0, SP_FCNT(r1) stw r0, SP_RESULT(r1) /* init result object */ stw r0, SP_RESULT + 4(r1) /* invoke callback handler */ mr r3, r11 /* arg 1: DCCallback* pcb (r11 is thunk pointer) */ addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */ addi r5, r1, SP_RESULT /* arg 3: DCValue* result */ lwz r6, DCB_USERDATA(r11) /* arg 4: void* userdata */ /* branch-and-link to DCCallback.handler */ lwz r12, DCB_HANDLER(r11) mtctr r12 bctrl /* check result type */ cmpi cr0, r3, 'f beq .f32 cmpi cr0, r3, 'd beq .f64 .i64: lwz r3, SP_RESULT (r1) lwz r4, SP_RESULT + 4 (r1) .end: lwz r1, SP_PREV(r1) /* restore stack pointer */ lwz r0, SP_LR(r1) /* load link register with return address */ mtlr r0 blr /* branch back to link register */ .f32: lfs f1, SP_RESULT(r1) b .end .f64: lfd f1, SP_RESULT(r1) b .end MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.c0000644000175000017500000000340512466674236024154 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.c Description: Callback - Implementation Header for ppc32 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_ppc32.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; pcb->handler = handler; pcb->userdata = userdata; } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.h0000644000175000017500000000304112466674236024155 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32.h Description: Callback - Header for ppc32 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_PPC32_H #define DYNCALL_CALLBACK_PPC32_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_ppc32.h" struct DCCallback { DCThunk thunk; /* offset 0, size 24 */ DCCallbackHandler* handler; /* offset 24, size 4 */ size_t stack_cleanup; /* offset 28, size 4 */ void* userdata; /* offset 32, size 4 */ }; /* total size 36 */ #endif /* DYNCALL_CALLBACK_PPC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc32_apple.s0000644000175000017500000001163212466674236025356 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc32_apple.s Description: Callback Thunk - PowerPC 32-bit System V ABI License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .machine ppc .text .align 2 /* Callback Thunk Entry code for PowerPC 32-bit Darwin/Apple Mac OS X. */ /* Stack Frame Layout: 204 DCValue ( ) 56 DCArgs (32+104+4+8 = 148) 24 Parameter area ( 4*8 = 32 ) 0 Linkage area ( 24 ) */ /* Constants. */ INT_REGS = 8 FLOAT_REGS = 13 SIZEOF_INT = 4 SIZEOF_DOUBLE = 8 /* Linkage area. */ LINK_SP = 0 LINK_CR = 4 LINK_LR = 8 LINK_OFFSET = 0 LINK_SIZE = 24 /* Parameter area. */ PAR_OFFSET = LINK_SIZE PAR_SIZE = 32 /* local struct DCArgs */ ARGS_OFFSET = (PAR_OFFSET+PAR_SIZE) ARGS_SIZE = (SIZEOF_INT*INT_REGS)+(SIZEOF_DOUBLE*FLOAT_REGS) /* = 136 */ /* local struct DCValue */ RESULT_OFFSET = (ARGS_OFFSET+ARGS_SIZE) RESULT_SIZE = 16 /* additional locals (reg 30/31) */ LOCALS_OFFSET = (RESULT_OFFSET+RESULT_SIZE) LOCALS_SIZE = 2*SIZEOF_INT /* total */ FRAME_SIZE = ( (LOCALS_OFFSET+LOCALS_SIZE)+15 & (-16) ) /* struct DCCallback */ DCB_THUNK = 0 DCB_HANDLER = 24 DCB_STACKCLEAN = 28 DCB_USERDATA = 32 /* struct DCArgs */ DCA_IARRAY = 0 DCA_FARRAY = SIZEOF_INT*INT_REGS DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS DCA_ICOUNT = DCA_SP + 4 DCA_FCOUNT = DCA_ICOUNT + 4 /* struct DCValue */ DCV_INT = 0 DCV_FLOAT = 0 DCV_DOUBLE = 0 DCV_LONG_HI32 = 0 DCV_LONG_LO32 = 4 DCV_SIZE = 8 iregfile = ARGS_OFFSET+DCA_IARRAY fregfile = ARGS_OFFSET+DCA_FARRAY save_sp = ARGS_OFFSET+DCA_SP icount = ARGS_OFFSET+DCA_ICOUNT fcount = ARGS_OFFSET+DCA_FCOUNT .globl _dcCallbackThunkEntry /* Thunk entry: R2 = DCCallback* */ _dcCallbackThunkEntry: mflr r0 stw r0, 8(r1) /* store return address */ /* stmw r30, -8(r1) */ /* store preserved registers (r30/r31) */ addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ stw r3, iregfile+0*4(r1) /* spill 8 integer parameter registers */ stw r4, iregfile+1*4(r1) stw r5, iregfile+2*4(r1) stw r6, iregfile+3*4(r1) stw r7, iregfile+4*4(r1) stw r8, iregfile+5*4(r1) stw r9, iregfile+6*4(r1) stw r10,iregfile+7*4(r1) stfd f1, fregfile+ 0*8(r1) /* spill 13 float parameter registers */ stfd f2, fregfile+ 1*8(r1) stfd f3, fregfile+ 2*8(r1) stfd f4, fregfile+ 3*8(r1) stfd f5, fregfile+ 4*8(r1) stfd f6, fregfile+ 5*8(r1) stfd f7, fregfile+ 6*8(r1) stfd f8, fregfile+ 7*8(r1) stfd f9, fregfile+ 8*8(r1) stfd f10,fregfile+ 9*8(r1) stfd f11,fregfile+10*8(r1) stfd f12,fregfile+11*8(r1) stfd f13,fregfile+12*8(r1) /* initialize struct DCCallback */ stw r12,save_sp(r1) /* init stack pointer */ xor r0, r0, r0 /* init register counters */ stw r0, icount(r1) stw r0, fcount(r1) /* invoke callback handler */ mr r3, r2 /* arg 1: DCCallback* pcb */ addi r4, r1, ARGS_OFFSET /* arg 2: DCArgs* args */ addi r5, r1, RESULT_OFFSET /* arg 3: DCValue* result */ lwz r6, DCB_USERDATA(r2) /* arg 4: void* userdata */ /* branch-and-link to DCCallback.handler */ lwz r12, DCB_HANDLER(r2) mtctr r12 bctrl addi r0, r1, RESULT_OFFSET /* r0 = DCValue* */ /* switch on base result type */ cmpi cr0, r3, 'B beq .i32 cmpi cr0, r3, 'i beq .i32 cmpi cr0, r3, 'l beq .i64 cmpi cr0, r3, 'f beq .f32 cmpi cr0, r3, 'd beq .f64 cmpi cr0, r3, 'p beq .i32 .void: /* ignore result (void call) */ b .end .i32: /* result is integer <= 32-bit result */ lwz r3, RESULT_OFFSET + DCV_INT(r1) b .end .f32: /* result is C float result */ lfs f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .f64: lfd f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .i64: /* result is C double result */ lwz r3, RESULT_OFFSET + DCV_LONG_HI32(r1) lwz r4, RESULT_OFFSET + DCV_LONG_LO32(r1) b .end .end: lwz r1, 0(r1) /* restore stack pointer */ /* lmw r30, -8(r1) */ /* restore preserved registers */ lwz r0, 8(r1) /* load link register with return address */ mtlr r0 blr /* branch back to link register */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.S0000644000175000017500000001325712466674236024147 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc64.S Description: Callback Thunk - Implementation for PowerPC 64-bit License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-ppc.S" /* Callback Thunk Entry code for PowerPC 64-bit. */ /* Stack Frame Layout: 296 DCValue ( 8 ) 112 DCArgs ( 64+104+8+4+4 = 184 ) 48 Parameter area ( 8*8 = 64 ) 0 Linkage area ( 48 ) */ /* Constants. */ INT_REGS = 8 FLOAT_REGS = 13 SIZEOF_GPR = 8 SIZEOF_FPR = 8 /* Linkage area. */ LINK_SP = 0 LINK_CR = 8 LINK_LR = 16 LINK_OFFSET = 0 #if DC__ABI_PPC64_ELF_V == 2 LINK_TOC = 24 LINK_SIZE = 32 #else LINK_TOC = 40 LINK_SIZE = 48 #endif /* Parameter area. */ PAR_OFFSET = LINK_SIZE #if DC__ABI_PPC64_ELF_V == 2 PAR_SIZE = 0 #else PAR_SIZE = 64 #endif /* local struct DCArgs */ ARGS_OFFSET = (PAR_OFFSET+PAR_SIZE) ARGS_SIZE = (SIZEOF_GPR*INT_REGS)+(SIZEOF_FPR*FLOAT_REGS) + 8 + 4 * 4 /* local struct DCValue */ RESULT_OFFSET = (ARGS_OFFSET+ARGS_SIZE) RESULT_SIZE = 8 /* additional locals (reg 30/31) */ LOCALS_OFFSET = (RESULT_OFFSET+RESULT_SIZE) LOCALS_SIZE = 2*SIZEOF_GPR /* total */ FRAME_SIZE = ( (LOCALS_OFFSET+LOCALS_SIZE)+15 & (-16) ) /* struct DCCallback */ #if DC__ABI_PPC64_ELF_V == 2 DCB_THUNK = 0 DCB_HANDLER = 48 DCB_STACKCLEAN = 56 DCB_USERDATA = 64 #else DCB_THUNK = 0 DCB_HANDLER = 64 DCB_STACKCLEAN = 72 DCB_USERDATA = 80 #endif /* struct DCArgs */ DCA_IARRAY = 0 DCA_FARRAY = SIZEOF_GPR*INT_REGS DCA_SP = DCA_FARRAY + SIZEOF_FPR*FLOAT_REGS DCA_ICOUNT = DCA_SP + 8 DCA_FCOUNT = DCA_ICOUNT + 4 /* struct DCValue */ DCV_INT = 0 DCV_FLOAT = 0 DCV_SIZE = 8 iregfile = ARGS_OFFSET+DCA_IARRAY fregfile = ARGS_OFFSET+DCA_FARRAY save_sp = ARGS_OFFSET+DCA_SP icount = ARGS_OFFSET+DCA_ICOUNT fcount = ARGS_OFFSET+DCA_FCOUNT /* Thunk entry: R2 = DCCallback* */ .text .global dcCallbackThunkEntry .type dcCallbackThunkEntry, @function #if DC__ABI_PPC64_ELF_V != 2 .section .opd, "aw" .align 3 #endif dcCallbackThunkEntry: #if DC__ABI_PPC64_ELF_V != 2 .quad .dcCallbackThunkEntry, .TOC.@tocbase, 0 .previous .global .dcCallbackThunkEntry .dcCallbackThunkEntry: #endif mflr r0 std r0, 16(r1) /* store return address */ std r31, -8(r1) /* store preserved registers (r31) */ addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ stdu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ std r3, iregfile+0*8(r1) /* spill 8 integer parameter registers */ std r4, iregfile+1*8(r1) std r5, iregfile+2*8(r1) std r6, iregfile+3*8(r1) std r7, iregfile+4*8(r1) std r8, iregfile+5*8(r1) std r9, iregfile+6*8(r1) std r10,iregfile+7*8(r1) stfd f1, fregfile+ 0*8(r1) /* spill 13 float parameter registers */ stfd f2, fregfile+ 1*8(r1) stfd f3, fregfile+ 2*8(r1) stfd f4, fregfile+ 3*8(r1) stfd f5, fregfile+ 4*8(r1) stfd f6, fregfile+ 5*8(r1) stfd f7, fregfile+ 6*8(r1) stfd f8, fregfile+ 7*8(r1) stfd f9, fregfile+ 8*8(r1) stfd f10,fregfile+ 9*8(r1) stfd f11,fregfile+10*8(r1) stfd f12,fregfile+11*8(r1) stfd f13,fregfile+12*8(r1) /* initialize struct DCCallback */ std r12,save_sp(r1) /* init stack pointer */ xor r0, r0, r0 /* init register counters */ std r0, icount(r1) std r0, fcount(r1) std r0, RESULT_OFFSET(r1) /* invoke callback handler */ mr r3, r11 /* arg 1: DCCallback* pcb */ addi r4, r1, ARGS_OFFSET /* arg 2: DCArgs* args */ addi r5, r1, RESULT_OFFSET /* arg 3: DCValue* result */ ld r6, DCB_USERDATA(r11) /* arg 4: void* userdata */ /* branch-and-link to DCCallback.handler */ ld r12, DCB_HANDLER(r11) std r2, LINK_TOC(r1) #if DC__ABI_PPC64_ELF_V != 2 ld r2, 8(r12) ld r0, 0(r12) mtctr r0 #else mtctr r12 #endif bctrl addi r0, r1, RESULT_OFFSET /* r0 = DCValue* */ /* switch on base result type */ cmpi cr0, r3, 'B beq .i64 cmpi cr0, r3, 'i beq .i64 cmpi cr0, r3, 'c beq .i64 cmpi cr0, r3, 's beq .i64 cmpi cr0, r3, 'l beq .i64 cmpi cr0, r3, 'f beq .f32 cmpi cr0, r3, 'd beq .f64 cmpi cr0, r3, 'p beq .i64 .void: /* ignore result (void call) */ b .end .i64: /* result is 64-bit long long result */ ld r3, RESULT_OFFSET + DCV_INT(r1) b .end .f32: /* result is C float result */ lfs f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .f64: /* result is C double result */ lfd f1, RESULT_OFFSET + DCV_FLOAT(r1) b .end .end: ld r2, LINK_TOC(r1) ld r1, 0(r1) /* restore stack pointer */ ld r31, -8(r1) /* restore preserved registers */ ld r0, 16(r1) /* load link register with return address */ mtlr r0 blr /* branch back to link register */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.c0000644000175000017500000000330112466674236024154 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc64.c Description: Callback - Implementation Header for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_ppc64.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; pcb->handler = handler; pcb->userdata = userdata; } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.h0000644000175000017500000000313412466674236024165 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_ppc64.h Description: Callback - Header for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_PPC64_H #define DYNCALL_CALLBACK_PPC64_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_ppc64.h" /* ELF v2 thunk : offset 0, size 48 handler : offset 48, size 8 stack_cleanup : offset 56, size 8 userdata : offset 64, size 8 ELF v1 thunk : offset 0, size 64 handler : offset 64, size 8 stack_cleanup : offset 72, size 8 userdata : offset 80, size 8 */ struct DCCallback { DCThunk thunk; DCCallbackHandler* handler; size_t stack_cleanup; void* userdata; }; #endif /* DYNCALL_CALLBACK_PPC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.c0000644000175000017500000000335012456307246024472 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.c Description: Callback - Implementation for sparc32 (TODO: not implemented yet) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_sparc32.h" #include "dyncall_alloc_wx.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.h0000644000175000017500000000272112456307246024500 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.h Description: Callback - Header for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_SPARC32_H #define DYNCALL_CALLBACK_SPARC32_H #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_sparc32.h" struct DCCallback { DCThunk thunk; /* offset 0, size ?? */ DCCallbackHandler* handler; /* offset ??, size 4 */ size_t stack_cleanup; /* offset ??, size 4 */ void* userdata; /* offset ??, size 4 */ }; #endif /* DYNCALL_CALLBACK_SPARC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.s0000644000175000017500000000217112456307246024512 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc32.s Description: Callback Thunk - Implementation for Sparc 32-bit License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .globl dcCallbackThunkEntry dcCallbackThunkEntry: jmpl %i7 + 8, %g0 /* Return from proc. */ nop MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.c0000644000175000017500000000335012456307246024477 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc64.c Description: Callback - Implementation for sparc64 (TODO: not implemented yet) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback.h" #include "dyncall_callback_sparc32.h" #include "dyncall_alloc_wx.h" void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { } extern void dcCallbackThunkEntry(); DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { DCCallback* pcb; int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.s0000644000175000017500000000217112456307246024517 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_sparc64.s Description: Callback Thunk - Implementation for Sparc 64-bit License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ .globl dcCallbackThunkEntry dcCallbackThunkEntry: jmpl %i7 + 8, %g0 /* Return from proc. */ nop MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x64.S0000644000175000017500000001205712466674236023631 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64.S Description: Callback Thunk entry for x64 (portasm version) License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x64-att.S" /* structure sizes */ SET(DCThunk_size,24) SET(DCArgs_size_win64,80) SET(DCArgs_size_sysv,128) SET(DCValue_size,8) /* frame local variable offsets relative to %rbp*/ SET(FRAME_arg0_win64,48) SET(FRAME_arg0_sysv,16) SET(FRAME_return,8) SET(FRAME_parent,0) SET(FRAME_DCArgs_sysv,-128) SET(FRAME_DCValue_sysv,-136) SET(FRAME_DCArgs_win64,-80) SET(FRAME_DCValue_win64,-80) /* struct DCCallback */ SET(CTX_thunk,0) SET(CTX_handler,24) SET(CTX_userdata,32) SET(DCCallback_size,40) /* character constants */ #define ASCII_f 102 #define ASCII_d 100 GLOBAL(dcCallback_x64_sysv) BEGIN_PROC(dcCallback_x64_sysv) PUSH(RBP) MOV(RSP,RBP) /* initialize DCArgs */ /* float parameters (8 registers spill to DCArgs) */ SUB(LIT(8*8),RSP) MOVSD(XMM7, QWORD(RSP,8*7)) /* struct offset 120: float parameter 7 */ MOVSD(XMM6, QWORD(RSP,8*6)) /* struct offset 112: float parameter 6 */ MOVSD(XMM5, QWORD(RSP,8*5)) /* struct offset 104: float parameter 5 */ MOVSD(XMM4, QWORD(RSP,8*4)) /* struct offset 96: float parameter 4 */ MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 88: float parameter 3 */ MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 80: float parameter 2 */ MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 72: float parameter 1 */ MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 64: float parameter 0 */ /* integer parameters (6 registers spill to DCArgs) */ PUSH(R9) /* struct offset 56: parameter 5 */ PUSH(R8) /* struct offset 48: parameter 4 */ PUSH(RCX) /* struct offset 40: parameter 3 */ PUSH(RDX) /* struct offset 32: parameter 2 */ PUSH(RSI) /* struct offset 24: parameter 1 */ PUSH(RDI) /* struct offset 16: parameter 0 */ /* register counts for integer/pointer and float regs */ PUSH(LIT(0)) /* struct offset 12: fcount */ /* struct offset 8: icount */ LEA(QWORD(RBP,FRAME_arg0_sysv),RDX) /* struct offset 0: stack pointer */ PUSH(RDX) MOV(RSP,RSI) /* arg 1 RSI : DCArgs* */ /* initialize DCValue */ PUSH(LIT(0)) /* struct offset 0: return value (max long long) */ /* call handler( *ctx, *args, *value, *userdata) */ MOV(RAX,RDI) /* arg 0 RDI : DCCallback* (RAX) */ MOV(QWORD(RDI,CTX_userdata),RCX) /* arg 3 RCX : userdata* */ MOV(RSP,RDX) /* arg 2 RDX : DCValue* */ PUSH(LIT(0)) /* align to 16 bytes */ CALL_REG(QWORD(RAX,CTX_handler)) /* pass return type via registers, handle ints and floats */ MOV(QWORD(RBP,FRAME_DCValue_sysv),RAX) MOVD(RAX,XMM0) MOV(RBP,RSP) POP(RBP) RET() END_PROC(dcCallback_x64_sysv) GLOBAL(dcCallback_x64_win64) BEGIN_PROC(dcCallback_x64_win64) PUSH(RBP) MOV(RSP,RBP) /* initialize DCArgs */ /* float parameters (4 registers spill to DCArgs) */ SUB(LIT(4*8),RSP) MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 72: float parameter 3 */ MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 64: float parameter 2 */ MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 56: float parameter 1 */ MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 48: float parameter 0 */ /* integer parameters (4 registers spill to DCArgs) */ PUSH(R9) /* struct offset 40: parameter 3 */ PUSH(R8) /* struct offset 32: parameter 2 */ PUSH(RDX) /* struct offset 24: parameter 1 */ PUSH(RCX) /* struct offset 16: parameter 0 */ /* register counts for integer/pointer and float regs */ PUSH(LIT(0)) /* struct offset 12: fcount */ /* struct offset 8: icount */ LEA(QWORD(RBP,FRAME_arg0_win64),RDX) /* struct offset 0: stack pointer */ PUSH(RDX) MOV(RSP,RDX) /* arg 1 RDX : DCArgs* */ /* initialize DCValue */ // PUSHQ(LIT(0)) /* struct offset 0: return value (max long long) */ /* call handler( *ctx, *args, *value, *userdata) */ MOV(RAX,RCX) /* arg 0 RCX : DCCallback* (RAX) */ MOV(QWORD(RAX,CTX_userdata),R9) /* arg 3 R9 : userdata* */ MOV(RSP,R8) /* arg 2 R8 : DCValue* */ SUB(LIT(4*8),RSP) /* make room for spill area and call */ CALL_REG(QWORD(RAX,CTX_handler)) /* pass return type via registers, handle ints and floats */ MOV(QWORD(RBP,FRAME_DCValue_win64),RAX) MOVD(RAX,XMM0) MOV(RBP,RSP) POP(RBP) RET() END_PROC(dcCallback_x64_win64) END_ASM MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x64.c0000644000175000017500000000362712456307246023645 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64.c Description: Callback - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_x64.h" #include "dyncall_args_x64.h" #include "dyncall_alloc_wx.h" /* Callback symbol. */ extern void dcCallback_x64_sysv(); extern void dcCallback_x64_win64(); void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { pcb->handler = handler; pcb->userdata = userdata; } DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; #if defined (DC__OS_Win64) dcbInitThunk(&pcb->thunk, dcCallback_x64_win64); #else dcbInitThunk(&pcb->thunk, dcCallback_x64_sysv); #endif dcbInitCallback(pcb, signature, handler, userdata); return pcb; } void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x64.h0000644000175000017500000000252712456307246023650 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x64.h Description: Callback - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_X64_H_ #define DYNCALL_CALLBACK_X64_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_x64.h" struct DCCallback { DCThunk thunk; // offset 0, size 24 DCCallbackHandler* handler; // offset 24 void* userdata; // offset 32 }; #endif /* DYNCALL_CALLBACK_X64_H_ */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x64_masm.asm0000644000175000017500000000327112466674236025222 0ustar jnthnjnthn; auto-generated by gen-masm.sh .CODE DCThunk_size = 24 DCArgs_size_win64 = 80 DCArgs_size_sysv = 128 DCValue_size = 8 FRAME_arg0_win64 = 48 FRAME_arg0_sysv = 16 FRAME_return = 8 FRAME_parent = 0 FRAME_DCArgs_sysv = -128 FRAME_DCValue_sysv = -136 FRAME_DCArgs_win64 = -80 FRAME_DCValue_win64 = -80 CTX_thunk = 0 CTX_handler = 24 CTX_userdata = 32 DCCallback_size = 40 dcCallback_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP mov RBP,RSP sub RSP,8*8 movsd qword ptr [RSP+8*7],XMM7 movsd qword ptr [RSP+8*6],XMM6 movsd qword ptr [RSP+8*5],XMM5 movsd qword ptr [RSP+8*4],XMM4 movsd qword ptr [RSP+8*3],XMM3 movsd qword ptr [RSP+8*2],XMM2 movsd qword ptr [RSP+8*1],XMM1 movsd qword ptr [RSP+8*0],XMM0 push R9 push R8 push RCX push RDX push RSI push RDI push 0 lea RDX,qword ptr [RBP+FRAME_arg0_sysv] push RDX mov RSI,RSP push 0 mov RDI,RAX mov RCX,qword ptr [RDI+CTX_userdata] mov RDX,RSP push 0 call qword ptr [RAX+CTX_handler] mov RAX,qword ptr [RBP+FRAME_DCValue_sysv] movd XMM0,RAX mov RSP,RBP pop RBP ret dcCallback_x64_sysv ENDP dcCallback_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP mov RBP,RSP sub RSP,4*8 movsd qword ptr [RSP+8*3],XMM3 movsd qword ptr [RSP+8*2],XMM2 movsd qword ptr [RSP+8*1],XMM1 movsd qword ptr [RSP+8*0],XMM0 push R9 push R8 push RDX push RCX push 0 lea RDX,qword ptr [RBP+FRAME_arg0_win64] push RDX mov RDX,RSP mov RCX,RAX mov R9,qword ptr [RAX+CTX_userdata] mov R8,RSP sub RSP,4*8 call qword ptr [RAX+CTX_handler] mov RAX,qword ptr [RBP+FRAME_DCValue_win64] movd XMM0,RAX mov RSP,RBP pop RBP ret dcCallback_x64_win64 ENDP END MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x86.S0000644000175000017500000000567112466674236023641 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86.S Description: Callback Thunk entry for x86 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../portasm/portasm-x86.S" BEGIN_ASM DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 #define ASCII_L 76 #define ASCII_l 108 #define ASCII_d 100 #define ASCII_f 102 #define ASCII_i 105 #define ASCII_v 118 GLOBAL(dcCallbackThunkEntry) BEGIN_PROC(dcCallbackThunkEntry) PUSH(EBP) MOVL(ESP,EBP) /* local variable frame_CTX) */ PUSH(EAX) /* EAX = CTX* */ /* initialize DCArgs */ PUSH(LIT(0)) /* fast_count */ PUSH(EDX) /* fast_data[1] */ PUSH(ECX) /* fast_data[0] */ LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */ PUSH(ECX) /* stack-ptr */ PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */ MOVL(ESP,ECX) /* ECX = DCArgs* */ /* initialize DCvalue */ PUSH(LIT(0)) PUSH(LIT(0)) MOVL(ESP,EDX) /* EDX = DCValue* */ ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */ /* call handler(context) */ PUSH(DWORD(EAX,CTX_userdata)) /* userdata */ PUSH(EDX) /* DCValue* */ PUSH(ECX) /* DCargs* */ PUSH(EAX) /* DCCallback* */ CALL_DWORD(EAX,CTX_phandler) /* cleanup stack */ MOVL(EBP,ESP) /* reset esp to frame */ POP(ECX) /* skip parent frame */ POP(ECX) /* pop return address */ MOVL(DWORD(EBP,frame_CTX),EDX) ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */ PUSH(ECX) /* push back return address */ LEA(DWORD(EBP,frame_DCValue), EDX) MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */ /* handle return value */ CMP(LIT(ASCII_f),AL) JE(LOCAL(return_f32)) CMP(LIT(ASCII_d),AL) JE(LOCAL(return_f64)) /* All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case*/ LOCAL(return_i64): MOVL(DWORD(EDX,0),EAX) MOVL(DWORD(EDX,4),EDX) RET() LOCAL(return_f32): FLDS(DWORD(EDX,0)) RET() LOCAL(return_f64): FLDL(QWORD(EDX,0)) LOCAL(return_void): RET() END_PROC(dcCallbackThunkEntry) END_ASM MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x86.c0000644000175000017500000001546312456307246023652 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86.c Description: Callback - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_callback_x86.h" #include "dyncall_args_x86.h" #include "dyncall_alloc_wx.h" #include "dyncall_signature.h" /* * assembly thunk entry for callbacks */ extern void dcCallbackThunkEntry(); /* compute stacksize for callee cleanup calling conventions: * * stdcall,fastcall_ms,fastcall_gnu */ static int dcbCleanupSize_x86_cdecl(const char* signature) { return 0; } static int dcbCleanupSize_x86_std(const char* signature) { const char* ptr = signature; int size = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_this_ms(const char* signature) { const char* ptr = signature; int size = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_fast_ms(const char* signature) { const char* ptr = signature; int size = 0; int regs = 0; char ch; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_BOOL: case DC_SIGCHAR_CHAR: case DC_SIGCHAR_SHORT: case DC_SIGCHAR_INT: case DC_SIGCHAR_LONG: case DC_SIGCHAR_POINTER: case DC_SIGCHAR_UCHAR: case DC_SIGCHAR_USHORT: case DC_SIGCHAR_UINT: case DC_SIGCHAR_ULONG: case DC_SIGCHAR_STRING: if (regs < 2) regs++; else size += 4; break; case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: size += 8; break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: size += 8; break; } } return size; } static int dcbCleanupSize_x86_fast_gnu(const char* signature) { const char* ptr = signature; char ch; int size = 0; int regs = 0; while( (ch = *ptr++) != DC_SIGCHAR_ENDARG ) { switch(ch) { case DC_SIGCHAR_FLOAT: size += 4; break; case DC_SIGCHAR_DOUBLE: size += 8; break; case DC_SIGCHAR_LONGLONG: case DC_SIGCHAR_ULONGLONG: regs = 2; size += 8; break; default: if (regs < 2) regs++; else size += 4; break; } } return size; } void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata) { const char* ptr; char ch; int mode; pcb->handler = handler; pcb->userdata = userdata; ptr = signature; ch = *ptr; /* x86 hints: */ mode = DC_CALL_C_X86_CDECL; if(ch == DC_SIGCHAR_CC_PREFIX) { ptr++; ch = *ptr++; switch(ch) { case DC_SIGCHAR_CC_STDCALL: mode = DC_CALL_C_X86_WIN32_STD; break; case DC_SIGCHAR_CC_THISCALL_MS: mode = DC_CALL_C_X86_WIN32_THIS_MS; break; case DC_SIGCHAR_CC_FASTCALL_GNU: mode = DC_CALL_C_X86_WIN32_FAST_GNU; break; case DC_SIGCHAR_CC_FASTCALL_MS: mode = DC_CALL_C_X86_WIN32_FAST_MS; break; } } /* x86 configuration: */ switch(mode) { case DC_CALL_C_X86_CDECL: pcb->args_vt = &dcArgsVT_default; pcb->stack_cleanup = dcbCleanupSize_x86_cdecl(ptr); break; case DC_CALL_C_X86_WIN32_STD: pcb->args_vt = &dcArgsVT_default; pcb->stack_cleanup = dcbCleanupSize_x86_std(ptr); break; case DC_CALL_C_X86_WIN32_THIS_MS: pcb->args_vt = &dcArgsVT_this_ms; pcb->stack_cleanup = dcbCleanupSize_x86_this_ms(ptr); break; case DC_CALL_C_X86_WIN32_FAST_MS: pcb->args_vt = &dcArgsVT_fast_ms; pcb->stack_cleanup = dcbCleanupSize_x86_fast_ms(ptr); break; case DC_CALL_C_X86_WIN32_FAST_GNU: pcb->args_vt = &dcArgsVT_fast_gnu; pcb->stack_cleanup = dcbCleanupSize_x86_fast_gnu(ptr); break; } #if defined(DC_PLAN9) /* HACK for Plan9 - 'reuse' pcb->stack_cleanup as a flag to indicate if return value is 64bit. The field is not used anyways as the caller is responsible to clean up the stack in Plan9. If set to '1' the callback kernel takes into account an extra stack-parameter (pointer to 64bit return value). I thought of introducing a new field, but for one single x86 calling convention out of many, it seemed overkill to change the struct for everybody else. Maybe renaming would be a good idea, though. ~ Tassilo */ while(*ptr) { if(*ptr++ == DC_SIGCHAR_ENDARG) { pcb->stack_cleanup = (*ptr == DC_SIGCHAR_LONGLONG) || (*ptr == DC_SIGCHAR_ULONGLONG); break; } } #endif } /* * callback constructor */ DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata) { int err; DCCallback* pcb; err = dcAllocWX(sizeof(DCCallback), (void**) &pcb); if (err != 0) return 0; dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry); dcbInitCallback(pcb, signature, handler, userdata); return pcb; } /* * free */ void dcbFreeCallback(DCCallback* pcb) { dcFreeWX(pcb, sizeof(DCCallback)); } void* dcbGetUserData(DCCallback* pcb) { return pcb->userdata; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x86.h0000644000175000017500000000330612456307246023650 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_callback_x86.h Description: Callback - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_CALLBACK_X86_H_ #define DYNCALL_CALLBACK_X86_H_ #include "dyncall_callback.h" #include "dyncall_thunk.h" #include "dyncall_args_x86.h" struct DCCallback { DCThunk thunk; /* offset 0, size 16 */ DCCallbackHandler* handler; /* offset 16 */ DCArgsVT* args_vt; /* offset 20 */ size_t stack_cleanup; /* offset 24 */ void* userdata; /* offset 28 */ }; int dcCleanupSize_x86_cdecl (const char* args_signature); int dcCleanupSize_x86_std (const char* args_signature); int dcCleanupSize_x86_fast_ms (const char* args_signature); int dcCleanupSize_x86_fast_gnu(const char* args_signature); #endif /* DYNCALL_CALLBACK_X86_H_ */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x86_8a.s0000644000175000017500000000626312456307246024260 0ustar jnthnjnthn/* Package: dyncall Library: dyncall File: dyncall/dyncall_callback_x86_8a.s Description: x86 abi callback kernel implementation for Plan9's 8a License: Copyright (c) 2013 Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ TEXT dcCallbackThunkEntry(SB), $0 /* input: AX -> thunk AX+16 -> cb handler AX+20 -> dcargsvt AX+24 -> stack cleanup <-- not used for stack cleaning as caller cleans up, AX+28 -> userdata however reused as flag to indicate 64bit return value) */ /* prolog */ MOVL SP, BP /* copy of DCargs passed to cb handler */ PUSHL $0 /* fast_count (unused on plan9, but using shared x86 dcargs struct) */ SUBL $8, SP /* skip fast_data[] ( " ) */ LEAL 8(BP), CX /* ptr to args on stack, depending if return val is 64bit ... */ CMPL 24(AX), $1 JEQ is_ll_ret LEAL 4(BP), CX /* ... or not */ is_ll_ret: PUSHL CX PUSHL 20(AX) /* args vtable ptr */ MOVL SP, CX /* DCArgs-ptr (data pushed above) */ /* space for return value (long long) */ PUSHL $0 PUSHL $0 MOVL SP, DX /* retval ptr */ /* call the handler */ PUSHL 28(AX) /* userdata for handler */ PUSHL DX /* results */ PUSHL CX /* args */ PUSHL AX /* callback obj */ MOVL 16(AX), AX CALL AX /* copy retval from ptr on stack to AX or stack space if 64bit */ MOVL 8(SP), BX /* ptr to retval */ CMPL AX, $0x6c /* 'l' @@@ compares return from handler, might be different from sig - design currently in discussion */ JEQ ll_ret; CMPL AX, $0x4c /* 'L' @@@ compares return from handler, might be different from sig - design currently in discussion */ JEQ ll_ret; CMPL AX, $0x66 /* 'f' @@@ compares return from handler, might be different from sig - design currently in discussion */ JEQ f_ret; CMPL AX, $0x64 /* 'd' @@@ compares return from handler, might be different from sig - design currently in discussion */ JEQ d_ret; JMP other_ret ll_ret: MOVL 48(SP), DX /* ptr to ret address space; 48 = stack size + caller's ret address */ MOVL (BX), CX MOVL CX, (DX) MOVL 4(BX), CX MOVL CX, 4(DX) JMP cont_ret f_ret: FMOVF (BX), F0 JMP cont_ret d_ret: FMOVD (BX), F0 JMP cont_ret other_ret: MOVL (BX), AX /* 32bit non-fp are returned in AX */ /* epilog */ cont_ret: ADDL $44, SP /* Cleanup stack */ POPL CX /* hack to emulate RET without getting overly strict */ JMP CX /* 'unbalanced PUSH/POP' warning/error from 8l */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_callback_x86_masm.asm0000644000175000017500000000220412466674236025221 0ustar jnthnjnthn; auto-generated by gen-masm.sh .386 .MODEL FLAT .CODE DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 CTX_thunk = 0 CTX_phandler = 16 CTX_pargsvt = 20 CTX_stack_cleanup = 24 CTX_userdata = 28 frame_arg0 = 8 frame_ret = 4 frame_parent = 0 frame_CTX = -4 frame_DCArgs = -24 frame_DCValue = -32 _dcCallbackThunkEntry PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP mov EBP,ESP push EAX push 0 push EDX push ECX lea ECX,dword ptr [EBP+frame_arg0] push ECX push dword ptr [EAX+CTX_pargsvt] mov ECX,ESP push 0 push 0 mov EDX,ESP and ESP,-16 push dword ptr [EAX+CTX_userdata] push EDX push ECX push EAX call dword ptr [EAX+CTX_phandler] mov ESP,EBP pop ECX pop ECX mov EDX,dword ptr [EBP+frame_CTX] add ESP,dword ptr [EDX+CTX_stack_cleanup] push ECX lea EDX,dword ptr [EBP+frame_DCValue] mov EBP,dword ptr [EBP+0] cmp AL,102 je return_f32 cmp AL,100 je return_f64 return_i64: mov EAX,dword ptr [EDX+0] mov EDX,dword ptr [EDX+4] ret return_f32: fld dword ptr [EDX+0] ret return_f64: fld qword ptr [EDX+0] return_void: ret _dcCallbackThunkEntry ENDP END MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk.c0000644000175000017500000000340112466674236022536 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk.c Description: Thunk - Implementation Back-end selection License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" #if defined(DC__Arch_Intel_x86) # include "dyncall_thunk_x86.c" #elif defined(DC__Arch_AMD64) # include "dyncall_thunk_x64.c" #elif defined(DC__Arch_PPC32) # if defined(DC__OS_Darwin) # include "dyncall_thunk_ppc32.c" # else # include "dyncall_thunk_ppc32_sysv.c" # endif #elif defined(DC__Arch_PPC64) # include "dyncall_thunk_ppc64.c" #elif defined(DC__Arch_ARM_ARM) #include "dyncall_thunk_arm32_arm.c" #elif defined(DC__Arch_ARM_THUMB) #include "dyncall_thunk_arm32_thumb.c" #elif defined(DC__Arch_MIPS) #include "dyncall_thunk_mips.c" #elif defined(DC__Arch_Sparc) #include "dyncall_thunk_sparc32.c" #elif defined(DC__Arch_Sparcv9) #include "dyncall_thunk_sparc64.c" #elif defined(DC__Arch_ARM64) #include "dyncall_thunk_arm64.c" #endif MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk.h0000644000175000017500000000503112466674236022544 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk.h Description: Thunk - Interface License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_H #define DYNCALL_THUNK_H /** ** dyncall thunks ** ** thunks are small-size hybrid code/data objects, created at run-time to ** be used as function pointers with associated data and entry functions. ** ** The header contains code, that does load its address into a designated scratch ** register and will jump to a thunk function. ** ** Thunk entry procedures are compiled functions, that are called as a result of ** a thunk function. ** There is one thunk entry currently for supporting callbacks. ** ** Thunk context register ( ::= an available scratch register in the calling convention): ** ** x86: eax ** x64: rax ** ppc: r2 ** arm: r12 ** arm64: x9 ** **/ #include "dyncall_macros.h" typedef struct DCThunk_ DCThunk; #ifdef __cplusplus extern "C" { #endif void dcbInitThunk(DCThunk* p, void (*entry)()); #if defined(DC__Arch_Intel_x86) #include "dyncall_thunk_x86.h" #elif defined (DC__Arch_AMD64) #include "dyncall_thunk_x64.h" #elif defined (DC__Arch_PPC32) #include "dyncall_thunk_ppc32.h" #elif defined (DC__Arch_PPC64) #include "dyncall_thunk_ppc64.h" #elif defined (DC__Arch_ARM_ARM) #include "dyncall_thunk_arm32_arm.h" #elif defined (DC__Arch_ARM_THUMB) #include "dyncall_thunk_arm32_thumb.h" #elif defined (DC__Arch_MIPS) #include "dyncall_thunk_mips.h" #elif defined (DC__Arch_Sparc) #include "dyncall_thunk_sparc32.h" #elif defined (DC__Arch_Sparcv9) #include "dyncall_thunk_sparc64.h" #elif defined (DC__Arch_ARM64) #include "dyncall_thunk_arm64.h" #endif #ifdef __cplusplus } #endif #endif /* DYNCALL_THUNK_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.c0000644000175000017500000000333012456307246024373 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_arm.c Description: Thunk - Implementation for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* # ARM32 (ARM mode) thunk code: .code 32 sub %r12, %r15, #8 ldr %r15, [%r15, #-4] */ /* This code loads 'entry+8' into r15. The -4 is needed, because r15 as */ /* program counter points to the current instruction+8, but the pointer */ /* to the code to execute follows the ldr instruction directly. Add 8 to */ /* entry for similar reasons. NOTE: Latter seems to be implicit with */ /* latest update of arm-eabi tools. */ p->code[0] = 0xe24fc008UL; /* sub %r12, %r15, #8 */ p->code[1] = 0xe51ff004UL; /* ldr %r15, [%r15, #-4] */ p->entry = entry/*+8*/; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.h0000644000175000017500000000232612456307246024404 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_arm.h Description: Thunk - Header for ARM32 (ARM mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_ARM32_ARM_H #define DYNCALL_THUNK_ARM32_ARM_H struct DCThunk_ { unsigned int code[2]; void (*entry)(); }; #define DCTHUNK_ARM32_ARM_SIZE 12 #endif /* DYNCALL_THUNK_ARM32_ARM_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c0000644000175000017500000000224512456307246024737 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_thumb.c Description: Thunk - Implementation for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk_arm32_arm.c" /* Since we can mix ARM and THUMB */ /* assembly, reuse the ARM mode code */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h0000644000175000017500000000234212456307246024742 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm32_thumb.h Description: Thunk - Header for ARM32 (THUMB mode) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_ARM32_THUMB_H #define DYNCALL_THUNK_ARM32_THUMB_H #include "dyncall_thunk_arm32_arm.h" /* Uses same code as ARM mode. */ #define DCTHUNK_ARM32_THUMB_SIZE 12 #endif /* DYNCALL_THUNK_ARM32_THUMB_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.c0000644000175000017500000000325512466674236023556 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm64.c Description: Thunk - Implementation for ARM64 / ARMv8 / AAPCS64 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" /* Thunk Register: x9 Thunk: adr x9, Thunk ldr x10, .target br x10 nop .target: .xword 0 -- Encoded in: 0000000000000000 : 0: 10000009 adr x9, 0 4: 5800006a ldr x10, 10 <.target> 8: d61f0140 br x10 c: d503201f nop 0000000000000010 <.target>: 10: 76543210 .word 0x76543210 14: fedcba98 .word 0xfedcba98 */ void dcbInitThunk(DCThunk* p, void (*entry)()) { p->code[0] = 0x10000009; // adr x9, 0 p->code[1] = 0x5800006a; // ldr x9, entry p->code[2] = 0xd61f0140; // br x9 p->code[3] = 0xd503201f; // nop p->entry = entry; // entry: // .xword 0 } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.h0000644000175000017500000000257412466674236023566 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_arm64.h Description: Thunk - Header for ARM64 / ARMv8 / AAPCS64 License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_ARM64_H #define DYNCALL_THUNK_ARM64_H struct DCThunk_ { // off size //-----|---------- unsigned int code[4]; // 0 16 void (*entry)(); // 16 8 void* reserved; // 24 8 // 32 total size }; #endif /* DYNCALL_THUNK_ARM64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_mips.c0000644000175000017500000000530312466674236023571 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_mips.c Description: Thunk - Implementation for MIPS License: Copyright (c) 2013-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" unsigned short hi16(x) { return ( (unsigned short) (((unsigned int)x)>>16UL) ); } unsigned short lo16(x) { return ( (unsigned short) ((unsigned int)x) ); } void dcbInitThunk(DCThunk* p, void (*entry)()) { /* Thunk Register: $t4 ($12) According to o32abi: $t9 'The Linux/MIPS convention is that all PIC calls use t9 to hold the address of the called function.' [See MIPS Run, p.413] mips thunk code: lui $t4, %hi(p) lui $t9, %hi(entry) ori $t9, $t9, %lo(entry) jr $t9 ori $t4, $t4, %lo(p) thunk.o: file format elf32-tradbigmips Disassembly of section .text: 00000000 : 0: 3c0c0000 lui t4,0x0 4: 3c190000 lui t9,0x0 8: 37390000 ori t9,t9,0x0 c: 03200008 jr t9 10: 00200825 move at,at 14: 358c0000 ori t4,t4,0x0 18: 00200825 move at,at 1c: 00200825 move at,at */ #if defined(DC__Endian_BIG) p->data[0] = 0x3c0c; p->data[1] = hi16(p); /* lui $t4, hi(p) */ p->data[2] = 0x3c19; p->data[3] = hi16(entry); /* lui $t9, hi(entry) */ p->data[4] = 0x3739; p->data[5] = lo16(entry); /* ori $t9, $t9, lo(entry) */ p->jump = 0x03200008; /* jr $t9 */ p->bddt[0] = 0x358c; p->bddt[1] = lo16(p); /* ori $t4, $t4, lo(p) - branch delay slot */ #else /* defined(DC__Endian_LITTLE) */ p->data[1] = 0x3c0c; p->data[0] = hi16(p); /* lui $t4, hi(p) */ p->data[3] = 0x3c19; p->data[2] = hi16(entry); /* lui $t9, hi(entry) */ p->data[5] = 0x3739; p->data[4] = lo16(entry); /* ori $t9, $t9, lo(entry) */ p->jump = 0x03200008; /* jr $t9 */ p->bddt[1] = 0x358c; p->bddt[0] = lo16(p); /* ori $t4, $t4, lo(p) - branch delay slot */ #endif } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_mips.h0000644000175000017500000000224112456307246023565 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_mips.h Description: Thunk - Header for MIPS License: Copyright (c) 2013 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_MIPS_H #define DYNCALL_THUNK_MIPS_H struct DCThunk_ { unsigned short data[6]; unsigned int jump; unsigned short bddt[2]; }; #endif /* DYNCALL_THUNK_MIPS_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.c0000644000175000017500000000334212466674236023551 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc32.c Description: Thunk - Implementation for ppc32 darwin/apple License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" unsigned short hi16(x) { return ( (unsigned short) (((unsigned int)x)>>16UL) ); } unsigned short lo16(x) { return ( (unsigned short) ((unsigned int)x) ); } void dcbInitThunk(DCThunk* p, void (*entry)()) { /* ppc32 thunk code: lis r2 , HI16(p) ori r2 , r2, LO16(p) lwz r12, 20(r2) mtctr r12 bctr */ p->code_load_hi = 0x3c40U; /* lis r2, HI16(p) */ p->addr_self_hi = hi16(p); p->code_load_lo = 0x6042U; /* ori r2, r2, LO16(p) */ p->addr_self_lo = lo16(p); p->code_jump[0] = 0x81820014U; /* lwz r12, 20(r2) */ p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[2] = 0x4e800420U; /* bctr */ p->addr_entry = entry; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.h0000644000175000017500000000277412466674236023566 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc32.h Description: Thunk - Header for ppc32 (darwin/sysv) License: Copyright (c) 2007-2015 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_PPC32_H #define DYNCALL_THUNK_PPC32_H struct DCThunk_ { unsigned short code_load_hi, addr_self_hi; /* offset: 0 size: 4 */ unsigned short code_load_lo, addr_self_lo; /* offset: 4 size: 4 */ unsigned int code_jump[3]; /* offset: 8 size: 12 */ void (*addr_entry)(); /* offset: 20 size: 4 */ }; /* total size: 24 */ #define DCTHUNK_SIZE_PPC32 24 #endif /* DYNCALL_THUNK_PPC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32_sysv.c0000644000175000017500000000326412466674236024640 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc32.c Description: Thunks on PowerPC 32-bit System V ABI License: Copyright (c) 2015 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" unsigned short hi16(x) { return ( (unsigned short) (((unsigned int)x)>>16UL) ); } unsigned short lo16(x) { return ( (unsigned short) ((unsigned int)x) ); } void dcbInitThunk(DCThunk* p, void (*entry)()) { /* 0: 3d 60 00 00 lis r11,0 4: 61 6b 00 01 ori r11,r11,1 8: 81 82 00 14 lwz r12,20(r2) c: 7d 89 03 a6 mtctr r12 10: 4e 80 04 20 bctr */ p->code_load_hi = 0x3d60U; /* lis r11, HI16(p) */ p->addr_self_hi = hi16(p); p->code_load_lo = 0x616bU; /* ori r11, r11, LO16(p) */ p->addr_self_lo = lo16(p); p->code_jump[0] = 0x818b0014U; /* lwz r12, 20(r11) */ p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[2] = 0x4e800420U; /* bctr */ p->addr_entry = entry; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.c0000644000175000017500000000567712466674236023573 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc64.c Description: Thunk - Implementation for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" #define HIST16(x) (unsigned short)((((unsigned long)(x))>>48UL) & 0xffff) #define HIER16(x) (unsigned short)((((unsigned long)(x))>>32UL) & 0xffff) #define HI16(x) (unsigned short)((((unsigned long)(x))>>16UL) & 0xffff) #define LO16(x) (unsigned short)( ((unsigned long)(x)) & 0xffff) void dcbInitThunk(DCThunk* p, void (*entry)()) { #if DC__ABI_PPC64_ELF_V == 2 /* ppc64 thunk code: lis r11, HIST16(p) ori r11,r11, HIER16(p) rldicr r11,r11,32,31 oris r11,r11, HI16(p) ori r11,r11, LO16(p) ld r12,40(r11) mtctr r12 bctr */ p->code_load_hist = 0x3d60U; /* lis r11,HIST16(p) */ p->addr_self_hist = HIST16(p); p->code_load_hier = 0x616bU; /* ori r11,r11, HIER16(p) */ p->addr_self_hier = HIER16(p); p->code_rot = 0x796b07c6U; /* rldicr r11,r11,32,31 */ p->code_load_hi = 0x656bU; /* oris r11,r11, HI16(p) */ p->addr_self_hi = HI16(p); p->code_load_lo = 0x616bU; /* ori r11,r11, LO16(p) */ p->addr_self_lo = LO16(p); p->code_jump[0] = 0xe98b0028U; /* ld r12,40(r11) */ p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[2] = 0x4e800420U; /* bctr */ p->addr_entry = (void *)(entry); #else /* ppc64 thunk code: oris r11, r2, HI16(p) ori r11,r11, LO16(p) ld r12,48(r11) ld r2,56(r11) mtctr r12 bctr */ p->thunk_entry = (void *)&(p->code_load_hi); p->toc_thunk = ((long)(p->thunk_entry) & 0xffffffff00000000UL); p->code_load_hi = 0x644bU; /* oris r11, r2, HI16(p) */ p->addr_self_hi = HI16(p); p->code_load_lo = 0x616bU; /* ori r11,r11, LO16(p) */ p->addr_self_lo = LO16(p); p->code_jump[0] = 0xe98b0030U; /* ld r12,48(r11) */ p->code_jump[1] = 0xe84b0038U; /* ld r2,56(r11) */ p->code_jump[2] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[3] = 0x4e800420U; /* bctr */ p->addr_entry = (void *)*((long *)entry); p->toc_entry = *((long *)(entry + 8)); #endif } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.h0000644000175000017500000000410612466674236023562 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_ppc64.h Description: Thunk - Header for ppc64 License: Copyright (c) 2014-2015 Masanori Mitsugi Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_PPC64_H #define DYNCALL_THUNK_PPC64_H #if DC__ABI_PPC64_ELF_V == 2 struct DCThunk_ { unsigned short addr_self_hist, code_load_hist; /* offset: 0 */ unsigned short addr_self_hier, code_load_hier; /* offset: 4 */ unsigned int code_rot; /* offset: 8 */ unsigned short addr_self_hi, code_load_hi; /* offset: 12 */ unsigned short addr_self_lo, code_load_lo; /* offset: 16 */ unsigned int code_jump[5]; /* offset: 20 */ void (*addr_entry)(); /* offset: 40 */ }; #define DCTHUNK_SIZE_PPC64 48 #else struct DCThunk_ { void (*thunk_entry)(); /* offset: 0 */ long toc_thunk; /* offset: 8 */ unsigned short code_load_hi, addr_self_hi; /* offset: 16 */ unsigned short code_load_lo, addr_self_lo; /* offset: 20 */ unsigned int code_jump[6]; /* offset: 24 */ void (*addr_entry)(); /* offset: 48 */ long toc_entry; /* offset: 56 */ }; #define DCTHUNK_SIZE_PPC64 64 #endif #endif /* DYNCALL_THUNK_PPC64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.c0000644000175000017500000000214612456307246024071 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc32.c Description: Thunk - Implementation for sparc32 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* not yet implemented */ } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.h0000644000175000017500000000227512456307246024101 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc32.h Description: Thunk - Header for sparc32 - not yet implemented License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_SPARC32_H #define DYNCALL_THUNK_SPARC32_H struct DCThunk_ { int x[4]; /* dummy */ }; #define DCTHUNK_SIZE_SPARC32 32 #endif /* DYNCALL_THUNK_SPARC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.c0000644000175000017500000000214612456307246024076 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc64.c Description: Thunk - Implementation for sparc64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* not yet implemented */ } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.h0000644000175000017500000000227512456307246024106 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc64.h Description: Thunk - Header for sparc64 - not yet implemented License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_SPARC64_H #define DYNCALL_THUNK_SPARC64_H struct DCThunk_ { int x[4]; /* dummy */ }; #define DCTHUNK_SIZE_SPARC64 32 #endif /* DYNCALL_THUNK_SPARC32_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_x64.c0000644000175000017500000000265012456307246023235 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x64.c Description: Thunk - Implementation for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* # x64 thunk code: .intel_syntax thunk: lea rax, (rip) # copy RIP (=p?) to RAX and use address in jmp [rax+16] # 'entry' (stored at RIP+16) for jump nop nop nop entry: .resq 1 */ p->code[0] = 0xfffffffff9058d48ULL; p->code[1] = 0x9090900000000325ULL; p->entry = entry; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_x64.h0000644000175000017500000000225212456307246023240 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x64.h Description: Thunk - Header for x64 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_X64_H #define DYNCALL_THUNK_X64_H struct DCThunk_ { unsigned long long code[2]; void (*entry)(); }; #define DCTHUNK_X64_SIZE 24 #endif /* DYNCALL_THUNK_X64_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_x86.c0000644000175000017500000000252612456307246023243 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x86.c Description: Thunk - Implementation for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_thunk.h" void dcbInitThunk(DCThunk* p, void (*entry)()) { /* x86 thunk code: nop nop nop mov %eax, p jmp [%eax+12] nop */ p->code_load = 0xb8909090UL; /* nop;nop;nop;mov %eax, ... */ p->addr_self = p; p->code_jump = 0x900C60ffUL; /* jmp [%eax+12] ; nop */ p->addr_entry = entry; } MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncall_thunk_x86.h0000644000175000017500000000234412456307246023246 0ustar jnthnjnthn/* Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_x86.h Description: Thunk - Header for x86 License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNCALL_THUNK_X86_H #define DYNCALL_THUNK_X86_H struct DCThunk_ { unsigned int code_load; void* addr_self; unsigned int code_jump; void (*addr_entry)(); }; #define DCTHUNK_X86_SIZE 16 #endif /* DYNCALL_THUNK_X86_H */ MoarVM-2015.11/3rdparty/dyncall/dyncallback/dyncallback.30000644000175000017500000001157112466674236022075 0ustar jnthnjnthn.\" Copyright (c) 2007-2014 Daniel Adler , .\" Tassilo Philipp .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .Dd $Mdocdate$ .Dt dyncallback 3 .Os .Sh NAME .Nm dyncallback .Nd callback interface of dyncall .Sh SYNOPSIS .In dyncall_callback.h .Ft DCCallback * .Fn dcbNewCallback "const char * signature" "DCCallbackHandler * funcptr" "void * userdata" .Ft void .Fn dcbInitCallback "DCCallback * pcb" "const char * signature" "DCCallbackHandler * funcptr" "void * userdata" .Ft void .Fn dcbFreeCallback "DCCallback * pcb" .Ft void .Fn dcbGetUserData "DCCallback * pcb" .Sh DESCRIPTION The .Nm dyncall library has an interface to create callback objects, that can be passed to functions as callback arguments. In other words, a pointer to the callback object can be "called", directly. The callback handler then allows iterating dynamically over the arguments once called back. .Pp .Fn dcbNewCallback creates a new callback object, where .Ar signature is a signature string describing the function to be called back (see manual for format). This is needed for .Nm dyncallback to correctly prepare the arguments passed in by the function that calls the callback handler. Note that the handler doesn't return the value specified in the signature, directly, but simply 'i' or 'f' depending on whether it is a integral or floating point type. The return value itself is stored where the handler's 3rd parameter points to (see example). .Ar funcptr is a pointer to the .Nm dyncallback callback handler (see below), and .Ar userdata a pointer to arbitrary user data you want to use in the callback handler. Use the returned pointer as callback argument in functions requiring a callback function pointer. .Pp .Fn dcbInitCallback (re)initialize the callback object. .Pp .Fn dcbFreeCallback destroys and frees the callback handler. .Pp .Fn dcbGetUserData returns a pointer to the userdata passed to the callback object on creation or initialization. .Pp Declaration of a dyncallback handler (following function pointer definition in dyncallback/dyncall_callback.h): .Bd -literal -offset indent char cbHandler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata); .Ed .Pp .Ar cb is a pointer to the DCCallback object in use .Nm result is a pointer to a DCValue object in order to store the callback's return value (output, to be set by handler). Finally, .Ar userdata is a pointer to some user defined data that can be set when creating the callback object. The handler itself returns a signature character (see manual for format) specifying the data type used for .Ar result . .Sh EXAMPLE Let's say, we want to create a callback object and call it. For simplicity, this example will omit passing it as a function pointer to a function (e.g. compar in qsort(), etc.) and demonstrate calling it, directly. First, we need to define our callback handler - the following handler illustrates how to access the passed- in arguments: .Bd -literal -offset indent char cbHandler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata) { int* ud = (int*)userdata; int arg1 = dcbArgInt (args); float arg2 = dcbArgFloat (args); short arg3 = dcbArgShort (args); double arg4 = dcbArgDouble (args); long long arg5 = dcbArgLongLong(args); // .. do something .. result->s = 1244; return 'i'; } .Ed .Pp Note that the return value of the handler is a signature character, not the actual return value, itself, and note that the actual return value is of type short. Now, let's call it through a DCCallback object: .Bd -literal -offset indent DCCallback* cb; short result = 0; int userdata = 1337; cb = dcbNewCallback("ifsdl)s", &cbHandler, &userdata); result = ((short(*)(int, float, short, double, long long))cb) (123, 23.f, 3, 1.82, 9909ll); dcbFreeCallback(cb); .Ed .Sh SEE ALSO .Xr dyncall 3 , .Xr dynload 3 and the dyncall manual (available in PDF format) for a way more detailed documentation of this library. .Sh AUTHORS .An "Daniel Adler" Aq dadler@uni-goettingen.de .An "Tassilo Philipp" Aq tphilipp@potion-studios.com MoarVM-2015.11/3rdparty/dyncall/dyncallback/gen-masm.sh0000755000175000017500000000067412466674236021607 0ustar jnthnjnthn#!/bin/sh # Uses portasm to generates MASM sources for intel platforms. printf "; auto-generated by `basename $0`\r\n" >dyncall_callback_x86_masm.asm printf "; auto-generated by `basename $0`\r\n" >dyncall_callback_x64_masm.asm gcc -E -P -DGEN_MASM dyncall_callback_x86.S | awk '{printf "%s\r\n", $0}' >> dyncall_callback_x86_masm.asm gcc -E -P -DGEN_MASM dyncall_callback_x64.S | awk '{printf "%s\r\n", $0}' >> dyncall_callback_x64_masm.asm MoarVM-2015.11/3rdparty/dyncall/dyncallback/mkfile0000644000175000017500000000226412456307246020724 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = .. <$TOP/buildsys/mk/prolog.mk LIBRARY = dyncallback UNITS = $UNITS dyncall_alloc_wx dyncall_args dyncall_callback dyncall_callback_arch dyncall_thunk <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/dynload/CMakeLists.txt0000644000175000017500000000202112456307246021444 0ustar jnthnjnthn# Package: dyncall # File: dynload/CMakeLists.txt # Description: DynLoad library cmake files # License: # # Copyright (c) 2010 Daniel Adler # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # add_library(dynload_s STATIC dynload.c dynload_syms.c) install(TARGETS dynload_s ARCHIVE DESTINATION lib) install(FILES dynload.h DESTINATION include) MoarVM-2015.11/3rdparty/dyncall/dynload/DynLoadConfig.cmake0000644000175000017500000000013212456307246022367 0ustar jnthnjnthnset(DYNLOAD_INCLUDE_DIRS ${DynCall_SOURCE_DIR}/dynload) set(DYNLOAD_LIBRARIES dynload_s) MoarVM-2015.11/3rdparty/dyncall/dynload/Makefile.M0000644000175000017500000000035512456307246020547 0ustar jnthnjnthn#include "../buildsys/dynmake/Makefile.base.M" all: _L(dynload_s) _L(dynload_s): _O(dynload) _O(dynload_syms) _(AR) _(ARFLAGS) _(ARFLAG_OUT_PREFIX)_(TARGET) _(PREREQS) clean: _(RM) _O(*) _(RM) _L(dynload_s) MoarVM-2015.11/3rdparty/dyncall/dynload/Makefile.embedded0000644000175000017500000000136712456307246022110 0ustar jnthnjnthnMAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f Makefile.embedded TARGET = libdynload_s.a OBJS = dynload.o dynload_syms.o HEADERS = dynload.h all: ${TARGET} libdynload_s.a: ${OBJS} ${AR} ${ARFLAGS} $@ ${OBJS} clean: rm -f ${OBJS} ${TARGET} install: all mkdir -p ${DESTDIR}${PREFIX}/include cp ${HEADERS} ${DESTDIR}${PREFIX}/include mkdir -p ${DESTDIR}${PREFIX}/lib cp ${TARGET} ${DESTDIR}${PREFIX}/lib .PHONY: all clean install osx-universal: CFLAGS="${CFLAGS} -arch i386 -arch x86_64 -arch ppc" ASFLAGS="${ASFLAGS} -arch i386 -arch x86_64 -arch ppc" AR="libtool" ARFLAGS="-static -o" ${MAKE_CMD} all sun-64bit: CFLAGS="${CFLAGS} -m64" ASFLAGS="${ASFLAGS} -m64" ${MAKE_CMD} all sun-gcc: CC=gcc CFLAGS="${CFLAGS} -fPIC" ${MAKE_CMD} all MoarVM-2015.11/3rdparty/dyncall/dynload/Makefile.generic0000644000175000017500000000053312456307246021765 0ustar jnthnjnthnLIBNAME = dynload OBJS = dynload.o dynload_syms.o HEADERS = ${VPATH}/dynload.h LIB = lib${LIBNAME}_s.a .PHONY: all clean install all: ${LIB} ${LIB}: ${OBJS} ${AR} ${ARFLAGS} ${LIB} ${OBJS} clean: rm -f ${OBJS} ${LIB} install: all mkdir -p ${PREFIX}/lib mkdir -p ${PREFIX}/include cp ${LIB} ${PREFIX}/lib cp ${HEADERS} ${PREFIX}/include MoarVM-2015.11/3rdparty/dyncall/dynload/Nmakefile0000644000175000017500000000324712456307246020535 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP=.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = libdynload_s.lib OBJS = dynload.obj dynload_syms.obj $(TARGETS): $(OBJS) echo Creating library $@ ... lib $(ARFLAGS) /OUT:"$@" $(OBJS) > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = libdynload_s.a OBJS = dynload_unix.o $(TARGETS):# $(OBJS) echo Not building dynload: There is no dynload support on this platform. # echo Creating library $@ ... # $(AR) -rc $(ARFLAGS) "$@" $(OBJS) !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/dynload/README.txt0000644000175000017500000000563512456307246020420 0ustar jnthnjnthndynload / abstraction to run-time shared library services: - loading/unloading into the current process - symbol lookup - enumerating symbol tables - elf: support for DT_GNU_HASH Todo: - a.out format - support for different kind of symbols (exports,imports,sections,constants...) Notes on windows pe format: File Extension: dll Implementation: 1. Access to internals The handle returned by LoadLibrary() is a pointer to the PE header (which is a DOS header). Notes on elf: File Extension: so Variants: Two core classes are defined Elf 32- and 64-bit. Only one model is compiled in the library (the current run-time format). Dynamic symbol table: Symbol table layout: 1. Index 0 in any symbol table is used to represent undefined symbols. As such, the first entry in a symbol table (index 0) is always completely zeroed (type STT_NOTYPE), and is not used. 2. If the file contains any local symbols, the second entry (index 1) the symbol table will be a STT_FILE symbol giving the name of the file. 3. Section symbols. 4. Register symbols. 5. Global symbols that have been reduced to local scope via a mapfile. 6. For each input file that supplied local symbols, a STT_FILE symbol giving the name of the input file is put in the symbol table, followed by the symbols in question. 7. The global symbols immediately follow the local symbols in the symbol table. Local and global symbols are always kept separate in this manner, and cannot be mixed together. Dynamic symbol table handling seem to be different among platforms. Due to System V ABI, one get access to the dynamic symbol table through the DT_HASH entry in "DYNAMIC" Program Header. It does not work on x86 on a x86_64 linux 2.6 machine. A closer look to the binaries in /usr/lib32 revealed, there are differences: differences - elf32 has 21 sections - elf64 has (21 + 2) sections ".hash" ".eh_frame_hdr" - elf64 has ".rela.*" while elf32 has ".rel.*" in common: - both have a ".gnu.hash" section the ".gnu.hash" Idea: "GNU hash" method ([3]) Symbol Versioning: OS supported prelinking: linux has prelink irix has quickstart solaris has crle sparc uses STT_REGISTER: STT_REGISTER is The Sparc architecture has a concept known as a "register symbol". These symbols are used to validate symbol/register usage, and can also be used to initialize global registers. Other architectures don't use these. References: [1] Levin, R. John: Linkers & Loader [2] System V ABI [3] The cost of elf symbol hashing: http://blogs.sun.com/ali/entry/the_cost_of_elf_symbol [4] GNU Hash ELF Section: http://blogs.sun.com/ali/entry/gnu_hash_elf_sections [5] http://refspecs.freestandards.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/symversion.html [6] elf: http://greek0.net/elf.html [7] System V ABI Application Binary Interface - Draft 17 - December 2003 (SCO) : http://sco.com/developers/gabi/latest/contents.html MoarVM-2015.11/3rdparty/dyncall/dynload/TODO0000644000175000017500000000174712456307246017412 0ustar jnthnjnthn- RTLD_LAZY in darwin, why not in unix? - Failed On Open Solaris 11: In file included from dynload_syms.c:28: dynload_syms_elf.c:56: error: syntax error before "Elf_Dyn" dynload_syms_elf.c:56: warning: data definition has no type or storage class dynload_syms_elf.c: In function `dlSymsInit': dynload_syms_elf.c:155: error: `pDyn' undeclared (first use in this function) dynload_syms_elf.c:155: error: (Each undeclared identifier is reported only once dynload_syms_elf.c:155: error: for each function it appears in.) dynload_syms_elf.c:155: error: syntax error before ')' token dynload_syms_elf.c:160: error: `DT_NULL' undeclared (first use in this function) dynload_syms_elf.c:163: error: `DT_STRTAB' undeclared (first use in this function) dynload_syms_elf.c:164: error: `DT_SYMTAB' undeclared (first use in this function) dynload_syms_elf.c:165: error: `DT_HASH' undeclared (first use in this function) make: *** [dynload_syms.o] Error 1 DONE: - remove dependencies dyncall_{alloc,macros}.h MoarVM-2015.11/3rdparty/dyncall/dynload/dynMakefile0000644000175000017500000000031612456307246021064 0ustar jnthnjnthnall: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/dynload/dynload.30000644000175000017500000000377212456307246020440 0ustar jnthnjnthn.\" Copyright (c) 2007-2014 Daniel Adler , .\" Tassilo Philipp .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .Dd $Mdocdate$ .Dt dynload 3 .Os .Sh NAME .Nm dynload .Nd encapsulates dynamic loading mechanisms and gives access to functions in foreign dynamic libraries and code modules. .Sh SYNOPSIS .In dynload.h .Ft DLLib * .Fn dlLoadLibrary "const char * libpath" .Ft void .Fn dlFreeLibrary "DLLib * pLib" .Ft void * .Fn dlFindSymbol "DLLib pLibode" "const char * pSymbolName" .Sh DESCRIPTION The .Nm library provides an interface to load foreign dynamic libraries and access to their symbols. .Pp .Fn dlLoadLibrary loads a dynamic library at .Ar libpath and returns a handle to it for use in .Fn dlFreeLibrary and .Fn dlFindSymbol calls. .Pp .Fn dlFreeLibrary frees the loaded library with handle .Ar pLib . .Pp .Fn dlFindSymbol returns a pointer to a symbol with name .Ar pSymbolName in the library with handle .Ar pLib , or returns a null pointer if the symbol cannot be found. .Sh SEE ALSO .Xr dyncall 3 , .Xr dyncallback 3 and the dyncall manual (available in PDF format) for a way more detailed documentation of this library. .Sh AUTHORS .An "Daniel Adler" Aq dadler@uni-goettingen.de .An "Tassilo Philipp" Aq tphilipp@potion-studios.com MoarVM-2015.11/3rdparty/dyncall/dynload/dynload.c0000644000175000017500000000243012456307246020506 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload.c Description: Auto-include delegate to windows/posix-based dynamic linker. License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OSFAMILY.h" #if defined(OSFAMILY_Windows) # include "dynload_windows.c" #elif defined(OSFAMILY_Unix) # include "../autovar/autovar_OS.h" # if defined(OS_Darwin) # include "dynload_darwin.c" # else # include "dynload_unix.c" # endif #endif MoarVM-2015.11/3rdparty/dyncall/dynload/dynload.h0000644000175000017500000000360112456307246020514 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload.h Description: public header for library dynload License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DYNLOAD_H #define DYNLOAD_H #ifdef __cplusplus extern "C" { #endif #ifndef DL_API #define DL_API #endif /* --- public api ---------------------------------------------------------- */ /* shared library loading and explicit symbol resolving */ typedef struct DLLib_ DLLib; DL_API DLLib* dlLoadLibrary(const char* libpath); DL_API void dlFreeLibrary(DLLib* pLib); DL_API void* dlFindSymbol(DLLib* pLib, const char* pSymbolName); /* symbol table enumeration - only for symbol lookup, not resolve */ typedef struct DLSyms_ DLSyms; DL_API DLSyms* dlSymsInit (const char* libPath); DL_API void dlSymsCleanup(DLSyms* pSyms); DL_API int dlSymsCount (DLSyms* pSyms); DL_API const char* dlSymsName (DLSyms* pSyms, int index); DL_API const char* dlSymsNameFromValue(DLSyms* pSyms, void* value); /* symbol must be loaded */ #ifdef __cplusplus } #endif #endif /* DYNLOAD_H */ MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_alloc.h0000644000175000017500000000226312456307246021671 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_alloc.h Description: heap memory management interface (header only) License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DL_ALLOC_H #define DL_ALLOC_H #ifndef dlAllocMem #include #define dlAllocMem malloc #endif #ifndef dlFreeMem #define dlFreeMem free #endif #endif /* DL_ALLOC_H */ MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_darwin.c0000644000175000017500000000424612456307246022061 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_darwin.c Description: dynload module for .dylib (mach-o darwin/OS X) files License: Copyright (c) 2007-2011 Olivier Chafik Minor bug-fix modifications by Daniel Adler. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_darwin.c dynload module for .dylib (mach-o darwin/OS X) files */ #include "dynload.h" #include "dynload_alloc.h" #include #include struct DLLib_ { char* libPath; void* handle; }; DLLib* dlLoadLibrary(const char* libPath) { void* handle; size_t len; DLLib* lib; handle = dlopen(libPath, RTLD_LAZY); if (!handle) return NULL; lib = (DLLib*)dlAllocMem(sizeof(DLLib)); lib->handle = handle; /* libPath might be null (self reference on image) [Daniel] */ if (libPath != NULL) { len = strlen(libPath); lib->libPath = (char*)dlAllocMem(len + 1); strcpy(lib->libPath, libPath); lib->libPath[len] = '\0'; } else { lib->libPath = NULL; } return lib; } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return dlsym(libHandle && libHandle->handle ? libHandle->handle : RTLD_DEFAULT, symbol); } void dlFreeLibrary(DLLib* libHandle) { if (!libHandle) return; dlclose(libHandle->handle); if (libHandle->libPath) dlFreeMem(libHandle->libPath); dlFreeMem(libHandle); } MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_syms.c0000644000175000017500000000230012456307246021555 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_syms.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dynload.h" #include "../autovar/autovar_ABI.h" #if defined(ABI_PE) #include "dynload_syms_pe.c" #elif defined(ABI_Mach) #include "dynload_syms_mach-o.c" #elif defined(ABI_ELF) #include "dynload_syms_elf.c" #else void dummy() { } #endif MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_syms_elf.c0000644000175000017500000001206512456307246022414 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_syms_elf.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp , Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OS.h" /* dynamic symbol resolver for elf */ #include "dynload.h" #if defined(OS_OpenBSD) # include # include #elif defined(OS_SunOS) # include #elif defined(OS_BeOS) # include #else # include #endif #if defined(__GLIBC__) # define _GNU_SOURCE # define __USE_GNU #endif #include "dynload_alloc.h" #include #include #include #include #include #include #include #include #include /* run-time configuration 64/32 */ #if defined(OS_OpenBSD) #else # include "../autovar/autovar_ABI.h" # ifdef ABI_ELF64 typedef Elf64_Ehdr Elf_Ehdr; typedef Elf64_Phdr Elf_Phdr; typedef Elf64_Shdr Elf_Shdr; typedef Elf64_Sym Elf_Sym; # ifndef OS_SunOS typedef Elf64_Dyn Elf_Dyn; # endif typedef Elf64_Sxword Elf_tag; typedef Elf64_Addr Elf_Addr; # else # if defined(OS_BeOS) typedef struct Elf32_Ehdr Elf_Ehdr; typedef struct Elf32_Phdr Elf_Phdr; typedef struct Elf32_Shdr Elf_Shdr; typedef struct Elf32_Sym Elf_Sym; typedef struct Elf32_Dyn Elf_Dyn; typedef Elf32_Sword Elf_tag; typedef Elf32_Addr Elf_Addr; # else typedef Elf32_Ehdr Elf_Ehdr; typedef Elf32_Phdr Elf_Phdr; typedef Elf32_Shdr Elf_Shdr; typedef Elf32_Sym Elf_Sym; # ifndef OS_SunOS typedef Elf32_Dyn Elf_Dyn; # endif typedef Elf32_Sword Elf_tag; typedef Elf32_Addr Elf_Addr; # endif # endif #endif struct DLSyms_ { const char* pStrTab; Elf_Sym* pSymTab; size_t strTabSize; size_t nSymbols; Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */ int file; /* fd of lib */ size_t fileSize; /* filesize of open lib */ }; DLSyms* dlSymsInit(const char* libPath) { unsigned char* pMem; void* pSectionContent; int i; struct stat st; Elf_Shdr* pS; DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms)); memset(pSyms, 0, sizeof(DLSyms)); pSyms->file = open(libPath, O_RDONLY); stat(libPath, &st); pSyms->fileSize = st.st_size; pSyms->pElf_Ehdr = (Elf_Ehdr*) mmap((void*) NULL, pSyms->fileSize, PROT_READ, MAP_SHARED, pSyms->file, 0); #ifdef ABI_ELF32 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32); #else assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64); #endif assert(pSyms->pElf_Ehdr->e_phoff > 0); assert(pSyms->pElf_Ehdr->e_shoff > 0); pMem = (unsigned char*)pSyms->pElf_Ehdr; /* traverse section headers */ pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff ); /* skip section 0 which is always zero due to the Elf standard. */ for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++) { Elf_Shdr* pSection = &pS[i]; pSectionContent = ((char*)pMem) + pSection->sh_offset; switch (pSection->sh_type) { case SHT_DYNSYM: if (!pSyms->pSymTab) { pSyms->pSymTab = (Elf_Sym*)pSectionContent; pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize; } break; case SHT_STRTAB: // Do not trust pSyms->pElf_Ehdr->e_shstrndx! if (!pSyms->pStrTab) { pSyms->pStrTab = (const char*)pSectionContent; pSyms->strTabSize = pSection->sh_size; } break; } if (pSyms->pSymTab && pSyms->pStrTab) break; } return pSyms; } void dlSymsCleanup(DLSyms* pSyms) { if(pSyms) { munmap((void*) pSyms->pElf_Ehdr, pSyms->fileSize); close(pSyms->file); dlFreeMem(pSyms); } } int dlSymsCount(DLSyms* pSyms) { if (!pSyms) return 0; return pSyms->nSymbols; } const char* dlSymsName(DLSyms* pSyms, int index) { int str_index; if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols) return NULL; str_index = pSyms->pSymTab[index].st_name; if (str_index < 0 || str_index >= pSyms->strTabSize) return NULL; return &pSyms->pStrTab[str_index]; } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { Dl_info info; return (dladdr(value, &info) && (value == info.dli_saddr)) ? info.dli_sname : NULL; } MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_syms_mach-o.c0000644000175000017500000000730612456307246023014 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_syms_mach-o.c Description: License: Copyright (c) 2007-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynamic symbol resolver for Mach-O */ #include "dynload.h" #include "dynload_alloc.h" #include #include #include #include #if defined(ARCH_X64) #define MACH_HEADER_TYPE mach_header_64 #define SEGMENT_COMMAND segment_command_64 #define NLIST_TYPE nlist_64 #else #define MACH_HEADER_TYPE mach_header #define SEGMENT_COMMAND segment_command #define NLIST_TYPE nlist #endif struct DLLib_ { char* libPath; void* handle; }; struct DLSyms_ { const char* pStringTable; const struct NLIST_TYPE* pSymbolTable; uint32_t symbolCount; }; DLSyms* dlSymsInit(const char* libPath) { DLSyms* pSyms = NULL; uint32_t iImage, nImages; for (iImage = 0, nImages = _dyld_image_count(); iImage < nImages; iImage++) { const char* name = _dyld_get_image_name(iImage); if (name && !strcmp(name, libPath)) { const struct MACH_HEADER_TYPE* pHeader = (const struct MACH_HEADER_TYPE*) _dyld_get_image_header(iImage); const char* pBase = ((const char*)pHeader); if (pHeader->filetype != MH_DYLIB) return NULL; if (pHeader->flags & MH_SPLIT_SEGS) return NULL; if (pHeader) { uint32_t iCmd, nCmds = pHeader->ncmds; const struct load_command* cmd = (const struct load_command*)(pBase + sizeof(struct MACH_HEADER_TYPE)); for (iCmd = 0; iCmd < nCmds; iCmd++) { if (cmd->cmd == LC_SYMTAB) { const struct symtab_command* scmd = (const struct symtab_command*)cmd; pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); pSyms->symbolCount = scmd->nsyms; pSyms->pStringTable = pBase + scmd->stroff; pSyms->pSymbolTable = (struct NLIST_TYPE*)(pBase + scmd->symoff); return pSyms; } cmd = (const struct load_command*)(((char*)cmd) + cmd->cmdsize); } } break; } } return NULL; } void dlSymsCleanup(DLSyms* pSyms) { if (!pSyms) return; dlFreeMem(pSyms); } int dlSymsCount(DLSyms* pSyms) { if (!pSyms) return 0; return pSyms->symbolCount; } static const struct NLIST_TYPE* get_nlist(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl; if (!pSyms) return NULL; nl = pSyms->pSymbolTable + index; if (nl->n_un.n_strx <= 1) return NULL; // would be empty string anyway //TODO skip more symbols based on nl->n_desc and nl->n_type ? return nl; } const char* dlSymsName(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl = get_nlist(pSyms, index); if (!nl) return NULL; return pSyms->pStringTable + nl->n_un.n_strx; } void* dlSymsValue(DLSyms* pSyms, int index) { const struct NLIST_TYPE* nl = get_nlist(pSyms, index); if (!nl) return NULL; return (void*) (ptrdiff_t) (nl->n_value); } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { Dl_info info; if (!dladdr(value, &info) || (value != info.dli_saddr)) return NULL; return info.dli_sname; } MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_syms_pe.c0000644000175000017500000000556712456307246022263 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_syms_pe.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dynload.h" #include "dynload_alloc.h" #include struct DLLib_ { IMAGE_DOS_HEADER dos_header; }; struct DLSyms_ { DLLib* pLib; const char* pBase; const DWORD* pNames; const DWORD* pFuncs; const unsigned short* pOrds; size_t count; }; DLSyms* dlSymsInit(const char* libPath) { DLLib* pLib = dlLoadLibrary(libPath); DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms)); const char* base = (const char*) pLib; IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*) base; IMAGE_NT_HEADERS* pNTHeader = (IMAGE_NT_HEADERS*) ( base + pDOSHeader->e_lfanew ); IMAGE_DATA_DIRECTORY* pExportsDataDir = &pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; IMAGE_EXPORT_DIRECTORY* pExports = (IMAGE_EXPORT_DIRECTORY*) (base + pExportsDataDir->VirtualAddress); pSyms->pBase = base; pSyms->pNames = (DWORD*)(base + pExports->AddressOfNames); pSyms->pFuncs = (DWORD*)(base + pExports->AddressOfFunctions); pSyms->pOrds = (unsigned short*)(base + pExports->AddressOfNameOrdinals); pSyms->count = (size_t)pExports->NumberOfNames; pSyms->pLib = pLib; return pSyms; } void dlSymsCleanup(DLSyms* pSyms) { if(pSyms) { dlFreeLibrary(pSyms->pLib); dlFreeMem(pSyms); } } int dlSymsCount(DLSyms* pSyms) { return (int)pSyms->count; } const char* dlSymsName(DLSyms* pSyms, int index) { return (const char*)((const char*)pSyms->pBase + pSyms->pNames[index]); } void* dlSymsValue(DLSyms* pSyms, int index) { return (void*)(pSyms->pBase + pSyms->pFuncs[pSyms->pOrds[index]]); } const char* dlSymsNameFromValue(DLSyms* pSyms, void* value) { int i, c=dlSymsCount(pSyms); for(i=0; i, Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_unix.c dynload module for .so (unix) and .dylib (mach-o darwin/OS X) files */ #include "dynload.h" #include DLLib* dlLoadLibrary(const char* libPath) { return (DLLib*)dlopen(libPath,RTLD_NOW|RTLD_GLOBAL); } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return dlsym((void*)libHandle, symbol); } void dlFreeLibrary(DLLib* libHandle) { // Check for NULL for cross-platform consistency. *BSD seems // to do that in dlclose, Linux does not. POSIX states "if handle // does not refer to an open object, dlclose() returns a non-zero // value", which unfortunately sounds like it's not explicitly // specified. if(libHandle) dlclose((void*)libHandle); } MoarVM-2015.11/3rdparty/dyncall/dynload/dynload_windows.c0000644000175000017500000000301012456307246022253 0ustar jnthnjnthn/* Package: dyncall Library: dynload File: dynload/dynload_windows.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* dynload_windows.c dynload module for .dll files */ #include "dynload.h" #include DLLib* dlLoadLibrary(const char* libPath) { if (libPath != NULL) { return (DLLib*) LoadLibraryA(libPath); /*return (DLLib*) LoadLibraryA(libPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);*/ } else { return (DLLib*) GetModuleHandle(NULL); } } void* dlFindSymbol(DLLib* libHandle, const char* symbol) { return (void*) GetProcAddress( (HINSTANCE)libHandle, symbol); } void dlFreeLibrary(DLLib* libHandle) { FreeLibrary( (HINSTANCE)libHandle ); } MoarVM-2015.11/3rdparty/dyncall/mkfile0000644000175000017500000000230112456307246016445 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = . <$TOP/buildsys/mk/prolog.mk # directories: DIRS = dyncall dyncallback AUTOS = ConfigVars #.PHONY: tests doc tests:V: cd test; $MK doc:V: cd $target/manual; $MK <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/portasm/README.txt0000644000175000017500000000147112456307246020445 0ustar jnthnjnthnportasm - a toolkit for writing portable generic assembler sources ------------------------------------------------------------------ Copyright (C) 2011 Daniel Adler . Licensed under BSD two-clause license. Requirements ------------ - C Preprocessor Supported Architectures and Tool-chains: ---------------------------------------- - x86: gas, apple as, masm - x64: gas, apple as, masm - ppc: gas, apple as - arm: gas, apple as Usage: ------ Implement assembler sources in *.S files which use C preprocessor. #include portasm-.S at front In order to generate MASM files for X86 and X64, run 'gen-masm.sh ' script which reads .S and outputs .masm file. Common Macros: -------------- BEGIN_ASM END_ASM BEGIN_PROC(name) END_PROC(name) GLOBAL(name) HEX(value) MoarVM-2015.11/3rdparty/dyncall/portasm/gen-masm.sh0000755000175000017500000000005512466674236021016 0ustar jnthnjnthn#!/bin/sh gcc -E -P -DGEN_MASM $1.S >$1.asm MoarVM-2015.11/3rdparty/dyncall/portasm/portasm-arm.S0000644000175000017500000000221112456307246021326 0ustar jnthnjnthn/* Package: dyncall Library: portasm File: portasm/portasm-arm.S Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define BEGIN_ASM .text #include "../autovar/autovar_OS.h" #if defined(OS_Darwin) #define GLOBAL_C(X) .globl _##X #define ENTRY_C(X) _##X: #else #define GLOBAL_C(X) .globl X #define ENTRY_C(X) X: #endif MoarVM-2015.11/3rdparty/dyncall/portasm/portasm-ppc.S0000644000175000017500000000375012456307246021342 0ustar jnthnjnthn/* Package: dyncall Library: portasm File: portasm/portasm-ppc.S Description: Portable Assembler Macros for ppc License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../autovar/autovar_OS.h" #if defined(OS_Darwin) #define GLOBAL_C(X) .globl _##X #define ENTRY_C(X) _##X: #else #define GLOBAL_C(X) .globl X #define ENTRY_C(X) X: #define r0 0 #define r1 1 #define r2 2 #define r3 3 #define r4 4 #define r5 5 #define r6 6 #define r7 7 #define r8 8 #define r9 9 #define r10 10 #define r11 11 #define r12 12 #define r13 13 #define r14 14 #define r15 15 #define r16 16 #define r17 17 #define r18 18 #define r19 19 #define r20 20 #define r21 21 #define r22 22 #define r23 23 #define r24 24 #define r25 25 #define r26 26 #define r27 27 #define r28 28 #define r29 29 #define r30 30 #define r31 31 #define f0 0 #define f1 1 #define f2 2 #define f3 3 #define f4 4 #define f5 5 #define f6 6 #define f7 7 #define f8 8 #define f9 9 #define f10 10 #define f11 11 #define f12 12 #define f13 13 #define f14 14 #define f15 15 #define f16 16 #define f17 17 #define f18 18 #define f19 19 #define f20 20 #define f21 21 #define f22 22 #define f23 23 #define f24 24 #define f25 25 #define f26 26 #define f27 27 #define f28 28 #define f29 29 #define f30 30 #define f31 31 #endif MoarVM-2015.11/3rdparty/dyncall/portasm/portasm-x64-att.S0000644000175000017500000001000612456307246021757 0ustar jnthnjnthn/* Package: dyncall Library: portasm File: portasm/portasm-x64-att.S Description: Portable Assembler Macros for X64 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Common macros. */ #define XCONCAT(A,B) A##B #if defined(GEN_MASM) /* MASM syntax. */ .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) X ENDP # define PUSH(R) push R # define POP(R) pop R # define MOV(S,D) mov D,S # define MOVB(S,D) mov D,S # define MOVL(S,D) mov D,S # define ADDL(S,D) add D,S # define ANDL(S,D) and D,S # define SUBL(S,D) sub D,S # define SHRL(S,D) shr D,S # define MOVQ(S,D) movq D,S # define ADD(S,D) add D,S # define AND(S,D) and D,S # define SUB(S,D) sub D,S # define SHR(S,D) shr D,S # define MOVD(S,D) movd D,S # define RET() ret # define CALL_DWORD(R,OFF) call DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD(S,D) movsd D,S # define MOVSDX(S,D) movsdx D,S # define DWORD(R,OFF) dword ptr [R+OFF] # define QWORD(R,OFF) qword ptr [R+OFF] # define LIT(X) X # define INT(X) int X # define HEX(X) XCONCAT(X,h) # define CALL(X) call X # define CALL_REG(X) call X # define LEA(S,D) lea D,S # define SET(K,V) K = V # define JE(X) je X # define JNE(X) jne X # define CMP(A,B) cmp B,A # define LOCAL(X) X #else /* GNU/SunPro Assembler AT&T Syntax */ .text # define BEGIN_ASM # define END_ASM # include "../autovar/autovar_OS.h" # if defined (OS_Darwin) # define CSYM(X) _##X # else # define CSYM(X) X # endif # define RAX %rax # define RBX %rbx # define RCX %rcx # define RDX %rdx # define RSI %rsi # define RDI %rdi # define RBP %rbp # define RSP %rsp # define R8 %r8 # define R9 %r9 # define R10 %r10 # define R11 %r11 # define R12 %r12 # define R13 %r13 # define R14 %r14 # define R15 %r15 # define XMM0 %xmm0 # define XMM1 %xmm1 # define XMM2 %xmm2 # define XMM3 %xmm3 # define XMM4 %xmm4 # define XMM5 %xmm5 # define XMM6 %xmm6 # define XMM7 %xmm7 # define AL %al # define AH %ah # define BL %bl # define BH %bh # define CL %cl # define CH %ch # define DL %dl # define DH %dh # define GLOBAL(X) .globl CSYM(X) # define BEGIN_PROC(X) CSYM(X): # define END_PROC(X) # define PUSH(R) pushq R # define POP(R) popq R # define MOV(S,D) movq S,D # define MOVB(S,D) movb S,D # define MOVL(S,D) movl S,D # define ADDL(S,D) addl S,D # define ANDL(S,D) andl S,D # define SUBL(S,D) subl S,D # define SHRL(S,D) shrl S,D # define MOVQ(S,D) movq S,D # define ADD(S,D) addq S,D # define AND(S,D) andq S,D # define SUB(S,D) subq S,D # define SHR(S,D) shrq S,D # define MOVD(S,D) movd S,D # define RET() ret # define CALL_DWORD(R,OFF) call *DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD(S,D) movsd S,D # define DWORD(R,OFF) OFF(R) # define QWORD(R,OFF) OFF(R) # define LIT(X) $X # define INT(X) int X # define HEX(X) XCONCAT(0x,X) # define CALL(X) call X # define CALL_REG(X) call *X # define LEA(A,B) lea A,B # define CMP(A,B) cmp A,B # define CMPB(A,B) cmpb A,B # define JE(X) je X # define JNE(X) jne X # define FLDS(X) flds X # define FLDL(X) fldl X # define SET(K,V) .set K,V # define LOCAL(X) .X #endif MoarVM-2015.11/3rdparty/dyncall/portasm/portasm-x86.S0000644000175000017500000000657612456307246021216 0ustar jnthnjnthn/* Package: dyncall Library: portasm File: portasm/portasm-x86.S Description: Portable Assembler Macros for x86 License: Copyright (c) 2011 Daniel Adler Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Common macros. */ #define XCONCAT(A,B) A##B /* MASM syntax. */ #if defined(GEN_MASM) .386 .MODEL FLAT .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) _##X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) _##X ENDP # define PUSH(R) push R # define POP(R) pop R # define MOVL(S,D) mov D,S # define ADDL(S,D) add D,S # define ANDL(S,D) and D,S # define SUBL(S,D) sub D,S # define SHRL(S,D) shr D,S # define RET() ret # define CALL_DWORD(R,OFF) call DWORD(R,OFF) # define REP(X) rep X # define MOVSB movsb # define MOVSW movsw # define MOVSD movsd # define DWORD(R,OFF) dword ptr [R+OFF] # define QWORD(R,OFF) qword ptr [R+OFF] # define LIT(X) X # define INT(X) int X # define HEX(X) XCONCAT(X,h) # define CALL(X) call X # define LEA(S,D) lea D,S # define ADD(S,D) add D,S # define CMP(S,D) cmp D,S # define JE(T) je T # define FLDS(OP) fld OP # define FLDL(OP) fld OP # define LOCAL(NAME) NAME #else /* GNU/SunPro Assembler AT&T Syntax */ .text # define BEGIN_ASM # define END_ASM # include "../autovar/autovar_OS.h" # if defined(OS_Win32) || defined(OS_Cygwin) || defined(OS_MinGW) || defined(OS_Darwin) || defined(OS_Minix) # define CSYM(X) _##X # else # define CSYM(X) X # endif /* Systems that work without '%' prefix: MinGW,Apple */ # define EAX %eax # define EBX %ebx # define ECX %ecx # define EDX %edx # define ESI %esi # define EDI %edi # define EBP %ebp # define ESP %esp # define AL %al # define AH %ah # define BL %bl # define BH %bh # define CL %cl # define CH %ch # define DL %dl # define DH %dh # define GLOBAL(X) .globl CSYM(X) # define BEGIN_PROC(X) CSYM(X): # define END_PROC(X) # define PUSH(R) pushl R # define POP(R) popl R # define MOVL(S,D) movl S,D # define ADDL(S,D) addl S,D # define ANDL(S,D) andl S,D # define SUBL(S,D) subl S,D # define SHRL(S,D) shrl S,D # define RET() ret # define CALL_DWORD(R,OFF) call *DWORD(R,OFF) # define REP(X) rep; X # define MOVSB movsb # define MOVSW movsw # define MOVSD movsd # define DWORD(R,OFF) OFF(R) # define QWORD(R,OFF) OFF(R) # include "../autovar/autovar_CC.h" # if defined CC_SUN # define LIT(X) $X # else # define LIT(X) XCONCAT($,X) # endif # define INT(X) int X # define HEX(X) XCONCAT(0x,X) # define CALL(X) call X # define LEA(A,B) lea A,B # define CMP(A,B) cmp A,B # define JE(X) je X # define FLDS(X) flds X # define FLDL(X) fldl X # define ADD(A,B) add A,B # define LOCAL(X) .X #endif MoarVM-2015.11/3rdparty/dyncall/test/CMakeLists.txt0000644000175000017500000000135612456307246021003 0ustar jnthnjnthninclude_directories( ${PROJECT_SOURCE_DIR}/dynload ${PROJECT_SOURCE_DIR}/dyncall ${PROJECT_SOURCE_DIR}/dyncallback ) add_subdirectory(suite) add_subdirectory(ellipsis) add_subdirectory(suite2) add_subdirectory(callf) add_subdirectory(plain) add_subdirectory(plain_c++) add_subdirectory(suite3) add_subdirectory(suite_floats) add_subdirectory(callback_suite) add_subdirectory(thunk) add_subdirectory(malloc_wx) add_subdirectory(callback_plain) add_subdirectory(sharedlib) add_subdirectory(nm) if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86") add_subdirectory(suite_x86win32fast) add_subdirectory(suite_x86win32std) add_subdirectory(suite2_x86win32fast) add_subdirectory(suite2_x86win32std) endif() if(${UNIX}) add_subdirectory(syscall) endif() MoarVM-2015.11/3rdparty/dyncall/test/Makefile.M0000644000175000017500000001517212456307246020077 0ustar jnthnjnthn#include "../buildsys/dynmake/Makefile.base.M" all: cd plain _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd plain_c++ _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd call_suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite2 _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite3 _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite_floats _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd callback_plain _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd callback_suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd ellipsis _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd callf _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd nm _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd resolve_self _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd thunk _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd malloc_wx _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) #if defined(DC__Arch_Intel_x86) cd syscall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite_x86win32fast _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite_x86win32std _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite2_x86win32fast _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) cd suite2_x86win32std _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) #endif // cd gen-masm _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) // cd hacking-arm-thumb-interwork _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) // cd hacking-mips _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) // cd samples _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) // cd sharedlib _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) // cd sign _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean: cd plain _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd plain_c++ _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd call_suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite2 _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite3 _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite_floats _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd callback_plain _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd callback_suite _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd ellipsis _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd callf _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd nm _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd resolve_self _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd thunk _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd malloc_wx _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean #if defined(DC__Arch_Intel_x86) cd syscall _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite_x86win32fast _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite_x86win32std _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite2_x86win32fast _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean cd suite2_x86win32std _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean #endif // cd gen-masm _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean // cd hacking-arm-thumb-interwork _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean // cd hacking-mips _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean // cd samples _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean // cd sharedlib _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean // cd sign _(SHELL_COMMAND_SEPARATOR) _(MAKE) _(MAKEFLAGS_USER) _(MAKEFLAG_FILE) _(MAKE_DEFAULT_FILE) clean MoarVM-2015.11/3rdparty/dyncall/test/Makefile.embedded0000644000175000017500000000722612502366750021432 0ustar jnthnjnthnMAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} all: all-dyncall all-dyncallback all-dynload all-dynload: cd nm && ${MAKE_CMD} cd resolve_self && ${MAKE_CMD} all-dyncall: cd suite && ${MAKE_CMD} cd call_suite && ${MAKE_CMD} cd suite2 && ${MAKE_CMD} cd suite3 && ${MAKE_CMD} cd suite_floats && ${MAKE_CMD} cd callf && ${MAKE_CMD} cd plain && ${MAKE_CMD} cd plain_c++ && ${MAKE_CMD} cd ellipsis && ${MAKE_CMD} all-dyncallback: cd thunk && ${MAKE_CMD} cd malloc_wx && ${MAKE_CMD} cd callback_plain && ${MAKE_CMD} cd callback_suite && ${MAKE_CMD} all-c: cd plain && ${MAKE_CMD} cd syscall && ${MAKE_CMD} cd suite && ${MAKE_CMD} cd call_suite && ${MAKE_CMD} cd callf && ${MAKE_CMD} cd nm && ${MAKE_CMD} cd resolve_self && ${MAKE_CMD} cd thunk && ${MAKE_CMD} cd malloc_wx && ${MAKE_CMD} cd callback_plain && ${MAKE_CMD} cd callback_suite && ${MAKE_CMD} all-win32: cd suite_x86win32std && ${MAKE_CMD} cd suite_x86win32fast && ${MAKE_CMD} cd suite2_x86win32std && ${MAKE_CMD} cd suite2_x86win32fast && ${MAKE_CMD} run-all-win32: suite_X86win32std/suite_x86win32std suite_X86win32fast/suite_x86win32fast suite2_X86win32std/suite2_x86win32std suite2_X86win32fast/suite2_x86win32fast all-unix: cd syscall && ${MAKE_CMD} clean: cd plain && ${MAKE_CMD} clean cd plain_c++ && ${MAKE_CMD} clean cd syscall && ${MAKE_CMD} clean cd suite && ${MAKE_CMD} clean cd call_suite && ${MAKE_CMD} clean cd suite2 && ${MAKE_CMD} clean cd suite3 && ${MAKE_CMD} clean cd suite_floats && ${MAKE_CMD} clean cd callback_plain && ${MAKE_CMD} clean cd callback_suite && ${MAKE_CMD} clean cd ellipsis && ${MAKE_CMD} clean cd callf && ${MAKE_CMD} clean cd nm && ${MAKE_CMD} clean cd resolve_self && ${MAKE_CMD} clean cd thunk && ${MAKE_CMD} clean cd malloc_wx && ${MAKE_CMD} clean cd syscall && ${MAKE_CMD} clean bsd: LDLIBS="${LDLIBS} -lm" ${MAKE_CMD} all linux: LDLIBS="${LDLIBS} -lm -ldl" ${MAKE_CMD} all linux64: CFLAGS="${CFLAGS} -m64" CXXFLAGS="${CXXFLAGS} -m64" CCFLAGS="${CXXFLAGS} -m64" LDFLAGS="${LDFLAGS} -m64" LDLIBS="${LDLIBS} -lm -ldl" ${MAKE_CMD} all-c mingw32: ${MAKE_CMD} CC="gcc" all osx: ${MAKE_CMD} all osx-template: CC="${CC} ${OSX_ARCH}" AS="${AS} ${OSX_ARCH}" CXX="${CXX} ${OSX_ARCH}" ${MAKE_CMD} osx-universal: OSX_ARCH="-arch i386 -arch x86_64" ${MAKE_CMD} osx-template osx-i386: OSX_ARCH="-arch i386" ${MAKE_CMD} osx-template sun: CXX=CC LDLIBS="${LDLIBS} -lm" ${MAKE_CMD} all sun-64bit: CXX=CC CFLAGS="${CFLAGS} -m64" CXXFLAGS="${CXXFLAGS} -m64" CCFLAGS="${CXXFLAGS} -m64" LDFLAGS="${LDFLAGS} -m64" LDLIBS="${LDLIBS} -lm" ${MAKE_CMD} all sun-gcc: CC=gcc CCC=g++ CXX=g++ LDLIBS="${LDLIBS} -lm" ${MAKE_CMD} all sun-gcc-64bit: CC=gcc CCC=g++ CXX=g++ CFLAGS="${CFLAGS} -m64" CXXFLAGS="${CXXFLAGS} -m64" CCFLAGS=-m64 LDFLAGS="${LDFLAGS} -m64" LDLIBS="${LDLIBS} -lm" ${MAKE_CMD} all ios-sdkroot: \ CC="${CC} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ CXX="${CXX} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ LD="${LD} ${IOS_ARCH} -miphoneos-version-min=${IOS_SDK}"\ ASFLAGS="-isysroot ${IOS_SDKROOT}"\ CFLAGS="-isysroot ${IOS_SDKROOT}"\ CXXFLAGS="-isysroot ${IOS_SDKROOT}"\ LDFLAGS="-Wl,-syslibroot ${IOS_SDKROOT}"\ ${MAKE_CMD} all ios: IOS_SDKROOT="`xcode-select -print-path`/Platforms/iPhone${IOS_PLATFORM}.platform/Developer/SDKs/iPhone${IOS_PLATFORM}${IOS_SDK}.sdk" ${MAKE_CMD} ios-sdkroot ios-sim: IOS_PLATFORM="Simulator" ${MAKE_CMD} ios ios-os: IOS_PLATFORM="OS" ${MAKE_CMD} ios ios61-os: IOS_SDK="6.1" IOS_ARCH="-arch armv7" ${MAKE_CMD} ios-os ios61-os-no-thumb: IOS_SDK="6.1" IOS_ARCH="-arch armv7 -mno-thumb" ${MAKE_CMD} ios-os ios61-sim: IOS_SDK="6.1" IOS_ARCH="-arch i386" ${MAKE_CMD} ios-sim MoarVM-2015.11/3rdparty/dyncall/test/Makefile.generic0000644000175000017500000000355712502366750021320 0ustar jnthnjnthn.PHONY: all clean run-tests install all clean install: cd call_suite && ${MAKE} $@ cd callback_suite && ${MAKE} $@ cd plain && ${MAKE} $@ cd plain_c++ && ${MAKE} $@ cd suite && ${MAKE} $@ cd suite2 && ${MAKE} $@ cd suite3 && ${MAKE} $@ cd suite_floats && ${MAKE} $@ cd ellipsis && ${MAKE} $@ cd callf && ${MAKE} $@ cd syscall && ${MAKE} $@ cd nm && ${MAKE} $@ cd resolve_self && ${MAKE} $@ cd thunk && ${MAKE} $@ cd malloc_wx && ${MAKE} $@ cd callback_plain && ${MAKE} $@ run-tests: all sh ${VPATH}/runalltests.sh | grep "result:" all-c: cd plain && ${MAKE} cd call_suite && ${MAKE} cd suite && ${MAKE} cd callf && ${MAKE} cd syscall && ${MAKE} cd nm && ${MAKE} cd resolve_self && ${MAKE} cd thunk && ${MAKE} cd malloc_wx && ${MAKE} cd callback_plain && ${MAKE} cd callback_suite && ${MAKE} all-win32: cd suite_x86win32std && ${MAKE} cd suite_x86win32fast && ${MAKE} cd suite2_x86win32std && ${MAKE} cd suite2_x86win32fast && ${MAKE} run-win32: suite_X86win32std/suite_x86win32std suite_X86win32fast/suite_x86win32fast suite2_X86win32std/suite2_x86win32std suite2_X86win32fast/suite2_x86win32fast all-dyncall: cd plain && ${MAKE} cd plain_c++ && ${MAKE} cd call_suite && ${MAKE} cd suite && ${MAKE} cd suite2 && ${MAKE} cd suite3 && ${MAKE} cd suite_floats && ${MAKE} cd ellipsis && ${MAKE} cd callf && ${MAKE} cd syscall && ${MAKE} run-dyncall: plain/plain plain_c++/plain_c++ call_suite/call_suite suite/suite suite2/suite2 suite3/suite3 suite_floats/suite_floats ellipsis/ellipsis callf/callf syscall/syscall # BUG: need to disable on sparc: testStructSize not found # cd plain && ${MAKE} all-dynload: cd nm && ${MAKE} cd resolve_self && ${MAKE} all-dyncallback: cd thunk && ${MAKE} cd malloc_wx && ${MAKE} cd callback_plain && ${MAKE} cd callback_suite && ${MAKE} linux: LDLIBS="-lm -ldl" ${MAKE} all bsd: LDLIBS="-lm" ${MAKE} all MoarVM-2015.11/3rdparty/dyncall/test/Nmakefile0000644000175000017500000000305112456307246020053 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = .. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake DIRS = call_suite suite suite2 suite3 suite_floats callf ellipsis plain plain_c++ nm resolve_self thunk malloc_wx callback_plain callback_suite !IF "$(BUILD_ARCH)" == "x86" DIRS = $(DIRS) suite_x86win32fast suite_x86win32std suite2_x86win32fast suite2_x86win32std !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/arm-thumb-interwork/Makefile-default.config0000644000175000017500000000015112502366750026474 0ustar jnthnjnthn# auto-generated by ./configure PREFIX=/usr/local ASFLAGS= CFLAGS=-fPIC CXXFLAGS=-fPIC LDLIBS=-lm -ldl MoarVM-2015.11/3rdparty/dyncall/test/arm-thumb-interwork/Makefile-thumb.config0000644000175000017500000000017612502366750026176 0ustar jnthnjnthn# auto-generated by ./configure PREFIX=/usr/local ASFLAGS=-mthumb CFLAGS=-fPIC -mthumb CXXFLAGS=-fPIC -mthumb LDLIBS=-lm -ldl MoarVM-2015.11/3rdparty/dyncall/test/arm-thumb-interwork/README.txt0000644000175000017500000000031712456307246023653 0ustar jnthnjnthnThis tests arm/thumb interwork. Run build.sh from top-level build directory. 1. dyncall is compiled as default using Makefile-default.config 2. tests are compiled with -mthumb using Makefile-thumb.config MoarVM-2015.11/3rdparty/dyncall/test/arm-thumb-interwork/build.sh0000644000175000017500000000026212456307246023607 0ustar jnthnjnthncp buildsys/arm-thumb-interwork/Makefile-default.config Makefile.config make clean all cp buildsys/arm-thumb-interwork/Makefile-thumb.config Makefile.config cd test && make all MoarVM-2015.11/3rdparty/dyncall/test/call_suite/Makefile.M0000644000175000017500000000015312456307246022214 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/call_suite/Makefile.embedded0000644000175000017500000000077112502366750023554 0ustar jnthnjnthnTARGET = call_suite ${OBJS} OBJS = globals.o invoke.o cases.o main.o SRCDIR = ../.. BLDDIR = ${SRCDIR} LUA = lua CPPFLAGS += -I${SRCDIR}/dyncall LDFLAGS += -L${BLDDIR}/dyncall LDLIBS += -ldyncall_s .PHONY: all clean config config-random all: ${TARGET} call_suite: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o $@ config: ${LUA} mk-cases.lua cases.h config-random: ${LUA} rand-sig.lua >cases.txt ${LUA} mk-cases.lua cases.h cases.o: cases.h clean: rm -f ${TARGET} MoarVM-2015.11/3rdparty/dyncall/test/call_suite/Makefile.generic0000644000175000017500000000105212466674236023442 0ustar jnthnjnthnAPP = call_suite OBJS = globals.o invoke.o cases.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s LUA = lua .PHONY: all clean install config config-random all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test config: ${LUA} mk-cases.lua cases.h config-random: ${LUA} rand-sig.lua >cases.txt ${LUA} mk-cases.lua cases.h MoarVM-2015.11/3rdparty/dyncall/test/call_suite/Nmakefile0000644000175000017500000000373412456307246022207 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2011 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = cases.h !IF "$(BUILD_OS)" == "windows" TARGETS = call_suite.exe OBJS = main.obj cases.obj globals.obj invoke.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = call_suite.nds OBJS = main.o cases.o globals.o invoke.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mk-cases.lua lua mk-cases.lua cases.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/call_suite/README.txt0000644000175000017500000000005612456307246022061 0ustar jnthnjnthncall_suite for dyncall written in C and Lua. MoarVM-2015.11/3rdparty/dyncall/test/call_suite/cases.c0000644000175000017500000000272612456307246021633 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/call_suite/cases.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "globals.h" #define ret_v(X) #define ret_c(X) return(K_c[X]); #define ret_s(X) return(K_s[X]); #define ret_i(X) return(K_i[X]); #define ret_j(X) return(K_j[X]); #define ret_l(X) return(K_l[X]); #define ret_p(X) return(K_p[X]); #define ret_f(X) return(K_f[X]); #define ret_d(X) return(K_d[X]); extern int fid; #define v void #define c char #define s short #define i int #define j long #define l long long #define p void* #define f float #define d double #include "cases.h" int G_ncases = sizeof(G_sigtab)/sizeof(G_sigtab[0]); MoarVM-2015.11/3rdparty/dyncall/test/call_suite/cases.h0000644000175000017500000010524212456307246021635 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/call_suite/cases.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* 1:jifjdidpslfdfpifdflclcsjfjsdd */ j f1(i a1,f a2,j a3,d a4,i a5,d a6,p a7,s a8,l a9,f a10,d a11,f a12,p a13,i a14,f a15,d a16,f a17,l a18,c a19,l a20,c a21,s a22,j a23,f a24,j a25,s a26,d a27,d a28){fid=1;V_i[1]=a1;V_f[2]=a2;V_j[3]=a3;V_d[4]=a4;V_i[5]=a5;V_d[6]=a6;V_p[7]=a7;V_s[8]=a8;V_l[9]=a9;V_f[10]=a10;V_d[11]=a11;V_f[12]=a12;V_p[13]=a13;V_i[14]=a14;V_f[15]=a15;V_d[16]=a16;V_f[17]=a17;V_l[18]=a18;V_c[19]=a19;V_l[20]=a20;V_c[21]=a21;V_s[22]=a22;V_j[23]=a23;V_f[24]=a24;V_j[25]=a25;V_s[26]=a26;V_d[27]=a27;V_d[28]=a28;ret_j(28)} /* 2:fdsdcjjjjlpd */ f f2(d a1,s a2,d a3,c a4,j a5,j a6,j a7,j a8,l a9,p a10,d a11){fid=2;V_d[1]=a1;V_s[2]=a2;V_d[3]=a3;V_c[4]=a4;V_j[5]=a5;V_j[6]=a6;V_j[7]=a7;V_j[8]=a8;V_l[9]=a9;V_p[10]=a10;V_d[11]=a11;ret_f(11)} /* 3:jlisplppcdifsjfsjcliipfpcpj */ j f3(l a1,i a2,s a3,p a4,l a5,p a6,p a7,c a8,d a9,i a10,f a11,s a12,j a13,f a14,s a15,j a16,c a17,l a18,i a19,i a20,p a21,f a22,p a23,c a24,p a25,j a26){fid=3;V_l[1]=a1;V_i[2]=a2;V_s[3]=a3;V_p[4]=a4;V_l[5]=a5;V_p[6]=a6;V_p[7]=a7;V_c[8]=a8;V_d[9]=a9;V_i[10]=a10;V_f[11]=a11;V_s[12]=a12;V_j[13]=a13;V_f[14]=a14;V_s[15]=a15;V_j[16]=a16;V_c[17]=a17;V_l[18]=a18;V_i[19]=a19;V_i[20]=a20;V_p[21]=a21;V_f[22]=a22;V_p[23]=a23;V_c[24]=a24;V_p[25]=a25;V_j[26]=a26;ret_j(26)} /* 4:cjsjpcjsipcfccljpcpplsslji */ c f4(j a1,s a2,j a3,p a4,c a5,j a6,s a7,i a8,p a9,c a10,f a11,c a12,c a13,l a14,j a15,p a16,c a17,p a18,p a19,l a20,s a21,s a22,l a23,j a24,i a25){fid=4;V_j[1]=a1;V_s[2]=a2;V_j[3]=a3;V_p[4]=a4;V_c[5]=a5;V_j[6]=a6;V_s[7]=a7;V_i[8]=a8;V_p[9]=a9;V_c[10]=a10;V_f[11]=a11;V_c[12]=a12;V_c[13]=a13;V_l[14]=a14;V_j[15]=a15;V_p[16]=a16;V_c[17]=a17;V_p[18]=a18;V_p[19]=a19;V_l[20]=a20;V_s[21]=a21;V_s[22]=a22;V_l[23]=a23;V_j[24]=a24;V_i[25]=a25;ret_c(25)} /* 5:vijsclcsdjijsficilfjpdfjiffiljc */ v f5(i a1,j a2,s a3,c a4,l a5,c a6,s a7,d a8,j a9,i a10,j a11,s a12,f a13,i a14,c a15,i a16,l a17,f a18,j a19,p a20,d a21,f a22,j a23,i a24,f a25,f a26,i a27,l a28,j a29,c a30){fid=5;V_i[1]=a1;V_j[2]=a2;V_s[3]=a3;V_c[4]=a4;V_l[5]=a5;V_c[6]=a6;V_s[7]=a7;V_d[8]=a8;V_j[9]=a9;V_i[10]=a10;V_j[11]=a11;V_s[12]=a12;V_f[13]=a13;V_i[14]=a14;V_c[15]=a15;V_i[16]=a16;V_l[17]=a17;V_f[18]=a18;V_j[19]=a19;V_p[20]=a20;V_d[21]=a21;V_f[22]=a22;V_j[23]=a23;V_i[24]=a24;V_f[25]=a25;V_f[26]=a26;V_i[27]=a27;V_l[28]=a28;V_j[29]=a29;V_c[30]=a30;ret_v(30)} /* 6:fiffdisiicijddpjdpsici */ f f6(i a1,f a2,f a3,d a4,i a5,s a6,i a7,i a8,c a9,i a10,j a11,d a12,d a13,p a14,j a15,d a16,p a17,s a18,i a19,c a20,i a21){fid=6;V_i[1]=a1;V_f[2]=a2;V_f[3]=a3;V_d[4]=a4;V_i[5]=a5;V_s[6]=a6;V_i[7]=a7;V_i[8]=a8;V_c[9]=a9;V_i[10]=a10;V_j[11]=a11;V_d[12]=a12;V_d[13]=a13;V_p[14]=a14;V_j[15]=a15;V_d[16]=a16;V_p[17]=a17;V_s[18]=a18;V_i[19]=a19;V_c[20]=a20;V_i[21]=a21;ret_f(21)} /* 7:scllcsjjilfjcpfsj */ s f7(c a1,l a2,l a3,c a4,s a5,j a6,j a7,i a8,l a9,f a10,j a11,c a12,p a13,f a14,s a15,j a16){fid=7;V_c[1]=a1;V_l[2]=a2;V_l[3]=a3;V_c[4]=a4;V_s[5]=a5;V_j[6]=a6;V_j[7]=a7;V_i[8]=a8;V_l[9]=a9;V_f[10]=a10;V_j[11]=a11;V_c[12]=a12;V_p[13]=a13;V_f[14]=a14;V_s[15]=a15;V_j[16]=a16;ret_s(16)} /* 8:ddcfdispifjpjicffjfsis */ d f8(d a1,c a2,f a3,d a4,i a5,s a6,p a7,i a8,f a9,j a10,p a11,j a12,i a13,c a14,f a15,f a16,j a17,f a18,s a19,i a20,s a21){fid=8;V_d[1]=a1;V_c[2]=a2;V_f[3]=a3;V_d[4]=a4;V_i[5]=a5;V_s[6]=a6;V_p[7]=a7;V_i[8]=a8;V_f[9]=a9;V_j[10]=a10;V_p[11]=a11;V_j[12]=a12;V_i[13]=a13;V_c[14]=a14;V_f[15]=a15;V_f[16]=a16;V_j[17]=a17;V_f[18]=a18;V_s[19]=a19;V_i[20]=a20;V_s[21]=a21;ret_d(21)} /* 9:jjfflllfipdsjsjdscd */ j f9(j a1,f a2,f a3,l a4,l a5,l a6,f a7,i a8,p a9,d a10,s a11,j a12,s a13,j a14,d a15,s a16,c a17,d a18){fid=9;V_j[1]=a1;V_f[2]=a2;V_f[3]=a3;V_l[4]=a4;V_l[5]=a5;V_l[6]=a6;V_f[7]=a7;V_i[8]=a8;V_p[9]=a9;V_d[10]=a10;V_s[11]=a11;V_j[12]=a12;V_s[13]=a13;V_j[14]=a14;V_d[15]=a15;V_s[16]=a16;V_c[17]=a17;V_d[18]=a18;ret_j(18)} /* 10:ildl */ i f10(l a1,d a2,l a3){fid=10;V_l[1]=a1;V_d[2]=a2;V_l[3]=a3;ret_i(3)} /* 11:llllppplsldpccjsflsj */ l f11(l a1,l a2,l a3,p a4,p a5,p a6,l a7,s a8,l a9,d a10,p a11,c a12,c a13,j a14,s a15,f a16,l a17,s a18,j a19){fid=11;V_l[1]=a1;V_l[2]=a2;V_l[3]=a3;V_p[4]=a4;V_p[5]=a5;V_p[6]=a6;V_l[7]=a7;V_s[8]=a8;V_l[9]=a9;V_d[10]=a10;V_p[11]=a11;V_c[12]=a12;V_c[13]=a13;V_j[14]=a14;V_s[15]=a15;V_f[16]=a16;V_l[17]=a17;V_s[18]=a18;V_j[19]=a19;ret_l(19)} /* 12:ippcii */ i f12(p a1,p a2,c a3,i a4,i a5){fid=12;V_p[1]=a1;V_p[2]=a2;V_c[3]=a3;V_i[4]=a4;V_i[5]=a5;ret_i(5)} /* 13:jdipcdpc */ j f13(d a1,i a2,p a3,c a4,d a5,p a6,c a7){fid=13;V_d[1]=a1;V_i[2]=a2;V_p[3]=a3;V_c[4]=a4;V_d[5]=a5;V_p[6]=a6;V_c[7]=a7;ret_j(7)} /* 14:jjlspi */ j f14(j a1,l a2,s a3,p a4,i a5){fid=14;V_j[1]=a1;V_l[2]=a2;V_s[3]=a3;V_p[4]=a4;V_i[5]=a5;ret_j(5)} /* 15:cdicfiidisdsp */ c f15(d a1,i a2,c a3,f a4,i a5,i a6,d a7,i a8,s a9,d a10,s a11,p a12){fid=15;V_d[1]=a1;V_i[2]=a2;V_c[3]=a3;V_f[4]=a4;V_i[5]=a5;V_i[6]=a6;V_d[7]=a7;V_i[8]=a8;V_s[9]=a9;V_d[10]=a10;V_s[11]=a11;V_p[12]=a12;ret_c(12)} /* 16:pfcdlcpsiccpifdll */ p f16(f a1,c a2,d a3,l a4,c a5,p a6,s a7,i a8,c a9,c a10,p a11,i a12,f a13,d a14,l a15,l a16){fid=16;V_f[1]=a1;V_c[2]=a2;V_d[3]=a3;V_l[4]=a4;V_c[5]=a5;V_p[6]=a6;V_s[7]=a7;V_i[8]=a8;V_c[9]=a9;V_c[10]=a10;V_p[11]=a11;V_i[12]=a12;V_f[13]=a13;V_d[14]=a14;V_l[15]=a15;V_l[16]=a16;ret_p(16)} /* 17:pfjf */ p f17(f a1,j a2,f a3){fid=17;V_f[1]=a1;V_j[2]=a2;V_f[3]=a3;ret_p(3)} /* 18:plispfpjjijdjij */ p f18(l a1,i a2,s a3,p a4,f a5,p a6,j a7,j a8,i a9,j a10,d a11,j a12,i a13,j a14){fid=18;V_l[1]=a1;V_i[2]=a2;V_s[3]=a3;V_p[4]=a4;V_f[5]=a5;V_p[6]=a6;V_j[7]=a7;V_j[8]=a8;V_i[9]=a9;V_j[10]=a10;V_d[11]=a11;V_j[12]=a12;V_i[13]=a13;V_j[14]=a14;ret_p(14)} /* 19:cjlfs */ c f19(j a1,l a2,f a3,s a4){fid=19;V_j[1]=a1;V_l[2]=a2;V_f[3]=a3;V_s[4]=a4;ret_c(4)} /* 20:fddljfldscfcc */ f f20(d a1,d a2,l a3,j a4,f a5,l a6,d a7,s a8,c a9,f a10,c a11,c a12){fid=20;V_d[1]=a1;V_d[2]=a2;V_l[3]=a3;V_j[4]=a4;V_f[5]=a5;V_l[6]=a6;V_d[7]=a7;V_s[8]=a8;V_c[9]=a9;V_f[10]=a10;V_c[11]=a11;V_c[12]=a12;ret_f(12)} /* 21:vlpdsdidfsfjcidijspcldsfijis */ v f21(l a1,p a2,d a3,s a4,d a5,i a6,d a7,f a8,s a9,f a10,j a11,c a12,i a13,d a14,i a15,j a16,s a17,p a18,c a19,l a20,d a21,s a22,f a23,i a24,j a25,i a26,s a27){fid=21;V_l[1]=a1;V_p[2]=a2;V_d[3]=a3;V_s[4]=a4;V_d[5]=a5;V_i[6]=a6;V_d[7]=a7;V_f[8]=a8;V_s[9]=a9;V_f[10]=a10;V_j[11]=a11;V_c[12]=a12;V_i[13]=a13;V_d[14]=a14;V_i[15]=a15;V_j[16]=a16;V_s[17]=a17;V_p[18]=a18;V_c[19]=a19;V_l[20]=a20;V_d[21]=a21;V_s[22]=a22;V_f[23]=a23;V_i[24]=a24;V_j[25]=a25;V_i[26]=a26;V_s[27]=a27;ret_v(27)} /* 22:jfljilsflciddclicljsssisiifpci */ j f22(f a1,l a2,j a3,i a4,l a5,s a6,f a7,l a8,c a9,i a10,d a11,d a12,c a13,l a14,i a15,c a16,l a17,j a18,s a19,s a20,s a21,i a22,s a23,i a24,i a25,f a26,p a27,c a28,i a29){fid=22;V_f[1]=a1;V_l[2]=a2;V_j[3]=a3;V_i[4]=a4;V_l[5]=a5;V_s[6]=a6;V_f[7]=a7;V_l[8]=a8;V_c[9]=a9;V_i[10]=a10;V_d[11]=a11;V_d[12]=a12;V_c[13]=a13;V_l[14]=a14;V_i[15]=a15;V_c[16]=a16;V_l[17]=a17;V_j[18]=a18;V_s[19]=a19;V_s[20]=a20;V_s[21]=a21;V_i[22]=a22;V_s[23]=a23;V_i[24]=a24;V_i[25]=a25;V_f[26]=a26;V_p[27]=a27;V_c[28]=a28;V_i[29]=a29;ret_j(29)} /* 23:p */ p f23(){fid=23;ret_p(0)} /* 24:cjj */ c f24(j a1,j a2){fid=24;V_j[1]=a1;V_j[2]=a2;ret_c(2)} /* 25:sjpidpsdldcjfippicilfl */ s f25(j a1,p a2,i a3,d a4,p a5,s a6,d a7,l a8,d a9,c a10,j a11,f a12,i a13,p a14,p a15,i a16,c a17,i a18,l a19,f a20,l a21){fid=25;V_j[1]=a1;V_p[2]=a2;V_i[3]=a3;V_d[4]=a4;V_p[5]=a5;V_s[6]=a6;V_d[7]=a7;V_l[8]=a8;V_d[9]=a9;V_c[10]=a10;V_j[11]=a11;V_f[12]=a12;V_i[13]=a13;V_p[14]=a14;V_p[15]=a15;V_i[16]=a16;V_c[17]=a17;V_i[18]=a18;V_l[19]=a19;V_f[20]=a20;V_l[21]=a21;ret_s(21)} /* 26:psfcffpijlfjjlpssc */ p f26(s a1,f a2,c a3,f a4,f a5,p a6,i a7,j a8,l a9,f a10,j a11,j a12,l a13,p a14,s a15,s a16,c a17){fid=26;V_s[1]=a1;V_f[2]=a2;V_c[3]=a3;V_f[4]=a4;V_f[5]=a5;V_p[6]=a6;V_i[7]=a7;V_j[8]=a8;V_l[9]=a9;V_f[10]=a10;V_j[11]=a11;V_j[12]=a12;V_l[13]=a13;V_p[14]=a14;V_s[15]=a15;V_s[16]=a16;V_c[17]=a17;ret_p(17)} /* 27:cpiijlppici */ c f27(p a1,i a2,i a3,j a4,l a5,p a6,p a7,i a8,c a9,i a10){fid=27;V_p[1]=a1;V_i[2]=a2;V_i[3]=a3;V_j[4]=a4;V_l[5]=a5;V_p[6]=a6;V_p[7]=a7;V_i[8]=a8;V_c[9]=a9;V_i[10]=a10;ret_c(10)} /* 28:jfslddfifcdscfllpfjffff */ j f28(f a1,s a2,l a3,d a4,d a5,f a6,i a7,f a8,c a9,d a10,s a11,c a12,f a13,l a14,l a15,p a16,f a17,j a18,f a19,f a20,f a21,f a22){fid=28;V_f[1]=a1;V_s[2]=a2;V_l[3]=a3;V_d[4]=a4;V_d[5]=a5;V_f[6]=a6;V_i[7]=a7;V_f[8]=a8;V_c[9]=a9;V_d[10]=a10;V_s[11]=a11;V_c[12]=a12;V_f[13]=a13;V_l[14]=a14;V_l[15]=a15;V_p[16]=a16;V_f[17]=a17;V_j[18]=a18;V_f[19]=a19;V_f[20]=a20;V_f[21]=a21;V_f[22]=a22;ret_j(22)} /* 29:ppcdclclclpic */ p f29(p a1,c a2,d a3,c a4,l a5,c a6,l a7,c a8,l a9,p a10,i a11,c a12){fid=29;V_p[1]=a1;V_c[2]=a2;V_d[3]=a3;V_c[4]=a4;V_l[5]=a5;V_c[6]=a6;V_l[7]=a7;V_c[8]=a8;V_l[9]=a9;V_p[10]=a10;V_i[11]=a11;V_c[12]=a12;ret_p(12)} /* 30:jd */ j f30(d a1){fid=30;V_d[1]=a1;ret_j(1)} /* 31:flsdfpssplsilflfpsfdlplffsfisj */ f f31(l a1,s a2,d a3,f a4,p a5,s a6,s a7,p a8,l a9,s a10,i a11,l a12,f a13,l a14,f a15,p a16,s a17,f a18,d a19,l a20,p a21,l a22,f a23,f a24,s a25,f a26,i a27,s a28,j a29){fid=31;V_l[1]=a1;V_s[2]=a2;V_d[3]=a3;V_f[4]=a4;V_p[5]=a5;V_s[6]=a6;V_s[7]=a7;V_p[8]=a8;V_l[9]=a9;V_s[10]=a10;V_i[11]=a11;V_l[12]=a12;V_f[13]=a13;V_l[14]=a14;V_f[15]=a15;V_p[16]=a16;V_s[17]=a17;V_f[18]=a18;V_d[19]=a19;V_l[20]=a20;V_p[21]=a21;V_l[22]=a22;V_f[23]=a23;V_f[24]=a24;V_s[25]=a25;V_f[26]=a26;V_i[27]=a27;V_s[28]=a28;V_j[29]=a29;ret_f(29)} /* 32:fi */ f f32(i a1){fid=32;V_i[1]=a1;ret_f(1)} /* 33:cpipsssjssfjpsjdijllsjdspfsiscd */ c f33(p a1,i a2,p a3,s a4,s a5,s a6,j a7,s a8,s a9,f a10,j a11,p a12,s a13,j a14,d a15,i a16,j a17,l a18,l a19,s a20,j a21,d a22,s a23,p a24,f a25,s a26,i a27,s a28,c a29,d a30){fid=33;V_p[1]=a1;V_i[2]=a2;V_p[3]=a3;V_s[4]=a4;V_s[5]=a5;V_s[6]=a6;V_j[7]=a7;V_s[8]=a8;V_s[9]=a9;V_f[10]=a10;V_j[11]=a11;V_p[12]=a12;V_s[13]=a13;V_j[14]=a14;V_d[15]=a15;V_i[16]=a16;V_j[17]=a17;V_l[18]=a18;V_l[19]=a19;V_s[20]=a20;V_j[21]=a21;V_d[22]=a22;V_s[23]=a23;V_p[24]=a24;V_f[25]=a25;V_s[26]=a26;V_i[27]=a27;V_s[28]=a28;V_c[29]=a29;V_d[30]=a30;ret_c(30)} /* 34:fiildffcjdpjsplidlspji */ f f34(i a1,i a2,l a3,d a4,f a5,f a6,c a7,j a8,d a9,p a10,j a11,s a12,p a13,l a14,i a15,d a16,l a17,s a18,p a19,j a20,i a21){fid=34;V_i[1]=a1;V_i[2]=a2;V_l[3]=a3;V_d[4]=a4;V_f[5]=a5;V_f[6]=a6;V_c[7]=a7;V_j[8]=a8;V_d[9]=a9;V_p[10]=a10;V_j[11]=a11;V_s[12]=a12;V_p[13]=a13;V_l[14]=a14;V_i[15]=a15;V_d[16]=a16;V_l[17]=a17;V_s[18]=a18;V_p[19]=a19;V_j[20]=a20;V_i[21]=a21;ret_f(21)} /* 35:dcssppdcjfif */ d f35(c a1,s a2,s a3,p a4,p a5,d a6,c a7,j a8,f a9,i a10,f a11){fid=35;V_c[1]=a1;V_s[2]=a2;V_s[3]=a3;V_p[4]=a4;V_p[5]=a5;V_d[6]=a6;V_c[7]=a7;V_j[8]=a8;V_f[9]=a9;V_i[10]=a10;V_f[11]=a11;ret_d(11)} /* 36:csdplfddlifispppj */ c f36(s a1,d a2,p a3,l a4,f a5,d a6,d a7,l a8,i a9,f a10,i a11,s a12,p a13,p a14,p a15,j a16){fid=36;V_s[1]=a1;V_d[2]=a2;V_p[3]=a3;V_l[4]=a4;V_f[5]=a5;V_d[6]=a6;V_d[7]=a7;V_l[8]=a8;V_i[9]=a9;V_f[10]=a10;V_i[11]=a11;V_s[12]=a12;V_p[13]=a13;V_p[14]=a14;V_p[15]=a15;V_j[16]=a16;ret_c(16)} /* 37:lissccfiiis */ l f37(i a1,s a2,s a3,c a4,c a5,f a6,i a7,i a8,i a9,s a10){fid=37;V_i[1]=a1;V_s[2]=a2;V_s[3]=a3;V_c[4]=a4;V_c[5]=a5;V_f[6]=a6;V_i[7]=a7;V_i[8]=a8;V_i[9]=a9;V_s[10]=a10;ret_l(10)} /* 38:cffccljpsdjffifsllppddlipf */ c f38(f a1,f a2,c a3,c a4,l a5,j a6,p a7,s a8,d a9,j a10,f a11,f a12,i a13,f a14,s a15,l a16,l a17,p a18,p a19,d a20,d a21,l a22,i a23,p a24,f a25){fid=38;V_f[1]=a1;V_f[2]=a2;V_c[3]=a3;V_c[4]=a4;V_l[5]=a5;V_j[6]=a6;V_p[7]=a7;V_s[8]=a8;V_d[9]=a9;V_j[10]=a10;V_f[11]=a11;V_f[12]=a12;V_i[13]=a13;V_f[14]=a14;V_s[15]=a15;V_l[16]=a16;V_l[17]=a17;V_p[18]=a18;V_p[19]=a19;V_d[20]=a20;V_d[21]=a21;V_l[22]=a22;V_i[23]=a23;V_p[24]=a24;V_f[25]=a25;ret_c(25)} /* 39:dpjlscjiijdcllflsiicjjsfccsd */ d f39(p a1,j a2,l a3,s a4,c a5,j a6,i a7,i a8,j a9,d a10,c a11,l a12,l a13,f a14,l a15,s a16,i a17,i a18,c a19,j a20,j a21,s a22,f a23,c a24,c a25,s a26,d a27){fid=39;V_p[1]=a1;V_j[2]=a2;V_l[3]=a3;V_s[4]=a4;V_c[5]=a5;V_j[6]=a6;V_i[7]=a7;V_i[8]=a8;V_j[9]=a9;V_d[10]=a10;V_c[11]=a11;V_l[12]=a12;V_l[13]=a13;V_f[14]=a14;V_l[15]=a15;V_s[16]=a16;V_i[17]=a17;V_i[18]=a18;V_c[19]=a19;V_j[20]=a20;V_j[21]=a21;V_s[22]=a22;V_f[23]=a23;V_c[24]=a24;V_c[25]=a25;V_s[26]=a26;V_d[27]=a27;ret_d(27)} /* 40:pldpcscpppilpldsjpsppf */ p f40(l a1,d a2,p a3,c a4,s a5,c a6,p a7,p a8,p a9,i a10,l a11,p a12,l a13,d a14,s a15,j a16,p a17,s a18,p a19,p a20,f a21){fid=40;V_l[1]=a1;V_d[2]=a2;V_p[3]=a3;V_c[4]=a4;V_s[5]=a5;V_c[6]=a6;V_p[7]=a7;V_p[8]=a8;V_p[9]=a9;V_i[10]=a10;V_l[11]=a11;V_p[12]=a12;V_l[13]=a13;V_d[14]=a14;V_s[15]=a15;V_j[16]=a16;V_p[17]=a17;V_s[18]=a18;V_p[19]=a19;V_p[20]=a20;V_f[21]=a21;ret_p(21)} /* 41:fifffldcpf */ f f41(i a1,f a2,f a3,f a4,l a5,d a6,c a7,p a8,f a9){fid=41;V_i[1]=a1;V_f[2]=a2;V_f[3]=a3;V_f[4]=a4;V_l[5]=a5;V_d[6]=a6;V_c[7]=a7;V_p[8]=a8;V_f[9]=a9;ret_f(9)} /* 42:lijcsijlpippi */ l f42(i a1,j a2,c a3,s a4,i a5,j a6,l a7,p a8,i a9,p a10,p a11,i a12){fid=42;V_i[1]=a1;V_j[2]=a2;V_c[3]=a3;V_s[4]=a4;V_i[5]=a5;V_j[6]=a6;V_l[7]=a7;V_p[8]=a8;V_i[9]=a9;V_p[10]=a10;V_p[11]=a11;V_i[12]=a12;ret_l(12)} /* 43:vssdpsdffjjidjisfdfliljsdfip */ v f43(s a1,s a2,d a3,p a4,s a5,d a6,f a7,f a8,j a9,j a10,i a11,d a12,j a13,i a14,s a15,f a16,d a17,f a18,l a19,i a20,l a21,j a22,s a23,d a24,f a25,i a26,p a27){fid=43;V_s[1]=a1;V_s[2]=a2;V_d[3]=a3;V_p[4]=a4;V_s[5]=a5;V_d[6]=a6;V_f[7]=a7;V_f[8]=a8;V_j[9]=a9;V_j[10]=a10;V_i[11]=a11;V_d[12]=a12;V_j[13]=a13;V_i[14]=a14;V_s[15]=a15;V_f[16]=a16;V_d[17]=a17;V_f[18]=a18;V_l[19]=a19;V_i[20]=a20;V_l[21]=a21;V_j[22]=a22;V_s[23]=a23;V_d[24]=a24;V_f[25]=a25;V_i[26]=a26;V_p[27]=a27;ret_v(27)} /* 44:s */ s f44(){fid=44;ret_s(0)} /* 45:ciplclcfpclsippfcjssp */ c f45(i a1,p a2,l a3,c a4,l a5,c a6,f a7,p a8,c a9,l a10,s a11,i a12,p a13,p a14,f a15,c a16,j a17,s a18,s a19,p a20){fid=45;V_i[1]=a1;V_p[2]=a2;V_l[3]=a3;V_c[4]=a4;V_l[5]=a5;V_c[6]=a6;V_f[7]=a7;V_p[8]=a8;V_c[9]=a9;V_l[10]=a10;V_s[11]=a11;V_i[12]=a12;V_p[13]=a13;V_p[14]=a14;V_f[15]=a15;V_c[16]=a16;V_j[17]=a17;V_s[18]=a18;V_s[19]=a19;V_p[20]=a20;ret_c(20)} /* 46:lld */ l f46(l a1,d a2){fid=46;V_l[1]=a1;V_d[2]=a2;ret_l(2)} /* 47:sidsjjslfliicjpjslfssidijjcdj */ s f47(i a1,d a2,s a3,j a4,j a5,s a6,l a7,f a8,l a9,i a10,i a11,c a12,j a13,p a14,j a15,s a16,l a17,f a18,s a19,s a20,i a21,d a22,i a23,j a24,j a25,c a26,d a27,j a28){fid=47;V_i[1]=a1;V_d[2]=a2;V_s[3]=a3;V_j[4]=a4;V_j[5]=a5;V_s[6]=a6;V_l[7]=a7;V_f[8]=a8;V_l[9]=a9;V_i[10]=a10;V_i[11]=a11;V_c[12]=a12;V_j[13]=a13;V_p[14]=a14;V_j[15]=a15;V_s[16]=a16;V_l[17]=a17;V_f[18]=a18;V_s[19]=a19;V_s[20]=a20;V_i[21]=a21;V_d[22]=a22;V_i[23]=a23;V_j[24]=a24;V_j[25]=a25;V_c[26]=a26;V_d[27]=a27;V_j[28]=a28;ret_s(28)} /* 48:jsjcdclsdsslifffcssjissjjdjclsjl */ j f48(s a1,j a2,c a3,d a4,c a5,l a6,s a7,d a8,s a9,s a10,l a11,i a12,f a13,f a14,f a15,c a16,s a17,s a18,j a19,i a20,s a21,s a22,j a23,j a24,d a25,j a26,c a27,l a28,s a29,j a30,l a31){fid=48;V_s[1]=a1;V_j[2]=a2;V_c[3]=a3;V_d[4]=a4;V_c[5]=a5;V_l[6]=a6;V_s[7]=a7;V_d[8]=a8;V_s[9]=a9;V_s[10]=a10;V_l[11]=a11;V_i[12]=a12;V_f[13]=a13;V_f[14]=a14;V_f[15]=a15;V_c[16]=a16;V_s[17]=a17;V_s[18]=a18;V_j[19]=a19;V_i[20]=a20;V_s[21]=a21;V_s[22]=a22;V_j[23]=a23;V_j[24]=a24;V_d[25]=a25;V_j[26]=a26;V_c[27]=a27;V_l[28]=a28;V_s[29]=a29;V_j[30]=a30;V_l[31]=a31;ret_j(31)} /* 49:pislpl */ p f49(i a1,s a2,l a3,p a4,l a5){fid=49;V_i[1]=a1;V_s[2]=a2;V_l[3]=a3;V_p[4]=a4;V_l[5]=a5;ret_p(5)} /* 50:fppssdijcjfjjfcjfdjij */ f f50(p a1,p a2,s a3,s a4,d a5,i a6,j a7,c a8,j a9,f a10,j a11,j a12,f a13,c a14,j a15,f a16,d a17,j a18,i a19,j a20){fid=50;V_p[1]=a1;V_p[2]=a2;V_s[3]=a3;V_s[4]=a4;V_d[5]=a5;V_i[6]=a6;V_j[7]=a7;V_c[8]=a8;V_j[9]=a9;V_f[10]=a10;V_j[11]=a11;V_j[12]=a12;V_f[13]=a13;V_c[14]=a14;V_j[15]=a15;V_f[16]=a16;V_d[17]=a17;V_j[18]=a18;V_i[19]=a19;V_j[20]=a20;ret_f(20)} /* 51:psjcijjpscsfciififcldcippilfl */ p f51(s a1,j a2,c a3,i a4,j a5,j a6,p a7,s a8,c a9,s a10,f a11,c a12,i a13,i a14,f a15,i a16,f a17,c a18,l a19,d a20,c a21,i a22,p a23,p a24,i a25,l a26,f a27,l a28){fid=51;V_s[1]=a1;V_j[2]=a2;V_c[3]=a3;V_i[4]=a4;V_j[5]=a5;V_j[6]=a6;V_p[7]=a7;V_s[8]=a8;V_c[9]=a9;V_s[10]=a10;V_f[11]=a11;V_c[12]=a12;V_i[13]=a13;V_i[14]=a14;V_f[15]=a15;V_i[16]=a16;V_f[17]=a17;V_c[18]=a18;V_l[19]=a19;V_d[20]=a20;V_c[21]=a21;V_i[22]=a22;V_p[23]=a23;V_p[24]=a24;V_i[25]=a25;V_l[26]=a26;V_f[27]=a27;V_l[28]=a28;ret_p(28)} /* 52:cpfcslscs */ c f52(p a1,f a2,c a3,s a4,l a5,s a6,c a7,s a8){fid=52;V_p[1]=a1;V_f[2]=a2;V_c[3]=a3;V_s[4]=a4;V_l[5]=a5;V_s[6]=a6;V_c[7]=a7;V_s[8]=a8;ret_c(8)} /* 53:pfscjsicdpfjcjifjljscifccdf */ p f53(f a1,s a2,c a3,j a4,s a5,i a6,c a7,d a8,p a9,f a10,j a11,c a12,j a13,i a14,f a15,j a16,l a17,j a18,s a19,c a20,i a21,f a22,c a23,c a24,d a25,f a26){fid=53;V_f[1]=a1;V_s[2]=a2;V_c[3]=a3;V_j[4]=a4;V_s[5]=a5;V_i[6]=a6;V_c[7]=a7;V_d[8]=a8;V_p[9]=a9;V_f[10]=a10;V_j[11]=a11;V_c[12]=a12;V_j[13]=a13;V_i[14]=a14;V_f[15]=a15;V_j[16]=a16;V_l[17]=a17;V_j[18]=a18;V_s[19]=a19;V_c[20]=a20;V_i[21]=a21;V_f[22]=a22;V_c[23]=a23;V_c[24]=a24;V_d[25]=a25;V_f[26]=a26;ret_p(26)} /* 54:sddijdsfpfjf */ s f54(d a1,d a2,i a3,j a4,d a5,s a6,f a7,p a8,f a9,j a10,f a11){fid=54;V_d[1]=a1;V_d[2]=a2;V_i[3]=a3;V_j[4]=a4;V_d[5]=a5;V_s[6]=a6;V_f[7]=a7;V_p[8]=a8;V_f[9]=a9;V_j[10]=a10;V_f[11]=a11;ret_s(11)} /* 55:cii */ c f55(i a1,i a2){fid=55;V_i[1]=a1;V_i[2]=a2;ret_c(2)} /* 56:ssccdjlssjcsc */ s f56(s a1,c a2,c a3,d a4,j a5,l a6,s a7,s a8,j a9,c a10,s a11,c a12){fid=56;V_s[1]=a1;V_c[2]=a2;V_c[3]=a3;V_d[4]=a4;V_j[5]=a5;V_l[6]=a6;V_s[7]=a7;V_s[8]=a8;V_j[9]=a9;V_c[10]=a10;V_s[11]=a11;V_c[12]=a12;ret_s(12)} /* 57:vldsslfllsdfliccjilsspijil */ v f57(l a1,d a2,s a3,s a4,l a5,f a6,l a7,l a8,s a9,d a10,f a11,l a12,i a13,c a14,c a15,j a16,i a17,l a18,s a19,s a20,p a21,i a22,j a23,i a24,l a25){fid=57;V_l[1]=a1;V_d[2]=a2;V_s[3]=a3;V_s[4]=a4;V_l[5]=a5;V_f[6]=a6;V_l[7]=a7;V_l[8]=a8;V_s[9]=a9;V_d[10]=a10;V_f[11]=a11;V_l[12]=a12;V_i[13]=a13;V_c[14]=a14;V_c[15]=a15;V_j[16]=a16;V_i[17]=a17;V_l[18]=a18;V_s[19]=a19;V_s[20]=a20;V_p[21]=a21;V_i[22]=a22;V_j[23]=a23;V_i[24]=a24;V_l[25]=a25;ret_v(25)} /* 58:dpcplpjjppididdsjiliplis */ d f58(p a1,c a2,p a3,l a4,p a5,j a6,j a7,p a8,p a9,i a10,d a11,i a12,d a13,d a14,s a15,j a16,i a17,l a18,i a19,p a20,l a21,i a22,s a23){fid=58;V_p[1]=a1;V_c[2]=a2;V_p[3]=a3;V_l[4]=a4;V_p[5]=a5;V_j[6]=a6;V_j[7]=a7;V_p[8]=a8;V_p[9]=a9;V_i[10]=a10;V_d[11]=a11;V_i[12]=a12;V_d[13]=a13;V_d[14]=a14;V_s[15]=a15;V_j[16]=a16;V_i[17]=a17;V_l[18]=a18;V_i[19]=a19;V_p[20]=a20;V_l[21]=a21;V_i[22]=a22;V_s[23]=a23;ret_d(23)} /* 59:pdfffpijfsjpjdljljcpslfspjsjdsili */ p f59(d a1,f a2,f a3,f a4,p a5,i a6,j a7,f a8,s a9,j a10,p a11,j a12,d a13,l a14,j a15,l a16,j a17,c a18,p a19,s a20,l a21,f a22,s a23,p a24,j a25,s a26,j a27,d a28,s a29,i a30,l a31,i a32){fid=59;V_d[1]=a1;V_f[2]=a2;V_f[3]=a3;V_f[4]=a4;V_p[5]=a5;V_i[6]=a6;V_j[7]=a7;V_f[8]=a8;V_s[9]=a9;V_j[10]=a10;V_p[11]=a11;V_j[12]=a12;V_d[13]=a13;V_l[14]=a14;V_j[15]=a15;V_l[16]=a16;V_j[17]=a17;V_c[18]=a18;V_p[19]=a19;V_s[20]=a20;V_l[21]=a21;V_f[22]=a22;V_s[23]=a23;V_p[24]=a24;V_j[25]=a25;V_s[26]=a26;V_j[27]=a27;V_d[28]=a28;V_s[29]=a29;V_i[30]=a30;V_l[31]=a31;V_i[32]=a32;ret_p(32)} /* 60:vslsccpdffppssdicils */ v f60(s a1,l a2,s a3,c a4,c a5,p a6,d a7,f a8,f a9,p a10,p a11,s a12,s a13,d a14,i a15,c a16,i a17,l a18,s a19){fid=60;V_s[1]=a1;V_l[2]=a2;V_s[3]=a3;V_c[4]=a4;V_c[5]=a5;V_p[6]=a6;V_d[7]=a7;V_f[8]=a8;V_f[9]=a9;V_p[10]=a10;V_p[11]=a11;V_s[12]=a12;V_s[13]=a13;V_d[14]=a14;V_i[15]=a15;V_c[16]=a16;V_i[17]=a17;V_l[18]=a18;V_s[19]=a19;ret_v(19)} /* 61:jjippjlpflcifdpidddcffc */ j f61(j a1,i a2,p a3,p a4,j a5,l a6,p a7,f a8,l a9,c a10,i a11,f a12,d a13,p a14,i a15,d a16,d a17,d a18,c a19,f a20,f a21,c a22){fid=61;V_j[1]=a1;V_i[2]=a2;V_p[3]=a3;V_p[4]=a4;V_j[5]=a5;V_l[6]=a6;V_p[7]=a7;V_f[8]=a8;V_l[9]=a9;V_c[10]=a10;V_i[11]=a11;V_f[12]=a12;V_d[13]=a13;V_p[14]=a14;V_i[15]=a15;V_d[16]=a16;V_d[17]=a17;V_d[18]=a18;V_c[19]=a19;V_f[20]=a20;V_f[21]=a21;V_c[22]=a22;ret_j(22)} /* 62:dlfcdppclifdsss */ d f62(l a1,f a2,c a3,d a4,p a5,p a6,c a7,l a8,i a9,f a10,d a11,s a12,s a13,s a14){fid=62;V_l[1]=a1;V_f[2]=a2;V_c[3]=a3;V_d[4]=a4;V_p[5]=a5;V_p[6]=a6;V_c[7]=a7;V_l[8]=a8;V_i[9]=a9;V_f[10]=a10;V_d[11]=a11;V_s[12]=a12;V_s[13]=a13;V_s[14]=a14;ret_d(14)} /* 63:pps */ p f63(p a1,s a2){fid=63;V_p[1]=a1;V_s[2]=a2;ret_p(2)} /* 64:fsicsfpsdifclpllspifcdlssfd */ f f64(s a1,i a2,c a3,s a4,f a5,p a6,s a7,d a8,i a9,f a10,c a11,l a12,p a13,l a14,l a15,s a16,p a17,i a18,f a19,c a20,d a21,l a22,s a23,s a24,f a25,d a26){fid=64;V_s[1]=a1;V_i[2]=a2;V_c[3]=a3;V_s[4]=a4;V_f[5]=a5;V_p[6]=a6;V_s[7]=a7;V_d[8]=a8;V_i[9]=a9;V_f[10]=a10;V_c[11]=a11;V_l[12]=a12;V_p[13]=a13;V_l[14]=a14;V_l[15]=a15;V_s[16]=a16;V_p[17]=a17;V_i[18]=a18;V_f[19]=a19;V_c[20]=a20;V_d[21]=a21;V_l[22]=a22;V_s[23]=a23;V_s[24]=a24;V_f[25]=a25;V_d[26]=a26;ret_f(26)} /* 65:ls */ l f65(s a1){fid=65;V_s[1]=a1;ret_l(1)} /* 66:pcllscfdfdljfcfjdldcdlfjcclcscf */ p f66(c a1,l a2,l a3,s a4,c a5,f a6,d a7,f a8,d a9,l a10,j a11,f a12,c a13,f a14,j a15,d a16,l a17,d a18,c a19,d a20,l a21,f a22,j a23,c a24,c a25,l a26,c a27,s a28,c a29,f a30){fid=66;V_c[1]=a1;V_l[2]=a2;V_l[3]=a3;V_s[4]=a4;V_c[5]=a5;V_f[6]=a6;V_d[7]=a7;V_f[8]=a8;V_d[9]=a9;V_l[10]=a10;V_j[11]=a11;V_f[12]=a12;V_c[13]=a13;V_f[14]=a14;V_j[15]=a15;V_d[16]=a16;V_l[17]=a17;V_d[18]=a18;V_c[19]=a19;V_d[20]=a20;V_l[21]=a21;V_f[22]=a22;V_j[23]=a23;V_c[24]=a24;V_c[25]=a25;V_l[26]=a26;V_c[27]=a27;V_s[28]=a28;V_c[29]=a29;V_f[30]=a30;ret_p(30)} /* 67:cjjfdsiliicdlpciscppcdfccpcssjd */ c f67(j a1,j a2,f a3,d a4,s a5,i a6,l a7,i a8,i a9,c a10,d a11,l a12,p a13,c a14,i a15,s a16,c a17,p a18,p a19,c a20,d a21,f a22,c a23,c a24,p a25,c a26,s a27,s a28,j a29,d a30){fid=67;V_j[1]=a1;V_j[2]=a2;V_f[3]=a3;V_d[4]=a4;V_s[5]=a5;V_i[6]=a6;V_l[7]=a7;V_i[8]=a8;V_i[9]=a9;V_c[10]=a10;V_d[11]=a11;V_l[12]=a12;V_p[13]=a13;V_c[14]=a14;V_i[15]=a15;V_s[16]=a16;V_c[17]=a17;V_p[18]=a18;V_p[19]=a19;V_c[20]=a20;V_d[21]=a21;V_f[22]=a22;V_c[23]=a23;V_c[24]=a24;V_p[25]=a25;V_c[26]=a26;V_s[27]=a27;V_s[28]=a28;V_j[29]=a29;V_d[30]=a30;ret_c(30)} /* 68:vpcdpppj */ v f68(p a1,c a2,d a3,p a4,p a5,p a6,j a7){fid=68;V_p[1]=a1;V_c[2]=a2;V_d[3]=a3;V_p[4]=a4;V_p[5]=a5;V_p[6]=a6;V_j[7]=a7;ret_v(7)} /* 69:pdcspslifccficpisicdsjf */ p f69(d a1,c a2,s a3,p a4,s a5,l a6,i a7,f a8,c a9,c a10,f a11,i a12,c a13,p a14,i a15,s a16,i a17,c a18,d a19,s a20,j a21,f a22){fid=69;V_d[1]=a1;V_c[2]=a2;V_s[3]=a3;V_p[4]=a4;V_s[5]=a5;V_l[6]=a6;V_i[7]=a7;V_f[8]=a8;V_c[9]=a9;V_c[10]=a10;V_f[11]=a11;V_i[12]=a12;V_c[13]=a13;V_p[14]=a14;V_i[15]=a15;V_s[16]=a16;V_i[17]=a17;V_c[18]=a18;V_d[19]=a19;V_s[20]=a20;V_j[21]=a21;V_f[22]=a22;ret_p(22)} /* 70:jljsp */ j f70(l a1,j a2,s a3,p a4){fid=70;V_l[1]=a1;V_j[2]=a2;V_s[3]=a3;V_p[4]=a4;ret_j(4)} /* 71:ddipfllddjficls */ d f71(d a1,i a2,p a3,f a4,l a5,l a6,d a7,d a8,j a9,f a10,i a11,c a12,l a13,s a14){fid=71;V_d[1]=a1;V_i[2]=a2;V_p[3]=a3;V_f[4]=a4;V_l[5]=a5;V_l[6]=a6;V_d[7]=a7;V_d[8]=a8;V_j[9]=a9;V_f[10]=a10;V_i[11]=a11;V_c[12]=a12;V_l[13]=a13;V_s[14]=a14;ret_d(14)} /* 72:lcc */ l f72(c a1,c a2){fid=72;V_c[1]=a1;V_c[2]=a2;ret_l(2)} /* 73:vijlslssscfp */ v f73(i a1,j a2,l a3,s a4,l a5,s a6,s a7,s a8,c a9,f a10,p a11){fid=73;V_i[1]=a1;V_j[2]=a2;V_l[3]=a3;V_s[4]=a4;V_l[5]=a5;V_s[6]=a6;V_s[7]=a7;V_s[8]=a8;V_c[9]=a9;V_f[10]=a10;V_p[11]=a11;ret_v(11)} /* 74:fjlspsddsdlcci */ f f74(j a1,l a2,s a3,p a4,s a5,d a6,d a7,s a8,d a9,l a10,c a11,c a12,i a13){fid=74;V_j[1]=a1;V_l[2]=a2;V_s[3]=a3;V_p[4]=a4;V_s[5]=a5;V_d[6]=a6;V_d[7]=a7;V_s[8]=a8;V_d[9]=a9;V_l[10]=a10;V_c[11]=a11;V_c[12]=a12;V_i[13]=a13;ret_f(13)} /* 75:jjiddsddcjscdpidp */ j f75(j a1,i a2,d a3,d a4,s a5,d a6,d a7,c a8,j a9,s a10,c a11,d a12,p a13,i a14,d a15,p a16){fid=75;V_j[1]=a1;V_i[2]=a2;V_d[3]=a3;V_d[4]=a4;V_s[5]=a5;V_d[6]=a6;V_d[7]=a7;V_c[8]=a8;V_j[9]=a9;V_s[10]=a10;V_c[11]=a11;V_d[12]=a12;V_p[13]=a13;V_i[14]=a14;V_d[15]=a15;V_p[16]=a16;ret_j(16)} /* 76:lfl */ l f76(f a1,l a2){fid=76;V_f[1]=a1;V_l[2]=a2;ret_l(2)} /* 77:sipslcdccjsifddcifijdsfdjsiscp */ s f77(i a1,p a2,s a3,l a4,c a5,d a6,c a7,c a8,j a9,s a10,i a11,f a12,d a13,d a14,c a15,i a16,f a17,i a18,j a19,d a20,s a21,f a22,d a23,j a24,s a25,i a26,s a27,c a28,p a29){fid=77;V_i[1]=a1;V_p[2]=a2;V_s[3]=a3;V_l[4]=a4;V_c[5]=a5;V_d[6]=a6;V_c[7]=a7;V_c[8]=a8;V_j[9]=a9;V_s[10]=a10;V_i[11]=a11;V_f[12]=a12;V_d[13]=a13;V_d[14]=a14;V_c[15]=a15;V_i[16]=a16;V_f[17]=a17;V_i[18]=a18;V_j[19]=a19;V_d[20]=a20;V_s[21]=a21;V_f[22]=a22;V_d[23]=a23;V_j[24]=a24;V_s[25]=a25;V_i[26]=a26;V_s[27]=a27;V_c[28]=a28;V_p[29]=a29;ret_s(29)} /* 78:dcifsspsdffjjjlccdd */ d f78(c a1,i a2,f a3,s a4,s a5,p a6,s a7,d a8,f a9,f a10,j a11,j a12,j a13,l a14,c a15,c a16,d a17,d a18){fid=78;V_c[1]=a1;V_i[2]=a2;V_f[3]=a3;V_s[4]=a4;V_s[5]=a5;V_p[6]=a6;V_s[7]=a7;V_d[8]=a8;V_f[9]=a9;V_f[10]=a10;V_j[11]=a11;V_j[12]=a12;V_j[13]=a13;V_l[14]=a14;V_c[15]=a15;V_c[16]=a16;V_d[17]=a17;V_d[18]=a18;ret_d(18)} /* 79:fjfff */ f f79(j a1,f a2,f a3,f a4){fid=79;V_j[1]=a1;V_f[2]=a2;V_f[3]=a3;V_f[4]=a4;ret_f(4)} /* 80:fccs */ f f80(c a1,c a2,s a3){fid=80;V_c[1]=a1;V_c[2]=a2;V_s[3]=a3;ret_f(3)} /* 81:ipffplspcdjclfdldiiilsifippij */ i f81(p a1,f a2,f a3,p a4,l a5,s a6,p a7,c a8,d a9,j a10,c a11,l a12,f a13,d a14,l a15,d a16,i a17,i a18,i a19,l a20,s a21,i a22,f a23,i a24,p a25,p a26,i a27,j a28){fid=81;V_p[1]=a1;V_f[2]=a2;V_f[3]=a3;V_p[4]=a4;V_l[5]=a5;V_s[6]=a6;V_p[7]=a7;V_c[8]=a8;V_d[9]=a9;V_j[10]=a10;V_c[11]=a11;V_l[12]=a12;V_f[13]=a13;V_d[14]=a14;V_l[15]=a15;V_d[16]=a16;V_i[17]=a17;V_i[18]=a18;V_i[19]=a19;V_l[20]=a20;V_s[21]=a21;V_i[22]=a22;V_f[23]=a23;V_i[24]=a24;V_p[25]=a25;V_p[26]=a26;V_i[27]=a27;V_j[28]=a28;ret_i(28)} /* 82:lcliijcjfcipijiflpislfdpiiil */ l f82(c a1,l a2,i a3,i a4,j a5,c a6,j a7,f a8,c a9,i a10,p a11,i a12,j a13,i a14,f a15,l a16,p a17,i a18,s a19,l a20,f a21,d a22,p a23,i a24,i a25,i a26,l a27){fid=82;V_c[1]=a1;V_l[2]=a2;V_i[3]=a3;V_i[4]=a4;V_j[5]=a5;V_c[6]=a6;V_j[7]=a7;V_f[8]=a8;V_c[9]=a9;V_i[10]=a10;V_p[11]=a11;V_i[12]=a12;V_j[13]=a13;V_i[14]=a14;V_f[15]=a15;V_l[16]=a16;V_p[17]=a17;V_i[18]=a18;V_s[19]=a19;V_l[20]=a20;V_f[21]=a21;V_d[22]=a22;V_p[23]=a23;V_i[24]=a24;V_i[25]=a25;V_i[26]=a26;V_l[27]=a27;ret_l(27)} /* 83:cddlfdccfllffddpjs */ c f83(d a1,d a2,l a3,f a4,d a5,c a6,c a7,f a8,l a9,l a10,f a11,f a12,d a13,d a14,p a15,j a16,s a17){fid=83;V_d[1]=a1;V_d[2]=a2;V_l[3]=a3;V_f[4]=a4;V_d[5]=a5;V_c[6]=a6;V_c[7]=a7;V_f[8]=a8;V_l[9]=a9;V_l[10]=a10;V_f[11]=a11;V_f[12]=a12;V_d[13]=a13;V_d[14]=a14;V_p[15]=a15;V_j[16]=a16;V_s[17]=a17;ret_c(17)} /* 84:pjdspicppiipssiflpsssidls */ p f84(j a1,d a2,s a3,p a4,i a5,c a6,p a7,p a8,i a9,i a10,p a11,s a12,s a13,i a14,f a15,l a16,p a17,s a18,s a19,s a20,i a21,d a22,l a23,s a24){fid=84;V_j[1]=a1;V_d[2]=a2;V_s[3]=a3;V_p[4]=a4;V_i[5]=a5;V_c[6]=a6;V_p[7]=a7;V_p[8]=a8;V_i[9]=a9;V_i[10]=a10;V_p[11]=a11;V_s[12]=a12;V_s[13]=a13;V_i[14]=a14;V_f[15]=a15;V_l[16]=a16;V_p[17]=a17;V_s[18]=a18;V_s[19]=a19;V_s[20]=a20;V_i[21]=a21;V_d[22]=a22;V_l[23]=a23;V_s[24]=a24;ret_p(24)} /* 85:fffipjp */ f f85(f a1,f a2,i a3,p a4,j a5,p a6){fid=85;V_f[1]=a1;V_f[2]=a2;V_i[3]=a3;V_p[4]=a4;V_j[5]=a5;V_p[6]=a6;ret_f(6)} /* 86:iiljilpppjpcsdddijpfsjjsjipidd */ i f86(i a1,l a2,j a3,i a4,l a5,p a6,p a7,p a8,j a9,p a10,c a11,s a12,d a13,d a14,d a15,i a16,j a17,p a18,f a19,s a20,j a21,j a22,s a23,j a24,i a25,p a26,i a27,d a28,d a29){fid=86;V_i[1]=a1;V_l[2]=a2;V_j[3]=a3;V_i[4]=a4;V_l[5]=a5;V_p[6]=a6;V_p[7]=a7;V_p[8]=a8;V_j[9]=a9;V_p[10]=a10;V_c[11]=a11;V_s[12]=a12;V_d[13]=a13;V_d[14]=a14;V_d[15]=a15;V_i[16]=a16;V_j[17]=a17;V_p[18]=a18;V_f[19]=a19;V_s[20]=a20;V_j[21]=a21;V_j[22]=a22;V_s[23]=a23;V_j[24]=a24;V_i[25]=a25;V_p[26]=a26;V_i[27]=a27;V_d[28]=a28;V_d[29]=a29;ret_i(29)} /* 87:scjdscdl */ s f87(c a1,j a2,d a3,s a4,c a5,d a6,l a7){fid=87;V_c[1]=a1;V_j[2]=a2;V_d[3]=a3;V_s[4]=a4;V_c[5]=a5;V_d[6]=a6;V_l[7]=a7;ret_s(7)} /* 88:ji */ j f88(i a1){fid=88;V_i[1]=a1;ret_j(1)} /* 89:cjjllcpllsli */ c f89(j a1,j a2,l a3,l a4,c a5,p a6,l a7,l a8,s a9,l a10,i a11){fid=89;V_j[1]=a1;V_j[2]=a2;V_l[3]=a3;V_l[4]=a4;V_c[5]=a5;V_p[6]=a6;V_l[7]=a7;V_l[8]=a8;V_s[9]=a9;V_l[10]=a10;V_i[11]=a11;ret_c(11)} /* 90:picllsjipssddlcjdijfcl */ p f90(i a1,c a2,l a3,l a4,s a5,j a6,i a7,p a8,s a9,s a10,d a11,d a12,l a13,c a14,j a15,d a16,i a17,j a18,f a19,c a20,l a21){fid=90;V_i[1]=a1;V_c[2]=a2;V_l[3]=a3;V_l[4]=a4;V_s[5]=a5;V_j[6]=a6;V_i[7]=a7;V_p[8]=a8;V_s[9]=a9;V_s[10]=a10;V_d[11]=a11;V_d[12]=a12;V_l[13]=a13;V_c[14]=a14;V_j[15]=a15;V_d[16]=a16;V_i[17]=a17;V_j[18]=a18;V_f[19]=a19;V_c[20]=a20;V_l[21]=a21;ret_p(21)} /* 91:sjclccsdspcfpp */ s f91(j a1,c a2,l a3,c a4,c a5,s a6,d a7,s a8,p a9,c a10,f a11,p a12,p a13){fid=91;V_j[1]=a1;V_c[2]=a2;V_l[3]=a3;V_c[4]=a4;V_c[5]=a5;V_s[6]=a6;V_d[7]=a7;V_s[8]=a8;V_p[9]=a9;V_c[10]=a10;V_f[11]=a11;V_p[12]=a12;V_p[13]=a13;ret_s(13)} /* 92:lipjddjpdlislpdfppsddfccppffsii */ l f92(i a1,p a2,j a3,d a4,d a5,j a6,p a7,d a8,l a9,i a10,s a11,l a12,p a13,d a14,f a15,p a16,p a17,s a18,d a19,d a20,f a21,c a22,c a23,p a24,p a25,f a26,f a27,s a28,i a29,i a30){fid=92;V_i[1]=a1;V_p[2]=a2;V_j[3]=a3;V_d[4]=a4;V_d[5]=a5;V_j[6]=a6;V_p[7]=a7;V_d[8]=a8;V_l[9]=a9;V_i[10]=a10;V_s[11]=a11;V_l[12]=a12;V_p[13]=a13;V_d[14]=a14;V_f[15]=a15;V_p[16]=a16;V_p[17]=a17;V_s[18]=a18;V_d[19]=a19;V_d[20]=a20;V_f[21]=a21;V_c[22]=a22;V_c[23]=a23;V_p[24]=a24;V_p[25]=a25;V_f[26]=a26;V_f[27]=a27;V_s[28]=a28;V_i[29]=a29;V_i[30]=a30;ret_l(30)} /* 93:plfliij */ p f93(l a1,f a2,l a3,i a4,i a5,j a6){fid=93;V_l[1]=a1;V_f[2]=a2;V_l[3]=a3;V_i[4]=a4;V_i[5]=a5;V_j[6]=a6;ret_p(6)} /* 94:ilp */ i f94(l a1,p a2){fid=94;V_l[1]=a1;V_p[2]=a2;ret_i(2)} /* 95:jpjpicpdlsiclffifsplplsdjspspis */ j f95(p a1,j a2,p a3,i a4,c a5,p a6,d a7,l a8,s a9,i a10,c a11,l a12,f a13,f a14,i a15,f a16,s a17,p a18,l a19,p a20,l a21,s a22,d a23,j a24,s a25,p a26,s a27,p a28,i a29,s a30){fid=95;V_p[1]=a1;V_j[2]=a2;V_p[3]=a3;V_i[4]=a4;V_c[5]=a5;V_p[6]=a6;V_d[7]=a7;V_l[8]=a8;V_s[9]=a9;V_i[10]=a10;V_c[11]=a11;V_l[12]=a12;V_f[13]=a13;V_f[14]=a14;V_i[15]=a15;V_f[16]=a16;V_s[17]=a17;V_p[18]=a18;V_l[19]=a19;V_p[20]=a20;V_l[21]=a21;V_s[22]=a22;V_d[23]=a23;V_j[24]=a24;V_s[25]=a25;V_p[26]=a26;V_s[27]=a27;V_p[28]=a28;V_i[29]=a29;V_s[30]=a30;ret_j(30)} /* 96:jfliipdlilisj */ j f96(f a1,l a2,i a3,i a4,p a5,d a6,l a7,i a8,l a9,i a10,s a11,j a12){fid=96;V_f[1]=a1;V_l[2]=a2;V_i[3]=a3;V_i[4]=a4;V_p[5]=a5;V_d[6]=a6;V_l[7]=a7;V_i[8]=a8;V_l[9]=a9;V_i[10]=a10;V_s[11]=a11;V_j[12]=a12;ret_j(12)} /* 97:iipfdfl */ i f97(i a1,p a2,f a3,d a4,f a5,l a6){fid=97;V_i[1]=a1;V_p[2]=a2;V_f[3]=a3;V_d[4]=a4;V_f[5]=a5;V_l[6]=a6;ret_i(6)} /* 98:lcspcfilfsc */ l f98(c a1,s a2,p a3,c a4,f a5,i a6,l a7,f a8,s a9,c a10){fid=98;V_c[1]=a1;V_s[2]=a2;V_p[3]=a3;V_c[4]=a4;V_f[5]=a5;V_i[6]=a6;V_l[7]=a7;V_f[8]=a8;V_s[9]=a9;V_c[10]=a10;ret_l(10)} /* 99:pffjliljjfcicccflcdsf */ p f99(f a1,f a2,j a3,l a4,i a5,l a6,j a7,j a8,f a9,c a10,i a11,c a12,c a13,c a14,f a15,l a16,c a17,d a18,s a19,f a20){fid=99;V_f[1]=a1;V_f[2]=a2;V_j[3]=a3;V_l[4]=a4;V_i[5]=a5;V_l[6]=a6;V_j[7]=a7;V_j[8]=a8;V_f[9]=a9;V_c[10]=a10;V_i[11]=a11;V_c[12]=a12;V_c[13]=a13;V_c[14]=a14;V_f[15]=a15;V_l[16]=a16;V_c[17]=a17;V_d[18]=a18;V_s[19]=a19;V_f[20]=a20;ret_p(20)} /* 100:vdlsfcpcjlsiccj */ v f100(d a1,l a2,s a3,f a4,c a5,p a6,c a7,j a8,l a9,s a10,i a11,c a12,c a13,j a14){fid=100;V_d[1]=a1;V_l[2]=a2;V_s[3]=a3;V_f[4]=a4;V_c[5]=a5;V_p[6]=a6;V_c[7]=a7;V_j[8]=a8;V_l[9]=a9;V_s[10]=a10;V_i[11]=a11;V_c[12]=a12;V_c[13]=a13;V_j[14]=a14;ret_v(14)} funptr G_funtab[] = { (funptr)&f1, (funptr)&f2, (funptr)&f3, (funptr)&f4, (funptr)&f5, (funptr)&f6, (funptr)&f7, (funptr)&f8, (funptr)&f9, (funptr)&f10, (funptr)&f11, (funptr)&f12, (funptr)&f13, (funptr)&f14, (funptr)&f15, (funptr)&f16, (funptr)&f17, (funptr)&f18, (funptr)&f19, (funptr)&f20, (funptr)&f21, (funptr)&f22, (funptr)&f23, (funptr)&f24, (funptr)&f25, (funptr)&f26, (funptr)&f27, (funptr)&f28, (funptr)&f29, (funptr)&f30, (funptr)&f31, (funptr)&f32, (funptr)&f33, (funptr)&f34, (funptr)&f35, (funptr)&f36, (funptr)&f37, (funptr)&f38, (funptr)&f39, (funptr)&f40, (funptr)&f41, (funptr)&f42, (funptr)&f43, (funptr)&f44, (funptr)&f45, (funptr)&f46, (funptr)&f47, (funptr)&f48, (funptr)&f49, (funptr)&f50, (funptr)&f51, (funptr)&f52, (funptr)&f53, (funptr)&f54, (funptr)&f55, (funptr)&f56, (funptr)&f57, (funptr)&f58, (funptr)&f59, (funptr)&f60, (funptr)&f61, (funptr)&f62, (funptr)&f63, (funptr)&f64, (funptr)&f65, (funptr)&f66, (funptr)&f67, (funptr)&f68, (funptr)&f69, (funptr)&f70, (funptr)&f71, (funptr)&f72, (funptr)&f73, (funptr)&f74, (funptr)&f75, (funptr)&f76, (funptr)&f77, (funptr)&f78, (funptr)&f79, (funptr)&f80, (funptr)&f81, (funptr)&f82, (funptr)&f83, (funptr)&f84, (funptr)&f85, (funptr)&f86, (funptr)&f87, (funptr)&f88, (funptr)&f89, (funptr)&f90, (funptr)&f91, (funptr)&f92, (funptr)&f93, (funptr)&f94, (funptr)&f95, (funptr)&f96, (funptr)&f97, (funptr)&f98, (funptr)&f99, (funptr)&f100, }; char const * G_sigtab[] = { "jifjdidpslfdfpifdflclcsjfjsdd", "fdsdcjjjjlpd", "jlisplppcdifsjfsjcliipfpcpj", "cjsjpcjsipcfccljpcpplsslji", "vijsclcsdjijsficilfjpdfjiffiljc", "fiffdisiicijddpjdpsici", "scllcsjjilfjcpfsj", "ddcfdispifjpjicffjfsis", "jjfflllfipdsjsjdscd", "ildl", "llllppplsldpccjsflsj", "ippcii", "jdipcdpc", "jjlspi", "cdicfiidisdsp", "pfcdlcpsiccpifdll", "pfjf", "plispfpjjijdjij", "cjlfs", "fddljfldscfcc", "vlpdsdidfsfjcidijspcldsfijis", "jfljilsflciddclicljsssisiifpci", "p", "cjj", "sjpidpsdldcjfippicilfl", "psfcffpijlfjjlpssc", "cpiijlppici", "jfslddfifcdscfllpfjffff", "ppcdclclclpic", "jd", "flsdfpssplsilflfpsfdlplffsfisj", "fi", "cpipsssjssfjpsjdijllsjdspfsiscd", "fiildffcjdpjsplidlspji", "dcssppdcjfif", "csdplfddlifispppj", "lissccfiiis", "cffccljpsdjffifsllppddlipf", "dpjlscjiijdcllflsiicjjsfccsd", "pldpcscpppilpldsjpsppf", "fifffldcpf", "lijcsijlpippi", "vssdpsdffjjidjisfdfliljsdfip", "s", "ciplclcfpclsippfcjssp", "lld", "sidsjjslfliicjpjslfssidijjcdj", "jsjcdclsdsslifffcssjissjjdjclsjl", "pislpl", "fppssdijcjfjjfcjfdjij", "psjcijjpscsfciififcldcippilfl", "cpfcslscs", "pfscjsicdpfjcjifjljscifccdf", "sddijdsfpfjf", "cii", "ssccdjlssjcsc", "vldsslfllsdfliccjilsspijil", "dpcplpjjppididdsjiliplis", "pdfffpijfsjpjdljljcpslfspjsjdsili", "vslsccpdffppssdicils", "jjippjlpflcifdpidddcffc", "dlfcdppclifdsss", "pps", "fsicsfpsdifclpllspifcdlssfd", "ls", "pcllscfdfdljfcfjdldcdlfjcclcscf", "cjjfdsiliicdlpciscppcdfccpcssjd", "vpcdpppj", "pdcspslifccficpisicdsjf", "jljsp", "ddipfllddjficls", "lcc", "vijlslssscfp", "fjlspsddsdlcci", "jjiddsddcjscdpidp", "lfl", "sipslcdccjsifddcifijdsfdjsiscp", "dcifsspsdffjjjlccdd", "fjfff", "fccs", "ipffplspcdjclfdldiiilsifippij", "lcliijcjfcipijiflpislfdpiiil", "cddlfdccfllffddpjs", "pjdspicppiipssiflpsssidls", "fffipjp", "iiljilpppjpcsdddijpfsjjsjipidd", "scjdscdl", "ji", "cjjllcpllsli", "picllsjipssddlcjdijfcl", "sjclccsdspcfpp", "lipjddjpdlislpdfppsddfccppffsii", "plfliij", "ilp", "jpjpicpdlsiclffifsplplsdjspspis", "jfliipdlilisj", "iipfdfl", "lcspcfilfsc", "pffjliljjfcicccflcdsf", "vdlsfcpcjlsiccj", }; int G_maxargs = 32; MoarVM-2015.11/3rdparty/dyncall/test/call_suite/cases.txt0000644000175000017500000000333012456307246022220 0ustar jnthnjnthnjifjdidpslfdfpifdflclcsjfjsdd fdsdcjjjjlpd jlisplppcdifsjfsjcliipfpcpj cjsjpcjsipcfccljpcpplsslji vijsclcsdjijsficilfjpdfjiffiljc fiffdisiicijddpjdpsici scllcsjjilfjcpfsj ddcfdispifjpjicffjfsis jjfflllfipdsjsjdscd ildl llllppplsldpccjsflsj ippcii jdipcdpc jjlspi cdicfiidisdsp pfcdlcpsiccpifdll pfjf plispfpjjijdjij cjlfs fddljfldscfcc vlpdsdidfsfjcidijspcldsfijis jfljilsflciddclicljsssisiifpci p cjj sjpidpsdldcjfippicilfl psfcffpijlfjjlpssc cpiijlppici jfslddfifcdscfllpfjffff ppcdclclclpic jd flsdfpssplsilflfpsfdlplffsfisj fi cpipsssjssfjpsjdijllsjdspfsiscd fiildffcjdpjsplidlspji dcssppdcjfif csdplfddlifispppj lissccfiiis cffccljpsdjffifsllppddlipf dpjlscjiijdcllflsiicjjsfccsd pldpcscpppilpldsjpsppf fifffldcpf lijcsijlpippi vssdpsdffjjidjisfdfliljsdfip s ciplclcfpclsippfcjssp lld sidsjjslfliicjpjslfssidijjcdj jsjcdclsdsslifffcssjissjjdjclsjl pislpl fppssdijcjfjjfcjfdjij psjcijjpscsfciififcldcippilfl cpfcslscs pfscjsicdpfjcjifjljscifccdf sddijdsfpfjf cii ssccdjlssjcsc vldsslfllsdfliccjilsspijil dpcplpjjppididdsjiliplis pdfffpijfsjpjdljljcpslfspjsjdsili vslsccpdffppssdicils jjippjlpflcifdpidddcffc dlfcdppclifdsss pps fsicsfpsdifclpllspifcdlssfd ls pcllscfdfdljfcfjdldcdlfjcclcscf cjjfdsiliicdlpciscppcdfccpcssjd vpcdpppj pdcspslifccficpisicdsjf jljsp ddipfllddjficls lcc vijlslssscfp fjlspsddsdlcci jjiddsddcjscdpidp lfl sipslcdccjsifddcifijdsfdjsiscp dcifsspsdffjjjlccdd fjfff fccs ipffplspcdjclfdldiiilsifippij lcliijcjfcipijiflpislfdpiiil cddlfdccfllffddpjs pjdspicppiipssiflpsssidls fffipjp iiljilpppjpcsdddijpfsjjsjipidd scjdscdl ji cjjllcpllsli picllsjipssddlcjdijfcl sjclccsdspcfpp lipjddjpdlislpdfppsddfccppffsii plfliij ilp jpjpicpdlsiclffifsplplsdjspspis jfliipdlilisj iipfdfl lcspcfilfsc pffjliljjfcicccflcdsf vdlsfcpcjlsiccj MoarVM-2015.11/3rdparty/dyncall/test/call_suite/config.lua0000644000175000017500000000014212456307246022327 0ustar jnthnjnthn-- user config for rand-sig.lua: minargs = 0 maxargs = 32 ncases = 100 types = "csijlpfd" MoarVM-2015.11/3rdparty/dyncall/test/call_suite/design.txt0000644000175000017500000000163612456307246022402 0ustar jnthnjnthnvffffffffffffffff vfffffffffffffffff vf vff vfff vffff vfffff vffffff vfffffff vd vdd vddd vdddd vddddd vdddddd vddddddd vfffddd vdddfff vffffffd vddddddf vlllllld vlllllldd vllllllddd vlllllldddd vllllllff vllllllfff vllllllffff vllllllfffffffffffffff vllllllffffffffffffffff vlllllldddddddddddddddd vllllllddddddddddddddddd vdddddddddddddddd vddddddddddddddddd vddddddddddddddddl vllllllllllllllll vlllllllllllllllll vlllldllllllllllll vlllldddd vllllddddll vllllddddlllll vllllddddlllllllll vdfdfdfdfdf vdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf vfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd vd vdd vddd vdddd vddddd vdddddd vddddddd vdddddddd vddddddddd vdddddddddd vddddddddddd vdddddddddddd vddddddddddddd vdddddddddddddd vddddddddddddddd vdddddddddddddddd vddddddddddddddddd vdddddddddddddddddd vddddddddddddddddddd vdddddddddddddddddddd vddddddddddddddddddddd vdddddddddddddddddddddd vddddddddddddddddddddddd vdddddddddddddddddddddddd MoarVM-2015.11/3rdparty/dyncall/test/call_suite/dynMakefile0000644000175000017500000000032412456307246022534 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/call_suite/globals.c0000644000175000017500000000411612456307246022153 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/call_suite/globals.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include "globals.h" #include #define X(CH,T,QCH) T *V_##CH; T *K_##CH; DEF_TYPES #undef X int fid; double rand_d() { return ( ( (double) rand() ) / ( (double) RAND_MAX ) ); } void init_K() { int i; #define X(CH,T,QCH) V_##CH = (T*) malloc(sizeof(T)*G_maxargs); K_##CH = (T*) malloc(sizeof(T)*G_maxargs); DEF_TYPES #undef X for(i=0;i, Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define DEF_TYPES X(c,char,'c') X(s,short,'s') X(i,int,'i') X(j,long,'j') X(l,long long,'l') X(p,void*,'p') X(f,float,'f') X(d,double,'d') #define X(CH,T,QCH) extern T *K_##CH; extern T *V_##CH; DEF_TYPES #undef X typedef void (*funptr)(); extern void * G_callvm; extern funptr G_funtab[]; extern char const * G_sigtab[]; extern int G_ncases; extern int G_maxargs; void init_K(); void init_T(); void clear_V(); int invoke(char const* signature, void* target); #if 0 extern const char *K_c; extern const short *K_s; extern const int *K_i; extern const long *K_j; extern const long long *K_l; extern void* const *K_p; extern const float *K_f; extern const double *K_d; extern char *V_c; extern short *V_s; extern int *V_i; extern long *V_j; extern long long *V_l; extern void* *V_p; extern float *V_f; extern double *V_d; #endif MoarVM-2015.11/3rdparty/dyncall/test/call_suite/invoke.c0000644000175000017500000000746512456307246022035 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/call_suite/invoke.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "globals.h" #include int invoke(char const* signature, void* t) { DCCallVM * p = (DCCallVM*) G_callvm; char const * sig = signature; char rtype; char atype; int pos = 0; int s = 0; clear_V(); rtype = *sig++; dcReset(p); while ( (atype = *sig++) != '\0') { pos++; switch(atype) { case 'c': dcArgChar (p,K_c[pos]); break; case 's': dcArgShort (p,K_s[pos]); break; case 'i': dcArgInt (p,K_i[pos]); break; case 'j': dcArgLong (p,K_j[pos]); break; case 'l': dcArgLongLong(p,K_l[pos]); break; case 'p': dcArgPointer (p,K_p[pos]); break; case 'f': dcArgFloat (p,K_f[pos]); break; case 'd': dcArgDouble (p,K_d[pos]); break; default: printf("unknown atype '%c' (1) ;", atype); return 0; } } switch(rtype) { case 'v': dcCallVoid(p,t); s=1; /*TODO:check that no return-arg was touched.*/ break; case 'c': s = (dcCallChar (p,t) == K_c[pos]) ; break; case 's': s = (dcCallShort (p,t) == K_s[pos]) ; break; case 'i': s = (dcCallInt (p,t) == K_i[pos]) ; break; case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; default: printf("unknown rtype '%c'", rtype); return 0; } if (!s) { printf("rval wrong;"); return 0; } /* test: */ sig = signature+1; pos = 1; while ( (atype = *sig++) != '\0') { switch(atype) { #if 0 #define X(CH,T,QCH) case QCH: s = (V_##CH[pos] == K_##CH[pos]); break; DEF_TYPES #undef X #endif case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break; case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break; case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break; case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %lld != %lld ; ", pos, (long long) V_p[pos], (long long) K_p[pos]); break; case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; default: printf("unknown atype '%c' ; ", atype); return 0; } if (!s) { printf("arg mismatch at %d ; ", pos); return 0; } pos++; } return 1; } MoarVM-2015.11/3rdparty/dyncall/test/call_suite/main.c0000644000175000017500000000332312456307246021453 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/call_suite/main.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include "globals.h" #include #include #include "../common/platformInit.h" char linebuf[1024]; void* G_callvm; int run_test(int i) { char const * sig; void * target; int success; sig = G_sigtab[i]; target = (void*) G_funtab[i]; printf("%d:%s:",i,sig); success = invoke(sig,target); printf("%d\n",success); return success; } int run_all() { int i; int failure = 0; for(i=0;i, # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = globals invoke cases main APPLICATION = call_suite LIBS = $TOP/dyncall/libdyncall_s.a$O #.PHONY: config #config: mkconfig.lua rand-sig.lua mk-cases.lua # echo Generating test cases... # lua mk-config.lua >config.h # lua rand-sig.lua >cases.txt # lua mk-cases.lua cases.h <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/call_suite/rand-sig.lua0000644000175000017500000000055312456307246022574 0ustar jnthnjnthnrequire"config" rtypes = "v"..types math.randomseed(2342) local sigs = { } local id for i = 1, ncases do id = math.random(#rtypes) local nargs = math.random(minargs,maxargs) local sig = { rtypes:sub(id,id)} for j = 1, nargs do id = math.random(#types) sig[#sig+1] = types:sub(id,id) end io.write(table.concat(sig)) io.write("\n") end MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/CMakeLists.txt0000644000175000017500000000014712456307246023717 0ustar jnthnjnthn# add_executable(callback_plain callback_plain.c) target_link_libraries(callback_plain dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/Makefile.M0000644000175000017500000000015312456307246023007 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/Makefile.embedded0000644000175000017500000000047112502366750024344 0ustar jnthnjnthnAPP = callback_plain OBJS = callback_plain.o SRCTOP = ../.. BLDTOP = ${SRCTOP} CFLAGS += -I${SRCTOP}/dyncall LDFLAGS += -L${BLDDIR}/dyncallback LDLIBS += -ldyncallback_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/Makefile.generic0000644000175000017500000000056512456307246024236 0ustar jnthnjnthnAPP = callback_plain OBJS = callback_plain.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncallback -ldyncallback_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/Nmakefile0000644000175000017500000000364512456307246023003 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = callback_plain.exe OBJS = callback_plain.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib $(TOP)\dyncallback\libdyncallback_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = callback_plain.nds OBJS = callback_plain.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a $(TOP)\dyncallback\libdyncallback_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/callback_plain.c0000644000175000017500000000475512466674236024262 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_plain/callback_plain.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncallback/dyncall_thunk.h" #include "../../dyncallback/dyncall_callback.h" #include #include "../common/platformInit.h" char cbHandler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata) { int* ud = (int*)userdata; int arg1 = dcbArgInt (args); float arg2 = dcbArgFloat (args); short arg3 = dcbArgShort (args); double arg4 = dcbArgDouble (args); long long arg5 = dcbArgLongLong(args); printf("reached callback\n"); printf("userdata (should be 1337): %d\n", *ud); printf("1st argument (should be 123): %d\n", arg1); printf("2nd argument (should be 23.f): %f\n", arg2); printf("3rd argument (should be 3): %d\n", arg3); printf("4th argument (should be 1.82): %f\n", arg4); printf("5th argument (should be 9909): %lld\n", arg5); if(*ud == 1337) *ud = 1; if(arg1 == 123) ++*ud; if(arg2 == 23.f) ++*ud; if(arg3 == 3) ++*ud; if(arg4 == 1.82) ++*ud; if(arg5 == 9909) ++*ud; result->s = 1234; return 's'; } int main() { DCCallback* cb; short result = 0; int userdata = 1337; dcTest_initPlatform(); printf("about to callback...\n"); cb = dcbNewCallback("ifsdl)s", &cbHandler, &userdata); result = ((short(*)(int, float, short, double, long long))cb)(123, 23.f, 3, 1.82, 9909llu); dcbFreeCallback(cb); printf("successfully returned from callback\n"); printf("return value (should be 1234): %d\n", result); printf("result: callback_plain: %s\n", (userdata == 6) && (result == 1234) ? "1" : "0"); dcTest_deInitPlatform(); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/dynMakefile0000644000175000017500000000032412456307246023327 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/callback_plain/mkfile0000644000175000017500000000225412456307246022352 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = callback_plain APPLICATION = callback_plain LIBS = $TOP/dyncallback/libdyncallback_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/CMakeLists.txt0000644000175000017500000000024712456307246023746 0ustar jnthnjnthnadd_executable(callback_suite env.c handler.c sigstrings.c invokers.c do_test.c main.c print.c signature_utils.c) target_link_libraries(callback_suite dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/Makefile.M0000644000175000017500000000015312456307246023035 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/Makefile.embedded0000644000175000017500000000066312502366750024375 0ustar jnthnjnthnAPP = callback_suite OBJS = env.o handler.o sigstrings.o invokers.o do_test.o main.o print.o signature_utils.o SRCTOP = ../.. BLDTOP = ${SRCTOP} CFLAGS += -I${SRCTOP}/dyncall -I${SRCTOP}/dyncallback LDFLAGS += -L${BLDTOP}/dyncall -L${BLDTOP}/dyncallback LDLIBS += -ldyncall_s -ldyncallback_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/Makefile.generic0000644000175000017500000000263312466674236024271 0ustar jnthnjnthnAPP = callback_suite OBJS = env.o handler.o sigstrings.o invokers.o do_test.o main.o print.o signature_utils.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall -I${SRCTOP}/dyncallback LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s -L${BLDTOP}/dyncallback -ldyncallback_s LUA = lua AUTOS = _auto_config.h _auto_sigstrings.h _auto_invokers.h \ _auto_invoke_macros.h _auto_invoke_table.h _auto_signatures.txt .PHONY: all clean install config clean-config all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test config: clean-config ${AUTOS} config-random: echo "-- auto-generated file from temlate config-random.lua (created by GNUmake)" >config.lua cat config-random.lua >>config.lua ${MAKE} config config-stress1: echo "-- auto-generated file from temlate config-stress1.lua (created by GNUmake)" >config.lua cat config-stress1.lua >>config.lua ${MAKE} config clean-config: clean rm -f ${AUTOS} _auto_signatures.txt: ${LUA} make-signatures.lua >$@ _auto_invokers.h: _auto_signatures.txt ${LUA} make-invokers.lua <$< >$@ _auto_sigstrings.h: _auto_signatures.txt ${LUA} make-cstrings.lua <$< >$@ _auto_config.h: ${LUA} make-config.lua >$@ _auto_invoke_macros.h: ${LUA} make-invoke-macros.lua >$@ _auto_invoke_table.h: ${LUA} make-invoke-table.lua >$@ MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/Nmakefile0000644000175000017500000000406712456307246023030 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = callback_suite.exe OBJS = env.obj handler.obj sigstrings.obj invokers.obj do_test.obj main.obj print.obj signature_utils.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib $(TOP)\dyncallback\libdyncallback_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = callback_suite.nds OBJS = env.o handler.o sigstrings.o invokers.o do_test.o main.o print.o signature_utils.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a $(TOP)\dyncallback\libdyncallback_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/README.txt0000644000175000017500000000347312456307246022710 0ustar jnthnjnthnCallback Test Suite 2 --------------------- REQUIREMENTS - dyncall - ANSI C compiler - lua (tested with 5.1) CONFIGURE SUITE edit config.lua and run "make config". DESCRIPTION Generates a set of callback invokers in C using lua as a preprocessor. The invokers put up an argument vector using a global Value-Matrix which holds a specific type-specific value pattern as a function of position. The Value-Matrix The value-matrix is a data structure consisting of n x m elements of type DCValueSet which can store distinct numbers for each type. It is used in the body of the auto-generated callback invokers (C code). The Callback Invocation Body Example: The body for a signature of type "dpdf)p" at case id 19 is: void f19(void* addr) { Result.p = ((CONFIG_API p(*)(d,p,d,f))addr)(ValueMatrix[0].d,ValueMatrix[1].p,ValueMatrix[2].d,ValueMatrix[3].f); } ^^^^^^^^^^- calling convention ^^^^^^^^^^^^^- signature ^- return type signature ^- arg signature char 0 (later expected) value Result (type DCValue) and ValueMatrix (type DCValueSet[MAXARGS]) are globals. The ValueMatrix is initialized once from main.c for all cominations of types and argument position. See env.* files for details. Reference argument and result value The value is generated by a pure function GetReferenceValue and GetReferenceResult (file env.c). They have formals position and type and are pure without any side-effects (means the function value does only relay on the input arguments - if called with same arguments it will reveal the same value. It defined in env.c. Tssting for exotic calling conventions on Windows: Specify 'api' and 'ccprefix' accordingly: "__stdcall" "_s" "__fastcall" "_f" for gcc compiler "_F" for microsoft compiler MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_config.h0000644000175000017500000000010712456307246024006 0ustar jnthnjnthn#define CONFIG_NSIGS 400 #define CONFIG_MAXARGS 29 #define CONFIG_API MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_invoke_macros.h0000644000175000017500000002177412456307246025415 0ustar jnthnjnthn#define F0(ID,R) void ID(void* addr) { Result.R = ((CONFIG_API R(*)())addr)();} #define F1(ID,R,A0) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0))addr)(A[0].A0);} #define F2(ID,R,A0,A1) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1))addr)(A[0].A0,A[1].A1);} #define F3(ID,R,A0,A1,A2) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2))addr)(A[0].A0,A[1].A1,A[2].A2);} #define F4(ID,R,A0,A1,A2,A3) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3);} #define F5(ID,R,A0,A1,A2,A3,A4) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4);} #define F6(ID,R,A0,A1,A2,A3,A4,A5) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5);} #define F7(ID,R,A0,A1,A2,A3,A4,A5,A6) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6);} #define F8(ID,R,A0,A1,A2,A3,A4,A5,A6,A7) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7);} #define F9(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8);} #define F10(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9);} #define F11(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10);} #define F12(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11);} #define F13(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12);} #define F14(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13);} #define F15(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14);} #define F16(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15);} #define F17(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16);} #define F18(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17);} #define F19(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18);} #define F20(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19);} #define F21(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20);} #define F22(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21);} #define F23(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22);} #define F24(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23);} #define F25(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23,A[24].A24);} #define F26(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23,A[24].A24,A[25].A25);} #define F27(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23,A[24].A24,A[25].A25,A[26].A26);} #define F28(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23,A[24].A24,A[25].A25,A[26].A26,A[27].A27);} #define F29(ID,R,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28) void ID(void* addr) { Result.R = ((CONFIG_API R(*)(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28))addr)(A[0].A0,A[1].A1,A[2].A2,A[3].A3,A[4].A4,A[5].A5,A[6].A6,A[7].A7,A[8].A8,A[9].A9,A[10].A10,A[11].A11,A[12].A12,A[13].A13,A[14].A14,A[15].A15,A[16].A16,A[17].A17,A[18].A18,A[19].A19,A[20].A20,A[21].A21,A[22].A22,A[23].A23,A[24].A24,A[25].A25,A[26].A26,A[27].A27,A[28].A28);} MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_invoke_table.h0000644000175000017500000000520412456307246025206 0ustar jnthnjnthn&f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &f18, &f19, &f20, &f21, &f22, &f23, &f24, &f25, &f26, &f27, &f28, &f29, &f30, &f31, &f32, &f33, &f34, &f35, &f36, &f37, &f38, &f39, &f40, &f41, &f42, &f43, &f44, &f45, &f46, &f47, &f48, &f49, &f50, &f51, &f52, &f53, &f54, &f55, &f56, &f57, &f58, &f59, &f60, &f61, &f62, &f63, &f64, &f65, &f66, &f67, &f68, &f69, &f70, &f71, &f72, &f73, &f74, &f75, &f76, &f77, &f78, &f79, &f80, &f81, &f82, &f83, &f84, &f85, &f86, &f87, &f88, &f89, &f90, &f91, &f92, &f93, &f94, &f95, &f96, &f97, &f98, &f99, &f100, &f101, &f102, &f103, &f104, &f105, &f106, &f107, &f108, &f109, &f110, &f111, &f112, &f113, &f114, &f115, &f116, &f117, &f118, &f119, &f120, &f121, &f122, &f123, &f124, &f125, &f126, &f127, &f128, &f129, &f130, &f131, &f132, &f133, &f134, &f135, &f136, &f137, &f138, &f139, &f140, &f141, &f142, &f143, &f144, &f145, &f146, &f147, &f148, &f149, &f150, &f151, &f152, &f153, &f154, &f155, &f156, &f157, &f158, &f159, &f160, &f161, &f162, &f163, &f164, &f165, &f166, &f167, &f168, &f169, &f170, &f171, &f172, &f173, &f174, &f175, &f176, &f177, &f178, &f179, &f180, &f181, &f182, &f183, &f184, &f185, &f186, &f187, &f188, &f189, &f190, &f191, &f192, &f193, &f194, &f195, &f196, &f197, &f198, &f199, &f200, &f201, &f202, &f203, &f204, &f205, &f206, &f207, &f208, &f209, &f210, &f211, &f212, &f213, &f214, &f215, &f216, &f217, &f218, &f219, &f220, &f221, &f222, &f223, &f224, &f225, &f226, &f227, &f228, &f229, &f230, &f231, &f232, &f233, &f234, &f235, &f236, &f237, &f238, &f239, &f240, &f241, &f242, &f243, &f244, &f245, &f246, &f247, &f248, &f249, &f250, &f251, &f252, &f253, &f254, &f255, &f256, &f257, &f258, &f259, &f260, &f261, &f262, &f263, &f264, &f265, &f266, &f267, &f268, &f269, &f270, &f271, &f272, &f273, &f274, &f275, &f276, &f277, &f278, &f279, &f280, &f281, &f282, &f283, &f284, &f285, &f286, &f287, &f288, &f289, &f290, &f291, &f292, &f293, &f294, &f295, &f296, &f297, &f298, &f299, &f300, &f301, &f302, &f303, &f304, &f305, &f306, &f307, &f308, &f309, &f310, &f311, &f312, &f313, &f314, &f315, &f316, &f317, &f318, &f319, &f320, &f321, &f322, &f323, &f324, &f325, &f326, &f327, &f328, &f329, &f330, &f331, &f332, &f333, &f334, &f335, &f336, &f337, &f338, &f339, &f340, &f341, &f342, &f343, &f344, &f345, &f346, &f347, &f348, &f349, &f350, &f351, &f352, &f353, &f354, &f355, &f356, &f357, &f358, &f359, &f360, &f361, &f362, &f363, &f364, &f365, &f366, &f367, &f368, &f369, &f370, &f371, &f372, &f373, &f374, &f375, &f376, &f377, &f378, &f379, &f380, &f381, &f382, &f383, &f384, &f385, &f386, &f387, &f388, &f389, &f390, &f391, &f392, &f393, &f394, &f395, &f396, &f397, &f398, &f399, &f400, MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_invokers.h0000644000175000017500000003751212456307246024413 0ustar jnthnjnthnF25(f1,c,i,L,p,f,C,S,L,s,j,I,J,i,j,d,f,J,L,c,J,B,s,c,p,C,i) F3(f2,p,d,s,j) F18(f3,c,S,J,j,I,d,S,L,j,L,i,f,s,S,p,f,B,d,j) F5(f4,I,l,f,S,B,B) F1(f5,d,s) F27(f6,d,p,s,j,i,L,j,l,j,B,I,d,d,L,s,L,J,S,l,C,I,f,p,S,s,f,S,l) F17(f7,s,l,f,I,f,i,p,l,f,I,s,d,f,C,f,J,I,J) F23(f8,C,S,I,s,C,s,j,i,C,f,c,c,I,L,d,d,l,i,L,i,S,s,J,s) F21(f9,C,c,p,C,L,c,d,B,j,C,s,p,L,l,d,J,L,c,c,j,c,B) F13(f10,B,p,J,L,B,C,d,C,f,c,d,B,f,c) F27(f11,L,J,C,C,i,f,p,i,j,J,I,l,c,j,L,S,d,J,f,L,J,B,L,p,f,f,p,d) F27(f12,d,d,l,I,C,p,f,c,l,s,J,s,l,S,S,s,c,J,s,l,j,d,s,j,L,c,I,J) F13(f13,C,S,p,I,B,S,J,p,s,l,I,I,S,l) F18(f14,c,B,i,l,l,J,S,C,J,J,L,S,L,C,f,l,l,s,j) F7(f15,l,f,l,c,c,i,J,J) F8(f16,C,L,S,S,C,d,B,p,S) F13(f17,j,d,f,L,l,c,l,i,L,d,f,f,C,p) F8(f18,I,f,f,f,I,J,C,s,f) F13(f19,I,p,I,S,C,l,L,c,J,I,p,L,C,s) F3(f20,d,c,i,S) F27(f21,j,J,p,p,I,S,i,l,J,s,C,c,c,l,i,S,S,c,i,d,J,s,l,L,I,C,f,J) F6(f22,L,j,i,p,i,s,S) F19(f23,c,d,S,f,c,i,B,L,L,S,c,f,L,B,I,d,l,C,I,f) F2(f24,l,i,S) F24(f25,c,c,B,B,I,L,l,I,c,J,J,j,J,i,S,f,I,C,J,j,J,J,s,p,B) F27(f26,s,C,I,s,p,S,i,f,S,p,l,B,s,L,J,p,S,s,C,J,c,l,L,L,C,i,S,I) F11(f27,f,j,C,j,B,i,i,S,L,s,l,j) F20(f28,J,p,l,S,l,B,j,p,J,J,j,i,i,L,p,l,C,B,B,l,C) F21(f29,i,j,B,B,S,s,l,f,C,S,l,f,l,S,f,C,C,j,p,l,f,C) F21(f30,L,f,j,L,d,s,f,j,d,I,j,d,p,p,J,l,d,d,S,f,J,J) F23(f31,j,p,s,J,I,C,p,f,f,l,i,J,J,l,j,C,J,B,l,j,p,j,c,I) F1(f32,i,p) F19(f33,J,I,C,i,s,i,B,L,J,p,J,I,I,d,B,c,J,J,s,s) F27(f34,j,L,I,I,p,d,d,f,L,S,j,s,I,d,I,f,d,C,I,L,L,f,s,L,d,S,i,j) F18(f35,s,C,I,i,l,f,C,J,f,c,i,C,l,J,l,J,B,j,j) F0(f36,S) F0(f37,f) F18(f38,c,L,f,d,C,I,I,p,J,d,C,S,f,i,f,L,I,s,d) F25(f39,s,J,L,f,C,s,C,C,J,C,c,s,d,B,C,c,I,l,f,c,J,B,i,I,I,S) F27(f40,C,j,C,B,I,p,L,S,d,B,j,C,l,l,S,f,l,S,B,L,p,l,l,f,S,L,S,p) F17(f41,p,B,c,C,s,c,J,B,f,d,B,f,I,s,J,C,J,I) F27(f42,J,j,J,L,s,s,J,j,B,d,S,C,j,i,S,l,l,I,s,l,S,s,L,s,l,B,p,p) F9(f43,j,l,j,p,s,s,c,j,f,J) F24(f44,f,d,L,S,i,B,B,B,I,S,l,p,j,I,c,C,I,f,B,c,s,l,J,c,d) F4(f45,J,I,L,L,B) F22(f46,l,L,f,c,p,d,c,s,s,p,c,L,s,C,d,L,c,d,p,S,l,I,I) F9(f47,C,J,c,c,i,c,l,c,f,J) F20(f48,l,j,S,d,L,c,B,j,i,C,I,C,S,I,B,l,c,I,c,L,p) F27(f49,L,f,B,B,j,C,f,c,i,J,J,l,j,i,p,J,f,s,p,i,i,c,p,i,L,d,p,p) F19(f50,c,j,J,j,J,l,B,L,J,c,C,C,L,p,L,C,l,S,c,f) F14(f51,s,s,C,S,l,d,s,j,L,d,c,S,j,l,f) F20(f52,f,J,p,p,L,B,J,J,L,L,s,c,f,C,C,i,I,i,l,c,S) F18(f53,J,c,p,L,i,i,i,s,J,B,f,I,f,l,I,I,S,s,s) F9(f54,B,c,L,I,I,C,f,c,S,C) F27(f55,J,S,p,l,l,C,B,d,L,c,f,C,d,j,l,I,p,f,l,i,C,p,C,l,S,S,j,I) F21(f56,C,I,j,B,s,C,l,I,s,l,s,S,j,i,S,B,c,p,f,d,j,s) F10(f57,c,I,p,l,p,i,c,i,c,J,d) F26(f58,j,C,p,S,i,I,j,L,d,d,c,B,B,f,f,B,i,C,s,L,J,c,I,i,I,J,p) F6(f59,i,p,l,B,d,I,i) F27(f60,I,f,c,f,f,C,f,d,c,p,d,j,B,C,S,J,s,L,B,L,S,f,s,j,l,d,J,J) F0(f61,d) F10(f62,f,f,c,s,p,S,C,L,i,B,l) F0(f63,f) F5(f64,s,J,C,f,l,f) F16(f65,f,C,p,s,c,I,f,j,I,p,f,i,d,C,C,s,i) F18(f66,S,i,J,j,i,j,l,B,l,J,l,j,f,s,l,L,I,p,C) F10(f67,B,J,C,s,B,c,i,C,i,L,c) F4(f68,s,L,j,j,s) F16(f69,S,f,p,s,i,L,I,c,I,d,f,J,s,s,s,I,I) F17(f70,S,f,j,d,l,l,d,p,i,j,S,J,L,f,j,J,c,d) F17(f71,L,B,p,j,f,i,L,c,l,s,J,B,p,I,j,p,c,C) F27(f72,d,j,S,s,C,B,c,L,J,C,l,d,p,L,L,S,l,C,c,L,f,S,i,f,c,p,i,d) F16(f73,J,l,f,c,B,C,S,B,s,B,l,I,l,J,s,I,S) F2(f74,f,I,l) F9(f75,L,d,s,C,c,c,J,B,c,c) F29(f76,S,s,L,C,j,p,i,J,I,f,S,B,C,L,S,L,p,p,i,l,C,i,d,S,j,B,f,j,c,B) F3(f77,f,S,c,s) F27(f78,L,l,I,S,j,p,i,L,j,L,I,i,j,p,B,l,s,B,B,L,B,d,S,C,B,J,s,i) F16(f79,i,s,l,C,L,B,L,j,i,I,c,c,f,I,l,L,j) F29(f80,l,j,I,L,J,i,B,L,I,l,B,p,i,j,B,B,L,p,B,j,S,I,B,i,j,d,f,s,L,i) F21(f81,C,d,c,i,j,I,I,s,d,c,S,L,I,f,p,j,J,J,j,C,f,d) F10(f82,d,j,C,C,p,f,J,I,j,j,j) F1(f83,I,B) F9(f84,c,d,j,J,L,d,I,j,j,c) F1(f85,B,s) F0(f86,I) F11(f87,p,j,J,J,S,I,s,p,B,L,S,B) F10(f88,S,I,C,S,d,L,B,d,s,J,I) F21(f89,s,j,J,L,j,c,C,c,L,L,I,C,d,s,s,L,J,S,j,d,p,l) F23(f90,p,I,S,L,l,f,s,B,J,p,J,i,i,L,j,j,I,s,d,l,s,s,d,d) F7(f91,i,I,L,B,C,B,p,J) F18(f92,p,S,s,f,S,f,L,d,s,c,l,L,J,C,B,J,p,s,p) F5(f93,p,J,B,l,i,c) F13(f94,L,d,I,p,J,L,c,I,c,B,C,B,s,S) F0(f95,d) F27(f96,B,B,j,L,s,S,j,I,d,J,c,i,l,f,p,J,i,l,C,C,p,l,s,p,f,s,c,s) F3(f97,l,C,f,C) F19(f98,I,i,d,C,f,d,L,d,S,I,f,C,B,s,f,s,i,l,d,l) F24(f99,C,f,J,B,f,l,C,p,f,p,I,S,p,l,C,L,i,c,c,p,d,S,f,s,C) F20(f100,j,p,c,S,S,d,s,f,d,C,J,C,d,I,B,I,L,p,c,f,J) F29(f101,J,L,S,d,B,s,s,C,i,f,B,j,s,S,I,I,s,I,J,p,J,J,S,J,B,B,I,c,d,c) F27(f102,p,p,d,f,f,s,C,c,l,B,c,s,s,I,l,L,l,c,S,j,L,f,p,S,d,f,p,c) F26(f103,s,L,L,L,L,l,J,d,p,l,l,p,p,f,c,S,J,p,B,l,C,j,i,c,i,L,c) F15(f104,C,C,c,i,f,p,C,J,I,L,J,S,I,S,c,s) F7(f105,f,J,L,c,J,I,S,c) F11(f106,C,j,J,I,p,c,l,f,j,j,L,l) F7(f107,S,I,p,j,f,c,l,C) F28(f108,d,L,c,B,S,j,S,I,i,L,B,B,C,p,C,p,L,l,i,j,i,J,L,p,i,S,L,j,B) F25(f109,L,d,l,d,B,B,I,S,j,f,B,j,d,s,i,c,c,C,L,j,l,C,c,I,d,j) F21(f110,B,B,p,l,f,L,i,p,L,I,S,c,d,s,C,j,C,i,d,s,j,c) F1(f111,C,p) F5(f112,L,s,C,l,B,f) F25(f113,L,j,J,J,d,I,i,i,L,I,i,B,J,d,C,B,d,i,J,B,I,l,f,J,p,C) F15(f114,c,C,l,s,B,s,p,l,C,S,B,J,B,I,d,c) F28(f115,s,s,C,f,l,L,d,c,i,p,L,s,d,j,L,C,C,d,s,I,p,f,l,c,f,s,C,i,s) F15(f116,B,C,j,l,c,C,i,B,S,p,f,B,B,f,J,L) F23(f117,J,L,S,s,j,C,f,l,c,c,p,j,i,c,B,j,J,L,J,L,C,l,c,d) F4(f118,j,B,I,L,p) F15(f119,S,j,p,L,c,B,J,p,c,L,l,l,c,L,L,l) F13(f120,j,S,c,J,d,C,J,j,S,J,B,B,i,j) F29(f121,f,S,S,c,i,f,f,I,l,J,C,L,S,f,I,l,S,L,L,f,L,d,I,s,S,c,S,S,j,p) F15(f122,i,C,C,J,j,c,j,B,p,c,C,J,I,B,B,c) F23(f123,L,f,S,I,p,p,L,c,f,B,I,I,f,i,d,B,J,J,j,L,c,j,j,s) F3(f124,p,l,p,c) F5(f125,S,f,l,I,i,j) F5(f126,c,l,C,s,C,J) F16(f127,B,J,C,C,C,L,f,S,s,i,j,B,j,s,p,l,c) F17(f128,I,p,I,d,S,p,C,d,d,i,C,J,j,l,C,L,f,i) F22(f129,I,l,L,C,s,L,l,j,j,S,J,j,f,i,B,f,L,f,B,l,p,I,p) F0(f130,j) F20(f131,s,L,i,B,s,C,L,d,S,d,l,d,I,s,S,c,p,C,j,f,c) F22(f132,j,c,d,J,j,L,c,J,S,L,S,L,p,j,d,J,j,s,j,C,s,B,I) F4(f133,f,S,L,J,C) F25(f134,j,d,d,p,j,j,J,l,c,f,I,I,l,s,B,J,p,j,f,i,L,c,I,s,l,j) F14(f135,I,C,L,S,B,L,S,p,S,f,i,d,d,S,i) F0(f136,l) F15(f137,s,l,j,c,j,f,p,l,S,c,i,f,l,f,c,i) F4(f138,i,C,j,B,I) F12(f139,p,i,i,L,L,f,L,i,i,I,f,j,d) F10(f140,s,l,c,I,B,B,c,d,c,j,C) F20(f141,j,L,s,c,C,l,j,J,I,s,I,s,l,f,l,j,i,l,i,L,S) F6(f142,I,i,j,S,S,l,p) F28(f143,p,j,C,s,l,i,d,C,d,i,i,i,J,c,S,S,l,l,d,B,I,s,j,l,J,c,d,f,L) F11(f144,S,L,i,J,d,B,d,f,C,f,S,J) F27(f145,L,L,J,s,i,S,C,i,p,i,d,I,B,c,I,f,p,s,S,J,l,f,j,l,p,I,f,L) F15(f146,p,B,l,s,l,f,J,B,c,B,f,I,B,S,j,c) F13(f147,f,d,c,L,j,L,J,c,I,I,j,S,s,S) F8(f148,f,d,c,d,f,L,B,d,p) F14(f149,s,p,s,d,d,c,i,f,C,C,I,f,p,j,S) F2(f150,i,l,j) F15(f151,c,p,i,l,p,S,i,p,s,C,L,L,B,B,l,d) F3(f152,S,f,S,S) F6(f153,f,c,p,j,i,f,s) F8(f154,s,L,l,l,i,I,d,p,S) F29(f155,d,c,d,B,C,l,B,s,p,f,j,c,C,L,C,d,S,j,f,j,I,C,s,c,p,l,J,L,I,d) F13(f156,l,B,d,I,C,J,I,I,i,i,B,I,j,p) F15(f157,I,c,s,i,J,l,j,f,p,i,j,i,C,B,i,C) F12(f158,s,c,d,J,L,I,c,c,p,c,J,S,f) F25(f159,d,d,I,s,J,C,p,j,d,s,c,i,i,c,L,J,J,C,l,j,L,i,B,p,j,p) F3(f160,B,C,f,i) F25(f161,c,f,S,I,B,c,d,d,i,c,i,L,C,c,S,p,s,B,S,B,I,i,f,d,C,f) F10(f162,S,L,I,i,J,S,l,B,S,p,B) F5(f163,s,C,l,d,S,p) F4(f164,L,c,S,j,C) F26(f165,d,B,L,B,f,p,i,l,s,p,s,J,I,S,d,s,i,S,I,j,B,i,f,p,l,B,f) F15(f166,s,B,L,i,c,I,I,B,S,f,l,J,l,d,C,c) F4(f167,c,i,J,I,f) F14(f168,I,s,d,S,d,d,s,d,j,S,l,f,i,C,i) F13(f169,B,s,C,B,f,c,s,B,S,i,I,f,p,i) F9(f170,s,l,B,J,J,B,p,j,j,c) F13(f171,j,j,i,p,B,f,c,C,f,B,s,c,c,J) F17(f172,I,j,S,d,j,l,J,j,s,s,J,c,L,c,s,B,j,L) F11(f173,C,L,S,I,d,s,j,C,i,J,p,f) F10(f174,L,s,c,f,f,L,I,C,d,B,s) F4(f175,C,I,L,l,s) F2(f176,j,B,j) F29(f177,s,L,B,C,c,l,d,d,p,S,s,d,s,c,L,l,S,l,L,j,I,f,B,C,J,S,i,l,S,f) F9(f178,d,J,S,I,L,d,I,L,L,p) F22(f179,I,B,c,I,L,i,C,I,d,J,S,B,p,f,S,C,j,l,c,L,d,L,B) F14(f180,J,B,d,C,L,p,C,j,p,s,d,j,J,c,d) F22(f181,l,S,J,j,s,f,L,L,J,p,j,j,j,J,B,B,J,B,s,i,p,i,f) F19(f182,J,f,C,S,B,C,f,p,I,I,S,l,S,B,I,f,f,B,I,i) F16(f183,S,i,s,J,l,l,i,B,J,B,l,I,s,d,j,i,p) F27(f184,s,s,l,J,J,L,c,j,J,c,B,d,L,j,i,d,c,B,l,j,c,s,J,L,L,p,L,S) F17(f185,l,J,C,f,S,L,I,B,p,B,J,d,B,J,l,J,B,l) F1(f186,s,S) F4(f187,l,J,p,f,S) F19(f188,f,J,f,s,s,B,c,J,p,J,J,J,J,s,j,J,p,s,C,p) F26(f189,p,f,s,c,B,p,d,f,C,J,J,p,j,p,c,J,d,l,i,j,S,B,c,j,J,L,S) F27(f190,J,c,L,p,d,d,d,d,p,f,f,d,j,I,L,c,S,p,l,s,j,B,L,p,B,f,S,l) F18(f191,I,I,I,L,C,S,L,C,s,l,d,C,J,f,L,c,l,p,i) F14(f192,f,l,B,j,i,p,J,s,c,s,p,L,L,S,j) F19(f193,f,s,B,f,f,d,B,j,f,L,J,j,J,B,B,B,l,B,J,B) F5(f194,c,S,d,i,C,L) F15(f195,j,s,B,c,j,c,B,i,c,c,d,d,f,j,j,I) F16(f196,i,j,s,J,c,S,I,s,J,I,l,p,C,p,S,I,p) F29(f197,c,d,I,i,B,j,i,B,i,f,j,p,I,c,i,l,l,I,B,c,l,J,J,i,i,p,C,l,s,B) F7(f198,I,d,j,l,B,c,B,B) F28(f199,I,J,S,I,l,l,c,i,C,C,j,p,L,c,s,C,f,i,f,c,I,d,i,I,j,B,I,J,c) F3(f200,I,B,c,I) F22(f201,l,C,J,c,S,L,l,C,j,L,i,l,J,p,j,L,S,j,c,L,B,C,C) F9(f202,J,l,p,S,L,s,p,I,I,I) F22(f203,S,C,s,d,L,d,S,i,J,C,d,S,I,I,I,C,j,l,S,s,d,d,B) F21(f204,J,S,C,C,L,J,p,j,L,B,I,I,B,p,f,l,d,p,d,i,S,I) F25(f205,i,c,d,c,c,d,c,i,J,i,j,p,C,c,J,l,f,l,c,i,L,f,S,i,f,C) F8(f206,p,I,p,f,S,d,f,i,B) F15(f207,L,I,I,d,d,s,c,c,f,L,B,J,f,I,S,p) F22(f208,I,l,d,C,d,i,d,f,L,f,L,C,d,j,l,i,d,J,i,s,L,j,C) F17(f209,c,L,i,B,c,C,p,p,f,L,d,p,C,d,L,f,f,I) F25(f210,l,B,L,s,B,i,l,s,c,C,i,J,p,C,B,p,s,s,l,c,c,i,B,d,j,B) F14(f211,I,d,C,j,p,s,S,B,s,L,L,j,p,d,d) F21(f212,S,c,I,j,S,l,s,I,p,J,I,L,C,j,I,J,I,l,C,s,f,j) F3(f213,c,s,c,l) F0(f214,J) F16(f215,d,L,l,B,S,B,L,j,I,J,c,d,S,S,j,p,f) F13(f216,I,c,s,S,J,J,I,f,l,c,d,l,l,j) F11(f217,i,J,L,I,S,S,f,f,I,f,s,L) F2(f218,j,l,i) F23(f219,p,l,p,i,s,s,s,d,i,C,l,B,L,c,i,S,f,p,J,C,L,j,l,l) F12(f220,S,B,f,c,I,i,f,c,s,s,i,j,j) F27(f221,d,L,B,d,I,c,i,L,B,s,i,s,d,d,f,l,p,S,l,l,i,C,c,s,s,i,j,l) F1(f222,f,B) F24(f223,p,B,p,s,C,C,B,C,I,I,I,I,I,S,c,s,J,p,d,B,d,B,S,s,I) F27(f224,s,i,f,d,s,l,d,c,d,C,s,d,S,L,I,L,C,f,c,s,C,L,B,c,p,B,C,c) F18(f225,L,f,C,B,L,c,s,I,c,i,i,s,l,i,J,i,p,S,j) F14(f226,L,L,d,s,p,B,B,p,s,c,c,p,d,s,f) F11(f227,l,C,C,I,j,J,L,C,d,S,j,p) F1(f228,c,J) F25(f229,L,j,S,l,j,i,j,L,I,J,J,I,f,I,C,S,l,i,p,C,d,j,S,d,p,p) F13(f230,p,f,i,j,L,f,f,I,I,s,d,s,L,J) F5(f231,p,j,S,i,p,d) F19(f232,i,C,L,C,I,L,d,S,I,i,s,p,d,d,L,f,i,C,C,i) F26(f233,B,d,s,c,j,j,I,i,j,s,B,L,B,C,C,L,c,j,s,j,L,c,j,L,p,I,C) F18(f234,L,J,i,j,J,J,J,c,C,B,I,L,s,I,I,S,J,l,B) F6(f235,s,S,S,d,i,p,L) F8(f236,d,d,s,f,j,l,i,c,S) F6(f237,L,I,B,l,s,s,c) F17(f238,I,L,I,l,j,l,d,p,l,S,l,i,j,d,i,p,p,d) F7(f239,j,B,L,s,S,s,s,d) F15(f240,p,c,s,c,f,l,L,i,S,l,s,d,B,f,i,J) F23(f241,l,i,l,L,p,d,p,J,C,c,p,i,c,S,f,C,J,d,B,s,L,I,J,i) F17(f242,I,I,J,B,B,i,p,i,c,j,s,c,S,p,s,i,l,l) F29(f243,j,j,l,J,j,L,p,S,C,I,l,f,B,c,I,B,C,f,p,j,B,i,p,c,l,l,i,c,S,B) F9(f244,c,J,s,f,c,d,L,i,C,C) F0(f245,s) F7(f246,j,I,S,i,S,C,d,i) F23(f247,I,I,C,I,p,s,L,f,p,B,I,B,d,J,B,l,B,C,f,C,C,C,i,l) F24(f248,L,B,J,p,i,c,J,p,S,B,l,J,L,j,I,p,d,I,p,J,I,I,J,l,i) F24(f249,C,j,C,I,B,d,j,l,L,f,p,i,L,c,i,i,L,c,d,C,d,d,l,L,j) F7(f250,c,c,p,l,f,J,s,B) F7(f251,s,B,l,f,p,j,l,C) F24(f252,J,j,l,j,J,l,L,J,l,i,S,C,j,J,S,i,s,C,B,I,s,C,L,s,p) F0(f253,S) F8(f254,i,C,J,c,l,S,l,S,B) F27(f255,c,l,L,S,p,S,f,C,l,C,i,l,J,J,p,S,f,l,d,f,d,s,c,J,S,L,f,B) F28(f256,d,i,B,J,C,S,I,I,C,J,C,i,B,f,d,J,L,S,I,i,S,i,i,j,I,d,f,s,f) F9(f257,I,p,S,S,i,I,l,f,d,f) F3(f258,s,s,I,d) F3(f259,c,L,J,J) F26(f260,p,d,I,I,I,I,i,l,S,S,d,C,J,S,J,c,d,I,B,f,f,c,c,i,c,S,I) F26(f261,f,c,d,L,B,I,s,I,f,J,C,s,d,c,i,j,I,d,l,i,i,l,s,S,L,i,l) F20(f262,i,C,L,J,s,l,i,S,C,J,p,B,s,d,s,C,c,l,L,j,J) F28(f263,f,d,B,s,s,p,J,d,l,S,C,I,f,I,C,s,L,S,f,J,i,c,j,l,S,J,S,c,C) F14(f264,l,c,f,j,S,C,i,d,c,c,s,S,j,C,L) F12(f265,I,I,B,S,c,i,I,J,B,p,s,S,f) F7(f266,p,i,j,C,d,f,S,S) F13(f267,I,i,c,L,d,s,I,l,l,d,l,d,B,c) F20(f268,B,c,s,d,I,c,i,L,I,d,f,i,f,s,L,l,l,C,p,I,c) F27(f269,C,L,l,f,I,l,d,j,c,J,l,S,J,C,I,B,f,d,d,p,i,p,B,c,j,L,s,S) F10(f270,j,S,c,c,B,d,J,L,f,c,p) F24(f271,I,C,c,d,l,c,f,J,c,l,d,f,L,c,I,I,S,L,l,l,c,p,p,C,L) F27(f272,B,l,j,L,s,i,d,S,S,l,I,s,S,j,f,s,I,l,i,d,C,L,L,p,I,p,J,s) F11(f273,c,l,d,c,s,L,S,l,l,l,d,i) F6(f274,S,l,l,c,d,C,p) F3(f275,L,d,B,p) F14(f276,i,l,i,L,L,L,I,l,f,L,i,C,i,c,p) F13(f277,s,d,J,c,l,L,B,f,j,S,d,I,i,p) F25(f278,p,j,J,J,s,i,B,f,s,L,s,I,c,S,S,I,p,S,c,f,d,p,f,p,S,s) F23(f279,s,J,l,B,I,C,J,B,i,B,c,S,s,p,J,L,d,f,B,I,L,S,J,J) F11(f280,C,j,c,L,p,d,j,i,l,j,f,p) F28(f281,i,s,s,B,j,I,f,c,C,f,B,s,i,L,j,d,i,L,S,f,f,c,l,f,J,c,j,C,B) F10(f282,S,d,J,j,B,C,B,d,s,s,p) F14(f283,c,s,c,d,C,I,L,j,i,l,J,c,j,C,s) F10(f284,j,S,I,l,s,B,s,S,s,S,s) F16(f285,s,c,p,B,S,d,B,I,I,p,B,f,I,J,B,B,p) F4(f286,p,C,j,J,p) F20(f287,I,c,c,f,i,i,i,d,I,s,d,p,C,B,S,J,p,S,I,s,f) F9(f288,p,L,L,I,f,S,c,l,C,L) F9(f289,I,l,C,L,B,c,C,s,c,B) F3(f290,J,S,B,f) F16(f291,L,C,j,B,j,s,p,d,c,C,B,p,S,p,J,l,I) F11(f292,j,j,f,J,L,B,J,s,c,f,S,B) F25(f293,J,C,B,f,l,S,L,l,i,f,L,s,C,J,p,f,B,J,s,j,j,p,S,j,i,J) F8(f294,C,f,J,p,L,p,p,J,j) F10(f295,s,s,j,s,B,p,I,J,J,S,l) F15(f296,i,C,L,S,j,S,l,C,d,d,B,j,L,L,i,J) F27(f297,d,L,L,C,S,B,C,c,I,L,L,L,i,B,s,J,p,j,C,c,s,S,B,s,S,J,B,c) F19(f298,C,j,f,i,S,B,L,S,s,f,L,d,J,I,i,l,L,d,I,s) F16(f299,C,j,I,j,L,p,C,L,d,c,i,j,B,p,p,c,j) F9(f300,C,I,f,s,B,i,l,L,c,l) F11(f301,p,p,l,f,S,s,l,C,i,I,C,j) F20(f302,S,j,l,j,J,s,l,d,l,J,C,L,d,f,I,c,j,J,I,S,S) F19(f303,j,j,B,p,d,I,d,I,S,J,B,d,C,J,C,p,j,p,i,L) F10(f304,i,l,d,I,C,j,f,j,f,s,C) F7(f305,p,d,S,l,d,p,B,J) F29(f306,S,L,I,C,j,B,d,d,p,j,S,I,j,L,J,B,J,c,d,p,S,S,c,S,l,p,s,I,p,f) F23(f307,d,J,L,d,C,p,f,c,J,I,i,c,d,C,l,B,p,p,d,l,C,s,L,I) F17(f308,i,l,I,i,j,L,C,C,j,c,S,i,B,I,d,I,f,c) F1(f309,i,p) F25(f310,p,J,i,j,L,J,s,C,J,p,f,B,C,I,p,i,l,i,I,d,L,j,I,L,d,S) F12(f311,p,i,J,p,s,s,C,L,d,p,B,C,I) F3(f312,S,I,B,J) F12(f313,i,s,l,f,s,i,I,l,c,I,B,d,p) F15(f314,f,l,l,L,f,i,L,L,i,d,C,s,B,J,s,l) F20(f315,J,f,J,J,C,d,B,p,c,I,p,B,S,s,j,d,f,S,f,S,B) F22(f316,j,B,L,d,c,i,s,L,S,d,l,f,j,p,p,J,J,d,B,I,d,i,L) F11(f317,d,l,p,s,B,f,p,L,f,j,L,d) F29(f318,I,l,s,d,S,c,I,C,d,c,L,f,C,s,p,j,d,i,f,l,s,C,l,c,B,i,B,j,C,d) F4(f319,p,l,L,B,B) F16(f320,C,C,L,J,d,J,L,C,I,S,C,p,s,p,B,i,j) F11(f321,d,d,C,d,c,c,I,s,p,C,S,p) F25(f322,d,d,l,I,f,S,s,c,L,j,s,J,L,c,l,C,J,f,j,j,B,I,l,C,d,f) F3(f323,B,C,p,c) F23(f324,f,p,j,l,c,L,p,f,S,c,j,B,C,s,s,p,c,L,i,c,s,B,S,C) F8(f325,J,S,c,c,i,c,f,C,l) F10(f326,j,i,i,s,l,I,L,L,l,d,d) F1(f327,f,L) F5(f328,L,d,f,I,C,p) F14(f329,I,f,f,f,B,L,c,l,S,I,c,L,l,p,s) F16(f330,p,d,I,j,I,j,s,S,l,s,s,C,I,B,d,f,d) F24(f331,J,d,j,d,l,f,i,L,l,B,j,f,j,c,f,d,J,S,I,f,J,c,C,p,S) F25(f332,p,s,j,p,c,i,L,J,S,i,j,l,C,s,L,l,C,s,L,B,C,i,S,l,S,d) F14(f333,d,L,c,c,J,i,J,i,I,d,C,c,S,J,J) F23(f334,C,f,l,I,B,d,s,B,C,l,i,p,d,S,J,I,c,L,J,l,c,C,c,j) F8(f335,C,J,I,f,s,I,l,c,C) F4(f336,c,c,i,C,s) F17(f337,d,B,B,f,l,j,d,i,c,l,I,S,L,d,j,B,J,B) F24(f338,j,I,l,d,J,p,c,l,s,s,d,S,p,B,i,L,l,d,l,c,B,S,j,i,c) F26(f339,d,C,C,f,C,d,i,p,f,d,l,d,l,d,s,J,s,c,J,l,p,S,J,j,i,l,f) F1(f340,j,B) F28(f341,S,s,l,f,i,l,s,s,J,C,d,J,p,f,f,I,C,B,B,p,p,i,I,i,p,C,S,p,C) F10(f342,C,C,J,B,B,d,L,s,s,i,I) F29(f343,L,s,B,f,L,C,f,p,B,L,C,j,c,d,l,I,L,f,p,c,B,i,C,c,S,f,S,j,s,p) F7(f344,d,B,L,c,p,d,B,J) F22(f345,S,L,I,f,L,C,S,j,B,c,J,c,I,L,C,p,l,I,i,f,s,c,C) F25(f346,L,S,C,p,S,L,p,B,I,S,f,s,I,s,L,I,S,i,j,p,C,L,J,p,s,d) F14(f347,I,c,d,p,d,s,d,L,j,L,j,j,C,f,I) F10(f348,J,l,s,p,B,J,i,p,L,c,I) F9(f349,s,I,i,p,j,S,l,I,j,l) F1(f350,L,i) F19(f351,I,J,l,c,B,d,p,s,p,f,f,C,L,l,S,C,S,J,J,l) F4(f352,p,d,c,J,j) F24(f353,l,j,C,J,C,L,s,S,p,s,C,c,B,B,d,s,L,l,j,f,d,C,j,J,l) F18(f354,I,p,S,c,J,c,l,L,l,f,j,d,C,i,C,S,I,s,i) F14(f355,S,c,c,B,B,c,s,j,L,f,s,S,l,j,I) F18(f356,B,c,c,S,d,J,S,C,d,I,j,I,L,d,f,C,B,B,s) F4(f357,p,I,J,f,i) F6(f358,I,c,i,l,i,d,L) F10(f359,I,L,c,J,d,c,c,j,j,p,I) F0(f360,j) F16(f361,L,s,J,l,L,C,J,c,B,p,C,i,I,j,i,s,B) F1(f362,i,c) F0(f363,s) F14(f364,I,j,L,S,B,s,i,j,p,J,c,j,S,S,c) F9(f365,L,d,J,L,I,C,c,l,s,f) F10(f366,f,s,L,J,L,S,i,c,S,J,I) F13(f367,I,c,d,d,I,s,c,f,J,B,j,S,I,L) F5(f368,l,d,S,d,S,J) F26(f369,c,S,B,s,I,S,f,f,s,S,d,C,S,i,I,i,S,B,I,p,i,d,j,p,C,I,C) F23(f370,s,p,p,l,C,p,f,J,C,p,I,i,c,I,J,I,f,B,p,C,c,S,d,I) F15(f371,j,S,i,B,j,j,p,S,S,I,I,C,i,B,S,C) F21(f372,I,s,d,S,L,f,S,j,B,I,f,B,d,C,j,S,J,j,p,c,S,C) F23(f373,j,l,J,c,L,f,S,S,J,j,S,f,s,C,s,p,C,L,L,C,l,f,L,d) F8(f374,j,p,J,J,B,B,i,l,J) F13(f375,S,j,p,L,C,i,B,c,l,s,S,j,i,c) F18(f376,j,L,C,S,L,l,J,J,S,s,J,i,J,S,B,C,p,j,B) F21(f377,j,i,J,p,c,p,C,J,s,s,f,p,d,c,C,L,p,p,S,c,B,d) F20(f378,B,s,j,p,c,c,p,J,p,s,s,J,S,B,L,d,s,d,f,c,d) F8(f379,p,L,p,c,c,d,c,B,j) F9(f380,J,B,l,i,C,j,B,d,L,s) F4(f381,S,S,S,c,J) F1(f382,S,l) F2(f383,d,d,c) F2(f384,s,C,d) F6(f385,l,I,B,j,I,L,d) F7(f386,j,d,J,B,s,C,C,j) F8(f387,i,c,f,S,L,s,i,L,S) F25(f388,I,j,S,c,L,L,c,S,s,p,s,f,c,C,j,c,i,L,s,d,S,j,B,C,f,p) F9(f389,l,J,p,l,I,S,B,j,c,L) F11(f390,C,B,j,J,f,J,p,I,L,s,C,d) F13(f391,J,j,s,l,I,B,c,p,J,d,I,c,S,I) F11(f392,I,s,S,L,s,p,i,C,I,s,J,C) F24(f393,l,C,l,s,l,f,d,C,d,B,d,J,B,I,l,S,d,S,l,C,J,I,I,i,p) F24(f394,s,c,s,d,j,c,c,s,S,p,C,S,B,c,S,d,L,i,i,i,l,S,l,S,j) F24(f395,B,d,l,l,J,I,L,f,I,S,B,J,j,i,I,L,l,I,p,B,i,J,i,p,d) F4(f396,C,l,i,l,d) F20(f397,J,J,p,S,c,j,s,j,p,s,C,i,J,J,c,s,c,d,s,I,j) F9(f398,L,j,l,I,C,B,C,C,C,f) F0(f399,C) F25(f400,S,J,I,I,i,l,J,p,S,s,f,j,S,f,p,p,i,I,c,f,c,J,c,c,L,s) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_signatures.txt0000644000175000017500000001555412456307246025331 0ustar jnthnjnthniLpfCSLsjIJijdfJLcJBscpCi)c dsj)p SJjIdSLjLifsSpfBdj)c lfSBB)I s)d psjiLjljBIddLsLJSlCIfpSsfSl)d lfIfiplfIsdfCfJIJ)s SIsCsjiCfccILddliLiSsJs)C cpCLcdBjCspLldJLccjcB)C pJLBCdCfcdBfc)B JCCifpijJIlcjLSdJfLJBLpffpd)L dlICpfclsJslSSscJsljdsjLcIJ)d SpIBSJpslIISl)C BillJSCJJLSLCfllsj)c flcciJJ)l LSSCdBpS)C dfLlcliLdffCp)j fffIJCsf)I pISClLcJIpLCs)I ciS)d JppISilJsCccliSScidJslLICfJ)j jipisS)L dSfciBLLScfLBIdlCIf)c iS)l cBBILlIcJJjJiSfICJjJJspB)c CIspSifSplBsLJpSsCJclLLCiSI)s jCjBiiSLslj)f plSlBjpJJjiiLplCBBlC)J jBBSslfCSlflSfCCjplfC)i fjLdsfjdIjdppJlddSfJJ)L psJICpffliJJljCJBljpjcI)j p)i ICisiBLJpJIIdBcJJss)J LIIpddfLSjsIdIfdCILLfsLdSij)j CIilfCJfciClJlJBjj)s )S )f LfdCIIpJdCSfifLIsd)c JLfCsCCJCcsdBCcIlfcJBiIIS)s jCBIpLSdBjCllSflSBLpllfSLSp)C BcCscJBfdBfIsJCJI)p jJLssJjBdSCjiSllIslSsLslBpp)J ljpsscjfJ)j dLSiBBBISlpjIcCIfBcslJcd)f ILLB)J LfcpdcsspcLsCdLcdpSlII)l JcciclcfJ)C jSdLcBjiCICSIBlcIcLp)l fBBjCfciJJljipJfspiicpiLdpp)L jJjJlBLJcCCLpLClScf)c sCSldsjLdcSjlf)s JppLBJJLLscfCCiIilcS)f cpLiiisJBfIflIISss)J cLIICfcSC)B SpllCBdLcfCdjlIpfliCpClSSjI)J IjBsClIslsSjiSBcpfdjs)C IplpicicJd)c CpSiIjLddcBBffBiCsLJcIiIJp)j plBdIi)i fcffCfdcpdjBCSJsLBLSfsjldJJ)I )d fcspSCLiBl)f )f JCflf)s CpscIfjIpfidCCsi)f iJjijlBlJljfslLIpC)S JCsBciCiLc)B Ljjs)s fpsiLIcIdfJsssII)S fjdlldpijSJLfjJcd)S BpjfiLclsJBpIjpcC)L jSsCBcLJCldpLLSlCcLfSifcpid)d lfcBCSBsBlIlJsIS)J Il)f dsCccJBcc)L sLCjpiJIfSBCLSLppilCidSjBfjcB)S Scs)f lISjpiLjLIijpBlsBBLBdSCBJsi)L slCLBLjiIccfIlLj)i jILJiBLIlBpijBBLpBjSIBijdfsLi)l dcijIIsdcSLIfpjJJjCfd)C jCCpfJIjjj)d B)I djJLdIjjc)c s)B )I jJJSIspBLSB)p ICSdLBdsJI)S jJLjcCcLLICdssLJSjdpl)s ISLlfsBJpJiiLjjIsdlssdd)p ILBCBpJ)i SsfSfLdsclLJCBJpsp)p JBlic)p dIpJLcIcBCBsS)L )d BjLsSjIdJcilfpJilCCplspfscs)B CfC)l idCfdLdSIfCBsfsildl)I fJBflCpfpISplCLiccpdSfsC)C pcSSdsfdCJCdIBILpcfJ)j LSdBssCifBjsSIIsIJpJJSJBBIcdc)J pdffsCclBcssIlLlcSjLfpSdfpc)p LLLLlJdpllppfcSJpBlCjiciLc)s CcifpCJILJSIScs)C JLcJISc)f jJIpclfjjLl)C IpjfclC)S LcBSjSIiLBBCpCpLlijiJLpiSLjB)d dldBBISjfBjdsiccCLjlCcIdj)L BplfLipLIScdsCjCidsjc)B p)C sClBf)L jJJdIiiLIiBJdCBdiJBIlfJpC)L ClsBsplCSBJBIdc)c sCflLdcipLsdjLCCdsIpflcfsCis)s CjlcCiBSpfBBfJL)B LSsjCflccpjicBjJLJLClcd)J BILp)j jpLcBJpcLllcLLl)S ScJdCJjSJBBij)j SSciffIlJCLSfIlSLLfLdIsScSSjp)f CCJjcjBpcCJIBBc)i fSIppLcfBIIfidBJJjLcjjs)L lpc)p flIij)S lCsCJ)c JCCCLfSsijBjsplc)B pIdSpCddiCJjlCLfi)I lLCsLljjSJjfiBfLfBlpIp)I )j LiBsCLdSdldIsScpCjfc)s cdJjLcJSLSLpjdJjsjCsBI)j SLJC)f ddpjjJlcfIIlsBJpjfiLcIslj)j CLSBLSpSfiddSi)I )l ljcjfplSciflfci)s CjBI)i iiLLfLiiIfjd)p lcIBBcdcjC)s LscCljJIsIslfljiliLS)j ijSSlp)I jCslidCdiiiJcSSlldBIsjlJcdfL)p LiJdBdfCfSJ)S LJsiSCipidIBcIfpsSJlfjlpIfL)L BlslfJBcBfIBSjc)p dcLjLJcIIjSsS)f dcdfLBdp)f psddcifCCIfpjS)s lj)i pilpSipsCLLBBld)c fSS)S cpjifs)f LlliIdpS)s cdBClBspfjcCLCdSjfjICscplJLId)d BdICJIIiiBIjp)l csiJljfpijiCBiC)I cdJLIccpcJSf)s dIsJCpjdsciicLJJCljLiBpjp)d Cfi)B fSIBcddiciLCcSpsBSBIifdCf)c LIiJSlBSpB)S CldSp)s cSjC)L BLBfpilspsJISdsiSIjBifplBf)d BLicIIBSflJldCc)s iJIf)c sdSddsdjSlfiCi)I sCBfcsBSiIfpi)B lBJJBpjjc)s jipBfcCfBsccJ)j jSdjlJjssJcLcsBjL)I LSIdsjCiJpf)C scffLICdBs)L ILls)C Bj)j LBCclddpSsdscLlSlLjIfBCJSilSf)s JSILdILLp)d BcILiCIdJSBpfSCjlcLdLB)I BdCLpCjpsdjJcd)J SJjsfLLJpjjjJBBJBsipif)l fCSBCfpIISlSBIffBIi)J isJlliBJBlIsdjip)S slJJLcjJcBdLjidcBljcsJLLpLS)s JCfSLIBpBJdBJlJBl)l S)s JpfS)l JfssBcJpJJJJsjJpsCp)f fscBpdfCJJpjpcJdlijSBcjJLS)p cLpddddpffdjILcSplsjBLpBfSl)J IILCSLCsldCJfLclpi)I lBjipJscspLLSj)f sBffdBjfLJjJBBBlBJB)f SdiCL)c sBcjcBiccddfjjI)j jsJcSIsJIlpCpSIp)i dIiBjiBifjpIcillIBclJJiipClsB)c djlBcBB)I JSIllciCCjpLcsCfifcIdiIjBIJc)I BcI)I CJcSLlCjLilJpjLSjcLBCC)l lpSLspIII)J CsdLdSiJCdSIIICjlSsddB)S SCCLJpjLBIIBpfldpdiSI)J cdccdciJijpCcJlflciLfSifC)i IpfSdfiB)p IIddsccfLBJfISp)L ldCdidfLfLCdjlidJisLjC)I LiBcCppfLdpCdLffI)c BLsBilscCiJpCBpsslcciBdjB)l dCjpsSBsLLjpdd)I cIjSlsIpJILCjIJIlCsfj)S scl)c )J LlBSBLjIJcdSSjpf)d csSJJIflcdllj)I JLISSffIfsL)i li)j lpisssdiClBLciSfpJCLjll)p BfcIifcssijj)S LBdIciLBsisddflpSlliCcssijl)d B)f BpsCCBCIIIIIScsJpdBdBSsI)p ifdsldcdCsdSLILCfcsCLBcpBCc)s fCBLcsIciisliJipSj)L LdspBBpsccpdsf)L CCIjJLCdSjp)l J)c jSljijLIJJIfICSlipCdjSdpp)L fijLffIIsdsLJ)p jSipd)p CLCILdSIispddLfiCCi)i dscjjIijsBLBCCLcjsjLcjLpIC)B JijJJJcCBILsIISJlB)L SSdipL)s dsfjlicS)d IBlssc)L LIljldplSlijdippd)I BLsSssd)j cscflLiSlsdBfiJ)p ilLpdpJCcpicSfCJdBsLIJi)l IJBBipicjscSpsill)I jlJjLpSCIlfBcIBCfpjBipcllicSB)j JsfcdLiCC)c )s ISiSCdi)j ICIpsLfpBIBdJBlBCfCCCil)I BJpicJpSBlJLjIpdIpJIIJli)L jCIBdjlLfpiLciiLcdCddlLj)C cplfJsB)c BlfpjlC)s jljJlLJliSCjJSisCBIsCLsp)J )S CJclSlSB)i lLSpSfClCilJJpSfldfdscJSLfB)c iBJCSIICJCiBfdJLSIiSiijIdfsf)d pSSiIlfdf)I sId)s LJJ)c dIIIIilSSdCJSJcdIBffccicSI)p cdLBIsIfJCsdcijIdliilsSLil)f CLJsliSCJpBsdsCclLjJ)i dBsspJdlSCIfICsLSfJicjlSJScC)f cfjSCidccsSjCL)l IBSciIJBpsSf)I ijCdfSS)p icLdsIlldldBc)I csdIciLIdfifsLllCpIc)B LlfIldjcJlSJCIBfddpipBcjLsS)C SccBdJLfcp)j CcdlcfJcldfLcIISLllcppCL)I ljLsidSSlIsSjfsIlidCLLpIpJs)B ldcsLSllldi)c llcdCp)S dBp)L liLLLIlfLiCicp)i dJclLBfjSdIip)s jJJsiBfsLsIcSSIpScfdpfpSs)p JlBICJBiBcSspJLdfBILSJJ)s jcLpdjiljfp)C ssBjIfcCfBsiLjdiLSffclfJcjCB)i dJjBCBdssp)S scdCILjilJcjCs)c SIlsBsSsSs)j cpBSdBIIpBfIJBBp)s CjJp)p ccfiiidIsdpCBSJpSIsf)I LLIfSclCL)p lCLBcCscB)I SBf)J CjBjspdcCBpSpJlI)L jfJLBJscfSB)j CBflSLlifLsCJpfBJsjjpSjiJ)J fJpLppJj)C sjsBpIJJSl)s CLSjSlCddBjLLiJ)i LLCSBCcILLLiBsJpjCcsSBsSJBc)d jfiSBLSsfLdJIilLdIs)C jIjLpCLdcijBppcj)C IfsBilLcl)C plfSslCiICj)p jljJsldlJCLdfIcjJISS)S jBpdIdISJBdCJCpjpiL)j ldICjfjfsC)i dSldpBJ)p LICjBddpjSIjLJBJcdpSScSlpsIpf)S JLdCpfcJIicdClBppdlCsLI)d lIijLCCjcSiBIdIfc)i p)i JijLJsCJpfBCIpiliIdLjILdS)p iJpssCLdpBCI)p IBJ)S slfsiIlcIBdp)i llLfiLLidCsBJsl)f fJJCdBpcIpBSsjdfSfSB)J BLdcisLSdlfjppJJdBIdiL)j lpsBfpLfjLd)d lsdScICdcLfCspjdiflsClcBiBjCd)I lLBB)p CLJdJLCISCpspBij)C dCdccIspCSp)d dlIfSscLjsJLclCJfjjBIlCdf)d Cpc)B pjlcLpfScjBCsspcLicsBSC)f SccicfCl)J iislILLldd)j L)f dfICp)L fffBLclSIcLlps)I dIjIjsSlssCIBdfd)p djdlfiLlBjfjcfdJSIfJcCpS)J sjpciLJSijlCsLlCsLBCiSlSd)p LccJiJiIdCcSJJ)d flIBdsBClipdSJIcLJlcCcj)C JIfsIlcC)C ciCs)c BBfljdiclISLdjBJB)d IldJpclssdSpBiLldlcBSjic)j CCfCdipfdldldsJscJlpSJjilf)d B)j slfilssJCdJpffICBBppiIipCSpC)S CJBBdLssiI)C sBfLCfpBLCjcdlILfpcBiCcSfSjsp)L BLcpdBJ)d LIfLCSjBcJcILCplIifscC)S SCpSLpBISfsIsLISijpCLJpsd)L cdpdsdLjLjjCfI)I lspBJipLcI)J IipjSlIjl)s i)L JlcBdpspffCLlSCSJJl)I dcJj)p jCJCLsSpsCcBBdsLljfdCjJl)l pScJclLlfjdCiCSIsi)I ccBBcsjLfsSljI)S ccSdJSCdIjILdfCBBs)B IJfi)p cilidL)I LcJdccjjpI)I )j sJlLCJcBpCiIjisB)L c)i )s jLSBsijpJcjSSc)I dJLICclsf)L sLJLSicSJI)f cddIscfJBjSIL)I dSdSJ)l SBsISffsSdCSiIiSBIpidjpCIC)c pplCpfJCpIicIJIfBpCcSdI)s SiBjjpSSIICiBSC)j sdSLfSjBIfBdCjSJjpcSC)I lJcLfSSJjSfsCspCLLClfLd)j pJJBBilJ)j jpLCiBclsSjic)S LCSLlJJSsJiJSBCpjB)j iJpcpCJssfpdcCLppScBd)j sjpccpJpssJSBLdsdfcd)B LpccdcBj)p BliCjBdLs)J SScJ)S l)S dc)d Cd)s IBjILd)l dJBsCCj)j cfSLsiLS)i jScLLcSspsfcCjciLsdSjBCfp)I JplISBjcL)l BjJfJpILsCd)C jslIBcpJdIcSI)J sSLspiCIsJC)I ClslfdCdBdJBIlSdSlCJIIip)l csdjccsSpCSBcSdLiiilSlSj)s dllJILfISBJjiILlIpBiJipd)B lild)C JpScjsjpsCiJJcscdsIj)J jlICBCCCf)L )C JIIilJpSsfjSfppiIcfcJccLs)S MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/_auto_sigstrings.h0000644000175000017500000002003412456307246024736 0ustar jnthnjnthn"iLpfCSLsjIJijdfJLcJBscpCi)c", "dsj)p", "SJjIdSLjLifsSpfBdj)c", "lfSBB)I", "s)d", "psjiLjljBIddLsLJSlCIfpSsfSl)d", "lfIfiplfIsdfCfJIJ)s", "SIsCsjiCfccILddliLiSsJs)C", "cpCLcdBjCspLldJLccjcB)C", "pJLBCdCfcdBfc)B", "JCCifpijJIlcjLSdJfLJBLpffpd)L", "dlICpfclsJslSSscJsljdsjLcIJ)d", "SpIBSJpslIISl)C", "BillJSCJJLSLCfllsj)c", "flcciJJ)l", "LSSCdBpS)C", "dfLlcliLdffCp)j", "fffIJCsf)I", "pISClLcJIpLCs)I", "ciS)d", "JppISilJsCccliSScidJslLICfJ)j", "jipisS)L", "dSfciBLLScfLBIdlCIf)c", "iS)l", "cBBILlIcJJjJiSfICJjJJspB)c", "CIspSifSplBsLJpSsCJclLLCiSI)s", "jCjBiiSLslj)f", "plSlBjpJJjiiLplCBBlC)J", "jBBSslfCSlflSfCCjplfC)i", "fjLdsfjdIjdppJlddSfJJ)L", "psJICpffliJJljCJBljpjcI)j", "p)i", "ICisiBLJpJIIdBcJJss)J", "LIIpddfLSjsIdIfdCILLfsLdSij)j", "CIilfCJfciClJlJBjj)s", ")S", ")f", "LfdCIIpJdCSfifLIsd)c", "JLfCsCCJCcsdBCcIlfcJBiIIS)s", "jCBIpLSdBjCllSflSBLpllfSLSp)C", "BcCscJBfdBfIsJCJI)p", "jJLssJjBdSCjiSllIslSsLslBpp)J", "ljpsscjfJ)j", "dLSiBBBISlpjIcCIfBcslJcd)f", "ILLB)J", "LfcpdcsspcLsCdLcdpSlII)l", "JcciclcfJ)C", "jSdLcBjiCICSIBlcIcLp)l", "fBBjCfciJJljipJfspiicpiLdpp)L", "jJjJlBLJcCCLpLClScf)c", "sCSldsjLdcSjlf)s", "JppLBJJLLscfCCiIilcS)f", "cpLiiisJBfIflIISss)J", "cLIICfcSC)B", "SpllCBdLcfCdjlIpfliCpClSSjI)J", "IjBsClIslsSjiSBcpfdjs)C", "IplpicicJd)c", "CpSiIjLddcBBffBiCsLJcIiIJp)j", "plBdIi)i", "fcffCfdcpdjBCSJsLBLSfsjldJJ)I", ")d", "fcspSCLiBl)f", ")f", "JCflf)s", "CpscIfjIpfidCCsi)f", "iJjijlBlJljfslLIpC)S", "JCsBciCiLc)B", "Ljjs)s", "fpsiLIcIdfJsssII)S", "fjdlldpijSJLfjJcd)S", "BpjfiLclsJBpIjpcC)L", "jSsCBcLJCldpLLSlCcLfSifcpid)d", "lfcBCSBsBlIlJsIS)J", "Il)f", "dsCccJBcc)L", "sLCjpiJIfSBCLSLppilCidSjBfjcB)S", "Scs)f", "lISjpiLjLIijpBlsBBLBdSCBJsi)L", "slCLBLjiIccfIlLj)i", "jILJiBLIlBpijBBLpBjSIBijdfsLi)l", "dcijIIsdcSLIfpjJJjCfd)C", "jCCpfJIjjj)d", "B)I", "djJLdIjjc)c", "s)B", ")I", "jJJSIspBLSB)p", "ICSdLBdsJI)S", "jJLjcCcLLICdssLJSjdpl)s", "ISLlfsBJpJiiLjjIsdlssdd)p", "ILBCBpJ)i", "SsfSfLdsclLJCBJpsp)p", "JBlic)p", "dIpJLcIcBCBsS)L", ")d", "BjLsSjIdJcilfpJilCCplspfscs)B", "CfC)l", "idCfdLdSIfCBsfsildl)I", "fJBflCpfpISplCLiccpdSfsC)C", "pcSSdsfdCJCdIBILpcfJ)j", "LSdBssCifBjsSIIsIJpJJSJBBIcdc)J", "pdffsCclBcssIlLlcSjLfpSdfpc)p", "LLLLlJdpllppfcSJpBlCjiciLc)s", "CcifpCJILJSIScs)C", "JLcJISc)f", "jJIpclfjjLl)C", "IpjfclC)S", "LcBSjSIiLBBCpCpLlijiJLpiSLjB)d", "dldBBISjfBjdsiccCLjlCcIdj)L", "BplfLipLIScdsCjCidsjc)B", "p)C", "sClBf)L", "jJJdIiiLIiBJdCBdiJBIlfJpC)L", "ClsBsplCSBJBIdc)c", "sCflLdcipLsdjLCCdsIpflcfsCis)s", "CjlcCiBSpfBBfJL)B", "LSsjCflccpjicBjJLJLClcd)J", "BILp)j", "jpLcBJpcLllcLLl)S", "ScJdCJjSJBBij)j", "SSciffIlJCLSfIlSLLfLdIsScSSjp)f", "CCJjcjBpcCJIBBc)i", "fSIppLcfBIIfidBJJjLcjjs)L", "lpc)p", "flIij)S", "lCsCJ)c", "JCCCLfSsijBjsplc)B", "pIdSpCddiCJjlCLfi)I", "lLCsLljjSJjfiBfLfBlpIp)I", ")j", "LiBsCLdSdldIsScpCjfc)s", "cdJjLcJSLSLpjdJjsjCsBI)j", "SLJC)f", "ddpjjJlcfIIlsBJpjfiLcIslj)j", "CLSBLSpSfiddSi)I", ")l", "ljcjfplSciflfci)s", "CjBI)i", "iiLLfLiiIfjd)p", "lcIBBcdcjC)s", "LscCljJIsIslfljiliLS)j", "ijSSlp)I", "jCslidCdiiiJcSSlldBIsjlJcdfL)p", "LiJdBdfCfSJ)S", "LJsiSCipidIBcIfpsSJlfjlpIfL)L", "BlslfJBcBfIBSjc)p", "dcLjLJcIIjSsS)f", "dcdfLBdp)f", "psddcifCCIfpjS)s", "lj)i", "pilpSipsCLLBBld)c", "fSS)S", "cpjifs)f", "LlliIdpS)s", "cdBClBspfjcCLCdSjfjICscplJLId)d", "BdICJIIiiBIjp)l", "csiJljfpijiCBiC)I", "cdJLIccpcJSf)s", "dIsJCpjdsciicLJJCljLiBpjp)d", "Cfi)B", "fSIBcddiciLCcSpsBSBIifdCf)c", "LIiJSlBSpB)S", "CldSp)s", "cSjC)L", "BLBfpilspsJISdsiSIjBifplBf)d", "BLicIIBSflJldCc)s", "iJIf)c", "sdSddsdjSlfiCi)I", "sCBfcsBSiIfpi)B", "lBJJBpjjc)s", "jipBfcCfBsccJ)j", "jSdjlJjssJcLcsBjL)I", "LSIdsjCiJpf)C", "scffLICdBs)L", "ILls)C", "Bj)j", "LBCclddpSsdscLlSlLjIfBCJSilSf)s", "JSILdILLp)d", "BcILiCIdJSBpfSCjlcLdLB)I", "BdCLpCjpsdjJcd)J", "SJjsfLLJpjjjJBBJBsipif)l", "fCSBCfpIISlSBIffBIi)J", "isJlliBJBlIsdjip)S", "slJJLcjJcBdLjidcBljcsJLLpLS)s", "JCfSLIBpBJdBJlJBl)l", "S)s", "JpfS)l", "JfssBcJpJJJJsjJpsCp)f", "fscBpdfCJJpjpcJdlijSBcjJLS)p", "cLpddddpffdjILcSplsjBLpBfSl)J", "IILCSLCsldCJfLclpi)I", "lBjipJscspLLSj)f", "sBffdBjfLJjJBBBlBJB)f", "SdiCL)c", "sBcjcBiccddfjjI)j", "jsJcSIsJIlpCpSIp)i", "dIiBjiBifjpIcillIBclJJiipClsB)c", "djlBcBB)I", "JSIllciCCjpLcsCfifcIdiIjBIJc)I", "BcI)I", "CJcSLlCjLilJpjLSjcLBCC)l", "lpSLspIII)J", "CsdLdSiJCdSIIICjlSsddB)S", "SCCLJpjLBIIBpfldpdiSI)J", "cdccdciJijpCcJlflciLfSifC)i", "IpfSdfiB)p", "IIddsccfLBJfISp)L", "ldCdidfLfLCdjlidJisLjC)I", "LiBcCppfLdpCdLffI)c", "BLsBilscCiJpCBpsslcciBdjB)l", "dCjpsSBsLLjpdd)I", "cIjSlsIpJILCjIJIlCsfj)S", "scl)c", ")J", "LlBSBLjIJcdSSjpf)d", "csSJJIflcdllj)I", "JLISSffIfsL)i", "li)j", "lpisssdiClBLciSfpJCLjll)p", "BfcIifcssijj)S", "LBdIciLBsisddflpSlliCcssijl)d", "B)f", "BpsCCBCIIIIIScsJpdBdBSsI)p", "ifdsldcdCsdSLILCfcsCLBcpBCc)s", "fCBLcsIciisliJipSj)L", "LdspBBpsccpdsf)L", "CCIjJLCdSjp)l", "J)c", "jSljijLIJJIfICSlipCdjSdpp)L", "fijLffIIsdsLJ)p", "jSipd)p", "CLCILdSIispddLfiCCi)i", "dscjjIijsBLBCCLcjsjLcjLpIC)B", "JijJJJcCBILsIISJlB)L", "SSdipL)s", "dsfjlicS)d", "IBlssc)L", "LIljldplSlijdippd)I", "BLsSssd)j", "cscflLiSlsdBfiJ)p", "ilLpdpJCcpicSfCJdBsLIJi)l", "IJBBipicjscSpsill)I", "jlJjLpSCIlfBcIBCfpjBipcllicSB)j", "JsfcdLiCC)c", ")s", "ISiSCdi)j", "ICIpsLfpBIBdJBlBCfCCCil)I", "BJpicJpSBlJLjIpdIpJIIJli)L", "jCIBdjlLfpiLciiLcdCddlLj)C", "cplfJsB)c", "BlfpjlC)s", "jljJlLJliSCjJSisCBIsCLsp)J", ")S", "CJclSlSB)i", "lLSpSfClCilJJpSfldfdscJSLfB)c", "iBJCSIICJCiBfdJLSIiSiijIdfsf)d", "pSSiIlfdf)I", "sId)s", "LJJ)c", "dIIIIilSSdCJSJcdIBffccicSI)p", "cdLBIsIfJCsdcijIdliilsSLil)f", "CLJsliSCJpBsdsCclLjJ)i", "dBsspJdlSCIfICsLSfJicjlSJScC)f", "cfjSCidccsSjCL)l", "IBSciIJBpsSf)I", "ijCdfSS)p", "icLdsIlldldBc)I", "csdIciLIdfifsLllCpIc)B", "LlfIldjcJlSJCIBfddpipBcjLsS)C", "SccBdJLfcp)j", "CcdlcfJcldfLcIISLllcppCL)I", "ljLsidSSlIsSjfsIlidCLLpIpJs)B", "ldcsLSllldi)c", "llcdCp)S", "dBp)L", "liLLLIlfLiCicp)i", "dJclLBfjSdIip)s", "jJJsiBfsLsIcSSIpScfdpfpSs)p", "JlBICJBiBcSspJLdfBILSJJ)s", "jcLpdjiljfp)C", "ssBjIfcCfBsiLjdiLSffclfJcjCB)i", "dJjBCBdssp)S", "scdCILjilJcjCs)c", "SIlsBsSsSs)j", "cpBSdBIIpBfIJBBp)s", "CjJp)p", "ccfiiidIsdpCBSJpSIsf)I", "LLIfSclCL)p", "lCLBcCscB)I", "SBf)J", "CjBjspdcCBpSpJlI)L", "jfJLBJscfSB)j", "CBflSLlifLsCJpfBJsjjpSjiJ)J", "fJpLppJj)C", "sjsBpIJJSl)s", "CLSjSlCddBjLLiJ)i", "LLCSBCcILLLiBsJpjCcsSBsSJBc)d", "jfiSBLSsfLdJIilLdIs)C", "jIjLpCLdcijBppcj)C", "IfsBilLcl)C", "plfSslCiICj)p", "jljJsldlJCLdfIcjJISS)S", "jBpdIdISJBdCJCpjpiL)j", "ldICjfjfsC)i", "dSldpBJ)p", "LICjBddpjSIjLJBJcdpSScSlpsIpf)S", "JLdCpfcJIicdClBppdlCsLI)d", "lIijLCCjcSiBIdIfc)i", "p)i", "JijLJsCJpfBCIpiliIdLjILdS)p", "iJpssCLdpBCI)p", "IBJ)S", "slfsiIlcIBdp)i", "llLfiLLidCsBJsl)f", "fJJCdBpcIpBSsjdfSfSB)J", "BLdcisLSdlfjppJJdBIdiL)j", "lpsBfpLfjLd)d", "lsdScICdcLfCspjdiflsClcBiBjCd)I", "lLBB)p", "CLJdJLCISCpspBij)C", "dCdccIspCSp)d", "dlIfSscLjsJLclCJfjjBIlCdf)d", "Cpc)B", "pjlcLpfScjBCsspcLicsBSC)f", "SccicfCl)J", "iislILLldd)j", "L)f", "dfICp)L", "fffBLclSIcLlps)I", "dIjIjsSlssCIBdfd)p", "djdlfiLlBjfjcfdJSIfJcCpS)J", "sjpciLJSijlCsLlCsLBCiSlSd)p", "LccJiJiIdCcSJJ)d", "flIBdsBClipdSJIcLJlcCcj)C", "JIfsIlcC)C", "ciCs)c", "BBfljdiclISLdjBJB)d", "IldJpclssdSpBiLldlcBSjic)j", "CCfCdipfdldldsJscJlpSJjilf)d", "B)j", "slfilssJCdJpffICBBppiIipCSpC)S", "CJBBdLssiI)C", "sBfLCfpBLCjcdlILfpcBiCcSfSjsp)L", "BLcpdBJ)d", "LIfLCSjBcJcILCplIifscC)S", "SCpSLpBISfsIsLISijpCLJpsd)L", "cdpdsdLjLjjCfI)I", "lspBJipLcI)J", "IipjSlIjl)s", "i)L", "JlcBdpspffCLlSCSJJl)I", "dcJj)p", "jCJCLsSpsCcBBdsLljfdCjJl)l", "pScJclLlfjdCiCSIsi)I", "ccBBcsjLfsSljI)S", "ccSdJSCdIjILdfCBBs)B", "IJfi)p", "cilidL)I", "LcJdccjjpI)I", ")j", "sJlLCJcBpCiIjisB)L", "c)i", ")s", "jLSBsijpJcjSSc)I", "dJLICclsf)L", "sLJLSicSJI)f", "cddIscfJBjSIL)I", "dSdSJ)l", "SBsISffsSdCSiIiSBIpidjpCIC)c", "pplCpfJCpIicIJIfBpCcSdI)s", "SiBjjpSSIICiBSC)j", "sdSLfSjBIfBdCjSJjpcSC)I", "lJcLfSSJjSfsCspCLLClfLd)j", "pJJBBilJ)j", "jpLCiBclsSjic)S", "LCSLlJJSsJiJSBCpjB)j", "iJpcpCJssfpdcCLppScBd)j", "sjpccpJpssJSBLdsdfcd)B", "LpccdcBj)p", "BliCjBdLs)J", "SScJ)S", "l)S", "dc)d", "Cd)s", "IBjILd)l", "dJBsCCj)j", "cfSLsiLS)i", "jScLLcSspsfcCjciLsdSjBCfp)I", "JplISBjcL)l", "BjJfJpILsCd)C", "jslIBcpJdIcSI)J", "sSLspiCIsJC)I", "ClslfdCdBdJBIlSdSlCJIIip)l", "csdjccsSpCSBcSdLiiilSlSj)s", "dllJILfISBJjiILlIpBiJipd)B", "lild)C", "JpScjsjpsCiJJcscdsIj)J", "jlICBCCCf)L", ")C", "JIIilJpSsfjSfppiIcfcJccLs)S", MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/config-random.lua0000644000175000017500000000253712456307246024440 0ustar jnthnjnthn-- section 'main' -------------------------------------------------------------- nsigs = 300 -- number of test cases mode = "random" -- generatore mode: 'random' or 'ordered' type sequences minargs = 1 -- minimum num. of supported arguments (>= 0) maxargs = 67 -- maximum num. of supported arguments (>= minargs) -- section 'types' ------------------------------------------------------------- argtypes = "BcCsSiIjJlLpfd" -- supported argument types rettypes = argtypes -- supported return types (currently no void support) -- section 'ordered' ----------------------------------------------------------- offset = 0 -- permutation index offset (default = 0) step = 1 -- permutation index increment (default = 1) -- section 'random' ------------------------------------------------------------ seed = 1 -- random seed -- section 'calling convention' (useful on Windows for now) -------------------- api = "" -- calling convention ("__stdcall" or "__fastcall") -- for gcc use "__attribute__((__stdcall__))" or "__attribute__((__fastcall__))" -- for ms ? ccprefix = "" -- signature prefix ("_s" (stdcall), "_f" (gcc fastcall) or "_F" (microsoft fastcall)) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/config-stress1.lua0000644000175000017500000000304112466674236024562 0ustar jnthnjnthn-- section 'main' -------------------------------------------------------------- mode = "designed" -- generator mode: 'random', 'ordered' or 'designed' type sequences designfile= "stress1.cfg" -- design file function nlines() local cnt = 0 for l in io.open(designfile):lines() do cnt = cnt + 1 end return cnt end nsigs = nlines() -- number of test cases minargs = 0 -- minimum num. of supported arguments (>= 0) maxargs = 20 -- maximum num. of supported arguments (>= minargs) -- section 'types' (not used by 'designed') ------------------------------------ argtypes = "BcCsSiIjJlLpfd" -- "BcCsSiIjJlLpfd" -- supported argument types rettypes = argtypes -- supported return types (currently no void support) -- section 'ordered' ----------------------------------------------------------- offset = 0 -- permutation index offset (default = 1) step = 1 -- permutation index increment (default = 1) -- section 'random' ------------------------------------------------------------ seed = 1 -- random seed -- section 'calling convention' (useful on Windows for now) -------------------- api = "" -- calling convention ("__stdcall" or "__fastcall") -- for gcc use "__attribute__((__stdcall__))" or "__attribute__((__fastcall__))" -- for ms ? ccprefix = "" -- signature prefix ("_s" (stdcall), "_f" (gcc fastcall) or "_F" (microsoft fastcall)) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/config.lua0000644000175000017500000000265212456307246023160 0ustar jnthnjnthn-- auto-generated file from temlate config-random.lua (created by GNUmake) -- section 'main' -------------------------------------------------------------- nsigs = 400 -- number of test cases mode = "random" -- generatore mode: 'random' or 'ordered' type sequences minargs = 0 -- minimum num. of supported arguments (>= 0) maxargs = 29 -- maximum num. of supported arguments (>= minargs) -- section 'types' ------------------------------------------------------------- argtypes = "BcCsSiIjJlLpfd" -- supported argument types rettypes = argtypes -- supported return types (currently no void support) -- section 'ordered' ----------------------------------------------------------- offset = 0 -- permutation index offset (default = 0) step = 1 -- permutation index increment (default = 1) -- section 'random' ------------------------------------------------------------ seed = 1 -- random seed -- section 'calling convention' (useful on Windows for now) -------------------- api = "" -- calling convention ("__stdcall" or "__fastcall") -- for gcc use "__attribute__((__stdcall__))" or "__attribute__((__fastcall__))" -- for ms ? ccprefix = "" -- signature prefix ("_s" (stdcall), "_f" (gcc fastcall) or "_F" (microsoft fastcall)) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/do_test.c0000644000175000017500000000706012466674236023022 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/do_test.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include "_auto_config.h" #include "invokers.h" #include "dyncall_callback.h" #include "sigstrings.h" #include "signature_utils.h" #include "env.h" #include "print.h" #include int CompareValues(char type, DCValue* a, DCValue* b) { int isequal = 0; switch(type) { case DC_SIGCHAR_BOOL: isequal = (a->B == b->B) ? 1 : 0 ; break; case DC_SIGCHAR_CHAR: isequal = (a->c == b->c) ? 1 : 0 ; break; case DC_SIGCHAR_UCHAR: isequal = (a->C == b->C) ? 1 : 0 ; break; case DC_SIGCHAR_SHORT: isequal = (a->s == b->s) ? 1 : 0 ; break; case DC_SIGCHAR_USHORT: isequal = (a->S == b->S) ? 1 : 0 ; break; case DC_SIGCHAR_INT: isequal = (a->i == b->i) ? 1 : 0 ; break; case DC_SIGCHAR_UINT: isequal = (a->I == b->I) ? 1 : 0 ; break; case DC_SIGCHAR_LONG: isequal = (a->j == b->j) ? 1 : 0 ; break; case DC_SIGCHAR_ULONG: isequal = (a->J == b->J) ? 1 : 0 ; break; case DC_SIGCHAR_LONGLONG: isequal = (a->l == b->l) ? 1 : 0 ; break; case DC_SIGCHAR_ULONGLONG: isequal = (a->L == b->L) ? 1 : 0 ; break; case DC_SIGCHAR_FLOAT: isequal = (a->f == b->f) ? 1 : 0 ; break; case DC_SIGCHAR_DOUBLE: isequal = (a->d == b->d) ? 1 : 0 ; break; case DC_SIGCHAR_POINTER: isequal = (a->p == b->p) ? 1 : 0 ; break; default: assert(0); } return isequal; } int Compare(const char* signature) { DCValue ref; int total = 1; int pos; int isequal; char ch; /* skip prefix */ signature = SignatureSkipCallPrefix(signature); /* check arguments */ pos = 0; for(;;) { ch = *signature++; if (ch == DC_SIGCHAR_ENDARG) break; GetReferenceArg(&ref, ch, pos); isequal = CompareValues( ch, &ref, &Args[pos] ); if ( !isequal ) { if (OptionVerbose) { total = 0; fprintf(stdout, " @%d[%c] ", pos, ch); } else return 0; } ++ pos; } ch = *signature++; /* check result */ GetReferenceResult(&ref, ch); isequal = CompareValues(ch, &ref, &Result); if (!isequal) { if (OptionVerbose) { total = 0; fprintf(stdout, " @-1 "); } else return 0; } return total; } extern DCCallbackHandler handler; /* see handler.c for implementation */ int DoTest(int id) { int index, result; const char* signature; DCCallback* pcb; assert( id > 0 && id <= CONFIG_NSIGS ); index = id - 1; signature = GetSignature(index); PrintCaseInfo(id,signature); pcb = dcbNewCallback( signature, handler, (void*) signature ); assert(pcb != NULL); DoInvoke(index, (void*) pcb); result = Compare(signature); PrintCaseResult(result); dcbFreeCallback(pcb); return result; } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/dynMakefile0000644000175000017500000000032412456307246023355 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/dyncall_value_set.h0000644000175000017500000000237712456307246025062 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/dyncall_value_set.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_types.h" typedef struct DCValueSet_ { DCbool B; DCchar c; DCuchar C; DCshort s; DCushort S; DCint i; DCuint I; DClong j; DCulong J; DClonglong l; DCulonglong L; DCfloat f; DCdouble d; DCpointer p; } DCValueSet; MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/env.c0000644000175000017500000000776312456307246022154 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/env.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include "_auto_config.h" #include "dyncall_signature.h" #include "env.h" DCValueSet ValueMatrix[CONFIG_MAXARGS]; DCValue Args[CONFIG_MAXARGS]; DCValue Result; DCValueSet K; void GetReferenceArg(DCValue* output, char ch, int pos) { /* static const int Ki = 134; static const double Kd = 1.012356; static const float Kf = 1.20432545f; static const int Kp = 0x1020345; static const DClonglong Kl = 24534543; */ output->L = 0xCAFEBABEDEADC0DELL; pos = pos + 2; switch(ch) { case DC_SIGCHAR_BOOL: output->B = ( (pos*K.i) % 2) ? DC_TRUE : DC_FALSE ; break; case DC_SIGCHAR_CHAR: output->c = pos*K.c; break; case DC_SIGCHAR_UCHAR: output->C = pos*K.C; break; case DC_SIGCHAR_SHORT: output->s = pos*K.s; break; case DC_SIGCHAR_USHORT: output->S = pos*K.S; break; case DC_SIGCHAR_INT: output->i = pos*K.i; break; case DC_SIGCHAR_UINT: output->I = pos*K.I; break; case DC_SIGCHAR_LONG: output->j = pos*K.j; break; case DC_SIGCHAR_ULONG: output->J = pos*K.J; break; case DC_SIGCHAR_LONGLONG: output->l = ( (long long) pos ) * K.l; break; case DC_SIGCHAR_ULONGLONG:output->L = pos*K.L; break; case DC_SIGCHAR_FLOAT: output->f = ( (float) pos ) * K.f; break; case DC_SIGCHAR_DOUBLE: output->d = ( (double) pos ) * K.d; break; case DC_SIGCHAR_POINTER: output->p = (DCpointer) (unsigned long) (pos* ( (unsigned long) K.p ) ); break; default: assert(0); } } void GetReferenceResult(DCValue* output, char ch) { GetReferenceArg(output, ch, -1); } void InitEnv() { int pos; K.B = DC_TRUE; K.c = 13; K.C = 19; K.s = -23; K.S = 41; K.i = 134; K.I = 257; K.j = -12357; K.J = 356; K.l = -1234556687721LL; K.L = 23564634576581ULL; K.f = 1.20432545f; K.d = 1.0123456; K.p = (void*) 0x1020345; for(pos = 0 ;pos < CONFIG_MAXARGS ;++pos) { DCValue ref; GetReferenceArg( &ref, DC_SIGCHAR_BOOL , pos); ValueMatrix[pos].B = ref.B; GetReferenceArg( &ref, DC_SIGCHAR_CHAR , pos); ValueMatrix[pos].c = ref.c; GetReferenceArg( &ref, DC_SIGCHAR_UCHAR , pos); ValueMatrix[pos].C = ref.C; GetReferenceArg( &ref, DC_SIGCHAR_SHORT , pos); ValueMatrix[pos].s = ref.s; GetReferenceArg( &ref, DC_SIGCHAR_USHORT , pos); ValueMatrix[pos].S = ref.S; GetReferenceArg( &ref, DC_SIGCHAR_INT , pos); ValueMatrix[pos].i = ref.i; GetReferenceArg( &ref, DC_SIGCHAR_UINT , pos); ValueMatrix[pos].I = ref.I; GetReferenceArg( &ref, DC_SIGCHAR_LONG , pos); ValueMatrix[pos].j = ref.j; GetReferenceArg( &ref, DC_SIGCHAR_ULONG , pos); ValueMatrix[pos].J = ref.J; GetReferenceArg( &ref, DC_SIGCHAR_LONGLONG , pos); ValueMatrix[pos].l = ref.l; GetReferenceArg( &ref, DC_SIGCHAR_ULONGLONG, pos); ValueMatrix[pos].L = ref.L; GetReferenceArg( &ref, DC_SIGCHAR_FLOAT , pos); ValueMatrix[pos].f = ref.f; GetReferenceArg( &ref, DC_SIGCHAR_DOUBLE , pos); ValueMatrix[pos].d = ref.d; GetReferenceArg( &ref, DC_SIGCHAR_POINTER , pos); ValueMatrix[pos].p = ref.p; } } /* Global Options. */ int OptionVerbose = 0; MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/env.h0000644000175000017500000000264712456307246022155 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/env.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_value.h" #include "dyncall_value_set.h" /* test related */ void InitEnv(); /* initializes ValueMatrix */ /* function of type and position */ void GetReferenceArg(DCValue* output, char type, int argpos); /* function of type (position = -1) */ void GetReferenceResult(DCValue* output, char type); extern DCValueSet ValueMatrix[CONFIG_MAXARGS]; extern DCValue Args[CONFIG_MAXARGS]; extern DCValue Result; /* Global Options. */ extern int OptionVerbose; MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/handler.c0000644000175000017500000001011612466674236022772 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/handler.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "_auto_config.h" #include #include "dyncall_callback.h" #include "env.h" #include "signature_utils.h" char handler(DCCallback* that, DCArgs* input, DCValue* output, void* userdata) { const char* signature = (const char*) userdata; int pos = 0; char ch; signature = SignatureSkipCallPrefix(signature); for(;;) { ch = *signature++; if (ch == DC_SIGCHAR_ENDARG) break; Args[pos].L = 0xDEADC0DECAFEBABELL; switch(ch) { case DC_SIGCHAR_BOOL: Args[pos].B = dcbArgBool (input); break; case DC_SIGCHAR_CHAR: Args[pos].c = dcbArgChar (input); break; case DC_SIGCHAR_UCHAR: Args[pos].C = dcbArgUChar (input); break; case DC_SIGCHAR_SHORT: Args[pos].s = dcbArgShort (input); break; case DC_SIGCHAR_USHORT: Args[pos].S = dcbArgUShort (input); break; case DC_SIGCHAR_INT: Args[pos].i = dcbArgInt (input); break; case DC_SIGCHAR_UINT: Args[pos].I = dcbArgUInt (input); break; case DC_SIGCHAR_LONG: Args[pos].j = dcbArgLong (input); break; case DC_SIGCHAR_ULONG: Args[pos].J = dcbArgULong (input); break; case DC_SIGCHAR_LONGLONG: Args[pos].l = dcbArgLongLong (input); break; case DC_SIGCHAR_ULONGLONG:Args[pos].L = dcbArgULongLong(input); break; case DC_SIGCHAR_FLOAT: Args[pos].f = dcbArgFloat (input); break; case DC_SIGCHAR_DOUBLE: Args[pos].d = dcbArgDouble (input); break; case DC_SIGCHAR_POINTER: Args[pos].p = dcbArgPointer (input); break; } ++pos; } ch = *signature++; /* currently, no void result is supported by the suite */ GetReferenceResult(output, ch); #if defined(DC__Arch_PPC64) && defined(DC__Endian_BIG) switch (ch) { case DC_SIGCHAR_BOOL: output->l = ((long long)output->B); break; case DC_SIGCHAR_CHAR: output->l = ((long long)output->c); break; case DC_SIGCHAR_UCHAR: output->l = ((long long)output->C); break; case DC_SIGCHAR_SHORT: output->l = ((long long)output->s); break; case DC_SIGCHAR_USHORT: output->l = ((long long)output->S); break; case DC_SIGCHAR_INT: output->l = ((long long)output->i); break; case DC_SIGCHAR_UINT: output->l = ((long long)output->I); break; case DC_SIGCHAR_LONG: output->l = ((long long)output->j); break; case DC_SIGCHAR_ULONG: output->l = ((long long)output->J); break; case DC_SIGCHAR_ULONGLONG:output->l = ((long long)output->L); break; case DC_SIGCHAR_FLOAT: output->d = ((double)output->f); break; } #endif switch(ch) { case DC_SIGCHAR_BOOL: return 'B'; case DC_SIGCHAR_CHAR: return 'c'; case DC_SIGCHAR_UCHAR: return 'C'; case DC_SIGCHAR_SHORT: return 's'; case DC_SIGCHAR_USHORT: return 'S'; case DC_SIGCHAR_INT: return 'i'; case DC_SIGCHAR_UINT: return 'I'; case DC_SIGCHAR_LONG: return 'j'; case DC_SIGCHAR_ULONG: return 'J'; case DC_SIGCHAR_LONGLONG: return 'l'; case DC_SIGCHAR_ULONGLONG:return 'l'; case DC_SIGCHAR_FLOAT: return 'f'; case DC_SIGCHAR_DOUBLE: return 'd'; case DC_SIGCHAR_POINTER: return 'p'; default: assert(0); return 'v'; } } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/invokers.c0000644000175000017500000000337212456307246023214 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/invokers.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "_auto_config.h" #include #include "invokers.h" #include "env.h" /* Callback Invokers implementation. */ /* type short-cuts */ typedef DCvoid v; typedef DCbool B; typedef DCchar c; typedef DCshort s; typedef DCint i; typedef DClong j; typedef DClonglong l; typedef DCuchar C; typedef DCushort S; typedef DCuint I; typedef DCulong J; typedef DCulonglong L; typedef DCfloat f; typedef DCdouble d; typedef DCpointer p; typedef DCstring Z; #define A ValueMatrix #include "_auto_invoke_macros.h" #include "_auto_invokers.h" /* table of invokers */ typedef void (invoker) (void*); invoker* invokers[CONFIG_NSIGS] = { #include "_auto_invoke_table.h" }; /* Front-End. */ void DoInvoke(int index, void* addr) { invokers[index](addr); } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/invokers.h0000644000175000017500000000174712456307246023225 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/invokers.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void DoInvoke(int index, void* addr); MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/main.c0000644000175000017500000000476712456307246022311 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/main.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include "_auto_config.h" #include "env.h" #include "print.h" #include "../common/platformInit.h" const char* appname = "unknown"; /* test one case, returns error code */ int DoTest(int id); /* capture total results for failure (0) and success (1) */ int totalErrorCodes[2] = { 0, 0 }; void TestRange(int from, int to) { int i; for(i = from ; i <= to ; ++i ) { int status = DoTest(i); totalErrorCodes[status]++; } } void InitEnv(); void ExitWithUsage() { PrintUsage(appname); exit(0); } #define Error(X, Y) fprintf(stderr, X, Y); ExitWithUsage() int main(int argc, char* argv[] ) { int from = 1; int to = CONFIG_NSIGS; int ncases; int i; int pos; int number; int totalResult; dcTest_initPlatform(); InitEnv(); appname = argv[0]; pos = 0; for(i = 1 ; i < argc ; ++i ) { if ( argv[i][0] == '-' ) { switch(argv[i][1]) { case 'v': OptionVerbose = 1; continue; case 'h': PrintUsage(appname); return 0; default: Error("invalid option: %s", argv[i]); } } number = atoi(argv[i]); switch(pos) { case 0: to = from = number; ++pos; break; case 1: to = number; break; default: Error("too many arguments%s", ""); } } assert(from > 0); assert(to <= CONFIG_NSIGS); assert(from <= to); ncases = (to - from) + 1; PrintHeader(); TestRange(from, to); totalResult = (totalErrorCodes[1] == ncases) ? 1 : 0; PrintTotalResult(totalResult); dcTest_deInitPlatform(); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-config.lua0000644000175000017500000000027612466674236024102 0ustar jnthnjnthnrequire "config" local defs = { MAXARGS = maxargs, NSIGS = nsigs, API = api } for k,v in pairs(defs) do io.write("#define CONFIG_" .. k .. " " .. v .. "\n" ) end io.flush() MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-cstrings.lua0000644000175000017500000000015312456307246024454 0ustar jnthnjnthnrequire "config" for line in io.lines() do io.write( '"' .. ccprefix .. line .. '",\n' ) end io.flush() MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-invoke-macros.lua0000644000175000017500000000113612456307246025377 0ustar jnthnjnthnrequire "config" if mode == "ordered" then minargs = 0 end local i for i = minargs, maxargs do local line = "#define F" .. i .. "(ID,R" local argdef = "" local argset = "" if i > 0 then line = line .. "," local j for j = 0, i-1 do if j > 0 then argdef = argdef .. "," argset = argset .. "," end argdef = argdef .. "A" .. j argset = argset .. "A[" .. j .. "].A" .. j end end line = line .. argdef .. ") void ID(void* addr) { Result.R = ((CONFIG_API R(*)(" .. argdef .. "))addr)(" .. argset .. ");}\n" io.write(line) end io.flush() MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-invoke-table.lua0000644000175000017500000000014012456307246025174 0ustar jnthnjnthnrequire "config" local i for i = 1, nsigs do line = "&f" .. i .. ",\n" io.write(line) end MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-invokers.lua0000644000175000017500000000064312456307246024464 0ustar jnthnjnthnrequire "config" local id = 1 for signature in io.lines() do local nargs = string.len(signature) - 2 local rtype = string.sub(signature, nargs + 2, nargs + 2) local outline = "F" .. nargs .. "(f" .. id .. "," .. rtype for i = 1, nargs do local type = string.sub(signature, i, i) outline = outline .. "," .. type end outline = outline .. ")\n" io.write( outline ) id = id + 1 end io.flush() MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/make-signatures.lua0000644000175000017500000000300512456307246025003 0ustar jnthnjnthnrequire "config" require "math" require "string" local nargtypes = string.len(argtypes) local nrettypes = string.len(rettypes) local argrange = maxargs - minargs math.randomseed(seed) function randomSignatures(nsigs) local i for i = 1, nsigs do local nargs = minargs + math.random(argrange+1) - 1 local signature = "" for j = 1, nargs do local typeindex = math.random(nargtypes) signature = signature .. string.sub(argtypes, typeindex, typeindex) end local rtypeindex = math.random(nrettypes) signature = signature .. ")" .. string.sub(rettypes, rtypeindex, rtypeindex) io.write(signature .. "\n") end end function orderedSignature(x) local signature = "" local typeindex while true do if x < nargtypes then break end typeindex = 1 + math.mod(x, nargtypes) signature = signature .. string.sub(argtypes, typeindex, typeindex) x = math.floor( x / nargtypes ) end typeindex = 1 + x signature = signature .. ")" .. string.sub(argtypes, typeindex, typeindex) return signature end function orderedSignatures(nsigs) local i for i = 1, nsigs do io.write( orderedSignature(offset+i*step) .. "\n" ) end end function designedSignatures() for line in io.lines(designfile) do io.write( line ) io.write( "\n" ) end end if mode == "random" then randomSignatures(nsigs) elseif mode == "ordered" then orderedSignatures(nsigs) elseif mode == "designed" then designedSignatures() else error("'mode' must be 'random' or 'ordered'") end io.flush() MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/mkfile0000644000175000017500000000234012456307246022374 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = env handler sigstrings invokers do_test main print signature_utils APPLICATION = callback_suite LIBS = $TOP/dyncallback/libdyncallback_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/print.c0000644000175000017500000000314212456307246022503 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/print.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include void PrintUsage(const char* appName) { fprintf(stdout, "usage:\n\ %s [ -v ] [ from [to] ]\n\ where\n\ from, to: test range\n\ options\n\ -v verbose reports\n\ -h help on usage\n\ \n\ ", appName); fflush(stdout); } void PrintHeader() { fprintf(stdout, "case\tsignat.\tresult\n"); } void PrintCaseInfo(int caseId, const char* signatureString) { fprintf(stdout, "f%d(\t%s", caseId, signatureString); fflush(stdout); } void PrintCaseResult(int resultId) { fprintf(stdout, " :%d\n", resultId); fflush(stdout); } void PrintTotalResult(int resultId) { printf("result: callback_suite: %d\n", resultId); fflush(stdout); } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/print.h0000644000175000017500000000216412456307246022513 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/print.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void PrintUsage(const char* appname); void PrintHeader(); void PrintCaseInfo(int index, const char* signature); void PrintCaseResult(int result); void PrintTotalResult(int result); MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/signature_utils.c0000644000175000017500000000220312456307246024565 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/signature_utils.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall_signature.h" const char* SignatureSkipCallPrefix(const char* signature) { if ( signature[0] == DC_SIGCHAR_CC_PREFIX ) { signature += 2; } return signature; } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/signature_utils.h0000644000175000017500000000200412456307246024571 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/signature_utils.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ const char* SignatureSkipCallPrefix(const char* signature); MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/sigstrings.c0000644000175000017500000000215712456307246023550 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/sigstrings.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "_auto_config.h" const char* sigstrings[CONFIG_NSIGS] = { #include "_auto_sigstrings.h" }; const char* GetSignature(int index) { return sigstrings[index]; } MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/sigstrings.h0000644000175000017500000000200112456307246023541 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callback_suite/sigstrings.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ const char* GetSignature(int index); /* index starts at 0 */ MoarVM-2015.11/3rdparty/dyncall/test/callback_suite/stress1.cfg0000644000175000017500000000061012466674236023274 0ustar jnthnjnthni)B i)c i)C i)s i)S i)i i)I i)j i)J i)l i)L i)p i)f i)d ii)B iii)B i)c ii)C iii)C i)i ii)i iii)i iiii)i iiiii)i iiiiii)i iiiiiii)i iiiiiiii)i iiiiiiiii)i iiiiiiiiii)i iiiiiiiiiii)i iiiiiiiiiiii)i l)l ll)l lll)l llll)l lllll)l llllll)l lllllll)l j)j jj)j jjj)j jjjj)j jjjjj)j jjjjjj)j fdfdid)i fdidid)f ffidid)d didddd)l dfdidd)i ddiddd)f jjjjjj)j llllll)l iiiiii)i ffffff)f dddddd)d idfdid)l MoarVM-2015.11/3rdparty/dyncall/test/callf/CMakeLists.txt0000644000175000017500000000010512456307246022053 0ustar jnthnjnthnadd_executable(callf main.c) target_link_libraries(callf dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/callf/Makefile.M0000644000175000017500000000015312456307246021151 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/callf/Makefile.embedded0000644000175000017500000000037312502366750022507 0ustar jnthnjnthnAPP = callf OBJS = main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/callf/Makefile.generic0000644000175000017500000000053312456307246022373 0ustar jnthnjnthnAPP = callf OBJS = main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/callf/Nmakefile0000644000175000017500000000355312456307246021143 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = callf.exe OBJS = main.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = callf.nds OBJS = main.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/callf/dynMakefile0000644000175000017500000000032412456307246021471 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/callf/main.c0000644000175000017500000000537212466674236020425 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/callf/main.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* test dcCallF API */ #include "../../dyncall/dyncall_callf.h" #include #include "../common/platformInit.h" /* sample void function */ int vf_iii(int x,int y,int z) { int r = (x == 1 && y == 2 && z == 3); printf("%d %d %d: %d", x, y, z, r); return r; } int vf_ffiffiffi(float a, float b, int c, float d, float e, int f, float g, float h, int i) { int r = (a == 1.f && b == 2.f && c == 3 && d == 4.f && e == 5.f && f == 6 && g == 7.f && h == 8.f && i == 9); printf("%f %f %d %f %f %d %f %f %d: %d", a, b, c, d, e, f, g, h, i, r); return r; } /* main */ int main(int argc, char* argv[]) { DCCallVM* vm; DCValue ret; int r = 1; dcTest_initPlatform(); /* allocate call vm */ vm = dcNewCallVM(4096); /* calls using 'formatted' API */ dcReset(vm); printf("callf iii)i: "); dcCallF(vm, &ret, (void*)&vf_iii, "iii)i", 1, 2, 3); r = ret.i && r; dcReset(vm); printf("\ncallf ffiffiffi)i: "); dcCallF(vm, &ret, (void*)&vf_ffiffiffi, "ffiffiffi)i", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = ret.i && r; /* arg binding then call using 'formatted' API */ dcReset(vm); printf("\nargf iii)i then call: "); dcArgF(vm, "iii)i", 1, 2, 3); r = r && dcCallInt(vm, (void*)&vf_iii); dcReset(vm); printf("\nargf iii then call: "); dcArgF(vm, "iii", 1, 2, 3); r = r && dcCallInt(vm, (void*)&vf_iii); dcReset(vm); printf("\nargf ffiffiffi)i then call: "); dcArgF(vm, "ffiffiffi)i", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = r && dcCallInt(vm, (void*)&vf_ffiffiffi); dcReset(vm); printf("\nargf ffiffiffi then call: "); dcArgF(vm, "ffiffiffi", 1.f, 2.f, 3, 4.f, 5.f, 6, 7.f, 8.f, 9); r = r && dcCallInt(vm, (void*)&vf_ffiffiffi); /* free vm */ dcFree(vm); printf("\nresult: callf: %d\n", r); dcTest_deInitPlatform(); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/callf/mkfile0000644000175000017500000000222612456307246020513 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = main APPLICATION = callf LIBS = $TOP/dyncall/libdyncall_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/common/platformInit.h0000644000175000017500000000521012456307246022345 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/common/platformInit.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall_macros.h" #if defined(DC__OS_NDS) #include #include void dcTest_initPlatform() { powerOn(POWER_ALL); /* Interrupt handlers. */ /*irqInit();*/ /*irqSet(IRQ_VBLANK, OnIrq);*/ /* Use the touch screen for output. */ videoSetMode(MODE_FB0); vramSetBankA(VRAM_A_LCD); videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetBankC(VRAM_C_SUB_BG); REG_BG0CNT_SUB = BG_MAP_BASE(31); /* Set the colour of the font. */ /* BG_PALETTE_SUB[255] = RGB15(25, 11, 9); */ /* consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16); */ consoleDemoInit(); } void dcTest_deInitPlatform() { /* Main loop - console style. */ while(1) { swiWaitForVBlank(); } } #elif defined(DC__OS_PSP) #include #include #include PSP_MODULE_INFO("dyncall_test",0,1,1); #define printf pspDebugScreenPrintf int exit_callback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0; } int CallbackThread(SceSize args, void *argp) { int cbid; cbid = sceKernelCreateCallback("Exit Callback", &exit_callback, NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0; } void dcTest_initPlatform() { pspDebugScreenInit(); pspDebugScreenClear(); int thid = 0; thid = sceKernelCreateThread("update_thread", &CallbackThread, 0x11, 0xFA0, THREAD_ATTR_USER, 0); if (thid >= 0) sceKernelStartThread(thid, 0, 0); sceDisplayWaitVblankStart(); pspDebugScreenSetXY(0, 0); } void dcTest_deInitPlatform() { sceKernelSleepThread(); sceKernelExitGame(); } #else void dcTest_initPlatform() { } void dcTest_deInitPlatform() { } #endif MoarVM-2015.11/3rdparty/dyncall/test/dynMakefile0000644000175000017500000000025612456307246020414 0ustar jnthnjnthnall: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) all && exit || sh $(?:bat=sh) all clean: ./../buildsys/dynmake/dynmake.bat $(?:/=\\) clean && exit || sh $(?:bat=sh) clean MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/CMakeLists.txt0000644000175000017500000000013012456307246022614 0ustar jnthnjnthnadd_executable(ellipsis main.cc ellipsis.cc) target_link_libraries(ellipsis dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/Makefile.M0000644000175000017500000000015312456307246021714 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/Makefile.embedded0000644000175000017500000000042312502366750023246 0ustar jnthnjnthnAPP = ellipsis OBJS = ellipsis.o main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CXX} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/Makefile.generic0000644000175000017500000000057112456307246023140 0ustar jnthnjnthnAPP = ellipsis OBJS = ellipsis.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CXXFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CXX} ${CXXFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/Nmakefile0000644000175000017500000000377412456307246021713 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = ellipsis.exe OBJS = main.obj ellipsis.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = ellipsis.nds OBJS = main.o ellipsis.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/README.txt0000644000175000017500000000316712456307246021567 0ustar jnthnjnthndyncall stress test suite: testing ellipsis C calls =================================================== Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: ellipsis - run full range ellipsis - run test id ellipsis - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-ellipsis functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/case.h0000644000175000017500000001015212456307246021145 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/ellipsis/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCint,f_i) VF1(2,DClonglong,f_l) VF1(3,DCdouble,f_d) VF1(4,DCpointer,f_p) VF2(5,DCint,DCint,f_ii) VF2(6,DClonglong,DCint,f_li) VF2(7,DCdouble,DCint,f_di) VF2(8,DCpointer,DCint,f_pi) VF2(9,DCint,DClonglong,f_il) VF2(10,DClonglong,DClonglong,f_ll) VF2(11,DCdouble,DClonglong,f_dl) VF2(12,DCpointer,DClonglong,f_pl) VF2(13,DCint,DCdouble,f_id) VF2(14,DClonglong,DCdouble,f_ld) VF2(15,DCdouble,DCdouble,f_dd) VF2(16,DCpointer,DCdouble,f_pd) VF2(17,DCint,DCpointer,f_ip) VF2(18,DClonglong,DCpointer,f_lp) VF2(19,DCdouble,DCpointer,f_dp) VF2(20,DCpointer,DCpointer,f_pp) VF3(21,DCint,DCint,DCint,f_iii) VF3(22,DClonglong,DCint,DCint,f_lii) VF3(23,DCdouble,DCint,DCint,f_dii) VF3(24,DCpointer,DCint,DCint,f_pii) VF3(25,DCint,DClonglong,DCint,f_ili) VF3(26,DClonglong,DClonglong,DCint,f_lli) VF3(27,DCdouble,DClonglong,DCint,f_dli) VF3(28,DCpointer,DClonglong,DCint,f_pli) VF3(29,DCint,DCdouble,DCint,f_idi) VF3(30,DClonglong,DCdouble,DCint,f_ldi) VF3(31,DCdouble,DCdouble,DCint,f_ddi) VF3(32,DCpointer,DCdouble,DCint,f_pdi) VF3(33,DCint,DCpointer,DCint,f_ipi) VF3(34,DClonglong,DCpointer,DCint,f_lpi) VF3(35,DCdouble,DCpointer,DCint,f_dpi) VF3(36,DCpointer,DCpointer,DCint,f_ppi) VF3(37,DCint,DCint,DClonglong,f_iil) VF3(38,DClonglong,DCint,DClonglong,f_lil) VF3(39,DCdouble,DCint,DClonglong,f_dil) VF3(40,DCpointer,DCint,DClonglong,f_pil) VF3(41,DCint,DClonglong,DClonglong,f_ill) VF3(42,DClonglong,DClonglong,DClonglong,f_lll) VF3(43,DCdouble,DClonglong,DClonglong,f_dll) VF3(44,DCpointer,DClonglong,DClonglong,f_pll) VF3(45,DCint,DCdouble,DClonglong,f_idl) VF3(46,DClonglong,DCdouble,DClonglong,f_ldl) VF3(47,DCdouble,DCdouble,DClonglong,f_ddl) VF3(48,DCpointer,DCdouble,DClonglong,f_pdl) VF3(49,DCint,DCpointer,DClonglong,f_ipl) VF3(50,DClonglong,DCpointer,DClonglong,f_lpl) VF3(51,DCdouble,DCpointer,DClonglong,f_dpl) VF3(52,DCpointer,DCpointer,DClonglong,f_ppl) VF3(53,DCint,DCint,DCdouble,f_iid) VF3(54,DClonglong,DCint,DCdouble,f_lid) VF3(55,DCdouble,DCint,DCdouble,f_did) VF3(56,DCpointer,DCint,DCdouble,f_pid) VF3(57,DCint,DClonglong,DCdouble,f_ild) VF3(58,DClonglong,DClonglong,DCdouble,f_lld) VF3(59,DCdouble,DClonglong,DCdouble,f_dld) VF3(60,DCpointer,DClonglong,DCdouble,f_pld) VF3(61,DCint,DCdouble,DCdouble,f_idd) VF3(62,DClonglong,DCdouble,DCdouble,f_ldd) VF3(63,DCdouble,DCdouble,DCdouble,f_ddd) VF3(64,DCpointer,DCdouble,DCdouble,f_pdd) VF3(65,DCint,DCpointer,DCdouble,f_ipd) VF3(66,DClonglong,DCpointer,DCdouble,f_lpd) VF3(67,DCdouble,DCpointer,DCdouble,f_dpd) VF3(68,DCpointer,DCpointer,DCdouble,f_ppd) VF3(69,DCint,DCint,DCpointer,f_iip) VF3(70,DClonglong,DCint,DCpointer,f_lip) VF3(71,DCdouble,DCint,DCpointer,f_dip) VF3(72,DCpointer,DCint,DCpointer,f_pip) VF3(73,DCint,DClonglong,DCpointer,f_ilp) VF3(74,DClonglong,DClonglong,DCpointer,f_llp) VF3(75,DCdouble,DClonglong,DCpointer,f_dlp) VF3(76,DCpointer,DClonglong,DCpointer,f_plp) VF3(77,DCint,DCdouble,DCpointer,f_idp) VF3(78,DClonglong,DCdouble,DCpointer,f_ldp) VF3(79,DCdouble,DCdouble,DCpointer,f_ddp) VF3(80,DCpointer,DCdouble,DCpointer,f_pdp) VF3(81,DCint,DCpointer,DCpointer,f_ipp) VF3(82,DClonglong,DCpointer,DCpointer,f_lpp) VF3(83,DCdouble,DCpointer,DCpointer,f_dpp) VF3(84,DCpointer,DCpointer,DCpointer,f_ppp) MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/config.h0000644000175000017500000000200612456307246021476 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/ellipsis/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 3 #define NTYPES 4 MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/dynMakefile0000644000175000017500000000032412456307246022234 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/ellipsis.cc0000644000175000017500000001100012456307246022205 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/ellipsis/ellipsis.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "config.h" #include "../../dyncall/dyncall.h" #include "../../dyncall/dyncall_value.h" #if defined(__SUNPRO_CC) || defined(__ANDROID__) #include #else #include #endif DCValue mValue[NARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DClong value, int pos) { mValue[pos].l = value; } template<> void g(DClonglong value, int pos) { mValue[pos].L = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void S () {gID=id;} #define VF1(id,A1,S) void S (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);va_end(l);} #define VF3(id,A1,A2,A3,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(va_arg(l,A3),2);va_end(l);} #define VF4(id,A1,A2,A3,A4,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(va_arg(l,A3),2);g(va_arg(l,A4),3);va_end(l);} #define VF5(id,A1,A2,A3,A4,A5,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(va_arg(l,A3),2);g(va_arg(l,A4),3);g(va_arg(l,A5),4);va_end(l);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(va_arg(l,A3),2);g(va_arg(l,A4),3);g(va_arg(l,A5),4);g(va_arg(l,A6),5);va_end(l);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(va_arg(l,A3),2);g(va_arg(l,A4),3);g(va_arg(l,A5),4);g(va_arg(l,A6),5);g(va_arg(l,A7),6);va_end(l);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);va_end(l);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);va_end(l);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void S (A1 a1, ...) {va_list l;va_start(l,a1);gID=id;g(a1,0);g(va_arg(l,A2),1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);va_end(l);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #define VF0(id,S) (void*)S, #define VF1(id,A1,S) (void*)S, #define VF2(id,A1,A2,S) (void*)S, #define VF3(id,A1,A2,A3,S) (void*)S, #define VF4(id,A1,A2,A3,A4,S) (void*)S, #define VF5(id,A1,A2,A3,A4,A5,S) (void*)S, #define VF6(id,A1,A2,A3,A4,A5,A6,S) (void*)S, #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) (void*)S, #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) (void*)S, #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) (void*)S, #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) (void*)S, DCpointer gFuncTable[] = { #include "case.h" }; DCpointer getFunc(int x) { return gFuncTable[x]; } MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/main.cc0000644000175000017500000001000112456307246021305 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/ellipsis/main.cc Description: call (...) functions via dyncall library, targets are auto-generated License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "config.h" #include #include "../../dyncall/dyncall.h" #include "../../dyncall/dyncall_value.h" #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); DCint valueInt [NARGS]; DClonglong valueLongLong[NARGS]; DCdouble valueDouble [NARGS]; DCpointer valuePointer [NARGS]; bool equals(int select, int pos, void* data) { switch(select) { case 0: return ( getArg(pos)->i == valueInt [pos] ); break; case 1: return ( getArg(pos)->l == valueLongLong[pos] ); break; case 2: return ( getArg(pos)->d == valueDouble [pos] ); break; case 3: return ( getArg(pos)->p == valuePointer [pos] ); break; } return false; } void clearValues(); void init() { for (int i = 0 ; i < NARGS ; ++i ) { valueInt [i] = DCint (i); valueLongLong[i] = DClonglong(i); valueDouble [i] = DCdouble (i); valuePointer [i] = DCpointer (i); } } void arg(DCCallVM* pCall, int select, int pos) { switch(select) { case 0: dcArgInt ( pCall, valueInt [pos] ); break; case 1: dcArgLongLong( pCall, valueLongLong[pos] ); break; case 2: dcArgDouble ( pCall, valueDouble [pos] ); break; case 3: dcArgPointer ( pCall, valuePointer [pos] ); break; } } #define assert(x) if (!(x)) return false bool test_ellipsis_case(int x) { clearValues(); DCCallVM* pCall = dcNewCallVM(4096); assert( dcGetError(pCall) == DC_ERROR_NONE ); dcMode(pCall, DC_CALL_C_ELLIPSIS); assert( dcGetError(pCall) == DC_ERROR_NONE ); int y = x; int selects[NARGS] = { 0 }; int pos = 0; if (y > 0) { int select = (y-1) % NTYPES; selects[pos] = select; arg(pCall,select,pos); y = (y-1) / NTYPES; ++pos; } dcMode(pCall, DC_CALL_C_ELLIPSIS_VARARGS); for(; y>0; ++pos) { int select = (y-1) % NTYPES; selects[pos] = select; arg(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(int i=0; i( pow((double)x,n)+powerfact(x,n-1) ); } bool run_range(int from, int to) { bool tr = true; for (int i = from ; i < to ; ++i ) { printf("%d:", i); bool r = test_ellipsis_case(i); printf("%d\n", r); tr &= r; } return tr; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { int ncalls = powerfact(NTYPES,NARGS)+1; success = run_range(0,ncalls); } printf("result: ellipsis: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/ellipsis/mkcase.py0000644000175000017500000000367112456307246021706 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys # parameters nargs = 3 # all types without (float) types = ["DCint","DClonglong","DCdouble","DCpointer"] sigs = ['i','l','d','p'] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types[s] ] sig += [ sigs[s] ] # types[s][2] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/Makefile0000644000175000017500000000012012456307246021373 0ustar jnthnjnthnall: call_x86.masm call_x64.masm %.masm: %.S ${CPP} -E -P -DGEN_MASM $< -o $@ MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/call_x64.S0000644000175000017500000001072212456307246021504 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/gen-masm/call_x64.S Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(GEN_MASM) .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) X ENDP #else .intel_syntax .text # define BEGIN_ASM # define END_ASM # define GLOBAL(X) .globl X # define BEGIN_PROC(X) X: # define END_PROC(X) #endif BEGIN_ASM // --------------------------------------------------------------------------- // Call Kernel for x64 System V GLOBAL(dcCall_x64_sysv) BEGIN_PROC(dcCall_x64_sysv) // rdi : size of arguments to be passed via stack // rsi : pointer to arguments to be passed via the stack // rdx : pointer to arguments of integral/pointer type to be passed via registers // rcx : pointer to arguments of floating point type to be passed via registers // r8 : target function pointer push rbp // Pseudo-prolog - preserve rbp. push rbx // Preserve rbx and store pointer to function in it. mov rbp, rsp // Store stack pointer in rbp. mov rbx, r8 movsd xmm0, qword ptr[rcx ] // Copy first 8 floats to xmm0-xmm7 (this makes rcx free to use). movsd xmm1, qword ptr[rcx+ 8] movsd xmm2, qword ptr[rcx+16] movsd xmm3, qword ptr[rcx+24] movsd xmm4, qword ptr[rcx+32] movsd xmm5, qword ptr[rcx+40] movsd xmm6, qword ptr[rcx+48] movsd xmm7, qword ptr[rcx+56] sub rsp, rdi // Setup stack frame by subtracting the size of the arguments. mov rax, rdi // Align stack. add rax, 8 and rax, 15 sub rsp, rax mov rcx, rdi // Store number of bytes to copy to stack in rcx (for rep movsb). mov rdi, rsp // Store pointer to beginning of stack arguments in rdi (for rep movsb). rep movsb // @@@ should be optimized (e.g. movq) mov rdi, qword ptr[rdx ] // Copy first six int/pointer arguments to rdi, rsi, rdx, rcx, r8, r9. mov rsi, qword ptr[rdx+ 8] mov rcx, qword ptr[rdx+24] mov r8, qword ptr[rdx+32] mov r9, qword ptr[rdx+40] mov rdx, qword ptr[rdx+16] /* Set rdx last to not overwrite it to soon. */ mov al, 8 /* Put upper bound of number of used xmm registers in al. */ call rbx /* Invoke function. */ mov rsp, rbp /* Restore stack pointer (such that we can pop the preserved values). */ pop rbx /* Restore rbx. */ pop rbp /* Pseudo-epilog. */ ret END_PROC(dcCall_x64_sysv) // --------------------------------------------------------------------------- // Call Kernel for x64 Win64 GLOBAL(dcCall_x64_win64) BEGIN_PROC(dcCall_x64_win64) push rbp // Pseudo-prolog - preserve rbp. push rsi // Preserve rsi and rdi. push rdi mov rbp, rsp // Store stack pointer in rbp. sub rsp, rcx // Setup stack frame by subtracting the size of the arguments. mov rax, rcx // Align stack. add rax, 8 and rax, 15 sub rsp, rax mov rsi, rdx // Let rsi point to the arguments. mov rdi, rsp // Store pointer to beginning of stack arguments in rdi (for rep movsb). mov rax, r9 // Put function address in rax. rep movsb // @@@ should be optimized (e.g. movq) mov rcx, qword ptr[r8 ] // Copy first four arguments to rcx, rdx, r8, r9 and xmm0-xmm3. mov rdx, qword ptr[r8+ 8] mov r9, qword ptr[r8+24] // Set r9 first to not overwrite r8 too soon. mov r8, qword ptr[r8+16] movd xmm0, rcx movd xmm1, rdx movd xmm2, r8 movd xmm3, r9 push r9 // Push first four arguments onto the stack preserve area. push r8 push rdx push rcx call rax // Invoke function. mov rsp, rbp // Restore stack pointer (such that we can pop the preserved values). pop rdi // Restore rsi and rdi. pop rsi pop rbp // Pseudo-epilog. ret END_PROC(dcCall_x64_win64) END_ASM MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/call_x64.masm0000644000175000017500000000227512466674236022252 0ustar jnthnjnthn.CODE dcCall_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push rbp push rbx mov rbp, rsp mov rbx, r8 movsd xmm0, qword ptr[rcx ] movsd xmm1, qword ptr[rcx+ 8] movsd xmm2, qword ptr[rcx+16] movsd xmm3, qword ptr[rcx+24] movsd xmm4, qword ptr[rcx+32] movsd xmm5, qword ptr[rcx+40] movsd xmm6, qword ptr[rcx+48] movsd xmm7, qword ptr[rcx+56] sub rsp, rdi mov rax, rdi add rax, 8 and rax, 15 sub rsp, rax mov rcx, rdi mov rdi, rsp rep movsb mov rdi, qword ptr[rdx ] mov rsi, qword ptr[rdx+ 8] mov rcx, qword ptr[rdx+24] mov r8, qword ptr[rdx+32] mov r9, qword ptr[rdx+40] mov rdx, qword ptr[rdx+16] mov al, 8 call rbx mov rsp, rbp pop rbx pop rbp ret dcCall_x64_sysv ENDP dcCall_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push rbp push rsi push rdi mov rbp, rsp sub rsp, rcx mov rax, rcx add rax, 8 and rax, 15 sub rsp, rax mov rsi, rdx mov rdi, rsp mov rax, r9 rep movsb mov rcx, qword ptr[r8 ] mov rdx, qword ptr[r8+ 8] mov r9, qword ptr[r8+24] mov r8, qword ptr[r8+16] movd xmm0, rcx movd xmm1, rdx movd xmm2, r8 movd xmm3, r9 push r9 push r8 push rdx push rcx call rax mov rsp, rbp pop rdi pop rsi pop rbp ret dcCall_x64_win64 ENDP END MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/call_x86.S0000644000175000017500000001753012466674236021523 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/gen-masm/call_x86.S Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #if defined(GEN_MASM) .386 .MODEL FLAT .CODE # define BEGIN_ASM # define END_ASM END # define GLOBAL(X) _##X PROC # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE # define END_PROC(X) _##X ENDP # define HEX(X) X##h #else .intel_syntax .text # define BEGIN_ASM # define END_ASM # include "../../dyncall/dyncall_macros.h" # if defined(DC__OS_Win32) || defined(DC__OS_Cygwin) || defined(DC__OS_MinGW) || defined(DC__OS_Darwin) # define CSYM(X) _##X # else # define CSYM(X) X # endif # define GLOBAL(X) .globl CSYM(X) # define BEGIN_PROC(X) CSYM(X): # define END_PROC(X) # define HEX(X) 0x##X #endif // Package: dyncall // File: dyncall/dyncall_call_x86_gas.S // Description: All x86 abi call kernel implementations in GNU Assembler using C Preprocessor // License: // // Copyright (c) 2007-2010 Daniel Adler , // Tassilo Philipp // // Permission to use, copy, modify, and distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // // === end of macros ========================================================== // ============================================================================ // DynCall Call Kernels for X86 Architecture // ---------------------------------------------------------------------------- // C Interface: // dcCall_x86_XXX(void* target, void* args, size_t size); // // Parameter Stack layout: // size := ebp + 16 // args := ebp + 12 // target := ebp + 8 // // NOTES: // - epilog restore esp serves callee cleanup // --- default / cdecl -------------------------------------------------------- // - caller clean-up BEGIN_ASM GLOBAL(dcCall_x86_cdecl) BEGIN_PROC(dcCall_x86_cdecl) push ebp // prolog mov ebp, esp push esi // save preserved push edi mov esi, dword ptr[ebp+12] // esi = copy source args mov ecx, dword ptr[ebp+16] // ecx = size sub esp, ecx // alloc stack size mov edi, esp // edi = copy target stack shr ecx, 2 // ecx = count DWORDs rep movsd // copy DWORDs call dword ptr[ebp+8] // call target add esp, dword ptr[ebp+16] // cleanup stack pop edi // restore preserved pop esi mov esp, ebp // epilog pop ebp ret END_PROC(dcCall_x86_cdecl) // ---- C++ this calls (microsoft) ------------------------------------------ // Details: // - this pointer is in ECX GLOBAL(dcCall_x86_win32_msthis) BEGIN_PROC(dcCall_x86_win32_msthis) push ebp // prolog mov ebp, esp push esi // save preserved push edi mov esi, dword ptr [ebp+12] // esi = pointer on args mov ecx, dword ptr [ebp+16] // ecx = size mov eax, dword ptr [esi+0] // eax = this pointer add esi, 4 // increment args pointer by thisptr sub ecx, 4 // decrement size by sizeof(thisptr) sub esp, ecx // allocate argument-block on stack mov edi, esp // edi = stack args rep movsb // copy arguments mov ecx, eax // ecx = this pointer call dword ptr[ebp+8] // call function pop edi // restore preserved pop esi mov esp, ebp // epilog pop ebp ret END_PROC(dcCall_x86_win32_msthis) // ---- win32 stdcall --------------------------------------------------------- // - callee cleans up stack GLOBAL(dcCall_x86_win32_std) BEGIN_PROC(dcCall_x86_win32_std) push ebp // prolog mov ebp, esp push esi // save esi, edi push edi mov esi, dword ptr[ebp+12] // esi = args mov ecx, dword ptr[ebp+16] // ecx = size sub esp, ecx // allocate size bytes on stack mov edi, esp // edi = copy destination stack rep movsb // copy BYTEs call dword ptr[ebp+8] // call target pop edi // restore edi, esi */ pop esi mov esp, ebp // epilog pop ebp ret END_PROC(dcCall_x86_win32_std) // ---- win32 fastcall (GNU/Microsoft) ---------------------------------------- // - callee cleans up stack // - first two integer (up to 32bits) are passed in ECX and EDX GLOBAL(dcCall_x86_win32_fast) BEGIN_PROC(dcCall_x86_win32_fast) push ebp // prolog mov ebp, esp push esi // save preserved push edi mov esi, dword ptr[ebp+12] // esi = copy source args mov ecx, dword ptr[ebp+16] // ecx = size mov eax, dword ptr[esi+0] // eax = first argument mov edx, dword ptr[esi+4] // edx = second argument add esi, 8 // skip registers sub ecx, 8 // mov dword ptr [ebp+16], ecx // save stack alloc size sub esp, ecx // allocate stack mov edi, esp // edi = stack args rep movsb // copy BYTEs mov ecx, eax // ecx = first argument call dword ptr[ebp+8] // call target pop edi // restore preserved pop esi mov esp, ebp // epilog pop ebp ret END_PROC(dcCall_x86_win32_fast) // --- syscall int80 linux --------------------------------------------------- // - all arguments are passed via registers GLOBAL(dcCall_x86_sys_int80h_linux) BEGIN_PROC(dcCall_x86_sys_int80h_linux) push ebp // prolog mov ebp, esp push ebx // save preserved push esi push edi mov eax, dword ptr[ebp+12] // eax = argument buffer mov ebx, dword ptr[eax+0] // move first five arguments mov ecx, dword ptr[eax+4] mov edx, dword ptr[eax+8] mov esi, dword ptr[eax+12] mov edi, dword ptr[eax+16] mov eax, dword ptr[ebp+8] // eax = syscall id int HEX(80) pop edi // restore preserved pop esi pop ebx mov esp, ebp // epilog pop ebp ret END_PROC(dcCall_x86_sys_int80h_linux) // --- syscall int80 bsd ----------------------------------------------------- // - all arguments are passed via stack GLOBAL(dcCall_x86_sys_int80h_bsd) BEGIN_PROC(dcCall_x86_sys_int80h_bsd) push ebp // prolog mov ebp, esp push esi // save preserved push edi mov esi, dword ptr[ebp+12] // esi = pointer on args mov ecx, dword ptr[ebp+16] // ecx = size sub esp, ecx // allocate stack space mov edi, esp // edi = stack args shr ecx, 2 // ecx = number of DWORDs rep movsd // copy DWORDs mov eax, dword ptr[ebp+8] // load system call id call _do_int pop edi // restore preserved pop esi mov esp, ebp // epilog pop ebp ret _do_int: int HEX(80) ret END_PROC(dcCall_x86_sys_int80h_bsd) END_ASM MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/call_x86.masm0000644000175000017500000000426312466674236022255 0ustar jnthnjnthn.386 .MODEL FLAT .CODE _dcCall_x86_cdecl PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push esi push edi mov esi, dword ptr[ebp+12] mov ecx, dword ptr[ebp+16] sub esp, ecx mov edi, esp shr ecx, 2 rep movsd call dword ptr[ebp+8] add esp, dword ptr[ebp+16] pop edi pop esi mov esp, ebp pop ebp ret _dcCall_x86_cdecl ENDP _dcCall_x86_win32_msthis PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push esi push edi mov esi, dword ptr [ebp+12] mov ecx, dword ptr [ebp+16] mov eax, dword ptr [esi+0] add esi, 4 sub ecx, 4 sub esp, ecx mov edi, esp rep movsb mov ecx, eax call dword ptr[ebp+8] pop edi pop esi mov esp, ebp pop ebp ret _dcCall_x86_win32_msthis ENDP _dcCall_x86_win32_std PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push esi push edi mov esi, dword ptr[ebp+12] mov ecx, dword ptr[ebp+16] sub esp, ecx mov edi, esp rep movsb call dword ptr[ebp+8] pop edi pop esi mov esp, ebp pop ebp ret _dcCall_x86_win32_std ENDP _dcCall_x86_win32_fast PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push esi push edi mov esi, dword ptr[ebp+12] mov ecx, dword ptr[ebp+16] mov eax, dword ptr[esi+0] mov edx, dword ptr[esi+4] add esi, 8 sub ecx, 8 mov dword ptr [ebp+16], ecx sub esp, ecx mov edi, esp rep movsb mov ecx, eax call dword ptr[ebp+8] pop edi pop esi mov esp, ebp pop ebp ret _dcCall_x86_win32_fast ENDP _dcCall_x86_sys_int80h_linux PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push ebx push esi push edi mov eax, dword ptr[ebp+12] mov ebx, dword ptr[eax+0] mov ecx, dword ptr[eax+4] mov edx, dword ptr[eax+8] mov esi, dword ptr[eax+12] mov edi, dword ptr[eax+16] mov eax, dword ptr[ebp+8] int 80h pop edi pop esi pop ebx mov esp, ebp pop ebp ret _dcCall_x86_sys_int80h_linux ENDP _dcCall_x86_sys_int80h_bsd PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push ebp mov ebp, esp push esi push edi mov esi, dword ptr[ebp+12] mov ecx, dword ptr[ebp+16] sub esp, ecx mov edi, esp shr ecx, 2 rep movsd mov eax, dword ptr[ebp+8] call _do_int pop edi pop esi mov esp, ebp pop ebp ret _do_int: int 80h ret _dcCall_x86_sys_int80h_bsd ENDP END MoarVM-2015.11/3rdparty/dyncall/test/gen-masm/gen_masm.sh0000755000175000017500000000013712466674236022077 0ustar jnthnjnthngcc -E -P -DGEN_MASM call_x86.S >call_x86.masm gcc -E -P -DGEN_MASM call_x64.S >call_x64.masm MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile0000644000175000017500000000003112456307246025210 0ustar jnthnjnthninclude Makefile.darwin MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.darwin0000644000175000017500000000115112456307246026477 0ustar jnthnjnthnTARGETS = test TARGET_ARCH += -arch armv6 TARGET_ARCH += -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk # TARGET_ARCH += -mno-thumb-interwork # TARGET_ARCH += -mthumb-interwork CFLAGS += -mthumb # CFLAGS = -mthumb-interwork # CFLAGS_THUMB = -mthumb $(CFLAGS) # CFLAGS += -mthumb-interwork all: $(LOADLIBES) test thumb.o: thumb.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $(TARGET_ARCH) -mthumb $< -o $@ arm.o: arm.c test.o: test.c test: test.o thumb.o arm.o $(LINK.o) $^ $(OUTPUT_OPTION) %.s: %.c $(CC) -S $(CPPFLAGS) $(CFLAGS) $(TARGET_ARCH) $< -o $@ clean: $(RM) $(TARGETS) *.o MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.linux0000644000175000017500000000031612456307246026354 0ustar jnthnjnthnTARGETS = test TARGET_ARCH += -mthumb-interwork all: test thumb.o: thumb.c $(COMPILE.c) $< -mthumb $(OUTPUT_OPTION) test: test.o thumb.o arm.o $(LINK.o) $^ $(OUTPUT_OPTION) clean: $(RM) $(TARGETS) *.o MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/README.txt0000644000175000017500000000026612456307246025260 0ustar jnthnjnthndarwin: armv6: addresses are even arm addresses are even thumb addresses are odd armv7: addresses are odd -mthumb-interwork and -mno-thumb-interwork no effect MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/arm.c0000644000175000017500000000173112456307246024503 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-arm-thumb-interwork/arm.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void arm() { } MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/Makefile0000644000175000017500000000033312456307246027576 0ustar jnthnjnthndefault: all .PHONY: all clean TOP = ../../.. include $(TOP)/ConfigVars ifeq ("${CONFIG_OS}","iphoneos") DIFFSCRIPT=diff-iphoneos.sh else DIFFSCRIPT=diff-generic.sh endif all: sh ${DIFFSCRIPT} clean: rm -Rf out MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/diff-generic.sh0000644000175000017500000000126412456307246031020 0ustar jnthnjnthn#!/bin/sh TARGET_ARCH="-arch armv7" mkdir -p out # ARCHS="armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5t armv5te armv6 armv6j armv6t2 armv6z armv7-a armv7-r ep9312" ARCHS="armv2" # armv7 armv7-m iwmmxt touch empty.c touch empty.S gcc ${TARGET_ARCH} -E -dM empty.c | sort >out/c_default gcc ${TARGET_ARCH} -E -dM empty.S | sort >out/a_default rm -f out/diff_c out/diff_a for a in ${ARCHS} ; do gcc ${TARGET_ARCH} -E -dM -march=${a} empty.c | sort >out/c_${a} gcc ${TARGET_ARCH} -E -dM -march=${a} empty.S | sort >out/a_${a} echo ${a} >>out/diff_c echo ${a} >>out/diff_a diff out/c_default out/c_${a} >>out/diff_c diff out/a_default out/a_${a} >>out/diff_a done # armv3 is default. MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.S0000644000175000017500000000173112456307246027423 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.S Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.c0000644000175000017500000000173112456307246027443 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/test.c0000644000175000017500000000226012456307246024701 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-arm-thumb-interwork/test.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include void arm(); void thumb(); int main(int argc, char* argv[]) { arm(); thumb(); printf("arm: %d\n", (ptrdiff_t) &arm); printf("thumb: %d\n", (ptrdiff_t) &thumb); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/hacking-arm-thumb-interwork/thumb.c0000644000175000017500000000173512456307246025047 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-arm-thumb-interwork/thumb.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void thumb() { } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/Makefile0000644000175000017500000000027112456307246022250 0ustar jnthnjnthnCFLAGS = MODULES = main.o dispatch.o f.o node.o call.o TARGETS = calls.s test all: $(TARGETS) test: $(MODULES) $(CC) $^ -o $@ %.s: %.c $(CC) -S $< -o $@ clean: $(RM) $(TARGETS) *.o MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/README.txt0000644000175000017500000000010112456307246022276 0ustar jnthnjnthnhere are some snippets that helped when exploring the mips abis. MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/call.c0000644000175000017500000000204512456307246021670 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/call.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void call_f0() { n0(); } void call_f4() { n4(1,2,3,4); } void call_f8() { n8(1,2,3,4,5,6,7,8); } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/calls.c0000644000175000017500000000446312456307246022061 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/calls.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ typedef int i; typedef float f; typedef double d; void _(); void _iiiiiiiiii(i,i,i,i,i,i,i,i,i,i); void _ffffffffff(f,f,f,f,f,f,f,f,f,f); void _dddddddddd(d,d,d,d,d,d,d,d,d,d); void _ifffffffff(i,f,f,f,f,f,f,f,f,f); void _iddddddddd(i,d,d,d,d,d,d,d,d,d); void _fdidfd(f,d,i,d,f,d); void _ddidfd(d,d,i,d,f,d); void _ididfd(i,d,i,d,f,d); int ai[] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; float af[] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f }; double ad[] = { 0.0 , 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 , 8.0 , 9.0 }; void call_() { _(); } void call_iiiiiiiiii() { _iiiiiiiiii(ai[0],ai[1],ai[2],ai[3],ai[4],ai[5],ai[6],ai[7],ai[8],ai[9]); } void call_ffffffffff() { _ffffffffff(af[0],af[1],af[2],af[3],af[4],af[5],af[6],af[7],af[8],af[9]); } void call_dddddddddd() { _dddddddddd(ad[0],ad[1],ad[2],ad[3],ad[4],ad[5],ad[6],ad[7],ad[8],ad[9]); } void call_ifffffffff() { _ifffffffff(ai[0],af[1],af[2],af[3],af[4],af[5],af[6],af[7],af[8],af[9]); } void call_iddddddddd() { _iddddddddd(ai[0],ad[1],ad[2],ad[3],ad[4],ad[5],ad[6],ad[7],ad[8],ad[9]); } void call_fififififi() { _fififififi(af[0],ai[1],af[2],ai[3],af[4],ai[5],af[6],ai[7],af[8],ai[9]); } void call_fdidfd() { _fdidfd(1.0f,2.0, 3 ,4.0, 5.0f,6.0 ); } void call_ddidfd() { _ddidfd(1.0, 2.0, 3 ,4.0, 5.0f,6.0 ); } void call_ididfd() { _ididfd(1 , 2.0, 3 ,4.0, 5.0f,6.0 ); } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/common.h0000644000175000017500000000252612456307246022256 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/common.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ typedef int (*fp)(int,int,int,int,int,int); extern int f(int,int,int,int,int,int); extern int dispatch(fp,int,int,int,int,int,int); extern void ext(); extern void n0(); extern void n1(int a); extern void n2(int a, int b); extern void n4(int a, int b, int c, int d); extern void n8(int a, int b, int c, int d, int e, int f, int g, int h); extern void call_f0(); extern void call_f4(); extern void call_f8(); MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/dispatch.c0000644000175000017500000000222512456307246022554 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/dispatch.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "common.h" int dispatch(fp funptr, int a0, int a1, int a2, int a3, int a4, int a5) { return funptr(a0,a1,a2,a3,a4,a5); /* int result1 = funptr(a0,a1,a2,a3,a4,a5); return result1 + a0 + a1 + a2; */ } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/f.c0000644000175000017500000000204312456307246021200 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/f.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "common.h" int f(int a0, int a1, int a2, int a3, int a4, int a5) { return a0+a1+a2+a3+a4+a5; } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/f0.c0000644000175000017500000000171012456307246021260 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/f0.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ void f0() { } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/funs.c0000644000175000017500000000210312456307246021723 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/funs.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ typedef float f; f _ffffffffff(f f0, f f1, f f2, f f3, f f4, f f5, f f6, f f7, f f8, f f9) { return f0+f1+f2+f3+f4+f5+f6+f7+f8+f9; } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/main.c0000644000175000017500000000244512456307246021705 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/main.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "common.h" #include #define v0 0 #define v1 1 #define v2 2 #define v3 3 #define v4 4 #define v5 5 void ext() { } int main(int argc, char* argv[]) { int result; call_f0(); call_f4(); call_f8(); n0(); n8(1,2,3,4,5,6,7,8); result = dispatch(&f,v0,v1,v2,v3,v4,v5); assert(result == v0+v1+v2+v3+v4+v5+v0+v1+v2 ); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/node.c0000644000175000017500000000250312456307246021701 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/node.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "common.h" void l0() { } void l1(int a) { } void l2(int a, int b) { } void l4(int a, int b, int c, int d) { } void l8(int a, int b, int c, int d, int e, int f, int g, int h) { } void n0() { ext(); } void n1(int a) { ext(); } void n2(int a, int b) { ext(); } void n4(int a, int b, int c, int d) { ext(); } void n8(int a, int b, int c, int d, int e, int f, int g, int h) { ext(); } MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/prolog.c0000644000175000017500000000300512456307246022254 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/prolog.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define DEF_CALL1(RT) \ typedef RT (*f_##RT) (i,i,i,i,i,i,i,i); \ RT call_##RT(void* target,void* regdata, int* data, int size) \ { \ f_##RT f = (f_##RT) target; \ return f(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]); \ } #define DEF_CALL(RT) \ typedef RT (*f_##RT) (i,i,i,i,i,i,i,i); \ RT call_##RT(void* target,void* regdata, int* data, int size) \ { \ f_##RT f = (f_##RT) target; \ return f(); \ } typedef long long llong; typedef long double ldouble; DEF_CALL(int) DEF_CALL(float) DEF_CALL(double) DEF_CALL(llong) DEF_CALL(ldouble) DEF_CALL(void) MoarVM-2015.11/3rdparty/dyncall/test/hacking-mips/retn.c0000644000175000017500000000214512456307246021726 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/hacking-mips/retn.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define DEF_RETN(N) int ret##N(int a0, int a1, int a2, int a3, int a4, int a5) { return a##N; } DEF_RETN(0) DEF_RETN(1) DEF_RETN(2) DEF_RETN(3) DEF_RETN(4) DEF_RETN(5) MoarVM-2015.11/3rdparty/dyncall/test/makepkg.sh0000755000175000017500000000122512456307246020214 0ustar jnthnjnthn#!/bin/sh # script to package some tests for quick deployment (useful for embedded stuff) TOP=.. . $TOP/ConfigVars TESTS="callf ellipsis malloc_wx plain plain_c++ suite suite2 suite3 suite_floats callback_plain callback_suite" # addition test: # # callback_plain callback_suite callf # ellipsis # malloc_wx thunk # nm # plain suite suite2 suite3 # suite2_x86win32fast suite2_x86win32std suite_x86win32fast suite_x86win32std TARGET="${CONFIG_OS}_${CONFIG_ARCH}_${CONFIG_TOOL}_${CONFIG_CONFIG}" BUILD_DIR=build_out mkdir -p pack_out/testpkg for I in $TESTS ; do cp $I/$BUILD_DIR/$TARGET/$I pack_out/testpkg done tar -cvzf test-pack.tar.gz -C pack_out testpkg MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/CMakeLists.txt0000644000175000017500000000012412456307246022760 0ustar jnthnjnthnadd_executable(malloc_wx test_wx.c) target_link_libraries(malloc_wx dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/Makefile.M0000644000175000017500000000015312456307246022055 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/Makefile.embedded0000644000175000017500000000044012502366750023406 0ustar jnthnjnthnAPP = malloc_wx OBJS = test_wx.o TOP = ../.. CFLAGS += -I${TOP}/dyncallback -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncallback LDLIBS += -ldyncallback_s all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/Makefile.generic0000644000175000017500000000060312456307246023275 0ustar jnthnjnthnAPP = malloc_wx OBJS = test_wx.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncallback -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncallback -ldyncallback_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/Nmakefile0000644000175000017500000000370112456307246022042 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = malloc_wx.exe OBJS = test_wx.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib $(TOP)\dyncallback\libdyncallback_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = malloc_wx.nds OBJS = test_wx.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a $(TOP)\dyncallback\libdyncallback_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/dynMakefile0000644000175000017500000000032412456307246022375 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/mkfile0000644000175000017500000000224012456307246021413 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = test_wx APPLICATION = malloc_wx LIBS = $TOP/dyncallback/libdyncallback_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/malloc_wx/test_wx.c0000644000175000017500000000242312456307246022065 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/malloc_wx/test_wx.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncallback/dyncall_alloc_wx.h" #include #include "../common/platformInit.h" int main() { int err; void* ptr; dcTest_initPlatform(); err = dcAllocWX(23, &ptr); if(!err) dcFreeWX(ptr, 23); printf("result: test_alloc_wx: %d\n", (!err) ? 1 : 0 ); dcTest_deInitPlatform(); return err; } MoarVM-2015.11/3rdparty/dyncall/test/mkfile0000644000175000017500000000242512456307246017433 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = .. <$TOP/buildsys/mk/prolog.mk # only C-stuff for now... DIRS = callf plain call_suite suite thunk malloc_wx callback_plain callback_suite # plain_c++ is not included, b/c C++ on Plan9 is rather inexistant #DIRS = suite2 suite3 suite_floats ellipsis <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/nm/CMakeLists.txt0000644000175000017500000000011612466674236021415 0ustar jnthnjnthnadd_executable(nm nm.c) target_link_libraries(nm dynload_s ${CMAKE_DL_LIBS}) MoarVM-2015.11/3rdparty/dyncall/test/nm/Makefile.M0000644000175000017500000000015312456307246020502 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/nm/Makefile.embedded0000644000175000017500000000043412502366750022036 0ustar jnthnjnthnAPP = nm OBJS = nm.o TOP = ../.. CFLAGS += -I${TOP}/dynload LDFLAGS += -L${TOP}/dynload LDLIBS += -ldynload_s # Works on: Darwin, NetBSD. # Linux: add '-ldl' all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o $@ clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/nm/Makefile.generic0000644000175000017500000000063612466674236021737 0ustar jnthnjnthnAPP = nm OBJS = nm.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dynload LDLIBS_D += -L${BLDTOP}/dynload -ldynload_s # Works on: Darwin, NetBSD. # Linux: add '-ldl' .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS_D} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/nm/Nmakefile0000644000175000017500000000365612456307246020500 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = nm.exe OBJS = nm.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dynload\libdynload_s.lib $(TOP)\dyncall\libdyncall_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = nm.nds OBJS = nm.o $(TARGETS):# $(OBJS) echo Not building: There is no dynload support on this platform. # echo Linking $@ ... # $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)\dynload\libdynload_s.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" # $(OCP) -O binary "$(@B).elf" "$(@B).arm9" # ndstool -c "$@" -9 "$(@B).arm9" # del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/nm/dynMakefile0000644000175000017500000000032412456307246021022 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/nm/nm.c0000644000175000017500000000341512456307246017431 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/nm/nm.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dynload/dynload.h" #include "../../dynload/dynload_alloc.h" #include void list_syms(const char* filePath) { DLSyms* pSyms; int i,n; pSyms = dlSymsInit(filePath); if (!pSyms) { fprintf(stderr, "dlSymsInit fail."); return; } i = 0, n = dlSymsCount(pSyms); for (; i < n; ++i) { const char* name = dlSymsName(pSyms,i); printf("%s\n", name); } dlSymsCleanup(pSyms); } int main(int argc, char* argv[]) { int i, n; DLLib* pLib; const char* libPath; if (argc == 1) { fprintf(stderr, "usage : %s \n", argv[0]); return 1; } libPath = argv[1]; /* load lib */ pLib = dlLoadLibrary(libPath); if (!pLib) { fprintf(stderr, "unable to open library %s\n", libPath); return 2; } list_syms(libPath); dlFreeLibrary(pLib); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/plain/CMakeLists.txt0000644000175000017500000000013112456307246022074 0ustar jnthnjnthnadd_executable(plain test_main.c test_structs.c) target_link_libraries(plain dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/plain/Makefile.M0000644000175000017500000000036312456307246021176 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: plain plain: _O(test_main) _O(test_structs) _(CC) _(CFLAGS) _(PREREQS) _(LDFLAGS) _(LDFLAG_IN_PREFIX)dyncall_s _(LDFLAG_OUT_PREFIX)_(TARGET) clean: _(RM) _O(*) _(RM) plain MoarVM-2015.11/3rdparty/dyncall/test/plain/Makefile.embedded0000644000175000017500000000042612502366750022530 0ustar jnthnjnthnAPP = plain OBJS = test_main.o test_structs.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/plain/Makefile.generic0000644000175000017500000000056012456307246022415 0ustar jnthnjnthnAPP = plain OBJS = test_main.o test_structs.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/plain/Nmakefile0000644000175000017500000000370112456307246021160 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = plain.exe OBJS = test_main.obj test_structs.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = plain.nds OBJS = test_main.o test_structs.o $(TARGETS):# $(OBJS) echo Not building: There is no struct support on this platform @@@ or not taken into account. # echo Linking $@ ... # $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" # $(OCP) -O binary "$(@B).elf" "$(@B).arm9" # ndstool -c "$@" -9 "$(@B).arm9" # del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/plain/dynMakefile0000644000175000017500000000032412456307246021513 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/plain/mkfile0000644000175000017500000000225012456307246020532 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = test_main test_structs APPLICATION = plain LIBS = $TOP/dyncall/libdyncall_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/plain/test_framework.h0000644000175000017500000000442112456307246022547 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/plain/test_framework.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef TRUE #define TRUE (1) #endif #ifndef FALSE #define FALSE (0) #endif // Statement breaking into debugger (for various platforms). @@@add if defined, etc... #ifdef _WIN32 # ifdef _MSC_VER # define DC_TEST_BREAK __debugbreak # else # include # define DC_TEST_BREAK DebugBreak # endif #else # define DC_TEST_BREAK #endif // Test state - evaluates to false inside a test function if a test fails. #define DC_TEST_STATE testFramework_state // Test functions defined by DC_DEFINE_TEST_FUNC_BEGIN and DC_DEFINE_TEST_FUNC_END pairs do come with // a default parameter used to pass a path to them specifying where to find external data needed to // run the tests (if desired). NULL by default. It can be queried by using DC_TEST_PATH. #define DC_TEST_PATH testFramework_suitePath // Test a single expression - the expression must evaluate to true in order to succeed. // #define DC_TEST(exp) { TEST_STATE = TEST_STATE && (exp); if(!TEST_STATE) DC_TEST_BREAK(); } #include #define DC_TEST(exp) assert(exp) // { if (! (exp) ) DC_TEST_BREAK(); } // Macros used to define a test functions. #define DC_DEFINE_TEST_FUNC_BEGIN(name) /*static */int name(/*const char* DC_TEST_PATH=NULL*/) { /*@@@ add logging*/ int TEST_STATE = TRUE; #define DC_DEFINE_TEST_FUNC_END /*@@@ add logging*/ return TEST_STATE; } MoarVM-2015.11/3rdparty/dyncall/test/plain/test_main.c0000644000175000017500000001627512456307246021503 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/plain/test_main.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "test_framework.h" #include "../../dyncall/dyncall.h" #include #include "../common/platformInit.h" /* ------------------------------------------------------------------------- * test: identity function calls * ------------------------------------------------------------------------- */ #define DEF_FUNCS(API,NAME) \ void API fun_##NAME##_v() { } \ DCbool API fun_##NAME##_b(DCbool x) { return x; } \ DCint API fun_##NAME##_i(DCint x) { return x; } \ DClong API fun_##NAME##_j(DClong x) { return x; } \ DClonglong API fun_##NAME##_l(DClonglong x) { return x; } \ DCfloat API fun_##NAME##_f(DCfloat x) { return x; } \ DCdouble API fun_##NAME##_d(DCdouble x) { return x; } \ DCpointer API fun_##NAME##_p(DCpointer x) { return x; } /* __cdecl */ #if !defined(DC__OS_Win32) # define __declspec(X) # define __cdecl #endif DEF_FUNCS(__cdecl,c) DC_DEFINE_TEST_FUNC_BEGIN(testCallC) DCCallVM* pc = dcNewCallVM(4096); dcMode(pc,DC_CALL_C_DEFAULT); /* void */ dcReset(pc); dcCallVoid(pc, (DCpointer) &fun_c_v); /* bool */ { DCbool r, val=DC_TRUE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_c_b); DC_TEST(r == val); val=DC_FALSE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_c_b); DC_TEST(r == val); } /* int */ { DCint r, val=1234; dcReset(pc); dcArgInt(pc, val); r = dcCallInt(pc, (DCpointer) &fun_c_i); DC_TEST(r == val); } /* long */ { DClong r, val=(DClong) 0xCAFEBABEL; dcReset(pc); dcArgLong(pc, val); r = dcCallLong(pc, (DCpointer) &fun_c_j); DC_TEST(r == val); } /* long long */ { DClonglong r, val=(DClonglong) 0xCAFEBABEDEADC0DELL; dcReset(pc); dcArgLongLong(pc, val); r = dcCallLongLong(pc, (DCpointer) &fun_c_l); DC_TEST(r == (DClonglong)val); } /* float */ { DCfloat r, val=1.234567f; dcReset(pc); dcArgFloat(pc, val); r = dcCallFloat(pc, (DCpointer) &fun_c_f); DC_TEST(r == val); } /* double */ { DCdouble r, val=1.23456789; dcReset(pc); dcArgDouble(pc, val); r = dcCallDouble(pc, (DCpointer) &fun_c_d); DC_TEST(r == val); } /* ptr */ { DCpointer r; dcReset(pc); dcArgPointer(pc, (DCpointer) &fun_c_b); r = dcCallPointer(pc, (DCpointer) &fun_c_p); DC_TEST(r == (DCpointer) &fun_c_b); } dcFree(pc); DC_DEFINE_TEST_FUNC_END #ifdef DC__OS_Win32 /* win32 __stdcall */ DEF_FUNCS(__stdcall,std) DC_DEFINE_TEST_FUNC_BEGIN(testCallStd) DCCallVM* pc = dcNewCallVM(4096); dcMode(pc,DC_CALL_C_X86_WIN32_STD); /* void */ dcReset(pc); dcCallVoid(pc, (DCpointer) &fun_std_v); /* bool */ { DCbool r, val=DC_TRUE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_std_b); DC_TEST(r == val); val=DC_FALSE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_std_b); DC_TEST(r == val); } /* int */ { DCint r, val=1234; dcReset(pc); dcArgInt(pc, val); r = dcCallInt(pc, (DCpointer) &fun_std_i); DC_TEST(r == val); } /* long */ { DClong r, val=0xCAFEBABEUL; dcReset(pc); dcArgLong(pc, val); r = dcCallLong(pc, (DCpointer) &fun_std_j); DC_TEST(r == val); } /* long long */ { DClonglong r, val=0xCAFEBABEDEADC0DEULL; dcReset(pc); dcArgLongLong(pc, val); r = dcCallLongLong(pc, (DCpointer) &fun_std_l); DC_TEST(r == val); } /* float */ { DCfloat r, val=1.234567f; dcReset(pc); dcArgFloat(pc, val); r = dcCallFloat(pc, (DCpointer) &fun_std_f); DC_TEST(r == val); } /* double */ { DCdouble r, val=1.23456789; dcReset(pc); dcArgDouble(pc, val); r = dcCallDouble(pc, (DCpointer) &fun_std_d); DC_TEST(r == val); } /* ptr */ { DCpointer r; dcReset(pc); dcArgPointer(pc, (DCpointer) &fun_c_b); r = dcCallPointer(pc, (DCpointer) &fun_std_p); DC_TEST(r == &fun_c_b); } dcFree(pc); DC_DEFINE_TEST_FUNC_END #endif #ifdef DC__OS_Win32 /* win32 __fastcall */ DEF_FUNCS(__fastcall,fast) DC_DEFINE_TEST_FUNC_BEGIN(testCallFast) DCCallVM* pc = dcNewCallVM(4096); #ifdef DC__C_GNU dcMode(pc,DC_CALL_C_X86_WIN32_FAST_GNU); #else dcMode(pc,DC_CALL_C_X86_WIN32_FAST_MS); #endif /* void */ dcReset(pc); dcCallVoid(pc, (DCpointer) &fun_fast_v); /* bool */ { DCbool r, val=DC_TRUE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_fast_b); DC_TEST(r == val); val=DC_FALSE; dcReset(pc); dcArgBool(pc, val); r = dcCallBool(pc, (DCpointer) &fun_fast_b); DC_TEST(r == val); } /* int */ { DCint r, val=1234; dcReset(pc); dcArgInt(pc, val); r = dcCallInt(pc, (DCpointer) &fun_fast_i); DC_TEST(r == val); } /* long */ { DClong r, val=0xCAFEBABEUL; dcReset(pc); dcArgLong(pc, val); r = dcCallLong(pc, (DCpointer) &fun_fast_j); DC_TEST(r == val); } /* long long */ { DClonglong r, val=0xCAFEBABEDEADC0DEULL; dcReset(pc); dcArgLongLong(pc, val); r = dcCallLongLong(pc, (DCpointer) &fun_fast_l); DC_TEST(r == val); } /* float */ { DCfloat r, val=1.234567f; dcReset(pc); dcArgFloat(pc, val); r = dcCallFloat(pc, (DCpointer) &fun_fast_f); DC_TEST(r == val); } /* double */ { DCdouble r, val=1.23456789; dcReset(pc); dcArgDouble(pc, val); r = dcCallDouble(pc, (DCpointer) &fun_fast_d); DC_TEST(r == val); } /* ptr */ { DCpointer r; dcReset(pc); dcArgPointer(pc, (DCpointer) &fun_c_b); r = dcCallPointer(pc, (DCpointer) &fun_fast_p); DC_TEST(r == &fun_c_b); } dcFree(pc); DC_DEFINE_TEST_FUNC_END #endif int testCallStructs(); int testStructSizes(); int main(int argc, char* argv[]) { int b = TRUE; dcTest_initPlatform(); b = b && testCallC(); printf("C:%d\n",b); b = b && testStructSizes(); printf("Struct Sizes:%d\n",b); /*b = b && testCallStructs(); printf("Call Structs:%d\n",b);*/ #if defined(DC__OS_Win32) b = b && testCallStd(); printf("Std:%d\n",b); b = b && testCallFast(); #ifdef DC__C_GNU printf("FastGNU:%d\n",b); #else printf("FastMS:%d\n",b); #endif #endif printf("result: plain: %d\n", b); dcTest_deInitPlatform(); return !b; } MoarVM-2015.11/3rdparty/dyncall/test/plain/test_structs.c0000644000175000017500000001345112456307246022257 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/plain/test_structs.c Description: License: Copyright (c) 2010-2011 Olivier Chafik Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "test_framework.h" #include "../../dyncall/dyncall.h" #include "../../dyncall/dyncall_signature.h" #include "../../dyncall/dyncall_struct.h" #include //#include "../common/platformInit.h" #define DC_TEST_INT_EQUAL(expected, computed) { \ if (expected != computed) \ printf("expected = %d, computed = %d\n\n", (int)expected, (int)computed); \ DC_TEST(expected == computed); \ } #define DC_TEST_STRUCT_SIZE(type, s) { \ DCsize expected = sizeof(type), computed = dcStructSize(s);\ DC_TEST_INT_EQUAL(expected, computed); \ } DC_DEFINE_TEST_FUNC_BEGIN(testStructSizes) { typedef struct { double a, b, c, d; } S; size_t size; DCstruct* s = dcNewStruct(4, DEFAULT_ALIGNMENT); dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); dcCloseStruct(s); DC_TEST_STRUCT_SIZE(S, s); dcFreeStruct(s); } { typedef struct { char a, b; void* p[3]; } S; size_t size; DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); dcCloseStruct(s); DC_TEST_STRUCT_SIZE(S, s); dcFreeStruct(s); } { typedef struct { short a; struct { char a, b; void* p[3]; } sub; short b; } S; size_t size; DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); dcSubStruct(s, 3, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); dcCloseStruct(s); dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); dcCloseStruct(s); DC_TEST_STRUCT_SIZE(S, s); dcFreeStruct(s); } #define TEST_MONO_STRUCT(type, sig) \ { \ typedef struct { \ type v; \ } S; \ \ DCstruct* s = dcNewStruct(1, DEFAULT_ALIGNMENT); \ dcStructField(s, sig, DEFAULT_ALIGNMENT, 1); \ dcCloseStruct(s); \ \ DC_TEST_STRUCT_SIZE(S, s); \ dcFreeStruct(s); \ } TEST_MONO_STRUCT(char, DC_SIGCHAR_CHAR); TEST_MONO_STRUCT(unsigned char, DC_SIGCHAR_UCHAR); TEST_MONO_STRUCT(short, DC_SIGCHAR_SHORT); TEST_MONO_STRUCT(unsigned short, DC_SIGCHAR_USHORT); TEST_MONO_STRUCT(int, DC_SIGCHAR_INT); TEST_MONO_STRUCT(unsigned int, DC_SIGCHAR_UINT); TEST_MONO_STRUCT(long, DC_SIGCHAR_LONG); TEST_MONO_STRUCT(unsigned long, DC_SIGCHAR_ULONG); TEST_MONO_STRUCT(long long, DC_SIGCHAR_LONGLONG); TEST_MONO_STRUCT(unsigned long long, DC_SIGCHAR_ULONGLONG); TEST_MONO_STRUCT(void*, DC_SIGCHAR_POINTER); TEST_MONO_STRUCT(float, DC_SIGCHAR_FLOAT); TEST_MONO_STRUCT(double, DC_SIGCHAR_DOUBLE); DC_DEFINE_TEST_FUNC_END typedef struct { char a, b, c; } FewValues; double sum_FewValues(FewValues values) { printf("sum_FewValues(a = %d, b = %d, c = %d)\n", (int)values.a, (int)values.b, (int)values.c); return ((double)values.a) + ((double)values.b) + ((double)values.c); } typedef struct { char a, b; double p[10]; } SomeValues; double sum_SomeValues(SomeValues values) { return ((double)values.a) + ((double)values.b) + values.p[0] + values.p[1] + values.p[2]; } DC_DEFINE_TEST_FUNC_BEGIN(testCallStructs) DCCallVM* pc = dcNewCallVM(4096); { FewValues values; double calledSum, expectedSum; DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcCloseStruct(s); DC_TEST_STRUCT_SIZE(FewValues, s); values.a = 1; values.b = 2; values.c = 3; dcMode(pc, DC_CALL_C_DEFAULT); dcReset(pc); printf("BEFORE dcArgStruct\n"); dcArgStruct(pc, s, &values); printf("AFTER dcArgStruct\n"); calledSum = dcCallDouble(pc, (DCpointer)&sum_FewValues); expectedSum = sum_FewValues(values); DC_TEST_INT_EQUAL(expectedSum, calledSum); dcFreeStruct(s); } { SomeValues values; double calledSum, expectedSum; DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 10); dcCloseStruct(s); DC_TEST_STRUCT_SIZE(SomeValues, s); values.a = 1; values.b = 2; values.p[0] = 10; values.p[1] = 11; values.p[2] = 12; dcMode(pc, DC_CALL_C_DEFAULT); dcReset(pc); dcArgStruct(pc, s, &values); calledSum = dcCallDouble(pc, (DCpointer) &sum_SomeValues); expectedSum = sum_SomeValues(values); DC_TEST_INT_EQUAL(expectedSum, calledSum); dcFreeStruct(s); } dcFree(pc); DC_DEFINE_TEST_FUNC_END MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/CMakeLists.txt0000644000175000017500000000012412456307246022526 0ustar jnthnjnthnadd_executable(plain_cxx test_main.cc) target_link_libraries(plain_cxx dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/Makefile.M0000644000175000017500000000015312456307246021623 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/Makefile.embedded0000644000175000017500000000042512502366750023157 0ustar jnthnjnthnAPP = plain_c++ OBJS = test_main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CXX} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/Makefile.generic0000644000175000017500000000056412456307246023051 0ustar jnthnjnthnAPP = plain_c++ OBJS = test_main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CXXFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CXX} ${CXXFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/Nmakefile0000644000175000017500000000350312456307246021610 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = plain_c++.exe OBJS = test_main.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = plain_c++.nds OBJS = test_main.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/dynMakefile0000644000175000017500000000032412456307246022143 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/mkfile0000644000175000017500000000217212456307246021165 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = test_main APPLICATION = plain_c++ <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/test_framework.h0000644000175000017500000000444312456307246023203 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/plain_c++/test_framework.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // 2007-10-11 #ifndef TRUE #define TRUE (1) #endif #ifndef FALSE #define FALSE (0) #endif // Statement breaking into debugger (for various platforms). @@@add if defined, etc... #ifdef _WIN32 # ifdef _MSC_VER # define DC_TEST_BREAK __debugbreak # else # include # define DC_TEST_BREAK DebugBreak # endif #else # define DC_TEST_BREAK #endif // Test state - evaluates to false inside a test function if a test fails. #define DC_TEST_STATE testFramework_state // Test functions defined by DC_DEFINE_TEST_FUNC_BEGIN and DC_DEFINE_TEST_FUNC_END pairs do come with // a default parameter used to pass a path to them specifying where to find external data needed to // run the tests (if desired). NULL by default. It can be queried by using DC_TEST_PATH. #define DC_TEST_PATH testFramework_suitePath // Test a single expression - the expression must evaluate to true in order to succeed. // #define DC_TEST(exp) { TEST_STATE = TEST_STATE && (exp); if(!TEST_STATE) DC_TEST_BREAK(); } #include #define DC_TEST(exp) assert(exp) // { if (! (exp) ) DC_TEST_BREAK(); } // Macros used to define a test functions. #define DC_DEFINE_TEST_FUNC_BEGIN(name) /*static */int name(/*const char* DC_TEST_PATH=NULL*/) { /*@@@ add logging*/ int TEST_STATE = TRUE; #define DC_DEFINE_TEST_FUNC_END /*@@@ add logging*/ return TEST_STATE; } MoarVM-2015.11/3rdparty/dyncall/test/plain_c++/test_main.cc0000644000175000017500000002032312456307246022263 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/plain_c++/test_main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "test_framework.h" #include "../../dyncall/dyncall.h" /* needed by SunPro .. otherwise printf not included */ #if defined(__SUNPRO_CC) || defined(__ANDROID__) #include #else #include #endif #include "../common/platformInit.h" /* ------------------------------------------------------------------------- * test: identity function calls * ------------------------------------------------------------------------- */ #define DEF_FUNCS(API,NAME) \ void API fun_##NAME##_v() { } \ DCbool API fun_##NAME##_b(DCbool x) { return x; } \ DCint API fun_##NAME##_i(DCint x) { return x; } \ DClong API fun_##NAME##_j(DClong x) { return x; } \ DClonglong API fun_##NAME##_l(DClonglong x) { return x; } \ DCfloat API fun_##NAME##_f(DCfloat x) { return x; } \ DCdouble API fun_##NAME##_d(DCdouble x) { return x; } \ DCpointer API fun_##NAME##_p(DCpointer x) { return x; } /* __cdecl */ #if !defined(DC__OS_Win32) # define __declspec(X) # define __cdecl #endif /* ------------------------------------------------------------------------- * test: identity this calls * ------------------------------------------------------------------------- */ union ValueUnion { DCbool B; DCint i; DClong j; DClonglong l; DCfloat f; DCdouble d; DCpointer p; }; /* C++ class using __cdecl this call */ // #define VTBI_DESTRUCTOR 0 /* * the layout of the VTable is non-standard and it is not clear what is the initial real first method index. * so for it turns out that: * on vc/x86 : 1 * on GCC/x86 : 2 */ #if defined DC__C_MSVC #define VTBI_BASE 1 #else #define VTBI_BASE 2 #endif #define VTBI_SET_BOOL VTBI_BASE+0 #define VTBI_GET_BOOL VTBI_BASE+1 #define VTBI_SET_INT VTBI_BASE+2 #define VTBI_GET_INT VTBI_BASE+3 #define VTBI_SET_LONG VTBI_BASE+4 #define VTBI_GET_LONG VTBI_BASE+5 #define VTBI_SET_LONG_LONG VTBI_BASE+6 #define VTBI_GET_LONG_LONG VTBI_BASE+7 #define VTBI_SET_FLOAT VTBI_BASE+8 #define VTBI_GET_FLOAT VTBI_BASE+9 #define VTBI_SET_DOUBLE VTBI_BASE+10 #define VTBI_GET_DOUBLE VTBI_BASE+11 #define VTBI_SET_POINTER VTBI_BASE+12 #define VTBI_GET_POINTER VTBI_BASE+13 class Value { public: virtual ~Value() {} virtual void __cdecl setBool(DCbool x) { mValue.B = x; } virtual DCbool __cdecl getBool() { return mValue.B; } virtual void __cdecl setInt(DCint x) { mValue.i = x; } virtual DCint __cdecl getInt() { return mValue.i; } virtual void __cdecl setLong(DClong x) { mValue.j = x; } virtual DClong __cdecl getLong() { return mValue.j; } virtual void __cdecl setLongLong(DClonglong x) { mValue.l = x; } virtual DClonglong __cdecl getLongLong() { return mValue.l; } virtual void __cdecl setFloat(DCfloat x) { mValue.f = x; } virtual DCfloat __cdecl getFloat() { return mValue.f; } virtual void __cdecl setDouble(DCdouble x) { mValue.d = x; } virtual DCdouble __cdecl getDouble() { return mValue.d; } virtual void __cdecl setPtr(DCpointer x) { mValue.p = x; } virtual DCpointer __cdecl getPtr() { return mValue.p; } private: ValueUnion mValue; }; /* C++ class using (on win32: microsoft) this call */ class ValueMS { public: virtual ~ValueMS() {} virtual void setBool(DCbool x) { mValue.B = x; } virtual DCbool getBool() { return mValue.B; } virtual void setInt(DCint x) { mValue.i = x; } virtual DCint getInt() { return mValue.i; } virtual void setLong(DClong x) { mValue.j = x; } virtual DClong getLong() { return mValue.j; } virtual void setLongLong(DClonglong x) { mValue.l = x; } virtual DClonglong getLongLong() { return mValue.l; } virtual void setFloat(DCfloat x) { mValue.f = x; } virtual DCfloat getFloat() { return mValue.f; } virtual void setDouble(DCdouble x) { mValue.d = x; } virtual DCdouble getDouble() { return mValue.d; } virtual void setPtr(DCpointer x) { mValue.p = x; } virtual DCpointer getPtr() { return mValue.p; } private: ValueUnion mValue; }; template void testCallValue(DCCallVM* pc) { T o; T* pThis = &o; DCpointer* vtbl = *( (DCpointer**) pThis ); /* vtbl is located at beginning of class */ /* set/get bool (TRUE) */ dcReset(pc); dcArgPointer(pc, pThis); dcArgBool(pc,DC_TRUE); dcCallVoid(pc, vtbl[VTBI_SET_BOOL] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallBool(pc, vtbl[VTBI_GET_BOOL] ) == DC_TRUE ); /* set/get bool (FALSE) */ dcReset(pc); dcArgPointer(pc, pThis); dcArgBool(pc,DC_FALSE); dcCallVoid(pc, vtbl[VTBI_SET_BOOL] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallBool(pc, vtbl[VTBI_GET_BOOL] ) == DC_FALSE ); /* set/get int */ dcReset(pc); dcArgPointer(pc, pThis); dcArgInt(pc,1234); dcCallVoid(pc, vtbl[VTBI_SET_INT] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallInt(pc, vtbl[VTBI_GET_INT] ) == 1234 ); /* set/get long */ dcReset(pc); dcArgPointer(pc, pThis); dcArgLong(pc,0xCAFEBABEUL); dcCallVoid(pc, vtbl[VTBI_SET_LONG] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallLong(pc, vtbl[VTBI_GET_LONG] ) == (DClong)0xCAFEBABEUL ); /* set/get long long */ dcReset(pc); dcArgPointer(pc, pThis); dcArgLongLong(pc,0xCAFEBABEDEADC0DELL); dcCallVoid(pc, vtbl[VTBI_SET_LONG_LONG] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallLongLong(pc, vtbl[VTBI_GET_LONG_LONG] ) == (DClonglong)0xCAFEBABEDEADC0DELL ); /* set/get float */ dcReset(pc); dcArgPointer(pc, pThis); dcArgFloat(pc,1.2345f); dcCallVoid(pc, vtbl[VTBI_SET_FLOAT] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallFloat(pc, vtbl[VTBI_GET_FLOAT] ) == 1.2345f ); /* set/get double */ dcReset(pc); dcArgPointer(pc, pThis); dcArgDouble(pc,1.23456789); dcCallVoid(pc, vtbl[VTBI_SET_DOUBLE] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallDouble(pc, vtbl[VTBI_GET_DOUBLE] ) == 1.23456789 ); /* set/get pointer */ dcReset(pc); dcArgPointer(pc, pThis); dcArgPointer(pc, (DCpointer) 0xCAFEBABE ); dcCallVoid(pc, vtbl[VTBI_SET_POINTER] ); dcReset(pc); dcArgPointer(pc, pThis); DC_TEST( dcCallPointer(pc, vtbl[VTBI_GET_POINTER] ) == ( (DCpointer) 0xCAFEBABE ) ); } #ifdef DC__OS_Win32 DC_DEFINE_TEST_FUNC_BEGIN(testCallThisMS) DCCallVM* pc = dcNewCallVM(4096); dcMode(pc,DC_CALL_C_X86_WIN32_THIS_MS); dcReset(pc); testCallValue(pc); dcFree(pc); DC_DEFINE_TEST_FUNC_END #endif DC_DEFINE_TEST_FUNC_BEGIN(testCallThisC) DCCallVM* pc = dcNewCallVM(4096); dcReset(pc); testCallValue(pc); dcFree(pc); DC_DEFINE_TEST_FUNC_END extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); int b = TRUE; #if defined(DC__OS_Win32) // ThisCall temporarily only for win 32 @@@ b = b && testCallThisC(); printf("ThisC:%d\n",b); #if defined(DC__C_MSVC) b = b && testCallThisMS(); printf("ThisMS:%d\n",b); #endif #endif printf("result: plain_cpp: %d\n", b); dcTest_deInitPlatform(); return !b; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/Makefile.M0000644000175000017500000000015312456307246022560 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/Makefile.embedded0000644000175000017500000000041212502366750024110 0ustar jnthnjnthnAPP = resolve_self OBJS = main.o TOP = ../.. CFLAGS += -I${TOP}/dynload LDFLAGS += -L${TOP}/dynload LDLIBS += -ldynload_s all: ${APP} .PHONY: all clean install ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/Makefile.generic0000644000175000017500000000057312466674236024015 0ustar jnthnjnthnAPP = resolve_self OBJS = main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dynload LDLIBS_D = -L${BLDTOP}/dynload -ldynload_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS_D} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/Nmakefile0000644000175000017500000000326112456307246022546 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007-2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = resolve_self.exe OBJS = main.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dynload\libdynload_s.lib $(TOP)\dyncall\libdyncall_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = resolve_self.nds OBJS = main.o $(TARGETS):# $(OBJS) echo Not building: There is no dynload support on this platform. !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/README.txt0000644000175000017500000000072212456307246022425 0ustar jnthnjnthntest for dynload library to resolve symbols from application image itself. by Daniel Adler in 2010 Description A test function is specified in the main application, that will be dynamically resolved on main entry of the test program. The library path argument to dlLoadLibrary is set to NULL to specify the application image. Background self referencing is important on configurations where there is no shared library but everything is statically linked. MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/dynMakefile0000644000175000017500000000032412456307246023100 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/resolve_self/main.c0000644000175000017500000000313312456307246022016 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/resolve_self/main.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dynload/dynload.h" #include "../../dyncall/dyncall_macros.h" #include #include #ifdef DC_WINDOWS #define DLL_EXPORT __declspec( dllexport ) #else #define DLL_EXPORT #endif DLL_EXPORT double add_dd_d(double x, double y); double add_dd_d(double x, double y) { return x+y; } int main(int argc, char* argv[]) { void* address; double result; int status; DLLib* pLib = dlLoadLibrary(NULL); assert(pLib); address = dlFindSymbol(pLib, "add_dd_d"); assert(address); result = ( (double (*) (double,double) ) address ) (20.0, 3.0); status = (result == 23); printf("result: resolve_self: %d\n", status); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/runalltests.bat0000644000175000017500000000101512456307246021303 0ustar jnthnjnthn@echo off callf\callf.exe pause ellipsis\ellipsis.exe pause malloc_wx\malloc_wx.exe pause plain\plain.exe pause plain_c++\plain_c++.exe pause suite\suite.exe pause suite_x86win32std\suite.exe pause suite_x86win32fast\suite.exe pause suite2\suite2.exe pause suite2_x86win32std\suite2.exe pause suite2_x86win32fast\suite2.exe pause suite3\suite3.exe pause suite_floats\suite_floats.exe pause thunk\thunk.exe pause callback_plain\callback_plain.exe pause callback_suite\callback_suite.exe pause MoarVM-2015.11/3rdparty/dyncall/test/runalltests.sh0000755000175000017500000000022612466674236021164 0ustar jnthnjnthnA="callf ellipsis malloc_wx plain plain_c++ suite suite2 suite3 suite_floats callback_plain call_suite callback_suite" for i in $A ; do $i/$i done MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/d16.c0000644000175000017500000000216312456307246021540 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/d16.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define d double void d16( d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d ); void t(d* x) { d16(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/d20.c0000644000175000017500000000222512456307246021532 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/d20.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define d double void d20( d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d ); void t(d*x) { d20(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19]); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/d40.c0000644000175000017500000000230512456307246021533 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/d40.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define d double void d40( d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d ); void t() { d40( 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 ); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/f16.c0000644000175000017500000000216212456307246021541 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/f16.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define f float void f16( f,f,f,f, f,f,f,f, f,f,f,f, f,f,f,f ); void t(f* x) { f16(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/f20.c0000644000175000017500000000212512456307246021533 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/f20.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define f float void f20( f,f,f,f, f,f,f,f, f,f,f,f, f,f,f,f, f,f,f,f ); void t() { f20(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/f40.c0000644000175000017500000000230412456307246021534 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/f40.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define d float void f40( d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d ); void t() { f40( 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 ); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/fd40.c0000644000175000017500000000256412456307246021710 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/fd40.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define a float #define b double void ab40( a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b, a,b,a,b ); void t(a*x,b*y) { ab40( x[ 0],y[ 1],x[ 2],y[ 3],x[ 4],y[ 5],x[ 6],y[ 7],x[ 8],y[ 9],x[10],y[11],x[12],y[13],x[14],y[15],x[16],y[17],x[18],y[19], x[20],y[21],x[22],y[23],x[24],y[25],x[26],y[27],x[28],y[29],x[30],y[31],x[32],y[33],x[34],y[35],x[36],y[37],x[38],y[39] ); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/i3.c0000644000175000017500000000177712456307246021473 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/i3.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define i int void i3(i,i,i); void t(i*x) { i3(x[1],x[2],x[3]); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/i7.c0000644000175000017500000000200212456307246021455 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/i7.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define i int void i7(i,i,i,i,i,i,i); void t() { i7(0,1,2,3,4,5,6); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/id40.c0000644000175000017500000000257012456307246021710 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/id40.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define d double #define i int void id40( i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d, i,d,i,d ); void t(int*x,double*y) { id40( x[ 0],y[ 1],x[ 2],y[ 3],x[ 4],y[ 5],x[ 6],y[ 7],x[ 8],y[ 9],x[10],y[11],x[12],y[13],x[14],y[15],x[16],y[17],x[18],y[19], x[20],y[21],x[22],y[23],x[24],y[25],x[26],y[27],x[28],y[29],x[30],y[31],x[32],y[33],x[34],y[35],x[36],y[37],x[38],y[39] ); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/l16.c0000644000175000017500000000216712456307246021554 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/l16.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define X long long void f16( X,X,X,X, X,X,X,X, X,X,X,X, X,X,X,X ); void t(X* x) { f16(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]); } MoarVM-2015.11/3rdparty/dyncall/test/samples/calls/many.c0000644000175000017500000000310512456307246022107 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/samples/calls/many.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define i int #define f float #define d double #define l long long void fi16( f,i,f,i, f,i,f,i, f,i,f,i, f,i,f,i ); void i16( i,i,i,i, i,i,i,i, i,i,i,i, i,i,i,i ); void f16( f,f,f,f, f,f,f,f, f,f,f,f, f,f,f,f ); void d16( d,d,d,d, d,d,d,d, d,d,d,d, d,d,d,d ); void l16( l,l,l,l, l,l,l,l, l,l,l,l, l,l,l,l ); void t() { /* l16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); d16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); i16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); f16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); */ di16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); fi16(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); } MoarVM-2015.11/3rdparty/dyncall/test/samples/composite/args.asm0000644000175000017500000003035212456307246023345 0ustar jnthnjnthn; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08 include listing.inc INCLUDELIB LIBCMT INCLUDELIB OLDNAMES PUBLIC call_f_s2i EXTRN f_s2i:PROC ; Function compile flags: /Ogtpy ; COMDAT call_f_s2i _TEXT SEGMENT a1$ = 8 call_f_s2i PROC ; COMDAT ; File c:\lab\dynabi\tests\composite\args.c ; Line 130 xor eax, eax mov DWORD PTR a1$[rsp], 0 mov DWORD PTR a1$[rsp+4], eax mov rcx, QWORD PTR a1$[rsp] jmp f_s2i call_f_s2i ENDP _TEXT ENDS PUBLIC $T993 PUBLIC call_f_s4i EXTRN f_s4i:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s4i DD imagerel $LN3 DD imagerel $LN3+52 DD imagerel $unwind$call_f_s4i pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s4i DD 010401H DD 06204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s4i _TEXT SEGMENT $T993 = 32 a1$ = 32 call_f_s4i PROC ; COMDAT ; Line 131 $LN3: sub rsp, 56 ; 00000038H xor eax, eax mov DWORD PTR a1$[rsp], 0 lea rcx, QWORD PTR $T993[rsp] mov DWORD PTR a1$[rsp+4], eax mov DWORD PTR a1$[rsp+8], eax mov DWORD PTR a1$[rsp+12], eax movaps xmm0, XMMWORD PTR a1$[rsp] movdqa XMMWORD PTR $T993[rsp], xmm0 call f_s4i add rsp, 56 ; 00000038H ret 0 call_f_s4i ENDP _TEXT ENDS PUBLIC $T1004 PUBLIC call_f_s8i EXTRN f_s8i:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s8i DD imagerel $LN3 DD imagerel $LN3+97 DD imagerel $unwind$call_f_s8i pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s8i DD 010401H DD 0c204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s8i _TEXT SEGMENT a1$ = 32 $T1004 = 64 call_f_s8i PROC ; COMDAT ; Line 132 $LN3: sub rsp, 104 ; 00000068H xor eax, eax lea rcx, QWORD PTR a1$[rsp] lea rdx, QWORD PTR $T1004[rsp] mov DWORD PTR a1$[rsp+4], eax mov DWORD PTR a1$[rsp+8], eax mov DWORD PTR a1$[rsp+12], eax mov DWORD PTR a1$[rsp+16], eax mov DWORD PTR a1$[rsp+20], eax mov DWORD PTR a1$[rsp+24], eax mov DWORD PTR a1$[rsp+28], eax mov DWORD PTR a1$[rsp], 0 mov rax, QWORD PTR [rcx] mov QWORD PTR [rdx], rax mov rax, QWORD PTR [rcx+8] mov QWORD PTR [rdx+8], rax mov rax, QWORD PTR [rcx+16] mov QWORD PTR [rdx+16], rax mov rax, QWORD PTR [rcx+24] lea rcx, QWORD PTR $T1004[rsp] mov QWORD PTR [rdx+24], rax call f_s8i add rsp, 104 ; 00000068H ret 0 call_f_s8i ENDP _TEXT ENDS PUBLIC call_f_s2f EXTRN f_s2f:PROC EXTRN _fltused:DWORD ; Function compile flags: /Ogtpy ; COMDAT call_f_s2f _TEXT SEGMENT a1$ = 8 call_f_s2f PROC ; COMDAT ; Line 134 xorps xmm0, xmm0 xor eax, eax movss DWORD PTR a1$[rsp], xmm0 mov DWORD PTR a1$[rsp+4], eax mov rcx, QWORD PTR a1$[rsp] jmp f_s2f call_f_s2f ENDP _TEXT ENDS PUBLIC $T1023 PUBLIC call_f_s4f EXTRN f_s4f:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s4f DD imagerel $LN3 DD imagerel $LN3+53 DD imagerel $unwind$call_f_s4f pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s4f DD 010401H DD 06204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s4f _TEXT SEGMENT $T1023 = 32 a1$ = 32 call_f_s4f PROC ; COMDAT ; Line 135 $LN3: sub rsp, 56 ; 00000038H xorps xmm0, xmm0 xor eax, eax lea rcx, QWORD PTR $T1023[rsp] movss DWORD PTR a1$[rsp], xmm0 mov DWORD PTR a1$[rsp+4], eax mov DWORD PTR a1$[rsp+8], eax mov DWORD PTR a1$[rsp+12], eax movaps xmm0, XMMWORD PTR a1$[rsp] movdqa XMMWORD PTR $T1023[rsp], xmm0 call f_s4f add rsp, 56 ; 00000038H ret 0 call_f_s4f ENDP _TEXT ENDS PUBLIC call_f_s1d EXTRN f_s1d:PROC ; Function compile flags: /Ogtpy ; COMDAT call_f_s1d _TEXT SEGMENT a1$ = 8 call_f_s1d PROC ; COMDAT ; Line 137 xorpd xmm0, xmm0 movsdx QWORD PTR a1$[rsp], xmm0 mov rcx, QWORD PTR a1$[rsp] jmp f_s1d call_f_s1d ENDP _TEXT ENDS PUBLIC $T1041 PUBLIC call_f_s2d EXTRN f_s2d:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s2d DD imagerel $LN3 DD imagerel $LN3+47 DD imagerel $unwind$call_f_s2d pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s2d DD 010401H DD 06204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s2d _TEXT SEGMENT $T1041 = 32 a1$ = 32 call_f_s2d PROC ; COMDAT ; Line 138 $LN3: sub rsp, 56 ; 00000038H xorpd xmm0, xmm0 xor eax, eax lea rcx, QWORD PTR $T1041[rsp] movsdx QWORD PTR a1$[rsp], xmm0 mov QWORD PTR a1$[rsp+8], rax movaps xmm0, XMMWORD PTR a1$[rsp] movdqa XMMWORD PTR $T1041[rsp], xmm0 call f_s2d add rsp, 56 ; 00000038H ret 0 call_f_s2d ENDP _TEXT ENDS PUBLIC $T1052 PUBLIC call_f_s4d EXTRN f_s4d:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s4d DD imagerel $LN3 DD imagerel $LN3+86 DD imagerel $unwind$call_f_s4d pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s4d DD 010401H DD 0c204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s4d _TEXT SEGMENT a1$ = 32 $T1052 = 64 call_f_s4d PROC ; COMDAT ; Line 139 $LN3: sub rsp, 104 ; 00000068H xorpd xmm0, xmm0 xor eax, eax lea rcx, QWORD PTR a1$[rsp] movsdx QWORD PTR a1$[rsp], xmm0 mov QWORD PTR a1$[rsp+8], rax mov QWORD PTR a1$[rsp+16], rax mov QWORD PTR a1$[rsp+24], rax mov rax, QWORD PTR [rcx] lea rdx, QWORD PTR $T1052[rsp] mov QWORD PTR [rdx], rax mov rax, QWORD PTR [rcx+8] mov QWORD PTR [rdx+8], rax mov rax, QWORD PTR [rcx+16] mov QWORD PTR [rdx+16], rax mov rax, QWORD PTR [rcx+24] lea rcx, QWORD PTR $T1052[rsp] mov QWORD PTR [rdx+24], rax call f_s4d add rsp, 104 ; 00000068H ret 0 call_f_s4d ENDP _TEXT ENDS PUBLIC call_f_s1q EXTRN f_s1q:PROC ; Function compile flags: /Ogtpy ; COMDAT call_f_s1q _TEXT SEGMENT a1$ = 8 call_f_s1q PROC ; COMDAT ; Line 141 xorpd xmm0, xmm0 movsdx QWORD PTR a1$[rsp], xmm0 mov rcx, QWORD PTR a1$[rsp] jmp f_s1q call_f_s1q ENDP _TEXT ENDS PUBLIC $T1068 PUBLIC $T1069 PUBLIC call_f_s2ds2d EXTRN f_s2ds2d:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_s2ds2d DD imagerel $LN3 DD imagerel $LN3+74 DD imagerel $unwind$call_f_s2ds2d pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_s2ds2d DD 010401H DD 08204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_s2ds2d _TEXT SEGMENT $T1069 = 32 a2$ = 32 $T1068 = 48 a1$ = 48 call_f_s2ds2d PROC ; COMDAT ; Line 147 $LN3: sub rsp, 72 ; 00000048H ; Line 148 xorpd xmm0, xmm0 xor eax, eax ; Line 150 lea rdx, QWORD PTR $T1069[rsp] movsdx QWORD PTR a1$[rsp], xmm0 movsdx QWORD PTR a2$[rsp], xmm0 mov QWORD PTR a1$[rsp+8], rax mov QWORD PTR a2$[rsp+8], rax lea rcx, QWORD PTR $T1068[rsp] movaps xmm1, XMMWORD PTR a1$[rsp] movaps xmm0, XMMWORD PTR a2$[rsp] movdqa XMMWORD PTR $T1068[rsp], xmm1 movdqa XMMWORD PTR $T1069[rsp], xmm0 call f_s2ds2d ; Line 151 add rsp, 72 ; 00000048H ret 0 call_f_s2ds2d ENDP _TEXT ENDS PUBLIC __real@40000000 PUBLIC call_f_sfifi EXTRN f_sfifi:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_sfifi DD imagerel $LN3 DD imagerel $LN3+65 DD imagerel $unwind$call_f_sfifi pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_sfifi DD 010701H DD 06207H xdata ENDS ; COMDAT __real@40000000 CONST SEGMENT __real@40000000 DD 040000000r ; 2 ; Function compile flags: /Ogtpy CONST ENDS ; COMDAT call_f_sfifi _TEXT SEGMENT call_f_sfifi PROC ; COMDAT ; Line 155 $LN3: mov rax, rsp sub rsp, 56 ; 00000038H xorps xmm0, xmm0 movss xmm1, DWORD PTR __real@40000000 mov DWORD PTR [rax-20], 1 mov DWORD PTR [rax-12], 3 lea rcx, QWORD PTR [rax-24] movss DWORD PTR [rax-24], xmm0 movss DWORD PTR [rax-16], xmm1 movaps xmm0, XMMWORD PTR [rax-24] movdqa XMMWORD PTR [rax-24], xmm0 call f_sfifi add rsp, 56 ; 00000038H ret 0 call_f_sfifi ENDP _TEXT ENDS PUBLIC __real@40400000 PUBLIC __real@3f800000 PUBLIC call_f_sifif EXTRN f_sifif:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_sifif DD imagerel $LN3 DD imagerel $LN3+70 DD imagerel $unwind$call_f_sifif pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_sifif DD 010701H DD 06207H xdata ENDS ; COMDAT __real@40400000 CONST SEGMENT __real@40400000 DD 040400000r ; 3 CONST ENDS ; COMDAT __real@3f800000 CONST SEGMENT __real@3f800000 DD 03f800000r ; 1 ; Function compile flags: /Ogtpy CONST ENDS ; COMDAT call_f_sifif _TEXT SEGMENT call_f_sifif PROC ; COMDAT ; Line 161 $LN3: mov rax, rsp sub rsp, 56 ; 00000038H movss xmm0, DWORD PTR __real@3f800000 movss xmm1, DWORD PTR __real@40400000 mov DWORD PTR [rax-24], 0 mov DWORD PTR [rax-16], 2 lea rcx, QWORD PTR [rax-24] movss DWORD PTR [rax-20], xmm0 movss DWORD PTR [rax-12], xmm1 movaps xmm0, XMMWORD PTR [rax-24] movdqa XMMWORD PTR [rax-24], xmm0 call f_sifif add rsp, 56 ; 00000038H ret 0 call_f_sifif ENDP _TEXT ENDS PUBLIC $T1109 PUBLIC call_f_full_sifif EXTRN f_full_sifif:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_full_sifif DD imagerel $LN3 DD imagerel $LN3+90 DD imagerel $unwind$call_f_full_sifif pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_full_sifif DD 010401H DD 0c204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_full_sifif _TEXT SEGMENT $T1109 = 80 a1$ = 80 call_f_full_sifif PROC ; COMDAT ; Line 168 $LN3: sub rsp, 104 ; 00000068H xor eax, eax mov DWORD PTR a1$[rsp], 0 xor ecx, ecx lea edx, QWORD PTR [rax+1] mov DWORD PTR a1$[rsp+4], eax mov DWORD PTR a1$[rsp+8], eax mov DWORD PTR a1$[rsp+12], eax lea rax, QWORD PTR $T1109[rsp] lea r9d, QWORD PTR [rdx+2] movaps xmm0, XMMWORD PTR a1$[rsp] movdqa XMMWORD PTR $T1109[rsp], xmm0 mov QWORD PTR [rsp+64], rax mov BYTE PTR [rsp+56], 7 mov BYTE PTR [rsp+48], 6 lea r8d, QWORD PTR [rdx+1] mov BYTE PTR [rsp+40], 5 mov BYTE PTR [rsp+32], 4 call f_full_sifif add rsp, 104 ; 00000068H ret 0 call_f_full_sifif ENDP _TEXT ENDS PUBLIC $T1120 PUBLIC call_f_remain64_sifif EXTRN f_remain64_sifif:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_remain64_sifif DD imagerel $LN3 DD imagerel $LN3+56 DD imagerel $unwind$call_f_remain64_sifif pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_remain64_sifif DD 010401H DD 06204H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_remain64_sifif _TEXT SEGMENT $T1120 = 32 a1$ = 32 call_f_remain64_sifif PROC ; COMDAT ; Line 169 $LN3: sub rsp, 56 ; 00000038H xor eax, eax mov DWORD PTR a1$[rsp], 0 lea r8, QWORD PTR $T1120[rsp] mov DWORD PTR a1$[rsp+4], eax mov DWORD PTR a1$[rsp+8], eax mov DWORD PTR a1$[rsp+12], eax movaps xmm0, XMMWORD PTR a1$[rsp] movdqa XMMWORD PTR $T1120[rsp], xmm0 mov dl, 1 xor ecx, ecx call f_remain64_sifif add rsp, 56 ; 00000038H ret 0 call_f_remain64_sifif ENDP _TEXT ENDS PUBLIC call_f_sfffc EXTRN f_sfffc:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_sfffc DD imagerel $LN3 DD imagerel $LN3+68 DD imagerel $unwind$call_f_sfffc pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_sfffc DD 010701H DD 06207H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_sfffc _TEXT SEGMENT call_f_sfffc PROC ; COMDAT ; Line 173 $LN3: mov rax, rsp sub rsp, 56 ; 00000038H xorps xmm0, xmm0 movss xmm1, DWORD PTR __real@3f800000 mov BYTE PTR [rax-12], 3 lea rcx, QWORD PTR [rax-24] movss DWORD PTR [rax-24], xmm0 movss xmm0, DWORD PTR __real@40000000 movss DWORD PTR [rax-20], xmm1 movss DWORD PTR [rax-16], xmm0 movaps xmm1, XMMWORD PTR [rax-24] movdqa XMMWORD PTR [rax-24], xmm1 call f_sfffc add rsp, 56 ; 00000038H ret 0 call_f_sfffc ENDP _TEXT ENDS PUBLIC call_f_scfff EXTRN f_scfff:PROC ; COMDAT pdata pdata SEGMENT $pdata$call_f_scfff DD imagerel $LN3 DD imagerel $LN3+73 DD imagerel $unwind$call_f_scfff pdata ENDS ; COMDAT xdata xdata SEGMENT $unwind$call_f_scfff DD 010701H DD 06207H ; Function compile flags: /Ogtpy xdata ENDS ; COMDAT call_f_scfff _TEXT SEGMENT call_f_scfff PROC ; COMDAT ; Line 177 $LN3: mov rax, rsp sub rsp, 56 ; 00000038H movss xmm0, DWORD PTR __real@3f800000 movss xmm1, DWORD PTR __real@40000000 mov BYTE PTR [rax-24], 0 lea rcx, QWORD PTR [rax-24] movss DWORD PTR [rax-20], xmm0 movss xmm0, DWORD PTR __real@40400000 movss DWORD PTR [rax-16], xmm1 movss DWORD PTR [rax-12], xmm0 movaps xmm1, XMMWORD PTR [rax-24] movdqa XMMWORD PTR [rax-24], xmm1 call f_scfff add rsp, 56 ; 00000038H ret 0 call_f_scfff ENDP _TEXT ENDS END MoarVM-2015.11/3rdparty/dyncall/test/samples/composite/args.c0000644000175000017500000001145412456307246023011 0ustar jnthnjnthn// types: typedef struct { int x, y; } s2i; typedef struct { int x, y, z, w; } s4i; typedef struct { int x, y, z, w, a, b, c, d; } s8i; typedef struct { float x, y; } s2f; typedef struct { float x, y, z, w; } s4f; typedef struct { double x; } s1d; typedef struct { double x, y; } s2d; typedef struct { double x, y, z, w; } s4d; typedef struct { long double x; } s1q; #if defined(__ARM_NEON__) #include #endif #if defined(__i386__) || defined(__x86_64__) && ( defined(__MMX__) || defined(__SSE__) ) #if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ > 2) #include #if defined(__AVX__) #define V256 1 typedef __m256 v256_t; #endif #else #include #endif #if defined(__MMX__) #define V64 1 typedef __m64 v64_t; #endif #if defined(__SSE__) #define V128 1 typedef __m128 v128_t; #endif #endif #if V64 typedef struct { v64_t f1; } s1w; typedef struct { v64_t f1, f2; } s2w; typedef struct { v64_t f1, f2, f3, f4; } s4w; #endif #if V128 typedef struct { v128_t f1; } s1x; typedef struct { v128_t f1, f2; } s2x; typedef struct { v64_t f1; v128_t f2; } swx; #endif // x86_64: /* x86_64 ------------ (v{ii}) regs int 8 (v{iiii}) regs int 16 (v{iiiiiiii}) stack 32 (v{ff}) regs sse 8 (v{ffff}) regs sse 16 (v{d}) regs sse 8 (v{dd}) regs sse 16 (v{dddd}) stack 32 (v{w}) regs sse 8 (v{ww}) regs sse 16 (v{wwww}) stack 32 (v{x}) regs sse 16 (v{xx}) stack 32 (v(wx}) stack 32 (v{xw}) stack 32 (v{y}) stack 32 (v{yy}{x}) stack 32 (v{ifif}) */ #if V256 typedef struct { v256_t f1; } s1y; typedef struct { v256_t f1; v256_t f2; } s2y; typedef v256_t y; extern void f_y(y a1); void call_f_y() { y a1 = {0,}; f_y(a1); } extern void f_s2ys1x(s2y a1,s1x a2); void call_f_s2ys1x() { s2y a1 = {0,}; s1x a2 = {0,}; f_s2ys1x(a1,a2); } extern void f_s1xs2y(s1x a1,s2y a2); void call_f_s1xs2y() { s1x a1 = {0,}; s2y a2 = {0,}; f_s1xs2y(a1,a2); } extern void f_s1y(s1y a1); void call_f_s1y() { s1y a1 = {0,}; f_s1y(a1); } extern void f_s2y(s2y a1); void call_f_s2y() { s2y a1 = {0,}; f_s2y(a1); } extern void f_s1ys1y(s1y a1,s1y a2); void call_f_s1ys1y() { s1y a1 = {0,}, a2 = {0,}; f_s1ys1y(a1,a2); } extern void f_s2ys1y(s2y a1,s1y a2); void call_f_s2ys1y() { s2y a1 = {0,}; s1y a2 = {0,}; f_s2ys1y(a1,a2); } #endif #if V128 extern void f_swx(swx a1); void call_f_swx() { swx a1 = {0,}; f_swx(a1); } extern void f_s2x(s2x a1); void call_f_s2x() { s2x a1 = {0,}; f_s2x(a1); } extern void f_s1x(s1x a1); void call_f_s1x() { s1x a1 = {0,}; f_s1x(a1); } #endif #if V64 extern void f_s4w(s4w a1); void call_f_s4w() { s4w a1 = {0,}; f_s4w(a1); } extern void f_s2w(s2w a1); void call_f_s2w() { s2w a1 = {0,}; f_s2w(a1); } extern void f_s1w(s1w a1); void call_f_s1w() { s1w a1 = {0,}; f_s1w(a1); } #endif // one composite argument: extern void f_s2i(s2i a1); void call_f_s2i() { s2i a1 = {0,}; f_s2i(a1); } extern void f_s4i(s4i a1); void call_f_s4i() { s4i a1 = {0,}; f_s4i(a1); } extern void f_s8i(s8i a1); void call_f_s8i() { s8i a1 = {0,}; f_s8i(a1); } extern void f_s2f(s2f a1); void call_f_s2f() { s2f a1 = {0,}; f_s2f(a1); } extern void f_s4f(s4f a1); void call_f_s4f() { s4f a1 = {0,}; f_s4f(a1); } extern void f_s1d(s1d a1); void call_f_s1d() { s1d a1 = {0,}; f_s1d(a1); } extern void f_s2d(s2d a1); void call_f_s2d() { s2d a1 = {0,}; f_s2d(a1); } extern void f_s4d(s4d a1); void call_f_s4d() { s4d a1 = {0,}; f_s4d(a1); } extern void f_s1q(s1q a1); void call_f_s1q() { s1q a1 = {0,}; f_s1q(a1); } // multiple arguments: extern void f_s2ds2d(s2d a1, s2d a2); void call_f_s2ds2d() { s2d a1={0,}; s2d a2={0,}; f_s2ds2d(a1,a2); } typedef struct { float x; int y; float z; int w; } sfifi; extern void f_sfifi(sfifi a1); void call_f_sfifi() { sfifi a1 = {0,1,2,3,}; f_sfifi(a1); } // int/float 4-byte alignment. typedef struct { int x; float y; int z; float w; } sifif; extern void f_sifif(sifif a1); void call_f_sifif() { sifif a1 = {0,1,2,3,}; f_sifif(a1); } #define FULL_T char, short, int, long int, char, char, char, char #define FULL_V 0,1,2,3,4,5,6,7 #define REMAIN64_T char, char #define REMAIN64_V 0,1 extern void f_full_sifif(FULL_T, sifif a1); void call_f_full_sifif() { sifif a1 = {0,}; f_full_sifif(FULL_V,a1); } extern void f_remain64_sifif(REMAIN64_T, sifif a1); void call_f_remain64_sifif() { sifif a1 = {0,}; f_remain64_sifif(REMAIN64_V,a1); } typedef struct { float f1,f2,f3; char f4; } sfffc; extern void f_sfffc(sfffc a1); void call_f_sfffc() { sfffc a1 = {0,1,2,3,}; f_sfffc(a1); } typedef struct { char f1; float f2,f3,f4; } scfff; extern void f_scfff(scfff a1); void call_f_scfff() { scfff a1 = {0,1,2,3,}; f_scfff(a1); } MoarVM-2015.11/3rdparty/dyncall/test/samples/composite/args.s0000644000175000017500000002425312456307246023032 0ustar jnthnjnthn .section __TEXT,__text,regular,pure_instructions .globl _call_f_swx .align 4, 0x90 _call_f_swx: ## @call_f_swx Ltmp2: .cfi_startproc ## BB#0: pushq %rbp Ltmp3: .cfi_def_cfa_offset 16 Ltmp4: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp5: .cfi_def_cfa_register %rbp subq $64, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps %xmm0, -32(%rbp) movaps -32(%rbp), %xmm0 movaps -16(%rbp), %xmm1 movaps %xmm1, 16(%rsp) movaps %xmm0, (%rsp) callq _f_swx addq $64, %rsp popq %rbp ret Ltmp6: .cfi_endproc Leh_func_end0: .globl _call_f_s2x .align 4, 0x90 _call_f_s2x: ## @call_f_s2x Ltmp9: .cfi_startproc ## BB#0: pushq %rbp Ltmp10: .cfi_def_cfa_offset 16 Ltmp11: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp12: .cfi_def_cfa_register %rbp subq $64, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps %xmm0, -32(%rbp) movaps -32(%rbp), %xmm0 movaps -16(%rbp), %xmm1 movaps %xmm1, 16(%rsp) movaps %xmm0, (%rsp) callq _f_s2x addq $64, %rsp popq %rbp ret Ltmp13: .cfi_endproc Leh_func_end1: .globl _call_f_s1x .align 4, 0x90 _call_f_s1x: ## @call_f_s1x Ltmp16: .cfi_startproc ## BB#0: pushq %rbp Ltmp17: .cfi_def_cfa_offset 16 Ltmp18: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp19: .cfi_def_cfa_register %rbp xorps %xmm0, %xmm0 popq %rbp jmp _f_s1x ## TAILCALL Ltmp20: .cfi_endproc Leh_func_end2: .globl _call_f_s4w .align 4, 0x90 _call_f_s4w: ## @call_f_s4w Ltmp23: .cfi_startproc ## BB#0: pushq %rbp Ltmp24: .cfi_def_cfa_offset 16 Ltmp25: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp26: .cfi_def_cfa_register %rbp subq $64, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps %xmm0, -32(%rbp) movq -8(%rbp), %rax movq %rax, 24(%rsp) movq -16(%rbp), %rax movq %rax, 16(%rsp) movq -32(%rbp), %rax movq -24(%rbp), %rcx movq %rcx, 8(%rsp) movq %rax, (%rsp) callq _f_s4w addq $64, %rsp popq %rbp ret Ltmp27: .cfi_endproc Leh_func_end3: .globl _call_f_s2w .align 4, 0x90 _call_f_s2w: ## @call_f_s2w Ltmp30: .cfi_startproc ## BB#0: pushq %rbp Ltmp31: .cfi_def_cfa_offset 16 Ltmp32: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp33: .cfi_def_cfa_register %rbp xorl %edi, %edi xorl %esi, %esi popq %rbp jmp _f_s2w ## TAILCALL Ltmp34: .cfi_endproc Leh_func_end4: .globl _call_f_s1w .align 4, 0x90 _call_f_s1w: ## @call_f_s1w Ltmp37: .cfi_startproc ## BB#0: pushq %rbp Ltmp38: .cfi_def_cfa_offset 16 Ltmp39: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp40: .cfi_def_cfa_register %rbp xorl %edi, %edi popq %rbp jmp _f_s1w ## TAILCALL Ltmp41: .cfi_endproc Leh_func_end5: .globl _call_f_s2i .align 4, 0x90 _call_f_s2i: ## @call_f_s2i Ltmp44: .cfi_startproc ## BB#0: pushq %rbp Ltmp45: .cfi_def_cfa_offset 16 Ltmp46: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp47: .cfi_def_cfa_register %rbp xorl %edi, %edi popq %rbp jmp _f_s2i ## TAILCALL Ltmp48: .cfi_endproc Leh_func_end6: .globl _call_f_s4i .align 4, 0x90 _call_f_s4i: ## @call_f_s4i Ltmp51: .cfi_startproc ## BB#0: pushq %rbp Ltmp52: .cfi_def_cfa_offset 16 Ltmp53: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp54: .cfi_def_cfa_register %rbp xorl %edi, %edi xorl %esi, %esi popq %rbp jmp _f_s4i ## TAILCALL Ltmp55: .cfi_endproc Leh_func_end7: .globl _call_f_s8i .align 4, 0x90 _call_f_s8i: ## @call_f_s8i Ltmp58: .cfi_startproc ## BB#0: pushq %rbp Ltmp59: .cfi_def_cfa_offset 16 Ltmp60: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp61: .cfi_def_cfa_register %rbp subq $64, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps %xmm0, -32(%rbp) movq -8(%rbp), %rax movq %rax, 24(%rsp) movq -16(%rbp), %rax movq %rax, 16(%rsp) movq -32(%rbp), %rax movq -24(%rbp), %rcx movq %rcx, 8(%rsp) movq %rax, (%rsp) callq _f_s8i addq $64, %rsp popq %rbp ret Ltmp62: .cfi_endproc Leh_func_end8: .globl _call_f_s2f .align 4, 0x90 _call_f_s2f: ## @call_f_s2f Ltmp65: .cfi_startproc ## BB#0: pushq %rbp Ltmp66: .cfi_def_cfa_offset 16 Ltmp67: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp68: .cfi_def_cfa_register %rbp xorps %xmm0, %xmm0 popq %rbp jmp _f_s2f ## TAILCALL Ltmp69: .cfi_endproc Leh_func_end9: .globl _call_f_s4f .align 4, 0x90 _call_f_s4f: ## @call_f_s4f Ltmp72: .cfi_startproc ## BB#0: pushq %rbp Ltmp73: .cfi_def_cfa_offset 16 Ltmp74: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp75: .cfi_def_cfa_register %rbp xorps %xmm0, %xmm0 xorps %xmm1, %xmm1 popq %rbp jmp _f_s4f ## TAILCALL Ltmp76: .cfi_endproc Leh_func_end10: .globl _call_f_s1d .align 4, 0x90 _call_f_s1d: ## @call_f_s1d Ltmp79: .cfi_startproc ## BB#0: pushq %rbp Ltmp80: .cfi_def_cfa_offset 16 Ltmp81: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp82: .cfi_def_cfa_register %rbp pxor %xmm0, %xmm0 popq %rbp jmp _f_s1d ## TAILCALL Ltmp83: .cfi_endproc Leh_func_end11: .globl _call_f_s2d .align 4, 0x90 _call_f_s2d: ## @call_f_s2d Ltmp86: .cfi_startproc ## BB#0: pushq %rbp Ltmp87: .cfi_def_cfa_offset 16 Ltmp88: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp89: .cfi_def_cfa_register %rbp pxor %xmm0, %xmm0 pxor %xmm1, %xmm1 popq %rbp jmp _f_s2d ## TAILCALL Ltmp90: .cfi_endproc Leh_func_end12: .globl _call_f_s4d .align 4, 0x90 _call_f_s4d: ## @call_f_s4d Ltmp93: .cfi_startproc ## BB#0: pushq %rbp Ltmp94: .cfi_def_cfa_offset 16 Ltmp95: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp96: .cfi_def_cfa_register %rbp subq $64, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps %xmm0, -32(%rbp) movq -8(%rbp), %rax movq %rax, 24(%rsp) movq -16(%rbp), %rax movq %rax, 16(%rsp) movq -32(%rbp), %rax movq -24(%rbp), %rcx movq %rcx, 8(%rsp) movq %rax, (%rsp) callq _f_s4d addq $64, %rsp popq %rbp ret Ltmp97: .cfi_endproc Leh_func_end13: .globl _call_f_s1q .align 4, 0x90 _call_f_s1q: ## @call_f_s1q Ltmp100: .cfi_startproc ## BB#0: pushq %rbp Ltmp101: .cfi_def_cfa_offset 16 Ltmp102: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp103: .cfi_def_cfa_register %rbp subq $32, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movaps -16(%rbp), %xmm0 movaps %xmm0, (%rsp) callq _f_s1q addq $32, %rsp popq %rbp ret Ltmp104: .cfi_endproc Leh_func_end14: .globl _call_f_s2ds2d .align 4, 0x90 _call_f_s2ds2d: ## @call_f_s2ds2d Ltmp107: .cfi_startproc ## BB#0: pushq %rbp Ltmp108: .cfi_def_cfa_offset 16 Ltmp109: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp110: .cfi_def_cfa_register %rbp pxor %xmm0, %xmm0 pxor %xmm1, %xmm1 pxor %xmm2, %xmm2 pxor %xmm3, %xmm3 popq %rbp jmp _f_s2ds2d ## TAILCALL Ltmp111: .cfi_endproc Leh_func_end15: .globl _call_f_sfifi .align 4, 0x90 _call_f_sfifi: ## @call_f_sfifi Ltmp114: .cfi_startproc ## BB#0: pushq %rbp Ltmp115: .cfi_def_cfa_offset 16 Ltmp116: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp117: .cfi_def_cfa_register %rbp movabsq $4294967296, %rdi ## imm = 0x100000000 movabsq $13958643712, %rsi ## imm = 0x340000000 popq %rbp jmp _f_sfifi ## TAILCALL Ltmp118: .cfi_endproc Leh_func_end16: .globl _call_f_sifif .align 4, 0x90 _call_f_sifif: ## @call_f_sifif Ltmp121: .cfi_startproc ## BB#0: pushq %rbp Ltmp122: .cfi_def_cfa_offset 16 Ltmp123: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp124: .cfi_def_cfa_register %rbp movabsq $4575657221408423936, %rdi ## imm = 0x3F80000000000000 movabsq $4629700416936869890, %rsi ## imm = 0x4040000000000002 popq %rbp jmp _f_sifif ## TAILCALL Ltmp125: .cfi_endproc Leh_func_end17: .globl _call_f_full_sifif .align 4, 0x90 _call_f_full_sifif: ## @call_f_full_sifif Ltmp128: .cfi_startproc ## BB#0: pushq %rbp Ltmp129: .cfi_def_cfa_offset 16 Ltmp130: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp131: .cfi_def_cfa_register %rbp subq $48, %rsp xorps %xmm0, %xmm0 movaps %xmm0, -16(%rbp) movq -16(%rbp), %rax movq -8(%rbp), %rcx movq %rcx, 24(%rsp) movq %rax, 16(%rsp) movl $7, 8(%rsp) movl $6, (%rsp) movl $0, %edi movl $1, %esi movl $2, %edx movl $3, %ecx movl $4, %r8d movl $5, %r9d callq _f_full_sifif addq $48, %rsp popq %rbp ret Ltmp132: .cfi_endproc Leh_func_end18: .globl _call_f_remain64_sifif .align 4, 0x90 _call_f_remain64_sifif: ## @call_f_remain64_sifif Ltmp135: .cfi_startproc ## BB#0: pushq %rbp Ltmp136: .cfi_def_cfa_offset 16 Ltmp137: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp138: .cfi_def_cfa_register %rbp xorl %edi, %edi movl $1, %esi xorl %edx, %edx xorl %ecx, %ecx popq %rbp jmp _f_remain64_sifif ## TAILCALL Ltmp139: .cfi_endproc Leh_func_end19: .section __TEXT,__const .align 4 LCPI20_0: .long 0 ## float 0.000000e+00 .long 1065353216 ## float 1.000000e+00 .space 4 .space 4 .section __TEXT,__text,regular,pure_instructions .globl _call_f_sfffc .align 4, 0x90 _call_f_sfffc: ## @call_f_sfffc Ltmp142: .cfi_startproc ## BB#0: pushq %rbp Ltmp143: .cfi_def_cfa_offset 16 Ltmp144: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp145: .cfi_def_cfa_register %rbp movaps LCPI20_0(%rip), %xmm0 movabsq $13958643712, %rdi ## imm = 0x340000000 popq %rbp jmp _f_sfffc ## TAILCALL Ltmp146: .cfi_endproc Leh_func_end20: .section __TEXT,__const .align 4 LCPI21_0: .long 1073741824 ## float 2.000000e+00 .long 1077936128 ## float 3.000000e+00 .space 4 .space 4 .section __TEXT,__text,regular,pure_instructions .globl _call_f_scfff .align 4, 0x90 _call_f_scfff: ## @call_f_scfff Ltmp149: .cfi_startproc ## BB#0: pushq %rbp Ltmp150: .cfi_def_cfa_offset 16 Ltmp151: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp152: .cfi_def_cfa_register %rbp movaps LCPI21_0(%rip), %xmm0 movabsq $4575657221408423936, %rdi ## imm = 0x3F80000000000000 popq %rbp jmp _f_scfff ## TAILCALL Ltmp153: .cfi_endproc Leh_func_end21: .subsections_via_symbols MoarVM-2015.11/3rdparty/dyncall/test/samples/composite/build.bat0000644000175000017500000000003612456307246023472 0ustar jnthnjnthncl /c /O2 args.c /Faargs.asm MoarVM-2015.11/3rdparty/dyncall/test/samples/composite/makefile0000644000175000017500000000043312456307246023404 0ustar jnthnjnthnTARGETS=args.s #CC=gcc-mp-4.7 #TARGET_ARCH=-march=corei7-avx #TARGET_ARCH=-march=corei7-avx -mavx -msse2avx #-mno-vzeroupper CFLAGS=-O3 #-fomit-frame-pointer -fno-exceptions # -fno-rtti all: ${TARGETS} clean: rm -f ${TARGETS} .c.s: ${CC} -S $< -o $@ ${CFLAGS} ${TARGET_ARCH} MoarVM-2015.11/3rdparty/dyncall/test/sharedlib/CMakeLists.txt0000644000175000017500000000012512456307246022731 0ustar jnthnjnthnadd_library(sharedlib SHARED sharedlib.c) target_link_libraries(sharedlib dynload_s) MoarVM-2015.11/3rdparty/dyncall/test/sharedlib/Makefile.embedded0000644000175000017500000000056012502366750023361 0ustar jnthnjnthnMAKEFILE = Makefile.embedded MAKE_CMD = ${MAKE} -f ${MAKEFILE} TARGET = libsharedlib.so OBJS = sharedlib.o CPPFLAGS += -I../../dynload LDFLAGS += -L../../dynload LDLIBS += -ldynload_s ${TARGET}: ${OBJS} ${CC} -shared -o $@ $? ${LDFLAGS} ${LDLIBS} all: ${TARGET} clean: rm -f ${TARGET} ${OBJS} sun-gcc: CC=gcc CFLAGS="${CFLAGS} -fPIC" ${MAKE_CMD} all MoarVM-2015.11/3rdparty/dyncall/test/sharedlib/sharedlib.c0000644000175000017500000000203112456307246022270 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/sharedlib/sharedlib.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dynload.h" DLLib* mylib_load(char const *name) { return dlLoadLibrary(name); } MoarVM-2015.11/3rdparty/dyncall/test/sign/Makefile.generic0000644000175000017500000000055312466674236022263 0ustar jnthnjnthnAPP = sign OBJS = sign.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s CFLAGS += -O3 .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/sign/sign.c0000644000175000017500000000433712466674236020320 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/sign/sign.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include // This program demonstrates the need for 'unsigned' integers and the // ability to implement zero/sign extensions for small integers. // This test program indicates failure on powerpc 32-bit with // compiler optimizations enabled (e.g. '-O2' compilation flags). // // A fix to be incorporated in the API is also given. // int add1s(unsigned short x) { return x + 1; } // API BUGFIX: #define dcArgUShort(vm,x) dcArgInt(vm,(int)(unsigned int)(x)) // OLD TEST: int add1(unsigned char x) { return x + 1; } int main(int argc, char* argv[]) { DCCallVM* vm; int result; int total; vm = dcNewCallVM(4096); dcReset(vm); dcArgShort(vm, 0xFFFF ); result = dcCallInt( vm, &add1s ); total = (result == 0x10000); printf("result: sign: %d\n", total); if (!total) { // // TEST BUGFIX: use instead.. // dcReset(vm); dcArgUShort( vm, 0xFFFF ); result = dcCallInt( vm, &add1s ); total = (result == 0x10000); printf("result: sign (bugfix): %d\n", total); } // result = dcCallInt( vm, &add1s ); // total = (result == 0x10000); // OLD TEST: updated to using 'short' // dcArgChar( vm, (char) 255 ); // result = dcCallInt( vm, &add1 ); // total = (result == 256); // printf("result: sign: %d\n", total); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/suite/CMakeLists.txt0000644000175000017500000000021212456307246022122 0ustar jnthnjnthnadd_executable(suite main.c case.c) if(WIN32) else() list(APPEND AUX_LIBS m) endif() target_link_libraries(suite dyncall_s ${AUX_LIBS}) MoarVM-2015.11/3rdparty/dyncall/test/suite/Makefile.M0000644000175000017500000000015312456307246021221 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite/Makefile.embedded0000644000175000017500000000052312502366750022554 0ustar jnthnjnthnAPP = suite OBJS = case.o main.o SRCTOP = ../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDFLAGS += -L${BLDTOP}/dyncall LDLIBS += -ldyncall_s .PHONY: all clean autogen all: ${APP} ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} autogen: python mkcase.py >case.h 2>config.h MoarVM-2015.11/3rdparty/dyncall/test/suite/Makefile.generic0000644000175000017500000000054312456307246022444 0ustar jnthnjnthnAPP = suite OBJS = case.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/suite/Nmakefile0000644000175000017500000000375612456307246021220 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite/README.txt0000644000175000017500000000315612456307246021072 0ustar jnthnjnthndyncall stress test suite: testing standard C calls =================================================== Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: suite - run full range suite - run test id suite - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position MoarVM-2015.11/3rdparty/dyncall/test/suite/case.c0000644000175000017500000001330112456307246020444 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite/case.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" DCValue mValue[NARGS]; void clearValues() { int i; for(i=0; i, Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCdouble,f_d) VF1(2,DClonglong,f_l) VF2(3,DCdouble,DCdouble,f_dd) VF2(4,DClonglong,DCdouble,f_ld) VF2(5,DCdouble,DClonglong,f_dl) VF2(6,DClonglong,DClonglong,f_ll) VF3(7,DCdouble,DCdouble,DCdouble,f_ddd) VF3(8,DClonglong,DCdouble,DCdouble,f_ldd) VF3(9,DCdouble,DClonglong,DCdouble,f_dld) VF3(10,DClonglong,DClonglong,DCdouble,f_lld) VF3(11,DCdouble,DCdouble,DClonglong,f_ddl) VF3(12,DClonglong,DCdouble,DClonglong,f_ldl) VF3(13,DCdouble,DClonglong,DClonglong,f_dll) VF3(14,DClonglong,DClonglong,DClonglong,f_lll) VF4(15,DCdouble,DCdouble,DCdouble,DCdouble,f_dddd) VF4(16,DClonglong,DCdouble,DCdouble,DCdouble,f_lddd) VF4(17,DCdouble,DClonglong,DCdouble,DCdouble,f_dldd) VF4(18,DClonglong,DClonglong,DCdouble,DCdouble,f_lldd) VF4(19,DCdouble,DCdouble,DClonglong,DCdouble,f_ddld) VF4(20,DClonglong,DCdouble,DClonglong,DCdouble,f_ldld) VF4(21,DCdouble,DClonglong,DClonglong,DCdouble,f_dlld) VF4(22,DClonglong,DClonglong,DClonglong,DCdouble,f_llld) VF4(23,DCdouble,DCdouble,DCdouble,DClonglong,f_dddl) VF4(24,DClonglong,DCdouble,DCdouble,DClonglong,f_lddl) VF4(25,DCdouble,DClonglong,DCdouble,DClonglong,f_dldl) VF4(26,DClonglong,DClonglong,DCdouble,DClonglong,f_lldl) VF4(27,DCdouble,DCdouble,DClonglong,DClonglong,f_ddll) VF4(28,DClonglong,DCdouble,DClonglong,DClonglong,f_ldll) VF4(29,DCdouble,DClonglong,DClonglong,DClonglong,f_dlll) VF4(30,DClonglong,DClonglong,DClonglong,DClonglong,f_llll) VF5(31,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddd) VF5(32,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_ldddd) VF5(33,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_dlddd) VF5(34,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_llddd) VF5(35,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_ddldd) VF5(36,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_ldldd) VF5(37,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_dlldd) VF5(38,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_llldd) VF5(39,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_dddld) VF5(40,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_lddld) VF5(41,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_dldld) VF5(42,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_lldld) VF5(43,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_ddlld) VF5(44,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_ldlld) VF5(45,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_dllld) VF5(46,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_lllld) VF5(47,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_ddddl) VF5(48,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_ldddl) VF5(49,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_dlddl) VF5(50,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_llddl) VF5(51,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_ddldl) VF5(52,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_ldldl) VF5(53,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_dlldl) VF5(54,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_llldl) VF5(55,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_dddll) VF5(56,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_lddll) VF5(57,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_dldll) VF5(58,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_lldll) VF5(59,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_ddlll) VF5(60,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_ldlll) VF5(61,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_dllll) VF5(62,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_lllll) VF6(63,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddd) VF6(64,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_lddddd) VF6(65,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_dldddd) VF6(66,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_lldddd) VF6(67,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ddlddd) VF6(68,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ldlddd) VF6(69,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_dllddd) VF6(70,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_lllddd) VF6(71,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_dddldd) VF6(72,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_lddldd) VF6(73,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_dldldd) VF6(74,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_lldldd) VF6(75,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ddlldd) VF6(76,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ldlldd) VF6(77,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_dllldd) VF6(78,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_lllldd) VF6(79,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ddddld) VF6(80,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ldddld) VF6(81,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_dlddld) VF6(82,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_llddld) VF6(83,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ddldld) VF6(84,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ldldld) VF6(85,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_dlldld) VF6(86,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_llldld) VF6(87,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_dddlld) VF6(88,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_lddlld) VF6(89,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_dldlld) VF6(90,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_lldlld) VF6(91,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ddllld) VF6(92,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ldllld) VF6(93,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_dlllld) VF6(94,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_llllld) VF6(95,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_dddddl) VF6(96,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_lddddl) VF6(97,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_dldddl) VF6(98,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_lldddl) VF6(99,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ddlddl) VF6(100,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ldlddl) VF6(101,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_dllddl) VF6(102,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_lllddl) VF6(103,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_dddldl) VF6(104,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_lddldl) VF6(105,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_dldldl) VF6(106,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_lldldl) VF6(107,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ddlldl) VF6(108,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ldlldl) VF6(109,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_dllldl) VF6(110,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_lllldl) VF6(111,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ddddll) VF6(112,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ldddll) VF6(113,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_dlddll) VF6(114,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_llddll) VF6(115,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ddldll) VF6(116,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ldldll) VF6(117,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_dlldll) VF6(118,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_llldll) VF6(119,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_dddlll) VF6(120,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_lddlll) VF6(121,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_dldlll) VF6(122,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_lldlll) VF6(123,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ddllll) VF6(124,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ldllll) VF6(125,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_dlllll) VF6(126,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_llllll) VF7(127,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddddd) VF7(128,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ldddddd) VF7(129,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dlddddd) VF7(130,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_llddddd) VF7(131,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_ddldddd) VF7(132,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_ldldddd) VF7(133,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_dlldddd) VF7(134,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_llldddd) VF7(135,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_dddlddd) VF7(136,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_lddlddd) VF7(137,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_dldlddd) VF7(138,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_lldlddd) VF7(139,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_ddllddd) VF7(140,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_ldllddd) VF7(141,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_dlllddd) VF7(142,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_llllddd) VF7(143,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_ddddldd) VF7(144,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_ldddldd) VF7(145,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_dlddldd) VF7(146,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_llddldd) VF7(147,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_ddldldd) VF7(148,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_ldldldd) VF7(149,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_dlldldd) VF7(150,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_llldldd) VF7(151,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_dddlldd) VF7(152,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_lddlldd) VF7(153,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_dldlldd) VF7(154,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_lldlldd) VF7(155,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_ddllldd) VF7(156,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_ldllldd) VF7(157,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_dlllldd) VF7(158,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_llllldd) VF7(159,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_dddddld) VF7(160,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_lddddld) VF7(161,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_dldddld) VF7(162,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_lldddld) VF7(163,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_ddlddld) VF7(164,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_ldlddld) VF7(165,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_dllddld) VF7(166,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_lllddld) VF7(167,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_dddldld) VF7(168,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_lddldld) VF7(169,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_dldldld) VF7(170,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_lldldld) VF7(171,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_ddlldld) VF7(172,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_ldlldld) VF7(173,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_dllldld) VF7(174,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_lllldld) VF7(175,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_ddddlld) VF7(176,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_ldddlld) VF7(177,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_dlddlld) VF7(178,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_llddlld) VF7(179,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_ddldlld) VF7(180,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_ldldlld) VF7(181,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_dlldlld) VF7(182,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_llldlld) VF7(183,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_dddllld) VF7(184,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_lddllld) VF7(185,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_dldllld) VF7(186,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_lldllld) VF7(187,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_ddlllld) VF7(188,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_ldlllld) VF7(189,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_dllllld) VF7(190,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_lllllld) VF7(191,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_ddddddl) VF7(192,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_ldddddl) VF7(193,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_dlddddl) VF7(194,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_llddddl) VF7(195,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_ddldddl) VF7(196,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_ldldddl) VF7(197,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_dlldddl) VF7(198,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_llldddl) VF7(199,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_dddlddl) VF7(200,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_lddlddl) VF7(201,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_dldlddl) VF7(202,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_lldlddl) VF7(203,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_ddllddl) VF7(204,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_ldllddl) VF7(205,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_dlllddl) VF7(206,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_llllddl) VF7(207,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_ddddldl) VF7(208,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_ldddldl) VF7(209,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_dlddldl) VF7(210,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_llddldl) VF7(211,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_ddldldl) VF7(212,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_ldldldl) VF7(213,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_dlldldl) VF7(214,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_llldldl) VF7(215,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_dddlldl) VF7(216,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_lddlldl) VF7(217,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_dldlldl) VF7(218,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_lldlldl) VF7(219,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_ddllldl) VF7(220,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_ldllldl) VF7(221,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_dlllldl) VF7(222,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_llllldl) VF7(223,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_dddddll) VF7(224,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_lddddll) VF7(225,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_dldddll) VF7(226,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_lldddll) VF7(227,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_ddlddll) VF7(228,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_ldlddll) VF7(229,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_dllddll) VF7(230,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_lllddll) VF7(231,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_dddldll) VF7(232,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_lddldll) VF7(233,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_dldldll) VF7(234,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_lldldll) VF7(235,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_ddlldll) VF7(236,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_ldlldll) VF7(237,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_dllldll) VF7(238,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_lllldll) VF7(239,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_ddddlll) VF7(240,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_ldddlll) VF7(241,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_dlddlll) VF7(242,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_llddlll) VF7(243,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_ddldlll) VF7(244,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_ldldlll) VF7(245,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_dlldlll) VF7(246,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_llldlll) VF7(247,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_dddllll) VF7(248,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_lddllll) VF7(249,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_dldllll) VF7(250,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_lldllll) VF7(251,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_ddlllll) VF7(252,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_ldlllll) VF7(253,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_dllllll) VF7(254,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_lllllll) VF8(255,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddddd) VF8(256,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_lddddddd) VF8(257,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dldddddd) VF8(258,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_lldddddd) VF8(259,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddlddddd) VF8(260,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ldlddddd) VF8(261,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dllddddd) VF8(262,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_lllddddd) VF8(263,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_dddldddd) VF8(264,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_lddldddd) VF8(265,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_dldldddd) VF8(266,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_lldldddd) VF8(267,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_ddlldddd) VF8(268,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_ldlldddd) VF8(269,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_dllldddd) VF8(270,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,f_lllldddd) VF8(271,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ddddlddd) VF8(272,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ldddlddd) VF8(273,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_dlddlddd) VF8(274,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_llddlddd) VF8(275,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ddldlddd) VF8(276,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_ldldlddd) VF8(277,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_dlldlddd) VF8(278,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,f_llldlddd) VF8(279,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_dddllddd) VF8(280,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_lddllddd) VF8(281,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_dldllddd) VF8(282,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_lldllddd) VF8(283,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_ddlllddd) VF8(284,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_ldlllddd) VF8(285,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_dllllddd) VF8(286,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,f_lllllddd) VF8(287,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_dddddldd) VF8(288,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_lddddldd) VF8(289,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_dldddldd) VF8(290,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_lldddldd) VF8(291,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_ddlddldd) VF8(292,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_ldlddldd) VF8(293,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_dllddldd) VF8(294,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,f_lllddldd) VF8(295,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_dddldldd) VF8(296,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_lddldldd) VF8(297,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_dldldldd) VF8(298,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_lldldldd) VF8(299,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_ddlldldd) VF8(300,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_ldlldldd) VF8(301,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_dllldldd) VF8(302,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,f_lllldldd) VF8(303,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ddddlldd) VF8(304,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ldddlldd) VF8(305,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_dlddlldd) VF8(306,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_llddlldd) VF8(307,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ddldlldd) VF8(308,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_ldldlldd) VF8(309,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_dlldlldd) VF8(310,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,f_llldlldd) VF8(311,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_dddllldd) VF8(312,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_lddllldd) VF8(313,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_dldllldd) VF8(314,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_lldllldd) VF8(315,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_ddlllldd) VF8(316,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_ldlllldd) VF8(317,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_dllllldd) VF8(318,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,f_lllllldd) VF8(319,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ddddddld) VF8(320,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ldddddld) VF8(321,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_dlddddld) VF8(322,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_llddddld) VF8(323,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ddldddld) VF8(324,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_ldldddld) VF8(325,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_dlldddld) VF8(326,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,f_llldddld) VF8(327,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_dddlddld) VF8(328,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_lddlddld) VF8(329,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_dldlddld) VF8(330,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_lldlddld) VF8(331,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_ddllddld) VF8(332,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_ldllddld) VF8(333,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_dlllddld) VF8(334,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,f_llllddld) VF8(335,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ddddldld) VF8(336,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ldddldld) VF8(337,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_dlddldld) VF8(338,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_llddldld) VF8(339,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ddldldld) VF8(340,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_ldldldld) VF8(341,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_dlldldld) VF8(342,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,f_llldldld) VF8(343,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_dddlldld) VF8(344,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_lddlldld) VF8(345,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_dldlldld) VF8(346,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_lldlldld) VF8(347,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_ddllldld) VF8(348,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_ldllldld) VF8(349,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_dlllldld) VF8(350,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,f_llllldld) VF8(351,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_dddddlld) VF8(352,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_lddddlld) VF8(353,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_dldddlld) VF8(354,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_lldddlld) VF8(355,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_ddlddlld) VF8(356,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_ldlddlld) VF8(357,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_dllddlld) VF8(358,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,f_lllddlld) VF8(359,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_dddldlld) VF8(360,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_lddldlld) VF8(361,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_dldldlld) VF8(362,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_lldldlld) VF8(363,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_ddlldlld) VF8(364,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_ldlldlld) VF8(365,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_dllldlld) VF8(366,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,f_lllldlld) VF8(367,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ddddllld) VF8(368,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ldddllld) VF8(369,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_dlddllld) VF8(370,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_llddllld) VF8(371,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ddldllld) VF8(372,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_ldldllld) VF8(373,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_dlldllld) VF8(374,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,f_llldllld) VF8(375,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_dddlllld) VF8(376,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_lddlllld) VF8(377,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_dldlllld) VF8(378,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_lldlllld) VF8(379,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_ddllllld) VF8(380,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_ldllllld) VF8(381,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_dlllllld) VF8(382,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,f_llllllld) VF8(383,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_dddddddl) VF8(384,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_lddddddl) VF8(385,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_dldddddl) VF8(386,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_lldddddl) VF8(387,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_ddlddddl) VF8(388,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_ldlddddl) VF8(389,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_dllddddl) VF8(390,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,f_lllddddl) VF8(391,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_dddldddl) VF8(392,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_lddldddl) VF8(393,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_dldldddl) VF8(394,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_lldldddl) VF8(395,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_ddlldddl) VF8(396,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_ldlldddl) VF8(397,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_dllldddl) VF8(398,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,f_lllldddl) VF8(399,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ddddlddl) VF8(400,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ldddlddl) VF8(401,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_dlddlddl) VF8(402,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_llddlddl) VF8(403,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ddldlddl) VF8(404,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_ldldlddl) VF8(405,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_dlldlddl) VF8(406,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,f_llldlddl) VF8(407,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_dddllddl) VF8(408,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_lddllddl) VF8(409,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_dldllddl) VF8(410,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_lldllddl) VF8(411,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_ddlllddl) VF8(412,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_ldlllddl) VF8(413,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_dllllddl) VF8(414,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,f_lllllddl) VF8(415,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_dddddldl) VF8(416,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_lddddldl) VF8(417,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_dldddldl) VF8(418,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_lldddldl) VF8(419,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_ddlddldl) VF8(420,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_ldlddldl) VF8(421,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_dllddldl) VF8(422,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,f_lllddldl) VF8(423,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_dddldldl) VF8(424,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_lddldldl) VF8(425,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_dldldldl) VF8(426,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_lldldldl) VF8(427,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_ddlldldl) VF8(428,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_ldlldldl) VF8(429,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_dllldldl) VF8(430,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,f_lllldldl) VF8(431,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ddddlldl) VF8(432,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ldddlldl) VF8(433,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_dlddlldl) VF8(434,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_llddlldl) VF8(435,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ddldlldl) VF8(436,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_ldldlldl) VF8(437,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_dlldlldl) VF8(438,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,f_llldlldl) VF8(439,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_dddllldl) VF8(440,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_lddllldl) VF8(441,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_dldllldl) VF8(442,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_lldllldl) VF8(443,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_ddlllldl) VF8(444,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_ldlllldl) VF8(445,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_dllllldl) VF8(446,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,f_lllllldl) VF8(447,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ddddddll) VF8(448,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ldddddll) VF8(449,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_dlddddll) VF8(450,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_llddddll) VF8(451,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ddldddll) VF8(452,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_ldldddll) VF8(453,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_dlldddll) VF8(454,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,f_llldddll) VF8(455,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_dddlddll) VF8(456,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_lddlddll) VF8(457,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_dldlddll) VF8(458,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_lldlddll) VF8(459,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_ddllddll) VF8(460,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_ldllddll) VF8(461,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_dlllddll) VF8(462,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,f_llllddll) VF8(463,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ddddldll) VF8(464,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ldddldll) VF8(465,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_dlddldll) VF8(466,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_llddldll) VF8(467,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ddldldll) VF8(468,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_ldldldll) VF8(469,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_dlldldll) VF8(470,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,f_llldldll) VF8(471,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_dddlldll) VF8(472,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_lddlldll) VF8(473,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_dldlldll) VF8(474,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_lldlldll) VF8(475,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_ddllldll) VF8(476,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_ldllldll) VF8(477,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_dlllldll) VF8(478,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,f_llllldll) VF8(479,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_dddddlll) VF8(480,DClonglong,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_lddddlll) VF8(481,DCdouble,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_dldddlll) VF8(482,DClonglong,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_lldddlll) VF8(483,DCdouble,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_ddlddlll) VF8(484,DClonglong,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_ldlddlll) VF8(485,DCdouble,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_dllddlll) VF8(486,DClonglong,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,f_lllddlll) VF8(487,DCdouble,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_dddldlll) VF8(488,DClonglong,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_lddldlll) VF8(489,DCdouble,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_dldldlll) VF8(490,DClonglong,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_lldldlll) VF8(491,DCdouble,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_ddlldlll) VF8(492,DClonglong,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_ldlldlll) VF8(493,DCdouble,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_dllldlll) VF8(494,DClonglong,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,f_lllldlll) VF8(495,DCdouble,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ddddllll) VF8(496,DClonglong,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ldddllll) VF8(497,DCdouble,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_dlddllll) VF8(498,DClonglong,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_llddllll) VF8(499,DCdouble,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ddldllll) VF8(500,DClonglong,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_ldldllll) VF8(501,DCdouble,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_dlldllll) VF8(502,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,f_llldllll) VF8(503,DCdouble,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_dddlllll) VF8(504,DClonglong,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_lddlllll) VF8(505,DCdouble,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_dldlllll) VF8(506,DClonglong,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_lldlllll) VF8(507,DCdouble,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_ddllllll) VF8(508,DClonglong,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_ldllllll) VF8(509,DCdouble,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_dlllllll) VF8(510,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,f_llllllll) MoarVM-2015.11/3rdparty/dyncall/test/suite/config.h0000644000175000017500000000200312456307246021000 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 8 #define NTYPES 2 MoarVM-2015.11/3rdparty/dyncall/test/suite/dynMakefile0000644000175000017500000000032412456307246021541 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite/main.c0000644000175000017500000001045712456307246020466 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite/main.c Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); typedef double precise; DCbool valueBool [NARGS]; DCshort valueShort [NARGS]; DCchar valueChar [NARGS]; DCint valueInt [NARGS]; DClonglong valueLongLong[NARGS]; DCdouble valueDouble [NARGS]; DCpointer valuePointer [NARGS]; DCfloat valueFloat [NARGS]; enum { ID_DOUBLE = 0, ID_LONGLONG, ID_INT, ID_POINTER, ID_BOOL, ID_FLOAT }; DCbool equals(int select, int pos, void* data) { switch(select) { case ID_BOOL: return ( getArg(pos)->B == valueBool [pos] ); break; case ID_INT: return ( getArg(pos)->i == valueInt [pos] ); break; case ID_LONGLONG: return ( getArg(pos)->l == valueLongLong[pos] ); break; case ID_DOUBLE: return ( getArg(pos)->d == valueDouble [pos] ); break; case ID_POINTER: return ( getArg(pos)->p == valuePointer [pos] ); break; case ID_FLOAT: return ( getArg(pos)->f == valueFloat [pos] ); break; } return DC_FALSE; } void clearValues(); void init() { int i; for(i=0; i0; ++pos) { int select = (y-1) % NTYPES; selects[pos] = select; push(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(i = 0;i, # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys # parameters nargs = 8 #TODO: enable all types. temporary disabled for debuggin sparc64. types = ["DCdouble","DClonglong"]#,"DCint","DCpointer","DCbool"]#,"DCfloat"] typeSigs = ["d" ,"l" ]#,"i" ,"p" ,"B" ]#,"f" ] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types [s] ] sig += [ typeSigs[s] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/suite/mkfile0000644000175000017500000000241712456307246020565 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = case main APPLICATION = suite LIBS = $TOP/dyncall/libdyncall_s.a$O #.PHONY: config #config: mkcase.py # echo Generating test cases... # python mkcase.py >case.h 2>config.h <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/suite2/CMakeLists.txt0000644000175000017500000000012012456307246022202 0ustar jnthnjnthnadd_executable(suite2 case.cc main.cc) target_link_libraries(suite2 dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite2/Makefile.M0000644000175000017500000000015312456307246021303 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite2/Makefile.embedded0000644000175000017500000000047512502366750022644 0ustar jnthnjnthnAPP = suite2 OBJS = case.o main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean autogen ${APP}: ${OBJS} ${CXX} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} autogen: python mkcase.py 1>case.h 2>config.h MoarVM-2015.11/3rdparty/dyncall/test/suite2/Makefile.generic0000644000175000017500000000065612456307246022533 0ustar jnthnjnthnAPP = suite2 OBJS = case.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CXXFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean configure install all: ${APP} ${APP}: ${OBJS} ${CXX} ${CXXFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} configure: python mkcase.py 1>case.h 2>config.h install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/suite2/Nmakefile0000644000175000017500000000410312456307246021265 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h design.cfg !IF "$(BUILD_OS)" == "windows" TARGETS = suite2.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite2.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) case.h config.h: mkcase.py python mkcase.py >case.h 2>config.h mkcase.py: design.cfg design.cfg: rand.py python rand.py >$@ !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite2/case.cc0000644000175000017500000002237412456307246020703 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "funcinfo.h" DCValue mValue[MAXARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } template<> void g(DClonglong value, int pos) { mValue[pos].l = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void f##id () {gID=id;} #define VF1(id,A1,S) void f##id (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void f##id (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void f##id (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);} #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);} #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);} #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);} #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);} #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);} #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);} #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);} #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);} #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) void f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19,A20 a20) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);g(a20,19);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #undef VF11 #undef VF12 #undef VF13 #undef VF14 #undef VF15 #undef VF16 #undef VF17 #undef VF18 #undef VF19 #undef VF20 #define VF0(id,S) { (void*)(f##id), #S }, #define VF1(id,A1,S) { (void*)(f##id), #S }, #define VF2(id,A1,A2,S) { (void*)(f##id), #S }, #define VF3(id,A1,A2,A3,S) { (void*)(f##id), #S }, #define VF4(id,A1,A2,A3,A4,S) { (void*)(f##id), #S }, #define VF5(id,A1,A2,A3,A4,A5,S) { (void*)(f##id), #S }, #define VF6(id,A1,A2,A3,A4,A5,A6,S) { (void*)(f##id), #S }, #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) { (void*)(f##id), #S }, #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) { (void*)(f##id), #S }, #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) { (void*)(f##id), #S }, #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) { (void*)(f##id), #S }, #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) { (void*)(f##id), #S }, #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) { (void*)(f##id), #S }, #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) { (void*)(f##id), #S }, #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) { (void*)(f##id), #S }, #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) { (void*)(f##id), #S }, #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) { (void*)(f##id), #S }, #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) { (void*)(f##id), #S }, #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) { (void*)(f##id), #S }, #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) { (void*)(f##id), #S }, #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) { (void*)(f##id), #S }, funcinfo gFuncInfos[] = { #include "case.h" }; MoarVM-2015.11/3rdparty/dyncall/test/suite2/case.h0000644000175000017500000000476412456307246020550 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF10(0,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,s_dddddddddd) VF10(1,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCint,s_iiiiiiiiii) VF14(2,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,s_iiiiiiiiffffff) VF14(3,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCint,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,s_iiiiiiiidddddd) VF10(4,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,s_ffffffffff) VF10(5,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,DClonglong,s_llllllllll) VF10(6,DCint,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,s_ifffffffff) VF10(7,DCint,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,s_iddddddddd) VF10(8,DCint,DCdouble,DCfloat,DCdouble,DCint,DCdouble,DCfloat,DCdouble,DCint,DCdouble,s_idfdidfdid) VF10(9,DCfloat,DCdouble,DCfloat,DCdouble,DCint,DCdouble,DCint,DCdouble,DCfloat,DCdouble,s_fdfdididfd) VF10(10,DCfloat,DCdouble,DCint,DCdouble,DCint,DCdouble,DCint,DCdouble,DCint,DCdouble,s_fdidididid) VF10(11,DCfloat,DCfloat,DCint,DCdouble,DCint,DCdouble,DCint,DCdouble,DCint,DCdouble,s_ffidididid) VF6(12,DCdouble,DCint,DCdouble,DCdouble,DCdouble,DCdouble,s_didddd) VF6(13,DCdouble,DCfloat,DCdouble,DCint,DCdouble,DCdouble,s_dfdidd) VF6(14,DCint,DClonglong,DCfloat,DClonglong,DCfloat,DClonglong,s_ilflfl) VF6(15,DCdouble,DCdouble,DCint,DCdouble,DCdouble,DCdouble,s_ddiddd) MoarVM-2015.11/3rdparty/dyncall/test/suite2/config.h0000644000175000017500000000200712456307246021066 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NCASES 16 #define MAXARGS 14 MoarVM-2015.11/3rdparty/dyncall/test/suite2/design.cfg0000644000175000017500000000027412456307246021406 0ustar jnthnjnthn dddddddddd iiiiiiiiii iiiiiiiiffffff iiiiiiiidddddd ffffffffff llllllllll ifffffffff iddddddddd idfdidfdid fdfdididfd fdidididid ffidididid didddd dfdidd ilflfl ddiddd MoarVM-2015.11/3rdparty/dyncall/test/suite2/dynMakefile0000644000175000017500000000032412456307246021623 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite2/funcinfo.h0000644000175000017500000000226512456307246021436 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2/funcinfo.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DC_TEST_FUNCINFO_H #define DC_TEST_FUNCINFO_H #include "../../dyncall/dyncall_signature.h" struct funcinfo { DCpointer funcptr; const DCsigchar* sig; }; extern funcinfo gFuncInfos[]; #endif /* DC_TEST_FUNCINFO_H */ MoarVM-2015.11/3rdparty/dyncall/test/suite2/ints.cfg0000644000175000017500000000010212456307246021100 0ustar jnthnjnthn i ii iii iiii iiiii iiiiii iiiiiii iiiiiiii iiiiiiiii iiiiiiiiii MoarVM-2015.11/3rdparty/dyncall/test/suite2/main.cc0000644000175000017500000001132512466674236020715 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "funcinfo.h" #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); typedef double precise; DCbool valueBool [MAXARGS]; DCchar valueChar [MAXARGS]; DCshort valueShort [MAXARGS]; DCint valueInt [MAXARGS]; DClonglong valueLongLong[MAXARGS]; DCdouble valueDouble [MAXARGS]; DCpointer valuePointer [MAXARGS]; DCfloat valueFloat [MAXARGS]; void clearValues(); void error(const char* message) { fprintf(stderr, "error: %s\n", message); exit(-1); } void init() { for (int i = 0 ; i < MAXARGS ; ++i ) { valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE ); valueChar[i] = DCchar(i); valueShort[i] = DCshort(i); valueInt[i] = DCint(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valuePointer[i] = DCpointer( (ptrdiff_t) i); valueFloat[i] = DCfloat(i); } } bool test(int x) { bool r = true; clearValues(); DCCallVM* pCall; funcinfo* fi = &gFuncInfos[x]; const DCsigchar* sig = &fi->sig[2]; const DCsigchar* ptr = sig; DCsigchar ch; int pos; pos = 0; pCall = dcNewCallVM(4096); dcReset(pCall); while ( (ch=*ptr++) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: dcArgBool ( pCall, valueBool [pos] ); break; case DC_SIGCHAR_CHAR: dcArgChar ( pCall, valueChar [pos] ); break; case DC_SIGCHAR_SHORT: dcArgShort ( pCall, valueShort [pos] ); break; case DC_SIGCHAR_INT: dcArgInt ( pCall, valueInt [pos] ); break; case DC_SIGCHAR_LONGLONG: dcArgLongLong( pCall, valueLongLong[pos] ); break; case DC_SIGCHAR_FLOAT: dcArgFloat ( pCall, valueFloat [pos] ); break; case DC_SIGCHAR_DOUBLE: dcArgDouble ( pCall, valueDouble [pos] ); break; case DC_SIGCHAR_POINTER: dcArgPointer ( pCall, valuePointer [pos] ); break; default: error("unsupported signature character"); break; } ++pos; } dcCallVoid( pCall, fi->funcptr ); if ( getId() == x ) { ptr = sig; pos = 0; while( ( ch=*ptr++ ) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: if ( getArg(pos)->B != valueBool [pos] ) r = false; break; case DC_SIGCHAR_CHAR: if ( getArg(pos)->c != valueChar [pos] ) r = false; break; case DC_SIGCHAR_SHORT: if ( getArg(pos)->s != valueShort [pos] ) r = false; break; case DC_SIGCHAR_INT: if ( getArg(pos)->i != valueInt [pos] ) r = false; break; case DC_SIGCHAR_LONGLONG: if ( getArg(pos)->L != valueLongLong [pos] ) r = false; break; case DC_SIGCHAR_FLOAT: if ( getArg(pos)->f != valueFloat [pos] ) r = false; break; case DC_SIGCHAR_DOUBLE: if ( getArg(pos)->d != valueDouble[pos] ) r = false; break; case DC_SIGCHAR_POINTER: if ( getArg(pos)->p != valuePointer [pos] ) r = false; break; default: error("unsupported signature character"); break; } ++pos; } } else { r = false; } printf("%d-%s:%d\n", x, sig, r); dcFree(pCall); return r; } bool run_range(int from, int to) { bool r = true; for (int i = from ; i < to ; ++i ) r &= test(i); return r; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { success = run_range(0,NCASES); } printf("result: suite2: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite2/mkcase.py0000644000175000017500000000375312456307246021276 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys f = file("design.cfg") sigmap = { 'B':'DCbool' , 'c':'DCchar' , 's':'DCshort' , 'i':'DCint' , 'l':'DClonglong' , 'f':'DCfloat' , 'd':'DCdouble' , 'p':'DCpointer' } apimap = { '_':'' , 's':'__declspec(stdcall)' , 'f':'__declspec(fastcall)' } id = 0 maxargs = 0 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); for line in f: line = line.rstrip().lstrip() if len(line) == 0 or line[0] == '#': continue types = []; # args = len(line)-1 args = len(line) maxargs = max(maxargs, args) # api = apimap[ line[0] ] out = [ "VF",str(args),"(", str(id), "," ]; for i in xrange(0,len(line)): types += [ sigmap[ line[i] ] ] out += [ ",".join( types ), ",s_", line, ")\n" ] out = "".join(out) sys.stdout.write(out) id += 1 sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join( ["#define NCASES ",str(id),"\n"] ) ) sys.stderr.write("".join( ["#define MAXARGS ",str(maxargs),"\n"] ) ) MoarVM-2015.11/3rdparty/dyncall/test/suite2/rand.py0000644000175000017500000000275212456307246020755 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import random import sys N = 1000 MINARG = 0 MAXARG = 19 argtypes = [ 'B','c','s','i','l','f','d','p' ] apitypes = [ '_' ] def sig(n): s = "" x = random.randint( 0, len(apitypes)-1 ) # s += apitypes[x] for i in xrange(0,n): x = random.randint( 0, len(argtypes)-1 ) s += argtypes[x] return s for i in xrange(0,N): n = random.randint(MINARG,MAXARG) sys.stdout.write( sig(n) ) sys.stdout.write( "\n" ) MoarVM-2015.11/3rdparty/dyncall/test/suite2/stress1.cfg0000644000175000017500000000027412456307246021541 0ustar jnthnjnthn dddddddddd iiiiiiiiii iiiiiiiiffffff iiiiiiiidddddd ffffffffff llllllllll ifffffffff iddddddddd idfdidfdid fdfdididfd fdidididid ffidididid didddd dfdidd ilflfl ddiddd MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/CMakeLists.txt0000644000175000017500000000015212456307246024455 0ustar jnthnjnthnadd_executable(suite2_x86win32fast case.cc main.cc) target_link_libraries(suite2_x86win32fast dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/Makefile.M0000644000175000017500000000015312456307246023551 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/Makefile.generic0000644000175000017500000000057412502366750024775 0ustar jnthnjnthnAPP = suite2_x86win32fast OBJS = case.o main.o TOP = ../.. CFLAGS = -I${TOP}/dyncall LDFLAGS = -L${TOP}/dyncall LDLIBS = -ldyncall_s LINK = ${CXX} all: ${APP} .PHONY: all clean install RM ?= rm -f AR ?= ar MKDIR ?= mkdir INSTALL ?= install -p ${APP}: ${OBJS} ${LINK} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} ${TARGET_ARCH} clean: ${RM} ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/Nmakefile0000644000175000017500000000376012456307246023543 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite2.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite2.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/case.cc0000644000175000017500000002250012456307246023140 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32fast/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "funcinfo.h" #ifdef DC__C_GNU #define API __attribute__((fastcall)) #else #define API __fastcall #endif DCValue mValue[MAXARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } template<> void g(DClonglong value, int pos) { mValue[pos].l = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void API f##id () {gID=id;} #define VF1(id,A1,S) void API f##id (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void API f##id (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void API f##id (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);} #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);} #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);} #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);} #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);} #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);} #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);} #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);} #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);} #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19,A20 a20) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);g(a20,19);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #undef VF11 #undef VF12 #undef VF13 #undef VF14 #undef VF15 #undef VF16 #undef VF17 #undef VF18 #undef VF19 #undef VF20 funcinfo gFuncInfos[] = { #define VF0(id,S) (void*)(f##id), #S, #define VF1(id,A1,S) (void*)(f##id), #S, #define VF2(id,A1,A2,S) (void*)(f##id), #S, #define VF3(id,A1,A2,A3,S) (void*)(f##id), #S, #define VF4(id,A1,A2,A3,A4,S) (void*)(f##id), #S, #define VF5(id,A1,A2,A3,A4,A5,S) (void*)(f##id), #S, #define VF6(id,A1,A2,A3,A4,A5,A6,S) (void*)(f##id), #S, #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) (void*)(f##id), #S, #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) (void*)(f##id), #S, #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) (void*)(f##id), #S, #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) (void*)(f##id), #S, #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) (void*)(f##id), #S, #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) (void*)(f##id), #S, #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) (void*)(f##id), #S, #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) (void*)(f##id), #S, #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) (void*)(f##id), #S, #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) (void*)(f##id), #S, #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) (void*)(f##id), #S, #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) (void*)(f##id), #S, #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) (void*)(f##id), #S, #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) (void*)(f##id), #S, #include "case.h" }; MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/case.h0000644000175000017500000002450712456307246023013 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32fast/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF18(0,DCpointer,DCshort,DCint,DCpointer,DCshort,DCint,DClonglong,DCint,DCchar,DCbool,DCint,DCpointer,DCdouble,DCfloat,DCdouble,DCint,DCdouble,DCint,s_psipsilicBipdfdidi) VF13(1,DCshort,DCfloat,DCshort,DCint,DCint,DCdouble,DCint,DClonglong,DCbool,DCpointer,DCdouble,DCdouble,DClonglong,s_sfsiidilBpddl) VF7(2,DCchar,DCchar,DCchar,DCbool,DCbool,DCchar,DCchar,s_cccBBcc) VF18(3,DCbool,DCpointer,DClonglong,DCdouble,DCfloat,DClonglong,DCpointer,DCshort,DCchar,DCint,DCshort,DCint,DCdouble,DCbool,DCpointer,DCfloat,DCfloat,DCdouble,s_BpldflpscisidBpffd) VF7(4,DCint,DCchar,DCdouble,DCdouble,DClonglong,DCfloat,DCshort,s_icddlfs) VF8(5,DCbool,DCdouble,DCfloat,DCpointer,DCfloat,DCbool,DCshort,DCshort,s_BdfpfBss) VF1(6,DCint,s_i) VF3(7,DCbool,DCfloat,DCchar,s_Bfc) VF18(8,DCchar,DCfloat,DCpointer,DClonglong,DClonglong,DCdouble,DCchar,DCdouble,DCpointer,DClonglong,DClonglong,DClonglong,DClonglong,DCpointer,DCchar,DCpointer,DCfloat,DClonglong,s_cfplldcdpllllpcpfl) VF5(9,DCfloat,DCpointer,DCchar,DCbool,DCdouble,s_fpcBd) VF15(10,DClonglong,DCshort,DClonglong,DCfloat,DCpointer,DCchar,DClonglong,DCpointer,DCint,DCfloat,DCint,DCfloat,DCfloat,DCpointer,DCbool,s_lslfpclpififfpB) VF5(11,DCchar,DCfloat,DCshort,DCdouble,DCpointer,s_cfsdp) VF10(12,DCbool,DCint,DCdouble,DClonglong,DCint,DCbool,DCint,DCpointer,DCchar,DCdouble,s_BidliBipcd) VF8(13,DCpointer,DCbool,DCint,DCpointer,DCchar,DCdouble,DClonglong,DCint,s_pBipcdli) VF18(14,DCfloat,DCshort,DCint,DCpointer,DCdouble,DCchar,DClonglong,DCbool,DCint,DCfloat,DCshort,DCdouble,DCbool,DCbool,DCpointer,DClonglong,DClonglong,DCdouble,s_fsipdclBifsdBBplld) VF12(15,DCfloat,DCdouble,DClonglong,DCpointer,DCint,DCchar,DCint,DCbool,DCbool,DClonglong,DClonglong,DCpointer,s_fdlpiciBBllp) VF13(16,DCfloat,DCpointer,DCchar,DCpointer,DCbool,DCshort,DCpointer,DCfloat,DCpointer,DClonglong,DCchar,DCbool,DCchar,s_fpcpBspfplcBc) VF17(17,DCfloat,DCshort,DCshort,DCfloat,DCchar,DCfloat,DCdouble,DCfloat,DCshort,DCfloat,DCbool,DCfloat,DCchar,DCfloat,DCchar,DClonglong,DCfloat,s_fssfcfdfsfBfcfclf) VF14(18,DCchar,DCdouble,DCbool,DCdouble,DCfloat,DCint,DCbool,DCfloat,DCchar,DCshort,DCpointer,DCchar,DCint,DCint,s_cdBdfiBfcspcii) VF11(19,DCshort,DCfloat,DCchar,DClonglong,DCfloat,DCfloat,DCchar,DClonglong,DClonglong,DCchar,DCpointer,s_sfclffcllcp) VF14(20,DCint,DCshort,DCchar,DCchar,DCbool,DCpointer,DCfloat,DCdouble,DCbool,DCbool,DCfloat,DCint,DCfloat,DCpointer,s_isccBpfdBBfifp) VF9(21,DCdouble,DCshort,DCdouble,DCbool,DCshort,DClonglong,DCshort,DCfloat,DCshort,s_dsdBslsfs) VF3(22,DCbool,DCint,DCchar,s_Bic) VF18(23,DCchar,DCshort,DCchar,DCchar,DCdouble,DCshort,DCchar,DCchar,DCfloat,DCint,DCbool,DClonglong,DCfloat,DCint,DCpointer,DCchar,DClonglong,DCchar,s_csccdsccfiBlfipclc) VF12(24,DCchar,DCfloat,DCshort,DCshort,DCdouble,DCbool,DCchar,DClonglong,DClonglong,DCfloat,DCbool,DCchar,s_cfssdBcllfBc) VF13(25,DCfloat,DClonglong,DCint,DCbool,DCdouble,DCfloat,DCint,DCshort,DCbool,DCchar,DCdouble,DCshort,DCbool,s_fliBdfisBcdsB) VF6(26,DCchar,DCbool,DCshort,DCchar,DClonglong,DCbool,s_cBsclB) VF5(27,DCchar,DCint,DCshort,DCchar,DCshort,s_ciscs) VF9(28,DCbool,DCint,DCint,DCbool,DCbool,DCshort,DCfloat,DCfloat,DClonglong,s_BiiBBsffl) VF12(29,DCpointer,DCfloat,DCshort,DCpointer,DCdouble,DCdouble,DCshort,DCint,DClonglong,DCchar,DCshort,DCint,s_pfspddsilcsi) VF1(30,DCpointer,s_p) VF6(31,DCpointer,DCbool,DCbool,DCfloat,DClonglong,DCpointer,s_pBBflp) VF13(32,DCchar,DCint,DCdouble,DCchar,DCdouble,DCchar,DCpointer,DCdouble,DCbool,DCint,DCfloat,DCpointer,DCint,s_cidcdcpdBifpi) VF11(33,DCpointer,DCfloat,DCshort,DCint,DCfloat,DClonglong,DCpointer,DCint,DCshort,DCchar,DCshort,s_pfsiflpiscs) VF3(34,DCchar,DCchar,DCchar,s_ccc) VF17(35,DCpointer,DCshort,DCchar,DCint,DCchar,DCpointer,DCchar,DCshort,DCshort,DCbool,DCbool,DCshort,DCdouble,DCfloat,DCchar,DCfloat,DCdouble,s_pscicpcssBBsdfcfd) VF6(36,DCchar,DCchar,DCshort,DCpointer,DCfloat,DCchar,s_ccspfc) VF4(37,DClonglong,DCchar,DCfloat,DClonglong,s_lcfl) VF2(38,DCdouble,DClonglong,s_dl) VF1(39,DCint,s_i) VF8(40,DCpointer,DCshort,DCfloat,DCfloat,DCchar,DCbool,DClonglong,DCdouble,s_psffcBld) VF1(41,DCdouble,s_d) VF14(42,DCpointer,DCshort,DCdouble,DCchar,DCshort,DCbool,DCdouble,DCshort,DCchar,DCbool,DCdouble,DCpointer,DCchar,DCbool,s_psdcsBdscBdpcB) VF10(43,DCshort,DClonglong,DClonglong,DClonglong,DCshort,DCshort,DCpointer,DCdouble,DCbool,DCbool,s_slllsspdBB) VF2(44,DCint,DCchar,s_ic) VF4(45,DCint,DCfloat,DClonglong,DCchar,s_iflc) VF18(46,DCbool,DCshort,DCint,DCfloat,DClonglong,DCdouble,DCbool,DCfloat,DCpointer,DCdouble,DCpointer,DCpointer,DCbool,DCfloat,DCshort,DCbool,DCbool,DClonglong,s_BsifldBfpdppBfsBBl) VF10(47,DCpointer,DCpointer,DCfloat,DCdouble,DCfloat,DClonglong,DCfloat,DCshort,DCint,DCshort,s_ppfdflfsis) VF12(48,DCint,DCint,DCbool,DCint,DCdouble,DCbool,DCbool,DCdouble,DClonglong,DCchar,DCdouble,DCchar,s_iiBidBBdlcdc) VF2(49,DCdouble,DCint,s_di) VF1(50,DCdouble,s_d) VF11(51,DCint,DCfloat,DCdouble,DCbool,DCshort,DCchar,DCdouble,DCint,DCchar,DClonglong,DCdouble,s_ifdBscdicld) VF11(52,DCpointer,DCchar,DCdouble,DCfloat,DCdouble,DClonglong,DCpointer,DCfloat,DCint,DCbool,DCchar,s_pcdfdlpfiBc) VF10(53,DCshort,DCfloat,DCpointer,DCfloat,DCshort,DCdouble,DCbool,DClonglong,DCshort,DClonglong,s_sfpfsdBlsl) VF12(54,DCfloat,DCbool,DCfloat,DCchar,DCchar,DCpointer,DCshort,DCpointer,DCbool,DCbool,DCfloat,DClonglong,s_fBfccpspBBfl) VF7(55,DCint,DCchar,DCchar,DCint,DCbool,DCfloat,DCbool,s_icciBfB) VF19(56,DClonglong,DClonglong,DCfloat,DCbool,DCchar,DClonglong,DCchar,DClonglong,DCint,DClonglong,DCdouble,DCchar,DCpointer,DCfloat,DCdouble,DCpointer,DCdouble,DCdouble,DCfloat,s_llfBclclildcpfdpddf) VF12(57,DCint,DCfloat,DCbool,DCshort,DCpointer,DCshort,DCbool,DCfloat,DCpointer,DCchar,DCpointer,DCdouble,s_ifBspsBfpcpd) VF17(58,DCchar,DCchar,DCfloat,DCshort,DCshort,DCshort,DCbool,DCint,DCbool,DCbool,DCshort,DCpointer,DCpointer,DCfloat,DClonglong,DCint,DClonglong,s_ccfsssBiBBsppflil) VF1(59,DCpointer,s_p) VF17(60,DCdouble,DClonglong,DCfloat,DClonglong,DCdouble,DClonglong,DCbool,DCchar,DCfloat,DCbool,DCbool,DClonglong,DCpointer,DCfloat,DClonglong,DCint,DCpointer,s_dlfldlBcfBBlpflip) VF4(61,DCshort,DCdouble,DCint,DCint,s_sdii) VF4(62,DCint,DCshort,DCfloat,DClonglong,s_isfl) VF4(63,DCint,DCpointer,DClonglong,DCshort,s_ipls) VF1(64,DCdouble,s_d) VF17(65,DCdouble,DCchar,DCchar,DClonglong,DCpointer,DCshort,DClonglong,DCdouble,DCfloat,DCshort,DClonglong,DCdouble,DCbool,DCshort,DCfloat,DCchar,DClonglong,s_dcclpsldfsldBsfcl) VF2(66,DClonglong,DClonglong,s_ll) VF4(67,DCpointer,DCfloat,DCfloat,DCint,s_pffi) VF14(68,DCfloat,DCdouble,DCpointer,DCbool,DCbool,DCpointer,DCpointer,DCshort,DCchar,DCpointer,DCpointer,DCfloat,DCfloat,DCbool,s_fdpBBppscppffB) VF4(69,DCchar,DCint,DCshort,DClonglong,s_cisl) VF3(70,DCbool,DCint,DCpointer,s_Bip) VF1(71,DCint,s_i) VF4(72,DCchar,DCbool,DClonglong,DCfloat,s_cBlf) VF13(73,DCdouble,DCchar,DCshort,DCfloat,DCshort,DCchar,DCbool,DCdouble,DCpointer,DClonglong,DCdouble,DCfloat,DCbool,s_dcsfscBdpldfB) VF17(74,DCfloat,DClonglong,DCbool,DCbool,DClonglong,DCchar,DClonglong,DCbool,DCfloat,DClonglong,DClonglong,DCshort,DCshort,DCshort,DCpointer,DCchar,DCchar,s_flBBlclBfllssspcc) VF16(75,DCshort,DClonglong,DClonglong,DCdouble,DCshort,DCint,DCchar,DCshort,DCint,DClonglong,DCbool,DCdouble,DCbool,DCdouble,DCfloat,DCbool,s_slldsicsilBdBdfB) VF6(76,DClonglong,DClonglong,DCshort,DCpointer,DCfloat,DCchar,s_llspfc) VF9(77,DCfloat,DCpointer,DCshort,DClonglong,DCdouble,DCshort,DCshort,DCfloat,DCbool,s_fpsldssfB) VF12(78,DCbool,DCbool,DCfloat,DCpointer,DCshort,DCchar,DCfloat,DCint,DCdouble,DCchar,DCfloat,DCdouble,s_BBfpscfidcfd) VF18(79,DCint,DCint,DCint,DCshort,DCdouble,DCchar,DCbool,DCbool,DCchar,DClonglong,DCfloat,DCdouble,DCpointer,DCdouble,DCbool,DCint,DCpointer,DClonglong,s_iiisdcBBclfdpdBipl) VF12(80,DCpointer,DCchar,DCbool,DClonglong,DCchar,DCfloat,DCpointer,DCbool,DCchar,DCchar,DCshort,DCdouble,s_pcBlcfpBccsd) VF19(81,DCchar,DCshort,DCint,DCdouble,DCbool,DCshort,DCfloat,DCbool,DCfloat,DCchar,DCfloat,DCpointer,DCfloat,DCfloat,DCpointer,DCshort,DCchar,DCdouble,DCint,s_csidBsfBfcfpffpscdi) VF14(82,DCint,DCbool,DCchar,DCfloat,DCbool,DClonglong,DCshort,DCfloat,DCfloat,DCchar,DCshort,DCbool,DCbool,DCchar,s_iBcfBlsffcsBBc) VF8(83,DCpointer,DCchar,DCint,DClonglong,DClonglong,DCint,DCchar,DCfloat,s_pcillicf) VF17(84,DCdouble,DCshort,DCchar,DClonglong,DCshort,DCdouble,DCshort,DCfloat,DCdouble,DCshort,DCdouble,DCdouble,DClonglong,DCbool,DCdouble,DCint,DCpointer,s_dsclsdsfdsddlBdip) VF17(85,DCdouble,DCpointer,DClonglong,DCpointer,DCfloat,DCshort,DCpointer,DCshort,DCshort,DCdouble,DCint,DCpointer,DCshort,DCshort,DCint,DCpointer,DClonglong,s_dplpfspssdipssipl) VF3(86,DCbool,DCbool,DCbool,s_BBB) VF18(87,DCpointer,DClonglong,DClonglong,DCfloat,DClonglong,DCpointer,DCfloat,DCdouble,DClonglong,DCpointer,DCfloat,DClonglong,DClonglong,DCbool,DCint,DCpointer,DCpointer,DCint,s_pllflpfdlpfllBippi) VF5(88,DCint,DCfloat,DCfloat,DCdouble,DCfloat,s_iffdf) VF13(89,DCdouble,DCshort,DClonglong,DCchar,DCchar,DCfloat,DCshort,DCbool,DCfloat,DCbool,DCchar,DCint,DCpointer,s_dslccfsBfBcip) VF6(90,DCshort,DCfloat,DCchar,DCbool,DCpointer,DCshort,s_sfcBps) VF5(91,DCshort,DCchar,DCshort,DCfloat,DCint,s_scsfi) VF8(92,DCshort,DClonglong,DCdouble,DCfloat,DCdouble,DCchar,DClonglong,DCdouble,s_sldfdcld) VF3(93,DCfloat,DCdouble,DCshort,s_fds) VF15(94,DCint,DCfloat,DCshort,DCshort,DCbool,DCint,DCint,DCpointer,DCpointer,DCshort,DCint,DCfloat,DCshort,DCshort,DCfloat,s_ifssBiippsifssf) VF6(95,DCchar,DCbool,DClonglong,DCint,DClonglong,DCpointer,s_cBlilp) VF8(96,DCbool,DClonglong,DCchar,DCfloat,DCbool,DCfloat,DCbool,DCdouble,s_BlcfBfBd) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/config.h0000644000175000017500000000202412456307246023333 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32fast/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NCASES 97 #define MAXARGS 19 MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/design.cfg0000644000175000017500000000213312456307246023650 0ustar jnthnjnthnpsipsilicBipdfdidi sfsiidilBpddl cccBBcc BpldflpscisidBpffd icddlfs BdfpfBss i Bfc cfplldcdpllllpcpfl fpcBd lslfpclpififfpB cfsdp BidliBipcd pBipcdli fsipdclBifsdBBplld fdlpiciBBllp fpcpBspfplcBc fssfcfdfsfBfcfclf cdBdfiBfcspcii sfclffcllcp isccBpfdBBfifp dsdBslsfs Bic csccdsccfiBlfipclc cfssdBcllfBc fliBdfisBcdsB cBsclB ciscs BiiBBsffl pfspddsilcsi p pBBflp cidcdcpdBifpi pfsiflpiscs ccc pscicpcssBBsdfcfd ccspfc lcfl dl i psffcBld d psdcsBdscBdpcB slllsspdBB ic iflc BsifldBfpdppBfsBBl ppfdflfsis iiBidBBdlcdc di d ifdBscdicld pcdfdlpfiBc sfpfsdBlsl fBfccpspBBfl icciBfB llfBclclildcpfdpddf ifBspsBfpcpd ccfsssBiBBsppflil p dlfldlBcfBBlpflip sdii isfl ipls d dcclpsldfsldBsfcl ll pffi fdpBBppscppffB cisl Bip i cBlf dcsfscBdpldfB flBBlclBfllssspcc slldsicsilBdBdfB llspfc fpsldssfB BBfpscfidcfd iiisdcBBclfdpdBipl pcBlcfpBccsd csidBsfBfcfpffpscdi iBcfBlsffcsBBc pcillicf dsclsdsfdsddlBdip dplpfspssdipssipl BBB pllflpfdlpfllBippi iffdf dslccfsBfBcip sfcBps scsfi sldfdcld fds ifssBiippsifssf cBlilp BlcfBfBd MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/dynMakefile0000644000175000017500000000032412456307246024071 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/funcinfo.h0000644000175000017500000000230412456307246023676 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32fast/funcinfo.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DC_TEST_FUNCINFO_H #define DC_TEST_FUNCINFO_H #include "../../dyncall/dyncall_signature.h" struct funcinfo { DCpointer funcptr; const DCsigchar* sig; }; extern funcinfo gFuncInfos[]; #endif /* DC_TEST_FUNCINFO_H */ MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/main.cc0000644000175000017500000001140212456307246023150 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32fast/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "../../dyncall/dyncall_macros.h" #include "funcinfo.h" #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); DCbool valueBool[MAXARGS]; DCchar valueChar[MAXARGS]; DCshort valueShort[MAXARGS]; DCint valueInt[MAXARGS]; DClonglong valueLongLong[MAXARGS]; DCdouble valueDouble[MAXARGS]; DCpointer valuePointer[MAXARGS]; DCfloat valueFloat[MAXARGS]; void clearValues(); void init() { for (int i = 0 ; i < MAXARGS ; ++i ) { valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE ); valueChar[i] = DCchar(i); valueShort[i] = DCshort(i); valueInt[i] = DCint(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valuePointer[i] = DCpointer(i); valueFloat[i] = DCfloat(i); } } void error(const char* message) { fprintf(stderr, "error: %s\n", message); exit(-1); } bool test(int x) { bool r = true; clearValues(); DCCallVM* pCall; funcinfo* fi = &gFuncInfos[x]; const DCsigchar* sig = &fi->sig[2]; const DCsigchar* ptr = sig; DCsigchar ch; int pos; pos = 0; pCall = dcNewCallVM(4096); #ifdef DC__C_GNU dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_GNU); #else dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_MS); #endif dcReset(pCall); while ( (ch=*ptr++) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: dcArgBool( pCall, valueBool[pos] ); break; case DC_SIGCHAR_CHAR: dcArgChar( pCall, valueChar[pos] ); break; case DC_SIGCHAR_SHORT: dcArgShort( pCall, valueShort[pos] ); break; case DC_SIGCHAR_INT: dcArgInt( pCall, valueInt[pos] ); break; case DC_SIGCHAR_LONGLONG: dcArgLongLong( pCall, valueLongLong[pos] ); break; case DC_SIGCHAR_FLOAT: dcArgFloat( pCall, valueFloat[pos] ); break; case DC_SIGCHAR_DOUBLE: dcArgDouble( pCall, valueDouble[pos] ); break; case DC_SIGCHAR_POINTER: dcArgPointer( pCall, valuePointer[pos] ); break; default: error("unsupported signature character"); break; } ++pos; } dcCallVoid( pCall, fi->funcptr ); if ( getId() == x ) { ptr = sig; pos = 0; while( ( ch=*ptr++ ) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: if ( getArg(pos)->B != valueBool [pos] ) r = false; break; case DC_SIGCHAR_CHAR: if ( getArg(pos)->c != valueChar [pos] ) r = false; break; case DC_SIGCHAR_SHORT: if ( getArg(pos)->s != valueShort [pos] ) r = false; break; case DC_SIGCHAR_INT: if ( getArg(pos)->i != valueInt [pos] ) r = false; break; case DC_SIGCHAR_LONGLONG: if ( getArg(pos)->L != valueLongLong [pos] ) r = false; break; case DC_SIGCHAR_FLOAT: if ( getArg(pos)->f != valueFloat [pos] ) r = false; break; case DC_SIGCHAR_DOUBLE: if ( getArg(pos)->d != valueDouble[pos] ) r = false; break; case DC_SIGCHAR_POINTER: if ( getArg(pos)->p != valuePointer [pos] ) r = false; break; default: error("unsupported signature character"); break; } ++pos; } } else { r = false; } printf("%d-%s:%d\n", x, sig, r); dcFree(pCall); return r; } bool run_range(int from, int to) { bool r = true; for (int i = from ; i < to ; ++i ) r &= test(i); return r; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { success = run_range(0,NCASES); } printf("result: suite2_x86win32fast: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/mkcase.py0000644000175000017500000000375312456307246023544 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys f = file("design.cfg") sigmap = { 'B':'DCbool' , 'c':'DCchar' , 's':'DCshort' , 'i':'DCint' , 'l':'DClonglong' , 'f':'DCfloat' , 'd':'DCdouble' , 'p':'DCpointer' } apimap = { '_':'' , 's':'__declspec(stdcall)' , 'f':'__declspec(fastcall)' } id = 0 maxargs = 0 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); for line in f: line = line.rstrip().lstrip() if len(line) == 0 or line[0] == '#': continue types = []; # args = len(line)-1 args = len(line) maxargs = max(maxargs, args) # api = apimap[ line[0] ] out = [ "VF",str(args),"(", str(id), "," ]; for i in xrange(0,len(line)): types += [ sigmap[ line[i] ] ] out += [ ",".join( types ), ",s_", line, ")\n" ] out = "".join(out) sys.stdout.write(out) id += 1 sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join( ["#define NCASES ",str(id),"\n"] ) ) sys.stderr.write("".join( ["#define MAXARGS ",str(maxargs),"\n"] ) ) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32fast/rand.py0000644000175000017500000000267412456307246023226 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import random import sys N = 100 MINARG = 0 MAXARG = 19 argtypes = [ 'B','c','s','i','l','f','d','p' ] apitypes = [ '_' ] def sig(n): s = "" x = random.randint( 0, len(apitypes)-1 ) # s += apitypes[x] for i in xrange(0,n): x = random.randint( 0, len(argtypes)-1 ) s += argtypes[x] return s for i in xrange(0,N): n = random.randint(MINARG,MAXARG) sys.stdout.write( sig(n) ) sys.stdout.write( "\n" ) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/CMakeLists.txt0000644000175000017500000000015012456307246024310 0ustar jnthnjnthnadd_executable(suite2_x86win32std case.cc main.cc) target_link_libraries(suite2_x86win32std dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/Makefile.M0000644000175000017500000000015312456307246023406 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/Makefile.generic0000644000175000017500000000057312502366750024631 0ustar jnthnjnthnAPP = suite2_x86win32std OBJS = case.o main.o TOP = ../.. CFLAGS = -I${TOP}/dyncall LDFLAGS = -L${TOP}/dyncall LDLIBS = -ldyncall_s LINK = ${CXX} all: ${APP} .PHONY: all clean install RM ?= rm -f AR ?= ar MKDIR ?= mkdir INSTALL ?= install -p ${APP}: ${OBJS} ${LINK} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} ${TARGET_ARCH} clean: ${RM} ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/Nmakefile0000644000175000017500000000376012456307246023400 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite2.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite2.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/case.cc0000644000175000017500000002260112456307246022777 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32std/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "funcinfo.h" #ifdef DC__C_GNU #define API __attribute__((stdcall)) #else #define API __stdcall #endif DCValue mValue[MAXARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } template<> void g(DClong value, int pos) { mValue[pos].l = value; } template<> void g(DClonglong value, int pos) { mValue[pos].L = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void API f##id () {gID=id;} #define VF1(id,A1,S) void API f##id (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void API f##id (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void API f##id (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);} #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);} #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);} #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);} #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);} #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);} #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);} #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);} #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);} #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) void API f##id (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10,A11 a11,A12 a12,A13 a13,A14 a14,A15 a15,A16 a16,A17 a17,A18 a18,A19 a19,A20 a20) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);g(a11,10);g(a12,11);g(a13,12);g(a14,13);g(a15,14);g(a16,15);g(a17,16);g(a18,17);g(a19,18);g(a20,19);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #undef VF11 #undef VF12 #undef VF13 #undef VF14 #undef VF15 #undef VF16 #undef VF17 #undef VF18 #undef VF19 #undef VF20 funcinfo gFuncInfos[] = { #define VF0(id,S) (void*)(f##id), #S, #define VF1(id,A1,S) (void*)(f##id), #S, #define VF2(id,A1,A2,S) (void*)(f##id), #S, #define VF3(id,A1,A2,A3,S) (void*)(f##id), #S, #define VF4(id,A1,A2,A3,A4,S) (void*)(f##id), #S, #define VF5(id,A1,A2,A3,A4,A5,S) (void*)(f##id), #S, #define VF6(id,A1,A2,A3,A4,A5,A6,S) (void*)(f##id), #S, #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) (void*)(f##id), #S, #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) (void*)(f##id), #S, #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) (void*)(f##id), #S, #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) (void*)(f##id), #S, #define VF11(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,S) (void*)(f##id), #S, #define VF12(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,S) (void*)(f##id), #S, #define VF13(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,S) (void*)(f##id), #S, #define VF14(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,S) (void*)(f##id), #S, #define VF15(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,S) (void*)(f##id), #S, #define VF16(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,S) (void*)(f##id), #S, #define VF17(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,S) (void*)(f##id), #S, #define VF18(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,S) (void*)(f##id), #S, #define VF19(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,S) (void*)(f##id), #S, #define VF20(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,S) (void*)(f##id), #S, #include "case.h" }; MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/case.h0000644000175000017500000002543612456307246022652 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32std/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF16(0,DClonglong,DCbool,DCshort,DCint,DCint,DCfloat,DCdouble,DCpointer,DCdouble,DClonglong,DCshort,DCpointer,DClonglong,DCdouble,DCint,DCbool,s_lBsiifdpdlspldiB) VF19(1,DCdouble,DCint,DCshort,DCchar,DCshort,DCbool,DClonglong,DCbool,DCbool,DCpointer,DCint,DCpointer,DCint,DCbool,DCshort,DClonglong,DCbool,DCchar,DCpointer,s_discsBlBBpipiBslBcp) VF12(2,DClonglong,DCshort,DCdouble,DClonglong,DCfloat,DCdouble,DCpointer,DCfloat,DClonglong,DCpointer,DCint,DCint,s_lsdlfdpflpii) VF5(3,DCdouble,DCdouble,DCint,DCshort,DCshort,s_ddiss) VF8(4,DClonglong,DCfloat,DCbool,DCshort,DCdouble,DCdouble,DClonglong,DCchar,s_lfBsddlc) VF10(5,DCshort,DCint,DCshort,DCbool,DCdouble,DCbool,DCint,DCbool,DCfloat,DCshort,s_sisBdBiBfs) VF9(6,DCshort,DCbool,DCbool,DClonglong,DCchar,DCfloat,DCpointer,DCshort,DCint,s_sBBlcfpsi) VF17(7,DCfloat,DCchar,DCpointer,DCint,DCchar,DCdouble,DCdouble,DCpointer,DCshort,DCbool,DCdouble,DCint,DCbool,DCpointer,DCfloat,DCchar,DCshort,s_fcpicddpsBdiBpfcs) VF7(8,DCchar,DCbool,DCfloat,DCchar,DCshort,DClonglong,DCpointer,s_cBfcslp) VF13(9,DCint,DCfloat,DCint,DCchar,DCbool,DCint,DClonglong,DClonglong,DCchar,DCpointer,DCpointer,DCshort,DCpointer,s_ificBillcppsp) VF15(10,DCpointer,DCdouble,DCpointer,DClonglong,DCint,DCshort,DCfloat,DCbool,DCpointer,DCpointer,DCint,DCpointer,DCdouble,DCfloat,DCdouble,s_pdplisfBppipdfd) VF4(11,DClonglong,DCshort,DCshort,DCint,s_lssi) VF4(12,DClonglong,DCint,DClonglong,DCchar,s_lilc) VF17(13,DClonglong,DCbool,DCdouble,DCdouble,DCdouble,DCpointer,DCpointer,DCfloat,DCchar,DCbool,DClonglong,DCshort,DClonglong,DCdouble,DCdouble,DClonglong,DCpointer,s_lBdddppfcBlslddlp) VF2(14,DCbool,DCchar,s_Bc) VF18(15,DCchar,DCbool,DCint,DCshort,DCdouble,DCint,DCchar,DClonglong,DCpointer,DCbool,DCdouble,DCint,DCshort,DClonglong,DCpointer,DCpointer,DCpointer,DCchar,s_cBisdiclpBdislpppc) VF17(16,DCbool,DCdouble,DClonglong,DCdouble,DCpointer,DClonglong,DCdouble,DCdouble,DClonglong,DCshort,DCfloat,DCfloat,DCchar,DCbool,DCpointer,DCshort,DCdouble,s_BdldplddlsffcBpsd) VF8(17,DCfloat,DClonglong,DCchar,DCfloat,DClonglong,DCint,DClonglong,DCfloat,s_flcflilf) VF12(18,DCpointer,DCshort,DCshort,DClonglong,DCshort,DCpointer,DCbool,DCpointer,DCshort,DCchar,DCbool,DClonglong,s_psslspBpscBl) VF7(19,DCchar,DCchar,DClonglong,DCint,DCpointer,DCshort,DCdouble,s_cclipsd) VF15(20,DCshort,DCfloat,DCbool,DCdouble,DCdouble,DCint,DCshort,DCchar,DCpointer,DCbool,DClonglong,DCshort,DCint,DCbool,DCbool,s_sfBddiscpBlsiBB) VF4(21,DCbool,DClonglong,DCchar,DCdouble,s_Blcd) VF19(22,DCchar,DCfloat,DCint,DCchar,DCfloat,DClonglong,DClonglong,DClonglong,DCchar,DCchar,DCbool,DCbool,DCshort,DClonglong,DCbool,DCfloat,DCchar,DCchar,DClonglong,s_cficflllccBBslBfccl) VF14(23,DClonglong,DCpointer,DCbool,DCdouble,DCint,DCint,DCfloat,DClonglong,DCfloat,DCint,DClonglong,DCint,DCint,DCfloat,s_lpBdiiflfiliif) VF16(24,DCshort,DCbool,DCbool,DCpointer,DCint,DCshort,DClonglong,DCfloat,DCint,DCbool,DCbool,DCshort,DCpointer,DCfloat,DCbool,DCdouble,s_sBBpislfiBBspfBd) VF19(25,DClonglong,DClonglong,DClonglong,DCdouble,DClonglong,DCbool,DCpointer,DCint,DClonglong,DCbool,DCshort,DCpointer,DCint,DCint,DCfloat,DCfloat,DCshort,DCint,DCshort,s_llldlBpilBspiiffsis) VF12(26,DCdouble,DCint,DCpointer,DCshort,DCpointer,DCchar,DCfloat,DCint,DCint,DCchar,DCdouble,DClonglong,s_dipspcfiicdl) VF15(27,DCfloat,DCfloat,DCpointer,DCbool,DCshort,DClonglong,DCbool,DCbool,DCchar,DCshort,DClonglong,DCchar,DCbool,DCfloat,DCbool,s_ffpBslBBcslcBfB) VF2(28,DCfloat,DCchar,s_fc) VF9(29,DCdouble,DCfloat,DCfloat,DCint,DCpointer,DCbool,DCfloat,DCpointer,DCchar,s_dffipBfpc) VF10(30,DClonglong,DClonglong,DCfloat,DCshort,DCint,DClonglong,DCint,DCdouble,DCdouble,DCbool,s_llfsiliddB) VF11(31,DCfloat,DCshort,DCbool,DClonglong,DCint,DCdouble,DCint,DClonglong,DCfloat,DCshort,DCshort,s_fsBlidilfss) VF11(32,DCchar,DCint,DCfloat,DClonglong,DCbool,DCdouble,DCpointer,DCshort,DClonglong,DCchar,DCfloat,s_ciflBdpslcf) VF2(33,DCint,DClonglong,s_il) VF3(34,DClonglong,DCshort,DCchar,s_lsc) VF5(35,DCfloat,DCchar,DCfloat,DCchar,DCfloat,s_fcfcf) VF3(36,DCdouble,DCint,DCfloat,s_dif) VF13(37,DCint,DCfloat,DCbool,DClonglong,DCfloat,DClonglong,DCchar,DCpointer,DCpointer,DCchar,DCshort,DCfloat,DCint,s_ifBlflcppcsfi) VF2(38,DCbool,DCint,s_Bi) VF6(39,DCpointer,DCchar,DCdouble,DCshort,DCfloat,DCint,s_pcdsfi) VF5(40,DCshort,DClonglong,DCpointer,DCbool,DCchar,s_slpBc) VF4(41,DCdouble,DCbool,DCdouble,DCfloat,s_dBdf) VF16(42,DCshort,DCchar,DClonglong,DCpointer,DCint,DClonglong,DClonglong,DClonglong,DCint,DCdouble,DCchar,DCpointer,DCshort,DCbool,DCchar,DCint,s_sclpilllidcpsBci) VF15(43,DCshort,DCfloat,DCint,DCshort,DCfloat,DCbool,DClonglong,DClonglong,DCpointer,DCbool,DCdouble,DCint,DCpointer,DCfloat,DCshort,s_sfisfBllpBdipfs) VF2(44,DCfloat,DCdouble,s_fd) VF6(45,DClonglong,DCint,DCpointer,DCfloat,DCpointer,DCshort,s_lipfps) VF8(46,DCchar,DCshort,DCdouble,DCfloat,DCdouble,DCbool,DCchar,DCfloat,s_csdfdBcf) VF10(47,DCshort,DCint,DCpointer,DCfloat,DCchar,DCshort,DCint,DCdouble,DCpointer,DCdouble,s_sipfcsidpd) VF16(48,DCshort,DCdouble,DCpointer,DCbool,DCbool,DCbool,DCbool,DCbool,DCint,DClonglong,DCshort,DCint,DCbool,DCfloat,DCint,DClonglong,s_sdpBBBBBilsiBfil) VF3(49,DCchar,DClonglong,DCchar,s_clc) VF9(50,DCbool,DCpointer,DCfloat,DClonglong,DCbool,DCfloat,DClonglong,DCbool,DCpointer,s_BpflBflBp) VF17(51,DClonglong,DCshort,DCfloat,DCchar,DClonglong,DCdouble,DCpointer,DClonglong,DCpointer,DCint,DCfloat,DCint,DCint,DCint,DCchar,DCpointer,DCdouble,s_lsfcldplpifiiicpd) VF4(52,DCint,DCchar,DCint,DCdouble,s_icid) VF16(53,DCshort,DCint,DCbool,DClonglong,DCint,DCshort,DCbool,DClonglong,DCfloat,DCbool,DCpointer,DCint,DCint,DCpointer,DCdouble,DCchar,s_siBlisBlfBpiipdc) VF5(54,DCpointer,DCint,DClonglong,DCshort,DCfloat,s_pilsf) VF5(55,DCbool,DCint,DCshort,DCdouble,DCshort,s_Bisds) VF18(56,DCbool,DCdouble,DCchar,DCint,DCdouble,DCbool,DCpointer,DCint,DClonglong,DCbool,DClonglong,DCshort,DCshort,DCdouble,DCshort,DCbool,DCint,DCbool,s_BdcidBpilBlssdsBiB) VF6(57,DCshort,DCbool,DCshort,DCshort,DCdouble,DClonglong,s_sBssdl) VF8(58,DCchar,DCfloat,DCbool,DCchar,DCint,DCint,DCshort,DCfloat,s_cfBciisf) VF3(59,DCshort,DCdouble,DClonglong,s_sdl) VF16(60,DCshort,DCint,DCfloat,DClonglong,DCbool,DCdouble,DCint,DCbool,DCchar,DCpointer,DCpointer,DClonglong,DCchar,DCshort,DCbool,DCfloat,s_siflBdiBcpplcsBf) VF7(61,DCdouble,DCpointer,DCint,DCdouble,DCbool,DCchar,DCdouble,s_dpidBcd) VF18(62,DCpointer,DCbool,DCint,DCchar,DCdouble,DCfloat,DCfloat,DCfloat,DClonglong,DCfloat,DClonglong,DCfloat,DCpointer,DCchar,DClonglong,DCpointer,DCbool,DCfloat,s_pBicdffflflfpclpBf) VF7(63,DCshort,DCbool,DCchar,DCdouble,DCfloat,DCbool,DCpointer,s_sBcdfBp) VF8(64,DCchar,DCchar,DCfloat,DCpointer,DCpointer,DClonglong,DCshort,DClonglong,s_ccfpplsl) VF9(65,DClonglong,DCdouble,DCdouble,DCdouble,DCbool,DCpointer,DCbool,DCfloat,DCchar,s_ldddBpBfc) VF12(66,DCbool,DCdouble,DCpointer,DCdouble,DCpointer,DCpointer,DCint,DCshort,DCchar,DClonglong,DCpointer,DClonglong,s_Bdpdppisclpl) VF12(67,DCshort,DClonglong,DCshort,DClonglong,DCchar,DCint,DCpointer,DCpointer,DCshort,DCint,DClonglong,DCchar,s_slslcippsilc) VF3(68,DCshort,DCbool,DCfloat,s_sBf) VF12(69,DCdouble,DCpointer,DCpointer,DCfloat,DClonglong,DClonglong,DCint,DCchar,DCpointer,DCchar,DCdouble,DCbool,s_dppfllicpcdB) VF18(70,DCshort,DCshort,DCchar,DCfloat,DCint,DCdouble,DCchar,DCchar,DCint,DCshort,DCfloat,DClonglong,DCfloat,DCshort,DCdouble,DCpointer,DCshort,DClonglong,s_sscfidccisflfsdpsl) VF16(71,DClonglong,DCshort,DCbool,DCchar,DClonglong,DCshort,DCdouble,DCbool,DCchar,DCshort,DCchar,DCdouble,DClonglong,DCfloat,DCdouble,DCbool,s_lsBclsdBcscdlfdB) VF11(72,DCshort,DCchar,DCfloat,DCfloat,DClonglong,DCpointer,DCfloat,DCfloat,DCpointer,DCshort,DCdouble,s_scfflpffpsd) VF14(73,DClonglong,DCchar,DCint,DCbool,DCdouble,DCbool,DCdouble,DCdouble,DCbool,DCfloat,DCchar,DCbool,DCdouble,DCbool,s_lciBdBddBfcBdB) VF4(74,DCshort,DClonglong,DCbool,DClonglong,s_slBl) VF12(75,DCbool,DCbool,DCint,DCdouble,DCchar,DCpointer,DCbool,DCfloat,DCshort,DCbool,DCbool,DCchar,s_BBidcpBfsBBc) VF5(76,DCpointer,DClonglong,DCint,DCshort,DCchar,s_plisc) VF1(77,DCchar,s_c) VF15(78,DCpointer,DCdouble,DCfloat,DCbool,DCint,DCint,DCfloat,DCfloat,DCpointer,DCfloat,DCchar,DCdouble,DCfloat,DCshort,DCshort,s_pdfBiiffpfcdfss) VF14(79,DCdouble,DCchar,DCchar,DCshort,DCfloat,DClonglong,DClonglong,DCchar,DCdouble,DCbool,DCfloat,DCfloat,DClonglong,DCchar,s_dccsfllcdBfflc) VF18(80,DCpointer,DCshort,DCfloat,DCbool,DClonglong,DCshort,DCint,DCint,DCdouble,DCbool,DCshort,DCpointer,DCpointer,DCchar,DCbool,DCint,DCfloat,DCdouble,s_psfBlsiidBsppcBifd) VF14(81,DClonglong,DClonglong,DCint,DCdouble,DClonglong,DClonglong,DCbool,DClonglong,DClonglong,DClonglong,DCshort,DClonglong,DCdouble,DClonglong,s_llidllBlllsldl) VF8(82,DCchar,DCshort,DCbool,DCfloat,DCshort,DCfloat,DCshort,DClonglong,s_csBfsfsl) VF12(83,DCfloat,DCbool,DCint,DCshort,DCpointer,DCdouble,DCshort,DCpointer,DClonglong,DCbool,DCpointer,DClonglong,s_fBispdsplBpl) VF7(84,DCpointer,DCbool,DCchar,DCfloat,DClonglong,DCdouble,DCfloat,s_pBcfldf) VF18(85,DCshort,DClonglong,DCbool,DCbool,DCpointer,DCdouble,DCint,DCdouble,DCshort,DCchar,DCfloat,DCpointer,DCchar,DCint,DCint,DClonglong,DCint,DCpointer,s_slBBpdidscfpciilip) VF2(86,DCpointer,DCshort,s_ps) VF17(87,DCbool,DCint,DCint,DCchar,DCchar,DCchar,DCchar,DCbool,DCint,DCchar,DCbool,DCdouble,DCint,DCfloat,DCchar,DCpointer,DCshort,s_BiiccccBicBdifcps) VF7(88,DCpointer,DCshort,DCdouble,DCchar,DCpointer,DCpointer,DCshort,s_psdcpps) VF14(89,DCpointer,DCbool,DCbool,DCfloat,DCbool,DCpointer,DCint,DCdouble,DCchar,DClonglong,DCdouble,DClonglong,DCfloat,DCbool,s_pBBfBpidcldlfB) VF17(90,DCchar,DCchar,DCint,DCshort,DCfloat,DCchar,DCint,DCdouble,DCdouble,DCdouble,DCint,DClonglong,DCdouble,DCshort,DCbool,DCint,DCbool,s_ccisfcidddildsBiB) VF4(91,DCbool,DCint,DCshort,DCpointer,s_Bisp) VF11(92,DCdouble,DCshort,DCint,DCint,DCshort,DCpointer,DCchar,DCint,DCbool,DCdouble,DClonglong,s_dsiispciBdl) VF16(93,DCbool,DCpointer,DCshort,DClonglong,DCshort,DCchar,DClonglong,DCshort,DCshort,DCint,DCint,DCchar,DClonglong,DCdouble,DCchar,DCdouble,s_Bpslsclssiicldcd) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/config.h0000644000175000017500000000202312456307246023167 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32std/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NCASES 94 #define MAXARGS 19 MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/design.cfg0000644000175000017500000000221612456307246023507 0ustar jnthnjnthnlBsiifdpdlspldiB discsBlBBpipiBslBcp lsdlfdpflpii ddiss lfBsddlc sisBdBiBfs sBBlcfpsi fcpicddpsBdiBpfcs cBfcslp ificBillcppsp pdplisfBppipdfd lssi lilc lBdddppfcBlslddlp Bc cBisdiclpBdislpppc BdldplddlsffcBpsd flcflilf psslspBpscBl cclipsd sfBddiscpBlsiBB Blcd cficflllccBBslBfccl lpBdiiflfiliif sBBpislfiBBspfBd llldlBpilBspiiffsis dipspcfiicdl ffpBslBBcslcBfB fc dffipBfpc llfsiliddB fsBlidilfss ciflBdpslcf il lsc fcfcf dif ifBlflcppcsfi Bi pcdsfi slpBc dBdf sclpilllidcpsBci sfisfBllpBdipfs fd lipfps csdfdBcf sipfcsidpd sdpBBBBBilsiBfil clc BpflBflBp lsfcldplpifiiicpd icid siBlisBlfBpiipdc pilsf Bisds BdcidBpilBlssdsBiB sBssdl cfBciisf sdl siflBdiBcpplcsBf dpidBcd pBicdffflflfpclpBf sBcdfBp ccfpplsl ldddBpBfc Bdpdppisclpl slslcippsilc sBf dppfllicpcdB sscfidccisflfsdpsl lsBclsdBcscdlfdB scfflpffpsd lciBdBddBfcBdB slBl BBidcpBfsBBc plisc c pdfBiiffpfcdfss dccsfllcdBfflc psfBlsiidBsppcBifd llidllBlllsldl csBfsfsl fBispdsplBpl pBcfldf slBBpdidscfpciilip ps BiiccccBicBdifcps psdcpps pBBfBpidcldlfB ccisfcidddildsBiB Bisp dsiispciBdl Bpslsclssiicldcd MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/dynMakefile0000644000175000017500000000032412456307246023726 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/funcinfo.h0000644000175000017500000000230312456307246023532 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32std/funcinfo.h Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DC_TEST_FUNCINFO_H #define DC_TEST_FUNCINFO_H #include "../../dyncall/dyncall_signature.h" struct funcinfo { DCpointer funcptr; const DCsigchar* sig; }; extern funcinfo gFuncInfos[]; #endif /* DC_TEST_FUNCINFO_H */ MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/main.cc0000644000175000017500000001123512456307246023011 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite2_x86win32std/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "funcinfo.h" #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); typedef double precise; DCbool valueBool[MAXARGS]; DCchar valueChar[MAXARGS]; DCshort valueShort[MAXARGS]; DCint valueInt[MAXARGS]; DClong valueLong[MAXARGS]; DClonglong valueLongLong[MAXARGS]; DCdouble valueDouble[MAXARGS]; DCpointer valuePointer[MAXARGS]; DCfloat valueFloat[MAXARGS]; void clearValues(); void init() { for (int i = 0 ; i < MAXARGS ; ++i ) { valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE ); valueChar[i] = DCchar(i); valueShort[i] = DCshort(i); valueInt[i] = DCint(i); valueLong[i] = DClong(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valuePointer[i] = DCpointer(i); valueFloat[i] = DCfloat(i); } } bool test(int x) { bool r = true; clearValues(); DCCallVM* pCall; funcinfo* fi = &gFuncInfos[x]; const DCsigchar* sig = &fi->sig[2]; const DCsigchar* ptr = sig; DCsigchar ch; int pos; pos = 0; pCall = dcNewCallVM(4096); dcMode(pCall, DC_CALL_C_X86_WIN32_STD); dcReset(pCall); while ( (ch=*ptr++) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: dcArgBool( pCall, valueBool[pos] ); break; case DC_SIGCHAR_CHAR: dcArgChar( pCall, valueChar[pos] ); break; case DC_SIGCHAR_SHORT: dcArgShort( pCall, valueShort[pos] ); break; case DC_SIGCHAR_INT: dcArgInt( pCall, valueInt[pos] ); break; case DC_SIGCHAR_LONG: dcArgLong( pCall, valueLong[pos] ); break; case DC_SIGCHAR_LONGLONG: dcArgLongLong( pCall, valueLongLong[pos] ); break; case DC_SIGCHAR_FLOAT: dcArgFloat( pCall, valueFloat[pos] ); break; case DC_SIGCHAR_DOUBLE: dcArgDouble( pCall, valueDouble[pos] ); break; case DC_SIGCHAR_POINTER: dcArgPointer( pCall, valuePointer[pos] ); break; } ++pos; } dcCallVoid( pCall, fi->funcptr ); if ( getId() == x ) { ptr = sig; pos = 0; while( ( ch=*ptr++ ) != '\0' ) { switch(ch) { case DC_SIGCHAR_BOOL: if ( getArg(pos)->B != valueBool [pos] ) r = false; break; case DC_SIGCHAR_CHAR: if ( getArg(pos)->c != valueChar [pos] ) r = false; break; case DC_SIGCHAR_SHORT: if ( getArg(pos)->s != valueShort [pos] ) r = false; break; case DC_SIGCHAR_INT: if ( getArg(pos)->i != valueInt [pos] ) r = false; break; case DC_SIGCHAR_LONG: if ( getArg(pos)->l != valueLong [pos] ) r = false; break; case DC_SIGCHAR_LONGLONG: if ( getArg(pos)->L != valueLongLong [pos] ) r = false; break; case DC_SIGCHAR_FLOAT: if ( getArg(pos)->f != valueFloat [pos] ) r = false; break; case DC_SIGCHAR_DOUBLE: if ( getArg(pos)->d != valueDouble[pos] ) r = false; break; case DC_SIGCHAR_POINTER: if ( getArg(pos)->p != valuePointer [pos] ) r = false; break; } ++pos; } } else { r = false; } printf("%d-%s:%d\n", x, sig, r); dcFree(pCall); return r; } bool run_range(int from, int to) { bool r = true; for (int i = from ; i < to ; ++i ) r &= test(i); return r; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { success = run_range(0,NCASES); } printf("result: suite2_x86win32std: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/mkcase.py0000644000175000017500000000375212456307246023400 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys f = file("design.cfg") sigmap = { 'B':'DCbool' , 'c':'DCchar' , 's':'DCshort' , 'i':'DCint' , 'l':'DClonglong' , 'f':'DCfloat' , 'd':'DCdouble' , 'p':'DCpointer' } apimap = { '_':'' , 's':'__declspec(stdcall)' , 'f':'__declspec(fastcall)' } id = 0 maxargs = 0 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); for line in f: line = line.rstrip().lstrip() if len(line) == 0 or line[0] == '#': continue types = []; # args = len(line)-1 args = len(line) maxargs = max(maxargs, args) # api = apimap[ line[0] ] out = [ "VF",str(args),"(", str(id), "," ]; for i in xrange(0,len(line)): types += [ sigmap[ line[i] ] ] out += [ ",".join( types ), ",s_", line, ")\n" ] out = "".join(out) sys.stdout.write(out) id += 1 sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join( ["#define NCASES ",str(id),"\n"] ) ) sys.stderr.write("".join( ["#define MAXARGS ",str(maxargs),"\n"] ) ) MoarVM-2015.11/3rdparty/dyncall/test/suite2_x86win32std/rand.py0000644000175000017500000000267412456307246023063 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import random import sys N = 100 MINARG = 0 MAXARG = 19 argtypes = [ 'B','c','s','i','l','f','d','p' ] apitypes = [ '_' ] def sig(n): s = "" x = random.randint( 0, len(apitypes)-1 ) # s += apitypes[x] for i in xrange(0,n): x = random.randint( 0, len(argtypes)-1 ) s += argtypes[x] return s for i in xrange(0,N): n = random.randint(MINARG,MAXARG) sys.stdout.write( sig(n) ) sys.stdout.write( "\n" ) MoarVM-2015.11/3rdparty/dyncall/test/suite3/CMakeLists.txt0000644000175000017500000000012012456307246022203 0ustar jnthnjnthnadd_executable(suite3 case.cc main.cc) target_link_libraries(suite3 dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite3/Makefile.M0000644000175000017500000000015312456307246021304 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite3/Makefile.embedded0000644000175000017500000000047712502366750022647 0ustar jnthnjnthnAPP = suite3 OBJS = case.o main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s .PHONY: all clean autogen all: ${APP} ${APP}: ${OBJS} ${CXX} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} autogen: python mkcase.py 1>case.h 2>config.h MoarVM-2015.11/3rdparty/dyncall/test/suite3/Makefile.generic0000644000175000017500000000056212456307246022530 0ustar jnthnjnthnAPP = suite3 OBJS = case.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CPPFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CXX} ${CXXFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/suite3/Nmakefile0000644000175000017500000000376012456307246021276 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite3.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite3.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite3/README.txt0000644000175000017500000000333312456307246021152 0ustar jnthnjnthn dyncall stress test suite: testing standard C calls =================================================== Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: suite - run full range suite - run test id suite - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position This version is a modification to "test/suite" using only 4 basic types: integer, float, double and long long. MoarVM-2015.11/3rdparty/dyncall/test/suite3/case.cc0000644000175000017500000001012712456307246020675 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite3/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" DCValue mValue[NARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DClonglong value, int pos) { mValue[pos].L = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void S () {gID=id;} #define VF1(id,A1,S) void S (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void S (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void S (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void S (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #define VF0(id,S) reinterpret_cast(S), #define VF1(id,A1,S) reinterpret_cast(S), #define VF2(id,A1,A2,S) reinterpret_cast(S), #define VF3(id,A1,A2,A3,S) reinterpret_cast(S), #define VF4(id,A1,A2,A3,A4,S) reinterpret_cast(S), #define VF5(id,A1,A2,A3,A4,A5,S) reinterpret_cast(S), #define VF6(id,A1,A2,A3,A4,A5,A6,S) reinterpret_cast(S), #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) reinterpret_cast(S), #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) reinterpret_cast(S), #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) reinterpret_cast(S), #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) reinterpret_cast(S), typedef void (*fp)(); fp gFuncTable[] = { #include "case.h" }; DCpointer getFunc(int x) { return (DCpointer) gFuncTable[x]; } MoarVM-2015.11/3rdparty/dyncall/test/suite3/case.h0000644000175000017500000004074712456307246020552 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite3/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCint,f_i) VF1(2,DClonglong,f_L) VF1(3,DCdouble,f_d) VF1(4,DCfloat,f_f) VF2(5,DCint,DCint,f_ii) VF2(6,DClonglong,DCint,f_Li) VF2(7,DCdouble,DCint,f_di) VF2(8,DCfloat,DCint,f_fi) VF2(9,DCint,DClonglong,f_iL) VF2(10,DClonglong,DClonglong,f_LL) VF2(11,DCdouble,DClonglong,f_dL) VF2(12,DCfloat,DClonglong,f_fL) VF2(13,DCint,DCdouble,f_id) VF2(14,DClonglong,DCdouble,f_Ld) VF2(15,DCdouble,DCdouble,f_dd) VF2(16,DCfloat,DCdouble,f_fd) VF2(17,DCint,DCfloat,f_if) VF2(18,DClonglong,DCfloat,f_Lf) VF2(19,DCdouble,DCfloat,f_df) VF2(20,DCfloat,DCfloat,f_ff) VF3(21,DCint,DCint,DCint,f_iii) VF3(22,DClonglong,DCint,DCint,f_Lii) VF3(23,DCdouble,DCint,DCint,f_dii) VF3(24,DCfloat,DCint,DCint,f_fii) VF3(25,DCint,DClonglong,DCint,f_iLi) VF3(26,DClonglong,DClonglong,DCint,f_LLi) VF3(27,DCdouble,DClonglong,DCint,f_dLi) VF3(28,DCfloat,DClonglong,DCint,f_fLi) VF3(29,DCint,DCdouble,DCint,f_idi) VF3(30,DClonglong,DCdouble,DCint,f_Ldi) VF3(31,DCdouble,DCdouble,DCint,f_ddi) VF3(32,DCfloat,DCdouble,DCint,f_fdi) VF3(33,DCint,DCfloat,DCint,f_ifi) VF3(34,DClonglong,DCfloat,DCint,f_Lfi) VF3(35,DCdouble,DCfloat,DCint,f_dfi) VF3(36,DCfloat,DCfloat,DCint,f_ffi) VF3(37,DCint,DCint,DClonglong,f_iiL) VF3(38,DClonglong,DCint,DClonglong,f_LiL) VF3(39,DCdouble,DCint,DClonglong,f_diL) VF3(40,DCfloat,DCint,DClonglong,f_fiL) VF3(41,DCint,DClonglong,DClonglong,f_iLL) VF3(42,DClonglong,DClonglong,DClonglong,f_LLL) VF3(43,DCdouble,DClonglong,DClonglong,f_dLL) VF3(44,DCfloat,DClonglong,DClonglong,f_fLL) VF3(45,DCint,DCdouble,DClonglong,f_idL) VF3(46,DClonglong,DCdouble,DClonglong,f_LdL) VF3(47,DCdouble,DCdouble,DClonglong,f_ddL) VF3(48,DCfloat,DCdouble,DClonglong,f_fdL) VF3(49,DCint,DCfloat,DClonglong,f_ifL) VF3(50,DClonglong,DCfloat,DClonglong,f_LfL) VF3(51,DCdouble,DCfloat,DClonglong,f_dfL) VF3(52,DCfloat,DCfloat,DClonglong,f_ffL) VF3(53,DCint,DCint,DCdouble,f_iid) VF3(54,DClonglong,DCint,DCdouble,f_Lid) VF3(55,DCdouble,DCint,DCdouble,f_did) VF3(56,DCfloat,DCint,DCdouble,f_fid) VF3(57,DCint,DClonglong,DCdouble,f_iLd) VF3(58,DClonglong,DClonglong,DCdouble,f_LLd) VF3(59,DCdouble,DClonglong,DCdouble,f_dLd) VF3(60,DCfloat,DClonglong,DCdouble,f_fLd) VF3(61,DCint,DCdouble,DCdouble,f_idd) VF3(62,DClonglong,DCdouble,DCdouble,f_Ldd) VF3(63,DCdouble,DCdouble,DCdouble,f_ddd) VF3(64,DCfloat,DCdouble,DCdouble,f_fdd) VF3(65,DCint,DCfloat,DCdouble,f_ifd) VF3(66,DClonglong,DCfloat,DCdouble,f_Lfd) VF3(67,DCdouble,DCfloat,DCdouble,f_dfd) VF3(68,DCfloat,DCfloat,DCdouble,f_ffd) VF3(69,DCint,DCint,DCfloat,f_iif) VF3(70,DClonglong,DCint,DCfloat,f_Lif) VF3(71,DCdouble,DCint,DCfloat,f_dif) VF3(72,DCfloat,DCint,DCfloat,f_fif) VF3(73,DCint,DClonglong,DCfloat,f_iLf) VF3(74,DClonglong,DClonglong,DCfloat,f_LLf) VF3(75,DCdouble,DClonglong,DCfloat,f_dLf) VF3(76,DCfloat,DClonglong,DCfloat,f_fLf) VF3(77,DCint,DCdouble,DCfloat,f_idf) VF3(78,DClonglong,DCdouble,DCfloat,f_Ldf) VF3(79,DCdouble,DCdouble,DCfloat,f_ddf) VF3(80,DCfloat,DCdouble,DCfloat,f_fdf) VF3(81,DCint,DCfloat,DCfloat,f_iff) VF3(82,DClonglong,DCfloat,DCfloat,f_Lff) VF3(83,DCdouble,DCfloat,DCfloat,f_dff) VF3(84,DCfloat,DCfloat,DCfloat,f_fff) VF4(85,DCint,DCint,DCint,DCint,f_iiii) VF4(86,DClonglong,DCint,DCint,DCint,f_Liii) VF4(87,DCdouble,DCint,DCint,DCint,f_diii) VF4(88,DCfloat,DCint,DCint,DCint,f_fiii) VF4(89,DCint,DClonglong,DCint,DCint,f_iLii) VF4(90,DClonglong,DClonglong,DCint,DCint,f_LLii) VF4(91,DCdouble,DClonglong,DCint,DCint,f_dLii) VF4(92,DCfloat,DClonglong,DCint,DCint,f_fLii) VF4(93,DCint,DCdouble,DCint,DCint,f_idii) VF4(94,DClonglong,DCdouble,DCint,DCint,f_Ldii) VF4(95,DCdouble,DCdouble,DCint,DCint,f_ddii) VF4(96,DCfloat,DCdouble,DCint,DCint,f_fdii) VF4(97,DCint,DCfloat,DCint,DCint,f_ifii) VF4(98,DClonglong,DCfloat,DCint,DCint,f_Lfii) VF4(99,DCdouble,DCfloat,DCint,DCint,f_dfii) VF4(100,DCfloat,DCfloat,DCint,DCint,f_ffii) VF4(101,DCint,DCint,DClonglong,DCint,f_iiLi) VF4(102,DClonglong,DCint,DClonglong,DCint,f_LiLi) VF4(103,DCdouble,DCint,DClonglong,DCint,f_diLi) VF4(104,DCfloat,DCint,DClonglong,DCint,f_fiLi) VF4(105,DCint,DClonglong,DClonglong,DCint,f_iLLi) VF4(106,DClonglong,DClonglong,DClonglong,DCint,f_LLLi) VF4(107,DCdouble,DClonglong,DClonglong,DCint,f_dLLi) VF4(108,DCfloat,DClonglong,DClonglong,DCint,f_fLLi) VF4(109,DCint,DCdouble,DClonglong,DCint,f_idLi) VF4(110,DClonglong,DCdouble,DClonglong,DCint,f_LdLi) VF4(111,DCdouble,DCdouble,DClonglong,DCint,f_ddLi) VF4(112,DCfloat,DCdouble,DClonglong,DCint,f_fdLi) VF4(113,DCint,DCfloat,DClonglong,DCint,f_ifLi) VF4(114,DClonglong,DCfloat,DClonglong,DCint,f_LfLi) VF4(115,DCdouble,DCfloat,DClonglong,DCint,f_dfLi) VF4(116,DCfloat,DCfloat,DClonglong,DCint,f_ffLi) VF4(117,DCint,DCint,DCdouble,DCint,f_iidi) VF4(118,DClonglong,DCint,DCdouble,DCint,f_Lidi) VF4(119,DCdouble,DCint,DCdouble,DCint,f_didi) VF4(120,DCfloat,DCint,DCdouble,DCint,f_fidi) VF4(121,DCint,DClonglong,DCdouble,DCint,f_iLdi) VF4(122,DClonglong,DClonglong,DCdouble,DCint,f_LLdi) VF4(123,DCdouble,DClonglong,DCdouble,DCint,f_dLdi) VF4(124,DCfloat,DClonglong,DCdouble,DCint,f_fLdi) VF4(125,DCint,DCdouble,DCdouble,DCint,f_iddi) VF4(126,DClonglong,DCdouble,DCdouble,DCint,f_Lddi) VF4(127,DCdouble,DCdouble,DCdouble,DCint,f_dddi) VF4(128,DCfloat,DCdouble,DCdouble,DCint,f_fddi) VF4(129,DCint,DCfloat,DCdouble,DCint,f_ifdi) VF4(130,DClonglong,DCfloat,DCdouble,DCint,f_Lfdi) VF4(131,DCdouble,DCfloat,DCdouble,DCint,f_dfdi) VF4(132,DCfloat,DCfloat,DCdouble,DCint,f_ffdi) VF4(133,DCint,DCint,DCfloat,DCint,f_iifi) VF4(134,DClonglong,DCint,DCfloat,DCint,f_Lifi) VF4(135,DCdouble,DCint,DCfloat,DCint,f_difi) VF4(136,DCfloat,DCint,DCfloat,DCint,f_fifi) VF4(137,DCint,DClonglong,DCfloat,DCint,f_iLfi) VF4(138,DClonglong,DClonglong,DCfloat,DCint,f_LLfi) VF4(139,DCdouble,DClonglong,DCfloat,DCint,f_dLfi) VF4(140,DCfloat,DClonglong,DCfloat,DCint,f_fLfi) VF4(141,DCint,DCdouble,DCfloat,DCint,f_idfi) VF4(142,DClonglong,DCdouble,DCfloat,DCint,f_Ldfi) VF4(143,DCdouble,DCdouble,DCfloat,DCint,f_ddfi) VF4(144,DCfloat,DCdouble,DCfloat,DCint,f_fdfi) VF4(145,DCint,DCfloat,DCfloat,DCint,f_iffi) VF4(146,DClonglong,DCfloat,DCfloat,DCint,f_Lffi) VF4(147,DCdouble,DCfloat,DCfloat,DCint,f_dffi) VF4(148,DCfloat,DCfloat,DCfloat,DCint,f_fffi) VF4(149,DCint,DCint,DCint,DClonglong,f_iiiL) VF4(150,DClonglong,DCint,DCint,DClonglong,f_LiiL) VF4(151,DCdouble,DCint,DCint,DClonglong,f_diiL) VF4(152,DCfloat,DCint,DCint,DClonglong,f_fiiL) VF4(153,DCint,DClonglong,DCint,DClonglong,f_iLiL) VF4(154,DClonglong,DClonglong,DCint,DClonglong,f_LLiL) VF4(155,DCdouble,DClonglong,DCint,DClonglong,f_dLiL) VF4(156,DCfloat,DClonglong,DCint,DClonglong,f_fLiL) VF4(157,DCint,DCdouble,DCint,DClonglong,f_idiL) VF4(158,DClonglong,DCdouble,DCint,DClonglong,f_LdiL) VF4(159,DCdouble,DCdouble,DCint,DClonglong,f_ddiL) VF4(160,DCfloat,DCdouble,DCint,DClonglong,f_fdiL) VF4(161,DCint,DCfloat,DCint,DClonglong,f_ifiL) VF4(162,DClonglong,DCfloat,DCint,DClonglong,f_LfiL) VF4(163,DCdouble,DCfloat,DCint,DClonglong,f_dfiL) VF4(164,DCfloat,DCfloat,DCint,DClonglong,f_ffiL) VF4(165,DCint,DCint,DClonglong,DClonglong,f_iiLL) VF4(166,DClonglong,DCint,DClonglong,DClonglong,f_LiLL) VF4(167,DCdouble,DCint,DClonglong,DClonglong,f_diLL) VF4(168,DCfloat,DCint,DClonglong,DClonglong,f_fiLL) VF4(169,DCint,DClonglong,DClonglong,DClonglong,f_iLLL) VF4(170,DClonglong,DClonglong,DClonglong,DClonglong,f_LLLL) VF4(171,DCdouble,DClonglong,DClonglong,DClonglong,f_dLLL) VF4(172,DCfloat,DClonglong,DClonglong,DClonglong,f_fLLL) VF4(173,DCint,DCdouble,DClonglong,DClonglong,f_idLL) VF4(174,DClonglong,DCdouble,DClonglong,DClonglong,f_LdLL) VF4(175,DCdouble,DCdouble,DClonglong,DClonglong,f_ddLL) VF4(176,DCfloat,DCdouble,DClonglong,DClonglong,f_fdLL) VF4(177,DCint,DCfloat,DClonglong,DClonglong,f_ifLL) VF4(178,DClonglong,DCfloat,DClonglong,DClonglong,f_LfLL) VF4(179,DCdouble,DCfloat,DClonglong,DClonglong,f_dfLL) VF4(180,DCfloat,DCfloat,DClonglong,DClonglong,f_ffLL) VF4(181,DCint,DCint,DCdouble,DClonglong,f_iidL) VF4(182,DClonglong,DCint,DCdouble,DClonglong,f_LidL) VF4(183,DCdouble,DCint,DCdouble,DClonglong,f_didL) VF4(184,DCfloat,DCint,DCdouble,DClonglong,f_fidL) VF4(185,DCint,DClonglong,DCdouble,DClonglong,f_iLdL) VF4(186,DClonglong,DClonglong,DCdouble,DClonglong,f_LLdL) VF4(187,DCdouble,DClonglong,DCdouble,DClonglong,f_dLdL) VF4(188,DCfloat,DClonglong,DCdouble,DClonglong,f_fLdL) VF4(189,DCint,DCdouble,DCdouble,DClonglong,f_iddL) VF4(190,DClonglong,DCdouble,DCdouble,DClonglong,f_LddL) VF4(191,DCdouble,DCdouble,DCdouble,DClonglong,f_dddL) VF4(192,DCfloat,DCdouble,DCdouble,DClonglong,f_fddL) VF4(193,DCint,DCfloat,DCdouble,DClonglong,f_ifdL) VF4(194,DClonglong,DCfloat,DCdouble,DClonglong,f_LfdL) VF4(195,DCdouble,DCfloat,DCdouble,DClonglong,f_dfdL) VF4(196,DCfloat,DCfloat,DCdouble,DClonglong,f_ffdL) VF4(197,DCint,DCint,DCfloat,DClonglong,f_iifL) VF4(198,DClonglong,DCint,DCfloat,DClonglong,f_LifL) VF4(199,DCdouble,DCint,DCfloat,DClonglong,f_difL) VF4(200,DCfloat,DCint,DCfloat,DClonglong,f_fifL) VF4(201,DCint,DClonglong,DCfloat,DClonglong,f_iLfL) VF4(202,DClonglong,DClonglong,DCfloat,DClonglong,f_LLfL) VF4(203,DCdouble,DClonglong,DCfloat,DClonglong,f_dLfL) VF4(204,DCfloat,DClonglong,DCfloat,DClonglong,f_fLfL) VF4(205,DCint,DCdouble,DCfloat,DClonglong,f_idfL) VF4(206,DClonglong,DCdouble,DCfloat,DClonglong,f_LdfL) VF4(207,DCdouble,DCdouble,DCfloat,DClonglong,f_ddfL) VF4(208,DCfloat,DCdouble,DCfloat,DClonglong,f_fdfL) VF4(209,DCint,DCfloat,DCfloat,DClonglong,f_iffL) VF4(210,DClonglong,DCfloat,DCfloat,DClonglong,f_LffL) VF4(211,DCdouble,DCfloat,DCfloat,DClonglong,f_dffL) VF4(212,DCfloat,DCfloat,DCfloat,DClonglong,f_fffL) VF4(213,DCint,DCint,DCint,DCdouble,f_iiid) VF4(214,DClonglong,DCint,DCint,DCdouble,f_Liid) VF4(215,DCdouble,DCint,DCint,DCdouble,f_diid) VF4(216,DCfloat,DCint,DCint,DCdouble,f_fiid) VF4(217,DCint,DClonglong,DCint,DCdouble,f_iLid) VF4(218,DClonglong,DClonglong,DCint,DCdouble,f_LLid) VF4(219,DCdouble,DClonglong,DCint,DCdouble,f_dLid) VF4(220,DCfloat,DClonglong,DCint,DCdouble,f_fLid) VF4(221,DCint,DCdouble,DCint,DCdouble,f_idid) VF4(222,DClonglong,DCdouble,DCint,DCdouble,f_Ldid) VF4(223,DCdouble,DCdouble,DCint,DCdouble,f_ddid) VF4(224,DCfloat,DCdouble,DCint,DCdouble,f_fdid) VF4(225,DCint,DCfloat,DCint,DCdouble,f_ifid) VF4(226,DClonglong,DCfloat,DCint,DCdouble,f_Lfid) VF4(227,DCdouble,DCfloat,DCint,DCdouble,f_dfid) VF4(228,DCfloat,DCfloat,DCint,DCdouble,f_ffid) VF4(229,DCint,DCint,DClonglong,DCdouble,f_iiLd) VF4(230,DClonglong,DCint,DClonglong,DCdouble,f_LiLd) VF4(231,DCdouble,DCint,DClonglong,DCdouble,f_diLd) VF4(232,DCfloat,DCint,DClonglong,DCdouble,f_fiLd) VF4(233,DCint,DClonglong,DClonglong,DCdouble,f_iLLd) VF4(234,DClonglong,DClonglong,DClonglong,DCdouble,f_LLLd) VF4(235,DCdouble,DClonglong,DClonglong,DCdouble,f_dLLd) VF4(236,DCfloat,DClonglong,DClonglong,DCdouble,f_fLLd) VF4(237,DCint,DCdouble,DClonglong,DCdouble,f_idLd) VF4(238,DClonglong,DCdouble,DClonglong,DCdouble,f_LdLd) VF4(239,DCdouble,DCdouble,DClonglong,DCdouble,f_ddLd) VF4(240,DCfloat,DCdouble,DClonglong,DCdouble,f_fdLd) VF4(241,DCint,DCfloat,DClonglong,DCdouble,f_ifLd) VF4(242,DClonglong,DCfloat,DClonglong,DCdouble,f_LfLd) VF4(243,DCdouble,DCfloat,DClonglong,DCdouble,f_dfLd) VF4(244,DCfloat,DCfloat,DClonglong,DCdouble,f_ffLd) VF4(245,DCint,DCint,DCdouble,DCdouble,f_iidd) VF4(246,DClonglong,DCint,DCdouble,DCdouble,f_Lidd) VF4(247,DCdouble,DCint,DCdouble,DCdouble,f_didd) VF4(248,DCfloat,DCint,DCdouble,DCdouble,f_fidd) VF4(249,DCint,DClonglong,DCdouble,DCdouble,f_iLdd) VF4(250,DClonglong,DClonglong,DCdouble,DCdouble,f_LLdd) VF4(251,DCdouble,DClonglong,DCdouble,DCdouble,f_dLdd) VF4(252,DCfloat,DClonglong,DCdouble,DCdouble,f_fLdd) VF4(253,DCint,DCdouble,DCdouble,DCdouble,f_iddd) VF4(254,DClonglong,DCdouble,DCdouble,DCdouble,f_Lddd) VF4(255,DCdouble,DCdouble,DCdouble,DCdouble,f_dddd) VF4(256,DCfloat,DCdouble,DCdouble,DCdouble,f_fddd) VF4(257,DCint,DCfloat,DCdouble,DCdouble,f_ifdd) VF4(258,DClonglong,DCfloat,DCdouble,DCdouble,f_Lfdd) VF4(259,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdd) VF4(260,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdd) VF4(261,DCint,DCint,DCfloat,DCdouble,f_iifd) VF4(262,DClonglong,DCint,DCfloat,DCdouble,f_Lifd) VF4(263,DCdouble,DCint,DCfloat,DCdouble,f_difd) VF4(264,DCfloat,DCint,DCfloat,DCdouble,f_fifd) VF4(265,DCint,DClonglong,DCfloat,DCdouble,f_iLfd) VF4(266,DClonglong,DClonglong,DCfloat,DCdouble,f_LLfd) VF4(267,DCdouble,DClonglong,DCfloat,DCdouble,f_dLfd) VF4(268,DCfloat,DClonglong,DCfloat,DCdouble,f_fLfd) VF4(269,DCint,DCdouble,DCfloat,DCdouble,f_idfd) VF4(270,DClonglong,DCdouble,DCfloat,DCdouble,f_Ldfd) VF4(271,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfd) VF4(272,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfd) VF4(273,DCint,DCfloat,DCfloat,DCdouble,f_iffd) VF4(274,DClonglong,DCfloat,DCfloat,DCdouble,f_Lffd) VF4(275,DCdouble,DCfloat,DCfloat,DCdouble,f_dffd) VF4(276,DCfloat,DCfloat,DCfloat,DCdouble,f_fffd) VF4(277,DCint,DCint,DCint,DCfloat,f_iiif) VF4(278,DClonglong,DCint,DCint,DCfloat,f_Liif) VF4(279,DCdouble,DCint,DCint,DCfloat,f_diif) VF4(280,DCfloat,DCint,DCint,DCfloat,f_fiif) VF4(281,DCint,DClonglong,DCint,DCfloat,f_iLif) VF4(282,DClonglong,DClonglong,DCint,DCfloat,f_LLif) VF4(283,DCdouble,DClonglong,DCint,DCfloat,f_dLif) VF4(284,DCfloat,DClonglong,DCint,DCfloat,f_fLif) VF4(285,DCint,DCdouble,DCint,DCfloat,f_idif) VF4(286,DClonglong,DCdouble,DCint,DCfloat,f_Ldif) VF4(287,DCdouble,DCdouble,DCint,DCfloat,f_ddif) VF4(288,DCfloat,DCdouble,DCint,DCfloat,f_fdif) VF4(289,DCint,DCfloat,DCint,DCfloat,f_ifif) VF4(290,DClonglong,DCfloat,DCint,DCfloat,f_Lfif) VF4(291,DCdouble,DCfloat,DCint,DCfloat,f_dfif) VF4(292,DCfloat,DCfloat,DCint,DCfloat,f_ffif) VF4(293,DCint,DCint,DClonglong,DCfloat,f_iiLf) VF4(294,DClonglong,DCint,DClonglong,DCfloat,f_LiLf) VF4(295,DCdouble,DCint,DClonglong,DCfloat,f_diLf) VF4(296,DCfloat,DCint,DClonglong,DCfloat,f_fiLf) VF4(297,DCint,DClonglong,DClonglong,DCfloat,f_iLLf) VF4(298,DClonglong,DClonglong,DClonglong,DCfloat,f_LLLf) VF4(299,DCdouble,DClonglong,DClonglong,DCfloat,f_dLLf) VF4(300,DCfloat,DClonglong,DClonglong,DCfloat,f_fLLf) VF4(301,DCint,DCdouble,DClonglong,DCfloat,f_idLf) VF4(302,DClonglong,DCdouble,DClonglong,DCfloat,f_LdLf) VF4(303,DCdouble,DCdouble,DClonglong,DCfloat,f_ddLf) VF4(304,DCfloat,DCdouble,DClonglong,DCfloat,f_fdLf) VF4(305,DCint,DCfloat,DClonglong,DCfloat,f_ifLf) VF4(306,DClonglong,DCfloat,DClonglong,DCfloat,f_LfLf) VF4(307,DCdouble,DCfloat,DClonglong,DCfloat,f_dfLf) VF4(308,DCfloat,DCfloat,DClonglong,DCfloat,f_ffLf) VF4(309,DCint,DCint,DCdouble,DCfloat,f_iidf) VF4(310,DClonglong,DCint,DCdouble,DCfloat,f_Lidf) VF4(311,DCdouble,DCint,DCdouble,DCfloat,f_didf) VF4(312,DCfloat,DCint,DCdouble,DCfloat,f_fidf) VF4(313,DCint,DClonglong,DCdouble,DCfloat,f_iLdf) VF4(314,DClonglong,DClonglong,DCdouble,DCfloat,f_LLdf) VF4(315,DCdouble,DClonglong,DCdouble,DCfloat,f_dLdf) VF4(316,DCfloat,DClonglong,DCdouble,DCfloat,f_fLdf) VF4(317,DCint,DCdouble,DCdouble,DCfloat,f_iddf) VF4(318,DClonglong,DCdouble,DCdouble,DCfloat,f_Lddf) VF4(319,DCdouble,DCdouble,DCdouble,DCfloat,f_dddf) VF4(320,DCfloat,DCdouble,DCdouble,DCfloat,f_fddf) VF4(321,DCint,DCfloat,DCdouble,DCfloat,f_ifdf) VF4(322,DClonglong,DCfloat,DCdouble,DCfloat,f_Lfdf) VF4(323,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdf) VF4(324,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdf) VF4(325,DCint,DCint,DCfloat,DCfloat,f_iiff) VF4(326,DClonglong,DCint,DCfloat,DCfloat,f_Liff) VF4(327,DCdouble,DCint,DCfloat,DCfloat,f_diff) VF4(328,DCfloat,DCint,DCfloat,DCfloat,f_fiff) VF4(329,DCint,DClonglong,DCfloat,DCfloat,f_iLff) VF4(330,DClonglong,DClonglong,DCfloat,DCfloat,f_LLff) VF4(331,DCdouble,DClonglong,DCfloat,DCfloat,f_dLff) VF4(332,DCfloat,DClonglong,DCfloat,DCfloat,f_fLff) VF4(333,DCint,DCdouble,DCfloat,DCfloat,f_idff) VF4(334,DClonglong,DCdouble,DCfloat,DCfloat,f_Ldff) VF4(335,DCdouble,DCdouble,DCfloat,DCfloat,f_ddff) VF4(336,DCfloat,DCdouble,DCfloat,DCfloat,f_fdff) VF4(337,DCint,DCfloat,DCfloat,DCfloat,f_ifff) VF4(338,DClonglong,DCfloat,DCfloat,DCfloat,f_Lfff) VF4(339,DCdouble,DCfloat,DCfloat,DCfloat,f_dfff) VF4(340,DCfloat,DCfloat,DCfloat,DCfloat,f_ffff) MoarVM-2015.11/3rdparty/dyncall/test/suite3/config.h0000644000175000017500000000200412456307246021064 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite3/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 4 #define NTYPES 4 MoarVM-2015.11/3rdparty/dyncall/test/suite3/dynMakefile0000644000175000017500000000032412456307246021624 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite3/main.cc0000644000175000017500000000714012456307246020707 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite3/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); DCint valueInt [NARGS]; DClonglong valueLongLong[NARGS]; DCdouble valueDouble [NARGS]; DCfloat valueFloat [NARGS]; bool equals(int select, int pos, void* data) { switch(select) { case 0: return ( getArg(pos)->i == valueInt [pos] ); break; case 1: return ( getArg(pos)->l == valueLongLong[pos] ); break; case 2: return ( getArg(pos)->d == valueDouble [pos] ); break; case 3: return ( getArg(pos)->f == valueFloat [pos] ); break; } return false; } void clearValues(); void init() { for (int i = 0 ; i < NARGS ; ++i ) { valueInt[i] = DCint(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valueFloat[i] = DCfloat(i); } } void push(DCCallVM* pCall, int select, int pos) { switch(select) { case 0: dcArgInt ( pCall, valueInt [pos] ); break; case 1: dcArgLongLong( pCall, valueLongLong[pos] ); break; case 2: dcArgDouble ( pCall, valueDouble [pos] ); break; case 3: dcArgFloat ( pCall, valueFloat [pos] ); break; } } #define assert(x) if (!(x)) return false bool test(int x) { clearValues(); DCCallVM* pCall = dcNewCallVM(4096); dcReset(pCall); int y = x; int selects[NARGS] = { 0, }; int pos = 0; for(pos = 0;y>0;++pos) { int select = (y-1) % NTYPES; selects[pos] = select; push(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(int i = 0;i( pow((double)x,n)+powerfact(x,n-1) ); } bool run_range(int from, int to) { bool tr = true; for (int i = from ; i < to ; ++i ) { printf("%d:",i); bool r = test(i); printf("%d\n", r); tr &= r; } return tr; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { int ncalls = powerfact(NTYPES,NARGS)+1; success = run_range(0,ncalls); } printf("result: suite3: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite3/mkcase.py0000644000175000017500000000376112456307246021276 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys # parameters # nargs max is currently 10, modify case.cpp for more arguments nargs = 4 types = ["DCint","DClonglong","DCdouble","DCfloat"] typeSigs = ["i", "l", "d", "f" ] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types [s] ] sig += [ typeSigs[s] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/CMakeLists.txt0000644000175000017500000000013412456307246023475 0ustar jnthnjnthnadd_executable(suite_floats case.cc main.cc) target_link_libraries(suite_floats dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/Makefile.M0000644000175000017500000000015312456307246022571 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/Makefile.embedded0000644000175000017500000000041312502366750024122 0ustar jnthnjnthnAPP = suite_floats OBJS = case.o main.o TOP = ../.. CFLAGS += -I${TOP}/dyncall LDFLAGS += -L${TOP}/dyncall LDLIBS += -ldyncall_s all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CXX} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/Makefile.generic0000644000175000017500000000057012456307246024014 0ustar jnthnjnthnAPP = suite_floats OBJS = case.o main.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CXXFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CXX} ${CXXFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/Nmakefile0000644000175000017500000000353212456307246022560 0ustar jnthnjnthn# # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite_floats.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite_floats.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/README.txt0000644000175000017500000000330312456307246022434 0ustar jnthnjnthndyncall stress test suite: testing standard C calls =================================================== Copyright (c) 2007-2010 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: suite_floats - run full range suite_floats - run test id suite_floats - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position this suite is a variant of suite which tests only double/float MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/case.cc0000644000175000017500000001046512456307246022167 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_floats/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" DCValue mValue[NARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DClonglong value, int pos) { mValue[pos].l = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } extern "C" { #define VF0(id,S) void S () {gID=id;} #define VF1(id,A1,S) void S (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void S (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void S (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void S (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #define VF0(id,S) reinterpret_cast(S), #define VF1(id,A1,S) reinterpret_cast(S), #define VF2(id,A1,A2,S) reinterpret_cast(S), #define VF3(id,A1,A2,A3,S) reinterpret_cast(S), #define VF4(id,A1,A2,A3,A4,S) reinterpret_cast(S), #define VF5(id,A1,A2,A3,A4,A5,S) reinterpret_cast(S), #define VF6(id,A1,A2,A3,A4,A5,A6,S) reinterpret_cast(S), #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) reinterpret_cast(S), #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) reinterpret_cast(S), #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) reinterpret_cast(S), #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) reinterpret_cast(S), typedef void (*fp)(); fp gFuncTable[] = { #include "case.h" }; DCpointer getFunc(int x) { return (DCpointer) gFuncTable[x]; } MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/case.h0000644000175000017500000061363112456307246022035 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_floats/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCdouble,f_d) VF1(2,DCfloat,f_f) VF2(3,DCdouble,DCdouble,f_dd) VF2(4,DCfloat,DCdouble,f_fd) VF2(5,DCdouble,DCfloat,f_df) VF2(6,DCfloat,DCfloat,f_ff) VF3(7,DCdouble,DCdouble,DCdouble,f_ddd) VF3(8,DCfloat,DCdouble,DCdouble,f_fdd) VF3(9,DCdouble,DCfloat,DCdouble,f_dfd) VF3(10,DCfloat,DCfloat,DCdouble,f_ffd) VF3(11,DCdouble,DCdouble,DCfloat,f_ddf) VF3(12,DCfloat,DCdouble,DCfloat,f_fdf) VF3(13,DCdouble,DCfloat,DCfloat,f_dff) VF3(14,DCfloat,DCfloat,DCfloat,f_fff) VF4(15,DCdouble,DCdouble,DCdouble,DCdouble,f_dddd) VF4(16,DCfloat,DCdouble,DCdouble,DCdouble,f_fddd) VF4(17,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdd) VF4(18,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdd) VF4(19,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfd) VF4(20,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfd) VF4(21,DCdouble,DCfloat,DCfloat,DCdouble,f_dffd) VF4(22,DCfloat,DCfloat,DCfloat,DCdouble,f_fffd) VF4(23,DCdouble,DCdouble,DCdouble,DCfloat,f_dddf) VF4(24,DCfloat,DCdouble,DCdouble,DCfloat,f_fddf) VF4(25,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdf) VF4(26,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdf) VF4(27,DCdouble,DCdouble,DCfloat,DCfloat,f_ddff) VF4(28,DCfloat,DCdouble,DCfloat,DCfloat,f_fdff) VF4(29,DCdouble,DCfloat,DCfloat,DCfloat,f_dfff) VF4(30,DCfloat,DCfloat,DCfloat,DCfloat,f_ffff) VF5(31,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddd) VF5(32,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddd) VF5(33,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddd) VF5(34,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddd) VF5(35,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdd) VF5(36,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdd) VF5(37,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdd) VF5(38,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdd) VF5(39,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfd) VF5(40,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfd) VF5(41,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfd) VF5(42,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfd) VF5(43,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffd) VF5(44,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffd) VF5(45,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffd) VF5(46,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffd) VF5(47,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddf) VF5(48,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddf) VF5(49,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddf) VF5(50,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddf) VF5(51,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdf) VF5(52,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdf) VF5(53,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdf) VF5(54,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdf) VF5(55,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddff) VF5(56,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddff) VF5(57,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdff) VF5(58,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdff) VF5(59,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfff) VF5(60,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfff) VF5(61,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffff) VF5(62,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffff) VF6(63,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddd) VF6(64,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddddd) VF6(65,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdddd) VF6(66,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdddd) VF6(67,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfddd) VF6(68,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfddd) VF6(69,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffddd) VF6(70,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffddd) VF6(71,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfdd) VF6(72,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfdd) VF6(73,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfdd) VF6(74,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfdd) VF6(75,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffdd) VF6(76,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffdd) VF6(77,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffdd) VF6(78,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffdd) VF6(79,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddfd) VF6(80,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddfd) VF6(81,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddfd) VF6(82,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddfd) VF6(83,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdfd) VF6(84,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdfd) VF6(85,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdfd) VF6(86,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdfd) VF6(87,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddffd) VF6(88,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddffd) VF6(89,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdffd) VF6(90,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdffd) VF6(91,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfffd) VF6(92,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfffd) VF6(93,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffffd) VF6(94,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffffd) VF6(95,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddddf) VF6(96,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddddf) VF6(97,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdddf) VF6(98,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdddf) VF6(99,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfddf) VF6(100,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfddf) VF6(101,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffddf) VF6(102,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffddf) VF6(103,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfdf) VF6(104,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfdf) VF6(105,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfdf) VF6(106,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfdf) VF6(107,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffdf) VF6(108,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffdf) VF6(109,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffdf) VF6(110,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffdf) VF6(111,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddff) VF6(112,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddff) VF6(113,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddff) VF6(114,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddff) VF6(115,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdff) VF6(116,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdff) VF6(117,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdff) VF6(118,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdff) VF6(119,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfff) VF6(120,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfff) VF6(121,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfff) VF6(122,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfff) VF6(123,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffff) VF6(124,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffff) VF6(125,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffff) VF6(126,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffff) VF7(127,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddddd) VF7(128,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddddd) VF7(129,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfddddd) VF7(130,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffddddd) VF7(131,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfdddd) VF7(132,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfdddd) VF7(133,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dffdddd) VF7(134,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fffdddd) VF7(135,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dddfddd) VF7(136,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fddfddd) VF7(137,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdfddd) VF7(138,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdfddd) VF7(139,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddffddd) VF7(140,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdffddd) VF7(141,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfffddd) VF7(142,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffffddd) VF7(143,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddddfdd) VF7(144,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdddfdd) VF7(145,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfddfdd) VF7(146,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffddfdd) VF7(147,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdfdd) VF7(148,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdfdd) VF7(149,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dffdfdd) VF7(150,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fffdfdd) VF7(151,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dddffdd) VF7(152,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fddffdd) VF7(153,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdffdd) VF7(154,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdffdd) VF7(155,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfffdd) VF7(156,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfffdd) VF7(157,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dffffdd) VF7(158,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffffdd) VF7(159,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddddfd) VF7(160,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fddddfd) VF7(161,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdddfd) VF7(162,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdddfd) VF7(163,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfddfd) VF7(164,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfddfd) VF7(165,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dffddfd) VF7(166,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fffddfd) VF7(167,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dddfdfd) VF7(168,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fddfdfd) VF7(169,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfdfd) VF7(170,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfdfd) VF7(171,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddffdfd) VF7(172,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdffdfd) VF7(173,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfffdfd) VF7(174,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffffdfd) VF7(175,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddddffd) VF7(176,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdddffd) VF7(177,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfddffd) VF7(178,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffddffd) VF7(179,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfdffd) VF7(180,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfdffd) VF7(181,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dffdffd) VF7(182,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fffdffd) VF7(183,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dddfffd) VF7(184,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fddfffd) VF7(185,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdfffd) VF7(186,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdfffd) VF7(187,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddffffd) VF7(188,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdffffd) VF7(189,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffffd) VF7(190,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffffd) VF7(191,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddddf) VF7(192,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddddf) VF7(193,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfddddf) VF7(194,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffddddf) VF7(195,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfdddf) VF7(196,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfdddf) VF7(197,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dffdddf) VF7(198,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fffdddf) VF7(199,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dddfddf) VF7(200,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fddfddf) VF7(201,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdfddf) VF7(202,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdfddf) VF7(203,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddffddf) VF7(204,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdffddf) VF7(205,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfffddf) VF7(206,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffffddf) VF7(207,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddddfdf) VF7(208,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdddfdf) VF7(209,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfddfdf) VF7(210,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffddfdf) VF7(211,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdfdf) VF7(212,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdfdf) VF7(213,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dffdfdf) VF7(214,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fffdfdf) VF7(215,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dddffdf) VF7(216,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fddffdf) VF7(217,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdffdf) VF7(218,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdffdf) VF7(219,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfffdf) VF7(220,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfffdf) VF7(221,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dffffdf) VF7(222,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffffdf) VF7(223,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddddff) VF7(224,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fddddff) VF7(225,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdddff) VF7(226,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdddff) VF7(227,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfddff) VF7(228,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfddff) VF7(229,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dffddff) VF7(230,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fffddff) VF7(231,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dddfdff) VF7(232,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fddfdff) VF7(233,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdfdff) VF7(234,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdfdff) VF7(235,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddffdff) VF7(236,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdffdff) VF7(237,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfffdff) VF7(238,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffffdff) VF7(239,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddddfff) VF7(240,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdddfff) VF7(241,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfddfff) VF7(242,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffddfff) VF7(243,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfdfff) VF7(244,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfdfff) VF7(245,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dffdfff) VF7(246,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fffdfff) VF7(247,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dddffff) VF7(248,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fddffff) VF7(249,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdffff) VF7(250,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdffff) VF7(251,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfffff) VF7(252,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfffff) VF7(253,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dffffff) VF7(254,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffffff) VF8(255,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddddd) VF8(256,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddddddd) VF8(257,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdddddd) VF8(258,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdddddd) VF8(259,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfddddd) VF8(260,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfddddd) VF8(261,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dffddddd) VF8(262,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fffddddd) VF8(263,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dddfdddd) VF8(264,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fddfdddd) VF8(265,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdfdddd) VF8(266,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdfdddd) VF8(267,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddffdddd) VF8(268,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdffdddd) VF8(269,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfffdddd) VF8(270,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffffdddd) VF8(271,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddddfddd) VF8(272,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdddfddd) VF8(273,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddfddd) VF8(274,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddfddd) VF8(275,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfdfddd) VF8(276,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfdfddd) VF8(277,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dffdfddd) VF8(278,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fffdfddd) VF8(279,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dddffddd) VF8(280,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fddffddd) VF8(281,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdffddd) VF8(282,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdffddd) VF8(283,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfffddd) VF8(284,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfffddd) VF8(285,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffffddd) VF8(286,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffffddd) VF8(287,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddddfdd) VF8(288,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddddfdd) VF8(289,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdddfdd) VF8(290,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdddfdd) VF8(291,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfddfdd) VF8(292,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfddfdd) VF8(293,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dffddfdd) VF8(294,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fffddfdd) VF8(295,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfdfdd) VF8(296,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfdfdd) VF8(297,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfdfdd) VF8(298,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfdfdd) VF8(299,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddffdfdd) VF8(300,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdffdfdd) VF8(301,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfffdfdd) VF8(302,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffffdfdd) VF8(303,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddddffdd) VF8(304,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdddffdd) VF8(305,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfddffdd) VF8(306,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffddffdd) VF8(307,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfdffdd) VF8(308,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfdffdd) VF8(309,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdffdd) VF8(310,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdffdd) VF8(311,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dddfffdd) VF8(312,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fddfffdd) VF8(313,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdfffdd) VF8(314,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdfffdd) VF8(315,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffffdd) VF8(316,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffffdd) VF8(317,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffffdd) VF8(318,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffffdd) VF8(319,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddddfd) VF8(320,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddddfd) VF8(321,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddddfd) VF8(322,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddddfd) VF8(323,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfdddfd) VF8(324,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfdddfd) VF8(325,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dffdddfd) VF8(326,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fffdddfd) VF8(327,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfddfd) VF8(328,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfddfd) VF8(329,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdfddfd) VF8(330,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdfddfd) VF8(331,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddffddfd) VF8(332,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdffddfd) VF8(333,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfffddfd) VF8(334,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffffddfd) VF8(335,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddddfdfd) VF8(336,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdddfdfd) VF8(337,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfddfdfd) VF8(338,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffddfdfd) VF8(339,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdfdfd) VF8(340,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdfdfd) VF8(341,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdfdfd) VF8(342,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdfdfd) VF8(343,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dddffdfd) VF8(344,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fddffdfd) VF8(345,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdffdfd) VF8(346,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdffdfd) VF8(347,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfffdfd) VF8(348,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfffdfd) VF8(349,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffffdfd) VF8(350,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffffdfd) VF8(351,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddddffd) VF8(352,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddddffd) VF8(353,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdddffd) VF8(354,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdddffd) VF8(355,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfddffd) VF8(356,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfddffd) VF8(357,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dffddffd) VF8(358,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fffddffd) VF8(359,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dddfdffd) VF8(360,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fddfdffd) VF8(361,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdfdffd) VF8(362,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdfdffd) VF8(363,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffdffd) VF8(364,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffdffd) VF8(365,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfffdffd) VF8(366,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffffdffd) VF8(367,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddddfffd) VF8(368,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdddfffd) VF8(369,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfddfffd) VF8(370,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffddfffd) VF8(371,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfdfffd) VF8(372,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfdfffd) VF8(373,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dffdfffd) VF8(374,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fffdfffd) VF8(375,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dddffffd) VF8(376,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fddffffd) VF8(377,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdffffd) VF8(378,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdffffd) VF8(379,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfffffd) VF8(380,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfffffd) VF8(381,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffffffd) VF8(382,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffffffd) VF8(383,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddddddf) VF8(384,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddddddf) VF8(385,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdddddf) VF8(386,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdddddf) VF8(387,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfddddf) VF8(388,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfddddf) VF8(389,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dffddddf) VF8(390,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fffddddf) VF8(391,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dddfdddf) VF8(392,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fddfdddf) VF8(393,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdfdddf) VF8(394,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdfdddf) VF8(395,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddffdddf) VF8(396,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdffdddf) VF8(397,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfffdddf) VF8(398,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffffdddf) VF8(399,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddddfddf) VF8(400,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdddfddf) VF8(401,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddfddf) VF8(402,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddfddf) VF8(403,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfdfddf) VF8(404,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfdfddf) VF8(405,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dffdfddf) VF8(406,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fffdfddf) VF8(407,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dddffddf) VF8(408,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fddffddf) VF8(409,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdffddf) VF8(410,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdffddf) VF8(411,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfffddf) VF8(412,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfffddf) VF8(413,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffffddf) VF8(414,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffffddf) VF8(415,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddddfdf) VF8(416,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddddfdf) VF8(417,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdddfdf) VF8(418,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdddfdf) VF8(419,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfddfdf) VF8(420,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfddfdf) VF8(421,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dffddfdf) VF8(422,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fffddfdf) VF8(423,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfdfdf) VF8(424,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfdfdf) VF8(425,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfdfdf) VF8(426,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfdfdf) VF8(427,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddffdfdf) VF8(428,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdffdfdf) VF8(429,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfffdfdf) VF8(430,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffffdfdf) VF8(431,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddddffdf) VF8(432,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdddffdf) VF8(433,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfddffdf) VF8(434,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffddffdf) VF8(435,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfdffdf) VF8(436,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfdffdf) VF8(437,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdffdf) VF8(438,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdffdf) VF8(439,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dddfffdf) VF8(440,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fddfffdf) VF8(441,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdfffdf) VF8(442,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdfffdf) VF8(443,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffffdf) VF8(444,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffffdf) VF8(445,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffffdf) VF8(446,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffffdf) VF8(447,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddddff) VF8(448,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddddff) VF8(449,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddddff) VF8(450,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddddff) VF8(451,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfdddff) VF8(452,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfdddff) VF8(453,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dffdddff) VF8(454,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fffdddff) VF8(455,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dddfddff) VF8(456,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddfddff) VF8(457,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdfddff) VF8(458,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdfddff) VF8(459,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddffddff) VF8(460,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdffddff) VF8(461,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfffddff) VF8(462,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffffddff) VF8(463,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddddfdff) VF8(464,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdddfdff) VF8(465,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfddfdff) VF8(466,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffddfdff) VF8(467,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdfdff) VF8(468,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdfdff) VF8(469,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdfdff) VF8(470,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdfdff) VF8(471,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dddffdff) VF8(472,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fddffdff) VF8(473,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdffdff) VF8(474,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdffdff) VF8(475,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfffdff) VF8(476,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfffdff) VF8(477,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffffdff) VF8(478,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffffdff) VF8(479,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddddfff) VF8(480,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddddfff) VF8(481,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdddfff) VF8(482,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdddfff) VF8(483,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfddfff) VF8(484,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfddfff) VF8(485,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dffddfff) VF8(486,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fffddfff) VF8(487,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfdfff) VF8(488,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfdfff) VF8(489,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfdfff) VF8(490,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfdfff) VF8(491,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddffdfff) VF8(492,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdffdfff) VF8(493,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfffdfff) VF8(494,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffffdfff) VF8(495,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddddffff) VF8(496,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdddffff) VF8(497,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfddffff) VF8(498,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffddffff) VF8(499,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfdffff) VF8(500,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfdffff) VF8(501,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffdffff) VF8(502,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fffdffff) VF8(503,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dddfffff) VF8(504,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fddfffff) VF8(505,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdfffff) VF8(506,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdfffff) VF8(507,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffffff) VF8(508,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffffff) VF8(509,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffffff) VF8(510,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffffff) VF9(511,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddddddd) VF9(512,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddddddd) VF9(513,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfddddddd) VF9(514,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffddddddd) VF9(515,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfdddddd) VF9(516,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfdddddd) VF9(517,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dffdddddd) VF9(518,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fffdddddd) VF9(519,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddfddddd) VF9(520,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddfddddd) VF9(521,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdfddddd) VF9(522,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdfddddd) VF9(523,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddffddddd) VF9(524,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdffddddd) VF9(525,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfffddddd) VF9(526,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffffddddd) VF9(527,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddfdddd) VF9(528,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddfdddd) VF9(529,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfddfdddd) VF9(530,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffddfdddd) VF9(531,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfdfdddd) VF9(532,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfdfdddd) VF9(533,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dffdfdddd) VF9(534,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fffdfdddd) VF9(535,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dddffdddd) VF9(536,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fddffdddd) VF9(537,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdffdddd) VF9(538,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdffdddd) VF9(539,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfffdddd) VF9(540,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfffdddd) VF9(541,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dffffdddd) VF9(542,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fffffdddd) VF9(543,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dddddfddd) VF9(544,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fddddfddd) VF9(545,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdddfddd) VF9(546,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdddfddd) VF9(547,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfddfddd) VF9(548,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfddfddd) VF9(549,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dffddfddd) VF9(550,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fffddfddd) VF9(551,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dddfdfddd) VF9(552,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fddfdfddd) VF9(553,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdfdfddd) VF9(554,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdfdfddd) VF9(555,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddffdfddd) VF9(556,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdffdfddd) VF9(557,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfffdfddd) VF9(558,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffffdfddd) VF9(559,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddddffddd) VF9(560,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdddffddd) VF9(561,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddffddd) VF9(562,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddffddd) VF9(563,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfdffddd) VF9(564,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfdffddd) VF9(565,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffdffddd) VF9(566,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffdffddd) VF9(567,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dddfffddd) VF9(568,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fddfffddd) VF9(569,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdfffddd) VF9(570,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdfffddd) VF9(571,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddffffddd) VF9(572,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdffffddd) VF9(573,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfffffddd) VF9(574,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffffffddd) VF9(575,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddddddfdd) VF9(576,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdddddfdd) VF9(577,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfddddfdd) VF9(578,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffddddfdd) VF9(579,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdddfdd) VF9(580,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdddfdd) VF9(581,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dffdddfdd) VF9(582,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fffdddfdd) VF9(583,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfddfdd) VF9(584,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfddfdd) VF9(585,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfddfdd) VF9(586,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfddfdd) VF9(587,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddffddfdd) VF9(588,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdffddfdd) VF9(589,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfffddfdd) VF9(590,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffffddfdd) VF9(591,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddddfdfdd) VF9(592,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdddfdfdd) VF9(593,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfddfdfdd) VF9(594,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffddfdfdd) VF9(595,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdfdfdd) VF9(596,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdfdfdd) VF9(597,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dffdfdfdd) VF9(598,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fffdfdfdd) VF9(599,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dddffdfdd) VF9(600,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fddffdfdd) VF9(601,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdffdfdd) VF9(602,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdffdfdd) VF9(603,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfffdfdd) VF9(604,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfffdfdd) VF9(605,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dffffdfdd) VF9(606,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fffffdfdd) VF9(607,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dddddffdd) VF9(608,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fddddffdd) VF9(609,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdddffdd) VF9(610,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdddffdd) VF9(611,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfddffdd) VF9(612,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfddffdd) VF9(613,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffddffdd) VF9(614,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fffddffdd) VF9(615,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dddfdffdd) VF9(616,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fddfdffdd) VF9(617,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdfdffdd) VF9(618,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdfdffdd) VF9(619,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffdffdd) VF9(620,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffdffdd) VF9(621,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffdffdd) VF9(622,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffdffdd) VF9(623,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddddfffdd) VF9(624,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdddfffdd) VF9(625,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfddfffdd) VF9(626,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffddfffdd) VF9(627,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfdfffdd) VF9(628,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfdfffdd) VF9(629,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdfffdd) VF9(630,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdfffdd) VF9(631,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dddffffdd) VF9(632,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fddffffdd) VF9(633,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdffffdd) VF9(634,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdffffdd) VF9(635,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfffffdd) VF9(636,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfffffdd) VF9(637,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dffffffdd) VF9(638,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffffffdd) VF9(639,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddddddfd) VF9(640,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fddddddfd) VF9(641,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdddddfd) VF9(642,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdddddfd) VF9(643,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfddddfd) VF9(644,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfddddfd) VF9(645,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dffddddfd) VF9(646,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fffddddfd) VF9(647,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfdddfd) VF9(648,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfdddfd) VF9(649,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdfdddfd) VF9(650,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdfdddfd) VF9(651,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddffdddfd) VF9(652,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdffdddfd) VF9(653,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfffdddfd) VF9(654,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffffdddfd) VF9(655,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddfddfd) VF9(656,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddfddfd) VF9(657,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddfddfd) VF9(658,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddfddfd) VF9(659,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfdfddfd) VF9(660,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfdfddfd) VF9(661,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dffdfddfd) VF9(662,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fffdfddfd) VF9(663,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dddffddfd) VF9(664,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddffddfd) VF9(665,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdffddfd) VF9(666,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdffddfd) VF9(667,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfffddfd) VF9(668,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfffddfd) VF9(669,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dffffddfd) VF9(670,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fffffddfd) VF9(671,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dddddfdfd) VF9(672,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fddddfdfd) VF9(673,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdddfdfd) VF9(674,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdddfdfd) VF9(675,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfddfdfd) VF9(676,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfddfdfd) VF9(677,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dffddfdfd) VF9(678,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fffddfdfd) VF9(679,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dddfdfdfd) VF9(680,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fddfdfdfd) VF9(681,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfdfdfd) VF9(682,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfdfdfd) VF9(683,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddffdfdfd) VF9(684,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdffdfdfd) VF9(685,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfffdfdfd) VF9(686,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffffdfdfd) VF9(687,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddddffdfd) VF9(688,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdddffdfd) VF9(689,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfddffdfd) VF9(690,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffddffdfd) VF9(691,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdffdfd) VF9(692,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdffdfd) VF9(693,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdffdfd) VF9(694,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdffdfd) VF9(695,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dddfffdfd) VF9(696,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fddfffdfd) VF9(697,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfffdfd) VF9(698,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfffdfd) VF9(699,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddffffdfd) VF9(700,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdffffdfd) VF9(701,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfffffdfd) VF9(702,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffffffdfd) VF9(703,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddddddffd) VF9(704,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdddddffd) VF9(705,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfddddffd) VF9(706,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffddddffd) VF9(707,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfdddffd) VF9(708,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfdddffd) VF9(709,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dffdddffd) VF9(710,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fffdddffd) VF9(711,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddfddffd) VF9(712,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddfddffd) VF9(713,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdfddffd) VF9(714,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdfddffd) VF9(715,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffddffd) VF9(716,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffddffd) VF9(717,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfffddffd) VF9(718,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffffddffd) VF9(719,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddddfdffd) VF9(720,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdddfdffd) VF9(721,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfddfdffd) VF9(722,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffddfdffd) VF9(723,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfdfdffd) VF9(724,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfdfdffd) VF9(725,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dffdfdffd) VF9(726,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fffdfdffd) VF9(727,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dddffdffd) VF9(728,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fddffdffd) VF9(729,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdffdffd) VF9(730,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdffdffd) VF9(731,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfffdffd) VF9(732,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfffdffd) VF9(733,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dffffdffd) VF9(734,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fffffdffd) VF9(735,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dddddfffd) VF9(736,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fddddfffd) VF9(737,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdddfffd) VF9(738,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdddfffd) VF9(739,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfddfffd) VF9(740,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfddfffd) VF9(741,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dffddfffd) VF9(742,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fffddfffd) VF9(743,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dddfdfffd) VF9(744,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fddfdfffd) VF9(745,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdfdfffd) VF9(746,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdfdfffd) VF9(747,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddffdfffd) VF9(748,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdffdfffd) VF9(749,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffdfffd) VF9(750,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffdfffd) VF9(751,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddddffffd) VF9(752,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdddffffd) VF9(753,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfddffffd) VF9(754,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffddffffd) VF9(755,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfdffffd) VF9(756,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfdffffd) VF9(757,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffdffffd) VF9(758,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffdffffd) VF9(759,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dddfffffd) VF9(760,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fddfffffd) VF9(761,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdfffffd) VF9(762,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdfffffd) VF9(763,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddffffffd) VF9(764,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdffffffd) VF9(765,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffffffd) VF9(766,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffffffd) VF9(767,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddddddf) VF9(768,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddddddf) VF9(769,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfddddddf) VF9(770,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffddddddf) VF9(771,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfdddddf) VF9(772,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfdddddf) VF9(773,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dffdddddf) VF9(774,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fffdddddf) VF9(775,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddfddddf) VF9(776,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddfddddf) VF9(777,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdfddddf) VF9(778,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdfddddf) VF9(779,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddffddddf) VF9(780,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdffddddf) VF9(781,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfffddddf) VF9(782,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffffddddf) VF9(783,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddfdddf) VF9(784,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddfdddf) VF9(785,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfddfdddf) VF9(786,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffddfdddf) VF9(787,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfdfdddf) VF9(788,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfdfdddf) VF9(789,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dffdfdddf) VF9(790,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fffdfdddf) VF9(791,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dddffdddf) VF9(792,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fddffdddf) VF9(793,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdffdddf) VF9(794,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdffdddf) VF9(795,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfffdddf) VF9(796,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfffdddf) VF9(797,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dffffdddf) VF9(798,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fffffdddf) VF9(799,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dddddfddf) VF9(800,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fddddfddf) VF9(801,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdddfddf) VF9(802,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdddfddf) VF9(803,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfddfddf) VF9(804,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfddfddf) VF9(805,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dffddfddf) VF9(806,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fffddfddf) VF9(807,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dddfdfddf) VF9(808,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fddfdfddf) VF9(809,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdfdfddf) VF9(810,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdfdfddf) VF9(811,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddffdfddf) VF9(812,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdffdfddf) VF9(813,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfffdfddf) VF9(814,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffffdfddf) VF9(815,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddddffddf) VF9(816,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdddffddf) VF9(817,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddffddf) VF9(818,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddffddf) VF9(819,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfdffddf) VF9(820,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfdffddf) VF9(821,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffdffddf) VF9(822,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffdffddf) VF9(823,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dddfffddf) VF9(824,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fddfffddf) VF9(825,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdfffddf) VF9(826,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdfffddf) VF9(827,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddffffddf) VF9(828,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdffffddf) VF9(829,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfffffddf) VF9(830,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffffffddf) VF9(831,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddddddfdf) VF9(832,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdddddfdf) VF9(833,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfddddfdf) VF9(834,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffddddfdf) VF9(835,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdddfdf) VF9(836,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdddfdf) VF9(837,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dffdddfdf) VF9(838,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fffdddfdf) VF9(839,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfddfdf) VF9(840,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfddfdf) VF9(841,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfddfdf) VF9(842,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfddfdf) VF9(843,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddffddfdf) VF9(844,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdffddfdf) VF9(845,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfffddfdf) VF9(846,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffffddfdf) VF9(847,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddddfdfdf) VF9(848,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdddfdfdf) VF9(849,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfddfdfdf) VF9(850,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffddfdfdf) VF9(851,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdfdfdf) VF9(852,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdfdfdf) VF9(853,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dffdfdfdf) VF9(854,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fffdfdfdf) VF9(855,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dddffdfdf) VF9(856,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fddffdfdf) VF9(857,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdffdfdf) VF9(858,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdffdfdf) VF9(859,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfffdfdf) VF9(860,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfffdfdf) VF9(861,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dffffdfdf) VF9(862,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fffffdfdf) VF9(863,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dddddffdf) VF9(864,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fddddffdf) VF9(865,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdddffdf) VF9(866,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdddffdf) VF9(867,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfddffdf) VF9(868,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfddffdf) VF9(869,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffddffdf) VF9(870,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fffddffdf) VF9(871,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dddfdffdf) VF9(872,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fddfdffdf) VF9(873,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdfdffdf) VF9(874,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdfdffdf) VF9(875,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffdffdf) VF9(876,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffdffdf) VF9(877,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffdffdf) VF9(878,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffdffdf) VF9(879,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddddfffdf) VF9(880,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdddfffdf) VF9(881,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfddfffdf) VF9(882,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffddfffdf) VF9(883,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfdfffdf) VF9(884,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfdfffdf) VF9(885,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdfffdf) VF9(886,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdfffdf) VF9(887,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dddffffdf) VF9(888,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fddffffdf) VF9(889,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdffffdf) VF9(890,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdffffdf) VF9(891,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfffffdf) VF9(892,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfffffdf) VF9(893,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dffffffdf) VF9(894,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffffffdf) VF9(895,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddddddff) VF9(896,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fddddddff) VF9(897,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdddddff) VF9(898,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdddddff) VF9(899,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfddddff) VF9(900,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfddddff) VF9(901,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dffddddff) VF9(902,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fffddddff) VF9(903,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddfdddff) VF9(904,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fddfdddff) VF9(905,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdfdddff) VF9(906,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdfdddff) VF9(907,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddffdddff) VF9(908,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdffdddff) VF9(909,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfffdddff) VF9(910,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffffdddff) VF9(911,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddfddff) VF9(912,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddfddff) VF9(913,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddfddff) VF9(914,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddfddff) VF9(915,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfdfddff) VF9(916,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfdfddff) VF9(917,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dffdfddff) VF9(918,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fffdfddff) VF9(919,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dddffddff) VF9(920,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddffddff) VF9(921,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdffddff) VF9(922,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdffddff) VF9(923,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfffddff) VF9(924,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfffddff) VF9(925,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dffffddff) VF9(926,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fffffddff) VF9(927,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dddddfdff) VF9(928,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fddddfdff) VF9(929,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdddfdff) VF9(930,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdddfdff) VF9(931,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfddfdff) VF9(932,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfddfdff) VF9(933,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dffddfdff) VF9(934,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fffddfdff) VF9(935,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dddfdfdff) VF9(936,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fddfdfdff) VF9(937,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdfdfdff) VF9(938,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdfdfdff) VF9(939,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddffdfdff) VF9(940,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdffdfdff) VF9(941,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfffdfdff) VF9(942,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffffdfdff) VF9(943,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddddffdff) VF9(944,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdddffdff) VF9(945,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfddffdff) VF9(946,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffddffdff) VF9(947,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdffdff) VF9(948,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdffdff) VF9(949,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdffdff) VF9(950,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdffdff) VF9(951,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dddfffdff) VF9(952,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fddfffdff) VF9(953,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdfffdff) VF9(954,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdfffdff) VF9(955,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddffffdff) VF9(956,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdffffdff) VF9(957,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfffffdff) VF9(958,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffffffdff) VF9(959,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddddddfff) VF9(960,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdddddfff) VF9(961,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfddddfff) VF9(962,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffddddfff) VF9(963,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfdddfff) VF9(964,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfdddfff) VF9(965,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dffdddfff) VF9(966,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fffdddfff) VF9(967,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfddfff) VF9(968,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfddfff) VF9(969,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfddfff) VF9(970,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfddfff) VF9(971,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddffddfff) VF9(972,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdffddfff) VF9(973,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfffddfff) VF9(974,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffffddfff) VF9(975,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddddfdfff) VF9(976,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdddfdfff) VF9(977,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfddfdfff) VF9(978,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffddfdfff) VF9(979,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfdfdfff) VF9(980,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfdfdfff) VF9(981,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dffdfdfff) VF9(982,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fffdfdfff) VF9(983,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dddffdfff) VF9(984,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fddffdfff) VF9(985,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdffdfff) VF9(986,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdffdfff) VF9(987,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfffdfff) VF9(988,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfffdfff) VF9(989,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dffffdfff) VF9(990,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fffffdfff) VF9(991,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dddddffff) VF9(992,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fddddffff) VF9(993,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdddffff) VF9(994,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdddffff) VF9(995,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfddffff) VF9(996,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfddffff) VF9(997,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffddffff) VF9(998,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fffddffff) VF9(999,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dddfdffff) VF9(1000,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fddfdffff) VF9(1001,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdfdffff) VF9(1002,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdfdffff) VF9(1003,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffdffff) VF9(1004,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffdffff) VF9(1005,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffdffff) VF9(1006,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffdffff) VF9(1007,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddddfffff) VF9(1008,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdddfffff) VF9(1009,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfddfffff) VF9(1010,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffddfffff) VF9(1011,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfdfffff) VF9(1012,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfdfffff) VF9(1013,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dffdfffff) VF9(1014,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffdfffff) VF9(1015,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dddffffff) VF9(1016,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fddffffff) VF9(1017,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdffffff) VF9(1018,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdffffff) VF9(1019,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfffffff) VF9(1020,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfffffff) VF9(1021,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dffffffff) VF9(1022,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffffffff) VF10(1023,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddddddd) VF10(1024,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddddddddd) VF10(1025,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdddddddd) VF10(1026,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdddddddd) VF10(1027,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfddddddd) VF10(1028,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfddddddd) VF10(1029,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dffddddddd) VF10(1030,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fffddddddd) VF10(1031,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddfdddddd) VF10(1032,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddfdddddd) VF10(1033,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdfdddddd) VF10(1034,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdfdddddd) VF10(1035,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddffdddddd) VF10(1036,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdffdddddd) VF10(1037,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfffdddddd) VF10(1038,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffffdddddd) VF10(1039,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddfddddd) VF10(1040,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddfddddd) VF10(1041,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfddfddddd) VF10(1042,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffddfddddd) VF10(1043,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfdfddddd) VF10(1044,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfdfddddd) VF10(1045,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dffdfddddd) VF10(1046,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fffdfddddd) VF10(1047,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dddffddddd) VF10(1048,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fddffddddd) VF10(1049,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdffddddd) VF10(1050,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdffddddd) VF10(1051,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfffddddd) VF10(1052,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfffddddd) VF10(1053,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_dffffddddd) VF10(1054,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,f_fffffddddd) VF10(1055,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dddddfdddd) VF10(1056,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fddddfdddd) VF10(1057,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdddfdddd) VF10(1058,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdddfdddd) VF10(1059,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfddfdddd) VF10(1060,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfddfdddd) VF10(1061,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dffddfdddd) VF10(1062,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fffddfdddd) VF10(1063,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dddfdfdddd) VF10(1064,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fddfdfdddd) VF10(1065,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdfdfdddd) VF10(1066,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdfdfdddd) VF10(1067,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddffdfdddd) VF10(1068,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdffdfdddd) VF10(1069,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfffdfdddd) VF10(1070,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffffdfdddd) VF10(1071,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddddffdddd) VF10(1072,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdddffdddd) VF10(1073,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfddffdddd) VF10(1074,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffddffdddd) VF10(1075,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddfdffdddd) VF10(1076,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdfdffdddd) VF10(1077,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dffdffdddd) VF10(1078,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fffdffdddd) VF10(1079,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dddfffdddd) VF10(1080,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fddfffdddd) VF10(1081,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfdfffdddd) VF10(1082,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffdfffdddd) VF10(1083,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ddffffdddd) VF10(1084,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_fdffffdddd) VF10(1085,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_dfffffdddd) VF10(1086,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,f_ffffffdddd) VF10(1087,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddddddfddd) VF10(1088,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdddddfddd) VF10(1089,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddddfddd) VF10(1090,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddddfddd) VF10(1091,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfdddfddd) VF10(1092,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfdddfddd) VF10(1093,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dffdddfddd) VF10(1094,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fffdddfddd) VF10(1095,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dddfddfddd) VF10(1096,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fddfddfddd) VF10(1097,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdfddfddd) VF10(1098,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdfddfddd) VF10(1099,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddffddfddd) VF10(1100,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdffddfddd) VF10(1101,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfffddfddd) VF10(1102,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffffddfddd) VF10(1103,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddddfdfddd) VF10(1104,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdddfdfddd) VF10(1105,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddfdfddd) VF10(1106,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddfdfddd) VF10(1107,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfdfdfddd) VF10(1108,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfdfdfddd) VF10(1109,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dffdfdfddd) VF10(1110,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fffdfdfddd) VF10(1111,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dddffdfddd) VF10(1112,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fddffdfddd) VF10(1113,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdffdfddd) VF10(1114,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdffdfddd) VF10(1115,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfffdfddd) VF10(1116,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfffdfddd) VF10(1117,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_dffffdfddd) VF10(1118,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,f_fffffdfddd) VF10(1119,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dddddffddd) VF10(1120,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fddddffddd) VF10(1121,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdddffddd) VF10(1122,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdddffddd) VF10(1123,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfddffddd) VF10(1124,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfddffddd) VF10(1125,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffddffddd) VF10(1126,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffddffddd) VF10(1127,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dddfdffddd) VF10(1128,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fddfdffddd) VF10(1129,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdfdffddd) VF10(1130,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdfdffddd) VF10(1131,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddffdffddd) VF10(1132,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdffdffddd) VF10(1133,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfffdffddd) VF10(1134,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffffdffddd) VF10(1135,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddddfffddd) VF10(1136,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdddfffddd) VF10(1137,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfddfffddd) VF10(1138,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffddfffddd) VF10(1139,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfdfffddd) VF10(1140,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfdfffddd) VF10(1141,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffdfffddd) VF10(1142,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffdfffddd) VF10(1143,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dddffffddd) VF10(1144,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fddffffddd) VF10(1145,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dfdffffddd) VF10(1146,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ffdffffddd) VF10(1147,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_ddfffffddd) VF10(1148,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fdfffffddd) VF10(1149,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_dffffffddd) VF10(1150,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,f_fffffffddd) VF10(1151,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddddddfdd) VF10(1152,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddddddfdd) VF10(1153,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdddddfdd) VF10(1154,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdddddfdd) VF10(1155,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfddddfdd) VF10(1156,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfddddfdd) VF10(1157,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dffddddfdd) VF10(1158,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fffddddfdd) VF10(1159,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfdddfdd) VF10(1160,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfdddfdd) VF10(1161,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfdddfdd) VF10(1162,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfdddfdd) VF10(1163,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddffdddfdd) VF10(1164,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdffdddfdd) VF10(1165,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfffdddfdd) VF10(1166,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffffdddfdd) VF10(1167,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddddfddfdd) VF10(1168,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdddfddfdd) VF10(1169,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfddfddfdd) VF10(1170,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffddfddfdd) VF10(1171,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdfddfdd) VF10(1172,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdfddfdd) VF10(1173,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dffdfddfdd) VF10(1174,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fffdfddfdd) VF10(1175,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dddffddfdd) VF10(1176,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fddffddfdd) VF10(1177,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdffddfdd) VF10(1178,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdffddfdd) VF10(1179,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfffddfdd) VF10(1180,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfffddfdd) VF10(1181,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_dffffddfdd) VF10(1182,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,f_fffffddfdd) VF10(1183,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dddddfdfdd) VF10(1184,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fddddfdfdd) VF10(1185,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdddfdfdd) VF10(1186,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdddfdfdd) VF10(1187,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfddfdfdd) VF10(1188,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfddfdfdd) VF10(1189,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dffddfdfdd) VF10(1190,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fffddfdfdd) VF10(1191,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfdfdfdd) VF10(1192,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfdfdfdd) VF10(1193,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfdfdfdd) VF10(1194,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfdfdfdd) VF10(1195,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddffdfdfdd) VF10(1196,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdffdfdfdd) VF10(1197,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfffdfdfdd) VF10(1198,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffffdfdfdd) VF10(1199,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddddffdfdd) VF10(1200,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdddffdfdd) VF10(1201,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfddffdfdd) VF10(1202,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffddffdfdd) VF10(1203,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddfdffdfdd) VF10(1204,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdfdffdfdd) VF10(1205,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dffdffdfdd) VF10(1206,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fffdffdfdd) VF10(1207,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dddfffdfdd) VF10(1208,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fddfffdfdd) VF10(1209,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfdfffdfdd) VF10(1210,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffdfffdfdd) VF10(1211,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ddffffdfdd) VF10(1212,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_fdffffdfdd) VF10(1213,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_dfffffdfdd) VF10(1214,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,f_ffffffdfdd) VF10(1215,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddddddffdd) VF10(1216,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdddddffdd) VF10(1217,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfddddffdd) VF10(1218,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffddddffdd) VF10(1219,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfdddffdd) VF10(1220,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfdddffdd) VF10(1221,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdddffdd) VF10(1222,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdddffdd) VF10(1223,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dddfddffdd) VF10(1224,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fddfddffdd) VF10(1225,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdfddffdd) VF10(1226,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdfddffdd) VF10(1227,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffddffdd) VF10(1228,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffddffdd) VF10(1229,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffddffdd) VF10(1230,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffddffdd) VF10(1231,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddddfdffdd) VF10(1232,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdddfdffdd) VF10(1233,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfddfdffdd) VF10(1234,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffddfdffdd) VF10(1235,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfdfdffdd) VF10(1236,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfdfdffdd) VF10(1237,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdfdffdd) VF10(1238,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdfdffdd) VF10(1239,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dddffdffdd) VF10(1240,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fddffdffdd) VF10(1241,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdffdffdd) VF10(1242,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdffdffdd) VF10(1243,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfffdffdd) VF10(1244,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfffdffdd) VF10(1245,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_dffffdffdd) VF10(1246,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,f_fffffdffdd) VF10(1247,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dddddfffdd) VF10(1248,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fddddfffdd) VF10(1249,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdddfffdd) VF10(1250,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdddfffdd) VF10(1251,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfddfffdd) VF10(1252,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfddfffdd) VF10(1253,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dffddfffdd) VF10(1254,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffddfffdd) VF10(1255,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dddfdfffdd) VF10(1256,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fddfdfffdd) VF10(1257,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdfdfffdd) VF10(1258,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdfdfffdd) VF10(1259,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffdfffdd) VF10(1260,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffdfffdd) VF10(1261,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffdfffdd) VF10(1262,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffdfffdd) VF10(1263,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddddffffdd) VF10(1264,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdddffffdd) VF10(1265,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfddffffdd) VF10(1266,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffddffffdd) VF10(1267,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddfdffffdd) VF10(1268,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdfdffffdd) VF10(1269,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dffdffffdd) VF10(1270,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fffdffffdd) VF10(1271,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dddfffffdd) VF10(1272,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fddfffffdd) VF10(1273,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfdfffffdd) VF10(1274,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffdfffffdd) VF10(1275,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ddffffffdd) VF10(1276,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_fdffffffdd) VF10(1277,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_dfffffffdd) VF10(1278,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,f_ffffffffdd) VF10(1279,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddddddfd) VF10(1280,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddddddfd) VF10(1281,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddddddfd) VF10(1282,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddddddfd) VF10(1283,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfdddddfd) VF10(1284,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfdddddfd) VF10(1285,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dffdddddfd) VF10(1286,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fffdddddfd) VF10(1287,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfddddfd) VF10(1288,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfddddfd) VF10(1289,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdfddddfd) VF10(1290,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdfddddfd) VF10(1291,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddffddddfd) VF10(1292,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdffddddfd) VF10(1293,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfffddddfd) VF10(1294,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffffddddfd) VF10(1295,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddfdddfd) VF10(1296,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddfdddfd) VF10(1297,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddfdddfd) VF10(1298,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddfdddfd) VF10(1299,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfdfdddfd) VF10(1300,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfdfdddfd) VF10(1301,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dffdfdddfd) VF10(1302,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fffdfdddfd) VF10(1303,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dddffdddfd) VF10(1304,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fddffdddfd) VF10(1305,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdffdddfd) VF10(1306,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdffdddfd) VF10(1307,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfffdddfd) VF10(1308,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfffdddfd) VF10(1309,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_dffffdddfd) VF10(1310,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,f_fffffdddfd) VF10(1311,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dddddfddfd) VF10(1312,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddddfddfd) VF10(1313,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdddfddfd) VF10(1314,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdddfddfd) VF10(1315,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfddfddfd) VF10(1316,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfddfddfd) VF10(1317,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dffddfddfd) VF10(1318,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fffddfddfd) VF10(1319,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfdfddfd) VF10(1320,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfdfddfd) VF10(1321,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdfdfddfd) VF10(1322,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdfdfddfd) VF10(1323,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddffdfddfd) VF10(1324,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdffdfddfd) VF10(1325,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfffdfddfd) VF10(1326,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffffdfddfd) VF10(1327,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddddffddfd) VF10(1328,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdddffddfd) VF10(1329,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfddffddfd) VF10(1330,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffddffddfd) VF10(1331,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddfdffddfd) VF10(1332,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdfdffddfd) VF10(1333,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dffdffddfd) VF10(1334,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fffdffddfd) VF10(1335,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dddfffddfd) VF10(1336,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fddfffddfd) VF10(1337,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfdfffddfd) VF10(1338,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffdfffddfd) VF10(1339,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ddffffddfd) VF10(1340,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_fdffffddfd) VF10(1341,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_dfffffddfd) VF10(1342,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,f_ffffffddfd) VF10(1343,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddddddfdfd) VF10(1344,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdddddfdfd) VF10(1345,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfddddfdfd) VF10(1346,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffddddfdfd) VF10(1347,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdddfdfd) VF10(1348,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdddfdfd) VF10(1349,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdddfdfd) VF10(1350,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdddfdfd) VF10(1351,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dddfddfdfd) VF10(1352,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fddfddfdfd) VF10(1353,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfddfdfd) VF10(1354,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfddfdfd) VF10(1355,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddffddfdfd) VF10(1356,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdffddfdfd) VF10(1357,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfffddfdfd) VF10(1358,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffffddfdfd) VF10(1359,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddddfdfdfd) VF10(1360,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdddfdfdfd) VF10(1361,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfddfdfdfd) VF10(1362,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffddfdfdfd) VF10(1363,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdfdfdfd) VF10(1364,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdfdfdfd) VF10(1365,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdfdfdfd) VF10(1366,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdfdfdfd) VF10(1367,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dddffdfdfd) VF10(1368,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fddffdfdfd) VF10(1369,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdffdfdfd) VF10(1370,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdffdfdfd) VF10(1371,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfffdfdfd) VF10(1372,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfffdfdfd) VF10(1373,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_dffffdfdfd) VF10(1374,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,f_fffffdfdfd) VF10(1375,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dddddffdfd) VF10(1376,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fddddffdfd) VF10(1377,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdddffdfd) VF10(1378,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdddffdfd) VF10(1379,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfddffdfd) VF10(1380,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfddffdfd) VF10(1381,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffddffdfd) VF10(1382,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffddffdfd) VF10(1383,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dddfdffdfd) VF10(1384,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fddfdffdfd) VF10(1385,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdfdffdfd) VF10(1386,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdfdffdfd) VF10(1387,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddffdffdfd) VF10(1388,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdffdffdfd) VF10(1389,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfffdffdfd) VF10(1390,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffffdffdfd) VF10(1391,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddddfffdfd) VF10(1392,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdddfffdfd) VF10(1393,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfddfffdfd) VF10(1394,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffddfffdfd) VF10(1395,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfdfffdfd) VF10(1396,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfdfffdfd) VF10(1397,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffdfffdfd) VF10(1398,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffdfffdfd) VF10(1399,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dddffffdfd) VF10(1400,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fddffffdfd) VF10(1401,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dfdffffdfd) VF10(1402,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ffdffffdfd) VF10(1403,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_ddfffffdfd) VF10(1404,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fdfffffdfd) VF10(1405,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_dffffffdfd) VF10(1406,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,f_fffffffdfd) VF10(1407,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddddddffd) VF10(1408,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddddddffd) VF10(1409,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdddddffd) VF10(1410,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdddddffd) VF10(1411,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfddddffd) VF10(1412,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfddddffd) VF10(1413,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dffddddffd) VF10(1414,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fffddddffd) VF10(1415,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddfdddffd) VF10(1416,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddfdddffd) VF10(1417,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdfdddffd) VF10(1418,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdfdddffd) VF10(1419,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffdddffd) VF10(1420,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffdddffd) VF10(1421,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfffdddffd) VF10(1422,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffffdddffd) VF10(1423,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddddfddffd) VF10(1424,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdddfddffd) VF10(1425,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfddfddffd) VF10(1426,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffddfddffd) VF10(1427,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfdfddffd) VF10(1428,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfdfddffd) VF10(1429,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dffdfddffd) VF10(1430,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fffdfddffd) VF10(1431,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dddffddffd) VF10(1432,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fddffddffd) VF10(1433,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdffddffd) VF10(1434,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdffddffd) VF10(1435,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfffddffd) VF10(1436,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfffddffd) VF10(1437,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_dffffddffd) VF10(1438,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,f_fffffddffd) VF10(1439,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dddddfdffd) VF10(1440,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fddddfdffd) VF10(1441,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdddfdffd) VF10(1442,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdddfdffd) VF10(1443,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfddfdffd) VF10(1444,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfddfdffd) VF10(1445,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dffddfdffd) VF10(1446,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fffddfdffd) VF10(1447,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dddfdfdffd) VF10(1448,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fddfdfdffd) VF10(1449,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdfdfdffd) VF10(1450,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdfdfdffd) VF10(1451,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffdfdffd) VF10(1452,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffdfdffd) VF10(1453,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfffdfdffd) VF10(1454,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffffdfdffd) VF10(1455,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddddffdffd) VF10(1456,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdddffdffd) VF10(1457,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfddffdffd) VF10(1458,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffddffdffd) VF10(1459,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddfdffdffd) VF10(1460,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdfdffdffd) VF10(1461,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dffdffdffd) VF10(1462,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fffdffdffd) VF10(1463,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dddfffdffd) VF10(1464,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fddfffdffd) VF10(1465,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfdfffdffd) VF10(1466,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffdfffdffd) VF10(1467,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ddffffdffd) VF10(1468,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_fdffffdffd) VF10(1469,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_dfffffdffd) VF10(1470,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,f_ffffffdffd) VF10(1471,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddddddfffd) VF10(1472,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdddddfffd) VF10(1473,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfddddfffd) VF10(1474,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffddddfffd) VF10(1475,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfdddfffd) VF10(1476,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfdddfffd) VF10(1477,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dffdddfffd) VF10(1478,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fffdddfffd) VF10(1479,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dddfddfffd) VF10(1480,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fddfddfffd) VF10(1481,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdfddfffd) VF10(1482,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdfddfffd) VF10(1483,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddffddfffd) VF10(1484,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdffddfffd) VF10(1485,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffddfffd) VF10(1486,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffddfffd) VF10(1487,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddddfdfffd) VF10(1488,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdddfdfffd) VF10(1489,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfddfdfffd) VF10(1490,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffddfdfffd) VF10(1491,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfdfdfffd) VF10(1492,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfdfdfffd) VF10(1493,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dffdfdfffd) VF10(1494,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fffdfdfffd) VF10(1495,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dddffdfffd) VF10(1496,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fddffdfffd) VF10(1497,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdffdfffd) VF10(1498,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdffdfffd) VF10(1499,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfffdfffd) VF10(1500,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfffdfffd) VF10(1501,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_dffffdfffd) VF10(1502,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,f_fffffdfffd) VF10(1503,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dddddffffd) VF10(1504,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fddddffffd) VF10(1505,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdddffffd) VF10(1506,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdddffffd) VF10(1507,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfddffffd) VF10(1508,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfddffffd) VF10(1509,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffddffffd) VF10(1510,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffddffffd) VF10(1511,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dddfdffffd) VF10(1512,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fddfdffffd) VF10(1513,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdfdffffd) VF10(1514,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdfdffffd) VF10(1515,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddffdffffd) VF10(1516,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdffdffffd) VF10(1517,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfffdffffd) VF10(1518,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffffdffffd) VF10(1519,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddddfffffd) VF10(1520,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdddfffffd) VF10(1521,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfddfffffd) VF10(1522,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffddfffffd) VF10(1523,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfdfffffd) VF10(1524,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfdfffffd) VF10(1525,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffdfffffd) VF10(1526,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffdfffffd) VF10(1527,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dddffffffd) VF10(1528,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fddffffffd) VF10(1529,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dfdffffffd) VF10(1530,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ffdffffffd) VF10(1531,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_ddfffffffd) VF10(1532,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fdfffffffd) VF10(1533,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_dffffffffd) VF10(1534,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,f_fffffffffd) VF10(1535,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddddddddf) VF10(1536,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddddddddf) VF10(1537,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdddddddf) VF10(1538,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdddddddf) VF10(1539,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfddddddf) VF10(1540,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfddddddf) VF10(1541,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dffddddddf) VF10(1542,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fffddddddf) VF10(1543,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddfdddddf) VF10(1544,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddfdddddf) VF10(1545,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdfdddddf) VF10(1546,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdfdddddf) VF10(1547,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddffdddddf) VF10(1548,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdffdddddf) VF10(1549,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfffdddddf) VF10(1550,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffffdddddf) VF10(1551,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddfddddf) VF10(1552,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddfddddf) VF10(1553,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfddfddddf) VF10(1554,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffddfddddf) VF10(1555,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfdfddddf) VF10(1556,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfdfddddf) VF10(1557,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dffdfddddf) VF10(1558,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fffdfddddf) VF10(1559,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dddffddddf) VF10(1560,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fddffddddf) VF10(1561,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdffddddf) VF10(1562,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdffddddf) VF10(1563,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfffddddf) VF10(1564,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfffddddf) VF10(1565,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_dffffddddf) VF10(1566,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,f_fffffddddf) VF10(1567,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dddddfdddf) VF10(1568,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fddddfdddf) VF10(1569,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdddfdddf) VF10(1570,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdddfdddf) VF10(1571,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfddfdddf) VF10(1572,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfddfdddf) VF10(1573,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dffddfdddf) VF10(1574,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fffddfdddf) VF10(1575,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dddfdfdddf) VF10(1576,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fddfdfdddf) VF10(1577,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdfdfdddf) VF10(1578,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdfdfdddf) VF10(1579,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddffdfdddf) VF10(1580,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdffdfdddf) VF10(1581,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfffdfdddf) VF10(1582,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffffdfdddf) VF10(1583,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddddffdddf) VF10(1584,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdddffdddf) VF10(1585,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfddffdddf) VF10(1586,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffddffdddf) VF10(1587,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddfdffdddf) VF10(1588,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdfdffdddf) VF10(1589,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dffdffdddf) VF10(1590,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fffdffdddf) VF10(1591,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dddfffdddf) VF10(1592,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fddfffdddf) VF10(1593,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfdfffdddf) VF10(1594,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffdfffdddf) VF10(1595,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ddffffdddf) VF10(1596,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_fdffffdddf) VF10(1597,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_dfffffdddf) VF10(1598,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,f_ffffffdddf) VF10(1599,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddddddfddf) VF10(1600,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdddddfddf) VF10(1601,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddddfddf) VF10(1602,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddddfddf) VF10(1603,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfdddfddf) VF10(1604,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfdddfddf) VF10(1605,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dffdddfddf) VF10(1606,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fffdddfddf) VF10(1607,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dddfddfddf) VF10(1608,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fddfddfddf) VF10(1609,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdfddfddf) VF10(1610,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdfddfddf) VF10(1611,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddffddfddf) VF10(1612,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdffddfddf) VF10(1613,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfffddfddf) VF10(1614,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffffddfddf) VF10(1615,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddddfdfddf) VF10(1616,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdddfdfddf) VF10(1617,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddfdfddf) VF10(1618,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddfdfddf) VF10(1619,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfdfdfddf) VF10(1620,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfdfdfddf) VF10(1621,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dffdfdfddf) VF10(1622,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fffdfdfddf) VF10(1623,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dddffdfddf) VF10(1624,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fddffdfddf) VF10(1625,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdffdfddf) VF10(1626,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdffdfddf) VF10(1627,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfffdfddf) VF10(1628,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfffdfddf) VF10(1629,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_dffffdfddf) VF10(1630,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,f_fffffdfddf) VF10(1631,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dddddffddf) VF10(1632,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fddddffddf) VF10(1633,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdddffddf) VF10(1634,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdddffddf) VF10(1635,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfddffddf) VF10(1636,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfddffddf) VF10(1637,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffddffddf) VF10(1638,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffddffddf) VF10(1639,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dddfdffddf) VF10(1640,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fddfdffddf) VF10(1641,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdfdffddf) VF10(1642,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdfdffddf) VF10(1643,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddffdffddf) VF10(1644,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdffdffddf) VF10(1645,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfffdffddf) VF10(1646,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffffdffddf) VF10(1647,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddddfffddf) VF10(1648,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdddfffddf) VF10(1649,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfddfffddf) VF10(1650,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffddfffddf) VF10(1651,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfdfffddf) VF10(1652,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfdfffddf) VF10(1653,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffdfffddf) VF10(1654,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffdfffddf) VF10(1655,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dddffffddf) VF10(1656,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fddffffddf) VF10(1657,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dfdffffddf) VF10(1658,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ffdffffddf) VF10(1659,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_ddfffffddf) VF10(1660,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fdfffffddf) VF10(1661,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_dffffffddf) VF10(1662,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,f_fffffffddf) VF10(1663,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddddddfdf) VF10(1664,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddddddfdf) VF10(1665,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdddddfdf) VF10(1666,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdddddfdf) VF10(1667,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfddddfdf) VF10(1668,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfddddfdf) VF10(1669,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dffddddfdf) VF10(1670,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fffddddfdf) VF10(1671,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfdddfdf) VF10(1672,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfdddfdf) VF10(1673,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfdddfdf) VF10(1674,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfdddfdf) VF10(1675,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddffdddfdf) VF10(1676,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdffdddfdf) VF10(1677,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfffdddfdf) VF10(1678,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffffdddfdf) VF10(1679,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddddfddfdf) VF10(1680,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdddfddfdf) VF10(1681,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfddfddfdf) VF10(1682,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffddfddfdf) VF10(1683,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdfddfdf) VF10(1684,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdfddfdf) VF10(1685,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dffdfddfdf) VF10(1686,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fffdfddfdf) VF10(1687,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dddffddfdf) VF10(1688,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fddffddfdf) VF10(1689,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdffddfdf) VF10(1690,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdffddfdf) VF10(1691,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfffddfdf) VF10(1692,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfffddfdf) VF10(1693,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_dffffddfdf) VF10(1694,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,f_fffffddfdf) VF10(1695,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dddddfdfdf) VF10(1696,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fddddfdfdf) VF10(1697,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdddfdfdf) VF10(1698,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdddfdfdf) VF10(1699,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfddfdfdf) VF10(1700,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfddfdfdf) VF10(1701,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dffddfdfdf) VF10(1702,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fffddfdfdf) VF10(1703,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfdfdfdf) VF10(1704,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfdfdfdf) VF10(1705,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfdfdfdf) VF10(1706,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfdfdfdf) VF10(1707,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddffdfdfdf) VF10(1708,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdffdfdfdf) VF10(1709,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfffdfdfdf) VF10(1710,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffffdfdfdf) VF10(1711,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddddffdfdf) VF10(1712,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdddffdfdf) VF10(1713,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfddffdfdf) VF10(1714,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffddffdfdf) VF10(1715,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddfdffdfdf) VF10(1716,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdfdffdfdf) VF10(1717,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dffdffdfdf) VF10(1718,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fffdffdfdf) VF10(1719,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dddfffdfdf) VF10(1720,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fddfffdfdf) VF10(1721,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfdfffdfdf) VF10(1722,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffdfffdfdf) VF10(1723,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ddffffdfdf) VF10(1724,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_fdffffdfdf) VF10(1725,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_dfffffdfdf) VF10(1726,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,f_ffffffdfdf) VF10(1727,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddddddffdf) VF10(1728,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdddddffdf) VF10(1729,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfddddffdf) VF10(1730,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffddddffdf) VF10(1731,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfdddffdf) VF10(1732,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfdddffdf) VF10(1733,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdddffdf) VF10(1734,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdddffdf) VF10(1735,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dddfddffdf) VF10(1736,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fddfddffdf) VF10(1737,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdfddffdf) VF10(1738,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdfddffdf) VF10(1739,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffddffdf) VF10(1740,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffddffdf) VF10(1741,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffddffdf) VF10(1742,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffddffdf) VF10(1743,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddddfdffdf) VF10(1744,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdddfdffdf) VF10(1745,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfddfdffdf) VF10(1746,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffddfdffdf) VF10(1747,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfdfdffdf) VF10(1748,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfdfdffdf) VF10(1749,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdfdffdf) VF10(1750,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdfdffdf) VF10(1751,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dddffdffdf) VF10(1752,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fddffdffdf) VF10(1753,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdffdffdf) VF10(1754,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdffdffdf) VF10(1755,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfffdffdf) VF10(1756,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfffdffdf) VF10(1757,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_dffffdffdf) VF10(1758,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,f_fffffdffdf) VF10(1759,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dddddfffdf) VF10(1760,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fddddfffdf) VF10(1761,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdddfffdf) VF10(1762,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdddfffdf) VF10(1763,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfddfffdf) VF10(1764,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfddfffdf) VF10(1765,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dffddfffdf) VF10(1766,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffddfffdf) VF10(1767,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dddfdfffdf) VF10(1768,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fddfdfffdf) VF10(1769,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdfdfffdf) VF10(1770,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdfdfffdf) VF10(1771,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffdfffdf) VF10(1772,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffdfffdf) VF10(1773,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffdfffdf) VF10(1774,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffdfffdf) VF10(1775,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddddffffdf) VF10(1776,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdddffffdf) VF10(1777,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfddffffdf) VF10(1778,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffddffffdf) VF10(1779,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddfdffffdf) VF10(1780,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdfdffffdf) VF10(1781,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dffdffffdf) VF10(1782,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fffdffffdf) VF10(1783,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dddfffffdf) VF10(1784,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fddfffffdf) VF10(1785,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfdfffffdf) VF10(1786,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffdfffffdf) VF10(1787,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ddffffffdf) VF10(1788,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_fdffffffdf) VF10(1789,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_dfffffffdf) VF10(1790,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,f_ffffffffdf) VF10(1791,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddddddff) VF10(1792,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddddddff) VF10(1793,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddddddff) VF10(1794,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddddddff) VF10(1795,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfdddddff) VF10(1796,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfdddddff) VF10(1797,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dffdddddff) VF10(1798,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fffdddddff) VF10(1799,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddfddddff) VF10(1800,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fddfddddff) VF10(1801,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdfddddff) VF10(1802,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdfddddff) VF10(1803,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddffddddff) VF10(1804,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdffddddff) VF10(1805,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfffddddff) VF10(1806,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffffddddff) VF10(1807,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddfdddff) VF10(1808,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddfdddff) VF10(1809,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddfdddff) VF10(1810,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddfdddff) VF10(1811,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfdfdddff) VF10(1812,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfdfdddff) VF10(1813,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dffdfdddff) VF10(1814,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fffdfdddff) VF10(1815,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dddffdddff) VF10(1816,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fddffdddff) VF10(1817,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdffdddff) VF10(1818,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdffdddff) VF10(1819,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfffdddff) VF10(1820,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfffdddff) VF10(1821,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_dffffdddff) VF10(1822,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,f_fffffdddff) VF10(1823,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dddddfddff) VF10(1824,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddddfddff) VF10(1825,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdddfddff) VF10(1826,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdddfddff) VF10(1827,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfddfddff) VF10(1828,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfddfddff) VF10(1829,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dffddfddff) VF10(1830,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fffddfddff) VF10(1831,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dddfdfddff) VF10(1832,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddfdfddff) VF10(1833,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdfdfddff) VF10(1834,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdfdfddff) VF10(1835,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddffdfddff) VF10(1836,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdffdfddff) VF10(1837,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfffdfddff) VF10(1838,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffffdfddff) VF10(1839,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddddffddff) VF10(1840,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdddffddff) VF10(1841,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfddffddff) VF10(1842,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffddffddff) VF10(1843,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddfdffddff) VF10(1844,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdfdffddff) VF10(1845,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dffdffddff) VF10(1846,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fffdffddff) VF10(1847,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dddfffddff) VF10(1848,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fddfffddff) VF10(1849,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfdfffddff) VF10(1850,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffdfffddff) VF10(1851,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ddffffddff) VF10(1852,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_fdffffddff) VF10(1853,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_dfffffddff) VF10(1854,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,f_ffffffddff) VF10(1855,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddddddfdff) VF10(1856,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdddddfdff) VF10(1857,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfddddfdff) VF10(1858,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffddddfdff) VF10(1859,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdddfdff) VF10(1860,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdddfdff) VF10(1861,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdddfdff) VF10(1862,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdddfdff) VF10(1863,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dddfddfdff) VF10(1864,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fddfddfdff) VF10(1865,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdfddfdff) VF10(1866,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdfddfdff) VF10(1867,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddffddfdff) VF10(1868,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdffddfdff) VF10(1869,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfffddfdff) VF10(1870,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffffddfdff) VF10(1871,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddddfdfdff) VF10(1872,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdddfdfdff) VF10(1873,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfddfdfdff) VF10(1874,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffddfdfdff) VF10(1875,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdfdfdff) VF10(1876,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdfdfdff) VF10(1877,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdfdfdff) VF10(1878,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdfdfdff) VF10(1879,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dddffdfdff) VF10(1880,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fddffdfdff) VF10(1881,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdffdfdff) VF10(1882,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdffdfdff) VF10(1883,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfffdfdff) VF10(1884,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfffdfdff) VF10(1885,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_dffffdfdff) VF10(1886,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,f_fffffdfdff) VF10(1887,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dddddffdff) VF10(1888,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fddddffdff) VF10(1889,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdddffdff) VF10(1890,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdddffdff) VF10(1891,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfddffdff) VF10(1892,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfddffdff) VF10(1893,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffddffdff) VF10(1894,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffddffdff) VF10(1895,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dddfdffdff) VF10(1896,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fddfdffdff) VF10(1897,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdfdffdff) VF10(1898,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdfdffdff) VF10(1899,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddffdffdff) VF10(1900,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdffdffdff) VF10(1901,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfffdffdff) VF10(1902,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffffdffdff) VF10(1903,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddddfffdff) VF10(1904,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdddfffdff) VF10(1905,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfddfffdff) VF10(1906,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffddfffdff) VF10(1907,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfdfffdff) VF10(1908,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfdfffdff) VF10(1909,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffdfffdff) VF10(1910,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffdfffdff) VF10(1911,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dddffffdff) VF10(1912,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fddffffdff) VF10(1913,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dfdffffdff) VF10(1914,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ffdffffdff) VF10(1915,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_ddfffffdff) VF10(1916,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fdfffffdff) VF10(1917,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_dffffffdff) VF10(1918,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,f_fffffffdff) VF10(1919,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddddddfff) VF10(1920,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddddddfff) VF10(1921,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdddddfff) VF10(1922,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdddddfff) VF10(1923,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfddddfff) VF10(1924,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfddddfff) VF10(1925,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dffddddfff) VF10(1926,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fffddddfff) VF10(1927,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfdddfff) VF10(1928,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfdddfff) VF10(1929,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfdddfff) VF10(1930,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfdddfff) VF10(1931,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddffdddfff) VF10(1932,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdffdddfff) VF10(1933,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfffdddfff) VF10(1934,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffffdddfff) VF10(1935,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddddfddfff) VF10(1936,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdddfddfff) VF10(1937,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfddfddfff) VF10(1938,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffddfddfff) VF10(1939,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfdfddfff) VF10(1940,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfdfddfff) VF10(1941,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dffdfddfff) VF10(1942,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fffdfddfff) VF10(1943,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dddffddfff) VF10(1944,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fddffddfff) VF10(1945,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdffddfff) VF10(1946,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdffddfff) VF10(1947,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfffddfff) VF10(1948,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfffddfff) VF10(1949,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_dffffddfff) VF10(1950,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,f_fffffddfff) VF10(1951,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dddddfdfff) VF10(1952,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fddddfdfff) VF10(1953,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdddfdfff) VF10(1954,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdddfdfff) VF10(1955,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfddfdfff) VF10(1956,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfddfdfff) VF10(1957,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dffddfdfff) VF10(1958,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fffddfdfff) VF10(1959,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfdfdfff) VF10(1960,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfdfdfff) VF10(1961,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfdfdfff) VF10(1962,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfdfdfff) VF10(1963,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddffdfdfff) VF10(1964,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdffdfdfff) VF10(1965,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfffdfdfff) VF10(1966,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffffdfdfff) VF10(1967,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddddffdfff) VF10(1968,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdddffdfff) VF10(1969,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfddffdfff) VF10(1970,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffddffdfff) VF10(1971,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddfdffdfff) VF10(1972,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdfdffdfff) VF10(1973,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dffdffdfff) VF10(1974,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fffdffdfff) VF10(1975,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dddfffdfff) VF10(1976,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fddfffdfff) VF10(1977,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfdfffdfff) VF10(1978,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffdfffdfff) VF10(1979,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ddffffdfff) VF10(1980,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_fdffffdfff) VF10(1981,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_dfffffdfff) VF10(1982,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,f_ffffffdfff) VF10(1983,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddddddffff) VF10(1984,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdddddffff) VF10(1985,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfddddffff) VF10(1986,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffddddffff) VF10(1987,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfdddffff) VF10(1988,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfdddffff) VF10(1989,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffdddffff) VF10(1990,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fffdddffff) VF10(1991,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dddfddffff) VF10(1992,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fddfddffff) VF10(1993,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdfddffff) VF10(1994,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdfddffff) VF10(1995,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffddffff) VF10(1996,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffddffff) VF10(1997,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffddffff) VF10(1998,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffddffff) VF10(1999,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddddfdffff) VF10(2000,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdddfdffff) VF10(2001,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfddfdffff) VF10(2002,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffddfdffff) VF10(2003,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfdfdffff) VF10(2004,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfdfdffff) VF10(2005,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffdfdffff) VF10(2006,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fffdfdffff) VF10(2007,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dddffdffff) VF10(2008,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fddffdffff) VF10(2009,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdffdffff) VF10(2010,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdffdffff) VF10(2011,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfffdffff) VF10(2012,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfffdffff) VF10(2013,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_dffffdffff) VF10(2014,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,f_fffffdffff) VF10(2015,DCdouble,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dddddfffff) VF10(2016,DCfloat,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fddddfffff) VF10(2017,DCdouble,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdddfffff) VF10(2018,DCfloat,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdddfffff) VF10(2019,DCdouble,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfddfffff) VF10(2020,DCfloat,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfddfffff) VF10(2021,DCdouble,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dffddfffff) VF10(2022,DCfloat,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffddfffff) VF10(2023,DCdouble,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dddfdfffff) VF10(2024,DCfloat,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fddfdfffff) VF10(2025,DCdouble,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdfdfffff) VF10(2026,DCfloat,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdfdfffff) VF10(2027,DCdouble,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffdfffff) VF10(2028,DCfloat,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffdfffff) VF10(2029,DCdouble,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffdfffff) VF10(2030,DCfloat,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffdfffff) VF10(2031,DCdouble,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddddffffff) VF10(2032,DCfloat,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdddffffff) VF10(2033,DCdouble,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfddffffff) VF10(2034,DCfloat,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffddffffff) VF10(2035,DCdouble,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddfdffffff) VF10(2036,DCfloat,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdfdffffff) VF10(2037,DCdouble,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dffdffffff) VF10(2038,DCfloat,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fffdffffff) VF10(2039,DCdouble,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dddfffffff) VF10(2040,DCfloat,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fddfffffff) VF10(2041,DCdouble,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfdfffffff) VF10(2042,DCfloat,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffdfffffff) VF10(2043,DCdouble,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ddffffffff) VF10(2044,DCfloat,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_fdffffffff) VF10(2045,DCdouble,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_dfffffffff) VF10(2046,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,DCfloat,f_ffffffffff) MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/config.h0000644000175000017500000000201312456307246022351 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_floats/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 10 #define NTYPES 2 MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/dynMakefile0000644000175000017500000000032412456307246023111 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/main.cc0000644000175000017500000000633312456307246022177 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_floats/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include #include #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); DCdouble valueDouble [NARGS]; DCfloat valueFloat [NARGS]; bool equals(int select, int pos, void* data) { switch(select) { case 0: return ( getArg(pos)->d == valueDouble [pos] ); break; case 1: return ( getArg(pos)->f == valueFloat [pos] ); break; } return false; } void clearValues(); void init() { for (int i = 0 ; i < NARGS ; ++i ) { valueDouble[i] = DCdouble(i); valueFloat[i] = DCfloat(i); } } void push(DCCallVM* pCall, int select, int pos) { switch(select) { case 0: dcArgDouble ( pCall, valueDouble [pos] ); break; case 1: dcArgFloat ( pCall, valueFloat [pos] ); break; } } #define assert(x) if (!(x)) return false bool test(int x) { clearValues(); DCCallVM* pCall = dcNewCallVM(4096); dcReset(pCall); int y = x; int selects[NARGS] = { 0, }; int pos = 0; for(pos = 0;y>0;++pos) { int select = (y-1) % NTYPES; selects[pos] = select; push(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(int i = 0;i( pow((double)x,n)+powerfact(x,n-1) ); } bool run_range(int from, int to) { bool tr = true; for (int i = from ; i < to ; ++i ) { printf("%d:",i); bool r = test(i); printf("%d\n", r); tr &= r; } return tr; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { int ncalls = powerfact(NTYPES,NARGS)+1; success = run_range(0,ncalls); } printf("result: suite_floats: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite_floats/mkcase.py0000644000175000017500000000335012456307246022555 0ustar jnthnjnthn#!/usr/bin/python # # Copyright (c) 2007,2010 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # import sys # parameters nargs = 10 types = ["DCdouble","DCfloat"] typeSigs = ["d" ,"f" ] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types [s] ] sig += [ typeSigs[s] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/CMakeLists.txt0000644000175000017500000000015112456307246024372 0ustar jnthnjnthnadd_executable(suite_x86win32fast main.cc case.cc) target_link_libraries(suite_x86win32fast dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/Makefile.M0000644000175000017500000000015312456307246023467 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/Makefile.generic0000644000175000017500000000063012502366750024704 0ustar jnthnjnthnAPP = suite_x86win32fast OBJS = case.o main.o SRCTOP = ../.. BLDTOP = ../../ CFLAGS += -I${SRCTOP}/dyncall LDFLAGS += -L${BLDTOP}/dyncall LDLIBS += -ldyncall_s LINK = ${CC} all: ${APP} .PHONY: all clean install RM ?= rm -f AR ?= ar MKDIR ?= mkdir INSTALL ?= install -p ${APP}: ${OBJS} ${LINK} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} ${TARGET_ARCH} clean: ${RM} ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/Nmakefile0000644000175000017500000000375612456307246023466 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/README.txt0000644000175000017500000000315712456307246023341 0ustar jnthnjnthndyncall stress test suite: testing standard C calls =================================================== Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: suite - run full range suite - run test id suite - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/case.cc0000644000175000017500000001076512456307246023070 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32fast/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" DCValue mValue[NARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DClong value, int pos) { mValue[pos].l = value; } template<> void g(DClonglong value, int pos) { mValue[pos].L = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } #ifdef DC__C_GNU #define API __attribute__((fastcall)) #else #define API __fastcall #endif extern "C" { #define VF0(id,S) void API S () {gID=id;} #define VF1(id,A1,S) void API S (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void API S (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void API S (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #define VF0(id,S) reinterpret_cast(S), #define VF1(id,A1,S) reinterpret_cast(S), #define VF2(id,A1,A2,S) reinterpret_cast(S), #define VF3(id,A1,A2,A3,S) reinterpret_cast(S), #define VF4(id,A1,A2,A3,A4,S) reinterpret_cast(S), #define VF5(id,A1,A2,A3,A4,A5,S) reinterpret_cast(S), #define VF6(id,A1,A2,A3,A4,A5,A6,S) reinterpret_cast(S), #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) reinterpret_cast(S), #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) reinterpret_cast(S), #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) reinterpret_cast(S), #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) reinterpret_cast(S), typedef void (*fp)(); fp gFuncTable[] = { #include "case.h" }; DCpointer getFunc(int x) { return (DCpointer) gFuncTable[x]; } MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/case.h0000644000175000017500000002522612456307246022730 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32fast/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCbool,f_b) VF1(2,DCint,f_i) VF1(3,DClonglong,f_l) VF1(4,DCdouble,f_d) VF1(5,DCpointer,f_p) VF1(6,DCfloat,f_f) VF2(7,DCbool,DCbool,f_bb) VF2(8,DCint,DCbool,f_ib) VF2(9,DClonglong,DCbool,f_lb) VF2(10,DCdouble,DCbool,f_db) VF2(11,DCpointer,DCbool,f_pb) VF2(12,DCfloat,DCbool,f_fb) VF2(13,DCbool,DCint,f_bi) VF2(14,DCint,DCint,f_ii) VF2(15,DClonglong,DCint,f_li) VF2(16,DCdouble,DCint,f_di) VF2(17,DCpointer,DCint,f_pi) VF2(18,DCfloat,DCint,f_fi) VF2(19,DCbool,DClonglong,f_bl) VF2(20,DCint,DClonglong,f_il) VF2(21,DClonglong,DClonglong,f_ll) VF2(22,DCdouble,DClonglong,f_dl) VF2(23,DCpointer,DClonglong,f_pl) VF2(24,DCfloat,DClonglong,f_fl) VF2(25,DCbool,DCdouble,f_bd) VF2(26,DCint,DCdouble,f_id) VF2(27,DClonglong,DCdouble,f_ld) VF2(28,DCdouble,DCdouble,f_dd) VF2(29,DCpointer,DCdouble,f_pd) VF2(30,DCfloat,DCdouble,f_fd) VF2(31,DCbool,DCpointer,f_bp) VF2(32,DCint,DCpointer,f_ip) VF2(33,DClonglong,DCpointer,f_lp) VF2(34,DCdouble,DCpointer,f_dp) VF2(35,DCpointer,DCpointer,f_pp) VF2(36,DCfloat,DCpointer,f_fp) VF2(37,DCbool,DCfloat,f_bf) VF2(38,DCint,DCfloat,f_if) VF2(39,DClonglong,DCfloat,f_lf) VF2(40,DCdouble,DCfloat,f_df) VF2(41,DCpointer,DCfloat,f_pf) VF2(42,DCfloat,DCfloat,f_ff) VF3(43,DCbool,DCbool,DCbool,f_bbb) VF3(44,DCint,DCbool,DCbool,f_ibb) VF3(45,DClonglong,DCbool,DCbool,f_lbb) VF3(46,DCdouble,DCbool,DCbool,f_dbb) VF3(47,DCpointer,DCbool,DCbool,f_pbb) VF3(48,DCfloat,DCbool,DCbool,f_fbb) VF3(49,DCbool,DCint,DCbool,f_bib) VF3(50,DCint,DCint,DCbool,f_iib) VF3(51,DClonglong,DCint,DCbool,f_lib) VF3(52,DCdouble,DCint,DCbool,f_dib) VF3(53,DCpointer,DCint,DCbool,f_pib) VF3(54,DCfloat,DCint,DCbool,f_fib) VF3(55,DCbool,DClonglong,DCbool,f_blb) VF3(56,DCint,DClonglong,DCbool,f_ilb) VF3(57,DClonglong,DClonglong,DCbool,f_llb) VF3(58,DCdouble,DClonglong,DCbool,f_dlb) VF3(59,DCpointer,DClonglong,DCbool,f_plb) VF3(60,DCfloat,DClonglong,DCbool,f_flb) VF3(61,DCbool,DCdouble,DCbool,f_bdb) VF3(62,DCint,DCdouble,DCbool,f_idb) VF3(63,DClonglong,DCdouble,DCbool,f_ldb) VF3(64,DCdouble,DCdouble,DCbool,f_ddb) VF3(65,DCpointer,DCdouble,DCbool,f_pdb) VF3(66,DCfloat,DCdouble,DCbool,f_fdb) VF3(67,DCbool,DCpointer,DCbool,f_bpb) VF3(68,DCint,DCpointer,DCbool,f_ipb) VF3(69,DClonglong,DCpointer,DCbool,f_lpb) VF3(70,DCdouble,DCpointer,DCbool,f_dpb) VF3(71,DCpointer,DCpointer,DCbool,f_ppb) VF3(72,DCfloat,DCpointer,DCbool,f_fpb) VF3(73,DCbool,DCfloat,DCbool,f_bfb) VF3(74,DCint,DCfloat,DCbool,f_ifb) VF3(75,DClonglong,DCfloat,DCbool,f_lfb) VF3(76,DCdouble,DCfloat,DCbool,f_dfb) VF3(77,DCpointer,DCfloat,DCbool,f_pfb) VF3(78,DCfloat,DCfloat,DCbool,f_ffb) VF3(79,DCbool,DCbool,DCint,f_bbi) VF3(80,DCint,DCbool,DCint,f_ibi) VF3(81,DClonglong,DCbool,DCint,f_lbi) VF3(82,DCdouble,DCbool,DCint,f_dbi) VF3(83,DCpointer,DCbool,DCint,f_pbi) VF3(84,DCfloat,DCbool,DCint,f_fbi) VF3(85,DCbool,DCint,DCint,f_bii) VF3(86,DCint,DCint,DCint,f_iii) VF3(87,DClonglong,DCint,DCint,f_lii) VF3(88,DCdouble,DCint,DCint,f_dii) VF3(89,DCpointer,DCint,DCint,f_pii) VF3(90,DCfloat,DCint,DCint,f_fii) VF3(91,DCbool,DClonglong,DCint,f_bli) VF3(92,DCint,DClonglong,DCint,f_ili) VF3(93,DClonglong,DClonglong,DCint,f_lli) VF3(94,DCdouble,DClonglong,DCint,f_dli) VF3(95,DCpointer,DClonglong,DCint,f_pli) VF3(96,DCfloat,DClonglong,DCint,f_fli) VF3(97,DCbool,DCdouble,DCint,f_bdi) VF3(98,DCint,DCdouble,DCint,f_idi) VF3(99,DClonglong,DCdouble,DCint,f_ldi) VF3(100,DCdouble,DCdouble,DCint,f_ddi) VF3(101,DCpointer,DCdouble,DCint,f_pdi) VF3(102,DCfloat,DCdouble,DCint,f_fdi) VF3(103,DCbool,DCpointer,DCint,f_bpi) VF3(104,DCint,DCpointer,DCint,f_ipi) VF3(105,DClonglong,DCpointer,DCint,f_lpi) VF3(106,DCdouble,DCpointer,DCint,f_dpi) VF3(107,DCpointer,DCpointer,DCint,f_ppi) VF3(108,DCfloat,DCpointer,DCint,f_fpi) VF3(109,DCbool,DCfloat,DCint,f_bfi) VF3(110,DCint,DCfloat,DCint,f_ifi) VF3(111,DClonglong,DCfloat,DCint,f_lfi) VF3(112,DCdouble,DCfloat,DCint,f_dfi) VF3(113,DCpointer,DCfloat,DCint,f_pfi) VF3(114,DCfloat,DCfloat,DCint,f_ffi) VF3(115,DCbool,DCbool,DClonglong,f_bbl) VF3(116,DCint,DCbool,DClonglong,f_ibl) VF3(117,DClonglong,DCbool,DClonglong,f_lbl) VF3(118,DCdouble,DCbool,DClonglong,f_dbl) VF3(119,DCpointer,DCbool,DClonglong,f_pbl) VF3(120,DCfloat,DCbool,DClonglong,f_fbl) VF3(121,DCbool,DCint,DClonglong,f_bil) VF3(122,DCint,DCint,DClonglong,f_iil) VF3(123,DClonglong,DCint,DClonglong,f_lil) VF3(124,DCdouble,DCint,DClonglong,f_dil) VF3(125,DCpointer,DCint,DClonglong,f_pil) VF3(126,DCfloat,DCint,DClonglong,f_fil) VF3(127,DCbool,DClonglong,DClonglong,f_bll) VF3(128,DCint,DClonglong,DClonglong,f_ill) VF3(129,DClonglong,DClonglong,DClonglong,f_lll) VF3(130,DCdouble,DClonglong,DClonglong,f_dll) VF3(131,DCpointer,DClonglong,DClonglong,f_pll) VF3(132,DCfloat,DClonglong,DClonglong,f_fll) VF3(133,DCbool,DCdouble,DClonglong,f_bdl) VF3(134,DCint,DCdouble,DClonglong,f_idl) VF3(135,DClonglong,DCdouble,DClonglong,f_ldl) VF3(136,DCdouble,DCdouble,DClonglong,f_ddl) VF3(137,DCpointer,DCdouble,DClonglong,f_pdl) VF3(138,DCfloat,DCdouble,DClonglong,f_fdl) VF3(139,DCbool,DCpointer,DClonglong,f_bpl) VF3(140,DCint,DCpointer,DClonglong,f_ipl) VF3(141,DClonglong,DCpointer,DClonglong,f_lpl) VF3(142,DCdouble,DCpointer,DClonglong,f_dpl) VF3(143,DCpointer,DCpointer,DClonglong,f_ppl) VF3(144,DCfloat,DCpointer,DClonglong,f_fpl) VF3(145,DCbool,DCfloat,DClonglong,f_bfl) VF3(146,DCint,DCfloat,DClonglong,f_ifl) VF3(147,DClonglong,DCfloat,DClonglong,f_lfl) VF3(148,DCdouble,DCfloat,DClonglong,f_dfl) VF3(149,DCpointer,DCfloat,DClonglong,f_pfl) VF3(150,DCfloat,DCfloat,DClonglong,f_ffl) VF3(151,DCbool,DCbool,DCdouble,f_bbd) VF3(152,DCint,DCbool,DCdouble,f_ibd) VF3(153,DClonglong,DCbool,DCdouble,f_lbd) VF3(154,DCdouble,DCbool,DCdouble,f_dbd) VF3(155,DCpointer,DCbool,DCdouble,f_pbd) VF3(156,DCfloat,DCbool,DCdouble,f_fbd) VF3(157,DCbool,DCint,DCdouble,f_bid) VF3(158,DCint,DCint,DCdouble,f_iid) VF3(159,DClonglong,DCint,DCdouble,f_lid) VF3(160,DCdouble,DCint,DCdouble,f_did) VF3(161,DCpointer,DCint,DCdouble,f_pid) VF3(162,DCfloat,DCint,DCdouble,f_fid) VF3(163,DCbool,DClonglong,DCdouble,f_bld) VF3(164,DCint,DClonglong,DCdouble,f_ild) VF3(165,DClonglong,DClonglong,DCdouble,f_lld) VF3(166,DCdouble,DClonglong,DCdouble,f_dld) VF3(167,DCpointer,DClonglong,DCdouble,f_pld) VF3(168,DCfloat,DClonglong,DCdouble,f_fld) VF3(169,DCbool,DCdouble,DCdouble,f_bdd) VF3(170,DCint,DCdouble,DCdouble,f_idd) VF3(171,DClonglong,DCdouble,DCdouble,f_ldd) VF3(172,DCdouble,DCdouble,DCdouble,f_ddd) VF3(173,DCpointer,DCdouble,DCdouble,f_pdd) VF3(174,DCfloat,DCdouble,DCdouble,f_fdd) VF3(175,DCbool,DCpointer,DCdouble,f_bpd) VF3(176,DCint,DCpointer,DCdouble,f_ipd) VF3(177,DClonglong,DCpointer,DCdouble,f_lpd) VF3(178,DCdouble,DCpointer,DCdouble,f_dpd) VF3(179,DCpointer,DCpointer,DCdouble,f_ppd) VF3(180,DCfloat,DCpointer,DCdouble,f_fpd) VF3(181,DCbool,DCfloat,DCdouble,f_bfd) VF3(182,DCint,DCfloat,DCdouble,f_ifd) VF3(183,DClonglong,DCfloat,DCdouble,f_lfd) VF3(184,DCdouble,DCfloat,DCdouble,f_dfd) VF3(185,DCpointer,DCfloat,DCdouble,f_pfd) VF3(186,DCfloat,DCfloat,DCdouble,f_ffd) VF3(187,DCbool,DCbool,DCpointer,f_bbp) VF3(188,DCint,DCbool,DCpointer,f_ibp) VF3(189,DClonglong,DCbool,DCpointer,f_lbp) VF3(190,DCdouble,DCbool,DCpointer,f_dbp) VF3(191,DCpointer,DCbool,DCpointer,f_pbp) VF3(192,DCfloat,DCbool,DCpointer,f_fbp) VF3(193,DCbool,DCint,DCpointer,f_bip) VF3(194,DCint,DCint,DCpointer,f_iip) VF3(195,DClonglong,DCint,DCpointer,f_lip) VF3(196,DCdouble,DCint,DCpointer,f_dip) VF3(197,DCpointer,DCint,DCpointer,f_pip) VF3(198,DCfloat,DCint,DCpointer,f_fip) VF3(199,DCbool,DClonglong,DCpointer,f_blp) VF3(200,DCint,DClonglong,DCpointer,f_ilp) VF3(201,DClonglong,DClonglong,DCpointer,f_llp) VF3(202,DCdouble,DClonglong,DCpointer,f_dlp) VF3(203,DCpointer,DClonglong,DCpointer,f_plp) VF3(204,DCfloat,DClonglong,DCpointer,f_flp) VF3(205,DCbool,DCdouble,DCpointer,f_bdp) VF3(206,DCint,DCdouble,DCpointer,f_idp) VF3(207,DClonglong,DCdouble,DCpointer,f_ldp) VF3(208,DCdouble,DCdouble,DCpointer,f_ddp) VF3(209,DCpointer,DCdouble,DCpointer,f_pdp) VF3(210,DCfloat,DCdouble,DCpointer,f_fdp) VF3(211,DCbool,DCpointer,DCpointer,f_bpp) VF3(212,DCint,DCpointer,DCpointer,f_ipp) VF3(213,DClonglong,DCpointer,DCpointer,f_lpp) VF3(214,DCdouble,DCpointer,DCpointer,f_dpp) VF3(215,DCpointer,DCpointer,DCpointer,f_ppp) VF3(216,DCfloat,DCpointer,DCpointer,f_fpp) VF3(217,DCbool,DCfloat,DCpointer,f_bfp) VF3(218,DCint,DCfloat,DCpointer,f_ifp) VF3(219,DClonglong,DCfloat,DCpointer,f_lfp) VF3(220,DCdouble,DCfloat,DCpointer,f_dfp) VF3(221,DCpointer,DCfloat,DCpointer,f_pfp) VF3(222,DCfloat,DCfloat,DCpointer,f_ffp) VF3(223,DCbool,DCbool,DCfloat,f_bbf) VF3(224,DCint,DCbool,DCfloat,f_ibf) VF3(225,DClonglong,DCbool,DCfloat,f_lbf) VF3(226,DCdouble,DCbool,DCfloat,f_dbf) VF3(227,DCpointer,DCbool,DCfloat,f_pbf) VF3(228,DCfloat,DCbool,DCfloat,f_fbf) VF3(229,DCbool,DCint,DCfloat,f_bif) VF3(230,DCint,DCint,DCfloat,f_iif) VF3(231,DClonglong,DCint,DCfloat,f_lif) VF3(232,DCdouble,DCint,DCfloat,f_dif) VF3(233,DCpointer,DCint,DCfloat,f_pif) VF3(234,DCfloat,DCint,DCfloat,f_fif) VF3(235,DCbool,DClonglong,DCfloat,f_blf) VF3(236,DCint,DClonglong,DCfloat,f_ilf) VF3(237,DClonglong,DClonglong,DCfloat,f_llf) VF3(238,DCdouble,DClonglong,DCfloat,f_dlf) VF3(239,DCpointer,DClonglong,DCfloat,f_plf) VF3(240,DCfloat,DClonglong,DCfloat,f_flf) VF3(241,DCbool,DCdouble,DCfloat,f_bdf) VF3(242,DCint,DCdouble,DCfloat,f_idf) VF3(243,DClonglong,DCdouble,DCfloat,f_ldf) VF3(244,DCdouble,DCdouble,DCfloat,f_ddf) VF3(245,DCpointer,DCdouble,DCfloat,f_pdf) VF3(246,DCfloat,DCdouble,DCfloat,f_fdf) VF3(247,DCbool,DCpointer,DCfloat,f_bpf) VF3(248,DCint,DCpointer,DCfloat,f_ipf) VF3(249,DClonglong,DCpointer,DCfloat,f_lpf) VF3(250,DCdouble,DCpointer,DCfloat,f_dpf) VF3(251,DCpointer,DCpointer,DCfloat,f_ppf) VF3(252,DCfloat,DCpointer,DCfloat,f_fpf) VF3(253,DCbool,DCfloat,DCfloat,f_bff) VF3(254,DCint,DCfloat,DCfloat,f_iff) VF3(255,DClonglong,DCfloat,DCfloat,f_lff) VF3(256,DCdouble,DCfloat,DCfloat,f_dff) VF3(257,DCpointer,DCfloat,DCfloat,f_pff) VF3(258,DCfloat,DCfloat,DCfloat,f_fff) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/config.h0000644000175000017500000000202012456307246023245 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32fast/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 3 #define NTYPES 6 MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/dynMakefile0000644000175000017500000000032412456307246024007 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/main.cc0000644000175000017500000001032612456307246023072 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32fast/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include "../../dyncall/dyncall_macros.h" #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); typedef double precise; DCbool valueBool[NARGS]; DCshort valueShort[NARGS]; DCchar valueChar[NARGS]; DCint valueInt[NARGS]; DClonglong valueLongLong[NARGS]; DCdouble valueDouble[NARGS]; DCpointer valuePointer[NARGS]; DCfloat valueFloat[NARGS]; bool equals(int select, int pos, void* data) { switch(select) { case 0: return ( getArg(pos)->B == valueBool[pos] ); break; case 1: return ( getArg(pos)->i == valueInt[pos] ); break; case 2: return ( getArg(pos)->l == valueLongLong[pos] ); break; case 3: return ( getArg(pos)->d == valueDouble[pos] ); break; case 4: return ( getArg(pos)->p == valuePointer[pos] ); break; case 5: return ( getArg(pos)->f == valueFloat[pos] ); break; } return false; } void clearValues(); void init() { for (int i = 0 ; i < NARGS ; ++i ) { valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE ); valueInt[i] = DCint(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valuePointer[i] = DCpointer(i); valueFloat[i] = DCfloat(i); } } void push(DCCallVM* pCall, int select, int pos) { switch(select) { case 0: dcArgBool( pCall, valueBool[pos] ); break; case 1: dcArgInt( pCall, valueInt[pos] ); break; case 2: dcArgLongLong( pCall, valueLongLong[pos] ); break; case 3: dcArgDouble( pCall, valueDouble[pos] ); break; case 4: dcArgPointer( pCall, valuePointer[pos] ); break; case 5: dcArgFloat( pCall, valueFloat[pos] ); break; } } #define assert(x) if (!(x)) return false bool test(int x) { clearValues(); DCCallVM* pCall = dcNewCallVM(4096); #ifdef DC__C_GNU dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_GNU); #else dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_MS); #endif dcReset(pCall); int y = x; int selects[NARGS] = { 0, }; int pos = 0; for(pos = 0;y>0;++pos) { int select = (y-1) % NTYPES; selects[pos] = select; push(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(int i = 0;i( pow((double)x,n)+powerfact(x,n-1) ); } #include #include bool run_range(int from, int to) { bool tr = true; for (int i = from ; i < to ; ++i ) { printf("%d:",i); bool r = test(i); printf("%d\n", r); tr &= r; } return tr; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { int ncalls = powerfact(NTYPES,NARGS)+1; success = run_range(0,ncalls); } printf("result: suite_x86win32fast: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32fast/mkcase.py0000644000175000017500000000361012456307246023452 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys # parameters nargs = 3 types = ["DCbool","DCint","DClonglong","DCdouble","DCpointer","DCfloat"] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types[s] ] sig += [ types[s][2] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/CMakeLists.txt0000644000175000017500000000014712456307246024234 0ustar jnthnjnthnadd_executable(suite_x86win32std main.cc case.cc) target_link_libraries(suite_x86win32std dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/Makefile.M0000644000175000017500000000015312456307246023324 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/Makefile.generic0000644000175000017500000000062712502366750024547 0ustar jnthnjnthnAPP = suite_x86win32std OBJS = case.o main.o SRCTOP = ../.. BLDTOP = ../../ CFLAGS += -I${SRCTOP}/dyncall LDFLAGS += -L${BLDTOP}/dyncall LDLIBS += -ldyncall_s LINK = ${CC} all: ${APP} .PHONY: all clean install RM ?= rm -f AR ?= ar MKDIR ?= mkdir INSTALL ?= install -p ${APP}: ${OBJS} ${LINK} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} ${TARGET_ARCH} clean: ${RM} ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/Nmakefile0000644000175000017500000000375612456307246023323 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake AUTOS = config.h case.h !IF "$(BUILD_OS)" == "windows" TARGETS = suite.exe OBJS = main.obj case.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib > nul !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = suite.nds OBJS = main.o case.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF $(OBJS): $(AUTOS) $(AUTOS): mkcase.py python mkcase.py >case.h 2>config.h !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/README.txt0000644000175000017500000000315612456307246023175 0ustar jnthnjnthndyncall stress test suite: testing standard C calls =================================================== Copyright (c) 2007-2009 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. requirements: python (for preprocessing) configuration: edit "nargs" in mkcase.py and run make distclean make on shell. usage: suite - run full range suite - run test id suite - run test id to id (inclusive). see test details in case.h description: the test invokes 'void'-functions that effectively overwrite global variables in a structured way. functions are identified by an id (a number starting at 0). the implementation of each function does sets the gID to its id (which is compiled in) sets all arguments into type-specific value vectors at the given position MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/case.cc0000644000175000017500000001065612456307246022724 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32std/case.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" DCValue mValue[NARGS]; void clearValues() { for(int i = 0;i void g(T value, int pos); template<> void g(DCchar value, int pos) { mValue[pos].c = value; } template<> void g(DCshort value, int pos) { mValue[pos].s = value; } template<> void g(DCint value, int pos) { mValue[pos].i = value; } template<> void g(DClonglong value, int pos) { mValue[pos].L = value; } template<> void g(DCfloat value, int pos) { mValue[pos].f = value; } template<> void g(DCdouble value, int pos) { mValue[pos].d = value; } template<> void g(DCpointer value, int pos) { mValue[pos].p = value; } DCValue* getArg(int pos) { return &mValue[pos]; } int gID; int getId() { return gID; } #ifdef DC__C_GNU #define API __attribute__((stdcall)) #else #define API __stdcall #endif extern "C" { #define VF0(id,S) void API S () {gID=id;} #define VF1(id,A1,S) void API S (A1 a1) {gID=id;g(a1,0);} #define VF2(id,A1,A2,S) void API S (A1 a1, A2 a2) {gID=id;g(a1,0);g(a2,1);} #define VF3(id,A1,A2,A3,S) void API S (A1 a1, A2 a2,A3 a3) {gID=id;g(a1,0);g(a2,1);g(a3,2);} #define VF4(id,A1,A2,A3,A4,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);} #define VF5(id,A1,A2,A3,A4,A5,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);} #define VF6(id,A1,A2,A3,A4,A5,A6,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);} #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);} #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);} #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);} #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) void API S (A1 a1, A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9,A10 a10) {gID=id;g(a1,0);g(a2,1);g(a3,2);g(a4,3);g(a5,4);g(a6,5);g(a7,6);g(a8,7);g(a9,8);g(a10,9);} #include "case.h" } #undef VF0 #undef VF1 #undef VF2 #undef VF3 #undef VF4 #undef VF5 #undef VF6 #undef VF7 #undef VF8 #undef VF9 #undef VF10 #define VF0(id,S) reinterpret_cast(S), #define VF1(id,A1,S) reinterpret_cast(S), #define VF2(id,A1,A2,S) reinterpret_cast(S), #define VF3(id,A1,A2,A3,S) reinterpret_cast(S), #define VF4(id,A1,A2,A3,A4,S) reinterpret_cast(S), #define VF5(id,A1,A2,A3,A4,A5,S) reinterpret_cast(S), #define VF6(id,A1,A2,A3,A4,A5,A6,S) reinterpret_cast(S), #define VF7(id,A1,A2,A3,A4,A5,A6,A7,S) reinterpret_cast(S), #define VF8(id,A1,A2,A3,A4,A5,A6,A7,A8,S) reinterpret_cast(S), #define VF9(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,S) reinterpret_cast(S), #define VF10(id,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,S) reinterpret_cast(S), typedef void (*fp)(); fp gFuncTable[] = { #include "case.h" }; DCpointer getFunc(int x) { return (DCpointer) gFuncTable[x]; } MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/case.h0000644000175000017500000002522512456307246022564 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32std/case.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase.py (on stdout) */ VF0(0,f_) VF1(1,DCbool,f_b) VF1(2,DCint,f_i) VF1(3,DClonglong,f_l) VF1(4,DCdouble,f_d) VF1(5,DCpointer,f_p) VF1(6,DCfloat,f_f) VF2(7,DCbool,DCbool,f_bb) VF2(8,DCint,DCbool,f_ib) VF2(9,DClonglong,DCbool,f_lb) VF2(10,DCdouble,DCbool,f_db) VF2(11,DCpointer,DCbool,f_pb) VF2(12,DCfloat,DCbool,f_fb) VF2(13,DCbool,DCint,f_bi) VF2(14,DCint,DCint,f_ii) VF2(15,DClonglong,DCint,f_li) VF2(16,DCdouble,DCint,f_di) VF2(17,DCpointer,DCint,f_pi) VF2(18,DCfloat,DCint,f_fi) VF2(19,DCbool,DClonglong,f_bl) VF2(20,DCint,DClonglong,f_il) VF2(21,DClonglong,DClonglong,f_ll) VF2(22,DCdouble,DClonglong,f_dl) VF2(23,DCpointer,DClonglong,f_pl) VF2(24,DCfloat,DClonglong,f_fl) VF2(25,DCbool,DCdouble,f_bd) VF2(26,DCint,DCdouble,f_id) VF2(27,DClonglong,DCdouble,f_ld) VF2(28,DCdouble,DCdouble,f_dd) VF2(29,DCpointer,DCdouble,f_pd) VF2(30,DCfloat,DCdouble,f_fd) VF2(31,DCbool,DCpointer,f_bp) VF2(32,DCint,DCpointer,f_ip) VF2(33,DClonglong,DCpointer,f_lp) VF2(34,DCdouble,DCpointer,f_dp) VF2(35,DCpointer,DCpointer,f_pp) VF2(36,DCfloat,DCpointer,f_fp) VF2(37,DCbool,DCfloat,f_bf) VF2(38,DCint,DCfloat,f_if) VF2(39,DClonglong,DCfloat,f_lf) VF2(40,DCdouble,DCfloat,f_df) VF2(41,DCpointer,DCfloat,f_pf) VF2(42,DCfloat,DCfloat,f_ff) VF3(43,DCbool,DCbool,DCbool,f_bbb) VF3(44,DCint,DCbool,DCbool,f_ibb) VF3(45,DClonglong,DCbool,DCbool,f_lbb) VF3(46,DCdouble,DCbool,DCbool,f_dbb) VF3(47,DCpointer,DCbool,DCbool,f_pbb) VF3(48,DCfloat,DCbool,DCbool,f_fbb) VF3(49,DCbool,DCint,DCbool,f_bib) VF3(50,DCint,DCint,DCbool,f_iib) VF3(51,DClonglong,DCint,DCbool,f_lib) VF3(52,DCdouble,DCint,DCbool,f_dib) VF3(53,DCpointer,DCint,DCbool,f_pib) VF3(54,DCfloat,DCint,DCbool,f_fib) VF3(55,DCbool,DClonglong,DCbool,f_blb) VF3(56,DCint,DClonglong,DCbool,f_ilb) VF3(57,DClonglong,DClonglong,DCbool,f_llb) VF3(58,DCdouble,DClonglong,DCbool,f_dlb) VF3(59,DCpointer,DClonglong,DCbool,f_plb) VF3(60,DCfloat,DClonglong,DCbool,f_flb) VF3(61,DCbool,DCdouble,DCbool,f_bdb) VF3(62,DCint,DCdouble,DCbool,f_idb) VF3(63,DClonglong,DCdouble,DCbool,f_ldb) VF3(64,DCdouble,DCdouble,DCbool,f_ddb) VF3(65,DCpointer,DCdouble,DCbool,f_pdb) VF3(66,DCfloat,DCdouble,DCbool,f_fdb) VF3(67,DCbool,DCpointer,DCbool,f_bpb) VF3(68,DCint,DCpointer,DCbool,f_ipb) VF3(69,DClonglong,DCpointer,DCbool,f_lpb) VF3(70,DCdouble,DCpointer,DCbool,f_dpb) VF3(71,DCpointer,DCpointer,DCbool,f_ppb) VF3(72,DCfloat,DCpointer,DCbool,f_fpb) VF3(73,DCbool,DCfloat,DCbool,f_bfb) VF3(74,DCint,DCfloat,DCbool,f_ifb) VF3(75,DClonglong,DCfloat,DCbool,f_lfb) VF3(76,DCdouble,DCfloat,DCbool,f_dfb) VF3(77,DCpointer,DCfloat,DCbool,f_pfb) VF3(78,DCfloat,DCfloat,DCbool,f_ffb) VF3(79,DCbool,DCbool,DCint,f_bbi) VF3(80,DCint,DCbool,DCint,f_ibi) VF3(81,DClonglong,DCbool,DCint,f_lbi) VF3(82,DCdouble,DCbool,DCint,f_dbi) VF3(83,DCpointer,DCbool,DCint,f_pbi) VF3(84,DCfloat,DCbool,DCint,f_fbi) VF3(85,DCbool,DCint,DCint,f_bii) VF3(86,DCint,DCint,DCint,f_iii) VF3(87,DClonglong,DCint,DCint,f_lii) VF3(88,DCdouble,DCint,DCint,f_dii) VF3(89,DCpointer,DCint,DCint,f_pii) VF3(90,DCfloat,DCint,DCint,f_fii) VF3(91,DCbool,DClonglong,DCint,f_bli) VF3(92,DCint,DClonglong,DCint,f_ili) VF3(93,DClonglong,DClonglong,DCint,f_lli) VF3(94,DCdouble,DClonglong,DCint,f_dli) VF3(95,DCpointer,DClonglong,DCint,f_pli) VF3(96,DCfloat,DClonglong,DCint,f_fli) VF3(97,DCbool,DCdouble,DCint,f_bdi) VF3(98,DCint,DCdouble,DCint,f_idi) VF3(99,DClonglong,DCdouble,DCint,f_ldi) VF3(100,DCdouble,DCdouble,DCint,f_ddi) VF3(101,DCpointer,DCdouble,DCint,f_pdi) VF3(102,DCfloat,DCdouble,DCint,f_fdi) VF3(103,DCbool,DCpointer,DCint,f_bpi) VF3(104,DCint,DCpointer,DCint,f_ipi) VF3(105,DClonglong,DCpointer,DCint,f_lpi) VF3(106,DCdouble,DCpointer,DCint,f_dpi) VF3(107,DCpointer,DCpointer,DCint,f_ppi) VF3(108,DCfloat,DCpointer,DCint,f_fpi) VF3(109,DCbool,DCfloat,DCint,f_bfi) VF3(110,DCint,DCfloat,DCint,f_ifi) VF3(111,DClonglong,DCfloat,DCint,f_lfi) VF3(112,DCdouble,DCfloat,DCint,f_dfi) VF3(113,DCpointer,DCfloat,DCint,f_pfi) VF3(114,DCfloat,DCfloat,DCint,f_ffi) VF3(115,DCbool,DCbool,DClonglong,f_bbl) VF3(116,DCint,DCbool,DClonglong,f_ibl) VF3(117,DClonglong,DCbool,DClonglong,f_lbl) VF3(118,DCdouble,DCbool,DClonglong,f_dbl) VF3(119,DCpointer,DCbool,DClonglong,f_pbl) VF3(120,DCfloat,DCbool,DClonglong,f_fbl) VF3(121,DCbool,DCint,DClonglong,f_bil) VF3(122,DCint,DCint,DClonglong,f_iil) VF3(123,DClonglong,DCint,DClonglong,f_lil) VF3(124,DCdouble,DCint,DClonglong,f_dil) VF3(125,DCpointer,DCint,DClonglong,f_pil) VF3(126,DCfloat,DCint,DClonglong,f_fil) VF3(127,DCbool,DClonglong,DClonglong,f_bll) VF3(128,DCint,DClonglong,DClonglong,f_ill) VF3(129,DClonglong,DClonglong,DClonglong,f_lll) VF3(130,DCdouble,DClonglong,DClonglong,f_dll) VF3(131,DCpointer,DClonglong,DClonglong,f_pll) VF3(132,DCfloat,DClonglong,DClonglong,f_fll) VF3(133,DCbool,DCdouble,DClonglong,f_bdl) VF3(134,DCint,DCdouble,DClonglong,f_idl) VF3(135,DClonglong,DCdouble,DClonglong,f_ldl) VF3(136,DCdouble,DCdouble,DClonglong,f_ddl) VF3(137,DCpointer,DCdouble,DClonglong,f_pdl) VF3(138,DCfloat,DCdouble,DClonglong,f_fdl) VF3(139,DCbool,DCpointer,DClonglong,f_bpl) VF3(140,DCint,DCpointer,DClonglong,f_ipl) VF3(141,DClonglong,DCpointer,DClonglong,f_lpl) VF3(142,DCdouble,DCpointer,DClonglong,f_dpl) VF3(143,DCpointer,DCpointer,DClonglong,f_ppl) VF3(144,DCfloat,DCpointer,DClonglong,f_fpl) VF3(145,DCbool,DCfloat,DClonglong,f_bfl) VF3(146,DCint,DCfloat,DClonglong,f_ifl) VF3(147,DClonglong,DCfloat,DClonglong,f_lfl) VF3(148,DCdouble,DCfloat,DClonglong,f_dfl) VF3(149,DCpointer,DCfloat,DClonglong,f_pfl) VF3(150,DCfloat,DCfloat,DClonglong,f_ffl) VF3(151,DCbool,DCbool,DCdouble,f_bbd) VF3(152,DCint,DCbool,DCdouble,f_ibd) VF3(153,DClonglong,DCbool,DCdouble,f_lbd) VF3(154,DCdouble,DCbool,DCdouble,f_dbd) VF3(155,DCpointer,DCbool,DCdouble,f_pbd) VF3(156,DCfloat,DCbool,DCdouble,f_fbd) VF3(157,DCbool,DCint,DCdouble,f_bid) VF3(158,DCint,DCint,DCdouble,f_iid) VF3(159,DClonglong,DCint,DCdouble,f_lid) VF3(160,DCdouble,DCint,DCdouble,f_did) VF3(161,DCpointer,DCint,DCdouble,f_pid) VF3(162,DCfloat,DCint,DCdouble,f_fid) VF3(163,DCbool,DClonglong,DCdouble,f_bld) VF3(164,DCint,DClonglong,DCdouble,f_ild) VF3(165,DClonglong,DClonglong,DCdouble,f_lld) VF3(166,DCdouble,DClonglong,DCdouble,f_dld) VF3(167,DCpointer,DClonglong,DCdouble,f_pld) VF3(168,DCfloat,DClonglong,DCdouble,f_fld) VF3(169,DCbool,DCdouble,DCdouble,f_bdd) VF3(170,DCint,DCdouble,DCdouble,f_idd) VF3(171,DClonglong,DCdouble,DCdouble,f_ldd) VF3(172,DCdouble,DCdouble,DCdouble,f_ddd) VF3(173,DCpointer,DCdouble,DCdouble,f_pdd) VF3(174,DCfloat,DCdouble,DCdouble,f_fdd) VF3(175,DCbool,DCpointer,DCdouble,f_bpd) VF3(176,DCint,DCpointer,DCdouble,f_ipd) VF3(177,DClonglong,DCpointer,DCdouble,f_lpd) VF3(178,DCdouble,DCpointer,DCdouble,f_dpd) VF3(179,DCpointer,DCpointer,DCdouble,f_ppd) VF3(180,DCfloat,DCpointer,DCdouble,f_fpd) VF3(181,DCbool,DCfloat,DCdouble,f_bfd) VF3(182,DCint,DCfloat,DCdouble,f_ifd) VF3(183,DClonglong,DCfloat,DCdouble,f_lfd) VF3(184,DCdouble,DCfloat,DCdouble,f_dfd) VF3(185,DCpointer,DCfloat,DCdouble,f_pfd) VF3(186,DCfloat,DCfloat,DCdouble,f_ffd) VF3(187,DCbool,DCbool,DCpointer,f_bbp) VF3(188,DCint,DCbool,DCpointer,f_ibp) VF3(189,DClonglong,DCbool,DCpointer,f_lbp) VF3(190,DCdouble,DCbool,DCpointer,f_dbp) VF3(191,DCpointer,DCbool,DCpointer,f_pbp) VF3(192,DCfloat,DCbool,DCpointer,f_fbp) VF3(193,DCbool,DCint,DCpointer,f_bip) VF3(194,DCint,DCint,DCpointer,f_iip) VF3(195,DClonglong,DCint,DCpointer,f_lip) VF3(196,DCdouble,DCint,DCpointer,f_dip) VF3(197,DCpointer,DCint,DCpointer,f_pip) VF3(198,DCfloat,DCint,DCpointer,f_fip) VF3(199,DCbool,DClonglong,DCpointer,f_blp) VF3(200,DCint,DClonglong,DCpointer,f_ilp) VF3(201,DClonglong,DClonglong,DCpointer,f_llp) VF3(202,DCdouble,DClonglong,DCpointer,f_dlp) VF3(203,DCpointer,DClonglong,DCpointer,f_plp) VF3(204,DCfloat,DClonglong,DCpointer,f_flp) VF3(205,DCbool,DCdouble,DCpointer,f_bdp) VF3(206,DCint,DCdouble,DCpointer,f_idp) VF3(207,DClonglong,DCdouble,DCpointer,f_ldp) VF3(208,DCdouble,DCdouble,DCpointer,f_ddp) VF3(209,DCpointer,DCdouble,DCpointer,f_pdp) VF3(210,DCfloat,DCdouble,DCpointer,f_fdp) VF3(211,DCbool,DCpointer,DCpointer,f_bpp) VF3(212,DCint,DCpointer,DCpointer,f_ipp) VF3(213,DClonglong,DCpointer,DCpointer,f_lpp) VF3(214,DCdouble,DCpointer,DCpointer,f_dpp) VF3(215,DCpointer,DCpointer,DCpointer,f_ppp) VF3(216,DCfloat,DCpointer,DCpointer,f_fpp) VF3(217,DCbool,DCfloat,DCpointer,f_bfp) VF3(218,DCint,DCfloat,DCpointer,f_ifp) VF3(219,DClonglong,DCfloat,DCpointer,f_lfp) VF3(220,DCdouble,DCfloat,DCpointer,f_dfp) VF3(221,DCpointer,DCfloat,DCpointer,f_pfp) VF3(222,DCfloat,DCfloat,DCpointer,f_ffp) VF3(223,DCbool,DCbool,DCfloat,f_bbf) VF3(224,DCint,DCbool,DCfloat,f_ibf) VF3(225,DClonglong,DCbool,DCfloat,f_lbf) VF3(226,DCdouble,DCbool,DCfloat,f_dbf) VF3(227,DCpointer,DCbool,DCfloat,f_pbf) VF3(228,DCfloat,DCbool,DCfloat,f_fbf) VF3(229,DCbool,DCint,DCfloat,f_bif) VF3(230,DCint,DCint,DCfloat,f_iif) VF3(231,DClonglong,DCint,DCfloat,f_lif) VF3(232,DCdouble,DCint,DCfloat,f_dif) VF3(233,DCpointer,DCint,DCfloat,f_pif) VF3(234,DCfloat,DCint,DCfloat,f_fif) VF3(235,DCbool,DClonglong,DCfloat,f_blf) VF3(236,DCint,DClonglong,DCfloat,f_ilf) VF3(237,DClonglong,DClonglong,DCfloat,f_llf) VF3(238,DCdouble,DClonglong,DCfloat,f_dlf) VF3(239,DCpointer,DClonglong,DCfloat,f_plf) VF3(240,DCfloat,DClonglong,DCfloat,f_flf) VF3(241,DCbool,DCdouble,DCfloat,f_bdf) VF3(242,DCint,DCdouble,DCfloat,f_idf) VF3(243,DClonglong,DCdouble,DCfloat,f_ldf) VF3(244,DCdouble,DCdouble,DCfloat,f_ddf) VF3(245,DCpointer,DCdouble,DCfloat,f_pdf) VF3(246,DCfloat,DCdouble,DCfloat,f_fdf) VF3(247,DCbool,DCpointer,DCfloat,f_bpf) VF3(248,DCint,DCpointer,DCfloat,f_ipf) VF3(249,DClonglong,DCpointer,DCfloat,f_lpf) VF3(250,DCdouble,DCpointer,DCfloat,f_dpf) VF3(251,DCpointer,DCpointer,DCfloat,f_ppf) VF3(252,DCfloat,DCpointer,DCfloat,f_fpf) VF3(253,DCbool,DCfloat,DCfloat,f_bff) VF3(254,DCint,DCfloat,DCfloat,f_iff) VF3(255,DClonglong,DCfloat,DCfloat,f_lff) VF3(256,DCdouble,DCfloat,DCfloat,f_dff) VF3(257,DCpointer,DCfloat,DCfloat,f_pff) VF3(258,DCfloat,DCfloat,DCfloat,f_fff) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/config.h0000644000175000017500000000201712456307246023110 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32std/config.h Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* auto generated by mkcase (on stderr) */ #define NARGS 3 #define NTYPES 6 MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/dynMakefile0000644000175000017500000000032412456307246023644 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/main.cc0000644000175000017500000001013012456307246022720 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/suite_x86win32std/main.cc Description: License: Copyright (c) 2007-2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "config.h" #include "../../dyncall/dyncall_value.h" #include #include "../common/platformInit.h" int getId(); DCpointer getFunc(int x); DCValue* getArg(int pos); typedef double precise; DCbool valueBool[NARGS]; DCshort valueShort[NARGS]; DCchar valueChar[NARGS]; DCint valueInt[NARGS]; DClonglong valueLongLong[NARGS]; DCdouble valueDouble[NARGS]; DCpointer valuePointer[NARGS]; DCfloat valueFloat[NARGS]; bool equals(int select, int pos, void* data) { switch(select) { case 0: return ( getArg(pos)->B == valueBool[pos] ); break; case 1: return ( getArg(pos)->i == valueInt[pos] ); break; case 2: return ( getArg(pos)->L == valueLongLong[pos] ); break; case 3: return ( getArg(pos)->d == valueDouble[pos] ); break; case 4: return ( getArg(pos)->p == valuePointer[pos] ); break; case 5: return ( getArg(pos)->f == valueFloat[pos] ); break; } return false; } void clearValues(); void init() { for (int i = 0 ; i < NARGS ; ++i ) { valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE ); valueInt[i] = DCint(i); valueLongLong[i] = DClonglong(i); valueDouble[i] = DCdouble(i); valuePointer[i] = DCpointer(i); valueFloat[i] = DCfloat(i); } } void push(DCCallVM* pCall, int select, int pos) { switch(select) { case 0: dcArgBool( pCall, valueBool[pos] ); break; case 1: dcArgInt( pCall, valueInt[pos] ); break; case 2: dcArgLongLong( pCall, valueLongLong[pos] ); break; case 3: dcArgDouble( pCall, valueDouble[pos] ); break; case 4: dcArgPointer( pCall, valuePointer[pos] ); break; case 5: dcArgFloat( pCall, valueFloat[pos] ); break; } } #define assert(x) if (!(x)) return false bool test(int x) { clearValues(); DCCallVM* pCall = dcNewCallVM(4096); dcMode(pCall, DC_CALL_C_X86_WIN32_STD); dcReset(pCall); int y = x; int selects[NARGS] = { 0, }; int pos = 0; for(pos = 0;y>0;++pos) { int select = (y-1) % NTYPES; selects[pos] = select; push(pCall,select,pos); y = (y-1) / NTYPES; } dcCallVoid(pCall,getFunc(x)); assert( getId() == x ); for(int i = 0;i( pow((double)x,n)+powerfact(x,n-1) ); } #include #include bool run_range(int from, int to) { bool tr = true; for (int i = from ; i < to ; ++i ) { printf("%d:",i); bool r = test(i); printf("%d\n", r); tr &= r; } return tr; } extern "C" { int main(int argc, char* argv[]) { dcTest_initPlatform(); bool success = false; init(); if (argc == 2) { int index = atoi(argv[1]); success = run_range( index, index+1 ); } else if (argc == 3) { int from = atoi(argv[1]); int to = atoi(argv[2])+1; success = run_range(from,to); } else { int ncalls = powerfact(NTYPES,NARGS)+1; success = run_range(0,ncalls); } printf("result: suite_x86win32std: %s\n", success ? "1" : "0"); dcTest_deInitPlatform(); return (success) ? 0 : -1; } } // extern "C" MoarVM-2015.11/3rdparty/dyncall/test/suite_x86win32std/mkcase.py0000644000175000017500000000361012456307246023307 0ustar jnthnjnthn#!/usr/bin/python #////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// import sys # parameters nargs = 3 types = ["DCbool","DCint","DClonglong","DCdouble","DCpointer","DCfloat"] # generator ntypes = len(types) sys.stderr.write("/* auto generated by mkcase (on stderr) */\n"); sys.stderr.write("".join(["#define NARGS ",str(nargs),"\n"])) sys.stderr.write("".join(["#define NTYPES ",str(ntypes),"\n"])) def powerfact(x, n): if n==0: return 0 else: return x**n+powerfact(x,n-1) x = 0 end = powerfact(ntypes,nargs)+1 sys.stdout.write("/* auto generated by mkcase.py (on stdout) */\n"); while x < end: args = [str(x)] sig = ["f_"] pos = 0 y = x while y > 0: s = (y-1) % ntypes y = (y-1) / ntypes args += [ types[s] ] sig += [ types[s][2] ] pos += 1 sig = "".join(sig) args += [ sig ] args = ",".join(args) sys.stdout.write( "".join(["VF",str(pos),"(",args,")\n"]) ) x += 1 MoarVM-2015.11/3rdparty/dyncall/test/syscall/CMakeLists.txt0000644000175000017500000000011412456307246022444 0ustar jnthnjnthnadd_executable(syscall syscall.c) target_link_libraries(syscall dyncall_s) MoarVM-2015.11/3rdparty/dyncall/test/syscall/Makefile.M0000644000175000017500000000015312456307246021542 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/syscall/Makefile.embedded0000644000175000017500000000045112502366750023075 0ustar jnthnjnthnAPP = syscall OBJS = syscall.o SRCTOP = ../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDFLAGS += -L${BLDTOP}/dyncall LDLIBS += -ldyncall_s LINK = ${CC} all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/syscall/Makefile.generic0000644000175000017500000000055512456307246022770 0ustar jnthnjnthnAPP = syscall OBJS = syscall.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncall -ldyncall_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/syscall/dynMakefile0000644000175000017500000000032412456307246022062 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/syscall/syscall.c0000644000175000017500000000275012466674236021541 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/syscall/syscall.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "dyncall.h" #include #include DCCallVM* callvm; void syscallvm_init() { callvm = dcNewCallVM(4096); dcMode(callvm, DC_CALL_SYS_DEFAULT); assert( dcGetError(callvm) == 0 ); } int syscall_write(int fd, char* buf, size_t len) { dcReset(callvm); dcArgInt(callvm, fd); dcArgPointer(callvm, buf); dcArgInt(callvm, len); return dcCallInt(callvm, (DCpointer)(ptrdiff_t)SYS_write); } int main(int argc, char* argv[]) { syscallvm_init(); syscall_write(1/*stdout*/, "result: syscall: 1\n", 19); return 0; } MoarVM-2015.11/3rdparty/dyncall/test/thunk/CMakeLists.txt0000644000175000017500000000013112456307246022122 0ustar jnthnjnthnadd_executable(test_thunk test_thunk.c) target_link_libraries(test_thunk dyncallback_s) MoarVM-2015.11/3rdparty/dyncall/test/thunk/Makefile.M0000644000175000017500000000015312456307246021221 0ustar jnthnjnthn#include "../../buildsys/dynmake/Makefile.base.M" all: echo not impl!!! clean: echo not impl!!! MoarVM-2015.11/3rdparty/dyncall/test/thunk/Makefile.embedded0000644000175000017500000000051212502366750022552 0ustar jnthnjnthnAPP = thunk OBJS = test_thunk.o SRCTOP = ../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncallback -I${SRCTOP}/dyncall LDFLAGS += -L${BLDTOP}/dyncallback LDLIBS += -ldyncallback_s LINK = ${CC} all: ${APP} .PHONY: all clean ${APP}: ${OBJS} ${CC} ${OBJS} ${LDFLAGS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} MoarVM-2015.11/3rdparty/dyncall/test/thunk/Makefile.generic0000644000175000017500000000060212456307246022440 0ustar jnthnjnthnAPP = thunk OBJS = test_thunk.o SRCTOP = ${VPATH}/../.. BLDTOP = ../.. CFLAGS += -I${SRCTOP}/dyncallback -I${SRCTOP}/dyncall LDLIBS += -L${BLDTOP}/dyncallback -ldyncallback_s .PHONY: all clean install all: ${APP} ${APP}: ${OBJS} ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} ${LDLIBS} -o ${APP} clean: rm -f ${APP} ${OBJS} install: mkdir -p ${PREFIX}/test cp ${APP} ${PREFIX}/test MoarVM-2015.11/3rdparty/dyncall/test/thunk/Nmakefile0000644000175000017500000000367712456307246021222 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2007,2009 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////// # # nmake makefile # Nmakefile # #/////////////////////////////////////////////////// TOP = ..\.. !INCLUDE $(TOP)\buildsys\nmake\prolog.nmake !IF "$(BUILD_OS)" == "windows" TARGETS = thunk.exe OBJS = test_thunk.obj# ..\testmain\main_ansic.obj $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) /OUT:"$@" $(LDFLAGS) $(OBJS) $(TOP)\dyncall\libdyncall_s.lib $(TOP)\dyncallback\libdyncallback_s.lib !ELSE IF "$(BUILD_OS)" == "nds" TARGETS = thunk.nds OBJS = test_thunk.o# ..\testmain\main_NDS.o $(TARGETS): $(OBJS) echo Linking $@ ... $(LD) $(LDFLAGS) $(OBJS) $(DEVKITPRO_PATH)\libnds\lib\libnds9.a $(TOP)/dyncall/libdyncall_s.a $(TOP)\dyncallback\libdyncallback_s.a -o "$(@B).elf" $(OCP) -O binary "$(@B).elf" "$(@B).arm9" ndstool -c "$@" -9 "$(@B).arm9" del "$(@B).elf" "$(@B).arm9" !ENDIF !INCLUDE $(TOP)\buildsys\nmake\epilog.nmake MoarVM-2015.11/3rdparty/dyncall/test/thunk/dynMakefile0000644000175000017500000000032412456307246021541 0ustar jnthnjnthnall: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) all $(MAKE) && exit || sh $(?:bat=sh) all $(MAKE) clean: ./../../buildsys/dynmake/dynmake.bat $(?:/=\\) clean $(MAKE) && exit || sh $(?:bat=sh) clean $(MAKE) MoarVM-2015.11/3rdparty/dyncall/test/thunk/mkfile0000644000175000017500000000223712456307246020565 0ustar jnthnjnthn#////////////////////////////////////////////////////////////////////////////// # # Copyright (c) 2013 Daniel Adler , # Tassilo Philipp # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # #////////////////////////////////////////////////////////////////////////////// TOP = ../.. <$TOP/buildsys/mk/prolog.mk UNITS = test_thunk APPLICATION = thunk LIBS = $TOP/dyncallback/libdyncallback_s.a$O <$TOP/buildsys/mk/epilog.mk MoarVM-2015.11/3rdparty/dyncall/test/thunk/test_thunk.c0000644000175000017500000000431412456307246021725 0ustar jnthnjnthn/* Package: dyncall Library: test File: test/thunk/test_thunk.c Description: License: Copyright (c) 2011 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "../../dyncall/dyncall.h" #include "../../dyncallback/dyncall_thunk.h" #include "../../dyncallback/dyncall_alloc_wx.h" #include "../common/platformInit.h" /** ** test: thunks with several allocation modes ** such as on stack, on heap and explicit wx ** **/ #include #include #include void my_entry(const char* text) { printf("%s: 1\n", text); } typedef void (printfun)(const char*); void test_stack() { DCThunk t; printfun* fp; dcbInitThunk(&t, &my_entry); fp = (printfun*)&t; fp("stack"); } #include void test_heap() { printfun* fp; DCThunk* p = (DCThunk*)malloc(sizeof(DCThunk)); if(!p) { printf("0\n"); return; } dcbInitThunk(p, &my_entry); fp = (printfun*)p; fp("heap"); free(p); } void test_wx() { DCThunk* p; printfun* fp; int err = dcAllocWX(sizeof(DCThunk), (void**)&p); if(err || !p) { printf("0\n"); return; } dcbInitThunk(p, &my_entry); fp = (printfun*)p; fp("wx"); dcFreeWX((void*)p, sizeof(DCThunk)); } int main() { dcTest_initPlatform(); printf("Allocating ...\n"); printf("... W^X memory: "); test_wx(); printf("... heap memory: "); test_heap(); printf("... stack memory: "); test_stack(); dcTest_deInitPlatform(); return 0; } MoarVM-2015.11/3rdparty/libuv/.gitignore0000644000175000017500000000133212502366750016736 0ustar jnthnjnthn*.swp *.[oa] *.l[oa] *.opensdf *.orig *.pyc *.sdf *.suo core vgcore.* .buildstamp .dirstamp .deps/ /.libs/ /aclocal.m4 /ar-lib /autom4te.cache/ /compile /config.guess /config.log /config.status /config.sub /configure /depcomp /install-sh /libtool /libuv.a /libuv.dylib /libuv.pc /libuv.so /ltmain.sh /missing /test-driver Makefile Makefile.in # Generated by gyp for android *.target.mk /out/ /build/gyp /test/.libs/ /test/run-tests /test/run-tests.exe /test/run-tests.dSYM /test/run-benchmarks /test/run-benchmarks.exe /test/run-benchmarks.dSYM *.sln *.vcproj *.vcxproj *.vcxproj.filters *.vcxproj.user _UpgradeReport_Files/ UpgradeLog*.XML Debug Release ipch # sphinx generated files /docs/build/ *.xcodeproj *.xcworkspace MoarVM-2015.11/3rdparty/libuv/.mailmap0000644000175000017500000000322412502366750016371 0ustar jnthnjnthnAaron Bieber Alan Gutierrez Andrius Bentkus Bert Belder Bert Belder Brandon Philips Brian White Brian White Caleb James DeLisle Christoph Iserlohn Fedor Indutny Frank Denis Isaac Z. Schlueter Justin Venus Keno Fischer Keno Fischer Leonard Hecker Maciej MaÅ‚ecki Marc Schlaich Rasmus Christian Pedersen Rasmus Christian Pedersen Rasmus Pedersen Robert Mustacchi Ryan Dahl Ryan Emery Sam Roberts San-Tai Hsu Saúl Ibarra Corretgé Shigeki Ohtsu Timothy J. Fontaine Yasuhiro Matsumoto Yazhong Liu Yuki Okumura MoarVM-2015.11/3rdparty/libuv/AUTHORS0000644000175000017500000001450312502366750016022 0ustar jnthnjnthn# Authors ordered by first contribution. Ryan Dahl Bert Belder Josh Roesslein Alan Gutierrez Joshua Peek Igor Zinkovsky San-Tai Hsu Ben Noordhuis Henry Rawas Robert Mustacchi Matt Stevens Paul Querna Shigeki Ohtsu Tom Hughes Peter Bright Jeroen Janssen Andrea Lattuada Augusto Henrique Hentz Clifford Heath Jorge Chamorro Bieling Luis Lavena Matthew Sporleder Erick Tryzelaar Isaac Z. Schlueter Pieter Noordhuis Marek Jelen Fedor Indutny Saúl Ibarra Corretgé Felix Geisendörfer Yuki Okumura Roman Shtylman Frank Denis Carter Allen Tj Holowaychuk Shimon Doodkin Ryan Emery Bruce Mitchener Maciej MaÅ‚ecki Yasuhiro Matsumoto Daisuke Murase Paddy Byers Dan VerWeire Brandon Benvie Brandon Philips Nathan Rajlich Charlie McConnell Vladimir Dronnikov Aaron Bieber Bulat Shakirzyanov Brian White Erik Dubbelboer Keno Fischer Ira Cooper Andrius Bentkus Iñaki Baz Castillo Mark Cavage George Yohng Xidorn Quan Roman Neuhauser Shuhei Tanuma Bryan Cantrill Trond Norbye Tim Holy Prancesco Pertugio Leonard Hecker Andrew Paprocki Luigi Grilli Shannen Saez Artur Adib Hiroaki Nakamura Ting-Yu Lin Stephen Gallagher Shane Holloway Andrew Shaffer Vlad Tudose Ben Leslie Tim Bradshaw Timothy J. Fontaine Marc Schlaich Brian Mazza Elliot Saba Ben Kelly Nils Maier Nicholas Vavilov Miroslav BajtoÅ¡ Sean Silva Wynn Wilkes Linus MÃ¥rtensson Andrei Sedoi Navaneeth Kedaram Nambiathan Alex Crichton Brent Cook Brian Kaisner Luca Bruno Reini Urban Maks Naumov Sean Farrell Chris Bank Geert Jansen Christoph Iserlohn Steven Kabbes Alex Gaynor huxingyi Tenor Biel Andrej Manduch Joshua Neuheisel Alexis Campailla Yazhong Liu Sam Roberts River Tarnell Nathan Sweet Luca Bruno Trevor Norris Oguz Bastemur Dylan Cali Austin Foxley Benjamin Saunders Geoffry Song Rasmus Christian Pedersen William Light Oleg Efimov Lars Gierth Rasmus Christian Pedersen Justin Venus Kristian Evensen Linus MÃ¥rtensson Navaneeth Kedaram Nambiathan Yorkie StarWing thierry-FreeBSD Isaiah Norton Raul Martins David Capello Paul Tan Javier Hernández Tonis Tiigi Norio Kobota æŽæ¸¯å¹³ Chernyshev Viacheslav Stephen von Takach JD Ballard Luka Perkov Ryan Cole HungMingWu Jay Satiro Leith Bade Peter Atashian Tim Cooper Caleb James DeLisle Jameson Nash Graham Lee Andrew Low Pavel Platto Tony Kelman John Firebaugh lilohuang Paul Goldsmith Julien Gilli Michael Hudson-Doyle Recep ASLANTAS Rob Adams Zachary Newman Robin Hahling Jeff Widman cjihrig Tomasz KoÅ‚odziejski Unknown W. Brackets Emmanuel Odeke Mikhail Mukovnikov Thorsten Lorenz Yuri D'Elia Manos Nikolaidis MoarVM-2015.11/3rdparty/libuv/CONTRIBUTING.md0000644000175000017500000001255512502366750017210 0ustar jnthnjnthn# CONTRIBUTING The libuv project welcomes new contributors. This document will guide you through the process. ### FORK Fork the project [on GitHub](https://github.com/joyent/libuv) and check out your copy. ``` $ git clone https://github.com/username/libuv.git $ cd libuv $ git remote add upstream https://github.com/joyent/libuv.git ``` Now decide if you want your feature or bug fix to go into the master branch or the stable branch. As a rule of thumb, bug fixes go into the stable branch while new features go into the master branch. The stable branch is effectively frozen; patches that change the libuv API/ABI or affect the run-time behavior of applications get rejected. In case of doubt, open an issue in the [issue tracker][], post your question to the [libuv mailing list], or contact one of project maintainers (@bnoordhuis, @piscisaureus, @indutny or @saghul) on [IRC][]. Especially do so if you plan to work on something big. Nothing is more frustrating than seeing your hard work go to waste because your vision does not align with that of a project maintainers. ### BRANCH Okay, so you have decided on the proper branch. Create a feature branch and start hacking: ``` $ git checkout -b my-feature-branch -t origin/v1.x ``` (Where v1.x is the latest stable branch as of this writing.) ### CODE Please adhere to libuv's code style. In general it follows the conventions from the [Google C/C++ style guide]. Some of the key points, as well as some additional guidelines, are enumerated below. * Code that is specific to unix-y platforms should be placed in `src/unix`, and declarations go into `src/uv-unix.h`. * Source code that is Windows-specific goes into `src/win`, and related publicly exported types, functions and macro declarations should generally be declared in `include/uv-win.h`. * Names should be descriptive and concise. * All the symbols and types that libuv makes available publicly should be prefixed with `uv_` (or `UV_` in case of macros). * Internal, non-static functions should be prefixed with `uv__`. * Use two spaces and no tabs. * Lines should be wrapped at 80 characters. * Ensure that lines have no trailing whitespace, and use unix-style (LF) line endings. * Use C89-compliant syntax. In other words, variables can only be declared at the top of a scope (function, if/for/while-block). * When writing comments, use properly constructed sentences, including punctuation. * When documenting APIs and/or source code, don't make assumptions or make implications about race, gender, religion, political orientation or anything else that isn't relevant to the project. * Remember that source code usually gets written once and read often: ensure the reader doesn't have to make guesses. Make sure that the purpose and inner logic are either obvious to a reasonably skilled professional, or add a comment that explains it. ### COMMIT Make sure git knows your name and email address: ``` $ git config --global user.name "J. Random User" $ git config --global user.email "j.random.user@example.com" ``` Writing good commit logs is important. A commit log should describe what changed and why. Follow these guidelines when writing one: 1. The first line should be 50 characters or less and contain a short description of the change prefixed with the name of the changed subsystem (e.g. "net: add localAddress and localPort to Socket"). 2. Keep the second line blank. 3. Wrap all other lines at 72 columns. A good commit log looks like this: ``` subsystem: explaining the commit in one line Body of commit message is a few lines of text, explaining things in more detail, possibly giving some background about the issue being fixed, etc etc. The body of the commit message can be several paragraphs, and please do proper word-wrap and keep columns shorter than about 72 characters or so. That way `git log` will show things nicely even when it is indented. ``` The header line should be meaningful; it is what other people see when they run `git shortlog` or `git log --oneline`. Check the output of `git log --oneline files_that_you_changed` to find out what subsystem (or subsystems) your changes touch. ### REBASE Use `git rebase` (not `git merge`) to sync your work from time to time. ``` $ git fetch upstream $ git rebase upstream/v1.x # or upstream/master ``` ### TEST Bug fixes and features should come with tests. Add your tests in the `test/` directory. Tests also need to be registered in `test/test-list.h`. Look at other tests to see how they should be structured (license boilerplate, the way entry points are declared, etc.). Check README.md file to find out how to run the test suite and make sure that there are no test regressions. ### PUSH ``` $ git push origin my-feature-branch ``` Go to https://github.com/username/libuv and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days. If there are comments to address, apply your changes in a separate commit and push that to your feature branch. Post a comment in the pull request afterwards; GitHub does not send out notifications when you add commits. [issue tracker]: https://github.com/joyent/libuv/issues [libuv mailing list]: http://groups.google.com/group/libuv [IRC]: http://webchat.freelibuv.net/?channels=libuv [Google C/C++ style guide]: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml MoarVM-2015.11/3rdparty/libuv/ChangeLog0000644000175000017500000013434312502366750016531 0ustar jnthnjnthn2014.11.21, Version 1.0.0 (Stable) Changes since version 1.0.0-rc2: * doc: fix git/svn url for gyp repo in README (Emmanuel Odeke) * windows: fix fs_read with nbufs > 1 and offset (Unknown W. Brackets) * win: add missing IP_ADAPTER_UNICAST_ADDRESS_LH definition for MinGW (huxingyi) * doc: mention homebrew in README (Mikhail Mukovnikov) * doc: add learnuv workshop to README (Thorsten Lorenz) * doc: fix parameter name in uv_fs_access (Saúl Ibarra Corretgé) * unix: use cfmakeraw() for setting raw TTY mode (Yuri D'Elia) * win: fix uv_thread_self() (Alexis Campailla) * build: add x32 support to gyp build (Ben Noordhuis) * build: remove dtrace probes (Ben Noordhuis) * doc: fix link in misc.rst (Manos Nikolaidis) * mailmap: remove duplicated entries (Saúl Ibarra Corretgé) * gyp: fix comment regarding version info location (Saúl Ibarra Corretgé) 2014.10.21, Version 1.0.0-rc2 (Pre-release) Changes since version 1.0.0-rc1: * build: add missing fixtures to distribution tarball (Rob Adams) * doc: update references to current stable branch (Zachary Newman) * fs: fix readdir on empty directory (Fedor Indutny) * fs: rename uv_fs_readdir to uv_fs_scandir (Saúl Ibarra Corretgé) * doc: document uv_alloc_cb (Saúl Ibarra Corretgé) * doc: add migration guide from version 0.10 (Saúl Ibarra Corretgé) * build: add DragonFly BSD support in autotools (Robin Hahling) * doc: document missing stream related structures (Saúl Ibarra Corretgé) * doc: clarify uv_loop_t.data field lifetime (Saúl Ibarra Corretgé) * doc: add documentation for missing functions and structures (Saúl Ibarra Corretgé) * doc: fix punctuation and grammar in README (Jeff Widman) * windows: return libuv error codes in uv_poll_init() (cjihrig) * unix, windows: add uv_fs_access() (cjihrig) * windows: fix netmask detection (Alexis Campailla) * unix, windows: don't include null byte in uv_cwd size (Saúl Ibarra Corretgé) * unix, windows: add uv_thread_equal (Tomasz KoÅ‚odziejski) * windows: fix fs_write with nbufs > 1 and offset (Unknown W. Brackets) 2014.09.18, Version 1.0.0-rc1 (Unstable), 0c28bbf7b42882853d1799ab96ff68b07f7f8d49 Changes since version 0.11.29: * windows: improve timer precision (Alexis Campailla) * build, gyp: set xcode flags (Recep ASLANTAS) * ignore: include m4 files which are created manually (Recep ASLANTAS) * build: add m4 for feature/flag-testing (Recep ASLANTAS) * ignore: ignore Xcode project and workspace files (Recep ASLANTAS) * unix: fix warnings about dollar symbol usage in identifiers (Recep ASLANTAS) * unix: fix warnings when loading functions with dlsym (Recep ASLANTAS) * linux: try epoll_pwait if epoll_wait is missing (Michael Hudson-Doyle) * test: add test for closing and recreating default loop (Saúl Ibarra Corretgé) * windows: properly close the default loop (Saúl Ibarra Corretgé) * version: add ability to specify a version suffix (Saúl Ibarra Corretgé) * doc: add API documentation (Saúl Ibarra Corretgé) * test: don't close connection on write error (Trevor Norris) * windows: further simplify the code for timers (Saúl Ibarra Corretgé) * gyp: remove UNLIMITED_SELECT from dependent define (Fedor Indutny) * darwin: allocate enough space for select() hack (Fedor Indutny) * unix, windows: don't allow a NULL callback on timers (Saúl Ibarra Corretgé) * windows: simplify code in uv_timer_again (Saúl Ibarra Corretgé) * test: use less requests on tcp-write-queue-order (Saúl Ibarra Corretgé) * unix: stop child process watcher after last one exits (Saúl Ibarra Corretgé) * unix: simplify how process handle queue is managed (Saúl Ibarra Corretgé) * windows: remove duplicated field (mattn) * core: add a reserved field to uv_handle_t and uv_req_t (Saúl Ibarra Corretgé) * windows: fix buffer leak after failed udp send (Bert Belder) * windows: make sure sockets and handles are reset on close (Saúl Ibarra Corretgé) * unix, windows: add uv_fileno (Saúl Ibarra Corretgé) * build: use same CFLAGS in autotools build as in gyp (Saúl Ibarra Corretgé) * build: remove unneeded define in uv.gyp (Saúl Ibarra Corretgé) * test: fix watcher_cross_stop on Windows (Saúl Ibarra Corretgé) * unix, windows: move includes for EAI constants (Saúl Ibarra Corretgé) * unix: fix exposing EAI_* glibc-isms (Saúl Ibarra Corretgé) * unix: fix tcp write after bad connect freezing (Andrius Bentkus) 2014.08.20, Version 0.11.29 (Unstable), 35451fed830807095bbae8ef981af004a4b9259e Changes since version 0.11.28: * windows: make uv_read_stop immediately stop reading (Jameson Nash) * windows: fix uv__getaddrinfo_translate_error (Alexis Campailla) * netbsd: fix build (Saúl Ibarra Corretgé) * unix, windows: add uv_recv_buffer_size and uv_send_buffer_size (Andrius Bentkus) * windows: add support for UNC paths on uv_spawn (Paul Goldsmith) * windows: replace use of inet_addr with uv_inet_pton (Saúl Ibarra Corretgé) * unix: replace some asserts with returning errors (Andrius Bentkus) * windows: use OpenBSD implementation for uv_fs_mkdtemp (Pavel Platto) * windows: fix GetNameInfoW error handling (Alexis Campailla) * fs: introduce uv_readdir_next() and report types (Fedor Indutny) * fs: extend reported types in uv_fs_readdir_next (Saúl Ibarra Corretgé) * unix: read on stream even when UV__POLLHUP set. (Julien Gilli) 2014.08.08, Version 0.11.28 (Unstable), fc9e2a0bc487b299c0cd3b2c9a23aeb554b5d8d1 Changes since version 0.11.27: * unix, windows: const-ify handle in uv_udp_getsockname (Rasmus Pedersen) * windows: use UV_ECANCELED for aborted TCP writes (Saúl Ibarra Corretgé) * windows: add more required environment variables (Jameson Nash) * windows: sort environment variables before calling CreateProcess (Jameson Nash) * unix, windows: move uv_loop_close out of assert (John Firebaugh) * windows: fix buffer overflow on uv__getnameinfo_work() (lilohuang) * windows: add uv_backend_timeout (Jameson Nash) * test: disable tcp_close_accept on Windows (Saúl Ibarra Corretgé) * windows: read the PATH env var of the child (Alex Crichton) * include: avoid using C++ 'template' reserved word (Iñaki Baz Castillo) * include: fix version number (Saúl Ibarra Corretgé) 2014.07.32, Version 0.11.27 (Unstable), ffe24f955032d060968ea0289af365006afed55e Changes since version 0.11.26: * unix, windows: use the same threadpool implementation (Saúl Ibarra Corretgé) * unix: use struct sockaddr_storage for target UDP addr (Saúl Ibarra Corretgé) * doc: add documentation to uv_udp_start_recv (Andrius Bentkus) * common: use common uv__count_bufs code (Andrius Bentkus) * unix, win: add send_queue_size and send_queue_count to uv_udp_t (Andrius Bentkus) * unix, win: add uv_udp_try_send (Andrius Bentkus) * unix: return UV_EAGAIN if uv_try_write cannot write any data (Saúl Ibarra Corretgé) * windows: fix compatibility with cygwin pipes (Jameson Nash) * windows: count queued bytes even if request completed immediately (Saúl Ibarra Corretgé) * windows: disable CRT debug handler on MinGW32 (Saúl Ibarra Corretgé) * windows: map ERROR_INVALID_DRIVE to UV_ENOENT (Saúl Ibarra Corretgé) * unix: try to write immediately in uv_udp_send (Saúl Ibarra Corretgé) * unix: remove incorrect assert (Saúl Ibarra Corretgé) * openbsd: avoid requiring privileges for uv_resident_set_memory (Aaron Bieber) * unix: guarantee write queue cb execution order in streams (Andrius Bentkus) * img: add logo files (Saúl Ibarra Corretgé) * aix: improve AIX compatibility (Andrew Low) * windows: return bind error immediately when implicitly binding (Saúl Ibarra Corretgé) * windows: don't use atexit for cleaning up the threadpool (Saúl Ibarra Corretgé) * windows: destroy work queue elements when colsing a loop (Saúl Ibarra Corretgé) * unix, windows: add uv_fs_mkdtemp (Pavel Platto) * build: handle platforms without multiprocessing.synchronize (Saúl Ibarra Corretgé) * windows: change GENERIC_ALL to GENERIC_WRITE in fs__create_junction (Tony Kelman) * windows: relay TCP bind errors via ipc (Alexis Campailla) 2014.06.28, Version 0.11.26 (Unstable), 115281a1058c4034d5c5ccedacb667fe3f6327ea Changes since version 0.11.25: * windows: add VT100 codes ?25l and ?25h (JD Ballard) * windows: add invert ANSI (7 / 27) emulation (JD Ballard) * unix: fix handling error on UDP socket creation (Saúl Ibarra Corretgé) * unix, windows: getnameinfo implementation (Rasmus Pedersen) * heap: fix `heap_remove()` (Fedor Indutny) * unix, windows: fix parsing scoped IPv6 addresses (Saúl Ibarra Corretgé) * windows: fix handling closed socket while poll handle is closing (Saúl Ibarra Corretgé) * thread: barrier functions (Ben Noordhuis) * windows: fix PYTHON environment variable usage (Jay Satiro) * unix, windows: return system error on EAI_SYSTEM (Saúl Ibarra Corretgé) * windows: fix handling closed socket while poll handle is closing (Saúl Ibarra Corretgé) * unix: don't run i/o callbacks after prepare callbacks (Saúl Ibarra Corretgé) * windows: add tty unicode support for input (Peter Atashian) * header: introduce `uv_loop_size()` (Andrius Bentkus) * darwin: invoke `mach_timebase_info` only once (Fedor Indutny) 2014.05.02, Version 0.11.25 (Unstable), 2acd544cff7142e06aa3b09ec64b4a33dd9ab996 Changes since version 0.11.24: * osx: pass const handle pointer to uv___stream_fd (Chernyshev Viacheslav) * unix, windows: pass const handle ptr to uv_tcp_get*name (Chernyshev Viacheslav) * common: pass const sockaddr ptr to uv_ip*_name (Chernyshev Viacheslav) * unix, windows: validate flags on uv_udp|tcp_bind (Saúl Ibarra Corretgé) * unix: handle case when addr is not initialized after recvmsg (Saúl Ibarra Corretgé) * unix, windows: uv_now constness (Rasmus Pedersen) 2014.04.15, Version 0.11.24 (Unstable), ed948c29f6e8c290f79325a6f0bc9ef35bcde644 Changes since version 0.11.23: * linux: reduce file descriptor count of async pipe (Ben Noordhuis) * sunos: support IPv6 qualified link-local addresses (Saúl Ibarra Corretgé) * windows: fix opening of read-only stdin pipes (Alexis Campailla) * windows: Fix an infinite loop in uv_spawn (Alex Crichton) * windows: fix console signal handler refcount (æŽæ¸¯å¹³) * inet: allow scopeid in uv_inet_pton (Fedor Indutny) 2014.04.07, Version 0.11.23 (Unstable), e54de537efcacd593f36fcaaf8b4cb9e64313275 Changes since version 0.11.22: * fs: avoid using readv/writev where possible (Fedor Indutny) * mingw: fix build with autotools (Saúl Ibarra Corretgé) * bsd: support IPv6 qualified link-local addresses (Saúl Ibarra Corretgé) * unix: add UV_HANDLE_IPV6 flag to tcp and udp handles (Saúl Ibarra Corretgé) * unix, windows: do not set SO_REUSEADDR by default on udp (Saúl Ibarra Corretgé) * windows: fix check in uv_tty_endgame() (Maks Naumov) * unix, windows: add IPv6 support for uv_udp_multicast_interface (Saúl Ibarra Corretgé) * unix: fallback to blocking writes if reopening a tty fails (Saúl Ibarra Corretgé) * unix: fix handling uv__open_cloexec failure (Saúl Ibarra Corretgé) * unix, windows: add IPv6 support to uv_udp_set_membership (Saúl Ibarra Corretgé) * unix, windows: removed unused status parameter (Saúl Ibarra Corretgé) * android: add support of ifaddrs in android (Javier Hernández) * build: fix SunOS and AIX build with autotools (Saúl Ibarra Corretgé) * build: freebsd link with libelf if dtrace enabled (Saúl Ibarra Corretgé) * stream: do not leak `alloc_cb` buffers on error (Fedor Indutny) * unix: fix setting written size on uv_wd (Saúl Ibarra Corretgé) 2014.03.11, Version 0.11.22 (Unstable), cd0c19b1d3c56acf0ade7687006e12e75fbda36d Changes since version 0.11.21: * unix, windows: map ERANGE errno (Saúl Ibarra Corretgé) * unix, windows: make uv_cwd be consistent with uv_exepath (Saúl Ibarra Corretgé) * process: remove debug perror() prints (Fedor Indutny) * windows: fall back for volume info query (Isaiah Norton) * pipe: allow queueing pending handles (Fedor Indutny) * windows: fix winsock status codes for address errors (Raul Martins) * windows: Remove unused variable from uv__pipe_insert_pending_socket (David Capello) * unix: workaround broken pthread_sigmask on Android (Paul Tan) * error: add ENXIO for O_NONBLOCK FIFO open() (Fedor Indutny) * freebsd: use accept4, introduced in version 10 (Saúl Ibarra Corretgé) * windows: fix warnings of MinGW -Wall -O3 (StarWing) * openbsd, osx: fix compilation warning on scandir (Saúl Ibarra Corretgé) * linux: always deregister closing fds from epoll (Geoffry Song) * unix: reopen tty as /dev/tty (Saúl Ibarra Corretgé) * kqueue: invalidate fd in uv_fs_event_t (Fedor Indutny) 2014.02.28, Version 0.11.21 (Unstable), 3ef958158ae1019e027ebaa93114160099db5206 Changes since version 0.11.20: * unix: fix uv_fs_write when using an empty buffer (Saúl Ibarra Corretgé) * unix, windows: add assertion in uv_loop_delete (Saúl Ibarra Corretgé) 2014.02.27, Version 0.11.20 (Unstable), 88355e081b51c69ee1e2b6b0015a4e3d38bd0579 Changes since version 0.11.19: * stream: start thread after assignments (Oguz Bastemur) * fs: `uv__cloexec()` opened fd (Fedor Indutny) * gyp: qualify `library` variable (Fedor Indutny) * unix, win: add uv_udp_set_multicast_interface() (Austin Foxley) * unix: fix uv_tcp_nodelay return value in case of error (Saúl Ibarra Corretgé) * unix: call setgoups before calling setuid/setgid (Saúl Ibarra Corretgé) * include: mark close_cb field as private (Saúl Ibarra Corretgé) * unix, windows: map EFBIG errno (Saúl Ibarra Corretgé) * unix: correct error when calling uv_shutdown twice (Keno Fischer) * windows: fix building on MinGW (Alex Crichton) * windows: always initialize uv_process_t (Alex Crichton) * include: expose libuv version in header files (Saúl Ibarra Corretgé) * fs: vectored IO API for filesystem read/write (Benjamin Saunders) * windows: freeze in uv_tcp_endgame (Alexis Campailla) * sunos: handle rearm errors (Fedor Indutny) * unix: use a heap for timers (Ben Noordhuis) * linux: always deregister closing fds from epoll (Geoffry Song) * linux: include grp.h for setgroups() (William Light) * unix, windows: add uv_loop_init and uv_loop_close (Saúl Ibarra Corretgé) * unix, windows: add uv_getrusage() function (Oleg Efimov) * win: minor error handle fix to uv_pipe_write_impl (Rasmus Pedersen) * heap: fix node removal (Keno Fischer) * win: fix C99/C++ comment (Rasmus Pedersen) * fs: vectored IO API for filesystem read/write (Benjamin Saunders) * unix, windows: add uv_pipe_getsockname (Saúl Ibarra Corretgé) * unix, windows: map ENOPROTOOPT errno (Saúl Ibarra Corretgé) * errno: add ETXTBSY (Fedor Indutny) * fsevent: rename filename field to path (Saúl Ibarra Corretgé) * unix, windows: add uv_fs_event_getpath (Saúl Ibarra Corretgé) * unix, windows: add uv_fs_poll_getpath (Saúl Ibarra Corretgé) * unix, windows: map ERANGE errno (Saúl Ibarra Corretgé) * unix, windows: set required size on UV_ENOBUFS (Saúl Ibarra Corretgé) * unix, windows: clarify what uv_stream_set_blocking does (Saúl Ibarra Corretgé) * fs: use preadv on Linux if available (Brian White) 2014.01.30, Version 0.11.19 (Unstable), 336a1825309744f920230ec3e427e78571772347 Changes since version 0.11.18: * linux: move sscanf() out of the assert() (Trevor Norris) * linux: fix C99/C++ comment (Fedor Indutny) 2014.05.02, Version 0.10.27 (Stable), 6e24ce23b1e7576059f85a608eca13b766458a01 Changes since version 0.10.26: * windows: fix console signal handler refcount (Saúl Ibarra Corretgé) * win: always leave crit section in get_proc_title (Fedor Indutny) 2014.04.07, Version 0.10.26 (Stable), d864907611c25ec986c5e77d4d6d6dee88f26926 Changes since version 0.10.25: * process: don't close stdio fds during spawn (Tonis Tiigi) * build, windows: do not fail on Windows SDK Prompt (Marc Schlaich) * build, windows: fix x64 configuration issue (Marc Schlaich) * win: fix buffer leak on error in pipe.c (Fedor Indutny) * kqueue: invalidate fd in uv_fs_event_t (Fedor Indutny) * linux: always deregister closing fds from epoll (Geoffry Song) * error: add ENXIO for O_NONBLOCK FIFO open() (Fedor Indutny) 2014.02.19, Version 0.10.25 (Stable), d778dc588507588b12b9f9d2905078db542ed751 Changes since version 0.10.24: * stream: start thread after assignments (Oguz Bastemur) * unix: correct error when calling uv_shutdown twice (Saúl Ibarra Corretgé) 2014.01.30, Version 0.10.24 (Stable), aecd296b6bce9b40f06a61c5c94e43d45ac7308a Changes since version 0.10.23: * linux: move sscanf() out of the assert() (Trevor Norris) * linux: fix C99/C++ comment (Fedor Indutny) 2014.01.23, Version 0.11.18 (Unstable), d47962e9d93d4a55a9984623feaf546406c9cdbb Changes since version 0.11.17: * osx: Fix a possible segfault in uv__io_poll (Alex Crichton) * windows: improved handling of invalid FDs (Alexis Campailla) * doc: adding ARCHS flag to OS X build command (Nathan Sweet) * tcp: reveal bind-time errors before listen (Alexis Campailla) * tcp: uv_tcp_dualstack() (Fedor Indutny) * linux: relax assumption on /proc/stat parsing (Luca Bruno) * openbsd: fix obvious bug in uv_cpu_info (Fedor Indutny) * process: close stdio after dup2'ing it (Fedor Indutny) * linux: move sscanf() out of the assert() (Trevor Norris) 2014.01.23, Version 0.10.23 (Stable), dbd218e699fec8be311d85e4788be9e28ae884f8 Changes since version 0.10.22: * linux: relax assumption on /proc/stat parsing (Luca Bruno) * openbsd: fix obvious bug in uv_cpu_info (Fedor Indutny) * process: close stdio after dup2'ing it (Fedor Indutny) 2014.01.08, Version 0.10.22 (Stable), f526c90eeff271d9323a9107b9a64a4671fd3103 Changes since version 0.10.21: * windows: avoid assertion failure when pipe server is closed (Bert Belder) 2013.12.32, Version 0.11.17 (Unstable), 589c224d4c2e79fec65db01d361948f1e4976858 Changes since version 0.11.16: * stream: allow multiple buffers for uv_try_write (Fedor Indutny) * unix: fix a possible memory leak in uv_fs_readdir (Alex Crichton) * unix, windows: add uv_loop_alive() function (Sam Roberts) * windows: avoid assertion failure when pipe server is closed (Bert Belder) * osx: Fix a possible segfault in uv__io_poll (Alex Crichton) * stream: fix uv__stream_osx_select (Fedor Indutny) 2013.12.14, Version 0.11.16 (Unstable), ae0ed8c49d0d313c935c22077511148b6e8408a4 Changes since version 0.11.15: * fsevents: remove kFSEventStreamCreateFlagNoDefer polyfill (ci-innoq) * libuv: add more getaddrinfo errors (Steven Kabbes) * unix: fix accept() EMFILE error handling (Ben Noordhuis) * linux: fix up SO_REUSEPORT back-port (Ben Noordhuis) * fsevents: fix subfolder check (Fedor Indutny) * fsevents: fix invalid memory access (huxingyi) * windows/timer: fix uv_hrtime discontinuity (Bert Belder) * unix: fix various memory leaks and undef behavior (Fedor Indutny) * unix, windows: always update loop time (Saúl Ibarra Corretgé) * windows: translate system errors in uv_spawn (Alexis Campailla) * windows: uv_spawn code refactor (Alexis Campailla) * unix, windows: detect errors in uv_ip4/6_addr (Yorkie) * stream: introduce uv_try_write(...) (Fedor Indutny) 2013.12.13, Version 0.10.20 (Stable), 04141464dd0fba90ace9aa6f7003ce139b888a40 Changes since version 0.10.19: * linux: fix up SO_REUSEPORT back-port (Ben Noordhuis) * fs-event: fix invalid memory access (huxingyi) 2013.11.21, Version 0.11.15 (Unstable), bfe645ed7e99ca5670d9279ad472b604c129d2e5 Changes since version 0.11.14: * fsevents: report errors to user (Fedor Indutny) * include: UV_FS_EVENT_RECURSIVE is a flag (Fedor Indutny) * linux: use CLOCK_MONOTONIC_COARSE if available (Ben Noordhuis) * build: make systemtap probes work with gyp build (Ben Noordhuis) * unix: update events from pevents between polls (Fedor Indutny) * fsevents: support japaneese characters in path (Chris Bank) * linux: don't turn on SO_REUSEPORT socket option (Ben Noordhuis) * queue: strengthen type checks (Ben Noordhuis) * include: remove uv_strlcat() and uv_strlcpy() (Ben Noordhuis) * build: fix windows smp build with gyp (Geert Jansen) * unix: return exec errors from uv_spawn, not async (Alex Crichton) * fsevents: use native character encoding file paths (Ben Noordhuis) * linux: handle EPOLLHUP without EPOLLIN/EPOLLOUT (Ben Noordhuis) * windows: use _snwprintf(), not swprintf() (Ben Noordhuis) * fsevents: use FlagNoDefer for FSEventStreamCreate (Fedor Indutny) * unix: fix reopened fd bug (Fedor Indutny) * core: fix fake watcher list and count preservation (Fedor Indutny) * unix: set close-on-exec flag on received fds (Ben Noordhuis) * netbsd, openbsd: enable futimes() wrapper (Ben Noordhuis) * unix: nicer error message when kqueue() fails (Ben Noordhuis) * samples: add socks5 proxy sample application (Ben Noordhuis) 2013.11.13, Version 0.10.19 (Stable), 33959f7524090b8d2c6c41e2400ca77e31755059 Changes since version 0.10.18: * darwin: avoid calling GetCurrentProcess (Fedor Indutny) * unix: update events from pevents between polls (Fedor Indutny) * fsevents: support japaneese characters in path (Chris Bank) * linux: don't turn on SO_REUSEPORT socket option (Ben Noordhuis) * build: fix windows smp build with gyp (Geert Jansen) * linux: handle EPOLLHUP without EPOLLIN/EPOLLOUT (Ben Noordhuis) * unix: fix reopened fd bug (Fedor Indutny) * core: fix fake watcher list and count preservation (Fedor Indutny) 2013.10.30, Version 0.11.14 (Unstable), d7a6482f45c1b4eb4a853dbe1a9ce8090a35633a Changes since version 0.11.13: * darwin: create fsevents thread on demand (Ben Noordhuis) * fsevents: FSEvents is most likely not thread-safe (Fedor Indutny) * fsevents: use shared FSEventStream (Fedor Indutny) * windows: make uv_fs_chmod() report errors correctly (Bert Belder) * windows: make uv_shutdown() for write-only pipes work (Bert Belder) * windows/fs: wrap multi-statement macros in do..while block (Bert Belder) * windows/fs: make uv_fs_open() report EINVAL correctly (Bert Belder) * windows/fs: handle _open_osfhandle() failure correctly (Bert Belder) * windows/fs: wrap multi-statement macros in do..while block (Bert Belder) * windows/fs: make uv_fs_open() report EINVAL correctly (Bert Belder) * windows/fs: handle _open_osfhandle() failure correctly (Bert Belder) * build: clarify instructions for Windows (Brian Kaisner) * build: remove GCC_WARN_ABOUT_MISSING_NEWLINE (Ben Noordhuis) * darwin: fix 10.6 build error in fsevents.c (Ben Noordhuis) * windows: run close callbacks after polling for i/o (Saúl Ibarra Corretgé) * include: clarify uv_tcp_bind() behavior (Ben Noordhuis) * include: clean up includes in uv.h (Ben Noordhuis) * include: remove UV_IO_PRIVATE_FIELDS macro (Ben Noordhuis) * include: fix typo in comment in uv.h (Ben Noordhuis) * include: update uv_is_active() documentation (Ben Noordhuis) * include: make uv_process_options_t.cwd const (Ben Noordhuis) * unix: wrap long lines at 80 columns (Ben Noordhuis) * unix, windows: make uv_is_*() always return 0 or 1 (Ben Noordhuis) * bench: measure total/init/dispatch/cleanup times (Ben Noordhuis) * build: use -pthread on sunos (Timothy J. Fontaine) * windows: remove duplicate check in stream.c (Ben Noordhuis) * unix: sanity-check fds before closing (Ben Noordhuis) * unix: remove uv__pipe_accept() (Ben Noordhuis) * unix: fix uv_spawn() NULL pointer deref on ENOMEM (Ben Noordhuis) * unix: don't close inherited fds on uv_spawn() fail (Ben Noordhuis) * unix: revert recent FSEvent changes (Ben Noordhuis) * fsevents: fix clever rescheduling (Fedor Indutny) * linux: ignore fractional time in uv_uptime() (Ben Noordhuis) * unix: fix SIGCHLD waitpid() race in process.c (Ben Noordhuis) * unix, windows: add uv_fs_event_start/stop functions (Saúl Ibarra Corretgé) * unix: fix non-synchronized access in signal.c (Ben Noordhuis) * unix: add atomic-ops.h (Ben Noordhuis) * unix: add spinlock.h (Ben Noordhuis) * unix: clean up uv_tty_set_mode() a little (Ben Noordhuis) * unix: make uv_tty_reset_mode() async signal-safe (Ben Noordhuis) * include: add E2BIG status code mapping (Ben Noordhuis) * windows: fix duplicate case build error (Ben Noordhuis) * windows: remove unneeded check (Saúl Ibarra Corretgé) * include: document pipe path truncation behavior (Ben Noordhuis) * fsevents: increase stack size for OSX 10.9 (Fedor Indutny) * windows: _snprintf expected wrong parameter type in string (Maks Naumov) * windows: "else" keyword is missing (Maks Naumov) * windows: incorrect check for SOCKET_ERROR (Maks Naumov) * windows: add stdlib.h to satisfy reference to abort (Sean Farrell) * build: fix check target for mingw (Sean Farrell) * unix: move uv_shutdown() assertion (Keno Fischer) * darwin: avoid calling GetCurrentProcess (Fedor Indutny) 2013.10.19, Version 0.10.18 (Stable), 9ec52963b585e822e87bdc5de28d6143aff0d2e5 Changes since version 0.10.17: * unix: fix uv_spawn() NULL pointer deref on ENOMEM (Ben Noordhuis) * unix: don't close inherited fds on uv_spawn() fail (Ben Noordhuis) * unix: revert recent FSEvent changes (Ben Noordhuis) * unix: fix non-synchronized access in signal.c (Ben Noordhuis) 2013.09.25, Version 0.10.17 (Stable), 9670e0a93540c2f0d86c84a375f2303383c11e7e Changes since version 0.10.16: * build: remove GCC_WARN_ABOUT_MISSING_NEWLINE (Ben Noordhuis) * darwin: fix 10.6 build error in fsevents.c (Ben Noordhuis) 2013.09.06, Version 0.10.16 (Stable), 2bce230d81f4853a23662cbeb26fe98010b1084b Changes since version 0.10.15: * windows: make uv_shutdown() for write-only pipes work (Bert Belder) * windows: make uv_fs_open() report EINVAL when invalid arguments are passed (Bert Belder) * windows: make uv_fs_open() report _open_osfhandle() failure correctly (Bert Belder) * windows: make uv_fs_chmod() report errors correctly (Bert Belder) * windows: wrap multi-statement macros in do..while block (Bert Belder) 2013.09.05, Version 0.11.13 (Unstable), f5b6db6c1d7f93d28281207fd47c3841c9a9792e Changes since version 0.11.12: * unix: define _GNU_SOURCE, exposes glibc-isms (Ben Noordhuis) * windows: check for nonconforming swprintf arguments (Brent Cook) * build: include internal headers in source list (Brent Cook) * include: merge uv_tcp_bind and uv_tcp_bind6 (Ben Noordhuis) * include: merge uv_tcp_connect and uv_tcp_connect6 (Ben Noordhuis) * include: merge uv_udp_bind and uv_udp_bind6 (Ben Noordhuis) * include: merge uv_udp_send and uv_udp_send6 (Ben Noordhuis) 2013.09.03, Version 0.11.12 (Unstable), 82d01d5f6780d178f5176a01425ec297583c0811 Changes since version 0.11.11: * test: fix epoll_wait() usage in test-embed.c (Ben Noordhuis) * include: uv_alloc_cb now takes uv_buf_t* (Ben Noordhuis) * include: uv_read{2}_cb now takes const uv_buf_t* (Ben Noordhuis) * include: uv_ip[46]_addr now takes sockaddr_in* (Ben Noordhuis) * include: uv_tcp_bind{6} now takes sockaddr_in* (Ben Noordhuis) * include: uv_tcp_connect{6} now takes sockaddr_in* (Ben Noordhuis) * include: uv_udp_recv_cb now takes const uv_buf_t* (Ben Noordhuis) * include: uv_udp_bind{6} now takes sockaddr_in* (Ben Noordhuis) * include: uv_udp_send{6} now takes sockaddr_in* (Ben Noordhuis) * include: uv_spawn takes const uv_process_options_t* (Ben Noordhuis) * include: make uv_write{2} const correct (Ben Noordhuis) * windows: fix flags assignment in uv_fs_readdir() (Ben Noordhuis) * windows: fix stray comments (Ben Noordhuis) * windows: remove unused is_path_dir() function (Ben Noordhuis) 2013.08.30, Version 0.11.11 (Unstable), ba876d53539ed0427c52039012419cd9374c6f0d Changes since version 0.11.10: * unix, windows: add thread-local storage API (Ben Noordhuis) * linux: don't turn on SO_REUSEPORT socket option (Ben Noordhuis) * darwin: fix 10.6 build error in fsevents.c (Ben Noordhuis) * windows: make uv_shutdown() for write-only pipes work (Bert Belder) * include: update uv_udp_open() / uv_udp_bind() docs (Ben Noordhuis) * unix: req queue must be empty when destroying loop (Ben Noordhuis) * unix: move loop functions from core.c to loop.c (Ben Noordhuis) * darwin: remove CoreFoundation dependency (Ben Noordhuis) * windows: make autotools build system work with mingw (Keno Fischer) * windows: fix mingw build (Alex Crichton) * windows: tweak Makefile.mingw for easier usage (Alex Crichton) * build: remove _GNU_SOURCE macro definition (Ben Noordhuis) 2013.08.25, Version 0.11.10 (Unstable), 742dadcb7154cc7bb89c0c228a223b767a36cf0d * windows: Re-implement uv_fs_stat. The st_ctime field now contains the change time, not the creation time, like on unix systems. st_dev, st_ino, st_blocks and st_blksize are now also filled out. (Bert Belder) * linux: fix setsockopt(SO_REUSEPORT) error handling (Ben Noordhuis) * windows: report uv_process_t exit code correctly (Bert Belder) * windows: make uv_fs_chmod() report errors correctly (Bert Belder) * windows: make some more NT apis available for libuv's internal use (Bert Belder) * windows: squelch some compiler warnings (Bert Belder) 2013.08.24, Version 0.11.9 (Unstable), a2d29b5b068cbac93dc16138fb30a74e2669daad Changes since version 0.11.8: * fsevents: share FSEventStream between multiple FS watchers, which removes a limit on the maximum number of file watchers that can be created on OS X. (Fedor Indutny) * process: the `exit_status` parameter for a uv_process_t's exit callback now is an int64_t, and no longer an int. (Bert Belder) * process: make uv_spawn() return some types of errors immediately on windows, instead of passing the error code the the exit callback. This brings it on par with libuv's behavior on unix. (Bert Belder) 2013.08.24, Version 0.10.15 (Stable), 221078a8fdd9b853c6b557b3d9a5dd744b4fdd6b Changes since version 0.10.14: * fsevents: create FSEvents thread on demand (Ben Noordhuis) * fsevents: use a single thread for interacting with FSEvents, because it's not thread-safe. (Fedor Indutny) * fsevents: share FSEventStream between multiple FS watchers, which removes a limit on the maximum number of file watchers that can be created on OS X. (Fedor Indutny) 2013.08.22, Version 0.11.8 (Unstable), a5260462db80ab0deab6b9e6a8991dd8f5a9a2f8 Changes since version 0.11.7: * unix: fix missing return value warning in stream.c (Ben Noordhuis) * build: serial-tests was added in automake v1.12 (Ben Noordhuis) * windows: fix uninitialized local variable warning (Ben Noordhuis) * windows: fix missing return value warning (Ben Noordhuis) * build: fix string comparisons in autogen.sh (Ben Noordhuis) * windows: move INLINE macro, remove UNUSED (Ben Noordhuis) * unix: clean up __attribute__((quux)) usage (Ben Noordhuis) * sunos: remove futimes() macro (Ben Noordhuis) * unix: fix uv__signal_unlock() prototype (Ben Noordhuis) * unix, windows: allow NULL async callback (Ben Noordhuis) * build: apply dtrace -G to all object files (Timothy J. Fontaine) * darwin: fix indentation in uv__hrtime() (Ben Noordhuis) * darwin: create fsevents thread on demand (Ben Noordhuis) * darwin: reduce fsevents thread stack size (Ben Noordhuis) * darwin: call pthread_setname_np() if available (Ben Noordhuis) * build: fix automake serial-tests check again (Ben Noordhuis) * unix: retry waitpid() on EINTR (Ben Noordhuis) * darwin: fix ios build error (Ben Noordhuis) * darwin: fix ios compiler warning (Ben Noordhuis) * test: simplify test-ip6-addr.c (Ben Noordhuis) * unix, windows: fix ipv6 link-local address parsing (Ben Noordhuis) * fsevents: FSEvents is most likely not thread-safe (Fedor Indutny) * windows: omit stdint.h, fix msvc 2008 build error (Ben Noordhuis) 2013.08.22, Version 0.10.14 (Stable), 15d64132151c18b26346afa892444b95e2addad0 Changes since version 0.10.13: * unix: retry waitpid() on EINTR (Ben Noordhuis) 2013.08.07, Version 0.11.7 (Unstable), 3cad361f8776f70941b39d65bd9426bcb1aa817b Changes since version 0.11.6: * unix, windows: fix uv_fs_chown() function prototype (Ben Noordhuis) * unix, windows: remove unused variables (Brian White) * test: fix signed/unsigned comparison warnings (Ben Noordhuis) * build: dtrace shouldn't break out of tree builds (Timothy J. Fontaine) * unix, windows: don't read/recv if buf.len==0 (Ben Noordhuis) * build: add mingw makefile (Ben Noordhuis) * unix, windows: add MAC to uv_interface_addresses() (Brian White) * build: enable AM_INIT_AUTOMAKE([subdir-objects]) (Ben Noordhuis) * unix, windows: make buf arg to uv_fs_write const (Ben Noordhuis) * sunos: fix build breakage introduced in e3a657c (Ben Noordhuis) * aix: fix build breakage introduced in 3ee4d3f (Ben Noordhuis) * windows: fix mingw32 build, define JOB_OBJECT_XXX (Yasuhiro Matsumoto) * windows: fix mingw32 build, include limits.h (Yasuhiro Matsumoto) * test: replace sprintf() with snprintf() (Ben Noordhuis) * test: replace strcpy() with strncpy() (Ben Noordhuis) * openbsd: fix uv_ip6_addr() unused variable warnings (Ben Noordhuis) * openbsd: fix dlerror() const correctness warning (Ben Noordhuis) * openbsd: fix uv_fs_sendfile() unused variable warnings (Ben Noordhuis) * build: disable parallel automake tests (Ben Noordhuis) * test: add windows-only snprintf() function (Ben Noordhuis) * build: add automake serial-tests version check (Ben Noordhuis) 2013.07.26, Version 0.10.13 (Stable), 381312e1fe6fecbabc943ccd56f0e7d114b3d064 Changes since version 0.10.12: * unix, windows: fix uv_fs_chown() function prototype (Ben Noordhuis) 2013.07.21, Version 0.11.6 (Unstable), 6645b93273e0553d23823c576573b82b129bf28c Changes since version 0.11.5: * test: open stdout fd in write-only mode (Ben Noordhuis) * windows: uv_spawn shouldn't reject reparse points (Bert Belder) * windows: use WSAGetLastError(), not errno (Ben Noordhuis) * build: darwin: disable -fstrict-aliasing warnings (Ben Noordhuis) * test: fix signed/unsigned compiler warning (Ben Noordhuis) * test: add 'start timer from check handle' test (Ben Noordhuis) * build: `all` now builds static and dynamic lib (Ben Noordhuis) * unix, windows: add extra fields to uv_stat_t (Saúl Ibarra Corretgé) * build: add install target to the makefile (Navaneeth Kedaram Nambiathan) * build: switch to autotools (Ben Noordhuis) * build: use AM_PROG_AR conditionally (Ben Noordhuis) * test: fix fs_fstat test on sunos (Ben Noordhuis) * test: fix fs_chown when running as root (Ben Noordhuis) * test: fix spawn_setgid_fails and spawn_setuid_fails (Ben Noordhuis) * build: use AM_SILENT_RULES conditionally (Ben Noordhuis) * build: add DTrace detection for autotools (Timothy J. Fontaine) * linux,darwin,win: link-local IPv6 addresses (Miroslav BajtoÅ¡) * unix: fix build when !defined(PTHREAD_MUTEX_ERRORCHECK) (Ben Noordhuis) * unix, windows: return error codes directly (Ben Noordhuis) 2013.07.10, Version 0.10.12 (Stable), 58a46221bba726746887a661a9f36fe9ff204209 Changes since version 0.10.11: * linux: add support for MIPS (Andrei Sedoi) * windows: uv_spawn shouldn't reject reparse points (Bert Belder) * windows: use WSAGetLastError(), not errno (Ben Noordhuis) * build: darwin: disable -fstrict-aliasing warnings (Ben Noordhuis) * build: `all` now builds static and dynamic lib (Ben Noordhuis) * unix: fix build when !defined(PTHREAD_MUTEX_ERRORCHECK) (Ben Noordhuis) 2013.06.27, Version 0.11.5 (Unstable), e3c63ff1627a14e96f54c1c62b0d68b446d8425b Changes since version 0.11.4: * build: remove CSTDFLAG, use only CFLAGS (Ben Noordhuis) * unix: support for android builds (Linus MÃ¥rtensson) * unix: avoid extra read, short-circuit on POLLHUP (Ben Noordhuis) * uv: support android libuv standalone build (Linus MÃ¥rtensson) * src: make queue.h c++ compatible (Ben Noordhuis) * unix: s/ngx-queue.h/queue.h/ in checksparse.sh (Ben Noordhuis) * unix: unconditionally stop handle on close (Ben Noordhuis) * freebsd: don't enable dtrace if it's not available (Brian White) * build: make HAVE_DTRACE=0 should disable dtrace (Timothy J. Fontaine) * unix: remove overzealous assert (Ben Noordhuis) * unix: remove unused function uv_fatal_error() (Ben Noordhuis) * unix, windows: clean up uv_thread_create() (Ben Noordhuis) * queue: fix pointer truncation on LLP64 platforms (Bert Belder) * build: set OS=="android" for android builds (Linus MÃ¥rtensson) * windows: don't use uppercase in include filename (Ben Noordhuis) * stream: add an API to make streams do blocking writes (Henry Rawas) * windows: use WSAGetLastError(), not errno (Ben Noordhuis) 2013.06.13, Version 0.10.11 (Stable), c3b75406a66a10222a589cb173e8f469e9665c7e Changes since version 0.10.10: * unix: unconditionally stop handle on close (Ben Noordhuis) * freebsd: don't enable dtrace if it's not available (Brian White) * build: make HAVE_DTRACE=0 should disable dtrace (Timothy J. Fontaine) * unix: remove overzealous assert (Ben Noordhuis) * unix: clear UV_STREAM_SHUTTING after shutdown() (Ben Noordhuis) * unix: fix busy loop, write if POLLERR or POLLHUP (Ben Noordhuis) 2013.06.05, Version 0.10.10 (Stable), 0d95a88bd35fce93863c57a460be613aea34d2c5 Changes since version 0.10.9: * include: document uv_update_time() and uv_now() (Ben Noordhuis) * linux: fix cpu model parsing on newer arm kernels (Ben Noordhuis) * linux: fix a memory leak in uv_cpu_info() error path (Ben Noordhuis) * linux: don't ignore out-of-memory errors in uv_cpu_info() (Ben Noordhuis) * unix, windows: move uv_now() to uv-common.c (Ben Noordhuis) * test: fix a compilation problem in test-osx-select.c that was caused by the use of c-style comments (Bert Belder) * darwin: use uv_fs_sendfile() use the sendfile api correctly (Wynn Wilkes) 2013.05.30, Version 0.11.4 (Unstable), e43e5b3d954a0989db5588aa110e1fe4fe6e0219 Changes since version 0.11.3: * windows: make uv_spawn not fail when the libuv embedding application is run under external job control (Bert Belder) * darwin: assume CFRunLoopStop() isn't thread-safe, fixing a race condition when stopping the 'stdin select hack' thread (Fedor Indutny) * win: fix UV_EALREADY not being reported correctly to the libuv user in some cases (Bert Belder) * darwin: make the uv__cf_loop_runner and uv__cf_loop_cb functions static (Ben Noordhuis) * darwin: task_info() cannot fail (Ben Noordhuis) * unix: add error mapping for ENETDOWN (Ben Noordhuis) * unix: implicitly signal write errors to the libuv user (Ben Noordhuis) * unix: fix assertion error on signal pipe overflow (Bert Belder) * unix: turn off POLLOUT after stream connect (Ben Noordhuis) * unix: fix stream refcounting buglet (Ben Noordhuis) * unix: remove assert statements that are no longer correct (Ben Noordhuis) * unix: appease warning about non-standard `inline` (Sean Silva) * unix: add uv__is_closing() macro (Ben Noordhuis) * unix: stop stream POLLOUT watcher on write error (Ben Noordhuis) * include: document uv_update_time() and uv_now() (Ben Noordhuis) * linux: fix cpu model parsing on newer arm kernels (Ben Noordhuis) * linux: fix a memory leak in uv_cpu_info() error path (Ben Noordhuis) * linux: don't ignore out-of-memory errors in uv_cpu_info() (Ben Noordhuis) * unix, windows: move uv_now() to uv-common.c (Ben Noordhuis) * test: fix a compilation problem in test-osx-select.c that was caused by the use of c-style comments (Bert Belder) * darwin: use uv_fs_sendfile() use the sendfile api correctly (Wynn Wilkes) * windows: call idle handles on every loop iteration, something the unix implementation already did (Bert Belder) * test: update the idle-starvation test to verify that idle handles are called in every loop iteration (Bert Belder) * unix, windows: ensure that uv_run() in RUN_ONCE mode calls timers that expire after blocking (Ben Noordhuis) 2013.05.29, Version 0.10.9 (Stable), a195f9ace23d92345baf57582678bfc3017e6632 Changes since version 0.10.8: * unix: fix stream refcounting buglet (Ben Noordhuis) * unix: remove erroneous asserts (Ben Noordhuis) * unix: add uv__is_closing() macro (Ben Noordhuis) * unix: stop stream POLLOUT watcher on write error (Ben Noordhuis) 2013.05.25, Version 0.10.8 (Stable), 0f39be12926fe2d8766a9f025797a473003e6504 Changes since version 0.10.7: * windows: make uv_spawn not fail under job control (Bert Belder) * darwin: assume CFRunLoopStop() isn't thread-safe (Fedor Indutny) * win: fix UV_EALREADY incorrectly set (Bert Belder) * darwin: make two uv__cf_*() functions static (Ben Noordhuis) * darwin: task_info() cannot fail (Ben Noordhuis) * unix: add mapping for ENETDOWN (Ben Noordhuis) * unix: implicitly signal write errors to libuv user (Ben Noordhuis) * unix: fix assert on signal pipe overflow (Bert Belder) * unix: turn off POLLOUT after stream connect (Ben Noordhuis) 2013.05.16, Version 0.11.3 (Unstable), 0a48c05b5988aea84c605751900926fa25443b34 Changes since version 0.11.2: * unix: clean up uv_accept() (Ben Noordhuis) * unix: remove errno preserving code (Ben Noordhuis) * darwin: fix ios build, don't require ApplicationServices (Ben Noordhuis) * windows: kill child processes when the parent dies (Bert Belder) * build: set soname in shared library (Ben Noordhuis) * build: make `make test` link against .a again (Ben Noordhuis) * build: only set soname on shared object builds (Timothy J. Fontaine) * build: convert predefined $PLATFORM to lower case (Elliot Saba) * test: fix process_title failing on linux (Miroslav BajtoÅ¡) * test, sunos: disable process_title test (Miroslav BajtoÅ¡) * test: add error logging to tty unit test (Miroslav BajtoÅ¡) 2013.05.15, Version 0.10.7 (Stable), 028baaf0846b686a81e992cb2f2f5a9b8e841fcf Changes since version 0.10.6: * windows: kill child processes when the parent dies (Bert Belder) 2013.05.15, Version 0.10.6 (Stable), 11e6613e6260d95c8cf11bf89a2759c24649319a Changes since version 0.10.5: * stream: fix osx select hack (Fedor Indutny) * stream: fix small nit in select hack, add test (Fedor Indutny) * build: link with libkvm on openbsd (Ben Noordhuis) * stream: use harder sync restrictions for osx-hack (Fedor Indutny) * unix: fix EMFILE error handling (Ben Noordhuis) * darwin: fix unnecessary include headers (Daisuke Murase) * darwin: rename darwin-getproctitle.m (Ben Noordhuis) * build: convert predefined $PLATFORM to lower case (Elliot Saba) * build: set soname in shared library (Ben Noordhuis) * build: make `make test` link against .a again (Ben Noordhuis) * darwin: fix ios build, don't require ApplicationServices (Ben Noordhuis) * build: only set soname on shared object builds (Timothy J. Fontaine) 2013.05.11, Version 0.11.2 (Unstable), 3fba0bf65f091b91a9760530c05c6339c658d88b Changes since version 0.11.1: * darwin: look up file path with F_GETPATH (Ben Noordhuis) * unix, windows: add uv_has_ref() function (Saúl Ibarra Corretgé) * build: avoid double / in paths for dtrace (Timothy J. Fontaine) * unix: remove src/unix/cygwin.c (Ben Noordhuis) * windows: deal with the fact that GetTickCount might lag (Bert Belder) * unix: silence STATIC_ASSERT compiler warnings (Ben Noordhuis) * linux: don't use fopen() in uv_resident_set_memory() (Ben Noordhuis) 2013.04.24, Version 0.10.5 (Stable), 6595a7732c52eb4f8e57c88655f72997a8567a67 Changes since version 0.10.4: * unix: silence STATIC_ASSERT compiler warnings (Ben Noordhuis) * windows: make timers handle large timeouts (Miroslav BajtoÅ¡) * windows: remove superfluous assert statement (Bert Belder) * unix: silence STATIC_ASSERT compiler warnings (Ben Noordhuis) * linux: don't use fopen() in uv_resident_set_memory() (Ben Noordhuis) 2013.04.12, Version 0.10.4 (Stable), 85827e26403ac6dfa331af8ec9916ea7e27bd833 Changes since version 0.10.3: * include: update uv_backend_fd() documentation (Ben Noordhuis) * unix: include uv.h in src/version.c (Ben Noordhuis) * unix: don't write more than IOV_MAX iovecs (Fedor Indutny) * mingw-w64: don't call _set_invalid_parameter_handler (Nils Maier) * build: gyp disable thin archives (Timothy J. Fontaine) * sunos: re-export entire library when static (Timothy J. Fontaine) * unix: dtrace probes for tick-start and tick-stop (Timothy J. Fontaine) * windows: fix memory leak in fs__sendfile (Shannen Saez) * windows: remove double initialization in uv_tty_init (Shannen Saez) * build: fix dtrace-enabled out of tree build (Ben Noordhuis) * build: squelch -Wdollar-in-identifier-extension warnings (Ben Noordhuis) * inet: snprintf returns int, not size_t (Brian White) * win: refactor uv_cpu_info (Bert Belder) * build: add support for Visual Studio 2012 (Nicholas Vavilov) * build: -Wno-dollar-in-identifier-extension is clang only (Ben Noordhuis) 2013.04.11, Version 0.11.1 (Unstable), 5c10e82ae0bc99eff86d4b9baff1f1aa0bf84c0a This is the first versioned release from the current unstable libuv branch. Changes since Node.js v0.11.0: * all platforms: nanosecond resolution support for uv_fs_[fl]stat (Timothy J. Fontaine) * all platforms: add netmask to uv_interface_address (Ben Kelly) * unix: make sure the `status` parameter passed to the `uv_getaddrinfo` is 0 or -1 (Ben Noordhuis) * unix: limit the number of iovecs written in a single `writev` syscall to IOV_MAX (Fedor Indutny) * unix: add dtrace probes for tick-start and tick-stop (Timothy J. Fontaine) * mingw-w64: don't call _set_invalid_parameter_handler (Nils Maier) * windows: fix memory leak in fs__sendfile (Shannen Saez) * windows: fix edge case bugs in uv_cpu_info (Bert Belder) * include: no longer ship with / include ngx-queue.h (Ben Noordhuis) * include: remove UV_VERSION_* macros from uv.h (Ben Noordhuis) * documentation updates (Kristian Evensen, Ben Kelly, Ben Noordhuis) * build: fix dtrace-enabled builds (Ben Noordhuis, Timothy J. Fontaine) * build: gyp disable thin archives (Timothy J. Fontaine) * build: add support for Visual Studio 2012 (Nicholas Vavilov) 2013.03.28, Version 0.10.3 (Stable), 31ebe23973dd98fd8a24c042b606f37a794e99d0 Changes since version 0.10.2: * include: remove extraneous const from uv_version() (Ben Noordhuis) * doc: update README, replace `OS` by `PLATFORM` (Ben Noordhuis) * build: simplify .buildstamp rule (Ben Noordhuis) * build: disable -Wstrict-aliasing on darwin (Ben Noordhuis) * darwin: don't select(&exceptfds) in fallback path (Ben Noordhuis) * unix: don't clear flags after closing UDP handle (Saúl Ibarra Corretgé) 2013.03.25, Version 0.10.2 (Stable), 0f36a00568f3e7608f97f6c6cdb081f4800a50c9 This is the first officially versioned release of libuv. Starting now libuv will make releases independently of Node.js. Changes since Node.js v0.10.0: * test: add tap output for windows (Timothy J. Fontaine) * unix: fix uv_tcp_simultaneous_accepts() logic (Ben Noordhuis) * include: bump UV_VERSION_MINOR (Ben Noordhuis) * unix: improve uv_guess_handle() implementation (Ben Noordhuis) * stream: run try_select only for pipes and ttys (Fedor Indutny) Changes since Node.js v0.10.1: * build: rename OS to PLATFORM (Ben Noordhuis) * unix: make uv_timer_init() initialize repeat (Brian Mazza) * unix: make timers handle large timeouts (Ben Noordhuis) * build: add OBJC makefile var (Ben Noordhuis) * Add `uv_version()` and `uv_version_string()` APIs (Bert Belder) MoarVM-2015.11/3rdparty/libuv/LICENSE0000644000175000017500000000376212456307253015765 0ustar jnthnjnthnlibuv is part of the Node project: http://nodejs.org/ libuv may be distributed alone under Node's license: ==== Copyright Joyent, Inc. and other Node contributors. All rights reserved. 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. ==== This license applies to all parts of libuv that are not externally maintained libraries. The externally maintained libraries used by libuv are: - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. - inet_pton and inet_ntop implementations, contained in src/inet.c, are copyright the Internet Systems Consortium, Inc., and licensed under the ISC license. - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three clause BSD license. - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB. Three clause BSD license. - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement n° 289016). Three clause BSD license. MoarVM-2015.11/3rdparty/libuv/Makefile.am0000644000175000017500000002777312502366750017023 0ustar jnthnjnthn# Copyright (c) 2013, Ben Noordhuis # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ACLOCAL_AMFLAGS = -I m4 AM_CPPFLAGS = -I$(top_srcdir)/include \ -I$(top_srcdir)/src include_HEADERS=include/uv.h include/uv-errno.h include/uv-threadpool.h include/uv-version.h CLEANFILES = lib_LTLIBRARIES = libuv.la libuv_la_CFLAGS = @CFLAGS@ libuv_la_LDFLAGS = -no-undefined -version-info 1:0:0 libuv_la_SOURCES = src/fs-poll.c \ src/heap-inl.h \ src/inet.c \ src/queue.h \ src/threadpool.c \ src/uv-common.c \ src/uv-common.h \ src/version.c if SUNOS libuv_la_CFLAGS += -pthread endif if WINNT include_HEADERS += include/uv-win.h include/tree.h AM_CPPFLAGS += -I$(top_srcdir)/src/win \ -DWIN32_LEAN_AND_MEAN \ -D_WIN32_WINNT=0x0600 LIBS += -lws2_32 -lpsapi -liphlpapi -lshell32 libuv_la_SOURCES += src/win/async.c \ src/win/atomicops-inl.h \ src/win/core.c \ src/win/dl.c \ src/win/error.c \ src/win/fs-event.c \ src/win/fs.c \ src/win/getaddrinfo.c \ src/win/getnameinfo.c \ src/win/handle.c \ src/win/handle-inl.h \ src/win/internal.h \ src/win/loop-watcher.c \ src/win/pipe.c \ src/win/poll.c \ src/win/process-stdio.c \ src/win/process.c \ src/win/req.c \ src/win/req-inl.h \ src/win/signal.c \ src/win/stream.c \ src/win/stream-inl.h \ src/win/tcp.c \ src/win/thread.c \ src/win/timer.c \ src/win/tty.c \ src/win/udp.c \ src/win/util.c \ src/win/winapi.c \ src/win/winapi.h \ src/win/winsock.c \ src/win/winsock.h else # WINNT include_HEADERS += include/uv-unix.h AM_CPPFLAGS += -I$(top_srcdir)/src/unix libuv_la_CFLAGS += -g --std=gnu89 -pedantic -Wall -Wextra -Wno-unused-parameter libuv_la_SOURCES += src/unix/async.c \ src/unix/atomic-ops.h \ src/unix/core.c \ src/unix/dl.c \ src/unix/fs.c \ src/unix/getaddrinfo.c \ src/unix/getnameinfo.c \ src/unix/internal.h \ src/unix/loop-watcher.c \ src/unix/loop.c \ src/unix/pipe.c \ src/unix/poll.c \ src/unix/process.c \ src/unix/signal.c \ src/unix/spinlock.h \ src/unix/stream.c \ src/unix/tcp.c \ src/unix/thread.c \ src/unix/timer.c \ src/unix/tty.c \ src/unix/udp.c endif # WINNT EXTRA_DIST = test/fixtures/empty_file \ test/fixtures/load_error.node TESTS = test/run-tests check_PROGRAMS = test/run-tests test_run_tests_CFLAGS = test_run_tests_SOURCES = test/blackhole-server.c \ test/dns-server.c \ test/echo-server.c \ test/run-tests.c \ test/runner.c \ test/runner.h \ test/task.h \ test/test-active.c \ test/test-async.c \ test/test-async-null-cb.c \ test/test-barrier.c \ test/test-callback-order.c \ test/test-callback-stack.c \ test/test-close-fd.c \ test/test-close-order.c \ test/test-condvar.c \ test/test-connection-fail.c \ test/test-cwd-and-chdir.c \ test/test-default-loop-close.c \ test/test-delayed-accept.c \ test/test-dlerror.c \ test/test-embed.c \ test/test-emfile.c \ test/test-error.c \ test/test-fail-always.c \ test/test-fs-event.c \ test/test-fs-poll.c \ test/test-fs.c \ test/test-get-currentexe.c \ test/test-get-loadavg.c \ test/test-get-memory.c \ test/test-getaddrinfo.c \ test/test-getnameinfo.c \ test/test-getsockname.c \ test/test-handle-fileno.c \ test/test-hrtime.c \ test/test-idle.c \ test/test-ip4-addr.c \ test/test-ip6-addr.c \ test/test-ipc-send-recv.c \ test/test-ipc.c \ test/test-list.h \ test/test-loop-handles.c \ test/test-loop-alive.c \ test/test-loop-close.c \ test/test-loop-stop.c \ test/test-loop-time.c \ test/test-multiple-listen.c \ test/test-mutexes.c \ test/test-osx-select.c \ test/test-pass-always.c \ test/test-ping-pong.c \ test/test-pipe-bind-error.c \ test/test-pipe-connect-error.c \ test/test-pipe-getsockname.c \ test/test-pipe-sendmsg.c \ test/test-pipe-server-close.c \ test/test-pipe-close-stdout-read-stdin.c \ test/test-platform-output.c \ test/test-poll-close.c \ test/test-poll-closesocket.c \ test/test-poll.c \ test/test-process-title.c \ test/test-ref.c \ test/test-run-nowait.c \ test/test-run-once.c \ test/test-semaphore.c \ test/test-shutdown-close.c \ test/test-shutdown-eof.c \ test/test-shutdown-twice.c \ test/test-signal-multiple-loops.c \ test/test-signal.c \ test/test-socket-buffer-size.c \ test/test-spawn.c \ test/test-stdio-over-pipes.c \ test/test-tcp-bind-error.c \ test/test-tcp-bind6-error.c \ test/test-tcp-close-accept.c \ test/test-tcp-close-while-connecting.c \ test/test-tcp-close.c \ test/test-tcp-connect-error-after-write.c \ test/test-tcp-connect-error.c \ test/test-tcp-connect-timeout.c \ test/test-tcp-connect6-error.c \ test/test-tcp-flags.c \ test/test-tcp-open.c \ test/test-tcp-read-stop.c \ test/test-tcp-shutdown-after-write.c \ test/test-tcp-unexpected-read.c \ test/test-tcp-write-to-half-open-connection.c \ test/test-tcp-write-after-connect.c \ test/test-tcp-writealot.c \ test/test-tcp-try-write.c \ test/test-tcp-write-queue-order.c \ test/test-thread-equal.c \ test/test-thread.c \ test/test-threadpool-cancel.c \ test/test-threadpool.c \ test/test-timer-again.c \ test/test-timer-from-check.c \ test/test-timer.c \ test/test-tty.c \ test/test-udp-bind.c \ test/test-udp-dgram-too-big.c \ test/test-udp-ipv6.c \ test/test-udp-multicast-interface.c \ test/test-udp-multicast-interface6.c \ test/test-udp-multicast-join.c \ test/test-udp-multicast-join6.c \ test/test-udp-multicast-ttl.c \ test/test-udp-open.c \ test/test-udp-options.c \ test/test-udp-send-and-recv.c \ test/test-udp-send-immediate.c \ test/test-udp-send-unreachable.c \ test/test-udp-try-send.c \ test/test-walk-handles.c \ test/test-watcher-cross-stop.c test_run_tests_LDADD = libuv.la if WINNT test_run_tests_SOURCES += test/runner-win.c \ test/runner-win.h else test_run_tests_SOURCES += test/runner-unix.c \ test/runner-unix.h endif if AIX test_run_tests_CFLAGS += -D_ALL_SOURCE -D_XOPEN_SOURCE=500 -D_LINUX_SOURCE_COMPAT endif if SUNOS test_run_tests_CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=500 endif if AIX libuv_la_CFLAGS += -D_ALL_SOURCE -D_XOPEN_SOURCE=500 -D_LINUX_SOURCE_COMPAT libuv_la_SOURCES += src/unix/aix.c endif if ANDROID include_HEADERS += include/android-ifaddrs.h \ include/pthread-fixes.h libuv_la_SOURCES += src/unix/android-ifaddrs.c \ src/unix/pthread-fixes.c endif if DARWIN include_HEADERS += include/uv-darwin.h libuv_la_CFLAGS += -D_DARWIN_USE_64_BIT_INODE=1 libuv_la_CFLAGS += -D_DARWIN_UNLIMITED_SELECT=1 libuv_la_SOURCES += src/unix/darwin.c \ src/unix/darwin-proctitle.c \ src/unix/fsevents.c \ src/unix/kqueue.c \ src/unix/proctitle.c endif if DRAGONFLY include_HEADERS += include/uv-bsd.h libuv_la_SOURCES += src/unix/kqueue.c src/unix/freebsd.c endif if FREEBSD include_HEADERS += include/uv-bsd.h libuv_la_SOURCES += src/unix/freebsd.c src/unix/kqueue.c endif if LINUX include_HEADERS += include/uv-linux.h libuv_la_SOURCES += src/unix/linux-core.c \ src/unix/linux-inotify.c \ src/unix/linux-syscalls.c \ src/unix/linux-syscalls.h \ src/unix/proctitle.c endif if NETBSD include_HEADERS += include/uv-bsd.h libuv_la_SOURCES += src/unix/kqueue.c src/unix/netbsd.c endif if OPENBSD include_HEADERS += include/uv-bsd.h libuv_la_SOURCES += src/unix/kqueue.c src/unix/openbsd.c endif if SUNOS include_HEADERS += include/uv-sunos.h libuv_la_CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=500 libuv_la_SOURCES += src/unix/sunos.c endif if HAVE_PKG_CONFIG pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = @PACKAGE_NAME@.pc endif MoarVM-2015.11/3rdparty/libuv/Makefile.mingw0000644000175000017500000000457512456307253017543 0ustar jnthnjnthn# Copyright (c) 2013, Ben Noordhuis # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. CC ?= gcc CFLAGS += -Wall \ -Wextra \ -Wno-unused-parameter \ -Iinclude \ -Isrc \ -Isrc/win \ -DWIN32_LEAN_AND_MEAN \ -D_WIN32_WINNT=0x0600 INCLUDES = include/stdint-msvc2008.h \ include/tree.h \ include/uv-errno.h \ include/uv-threadpool.h \ include/uv-version.h \ include/uv-win.h \ include/uv.h \ src/heap-inl.h \ src/queue.h \ src/uv-common.h \ src/win/atomicops-inl.h \ src/win/handle-inl.h \ src/win/internal.h \ src/win/req-inl.h \ src/win/stream-inl.h \ src/win/winapi.h \ src/win/winsock.h OBJS = src/fs-poll.o \ src/inet.o \ src/threadpool.o \ src/uv-common.o \ src/version.o \ src/win/async.o \ src/win/core.o \ src/win/dl.o \ src/win/error.o \ src/win/fs-event.o \ src/win/fs.o \ src/win/getaddrinfo.o \ src/win/getnameinfo.o \ src/win/handle.o \ src/win/loop-watcher.o \ src/win/pipe.o \ src/win/poll.o \ src/win/process-stdio.o \ src/win/process.o \ src/win/req.o \ src/win/signal.o \ src/win/stream.o \ src/win/tcp.o \ src/win/thread.o \ src/win/timer.o \ src/win/tty.o \ src/win/udp.o \ src/win/util.o \ src/win/winapi.o \ src/win/winsock.o all: libuv.a clean: -$(RM) $(OBJS) libuv.a libuv.a: $(OBJS) $(AR) crs $@ $^ $(OBJS): %.o : %.c $(INCLUDES) $(CC) $(CFLAGS) -c -o $@ $< MoarVM-2015.11/3rdparty/libuv/README.md0000644000175000017500000001161712502366750016234 0ustar jnthnjnthn![libuv][libuv_banner] ## Overview libuv is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by [Node.js](http://nodejs.org), but it's also used by [Luvit](http://luvit.io/), [Julia](http://julialang.org/), [pyuv](https://github.com/saghul/pyuv), and [others](https://github.com/joyent/libuv/wiki/Projects-that-use-libuv). ## Feature highlights * Full-featured event loop backed by epoll, kqueue, IOCP, event ports. * Asynchronous TCP and UDP sockets * Asynchronous DNS resolution * Asynchronous file and file system operations * File system events * ANSI escape code controlled TTY * IPC with socket sharing, using Unix domain sockets or named pipes (Windows) * Child processes * Thread pool * Signal handling * High resolution clock * Threading and synchronization primitives ## Versioning Starting with version 1.0.0 libuv follows the [semantic versioning](http://semver.org/) scheme. The API change and backwards compatiblity rules are those indicated by SemVer. libuv will keep a stable ABI across major releases. ## Community * [Mailing list](http://groups.google.com/group/libuv) ## Documentation ### Official API documentation Located in the docs/ subdirectory. It uses the [Sphinx](http://sphinx-doc.org/) framework, which makes it possible to build the documentation in multiple formats. Show different supported building options: $ make help Build documentation as HTML: $ make html Build documentation as man pages: $ make man Build documentation as ePub: $ make epub NOTE: Windows users need to use make.bat instead of plain 'make'. Documentation can be browsed online [here](http://docs.libuv.org). ### Other resources * [An Introduction to libuv](http://nikhilm.github.com/uvbook/) — An overview of libuv with tutorials. * [LXJS 2012 talk](http://www.youtube.com/watch?v=nGn60vDSxQ4) — High-level introductory talk about libuv. * [Tests and benchmarks](https://github.com/joyent/libuv/tree/master/test) — API specification and usage examples. * [libuv-dox](https://github.com/thlorenz/libuv-dox) — Documenting types and methods of libuv, mostly by reading uv.h. * [learnuv](https://github.com/thlorenz/learnuv) — Learn uv for fun and profit, a self guided workshop to libuv. ## Build Instructions For GCC there are two build methods: via autotools or via [GYP][]. GYP is a meta-build system which can generate MSVS, Makefile, and XCode backends. It is best used for integration into other projects. To build with autotools: $ sh autogen.sh $ ./configure $ make $ make check $ make install ### Windows First, [Python][] 2.6 or 2.7 must be installed as it is required by [GYP][]. If python is not in your path, set the environment variable `PYTHON` to its location. For example: `set PYTHON=C:\Python27\python.exe` To build with Visual Studio, launch a git shell (e.g. Cmd or PowerShell) and run vcbuild.bat which will checkout the GYP code into build/gyp and generate uv.sln as well as related project files. To have GYP generate build script for another system, checkout GYP into the project tree manually: $ git clone https://chromium.googlesource.com/external/gyp.git build/gyp OR $ svn co http://gyp.googlecode.com/svn/trunk build/gyp ### Unix Run: $ ./gyp_uv.py -f make $ make -C out Run `./gyp_uv.py -f make -Dtarget_arch=x32` to build [x32][] binaries. ### OS X Run: $ ./gyp_uv.py -f xcode $ xcodebuild -ARCHS="x86_64" -project uv.xcodeproj \ -configuration Release -target All Using Homebrew: $ brew install --HEAD libuv Note to OS X users: Make sure that you specify the architecture you wish to build for in the "ARCHS" flag. You can specify more than one by delimiting with a space (e.g. "x86_64 i386"). ### Android Run: $ source ./android-configure NDK_PATH gyp $ make -C out Note for UNIX users: compile your project with `-D_LARGEFILE_SOURCE` and `-D_FILE_OFFSET_BITS=64`. GYP builds take care of that automatically. ### Running tests Run: $ ./gyp_uv.py -f make $ make -C out $ ./out/Debug/run-tests ## Supported Platforms Microsoft Windows operating systems since Windows XP SP2. It can be built with either Visual Studio or MinGW. Consider using [Visual Studio Express 2010][] or later if you do not have a full Visual Studio license. Linux using the GCC toolchain. OS X using the GCC or XCode toolchain. Solaris 121 and later using GCC toolchain. ## Patches See the [guidelines for contributing][]. [node.js]: http://nodejs.org/ [GYP]: http://code.google.com/p/gyp/ [Python]: https://www.python.org/downloads/ [Visual Studio Express 2010]: http://www.microsoft.com/visualstudio/eng/products/visual-studio-2010-express [guidelines for contributing]: https://github.com/joyent/libuv/blob/master/CONTRIBUTING.md [libuv_banner]: https://raw.githubusercontent.com/joyent/libuv/master/img/banner.png MoarVM-2015.11/3rdparty/libuv/android-configure0000755000175000017500000000101212456307253020267 0ustar jnthnjnthn#!/bin/bash export TOOLCHAIN=$PWD/android-toolchain mkdir -p $TOOLCHAIN $1/build/tools/make-standalone-toolchain.sh \ --toolchain=arm-linux-androideabi-4.8 \ --arch=arm \ --install-dir=$TOOLCHAIN \ --platform=android-9 export PATH=$TOOLCHAIN/bin:$PATH export AR=arm-linux-androideabi-ar export CC=arm-linux-androideabi-gcc export CXX=arm-linux-androideabi-g++ export LINK=arm-linux-androideabi-g++ export PLATFORM=android if [ $2 -a $2 == 'gyp' ] then ./gyp_uv.py -Dtarget_arch=arm -DOS=android fi MoarVM-2015.11/3rdparty/libuv/autogen.sh0000755000175000017500000000325312456307253016754 0ustar jnthnjnthn#!/bin/sh # Copyright (c) 2013, Ben Noordhuis # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. cd `dirname "$0"` if [ "$LIBTOOLIZE" = "" ] && [ "`uname`" = "Darwin" ]; then LIBTOOLIZE=glibtoolize fi ACLOCAL=${ACLOCAL:-aclocal} AUTOCONF=${AUTOCONF:-autoconf} AUTOMAKE=${AUTOMAKE:-automake} LIBTOOLIZE=${LIBTOOLIZE:-libtoolize} automake_version=`"$AUTOMAKE" --version | head -n 1 | sed 's/[^.0-9]//g'` automake_version_major=`echo "$automake_version" | cut -d. -f1` automake_version_minor=`echo "$automake_version" | cut -d. -f2` UV_EXTRA_AUTOMAKE_FLAGS= if test "$automake_version_major" -gt 1 || \ test "$automake_version_major" -eq 1 && \ test "$automake_version_minor" -gt 11; then # serial-tests is available in v0.12 and newer. UV_EXTRA_AUTOMAKE_FLAGS="$UV_EXTRA_AUTOMAKE_FLAGS serial-tests" fi echo "m4_define([UV_EXTRA_AUTOMAKE_FLAGS], [$UV_EXTRA_AUTOMAKE_FLAGS])" \ > m4/libuv-extra-automake-flags.m4 set -ex "$LIBTOOLIZE" "$ACLOCAL" -I m4 "$AUTOCONF" "$AUTOMAKE" --add-missing --copy MoarVM-2015.11/3rdparty/libuv/checksparse.sh0000755000175000017500000001272112456307253017605 0ustar jnthnjnthn#!/bin/sh # Copyright (c) 2013, Ben Noordhuis # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. SPARSE=${SPARSE:-sparse} SPARSE_FLAGS=${SPARSE_FLAGS:-" -D__POSIX__ -Wsparse-all -Wno-do-while -Wno-transparent-union -Iinclude -Isrc "} SOURCES=" include/tree.h include/uv-unix.h include/uv.h src/fs-poll.c src/inet.c src/queue.h src/unix/async.c src/unix/core.c src/unix/dl.c src/unix/fs.c src/unix/getaddrinfo.c src/unix/internal.h src/unix/loop-watcher.c src/unix/loop.c src/unix/pipe.c src/unix/poll.c src/unix/process.c src/unix/signal.c src/unix/stream.c src/unix/tcp.c src/unix/thread.c src/unix/threadpool.c src/unix/timer.c src/unix/tty.c src/unix/udp.c src/uv-common.c src/uv-common.h " TESTS=" test/benchmark-async-pummel.c test/benchmark-async.c test/benchmark-fs-stat.c test/benchmark-getaddrinfo.c test/benchmark-loop-count.c test/benchmark-million-async.c test/benchmark-million-timers.c test/benchmark-multi-accept.c test/benchmark-ping-pongs.c test/benchmark-pound.c test/benchmark-pump.c test/benchmark-sizes.c test/benchmark-spawn.c test/benchmark-tcp-write-batch.c test/benchmark-thread.c test/benchmark-udp-pummel.c test/blackhole-server.c test/dns-server.c test/echo-server.c test/run-benchmarks.c test/run-tests.c test/runner-unix.c test/runner-unix.h test/runner.c test/runner.h test/task.h test/test-active.c test/test-async.c test/test-barrier.c test/test-callback-order.c test/test-callback-stack.c test/test-condvar.c test/test-connection-fail.c test/test-cwd-and-chdir.c test/test-delayed-accept.c test/test-dlerror.c test/test-embed.c test/test-error.c test/test-fail-always.c test/test-fs-event.c test/test-fs-poll.c test/test-fs.c test/test-get-currentexe.c test/test-get-loadavg.c test/test-get-memory.c test/test-getaddrinfo.c test/test-getsockname.c test/test-hrtime.c test/test-idle.c test/test-ip6-addr.c test/test-ipc-send-recv.c test/test-ipc.c test/test-loop-handles.c test/test-multiple-listen.c test/test-mutexes.c test/test-pass-always.c test/test-ping-pong.c test/test-pipe-bind-error.c test/test-pipe-connect-error.c test/test-pipe-sendmsg.c test/test-pipe-server-close.c test/test-platform-output.c test/test-poll-close.c test/test-poll.c test/test-process-title.c test/test-ref.c test/test-run-nowait.c test/test-run-once.c test/test-semaphore.c test/test-shutdown-close.c test/test-shutdown-eof.c test/test-signal-multiple-loops.c test/test-signal.c test/test-spawn.c test/test-stdio-over-pipes.c test/test-tcp-bind-error.c test/test-tcp-bind6-error.c test/test-tcp-close-while-connecting.c test/test-tcp-close-accept.c test/test-tcp-close.c test/test-tcp-connect-error-after-write.c test/test-tcp-connect-error.c test/test-tcp-connect-timeout.c test/test-tcp-connect6-error.c test/test-tcp-flags.c test/test-tcp-open.c test/test-tcp-read-stop.c test/test-tcp-shutdown-after-write.c test/test-tcp-unexpected-read.c test/test-tcp-write-error.c test/test-tcp-write-to-half-open-connection.c test/test-tcp-writealot.c test/test-thread.c test/test-threadpool-cancel.c test/test-threadpool.c test/test-timer-again.c test/test-timer.c test/test-tty.c test/test-udp-dgram-too-big.c test/test-udp-ipv6.c test/test-udp-multicast-join.c test/test-udp-multicast-ttl.c test/test-udp-open.c test/test-udp-options.c test/test-udp-send-and-recv.c test/test-walk-handles.c test/test-watcher-cross-stop.c " case `uname -s` in AIX) SPARSE_FLAGS="$SPARSE_FLAGS -D_AIX=1" SOURCES="$SOURCES src/unix/aix.c" ;; Darwin) SPARSE_FLAGS="$SPARSE_FLAGS -D__APPLE__=1" SOURCES="$SOURCES include/uv-bsd.h src/unix/darwin.c src/unix/kqueue.c src/unix/fsevents.c" ;; DragonFly) SPARSE_FLAGS="$SPARSE_FLAGS -D__DragonFly__=1" SOURCES="$SOURCES include/uv-bsd.h src/unix/kqueue.c src/unix/freebsd.c" ;; FreeBSD) SPARSE_FLAGS="$SPARSE_FLAGS -D__FreeBSD__=1" SOURCES="$SOURCES include/uv-bsd.h src/unix/kqueue.c src/unix/freebsd.c" ;; Linux) SPARSE_FLAGS="$SPARSE_FLAGS -D__linux__=1" SOURCES="$SOURCES include/uv-linux.h src/unix/linux-inotify.c src/unix/linux-core.c src/unix/linux-syscalls.c src/unix/linux-syscalls.h" ;; NetBSD) SPARSE_FLAGS="$SPARSE_FLAGS -D__NetBSD__=1" SOURCES="$SOURCES include/uv-bsd.h src/unix/kqueue.c src/unix/netbsd.c" ;; OpenBSD) SPARSE_FLAGS="$SPARSE_FLAGS -D__OpenBSD__=1" SOURCES="$SOURCES include/uv-bsd.h src/unix/kqueue.c src/unix/openbsd.c" ;; SunOS) SPARSE_FLAGS="$SPARSE_FLAGS -D__sun=1" SOURCES="$SOURCES include/uv-sunos.h src/unix/sunos.c" ;; esac for ARCH in __i386__ __x86_64__ __arm__ __mips__; do $SPARSE $SPARSE_FLAGS -D$ARCH=1 $SOURCES done # Tests are architecture independent. $SPARSE $SPARSE_FLAGS -Itest $TESTS MoarVM-2015.11/3rdparty/libuv/common.gypi0000644000175000017500000001625412502366750017141 0ustar jnthnjnthn{ 'variables': { 'visibility%': 'hidden', # V8's visibility setting 'target_arch%': 'ia32', # set v8's target architecture 'host_arch%': 'ia32', # set v8's host architecture 'uv_library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds 'component%': 'static_library', # NB. these names match with what V8 expects 'msvs_multi_core_compile': '0', # we do enable multicore compiles, but not using the V8 way 'gcc_version%': 'unknown', 'clang%': 0, }, 'target_defaults': { 'default_configuration': 'Debug', 'configurations': { 'Debug': { 'defines': [ 'DEBUG', '_DEBUG' ], 'cflags': [ '-g', '-O0', '-fwrapv' ], 'msvs_settings': { 'VCCLCompilerTool': { 'target_conditions': [ ['uv_library=="static_library"', { 'RuntimeLibrary': 1, # static debug }, { 'RuntimeLibrary': 3, # DLL debug }], ], 'Optimization': 0, # /Od, no optimization 'MinimalRebuild': 'false', 'OmitFramePointers': 'false', 'BasicRuntimeChecks': 3, # /RTC1 }, 'VCLinkerTool': { 'LinkIncremental': 2, # enable incremental linking }, }, 'xcode_settings': { 'GCC_OPTIMIZATION_LEVEL': '0', 'OTHER_CFLAGS': [ '-Wno-strict-aliasing' ], }, 'conditions': [ ['OS != "win"', { 'defines': [ 'EV_VERIFY=2' ], }], ] }, 'Release': { 'defines': [ 'NDEBUG' ], 'cflags': [ '-O3', '-fstrict-aliasing', '-fomit-frame-pointer', '-fdata-sections', '-ffunction-sections', ], 'msvs_settings': { 'VCCLCompilerTool': { 'target_conditions': [ ['uv_library=="static_library"', { 'RuntimeLibrary': 0, # static release }, { 'RuntimeLibrary': 2, # debug release }], ], 'Optimization': 3, # /Ox, full optimization 'FavorSizeOrSpeed': 1, # /Ot, favour speed over size 'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible 'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG 'OmitFramePointers': 'true', 'EnableFunctionLevelLinking': 'true', 'EnableIntrinsicFunctions': 'true', }, 'VCLibrarianTool': { 'AdditionalOptions': [ '/LTCG', # link time code generation ], }, 'VCLinkerTool': { 'LinkTimeCodeGeneration': 1, # link-time code generation 'OptimizeReferences': 2, # /OPT:REF 'EnableCOMDATFolding': 2, # /OPT:ICF 'LinkIncremental': 1, # disable incremental linking }, }, } }, 'msvs_settings': { 'VCCLCompilerTool': { 'StringPooling': 'true', # pool string literals 'DebugInformationFormat': 3, # Generate a PDB 'WarningLevel': 3, 'BufferSecurityCheck': 'true', 'ExceptionHandling': 1, # /EHsc 'SuppressStartupBanner': 'true', 'WarnAsError': 'false', 'AdditionalOptions': [ '/MP', # compile across multiple CPUs ], }, 'VCLibrarianTool': { }, 'VCLinkerTool': { 'GenerateDebugInformation': 'true', 'RandomizedBaseAddress': 2, # enable ASLR 'DataExecutionPrevention': 2, # enable DEP 'AllowIsolation': 'true', 'SuppressStartupBanner': 'true', 'target_conditions': [ ['_type=="executable"', { 'SubSystem': 1, # console executable }], ], }, }, 'conditions': [ ['OS == "win"', { 'msvs_cygwin_shell': 0, # prevent actions from trying to use cygwin 'defines': [ 'WIN32', # we don't really want VC++ warning us about # how dangerous C functions are... '_CRT_SECURE_NO_DEPRECATE', # ... or that C implementations shouldn't use # POSIX names '_CRT_NONSTDC_NO_DEPRECATE', ], 'target_conditions': [ ['target_arch=="x64"', { 'msvs_configuration_platform': 'x64' }] ] }], ['OS in "freebsd linux openbsd solaris android"', { 'cflags': [ '-Wall' ], 'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ], 'target_conditions': [ ['_type=="static_library"', { 'standalone_static_library': 1, # disable thin archive which needs binutils >= 2.19 }], ], 'conditions': [ [ 'host_arch != target_arch and target_arch=="ia32"', { 'cflags': [ '-m32' ], 'ldflags': [ '-m32' ], }], [ 'target_arch=="x32"', { 'cflags': [ '-mx32' ], 'ldflags': [ '-mx32' ], }], [ 'OS=="linux"', { 'cflags': [ '-ansi' ], }], [ 'OS=="solaris"', { 'cflags': [ '-pthreads' ], 'ldflags': [ '-pthreads' ], }], [ 'OS not in "solaris android"', { 'cflags': [ '-pthread' ], 'ldflags': [ '-pthread' ], }], [ 'visibility=="hidden" and (clang==1 or gcc_version >= 40)', { 'cflags': [ '-fvisibility=hidden' ], }], ], }], ['OS=="mac"', { 'xcode_settings': { 'ALWAYS_SEARCH_USER_PATHS': 'NO', 'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks 'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic # (Equivalent to -fPIC) 'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions 'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti 'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden 'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics 'PREBINDING': 'NO', # No -Wl,-prebind 'USE_HEADERMAP': 'NO', 'OTHER_CFLAGS': [ '-fstrict-aliasing', ], 'WARNING_CFLAGS': [ '-Wall', '-Wendif-labels', '-W', '-Wno-unused-parameter', ], }, 'conditions': [ ['target_arch=="ia32"', { 'xcode_settings': {'ARCHS': ['i386']}, }], ['target_arch=="x64"', { 'xcode_settings': {'ARCHS': ['x86_64']}, }], ], 'target_conditions': [ ['_type!="static_library"', { 'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']}, }], ], }], ['OS=="solaris"', { 'cflags': [ '-fno-omit-frame-pointer' ], # pull in V8's postmortem metadata 'ldflags': [ '-Wl,-z,allextract' ] }], ], }, } MoarVM-2015.11/3rdparty/libuv/configure.ac0000644000175000017500000000543412502366750017243 0ustar jnthnjnthn# Copyright (c) 2013, Ben Noordhuis # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. AC_PREREQ(2.57) AC_INIT([libuv], [1.0.0], [https://github.com/joyent/libuv/issues]) AC_CONFIG_MACRO_DIR([m4]) m4_include([m4/libuv-extra-automake-flags.m4]) m4_include([m4/as_case.m4]) m4_include([m4/libuv-check-flags.m4]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects] UV_EXTRA_AUTOMAKE_FLAGS) AC_CANONICAL_HOST AC_ENABLE_SHARED AC_ENABLE_STATIC AC_PROG_CC AM_PROG_CC_C_O CC_CHECK_CFLAGS_APPEND([-Wno-dollar-in-identifier-extension]) # AM_PROG_AR is not available in automake v0.11 but it's essential in v0.12. m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) LT_INIT # TODO(bnoordhuis) Check for -pthread vs. -pthreads AC_CHECK_LIB([dl], [dlopen]) AC_CHECK_LIB([kstat], [kstat_lookup]) AC_CHECK_LIB([kvm], [kvm_open]) AC_CHECK_LIB([nsl], [gethostbyname]) AC_CHECK_LIB([perfstat], [perfstat_cpu]) AC_CHECK_LIB([pthread], [pthread_mutex_init]) AC_CHECK_LIB([rt], [clock_gettime]) AC_CHECK_LIB([sendfile], [sendfile]) AC_CHECK_LIB([socket], [socket]) AC_SYS_LARGEFILE AM_CONDITIONAL([AIX], [AS_CASE([$host_os],[aix*], [true], [false])]) AM_CONDITIONAL([ANDROID], [AS_CASE([$host_os],[linux-android*],[true], [false])]) AM_CONDITIONAL([DARWIN], [AS_CASE([$host_os],[darwin*], [true], [false])]) AM_CONDITIONAL([DRAGONFLY],[AS_CASE([$host_os],[dragonfly*], [true], [false])]) AM_CONDITIONAL([FREEBSD], [AS_CASE([$host_os],[freebsd*], [true], [false])]) AM_CONDITIONAL([LINUX], [AS_CASE([$host_os],[linux*], [true], [false])]) AM_CONDITIONAL([NETBSD], [AS_CASE([$host_os],[netbsd*], [true], [false])]) AM_CONDITIONAL([OPENBSD], [AS_CASE([$host_os],[openbsd*], [true], [false])]) AM_CONDITIONAL([SUNOS], [AS_CASE([$host_os],[solaris*], [true], [false])]) AM_CONDITIONAL([WINNT], [AS_CASE([$host_os],[mingw*], [true], [false])]) AC_CHECK_PROG(PKG_CONFIG, pkg-config, yes) AM_CONDITIONAL([HAVE_PKG_CONFIG], [test "x$PKG_CONFIG" != "x"]) AS_IF([test "x$PKG_CONFIG" != "x"], [ AC_CONFIG_FILES([libuv.pc]) ]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT MoarVM-2015.11/3rdparty/libuv/docs/Makefile0000644000175000017500000001521112502366750017337 0ustar jnthnjnthn# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build SRCDIR = src # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SRCDIR) # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SRCDIR) .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libuv.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libuv.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/libuv" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libuv" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." MoarVM-2015.11/3rdparty/libuv/docs/make.bat0000644000175000017500000001511012502366750017302 0ustar jnthnjnthn@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set SRCDIR=src set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% %SRCDIR% set I18NSPHINXOPTS=%SPHINXOPTS% %SRCDIR% if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\libuv.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\libuv.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end MoarVM-2015.11/3rdparty/libuv/docs/src/async.rst0000644000175000017500000000262012502366750020335 0ustar jnthnjnthn .. _async: :c:type:`uv_async_t` --- Async handle ===================================== Async handles allow the user to "wakeup" the event loop and get a callback called from another thread. Data types ---------- .. c:type:: uv_async_t Async handle type. .. c:type:: void (*uv_async_cb)(uv_async_t* handle) Type definition for callback passed to :c:func:`uv_async_init`. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_async_init(uv_loop_t* loop, uv_async_t* async, uv_async_cb async_cb) Initialize the handle. A NULL callback is allowed. .. note:: Unlike other handle initialization functions, it immediately starts the handle. .. c:function:: int uv_async_send(uv_async_t* async) Wakeup the event loop and call the async handle's callback. .. note:: It's safe to call this function from any thread. The callback will be called on the loop thread. .. warning:: libuv will coalesce calls to :c:func:`uv_async_send`, that is, not every call to it will yield an execution of the callback, the only guarantee is that it will be called at least once. Thus, calling this function may not wakeup the event loop if it was already called previously within a short period of time. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/check.rst0000644000175000017500000000156112502366750020300 0ustar jnthnjnthn .. _check: :c:type:`uv_check_t` --- Check handle ===================================== Check handles will run the given callback once per loop iteration, right after polling for i/o. Data types ---------- .. c:type:: uv_check_t Check handle type. .. c:type:: void (*uv_check_cb)(uv_check_t* handle) Type definition for callback passed to :c:func:`uv_check_start`. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_check_init(uv_loop_t*, uv_check_t* check) Initialize the handle. .. c:function:: int uv_check_start(uv_check_t* check, uv_check_cb cb) Start the handle with the given callback. .. c:function:: int uv_check_stop(uv_check_t* check) Stop the handle, the callback will no longer be called. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/conf.py0000644000175000017500000002566712502366750020005 0ustar jnthnjnthn# -*- coding: utf-8 -*- # # libuv API documentation documentation build configuration file, created by # sphinx-quickstart on Sun Jul 27 11:47:51 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import re import sys def get_libuv_version(): with open('../../include/uv-version.h') as f: data = f.read() try: m = re.search(r"""^#define UV_VERSION_MAJOR (\d)$""", data, re.MULTILINE) major = int(m.group(1)) m = re.search(r"""^#define UV_VERSION_MINOR (\d)$""", data, re.MULTILINE) minor = int(m.group(1)) m = re.search(r"""^#define UV_VERSION_PATCH (\d)$""", data, re.MULTILINE) patch = int(m.group(1)) m = re.search(r"""^#define UV_VERSION_IS_RELEASE (\d)$""", data, re.MULTILINE) is_release = int(m.group(1)) m = re.search(r"""^#define UV_VERSION_SUFFIX \"(\w*)\"$""", data, re.MULTILINE) suffix = m.group(1) return '%d.%d.%d%s' % (major, minor, patch, '-%s' % suffix if not is_release else '') except Exception: return 'unknown' # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'libuv API documentation' copyright = u'libuv contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = get_libuv_version() # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'nature' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = 'libuv API documentation' # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = 'libuv %s API documentation' % version # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = 'static/logo.png' # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = 'static/favicon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'libuv' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'libuv.tex', u'libuv API documentation', u'libuv contributors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'libuv', u'libuv API documentation', [u'libuv contributors'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'libuv', u'libuv API documentation', u'libuv contributors', 'libuv', 'Cross-platform asychronous I/O', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False # -- Options for Epub output ---------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'libuv API documentation' epub_author = u'libuv contributors' epub_publisher = u'libuv contributors' epub_copyright = u'2014, libuv contributors' # The basename for the epub file. It defaults to the project name. epub_basename = u'libuv' # The HTML theme for the epub output. Since the default themes are not optimized # for small screen space, using the same theme for HTML and epub output is # usually not wise. This defaults to 'epub', a theme designed to save visual # space. #epub_theme = 'epub' # The language of the text. It defaults to the language option # or en if the language is not set. #epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. #epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. #epub_identifier = '' # A unique identification for the text. #epub_uid = '' # A tuple containing the cover image and cover page html template filenames. #epub_cover = () # A sequence of (type, uri, title) tuples for the guide element of content.opf. #epub_guide = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] # A list of files that should not be packed into the epub file. epub_exclude_files = ['search.html'] # The depth of the table of contents in toc.ncx. #epub_tocdepth = 3 # Allow duplicate toc entries. #epub_tocdup = True # Choose between 'default' and 'includehidden'. #epub_tocscope = 'default' # Fix unsupported image types using the PIL. #epub_fix_images = False # Scale large images. #epub_max_image_width = 0 # How to display URL addresses: 'footnote', 'no', or 'inline'. #epub_show_urls = 'inline' # If false, no index is generated. #epub_use_index = True MoarVM-2015.11/3rdparty/libuv/docs/src/design.rst0000644000175000017500000001456212502366750020501 0ustar jnthnjnthn .. _design: Design overview =============== libuv is cross-platform support library which was originally written for NodeJS. It's designed around the event-driven asynchronous I/O model. The library provides much more than simply abstraction over different I/O polling mechanisms: 'handles' and 'streams' provde a high level abstraction for sockets and other entities; cross-platform file I/O and threading functionality is also provided, amongst other things. Here is a diagram illustrating the different parts that compose libuv and what subsystem they relate to: .. image:: static/architecture.png :scale: 75% :align: center Handles and requests ^^^^^^^^^^^^^^^^^^^^ libuv provides users with 2 abstractions to work with, in combination with the event loop: handles and requests. Handles represent long-lived objects capable of performing certain operations while active. Some examples: a prepare handle gets its callback called once every loop iteration when active, and a TCP server handle get its connection callback called every time there is a new connection. Requests represent (typically) short-lived operations. These operations can be performed over a handle: write requests are used to write data on a handle; or standalone: getaddrinfo requests don't need a handle they run directly on the loop. The I/O loop ^^^^^^^^^^^^ The I/O (or event) loop is the central part of libuv. It establishes the content for all I/O operations, and it's meant to be tied to a single thread. One can run multiple event loops as long as each runs in a different thread. The libuv event loop (or any other API involving the loop or handles, for that matter) **is not thread-safe** except stated otherwise. The event loop follows the rather usual single threaded asynchronous I/O approah: all (network) I/O is performed on non-blocking sockets which are polled using the best mechanism available on the given platform: epoll on Linux, kqueue on OSX and other BSDs, event ports on SunOS and IOCP on Windows. As part of a loop iteration the loop will block waiting for I/O activity on sockets which have been added to the poller and callbacks will be fired indicating socket conditions (readable, writable hangup) so handles can read, write or perform the desired I/O operation. In order to better understand how the event loop operates, the following diagram illustrates all stages of a loop iteration: .. image:: static/loop_iteration.png :scale: 75% :align: center #. The loop concept of 'now' is updated. The event loop caches the current time at the start of the event loop tick in order to reduce the number of time-related system calls. #. If the loop is *alive* an iteration is started, otherwise the loop will exit immediately. So, when is a loop considered to be *alive*? If a loop has active and ref'd handles, active requests or closing handles it's considered to be *alive*. #. Due timers are run. All active timers scheduled for a time before the loop's concept of *now* get their callbacks called. #. Pending callbacks are called. All I/O callbacks are called right after polling for I/O, for the most part. There are cases, however, in which calling such a callback is deferred for the next loop iteration. If the previous iteration deferred any I/O callback it will be run at this point. #. Idle handle callbacks are called. Despite the unfortunate name, idle handles are run on every loop iteration, if they are active. #. Prepare handle callbacks are called. Prepare handles get their callbacks called right before the loop will block for I/O. #. Poll timeout is calculated. Before blocking for I/O the loop calculates for how long it should block. These are the rules when calculating the timeout: * If the loop was run with the ``UV_RUN_NOWAIT`` flag, the timeout is 0. * If the loop is going to be stopped (:c:func:`uv_stop` was called), the timeout is 0. * If there are no active handles or requests, the timeout is 0. * If there are any idle handles active, the timeout is 0. * If there are any handles pending to be closed, the timeout is 0. * If none of the above cases was matched, the timeout of the closest timer is taken, or if there are no active timers, infinity. #. The loop blocks for I/O. At this point the loop will block for I/O for the timeout calculated on the previous step. All I/O related handles that were monitoring a given file descriptor for a read or write operation get their callbacks called at this point. #. Check handle callbacks are called. Check handles get their callbacks called right after the loop has blocked for I/O. Check handles are essentially the counterpart of prepare handles. #. Close callbacks are called. If a handle was closed by calling :c:func:`uv_close` it will get the close callback called. #. Special case in case the loop was run with ``UV_RUN_ONCE``, as it implies forward progress. It's possible that no I/O callbacks were fired after blocking for I/O, but some time has passed so there might be timers which are due, those timers get their callbacks called. #. Iteration ends. If the loop was run with ``UV_RUN_NOWAIT`` or ``UV_RUN_ONCE`` modes the iteration is ended and :c:func:`uv_run` will return. If the loop was run with ``UV_RUN_DEFAULT`` it will contionue from the start if it's asill *alive*, otherwise it will also end. .. important:: libuv uses a thread pool to make asynchronous file I/O operations possible, but network I/O is **always** performed in a single thread, each loop's thread. .. note:: While the polling mechanism is different, libuv makes the execution model consistent Unix systems and Windows. File I/O ^^^^^^^^ Unlike network I/O, there are no platform-specific file I/O primitives libuv could rely on, so the current approach is to run blocking file I/O operations in a thread pool. For a thorough explanation of the cross-platform file I/O landscape, checkout `this post `_. libuv currently uses a global thread pool on which all loops can queue work on. 3 types of operations are currently run on this pool: * Filesystem operations * DNS functions (getaddrinfo and getnameinfo) * User specified code via :c:func:`uv_queue_work` .. warning:: See the :c:ref:`threadpool` section for more details, but keep in mind the thread pool size is quite limited. MoarVM-2015.11/3rdparty/libuv/docs/src/dll.rst0000644000175000017500000000167712502366750020006 0ustar jnthnjnthn .. _dll: Shared library handling ======================= libuv prodives cross platform utilities for loading shared libraries and retrieving symbols from them, using the following API. Data types ---------- .. c:type:: uv_lib_t Shared library data type. Public members ^^^^^^^^^^^^^^ N/A API --- .. c:function:: int uv_dlopen(const char* filename, uv_lib_t* lib) Opens a shared library. The filename is in utf-8. Returns 0 on success and -1 on error. Call :c:func:`uv_dlerror` to get the error message. .. c:function:: void uv_dlclose(uv_lib_t* lib) Close the shared library. .. c:function:: uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) Retrieves a data pointer from a dynamic library. It is legal for a symbol to map to NULL. Returns 0 on success and -1 if the symbol was not found. .. c:function:: const char* uv_dlerror(const uv_lib_t* lib) Returns the last uv_dlopen() or uv_dlsym() error message. MoarVM-2015.11/3rdparty/libuv/docs/src/dns.rst0000644000175000017500000000510312502366750020003 0ustar jnthnjnthn .. _dns: DNS utility functions ===================== libuv provides asynchronous variants of `getaddrinfo` and `getnameinfo`. Data types ---------- .. c:type:: uv_getaddrinfo_t `getaddrinfo` request type. .. c:type:: void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, int status, struct addrinfo* res) Callback which will be called with the getaddrinfo request result once complete. In case it was cancelled, `status` will have a value of ``UV_ECANCELED``. .. c:type:: uv_getnameinfo_t `getnameinfo` request type. .. c:type:: void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, int status, const char* hostname, const char* service) Callback which will be called with the getnameinfo request result once complete. In case it was cancelled, `status` will have a value of ``UV_ECANCELED``. Public members ^^^^^^^^^^^^^^ .. c:member:: uv_loop_t* uv_getaddrinfo_t.loop Loop that started this getaddrinfo request and where completion will be reported. Readonly. .. c:member:: uv_loop_t* uv_getnameinfo_t.loop Loop that started this getnameinfo request and where completion will be reported. Readonly. .. seealso:: The :c:type:`uv_req_t` members also apply. API --- .. c:function:: int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints) Asynchronous ``getaddrinfo(3)``. Either node or service may be NULL but not both. `hints` is a pointer to a struct addrinfo with additional address type constraints, or NULL. Consult `man -s 3 getaddrinfo` for more details. Returns 0 on success or an error code < 0 on failure. If successful, the callback will get called sometime in the future with the lookup result, which is either: * status == 0, the res argument points to a valid `struct addrinfo`, or * status < 0, the res argument is NULL. See the UV_EAI_* constants. Call :c:func:`uv_freeaddrinfo` to free the addrinfo structure. .. c:function:: void uv_freeaddrinfo(struct addrinfo* ai) Free the struct addrinfo. Passing NULL is allowed and is a no-op. .. c:function:: int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) Asynchronous ``getnameinfo(3)``. Returns 0 on success or an error code < 0 on failure. If successful, the callback will get called sometime in the future with the lookup result. Consult `man -s 3 getnameinfo` for more details. .. seealso:: The :c:type:`uv_req_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/errors.rst0000644000175000017500000001113412502366750020534 0ustar jnthnjnthn .. _errors: Error handling ============== In libuv errors are negative numbered constants. As a rule of thumb, whenever there is a status parameter, or an API functions returns an integer, a negative number will imply an error. .. note:: Implementation detail: on Unix error codes are the negated `errno` (or `-errno`), while on Windows they are defined by libuv to arbitrary negative numbers. Error constants --------------- .. c:macro:: UV_E2BIG argument list too long .. c:macro:: UV_EACCES permission denied .. c:macro:: UV_EADDRINUSE address already in use .. c:macro:: UV_EADDRNOTAVAIL address not available .. c:macro:: UV_EAFNOSUPPORT address family not supported .. c:macro:: UV_EAGAIN resource temporarily unavailable .. c:macro:: UV_EAI_ADDRFAMILY address family not supported .. c:macro:: UV_EAI_AGAIN temporary failure .. c:macro:: UV_EAI_BADFLAGS bad ai_flags value .. c:macro:: UV_EAI_BADHINTS invalid value for hints .. c:macro:: UV_EAI_CANCELED request canceled .. c:macro:: UV_EAI_FAIL permanent failure .. c:macro:: UV_EAI_FAMILY ai_family not supported .. c:macro:: UV_EAI_MEMORY out of memory .. c:macro:: UV_EAI_NODATA no address .. c:macro:: UV_EAI_NONAME unknown node or service .. c:macro:: UV_EAI_OVERFLOW argument buffer overflow .. c:macro:: UV_EAI_PROTOCOL resolved protocol is unknown .. c:macro:: UV_EAI_SERVICE service not available for socket type .. c:macro:: UV_EAI_SOCKTYPE socket type not supported .. c:macro:: UV_EALREADY connection already in progress .. c:macro:: UV_EBADF bad file descriptor .. c:macro:: UV_EBUSY resource busy or locked .. c:macro:: UV_ECANCELED operation canceled .. c:macro:: UV_ECHARSET invalid Unicode character .. c:macro:: UV_ECONNABORTED software caused connection abort .. c:macro:: UV_ECONNREFUSED connection refused .. c:macro:: UV_ECONNRESET connection reset by peer .. c:macro:: UV_EDESTADDRREQ destination address required .. c:macro:: UV_EEXIST file already exists .. c:macro:: UV_EFAULT bad address in system call argument .. c:macro:: UV_EFBIG file too large .. c:macro:: UV_EHOSTUNREACH host is unreachable .. c:macro:: UV_EINTR interrupted system call .. c:macro:: UV_EINVAL invalid argument .. c:macro:: UV_EIO i/o error .. c:macro:: UV_EISCONN socket is already connected .. c:macro:: UV_EISDIR illegal operation on a directory .. c:macro:: UV_ELOOP too many symbolic links encountered .. c:macro:: UV_EMFILE too many open files .. c:macro:: UV_EMSGSIZE message too long .. c:macro:: UV_ENAMETOOLONG name too long .. c:macro:: UV_ENETDOWN network is down .. c:macro:: UV_ENETUNREACH network is unreachable .. c:macro:: UV_ENFILE file table overflow .. c:macro:: UV_ENOBUFS no buffer space available .. c:macro:: UV_ENODEV no such device .. c:macro:: UV_ENOENT no such file or directory .. c:macro:: UV_ENOMEM not enough memory .. c:macro:: UV_ENONET machine is not on the network .. c:macro:: UV_ENOPROTOOPT protocol not available .. c:macro:: UV_ENOSPC no space left on device .. c:macro:: UV_ENOSYS function not implemented .. c:macro:: UV_ENOTCONN socket is not connected .. c:macro:: UV_ENOTDIR not a directory .. c:macro:: UV_ENOTEMPTY directory not empty .. c:macro:: UV_ENOTSOCK socket operation on non-socket .. c:macro:: UV_ENOTSUP operation not supported on socket .. c:macro:: UV_EPERM operation not permitted .. c:macro:: UV_EPIPE broken pipe .. c:macro:: UV_EPROTO protocol error .. c:macro:: UV_EPROTONOSUPPORT protocol not supported .. c:macro:: UV_EPROTOTYPE protocol wrong type for socket .. c:macro:: UV_ERANGE result too large .. c:macro:: UV_EROFS read-only file system .. c:macro:: UV_ESHUTDOWN cannot send after transport endpoint shutdown .. c:macro:: UV_ESPIPE invalid seek .. c:macro:: UV_ESRCH no such process .. c:macro:: UV_ETIMEDOUT connection timed out .. c:macro:: UV_ETXTBSY text file is busy .. c:macro:: UV_EXDEV cross-device link not permitted .. c:macro:: UV_UNKNOWN unknown error .. c:macro:: UV_EOF end of file .. c:macro:: UV_ENXIO no such device or address .. c:macro:: UV_EMLINK too many links API --- .. c:function:: const char* uv_strerror(int err) Returns the error message for the given error code. .. c:function:: const char* uv_err_name(int err) Returns the error name for the given error code. MoarVM-2015.11/3rdparty/libuv/docs/src/fs.rst0000644000175000017500000002035212502366750017632 0ustar jnthnjnthn .. _fs: Filesystem operations ===================== libuv provides a wide variety of cross-platform sync and async filesystem operations. All functions defined in this document take a callback, which is allowed to be NULL. If the callback is NULL the request is completed synchronously, otherwise it will be performed asynchronously. All file operations are run on the threadpool, see :ref:`threadpool` for information on the threadpool size. Data types ---------- .. c:type:: uv_fs_t Filesystem request type. .. c:type:: uv_timespec_t Portable equivalent of ``struct timespec``. :: typedef struct { long tv_sec; long tv_nsec; } uv_timespec_t; .. c:type:: uv_stat_t Portable equivalent of ``struct stat``. :: typedef struct { uint64_t st_dev; uint64_t st_mode; uint64_t st_nlink; uint64_t st_uid; uint64_t st_gid; uint64_t st_rdev; uint64_t st_ino; uint64_t st_size; uint64_t st_blksize; uint64_t st_blocks; uint64_t st_flags; uint64_t st_gen; uv_timespec_t st_atim; uv_timespec_t st_mtim; uv_timespec_t st_ctim; uv_timespec_t st_birthtim; } uv_stat_t; .. c:type:: uv_fs_type Filesystem request type. :: typedef enum { UV_FS_UNKNOWN = -1, UV_FS_CUSTOM, UV_FS_OPEN, UV_FS_CLOSE, UV_FS_READ, UV_FS_WRITE, UV_FS_SENDFILE, UV_FS_STAT, UV_FS_LSTAT, UV_FS_FSTAT, UV_FS_FTRUNCATE, UV_FS_UTIME, UV_FS_FUTIME, UV_FS_ACCESS, UV_FS_CHMOD, UV_FS_FCHMOD, UV_FS_FSYNC, UV_FS_FDATASYNC, UV_FS_UNLINK, UV_FS_RMDIR, UV_FS_MKDIR, UV_FS_MKDTEMP, UV_FS_RENAME, UV_FS_SCANDIR, UV_FS_LINK, UV_FS_SYMLINK, UV_FS_READLINK, UV_FS_CHOWN, UV_FS_FCHOWN } uv_fs_type; .. c:type:: uv_dirent_t Cross platform (reduced) equivalent of ``struct dirent``. Used in :c:func:`uv_fs_scandir_next`. :: typedef enum { UV_DIRENT_UNKNOWN, UV_DIRENT_FILE, UV_DIRENT_DIR, UV_DIRENT_LINK, UV_DIRENT_FIFO, UV_DIRENT_SOCKET, UV_DIRENT_CHAR, UV_DIRENT_BLOCK } uv_dirent_type_t; typedef struct uv_dirent_s { const char* name; uv_dirent_type_t type; } uv_dirent_t; Public members ^^^^^^^^^^^^^^ .. c:member:: uv_loop_t* uv_fs_t.loop Loop that started this request and where completion will be reported. Readonly. .. c:member:: uv_fs_type uv_fs_t.fs_type FS request type. .. c:member:: const char* uv_fs_t.path Path affecting the request. .. c:member:: ssize_t uv_fs_t.result Result of the request. < 0 means error, success otherwise. On requests such as :c:func:`uv_fs_read` or :c:func:`uv_fs_write` it indicates the amount of data that was read or written, respectively. .. c:member:: uv_stat_t uv_fs_t.statbuf Stores the result of :c:func:`uv_fs_stat` and other stat requests. .. c:member:: void* uv_fs_t.ptr Stores the result of :c:func:`uv_fs_readlink` and serves as an alias to `statbuf`. .. seealso:: The :c:type:`uv_req_t` members also apply. API --- .. c:function:: void uv_fs_req_cleanup(uv_fs_t* req) Cleanup request. Must be called after a request is finished to deallocate any memory libuv might have allocated. .. c:function:: int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) Equivalent to ``close(2)``. .. c:function:: int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) Equivalent to ``open(2)``. .. c:function:: int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) Equivalent to ``preadv(2)``. .. c:function:: int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) Equivalent to ``unlink(2)``. .. c:function:: int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) Equivalent to ``pwritev(2)``. .. c:function:: int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) Equivalent to ``mkdir(2)``. .. note:: `mode` is currently not implemented on Windows. .. c:function:: int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) Equivalent to ``mkdtemp(3)``. .. c:function:: int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) Equivalent to ``rmdir(2)``. .. c:function:: int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) .. c:function:: int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent) Equivalent to ``scandir(3)``, with a slightly different API. Once the callback for the request is called, the user can use :c:func:`uv_fs_scandir_next` to get `ent` populated with the next directory entry data. When there are no more entries ``UV_EOF`` will be returned. .. c:function:: int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) .. c:function:: int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) .. c:function:: int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) Equivalent to ``(f/l)stat(2)``. .. c:function:: int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) Equivalent to ``rename(2)``. .. c:function:: int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) Equivalent to ``fsync(2)``. .. c:function:: int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) Equivalent to ``fdatasync(2)``. .. c:function:: int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset, uv_fs_cb cb) Equivalent to ``ftruncate(2)``. .. c:function:: int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb) Limited equivalent to ``sendfile(2)``. .. c:function:: int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) Equivalent to ``access(2)`` on Unix. Windows uses ``GetFileAttributesW()``. .. c:function:: int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) .. c:function:: int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb) Equivalent to ``(f)chmod(2)``. .. c:function:: int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) .. c:function:: int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb) Equivalent to ``(f)utime(s)(2)``. .. c:function:: int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) Equivalent to ``link(2)``. .. c:function:: int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) Equivalent to ``symlink(2)``. .. note:: On Windows the `flags` parameter can be specified to control how the symlink will be created: * ``UV_FS_SYMLINK_DIR``: indicates that `path` points to a directory. * ``UV_FS_SYMLINK_JUNCTION``: request that the symlink is created using junktion points. .. c:function:: int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) Equivalent to ``readlink(2)``. .. c:function:: int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) .. c:function:: int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) Equivalent to ``(f)chown(2)``. .. note:: These functions are not implemented on Windows. .. seealso:: The :c:type:`uv_req_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/fs_event.rst0000644000175000017500000000663612502366750021044 0ustar jnthnjnthn .. _fs_event: :c:type:`uv_fs_event_t` --- FS Event handle =========================================== FS Event handles allow the user to monitor a given path for changes, for example, if the file was renamed or there was a generic change in it. This handle uses the best backend for the job on each platform. Data types ---------- .. c:type:: uv_fs_event_t FS Event handle type. .. c:type:: void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, int status) Callback passed to :c:func:`uv_fs_event_start` which will be called repeatedly after the handle is started. If the handle was started with a directory the `filename` parameter will be a relative path to a file contained in the directory. The `events` parameter is an ORed mask of :c:type:`uv_fs_event` elements. .. c:type:: uv_fs_event Event types that :c:type:`uv_fs_event_t` handles monitor. :: enum uv_fs_event { UV_RENAME = 1, UV_CHANGE = 2 }; .. c:type:: uv_fs_event_flags Flags that can be passed to :c:func:`uv_fs_event_start` to control its behavior. :: enum uv_fs_event_flags { /* * By default, if the fs event watcher is given a directory name, we will * watch for all events in that directory. This flags overrides this behavior * and makes fs_event report only changes to the directory entry itself. This * flag does not affect individual files watched. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_WATCH_ENTRY = 1, /* * By default uv_fs_event will try to use a kernel interface such as inotify * or kqueue to detect events. This may not work on remote filesystems such * as NFS mounts. This flag makes fs_event fall back to calling stat() on a * regular interval. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_STAT = 2, /* * By default, event watcher, when watching directory, is not registering * (is ignoring) changes in it's subdirectories. * This flag will override this behaviour on platforms that support it. */ UV_FS_EVENT_RECURSIVE = 4 }; Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) Initialize the handle. .. c:function:: int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) Start the handle with the given callback, which will watch the specified `path` for changes. `flags` can be an ORed mask of :c:type:`uv_fs_event_flags`. .. c:function:: int uv_fs_event_stop(uv_fs_event_t* handle) Stop the handle, the callback will no longer be called. .. c:function:: int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) Get the path being monitored by the handle. The buffer must be preallocated by the user. Returns 0 on success or an error code < 0 in case of failure. On sucess, `buf` will contain the path and `len` its length. If the buffer is not big enough UV_ENOBUFS will be returned and len will be set to the required size. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/fs_poll.rst0000644000175000017500000000433612502366750020664 0ustar jnthnjnthn .. _fs_poll: :c:type:`uv_fs_poll_t` --- FS Poll handle ========================================= FS Poll handles allow the user to monitor a given path for changes. Unlike :c:type:`uv_fs_event_t`, fs poll handles use `stat` to detect when a file has changed so they can work on file systems where fs event handles can't. Data types ---------- .. c:type:: uv_fs_poll_t FS Poll handle type. .. c:type:: void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr) Callback passed to :c:func:`uv_fs_poll_start` which will be called repeatedly after the handle is started, when any change happens to the monitored path. The callback is invoked with `status < 0` if `path` does not exist or is inaccessible. The watcher is *not* stopped but your callback is not called again until something changes (e.g. when the file is created or the error reason changes). When `status == 0`, the callback receives pointers to the old and new :c:type:`uv_stat_t` structs. They are valid for the duration of the callback only. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle) Initialize the handle. .. c:function:: int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb poll_cb, const char* path, unsigned int interval) Check the file at `path` for changes every `interval` milliseconds. .. note:: For maximum portability, use multi-second intervals. Sub-second intervals will not detect all changes on many file systems. .. c:function:: int uv_fs_poll_stop(uv_fs_poll_t* handle) Stop the handle, the callback will no longer be called. .. c:function:: int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len) Get the path being monitored by the handle. The buffer must be preallocated by the user. Returns 0 on success or an error code < 0 in case of failure. On sucess, `buf` will contain the path and `len` its length. If the buffer is not big enough UV_ENOBUFS will be returned and len will be set to the required size. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/handle.rst0000644000175000017500000001433012502366750020454 0ustar jnthnjnthn .. _handle: :c:type:`uv_handle_t` --- Base handle ===================================== `uv_handle_t` is the base type for all libuv handle types. Strcutures are aligned so that any libuv handle can be cast to `uv_handle_t`. All API functions defined here work with any handle type. Data types ---------- .. c:type:: uv_handle_t The base libuv handle type. .. c:type:: uv_any_handle Union of all handle types. .. c:type:: void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) Type definition for callback passed to :c:func:`uv_read_start` and :c:func:`uv_udp_recv_start`. The user must fill the supplied :c:type:`uv_buf_t` structure with whatever size, as long as it's > 0. A suggested size (65536 at the moment) is provided, but it doesn't need to be honored. Setting the buffer's length to 0 will trigger a ``UV_ENOBUFS`` error in the :c:type:`uv_udp_recv_cb` or :c:type:`uv_read_cb` callback. .. c:type:: void (*uv_close_cb)(uv_handle_t* handle) Type definition for callback passed to :c:func:`uv_close`. Public members ^^^^^^^^^^^^^^ .. c:member:: uv_loop_t* uv_handle_t.loop Pointer to the :c:type:`uv_loop_t` where the handle is running on. Readonly. .. c:member:: void* uv_handle_t.data Space for user-defined arbitrary data. libuv does not use this field. API --- .. c:function:: int uv_is_active(const uv_handle_t* handle) Returns non-zero if the handle is active, zero if it's inactive. What "active" means depends on the type of handle: - A uv_async_t handle is always active and cannot be deactivated, except by closing it with uv_close(). - A uv_pipe_t, uv_tcp_t, uv_udp_t, etc. handle - basically any handle that deals with i/o - is active when it is doing something that involves i/o, like reading, writing, connecting, accepting new connections, etc. - A uv_check_t, uv_idle_t, uv_timer_t, etc. handle is active when it has been started with a call to uv_check_start(), uv_idle_start(), etc. Rule of thumb: if a handle of type `uv_foo_t` has a `uv_foo_start()` function, then it's active from the moment that function is called. Likewise, `uv_foo_stop()` deactivates the handle again. .. c:function:: int uv_is_closing(const uv_handle_t* handle) Returns non-zero if the handle is closing or closed, zero otherwise. .. note:: This function should only be used between the initialization of the handle and the arrival of the close callback. .. c:function:: void uv_close(uv_handle_t* handle, uv_close_cb close_cb) Request handle to be closed. `close_cb` will be called asynchronously after this call. This MUST be called on each handle before memory is released. Handles that wrap file descriptors are closed immediately but `close_cb` will still be deferred to the next iteration of the event loop. It gives you a chance to free up any resources associated with the handle. In-progress requests, like uv_connect_t or uv_write_t, are cancelled and have their callbacks called asynchronously with status=UV_ECANCELED. .. c:function:: void uv_ref(uv_handle_t* handle) Reference the given handle. References are idempotent, that is, if a handle is already referenced calling this function again will have no effect. See :ref:`refcount`. .. c:function:: void uv_unref(uv_handle_t* handle) Un-reference the given handle. References are idempotent, that is, if a handle is not referenced calling this function again will have no effect. See :ref:`refcount`. .. c:function:: int uv_has_ref(const uv_handle_t* handle) Returns non-zero if the handle referenced, zero otherwise. See :ref:`refcount`. .. c:function:: size_t uv_handle_size(uv_handle_type type) Returns the size of the given handle type. Useful for FFI binding writers who don't want to know the structure layout. Miscellaneous API functions --------------------------- The following API functions take a :c:type:`uv_handle_t` argument but they work just for some handle types. .. c:function:: int uv_send_buffer_size(uv_handle_t* handle, int* value) Gets or sets the size of the send buffer that the operating system uses for the socket. If `*value` == 0, it will return the current send buffer size, otherwise it will use `*value` to set the new send buffer size. This function works for TCP, pipe and UDP handles on Unix and for TCP and UDP handles on Windows. .. note:: Linux will set double the size and return double the size of the original set value. .. c:function:: int uv_recv_buffer_size(uv_handle_t* handle, int* value) Gets or sets the size of the receive buffer that the operating system uses for the socket. If `*value` == 0, it will return the current receive buffer size, otherwise it will use `*value` to set the new receive buffer size. This function works for TCP, pipe and UDP handles on Unix and for TCP and UDP handles on Windows. .. note:: Linux will set double the size and return double the size of the original set value. .. c:function:: int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) Gets the platform dependent file descriptor equivalent. The following handles are supported: TCP, pipes, TTY, UDP and poll. Passing any other handle type will fail with `UV_EINVAL`. If a handle doesn't have an attached file descriptor yet or the handle itself has been closed, this function will return `UV_EBADF`. .. warning:: Be very careful when using this function. libuv assumes it's in control of the file descriptor so any change to it may lead to malfunction. .. _refcount: Reference counting ------------------ The libuv event loop (if run in the default mode) will run until there are no active `and` referenced handles left. The user can force the loop to exit early by unreferencing handles which are active, for example by calling :c:func:`uv_unref` after calling :c:func:`uv_timer_start`. A handle can be referenced or unreferenced, the refcounting scheme doesn't use a counter, so both operations are idempotent. All handles are referenced when active by default, see :c:func:`uv_is_active` for a more detailed explanation on what being `active` involves. MoarVM-2015.11/3rdparty/libuv/docs/src/idle.rst0000644000175000017500000000226612502366750020143 0ustar jnthnjnthn .. _idle: :c:type:`uv_idle_t` --- Idle handle =================================== Idle handles will run the given callback once per loop iteration, right before the :c:type:`uv_prepare_t` handles. .. note:: The notable difference with prepare handles is that when there are active idle handles, the loop will perform a zero timeout poll instead of blocking for i/o. .. warning:: Despite the name, idle handles will get their callbacks called on every loop iteration, not when the loop is actually "idle". Data types ---------- .. c:type:: uv_idle_t Idle handle type. .. c:type:: void (*uv_idle_cb)(uv_idle_t* handle) Type definition for callback passed to :c:func:`uv_idle_start`. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_idle_init(uv_loop_t*, uv_idle_t* idle) Initialize the handle. .. c:function:: int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb) Start the handle with the given callback. .. c:function:: int uv_idle_stop(uv_idle_t* idle) Stop the handle, the callback will no longer be called. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/index.rst0000644000175000017500000000334712502366750020336 0ustar jnthnjnthn Welcome to the libuv API documentation ====================================== Overview -------- libuv is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by `Node.js`_, but it's also used by `Luvit`_, `Julia`_, `pyuv`_, and `others`_. .. note:: In case you find errors in this documentation you can help by sending `pull requests `_! .. _Node.js: http://nodejs.org .. _Luvit: http://luvit.io .. _Julia: http://julialang.org .. _pyuv: https://github.com/saghul/pyuv .. _others: https://github.com/joyent/libuv/wiki/Projects-that-use-libuv Features -------- * Full-featured event loop backed by epoll, kqueue, IOCP, event ports. * Asynchronous TCP and UDP sockets * Asynchronous DNS resolution * Asynchronous file and file system operations * File system events * ANSI escape code controlled TTY * IPC with socket sharing, using Unix domain sockets or named pipes (Windows) * Child processes * Thread pool * Signal handling * High resolution clock * Threading and synchronization primitives Downloads --------- libuv can be downloaded from `here `_. Installation ------------ Installation instructions can be found on `the README `_. Upgrading --------- Migration guides for different libuv versions, starting with 1.0. .. toctree:: :maxdepth: 1 migration_010_100 Documentation ------------- .. toctree:: :maxdepth: 1 design errors loop handle request timer prepare check idle async poll signal process stream tcp pipe tty udp fs_event fs_poll fs threadpool dns dll threading misc MoarVM-2015.11/3rdparty/libuv/docs/src/loop.rst0000644000175000017500000001121412502366750020170 0ustar jnthnjnthn .. _loop: :c:type:`uv_loop_t` --- Event loop ================================== The event loop is the central part of libuv's functionality. It takes care of polling for i/o and scheduling callbacks to be run based on different sources of events. Data types ---------- .. c:type:: uv_loop_t Loop data type. .. c:type:: uv_run_mode Mode used to run the loop with :c:func:`uv_run`. :: typedef enum { UV_RUN_DEFAULT = 0, UV_RUN_ONCE, UV_RUN_NOWAIT } uv_run_mode; .. c:type:: void (*uv_walk_cb)(uv_handle_t* handle, void* arg) Type definition for callback passed to :c:func:`uv_walk`. Public members ^^^^^^^^^^^^^^ .. c:member:: void* uv_loop_t.data Space for user-defined arbitrary data. libuv does not use this field. libuv does, however, initialize it to NULL in :c:func:`uv_loop_init`, and it poisons the value (on debug builds) on :c:func:`uv_loop_close`. API --- .. c:function:: int uv_loop_init(uv_loop_t* loop) Initializes the given `uv_loop_t` structure. .. c:function:: int uv_loop_close(uv_loop_t* loop) Closes all internal loop resources. This function must only be called once the loop has finished its execution or it will return UV_EBUSY. After this function returns the user shall free the memory allocated for the loop. .. c:function:: uv_loop_t* uv_default_loop(void) Returns the initialized default loop. It may return NULL in case of allocation failture. .. c:function:: int uv_run(uv_loop_t* loop, uv_run_mode mode) This function runs the event loop. It will act differently depending on the specified mode: - UV_RUN_DEFAULT: Runs the event loop until there are no more active and referenced handles or requests. Always returns zero. - UV_RUN_ONCE: Poll for i/o once. Note that this function blocks if there are no pending callbacks. Returns zero when done (no active handles or requests left), or non-zero if more callbacks are expected (meaning you should run the event loop again sometime in the future). - UV_RUN_NOWAIT: Poll for i/o once but don't block if there are no pending callbacks. Returns zero if done (no active handles or requests left), or non-zero if more callbacks are expected (meaning you should run the event loop again sometime in the future). .. c:function:: int uv_loop_alive(const uv_loop_t* loop) Returns non-zero if there are active handles or request in the loop. .. c:function:: void uv_stop(uv_loop_t* loop) Stop the event loop, causing :c:func:`uv_run` to end as soon as possible. This will happen not sooner than the next loop iteration. If this function was called before blocking for i/o, the loop won't block for i/o on this iteration. .. c:function:: size_t uv_loop_size(void) Returns the size of the `uv_loop_t` structure. Useful for FFI binding writers who don't want to know the structure layout. .. c:function:: int uv_backend_fd(const uv_loop_t* loop) Get backend file descriptor. Only kqueue, epoll and event ports are supported. This can be used in conjunction with `uv_run(loop, UV_RUN_NOWAIT)` to poll in one thread and run the event loop's callbacks in another see test/test-embed.c for an example. .. note:: Embedding a kqueue fd in another kqueue pollset doesn't work on all platforms. It's not an error to add the fd but it never generates events. .. c:function:: int uv_backend_timeout(const uv_loop_t* loop) Get the poll timeout. The return value is in milliseconds, or -1 for no timeout. .. c:function:: uint64_t uv_now(const uv_loop_t* loop) Return the current timestamp in milliseconds. The timestamp is cached at the start of the event loop tick, see :c:func:`uv_update_time` for details and rationale. The timestamp increases monotonically from some arbitrary point in time. Don't make assumptions about the starting point, you will only get disappointed. .. note:: Use :c:func:`uv_hrtime` if you need sub-millisecond granularity. .. c:function:: void uv_update_time(uv_loop_t* loop) Update the event loop's concept of "now". Libuv caches the current time at the start of the event loop tick in order to reduce the number of time-related system calls. You won't normally need to call this function unless you have callbacks that block the event loop for longer periods of time, where "longer" is somewhat subjective but probably on the order of a millisecond or more. .. c:function:: void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) Walk the list of handles: `walk_cb` will be executed with the given `arg`. MoarVM-2015.11/3rdparty/libuv/docs/src/migration_010_100.rst0000644000175000017500000001474512502366750022164 0ustar jnthnjnthn .. _migration_010_100: libuv 0.10 -> 1.0.0 migration guide =================================== Some APIs changed quite a bit throughout the 1.0.0 development process. Here is a migration guide for the most significant changes that happened after 0.10 was released. Loop initialization and closing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In libuv 0.10 (and previous versions), loops were created with `uv_loop_new`, which allocated memory for a new loop and initialized it; and destroyed with `uv_loop_delete`, which destroyed the loop and freed the memory. Starting with 1.0, those are deprecated and the user is responsible for allocating the memory and then initializing the loop. libuv 0.10 :: uv_loop_t* loop = uv_loop_new(); ... uv_loop_delete(loop); libuv 1.0 :: uv_loop_t* loop = malloc(sizeof *loop); uv_loop_init(loop); ... uv_loop_close(loop); free(loop); .. note:: Error handling was omitted for brevity. Check the documentation for :c:func:`uv_loop_init` and :c:func:`uv_loop_close`. Error handling ~~~~~~~~~~~~~~ Error handling had a major overhaul in libuv 1.0. In general, functions and status parameters would get 0 for success and -1 for failure on libuv 0.10, and the user had to use `uv_last_error` to fetch the error code, which was a positive number. In 1.0, functions and status parameters contain the actual error code, which is 0 for success, or a negative number in case of error. libuv 0.10 :: ... assume 'server' is a TCP server which is already listening r = uv_listen((uv_stream_t*) server, 511, NULL); if (r == -1) { uv_err_t err = uv_last_error(uv_default_loop()); /* err.code contains UV_EADDRINUSE */ } libuv 1.0 :: ... assume 'server' is a TCP server which is already listening r = uv_listen((uv_stream_t*) server, 511, NULL); if (r < 0) { /* r contains UV_EADDRINUSE */ } Threadpool changes ~~~~~~~~~~~~~~~~~~ In libuv 0.10 Unix used a threadpool which defaulted to 4 threads, while Windows used the `QueueUserWorkItem` API, which uses a Windows internal threadpool, which defaults to 512 threads per process. In 1.0, we unified both implementations, so Windows now uses the same implementation Unix does. The threadppol size can be set by exporting the ``UV_THREADPOOL_SIZE`` environment variable. See :c:ref:`threadpool`. Allocation callback API change ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In libuv 0.10 the callback had to return a filled :c:type:`uv_buf_t` by value: :: uv_buf_t alloc_cb(uv_handle_t* handle, size_t size) { return uv_buf_init(malloc(size), size); } In libuv 1.0 a pointer to a buffer is passed to the callbck, which the user needs to fill: :: void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = malloc(size); buf->len = size; } Unification of IPv4 / IPv6 APIs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ libuv 1.0 unified the IPv4 and IPv6 APIS. There is no longer a `uv_tcp_bind` and `uv_tcp_bind6` duality, there is only :c:func:`uv_tcp_bind` now. IPv4 functions took ``struct sockaddr_in`` structures by value, and IPv6 functions took ``struct sockaddr_in6``. Now functions take a ``struct sockaddr*`` (note it's a pointer). It can be stack allocated. libuv 0.10 :: struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", 1234); ... uv_tcp_bind(&server, addr) libuv 1.0 :: struct sockaddr_in addr; uv_ip4_addr("0.0.0.0", 1234, &addr) ... uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); The IPv4 and IPv6 struct creating functions (:c:func:`uv_ip4_addr` and :c:func:`uv_ip6_addr`) have also changed, make sure you check the documentation. ..note:: This change applies to all functions that made a distinction between IPv4 and IPv6 addresses. Streams / UDP data receive callback API change ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The streams and UDP data receive callbacks now get a pointer to a :c:type:`uv_buf_t` buffer, not a structure by value. libuv 0.10 :: void on_read(uv_stream_t* handle, ssize_t nread, uv_buf_t buf) { ... } void recv_cb(uv_udp_t* handle, ssize_t nread, uv_buf_t buf, struct sockaddr* addr, unsigned flags) { ... } libuv 1.0 :: void on_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { ... } void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { ... } Receiving handles over pipes API change ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In libuv 0.10 (and earlier versions) the `uv_read2_start` function was used to start reading data on a pipe, which could also result in the reception of handles over it. The callback for such function looked like this: :: void on_read(uv_pipe_t* pipe, ssize_t nread, uv_buf_t buf, uv_handle_type pending) { ... } In libuv 1.0, `uv_read2_start` was removed, and the user needs to check if there are penging handles using :c:func:`uv_pipe_pending_count` and :c:func:`uv_pipe_pending_type` while in the read callback: :: void on_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { ... while (uv_pipe_pending_count((uv_pipe_t*) handle) != 0) { pending = uv_pipe_pending_type((uv_pipe_t*) handle); ... } ... } Extracting the file descriptor out of a handle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While it wasn't supported by the API, users often accessed the libuv internals in order to get access to the file descript of a TCP handle, for example. :: fd = handle->io_watcher.fd; This is now properly exposed through the :c:func:`uv_fileno` function. uv_fs_readdir rename and API change ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `uv_fs_readdir` returned a list of strings in the `req->ptr` field upon completion in libuv 0.10. In 1.0, this function got renamed to :c:func:`uv_fs_scandir`, since it's actually implemented using ``scandir(3)``. In addition, instead of allocating a full list strings, the user is able to get one result at a time by using the :c:func:`uv_fs_scandir_next` function. This function does not need to make a roundtrip to the threadpool, because libuv will keep the list of *dents* returned by ``scandir(3)`` around. MoarVM-2015.11/3rdparty/libuv/docs/src/misc.rst0000644000175000017500000001650112502366750020156 0ustar jnthnjnthn .. _misc: Miscelaneous utilities ====================== This section contains miscelaneous functions that don't really belong in any other section. Data types ---------- .. c:type:: uv_buf_t Buffer data type. .. c:type:: uv_file Cross platform representation of a file handle. .. c:type:: uv_os_sock_t Cross platform representation of a socket handle. .. c:type:: uv_os_fd_t Abstract representation of a file descriptor. On Unix systems this is a `typedef` of `int` and on Windows fa `HANDLE`. .. c:type:: uv_rusage_t Data type for resource usage results. :: typedef struct { uv_timeval_t ru_utime; /* user CPU time used */ uv_timeval_t ru_stime; /* system CPU time used */ uint64_t ru_maxrss; /* maximum resident set size */ uint64_t ru_ixrss; /* integral shared memory size */ uint64_t ru_idrss; /* integral unshared data size */ uint64_t ru_isrss; /* integral unshared stack size */ uint64_t ru_minflt; /* page reclaims (soft page faults) */ uint64_t ru_majflt; /* page faults (hard page faults) */ uint64_t ru_nswap; /* swaps */ uint64_t ru_inblock; /* block input operations */ uint64_t ru_oublock; /* block output operations */ uint64_t ru_msgsnd; /* IPC messages sent */ uint64_t ru_msgrcv; /* IPC messages received */ uint64_t ru_nsignals; /* signals received */ uint64_t ru_nvcsw; /* voluntary context switches */ uint64_t ru_nivcsw; /* involuntary context switches */ } uv_rusage_t; .. c:type:: uv_cpu_info_t Data type for CPU information. :: typedef struct uv_cpu_info_s { char* model; int speed; struct uv_cpu_times_s { uint64_t user; uint64_t nice; uint64_t sys; uint64_t idle; uint64_t irq; } cpu_times; } uv_cpu_info_t; .. c:type:: uv_interface_address_t Data type for interface addresses. :: typedef struct uv_interface_address_s { char* name; char phys_addr[6]; int is_internal; union { struct sockaddr_in address4; struct sockaddr_in6 address6; } address; union { struct sockaddr_in netmask4; struct sockaddr_in6 netmask6; } netmask; } uv_interface_address_t; API --- .. c:function:: uv_handle_type uv_guess_handle(uv_file file) Used to detect what type of stream should be used with a given file descriptor. Usually this will be used during initialization to guess the type of the stdio streams. For ``isatty()`` functionality use this function and test for ``UV_TTY``. .. c:function:: unsigned int uv_version(void) Returns the libuv version packed into a single integer. 8 bits are used for each component, with the patch number stored in the 8 least significant bits. E.g. for libuv 1.2.3 this would return 0x010203. .. c:function:: const char* uv_version_string(void) Returns the libuv version number as a string. For non-release versions "-pre" is appended, so the version number could be "1.2.3-pre". .. c:function:: uv_buf_t uv_buf_init(char* base, unsigned int len) Constructor for :c:type:`uv_buf_t`. Due to platform differences the user cannot rely on the ordering of the `base` and `len` members of the uv_buf_t struct. The user is responsible for freeing `base` after the uv_buf_t is done. Return struct passed by value. .. c:function:: char** uv_setup_args(int argc, char** argv) Store the program arguments. Required for getting / setting the process title. .. c:function:: int uv_get_process_title(char* buffer, size_t size) Gets the title of the current process. .. c:function:: int uv_set_process_title(const char* title) Sets the current process title. .. c:function:: int uv_resident_set_memory(size_t* rss) Gets the resident set size (RSS) for the current process. .. c:function:: int uv_uptime(double* uptime) Gets the current system uptime. .. c:function:: int uv_getrusage(uv_rusage_t* rusage) Gets the resource usage measures for the current process. .. note:: On Windows not all fields are set, the unsupported fields are filled with zeroes. .. c:function:: int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) Gets information about the CPUs on the system. The `cpu_infos` array will have `count` elements and needs to be freed with :c:func:`uv_free_cpu_info`. .. c:function:: void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) Frees the `cpu_infos` array previously allocated with :c:func:`uv_cpu_info`. .. c:function:: int uv_interface_addresses(uv_interface_address_t** addresses, int* count) Gets address information about the network interfaces on the system. An array of `count` elements is allocated and returned in `addresses`. It must be freed by the user, calling :c:func:`uv_free_interface_addresses`. .. c:function:: void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) Free an array of :c:type:`uv_interface_address_t` which was returned by :c:func:`uv_interface_addresses`. .. c:function:: void uv_loadavg(double avg[3]) Gets the load average. See: ``_ .. note:: Returns [0,0,0] on Windows (i.e., it's not implemented). .. c:function:: int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) Convert a string containing an IPv4 addresses to a binary structure. .. c:function:: int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) Convert a string containing an IPv6 addresses to a binary structure. .. c:function:: int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) Convert a binary structure containing an IPv4 addres to a string. .. c:function:: int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) Convert a binary structure containing an IPv6 addres to a string. .. c:function:: int uv_inet_ntop(int af, const void* src, char* dst, size_t size) .. c:function:: int uv_inet_pton(int af, const char* src, void* dst) Cross-platform IPv6-capable implementation of the 'standard' ``inet_ntop()`` and ``inet_pton()`` functions. On success they return 0. In case of error the target `dst` pointer is unmodified. .. c:function:: int uv_exepath(char* buffer, size_t* size) Gets the executable path. .. c:function:: int uv_cwd(char* buffer, size_t* size) Gets the current working directory. .. c:function:: int uv_chdir(const char* dir) Changes the current working directory. .. uint64_t uv_get_free_memory(void) .. c:function:: uint64_t uv_get_total_memory(void) Gets memory information (in bytes). .. c:function:: uint64_t uv_hrtime(void) Returns the current high-resolution real time. This is expressed in nanoseconds. It is relative to an arbitrary time in the past. It is not related to the time of day and therefore not subject to clock drift. The primary use is for measuring performance between intervals. .. note:: Not every platform can support nanosecond resolution; however, this value will always be in nanoseconds. MoarVM-2015.11/3rdparty/libuv/docs/src/pipe.rst0000644000175000017500000000477612502366750020173 0ustar jnthnjnthn .. _pipe: :c:type:`uv_pipe_t` --- Pipe handle =================================== Pipe handles provide an abstraction over local domain sockets on Unix and named pipes on Windows. :c:type:`uv_pipe_t` is a 'subclass' of :c:type:`uv_stream_t`. Data types ---------- .. c:type:: uv_pipe_t Pipe handle type. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_stream_t` members also apply. API --- .. c:function:: int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc) Initialize a pipe handle. The `ipc` argument is a boolean to indicate if this pipe will be used for handle passing between processes. .. c:function:: int uv_pipe_open(uv_pipe_t*, uv_file file) Open an existing file descriptor or HANDLE as a pipe. .. note:: The user is responsible for setting the dile descriptor in non-blocking mode. .. c:function:: int uv_pipe_bind(uv_pipe_t* handle, const char* name) Bind the pipe to a file path (Unix) or a name (Windows). .. note:: Paths on Unix get truncated to ``sizeof(sockaddr_un.sun_path)`` bytes, typically between 92 and 108 bytes. .. c:function:: void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) Connect to the Unix domain socket or the named pipe. .. note:: Paths on Unix get truncated to ``sizeof(sockaddr_un.sun_path)`` bytes, typically between 92 and 108 bytes. .. c:function:: int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) Get the name of the Unix domain socket or the named pipe. A preallocated buffer must be provided. The len parameter holds the length of the buffer and it's set to the number of bytes written to the buffer on output. If the buffer is not big enough ``UV_ENOBUFS`` will be returned and len will contain the required size. .. c:function:: void uv_pipe_pending_instances(uv_pipe_t* handle, int count) Set the number of pending pipe instance handles when the pipe server is waiting for connections. .. note:: This setting applies to Windows only. .. c:function:: int uv_pipe_pending_count(uv_pipe_t* handle) .. c:function:: uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) Used to receive handles over IPC pipes. First - call :c:func:`uv_pipe_pending_count`, if it's > 0 then initialize a handle of the given `type`, returned by :c:func:`uv_pipe_pending_type` and call ``uv_accept(pipe, handle)``. .. seealso:: The :c:type:`uv_stream_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/poll.rst0000644000175000017500000000640312502366750020171 0ustar jnthnjnthn .. _poll: :c:type:`uv_poll_t` --- Poll handle =================================== Poll handles are used to watch file descriptors for readability and writability, similar to the purpose of poll(2). The purpose of poll handles is to enable integrating external libraries that rely on the event loop to signal it about the socket status changes, like c-ares or libssh2. Using uv_poll_t for any other purpose is not recommended; :c:type:`uv_tcp_t`, :c:type:`uv_udp_t`, etc. provide an implementation that is faster and more scalable than what can be achieved with :c:type:`uv_poll_t`, especially on Windows. It is possible that poll handles occasionally signal that a file descriptor is readable or writable even when it isn't. The user should therefore always be prepared to handle EAGAIN or equivalent when it attempts to read from or write to the fd. It is not okay to have multiple active poll handles for the same socket, this can cause libuv to busyloop or otherwise malfunction. The user should not close a file descriptor while it is being polled by an active poll handle. This can cause the handle to report an error, but it might also start polling another socket. However the fd can be safely closed immediately after a call to :c:func:`uv_poll_stop` or :c:func:`uv_close`. .. note:: On windows only sockets can be polled with poll handles. On Unix any file descriptor that would be accepted by poll(2) can be used. Data types ---------- .. c:type:: uv_poll_t Poll handle type. .. c:type:: void (*uv_poll_cb)(uv_poll_t* handle, int status, int events) Type definition for callback passed to :c:func:`uv_poll_start`. .. c:type:: uv_poll_event Poll event types :: enum uv_poll_event { UV_READABLE = 1, UV_WRITABLE = 2 }; Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) Initialize the handle using a file descriptor. .. c:function:: int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) Initialize the handle using a socket descriptor. On Unix this is identical to :c:func:`uv_poll_init`. On windows it takes a SOCKET handle. .. c:function:: int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb) Starts polling the file descriptor. `events` is a bitmask consisting made up of UV_READABLE and UV_WRITABLE. As soon as an event is detected the callback will be called with `status` set to 0, and the detected events set on the `events` field. If an error happens while polling, `status` will be < 0 and corresponds with one of the UV_E* error codes (see :ref:`errors`). The user should not close the socket while the handle is active. If the user does that anyway, the callback *may* be called reporting an error status, but this is **not** guaranteed. .. note:: Calling :c:func:`uv_poll_start` on a handle that is already active is fine. Doing so will update the events mask that is being watched for. .. c:function:: int uv_poll_stop(uv_poll_t* poll) Stop polling the file descriptor, the callback will no longer be called. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/prepare.rst0000644000175000017500000000164112502366750020660 0ustar jnthnjnthn .. _prepare: :c:type:`uv_prepare_t` --- Prepare handle ========================================= Prepare handles will run the given callback once per loop iteration, right before polling for i/o. Data types ---------- .. c:type:: uv_prepare_t Prepare handle type. .. c:type:: void (*uv_prepare_cb)(uv_prepare_t* handle) Type definition for callback passed to :c:func:`uv_prepare_start`. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_prepare_init(uv_loop_t* loop, uv_prepare_t* prepare) Initialize the handle. .. c:function:: int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb) Start the handle with the given callback. .. c:function:: int uv_prepare_stop(uv_prepare_t* prepare) Stop the handle, the callback will no longer be called. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/process.rst0000644000175000017500000001644012502366750020703 0ustar jnthnjnthn .. _process: :c:type:`uv_process_t` --- Process handle ========================================= Process handles will spawn a new process and allow the user to control it and establish communication channels with it using streams. Data types ---------- .. c:type:: uv_process_t Process handle type. .. c:type:: uv_process_options_t Options for spawning the process (passed to :c:func:`uv_spawn`. :: typedef struct uv_process_options_s { uv_exit_cb exit_cb; const char* file; char** args; char** env; const char* cwd; unsigned int flags; int stdio_count; uv_stdio_container_t* stdio; uv_uid_t uid; uv_gid_t gid; } uv_process_options_t; .. c:type:: void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal) Type definition for callback passed in :c:type:`uv_process_options_t` which will indicate the exit status and the signal that caused the process to terminate, if any. .. c:type:: uv_process_flags Flags to be set on the flags field of :c:type:`uv_process_options_t`. :: enum uv_process_flags { /* * Set the child process' user id. */ UV_PROCESS_SETUID = (1 << 0), /* * Set the child process' group id. */ UV_PROCESS_SETGID = (1 << 1), /* * Do not wrap any arguments in quotes, or perform any other escaping, when * converting the argument list into a command line string. This option is * only meaningful on Windows systems. On Unix it is silently ignored. */ UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), /* * Spawn the child process in a detached state - this will make it a process * group leader, and will effectively enable the child to keep running after * the parent exits. Note that the child process will still keep the * parent's event loop alive unless the parent process calls uv_unref() on * the child's process handle. */ UV_PROCESS_DETACHED = (1 << 3), /* * Hide the subprocess console window that would normally be created. This * option is only meaningful on Windows systems. On Unix it is silently * ignored. */ UV_PROCESS_WINDOWS_HIDE = (1 << 4) }; .. c:type:: uv_stdio_container_t Container for each stdio handle or fd passed to a child process. :: typedef struct uv_stdio_container_s { uv_stdio_flags flags; union { uv_stream_t* stream; int fd; } data; } uv_stdio_container_t; .. c:type:: uv_stdio_flags Flags specifying how a stdio should be transmitted to the child process. :: typedef enum { UV_IGNORE = 0x00, UV_CREATE_PIPE = 0x01, UV_INHERIT_FD = 0x02, UV_INHERIT_STREAM = 0x04, /* * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE * determine the direction of flow, from the child process' perspective. Both * flags may be specified to create a duplex data stream. */ UV_READABLE_PIPE = 0x10, UV_WRITABLE_PIPE = 0x20 } uv_stdio_flags; Public members ^^^^^^^^^^^^^^ .. c:member:: uv_process_t.pid The PID of the spawned process. It's set after calling :c:func:`uv_spawn`. .. note:: The :c:type:`uv_handle_t` members also apply. .. c:member:: uv_process_options_t.exit_cb Callback called after the process exits. .. c:member:: uv_process_options_t.file Path pointing to the program to be executed. .. c:member:: uv_process_options_t.args Command line arguments. args[0] should be the path to the program. On Windows this uses `CreateProcess` which concatenates the arguments into a string this can cause some strange errors. See the ``UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS`` flag on :c:type:`uv_process_flags`. .. c:member:: uv_process_options_t.env Environment for the new process. If NULL the parents environment is used. .. c:member:: uv_process_options_t.cwd Current working directory for the subprocess. .. c:member:: uv_process_options_t.flags Various flags that control how :c:func:`uv_spawn` behaves. See :c:type:`uv_process_flags`. .. c:member:: uv_process_options_t.stdio_count .. c:member:: uv_process_options_t.stdio The `stdio` field points to an array of :c:type:`uv_stdio_container_t` structs that describe the file descriptors that will be made available to the child process. The convention is that stdio[0] points to stdin, fd 1 is used for stdout, and fd 2 is stderr. .. note:: On Windows file descriptors greater than 2 are available to the child process only if the child processes uses the MSVCRT runtime. .. c:member:: uv_process_options_t.uid .. c:member:: uv_process_options_t.gid Libuv can change the child process' user/group id. This happens only when the appropriate bits are set in the flags fields. .. note:: This is not supported on Windows, :c:func:`uv_spawn` will fail and set the error to ``UV_ENOTSUP``. .. c:member:: uv_stdio_container_t.flags Flags specifying how the stdio container should be passed to the child. See :c:type:`uv_stdio_flags`. .. c:member:: uv_stdio_container_t.data Union containing either the stream or fd to be passed on to the child process. API --- .. c:function:: void uv_disable_stdio_inheritance(void) Disables inheritance for file descriptors / handles that this process inherited from its parent. The effect is that child processes spawned by this process don't accidentally inherit these handles. It is recommended to call this function as early in your program as possible, before the inherited file descriptors can be closed or duplicated. .. note:: This function works on a best-effort basis: there is no guarantee that libuv can discover all file descriptors that were inherited. In general it does a better job on Windows than it does on Unix. .. c:function:: int uv_spawn(uv_loop_t* loop, uv_process_t* handle, const uv_process_options_t* options) Initializes the process handle and starts the process. If the process is successfully spawned, this function will return 0. Otherwise, the negative error code corresponding to the reason it couldn't spawn is returned. Possible reasons for failing to spawn would include (but not be limited to) the file to execute not existing, not having permissions to use the setuid or setgid specified, or not having enough memory to allocate for the new process. .. c:function:: int uv_process_kill(uv_process_t* handle, int signum) Sends the specified signal to the given process handle. Check the documentation on :c:ref:`signal` for signal support, specially on Windows. .. c:function:: int uv_kill(int pid, int signum) Sends the specified signal to the given PID. Check the documentation on :c:ref:`signal` for signal support, specially on Windows. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/request.rst0000644000175000017500000000401112502366750020704 0ustar jnthnjnthn .. _request: :c:type:`uv_req_t` --- Base request =================================== `uv_req_t` is the base type for all libuv request types. Strcutures are aligned so that any libuv request can be cast to `uv_req_t`. All API functions defined here work with any request type. Data types ---------- .. c:type:: uv_req_t The base libuv request structure. .. c:type:: uv_any_req Union of all request types. Public members ^^^^^^^^^^^^^^ .. c:member:: void* uv_request_t.data Space for user-defined arbitrary data. libuv does not use this field. .. c:member:: uv_req_type uv_req_t.type Indicated the type of request. Readonly. :: typedef enum { UV_UNKNOWN_REQ = 0, UV_REQ, UV_CONNECT, UV_WRITE, UV_SHUTDOWN, UV_UDP_SEND, UV_FS, UV_WORK, UV_GETADDRINFO, UV_GETNAMEINFO, UV_REQ_TYPE_PRIVATE, UV_REQ_TYPE_MAX, } uv_req_type; API --- .. c:function:: int uv_cancel(uv_req_t* req) Cancel a pending request. Fails if the request is executing or has finished executing. Returns 0 on success, or an error code < 0 on failure. Only cancellation of :c:type:`uv_fs_t`, :c:type:`uv_getaddrinfo_t`, :c:type:`uv_getnameinfo_t` and :c:type:`uv_work_t` requests is currently supported. Cancelled requests have their callbacks invoked some time in the future. It's **not** safe to free the memory associated with the request until the callback is called. Here is how cancellation is reported to the callback: * A :c:type:`uv_fs_t` request has its req->result field set to `UV_ECANCELED`. * A :c:type:`uv_work_t`, :c:type:`uv_getaddrinfo_t` or c:type:`uv_getnameinfo_t` request has its callback invoked with status == `UV_ECANCELED`. .. c:function:: size_t uv_req_size(uv_req_type type) Returns the size of the given request type. Useful for FFI binding writers who don't want to know the structure layout. MoarVM-2015.11/3rdparty/libuv/docs/src/signal.rst0000644000175000017500000000472612502366750020506 0ustar jnthnjnthn .. _signal: :c:type:`uv_signal_t` --- Signal handle ======================================= Signal handles implement Unix style signal handling on a per-event loop bases. Reception of some signals is emulated on Windows: * SIGINT is normally delivered when the user presses CTRL+C. However, like on Unix, it is not generated when terminal raw mode is enabled. * SIGBREAK is delivered when the user pressed CTRL + BREAK. * SIGHUP is generated when the user closes the console window. On SIGHUP the program is given approximately 10 seconds to perform cleanup. After that Windows will unconditionally terminate it. * SIGWINCH is raised whenever libuv detects that the console has been resized. SIGWINCH is emulated by libuv when the program uses a :c:type:`uv_tty_t` handle to write to the console. SIGWINCH may not always be delivered in a timely manner; libuv will only detect size changes when the cursor is being moved. When a readable :c:type:`uv_tty_t` handle is used in raw mode, resizing the console buffer will also trigger a SIGWINCH signal. Watchers for other signals can be successfully created, but these signals are never received. These signals are: `SIGILL`, `SIGABRT`, `SIGFPE`, `SIGSEGV`, `SIGTERM` and `SIGKILL.` Calls to raise() or abort() to programmatically raise a signal are not detected by libuv; these will not trigger a signal watcher. .. note:: On Linux SIGRT0 and SIGRT1 (signals 32 and 33) are used by the NPTL pthreads library to manage threads. Installing watchers for those signals will lead to unpredictable behavior and is strongly discouraged. Future versions of libuv may simply reject them. Data types ---------- .. c:type:: uv_signal_t Signal handle type. .. c:type:: void (*uv_signal_cb)(uv_signal_t* handle, int signum) Type definition for callback passed to :c:func:`uv_signal_start`. Public members ^^^^^^^^^^^^^^ .. c:member:: int uv_signal_t.signum Signal being monitored by this handle. Readonly. .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_signal_init(uv_loop_t*, uv_signal_t* signal) Initialize the handle. .. c:function:: int uv_signal_start(uv_signal_t* signal, uv_signal_cb cb, int signum) Start the handle with the given callback, watching for the given signal. .. c:function:: int uv_signal_stop(uv_signal_t* signal) Stop the handle, the callback will no longer be called. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/static/architecture.png0000644000175000017500000062365712502366750023170 0ustar jnthnjnthn‰PNG  IHDRüí¤´uì AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ@IDATxìœ%GuîkrÚ¬€rŽHB I(L²Ù<0ØÆ˜`„Á6Á€1×ÞÞêÒémöît{öîuÓ¾.í¾¾ÈëôuèêÂ_Wøƒ]G»/¿½Ío£Ý×s2lwxx$ÔÚ×»Û³Àþ᯷·ÇõôtWü}Ym¾LïíëÐîº}¹¨ËL»»v»Í›7»Ý{öºÞž×ë¹Â<+\'ÝÄ䄯'¸¶‡ºöøí ô÷ù¿®~û}aPæ.ßV;<£íÛw¸¾½öz¾]nÝÚ5nýúunçƒ8Xc_F=¯Qß.hÔûhGð±l¸“{pûöP_ô4ûÈȨñ¸÷…vééî uCýÐV xF=¡ßŒùö÷ÛCÛ¡z=»µëÖº~ßGraçôÀ¦MaÑÞèkhs´ïø¸gæËB  ÝF}}öùÂBý½ Úm…°{÷n744â°­ì¯oߦè`ƒý‡/ØcÿÐÇGüþáõ÷;ïz<ôoôí^ßßÁ m ßàä·êéˉYâ8ؾc§Û´i³ ¬`~è8F&ý6'|»’)ú+LgŽ­.ï7á„ãÊ—KƒhspI”‹~²Ùß{öì ~¨/Ž­iŸ‡ýD¿ÂöÖú~ƒþ~‚£<ôqoƒ:#rrÊ·ÍîîžwGgèÓ¡íC=+}}Û@ŸÃ˜²Í÷×Ûw_ô!ôu¾/TúëÚÐ_Š~ˆ: ‡ýEEÐv8¶Ð¾8&Q¶ ;wír÷?°ÉíõýíŠcÇï°/û‡ýÄþB_åêëêû Ú} mŽIÏy¨£=†ì6qÌ>¸m»Û²ek8§0ù~„zNMOU¶ëu«V­r«×¬rSž¶¦¬|°}pEŸG]±[Wùc*Œ¯¾>è`³sÇ®0Vb¼ÜµkO¨;lql+Æ\ì·‡:ã˜À˜S©«s|}ÑŸãýD`ÿÐwÁ±ÛoÇú-ÆH‹°Á±„q mZù¨ŽWàYáZùýh÷Ç!x`|²c¥åо¸eëƒn«ÿC]§÷M‡ö‡ï¤ç‰òüfÝZì›ï3•qÔïÏ̆}Åq ¶ÇÀÇ5³POŒ«Lžc_ýXŠceÆVÜâw튱tÃÌØºÞ÷‰Õ~ÛvCÁdÒÿ† ì¯hGôYЛ}ŸÁñˆ¾‰ãÇö튲°(}uãÊêðc7Ç,üþáXŘ<æÇøvúß8ŒUhwüfÆ´Æ}†”ïu¶ÝQ7ŒÁ›·l ã|P¶‡²Ñ澞³Îºü¹ú~|›`Û}>ÎÆýqå÷¾?p¼¡_®Y½ºè—¬%ö ý¿q/öù<À¶1¢Nh gÂñçy¡s uÁþ …}Â1ú†·|fÚýýýû6Ç1µÝW;vîôç{½_{q\a›ëÖ® û€vc@û¡®ØÊ_HØÄ}Ç;~çÐÇñÛη|Ûà7ÇêãûÚ¨æ7Ë÷¯ç8‚vÁþ‡>à¹ÁÇ3ö Ç#ø„>æÛeá·¡ô¼Å8Ä9T8–|?BÀoUåx›}Þ»þþ^ßö¾ýWùm{‰6`ßÙåÏ…ð[¶øM(Î[Öùó–™1 ¿?«ýø`ûd8oñ\p|Ö=oñÇ~¶mÛöc(~*†}»à7e TÏ[*ŒÈ ûÇßWô×pÞâ÷ãúL. Ï<àû+$ø€1ú+¶7æÛc&ŽÃõë׆sœ· ð÷û V°ÇùÝp|Þ2sÞÚíe§?×›}Þ2ú^ê¼¥¿Ï÷¿è‡Éó_OŒëà€ão‡?ö°Oà±þ¨ö/Œ3Çs…iå } ç®Ø&Î1à|+œ·ø2é‹í Ïó\žÛµ墿„óß9.‚«=oÁ6ÐoÐïãóô{´|ñ‰ßì%ú$úΛ«sŒ­~Œôm‡|¿ùPßp>èý0†Á}ý»¿·¯†k8Ægò·Ì,WŒïÓ6mÚâë;ŽQ“¨»àwu@›á÷û‰~ºÊ¯ý^¢?!à¸ßé9…ß,?^á8Ãï ly\ár€~‚Mùñ &œ@ìï€>‡¶œK{‡'Áeœ`‡cl±ß»qÑÍÇ­ÂdÐ÷Œ½õŽ»fÖ펓×pÌ£ø1Š“šýÛÙH½ç3^á·¿±¸ºçì8fáÂ.BÍ¥¯åÊm–žç-¼ðÙ¬rQÎ|¸6zÞ‚sXpÅù,&d8¶+p2‹ßü¾®¼ó–Ê…aŒee}¹Ù|Ñ÷pA¡\}ḩˆ:,ÕyK3÷c?Îuq¬cŸšy~‹ßüÍõ\¿Y¸©T6ïC¹˜¸âØÂw¯?‡Ä…·Å ˜¬‡mùßpâ9Öbms±ÊÅX „t;òÈÃÝi§œnÍw{m¾ó¤ÏØfJDöÏ~~‡»úû?W“æ»!ù‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€4NOÎ9û,÷˜K/7÷¬X–Nø·>¸Í}íëW†;ûs-WK»ü²/H,ÅÃ’á ¿ü¡Þ]J\ÅÂUO^•EþXÚ†«O¸àûö+W==_´ üØ>¨c°\U…/êO?ì/âeým¶ÜwÜY¨[XžèÂ,¬*ÀÊØ! ¾Xš‹eÉõ¶{”€ý 0A™`Ërñ¨Lê. Úe Úvı‰åϸƒ‹1¥ÒgÓ+NÀwC±Ï•Õ?Ã5e†ŒþG¦à‹»Ù¸³€ã û®XJ‡»Ða5Š·ÃÒr´5îÎaI*9åª~hûP¶igp×Ê]Î0V‚)îhÄüPq泿ãÈsüa @ŒÛõàf,ÅòhŒ‘a º÷kf@Ç’@,+ÇXŒ¦`[áŠ;xDÆßÝÇ]?& ¾X2‡ãµ‘•E9®hKü¾ðn%–ÿïòí„eœ6À\ýa^Œ›ÌÇÒý>¿TsŸoëp×vflµc0mÑ.Øì–‚ÂÇ]x Áïo3úŠmOô,ÍggømÂ~VÆ^ünûešaùáhØ7øãØÄþ¢¯ „eµ~Ü- (/ŒY^¢¿TúVýs° }ÀûáqŸÊ*¾Ús,™c,‹E¿Gô_,ÙÄq~õ|°-ô);öb_+«*+G°„t管þ¶Løƒ –ƒ‚Ë@™á1߇±ä¶Ú*¿±ñ1>‡þ†»¿øÝO3W© >øcý°hôS´-Žãø¼ýKu1V!Ž:b\E» ôepó\À6a>ø-ø¼Kw±\Íy êô¿Ê2òÅ?o ËÜýx…þš:o µøßW<ú•óÿûê ñûšª¼?h+0E{Ø>TÇürb¬øþƒcK²­ ú*ÒÔ¡,ôQø"` ÀyTÍy‹OWÆÊJ9´%Ž9Œ·\Âsš¸®Lc»‹~Þ2€GüþÏüÞ‡ó¿ºçïvÜcb èŸäÎø} çC¾ï"àÑœÙ_» ÔKà1¦£<ün`¥nààÇ”‹ã烕c¤òX3ƹðŒ1ÙÛ°.v{Œc»<¶P6»í8D[+sç8Np‡¼‘s”‡ñ ã.Îð˜Æ>Jf··Ðxø Áï€oÌÿâsŒ×èÇ8å8cÏÊ8¢<´"ضDYÅ9–#ÇŽ â>.xì¿éøÍC@û <Œ`ŒÇqFFý#3}«'qœà­l‹ßˆK.¾Ð÷ˆsÂØmëQÏNøòÓëÝ•W}7tV€N|ܱǸ£>Ê|Іp ðY> pöÄ—>±tì4N¾± ?Ú€€FåAûÍ%N‡ÁnÒoPш8Gù˜Ä6–å¢mƒS‰:cÒ‡Éfx¦Ñ7$~è s©7ÊöRlP.þPoÏÛg0Ê” på$þ8°Ñ9lÀ„¿²ò`v|ì_ÌŒe¢Îqr… öáY¿Åô‡.П8` âà†za¿pcYŸÊm‡ÛkDâ`šY~Ž>€ ûHôÛà‡ýŶ­žÛìòЇÀ:´š? )?úDz¬ ÿbÀñލ7ú@ªßÚrQ´?ú=ú*ê…gªÁ8Þ_ë×huÆ`^y.Ô—ïY?”O®¶¼z\ÑgÑVè³ØON°l¶Z}‡  ¬\{à¤'X8¦Á~ø±Ø°~}8–q!ûŽo´?± ±osœä` &eïʶ×/—F1AÇB¥_€+ÊÆóð•‹;ØŽ ð-ø§ûlp\«µe»€QÙñ;ð„m\»mô <·>4ès?È8áÙ°ÁŸøø1?j°ÁÚÛóã9‚u8iŽö×n§Ñ8êg{qbå«_©?ާ™c ?¬– Ê­Çu[ôypµüÈ :«æ?ÚÕãŠ|ô üž¡¿blEqR†þŠcõAûê…þŒ¾ƒýÃë‰úcŒÀ‰ì ¬gÊœ11 ?(à\€¿Yõ¶Á߬Å:Àï øa;•s<]9vQ7ô¸À!ÖCøÀ Žü†¡oÛü{n ‚=lÀÛŠûbÈðÿ…~ìÇ+ôŒIø½E¹xïÞ·‚ó'^@_Çd ¿Qá÷Õ÷õð¾/YOƒ8þЇRûÈíÆ²¬€/ê‰2q<ó8ËíÊG™À³‘óØ—•‡2-WØæöuÅEgpEÝÁö¸pÞ?ã·ÞàÛÐÞ¾¿€+ö¯Ùç-Ø·ÐŽ¾>؇pÞâëƒßÐW}…´} >°Å>Z=8 ð|y+Pwô'ü¾á¦ Î]S~ï¹ý&°ž#ÊG0✠רêŸ>oÁþæÇ­á˜Áû,ævÞ’ëkìï`¦`Kö“ÎFê—käaÒ‰!.(bŽ-¿ l3ç‡m£*\+¿à žøMŽ÷ ¶(«¬PØA"”í8§Ã±…ß%ŒÁ•sÞð›…íãæo¥M*çøÝÇ9uøMöñpŽ…þúPã¿S¡b‰ÿPoç8÷Cõý®V§ð;àÿÀÕ†p zã˜mP'ê<¿B[á8èíÁ…Ûê;Yè““©>€:ãæÍÖ­ÛÜýþqúÛ~~û¬ MxÐÿXwÒ‰'䊮Ñ''ü_ÿæUî§×ÝPcxöÃÎtÜ£ÃÕÝš %D@D@D@D@D@D@D@šJ~zýFwõ÷~.¢ØÂÏ;÷áîIOxœU%ã³&ü7ßr›ûÒ—¿ZãªÏý¨ " " " " " " "°ÿà±åÿþú•î®»î®Ùè3Ÿ~™{èé§ÖèâDå…-–¤\õï6Xþñ¼ÿõ,Mö "Šˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀþ#°Ú6ðyÏy–{ò“_óÆw¾ûýðÈEYMj&ü7Ý|kx“Ïyö3Ý ÇǤ¤ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀ8÷ág»§>åÉÅ–ñè7Þ\¤S‘š ÿ o*l°4àøãŽ)ÒŠˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€,3Ï8ÝrðAE~x͵á%˜…"Š~|f`ó–­EöçŸWÄXz;ëÌ¢øñ=÷Ü[¤ãH1á¿ûž_yGq¸;ü°‡iED@D@D@D@D@D@D@–žÀÉ'ŸPS‰ŸÝ~GMÚ&Š ÿ¦Í[ ýé§RÄh Ö¯wkÖ¬.*sソ*âq¤˜ðïÚµ«È;䃋¸"" " " " " " " ­CÀ®ÈßéÏŸžžNV®˜ðø<Ÿ‚ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ëXã?Õǰoß>7::Æd,&ü#Æ`Ïž½5FJˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€´ŽÎŽšŠLMMÕ¤™(&üãÔ¹={‹¸"" " " " " " " ­C ££vÂ_`M;™˜˜dÔaI@£áž_Þë>ûù/&ÍO>éD÷¬§_–ÌûÖ·¯vŸúìç“y]x¾{ñïýv2ï#û¤Û³'}Aâò—½Èuww'ý¤•@ «««f7z{zjÒL„ ÿäädÍ$íÚ5̯+ñÝ¿_{]Ò®ìºÁØØ˜Ûå_. ÃÃÃ)uÐý蚟¸mÛw$ó_öâßM꥕BÀNø1Ùoo/ï×ìbÐb¯ " " " " " " "ÐúºÍþþþl…Ä*z…ÿÈðHÖA" " " " " " " KG ³³x:ß­ÈV$Lø÷M×>³?¡;þY`Ê¥$`—ô÷÷×¹ÃßÖÖ¶”uÕ¶E@D@D@D@D@D@D@$ÐÑQ}f¿3úDŸ-"¬èïïsx­?¿Ý7——öÙÂæ?éÄãݳŸù´¤Ë Ç“ÔK)" " " " " " :6W½i?>>‘Å&ü¸Ã¿jÕ€Ã÷Ú°>ëЬŒSN>ÉáOAD@D@D@D@D@D@D qö=|ø^.ë¦Í‹ûúúzsöÒ‹€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€,!®ÎGÆ'êÜá‡Ñ°y3ÿôÔ4T‹¶l}ÐÝ{ï}ÉmtÐwÂñÇ&óUÀ5×þÔýôºܶm;Üö;\ww·[¿n­;ê¨#Ý<×vêÉÙïÆÛÁê‡Ûï¸+V‡too;ë̇&ó¬rç®]îÎ;ﶪ"¾zÍ*wÚ)'éññq·ñÆ[ŠtYç÷ãä“NˆÕÉ4Úö–[–̃ò”SNtk׬ɿ+CD@D@D@D@D@D uìÛW}ñþD#~{…`ÌO6;`"þ¡ÿû‰äfûè‹Ý«^ñ²d^#Êû‰þ>òq·cÇÎYæ÷þê>·ñ¦[ÜW¾ú ÷Cq/{ñ Ý9gŸ5Ë.Vüâî{Ü?\ñîXÒG~˜û§wþ}2Ï*ïð þÏ;ßcUEüÌ3Nwoù‹7i\œøðG?á¶>¸­ÐÙÈÁäÞ÷ž+¬*¿æÚŸ¸yß“ùøœÃß—Þ¯¤ƒ”" " " " " " KJÀ¾w¿ú4ÿì*KúmÖÐаM.«øç¾ð¥0©NMöãÁ*ƒ¿ýû+ÜýÅV —^ò¨lµ¶mÛîî»ÿl¾Í¸îúm²&~î#Îq%ßm¬1VBD@D@D@D@D@D`É twuu¨ûY>»^CÃËsÂåUW»Oÿ¿/;Þhä«_¿²%'ý¾8?áǾ]ÃMuw+76ÞxsÖî1%²NÊX2ýŶׯ_WÄãHò¿}_ìÐÊé~âÓó®&ýeãy¼Ç#<ÂxÂqÙnؘ¿sO§Ÿß~§a²F®òwöþð³ktJˆ€ˆ€ˆ€ˆ€ˆ€ˆ€´6{WíÚüûØÂ„Ÿåëë­¾™¿£=y µ÷Ø×.^©0× ÏguÀ\·1WûG_rQÖåÖŸÝîÊ>ÁÇë®ß˜õ¿èQç».ÿ ¿‚ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀò!ÐÙUÇÙ¹|¼…ÕäÔd‘×ÑÑQÄ—cõ¿øQ¸sq¶;ø ƒÜˆ¿Ã—õ}ý›W9<·Ÿ wÜù ÷ÿ2Áóüsí­°ÿ÷cŸrÓæ-Œ¬Þƈ·ï?¢ä.ýõ%«­åüD))" " " " " ˆÀ¾éê[úñ"ö\9ƒƒCnb¢:áo_¦wø±“XÎð—oz½;îØ£köoâ¿ì)Ovÿúorß¹úû5y6ñÿ€sý«Z!àó{guFöqƒë7Þ”ðoß¾Ãý2óéÃCý N5Ÿl…}UD@D@D@D@D@D@ê-ŒÊ¦®aí~üݾ…./¶¼‘7¾îOfMöY <ªðÊË_âN;µú½{æQÞ}Ͻîλîf²%dÙ²~LøsáºòÏøã…€­rQ#WéE@D@D@D@D@D@fص{O¡œœœ*âq$Lø»{ª¯ô‡ÁÄdõnìÐÊé‹.|¤;åäK«ˆIîï¼à¹¥6›6o.Íßß™<ò\×µë°yó·yËV&kdé„ÿÒü»j QBD@D@D@D@D@D ¥ìع³¨ÏèèX#• WW~b|¢&½\œÿȆªzš_Ê^öé‚-™ tC…/‚Qoo;ÿ¼s³%_Ÿ¸“‹67ÝtKÒçÄŽwG~X2OJÖ&°gOõÿÞÁÁleÄ?~ÜøÄxÖ¡•3Î<ã´†«wÖ§gmsw̳û!ãÒ’ìÝXÖÛÏ~îFÇÒWzô²¾ýÐ`Ú„ˆ€ˆ€ˆ€ˆ€ˆ€,‘‘ê3ü[K^L&üSÓµkþ—ãþn¿Jaíšü÷c·zh¬*Ò›·äßä_íçÈÙþÅ}kÖ¬Nnõæ[oó/]¬]•qý égûñBÆK.º0YŽ”" " " " " " ­O`zzº¨ä–­éG¼a&üþö…1"“Sµj2[4±jÕÀœj¶ºÄþÁmÛæTÖþ0Ƨsõ±±qwÛÏn¯©Æu×o¬I3qöÃÎ _2`ZRD@D@D@D@D@D`y°/`Ç|p|<½J?Lø{zzjönjNø»¢÷ÔìP"ÑÝ]û¢BkRv1ÀÚíïxÙR|û¶þ-~IÇýlJV¯ìÿI)E@D@D@D@D@D@ZŠ@ggGM}rsø0áÇ2o|¿žÁ^- ®Õ去üB…Ú• eu¶o5ŒíÊ–ûǶsI/ôë'x‚;ü°‡$7yÃÆê'øR/ñƒSoo¯ùßÓþRŠ€ˆ€ˆ€ˆ€ˆ€ˆ€,5mósúT(´ö­íñÕ‚”c«éð ûnó-ÂzõÛ¶m{Öä!‡œÍ[HÆÞ½ù·'6Znî.ÿ¯î{ÀmÛ^Ù§Üçø.<Ÿ÷«]ÍÑève'" " " " " "кºk¿´×QoÂo?S·j`UkìÅkqßý4ì±É¿>=äYY}ý}³tTŒŒVßH]JbÂBÃ¥—\”-/êó7ßr[ÒFËù“X¤eE »«öuû?»#ÅþþþB¿nýÚ"¾œ"߸òª†ª{¿¿0ð³Ÿß‘µ=ôÐÙþÕù—5ô8ÁÍ·ÜšÝf£‡=äPwÊÉ'&Íñy¾[oûyò… ¸ sfɧ“J)" " " " " "Ðrº£;üxq_*~û» ë×§l[^÷£k~â¶>Xÿ“z_þê7²û‚÷ܱ³òW­Ê¯zÀãwßóËY>Vqûw¹;ïü…UÍ;ž»SÓÍ·ºÿäºd¹xÃ?öMAD@D@D@D@D@D`yˆçvSÓé/í3Àöö¶b[õ-õE3‘iÿÒ¾+ÞõÞÒgùt͵îÛßù^¦>}wІÙ<ðÙ¿²—~æs_t¹7#nÙ²Õýý;ÞåP¿f„‹.<ßá3}qqWeöí1—æˆËQZD@D@D@D@D@D`ùX•Y‘^Lø§§«“ѹ~⮕0Üõ‹»Ý›þê­w»ÇÆÆŠªá…yÿõ•¯¹+Þý^7YòÙÁg=ã²ÂÇF0Á>å¤ôRzØýôºÜ{ÞûïîÞ_Ýçøü>wåUßuoýû+Üž={mq НY³ÚsöYÉ2&''gé9ú(wܱÇÌÒK!" " " " " "°üLMO•îó_cËÍá‹wùãeo vòOÝr’[ýwèÿ÷ÛþkoksGu¤Ã$øM›ëîÂù|„;ÚÛç¹8ÇýüŽ;sÙîû?øQøÃçﺻºÜž½Í›äÇÅÛúq‘¡‘p©·UX¦ÍMì²ÚÅþÁ¡ábÏÇÆ«wÆ å2Œ` =î¸72ÙÇî=ûO+ÝK\([ÖOçQÿÖþÔd` úbDÚÎWžwîÃ.,Ô ¨ï¥_XÏLù" " " " " " Ë„€}\ï”Û—y|¼˜ðï4ŸŒ¬Nþ—Éþ:L¦òœúoý¯g»“N<¾tw:òwÙo<©Ô&—‰‰÷+þàŹì9ë{º»Ý…çŸW×ï¡§Ÿê>è ºv2X°¢Ü†Üéb¿{ÏžÂ/[Žáå/}‘;õ”“ç\uLâŸóì§7ä÷‚çý¦;ýÔS²¥ž§xåå/uçùGš}iý¥ú¹7ú7³*KD@D@D@D@D@D`ÿÀKå Å„ß>ß{Û|#.¥ >-ø×o~½{ì£/Ïï׫ËÚµkÜ^ûGî÷_ø‚z¦E>¶ñ–¿|£{ÆÓž’|S~a89þ¸cÜÛþ÷›Câ¼…¦Ï|èénýúuÙbp¡á ê¯È  –#Ðßרãâm~­x=ÿ>ô±âöÏ~æSÝi ÞÅÆÊ€;ü7æSaݺµ~™ü ©,·Å¿XïWþùúT8è  îøãŽMe¹oºÅÙ‹4Â[ô~ÎØt>¸Í}ý›W…—ìmß±Óíð]]~‚¼Þí—æ_ô¨ Üyçžã°4~¾aïà ûÁìn¹õ6·sçn·s÷n·Ê?ZpÄᇹÃýßÉþ­þç<ìÌ¢x Î½hoõêÕ~uÂI…m£‘;ïºÛo{WÒ|`U¿{èi§&ó¤Xž6ûO¿è#•ïíéq¯}õ+“;RLø?úñO»ûî ayû)'Ï}ò™Ü‚”" " " " " " " M#°É…îÃýd(7Úÿðå/I–],éïî©ÞéîhïHK)" " " " " " "°´vï©~~b|"[™bÂo—¶·µ·e”!" " " " " " "°t¶ïØQl|hxØáÓ|©PLøñ <þéðX?“’" " " " " " " -B`tt¬¦&ccã5i&Š ÿèè(unrj²ˆ+"" " " " " " "Ð:ÚãUù™EúÅ„ph¸¨ýxf9@a ˆˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀ’èíé­Ùn{{1µ¯Õ3544Ĩ+{è¿0RDD@D@D@D@D@D@D`¿èíí©ÙfîÅûÅe€áá‘ÂabBKú Šˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ 1ä£Z]]ÉÚ… ÿ¸ÿÔÔTa{Ã_a ˆˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀ’17ìñþÒ%ýããµoô›˜Ôþ%i5mTD@D@D@D@D@D@êèîé.,ºººŠx)–ôÛŒ}û¦mRq!°n횢&éåü0þx‚¿oß¾ÂYÖ!°nݺ¢2~I.„ {{­žPh=½=Õ·ô···e+&üñýºKžÈ–¤ E'`_ºßÖž|R?ÔafÂ_ûWwõ‹^Sm@D@D@D@D@D@D@D a#£c…mÙ#ùaÂßÖÖæìƒþºÃ_°SDD@D@D@D@D@D@ZŠÀääDQŸø«{E†÷þí²þnÝá·Œ–!Ðn–ñdëULøí‹ùíä?ë© ýN §»úÒ¾ééi7>^½ão+&üXó?6V}KüD@D@D@D@D@D@D@Z@4eŸOV2Lø±æß>è?11™4–RD@D@D@D@D@D@D`i ŒŽŽÖT £££&ÍD˜ð÷øoøõõöRç—¤¯Šˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€, ‘‘Úçö{2ïá+žá?ì°C‹ŠNL¤×ÿŠˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€, ѱêMúþþ>g_âg+TLø×¯_Wè5á/P("" " " " " " -EÀNðíjý¸’Å„¿¿¿¿ÈÓ3ü ED@D@D@D@D@D@D ¥Ø%ü=æñü¸’Å„¿»«»È›˜Ô’þ†"" " " " " " "ÐBì]ýî®®lÍŠ ¿]Æ?99•uP†ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀÒhk¯~—¯«‘ ÿàÐPQÛééé"®ˆˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@똜œ,*“û$ Š;üöS|Ý™Wú%*"" " " " " " "°$ÆÇ«á·UoöϪK1á·wõûûúfJ!" " " " " " "°ôFGGªD1á·Ö}}½6©¸ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@‹)jÒVr‹¿˜ðïÛWØ;-鯲PLD@D@D@D@D@D@Z‰€½ÃßÐ3üûöU_ÔWöZÿVÚIÕED@D@D@D@D@D@4ûÌûþìîwø'&ªoù³¯øÏz*CD@D@D@D@D@D@D`¿èìì,¶Yö>3᯾åϾ±¿(E%'`'üSÓÕÕúqÅŠ ÿØØx‘7::VÄh]]Õ;üeó÷bÂ?:V}­ÿÄDõnëì’j"" " " " " " "ÐÙÕU@ؽ{O#Å„hh¸Èë2Î…R%'`_´ÿà¶mÙú„ ?žÙŸšš*Œz{{‹¸"" " " " " " " ­CÀޤ߾}‡Ë­Ò¯Lø£%üýý}­³'ª‰ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@A §§»ˆ#ÒÖÖV“f"Lø;::˜²½½Xé_£WBD@D@D@D@D@D@D`i ´¹ê¿»»ËÙ·öÛš…™}OwíÕÉÉIk£¸ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@‹˜œªÎÙ;;ªoì«&ü¸£oŸÛÏ­ÿ•Ø¿ÆÍcùSÓÕ÷ñŵ(Öî÷öôyím…ºÐ)"" " " " " " "°ô&Æ'ŠJŒ›x¡œ‰3ûÎÎêsü=½ÕÉì ´ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀÒ°“ü}ûö¹ÜcùÅ„Ú1ô˜»ýÔIŠ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€,=ñ‰ñšJä˯Nø§§ ‡ÜÕÂ@%!ÏÙ§¦ÒÏñ''ü{÷î]’Jk£" " " " " " " 妧ª7ì+–ÕÏôYÏbÂ?9Q}­ÿλ­â" " " " " " " -BÏíÛ§™WLø'&«oùd¾¤ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ èêꪩMwwwMš‰ê„ßÜáïìèd¾¤ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ èïï+jÓÞÞîzzJ&üñýV¯^U8+"" " " " " " "Ð:úûû‹ÊØx¡œ‰„;ü“Ñý¦Ìûc¥E@D@D@D@D@D@D@–Ž@[[õ%}«ª“ÿ¸FaÂ?Mð‡‡‡c;¥E@D@D@D@D@D@D@Z€€]¥?00­Q˜ðï‹&ü““éoøeKQ†ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀ~!P;á¯s‡¿½££¦Rþ¡Ö#0eËïííÉV0Ììûûú\WWõÍüëׯË:(CD@D@D@D@D@D@D`é´™›ôm®ú<\£âV¾]÷¯ ŒIih k׬.*²gïÞ"GŠ ÿääd‘—û†_a ˆˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆÀ’èó«ô¶ïØÉè,YLø‡‡GŠÌ©©é"®ˆˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@ëØ·o_Q™~ÂoÓE†~ûi¾±±1k£¸ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@‹°/íÃjý½{“5+&ü6wppÈ&hÕGòQ¥]»w'k&üñíÿá‘êòþ¤—”" " " " " " " KB`br¢f»µif†oñµµùùû¿bâ_}€vM‘EùM)M…ˆ€ˆ€ˆ€ˆ€(p®ºÂx¾ÛÊm£öh½£æ@k“Å:>&£;ü«V­J6v˜ð#§··ÇŒŒ£öŽäJÿdsQ²q!íß\Ê­ˆ€ˆ€ˆ€ˆÀÊ&€äøo¹ìñJ?ßMµËbMhšÑæB{€S»ÿ&;Û²üš]†Úx³·³”åÅÇÈbµÇ„ùÊöwýºuÉÝ~À¯.èð¦Y ‰—òe£SZþ?Ø—A±ù6.ÿ ²´ù6N›”Žyò?Û?lœ}$¥cžúúí6Î>’Ò1OýGýÇögI阧þ³üúÚ“/¤Bçö϶m+ÄQGüñ\—/Ã^‰ç»ØO¼ Œçë­Ö6q{ /¡ž¬sGGGM·=ój2f6߯i›Ò1ÒæÛ8mR:æ5âýcŸkÅöÀ> ~ØOHÛd¾Ûööûï§µ™O|Ú·;ÃÀ@¿ëîîb²F† ?ÞèGðÈåàTc9Ç”ŠA‹ììì z‡‡³á¡‹ó¬]..ÿêr7ñ«í[¹>cõê?ê?è:~tü ¤~§rz?Ð74~4güÀy£e‰sUüAÏ f…øÒýúáç¹Êù.hã|žû}G€~)Û&n¤16wuuÕô%è8Æ/÷ñÛN$ÙاV8VPNòqü¢^+}>·çÙœ7c®þ;=Ó_·n-D2„ÛìSÓÕ«°BeаØ1¼8ŸøÃNuww‰<{P1N=$ÿ˜‡º0N;Ö/ÖÓ·žü+įr‚Êþ¢þ£ã}€ÇŽÆÙO4~hüHõ özýDýGýGýgö¸ÚÈñƒ“hŒÇ˜\âçšð[ª€më|·r^¶Á$n)Û&nôLôQ7äñ·ü@8þ°ÏøÃ\l)Nô1ır ¶æÂhŽ o‡~ìªÚ×®Y“ Ä¿§§§Æ ~ &³N‚ ;>>:&ú8ÀìN1Žƒ 6ÓôžqèicíG`žüÅ}ý‚qõ?#ìx8ó4~hüà˜~Á¸Æ#ìx8ó4~4üÀ9%Nœq,b"IÞúûçl'í:ß­íï˜Ø€ ¸ì϶a{`‚‹?Þh„žqôÛgl¶LCÒzÆ¡§µGy­àcõ@{ ¿²n•š.îÿà…cttt4ÜôÅ!2Ä–Gl½lvLCÒg¹úãøÀ~ b_ìþ`Ÿæìþ¬{˜ðw™e9°œ0Ïóg=¨4:ql©`¯°a§mCÚxÊ:ùW¯æˆŸú=fl\ÇOš€Æì?5~Ú1ÓÆÙGb©ñ£uÆ¥šX¢Oè|·vìˆL2q¬ð®.­Ø®Yi´þ°=L0ã™ÜÎzüâXÁ¾ïÏI?惘ÔbNˆ‰>úDÔöàñÁö@ßoèëë+\{£øE†„ | ŽOŒ[›†âüp°!ŽƒåB¢Q!ù‡B©gžzHkGßX/ÿ [ñ«œˆ¨ÿT7?ÕqFã‡Æ_ö{\è÷C¿üͰýº8­þS;Éñ³ÔÇŸæÝ2¶[h¼EúOç»Õ¥ñhL\1'äëFêƒrRv9=lÙ¯X‡åìÏö@žk{ŒUÃ/{é~¸Ã mذžÌÄ"Q'‚ÆE§vx;` ¸Õ!nÓ,ž:Jê!­q›¦u”ÔË_ülŸ@ܦÙO¨£¤^ýGýÇö Ämšý„:JêÕÔlŸ@ܦÙO¨£¤^ýGýÇö Ämšý„:Jê´þƒ;e˜h4ûN2yê|·B‚ýŒ’|ÊúîôbÂ߬¶Á¶ñ‡ùîjö÷÷—¬[YËòVš?Þ³† %èÓøkVà1‚ãоLŽå[ƈÛtlS–Û•äöàñ1×ö°wõÛÛ* ÷ÉÒÊ"çðÃ+ô¼*S(2ÂF%QA{U"ÕP(z\``ÜÊ œùOþù+©â§þc›Ô±’ÒÑGýGý‡}ÁJÄÔ4þ²/X‰~¡ñCãúÇʸŸØ4ã‹ÝÐ7± ÜaLÕ‹õ˜DyøÓùîì±1ÇzŽ`ŽÉþ|—-Çm†²1ïà¤Õ®èh¤>´¡´å§tȇžûCÊåèÏÉyjìþ4G9(Lj ¹ò¡_I<±Ï©}Méhk÷ìæ3víÞ½§ÀÝÑQLë #•7)øÔúuk©s«W¯*âeì`pX¢ÃÆãÎQ¢ ìÓ”ÐÇñœ]N/ÿêà 9N9½ø‰ŽCõ?¹q"§×ø¡ñ£2zhüÐøÙã'Æ*N*íM(öÓùJ´¯Îw6Þ¡mpG+1ì}¾m‚öÀäRóù¿Ín#h¶/Ï(ÑÖ:ŸHχm{`ìBº‘°wp°0#÷Ba"Å¥€¾þêwüÖ¯[gLòQ6.&ü8€l£ZÏœÞÚÈ_ürý$§Wÿ©%ã”Ó×z«ÿå8åôâWK Ç)§¯õVÿËqÊéů–@ŽSN_ë­þ—ã”Ó·"?œðbR‰»e¨w£u÷%N£Nøu¾[¡“c›ÓcbŽÉ 8Â&g³O¥á‹ ;õž‡o£ÛÉÙåôq½rv9ýRû£=xqŒÇK\§FÓØGüÙc$·ß9}¼­œ]N¿Üýy| -æ†ü#õ e+ô‹;üÝæsÖ76áÇÐY0á_¿¾ò4„½zÃJ@Z=ã”6ßêä_%`¹0N)~Õþe™TéUós¬èGi}­[[Æ)å_KÀraœ2ÇÔ–PÏ–ù”Ö×–oãÖ–qJù×°\§Ì1µ%Ô³e>¥õµåÛ¸µeœRþµ,Æ)sLm õl™Oi}mù6nm§”-Ë…qÊS[B=[æSZ_[¾[[Æ)—Ê'Íøb'0¨O³‚Îw«w&ÙΔ1c«g“6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>6ž²M鬧lS:ëcã)Û”ÎúØxÊ6¥³>qéŨ㩺¥tð£§lS:ëcã)Û”ÎúØxÊ6¥³>6ž²MéàÓì€í00žÚvJ?úØxÊ6¥³>6ž²M鬧lS:ëcã)Û”>ÍØã©m§tð£§lS:ëcã)Û”ÎúØxÊ6¥³>6ž²Méà3×04Tý,ßæ-[jøÙ²Š;üxÉž!˜k@Åì2 ‡MÃÞú1nml\þË›ß<àðB ~±¬ý÷ú Pø¾êÁ\ôµÿònµŸÚÏŽçeÇê·@ýGýGý§öåÈÜ>Ê´u°qµGùïG3Ûe±MlظڣyíÏ2LLL†—&¦>³XÜáïìè ½?`Šèœ#hD64ãL£0^L`Þ÷¾÷=÷Ú×¾Öýõ_ÿuñ2ÚÓ†iëÿ…/|Á½æ5¯q7n¬©#} d<åϼgã³Rü‡‡‡§OúÓaWcþ Ùÿ»îº+´ÝG?úѢ˕qÈ|ÐvÚiî}ï{_°eñâ”óô§?Ýzè¡îÈ#t'žx¢[·n;çœsÜŸÿùŸ»Ûo¿}Vÿ¡?¥-—qH†fî¿-—ås›H3ní´ýÊÅD²!7J«g\üÔÙ?tüèøA_àØÀ~AiõŒkü80Çö‰Å”ìcØãêo÷·f· Û@í1¿þ¨ö¨%°Ôý©¶6ùÔôtõ˜Ã§ýR“}xþîîööêä¿P6á€bœEØ8Ò7ß|³ûà?èÞõ®w¹ù—)òëùÿà?púЇ&°e`ùõüi¹’ýq—œ¾ûÝï†]&Ÿfìÿ¦M›BÛ}ó›ß,Šcù1ÿ+¯¼2Ø<éIOªá åÖ­[ÝÓžö4÷GôG¡ž«W¯vO}êSÝK_úRwþùç;l}ãâ‹/v¸paÛ þ6Û>m˜?æ!Í|è§´ùô…”¿Ž?ööõ?ì ”è#6Î>£ñCãûû‡Æ…乨RíUYq2—þº˜m¢öP{,÷ßÓù]]Åb}gçòqYÕ OuÂßÑQ¨cûlùÙ`œÒÚþÍßü»óÎ;­*Ä­-ã”4FšÔQZ[Æ)­ tXq€;ÌøÀ˜U3¡£%æu”Ö–qJk³XþÜ$·KÉûÆþ”SJÇŽylh‚”È·qÚC¾úÕ¯vgu–{Ë[Þâ~ñ‹_„”¶”°C܆xÛȳÛÇÄð;ßùŽ»çž{‚›-‹¶!Ãügý·>6Þl¼dïG?ú‘»îºëÂUn‹Û³ñÔöï¾ûn·mÛ¶‚lÈ©ž?mí~[§-¤ –ß7¾ñ…;üðG›üÛ¿ý[X¦ÿðAoÿ³þ¶î oxƒÃ²•ø‡.ÈCÎvs­¿Ý¾üÅOý§öÄNÇŸÆ¿µôûS9ÑåXI¹¿~?k[£ù©xÌS{7ÞÞÍoÙ%ª=Ô¶W,§þ`ëÝh¼­­˜Ê—x|b9…Õ ¿ÓÊPö mR’±²‘8Ëêð_ xï{ß&s¸ã‹•sñ·¶¸h7ÿŸzê©î¡}¨{Ö³žžÇ’q¼ñËöèó­o}Ë!ïùÏ~Ðã®ó±Çt¸P€çɑƛâáC?J0ö`à ±Ý½÷ÞëŽ;î8÷—ù—³üñŒú\àŽ:ê(÷¿ñaùûGáó˜Ç„ÙÅe!}ë­·†ú½ûÝïvƒƒƒáùö“O>Ù=âp¸«n}ì¾Z=–~üîïþn¨÷ÛÞö¶°ïȧ}½x0œùÏÚZ<¿öÙg»ƒ:(XÂîýïhç—¿üå“xÚÇÒ–Éø‹_üb÷‡<$¼ÕçÎÁ7öcš>¹8 °ùò¯^4«ÇBü*ÔªãF½>³¢},­].^¡_Ësv9½ü+,¶ƒÕåââ'~ì/±Ìõ«_¬þÃrKÆû€´Õåâ¬Í‡î@ó'‡fÉçB÷¿YíÀrZŸÝŸ‘Ñ~û?ë_Lø‡†† }n9@a‰ ð‡«¹”ˆ³ñ·Áê?ãŒ3ÜŸþéŸ:¾…Ÿ¶ÖŽ:H«GÛ·oŸwû§ú§0Ñ|Ç;Þá¾ô¥/9,!ô£.*`ROÅÑq¼%ûØÇ†—Ãáqk×®u—^z©Û³gûïÿþïÏÿèGð,:l®¾úêïÿW¾ò•°´wºa„ x”á%/yI¸ñ'ò'îSŸú”ûØÇ>–¹c_P'\pˆ.j`{xÿïüÎï„åîx±ì±?ñöcøýÖoý–ûò—¿ì^øÂ†z`èG ?îg\†MÃ&öÇsúX­ðÄ'>Ñš†‹P<ûÙÏ.ô)fÚíã-”x{?txÁC£þ´‡´åÊvû‘•åDø©ÿØ~¡ãGÇú7(ãqBãG•€ŽŸêê˜fUÊ‹kv}´ã¥Ù­¢öXØïÚ£µÎçæÒ]Õgø1ŽØ—øÙrŠwùŒŒúññü[þ £(‚ƒâ©€|›—‹¿îu¯ tÜ ÇD‘/r‹ý¹ [t˜¸ãoÿøÿ&Ҵäo‚Ç„ú•¯|¥{ûÛß.Àÿ„NpØ.&ëŸøÄ'ÂKâp÷™áÜsÏ w¨1iǤÛ…¼êª«äþþþðøîšÇ 0!Ççåà÷á8<¶‹|†Ë.»,ì &åxIV*üú¯ÿ:³‹íík_ Ÿ7Äç÷žùÌgÖ䳎PZ~xtå~ÿûßX°êÁúPiý‘¶v¹8VN <á O¨ñÇç°"ÂúB§¡C°Û?þøãƒåœwÞy!Îÿñ‡-í(å_!ó Ë:ÚQÒ.NS/ÿôøóŠÓâW! þ£þc Æ)yœÄiêÕìþÃ~Ð ‰>†þ„ þ6÷óýf´-CíQ¥1×þXõl^̾n®õ‰íã4k¹RÇsîß\dwwuÂß××[ŒMqáÿØØxÍ'&ç>ágÁ¹ÆA~YžõïòoÄÒ~,7Çä¡ÜiÇKóq×Üú#_À]ô_ýêWÖ$[Gt.¬ øÉO~VÔ8ù&ü]tQXÀ;üÖKÏñé9Lâ;;+×Yp‘%0ÉÿÌg>$ëHß 6„OÔáq,¹óawà 7„7Üc²ŸÊgYÌÛ»wo¸³ŽÉþ_üÅ_„Gb¦­¤¿ÕÅñØoçÇþá‚ ó0ేƒ>ØõööÖA›åLÂæá /̘Û`ÚJëoõ6^fS–Ç2ÊlÊòä_!Pƨ,OüÄÊúHYžúúúÏÊ>~xŒ7S–)ey¬C™MYÞJñç~,T’eª¼²<Ú—Ù”å­îÇBe½‹a(ÿ@àY¶eyså93‘fÚÊ0áçóì̘ÏKûèk¯º`‡ìl¸“”ô£¤?¾×ŽåôßûÞ÷Â]pÚSÒÒêÞõ®w…,>'<þY[|þŸ/À]uëÏŽJ[úB>å)O eãÛðôIJõ7†çíñÌ=–áßvÛmÅvaƒ×A>ýéOe þÿñáåzx&+¸ÿˆÃx;ýsŸû\wË-·„G˜‰°zõj÷›¿ù›!žò3ÿíÚµ+¬øñ. ¼æ5¯ Û MÊŸõ€ âV†„ùÏúcb ?àçøàG)Àþ°Ã+ö‘EXn—Òn÷ðÃ.÷Ýw_Q'(õ·ûÁ¸üÅOý§zÇ%Ž+V2®ãGÇŽ? íßþ?°½Åêïsïï‹Ù&jµÇô³åØæs|ÔLøgæ’©r„feR‘?=^¢Sd"Ü‘C·:æQ²¸Øÿo|£;餓ÂKîìÄ.ö³þ7ß|³Ã‹ëðR74:ý ñ‚=¾`q»}¤èçÿñüøW¿úÕÅò¾ûÝï†4&û°AøŽÿ*ü±œW^0ù¥ßÏ~ö³`Âeúvû´üñ8_ˆ8m°M<³‘ó‡-ßm€úák—_~y%cæÿœ?÷ŸÛ‹% ‰ýo¼ñÆp1ŸãC ^Þ‡ xç ±?óRÛߺukÈæÄ‰¹øÓ>2óŸü+'h1›ÿ؆i¶1%ôòŸ=þ$ƒúŸúJô ?:~ÐØ'b‰<èSybÿ©YÜÿÅ{aý­Ù­£öP{Ø>µÜûƒÝ—zq®‡]_Ö<¬-ï˜YbN+Ü}kÀÝ\,;O‚çOÊ&¥Ã$KûŸüä'‡çæ?ÿùϧ̂ÛÀKèî¿ÿþpG/±³ùñö1éÄ…äçëß×מíÇséxÜ€/Føö·¿íÖ­[&ÑØÞ´eýœP£^xS=Và‚>=ˆpôÑG×Ýþ‘Gl튠ðÿzè¡¥þ°Ã]õ§>õ©á‚Þ˜ Ÿüä'Ý ^ð‚PL#ûó Ž3ÿ¥üqw/)D>ýÑOð^ì 9¦ügоÖú_þò—!„æêœÌò¯ßÿÙ~[?ñ+:CAßÀŸúOeâá I?:~Rý:? ?r\¢_èùî~¼/„}Ê÷@ç¹ÐýO1],ƳúãÙ\Ùwt„{÷Á­=úDŸ-+Xõú‰5—\#s>Ÿåc‡ccÚ4ÊÄÉóf>âLÓ†i|bî¯xE¸cþñ¼°«xUþ§ï#çãí&Ý68îŒï_þFÿ¸L¤YÖÏñ£,°cœþ”Ü7¦)­#9ð¢A¬¶ˆýù >Þ¡[–ǸM£ÜØßNøéoŸé”?˧ Ó,˦å?›?ùˆ_õ˜±,ȇ2î¿Ô[g>¥üó¿`DNŒÛ4¸ŠŸø±oð8ƒDˆõq6ê?Ë«ÿ Í3ØñEý¥vü÷²ãe1Ú`ض} /«}Tì÷b²U{T.h“CYœO[°\øŽe‹wø±ñnÿÐÿ¨¿kfdÖ+“rG`ÂJPÒiHÆiŸòÇÄKâ!q·8^ÆM<ŽpÊ)§¸Ï}îs!ÞÈô·uÓ”Ðaµ–õ?þñ/{àÂþa‡²0áÇÝs¼L,ðÙ;¬€=Ëä÷G?úQX•pâ‰'=ëbí`• ÇÏ\ ‰™ÿ¸²‚Ûgù”0ÃÊ\0á'ßýîw‡»û¯}ík‹÷äüm9(‹iJÔ™zÖ÷îÝá‡xí‚ÑŒÿé§Ÿ^tø_ÿõ_Žï€ýYž•ô ïDÀE*Üá§O£þ¬¥ü«'sda¹“ù3MI¤—ÿìãDü*Øo(ÙgÔtü°/hüÐøÁñr®ã'íKj¼šßx¥öÈOþ–büS{,ÿöà/´%^Ÿ Å:€ ÿMw†qÿmøù €ñà<—rrþx“û?ÿó?;Lô09´ÁúàŘôc©x£Áú7RwÜÇ$_@Àr~„ÇÎ<›20áGÀ³ýHߥÃ#6ð=\ÚoëbíÇÝy¼Ÿ ¬w™ÿ³žõ¬b²6ÛåÒÖÇÆsö±ÞúØxl—K[ÏÙÇzëcã±].m}l6ÛåÒÖÇÆsö±ÞúØxl—K[ÏÙÇzëcã±].m}l6ÛåÒÖÇÆsö±ÞúØxl—K[ÏÙÇzëcã±].m}l6ÛåÒÖÇÆsö±ÞúØxl—K[ÏÙÇzëcã±].m}lñ‰ÁÆþ¿ .¸Àýçþgñ?ús{ø|ÞÎÿ¾0ì¿-ÃÆíö­¿µ±qÜÇÒ~ðø³?û³šúÇþL[ÿ8n·bÿìã±ýë^÷:‡Õo~ó›ÝG>ò‘ºÛÇûÐ^›6mr/ùËg}ÖÏnŸõe\ä[›øÐFþµÄOý‡Ç¤ŽŸÊ¼e¢ñCã'ûCíèYáÂ<?Í?b΋‘V{ͯ½£-P¦ÚCí>€¿åÜBåçø_{{õ&}{{úåù(²˜ðzè!Å&Vù;³ó xYö™kWæoÕ¿ç=ïq{÷î ÏÅ[?ÆÏ9çœ0!ÇDo ß³g³‚Dàåw¿÷{¿î˜[Ü•FÀ'ìrá´ÓN oÖÿûßïpÇ™KøaÏúC‡—~èC ËýW¯^]S÷ÿïxG¸Øò´§=-¼èþ4þìg?Þö¿jÕªp¡ƒzú3MûSKúcÉýoÿöo‡x/Á\ýãráË-·8|61ä¶ðÁ‡w-à1 Ü­Ç;ð®”aÞäÕ(«*Ðn¸@‘ ͨ¼ýÔvÈ/ÎÓö«nÌÆ¦Å¯ò’!Ëqõõ?µã|Œ ­ñCãGª_4:~¦|ç£kt{ê¯éþ:æe>j…ý~–±OžÚcÿ´¿‡6Zµ:?/íƒÑ1GéïšW¾‹n‘×H@Ã2ð.Òˆ#0Ÿy±žù°¥ ãÌ¿ä’KÂn,·ù,óø€{ãß^F‡—Ãá3t˜„âíùƒƒƒî²Ë.s÷wÊåö ñò<¼àÏ–Ãåâys¼m¶XÖ ?îdÛíÃæ¢‹. ¶X^aßÎOH<Ç ¾êU¯rxÎ/òÃ;p!+páKÿ±O6l>v[Aáÿ³:nƒy”´¡„ñ·¾õ­wäqÇõ¶_ `=a‡À²©JÿŸ-Ó~ŽÏæ#ûcÉ?ž÷ÉK^âþýßÿ=üá‘0ÀûðâÛnº)[DÇ[|@îNÿ´»îº;yÄáî¸ãŽ ñ²ÿpáî+î¸ã4w>ˆÛ†ŽËa>W‡;÷_|qx=íÊü1)ŤyL¶ñº 8ð1!?묳î¬ã™þüàaÒxî¹ç† .îòÛÇè‹gžyf˜hãù||¾wßq7Ú~wÈSËõù‚><ËgÕ±tÝî?txþ/ ƒ x\{íµa&ÃÐ_qÅá3z±?.&€?.‚ð3w´!?´^p÷¨G=ªxglìö1‘Æå¡-Ž÷_ ¿=pY6ý±‚ï~Àûðn¼ðÕ¯~u1P2ÒnÛÄ$þè£û÷Ýw‡G0ÙÇ2~<Æñüç?ß½óï,VSX–ie#õÏíÊ‘cǯenãâ'~eÇhYžŽ???4~”ey?p…s¼ë‡}Éþ>Í'ÞŒóÝÜvYÇÜ9I½ý]Nþ¸™…ùÎ;qŽºÏ'€^P†¹Î·íùürâ‘Ú÷ýYÌqp¬4£=0À±‡¬ãÆ!ÃþÜnÓÊå´}¶Æ®F ×üø§a—O;õ?g:Âî~oó†áÒïu×ot_ûÆ· ‡g?ó©…Q.‚ "–ÈcB»²xV}>U@ƒÌ7È¿uøáâ.r\~ùånæZRÝfMµ:=~°ª¡^ßHù×ݨ1ëôÓ, GÕ~j¿zcDYgRÿQÿQÿYYç_x/ÄÍ„FOšËÆäé|·Bh¡ãåƒ>nÒaÒ›só=ö0¹Äù&^ óDÍ?êõàt>Vcþ†IÿBÚƒÄvîÜnÔ{ì±é ÖÑ.´-w¶Æ.´‡½•C‡‹,ï|÷{CöS~ý‰îœ³ÏJš†gø‘†½ƒ{“h+·iæ[x«³v9=mä_ù±ÎqÊéƒßÕW_ž¯ÄÊl—Ü¥­SªýpÅÖ>Â@?ÊzþÖÎÚZ=ã©í3o¾õ—e?:þÒ¿‹#4þ´ÎïÛ„Rã×ò¿Ð†‹rãZNº ï@?Þ«MrÜszµGu®¶m’ãžÓ«=æß“þâCGG1­§ªEÎÈèX¡ä€T(æacÒ…eY=u´d>%óhkõÔÑFþ­ÃXlܸ1<¢va[©ý*'ý– â äCI½øÕNÀ…LÈ’Ü(™G[«§Ž6ò?öJö ö«§Ž6ê?ê?ì”ìì+VOmÔ¯ÿXÆ‹·íŠòÙ¶VOÝ>ó)™G[«§Ž6̧dm­ž:Ú´‚¿­K3⸻l÷‹erß[ëG¹¿ëÏí5[.Õþp»”ܯåÒXßFåððHa:sß½HÛH1ádzà ]]Œ6,c°HÛ?NJÚÑ’:JæÉ¿µùaYÞo€‹mÉ ökíö³í¤ö«Ža– Ç-Jr¢ $u”ÌCš~”±üÅ}‚Rý§B@ÇÆŽ›”ñ1Âce1%¶ië@É<¤YOÊØ¶ÔQ®dî[3%¸Ù@Ž”ÌCší@ÛÀ–:Ê•ìÏ}[LIŽ”ÜÒlÊØ¶ÔQ®dîÛ\$ÞÓÆ€Gr¡˜ðãl þÙùÛ ¼šB‰¼zAþÕ%täF)~ê?:~Ê hüÐøÁq’ã&%õe=HýGý‡ý„ý†’zõŸž_(g"Å[ö&'«Ï”}Ç/.À¦ã&Nc ¢Ò¦QóXfœ¶öò?ÛÔtüÄãEœ¶ýEã‡ÆÛ4~hüˆÇ‹8mû‹ÆÖ?x¹X2îqZý¥ü|¿ÙíóÓjµ‡ís­Þl]ëÅ÷î,LvûéçBq‡o¼dX³f £s–<È(mÐY=—pÄ6H[;æË_ül¿Pÿ©<·ÆãÃ7–óuüèø±ýBÇŽŽ ”ì”ÔCjüÐøaûE+¶ß.fœ<(í¶t¼Ô?^,¯fÄÙ”¶Lµ‡Úc¹õ[ß²¸}$Óæ-YÓâÿô¾êÉÏ*ÿö\&\5aàAg¯¤0y±ž:ùWˆ_e ÜO@‡}%fÄþEHùW¯ì’øiü‰ ö 3ñ±úOõ%’âW;®¨ÿTÆ':~–ö÷»Ò ‹ó?ÚVý}þý}1ZEí¡öˆÇ\ž¯ ¿ÅyÐ1Ÿ}'¶aþþöÇöæXoølÛ¶=ëZLø;ý÷þz{{mXrƒ”ÖÑêlËŠqÊúÞûßÂÖqÊFjcm§<üÙǹØXvŒS6R޵eœò@ðod­½3nõŒ[vŒSÒ¦LZ[Æ)Ëü˜gm§¤M™´¶ŒS–ù1ÏÚ2NI›¹ÈsÃ~ûf>S—QLøªoæ·ÏóÇeiT˜•¦LÙÛÎûÐRþ³ ˆ_íc#ì+q_šM®¢?ñc߈ûŒíK´‰¥úúû„úOío¾ŽŸÊ2vr`?±RãÇâ–÷bÅãc?·µwm{ç8-T¯ö¨‹s<ãþ˜³[¨^í±ÿÚ£««X¬š­½½ºbß¶caeïê[›†âh\t$62ãtŽÓÔSÊ_üØGl_`ÿ`Ó±´>6N;ùWŸ·%+-3§ø‰úE.Ø>cã´WÿQÿQÿÑñÃñ –v̰qÚÍuü ßbI[GçöæZߨ>N³\J»Mg~«û³žÍ’–³üVçaëlãû«þÜN³¤ÝgùjòórjTvuuÕ˜¶·W/²ÙŒâÿøxu’?<c¥µ±qõõŸ¸?Ø~øµ±qõõŸ¸?°ÏXiml\ýgîýÇr]¬¸m#W{5Ö^ÍnÛ6®öP{,Çþ0—㣻»»Æ<·J¿˜ð V'ùãã5Î$”P)áÇxJRG;¦)©ÏÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiÊœõ±Ó”´ËÉØŽiJø-VÀ6¸Jl‹ñ”¤ŽvLSRŸ“±Ó”9?êc;¦)i—“±Ó”9?ê­tÍ øD$˧DùŒ§$u´cš’úœŒí˜¦ÌùQÛ1MI»œŒí˜¦ÌùQoí kv`ù”(Ÿñ”¤ŽvLSRŸ“±Ó”9?êc;¦)i—“±Ó”9?ê­ts ÝÑ~¼´/Š%ý{öî-òí'ú eH\Ù8 wèâ¥ÔÅÅË¿ºZ‚lÈʲ¡Ž6”ÖÆêÄ¿v)øÕ~ÊÅöÆ)ÉÊö-êhCim¬NýOýÏö õâ`ûóØWlu´¡´6V§ñçÀØæ‹%ãþ§±]öM›G]\/kÃ<ÚÚ<êhCim¬®û;ë·˜r9ñXêño1Ú!Þ'µGãó¹ù´GÌ;WFq‡×îÝ…M››ý\dÖ‰ä–nÊO7¼øT¨¨ðX ´}ÂÆ•?û˜?<.(mŸ°qåëøÛ'l|¥ôîÇbÈ•ÈËî““ŸÕÙx£ù´[ 9ŸúXgý¬ÎÆWJ>÷c1äJäe÷ÉÆÉÏêl¼Ñ|ÚÍWâ}|kV¯Nº‡ ÿää¤Û³§z‡¿££¸tJ)¹cVÚ8|¦ŽiJê­´ñØŽiÊ2[›Ç8ý(©·ÒÆc;¦)Ëlmãô£¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?Jê­´ñØŽiÊ2[›Ç8ý(©·ÒÆc;¦)Ëlmãô£¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?Jê­´ñØŽiÊ2[›Ç8ý(©·ÒÆc;¦)Ëlmãô£¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?Jê­´ñØŽiÊ2[›Ç8ý(©·ÒÆc;¦)Ëlmãô£¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?Jê­´ñØŽiÊ2[›Ç8ý(©·ÒÆc;¦)Ëlmãô£¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?Jê­´ñØŽiÊØúÅ ñö.Ó¡.6߯™W¦£ e™­Ícœ~”Ô[iã±Ó”e¶6qúA.Fàv¬´qli꘦¤ÞJ혦,³µyŒÓ’z+m<¶cš²ÌÖæ1N?ÈŠܤc›VÇ4e™­Ícœ~”Ô[iã±Ó”e¶6qúQRo¥ÇvLCÎ'LNMn½==ξ„¿Èð‘°¤×î=Vç:;‹•þ5úz ìPj QìLJ>ŽËö’;ñ«%÷æªÿéøÓø¡ñ#7>Øq"WÿQÿQÿ©®’±,rnjշÚñú-†ÔùÆÂÎ7šÝ&jµ‡¯–{˜Ëñ1=5]˜™ðÊ™H¸•¿gOí„?þ¦_ìT–¶À­]NomÏÙåôò¯%ã”Ó×z‹ŽSN/~µrœrúZoõ¿§œ^üj ä8åôµÞê9N9½øÕÈqÊék½ÕÿrœrúFùÅvÍJçê•ÓÇÛÍÙåô+Í?ÞŸ…¦sÜrúx{9»œ~¥ùÇû³ÐtŽ[No/g—Ó¯4ÿxri¿~¢ÈÂús|­üøöüM¿¢¤9Dâ âÊ/õ¼L‰<ÚX;Ę'ÿJÃ’¥e„89!Ž ~êèìì7”¶X;ÄÔÔÐÔ4þr<@_ÐøQ]Á1Ò'ˆ#0OÇÏÿgï=à-)ªÄÿf€! 9g”  *Ìa (ꢲ®bLkþwÍò³ º TD’“ 9a€Âäœÿý­û¾÷WÓ÷åûfºÞ§ß9uR:uºº«Ó›ý§õ±ûï¸Úb3Þ—Æh4aÿ²ÞŒÇØŽ¿šK3½ râÒ_>Ƹ Ÿ°á†}Dµß‡XUò‚³‰ûЇûH?FÊ…Fãuô:ù:¹F¿‰_]^4ù³êþV§fÿiöŸº¼höŸfÿ)󢬓#ÍüÑÌuy±¶ÌøÙ­R—füþ2ÚãÒŒGß…%ñJ>ŽÆx0´IiÆclÆc“7ÔÐåGú7ÛlbŸ—ü‡»àwpKX÷™ñ P)_ÖýUc´‰_ïÄ2_Êz“?MþÔå„3dÉ+ëMþ4ùS—Mþ´"PƦ¬7ûO³ÿÔåD·÷íw –}²Þä{ÿùÞŒGJäˆÅ¼é»Oú1Úpuõ§S»Ò»OÛéj8ã°á„Þ;ü^l©³“ü<Ò¿å›·ùå#þmÆ :é%Fue E~£ßÄÏÜ0/„MþôFÀ5ûO3Äý£™?›ùÓ¹Á¼öÎ}ïúD~“?Mþ<ò'æz7ñfúþҌǚ5ÿ6ã±öǸq뵇q£ Úx‰´?Ç¿å–[¤3geþÒ¥KK¹ëñªÂ4¢bœ¥C«+þªE5ñë=¸˜3Mþ4û¹a34óG974óg3–óB™#Î!¥ô&Öžüq»›óݾ‘éþÒ×ÚÐkÍxôÙ꼉sëHýy¤ë÷ÝUkË—¯h×_ý6^"í|Μ¹¥Ü€õ8¸ì|)–(SGW¾ÑoâG~˜æJ“?õ‹{ãb¼šý§Ùšý§™?œšù³çIã!”n¼šùóá1:¾Ý€æ ¶›|Z¾4ãÑ7æÒêšúz3úµfÿèþþ1{ΜöÀ-Z¼¸—H{Á¿îzùéþÌ_~Ó¯Tlä‰ Þ‰éÚ4q!2â@qu#?âQN¼Ñoâg.4ùÓqa¹OEº"M\Øè7ó—¹7wb~D<ʉ7úMüÌ…&z#c".,÷©H×B¤‰ ×}û1V°SlêΣ¬þEš¸pmˆw'_ëúoŸ» ‡â²×^{mZVý†y¹VYo½õÒ†ÕWÐwÞyç4±ççêÅéÏäɓӴiÓÒž{î™¶Øb‹ÜEùBˆâ“&MJ .LOx²¬ÿäÿóŸÿLW]uUºãŽ;O^?úÑNûî»ozÎsž“E‘SV]`¤‰ #ÚX”Nm×å²Ó§Oϱ|ìc›6Ùd“ûs×]w¥3f¤§>õ©}díÛPÛׯաo›C³gõ.øÉ“%Õ¶á¬b¢½à_²¤÷1þ¸ø_E£‚Aª .jåŽ$M“~ën¿U/™+16ÒšüiE Ùšý‡LˆûHÄ›ù·ïEgbå>ñ³ˆ7ñkâó!æLÄ£LÄ›ü»üa<º]œ;âG|8ã}ÿý÷§þð‡m×µ'l3*„Eè?øÁ<ߟ|òÉyAøŽw¼£=§]wÝuéŒ3ÎHÇw\Ú¸ç+ÞúŒñh;âÃñ(ú±/£´?ÇsLzàúue¯½öJozÓ›ÒQG•¸`›(ç;ßI§žzj:øàƒÓi§ÖçX\ÏÏ|æ3‰qbÓ1œ:ujúØÇ>–þþ÷¿'~&…> ßóÏ??Íœ93_ øŸÿùŸô˜Ç<¦íoÔ¯ÃëÚW®mdmÇœˆxþüíoKþð‡s 9ä>±ÑnÔ?ñÄÓé§ŸžXøû :åb›úv[êâQ'âÝÖ×§ÁÀò5ü<âß߂ѢEm»ëW 6ÜbÐ70Ðx¼Ã E:<Š:r~¿&ZDâ~‘wžfÿiæðMçÒ˜'ÍüÙÌŸÍüÙÌŸÌ q^x8?ìS7¡s,mˆÇ¸u¾åÎ& þÍ7ß÷¹ô†7¼!_\Ïbø#ùH¾èpî¹çæ Ú±}e…Ƨl_ºú#…¶¯]ëú!”??èk#Â:ý:ßÕ±]a>²Òµµºõõc@8È'5Úwø,ì]ðß&ØN)@À ’x„W7Z><ñ#Þè·"ÐįwG5?šüiös!ˆ7óG3fþlæOæŠóCÄ¥#žªMþ¬™ùãøtš´!aÄõc |Aî½ï}o^ô+_Bxè/xÁ Ò’%Kúȶ¸-¾¸òøEÑ¿ˆKF<+Tÿô#êD<êD\ýnBÛŠ?±?ª/œs7½NÿéOzzÏ{Þ“¸³~ÒI'¥ã?>}ûÛß^%è¾öµ¯MŸýìgÓa‡–vÚi§¶Œþë ô_þò—馛nJ_ýêWÓ«_ýê>cÿðÃÏ…^ùÊW&îl³ø×þPÄ#Œx]û£M³½¡ø£ÿQ'âÚŠG¿ãxF¾x„ׯêÖסÀõ×ï{“~ƒ ê?Ü×^ÙsËR…QtÐ ÅBÑz #Ï”±eä #OùÈ+iò„~ïØ”±²cdÜ„‘§|ä•4yÂF¿‰Ì…º|ˆ4e…‘N‰¼¥—&OX'y~+Ƥ„Müzs«Ìë1FMüZ' Æ!ÆÆxE^I“'lô›ü‹¹P—æP· íwòAº°Î¿ÈÓǒ믳Ç}K)['ߟŒïüó€üã}dr¥çŸò%„--Ê&Žý² ë%¬ó§?™:^é»2‘.­„ýµ¿ºôc»ƒÁ7®žà±ðª ¯Ô•°àï½Ã¿¸ºR8Ôb£4® P"^ÊÄzÄ£NÄK™XxÔ‰x)ë:/eb=âQ'â¥L¬G<êD¼”‰õˆGˆ—2±ñ¨ñR&Ö#u"^ÊÄzÄ£NÄK™XxÔ‰x)ë:/eb=âQ'â¥L¬G<êD¼”‰õˆGˆ—2±ñ¨ñR&Ö#u"^ÊÄzÄ£NÄK™XxÔ‰x)ë:/eb=âQ'â¥L¬G<êD¼”‰õˆGˆ—2±ñ¨ñR&Ö#u"^ÊÄzÄ£NÄK™XxÔ‰x)ë:/eb=âQ'â¥L¬G<êD¼”‰õˆGˆ—2±ñ¨ñR&Ö#u"^ÊÄzÄ£NÄK™XxÔ‰x)ë:/eb=âQ'â¥L¬G<êD¼”‰õˆGˆ—2±ñ¨ñR&Ö#u"^ÊÄzÄ£NÄK™X+Ê}Œx”«Ó“y—ìD—Ï·£žx>´òN§4õ„uú‘Û—ìO?Êûñh»?¢NÄÑçÛ ¿ùÍoÒ~ô£ôµ¯}-šÌ8O ð$ôÿâ¿ÈwüëⱊbE`±Æ{èË—/OþÄZÙ>zºOû‘¿:Ç£ÎßáúcÒ·M :|°’‹.¿ýíoóÅ~íà+_ùJâC€çœsN–SÈ“"\¨yéK_š¿Á@›|o)qÄyA_¶oh°?½üå/O_øÂÒ­·ÞšÅ°©ýüW.Ú,^µÒõmB@òþò Ë–-"ÃC£óâ²ãÒcK‘&.lôûžˆ—&~½ˆ16ùÓä¹@ÆDÜ Š4qa“?Mþ˜ Mþ4ûOÌ…fþhE ÆD\8ó§ã0Vоў¸p¨ýÕç¡èsgqîܹYU=aÙþƒ>˜øšÿ-·Ü’Co~ó›óÿ.¼ðÂôö·¿=?¦Îcëô¥ë'0ÒÄ…eûQ¯[¸mGߤ•þH¾Dš¸P}æül?·ÕV[EõŒ#ÿ_ÿõ_ùKû<âÏGþ(êçJÍ¿¿øÅéÇ?þqþ8 ‹Mîû€:}ýЦ"M\8PûÑÎhá¶=qaéôØv¤‰ ÑE:Vä) ¾»ð| ý´9`„vì±Çæ»øü|¢:|wW0¸xöº×½®MŸSýÎýûßÿþLã"Ï–[nÙæÑ6?¯È}û/zÑ‹Vùà¦ö‘–ýGf¨eyX³o2ÐþÒxßð•ÜÎu;PB5"=âu|hÊÔñå £¼4a£ßŠ€ñF¼.>1žuüF¿ó{©u±‰ñlâßä_]Ž”4ëÍþ׊€ñF¼.>q«ã7úÍüUæH™Ö›üiEÀx#^Ÿ2¶±>VúúÕ-XÆÀºíY_]ýíÔ>‹O~öíøCúøÇ?ž^ò’—ä…??)÷Å/~1ÿ´ï†wÒ¯ë4åëøò„ʌĮ¶Kh‘qùÂN¼Hßzë­³ ~Šü\é©óSz,ù9½_ÿú×™…œ²BâÜ¡=å”SÒ³Ÿýì¼ðçc%ÆOÈu YSžr±ÄöYìs׿îU žxÙË^¶Jœ£~lz]éD¯“´‡Â+ùn¸AdõÁó#ý|Õ/–²ypÕYa)K‡#O\¨|Y—Þè7ñ‹¹!.4Oʺô&šü‰¹!.4Oʺô&šü‰¹!.4Oʺô&šü‰¹!.4Oʺô&F–?Æq4 cä8 K»#¯ƒ>8/òK›±?è¦BähŸ" øûßÿ>ßä±ãHÏ‚=ÿx7œÅéŠê®!³t’—®œ°Sÿå6Ôai¿“?¥|Y×N©?oÞ¼Ìb1^êP´O|âù.ÿG?úÑü“z(F~'|ï½÷NlüL#¯^_qÅéôÓOÏ‹ÕóÎ;/}ÿûßÏ?Ó§¥ÝH/ýmF¹‘âØuŽ?Qw(úúm¿ž÷¼çåGìÿó?ÿ3ýû¿ÿ{âWõ¨G)–öÝwß>~òŠ ÓøžÝâÅ‹ÛrÙe—]òë/\äá€mñ=×ÍÒÔ+ëÒGsDØì?Íþó¡8ŸÕõw¤´nŋǸ˯|×ù:Ôöï¼óδÝvÛå…?öêôyÜŸÂàYàôWêô•‡7Ö¥›þ”ý™2eJîÞ;ì0`7'Nœ˜Ÿü|"xããnu¥?ÿ7Ø`ƒD^°±€%?¸ÀS<¦NéO¿ô¿®ýѦ ×/4ÅŸ‹/}‹ýqÏ}vÜqÇô§?ý)¿¶rÒI'%6^ÃxîsŸ›ß³Æ3žÑÇ$ûß·àBÀ@…}d¯½öj‹Õ}ñæpûß6*ÛyçÛüþÚï§:y#…±öKÙ~YWv°ú|¤8±Ø.ÛÂVI;üðÃó×ß?ùÉOæ¯Äo³Í66Ù–%¯Xtr€;ȱD8à€ü…~~ŸóÑte„ô¡×ÉDù‘â1Žum•´Xg±Ná× ¢èS”GÎ /1î¼¶òóŸÿ<÷€÷ìùÈ"OFðX>OðÞ½ïÜs‘á™Ï|fþÐbl§w¿°-_ï°®Ž> ¥KZY²á\ ²Ìš5KtؾµÏ"߯ógÁ³;,„fG"-ÊF]e„~¿&ZÑâ>Ñì?½sM3ôν戰™?›ù³™?›ù“ù Î ÷ãýëf‰ÇÚ‰±éþ¦ßÑfl#¶]Ê gûÚ"Ë×äY¤ò>xî@úòèkC(?ò Q¢L‹2zÿcLʶŒGÙ¾uu£7ò Õé_uÕUiòäÉù}oõ£NÄ£>‹cáÏÇýø[lƒŸKäÎ3Ÿó‡È‹6¡óSŠüàøÊáÇö©[¢Œ´Ñ†¶!Äþ@þÀßc=²+÷Ýw_†é³àßm·Ý²,útÔcQÏk,l¼^ÁküÅþû‹€<ïõó] ^¡ ¨›+áß`üW_Bè釦r¡È2köœüí>XX–6eÜzíµ?ŒGúc‡ÊFà5ü¾WcŒšø4ùÑìÍþ焈7óC3?4óC3?Ä9!âÍüÐÿüc5Zx7÷G|ì–}ûüÔ[öy_{çwÛÿú׿æ÷ðõU}îóž9w£¥E}å¾zÁâXÙÈï¤/¿ÐEwíüÏ#òüôÝ™gž¹J–úûÙÏ&—.Çë§?ýiâgÌŽ>úèö¢F[ÚU‡ºxÙN©#_º¾Ž&®?±¼ÿÌ]e6~Ñ€wÀùàÛ›Þô¦üî=ó³årl³ì›u`‰óh?´›o¾¹êøò¾÷½/=îqËmwÜqù®³_,X.ºè¢ôš×¼&Ý~ûíéË_þrÚtÓM³ õ5X¶ Z]Ñ‚¶c[×®rÑ7uè#_¿ç›ûØÇÒ­·Þš/t Ã8ñ?…ÇG øðÔ?öØc«§ÕÇçþú׿n?Á“Èß}÷Ý鵯}m;|Ì’ þæ7¿Ièr·Ÿ»åÈýèG?Êxø¶À‡?üá¶Ž}ªó?ú"_¨°Gn(ÅüP§Ó/ù9þ•+{ŸÿGaY¸²§ AÖqdÁ |º¥Ž²~¿&z/ž¹_”°Ùzõ-cÑäO“?åþRÖËœ‘ßšãO3¬½ó‡ûq· ¹QΫ;_ÓWÞëýú׿žø©2KÜÍçp÷ÜsO~ÌüÊ+¯Ìï¿óï¬5WöY¡á̗ꎭñàu‡|૸ÄÏžñ8îîuÔQiÏ=÷Ì2ýÅc#Àe~ú0¶¥-©?þñÓ·¿ýíÄ.:Ð?>8þül…/Äs‚§Ô">Ô| î :RðŸ»û|ëàÄOÌÚƒÆÝ|~ÂÅ+bÄ7 (±Mç§œrJâ§?ò‘d>±eq¼ÓN;åý€ï)Äò®w½+?µÁ{þþóŸókܧ<ç9ÏÉx-£S‰í—x7ÇcùòÞGúñ>Ö•u*§òóÿ÷T¿/ØJ¦ñüôøö¯“ïCã1~‹’+…ü&(æì˜x„@F:4qa ž¥Ñoâ×_®4ù³ê>Õì?ÍüÑÌŸ­4ÇæøÑ?:Ÿ«­íÇOîpñt~#E®ç¤ÎÃcq¾ËØXlp7ùùÏ~ÛÍæ+ñü„ƒ3¯¹Ìb‰…! éåÑt…æÑtî³ Ý}÷Ýóböu¯{]â‹åÝ:_à1l€¥ÝᎠ1À¾sÍB0öQzÚ ïÔ°Ôç±rôx4¿Î'ù¿é¦›ò]fdY¨òž ”¾Ú<ñ¡Sb[,€ygž_Éx°ÏÑî¾3&å÷è‡í·¼éë´R–uæ¤I“ò÷'ˆ èÛ£úv‹xíK}üâ'÷ÐG– ûì³O;vÈ×éó‹Üå'O¹ØÃ¯D9|¤0.äˆ~@+ý¯£©/Úu<È!Æ£îã{èÄò+þ™þö÷óÛ¤ÿÞìS›Ðƒ´ü¿:ýŒ4éö;2ùy‡?;=åÀ'–²«ÔãÈ; tZÇWî!È*g](½„ò…ò­ ¥—P¾P¾u¡ôÊÊ·.”^BùBùÖ…ÒK(_(ߺPz å å[J/¡|¡|ëBé%”/”o](½„ò…ò­ ¥—P¾P¾u¡ôÊÊ·.”^BùBùÖ…ÒK(_(ߺPz å å[J/¡|¡|ëBé%”/”o](½„ò…ò­ ¥—P¾P¾u¡ôÊÊ·.”^BùBùÖ…ÒK(_(ߺPz å å[J/¡|¡|ëBé%”/”o](½„ò…ò­ ¥—P¾P¾u¡ôÊÊ·.”^BùBùÖ…ÒK(_(ߺPz å å[J/¡|¡|ëBé%”/”o](½„ò…ò­ ¥—P¾P¾u¡ôÊÊ·.”^BùBùÖ…ÒK(_(ߺPz å å[J/¡|¡|ëBé%”/”o](½„ò…ò­ 9™îæ‚ÿát¾ËGèë¸n,øyŠ!¶SúB]¾PëBé%”/”o](½„ò…ò­ ¥—P¾P¾u¡ôÊÂw<†²à¿ô²+Ò¹ç_˜ÍOœ¸iz÷;)›ÊõöGû6ß|³¶@ù>@›Ñâ;L´ñÊE©¢œP¾õF¿‰_“?½w¢Ý?„î'Â’Þì?ÍþÓì?Íþã¼PBç ¡|ëÍüÑÌçùÃ|)|8í/ûÄÈ~ ›õáÎÚ-8Réú£5ÚaKn~4ãa$«£V[póê';•ü?Ì 6lË gÁñjExéâ: Œò@íËSºx£ßŠ€1¢flšøµvcã"ÞäO“?î3qëqΉx+z½sœ¶ý&~Mþ4ó¯óAœ3"ÞÌ­xŒ6^Àáî?-‹£ÿ_°<šþz.¢}mGº¸½RF_€k²¾~w ®mñXÝãÙq0ÿ°ÝŒGï÷>kãclJúPÇdÝž ,èMìùˆcö‚Üzm4?RP'<ÍN שQF¼„~¿&z¯ÆýÎ}šx ›ý§Ùšý§ÙâNq®ˆ¸4!¼&šü‰9N‰9"^BäVwþàC·‹ý¦ÕÝßµ©ýnK3½wy‡’Íx´"`þ”îPâ9RýáŒߘ°l¼ÉF¢«Àö*Ÿ-XV¬h}•Ðúp î¤ùàTùÈ—aä7úMüšüi ºÄýCZ„‘ßì?ÍþÓì?ÍþÓi~ˆtñfþè=¹næÏ5oþ4OÇ Æý¡®ÍȤçK]|F›ã]g;ò›ñ¨‹Ðði1¶Z©£ÉF~312ƒÃ7ÚhB[0.þÛĤýÿ‚ê ŸíR-À‡S´Ác»%Í“ÍNrèÚjôûÞˆñ*cmÌ¢L¿&~æE ›üiæ¯8W˜‘ÖÌÍüa^”°™?šù#ÎæG¤ukþ ­n–ØÚ1×;Ñ•éV×–ö»5&âÞ‰ÞŒGß…öhK§¸w¢7ã1üñàƒ•¿`=Âö‚ßß„¹Á†½ÊQ¸?¼ÄR¶Ž/ Yqa£ß7ÆEcñȤ £NÄ#¿Ñï€qƘE<ò{µëó;ÊŠ £n'ûQV\Øè÷€qƘF<ò£é¨ñÈoô{#`\„1fü^ífÿ1.³ˆG~¿ÞaŒYÄ#¿W»É?ã"Œ1‹xä¯Iñ‹¾Œn?…¥MéBøux¤EÒ…7ýØ×ÑÀ“°´)]øp‹§ýµÿ¥ühÕ‡ëzÂÒéBøux¤EÒ…kš~ôu08?ßgY¸p‘è*°½àWø9€‘i0…Ú´¡x”‘&Œ!2¦ÂÈ,ieYi¡ês%K]a´!þH¿Ñè?±3°qc.´=`I+ëQ¦?ž6û“©ãÅ܈mio(°ÉŸÎó§ù¯‹wÝIÆ1)ie=¶ÑO›QܺP¹:ØŒçñ¯‹—4ó¡9~ /~1ŽƒÉSåK¸ºó—ñÇü0'ðÑ> £ß%­¬U?ÚmßJÿÊúPý}¤éæ˜4ãÑ»oסæ“z£ËöË:íHƶKZY¸ëÇX „Çoð­×aí†ö‚ÿ¡‡z¯ Œ7ô¿1(ƒ=Ø(«.Pšƒ!'ôlÓ§ÌM÷Ü4-=p×ì4}êì´î¿Æ¥•ËJdÔñ»p¨ûCì,_¾<ë,[¶,ñÑôØçä‘£`úŠ+ÒÆoœ/^œéãÆË4õøµÚˆïTŒ?>Ñ6 ƒ#®öÑA—6"Fµ}ûˆºðð“:}ÐGý¡Ž,¶©ÓŠ•&l²aÚd‹ ÓÖ;OL»î³mÚù1[§ñ=|Ð¥s%ü³@ʶm3Òëð¡è#KÒåËW¤)·LOSn‘¦Ý;'Íz`^·îúé¡•M 5ª¨¦ 7Ú0M˜¸~ÚrûMªØ&íqÀöiÂÆä¼#æä]Y†2~¥.õÑÒÇŽöÜgï»}f•3ÒƒwÏN3Ö[g|•­~ ¯òsœz3GôÎÄiÃ6Hn<>mQåÆŽÞ*í¾ÿviâÖ·ç$bgüïÆþŸ©øg[‘, H‰yƒñvÏœtïÍÓ«ãǬ*7æ¶Ž+šyc¨ó±%7ÖŸ0.m±Ý&iûGm‘vßoû´å›¶÷í˜qœóF^9~Òë ²‘' ‹u Ç¹3æóˆû¦M™þµ|Ý´bÙÊöœ§N3G´öï»x}ý Ƨq믗6ßvã´Í.›¥]÷Ý.í´×ÖÕùN뼩.ÐëÖøÇ±ï&n€e£œ´Gª~ŒÅhà£Oü¸ë®»Òu×]—7ÎË÷ßÿ¼í½÷Þù<Û·H[[ÇÓ~Œ\Ûã1sæÌ4yòätÀ$Öqýûe¤ 7¢­þðyóæµÙë®Ûû>›Øƒ´ü, ,Õé°è SÉN2©G~”ªÏ ÔIWMIן79ÍÖZlË[gåYÅ:ÚtqÌž”)øÈÆ{ÛraM{,έ£# {À“N–À^H@—69aÀ>!ãAˆ øúŸ‚.zL4dÑ"ƒ,öivô_‘3FÀ*Jiñ‚¥yã$øæKïMmºAÚï黥ýž±{õñÆñÙ¶¾Ð¶)è—x¤)D®ÕÞðô±AØ–.^–®=ÿŽtó%SÒòŭŶéÎò&†•Œqe›ýÀüt絤KwsÚóI;¤'>oÏ4qËÛãm.ı2^ꔑŽú´A^—-]–n¼äîtãw§ÅóãœPåÏ:­ù ¹è—ûûH3G´æc$öË–,Ï ¤»oœ–.ÿíÕÉüVé€çì‘vÚ““úÖÜÆX›à1Η‡íˆÛ^&Vÿ¢NÄ£NÄK}ó:Ç·[¯¸'ÝpþÝiþÌÖOÐBoéÄ\éÍÙ&7ZÇ¿Nǘóg-J÷V`ÿyöíiÛÝ6O¶{uahû>ÇäË1ïoü ::oe+§¤)?€SoŸ‘®þëíiÚäÖIzQ×:z´ÝäÁÀy°bùÊÄvÿKó˜/º'7ö9tç´ß¡»¥qãÇå8še¼c ŠÐÎHý­ÓÿÉO~’o½ýío_eß±ýk®¹&½þõ¯OùË_Ò.»ìÒ'^Ó§OÏôk¯½6]ýõéÁLûì³O^¼>îqK/zÑ‹òüÝ-ÿO}íÖx˜#¶7ÜþÜsÏ=éÝï~wš4iRvu·ÝvK'NL¿ÿýïóù5ß7ûŸÿùŸôÜç>·ãxØÇºñÔ¿qáXëÛÞhÃÕÕÛÚ/êsEeÅ_|qúЇ>”á–[n‰èôoôÛ>²C- æ÷þÊÞ¸qƒXð/[¾¬ÝF| M±3ÂNâ%ßz„àn,l¹{{Ñé7¥÷ÌkŸPÊç`LP‘ã`n€á[gÁìI)4Š fè^@W[\ À†‹|äÀÑ×6¸v€.¼@;êØvØÐ•†.ýêúÐõ™v-ú‰ qìâƒ'(úI]ºòòе ÚY²pyºòìIéæËîM‡¾jß|×_d£øb½„úYBå¤[/aäÃ#Žwßü`ºì··¤…s—fŸ‘ÇFŒý—o½ÉƒÁçÁÊêŽç-—OIw\}zÊ‹“ö=dל·Æ:·'þÆ9Bù%D?ë%Œ2W8û Û}wÎH—œ~sš7cq“=spÿ%N£1G`~Êm3ÒÔI3«Eݶé Wì“6Ý|£ö<â¾×ãFdžõöQ å$YPœýž>Ϙ:']\åÆÌ©ó›Üè \7sãÁɳÓßN™“v¬. q ÙbÛMÛó±ã&t¬J(¿„ÊI·^BøÐ¤sü˜?{a¾XuÏ 3š<è `7ó`îÌéò3oM·^>5úê}ª§ƒ¶Îq§Mçǧ„Žo •“n½„ò»Ûžrúa½„òKxÆg$>ÂÅ‚ŸRêQ¿à‚ Ò®»îšûQÿÿøGzßûÞ—æÎ›¸3}ðÁ§wÞ9ÝvÛmé’K.I\L8õÔSÓ7¾ñ´Í6ÛDÕ6n{¬—P~ •“^Ö¥jWØÉ^É·<÷ÜsÓ 'œXÔó›ßLO}êSÓæ›ožs•ùãöÛoOŸÿüçó£>:üñùxJ[ÑN§¶£œ2¥žuù%,ùÖKXêYW®S]úhÁ²½ÒnÉ·^ÂRϺre]ºP~ K¾u¡òe½]¹*_B夗uéÁ…áC}ñq©×¾Ã¿´º;fYº´÷ÒFé[œäÁë:§¬'kw^wµÈ»µzdÿ_í¾p⊠ä8¡Æ….òà@ Ôe¨S° Ûà,Â…Y üÓÆ_)êR‡„F»?êïqÐüp?¥Þ_qLÍ©þÆ_;ê˜Ì_ÿê–´taëÉ=Ûnò ûy0wúÂtæ·/K½|Ÿô¸gì‘çŽÑƒ-ŽåPư¶»!7RëôñÓœ-}fÁÿÌg>³MFîg?ûY^œîµ×^é·¿ýmÚ~ûíÛ|¸Ü½|ùË_ž¾÷½ï%îøSêÚ'öÚמp¤úÚ-8î¾ûîtì±Ç¦=÷Ü3}ÿûßï/ôÉ×Ç<æ1éä“OÎá" ÿÊ`ÚïÏÆêÖïÏ·’‡¯•ÕÝŸµ½ýºø._ÑzJkÁN¥=ë.^ÜzÌAN¢‡Z ¢n;ÒJ›Ê98»±¾ù²»Ó%¿¾µzœtE^ôAcñÇÆŽ:òÔ9p[œœ°Kç©#CGÖv8 Æí]}êð‰tÔÐàS×tô¡C£=ý‡¦ýH§ýHGΘ£Îâ\9 z´o?ô:ý³=ÚW]ŠþkV¿Ê“Ä6–-[ž®8ë¶tÑo¯Ï±Æ/lXÀë6øÒÅÕ‰P™"c¼è×?þtkµØŸRÅ¥5ÖMŒmïÛ®œ’þü¿W¦åUN0^ŒO9nÖ¿‡VeJˆœ4ñ¨ öñ‹ AWuWZ¹¢ua¨É±Ïù³¥³peºãº©yL`Ýø9–Žq ÕŽ>yÁÆñᆋîª.Oªr¶9~¬Žãûâ¢ùKÒßN¾ºš?îÍÇ(Ç:ޱ4aä‰Ë¢|$8^qü¸óúûÒùÿwSZ4oi®7sÄØÏœKðšØ?ÿr[;£º±cœ¥‹—c/]¹ëdG›V¶g]¿êÚS¦„ê@¬þ¬Y³Ò 7ÜžñŒg䘡7uêÔôÅ/~1ß¡þùÏž¶Ûn»l®l÷°ÃK‹Lƒqd¬+¯ƒ%ƒ@ë }º¤z|{Üzí‡ò"•ƒ52,¶]¸»ØÅ6;$|í‚CÓ/ê.„9!°Ž.uµèÇ…2|íâöÔEÜb{øýẺœ˜ºøÆ.òêØö)±ÏÐØ”ÁžzÊÃöýÂ2Б±àÊhÈÆÅ€Û.»?m¼Ù†éñ‡=ÙFFªÊS×>-òr¥úWGWŸ¾°§ë.¸3·¾[ð»ÉƒÖE+bVÆ­[ypßm³ÓÅ¿»1=ýUûç¡`?²mâ#ÿþôá™7_~O~g¸ÉÞWXV×ÁÓçÿü†4þèõÒ.{o—ç÷ñ˜9qªòÌ™(Óßø÷§Ü`n¸óÚûÒå¿¿µò£™7ˆ1eµåFÕö…¿º)Ûp½´Ç~;äÜ`œðk4Ç_[Ø&‡Èƒ©wLOçŸzCªîcçð¯9~ôž;Å1 nlÝ:~û«ÿzgÚ úèþ‡¶îôÓ¾ÅñîþõµÙMÛ‹8mZ·ýnÌw´Á;ÆäóÓžö´Üíœxâ‰y?ûÙÏæÇÓatj‡vȨæ3ŸIgŸ}v:âˆ#²±ð?74JÿÊœÑÿº~Ód¤ß|ó͹ï¯yÍkò]ûÒòÚ§|àHo~ó›ÓÉÕÞù§ óÏþ3ñÝ„¾ð…ùÉÙ³Î:+]zé¥çÛ |üí ƒêÓ~ô…×-ø^À½÷Þ›÷C¾Éð²—½,?y m‰G¿ÄãÔÇ^7ÊpýÁ7Îýyí„ïSž¦ ~¯xÅ+úÜ`ÕotØÐá{·ÞzkÚqÇó·*=ôдÅ[d~ì·øœ9Õ+Õ~D[³gÏNOxÂòÅ2žè°ÐŠ:öíÆoL—_~y¾èÆëûî»o:üðÃÛ¯‚ Ϧ|©¯ýH—6¸é&›Vâ÷gÖlJ¾]¼´ç«ñ M˜ÐYA™Ú1év S½¤#ÏÁ†…çôûf§KS=Æ_ݵ£"äÄ::œ&ÂAº‹ä Qñ`F=&Kä}b€E¹º´WnÈRl[ÿ°«.|ô°C²‘ÄÈ#뢟ö•Gß(ÈB‡F›@l¸A‹¶ÐÅ>ì£çÓÐ"Çk ÆöÔ£]ëWýùÎ4åŽim¿ÑU.#Õ?i%½®ÞIøŠ?÷Ý9=]ó—Éí>C§›<û<¸åÒ)éökyÚ¢µ_vóHgÌÊ:4J¤w•ƒÏØÓöƒ÷ÎJWþ±zT»§nN›ÜûÜà£]=åª4oÖ‚Ÿ‹N¿!=xϬù3'Uoì·.æÐ>}jò uqjuæÁÕ¸ì¼÷ÖiÂFÚ¹ÄØ•¥[ëBä#>>yFn°þã÷·UÉÒäÆš6G¬\Z]e?ãæôÜ£žÇ–yÔâX ¡G\9aɳ.Œú½óÆ’XoÝqUÜœ^úî§åýŸý™­,q?ûz¤G¼Ôïv½ÌÛÒëÂØ‡:ߢ\)k[QÚ…^˜ÞùÎw¶ÏÛ¸ã»Âð¨ñ,Pýcßà.è/ùË|óÇóbe…ÈG\}aɳ.T_ùцÆH»±]Û®‹ÇäÉ“ó<´ûî»çx VŸ/ø_qÅ}tÐe1ϘxàéSŸúT~²J›,"¿úÕ¯æ}£>òë|ýÿ°ÃK_ÿú׳<Îu¾õ­oeä u°qÛ–<ëBõ•m8œñàüî oxCZ°`Aþö›¤p|'ÖÄ• ,êù¸¢m¼å-oIS¦LI§œrJâbŒ…Ÿ«{Ï{Þ“Ž:ê¨lïÑn=¥ ÿþûïÏ¿nÁ÷-xº… dÆæ²Ë.Ëz| “b;BÆŠ 3<â_:¯x|ðƒLøÃÅ ¿ì mƒS¬ ¥eæÿïY÷¡Æ…¢N%Ÿ¯~2%n‰ºAõØ9ÚP†e1w÷M¦¹÷µÞµód &ä…. p&(xlœÔ`ƒMØaqŸ»ÚÈó=èÒ”…G;Ði»àú NañìEyè±Q a} zø]{ø96Ôø6ð»ÈSä[·}bcŸàa“‚-êöK=첩Žo´k›úŠ-c¾pæ²tûUSód…íëCn°úg¨Ã£HSV:õn—ØÞHýí¤ûà>Å=w6yŸ»Œ*Êjº4pŠþ»°aá)MÙÁècK¹ô‘íV±mìÖbÆ« /†¢OÌ.\˜ïàÇþL›6-àsŸû\>wŽ6¹ÃÏ“ûÛßòWÿ1w Á¹³Íù¶þ³Þ8î¸ãÒ&›l’þüç?gÿì—2Ñ~Ä•“f[ÒÕÏò?Ûƶ¤ÕùÃE'r"²ØW–±áI>¬ÈBGðÕÿÃþûçB ‹}uhs³Í6K?øÁòO+rá„"Ÿ68Ÿä×*|F›¼vñµ¯}-ñ€Å¸qaÅ>¾ÄÅ>r›nºi~ƒñâ{¶O}i¶%=Ê€¥x£{ïÚQ5¯¤H*@’¬ µè4\ql€»Q|å ±Èã@}óES2.¿Ø8™cp ƒ“àèº8EÖ¾m!K0µ mbƒ4é´nqQö"º>@'–Ø£] ¶ôÀ)ð©Sð_®®bíâ3¾~À£-ìK§ÎFAœ¶l#3ªØ€NÌ‘Ó68E;Ø…ÇF™tùý9žÔõ(N,Ä‘—'-ò¥EúËÝ™[/ÚäÁšœÿ¸?çŽùïXÆñêø#ßI:9ÇÕó[.ircMž#˜C®;wrž_œ'êòCšûã¯lÌHcÞ`ž¿ù¢ÞÃa_šãÇšsü`<®?¯•Œ%e¤ã¾¶8¦qü¸éÂæÆ3vŽÐý:憴ȗüœ\]úש=}©ãKS×JåEY»iàÜÝç=eî4[¸[Mñ«üÑ~©œ|üè#§¬|d¥uâ+Ó‰¯>r£]´ý¥ }©ãKã{ïÄEë­·ÎÝ`¯-á;ÞñŽÌ£îûÜ¥fä×(ð]p^uÕUm[ò8ç1ó׿þõíñ’'´Ý¡ø¯6F»h{¨þðO2<ö±Í.•ú\,á?ë |ß{T¯WÄ _±}ŽÿGyd¾È2sæÌ_ÎN?ýôô’—¼$9ŽêÙ°Ç;ù±@§=lrq&ú§>k8^“Á~äcGÛÊF¾´ØÞ`ñÕ…'˃Ӧ÷É!éÀ¼2$ù6ªî[V®l-2­bÏŽ‰ ±nAŽ“BNØfÞ?7ß¹ƒæ€r÷¤Q=‚íB9hÔ "yìp€ÂŽ£]åe£x€D6¨k_[Ðí:<ÛÇtåõØgñ¯@hÈR¸{­¯øö‘Gž ô…źíê²ðôA:6¡ì}2fÈÅ+FÈBƒ?wÚâ4}ÊœŒC£`3äõG\ˆx,êñsæ}óÒâ9­ Ž—qDF}üFžâ8êúŒ|“­œ­?ͯžò€ÞÌkî1·ºË?ã¾¹íc8cIq®ˆã.M~ìùçøK+çéÝ‚ú6Ñí¤_úmý9¾Ø>çmœ×qn¤\éڅϹ.…clôÚ`ôщzúT§m´Kì“mÖ.ްh· V_ž( _ñïÔ>w¹PÇù(È=þñÏi¸ ý‰O|"޹[_ö¨´^€Kì;tu:µ_êG[ÝÀë7sî»ï¾tðÁ÷q#ê“×|$ñ°ÃËqCð®»îêó]<üÉIžæ€Ï·.ˆ/m•ñˆú\| @cC–2^oØßØg€n\pæc‹¼–À Ñq!¶ÁGZxÚ‚_ô­®´Ÿå_ƒõÓÂE‹² 'C-v@¨~ ^ >²P»ç¦iºHÕ|htB:¾Ú9pùØUÇRˆmôá9ÙãÐÅ$8ˆž LûB›ú ƒm6?Ìa?ÐQ6¶ Ûè#«MÚ‡Fᣇ|Üà#‹ïàœä §=ê¶K;Ø¢Ž,„§ ‹žú1¶â÷Þ2=m·ë–m?Ñ‹þ£o‰x >ícŸ~L¹eF“U<Öô<˜zÛÌ´Ã[e??Ç1ŽyÄ;?ôôÉSrcê­3›ÜX rƒñ¼÷æêÎÉvÛsÃHÆ_]`Ì)prƒ¹ïÞfÞÈûÑš>owWÇú-zrGrü078~SnžQÓzŸtn!O<þÙ:>x|‹þ_ê€cK uôáÅczs1ðy±ãœo›Zœ2¾@KÄëhòc¡²Ý‚¶#´ý±Œ4qõ„ÊË·.”.ä]a>JÆdiÈr§ž|d1ޝ´c»BZ”ø´@©CݶÔÖÉÖÑÐGg´‹~µ¯¿Ö‘NŸùº>ûl¼PRÊjC}íæËì<¾m»@žˆszBôYðóhº¶˜s~ýë_'>òÇG¹û¿ñƧC9$=ïyÏ˾QÔ‰xl¿ŽŸ{þ IJ#ÁiG¿´Û.i<ÊO!6ê KYëìlèP´¯žÐ'^3.Æ)[mµU[‡z©ï“/ð(ð¹Àðàƒæo4´¨ÿ3Æ{î¹g[@ûmB…DZÄ£Ì@xµŠj‹K^èn{ö‚½êàe™ÐÏgý•)¡Ž2Ùä²@§”<èhYtθw~Þép˜Ç"\ðb;\‘÷ dC:öз-ýA9|@V_ S”…GÛðÙ¢}ä\#ƒ,9êäµ]Ú¢}Ûa‚ÏŽ ”Ž>“t}†ÏU$lãƒ~áñtP;Bmc‡ø¨›®þ™ ¶¤Ðúè€gO]”lj1*åm3+‡Ð)ÆE–í‘¡Óï™ÛäAkƈmM̓™SæçœgÜw¡ã+„N©hæA><ö-rcÆ=óšÜX rƒ1›~÷¼>óã<œñ'o:åt6Ž´ÇœÊÕ?ÖÜy#çÆ=­¯õ3vŒWûãžóÇ).¸O»»9~“5ýøÁØq aÜ<Ç ð»,Ð)Ã?J{#­F¾âý*û$½ÎGów˜‰ÓSžò”>b.ع{¼í¶Û®b[ýÒ@ê4Þé÷qz+ųŒ5qØ}÷ÝóüÃO¹ñw)ƒ{eÈW~Î]ŠñržR–RŸEêĉ³í¡ÇŃÿþïÿNÿïÿý¿tå•Wæ‹|<Ž/Èóq¼Sîøh=õ¡ §ÿÚêŠ?^$áXn<Òç8Oÿ½¹Ú)(\D¡xñ„cO,¥>wèË‚.O0.e®¨¯Ž"¬ Ë|n¿­®ßs1yûV§ÛžYu¡qA¹N©Ž¦£€zÜ ³IÆ:ì<ì$‹ç®È‹Vš2ø§®4e<ê´¤óȰ`@OÛGÎÓG `tÁi=úú×_Ž$ ‘§Mtبã6Ùì< íÀÇ]N^-ÊS·/èP<Ñ¥®<1ˆ…ö¡½h96hÆ 9e‰7øây-ߢœíÁ§P[´£,PÛ¶ïM¬y°¤ÊÆÍý€qîø›uúاrcÑÜåͱÌÌws§·. :§¹¯;Öqÿ—V7þÊÕé“sÌC?ÈG.zÒ6ùÂ<§]|wC¯9~´ŽIÄb,97¦-ÌãFÛqL†:þæ„s¹°dN“îsă±µ¸?ĸ{nmìó`Õ9"úfn0ÎŽµ}–4êcQôÁöôS½ô­?ÕªûõyŸ”q¾IQÏ»‰ð‡Òþù矟뜻ն3}Ûê¿u}„ÞB;íÛ®°?¸ƒÎ>ÀûãƒÕçzÜåå'ólÃ~±Hä§å¤ËöÑ_…GFÿY?ð« ï}ï{ÓÏþóôÿ÷‰Ÿùã£tÚDV»‘6Xÿ£>øhûm ÅÇ\|ÒV>«äb <Ö3Ä‘ \ýÅçv¯.Ð ÇÏPR¸[o[uú^ƒçF{|ý¯½öJ|õŸýXÒÊýSøÎf_Àí/õ¡_G‡õl§ü½,«¹BÕÉ@IWvL:0¨—.ì}ÿ'mØcg4@œÄ¹`†ÎJ£î¢Ô‘öÀ ˆíbyŒÐÀÙ,ð) $v(´IAuìsò‰¼v Q·àÐ×?l@£À§xÂjŸvÆ…€SO=5?êl;ºöÏ;ï¼tÇwä!7þëÏhÃ2ƒé‹?¾¶Î">.õ­Œs _~GïU¯z•b} ?g)õ/¹ä’üÓi¼îxðS|ü”[ÿOxÂÒ‹_üâtÑEµ/’j[ýX/ieûÊKÙÈ ¼®?üáÜeê[üDž~•ú<"ÏÏöñúƒ2ä<±YT½’.MßÕÿÓŸþ”/Žy‘…×]¸Û饗*šaÔç8õ׿þµŸÊ>ûì“¿ÞÿÀ¬ÂSŸ‹3ü"kAi wê?üRV kQä8.îy¢¡Ôk/øW>Ô{'xÎÜy¥Ü ê:[B°È“F“v¶uþÕºOÞÕsñ œÜc'Ÿ@T| °ˆuÁJûȨG°ãB¾4pvfÛB:Ŷ ‘XœT¡Ç®ŠpÛ…NQ—:ú¶… dáÃSrú§ï@âC?)ÚGžÍbÛаGÝ ÆY»ø¡/È{2Ò° Íþü«J|QYJ'ˆœE™:þå˜4y°VäÁC+[û–c騖P~Ì‘:Z©gÙ&7ZóËÚ2G0ï0O0vÎ#ÿNó9bÕ 0¹-æ-Úw.D—¸!ë¼Ø?ZÇ(âÁf1fƉúh?°in0vîç 2e:Ñ WGÑ&ª1]ÓÏ#ÌæÆÕ1uŒ…ÒÉþhò„æL· í”p¸þj'êë{¤ñSaÜA~úÓŸžÙê ßÿþ÷çsÔoûÛÆ‹GËùP  ×¾öµÙ^lK›u4y%¬“4û4šJ?¬Ç¶;Ñø7Äþýßÿ=ÝtÓM}âõ¹³‹ì¤I“qfÓ¦e~’ÍaÔgíÀ¸l³Í6ù ñÈ¢ÇÝm¾#pùå—¯b}žà'末¡qŽ?,*µScûúiY¹ ÿl«„±myÒÞö¶·åŸ–<ãŒ3V‰²ßûÞ÷ò¹ @ì+_íçy<¡!-B^à äXãÐðo|cþr?1·ý¨wÊ)§ôùM{}=ꨣr;ßüæ7ÛzQŸ :'Ÿ|rSŽê £l-â?óBµ•=ëVëÂö‚ÅòÖ¿í9ÜBòDÞ±c=Ú,i;…|lÑx,°¡‘äЭs"GP‘ãÀ¬òÈ;ÈòhÇŰ~Ä“RÚð`‰[ÚSØÙl=vhhÚõâ€úò°ÏlÚ³ü¤]x@ê´E?”Aføº×½.Ë´4SÚ{ï½s\‰Óç?ÿù4yòälŸ×&³cŽ9&›±‹m1Î<¥ÁœŸþô§í_jàKþ|KᤓNj?õýçÛïz×»rü;î¸üzç9¼6ÀE‚}ìcùŽ?þø!÷ß> Ž«Öh±¬Ó³n4ðö³ëËÃÅ‹[8(…û«r;Õ#]½ «/ ®·nkán[ž02è& PàÈPà³xuÁÊ…]²Èi¨]}áš a rÛã‹`?ü@[øÁÎ +„´­oÔ±>tlº€Ã.m# Í>ØžuüR¸mÀC:mPÀíŸ}ÀïÈ ‡LÜJ]Ú°mÚd‹2¶K{ÈÖuäYB›}¤?ŽröKŸÑq\àƒ#CA¦Éƒ±ÉÆÁ1'öê±X‹x”sáÚŒ_Ss¡¤Y:þBéÌ:äsüè=&®éyÀرæñÃ<êÔßhÛü“f]=âÊ K^¬‹ù9>îîK«Óÿô§?ß+þÊW¾’®¾úê¼å§ÉXàðþóu×]—gæ\ö'?ùI‚×É^¤GÜv…%Ϻ¹ˆ«7Z°´Ý©éçÊ/~ñ‹ô¹Ï}.ß¡çN<ùÈ:‚óIp>êwÚi§µ¿¼õíû Fb '´Ï½9²Xäîÿ˜ÅÕgýðï|'1nèRh—óv~ÆïØcÍ Sèê€S¨—4éY çŸ2Â:™(?R<¶S×–|!2ÌÛćGâYpŸxâ‰í8ÚG}tvM= O[°ðgÁÏø¸6`ÌŽ<òÈÄÂÜõ`V®þñĸ(öå/9oŒÇ ÞÅç‚Ã,¶G‹|ÁŸ,žsÎ9íöà=ó™ÏLùÈG²}ê–¨ͺ0ÒÔ,œ°Ñ„>¢ë†óðÈÈ ~ŒGˆC-ÑiOðâä=dJšíd^UANà( ƒ@â“ ìx<ÞAU¿éºÈb¸òÖm ì°©GÛèd¿z‚_ì2ØbgE]6ø¶<>¶« tpxô¾öÀ…1€§<8± ]äØ Ñ®öé›võA;ÐÑÇŽ eêð©S°šþdFõ»ìQ¬çJõ¹’º6”Ų¶EÛø` š<è}D™8¿Õ™qü†3þŒ»¹ÑI_z“kçAŽ8Æîç@sGžãl]Ùþô3¯lrcíÏᎿy²Î:­ MäOsüh—Scá1”}fM8À7çÆp8ãžó…úкUºá¯þë3m°÷ ãÐ9÷½öÚkÓ›ßüfÅ:Æ‹;šèŸ~úéù'ü¸;ŠM> Ç•GøY<ñuxèuí—4µïòŒ·u«³)o´¡>aw¨þ¨‹ÿ\á§ñXôó>?wãy\|¿ýöË_ÊçU°²DýÈãn= MžàÝsbî‡é¢œúð¸«Íbšì§üœ_ègmƒ\ŒñË^ö²ô¾°}^.o¨ý¾Œn´5T8Ïÿð‡?œ¸C~ûí·§ÉÕ{bÇñ¼ÙŠí2/zÑ‹r<øÀ!ñÛa‡rìXŸÕô¹˜ÂEžäàWx*€_Bà»Ä“…ÿ³Ÿýìü yiãùÏ~~ʃû1Ƽ޽Gõ Pù¡ö_½¡Àò?1¬+™JbŲñÆ­/FÚPpϧîà”´hwÝõª«òË[ }D,R£o.Ì™° H~ÈR Ù6²tšÍ¶YÄRàQ¨»Ð…†›AÚ¢=Û²ìØ'×gá…ŽýÆ8ºà´‰-q|´N?Ð÷B‚mÄ6‘§@Þ>@#>è#ƒ/@ì"b?Г]Ÿ¡ÁSžþ‹%úݺ>iS¨ |hÊC‡†Ÿ´EÁO|nò uQŘåàTÿ b¸:óÀ±Æ/ÇSuý®£É·O¥>tú ½É•yŸ\æö]Ç{$ão~ɇÏ4æͼ±¶åc‹usDZæ±sŠòÚX·Ê;ŸXlŽköyãÇÕ±eü•úàcQÌ?}°?B|ŠëuJ>[àó‘1ä:è ɹN¥Nÿ€Hlèpá`úôéù«æÈÛ.8¥N¿Ž†žtô´#M¾PøÊBëV±ÁúýÄ'êä%wüÙä •±?‘nŸ¤q¾ÂÅûÒÒçÎ1Û@þãcü |l| }ýW¯[~SëqbíÂòØÔ×çá©C¼ýb¾ífåê_íG>ލ޲¬Ø(ÒlKÈS3| PŸ¢,xiS=¡2QÚPÊ‚}>PŸK¹'.®d.[Ö÷€ô ‰r±Sv¨¬«Êá\8Á÷$ßE* €<õ–lKÿ•…ïA„¶ÁáC×&ºàqIݟ‚›¶ìƒ¾ *|6ÛÔlØÁ¬HÆ@IDAT>ÈÄK{è+OÔ¹€}®è¡GÝÁC} 82Ø@ßšl²é‡úÆYhÔâØ'NÊÑWm¡#¼,‘ߺ²êG[´i‰¾Ð6¥Éƒ5/ÇÜâxSï4þÊF¿ÉµgŽpq\GcüͧhS|½ê‚qõVX.ͼ±f? cçø 3£çŸã­¬ue…ò©“õo›ç”,L,CÕ׿hékg4 }YÝý‰>èKã1Úñ´ÍÏ¡´õF©?tý¡ŒA\ËŽßze»N?/øz¨ïBwÒ‡[$’Œâ€Eš'‘Ÿ…‘çþž-:LP.ˆYôÚ)ì»Ð²0÷À΢Ð2¸'ØU‡ö°:òà´7õÕƒ'®=ŸÐ(ÚË•žÈ¡G{lØDž6¡£O±]êÈè²QYhØ%6ÄŠ˜¬IyPŽŸõ8–Ш³‰;æ±.^©¯<ô&7ZóÏšFœ6cŽF\¯ó·¤Q8ê‡n@ã…íÕOn¾ùôÅêh8ýïÆ8hs8þ4û‡Ñ<Ü|óÍÚÂëk­9Û„€ä¿w™¥¯_-\‡SœøÔí¯^Ç[ùPµ(®”9QdÇa‘L!i ±ÐacÁêâ:|èà,†µÍ⺅:[\Xƒïõø]ÓÖ;mVñXÄ·N&µ­=lã1éæjLï»kZû}žº{Úl«MrüÑ¡_” ÍïÏŸµ(Ý3é´hÞ’¶íWâ¾ã£¶NÚoçv,+ì,˜³(M›:+MŸ:;-[²bµæþPè§ñiQZ4qe¬$å£ìêÊ æò‘WlvÙk»´û>;æ®@c¼¢ÎùÑâêé)ê7\rgzÜ¡{fYÆ=tÌÊDÅk½¤­;®Ÿ’¶Ûe«´ñf¦Ëξ.­XÒûÊ s¾ ¼:‡ñø4~ýqéâ?^SÑZ_¦-ㆯc5G8ßè›0Žm§|H&ÚRvu?6Ýbã´ÿÁªb¾êñcÉ¢¥Õü?7ͨæð™ÎÉcOl;öû½¿[µ¿o“.ùÓuyÍ úÈq…1ƒf<é¯sR9o`³SnxÌ#´·:sƒ~XÊñ„^Òb=âÊBc[¹²ºx½²uüËãGœ#Ü/ñͱÒgŽyÏ#…oŸîy`?‰ùN1^¹RÔûã)ßm8‘qü*ëu´(ñ:Ù:ZÔ‰xl-êD¼N¶Žu"Žl7JÙFõþxúÖŸL'Þ‡>ô!ÕWã¨qÊz-ÊD¼N¶Žu"Žl7JÙFõþxúÖŸL¼µQ_Ÿ 'NœØåøÒ©ä?‹dŒ~ tË-·è$?$:ƒ'oñh$óüòêûÈq€ãJQ†:tÈÐ1p 'CœÈp2Ë’žòÔ±Û`‘ö”Ã÷­«”ZÇ›ÜÆúTv«A­XÁ‰\/sŲÕIø Ù¦ÞmŸíÓ¿{xÚ~×­Ò¬ç¥;oš’¸{fÚlëMÒÞOÜ-=íùKwÝ45ýì+g§¹3ä“=|¡{?a·ô²·?+-[ÊÏ[m­W]@W½“A჆çž~E:ëg§uþÕZhx"o9±"Fðcßä‘A¾zBäØGÛr\ð ùNE[ÊÙv”ï¤Ï‰,òqŒ”íVp±æ¥o{Fuâ}mºéÊ;sßi“à81ßvç-ó˜-^°4ͺ^¦Ñ·CŽ8 ÷²¥ÕÉzU7kÆU ±u×m%¯ÑÜrå]éÌ_˜¸gFŸ¶°ñèÇíœ^úÖg†|h¥%¶7¾µC/¯rðÜÓ¯LçþúÊ,‡ÞXçcBÛeç˜G<Ê E_½Õ‘´M.²ìõø]Òóßpp;ŽpJlÈ…Èê§={><Š@ÏT’î¿sVzñ[žžs¡J$Îj3±dL—.©.üõÐÕûý.Hóf/HG½ãˆ|é'_”ÛŒ‹<ò1gÛï G¥#?ðÂF<úן¿Q'âýØÏÑÀc #mCïT¢NÄ£üÃY?ös¨x]\b #m×éÉ:—|8ëÇ~–8Ç ‹çÖ#l­$+Ê„°àDáþpƒÍDÍiè[—gÈÁ»\NHq0E†MÚ¯¿ý·túIçd¶8øn¶õÆéÿ{L:ëÿ.NüÉ…Ù<ü°MÚà‚ÉÏÙ'½þýÏÏwq¾pÌÒ¬ægßà·|[/=ù¹ûUž“ŽþØKÓ·N85­\Úû“Ùxõï›ÇšîŸ<#û…ø¸ÁFãó¾g½âIéy¯?(m¹ýféçÕEû‰.}§_~äIyÑ…œñÛp£ òÓûø¸õ×Ë Î™ÌMgž|AnŸ8š3àc=Gð-˜2/Kã‰_§NVG/õ­£óP«ÕuüøW5”3~x^ºèÌkúäÆzã×M[l;1òÂǧÃ^ùäôžG¿.}é§äqf¬¼gfºéŠ»Ò¿ª‹€ô™1g\ÉsŹy ýVΠ^æFÎÏJGÛž¬I¹arçz|Ìø#¯œ6xÒe,úÁ¸Q€Œ cưé#<Æ:|6Ç;lŽïÃ=ˆq06ÔA¤)'_žq‡>Ve´ýi×&ýnŒQ3}/\ %º1ØtÿŠ?ÈFÝGš>ýjá<Á²nϱÏz„­#SEñ1O˜ãúy *—8e)w@èbÐ>xuô ©,zÐcA ® 4pè0=á ºº<=ðbS] …3zÚF^t~S»ÐÙÃþ¸ ÖM/9úéÕcÝÓÓ‰üEš6evÖ§}äáŽîe¾.V-Ìvzô¶éyG>-ëcõØ6ºž ,Y¸,Ý}Ëýé”/þ!]}þ-éÀÃöI;î±MÛWd½ˆá8Ò&›qÇÚâDƒ“ úcœÈRAÖøñä4 öiK=ãÜ_™H/u”Sˆ¿1.èÙ‡næAn§§øeà OÁ”y€@'.l‹.­òátÊþ®¿ôöô”çî[]Ø"·Cû´7Vy€?øF·@“iॎrƒÑGfuå9P7G˜¹oÕ…|t£o17 ³ïAËûwÏ@S§@g,ÑçŽðÊ*O^ýÎç´çó*Û¨dxz€×H~uâ_Ó¿ªëØ - 6VÇáÂ2;Ñã8~Å1x”•iýéW†s¿WǼÁOÁYð›q¡ŸøRÍdiî´…é÷?:?þÝsÒVÛožŸBŽqºì/×§|ê7yŒcnÄyÛu¹ ûk.ѵŽnäïš”e.Äuü±Eá?}4.Ú´ßìWàÊ Ýã%:ºÄt8çøRwü°ÿ¶ÐIyà8;~ÄštêëÆ Z‰C«2šþŽ´¿k“~·Æ§áuc<‹f<Æn<|:Ÿ±\Q£:•ö‚qµ¨³ð8èpв°´!=NNÒå<ª©“80Еá€ÌÆ2ø˜Èq·ùžQG[d¡³Ñ†'KU%ëòYlMdêàG¼éдÉf¥ß~ïÜü~µ6°Û…~Í·Uf¥Ÿ½oûýtÚµT‡¹Ü¾'ذô/ûË Y”o ÃN°iBŸHèlÈqˆ¾'èÖåiC:›lðСàW„——Â?éÀˆ+"Ý1¢Žß´ N?ñ]yÆ„m4òÀ~Ð}9­Oô8Žð(öÄFø‰ßÑõ;n¼·Z\6ßzÓô”çí—Ûê1YeA+¾¼jx+d«ä}ãâ‹„™ÌIgýôâüšOÑwì ƒ|Sà?>]qÎMiÒµ÷fûüƒï¶:r£íHÇ7âÊÕÑä#?âÊð­èlô{,ç Ž]”ê4§ÏX2Næþü󜛫ãÜCyÌÜŸ³^Mnкyƒ¾™ædn¼ú‡NÌ ê¶ƒó¸:sÿ,âBéBéÀˆ—üü-‡™±Îǃ˜2åÑçøÑ3ŽýP/âôõážô·nL¡["?âu|iÝ„u>Äö"?âÊÔÑä#?âÊÔÑä­ úÑ×ÑÀ×öx¬nÿGc ¢ÕÝŸµ½ýËp^%µx³Ïz„íGú Ìáþ,_´êžd”<ø”Hg‘Ã’ƒ4…ƒHœŒž@ÁC}h@øÊPg±£ut€žà¨‚=Ú£`§Î8òØBºþÁD‡;¬SøÈÐ)¶§¯ØúÃÿ^˜ßñÞhÓ ÓÜY­»x½§=-ý¬Ü£ ³ø»dAëÑ .0°°ƒf¿c£Î¶i×>°À§ˆ8}E2ØÔ~!gg‰84êè‹g¤øuÀ­ã‡q¦½±ÈŸlÁûH ô‰¾Ä+ghñëF|ˆ¸õÁŒ'ìÕñVGn˜´çû¬Ÿ@øæ.q@ÇÜ0ŸÚsDÏ =äì³ã¦Ýóϸ*¿6Äw®¿tRâ© ¯~¼æÝ‡§…ó§³ri{N€§ŸŒ?ö°íFÝ6Ì_ÚrÃÏ‘Î1Æ ¿b±¿ÐJ™þxÚˆ:ÌD«37ð‰ñ vŽs¦UquÞà›~K/KnÜšÏñwýwLOzÆc« Æçå0n›l>!þº§¥ ~÷Ï4£zMãÉÕ…ž'?gß´õŽ[ä @S«ã sÇÝ·Þ¿JÜw.$ò¢ÒîݱÒÛ<=xï¬ü¤Øù¿»ªrÏZ¯|¬ÎÜè3~=ói˳V>˜ÿQN>°ÌëÜå0ÿè1qÎdlÀ± ÏýúŽŸuÆŽâ˜/ôµ…t öu #o@×?u:Ε€ýÒW}·Ø@&}¿<~(ƒû…u6xl´M»nô¡söõ9â±oâø9Œ²£ i;–ÁøÒŸL<ÛéO¦?Þš¤¯/£ é,kK<:åïXùc6šx3ÃËÇáŒÁúÿ?{odivèݪʬʬÌÚ·®Þ[k·Z»P !V ÀÄ0yŒ3v„p„'‚™ „g ãð cƒŒÍŒD˜a1Ë€H€4,Ú-Z»z©®®½2+—Z|¿ÿå÷ÞÉÛÿË|™ù²òeæ½ÿ;çž{ιçžsþ{ÿû¿ÿý/¿pÜrãÆ\w½&ì~Ã/xýúL¬„·A趑ر.]XxX”\ ]lÐ%ÎBÉ·×,@,:ð«^tP§ >d]Àh§@·`ƒ:€ÈRh£OôYh£ÎEÕÉýé?ýîÇ›> ÁË¡<º›Ç_~ð3é—ò}i~v±Kówûöv.Ì‘×/ØI‹…3oLàåûc|oÄ1#Ka3êŽG,ØK;ý:>pø¨ƒS||Ä:P\}Öczb½‡.¶2°Ÿ‹vl5ô>Æ—¥ßôþm|Í ²kÁ9úåzi{ê#_h^ôxäø¡¦ÞЗÞeÁ7üú,æø=h\þ¹'ŸkúÚª<0–ÿjò[™Œ‘œè—Øž3Ç!4±,sƒø@37À)åanHË7~ÞócïMS‡'Ó7~ÇÛšœ@ÇÛ¾ùÍO„šÁ]žiæsH±¿»ÌWæ®vĺ9iÁù£­qDÞ’‡—gKÖ¥'rè¥yƒ÷mœžÈõç[9ÿyô¾æ†_Ì ÞÛòåù©SùŸ^¾ûŸ¿3½ã¿zk󯿟7ëÏ}öBzÝW¼"}ϼ+ÿ4 ÿ+C7zÈüòð«Î¦ð¯¾-½þm¯LO矚½ïßÿyºtþjúŠo|}úû?üÎüÞéÆÕ[cÚµD+ÛV‹¿²üÛÊ–åÁ*sç,¶Yˆu ëG̃AÖ父<@^ÿ:/p^ŠÚ¡_Êsú ñWÇfBí³ëúúZìÝMòúl˜Pÿ©ÓzGïÚ¼_>ê³aBý¯Në5›Ö€XæÃoú#½áòBІ¹üMåZK (²$WY\ÈJºu6Z,@nÖ¹{Ì@ÐåÂ$¯tëöüÜ-‡†.ÕØÄYí“\8Åopé>m¡xßs¦1áê…™¦ ²è³ÐWWçNöIϲ7zÜØÐNÁ÷ç—>½)«;—žþÔùî·ØDØ?6xˆ,{ñ ~9ÐI[•ƒîE#8tb4ú+‹teÚx¢ÏÛä¡©{ŒÉÝÊÆHaÓŽ øBŸQ§˜>Æ+/þ¿)K~$>ÿÉç‘{òÍœëWf›Xv”t6‚è´o|A¡¯“ãùíÞoj¾Ýýâ§Î5qÙª<0îÂõÄ™Aä·"7úÍenàx±Ñ9‚q™´“/ÄtÜÀ肟ouߟÿ ôËó_GòFw¾ÕççDûã§òO…žìú޾”Ád±a«rÃ\¦ÿ¶¼ qõEØÈoáú±wéë³öàó27ˆïn¡<™ÿö“s™1ÃG77ˆ!…':®å¿áüáïþÙ´p£“7èùÿ~îÓßý‡ßÞù½oOOúùf=À¿nBó^OäùùþõüÏ7Mmï}÷‡ÒßûoÊ/˜ýúôcß÷oG&7†Ƈî¹òAüˆõfÌè5ÀÉ#ûÂ?qý¥9¢‰›ñ˛˲–ù£”v}Øönt¼ÛM¾Æc¹†1ÿ‘æåZóa¹5ë­×ž­öÇV÷¿Ö8ç+ÇuD¾ƒlµ › ?\ °PÚ’¥+±R:É`+šuù¨sL{¼ ¶Î ¸ˆÆ^xµš<.hòpñ/wÏ]hí× 2}á0ÛÕç›—Õ (uptž}°óò<þ†=èVŸã‚×6l†ÍvhnOœ=Ò¥ã#ž809–zå½ù-ÿ¯Jü àÿø^ðÔù;x,øÛ8(úGÈO5°ß~áóÂRä°M=ÚI]¿ áE‡4¡m@Klƒf]{Ô}+ò`o~º‚Âã øÃ<ÀØD ±‘:~ۗ󎮽Ž!nà<¸v¥óDÍätç ôßnþÏ;å—ñÏýô~J²"oôó·/yÕý鉯{<ß:~2ç7)¸aF¹ÛyãGžÄzcÐÒ‡ñ–VÖõ])Oݶ­Ê ÏérŽˆ¹Á¸°3ž;ÌÒisP4 zl#÷ C³]Ú¯üÌûÒkÞú²ôÎïy{ºzq&¿Ùývú¥Ÿø½†ß{äÌ]Ï煉üq7sƒ¾µXÆ»¬—<Êj{Éo]>ÎÏC|yW×¥óõÐñƒé—Ý“¿ïïÄ5‡$>:NÜ{¤yoË#Ý›Þó¯§yßÜp|Æ蘎9œþ÷ôîf³Ïx̓™«³éçä×Ó÷ÿôw¦¯ùÖ7§ÿóŸþJwrïßöÖæ§>¿ð¿ær¹ÕÉ#d‰ýóO_H¿ø¯ß›¾÷Gß•^ù†‡Ó§?ÖyR îvn8nÇ 4¦´I—/¶A+ëÊóÒ¾-˃|î­4G`#ç'ç±7hãˆyçpÛ̃ØiÎAø ÌÚ5Êsv[°;–2Þeþ’凗ýmÔÞÝ&_ãÑ۠㋭Χíògøãc½Güc\»ÏÈíÙ¼!¤ì “nd^ g¢¥8i ¡9 GZäUvñÏ y°ô%]“ÿÈк•~±†A1ö¼YŸbÿMeéšþ‡Ôèî¤qïܸ¢_x(ßù?}sË+ȇ'Ó~ýÃM> ³Uy@߯!8mý|a»2ýämߪÜЮrŽ(sü1ä:GÌu6 ùƒú‹r#Ó¡‘cä"ÿòðË?õ¾æïüãïD_xîRÃCŸžÓèâðœØŠÜpìØIi/ô˜;òm§iЭ#ߌ=Ÿ?·–¾=U'¾ƒºç­óðæF¾Ù@yûßþÒæh*ác~n!}ì>•~óÿú@ó®â¤G[nüiþ+ÆëW–Öå<–¸~ðþµåKßñšÜSgŒšwʼ÷=Jó7:OšàƒÆ?KóýçóÏ .ž»’ËKšŸmUn8nlã .Mˆ Ë6Ý*òСqƒ4¯Úm”»•ôµÚab›sràÖÅ#í”f|E@sz]ëÑC!oÊ<@ÇVÏeü¨Çq[4ÆdvëÒÂ&~Ä>íÛîÖco´{§Ëë§aÂÎù` ññjù4Ì8”º´C8ˆ=1–Ê wƒ|éÃAêünßœà@ï séÀf·Ê„ßÒϰÖB@8 ò1HmmòÊ·x³syÝd™´Ô±È……Ô ]¶Î€t2xì‹oüiG‡P\üyQ /<ê§ÎÅXì©Ï,]Œñ—XOº³¸j?úÑ äwïÚÄ^ûË<”ÿûG#]zþZó-í3×n4ÿé>7Û¹™cGý ›b»Åé›:^ ¼ú«!äÚõ:}ù“xá£=h }[¤÷k“>x±ƒ~£>êÇF±SŒcáÛxìKØ–cKßðßÊ~B^Æ N÷) ügÁúÑϺ@ûi§ Ø–<µAY˜»Ù\¨©Úÿ󣿕Î?s±‘ç'&ó9f®Îå—¶ÍwÇE?è¦ècHú¨«(ï0ò€><ô/ú¡YÀË6ëòµñ¨Gž­Ê ìÀož³Ø¾<7:þçÉ Ç$'£ïÁS£cé.|m¹aÄÉ<úèžJ_|ê\þöá|ðc]ýÚD¿æ<øVå6пãm¥èƒÆ_yùË:º8¶47–Æù;ïù“ô‘?üëflä 7‚Y#^8w1ÏùuŠÀ^sÃq•¹Á8ŸùÌ _¿Üxîó› î‰3ÇÒå®%ž`Ã{kñvzÉ«ïoþ {§YOøæ›Âü6sm.çOç!а›°Aû©iÊ»ÑyƒÜ° ÛC_ÐÍ^¶YWVÞøÏ&òØuø©s^‡µ~Ð?>òœ¥/ü×oýÐó@?—yàyì—ÈÆ9‚:ë6}Ð?c†¦Mú@¶zŽ0†Øcf/Û¬ËWò(»¾Êþ´ƒþÚÚV³w·È×x,ÏãÞ–3úª­mXùdÄØÛf³}´µ k<覴õ±úׯµ@×d¦¦ömv-×®]oœÓ—k€«³!€ÖÅ jT ÇÂ"¿iì}ë /‹” 2 ˜‹m.R.ÚÜÕfÑcÁT½ÈÀ‹Œ*êµot ÇâëÅ€¶R‡î¦Ýè¡ð—Y”CǦH?è¤ú¡ŽnôÑF~ô-.ݼà÷˜Ïä—,Q¿vÀ§ièw|È Û1Q×GðPCO”×Føè£ìËqEÙFaþp¼ê‘ëâÀ²h¯<Ü\‰q‚Ž]ôMÙ¬ùtó >zõ±"NÒhç0Þw3Êø5NÉئĵW`Éc›2ÔÅ·*7°Ÿâó~¹ø[Éçˆ27<—à÷§òx~·ÍŒ]ý³ù=ÓG66™Øõèë­Ê æc‹ñÓ&éÀµÄ¿Ÿ<:8Ïöìéø_Ÿñ e³æ úö'YW^¸ž>󉧻ç!ö2o°Ùo[?´­10˜ú„§7bLɘ³ùæeb:¯[çn¥c§5õ·¿ë‰ôµwÞÜàmù;õ´8ßyjÑ/ånÍ17+‡9¢½±.,‹òÐÁùâ`O¾‘ïÝÎƒÕæˆ¸~×AæˆÕÖr‚ø¡/ÎæVôþ‰ù¤?ñÓVæÁFãOì zîFÙ {£ýâÆ'ŽÉ1Êc[¬‹¢¼ö:fõƺø(úc«ã©¿† õ¹zc]¼ÆãÅë™þZ tAf2ï“û•f×Z:Ý—ÕõêG/'AYˆ\‰+CÛþñ|˜/ØX4Y|€ „œ…Ï6ui;‹2\\Q s@§¸ ©‹:í@l`!†Ü‹®=K².¨´Ù…óâ¹kþGßøpú³ÿøW ;i€>€ØŽ<¯ôöw½¥yëö§?þÅFÆ€iüÐè yiM§ù½´Qè_¡Óq2&ÚÕe;udá׿^6 —t*?ÈœuõY°åáábþµˆ}à›™¼ÉúØéïºy°4>rÄñ1n^ŽE9ÿÌ¥†ÎÅÿÝŒgéºÃ±á»2¤½ì5¤¹Ùùôìçžïn ¸a`OßZ”ñÇNh”FZÄ£OÅc;zÔµ•¹Ñ:G„ÜÀf~›ƒ­žo^\›ä4Æin Ö/7àŸÃ #ü–QÎ ÎWJŒŸq”4æ´‰Çö6Û•¡ÞœŸ··fÞp¬Ø/²+Ó¡q”¹Áœ¦ýen::µbnLLwnªÌÏvnßÈOþP~ê‡~)=õá/6xÌ!l£ yGÁ.r‰ÍõymV—íÔ‘eüàÎÙ±u:‡Éä@Ž"´a?\yÚÁ›¿(ïý;ÏÝ\?V›#°ÏqëSbŽoVš#h_ëÁ¸‘ó oúŠt|FFÁ6ø)w+šÎòGìZ™‘ñèSqÚ7»`_ìo£öîùÍŠKÇúòqØñˆy\ÏÎ|£_ô¹´ØnÛZ _fXö÷yœŸö抬|Þq¡ó³ ^O°W+Qnï¾¼Y¸Õ“a,D^P¡…2^pÐúXÔàgÁ¢°€ÁïB¦>d\DâÚ_Ú‡^ÛÕE<®É—_ýe/mþ[y.¿Eptyñƒèü7òÔ‘ÉôÔÇ>—n.v™·Oì-¿ýÀ^tПþ‚Ÿñŵ^6hòh7ti¶CÃ^trè?øè“¢_›ÊÒG´G>šÀ‘]­”2ð;.eïfœúrº÷‘“ËìׯøX?žŸ¥\>½ë3|Ü”œó¦óW’è·ðx®1Å<0þØ[â뿺Úä·27ˆ‹±×6ëä†vc£çšt`¤9G˜ÿÈ(Ÿs70á!—èÓÜðLh´bn`ÓjÅñ;vù¡ëcim>u°~¤;½9çnÎݛ䩲15æFœ7bÀcOž¸i¤íL~ú'¶—¹qüÌ¡f ¹–_àHá·ù”3÷ŸHŸúÈÓ#Ÿ1~ÆûÁ?üuù·ªjg&9<iãßÐè+èr½óœ‹ç5òêCÎXŵß:ý¬”´ÇÜpŽèw±Ú±®#âÑßÒœ¦ÿðu¿‚Œ%âÒ6 j«ú©oÄÞÝ(¯ï†k<:óŸ¾\O>); ȹ€ –õسÛåõÝ wðYš/έ°¹Êtá°Gë×Sb#nà€èw’çñV<Ú]¤ÁáÃNgCp ²ðºa=xð`³ifÓëżÈçmÈÁC8<.Ú´Sà§?diƒÎÁâ |ÿ¯~$ïK_û­O4z¼è²Oû}ãÛK¼ê¾ôÁßþxóeìC}ð)àØF¿!6ц¼6ƒG::Ô„‚}Ե߾ýö”>x´:¸¶#‹-ôAAG‰ÛtñÁc½”ÏMŸ[•ŸúØÓáãÓéõ_ñÊÆƽ@l5ÆöïKoÎoÉçç×ó³áaƒÑ”̇‡VÊb1‘ÿá[ÿû¯Íÿ¸p;ýþ/ÿYãoŸPé¾Å1륌j”ñ3¶ëÿJòø8lUnô›#Ì ì3W€žcæqG¹¡ÿˆ¯ç<žË´;G˜ê6GF57ð‹>vm_ò•ã‡s&â´ "¿•¹áÜÊf;8°ÈXœ7¤ÓfnÐF)sÚouÚ;Ö™ëÑsc,¯9´ò/>—çëÎ7ûüs? zÓW?†xë¼qÏC'Ò?{Ïw§wü×_¶eë‡~`L”aÄßœÉgÞÈÎ+åA¿9‚˜s¬uŽ€ßsg;ÌÆ|ˆ¸czÄœ‰¸¼Ð6»D#® ÚëðQ E™ˆG~uD™ˆË»ÝäÃ0Ën÷çFÇ?ÌX k£öìvùµÆƒ5ÏÂõe¿ÒløY|cYÏ7üÈ$aÄ¥5K±]œ·žsq‹=,p&2h.^´y±à†(/mlü#úã“4dq} G´© ~m ýüCŸjÞ¼üUóMù–Ÿhø‘S‡}>ðŠ3éïüƒw¤g?ûBúŸ{·]û‘Ámb;þ¬³YˆcçÀ~6êðÉ d£€ ~bcàÀFtDZc<ÐÕ‹mÐì H±..ŒíÒ€–ØqÚé»°>#m³óà¿ö‘æåW_ÿm_Ö<²o ±ÑxïËß$~Ów~e:8=‘~õgþ KwC–ÒØŒýu0pô<òØ}é{ÿÅÙ¼XëWæ÷Óó_èüV·X’ç›ÜËQ̃2~ÔÛhŽ Û#n[¶­Ì~s¶vÏá|=‡åanKÇŒ¹AŽ Ã±š3ðQ°#{0wÔ™›èð›+£0Gh 6OpŠu`Ämk£5‚K±]\ÑïÝž7|é*¶x¾©;oÓ27Ììöp¬¼Oä[þÛ¯Îãé½WE=ÿÅw}Uâ‘ÿßøù÷ËÞäÆoýÂ¥‡=›žøÏoúG§¹AÞü­ïùºÄÓüã öyÜÍõ›(ö-.„.aC̱=â´çÓ`ËÖÕæcA¦²¨qPàktòŒ,„ÈÁƒŒH`ì³±oI'zåGVu.¼iÍ¿™üÁ_Jç|Gúš¿õæôÐcgÓ'ÿüsé3ùLº’ßœ|æÁéUo~$½åë_“ÎñRúÙþ«ùÿ³{~/Ñå…öÑÅñÑ·³.ê­K|¥,òQòú¨Qœ?nÐÑ^ ¾¡_ø8¤7ù#ÚqÛ…¶ #]œ¾°…#Æ„qlvÌݘOÿî_þVú»ÿèÓ÷ýø·§ßùwÒÜ 9ÿìå4}x¢‰å[ÿÆëš ê?üµ¿HýŸo|¥íúð@þöþ›¾ómÙWÿ±9;01žöq =œÿ‹ûx~OÀ|þ‹µwÿØïä ï4O¤üÂ-Œ1†´ƒQÈíÄnK[é@Û„¶ÅzÄmnenÐwÌGì$Æy¶ƒ:ñ¡Ä9‚8"ÃÏChÈ ëy†,ý‘enp#ˆ2ʹmeaœŒQh{¬GÜv¡mBé@|•¶jýXŠ·7Ú±ÏÜp¾4Vm¹ýÈpÀ¤ü¿?ñ»ékò“cßõCß’>ø>–×Ë鞇O¤7~å£éUO¼$½÷ÝLç>{©™?œ7>ò‡O¥¿xË'Ó;¿çíé¡WžMÿ“O5?;zÅl~zöð£÷æ9î?¤«f»ó¼9Lžk+¸mа=æ-6"vËjëGäE†ñÚOÄÕ'´MéâÊè}Qà€ØŽ­wó:b<øê¿ùæü´ÆãéŸ}×ÏäŸe\íæö’×_ù-oÌ·øxú¡oÿɼnt^ÞÉ8œ#Þþ®/MoüªGÓ?ù{ÿ¦û"á2–øG¿#‹]tP>-eõ!ü›‘ôm‰vHÚ&,éÔ£.Û‡ c¥-±/Û„¶ÅzÄmÚ&,éÔË6yb[Éë²›)_ö3ÌúVŒ'öñr\¶ mõˆÛ.´MXÒ©—mòĶ•x"ÿzqô[VêË6a›LÙ&Ð6¡m±qÛ…¶ K:õ²MžØVòÄzÄ£ìJò%ßjõ…†ßlø}9J› '+ë€, ’N‰õèéðp±LÝ hí²Áwb‘B¿ ˜}ÚN=Ò࣠}ô‡<8|èoúÍom?÷… ù‘íÝQÛ‘çÀVÇ›37Ó¿ùŸÿ}ó̯þ²—¥¯ûÛoióG2—Ï_K¿þ³ïOïýÅ?i6ûô©ÝðÌ^ŸÏ}]lþƉº ½cµ_Ú(ôíÍŽh;tÆ¿þ¢œ6dЭ_ Q€âêG~ 82¥\Ó¸ôaÿTK>ÛJz›üVåÁGÿø©ôO¿ë§Ó»¾÷ëÓ;¾í­iÞ¨[ØÀŸûü…ôßÿ‹éÉ|S‡qÄ<ÀwŸ¿šŽäú=–oòèKäoßÊÿD‘7ùŸÎ?xï'žIö{•òeÇ<@õ™œsÏç|˜Ÿï<•1ªy _"4ÆÐÊ8Ûéâ꧔Ǘ¶mUn”s65GÞß3W\¹x½;en0&Î! ¥vþé‹Í¸ ¡ËóÙ¶Ü€çr~¹${þ8B¾D^][1G4\úh|´d_´3âòcêŽ>ëQF:müíÜ­Ì·¹±7aÏåyŸ÷3 ¶µŒ)æÆµ+³é\~ ŸXÅÜ@:ìûþmóDÑ·üw_Ýü܈÷¾ðo.?ÿ#¿‘>üŸ„­ñý6þÈ®ú¹ÿå×ÒS}mú²¿ñÚü’ØÇš¿êãH¾ø©çÓÿã÷¤§>ò…®ÌVæFŒ_3¥±H$þò(ßñCgm–t Æó†X ÃsÍsS½¶S4øhCö"}éummºÌƒKç¯4ó?Í(óþýën(ѯç5mô{åÂõ槬1ñwÎÎlÚmëGŒûfãÄq#ùºÛä7#úݻ͟Œ7–µŽ?Ên¾V{6:ží.¿žÌÞ¸1Øž|¢4+Ãÿ‹Õ½PzÍ«_•¾ñÞ±ª“«W¯¦gžy&]¿~}Ù]s„c û)cášMçÏŸOú‹O§[7:‹* mü® œ¾ØXSXÀXô Ñ‡u†Ãâæ" wóø\ØÑ§nÚàã±wtĤA|d]ÈBø ÍÅ:ß»H÷tbãÒ¿m@h蔾rŒ´£‡B›å­ßñ`:yòdâ} ð*o;Z”‰m·OrèÜsçÒŸþ¹FyƹÕyÀÿUŸ<{4]Í›¹s_¼Ð¼$kÐ<0NøßãOÆýµóàë¾ûÑtäÈ‘æÜ‰y´–øÇ\ˆ¸ùCüÉ æˆýü³]ÿBnh/qÅJÍŽW8¯ßþ÷KGíæG§e°Oã¿7¹ÁÜHnü§wç—Ô-tæ¼ížgòÚñü¿i6ûŸûÄsÝyƒ¹ž_{ëæò÷É”ól\?¦M¥ñɽ‰¿øã¥†£°~ ’ƒÄßÜàüã:â…^HþÍ/¤Ùç:ëÏvÏìg=Þ©ëyðŽÿáÕéСCM^sÊZâo™sN:Õ\ŸÄë Û׉ÃF¯wWêw#ãEïv‘ŸššJgΜIÓÓÓË®=WòM[çüµk×ÒsÏ=—.^¼Ø{‡ÒóvñGÛØ Ý-û9÷NŸ>ÿ¿}jÃñà'ÅÌÁì Ygb¹[ã‰}F|»ôo<Ø[1ï»ÿŠc)ñÿø¾?HôÇjÈ¿êÑôÍßøŸ—,M½óUvFO:™ž}6¯’¹à˜a”ò"¤ŸÎµvme – : '7u m^dóYô°iÊŒu96Å@tG=Þ€ººéÓµI2@7½ôAß”¾xµi·?l‰:©£O~ú‡íŒ š'uùšÎò‡<Œ œ‚Nplt Òh§Ú(öMŸ^dÀK±/ûhˆKÈÛ_Iõ~¸ýÛNÛè{¶2.åoì9ŒÉþüÂ>}ª­ýòÛ½áÄdèxÐe}Û5Êø9®~tÛ…ð š?ú{Tr#ÆÑó«æFg®bÞ¤¬%þmúºy–§1â±#rcog­cnˆóÆÅç;oáǃγ3ùÁÕü-ï¾Î óQX?bntãW·½`ë®_‘¾cò`‡¯äA¿8÷£Ç8ƒÃ×¶~”|›]ߨ½»E~³ã þÝâÏ~ù?èøõ×fÃAíÙèx¶»üzâÀ“Àoö[°»á¿çÌéî†bbù™(°®£#”ß‹`!t'i!r·òc‡lžü?shn>Ù±±f1gH›ƒóiùÐ€È±é¢ Ç…=´Ó?‡ü^0º£ùh£Ø8ö!SÚãf™>Ѹ¼ðØ7º sD¡ÃGßê`ó_´œ~¹3Dvq8.höïØbŸÚA_êFV_C×.Ú-È©Ü~Jž’y•2l¯yÐËU|3Šy0ÌøÇœˆùc^@«¹±=æˆ8ï?ãK]|#ù£õï”õƒóÜ‚vÚúAn³Äß5E]ŸuÖüº~Œþuy0Ìø£«\7:91üOs/B{Ñ!tq %ÊÙÖ4äëBèâ@Êv•oŒß„íê­Žç&„¢QYãÑÙoE?èëx.ÓN‘&ÏZ /¼·Lç'5ú•î†ÿðáC])XoÑøR^ºö6œAspQ/rü–9 Úássª>è´»Ù•üê¡oô«ˆ tu»9v³ „Ÿ^ôº–‡M2w¯ÕnøàWžºš¶Âã7 ʸ0µ‹¶è nLغÀ)èV^öÁÝ胼êÀvøè>ì‚Æ£“êq¡t¡t!ô6Üÿ³¦Oú£oì¢nüc×'êEŽvÆâ˜é¾¨úá·?ø¡{¨Ûi 9x‘GEžÝúéÂhcÄc{Ô!]e"Û·“|´u|_¾æ³øå¶õ»\“þ‡xn=qüXägÓ Žæpa“x¤##o–hp f³D›©^èp‘:¡q¸tC‡Œ17tèB'Åvx±h':¹hB¯öº„>ä Ñ/Èhƒf»ºáQÖ!u輫@û§Ý>h§M›±Ç2á¡Úí HÛ8àgœàêå |A[ì‡vdå7¶è§Í>"D9hÂØéòÚn5¶OÃXŒiŒ³íæC„â‘GÐRs£3‡áWÏQçü4JsDœ‹Œ0ÆÕü&uiÂØ¦œúäî„yc~v!}2ÿÈâ\ç½+Œs'­ä±Šñ#¦ãiœË¶H—WÙ´§^G°¶ã£í0G¼(~9Òbœ/m‘yåÙlè:d?Ñí‹m«Ù»›äõË0!þ‹e7ù3ŽUD8ùg±.”¾™p-öD^mŠ´ÒnëŠoGym^ ïnåÓâÒ—mò].6ƒ–£ù%\ë-8šÌÉ®¤7Œù#ÊŒu6±ÌÍ%S.8ÐÇ„kØ¿›WeÔ¡ŒýÝøc›gxÐI[äGgYâãôðÛ/8¶ ï&Ý~ô<”¸ù§Ý1ÒN Wlb<Èq€CÃxÀË›ܨ°?q}¢Ní”n?øD>Æ]¿c¡-ÊÓf]ñ ¶A²ú°_ti¿>ÒÆo_5–ßœ2öøT\?ê³aäA?â¨~qy"6Šm|àðp˜57FŽàܤĸŏ6ùcÐø«K9¡òèÞ)ëÍöãÿøÝÍüî¸=¨o÷õÃÜ`,Æ/â1OÌÚ#:¥”ïäÁò§\œ÷êú1Z×äA?bã¼Öø#·Š¶oÔÞÝ$¿±1ÂÝäOÇŒ_Å×2þ͈‡ý¯ÇeÖ;ží.¿žxŒõþIlv¶ÿû»»ü¥}`Ó×äÁÉõôÙM¶(Ý:¤°Nñ·3 :Q`\ Y´ýV:ßfÁãŃ›@tÑn› ui@úv!¿ y¹°Â7ØÝ~•Ñ>ôº¡'ŽÚ½ŒHA<´a·}¨G]ô}gŸÈȃ,rÑnêðÂÃÚà³Oènž£–>S>âò@+KI³¾’<¶Ð~:&Úô³¶Ö<èù¿Ï»™ÆÜ˜ZoiÖåµÞÆ+-òÔÜØ>sD[üŒåZâoî¨Oè\dû¾}yÞ¬óFw.åõƒ˜•ñ37Œ'°¤Y_)ø»JtsÔõc´¯#ÊX³XŒ·4ë+Å_Þ͆Úû)iÖµW~uZ߉òŽq°œKÔ©ÿÊúNôg9VÆ\Ò¬·_ ÚWÔWÒ¬·ÙcÛn•ã^ ßßÛð_º|¹/{wÃ3ÿÍe_ÞT­·´®Ÿ.7³¶ço¯s×n¨¹¸¿±ôÿ‚lNùÖÙo6ßBs»ñs‘‡æ†>Ї}ÐhãÎÅÅÍ;ºÁ)ÈÑ¿LèôïF{ùÆb›}(ãXéSÁœ<È€Çvù¡i?<èãg%?<lqüòAÃn ~B/…vx©£[\9ìp ´Q¬7•¥mWol+qäAl³ïš½''F9ˆqÜhüW“¯¹±}戶ù!žçmçÿjñ/åcîíËO‡Ý©ëǶX?ˆ}Û±Öø;ï˜ȳƱ Öõcô×rŽFüËœ076Ë^ô¬V†1_–¾ÙjûWóZÛ·z<Û½ÿµú»?æòv÷ÇVÛßæß6Úþ¥=mçž{¾¥¡u7üssG¸¡ÆÍ_É¢‰$šæ²-ò‰ëÔñýciöæ\³‘drã`sJ;8›Y7 àlXýí;‹¼|l h£@ç@ŽbŸàÐÙèsa>¨C§î>yÜtÓ4õk¯gdÁ…ðqÓݛꀛmG¿›wèØ@B»¶‚Ã?vÀîM Ú-¶QG>Ú«|Ž]ö):ºîìiT7öƒþ²þ¥‹[Ò?/Ô§Àš4ÆßQðÙVåAÊy@ÿÆ ¨]ÚÖ>Œ9¤~¸ìQ¯øþ‰±4síFÍ<‡à“Q#šyh_gÞ1vÀ~1ô2þÖ‘O\½¬sWëúÁœ>ú¹Ñ‹eÌké‘fÌË\ .ÿøþVv¾ÎÛ$Œ/ñ#¾ãiØ/þ‘ù7 oëo£öî&ù͈K鿲NŸ1nýpmÛMòŽyXß•þ+ëôÕ/‘®M»IÞ1 ÷‡oøgòÞ‰¿é;p óÏtQGwÃõÚµ.}6«>=ÝÿÕþ]Æ€Ä`D–<ÚbÝvhó·oä¶ÎF• F µnzè€Æ_¶ÙÿUÿŽ}\øxP›sô°QRJÚ)èÇÚ•ÓvtÊÇÆØ5~¡€#ãïí‘c£ïx蓃þ8ÀåcŒòÀ§nlBýÓ<ÈBGˆhʃÃ˸± > ‡ºÑɦ’6xÑC;têczïRhótKÄ¡!/ ëQúÞ½{Òµë×òF5~Åf 61~ì¢ Z̓-ʃ‰Þ1ãJ¬Œµq‹ñ–¯ä‰õˆ£yÙù믹AÞò}c¸[Ös¢MžÜ Ìݜ͹ѹ±ZçÎ:3Šëù°ï@o½ vÆ·Ä©:8G䇨Ö㚣cKÿ=Œø“+”¨«Cþgì#âô4h¾jÕn”wìÂñ<ßþŒcŽ8þ$‡‡6=ë±'ÊD|ÐñD™ˆoù6?®Ds'O|‰Ÿ4`wÃñÒ¥.}f&ÿíÚ©nuÃHépNΘ„\pŒç{ sÏу @IDATw.Ø`Rwƒ dpÐÙìz1 Miô! ]nŽÁÝÔÂCq#©NúA¶j¯“ 2´£_½l¤¡¹IF/|ô…,|êåb:Å1R§^n± ŒÏ~àCF^ú€—:O< C];Ð(Б…¦-úˆ~äÚ8ö:¾½=Ý´­Vè/m‹tmŦ}Yÿ…šøi”ó`ì`çF•±¶•gÚÛâß&'Í|mέƒùi–Ë57F=7˜o¦w^,:Œø› À2œËX?kn4þåyƒÜ˜:ÒÉ çŽß4Ðűÿ7«;×®mèg}Ö눭½ŽpŽ fýÖraÐø—y³UõÚ»Û凷ÝîÏŽ¿Æc¹6êÏÊ/·¦S‹:'òÞѽ\ÉÛÝðÏ\Ÿé¶ñÍÑZ avÊäÝzá‘§O§ OÎv7š,ÈQ—üôE¡ œEܶ6º4 ‹ ›W7öq¡Avp¨:rðR‡F½Ù æþí:næ©óäà¥@clê  ê±ø­<2ئ,zhƒFŸàÚqôQ‡Ÿ§!¨ýI}ц ÆtãÎ1uªówðé'p <Ð)%.PuÀ‹]OìK—?·Ðí»¢ùñ…6ðšw7¦Ou^úh<ŒgŒU‰7[ú?ÒÀKø ß©“céüó578O8báüÆO£0G`ÇÔéΓBØØë6¼mñ—´ ¯|Á¼tù3suÞØ¹qøtgî –1ŽÔ×ø)1ŸžHŸ_¼”Ænw6´uýèøˆÏQ›#éÜøÑB⸞ø+D~³‹s¬ý™¥íÑy"­Ê—ÞX]ÿ–1ˆô¨]z¤ïvùÒk©ëS øn÷çFÇ?ˆÿ;_èÂ[^Fùî†ßÍ*2‚;0ä#ެuõ؇®l*Ý{0}al¶ÙŒÇÍ'›sä9(ʸfÎæTº›Vxé‡ÃÍ+:lwϦ—u ã¦þñut€¡cºqÓ ]{ñ°/hØl›}"ëAý—O Ã6o^h ãàÀm§ ôAŸø×:ûõ‡²ðRÔ ÎÑ{§ÝèG—{áˆ8íÖåUw¤£»ŽÞ?‘7ü×kŒx»ÿx“怱\oüûÉC'78çŽ?0™Îÿeç½uŽè=}4jsçùéGN7q#~Æv¥ó_žµä¹gn»ï`zfï\7F|Þ Nýc?èS·¼ÊïßiC†6loüpðV:rú`×ߴɤ›ÊÒºà- ¼ÊcSgÃ?™&-¦¹ë 5r<Œpdò ÿìâØÙ©Æ6bj€¯7þÊ ÑE1oÈËC''ó·ü³iöB#8WG17˜ÇžÊ߸è^Ì{Žw"Úû„n›qö¸zñGš8ùAnLNH‡ïOWŸ®¹1ʹ1y"?Íw|²»Gã.”\mý€‡<`ý Ž>˜ÿÕçâb]?FxŽ8pto:tb¢»†w!1µ¬ÿÕÖõ j§0êÞ¨½;Y>úi˜¸qFÝ;ÙŸŒwµü_iüÑOÃă0ê^ÉžŽg»ËG? гÿ´ðm¿>&ìnøãkýù?ãõ”X;Œ4t–t•‹V.PøÝáÑGÆÒÕ/äÍá­=éúõëÍ#çÈÅ Û88ènžI"| ‡ÅM,|l\9”ƒ‡ Tm™ššj6ðða¯6«›M—4ä £B¿Ð¬£ƒþá§ÛܸÁG{´‰ øÕ?㆗"t¬ðb¿G³9Ï4õ)Ð)èƒyÇÃ8 a б5ù§_9ÙÄ„þµvõG^t¬F‡‡äÀ†©©ƒéà}ÓÂ_wÆTó “[ørTòàì«5Öä“1Œ±‡iŤ·É¶ñѹÁ·h‡Þ“æ.ÕÜÀ—žƒà£’Ìã÷¿n²™Ïoˆ)e½ñïH·Ëãæ#rãÈKö¦ëÏÖÜåܸﵓݹ#ÆUXæ‰m%ÝùƒvpóàØCùçùûëõ:bdçˆ×ìæAŒ#±,ã RÒ•ƒ~·Kì³´K[Jz?{K¾.ïø† kõ$‡‡Õxô|¹ÙñXßðÓ+›þøæ~-énø¹H³ìÛÛÙZ_ dB3ÐBimƒ†Æ‚ÄÅvæPºxÿ…4ÿ\~#X.n˜½¨cÓëÅ¿zÙ˜¢‡Í+üè‚_:üà´qPG–ƒ¢ž¦’?胋gth3è @§/héàÊ€S°…þà§ }B+ù¥Ã‡ÔéÇ1 6ôPh£  [¨ÓnÑNêÊCcŒ@íWýl€†^hãÓwÒÉ—L5ò޾8ø£¥Qo–x¤¡‡›\¸Ÿ}Õá4ûÌL_茱æÁèäÁØäžtö•½ ?q³Kêk?2ýä¡“«Ì§™NW?s5ÏÔ9bÔæâ4qêv:ùÀáî<ìü±Úù¿Rü‘í'~rƒyãĽ‡Ó¥{.¦Å 57F17ö¿N=t¨YCÌ `9W %­_ü3€¬Kä7¾|&]{²æÁ(æÁØ¡ÛéìË4ñâÜ%vë=ÿ)ß(ÜäØ÷Zóµ´w·ÈoFHJßÑGI£ã%O¤E|·ÈoF<Ô¹ýÇñAóIß­..,ŒŸÇúÛ6üÝ+õy£Õ-¹·[q0l(Å‘÷ Û¡ã}n:ð×z§;níoê,Þl:ÙðÁGM!Å*²lrY8âE„›Uúä@‡¶ÐÆA9úF/<ÐÑGÒÀáCÆ6!mÚ öÏ›B=Ú‹.ø i<èƒÆîø° š¶Ú/4üCQ;,àе:8ti^ÐtúÀîÅtòÕcÍß5â+ôXàÕWè§Ý6i±]šzúžNÇë<‰@½æÁˆäAŽõ™×îOS‡¦º9KžËßAãoŽÀß&>ÈÎ-žÀ9ùšüTÌ­Å:GŒÒ‘sãöÞÅôÀ—jæqbåÜÔ–ÒV‹¿vèä‡s_³~<žçñü×luÞ¡õ#Çêæ…œÓÍM;Ö;rùÃ\h;ÿWŠ?sƒ²æ‚sÄ©|s:Mߨy0bsóöCOjòÀk%c¸Þø÷“'?6£ôëºýÆñ(Ó¯~Ûä݉òŒsØ¥Í_ô±üéoÌ—AÇßf•õسÑñlwùõÄâæ­ÞKû¿}«÷„{Ô×ý†ÿöí>ÌQ°Äq²ÅEœº¸Pš¼Bêc'ޤ¯_L—>œ¿…^è<ïbÎ…›P ›céê¡M+òb¼ÐØ8P'9ܼò6}tÒ{t~Ûdó‰ uÚÑiAÎ>Õo¿ÈÀO;¸tøÄµÅ1ÐFŸê¤=ÊÒ7²ðph¯vÑæ7ùÐb_àuÂ3;›ÿ–1ÆÏE3z¼ìN:õÀ‘æBšýÂgŸàú”&.´½a\úˆ¼ØÙÔzøpš»|%ÝøBç/ ‰ z8àÓ'Ø']½´éCl•—¾à…Vó ã‡µäÁá‡ö¦{_~¼‰‘ñÐçBücªÏ#M^ timòÄ ;ɽC‡¥gçÓÇ.¦ëOÕÜÀ/œæ8ç†ç3~ãÀ§ðpèo mØ#Òž;éþ'¦c'tçHì°ûÅ–X¤Kk‹I“WÈ8\?ŽŸÊëÇk_HW>žs#ßù6OÑQç­É nß÷%ù ¾S‡›¹ ¿y°Ñø+>ænüLOO§³o˜OÏ(?-7Ó™ïå©y°Eyçœ{^?‘NÞw´‰ç&Å\1§=Ò¡¥éÒ¢.iƱÏÒ¶õØ«>u ±»¼Ž©äõþµ{˜0úh»ùc«ã9Ì8¨+Ž©ÆcùܵÚù©×cþ#WÖÕÕÝðÏÌt6y4xá(Ó Ð ‘rÄàÛ 6a6{,Ô'ïÏÕÏ]N7žšL·nö~“Ï«¸È#Gý, ðx‘ÇXà±ÈKŸÔÙ¸ÃGÿ\,øM<4t"¯Ý.P´±¡¤ƒ:<d(ÐÁ9hS6Ȥoåi÷°M{àG—Oh/üŒˆ º¢­´!¯Æí±Otë˃÷ßJ÷>~´‰ TkºšÁætR„·Ï~2`þ`\ôK?GŽI‹/¦/ܸžö]:ØŒ [)5z1¼[y0qòNzÉ[Ž7ìl®<š€äã.„.>Hü#o©“:¹ÃX™#ØôŸ~9sÄÕ´ïÙ©n>ÀWsãîç›ýS¯ß—Î<|´ûí>óÅsžøŠ7 ùØS–´~òèŒóF³~<8ŸsãJšÿ óF]?ðÑV­wò— '_³7}Ù±f á6fÄØbÜ…ÐÅ+åüäÅ9‚µqá5ÓÕå×ù߆ëú±•yp'yiJ¾æD³†p­E<9(1Ö ¡ ­ÿ6yõllë/ÒÖcïn’vL¢ïÔi5«ÏŸúm0ú^}‘Vã1¼x8‡êç<›öЀõ6üKßêÒæ2ðm5Ð¥"ƒŽÁ,Öl$¸`k.Ú_r;Ûs9]þËü-Q~‰¼\DÂÎâ Ÿ… ÚÜèÒî@yäà‹òqá‰íB¶E6¥Ú mØ€ ýi‡F±/tŠ6£?Ž‹6øˆ<à´SÐÃAP>yÐEQ7vS ÃÊ[G?tø±oaa>M?|;=ð†cÍæ›oݹX“Ž|¥âxKžRžþñô‡Í·ßx;=ó‘ëiþ‹8@žè/ÇŒ~Ç c£ ¼Ñ•ëÊÓ†y¥ þ´@ƒ»/Òä™;éeo;™9ü¢GrõÑJpÐø÷Óažr£;G<~;=·ïZšÿtÎÛMAÍ^oþ±îì»™îóÁtïKO¤Ã‡—ç‡ñFüÕ¡yáùɹÙÍ—åÜØs%ÿŽ;çFžá­¹qwsãöž[ù›ý‰æ© ¶Ü0~1¦mø ùãüÍ:Õ]?Xãî\L?’×¾'NjÜÝ<¸•9=óš‰ôðN67k¹!ãúêzÛwiƒÆ_þ­†µw'ËoFlúù˾úµC¿ù7Êý룻 GÙ[뉃s©²îù¬ »;šÙð ùÆ?™×Ë€êDéÔÁ…èæbž…Ø ú†÷‘ü{ôÉËéâÇó¢}½³quƒJ{üK=6{\ä²1£/zi£?ÚÄ]øé_ôâ@ üëè£àTdè6í¢îÆ8¶Ñ®ìÀúbì ‡¼ô>lAòðÙ/¸}Ñ·6£‡6ø9(Ê*­ïžýù[™Ç÷¤ÓKGí^È3^ui¢~piàÛ¤So“‡Ž]ôã·çu{Òù#×Òå'ó8;ßêoôÔ<èäßÐó`o~wÃãcéþWmòÀ›>ÄǸƘ6Äü!Íú ñ—¿Mæ37ÛÀ›òhJ¦¯¥‹ŸÈy6ß™Òjnlþï§ÎìÉït˜N'Îôn 2goxˆ¥uãJ]z¤ÁO‘Ö© 6ÄyÃy2åo÷O]Mþ2ÏQ3€Öܸ;¹1yroÎéäÙÎâÜAìÍó€8K_OüÕëºFróG]ã.§óŸÈOó¯×žøL9·ó:‚XîŸÎyðº©üôϱæ:‚Ÿ[pû†oñGÏVs̾‹têàBøä—œb›tå„‘\>pÊ(Ëw,îg9þ²>ÊþÐVmÄ3Òô’mÒ©ƒ á“\>pŠmÒ•“ÞáÚ¼Oûµû•í‰4ù¥YßÉòŽq-ùÔµ9k_[i®Žqælþýº¥|ãŸôÕ`”È_¶YÊK 1˜ zp#6£_M?#ÝÈßòÞοÇóâŽÒÎbå…4ÚM"ô±ˆY·Ý´r,‚Ðà‡6dÙ|BC/4쎋&rðáhÚè]ÔiCN[¡ƒËƒ>hÔÅõ 4ô¡ƒ‚ Ú./²úà]ÈÀG:}¸¹P#¸‡Ÿ)ú±©ä?i²ͺ¾ˆ+'´>Íkr’b®L»š.}v!Í=“¿ÑïÝ8ª¹Ñ™[ð…\ÞÈü¾C‹éøËÇÓÉ{¹/äéËþèÓøS¬ #­a(>"_ä-éôÙÌaÞ þ“GòúñÙ¹&7nÏÖõÃ9ÿÅX #7ö̹ñ²±tòáéfÞ(¿Ùï—e,c ”mÖ…1'ÀÍækŠëÄþ‰«éÊó³éúgóWòö=uýÀ?øqØyÆn¦#ìK§_‘ÿ1áØÑæ›}殇ˆGÌm¶•gÚ­ #­M~3h±ïRÙf]¸š½‘/òFzÄ·cÿ¥Í©“KÛÝ[mÿFü_Ê2–­Ïvï¿ôéJõýùÇâu±õ›+÷¹üöXx¥ÿF ŽöŒ¶Eý‘?› kj6““×Óõû®§™‹ù…]çóßç]É'yþFoa1?ö}«÷rÈr kŸnÚ¬sÁÃ…!ÅÍuä¸èÁ >úGu6ËÒ€,bØ+Î{8ÐÇøÐ t¬ðYÇúAžM%ö ‡ ô (ºzàA7ò”Øüü€}Ønß{÷fÿå þØôí4~(óøtøl~ útç·–|#Ãá&O6JǶH²^BÚ¥ÉÛF“ÇñÃcl°eêÐlšyÉLºúÜbš¿u^Ï7*ÇÒüB~ú!?Ö/°_ph7zk´åAößž|3*¿Ôz|*çÁ±›éèù]ù lòÉ/Ôˆqѧ+ÅÏ8 ÛxÛhò—0òÒ?±rgrãàTžžIן_H7^ÈçÛµœï äF~G~  æÆZ爥ÜÈ÷VÆrnŒ^L‡ïËßœë¼|ü 7ð}¼'GVб´ÈWÖ¥ ixÉO~9ȇx“ûX?fÌÕv>oü_È?]˹ÁúQsc½ë‡¹‘× ÉNnLŸK‡OêÎÌäþç<5>ÆXÆÔz ÛxÛhÊÑó•}ƒcËääLš=•×ËsiæùÛiáRç:¢Éƒ¼ŒÖ9bsDÊëÇ|ód2ß œZÌOþŒ¥#g§rt®!˜'¸¾aÎv !>+ÅÏ8 ÛxÛhðßÍ¢}%l³­VÊYoãm£É_Â6Þ6Z)g½·& Ûx¡mv)í°N¿׎’f½„;U^?l,ýh}§ú3Ž/ŽQº0¶mÔ÷Ì«þ’¶_i6ü7ó2–›7;›ÇHw0BäœØKò”í\°)u³æ¢Í‚ÁÄÜ‘¹4ï|³éfqæ÷aè¢Ü¾Í7¸z©—vû,qêÛ…jïóNþk!õ.ç™k˜:´ÎÛû;| PÃ;ó}äá¸úï|ÜRGoO~®E¾?mvähïÙ‡-øvlì@³saÄÁ<¾æ‚™e„ö¡? KB‹íÔ-òÄvi@캱ÃVpr€ã0yobp„< g8ÐgØ—PýÔ#^¶·µ-—éÝtQ¶Ó~£é¿#o¤uò §7ÿö9-޽§?æ¯çb/~™˜cZг©MwÞâä>;ö¡Cž=y³ßɃý‰=‡yÀE²jôdþôä;n=û{º¡•c„FY¯¼ú€ØMžbvb7—‡ßH æ—úåÜàÆ—7¹è3Ïùˆ>ÆšNÑ&¡ta¤G|y{/Ò;p®;æ”büzsDGg{n ãÎk]Þ¹óâ9B›„½þ;sD¤GœÜ`Ž€æy‡É êcc'h˜Ì!4â`^Dyú7^=[:˜ýÇviµÊÃOÿ®æ6’'ÌGŽÌ§¹ûçºë‡¹¬óFìº%Ò#^¶·µÁ³³ÖÎSlyy¢Y;ô³¹Á9éúãÜñÅòo•#-ú¯”ƒ"Ol—4]?¨ƒ3¯ñO4Óù/ûN/4yÀá‚>Î-戲¨zÄå“&”.ìÑÛçççß讎_1G;kHçÂ<ˆkyÐáïÜ”ÓÐ,Ò„Ðc»|@yb»´È·™¸ý é+Úû–'¶Kîùè“aãúQ¸ü¹Ñ|v ¢>ã ¬ñX}~ˆþïÊxQ߈ÿ¢|ì[In.*Ì.Ö”R6Òÿn’׿@âîA?9ð}¿¢ÏáÓwñ?²ƒÈÇþÀÉ_löb“‹÷xhg9éês ±^ÊÄúN•7æÎæPš<øCáëÑWmxé¿aÈG{´»É æ¸Ác-)ËFìG×N—7¶ÆˆoÍ |.ŸzY6#þú?ö‹ØÅ<ÁÜàu„9€œG”-mŽõÒ~Úì?òõÃw‚¼q׿±M_ £/ÊñS߈ÿÔû6û†½ïv’v,ÐWã±þõw3âuÖócmóYôÝ 8s¬å6¿]íSš ?“s,ccËë±mÜ“OÈ$.,u”tå„ †Å>yY°i—HEšý(#”.”¾å³Éâ¬/õ~’Vú–6ýN‘Gh»°ÃÕû,éÊ i§˜àÄŸ¼•‡ 6ù¤ÁGQ¿°Cí}JßÍòxÃøƒã ýŸê'Úc)éú_h»0Ê‚—tå„¶ Ky탎 |æ†:œ?¬Gꪣ_ûn•Ç7úHÑ_Òõ™>FÿJ“W=‘..ܨ<öuÕõ£}¤èw9b{Ùþ…ÇšºÄ‘S´XJº}mFY𒮜vJÌã¤嬫_(](Ý~v«<þå`üø"øJ?é7aI×BÛ…Ê Kºr¶o6´?¡öËþKºrBÛ…;M¾ϰëúQ¨…e%]9¡íÂ&_ŽgØuý(Ô²¿’®œÐváN“/Ç3Hw—Yæç{?•&lV;îÌDz¼ý•þ‘§Ä †‰m1(´Çº|Ê ¥åR\´#oĦ𡼤².½,ùËz?9é%Y—¯,ùËz?9é%¬ƒÇBÝCzäÇϱ.þJFþaÈ{AnôÙg¤Óf‰ýC+ëòõƒ%Yï''½ä/ëòõƒ%Yï''½ä/ëðA‹Å:0ò#~QŸ}C¡t`ä_­ù•‰üä‡ímý4-격¬KïKþ²ÞONzÉ_ÖåëKþ²ÞON:ü±x#%Òõ§0òÇþb<"rÂØ6,yí­ëÇÚ7þ'.mu㥅%ÿVÆ[è?®Ô͹Hw<¥ýmõÈÛ†·ùË>ÛøKÚv‘1sm´ŸqǺcÕBéÀÈ¿ù¨k˜8¶l†½ïvf¢®Þ¦O¿ ’òÖxܽxܺÝ{Jq~!¾ûeyT› ?w¹cbìß¿üÀr‘•k]ê‘æ7-´GzäD^{#ï :éÓiþK»MžñF? +~¥_×ù¥õhkm·ÅDŸ¬uüðGùQŠ´«Œ5óBœÌ“µŽ£þÛ‰òúu%ÿÇxD¾QÉÆíŠö:¾6ZÍŸÕ×OýÄ_ÑÏ£mt^°mm£Õø¯ÿxþluüáfÁ2_¶z¼Û­ÿaÅÅœ«ñØØþkXñ ”»ÖUËÂBï%îÒ„Ýÿã&|~ƒ ,.Í - NÜö*¿ü„ÑOú§ú¯ãýRó§ž?uþ¨ó§óc]?êúѶ&˜uýÜÙë§ñÝLX×›õ­7›“шG¿µ—¸—1ªóñò'îôÝZÏ‘¥û+Øí–w©¯»áß··÷»ýýÅ#þ2÷ƒ1hÑ`q!òâBdÛèƒÒª|õß ¹ÒÆWó§æO[^ J«ùSógÐ\iã«ùSó§-/¥ÕüéŸ?øp3 >÷úUH?âÂ6Z×ò'ï†}.ló}­Æcsâa\k@Ý‚ÎR¯õЯòTÿÕüñ|‰çxyÎÈWÏ¿:ÿÄ\1/"­æO=êüÑ~³¸ÎŸ;cþä‚™³õz·wÓKÿ®åzÕØÄóM=k…ÆQßZìqÜòøÛ fÿZã?òÄ‚#–Áö3æ³1‰>\ ?0q Û<==ÝÅK¤™ù[¾ÇuÛúÿ_—i !°L€ü:Ũ r]r>^"­Ê/O’6¿H«þ«ùSϟΛJ='êüQçsùQ<æ…´:Öù³ÎŸ;cþôšÔ çö°Šºëõîúæ üÇ~ƒ Í0 zˆ:;o'wNó<}µÑ¥Ñ¾Ï}·Ö &þj+nø÷ïߟŸïì#õqÇê×cÎ/k=?ö…óé@ö}¿Ò=ëN:ÙåYX:qº„ #¸M€ ."qÂô¨®¤Çz•ïÜ1Ã_Ñ/Õ=”~‰õš?5ÈJÌ‹^ö¼˜ùjþÔü©ùSÏŸ:¼xžtóeé§­˜?ù҉߳sSéXõzwù£ü1þ«Å^ö ÆÆ¹5úw-8òÄ}uÿÑñÜZãá¹ÂFsÅx8p ¹²{è?ò—õÕò«ä/ë£.ÏØ~\Ëù±¸Ø{²ýJó~9Üå¹9à†ƒH‚{0ÿ†àâÅ‹ Ž¢2pÐàtð’%òu(U¾ôUõ_ÍŸ2'|8]¿~½ù-Û]xã Ë:mÒ„ÑŽ’VÖ«|õŸ9!¬ùÓó@铲^ÏŸzþ˜Â^ö¼ø ‰’§æOÍsBXó§çÒ'e½ž?;ø†ŒkP6•|K†‡YÐÇQ¯w;^]K¾òíþ‰'š}‚ß`n46Ä‚ ¿LbõêÕæ§ÅÄûb?ÒÊúZƃÞí,o<†y®àâËÍ„C‡5ñ˜››kêÑ÷mþÛÎþlÏZò©Œy½–7ü³³ýo²tµÎ†;1ƒnø$&qŽ9ÒW®\Yvbixð²Ÿ4¡²±MÚJ<+µUùŽVòÑJmÕÕx`¥Y©­æOÍŸš?õüYiŽX©­Îuþ(çùùùf³Ï&ƒÍ_8±vqCS¯w—çàJç+>¾íݬ›1n0ÑìØ±æKG_Àã_ÚXÖá•&܉ò|L<ÛW¤ûH?CY¸Cº–ÂI‡ÑÃú.\¸ÐÔNi;Ñumâôym‹4mTFé‘×¶H“¯Êw}ÒGú%úʶH“¯ú¯ú\0GÌ‹˜+¶Eš|5jþÔü©çs„óBœ+l‹4ùêü±{çÞÅõêÉ“'›§K7óÛ}ó­^ï–oüžžßéÓ§›Ø óñqcdNà[eôÇo”ÙPgoRç=Íïéñ“ç þÚŒ'a8?Ð˹ÈSì9ˆ‡7j<ö$n†áÏüE®â»µ×@ä.åoøyÂ…8”eßæñõÉô šöG_ùòtï½g|Œ¦ÐÁ†Æ£ ÜiƒÆ@j©¨¨¨¨¨¨¨¨X¯øB‰o Ù@œ9s¦ù}¸›‰ÍØÄD;ëõnôÆ‹qbÃoéÙPWæÛdbÓ¶y±–Á)Æèþˆüs›!n<ìÖÂø9Wx »Œ‡7C†íba<ˆ…1¿|ùr³/$vsá|r2ƃø¬wîúÔ§?“ž;÷|×¥oþ’7´æ|ë.œ; k-£¹«C!™,' öXHFOØ~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xä/ñ~2‘^ÊÄzäë‡Gþï'é¥L¬G¾~xägÇÅ2×›¼Žo+ù×Í>t¯'£Ü°ñz½Ûy^_;®ó)Ä„Øðį×ý›±Ù7®1ÒèMû矾ù47!bé—s‘ùK<òõÃK™Xï'é‘¿Ä#_‰ÃëKÔ‰ƒñàæËF6—¥ muòÿ³ÿãܤNŒˆßôž§-–r 1¿Ä#‰º×’lؤ°qᙃëI7/^,oä‚y=žÛÍ×»Œ¿sp­ïæÅøðòD¿Ô#.w#61ä }’;|«ïþƒ=ˆû6œÜ´p³¼ž™ÆÎx=O€[|cÜÙb‡ùÎÀîoä‰#6ܨ`³Î± ñ`쌗xxs’q{x~ ãfØþìßX–¶â‘ÔàÝýâboÃçöúÍ@=ñ(æ¤crfR °lö½+È ·ü"ÏVBõ@õ@õ@õ@õ@õ@õ@õÀš<à3Ãl¸†ä™Íוй¨æðšsM y7^ï:æ26Ä‡ÃØ¸‘¹›±Ñ6BKÎh#ûž>pÿÁ„o_wÂþÃ13V7˜Ä€s…xà}±çŠ}z®z.sS"ƃ=¡7`¶û†ß±æ)âáMÏÚˆ¼-ãÅSùìçé·,Ý ÿBN~ËüXÈF ƒ hÈ sw÷6–ÁÝîAިϪ|õ@õ@õ@õ@õ@õ@õÀnö@Üĸ‘ᙃ:‡<À­.»ézW¿3æ6£›lÂ66¿î?Øìó;~òg;ï?oÏÛŒÛVœ+±oìÁ6âÁ&Ø/ì }â{;Çÿ2FÆìùÀx½éÍvx†QƳþXææó—ìËßWA{—k>lòçó–aƒ d€ ”AL+¤¯íàaø«ê¨¨¨¨¨¨¨Ø­ð"¸¼~ô:¿Ø6J>Ò&íܩ׻Žßs]7/¶·ºh { p6]lüÝwµs»îA'ãåxh›9?ˆßx  |ÛµÏ ¡tà0 úc[í7üñ[ýaÿ¦ÅAb'•P#˺ô «ªªªªªªªv‡â±¸pÔ=°Ó¯wË8XŽZ|b<´±m¿ÑFµ±´Ùã˜l³.”>J0nPÁKß—õQ²}[JßS/iƒè”'îÙ¹±uèÐò?POó ?̳³7¤¥‰|Çe³ŠƒnV?Uoõ@õ@õ@õ@õ@õ@õ@õ@õÀVxÀë\áVØPûìyÀ8{-Û*‹yŸŸ¦XÆÇ»îKêÂæ9€òþÉɉ.CEªªªªªªªªªªªªªªFÇ·ò—ö–¹¹yÑÁfÃïÀÁËj©¨¨¨¨¨¨¨¨¨¨¨¨¨=ì ïàçý~ÑløËÿðKëÿW¾ÑóDµ¨z z z z z z z z z z z z z`y`²x#¿ŸHt6üùÍùñ% üb-ÕÕÕÕÕÕÕÕÕÕÕÕÕÕ£çé©ö—ô•–6~ˆ““½ÿì»u»÷€R Ö«ªªªªªªªªªªªªª¶ÎìïvÎßö+Ý ïÇ_éÕÕÕÕÕÕÕÕÕÕÕÕÕÕ[è}ûº[ùe_Þ—&u¹â3ÿ“›÷·|¥µ^=P=P=P=P=P=P=P=P=P=P=P=P=P=0¸â›ùÇÆø†ÿNx­ÿJ nB嬨¨¨¨¨¨¨¨¨¨¨¨¨¶.^¼ÔUyýúÌÊoé‡sÙÿøÍ÷ÿ¿®ÖŠTTTTTTTTTTTTTTÜu\¾r¥ÛçÍ›7ÓsÝzDºôߺÕ{QßåË—#OÅ«ªªªªªªªªªªªªªFÄ7o.³ävxb?6t7üQàò•«‘§âÕÕÕÕÕÕÕÕÕÕÕÕÕÕ#â={÷,³$¾“/6t7ü‹ù1ËÂü‚h…ÕÕÕÕÕÕÕÕÕÕÕÕÕÕ#ä–¿h¢Ï‹÷› ?_ÿÇGú'NŽÐPª)ÕÕÕÕÕÕÕÕÕÕÕÕÕÕz`zjJ4íß?žú½x ®Åâùÿɉ‰®pEªªªªªªª¶ÂwîÜÙŠnkŸ#ì~¬ŽšÉ5wG-"Õžê­õÀfÌ]ñþ©ƒ½Í9ÒfÃëvï…}0Äÿô+ÖZ¯ÞZ=Vù«ªªªªîŽ6ãd˜–{ ¦þªk{x€<5W…£n¹ùZswÔ#Uí«Ø<löÜ÷ðSÓû¤Ùð—oô››o¥_-«48ÙÅÉo‘Ú\=P=P=P=P=P=0dxñ!²ú¡¨ãš„ãÒÌ\ú½¿z.ýéç.¤O>{9=}y&ÝÞ³/ÝÎ_úïÝ»·¹àõüÍ«‹òÆgîäúøøxFî¤[ù¸¹¸˜öæ¶…ü¾¢û÷we¡íÙ—uæ*òZÝø‡Ÿ:NNNæ/AæÝ{ÇÆÒ­,ïµÌÂÂBÓ‡P"¾˜ûR‡,Ë66fø|þûcúF'¶ZàÝ—ûÏLüæòNæÙ³4†f,Ù&ìÛŸÇÀxoæ:2{°9C4¡c}"»ds´Á16¶.õ‡ 3nÇO±8FÚ8àŶñ¥q1ÞÌ‹-Í3¢›1Þ̶ЎÍÊ£¿B=Œ‚ }Ó/Çþ}{Ò¡ûÒƒ'¦Óë8‘¾ô¥§Ó›>Ù´É׎ÀG3ö<â|3_GŸûàûÓ ñ¡tå©'Ó•Ï}&çèÜÉcf\òb6>¡0 u|EAWãÇ,C¾ñmž²ðãÇ&™‚nèøv*?ê{ãÆ†Nì¡!K;9MÆ&Îú@tpøÍxi·¬#Òiƒ×þ#}1Ú°“:cÐFí¡/º©k³}ÁÇ¡}ôÃn!íÖ¡! ]ú ÝŒ—¾Ð4ǡϑ¡}"?ù¬ÛäEŸ¼¶±U^ ºüÚÁø¢ÈF›šù1ók#mчØ HAšý#ƒnô 3êÐVùäÅFu<ÔåC¯v«;´]›´ytQ7Oµyt#tô€Û‡ýû­9câpÜ@ôPàW:´¦-ëÞ7y0í;v2å«Òé7¾%yâËÓØÄdã,2)‹ {–úsüôÕ½àÍhø:º"D†:E@ã຅¾´ š}C£®~ôzÐmÔé—¢ Ðc¡.?¾pLôN?ã޽Æ[}耗>‰u}¡zá·ÀgßêAo´½ØD‘‡úôôt÷&ú9Єð›ÓÔ9èCŸ)ƒtë´S¨‹c,ú€¾»zèƈ öØ¿º¹!+ýð­ì[û‘už„—¹øÆÅ iüÚÕtþ™Ï§góœ°gÿtöë¾!½âßžž:ÝŒ¹”øÒýƒ+¼ƒoßæ‚aø£vû{ÙKI>p·¾GàPðçÏ|4ýÀïþpúß>ø“éÏÎ}4=7{>Í.ÞÈ‹rï‚^ŠràØC1©q°Å`á eÔ‘£_ø© ¡ÉO?$2Йô£Ý“唵?ôšdÈRÆ{Ñ,ýÒ.¤:zèG:~tB—Hÿò5 K4qÇEݱÃoÑfƉ.øá£”ct¬BÇ /:ˆÆÔfèè¦Û°%Ú…Çu ‹ ›é›¾À‘W<è‘=ðAC9'êÒáãä¤N¡=ò Ç =Ñí@.Êk#w×á¡áA·rÆvü„nx ƒÛŽ Å>¢½MÃÒíô­ý¶Å>Õ…ìà /íÓFeäÇÇû†œþ´ =ê"kŽPç@ç=Œ“øÐŽœñ²_xéÇ|Ò>hÚ¿4lƒ^l£ ½Ü©‡_tSè›y rÇi[”Ån cE^ üô ]Y uÇ ¿r@}ý0pèu¾ªóyc.‘/æ’9´Ò|•WštáÆ¥ô‰>™~ëÓ¿—~åÉßLyVKž|YÞlöÖ0ó÷nAs}n~1ýËßþXú'¿þ±ôé ³ùÉó%FäüçhÆšÇÌyÑœuÿ?{w¼_vtþ¦»ÓÝYzɾ@„$B$‰A ਠRêÈX35:Ni)å c•8Ž¥SC:LQ¢ÔL‰ãŠË8ˆã "YLX²A6²ï[oIïkzžÏyßïïó·;é&ÿŽ¼Ï¿ÎïœóìÏs–÷ž{ïûþkÏŠ…³b=ÕnMÑ»h³ö’–=M^OÖ§ïL¯5ÖÁùÈg½¹°tŒî1¾žj/ÆÑ!Ïíy[t¸y í&At7!Þöö—/ê)ôé:ú¾Æ›Üø#¶µß ,åÌ:ðO= ëf…þ~ïYv'g2ûò6µøÜDÐç_5ŸÁòóƒ>}b]ø‘-¦å }ù>̫ݸċN¯ òˆké?ÊÉ͂黱pÇ=÷n¯|ûG¶{õ»¶§^uùö…ô"Ó·ò“¢Ï@ÍO¹âó[þï¼½î{ÿâö±7þòvÑ\çƒZ ^°÷3œ¼ìÇ ŸÏ-rh€\y$wþg'Ú>xÈÃíð|ÅA^[>wéjŽòƒ|%|ºè(F¶ÓG‡vŸí{>üðjúð¡+ìè§_Ÿ®üSv²±˜çždáÐéÄŸÞìàj¸Úä÷¼è ?÷±Ó¹×E&@ÃË>³å:”Œ~qáÛö“Iw>íýCó6Gþàø´ÙAïújŸßøð6Þ{ùrVd/ /¸óöÛ¶[ßñ–í=?ù¯¶{Ç÷«¿øË‰lºâ} õûÞ÷þíïzÏbÿ‚/xÚöô/ü‚û]~μú5¯[IÅõUÏûÊíñÜ} ÜR€Š$øJÀßxåÿ±}ï¿ÿí#·_w–äxÔ%îü¤ÑŽ_ /Ф(¤‡Üió;l§Íï´ùY36±_Ï›Ÿõl3üµ–õóÝúßÓ¬q1µ‘ê·7Àµ/,¡ùch?‰O­Àï÷¸>$Ôñ©ñ)éÚoÌáØ>íW§‹5óÁ<ØÏc8óÖ\æÏ¾öãbíöß¹½ü}¿¸ýÂû_³}õS¿j»ü’Ë—oûù½~ÿȃ}àC7Ü´ýÙú‹ÛKß~Ýáð:9š$IÖ: ®á´¢{¢-›=UvÀµ×é“)ßë5õ—ežÚ°×ANpÆIÉ'5»w»Áãí€ËoxjÏ6^t‡r°xã¾^µ§wð.ºù‡_™?gýžÚó…ÿJ7–ÌèhŸ¹kôx:·x—–|£Ï^%§ ˜šsžá]¯û>ÀßäŠ~~ÑA7»Åç­z•û—N¼Ïž·œ“lfNY1ÛrÔÍ‘½¿dðVó‰ƒ\ñ‰ ý–¹AôÓoüàví·Ì«þOX<Ù\<ÄäI<·ß|Óöê9èð'læßáÊ4:ß`_Èw}ôb4w~yT¯Ø'VO˜ñWâUÃ5ÎÚk|¦&«ZŒ,@IDAT–^y˧ó?¯ôÓK†} Mïš»ÓÏu°ÖÞøGN)65ìÚéáW±ñ)Ú{»ðäA6Ê#\42ô±×u}ùÄf¹Á‡.µ>>üé¥'\~©ãa4vùŠNV)Çé“<\~Àñ#:»|Åö:k/ÞbaN²jòÅGŽŒü“Á[ ù‡G!¯Îtq’ ös/um>hÓ›ßÑÉñ§=_µ¼xàÓS;¹xŠ+?Ë< ÞäôóŽ^þÂÅoxº÷8gÐrÀ] ¿b¹gÆàÚW½r»q¾îó¸çõÚCñçWúHýák®ÝÞþöw.Ö'>ñ Û=ó÷)¶ü(¯~íëfC¹c1½è…Ïß®¸âpÇô>¥ÎC Vøu7]¿}׿ûžígÞû²³ÉTx<*J`É@/A- ý¢š<þÓæwÚüÌæ‹ÚÜh.ž6¿ÃZ’ëLn~=o~|ËWciýÛOc4<Ö¾XÚÚ;ðµŸìç><ÝlßiAËFyÒlâS@ú³‰ŽWÿ´_ÆO.ä/¥|Ê‘vyÄ­½½œZ¿€>8tó¡WýÖ¸Z_cC¯.¿Ôñ4®]¾¢'Ï×út5ù†'?ðð#:Þæoq¤3}ìãSŠ…½bU“)>rdŠ‹µßzíö3ïzÙöü'~ÅöØG^}?ßJ(OûßñO_µ½{žêË¡§¸âß|ñ:8÷„>¿ô;ä;tâ[ã?eÐd<ÈiÈ£\;´¢'³ðC¢C8«½Æß[ô’AgËŽ×aÅ0þ¯Ãºý—áaœb<Õ·§ÜÍ'¶áéâ V|tãÛëE'ÇoÀ_% ¿›øu°b!3¸b„§åŒ?óeÚææº`¬†ž­5v»X×Íãx.ŸȶµBVèË<ù^ l¯¼ˆmú¯ÿ ë7¾îYO<ÜŸòP‚±ãÓm7~l{Íÿôç¶ßøºå‹_­à{~›¾\¢;šüèƒr¥öyF¯v2ÚÆ˜'{[tÃ){›é&³Ævlæ?¾dÐáéLovͲéÎ2Å®½žü —ŒöÞþ^N|â(OùA§qXshxðíó‚°O§6=úÅ•­ÆŽ\%ž€,`~¯/>5xØ!³÷#:|±‡K7y4>¤—.P??éF« ÇÆ¢NrÑÉhóÀŃŸ|¹È§xÑ@ù@ׯ>øÆ¿>{û‡Þ¿]÷Ú_ÚžðÛ¾~»è8'ùó`ÀyøõoxÓñ›3_þeϾOñ³ÿK_öŠu·×W=ï¹ó]Œûÿiÿó55·Üvëöæ°ÿË׿é,±‚l‚¨|:È•\}A–Ô5yx¯>HN}ÚüÎmÂrcò·(äG‘W¹+¿ûMG{¿Yá‘o“¶±ƒ«„Ã4ìÂïõŧ¦_ÈìýˆÏvcOÓίô6'êçg‹=]ñ°¡è㣓\ôø³É>\<øÉ—‹|Bh | k7ÿÑéƒ?m~‡5^οöc¢mœŸÚúò äÈ«vsšL:âoŽ“‹§5ÐÜÖßÏmºo¹ëÖí%ï~Åö_ðâí‘ó]ºÓOß…¾ñ÷–ÛnŸ'û¿´½íÃ7ž³7¶ùT>¬/=«© ›à$ñphç«>8úM¿ƒ&=pž^‹yåqØp·w‰uˆ>€¶nLí©»¾iºèpƒ\m|VññYþÖÛ Íw Oc‘íõ„Û^D1;ú@~Ù#›í±»žâùW|C#‹‡n9k˜+ò„ަæ­ÑãWã[}fsdÖo ¯·È-/ò˜LãQ®W~ñ²Ëo~‰Eûˆu‹¶ÆhøŒmOúùÖÛâ<ò.ù‰4/±½ï£·oï»öcÛ‹óá{±lç㺀ؕã;ç‘×|Ï_Ø®ýåW3üi­ƒ5ƒoÍ•qì}Ìgt´•ˉƒœÒ|`£ù£Mÿ^YÐ<@KW9 :ðÍýüè;Íø²­M_ón?ÉÓµ·CWúÔÑÔtÐå@¤“:[ù˜Ÿì¡ãó¹Šèå=<›{Ùò“OÙÈ.ÝbQ£ÁƒlêÃóÐ]M7¾Jytíƒ,èJ'9eoÃôïõÐ šh预ӯ‡Î|›—>]h§Íï´ù™;æBóÛÜ9m~Ÿþæ×Ún W[{­e¹Þç¿u,ÿÆÃ¸ÀÑ¥níkÓ—N}›/þ ñdË^rÚ¯¹)ÿr¥-‡Új9“Ëûún<ð¥ü«É.ÖZr!_}sWžÊ9Còbíæ;oÙÞ|ÝÛ¶oú¯[cÛø¶6.d-¾ÿŸzýzßoÍ‹c\¢£õçèà¹.Ï·ŸS“áãzb=üøÌ/È!œÓ7ùkž²ËÖÈ›wôhlí ÿÀÂM½ü0ï§ípj¯üÄËU††‡/h|]7o%‘¥güdñóÍ“x_èkkÿz>ód^-Wt:Vlƒ__[˜¾ ЕÃióK›¾5_WK×Ж}úغ2\2ÚSøàÐí·zc€mº:ŸØ >®9ËæÐÙ 7|ú½m~ñu“gä–ÿÃËÅ3ֈѷüßÐßqýmÛ•3,Ï~êc–~z” ìðCõG~xûð¿ý‰³=­¨sF>Ö¼8úX,­ëýçËž·üäãÛkîFË^uyªo®†c¿ëtøü«æš>{j¶ò!¾tÂÃíãEK] èÂð”çræ.Цà“ó½Íôf?ýr› þøÄ]ôÚè|Ê_´tÂÓQühÚdðd3||häØÀ“ßøÄ›Žèêøù)Vy(7èdÀ¾^6ð¦Ÿxëü1oä-=ùŒ7¾ì¨én¾’þ>ÜÞ?´tðQ}ïŸ><º6Ú|Ðnf?_¼úht Ãë«å²<ÒŽØ@+wÙÌ<ÚJúàðë§—À×€.o°Çÿ½rÝúºóšÏØ{·«¿ô+Îb"ÿ@àún8{Âoÿÿê½à,G{ù³ÿK_þŠ3üoþ¢gn{ÜcÏú÷׬$HæËÞùóÛýÊ?X¬û)y%Mð%¼ºÉTòðíyÓSLÉ¢û´ù&·›ò*7r ä³I«oÂá j“‘güÚ ðt¨›àÚø“dàãC#—_Ú1OGtuüür/Yz—Á­§üÓ'»n2 ¯Ã®›å=Õ&s¶w}\{ÇàÑzºGAËv‡ûuóat®ÃïøÖ|rƒ€ŒXñö&ÜŠuj6f“[o@ˆmáÄ5e’´|¥SŽå àSØTóÓ5Õâ>5êôží»Ã»`d½ÑM6ĆïìæÄØc“.#J²|’5è•Æ}åž_ÃCN{Ýpýk Ö¹×½ï£Û7>ëñÛ¸ìLß.°)G׿ëÛ[~௎Oç÷hçÏÝ5c],ÀþN^É )+σ+]ß®¹;x€‡drþôù–z•ý#{Ùd‡/ œüiÓ^½çËnãŒÆ?<ðì%_<ð€¿µõÑᙚB_2ùÇ&@K¿¶B_2äâM¿~~Xlð¾B¿qKÙbÅSŸ?áñò+ù“n8}Àv>j‡CÇ—_ùˆžoì<é˶´óAäð%—?ä³mŽÁãÃhïùè _ ØJ?9ºÓŸ¯l ©éb/¾½_{ýd÷PÌá[ƒùU Å/ðå#^zÍçxù‚–olð TÓ³—'{þš€Ã³Ÿ.øôÜô–7n}Ñ‹·Ë¯ºzáñ?¸öÚë·7¾éÍg¬_úì/ž¯þ¼3ä4îóÀïúŸò”'ïùî³Íq‰½å–[¶ï~åߨ>z×gÎKŽ J|A@#Ùá$ š¢¯Hˆb¡Ÿ6¿Óæg~˜ æUs©eîæ¶9ÖœÔ>m~‡5Un~=n~| ŒYã­m_1¾Æ´7àkGkÏHÀ§ 77NûÕa=ÉKbÚÖ™kùª­Þº“ç Yôör4<ûñ@K¿¶B_2ô§dÕÚébíð¹)ÏÀ<–Ÿò·óG®¬›øä¸±ˆÇ8¼åº·oà7óZGçÓãûµÖü⃧yßÿÿ½iûÀMw½ÃÜ8´]v¼.௃!|m¾wXô¤~ÊÇÒõßÊÑ16ÌÂ5cŽyÈnòjùYÿ…ßÔâ#‡ÃèQÇ%ǧ¨çë*v:ûÍ:üO>县lväUÜ|ÓÏ?z·ü>*%Ë_Ö[ãËòMLƒó[ýŽß:X7,†‡ÜÒÍ®þØÂ¿öI:¦M?׸ãž}^£ÁU’£¿²ÝÃ#çù+Ò^ï_:ÇÖ cbåp uŽÚx«Wþ†×›ë‡éŸ>ŸÙ¯KçB\M¶\âÕŽgîl·Þqçö¢g<~Ź÷…Ÿ4fž¢½ùïþàv÷üW[F”+º]Ÿò9ܾÍO1ñUèx»†ÓW+åÀš^¹>æ~¿GÒà ·ŽL@Ú;Ñø··'Føü¡ƒÿh ` _;ŸàÙJGö“ _?úÚj2bަVà÷´ðÉFWÃ)­S~é·g’ÕrÂ/}²Í]4¸J¶ÅÙäÐÍ º@¹a³qEk<åìcÓǃVj…Ž|Á—~òÚxÈê¼Í8%óYŸ?õ“ËOzÉáÑVƒìèצ+¹|&} eéÊföÕtE×&_;æ"|µ6]ì¨ó±|d]‡“OºÕžÍ½ŽóÛäñmóöÞO>ííã[2³¯Üú±¶'þÖŸåýSÁ‡?ü‘íÍ¿úÖ3¶gÍCûÇ<æê³~5B íáÎqôSÅä{Íûe{ÇÍïYIö!ÎyÀQ? Øl¨Ñ Ñ|‹$Z“¥DïåàèTãg§ Prð‡Çk£Ùû/_ñóÁÝP5}Jmtò&Òzenúl7ÀòÀ¿ùEw“Ÿv±å›Ü„ßÇ“[ôë«ÓKÈíxðÁó›ü>F|ùE?ðÃñ›L6ŠŸÂntöð7NñeŸíx´ñò`?üÍ/:ó¹øÍ)8öѺÚË;Ú>.<éÏt@g´½ÿå7_ñ +>éb»ü“ÕβÚÙ"¯Ÿ\9'—<øÙQò[>ö±±“þ½]8rñ«Ó©Î~üJ>,äüa ®¹€'¿Š©q$—nu9Ó6†åžx³ÉV9…Ó—›|ÈÞ^zÊ=ÐÉÀ:郴áäå´_³r&7Új¥±9íW‡Ï±Ö}¶îW7ÜsãöŠ÷üÒö ÏzñÙºmý|ºµù$‡¼îcÛ+ÞuÃ{ ½——Ìšmí[¿‘~h®§Å™ñÚ—Nõðz îoÅ·GØ?†iÉ™Ót©í›Ît(³YØ8V¡»}‰0¾‹†gt§¿SÀ“j{\z\¦‰‡sníƒôôôÕžÔ3«Eáãq¿Á¥‡~¹ßz‚áù8Ó\‡æÑ»~¹_¼G<6ñ~|®Q’m\±ŒŒò•ÌúšÜ1gÞ(X:ÆG oëFÃø"¯â‘gþÒK'œzåsdj«×^NÑ´É­|ë,Û£_^×›ã7{:ênîˆNa_¬?ñúnÿÍ×¹& ‡wÍÑ‘ƒãG4@þê«åB¡ƒœ6~}€O,ɯ¹;}|p@{Ÿ í`åfìÈ¿vŸÝÖZãˆ7]lák-¢5®ü3wɱ©äò#_ÉÅGæ|Èg¶øÅn@<ùì©‹­œ¨ùŸŸä@úŠI_¡§\ëïeË\qä;ÒË=ô§¾©Ý^¯6~v¢Ó£¸FA“ræ žøÐø´P¾ùÄòåQ_vóž:ÐØè \70Ðð¹Ndk¯‹ ëAå^:ñð Ýê|ÐÏñ“ìô__‹+?Õé [› }lF[Jæ><9¥8Š“ ¦#]p­u~èüt'–Îl¡+úý/=·¼æç·›¯»vròÔ3ÚRöIþ”ËX.¾äܽpê•9Æþp¾Ã ®»®{®ûh—<Éyéû~~Å(|ÁHB C7°x >þÓæw.ÉåÏ$–¯& ùjѶpÔd€ÉƒGÝ$n’‘éã]¡‡ŒÉ Gg²t¸Æ ¸dbþÐC:é£+þ|S›'{½ÚøÙ‰NrÚü>·6?s¦¹`îè7×\p4ŸšóÍ92ÍAm@¶y½¹lÎö«Ãþ!¿ûõXÎá[ó+¡Ç?x•Ó~õÙµ_½ô=?¿ýö/ü­k]˜ ¬=×/yë5£ÒçÖ\ÍÞÞÁØ>[—Cõƒoë w\û|éÚ<¥s}·|x—§Ö¼ÏŸ™—£lPÕøX$g½¯ÃâðùŠ›ëboh®Ö/&Om^ãsìL¦¯ qÏ]þŽN¬#—ÞåËàÕº™²Æmh|—«cë’ñeù!þ#ЇÇMŸ}Óû·?ðÂGž] £}:Àþ™yåKÖîuàÇËîÙÜA¾[è As·±_krxÑÉëó£8èæ?úšGGÝt¼ö¿áÕÏfzÄ@G2û¼ó‹Íò”L~ãÀCG~áQà¼d@6Éïsöð8´ñq/‹Îqé…ØÇ‡®ìûÆw7>ºå»8ÈÐÊžôå—>|¾é£é³±ïÛ+áÕr´_Ì s° ÇòâÀ Ÿ :ò5ì2äááÒE’}m€'Y:É©öð™÷äè†]žœZ ø¼×O&Ðô+éç3œº6›øõ6ßö¸;g}è?·]ñ-pÙˆw ÜÏŸö”ÈW]ueÍO¨£6¨K.ÞøwÁ~÷®“ã&á[nzÇr¬$¨K.>É'¸}bs´H -aÑ%Fhï7.6Àió;m~çÏ=}óF­˜cµá›kÑôÍ·}ŸÌió;·™ZkòôPm~ökºõo,ت¯6E4¾tbœÚèùÈG®±4žíù­>íW§‹µÓÅÚ'^¬½õÆw® IrÖˆµÖz[‹îAþ±>[£.P_ýÞë×úœÅ{84[Ëc§Íž¯‹cßa·k¦ßÐþè!Cžœÿ:ÎUÂþ;÷Kîx &컆ßßÁ|ùˆiÀ“|ßó?ƒÑ·žì³5ü{öš•—á»mäW{hô€µÇŒ/³éúäòiÅ9:×|ø×Sk²ƒëÐlï“'óâoÚ×Vœ#³Þ$9—‘÷Îþ(úvǽœý/hëFËè–WñxÅ”gúzs€ðúü[o ÿê“^±È»2ë·Èý°Ç’q†Or»¿É°ÆM Æqôùê‚10Wú/ÅeœùŽO’3ÎôbÅõª÷~tûÝϽcˆð~:swÌ-;ògÌ?úú×®Ï zGµÜÂዦ†/§t­<e—ÿG™t%£æ7y4Ÿ]@[>Õ]WkG#'7{`3?ðí}€­ôÄ»· G7¼édKNìèäðï zsWÛg9¹ôuÍÇÎ~¾Òc.xÉ%èׯ›MúÒy~MO¾4§èÉìfOg úó??Å®-ǵáÙÍVãG>¹hpå1¿ÑèpÀ§— èa??ñé«á|ŽîÚù´óoþ„ëzŠ=r·÷µœÐ³§7G³Ç÷üCãZþ‘ Âщ§XÙÝ@x*ÙDÏoºµñf‡~À<»žrGwzÓIŽ q᥃ŸùAǾ¿×†ÿúù_?îø¦oYc_ìݸÁðãÊ+îûG÷×,0an› øP{ “á·|ø´ùÞ`L“À@Ê‘3‰Ðö¯ükè&O}üp‘.}4µI¥ Ȳ“<^ _¯Â&}é<¿nÒ‘Å›ÞüÈn6ñ´ÐéǯÆÏO±kŸ6¿ÃæxÚüÜægþšOÍcùknƒxÌ7Pm.šÍãæ:~íæªšLôhjxö²¯\2éJFÍ?òh}h÷aß\€jrüÝ›ùçt±v?c"í³|5N§ýêoA¾ä©ùYÛÃõÑ?tï5kžêGÛÏÉ_k›ncòîkoYOÄ/³FÇÎ:´b—nžp;À±Ï×jíüÐ׸Í:³¬5¬=Å!ÙÓw¼ë 88€g‹>Œë ½~oÚ¯cì`wxéYkÜ~Måè+Ú|d¯C2û§sÊÝ3ŸÖ!wt­ƒýØÂëšËS{¾-Ÿç ïúŠ~>Ðá0ïêlˆ½E0ü+ž¡­öQÎ×øÒ:в`½81žÑ¦-†%3mu<û¼Ó¯ Ç¿Úcón1/vY¼g®oÈ<Æž¬17vÝH€‹ŸyÂ7º–<ßø;|n8¤“$f>ð™í±ùÖùoå¯1YÊ?Í?tÙ{oyÏ;×Úà§7ÍøªÍ~ñ[<øõ«µñè—?.ůƃVÞñƒr¤†C+Oɦÿþ /ÀGä«öùºèÉŽÏ+ôÆ5£Ë=[|Àƒ¦FshU§§šm¼Šœ&ËGð@æ.»Gy!+î좳§®^Œñ³ðÈžÞbІ§3}xvå…¼¶x²­ ªù‡m² (V´ÆÒü#§Ïë|¡+Ÿk£á§‡ù£Vìç#þôàѦ èô®iò)½ÕäèÇ—>ùaמ@¿‚F/¾ìðÞZïè“W‡SÃ:ÈGkœ<ü+6ºñf_ä‹6ºÒ¯^l€=…Oì©Å®¿÷?Y9)†ê;?ðÞ•ôôá¿?ðY\=O÷‹-\õµ›çG÷,p\‚¹ù®[V- ÓæwÚüšüæƒÒbµPZDͼڠÚ$7ñO›ßo¼ÍïOùÊí=û[¶ÿåå?¸}ä¶ëÎ6+óà׺ùµ ¶‰Ùs|àîçR´ö1sÎüis6·àšwtœö«ÓÅš9pÚ¯îûbíöß~v±bÝX‡Ÿ.´þ\ ~ôÎÃÅ™®ƒœÃšƒ,pù¤…Ùž¶ïñ¯'óŽ]5v.vf§³¾×½ç±/¤k-™»æâÒ÷¿—½Á¨{}~é>ó8ŒöùõÔ}xñO2ÝÅcûÚÒë3îHðö¨©½êOÆkê gÚ|½÷xÑ(NüËË£¯xÏø#æ>/íeë&ÉÐÝHpÈ{ Ã7è9‹ëxÈwŸ·ù‰¯q^ù}ú}†·Vè¼kôÅKï²=xOøÏtN;žÛè[>MœÉ¬›<Ãò?;n„ /{§·ÖÍy:ÆK¿6 riȵ·¦¤‹þOØ—Ãɽ7Þpöô­X³Slú‚—ÇýÜ%+jŸWñÀ•ò+¾‰“íðbÇ'·t§¾ƒ>x¸ }Í]>YôÒ¬9qÔ—ßtdOMž¾dµm…,¿ú:^ñÀóÅÁYq‚øàµ³»M¾ó‰½tÇNŸgít¦/úÐùU.ôñtPœì(xÄ)OÚpx²ÉÁ“ Ÿ røÐÓ¯-´ýŠñ”ƒìᣛÎôCŒ¿ØÙÇ£]¬pn44G´ñ¤‹nöÕü¢·þ>&~$ƒ./j85›jòù àé.?ðɡÓ+_Úpù–¹‰†ž?øz÷t8°<Ùášo>…ãs~[säÛ•lãvÃuk áñ|*Øs\uÕU÷˾>5/¾èÜ ã,Àû•:ð­'±—]tøJ 8ÕFô´ù6?“Þ¢2Wš&{“»9¤ß‚2wZdè`Í¿i[P-$x2ô+§Íï ¹”/¹)Gzó{â#¿}Ã3~ûö·ñïmºåš ²ùµù6¦|7ÖÍ›6âÇ?â±Û=æéÛ¿Ï/œÙµ)ɶ?¹a@¾~ûTuºÙ:íW§ýêsq¿ºëžÃEâ~-XŸ´æì×·ß=G;^+ìö&:ÿpëµ}×Ö±kY»Ö3‚ý¸œ‹2Þ°gX˰ÆÎçÚú>û‡ÇÓvOG\Ò¡g‹nÀŽj7 šéeWŸn}Å>´â›¶zÌFÇúŸÆþõzþ´Létп>ÓØ¿ä€üë°>õ:`Þ€´› ûÕçë4ìiö¬€Ž³ØÇ·1tÐËVv‡Yνé°Ùƒwƒ£xÅøÈ¯lËçò.}üÀ7üäÙhŸÕÆÃï L[LKî¨Ûx¸ùã&ÆÊßðÐc<øÓWµb2öl,lNÛg;—\vx³‹ïèŸ.Ð#‡”{î¸ýðƒ3v˜û\ÉZñw£ºƒŽ9X~ªû¼#ÓÜM7žpòÃÖÞ™ýÜmLö¼tèçù>CáôÍ|+ïƒÛó7ø„Ž/œšÿ yM_|ìÐÍ/|ûyJ_¸b¥«¼âácqé}²Ùgs_ð áË6éJ_±à'¯‡¬6>rúâÓhÆ–Œ±•/8°æË1‡ qüSLt䛃4hCS²-g}Å _>ÈûjüìÒ ö±6Æhñ‘‘C:ð§O¯›4p¾þÁ?€–™rNM7¹b¡+{è€ì>NqÉ!~|lÁë+tê³ÉïôãÝëÚÛc }¥ØÒ¯œ"·r¹÷…Nøt5æâàÝùJ_ñ_~:ðÀ5þÝyÇŠ ŽOû3üW<ú~Ù×ÿ²Ù÷p燻=îþÚœ¹÷ž”Kν†ÊI ÈØ ¡)úJ-Y+jôê& Üù ÄÎä`koŒ‰ðòU½ç­W!ÏoPߠ࣠Ž|üüo@Ðñ…SóðþøØiÀñidñ…#K(¯xøQ\ú@ŸlöËK54| Ût¦+}Å‚Ÿ¬>²ÚøÈéóM µð[p@Ÿ9ÜC1Ñ‘oM~º²—oj~Ÿ6¿__›ßë>ø†í¯¿äon¹ùš5fæ…ñVW`¬ßÞüF®uDžóQ ¯ÍÆ Ÿú¼í»¿á»¶ßþÃߺÞ:B7oš{êæ/ZOp 9¨MVAKæ´_ö+s4W>Û÷+kKŒ èj½Þ;‡ýõßÂÍZ\OùŸ³`×kë~Ö7ÿMŸƒ³Ã¥§¼pÆÝº^o nŽÉÍÚ…ã9¾8B§vX__ k ÞÙ ¶{è™þ¢Þ~ðvŸÃcß w© >Oþ×¾1úôýÄ¡^xÑF÷:ôÚK†¾Óóûø¦ð±C«ÜøŽ»×â—/#/½ø~|¯=kímƒ_ñެ¾}kåyb)+þ¡Á?|êõFô帘éE£»qo]~¯hÝ”Ûê þå‹< «¶èZøiÓ/N€æ7ºNÉ<ýëæÊÔôx<µÙrãZ‚ 8Åxëß9?B],‹ùü¡ŸÎõ;ÆsbbKá#àçâïà\ÉÎ#—ŸÉ©éǯxàéT³—®Úù…N7{Ú=ì sÿDŸ<ÀøUÉg‹^¶ÑÕx¢%‹N G·²÷™ z•ómÃ%Ûõ.{tÑ›=<âhútiÓ‘mx2ìé÷vµá’Í6½ùF>ºv>âò{_s­kÛ½.ö]ìµk |ÚŠøø\üúl“ÉãÅ×\ÁØq­Všx‹¾¼¨“ÃËŸt±‘]8rêò—l6òM<Ùׯou9bГ¡ƒN^¬Ùà½áð5È5xó N‘ßt’©¯m2ùEOc'ױ酋?™øäN›]< ¸Å’è>õWû8öKà~þìÏðzÔ#ï‡kâCÉx\wÞuî—=Ã}²úÒK¾Ýv÷áÎ…€Éts\@p’n‚ÀIZILN-XüjÐ`ЉÎ\ºjã‡C§» yÚüN›_óÓ¼0OÌ%¸jóLû´ù[orb½)åÉúRZ·rhó{ûGßµ½í†w®u'Çñ£·&ñ=¨ÍïhÛxÑI_Ôû ~¶ø…$ϧäð*ô4¼ìÀö«Ã|”{y’3g\ôå 4¶ò§ á‘{P_žµéPëã#Ó¼Qïíj7FéQò€|ºµóq絭Г|  ‘½.<ÿ€úsábM¬åFûB}òë`=ƒ³æòiá<ÉuÐ[ùƒž"÷”Ü¡±ùÐ÷îGp¦Éû~wO‰×A{ä¾ñ4OÜ Ÿ-6ÌWOÍ×× †ÎAR½ÚdïÀîg ïÈûåýõ»CcÓˆ»æé—y®ï«÷/¾˜ï™b&­™v´Í¶Ì±Ã œy|Ì=­öùì¦Íï\‡h¾‹QÌK†¹Ÿùe…¸i¿ÿv¹|,Û#ÿqkbl¶^ÐéÚ¾²Ä²â\®õº¦8_ ÀÏG7ði£ÇòÌþ¢÷cÆ\a`ü%öœÁYÏ€<ÿ»…¼€èm®ýöŠò¦ßÖ|ßôÍ7…¯âh¿¤×þ£.ïñ”ßôÖï ~¼èû‚ž}׿Í)rÙe“Ì­·Þºì×Ù›ÆkäÓOçÞ|ßt–ôâ-ø³ƒ/Цãl›'c>8~ƒâÏ'zék ÐóE;¹|M~¯+ÛÙ£Ï42ébC, k|ôá£àO~ãÙøds—L6ùOùC×Þ†¾'ñ{?ಭÖßç Ž/ðäè+f485›Å\¾ù¦Í'ü Ùª&«ßÙ ƒ }pñáM6ß—ùÃfvó¿>¾ÍÇbAc#½ù¬Œaôdô‹.?áÄ¢ÎgtmcAŽ><Úüc¿5¦F¦ùŸÝåЧøãf^ðð9߬Yéf}0àu‚‚ç$€ÀrZ‡nmAêK„R´KªÁ§£ŒH]õO›ßa×c¹m ʧœiŸ6¿ÃÆÛ6¯´åMÝFenÉ!º9Ø|SëŸ6¿Ã&ßÚ–óKÎÔò)wèÚûÍï)W>i»á¶n·Ýy¸;Šÿ“m~]€-°ßæRgáüa/¿ØÕ7føÁi¿:\–9iŸ5ÿåNŽÑÛŸËé}åŽ ÆJ»½œ>¸öc èfƒÞÓ~uxËí×ÛÅÚ¨ øÇx›#j«u„kzëÕúÙ<ÖþÑ<Á㿾>| ¦oN™GxÄ]É8ä:ì® ƒ'7FWͮٷ~~p–ÎÓp5YOXFýøÛÚ·¿¼ÃÛèðýyOü/š¾¹Nî2ûÌø³^¹Ÿènßâñ:ŒO=Ÿ=éæ7ÿùY ì/<þé;ô®u9~kƒää´uºÖ¯8Å}ÔY.àžìÈh¯5;6ÄÁvwòØÄÄ[¾\ÓЭàm 5v[85Üióûøöw¾õû·—¾ë•ÛßyÕ?^›b¹)§¿ÿK¾yû#_öû·?ôÏÿÄÊÙ_úÚïÜžrÅ“¶?ýÿ~Ö…k\ÕrþOÿÚíÏüÖ?¶ýéý]Û‡o»ölƒ1>èøŒ}rŸîæ÷5¿éÛŸÿšïØþØýwÛuw_ÿ ›ßÓ®xêöç_üÛsžøìí1¸j.âïÙÞqû¶óÖŸÙþþëþù™oü²ä—õ[|æ¨y‡./àqxÌöC¿û¯o¾ôpqó¾í×S²ú¥¿¿ýô;_röÊ•yFV¬Å»Ì¶Ø­àÅsÚ¯Î}È5rV¾Ôí§‹µÏ¾‹µÖÇCU7¬3kÏ!Pñº·Oq‡Å[f¯ºtÖýú®þðøõyB‡îõ_éá½ÀUŒƒ±;Y‡b:­cëyÙ¼›vOËí!hëjâX£é/ÙãõÅtØ.¥ozëfÅÈûŸØrøFg›ÎÃUÈq­ þe‡Ýán xòï)?{½bÖ¡úb´Ñ;J—¼×Ýàדð‰¾'óìÊ¥‹>~-?޼K?ÏzäW{ÁÑÃÓÿá÷†B7žW>·žÚ}½=1u²+š±}±Ûñ`@½bähï%g¼ºá"wÆ•o@{åcl“Y¸áé³Ðž“ÎÆ˜,\o~ôù°„‚?k>MúŒð™dü»¦rM{Ëü 6¼öñØ+Å@¶9¨Ý\¿~¶ÚkéJ®Ü4Öúè|)Ÿptu(èÙÀöyÍn<èÚô‹?}Ú墠ůÝç6>ŽÝô‹OI/;µñh³EOg†òД>tºó‡l~ÐQþȼÆd¯/h€<ýph 6½ž~¶Év{Áç}åög^ðÇ·¯zês·ïúéïÞî¸g.@ïcóã3(>uù·ß¼ýðk~d{Þ“Ÿ³ýÁ/ý½Û?|Ý¿Øn¿çŽíW¯{Û™ è'ýêt`:íW§‹5óÀÈÈÃ;—c31­·¦&·â^5Ÿ/šxsÔÛ[ÑèS´•`';Ç®ø†.6Oå|½á1õÒ1¶ôåÒÍ@ßÅæF†@ËÏE½ðø(f ·ÆßõJÐ|à?<¿]«4]ÛàÇË÷åÿ1nú£©õ¹Ä_é“§|I{ÙBÊ»¢vúðèÓ£MV›Mºjó±¾¶8ØìF;ôìmâpôåœüÇÃ5½øàAq‹ŸÏphÉ¡å/Z±$£O¼úJN>Å.¿àéÊ×óã[swbÎý勜œx}òìíõ84’‡3ØÒƱó >|xòáèç]ékìð)âtщ®†g'tj‡g3ÿàèÊ}ír§¯;{úéצK¿V؃Cäó£Ÿ"F5Û þÕ™?Å›ßèxÓO–}x8m¼ÚüpÚxèÓ–3|j î|XˆùC?¾dõAöWçüIëm·~øñ¾Ä–ÇœR$0þ`à’‹fî: @ƒ*˜@°wÚüÎ ¤|4Ðåé´ù}no~æyц¦Ö·øÍ´¸æ/Ýnºãæí÷?û›·7]ûÖµn­]2êÏ¿ò©Ûóç ý½/ýßî3±ùùN+hÃcuõö?ýŸ_‡üïü©¿²Ý<tø·Îwý_ùþWm¯|ß«¶¿õ»ÿÚö‡Ÿý­Ûß{Ý?;“-Î6?:Ëœ½Ïs“à_¿ù§æÂðaëÀÿSïø¹íc·ß¸>ñ¸q"'Ú>ðèH÷i¿:]¬õùd^˜càt±v¸X[Éxˆþ¬§Ü³.'é‡'Û³¦Ëÿ~´Vîðs»YÔK6=­ñõDùÈ窤 ûk’ö¡­=et9p¯ïäO{]ÍçB¯ú·ßЯÍÞâ·ٛ͟ã¾Ô>¥v¸bÏž'‡k²ݽî~¹ ÃáÕÇÖÁ\Ìÿä6×wü¾áÓïf½kÞœŸ€Žò·fùѺ•dåI{ñM¬Æ8”/ßøø{÷ð³Úo-È…’Û©¶²Æô7íË|gwýÖèÃ]“¿óÐÖo# NÍGºÔ•u#epn¢t±½¿Àß•“]þ:Ј‡oúÅ„WÜå]¬ù®ߘÕþ¤swôе}Œ¼ªº’Í|a#;{_ö›»ù®ïz‚~OrúðyumÝù]>ñ“¯_Nðå–M ¯aS»›Ot‘…Wëó%<ŸÈõ ¬¸Ð£å'{öi+ôáSÄŸ-mOù„ÛÛÒ飇 ¯Úðä@ñ¯Îü³?äüÞÃ|¿/Ñà b(O~ÒÏèœ{0àm¹OÁâ¼d48tKV›±@AAÕhxèªm‚tj²¢•0zèf‡ýY»ÁÙO&òJrùiááwˆ^ßòGÛWBô£ÑŸo|)wtkÇ«àämÏ_ÕìïûdØW°b¾ûÎíÇßòÓÛïzæïØqé#Îò†Æö·~Éï\OÌñS>Ó¯ä#ýÚò£/{ÚéÌÆM ÚO1^òðÇü}ηmW^vÅöW_öÛ­wÞºøð>¼ò½¯Ú~zéÿÕóþÈöè˵쳽ºqÌ—ìe“ÿ Ÿš üë¶—#ŸyÅ9P´ñ’7¾ œð.…Žêxèª}Ú¯Nû•ùôu¿Zù!øÓZëvÖ“ïÄ[G޳¨ÎöIOj×ÐÍzòh]Ú!Öá~dµ½°>‡§o'ð”w6“i>W¬Ýµž­ïYÓÆ„=‡JOÐ×׆g=¹¶L±ã:äÒ’¬ý`éù`ícM{½v?zדèñn/Ë7~ ¯_Ó?ú×Þ‡_ìâã—øºœŽ&®õD›ñŽœ½«›ö"þ£­›%žvû?¨õyY¶`=w±Ì7îœÏ¨›çGÞÖ›G{d:üíå–/GýxØ‹6ŸÚkññÕ~ Ää‡Ù“·uSeQŸ>èÈoý5Žºõ*à7[ÅpþuÛbAÇÇG2]'ðkËàj[|dä?Ð_c<µ<(Í]òáj'¿úSÍ]6åÙkÏø³Ç†k|:bÂSïúÚxös¯ë,@xÕâßçß'›»dЕlåkxúýèGŸùŸ¶÷¾éóC˶hä?9°·©-GøØtòEì—£};5YE›mùUÓKTÓa ™kòÅ^­˜ðkzò‡ÏñÀ‘Io|ñ‡Î½xñ¡Ã«ËS¼ÕÅ’ [ɤ£”úÄ)Æ3íÖJøE|nºéÜküûÿ¢ï|ÑÃhö‰O|­ץϟ¢ñ°{Ï]ð ö´ù6?“û´ù6H›A‹]ûþ6¿–™ á>7¿ã¥^›–µöcoú‰íªË¯Ü^ü´žmjm~ßò¬ošƒôK¶Ûî9÷?h°Áž ½ù¥[Íǯ~Úóçë¯ßÞ{ÓÎ>ÊG›ß¿íg¶«'Žg=î™KæüͯÅÅzér%§x€ Xôò^œä“e7üi¿:íW§ýêÜ^Õºi}­Eõþñ„×z_ý±ã ç`j5k¯ÃênÏB³ƒ­'˳î=™·žÛÔÓY‡Øö }7ì·³ØÏÔ³¹,}dí^»Ï|lò‘¯ky6>z:ßÓv¼^ù_7 F§þ:lO{Å35pˆe'–ïƒW“¹}.Öù®Ï®xmüØóâá§›+wÇ_{ýJ>;èBŠ}~xpãÆÂ^oùC_?¤ÇÎìŸò!Fcå`§½c›_ë†ÊÑsj¯ŸªúíÉü6N@›º—/ƒãÞ5–£=y_7Žöñ§—ž‡Vü“ï5¶üàcëF¬¦Æ¯Í/µ\à‹nŸ›>“É 9 (xÈÂ6”ôÂÓ—Ùäc~ÒQ~—’ùƒ–ní‰lGÓj…ÿÙÎÏèüwý/ÿð‚üH6%üsrKxþà!Èñ£\†W“CW—ã%t”Ëy¼J±Ã—W5öúÑë'-zâG+4}5z|ùJ'zzõñrC–寂K6º>[æ6~>ÐÙ!TŸÝ€ÊrŠÙBñÓ¡]Ί›|r{šûh x´Óƒ¿ÜóŒói×llÒŸìÞþôÀ+øÙ«F¯¯­°!¾l7Ê?ð¥S £Ñ]ìpèů_îÈiÉ à­½àÏ7ÞxÆÅÆýÁaWês·(¸òÊ+j> ÚÏaI €Ç%­€%HBœv8NJ4œ“+It–(t©Ïy|Õt§— ¾Ð•hJ@Ž]ºí’F(FuþDc'Ýùƒ½‰Ð â+6¶´éË/rdÈ¢§¸ãÉW|ÁÞ/þDKOv³…d/ŸŠÞX¨Ñ’/æìÖ¯&¯-wr ´é(OpûvãÃgòlÒ¡ §ð8òù˜dôäñ§_{O'Çzü{ûøõ-ÊìÁ‘c›yQ¢ãÏøô±­XÐËSqîç \6Ø&gÓS¿ý¦wooŸ¾û}_ò»¶Ÿy×Ë–?d_øyÏÛž:?è÷WþÝO.Ys?=Ù`“mýâ©fà;>…n Ýø‘žîu¡{ÌÉÓæ· ^úîW.ß²EGy¦ÿý7~j{ò#Ÿ°üi­ð';|'’…û¿ç°®×E÷àá:ðbKó(<ž|\:G€c+ûrwÚ¯Nû•ùan˜æ”>hÎ5ÏàÍs°ùD=ùäÒ±§“c£9¯­dŸ¬þ…Ú¯è{¨`¼'v‡³Ë§ø^öºô›eoÅ8ë±õ¿Öæðû‹8íkòô§s8@CLÅÓótàÕ–/ëŸëó†Ïß±O†}~9@Óë0ìuqv—®ñ+ÿg0¶†ÞØ'Ó´n ŒNtÀucrdí#k_=î/ųžêÎ×fûïíä‰t÷y}~å`ðèäå@ À|7ó°G^žðÂñ ¾xÄÜëòK‡õéÓݦ›üŠqÚ¾×_{?ÍÿÖGüèÚô)|uàßXzÆ^cä†Ã(_?àØ[ xúo³w¡ëü‡'—õåN.”>wÑáË©¶Ï8¾qžŸ#}¥¹+Úd­oý½<ü¾oNÁ•O}þð‹?x“цÏÿýx4_Ö_ñ6æôí}É~>7}líód,v4v‚ìgS¬læ ¾ü€Cà Ç6\²Å>?™â;zùª]~Ô6Š%_ѳÕXÑ£5{@Í&>ó€¿I2h {åSLdÉÈ;42x³?Þt³[;|~Àk'¯ Èl “á[> ¥7;bÔVó ¿>ùøÉÓ­îüáCc'É íÛtÐÝø£é—m8| ÈG>°£f˜ãøáÉüæ/9þ½ ¼hä@²ù£OÏÞV9Hf >€?7σë³ ÎyõÙÿòËwÐû˜ÇœÇöÉ»~¥ÿž{ƒvÚüÎmÄM˜&A“Ù$hÂɬA>m~§ÍÏ\¸w¾cÞ´ðÍ“6¿‹.>|è´‰àSþå›þÍö/ú“ÛãçGð>tãGÖÜò½þ÷Ìäýâû_ûÝüø4ﯾìÊù/ø>öI7¿Þþ±%öøG=6ñ³ì7Z±³a³Ü¶vÑáé¼ø@´Yë·ik·ÉËíi¿:íWæ0·šSæSóMÛšêæägûÅÚ ø!ú#§³ëuö±Ñ…Jã±Ö9ºñ™œ¯§¶.’flÚ[¼òݯòsÓø­ ªi;P»ì3òÛ?19ÑF‹_Ÿž½ m<ñ³‰?µÕt¨ñö¹ èÈ4|­)~ñÄ—ô£Ál¡+übhÓÛ¼€ÃƒN~O‡/ö|Àÿ^.y| >õÞ>9~Âí.¼šl~—o¾(¢)E£@IDATõÑ“)–óåò¯6Yñð‹œÒçQc@Ð/÷äéa#š.9{Yúò%^}|øË/Û@ O.¿Êüôcýâ! ô‡üÀ‹ÎšÂ—lfg)˜?ù¦OG²Í]øb‰^Ÿ, “ßèò†^n²‹<ØÇÝx°M§Ï~:Ò_¼ä´ÙSȯÆ:¿Øä ȺðùÊúƒ[o=Çée‡‡¬÷%°6”K.9w¡~õUWÞïýâüJ¿€8[0U0µD ­-À&C6@%…nIÄ#9èhÚj}<ÕüQÐò)}üq¡Ï¶6¼j}þLít ±¯À5©š@ññnБ¿€¾v<ÙoÂà!à7!ò­¸kãÅá)žbþ¾ì•×b×.qó}KžÆ3~¸dl~tóO ¢|°ô³§Æ+>m9¦ƒ=òñ‘«?¹}.ø¯~|ô±k^æã^=ùìð‰?å^<ñÕoàÉ º¶8Ô€øÀÕ—_µêr›ÿ­§ ^áG{Ôùý'OñöcoþÉ¥§1£äSöÄ@ºzŸ—Æ,}q’-vëeÁQÿ(8ôçïûoúàö¤G=~Ù$ös˜ŽÇ_~8è¿oxå™Js‚?å¥| ~¬¹ví ç-ñ 7vÅßœ!ǾáµËzíü?íW‡dË•üìçiã#—rºk4c ®]p•¾qRöüð÷eÏ|À‡_^öøÐ¾¥ÏšCC ‡.™ÏÅýª\]èZ¾ûþ·|¯CÛŒ™rnüŒ°ü;¼ª=a_OåÉ Í,¤Çþ·ÆŠÞáklùí°Ú/áÓ›®¥l°íé9ýt˜?ÆÚͯåÓ=Ä¥§½‰Ï>‰g‡ÿÖnÚþË@‡röö…Ìþã£{ý·zÓ½9€—OkÏˡËÿö85¿×_‡ö—_#³n¬Œ/|dw­ÉÙ‹ér Æ Ê »ÚøØZã1|­åõ?"å–ŽáY‡l>ã-†¥üø‡^úÝâºgr¾|œ6 GWw}eþ¬5MÿÊÁôÕg0ýu£ƒïÇÏš3ÚlÈÇògtÚcã53hðâ¬Äà 4œ±Â#žâmÿK6þÆ©1‚ÇÓÜõù¤¬u6zé×Ç“nµ>YzÌmmŸå:Ùä–Óó‡ þÚécS­ÏKí@ìèþÏy²åŒ\ya_°ý⥗hç“vs5ÙúlQ’Wãèr·÷L8¶ø¸÷Or{¿áÝgswtÑ$§ækù£Ùôä;ûùƒ–>2üB§ ¿~¾ìY^m±”?µ>7Àò8r|ÀŸm}²â`O1੯ÆCŸñGÓ/ƽ~m|é©WÉùôâ±ÆøoóÆÇ¯Í_yéËy2ì£ÁUŸ½úðìâ¹ažŽ¿äݯØ~Ï}ãöïþ‘훞ùõÛ%]¼ýè~|é*^>j«Ë =æ]éÔÆÇ&^9 —O|Çθ.ߦ¿êãí‰öξw{Ö㟹t°K½ ùg?áY«ÿŽëÞ½hèì7—èÏo:éQ“WøçXÿ%ÕÜ …Ï/xm~“Í>œ>ÀØ…o.¦ŸŒ-þøè!+/ [x”pü̶Z äÉ*è.}t¥½(]øÉã=íW‡156ûyQ®Ë©<–wãRnɹÝ}p 69ãÒØ¡áiœÍo:ŒŸZ˜€}ò8òôímë“ÍO1Ÿ;Þ>èé7]ä×8jߟ‘Í^‡g«Øˆ¥kxÝt8h=ø"Þ{F¶«vW>Fžë×èøuà¾uÃbhË÷‘ͦñÙ¼ƒ[;ÉäiÝ9.Ït­7·Þœ˜z‚ð¡³.¢åo]P¯}mXòaˆ+ÿ+7ü›¾_î7ÓÏÞNÛ놈\L{Ù<ÆMÆ%ºÁ×þ§‚ 츓Oø?t±Z+֩űÊȉ[žã±>ð6öX.4|ÂÜ8~°kŽ˜úk<×Üá›Ê3ßÛ_šKùO.=dVF¯=O{¼q죑Í>áµÛ+²—òpx™t°¦ÐÏïøðâ ök o…ŒbneS-2làU+Ù&Ðòèk»ž*§û¹‹'ûj>+áÈ´×\{­6|¾Ð'/lÒ!—ôñ1}t85|}2ñ&‡¶Ÿ»úì*u¼êìЕþüÕWÐø Ò…žµ~úÌ8?<('굿ñèJ±ãWú²GŸ‚/ņæš8ÿÑáɾïBÌýÆŒ\<ô³Ÿ¾ò=_Ôéd.~Ðe<éIV;þâÍ&Z¼jù–#ö€šŒù¨ÝùšM¼l²¦­fÿÁ€‡îÁ#vo뇫>;ðs>èÕØúŸªö«€Ý{nÆ/È‚~ V·`$¿¤iã‘àÒ£OV¿üió;m~惹 4ÍóK1ï᛫úͯÏôæ÷¡[®Ù~ÛÓ^°ær›ÿùwå%Þ¾úóŸÏõ³µÑš€û±_ýÉío~ó÷lÏ}Ò—nßúÅ¿s{ù{~q»ñîÃ/wŠ'}å¡õÕS+t*¿ÖÍpñ|ýÀÕiûþþ_úÚïÜ^ðÔ¯Ü^{ÍV~Ïßüþó¯ø¶í­×½c{۵m‡ÍRìü´ùñÉö‡ÆÉé±?tö¿L‹Ÿñ>‡Í>Ÿö«söÍ µ\*òºÏ£±1VÍ/µÒœjŒè0® ñjž.Öùr'Wæ"[å3½_-ãÑÁ‡ÍuÁ:ÀΜZëOmOìð„ëøcre] ÝÁËY®1ŒÍ-ºäʼ3›kœ^Û¿døÛš›ò»¤S;XÞsœ¿äGÉfwY3wdõù7J–~::Œjó§ùo ù×¾Ô±¿Ò¸Ó#¾µ« ]»·ð¯šüÿÀùá ü—»¡yZÞþ¹âŸ˜ÆÈÙWÖëõã»7Ðùµns×ìãÑÜ dð­<Îy|¨€½ôË‘xnlóMžß xó‡ŸøŠ×Ÿø«9ƒV.Éég‹ÞâEË~s¨|àÙÚËÁ¥#;l”kºìóžT>¾6~/}êxª‹KŸŸÙJ¾XÑèÀÏÿrÖuXzÔttÈN>½|Іèeð®¼Á™[èÅA>Ûʼn/¿Øq€O›ÏŠ6€>võñ¹ÙÓð4Vù´—+HÙò¦äöô}ŒÚôíüQ“ɯu:¸òËßò“žì“ÓVøòuŽЋA”?üéå?>u8tºÓ?øô~…¿úÙ¤‡Œ\(ÚJôúä;ìÇŸ,^6“‡çs8ø|Ww½Êº@5m~Ò›Îb)¶%ôþ\uÕUÛ{ß÷þÅùÉnœøo;>i$q÷]3ÉÌCþ’·d'M(%¦`ðåÝü\ÉÄ{Úü7<äÄ„’“rÖÔâP›$§Íï7þæ÷óï{õ:ÿ–§ù˶ïøñ¿x¶á˜;Ÿ©Í¯5îB6²ùæŸØ¾íÙ¿gû_üßnö'þÒöîùmüž­zûï_ô§¶/ž_çÿÓÿæ/¬Ãþ}m~t‡ý¢MͦÚ>sç]‡—]2Ï™æ÷€¬›  VÝ~ƒfýЋ7=Ú­/<­=m¼ïi¿:íWÍ s×<æ°&š[Úx['µ£·¦á[?th+äÔè ù‡êbm¹@Š™º ãì »>ÃwéŠåOdv¶{'¾W?ÉÛ.ž˜ýXÁbÆ ¿ž(må†ì1ÿëÉõð¯ƒøàP}JtHt¸÷ÔÈÿÞ¿µ/Œ~¶×a”ìôµí¥g7ÉÞ˜,8ŽÏÚ{Øý=¡¦#Ë\/Më(ñ ûËòqd¼Ž.Î5Îtn}ÂãÑvØw3„ýë‘¿§èÅÍÎþ0Ó^'ÚÙYy—Þ#ž,Ýâ>ÌêA°{ÌñòoP@è$³èã}Å@./¡pÝ<`«76äg½¡1õº™0üÆ¥u$ï|¼×Ó³±Ðéóyàpº`äÝq#᡹Ë7qûœ(˯‰¿œà5¿ÐÕèñè‹ ÀéÓ§&¿çƒôõ¹” <þ•§áƒÏ¿dä¨kEúûìCÏ^¾æ;ŸµãYãŸ|ˆF‡µA¦\Ä£_\ø}%~¶Ùªˆá“Í]±’ÅG†Îtñ‰î}ÐãÅŠй|O†ÚùÏ7rúxéÉ|Ùæ§>ž½NtczÓ“<^9d‹®ü‚G†övÑÀ'2ɳE<€ç€+æG¶éЇ¼v9ÀÏöÞGmt>æ}ðr…=ØNO6‹‡-…~5<9¥˜ð°—ýW_}îkøŸLöìÀÿ±ûYw¡®¸âܯö*Ã^'ô íMV% ¯à÷ÇSR’Ó'£.!ÉÁú$Ѓàß'>ÿÐÈœ6¿Óæ×\1—ÌgŽÏäæ÷O^ÿ/×÷ðè÷þõíGç¿Û{Ç ïÞ>ïÊ'o¿ãé_3Nwo?ò+?ºýg_öû–­óØ(h/"ƒ†·9¡FG¿ 8}2êb8íWç>È䨜ʛÜÀÉ•œé+_ã¥o<ð“6: ·ÿLÀcÑéQNkŸúbm%ó!ú³~E~ÆÚSæuÐñY¯µÏØÌ .œqöjü]ƒ³·¬ôøã)³ËZãhl×uzgsgíEÖâq>ÿ3 oö²;`ÖxJíÕû‹§^Üñ+Xójxée×Av½<=}Ne0~ÒëP{É”~UŸì:„³5|k¦Y¾¡¯+—i»Ü[OÍ90¼Šƒ·•Áv‡y2æº<Äãmß÷ß­ÿý`ì¬'óøÄ@zëBÎ—Ž£ïë7†Ïä‘rÂA{å~äàºéÐxYSð}´_³'ßkeÓO^=EnÅêkÆÝ`9ÒFlñC¶Üêfˆ˜ùNG|gûøàúß ñÿi¾õùÚ~¤6&ê5wÇGûœÛøË÷5fãÆ¾±À‹ž^ø¿šn|í§tÑ ãU»žiolîÐ]éMw~á…Sò±¶>:Ð&£Å™|úÈÊ!Ÿ÷<æ6Ò%/@Ÿ?øÕdœÏ€ ÅŽM͇ÆðC5ÐŽ§|Wk¼j¶Õü§/_à+rÛ| ÇV²ô’%—NôbÚÛM^‘«Í&~|ø]ÉÀE'£ ƒtÈyºÔÑÓø3+óŒë#×\{Ö>¿qvà¿á†žÑn9N¨3Ä'iæòKæ.î:÷}Š‚Ps^­¢äH< _€ÍÀK˜DáEO/|Ž_;jºè ÐñªO›ßa–uãqÚü›¸œÈÅgbó»éö›·?ò/þäö§žÿ_nÏ™Wó¿ñ/Þ®¹õºÍòýã9ì{rÉEçæøù›ßίõ_q飷×Îÿyéås‡uÖ$ÿÍu¨[‹ÖË…ÞüÞqÝ{¶ö+ÿj»õÎÇ›|xÇõïÞ¾ý_ü©íÛŸómÛóŸúÜí¿xîœØ®_ß°ý•Ÿý¾íÍ×¾íl¸¯ÍÏ͹⠯1ñ½õcïÜ~ðÿîöMÏøºí¹Où²íÕ?Ü.¹æ°7ÈU{9èÃW¨OûÕébÍÚ [/Ísmÿ„ÏZ§mžæ~óŠÌo¤‹µ‡Ý{î"bt!ÿŒjÚF½¢þq;öÙi;vHÏd¯±ë¯K¥É©z‡ß!q6uèî°)ï3 ‹¾5®ƒó5Ëf@³ÿããÝØÒmùèpÖkðÃãFÅú¯æF'»ÁÏ5ÆâÞ¾ÃNŸƒì:À’Úú^ÿðÓ«øå+n‡>ø•x~­8¦æ>üš[³—Ó/†u3dhbjo´_3þõ}ù¡»1ÁNÿ_6–þøŒkŸ_>ýmåiôñ?pÆråbxnŸ±”s:éççÇÇ>Á­+ƒGü\oL{ñí÷èËÇÑá+â ÈÑÇýucßèx¨€óÆž Ýgqø½Ý®OÕgòø}¶ÁÑÕ˜µ—Ù·Íl~ÂÜ=æ•N°æîÑÇ>çÙêó’Î5o&ÿôð­‡Úhü OH§:ÛrØJæü¹Ë'´5nã{óÀA/{Ím:õùšüšSk›é/æìíóâsÈÊwã¿<(ì5ÎéØãµ“eW»œ±•Úéâ'< ¯½‡d¢%[ _›­ìÃÓ]ŽàµË­œÁ‘ÍF9Í÷dø¶÷·ýÔøe“ŽäŒ…¢Ððéó‰^8íxõžÆ/ž|\ ðÏþWýßw|µÿ¾DÏü]ˆ`ºóÎÃË} ìqœU.¿èðÝ9IÕ— -È=„WàøðŸ6¿Óæg(‡yah[DŸí›ßÍwܲ}ßËþöÚp¬ Ŧ,/}ç+·—¿ûΆtþæ÷›?´}÷Ï}ÿÙÚû±ù½åú·oõå?°ÆÏ盟 °ðÚ¾ýÃ×ý_kù·Iâ©}›ÑÄe~¨ÉÚPåGûÿ|í?ÝþîkþÉ'ì;ò_vðŸö«Ã \ʰwù†“/y/or-Ÿh}ð¢ÓÅÚg×~õˆ‹ßë3? °~;à{ÕÛ÷ù6×Só™‡ë 7‡ÆYøëI±õL¾§¸í ~Yé9ó“žå¿=fæ-ëò¦î ¾ßðšÏ=QæŸã.{.ü¦qøÊÁÔ~PŽ-þ­›ƒ¾†àÐ)k|&«>û¿äÇvûÑ’·‘>>Љ¬ºu¶nv Íš+‡'S{ùÖðéÞÍ×4W~~ùúÃz«bö¼Ö´žžwHϺØXûÀì äV>¯–û¸|üsà·Ï{jØÍ€Eœ?øÅ­Ð—åÍöuòðÉ©÷ºòO ÝD‘ïnüdÿBÖìûüÈ'mPßÜߊ ½XÅØ^O×6å”\q’+7ò"çhéƒÓ§—úæKy\s÷è_>ÆhÓVÎ÷ô=ŽnçK~‰Ÿ\þ5wóüé³#yzAµ ™ü—Žxð³‘ù©Ï²jrrKN?ðyÕÈ>~™»âÈ6þôÁÉO>:ûøÒÍ/´=/º’ïhø@zâ¯O7È´äÒ¹÷”oòètèé.îâhNêïõÓ~Œðð§ü[õáÈä#½á²U_-wt£‘Q“§ž^1¥¯vñÑ‘~´ô•x|øÅ§äg¹Î.^€À›7ä÷¹É¶ZIn¯›|t>ñgï» ìÒ_wý Ë&½çÃÙ¿ x N?á²Çž6¿ãà–?ƒwÚüN›ŸõaüÇÞü¾ðª§mtž®|~oƒO€_³ÚNûÞ{mÈüGoûØö˜G^}¶™EŸ-qÎímo»þÛ?{ã¿:ã·ÉÙpØjCÕ~ ›ßïzÆïØ^ðù_yôe6F_òa8ÆüãƒꢋlÎ÷nÿÏü÷ƒ¯ýð„t¶±ÛŒ­?6}¸XùÒxð‹§‹µÓÅÚùóõt±véö”KŸ¸ÖÌaŸXËë‚þ9ûŒ­ËÆìAëà9ëRßzµC­'µö'{À€Ã5º‹¤%7ýµY ÿºh?òÀ:ïÀ½éø.ºq§ƒnÿÕÜ(=ìQƒóxóðö›æÄ:HŽ¬ï‰¯öì-ËþÒ:Í©ù½ôÒ?íu7zÖÍÁÙŸøß>EÎOçÐ̦¯¬Wß/7+–?ƒ_{êð°qva7íQ¼d=‰wÉèÐíð®^7†G¬ò´çÓ¦÷ÿgï^à7;«úÐ?3™L&3“Lî ¹HÀáîˆØ*Ú¥¥– ­xA­V륧=-=¶øù­—*Z±=µG°Þj9G)*÷[ä’„„Ü&!Éd®9ë»Þ÷÷ÎΟ30c¡ì•ìyžgÝ×zžw¿ëÙ{¿ûÏv_h(:ß:¯…ë¶lûó„âPBjû§ìe¼ô¹kžê·Î’ËÈ“ÜËý>€ØK.ŒÉ¥Í:1Wð×âÙSºÄ°ð¢ü/\ç¯rêç Y/mäÿÓ>ÉIå ¹2æÅX,Ú¬Q±€¬·àñ÷\V\Ó|$ohdµÑOOê 6Ð{}-õ£Ç>:]Y»ú§O÷bË\‚èfŸßìÑËzéøñ ‰EK—#qã5FsàúÑ«ÝèôF8>Ñé½î&:’_4>Ò ï.}|útò1qiááØwLçŠÞø‹†_;<=ü‹86Å .›ÈØÑzt?ñF–¾Äžù¡Ķ~ljAdÄ㈯ÉWrÂN6ûptâgì$O­¸þáGü‹¿‰En3=lÓ©MNŒÉkÉÇf|6v!HÞ¦ñ£E\Ìá|Œ^|ì%N¼Éÿ²ÖèŒ_iñÆ®~ìÆO8öðÃØcŸ2lD~x#‹W¾œŸVþþ2XJ(¤¿ŠÓ8wóÙã·¾ë‰Çñ™àMrÐŒµÑÇ"L²ÐÙp öãs’I¯Ã8}º§[&D7ûüfÞ|àã+~ù-Ö´\ÌÉÏFyw½ çÒ=«Ê{—nË¥àñ]~8ÿí»»æ`O­£:Qn^œˆÒ“5“ùÔò+k?¸Ð2çÖ97Ïá×Ç»¯üàëþUÊŸÒkÝ:bÛÚZþýQúbƒþås¢ïÀ“#Ÿ‘ÄŸ˜r¾Èç&þ'žà£—ÿY¿xz|‰~>Îç«ù|e-|ŸXSÀzÉš´Žô³ž"“5 ?ë1rÖÝ¡(Ö°í~m›Þèn'Ñ?¾cøú³^~wŒìÅ#ð6Š6ɑπ¾K_ý#«HÖßçü@žléËw{ÎÑAŸÇÊ‹©c³A¶áb%G>›doïP6÷æ»Æ™—ÖQòî óÙyÊ“w/¿éÎoíóŘgaÅ)=®î)€¾8Q|€>¾vþ‹&}æ^Ò³Flné+§z£›ßßÓA6qƒ^7Kþ¾hÁ¯ú¾¥ÇšLžä€ óßy/2w.”¸8‘7ô“tù‹l÷÷²!7òh®èä=ld®àp‰OÎô~rò&÷tµ?%S„þNé¹+¿øþà#;=7eÈÃË—6ù”ìÅ|÷©qðDOZŸa1çóŽôÜUÌÉžÐôsw¤—,œ¾#q≽Ì?ðmæ•-zŒñ“Ñ´´p‘]6Ù²–é‡C?1ÐKÖâcìÑœÖoÎ úpÑC7Ymx|ôÂéó'ütñQË–œÓŽ?v¢W‹/~ô&V¾8ÐôÇVðdäWþ¾èÁ{°@6 ºï VþÆ´¾þÌÞ¥”Ã1çŽ ×Ô‰bßâ·&d% p$‰ÃŸÉ@#+x’øùä·XTY„ÓE&OÉ—üôäŽ y•çùä7Ÿüòyófü¿õ¥«5c eMùlæK ÎØÚÒ¿·u6¥¡Ê“ß>õ–ñçW¾uõåûù,ä„8=yó7|âJ¿;õOdÅÃW<Ó"ƒo<Ÿ¯ëC>’ßä'çšäu>_Ýs£!OÎÕòöµZ¬=ìØóû»$sÏÒ!i«æ´Áö;PF9Ó¸{ï.­ü©Iún>Z³}îûŽu—äùWÜŦ·>»yû¾Ífÿ6¾>óÀzµ¥×æÓÝï|ÖÙ¾OɹˆÐéÒÍNŸè){ð¸{^ºØöbAx¶éµ‘Ží>WÁ• ê{_x\ؘ^hHá×ʮز!ïMmñ·í’e3ç1¾Å1LÏÇ}Q¤ì¢·lõñ‹£ûQ~Ïâ-œ<‰Nº;wr²ô/çé.ö çÂ?“£»ùPÐóVòÉ·Üš[~.àS?]Pvâ¶×aU{Ï¿¬]ñ㱶ŽZ»%#dz]” :ÙèíäRç…¯s |n”°ÕsVúõÉÑÈÑ ¬yxã^ŧe+õ%~:Ä›Æ ~jéˆ-:àý²€îÄd|ü#GÏT>ú‡v­-zâ~¹¦3yàì’><ðúðÌã9-øä$c8_è3'ü„3ÖúøÙÓç›Ö8ùqF?¼Úôòƒzpä^ÞÄaZôeŒã+ÙèÖÑGŸô&iñê‹ =ø€Ïˆõ â:3ïñ!ôðÆß©ŸñQ+ìÐ'Núotg·õOroNñÐÃ÷èÅGgt¡Å?´ì¡ÙLŒtÇ_²ÆñQOâ À xL€Î/+­NCûK)ä¶­ÇŽGý ñî—®I£g>ùíÿ2•7 ?‹X Ó…|¹,Tüðpd̃±6 J= 6²óÉo>ùY _k'¿¬sïñY±Ž³àó9ð¹ÆŽ||ä|1‘™ždñúüÈ ˜ÏWóùÊzøz.ÖNÜpÜxØIêóD¾‹úÃq¨þ©Ó°;½ý¹¬Ï]~²Ó›Û*vrGßgÖçä³®o3‡§7žÆ“Ï<:Z6ßîvçû²ñÅkêü@'¦º»H+¸¦§ +=%Ô$œ#øæ°¹´±o/‹^Æ|øKzܽ·1öB¼é#çtˆ›?Ž ¦mô]ñO7®x]ð½]+œ‹6 ló§/„T ÈdsÒ¹,Ù.(‹.d¦sÜ:—1$÷¡Ûp{tž\ržü­b-›­·ÚØk_Ë.àïóÌMçºú6ëóŠe:?ô„ :|_(Y9tøn`)>T÷l‰…/Z9u$ß¡1ÎçÎEõùMfºÙAë¹/:š#ºôѵôÈÝ47SÝù^‡s˜¼© mjüF®Ô„kýÂÏwòú±ß‘‹ â‡']x¦x|D¯>ÝY›±Ÿ£+tc²ò¢O™¬Mú¦üxðç@ðt2 ~F>ùÍ'¿¬‘|ç“ßâD(>#NÓ“Å×ÛÉO¼ íäÃzq8×ÀéçÜ‚7稜cä0'òðÃE=úóùj—³¾¼ù͉ÜÉU¾§ùÖ÷¥º1Y¼úô‘7S€£ÊŸ¹"ã@ðt‚ø?#4Ÿ!6€64Ÿ+}:#£OOøÉˆéë¡Xû¶“Ÿ2¶lÞ²Š5ù•ƒCtf.µò*¿w×a˜Ù~™ŸõR8›XG³9sFfµ9W<ýô@µ ç¾å\Ú›SÇÔãÞ4oÛ«1{Ó§ z½Ôº€swŸÝœ—ýD ï,žï6¨ýfü¥ü)Î|¢Ä’ï9´~,¿Ö©XÅΞƒ¢ñ“6ÄH?Ü?ʸÔÚF/ðÙ˼ɗ£c®¯w [çâö© Ù6µË¼âµyîüM>ô‘¥³7ã¥£ç¥Æ|"C/_ÅÎï~r€>¾Í&_lÓ×9®~ë{á Ùy2—½F–yÏ_Hžòó‰–+=‡¦ë†þé k" žé9PL9ø;]»d:“y/}dzî*_Úô;G%—1^:3ΈOÚ)ÎÚ5vþ£‹¿€oð«ÏáÄ_ðM×.:ɰcìÀŸ|¥ÿðæó‡îˆl:\ê zÙ =¼ê󉎴p >OWü×;è"Ÿ\Ä–±¼à =öõñà£69EsÈ?[údøÄ9ãÐÂË=Æxð¼À8ßqxÍOæÎ8rxõé‚l³G>~Å:ÝâÐÆ×ø¨Lt&vèÅcýćø#~-Hœtð1€?c~¢;™ÄË®ƒ½Ðѵ€-}t­¼Ñï /~à×ÇË>~¼Úø9<ì° §?œ~ô“œ ¸€=/lÝRï~X +®={‰Â°wßþþZé˜óÀÖ­[Ǚǟ>¾å¦'Œ?ýÜ›ç“_%ÉÄ™l #“ gR³ÐÒ7ùpxç“ß|ò³²&²Ž´ 'œlYÿàÏÉÆZBw2pYÖÝ×ÚÉoš‡ôÅð¥–8á°³Ü$p9ÌÅÚ|¾²vò³6ôᬯ·bí¼M÷ó¬'¯Þ—âór¨Áé̆0w±û3ZŸÛ¾Ó_ù76‹«9©ȆÝ™°ùªo¹¹>ë=g5ö‚?ôÀ×?ýºõ`ÃÁ?¹ÑG·Ñ´)žžküE<‰ƒ ç§¶c}Ýߟ·¡/G{ãÜë®pµW›zïè çÌ•Í~)^èXʲÓg¶j{s]­MFìÊ…yº¢‹Ú¢ó·7"åC6×ÏâíÍsņÎá{† wú½«À†[Î\©`ûp±¢ÏÎ¥¿}­ñ¦9:Ê& tÑgÞúgÖÂÒfÞGàé.¹—?±va\-íù7—w•,ÞÃì÷Ú-Ý/»‰IŽÌy>7|ÔGç~œwu® Ÿï³ÎoéXÅ_4óPb‹]c`L–=k 9è’ßu×gß¼‡Æ}€žèGŸ®ÝèÅY¶ñMŒ¡ás°1•Á ;Z8íÚµ‹Ïºuľxè‹ {@.ð;¦¸ø£fàï4_hôúÅÙFÖ?ô6³å'=øÅ›á®Ýøè"‹W,è|HþŒÙÒöçt™ãØ$›øõÉâÍ\ĿǏð&òE‡qæ™]\Ñ»±ƒÇYºã;<]S`¶bC|px“+6áì9â+‰rèà¦x-ZôúìŠ÷` R#Ó`3˜´« ¿»wßs‚‚Ÿ¶œä œ´Ž;î¸ñ7ïóäqÍÎëÇö~lpø ~}IH²²8æ“ßâC›ÜÈ·eÑù°,|ÆôÃ0ŸüÅIr&GÖ×|òûÚ>ùåü¡5—æ5'YŸ'МLsrM›Ï >ë¼5’¾1˜ÏWs±f-XY_OÅÚ±cËxþ9ÏÛ¶m;¬þþ¬ÕgYin#Ûw‚«•÷ú§?—¡á‡¯/Äý›]|5Wðù\;ëGìõ—ŸÍ=°5êÏxÍ/~ç-p>pgŸÃy…O^J·±ÚÅÓ¾-ýéM;½e«ÿô›¥Ï9Ç9¦cB/YýZcä¶]:÷Ž=EÝwWhƒWLý›{ø\ȲQ‡Ää©ñ&&>ôÅ“¥ÎÞPOã ·NñYã†¥Ž¦-uÒ#Ïä6•l+y;?ü· (^ÄÑ?-(º÷ÐêIóÑs°´Óù+Ý¿ówérn÷Û~ô<‘¹%ï) ±¸0°«xÙä{óTÛЧŸˆ(݇ »9“+g>sþ@ ˆ±ó¸äÇ‹®¸Ÿ~EÞ©^üp@¬ÑÇ^ðôÁgm‘¡[ ¯µqñ-mdÐèÃÏ>6úáøÁm>KôáÕÒc>Õ§S<þ© 82Ño øߢ“,\ü3Ñ ï0Ž^<¹`}Zö"GGÖ«EcÿèÆ±3…¼øÅ˜\ “ã=䃃O¬x§ù£¿èÇ/rü0†øàðZ€Ž×Áft§¯Å<>¾ÄÄg›"úìÉ 9ò±éwzð&nþENÉE7?ðgnCääšÝx€6òƱ/ºÑáôûn§=1Egô‘qГü Ñ!?±GÖg ÎØ!v­õ§®ô§úùdÑúûs*PþÞ¬f÷ö;îXÑ3É+Äèp”ƒ~Ó¡@è³ö<}ìþôÿ—í»¢ƒN¢3©T%pä“€ùä·È…É–›| 2ùre!%_ðò —<ƒÐàÆzñÌ'¿Å‰Unr2’G}ù•£|¸åÓ9Ÿ‹ùä÷×ò3ùLè礘927æ ¹ð…ßœf½£ù L?Cæ˜óðæóÕ„ú‡Þ|vð‡>Ÿ¯æó•õg}Y9wd}Y?úÖ#ȹ×d-¡ÁkAÖ"Ý9GáM_‹'6ñå³@þË9_»nëxþéß5î{êÙý}î<;tjp‡Ô&αºë^FöÖX\6¾ÉÛ2ïn†Øå¼s_z´òã¨zcLÿÆšr½á$_8wËÙ¸‡LálšûMûÅCwQÅg©|J~õÙQ’9Úÿâ)çö ×çžâÉ]öøKGæ9<ÞŽß«¡bjÿé_µ¥¨ç@LþL GøúeMÅK~Ÿ¼^\î–¯.JŽ=zû©qo?@GA¯§ÒG^üó£z#¿ó­Yg΃úb}¡BgiÃ|ü³%_Ç^}8rèZcócÓŸ?›H·œ¯/¿½¨¯mýè:X»å‡Üàcòd-‹e­<ÙÎÅ@.¹… ÿTÎç/Ùðġ¬]}öñ„чNY:õÉ¢[·rd€1ÞÌ\â#K #¾ákeáC£rÔKøØ€§;ñó5¾‡?6³Yt~³gIÈF9¾àÁ¯¾è„£7óžÌ?È€©øÜÜd€+}äùÉŽ#>áãϵW /ß"ƒ7ù ŽL€-¸È™W|r>õ~4rñ5ºðÇHþ‚O ÏfæŒ}øä¬À?Ž\må›Û“l÷+®;ïØ‡ß•Ó9$ÍïøO8á„NÜ÷Þýãu×¾q¼å®÷ÔUñÅKæ“ß|ò³ÐEžEoýÌ'¿ùä÷¥N~Ö ž€bNÖhÖT¾üð¹ …Ç TgÝáqÀ‘Ï‘/¥ù|5Ÿ¯¾žÎW÷'çŸù¬qî÷Ç|Ÿû|M?sùìªV9$Ç6i õ9ô án2ðYô¹´ñ^m<—ŸÕ¾Ë\}€§¿Yèñ¹.œ })_<=P…þn»Í$wñû‚Cñz½¡h9?¤í—ãÑUºéØUmÿ\€žçö¢±7e/}w¿ûÂAÙ´ÁÆð¹AKr@¿® 3\ô6OÑü–èÈyK¿ã/š‚QŸ=òÍS¸ôãklaaŸ½’ã«ùNÑ[ÊzÓÜê0~VÞ»€­éfGL}¡ô…Þq– _Ê;l8¢‹/ýˆ<óQ:ð¯¯ÂÕ¦¾yéå_ç¨ôÉ“‹. ÐÃŸŽ¿ô‚­c›ù ÿa§ç­ò19Z>ɹ9Ê<ɯ¾x= ôÄ>4úØËwVÏmÉÒÐîí ¼Ãç)ß™d莱]™[´øMŽNc<€^þ$VøÄ…N>ºðÅ÷ØÄ?ÒÒ©ÝÑ»Úô£Ÿ ~ c>£›³ä,ºâ{xØ\tÆc¦:é‰ÿðø©Nxóƒ?Zxà莼âå+\øáã¿>0]YbŠ ½ÆÖc€þé8xmŸ-º«f€3 qLbŽ=öØðß9òiãן3þì–·Œ+ö\½š8¶X‚LÒÉЧ¸$> Œ¼¾_›I_Ûâ‰}ÉžO~óÉ/`mÀÉڱƬ›´Y›Z¸¬I²YdÉÌ'¿Cwò[›çä;Ÿç̇ϴó0 sf~‚ÓNç_ä´ù¢‰þ¬ãù|µÿ M“´òª&—ÎËò¦ùO_®óYÊ 9<ù<áÕ×úÍKdáBÓ§‡>txk$ºÐƒü_/ÅÚæ}GoÜò˜ñ­g~ã8ù¤“lj'ž8Ž9æ˜U¡3¹:T`îýèu)µQ´áì;æ³æÊàÉæ~ñ©®5Tü½¹,þ™ÓþœïÞªcü¦ÜK÷€ßÛè—¢ÅïÃkl¾ÙõÛë ï4ξCMÆš­u•ºÂ…”‡½šKGoè­u믎¾k^rìò1²|övþÄ­ ÐÕwùK?=j)wñú\c½Ö¸õ+(kíöÚ.ÝüK>køÅ±jÑÈ—Þ¾ØP6û¢BùkÓ ä–_[áÐé “ž|NøË–ÏNôÃ%÷­«äºåGuøÚO Ô¸7æ¥ß_Uˆ.¼‹¶ì±ëè&Ö8>à™úTm=ðü§Ÿ\äbztëjƒ¿<¹h¾ÿôA懀œ¸ò݃¼µh͇mòšllËA€žÈÁeý±éð›=@&~vþ—k ²xâ#^Çø–8<í›;ÐìYËüa _æ’>¾“‹Ïlã‹xѵSã\tÄ>YvÑfíâÉ_áŒé6/ôÁ9ØåHLlO_h|¢+úÑ'Ýñ;:µxð¦/?ø‚Oܱ5³ÅŸØ/dAt¡›x<ô“ Ÿ˜2Gñ‹<94»ôÑ­@ ;àé%oíÈ{ÖŠµ>~9ØÍwEòŸõ§þá¯ìDG>cìÑ'€'9Ö:¦¸i ä\ˆ)>'ôf}ᾪèM~‚ûRíôÏòmÞ|ôdïlO7û83i_Pj ! Ë£2YîÜž{ü9ãªíŸ—ÜñÑqÕîkÆöõ·Û÷ÝYo„]L,Þ,.“’ða>ùÍ'?K-”|Ààô­ë'øéú!3ûå$¤N΢ Í„Ç3]Ÿø‚§Û•œ> F Ä.}tk§@èøœ,¾ÞO~ÓùIþ’_ùÏ‘|æ0ó‚nNòŽ ãä˜Ì\¬ííŸfÍÅÚâ¼aÝXY7>‹ùœ¢Á[cÖTŠŒ¬µ¬O<Áég ?=?‘™ŽÙÊyC?¾Ñ…–µŽç‹¯ì”×Õ)éÄõÛÆ}Ž8exœpÜ ý?Ëó^ŸzG< ÿÈMþd[¿Ñ6}±o³ÚÚ¿xýíú]•ûJnÿ¶Ý™7sÑwÖ‹ŽÏŸ¾“-¹¢Ë朮ޔÝï¿?ÐÉ4TŽm’mØÝùf§}]ʰçñz›Ë~ `á½0îÈâå·»zd+‰½Q§“í[á{S ÉfùÐë¡t ûƒõÄŸ|¸ÃDZò±Åë-Üe×oÝé½áÅ+¦¢u¼…oùÂõÓÕŠ4¶ÙµÖ2çtõÓ|*?§«s-â"¿œ+ºåˆ-&Ș2«÷S þØì÷SÅoAè2§™C1öQ:úÂDñÈIÑñ¢±iN´äàüÔ ühü>\Àg±²+^9IŽÛh9ð‚¿ÖnÇ/q°MŽ-üðÆ™ÃØ$Ïfxð;ü騸»ô’7Æ/V‡\Ä}äãC|CçÚØ?^|püæÈÚ‰>|€~2‰aê+¹ØÅoÌ߬}òŽnvƒƒ'ˇĢå;~4¼pÆðÑ¡•-[èä*1Ѓö§9‚÷¹ñ½á³ƒhÉQìGŸ>½l,˜ï€‹_:“{'oèÇÈÁƒÁ Z’$Ɔß]w xÇyÁ%ñ‚ûß¶ýoáàœ¯ ÌŸÇ/>Ws~¾x~¾F©¾£¾£}7+h|?Ûà; î (ð¤Ð9œávq£ ªgSÙ¶)Têôf¿|°!µÓÚÔV5ÔwŠù”‚φpŠ%‡0ýjñ€¾_¸ÎEŠgüESšöÏ*GJ'^þxò yK½Ò›æ¢ÛðõcöòZúäŒÕ›lOeÕ>xè­¯úâ²éÎ&²Ä›GÜì»xàÂB—e³ˆö]h𤂘ÙsÁDnúÎ:ÙÒű§ÚZÑ–~ ó¥7ë ÓeAÛ1•_è6îbkÅ g ‘WuÈ ™?Ÿm½d×Γ™1QqÄÇ¥@Ï­\õ‹Ù-Ÿ{®*V{•Ïâé¼Ò]¶°a~Ø÷¹ISÔ‹«ç¡|HAŸ¢Øˆ=}þÅ×Ì:M~¤O^<±Þ1õ_Ö#þ¬“©¯úì:ÑÁ/Gâ‚‹}¾b3~°}É5|ü¢3:ð>=@mšxcÀ^ìÐ O'h™³f^òãA×’%âKtãAχ?ºµÁ%&²Éº±ƒ‘7½Y£Súx¬ýÐÈ;ÈñÕOnå+ë&<ÆSY>“×ò+±ë³I/ž@hÁ£‘5&zâŠN-øCoæ”<¯~øÐáñkã‹6²lÇÿÄEŒ½ôO|â£qxø^-]ÑoÌn|#눮Vr€ÿ9ù ÿÖ-Ÿÿçø¢¦7üËœW­ºÜ‘Ä$ׇ‰ÓŸBÂU¾N`¬|fœ30g`ÎÀœ9s¾ì ¤¸Èw³ïé %Œ#ßã_¶¡LqÕ¶ªv°Q,ËM~Aî°÷Ø ×w¾‹Þ›=¼Ký½q-¼ÇÑmúÕ ˜e!eÓÚ˜â®b«â£í°×Oà­Ã[æm:•ÖÙ(’ãŸ6Å¿•íÆü°éã¦AÓóE G>xþ—¾±7كȘ#ñ*Ðrמ]wËs ªÛ¾Ëî-û|Iü|ê÷ð½ü¸»ô(<]qE ÌzmÎå‚]qï[ΟxJ×Ë'\\ðDFç³tðÛŸ{\ø¾«_úÀ£°ÖzZÃïëÙ)x£Wk=‚ÎkñorqaégÏ{S¶z^‹§ŒÝ³X^Ú^²òF,ŽÎ¥y)¿Õ½™‹ïðâL>´äÐñ†ßT\Ö_ìá‡ÏÝÓâ5f§óXüptøkm˜<ètk鎼q 6b;¬ÈôÚ-~müB›æÂüƽ‰ŸîÈÇ¿œŸèƒÇƒ7:øŽÕÚ-œ yüñMþÇçÄÛ¡kÙ´èâMÑ@ôjï±vˆslrËN€ÐÉiðôÇo¶“x~ľÖÅ“øO?~òOâÕÒ‡.o úÉâÕò—kSŸõ£¯~b /]p8-ÝxûðñMôñÀƒ©¬1zúÅŠ×v¾&ÖäCë ‡]t@Ƙ-@glêðÃǦ\È‹qü¥;úéĦŸ5ƒÛ‰=¶´ñ9¶¤ÝpÄâ)¼Gµø9ѽÉíçšPׯßè}@]ÁŠã±Ø]]DPŠo†9sæ ̘30gàðe …ïç|7§àƒ >|‡Ï“ýšSLïÆWñÐw­Ýѵٴå§"NU’ j¿8¯èåxdz® «¾h ö¨ºC?›Sr½Y-›bðýÈ~µ6ÆlzÔ¼‹2õKÙÍÓ³’ƒ³áTËÀ¥ÖÑÚÀò¨lî![>ÔB¹c¿w²I韔ŽÈ‰Ñæ¾}³É(9в•XØW\‹±ý)ž*ÂÚO?opç¾ ±ã³Á§Ç¶¿ô—¹•Ç~Ûý²O/Coìé)½¹A.wøù‡ÏüÒå¾5ùžƒ¥Žr¦s‰< íCÑäØAz’?-_ú:ÖÂÓa­tLÕ¢2‡ ÚFùk]Å;ÿ͵Á6>÷Ú]ÆÐù(<ü¼äñ§ŸXèðddÙ”u /Ÿl|ä’ã{[»¡·@ý3•åSÞS¼ìðnôØ@OøË7›M:ð$.´è Ž> çpÆÚèhbýCx§þÇ&¾ðÀe2‡ký ŒЩ¯%Äy!žŒ~¸øˆ¦®È²yt}<èhúæaj3ºc Þ¬t4øØOr çð‰›-\ržø¼ÅW¶ØÀ-Þ\(Òç7^@–Lì¤EÓ?XX7Ù³ïÝ»¼ð}/JÚz_ žãÔuPÝ©ó‚ì4±IðA)™ç ̘30g`ÎÀœ¯(ù~ž¶_‘Â/SØÖæ\i¨ärG»ïúVádSݵCáªê±GìùÜwü«ßEXéêŠÈô¦±p(ð½Ù]0õæÈ×ïÆ#£ÄRÆÚ8}8Gß¡+U¥µxøAÖ¦¼Œö¦œÏ.P€Ðñ|}w½Æ¹ÈÐ/ö_¿œt{Ú@¬øÜ ·!ߤ†Ò/6Š·èÉWŠö bëß²—^~Ô?cÙò¡/&…/è<•ÎþÉDÕj|á7ýÍW-{GÚô,yñ¹` ¿.¦¬¯¾ùÈS ´ÓãBƒ¼Ñ—£s!žâÙ]…3|Š÷ýÜ@IDATá¶[cE6¿­}~¤ðžÖ§ìE´ó|<\ ¶í3_—ö²9@ç“yé<–3üÃß¹šÈDGdŒVn¹SK'Ú”ŸÎµ`íâ ìÂñ…¼¼NíðÕØð‰-ùÕ&Ftc16ðEVŽxô³qŽ®Ü%%“~òˆDgü >v¦›*ñÀ'/Ú©]:‚£;9H^ŒžþÜ/ó[ÉþÂßcí–Ïl~ëó—~|>ã6¢#1á£s³>Ùè‰âdÂO^˜òÁÓÃs!w‰¼è|3Fs±ÍøŠÇ-¹LÌtÆ—©±‹_ßA°‡wJƒïóá?Õ‰?ë(z“ÛèàZäôã«˜×æ-<Ø´¡ÑE/=ðÑ?µ‰‡o‰Ý‚óä “õ/xýäB{0=dvî\<-voò½ºû 섺ñÈ{ÿ~–îrü`?`å3ãœ9sæ ̘3ð5—Õ†²<·µQUjmôÞ¼n¼·Šë~@!´,Êúâ@•hÙ„+Ä µG )Å–‹¶ØxÐ]ðúë —»ú)ìÐúEs Ü*Èl!éPŽ‘Á×ï(Zë¡›úÊGCň?…,ÓGìÔ)Üè.æ…ÒAwâ¦ÏÅ…uåoç¦Zv§¼öÆ|Y@’õ2@vûå‡%Ï6þÈ+€Ûå6ËØö‚0ùêb·d;ÎÒ+~ ¸_ÛcsÙ76w}c©úýŽ€òùh›Q…6]5¦ðÛYênBõÅ–8éÍÊm?±Pºšãp|çT¯ó»œ4yRØÃ9ÄÄ×ÌoË›ãôЬ`œV,d៮]<æ/|d²¹ˆÝÈÄ?2€^¼äAôáó™ÍšC#G@×'+fŸñÑ+n-ht‘AÏÆwêžø…7zÈçü‘XñÒÅv惮èEÀ—Xñ;àù鈮ÈNýÀ‡?1áá›qôð™xõµ6ññטO€>Ûht²«?Õ[p{÷.æšÌÎ]ûÿâÞZ½8Â@&bãÆýW¡Ö Ìã9sæ ̘30g`ÎÀ—ªÕHj‘¾âG᪌ë?­W…“ÚÄÛ×÷ÝÛêAêH¼ýB·’-« ;|_P¨Âªu—8ÀNZ ”Jt÷£ëէ߆³> X¬q9Ú/ ´±ôº.æ‚E³au×Úx›\<]~-‹BE›¬ºã=ÝdãåºíA·ÅŸÂOëI­Ÿð©+}U¸­þT` Nùtë¾ú«w”R°ÊóU|æ›1?VEmÙè 1Õ*XÛßʧRÀ²“»ÏlçâŒÇý=\aC~ÍÙÎ*xcƒM5(}7®pæ ç¾ôØlOçÇ_M ‹<ß{ƒR<‡ Äk^ØIÞsÁÂÚÈ]DþðËÄ?1ò3ùÓ§ÇÈ…øáÐÁÛ(º’#}@Žý¬ØgnþÚXÐb#2ülÒÛäÂCFJ?\üÇCßô‘ôèÃàKâ^¸^»ÅÄwz:^cºÓý‰MŸ-:´Áã5vÞA£#s#WÙ´ÅçäÌ|Ò¼–œ#~âÁO/ºMËŽL|Äo~ñ?íó•Yc|ŒœüÐÐ'OÖ*Ùä hñÆ'>èó¿ƒ 8}OÖ>>ôÐý±% /ñ_rŸ9cÇoáG?=dàlÇ&:@ç/]Óœ„Æw2làÃ/öÑèâ{tGV‹ÄžÖ<Ñ£}ìÐ_ÍA'žƒ…Ø%·{×þ'‚ÖêYd¾°Œs 9oø;ó?sæ ̘30g`ÎÀ¡Í€ÂƆ}wÝ!²ÉT쯽ªžÞ`rQ<ÖØ&OaÔ›EQl6Úû o³×b¯ú6í}`YxÑ‘ÂL!¥(T±GŸC1×WÑmJÉØÇwÔï.Ù¾(@¶täÎôj³_ºÈŠGl6÷î¨óMÙPz³ÁW¬²¾*ôÊŽl.>$/üä»/ÞÂLûI>ñ²G^Üp{kSã®<Ý­·ú.ŠðµõU Ú/¹¨±5³ÓO6”>q“;Ú]ÑŠ«7Þ…³±ßm#Tüùk}ç´|—“²ìÙfdàå]¾è–+þò±ã*½‰¡WIñÃ8¢Ž]Ëøùã§É ݱ'¦C ríe†ìä€ãwl›3c~ðK.ŒÅ>4ï ÄÀËK¯Â³a /}áIÎ耋þøËN6]úthñeiœ}Atàë5²ô•þäžN€ ÇW}<øùGŸ=¶Ð¡“G¿Ñ!çüŠÍàébC9cà=øáØ7Ö‡“ïÓg7¹œêZòdù‚Ÿ|âŠ,»Ó~_Ü,ÙÈ'~zðEOôŠ5qÄG4óCþ©ÌZû|’ G.Àð‰Nr™#}<øé]lâDcÊÃÿ´døŒƒ#¢\xÐèD¦1¡2| ΟŽ¿èúh}<ñƒ>²É[Ó˜Éd=ê“úS^ý)¯üMc‰NyáƒXµò ÈOýÄ—œ4Ó—ñ_V~_BWgg˜30g`ÎÀœ9sæ ò TÝvçí·÷↓ÚÃ&dCçN¹ §Â¬ªµæË†Iñ¦ÈíG«ßw½«sÇÕÖ)›KÅ—‚J!ÕÅÔ²Ð#Ÿ"ŒMãð±eck _]ë Ÿb¬_ìWEUŠï¾s^ Š?`ãªïîöÎâƒe?»‰±/X o?æ^to£OõÅ>9À¹è—üÕ˜®ŒhtÈ .šÈ¦> QôÞ°×Xˆ%ºþ+ž#‹ÞvkLÞfZN妯_<äðØ¼›?}$¼ lÙ]-?ŒñðY’‡¾RríkÑZ ¾’ë§+J =7Å$×€n9Q¨ï¬ âŸÖ´ÍtÿùÜç>×–²Ñ‹jkÎ<ñEËO8›Çøl£7ýstÉÆæÔ!nzÌaôÉ sÊ9øè ŸùÎFF‹N'Ð'ã‚Z䬧ē9à Ç/‡~øÄ8»è擸ØgYxòZ:à"¯wµv‹_@w朼ôÄwcG|íÏmÍI>7äÑÌš>}ìÓÁ>mtêƒ)1|hô;À4ºùƒ¦yÒïÆÖFüæß|âZb‘#}çG²èÆdè£_?<èá‰.ú’ßä%2h±›<Ð;µ‡7ùˆNúà§cëmšëäYަ>“ZvÐéqÀ᥋hl›€ÈEìk§G|‚  6,ÎärN¼7« ¿?“àü sæ ̘30g`ÎÀœÃ‘uwis÷ž ?›ÆÞ¬- G…"ȆOQUÕUoŠÝe¯Ê«q]DU¿7¦ô”ŽÞDW‹‡w‘»P+úê‚‚‚ºtöf¸Úl<ù¤Rà±­ˆ‹^6àÔK̓¹Æ6¤ÍWþ¶î¡óØäza 9tñ*Ò£»øžZðþ‚ ¤7Õm«pJŽ.¼ôõcþåSë,<ûmcYlâ#ÛöKÞ “#1—¢Ö…n£/âîW‘œPçªh.ÀÐ×›ôjùI—’¸}¯~6û]“©Ã|‘ñ´Ý]¬—Œ³ÏçÈãÏ º£Ç…øµ~öÕWp“q‘‚‡ :î²Øò¬o^Óf³‘\⃋L¯ç‰#8<øé½vų´'pÑÉ==7˼èƒä(k7zåiºvÃK/Y|Ñk££1:^U-¿è_ìà#^þà5¶1"c?µpž,\|IŽØ 6vôù›øè"zìÑG—ƒ ›6~ã…ÓÆn|XKã?´‘¡D7¶á™Æ;Í3Ÿãoæ/œ1^›Tº’O¾‰ûè ^ëˆÎÐè¦ðo6«ðÑþf¬¦x1v§¾&F4}|ì;ØâÖñ12ÆæˆŒ8áb-zõs'¹ ŸÏ€œ>|t»X%ÿþŒ£>Ýì%§Æ9ØŠíÈ'>ù£› 8s£¥'öéÍz€‹>:õñ·…à>ŽÛvlºŸ×öÊÈ䆺oßâD“ñÜΘ30g`ÎÀœ9s¾Ò (xtUdõfMTÅ‘GÈS}Ø$…PËT±fn£j;§TtÙ<Ú<·Dõ‹Ø<Š-Å•MzoÑÈ:–|맯ú칸@o_%Ûá’Q¸uÁI¾ètÄFë,{;*&¾àkЧ7±ì±ÏFñ.kÌîb ÃõÅ#Øå@ûÒ9!KgÅÒE:_K¿§ àýŒAŒr#Þø­/ÇtÜU¼6gÉ›»õ^üÄ*n¾ñ[.GÓÐ ôÅ× Æ%¯¼ár!‚®údäd_4(œÉ7­|ͼÐÝñ–Œ<Ë`ƒN³¸§ä³¹ÐW„¶ÙOXÍà 6òËŽ"Ÿo±©utÞÊ ´Î›|-i|[‹N+Nó-xtÁ9¢O¾óS¼Æúpd³véˆÝ¬]8|y ÞàÄt’Éa옂¼Dr`Lœ¼éǧiŸ>cü6¸ÆZ›)²mº&ôÙÈ|èçà»hãoÖ9<^:Ðó‘;À&ºµxàÈD0øÑ §Ÿ¹I O—±–í@pÆY艑-:ã‹œÙøá NËèˆ,š<ÆŽ|Ð<Ý v´¡ëgà§3¼±)§lЙ?Y›yëÏxÉ%7É)~¸è4ÖO>é] ÖJèZßÈ9â;ÙàáøÝðŽäÞã»–n¾rQfj}ê'='wìÇVth»uË–ëqÇm[õ×vz•&À©kçñœ9sæ ̘30gà+Í€ÍO=YhÓêΰÍbUAýB7¥fjÕYEî´FQ<¥8´Qì;ýRÔ•|UeM'oƒÝ¿·/rž°6Ýä{Ã_c}5P¿L®Æ6ÑÝŸµ£/ìÛDÛ`Ã)àЛÉÛ›ø¢í-~¶øb“¾ž\ÅKξ7Ì%Þ fÊ÷/ÿ‹f9³©ïM~éò§ðªr]øR4ºÑûîsÉÈ©òÔuíö¿Æy?5Ä¢ØLîl°ûîxéPŒÊk~æÉçŽW»ô¹T¶¼¢¼yË®b=ùBoZµdènŠøâ“e¹j(½tCÇá)¬…–‘÷’‡3_ŽšÖ+ŽÞ$ÐWãÃÞW°«6¡ t›¶±¸³¬G6ò€7øÈ‘Mná¢#trp¹;ÕA.›#ö­£ŒÉd.àùAýΩËyA즅‹?|>6éÌÆ¾Pìã¡¡Ó_èvð%¾£e3…W~3Öò?ùˆlìD/›½v«%ðäˆÏðɉ>[ÉÞø6ÕÍ~bä#¿o|¤'‡lê;ðŠƒ>²p‰ y<ÚèáA#C^É„Θ^l€t¢¼üÔ¢Óã"C.¼àá§Kj›¾ø_àÒ§C®ÙhÆlñ“z#ƒF¼VœS¸ >Š…ôÆWýø˜Xµ€<>Ö^¾F'>>ÀÓ­uLé|ŠÜÔ'v2N ±«æÅø@ kï–Éæ­loø9pÊÉ'ë?{CÓóAYË<ç ̘30g`ÎÀœ9_iÔ«(ò†|5‡B¥-|o’«µ©ÓWÆe“i3[ÕTo‚³‘'›¢KA¥àê ã²€ M±g£Ý›õ¢±Ïƺ²kÓÛ´e±©€Ë¦²ª´Þl²çq{xÁÓëøÙî‚®x:&:“ÅC8<ʯL—§øKÎæ×Ëðö‘)hþâ­ê³Ç6ßìuñ[2|¤‹ï…XĶ”g_ø £ú#/GTA«Üç[üÌO<Ùöoi>Å+YEgô¸SÜsT¶\„À·âe£@®ûÏ-*¨¥§ã)~>²!/ÚÎð'¯ýÓ ºè)?ñzý%…à b±9±n­§ÜZ~ð‡ÿÓ˜[6üË&P?ñâËZÐïØKÈÝÃèeodá§cýèb—=>‡‡œ°ñÉ1x²9K¾ñÓÚlÜ£3üÆò]ƉUŸžè#ã /ºÃyüÉ;~4¾ó™ðphé'Žä~ªÇÚMLba_.è¥hsΚê§+ùÂCV‹'|tÓ‡-¹Œ^v|údÆÖy>G›þF&:ðÄv| .¶Éò_ôF÷U ãEÇLj]}£àù‰ÏlÁác-€îå{ôÇ}púøù´ñy­-c¼dŸõlLgðtáÍ<%îˆäãÞØ†øÑ¥MÅjyüäå.:‹í``ÝúE®Éäâì½É÷†ᤓN\mø3™÷&0ãæ Ì˜30g`ÎÀœ9_IÔ6äŠzÅÞQÅ,¥½É/PXƒ.iŠ×FÏ]誮ºXêߥ/y[¶Š9u÷&·ô*¤zCL®ô°ÕEUé°Þ\ÅVû²,èm|ʆ²•_rU. Ð¥®Þ¸§@+ñ´KßR¼í±/Û|ÚzôQãŒm›ÆU7Ý>v²/<,ib‡ßÓt‰IÊ÷Þ”‹µü;¢Š¼³NÜZo§_7®½­øëo1{ê *ËæÕz2ÁöÁS αìt¡ŠZÅ‘ßϳåI„£.|d ÝE­Í|žH.ñÈqóÕ?.t¿ðhâ‘#s ®ŽUÑ[s—B7…vŠWcú]¬°Éõó„~`á²Á`77=ñ£8Äÿôz©9R¬óëözeî¾÷z.µY»Ì‡_<ò¿š¥b±9Àg^‘Ã"&›ðîæ±Oì‰?ºù9xr€m¸ŒéèuVzؼøÐ§>eÓláç^6±âí¹4Ÿu°G6-9x@>ò‰Gp|Ñ&¶¨èrA>²hðü‰‘ǃ†?€ˆ~íTgäáèü¤Kn2¦Ýf/9c¾Ä2áÓœÃø#/xÑÑÓqîÈÇ'49y‹Ït²Y­ñT/GæS æ#¹dÏAO6¸úè±A?>'žø'y™Æ• ìÂó/ó¯ŸÐØŠOøÓÇ^-?²–ŒÉòKßïøã³vºÎ#>GGì$dùd è ¯Ö\‘Ç}t„¿…àŸéŸâcï ÁjÃì±Ç¬xvïÞ¿ÐWȹ3g`ÎÀœ9sæ Ì8ð¨½ÇæÝ•¶Ñ¬÷ð¾ë¬àR”-7Š,‘"©=¯IQ—MLß=¯qÿ)¼âCWL) l´ñ‚V6µUiuá—° ´â³ ÏOPìò=øÖV´ßxÎÇ•µyÿù×^26ò³dmÌäî[óïòÇgž0Î=åØÞ¬{WÒ'oüܸì3·ŒW¾ãcãƒWßÔ¾áï¢oRHî«<ØàY›ûïÿ¦oè™ãì¶Ö]ôýÅ ÿå­rñÕåcG×ñÊñ/}×cÆIÇÔÛâaëÿE:ê1ìÊÓ5·Ü9®ºñ¶ñöv|øÚ[;_ýŽ‚òA.€ÈEç¯Æ..Àɉh] ûõŠÚêË­8Œ V›ýâ£ÿ¨ò«”..æ-þ\HÛÿ¥¶ò¢BúèÏ&Á(¬¶hnÁü‡n¶Í•õøa,GZ›$<ÙœôÚ)¹ÎWå ÿjí.ñø³n³vÅïûeŒÆlL×.:Û‰}ºvñ¯–|ó…}s Ðâ{æ~ÊÏV柱ÐàÐÎÿ‡Ï§?ùodÑõÚ0S¢ZÌ‹‹±–·þÄóZþ‰?÷«ãº‹Þ>®|Í­üOþé?\Ö'|ò‡ÿáéÖâO<èüÎÆÞ8ºÃO&:ðê'ÇÚäž>€>Õ“ <É=ìÿt?isñ¯þ»þ¾§ "½òÈ/Ç…ÿòçÆ1gœÕù”ö©Ú»÷îw^wí¸ýš«Æuïyç¸å²K™ú¼˜wl„'~³‰Ç˜n~ëó„n}À%YÿÆ'?öIãÿðyãíÿì‡Æ¾Ý‹§J²NbrË0¦Ÿ>>`ìpq¿õÏ5¹åO|Æ“ùK›˜ØÀ èG7fƒ<¿ñ8\€Ðâ±"ƒoš¿ä?]|pɼ–|ÑÓÌð§0_LvµáO¢ Å©(˜Û9sæ ̘30g`ÎÀ¡Ê@KUÜä.y•UDù»ô¹#Ÿ—/5Ob¶·6…6› £<žÞERáÈõoö—Åi DMÀf<…ZŠhÅV %:Ùë;õe­ D­mWxðÇzQø‡—.2.4<å§Ÿý{wíÞ[êëÇï½ûã£×mg¿yœÚqã[rÆxÚ ÎÿîO/ÿã}Wv ¶ Ê?@½=}ÛxÑß»pœy–ñ¦\7þû{?U ¶×]üQº¶Œ§?òìñožqáxÖãÎÏû­7{*Þ’oßËŸ~|éY7ÞzùußþmÖ1Go¬‹[Æ·]pæøÑo¹`üÁEWŒ—¼æâÅK峊Pú®~éSÈöãø…ã›ÜvvÕÁW‡<&§¬Éiøo>ŠÍؼíY>¢Þ¹+ ŸM¸È÷Z)~ù=Â&a™«æ¯ðùýá‚Þì•Mvéñ‡Æü]­ÝâK<ð½nËï´pÖ¡uI_tfíëãËÚ—'àåÀÃ–Í ~þ„=ÆúâH½ŸÍ]tðOŸ~zAæ"<¬Ðxc-òwÞðÙqë§®èµNφzÁÜéßô´që—[>ú¡^ðÀ¿tñ}Ûyç·,]èñ-qœ˜’ ýláØÇ9öôñ%V-ýôðké  àƒÓÆfhü .òY+h½Žª=ö¾÷ï xáùÈ9¾é<ÇŸ÷ cÓ‰'kßþÆ{ämæ£ÇѧÞgÜçIß<ô}?<®þó׎÷ýÒ‹ú§3ì±éÓKWò—¸Ù OüÆôóÑ‹lð=7ÛŽ'<è¡ý¹ÎÓ;t9€Gç#ÖÚã ^´äÎ8ë6¾ñ '.:Í}Îóð€]ºŒµ±­…ÓÒ#6y>è›?›~À.\lêã oðZ {ÛZùøØÌøÏÍ·l_qz͂Ն±l{ê*Ñ sæ ̘30g`ÎÀœCõFßÉU$WÁ•¢G‰í®oä«oï@o «Hó;ûÔ*pþ.ý®e©PJQ¥íªpîn÷ïºñÕ±nY Ýå‰E"²ð Æ.ÌJ¯Õ†ŠœŸÐ=-ó`k¤ÅÏAÅŸB/vÅõÌ Ï/üÛ—\}óø©ß»hܶ£í_~6ëo¸ìÚñŠ·]>þõw<¬6ëî»ö/ýóuAJ­ÂÐqÂÖMãeß÷PãG_ùÎñî_×ýÄû®ÒùÇïýäxÆ£Î?ûŽ—<ó±ãÇ_õŽæ±)®ºÿÉ>7^ôê÷uœüä¿8õO;nëø—çÑ}Áàòën¿ÿî+6ê_:ðÒã1}ü}-hV…såÀÆ_>{Nð¸CV²žä ïiëË™Ü'Ž^ÆK›ø\`1¶&<ñÑsT8"ö”ëK‡-Ùëü.ç¡Ð‡6Qéå]K>ƒÿÉ|ØX€¬ ´š5ø^ñáƒËçBîtw€³©€ÏÚEƒ7§ZÈäâr±ý±K†èúÁãK?¾$46£=²×¼ñÏÆµoþŸ=¿ « ÿgÞñæñáß~Y»•˜â#[R¦ D'ÿ<~ Äo#F> ßk¢|KŽ:ë7ñE§øGWre¬Ÿ "æ„=²S{™+6Ù0ÖÆzôÉS|+d»Zâ ¿1^c`¼ã³×¿úùÓ~ñ{ GlÞ2öÃ?5î÷ß9¶âcããð_›Ì.=Ñ/²b³F¬áЧ¶È‘‰>9ËÄ'/YkáÕâ¡ONÈ$whð±ÉÞèv€¯ñ ïÚ~æ… Ýäñà%ýìó=ƒØä>øÌ§1½ô‘ ?]dŒ§vc/ 'ñOýAÃãˆox“/ô…íÛo]±ÞyÇâ3±BL:« ÿ¦½{8á›»sæ ̘30g`ÎÀœ¯8ÊVÅTQgsm#—òb(§òÏ&Ý&±*¹ÞÌ{[½â ôoÃy=Zܹë·ÙW±¦¢kgÝé;þÅçŠM ðR¬)ÊðÒÑ ǾânZ0âi(F¼)æZGѶm>jüÓoyȸè7ŒòÊ·u‡ Ó[FZîλvñÕûÆ÷ÖcÿrÉÕãõ¨ÿD¡xñÿäÓ.›7nßýò7_ssëIa¨¥ÏÓ ÿßû¯<õØñœ'ÕÏê‰ÄÚç/¤ZŸ<Ð RÜÞºsïxá]4zæñ㻟pÞøÝw\Þ<ô;ð;¦Å«bWÙ/ ÄSyr¡£Ýù*Õfœ\ž0}'ªøÊžK¾˜ƒÄÃÇÝ5WÙêyÂÀfÞ¸yʶ–^OoX+ú…\<ÍQíá~N¯6×ìëƒôÛ§Ë3šC³H‘O'ž@xÅè0¶IÁgÚ”~Áµ»ÔO~k—n‡1}`º2¿høb3þ†ŸíÈ£éçè£Ë:Á[wù¼pLЧ¾â‰mËOü‰Í^ƒ“MU6rñeª‡¬ù@#§Mþáù ä à‡Óº«‹×=4¾ä~¶AâÏS›|HœtÄo8>á||ŒMú£åù:É÷ÿÊÏü°ñ€ðœÕ†Ÿ/xر~Èç%uâšn\ñ±Ãvì“g'>jÓ¯/Üúu‹\Æ×ÈÒ+&>hÙÅ“ÜÄfÖ úèÆës††?@†Þ¬sºƒƒ O'y}º§1Á“ èÇVæ^îÈ&_¡³+~@'Èg–M {ü‰ Ÿn¯Ÿ8n¾å–t?¯]]vT2œ˜aÎÀœ9sæ ̘3p¨3P[„UQ¥l³YÛ]››ÀÞ¸Uáäey #wv»&©~?®¿,–WÅд~kŠ&²Zrhønp)àR¤¥3vš=ü ×w(ŒSÌúyor*€~´|RÐU…8žûä ËÿÇ¿¼¬6ÝÅSEœxø´º!Îe¿ñ¦ô†ø‡žú }AŸüîÿé8{üÅe׌^»}U`ÛäóŸòÑvÿ¨õßþ°³›Öù+|ý_°ÈCÇJ¾|Þ¼ysßyW,ßy×Îñþ+o¨—ÓC´bv(råª7 |+mtóž.b+>¸EÁ_u•Ó.`«ïïEó[9=}ÄŸ|ò©@î¼xúˆ¹«Ã<ÒÅsÈÞªð/ÝòÀNþì¢ñá‚ØgÃüÉCßãôøß9*§ðéóYsY-¹ØÑÂiñ9ÀtíÆ½æÍ86­Ýà2äé‰m`ªŸ~ÒüÃ4¶lÊÐðÑ‘6ùˆ ­y ÐøÈ?r‘…÷“zþªÄIµ‘Ý\Oxi!=ôË!:»pk×î±gÞwl:zsë¥_x6ßçÌqÌýΫ'O/Ld;ó“Ø·n­wf”^øúÀŒ-gœ=NxÈ#ƶ³ïWŸÅæÙÚåžÄÊ'¹¡ÇŸÛ<æœóƦ“OÝ¿v—¾”G;ßüŸÌrÕ祟—ÒÏfìy’æÆKÞ;6â8¢âN^ðXÆë*—›ËŸ#ëñ{þÄÛqÖ˜ÝM/ùcÏ9·Žû÷y‡=ù—z;ÎêOõÉ3{lóß:íCáÅ è£/hpÎSôð…¼Žä:qÓCŽ}º¦|ký ]ë"…6>NõÐeÍä@ïÁÏ\»xú+ãi»ú„O$s†9sæ ̘30g`ÎÀáÈ€ p¿YUÕw†«2ZlxkÜ÷AªSÙð¹(`¨˜ó&~›\"ÏæÑF!›H…–²媵ÁVF¥ƒošB©ŠÂ<ö¯Ÿ ~?JnÌ~Én°áG鈵K3NÞf”MÅ\ g=öþ}wÿÒ«/ãSX¦˜Tüm ÁoÛQ¿Ë¿rü£ÇÝüÒë?8n¼½~RPz}ÎIíëï¾ëŠ–é»ÜeÏ›÷Û÷*®ã3þ+o¼}<çåo;v.ž\'߇ÊY¾¦öS°ƒMÕzßÀú#KèÄ'w)Tóöü¾ÈPºWUðÕAw_(}ýˆ}éðxþ*?å“\ÖD¶NwþÛϲ¡86øéñ@>²-Wúxù•64þ÷Ÿ4¬íp\ìÞµø ýÔÌel‡Æ?›œlbÄ(Ö„xŒñ:î±v‹–uœµ+¦ðЛ~æRßA°QjŸ—¤øÅ¾yçw6>ñ#:ÄÂ[x6ñâeÀ—9#/þè³uÄ’·êvÑð'Óöè“Nø‰ŽSý¸Úô/^îvÇuŸïyñ¿7×ËéØÚóžùœ>^ûìoý¡Ÿgÿoïß¼¿æï>elܳø\ܽþˆqÁþ³qFý¬`ã±ÛZÖŸ‰¼þ¢·K~åÅc÷çn]ùœØ6l=f<èûÿñ8ûiO¯wGljÿì¸ñ³ã£¯üÍñ‰?ùÃŽ#Ä#;a\øüÛqò#Óï. sg=’Õ^3>ð›¿V‹µO!—Ì žÄ/_úôjN;òuÇ–øáÙÞ`]•¬'eЏò턇_8ZüSïpì¸áúñ‰×ü÷qÅïÿvËÒ_1?óÏ_T1–ó,ÏYp.2ìh§s—y&Ã÷þӃşu‚÷pAü¤?ñÄŸ±ùÏ$qÀ%¾Èe퇞 Kääðò_»n¹i¸+þ÷¼`<ù_>.ú™Ÿ¬ç»Û69‰ŽÜz츠6ç÷ÿÛÏWÿÅŸŽ[.ÿðØ[_ö××oÜŸüó¿1¶”ŽË~ë×ÆÍ—¾oì¸ãöqÊC9ü¼2¾ée¯oýÉÛ¯¾r5—.2<þg¹ìž1.~éKÆ ï¿hì»kÇØXOœ÷÷¿».Fü«±«.\óæ7Ü#~/ä{Ò¿Y?™péoüâ¸ùƒ½õÈýñõtÀÏÿ±±åô³ê3`cº8f.Å=ͽœf£+F.ùž®ý€\_/ÍóBÄuûêüX4ssÎ3ž=.øÁŸ×¾ãMワxiÓ)N~äcǃ¾çÇI•ƒ·ü‹©?÷¹XÃ6¼'=è‚ñÄÿZ¿üïâÚÜßT1Ôe÷À‡Œ‡<ïGÆ7ÿ§ßoýç?2î¸òŠU¾Ð|±†}@ 1dŒO Z5nœ¼‘º˜ÐrÎÆ»–F'»dmö§ë͘}-_éÔ§ >ë=-ÿôñ¤Ïvâ!Gáã_3×?è‰+¸øÏLð_ªÍð‰õÞnܯ6üaÔnª+Ù3̘30g`ÎÀœ9sGúm÷U0ÙHÛ¬)ˆ¥¶ë«ØR„ÙÈÙdWeÔ„uU\íT@UáfÃhÃÜÅYV¹Se#‘â°ËÆâM!fl£ª€sÐo[Èúlh»0«¾»æʧÅ×!=%‹ßoÿm†ù·î,{R€­û¼¸cxM»ÂnéPx¦TÜéóçÚ[w4ý~§l}òÆÆU›ÿk·/^ĤHœ™ýç K§ rßm/it‡¢N¶Ø]l³ößMƒC×*47Všæ§n;zü‡ÿùÁŽß{È–Ý.~KÿΚyOÁÚxÅ vwåå­q5Ö†W`lÙ´ôŠ¥Ïw—¾øµÀ=­k‰ïŸl”®\ØtºØ¹î†ø›yçþ™Ã2'Özò‹Ÿÿb×OaoÞ3÷ÜDËÚÍØú  èg £3ù¡“púôó%8-ÿòD>Ÿ²‘L\ZGtg̺ÉûLdíâcN¼qôÄoò 1y’¯ø¤Ï_pÚcž8.ùµ?®xõïµOøwßþáñΟùéñmÿõÕãþuG߆ŸLò¾þÈ ã¬oýŽñ¶Ÿ~Á¸é#l9~áyÄ÷þðØZä¿áùß5îúìµ=tº ð™w½m|Ë+~<ðýÀxÏ/üÛ–ãÃ}žôÔz„ÿáãM?ö}ã¶Ëëg:¥‹ÌÛoïÿ埧=þûο ?@Ìî¤û|¾éÇŸ;v\ûé–×-W}ª}~ê¯þöØzú™}!9!G¿üɇƒ-t­÷ØOË5\æX_~7Ö#ü~Á÷Ûÿßû‹/j:]àxHá¯|Ý«ÇÅõ~Ù^ñÜôáŒÏÖFþ)¿ôòqÞß}ÖøèþNÓÅòðû?Çž;ïoþ‰wÖÓ ‰mg=¥pó%ïO.™GÖ·üÓç¶}:Ù~ޱ»ì°•ù‰<_Åï°¦½ˆQ?kT¼ŽéÏȳ‘?]±›õ—<&O¡Ã³KF?xcÀã>8¼…<1€´=¨Ðñã ˜WøÈ¢6ÖÚ*GîU|µá!\7.9¸W‰/Iwô§Ÿñ—¡nùÏ€ÅÚã«5¤¬Wþ­íµú<ûuø2°vÝ5CÖì´ýjöwöíðe k5kø`‹ŠCêY}lò›võ#ë°F«òéb§7áõÙò(>°ilþeQUL‹—ÅUKÞ&ßFSFOdl#ì·³Eè¾1¼;Þ¦ÖfŸ^›ÜLúòecí“NnC»,#ãh-õOáÞømÒÁ§o¾£m*è\\°!Vʵ¿%›¹ |ì37u{VýɾÌÏÙu‡ÿӷܱÚduœ¥ÏÓÉ ?’º¼Å¼ÃïœûnypÖ [ÇÕ‹Ùm¸{_¿gàäcŽ?ïÔÒ¹¾^Ü÷Wãu—\¹ —6ÒîÒçbŒ8z/WÅ奈lzš½¾›/÷•gv<á‰>¤Ømû¥ÛÉE?9°”Y8¶ÜÌ”>?ÙpA¬Šæâ5t’ÏE?ù`«},ÙÃGå®ã[nƬ…ާòŸ9ÕÇŸ¢žOø2?ä:•ÃèÈ¦ÙÆÅ¦€ŽlPàl†@æ›<}StØÊ&.4›(r k—­è¢ÏÁNôLcIœp6jñ/‘3Φ”¯Æh{‰9>º­]íµQþxmö­s¼pâáÛuõöqÖSŸ¶Ú€£íótJÝ5¿òõ2®¯M,œƒÝͧž>îÿôgŽËþï_;o¸®uðÞÖ½{çøðïüçñ¨Ÿú¿ÆGçåcçÍ7vî] ðøúöåŃÄ(žúk—ã3oý‹qÚ¾©ãÉsó}ϧ=îÉãÿù—Çç®þTûœðÿÎzŒþCÿå×Çã^ø’•ô&òƒ_œò”\ùàUOœÿý?R84œõ™©ÇÕ7pÒ8åQ«Çù—þú/ôæ^ìàüºƒ¿o×îqÉú­~º.\4¹öoç÷óÇåüßF=¤4N*]'Ö…Ž¿zÉ¿·×Ÿ?üÖäžzÚâ#¯ú­ñؾxœTO Üré{›Æ×Ïò=%5H,ìŠ äbFüèŸf•,r›˜{nJ.>‡'Ÿ yÇ¿vÍÂFGx3Ö_øèsÁ|Æ þ²I†M:^@ˆ¼6þðAL€:È9à{--í5Óþ#–)8ÿݬ6ü{&oæ?¢>(‡¦IÞU¿›yûU‹>óþqÙ —OÞ|娻¡Þ¬ºoqÅ-¼ì&!I ±‰'I’%±YäñK>þéäÀKº“‡/B`Âà"g‚3ÙÍPÿHbNôêã'ýdȲ1ÅÓ—ŸhÚØ"«ÏO41ÄÇðëãuÐmŸc Ÿ#þ±ã ;-zÆpdáèJ®è/[táƒKÉ9t_8‘7ÖÞÈe1ÓÕv×ÕÉöˆMãÌcO=õüñø3/¬ãÑUd,Np‰¥þ/þG Žäÿ’ë>4Þñé÷ í'jíîZ_Wí]|I„—Ëò ÄŒçµûµ¿vÝwž…ÝE>œCœ»|ùx´sqÞ®AÉù"w^Zœƒ¬»1ë–oõ]_¿­¬³gÛ9¢6 lú~â ½|qΉOøƒ§»È5ö…Š_a¢»ZßÎï6H çØ…?uªª1û¯ºÓ#®~ÄyéÿÄäïš''‹sf{À‹¶‘Ü¢-Ϋü¦Ë¹— ±ì÷S¼|çëÂßEÎÅjìb<]‹¼™;~(:äz1ËÞ½‹¹Ãk3´qýQãä£ç¿qáéß|¿'S·žÜºäß_+”ÛùÝ·Øø|gÔÄ´ÏTOd6ò6}½±3÷ËïN²ÓòË8ù©;G¾¯ ×ÅOñX·û3Vö}ÿÎ&Ü&Uâ{#^~ôF®äèà[}.¯6OØpÓɾ#ßÓy#ÿÆš[óž;ñlºÛ•yÑv±V²f`Ó¦EsgýþÞ‹”½€nO­“µîlnmºÅÞo¬·ˆ«ï»ˆs_éG>|³Y8aËQão=ì¬ê¡,æà–;w?·cüòë?0^wñ•ãö=sñ‹±uVKŸ‰·ó$Å“¸[Wá€<'.ßæZ´^µ¥·ýZŽó'÷е°]1±[üÀ\Ðe®ä£ÏÕ'ŸÙÉwq âúüÚçŒýk7óйZÆÚñË_—9€Ó‡ >y銮¦DKΦ2B1æƒõ†‡œ1Hþ£Û˜oêÌÐÉ“!Ž7k7zbžt¤Œ¿ÙhÐßñ8Ø‹ßñÉ8u¦>°Ø ¯xâû¢æý¹kÎÑB÷ØòΛn¬ß”onÝl÷¹¥ø¯þ‹×­ò“\žô°GõDŸ~Óë;.±I.Œo«»ÝëëÅ|^äç÷ùd?úªßw¿ò«¹KLbØW5ì¶óÎïÇö£O<÷}ø£‘ÇUuá~¸i|ú||t]\É5>ùÌ“üsî¡;ósd½OàŒ§~kÅÝÉÊãÝcWýŽ~GåÃE„«ÿòÏêwõÛ[gÖæ‰õ¸þuïzËØ[wë]äœÚÔçϵõ„ÂéO|j=qÖ¸íÊOŒÓ󄾘'_üsd®µàÚºØá¼tê#.w|ä½Ïª3bÓØÎœiÙnšCºÄGÿbM’ÃðÐÐè§“-Zpié¡“ZO·à³^é'?|ÁÅvlâÑg -ºCOÞù‡É|†/mèksЂ_䟼Så‹°4i•Y _ È!ÀíwÞ:~ç’?|ùkë‹dñXZèëv/DÆl&apù&ùèðý¥[}úp&†¬K^Æd‚KŒ9á5ÉiÑÉ9ØÌäÒ‹G ´t Çt@Àã d1¤…ÇËWvéŒøñÑ—#|tLýʇÿ§|úô¢å"ÿàäž®iKÆ$p_Hb‰opÉœqôÓëØ¹·Þ¾»o÷¸íæËÇoüÈxÕþxœ°é¸ñ쇦õÅFþkþG¼ÉÁ]õRžWøµã¿]öêñ™;¯oOBç#ÈX.ù0wræÀ´óÚÝÿ…õµ´vwÛDÕFíŠÛ®ÛþÉñÿ~ôõcÓ†£ÆÓø´ñ܇?{œ¾í´ÿåk×ËgØgñC×d¼âý¯ïüÌ{º"X,CŸqŸáÅzÕ.ðûq{¼R¼.,ÎCû Sk›Sº›U|>ÎO‹ó8zùBÇyÁíâ¼AŸÍôî݋ͯ ä²Î]Ê·N«>_èüÝ‘}Ÿ¯Åy >‡`±q_|¦§|‹ ²ïWãñâ¡W,äz|YŒñÄžþ"þE\>ç6: Û6ÜëÖù~0^‹¼ÉÃâ÷ë×/."ȵ¿˜´üÉ þ,úrÆ_:]x^øºSr&Š~.>kŠßûvŒ«ë%pWß~íøË+ß6~á/O9ûqãõ=ãA§<°ôíÿ-ÁÃm¯îR¶­ù±¡W€y!_ßÕ­±ywí^}g‰Lz}ÑQrp6£›ê|eé­«xlòm4Ú>Û¥­³Og‹µVó\t}›|wÒß³_¸@rhc|ÍöÅ…Ó뎺ßÃ>¶eÿï‚רãðhg·¹Fc\sk½à­l’¹¾^æwÆñ‹'Ø öåKŸ™ÎJ׋ÇÜï­ï"8pé§o/øí·uLrèQc-½ý@éÝT…s}Q Õ ™›ÖUú@ð¬zŒ¾Ÿ€(Þä[Û¹*AoÐ o!ï©‹¿ÂÇ7ºðd³ÆaäÃü拽J—vÕü†¿×Qá'´­e¼É9±ÎlÒ’|âçSæ <‡ZlºvõÕZ?uy@húøÑ’s42ðæ#þDÖÝÐâ}©AÑb‡,ýdÒ'ûyƒ:ÚZ_ù²’-ý Ÿ)ýl¡³å saßFv±qE-zôk1ÓÒ}±°¹¸È\»nºa¥«y‹sË™g÷;8Îû®ï­ØŸ çnî”Ù†uKüÖÓN7•M±%¾ õF{çãð Þo©ñ±gß¿/"ì¬ÇûÙá?ðž=õäÃÎÚˆ'vzä’¯pÖÌí×\ÝüÁЈ5:»†,õ·}òŠñç?ø¬U7sºAÎYê›O9­.0¼¶õÉmlL}¾ýÚkZnÛÙçŒ;>}eÿ `GÝÙÏ<ìàOKÇõ]wWåzóigŒ;–"n_Ï‹‹˜›ªö_Ü\œ®3òñY.ŸèïtífÊU| Ž\Ö…~ò¤e?` Α<[+ŽØÅ›ƒl$Nmp‹u¹}Ó‰7~ G/œ#2Ñ?¾ñßè;8rÍSù»ê)ö×Âjÿ« ìØ±8Ád|0m’#Ñö±¿¿òžWŒí;oëdЃîl/èycK€~“dÀK~tšûx™ôè¦+z´&‚.öb'2±]èÁ‘GÚø!Îéd²ˆŸt¤O7ÈàŸÆÁ‡?4²±1õ9ø,.ºù§äþöîü·«¬üÎý~ ÜRƒ\*¡Ø¥Z¤•z¡µ—êÃÔ>Ó:­ŽÖiªÏ(­ö±•âL«ã0#ƒG±€—B©àh¥ ¹B†ÜÍõ$9I8çäœ\æý¼ïïûÿïs& ¹œCý¿Ïý×Zïý}×Úkïµ÷þý~ë>ßнpôuŠ>y|pä€6?჋Ñ…'¼üÞsðöåç?üKËjóÿ£/ü—?í/méo |þñ‡ŸÆþük.\^ùþÿc¹òök:æÑ”uÜdâ'Zú;s÷OÿÜ=xï]Ëo|ümË[?þÛË÷ùß]^öœoù¯6wÍOsOÙ{çÞågßÿšå?\ú;uPÖ_³‘œ #ó7›Ìnö¶ÂÜ5¿ÛŽu'3ïGÞ oÖTŠmDk¥k]%Õün8fCÍ®M‰õÁq““?Ñ|¾Ó‰ÎEÜ;ÅØà˜ß\ÀñcÎt¸!1Ë}³.ñn},²I?@³LñÙÚUiêö=÷Ðõ‹£“,Ÿfsn=›‹º&“oúå<{Žðoü)+Õž<ªáſؙ›ÖÚ9Ï„öšçÅ/~±­öEqüƒ™1=þx|s3„|Æar€Æ6þícîYþËUXÞuÅû—oæ__þÑ þû唓N)¾¹á=œG÷¯¥åÔ=eÓæÞ¹ÃyÃ|• ¯ó ï&aòh«Ÿó×ä´b+W{ì7zzØ+ApÖsB¯õ³ãÉÖÝÕ÷T$¯êCÀmúÉñ§Ç»jß$ï†\¿ž^¼'çÊ xÈ€Ëo¼­k¯æÓ øx|Åf“O‡/þëó¨¸JýÜÇœŽu¹¦> `# w]}®ÿ¹çÖOkÕ ±}ûæ‚·ýsÍPº}Ÿ@ÞBHé9µÞÇõ3~Þè}ébÇ ŒÎsõ“G1gãÕ4c²—Ì ›qã’8åÖØßÃð&Ó¢ák\ÑÈŠ¿?ï_ü7žjû‰0—¨6ò}=ZøøëãxÒç[ÿ`ñrk¼ØNõÑ‚ØH¼yãÑy­Ç·rškÊä€?ÆÈuœÔä2Wz< GMŽëZÒ›c‚>:â7zl©ñ®õð y4›Ðãʈ¶bë¶îþÔ™»=Ê•F}úçÝ~Eáà¶Ç~ÊIõùÖÈ6?U—y]Žô\ŠíËû­ËÍžîϺŽ]Ë\¾šDá+ôÑØðÚh±‘¸ÐC‹lø:Û™¬ø‚ã{xéF㯤?2ø•ØÃ—ƒ$º#‡† ñ/è·Ü¹gù‘ßÿË·\óË¿ðûêbl~Gíó|QøþKþÚò‹ÿªíÂVl|໸ñ%Ÿ‰-±âÙ™»¶æ®vüÌ뛂¯¾`yÅ_ù±úLìé[såó1wÙ0'­×ßvÃòCu}ú¶ËæõÛÚڸΆÏEÇï³´–µnÀ;Ö½"luŒn.¸{pü»1é"ÄÉÕz4›ÑYfƒÌ–‹©ƒÍÙxæ!;mº´ç¦ß,16©åMùaÌ O\t’ÁãäìbÀñ¸½6ðŸŒÍóðÒ9öù‰× Œ¹±àâÕL·§^Î ŽíÑ'—Ÿ“¯·ŸäE<…-^y–Çùè[Nò…*˜\Nÿ<ý'ßÔÒ'¿:ô‰‘­9÷ÐÇ¿»ïv!±}c`òË·Œ³6Ë¿rÑ€ûÙ™@IDAT=›üÉ­¼'÷Çï3•ì èÞåW/yërá /?ûuÿ¼¾°íq…—ëíÜ6â(ýs±ÝOÚ+/6|‰+æ&_µI¨sRo΋ŸŒ1’ü®3Tø~E¿hžÒ;‘í cñ¸qÀžÌÛ4öH4zªo³ §Ðo=烶×ëé²ñ‡ïc®®¹ØtnõTþ†*_޹˯|誶 üŽ80àú¼Ë—òáÎû‚eï»–K®½¥Ÿ‚‹å×íY^úÜ'-_óŒÇ-ï¸øÚ¶Ûo5ð¡|Ù_þóÍÓo7"N9é„åMßûâÒqëòß½æ÷ú‰ù±Å'(aöõû%'nb8Ÿs±zÂ.—n¶ôGä§hy㢒±5?ðzåÞ&>ŸèódÉç ôØ“«Îmñæ;Ü,è}WÆ…-} 'ró[}¹,ýÖ[5ÿ{̪¦Ã[GÚvù%gbÖ_7|vm'…ox:ÿ›vbTãÇG‡Ù]»vmå óP¼±Ãvì¢i+‡ò)s×ÜTØ&‹7~°Fε ÀC‡ÞÌ]|ðú År= O&±°£˜çdÑrücWŸ\òˆ$¾Y'V:à鉟x—vç¡×Òœs&'d÷×çæ}¾ÿüó“=ÇÙÅŸ1"ϼüHü_ñSÿ¢¾•þ™Ë{üZn:ÿýËÁÚËW®›ûß<¿$çX¢ƒN8éQîcª×N¶ýøNód¼¾§€]qdø[ü„«‘nßâ'š¶x’—ÔbØwËÍõ¦Á­Ë)õ”_þØJ¾õþéõ+àŽk®ìú³UŸù5µm…^ v±ð×Û×ÿáûÚtº@¯Áø—|’µÿÁËg:Kdã':^qÒA^N?zÓ'^²ü¤^_ÑOނǧ­Ð oæfl£‡—Îø¦ è 9¼lð?~G/™à[øAþ‹­°;Nï ¶¢ÙûžêSÌq쫟©xù»^¹¼íòw4N+T}üpX:8-pÅDÐO’´ñ&A'™Y¬ôã¼ÄÁ¡ëG<ù,^ìÅm|ѿƳ¿Æã3 §m‘ÖŸšû€L|Ó_ì±¥~² þiG/î*ËS 6’ïèƒç[ ~9HÔvº/ýÈ¨ÑøB¤àð‡F?YNÉWæ¶“Wý_¿ä7—}ÇOõM#º•£ lˆÏØýÌ^³¼îâ7ÕÓ¥9@“Kã¿ñïÌݹ{øÜ}÷ÕXþáoÿØrǾú|\Í—Ìû£=Í]ö®ßsÃòßñòþÈÁà\”mÏãƒõ´Ã+áh.²Á­%§|urš ±Yr11',2æý¬_Ö³œ@g]sˆÏ†ÝÚ76°t±“õÄgõ'oðl̺Iv6íd­%s<[lº€°žÈèÜÈÐç—WØÄÊ/òxÙŸ ·“»õÇEÈàȰ:|ÔÏú;ºgý þŸT¿ÁÌ' '³¶YæÉY¼‰cnR¸8©'Eõäõøú|¨\œx¢5|ûé9Ã>mÊÉÉÁܼ¨'Ÿ§ñÃÇ|ÆΛɳ<àa]›oæ9¾›ÉG}>õ–K—¿ÿö^nØscñÍE.É£åYç,¹³ùÎkÙ|6„6ùÎÓrP<å÷PÂz ŒÇÖ¹¦ú6Ÿ½n×yªÏñ%KƆÔf3ý޳ðrF¯Í²_ €—86{.”ÌÌãºÁ_}›k©_<³ùÏ©u.õû5¿ÿñå©Ûµ¼ðig÷¦oæžñ¢Ã4zܰxÖÏZ^øEOXÞðþO/wÜ93¹øç_¶|¶>Óÿí_ñôÖO¾ç ëšÒÁ·¾ ²‰åkŸùÄúx܉ËÛëóø&Hö¾b ð^nä˜õ¦™ï€¿rB7¿õÙn\Õ­cѽ=ÑOû«‹MÝ›œ²-ÇÞ†h{Åã­vøÞ×z…“ûÎÙÜ’/ÝdAÛæGÅÉÿÎýÆw4ºä=×'-xþñ/…65ú™»|3F™›qŸ|óÀ ox"Ç÷\_eÞw7yH.ÌQ%óO;×*øá3g;/å#>FFvç´œ4ñ¯ý¡O!ŸšùB=8zã¯vüŒ^qÂã¥?½ÎK|øÈ¨ÙÆ â_ú©{înüŒ¯ä郛µ;~³-G·_se?éÞU_¨‡/ºÈ%–v¹<î+þÒrZ}Á›yÊÓê‹ð¾|¹øÿ~õrÃ{ßé3&í›kptz}¾u@Ÿº÷Õ/ø9??åÇä#9î|ì:«7Ë‘3—€ØÅ”\êó•Þòá ¿\“¡OGMæö+/ë"dß=xÉ+ùóÏiwÔëü`ÏåŸYNª1œY] '9Æ Äuú¹O^N8íôå¶Ò/F6×±ÊÏzlåÇ‚/i .㑚 ¶ððžÿpëø´ñ8/ЫϦZ!ë¸ÃÀ§dŽÏŒzò]lÓ¢›^|É;Ûdáñ8þ§MžžÈé󅎇Öæ€ïù¹¯§ûè½’r"'Oȇú³|qXp>øŸ/{÷V‚蓼ðHT’)0…}¤†7ÉÕœö:)ú)xéÏ D¯f@b€  dâGN¬ñ/zõ£“?øÕ—±£ÇNèé£Ä Mà‰¯âËdOܱ‹WÛ…ðßÚ>]±¯VGâ¦'c¥­d²Âƒøl ÁÇwúâ¼X¢OòÿÎkÞ·¼òݯjzc£ áñÛ"ûÚÿ»åW?þÖÎEÌ$|‰Mø¬$FtÀWm1fÌ£Ÿxéú)‰?rètáÍØÄÜ:/d@r©;swûÂìó1w?¶û’åå¿÷ŠCæ{ÄQúg>˜?ŸÝ··ß¹bÏU[óœ˜M§¹9›fZ¾™»Ö¹í‹‡šº%;óxdÍOô™ƒèóÄ{ôÁÛ”²ïÍ€ÙP[sÌíè¥Ó1¾}Ãp3õ ?I1—•ÄBŸ¶ãÍÚ‰66ØšµjŽö³>æxrü‘Ÿ»ø'Ô›Bó…€s“"Ç =|ÛüŸÅݳ¡æ›f ^ßx˜§ä“/t|³‘wƒy|¶Éní›·ðÐ;qäa-™u`Žo_sóÁ)šì&–ñÖÉ1zmÞÇuƒÛzçÆ‰µc¾8Öäc–kö^·üðïýdß´Ï´óGéŸMf¹Ý‰“§ç6l|íñ.R6÷^ñ¶é4où7 xûÚñÌÅ]Ü52xÚ6Ÿžh³i]ÏÚ¾Ž•™#ìñ”Ý<Ôç›Â/?Ù×_öÇÏÿÞÜVÛ·ÊkÿÇ ¯Z®ºùŽåû_ôÅË£ê;ØõJ-{â°qvÞqœyòñË~Ó_Xöì;°¼þ½—¦ bsƒbo½-óæó/_¾ü)]¾õyOí'ç½ —¿2ìboæÄ½ËÙ§¸üÈ7>w¹r÷Ëï~üÚùX@éðø Ž>®œ3ÄT…<{h ¾ÒKwãÚ¡Ë|v® /^c£/6òbªDu¼nq£{òOon õ‹Îð²cNÈ™8{ ‹Èmt:ÉòÙ5FË”~7:&ÊŽ° ØcÇ\âSæ.š6Ÿrí“s¸yëúŒ=‘Yû›øÐ2OµÅ®oü€yÈó'ãE7^ç=8| <ùÎç O–‘£Óç±mÈ~´ž»e7{:Ù¦sƒ¶’X´ã ìøLwútáMÂÖÚŽ~ôˆ1±Ïœ¹hxoøàÔkí·/_TŸáŸõqæ.ÿä ü…ôcËóþÙ+‹3Æ§Ñøƒõýlf,!É\7ûÜç58Ø¡ëú÷¾«?ûþÌú‰¿ø—|à#ûÅë»zŽ39x…LjíèNÌú àW|³®ÈñšfÞ]ûžß[óìç.zÖy­7òlt»ü~Jý‚Áµï}粿Þ0Æ×}àÝÃËS¿åe[s&öøÄæÓ‹æ‡ëß÷®Ž]~|‰ H,bÓ6~½vWˆWKn‹~ º¸3wè§âøâÛzáŇŸr¤M.z’¬%|VðàÅ—˜ã~b[Óé"'¶ØÀ§b!ÃO5@S °˜#éZwÆ…ßê q\‚Þ~É;–ßüÌï¶ãH©O&‰Wƒž …ObñÁÇæ\´ÀzFÖ‰ÏÅ›xžÄ96Ü ·fn_T:n渵þµ†úgírLÍšâ¸ÙÜÌtâß|Þ¹Á0öù9ëÎøÀ7›\>àU£gš›âã‹Í"_Í ~¾»y1þ²™·l²ÑJñø~ .~öïw×ßZM]~¶×HþÐɶ5ì`ýÔÓ|9¡œs\pïúÉse§dœûø9ç“y AÌã¼½`Lã—z.F&·ñÅž‹ð›äžþ™“¿Ñ#Ž{—íþäb.9W„oú¯ä{Ù±ñ ðËfÍ“}ã(/ÎÏð[s sõåÝw~êç"™Oò¾¾a€wslÍÏߌû\{„Ÿ>`3i³ìÉsg™Î¢õ&³èð¸g—Éßbß >q>ýñg.¿ò÷_´<ùìÓ—ŸxËùËíû+å3{Î>6Þ¯{Ï'ûÕþ—¿ô¹Ëw}åÓûçóÈú¨]æØsŸtöòÚï~ÑrF}Óÿ½é}˾ºQÐo#”Ïb•ÃVZ:寿[”¾WÀ¦o³âS+äç)o ßçj×¼›!ëÒÃ玟®j+ÆÖzB‡qÊìÆ¶õ°…¿ÀyV^:Ä/ÏäÅÛôºyàúÈŠj>²KOt¶²#üO.m†ä=×cZù‘'öù´ž»xõ“1™ü‡WÈŠ]›>s_®™ôÙ¦ã>çîÆމø¸ÖI–8À{ì€ÃõÒ‡/×Ë=ªO—æ}…>ý{úl’íñj[³ñÕ‡'ðmùµ™Cðtß _Ç4Óé_ð*>þéúɹs_üõ˳¾óï¶lü•ã'}ÝK—s¾êEËeoû÷Ëíõvh·Ôçô}iÝ9/zÉ–-x¶N®ŸÇ{ÁOþL=á>m9®Þüò…ñÑoÖ_Qßpné|fÝ`ˆŒ|š£Oû¦oYžúMßÚOÞ)»üâK. <ß´ÑgœqFÏ}xô5ÿ2l^öÖ_[ö\ö©åKèŸ/g<é)Gr},Õçï¿ú¯ZN<ãÌåâ×þï­Ož÷^÷ÇË§Þø‹õS†ß¶œóâohÓtO~=ío~çò”Šããõ {oºqk|Û¼‡¿°eïgÌù¨dLñ$F±dî;@OðúÚÁEÚôð“n}|êõμÀ‹ÒƯ­Vð:Véø“‹ØH7vðSÈÄgxm6ð¯}kò=k_ï :ƒ¹¯>X Xroºm÷òóýR;ÌiAgP’:ƹ8ˆ„œ’Ä…žÅ"2¨ ÐßÁÄ7“h+dÑ£?þó‡=N_­^rE ¯^Çx‚§#^?öù{h€­Ø6YÄHÑôè]ÓÈÒŸ$òtć´£#>ÊŸœÒ¢]ŽÕ|¥G_{]óü‡—qJüÑŸ~îÃÿ¶þìqg=ö¨œÀÙßͷݲüÌ¿P õÄÂ'þÆO|€ïñMˆßä´Äˆ¾3wÿlÍÝ×~ì Ë‹žüU˹gÿ¹­cÄ<8’`.š£—ÝtÅòï?ó[›ùf­˜ ¹c*`žÚÐy’ ¿=?Û¸¬‰³1¶ÁµÉ4á}æÜæ6¯¡³›M¿§ÇwÝ•MuÁúëŽù¬[t³ç õüûæ‚cI{lÏçëDç8rãÛqÇmßÐt¸Ígêç8£{âœ5Ÿßú³Ù[6¼âÏÇæ­1̦ydæf„coÎü`“¿£w.hsC% zn4ØÐ_?=kÿ•MçðroùÎ…%ŸÐï­ò‘+w/ßþ¾cù7ßñ‚åõÿàÅ˵·î].ºj÷réw,O®/Ö{öðP6ëOcÔPcá&'÷o¾­ÇÒXЫÏVùä õÙõ¶C멚¯rLOMŽž?Ưï&Èœ£Gþ??]Kòè'—±–¹©v Æ'ׂj¸Ð3ïÔÁÑ¡ýÆ1>mÇDϵ¯v^Ûo¿=î´n8´Ì yä{®uB§“/tu^«æwÏ‘ÒAFŸm~àGW=x‚£K›¬ˆÏÁÉS|ÄÓ7 J “ "M+| ¸ôé 3ë¹6/yý/,'Ö+èç}Ï?^žôW¿q¹ñ¢÷¸'<ÿk–SÎ~ìòÇï{×raý†=¿Èx£ç‚Ÿ{ÅòeÿäÇ—¯}õê©÷Ôœ=v9ãÜ'/ÞW.Ÿúõ×/×ÕÓóó¾ÿG–çÿøO/—½ýÍËî >Øò¼ê§ûu÷ç|ßõÍ„Ýõnœ]ßô¿ë Ÿº\ð¿üÄò…_ÿÍ˱5G@ÆS›ÿ‰AlòÇ8k—<­ùÑø,Ç¿‚~_ÝìxïËÿñòüú¯–¯yÕ//7]xþ²çÓŸ\N;ç –Çø¹Â:Ï|èÇpñ¹}|~âM¿¸ø˜Ã_¬ømîoúØG–cJïcÏû‹Ë™O}Æò‰7¼n¹ô×^ß¾±ÃfÆ2þÂøð°‘9¡Ý±m∮ăÝ|Í^Ž|‰Q>Âÿ3ñ$güRè±kÿ›¡þ‘w-¯&;kºvbÖÆƒ?úàrÜÆf|Ξïp½d²Î>Úq?QP¾,ï}ß·xŸsÞ—,gÖ…|.dŽ9_wÁ›–‹ö\ÒÉL"É;0“œ$!t²–IÏ„@—rpúje õÀÀ›djü€< —Mo#68¼ºø“…pkûp& |ü¡ƒÿh ` Ÿv|‚g+:b?rÁ§úÚj2bM­À¯iÁG6t5œ²>@õ³ˆÕrÂ/}²bFp)±-æðºyAHnØTÐÑú8¶¾5ûKŸp^ûý-ôÿ±¡˜»o¬_øÐ-Ý™»;swë¸y¤s÷ÞúfusùyO|¦¾¹ËGwÊýÊÅ¥·_ѸyB>7Ûlõç¶6LÛp`Žszr\Ï&ÕzëxÆåßóämfçx¥C±É·öfÝe§Ð…Gw¦ï†Ãèå½Ö÷âÚ| k‰§ê‘çÃø6úÖO¾éÈÓë.[£“YÛø Wð£ËZÇÇYŠÐñ°¡ ﬣúäÇG±Ð1~$nòxø.6òâŸ/$=ä&^¶è›ÃÇã)ÇW¾ÓQÿÊﱫ ä߉rm]L¾笣ΗãI¾Y‡Gn~H üð»¯ïþƒû–œóeÅ;‹cƒ–‡ɯ5wÏm·-oþ£›zƒ–§¼ÑÌíè¦+×¹ký¯@›Ž‹®¹µ7ëÎ Œ¾~¨ÜùÞ€;ê‰ýÛ>zÕò©ën[n­Wömð_øŒúâ¬Êõ/»aù•÷~ryåÛ/¨ïàØ;ùØä<ÇeÆÀ\Û…WÔ7ïïYn¸}ÿòø]§”žÇ×ý–«oÙ»¼å×/ÿòm.×ݶ¿ó#GüSzc\IøhÝ€øÄõ·µÏò€rìi³+÷."½žß´Mžüœž/-쥿oÈAñÊ_éÕn›¥O~Œ7<‘—yjb-Ùã¯h´¼ÍPζ¿ñµs_²òͦµ¸ÃûmÏyÜâ)hž$FïéÅàbß&ú¦ÿçÍÓöèÃÃ/þdÓšøCæšâ:IÝ1U-FºµñÁ‹?²ëüÑaí¤Ÿ-<èÆÄŸÌA<±§NœxõÃLJØ'CçÚ¯èöªøî~xÙ_?ûÆøËò Ù[/ùØòÙ?¾šØ–ŸhÀú±÷úk—Ý]Ð6’Ëý7\¿ìùøE[~À+ü4·}ÁÜM%S ËYOyz}™Ýã—›‹ÿ’_~Íréþmoò/>{Ù¥ËõzïrÊ㟸<ê™_²œpêéËžK/Y>ñK¯^®zÇoÕÏä]Ú7¯ïAà˾úrÀÎA­ã×ÔïÔßúéOôGSÎ|Ú×M…Ç5Ïþô?[v_üѾYxÛåõÝUwËnÆOäF§n¹äâåÆ?º°óÓyØð̹pæ¼èÊø¼ã¶åêw¼}Ùóîå¤3vÕëýÏ^î®^û¿¿|äû©å†MÎÈdKx¹A¾ê&†·õŒg.'Ö €›ëæÅE¯ùÙåêß}[ç46Ì åβá¦BìíG|‰^üÁ­ç ÜzëžåŸüÔËW¿ð+·ÚëF}4j¬ÿô¿þ¹vñÛ¿õ›—§?í©k¾ûl ÂxsýtÅwüÖ÷,{ï™Wœ8ž7&&4Þ´éK[-Y8mAg!Òø |tx¸$M —d’#ÃÇ zdá’`'=Û|£KŒøÉ…ÖB98| ºáè‹íè_û/^¾’7‘âyºàÕ¡%5:ê ±ƒÄè‰/‘ÅŸàÒVƒØêÎæ¾ørx¬XâZò˜8ÉòüiÇž²üÆßxíòè³ÕcŸ×¶N›Ýž»õÍ¥ûw~`¹íî;:?ô˃zgîzÑ!/ÆíðñÌ|1™pÖçîIÇœ¸¼å›_·<¦~ÞF.ŽÔÜ•gc`mºn÷õËËþÓ÷-ûëI»M®ñQä^‡w¼ÎIÕæ¯ÐF©×ƒ:ÌŠ6cf£¯Ø”ZlŠgcéÂq. õéÃçy|h£ÇÚk=k[…,›³áE7—ç±i-³Vm«mx̫؞M¬“({bvñ;qnnt“»s\ÏFw.ÔáçÜ#Wô‹anJääKçl‚³ÖÙtq{|˜“0ýäÅ6ºð ç~Ìy MLÊ´éš‹÷WôÿƧò¨útÃÇ×ÑÁÿm°îΟu¬xèÌ3Æž´ºˆœ1Ÿêfô±'.¿þ¯^ÿ˜Ç÷¹Õœz¤ÀOç¤[o½u¹âª«—¿÷–Ït2Ä\À›Xý´¶øØÏÅ‘ÜÉ÷伓^þzaEgŸãÕî1¡\þÛH­mu^õßM!Í…dë-_sƒ éÆ«˜Â»èWòáùªô&{ÃGOÛ+DG×Å˾q‹ßø\]x;cý‘¬MÍ[öN(>9È †ø+ÎØ}âTÜ àüÉY~§ð!ùüÕ—}ÉòÄ'>±/œ;W%÷pÁ|Ú³gÏrÍ5×,Ÿþ'¯Ætnì°e^ƒÌM¾Ã±iþºÖH®;GbOAÆ“ŒB†-z3&øÂO¾çvñ‘ ?\läOxÃÏ/»ìȳ—¾šþððA¼x⛚íàÕ‰…èÀûpüŒÏø@ô¢G/ ¼-yÒÁ§OŽ>ut¤^ÛÆ¿öƒïÈãÑæ?Y“…âÁ~õ:F6ôÕ€œâÚ‚Ot*ú|‹_xÐùe&Wôâƒ~lÀ­sÞćÆþÄ=Á³›~>¬kºè O!—6=ñG›,:À§h€N¾Â«7ZtÀƒðƒ\»ßÈúǦ½&¾ðÒÿ_Ý€d“}tu>Ê ?ѱÎYpìû¯^³œsÎ9‹_éÀÿ@pÅ•W-ÿÅò£?òƒ[íucŽÞœrÊÉuçr^]+_?'pR ð¾«ÿpÙwï|FL€Á'ÁI § ªÀ%FAÃIRtIVèä´3PÚ‡¬vãbX_‰> ð±Ov­?^v n€ï9`ð^3b‡oüW&/y}ôÄA7>òp?‰^¯~lFèˆ >ñàlÂÈÄrüxèˆ_x¸ÞÄ›ä÷9öð˜Ü|\Ë¢óE\è…°çöc?»üÁ•\þÚi_Û¶â[øNÍ?Äû«?¼Ü~Ïg;6±À'‡øØâàXäE½3wwæîÍÝ{Ž­ß:¿âýËKOÿºž»ëùýpæmdØÌñúž«>¸¬ ›MžWݳ±Ä;›ÃœÌæ8/ÑÂ[\øX¿뎇™ëæµ aâ²±-É ÝúFÞEWN´,Ùxà›uon8[ó¬Aã/àÊ£ÂNú瘶ZS°çâ/kï“Öî¹H´i¶›Ö0Ǭµj6Â6åó^©Ç¯È×ùùÃîl|]L–hçA\s!>yä+¿&·ìˆ‘»ò0yrÓÙÍÕíœLžø4ǽ³¼1¦óݬñô̸¹ìø˜Ä±õ–HlÏx‘™sŒœe>¥^ûB׌ÉÄ“ñäóŒ;;.DÄD—þûïÚßs÷›w}C¯}ld- ß‘¨é5—|µÑì'¿ÕÏ9Ð&X§­Ýî3ÝæGß$(^¯zÒqb{É´\ÙñÚº ¢QeÓH؈÷&½øzfŸ r|ÕÖx¾uzÊž 5¿tØLgÛ¾.çàæÃƒ·ì‹¿Á{M½Ÿ^7Æl}xlrmjÕ¾ä®aõùÌÇr¢7Û¥´Ç)>õXM޼vo¹÷6ân"Ðeð“[*ÛvñÑï³ótöÓúâëX«ÎµGÆËOøñ¥7ì•{j|¬%伞/.cê&_ÅSƒPo’ÔE}Ñ·ò²±Ñq?{²u|µ·x G7[bèkŒ’sÓÁxºðùó"cÉ^rÁw4ýžgâÞ×™®!öV®‹×\s-‰×Ú‡¦Ð•k´ÉÓ-ñaÝFg?à‹vúl:ÐÌ×àÖs|æNlÁÑ%÷k _Öþ±¡ô¸•œ6æZ|Á¯äZ+yYç#>‘ÕŽn<ôˆ‡¯‰5>ë'u|Î1o|èôÒ¹¾ >6ð*á]Ë&'lñoJò8Ù%À“¸ÔkýìÐÇ~rG§2vèò莬õ”,ÝøàÕ =ðñ“^  ³#·d“ûÈéðЋ¶Öxé}¸àñò“œ¸b?<èt£ƒÔ‰ßñ½dÉáY—è2¶xŒGdø¹ø¤†Ç#?j2üÈyˆ/|ˆöôñ'hJxá 8è½?Ø¢¬|ÑÏçJ°$~èÚ :HN Hñ…¦†Ï`±£zH&º"£¦›týGvæî*çÆRŽƒÉÕÎÜ=®çÊÙ»ÜpÑò’güåΡ\¹}$@ãÇÚKÿߎmú·?6Æ&Z,j[‡¬1N`ÖÔ¾ßð86¬1ÖÍ™÷Þ븧K™ãÖÑŸ/óF¸ ™ ¸ÂV?kõøºe½lf°¡ÍéÍMÂsÁ‘%gÞ"óÄ7'Æ<í‡Ïʬ/)ãS¾ho¿æ„KÇøí‚Ègýœ3\¼X?ÅkÍ´¾'9š8m‚+ú–Ýþ{¥YGù›'|æ“<°—;œ£Í ¹$3cÃ'6&‡ñgÞ¶à3›üœ5L>æ­ˆÑWFÛ§äÊ—"f ׯ? ÏÚ±3±ç¹!pÌò‘›.^¾þÎo­»“‚GT‰×fÒ&6ßœ/7.’ä´_ç]á:ÇÅç3®½/œ^¦¼òkþç¼à:¦T7Nl8m2=ͧ«¸ÑÛñ-vŸI•«¾yPó[-C6ø=oJ_|ïYX<΃xÅ1£>¿ŒÃ'…þç’qÃA ôµN±½oô1efŒø‹Æw7Ú·ª;?…í_ñÛÐG_ã '¿÷Ôá†AóÁM~&r]¯ŸGŒŽnÔ¿+zJoìlÉ•mkc?É/z_ ” ùñ%}â€Ë—C㥧ã.ÉO! xÓè>P1zÀöEOþ«Ñ8üäÌö]GäB{}#q©š÷.;¾”¯ìš ò2wÅ*þY3gó>rÁË €£ÙõµÑVî ŸªñšÚ£ò ô\ÙÌ5´”øHOâà³ë;8>G']ñ™lü GgbÐôà¡ í¹[øþøHÀћљÍ~l¯uh³CDF›m486èú ½ü=w«NØBw­zâQ'þèŽNúä«‹Õ¸ ‹—OlDNŸï¹áûä3>l™c|Š8ÅÁ‡Ÿíðdî xmúàøJO@?q&êèe?>ºÔk[päÕìEÚxé:\G|S£“_ûE'ZøøÀÑ‹'sW>Ö:’ïèÇ Ø@côÃ)k^¶ä?€Ÿ:zøÁ¶>àOxŒsÚÉ?àÕp‰©…Ä?þN=õþ¿tkÃ_Þ‡¿&ÕöSí-ä}4ÃÉOÞzÙV¢MÈL“AIòRs2ƒ!À$?üê$Ÿ>Y5HRÔ¡±­­¬õã—dzðÐðéüú}­‹\ìLtƒ¨ž¼’ŽÏèòD7â—m½á‰¾è¦G‘ŸÈ¶“õ>[j@y2Ú™HÚtñ±¥ ‡?môÄþÈâ‘<ü××VÓ´ƒgW^Èkó3¶ãsj~àÉA{q}û¸üå7bÑ °ÃÆÌÝÏìÌÝʧqQvæî‘»—ÜtiŸ Ì7Çꑘ»æ¯cÍü½ô–˫펲c˱g´8æ­¯Žo7n¬Ž'|ë£5ÀøÙ€ÖêW8kê¬%³Ô§oðE¡`ëØåGø} ½ ¬¥et¯OÄŽW¾Y+Ûl[fí‰?ìÀÉ»teSÏ?4Oòáë±ÇŽ>y•_røfó=k;½ø­E³YÅÄá «ÕrêÁç¢[ßkƒ¹1"Žáq¬È¯~|œüâ™› |›2¹¯\ªs>) ›×ôÝÔàw>*Á߉còTŠ7¹“ç9Çkn¼ M“ 7`­sÃ77æ|+?|åËÌÇG¹t£FŽŒí¥·\¶uñ¨¯ ?O9ô“êÊ‘M]gµô›×@ì6‚9¿õ €êó'Ä'šÎ øœ¹ rÿüÛæœtZ}®öÎ:_ùb¹¾ @¶øm óTºo=Á§ËJ@w?•.?ÙM¡Ÿ\ψ¢ñ'ç-sƒ ¿;ïW@Îeì‘ñZÿ1™¾±Pº@6©3—ëB²ì㣳y75ÿèÜú¸BõÛ·â­Aê§éü÷-þä¬9Ó%v²Þ °ÁïœΓzçÙö¥Úës4=[vYÑÙÏÁj«ceƒN–-㸷úbW߬ÿ†Æ>²í{µñð ç;ûò^Ìí7]F/úæ§výë­à(ük[u­çÿÚǯx’»ð¸fkyýl&œ‡åV^üÞ=¼B'ò›¼„74vèH^rÍ ‡\rE< M›\ò|%/<‰ƒúÔkx;Gzìªã“صA®%µé"ŸÍ-?ØHŒ‘§ -zȬç.¾ØKøbSH>Ø¡+¹ô³„äÙQ'fm€O>ãŠ'c„/qð°yN>à’?8| Çqüc„WÙ€OÍPÿâôÑy2ñS 2&xÂK^41‰?j86’óÀ‰ `‡ßúðôâYÛÓ>6ÃO/è utâ“/:ÑÏ¿øšØá´áÕÊúš86ܘñËèôó%¾ÂÅG4E|±¥‡.2Ú Ÿ¢ƒüC½›‡Ôdjõ¿_Ñ™uE^˜ ²û•iB‚àäMnéE!8D_j4H ¼ /)WK|x’È«%F’ñiƒ$}:ȯ} Æ›BŸ…BŸO™ \2œLºøM&öÔÔÈÆg:´•LH8ú,l ñhó ‰ƒ=þË ¼vìê+ìeáGc/:ȯqúôÆçŒžè‹ t~%úø@t$çt(xÄ)OÚpx•ødáoØSˈ/zÛÈ#øG?n_?ëž9ß°“õe6ßxm,ùáäήqÖ¾‘£½‰MœúhÖÞ9‰Ó!&0¾²EÆ£‹çÙìWÖËf³Õ?üòJ‡1›µqrÉú†6Rì²5úós{ü“;:ù7ëãôñN®éÛœsÙÕ§oÆUŽ]TºøÏÁßxçÍ[kµsÈ‘€CÖï ²?£nŒ'¹½á<ÜNŽ‹í ¤Ä&+½y,}}“Ày¥ŠçÌ…zƒ¯®S¬on2ô^‚Ù¯~1Us{Å>›Ž×FŠ®lÒÛ¹â¡Ëkäø[_ñ³c¿Ï†©ð|6«FŽNÀ®Ñê§ø¥¯ãÚ1€ÏSno-äÜšü͸Ïë£ô°À?ù´Yf_¿i›¶'àñE¾è¬‰Ðß’?Å«ˆ¡ŸØ½ÇRtWñãë\™ÌEëXŠ_Ý;¨xúóöÅß¶ÄWöO®ù#Ÿô¶OÅ¿åKÑÑ:‡ˆc…G<¾Ù¿ÇlÙvþî/g×@‘š¿xÕ>ºp´@â¿GÆfm þþæ.ÞÈÊ1QÈ$?6µò¶žèë~|Hüt7Ä/üpáO,ðìX§èÈæ©çnñó;qjóAŸŒ:4ú@Œ|AÐ]ÝM¬dÖvù£ȲM—>yŒ.ulFïá8È£“£/~Š Žø¿¶´Ä”½BüÄ“B?]ìÒ­¬cgK‘Cxåp ‹n@^2ñŒ>ZüÙàÔ‡Û‡Ëøã§#ºcK~2ïÌ‘ì½Ø úÈg?ßàá÷S,r_ôɱ‘~|¤—=¾áä ìÞ=¿ÊBæöúUº£k­ç>7üy¥}Íxx[•¼ÏÞµ·Nœ³ÙÅÀ0`\AS´Mjµ$%ÙjôÔ™púèÆœÁgkmLoaÍ Ÿ‰ƒŸ<Ý }“]pk~þÓ Ðñ§ÎÀñþ𱓠Ÿv€,¾àÈÒ’W<üI\ú@Ÿlì'/©ñ áSئ3º¢/±à'«‡¬6>rú|ÓhY°Œ­|Áýä°›‰‰ŽøæDÔ·‹'þmDvÅ]|þì]ûvæne2s2¹WïÌÝ?ysפw,š¿Ælÿ=î ÷5ráçx6v9>ÑlX‡f]ž‹ <Ñcó·~}xgSnCzï½óZ.™ð|ps`nlŸÄËbÑÆÇ9ìùc±æXõóÀ$sοÐg±.ÌfÎ Çod ¿5%뺋„±SÈòÓ ˆœ\pùdý4¯'•Æâ±žº0¢Óú%/|WýG?ùœ@gÃ;›õí s¸ùˆÂ¬©¥¬óu׺#‡³²çÍš­8wUUÀï‰eb#74>ÄþÄQ¤öM Ü@‘Ã9WXKç&üÎÓ~c8dðò#ë»öüÔb媜Éu·\ý;¾Îw6s™«ýÅvE·îðGÜõ¯7åë/Ó>ÅMrs¸ä½n^Jæ7Ú g˜ äÛÝ}¾Û\²IÓ¦¿¡æpÆÄyнž UËŸ?;iX7ÌùK!ktú&BéoÞ’…§ã®ªss€~rޝ½ù¦³dØDë·ª}Bѳ™æ/›ÉOøùÖçáâ7{ýSƒb#T:r€^úz\+oÆÀgüï.Ùà½Ñ|…+§ú3ñìÊXÅnSï ¼›­«Ìôæ›~&KÖG$ÔÇ?_Éò=1÷ …âåhÚxéÆK7}dŠÞ7Ôü«ÂïÖQí¾)Sõúzdì7ܼI¶ådlà}uûZt|žŠW[| טëë žzôÉÈЦW /Zì%釗œÂ‡< þãM[úÑ"§Ö¯Ä9}íè ?»pôÄ÷ÄI^kôéÂG6öáý‚Bpt÷Ü,^y…ÇC'YEŸ]8t[úñ ®±âƒË¸±YmºðÑÍ_ô&V5}ñ;}rp|‚j¶ØP‚Ç‹/~áMþÂ_ðÆ2ú€_x@|ÀùØE‡dØT“Ié5Þkñ§èŽ]6ñÇNbÀ§„–ù¢N,xõd€šÏìÒŸÔá‰n<€^:ÑÉØÈ—ßZ>¼b'«üô²¡^ë<>vðò•E±}x,ì¹mûç7éñÄÿôºQv8lmøçs‰C¾å–[—/|Ò¹‡óÒÅ‚s½²2\ŽŒI!Ð œäx-ýøÙ\:ÑñÃEWÚøáÐéfOÛ`Ò§¬Ÿèãx€X2˜äc‹^¶ÑÕxB‹,žøG·²ö™ z•ÃmÃÑA–Ÿ€=}zcxš>]Út¨õãûpêµ]m¸ÈÆ6½ñÍеã# ¿ =±ƒÈXëÂð°ÔnàÓVÄÇç;ëua9ˆÎx„ÿ¶lïÌÝÎqÆ yÉü1Æ ÿõZã›þÎÜ=tîÊË‘˜¿tdŒz­±Íì9̺[BE7®Kr2ñfüðäçæâë/¹«š¯ÞdàÏÞ÷¦OùÂV_‡”ã⦀›ÉCŸJ¶sU<6å|âƒqPÐÔÞp r|1øÒc¯]  \Cd6¢ðd#GwbÕw#‚oG ób῱µ¶ñ!>Ë—~Οü@ÓïáMøs“y‡¿çnÙòj9´¼îNGüÈ5} :Ôh|ä~@/ˆßá‡C ïÖÜ-=ëk4vÖ6£/q¡Ñ)5~möèèLJ¼’$öuLðäWô©ñ{`iÎ(|ÁKŸ¢Í¯ä®ÄM°…n¿ W š:±á!"¦­ÄÿÃç.²kùØMþȬm²'¶Ñ;phÚ |xŒ›~â»6HnÈÇÇè#‡—Žèå›¶B§¹¨?3ÿÅžùð²M:Û‰…´ÃmñeÍÏ_<@<™gä•užŒ!lÄ&©é‰ ¼ôÃ%_ñ 5 =ðl Ñ«M>øØˆ.?Zâ'Çg1> ÷``ë¨K ùÜIc‚Ôç8X<ƒƒÇ@볫dr%±ž”t†'ÁEoú&jd𢯠>xö%•}vÈÅ.y2&´vâ:|âD?kðº=lâCO¼ÉžØIþà´éKíµpü‰?>ÑK_Æ=¾hG.¾F~­+¶cŸïj2ÑÅŸ»øèßñþÄo| ¶åÐÈãŧ°™v3ô×›Cþ‚äMZ /¾%öŒ¥82>|:¹"ƒ'ñFoú;swŽ×?s÷HÏ[sÔ¼º»6h³)Ÿ>;óØÉÆSÇØ¬9^EŸMÞöZc¾Îœ7ÿ_Ö+óTÙÖ9óÖºfþVU:G· œÜ,ta47fS‹/pky¯yºœ5‚}¯ñÛàΓnk“ãß ×í'2â²e»šü˜õ­RÑ´Ù;éòϺɦ5Äq<öçÄÄ+‡óú½Xéà—uWß{“K¹ñ´|6ôô»˜_ÆŸ¹a1¹š<ˆwr½³Ž…§–„¦ãKLìð]œÇ§ž›9ùØŸ­%èÆNãÏèæóèÈØ¹)ƒŸü𑚛+òä†Ö/y¤vò¸}GâHCb“'ñRjãk@øÎ'`jÍíy¿‰;´“ëF± lB­Ý@^f|g®ÑÅ|ŠM°M¡è€ sJ®àè Ó“jü6«kC‘¼·%K®ýE„üñ´½7ê…‹~>°Çwzs¾£×ÍúÐ{S\:<ío]E÷Šzì¶­âígÉÚ`ã÷ÆC?¥çsÅ#F~Ø ã±açGßÀ(°Ñ÷+ô&?Ú뛱ݥƒÜ¤‰_fM1„•»Òßo Ð[¾‰QlÆÓ¦<@®s‚ß¹³|Ïu;s¤}OÉôµZé?P1•Ãr¤uÍâf[ÅxàrNë|–ü…Ó·qÇëüŸXÑé4/¼¢¯ÆvîkîâƒÇK§Í0\ ºâ?š‚7ë ž{=N¥/s/y|h‘c“.|¹Ù@Oli“Ñ'#äåžßäÑvà€~ô¨É©ÉeóÉ.ùøÑ‚õ6Â9¼ô¶"‹®M7¼½Ù<9ü‰‹m€Wa'þ…—løÔ™Wj2ñÉ8d^â#‡®]||ϸ¨á2vxbƒ,ÀC¯\„ûÍð þ¹^Zñ}½µÆL{‹k= ë§ýÿ_‘C1‚UÅñ@#%< ?€žÉ¡/9ø“¬èPG/:<¸ØVãl°'‘âóY À¼Å--ˆoút—x:Õú€m¼p‰~¿Â‡G?945|tj'¾ÄÀ~'žLývײlÄ6›Êš'~°Ëý‰ƒ\t‘‰o‘Á›6zü ] ÞÄ ŸØâOpj8 ‡šdé¶`%ÏhkYrGj³±þ8 ÉArÌ®ù´ñ<;swgî>ÐÜ5WŽäÜ¥KéMÂæZl37vóNZ=Eûx´ážMá\¸hã±±Í|7¯möàÆ_Ç2þÑ9kI™nÛò.´Æ¦ êÜ0à£õÒz´½{]ÜüáñEƒžøû"¾y‚=x|ãGâœÍþø_KñÆG¾HœcèõÚžÌ×ÑÜ´ñ}’ŧˆÉ MÀùFÜÖd¯ŠZÛñäbOÞäAN\¼Œ=>ú¼¾¸­{ü`s|¯fÛ—‹±íI:[YÿqÌ:ãbBoüÊØñÓ ‘æ ðF÷¼Y1cŸœÝ}·Áã±bOÞ¶ß~(Ìæ{æ ÿ¹‰`c͇ís{­¥c8ñHþ•›Ó~õžþ ¸ŸRW»ëò×Snqå¼Äëæ©¬Í(¼ó»_#/=½qVK^o‡·¹”Ðs¨jc@SøQ@&§UWÎSh8߈/'“ÓñÑSò¦©Kÿr.ô4¿¦_´»K>ç“9æj Ù¦·x}q^dÛ‡²™›üsÍ’ yôœ—lÀð‘ýÊ p.•¿öÏU|  ,lu†ÄW¼Ý.¹¾IAO`ó̧ôÕbwÖPò¾ƒ ù•’Æ–þRÆj#4þº0óÓ|Ö4¿Ü:Ç|­xECN^ð(}£x-šXçœøÉ-è1Õž²Á¦ØÛ_~m ÛÆ*ãƒn\r“1Êu=Ñ'ÇŠë":’[uç âø×5ôu­ÍVpøùD¼¼¡EWæ‹ñ]óádàÕkŸãœÔùœ4ý®is­G_r£Žô‚Ãç.y|Ù<á‰íøEo|ÅO.}5?3wɳÖ¼ÚÉyíØdŒ]Ñ;á5v€>¶èIÁ“ùÁ‡ÄB?Zøµ]cÂñÁnݘ´ä¡«’‹|áåShêäÕøÐÆ-ó4¼ä]£gÜð²CVÑ+Ÿõ‰“ÉKxÕô'ßxòsrúj|ü%O·ü² ZøB‹ýødÅŸükƒØÐçKüobý >|±¥Ï¯ø¤¯$wì E_r1a à{(pj}Lh Ûý[c뜫ËH éŸvÚ|K«ödÈK‚À ‘Dßj˜d„Wà™Ld× DcC?ýØJÑ"Ç6¨ù²Ž‘.¾ zldУ#vïM¿8Ñ£O;¹HЯ-lãSàØ~ñ)ÑËNÚx´ÉÓ“Mgò€>tºãÙøA½É˜ð“µt¾ òpôá´éðô³Mà#+7Ñ?ðáG .<­àˆþ›œÆGªå+¾‰qgîΛ9c,væîƒŸ»Gtºn”›Ó©­ssrµQu1Zä¦;Íß:Üêø3¯Íw²^ÏÌňãÚ:iœgý®S^ßpÖ#úÑÓìÌúZÔ–É“q:êlÒ¼h€,ù¡v":öXßÝ2öfC=2pùâ@xK¿é›NÄÖëGk/¼ ³6¼ÁYçØ{¸²¶±Wß\¦w~Vpü’»»ïæ¯ÈΉôŠ‘/jk˜ØùC†Žá›Yç¶Ÿp¹ënãåw>Ž‹Ë‰ÏÚÜ8¨Õ§ôn?]?Ùw~ÀÃ÷©µo §s;nýñNÎÙ _{bÇ/—ƒCûœWÈïèGJm~¦MŒå|Ùžó‚Úú›sëpëº7ûÅc^ÝSç ÿþlw9îÜaþ~5}&ÜÖMO›m~Kñl‚‹9çGã!ýdš’ÒwOñÛ¤ÚÀö¶’k¾ò¡œh{3]xñ¸AЯí“/Hl-“X ß6J¾oV”Œ› }³ h[ß5P8ë-ÈyQ;9aO®äŒ¾†Ò%'Žýœ‹Õ™O½O1Ë¥xm¬óÔŸîèUó›ÀáW'Wt¬sßè‰N2ú)üËô&/rBwlÇ^b§ÐØ¢+qÂk'7©åà>1¡;†bŸ~  ‡/ýÄÏgíä¿ê_xÙËfšÉ?}hÉ5¹ÄÛ‰W?¼j}¼ñ‹Îä]Íàþä‡Oú€nyw_lᡬó@‡Xé‡W^4rñ¡ õ/¶×|xÉFÛ‘W+ñ%6¢ïÁÔY“Û\¤ŸºgÒáƒöP¿ÝtP”µÎL&“=&‰Kx®d`éh@_ɄƧ$™Üè’L4;Úd€‰©}xôéÑ&«Í&]ió1}mq°iBE·zm?€£/|pòC_ÔôâK쉃\èÑœ:rhñb‰Œ>~<áÕWäô3‰ð¿ðÒ_/ ]ìЗ|‘Ëâ¯Ož½è‰/Gºv²3¯Ø¿ú|Ø™»Û“õÙ™»³ž|>ç® ``ÓiL”ùB;ë©ãÚqk q"´n¹8×ã^OŸÍâœÀÏ6¶ñ¿´Ö±<:mï½wŽÇ·Í-YDz9P¨¶Ç—ØÄ7›Ì\XïæÄÆŽM¨ÍölÀLJÑgíµ¾XO´]lñÍ›YÖ¤ñ‘nñÀÃå’p£›Ÿó1zOà'³VÊ]n0²Ëï9ÈMrÁï¹)²}òg'›kcu‹6ØÖÇä?Qã“|ñ—³é'W˜’g1y‚ }þàÇKïø6ç’é'>¹rþpšŸ›leý¦cèrA· ¢ÑG†Þ£ YG¬ÁRÕ¥s}è¦ Ÿ˜{Xó _¿¶]É4Ï€×ØmþÐðϼý¹ 2Ö¿Ò‡g æþŒÕæÂ²æ·›}s Úë ôSïmƒÀ>ÒÚª‹&ïs\ÌÆAßF¶ã#ú&VþÎ8ωÎCdñV€#[æŸ3çÈ$®;KF;ù#›ÏÖÓïæ…œúùBm¥G\þªÝçÁâs#ŽyŽ>ä)WådÇà³ûrk¡ä–^çƒØÝàôŸTíÜ$é/7,ž¡ÎÜHîØ£Çw0¸¡ï-‚øÄHºs„ÿÉ©bŒ¹çKêæ)¾ôÑ€qÏxêk?°ž»ô“™»ú±Ù„ú—üÂG?~òúÆ2yÑ/øµá€z݆co½ñ¥“Ï |&£ðñY;4rÉIbkúG¾Äµ~ €.t%±«ùm~i+ >Ø_Еù‡уŸhr¥¦3¹²)æSÆXM/>rñ•^vðýèÒÇG¯BŽ}ºÙ£7>©×2ô‡W+Æ‚|ðÉ[tÄ~øÃ9úée_­‰m>¥Ýèr‡§†S'É“>|>£ž½dÃǯݎ_ê𑣟áa#zÉÒ›â[ìE'<Yºñ8íè‡KÜdèGçWüăŸ®ä.ôØ‚KÌÚ?z|Öçà+[é7òAü»£¾™?@Ÿ˜î ÚÊÜéß&¯Óo{ÿ-Î8›äI螈ð¢s’³q8IN²ÚÐÄ_‚^¤–Lt%6“|:bGÄ©-Bì‘+ LîœégÐÈW§M7ähp2ñ?~D>9 §¯N›þÐdÅJ:Hߨð3ò±™ƒ ->xƒã/8túØÖ×v'-üœÄŒÆuèê”胜-Xñ:‰•|Ñ_óŠ#¹FOø¯dµwæîÌ9Éaò$rµ3wïÆ›W V¶Ê•|ΗÍàl‡6k•uÁ‰m6q6}³‰ÙÄëÉ} AÍßœ|¶×£¼òŽñcŽ ''fcj“1›Ø|3ÿfsį{ïuj”'2³ÞÑÅŸ‘Ÿø§-VúÅ‡×æÚš@?þYsébwü·‰ŸcA||õÝrŒî- º¸qåÿ䫪ò }ò# ç9/œÏß{Š nDkÛ4LNgœµÅ!.²âàÿÜLI~X;ÒÀck€¼÷¹Ò…»I·ÁçøçœÏœÛ˜v”Õ·½-¼ yczµ;CÕ·a„×ßدk{zL‡ÍuŽ£ã§ßÄ÷„]Ác\øe3y|çHÎê­úùŒ¾Íê±Å›5­õŽf›Býþ¶}¶«ïF]ó o|€§§¡èÎýÄšÝòÍùNøMœwáZGÑmž§š¿tÀ+9‡õ9«äÅ%>À¼jÏxc2ÇN͉ÂÑIF¼|"ã Šä ãØ>n6DäÙdü €|Øìó‰9~ÇÏÄh|ØrÃÀ ðûBç³Ú9‡ÒÑñ–'Ô5B4£ÚäáÉ-è˜ë- ×4Ùì‰Y®Íg¶õ;§|W>xñ«ñkßc¿¡ÁÑ%æè§.ñ¥&'üòÀFtã | >8À'íÄG.2è±K_Æ<4~ÈUâ„Ï¡oeál¼ô¢‘ ÀǶÜÇ¿Ø>¶£CÍGu| ?œBOdù?ýÐ#ŠñôùdÑ>cJVŒø:ù Í_2ì}üôâñ:=þð€ y<€œ>?Ø‚Wâ:Ô ~I :PÓ[ñ“ ÈØ G'PãWzìåÕv¸5¯øðñ7:Ùñdìéå£>™7øc+yO,Æ?ÝhÚ º’øC燲¶ƒ¦ÀÅuüž.…þèI>àñgŒ[уü·1ÛÜtßô‘ÃÑ5ôëJkÄçh &ƒ¡mƒÆyz9/‰@`J`&_eàðíøDodÐè@ƒÇ¯ÍæºD>rhiGŸ¤ÀèëÎæ>rì)tâg>I]}<ñïZžZ8zÅï ¶(‚Odµé\·£7ùA£<ˆðÉŸôrúá7ÙÉ‹ØSgÁ¢3rÚdS;jºàñiú²XÆÿ&Ô¿ðË_øù¨OþÌŸÈɺF·sÁ&{;swáŒaÆÛ8dŽîÌÝ™ÿ5ç®ñY_<•=ñD›…YÏm4ìËó>ŽêH®ã?¡³Žæ˜›ìöEÎl&g ´™¬£¸ ]äsƒPßqc åÏï…¬¾uÃõÛ¹À…¦ãÙňµqŽ·Ù o_˜Oß…uƒ§µÎ&t– Á›—u™ÁdѺÚðY«ôgýæ3_×ëxSË1‘]ccx­•úk[b‰nkÝö9Í[ÞH˜c…ññ•<_œ8ù˜‹ª}ûl ¶Ï)øÄÉ—ø$OrX¢sò2ú'gÖ~þºà´Þ'|œ›=>Ž@¯çâœC&Fþ8•¯áiö£òÏfR®zí57çþœŸ²æÈ 0~pú½a/\oÈéÙèhÞJ]­9‚c«ñE÷4Ù¦µíƒµÎÆ2ç\}¶œ¼žnlè@Ïqæ0><Ž”þõ€Âáiß Ï{qfþñQ?ñy{àĺ௣Hln28?'^þ(‰Ã·qÅïW zÆ©Å[`sM;kÙ¾á±ñ^\cÙëØùU8gÀžU@­KŸ-T<ñ /_éH\=Ÿ ß¿:P¶Šyô.6ùg||G‚¼ðßÕ ×rhú ¿Z>è@×f3x¼®áä4öä.L¾Ä€ŽØ§+:Ñð Å4çýø^µ‡:yÐ¥O†¾š»ë$ŽÄI>¶Ôú)yø“Ä…G-vöÅ­ü À¥ÏV| ŽôªÅNXó[tàQÐ3g³¹^>´_ùœëMøøM‡¾’ñããÚÏ舟êø"†èPÓA7y¹ ]Ÿ}v’O±+øèô­ý‹/±Éˆ]mòøàÔì¬ý„O¾å °äGa7:ÈGv| .5á;Ý \|‰ol‰A¼l‡ŽWÑe¼ðÂCWâ€ãˆ<½ôíuà#Ž–üDýÁÀ®]gl±þ~[„jLvטjg¡? ý€] ÁeÐ @‚É`$XüÚI€$%¡™ld@’ƒ‡Ÿ=òÑþèÅÏ>Ä´ø@7ù,ú M›\’ŸÕì«Cc'ºãOèüGËb¥_ÙÒ¦/~‘#“ا¸ÃÃ7€/°ö‹?¡EOìÆ~{ñ =xcŽùÄÜLõ/ýÔäµåNn6Éܺñá3y6éÐNdŽ8Ô1}L¼å˜>¾Æ'm¾$÷|ÓŽ;swÂÌ%¹‘·¹»}|é¹{O?96ç øÌÛ¹8ªô¸ø²†f‚Ô7—·ÆÌ9'UO=a6†6¦Ûó½/¿k<] Xçœ$ÅeýÀ[ÿ7Ç«Mb_ ož¤ëÛ<ÚˆÒ]+Aàä;vm68|†žöÜø˜ugž¦gËW4ñÏù!φ‹jëÆ'7RôÍéØÈñÏ>}³FŒ/‘SË·1°ÙÏG ZMÓÆ®ugtL>øà‹ ù8¹˜Øó4žèèpQÒŠ`6¼Ö*c8ˆtÓwÌ1Þ¤šullÑ‘uM{b{â‰è?òu6ÞÖ\Ùöš¼WómR峟 oÖÙr°oxý¼?Ÿ_<âàõä¾rQí~í¾ôõ“äËèÆË+ç½N‹µú¾ žÞ¾¨®Ú+âùœxß(ý _p§mïI6ÛÚ6}ν±¦·Àœ+†©«Ÿó!?šV8šÙÊù† ú_ñz]læ_mjÛzåJ<Ùä’÷qÌþ¨OñÙÏøÏZÌG~e;l²£ôõˆó™6‚˜Ä[}ßâÄÀædgúâHlìö*ÞÎSÅ㦈6X__æB›_n”xàøâu4ŠŸ?þòE®Ìþñä…ö·tdNDöH×}SµÖ+ù—Ø;wÛ|ƒs\)úëMGr±öSô©×tqË/]éã‘?¸l{lÊ<™Œ 9 ŽN~)ð>t}4zø=¡gî²Ýj¼r½äš ºy©­Ð+ŽõC&¹ZÏ]6É>wÙK hxèŒ,›èú€-<ýø'–ÐÙ¤ŸmXô=•ÆØtá|…ü| ÿÖü/žØa_› `+E2j¼ŠùK7`.‘CrüK@Flüˆ<ÙÐàÑù‚®<xôYgm±ß7¶º‡4:’“O>ô•i'݇œœ\´IŽ+‚Á› ÑáÉåN=I¢ÖAë+’/QŠ6 ÖOr3‘Ö}ÉÄk@ñ&¹ìó/ºZÿdÖºð‘ðøèÌ$Œ/‘‰Ï‰›>:ôy>ˆïê@ìÇ&ýç=þYË«¾éË÷üæ/ŸÜýé-?Þü¯[~çÓï\þ¯ýrãØ¦+²‰?~£±ŸB·ØÑ“¯´“u@›Lb‰¯è±…Îz f¨ÙÄgð)c²–iæ#üº@ÇŸ¤¹û?Õ,O8ý±ËüöË{ìø—|þÿ}îocœy”¹¹(>¸¹{ÿ“]~løm¼=e67ꨪãÆqëØšµ,kŽþ|æÝZ7k(îÛÐΦЅ„ãsÖÖ‹¥ÀIß˜Í ÌøÍgÊ­óª¸C›äù¦/ºs\ç3á|ýüã¿ãŸ}Füƒ›‹5]€]2³6ŒÜ¼9€g.bgS?üüñ¥ƒâœÍ³‹n§<뻓½‹>8þÈ­…ÊÈÏÍ~¹ƒ?kßäab£‘…ãlM.ÄGý½Q(ûøKSÉÊøœÃœÆ—áÁ§ ÁW³@.ß韛1ÎCô͹#k2_å`|%;…>ötžÜÀÍÐ?yhCGá_bð¥n6„'×õÁ)›·ÞX¶íp7 ’26´ý |ñôSî¢÷+üE;®tØÛøâœ–¶Âùb·cªXWZÏæœ#4k›6£½éWÛ%YnL¨m¸7Iî'ѽ鯵ŒŒ¶×ã}c¿M/ÛYÃâ»Ú¹ž}4~‘üÖŸ‘>Š›tCq÷“ðÒÃg>ÕÁ¸Eß_ºéÛ>îG>W,¹™Âž¶rÇUºm`r.×ì:jøë<Í®›3žÚwÞŠW×›÷h¿øC®uŒl‹§”t®|—yy7Ü ™y;ãȆ·@Dä•c1ò‡žø×o8ðcåÙ# ‰Óµ'ø£rìůõøÃ±i·Ïå¯ëG8uÆP8'²³5w+N:AôékG _S‡'vÃÏ?rmžŒ¹6ž\§æ: ÅWöb'×ühl­iìÅ:òZwðãÂëG~€ßôóMîÚ±%frøÂ{ÑŸÉÅ^bЉoøá\«ÒGßÉ£“K~àÐAô˜'pr —˜ø«=¹Þƒç?™ø@6¼Ú6Îúxɰ¢—ÑG>ÇÚ:n|úâ3–l˜ól§$ÖøÏVbN¾Ôø>…m²€ú‰ NŸ}5¢#{Ex^Ñæcò”\Ð8èeƒ}1¡Ÿü:W±ƒè%› =ÞØŒ~~ˆ)yO ñ—DÈ€q”> 0 Ÿà¨š]‰°p4ÎâÕF ¿>=kÚxÂÏ&>þ¤­¦C—M}ÐÿÑðñ™Îœœñ…/Ñb ]¡ƒM M¯69ø5žMrh?ž“O&ßÉYúü‹L|;\Ž¿Ái“ÕWÖú9Xé¿ØPޏɨ'®ØWó>9Éx¨æÜ=½Æp×I»Ú6[ò!ænbÉœMy‘9#çû¹{ßG@6ÙtÎ†Û pûF~ëˆÚZ³t}–ÛÓôy¢?k- Ãk­Â¿­c6²s’4>I›Å±¯=ëœMyIv©Ã«ô8)ÃÍç Sm<Öò\¬¸¸4Ïç$:´y2›éYKg®X[Å48[`G¡Ã<úÞ/û;Ë»/ÿÀò‘ë.*³¶ŽÛðãשׂۯýO¾Ê@ÑýŸ<8Å•¸ç‰»8å׬uÃ77Éφ{Îñ…ÙЛçã 3vt>îÔ³—o{ö__Þüñ·-7ypŒÛkxt±µ}…]ãˆ.ü&kð¡ëöÌcjÝé¼ûîŽ4tJ©ÍYklõûÉz9êµì>þÇéÊÕ\,&6¢½‰,|~_>7ëdç£ú6Éy=¼ ¯tMžg-MÞO?ýôŠur€cwæû´KÁ$¶jv¾\ëó äKìúœ[<¾üŸ6ºnJtœEó¿§Ú^Ïç»›½Á/]}¨½7ÿ¥ÇSxßoœÄ¶ùÙ_dXt<ýùöBwN6þõ“öâã<ßøÑ1~3õ·®{ä† Ñå±3yvÕçf>ß Ÿ16©rã]¹BgÄvrG/=1³ƒOky|ú :¹dᓲèE  z´éŠøØCƒWð$_x¢G;rÆNüQƒø„¿øé@W´Éj³­ïá—š>2ñOüŠ}¸øž5Ž]@àì®s<ŸdâG|†ÍXÿÐÈ+èüÚötn/Zb¦GÉ[t™ûüEGk×üx‹‡­è¼Z‰­üAü³þæº"½CëY¡ Ç‘ïìßü=”ñzž’z-˜”‚ Ì@à 0xA±©„þðÑCVðëÁ\ôÐK—„&‘äÑC£K]1pÑ£Nòéq¨ÃŸÈ‡/ºÙÔæ—vˆîLøÄ‰&vÍp°ÉþÐèåGdSxN¨oà¦w[ndÑ“ òÉ£;¡é·‘ú]li³Å>þ%x¸€6»êðè+ú€>ºâ7}±—6½lÇßÈÁãu -è¹[6ø Øò/&_Ŭ„þðÑ“œ‹!‹Ib‚ËØÒ›’'ÛvʇÜ£ ?º’yIBFþèù“>wãgæˆxÄÀw ¹—<îÌÝNÏÖ¿»ûiø³òdj˜'3·¬E³‘˼µq¯Óbñæ©ØÌite6}n<šW} ß:3' y|͌ٮ¸û7Ùk®“izñõÆZ2W@®”¶ßֹчfuï› U{ÃÀSbM²iLÛ~á$©eký%Ç&9Oñ‹±eúí‚’½vi—?ôø2¿Þ”Vm]öÚºµÛf[ 6Øæ¼§æyrî¼B\Ü`³Nzâzþ±ÙˆÒ‘M|¿ö^öŒ$¿:¦²Ç·¾ gUøÞ7Q6ú:g…ë›UgÎqb¼ä¢ã£Ò:?å;þžŸÅ'o3Wç<ÅVxéë±->x1»`,‹¶k:úZ߯^tÏ»jÝpp#Düô-°ö:/å\Ûù+ŸÔŠ<ô¸V.ðÀá7®Îéjñ¨ÑÚɵ}ò£“‹èÊz†¢_›]¾àѦŸ~ðøØ†SÇNqùÉŽv6‚bŠOdè¤Ká—šïÊÿËÞÀÿzM÷âßOæA ‘Hbˆ!ˆy¨¢jì`VU-J¯âj/j(·h)-Š[JZ­–š‰9bc‚"‘È(‰$2Ÿ ò_ﵿŸßy’†Êÿ•sëj×9Ïoï½öš÷zöóìgúâ‰OôƒØßÉ€“Ø:z@J<Ù艽hÔéL?¹i“?È¢+vãEËvôú´ÉW'/ºÐÆ÷ŒháÕãKd’Avä¡ qã¿6€‹ß‰YÆ6ºõǶ££+vG¦l|`“-1Ò¯]d‘ÁñÒ§ž¸èG –ñ1Ήµ>t€,2Ø«4ÿéÓÿžK™äÁë­ñ%}d’ƒ†l|ÑF=>¢Q§‡\ºÂ–½@ ÂKž Ô޾ärh§?úb^õà—²ðÅ7²2&tj_¸äÍÓŸÄÛ ~ l wmÒþJNÄØ¥¡pڂʱ% ø‰Ž$²% DîR|i0Ñ G/I=úàmêl ^]"à¾èÁ‡à‰ :ÂCf­ ëº"m6<¶ìXhðñh•¶è†%©“Y]?€#G$¦™è“èW¢µ‡Çx±‹ðp™Õác K´bIþÐh³.~¤'´áÓGŸRÿÆ §y±3z~ýgä.¿Ùñc_l„ÿ9w50®òðh«ÿwîv8~ê{Å\œšìC“\žÔìSñuð›y4ÛÌ7括¹@–OädÞŸ Yãã"×”K¤…b‘¶l4öc‰.:,*·Ü’=æ‹h_¼™ ÉtB3ŸhÒf×”ŸØOîä•äÍE½¾éŸþäÓÅõ”ÈÚ¯çâzîßñeÆ`ž(àŸ|hÌYó„a>)—±xĦh‹s6Îø™?áç‰!ŸÈ›OP°{>+ ñíÞy|²¿ƒ q)ª¾°à°ô›n6±wÆÌ~“ýˆ¯ym! }ûÛ†|ÉÉ›ùiž5†s¼'-팩ÍÚ£ÞËyÞb/wÂY(.ƹzújÐúñpæUP“_"†¦ÛÊ’MާܦË1°átb¯’¬,Lé±è´Ø¥»óke{3ou¬Wxúlp},,>:d}/š3ëXÒ6—äô±¸ø[NñÚµrçÜñ¯GÛù*è’ë)ÉÑ“ÇÛÙÐ&è,ÞäÛKu6£+%bH'èeÃÊÞVT–çdù^B/´«N}=>Êj²åða©6;ðð¥cWöÐᢠ¼ èú›Õæ«qé±®vôÅwq"{³ÕÉ}ì¾þó£õ—Ëx‡g9Žèm¼‰¡-=Ñ%pä¥ Ÿ2±ˆÌØ–>rÐF|hÅ\ÞôgŒ"?ç€hñ¢dÀ¡Ë¹lô°¤Ô¿„ø–s_ºläúÐħćñ!þÀØÛúã\D]êtÁ&¼thG®öRwâ‚WŸ.ø¬%à¸ôÇïðáºèÐÎ…•ØÃfxmrÝp>üð¶ØOObjüÓG½xéµýɃÈ@«NŸMì/]b[•á!OnÜà‹NõÄ€ xéb£~õÈFûÉ…‡#3xrðÚRGCNìŒ|ü6²Ð³iy±JìB{£7º£‡.vÄFm<á[öÓ¿Œš¥´ÿd¼Ð™ô3z Q¾Äý´z§NJYøáuxŽKÊ”eÀÜí½h4Ë`iG¹úà"ŸN¼xý6]K>¸ÈPâ#o‹:)¾Ñ®ûŒ]·¿Ê8ä„CÇ çœTšy#þ´Ì: ­Ûl«qöù猋ê=XN¸Ùn7WÞöŠãÈS¿?¾}òáÍ¿ðŠCtiÓ·®N”÷¹âµÇŽ[ï0¾sêãØß±LÌ$)Ú¾ú]Š›,²kwí~²â?è|% …˸ÁI ýðäànô6»Ð˜LÑ©‹Æ€ @½ÚèÎ>ûì®§O‰]l"+üú/o¸Èb¥þùÊ]~&þJ‹‹j1±õæõ³/µÀ8§ò .1Sʽ=wØ}\{—kŽ3Ï;k|íÄoŽ}z¿§µÍ[³Î=»ãÜëYçÖS=ç×ãÕ‰·ÒXÍj1€ïGçœÞ8øeîVÊkì´Ç¸ÆŽ{Ž#O;f|ï´ïwLåºñLެÛrÝØj³um‹ñÕÏÞ䮜X·é¼ ~Áfó`¤>°Í–[÷þ±óV;Õ>õÝñýÛþÿWÌ]w™,:7ß܉ūʚ Õ\ZìÏG¼åýÝ>>÷EñÌøªg_u·ôê;^mì]¹sLÍ=‡žtX噫ü¬«ý·>ö¶å¦[Œs/ÌEbä '乘°mÕúóêdµ..H_c©4uì²õÎõ’ës/8ozòa㔳Ok{,jù`Á‹v»uõäSå ŸÌ/»lU|WÞgœ\w¼;åˆqÖyç®|4^4¶]·uÝ5ž'ˆ[U¹íÛö¢éÜ Î©þåâXr¡„ýõSD›Õ oíSØb³çö»ë^ñšãÔs4«¹øÌÚ×ÐÍùÏåò" c‹>íø~zàõ‹+<»œËÑŸ;Îpü°©“ð%ä±Ñ¿ü¹AvèAC— ðMúbgìN¢?1ÖŽí±‡ÜÔåHì£à…g' #zøhdÃG=bxõôãÑo,b'ÜÏ«p4ibi|1æ¥ÿ³Î:»i¶ÙfÃÇG.éÒp _‘á ‡’AËy8¥þÐhT§AIð— Gß’G}’ˆ¬Ø§Àf±AOC¿EÎSoÿøq¿}î^ÛÕÇ Ö­ëíijNOÿÈ_Ïýå¶ -øå=n9^qç{¾þ¡ãÚW¸fóZìŸsþ¹ÍwA}\ëM‡¼k¼ä³¯ªêœôãÝW¨Ìóîòôq«ÝnZ²ŠA=»nó-ÇÎdÏ2vrñywù³q‡½n3þ×>>uôç{œÙ̶߾þ=ÇŸÜæ{¾¾rvËͶgöØï‹¯¯ýú[Çò殿ú+¯_‹ä»ü¯ã}ßùÐøÛÏî×8ciw¾?lßߺéCÆmþéîÝ—q¾Ïu}<ñ6©ÅÝ6}ñaëZœœwáyã…ýýxså»¸Ùøp­ö¯¿ÿßßÛÿñãËÇ}½qä°Û8“ûÚßþ»qì'Œ'øìnà }2¼ûuîÒ9¿¾tlµùºZä?žò¡¿‡œôí¦Ë8iÐ ~s·ÇÈLQsÉyçÍG°çO²˜æ}>z¯>·¹+»ÑxÄL˜ïq;§ÜöqµØÜnm,ϯGÑ_|ЫÆÙ¿éðÝfÏ›×\÷‚ñ¨wþ¯ñùã¾Zqv§Ã¼:õ^±ôüîëÇÿùü«Çk¾ú¦Â;ɽhìU…^p—gŒë]iï±¾ûòy³Ú>väAã™yÁ8ã¼3 YÁœ»^wßWŒ/wðxí×ÞR|Ï×»âÞÏÛm¹mçÙ³?ö¢ñžï| dÏ“¿ûÍ¿·Üý&-áq·zä°üƒCÆ#Þõ'âÆÎÊŽÚÌs¾·ÏüÁ{k~Þ¯lùôxöŸ2nvÕ}׿o_:îkã©•k'žuR˘ùµº UçOø¥G‡Üø·zŸË¼ï¸ñê/ÿÛø‡Úä²XómÇu;Ž?|ÿñŒ<¿óù‰·ùcÇ­v/ûÜ?Ž£~ô†îÛ¢.@€ýîùÂ.ÿåà7¿ýÌ~5æcì}…kŒ¿¸ÓSÇõ¯t>VX$Šã÷êâòs?õ’ñÅcnß²ŸÎ'æ‰"œýÓž¹¯¨{"Á8¯=sþe8·.oUµr:gÇFcÚÖª÷YÕ-îD4'†“²Žuö}Û*æÛl[~J^/k®ìÇâçà·<|™3ŒU?0“e.Âë<É;ô ßuÇ_à]ü¾@Qó[éèÇðW'«ôö¯ T;§è|áGÛÃÇj£#é¯nùoÑ g^S¦žxi'×ÈMÿÌý:/(»=¾O¿W Ü'kÓjÃ{Ê ¿#Pm¾6_ÑùHŸyÚ±&ÇðÄ Ÿr|t@üùÈÏþFÁŠŽ]«NƒÛü÷âô$GÙG¶.²×xyb¢Ç¬xýây-A¿ & K6±Ñvæ™g®-:ž…C:w«äP¦žÜíŽúyxm¾1ÿÅ$ÇåΡ’ƒ&±Šl±N%Æ mò-íôÓ…ŸxíôÁÙ–2ÇÂ…½‰!YúÐпbY‘»ðÂáK_lÐŽ]êtiÇ.%ä+²ÈÍfM„èK]› [dD6üÁ[„/¾Ñ½èôkG†:}Jv…6utäâ‰|h嬶ØâÓÖ§u}lŠoég_àÈê@›L%–2ÃÛÄ_|ÄO6~>ýì /üÚѽMü3üY·n^Œ@z^Ýd‰ÌK²æø3vßíªã;‡ÞýÛ®®\\’ø'µênS‚ ¸@™Y\`p˜sqŒ–ѡչðx²ÈIÒ¡3°Ê |èÉË YìëÇ—!{Û­¶¯ºÇßÔIÕÕÇs>þ¢ñ‰ïvœóãsÇÕ¶»êøÃ›?t¼êî=žòá¿;ê ,™}‚QJîzÍ;Œ?¼ÅÃjÁóŠñá#>9N¿àÌqå­w¿»ïoï{¿qÍö=àimCüܫú^/ê»;ÿó€?ëËóê‘×=·ß}üá-6ö»× Çó>õÒñ¶o¾·ùØ¿„øÄöîYÅ4~6¾pÒâe¼lêh”ÙÒ–˜pâг\rìðD—˜«ƒø—¶’L4Êä‹úrLÑÑYÆrc;š›\°áƒtåfîV€Ì k±dÓºZà¾ènÏ·Üí&ãqï{úøT}”l™»R Žß¿é{ñôO_}ÃøÖIß©…ÿ6ãv{Ýz<å—[OìHLù5´b.w€iÍxe¼õi+=QÔõ}Oüåÿ1z£ßÿ|ðÇ›¿ñ®qü?WÜú ã¾×ÿ^8î±Ãnã¥_øÇ5ÞäA#V–¹ƒV›Nþé^/é_-xÊÿb|áø¯Ö“ gk^a¯ñø[>rüó½_2û¾§/ÔâS.ý¢ç.rŽ—ý×Árà e…o­m‘>‡Ÿžgû¢ýï&µX}ÔøýÿN-Îß8Þd,ÏüÁ¸ÊöW÷¸ö]Çoû˜±çN»|úÿ”œ‹Æ§¿ÿ…¾ðyŸ}~s|±>ŠGWÆöÇîX×¾ó›{ß¹sêÝßù`Ûªÿ¦W½Ñø»ßx^ß™ÿ7?ºžøîغæà›]õÆã·ÿãñ†û¿rüÎ[=ιàÜÎQ»"Ù7¬'^sŸ—Ö¢ÿmã1üé8cýÙcûʉGÜäAã¹w~Z-Z6oÿæ{Ú§}è¹u!hËñî¿®óòß: Ÿ"˜¿àÄ\Œø,÷gí¸ö¹ß…/;_ñ›Ï·¨ û™Wõ¼ÂY'Ž«–¬;_ãWÆßæQ㺻ì=žð¾gÖœçXåx3çÈkïrÞ‡Þùí÷/ûÕñ™ï©òwý¸Çë:np•ëŽÿú³Çßÿ¬~ â̺pÇæ-6Ùz¼ô7þ²æú·ž9>{ô{Az‹Ýo:Qûÿ‹ïöœñ€7=jÖ {Ç;ùb¼åã%œ ™â0ç»yÁÄ ê<>Ê­ôõnŒ?¥C.ö<[us K{Î1(+@£eAzAml³Ð³¸³ðvÇ<¿ë' g¡¹¾.˜mýXxÃú)ô¥ËEs¥|E³!‡k1 ñjóË©ä—â¶µ÷¿j+ñ²o¶¾S]öêo™ÕŸŒºk_´¨~¾õöÂ91wái+ý.zÑmZzŒ–c–þö«JÇÇèbÏÜ¿‹° åW?e°Ò×v–<1TwQ¡/oŽómwñ³;s>Y±­e/h[K¶'qÄŸ]üó3~}q¡êð‘…§êü(€ ~’‹-0ŽÆ8öˆÚ~¢dF×ü®þ¶¬ú7°>zÛöÕ9JÆ9zÑèg¿>ã#ÆêáW_¶ÑøºÐŠ z›¡7ç¸ú¼©çü–ìŽÙÊV4ÚJ}è³Á/m†?ŸèB:}l±ÀµXA¯/|&“>þ蜫ñéGPÏþ™¾ØŸé·Evï×% Ä6>wËG”ñóD—¾Àcoõðñøž^'Íï?<çÔ¶Ç£±/þܫƋ>óÊq›=n1nwµ[µ}ñíÞú‘}Bóà·ýŠºÃýãgŸTò6'uÊxM]ÌyÖÇ^Xsâ½ê5‘«õX^XO+½ëÐǯyûz,}ëʉójîsÄ\TþxÜçz¿1>þ½ƒÆ‰gœXýî¬þx<õ¶‡ýðˆñÈz2à°ÓލùMÆÙõHþ§ŽúüxH-¢Ýá–£|r‡Ù¢œ™^qzégÿqüóWÞØ¯•ÈŸÓן9^ò¹ýê+üߨ¼¿Ùëé†ÍÆIgŸ2Ž>ý8ΞujÕ-ÜËn‡:€±º\Øšø–þ÷}÷Cã9Ÿxñ8âÔ#‰)]gwçýãwßZÍê—3u³‡t,ñÚ\Üø¥=n>žxà³ÆëêI„ãÏ<±å*_ÈÛÆÓ?ü¼q—kýʸӵnWÒÌ»æ·yŒ}à î;ž÷ñ—Œg~èãß|ÿ8±žèÚ¼.Xwæñã˜SoýÇW ½ºrJùæü ¯|ÝaÿÇ/ý[?àÕŠ³ë"ÉÇ(WæÄjÒ\îWóº;íãyýXyéï…cíûk`œjËÑÏÏÉ ù<‚Îvî 16!ŽaÀ°uÔ±¬õá«ÇD>»Ý Ñ*+½ØôÚ™º;ÖbØORTIWbe^LÞÔûøV:Ü1‡·x¥c mCá’Kìȱ•¶­+?,òé1`>¨Çîe¬´ü NžÀƒàä® ˆzÇI<ô¬ånÕůÇxe›‹€-6:cuü¡W§'xòéÄýh— ?8v‘Á¶ÈÁËeèÄ Ýr‹½¿¬bDYv%úĸµý¼xôØ“1bWçn=AÄžl|†_Æ?<¥¾ø ŽÄJ=¼t€ŒŸ@hÉHŒ”Á“W•¶ôµ€úß%^¿ o| /qçWúà’?‰­R?Ù^;ˆ~2“â§NW€òùmÓV’ƒ^;zC£Ûz D>¼ðèÔ•6¶ÙÐjgÌðDYÑM¾:zvÅ~%ž”Ñ—6¹èéüZæmü@ƒ° žŒè„×F—zt±>›þ؄沂cÂ*ƒ–͵úÚ‚›Åoˆz4é²§8ÎPF'`dhà š’£è\èQ> í p‚©_¯AÉ àÒ¯Ô&‡n¶°#›É²ygÿ‘7}pýÒ{ûýU822ÈÊ—}æÆÕë®üöü¥¶­'”Ur|æ˜/ŽÏû•ö! Ã~þ¼áëoGvôø½›þÎÚ@»Ãsçkܾúö'×O/:lä‚—ô}—ó7¸wÛŸé£ÃÆè›'·3ñѲ(ãwt„ÇÄ_ÅG½ßçÔŽŒÈ¡/±‹¬Ð(áýè²CðI,èáA£Ž>ú"'´Íp9ÿq’ô󘻉‹ñq‡{¿û¼¨ït>ö€§Ž¯Ÿ|hG!ñ{½ãeŸ{uôÌœÈx ú¾¥îܶܚ àäer¬:ÖdÚ’h.èßNŸù”‰Ê…­ÃkAôúƒßÞ´Æ $Þú÷ŒjÁóÀ}îÝcO^&¡ì§h¿Ê]¶Åo¾‘éñò‡Þèþµzk?c©#6î÷•׎Ô"è—®vóÎÿ*¹+žó+ðØæÓyC ½Oó^-Ö9À˜73ǺK1OÄü„å¾ñŽÚWXçÛ£÷|û½ˆ~ØMPû­ùd³ñŽo½¯_©¸ËÕo_C2÷[ôõÜt·}ÇÕwÞ£žHzájíÚw¬÷á¯5^øÙ¿¯Ç—åÒÜ÷å¨;Χ­ÿQÏ."•åmgÅžy{=Ý”…¹ ¾.$|®^­ÚkÇ=šžÌøM/{æãm†æºæÉMæ%þäWEþþ󯩼œòׯ?wuü¹¨.0UrßQ¯>Ümì°åöMら'º¾vÂ7ëI°ƒJŽý  é˜Ø§6©‹TŸß=å{E÷ÐŽ¯‹äƒÔëoûöûÊîyÜÛj+ÇH'QsÌЬvM5Í~ÝLyN½.À~~NšMêÉ—3Æ_êå㸊úù« ó„mýúy¡VŒôM¶ÒAÿ†ü©#KÉúš`#üÉþÏ÷låôk–橾 ÀèÚ:·Ù-ñ 3rœè¾é\ÇG›| ìœ«¼k™5¿µ—EcÁ¸¾NÜ,›§h”æÀÎøÂµ¤•Ì,bÉL.±ÛÜÔç)ôVÝ]ýž÷è©vtÀ2æb‡vÓ²»ä)zô‹'š§ðo·8ÞjunÓö ùx›§ìò¤B^@ÛOtV”ìÄKYƒÐ<âæb;n¥O½+;гÞ‚œ¿ä·œÖ0÷Im4çmÑÂÙèk€c|mýZD•.äBô±Eì3Ö—< ^™p¹mé¤+;r™»ìrŽ Ÿ >tr7ÇÄô+ñ)ãºñw î1«+™b–Nèð¡ëñXÅ%ôJr:ŸVãʦeîâ'—m6<=^%K=6ã ¹Ú6@¹Ñ…—]éç§¶8,ÏýÈ'àGøãõG†~´d§„#[;´øs.½dÄ·Œ+z| cšxâ oô.íËæS=ö°Iœ+xòá6;œ¸(£Ÿ:#[¿ olcküMü[hý ¿6:¼ >è‡WÚÈì´õ‡ŽŽå8êKÉ êÖúøm ³ýöÛ÷$xãFWhÉÑf+›àñb‡’Žð†Ž€ x4Ë6ºSëŒ^u²ôÓe?'/úÔñ³ÑþIžÐès¡Em4±“ŽŸÎ>ûœ‹‘yÍìÒ`Žpõ$¹zêi—FûqKC9oÉ©ž`r6€ã,È`’C&td$Ú‚—€7¡!¯l <_³àW'ïÕëäq§­vìG:ñÂáÓÈ:¡î€VrÚ»ÞÕ×OÆ|wvŒ¿û±¦3p‰ÉÉ ;úÒñ_ëwü#ïúWºnÓ»sz6Ò©­~òù§Ö ã‘ýÔ>¸Äùì ÌSÍ8%Ñ”âáªoÆ.þEdŠ Úл” ö°Im& m2#1ˆøã§~x´ÑI?|v¨V¶þøYCÝêKÿ³r—ï`§mv¯¼çßô{ÉÞ/þÒ1_»ÔÜõÝï±ÿGÇ4Ÿ?dˆ³qþÑ.kýíwVE‚Kæ®äy7Ùõ†ÃÓ(ÎÈÈHÌ2¦ž<ñ1¶ëÖ»ÚdëÏ«ÅÐ2à.™»ÓŽyUV~^s‡=û{^ùI¹{X-¦|7à:õ5þþWÉ]vø[á,˜¥Åœ…½…ù|§ž,e‘iì,Ï?ßɺ«åÖXî;>qÔgkAá ?Å=°%µ°õHø!'~{ì½óÕ×rêûuýËõ“w÷»þÝ›fÃG7÷Ýç7êNõÉã c¾Ð¶°éæõSß#9ø¸CJ缠ல1ž–_4<•â.ÿ•¶Ù¥ôÐ=³îë?øVû#·æE óßÜ?N­ [T~nÖ mó‘üœ|3¿çÉ‘‹óN6ÞÉ/wÅ-øL=-rÖgwìæÜãB‰ž97ùf}ž8q!åJ;ì2öØq·ñþÚ·æó9ÏòËÅO?ˆ÷‡ÿd?Öo¯}ÒkadÏq›Ç;rÊ“ŽKk^ÛÇœ€lÖß48«^iy|=v§kݾba²Í1Û·ÞSß5ø`ÇÈ¢]ÜÌc.¬àçëôwúÄ>Ú÷\DaŸòDÀÆz-"³hw'Ü]b±±X;·N„rŒ²¨cs·«__çOÍIJ[Ûª4‡åkÅü²‰“…a/4«M¿DËûöâÔ±,9.0°%›Œ±PÇß²ÐU¿(¹}¬ëU¼s7›ÙÅÔ ×–W¼æ©Nô’K{ØÉ·«Ãu|ªÞ>¯ò• 6õ~j«ør‰¶3|%£ý/YR-½ËÇüùä<ŒÍ[mö¯ÔŽ u@^6¹Ëv|‰oxé±#ýüegôáÆ„o-þ¥?ñ“^:ð¥D·ô-±J¿¶~2bÛÕÑÀ£É¦Ï"—í =Z›6zvD–zôèǯ ”‘‡Í‘ o‹|ôâ‘óóè§Ã÷–ù9p6td²/v㉠edÇ^eø#ï’ã;ÑOy„–õ|3z–‹WP¿z=Þ ^ïBþîî×G”¹+̃K˨¯Tï¶ÃUÖ&y'\àÄsOnyhÈMÚür§u‡ºkéÎ¥©í¹ãî¥ãÂúå“Ö’›bŸò„ºc³ûW]‹W+«?ä&vÓ1˜‡ÅTbN?Ä" ;É »õè0^ñI¿‰Cì3^±;co£wÚ6/˜¤Ž°“¼ØyÚtggkâËùO짇 €~hÿßÎÝRÞïß¿ªûÞ+v‡ð÷êë¾û‘úêùœ°ØœXz_øÛõ…nc(®ì5 Ä'åñg»ë7Ç´5Õ7ŸI'1‡ÇC>= i«~¥ív©w¨··ÛóÖýKèD®©ÐVϵ,û­ÓKú–€†>:l-§x‹ºsBß5ja{«GÔ‰_å劮‘‹?Ôî¶ãU[/9±9:~Ñr7þY¸»ãíîµEãÄkgmýN,„çÉùÁãïˆÛl¶í¸ÂÖ;ÕGGoQ‹Øçw.,ÂÚòȼV}ÏÄÓO5®d^4Þ~È{Æ_Þåiõ¨ÿnãè3Ž-|=fW¿²ðk{ßqü[=ù±¾ÞEŸ‹íÍêKò{ôGH_qϬÄ;Á¨ª?e¬Q7'‚«ítÕšOžûauû¥‰ÌiæY~Îñ¼øIŠwˆýÞ}~±€Ýèåmeo©’Ïó$kªûü”͘1Ž9ãøú+nNª˜7iæ;÷ÕZÇ4WU¾\ow¯ïº€ãëC“sÊâÙ‰™y„ÜÚ÷êi ®¶Ó®õÊ„cÄÜ\1V›õúŒÑ+ö懧/Ûu¸òÁÎçÜñOÇËê]þê‘ÿÏûåú¶ÂçÇ'úÜ8³.XøR?½‰¿ët¯ýš92÷y90ãåäÒé÷…õš@ž°ˆ—wÙsLÍ o6 Q‹Kûø…u¼OþšÌÁèm.øÚ»ÎYT;>çÀ¼¦žcFx"‡"aÙõâEãb¢Å"yYôF?^4±þ2ªqdÑ)r9n$gðàe œ~~Òá»Ó»úÈ ×øðG9øÜÁ§O<àbŸv1Õ¯=TomÍWmqŒü̯ö„-Ñ›®xé6ïv?+œ6}b›>tì&Ûøp¿ü€ ¾¹¸ÇÿŽUáÉb'^D6/[¶pB¼²¹}*E.°¶Ëª·î¢E×1)Þ^äk— .Òˆ¡;\ð :þ%¼Ç¦ìçCìvþÃÏøÞã¾¢—‰›8ˆ#9p?-w/™¹Kod)múCðhét‚äZtèÇ›ÜÕ¶Á†¯ñ ]ÚøÔS¢§_;ºcŸvhÙAW¯>zC•è¢G¿:% /¹«Í6Gvü$__øõ«³Q¬ÔÉÒVkú;Åf%€W—ĉ‰þld%è ½¡S×·ôlþƲ@Æ7²àoô€|u¾³ÉŪøˆ}¤t;_‡úcŸ6ÉŠ>ôŽ-±K›xáð$¾êá\6&vøÑØÈÁ¯ ^ŒÝ‘MOhô-mVN4‘ÉÇð I¾³S<–çÚd†w);6òC=6ÀÎø‡Wÿe¾ˆ»bØfëùë—Æ¿Xðo¸B#.áÒpŒõÞ N)H@@8o‹|ÁB#Ñ ˆà„'ÁA‹GÿR®~Ë=ZÉe`’¬d“Ôñeñ‘·ý–ó¤ÓÏQYá:€ìožüú¹½£{ ñFÎigþ¨mŠ¿ø£‹œÜ-uG Þ—ÆýÓy«»^è™ r×׉¬÷¯ÓïÝPä‰ ù•þ§¿èÒk2cG¦ )òàÔáqmpø”xàéÅ›6œ‹/pÆ„=pÚê ô±=;ÁRì¸¼Ê Î›q¡;ö(cÓVîß½w¹z?šûðw>al¹ÉãMØoüÑ-¼è Wþ»Üõá2ï5ög<ÅÎf¼Î:÷¬ÊáyÒîýv•güÍø$dÀË(qØ®~ê [‹£Cë§ñŠvRq/¤;³¾òž1&xŸÄFúÈNÌ‹½yäÐŽ[mß´žð¸5wÐZbá¾QºÜéÏ8¢SÍèár·ü·¨ÜàãŒoöÍé¯ýP>ȃ“Š|½»!›Ž«î<ç;¿Œà#$dœzg€ûé&çtóÅ…ãý‡}t<ýWžÐwôÿ¶^s²¨¼k½«¾m}äîíß|wíçžè1Ç^Ø9}hÑ8̧ƺF{…š<ùÌSÚ†ö«ºÊúÎiãI^±µý¨É:Ü ûâû§¸¹hwâ9÷zô‰ÏÔ›“9ûÌäñ3—hÄ`æ9X>"(9+S-Þ]@X·ú’þ9õsyS®y—>òæ<}A]¤~éŸÌø?:÷ôömÆ|.öç»ê«i7yŒ‡-ôxá>oü½qëÝo1n»ç-ꃈûŽ{]÷×êXrA}Üð­ãåõëˆäzÊŸ;üb€?>Î}eì¶;î8É댋þ˦¯3Ææ+ûsÛZ*Ü9Ö/Föýæu¶öª_PÇ­õE'Gj‚ ëEgQˆ—ÌÌ3ü.sŽ~'M¸éÖFcù…¶Ï%Š_n’×tÅ£BO¿p¬Ù¢ns;™hð%ßc£2ô|짪œûô†ãj_|(¼‹[­0} w%»uÑ·Úèc‡vǧΠ:ŽbW<.x°ÊÝtm´üUøÍ OgŸ­hÊø¶Ùw¢ Ÿm}ů’o%£åuÎØ•-ý¨þʦõ 6Ùhå§ó†¶§ôÅ7²Aìè§Vý9_k‚ËùOÆ‹Mâ ”+[_“»Jç^ÆTݹiliË6ºä™É‹ÈƒSéWOî’¥®”»lÉB Ž<|@ÐiÜ¿ÒYô%oФ_½s®äDöZî–.ºÁ%s7úðدô£%7²“G)ɉ ìS}dàacðÚÿ.wûvô Á›£KÉ&çEô   M\ÐÑ«$3c«Zü€4@?ˆ‘ ‡Ž< _=ò•‰%h•èb‡ñKÜ—úôôôé‹mê‘»CŸ–ñ /™á…Sgýl%C™±EO]± Ÿ „-rXŽ„†<8´|ñ?;R’'íe vé™x²o/õ²èËysøñâK Ñ„é~Àx@þ´ù3üq\ x-ð'ÁÚ‚ß»kŸÆše)Ø>¢ÅAÆ+9cKÐÒ‡S ¾àá‘PÞôÙ"K]¿2ÁA«.HKÙ‡.ýh €Ræ8´¾N >X?ûÚ¾¹¶àÇ[”xr1¡X<ÞùúÍf´ä¡á»¶í õsUÇô»ÓÀ‡ÇüüÞ•·»b?+Qø?ù„o÷v­Ÿk:¦åé/áÍïB‹þÄweF÷ùCŽþÄ/™è³é‰Ÿ:€„^,€>1¦(Ó—;ö'þ䄸Èxòô…';ql@y[\4wnºé#›zvÜØÌÄK,à7Fî’}r}¤ëïüãþú=û}ùuãÜüaýắûõ‹å®Å÷nÛÏäÅ.%ج¾ë¶W®(6Ï mÉ]1͸¡³Ñ—ܽʶWê°Çïcë#”è=‚ýšƒßÔ}â`ÌÅ ]6²äHd!®îæ-ñw?eyÌê£kpÙßí=ò3[³-6Ñ‘±¡èhƒø©ïÿÕÜâè±rwïçãäsnÇòºcZQ¨rƼ¢^q063&bsÌiÇöFß8áÐñÊ/¾¦úæØãG?ÇQ,íÛ8ÌÇ3Ÿj)Ö0½çõ~m¼ü‹ÿ\r.¾Üï׎«;׌ÓÖM{]xÕ—^Ûüú¼r`¦<9AçÔ3ǬMXÉ Û3OâØ¹ÅåKÛ9ó Ï{ràlæ¿ '²ÚÓ&´â0糋V rÃÓoqí÷ì7×;™¿pì¼ÕÎ-Ûq>rõ §¯’wS·`Íø‘·Ûö»vœ©'µ.¨_28¿d…ŽŽ+öÚÿœ01¾IÊöÌ1áCÍÐýk^uùp«tí¼nçþ–Ç#oþà±íæÛŒçÕÏóÍqtòOVÆcÎÕÚ¾i ?üºbžÍ8áÛ8`ÿ··žRîkû|”ôÏܘó¼EߦÅc‘š»äÅÜ I{¼GÔ-V;NE¯/ó ]ô˜£ô[tÏ NbZ'®u2 ‡Æ\ÿsÂ×'›—¾ PúÝÁμv±y°¢c£»ÝíKµ-\Ýqf=t~¹;ÍÞ¾+Å»‰­m/äãÉEж¹ú˨ùØ|ñ³U\d /ŠÞŽ}Ù! ÙyÞÂûFA/ô ßöTŸ 2€ýbÒñÁ¿ÂëãÇZìÉç*Û_¼E«½æ½ktüÕ§ÞýÕîøTɼ–|u´J¾CûVÌ3†dˆSé#gcAÇ/¶”¶²¯É þ¯lžÂÅ~ ÕF+®d,ã¡pž¡mbEFòêÉ]ôäÁÉ]|Ñ#_ée+™êúAhðé×¶±_Û¦OÄ?¸Ð†—ÝK|l‡³E'›ÃK~|ƒKti'Ž‘:ý‰Uèœß‘à’»ñ¥;êOüˆJòÅ Ä.ºÒGnê±3ýäôÙb¯2ýèÉŽ^mýJZô‘¾†dàK.¥)s)':àb˜‘)ÄÞØ…>ã ›”ÚÉ/4_¥¾øÎ¶È Àt‘K&>EzŒ1Z>êW’«?vÁE.<:¥ (éˆmÉx¼‘Ze| ¶/ó,4áÑŽÑ—ñ‰ôh‡fþþl½õüÀ'R6ü$X› °mýfíeFÆi|& mF ¼~Îgc˜ ^;}‘…oiyäØÐ( t¹Ô¸È¼$Nèb“ÒÀf0Ùņß7¦è¿X²ýxÓñ;õ1²[ïy³5š&¬?·®¯5ÇþØK.Yäø°Ø‘?:ºiàr¸ï•÷iúÄ¢ü䨶Ýlë~<úȺ8œƒvÀÎHöÔ;yÄð;>³I<ð$Nhô£Oì]Æ Yøàüêdâ'¿ L»&6mäôd.ó~@öÆ‚~°t~^r—ÿÇ~B/öÅQÜýdšÇöŸu‡'ÕÏEÍ×5ÄNœ¼Síg$Ý%þ|ROîú]qÐï¬VÜ3>îjî±Ón-'cµÌ]sðœW‹ƒÏ:¹?”—2F—ÌÝ{_÷×Ç]öº}ÛŽßÏ­C–¹»ó6;õûÛl`7øÞ)ßïÒO³%7/™»»l»óxÐ î3öÙåÚGlÄÏ&²”¿(¹›¸Š˼S<ó—¡G#¥ùmçñý,äÐä ÙïhW¬|àM|çÂxî¯ddl->ïyÝ»{ís·’k¿§oÎïoÿæûú"Í/ïqËþ:?ùŽCh»zÑZ”duê1õeù«Žê§!ÙU¨OöçàëóºÁýú©Ž™‡u õ¯¸ÆÞûå~²ð#¹ªÍ§Ø?ÄÓx± ý\Èo˜›Ø‡Ü´¾gàQñ:œ·ÿú3s^½MÍïxެ¯²éÄ3Nî_¸ñ®×o¿<@}‰o±ÛûusëW r¢/6y¬>Oˆm›P¿}|¹Ëµ~u<ì&¿Ýv°]œÅæäzUÀ¯|¬~Rðn{ÿj-2å?~¶;ÏwþΧ/¦ÿòfÎö—< ì݉ƒùÈ¢S>‹™…£;Úüã:íÀÓǽ¢ckî0»ÛŸ/ø7¾úĵ\ï÷ÁÉñ¨·/ûë'ßããs:û®tõõ˜•üå{ääô¾V|ý¾~õã•¶Îç’ÑzjžÎû÷üc‡E9ý6ç©|äô‡ G–XäØ.Ç ÙwþÙдe#:¾ót»ðp}—\ÝV2-Þ-Øñ&•äu_úqÐÂá'‹ýýݲß\{–÷ÑGµÑ¶Oe'ÿèáGÇ d:ÖXœÃº:fUâoƒ \ð-Ö9.ó\H` ùl³~¡hɳ…·„¶mìÛX°–»¥£õ®ü1fìd˜'숿‰YÇZ¼V¼ð‰z²ô‘ç.bø2_F/]ú"?ã¡ß¦Ÿ¬ØÌ.ºÑë£[º´ÑF>œ»©‘‡'¹›#ƒÌØ®$$èðÒ&/:#M|Ü”úœohÛ:ÿJv|໽î§mK<è¢'±bKèà¹xØ;µ£.vàI¼ÈTO¿>V ý©³#vEvúÓ·Ô©O½~~’¯$ψMp±‡ÍøB§‡ÀÇŸèÐNŒÑÑe‹})—>à‰㟞èB«?zù”:še?þ9d[§:_§›-^^ÀGç² G‡’²–~%®KùlÁgËXÀÓ3ã ®°Ëx%èmäèS‚È\Ʀ;~Æ?Žß-~Ê·w¦µE1íP_H¼,ÀXNÅy²"C‚GhòÇñn³Í6½ƒ ÈÊ  # >›: š~uôôáÕ¯à«K ûøàM¿‡ü{7ù: ÉIÖô!å7«Ÿú+ïA4À Ä5Ü»«tG”N¶Ñ ”¿´ûÍêƒ}×èŸì#‹Þ¯pHýüÓQãá7y`óÀÇN|ê¾Ñüû¿æ+Ús'Y©CÒ1‹ÿ>a /1CÃñ€Mp&T:ù/^¡ÉØ‘^åèO<ÙÉØ˜qVG”ÚÞkm›:¹ú^u™ÐuÇFøC%bb“züOì⓾øµ±r·”׊y°[ú¼úñŒ?¿?öG·þ}f¬åî›yg?=òà߯qñc͇:ÙøMÔ®ÛtÝø­ëߣýóQB>úXë;ë' £~šoç-wlºù4Ć1ðaÖ[í~ÓñƯÏù[ló‘Wöº¨E9?¦n :v¶Ù¦Ížäyòmÿhì¶m=5Pv±cÝ:OzÌ‹1‡×¯ lW¿ìQ§E™ŽÑN Í©öxšû äËsä…ŸYô=„ 춘ë“ú:†[˜#‹^wû-.ÍS|„·Ã2ʼkÁ玮úÌ¢[åouöbÓ¼]Ái™›'³s¼päé£+w¾ÙO^ô±a º,ˆÑms Kö”<0s¼Žó…³¸ÆoñÛvªÇ¯=žèÖ‡®cQüðÂ¥´cæýúøGÿšÿôõþ5O¸ÉjàçÊwþšÿ{1^ü¹ØÂ·¹oϧîÈf7ýt#þ´-…ë¾£¾ð!v¸p@ "b[› Ÿ‹M³òGémÿJ¯ |ÝWm碟6®AÉÙXÐñ(Ûän6ù ·ô‰ù¥å.{änÎ9Ä@=1ë¼,\ðd2Ñ­å®1¨¸¡WÚĵãUôôGîR6ýËݒݹ[%y`9F‰9Ýdägç_c.%wW±`}6uòø…Ž®Ø݉ñìŠïhå®väÂñ|ëøðt*ãúBKOì ‹éOl[âC^4dÒÿøœ8¦OäÐo xñ(c«þ´ÕɈ>²"SÉ_}êždf§˜¡s®¾´CNèÏÆý¡‰,%»È±±d<茉¹þØ„ p‰›R||"'r³.ÔgckìÌz0_þ§àE£DÏv€ÐàÑ¥ñ±‘øzhÔmäØÔÉÆÇkZx¸ÐÒ•’#èÑi/mi…?ß 7 Ê·>§ºt¦œQô¤’v¸l ~ÆXƃà‰£±©/!´ú$Ý’-9JréÐïràõg[ê  ªG<Ñ©¯úÒ¿öݪ—ßýùýÕhôäzoÓ“ßè¾ýÿ/óÕ¦÷gžDŽ~øU÷ø›:9Þýbƒç÷Óÿú®ÿ»OŽøî‡×ÿüú"òó>ñÒþÿsïôÔ±y´±-ì»ßus<úæ©“Åýû:9ʤgŸX4v³$¨Ø‘¹âŒž81Ñæg&:}K}‰[ú•hà#¿¶œ>´ä%~}ms•Ñ —œ‹Í¸þ”gk±ˆ¿l`cì`CìˆMJ€Vßå»óNÖ”OGr÷Û'}wüýþe|àˆ×aÛþ¹±ø©ôAÉçÝéiý-‹šæÖrÅxÿ[ýÄäéëÏ/ûõ¿{l»ÛšúØå7שþë¾ò–µñ…õôÇŽ<¨Þ9¾u_´X殟m{øÍد»ÐµÌÝWÖþ¸w](³ Üü¢9°oóM6ž"¸÷õ~½]xØÚþ±üEÎ]±¶Pœ gÕgY]«œ¹;}? £ë×üÖqê¹§ßåÙõ%þk®ÆÙxoR?¥·÷xÆþ¤Ÿ4yã!oož¹/Ëý ;ö.ðX ¿·¾NÝ…ŸãçD`ž„wÖê·ì?0Qî½»Wþm8.ìT¿mÿÔÛ=¾Ÿîxéçÿ¡çR‹OþÑ5}²/l8¨ ——àâ_Ï­Ÿ¬Û¾½êlI>¡rg\æ—ôç\¦Ï¯üém7î´×í*o˜Ï÷߯¼ý•Æ¿üÖËúc•û}ñu-#ÙW}ùµ¿ýîõÂqµíw¯>'"æÕM;~öE^_qŽÝy ùì±Èžs‹“Š9†¾Y¶­of¤Íßùpï{>˜èâ2;èsf¯¯6îWñýâqW 껫“q²¡cß\Ü;8oXpäI|ú66X8òÉ|'6òÊ‚ÒoÅ÷b²lξ̱B׋¿:ÎX€ö‚²èȰ@6»›Ÿ¯ºËÇ2ûÎ1ùâQÇE?Mçäwæóô–×¹€`ÞÅ“ÂÑoñ®ß1lŽÙ†‹ëbÌ^:-D çÂ9ä¹›Ýtú«hóW»e–|a7°(ö™ä‹ýÂó}Žo•EŸo!ô“%Ân x{}Î7:þEO^×KWŸä#ÝÑç£x±>´kþFIùb|4ìîœ,Ýy¢€®Ø‹–œŽÙŒ¦/n”M}R_í<Ažu\ ßç$Õú6vö&~|²ÑieüN8:vE§¿ó bعR>GÜè0.hz[h£G<,*´—Ðq(=øc‡±e£±$Û>ÒyV8ãÑq/;èK™ñ‡<:ÑF.Úð*ɲ‘ÐË?ýpêô+múõ¥L^£µÁÃ]BGWž@`#zöÙØ Ô£«óhe[úô_:ïË.1ÑO.ßÈ‹ý±ƒè´Ñ©“Á‡è„KØYá‰=J2@b†àé׎|v¡Gk Mb›xâgýeb–>ýä°Äôtà“‹ê 6'f±})3ñ2fè=6tôÅWrlië'3çÝxƒ‹ ¶D®>[䨧/¹H6|Ju:Øgã#\â¦m[öE'û£‡œð§®Œ?lŽÊàù3üY~hÃ9á¿gœQ¾~›m¶¾æ§7ën$‡º^c°S‚,HxÁHÀàÑ Î%ùñÂ|h¢'ôK8AG‹7ôiÓ•VÏ „Žîð?î}OÏ«»Z>ô}xzý¾ñ­ë½…ÑAGa<ë“/ìLJ'ðçÿ›ñþÖxǃÿ¥–ìèzÔúúW¼N}¥újã+Çc<ñƒÏªVj±‚—]_<þàñävd\C“±` þ‘ÎU0ºÑ81%?;7,sd™G±AÿFîòW´[v±û—ƒß<îtÛg×Wººÿcׯâ©|îxÖŸ4žý«O¨'F¾Yv®Ÿ˜Ü÷*ûô]òG¿çIãÀ‡¼©¯šœ8¿÷°_Ýë—ÇŸßá‰ã~õ¶Å‰Çîoxåë|ïSã€Ã>2þàf¿»¦Ÿ->hù°ý?^t·g·>ðÕã°Ñߘ¸Iå¬_8ªd<ñÏçm2¿Ñ@}/þÌ«Æ+îþWcÿ½¦ÖÍBÓûÇó>õ²qÿ}îQz6ÐŒÿ'ŽúÌxâϾJþñ?xGïç^xî¸ån7íŸìû葟ññ¯Å¡É/¶Ë_ÈÜíÅíÜÿ¦Ïrdîÿü¶H´CPa(°?ÛÇÑ9‰ãìóÏ}ûãú‚Êëï÷òþEˆ#êõ¡›\åãªu7ùè;žôÁ¿§÷×òÍ)dÍ!Y¾¯ð¸ºÐt•í®Tóزgöš›æXÚõŸûɿ甮§ÔÅ ¿8á¾Ù ÏΫ»É/øÔßÕÏ×}ºí4~‘aüì.@˜ê6ÙıÄq¡æw.lÖœ¸:õêËwǃ÷½_碅ï_•ììKÛ¶>Ä7ç'2çzàáí×Už×?O¸Í£júöØm»]Ç>WºvýZÀÙãÑï~Ò8¬¾Ñ2c:c}v½ó˜÷=e<ûOû?ðŸz_󤘋%ת'`Ožö¡çõ¢ÑMûèb7ß|¡ß÷|_!cä5ÇFüµºÐ|Ø¿7^÷µ·Œ“Ï9¥å=ïÎO~ø[{ýú ߻Աâ–õ$ÁQõÊØ3>úü{O·É óøŒ¡ñðÀ£ýâàçg¼•yzžzdc½b)_3ÿ÷X¯ö[x0í›ÖX8{—ß¹ùVÇ ”›•¼™+³_`ïëíxݶ€Nîø {< zÚ¦Jô^ä²a%]çLÑZlº`ákô¥î–ƒ¾@PtÙÀ‚öìÒ¿ÉÊrÝΫ.(«Íf´’]ž*hÙe?{àbO/‹VLøÖtÕ/¦ñÛâ>›6[6åcñjgáÏþYP£åÏÌ×9^êdmaüІÿttÌV¶¨oQ[üD¯/f¬ô©;ÆÆ_ýÙÈÄ‚cc‹Ž‹}>ca[FÓG7&°ƒþKæ®6[/-w3^‰}ÎsÐ’¼’ Ÿ1ãgâ¡/ç[ê‰Ë’ž\øÈ˹½±Sìµ:[tàí_°Xù9±C¿M;þÒÁ Ô;Ñ…‡,ý±%zÃCž>m2ñ%bŸœPþ±q©_xâ7\tÑÃ6¼ réEo‹Œ”蜋^2§DgÁ³)@wü##eÐj£…‹‰OlÕ6øØ{ô-i´c»ñH?ùxáA«¸h‹/€‹ ü þ«ãc K݆^[lˆ^¸l‰={€Ž ¶ccлЈ6èÙèÈZêDGV|VG>¼h´ác÷’ù^¿A«.v…Þäi|…‹n8ü—øú³ÀšTWl ¼,çy –Ò p‚c6<SÒ¯½Ä¡Ó— ãW·¡KöÒ64ømlÍÀÓIvìÐÿÉú]êû¿åz‘½:q»âÖ»Œ7~ããKõSL~)v)ÙQ*Ϋ;BÏüð Æþõëë„ïû¿û‘qpáó%éð,mw׿sGiÜñ·ׯwY·­»S¾¶ü¥ºpȾݶñ ?ª“ðÿýÑ¿ÇÔÔ@üý›ƒ^Þï=ó?èzlÖ6&+À~u%È8….}êäD6¼8F–~|ð‘ƒ>¾èÊx¡‡weQúè o)[ûò„ÍVOTü¼åñÎ^ÌŠ±ä®x<¹Ó·¨÷¥·ß|»qÊúÓ:~ç×»õO«EÿÛêçÒnºÛ¾Ããø_ýÁ7Æ«¿üúñå¾^'BN…äʆIÝ8ùúúÿúÀŸ÷¢ß+]¯Þçß}|§¾ð÷_xMß)ôûëǧ_Þ4OÙåýúß}ÛÕ«*7ï÷ù¯¾óãC‡bZ‹­ÖST®‹«±Mî~¿>rö€·<ºŸB¸æN{Õ;Ý; ¿E¾ÿû'œuâ8©Þ‰>»hÉ/öªìû¼õQ½ ¹NÝ…¾Â6;÷éÏó¥Þ'“3ɹ_ôÜíý}µdq‡wÎ?ö›Èæ_pÁœ˜’?è–‹ðJ«âñ‹ 'ÔÅ£ÇÛÖÏóíSß/¹Fý<©‹=ß>ùðñ#?Ö¯“ÐiÌG×ë=ö³~8žTù¸eýŠÈ·ø붯ó6újŽ©;Éù±¿ïüÖãf»ÝpìsÅkÃ×YO}|º~nò£c~ ÒxgNÝ´ÞI߯ÞM?u¥w*žwÇÑl2>_‹éÿý±¿®ŠÕI@-šË›ÞWž|àsê»w­ù·tœzä*ÿœÍ¹z¾úÀ ñ™ ân•Íþ±þ–›ïz£¾èzH-úÿíko«ùû+ã´õ?jÿkW¨2|?GÔ¾ð°ýWûÐmk_¸^}¯`×ú˜Þ'ëc†¯Ÿ®/êûu ó¤˜ùû3ê3žñ‘ç÷E`û»òm1vþìŸ3ùî?÷¸ö]ûu°œO>Œñ©ïvÜ÷M¨§rî\?§¸×Øj³u=VÿvðÛÆ§ùB_€ç >òcŽ œ­y±‡[n9Cy^ÿÙŸöäºüÿæ%yÝÉͼB“>ûrŽ%Úè,â,*µÍEò:ô©ÃôäÔßùXvl}áê¸eŒÑZgî#¿ÂðEkë"ÁùUgk°¯Êõ«¹Ë ·héÒN<üda_ `g»]u ëù ŠîjûI‰jöB¼ä‘“ã]æK±ÝbÄ.cÒ‹|¢V¶‡jÎAó\¢Ï¥JFïMewCñxâÂÂçâ}€À7uýçϪ»XØ£îgþ\4¡O<àÕC㼡ç{ýµ5ÏJfm„?¥ƒñ¡m(]ú2VíÛÊv1ê8OÎs˜†žO¼á  PÒ©?¹f,á—~ûˆ %ñºnÑA^lÁÏòÖr·ø£mø—²Éµà WÝÚKæ.]‰Ûb;:²ÙˆÚd§@KOôªã‘§{B:öÈ}€ uzAl ­2 s¯©â¡¨§?v‘ÝèŒCb©?>õ´ñ„O?yúÈ16MîèB›˜“‹&´‘KÇxÈF«NGpüׇ¸i„—ïüˆÝxÔ/´d7öF^ì@¯Ï&t6ü±>¾ #‡nc‘©?öF¿2òÐ¥Ž¶ØšøD¦2€7|ŒÍøÄ“<ÊèŠâûb :ñ‘ÿQé"C€þŸk{×vÛmøP£þÿ§oPâÃÕgmz´ã\o0%oúl¥ÁT¦ÏÇèÔ^:KNøè#Ði °›>€'vþðœSûîÕ{ê1Õ¥\2ÑeÃ[j×l=_9îëãÐS¿ÛWGõÑ'9éâC’€>4§œsÚxk-Ö6­÷]£O©-û•ôþ°¾àîÙÐÁ‘ádhë£W]|‚'/1D£ŸÜÄJ¤N› Æ…<8½ø’L[ðxÐ¥MdE¾>ô‰;Ù±;2[øFøCwt°‡îŸ‡ÜuW0ñaß%s÷„³Nï9ìƒSq|Q÷8ïÁ'}³ë‹&Xýq"Ÿñ[âÝ)·‘a2weßZ¯|ïô£›ô’¹ëÑéö±^.ÇqÆÔ¸/s÷Ìõg ßÐðуæ c¿Øúñ$Ø Ž>í¸qäþïÜíhÔþYq“¾YÀ{L^]Ü€ÂÑÒÄ#Þ3ßµÑÌ}Z¬k´ê.ûúº`ã«ïŸjZù7¢Ù·Ímó Dfôo¸â~aÿ'[Fýi›ðÒ5óÏO“ÔMÇ¡§ÖÛ´Ç< W2ßðÉ¢iúöñï¦ørÂc‘ÇöÉÃþÃN:¼·ù¡¹é«úÉçž:^ùù-Z'ÂîΓ(wõ7­Ÿ°œ1’wó±»ÄP<åÿQõ“«ß«\{û·Þ[¶8™6ê'S\gúÚçæ‰€8~¸.’|¸b1s{úÐÅg/tÿãóÆ»5ëå{hçÍ}i³ºðvÄxÑɯ, ÇÊùˆ«}ýÉu¡å_~Kó»"ŽâÜO T?éš²æ ¡:ÞùS|¢W›u¾Ì܈m­àrþC»Ø½ ¤¨l÷7vÍÀ(á{Y÷s7ƒÝú”™µÁôWi±ºžc*&-»úòí^ø¯èÑÁ͸$÷fœÈ§«ùE'¢»å–-Åܱï6;V[ô¸ÐÀ;²úIƒâ1Vúá”-«hú»Õöz‚§Š õ¹8 ÒÇþÄ2v“©.¾²¿YÉh(»]„(‚ùÞ{ÙØOMTŒ-šûi…ÂÍýDfL?[vÕ×.”ìØÞqáÓʺڒӾ²¡lB/.Î-€þÚ{œç¼³:‡€_ɃwcJ†¶¯ÍYÝ…ÊŽW•ÃÉå^°;yÄäßù\ù|.JüG¹+Ïm|U¾ØgrÕ#;x¥¹Ar õØ(öd£ƒ»Xî–.8rbZ[tÆ>öÀ‡^ìQb¤Ž6¹¡t<§?þÅ&´ä)Ù ŽíàsNޥͱ .€€­±<|Á£cGüg6xt΃Õñ²«ÐDžÒy%ÔAh"ƒ<ý‘'gÒFC6½Žh 9fNYhÑ€øáùAÈ"Ÿïðñ?>¢QO ‚W6©³Ç˜¹.(åé]õäCüˆÜ娩³/cN¦:]6ýøR§+uøØÅo€?1Pæ\ÒXDƽÀÓƒÞFœ8¦_›ô³O_úñ$?ÑÅvòÉM_ìKž¤½3|ÿœ½Xðÿ4Þ9r%m«u>ëA= zY€ƒî`$(œÊ€qD$(J´@Àð'ÙCŸ€kK(<K¹ 09ÙAÈYÊ&?I&Èú³áQ`}tD7[ôç± ¶Ä^2µñ tjqPG“dÌš¶þ¥±ôògóÍͯ|†7Ç+-høožÓ¦{ÚH§}|~{do Kä™s,û£)¿•´_ó1§çÜÃùí¾8ùœówçB‡È ëŒE=ú¯y’™¶\˜‹þ9n|ÈE c`läº"kÑÆv›9h©O}æïê]Óò…‹há-V=ªînwrQ>ùÕ×'úú.ûÂ'wÚ3÷5{Š>qŠïh¢·*}WKySumwŸs·ßÝu÷ºÙA6™Ú½8-yž@€‹®èh;Ȭ-~Ÿ6_,ÆÝŦG_t)]İÿÀ»°€®í¨¶tí»ß…ßœ-e0ÊhŒG¿¢Pýôµì•-Ë8y„=ˆ_ñ#¾ŠK?R_eÎØîXŽ–<´Jmø+¡]oÁä¯Ó„·÷Õ¢ –½ç-pŸj³ocž7°›¶øÒFÕºÙ¡/‹¼Ð¢qîƒ'ÇXþëÈ9ôñ=}äë'C>2”tb':@gνÐÚèp®‹O}dk£%/c]Ñ6~ÆÖ%MÍÊæ,¸–ºôóˆ_›^2éІŸsöÌÝðÇ646íØ‚—¼dÇ74êò3úÂÇG}9æÓ¿ÉC¿—ãÈž@ô²oèõÓ“’]xèÓ>vjãM_òÀ¸± ‡†¬ä ~øœÏ©ëK¬ñj/e“ÅîÄm€¼øCVlýpxm‰'¼::ºltgƒ¯ºØ’£n,ô…FÝÆ.:™€ÌÐj«'÷ÙÝ‘¡?à›Í¯ÈSÚÄm~9 ÚÀR.Úð²)>èƒNu~<—œ2Æi/˵ÿÒàåÕ‚%ñOª3?c9‡2ú’LÞ x‡^‡ñe· :zl¡O ãK >}êôÅVò~ƒôÑI^êô¢ÍÀEÞ<‰“d3a¢zd$Y–¶ª“ãjXâÀ68íø[Ú¸ú³ì‹Ýp‘—X³!±C—ø ILnøõ-ãƒN$fñžL:ôeÌšxEF¿’ìÄ8¶D6ýÙÈ gcà èÿ¯»â˜xÊX'GÒÿß¹;sýç-w×·y’¿æ-·4_˜ëæ|•±­]²æ,û¨šsÔ\Œ£ÁoÁg9ïàgnÕgß[->Jï̹øµïÌgÿÔ?y+rÕg?žù5ç 'INºh0µóàŒÆB“½³Þ{gë0%³ß… s-f~ι¢8Ư9Ìo%Ÿ ¶ò-óùx:æ´3iÈàÛ”ÍÏIÍû¸l8è:FL?ô‘Eϼx2c¶Ù7OË»’-VöOu ðÍzq™ýâà«d¡uœ²åÎ)üÔ?ÇC< Éç[>êã™ùb0ë—<›ž^ÎKgÇ­ZÀK0Ç´ô ðêXÐÇÛ2Üb\ÅÚ£ôhÍapl…o›«ÍxcK!Öî‚/ñìhz6” ‹wú?x\ÞþAV/äÉÈ‚^Ì~z-¦-˜¤Æø¶£Êþ-ûÝùîȹšƒÙÐü%·ëÊ•½t‘Y7+»Íekž(`7ün>Dá_³w_´ú¿‹ÊçŽ5\ñyG¿ŸÆÈ8ý9õô.|¸°àbq2ìïïˆ ªÝø•ŽRÖqº¨ä]PýFiÝê)P´¶ŽYáeEÛW8ñóÁCc”1I™¼!;BØ´±Àˆ™g¬cCǼú€˜°?ß’—–»íkñ*ïԎ¯ÚÉéØÝd¢sF·:È…‡ÈÏ‚[?›"'¶áI¾¨Ó‡Žü<>œsxº/6¾E{ñ&ph³èÒG&9Kû{¿+}ዌȄ½ñ‡øä<|ì<:lgžyfÛ OŽ$ž‘¿”O^l±   K­sëeÌáéUÆwt‰ºGåÅU?~õØ‹.m寇‹ŒÙÀnv$çØÀרq„ç¼~ñÏ8Á£[Ê#?r”èá³Eö2†dh£·¡…# ÄÞä^ä'Ї¿V¢#º% .㯌]ú–±0Nу7þ“þàþ;wEèò‹‹­¯ÊĵZŽEŰ8œ9i?Å+w“K.Lf<å:ÝÞ|ó,raÊ"/êt Zó œ»Ãsá-_QÊsv²AþÎý-3§Ùn>rR©.•“§4?^óÏÔ?éÌ_|Ðgßã‹:[f\rQbú­ß>3÷YûXÍ;þsîbßÜ,Ôõ;Aa³m.ÚÃÇ3úäwlž1±oÚ÷Ù2Ÿ Á﮼)2òØÄN4âDZCü§Oà°%=Ïñ&ýŒûô‹.ôäã%–îuëæüZÈ‚VÚ|óþ—·yœštéïÆPæ›~×¼lv—¼_5°3÷Ñ8sÇÞ£ë¹ûœy…déŽp/˜‹®Û5‰«1CŸ»ü¼·p×¶(•DdôôêÓo\íckǰ¢Údµžâa“Å6^wª£·®-èåº~ä¼dkAÊçöG»ðdúÕ{ «Ï#üâ‚¶?d·:nè'K¼ØD¦¸E:;ÉAŸ»Pè–ñ ‹ß@Œz¬º¸t|K6?Úºù]8 ô¼*° [øQ[ï «XÒÍž¼–àòAcÙ>s~Ãq£/z |Ç´dÂ'«,åor†3ϧ.t²ÞwrÜ©æåô/íж±'çŽü`Ÿ¸‹obܱ-zÞ¿ò H¬µÕsN_ޝk1]é#>xö„ž-9§Ñ‡Žlö)Ù G/Z4rˆ šð;ð†GÝ¢†|›1éYÅol…§‡_ѭϰð%±‘ €l:mxcŸ~8ýpôYÌeL‚ÓŽ]‘©,mur@Æ,€Äx%9Á“²ŒÞèF‡ÇÿbÛÐb3ù.Îà ?:xqÅbWüŠN6á֬܋.x²¢_䨢‹½Ñ¹pèá•ll‰Ýiác—M?²´Éâ{쎬؀N\ÙýhìJ|±½¨?p‹}rÇxè7~ÿ»?¿¹›GúçÝnûŽyØAu.Þ<?ïö;ñ“J^£q2f¿¶ÛÌæÄ9÷d±Xéв¦ s¢¹ÃA;>cb™tÔ.2:aœüJž+JJÙ5éô͹fÚ:ïˆÏ8vk+ºM~…¼Ðà¯x"O txùø´bîèùD7y¶ø†ŽßúÑÅîÄ@?|ìПc¡×Ç®”—¬³C_t¨Û,Ðcgâ€&1 [ƒSj³#´ìñ]]hñÁk“À#ŽJ}è"G –m:µÉ²¡ÏÙä«£µi‡G‰^øs‘'öÑ©ž\oYâyd ;8ýK c9~±+2´ÕÉ!ÃþJ†u`hÉÓY±©ç?ªoQO0Ö¯ßÛÁ¥\[ðÿèôÓƒ«S€Ë ÜtíDo&.线h8h ” N¢Y:Ïqm|Jm€t£þä ™ú–ô—<]裎-ø îROôÃt|ƒWW’sú…g¬}½ß ./86àQÏdYv uô©'Žð@[ì Î&&¡ã\â¢\ê%#8<‰A⢠аoô( 4ì…“Üðêl£°[Ž|t™DôÓñ 9‰ºËüœWüŽÍÑG?»llâl‹ÿ_{÷ÝmÙqž~w¸·sNh@Ìb’(KV[ÁÒ²-×Ë3küׄï0i²—­ñØ’(ÉöPT LK$Í"$ntÎóþªÎsîîÛ·»îÛÝYT×®ª7>õVíª}ö97X…'2£.)ùœô¨b÷ËßûJó!qÙÅ·»ïžØYâN¬ÕèU¶²ŽYCÄjïWJ}þöuµf\ÕÝø­½¹A÷Ã_í_¼‹[‡~ÃÍoS= =úÍ_:»^º´ùÎ?:¯šç ª¯ÇÞúÀ›€¾N‘›9Ÿ<>™B|Œœn“þ>·è濇èøä»ì’˜¦»¶ÞµÞàé¹ëî›r<ðúA·óô¹Î¿îë–ö§Tóô½o¨b£WøñöðÌAºÛÀ–ø@×Ö­}ÓÅgí++ðv\»½Ö:ú¡¼¬nþ‚^»JxùÔ?óØC Ɔ qü½|Y\ð§¯í|¤·ãnüÐvþVMÚæÿÃ*¯Îçžà^‡#k«gó]q‡u‡ºlØ4}÷^vþTYüðË÷Ʋm¦´U¿v²s¯É=O{[ËÆÃ€¤5ûøš_x´ç>W¦K›ëªôyù0ÿí#ÚÇ·oÕ=}ôè“È’%þX‡‹py >ZB¿ u¨¾Z÷_‡em¾ÇOn`À^}øñ·ÉÔW²´'Á·E]µ7[‹Æo%$i£S–ÃtòA]Ê_#€Qçj[±ÿi½}o_òôK;±G¹G—‡8ôx ¡½½ù±à]bWuþ]]|ª¼Pµé…xŠÍÆŠÞ TŠM}b7¿`cnòIy‹Ó²·CÙ,µ[|(?µã#ß5ÞÄ‹û7yÁob ­Ì–èÌüJ¼»®É•éô5ŒKN‹ÅjËž4zbK°oŒõOìe[d(ñ%…‡têÓ¦N.ÞèɧÔi'ƒèç˜h}hÈÉž8|äÄvý©ãQu8ÌÇ­:=l¥Ã5>u _Ê´£Á\ÑÅþÐÇ'öFvô£‰®ù5=óµMÜÈŒ~õجTOœº–ƒW0 KŠ-Wühe‰Á%²ðÚÈ@—öØL´ãמ˜k êŸÌ·ÈÏ¡'W|J®%rȤÛuæ[ôÁ>ý™»ú"ùÚ\˱k®76Å7õØ ”3vtJæ/:1Áíôº¦'üømü³½öIgêaäíÒ’êÔ©SKšwª ½Û§8ç´ËçP@ãÎIhÔ%4é˪§M@ñ…ží¡5Hl‘Ñécƒöè OìC£/r<~Y"_;¹üPJdÄvGGè#‹l9):ñ„/¾¹ÝêhÑ:}è¢S» å@IDATÌ¿¹|zÔïne/ú¹Lײ…V©ó1×|Žíè¼r•`eShvÊÑC·DVì]ÊØ„^hÑ?¨DÝ2”ѯ/±¡M±»6ÆÅxØ}ø±Ûç£u¢Ç¯Ã¦C^?Hö¶þ𗛉Ÿ›¡×ù¬ÖÚÅ»Í3kKÿ„·fçrM«©Ðx´™‚½nJ†8°A£Ëœ¶^ÙÐYÍ!k†õÝÜ¢km3Ôç:‡™}dX(í¶ÌéÌKí¬dÒÑבŽ=ûÌϬU±)k)þ¾Ž°Ûu%ÏCŒø¢…OýÐÜ×õþ€¡?¸È:×(KFšt›úA¿‰iÿt]¡õ®\‡uœ\÷:øYël,ð{SŠ}<;†ÆÙƒI´î_ý;y#‚ŸýwüjŸºGÀ„ ÍÙæsƒ‘t€·äÞ¦îþi#ë^k¸(Tª8ª{ £Œ›5Äx;è³Ö'Îú|ªí“]ãÚî;Õ—MjµËèý ·|‚oív8l?îWtñYèkÞ•üŒQð©p;—l¼P"»Çb]Õ>ñ³“þW" §¼¶ßQï›»Ä&9’Rvw0Î!ÖýTjzJïÜf×â¸År]ó—oí7ª^¯óó¿Íƒ…vD_øÛ›MQù]¼|@ÃN¶´vɦ³ñÒ[íÍ_muM¿„×ø™‘COä¡ÉøÌb‹~´dèç‡1÷pCLY‚KkcÏ¢­é)Ú¼¡Î–åÑƹ¹ÿ4_é,¼ØÍ—lâ³wZÚQ4úù v]ã“É>×xõÏyÑñYB§ORª£—È—ÆÞµ>Ihô˹¡Qw>×r¬±k®7º3/ñÃ!‰Os›]ÇŽè¤?2ùÎ.zZì–nôhÑÈá¾tÅ%yñ>9|Úƒ£ëØ@†ƒ`ü}äéÏøàá£2¶èGË&úÈ‘ù Ž6ºðh‹_áe—œ:,ÔÉ ;öf Ø£_]ì =•ÔcWìEOžhæ²ã{ð‹/ÚÉÁÇÆÈLìç/LÑ»ŽœøûõÇ>6…žR°K;þ`ªßµ|´¡AŸÄN)tú\+Ñkgm|SÒ}ñ/u}è’ÐKúãGähÃÿµÑ?ïׇf.?zîTZ3“ÞxóÍ\ÞR¶ÿ¹sç+×>}´à¿ÄiGýÙ£Ëõ7À ^ vè“ žÁ× `«Kêd$x8®.£W—méO{™ :Ù®ÓO?ðäèÈìµHK鋎ð°W¢— J)OXÑáQÎûC¯-ö£!Ï"ºžM[âè´±[J€¸Ö–²s>vÄ}®é"C™¶`¯î)³>226°ÊD Á æä¦]‰Of—”q!W¿¼è‘õá‰äßâXÊnÂ6é6øÛáôŽØ]‹íŒÍˆÝ͉ÝM ×[Äx«ªÏA7OÁ­™ý0¨½ºÛ×RnN뼦COysx÷‰x-Ýf¨ßHÅA­|Þ©ÿõ¾¦dÎ’wíš ÍQŸ«œØ^óér—Õo–ýA››u«Ë¦ƒŒ.+6X{Åf¿Yö¦óP¢ßpJœùÚíµQè›úåþ üÚf0‡à~w“îkïØ ‘ß_ë·&ÑÝרù×ÐÂ<‡øNc·Écßr£‡Yßl˜Wp‡¹Oá­½ð€g_/Å]8ÃV~õ×û3FýK>Ùço÷µ?”è?PH6¬JlŠøÐÇsÍ6ØØÀºÿ¹·öµ¹ßª±øƒie“ÿqØm¾•ñí‡òÊåwðK—C¿Ã(šåwíÑNí“ÿº6íUwãVõvmè¯øˆ]çàÜ~1¿ô¸–ÛØýÕ\¿hPO¬·‡è‹Î=ÍŠf;9eWksß+^[É'þìÈÁÚ=Ž®Œ·ïÛû™ìh¶²½ø¤fW•æ4û_Õ]ÇwºEOÁçþàUwøeƒë9êäÂ72Š`iKtëÞ(ƒ–˜ÎïÕ¥¾%6¡iþ½Û³§¤‡dŠy‰/RìhëVÑá%Ûƒ ‡ãÀn¼Ú]“>¶mãÝÕ‡¿]7é›ÿO³aaÝìÐÛÚ¾¥la§~%ÙŸ»UÆŸø”ñ%ÃuâC]BŸ4Ç,2”ö1¡Ó†Nv=·ÁþÜ–mb×]ä+áùëc¿ŒŸ~%~vHø¤øFÞzߣ+ã¢36„¯ ¬´G?ùÑ[¢[™½hd¢‘Õƒ¹êrlʾìЯÝð‘ƒ/[á©<˜(ɾsû£7}J²r¾‰n<ôgè K.ýxÃ[â£ØÓoœÉÄ›>~H‘¡/zƒ_úâGìć^Ž¿hb«v¼ésM/þõ9²ÑòCL'Ñ=§×;”¡×ŽN›ëèoÆTL%´üäè ®ÚñÆ'ýì•´«ËÙÚd>Gúø‚–,:•t½“´²ºvàíµ×—~®—ÑfûüÓ}ë`=Ӽΰ=+»§óõ7ã”2âšcq&N:ôf@”ëÁ`ø$zÐIúŸÅ ¯ºvtÉü ½øå z¼2= À®Dcr(Õ ‘A—AK?ùtIÚƒ%:Ilu=и¦.ýIéSǯ?öFF‚3:Ó®NÊð©Kžn‘‰^ýꮵñ-O é –s¹±O™ÅFèñǯðÒ;¿Î«láÿlؽ½ÿå<›•è‘÷Vì^=·6!é±;bw³b×Ú(ÎÅÚf&òVîÍ\©²‰§Æ¯VšV·„8@ë﯌÷y‡ß2å@©t û…^ï‡Ö¾>DŽ¡õ6äk³>h—Èér=4°1qsÕ“›0;m°ÜûM—Mhº~´ÖcúÜWk.Ú€Z3û§(úÁ•NëY×Ë$rèç‡dÝ¡ÇC­Ö;|AßiúÆœloD¿.³oùÊwmý€ÎÎþÀ€|Ÿ¼ë£Ÿlú;6ÖÞnw>¡/‹u¦ª…'ë©3Ý6kuÿ$¥ÛÞ±"m‹Âøñ‘ýhéÕºO—§Z&ôÁ+>óÑ)ö5}¶Öü~ïÙµug£íôMÔæýÓl)Û˨­µyòi-k«yùI²ïÜç“^6ä#¬ÑæÜìðÖb“Ÿ}lñ%ãKÊ}M½É¦¿²C¶èqhÍxäÖd.táÓO·þŒ9û}mìC·£rîwî­íaDñí(?ª£ëåÁes;Èæú’ØIOä”’vˆßÖæ`߇ÐEö6{ˆjovŸØà ÌF£N¹~°[¢ÛÃö ú<¼àcýƵ´!µO˜`Q2ȉݬ¼Ðã- s£]õÑŸ=‚6‡üØëaJ0â/í[ 3øâY~¥£t7¿«ÌÛ!++}ÃݜڤØ*Ýðp¬¬l1Pmì‘Ø”x£}}ìã†ݵ(º°XhÒɸ·“càV/õ'5‚+_åsPµå;Lh,rœGÇŽº’ÉîÎôÃ)¶f€^è§=réT6{éQê'[rÆÐð¼øCg0ÒFŸì:t| ™‘Í&:3ØhðjǯL „_?{l؃N)G6™™¨hɉíêrl¥­L6Ûô}®É£ŸŒÐ(#Óµ4§Qמ¾è]úÉf~¥”7-ô±]=ŸâßqøŸÓ}üÃy÷µ¾©±;b÷AÄîÑÕC-ÎÄÚf¥eìnÛÙÖŸÎJ™Kú]÷©e~[_úÐÎÔ5çoÜèŸÚñÛÁµ$Ô¼×oè&n­éEóOÇÈæÁšœ ]tö ‰Ò´¦ñBnשÝkã%¹øm ¼ Ôo¸^Gïá³Z{=ÜìŸ`ô5ÅšááëÚ”´{@ÀÆÕzÒµ&Ý^ë?[½~ksj}4ÿm:ºŸd¢uØ×n]ëv¹ýÁDÖÕb²Ý/ú¾®÷{T×á ¨Ïç^[öº¿Yƒû¦!¶Ñaí}Ç>ôwÛøÔc§¯áÝŽlĽÖÛ»­®û}wu5cÃO¸÷ÍTÀc\ûxYë­·ýµ—ßp¸2Ùq èÖî5›Ãäl/ýJ@Ÿ€;¬ù»í¬öliý9äë¿á¾T1ÈÞàÒîsÅÓ^7_Ä'‡Û]Où’éSð|’Þã¦ãÂÇöJ}ñÑëoÔÓFI‡„®• ºöÉ~Ñ´¶êkþ”²È%ÍŸ*ó@Â84ÙU¶_ݯ{`)š.–í|sOd;]h hûÂ’+ÖðÊúØ—·1[{éqØn*^8t“u¹2=ñäšõäð‘N¹é©ö3EO¶v%Ü¥ø¡ÎÞöF¹EŸ>eŸ5ÇÐTݼj6• º=ЩŽÖÙí«”,a”~¶füsºÍu~Áˆ]ÁÊu£]à‹Ø¨Ýµ”¶ø¤.£‰L~e¿:~ê-z4ÊèÖ'¡“"3²´Å^:ЫGvòڃkd£‹^~Å7rÃW¯~¼²vöé“ÒnÍ£D6>)mx´)£;×tÊÑC‡L¶veä¥]=}øæ<®µIt©ç¼Ðëv…'´ñ M®c·6²Ô%ò¢'þªëg—’¶»–ÝÛœÐ7¼¡Ëþ=þØCãÁ‹NÆ«Äïz^ü®a„6÷TvG>॓/ý>¦µ·G'Yd¨£?®a]ÚÉ—É öÈȘE‡³R®Ñá‰ÍÚñ%~ô©££7þѧ-8¨»V’…}lWjWJéC'é£'ô‘­””óŒ}ì@s©½!ØéÕï–ø–DÎF‡}ýmÆ9èÍ“MØÝƒ æì«'¦—ϯ±pV (óÈIP¢Óò$²Ó¦Ž~î@±!2éÓ|™¬ D@ÖO~ä¶'îÕ†¤$/ºÈÔÚ¥ø¨®m&WуOhc›º'„xbslÕ&iÇ«=¶£à†FŠ×ìdÅ/²¢<²dí&»Ñj‹-èbÃú>ºƒ{xÈ";ºÙš¹¿sœÙ{ŸÚùøÒç&ð>ÿa[Ùñž]O7Îô‰Ë&‰®ƒ‹’/ÚÙ¼µ…'mÁ%&fìÕéC‡F⟶ȤG?L‚‹R»éŒÜŒ-ÞÈU’‹]äŽØ]»IÂ0˜Â)¸§}Óbw÷ã·Œ{Ð{ü'6ÓC;¶1î‡Uk„ø»ütÃsÙúd}±~ˆ~ƒHœ9öÙë‡ýЏ’#{¼ÓÛç€MÀÚÍ»¦DÍ › 7êµ'èæJúÈ"¿¶;ÕF®ùæík.>±Ý,˜Ýn7ùîOµ,Ú²qµ)ê7dqÞ×$¶ºQ÷õ&¯þ£c;Ÿ¼·mëvÁ _æäÚ­} € š.ƒ&8‘åÞÒmu¢ ñÁ§½F¦hûx ×ðãëÆg“`l¬ÅÖøòi Y} ³¯;ñ…½ÆßøZg:^]Ǧ–lßÎV²{ŒÀÖÛøóÐÃlzbçcEóš…ó~RâwŸ~BÁ܃ÙåÅæ 6Ù§Ì>Îëíí0]Øf}ƒ…þ¦»äÁ€¯´5ÏšXmê™är´’S¢õ9ü¶¾*³ 'Ÿm±üÁ÷a,ÍV6Éä6›ºÉã‹”ØPJ>Í&»\ÙP‰Í&ÐE?\¢?rÔ›®…:È\€ ø ÷𯻠7—ý½zv’ï`àPΖ¶awéñJ>Ÿý zmèäI¾J@G›â;Êf{•èxØ€Ÿß.0nêmËWc3(£>øÛö°‚ÜÊ%|)ÓÓ¡Ýõ‘]k÷Z¤›‘øÂÞ-Ô¾áôÒ÷aiÙ_tî·ÆÀ=Xj1¹À‡ÿ3c#‘«M‰–,þg]Ã6íxô%”¡ =®e×ÍöºŽžô‹‡È¡'²C§Ž¶A•¿È ok¬b;^{Éè§[R.utdÃK mèÈRÞÐ…îb7~)c¿ë؈_ûܲ$ò]ëcºègƒD:4hõ§Ž^¦#üi‹¯Ú#³ ¬ôE†>8’¿žNŸäã‰L:$ýác§v~kC+‘M—R_üÅË6 ŸvtëÛÓ¦²`ZÈúÈ\ 02]kÇG®ú|<þèÍ D¦`ć6m|#72ñ$£•çI G~0P''“Þ™ÐtͯÉSGŸ…M™¯DÐ¥ Ù®• ×Él—%eì¥7í‘¡î»a'[²ñ¢Ñ†'ò?‘‡NŽ\r\glRF¾:™yªøÁýïk>²ßf$öÀíC‡žŸ®¾T“¿6Âtj£Ãuìq_ô¹f‹öЭoÇ[ù3b·ß”òb÷¹»æØÞ{¦[L¯]þAÍ/s܆ÃÚ¿â¶ÏÙší«Ú{i%~§5%ªÍÚo>[ä¾Ó–O¿Ñ÷~:úÚªtˆUêËÏõOÑÙÑžy3@‰Î4˧ç¡í¿'csiíí7ÔÜz¾*ÍÃn_ß,›Ó™} Ìü¤__?Ô¢éýÖ¯j¬Oþˆaã0ï­{ÒßéÂlêzðÔ2ÐÚø-9<ó –ìëXu{ûƒµµåæ>va³f]6–ý¡õþúµ¯®öû3y|£/¯ÿ¯k6ßl³{a¿Æ£­Fªñ²¥ûØ1_/ì®döÍþûM‘¡$÷øŽÓKgûÆÐØe¤‡ðk÷û=Waá»Ú×;Àí“}w܆u•Öå«u¼èÞ]<‹xéDl"_¸†hhbg5µ62–Ÿ†»ÏV=‡ý¼@Ûš ÷_6‡9H;„²A]x£/¶µzÉão6¡i6Õ?ÞvÀ/á“Ènø”lÉkžm´k#Ù"„Ÿ ,ôû³ˆÏä4üë^/Ñ5—©ÜÕúPÂï Ðæ€ï!@û*ý•= (#¿>oÅ.‰ÿð–Ýgç÷óø×~Ù¿èÛ÷öKF{3 dxPDžhô@ÁØÌux[ÄÃüOîé¾Dvøïµ$Gf÷tìätíÛ_o¸ióF§}š”qÌ>æ ÓǸ’ =§{¤vý¯æsé‰ u9¼lMVÿÌíÍjã>§gt’?·ËµŒ}úÂKž¿æõb-ø%|xèU²A›ý-,\G,²?Ë+úéË^‘ <’>ò²Æ+ÅGtsZ}øåè‰üO¾]ì#ýÁ¬ð‘{µ¡Ñ슑…†ÚçɃ}³yìáµ–âÁ”è´ã•Ðø [ýdd<кFÎØ¦-íxÈWFoôOI;~I‰WbÚô¡‹×lNz×2¾Ä.ºð±3vi múõ‘̹ÈD#žò{Á^XÃðk—ðG¾ºk± ÄGŽ:‘™kõ9ÿê“ï]â¡ýn©ï™:U©»mjQ´«cw-Xçk‚I„Ûr-:Ðæ“Ç>2ízqÇtþÊÅ¥CH D@T7€räÃiw$Y[d¤Ÿ¶Ñ\!ÑÈÔñ¸Vp²ð°IàñGoJm±‡ÍiN¼ÉúèÏÄËNJŸ~rb Ù2[b»>2ð¢0©+Ù<Â=‘Kg<šäجnò$º‚ÚØ­o.}0f£z%ÚØH†¤ ét-£åyxwoÛ5}ü臚ϡoîó:aqdïáé};ß;ýÍ…oŽØ]ÄoÆ>Wc!¥oÄnŸÿwŠÝõZú§Ž}¬ÅÕfÆ.Y榵÷g}lú__ÿ×5WÜÀÌ3k¦ƒµ”}N{Ð?åΛýIV?8š—n¢ý ˆ¿Â¡ædÖŠ>çÑzÌáÒ²Óàæqß¼9ˆ‹ü’ƒj—µ¶®šëùùd™ìn­ n¢ý0Z}×Ñב~à›koß<°Ñ'úkúºoíéëløß×£.Óƒ ¿ÃfúÝÜCèuï0øÕqó‰-œµNÂÐF¦ß¿º®þd_[æR-suÝœk1¬ó¤Ã˜nØ’c5¦ôË}­d; aû«³ÜúZÚqí±Àúéë|óÍÜø]±:êèGÛ)Æ»ì.ù~þ%‡<ëÊûoŸ^9¿öKà±ÍÈ;´ùTßÁÑAÒaQrl‡om%g€ýSw¾ƒn»ßÔµ×Ãçk¾»¿(›dY´’þ"X(Û¡s!;¯®óá__Óô²?sÓ+åíÓðêçK³¿t¡ñÚ=ÝRpe¯d^7šòêJ‰ìÜ7ƒ‡v2’ñF>Ÿ˜·’U÷š?{Û'íuÍ<áo¾ÓU4í“ö… tó‡ÏM&9Å?j@§m|3f {ØÁþ¹®}Æ ÑV›ƒ~KÅË>cÏnýI°ö}ýíAû«-1bœÉ½Ž¦Ò‡ŽîkºØ>—y÷R¶˜)ûw¼ïÓÕ/ýQÛƒÂOÎ8ñ/÷GmKLËüÁ'< ÛötlK,„>²”äÈèÃ'º”Úåð‘cL”éw-±EyJu}ê®CƒŸ^)¼‰·ØËw:»®ç˜Ÿá¬ªÂ« v±A=v’¹®é›ó¸ÆGOøæ~¸¾§Ø-]±™OðŽÿñM;ùÙƒ£aß||‚?ÞУá9h•t¹ÄÇøNZmóÚŒ©>c¬Dß¹J?Ú´i—´écž`®/¶ñ5¶ê‡9>p"=±#uýÚðä:}‘Úð£ îúðèc;›éÔ®M_®ãG0Ô>—c’’_”° —I Gísùd/4x•hBG6>´ú‚eä~z÷G¦{´8‹¬¦ô>þ¡›,±ëÉü/ûÜôµ—¾=bw1ÎÆ"ãí:c‘ñQ±Û71wŠÝOìþÐt`Ïþ†•xÛŒ$v3ÅîÏŸøÌôûoþñtöò¹Zkú|Óß¿×ož[KúMÃáÔá/‡q‡ÝZis¯¯ ê˜Ö|T7×{{ݦ—7'zúÁ×Ú†Ìí¤ßœòJ}øÐJe~KYÑyáðÙûºnqg-ðõÞ†|‡ 1©ßúÓ× >§»:ùé©·Ã+šÆ=–ùÝmíXAKý¡‘éÌé·F[¿w¹µd¾ýž`~Ðýèø9„§÷ãGë>ÐÇ/ýYï­¯Y»3nôÁ¸ÓÝ?µ÷€ ÷‘ïO·¹ŠJìéôÝ|ôz¨wòó0A]ÿGw??Úsð¦uÆ÷›²öZ?~î=û¦?xåTs­d·`»0³ajfÖ§‹uoñI¹×ÕÛ'Àe`îðõgéÚ'æEß”,ó²¥¢…éúï6‚|kE`œl›dÏ|n°U_‹å*}ŠìîÐ Œ&c1×þöû ÀS}tK‰ %ŸÛküè«¿ÇCáP¾9x+Û'ñÅ¥6£<8x;¸·¨.ôø =MgñDGtz}¯ïùû†M~éÖ/³¯ñ¯H|à3Ìõ{`\š]ôMèðDß2†‹×ëöØ{À’¯ ð_¿ñksfAµl@ÇW8Óï°+(²ÉCˆÕ.Ñyhç¶éÃ'ö´±Ç³‰d‰Ý½ïÿðt~ïþéâ¹3M·ýOú³áf“köài¶–óØ ¦ìCKF02bWIÁV»k2кVÆå<ég“2rC62\Ç×èe¾+%´)ÉŒ¼Ðjc—v%yøá„&í®ÉBÏoutñ‰mRxÑÏø¾øƒVbl!7룚Ði¾Ä.:ú2.hµ‘Ûõ“]©£ã+:ôxÕ%}2žØ@†þȲGeGô •bC«Ô?ÚÙMž|â ~)üdê yì‹×’vmäF†kíxõ¡þùéON}yzëÚ™éìÙ³ËOß)å¸rn”:~rôE)'ž|t•džcOûž={štò#Ûj׆O;>‰^m©“‘§?}d E§n[É ×èìôà‘â+Zö$Ó¥-r”’v‰<´øã?´±EßCýC†…C{xõigOl?}è“ô%E¾r.3üÚ‚;É‚¤N¾~“->u¶Ä~<»ëW¢ý‰_lãš8ˆ ÷SF?™bæcG?8=óý§¦¯_ûöˆÝ þ#vï=vW·¬L¿ñä/µ§ÄâL|gNÜOìâ¿æŠÿ±G§Ïïýäô¯Þüb×¥ÊýS™-¥ßÁÝ8úÔ¿V˦oÿ”\_—åÜ___Ûô¹(rÃí7ÏûÁÒ Š¾µ¯ýt9äZæ#Ûš`]qßè6²MîÔ¾.X¤þ0ÂÚhCØéüž@ïë‡Û®®Ö0=}å—ï³û qÁ¾ZŸM1™]~ã,\謢e2øÎßíÛaÀ.÷s£û§¯Ë캮®Ï5߬Ûäò»û2—Ënky÷1<È€oÇšlvð‰¼n#œûØZ‡»Üns§EÏ÷þf™ìf lü¥—þ0˜‘o=ÞVVþþÉ_\Ænï¿ùð@Û½$öˆ-÷£gŽîžÞóÆôÓ5Ïʇ:‡h[÷t”Œs0tÐlÚ…âvðs_¬>ÖyÍ­|Ä’ky~ßiõ!ÎÂ"h‡Hr¶Ô=¶}º]mÆÐ§â¤žê€ô©2;›ŒÒß>ýÖ^üíÓj×ìZØÍov¨+Û'Ôö %#}=ª¹Óù´Ó×ôTɯ¬ÃªÙY¥¶úUò=~gøI™Sñ¥ÑUûÖ…LG'¹í0]²`)Ånü¹Ç«KtTè\kkvU™ß( 3¯å·q³÷*óqiv”>ãÌ't~gÀ£öÁ¸=àPÖ"67ÿè-™²öÏ´ÜÝâ ŽÚî7‘±»»ö¼ÓG>5]ÿ“Ó|Öž}fb’>÷RýI‘¥žkØ…‡O®•sŒÂ¯ÔO¶~%?¥6oªD{ÐE&^Ù¾\tx¥ÔÙÎõ`à^JÙxgoýÊÈE|ÐÅgz‚Ÿ=rdÅVý‘ð»f·>v„.˜ð!ºÑG†vúè9ñY;):´É‘‹O~òÈžÓi æÚ¥à>%>%ú$mItE¯öøáš<ɵ9ª$ >zÅ­v>©ç-qx‘«¤½:›c§vm‘¥¬$×Ñ™ÚØ!)Ù íì 7˜±õŸkë :ºÐÞ-µ7ŸfDê;K÷ú´í©¤ñåW^™^z¹øŸ|ò‰éÉ'_O{S}nDµÖ¶­õ‚À7®¿Ø@à,p8…q2N¬€–“œ—ñ£Ih}dé‹ m€‹íhȈ|¸&G ¯küó„/>ƒ'iÓ?×?¯D6£#×u’ëèJ‰N; ¸ðGýÑ«/Ø_£#þ¢—bùÑ¥MÆ«L×IÚ’##ö†on£±CŸ>×Úæ‰ný± ¤Îò¯ýùµé“ïùØtèСv0G£ÿ~Sô“+qsäÊþé//­6u}¢Ò5bwÄnbíÆî¯þ…éóOÿl‹]¯†‰§yÜEî;-ɘË»'¦#Ó_ùÛéâJÓZc>™ý&ìà×_é×fÝìk†c…b½RmÝ3G­ ý^Ô5ïúÜîúÝHÍ[ëE_Cú½¹a³¯Ów}Mék‹ùO¿u©·÷%j톦ߧï}èvºÎ§è®û!rÖøµ{C°_ûO»²¯æ9}Ý^K>8UO³,ûAzÍænw×Óùù‡—ì`ÐíGÛqÑ.w¬Ñv,è²Ã2ýÙ ×ñÑßöÝ·øœqïo6Ø@ôõÔ§ûx‚¥Xï¿§Èe;½YƒaÝé‚û~áÀÏL÷½Ÿ›>Üýbƒ ›•:Nýû¤»¯_˜þì=¾èpâo»¯,îÖkY9h“ѻ浧::%ûñáé¾ö¶6ÒÕ†¾û¡´ÊÐái2«ÍÔ!´„õ¥G_“[t9þŒœ¶`æ°_Jp»¯h“|Þ»÷Ë­½øcoü`Õ娨ãcq//Û.Õþot†.ty€‡s,ððÇ'æìPwÈ–‚c«Ô?t×Þ¨=û%FÚÛÅë:¸7{ªßƒÉÁníÊŒ'm0n6×ulÇ#5_ 㦧èØÛÚãLÞÁ•Óï}äàtüØÑéÀmS/x4†ûø‡{¼ {LWÿúËõU†µ=]ì‰.~Ñ-á“ã+Údôá Ö)ƒaÆmd;mÖ/eè¢/²Ã=ÊаL{\m‘û#³ß'cXütjS:I‘‰‡Îø«O]ŽúcOô)%tüTJlÑ[æþ»–в'4xôñ ¯ë´ÍíF¿~™}‰—¹ ôø0pnÉÇõ‹z¢76¿ÑG>~í~+!òõá›vï™öýÃ>=ñX[»ÌG´­ÀÛ¤ÿòÍo×ö//{?ý©O,ãzÙXËÿ׿þ_¦W^}­õýÔO½÷®þ¹ל=²åàôâ_ž~¸åT3’c ,@8ZíéK‰.ƒ¢¹ ºäM>ƒFF€Õž^ôÑ]J}RMÝ5û£_žduòÕ]££7§/zÉF£O;¹®õ§m®­£ Ÿ„GÒž6%ÙéSgSh”úòÄ*2ÓÚÐÁ3:ærµ‘C~hÕã+9rôgbÄ®èÓ/™,ÚøJFt}ª^åÿÇÏýÆtôèÑiÿþýíF¬ã&üC¯Ä¶Õëµ ½>}ãÚ‹Ë1Š]ƆmÒ§Ø£”Ù·ø€vÄnŸ'ïõqS}Á,õà¬Ï8à{·Äî ;Ÿ™þ»ç÷ÅnâVÒ:Ìž¸zxúòÙÿT+º˜–û!ÓAÙá¿´­O}ÝPï?qkþõµÎä; ÃÞ„â3vbÝ|µù¤¸Ó4kš.6Y“ëP‰Gê¶Ï×þNÓísO½­#ô»9‹!ë¬õvmN\ˆ•¹mb)à`ÕÕ÷ušßìÑÇux•öºfeïs»óÀ ã×× mù”=¶ô‡(36Å®k×üUëǽûëþ†.dš ~×&UÆÄ¶Þ¿æ+^ö­Yx{Ù×ÞD~]-úû}¨?Déë–kºž\9>ý‹gÿi–Ž·u×' ð ŽäÝk"#rzÜ\›vÞ¸<½~êÌôÒ¹wí g°ÊhcC·¤½œ­æ¾Y ®Öf .R>=ƯÍúúÉiö­ú­ñ¯69¾öРx|bM·Ñp˜Íkçäá#Þ<ȧþí0]sÓ±à-âVWÊí‚>׋N\ò/þë[ÒÔµCxû½xõ¥Ÿ=øý†A{ÈPt¾  ¶»^ú\:a‹WÛ?-äz À>ýüR%úÕŇô±•X‡.¸[C|J™”·ønÄò•ˆ¸ lÖès­=?ˆW¿RN›ëè´Ÿ ]úõ…Þµv™,¥ÄzÑ{íÙó=YRg¯±Ñ9ÚÉŸiÁG¼`‘˜ŠŒŒ-ùÈ ‹>×úèK"K_Ú¹/èÑ„W]OhÕåôå:úçñ‹F®ø©”ÐÏu‘>v¡I¼ð—±E\ì7aIGÚ”ÚñÀM?¹rðPÆÎØ€VNøÑ©KñïÆßýÍéø‡>ÖÖ.ðè»[úæ·¾5½üò«K²Ÿ©â|ÙXËÿ_õ?OßÿþZßóï{vzüäcsº ¯tJNÿÔö'§ÏÖ¡ÿú©¥±úÉIIÕñi’ K[€TG¿>`È$Û¤<<óU×G.z™žØ‚ ð3xú2xs½Úãkt¥Ù‘Ûœ¨è"½<§W§s®Ûuhæ>¥}®—´‘؉n ]®Sú$ú\ãm©ë @ÄoL¼Z •røÑ+#/:zÐÈÚàõÂê3µéü'Ó‰ã'nú„íf¥øœ’Ü£õÀêÚÅ+Ó·®¼4b·ð±ûÎc÷ɕǦÿù¹ÿv:YOhÖפ̬[›»äˆÛdõ][vLG¯œ¾zéµXÚðôƒ³C²éípº6çÌ÷>çµ™ÓýïùEó“dën_7ñ˜³È®^™÷5‚Ngݰ!ͺ¯óW¯Úˆô»2o¬égW?ä²%‡|¾õuÇ&"gkÝšíüâ: §µÙèk š¾>Zûunôu§ÿp,ÛðÒÛñêÝ_þ­éííúúáÝ}­ß_Š¡ùŸ÷Ã×m´ëMZóGë>\û×ýÖGk1úøuLúØ[ãÅ–¾n3}}l¥N¿7úÃ’.m|ë_Áð‰ÅµéÀ´wúŸžþ½é==Ù>Ýφ#øÆúÍ*Å’18¹ýâôŸpiz«ï«Ê—–±è1Q±X9@ëk› ê[n†êÚA¾ÇæÚ}¿¤]n÷´ªûTÝ¡¼ñÐQ68¨¶ï¦7ŽÎ­vè/Ù¦% öKX{hà0ìnõK%76¶˜+zré–ÚAš|©RÊ&E{¨Q%z˜ÇÿÙ!‘,™~?9I©£qOI.yñoô§œÓÎý‹|ræ9:ÉÄ+у&×ñ=6£ƒ/:9:ÑÓ~¥Ñ¥Û¡£­ §\Óû¢-hâKtª£U.´Ò¥ç?2ùåßhkWöŽtD#ºÍ?ßþ΋Ë7ô‘|æg>½<ÎY–þ/ÿù_L§N¿Õú>ðÂóÓ‰Ççtw¼Žñ°`?·í½ÓOMß¿ñÆ28 PÎJ&JÚ”qzmÓÁ'SBCOœW'ËÓc4ø2¡ÐÓ%¡w 8th¸¤MYRJt®åø9èð#kOŽ,ü2Ÿ"+òÑò] Úb;›‚EtÄõð ÓN§,)çøéç«2‰.u%úùMÍÜf42tÏo*®ãcúãkì"/v¢?èð­?rðùdÿ¿æw§“l›N¿‘EýƒH±ü“[M«—·Mß¾þJ}’Òo ñ'ØØ±»Qì>¿ãéé|ö÷¦§N>¹üJn¬›»‘gî$غwz¬>éÿÆ•ïÖ_¹_œžjÂôÃb>=èóÍÜwðËÑð&À\®é&ö-}ê™ÖŸ(ôùÜ׋ÜTÑçæŸõ´ÏqóÖ`åðœC*ùäÎu¸Î'ú­·ˆºòÍ6åK6_äÎ×þm×ùMþ÷®nrÞóUu‡øŽ?úX^0¢OmIh¶ZÒçaüÊÛý+—~жöºƒ=›;¹ou;`FWµV¹¶Qä”5•}}¢¯ÛY¡Qx»çö±âkÏnoóB¡M,Äž¹,ütk“ñ%i—É$‹œ¤È˜×Ã+>ññÁu°H¯kôd«‡†<í²v)>¹æOüGƒ. ]ÞÔƒ%"šÈR†'¶£Á3o×F^pÁ7×£O]9Ç9Úe|áEÏ)ýÚðËtɱ7~£'CÂ'>ÕÉB+‹{exæ¶Îyƒh•ÆŽ\¼Á=¡‰Ìôµ£c«;èÔ'…gÞG>É~G &ñ?:ÑÆ‡KO>3íû­:xì±›Ö®ô7Awøç;/~wúîì•þÏ|¦ü ;ælËÿŸþ‡/Õw ú¯ôð/LÇêûOo'Åy€Ë-xjóòÜö÷L+çëàté¥éÒµþº\%E> 8¦_Ÿºë P€ _ÚÕ%´óÌ&922ø$õèhõ)›ý [´‘Ð]ÏåF>™±É5|ѯÏ%tøØC–„6¶Ð›€›÷kC:}² ¡ÌÆš,ñ1>G&:rØ‚Îu²6²Ñê“R׿ÚÍ4òÕåÈL»I›v|lQ×Zuiõêöé·þòôÛOÿZ=lªo%/^ÇcûÜŽF¼IÿÄ7¶ÄºNl;:=vùÈôíó/Mg¯[ÚKmb0&ŒØ±»¥¦ó/ïûìôÏŸýGÓã'N>”Øâ7sIÜÊWöOÏ]rzõÜëÓ÷¯¼YTæ›u«í¡¶Çætßdäõ÷üx"k€zŸþ} ( Ç!M›êïÆ>‡Ö쩞ê—Íû>o0·m³ö.îíWýi³™´Ö‘µ¶Ñ!3l²2_qHæb_S¬WýÐîpíõyõàÓKëk? “ûò{?yMjÙÀÎþ†ºôgêkù0·v®ÖkMöŠ¡OŒúšFÎÊJß0öñ±ÆZkèìö£éë®ywr;®JË£²ëvoY­uÞÆÓÚÞ×]V³7oxØàßÛû=‹mpæK¾6»:yMŸXýðô/žþ'ÓÓ¿·Å®¯PåU~ömvbƒÔméòWªxfõüô­S—§7/õûŸ ЍaèsÏjØ¡) Û¸,èÛ=L W¾hùëu÷†K¦Ü°X8šC°~íÁÀ§Ü9”¶×êr ó:?^ö¶PâceåÈ"¯nË64èÊsïe Ù~œ.舦•M“S¾òÏæT€8€³}m”‹¯ùT}ö¹Çz¸Ï†[ñ°+X²D†«öP¡è$v7ÛS–lÉý™ )¾4,ªÍŸ&l2J’íþJ€{&ÝäÁ _£]”~ ±ý@õ³)9ãÀ6xµ7Šf{­'_8|iúÍç÷·½Ã±cÇ–_CákFÞç?ÁHInêzºpªÖÛï½Üð¦—ì Æèç×±ÍøÈszu´ÙªÛßEn0QâKÒŸ>íñæäé'+sB;mJíI±':ÔÑá‰lòdq i®È%S&¿œ¢´³Kœâ•¢/‡/mdJ±1|h¥”­²¨£‘ÈgúÕáI·D.?b³v2µ)µ³G&— ¥~´á ù±)üMQýƒ=¥œ9éSÒ;]ÃB9—yÚb»ëБ#¥-‡Qã¦MŠ)µá£9ÊØÄ×2}sÌb—R,K‘å:²ñHèd4ó6}ñK;¾ôGž6)¼lÌüiõOüQâhÔ%xÈú"_]?¹áÝ©£…Cä„?þ“­/t±Qÿ…ç><íþõßNœzd)X #3¤]Ýh"¯ëèŠn2¤È׎NÑD&ÛèØ½eçô³«þÙ¿3ýônOçýXÔ¾}ûÚdœãÕlò?sûÙÇf1ààô±Õ÷O;®¬L?¼vjºp£ÿZ*›Gì®ÅçOrì®Ô¯™dåùéŸ=ö;ÓçžútÛlŠ]ÃÜHÿ›²KqbW6G»tîYÝ=}pÇsӉ뇧7/ŸžÞºq®ñô5ÀƯÏí|‡Û!õòåþ&YèjÕ,ÙØúÚÒÇÙÚamé‡óøç0éÝœý¦$8˜ª“í`ì \­-×tª>r³^X§:}æf?Øö5˺›µ©?XÛ ÁzØÞdX“sp°¡£¯š´Ö…‡*ÕÛ{g¯óoIn4ŸÍú»ü.‡,ö‡µÌ×nw¦à­–&Ô±²Vã;ìÉs/µö®m:ÙÑñDÛíH[ÈÑýîUØÛïñ§ûR>–Žg·?5ýîá¿7ýê{þÎôX}Åï¥XwÔ×PºÅýߌ­±JvèÿniâÒô½+µÉ*Ò|Úì@ß~Á1xú|Šá€¼¼UhK.ztâÆðÇr“ÝÁhýl £}¿¿®¸›]ÅCwÛj÷f€z;È–~tùž|û?‹Å/^éË!Öœa{´'fòp<¸8ÌŠ>ôíp\×í¾S|äò‰ ÈÒ§­}¢_´Úø(‘)ãkíÕŸjèõï\9íê®›¾âawÓþ¢ñU†ËÂ|±-ž†›‹,ûb¯ Ï*›®Ò­ŸÎúg©¿ÕÙ^|t¡=²rmú_œ>ûôÁ¶þŠa¯Ãz`•õ©ñ56çò’ù"«_©fvï›V¾ÿê´¥¸ñAæ÷|o‡V»}`•¤Nzeú#‡,)úCOFxÄ^<úѪGŸ:l›x—Y_ÑgÌÂßb±øÈÔ9Þ²ž¹m¡×ƦyL°M–r°O,Ñýig›œ¤=ñÏ öØEv|Òæ:ò‚ šðèG'‡ÈÐçþžO¡cZ ]ìÖ–k²QäjwØÀ‹ðç¡Èœ¿)¨ÈB§”Ð°Ëø¹–2FÚ¥Èi•ú¿¤ŸœÈŒ,¥6ý¿ðè3¾I|½v<ô+ÃãZRG›<—ƒ&Ú”êrhÙ“øv„F=}’¶`A·zd’³Ø~¼Æ"cŸ´¡]úõÑìņ¤=eÁ7£%?´×vìœ.üܯLûþί¶Oö½™4_»èx»éµï½>}ó[ßnä««+Óç?÷s²¶ì… k?¬rî\ß nÈq›Æg¡uÍYŽûà‰ƒÇ¦_;ýæô•Ó;}óòw§W§ïOom?7]¯_S½ZßߤY°\Æ ÔÓX)|€ Ø®ÑéÃËmlÒFîzàÑ™ô²¾¤º>|ü‰>סɪç:i# ‰ ±=´|“Èö|<ÁMt¦Ô&èØàš¼ø†ü§[›~íñ>}tËsìâ[Úæ6^r$|±œ>:Õ£7þ¯l]©þ®éж}Ó‰-G§çwÿÔô‘C/Löíoîu³á„=~ùA§è¯®ùE¿ØýûeÛÎ|zúÚéoM{á›ÓK7^›No?;][©_ê­?–qIlÂ%Xð;õôgüÃg‚µëŒÞ»?:±»½>yÞ±¥UìÛrxzvç{¦Ÿ>øÁéØÁþKЉ] »14ŒýƒNtˆY:Å+½bסÍ\úèéL/~eúÊÙ¯M/^yeúáÖÓÓÅ­õ£3[ûfF¬ö_å÷¤ß¼f±›§ º9MþÚÓë>·ÑØ­ÑgñòÛzÒ×|§}t}és8õI<>ŸNKl¡Û—n¼|sðm]E»vpÕ—ÁÖkNÆúÖ7­¥9Õ7nhò×4Óéwº}cQ­Å:4|#3Ÿtè·¾‘Þ×nüý»òôòµoÌûÁ{Í¿þI»{>ë» €Ò— 6Žk˜‘ÙÇɆ ­Åáïö‘3¶À­×ûäÏDܶ«~X÷Ðôôê“ÓÇö¿0=qðdûž³M†OõÅ®5Ðú‡ÿA§Ä-½}ìû&é·vü`úè÷OOðʵéoÏÖ¡°ðw ¼±¸ã3ÔÖíYõö‰°û:÷¶…ýâµÑ÷àh.™#Ú|ª,z–sµx{|רºÏõ`YƒAÉfËR_Ñ´9Hoå”&OÀ ‹<ºª2]-zºçkCŸƒµ§¨ööç•Èa[ÕÛ›e šØéšŒæƒ@­”ûe»‡ÔøUg¯®ñâkoÍ¿*ãgd*ÙÆn©a\u3´É²ðvl€S»&³’ëü0"Ýh½}@nêìèÏŸî#+{ ~4[K¶·¼Å@®v¸îºqaúäá+ÓÏ=±{:r¸¿è­@qœVôÍqn 7érÙJW0ƒñêêç¦7ßóìtåÏþxÚùµ¯LÓ…s #÷sØ5¼~¨ã!‡_d6ÿ`Z)ôä'¡'CŸ¤?µ¡Õ›ÂÙJý¡ oúõEnh¢Ë>…n´Iúr¿³/Õ§-6f¹isöÈŒÏú$òµeO¥Ý5µÇ6´d%iGÃeöq©“+ã‰Ïú"O]Jmèô“£Ä£/<ÚÙƒ.ç'‡ý\óY?™äÁ ¿¤OêhȔС×&K|,Ϋ‹„IDAT‘´ãSj‹ï)cgô¢‰‘ùxÒ†ŽþÈfW®£›rÆD;;d }ä K{øÑÐA§¶Ðhƒ Ûe|lŒ.|ÚÂ7¯k‹äàç—LGôà™c¤žÃ=~úÉ¢“ ‰ŸÆÛ™z©§úW?øÉiåÓ_˜Ž,´{Pi9_»š€·ùÏüõýÝ»vß–«íD×<]˜ýªê¼ýn×À’29ëfnö§ÕNœ;ѵHënrGÿ»LF\˜(bCö‰¨ÃŠ`Ÿo8ñ<¬”Øe[¾ûLJ&“õè¹£ÓOŸÿP›¼Y°³=,‡žGƒÀF±+6Äl²8¶î寸0c—.ñKwn6 ls9rîÈô¾ó϶§Íb7777 ‘~ü‰1*FÄ«ø°Ö¹¶îæ¾µðA#“¸µæ²…^×b—]O>=ýð­sÓW߸2½X_|ýâ–éôåúþqí 3'kÕ¿k_û Áö:}ÝcŠ = pÀt¸u¨”ðeß¡ÏAÒ®ÅLЧtÐôú{;œÖF.›¼læ]õ7\éªd;œWÞö€_µK÷ }}[ëŒÜ7¬d¡Q§›ÿ|ºª}Ñsý͆¢CëÕ¾lPÉñæ><’¾ø­ÅƒI‰†}÷eL{£€|‰/øÐ5l|úø#9´“i]a+úö5†Å5Ib«}U!<é+=Ù˜“ÕxkLØDß¶*·×íÕ—¦ƒÛ¯Mï¹6=·šž9´£î͇ÛúfóÐJ̈òØÈÝì”q3^æ}ôfÝ=}äètæ3¿0]ýæ×¦m¯|gÚòú«ÓÖ3§¦—ëMÁò)¶ñÓ^XÆÐx©nÍ–Ðd Ó§$#òð|)ñ¢ÁødI©O6NRÆÒu‹Ý’«”¢¬è×Öb·úÃ;×1×O]¢ßãCKhd}dFÿ¼ ÍÃÈ!—|ôd„^×úà$Åæ´}0¡GŸ”>zÈM»R-¹ñŸ.Ym.Tòºy{øè#‡ º´Ó#§MðD“ve’kqÊg´ñ=oÛ\ó) mì½hØ‚'8“K<ï'm°‹nõèÔ/…ók´êè]£''úõÁ(c“ù£_F†m±%òð±=4äjS¯þð“Á†Ø¯ÎÞØX„õ‹Ê{¦‹»÷N×>6m©‡ÛŸy~:¼ÿ@[»œ‹³veï›oóŸíõ&`Òž½w9ð3pž|¢p¯)Æ0Á‘¸T$½@é'LQ\ØdŠ\k7‘26*óØumb³ÑF"±;?0™Ü#ýd °Q슔r“H =lTbŸ’ ™c6£¸ZwÅnÖÞÜü¶CßÃG 1amÍš6_w³7òÃLÅmÖ\¹ÃgÏNO?¿ü  ï|"vùGxïpó(Ï~(¼½®þûLkýw£_£Üœ«õúï.Ul$‹]¿_!nó°Õ}Yö°H›}º‡µg^eí§[ìæAëÙŠÝsõç-/\ød[³ç½´8x܇OñÎGéþm¼Ûl9¿NÅèïÔ·NÌOtuí}îwÃúñxçÇ;O}óì²6HJë‚¿†bm˜¯]>L´VØ£ÝïÚµR?¸œ´g÷ž\ÞR¶ÇëÝëë·pÝ¥!‹tD›O 5ç,zy 26wòǬ;ñà†Üoàý€ïZNܳ6Í9ô+ÕÅ‹þТX)±›’-ìZ»ù À:<ÖÞ‡5:CÏ@àÑ!5Á>Ìú”µËúl¶kW{£já*™·KíÀïïÏÎS^˜·ÝË5‡³!VZ -vùdt˜îÕw7˜æ7gmiÿQñn}ìæ&=/Tlv<£Êõñûp,xûZØ—lÝͪÄïÛ—4(\·ÉbCJù¨}Œ]Êùɇy+%‡ýøµÍCÿƒG@,{†žG‡@6Åó2×ΪÛkNì¢HüºN̦Ô6Ò@` ðã‹@Ö©y™ëÍôºÿÙß.ñÒåþ6’ßüó7_»©Ïßeþú7¾9}ðï¿©}³+ÂñͶqÈl„ÀˆÝPmïFü¾[FjØ)VG¼Ž8x7"0b÷Ý8jÃæÀ» ù'ü¾Bt»´õìÙsÓ‹ß}é–þW^}õ–¶Ñ0 À@` 0 Àù“«Y´õü…›¿¿"?02Ò@` 0 À@` 0 ?Z¬¬´—õ›Qwú•þ­Û¶nÛÐò­[ÝŸéÙРÑ8 À@` 0 À´«þÔ_Ò¾}{syKY¿)²ñÁþô[gn! À@` 0 À@` 0À@` 0 À@` 0xt\¹|y©ü©§žX^¯¿ØêOï8~ëã´­gõÀ@` 0 À@` 0 .ß{ýûMáöíÛ§'Ÿxü¶ÊÛûüŸûìÏÞBðæ›§ni À@` 0 À@` 0<:üI¾?ûó¿l<óSOOý·KíÀÿÂûŸŸ>ññÝDóõ•éÒ¥µ×nê•À@` 0 À@` 0 :ÿê÷ÿßéõÅ'üúà wÔ¿üž_ù¥_¸éÕþóç/Lÿî¿xGæÑ9 À@` 0 ÀÃAÀaÿÏÿ⯚²=»wOÏ¿ïÙ;*^ø·mÛ6ýæoü½iþ«ýö忘þäßÿÇ; À@` 0 À@` 0:uzò›[·n™VVW'OÃàþ°زQ\Ü͆àŠ÷n¯ëÜMÖFýáºQÛF¼·kãïÕ«×*®N—­eûŽ;îÉÿÛé¸ßv>Š˜ÞK¼ß‹þèôc¨—êï¦^¯ù²½æùî]» ŸÕ&òrµ{àê*óhgá¶gÏž·µ˜ß‹Mñ˜Ç0¹—x<2ä«•­u[·n[úšÍ*o—.]*Ü ×ÛÕZÛ­Yã/\¼ØÖk—Û·okk„uàA¬Uùeì3¯î×6·®w\·msÞüûØF>¼Ý6ãnL`{?¾n¤/®ï£Ïú±bàJÍ뎹#Ìq|gÏž«{ì[Õ¼³wÙ]ùaÍ6J÷ª®üx1»®µ5Þæ?øÛPë¬9)ÌËq{›&ÝBu<,\éʾŚuõÊÕ»*Vwíìû¸:ýÖta±oY]ì[ìmV¯Æì~æ0|ùê>àúGy/`^>ˆØä÷z ƒ‹}€½«ñÖ+{%É ï.OÛk Û±sÇ´·íú^áaÄ»îw/ Ž}/°uéãfûÐu]+ì.µ³–u§Ÿ¥v/÷{÷Q{ç0¸>ˆù¿‘ÆžoW{—ïÕî_ûÚ7¦?ÿ˯´X™Ëõ£û¿ó~ý–›ÓäzÃ:ÿèÿtú£/þiªw-ûÁo;lmݲµ9evþüùÅ·nx5â&ÕöÚ¨ˆíuX©@6Ü´¹±IDcÓf¡¸xñÒtîü¹¢¹º´…,7‘•ÚôXÛuÕ%²Úa°lpÜ$ú, »kÀ=Ä` EØÆ-™atŒdµmÛÖigµëW·8Ÿv°¼p¡Ù¼wÏÞéJñ_¨ºIs§D]‚`}bc¨ìܱv3`#]ð½q½/([ XÎqÝVm,.^º8.Ù3˜¢­(i6ž;wþ&;Çz\3!è ®nVüœãJ¾… nÆee»ñ¸1]¨ñ³¸]­ƒ E-¸òùÊ•jo°9µ°±ë°uíPdƒF†I°^Á¯m.J·EÓ[ŸØx`ÿ¾~˜*¹u[+ÿk¼ÊFcÖ6ês´|çGÇíÕf3;U<^˜Îœ9ÓÆÖÁÕB#î=hˆl²À¬®¬öxmeÅ~Ébcpm±ZvÃu;t‹Ãw}ü®×Ø_¸p±ñ^¿q½mr;ÍŽ¥Ìk×úÃ-AÄ“ïÍÂõôéÓ-žƒEïbÉ÷l¡ãÈ‘C…Ñþ¶ˆ{þœ=gþÕ«Š©m%Ë<è¸\cï¹ÍÁ½ÅñÞ½Óá…LòÍi>’+þÄT)ï˜×Ü'›-d7LŠF™ƒÑ×>.5‡­‹õÀM²Ùµˆ×&£tàϘ°Ïüó(qg¬Éü±fåð€æmÞ•mâ{WÍKÁpþÂùéTý9ÓÓõà¿¥±^ÎÓ¢¿]¢Fän”èß_ñj^e¶1)§y(m-ÌÚü.yÖVXˆ9mbò-›Èg>‘£[•W —³5d%í­ñ:ZãåCÏ+5Nç*æûZÁÞm5Ntê·˜7ÆqŽoäÑwàÀþéÈáCµ¦ík¸ëã³ñYGšì²Ùš oxfü.[sÚ8n¬'ú”₳è7Jðd‹ñ‡Q÷³Ö¸Ö\ð€VîE≼å=«®ù϶S5—¬Qæ¸Z»o窯«X5ŽGŽžvïÜ5]«ƒ»Mß¹:ŒŠ¸­ùÞqíñÞçûÖ'1ðàÁéð¡Âµ¼[ƒŒµMÏÙ³ç›/l£ðlc¶ÀµÙOã'm¿Ä’8ßQ±ï>龑{!ÿÌ‘+W;/[“øjÍ­yÃ.|°hóÒ¥ÍZÐñßÚîdÂÀ|tŸ`‡áÖ,ñǦ}›°ˉ™è]_ÂÇ:Ð0X×ÉFVg ̾åRagív¯iXT Xóo‰†EŸ·b€-í[¬›s;ùuªáZ8ÀB2 ×ÅxÀtÎ ›ì[:®=Æa*ÑjÏýæÆÖAoîÆÍ=€Ýp·}ßr¥ÕáeÎ>tp:TÙýϽ­qp¯”¬ÓäD-î²ÜnÎyÐrèpɬ˜5ÿðÒE.œø`O#^s1Ní>P¾‘Ûò"îì2/²¦Í÷ƒÚ¤«}ïÒçÔÍ÷*vô}‹xí÷zk5Ñe£u8÷`27ڷا¶b] “Ë/}™[ø×'ckŒM|šÓðÅúÃÕžÅx³~pÁ—}Kß[—/«ö/µ^U6NÖú3gζûíMû–ò×úný‹ì·^Ù/±vîuçjmqÏ76Ö”å^ Ö°ÄÀöÑOÿÕ¯þR“Ÿ¶;•w<ðcüæ·¾=ýé¿ÿÿ¦ï¾ôò†w'á£o 0 À@` 0 ûCÀ'¿ö+¿8=÷ì3ïHÐ]ü‘æéÉ~øÆôÊ+¯Nßyñ»íOÜïôô!¼£¼;ó'uw§o;}ºóve ºÍCÀSpOG==õÉŒ§˜#­!àÓOÅïô Àõ»ïÊSm1ÐÞÞ¨§õžhßíÉüýzÙuzchã·'îWþ¿OAàêŒù§N? ¶ý(Øà1çS§‘=>³çioÖyËåÇxnÞ Úæ²uñA¯÷bÛfñØ›µ·Ç^`CH}’»7=6dx—5®ß ¬SøA¸ónß x3æÓŸüxý@ßÇÛ[}àßH°Ã~{·^ ñJ¨×´Ù|xÝ$ßë·©;_¯(¼U¯>{=ûÍ7߬\¯<ù>]½²±Ï+Žõ:¢×†¼âqðà¶xõ!¯øäUÒ¼fçÀ`Sœ×ç,^áq#ñj³ï>ÑKÞc'Ž·WÒú+0ýUq¯LÄææ[ɲQÊ«‰t{eÍ«%^•i¯ÃÕk6^3ì¯óìh¯Q°Ïf¯•äU1rhô¡a—×Ñw”ìºT²½’õ؉ÓSO>Ѱb9^¥qtòIpµiñj×kòj$\àêá‹Wˆ¼¯n ¼ŽÍ¯âxÝóÀ}õª—WºáÚ_›ñúT{=¯^sÐØK—WU‚«ºWNà½ÊcGNÇ«×r´×6ù§¼ŠÃï…°fÇ¥¾»\~yE†ÎþšL½6X7þ¼Öi‘c{póZOõ6j}lú«;ég#Ll¼*E¾ñ9yò±Âõñ&—dxííbp]ÜLùêµ›=õª’ïR—÷%ë°çÚ«Ùðô“S•ÏT}yI¼Š[¯ãk¯:Îp…±6¸Zh¤†ké3ödyŽmh½Â(VÕ_Ë0vb 0×/6¼ªÛR• ›z•«ûí«ýUK¯v^¯×ÐÚëæõº¬ïzm” p#C\­½×_m#ß«”þóê⚇^k#×+®]uõƒ©W}MĘÛLkco“SÄ|µ@ñéø±c-ÆõÏßÉ€1?¥Äy⯽BXþ“`Ñ^·.{ƒkÛ@µüä·Ws½nˆ^lœ|ì±6¼I®Ôâ¾bÂ+{â@R²ß«\ÁµÇkK?óW•ñ5\ [sžOæøü•¬öŠjÑSãÁ¾ ëë>E°^—}âñ“e㉆yb°¿¢ë«.k1¯ÏXzÝÞ\±6Xëüö‡õ´­µ¶z¥T¼[s¼ŽëõIñê5ZúÉÄgì²ÀÊÚÃq_IØ_O’a,þŒƒ0^úR¯ÀÁƒNööqëqF¾>¶zmóäÉý5öš›3¾Hæ¬ùÕm¾T1ä+¾ž±ZqXkº¹]4l5fí•Ó²5¯F’ç5LcB§uåFùpäè‘éÉ'N¶ØC£oŽkÖVã­ßäÕnñÂþó÷¾®Óâ³|lë@Ūqõ¿ÃõZòáǧ£•:Ðâ*¯ÆVØÂµÙT÷%zÌ ¯ÂYŸy\Í÷Š ~ÐWºüVÎj½’+‰/Éü7×:ç•k¶¯OÖc2|ÅÄä«î‘âÆ¸x5QŒÄV¶ˆõù}À|5®0i¯ÈV ÇÜ£|Ò nÅX_‡ëµï²]<‚‹«]볉µžÀ$÷´ìã—W*w”?íÁ`é"Cœ¯>¯úzE–{ö•âÕÜÖN¶×bÝ£Ü_ݧ$²ôùа7þÚ­Wâ¨í[J;ÅÚ™ÂOlÂR À“Sû÷×W”Ì«ÿöÊsaá#ÆòZj‹×ŠÛ†kÅp[]˧ ÷-eƒ1³./÷-ækŃ1 ×È?x´ÔðéûöúGîCÊ›÷-ý·Bøi ®å;yÙ·À7x ±®c÷Tò­Y0—Ì1ý0÷Š·yR,-¾´“/‹yëбcGÚ:ìÕpýóD—WÌߨ½!Ù€Æx¥Õ:L}Nüš#tH‰×›ö-% Ÿ}¡û|ð ûkÅXé06ö§b½-•=0&»Åka/æé?í·@j.´}ËâþJwóop-ÌÈ0¦s\gö-ö$机uòÉ'Ÿhó€ƦßûÁ’K¼ì[ÜĬ€d—õÆ«Úö-oT¼*ÏÖ\ôUœCu?O¼*­uø¬sði÷zM¿­¯â°ìvŸZÝaÏS{’ÑçýÍ{{8š'öH·Ý ”¾' ÿš“tÃkžø•µ– ¹Ö*1æ¾n 0î-Ц¯­îák{ñÝ¿.Ó¿âK_Ĩ¯åX¯ì‰ÝÛ¬7ÿáàwu²Ç‚1¹xÅ€XË×½YÛ T¹§Ò)÷Ù àoyó=–yÁ>²µ{åuϲ®óCrï3÷e4ó8¥ß׸à#^}-³í{*kV»¯V»8Y¿Ø]k¦Xî{gµ{l‹s¸ÖÖdë[an0åâË®úzšd}äË|/C˜°Õ¾VŒ=r¤É̼mÌõyà,#nÉé{ç5V}/pù’u¹¿önÞ²6ƃ­ÖË>'¦¯tÛÿELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿáLExifMM*‡i    ÈÿÛC    ÿÛCÿÀÈ "ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯¼qñ~ ?SÔ5|jƒ>—Æ–¿ü>–T77:®­* U‘ç†e $¬ê€"ªªng;°¼O…~<|/ñV§§ø{Bý´|s¬ë—Þ.ÔügðþŸ?ˆ,¢ónlùÓnŽ?›q!tfªŒ[ÛúÛÿ’Þ»¡IÛWëò×_Áýϳ>÷¢¼U>|D7þÑ{þ%ZÝÿ’TðÛâ Gå§í ñ-³ÿeè…³ÿ€8ý)X.{5ãKðßâ äÿÃAüIs°.KÑqŸïqbë¥-¿Ãˆ1Êò\þÐ_.¶B.—¢ Qéÿ$þ´X.{%â§áŸÄRd?ðÑT–ÈJÐð£=9°ÏëSÿ·ñø íñ0‚z¶™¢£Û ~`Ñ`¹ìtWŽCðãÇñÅ"IûA|JžR¤+¶™¢ ¤ô8<â¡á§Ä4Û¿ö‰ø/ézÏ¿¨°\öš+Åßá·ÄS Åí ñ26“¢–'=ãÈÓò©døoãö·ò“ö‚ø—ùËý™¢Œrû9¢ÁsØè¯ÿ…iñ køh‰äœ`ÿeèyëÿ.éeøoñI§í ñÉ ¤è¤°ô$ÙÐw¢ÁsÙ诟á¿åòD?´Ä»` ïÆ™¢!ϽŽ=…"|6ø‚¦2ß´/Äɱ$/DùÁìqaÛÛ žËEx¿ü+_ˆ­(wý¡þ$,XÆÈôgß-biÒ|6ø‚ÑùiûBüK»?ö^ˆXŸô~‚‹Ïf¢¼rO†þ?kq´ĸ¦Ü —û3D'äösQ´ø…µ‡ü4OÄòN?ÙzF:ÿˇCE‚ç´Q^/?Ãoˆ²º˜ÿh_ˆÖñ‚NIÑI#Гd•Iÿ ßÇà2ÚâaÉûͦh…—é‹?0h°\öJ+Æcøkñ <¯3ö†ø™)RwgKÑp}qcÛÛù¤_†ßLÞdŸ´7Äs1±4 úäÙE‚ç³Ñ^3?Ãoˆ2Í,‘þÐß-â#åt½„ãÔØ’iÉðßÇè2h?‰r¶;ôÍõâÄÖ‹Ïd¢¼rÛá¿¢´ÿ´ÄˤÎB¶™¢=8°ªÿð¬¾"òOíñ;qlñ¥hxÓþ<3úÑ`¹ítWŽ·ñøVUý þ&Ÿ¼ÚfˆY~˜±Çæ 2?†ßSÊó?h_‰’•Îìéz Ÿ\XööüsE‚ç³Q^0Ÿ ¾"ù¦Ih_ˆÆ<`"i:*€}rl‰¥›á¯Äf–Hÿho‰–ñ¹éz! Ç©°$Ñ`¹ìÔWŠËðûâœ\iüW¨j¨™†-cFÒ峑ÇA"Û[C)Sßdª} t>"'üào\h÷úeƯ£Ùj’[*»MHP6>`¥±žø¢Ásò·ö߆h<)ðAexÜÚç®…[?)¸Î=ˆÉùAãh7–>Ö~?ü\ø©á‡¶¶',5éšµÚê:>˜¶Q(Ž£-40üÅEÊÆòm¯ê[àè•dø°³>ö3Ôqì¥b ~DW²0 ° ¤`ƒÐŠª2ä¾—»¿ãIÿî+ÛÞZºÏ%µ¢ã÷ªŠÿùSÿ%óÓùJø1ûMx“á^…ðâ§Š>3|oÕ¿b½#öŽñáïk³j¶£ávÓY-¾Ôĸ·[Å|Å8d˜SEÄðïí+ñ{À µ/ø(g‡¼ñâÃÿ ~о5Ñ5-ïX½^øwR³…,<Ûk‰Æ–ó¼a#dàp¯ë/ìðy+n`‡È6£8éÆ*j¿iñowe{ëkSR¿w%¯§Æ÷#—[ôÖ릮£Víg??…l|uû|;ø…ðÏöEø+¢|ZñWŒë7çJÒ|sáýKSÕχÞÅyT‚žk6äJ£HPó°nèA§»²í–šþ+ï Ù&ý>ÒqîôW›Ãâ»;‹«‹+}NÚâò(ã–XR`Ï>v1äÚØ'®Óކ­orÀÏ‚HÝÐsÏè*‘õä¼7¨xJñ]ˆ´û¿ _ si{Á¡¹:¤[[¡ÞΪ=K á­ÿi?„·^'‡ÁöÞ>Ó.5×½m4¬bF†Ñ$‘‹Y& åE3´n'pòm%† RîDÛè}1EpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEpÛoÿ=\þ4m¹ÿ–­ÿ}PyEqÚ~¯$·°D%,í œñŠ»­ê2ZÍ *å¡sƒ‚Nxçð?t”Wý¶ÿóÕü ƒ­¿üö^€;Ú+ëPš= °ê%p˜^¸úÿZÀÓ9ÿ$Ð{EpÛoÿ=[þú­ý&ýî-.¤fó<²v瓌t'½nÑ\ ëràžBcœ}‡jwöÛÿÏVÿ¾¨¼¯™¾Ük ðCàÚ&§§BƒÂšHnÚ>Çí^ߤjr\^ˆL…‘”’ σRxŸ\ðwŒô9d±žüßxYQ×dŠm2i#½¸3¸äÓ‹¬F ¦\–òÿyõGö¿ût_?Æ(ƒå›¨·×ËeëÔRwIvþ¾oÍž'ðƒöjà¯Ã={áç‡Òs¶ÉŠçì‘t r*œmtb¤š1.ï<ñ¢ãxg9»F c4#ù_Ì¿üþ 1ûCü-ø÷¯ü ø7¯éþÑ´8mÍØÓ­®çÔfšÞ9É?hGTEª€ªU‰' éCÅf[†šI#p|wrêQ³ò³Bp}Î1í_ÅüšOÛâÌÌ® ‹¦2Ÿïìëuãò5ú†¹~˜Êˆ)%Òz«Þ+oFÏ¥ál=:¸†ª+¤ºú£°ƒþ 5ÿ¼µµ¿³ø©¯ÜÙM"Å Ñx?Lt•Ù¶Vx,[åu[Ì€y^|‹¹¤ý†Y-_Ù¬7ü±ùénŸN§ÙG$Úîú-ÝžÚÝ+Ûï¶çè?ü÷þ 3ûDüPý¡|=ð‹ã‰¬<{ ë±^%½Ãi¶Ö“éÓÃm%Àe6ñ¢º°‰”†唂0Aúïþ gûf|Oýš|+ðãEøIsa¤x£Äs^»ê³Û%Á±‚ØC•Hä2Îg°`7 Ãïø'+4_¶gÁ‹…•}Lœþ̺þu÷7üNïíW?³Ó6æQ¸3Øse_™äX5Ä´0ñ¦”%¸ÛFÒŸMº#ÅÅ`(¬Î5f®×N¿ä|‚¿ðSßÛÂE Ç ¾öІtƒ–=üzuë[þ ;ÿ ‰ü¹~+kÁÖÔß:·„t°E°ÿ–Øûú¿ö¾ï½x_À_ŒÞøk¤]ÁãK\ê ²ñVŒºZÂÑÞÝ[ÚÝÂ-giXcf¸¼ä2¬n¾[ Ÿ[x¯þ ;ecyãMkᵟÄmgÄÚ–¦ÚÞ™?‰ïAá™ÚãO˜ZÛÇoq—…M‘c¹¼¹I^ ¨ÛþË”ááYÓ¥„–šòÅ^ö¿N—{öóG±S 5áâÖºÙ|ºuÓïòg%à_ø+í‰áŸhz¯Œ> ØxÿÂñN}¥]h–ëuïœ,–ð¤ˆûs´çã!‡ý6üRøŸÿ ãáÄ/ˆËfuQ¡èWÚȵ·í>D(=·mÆ}ëøj¸šmFî{™H’æiÛj½ØäàÉè+ûý¤u¸ý›þ:[®çwðf®GS›)F+à|Gɰ”ká}•5vÔ¹U“³kwzžà¨S«KÙÅ$ÛÙZûv?5oø*wíǬk—zgÅk-ÞiY¡±²ðî$Vàž °<„Ÿ31÷5§7üþ GmÓ\üCñt0"3³?‚´ÕUUûÄ“e€>ÜWæð–Xg¶–kyQƒ«¡!£aÈ ŽAïšû&ïöÔø“o»u¡øãâ…—ˆ&´ðŒv2ëH¶·:]œQO#+1WK|AÝó“_¥âxs XÑÂÓ}ïÝ.Ï»oÐú*Ùu(´©Ò‹ù//#³“þ ûuÇHßePÃ*O†´Œ7$d¢ò2ü+÷Ãþ ëûQø×ö˜øþ1ø†¶ âý3[¸Ðo.­¢%ùŽ&Y¶• YÔ¸\© p?–¯ŸbøÅñkÆ~;Óôã øfæí¢Ðt‘LJ¤Gû»;$HÀDHaXãF>\òI'÷[þ xl¿f¿!$+xâõÆ{°Xé_Çù6žT«Â„iÎëd•¯Òé+žG`hà Ï(»­•8ÿ‚‚ÿÁF?h_…Ÿ5¿ƒÿµËé:6¿i½þÏ·»¸Ô¦šÞ9ÉÿHGDEYU@U*Ä’â/øy?üì#ÕSâþ¬t·fE¸ÒŒE•K0 öLd($Œð5“ÿ.Cÿ ñ䣩¸µÓeRŒ (“#þù#ð«?lý?á¾ðÛáo‰ü2š‡Âè´M[Cñ:ÌÒÎo…Ü·òDÂv€GÝA#„NÞK¨r­°ûy6G„Ye ”ðЩ'ÝÒ¾×ní>»/3zJPÁ¤(©»]è®ô¿ß}#_ø*íÐX¯ü/V9û¿ñMéü‹_mÁ?࢟´wÅ/Ú/ß >0x²ËǾ× ¼H%}2ÖÒm:h-¥¸¦Ú4 ¬"e*ÀýàA ü{ñ_öý—|Kðëâ‚üðãÅWÛãÒüQ'…4Í:âUk±,l#´(–gˆ…܆Ý/—÷k„ÿ‚p9‡öÏø5p?€ê¤ã°þË»þu9–Qƒ«–â*K N1“^ìSÒ7MY]Iëtº1¸  RN’‹J]E£ºïÿ~áÿÁKl߉Ÿ³7„~i? Ÿ§x§ÄsÞ“«\[¥Çö|6âÁ#.æuåþ\Gâáÿ‚¡~Ý…sÿ Í“¯ðéÿä­}©ÿ‘”Þiÿ®J³$rë–ì Cüwô¯Ã8–ݯ-~ß%ÔV^bùÆ% á27€N3€Hú×7‡ù¶WN­Z1”›•ÛI¿‰®¾G/àhK Î ½wWê}ò?਷Jí-ñÕØsÿÞ‘ÿÈ•Ôø3þ »ûdxsź©â¿ˆö^9ðÔ3£_iW:Ÿ^A»æQ$$ˆÛs‚ƒŒ‚8¯ÏÍ[þ¡mrº ߊn/„ëå}²Ú(ã0î›qb®Çvß³à2eç…Ï2ÊÛTe‰À’Ä××ÿ«YlâÓÃÁÛ‰~‡´ò¼3Vöqû‘þ„?õOµ|CðÊnÈf”ûòæ½'ö‹¼š‡„ùÁhnô(ëço€:ŸñOÁ°ç93ÿé<†½ö±¼û-ÿyÆèo?FŠ¿‘ÏÇÏÏ¿Šÿ¾)iºíî‰áqâ ;HŽ[{«FÃEûtÐiÛ­¡¸0ÆQ„²¨¸’dÂÈA¶?»”úǯëÚ¯ƒ­®¼Cw­jêîkÍKNûÝõªNë ÒÁµnÈœ$a¾øŽ0Á/íŽåÿZ?µûnçëDtVþ¿¯ó~V%­—õý’ó¿è?Œî|¿€š]ÎåÏN9ú¼ã_ß~5|Kð/‰|w®YŸê6šPž[MxnY4›Í14Ã?ÚÚò$—ÏûPhö£– ÖÕ™–fýZñýÎÏÙHºÏ];IoÍáÿøUµUpUʲž<ƒBÞÿ×õÓѾ¶ißF¿¯ëúÚéù÷Ãÿ?×¼n|=â¿ëO‡ZÎgƒS‡DÔcIæKÑnÞtcÉ#,‚2b‡-!‘úðçí^ פÎÓ¤ù +óÓûcý¯Ö¾ëý˜n~Õð÷Ärg8Ôå_ü>‚ê~x|HøÁãj¶^ð=÷Ša<×ѬvwrÿiÜ"9©,:[0Ú­™ðÌ ™!±â:÷í3ñÊÒ]ô„úî­ß<¬ÔßÙbå?´G¬£$NmÄì„,&“èÈ5ÜAóÿþU7öÇûYüjVÖ~×ËúÖÖ¦õ¿§õóßòÓCéÙ'Å¿‹%Ðõ­I}[»ÐEÍÕ“+©¶‘Œd¡ªëŒô`t<Šö/€^%–/_b“N¸’E𖎬Þaùˆ³‹žxŸì¿ö¯ˆz„yÏüJfoü‹{‡À˜t§ø!ðmæÔn#˜øSI.¡›åo±Å‘Ò­»™í¹åž4Ó5{ÿ„ŸÒÆïî ñµÕËGîa ´ p]ªr}ô¯Ç_Œ?³?ÀŽÚ½§ˆ~#ø6=O_†n·¶÷RÛLñ¬Ñ°ÞN3œdã­~ìøGÇøwá/Žþ:ñæ¹cáŸi^*Õnµ û·ÄpB¢<±Ç'° $àI¾O—þ —ÿÏwy%ø¿¢Hää±ðV®I>¿ñå\óÏ©àj):Ê”º{ܯåªg•Žâœ]8¬V&dÖœÓQmy]£ñÀÿÁ;¿dsœø[Çý‡.ÿøå/ü;»öHàÿ­gþ×ü]~ÄÿÃÒ¿à™G?ñw4>:ÿÅ«ÿò9¿à¨ÿðLÄûßô1ÿrF¯ÿÈUÑÿ!ÿÐþUÿíŽøŠY_ý iÿàèÿòGæŸÁÿÙà'À­rçÄÿ¼4ïIƒí·7s]Kgª¡•ŽÌ÷Û‚GÞ|\øQðÇ㞃káωÞµñŸ¾}±2–ëT²™n-…î¥qsr)Ê·–îQˆ8<‚2+ìk›ø/-ç´»Ž+›YPÇ$n7+© ƒÁv¯¨áèßðLßú+zþ¿ÿ!RÃÒ?à™ŸôVô3ÿrF¯ÿÈUçâøÏ ˆjUñq›]ê'ù³ž·ˆù5Gz˜úOÖ¬þÜ~BjŸðOÿÙ/U¾º¿‡·v-+—1Zê×QD„žŠð£Ø`Õÿîý’3ŸøAõ¬ÿØrïÿŽWìqÿ‚¢ÿÁ3‚î?´M¾¿ð„jÿü…L?ðTŸø&Zõø¹¡û’uþB®õâ;JËÿ•ûc¡x£•ÐÆŸþÿ$~:ø'ì?æGÖñéý¹wÏþD¯®¾ø?Á_ ü'¦ø#áþ‡gá¿ Zî1[ÂY²ÌrÎÌij±=Y‰&¾Ð_ø*Oü1±·âÞˆIéÿF¯ÿÈTÿJÿ‚e§Þø¹¡Žÿò$jÿü…\ؾ:£ˆ-|bšìê'ù³*Þ%dõªfŸ­X¿ý¸üâøÇû7ü øó¨Øk_¼­­ÛCöx¯`¹–Ú(B3FÃr‚I³Œœc&¼HÿÁ;¿dƒ×Àú×þ.ÿøå~ÄÃÓà™;¶ÿÂÝÐóÿbF¯ÿÈT¿ðôÏø&I$‹º#þ¤_ÿ«L?ˆ¥N–5E.Š­—ܤU?r˜.XfÒò«þHüwÿ‡w~ÉáÖÿðywÿÅׯ|ý—¾| ×®|QðëÁ¿ÙÞ#–oöۛɮ¤Š3ʆV!3ŽJà‘ÇJý>Ñ?টðMOjv:U‡Æ/Ãuq*ÃÞxSR´…Xœ òÍh±Æ=YØÜ×ÞZßü*ï øgQñ§ˆÁ?„--þçS¹X#µ‚Ø.ã+H~P›yÎqŠï£ÅµñÑt©â]TôiMË~]ž¶Œ0øèIá±Q«ü\³RKÖÍÛæ~ |Uøkðçãg†¿áø—áËOèË(¸‰]™$·”ÆèC#`‘FA#¡¯–ü¿öI''ÀúÖì9wÿÇ+ö6ëþ ÿÉ´žky¾1øi¤Š±Áš´ŠH8á–È«pHªãþ ¡ÿÄ9ÇÆã¯üPúÏÿ ×Õá2^#¡JkÅvQ¨—à*—‰M5Ë }5éV+ÿn?áÝß²>üPúßþ.ÿøåtžý…ex‡Jñ>™ðú[½NÊe¸¶ºÍÄ)"œ«ÝÊ6Î##¥~²7ü;þ Œ£-ñƒA÷#ëüƒQŸø*Ÿür~1è?øCë?üƒ]Ëø¢IÆTñ ?*…ËÄ챫<Ÿþÿ$Qý˜"ÔuŒ¸²µš{+5¸šêE,`‘“Û,Àþ±¯pý´­5áð&· ¤òipý® æQ•‰ÜÄP7¦v¶>•ÓþÏ?¶ÇìûDx‚ÿÁ¾)øsÄ^&†»“M].ïMžH”€Î‰u FP¹Ù»çê?h?³‚ׯ|w xÂSÎ-"kؤï% Ÿ.8"G–R$„FÀ8ñž¦ ¸ãbé5«æ\¶]Ýì{Y%Xæn+-~Û™Ùr{÷}—-îü‘ù)ý±Ïß©!Ôf¹–+{t–ââF h»™ØôIö¯~oø+7üÑ~÷Æ­Ü‹­òX´ÿ‚¸Á/­fŽâË㎑m8û¯õµaô"Ç5ó¿ë6[ÿAÿÀãþgÝÿÄ3âOú×ÿÁU?ùëˆú¼eÛm=6æMn×HÓ{etòšc¹P­Àô¯ÌA¬dd8?Zú‰ÿà²_ðMÅÚ7‚;øC^ÿä*À“þ Ýÿµ’BòümÑ$•‰%›ÀºÙ$ý~ÁGúÍ–ÿÐD?ð8ÿ˜Ä3âOú×ÿÁU?ùçßí€2Kñ_¦²U†¥ÂÍNæöÒkhïu)§µ.1çEåFǶåaøWÉãþ ×ÿ²S‘ñ³A 9ÿ‘Zÿä ß‹þ !ÿÚí«ðø?^~b£ýfËè"øÌ?âñ'ý ëÿટü‰óf¢ÚŽƒw¢êöÓiú¥«˜g†A†ÇèG"©ÿkôù«èë¿ø+ŸüQ›Î¿øé¦^ÏŒo›ÁÛ¶>¦ÆªŸø+'üÔOƯüPº×ÿ Qþ³e¿ôü?æñ ø“þ…õÿðUOþDíÿc˜µÿkº²ZNúL:\Iq‘eib*™õ!XãÐWÒ¿t½¾|?k°løSI9óÈÏú^µ™û7þÖ¿³í9i¯'ìéñ'Ãþ2],¡¿³‚ÊâÂ{PùÚæ ˆ£“a áJäc9ªŸtäo‚˜Üi‘“ám$•k…Ñ"àäW­‡ÄÓ­iJJIõNëïGÊf9n# YáñtåNqÞ2N-z§f…?࣫ykû~×Pé‘Þ]Å?Ž­ÍÉUæþѱv'ù@Ï£WòÌ‘ÄdçðÎký|…ÿ£ñ©Ð_Á¯âXêgU1ý­Ú8¼Á7™òlÁ îãæ¾W—Mÿ‚@†:_ø'z¶pÀÝxtsÿ}Wç¼9ÿÅQýŸÿ~ýü¸úûðçÿW§J ´-+_]W_uôZùée¢½ýEàõj’úÍÞhÕôOq}–¯£nO«»»?/Œðx6ß[ø ßCµðìvrôë™n-ÒèYÂ.€’F%Ïž%Ë+4dòŒÊTŸ$y1 ÏjþÖüùŽÑsÿî,{}³ÃŸüU{æ‹û ~Ä&Òtý{ÿ³—ìÕâ î15­í—†4Ù์ôttŒ«ê ƒðÚ¥z’”+ÃVÝ–Êï¢íØóÑî¶2´§CIß[Fîßqüno”ðœ~óþ ÚGý}xsÿЦeÿÁç¯ü«ÿ¼9ÿÅTÿÄ9ÿ¨˜ÿÄÿ©…¿þ üR†à*ü®zgµ]¿µö™®hŸðDý3EÖ­µ /ÄŸ¼ k{À¤ÐÌ—bÉƒÈ † ¸¯¦< ¦Á+›Åšü+ûÜxØ\£i‹£Í =ïÚ7 ¦!/¿8ÆÞsYÿðV”/ÿùý¡B€HƒJaÎ:j¶‡úWëÞ p²Ëóš]U;Ô¦´Ù{韡p¯†k$Ês*ÿYnz3¹²´dõwÜþ’ XŒ±üE Û—;r¤g¹¤wÎ$±ãþ½} ðïà^—⯆ZÿÆxßRð·‚t‹©ío“OÒP½.Æ8ü¸žâ`Í|»‹HV&9fdFÿO±XÊtb¥QÚí.¯W²Ó¹ü¥‚ÀUÄMŠ»I½ÒÑ+·we¢ÔùòFbŠ2;úÕWWÀúâ¿AôÿØ~Á~ Ïð¯_ø³{aãû}#TñÄv¾i¬L´kµÜ.¦¹‰RW6Àâq +æ…iăË?üFðÆ™àÏkÞÑüU§xÇJ´‘-JÑâhî"¿X¤’"Ê[kyrH›•¶»®ðàsÜ.&£¥FWv¾Íi{^í[}G1á¼n’­ˆ‡,[¶ñzÚö²mí¯ÝÜû»þ $‰ÿýŸKF­ýº†Ø—Çý?A_¡ßðq£ÊfýâþVÏ1\ü¹Î™ÏÖ¿;àY_ø(·ìðH']Á#þ —õúÿ3 ߨÿåø£<ûéuüOôÁÚ_õêŸþgúQû8ÿämCþ¾ÖÿÔsù“y$Ʋ·”ß õËž ¦—Ž?ù×ôûðQðáøðXÜAmçŸ iÿÑÁù¾Çzó_ËïüêÙý³¾#>SðÏRÏ×ûSK¯ê#àN¯¡‚Á[Ä?ðŠi<×#ý/jþ“ð¿þE+üLÿ4þ”_òVOüüÈÏø+5î·kûøòÒÆöêÂÚ_žMôPÈUní͔Ҫ8WÌ>ñ"žÂ¿—vhâ?-žõý‚þÝ¿<}ûE~É¿|-ðÏL&ñ–™ñ]j : ,—© ¢Iy<È#‘Ž:±B$ þ]®eÚ‰]£“ömø÷¼ÿv pïÕ|G‰y}yf*¤`ÚqZ¤ßsüšúAäXÚ™ìkS§)FPšM­ºÓòóó!øwû5|iø©á+ÏxÁ°ê~¶¸–ÞmBmRÎÊZ$åf7&±–sò.á–®ïEý‹~:ëwö–—úg…¼5éo,3Ýkv³¬±O)Š ÂZ¼²˜$e}“„18CµØàÃá—‡¿oÏ„vgJðoÀïŽh»®eû%Ï€®çA$ðˆ¤ µ¾àX˜ ;¡ˆº¾Ð+VEÿ‚4JŸð®?i4ÅÂ\/—à{¤dØìñÆ Û"ÌpÝF]ö*îlüÄpuáTæ·enkoµíͯ¥Ï²Ü‡.:RÅPÄ9_ßJ*Ï^š'ªó½ïä~~¸e*HùHàq_·_ðA=Nþ?ÚËâf“ÝÔzdÿ®çš çd²Ç¨Ø*9 Q$€ÁÛÖ¿1öTý©$á›þ>*ãŒø;Qÿã5ûgÿFý–~;|:øÙñ+ãį†Þ-øwáAái|=l5Ë lg½¹šîÖ|Ǫ¢­±ËcužqÙÁÙ~!ftdàÕžº>Ç¥á>CafèÍ%+·ÊÒJÎ÷v<_þ Ç©jwµOÃm[ë¹4›ÚϹsåÃ,—÷¢GUè„q‚z‹è+òGá§Â|\1‹Àú|:¥æ‡¥fö/mªÊˆòlFŠ÷3HÊ  d’ýíÿ‚×þÊÿþ#|]øqñ“á¯ÃßüDð¸ðÜzäz-”——67\ÜLâŒØë? £Œ®|!ðWöÔø{¨\ê~ø!ûFørúeHæ–Û€3"ȲlÂC.åRTðFA+¯‰²ùlU–"œÜû+]´k¦Žß‘ÙâvE‰|O‰ž"IS”¯xÅ»¦•š{~c2ÿöHý¡4ëÝÈø J÷Sš[[(ôíkO¾3Ï\#Â<‰ß«ZΦ3† 1’ ºçö8ý¤¢ñRx5þH|E%¼—iÕlYL±3Éæ ¼½ª³FIÝ“ýÖÇЧˆ¿à¥:®¤i ð‡ãž˜öË ÞÙ|=¹‚îf{‰®f‘m²“¸›tÑì‘üÆÞÌI'Mÿ‰®¼¿…?Ñ'›Í•áÄ‚6SDÐì{D‘ x>2ÈÄ“^[Ëp¼ë÷um×E;ióü<Ï&\?”$×±Å7¥½ØÛetô×[¤þzõøOÅþñ€üQâø·L›Hñ.—w-•õ«:3[̵—(J‘‘ÕI¨'­X?ðAÝ_RÔ?dÙÞß\ÝZXøúþ 8ärËmXØÈQû »»`±êM6~ ý›¿kÏëZ¯‰5ßÙóö€ÔõÛë™.®§ê§•Ûs6 ’xÚ¿ªø#çìýñ7ö|ý”õ-+⿇î¼'âMÄ÷^!‹L¹n--žÚÚ¯ð;y ÛO 2ç }†øñÌyå’‹»³K¡÷žäØŠ|I*°¥8ÒQž²MhÚåMÙ+í·]æÛã÷ÊŸ´/í¿ûSèžÑï|kâ8|m¯ÌÈ÷‘EåÚG©µ¼c|îªî†5\÷PyÖ•û~ÓÕ½íö™ð²î[kyR&y58÷—]Êɾaæ!\é•“œ®?iÙãöÕø+û\ü{ñgÃÿ…Ÿ5+MsÄ:¦¥cªè~“V´Ô,.oMÔYÛ‘‡Vò›kñ˰ÁUjðë ;þ 5¥YZØY|8ý¦Íµµ¥¥§›àÛÙšÊ }þJÂÒ[–‹h–E% –GdbTí¯—RUj{ju¯-’µîíºnÖ·ß{égðØì‚‚ÅÖY†Ïí'~T­kékÆ÷oVïkZÛÝxî©û1|[ÑOgàëOÄýŸ ¿‰´é“˵.%žIÖcn‘yo¸9“#ƒ‚0l?ìƒñùa{‹Ÿ øoO´[Q|×ø£ID[6»É¹æ <©s ¤¥@œ•Ô|;áŸÛß÷þ¿àoÇMJ];ÔÒEç€ï%[?´ÚýšL³îq°.‹&T§, ÚÞ“ÿñ‘ ê i ôË“‰¢_ÝǾ0\¬;–Ø $1ÂŽ?1ö*î9ç£Ã¦ÝJUd—K+_N÷½ºlqO ËÜ[T1 éeÊ¿•^ï—¬¹­¦ÖÐù¿âßÀo‰Ÿ_L“Çz^—ka}uym¦ÝÙj–×q_ýš_*IDåÕ7}Öu\óއÔÿíG©ê~$ÿ‚*ØkzÞ¡sªkŸ ¼{wu;—’âfþÏw‘˜òÅ›$“Ô“_ÏWˆ> ÿÁAÿh GÞ ñÁºÞu ®­cºð„še´w3•4²˜bˆpª»¤l"(Qµ@ýK|pýš<{¯ÿÁ4®eÿ­†µñOøy¤hPÇ›b¿¼±†ß(ŒØÌh ©l °Îkõ¯)<6t±N4Ô©ë-6’ný4×n‡ì>d2äÌþ¥F¬i΋ŠSVnm=´~]Rzùÿ ]3– “Æ;WàÿоMÞñߌ|!p¾i_ìíF[uAáX»Ê‹>¾Rgî®; ïÙƒö’Ó/.tûßÙóãT70¹ŠD>¾;XyàýEW_Ù³öˆ¤ÿ… ñ§~3ƒákïþ5_ê½L×R<³©ŸwúŸÒÉó*Sæ§JqkªŒ“üŒ_ø^_†ƒ/…ÿálüGÿ„yå¹–K1­\¤k Ÿrïà <é·Ã¥';Û>`J’WŒg¨ï^½'ìÙûFŸ¹ð ãX?ö+_úÿ×*xý›hÎÿ¾4ûÿÅ+}ÿƪhæ9};û:WÞÎ(¬F[šU·µ§RVÚêNÞ—>Åÿ‚B.à¢?³ÃÈÝ®éŽþ¿@¿àã“‹ÏØÿæ û¯õúéuàðH?ÙWö‚°ý³¾|Pñ/¿ø7ÀÞ¶Õ.u ýgKšÅ§Óî-cŠ?5TÈåçS…ÎXœqŸ½?ཱིWÆ?^øãß…~×¾ Xx^}bÛW´Ò­Þæî»†9DH ºlÁŠ‚Aeã#ø—é_ZÇ8á´jœ»®ª£oo-}ô›öÂng‡«˜~æ.­]gî­hò­í¼´^gò:¼\î`94ç„Þ˜'5íðÌ_´©ÿ›xøä[×þþ?ò+~Ëÿ´šFþÏ?›<øKPÿã5þÿfâçܾæ¶ë6[ÿAÿÀãþg¦üYø¤ßéú–“ñ/ÇÚf¥j±­­Å¾±s–Â8#·@Œ® í†(¢#ÆŠ0ªéôÏÚ7ãîac¦é>*é:mµ’éöÖöúõÒG ²¨U‰T>…À6}Þ)OìÁûMy™³ÇÇM¹?ó)jüjžfÚ`Ž?gŽ`öÿŠFÿÿWLhãÖ©O_ñ}\Ã"ž“'êàs^+ø·ñ_ÇW‰©xÛâw¼]|4㥠µ^âåþÄd2›|»“å´„ÈWî—bÄ$Öž›û@|qÒ4ý3HÒ¾2|OÒô«=>]*ÎÖ vê8­ìäÛ¾Pà*.<¨ýÜÝ\mÙö—Æöyøéûµ ü…QÃ0þÒÌNgŽeGýJZ‡ÿ¥>97%Ýï£×ú»ûÆóÅCÚR²Ù^]4ù;¨jޝ¨ßë:Æ¡yªj÷S=ÅÕÕÌ­,×3;gwbK3I$ä’I¨<×_/~3è{W·Ùƒö”Ã7ü3ÇÇOoøD¯ÿøÕöbý¥ 9ýž>9ÁãÂZ‡?ù °yn%ëìå÷3º$àä³Ôôé¥×ôÓð>ÙÿáJü ËJÇþm+‘ý?jüÿ‚~Ë¿|ñãâÆˆ_ ¼_ð÷Á#ÁóøvÝõ» l¥½»šöÒp#ŽUVeT¶}ÍŒÊ3ÉÇôðUÕ£øðf8ô¢ñ¯…4€¥¢$‘ö8ºœ×ôw†Øj”²¨Æ¤\[më¡þo}%3,>+ŠªO 54¡tÓWKUu¡cBðGÄφ"ø†þÒüã? ø‡\—Äeu}rçOºÓn¦hKYÖX‹FÕ•ÞW €k >#øûˆÏü*?†G$îð›Ï•÷ÿo9¯j¢¾õ³ðK5'ˆ>=&@øSð¾fÆ~O\ã>œé€þ•xƒãù…¥“á7¤|#8¹,NzÈ/¯å^ÓE 1ÿ ÇÃ.ÁðŸápLøÞçúi„þ@ÒKâ?¨­äü%øe3ƒÿ½ÂƒïŸìßé^ÑEƈ>>…Bÿ þ»„ñ½ÑÚ=Nt±øã>Ù¦ÇâŽÎá?ÂØ@=[Æ÷?0õÓëŠöz(¸,Þ#øöÛðᣠsÿ´ãÓþAµ*kÿZÛÍ…_ Òã'÷_ð›\“ŽÜÿfcšöJ(¸Xñ”ñǶ‹Ì„ÿ Ñ»§ü&׳ÿ‚Ì~´Áâ?Ú¥d_„ß  3¾OÜŒû`i†½¦Š.|)‚0p xâè–÷ÀÒÿ­!ñÇͨßð¨þAÊÿÂo>Tÿà·×´ÑEÀñ´ñÇ“mç7¯…épw~ëþk’@9þÌÇ4‹â/†?1¾ü0Vþçü&÷%³ÿ‚Ì~µì´Qp<\x‹ö€iYÂ…‰Þþ9¹öÀÒÏ4²xãêù›>ü1”«ñ½ÀÞ?¼3¦\¹ ¸\¤õë¦sŠˆ~=¤ü+ø`Ùì¾6¹%~¹Óéšö:(¸/ˆh 7~|*·PH¼stXú4¼~´‡ÄŸ¶£¤øfI\‘ÿ ¼ùSž‡þ%¸ü«Úh¢ácLj>=}˜L~|/wî¿á6¹ÈÇN³1ÍF¾"ý <“,Ÿ >ïÀ"4ñÅÉcÏNt°3ø×³ÑEÀðûísö‹¸‚æÓLøoð“J½q²+Ë]\EnHÿXb]=M½voMØÆõÎáè~ ð~àßxWÂ…®ít­6ÛMŠWiR–0Ä„…Íu´PØX(¢ŠC (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg0000644000175000017500000003055712502366750024744 0ustar jnthnjnthnÿØÿàJFIFÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿáLExifMM*‡i    ÈÿÛC    ÿÛCÿÀÈ "ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ä:äz¬72!äÙótèOô­êùïö×áðn{æy{µD‹9똥?Ò€;øX¶¿Ýƒ?øÑÿ ×û°~¿ã_Œ¿ÊKéæ–È(¶sÈ’G‹¥s${J"—f׿ÿáÿ¯Ï@[_Óõü¿S÷þ-¯÷`Ïãþ4Âŵþì¯ø×áLJ.¿h;ëoˆúWŒüq'‘y ÜéW1ëònšéì,Ò)ãZÄm|¹…éóQŒŽeUqpÙ};ãŠÉ«jgÅé´+ö¾¼ŸO‚;Æ’ÎÞ7º·’!$Fæ²§Ûäüæe,ÌB´jzG›}óÖúz¢éÓRi]-÷Û¦¾Žÿ‡Èý¾ÿ…‹kýØ3øÿz …о²´¼\m–5cÐŒ×ã/Âø÷Ã~ ´Òþ$x–ø™f‘šxîšáBaDŽˆíÎOÌ3€p§Ö^Öüiá…:®“ñÅÞŽÚÖÞòâ-.;FMQZÜ’ùðÈp ÈÚ@ÏPÜb¥;\Æ2º½g¢¸øC¼EÿE[Çßø¥ÿòð‡x‹þŠ·¿ðKÿä:EõÌøGíãEjZµî»wÝä&êå"I%T¹‘Wp‰8P :s“’zjAp¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢³umVÛG³{˦r8.Ç ç 5æ³øÊIÝ™æÚ§£€zåã©âÆýTí9O—C]ç‡|Io®,°’‰{Ë(èëýáøð}8õÓVˆü+áÏئ™â}O×,A2ÅquW€Ã= ô&·ê¹»µI¹·©P˼eK}ÐGlöõ 0ÿ…ð‹þ‰÷†¿ðQÿ 3áýï à8¯W¢€<£þgÂ/ú'ÞÿÀqTàø7ð^æS >ð˸±ö~£ÔzÿúªO|EÒ¡»¶Ñ-µHšy- váK2 þ Xœv·^i|HÊÉ$s4r+eXTÐ[ÿ 3áýï à8£þgÂ/ú'ÞÿÀq]_†Œt3¥ÏªÞG*Ú››µñäÂg¿·*ÄŽ+ƒ¹†UxßúûAø7Sñ…­µ½ ÞkÍ_Jg—ÈK<ð0`P:°Ú¬$…`$WçqñDRlré&9RyǸ¥oy>ßäÿáþEE­n¿«¯ÓO™BÇö¾ûgÄï|,¹ðÌ7ˆ/õ94ëè¦Õ!y Ŧ£p$†0CÍúÓ.ÐJ‡)ö—¼l¶>*Òç•®ä¶ÙpfŽÞžY#Xʬq†w9@B¨,Hq_ÂP»ƒïÇú_W~ÌžÔ5íV_ÞÅ$z%¢É‹8#í3°*ªYsгÕMUôDu>‹Ðþ0xc^Ò4ífßEø—iÌBUŠçÂ:¢J€öeû9Áö¯“þ0ü,>9ño‰¼{ðóÅÞ/øaãma,´ýCUÀ:¥ÄóéöÑHÖ£ýR:ÖíÌð;nTÝÇ·÷ìëúEKI´û4þçøu×fRv>qøE­7‚¼&úG‰›Ç××y5ÄP_ÔWO…ˆÛÜÞ@g˜ n|`¹UUUQKñ/â„©¦¥ÛjºmµÔfšîÒ[YfMÅJ„•UÔ9Èv ·ÑµÉøÏÁº?Ž4it}^7^wÁq¶²vt>¾£¡‚8«”®DcmùoñÖÏÁÞ<Òô ÄÞ-Ót+«kû}JÚÚâ4¹KçY’4ŽkrCMÈñ¤Š îW+¹wd|ÃâÙ—Àðjgâ7„—i2±þØÑíûV7Òç³T¸FÚ.Œx máB]øñû3Ä>,è>$ñ¶¿ã Ý=­¦²ŽÊXVÃRH åDÎn[pW 0£89ƒöbøcm¬ézå¾³ãTº³½K˜#7‘VÖòµ¯—åm15Ä q’ ¬·W%›B‚ÝìÿÍÙþfªvÛÏòÿ‡_‰÷§ÃO‰š6§ iƒµ­nê ¶bmB à½I#E¾Žá@Ì¥XïQ¹\7*ÀO| ×~5ê÷¿<â½sáî¹ymenaÓ¦¹µKû˜]ÒêäKrˆZxœ&ábiLvBÆ2jÇìõð6-gN·½¹³“MðÜMtdÖç–V–Y eZGvwêìO©'ô&!¶†+{x£‚Þ5ˆŠQ@À€TÕJrS–ë_Ÿ_—‘›„\ÏO•î½›£åÏÙÃÀ?ð6³ñN/|TÔ¾%ésionuo$¼·ºT’iüâ±DͰX¢FÛå13:´p[}Q\ƒ¿äbø­ÿaøô×a]õkV£“»c`¢Š+1œ÷†?äsÿaÿý+–ºç¼1ÿ ÛŸûßÿé\µÐÐ%°QE (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+çï~Í? ¼}}s«Ëk©xgZ˜–šëJ•b󘜖hÙZ2Äõm»s_@Ñ@)økö>ø[¢]%Ö¯yâŸ`Ë¡r‹Ñ–MãÔ6Aô¯©mmmlm ³²·‚ÒÒ$ÅH#P0ÀÒ§¢€ (®Wź÷ü#ö6÷E‚‡—ËÉúý(ª¢¾{×þ6è>Ó$Ö%† šâÕâGo컸Ì0ã9\Œ2ú×­WŠÂË_ù깯\Ò®þߦØ^ç>t)&~£4ÛýQH{Ãò ¹ÿ°ÿþ•Ë] sÞÿmÏý„oÿô®ZèhØ(¢ŠQEQEQEQEQEQEQEQEQEówí?®ÿÂ?à}÷~ÍÚ´qgë §úWÑ—Iek=ԙ؊Xýq³xÃI¸_.â&®×Áühò_Æ:ý‡t›mRÔuï­/·Zܼ‚d•@xÙ]rPA¯™4 ´–×OÔ|K?ˆ¼l&{}'Q´K¡çIamg¾I&,eڶȤÞi‘Ùœ°Ûûñÿ †ÿè§ßµÿ _øH¼7ßMÓ‡ý³_ð¢:^ÝoøÛü—Ýr”šwþºÿ›? ügðóOñgŽtGâ¨,õí5í.mngÓ"¹¹YíâxãŒÎXH-I}ï•Üà°u,k'AøA iW>?»Õ|]yâIüEáÙü?¨=Õ²‘2Ímo¬Ñîò™1n¬‘ìL³Ìýáÿ„Ãô Ó¿ïÚÿ…/ü$^ï¦éÃþÙ¯øPÝß3óüwûÅM¸¤£Òß…­ù#ð3SýŸþk?Û——š”öž$¿k†:Í…´VÚ…—šÖDýžp ”[=ˆCeDσ\ÞŸû0ü:ÓnìµË]OOƒÅQ>‹äÒѾÏ­Î¥:G‘Ý•wês²¤,Jà7–I"¿¡oøHü7ÿ@Ý;þý¯øRÿÂEá¾únœ?íšÿ…h«KúûÉkÜTú/øcó3þoOôÖ¿Q¾Ý}·À ½Îï;I´—>»¢Sýk/þ? õþÍÓ‡ý³_ð­KiòͲ*©f SYŒì¨¢Šç¼1ÿ ÛŸûßÿé\µÐ×=áùÜÿØFÿÿJ宆-‚Š( aEPEPEPEPEPEPEPEPEP%ã˯±x+Åw¹Ç“§ÜKŸ÷ccý+ñâˆ~"ÜxïWñ†ôÝOÄ7mcjtŸøJ¤Ól´yâ™RXT8o4¼7“0adذÆ[öÓ]Ó´ÝcFÕ4a ºUÕ¼–÷+¸®èÝJ°Êò8'‘Í|ùÿ éðþW¸ÿ°•ÏÿI«•Xüxð§ˆÿk=GZñ¿üT÷ú…¯„"Üi>‘6—¹µÒ%Ô¡R“,­<‘Ä!óC´/“ G±L»¾ÿë·ü3¯ÀoúÞÿàÊçÿ‹¤ÿ†tø ÿ@«ÜØJçÿ‹­îïåoÏ_]IzÇ—Íþ?åÐükñUßí©ø¶kí+ân«­Ž—¨ÙéÎ×ZtvWIq¦[©!K`ò]"[ßÞ~Î<ð6ß¶.îÏâÇí¤|hð…µø·Ä~ k«™u±§Ù 'ÓZ§–×%²sæ4…ÐmÉ)óþ­Ã:üÿ ]ïþ ®øºOøgO€ßô ½Çý„®øºJvI[XmÞ<§ãoÄ?~Ù:ïƒ5/øsÅZ¾·{e©Z]\5æ› Bymã‰Ýá‰'µ·I ’Bû¤¹Æ|̘Ó~Õú#øÊx¿[”\¼Z<÷ºuÜVËäéèL <^i}Ñ^Ieí”2ì~ÀÃ:üÿ ]ïþ ®øºOøgO€ßô ½Çý„®øº‹{¼¾ºõÖßåù•Ï­ÿ¯ëþüŸÄ_¶­âOë£ÇÚñL y­×Q}kM[¡q9Q´··x—ixYàyçØÛð¨.š>Ëÿ†8´ÿ¢•«à ñtÃZÑJÕ¿ð?øºÁn½þVÿƒm®S’sRkNß6ÿ[_{%óø'Gý²~9jz4ºÜŸ /­í S ñÍ¥êÜ4¬×ß¾XJÑF–öÌV3+Iö «Y9‹Û/öŒ°¶º’…ÚŠ$›QÕMœÒèÚ”/kD¶ë´[´ñWyAxÝœ!Eå×ôwþâÓþŠV­ÿ€)ÿÅÑÿ qiÿE+VÿÀÿâ꜕Ӷš|ôûõzéèJ{ßú×ü´ütgü8øë­x¯ÁZ¿â+ ­Zí³[½»#,Œ›¼·f((`77 0Ì0ÇÔü1ñ#íÞ%ðõ—Ú7¯ ‹ëº@?­]ÿ†8´ÿ¢•«à ñu½áÙGOð÷ˆôM~_kØ®¢»XEªGæ28` ÜxÈçŽÇZRww&*ÊÌúæŠ(¤3žðÇüƒnì#ÿ¥r×C\÷†?äsÿaÿý+–º¶ (¢…Q@Q@Q@Q@Q@Q@Q@Q@Q@^&»û‡õ‹íÛ|›i%ϦÕ'úWÃßhË߇þƒYÓt¯øHïæ½‚Êb÷ Ÿ˜ýšÞyŽ<$Nzgh˵üm¥ßë~ñF¥ù_ÚwZ}Ž¿˜ÛWÌhÙW'°Éùé?ìéñºèÀ×Z'‡®)±y—Ñ·–ã8až‡“Èõ52Mìû~zþOŸßÓñ1t¿Û×Àwž ðŒ/lüYiq¯Ø=ôZtV2K5¢Gln'2«jä–ÚX®Ð ‡¥ñí¥àësh:¬>0¹ºž Ùé²MÞ¥r±<6‘‘Ë9I–BÄÑ˺ílp¿±oŠìo®µ;/…? m5)áó\G¢É,B6ˆFX.JùlÉ·¦ÖaŒ—Çûxå|Q©øÕþxãÅ×o ͨÍ,\~ìD#U‘eUòc` €Cuæ´ºÓñüvù[ç÷WÛþþàli_·ÿÂjÙµ+ ¯É¢ÆQ®/ÿ³dò-!“Éò&vÃ/Ú! , 0uC›0mÿà¤_îše‚óŲ¬( Ãǧ4‘Ã'¨Fñ ”–Dþ̽b±;b@2Ò²d7쩾¥«'Á¿…]¤2À›¢µ(‹&Ñ&®Ð\"+r¨€ð  b[ÚIaÁÿ„ÐÙ<ÂáâX-<¡¥`älå³<ç'œÍ/÷Û%;rûûÿÁÿ/ÇÈ*Zï—oøçøyÇŠ?mïx/Tñ®â‹oéÉ£Ïä¥À‰|­Gös?”ÌÊ2‚ö,ƒ€pÛK0*1nÿoχçBñ&±¢éþ5×'Ó×Q•mNx¤»†Ò[˜'¸Pø"šÒdÜFã…eVWš¾¿ûøóÅqÏŠ>|:ñR»I*ß}šq#2"1mêrJÇœõTPxV]×ìEâ+í.×D¾øAðšïFƒÃg-½£Ãn•²¨Shæy¬ÒâljÞöúÁ¿è)ôåí¯¯KyV¿ðP¯…ò-”wmâh/dË2ÅhÒÃm$‘$®¯7¢1"_nö`‘ (>·Ñ>$}»YÒl…Æ|먢Æïï8Ö¾7¸ý‰O;ù{Ýá´,Û#¦NÞÑ€ƒý‘·§í øñ£Oñ†u=^ÓE¶Ó-¯íîníÁÏ–’+0I =ûŠJܪûõíòþ¾a/‰ÛcôŠ(¤=áùÜÿØFÿÿJ宆¹ï È6çþÂ7ÿúW-t4 lQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€3u‹Ó§iw÷ÀåDÒdû ×ÿÂÐ^žr×}ñ®À~2{Hf¸º].风5,ÎÂ&ÀrI5ùyÿ g‰NâO®cþ½dÿ ýÿ… ¹ÿ^•Ëø—öˆðoƒM‚ø¯Åº‡>ÒX@on!&Ò¡ˆ,F, “Àܹê+â3âÏŸùƒë™ÿ¯i?¸hãWFÔ«àß økÂN“âgÒt­>ßM¶ià‘äh¡cRÇhËmQ“ÏjQÙßøø?‹M¿¯ëüÒ_øZ ŸõéW4ÿ‰òþÊÌL¤Ë2GõËýk󼸳ħþ`úæëÚOð®¿áÿˆ|Mã¯Úÿbë­jv¾aû,˜DóWs8d“ÐHGê5Q@÷†?äsÿaÿý+–ºç¼1ÿ ÛŸûßÿé\µÐÐ%°QE (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š«{t–V³ÝÈ2‘©côÇÿÂw§z.Þ«.þÃà_gN›s.}6ÆÇúWç#|S8`.pqÇ4¤ì®è‡ü'zvz/ýõGü'zw¢çýêüðÆ­ûMü<µk 'Ä6~'[Û-9WÔ—Oº_±­ÄŽ/$™œíŽô³Æ@‘§‡÷JCJ=^ûÆÿ4ÿhzm¯õŸjêdÏ~¦A{ul`Å­~Î#YËò¢Y|µB»˜0{åÕ®ßçoø>Ÿ0ž‰>÷ü;úô?eÿá;Ó³Ñïª?á;Ó½?ïWàÍ߈¿kÝÓÚW…¾'ŪAž|ɵH¬f"ïÉ„yrÉå,žJ•˜Fê²J]ÁºýÝÏx‹ö‡ÆÞ4ÕüEã‹«¿‡ú—‡M¦§_Ooý«e©‡ŸmÄÒÛ¶chPGmeYžKÀÅ““äçK¾t¿ç²ÿ"ù=õüÏܯøNôìô_ûêøNôïEÏûÕøM©x¯ö²²×<3 è_o/¼$€A}«Ý&–×’BÖónÿ£ª‰ã˜Á³lM më¹O›Éx§Pý°5/Å©éï~˦éÚœp¸½³‡M½™¤Ó”÷ÛÛ¬ÒN¿g¼2‚³ˆwâ-¥I+ïþÓ3¦Ü·Ðþ¿á;Ó³Ñ漢Ø\O º½Ü ù»“ŠüLø[ñ ö³ñ¦›?ÄŸK®x1ô›‘,RÁ§Û=½ÏÛ$hYŸv’o ÄŒ¨Ë „f ìÛGØ~ ø“öïøRÇÏÏ©ZÅ×®éTZ™+w?I(¢ŠC9ï È6çþÂ7ÿúW-t5ÏxcþA·?ö¿ÿÒ¹k¡ K`¢Š(QEQEQEQEQEQEQEQEQECT´°¿Ó¯¬uX!ºÓf‰â¸ŠA•’62‘èA"¼_þ·ÀžŸð…h¿÷ÔŸüUzŸŒn¾Åá_ÞçMœÒçýÔ'úWÀ~3ë>ð/Œ¼AáÈWQ×ì´Ë›«8 n³$LÈ q~òN@ùçn‹É›²¸Ò»±õOü)o?ô%hß÷ÔŸüUð¥¾ôÿ„+Eÿ¾¤ÿâ«ò‹[ý»Í4žEµ²Dí9á_5^X|´ž"‹WÊôóÿ‡þ¿qj÷è¯ò{£Ÿð¥¾ÿЕ£ßRñT–øÓþ­þú“ÿНÊ;¿ø(OЬåµðbþî¬ïîBÚêÒËp³Ch· baû.ïµ-ê3¹_šV$-z,߶ޝ†|â+ZÙÿl5ñ™TštXíî’-ZÖÖSy$ѳOMñÆíˆ‹û¼Ý?¯ëþ®GÏìúŸ¢ÿð¥¾ÿЕ£ßRñT–øÓþ­þú“ÿНÇk?ø(Å]o_¸¹Óü á-ÂpézdÓ6¥{pm"¹—[{9Ëj0ÄѬbÔG8ýÏ˼*„²÷OÿÖ[SþÊO†°é³½¥­ÊÍ©ëÛGnÒY­ÃÅ:­›Í u†?Ý·šòF¶U6åË×þ“&Zj~§ÿ–øÿBVÿ}IÿÅV–ð£àΑ©ØêZOƒôK}JVH$Ã1Ž@r¬2=~Zøöáñž¿âßøGÅ u_>¥ªjzl—·…&T·Uh.£·‰%Ê“"Ÿ7E·Ï0Ì^Ú?¶|7ñíÞ"Ðlüüù×°E׮糋¼TÖÌ–õågÚÔQE9ï È6çþÂ7ÿúW-t5ÏxcþA·?ö¿ÿÒ¹k¡ K`¢Š(QEQEQEQEQEQEQEQEQEÏø¯E“Äžñ‡â»ÞÙMh³”ßä—B¡±‘œg8ȯŒÿá¼MÿE.Çÿ­ÿÇkîÊ(á?ød/ÿÑJ±ÿÁkñÊ?á¼MÿE.Çÿ­ÿÇkîÊ(á?ød/ÿÑJ±ÿÁkñÊ˰ý•õÝFï[³ƒâD -…ÒÚL_L 3˜b›+‰yeQÎ9ØŸÐ ó+-rÛÃÞ!ñÜZžŸâoôN+˜ÛF»¹ŽXþÃj™l¿yc9ÊÓH˜?á¼KÿE*Çÿ­ÿÇ(ÿ†Bñ7ý»ü·ÿ¯®?á=ÐÿçÇÆŸøMê?übøOt?ùññ§þzÿ¢Ásäød/ÿÑJ±ÿÁkñÊÝð¿ì¯¯è>$ðþ»sñÒî +Ø.Ú%Ó˜„n­·>gÆ3Î3Ð×ÓðžèóããOü&õþ1Gü'ºüøøÓÿ ½GÿŒQ`¹ÚQ\_ü'ºüøøÓÿ ½GÿŒQÿ î‡ÿ>>4ÿÂoQÿãX.iøcþA·?ö¿ÿÒ¹k¡®gÂ2™ôcqä^Û,·—²¢\[¼lk™YIIeÈ òWMHK`¢Š(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/Index.zip0000644000175000017500000021277012502366750024137 0ustar jnthnjnthnPK—ž&EIž.£--Index/Document.iwa)®2ðiD* úþüÐûýþ= :úen"û*Ð2ý:ü@JApplication/White/StandardþaB*€ÿ[|€ ÿ" €D@D*@HQ@Y@x < Œ@©€£ ¼ð¥¤*’“†±´ˆž¦Æ©Ä¯¾½¼Àßɿ–”¬°‹„œƒ£¶«‰‡®Ž ¢™—ÊÈ­…’¸¤µÂÁ²›˜¥§»‘ºÇ¹³•¨ªËÅš¡·ŠŒ2 ³ ƒW!LRú?%€?-ø?5 0C]]?%ÃÎ^?-ùí`0É '?%ŠÖ*?-á*)4W—¦>%/l°>-i¿>H!*%-jx0Ý£>%"á'?-7Wz`0 8<%¦Ê>-{û@0#r´=%„Hž>-Õ¬0)¸2%Äù>-X ¤0W^à>%¢ù??-qü0ö\Ó3%Ól?- /,4º¨3=%%º>-OÌÃ=À0B›­<%1E‚>-¹£0'Yv?%Ž T?-Ú H0B]?%2>?-,, 0ÜÚC?%ƒò?-¯xÎH0µÚ#?%Tíê>-×0¡`t?%x?-µNÅ0é@_?%~ÓÕ>-º¢€0*>?%¼¶>-xSA4©Œ?%Œ>- ã<Ø0DÅl?%ŸPº>-æf®¨0q5I?%¼Š>-»]·04Í?%1Œƒ=-ô$¢;H0‰ø­>%Uhä<-Eqµ00Ϋ3?%ò"Õ>-Ylb=°0R«î>%.z|>-§ 0±&¾>%4pH>-H—ø0|Hn>%µõø=-›¬› 0¢› ZX" AÜJLA†A•? $JXa$ *äË–@2\WFHB\JT’\,+a|?%`µa?-îÙMŒB\0‰©>?%B¶?-W&Ó)Ø’\0wp?%ñ1?-©SÍ82JL’\0ç¸{?%Xë’>-ÕS”Z\JH’\0|,?%¶ç·>-ss2I BJD^\" A&0Ež4%o?-Wƒ}Z?2@$03Š4%5 Q?- –AnJ$A,4%â0a?-°Œ,>5¸H2H$0´ ?-#º=5ö($6l$Ƙ)>-Á…±a:Jl0là?%âFY>-˜d<.´-EúAæ:v´B@ ¡Œ ?08v/4/  @ –/ ^A –/^/@ 4v¼]p*? -! (08R yü½~6/6e6øÕ(>9jli - 6J ÔÐ1>%S~;3³A .;€>% "„"…†‡ˆ‰*Š‹ŒŽ(2:‘’“”•–B—˜™š›4œòs  žŸ ¡]¢£¤¥¦§]¨©ª«¬­®¯°±² ³Â ºg»¼½¾ ¿ !´ µ¶·¸¹ÀÁÂÃÄÅÆÇÈÉÊð<Ë$666B202E-F9BB-4CA4-B8B2-C09B05ADD8EC*Å2Å8´ø.Î P*ÎÎ#Îç0 |9*‚¦µ¶²†ìþØ ¦µ" *þ!It†:¶BìJ‚R²ZØ`Ç \\X*ì2Sì (08@R¢ ðD…CHCZ$1D1A26AB-D0D4-4674-AD7E-80CC02228B56hpx‚Sˆ˜ !?.n ê2Qêbn0AB7B6E42-CF7F!IH9-A169-A57C900F8760nQˆn H¾Cœ' Ýà™*6‡ãÒÝ—¹«àÐÍÕ÷¼ÜË÷ëÆ²ÐîŸÀüA(²Íüa;—!cÜa'«*À÷‡2ã!¼ Ò Ð Ëà÷î2Ÿ¹ëÕÆ Ð XÝ:Ñ¢L„ïB~’W@ˆÓWé]H½>âÐûÿàüíÒ¤Ÿ¤ò´·žÖ–ÄÉ®ìÂ…±ƒáñÚùA@òA»±A@(ûì"¤ÎíÂù®ÝÿöÒœŸ¤µÖ¦Äž…ƒàÚÉ ñ´·á – dü:)Ay¡¼ÏHŸ‹ ^É,zJ¼E5Äèž*8ÛŠÊð¬ÏÚ’ß­ú¢û‰´ñ·¨å‹˜¡þÙŠú!ÆÏäû!ÁŠé­ä‹ИÚŠ¢¬¡Ù·£ú’Êڷ߉Æå ú7´ñ þð¨PÛ:_í@éŽDcIJùn. ä2Mäfˆ884EB4F-BBF8-4151-852C-4DB4895C512DyM.Í.n è2Pèbn¸BA1A3BE9-F28F-4BC3-A83C-7E3A3DA4A9A4hpx‚P6nÉ2n ó2Vóbn0E2C0EAB-0289-4AB6-BEDD-244305D126C7hnV.nD¿?U3ð>*2«€ùƒî‘Ø‹ôý„¨Üˆš™“òÛ°ß¿éÔ «‘A(Ôa¡V°AýØaƒ ¿™A-é!ìÛ!â€!û‹ ˆ ¨š“î(ùßô„òXÜ:膥~B‰íŸJeö ¶:0»»#»6@½ªô¦²çŒ§öAûŪΪɪ°½oôá1,ŒB§JçÑö`ÁÒ.( ô2WôbºˆC5344F4E-BD6B-4AF9-87B0-1EF74F4F713](W.ºÈ6( ï2Uïbn@2C919C43-DFD8-462áh8E5-0E9475036A46yU.n¸:T,¼¼#¼:T@Ó⦦µ²á±õ¡3%Tùsµ!Tá!Òâás¦!TÓásõ1T±`µ:x,¿¿#¿:x@‘Žª¦œ²˜œ¸Ašx9̦x¸A^˜:Žx‘!Ìœxœ`Æ.Ì ç2Oçb^TEAC8E065-FC41-4C9E-BE1!c 6985E8A3A=^O.^9 .n å2Nåbn˜3B3216D6-99D0-42EE-A322-A904A5EE3BA8hpbN.nH»> РŒ£•ӻﵙ©‚­Á³Ñ¯ö„æÃ€©¸Ö†Õ!Ö¯I ÖÁ%†a/€Á%Œ!cÓaîÕï™ µaH•Ñ!þ  ³!æ ©­¸ ‚„ö é£ ÁX»:<Üb„ëD£ª¾§•èJº> Øýšõ§ëø¥–Îó¡íº×¾‰Ž°žÌ‡¢âÇêÏäøÇäšêäóÐŽä¢ëý¥äÌ™âß ¾°·× º¡žõ(í‰#Ï–‡Î P§:Z= úÔLLn¿jHwSoÍT .9 î2Tîb914812A21-B3EC-4E99-A290-837483ADE293hU9T.9ê 2x ,¾¾#¾:@ÞæÞ¦å²¯®”u”A*”¡Y”!<Þûæ¡Y¯aÞaåµY®`Ë6ë ö2Löbæ7BC3A132-5906-46D7-8446-8DC5E222FA6DhæL.æ² .T ë2Rëbn@8A27A73C-2552-454á 484-ABB63AFCD4E½ÇR.n·:á,½½#½:T@Ȧˆðµ ¥²•5T:Y¥A6•áðY JȵY$ˆ`ÿÌ (L*Ìâ Ìáâ "Ð 0Z$6AA3C7E4-6FÍL478-8A4B-6B4F1AE7443M2.ÙÌa0Y*÷2·÷bH@0099E750-43F4-4A1!H8C1-2076B752852FÑ¡ ·6pâ 2p$Ö 2ÛÖÎ6ž C23C498C-ABA5-43CC-A04F-5B6C4CFCA2BEhM& Û.pý ÙD¨XT> PK—ž&ER΢WÿÿIndex/MasterSlide.iwaû“ ðL#ö®*í«³êìïëîº ³"*(0B$ Transitionnoneð?)¸*ê2ëRBlank˜¢íêïòìú«^šº¦D¢îÈíÒ€¼*ݰ · ¯ >  ÀÿC 6D °%lö%@A-?0(8$Ýh*b.=T . ÈB_6ÈBÈB >D<°°Ñ Ó@<*’ƒ* (’2 ™:Pr ê:$”²:$–¹ BÅ$€ZD*C’$”2$=f$ "5$ *C6$*CZ$²².$H*¨)$, Title Text50¨¶0ì:0 ±”6T)éÈ%0N!0DÒ0=f0 "90 D60DZ0±±.0RPhoto - Horizontal˜¢â Mediaæêƒò€úªúZšªÀ¢‚ªLorem Ipsum Dolor²Donec quis nuncÈÒÅþ,ÿ‚ ç%8$ €,D @ (€C *€¼*Ýà · ¯ >  ÀÿC6D !>%lå%@A-?0(8$Ýh*b.=T . ÈB_6ÈBÈB >D$ÃÃÒÑ Ó4<*’ƒ* ! ’2 ™:Pr æ½-O(s*‘Á2 1"ý·HBÃ$€@DrfD‚" ‘" 5*Á8J!jtðDðDZ b j Á ¾ ª5¦)„ éC„æf¦=¡¼8f¡ "5¡ éC6¡éCN¡ þ6l Â×6lE@IlNDàBÆrl×2l =fË "Ë à:làBNË$ÂÂ.lH*¨Il, Title TextUx¨®xÿ:0 ¿éN0!=0²Bš0é6œ%0²Â0²:0²BZ0$¿¿uœoª-1  –BMC €ZD€÷C%Alë%@A-?0(8$”h*b.=T   €_6€÷C 0>D<’’ÑÓd«ºƒNBody Level One Two2hre2 Four.! Five* yT«   / ?2( ú /?: EºPr7 Â:¥F¥üC\C!FÒ áÖ¥=f¥ "9¥ áC2¥R¥$5¥<*…%¤*1…255$b$À:$‘F$EÉ B!$Ij*Ö$=f$ "9$ *:$*CZ$‘‘.$H!$¨%$ ©v Text50¨®0 Ä çi'A„€âC ðBÃ:RÝ:ÀÿC 6D!Reœ%~Ý2=fRȆ9R ÈB6vÈBZR.R<*’)R5F’®FPK—ž&E§‚ÇFFIndex/MasterSlide-3.iwaBì ðL#äõ*ªÿÕ×ÖÒÓÔ ÿ"*(0B$ Transitionnoneð?)4*Ò2Ó: : 4RTitle & Subt h˜¢Õê×òÔúª^šªÀ¢ÖªLorem Ipsum Dolor²Donec quis nuncÈÒ¯(ÓÕ%€¼*žÝ · ¯ >  ÀÿC 6D ÷%lä%@A-?0(8$Ýh*b.=T . ÈB_6ÈBÈB >D<žžÑ Ó@<*’ƒ* (’2 ™:PrÂ ×  Q8€Ö ç $ €C ÜCÒ:Z ×6Z ïCû ND‚C’Z×2Z =jZ"9Z‚C6Z‚CZZ.ZH*¨)Z I÷ Text5f¨®fÓ:0 é›N0Æ=0²Bš0é6ŠN!m²B¾0²:вBZ00››ÑI$a]ª-1  üCÈB Ò D%Aalî%@A-?0(8$”h*b.=T H _:D 0D >D<™™Ñ Ó@<*…ƒ* (…2 ™:PrÂ Ñ  Q €ÍB8—:8–B %8€ZD*CÒ8=f8 "98 *C68*CZ8——.8H!8¨%8, Title Text5D¨®DÌB0˜R0Ih€%0Úh=¾0¢h$˜˜Uha; «º)1  ÈB~C $ND‚C%! lç%@A-?0(8$”h*b.=T H _:‚C 0‚C >D<••Ñ Ó4H*¨ƒ )© Text* 4¨2 ¥:Pr É:0“Ý:0ÀÿC 6Dѱ ’0Ý20 =j0%›=0ÈB60ÈBZ0““.0<*’)05$’®$ Ê ç)‚ Ç:4 é–NdÞC%4E²Bšdé64 =j4"=4²:4²BZ4$––Uda7ª)5@NBody Level One Two2hre2 Four.!Five*M©Lª   / ?2(Q¹ /?–ÙÈ:¥”Z ÈB9¥Dš¥N D¾¥D6ÙDZ¥””:Ù …… *qè…®ÙPK—ž&E 4BIndex/Tables/DataList.iwaLü õ.PK—ž&E©JŠ  Index/Slide1.iwa›,ðlC÷>Ÿ*2ºûî›öÀü©³Û¶ŽŒüë€ËŠæ‹ËÑã ³"*(0B$ Transitionnoneð?) <à?*Š2‹:æîü€:û:üÑÛãëÀ:Ë›:©¶º¨ËŠö˜¢ŒÚŽ¢ÀÒæÒîü€û üÑÛãëÀ$Ë› ©¶º,˺Û%dð^g*‡» ` >  Üö@IaC $|DFêC%÷%@A-?0(8‡"˜yIA D»»}Ñ }@<*±* c0±2 :Pr û6Ï ýŽÏ$²A€fªÏ @ð(D06CšÏŽÏpA Dýý}þÏ2Ïî6Ï ’òÏP€DDC@D íCD|BšÏ’.ž ÏDòò}ÏO*°)žkqueue5¦°†¦š)¦ es2±›A]€ŽŸY€ ‘4D1± ¹Bþ±DŸŸ}âS]€, File
I/O抌^æÀ6ȃ qf \DÀ»ÚA— 2×B®ÈƒNÈDÂÂ}æy.È …߶Ű¢* ($64290E89-73B7-433D-A0C9-28492B2D87AB=òü5ò(·*þ ¯‘t‰ØB€º% ’t h,*ba=T . ÈB_6ÈBÈB >Dþþ.ôT!]ø…Ã$ Network .Dø‚Ð^D©A­}*¨ÛPšMþ*b*¨¨}QD6*$DNS
Ops.UKâ*  çÉ Û!`öÜ}: 0Ý(Cþ:^:ÜÜ}öL!ݱ UDPï¶:} ¶!Xß´.Õ€£fþÕbÕ´´}ßT.ÿ( User
cod¹æâÖŽ íè0*Ê ÊÊ.c >*›£e@5^›J3£bŒTIA(¼*ÉÝ ·bÀÿC 6å8iãžbÝþb²b$ÉÉ5¨ L*’Ì%&5+’N+J9 ÌZ6Ìaxû-£,  ü!N]¡’ú&‚À¹þ‚b‚úú}]¡&‚, event portsÿêˆëaêç ƒìõ¡(‘Ûþgbgìì}çM.g Pipyêà€2ç ‚’&$ªA@?a€vûC (ÖI M €D‚‚}àQ.à uv__io_tþÄ!Äg.ÄŠ&ü  ±DÀìäé Mžü ŠJü Dƒƒ}ä6ÄIOCþ,Å,ËÈ à ŒÌU¤à4à€zŒCªàŒJàDÌÌ}àèñ , Thread PoolþÇ!ÇŠaõ½À ÓË6À–·  Bà €ZD*žËÓ.À=f" """ *C6" *CZ" ËËÒ1<â "RDêéòæú«^šº¦(¢èÈÒiñ,òð½%2ðPs*‘«2 >  ;ÃŒB ÀkD«*D%ï%@A-?0(8‘"5*«8JTtÿDªDZ b j « ¾ ª„ƒC!„„Ò .„ðZ„ h*b.8T V Z:D 0D >DòBH­2 ÄD0¥‹%HçÄšC²H5 *­-H@uD€#!H bj %H­RH Àê‹A 5>„ò¦H€”CºH€”C2HJHæI0¼*®” · ¯YÈBÈ)JNDDŠJA¯”. =jË"]:R<®®Ñ Ó@<*…ƒ* (…2 A¬:Pr è çm'-E€ D ([C €Ž AäÀ 4À8Dé  Ž €ç:u ݯ6uÀÿC 6DE;U ‚ÞÝ6u =ju%à=uÈB2@J@$¯¯:u ’6u’®uä:$¬F™–A™ E™€ZD*}_b+µ6™=f$ "9$ *6dV$¬¬.$HA™¨)$, Title TextU¥¨¶0å:0ªZ0MCATÁ€÷ê0€÷¾0€÷60V0$ªªuÉœ «ºEU@NBody Level One Two2hre2 Four.!Five* ‰L«   / ?2(‘* /?JºZJñB¶©2 Ѷ€DLéÅ!£€îC4ŸŽ£éþ5 *©Í¶ðaðÁ¶ b j Ŷ©R¶ @@­¥@A'å¤2¶ñþ¶î¶ͶPK—ž&E_;ÝI I Index/Slide2.iwaE  8ðoEÖ @ª*4ö•!³¨"(æ —#’#˜&Ü é ¨#¾"è ˆ!š!§#€!¥&¤!¢#¾&ç ­&´"ê ³"*(0B$ Transitionnoneð?) <à?*æ 2ç :ܤ!:€ˆ•š¨":´¾§#:—¨’¢˜&:¥­¾À(Šö˜¢è Úê ¢é ÀÒÜ Ò¤!Ò€ˆ•š¨"*´¾§#—¨’¢˜&¥­¾,(•!Û%qðX·*Ž”! ¯ >  @*ÅC ³C ŠC PB%Ö %@A-?0(8Žh*b=T O  ÈBJÈB 0ÈB >D0”!”!Ñ ÎˆY*±Run idle handles* 80±2 :Prš es - ¨"B=§":=.ùþ=þ=Š=§"§"==U.=0 Poll for I/Oþ9!9(=9ªAvŸ( ¢Mv À4‚Cÿ»BYÈB¦vÚ!Î*ÓIfEVÈBÄM5\ﵪBˆPjA & [ÃÑBú®n ƒ¨ƒ ( (! / K.( °5œÀD - (- P! \ s (Yé Ÿ(Ÿ(=¬L.¬ Endî£)£æ ‰(¼*”í ·YÞ–a° Û €ZD*Cš¥”=f "•+ *C6*C=2Z…O$í íÒ‘<*¨‰5/¨† 2—#]Ç¡= š#9"ð'ÔCåW…‰¾ ’=2==f"Iç9" ¢=š#š#]TK! ò©=No5$òâ/’./$‚*#ˆ {mõàvDÀð!. íˆÎAï:>šP ˆ4eô. = mò5@M0 Þk CQ#.ú<}NöŠ%2˜&]ë ˆ™&ë ÇOD72D…àB“‰ ë‡CzV2ë=’ë™&™&=åþëëÜ ëa Žà y €‰ÐC0QAìfêB=þB^Bà à.%6B” »"޽”Ñ Me{þÑ þÑ vÑ »"».” ]šPCall close callbackîÕ Õ èaýù ë Ý6ùÀÿC 6%CÑšš×Ý2ù=þÒbÒ$ë ë õùL*ï ’ uÉ’2é Þ * J ï . ½ñïaÉûz ,  ˆF` …>` ‚„ÖaÑþþz…!….` \.` preparþc 2c š>@!BÏÑþ@þ@Š@!.@_.@eÏpendingþÑ.ѧ>T ˆª#ÙT !ܵCx y^ÎÝT4¶=þTêTª#ªþTBT€>…ý .…ãÄ^E…¦’è Ž2è =þbý ý¡á W.…aÅdueßrîNÍN¥> ¦&*ô `XDÞ_ÅK ³¬SC–¿?%:º|=†|¦&¦þ B ¤>&¥2« ëC©£0 ­øBì”Ö ¢K=>&H&+HaÇ*þ > ¨ 6Ü $HB¥!¥.«V.&  
alive?õ=Š# V ¢.¢·*¡2H ±DþHþHšH¡#¡.€L.HY*xêI¾.U& ˆ¹&¹ÒÕ”$DV)Ajà­BˆªÒV=†Vþ& b& ¹&¹þ¬:¬ç¡*å ”ì 6å ÞM¥Ôo€÷êÞ€÷¾Þ€÷6Þ&"; $ì ìÒ±Ö<*«º¾u¡«NÞºZÓ ­.f‚*ˆ®&Ä{”ÈC$Ǿ!! !Õ,Dnœ@…Ï´CrÏ2Ä=†e®&®þ:´>5ޱ>ÉÐß ò þ5þ5v5±"±.5Z.»áácheckþ&ê  û *îî î.“ >*›£6•›Ns £^•PK—ž&EøxÒÏÿÿIndex/MasterSlide-4.iwaûæðN%ì “*íØÚÛܬêÙÝã ê"*(0B$ Transitionnoneð?)H*Ø2Ù:í::ðBRTitle, Bullets & Photo˜¢Ûâ MediaíêÝòÚú¬úZšã¦À¢ÜªLorem Ipsum Dolor²ŒMaecenas aliquam ma ð  €²CMC  9D€÷C%ì%@A-?0(8‘"5°*¢8J ÿDªDZ b j ¢ ¾AǪ„,„„ ÒC6„íZ„ h*b.8T Aæ Z6€÷C 0>DØ º0¼*”  · ¯Æ–B Bl€ZD*CŠJ!g”Ë=fË "Ë *6ËJË<  Ñ Ó4H*¨ƒ eþ$ Text* 4¨2 !p:Pr Ú:0 Ÿ”60@!$Iz%œ€’z60=f0"=0!ëQjû$ŸŸ.0  ÈB\C $NDáC%álê%@A-?0(8$”h*b.=T H _:áC 0áC >D$ÆÆÒÑ Ó@<*…ƒ* (…2 ™:Pr ‡R=$ÅÝ:$ÀÿC 6DÅ¥ ’$Ý6$ =j$%=$ÈB6$ÈBZ$ÅÅÒ=$ ’6$’¶$…R=$ÄFH–AHMC!$€ZD€÷ÖH=f$"=$€÷6HVH$ÄÄ5$a «º%%@NBody Level One Two2hre2 Four.!Five*M™L«   / ?2(Q© / ?YɺZÉ ˆ çiuðB €âC„:ÇÇZÇ B5Ç*êÇ*¾Ç*C6ë*^ÇÇÒQëH¨Ië ©Text*‘¨®÷L‰ €PK—ž&EJ[”­­Index/ViewState.iwa©»dÐÒ*Á( Á(   t*Â$Ì%* D2ÌZÂ(`m€?u4€ˆ ª/0µ C½üBÂ8€¡DPDÍHCÒHnCÀBØÂ(  ‡0 (08PK—ž&Efdw5Index/MasterSlide-8.iwaåðN%è ‰*éõªðñòóèô è"*(0B$ Transitionnoneð?)H*ð2ñ:é::ð  VCHB @sD«*"D%è%@A-?0(8‘"5*¸8JTtÿDªDZ b j ¸ ¾ ª„€„„Ò .„éZ„ h*b.8T !Ü Z:"D 0"D >D õ %G4€ð 0¼*×µ · ¯Ú–B5^ €CŠ^!{×BßC¾ßC6ßCNß<µµÑ ÓpH*©ƒ Title Text* 4©2 !„:Pr ñ:0é´N0€»C5°€¡ž0éB0€¡¾0€¡60J0´´50Aª-1  ÈB€úC $NDB%î(ó,@A-?0(8$Ñh*b.=T H _:B 0B >D0½½Ñ ÎèQ*³ƒ–Johnny Appleseed* ³2 : PPr ÷>5 ¹çB5µ=5Xž5çJ5XÂ5X:5X^5¹¹.5W!5²-5,“Type a qAÅ$ here.†5;²²;ùIo(¼*º” ·.=–BM%=$€ZD€÷C’r”2==fr"]r€÷C2rVr$ººUtÓ «ºIuMD2ÛVÛ¼¼.( Title Text50¨º/û:0»Ý:/ÀÿC 6DETÅ" ’/Ý2/=jTE¿]TÈ:lÈBZ0»».0<*’)05$’®TPK—ž&EšòߺºIndex/MasterSlide-7.iwa¶÷ðN%ô È*ãàõÞ«¶ßáºâ ¶"*(0B$ Transitionnoneð?)°*Þ2ß:õRPhoto˜¢áâ MediaDêãòàú«^šº¦(¢âÈÒi ã î4€à d¼*”¥ · ¯ >  ÈB $NDD%êlô%@A-?0(8$”h*b.=T H _:D 0D >D<¥¥Ñ Ó@<*…ƒ* (…2 ™:Pr õ½ R(s*‘§2 5"€ÂÇ( ÏìDÿÿ?Ž"‘"5*§8J!jð!j`ðDZ b j § ¾ ª9¦€!¦„àä<@„õf¦9¡8b¡ "1¡ @:¡@R¡ÞBl¦ 6l–Æ El €ZD*CÎl=bË "Ë *C6l*CZl¦¦]lH*¨El, Title TextUx¨®xßB0¨R0MCa=€!0€÷ê0€÷¾0€÷60Vœ$¨¨uœo «º)1%/l°>-i¿>·’ZbaJ^J^ZÈA-Òç ‹ *ž ‹ž‹$ °‡.kp* j·,ZXV%k4‡…?%ˆˆ?- ?´À@ !~€@2'!‡)“%˜N:Pen)”Ó®1ï* „„!À bŽ  àAbPK—ž&Eñoí¸¸Index/ThemeStylesheet.iwaF4€€ôj®ƒ¨‘ÛL*šÒ¤òÝžžÉ÷ñ‡·ùŒ¿ÀŸõü ¦§øÜ¨ÅƎ߇™¬ŽÊÎ𬮢…‹¨²¢êèô±•¨«¹»¼Þžâ‹ÕùŸØºÜÑä—„êÞí󤈔ÚèÓש„ý´ë™þ¢˜û«õ€ëø—–ϵ‰­³š“²áòÃϧÔムôŽ•¡þ¸ÔŒà†Û±›ˆ¥çïо¯û±æÚÛ‘·†°¶•ìÍ£äÌ®‰ñ€°ýŠ³ðœ’­¹Ø’‚‰ÿˆ›ÐÇ©Ÿ‘†Ù–óÖÄ‘úì™¶š®¸Š’“š´Ò²“©­à÷î¯éŠ–£¬î—‹‚Õœ„˪«œ‡öå ˜öÖ¥¦£µï”ÓÁ°È…â寘áƒÙüúÿ挳¡íߪ½¡ ¨ £ ¯   ¬ š Ñ â “ ¸ ¦ ’ÙA©Íô œ ‡ÿùŠí‚‘  ˜ ´ñèçø “ ´-ï‹ ’ ö÷Èéῤ#¥Ž<ܵ °™— ³ ÷Â֭”¡ªÜ¦ê º Ïø„Fñ ¡ó ‹Û£·ç…ÿ Ë ßìÛÕÄ…¶ˆž©7 Œ§ë ² FÀæ × Ý ¬² ® ˜ † Ÿ#î„¢ùòœæ åÌ­-í Ž#äðà  þ Ç à®„ ‘¤¨˜»—#Ð Œ ºPôŠ–™ ÏÑ –(Ù â¦è³ ØÔ”°ÒãÎó‰ œ ÓˆA¨ ý•ý#Ãáéƒ(Áשׂ Ö ûþ‰ —Æ×ü°·Ý¥±‰_ö¹”ŠÅª € ú#¼ †¤² š © Þ ž7Ž™ Е½§ •Ú ‹ÒÔ›±®«¾ Ÿ “ ‚ ì ›(šž£Þµ ¥’¯Ú õêò É ûʶ7ƒ ¹ ß §(¢‘Õ ¸ † ¡ ü(€ Œä …¯(ӳح‡õú«åˆ‡#ã 4¢ table-2-ˆStyleç chart-0-series_3ý4464õ  4(2-paragraphS(_4Ú h(Name-4-shapt±@0>@$9í aPÏ text-3-listsÄ0-Lettered Í2Í2!æ1.Õ! ªÐ"©DB2"ñÝ f3RD·D4R"Õ  DD5-valueaxis_1941«3.Â=¦5>p5š6<5-head2<æ’3:’ì`Bò40Ÿ note.x%õ ›$ .º ~Column1½ŽÞ5Þ]ý9,1:š€šBÐú© !iacter-”-nullAl64FSÓ#,stickyCommenA[2$—  slide-10- g ¶ B 6÷j¡!õúBB‚B¡…2 imag!}1S‘" e‡6Yœ-Labe!°=7-26?“46•' Z× ZBody Sma%c ¬ lin^%7% †%ZY0M}І™]4•]²) "|9>Ö(Caption Bolf®fµ3ë+ $D17>ET¡~ %E -¦9¤B_!‹=¤B 7àE#A†t2ïAßÔ]BÃ^ }µAÓµDŠo.Ìoûa«9w4-bodyí á.l:†N˜Ü=f•˜í )fÝBulleÁ'ž6}0I"Ø=W]fÅùÐ!B¬8=ºB=á;°½ªB!1á!‡"BŸ"ÁÝTB†"ð63Më6ðÝXBïHÐ"Bh"–ñB«á°ß]nBCðžBBðB„1 movip%’ —…1-26™46›% E&2>‹Subtitÿª6EÑÄ6E¯}uòa¢]¾u-A¥˜2u_= B!ã:Â1וDÝ%1Å ·]ÃBeâ¹Aœ ±Aˆ]Bì1ô„å—yì02ìþ:~36~ˆ!—>úpC †“:[2FD§äB©ÁÓ!B•ɤ=GB•B­=Þ"=éExå”A᥺ÿå9A.Ô ±°category¢ !”°:46ñï66ê‹86ä•C.¦0hyperlink£}¸BÁcî:ì32쥡j Ñ0FÑó^B§Á„’=4F@—= BÆžžÅ’%d-116ý³}u³!g޽{BV1!÷§"B¸"Û& …]]9E-TZ AlÁ‹©}MFlA„5¤t.KiË"Ã"FŽD´°Fé"&™6:n2™-µ=Ö3F–¤B4në !box!}ü % ]B·á=ˆ&Ÿ 1"Ÿ ¯] Bäá•Úik>sŠ2‰ŽŒŽ=Ê)Ž³Å˜ W:*Ž…êIþ2F(‹"Q 1=üz"R R·¯¹Ž16 …* #!KAá6'-S]( Number’®"â ®‡}g1F©Œ8"i 8Ò…v¥é-16œ% 36ȽwB  Ë!BÑ åx56]å* µ’U™] =n)É!×:é5FRÞ]ÚB›1AÜ:s ^ 6.¶=ú=)úAttribuP ³* 4:†ü]œBÊÛ=IB!Á…%ÚA2&* èw2:w­VBw•:J1x *¡˜&]0:`ê* 3uàò. 'Ié])4.é­Z¬:Š2 …6ŠŒ:«0Fõì=f4ybI9¡¼ iç5-legen‘]q± 86ßÝ" !–Ù]Ä" µ=zBÄ‹eV16;’…ä 36”r…A×–]ùBó"£Í•$aWÿ]B;þµ56š–=F|šÆšBã"áš•öš=¡B?>î=ˆ•Lu¿=ˆBu¸Ö]4B0[¸™I4.×a?Í¥Ž¥;Í’E9öYo4YoýÂB .[û”" eH ‡Zù™ŠZµšio{=LVÑÌ ­*·5uÛ«=‰Bæá»!BD!‘ʆ ~0™È -NonÔ=ŽB7`õ=S39S±*7 Õ%‰_1öô]\"D 5Ì:X4~½âÉ)«nÒœ6¦eY%S4.SM•¡# "1})ô Quot!|²}D•ÌÅ™§B#!æ…Ö16»˜…Ì 36špuîA#÷=o•¡®ª M56MœBjBü &9 =­)iwð ¡Ÿ²y»2Yhû›•hGƒ( !%bB.sH ¹:45& E« ®båè* Ù=†B{AÉà}Q<2 ¢ Wood :  B  J  R< Z 2@b j z ‚ Š. L ˜   ¨ ° ¸ Å!0DÈ ÐØàè ò-j_C4 !u?08ú†00‚‚`20І0 @@ ’r0ôBE8 -ÍÌ Àšr0‡ ð`¢r0´`@ 0ªº0ºº0Âr0FÀÊr0FÀÒº0Úº0âº0êi®4äÜ_>%Ä0:>-…b…>qÿÀ@.ÿ’ÿò RG…!¼ZQ–Rú R0Ñ,Ë>%´^²>-‡ÿ¤€Ê£‚ öVR6ö–õŠ RþH9H’ RþH9Hš Rþöö¢ Rþ¤¤ª RV¤Îì²¥‚ú?%¡n-ø?E⺽ÞÂf(ÊfÒfÚfxàèð€ˆ˜ µÿÿ½ÅÍÕpAÚI¶Vd@2¬–¶ê RVnÎò Rþ¤¤ú Rþ¤¤‚)HVRÎHAY   ªn˜é8@ -€>áø² ”07L?%’Ùù>-³ö2I¦¡vÊÜl¸ÀØàèðø€ˆ^ æ— Å 2+*8 Ô _1œ |P4Z¸ÀA*Helvetica-Light:B Ja(@PX`hu#}€ˆ ªjî8è8B +@ -ÔK^°f ÝB àõx ,ø€ˆ˜ÿT °be.%B(=y@HP] $jÍÌL?pxá &v •W ¨¥l­ÊÐØe4àø¸È( ží Ë ',K%K‚ñ° A0® D@† Fill Centerб_€?™ : …Ñ"R-ÍÌÌ>2G 1 8@J  A[ðAå®$Š Direcal Keyî @?fR4¿€¾(¹¿GdH¿ … %RAgîˆ ˆÍÌL†ÈBat!1Ä ˆLefþ‡ ‡Ì=f-œÈÂ:‡(· Medium ‰— Top e…bÓÑR?Q€A3:A3†—@A3Èš - ‹ %I¼ HighbŽhÅt?´P4Z±‰, A*GillSans‚$Çÿ?%ÿÿ?-ãîO‚o1$þ‚þ‚ª‚ž çØÊ & B{6F”6)VX>eŽãx?žmAÊ m BmŒÒ Cm/RuŒCr Ýþ¾‚•¾»&™˜nª9)T4Z‹Qªþ þÓþÓzÓ ÷ "óî&ð"Á!3%!‚ñÐþðþðþðþðRðP¢ Gray Paper :B  BB  JB  RB  Z0Hjv>%Êtv>-úgvXbbjbzb‚bŠf Zbþbþbþböb\¢ªºÂÊÒÚâ"Í0´è=>%‚`ƒ>-¨¸%)Ñ:Ï–{þÍfÍJu.q–º ÍVRÎÅÍþH9HþÍfÍþööþÍfÍV¤þÍBÍbeþÛþÛ¦Û$…¦‡>%ˆ¬‡>-  Ò“ÛV|ÎÛšþ¤ ¤Û$þ%èHv>- öΤÛVöþÛöÛ0-—á>%Ë á>-•áæþÛBÛñ Û.©Bz+12ˆ Ž©þÜ:Ü`ˆ2BÇ©îilþ©þ©Ž©©É)ó*Ö "-0%N ‚ñÕþÖ þÖ þÖ þÖ VÖ (¢ Green"× :F  BF  JF  RF  ZÉ 8mÑ=%¿v+?-øû„>5RÛ JÛ JÛ JÛ JÛ JÛ   =* × 4ÐØàèòj!þ=*þ=*þ=*R=*‚Û 0ÌhX>%8ˆ>-¡h£µE6+þÛ þÛ JñúÛ VR6ö–- Û þH9HþÛ fÛ þööþÛ fÛ V¤þÛ ZÛ JmþÛ þÛ þÛ îÛ JBç–þÛ fÛ þ¤¤Û VRþÛ öÛ 0¾¼=%ò©^?-­±¬égÞþ¶(>¶(‡„ NÛ *â5¶("."·(þ„*„n·($5š™þ·(þ·(Ž·(·±1W. *B2 FÚ^ *:™î‹‹þ *þ *® *»86ú5& "ú5‚ þú5þú5þú5þú5šú56ú56ú5J &'6 6ú5Zë/*ú5@&ú5@&ú5@*ú5@&ú5@þú5þú5þú5þú5þú5þú5þú5þú5þú5þú5þú5:ú50ÕÚ>%§Ô¦>-ž°þR þR ZR 0ÍM?%¥W#?-ðŒs¤Îf -R¤Rø˜RîR þH9HþR fR öBHÎöþR fR V¤Îì²J½&ú5@þú5þú5þú5òú5%nþeD þú5Fú5¤þ¶E¶D VRþD öD Ø& %ÆöK?-Ø•äþD :D vN ô.ú5 ^ $*¦^áD*ŽIÔPZ4 Q0?%žµ?-œËc%N4L4€Ÿ@€@Ê@™4@®L& "Ú*6"MC" "¼þ6þ6þ6þ6V6¢ Br5"2  B2"2ü!2&ø!DLÅ[?%ìÿ÷>-˜>X>5333JJJ‚Ý!JJ  ˜    6ZA( Ø à è òþþþrÉ) €? ²6Eš†þ° &° þø!fø!JñúVRÎÕþH9HþË fË þööþË fË V¤þË BË ÉšJmþþ¦0Ì0L?%È6L?-Ë-LéWúø!Júþ¤¤ø!þ¤¤Ù VRþÙ îÙ Ù øp?-|ä{égþNÀÆ¡ Rw+"mþw+þw+þw+þw+¦w+Nw+Nw+Nw+Nw+œ 0†ŽÛ>%sUß>-yåñ œ J J J J Jœ RÙJþw+þw+þw+þw+~w+þ&þ f Jñú VRî þH9Hþ f þööþ f V¤þ Z Jmþ þ ¦ þÓ*&Ó*w+Jú þ¤¤ ,ÜxÛ>%ã>ß>-âdÍÚ¤ Vöþ ö 0Ä?%G!?-µï%"[ þX:XŸ"z7 Ñ2 $ UW|7BmW\X>žv7(¾{7 ffæ>€ {7þ²ŠÞÜu ó½ (  V4* V)W Z€(0Ñ^?%kë^?-RÝ_I¨H7(‚Šõ nP<ÎÁþQ>QþQ>Q ?þøþøþøÚøþøþøþøÚø/þøþøþøÚøþàþàþàÞàþðþðþðÚðþøþøþøÚøþøþøþøÚøþøþøþøÚø þøþøþøÚøþøþøþøÚøþøþøþøÚø,þøþøþøÚøþøþøþøÚø þøþøþøÚø0ˆÁX¸X¨»XÊ>kY(ÐØàè"'Já&ÚÕk_þRRq)þRR¦þRR'þRRk_þRR'þRRk_þRR²½_JˆKÚº Rþ¤¤ÂþRBRÊþRBRÒþRBRÚþRBRâþRBRêþRBR}o&µK. AFè^FÜ4þ26š26gNœ26j„§þ Aþ AŽ A l N26B[lt .cB Z QJ5î2626þ½Oþ½O®½O ¦f›+J)uè&›+0ˆ{§>%–®>-ÃÂÂP f›+£‚& , [ !*™ˆ2:mt>k0–&?%î^í>-—^~k¼p  s,,M - master ép  mJöp vZ|,J"ö| U‹.âBCo1k,.Œþâšâ:b6å? þ:þ:ž:¨.â™*ïTB:¹9‹þïPþïPþïPÊïPèsžÝ."t’ÝÆ.†.ÝFuVþÝâÝÅ¿þ›;þ›;®›;ƒé&U ­*± ƒNs¸r.Lƒ)¨0 Zã ZX" íf+a|?%-³J4d? $$‡©>?%†©>?-$€äa(€? *äË–@r.6²!–ÞD…1?"n„hú` @ ;Yb.4*P Z#" ŸdBÓ1R±…sµv$®* 2 ¨sDark†fÊs)X*$UþJ>*J>æ$Uh*h,%8B&*hþ*h&*hÂ-h¨K«W " 4~- *vK~)/X>ej?ž, Am i mX´Øü§Wmh, ¢4&: þz¸ùÚ.qWBÚþqWþqWþqWúqW‡Á&rú+Ü þqWþqWþqWþqW²qWNú+Nú+Nú+Nú+ú+0î1œ>%8­ž>-=´¢? ú+Jú+Jú+Jú+Jú+Jþú+þú+þú+þú+æú+Vô:6+–¸þú+fú+JñÚ•ÓVR6ö–€IÓþH9HÓá:ˆFBö–šÓþööÓþ¤¤ÓV¤6H –š²^5Jº Jmþú+þú+þú+îú+JÚV+R?þú+Fú+,Ÿœ>%š˜ž>-ŸžÍÚ¤‚¸tVöÎ9)þLu&Lu0žþ>%^E?-R"€ þú+:ú+è— Èß GÒ‡2*Ò‡À Z€vj*6£–™næ Tf €@ "æ ŸŽ&½ é½ @ BÉŽžòŽ Ü*"vþã–ãW‡ HwÄÚcø "vþø ~ø õŸ&x:A®C&' )]&æ0´D´>%ÊpH?-ÊìB< f枌&E rÜMFA^ªJ°îª9Ç-.yÚÇe¿!ÇþéwzéwÎr æA.˜F‰P{ .þu®uÉ+€þuþuªu.àQ. jBï8in jþ¦:¦çþPþP¶Pðfj3jj0Nh¼>%Þ]î>-Éé?fj¼Š&ðP™2&ðP&åŠ%¸‚ñûþúgþúgþúgþúgjúg(Rich Metal&úg"úgúEågþEB$ Z" Êd¡G?%ËÝZ?-T$d?5š™™>2@bŠ$jŠ$zŠ$‚Š%ŠŽ%6Å *>F[] þ[]þ[]þ[]Ò[]n& ‡þ˜‡z˜‡¸† 2lþ˜‡þ˜‡þ˜‡þ˜‡6˜‡F ˜‡þ‹F&‹FþZfZ:BN6Ë –nZ0¥ &?%q-?-Ö£0‰”Ú ZþH9HþZfZþööþZfZþì9ìrZŠÂr˜‡þ€‡þ€‡ª€‡þú9ú4VJÎ.>þ¤¤4VLΤþ4&40j+V?%H_?- ×c•zþ4:4ù™&- ’&- "\"- þ’þ’þ’þ’Ž’6\6\6\6\Z\*\*\*\.\.\þ\þ\þ\þ\þ\þ\þ\þ\þ\þ\þ\B\þ7 &7 þ f 0˜ “>%؈Ù>-Ü$hBã¶ VRîÙþH9Hþ f þööþ f V¤Îk r ÝþËþ˦Ëþó &ó ÅHVnÎþ— f— þ¤¤— VRþ— ö— 0qbØ>%Ÿ÷?-浪•äþ— B— ¢*— Ä*&— "ÄÓ1þÄþÄþÄþIJÄGR*š"GR"GRÌfJÄ*Ä0xµ$?%*[Þ>-èè,A?2*2Äb$*Äb$*Äb$.Äb%.Äb%þÄþÄþÄþÄþÄþÄþÄþÄþÄþÄþÄ:ÄþÐR&ÐRþE fE JŒúE VRÎ=ÄþH9HþE fE ,¤­$?%ßDÞ>- È­ŠÚºþE fE VšþE BE &ÄJqÉŸþÄþÄþÄ.ÄJåÚúþ- f- þžYž- Vöþ- ö- 0«èW?%è¼?-¸¨b ·2þŽt6Žtÿ¸&F6ÌF6¨ ‘§í7M6Þ:ö PZ‰ R4ßhÍ=%”?-‘ü=&6Æ…'në5€ß @''€?08ë5 Znå5äÃV<&B3 .å$^<&JÄ;î<&þ–#þ–#–#¨^å$BV"ÄvþòŽþòŽþòŽþòŽfòŽl«&Í*¦Í** ´r"´i•*‚8B*>nG:"#ÊJ&þ‚8þ‚8’‚8¢AŠ86¨&ë"%±ý¡‚ñŠþ¯%þ¯%þ¯%þ¯%R¯%Yk$Marble k  k  k  k   Z.g<0W^à>%¢ù??-qüÁË9A”g<,ö\Ó3%Ól?- /s $Rg<bþ\j\jþ\j\zþ\j\‚þ]j]Šþ]n])m   )m ¸ BF„þë&þë&þë&Òë&‚F„0¥¤¤>%°:>-¶Ì:uW6œ–}1þ’f’VûΦ V%VR6ö–)’þH9Hþ’f’þööþ’f’V¤Îìr×þéjéþ'þ'þ'î'V¾ÎXþúfúþ¤¤úVRþúöú0œ?%Õ,s?-O§¤µØþú:ú&Æ ¢è«Ê OÃ2OÆ` ‚ñ©ÁJ€?h·0w?%’{?-•tV1Bi÷·¹<Jw È< 8À¬m7 zŠ bþ``û¬€?ªº~[&#¸» oƒ:¬À ± Èàð=­0ˆ˜¨¸ýÇ "E»” +»*=e%XPN²œVœž¾ E$®F7eþ²¾¬œ 0¾&j8BâMh2Ù)U&g8²âM±7RI« Œ 5bdÛ*`ÆjIµ‡ ƒZQþ IB I PZ^ìÙ×&À;§À;«È.Ø Z‡À;0ó­s?%óçw?-ójvuÈÎkeÿnŸ1p?1-¤y 9"¾¾&ú¥ú) óÃÙ*8ˆú¾ Ì*ù þùþùþùºù«A®ùR+sµ½þ+sþ+sþ+sþ+s¦+sN1GN1G¨6*áž ä  Ài0Ç?.?% |0?-4im1GJ1GJ1GJ‚ª|J1GJ6¨ .¾þ+sþ+sþ+sþ+s~+sþ9&9þfJñ¥«Æ¢VRÎ) þþ®þööþfV¤þBbÎþ?þ?¦?þF&Ff*V|Î?þ¤¤ý4,²7.?%­t0?-°ÍÚÝ?Vöþ?ö?0ÃÈ_?%µ§b?-GNgégó þ9>9¹*¹ Þ¹ 5 CÉâ Alt†yÎÅ "à“ZÅ þr:r&®D"SGÚ®DþuF¢uFÅÎ&Ë.±DB±]1þ±Dö±Dþ&[þ&[¶&[¼I æF.^GB±DQ ."!^ðVJjMî"!"!þŸYþŸY®ŸYÞ.¸D > *Ðá*~щZ f˜Dž.¤.GV*€_7 R.ZÉJþ ² þÕHžÕHâ‘XQÍr)ê¢.)°þ)þ)þ)®)‹8!ÿÒ ZißEP‚ñ®.YÂw0·$9?%¹*9?-¼!9õfÎl (8MAŒer‚©þbbà ¢²~[Â$ÀÐØèºÃ0 ¸Èúî&8ŽRn¥s&þn¥þn¥þn¥þn¥¶n¥:F,¥ˆ2F‰2FŠ2F"Ò„:Š"*n¥J§J§J§J§J§þn¥þn¥þn¥þn¥Òn¥þr/&r/þ§f§Jñú§VRΑ§þH9Hþ(!f(!þööþ§f§V¤Î;r(!§Jmþ§þ§þ§î§JÚþ§f§ö\Ó3%P#€€°Ól?- /,>5fff?À@ -€@2'%% N 0‚O ö\Ó3%BR@ÊR$€?  ª-d„- 5'ôB@ ¹>08²”,W4% ;?-ÎÍlæÊ”ð>¸ÀØàèðø€ˆéÓ*± © shape-5-Dstyle*ƒP Z‰ ):4‡…?%ˆˆ?- ?ÖΦ!"j,€C -,T?08*P Z#" 2 !þN@% 0R±ù æ è\¾ chart-5-paragraphSå_8 ç4Z±˜0 A*GillSans:A0!ÂEP9Ì(@PX`hu}€ˆ ªfÛ<è8Bo1$@ -ÔK?A°Å! ÈÝB àõ,ø€ˆ˜ÿT °be.%B(=y@HP] 8jÍÌL?pxŠ e'•W ¨¥l­ÊÐØe@àø¸ÈŸ=O˜=O3>O01O‹1OH°A*Helvetica-LightÞV þ)þ)z)ØAx¤'e`Ú Qxseries_1%!4‚ñ¼ 6 = ÀAÚ4@@ÍÌL¿*lineÚ8"iÇA :ÑaG?ÆS*þQ>Q 2¢ BrA( :2  B2  J2  R2 Z¥”LW^à>%¢ù??-qü>5333?bbjbzb‚bŠfD ˜   ¨ ° ¸ ‘ 4 Ð Ø à è òjS¡. €? ¤…Sú†00‚f³ `20І0 @@ ’r04á€? -´¡pš¢ªºÂÊÒÚâêIw4¥¤¤>%°:>-¶Ì:>Ñ6…ô~ò RŽ–Rú RJuÚl‚ öVR6ö– Š RþH9H’ RþH9Hš Rþöö¢ Rþ¤¤ª RV¤ÎX²‰J ú?Ø?-øq º Jm J6ÊfÒfÚfxàèð€ˆ˜ µÿÿ½ÅÍÕpAÚIÄ0Ì0L?%È6L?-Ë-L ØÒƒ ê RJÚ' ò Rþ¤¤ú Rþ¤¤Ë VRþË öË 0œ?%Õ,s?-O§¤ég¡„þË 6Ë º.” Å*” 0>” 5s P4Z¸” Àþ” &” ‚ê  +þê þê ªê Ü.Á î*Á 4Á â ‚ñÐþÁ þÁ þÁ þÁ VÁ P¢ Gray Paper :B  BB  JB  RB  ZÉ"0€?%¦K?-VŒ©JÕ JÕ JÕ JÕ JÕ J  ˜   Õ *Õ 0ÐØàè þÕ þÕ þÕ vÕ ïe ÍÌ žÕ 0ÌhX>%8ˆ>-¡h£þÕ þÕ ZÕ JñúÕ VRîÕ þH9HþÕ fÕ þööþÕ fÕ V¤þÕ ZÕ JmþÕ þÕ ¦Õ $…¦‡>%ˆ¬‡>- Î Õ JúÕ šþ¤ ¤Õ ,v?%A?-™ƒÍÚ¤Õ VöÎHþ & 0µÿ@?%‡»D?-‰¿KégþÕ NÕ Ñ ¸.Õ 1>Õ HŽÕ Jî¿¿þÕ þÕ ®Õ ä  •DM - master slide í -8-7 Z k $Çÿ?%ÿÿ?-eà —*Rpè*“ É !stickyComment-0-Zu Y Z¡ Zúç Zr:¥ š™>Újenr´„´ž*P Z "pD?28@R““U¯$µ* %>úps=W4ZŸŽ @A* "" Neueº ’Z¦äæ6hþ_r_Âb„ZbBù9I>4&bÐþÎ&Îæ,þ‹–‹ ê¢Ì6jÌJ  ¾u ½4-legend%z‚ñZ *€?ª–7Þ…ô.‰®CIPtableCell-5-footerRowI$Z @JRí"–ƒ2&™3BØåþ™þ™þ™þ™R™$ ¢ WoodÒÌÆÀº, 2@b j z ‚ Š.  Zf þfþfþföfnˇ+"›¢r0ñ0ªº0ºº0Âr0FÀÊr0FÀÒº0Úº0âº0Ðþ³&³þÐfÐ0‹^ˆ>%½æÂ>-ò¦ó"å ÎÐVRþûþûþû~ûþööþûfûV¤ÎìrнÞþíþí¦í0äÜ_>%Ä0:>-…b…uÎ¥íVnÎòpþ¤¤íþ¤¤íVRÎHþí&í0q®Á>%h ?-¬-þíFí ó¢Ë 9jË J—¤¢Ë Ò Ì 43-categoryaxis&ήߠ0·$9?%¹*9?-¼!95Îú(8MÆeÛ r‚þb>bÐ' ¢²~[&2+ (%oƒ: &?)& $ÀÐØè…(8 ¸Èˆ!céd) « Œ 5 ­ NameZ hapòZR PZQVï!3Bï–I PZZ%*”hÈe §+ imagµ2^ ‡ )´!Ç% "Õ+ÎÚÕj¦ Jÿ*"Ú!tæ-t.Ø*2&e¼_4)[nØ*J9îþØ*þØ*®Ø*覂3¾‚Ó!« *ó*J1rà ‚ñÕþJþJþJþJVJ(¢ Green"K:F*F*F*Fb$*n0O:k#OJOJ‚V *OOJ6O   O $*0ÐØàèþOþOþOþOJOþÜ(&Ü(þTfTJñÅ!Æ-TVRÎL þ$*þ$*ê$*aTÚ‹þTfTVšÎZ rT²Jmþbþb¦bþ«&«bJÚ bþ¤¤bþ¤¤bVRþböb:$*mªÎJ jï6„ / .OB$*Œ þOþOþOþOŽO×.V.… BVþ… þ… þ… þ… Š… ©.O.¥1>Ô þÉ,þÉ,þÉ,þÉ,¦É,„.ê:Ìê:¨ C7!*‘ .é:þê&ê‚w!Jê*PZ^¾ã:ýA7`Rk8"ª-þk8þk8þk8þk8–k8>k8>k8>k8>k8–-4Ý£>%"á'?-7Wz?.k8JGJGJGJGJþk8þk8þk8þk8æk8þ›þ›Ž›JñúGVRîGþH9Hþ–-f–-þööþGfGV¤þGZGJmþGþG¦GþÇ7&Ç7GJúGþ¤¤Gþ¤¤GVRþGöG vC§>%²¬+?8+Ò?þ©F©´.)™ cNDBv1"H‹Þ*^ž)Ê~þž)þž)~ž)ë• qÆ=*4>Ì 9*"–9^*J¬)î¨m@P@ -«ªª‡GþWDþWDzWD™Arì jþWDþWDþWDþWD¢WD>ì >ì >ì >ì ‚90ƒ??%6…¸>-,plð<3Jì Jì Jì Jì Jþì þì þì þì æì $Ô˜J>%À¤J>-… 6ö –… þ3f3Jñúì VR6ö¶WDþH9Hþì fì þööþì fì V¤þì Zì Jmþì þì þì îì Jþì þì Bì þ¤¤ì VRþì öì 0F¶r?%æÙé>-Ó•égþì Fì þ "3V Ò&30-body`%^%Z4Â7JÎ f’3¢fåÈ%(# ! NoneW acter-š-nullk˜.Å3™2&Å32S$"óûþÅ3þÅ3þÅ3þÅ3RÅ3C$Rich Metal)CÑ3B*×3BÝ3Bã3" ˜80e¾g?%C&C?-3 ÜN ?2@bŠ$jŠ$zŠ$‚Š%ŠŽ%Š$"ÙC *ÙCŠ$ þŠ$þŠ$þŠ$ÒŠ$jÍ)J³3þs46s4¸B²@ ™*iDþs4þs4þs4þs46s4F þs4þs4®s4JBúì VRîì þØþØŽØ0è»g?%Æ C?-ÔòÛ©ŠÚÌ þì fì Všþì Bì ŠÂr5PþPbPþ·3&·3²VVÎðù%þ¤¤²þžYžÆ VöþÆ öÆ Ò1%R“W?-?9a„þù%Bù%1ÿ3Ê [ \valueü3¬ ‚ñ©Î€?Yþü3&ü38‰[mõzŠ~Ÿ3ÂÑ^àB€?ªº~[Âú3Èàð\8ˆ˜¨¸û;3N[3=["ˆ þ[þ[þ[þ[R[Ý]6[U5«A¶žµ6Ë  Q¶ ‚ñ°¬6p® Default† Fill Center Bh4ƒ$¸4€?€ar€?i‹A›"R-ÍÌÌ>e_G€¦F8lB 7 AØUðA5LŠ Directional Keyî @?fR4¿€¾(¹¿GdH¿ … %RP\îˆ ˆÍÌL†ÈBš5x„ ˆLefþ‡ ‡Ì=f-œÈÂ:‡(· Medium ‰— Top –_bÓÑR?23:A3†—@A3Ȳ A–‹ %I¼ HighbŽhÅt?´?%™®?-ÛÓ=Á&ó"$ *äË–@bþ\j\jþ\j\zþ\j\‚þ]j]Šþ]n]ô)   'D ¸ B'DþþþÒ‚Kn0ÕÚ>%§Ô¦>-ž°uW6"&†fvþô)fô)Vûέ'DVR6ö¶ô)þH9Hþô)fô)þööþfV¤Îìr'Dþéjéþ6*þ6*¦6*þÌ&ÌpV¾ÎXþpfpþ¤¤pVRþpîppßïd?-ˆS/µØþpBp 9 R7m"¡3þ7mþ7mþ7mþ7m¦7mš)*Lm š) š) š)"µ3024F?%ð«J?-WóQáSµ3Jµ3Jµ3Jµ3Jµ3J6^)þ7mþ7mþ7mþ7m®7mþm2&m2þÁ fÁ JñµÆú!Á VRÎièMþH9HþÁ fÁ þööþÁ fÁ V¤þÁ BÁ èMJmþ þ ¦ þDM&DM JÚé) þ¤¤ï',Ê-F?%ɦJ?-ÏîÍÚ¤ Vöþ ö I­q?%äwx €ég”"þ x> xøw>N9%0þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%þ9%ú9% —+A«gpªg moviÂW*ŽAZQr©g6}–ΖÛj$.ÓLBü1ä.k$^ÓLJ`XîÓLS’þ”{þ”{®”{Ïk$N³2þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³þ³гvì4µ'RûtÊhþûtþûtþûtþût¶ûtRûtRûtRûtRûtÈZ4º¨3=%%º>-OÌÃ=”m'J'J'J'J'J'þûtþûtþûtþûtÒûtVØ,6&–þ'f'Jñú'VR6ö¶Ô0þH9Hþ'f'þööþ'f'V¤6––šrÔ0'Jmþ'þ'þ'î'JÚo&þ'f'þ¤¤'VRþ'ö'0‹=%Æ?-mžþê«^꫉.·.´fB¥s1­M.R þRþRþR¦R­.*.K>B€s6ý<.àþ)=)‚I þ[þ[®[³¢V3þVÞVøK€? -ffæþ hþ hŽ hš^VB÷@b .¬þõ¢þõ¢þõ¢þõ¢fõ¢“°ã.BVþþþþ®²!VžJÎR4þâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâþâá•-¥¢:&o4f&o0R¯P?%ÚQ?-lÓRÄJúã$þ¤¤öKþ¤¤ã$VRþã$öã$cc %Tp\?-ÿÇ©égþöKFöK  *«[6*³3Z*³°0Nh¼>%Þ]î>-ɆŠôÖ ÿ .² FŠ" þØŠÆØŠ´BþŠþŠºŠŽ - Rpb)N‚ñþpbþpbþpbþpbšpbÄ–=bÉ€2’bÅ€2Á€2½€.\:÷aÛaÌÝrpb0 8<%¦Ê>-{û@iMâç@€Zpbþ\:\2pbþ\:\2pbþ\:\6pbþ]:]6pbþ]:]¹ þpbþpbþpbþpbÎpbþ0&0þ¹ f¹ V-ÎÍ ¯XVRî¹ þH9Hþ¹ f¹ þööþ¹ f¹ V¤Îìrœ1þZjZþû þû ¦û VP4γ ñXV¾ÎXÞ1þ¤¤û þ¤¤û VRÎHþ;µ&;µ:’˜/ þñX6ñX•rû headF%ÀÒû ¡*=À™2&n"xŒúJ‚ñþxŒþxŒþxŒþxŒ¦xŒÞb2xŒÞb&Þb&ÞbÞb&Ù…0b#@?%?-B÷údxŒ@.xŒb$*xŒb$*xŒb$.xŒb%.xŒb%<þxŒþxŒþxŒþxŒþxŒþxŒþxŒþxŒþxŒþxŒþxŒ&xŒþgc&gcþ f JŒ×æ¯dVRΨþ¯dþ¯d®¯d,Ã@?%ž”?-Žä­ŠÚ™þ f Všþ B ŠŸþxŒþxŒþxŒ.xŒVVÎðþ˜ f˜ þžYž˜ Vöþ˜ ö˜ 0•Vs?%êXF?-y˜· Çþ˜ 6˜ þ.(.['2B£"÷:"['^Ú$J\˜~-Vþ['þ['~['¸. :B*1fB*0î}k?%ë…k?-ë{kkŽŠŒŠ€3ç€* êÔ·$N­Œ5þ­Œþ­Œþ­Œþ­Œú­ŒŒ"ÿÁõ*°ËMÁsúÁËšå= Z« Ù,%Ƙ)>-Á…±<5"¤ þÂBÂk’þÒ&D—špì°°n² ¥ Ó<) Labeltext-6™%-)*ÍÑ^¦=Ê6*æhXì,%8*XìþXì&Xì*ùÒà.2.Y(B_[7B,þŒ,þŒ,þŒ,ªŒ,†AcoÅÖÑ´²&Ñ´2`ÖE[))Z“ºïY7~0DÅl?%ŸPº>-æf®á7~À@.’–|G$:Chalk2‚TÞÛ´Û¡¶qN.nFFþ ,â ,`ˆ2BÇFªîilþ=Bþ=B†=B›.®×4Á*£ - Pres4’( Notesnot__V¶×žØ©0 Avenir-Romanþµ×þµ×µ×mjµ×  ?îññÁ£º×£Ä çË¡…-A list}X>e`žm-mAmññ mX´Øü Cr þ þ¾ˆ.®F¹4J®þhôþhô.hô~¹¥jÀ 3þÀ "À ç¡ ó Ø (þb¤-2-*þb Z€(é,$ÅÃC?%ÃÂB?-‡¨=ó ‚ŠõÓÊ0¬‚¦>%®T°>-¼¿Õά ³ þQQ‹ÍþQQ ?þøþøþøÚøþøþøþøÚø/þøþøþøÚøþàþàþàÞàþðþðþðÚðþøþøþøÚøþøþøþøÚøþøþøþøÂø&€€Ø% õ O ¬‚¦>%®T°>-¼¿>5€?@@ -€@2'6=bþQ>QþQ>Q þøþøþøÚøþøþøþøÚø,þøþøþøÚøþøþøþøÚø þøþøþøÚøÈ0ˆ˜ ¨°ÊHelvetica-LightÐØàèò©\0µx»>%¶~»>-½t»µþ€?ÆþúþR>R‚þR>RŠþRBR’þRBRšþRBR¢þRBRªþRBR²þRBRºþRBRÂþRBRÊþRBRÒ R,Ãæ¿>%¸ì¿>-Àâ&Ö ÎØÚþRBRâ RŽ|z u @>„ êþRBR˜ï  M - master slide style -4-(*ƒPZ _ $Çÿ?%ÿÿ?-_ Ð æ ]\Æ chart-4-paragraphSb_14 Q44Z¸ÐA*>Ú:É !)!"- j(@PX`hu}€ˆ ª-¥ :;d4BP@ -«ªª>08°Å" ÈÝB àõø€ˆÁ„ÿÁD°be.%B(=m@HP] 8jÍÌL?pxŠ %ô•W ¨¥l­ÊÐØe@àø¸È¾=WÅ )W0>W2BV ZVJÀîV<è8Bo1$@ -ÔK?þVþV‚V¯U­p²* 6 Caption Red"text-1=ge -$1q ‹EÇBVÇ4q5I?%¼Š>-»]·<’Ç ÚšhAš,%8]šþšYšDÂÈû  'iôu Iœ2-legen)!‚ñZ iç€?*ÿaF6Ëe3~¡ ±V…3þ…¦… }§¾}§2>§8Q6±‘ý, A*GillSansþöNöþ þ  æ.ö.O1>OÕLfOþïþïþïþïÚ.œ.O3>Oþžþžþžþž’žÛ.ž˜}í5>O0qí‹qí°Z”J~”æ#þ½–½‘Á ô.É d[ !tableCell-1-footerRow )*Z4e 0î}k?%ë…k?-ë{ke ,@J €@%·.. Bã1F) ^ ú?`?-ø „~•n è) œ) j„§þ þ † †jÂ0-headfÂ0 8<%¦Ê>-{û@)>f¶áÈQ-^ $Y-kColumnR00±c>%õ ?-ùôN~n•^ÄBbþÄþÄþÄúÄ ì 5—:Ä0zÄJ@fÍ!”¢O Ê P (4-valueaxis- ‚ñ©! €?"R 0‹R ?%Ž6 ?- )ÿ$Êõ8Ä m zŠ `0·$9?%¹*9?-¼!9ò`ÿ €?ªº~[&®@%oƒ:: øB4ȽðA8ˆ˜¨¸£!Æåž . & Link£acter-Þ hyperlink©ZXä./ µ/ 4) Free Form"ã Hdefault F4Z›Ñÿ @A* "Ãºí ’ZEæhþÌrÌ"2 ÌAã¤M㨠Iã$0-series_5%44‚ñŠ 6 *C Àá4@@ÍÌL¿*lineÚ8mMJÚMªð –‘D2¢ Marble :2  B2  J2  R2( ZZX"90ˆ"?%³Ò·>-±l2uê§? $0î”î>%üP|>-$€?!:,€? *äË–@bþ\j\jþ\j\zþ\j\‚þ]j]Šþ]n]D ˜   ¨ ° ¸ =4ÐØàèòr…Cº ? Ö/ú†00‚nå`20І0 @@ ’r0ôE`ÍÌ Àlš¢ªºÂÊÒÚâêD0äÜ_>%Ä0:>-…b…"–À@.–áÒ‚óèަ–RèVûÎEèVR6ö–ùèþH9HèþH9Hèþööèþ¤¤èV¤Îì²Jî ºþéjéÂfxÊfÒfÚfxàèð€ˆ˜ µÿÿ½ÅÍÕpAÚ= V´Î%ê RV¾ÎXò Rþ¤¤ú Rþ¤¤‚)HVRÎHß   ªnS©ó@ ?'¹² ”03/?%z’ì>-äŸe" 2Ø–ât¸ÀØàèðø€ˆ®.ƒ ³ƒ 7 ŽBol³9&…Ô .$] P4v³Jq~ûî þ³’³‰!Hé 0Ì*± ¨ : -5-shap.÷Z‰ )JY)« "js€&  Ms4?08*PZ2RR±ñb NˆF "Ú‚ˆJÛ~‚  + þ2þ2’2€!W¢¹.œ1*œ1e_‚>œþ<&<þœþœòœ à6œ¸°.[Ò $5-category6ú®?K,þ^9^(8MaãeÁr‚~¡&¡–ã! ¢²~[ÂQ$ÀÐØè¶!  üÈýrw3Q»þwþwþwþw–w>w>w>w>w2w4ôp?%•(?-±0Í=$! Átw0Ü=_?%ÍÀÕ>- €$†wþ\:\2wþ\:\2wþ\:\6wþ]:]6wþ]:]þwþwþwþwæw0´è=>%‚`ƒ>-¨¸%þwþwZwV-΋wVRÎwþH9HþwfwþööþwfwV¤Îì¢wVs6ѪZþwþwþwîwVKÎXþwfwþ¤¤wVRþwöw¢ %¬ ?-—ÊÚ" þw:wŠ"9 ™2&³2³"÷ ûþ³þ³þ³þ³R³P¢ Rich Metal :B  BB  JB  RB$ Z" &dtŽ?%…A,?-Ië.?5ÍÌÌ>2@bŠ$jŠ$zŠ$‚Š%ŠŽ%  ˜   w ww þwþwþwÒwjA‡A €? "×¢r0´×@ 0ªr0¸ 00ºr0F`Âr0FÀÊr0F`Òº0Úº0âr0F  0¥¤¤>%°:>-¶Ì:þ• þ• Z• JBÚ"• VRÎ=• þH9Hþ• f• ,‘…?%©9,?-¬ã­ŠÒöþ• f• Všþ• B• ŠÂr¼þ¤þ¤ª¤VVÎðþ- f- þžYž- Vöþ- ö- 0“9?%*­^?-|b \þ¤6¤ ³&_9N .R_9W9-11¾`9ð&NØBb4þ`9æ`9á.þØþض؜!W « Œ 5 z.Name-1s.Z; PZQr&6O–™$ PZ^ð’¼Q.:BFó0þ:þ:þ:þ:f:­"1V©j - F :*ê32e I ` ó8^:gÈ-ªÚ<þ` þ` Š` ¹^ˆ34&—!eM_þþþþ²Øaëj§0Z§.Iœþ§ʧ}È6$¬ imag¡\E ZŒÄKJ!B´–E· j*Jk""¶? ?Â.ƒ2&3BåþþþþR$ ¢ Woodûõïéã, 2@b j z ‚ Š.  *S ¸&S0 ÐØàè þÊ-þÊ-þÊ-ÆÊ-j)J“þS6SFÃþSþSþSþS6SF þSþS®S0žo?%°ò´>-»¹"÷6 –H$SVRÎcþSþS®SþööþSfSV¤Îìrè½Þþ˜þ˜þ˜î˜VnÎþkfkþ¤¤kVRþkök0Ñ¢R?%bï>-Çiô•äþk6k‚g óZA (T ´-0-*T  Z€(¤20¢›c?%Ìüe?-×óh®/¨jH‚Š&kR0µ(´=%ž2ž>-„£ )ê-Âô)þQQø*þQQ ?þøþøþøÚøþøþøþøÚø/þøþøþøÚøþàþàþàÞàþðþðþðÚðþøþøþøÚøþøþøþøÚøþøþøþøÚø*û_þ&þ¸þ¸Џ*û_þøþøþø²ø*û_þøþøþø²ø*û_þøþøþø²ø*û_þøþøþø²ø*û_þøþøþø²ø0ˆÁ7˜Ä7û_Nû_Øàè&û_V56v–5D0ä([>%–ù?-ÅäF"6R¶´þ¤¤´þ¤¤'þRRDþöö´þ¤¤Dþ¤¤û_þ¤¤û_þRRû_þööû_þ¤¤û_þRRû_þRR âO s/þRRû_þRR‰A æøA.´VB,$7‹*Ä"^,$J:~AæÄ"þ´V–´Vÿ*Å'z$a0¾Ä'ˆ¶1….±%*O$º>.#aþ…=…n›Bd€? -ffæëEÚ‰^þ²–²›.`"‚`" moviÄb%RIÕZc ae®J¼B_"–ØB Head@Es˜5"¯#õ*°;5ËbE=":jE Z« &$-0là?%âFY>-˜d<z?Ã3™VÂ6š–ìµjŒEç¸X¯DÕáa0*P Z#" f’E°Ð.{.öB&…AþöþöþöþöŽöÇšYJ|a0þ÷`®÷`©.Ñ.v[1Bî'Fƒ*þv[šv[…Òb6å 5š™°PþÒþÒzÒŸ.W.­B29‰Øý­^VJ/þ­þ­þ­‘.û§¥^S(-0J[(‡v[(Î:Ò[( †!á~NIŸJþNIþNIþNI†NIÊ¥[^êZÙÁnçé —®)notáp list­-i4X>e«ªª?žmaRmAmj mX´Øü Cr ³Icþ¾x>–!(Œ .»*òh: _1F—^eþ(M:(M¥»É+Ä:þ»þ»š»ó’qÚ.ÍK0’ÍK0w?%’{?-•tõ €A46›v ^“ N0 ^ÍKþbbBÍKb[þÍK6ÍKÖ!cQº.P BâOFt^F þ$hþ$hþ$hî$h$hÄ.rVF^V¡"E’">þ¿o¿o+þœþœ¦œ‘ÕdJ¦ 5þ¦ ®¦ ú^ÛBüÊC. ÀA*Ršqþê:êþ:8þ:8Ê:8ì!V±ê.S3þSþSþSþSîSS™![¯QóÄ cLt1r3÷m‚ñÕþr3þr3þr3þr3Rr3T¢ Green Paper :F  BF  JF  RF  Z\*LÖ ?%¡ù??-?á>5fff?bbjbzb‚bŠf%À¤J>-“S6V.–bþ³af³aJu•ƨ,T2VR6ö– þH9H JY Bö–š þöö þ¤¤ V¤6 –š²fê`º Jmþb2þb2¦b2$…¦‡>%ˆ¬‡>- qºÎ1qaJÚÇFb2šþ¤ ¤qaþ¤¤‚Ý`VRÎHþqa&qa4Ùì3?%Ô,s?-Q„?ågWþb26b2¶*~ÍDº šn>w¾2ª-3B²ZXÕ‰þP™P" O®h jV?a.ýC.MþV?ÆV?¸¼.$B{þÑþÑþÑòÑІŒ&A*:Œ0Ež4%o?-Wƒ}—þŒâŒù*wO¢Œ’&ù~´ÝD 8 S‚Number#âD1]H%-.%Iö*wZ(J¶þwfwû~•þû~~û~“…‘Â.z2Æz6¼–¸ ï n¬?, A -333özš7N¶0*¶Zzbà*8™†8Rduþ``t2duý?%‘XûaÁX›fz´![æz.RB˜1FhþRšRþhþhÂh*‰z‘%7¾‘%ÒaÆ1³.õBiþKþKþKþK¦K².e¶Ée : Tü}$ Title 1$Éf*ú&Éf2&Bg^'þgþgþgVg©.L¯)K3 )ESmall)I&q#-H%hA&„y"ƒ€pZ¦†þDÆDþ¦†Ž¦†­¡˜Nó2ÝóIkþm!þm!þm!†m!€?Îó^»jà¢@×zŽZʇnÑ*þòþòÂò÷¢V6±!"Ânþ‹š‹%Vþô‹þô‹®ô‹îñì.1Bìþ1þ1þ1ò1¯Z*‰ƒF6‰ƒ5ôƒCF‰ƒ nÝéAÕÔÚ*Ô5Ô‰# ‚ñ¼þÔþÔþÔþÔVÔ¶~Brø–*ú~ &ú~ &ú~ &ú~ ú~R8÷L?%é“L?-ŠŠL?51»J»J»J»J»J÷k   » 6¤O$ Ø à è þ¤Oþ¤Oþ¤Ov¤O³’€? -T’]‘š†»VÎx6Å–iþ»f»JñÖ.O–Ï»VR6ö–R»þH9Hþ»f»þööþ»f»V¤þ»Z»Jmþ»þ»¦»0Ì0L?%È6L?-Ë-L"ªÎs»Jú»þ¤¤»þ¤¤»VRÎHþ»&»0­¿?%Ç?-e»égþ»F»Š^^0.ñZäþNx&NxVäþ``Bäb[þä*ä–Æ ÷½*q25J÷  eþm8>m8 r‹$al Shadow/å7j NâZ £. .²*Nýþ0þ0bþ¿5þ¿5ª¿5¬Rµ Body´ ´*y´"Ø"µàþ`þ``þ¨€"¨€BJõœ*)îaiæM.®*1I›þ®þ®þ®ò®—.í.q24’q2þ8‘&8‘^q2b—*6–• Bq2b[Âòj>~‹†B 'feÇi¼:B 03Š4%5 Q?- –’%þÎ=ÞÎ=`ò= &éo¢B ‚.4.LšB4þLšþLšþLšþLš’LšÕ.è.ƒÝ‰èþB=îB=„þ7£þ7£®7£œ!W¨ †¨ b&5Bb&Zgþ§ Ч ö(?„.=.îBÖþ# æ# b$þq þq ®q Ë.W.”BE82P4þ/ þ/ þ/ þ/ j/ ª.Àêu"À… 3À8Bxæ &é é§o‹^ÀþO6:O6EÄ&'þ9<oœ‹T&&é§æO¥ ZhºB>ð§"û «.? £)'  9 *Q$r9 1l"3 þ{lþ{l{lþ3 "3 (z3 œ N_1V__0à!b?%ã®`?-ݲZrV_0©(¤=%†0‚>-‰­ǧö_þQQ_þQQ._þVV»HþQQþøFø*_þ§§þøþøŠø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²ø*_þøþøþø²øâ¿þ7»&7»_þRR¹%þRR¹%þRR¹%þRRtAþRR¹%þRRtAþRR_VR69–_VRÎ]&_·#þî­î­_þRRÒp^þöö_þRRâ ¤þöö_þRR‡iÿ?F ¡3-s:¢[2 ¡V¬ÎÈŽj€[N¿#’ ¡ö.“*”¿1&¶ª*…«¯ÀA*⫯"Ž¿þð_þð_~ð_å.$.i"BOþlYþlYþlYúlY SYW<Å * Lettered—"cW-–>jWXeDZ?žlWHNWÈCmHz–¯ÈþlWþlW >È5>R˜!Rm3:_µ1m3^#¹0ÍŽÝ3%†b?-œ,T"Ý7f#¹ö!Á‘ïJëˆ2‰ð….îD.)ÏþîD¾îD.«0Û*­ « AzboxJÄC †º¦€2m0–1Ú® Z)v0a,8@R­Ö„5 o¥*ZÁ1þ8T®8T..® F#Z?;êùˆþêþêÆêþ°dž°d¥!W 7R¶¦ þ¶þ¶þ¶þ¶¢¶>¤>¤>¤>¤2¤0û¶{?%‘Ø’>-y@”&^›aü"¤0Ë/I?%ˆp>-l€¶"†¤þ\:\2¤þ\:\2¤þ\:\6¤þ]:]6¤þ]:]–8þ¶þ¶þ¶þ¶Ò¶þ S& Sþ–8f–8V-6)–ŸÝVRî–8þH9HÝ,:ª]U2.¥-– ÝþööÝþ¤¤ÝV¤ÎìrQT.¶VsâZþØ8þØ8¦Ø8VJ;Î7Ø8VKÎX“Tþ¤¤Ø8þ¤¤Ø8VRÎHþØ8&Ø8¤ŒX•>-•Æ–&/ þ“T6“T¦.˜*>XJ· 2˜*7&â#).˜*"ÍK",)^® Jtþ¿PŠ¿Pþk*k*BTÒ*d*µ.Kãd*:ã+"£K6nK.ù þã+¶ã+JÔ8Ú×m"7Rþx~xï„ü RÚ`4-‚ñþÚ`þÚ`þÚ`þÚ`®Ú`:F˜` RÚ`RÚ`RÚ`E4B›­<%1E‚>-¹£=sYEJEJEJEJEJþÚ`þÚ`þÚ`þÚ`æÚ`þί&ίþ‰ f‰ JñB“ ¶‰ VRÎ1 fþH9Hþ‰ f‰ þööþ‰ f‰ V¤þ‰ B‰ íIJmþG þG ¦G þ6`&6`G JúEþ¤¤G þ¤¤G VRþG öG 0 =%—«è>-K½„ég®<þG >G ”.ü éRü 4G BMÂ.G § P4Z·Ü ÐA*"ßÎ-•ºäÎ"9ªnÊþû &û þÞ6¾Þ6ÓûaZñ4zPÒ0€?%¦K?-VŒª5nsPÁiDB.ÀFÿ 5Ë"ISþ*r̨]bþßDþßDªßD°h71W.5[BÌ .þŸTšŸT%V–þÆ€þÆ€¦Æ€ÈA­N¾83v¾80‹]?%¤ûe?-ÜsfiV¾80°µ2%†Ø>-¦ö£. ö¾8þQQÆ7þQQ.¾8þVVÆ7þQQþøFø*¾8þ§§þøþøŠø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø*¾8þøþøþø²ø&ªœþøþøþø²ø*¾8þøþøþø²øâ¾8JÚ¾8þRRá%þRRXþRR®X–Ná%þ¤¤®XN¤üû %2ªO - 5€? €@2'>C:R²þRBRºþRBRÂþRBRÊþRBRÒþRBRÚþRBRâþRBRêþRBRðR… æÅ chart-3-paragraphStyle_5*ƒP4Z¸ÀA*Helvetica-Light:V0(@PX`hua(}€ˆ ª-bk`è8B +@ -ÔK?08°Åa„ ÈÝB àõ,ø€ˆ˜ÿT °be.%B(=y@HP] 8jÍÌL?pxŠ eÕ•W ¨¥l­ÊÐØeTàø¸Èâ ô.)Vx[ !tableCell-4-headerRowStyle)WZ4 %4îìì>%úøø>-†…?…n(@J €@y@ %å ó k ( l-5-d Z€( g0ìÒm?%íën?-ñèn g<¨°‚Šõ nþ@@ÆþþQ>QþQ>Q ?þøþøþøÚøþøþøþøÚø/þøþøþøÚøþàþàþàÞàþðþðþðÚðþøþøþøÚøþøþøþøÚøþøþøþøÚø þøþøþøÚøþøþøþøÚøþøþøþøÚø,þøþøþøÚøþøþøþøÚø þøþøþøÚø0ˆË¨ÅÊ>u4ÐØàèòn€Ê´úªR1÷¡ >‚ªÈ–RŠþRBR’þRBRšªR–N¢ªR–H®ò–Rþòöò–¤®ò–R®ò–R®ò–R®ò–R®ò–R®ò–R¯òž'œË  ò1-‚ñ°qt?® Default† Fill Center” y&€?#ª?ª?"R-ÍÌÌ>2G18õ , ApAðA¡[PŠ Directional Keyî @?fR4¿€¾(¹¿GdH¿ … %Rîˆ ˆÍÌL†ÈBž1x„ ˆLefþ‡ ‡Ì=f-œÈÂ:‡(· Medium ‰—Top LrÓÑR?23:A3†—@A3ÈB= ‹ %I¼ Highb¬hÅt?´Œhr<# €?… AHB  ¨ ˜ ÈÜ p "movie-1-* "ZQrà!Î* á*N$Æ TFN$13hP*O$ÐþO$þO$þO$þO$ZO$.W˜*¥%2>¥%01V‹¥%°þV9V  $þx%þx%jx%ƒÜ’Î&61)"Î& þ)9)‚Î&o1$þÎ&þÎ&¢Î&Ù¤2 ™2* iÙ2-series(4‚ñû 6 *E' ÀÃ&4@@ÍÌL¿*lineÚ8"þi>i*þQ>QT2¢ Rich Metal :B  BB  JB  RB$ Z" ¸,d >%.…´>-Å5º>5?2*@bŠ$jŠ$zŠ$‚Š%ŠŽ%D ˜   ¨ ° ¸ *4ÐØà èòjK* C` ¤K*ú†00‚f«* `20І0 @@ ’r0ô `ÍÌ Àšr0‡ ð`¢r0k @ 0ªr0¸@ 0ºr0F`Âr0FÀÊr0F`Òº0Úº0âr0F êP0äÜ_>%Ä0:>-…b…až3À2X+\~V0®ô–RôJBÆü+ôVR6ö–þôþH9H®ô–Hô,‹øŽ>%³p´>-¸­ŠÒö®ô–¤ôVšÎ ²c.úü -øc.ºŠ ÂÊfC ÒÚfxàèð€ˆ˜ µÿÿ½ÅÍÕZÚéðVLÎì.ê RVVÎðò Rþ¤¤ú RþžYž‚)HVöÎHK   ªn€é @ -€>áಠ”0·Ý>%Jå ?-NAŽa„2p–zt¸ÀØàèðø€ˆü1¢- Ê * 04-valueaxis_1~ ‚ñ©a¤€?À 0‹R ?%Ž6 ?- £Å΃8Ó2m!= zŠ)—0·$9?%¹*9?-¼!9ò`3€?ªº~[&$7)%oƒ:##>#ÈàðP38ˆ˜¨¸ú![Þ .^B1""ß ^^J¥þ­4þ­4þ­4²­4ÿ.ß ƒ2&ß 3ß 4Q²åþß þß þß þß Rß 8 ¢ Wood :  B  J  R< Z 2@b j z ‚ Š.  *1 *1 0 ÐØàè þ1 þ1 þ1 þ1 þ1 ¶1 F¡ þ1 þ1 þ1 þ1 61 F 1 $Ô˜J>%À¤J>-9BE áOþ1 ê1 0ª’®>%«ä§>-¡¾§¤ÎÂ1 VRÎA 1 þH9Hþ1 f1 þööþ1 f1 V¤Îìr1 ½ÞÂfø r1 b þI þI ªI VnÎþI fI þ¤¤I VRþI öI ,ˆ| ?%0?-ס>§þI 6I æÌD?C6D?5ZD? n,?Œœ Ò œ $1-categoryŸ > ‚ñ®ß&h>þ? &? (8Ma@e¡ r‚~F ÂjDµ@ ¢²~[¡ $ÀÐØèjAD ¸È³"¤ @¹* 6 Attribu®+ "text-14&¼sA-$m P4Z’ÆÀA*H6kBObliqueÞrBæÍhEB,%8*EBþEB&EB,ÂÈ¡.ù.žC09=ÕþÐþÐþÐþЪÐí.H.OBV9Q‰"O^GaÍÓH$H~Gæ‚eA‚þÇD‚ÇDß^BqþOþOþOþO¦Oª.#«©#0/ Subtitle¥ =c© B“B*>7þþþj½.]GV éF]G2-body¥)(ZXG0ë´f?%æbd?-ÙŒWýn,¡%ç&I0* Numbered%¢4-list) uX>eDZ?žmNmHBm/mCz–¯ ÈCr ¤ƒ þ¾x>Èb×lé-V<*   )=4ZPZ¥ å 0( Italic +Z¦.%$  UnderS"(X…"œ#*²{²{P B*GillSansbç7´O*Š C9Š9Z1 "j˜€ˆ ˜D?08PZ8@¤. BolMMZ§.# /  Red 'Zeø4q5I?%¼Š>-»]·<(”.ÅRyZ mÑ..QRóÎóZ—&õºub *ž)ž5Vé"é.~6 Ý.0rí.ã.qêpJˆenÛv?žq½ØAmXa½¢Øa³"0=CmXC °PK—ž&EàWç!Index/AnnotationAuthorStorage.iwa<ú ÕPK—ž&Eâ0Þ¸(%(%Index/Metadata.iwa$%‚gð þUòfÂ(($6045C023-2B5A-4BC5-8F76-B18A1E552682Çô MasterSlide MasterSlide-7"*2ƒ2ƒ…2ƒ2€2ƒÝ !¶ « ‘ ” ¨ ’ ôEº: : PZ¥êëºøôû¥F†—Ñ¥’“ý¥÷Zá×¢–åàâÔ¥q¤Ù呺€­5ZàŸó툑ÿ­§Ý¹¥Ã‚Šúö‚"Z¦—ঠÇö£ ‘·ý²Š™«šåjZÞÁ¾Ï®ô™²¥Ìº‹›òí¯Ä¦ÈZôÑÙÙù”§½’·åóÒàæ¿Z¤–ãÕÅŠÊÔ¤Oƒ÷î塯ú7Zߠ㾘›Ž± Pœý‚¢³òÀ Z§ضơÿޤ‡ ßÙÓ£‰©Ã^ZõÔ®Àß‘¤ÝÉ…½ÁÛVZ¨ºÈ¾àÐÔñ *¿‹©Ï›…çŽ`‹ójÊ5FÊRº³-šç-ªó Ñ ² 1ÚQ 1Ú 1âº-â’%Úú!£ÈùׯÍö€Ð§ÿ¦ç¿¥ìÜZûé¿°úÏÐʧd¬Á‹×çžÈIZ÷7\ûÈ£‘µ‹‘ Š¦Ã­òù¤œ9ZøРÀšá¿³ §š¼£ßùÿ½‰Ÿ|ZóÐŒú©¶ñ×£ò‚áëÑ€ñòâZ¼!¾Xê¬Ú°óþ¸¥{ˆéÌÖ†…„Z¹Xå燿ˆí¤§®É„ö²ð”HZ¾XÜÁ ½—£#«õš¹ä¤8ZöÁX‘™Ü¦•Š¥¦Q‡ÁٮÈ€ï}ZºAÒHâ¾²â¶ÿ¾£œÑ³ž¹‰ŒÚAbùÁ\Á“§¦åßü¢®©ÉÝ…—¾Œì(Z½nXÎòʧ»¢b™½Þ„·¢ŠÆgZ»hÑê’þ•…å ^“—ìªá·îŠB`Ñèj8Fa¿ª-½1Õ^à× )éM1þè © qà$‘: : E¶!HÖÙ‹çõ•˜£#—±Õ¸­‡¯£ý!´ðP–Õ‡¥Æƒæ¥õ±Õ…éßÕ‘€4Z¸ε´“›ŒÊ§µ—ñ…éŽÊZ鲨ÛÚÛËî¤Y׉á®ÒŒ¶ÜZó!cHæõêöîÛø¢DªŸâÄ¿¬ŽïQ·!HX™Æ÷Ù¹š¾ G¨£À¬šëü‰(ZñL”Ì­Œìæú¦ç°÷¿ÅÎñ…Ç»8ò!îP˜ú¿ƒÚý§a‰»ÄÜŽò¼Ž'Z!}dÊäæ®ßý£œ“¥ö¯þ«§Ù0ZðTLÞþš÷‡¼£š«¯Õ›­óË“æTµŒdíóüØÍ¶‡¤q”“«ÄÁÊæ`üênÔ1FÔVâ1ÝqÂ1¤1ÄqºqÊï-Ôºi†! \ØÝ±•ÂÑè¦ê¸­“ÃÐäÊšhZ…¿X›‹÷÷Õ°º ´¹¡©Ì¢¯ÛAZÆ7H­´·áÛ¥¹§v™›’ò‰úäПölꈶ¥–ߑϠG«ùýöÉ÷ש{ZÅRXùªñ‹”ž¢¥¥ù†Êê›¶Ï/Z‡R\ˆ›¦£ÑÁŸ Ä¦¹Åÿ¹¤ŠfZÄHߨÖÄßÎ¥%ÍÄð“žò–šn„SXÕÇÈ€Ó§£¡·÷„žôïÈAZÇà¾óÔî¨Â½¦n¤ûÞ–ïÝ’ö'`ZDocumentStylesheet"*2eCžMú  ‹ ­2ƒ (P`ÈìnÛ4FÛl1Êb§¬ h1Ûê 1ã1ûñŸã2§Ÿ!FHéÿîìàÏ¡`­ÇÛö¼‰âõÂa§¢HÕǼÀ™¹£:µÁøÂ‡®¦¤¦¡HéËøÝˆÒ¦$·Í—ÕÀ‹£æØaŠ\­ú›îÊæÝ À‡õóÒ⼤¿>ZÛaRXø«ÎÑ’„䥼Éó»¡òœpZÙXÿüƒÎ¨‚ö§2¹éÛÕ¾³ªªQZ£L¯„ËÝ–öœ¦Š˜±²¢÷ü÷¼oì\ž·Ñãê“À¤Ø•˺–¯‰ùìJZ §H£ª šóô¡ óˆ›ªçÚ¶Í8Ú§HòÏš¿ôüÔ¡¶›ß凱ÌíTtÁúöÉ»¨«¢°‹¿È´¦Ê„ùf`¥ Ö L 22· 2ö)¼ÝmV±-“q޳ ›í8£ 1«Ž 0ˆ ñ`1ãq¶%ãò p¥zЭ&éæ•‚Ïã¶¥‰¡ŽïåÓã3Z—#ô饨ýÒ´¦€žñ¾ä´É°Îõ\”!ø¯‰ÌúÒ¢ˆ£ÞÎÎûë !‚`à ˜æÎ°Ù­‰§íŒ‘µ´½ØÇÇÒ9¨#@ ¸ÜŽˆù—¹£_¸µëè²Ã¿úZ¾&þÕæ“ʈ¦×±Ý监§æÛ«a¨ðR…!É¥Žý“ø§Š¡¿éó¸ÚÕZæ äø«‰Žªó¡ ‡›ùº¬­µ°Z¨"£ûÓƒ¶æó¦'ƒ§…¸ì‹™®jZ¹&ÃDРì»ðò ½íÄ銠‹Â·¦®!HüÒçèÐü˜§*¾ä¼…Þóýº\Ÿ(˜Þ‰èé¦ð¥ýÏÁ¹ƒêô©ˆ!\¨Ý”¹äæÖ¥‚ŽÑúæ°Ä‡·tZî¦Hìï©Í”¥¡lŽùÑðçúÓâyἦ¸—Ö‘¢ˆÛð¤^½›Üî®Ï“×Z§"£™ºÚŽÅÎ¥Ž£»àýÁ¥ò÷Íošo\æÁ‘†°œ€¦ÇŸáÍ¥ÔÕÉÒZÜ!†L‚îÒ¹¡ëŒ¥Ì¹ñãíáíÙ³9\ì ÅÔ˜³ÿ­î£V½éòòûÔ½ü‚!†í9L˜ò„ÍÌÃï¡Ý“ÁÜ„á—9¥rȃÊϲ±¡Ä ß†Ùǹ¯üä¬Z§#¿Å…åΰç¦[é–ò½‹ü¶)Z¡!öHÐøÜ‰Ý¢ Q¿Åû³ö†ÐS•S\¥ÅÅÜÁÈ¢¾œ³†°ƒˆ€Z¦!ˆHûð§®Êì ¢ß«Ž‚õ¾Þ!ÀýÄDÉò†Æ‘ë§ ¡É–Úðˇ¦§Ä©A¼LéÁŽÌß³°¢æˆ›»°ŸóÕ÷ñqqDÅŽËÂŽ¨ò§‘õœÑÁïÿ˜ý`€!ª‚Ëò·²Æ£Û»ë“­”‡êûÉV™A L´úÄ£‰‰°§¡¬úáͦåÛVp¾"ñ·Ñúÿ“£Â“Ó¾ô­·Ï’=Z¤r\ƒîœ¦ËǨ£æµïÉ£‘äæÖBZ±!üP’¯ÝŒÌ¸§_‘鉵êÃùÏ?Z;dñ½ÃÚàœÙ¥á¥¹˜ õÛ¥|Zš!mðiƒž‹¾‘üݦr‹•Á¡ªþ‘±7Z˜&ûå…Ø˜»Ç¤ Ÿ‚’ýúÒ¥Z(®ºÁ­ŒÑì¤Ý‡óÍÑÀ¢§ÄZë »–×îêªÞ¡€‰í†˜Ò㛪cZ¢!ÀH¿©ÚÌÜ“þ r—‘¦ßÜØÎ¹“a™´ÁXµÖ†ÍœÖ¸¡úŠ©¨Ããô5ZçAKLæùօ󧦈¾å†öǯíÖŽ!1¥!Ü\áøþ­¡þ¥È±¹šíïѰ¤%Z’ÞXÕ–éÓ°¹Þ¤7ª©éç‰Î’ÏGZª‹H˜¡®ÚÏÄ¥P¨•Эç×½á!¡èpL˜êÚÅ“‹ø¢‹±§ý¿ñþ·ƒp9h‰ô˜™ýöÆ¥(©ç’©‘Þ¬Ÿ“`Îï:s*-102½ƒ¡½–tä­Á±Ññ\” ¥™ƒµÑûû: :+ ©ÁÞHèùðຌݥ¢Éݼ¢‹‚ŒE ­L®í»ÇÉç¡¢î€ý¨‘”Êä±ÿçÁÃH“¨šƒƒð‘§¼—Õ çÎêö´!ÃåáOXØØ¡§ÃÂ…¤3¸‹îÏžÕ­ª0Z¯á\ì’‚í°¡©¡ë©×¥•©ž/Zä¼ LåÍÔŠÚÑ Ø“¯Üÿ¯æÍì´pðáH’¡ì™ÖÁá¡O‘±›Âþ˜†ì¾ò\ƒÝ³Ë¼²¤¸°‹Ç¥ˆýÈÔZ«qHÍÙ¯ñ´ìâ¦F‰·ÿ£¤¢Ÿºä!àïÀ LóÉ–ÁÿË£¢ÕžÏªÉñŠâßÄUª9\‚¬ìÇ»Ýì¤í²½ƒ²‡õ¸3Z¬Hú·ôúמ´¤×¿Õ¶Ç®ÛÜœÆæÆLëÛÅÁ™éÈ ³†—íÉŠŽ¯È¶r®!SLÓ³ŽË©—¥¢–»ƒ½ÇÁöÞÆó!7ñ© hòÿÆä‚ÃÖ d½í¾Ô韩‰=`¤ ÷íù6‹ åùE<åÌô* °áɃ %  ’ Ò2ÓƒUPåùø H¤Xƒ"iQA ‡ X© aŠ 8Œ1hÔËÐÃÍþ±¡†¹¥ù®È¼º¥!‚È^DÐý…”ÕÁ¢o€«ýß³°öûÁ!I`´ù´„¹ü¬¤¢«‹ü¸­ÓàÉ9Ë9ð逦£ÏýÛ¦¸§¿×¢˜ZÛ™ÖδÈéÉ¥+…Öþêßüå:ZÀ‹¨ßéûõ •§‡¤­Ö˜°Zã©è÷†­Î¢W†ý〱𺻉Zä¶Ç´«»§‰ÿ­ºá¦íê‹û8\˜Á±Ùë˜ò§õ†™Ø£ÿ–¦=Z›Ä¸ÏÚûñýСÅùœâÒë¾à9úAcHêþÁæ¥I—í•€þ”Ó°Œ¶!D—’˜¥ãœ¤èÅÈí»šìqHÚ›ŒÏÓÏþ¦ ¦Ûڨȋ´ÖAaÊ X’ڥ͸ò¥¥{“§²Ÿœíž¢,ZæoDõð†‡˜þ´§q±ãŒÇà–òe_î\¤²¶Ã ¡‹§ÕåÒŠ†¸Zò\Þ—ëϯ¹¶§±ù昂‡ˆãZŸàLÂÕÄ’¹›§¢¹¨¹„°ááƒÏí!ÁÜ!úHìš²ÇÓ˨¤Ã¬ßìÇø‡”Ü ëÅHµ™ À¶²Ã§3‡ëÃÅý‚í×¢9‹aCLÖàà–³ˆ¢¤ÌáÓ˜äô•õÓþp‚Þ±À¹öš¥Š€ÍÜ„€µ©óvZÌ!ßH’Ô”º†þ¥/ºÙ˘²Ì¾ã™U©«LÌÒÆÍïã¦ï¸Õüù±ËÝ!7÷a˜D…õÏ·éï°¢=•í°Ü¢Åæ÷5!ŠDϸšéöºê¤t´£‹õ؇ßÕˆË!\󸑶òù…¤ÁßÔ°“¤únZü!ŠDãºÔèãÓù§­µì¸ÊĺÑqþü\öêÚç²ñÑ£ú¿‰ŸêÞô‡‹rZüHìĿˮâ ÌÍϨ÷“â£xý!QLÐéãܾËΠЭ£óè˜úÙé¿àŒ!5L’­ï‡ÞØ¢©±‰‰ÅÆ¡üû!5É©­¿‚âŽá:0¹ÑÛò½ÁûÊpZ!QH¥úÉâ–œ 3éë»¶š·½ò!ŠÅð„Ü—· ’ú¤"¢»®±–ె_Z€¹‹¥˜ðÇæ£ …Á•Ÿ˜½éÀoZé¬Ý‡·Ï¨Ï¤††¡å³ŠÂí±nZËäê¿Þ…±¥ µ×õ„¹¦å ¶ZÂóý…´ç”ò£n­çÌ…´ñÌÿsZƒ¥H¡ÓÞŒí Æ¡Tˆ•ƣ䎺™Ì¥Xºçú”ÑŠ¤¥£“ÞÈ™ñºAô»!½\¼ð’¦š€Š£‰¶…ƒ…§Ë¢ÑcZÑ'X«ãÒܧ¥ð£*›•ÌÂ¡Š¤êZÈ÷¨ºò標õè£4™Ýö„庢` "üTables/DataListùë P`ç:2602.Ô:rª­Kì °>6¥ÃPZÉá¥D½°øÕëž“§"²ùÑù¹èÑh “A.‚¹§˜ë²Øå¥Å¡úСÍa€ÈáùH¡Þ¬š› Ô¦j©ù­Îÿ–šßüAg–9ÿª‘÷쇡– šƒöèÞû÷¬”LÑíå¥òŠñ¦ž­³ö—¦½ö·!§çadX–™¬ ØÍ¢ ¼ÃÆÖ›„‡¼4ZÇqHý’¹ï˜Ú¡R…ÃÏÍÔéè¤7•!ŒD—¡ã¿†þá£w‰Ýðñ‰²¾áùÆ7TÈéø¾Ç󤀠ƒžÎíøŽ”[`!„î:„6  6d  2Ñp >}«-•’Y>˜ 1…ïÍ¥TÒ˜±À³Åô§©´Óêüº†À•SZ¢TªŒò…ÓÇ´£¶›ç¾ƒß•êû×a´Î9H”äüÀóꔥâ–îš«š¥ßÓ ÏÎè÷µ™á¦„ ·•½£©´õ*Í !1Hùª®Ü®©¤:­Ç¿ÁýÀÄÅ @¹úÇ €¦L“»ÞÔÍΠ¡;™"H·Ïë¶©Þ‹¢IºÅñо½µÄ!ƒ—7X‡ùæùÃÚ´ ¿Ñž –åÜOZÌ L­•”ý£§ž£¦ŸÛ¥Áÿس€¼T ˆä:„23ZQ÷QïbŸFÿ-«^<ÈD§¼‡“¡×æ£3´ÇžåàÞÔúå©AºL­¤ÄÜœÈê¥Â‘–„ˆ•¼è !äAºD½íØà…“”¥e§ÓÏѦÜÖÒ!mÓacXÔÌË€¦Ý‰êïÒÛ÷þ?ZžSL½üÉ›Î禤ì—ÇýÁøÂþ’SÔ8X‚Ë«òÇÃö£ÑÌØ£ÁýÓaZœ8HÚԔͪ•™¤õºÓºŒïº—‹Ò8XÝ٪ı¤½§Vº©ÙôÔç«ZÕ!‹L¢Å…ßÕŸ¥ê–ï‹à¨Û‹ÔÓ!‹ ÿën‹6kJ^ø®!ƒXýÉžÞ¦ú¢³Âˆ¸«¹Á&ZÃAÔ\»äӳұܢö±ÙâàúÙ’ŽdZAžHèÿŒÅžæ—¦KºÑ÷ùŸ³Ò³§!K’SH–镬óÀ± m”ý«ƒ†ÇùÕ ï SH—œõ ¯ŠÁ¢µŸÅެ¯º»¦¬Â!/H‹Æ’æÛÙ࣯Žï¯š©Ý£‹˜ ‘pD‹ü˜ÝÄÍá/•ÁóÈéÙÍ¥e˜ë‹ H‹Ó˜¸ ¦í¢½×¿€¼¹÷îÇŒÁ!ŸÈ‹™œÂ¤û 𭼝²Òöt`*úAnnotationAuthorStoragey ÅA Éån®902AÂ9Å:9ÑI‘Ü‘w&WæûHèÚÝæ´ÑŸ¥¨´Ÿ€†Î¶Žù]Ã!3\ÛÚÛöü§æ¹ÕÑÍâÕÑù6Zÿ!ˆHÓÊ÷ìØ“¤y­ÿ–ÍŸò§‘ßç¿8šáóÿè…°¡0µ¹‹ºÌ¡êYZ!ÛD¤ÿí—¹¸”§¬íÀÙƒ¥éÏ Áa&LÓæµü¨ö½§ñ딃¶š˜ñ!‡€8PòËŸÎÏô÷¤(«™Ç´ÑÜÇÃZ!X`ÊóË’éט¢‘Éņ£¿ðâ.Zþ¦\ꂱ£æÙ¤•ˆÝÌú¸ò¤ÁgZÂoL„ÄÜ«˜Í—¤¾§õ‘³É‡¯¥AKÀL‚Ìæ™Ï—סì·ÓåÔ¹…Ûùœaz ðö6ÌZ½³>þ^s1ryv`‰“£×·Ðø£Z®‡›¶õô¤Ÿ%Z±!tHáúûÊš²”¤ÙŽœ¦é×ñí³!<°¨Ó»½—†¨¤x…åó“Э‡“uZ²ïÄÓÂ–ßÆ£“Ù¡¡Øðܤ%Çë!=\¶ÄÊû¼ÍڢɒÃö¢þÅÁ×:ZêHåä칆ۥ¢£õã²ÆÀ¦ÖÜ!«ía2DлŒã؟Τ?·¹¤áé¨íÑ!W`ìüÛÝì죊°«¥å´á§œA7°ŒˆÇˆåÅà Ï‰—¥÷®Àû¥:`$ûCalculelEngin=xee‡Ø•Ö½oN½Û55r‰L2390_2880x1921-smallô8Â7-11cXOÚèSê¯JwPQí{SÈÈ) ßuœ!c2=c -79ohT=dG9¡~‚,cÐdc¶¨Ç¦1P˜}jgreen)#!a8PhotoPortfolio/>*l"KJ›¨^Ô§¦ PLk8@H ÉA,med9iWh:ß l"RTÆqSòç>ª>€µ÷Ö)¬Ç[MJ"~¢xay"…”—®.q™„¹REÉfƒª„Q53v(016_981x654=¶6º5-14%t/·êi¿á³&êNåÞâÐ_ìst)Ø st0-3111hPƒ˜ÕúEaÕ>L|‘qƒ¸?o= red)®!v pred"3RÕ¢(ðºú“ãr{„ü£u€2ísA75]7 -82‡`3QU2v[âÒf¤†~]>3“545 -8 ¼hy žtø‘VñöïMͺҙaÊ,M£ð.¢? ×iÜvë.ªd"R±  ã¶(è»Jæj,.Ю6Wî2D blue azD)d"Vù)cQNgË] Òª…leIáò?2Myellow V$vŽ +d"3S˜j÷X‹È÷f^VÀ/Ã.hÇ!\6=\ -83%‘d/Û-ÇJ…ÉóE´´ùW0áª7åjqAI)€ st1-47éd‰ RO(‹ÀÕ—¡ r”wú`?²9zº02{}vºN7-1IN`OM±Qäácì‘À—­Þ Ù2ñ¼œ’[W>èº)Kbè#d"3TQÛæ,‡6*˜®Ä„aßÉkE©!C7=C -8AVhg"V™!Ê„Mk{Zýç €a³@£n02ÐpurplM&zÐ +d"} ɦAas]xÙVá¾Æ°Ä H‡Îzä6# ÷Žä68*ð+,2:@PK>—ž&EIž.£--Index/Document.iwaPK>—ž&ER΢Wÿÿ]Index/MasterSlide.iwaPK>—ž&EeLg  Index/MasterSlide-9.iwaPK>—ž&E¬x†AAÎIndex/MasterSlide-2.iwaPK>—ž&E§‚ÇFFDIndex/MasterSlide-3.iwaPK>—ž&EÁ1pp¿ Index/MasterSlide-11.iwaPK>—ž&EÆõç))e%Index/MasterSlide-6.iwaPK>—ž&E 4BÃ(Index/Tables/DataList.iwaPK>—ž&E©JŠ  )Index/Slide1.iwaPK>—ž&E{d õèèM1Index/MasterSlide-10.iwaPK>—ž&E_;ÝI I k6Index/Slide2.iwaPK>—ž&EøxÒÏÿÿâ?Index/MasterSlide-4.iwaPK>—ž&E¼­Yç++EIndex/MasterSlide-1.iwaPK>—ž&EJ[”­­vHIndex/ViewState.iwaPK>—ž&Efdw5TIIndex/MasterSlide-8.iwaPK>—ž&EðR‘MIndex/MasterSlide-5.iwaPK>—ž&EšòߺºÚQIndex/MasterSlide-7.iwaPK>—ž&E_2Ù5œœÉUIndex/CalculationEngine.iwaPK>—ž&EÅqçÛ……žVIndex/DocumentStylesheet.iwaPK>—ž&Eñoí¸¸]\Index/ThemeStylesheet.iwaPK>—ž&EàWç!LêIndex/AnnotationAuthorStorage.iwaPK>—ž&Eâ0Þ¸(%(%¡êIndex/Metadata.iwaPKéùMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist0000644000175000017500000000042312502366750031116 0ustar jnthnjnthn Template: White (2014-02-28 09:41) M6.2.2-1878-1 MoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier0000644000175000017500000000004412502366750027555 0ustar jnthnjnthnF69E9CD9-EEF1-4223-9DA4-A1EA7FE112BAMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist0000644000175000017500000000052412502366750027265 0ustar jnthnjnthnbplist00× XrevisionVlocale\documentUUID[versionUUID[isMultiPage_fileFormatVersionYshareUUID_'0::6045C023-2B5A-4BC5-8F76-B18A1E552682Uen_NL_$F69E9CD9-EEF1-4223-9DA4-A1EA7FE112BA_$6045C023-2B5A-4BC5-8F76-B18A1E552682 U1.2.0_$F69E9CD9-EEF1-4223-9DA4-A1EA7FE112BA '4@L`j”šÁèéïMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/preview-micro.jpg0000644000175000017500000000262112502366750025626 0ustar jnthnjnthnÿØÿàJFIFÿá@ExifMM*‡i - "ÿÛC      ÿÛC  ÿÀ"-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýü¢¸}ÛÆ2x’IõÍo@“B’ftŽ;i#»Š2Ô,_a`q“·¦xôë>Χþ_fÿ¾×ü(åOìËÿ?³ßkþ}™Iâöûí€.QTþ̧þ_gçýµÿ ÏÖµ ´©Y\¼ÁÎí­Œ~ñgÆ¿ˆ´¿Ú{PÓü)ð£EÖ| ×PÆÚÔ±ƒ<Ñ4CÌr|Á÷NT ‡"¹íö¤ý¥ßÂ:¬º‡Â}:NÙmEºÈÁ%Ý!õç!))’zR|~ý‚>%üDøáâ­oCøwð·P°Õ5C=µÍü׋<ð’2Óì˜øî®*®­ÿæñÜ.mô†¿ ?á:¾!Wš÷Í:ŸŸ™¼ýþg•“ÓïW/öÕh{«šVW÷µ³ßç×ð>r|C„¥å÷IÙ;Ï[7¯Ã³¶¾¦†£ûP~Ó#BÐßHøOa6¥u͘Ì!NV$\N1º ®N_‘]‡ÀÏÚ#ãŠÿi¶Ðþ"ü>±Òü æÝ¬¤Wî$TV0’›Ï/‘´cÚ¸ŸÁ=ü{áŽN­eðëᕞ¦kqÜÇq·†x-’|‡\ÎIp€•?7Q^_ð7þ 3ñ—ÀôoÄo‡`²Ó®çš{¨µI$–EhäUù6c«¯@=ëßÉêÑÌèb%ŠŒ(Ê)ò§Íy^ïKµµ’Z=Å"ÇÎté¼¾ÊR³w—º›^ö±[]ýÛŸfhÞ6ñ$Öþ7÷ÿkJ/w@ªf‡t{U¸ù Fî3´ó]gÁ]cWÖàÖ[ų¼þ]ë fh¼½‘‘µ_zü»Òÿà‰ìí;ÿxFíÆ>w×eSÓ¦@ÿõ×Ú_ðIØ›Çÿ²…üoiñ¦×O†]vöÚ{D²»7 8Ý[q c–½+ä0YŽ+V4êáœ"úÝéø/Ìýk:Ἧ.ÂN¾2Y«Z)+»´­7²×cíº(¢½£âBŠ( Š( ÿÙMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/preview-web.jpg0000644000175000017500000001765212502366750025304 0ustar jnthnjnthnÿØÿàJFIFÿá@ExifMM*‡i º ŒÿÛC      ÿÛC  ÿÀŒº"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¾Zý¤?i+_„ÌÞ,Ó®5csi¯êK+ë7VYǦKkD#XáÅÆK,<6xÈÐmÿ…æ_GñkLñw‡%ðÕæµoÞv£=ž¥™9I¼à…’P…dh—%A#'iÅ(¶O2>¼¢¾pñŸí?ðkÀ~ ñ—â«ß[Oᕽ{³æß˜Ùí ¶¸–(˜I‰$òïmÊ å·3´×²Z|*Ðï¬à”C¬F®¢@ª]«&yÃ/›Áç¥&­¸ïs«¢¹™>èrɹãÔ‹p?ä+wÛþÚÐ~hgncÔþ^GüMnøÿÈ´†tÔW2ß´7”»G©n=ÿµnÿøíð¨´2TìÕ>A€?µ®ð?6˜5Ì·Â äfhõ"ÌrâkwÏþE¥ÿ…G¢yŠÛ52T`gV»Àü<Úéh®`ü Й˜˜õ2[9ÿ‰­ß9ÿ¶´­ð‡Cy7:jdãê×ËÍ šŠæ—á.ˆ²‡ ©îΫtö­5~hIÒ=OŸúŠÝýç­tôW2~èfBÌš™cë«]Ÿý«Gü*yo/SÉÁÏö­ßoûkHšŠæ—áˆŒÄ&©—$ê×g¶?ç­5>èQŸ’=Hcþ¢·üv€:z+šôEß„Ôÿx0ßñ5»çÿ"ÓWᄇ)¤ý…nÿøítôW2¿t59Xõ0rOü…nûÿÛZÂ- Fë³SÃòÙÕ®É?›@5Ê^|#Ñ¡³™¬›V¶”#–=Zè4g0̘㯵™¨Á5¾kZ–¿7ˆÄú…¶¾º®ë^F´°—S9¼šÖ1*GéNp2I>«ðÂé#Óu5€ÿ‰Ýð÷ý«¤û|?ß\Íl+&xtðNŸ‡W:M­·Š?á"×å·ñL>1{½OT{‹››øáŽ Ë&ø™!Œ4_tí`^ïQ}º/ïŠO·ÃýñI¶÷’&¢¢û|?ߟo‡ûâɨ¨~ßüô}¾ïŠšŠ‹íÑ|R}¾ùè(j*·ÃýñGÛáþø  ¨¨~ßüô¿o‡ûâ€%¢¡û|_ß«y° à“Ò€%¢£–æ8[°óŠoÛâþøü¨j)r‰va´ô>´ß·Cýñ@ÑLŽá%RQ ×Ú™öø¾(o¿ãÊo÷ùV'ÂeÙð¯Ã#¦4«QÿRµîÒeFùmü«'áH#áw†·äŸì«\ç¯ú•ë@yã‹xü0ñD_.Eˆg»Õ"Ón6#ù3p¶O‘¶ä75äqüJý¢mõ›Õ›Ã¾’ÒÒæâX6ÏÿhƦ_*0þj˜•ÈL¥‘v,KëºÕñÓôéw`Öµ.ŸõØW9?Ä}6ÖfŽëTÓ¢‘ÖGºEe>„Å;_`Jç7Ä_ÚTÓ|˜ô/é·Ïo+3‡H±f%I|ölÉ(!³¦Ò7±!v'K˜VKyRHÜe]r°õu¡¦· ïü$Gûß­ð‘ïW›ÜüDÓ¬§h¯u=>Pá’K”VSî ȦÂÎÒOüÆ4¿ü ÿŠ£•ö™éð‘Z?á"?Þýk·ñLw¬¶sG4N2¯VúÁª“üGÓmfhîµM:)á‘î‘YO¡ñE› \ôŸøH÷ª[tÏgïJ£õåÿð³´Ÿú iøÿ[žñjþšmåIcšxö²0e`XràŠkp±è+ÕMޏëœf5?γ¿á"?Þ®[ö˜Õµ]:×UxZ:[››ZχØ[w ŒçŠò‡ÿ~ ÂЛFñŒzþr;j0ÝÆnÆæÛ´3ÉAÔôÛ†B>˜¾Ôü¯ XMŸ¿+ìÕÿ þõPñ¤bøU£Ì˜Üòœ}põò½¿~9jz8¸ðúéW–Ò¬14˜²{»yDnn|¹ .¾jˆÕIÜ£HqI°>ÇÒ53w¤ê¯ŸõpF¬ÿøH÷¿ZÃø5«_j? õ¼L‹¤ºlF탛Êbààá³ÈãÒ¼[â'Ä?ŠF¹p¿ |9§kV‰q˜ÕÄpG,-@o08u”\î%qµ“ºÑšn¯öÛ囆WÏ?ì5jü*~øl*׿Åû•æ¼söjñ_Š|I¼ß,tÝ3S›Í)odæHÖ! [{Å·œ€09ÆO±|(]Ÿ |4=4«QÿV˜ý§uÉôƒ"¹Óå{{˜n5ç†EùZ6]ÅXPpA¯ÂïhšwŒYÝÈ\H^_—;Y#\ ’e£ñCá‡| á»Y´‹ýZñÆí;ÊFkhÀ ù²FìÚ@ݾ¶¸ÿ‚KøRYXÇ®ø¹9U6ñ6ÑéœÓþ )áTMÅÃþÝ¢ÿâ+Ó|KƒræöŽÝ¹N¯í:7¿3·¡ÜþÀ~:Ô­ÿàœÚ³›ëŸ´é‘jég)–¶U™ÁX’=+ó·Âu‡ˆµæ_ÝÜà ÛÏpó©G‘äHž@¤È@%ÊíÎs–kõcá'Á-+àçÂ4ð_†ìõ ô’’¤æáXÉteϘÎ@œqŒ W‚ÞÁ&ü%=Ìg­xºK‘y1¿–; Å2qêkÉËs¬.¶"sºSwZzÿ™É†ÇR§:ŽZ]ÝüBð_‡|7¥¤þ×$Ô¦’äÛ5¼"²‰ÊY‚¤ÊЏêR\ãhÏÞŸðIß_Cû#ø†+‹¹Üiº­ÒÙ†r~οgð™è7Øõ&¸Áÿ•ð²ýÝÅÃþÝ¢ÿâ+Þ¾| Ó?go‡'Ã^ ·Ôî-f•繚é Is#€¬[6¨ÐSÎs¬67 ìi¶åtõV n6•j\‘wwì~^x/GÓ¼{â«ù~&ë²i±d¼žúE7Í!‘<»å½öžGGñ öuOøbûT>)ðÝïÙ ¶qËþ“:ÊAVUm`sß è úÃXÿ‚QxCPÔç›OÕ¼Ye²HÜB ÎÐÌ™ t皪?à’ž?Ûþ.ϯ٢ÿâ+Ô|Kƒm56—nS¯ûNî¤þâïüóÆºŽ—û|LH/nû2k™l¾sþŠÆËvSû¿0 Ç~kàV2j® O=ËÏ#e˜õ,{’zšýZø û6èß³÷Ãkÿ xj RúÓVy$¾ší ’äºl í(Ú0¯½ÿ‚MøJ{©ÏZñu¼,Ĥ^LoåŽÃqLœzšóð9î†'RWJm5§c›¥N­I=›ÓCàû»± \¤`ºäa•²:v5ú‰ÿCñ-ÕÏÁ{;=Bâi¢µñKÅnŽÅ„(RÚ¹è73z“^J?à’ž_»¯ø¸Û´_üE}Oû ~ÏV¿µ Ã_-µK‹hµ·ÝÜÜ©/#dn‘ÈTUAÞ£=Îð¸ü7²¤ÛwOk Ž¥ˆ¥É î{ÏíG$w^(’Æí˜E{¦ù/´àí}êqï‚kÃ>|$Ó>ënÒ¯¯.e)6|䈒o'ΑP;n6ñ¥Š¯Í€21ìµõ•õ§ìo µ¸’Òk1•#,»ÕØ•$t8 ×’-íÛ° mtIè,Iý+ãO÷\­Çìë¡yå¶\Èc}¬Tá–PpGCï_+Ü~ÊúmÅù™!¶’òc1Š£©!FÞP’¿.6’ABÉ÷Iô/ìÙ¢êW¿ |ZòZ\!Ô"1ZùŠSÎaƒ·=²Àg¥xœÓßZJÑ\ÙÞG$gk+BÀ©A §ö,øYaðoÄÙ:§¬jV÷"Ys¨\ Z° ˜*àt  ô×Â…)ð·ÃAÉ$iV “×ýJ×ϳE­þ£ñ)'6·"ÖÒÖvšVŒ…LÆT ‘Ô“Ò¾„øRø]á¯-·¯öU®ûÃÉ^i‡Så¯Û{öðÖaïiÒø#AÓõKľ#Õc ¨3¬0G¡‰Ú„3óW€0z×Ìÿðþÿ‰™çÁÞÿ¾nÿøõ}wûWüøUñ¿á[IûWx…<3a¢ø’ý¬u/íì™IHh}ÁGË‚~Lö5óPý‡cu'_Ÿú˜¬ÿøÍ|¾h±ÿX~Æ´c,›Kô?8â(ç_^“Âbá vV‹”SZk£]îs2Á|>&(|àNÙ»ÿãÕÿ‚û|Mÿ¡;ÀŸ÷Íßÿ®­¿aߨ߸¾6Éÿ…Ÿÿ«žÿ‚|~Èž3×ítÏ |d¸½Ôo¤[ÛÇâ+"ó9èª<®Xô½p%š7eˆþ¿Èðã$“IcáñÇüŽ-à¾_NsàßcÝ»ÿãÕ»iÿ©øÏ{áYuÈ>ø,é0 ’KŸôˆ¤²‚œnR¿\¤gÑ>%Á?gŸƒ,zÅøÃ¶3H!ŽmCXµd|gj–„n8ç¹{Ù3öKÓm¢‚Çãö –ðdÇü%¦$É q‹o, ôêê*Ý<Ò›j­tŸø’üÑ»¡Ä˜y¸b1±NÛsÅ?Æ;6ßð[?‹÷Þ ¸ñŸ¼ &•k#E,Û®AF]™ùLùly‰œgçOÄ?ð]ŠžÖ§°Õ<àslÛdØ×. àMƒÖ»3û1~ʈäŸÚýU±º1âK5ñÓtb­øŠfû~Éÿ ÏOøFþ•K_øá•ï­¯î4Éí­­tÓ¸yVG#Ì,©µ#Vfù—Œç $Id6]W,£^½¶Ö­ëÕ£ƒ‰3ÜÒ–m_‡­%ôKEnTÿàŸWÉÿÜøÎ˧xŸú†ÏÿÉÚþÌßð[‰^=øùá/üLÑ|%q£x‡SƒLŸì6³Aq"Ʋ#4̧i`H#‘‘ÇZø×Å¿³þ§à½U¼×5!F”[ÜD^EfŸ1DÌe s”$Æ›û)ÿ OðØõÿŠ£MÏ?Ò£¯B¾G•TÃÔ•:1Ñ=Rò<Ì?ç±4¡V¼µ’Ñ¿;¥ÿðU¯ø)÷Œbω~ð¯Á½'A¸¸Ô´Óª]Ýê‘I0 exÒ8Ñ1þ­‰bOPë_(ø/¿ÆÞâ]ðÿÿ—ü“ZðplŸñ— ð¤_úUq_GÝuú×òVqšâèã*ÂZIè—¡þ‡pw eÌ› ^¾2œ•ÛjíêÏ·äÿ‚üümåÓ<ÏýC.?ù"¢ÿ‡ÿ|oãþ%Ÿùÿ¨eÇÿ$×̺_ìáâé:uß„%Ó5_íÖA\e‡pR,Á3̈¹]Ãsži5ïÙgÆžÓ'¾ñ&ŸogiO)‘î£o3k`„ Icü]>î qÿhæv¿´•ký\á«òºïۯݹôðÿ‚ýün–Ó~Ÿ¦™qÿÉ"ÿÁ}þ6œgLðÏýC.?ù&¾k¸ý‘<^ºÁ¶ÒF“©B³æÚù HåÙ6°l0;£cù¼Ôæ9 BAǨ©ži˜ÓøêIPánÄßÙa©»v[zŸ©ðOŸø,GÿioÚOLð'ÆÃ?`ñ ½ÊÁs¦ÛËo-¬±@ò‚ÁåpêDl¤`H9êèO•Ùð»Ã@öÒ­G\ÿ˯Ãßø$;ÿð~ÿoÏÓì7û…ð£hø[á¯$–Oì«]¤õ#ÉZû^ÅUÅáe:Ò»Rk_D~)âVU„ÊsJt°tÔ"é¦ÒÚüÒWû’?8à¶ŒãÁþ¤-ñ¾ûAã>d8ãÔe‡ã_ |9Ñ4oø­¼{¬ÿ`ÙyËp!2îcjcøÎæ[ Öxâ»7sBΧ#|e°Ã zá— b¥$ï¼›ÿ#Æ©áÞcVQiÒŠòrýcþG†ÿÁ|¦y/~,®Ì¦Îýö’H-›n~µñ_€<àïhVïâŸ6ª8šÝ Ê*¯1²¹á‰Lç8Æsû/ûEüøûXèzuŸÆÏø£PM.V’ÎXìæ·žÜ°‚ºB¶ÕÈÕú´ŸðK€«à/€g¼ú|ÜÖ§‚?àœ?<â­;\Ò¾øÊâïKn­Òì]Ï‘Nå-6†È®/õg&¾èåú£È~f”…š»Nmþ(ð¯ø.…ž±ñ÷á]ŸŠuÓ´¹tû‘=ÆÃ ·S2np¾¼ò+ãƒðûáÄ6²Ë7o%q0DŠ=0«'$œrÇêF?`ÿiÿk+ 5>7x#Å„šQv³ž+Iíç„0—|d­µ~SÜz×’ø%—Àßþ/üœ`Íy“ô«»0ȫⱭV¥Ý»ì—CØÏx3˜ãëb©{7´×3škÝK¢·CóZËá·/CË©øÕìa{É¢€ys˜R«#ƒ°ÁvvŒj_èð÷ÅχŸ |Ass?ˆ,LÖò¦Ém146årÅǶ;õ?¤‡þ eðh-à/ˆ#8óï?£ÖßÃø'ÀÏ…þ2Ó¼Gá߇ž1›PÑ®âÔ^ «ˆÒU «ùLØb§d‘í\á¼Jjü‹mo+ôò<Ê\SÕ$®Óôkm-ý|Ï•?ààÚCÀùó-·þ•I_ XkZL¡ô«›‹Y;á‘£aÁTç¡#ñ5û‰ûSþÌÿ kçÒî>5x?Æ77º:²ZÝYÛMo:ÆÇ&2ËÃ.@8=Ld×’?üGà")Ÿúróžþ¿ r^.Á`04°Õ£.h«;$Öí÷]ÎÜû‚qù–aWBpå“M]´öK³üÏÉ+­nêþ8âÔ.n&XP$K$¬ëŒà(' ž­w_²k†ý©¾ƒÿC>›øÿ¥G_¦-ÿø‡æð§Äâ}¦œÿJé~Á7¾üñþ“â¿ ø+Ç—:ž‘8¹³Âyã†U?,†>*yÈ݈ã|¾¥ÂÚkeÕˆó°¾æTëÓ©9Âɦõ{&¿º|oÿ7üe÷†2:xRÿ“W5ð‡˜qƒøœWï'í_û%|-ý²5m.ÿãoƒÅbñS­MÆÒ}[ÿ#û_†|HÊòŒ²† óÁYÙ&·{{Ëò?bÖn­ÀX.ghÂ…•†:0}‡ä*ÔÞ.Ôï¡’ÝSR–)êFW·r `óÏךý{?ðG/ÙíUü"?þ~qö›Œ¯PßðGÙñናÚâãÇ®/õSüÑûßùãñ_#zºu?ðÿòGä>"Ômc1Z_ßE–%áÕIln88õÀÍU__ÄóÖ¿b_þíû=¦sá/Šéqp¥:Oø#¿ìúGü"?ÎñÚæ~8îqKýTÆ¿µ½ÿ/2E´*à1ÿäÏ‚àÌáá÷ö7üúÿ ÜWî'Â…Ùð·ÃC9Æ•j:çþX­|×û>~Àß?e7оxÇ7$ŠÞ[{Io¼Ù¼‚à«yfB W{tò9¯§ü¢Éá¿iuÑS-…”6ÎT䑪œ~Uõ™]S,úUZ»wÓÑ/Ðü›Ž¸‹ ÄÙ„18XÉEAGÞI;¦ßFû÷5(¢ŠöOŒ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙMoarVM-2015.11/3rdparty/libuv/docs/src/static/diagrams.key/preview.jpg0000644000175000017500000032170012502366750024521 0ustar jnthnjnthnÿØÿàJFIFÿá@ExifMM*‡i  ÿÛC      ÿÛC  ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯¾#þÛ>7øùñJóÀ?°Îdæ;ï] x ]7Š™`ÅùÚ½ ÷Û/Çw ¿eÏêúS´WPé¯2)ÃDó °> È÷ÊÿÁ7þéÿeO¥,mwâ(Ω{84®äíR}.=A=ê•’¹/WcÏ ý‰¾:jò Ÿ|{Õm.œ|ñÙ›ƒŸö@’1ÿŽŠ¯?üOâ¥p÷:¯ÇÿÉvãͽÒ=7Üâ¾Â¢Žv¨ø©ÿà—<ûNõøÝ¬žs¼Áq»ÿJ¿­nÛÿÁ9þ$EeäÿÃExÕþy¤w[áöêúâŠ9Ør£å­öø‰¡[2GûCxá‰è2•_Áî›ôÅsž&ÿ‚qüQñ-þýWãÆ¿}Ÿ‘§[Wè‚äøû"Š9Ør£âøà—~:Y¢øå¯$’ >Ûk¸{ŸµóVn¿à˜ž7:cEoñßÄîìAdx.Mõk?Ÿ5ö=ùØr£ã-?þ ‰ãë9£òþ:x†<¹ŠÃéþ–3õâ®ßÿÁ1üe¨·úgǯLƒî‰mçr§ñ¼¯°(£‡*>CÓàœ_ôØŠÙþÐþ2¶…Çt£…è§Åûü_Œ¤ý·š©§Á/ü}gyæ'ÇrÛ$†ÿúT?}¥E>v¨ùãþ Õñ'V´k]{ö†ñŒö¸ÀCˆÿxÎZÍÑÿà˜~<ð¬å¼'ñÛÄV99-µÄ$ýBÝó_eÑK‡*>LÔÿàŸ¿®"[þÑž5k…­Ôhï›Î?#TSö øÑ{a=®­ñû_¸À -ÜŒþÌÆp@üM}ƒEì|¨ø–?ø&Ä‹• ©|jÕ!ù@ûT€~qŠÞÒàœ?´Ûc¿í ãT# Žè/þ–å_^QO‹•*xþ óñC¸yí ã†ÝÔ$S€O©vÀþU›ã?ø'¯Å/˲o¾$¼µÎB\%Ä`ÀRä©ú××´RçcåGÅÖ¿ðK¯ÆÂFøã®Å2Œ–÷ëö jå·üÆÑZHãÇŠVgR0–÷±ÿLÉö-ùعQñm¯üûÇö»ZŽäO»ÜŒP~ÕÉö­[¯ø&o/#Xî~>xÆHÀù•àúyÇë_^ÑG;T|¦ÿÁ5~ iÒÿhZD>ï“ ÊÈ^а¿°/Åë;ƒöÚ#ŲFÃ¥7dÿß&é‡ë_\QK‡*><›þ ¡ãë餸Ô~?xªK©GÌæÞá‹{7¹5š?à—>=[­ëñ»Yïò.7éWõ¯µh§ÎÕ#ÇÿçøŽ,Ä-ûExÙPtAÖÁø}ºµ4/Ø#â.‰dÑEûCxà“÷s+*ÿÀ^é¿B+êJ)s±ò£ã_ÿÁ7þ(x“Pó5Žúõê¯Üy…Ö@ö_´¿@j(à—~:ÃñÏ_F“ÂÛ\ßSö¾kìú)ó±r£ã‹ïø&ßLò­~;xžF'-°\˜ýÙÇëRèßðMï‰:é?´ŠläîÇr©ú^ þUö¹Ør£ã{þ }ãOÈ“ëÿ¼K}t¿6ë›IåÁö&ó"´4Oø'§Äý&?´?‹ííñ€‘Grqôóåü+ëz(çaÊ/¿`Œ:|á¼9ûBx¦ásŸô™¯#ý˃TüCÿìøµâáŸSøí­]̃¼k¥ÿ»‰ÿ ¯²è£‡*>-Ó¿à˜_mî|æøã®[Êy/ W%³õûP­»ø'GÄ{¤QqûEøÞM½Et@ú§WÖôQÎÕ/ÿà üK¶Ò|?ö‡ñ·šKŽânwÌ×uÿËø“«_¼úÏÇji$?4¬.¤vúæçú×ÚtQÎÕAÿ¼ñÄ*‘ÇñÓÄ)9ÂÚÜ ¾¸lÅ;Yÿ‚axæäÂ,þ9øŽuŒ` ˆn>O÷qt¥}—E>v¨ùÃþ Ûñ;J„E¦þÐþ/†&eHî”/û£íŸáY·¿ðK?K©}¶Ž^!’óþ{Ig?™ÿ}ý°šû6Š9Ør£äÛ_ø'çŰù´_QGÝ¥ÉÇüÞj¥ìñ§M¾Lý |E%¾yi¦»,²Ø~µõý¹Ør£âÝOþ ¯ñKSÔåšïã–³q笖F»ÞÞÄyçlÕþ ™ñ I—}¯ÇŸX7÷­¢¹ô»Zû*Š|ì9QòWü;«â3^$ÒþÑ^8fSÞ]ÎïÀýº´¡«þñ.å/¾5ê¦&mÝnŸqõ Î9ükíš(çaÊtÏø&?l®Wþ/·‰!‡&ngеøþ•fûþ ‰ã-AË]üzñlÄ}Ã-´îWñ7Ÿá_`ÑO‡*>E±ÿ‚süI°·+iûDøÒ:,It«ú^Šöø¼ð´´?м†ï›¦r>¦ë?†këª)s°åGÆÓÿÁ0|qöb|xñ+ç’kpŸü ?Ê Òÿà˜>?°¸ó!øå¯Z°þ8!¹Ýÿ¥B¾Ð¢Ÿ;T|‘qÿèøu·í´_äÛÓ|WGOôî+^Ø[âdZO“¦þÐþ6ÒÃ#øý§púä×ÔRçcåGÅrÿÁ1þ#êw6±ñÃZ‘ä9yn¤vúæägó«Á/|q—ü/_$ Ùm®>_ ûf+ìÊ)ó±r£ã=cþ …ã«™â6ŸüE:F0 Ä7£ÿwGúVŸü»âv†ÇöˆñŒvì0Ê©t6öGÛ¾¹¢—;T|eqÿ³ñŠjFöËãˆMáÿ–Ïg8—þû„Öä?ðOߊXùWŸ´gWt"\œ}[퀟¥}cEì9Qò¿ìñ«O½ÇöñÛ“‚òÍvî²4ä~µ•ÿÓø£¨jIwñÃYœNs$²=Ùy>£Ïçó¯µ(§ÎÕÙÁ0|fј>9kÐdüæ8nAQíþ”3úV•ïü+ÆZ†ïãߌ&ˆ¹$¿?çô¯¯¨£‡*>AÓ?à›Ÿô Ë§þО0µA÷1\§æèÅMì ñ~ÖW[Ú#ÅqºCvÍøtqøúâŠ\ì9QñÔ¿ðL¯\y’Ü|}ñKÜLs!kkƒ¼û·Ûrj¯üóÇÐ^‡_úÜX?ë#†çxü>Ô?}§E>v¨ù¿àß.í®£ûDxÊK21³eÉÝìA¼éíYZüóÇ»i¼/ñÓÄ6’±É’+[ˆ\ŸRVïšû6Š\ì9QòuïüûâÕ²“ûFxÔ΃²åó[ß×F×öøÔbšÞóö€ñÛºà0šîIñ3‚?__ÑG;T|J¿ðLO‰W!’ÿãV©åg tù>¤Ç5·¢Á7~"é•´ý ü_f¤`¥´w ~—£ùW×ôSçaÊ”tOø'§Ä="øÍÿ ã†ÏP±N }w^0?•Wñ§üûâ—ˆ×ÊOþ'¹µn±\$ñÄ%Îñõµ¹ØùQñe¯üãÇa•çøß­Ç,|©K{†Ú}Ú†*ýüÆð«´ÿ|T’@1[Ücñ?læ¾Ä¢Ÿ;*>,‡þ {ãè x~7ëi&î Ãr2=sö®µ­/ü?Æ×ËÇÇï²ÿ´ ­ôlãõ¯¯h£‡*>>Óÿàš=Ò'ÿ‰?ÇÿÚÅ×÷P\#~—¢¬ŸØâå•È:oíâéS¹˜Ýñÿ7l+ëŠ)s°åGÇ×ðMoˆ:µË\ë_´Šåº#Ìqé“x=«.oø%ÇçxøÝ¬¿?} ¸Ýÿ¥_Ö¾Õ¢Ÿ;T|iÿæøoeä¯íãX“þyÇÖÁø}¸V—‡¿`/ˆš N©ûCxá·rÅ.Ñø=Ó~˜¯©è¥ÎÇÊŽ¼Wÿçø£â{Üê|A} Ÿ“Ï[•ÛôArT~Rø%ߎ¡ÜéñË^ŽWµÇ#Пµó_hQO‹•ËÿÄñ¿ö[ÇÇ4®>dk{ûô³ùþ•^Çþ …ãë9#ò~:x‚?|Å È+ôÿJý+ìê(çaÊ/¿à™2ÔN/>=x¾hÀáe·ðÏéNÓ?à›ÿt´+cûBøÆÕG!ŠéGä/F+ëÚ)s°åGÈÑ~ÀÿíÙã‹öˆñY…ÿ‰šíŸðÍÑÇàj”¿ðLJ’;ü{ñCM1Ý&ëkŒ9÷?mÉúרÔQÎÕØÿÁ/|}kz>8kcŸ2(nwüšζeÿ‚v|JÔ-Z×Xý¡üe-¦0ÇrÛ½ˆ7?:úæŠ9Ør£ã=/þ 㯠]|)ñ×Ä6NÇ%ᶸ…×mß5µ¨Á?~(ÜÀ?hÏ´ê8ncCÿ|Þ~¸5õ•s°åGÇð~Á¿gµšÛQøÿâ®Ynäwö$ÎBk?à˜_nWf¡ñ«TòÔå@ûS® ãöÕùØr£ä-þ ÁñK·1Û~о0´R0RÞ; ¿úZ?•hh?ðOoˆz-ÛKÿ ã†ÝÔ$SŒýw^0?•}[E.v>T|‹ãOø'×Å/)¾?x–îÔœùw qP—8o®cÚÿÁ.|vŒ²KñÃ\Ždû¥-îß¡ûP"¾Ò¢Žv.T|wgÿÆñ´09“ãÏŠ’f.Þà/ãþ™“T-ÿà—¾?¶ øá­Ç&ïà†äq럵uöýkí:)ó°åGÈWðLïÝ@‘Ü|}ñŒ‰^ Ù[è ç­G§ÿÁ4¼£ÊFû@x¶Ò>«åAr‡ò¢¾Á¢—;T|k®| ý¥?f¨¿¶¾xå¾&éö5Æ™|¯-Äè:á$,Çé¡ý¯`ýÿm=ö©²¾³‰ôeÿL·`gix›²†à‚R@#OµWÄ?â?à¨þ×¼*xä[[_Æœ,­4†ÖBÀuãÉ“ýåÏZkßЇÛÔQEAGƒÿÁLdhÿboùyù¾Â;·[ÖçìødlVAýš8?ï¿?ZÈÿ‚”HÑ~Å71õ)f:gƒ{nèMt_±=ÚÞþÉŸÞ5Úx÷Q´ŸÄŒÕý’~ÑòGü×öŠñ×ìýá†rüñf¹ái5KËõ»m6å 7 Êò@ÞØõkþ!ûAxßö€øqñëãgе¿ÜiÚ•¤V²jWM;[«E!`…º@'é\ü«ÿ"WÂ_úþÔ¿ô]µ\ÿƒl?ä”üQÿ°µ—þ‰’´Â%*UÛéþq'í: u¿þÞxGüSöªø¡ð»öüñFðÏâ?<;¤[Yé펙¯ÝZ[DZÖ6b±G PKO“_¡ßðLˆ~ ñ÷ü[Á¾ ñk:õƨ<º…ýÃÜ]LRîåQžG%˜…D’x¾Zÿ‚–ÿÁ_>*þÉ?µïˆ<ðÂËÁ³èÚmµœ°½þ,·–Þ9s¬êÌÇ1õ¯°ÿboÚçíCûè^;øµ¯i÷ír–0´6àÇ=Ä+±˜–5Ï'œôè1¨ÚËê4¾}v—õ¿Cf—Öá~ËO”¯™øõû>ÿÁF>:x‹ãÇôís⟌n¬oµû {ˆd¾fI£k˜Õ•ê$zƒ_¿õüÁ|ñ}·Ã×õ¤ž[=W´Ô'H4¯S$Œ1± p =Å}‡ñ×þ ññ¯Ç¾/¹›àÌúGt$‹Kh´øo®Z>Þ|·êÏþâ íƒÔõÕŠ”c­nÿCŠ›jr”ž–_¯üöêŠüý‹?àà_ÛøóOÐÿlËm/Pðýô‹ëö¿fºÓ™Ž<Ù¢OÝË8ÜQ”e†òÓ_Ú7â]ßÃÙ·Ç0ðKYÜ_h½ÕìZPe‚I"¶yc,†ä%GB2;×5jnŒyå±ÓJj´ù#¹ÝQ_’¿±¯üëãǿڛÀž ñµãÒ|I«EcvÖºlÉ0³ŒnÐ~•úÏs!ŠÞFLeT‘Ÿ¥iº0ö’Û_Âßæ(TU$â·Óñ¿ù¢¿üÿùøá®üDÒ4ÍGOðµ¼Ôaµ—f—:±F•Tàý ààžkéø+ükãì!ñ‹ÃÖŸ ì¼%qá?i†{Yµ >Yf19Yã,³( +ÀÃ÷ñÛ4åNPPoí6—É\jIÊqë_ßcôŠø÷þ ÿ ñíáðÿÅçâôZ5¿‰<3¨D6i°<5¤Ñþì•wr[ÌŠpNq¼zéÁ\?oMköø-áýCá\z=ljüE«}–µšh…´q3Í&Åu$†0/^<Êš°tZŒºÛñµ¿1Ò’¬›Ÿà}aE~}Á$ࣿnÿŒ~ ´øŸeá+ økLÝM§éòÅ3\Êá`Œ3LÀv<õxï_ µU)ºvæë©0¨§{t (¢³,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ãïÛ‹B]Söêø _uôlsßʺŽLWØ5òí££Ü_~ÛÿZ×£_JÃé±;ÿãµpÜLúŠ(¨àßðSFeý‰üdQÊócœûu¿½ûÜ‹¯Ù ÀL˜ñWe?Ê™ûzèqx‡ö?ñäc+ö‘þôR$«úÆ*Çì7£>…û#ø ŽKé1ܤ¤Ê?G_dŸ´|5ÿ*ÿÈ•ð—þ¿µ/ýmW?àÛù%?ì-eÿ¢dªðr¯ü‰_ ëûRÿÑvÕsþ °ÿ’SñGþÂÖ_ú&JÛüGõÖã>Kÿ‚çÊGü_ÿ^:oþ‘Å_¦_ðIùE7‚?ìªémÝ~fÿÁs¿å#þ/ÿ¯7ÿHâ¯Ó/ø$Çü¢›Áö Õ?ô¶î²ŸüŠêúþ“6Ÿûí?HþQ? >xçâ—įxgFtŽóÄZ¶™¸Ê£Í*Ƥûâ¿ ÿ‡ðMO‚>[xF†þÕ­#·Xno5-2›ëçÇ2Épê_y$°Ú@Lá€þ~~ üA? ~0xSÅKÚ†µ‹MWÉÎ<ï"d—n{gf?þ•~üdðÇÆ†V1øu­Xj^Ôm¾Õôr- °Ÿõl˜!•°T© ºñQVÚîÿr·êqQÖ®½´ýOêçóçÿýš,ÿdÛÅþ ð±™´K9£»Ó<Ö,Ëm#_üPÿ‚ê:‡‰¤2ÝÚø\Ò÷“’ÑÚÇuo}ü¸~ù›ÿXý¡´ŸÚgöâñˆ¼v·ú±‡KÓîU·Gq¼J$gº4‚FSÜ{×éìÇðþÿáÿüfþÇ[ÖêûÀZ·Ÿ*é.®"ãÞ9Pþ5Ë''—ÉÏË×i[çmüΨ¨¬t9;ÿ•ÿø—ðLù?ÿ„¿ö1[ÿ3_Ñ=ïüyËþáþUüá~À^9Ò¾þÚŸ uÏÞE§é:ˆm^êêV º ½Øðª7d“Ð{Wô ûHü}ð÷ìåð;_ñŸµKM?M²’Xwȼ”¡ò¡ˆgçwl(®}9­sl*ÿ·¿(œøEÍ]¯(þlþpþÿÉeðÿý†­¿ôz×í‡ü3öwÿ…ÝûêzΕ—Wø}ršä%@ÜmÀòîW=”FæSÿ\E~%ü)ÍñoÃnøËêö¤ãÞe¯é¿ÄÞ²ñ‡‡5 'ÄpGu§ê–ÒZ]Bã+4R)GR= ±V2-á¡mÓmz®V¿èM6†_·4:쬖>;Òî4¤á>ÑûDL}ñ ¨?ë­lÿÁÁÿÿá`~ØZo„l&ßgà="8¤NÉws‰ä?÷ëì£ê¦¾kñ‹ªþÁ¿¶ûÛ\ Úÿá§ŠRhÏÜk¸ d¾’Äû‡«ÞF§ÿ ý¾]tõºŽãâgŠ™”6KY&''¶!·>ÑÓåXÉP”v×þýyŸÜEþª«F^_ðô•÷Ÿ­ðC_ÙÓþì?¦ë:´-_â Ãk“\2Û‘åÛ.{©|Ñÿ]}‘T¼5áÛ/xvÃIðä k§évÑÚZƒ Q¨DP=¨…]¬kÔUj9-ºz-àiBœ^ý}^¯ñ (¢±5 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ù3ö¿ñ¢hß·ïÀ›kÞ!†YŸöîdÕV¾³¯Šÿoûm¿·?À™‘LŒúšíH]B3ÿ³¸n)l}©ET ñÏø( üºwìsã¹->ûX¤Gýך4oüuk~ÆWOyû(ü>yþðÐí}Ð Áÿ‚Šêk¥~Æ>8‘ðwÛÁïu ìÕ­û] ÏÙ#À;i'ýó•þ•_dŸ´|ÑÿÀý>$þØøyoû:øsþ´+»é/“ûBÖÓÉY‡7 l”o»œcš³ÿDý>#~È_|yeûDxwþë­kQµžÎ?·ÚÝùÈ‘:±Í¼®€Á ×ÜtS¥7J3‚Ú[þô ‘ö® ý¿ógä¯üoþ “ñÃö”ýµüGâ þÚðõý­”p]ÿlX[ohí£G\×ã ¤r¼ö¯¹¿àž_üQð/þ ýá_üSÓF™â}:Æú+›?´Å?”òÝ\HƒÌ‰™VD<15ô%-Þ„°ÿeýýÍ”ÝêÆ·UoÂËô?üÿ=ý¢5¿i^5ð9Ðôk»Øa¿ÔF³¦\›À’o).÷I±K6Åäã“T>+ÿÁ'ÿi‚:¦¥áýÂÚïˆt+©p.|?sö›-IGÝw…X:ý%E Ž20Oï«­'ý_×ÈÍSŠ?¿aÿø!Ä_Š?ôýKö©Òdðo‚¬äYîm¦¸C¨jª|˜ã‰„aöÊ ä~ÍOám:çÂï¢IgöL–¦ÄÚªí‹È)³Ë :.Þ0;Uú*jÔu£ÈÖ‚?g.tõþ¶? ÿjïø!ÏÅÿ„_5/øQº¾:ð|³4š}ÕÌ_l†"~X® vV2(à²SŒü¹Ú*þÎÿðEOŽ¿ü_¦Y|ZÒ.¼á[VÄ÷ú­Ìo%¼[d·µW.\Œ‘©‘ËÿºTS§ZPI=}B¥56ÞÞ‡áO„¿àŒ?´_‡>,iwiðí¿²¬5h¥·ˆ4²|”˜ä œ“´ggÛµ~ëQE«)B4ßKþ6ÿ!ªqS”×_»Kÿ™ù‰ÿ“ÿ‚ZüDý£h­/Ç_²÷†b×›WÓÛ[oí,Ú+ˆØå&âX÷>\ãÈçïø#WüßâìáûCêÞ:ý¨¼3‚úN˜ÖºmixÒÏ9Û$ªmå“fÈ•“æÆ|þ3ƒÓš)Q«*qŸãó ÐUšròü-oÈ(¢ŠÌ°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯Žÿo[m¯€Bß<š´W=^ÀÙüCʾį‹?o´i?nÏ+ ¶ó¨Yü¿Ýÿ‰„|ÿ?Ê®Š[iÑE<#þ ann?bíêŸbÊúß5½û Z›OÙÀ(ýN–¯ÿ}37õª_ðPûö6ñÔÊyv‘\äwò®"—ŽÌ~5ö»ûoìàë·JHÿï’Ëý*¾É?hõz(¢¤ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯¿nÖ†/ÛWö~iWkY¿÷¿ÒíÂÀ“ù××µñïíßc.«ûn|€ÿª]N9F=VîoÑE\7¶>¢Š*x÷íý/“ûøðƒŒØ*þsF?­Zý†¬FŸû#x49 ¥G/ýöKÿìÕ…ÿ(º’Óö)ñ«[Œ–[4>Á¯`ô5Ñ~ÄÐ}›öLø~»·çF…óõÇáœ~dŸ´z•QPPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÈÿµóÉ{ÿøkÈ…ÌàÿÛROé}q_þÜWRé·OÀK­<¯5üvÌ÷ê4oüvF«†â{`QEÄÌ=…í¹?Ê·ÿaxe·ý‘|·jΔŒÂYŠŸÅH?_Ù'í±ETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñWíûs"~Ý–<á5 &_ruÁþB¾Õ¯‘m 5¿ý½>¥à ÝyŠç£:άæ«ùÕÃqKcëª(¢ g…ÿÁJ‰ÿ†&ñ¶ÒÛeÔãþ_­ë¡ýˆ®žïöJðÏ÷†¢åGès?ðSHüÏØŸÆ_)b¦ÄŒvÿN·çùÖçìuöÏØÿÀN{iÛ?_Ù'í»Lšå-×30¢ÕuÓ,žiŽŽ=Ï¥eÃ#¹ó.ù•»g!=…AF°¿ºnüF(ûj{þUçQçb€4~Úžÿ•mOʳ¼ê<ìPÛSßò£í©ïùVwGŠÑûj{þT}µ=ÿ*Îó¨ó±@?mOʶ§¿åYÞuv(Gí©ïùQöÔ÷ü«;ΣÎÅhýµ=ÿ*>Úžÿ•gyÔyØ  ¶§¿åGÛSßò¬ï:;£öÔ÷ü¨ûj{þUçQçb€4~Úžÿ•mOʳ¼ê<ìPÛSßò£í©ïùVwGŠÑûj{þT}µ=ÿ*Îó¨ó±@?mOʶ§¿åYÞuv(Gí©ïùQöÔ÷ü«;ΣÎÅhýµ=ÿ*>Úžÿ•gyÔyØ  ¶§¿åGÛSßò¬ï:;£öÔ÷ü¨ûj{þUçQçb€4~Úžÿ•mOʳ¼ê<ìPÛSßò£í©ïùVwGŠÑûj{þT}µ=ÿ*Îó¨ó±@?mOʶ§¿åYÞuv(Gí©ïùQöÔ÷ü«;ΣÎÅhýµ=ÿ*>Úžÿ•gyÔyØ  ¶§¿åGÛSßò¬ï:;£öÔ÷ü¨ûj{þUçQçb€4~Úžÿ•mOʳ¼ê<ìPÛSßò£í©ïùVwGŠÑûj{þT}µ=ÿ*Îó¨ó±@?mOʶ§¿åYÞuv(Gí©ïùQöÔ÷ü«;ΣÎÅhýµ=ÿ*>Úžÿ•gyÔyØ  ¶§¿åGÛSßò¬ï:;£öÔ÷ü¨ûj{þUçQçb€4~Úžÿ•mOʳ¼ê<ìPÛSßò£í©ïùVwGŠÑûj{þT}µ=ÿ*Îó¨ó±@?mOʶ§¿åYÞuv(Gí©ïùQöÔ÷ü«;ΣÎÅhýµ=ÿ*>Úžÿ•gyÔyØ  ¶§¿åGÛSßò¬ï:;£öÔ÷ü¨ûj{þUçQçb€4£¼ŽFÀ8'±ÍKXí.ᆫ:]ù’V‚s–Q•?Þ~Š( ™5Â@3+ýj=JýtÛ7–_áSéY‘ÊÎwÜœÈÝ}ØP ¿B8ÝùQöÔ÷¬ï;4yÔ£öä÷ü¨ûj{Öwš<êÑûr{þT}µ=ë;ÎÍuhý¹=ÿ*Xïc‘ö†Áô?ð~©âý3źïö<ɧޥ¼Ö*"iZUWR%!P€›“'0ë_M|/ø© üiøq¡x»á~§m¬øsĶ0êZmõ»f;«yP::ýC#¡Á¢>òr['gäíÉþ}˜KÝi=Úºô½¿3¨ó¹£Îõ5óφ?o_ÁH|Mû;/†î!¼ðç‚íüdu϶«Ep’ܬ@ƒfUlîÞAÇJ÷¿>Ÿ*ŸG{|›‹üS_!_Þqê­šM~ 2ßÍw©ªž½pß³ïí3àßÚ“Á—¾ ø«6±¥iÚµæ‡s+ZÍlb¼´™¡ž"“"±ÚêFà ž i-]ºïòÑ_ïkïCz+¿Ož¯òOîg¢yÜÑçzš©çûÑçп;š<ïSU<ÿz<ú·çsGêj§Ÿï^%ûu~Ú~Äžðn¹áù¼F¾/ñ®‘àÕ†;Ájm[PŸÊŠ>àJ`né‘IÉFÉõi/VÒ_{hvm7Ù7òJïðG¼yÜÑçzš©çûÑçÓoÎæ;Ô×ϵíÙmû-~Ð<{áÉõ©~6ø‚ãA†ò;Ñé-"S+!FóAA^k«ý´iÛØçöMø‡ñKÄÉ}´+­Y,Úo$_MdÃoæ`ì2ÊcŒèzTJ¤c ToÝ‹iú¤›ü2ãNRœi­åf¾m¥ø¦zÏÍw©¯þ=ÿÁZ¼-û~Å~'~ÕZ©¥øÇâNŸbt¯h™Ôµ{ýJæä66ÊU7˜ÌН#PJŽYÑ_Ê"ÿ‚”þÚ­áeñT¿°m×ü#¬þiÓÇÄÛíám·w›ö3íøãÈÇ™»åÛÞ´’äœá-âìû'ÚûÀ×c8¾hFki+®íwK{y÷Ðýó¹£Îõ5ó¿üÛþ Kðóþ Gð³PñÁFÕ´½W×§Kñ'†õ«o²jþ¼Ì70äã;[k©*v²ä::/¾ùôç Sv’þž©ú5ª}P£55t[ó¹£Îõ5SÏ÷£Ï©(·çsGêj§ŸïGŸ@üîhó½MTóýèóèßÍw©ªž½}[ó¹£Îõ5SÏ÷£Ï  ~w4yÞ¦ªyþôyôoÎæ;ÔÕO?Þ>€-ùÜÑçzš©çûÑçп;š<ïSU<ÿz<ú·çsGêj§ŸïGŸ@üîhó½MTóýèóèßÍw©ªž½}[ó¹£Îõ5SÏ÷£Ï  ~w4yÞ¦ªyþôyôoÎæ;ÔÕO?Þ>€-ùÜÑçzš©çûÑçп;š<ïSU<ÿz<ú·çsGêj§ŸïGŸ@üîhó½MTóýèóèßÍw©ªž½}[ó¹£Îõ5SÏ÷£Ï  ~w4yÞ¦ªyþôyôoÎæ;ÔÕO?Þ>€-ùÜÑçzš©çûÑçп;š<ïSU<ÿz<ú·çsGêj§ŸïGŸ@üîhó½MTóýèóèßÍw©ªž½}[ó¹£Îõ5SÏ÷£Ï  ~w4yÞ¦ªyþôyôoÎæ;ÔÕO?Þ>€-ùÜÔOyö}VÅóþ²CàTŸý”T>½Wº—~¥¦ÿ××þÓzíAÈ¢ÐQ@çŽ/ŒzŽ•lN÷Ÿø 3ÿ5¥ó½MRø†Û|O IäÿÑ2S¼ú·çQçzš©çûÑçп:;ÔÕO?Þ>€-ùÔyÞ¦ªyþôyôoΣÎõ5SÏ÷£Ï O|m55Ôó,ÆÀ¡oý’º±È®P“~­£ÿ×èÿÑRWr: I¾•ÆøbäÜYÜM!ËOs)>Û\ ýWe'ú¶úWáY¶éL?éæýô¸f÷£Îôªž}}[3{ÑçzUO>>€-™½èó½*§ŸGŸ@ÌÞôyÞ•SϣϠ fozw‚®K^jpd•†|ø«65KÏ©¼ÛµdÿÓdÿÑI@=sÿ/M®‡`.®"€ýÕ­tÊüY8ÑìýDm¿ôjÐ;Þ:ªèóèßïGU ôyôoÎ÷£Îª†z<ú·ç{ÑçUC=}[ó½ê¦³{öH"˜bš<~,ÿf4ꇉeÝ¥cþ›Cÿ£R€;¨Û|`úŠù ö±‚}Cþ KðV[Ç Ì„ô,³LÍú"W×–ÿêè+âïÛšþâÇþ ð= ˜ÃÚ,7û÷û\~*@üjḥ±ö¥QP3ÿà¤Z“i±ož,î’;X»OèMlþÂ×_lý‘<ç¶–‰ÿ|³/ô¬ø)Œº‡ìYãt´‹ÎuŠÖR¾Š—37àªOáWàŸ‘ÉìsàAu÷“‘þéžB¿¡dŸ´vß[n«¢Ÿúnÿú)ê§V>(·ú1ÿ§†ÿÑoY¾uAGççüGL´ñÇاO×­­ïloþ5X[\ÛÏ’+ˆžWGFÈee$zƒ\÷ìâ Ïø$Gíß}û%|Oº›þ÷Äéî¼GðOT¸,Ëc#9–÷A’VÏÌŽåãÏ$°$—¸U^‹þ k.h؃Ÿù®oþ‹j÷oø*/ìaÿ ý–5 ÛÞ¾ƒãMá5ßx‚ +X·Ë[Ì’'ÌŠOÈûy äŒ2©N~Æ‹©k¯i%$·q䥷œ^±ùÇE&9EUª©·gÉŸgÏVß'ª~Nû¤xoëøì?à埊wn#Šz{»Š£RBOä+ý–¼eûIÁfn|OñoÀÿõ€ŸR»Ò<¤xsE²ºÕ|A ´­ Õ/.n‘š0Ò+¯’åvy“xwü/öœñOíËÿ}ø§/ÇïßxGâF‡ðY<âûIJÄV´Ôc†âhLlv£—W?)$)`›‚ÿ‚A~ÆŸ±Ïˆ~ë_ ?à šl~ ý ~j×úgŠ,ujÚêQ¬îñ^ÚD·ÐÃ$&E-¹¼²#=Æ ÙÁ6šP“Žº4ëT¼—GeËmv•ìíxäæÜæÒ³rŠwZ«R‡»äîý-}uûö@øïññþ5|^ý‘?jÿ‰vR|Uðï‡ ñ?þ(麪\kDòù&æm1Á·ÛÊV-¤Üç~ß6Ož¿à”Ÿ?hÿÁ?¾6Õ5k=nêy •´Û;{·–9Q ÆáeÈòÔÙ"³wŸð@Ï‹~¼øñÂV¾$ФñM·ÅOO6Œ·ÑøâþÒfó ¾íû1$gv1óy¬œ}¢|¯Þ•k·ü¼ŠM%·ºÓÙ]ÚI[•­TåâšHé½½É6¯ê¾Wq}ÿSÖu_ø MíðÊídø‡âo Yéšk[A…]GPñN¯¥[G„¬?µÏröpư´°C2FŠc*ÆÞBÊÌ@:µ¿Úÿþ ½ð>O_ ?i [ã­¿€-ÿµÿ‚¸IŸø(_ì}>"j?úB•sþ §u'ÆÍàGì룘æ—ãÇÄk mfر &ƒ¦°¿Ôqýß*ßê ë/þ Ù.à¡?°?óPõý"Z·àù›ö£ÿƒŸÂêøaÿ ]ÇQ$´1çþyãÌÝævò±¿oWRM_Ö.:õùÊ V—š½"š^=:z4|¹eá8¿g/ø9x?ÕWÇŸ…ê^"³‰ñÖ¥as±.š=¸ 䯋rKÈÇ–;¿F|êüÂÿ‚kx›Qÿ‚›ÿÁR¼{û]išV§¥|#𷆿á\ü9¸Ô->Ï'ˆÐ\4·wèŽ7yªM°áã‘ôÏΧJ•pž'§dç)E[§ºÖ<¶åÖ©(íîüÚ„bý}äÕË^uuUó½èó©kΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê<ê«ç{ÑçP¯::ªùÞôyÔkΣΪ¾w½uZó¨óª¯ïG@¼ê~í[Mÿ¯Ÿý‘ê;Þ‹wݬéßõñÿ²=zè( tPñ)¶ø‡B?ôÞOýõOø q®ègÒy?ôKÕ/:€-yÔyÕWÎ÷£Î  ^uuUó½èó¨×GU|ïz<êµçQçU_;Þ:€<›µ­ ÓçþÓ’½tç+&íwHÿ¯¿ý§%z0è($ÿVßJó Ë‹ G¥Ìÿú5«ÑäÿVßJó \ZÌ=.fÿÑ@ulÕ_;Þ6€-yÔ³U|ïz<ÚµçPfÍUó½èóh×A›5WÎ÷£Í  ^u^øvÛµ=`úÌŸú)+Î÷­_†­ºûV?ôÙ?ôZP[\§ÅÓÇþÂÿú5k«®KãLJìÏ¥ý¿þZ©çQçU_;Þ;šµçQçU_;Þ;šµçQçU_;Þ;šµçQçU_;Þ;šµçU=zMÚxôÚý´ï;Þªën´QÿM¢ÿÑ‹@“oþ¡>‚¾:ýºô&Õ?n¿€å3ûËø úEy‡ôÍ}‹oþ¡>‚¾Nýµ¢¸?·À&µBÀß°ãÐMÉNjḞÇÖ”QE@Ï$ý¼/M‡ìƒãÙø´Ãýöê¿û5Vÿ‚}Á5·ìqàE¾$¹²‘†ºg¯þ:V¥ý¾<¯øcï}°á?³Æ?ÞóSoþ=йûÜ­ßì•àˆ` üT?¨5_d]NƒâËmºÑÏý<7þ‹zÆó½k[ãm—H?ôðô®{Ω•ã_…Þø•¨è—Ÿ|5 k÷~¾]OGŸRÓ¡º“I»Q…¸¶i˜e$L0ÏZè<ïZ©çQçQän`è_¼á‰šÇ|3á éÞ2ñ IoªëÖºTêzœh"\]* eU€bÕÇA\ŸÇOØwàÇí9¯Á«~Ñ þø×V¶ˆCö³¡[]Ý$`ä šD/´~\ãž•é^uu+'eÛo!Ýêû™_ ~ø_à§‚í<9ðsÚ…+?#🆗Çcý–Þ"\VkMÁ¾Înöù¾VàËÝ·#8§Ýü$ðÿÅ __ø[ÓøÖÆÅ´ËoI¦ÂÚ¥½£1f·Žì¯š±f&0ÁIbqÍlyÔyÔ–›¿Ÿõú/¸Å>Ó|4ð—ˆcVHõ-'Ö–—P«}á©d8!HÈâ½WΣΡhù–àõV{¾ økáŸxËBñŠ|;¡j^!ð±œèº¥Ý„S^èætÌmgu/˜€+ì+¹FE?Æÿ¼;ñ6ÂÒÓâNƒ£x†ÖÂöJÖJÊ+¸í®¡pðÜF²) ,n+Œ2‘A«þuuÙ]Ç{ø³ÃW|1¨hž9Ó4ýkFÕ­ÞÒúÂþÝ.mo!u*ñK‚²#) «$Mðo„t‡^Óô‡úV›¡hzEºZØéÚuªZÚYBƒ 0ÆFŠ0¨‚¬yÔyÔÍñWÃo xë]Ðõ_x{CÖ5? \µæy}aÄúLì…[iKBåIRÈA ‘œWœþÊ?±Îû)x£â¦·£kZ¿ˆ5‹^/¸ñn©y©üÈDH㴈ƫûˆQ6 9 1É5ëuu Ým®ªß{Oÿm_p=RO×óÿ7÷±ú­…®»¦\YkvÐ^YÝÆÐÏñ‰"™a•Õ²H$x9¯žWþ û,&½ý¢?g¿„hÝ¿oü"öžF뇗åãÛn+è?::…£ºÜ/ubM6ÊÛEÓ ³Ñ­à´´µb†cÇ (ª¨á@§ó½j§GCw ‹fj<ïZ©çQçP³5w­Tó¨ó¨Ùš;ÖªyÔyÔlÍGëU<ê<ê¶f£Îõªžuu[3QçzÕO::€-™¨ó½j§G@ÌÔyÞµSΣΠ fj<ïZ©çQçP³5w­Tó¨ó¨Ùš;ÖªyÔyÔlÍGëU<ê<ê¶f£Îõªžuu[3QçzÕO::€-™¨ó½j§G@ÌÔyÞµSΣΠ fj<ïZ©çQçP³5w­Tó¨ó¨Ùš;ÖªyÔyÔlÍGëU<ê<ê¶f£Îõªžuu[3QçzÕO::€-™¨ó½j§G@ÌÔyÞµSΣΠ fj<ïZ©çQçP³5w­Tó¨ó¨Ùš;ÖªyÔyÔlÍGëU<ê<ê¶f£Îõªžuu[3QçzÕO::€-™¨ó½j§G@ÌÔý:MÚîœ?é¿þÈÕGΫ3îñŸÿ]¿öF O‚Šáþ+¶ÝcDÿ®ïÿ¢ž²üêÒø¼qªh§ÒwÿÑOX^woΣΪžv{Ñçq@üê<ê©çg½woΣΪžv{Ñçq@üê<ê©çg½wjÖMþ!Òëëÿi½zhè+Ë4É7ø“Jÿ¯Ÿý¦õêc  “ý[}+Ê4y1Èÿ§©¿ôcW«Éþ­¾•äl¸7CÒêoý ЧIçsU|îhó¨ßIçsU|îhó¨ßIçsU|îhó¨ßIçsU|îhó¨ß[¿ ›uÖªé²ÿè´®_Îæº_„íº]PÿÓeÿÑk@•rŽ<7kÿ_ÐèÅ®¾¸ÿG·?ôûþŒZÂó©|ïJ©çQçq@¼ê_;ÒªyÔyÜP¯:—ÎôªžuwkÎ¥ó½*§GÅZóª FMРÿ¦ÑèŦyÕÔ»–!ÿM¢ÿÑ‹@³oþ¡>‚¾[ý­GíÙð.à’¡¯ì‘ÔmÔÿìÕpÕŠ[kQE<þ f·/ûx¿û; k36:ùl‡8üqŸl×Oû[}“öJðúèð¿ýõ–þµÿ¿Nýüw%ÈZÎ8†¼óÄ‹ú°«ß°æá‘ü½÷Ÿì˜ùÎ{ž?Ÿ…WÙ'í¿ßì’?çäÿè \¿êk¥øàÛ!Òý<ÿì­\xž¤¢ßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞôyÞ¦ªyô èßïGêj§Ÿ@ž€-ùÞõoòoñ‡ýu?ú VOŸWü'&ÿØÿ×Cÿ šõÑÐQ@è(  ã+ì¿Ñý7ýõÍùÜõ®ƒãiÛw£ŸIßÿE=rž}[óèó¹ëU<úùþ 3ûe|`ø%ûBü ø]ûi ¯¼Mñ†ãYF¹ñ£Þ­…ªiö‰q€lÎõ,¾m¯Ê¸²›µ»ÿ‡*0s½º&þI]ŸbùôyÜõ¯‰¬õ_ø([]Åý¡§~ÆËn]|Óÿ‰ÂgæÚ Œã&»Ú ö•øÃû=ü&ý¦„©85¥H:rp–ëB!5R*kg©­çÑçsÖªyôyõšZ›üO¥×ÏþÈõëC ¯ðÔ›üW¥ÿ×ÇþÈÕì#  “ý[}+Æ,åÛ5àôº—ÿC5ìò«o¥x|2í¼½ô÷/þ„hCÎ÷£ÎªŸh¯‰?i¯Û#ö¼ÿ‚ŒÜü ý‡t‚“E¦x ÛÆWwž9“S‰˜É}5«$od[¦ØˆS÷‰n‚…w%µwüoðLQ‹“{[ñi/ÅŸsyÞôyÕùóñ_öþý©¿`ׯ_·ÿÂÏ…ž%ø[ÔpkºïÃ-^þ[¯ Âî\Íg}iã Ê–F:’8cþ Óÿe׿àŸzWÁO|ð¾ŸñÃ~?Ôç›XX"šâíôˆ-’æY¬<§U!g—|,g YeÎ1WoK¨ú9Z×í¾ûoÙ•JråK[7ê–öïé¾ÝÑ÷wïG\§Â¿‹:ÆÏ†ºŒ>jPjþñ%ŒZŽy ù. ‘£zƒƒÈ<ƒ@"¾(ðÇüÄVðL>6xËÁÚn¹ã}[Æ7ž ð熴yÚNôê²ØÙÄd™Ü‚V0îÝʶÕ\€IªStåñv뺽o$¬(/iR/Ý}~NWô´[¹úç{ÑçWçÇÅŠ¿·ÏìñðJëâwŽ-¿gÃáÛY5x/G´Õ,îÖÊ$2L–WòNêóª)áã+ÁÛæªßcþδ¯Úoàƒ>!ø"«m'ÆÚ5®³kÒ…žž%G Ë»iÁ# à‘ƒZZ÷×Uküïo[Ùí}‰¾ÎÚ;Ù÷µ¯ç¥ÖýÑèw½u¿[wö™óÙô®íÚü;¢Ôý6úÒÛ×ñ´ã°ú|ƒÿF-v5Æüq8ðŒGþžáÿÑ‹@‡ïGïU<úòïÛw㾩û4~ÇŸþ!ø"ÚÂ÷XðO†5 nÊ åv¶šk{w‘UFV(YFB²œt#­Læ©ÅÉìµ*s’ŠêzçïGï^yû2üT¾øÓû7ü?ñ—‰a´¶Ô¼Yá½;XºŠÕY`Š[‹XæuŒ33 äXœc$õ® Ã?µ&½­ÁG¼]ð~êÓH_ h>Ó·ÿùWé—ï_|Aÿ‚xÏÅžý³l4íOà 7íÅáÃ%ÄálˆÑ"°ÿN"cllß»ü˜=~ZέåN¤RÞKÕÊ~ñ3Ž“¦ûI?•¥¯â|íÿø’¾6Ôdß‚¿4ÿ‰Ú×ÂøMüIãÀZmÞ¡©øŠ+K;t‚ÒxìÈ™lüÉI®s”û¥UÓM·ðÁŸÛKà·‹à˜_ho†—:—‰-<9ãËøw«i>Õ4÷F׫2ùK-³ºJ²àc.\¢¾¥ýª¿`/ˆ1ѾøçöUñg‡¼3ñ³ànŸýŸe&«³èZý¬¶ÑÃucyå(‰ÌA–ERËóaU˜:3Ã?¿iÏÚ+ö‘ð7‰lø#áï€>ÜÿjÃះú¾¡qqâ‹ýŒªu™c„ T$0€+Ë+ƒÁŽqxŽkÿËÉ7湯¿TáhÛNªÊüÏEûÆKì$—gk?GÍïszk¥—Ú>w½j«ç{ÒyÕÌnmxFMþ/Ó?ë¹ÿн tâ>“Œ´Ïúìô¯n$ŸêÛé^eÆ¡~=.åÿЫÞ$ÿVßJùþâLjÚ€ÿ§¹?Yó«â? Éÿx¬ÿÕ²ÿÓä•ö—_þÔ¿²oí1§ÁF®~8þÁ×ßÌ—€í¼wgãÙuBÀÇ{-ÓIXÅÇÞˆdþþW¡«¥5N¬dö÷—ß Å~-V¥7½âþéÅ¿Á3èßø(<ú0ýƒþ3ÿÂÂ0bk÷ÎÎÏ/ìRç8çéŽsŒs_|?[›¯ Á*£ñ"™d“Oe·Ä|6‚:ShÇ¥z§ÄŸØWö¦ý¾t ?ÿÁD~&ü)ð¿Ã7ºŽ}wÿ ôëñ?‰¢Ã­´××ï¾Ë*“å¯<‚{wíûê¿ÿiÙ¯Äÿ &Ðt¯ üÕu «ë)žHå{y´ãivˆ‘²±S·!ÙQÁ'Šå•6ÝßYÒv¾–„›mÿà^º?#~{ÅÅt…_¾QI%ÿ€þ=u·‹~Ë7ÒÁ)¿mÉÿgÏÉ$?¾0ÝÜë /e'ÉÐu&c%ï‡ËtT,Þtã;öåÝÎ<óöýš¼û`ÿÁaø{ñ§Ä“xIuÏëm¢jÖ·Éi{eªÅ®]Kjö¬äo”2 ù˜næh~ߟ±Î‘ûv~Íz¿‚5ë¹tma5?k–ä­×‡µh2ö·°ºÊÈü¤ŒêÎkå?†ŸðF_7ü{Ÿþ'øöÃJø³àŸKã}Åz<“ß[YjË{=Ä7ž‘I6RvV, †rÀ6ѹr9Oš¢mF<·[´ç­·½¯[Eß™¶6ì½Çnis[¢|“NÿÝ›’¾önZZÈè¼MwûxþÅ~ žþKÏ…?µ7…´F’ê,æð׋/â^[Ë—´r1# #ã;7Ö±·í=áïÛö_ðgÄ¿…v·VŠôñsoiqIlÙY£’Œ¤‘ºe~S·#‚+åÏ[ÿÁ@> |+“Áz•¯ìåácR€Ø_xÞÃTÔ®M´L6=Å®Ÿ%°xRYC¶Íã•QÓéOØ«ö_ÒÿbÙ[Á? |sªYx;OŸmv=ä¬Í$³lÉØI$`™;A “Œ×bøfäîî­ÿ“svþí®¯¹ÌôpQVVwÿÉmßûÛhzß]÷Á&Ýk¨ŸY‡þ€µæþuz7ÀúÃP?ôØè+YšåqŸÎ<ý}Cÿ£»:â¾<x-Iísþ†´ç¦jù÷þ ¼ãþ “ñù W‘›ÀÈ £$ÿ¡Ë^ïçV7Äé_>ë¾ñÕ¸¼Ñ|_ø}áØ¾Ëàý[ÄZ¥æ¬éÖ€–÷ÑÑÌ#"ùeNÔäò=öý‚¼_ðŸÅ?~&~Ù^.Ó¼Wñƒã*Áo¬O E%¦›áëb1Ãa§>fÄÜOšB³BAeg~¼UO¬×xìùݶw”d’^k›W¶ŽÍé~J4½Q–ë‘w^ë‹oÒËmîöZÛówáßÁ¿‚Ÿfÿx/þ ð“⯀~4Éws©|n¼Ñu ^ÒãQ–áÍýž±k#·î¶Ì`,lÈwe™À÷ßø(Äã9¿dQñã7Âø^ã_ñ–§ðóL¹¿Ô>#Geo p£²•æ[IdÉ)G“%×@‘}WÁÿ³—í±ðSà±ðkÁ¾!ø'ñÞ]Æ™¢øßÅ×Ú‘Ö¡Óæ-Ÿ·Ùˆ$ŽæxÒGTýæÂ7nÆ?ðI¿ü-øû=Ü~ƾ=Ò,>0~Îztºn¨ëÖR Å·…»´½ŠdŠ'a¹ ïdÇÌD‹ši´åðÞ:[G¤’|›.WÊÚZ5¢RQHÞNM·öÚž·Õ]Æö•®ù—2WÕ=[Û<+L·ðÁŸÛKோà˜_ho†—:—‰-<9ãËøw«i>Õ4÷F׫2ùK-³ºJ²àcçg'h®óà§üãÁ_µïüÃöŸñwí 5h~ñV…&ƒá©u ãÒ ÔŽfï¨MnŽYB$1®ìŒo åÛì¾ø ûN~Ñ_´—üMû`x“Á|ðîçûV ü?Õõ ‹jWûFêXáÕ ÁòÊàŒ꿳/ìÕ®|ý¥>?xÏÅšMÆ›ñWÄv«¥Ck$=¼Vúe½£‹€Èª®d…ÈÎ6í$‚HQ’§ï?‰)YïkÊ­ÛiIvm½ØV´÷RÑò§ÙÙO~ûÅ7ÕYj–¾øf§ÚIºúÜÓhÿô1T|ê›N“v¥l3ÿ-“ÿB‘±ï6ÿêè+ä¯ÛDÇkûx|›S`-ÞïËOúéç _üy’¾µ·ÿPŸA_þߺ|Þ ý¶~XZ3+èdÜ: ûdEˆú'ð«†â–ÇÙ´QE@Ï!ý½î×ö>ñãDpNžðiOèMKû Ù5‡ì‡àä¶–²~ÌÃôjÇÿ‚‘jMý‹F$06õ®lW V¥*5Ÿk[îÕ™UÊ'Þ¿à~±yÔyÞµ‡á/ØxãÃvZ¿†.c»ÓõRâÞhÎVT` °ú‚+Gί“i§fyüê<ïZ«ç{ׇ~Û¿¶…‡ì›àH嶆=CÄz±h´Û6'fF7K&9ع\É$ŽHÖ… âª*TÕä˧NUd¡«=é®BýãŠoÛ£îëù×âÅÏÚ_Æßõ™n>%x“SÔRX[ý¤Çk²@¸Eô铎I5ÄI7ÊrX.3–ç¾¶ŸÍÅ9ÖIù+þ7_‘ëÇ&m{Ó×Óþ ûëöäþúþt}º>î¿~‰IUP€ç0Nï΢…”ü£鎘ü*ÿÔïúÿ’ÿöÅcÓÏÃþ û÷öäþúþt}º>î¿~É)b#À^3O*ç–é‘Ôêwý?ÿÉû`þÆÿ§Ÿ‡ü÷ïíÉýõüèût}Ý:ü %x,`äw?¥EàΨñ¡c€@<Ñþ§Óÿü—ÿ¶ìoúyøÁ?~¾ÜŸß_ηGÝ×ó¯Àç‹$`ª©‡OcIß0¶"íÜGúÿOÿò_þØ?±¿éçáÿýó¨z8üéVà0àæ¿.X7Êd1ȯAø7ûUxÿà6©ÇÃOj1CÙM+Kg7³Bä®;da‡b+:¼5éÖMù«~7dË&’^ìõô?nüê<ïZðÏØ«öÊÓ?k‡¯yI§øƒK+©bp‰ÈùdŒžLoƒŒò`sŒŸhó«ä«Ðž£¥QZKsÈ© S“Œ–¨·çQçzÕ_;Þ“ÎÅdAoΦµÊ§ß WÍ?·íéiû,è°é~ŠGÅÚ¤eíᓘ¬ãäyÒ€rFA ¹ óÏæwÅÚ+Æ_µi®~%ø“VÕ¶ÿ)îŠÛ§|$+„OÀ ÷òί˜ÃÚ·Ëêߢÿ‚z\º¦%s7d~ã}¹?¾¿n»¯ç_Jv0v  oZ$rèWËåÎÜg¯ç^¿úÿOÿò_þØìþÆÿ§Ÿ‡ü÷ßíÉýõüèût}Ý:ü…’L¨Á'×·áL2—˜¬l1Éáxêwý?ÿÉû`þÆÿ§Ÿ‡ü÷ûíÉýõüèût}Ý:üHDR«Ž uÆ1ùTŽT&v«0RëÿÖ£ýNÿ§ÿù/ÿlØßôóðÿ‚~û}¹?¾¿n»¯ç_€ÐN%¸(cFnIÁî8«E–û˰ŒŒÌ?Ôïúÿ’ÿöÁýýÿÃþ ûãöäþúþt Ô?Æ¿~ “|­ˆÀù3ȪÀ^~M¤²±Îqî(ÿS¿éÿþKÿÛö7ý<ü?àŸ¿«p|§4¾w­~#üý¬þ!|ÔáŸá·‰u‚6ØÜÊÓYL;†…ÉŽ20Þ„Wê?ì_ûdi_µ¿Ã×¾´‰týwLe‡T°ÝŸ%ÈʺËFø$ ‚LŸ4Èkå±ö—æ‡uÓÕX¼¾xUÍ{£Ü|ê<ïZ«ç{ÒyÕ᜿:;ÖªùÞõógíéû{ÛþËšL:Gƒb†ÿÅÚ¤eáŽNb²‘çJÉÉ*ñ’ '£ †©Œ¨©RW“4¥JU¤¡©ôã]ûÍŠoÛuuüëðÛâwíãŒú¼·_î¿~™KÌV6ä𼂤HDR«Ž uÆ1ùQþ§Óÿü—ÿ¶ìoúyøÁ?~¾ÜŸß_ηGÝ×ó¯À—*;U˜)uÿëS œKpPƌܓƒÜqGúÿOÿò_þØ?±¿éçáÿýùûr}:>Ýw_喇-÷—a˜4ƒ$ß+b0>Lò(ÿS¿éÿþKÿÛö/÷ÿø'ï—ÛôuüéËpps_€K–PIÙµ‹+çñêÿloˆ³æ­þñ ìÖQ°ß¦ÞÊÓYN;ƒ“ê›[Þ²«Â#éÕMöjßÙ3ɤ—»;¿KµÞuw­y_ì«ûOhÿµG›oøaM­Â±·¿²fÜöW dÏñ)2·V='ί’«JtféÍY­ãÎ ÆKT[ó¨ó½j¯ï\ÇÆ‹ú?Á/‡Ú—‰$â˜oPuuüëòö—ÿ‚‰ø÷ãö±:Øj·¾ðû6 Ó,.PÿÏi )#¨'o¢Šð¹nÞi I$’;·,Í»që’úÜ?Õ©*µ_d¯ú£×§“ÎJó•ŸÞ~ùý¹?¾¿n»¯ç_€é6ÐåpyÁoîûzS•'>b„' mÏëÿ]oþ§Óÿü—ÿ¶4þÆÿ§Ÿ‡ü÷ïíÉýõüèût}Ý:üº@€Æ@<œ*òr1øö£ìþp>v0x ûQþ§Óÿü—ÿ¶ìoúyøÁ?>ÜŸß_ηGÝ×ó¯À„!¢ùñÊàƒÿÖ¨î.D$îDÛü9ã8£ýNÿ§ÿù/ÿlØ¿ôóðÿ‚~ýý¹?¾¿n»¯ç_Û3P"¤c’)Ž»!$¹åýÇÓüô£ýNÿ§ÿù/ÿlØ¿ôóðÿ‚~ú}¹?¾¿*Ý+püº\êÎ6rzqþ=kWÁ_õÿ†º¢]ø]Õ4{¸ŽD–W2BGÔ©ú~t¥ÁÎÞímÃÿO&vÒ‡ü÷“ΣÎõ¯Š?àßðQûߌúÌ^øí$ð‘ºÓuPƒQ 2ÑÈ Y@Px|ßfyÕò¸Ü\WJª×ð~hò«Ðž|“Ü·çVßÙ7xÊÈ´‘®kÎ÷­ÿ†»Æ¶Süržî: (æß´mM(ÿÓvÿÑm^yçW ~Ñ ¶+þ»·þ‹jóO:€-ùÔyÕWÎ÷¯:ý¯§+û&üP*H?ð‰j¤yèrÖ8ŠßW¥:¶¿*oîW5¡OÛT;Úí/¼ôÿ:¡µÕmï^U²ž)šòåáŒnv¶:GÖ¾aÿ‚axÂËÀŸðIƒz߉g[m;Fø{c}u+œ,QEhØŸ@ªOá_ |7ñ7ÄO~Í>ü%Õo|ãïÛ{ÆÿÄOø‡OÏÚ´}ØÝKöixòç{6³tÃA`âQ~ÖT£«Z|ÛÒý•”äÞ©(»˜BjTcZZ'¯Ê×vîïÊ’êä×Ñâ=õ3d·öfôuƒÏ_4À3ŸÒ®yÕñdŸðA/Ùhü7]ßáÑ‚ú3ç'ˆãÕn†¾—YÜ.…÷™¼ÈçÁÌyãfß–ø$÷Åÿè¾#ø¿ðö”ñ ߌ|QðYµ´°ñÖZçYÑo`3ØIrù;î#‡cÏݱÙEs9GªWòjé?;êºm÷î£ÏÒöóWÚþ]/}캣í?::ªùÞôžu :?I¿Æºoýu?ú Wº‚¼á¼›¼s§×Cÿ µ{Øè($ÿVßJùÞúMºÞ¤?éîOç_DIþ­¾•ó~©&w½~q|>ø#ücö°ø­â_Ú¶çVÔ¾|!ñ\þ ðŸ‚#»šÎÃTÔ,¶}¯Q¿XZàù„Á8ÚJ‘Ãr—,WFß’M/ͤ½{j ¨Ç™÷²ónïòM·úÙ£Úf½g­ÀeÑ®í®âixeYL©5dÍÍ~oþÝŸðM]ö'øW­ü|ÿ‚a[…_þZnûNÓn¦]Åzu°2\YßY1°ò|ÖR¡NáÔ6×OpøÅÿyøaû>üø7ão‹6Þ)ƒHøÙ§­îŒÚ~šož Î;˜à–$o4¼†XáMˆã{ Å,iÅËk4ŸÏá·{Ù¥Öé«mzä•Öš4ßþnkö²iú?T¾°ó³A›šøïFÿ‚¿hz'Äïxwö”øMñ‡àå¯Ä¨ì‘'Ưx#öŒøUñ_àÝïÄ¿†µéöɦê—M÷,Ìö÷n_ø¹ñ %Ôu=Â6Pʺ»ŒÆ÷÷7E ÁT±bIznmZÞw]õ[¯–ï²Õ‹{ùYýú/½è»½§<ïZ<êðØûþ áÛ QñV‰£é>)ðWŽ< :Aâ/ x¦ÄXêº^ðLR•Wt’,²#° ‚q¸gÊü@ñ}׉õÙóà÷ÆÏŠ~ðuÌ–š‹¼5£[Ë¥Ü<|Jl|ë˜ä½XÈ;ŒHzdeJ³Mû_åÞý¼Áj›]íóíëä}«çzÑçWç¯ü³öÆø}yðgö§ø×uâXáøq'Å-S]þ׺†h¶Úgi䨓wE…Ü[  ’3Ö[Ám<9¦xsEñ‡Åƒ¿üð£_ºK{ok:)¦@’6ØnnbŽw¸‚ÚBWd­ÌB>õ;?q5fãÓéÏÒ~wº]ìÇ%fíª¼’}ù^ëðoµÑö÷ëVtywjöƒþ›'þ„+"Öþ;Ûh粑&†e’#WR2#‚=jþƒ&írÌgþ['óž‚Nú£è‹õ ôòí‰{·íçðËPóý¢Eqè­"¨?Ü úºßýB}|‡ûXZ¨ÿ‚“|šþdHDô‘f˜Ì²W Äϯ袊ž!ÿDسÇ`ò­Hú‹Èýq]ìZñÉû'ü>6ï½±-Á>„.üGá\·üÅ™boy@œý„vn·­ßØ@cöAðÇÿÁÁïó·?_Ưì“öÚM¶èþžWú×”yÞõꟴÓmð݉ÿ§•¯ óýê 9ÚWÇw>øŸYÒŽ.tí6ââ?fHÙ‡ê+ñb[‰¯f’[™æ›/#X“ž¹=úõûûgÉæ~Í2Rxm&èä&¯Ç™Ï—pêà2·ãÌWÝð„W³«.·G¿“%Ë6DâDÜäãqÿ^P\ÝÎ1ôèiè7# 2€2ÃüûÓ’’˜8'æçs_b{")V]Œ ÎN9É÷¥•°ªQÈ8?xV¯…|«üB×í´o‡ú&§®jפ­µ•…»ÜÜNB–!"Y˜…VcÀ×lŸ±'Æ(yŸþ(¤øE¯ëåVs­ nÓ’^¬—8Åٳ̢ýöæ„3ÝFBŸCúu©!ÆÆ9V6ÏP¹{ ßøðcÅŸ/­-¾(x_Äž¸¾Bööú¶›=ƒÝ(8,‹")q’Æy5ßh¿ðN¯Žç‡F¯¥|)ñ ³ dRúT©+/\¤LŒl)ÏÍL±4¡9M$úÝXR©ÚòZž?p«ß+8#qŸZCµ\-°(¸û«b×ÀÚõßG†ítmVm|Ü›ÓÎ_¶½Æí¾Wó&î6cvk³—ö(øÒ±±›áÄÅUÉÏü"·Ç¹òª¥Zœ,å$¯æ9N1voSΣf’?Ü€»9*Fìþ4ÇG$¡2ØpjKÍ>}QžÏ\·¸µ¹µvŠxf£’'S†GBVTŒäT w·.zsŽA9ô«M=QC6·˜¸Ç$g88ÿëR»mÆ2qÓ¨Ô¬yÜGÌrxäÓrÙÁëýáéLÓßø$_Ä;¯þÎóéš”¦UÐõ­a'øc*’ôVǵ}aç{×Ä_ðF¹vü-ñ k/Æé„5ö—Ÿï_“g1QÇVK»>G’¯;w-Ks²6oAšü›ÿ‚–øòëÆŸµ†µì„ÛèpÁin3 Æ%<½+‘_ª×sÿ£?=«òöërßµ'‹$öˆŽ>EÞ½NŠxÉ7Ò/óGVP¯Yú~¨òI–A!8>ç°¨Ò"çsuÆ0}²*@ÿ½ÊawGçJa — íæ ’ õÇ­~Š} ØäØ,Ã<ÿ:“„ cpz–8*iꪪ<¸Ëž?‹¯ø×áþ¿ðÓÄMø‹¡ëÔ%œZj6’[Lcq•.EVÚÀd60i9$Òl/­ŒÊìrÎy uj{o·}Ìp˜ÿõ¾µ¥£|>ÕüM¡jú¿‡ômZóNÐR7Ôïí¬ä–ßMY¬m<ª¥b Àª–#$`WOáoÙCâÄOÚë ømãÍsJ¾F6÷ö:åÝ½È T••#*øe# õÒ¦UaŠIçîÎñVH7í±ç Fÿ^¢™º1äB’tÜ?—µu~ø×àìvÿð´ü%â_ ý¨”‡û[I¸±9eEÜ~•gÀ?³÷Ä‹šTº‡ÂOx»Åu¼ÆÞk'F¹¾†9B†1³ÄŒ¡°ÊpyÁsKÚן™[½ô8¥vô9(ƒ€Ä`1çô§™®FgÄlGãÏ¿½8TEx;¯!¦¤®ˆæÙÜ»Oc»þT¿u@éŽ)’Y÷3·¹S ƒ'±ö>µc>ÿ‚\øþëÁÿµ–ii1úýµÅœéž,m2“î©õ¯Õñ>GÖ¿àŸ·öÂðIÁÉ–ä–Ï_ôY«õæ9ÿv¼ö¯Î¸²*8ȵÖ+ógÍæé*ËÓõeã5E{uäÚÈÀòªMAçûÔ”ßèsü&¾`òÏÇÚÿÇ7Ÿ¿i¯_jî] Õ%²„±ÂÞR€:#ÏÔ“Þ¼ÊTp[9 õcÐûWiûEDzá¿âwxØç¡ûú×ýæ"*=èqþ¿cÁÅF…4¶å_‘ötRTâ—dF#%YÜàó’þ#ØTˆÛx‹8‚3ÇãG”¨7aÈà’3ê*}Š£ s܆ÇnµÒjFHŽ6òÑ@<†'æ½F–]‘‚ÍÝW¯××­vžý›>#|SÑUøeàø‡K2˜~Õ¥è—W¶ûד̊2»†á‘œŒôæ¶¿áˆ>1Î>üO‰Ç%¿á¾ãÜCÅe,E(;Ji?TG´†ÜÈóPï™`œœWŸ©íI{ìVTÀc¡Í^’b/Œwczü"ø–âURþkö:ƒŸ+õ§Iû|e¶–(ßá?Ä­×±ðµúï` m_Ýrp¬qè¥OÖhÿ:ûÐ{X2ûÏ2vŒ&èÛï0þ*’Ä”@Ͼö}€íI¨A>w47±4 4r$ŠC£ƒ‚¬B0r kë¿ ¼Màï éZÏ‹|=¯iš>¼¥ôËë­>X-µ%­åu (†J’Ejçmw.öv{™O–ÌËôÚ1ŽßΫͽ.»[ýî½:ãéRÊã?»bàx<ßÞ `#˜³08€*€‘þAó‚íŽ8ýkèø%ßÄ ¿þÖ:=¤Ì-üAkqe:g† L¤öÈh‡>çÔ×Î%ŽALãÏ÷O¯5ìÿðOvÛûaø$í?~䓟úuš¸3X©`ë'ü²üÏ‹IÑû3öO•Ï­w½SIþQÍ/Ÿï_‘M¨^ýžÆið)5øÑû[xæóâí'ã CWrï©-¤@œ€‘7”£Ï=ëöZŸþ%7ÿË3_‹¿3Æ¿2á¿âsxqÏO=ûú××pŒS¯Qõ·ê{:^ÒOÈä%G³’V=µ0FJ³¹Áç$üG°©#?¼ÄE@'¡?ÏøQå* ÅXFr8$ŒúŠûãèo1gFxüiäˆão-Èb~`{Ô›F2ç¹ ŽÝk¿Ò?c‹úÞŸ îð«âEÍ•ìI=¼ÐxjöXg€eda ApEDêFš¼Ú^¤ÊqŽìó€D²ìŒnê½~¾½j@ï™`œœWŸ©í[Þ"ø5âŸøÎÛÃþ*ð¿ˆô_­fâ+«Kûw‚âë‰#p[œà€hHÊÖ{Žé•oc]ŠÊ˜ s´1ù©®Ñ„Ý1»}æÅJ !XIÁ})²ÈÃ$mÙŽ§œš±’ÂX’ˆ9à7Þϰ©^7-™—é´c¿W…ðH± ô©eqŸÝ±p<@ïï@M½.»[ýî½:ãéN|à‚;cŽ?Z€ŽbÌÀà`¦–93Œc?Ý>¼ÐÙ_ðF¿ÝiŸ|E ‰XÙêZP½dÎ@xeDë‰Ûô¯Ò/;Þ¿-ÿà‘’yµæðüäœÿÓŵ~ž ø׿|O±òkª_‘ó¢¶!ú"éš¾ÿ‚Ì|B»‹MðŸ†í\­¥ìó]Π‘¸Æª«œuÿ\ÇOJû‹Ï÷¯Ï¿ø,gï|]á#œb¾ÙïJÇ⥘ROÏòfyrO ùþLøªEwvØà:ÔF6™ö¾zcƒëOYW8Y€G þtãžhŠðT‘ïÍ~¦}XųnÜBz“Ÿ­JfÞc üœÔ°Øn O8Áã¿ô¨îrHŒÇëósü½¨–Uù…W'žüi|§Ò™ù‰pp>”;=wŒä½óÒ›$@¦Æ>j« O@zP…au.ª»FwFÑþ5^šñÖ•­èÒ˜nt‹Èo##ƒ¹0þ_LWîN“¨}·M†Lòè ~ ï%X°' gî×î„gχ­9ÿ–kü«â8Æ*ôe×Þý9Jð~¿¡¼f®áD›¼qh?ÞþUÈyþõÓü“-³*ø£Ã>…‚ŠóÚA¶ÚéõÜÿè ^[çW§~ÒçmŽ˜é¹ÿм›Ï  fjó¿Úú\þÉ¿ýJZ¯þ‘Ë]ÏŸïT)ø7QðïÄ'N×´b¶½ÓïàYí®£=Uã`C¯±®ÇQÆN¬>'&ÿíÛrò¿T窽”¯º²ä$éÂŒöQKÒW½×§,OKdzwÔ›Åúdmj}JÁ4u·ûc_µÂ e‡nï4Ë»6ó»8Ç9¯‰?à”¾%ö‘ý¯?j?ž IÔ¾ojí£‰7ù™û!ºØFÿ›iãÚ¾¬ðOƒô†ÞÓ´‡º^Ÿ¢hzD keacÁmiŒ*Gª£Ð ˆ5J^VKµÚmßåoüœ¥Ëȶm_Í-R·­žýîo™¨óª§ŸïGŸHGWð¾Mþ<Ó¿ß?ú ¯ GA_;|%“Ä ?œüÇÿA5ôHè($ÿVßJùŸ[—o‰uAévõôÄŸêÛé_/øŠ]¾*ÕGý=¿ô ί„¿à•?­>~Ò?´GÀ/ŠsÃ¥øÖˆ:ŸŽ4X&>_öæ‘©•ž9­wcÍòÈ+&ÝÛKž>âóýëÇj¿Ø7á7í«”ÿ´_„­õGAK¥ê–÷3XjZsÜ<›»wITn¶îÛ2¢2”%u³N/Ñ´ôóN+Õ]i¸¥Í$÷NëÖÍ~*Oðô|/üGö™Ð¾þÁ^=Óu™ "i7>ðÖ‹oûËíbúú3l‰#æ}žvöÀè¸êÊδ¶ ~Çš÷ü—@ý¥n4ø¬¼{ý‹s76Ö÷é¤Co ¥ŽBª]˜›yávî$‘õÀ¯ø%ÁÙóâ´^;ð—…¯5ÚÆ"µ×ÚAÝ$õ×WwÓK-5ÙK8KH¨Ôù¹FÏòI.º÷VËÿƒ|E¤?üoÄ»ÛwâkN—á;¥U¼½ÔΡnñ‹`A%ÕF;pv‚23šÃø™ð~ïâçüWÆšŸì=ñßRøeñ·ÂþÒ,üi êþ]_GÖìJ4–®‰1CǘUå…Ø) aY˜·¬üÿ‚LüýŸ¾&è¾0ðƒnç×¼3Ùt9õ{PÖC‹²ÚEy<‰1ò²ËÎÉÏCûKÿÁ:þþÖßto|eðÍÃø¿Ãðµ­Ž»¤êךF¥ 'vb7rÆîŸ;à1;w¾ÜnlÚ´R·ó7éxò¯/ñwNÝómÍrËk[ÕÝ7--¶w—[kÿéý£uÝãßÇÿþÓ^øY£üIøws¥Üø—Åž_"ËÄÐOm#[Kwæþõ&†°•Ø(8]ª~¾Ò5ëOév÷Ú Ýµõ•ÜbX.-åYb™Èdu$0> â¼àì/ðŸötøEâ/ü ð¶•áÿ Ƹ¦îââïX3«,­sy,<ŒVG™2»ŽÜWkð[ᆿgŸ…š‚~i¿Øþðݰ³Ó¬…ijýž I æLÍ#rO,ÄóÖœ¥’ŠõiYéÓ¥¾{hBVÛ«¥½o­ûi«ÜìüêõßÙá·hW‡þ›A^/çûײþÎ-»Ã·dÿÏcü…IG£× ûAœxÏý7ÿCÜ× ûCœ|=“þ»Gÿ¡ ñ;Þ¾ÿ‚›ë–^ÿ‚ƒ~Åþ ø¡*[xËÅ:Õ•ÕÅÔlàÕ.4ðšq“wüÕ“cºCŠû\Ïï\oÇÏ€~ ý¨~ê^ øûáëøgUP.,®ÁÆG*èêCÅ"žVDee<‚(»Œ£4¯fŸõçÙôv} Œ¬¤ŸT×ÞšòîpŸ·‡Æ¿…?ôO‡iûOøu<]q¯øÛLÓ¼'¥Gc íßöËÈVÞææt äîfiAʃ’ÁOÿÁ4õ­/Aý½ÿloøª[xþ!ÜxÚ×W‘%M—WZ+ØÄ,YX€dŠ=Ò¯dûàŸHø ÿ°øû8|OÓüiðïÂWw)Ñ­~Ã¥ê:Ö·}¬Ë¤A‚<»Ay<‹ Ì  `ƒ½ûJÿÁ>>~Ö~6Òeøév>'ÿÁ]~)Eð½ö·áÏÙóPÑ|A6Ÿ’Ðj7^m…«È®\l˨#pS×û¾Ïÿ_ñ¯ø%¾]iñiº/‡b³Õ: ³¿ˆ¶‰¸Ïód%€Èp܆ú—ì¿û!ü7ýŒüw þÍþ¶ðí–¡r×—ÒùÒÝ]ê±$Éqs;¼³7'ÜíŠòŸÿÁÿgOüD×üKªø{KÏηZí¦›¯j:v¬Èvnl­î bX©L1f, f%A{8¸§{¥÷©N[výã[ô]ôs—µ|ÒѧørÂ;÷÷Û«^gç‹5­âüö²Ö> ]Goà{¿Ú-õ¶ÚÚ-õ¬:a¼Ó[ífág€e$òÊWñÍ}û`|7ø­qûxÇXøÿû\ü7‡á&µáçŽûP´øO±ÜXÜDZ~ÌWSmï ‘D{%™vóŠú¿áGìkð«àoÃßxGáOt ž6¼žûZÑcƒ~{$Ф2³91ÇG)‰cÀ?.IÏ‘xWþ­û6x?Ä:Uîà ‹«Mùµ-7G¿×õ+íÆá‰&DÓç¸k~¬Ç óÓ¥9F2§ìºZ+¾ÐŒ%¦—ønµ[ën•:­ÔöË{ÉÙi¼œ•ž¶ÞÏGÒÛ;û§ìáèüû*|4Ñíu{Í~-/ÂÚm¤zÕƒØO¨"ZÄ«4–Òð3ÆÄ²A$Šõ I»ÄCþ›'ó¬o;Ž+CÂrîñ5ˆÏü¶_çZV¨ëT•GÕ·÷ýß‘…(*pŒEcé›õ ôñGíæ¿gÿ‚‚|žbÞY»Ó×ô#Qëÿʾ׷ÿPŸA_~ÞZ\·?·'ÀI$È“S· Ç%’ö&oЭ(nT¶>È¢Š*xgüÚ?Ø£Ææ䥘ãÐÞÛƒúfºØšóíß²gÃ÷ ·n xÿtmÏã·5ÌÁM2?bÅy±éü_éÖüÞý„.Eßìƒà&^Ú`OûåÙ¥_Ù'í?j·ÂöGþžSù׋ùÜײþÔí·ÂVgþžSù׈yÞõuûd9“önñz®76•rë“Wä ¹ÇÌ xäcœûŸð¯×ŸÚêMÿ³×Š€8Λp3éû¶¯È¹Y¡Ú»±óz{þu÷|!ü*¾«ò=ü›áŸ©]r;$pOHà§41åpßt`xúâ$.²«I&OL`œúði am°ñžƒùæ¾ÄöKžñÖ·ðßÅ6z߀µODÖ,ÙŒÖOm=¾T©Ù,d2åYÁ:û«ö|ý©>%kßðK/ÚÄZïÄ_ÞkÚ.©£&ŸªI®]5å‚Éu¸†bûã €A ç&¾–ÕÜb?”çÔþ5õÿìÉÿ‡@þÒJ°5mç<ŸôÈ{×™šÓ„èsJ)¾júr*u(¶¾ÚýNŸþ •ñSø›ñÇ?i­kÄ?Àÿ \ëZT:Ö¡-öÛ®Z=¦fm¿êä+€Å_‚ªkÀ|]ÿøÕ㉳ø¶ëâO‹¬õ9. ÄQYês[Ú[ ‚"ŽÝ[ˤ7;·d“ë_ðH?èÞ!ñÏÄo…9Ô"Ò"øÅá[ ÊîS€·¸a çÔ¬’3ó2ªòX òoÁ>¾4x[â‹ø>_‡-ºÕ–à[#Úé²Ëk?8GrË1wó7;ˆÁÆ…cg©/v<·µ­ys[¦ûüŒéªj¥oimÖÿËÊ¿ ó|Ï£üû[ø{öÇÿ‚…þÎ~&ÓtK3Ç6’Úiþ-¼dŽ85k˜Âìš%Œ“ÞQ–í(¼„ñÓǵ¦ûbxå>]|s—K‡Åš€Ò#·‡Q¸ÓÄêO($l -ݸlÛŽÕµá¿ÙŸÁ¿²/üöpð_…5 õ/Á=µ×™.–âÒÒòM¬Â‚¤~ðüÜ”h›uyí‹û||kð÷í3ñ7@ðïÄïéÚNŸâ}RÊÒÞÒùáðÇu""#! ¡T0GJã¥N*SXX§YÛ›ks­´z/÷lcNÒ£PŠ·$>.׿ ÿ‚Úÿ´‚_Å)¥Cã¹|§¿ŒÀ) ¨û„› ]Áv’NÏ/ªí¯Œ7yLTÚ½{j^ø›R¸Ô|Ayu¨_ÞÈÒÜÜÜÈÒË;“–fv$³s’I5Q¤ÁwÊxCkÛÀáž„i7{_m®ö^Jö^G§JÎ…ïd—ܬ6}©› ™¹ÊÒ¯ò xäwÿ <̱X)ã8þþªs ;ÊœóŒŽ2}묳ôþêå>xˆ8ÚF®Ã òÂû3Îæ¾-ÿ‚?oðÇÄ*üŘŸûñ }‘ç{×äùßûõoSä±ßÇŸ©5äßè¯þí~E~Û·ü57‹ÈS´ÜEóÓ÷ö¯Ö«É³k'ûµù-ûe1oÚcÅŽ®ÜÜ ö¹N•êð—ûäÿÂÿ8YGñŸ§ê)“çm¸sâùš%$ÂD¤©cÏlÓ¤W¸„'çÏéMPså7ËÕ”‚~‚¿C>ŒŽBÌW p Sõ¯°?๻GíÆìYAÓ~¿êÛ¡¯J9qµFGãŠû¿þ Õð#Å´/‹üñ›àf‡«x³ÁÞ1ð­Œms¤Û½ßØ®cÞ)cŒ†A–x:žF+ËÇISÄá§'ey«ù¸«}ög,¦¡‰Þñ’ÿÉ ÿFy¿ìE¶?Øö®hCÿßðI$¦Ë^‰ûT|wñÏÁÏø'ïì²ÿ¼aâ 6¥¤jÿlF©5˜¹Ù<<Ï)—~ÝÏŒçŽ1“Tþ|Ö?e?ø%Wƽ_ãö›wá›ß‰·š^“ ØjP4·žDæV%ðÊ„<Œ2 í‰›T›¿µ_ÀÏüdÿ‚|þËGàÿ„“=ð¶ß<<Ï)fíÝvœt5çV:¸®fÓ‡µŠ¿M(JÿsüNHJ¯=œªoå/Í2ïükö¿ñOíWñïàOíw«ÝøóÁÿ,.­mÛUo´Þi·QÂó$ÑÎÀ¿&Æâv¸FR¸mÓþÏV_¾Á*>'iߦñ<^/Òþ'-‘ ½ÇÛHm–]¦ßç)òóØŒf«Á6d_~Ê_®¾<þךEð÷Nº¸¶MX}–óS»–'…!ŽÙðã‰s˜ÕCe¶Ÿ¾?ø³À?ðIŸŠ~4øi¬ÞøsÄÄå™î¬O—"yÐÛ3ªœp 8úVÕM՚¥ËzW·ÃÏí4ÛËâ·K\VNmRIÇ™[µùeÍkÛ¿;ù÷ü³Äµë‰Ÿ· xÚçá ð¥ìš¬Þ8†qJ@ÛäÍv<Âv‰r¨JŽ ¶üÊ”åXnn9?çë^‹ñOö³øŸñÓK:wÅÿx¯Ä~C‹+½BVµfS•f‡; Бšó¶;í#päü¹Í{X,¨U©ZvNJ*ÑÛKëêïÛdŽì=Kšý]ì¶Z%ú ,›I·=‘õÄp8Ú›óƒŽÔ¯.J˜Ã7|íþ\S€2(,©öÎ+Ò:aý€ö½ðaÚpf¸9ÇOôY«õ¾9¾Eú üŽý£Eý®¼$|>à(õë5~³G7îמ¿<âß÷È…~r>s7þ2ôýYsÎõ¨u)¿ÐfÿtÔ~vj Foô yþ_,yGã§í Y><øÈ2•Y»ùç™XùW'ï *x`:ýMw´`døçãF~uKƒøï8Çç\4ñ´Ñ†2¼Œÿúº×ìx7zÿ¿#í(ÿ>ˆeÁÌ@HJrFqQÝ;fÜ~N@Ö¦ÚNሎÉ+óÃ¥G$o.J(ޏàvþ•Òhv¿ÿiÿˆÿ ü8tŸ…ß¼eá­)¥3-+[¹´‡Ìlp‘8ŽO^=«ì¯ø,_íKñ/áoí“&•ðËâ´9¼?§Ïö-;Z¹µ·ó³yq¸\±êqÏzüüŽmvbIäõÅ}“ÿÄçöå`ßô.i¸ÈÈËjò1´)ˇ¼V¼÷Ó}ç'³‡Ö‹á“ÿÉ vŸðFÿÚ‡âgÄÿÛcIÑþ$|@ñ¾»¤>‘~Íc¨ëw7VÛ’Pùr9\‚8Å|áá_ø(Æox÷DÖî¾&xÏW}ý/á²Õ5Ë«»IÙ %܆VFt#®ò+Öà‡Ðˆ¿o†É}Q8ôÿG5òó7Úä+ḀOÔÓŽ“ÇTN Ü迚¡ 0JðqV÷Wßô§âì á¿Û³ã÷‚¾6ü'žÛIøGãÛyu¿•":Í·7‘1Êíi˜2ïÉd?)P~Pÿ‚‡þשû[|r3øE<+Ѽ-§GŽ+k8ð¢AÆÆ“hb0Qì½GöWñ&£¦ÁitÛûÛxUÒR)0÷G0<ÄŒŠøÎ4,–^@Çó¬pWóŒåxÒ|°]¹¢¥¯v””W’}Ç‚ƒ’”æîÓq^ŠÚú½.ü×;1•ÜýxÁÇùõ¡Ù6†;w6B…9ÇÔR»mS´Ž9`W9ÿ?Ò˜òüÀƸÎH¯pî7 ¡ :½“þ þ µ÷‚þFÇ›rw`ϤÚñí»€ó)ôÏ¿á^½ûÆ‘þ×~ uã3Üì·ú,ßã\9ŸûoðËòf¯àÏÑþGë’Mò®})|îj¢M”J_;Þ¿!>8]foø”ÜgþyšüeøæÌ¿ü]¸±wóÏúæÀü«ö?Y›:MÇýs5øíñÛr|cñc#¿:­Ñü|ÖÆ?:úîþ=OOÔö2âKÐãdýãáCåO _©¤¸9ˆ BNHÎ)óÆÓFÊ6ðr3ÿêëI´Ã’Wæ?‡Jûãènƒ3n?' ë_£ÿðQŸüyÒ¼Að®?Ù~÷âÔ ü8ÑÚtðÃjÕ®I˜1o³|žfß/?ŹãùÅ$o.J(ޏàvþ•ú ÿ6ý®þ'|ñgÂàÏüAá½.ëᮑw-µÆÈÚbgC!ëµgý‘^NeN­›»ßo…úœˆÊXˆ(¤ýÙoë³ñáø“ã¯ØÃà\µ­ýׇþ,ß|S²´ð¦¥©Y'öå‹_>X û$ØÌ$pX7òA>#áŸØÄ¶_í£ñÃ@ñ·ÄxÄ~ ¸¸º»×/ôÑ:«Çp"/"Fà[.ÀOÊ.éÍxçì÷ñcÅm…š§ÅÏkž'Ô—ÅšLkuª^Éw"¯Û£;U¤$ª‚I 0xößìïðßPø±ûkþÚ~ð”ñêx—HÖ4ëFvÚ‹,· î=fûW™Z2ÞyE¥'ËE¢Ö+ën¯k½m±Œù°°qRµ¹5²ÑJr¿É'eúàÏø'_ÁßÚ æÿŸ²wÇWñÄm:ÚYí´ýKB{ xĹu¶•›äOYl‡™~Éÿ°ÐøÓ ø¿Æ¼QÇ^qo­j·6Osp×DöX`—ä‚è±lW§ÿÁ1¿c‰ž ý¹4-sâW…uÿè_¥¸Ô5½WU´kKkhã†@TK*ì}å€ù ù 88‡³þÏ_â÷ì_ñ²>ð·Å-^ÇâmçŠ[Ãþ˜×­6t—<6ÈêÍ0Û&' "€IÞ#W ÍUyÕ¢ïîû·—-î’JëU}­}‡:Ó„¥N2º¼uÒú©6¯µôZÿ{Ðù›ãì?àmSà·ñ;ö'ø74? O ¿‰4ÝCM{-OK¶Øç Ç™×hk͵Â|¾çcf2»Ÿ¯8ÿ>µú(þ?øì?ñƒÄ:ßÁï„?¼7}a‹6|1y¦_ø…¦b‚;U3d´e÷tdÜO÷\¯çc¶Õ;Hã–sŸóý+ÑË+U¨êBrº‹VÕ7ªM¦ÒI÷ïgg±Ù…”§Íѵø/Ç[iùÜGdÚíÜÙ çQLÀhBßÅŽƒð¥y~`c Üg$S¶î̧Ó>ÿ…z§Aôïü[1~Ó·™RÐf9Àç÷öÕúh&àWæ?ü}/ÚjõãÀ ¡Îôh·¯ÒÑ7šü׊?ߟ¢>g5þ;ôE¿;Ö¿?¿à°ìÍã˜Ô?î®° Ç?¹¯½üì×Á?ðWf2x¯Â¥YT¹ ç÷]kŸ‡äaKçÿ¤³<»ýâ?ÉŸ<Ÿ(?;î=1Ȥ‹1ûG*Oòâ¥bîî«'Ý<ž˜ëÅB±˜¾RÉ'ÍœÇúWêGÕ©+"sËrIæ£R)!Q°€»ù?—ãSÌ­óª{ü£ðü¹¨d¶u—|­žãóÀSÍÜ÷)—µ¥ï’7[»9såÊ lØÎÊØaÜ Ô¿¾x¿à½·‡®~'èSèñx§LVÒd“Ë•/md¬ŠÈÄt ”8eÈÈ*¬­%®‹]ÚÝ|¬þá)'k=õùwüQÉf9P ΅ǯҒA½I•Ç<¯òÍ“%ˆˆÙ§4¸ »,Ë× Á>½(BÎ r1@ †a¸&Héþx¯Ü KÚÿ×5þUø~Ð#à ³0qþ~ÛxJoø§íyÿ–kü«âxÇþ\Ûßûiáç?òïçúžw­uŸ¤Ýñ×ýÖþUÄùÙ®¿àl›þ!Û¸ßÒ¾$ðϤ‡AE ¢€<«ömºfšé¹ÿмtÍ^¿ûR¶Ý#N?ôßÿejño;Þ€-ùÜÒª¯Gï@üîi ÕWΣÎ÷  ~w4†j«çQç{п;šC5Uó¨ó½è²ø9&ÿˆšÕ¿ô_GŽ‚¾iø'&ÿˆöVþUô°è($ÿVßJù_Å2mñv®?éíÿ¥}Q'ú¶úWÉþ0“oŒõqÿOmü…CçRùÜUO;Þ:€-yÔ¾wSÎ÷£Î  ^u/ÅTó½èó¨×KçqU<ïz<êµçW¶þÍM»ÃGþ›é^ç{׺þ̇w„îý6?Ò€=2¸OÚ$ãáÔ¿õÕ?ô!]Ýp_´qÛðÚsé"èB€<ÍÍ'ULÔyÞôlÍÍ'ULÔyÞôlÍÍ'ULÔyÞôlÍÍ'ULÔyÞôlÍÍiø2MÞ*ÓÇý6_çX&jÖð,»¼a§úl(ê‹õ ôòíózm?lÿÙüÄK°Ö"=^[®*úþßýB}|‘ûjÚEwûvü Ë‹Íä{-Äl¿¨5pÜRØúêŠ(¨ä·Ž»û øö Á”M4Ü÷¢t•ñä?ì=¢¶ƒû$x LšDW?„¹”~Tà w“XþÇ;{/¾ÖIÿu§[ÿcZß±…ËÝ~Êš¼4;dE@£ô«ì‹©íZvø:ÐÿÓÊ:ð:½×ö³;|léå?xR3‚ý¬åÝðÅ×NŸÿEšü‹ó&$ëÔ€2=¸¯ØOŽñ_Ã=ZÀþ“lñð3ÁWä³k6­]XjHRîÆfŠXÛ–R úqùWÜp|Õ«C®ó=ÜšJÓ]t2ùe` 1ÉZŒ¦òA8v#ã®{Òº"HÄ–Àë‚}zS¥™y'³È+“šûCÛ÷@œKÈÏqúV®ñZÑ|#©ø{E×u«=YhßPÓ`½’+;ãf34JBHU€#p8#"³ Ë2툔ÇcÓŒõ¦0‚Íó3`žZM)hÂÉØHäxæŠ[RÑ´m¸0?0çŒcœç½{:ÁH~:ØøQt{_ŠÞ4ŠÐ&ÀN¦æp¾‚s™G±Ü1Ú¼\;Ü (^ÿúôÉ’91ö‚ØÝÇ?䚊´iÖITŠvî®D©Âm9$ÍÇšî‘âøüA¢ë­–¹É»]NÞòHobKDÊC‡$“»9ÉÍUÖõ«ÿê—š‰nîµ CP™ç¹»º¥žâG%šGv%™‹KI'5HB ¹’EÛŽƒ€?NŒ¯™ºBí¹á}óеµH»+ÜP jU˓ӕ?¯?ZDŒA(¹ÉëótúRL§iØÌ2z(óíSyhÑ2TŽH“QL®1…'¨ù²}é’¾ç äuÉÎ(`ê ± #È8ÏÔP¤°"rsÙž(ïßø$T„|4×÷g#Uläç?¹Š¾Àó«å_ø%σ.|-ðUîõhέr÷J¬1… *ŸÄ ?}AçWä¹¼ÕLmYEév|†2JUæ×rkÙ¿Ñ$ÿt×ä¯í‡#·í3âÌpŸi@1€Iò’¿Xn_Ì·qž¢¿,¿o? Üø?öÕäÔÔ¤°[ˆŒ+¡}ÎWò"½^šŽ2I½âÿ4μ¡¥Yß·ù@‘”''#úzÒJ9ù›8êzì)¡ð0—+ŒqÐT‹*¬`1Æ:du¯ÑO¤eò:œ“ÉÎ&½à§íñ#öu°¸¶ø#ãxvÎñËÍkk>mÎÿ%Á@øoÆpÍyعEUº¥!F2|Ïß “Á>µ§±åšºìÉœ#QZJçWñ“ãïŒÿh]}5?'Ö¼Q{”‰ïîÌ©l§X£?,JH„Éæ´ü)û[|Tð†mtüKøƒ£éV åÛYØx’òÖÞÝrN#% £$œÞ¼úILßqH'¾GJ·ðç§?ZŸaMASå\«¥•¾àp‹I4t¾?øíãoŒ/ü-ø›ÅFÔ“ÕµYï|œõ(ec·ðÅTƒÇºý¿ƒ¥ðÝ®·¬/‡n®EìúP¿XËpÑ3ûa(9àk8ªùµAç8Ýùÿ…=€ÉX³œœsŸn•Jœ"¹RV*VÐr¡WÞIÃwœ…6HÔå™[°'úõ§°SƒeÀê9#ëš-T`’XÉØ2ƒV1ê7&X8ÏÞÉ’>ØÆã×±â‘ÐÂÇÉá_©cƒúÓQ˜?Ìw(ãýzöØ$˜ÿkîkŒ`àôY»Wêäs~í~‚¿0à›þ¸ñ/íi¨Û£›] ™äÁÆ÷S®}Hg?ð_¦‹.jüçŠæ§ItŠOïoõ>o6’uÒ]ù—ÜÔŒßèÿºj?;=ê;Çó-$QüCó'–~DþÑÛÏÇ¿ѵ9¶ã¾Xç?qI"6òxÁ>àW¨þÛ›Á_´F¹ò‹Sqwo» ¸`ߥy[ šÊXmn‡Šý.š©…¥(íÊ¿#ì°ÒR¥»!Îþ[88Èà“Æ? i›ìê9Ôg9êx©<ѵC`0/Qô¦¥Êc ˜Øñ¸ƒ×ž•ÚlGº"£aa¸vN+SÆþ=×~&ëO©|@ÖµjoEöÝNúKÉʨÂ)’B͵@ÀÀíYJ°,GËÈ}i¬ævW±œ?ZN)´Ú ks_Á_u߆äz·ÃkWðî« ²G}¦ßIg:\0Á‚Py¬h®^F$žì3øñK+ Tù„à¯?Ë¿Jlp'Éä¾Ô§Cøž¦‹+ߨ%mQ»¦xûÄ'…õMEÖõ‹] Z1¾£§E}$vwÍ š vHU†FàpzV2)‰·1lFÞqìÀSp Ä,Ä)ù€äÓŠ|O0£GÌG±Í $Û]A$¶Ñ*üûбè Àï×­LFT—Ž3œä¯áM¶\GÕŒ÷($Pc0±X¸ÎrNsïL•ª†''øzW¯~ÁLGíaàýÙ¾¸<øõ›ŒW#0oÞ˸ü“Í{ÿü{À×%ý£muÍ®ƒÌò`ãs«F«ŸRÏü¼üÚjž ³—òµ÷«#Ÿ%o³üOÓô›åJ<ꪲü£&:¿#><]foø•\×3ü«ñçã™vøÕâ°zVà.;þñ³šýÔŸa*K)ù5û^xf|×íµ(·Ó¸Kt•[“€=pü+êøJj8™Åîãú£ÖÉä•Y/#ÎÒ2E mäñ‚}À¤pwòÙÁÆGž1øSYÐæRÃkt)x,øsâÄoëZ#²Ú]jÓÕcŒ§Úôû×¶“iÁd,„nRTeNAÀÎkšŽù<—Ú€tèÔÓ° Ä,Ä)ù€äÓŠ¨Ñ§ã¤žúnW³Š-•»×ÅÿÚ[âÇÙ-›ãoŒüGâh­ {h¯oXmØä±“±XŽ Q“ß5´J¿>â¬zp;õëO)æTc¨ùˆö9¥¶\GÕŒ÷($UBœ).X$—–ƒIEYl8Œ©.7g9É_Â’W ªœŸáéHc0±X¸ÎrNsïMF`ß¼;—pù'š±ŸMÁ)˜¯í%y¼Ìb0x¿·í_¤‚o”Wç¿üwÁ5ßaikh¶)!HÎêìõZçýá_ °+ó.&šž>ItI~Ëæ’Oíä[s_Á]dvñO…| >íÆséû¬×Ý^v{ׯðV \]x{I×m£g‡N™’b¿À®1¸ŸMÁ:çÈf©ãé9w·Þš3ÀIGÿ­‡öí}íÜ`>§=ètd@ px=3Ž´ËyDò ‡åsê8>¼šX6Û«(ÎÞç®?ýTúÀÏ—ó†n˜Ž9æ›çG3ÿxcÇéO3¢·ÎûÁqJIÌw+6ƒØ¨ôÀP°h÷3`ÒµüOñ_ñºéËãkWÖ£ÑíÃN[ëÙ.…ª’w±Ƽá =+%åÚ6`6Ð9b3*aÎ ù¿^ý&“Õ…µ¹§â¿‰ïŽF›Œõ½WY‹F´M?OKëÙ.¾ÁlŸrw“对áW ; ±â¯ˆþ$ñ查Áã[Ö!Ñ-ÖËM†÷P–å,  ìDh0£jà +ÉŒÈû[‚[òì ?jD«™ |u Ïò¥É4’$lÏ‘·œœÿ ‹>³€¸äðGëB*ˆöÉ»ÌÏ$ðXzH‹™¿~îWÀÆ}=ê†:¹0Hd`·_­?;7Ì`u? ÒMÌŒ|é’\qøSf庌†z*tLwä Žø8ÏâzWí_„åÿŠ~×þ¹¯ò¯Ç†¾ŸâÄ-GÓä›R»ŽgjîùŸèIöû ¡µÒ CÕP ø~0šr£«™ýöÿ&xYÌ“p^¿¡¬&æ»?€’nøl?é›Jà|ì÷®ßö{“wÄ«úæßÒ¾,ñ§ÇAE ¢€<“ö¬mºžéãÿe5áÞu{wífÛ|?aÿ_û)¯ó¨ßïIçU_;Þ:€-ùÞôžuUó½èó¨ßïIçU_;Þ:€-ùÞôžuUó½èó¨ºø&ÿ‰V?ð/å_N‚¾\ø&ÿ‰Ö?FþUõè($ÿVßJù#Æòmñ¾°?éí¿¯­äÿVßJùÇÒmñæ²?éí¿  ~u/U<ê<êµçRùÕSΣΠ ^u/U<ê<êµçRùÕSΣΠ ^u{ïìºÛ¼9õ™«ç:¾…ý•ŽïÌé³P¨×ûI|2¹ÿ}ô!]õyÿí+ÿ$ºëýåþb€>t3zQçUO:;Ôг7¥uTó¨ó½M[3zQçUO:;Ôг7¥uTó¨ó½M[3zVÇÃù7xÓMôØW9çVßÉwxçLÿ–ÃùP×ÿêè+äÚðGü;àtºƒb>ZóÆÿ9¶þlÉ_[Ûÿ¨O ¯Ž?o›˜í½ð 9¿ƒU¶b~·Ðú­\7¶>Ê¢Š*xŸü_TOìa㉙¼×K¨Sÿf­Øvëퟲ?€vÒcOûä•þ•ÎÿÁKíÍÇìOãLuO±?å}o[ß°­©³ý‘<ßKY?ï¦fþµdŸ´µÑÛàKsÿO)ÿ¡WÏw­} û`6߇ðK˜ÿô!_7ùÕ.º…ÒNC _~Ù¿°Ì¾$×åñ7ÃØ‡Û™}àL=ϯ½}çSeÛ2”Öºp˜º¸*Š­fiV sÁê~Cë? Ìç¥~µ°пèoÿ| _øVýíÿïGúß[þ}/½‡öÌÿ‘’Ñx#W‰F¥žƒýL}qŠcx/[bJéZ=¿ÐäLWë_ü+ þöÿ÷À¥ÿ…a¡Ð>ßþø­õ¿çÒûØlÏùQù-5ûçÙ©3“´m þcŠö¿Ù»ö×þ!ø†Þóâ 2Yéq°s }ùG£O×é_ 0|8Ñ-œ4VàölYÚÃa[HÕô®lWâ±p‚Q¿U¹•lÖ­HòÅXÁ~·ðnŽ–‹P PÆ0+[Îõª~u/_2ye¿:¼7öÂý•ìh ”%ý¶^ @ÉCýG·øqìÞu\ŒÒ•YК©MÙ­™Pœ©ÉJ/T~Nø÷ö{ñgÃAíõ=êeFÚ% ¡×ùÄW4ÞÖ¡b©€ý…›0üN+õßSðÞŸ¬ÈFÖ)~ª g†:<éöÿ÷À¯¨§Å¸ˆÅ)Á7ßTz±Î*%¬S?%O„5¿5œi±bxÿE~?JCànfôAG]‚ÖL~xë_­_ð¬4/úÛÿß—þ†…ÿ@ûûàUÿ­õ¿çÒûÙ_Û3þT~J7‚µ¶SHÔ?t›I0¿^(oëŽÁ²µ$ÙÉýE~µ°пèoÿ| _øVýíÿïGúß[þ}/½‡öÌÿ‘’ÉàÝdF\èú›ÕM£ŸËŠkø'Z‘ÍSLœ‘öy?¿Z¿áXh_ô·ÿ¾/ü+ þöÿ÷À£ýo­ÿ>—ÞÃûfÊÉUð6±æn}'SôµúQ/ƒu–l 'S íg ?ž+õ§þ†…ÿ@ûûàRÿ°пèoÿ| ?Öúßóé}ì?¶güˆü” ׉ØtI³ÜZÉþÖ|3ý–w­Só±øRùÕòõ*J´œæîÞìò¥'6å'©oΣÍÈÁïTüê_: “Ãÿl¯Ù:Ïãÿ‡ÄÐ(R´%à”™N?‘ô¯‚AŸøó“ŸÌS¿á Ö#Œ7ö6¦äà•6®p*ýhÿ…a¡Ð>ßþø¿ð¬4/úÛÿßõ¾·üú_{í™ÿ*?%_ÁÓ•Ù¤jjÉg“ü(ÀúºÊY´Lgž-dèx¯ÖŸøVýíÿïKÿ ÃBÿ }¿ýð(ÿ[ëÏ¥÷°þÙŸò#òROkLØþÉÔÇÒÎAƒùQÿfºÇki‹wâÒNJýjÿ…a¡Ð>ßþø«ðËBC‘§ÛçýÁGúß[þ}/½‡öÌÿ•˜ ?e_üQÕa†ÇN¸²µfùå¸B›G¨gðÀúŠýý–¿g-;ö~ð\vV ^ê_žâfûò¿rð®ûNÐì´•ÆŸoXþêWD¸W™gXŒÎÑ©¤WEú÷8±8Ú˜­%¢ì\ó¨ó½jŸKçWq–ÌÙÍ|ñûh~ȶ¿´e»ÓÔGªZeáséô5ï~u@À†æµ£Zxyª”ݤ¶eBr§%(½Qù+ãOÞ*ð&¤öú¾‰vÛ[kI f@þùÔ Âÿ„KZ…öÿdj`»͈Ž=ëõÓR𦛫œêÈ}Ô¢~è_ô·ÿ¾}=>.ÄF)NšoæV9ÅDµŠg䢸?[ Ì4}T³öÒtôAžläù¿1_­_ð¬4/úÛÿß—þ†…ÿ@ûûàQþ·ÖÿŸKïaý³?äGä·ü!ºÄq†6¦äà•6Žp*GðF´åviš€s³ÉþúÓÿ ÃBÿ }¿ýð)áXh_ô·ÿ¾ë}oùô¾öÛ3þT~JÇà}\JY´OžN-dâ’OkLØþÉÔÇÒÎAÏå_­_ð¬4/úÛÿß—þ†…ÿ@ûûàQþ·ÖÿŸKïaý³?åGä ð^¼çiÒ5&ïŤœþ•Ý| ý¼eñgZ‚!e>™`Ì<Ù®©QŸáSÎ}¸õúdŸ ô8ÎWO·Èÿ`V®¤ZiI¶Âãû  Ê·âg¡Ÿ}ÈžoVJÑI×ìùð_Nøà MÃñíXW.ç—•ÏVcÜ“þq]çëTüê_:¾^s•I9IݳʔœÞå¿:¹‹,¾(xFëKÖâIb¸Œ¡ :æ¶üê_:’m;¡l~dümý‹—ÞÍ?¶güˆü”ÿ„'Y‹ hú‘Q÷‡Ù$;¿JCà­r8öÉ¥_±oK9:~Uú×ÿ ÃBÿ }¿ýð)áXh_ô·ÿ¾ë}oùô¾öÛ3þD~KGàiX‡Òµ,ÇЋWÁý)?á ÖXº.¤„d [H3úWëOü+ þöÿ÷À¥ÿ…a¡Ð>ßþø­õ¿çÒûØlÏùù&| ¬”ôHìõµsœþù<¬*á4K=2lä'ùWëGü+ þöÿ÷À¥ÿ…a¡Ð>ßþø­õ¿çÒûØlÏùù'ÿf¸œÅ¤êdzI3ŸÊ´|=ðgÅ~.ÔßAÑu+ðàdAŸRÀ Wêßü+Ì>ßö\Ó¼¥éM›8caÜ(¥ÅõÚ÷i«üÄóŠ"ÿaߨ§þ ƒ_ñÁ[ndÚ r–Êy!xžçðóõBÈ@M\"áì)Þu|Î+SQÕªï&yujÊ´œæõ-ùÕÝþÎrnø›n?é“ÿ1^qçW ~Í/»âŒþ˜¿óÎf}X: (㿵áÛáÍ<ÿÓÇþÊkÀ|ê÷¿Û íð½ÿ§ÿ šùçΠ ~v{ÑçU?:—Π ~v{ÑçU?:—Π ~v{ÑçU?:—Π ~v{ÑçU?:—ΠBýždßñFËýÖ¯ªGA_'þÎoø«gþãÿJúÀt’«o¥|sñM¿u¡ÿOMü…}'ú¶úWÆdÛñ[ôôô@þuoZ©çRyÔsΠÍëU<êO:€.yÔ½j§IçPÏ:ƒ7­Tó©<ê¹çWÑŸ²ƒnð,§þ›7ó¯š<êúSöH;¾Èé³:õzóÿÚ\ãámßûËüÅzyïí8qð¢ôúQ@0ùÞ´yÜÕO:“Π žw­w5SΤó¨çëGÍTó©<ê¹çzÑçsU<êO:€.yÞµ½ðÊ]Þ>ÒÇý6È×-çWAðª]ßô¡ÿM¿¡ ²-ÿÔ'ÐWÆ·®“%÷íÙð'Êÿ–—ö£èú6cùû2ßýB}|™ûkÜ5¿íËð¢îÍñ^ŸÞž ,殊[[QEZ|0ðÌVZxËã29ûÎÝÉ5ÕÐ8ܤzŠø÷öƒÐåðÏÅKåJÇûø˜ôcŒ0ý}‡^}ñÛ९Å})ýÍä|3/ÞC@%½èóªïŒ>ø‡À¯ˆtË™£S…¸¶MêÃÔ¯P:Àm\)ÃA~ýyËÿÄБ›Þ:³?¶þxßÿàßüMÛ+ÿ›@øimöä)%Æe*z®ãœW|ýš5?ê°j>?‡ì–p°’;\ä¹ žÿOç_PXY&ŸhÛ¨TA€jš¹Ž>“Å? µ+KoõúâºêlÑ âd`ƒ@%Á ù€£)*Êz«‚ÐÒ™«ØÿhÙžúV}gáÜk'œwÏjNŸU=ó¯¾ûf‘3G­iº¬ŠpC[3À 4oÎ÷ ÍY‡Y_ùáÿ€rÿñ4l/hoÿðoþ&€4üïz Õ˜u•ÿžÿø/ÿGöÂö†ÿÿæÿâhOÎ÷ ÍY‡Y_ùáÿ€rÿñ4£WRp°_Ÿûs›ÿ‰  /;Þ»ŸÙã@“ÄlÌAŒv`ÊävãùŸÊ¹ x^ñÕêCáÝ.íUÎ ÓÆcE¸<Ÿ¦}Yð+àÌ tL|ëÙþi¥#–?á@ôk±ôòÿíc}k7í×ðÖão› ׳6Ú#ÿÇ£5õ |Uûzlo—09}í”[½¿´0üC⮊[jÑEPßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| ?áÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÿ„IÿŸ(?ïZôPGü šOüùAÿ| Uð6”§"Ê ÿ¸+ZŠ‚ÓM‚Åqi ô=PEPM’%™q*†ôê(2ãÁÚeÓ–žÎcܨ¨ÿáÒçÊûàV½‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@+àm)NE”ÿpUûM6 Ûk ƒ=QEQEZóI¶Ô¤ƒÜf©éDäÙAÿ| Ö¢€2?áÒçÊûàQÿ&“ÿ>Pßµè  øA4Ÿùòƒþø ¤ÿÏ”÷À­z(#þM'þ| ÿ¾Kmá 6Ñ÷[ZBŒ;…¥E5#X†#juPEP: =ë>ïš}ó…ÉîTV‘ÿ&“ÿ>PßøA4Ÿùòƒþø¯Ed ¤ÿÏ”÷À£þM'þ| ÿ¾kÑ@ð‚i?óåýð(ÒAÿ(?ïZôPk-ÛO³…#ÃfŠ(¯?o«rÿ¶÷ÀC¾'Æ?òJ¿8"A<ô‚ýÿ™-Û`0g=zgš?Ö üýü#þAþ½gŸôÿ’Ãÿ‘?FGü.ÑŸ„ñ‚@8ÿ„§×þÜ©ßñ, fO…¨ÿ±£'ÿH«ópÛKts%ò9cɤJšÝ‚B"A»iϦ?Ö üýü#þAþ½gŸôÿ’Ãÿ‘?G?â —2|'ÿ„›¿oùs ÿÁÁ6ŧ\¿¯‰ñü“¯ÎYÙ¶¼ŠBõ^™?ZeÊ™‘€å×ßëGúÁÿŸ¿„È?׬óþ‚?òXò'èÊÁÂ.Ç ð™G¯üUÇþIPßðpt €Ÿ U˜öÿ„£ÿ¸«ó‹y”‘œ—˜ÿ:k áŠrH·×4¬ÿùûøGüƒýzÏ?è#ÿ%‡ÿ"~Íÿ4Qî? Ó ò§Å?‡ú/üD!_ù$˜lgÄøÿÛ:üàFœ†Ú§³Óð N²•X‰#=Xg?CGúÁÿŸ¿„È?׬óþ‚?òXò'é ÿÁÂ’°ñhù?õ3ûÿ×HßðptŠyøL¼Ÿð”súY׿ãã“å_ÛŽsÒ™,ÁT(‘“Æ­ë?þ~þÿ ÿ^³ÏúÿÉaÿÈŸ¤­ÿ?êgÇ¿ñå_› e, $g¡SÈçž)ã óFÂMÇÀœQþ°cÿçïáòõë<ÿ ü–ü‰úK'ü*àGð¡‘Ÿùñüìª5ÿƒ‚f*K|%N=ž&ÏþÙÓ£ÿƒ€¥’B£á0¶|M×ò³¯Íé&cœ…(GRsžh¶—i7;€ÊðEë?þ~þÿ ÿ^³ÏúÿÉaÿÈŸ¤Gþ ÿ2ýÿ„¼FëŸ÷þr ÿ¨@[Š;zŸô>+ósÍbG–Y²1žNóš|Q‰1»r®ÒXúýéGúÁÿŸ¿„È?׬óþ‚?òXò'èäðpd®¹ÿ…Jƒ'þ*œý#¤?ðpƒ#m“áBÇüÍ‚çÊ¿9#µ3y…B§8n¸ú~}©’ÂÏ8rÄ‚NÐ;ñÿ×4¬ÿùûøGüƒýzÏ?è#ÿ%‡ÿ"~ޝü!+„‹±‡Þÿ„£€}ÿЪSÿK¹Bü&O˜÷ñF?öο8vp¥•^N¯?ýjuÄrB§Ç¯ñ}Ïj?Ö üýü#þAþ½gŸôÿ’Ãÿ‘?Gþ•þçÂxÎFäiÿî*VÿƒÝÍð¡ ëâ|ÿí•~n­£Å*É Ä*x äççëV’]ÿ;íUQ÷ò=ý(ÿX1ÿó÷ðùúõžÐGþKþDýðp;ï ÿ ÀsÉð“g×þ<ê9?ààÙ¿ •°ÛOüUýÇ_œñ·ïÆÂGëéÁõ˜ŽF|Ý’IþXü(ÿX1ÿó÷ðùúõžÐGþKþDýOø89Üqð{ÿÌÑÿÜT/ü#1'á(Ø?ˆxŸÿ¸«ó„§š?zC篧ӊ`B\;qü8ë?þ~þÿ ÿ^³ÏúÿÉaÿÈŸ¤þ?b|&Wï”ñF~¿òåDŸðpŒŠWgÂ@ÊÄ ÿÂOÿÜUùÅ4‹ýþô9ÎëQ!YË´ ïòò¿Z?Ö üýü#þAþ½gŸôÿ’Ãÿ‘?H£ÿƒ„$ÿÉ$Àë“âqÿÈt«ÿÊäøJ¤ŸO÷~nP?wœœuÇ>ôǸ ä î'Hn}(ÿX1ÿó÷ðùúõžÐGþKþDý$ø8Xªÿ ›‘ÛþnôŠœ¿ðpl¬›¿áR¨îGü%ÿ€Uù¼I`¥Tœ“Ü~˜¦Gw”2Hb}GÒõƒÿ?ÿ¯Yçýä°ÿäOÒSÿ¸éð›#8ÿ‘›ÿ¸éŸñŒ¼øT©†è?á(!áö*üàòä’GòÕ2‚62?Mg‘½ïºNsëÖõƒÿ?ÿ¯Yçýä°ÿäOÒ+ø8Iî]„ †È?ð“õü>Åš±ü#ɆøPŠCÿ ?_ü’¯ÍqQ‰dtb1È'ÔT‚äax럩=hÿX1ÿó÷ðùúõžÐGþKþDý;ð_üçD¿ÕcOˆ_uM.Á›=Ž­ë§8Ï–ñCŸÁ«í¯‚?¼)ûDø"ü#Õíõm:””ÊÉŽ±È‡ Ž28`:ƒÐƒ_Ïjñ“7Íß§ÌÏ­}ÿ½ý¤õ?€ŸµN‡gkq0м[ršV£jÇ呜í†\g–B¼ú3 ó^–YÄUÝhÓĻŻ^É5÷t>‡‡x÷,T(f Ni^É4Þ‰éd×}<üÛŠ)–ó ˆU×£ ÓëîOÙ†É ‰ 9ÀðÇíÉÿ–Òþk÷¾ýŸ¬ì|I¯Ø»EyrÌl,¤0†™Á8eUœÕ?à°Ÿ´¡{$Öž7¶±É+-‘DƒÌ…›ó&ªø+Çí ¼ïø„àuûMçÿ%ëæ‡|üœ€@äöÇÖœªÅ˜6Ýî9È'ò¯Ñ–K—­>­ü?ä~\óüÍ»ýj§þ/ó>’ø+Çí¼ìøˆàÎt=3ÿ%¾”²Á]¿hˆÆáñ ÈÈÿ˜˜3ÿ^Õó|Ç) !0 qÿ =7Ÿü–¯œe!["7À)ÈçßΫ·Ì`{) ô£û/ÿ hàÿ þÞÌÿè*§þ/ó>ŽðW_Ú-_â•©ÐôÑŸü–¦¿üëöˆÎÕøŠëŒÇCÓqŸü¯›“ç—çûÀ1Ö•ã2«¦ñØg?•عýCÿùöögÿAU?ð9™ô”¿ðWÚ'ËÂüB“yèF‰¦ ýsmIÿyý¢D7ÄB}Yt=4àúǵ|ݼB%@@â iZg\®ÐyàýMعýCÿùöögÿAU?ð9™ôšÁ_¿h³…?Nyäè:hÿÛj‘ÿ௴:€[â+Ó?Øzh󶯛BìT°aÔ çÜÔsJá¶ Ps’zuýhþÅËÿèøÈ?·³?ú ©ÿËüϳ~Áp¾0øZ…þ'6ã}0ŸßÅ=¤v7ôŽXUOûÈãÛ½~žþʵŸ„ÿk߆±xá…Ëü­å^YO…¹°›1È Ÿ¨aÃkù÷„26'Ø™8<Ž˜íÿׯ¥?à”ß´%ÿÀ¯Úã@·K—þÆñt‹£_Ü+³’!ltܲ•ìÇzù®#ál-l4ëá`¡8«é¢in­µûXú¾ã eT0øºŽtæÒ»Õ¦ôNûÚûÜýâ› ‚h•—£ Ó«ò#ö°$(Ëp+âø(Oü/Iý—uû¯ü²²ñ/Œ-FÛÉ®†”ÝvH†–AÝ”.yl‚µïß·ǹfïÙ{ž*Óú}“ <Œ;‘DŽà;©#Ò¿Ÿ]_PŸY¾¹¼Õå–æîîVžyärÏ+±,ÌÇ9$’I'Ö¾cˆ³z˜4]¥-oÙyzŸ¨xsÁô3ùÔÆcUéAÙGù¥¾¾I[N·í£úƒXÿ‚Ï~Ñ­ûÏcã›M:9VÞßC±1 ÿdË 1üXÕ?ø|í¿-ñÂûh:g?ù-_/´œmäOóæœŠÁù*XŒr3_óšø,í""Àø&ã÷Hд±Ÿ®m©üCö’üß õ#AÓ?òV¾eÜ Ý’ª ýÜqP<¦V®ÐyàŸz?´ñŸóú_øÿ0ÿVrú¥ÿ‚áþGÓ‹ÿ•ý¤ÏÊ~$œäò|?¦ò-JÿðY/ÚA@-ñ%±ëýƒ¦;ZùŠI !@/»Ðg?ZdÒ2¨É?çš?´ñŸóú_øÿ1«9?ýRÿÁpÿ#éóÿ“ý¤>#ïOüH´Áøgì´Õÿ‚ÊþÒ^aó>#•_áØZfOþJ×ÌpîG~ÄÈÏ>Ÿç­#)dFÊôÎ0G°Qý§ŒÿŸÒÿÀŸùýYÉÿè —þ ‡ùPø,Ÿíƒ³âC0ïL§Ù~´ÿý¤˜°?êWBÓ {`}—šùŠfÞ¥KÈ£€‡pü牒m±H¬_ƒÇO¯n´iã?çô¿ð'þbÿVrú¥ÿ‚áþGÒíÿ•ý¤Û?ˆí“×:—‘í²Õ…ÿ‚È~Ñ®v‰'q´0þŸe¯—Ñw†iÊåYqòâŸó˜Q£ÎÁÀÿ´ñŸóú_øÿ0ÿVrú¥ÿ‚áþGÔMÿŒý£ψüH´ÌÃìµÁbÿhðÄ7Ä© è3 i€ü•¯˜ÛýpiHR¼p~¹þ´MpÐŽ€üî?­ÚxÏùý/ü ÿ˜«9?ýRÿÁpÿ#éÖÿ‚Å~ÒK´§Äf`p:˜¼ÿà-,ßðXŸÚB5>$;ƒÿ 0ŸÒÚ¾^óÎÒŒÀ‚2'?H¬¡Asó¯9§ÿ_éGöž3þKÿæêÎOÿ@T¿ð\?ÈúxÿÁbiQæ|F 7†ƒ¦~Ÿe¥ðXÚ>DÌ 0å”èZbퟲ×Ì!ÒL,\X–Çó§KÎR@í¿æüÆ(þÓÆÏéàOüÃýYÉÿè —þ ‡ùM¿ü/öBÀüH|`ߨ:YÿÛjDÿ‚ÆþÑîªÄrIêߨZgòû5|Ò¿6â·pFGçõ5+fÇÈá€çòëKûOÿ?¥ÿ?óõg'ÿ *_ø.ä}&à±´sä‰qœ¨ÐtÃÎÚ£_ø,íÓ×â;<å´3hú‘kÅ|ÎÄ Ø»!lucñ¥WKë…“¾Tç4ÿ´ñŸóú_øÿ0ÿVrú¥ÿ‚áþGØ_?à¹?|­¤¾<Õ´OZmµæ ¹)ÆvIj±áºàÀzý9ýˆ?o¯þÛþ ’ûÁLún·`jZ=ħ³'£)IÁÀ:`…†Øå_D·œÿ½" õsUöIê|µÿá€\| ðÖþ‰®ÆÜŒÿ˼ãú×哸’,¸%Xyä~ú­ÿÑÈø¡#X‹÷êQýkò£ÉÇa9=O@ß­~sÄËýµú#ð³wþþ£ jH1€ëœœ¸åúfŸm4™AŒŽÝãíÅØÞÊÞ˜Ü;`З?3q`Š~]ÞžÕóç‹,Mj€È¥ê3÷¾•Áö·Ùç¶GO­2ID% ~cÎ3Ö’K¶ÂHܸŽGç@‡|¶iPä†a±°<÷éIk?—#yÂ2ONAÎ{Ÿ¥>èå7ríÇÊWqß¿zlsXNGóô bPìÈù$òF9÷¦´ŠNƒîäM/Ëåà Ü0Á"˜èÆ=ð0l‘Œ=(Øpñ1Kc‚~£Žê½ÃÆA,¬Jä ÇüúÒïØ„@Àž¤uãÛ¥!mñ‘Œg=q“ÜPDP°8Ëm=;R+Ÿ0”ˆ—ãHÈáÂ>2@;Ÿnô†§h£ñ¢wdˆmçŸLÚ€#•r_-ó`Œ|Ä{/Òš»çb1XÏÜ#!½óLyÄh¾VÄfÆî™ÿg½K;(ä¸ÎNsìhcpnW,Sx §£‡g1oó¦åù©[¾Kä’#'ô¨Îxçrç ã©÷ Å IùJÌ£–ÀÆ?>™§ÇÁv´ErØ#njìF÷fáˆÎy?ãR›“F‹';ƒcŸÆ€a´´¥p?+pÏãP$‰3ŒN;œŒ{{ò*yÝ¥Ý0É9=ùþUÚÌŽsׯzu¥›\_GHåe6F9Çõ®ëöøª~Í5_øæïO¾Ô´‘ M5“ÈðJ$‰%\E< ¨ä­qºT±NÙç;UæR[Œ:ûWÔ_ðUïjz¯ü [·Òì.nî€@csÅ}Çñ;â„à«~Ò|t‘Å>°ðžµ¶cxî#òÆ{m,y?ÝÝ^oûOü5oø'ŸìS®ø 剼MñWÄ÷G <ÆÑl¤"ŒùoK‡kÑÅà(SukCøqö‘µþÜfã{5(K­ùd}e~ÁÓœªY¨QoÚ«ëð©Bݹ¤Ü<š¹ñrÊ 8`ô*xÿëÓgÛs³7Èx÷÷8¢ÙVÜ‚úúéîZemˆÈîkÀ>¯#|ìK FHc»šú?⯄>'|Cø#û=øb+]W²Ö­oWÂVšZºßH^å‚õ¥7nÚw)1b0M|â`hÔ£± zð8>øü+ô×öT¿Óô¯~Ç#[xÒY¼9â{7‘€á Éã$nQ×%€ÆkÛÊ0±ÅÆTæÝœ¡tºé'oWk/6}a6uèÊN)Æ ë´«Ñ‹¿’R½¼‘óóÁ(¯åצðÆ™ñ_ám×ÄXÔ³øe5óÌŠ¥Œ*åÖm”Ú1Ô>jùwÅÔüâKíŶÒiúž•;ÚÝÚJFøeF(ÈÞàZõ?‡_ |pmm'B†×Qÿ„âÆó#n7L·G™Ûi à£wJ×ÿ‚ ÝZxƒöðø?…LrÄ·ÐÀ̲S,vñ$À1‰ÁòZ㯠u0ôñ0‡-ÛV»kDÕõëgòØÛ2Âae†«Z…MÓ¨¡«o™57­ö”y5µ—½¶ÇxÂ?ð›øÓMÒ.µ]C‹Q`7Ú¤æKMÜy“8jŽç¾ÿ‚¤~Ì>ø%ãm?Wømªø ÆÊm:ÂÖ]Lº"ÿÌ0»5Ù€(*?y»$°â¾K¶>\4ˆ[#žz_NÿÁ\[Éý¦´rJ#xOJ #îˆàþ}E Ãê÷}ïi }cSüŸ­ü‘Ž[쿳±Žtî×%ŸkÊß×}˜p#]ç†~3·çùQ0C)€¤p¹lǵ=nm‚ /~ïN?ýUˆ nltÇá\ψ‹°Sïp<ôÉ9©"´’D^;ôæ‰X,NÈwvŒcð¦Ër»dÉ pW;X¬«’£‚yDZ¨ÛÌWùÆa¿xý)¦P’–„¬¹#'¯§ûk–’gdŒó†ê?Z._ò#aœ» Üv8éN2¤ö»X îÝ9ö¦ÌDr‘0¶õç¦>†•¤Þ‹æå¶“€>¼q@QÛæc< ‘Ï_J ”oÌxÈ<ñúÒK´°P3díÜSv•„Í„ÛܵY¸uRY£pG8œZ¬ûÛQGÌNâsš|’î?¼`×û{RHI2‡$ryû¿…4Êr«ŒŽr1íH7´aPcqàð3õÏJjEæòĽÁéí@‹§ œ@>ÿJGˆ¡% ÆrGÓñ¦C¸ŒìÚo<ÿASÔÕ¸ß)˰c!_vsïý*aÜä¬G’hYUcc¶\óí>ø<þéc\r‡îœg×Þ•ËÚäœò9'ÓéÅF]“qÉà;Я €«I ¸# ð8õ­8±d%|çøøJIŠJß{¨=?JzݶdI>U#ŸŸ?ýÖ€#¹‘#;-‚%€ü?ýuÙ~Í8oÚÀ ÿŠO8äœ}¦3øWèÓ/ÊžÀcšìÿgÌ´W€Ë‡ñœ½éê#[á¿Uù™ûÕ/ñGóGô¡œèöÙÿžküªÕUÐÿämÿ\×ùUªýtþ¨> ÿ‚ô!“à†@ÉÿŠ‚#ßýê¿)D¹Œ÷•‰e#þ&¿V?à½ry<2r@> ˆŒñökšü§! nÀÁïíÇéŠý—‚?äX¿Å#ðŸ?äm/ðÄF€eÊ`ç|¤ú`)ÑÃæüÒ0Áþ~ºÒ@å\ ƒƒ¹HäéúÓD­Jûzœ€:þ5õçÄŽ•–Snà•8)àûÿúé“Cö‚û t!½»S^áåÊ>7¯#jûçÇ2“„(#*Ãæé×4;"„£aHû®,}2{þT[¬‘HJaޤ (ïÍ$Ò+ ’0È<ࡦ ËåTÄ>ð ü›K•`Ôâ˜$$%Xn ž”ï™,¥HäÒ›öqyhÆËtçë@Å)ò¾B¸SÓóëQË,…X ^ PF#) …VSê ÷ïMíÚÛ¸¹÷ë@ Â!Îã·<àçÒš’o•€ùynçØŠV„yŠ fb3»}y¡¶žS;@9íž{qÇÖ€4  «©-ØŒcéÏ&˜ÊÂRÙWxè3S$ : ÇröÀàTr[òäoÌ(VM´0îçŸÄšU˜…Aòà¤÷ÇéQË–¤¢€@Îà{{IásT©,0ù4¬û˜˜%²3×½vß³ qûJxGdôÕvrrqžpsMY¸Á Ç-ßéŠW„PÅ™9ÇøÒ¶Üå©èÓÖ€«®C®Ob1¡ÏZc« °ŽÊ9Šš8Vuäî^ØQËmÑ^@BüÀb€_Ë`€È?w<þ&•f!|¸ÎI-ÎqL–‹ò(Î3¸Jl°¹·Ê•%†ÿëгîbc<–ÈêüzÒ,/<Ù™£ªp÷ÅF×ŵK3wÚÔö©zÇ’£®âqžÿIðäE´³¤Æ}—jpcó‰UŒTœgéHÆ([(üŽsýãëŽæ‘Ó¸ 3Ù²?zzÂa+ƘèX– }>´ä™ÂÌѸÏ\`ƒôªë†R@ÜIàcïT®ì-F (ž„¥I"´[·y™8$šª. ‘÷¦À9l7_j–iL,¤¨<1ŸÂœöêß+àqÀüè?)ÆÅ#Œ–ÎG¯øT¸Ú¼|èÇ<„ö÷¦‰ ¦v‡ÁèOõϯ2¿˜¼X’NCŸJC(` 9ಜçëÿÖ¦?™³ ÿ€ôÅH’ys1‚ËÆMFîYˆU$‘Ô/ã×>ÔèÀtÉv%¿½ý=)^,±ÇÊ1Ò‹E‘d`ÀnÆì7üsN Ó>F$uÿ>Ô]ز1;ò§ÿëÒ! ÌÑFq!ˆÆ=ªO³¬d„ˆêHÆ{Ñ$'1à(îç©ýhbŒM‡aÆG‰U#ÇœÌ[’§mÇCÖ¦ÄMÚÎ cù¦™öc:¹wÚ¿ÞU'ò€?¥…’|¥³œ“ÿ!_7~Ø‹·—Àinæ{‰##Ó÷‹°ÿßMúWÑÿ ?äžéõÁ¯˜¿k I¯¿à¤ßc—‹edBOÖi™‡ä©_·Ãsø‰Ÿ_ÑE øbëMÖcYa¹BŒdŠü¦ý¬à”^*ð/‹n¯þÛ¦¡¤ÎÅ…£<#93ÐcŒz×ÈqSW%ˆ¢®ífºú£ó.<áŒNeR8ì$yš\²ŠßFÚk¾ök}¼ÏŒb™ÎÓ†^…ØdóëHÊB0ÜÓ{ÿJõiÿbŸŠ'z¨c á*ñêkþÅ_%q»Áz‚‚H8xF;|õòŸÙØ¿ùó/üÿ‘ùöiÿ@•?ð ‘ärJVrSæ,p7b‚Ìnp Ã' 08ÅzÔ¿±7Å<¿_“ÆI’,ÿè]j'ý‰þ*d(ðf¦Àõ>l<ãôgbÿçÌ¿ðþAýšÐ%Oü_äy•µ•±–ŽÃßjxÂô JƒŒŒöµêpþÆc|¿ƒ5Œàù°çÿBíQ?ìOñJlïðf 2yX¾o¿Göv/þ|Ëÿ䨧ýTÿÀ%þG˜É‘·Ì1Ó·õ¦¤¦Û„+}H§C^¢¿±GņÁÚ·'$ !Á÷ÿYK/ì[ñSø<©dœ­‡¿Göv/þ|Ëÿ䨧ýTÿÀ%þG—î9ÆH=ÁíïŠlG4ed>»IÏ¿·~kÔçý‹þ)ã0ø3RÝß÷°þŸ=0þÅ?ß$ø?T\öó 8ã®wÑý‹ÿŸ2ÿÀ_ùöiÿ@•?ð ‘劥°wNyÛ‘Oþ½&Ý‘ä.PplúWªCû|P_õžÔqŽžlGòùéëûüS®|©^~ib'ÿC£û;ÿ>eÿ€¿òì Óþ*àÿ#Ë¡R–ß¼7'suÿ?Az ‚d¶@8ÆúWª¯ìSñMAð‡jD“Ãù‚·ÏR/ìYñI†%ðn¢rsðü¿A¾ìì_üù—þÿÈ?°3Oú©ÿ€Kü%“v?zÙùysþzR™s´=OO\â½JO؇â£c>ÔŽxx#óÑìEñOËÁðn¡#EϷߣû;ÿ>eÿ€¿òì Óþ*àÿ#ÉM¾Ùp®€œ‘×§óôâ§“ r„Žån9í^¦ß±'ÅYq¿Â +¿½ˆÿôö ~ŲAðv¦Ú%„}~ýÙØ¿ùó/üÿ`fŸô Sÿ—ùSFù¯æ2õmV>žø©$RÒ•VEÀåvíÇ·¥zŠþÄþ Ôä±Ì‘ÿ¡õ¢_Ø‹â¨9Áú'’Dú|ôgbÿçÌ¿ðþAýšÐ%Oü_äyqƒË@€-÷HÃúÒÉpƒ!óô$3Þ½A¿b_ЍùOj®\É>ÿÇJbŠŽIoj[Ž2Þl9ÿÐèþÎÅÿÏ™à/üƒû4ÿ JŸø¿ÈòÓ™rW’À#=iÅ”ïÃØ'ï/Ðô¯Q_Øâ˜$jŠHê%‡¯ý÷NOØ£â–å2ø7R däKô:?³±óæ_ø ÿ þÀÍ?è§þ/ò<­´á†ÎX}îž?:úÁßðTO^ ð –…¥ø¦ ¡Ó-þÉcyq¦[Ï}eP»gBÝ76æéÏiý‹>*.Jø/QÃpG›GþD§ŸØ§â“°Á·à“ûÈ¿\7JÚ–0æ©BjûÙIXL»<ÀIÏ F¬Òê3_’9o‹{s^3÷­·6šÛ¥ö;Fÿ†NpŸö‹@ã¾Ï£`÷þ÷½,~ÉÈ óÿh|0 >sÏûOʸi¿bÏŠŽǃoò?ƒÌˆ'¤ؿⷒ ~ÔƒŽïaêpõ·±ÅÿÐ/þHÎϪæô-ÿÊR;ƒì–2<ÿÚ!Aê8ÁÇ?ÇÅywŒ¾l1“*¸±Á+h~Å_С>Ô[Ïï"ÆO_ã§ÿÃüPòÎ|¨g<áâÿÇê'‡ÇJÜ´eHÉ]ôoÍtívc_›U‹„0R…÷å§5utìû«¤íÝ'Ðï.ÿà«§ðãØÜx¶î'ƒìÍ©&•j—æ.x¬`ƒþлƒžk™øc/À=SÁÉûBÝüe“ÅsÉ,—Òhi§Ifù”*÷ $,WibßÅœV3~Å?Øø£õ&9ÏÍ$Xú}úšØÇâ’(ÿŠ;QÓ̈ÿìüÕºxùËž­)MíïFNÞ†²¡ŸV”^'V¢[)ÂrKÎϯ™Ðø¢ßöd_ ê'À2|w}wì².žu(4Ÿ²™ÂŸ/ÎØûŒ{±’™8Î+›øËûfü@øõðÃCðoÄÍFÇSÒô/ìòVéü¤hãß0Píµ‡^O-“Í<þÅ™‰“Áú‹a~x†ßü~‡ý‹þ(H>Ô—w¶H@?øþj'C(Ê£(ÅÚéE¤íµ×•È©ƒÎZj–pM4ùiÍs'Ñé©å‰ |6[pþ=¸ç<ýi“H‰ó‡wàp?1^°¿±—ÅÔ(ð~¤Bð’.3÷ê(ÿbïŠB,?ƒ/ò¼.$‡§¾Z¹ÿ³±óæ_ø ÿ#ÎþÀÍ?è§þ/ò<¬x‡’ñ¨<àž§éŠl§o#pNkÕ[ö,ø£»qðn¡'ËŽ^§ÏBþÄÿË1oê#ã÷‘`ƒëóÑý‹ÿŸ2ÿÀ_ùöiÿ@•?ð ‘äQ;Ô†{ "O·ÏGöv/þ|Ëÿ䨧ýTÿÀ%þG“[ Ë©S•Àã?äÒÍò‚K˜Ó9Á\àwÀïŸZõQûüTŒ–_êLHä!äû|üPß±'ÅYP ü©9îL°ÿñtgbÿçÌ¿ðþAýšÐ%Oü_äyt(‹1àœrì7˜íøR$-6>d99ßQ^¨¿±'ÅG ¿Áú€,z³ÄXÁñMOØ‹â¦æá QWÁ,8?†ú?³±óæ_ø ÿ þÀÍ?è§þ/ò<¼b7bÝà¨éŸ\þJC2HqÌqŽy8öó¯Q_Ø£â²ä7ƒµ6í‘,8?øý/ü1'Å6ÿ„3REÆ0%‡ÿ‹£û;ÿ>eÿ€¿òì Óþ*àÿ#Ë—lGhÎnÝô<ÿŸjõØ·À·_ÿj/Zh‚I>É©Ã+ ùBBë!-é }Mlx;þ óñ[Åš¤V‰áË‹%s†’æTò×þø,Jý%ÿ‚yÿÁ;l¿f[Õ|I¶ó_¼QçNWG]¨?…søžý±êeY&"µxάbÝôÛ¥¤ážÇâ±”êâi8S‹Mó+7ml“×^û#ë"3—·U@*Ím¨¯ÐÏÞOƒ¿à¼¨_öðàP¤ÿoBy=?qq_”òÌ@„á¸ç©ôÍ~«Áz¦û?ì÷áæÁ8סàwýÅÅ~R¦VÜ08$‚{_²ðGü‹ø¤~âüŸøcúˆÀo9^£jóùu¤,a€ó?Þýiì ‚Yã8Ãô¦‰˜3í rA<ôèkëψ+J¬Ò~íH “žGáHcýîöÛ³œ’O$•iÿ|¸S·‘Ø‘øTrG°çržùë@-±`KžsÓƒþ}é¯8Œ¶IwëùQÇ9ŽgÁ!:ç})|0É2 ä·Nh@è@ò™ÈSó|Øü9¤týâ•Síó`©‚mà˜Ö?u*Aþt“HYO”7É{cµMåøÇN¤wö¦*á~@É·Ž[§åM•šhö©'¦#ôˆ›ä"ᛡ!sǵ562|œòXòsú~ýŒ4-–c€¸4ø$Ÿ»ùˆÉ?46ÙÁÇ#Ûž´ø¾H¶³y…+Œ(úÔW–kåm‰• 䌜ýir¨ÅÓIÇ÷¿?åMKÑ*ynÄÐYxÎsÏ~§ÓëH%ÞA\ðzã== 6I-üÒY@Æ9ö§¨ŠÍó޽y€4(%@Øsýðqí]×ìØ›ÿhUñ&œpx91óï\))3Ç’NßsŽõÝ~Í6§þ3À/"íÛâ=<.yÇúL~õÍÿw©þùx÷ª_âæèSAÿ=·ýsÊ­ÕMþ@ößõÌ*·_·õ ñ·üðý‹õ6’n-:ôÿ¨«ñnLG” #'ášý ÿ‚âMä~źÃuÅÍŸ¿éQWâÑ™¤‘[8ÇRýkó¾-ÿ|øWç#ú+ÂOùÕÿ¯²ÿÒ 8-æFU{aFGà¥5¶¦v‰W#ø†?J{e÷‡ŽFJo˜ÌÃ8Àõ<ãÞ¾\ýH­(fqå)ä}ãßò¤1 o”¨êrjÛ9v¡ÙÇnŸÊ¢xÈ †EûЉäœûdR´¾SÙ}ú}1QG;G1(Ø\d;ÒK?=LŠNx íÒ€®¬ƒÊg$uù±üè‘~`UHý®Gâ)`ùòÕ2¼ä©Í$’îCårOPµMå•p1Ï\åL ¸6ú·OÊ›+´…í‚ôÕC¼‹…FaÜ/jcƒ·žI<óúS¶›¢nOpsN?îðÄq“ŠBؘ`A@ˆùQí¼±åBá@÷¨¯,ÔCµ#CÐôÉ¥,¨ä#Æœñ“ŸÏùSRðDØŒd½ƒ@ (# »¯×¿¥ ”·+‘ƒÉÆ3ÿפ–X¸eeÉÈïíN]¡ŠÊw«ry€UåX÷Yøèç4kJ ÆQSødãe'Ñ.×ét¯Ðô+ä5è£S„¥ eÊòŠZ;­ºò·n§Ï+¿ÏTQ“ÆíØÏáŽ)íF ˆ‘ƒós’Ýøô¯°u¿Ù+àçìgà\~Ü7¾.×ü}â+E¿ðãÃé08ù~Õ$˜%ò%X Û”+…ÞhüAý”þüpýœ'‚¾¶Žgޝ ªc’p7†°À®Ó_Û4¬ã%gnWË̥˿ø´¾ÄÇ ÄÎ)ÆQrqSQæ\Î.<Ú.¯—[-O—ezó# r§ÿZ¡Ožãòä¨ÁúÒîÉHÁ'…àÃ1Xmù Èüº×¬xcŒ&L‘ò€0[ƒ{Uå±*£‘è[?ÝÅXU7a÷$`÷ŸóšŽêlɲE'pã©Èþ´ ŒDÄ$¸b0AüÀ®ßögL~Ñ_‚â¤ÓÉ'¢ÿ¤ÇÇã\I &ó %Ž íÏ=s]¿ìÑ(oÚ;ÀAƒóâM;#¯Ú£®loû½Oð¿ÈëÀ½Rÿ4C:üí¿ë˜þUnªh?ò¶ÿ®cùUºþt?¨OŒ?à¸Ó,?±†¬eÆß´Ùõíþ“~-›€Ät*Ý3Œ}yæ¿hà¹Cìeª)%C\Ú úùŽ¿­¬RÞGÄÀ«R§Û5ùßÿ¾Gü+ó‘ýá'ü‰êÿ×Ùé0%PË)+Øgú÷¥e Øvp çžáMy#~A%ÁŒŸ¯¥2vŒÇûµ“Æ_~>•òçêA4(‡1 `:°byôâ“bF„M•féïBʈ1,Þƒ~¦š€ €ŸöxZXåó ãpì{Q½¹šPÛ¸ÆJ†Éjz¾ìîIW£zÒ"y¬ ª’{P Yvu  ôäÇøÝä d`»ÝñM‘cs´»îëƒÈÀK/Ëò°HÃ&ÇÍÎM{çí¿û ÇðãòøSà}¯Šï ©-¤Ž)r269_€O¥G$µÓc§ÚÃOyk±™ä™‘•‚ÇœûPKbT1G#݇è3Z6yâk¨¬´K[»©æm© 14²ÊzáUrIú 'Óïl.” Ãs Ç êÀ\®×¶ƒç7-õìf´b6;d;ˆÀ9ô§ÅÜ %²Äô_ÿ]hh Õ¼\ÓËàÝ+TÔVÉwÜ5«Ëä‚h;G“é^±ñöuÐþþÆßþ!é7z¼º×Ä^èf–6¶·—(ü•T -¹›'¦+UBnœªÛHÚÿ6’üYÍ[F…ZtdýéË•zòÊzö÷bÏFF. HG 9 õéQ:>âP¡õ ŸÏ¿å^ÁûüÑjoÚ¿Â>ñåÖ§c¤ë­r.%Ó¤D¹O.Öi†Ö‘FZ5*xÏ~G±\ü>ýŒ“ÇW>ñ¿ûAhrZ]Íc.£y™%œŽP»bi åIùS8ëŠè£—Ô­Ïš)I´®ív­ÍÌòŽ,7³œä¢¤ùbådÜ’ÛÎ/CäPn9I ò9_zzívq\“ÆW<û~Uëß¶§ì•wûþÐ7ž þÒ ³’Þí.þ4¯-fa( Ãn§ä®GW›xÁºÇ‚Z%ñN‘¨éiMñ-å»ÀdQÔ¨p ŽžµÉ:S¦å+4ìüšÑ£ÐÂãhciS­FiÆiJ>ië¶ÿäfØPL¹ƒJªN§$ïŽÝ9ëSx{Âú—‹õká]2ïSºeÞ`³…用êv¨$zÐð‡„%Ô¾#ézˆ¢»´{­F)ƒ.Ù-ËȨr¬2g¡ª§FueE|NËÔÖ¥xRRr »ïoCåʃ·¸ïøRõCÈ`rAn; õÛ›àv—û4~Õ~0ð?‚.u#@¸†+iïÝ$¸<Êw²");‡ 8ë^]þ¡ùÎ=ŽÝßýz‰EÁ¸¾„á±ÅÑ…z ’kÑ«¡Ì|ÙɉHÈèH ?¥Båj$˜?BOò§+8_pn†Ç×4ûY£ÂãåF:Ô›ŠÇÃýþ ت—Þa~Æ;‡Ì Zž8Ê9+ó/¡\Oz$ìXgӾƀ!5± Í:Þ㢨NAùR´! íp}Aÿ ts:"Û ŽF8õÍM)ŽæPÁ•[¨m5äPÄïÝ·ªœšo›ºC÷ƒ¬ÀÆ«+(€A9g'œÿJþ”þÉ=Òÿë‚ÿ!_7~Ú¶·~Ü?ZÑIýÿ%š"ÿ’×Ò? ?äžéõÁ¯ÿkoÁeû{ü³¼Â­¼—“Ý®‰ýõüëöèn3êª(¢¤gÁA§ÿ±¿ŽÚC€lã_ÄÏ©­Ø#OÙ'ÀÛîÿdDOûÇ%¿\×?ÿ*ŠI¿b‹bA fÇÝEí¹?¥tŸ±Tkì›ðüB¥AÑ`8>¥rOæM_Ù'í¡õ¯ ý«?࡟¿dôO_\jZó tÒ4ÔY®‚ž&HX”ú³G@qW¿nßÚX~Ë_³¶·âK?-õ@‚ÛNùq!Ú„Žár\ŽáM~x·Å—ŽuÛÝ[Å÷×–§©NóÜÏ;o–Wc’K~?þªù¼ï9yu©RW›×^ˆøn1âÙd<¸|2N¬•îöŠÛn­ëoÄýÔ?àà8b»iŸ æ–ܱæñØ{¨µ`?3U×þfrÂtÂõ'ÅÿÛ:üÝgÂíCó`` ŒúоI ÷~P?‡ú×Êÿ¬ÿùùøGüÍgmÿ¼ä°ÿäOÑ÷ÿƒƒ$WÀøKÈÈÿŠ£ŸÄ}Ž•ÿààÇŒþóá2?ähÉçÛìuùÃ-³nKÁÉ?(ÿÔ·¾ß,0 9l~áGúÁÿŸŸ„È_ëÖyÿAù,?ùôgþ"w_ô„¨çÀñAÿä*–?ø8&IøTÊ=‰ñü“¯ÍøEÉÊÁ~ÿˆ©£·o,JÈ3œÈõƒÿ?ÿ¯Yçýä°ÿäOÑ¡ÿJ@ÏÂh²@8ÿ„§ßþ¼éßñ,€fO„ñ¨ÿ±£ÿ¸ëóqíåºÉ…I|ð\ò@ÿ?MlÂ8„H àm Ž¿Lþ4¬ÿùûøGüƒýzÏ?è#ÿ%‡ÿ"~ŽÄA2_á2„^­ÿ ?Cÿ€tø8%ÁLü&_˜ÿÐÏŒä~rÌêNבQÊôÉúÓgC2"ÈÙÐzÿú¨ÿX1ÿó÷ðùúõžÐGþKþDý_ø8AËáþ¨ëÿ3Fö·ÿƒƒ¤\øJŒÇ°ñGÿqWçÊØÎÑòñóëM’Çïl'’Àr~¹£ý`ÇÿÏÏÂ?äëÖyÿAù,?ùô‚_ø8A£qøO#¨o`þètø8>B£þ- F@>'Çø_œ(H^wa?‹ÿ¬*d!bÉçø¹ØQþ°cÿççáòõë<ÿ ü–ü‰úD¿ðp¬Œ£þ-'?ó3ÿ÷<ÿÁÁòÏÂTÇÅþBÊ¿7cø]¬{ôúSg”(Û†-’p:ýxëùÑþ°cÿçïáòõë<ÿ ü–ü‰ú½ð‡þ ÅàOë0Ú|`ðƳàôœà]Å0Ôm¢÷ª$€º_mø?ÆZWÄ Ùë Ô-5M.þ15½Õ´¢X¦CÝXpkùÇüîùéFF:“_iÁ?lKáGÆ«o‡Þ%¹•ü1âÆam¹d²¼ÚX2ÿtH©«=Ž}Œ§ˆjÔ«8o¢{kçÐú¾ãÌF# &cf¦ì¤•šok¥¥žÛ+¯4R#‡PËÈ<Ò×ÙŸ®Ö¼;ö«ÿ‚ƒü:ý’Zøöþ}C]‘<Èô5×[OF|±)õvó€qWn¿Ú]eŸÙãZñ%§–ú˜Am§Fü‡¸íBGp¹.Gp¦¿ Œx¶Y. “«%}vŠÚöêÞ¶üOÑKþ†+ÉJøW<¶à7ˆNÃÝE«ùš®¿ðpC3>¦©>(ÇþÙ׿ë>j›dgÖ€ÅòHo»òü?Ö¾Uñ?þ~~ÿ#ó7ÇYÛïù,?ùô}ÿààÉð>Ær2?â¨çñc¥ø81ã?¼øL€dù2yöû~pËlÛ‡’ðrOÊ?õ-Ä/·Ë [ŸøQþ°cÿççáòúõžÐGþKþDýÿˆ„×ýá*9Æp”Ùå 6á‹dœ¿^:þt¬ÿùûøGüƒýzÏ?è#ÿ%‡ÿ"~®|"ÿ‚òxÅ:Ä6Ÿ|-¬øB9ÎÜ3FÞ/y6¢Hû¨Õöçƒ|i¤üBðÕž³àFÓUÒõÄÖ÷V²‰b™OuaÁôü+ùÈüîùéFF:“_hÿÁÿkýGá?ÆÛ‡þ$¹‘¼1âÖao¹d²½ JºÿtH¡«=Ž}Œ§ˆjÔ«8o¢{kçÐú¾ãÌN# &ai)»)$“Mí{ig¶ÊÇëÕŠÁÔÐóK_f~¸ZñÚ§þ ðëöHŒ[ü@Ô'¾×$O2-#NA5ÙSÑœ5>®Ã<àUÏÛ§ö–_ÙgöyÖ¼Kl#“STÚtOÈ{‰ÔÈî;Èî×ጼY©øû_½Ö'Æ?òN¿7âAc'*ûþ"¦ŽÝ¼°a+ ÎpO ?Ö üýü#þAþ½gŸôÿ’Ãÿ‘?F‡ü)? ¢ÉãþŸúó§Ä@²™>Æ£þÆþã¯ÍÇ·–ë&%óÁsÉüþ55³â /´‚:ý3øÑþ°cÿçïáòõë<ÿ ü–ü‰ú9ÿ8É„Êz·ü$ýþÐàà—3ð™~cÿC>1ÿ’uùË3©;^D!G+Ó'ëM È‹ #gAëÿê£ý`ÇÿÏßÂ?äëÖyÿAù,?ùôaàá/‡øJ£¯üÍÿÛ:þ‘pá*3ÃÅýÅ_œ"C+c;FËÇÌ­6HC½°žKÉúæõƒÿ??ÿ¯Yçýä°ÿäOÒ àáŽ=Çá<`Ž¡¼Qƒø¡Ð?ààù ø´€1øŸà~p¡!yÝ„þ/þ°¨u…‹'ŸâäaGúÁÿŸŸ„È?׬óþ‚?òXò'éÿÁ²2ø´\œÿÌÏÿÜtóÿÈ? P{sù *üÜuŽ7áv±ïÓéMžP£n¶IÀëõã¯çGúÁÿŸ¿„È?׬óþ‚?òXò'ê×ÂOø/?üO¬Ãiñ‡ÂšÏ„bœà]Áp5+x½äÚ‰ î£jû{Á~6Ò>"øbÏZð6£iªéZ„b[k«YD‘L§º°àó‘ìAüä@þw@üôÈ##I¯´?àßµî£ð›ã…¿€ÿ‚ñ.ïÙÛEã?ñ:‡ÿEO_“I òÀn<0ù³Çzýcÿ‚ó¶ßÙËE$‘ÿ¸9þ™M_“ÆD0–CI<ó_±ð?ü‹?íçú†x…ÿ#oûv?¨Œ¥ïm»›îƒßãM–2«˜ÂápþïáÞ›,¢9‚6A?ww$㜎⤎\¶p¡ŽÉöäúרŸ 67i&ùâØŒ¿uÇ_ÄTòm+¿¨Ç#©Ç¡¨˜ß31ç‘Ðÿõ©aVŒng ®sÍw¿²~ÑûRü3dÇü%ZX\”¥ÇøŠûÃàÂÌ?à¯ÿ›IÝýª<9©ÿfà þ~ÛM»]ß{§={WçßÁ/Ûü9øÑá?kÍqiáýjÏQ¸Ž¾l‰ é#ª@ÜB2G'­z·m+­3öõÔþ2|K»1&¨om­µ(ÕZXZ1Ψì :ïSµ‰ä@#çs|¾®>´¡ ¥J¤oÒíÂÉúÙŸU’f”rÜ%ÐaŽhµ˜îý¢6‡$³‰!€mƒâíiðÏà·ìé®|-ý‡4íg‹ÙWľ)×üµ½Ô!\í‚8ãÆ#Ã2ò Î6±rõž ®# „¥€T©£v½Ë+.nnÖÖßô±®:ŽŒ«™#éõŸØöuÿ†«×X‰qƒò‚F=úS£xwùÐú>OãéN¼Öùœ·?6Ü0ZtÅUw„$†ëŒç¥Öë2°W#xàg‘õ®¿ögŒCûGx|I§ Øëþ•à× ŒC‹c+Û<Šíg ÿ àÚ(×þ*M4åI8&ê?nÒ¹±¿îõ?Âÿ#¯þóKüQüÑý è?ò¶ÿ®cùUº© ÿÈÛþ¹åVëùÐþ¡>,ÿ‚äóûj@ŒææÓÿJ#¯Åµp‚ðÓ_´ð]<¿Ø×R9#ý.ÐdúxŽ¿Dˆa-†#¹$gð¯Îø·ýò?á_›?¢ü$ÿ‘=_úû/ý&0eL³m xÁÆêIc!I@¸^qéþ4É¥HªrtÏ9úSã›'$.OBO'ú×ËŸ¨ˆŒí*‘ч øŠÂ²^‹Æ:œTNN㹉ìF4D…I10OPI"€åÀù$ØNhýiìæ n8?)Ûü©~i_*T‘ì? RŒ /#'$c­á’ O›du9É_ÀR0#h §ÞïŸqLfòc$e¶ôÏô4¦âEUr9$ë@ÏEýŽYöÀøVâG‹´ q’úd_•ußðS¹þÞÿ÷ÐmóÏQ±?*óÙóâ§Ã ñ?ˆk›ë¶Z¥Äp(3ÚêV–1h¶:cG~±¤žd1mrnãnzç@é^³á¿ø(gƒ4ÛàÄ+ÅEøkà‹_ êp$=Ô÷1ZÝBÍn¾pGuÂÎÈpåôTóJuqUgZ¥Ò¬œo²ï.×en[÷ÐøOõf®(£O‡µW†«Ù$ÜåÙIõ|×µïn‡®þÊ?µ/Ûßö×ñ³ñ¼h2x_á©ë~ðýâCe£él’CFâP„íETv‘÷„eÜ  ]ÿÁÿˆ_¼EñGPµý¶>8~ξ4øYâx§¶Öt5ñ-–-£e&6µ$*ÈáÜ猒K…qð_ì[û]Gû,þÐW~%¿Ñ×^ðψmnt­{JrÝØÜ0.«œ®å*­ƒÃ`© 6áìþøÍû)~Ìž)ºñïÁMâ?Œ[^éMµìŸ?¾åm[æ»jÇeûøkâï€ÿ4ïØúÇÚ «â™­&ø«­j–ÐØ>mài#mÛ˜oó2bVå[f/~ÞöºÏŠ¿àšZ.§ñßÇ~ø­âýÇ+§Ãâ ]Gx,­å¶‘ÚÖKˆÑ7>B3.ÑÀ9*¼“áíUð“â÷ìeð—öÃoèGÃÚõÆ¿§j¾††c1´s@ß*àÏ&Љ€Á^CëüSýªÿgmGö-Ö>ü*о&iPéz×4}Nt´’]sQ´bKì6#æ ˆÆv¢‘´åLºô¾¦éÊ¢k’su\®IFÉ&­%}ÛêîËxZÍ#ˆ–ó*͹*{ÃX©:ŽM´Õ›„RQZ4’×´ý¼¿kŸ~Â6ðßÁ¯Ø÷S_øÁº-¤×RÁa \k²Æ$yæyQƒ‚ ’Ác&âØP¸_ðTÒ~Ñ_±'ìïã][O²Ó¯õ×Öžþ;XDQKr’ÃÓ*Žžd‘¼ÏÍÉ=k/Ç?µìýûjøsÃZßí…Äo üGðî—•¨ßxryíüAyÚÄK’ýã’«0‚Îíã¿o¿ÛGáçí ðgá—ƒ?gÿ kžÓ¾Ø ó‰ä9‰aq";•–"ò8g 3ýêÏ1ÄûJ¤ë))Ê. =¢¦­öm&´ÛÈ×'ÊÝ,N]|£Z›Ÿµ¨Ò³nœÓn_ošnéëm´½ŠðG`?áã_ ðÄí{ð ‘ýŸsÔ×uñÃÿ±î‰ñW\¿ñ†¿ñ«^»·Õ§–óJµ³´†+©ì^0ìªÂ2r2[5៰WÇíöZý¬|)ãÏÛj—ÚN„×-q‚Ç%Ë me…v$ŽŠNéå‡õ8Ïœ|Bñ>3ñÖ·«Ù‰`‡T¿¸»Ž2èÄ’3€À¼óŽõ±ѣ…£Æ2’sz«Úü–òÖÏ{ì}''«ÍêÖu':Tãx4¹š•VÓvoDÖÖÜýðoíoÄO |sý¨´ï é–Úçltß ø*Îé~Ñý‰²yFvÈÚÒful&v±'˜ý†j¯Á@|AミµÎ¥Œ4/x~òöÆêæÖÞ+úÝðHª¡pŽ8*¸Âï óÿì?û[h,|g᎚߉þ|E³[]jÖÉÕomeˆ–†âܹU,¥ÏÊYyÚÙÊa½+ÃÿµÀ¯ØÃÁ>-Ÿö'‡Çþ#ø…âí:]ßWñ"[Ãk!ùÚ%ˆ òä!åHʩʀÈþŠÇ*Š5gWÜä’”o«›æ¿»³æ“O›§•›Åd_VöøZ8Vê¹CØÔJꊂ^õïF¤ÚÞW¾¼ÇOñ‹ã—ˆ¿àž±¿ÁO ~Ë÷QxsXø…¡ÿÂWâMrh¥¾¿’P¦8D’)Ú‰æ0éœ"Ãçß?Œ|{/íŸûü9ø±ñbÖÊOˆÞ ø‰iá[­b8â¶—X³p“(•SÙL‘àÆ$ í^wàßÚ£áíû4øOáïí³mã-3Vøt²[h>$ðÒC+½›cýæ)8!BÆ IòÔî_Ÿ}_¶o€­| ðûá‡ì·¢kúÃk±øƒP¾Õü£ªx‚õXƒ+,ghKàdgr ¨²ÆSUeRuS¦Ü9cü¶”^ßg–)¦úô½ÂUorœp²X˜Î£[+J/Ÿíï54â”zuK”çà­·Gü?âošT§Û-¸Aû%¿QÖ¾s7*B¤¥Á6çüûW«þÜŸt¿ÚWö¬ñ—Ž<o¨YizýÄS[E~‘ÇrŠ–ñÆw¬nêc<<^S8ÝCrAÇÿ^¾V³R©&»³ï²jS¡—áéTV”a×f¢“B‰@~f$ó´œþµ e‹xVç’ÏÔÔq»™“‰:ŽGâiÉ'ÚrÚÍлΠfzEæ0-€ g#<õ 6¦G÷³cƒ»ž}*Q9@©'p¿.E#2Ç«´öÇõÅF²ç&M¬;’pO¥<$_.’:ŸÀE‘‚Ê£'©\ û~U$’ «+†ÈÇ¥+MxbsÂÇåJ¶è]6± Aå@ê*-¿ÉÈùzò¹ô"–Ýö&f`»²T•$ŸåÓŠJ_ ?äžéõÁ¯’ÿoø?·_À«†ÎP²CŽ¿.¡ÿÙ«ëO…òOt¿úà¿ÈWË·­œ‹ûn|ž>Dš´ŒãmìŸÉÿJý¾žçñ¶>Æ¢Š*xwü’äZþÅ^7cüQÚ'ýõ{þµ»ûßI¨~É>’á62éD¨L ?ˆPç?ঠ?boom»~ÄÃÜýºßŠÔÿ‚]¿ØçÀŽsÅ‹§?ìÍ"ÿJ¿²OÚ>mÿ‚ñ\9øá˜7b'×#fŽ-çÇë_–ŽááË‚U‰žŸ…~¤ÿÁw¤òþx_%µ´ÿç¯ËO(+1F ž½ü}kó~%ÿ}~ˆüÄ?ùKü1Ñ®AˆPrpFà?–ZzFÒÉ”ÈϾ¾¸âˆ›v‹÷O¦ Ø4%ÀC rB)ùsý+À>Y"kdUfSן½ô¨å ´ý.Gc¦Ë,r!(˜`sóÙëH÷Œ6á$<¹NG4(`!lÆÍ*Älc푟’Þo.R'}9ÿ†)÷?ê‹°>R¸8ë׿z½á¿ jÞ,¹–/ i·ú£Æ7:Ùڴ΋Ó$('üSIÉÙ!Æ.o–*ì "BáÆIäŒTfEo¾ÁÃr'?¥JÖÌ’4/«+hÙ ¾z`Œp µcá [WÑî5N¿»²µÿ]q ³¼P`€UxÇZrØq„¤ì–¤!÷ŠN8'¶1øÔ/ ‘XíÏÞf ÈôükØ5ÏÙ×KÓ?aýâZÞjG]ÕüY.‚ö¬ÉöD·Ks *»K™ »±áïLý¹¿g}ö_ý¡o|!à[½JûO´±´¸_º<Ûæ$|˜Ñ@PÏÀÆ@êOZ评©‡4ö÷Wþuÿ’þ:ÒË+‹Ä4¹R‹ß¤›Kòg´lë— ‚rG?áQœ¬¡U@sÓ*Bü‰B:sËú鎒1.r$W1çŽA´å—%AÁuÆßÃ4¸ŒíÜóÉ?–*'B„6æfàüûÒM#G 8‘Ï~œ ’V*ä¾x8Ç ÚþÌW³CûIøí<ÈÌ^#ÓÈã¨71õ=¸Íp2ÅT*1äe±ÏÓ½w?³[±ý¡üËiùÿÀ¨ó[á¿Uù™ûÕñGóGô¢¹“I·fêcÕª©¡ÈÛþ¹Š·_®ŸÕÁð^)œü ðÌ;ˆõÈËÇóÿ\W囸xrà•bAç§á_©Ÿð]×)ð[Ã'Z@?ïÄõùcåf(Ä×°?­~wÄ¿ï¯Ñ‚x‡ÿ#y†#Z5È1êNÜòÏëOHÚY2ƒã·××QnÀ‘~éôÁaÛ„¸dHE?.¥|ùðÂÉ[ 2«2ž¼ýï¥G(m§ìr8Å6Yc‘ DߘöÏZõé~é)û §Åµj¯7?áêéö1oö?;~Ý»Ëî8Îìcø{Ö´èʬg8íwéuÍ££†ž)Ê4ú''éwøJ[1³J‡$1ûdg𤷛˔‰ÂNG?ኒê6ÞfÖlü£)Œãït8þµv×Âú¼ú$º¥®›&•{ĵc öÁ“QYÙ³ÂRvŠ(€¸q’y#‘[ï°pÜ‚ ÏéS-£¶a|:ä)BǨ銈Bò€l¾vb…Ïl*DÙ¢À`cýⓎ íŒ`~5ËÇ‚dV;s÷%¥¼·“%¾˜<ó8D‰¹f<¡rzö«Zÿ†µ? Ý}›ÄÖ7ºe˨”Cu@ìy€$}©ÙÚý£&œ’ÑÈáWv0Ädí=(|̧ÌÁyŸA,N«8(ÅAÜN¹ÍÚfÁ\®~lð§"¬1£g\¸lr9ÿ Œåe ¨¬zž˜­‰¼ ­Yè1j“iZ¥¾™);Ç·q ¾€HWiÎ8¬—I€¹’)´Ó³*P”-̬9Ó–\•× Òâ3·p;Ï$ þX¨ Û™˜€GóïI4$€àG=úp)I+r_<c¿Ð íf;Ù`ý¤¼öžd~OˆôöÆ:ƒsSÛŒ×Ó,QeB£F[ý;×qû7;ÚÀ`°ñŸŸü 5¾øÐõ_™Ù—ÿ½Qÿ4AÚ,†]&Ý›’уVª¦ÿ [_úæ?•[¯×Oêƒàïø/Žß¼5ìFúôe‡c‹{ëŠü°w\¬H<ôü+õCþ ¶û>øk$ë‘ÿ~'¯Êß(+1F ž½ü}kó¾%ÿ}~ˆüÄ?ù¿ðÇõÑ®AˆPrpFà?–ZzFÒÉ”ÈϾ¾¸âˆ›v‹÷O¦ Ø5¥gáM^ëC¹Õ-t­R]&Ü×kjío?¼hçÞ¼›ØøˆÂSvй$Ml€Ê¬Êzó÷¾•¡¶Ÿ²Èà cH¾m³K/µ[–nƒŸ_éHg‘†cŽg ̼¨?/zB³[1³J‡$1ûdg𤷛˔‰ÂNG?áŠÔÒ|«x²)›ÂÚ^¥ªµºƒ*ÚÚ<¦5ê Zηó$˜¤¹b@ Ÿ1ö÷¦ÓVº$’NÚ1@H\8É<‘ŠŒÈ­÷Ø8nAçô­#á-M|65VÒõ£±)öƵuŽq3zñ]LJf»Ï~Ë"ø£eªÂ–ÞÖ-ôƒaörÏ9”Iœ(€Æ?*µJrM¥²»ôº_ª6¡„­ˆ—%8Ýò¹v÷bœ›×²MþZž|ÿx¤ã‚{cArñà™ŽÜýãÅö!²“Üv{t{DðÞ¥â{Ãiá›+ÝBëoša¶¥“IÚ œr9÷ 9;#'d®Ìäp«»b2vž”>fSæ`¼OÆyeqctÐ_ÆðMØðÈ º‘ÕH<æ¯YxWÔ4yu/JÔ®të`Âk¨í¤x`õß R«ŒŠoaÆ“åKS1£g\¸lr9ÿ Œåe ¨¬zž˜©âµ‘ÔýŸrì$’:sÇBqùרþÍÿ²n·ûBüE¾ðíÔÒøjâÏC¹×D·vnÆâ(”0U^8 ÓƒÖ®¥UÚ+¿à¯ù&m…ÂVÆÕ¼¤ÒKÍ»-vß¹åh6œ²ä¨8.¸Ûøf—»Þy gòÅ>ÃE¼Õõ(­t{{«ÛÙr±A M$ÆpAcߥ?Ä:£á[—µñörŠɹ‰¡g€v6ïŽ*,í~†<’qæ¶…yX«’ùàãþ€Wkû1^Ëí'à´ó#ò|I§¶1Ô˜úžÜWÓ,QeB£F[ý;×qû6;ÚÀ`°ñŸŸü 5¶øÐõ_™Õ—ÿ½Qÿ4AÚ4†].n¬€þ•jªh?ò¶ÿ®cùUºýtþ¨>ÿ‚ðɺhÄöÖ Çýûš¿&$%nÉ'Œšýjÿ‚î?g-'qÀþ؃>Ÿêåë_“N»:0 ß' 8íé_±ð7ü‹íçú†x…ÿ#_ûr?©]—îdÛòaX/#×½K‹ÞnägãNŽ6#{€ ¯øÒaUToa€HÁãäWØŸ"oó›Ïc…çåî}hW \8Ç?QQE#3)‡1ᛃùw>榇$+U÷ÿJÛ#œ1=[qâ…ÚÙÇÊ=?¼*.<ØvÈOÉÁÏš"¸kƒ„*«ÁÚ >ñ¼È÷ v3“÷ɨš6F̦=¸äœþ4ܳÍóîP§‘Ï'×>œúSå!€Ø\…èäý3ž=(–-ÎŽ²cÁÛÛü)wÈÔ}âyǰ¦#`K¤Œ–äý)ndÌ9Œž8eýjtYGWœä}ê<ù"@‚'R¸À'·Òš· Ø +`‘ÆÞOêjXÀ)ÈÆÀïŸóé@Æ ­³6UœÿT¨¤gÞ™DVËds×éQ s,l§çíNŒ+™cŽÊûGÜ€ a‚N¿É¤¡¥êÀã-×Ö’ið¥z)֜î#9Øã¦W’;`ÿõ¨5P¥€ÜBü~95Ü~Íê­ûF|?l7#Óð[ÿ¥G\`ˆ:’äHËß+õ•vÿ³ˆi¿hü *x“NÁ'¯úTyÅscÝê…þG^ýê—ø£ù£úÐämÿ\Çò«uSAÿ=·ýsÊ­×ó¡ýB|OÿÐm¿±Õþ{ÞZéDuø¿)(ß>âköƒþ žûcëÜô7–¹ã?òÝ+ñ¨ï€aÛ¢×ç|Yþùð¯ÍŸÑ~ÿÈš§ý}—þ“»'ïUž< œûT±¶—'Ôd·±§G9ÜÀÏ'¿ãI… vämcå_.~¢ ßç‘1 œ fƒ…ldŒœôÇ?Pj”³f.I<3pNµ?™–*­¸/sëï@‰’Çq=÷GéH¥K„'¾zÔmq¾ŒÄmí‚?­6;†˜lj/M ú}hK¦ßPÆÓì*&”ƒ!M¸ÁœþY¤rÒO†,<Œ“ŸÆ+£abt$zŠ%ˆ1WY±8Âöÿ PH²ê8bÜãüj< äí'Ç&rû¡ËÁ=1ó@ (àªãœ“Óu/Ú$‰1ŒrF0ùö¦%¶1+rGUäþ¦¥9ñÁÆ1ß4ϵbS•goâÊ‚1îE &õ%H-‘ÏZ‹ÍsqÛeÓæ8àõúñ@û  a‚NΚ-ƒH1Õ,9¢iŠ©^‹ë»½+8X¹*WîårHö?ýjb¦ÂÊ¡ˆS‘Û>ù4÷PØ` #8-Œ¦)V à³àü¸Ï#žâžêó¦Ð£j‚[4j7í•[=;úõ4°Uò1ÎišîÊ“»Ó'?ãI3³Î2Ð௭G´y‡rdNÐvÿž)A¸´bKu·Ó5¤#íÁçõ§‡ò–6Œª–áŠðOÓð Ç ¦” ¼ä®H>ã½47ÚC¬žY`Ä‚AŠtR0œó×ÿ¯Úœñü¥­°Q-š¯å«Dr¤HNzggµ>vߌ‡¹Î}(ØÏÎÅ{:~\Tà'”7À®@äó~$ÐL 3ßÀẊTs´ùH#8þ‚_gBX>ðÚslÔR8‘Q]œduè3ë@ îbcÁäŒsúÿJs+Ȩ# v¦Ã.á%IÜ Çõ§ñdaž0GpzdPoË"#g'æ9?J’6WܨÅbP©É$gSR¨Us湇9v”çRHܸ-ÔàdSbnX¢6ÑÀ É#>ô¬ŒpU†ÐrrÔäó îbQŒn8 éGáGü“Ý/þ¸/òòí÷<éûsü[yN£iµû¤ßÄ Ç¸~õwÂù'º_ýp_ä+æ/Û®ÚÜ~ÛŸ%a‰ŸT\žánà(?6oοo†çñ¶>¿¢Š*yíåmowû xõu4ÓK¨=dFCø8SøUoø'Í×Û?c8ËÅœ‰]³Ê¹üqŸÆ¦ý¾mÞëö=ñâÂ@#Os貣зûZEeû$ø-1µ´ˆ¤8þóe›ÿ&«ì‹©ò×üO‚þâuÏî'þ™¯Ë—DT(²0§³ë_©?ð]é„<4Îp?¶S'8ÿ–W屟ý!x+‚¨Ç¥~sÄ¿ï¯Ñ‚ø‡ÿ#wþ‘Ç"³¤‡^…&‘„q¹8û¿ç$„HF0x¯ãÛÇd•×+´äŽ1ÔWÏŸ V–M“Ÿ;0ÀÝz]în€Üœ/cbXÁ¸UfÆIî~Ýj6F$(W#©>hþNÆV îdvãú‰ñÂ1ýþøÀß²7Ä„ÿ ôû=ßSÕ¤Ö5›{=[Z½”e§™%‰Ï–vü§<ò¿uËè.ÊNU”^Fzà×Öºßí#ðKöµøá8¿l˜|sáßxKNI}cAŽâÖ­#ÿW欙+',~ïVc’Uö²ºñ§F¬­6â׽ˢ濽êâíÖÞGÓðÎ.–×R’IE(·.N©´¦“åmuÒöµõ=£Çñèž#ý¯¿f¯]kß5‰†¦,¼]'…5(®áº’&O&åÄ`fV`KÙFB òÿÚ;þ “ñ;á—í]¯Øü"¿±Ð<'áMj{ }=:²],S2Êeù7–•ƒ±*Àçi’χ´ƒ~,þÛß|;û´’DYö‰‡woÖ’8†6œDsÁ­DmÀ› è2~^½?GÒ»¯ÙÁAý¢|S;ˆôì·c‹˜ò=«ˆiã2HÀ/Ø×oû53ÉûDø c|ƒÄZ~q€ý¦>k|7ñ¡ê¿3¯/ÿz¥þ(þhþ‚ô/ù[×1Vꦅÿ koúæ*Ý~ºTŸÁx#Y>øl8'Ôd3ÿ,fÿë×å«¢*YÓŽÙõ¯Ôßø.Ô¢‚>g8X'8ÿ–3W呟ý!x+‚¨Ç¥~wÄßï¯Ñ‚ø‰ÿ#wþþ¤qȬçi!סcɤd!nGÎ>ïùÅI!QŒÀ+øöÅ1Ù%uÊí9 cŒuóç•¥“dħÎÌp7cÞ¾ÿýˆg½ öŽÿ‚yæüWñ-—…¼/¦|K:†§w<«–?°Å Á¿Ê¯$“"†=2Hà‚eŒû…VldžàwíÖ½rOºAý…árÚjç^3>#k-ŸÙÍŸ‘³™¿ÌÝÎ6cÅž+ÖʱT°¾ÚUb¤œU“êý¤¿û;j{Y*Ž*•Òqäš³Ñ6âÒZk«Ðú+öŠ¸Ô¾&~Ýþøâ?ü0ð¶»ke¦èL|›Ëflý®I 2ù²JyŒ2_ÌfËý£ÿà¨~~ÓÚÞð²ëOÑüàÝF]ÓÃk§B,§¶·)£™JÄ FÐp¸Æk…ñ/íãeã†u/Yê¿ðº>_Ä4íoËŽK][Oƒ¤wŽdY ©}Ö KfFÇWñ ãì¯ñ·â|Fø—£|LÒ|A"Þêþ°[w°Ônx.VbCݳ¸åòB©<úXoJX›?hå)?µ£Ëu×–ÒN=Ý’±ôõó‰U¥Å*s›„£wÈ㤽—2ÑrJÚ-$­%®‡Ð~&ÔmuOø,OÂk­Ö; +¯ mí–1Ù¢6wåP((P@ÇÅ|mÿÛ”Åÿø~©'Êú¬¹=C~æ^„×½þÚ?µ"üÿ‚Šü0øŸm¤Ë%¬~Óï'ÓcuÊÛÜ-ʳKê*k—Ù(òÝü\©?vÚ>{Ë›ç~‡JÍðžÎð«M*¼ÉÉ®g)MÿÖŸ2qJWÓ­¹GÿÁ[Fiý(« éY;sÜšúÃ?ô/_¶ìýkñÖÒûIÑ~iºÄ–·Xò.ž“ËY³ÿ,Ã2¹ÎA ‚&¼Æ?´ìÿûQi^ñíGÄM/ÆžÑíôNÏDH%µ×V ìd‘ÎP¶Ns°Årpñ+þ k£Û À?þ øsP±Ñ|5áØ¼=}¡Þùq¬Ðî˜<14lÀ¢¬‰µˆ2 ®d+áðøŠµ%Q5:ÜêÚÙ~öÍö³œ|ôzm~‰À½Lej±•9ûwy4¥4ãm,“º{ôº>ðÅo‰Ú§Æ6¼øùñ‡öyÖ¾ëRµ¾©á¿øIm$µŽÅò pƒ,Ȥcs|øÃÎ?Ú;ÂÚ?‚¾7x¿Løq¨E¨è6:½Ì:uÅ´ë<3[ —µÆC¸9Æs_Møoâ§ì£ðŸâ,Ÿ¼¡üGÖµkyïM𞥲éöw¡äË- ÊüÒ€H|WÉÞ7ñ›xïÆz®³ªÃgk>µy-ëÃm†G.V4*‚p¥y9•eR¢Ý乯ï9;>[''¾Í¥Ó]u±Çĸèb0Ê©ÏÉ576•µÕ¥Ê›·¹å²ëŠåˆkrç­/Ýð½‰éõ¤’"Ï´L8»~´‘Ä1´â#žkÉ>$ˆÛ6Ðdü½z~<¥w?³šƒûCx¦wiÙnÇ1ä{WÒ Æd‘€^±®Ûömg“ö‡ðÆùˆtüã1ûL|ÖøoãCÕ~g^_þõKüQüÑýhòµÿ®cùUº© È×þ¹åVëõÓú¤ø?þ ¹ËðÃÞ`'ÔD3ŸÜÍý3_–ˆ¨Qd`N;gÖ¿U?ຒ~hLçkdçòÊZü«3ÿ¤/pCuô¯Îø›ý÷äÁ|Dÿ‘»ÿ SÒÿb¯…º_ÇÚ³Áñh‘´ÍOSE»LÓÄ€ÈÑäá dF쎕÷×>%|YÐ~?Lþø·û>h^Ðï³í<"þ"µ†Ý,bo,Á2y’BªAÁù !@ù¿ðsâ¾£ðK⮃âß”þÐðýôw£«—aù‘Êÿ .å>Ä×Óþ"ø½û'üHøª~&x¿Gø—c«ÝÜÿiê‚ itû˲CɉIÄîIa¹KdáW;jò¼T)P„TÒjmÊí­-]/+KÝóÛSŸ†ñ´¨aªÓŒÔ*¹EÝÍÓ¼R{I'³ÕÇ­ï­LÑôO|EøÍû@üø=©èwþñÞšž&ð Ó®£žÊ×UŠ•á…£%p[*œ*BWŽ•ä_ìödÿ‚qxÇÄškO|hÕ…tÐÑöú|%–ê@§„ÑŸq¯-¼ý®îÇí¥Åÿ èÖ:,–ú¼WɦØ*Æ‘Û XÚ ª€Ìð‚ŒØ,Ç8®‡þ )ûdé?µ—Ämü!Òµ- ³t³³º†8$[™¤i.&)²ÇgF?s=Mf±¸uEV—ÆïNßÜæ½ü½Æéú[S³œàêG‰„’«MÔT¬šMTz4žÊ ÎitrJÇÙtüÔt~È~ü/𿄬 i©ëv¶Úž¡rÊî.ã–ûÙ’Ç9ixvÛïü·à¿Š|=ªøRñ>½¡j#Å‹ámB+Ë?·Åe(y¾C•óÿÉÙÎH$øi_€¿¶z½ûVÁãï ü@Ò¬"²Õ.t­å¶×1…“÷€”“<¨ »pôoÛ÷À¾ý´<âß x:ûÃÿ|¤Í£XYZ[Âú¥Üom,BiÉp®å¤\ƒ!Àä’sé¼}(VS”Ó\íÇVì¹d––\«T¹}:Fç­W8Á¹FQ©dåG•s7Ê£87î[÷|±RMõ»µïs¾ý•¿à Þ?øãûpé>ñ-î™/ÿÝ\é?ðŒ>c“(Ž5]›¸ ¹$óÈ# ^ý¦xŠ]4xÇ+¡hd[C'ج™ÉhFøÎðK_qô5ò_ì•ñ§IýŸÿiï xÛÅÚÞ—¢_=ÕÌ6H;«#§Ê¬ê Ç€ë^¹ð›öœøY¯|!ø©àÚ¼_¥i^1ñ ñ&{¤Á³¡ H‰ÕÛjœõsr0 ò°øÊ•0Ê2¬ý¥¦›nÏzM]ÿàËzÉu<쳈'[ŸÛbm7*ª-É®U*RQ³û1çP·DÒ{¤|¶ò¼³3JrìK6Gë_ _·¯í¹ãOÙÛOøeᯀ—pxrê÷Áš^§ªêpYD÷Z‡îÊE;©;#¹ÿ‘Óƒùõup9kPçœ €ŽÜWèíµâ‚*µøiáÚzèšÞ™àÝ2òÏ]Ð „öòÄA·%ämhÙ”…8,y ¬¹Í`k*U9==on•4¿Nÿ+y?N¬hc}•eNn1´›·ÛW÷º]]_å¢w2|Yáû/Ûÿá—ìó㟊ÖvÐø¯\ñ€ðˆommþÏý³j…Ÿ{mÙ^Hàm*ò_´×üÓâgÁÿÚƒYÐþ ^XxsÁžÔ_FÓô {(>ÆðÛ9„‹³q±¸V] €»O5Ä||ý¶´kcðÓÃ_²>—¨è^ øOxº¦˜Ú©YnõKÿ0Hn.I_½¿€å£ð …^·Ç?ÿeÏ¿GÄ_‹:GÄÍ_¼t»Ö<9¦­´¶•ʿ˔á\Œ1Ìdò@Rr{*bãQ¿«VP|÷“ۛ܂浵\Êo—ûÛjíëÖÌ=¬'K ŠŒq¥ÍS™ÅO–2RJ{»7ÞÜÖ¾¶Wú3E‹Aýžÿh‹^<ø} XCc¬ü+·ñªé ­ãºi7”(¼/¹Çvb½«È¿àž¿¶ÏÅŒŸ´—Œ§ø‡â©¯ ï…/o$³·Ž(ÞÙ ·Ø0TFe“<î;·WëÿðQ›?ˆ^>øÏ­xçGÔ¬“Ç^ øzÊÉ#‘4¸×ýZÌÌÊvòìÌ¡¾f8\b¼ëöý¢ü;û8üz:·Å˜u WÒ®ô{DzU3Û¤èõRÃv €yÎ #$fy„gZ”póå§ËRÊöQrWöi8úOˆiSÇá={RU¹§ou=bœšVÒ^ó³èÝÖ¬÷ŸØ;ö ›â,.üqñþøÛã k$ѼQ®Á¢ù^û<¸ÉUpqʰSŠÿ··ü.;öVÓ´¿ÚËÃÚg ¦²·:GÄ=2ú ¡‚B­jëJøb2ö†;GÌTWð¯ãwÀßAñá—Œ¬¼W­ü1ñL–·zgˆÚÖ={L¸‰Ws÷LeÆ:( £ol7âÏíð£áïì‘­|"ý•—Æš¼~)ÕaÔõ=_Ä8R/(£*[ÅÆI‰%Gòß(\ñˆÔÁ¸Ê¢øR²{µ$ìâö{¾tÕþmRÇ¥—Î|JmFªmNîR|Í'¤ª);Z¢³÷N)¿•M¸a]OË×§ãÈúWuû9(?´?€Jgqñ–ìqsGµq œfIà{íÿfÆy?hìox‹OÎ0´ÇÍx˜oãCÕ~gÃåÿïT¿ÅÍÐ^ƒÿ {oúæ?•[ªšüí¿ë˜þUn¿]?ªO…à»§³~–OOíˆ;gø%¯Èø\`º|ÅØ±ÝÁ^ý+õÇþ ¶»¿fÍ;=µhLÿ •ù !óბŸ–¿bàoùÿÛÏô? ñþF¿öä6IÌ1ç»N.”“òá×…ÎA'4â¾Z 28þƒòÏ4Z•.ÆVp ô<Œÿ:û#áFÏtaˆ$a¹öïR,¤Éû€ø¸Ú=é¾\;$Þ G!ÆÞNA]‰ŸnpýhneNw¡Lp{tüzT*üÊIã'üi“9—÷Š%-ÔqG¸üýêH¶"±ÊcÈöõ  Yü¡´ŽO$œcQܦéÍ AàñÓÚ– ¤C“´°àçÓÒ‹€n%݆UäòHÝõ cuYsà¬p»ê?Æž®0ßh!wŸ“kš_1Ò=ˆ¡×ÏãÓ5óÿ{ŽqÓžßçó Š%æ™~ð=ÁúÔ›\¡ îÈÈaϹ¨DÍ(áÜóÎú{SÊ„ÀšDaþÒœo§øÐ Ã! R[­=@npüƒŒ×Ò›1HÈ8ÎŒgR8ŽY9-Ø6A ÕÂå„%sÉ9Ïn¦šò†@Pº»v¨9ýØc¸gñõ÷ O±‡™’q÷ˆûÃ銚Ø,‘—có>2Î}ý«¹ýœíàCòÿÂG§ž{¤ÇÇ׃\8œýà# N>ï5Ù~ÍòûFü?2ƒÄšwlsö¨ë›þïSü/ò:ðï4¿ÅÍжƒÿ {oúæ?•[ªšüí¿ë˜þUn¿êâ?ø.«íýï3Óí–½³ÿ-Ò¿cq¹™~bÍüGÓûCÿ×ý®‡ý>ÚöÏü¶Jü`ò„¤‘€:ƒµù×¾Gü+ógôg„¿ò&©ÿ_eÿ¤À’9\q)!Aàã¯áD夓 §ƒŸ˜œÒì¤Ëó‘ÑAÀþ|Ò[ò4º¨ê;W̨ 5ÓC GcŽ”å›s/6œgæ=)JÂB@Ü}Hd'Lc€@Å:âUó#ÚG\pëP!YP’NÆ™3ùë¹D¤»Ž˜ôæŸÀ b¡Çb1ÿë  ‹yKƒÕ¹àçoJŽárÊX:: !¹El¾ÜŽÀü¸§\ƒs&⬫Éä @¥V\ÄRp3ÓëOW·ž@p»XœÒ‡t]±ªºúñÀôÍF|Õaæcœtæ€8•æ—¯^sOÃ)&7dd7_­D%iGÞ`sÏ8ü©ûDc÷²+{09JLRÁ\ðIn«ô§›'ƒ»ƒŒŒþ4ÙŠ"‚@ë…ã©§È#•×',ÜpqŒzÐÂåìÊž¤çõ¦´»¹Xö¨ùC6AIÀÏ9÷ Må°ó2Ø ½øP¶Ádˆ»¹ñ'ýªg,ÌÁéžqíïÞ£[‚eœ}ÞOÿ^˜òë³î)ç#_j‘mÂ;IÇlõ÷¦N¡cf@<œœçÚ.û‰ÊhÃã lh$ºà÷!9Í1B2] ôÀ­Hå„@.àœà1Œ)¯|þÅ“Înp8$þ¸ ÚCµË.Þ2Gñ#¢F…NNȯåOtݘädø¾PùÓZ=ª lsÜ÷Å>v‹».°6óø“M"ª™7¨ñëS#6V\~ðý*BîYA_áéÿê ´¯Ì wOï z÷¦Çp½YJ‡< àŸÃµKy+µ³8%zfÌrÙcÌ9ÿëÐ!’ÝG˜ÑÆXß"âéB¦^€Ž¿5++—l <Ûð¨7$NpÇ{>˜ bóq… Iàð§§4¤ys³¶Ì}àOC߯ùæŸ2ÌÁUÈÏL~uŽXÛp„0à‚Ãõ÷ 2}¥YF' zM$nÂECŸA€(g-ˆÝÏ8ðÅ>UVBÀü¸nÇôé@Ò§Âù'º_ýp_ä+åßÛÒ5Ûgà ´ChMVƒkÈ ü‚~µõÂù'º_ýp_ä+æŸÛàÞ~ßÿ­Ke3ôìfçòòó_·ÃsøŠ[\QE<3þ K¯6ûxÅ¡Îû¥¶µìæ Ùÿ€î­ÏØf&‡öFð“9:R7àKú¡ÿ Ó Õ?cG¨`"ZE2ŸöÒxñå´ÿb+ƒuû%xv£Ä˜ÿw+ŸÇüj¾É?hù{þ ¹bnþøyÊ–HµˆÙ€s(þdWå—˜ ‘¸ä`ä7'ð¯Üïø(ìè¿´ìý«è‘·F?6ÚLs¨w#qÏP3ê2+ðÿľÖ|â[Í'Æ–’Ùjt¾[£e¸õ®FA¯âŒ4ã^5­îµoš?ñ'/«O e½ÉE+öjú}Ú®úö)DæBQÔ ^zp~ƒµ ‰ˆÚ…rG®ö¥“ïoÜç’:Ï>ôËœª‚²;°6®±9¯—?6êb~db1–ù8´h g$ó{~?JsX³rà€{à°>Õa1 )TÈÂüßxŸ¥*ˆØ?#°ê{óPJŒÒô_/¯˜W¡ôÉ©”¦ «¢²“¸g<ÒFÅŽèÜÆqîh³ð×â¯ð³ÆZ_ˆþÎÖ:Æ‘p·V—>RKäȧ!¶H[žÅHªþ"ñßœ~4å•_$9 1“DaQ\e—øÆAúsÅ5ìÖYbîl|À¤qÔTr ±8r8Hÿǽ*Ò³MË}¥³’p0)·†U±Ûúçó Ë“¼+`p¾§ò®ëögÞ~ÑæX°P9Ú.#'ò× "²Ü®æó Äúõ¯²ÿà‘ÿ².£ñ'ã§¼AfÑhš#³gBÌÄÜ¹êª sýâ1Ð×~[†ž+AuMù%»=®Ëêæy…T•ýäÛì“»×]×cF¶þyŠ·L·ˆA "ôQŠ}~ªM Ásì çì÷¥>ÒÉ« °îºÿ6ùKæ($n99 Éü+÷cöíýŸcý¢þk: ³O h\ ˜äRðeSøWáÇ‹¾ë üU{£xÞÒK=CN“c)Ê«¨' pz澊pÓx×·ºÕ¾hüWĬ¾¬1”ñ–÷%¯Ù¦ô~«núö3âs!(ê/=8?AÚDÄmB¹#×{RÉ÷·îsÉçŸzeÎUAY ØWØœ×Ëš u1?21Ë|œZ@4³’yÈ=¿¥9ЬY¹p@=ðXjŒ°˜†”ªda~o¼OÒ€DlŒØu=ù¨%Fiz/—×Ì+ÐúdÔÊSUÑYIÜ3ži#bÇtnc8÷4 [wÝî£b­ÔÓã "–†!° G|÷÷¥xä m1O8äãñ¨üÜ!dç'i ßé@ 'ýâ®ef &Ýüˆ¡ö°‚#ª†ÚòA'<“\ÈÈÝÊc¸ñïõ¥jÿ,‡Áa†àò*¹åÊá}/{tº½Ÿª»ûÙQ©8EÆ.Éî»ú÷¦H]ˆby+ŸnôÅXÃoxp)Œé€2¿JiºVŒ†fTº{¦jI%š6m­oæ#p¨–0&HîxÓÆœ²«ä‡ €2hŒ*0+Œ²ÿÈ?Nx ½šË#l]͘´Ž:ŠŽA2'G)ø÷¥ZVi¢Ùo´¶rN6âPÀª¶;p?\þtrw…lÔþUÝþÌ¢{ÏÚ'À¡ÜÏâ+ ;EÄdþ@á$V[•ÜÞb’Ÿ^£ö_ü7öFÔ~%üd³ñ¶¿hÑhz3Ù³¡æb î\ŽUn½Œt5ß–á§ŠÄÂ]S~InÏk‡²ú¹–aF•%y7ä“»×]×cG·þyåVéD …Qz(Å>¿U?¦†àºñýš,œnÄz­¹$1_’\HÙˆÜ{ƒ‚£Øv¯Ýoø(·À'ý ¿g-sG²ÇÚš!-»’¡„ûnQŸl×á—ˆ4+ß k·6"ŠKkË))¢•pÑ8ãþ^¼ýg€±Pžx{ûÑ•íäÒ×ïGã#àêSÆÓÄÛÜ”R¿šoO¹¯Ç±NHÞDýÈc-œã×ñ4 Y. /˜Ùò=³B»Ç.2¼H?ãD¬ ™&P ãó·×ð¯»?:D2€ ñŽ€þt3«1«GÍÅGùÎwÇ~?Ô$bÑ‚¤`œ þøá>XÜ =òݿƟ´ï-$YÇBÌ´­82qžœœ |2grîÚwsÇÛšŠI8L(öÎÕú“Q¬­1*ªØ»dcßéR]'—æÊÏòAŒÕt—r 9-Ÿ½õ É’€EʆÏúÓ gu;sÁ=Ï=>Ró1Nÿ¾ù4Ĉ„%9$äóþ’´·ù‹ã9Îx©¡š0„+“»¿jPI 2¡޾´æß j¡ ™'ø IWq·’O¥5TCÔ‚W¸¡§+H#&ßi@yùNÒ—å`ÒÀv8ÿõèÞZàÝÏqÓ¯øÔfdÞÑ•sœŽxO®jfs±KDÊìpyÏ¥,1†bpT©Úß79õÍ; Ë0cŽλ¯Ùž7¸ý¢<±‹³ø“O$1s?ʸ"#l¼$¶Ñ˜gŸÂ¾¤ÿ‚SþÍš‡Æ?Ú?K×®mŸûÃ2}¢IJá%¸ÇÈƒŽ«äû/­y¹Æ*<Zµœ¯æÚ²_6zÙ¦;F%wÌŸ¢Níü‘ûU ÿÈÛþ¹åVê;Hµ²F?…@©+ùôþ–>!ÿ‚ì©?² ÓrÞÚ’Goß%~3GÙÈ.} {_¿ŸðQoÙõ¿hßÙ»\Ð-p..!Ý’£ŒŸ`ê¤ûWà‡Š¼3¨x/Äwz_Š¡’ÒÿO•¡¸‚UÃFö=;‚:‚ |КÄBµ½Ö­óMÿ™ýá:ŒòúØKþò3æ·“QWûÓ¿m;™òFò'î†ã݉Î=þ´( 8EÞÇô¨:Hàêz±8¢V>ù” £ qî+ä×cÊ2Š{‡ó¡¤W|H®TŒðÜTqÉçHNøãñ¥p$bP*0{Ò€GËèI>­Æ)û l˜·Ж¡§Àldz·Iœ°ÎÒO§JŠIâ<è¤>µ•¥%UX„ê[ÇéS]G†y ÕF*ªK¹Põ-Ÿ½õ I’˜‹ž4 vw)î §È^c„'vþ*dpœ¼“œäó@K#K6YñsœÂ¥‚d @rwqžÔ¡‰ÆåS=­<‡†0 Ž™'ùPB9êÎ1Ï<~”ÕU„õop?9ZA6åJƒ’6œ QµÔ¾N|hW&,•žçüjjU†=@Ï}ÉëR³€¼L¬N<ÒÃg$¥Næäñë@j€Yƒp~tü³Ã»Ì%˜úd/¶ZX¯0ÝÍ)Vb¸ëѰ8?Q@ yfu;Ž@j0mʺîØ:¢¶OçK2ì_»¹qÀüÒ›ö–_õ ¶‰@æ ’F îAóñòÿúè—÷C÷l61ã¿ÿ®˜^@ÙK° Æ~{RÅ+3m9#õ `’<ƒ-Rx9À$g>µ< ÕÑœž¿­1ÑÙpd\“’£Ôm&"&>vœüÙý¨ó`³;e$p2H§[HD`îÊç$MŠGuÛ¸œ:”0TmÏò‚ $gš@Ä}æ°ÎÓ’ 4»ä1Jå•>f8ÏÞM0nضœø •˜*à |ÄȨ#$1ÚLŠy~*CµYF[×±õ5È#œd¨çƒüGß@H¨\ciê¯éñʶ3dŽ1øôhs¼8‚,…ä=¥A1^ÀX¶qŒõ  •ˆDr‡œÏãÿÖ¨ù˜ù1îÞ̦9ºu4È¢_vÍÝÓÛ¥{Oìû8j_´í¡ØÛZ4šVŸsæ¡6ܪ¢°aoV#¸Ü{VØl<ñUcJ VìpæXúYV¦.»´`›ÿêÞ‹ÌýðøP1ðûKÏüð_ä+æ?Ûbùü?ûxü¾·Mí=âY:áîR21?…}]ám,hÚ­°ÿ–Q…ý+ãßÛóPx?n*"ÔlÜ{Ñkö˜nKcí*(¢ g„ÁL/šËö*ñ—–ÛZ_±Åõò Ë5µûßCö?ð„ƒ·Nò¸ÿbGOý–¼¿þ ªÞX~Ìšd:{²[_kðCu÷ÔC;ªŸmè§ê¢¶à”¥Î¡û"YÅ~Ò4vZ¥Üû‡ àø_Q½ßñÍ]½Â~Ñô”±,Ñ•”V ×ÏŸ´çüÇÁ´fgÖì"Žø²xþIèÃðé_BÑXΜjÅÆjéôdV¡ON¬T¢÷M]?“?75ø!uˆ¹ìýwWHÉ%G˜‡gÓ)UOü® ¿ÄZËmõxŽò~–Ñ\Øø/ùô ðžNÝþ­¸üÑðB‹`I Õ·Å¢'õŽžà…Öç8×õa‘Ž/þ7_¥tRþÇÁϤ/õK'ÿ hþ?æ~iø!]¹‹hñª0H1e¾¿»§ø!|@Ëâ X6à4XÿÑuúWEØø/ùôƒýRÉÿè?×ÌüÒðB«a!c¯êÇ=·ÅýJ?à…¶ê0ºþ¬1Ññºý,¢ìlüúAþ©dÿô ÇüÏÍFÿ‚ÂFˆuqÆ8h¿øÝ5¿à…vì¸ojÇêÑqÿëô¶Š?±°_óéú§“ÿÐ4OÍøqM·×õnÍÿ£þOjduíWxïº,ÿèºý.¢Ÿö> þ} ÿTòú‰ù¦à…–äƒÿ ­rè²?ò,ŸðBè%9—Ä«g±h±ÿ¢ëô®Š_ØØ/ùôƒýRÉÿè?×ÌüÔOø!}ºG´kÚ¡ÏÞ‹ÿÓ$ÿ‚ZË(y5ýX‘þÔ_ün¿K¨£ûÿ>ªy?ýDø/àÿü/ÂÕãºñ”·Z¸ƒ®d:÷UìAö§Ã߆Ú_Ã] ÚÅo *U®‚Šì¡†¥†\´ ’ò=\]…ˢᅤ Ÿekú÷ (¢·;FËÍY@*x"¾~ý¦ÿàž¾ ý£Í®ØD—£;'ä‘3èÃðé_AÑQ:q««®Ìʵxˆ:ub¥ºjéü™ù¹¨ÿÁ ìEËÿg뺲FI*<Ä;>™Jªà…p0]þ"Ö[o«Äsÿëô¶ŠàþÇÁ?ùt ðžNÝþ­¸üÑðB‹`I Õ·Å¢'õŽžà…Öç8×õa‘Ž/þ7_¥tRþÇÁϤ/õK'ÿ hþ?æ~iø!]¹‹hñª0H1e¾¿»§ø!|@Ëâ X6à4XÿÑuúWEØø/ùôƒýRÉÿè?×ÌüÒðB«a!c¯êÇ=·ÅýJ?à…¶ê0ºþ¬1Ññºý,¢ìlüúAþ©dÿô ÇüÏÍFÿ‚ÂFˆuqÆ8h¿øÝ5¿à…vì¸ojÇêÑqÿëô¶Š?±°_óéú§“ÿÐ4OÍøqM·×õnÍÿ£þOjduíWxïº,ÿèºý.¢Ÿö> þ} ÿTòú‰ù¦à…–äƒÿ ­rè²?ò,ŸðBè%9—Ä«g±h±ÿ¢ëô®Š_ØØ/ùôƒýRÉÿè?×ÌüÔOø!}ºG´kÚ¡ÏÞ‹ÿÓ$ÿ‚ZË(y5ýX‘þÔ_ün¿K¨£ûÿ>ªy?ýDø'áü#Â>Õâºñ”×zºÆÁ¼«™¯uPÇ"¾Öøyð×Køi¡Caá‹X­ …Bª¢€Úº +²†ŽrÒ‚KÈõpYv.‹†’‚{ÙZþ½ÂŠ(­ÎѲF%B² ƒÁà?´ßüïÁŸ´lf]O‰o;'A²Dú0Áü:WÐTΫ«§Ñ™Ö£ON¬T¢÷M]?“?7u/ø!}€¹ìÝwWHÉ%G˜‡oÓ)Uü® ¿ÄZËmõxŽò~–Ñ^ö> ÿˤxO„ò†ïõhýÇæˆÿ‚[Hñ­¸Œn-?¬tóÿ.·9Æ¿« Œpññºý+¢—ö> þ}!ªY?ýGñÿ3óHÿÁ íÌ[Gˆ5P1‚A‹-õýÝ8Á à_jÀ·¢Çþ‹¯Òº(þÇÁϤê–Oÿ@Ñþ¾gæÿ‚[ V9í¾,èºQÿ-·Q…×õ`1Œn‹ÿ×éec`¿çÒõK'ÿ hþ?æ~j7ü¾0h¿øÝðâ{S s¯j»Ç}ÑgÿE×éuÿ±ð_óéú§“ÿÐ4OÍ3ÿ,·$øH5lƒwE‘ÿédÿ‚A)̾ Õ[=‹Eý_¥tRþÆÁϤê–Oÿ@Ñþ¾gæ¢Á íÒ=£^ÕÎ~ô_ün™'ü¢ÚYCɯêÄö¢ÿãuú]EØø/ùôƒýSÉÿè'Á¿àˆþð¶¯׌¦¼Õ–6 "¹ÏÕTG±È¯µþü5Ò¾èPéþµŠÚT"ª(8WAEvPÂÑ«R‚^ˆõpYn.‹Ž’‚{ÙZþ½ÂŠ(­ÎÒ;»T½·hî28Á½|ûbÁ+|5û@ßÉ«hÈÚn¬GøW>Ç †QôÅ}‡Eo‡ÄÕÂTUhÉÆKª9ñXZ8Únx)EôzŸº—ü3ƶƒeëQIáwÙäãê*«ÿSñÑRSƒž¸³?§ï8¯Ø?,zQåJ÷WæëOoÿ’Çÿ‘>uðNJÝþ¯ÿ“Oÿ’?¢ÿ‚)xö&ÿ¼8ôûÿã”ãÿVñècåjÖꧨû?ûR¿`ü±éG–=)ÿ­ù¿üÿÿÉaÿÈ‹ýHÉ?èÿ&Ÿÿ$~=IÿRñãîÆ­n7 Ysÿ£)Wþ«ãÀ„6«íÿg?ú2¿a<±éG–=(ÿ[óùÿÿ’Ãÿ‘õ#%ÿ üšü‘øòßðE?H“X€€r?ÐyüüÊcÁ¿ë+ö'Ë”ycÒõ¿7ÿŸÿù,?ùÿR2OúÿɧÿÉ)ÿPñÜnÆ=V¬1·ìgÿŽP?àŠ^> OöÌX=ØÏù¿a¼±éG–=(ÿ[óùÿÿ’Ãÿ‘õ#%ÿ üšü‘øõüGÇpœV}ìÏÿ§7üWÇl›µ-¶öc?ür¿`ü±éG–=(ÿ[óùÿÿ’Ãÿ‘õ#%ÿ üšü‘øõÿRñÞâµaÉîm ?Ÿ™BÁüz α[©û?ú2¿a|±éG–=(ÿ[óùÿÿ’Ãÿ‘õ#%ÿ üšü‘ùcð›þ{¨ÜjÑ?Ä}^Y-Uh O'x˜äœ}¯Ð¿Ù÷örÐgßÛé~ ³‚Ú8Woȸÿ'ß½zP½)kËÇæØ¼Í§‰¨åo’û•‘ìeÙ6 )Ma)(ßw»ûÝßâQEyǦGsl—p´s€ÊÃù öÒÿ‚SøWö–»}RÊ#§kp·VØI>‡‚{}±_`ÑYV£O ‘M>ŒéÁãkåõU|4Ü&¶iÙŸŽšÇü«Æ–:“dx†7ˆ—}Žã¨*¨à†~:lîÖmòÝÐ?ôm~Ê”ò(òÇ¥y/‡r÷ÿ.¿™õ«Ä^"JßZÿÉ)ÿò'ã<ðCÆÙ]v z}€ÿñÚ{Á ¼z1kvëê>ÀNò-~ÊùcÒ,zQþ®eßóëñ—ùþ"7ÐWþIOÿ?þgãÆ'ݸÏýCùÿÑ´±ÿÁ üx‰´ëpùñ?üv¿e¼±éG–=(ÿW2ïùõøËüÃþ"7ÐWþIOÿ?Ûþeãç}v?ìÏçæÓþWãÖÆuèp;}€‘úË_³~Xô£Ë”«™wüúüeþaÿˆ¿è+ÿ$§ÿÈŒÒÁ ¼y!ç\ƒŽ™°'þþÓáÅ: vëpnn¤Ø“ÿköoË”ycÒõs.ÿŸ_Œ¿Ì?â#qýä”ÿùñ™?à…Þ;‰É[€)#ìŸü‹J?à†>>ÞOöôX=¾Âxÿȵû1åJ<±éGú¹—ϯÆ_æñ¸‹þ‚¿òJüøÑüÃÇqnG­‰ÿã´çÿ‚øí—oöͶßO°þ;_²¾Xô£Ë”«™wüúüeþaÿˆ¿è+ÿ$§ÿÈðãîÏöÜ$ûØ“§ïh_ø!Ÿcý»[¿Ø9ÿѵû/åJ<±éGú¹—ϯÆ_æñ¸‹þ‚¿òJüøÓÿ3ñàB\…sÜXœÿèÚCÿ4ñé'v¹nr1ÿ?˜–¿eü±éG–=(ÿW2ïùõøËüÃþ"?ÐWþIOÿ?›þ]ã²ÇÕ¾;`N?ò-<Á ¼w‘¿Z”Ÿa=~¾m~ËycÒ,zQþ®eßóëñ—ù‡üDn"ÿ ¯ü’Ÿÿ ~37ü»Ç­‘ý»ñ‹‘ÿ‘iÃþkãõ?.½LdéüÿèÚý—òÇ¥Xô£ý\Ë¿ç×ã/óøˆÜEÿA_ù%?þ@ühOø!‡ŽÐäëp³w&Äòïí(ÿ‚xïvµGíZý–òÇ¥Xô£ý\Ë¿ç×ã/óøˆüEÿA_ù%?þ@üj‡þoãØYOöä'ý¯þE§ÃŽ|xåÖà éö¿ù¿dü±éG–=(ÿW2ïùõøËüÃþ"?ÐWþIOÿ?þcã×\>»õáŽ?ïå ÿ2ñà\nEœä°œü‹_²þXô£Ë”«™wüúüeþaÿˆ¿è+ÿ$§ÿÈÁ ü{#s®A·Óìþ¾m)ÿ‚xøàÿo¦áßìG§ýý¯Ùo,zQåJ?ÕÌ»þ}~2ÿ0ÿˆÄ_ôÿ’SÿäÆy?à†^=‘ ¶»Þßè'#ñóiéÿ4ñâ}ÍnÜ_°ϯúÞµû+åJ<±éGú¹—ϯÆ_æñø‹þ‚¿òJüù!ðçþA¯^ëŸø‚sj,–ð,,GpX–8ÿ#úû*~Æžý—ü/ƒìa…Ôeœ ³·«1äŸrs^Ê/AK]ØL» Ö„{ûÞ§‡›q&gžYc«¹¥ÓD½l’Wó°WÈ_¶î£ûu|33|­Ï¬W1È?Zúö¾Rý±´õßÛ£àziß*ÝÍ; ê© ‘Êçéµ[ò5ß Ï ŸVÑE#9OŸt? 5? øÞ-özŒxY~òÚAÊJ‡³+`^AÈ$WÅ¿³í©ÿÁ=|{¨ü/ý¦lçƒ@žìÝXj‘!xáÝòùª/íåù‘ƒ $¿kœø‘ð‡ÂÿôÈìþ'è:f¹o -»]¡'©FûÈN:©JVÑì&º£7Eý¤~x`мuàû§=bÜ¿>«¿ û[—|?i’ë]Ñ¢Œôg½AüKW†ø‡þ að{[ºilô}SKÜrRÓR—hú â©'ükáÛ4moâsÒC©Ãé…ÇéGºžýmñ#÷¿ñç¯è³¹}&¦ÿÂÍðߘÉÿ ‡½>òýº,¯Ônâ¾gø#ŸÃfÔ„«®xÌ[u0ýªßòÝäg¯½k^Á$~\Ûáÿ„žÝÀÁ’=EKsº2?Jvq]žùÅÿ O&È|Qá×pqµu(Iü·T÷¼9j®µý5<‚÷Ñ6¯™ÓþåðÉeËkž9eþïÛ-ŸÙªîÿ„øWc{æÝ^x¾ò†´øµá]BR–&ðüî:¬zŒ,Gà¬/Ä?Éqå&¹£´¿Ü±–ü·W€\ÿÁ&þÏ!h­¼A?š‘ ßJMfj?ðGÿ…·§6ºŒ­?ë•ôãð5+G¸j},Þ8Ñ'‘µ,$}Üx_©ÏAþ1xF8ƒÉâŸ*7F:” Çu|óüÿábBµ;ã7ðdþPcôªÒÁþ¼™MoÇ(3÷Eí©úMNÑîgÑ|sðMÙ²øÇ²Æ[f­nÛ~¸~)ú_Æßk“yz/‹¼1y'M°j°H%s^£ÿÁ"~é—Æ[ÙüY¨ÇŒy7„jƒß1DúÕ»¯ø$×Â;‡&(/ˆ~ž2ðkš; ,·±×u|ù{ÿ–øIwiåÁ‰-ŸócÔrÿ\2ý+'Iÿ‚<|4±½2j:ÇŒobå‰îàAöŠÂ ü¢ÑîgÒg⟆&Fñ‚#^­ý¡Ñøî¦ÚüXð­ûbÇľ˜žÑê0·òjù÷Vÿ‚E|)ÔGúþ+°ÿ®„mÿ£"j¡oÿtøcfmkÇûÛ`?Kj-áv})wñKÃ:üøBƒþº_Ŀͨ±ø£áMwi¾"ЮÖ+øœ~_>hŸðHï„úQ·¿Šu=Ç#í:‚.ÏaåFŸ®jYà’ß $'d~$=6ê=?44­á©ô¿Ä-ïwÙuÍ]Ÿ{eìm·ë†â‹ÏˆZŸj'Ô5ÍI$½Pþ%±_5]Á~Ï8xµo@½Ñ/­È?÷Õ¹?­I'üác¦ÿÆH¼/áÏë;G¸]ŸB]|fð}ˆÍïŠü5Ærúœ Çâõü/oýÜxSÈ^ ŸÚÖûã¿óÊÁþ¤Û›[ñË/÷Mí¯óÕ©¡ÿÁ$þi0Ⱥ€ñ6¨ÏÑ?§•Ì-áv{æ‘ñož ]Ú‰ü=|=mõeøë’_Š‚o.ohI þ¿ˆËuxÁ%þ4¡„^#íÿÏëPkŸðHÏ…:¬DiÒø£LnÍo~ù‰cjVpÔú"_ˆž†6mwFHºokØÂþ{ªŠþ´‰^ïĺHÝõT¡-_:ø{þ ð¿Ië7Þ+Õ\ö–ö8Ô}qù“IªÁþßɺÏQñˆþì7аÿÇàcúÓ´{…Ùôu§Äï _ŒØø‡C˜Ó;ø›ù5Euñs–-‹ßøzèúŒ+üÚ¾p‹þíðÁ#"MgÇÄ}ã{lúbÚµtßø$·ÂK&ê?^IŒyój8“ë„E_üv•£Ü.Ï bø•áÉàó`×ôW‹®õ¾ˆ¯çºŸôáA­éà2ÞFAüwWÏÿÁ$~L„Gÿ ÍO²ÿ‚<ü/µºI.5o\¢õŠKëp¯õ+näEp»>œ¶ñv“{gö›=SN–ßóRå?ï qPˆ F·¤:ÿ¦GÇþ=^?ü£àôÖ¦8ô½b'#bê’–üä~•ü;ᘌR´{†§¿Ïñs–϶çÄþ½Q„Õªx¾$xvx‹Ã¯è®ƒ«-ôD~{«æ›¿ø#¯Ã‰‹[ë>7Oð-í±ó·'õ§ø#¿ÂðНãrAÉ?n¶Ë{ôoåNÑîgÑoñ‡ÂQÊ#“Å>Y ÀS©B ü7U™>#øz(Õå×´UFèÆö Ðî¯?ðIß„FÙcºøqÖOí&Üß_—¥T¼ÿ‚Eü(ºB!—ÅVçûÑêHÿ¾¢"•£Ü5>_h²2„Õô¶/ÊuÍôçš«sñKÃw ߈ô¥ŒeÑõ•”z[ŠùÂÓþõð¾Ü“>«ã[Œô}n1ÿ|ÛŠKŸø#ÇÂùÿÔêÞ6‡ýËësÿ¡[švp»>„“㯂"˜G/Œ¼*²7E:µ¸'ðßI7ÇÛ݈.$øvƒºþвà7Ñü·Tvßü1{yök?è2ÜÏ$Ô"gÿ¾Cf¼þ%ð›ì"/ø©üÀ9›ûE|Ãøy{JÍ‹þïðÁ.K¾±ãwOùæom°?oŸÖ‹G¸j}+qñ'ö“ùwzþ‹ŸÜ{è•¿"ÕVëã'„,›¾+ðÜ'Ñõ8ù½|èàŽÿ Èlk7ÉéÖß/¿ü{S!ÿ‚9|2B¦]sÇ/Ž£í– 7þKgõ¢ÑîgÓÚOŽ4]~ÜÍ¡k]ìC«ÁwŠ?&š|{¡*u­'pê>×Gþ=^ ü£àô6¢94½bWÆ<ÖÔåÜ}øÀý+=?à‘ß ÖáŸÅ,¤ñÔWhúb<þ´­á©ô×Å Xœ^ø—@„ÿ·¨B¿Íª¬_üqpbƒÆ>yGT]ZÃðß_>j_ðGυײî´Õ¥ Vüˆ§h÷ ³ß­>:x#P»0XxdzÎ qêÖìàú`>kFëâ7‡¬T5î½£B­Ð½ìJæÕàW¿ðIï„WM˜-5ûaé¤ÄãÀÓþ 3ð¬ü¥‡ÄJÿóÔj_?äWoéJÑîŸ@[|Eðýàͦ»£J?ؽ¿“Tc⇆Žìx‹B;>÷ú|_/׿â¾iƒþéðÖ-HË6·ã9múˆMÕ¸ü 2Gä}ëSQÿ‚Gü'¾„-³x¢Í€Æøu$ûüñ°ý)Ú=ÂìúMø™á½göGˆ4K¯/ïy7ÑI·ë†âš~(xd;)ñ„z·Å‘õù«æÛø#·Ã‘ÄÚÇå-ЛÛ`Wé‹çM—þëðÅâ+µãtlçwÛmá³Qh÷ ³è¹>5x6vKâß «“§T€Ë}kEâÝ*âÏí0jz{Û‘Ÿ5n¦?ÞÎ+æ=?þ÷ðºÊíd¹Õ?ñê©/Åï Á&ÙüQáÔoFÔ¡ÿB¯ƒþ ðž$a#ø¦Rz3j •úb1Y×?ðGO†3LZkÆð©þ¼¶ }3lM;G¸®Ï¥ÓâG‡eˆÉ½¢´cø…ôD~{ª±øÃá˜FÞ)ðàðûJÇðÝ_:¯üçáxÙ[ÆÇiÉÍõ·ÏìÑÿ–+^Oø$ïÂ'Qm5ôeêãRmÍõÊãòZ=Âì÷Ù>#øzV—^Ñ•_î“{éóTËãmÝU5}0³Œ¨I“ôæ¾p½ÿ‚E|)»B ŸÅvÄÿz„dûê"*¥Ÿüëá}¶|ýWÆ·é¾úÜcþù·­áv}?ÅO ÚÏ$w>$Ðc’!—FÔ" ŸP[Цß<“ˆŸÆ>·D:µ¾ãøo¯žîà ç?¹Õüoû·ÖÄ~¶æˆ?à âòüÝ_ÆÒì9m×ÖÀ?±Å¸ãéƒNÑîgÐoñßÀñÞ}žOxQn?ç‘Õ­Ãÿß;óZR|DðüVâiuÝb=ÞÆþ;±^ uÿ¡øCq¬V:ì MMÉos¸QÁÿšøGL²[ø†Rݵ#•úa@üÁ¥h÷ O}¶ø—áËË?h’Ÿö/¢oäÔ7į%Á‰õýJ½PßE¸~«æ{ßø#§Ã[AdµÖügËB.­ÛòcGãšÖ“þ %ð™ì„Kÿ 2H3 EwŸ¨1íý(´{…Ùïcâÿ„šcø£Ã¦@pWûJÃðÝV%ø‘áØ"M¯è¨‡£5ô@~{«æsÿrødfÝý¹ã¹Îß¶Zÿ?³U«?ø$ÂËkÄ–kÿÜ"Œd¿„#ýJÀò"£Ü.Ï¡­þ.øNòo.ÓÄþ–O 7䬟ˆžˆŽ»£y­Ñ>Ûãøn¯¹ÿ‚Nü"Š×ÄŒtMHï¥5¨ÿÁ ¾^¯ú-÷Œ,ϬWðŸý¥h÷ ³éQã]‡Æ¯¦,e¿Ò“åúóÅPo‹ÞT,Þ(ðèPväêPã>Ÿ{­|ïoÿ~ø[ [eÔ|g+}¯àô€Ò ŸþéðÆWÌZߎ#‚öÔÖÚ£Ü.Ϧgøƒ ZÛ¬×:æOÊ»^F¾„µWŸâÏ…m“uω¼?ží¨ÂêÕó”¿ðGŸ…Òcn«ãdÀÇÖüûóoQ?üËá“ÊÌ5ϪžŠ/-~_ÄÛQh÷ ³é=+â¿…µÛ'Dñ.y/÷ Ô!‘¿%bjíçŒt:@º†«¦ÀÇ ’åŸÌ×ÎÚüWá. ]F?jÌŽëQÚGýùD¥Ÿü[á%üáícñ%’à‡QÊŸûøŒZVqê}sñ#ök›½{Eˆz½ôKüÚ ·øµáK·ÛkâoJÞ‰¨ÂÇôjùöÿþ ð¦ò¶÷,´`>üZ„eý÷Ò¨AÿsøeæmoÇCyjémNÑî+³ék¯‰Þ±¾ñ‡ëóßĿͩ¶?|/ªgû7Äš Æ:ùZ„OÉ«ç½þ ð§L¸w½ŸÅzŠ·D¸Ô#UO§•Ìš³?ücá$®Å!ñ`ô ©p¿L¡¥h÷ O aø… \ÊÉo®hò:}å[ÈÉP–èV¶†{­oHŽë#^F~%±_5_Áþ]JßTñ­°î±ß[ï«rjCÿ€øXc öÿ½öørò(´{…Ùô$ÿžØûðj*ÍùIÒ•£Ü5>†?<> 2wG/%þÛÑøî¨&ø­á{x<ÙüI $ßmB¿žêùÇÃÿðGï†:\¥õKźŸ<$—qF˜ÿ€DëSjßðH?…z‹fÊ÷ÅöÐ_ÄÃÿ"BÔíáv}ÄOÜY}¦ wG{oùê·±”ÿ¾·b oоH÷¿‰4ƒøŽ¡?=Õó€ÿ‚<|/òUN¯ãmËÕþÝm–úÿ£â™/üÏᓺ”ÖüpŠ–§w¾Mµp»>´øÉá û‘ м74ÍÀŽ=NcøÍj]ø³J°^ÿSÓáFèÒ\"ƒô$×ͺü+áN+6£7ŠõPz-Ö¡ÿ~bCúÕÍ[þ ;ð‹R@,íuû;Á©3ÿ©Z=Âì÷é~!ø~÷Í®hè¾­{úUO‹Þ’]‘ø£Ã¬ÿÝ”$þ[«À&ÿ‚F|(–ÛËI¡Æ}ó*ßøõ;G¸]žû¦üpðV³qåi0ð½Ü ãd:¬7ä¯]üIðíû_Ña'§™}çójð+Ïø$ßÂ;—&o[Hõ"@ÿ¾”Ó.¿à’ÿ .,ü¨¢ñŒy©©eÿ&B¿¥+G¸õ>‚ƒâ‡îPµ¶¹£È£’Vö2äÕü-/ yLÿð‘è;ï7ö„XSº¾kÓ¿àŽß m/Ì—ÚÏŒ®áå…®­ÔÀ™`þ­Wþ ð£Q\YËâ«ްjÇÿ"DÔZ=Åv}§üIðî¯ É¥kú-Ôi÷š+èœ/Ô†â£ÿ…¥áŽâ£Ð~^¿ñ0‹üz¾n‡þïðÂ8JˬxÚF'!Íí°#ØbßÙ¿àŽŸ ]‹ZñÂrOÛm‰#Óþ=©Ú=Âìú/þWƒ|áü%¾ó À_íH7Ã}k·Šô´´©X"Cp›ãœW̺Oüáfx%¼Ô˜¥gŸø#¯Ãs¿ûkÇ?çŸÛm±ùý›4Z=Åv} ¿¼Ö­:øË¦ûÒ ZßjýNü ±¤|_ð—ˆäâß×¾¥ ¿ú ð= þ #ð›Hhê›þéºÔU|¿§•~¹©$ÿ‚Kü$’]ˈÐg;F¥Çê™§h÷ O~›â†­¦òî%Ð#ŒôfÔ!þ%ªuø‡á÷²)®hæØò%±ì?ð-د›õ_ø$ÂÍAógã hoáaÿ‘ cúÔ'þñð¼Ä«ý­ã`Ê9a}m–úÿ£ãò§h÷ ³Ö>4~ÚŸ¾ xb{ýsÄšf¥vŠ|;NºŽæêá»(Dc´´ØQëÚ¼kö_þÓßuŸ_íÍ­”6“á«L–>cFN BÿÄÒIÓnYà?ø%wÂojð^^Ùkû[Ë©x$…ˆèY#D =ŽAî }aa—e¶™ VÖÖè#Š("F `*¨à; .’² 7¹-QPPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙMoarVM-2015.11/3rdparty/libuv/docs/src/static/favicon.ico0000644000175000017500000003535612502366750022112 0ustar jnthnjnthn h6  ¨ž00 ¨%F(  ïîîýJHHÿJHHÿJHHÿJHHÿïîîýJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿïîîýJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ=„qÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿy–öÿy–öÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿª©©ÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿ¿¾¾ÿª©©ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿèçç¯JHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ7²ÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿïîîý=„qÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿïîîýJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿïîîýJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿÿÿøðàÀ€€€€€€Ààðø?ÿÿ( @ èççÉéèèÿljjÿJHHÿJHHÿljjÿéèèÿèççÉÁ¿¿ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿÖÕÕÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿéèèÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿOXVÿ?{mÿOXVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿéèèÿOXVÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿljjÿ~€ÿéèèÿJHHÿ1Õ¹ÿ1Õ¹ÿ<“„ÿJHHÿJHHÿJHHÿJHHÿJHHÿ?{mÿ1Õ¹ÿ~€ÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?{mÿOXVÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ7°œÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?{mÿOXVÿ?{mÿôóóÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿ1Õ¹ÿÁ¿¿ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?{mÿJHHÿ?{mÿljjÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?{mÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿèççÉJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿx”òÿx”òÿx”òÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿx”òÿx”òÿx”òÿx”òÿx”òÿx”òÿx”òÿOXVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿéèèÿ~€ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿOXVÿ?{mÿJHHÿOXVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿéèèÿOXVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿÖÕÕÿôóóÿJHHÿJHHÿJHHÿOXVÿJHHÿ?{mÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿ¥ÛÒÿOXVÿJHHÿJHHÿJHHÿôóóÿôóóÿÖÕÕÿôóóÿÖÕÕÿJHHÿôóóÿôóóÿÁ¿¿ÿJHHÿJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ¥ÛÒÿ~€ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿOXVÿJHHÿJHHÿJHHÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?{mÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿéèèÿéèèÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ4Æ­ÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ7°œÿ1Õ¹ÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿéèèÿèççJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿOXVÿ1Õ¹ÿJHHÿ1Õ¹ÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ4Æ­ÿ<“„ÿ1Õ¹ÿ?{mÿ?{mÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ<“„ÿ4Æ­ÿ1Õ¹ÿJHHÿJHHÿÖÕÕÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿOXVÿ1Õ¹ÿ<“„ÿ1Õ¹ÿ<“„ÿ4Æ­ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ4Æ­ÿJHHÿJHHÿéèèÿJHHÿJHHÿ?{mÿ1Õ¹ÿ?{mÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿOXVÿ7°œÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿ7°œÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿéèèÿJHHÿJHHÿJHHÿ<“„ÿ1Õ¹ÿ4Æ­ÿ7°œÿ?{mÿ1Õ¹ÿ?{mÿOXVÿ?{mÿ1Õ¹ÿ1Õ¹ÿôóóÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ<“„ÿJHHÿJHHÿJHHÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿôóóÿÖÕÕÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?{mÿJHHÿJHHÿJHHÿJHHÿÁ¿¿ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿljjÿOXVÿ~€ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿOXVÿOXVÿJHHÿJHHÿJHHÿJHHÿJHHÿ~€ÿÖÕÕÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ¢¡¡ÿéèèÿJHHÿJHHÿJHHÿ¢¡¡ÿéèèÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿéèèÿéèèÿ~€ÿ¢¡¡ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿéèèÿÁ¿¿ÿèçç<éèèÿÖÕÕÿljjÿljjÿéèèÿéèèÿÿÿÿÿÿÿÿÿÿðÿÿÀÿÿÿþü?øððààÀÀÀÀÀÀÀÀààððøü?þÿÿÿÀÿÿèÿÿÿÿÿÿÿÿÿ(0` $èççèççþèççþèççþÒÒÒÿÒÒÒÿèççþèççþèççþèççPèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþèççþLYVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ„…‹ÿèççþèçç½onnÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ­¬¬ÿèççPèççþJHHÿJHHÿJHHÿJHHÿJHHÿ: Žÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ?zlÿLYVÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿ1Õ¹ÿ1Õ¹ÿJHHÿèççþÒÒÒÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿonnÿLYVÿonnÿJHHÿ: Žÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: ŽÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ„…‹ÿôóóÿJHHÿÒÒÒÿ·ÂÀÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿLYVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿLYVÿ1Õ¹ÿ1Õ¹ÿèççþèçç½JHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿLYVÿJHHÿôóóÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ: Žÿ1Õ¹ÿ„…‹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿJHHÿJHHÿôóóÿJHHÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿôóóÿ?zlÿôóóÿ­¬¬ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿèççLYVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿ?zlÿ?zlÿJHHÿLYVÿôóóÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: ŽÿJHHÿJHHÿJHHÿ1Õ¹ÿÒÒÒÿèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿJHHÿ?zlÿLYVÿ?zlÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿ?zlÿJHHÿJHHÿJHHÿJHHÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿo…Ñÿy–öÿo…ÑÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ·ÂÀÿèççPJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿy–öÿy–öÿy–öÿy–öÿy–öÿy–öÿJHHÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿy–öÿy–öÿy–öÿy–öÿy–öÿy–öÿy–öÿo…Ñÿy–öÿy–öÿy–öÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: ŽÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ?zlÿ?zlÿ?zlÿLYVÿJHHÿ„…‹ÿo…Ñÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: Žÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿJHHÿJHHÿJHHÿ­¬¬ÿLYVÿôóóÿLYVÿ„…‹ÿJHHÿJHHÿLYVÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ­¬¬ÿonnÿJHHÿJHHÿLYVÿJHHÿôóóÿJHHÿôóóÿJHHÿôóóÿJHHÿôóóÿJHHÿ·ÂÀÿôóóÿJHHÿLYVÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿonnÿJHHÿôóóÿJHHÿJHHÿôóóÿJHHÿôóóÿLYVÿôóóÿJHHÿôóóÿJHHÿôóóÿJHHÿonnÿJHHÿJHHÿ?zlÿJHHÿJHHÿJHHÿJHHÿ?zlÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿJHHÿJHHÿôóóÿJHHÿ·ÂÀÿôóóÿJHHÿ­¬¬ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿèççþèççþJHHÿJHHÿJHHÿJHHÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿ?zlÿ?zlÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿ1Õ¹ÿ1Õ¹ÿ?zlÿèççþèççþJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ?zlÿ: Žÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿèççPèççPJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: Žÿ?zlÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿJHHÿÒÒÒÿèççþJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ?zlÿ1Õ¹ÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿLYVÿLYVÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿèççþèçç½JHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿ„…‹ÿJHHÿJHHÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿLYVÿ1Õ¹ÿJHHÿ1Õ¹ÿJHHÿ: Žÿ1Õ¹ÿ1Õ¹ÿLYVÿ1Õ¹ÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: Žÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ: ŽÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿ?zlÿ: ŽÿJHHÿ?zlÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ?zlÿJHHÿJHHÿJHHÿ1Õ¹ÿ5½¦ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿèççP·ÂÀÿJHHÿJHHÿJHHÿJHHÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: ŽÿôóóÿôóóÿJHHÿ?zlÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççPJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ: Žÿ1Õ¹ÿ: Žÿ1Õ¹ÿJHHÿJHHÿLYVÿJHHÿJHHÿJHHÿôóóÿ·ÂÀÿ?zlÿ1Õ¹ÿ1Õ¹ÿ?zlÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ5½¦ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿôóóÿôóóÿJHHÿLYVÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿ: ŽÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿôóóÿôóóÿJHHÿJHHÿJHHÿ1Õ¹ÿ1Õ¹ÿ1Õ¹ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿonnÿonnÿôóóÿJHHÿ­¬¬ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿôóóÿôóóÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿ„…‹ÿôóóÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççPÒÒÒÿJHHÿJHHÿJHHÿJHHÿJHHÿôóóÿLYVÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿèççþèççþ­¬¬ÿJHHÿLYVÿÒÒÒÿ­¬¬ÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿÒÒÒÿèççJHHÿôóóÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿJHHÿ„…‹ÿèççþÒÒÒÿèçç½èççþèççþèççþèççþèççþèççþèçç½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿü?ÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþüü?øøððððààààààààððððøø?ü?þþÿÿÿ€ÿÿÀÿÿàÿÿøÿÿü?ÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿMoarVM-2015.11/3rdparty/libuv/docs/src/static/logo.png0000644000175000017500000010141112502366750021421 0ustar jnthnjnthn‰PNG  IHDR€¿6Ì OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÞ £6?„ IDATxÚì½}Pyš&øð!„”X`Œ(ƒ’îì@tµq µåv•[µvoÙ»±¸=w5Ñx}{±Ó1=]m÷EÔî_lG¬MW÷tx`÷âÂg*®"ì.æ¢MÇØ×àÙ-•Ë^×Zàéïš.Ø@!Œ±lIˆ/ßÒOd¦2¥””’RÒûDT”I}d*?Þç÷¼Ÿ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ˆŠ<:1þäOÿ"øÏÁßþö†Î@ !(%Ë:‚Úüåo{ã~¦þž¹¹y oÓ>eo- ¾&‡Ïd¶;ƒÿ1ܯªÚ¹Lw„‹ÒmµZ϶··c``ãããËAé× 9Ø‚ÿdÿÿVĤ‘.Øy$ó€e÷8«ªv:én#²@Žq÷ëþþË€|òÉœ @¶J·§ÂÅÅS6¯ÿ-§"2 L½|Æ#R0"BƈÀ—==`±ñ§OŸÓé„Ùl†Ëåâ¿}À¹ßþöÆ_©Dû‚äð­àÿm9zøÄÂH… „$òå‘#‡-€îîsG__/ŒF#&&&pýú Œ³ôÿö·7NÆHeA‚øŽ–ÈÂëõbzz&ô÷Þ½{´D*÷ü={UÕN;Ý©"‚ ¤›ã¸³½½ ŽãB ¤»»Vkcè}ããèééÇã€úÛßÞ¸0,<°! 1 ¾ñŸžž†ÏçLN>½gZ•ýFÔÕÕ…þ®¨ØŠŠ ÀŽ¡'‘„ìA•B„B !h†@,Fo/kl´¢»»; 3ú/ƒã8á²ØéÄéÓgØ ¹ù·¿½±Ì#c<ÂØ§Æ±MN>€×ëÅÌÌ4±¸ø$øÿE͟׺º:FìÝ»C€|ø¤£¡  å>ÝÉ"BÚT€³,îqüx;ÚÛÛ%ßË ´/¸ö'ò'eÿäŸ|÷˜ÑhŒ{ÿÓÓÓX\|‚™™iLN>È’ˆ{÷î ‘Éž={QWW‹DÎ_Ðù„By!¥$r@‡ÍfCWW§ìû\.:;»ÀqsgÁh4âÔ©SØ¿¿9ê~1==ƒ&1==ƒÉÉI:ù***PWW‹ºº:5HåZL®™ˆ@© Žã.³”ÞHho?«ÕŠöövôöö†²µN:…7ß<¦.&'„#›•…Ú¨««ÃÞ½{P[øœî/"!éÒ àl__/ÌfsÄ÷²@ûÀÀ'ðx<èî>§Ó øÁ~€ÅÅEŠ‹Ò§N”Ä¢x¸à#ýäâ"È!ŸNADssóŸøÀÍfsY]]<nܸ!û¹ññ U®3˜Íf9r˜Nl𰏏ˆáᛸxñ"ººþ—.]ÂÈȨ’îð _ÎÍÍ_v ˆ@a¤Q677ß=77ÿ%€ËU„=zðÉ'²î(‡ã^ˆ0Ä8|˜D ðz½¸}ûŽ€LT–!ЙytnnþÓ¹¹ù:“raå6qXœÅVëvY\ºt ·oßÇqèî>¦4:;»àr¹ÐÑÑ!©8.\èÃá “®ATTTàÍ7âàÁƒJ3ºœ¸·þŠÜ[D „Ü#[8lÑÞ»¸¸ˆ;wîàöí;¡T[ŽãÐÑñ}Øló*Ñ!—­Å %š14„½{÷âàÁƒai×2XðKâ$N:{D "v!7oGô—[­V9r÷î9`·Ûa±XÐÓsAò½‡.ô ««V«ׯ_‡Ýþ×5 £Ñˆ7ß<ˆwÞyG©*épŽˆ„„£Äáõz122ŠÁÁÁ¸ ûäÜW@ ÈÞÝÝ ~:0 Ì_¿~ƒˆDÃØ¿¿ï¼Óª´!$I¡NÇââ"nÞ¼‰Û·ïÄ]àÇql¶ïD}ŸÓù•à3ííí8|ø0pýú ºhÄÈÈ(FFFQQQ£GFsou蘛›'"!!d;q âöí; ï³¥¥%bˆ×ë‰H>hiy]Ð… -,..âÒ¥K¸rå Z[ßÁ;IêÉ_‰„‚íYraeqXÈÝ?é}““088¨jÃBñœ1xÝz…†bPõzæÀh4*!`+ØNY[YªÉâ(›››ÿÅÇ"ÇùópþüyÕ»Ýr\äþK .…ßá§çZZZèÂj^¯×® âôé3Œäþ, *âQª#!!h‹<~$ަƒ8¢)Þè[Eèêê «5!d<‘X\$ÚèÌe>È…•¹ÄaCÀ]%ÛbbqqW®\QÚº"!X­VtwŸ•|Í aˆäÂŽúhebpmõøKrk‘!¤Ž8Êæææ àS9ò`ÁÎӧϤ„<˜Â`ý°"©XTõÑÊ|E%A£^[?¤³FBH>y0wÕ1¹wppgÏv«’Y+úûû%·Ûퟅþ)SK ÔG+³‰„-d&'Ƚ­ À/æææG©a#!9ı/Ø!÷Á. ·oßÁٳݸvm0mÚœN'z{ûÛ\.WÌñ>8Ž£€z†cqqçÏŸÇùó"¨îC Èþ‹¹¹ù2:kD uÈ£À(dj:¦§§qþü\ºtIcaív;ìv»ào>"¥úÊa÷n àøñvØl¶¨“ ÚÄää$NŸ>ƒ+W®DZäü0H$6:cÚjXu ÐZ}Ÿœ{`ppÃÃ75wì½½}p:èèè«.7¹˜¿¯±Ñ `ííí¡mããèïï§z‘ Äðp ëÁ©S§ä†\Y|JEˆ¤@‰©IòÅéÓg4I ׯß@GÇɰ *µRs­ÖFôô\u&d¼^/.^¼Í­Ej„„qXæææG(º Ãââ".^¼ˆ‹/¦-Î ¤Òo-–WUÝGWW'‘HcrrgÏvcppPî-Lü‚ÎAž<~Iu ßÄÙ³Ý)KËMbÍ€‰‰ñ¨$bµZé&Ê`5ríZ {0„ÄR¦!œ8X]‡d†U ƒåB´ÀcÆ ž¢@%mPºº:ã"'‚v0==Mì ªª!!WS£©ë`©¹Éj?’Ä3ÖVI0f¢¨V7òkJ÷%Éeò`.+‹”¤¿xñ".]º”ªƒXg~8NÅíÝ>L*$‹ÔÈùó"%ŠC ÀN.-"œ"¾Ë* ““RÚ‚$Õp:1¥ÞÆB8Tt˜]ðz½¸rå Ο¿ ·²€:üäyìC ‡•¤ËjppçÏŸÏ:Õ!›  'äòRZ<øúëD ÙV€¡Êå¹¹ùËäÒ"Éfò8™ˆ‹‹‹¡6$¹‡Ã!Ûx‘7¶f¥+­!’½jäüùó‘ìØ-t¶ˆ@²<ºüYV##£ÑÒ³===cGྊEY°”^‹Å‚¾¾^tuu±d ®]ŒäÒbý´(.B’ÄQ6772…ƒƒƒS¨6<.\è‘MëíïÿHðZ,À/V4›Í°Ùl8sæ4úúz‰H²Q\Ze ¸H6.«)9~ñâÅœqYÉÁétâôé3aAõññ AF›ÍSv{¯ø{Íf3Μ9M5#YæÒŠ¥u™ª×‰@2•<ö!0·#LJ³ôÄlͲŠlêàÀÀ@H™ôöö Þsüx{Lßh¾(›Í†îî³D"Y€+W®DJwÿ!׉@2Aläøñö¤´o·X,èèø>ø,ÀíÛw"ÅE:®‰hž<:äÈcxøfÎÆ;bQ#üJu«Õ*há®6l6õÐÊLOOãôé3r‹3Ö…‚ëD š&ËR¯]ºt W®\¡“£B8}úÇqÑ‚â÷’ Éâ"äÆ9‰h–<.K‘G”šñ4]ä+™XˆJ­%mÈ¥K—äž¹2""-’G‡ydS#ÄTÂåráÆq}öË/¨z=—qéÒ%\ºt)‰tÐY"Ñ$y°¶Ô,O Ÿ|2“š`˜˜T¹WVV*V! ---8~¼2´²·o߉D"—‰Dˆ@4IQÆtbÀåËý1½||‚×þDÙôCþœö‰‰ ´··£·÷¯©=|–H„ -""í‘eZ©¥}³øˆñÄ6<\.8ŽCGGzz.PŒ$Ã199I$B¢mòˆ²Ò!$€žžEAu—Ë% xStù- zz.ÐÜõ G”Å‘HzÉ#‡?iÝÝ碒HooŸÀð«Y€ØÕÕ‰®®NºD""õɃ\8NtwŸ“FÕßß/}‹b˜˜Wô>›ÍF$B$B !òÈT9}ú z{ûàp8àñx0>> z­ß9ŽƒÍöÅßËÒ~¬Öƈ$ÒÑA6†H„yt ˆ<² ±*…ŽŽ“!÷˜ÙlF__oÔÏ\¸Ð#h»BÈ<ÔÕÕá'?9£Ñ(~iÀÛUU;ïÓYŠŒB:É£›È#óK÷^¦d¶Ô‡²ÀûÉ“˜˜˜H¨b^-Ô7­ ¶~æ]k¨©_¼æšÕÁ½T€™©"LýT@7ˆH‰H+6$!7yt@¢=Éääœ?žN†É#–Œb%ÑÝÝÑ…ÅÇÀÀ€âùîjCoØÄþC^4þ‘¦ò ÅŸsÍê0r‹Ã„Ã@7 )‘„A1Èczz/^¤¤Q˜Íf>¬¼øOÜý×l6+&1íKmÅqêÞh}y€¹z m'–qêƒ4¶øè¦AĘ«X§VðD ŠÉc€_Äp“4‚“';bjA"®rupU XoK©êx÷äS¼{ò)ô†Í„¾ËT¾"’ú¦"‘àó-ÖÅ—H„Dy„ÍóX\\$òÈ2ŒO„©xÈ UÍÕkxïG‹ª{Sù†j¤” $"ÛÜ™Q D FeÁ›D@ùåMä‘èííSÔ–›ÛÕÕ×>[Z’O õM+hï\ŠÙ]ë>N}àÊy5!AæX0#“@"‰_C4ܵd§®º™Çš­ ýý ºü9r8¦Ø‡âÌ-ŽãTëæÛØâK™:`.²¶Ë9­Fnß¾ƒáá›R/uPˆ”ú¸ ÌqåÊ" Ãõë7E…R*EÜp1ÑÂ@1ù°þY‰ªÛQ7ÚN,§ü6¶øÐÞ¹sõZÎÞGW®\‘JuynnÞFOZ9Ÿ\QtKÝ@Ÿ~j§;$qÿþ}LLL€ã8”••amm ÿ÷¿ú«_âþýûCßÝ}EEE î1O@J•••8rä0<ŽãûTжËxíÛés›rÛ6±§yžçpÍêrò>zðà¾ùÍ&”––Š_:öãÿøW~ø³å\Örº04¿ƒ„%dÆÇǽ±Ä`䡆«‰ãŒ²¯9rg4zTBZH±Õ6Ñvb•Õk°šrîb.ìsçºQQQÁ© À¯ƒ…†9M"9ë Í?o‰AÈØl6Õȃ‘â‚´XZ«h…<øh>äA{瓜Œ‹DH¢‘L÷'ÉȦë²ÇáÌ™ÓèêêLêÈÚÝ»·ÅårÁétÂf³E‰h‘<jêW“ž ¦ULOOãÊ•+R/uÌÍÍÿ$÷ÔÇ/ ‘qEéºÙ‹#G£·÷¯S’vˇÙlÆ… =p:²ÄŲŸ´^ž¬Z”LÀíÛw088(õÒ/r9¨žs277 @ت2®²‹%©ªCL|TVV¢»û¼^o˜{KoØD{çRÆe5«á3 ×® bddTê¥_çj¥zNÈÜܼ2As™”=B–Ànÿ,…ª£Rð·ÕÚǃÎÎ.Aý #LL—e…‡Í‡<9u]ºt ‹‹‹âÍeÔ‘d9~ Q܃‚æ¹@VÖD’¾{B¤8„ Dª:ÞT¾‘ñµzÃ&lGÝhï|’3±æê–€-8þ$KÕ‡l܃PR¥\®…п9ޏ°ìv{Xa#‹%$ƒ<MÁ>hÂ@ߎÐ_ oÃÔX1ü¾ä<î5õ«8õÁ´½È‰û(BPýl°4 gu Á ×ÊQB–«DÚ–H?§ŸÒ{ýú ô÷÷ ÞÛØâƒí¨[õøÁ£©"ÜÚ†GSE¨©_ÅþCÔÔ¯Bo؄ߗ×lòõ7ZŸ£ù-F?ç0î0dõðªáá›Ø³g/öïoórÌÍÍ7çJ}HÖ+`pë×R7€L@ŒÅèííU}Š ß…ÅÈÉn·‡‘kM¢&yø}ù!Åñhª(؆ä ê›VBûÑ6Cd’lè ›x£õ9N}°€wO>ÍêŒ-™¨9T’ .¬°»ÓÓÓr)y„,‡Ë助*\É÷ñHc£½½}‚}˜Ê7ðÞû‹ªœ]³: ô•cô–0»L++ÿú¦¼{òiȽ•mq’.ðŽ`¶gÖ#«GÚ/b˜ú8{¶;ëSvMå0mßuw(AMý*j¶fl/<.ÄÔXqVœŸXªÃ#Aì¦â8N p´½@ó[ÕWÿŒ<äâÌ¥505VŒ‡cÅY5R÷ر£8zô¨xó2€ÝÙîÊÊZ º®¾«+W®d]Ÿ+fèkêý0mßP´Òs/àÑTއ‘BMý*ÚN,K~{©w‡·e…H„DœN'®_¿!éklñá@#gÕ ñBâ@ësÍ)º— 0ñ;cÖÄJÎëF]]x󵪪ÿ”$3 ä×2rròΟ?Ÿñ¿MoØDc‹µõ«ª¬0Å¤ÐØâ‹ÚF|j¬CWKFLl4ý¾|Léqwx[T#a®^ƒÞð2ø¹¼”u€miiQÜÚÄétÂn·ãÞ=‡ žƒ]ê›üI#ŽXÉCL$¶£nMÆ$&ŒÜâ2ºëoEEÎë+ðO«ªv^#É,òs]y½^œ=ÛÑYWÉvKL8 ºl§>Xˆj§ÆŠñ›ËÛC·w>AMýªìwÛMÃǪšå>ÃÀ\n®Ç:øWò±ð¸~_¾bW\4p‡ŽŽïËŽ´µÛí°Û?“ìîk*ß(Àz?ê›üI Tû}ù¸ôS³àšÍf?ÞŽ––p§Ó‰ë×oÚË‹ï!Û1·&ëOø™d™ˆÖÖwð§ú§âÍYíÊÊ:ÉF×U2Ý!b|1¼ w‡Jp íÞh}õýCWËBÊ%0xw¸$,èk*߀µÅw¬À5«ƒß—Ú%k®^Sìsç86ÛwÐÒò:¼^îÝs`||‰ú^÷R.ý´RD[i&£µÛ‡ýš)!‰¹z Ö[|)7ºräÑÝ}6êgív;>ùd@Òåf*ß@Û‰eE×,½ÅáîpIÒ SìÊz»ªj§DÛäaƒhÆG&º®Òí¯èÛ"%øøÃ ¸Ÿ óß~³r˜+¹¤Ì»F:ñûò1á0`aV÷R\³… Ó°¶xÓjdù*ˆoV$"Qª6Ó÷R†®–e”[KÆ•åu†ÙV‰Ö(ñæÍ›EɪTŽiµ½k ®ÇÊWëzÃKعãZÕ«¥6ü¾<øWòQZ¾ÒòÐo0ïZCq08¯/Þ„y×Zñ¸fuXñåÁõXJ[®©÷kbe.&ŽãâšgÂâ;R50w‡Jððôhï\ÒœK+Ð3ìIȵ𠾉ƒг²,tÃè&¢MõÑ @ é§§§qölf\¯ÀøÐgšÈ’èÛro(U™ÜP«“tuuÊûåàt:ÑÛÛ'ˆ‡°L¾©±âP¬AiRCºÀOòÐ:êêêpíÙ]UµÓ™-÷hVT¢Û´ÿ…xû•+W3âøÍÕkš™ Á²›jëý1?!ùäa³Ùâ"îîsaÁt¿/•Õk8õÁB¨æ'kÙ¡jkVû  CÂ.E%éåZÁôô´\ÒÎeR Ú#°šáá›r35…šúUM çùbxFnqêWNÎÀÖ3ƒËÇñãíhooé»<ººþ\¶÷W`LíVœëÑTÆFLéC®TµÀâ”çUÔ4¬Æ½ðÈw–ÑhĹsݨ¨¨¿”5µ! Îäáõz3¢×•ÖVT®Yî• ½ó ‘Gà^*Ào.od[q‡î.¿JÑßÿQÄÆ‘¦Šà^*¥"×Ô¯†ÜWjõ5ò ±Å‡Ñσ™Uƒù¡}ÄžÌÕëï¿7ZŸcæa‘æë^¯W®\Á~ðñK¿’ñ dnn~¢9™Pó¡Eòè+‡í¨[ó³¹³QuŒ~Îaä–1ÌÍÓÓs!Nòè›C"%X~_>ü¾<Õj^ØïÔÆ„ÕÚÈÝ‹î¥|üóŠŒHñ•© 9WUµ³›$½äÑ‘O1çZ#æ°uç܈Òt‚5œÓKBæ¶r¹\XXO¿µX^ ËÆbý¹¤ªæ¥ 7lFuWŽÞâ`4%%CÐ5«Ã£‡E˜™*’lÔi*ßÀ»'ŸJº»2Å•%PÏŠ õŒ%`Åù(éq!œ?“““YK¬¿ÔÌ”>TïÀ(FZ±É­âþýè‹7ÑðM¿fk² ƒ¢þ`V«N§3êü‹ÅÇ#Yã¡âXˆ‰Üëdf Ncfª(,è.7[äÒO+3¢býÔ©Sxó̓âÍUUµó/‰@ÒC ݥ펌ŒââÅ‹š=f6!^(©ÌÕBPžï›ÖjJhº •]¥DêÀÌW ¬‘có!ªAv©…?™@N)eJj¯ÑhDOÏ© õŒNëÍH‘ëwuúô™” ê ›0W¯£¶aÏ– dC¢ò?Ó(QÅK#·¸„æ…Dša¢7l¢r׺Èèm¥G ¼j}ÿúÍúíõ†Mh}ÑÉ'‘T,V샦Pï4)"Õ`R«™Ò_Uµó$HšÕÇíÛwpéÒ¥”=h-¾PC=¦ìƒ&Icn;êN(Ϫõ½÷SRŸá÷åcèj)¦ÆŠmæ]³º´Íz`ׄU¡×Ôû¡7¼ÔD½ÊÔX1î•À¿’Óö”¶®WŠhu~o.VÔLa¤+w\|’Ѻ ‘Iëm®ªÚyŸ$MêÃëõâôé3ðz½IÝ·Üp)¯VUo¼ÂTô7â¹î®ÑZt‹§Î<,R¥•ÌÕk0•o ¶~æ]kšp±ñãZrõTÂT¾S,D=f¶òO6‰°çK.VãšÕáã+2Â~½ùæAœ:u*Œ«ªv¾‰’‰u ¿»®nÞ¼™TòÐ6±ÿWÒ K‘G}Ó ÚNÐcϾ•Ð4BnÛ&,{ýØȃÊ]ëðšVà~Zr9xŸ ØðU®” ‹ IDAT¯®EQUëxí€ÎI=¼Ï à}^€¥…BEJKox k‹/ì\ÍU½á%ÚN,ãµ>”W®Ã½øn׬£Ÿsð¯ä£êÕ5UÏ'·m¿3†ÚÉ»ŸÊ’~yå:¬->¬¯çaþ«ä·ïxëÈs”W®+~Éî§hùÇê¢Þ¾¾ ÞçÁ,Æ—²×wj¬Þç™aÒ²E…d’ùa*ÕGÛŸÊÇ0î—V¦m'ž©Œ øÁ‹Ãí½÷%SkDsÕˆ¿Èaôs~_~ÂÉb×—øœFRソúìÔXqLuo´>ëõÅj X,â½÷ÓGoqøøçªûØ÷¿åC¤L;½a¶£î¤÷)klñżšg 'ñ8a5(–Õ¡¾i%ª kø¦?cŒY²$9êã/Äê#Yý®´½ ¦º— )ƒm'–U—ÏScú°‡:Ҩב$p_FÔƒ¿‰Âvtk\o`^ú¶¸hÂaˆ)³¦~ïýH˜æ,Žg1÷Q{ç˜Ê7½—>¬P5]T<wèjYT\S¿ŠS¸’’=VS¿W Ô} )«Wi&¹±È5|ý "䨔d^é ›h~K^†óë0ª6f¦ô‚‡‚ïûƒÅ#¤VõIQf'ž¡íÄ3ÕÎ5_éM8 1uXåÿ^û )¦"ÆÀ¤;!)ß* SŒlX¬É>hR­ò™e÷ñ1t¥TQ\§½ó‰¢@·R4ò$¤n˜kImò0xM•KÑæÿ¦m/4[`*£B:‚ÉBD *"eꣾÉ/{ùy•ææêµ¤¥-2#˜ ø,âû†®–ÁT¾!pë$,íT-˜«×Fôîж˜>ßvb9DCWKcª¡`©¨|±šÂŒ s±fúv¨R¯ñFësš`)±J?ËR¼`#c½—ùµ"e/|Î… J²Z…ø}ù!7ÀÖçoú¡«eh>ä sÇdÞàÕsDË>“KvP’ÑDü¾| ])•u91y4U¤( L) ò¯óè-Nñ9` )V5¢7lâ@Û Ùì´¸ iûºêÏC,éÔüES¤,O‹D"£BŽÝöD *à¬BÖVÅ¥I*3õ±ÿ7ii•®ÙÂÐÊ0’¢p/àÝ“OUo¯.ð;ǪBØ™ðz½o¶Ý÷D qª D³Î§§§“6,*ÚŠÞ5«‹êVRÙ¤.bY…³‡Xä ]‡hî0~ÝÍÝ¡’„æ¡„þâ!R9ù ©³ÎkVAÐø®Âxz–ÑÅ4Åí>9æV¤Bǽjy2šà|x ¼¡§ZÙ^‰bÂaÀÇ?¯¹“’UT+§B¡ôíˆêšÇBE f'@$ÉpÙÉxZ4L×¢9ÎÊ·“ºÃÒí hüæ|ñº±ø}‘ÆƸ¥¦~õM+Š] Z_„ökk©ß n1Â:§Cq|1¼-lNJ*ƒÍR®]Ö)9RlÄÚ²E§šš¾ì…ÿ¿ñ·ý—ÿr£££I¾)Ÿ =L•ƒÞð2®QnÛfH5”–oDX%O /C³ÔË+×aÞµu¿þ•|ÌU„ù¯ŠPÛ°šàb+iç¤U–5ÕÇȺfupü§üÇÿ·¿¿kì—U»·x–¶Â»ªW×PÛ°ŠGSzY°9:¿¿k„çyÊ+×C}´VWòñhªüÏÕÖ u/±§yņ—ªŒÕžžAkë;ÐéjÉòá‡?û%)Èóõ%³òœ­ ÚÿºÄ«@øÅ¡3 ¦Á²˜ŠÒ‚6¾++Z!›Ò•·ø^uÍêðñ‡øbx[ÂjäÑTìƒ&\úiehî _µñ}ÿZH(a+©cñûòCö? ¸·Ôî"-6YýÈT¦knØT¡ÆŽGÿ×L&u‡ÙЈ0[a®^‹;24 «pÍê05Vììßõ®©_ kVÕïÏZÀÿæòöPE»Üüz¥hï|‚¡«eaþþ»C%ÁA_~4(öåšÕáÑÃ"Ì[}ÈP}Ó öó +µ„@ÍeX[¼°_3IÆ7\³ºPÌÈ\½† ‡!©ØØâƒy×zÂM6oÞ¼‰7ß<(µÀ¾¯¥k –”ûêöí;Kê~÷6¯ Ñ(榋BF!^7P¡îeÈVõêZL³¾¥¾kj¬ëëyŠ\jå•ëx4¥‡ûiæ¦uxí€/á¹ê M+asÝ`c=®YÜ´Ty4¥Ç£)=gu¡Üâðû»†¯–á÷wp>ÐãéB!6Öó”ÛÖøãþ ¯}Û›ö»J”ækßö¢´|#ÔVE Þç˜+Æèç–t(-ßPÝý\˜–½«xp¿8ìÜ*ųgÏðæ›a4 @vjÍ¥%’r÷€œ­øÎTV¯a†["^åÀ üf¦Š v²ac±¤h{>5ú9§J'ç7ZŸ£¾iCWä«ÞMS±áú¦X[|Û‡%L8 ¸;¼MV¹²êù ‡!8ÐLýÉ¢æê5´w.aäWKæÆjm}'ÌUUµS3*D3 äÇ?þñopÔââ"þæoþ&éûÝÈ£ùV®bc=/¤Ê_Ùˆ[)Î}UXi¯åáµoÇ?ˆ¬P÷K :ÌU„Òò¨Átf˜YÜ5[¨Š a«\¶êv/Àû<¾Tço}ÛÛ17Þ<ò–½þ¤¬ÈS ó®uì?äAmÃ*ü¾|<]_'óUÉÆz>ÌÕëª\vJË7ðû»ñ¥‘»Ýn¼ý¶M¼yåÃ6D $Ü}e³o* ÏÁ¶écªÕQ‡•»Ö15¦N @CÓ &<+V¼j=Ðú<”^ª– ¯ºÝKC8LYÿÖ@·…—¨mÄr˜2Ëf°"B¦8ÆÙ{ÀïËÅ’öòªv –ãªÝ™žžÆââ"***ø›øK"!Òâ¾b˜ M¨eàjêýJB®Db^,›'– [ï#vnÑŽ|.ÝîŸɸà ™ù/É/D ­»±´’Æ–}5==Mw>A•X˜œxž>kµK,„UCÇÛÔ .Ñžú`ï½H–"s~«5`;êŽë^–YHÓÊùL;Kô-bÖͤ.Aû`JóÙRâa¿ÚúÌÄ@FüžLãqU êßÚùѶ£·8|üa…*Uÿü‘ÉJ1==-5îö(H6}ð`2E7e`iµ*5ºdo×ãĽ¶ñ(¾ q/Ä™CHÎBòÖçxïG‹’*Á5«K¸®ƒí'žÆ“ ê}Z饰©Ì|`BŽ+‡DcU•¼æŒjÖæ=–ïã»Kið˜‹ðûò“>T‹õ÷’Š#¹fuª¸kêWcŽSÉôƲiáºh!ˆ.8c 9Œú¦U¦Âñf*©$j‚îÅô]->ŒÞâB )…\|ÎáÑâ0’Ö6QS¿Š†¦•¤T•ÛŽºQY½–9¥VÄÖ˜+VÜaAÆ&ПÓœ<¨„m 9 5é|w¥ß——ð÷UòzlŲ¢´  Ëz#‰“ü2̸64­à@ëVl½T÷Ó<+ÆTð¿»ÃÛ`;êV}6Gc‹î§…¸;T"PAScú„I‹µ`èÛ¡èý^¯““°wïÍ)t»°¾£m“$‹óèiÍè ›!Cäzœ¸+Þ!EÂ9%‘SÍÁþ[üÕ¾©Q-u–“xfʨݟ‹ÔòÎéHœEScŲäÑvb9iÇ®$¢Å8HºHkÎ̤§yb¬ÕÄ‚ذ°Ö&±ÀT¾r¹¨ÔÏuðWññ¸¦ý¾| ]-M9yXˆLOψ7Ùr‘@l åYjTÈCR!„øÐvb9¡9ë(•W#ž…ÑϹ°„ˆT#?%Šq²töÅJ|‹ÿ‡×ëMiýG˜ú!7! P³?!qO„¸°3UäÁ $@/³ÐN› Ñ„‘eš_­‰‚Ÿ¦Vjq.C¬äby®ï—>ÏO Nذ²H™“ô­œ! Ü*‹"ËR¾ú U !ÕŒ™ ¶W™¥8H¢·1mßPôì1¼-lZ`ºFþF‹§ÉxkÒ–‰•޻֢USŠ©±bÍŽ· \aèÆ&d‘ ©_¥jtŸa½aS¶Óñ£©"د™".'”–o¤¼Ù¥µÅuVÌôôŒxNº-—Ä&uBÒ™‡Ex£5½òÛý´ øÿB<[*@ið¨©÷Ã\½N³ M+D *@\ûi%_S¿Š÷Þ_ ÍGw$É„ÍF?ÐúõMþ”<5õ«0•oDL¬˜™™ÆþýÍ‚mss󖪪Î\ MÐù7`ª”„ë±þ•|Ì<,‚ß—׬.Ôi´¶ÞÆ?òÒœˆAª S¶ãîж°•|4°ùè͇9A ­©¾Vc®Ÿ(fup/À5[(”š«×PÓ°ŠÊ`u4FnBoØÄ{?Z„Þð’NFÏ-ÈŸ?ËÊ¿¦~ZŸcäsƒàyõûòqw¨ÿAwO>MêóÚØâÃÝáÙÄ —ÿ>×r@ö)8iÁÌTQ\òhª¦ôXx\W0Ä0W¯¡¦Å‡ÚàJ«N%Lˆ±&.þ;Ðö<¡ka;êÆÖ°šÂ‰kV‡^öÎ¥¤ÅL™Úá³{m¼^/ŒFÁXä´db¥”@¤ úÊñÞ“Fþ$O …÷ŒxB¡%ë ’XÚqa¹fuðûòÃŒ=eù0(•¥¤%Z ]- [ÀP9FQS¿ŠS¸0ÐW.´û}ùøÍåíxïýä,€Måhlñ…Pc‹zÃf(ÝxzzZL iIåM5ì 'iMÝ”®ÙÂÐ †ehHeÉè ›¨©_ECÓ Å0„4‡Ø½¤´H\³: ô•Ë’s)'Rm×%yn:S8L…@ånIR–êë’jüÀtÍQt£òà½-&U„è˜p‚Øb¤ªÅQùW’kFmGÝ¡ÅëÈ-c(‰guókñ[S>\*e.,©^-*æëLÕ éšÕÁõ¸ ³:¸ëBíLÒõÛÍÕézµ «0m_‡y׺f{„²Ñ\V|4¤0&YÛ°*ÈþJv$67Ý>h 4—ÀvԵͯQ”ÿJZ¯Q*c aòJK)¼ìB%«@ȪH×áÙR€$´ÖFÞïËÿØøgÔzƒ ŒÞâ"Vc‹ŸÛl÷4ò„ÊFoq°¶øPË} NhÁmÙL ­+ÛQwÂäÁHÂ5«ôºÊô•àÔXqh%Xß´‚†¦R'Õñhªw‡¶Å´¸j;ñ,­ÇlÞ•šg íÄ2>þyü¾|د™ÐôþBÚ¯WZ DK5 5õ«q­b\³:Ùÿüé×xëõ°·¤4+•ò­ª¥2”°ÄÓËÊ”Z²W°b2ß"´-«iØê@H¯âêz«„8ê›ü8Ðú<-Ýøq­ûj=¥ÇÐvb};4qÓ¦@¼ÞÌ z±<ôLrQY,pœìœN'<OÎ’˜kV‡Ñ[\(ðjmñ‘›-ÅÄ««Š‘†:@Lé+™c®6jêWQß´‚é?H.ÂmHa1aZ³°r‰<, ^½Ö°×&&ÆñÉ'²ŸmiiÁ‘#G`±¼ Žãàñxàt~¯×ƒO>€Ó鮈Ìfœ;× ³Ù,ý{\.œ=Û —˕Ӯ“Ñ[Foq0W¯aÿ!e˜%¦Š0r‹S<}Ñ\½††oúQß´¢)‚¿;,\Õ&Bk;ñ —~šþ,ÎTˆfç€ÀñbI·뺙(yôô\}Ýjm„ÇãÁõë7$_?y²C@ÇÁjm ý}áBèû¬²äÁæí·m²¤eµZßχÇãÝþYV©׬.4u®±Å‡ýoy¨9¦J$=á0`äs.j¬©ŒÚz¿f‰\<6—s:ÀJr‰@ðù´•Â;á0à@ë‹°wjLñægÆÖhä`±Xv»v»]`°A¤Ï/,„«ˆÊÊèûûòKgض#G£½½=Ìí®ˆ^Gww·äk8búòK'¼^¯¦]h|UÒØâK›Ÿ=9 6ô^ZU²êC46wÿ!oZ‰Î\½†ÅÅETT<¦´²°xƃUxò13¥k ÆˆãôéK[‹åUìÞm‰ºÿññ‰¸Ž›¿¾â‰Ç‡Ã¶½££CÑ>åÔIGGŽ9uß==?Ãøø¸"åÆÎ¯’÷«½ `­º÷òPœD¡Úwd&”Œ@Pk¬t2Ô‡8xÞøGé_çéçTd·™››·dÂC0z‹Ceõš 5ÐïËCó[ž0‰´RǤVûb£*Žc(…ÔçŒÆÈ bbbBRI)…”‚0›ÍQɃ)”öövYB°X,èèèˆèBëïÿH’8“I$5õ«8Ðöœ²·DJƒÕ@EŠm°ÂÓh®©/†·Á´}]“¿Õ~Í$ø»ù6ÜœÅivõ¥J„ˆ[¹Y ³º;ëÝ“OeŒðx#'\™D«¸w:¿ŠJRªBŽt¼^Oµ“Øj^J½TVV*þ|$Ûñãí²ç•PGÇ÷SF üè@ߎPkÿú¦ͺ·˜a_¶Ï‘ë¯Æ'C~!èÖëÿ~à;¦bÅ—×c\³…ÝSJIƒ©—¡«¥0•oàVíegNˆTëME –¬™pB©ƒ¦ò ˜Ê7a,~üxÕE4ÿý---qV4ÄëncŠÛ(UOJd®íÞm‘<ö………¸3ÐÜK°š`4…êJ*«×ÂÈÄõX2à‚Ϲ¹z æ]ëªMaÜa ôFûŒÐ}$~GIÌÇkìhÂa€}Єú&˜ûX+g^¥;öëb$ `>]¹|õXŒ¨ÇãËå’ †OLŒG5Ø6›Mµß¦¡%¦`îɾI}0Ü»çˆøzOÏÙ8P{{àÿÝÝçVb¬®$‘ÏN8 Ð6ÑvâY̾÷R&~gÔDG„ú¦ØŽº¿çUÛ‰eÍ6Cœ[Sù†äLtaöë ü»^#É48Έ¤ å6Š—b5tãã!C)Gháª`!¦ßžØ¹KLI¹ÐÌfsÔ$FT©ÌGZ¬üæòvh{Yé½SczŒÜâ4Ѥ3òcÇ~wxÜK0•o ½ó‰¦ãJbõÁŸÍ¡¤ÛJ’ìv;Ú%,5Ç%WÍñˆËå‚Ãáˆè–Rjàå^SêÒQ#7Òñy<ž¨iÄ‘ ¿ÒXL´Ä†´«¡Ì<,‚µÅ ó®u˜¶o„b ®Yþƒ^S[|Q *#‡¢œÍ‡<’ióZÂÔX±@}° pˆ*øôSi‘Z;EÆ1Ò¾”ËêŠ%n {´Õ»œzˆ…X"½×éü*¢+QõÃöMżý¶ f³fs¥Hu.È|ª©tQ-Ai±¥\¯+6&:²ÙÆEîëmÏÉ襉@,Ùxò\.®_¿!™¾j6›ÃVõ7nÜ$%n0‡Ã¡ÈÀo­Ò'¿7IÔ°G‹EË ‹D€J!•ÆÌ'¹®ŒØ<¯l+¤dmg˜úTƒøä gŒÍ»ÖPlxêïlšXzQÉõºÒ6±ÿ7ª‹N+`3pøç˜R¸5D ‹‹‹Yq`³}'LYX­Ö0#sýú >|8ì½üUn$ô÷„îî³þ°"Œ<´½À{ï/f¬áu=RO4"¤¢¿¿_ 88Ž“]‘ööö…ŠÆÆFÅûêíí íëÈ‘#²ï³ÛíaÆ.’Û‹}&õ €ŠÆô IDAT!'¦„¾ŠJRñ~V$‚ˆ†+Fr²šÒ’™å÷åc oGX‹sõÞ{1cbJêQD ê ™èííÃÀÀV‹ôŽŽïK* §Ó‰þþÂ\ ±¬’Ù¾¢õ êííüÍq\DµÃ²ÅâU j̉V(€îÅﺈR#çB‹‡<¥R‰cM/öûò1t¥4µ«óà|œ°æ‚->´w.eEãI-gÂå",çUw÷9¸\.p'z‹Wú|ãn³ÙbnûþÉ'èììŠhpYÜD©Úaq9HÕ4þŒÄ!¢D”Ë劒fìT<¥²Á”´i‘2è_ˆ Þ’MbÕc;êFÛ‰eÈE’ÜÏ¥“:>>ŽÎÎ.\¸Ð§Ó)K v»§OŸ ž®®®¸ ^4Ã%v¯ES;ׯß5¢Ñ‚äj59¼~ýzÜŸMT ÅëB“#O¹À|¢1'>¤²Ÿ’Eâý´XFó¡ì“ÌÝI?ä$z{û"3§Ó‰Ó§Ï```Ë« Ÿ’'‘B†1šÚ‰¦B"}V-7–Ýþ™ä÷(ÍòJ„€â5êrûŒt¾ÄŸ‰£’ƒß—û )¥ä˜Š÷D³}¬Ô„ÒQ¼D „”Ãã Ì6ïè8™´9å.ô„b4JTˆÜ±D3â‰oþñ^¾Ü“1P¼±»Ý×g].—¬“;g‡C@Xñv*Âÿ%Ÿ<–²6½Uœuõ„„ ,n ¸8ÏmøT$ã­¤Û.ߏР²RIE)1Òvûg’Û£µ›ïïÿHò·G:îþþþÐg­ ]ß‘Ï9Uï9·•í¨;«§4–ŠDÜ’…@’³P7±œþþpM½DsÅ‚þþÂ×J öäb9JHHNE),ΰ‹Fœü¬<«µ1a¢–¡c^R1lw[±aZ|ˆ«ÓµCÁ7Ä›–‰@šÁõë7ÂT€ÙlŽªB"âcŸÛÝ}N@"‘j_”¨(%q—Ë%HÉÞR/FêÅv΢‘žÝnÇ… =ðx<’ýÒb1új] ¯.o>äɉ˜‡TíÇÌ”ö¤ ?l±‘Ò„¥TˆS¼¡®®–¬s† ··/,8š‘óx<’X©D"Vk£b’ê ô³Rq ¥.´ÞÞ¾°ØF´>c‡]]µ]K4¨áÆúbx[Xฦ~U³SÕ†Þ°æ¢Ó¢I7RB UU;ÃÄh4ÒÙÏ ô÷÷ *è­Öƨñúõ’MñôËòx<¡l5ÇS£Hq³¸ÍL•Õƒíµ~Å F)uww ö{üx{T÷K¨H„²†ÓK ê»'ŸæÔ=_Ó°¦î´4%g„`u+Œ”tîííí seÅÚtO>@WןKfhES|c.& ²š˜Â]3ãããa$b³}Gúa*|‰bÓ:ò _ öË‚äf³ßOɵ¹Ÿ ñûò1tµ,l{Û‰g9W$X+‘aæz¬­Jùy%éÝ?™EB,p¹\èîîÆéÓg$ìRïïéù™`[¤>aJÕH<éÎ|cÞÞ¾¥ÖýǠļ*I"â®r2wXVPeõàÕ7Ì >ê7CJ¬«ëσµ>–„;+Uñ¤ô]- û\ó!ONNâ“úÍZ‹ƒHÑ?Kåþ Rµ£ÿøÇÇìÜÚ’‡;wîEÎP,//cyYYÂËúâgo••mW­j=ü÷ÿþßqóæßayyNçWX[[ƒžÛD±)4-â6 +~ ï’ÐUÁÚãïÛ·Ç¡¬¬,¬b½´j5DEÜJ«V¡+~‰UOü¾uŒOàæÍ›ŠÏ›T‹ðvm9š+MÈ˼[«fÿJ>b0ü¦Špûº°1àºZF¡îen.˜fuxº T¯}[;³A^1¼F ~ø³”=X©ÔcË ä,Y°“,©3n²àñxu¿G(ÄKÌ"øú›ëy¡í,ÈÝÑñý á»ç˜’W‰y/\Ex¾ ÃŠ[½Gî{{vâ{{^Ùú]køW÷_áY Ô0Léá÷å+r=‘ëJµõ«‚x’kV÷R&Ú»äqi?š‰NH)‰8Nœ9s:ÔE8"†”á/6­c×k/àzhýH–|²‘#’Íõ<¬z·„ÿŠ»Ït’Ç NW€ÿãÛõØ]*L×½8:"F SczEi·£Ÿsa®«šúÕœt]ñaÞ^,ywxÚN¤=l(”œ–•i¼a?lïÞ=dQs¬÷W?\š8¦UO¤ñ/Ôo¢ÊêÄ3"¹Á">pÁ@;û¯¬f»^{¡øXw—ðáwþGIò¸7ÿ,ìýãŽèÙŽ~_>Fn%Ô9 ¤Zµh¼*=¥-• ä™O[ÅÇ:-1ÙXqÂX¾Q=¬z à}ªƒß“UOAH5ä¾ÄË Š¸øÜÞ§ÊRCÅ.+ óøëû3[|! ™/ŸT ¦Gr¹Œ~ÎIÎ1§)|AR½–¾;ú9—ö¡YºüWrŠ@Â~X]]¦§§é%¤Ï]:Ya(â6â& )¬ûóñtF®Èí›*JpÒZ¦:þö.üêÁ×!·USE þ|_-8]þìÿ ½oj¬X¶Ýºœú8E…ÞðRBÙÒN ERUµ3¥.¬THØ£bB‚Và]ÒaÕS *AÈ‘†wIŸ» ,ÓK NW€ÑT·kË…ÆëÉ üßc³!•ÑTQ‚ïíyÖ[5¯ï, ¹´ÆY‘rÇúÂT¾L ·¹— 0á0¤µ­KÎÑ+*vÐÝIÐ æ&8T5zT%‘wa דw¡¢`9§+Àw¿aÆw¿QNW Ž_=ø:ä®’"†Te ˆkV'›%Õö„Ô‡¥2d:î0¦•@ …a5 ö¬%ªªö¹¹yTÐÝIP NW pãXw”`üÉ–ïÁ»*¨ƒˆ›ëyxüû˵!ù/“ ?»Ê÷¬›yXõÄüû%¾fBKecIÍ!õ¡JâKÉDº«ÐÓ¡@–„’Íwì !Ècw©¯ï,ES‹É 0ª[÷/xWáò­blу/Ÿùàtûb"ï’Þ¥ÔýÎJc¾û ¼][ž0qðɨ©¢$ôÙ™©p‘ÊÐ"õ&~gL[,D¢ =å£ÃSM ÷ØH¢­Â߮ݎJc|³¨+E¨4 í‚wN·c‹Œ?yФów¾¾³ÿ¸n{!ð‰ƒÓàíÚr|oÏ+1ŸëŽ-Ïõv/„m#õ;ÒL/’ÎÀJy¦k:HÔÒ &±ûFÍU~¥±(èÚÙ2ÔŒPøi°ÉTLQñƒáÓ™%|:óc‹/°»Ô  Ç{>š*8üêÁaðã ¿ WÖ/݈1‚qªGûHˆ=Û äïcPøëÐ\›∶B¬þ#sw}ùl%øŸ ²;^´»´“ARA,xWñéÌS|:³:R)»ñþ>>\³…!C7.:e®^ËÚùæÉÆÃ±â”Ÿ»âp÷UØ= $ÌG·wï^LNNÒ]˜£øî7ÌøMÕš8–Ý¥ì.5àm‘0æê¤²)" ]ˆ̆¢¨®¦ï*îÍ?ç3Oƒ®,~ÒbQ…4¤~ÓVQ¡5õ«¡~N|ì?ä¡›1NL§|ÐÖúÊ6@´þNu H:$Œ!)•—ÈCëà¯ä•°åpoþY(˜oÝQ‚ï~ÜuÇäY4ÄêCoØD}“ŸnH<‹Òß½T׬.l‚a2±ÃÔuqžuB©¼†¦Š’Œ µyê÷i¯̇ [1óQßäÏ鎻Ѡd®Ê£‡E)%M•Øz§¥qY::‚9ùìÙ³—îЄ¸§!9à»Å\³…ä¾Jf¦ŠR¶¯‚<Û¸0õúY:~w:*Ñï°l)raå¢Q‹ÅäYۥಠK`ñca È°©‚KÈÍ”Íðûòñè¡ÐЙÊ7RºrÎD¸f£›ÉG)$-´qO'2±***`4áõR a®àËg>Œ?y!ièY½Æ—ÏVò_»7ÿ ¿z°UcñÝoT$%0É·.Ùÿ©%Ä«ä=©ŠƒÈd`9sIPWWG™X9†sg »K…Õ剤͊K ¦b »K ¡*ï\Kf»¯r}`”šÊÂõ¸0%"Qž– ,ÍÈÞ½{ˆ@rT‰¤bGgð«_ã{{^É)"¹7ÿ Ggd_¯oZ¡Êó(P@½÷ijÌiq¸ Ëž®ó“ò zUÕN'Dµµut§’Šï*.ŽÎàýÏþ› ®#[ë¿»çÄ¿»Ù«Ñ@êCUR˜y˜š8ˆz`¥S°lcPKB*UÏ¿¹3¾o¿--³¶¿ýÃb(m7¨öC}Rp?M~'…ÝkR›ÿ>×ä3ˆš*VTT`qq‘îXBJ0¶øÿêïþ+¾û 3¾·ç•”·QQ[qüêÁ׸7ÿLq ‰j?”!–H,î®x‘·Ú · Ï9"@]]-!åøÛ?¸ðéÌ’ää?­ãÞü3ü§é§¡ÁQ±€Ú¶G‡xºÒÏ$3¾c[Xúrºèé$»xÞ={122Jw-!åð¬m„í?h®ÕtÉ—Ï|øtæ© -J¬¨©_¥à¹õGLÃïËKê1qá.¬ûéÚH}(A<Õå®Çº¤uæ}éß)5ý³tž£tÎDH]]4±ÅÀ|T Ë [ô„”†Ë·*›êÌjh¬;JÀéòC“ ÞUüíe?WS¿JmÛ•*8Ä¿’¼ÄÖrÓ7¥6Ûs•@>ÐÁß°wïrcr‚HîÍ?ÙscüÉ YUÁÆÒf‰è°»Ô Ù.ž¹µ>YŠDo;±LV‰’˜Õ)ª@O%J à ¤ªjgÎHا8AËDRi,Â÷ö¼‚×w–Ƶµà]ÅÿþŸ§¤Áé}¼øD!?^H±¸µ´½ Ø‡RyŸiœyX„7Z“d¬×÷zí¨´HUÕNçÜܼ¼ÆŠ!h¬‘ÓÍÆÝk‹ÓàÍ[uO±¨š{óÏ⎅ÔÔ¯¦evw¦bfJ¯©ãyé߉måÚèÀ«Â´ƒýAqB&€ßk‹Í9ÿGU&EdÀâJöÁ:':³]oØÄ»'ŸÒ…KIÌ¥oÈÙÏœ&Aˆâ û÷7ãöí;tÒ cù¶™×ðl®+äoÿàÂßþÁrE±9èJÈâËg>x×7°à]Å‚w-Q#ÛŠáÝ“O©h0V‰£$™() ¯@OwüC+ D€={öÒŠbÓ:^Ùã ÉŠ»ž¥B¬¸ ±ê)ˆ¨X¼D+h>䡬«‘ÊÙJa*: ÞtM Ç•Ö4ƒªªËÂìßßLw0!­Ø^ë#”–ìzí^mqã•=^l¯õ£Ø´®éßa*ßÀÖtAcUãWÉ  ò4ÿЂn¬P=ˆÑhD]]¦§§éN&¤EÜFDbÈ/| cùŒåk(«6×óà}ªÃó]DWW:p õ9¹®âÀ‚ÆÜWºµ}R›IȈƒÒ]LH ¶™cëc”_ø%æUTY=07ø4ó;ô†M4¶øè‚Æ¥@´@ÿGâMÎàX "`#0ÁÉ t^Bºˆ[ªÄ¼ª·–¹z.f¼¢!b(øŠò_ѤúЊ ;!uuu¨¨¨ ;™Rê7QÄÅ_h·îÏǪWmák(p´@×oHzc>"", DÁtBªa,¿ ÷ª§_‚Íõ<:‘Œ‡cÅš:‰zZÛ·k’@ªªv^ƒhÌ-ÅA)w˜âS/\E˜›à4Eúb žÇƒ© DÍV1/ý;QV²[¼ùš–Η–º…‘‹6ê7cV ›ëyp=4ÀõР9åaÞµF5F¸fu O4mW@dÜWƒD Ò;1äÆ"¤ ±’sY½pÅî3O$΢˜@(ˆ3ÆMÏ7ªÿ‰xÓrÐ[C"†”ëwÞ¡»š”V):3—Õº_ùã“_øævx†]¯½ÀîÏPeõ$w‘'5ªÿˆ"­g_iQ„ ŠŠ ÔÕÕÑMH*ŠMë(Ô+3¸OœÅ1»¬LU~Ô6?G‰y5l¿¯ìñ¢ÊêQ¼%°RýG\ä¡¥ùÛõ’‹ç´vÞ´F a'ˆ‚é„dc[¥2àzh€{Ny›ï"nUVvXV_ø›ëy˜çðåÝRÌŒl }W±i»^{S•_•ßSß´B5FÜÞ¦©ã‘ˆ8µÐ÷ÖwX,´´´„þ^õÈÖ‘›Öøõ†MÔ7ùéÂÆ€»Ã%ª©5PÇagÙ‹7ß×Jï+ÍHðDÙ«ªýÍTBP¥U«W÷OœÅQÝVù…/±½ÖÚýÏ#öÁâ“Ðñãí8sæ4l6›àõÇ¿/‘$« …¹ûy)û*<š*Âè-NÕïL´€S&xþK­žÃ|WX0b!5Q¨ß„i§üjÝ»¤‹0/1¯b×k/PV[ÐÚh ­®®NY÷çcn‚ìwÅ]¨(p¯7l¢ù-r_)…ß—ß\Þ®ú÷&©(>&µùšVÏ£& ¤ªjg?¨µ !‰Ø^ë—Uëþ|¸¦äkŠMë¡öíñº½Þ-CßÕÕ «Õú{s=/\÷.éðÄ©¬µ©ØÈc ¯\Si»P¢{Mªö£?8x$Fô ˜¹¢‚‚éÕÔG¤Ì+¹:Bý&Ì >TY=(6­ã…«_?0bn< "Õ†ð«ÏÇÇÇCÿæ8ÝÝgqüx»àý+îB|ýÀ¨(þb*ß õ샦¤µl×'D7n´JmþHËçRËæ÷{çVºû ‰»" ~zá* ›,Ȉ£v Õs¸à] L"|â,ŽØP‘ߨñÞ=GØëíííèé¹ P#JÑvb™Ô‡B ]-Kjʹ:>VQþ+rÁs;H ¦ïÝ»‡‚é„„`,_‹ì~6W$P |â`xúH/9¾vÕS ër2–¯…\f.— ׯß{ÅbAw÷YtuuÂl6+ú=͇<¨©§ÙÑà÷å'<º/7[-¢‰@T!G¥§ßÍ,Ö‹„ÒªUì°¬ vÿsìzí…¤«‹Ÿ™eµZÁqœà5×Cƒìw3 ÀétJ¾Ïf³¡¯¯]]‚~¶£nº° Èc ¯<éä¯ú(Èã°k{˜][††ƒçA Á‹‚§ìÍ7Âh4ÒSAˆÛküQƒÞ%æU˜ªäß·â. ¹©˜bèî>«ˆDL;·¾×ãñ »ûœ,‰0"±X,²ÆêÝ“Oé¢FkV‡K?5§dLm¼ñýÆAä…-~©åày¦(IÒÚJ]z ±¡Ø´®Z¯)†×_o IGÇ÷ÃTŠ˜Dò _â•=ÞÐߌD‡ä÷ÛívAÀOíK÷ˆ‚Ñ[>þ°"eÙVñ¶©+ÿŸ¤6÷g„ªÏ€cì‡D›wR!Å7y°•z2a³ÙÂ2©¤H„ÅUø$ráB.\èËå mïííCooŸÄ*wmúŒÈ#ÜKèÛû )¥û-ƒ@¶ëß‘KÝuf¹.ÔúVUí\ž››ÿ%€³l›ÑhDkë;¸vmžBT˜ë#×kl®çáëF¬¸ QlZÇËŠ¢¡O .ÁßíííXXpÁn· HdÝŸWöxCAôó*ò ^Â5µ•.ìp8011›í;¸wÏ! >y´w.ÅíkÏÕqw¸$-5¦í±ñ*ð´\t¯ )ÄUˆTXHP‚ójÄ¡M›ëy‚.¹¬¹¡\ý?ƒK*~ÑÕÕ‰ŽŽÁ¶w!fF·á…«›ëyØ\Ïú??,å×ãñàúõ’äïž|Jä!׬.¤:ÒU « «pý[¨® KÛ¶WUí¼O¢® qB¢°Ú›"¡ˆÛˆšuåž×‡‘S$r5ŒDœN§¤±?rä0zz.RqÙüô¯&|å0)®0gh;±LéºðûòñÅð6|üaM¥õXb‡þªtìã\&ÿü :Ö°K)½Ù»ð%Ìõ¾¨­ÐŸ/Hgç¬ûóáž—îAÅ@ÅwWña±XÐ×׉m'–ÑHSÃ0á0àÒO͸;T¢‰ã‰E”è^Wøš”ú° !¤æz_Ô8ÆŠ»P0×Üf³ š>‘.4nß* ¼~ý<ù6"íííèëë«ÂœÈC®Y>þ°CWË4ÓÏ*V×â+†ÿ9ãÕG¦)R!EØaY‰÷àÇqèêêDWW§ öBªU~áËPQ ÇãAävEf³9X/Ò-[×Aä¡ Ì]•ŠºŽd©Âõoe…úÈ8‘S!ÇŽ‰‚®`!`¬`† + Ü\ÏdK… ÆÎ­n¾v»]֕ŇÕÚˆžž 8rä0‘GœªC+î*1*w)ÏÀ*ße…úÈD"y¢©.„úM©Qïa±XÐÞ¾»šÈb, ½½}ŠH$ Z¼²¯é ›xïýE"Foqè+לêࣦ^Ù¢E¿qP.óÊž‰×&ãDJ…°ºBÛtE®„µ!GŽ›(&cùš WVooúûû#î3’Za攪ú”ÎÔ\å¢,Cn÷Ž™5ê#Sˆ¬ ¡N½¹KUÉŒ«u>æÆ9|å0aù‘0u¶È(=£ƒ¡£ãûQg—›|¹~ýNŸ>#™Þk·Û%«Ë™"òØÂ£©"|üó LkþXë›”M¤,ðü‰TÕyƪŒ%  9'V!P'òàƒÍí` ŸÎè$RÄmTˆ¸0ã8ÙÙålnÈŠ»›ÂøˆÓéDggàñxàñxd[“–ìíO¨=IPuØMèÛ÷RAFsƒ)Èã°·æÉ*õy™zàssóe¾PÆß~öl7¦§§É²æ8yÀãß—HfP½Ú²Õý‰³84süøñvAìC¬úû?Š˜²+³Ù ¯×+ù9½am'ž)^Áf;&†ŒpW‰¯á©\QÉ¿ &Õ4±¿ªjçÉL¾f™êÂB°ÕñÿßÞÙÆ6ufyüŸ8‰c_0I°)Ä55S¬˜íh&“”ÍBVT§Ò¤"»H˜‰V» ESZ Њð¡+A†-«¾eI¥Ja‰VC* ²»u2ŒšQ’ÙIP¢!ªÇ@L¹&„4¶c“„ýp}kû^¿äÕ×>? AýÖø:¾¿{ÎyÎybfÆ466Ò7‘äÉG…¢ãHægs"öóîÑñõ×Ò™«ÕŠææ³)-øͣÄäQf âÐGž¬—GÀŸjÜ”V}ÉbÜH(‚Üפ&îž“ûç—#÷7àv?ù@Ä·ºµµýýt–ÍRyÌÏæàáÀzÌÏæ€aX­ïD옧œÇÖ·¦ÃÏçÓ\7ËJ˜²£½½]tGÁd©®›ÆOöÿUŸ;ž±¡B<|Pv<šâ9(U¯Ö|üÈRi:ó4aHiÞYè4?‰‘Giéæf¹®yð»yÀo¢£‘‘Qø|>:Ûfê’— G”øžç‡ ÝvûaX­V<}ʆ÷ÝàÇ”•qWÿÅ帇óBrøf³9î–²v»Ën\¾|Yrð¡º-/Q×ø"k åìx>†ûT*Œ©g°þ\Ù¿¿ ‹?¡<òf ]IŒ<&\Ê„ÏXöŸbh׈܃V«¥e½È:]0b,ºÞ‰…ë"~„Hôö°Ï. Q,Ô̆WRñûs$ªu˜Í¸rårÒ)­êºiúØ“ñò˜šPÀÑ¥AÛ§›ðåE-î0²)†§‚R5Ÿp;á€?Ûµ'D/zå°Û`V$DL!Êf³Ñ²Þ b£a&é&Aaíƒ$†‰égÇT¯Ï‹Éét¢¹ù\B‰°,›0)3qècOF§¬ÀÑ¥Á—µhûtSÆJCˆÕ6•°ö¡/ù;©e»í™rr2å¸ÝO>ð¡ð¶‘‘Qœ?žÎ¾r¾Â u|'3ÛŠç»{Âÿîì¼¾™x½1=šÒ@xäû”[1fßó\¹_+ÞžæJÕ<ª÷O£rWÖÇ?àÏ;ž'·bíÅ„S Ù×0ƒqçLÂýè_6ãG.‹MÈØ+ç¾LH€DÔÛÚÚp÷n/‰eß]=Uw6‹î½ 0sØPŒèç ¤½ýj„†‡ï£¹¹9âõ^Ûá êûQ5|ùÌ©SŸD¤ªX–Å… -’ò¨°ø“ºBMxL=ÏÃÃøsÒzlÈZ’ì~ôFÍy±‰—JK7ŸÈ¤K×õWIDATã‘“IoÆí~R¨‚ºÏçÃ'Ÿœ¢‚ºÌ*–‹í3ž›÷ ¥Þ°h„ýÍÍÍ0›+"sQáÂçó;F/æ{Dº»o†£)3Q]÷ƒ,6~ššP`l¨ý¿ÍütÓr‘ô–ÂÓµxK&úÖIÛ2¥ö‘‘ IäkVámýýhmm¥o€LØh˜¨ë›ÈÇ÷£jÉheë[Ó\„ð@îõ°Ûí¢ÓoÅ$òÚ 5³ÏO¹,Í* ¯Œ"–_³3ëñãÒ«PäĤ=ß -øÉ(ò2ð³>.•îP¯ªªDUU%õ†¤9R)+žèm`Ífsx†UЫÀ4[€uº Tæ0*sôõõ‰ „ïõà%Â=ÉÍ{%¹•­TJ#Ý—æòÍzm¬pä |ÝGbòpd¢<€ÌY…FlN455ÑÈ÷4FSˆHCEô*bvln>ÑôÇoO+Ü1pxxXr¥÷Í5’Tä‘î§&¸u­mŸêàèÒ•ìÆƒ¤ º-/Ñt†MJ³3ëa.ÿPì®s¡‹ZˆÌ8²>•E¤OÔ±õ­ij"wsãçUM³ሠzâ-¿*Ê`0Dœü_¸¹ÚEqyäŽR+¦ø×hi¹tS`…źƒéW }4V€Î+Ñye#î÷©èl TîñâÐÇž¤/⤮.eòqÊXÄKeQƒáÚ¼ŢŽi¶Öƒ} û@…‡ëô*ðæ ¢sT4ònÄóg¦ò§œ”˜¨»œa´´\ˆØÿCêª4Ýä!G6öe,ëEMÉŽ>KØe.D[XŸu©«lˆ@(••†—sQ‡X­ƒ_¢+¬CÌÏæàûQuÜÚÄîÝ‘'ýç¹f·¢²™ðÿ‡eY´´üzI?;ŸOwq(Uó²XJœ–QÇGž”ŽJñ†ä癜ºÊ „ˆIe™L;P_O›O­&ü\~€a4A¯"¦¿ƒg6S‰ˆ tºˆbúÌT^¸P¸Ííðð°ä¦N—êâ.Š‘LÙj05¡G™1ˆŸyŽêýÓ‰¤?n&ÕæÏ€?eë>[œs#ÓSWY#ÐU€è¬,“ÉDßžU”‡Ô + r‰®N§C{ûÕ” Ûï¿ß±šê™³ó³9ÜÒ`Á -¾ÿ#:ÕÞÞW.VÛÔš¯¶âwëkûtS„ *,~4yŠêºàèÒÀÑ¥¡_º$ÅÑpôŽ>[Ôg»EýP)Þˆ¾9+RWޱãÍ7߃ÁÁÁ˜—c&fÚ2Ã0ÈÏ/?~~.¯^ê¢Y0s˜ ä"èã~ÝN'ÿˆššŸâÏ~€–––¸‘‡qç ¬õSkzî0øª½8<‹J©šÇîŸyñó#Ïa0ð?ÿµw»5´â* Œ;gð7¿xêºé„ãØ¥PÎÕ`ÛÆ»«±´tó`Ö\fÑïÍ pêþ­V‹ãÇÓÀÅf~6'"å›Èb(œ=ÅmeÉUQR+ªÞ}÷†‡‡Ã2˜r+Á”Ì¢P3‹ ¥Áˆîr§Ó »=ñ…¢¦du_¬Ù±ã—äò=š’9Tïÿ!¼;ž¯®SG¢¾j?ªÞö.Z<¯›±]|¤Õ¥LmÌz”–nžt»Ÿ¼®K=" ©¯·áÆ.ú–­"Snex¢p…UEÅÂܪèVṈ̃cG#&î~?ªFqYÏ)õsÖœ\“ºßȧªÊŒA˜->TXÒqrÜC|-¢ ³Å¿l[+r¼±é_Ä–ìfÚ DH¬DÝî''|&¼Ýf³add###ô[E^¸ °Ñ0Ña¾m[¤„ãJ„8Øíö˜Û†Á©SŸ„÷ó˜ŸÍ‰’,ÕuÓ«¾š)àÏŽÛë0p‡;AUXü0[|1?Çïo¯Ç½[ëè—HBÛwÎ$µ_y2°ãùøsðç¢ú­–ª{¼—Ç:/ÛÞpiéæKn÷“wÔ o?~üœ=Û ÇCßÀÀjµ†G‡ðði-¾6Ħ­Ìæ |#*þ5ìöÃq‹âÉœ„V{8âØP!n]Û¥êªë¦Qñ×>ÑtË­kEÔ((@S2‡2c0$ÅGüÞ'Æ”xú8SŠˆ±öµµ5ؼçgbO=’ KvI ‚\-$\TW«Õ8~üœ?F¿/3 ÃÀn? †a ÓéÂé%~dº°ÇC­fbÄ#6ŠÄëõÂápD,ß~ž×ëC{{{Ê?/×,¸úuvƆ ñàOʸÇU¯×Kõe]Ý#몇ð5S{õz=ÑÖÖFgýe¤¢¢"¼Äv÷n º»o†ï‹Þw#æd®ÓI¦±ÚÛ¿€ÅbÝ1àŠêN§‡#¥“ÓZõ{Ä‹xØñ|ÜêØ•òДÌA·å%ÊA”m.y9uª{¡hµZœ>}Jì.G6Ö=(AD=äªðöÚÚ<{æ¡¢ú2"=b6›#â{žø„ØÐÐ *¯×‹ÎÎNÉTÀÕNgÜYXé xd[±\·å%t[gQn  Ì\òª)žÅì…òW»sñ÷¿8&Ö,˜µuÈ‚DÚÝî'?FÔ^ê6› ‡¶ÂÀ_åKÍ“2 `FôD/¬kWY cGÂWÚìSQªŒBº»oÂbÙ-¹b+Yy¤ã¾Æ pïÖúŒï*×my‰²í\JªÌ\V/v/” ‹ÕûÀ[ú3м.&½™¶» dq9áv?1 ª¨ÞÔÔ—ë!\.Ù€Ý~8nMÁn·ƒaᅧүPÓ&]„ˆ ƒäI]êv»ý°èk@KK ._þ<&•5<|--- ß?$]"L‡R5ãÎÊe[)ÍÔ„÷n¯ÇØ2¥È‡¦dåÌGÐT‹=ìD65 ’@ST€Ó§Oáüù $‹Erc&®NQDt”=’ÄjµJŠhxø¾d„cµZEë^¯ÍÍçÐÜ| ÀeY\¿Þ™Tí#¶¢Ítqˆõ²,7cC…è¿Ã¤| …â€bå>+÷‰=ôRiéæv:e’@„Qˆ°É0\Tç&÷þ2ëWf™Íf0 þ-ˆèU¼± œ@ÞAgg§h:Ìét‚eYÑ9XvûaôõõI>_¶›èÿϧMÒ%eÝ4˜‰GÝÁËÖÌ'vüîÿAá>UJi*¥jU{|¨|Û+÷¡œùHì)íÙ^4†ZX$â°Q“{õz=NŸ>EÛá Ͷm ‰­ÎGB†ݧœ§»»[ôv†aÐÐÐ ù¼¾¾¾¤äQ]7C{Ö\ [ÎnÊè:ÇJȃ¯m|uµmŸn½[ë’–‡R5êºi4añ“ý?DÈC¥xsþIìiƒàÆ!HJDte/‘³g›³ò¸ EĽ{­qOÒÑ›=qÑÁ_bŠÜ@w÷MÑhÂáø ¢Ësß}÷úúúD êr‰:¢»Í3{·Ö…—â.öx±ãy`çãÅs=(XÔrf~Ž˜T M¥xoh.@‘s±èÍI IJ¤Ýí~1‰455eeˆÓù—ð¿-KD3`ÌI:´7‡°þ ¶²ŠB¤šoÞ¼)m;vGK9U‘µŽßß^þ;꬚_ÅŽçãˋڰD6m]ØÂ¸Ì bA3þ°¹ÿ^ŽÈL·å%ªöxãÖ^ä#õIï‘X, ra_†X=B¸b*ÞÜ*³¹‹ET2ÝÝ7a6›áõzñí·ÉÈ¥VÖ¬Æ ðÕÕb·¾Šâ.ÅM„"‡Áš bÓuyyÜ £šàÒ!ˆÏÅ‹¿î:yòd=€ÍÂÛõz=´Z-²â8LN¾ˆ@QQrr¢mÛ Øºukøþ‚‚‚ˆ}>ŸäàÃ]»v¡§ç¿Ew†ìíýúúú0>>žðg¬®›ÆC“0˜È˵fÇŠÏÇÝn ¾éÒ`N0(’X~”ªy¼õSÞ=4 ³Å¥*¹Ï= y´ÓÑ%, 'OžüO›ÍaYf³9¢«Ü`0 ·÷wðù|1‚€7ßüîß¿–eEŸ/”ÍÖ­[ÑÛû»E_yþüÈswά‰8ø®ç¾ÿ]‡Û׊ð÷ÔY?1w¥Ñ”Ì¡jMbûΙ¤ÅAòX^(¶N‚Ð Œ½àÖ‚GM5‘èš„ááaÑ.r»ýpRÏë/ID™1ˆC{Ö´H~¿O…¶O7a`ÝÏDêÒà/šÎ<éáHÄ£±ŒþAGòXF¨’‚DÜî'{Á€ß- ók"ü~㋇ׯwF¬ êìì„Ù|6â9:.¼ìwxxX´Â"IåDRwprÕw “Ç­kEôåX!øI¼åÆt[gÕG26TˆC…RB‘³§OŸ‚J¡{((Y” M·ûI‘˜DàîÝÞŒ‘HuÝ4fü9)7»:õI¸ØÎ²,.\h‰È0Lxð!ßï!ÕP(&Žx`«ÉÀŽ. }!–Mhй¨Q·õ% U¯ )ž ß¾”ˆRl´ ×ÇõKèõ’ò .sHzH¤££Cö³³N\tH}ûTN‡½{­øî;§äª)~ p²Ýäé$Ž€?·®mHiO‰l‡Ÿ¾»}ç t[^®XºñÑXúï01ŸM‚qD”¶"¤—D\.—ì0òG—fMÆn¬ÆôÖTȶ–CVÛÔŠ~÷ûT¸w{½hŸ Ƀ’¨½D2A"BðWw«1j\S2ãÎT½í]óîq>âø-“ò¤W+:°’ÿ\â…©­­Acc#Ƀ’ö"¹Š¨fC€ë}ë~"u'E¯ùý¤ ‚Ï[–«ñ2cåÛƒ0†Ré;žÎ+%q,òB éÌÓùLúï0 Óª VG’‹R5¤ÇçÂÓI$å¥ÂâGÝÁ¥Ï øs16¤Dÿ&©þ𦦦ðÊÈ(&Aæ$4–H3€³b÷µµµÉrõêºé´ ²šü¹øòß´”²Z¦H¤êm/Œ;gRJIü¹x4V^‚›ŒÈ¹ àšPUU)%ŒHI{‰Ø5 žGÎË|+,~lß9ƒ2c0ãeòåE-u’¯PT«ÛÂ-ÕÝ "~Œ{ÀŸ“òñ×jµ8~ü©eºƒ Áˆ$IÄ à7lË322ŠÖÖVY¯Ð*39™l¦m j±¤ºl™X{L&Žÿ@ªX>Ú Š"C‰ì IÄ}ŸÇãAkëç²,®‹¥(ÌF¤¹Hòcÿþ}hll”º»À ’ D®‘ìñù|èèèe]„§r…ªWxú8š’9XmS$bUP«Õhll”*–À¹ÒÒÍÍt¤H ™ ÑZ€¼ë"º-/ÑptBÖ‘Çjõ·ËG‚±$“¡¨£Ž $“$ò!€ÏÄîs¹\hmýGvïk¹–j®ìx>¦&x8V€±¡BZi%3ªª*ÑÔÔ$Uïp‚Û¿œŠå$Œ”ˆÅuŸÏ‡¶¶6ô÷Ëoo«m •{¼iõ3MM(ÀŽçƒÏÇÓÇyáÿ&ä‰Z­†ÍfÃþýû¤âɃê$Œ–ˆ!$‘]b÷Ëu£TçújÂwÈ?+ È"ƒH²hš. $ Eò€Åî“ë*­µÈÔ„ý¿åF[P×xæ±ÿ>Øl6©”u–“@²Z"õàšEw%êêêÂ]²zO•{¼¨Þ?.¬ßºV„±!e¸wĸ3°ä¢;;žÏERRZ*CÑjµhjj‚É´Cê!ƒàRVN:Z$l–ˆqRZ.— mmÿ!«h$z|EôY~xb™1¥ê•h3bÀŸ vœÛ0“}œ¡y[´Z*óIP((eE!bDÒ ‰9ZrF€…ñtâ'‘`–À¥¬Þ+-Ýì £E!b%b—Ò2dJ4BÉ Ö7ÀÕ;h• „ˆ#‘"pý"öxÑÈíÛ=²ß6— ’¨uL‚ë*¿DG‹B$/’¸vÇƒŽŽYö„Z­Gqp„¢'1±¸hDtË\žþþtttȲ‹ÈNªª*ÑØØ­VKQ „X‘X§6PZ‹H’HW\­ãE$bù£‘³h>¸´VWW—¬'ü™GcHø¨ƒšI Ä ‹d¸"»Uê1.— ×d·;‘yÔ×Û°oß¾x««à¸”­°"«${H$EREGG-û%VÚÚØl¶xu€+’Ÿ é¹$bm$’0­p»ºº¨ÐN¤‹8œ¡ˆ£Ž „X{‘ÀÙ­$"Å1 àßÁ"¡t „H3‘XC ‰„H'qÜþäçhu „H‘ØC"1Ä{\ÿzzz¨ØN¬¤8 f@‘¹"EOÏmêj'âÂw×ÔÔ$+Žs4øBd‰H<zzzp÷n/5$a´Z-l6ªª*-Ç%q@ˆl‰Ïç §·h pöR[[ƒššÚDã$A"Çår¡§§ýý•dI´Á‰#©4ÀÇ¿ q@ˆìI=€_!Áª-ŠJ2µZªªÊT¢Ip3«hU „ ‘<Ù‰=™Ç{<ôööâîÝ^Z ,cªª*QYY•lmà¿õq$BD$EàºÚ#‰ôÀ¥¸z{{Ñß?@2‘&“ 555©Hàê_Pç8A!’•I}H$õÉ>‡—ÉÈÈ(¥¹äi\šªÀ¿SšŠ ‹‰!$‘_%•\š«¿££#Ô_²ÊhµZ˜L;PYY“iG*Ò¸ÚFE „Xn™ðµ’zÄ™,/ŠNV.ÊØ±Ã“iôz}ªOWÛ¸AÑA!VC&õl‹‘‰ÏçÃÈÈ( e‘¨Õjèõz˜L;ÂÒXÎP´ñS'H „,eÂà ÅårÁåzHyz½z}9vì0A¯/_L„!Œ4$ ‚B¤«L¬™û:>Ÿ.×ðT<žgY©˜Lœ$6nÔ†£Œ%âÐJO$Bf21„Dò¸fÅ¢¥¾¦Ëå‚ÏçÇèè<<žg¡¿å±èõz¨Õj˜L; Rqé(­vc²ß‰p ¤á ~ ‚BdRtbeYá…âóùðð¡+â¶…¨f墓É$D9ÔjuXÂÛ–^ß„„AQA!²F(»BBÙ…%¤¼–ѤE¬ˆ ’a0ô‡„A@B CH$¼T k!•4‚—Å ÒÀB‚B©I¥H •×ÿ.Ê ·9®óûp))'É‚ ÄÊÊÅú'ÿ÷;¡¿ÓM0ÎПÉP41’†“RP „ Ò_2BÑ𼎥¥È¼LR¯AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÿ‰â×| ¨òIEND®B`‚MoarVM-2015.11/3rdparty/libuv/docs/src/static/loop_iteration.png0000644000175000017500000023522012502366750023516 0ustar jnthnjnthn‰PNG  IHDR än§ AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ@IDATxìœ-EÑ·G%' d.ˆŒ*Š‚`ÎJ0‚ŠŠT0‘TÄŒ¢¾ú¢˜˜…×ÉAE$HÎà÷íÓ˳·nß™ wÏîÝsNõï7§º««:ügº»¦»§ÏÝþ߈kÒ%‰@"$‰@"ЂÀÝ[xÉJD HD  †B>‰@"$‰@"Љ@ ÐdD"$‰@"¤¡Ï@"$‰@"t"†B'4‘$‰@"$i(ä3$‰@"$¤¡Ð MF$‰@"$‰@ ù $‰@"$‰@'i(tB“‰@"$‰@"°DBô&Êõßÿþ·Ð~+–7Dîv·»•jAã5ˆu¶:åŒÂ°Ýñ>¯/ÂwÞÙÜvÛmcF‚§Kë*F~ô+'O*_ùÑ_Ç·Å!ùÑŸú£ˆ‰T\¤‘ýu|[2‘ý©?Š€˜HÅEùÑ_Çk¸Ci£†•KÚ¿ÜmäÆç=ôïýº’Óù`$ÜrË-ÍrË-WßdÃÇ^ô§,qÊÈSjœ~ã”MýÄÏgÄgÂgÄgf˜Ÿ¿Ûo¿½Yz饛{ÜãÍÝïžï£<ýìr顟ïÞ–CáŽ;îh®¿þúf™e–):<·a:ë8¨·ñS?ñó¹Èçg¾ &‹Ú~0ä—Xb‰b(ˆmÒþE …þ½wCYr:. …›o¾¹µ#'$ÃRÂú£žr©?Š€xHÅ,ñËçÇg!¶Ÿ[o½ulÆÏ6”´HC¡ïÝЖÜå-©€ÄŽ ža)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýQ?N=)¼¨ýÊcÌ×|âÒõ'i(ôç}êRÓa,tuD5ß°t"ðj9ÃÒÔ'ÃÒñµ„UOšúã#PãdX:¾ö|¼•SO*¿‹"çÕ%“üþB …þº_YÚ€ÀDñ¼µ¹ñâ”Of¼¸ÔE`<ŒÆ‹Kü?ïcÒþG …þ¿‡C[f4ºøºZ&õ¿|~F éºmÄ6ýâo2íGݤý@ ý}ÿ†¾ôµ!;¼è(x‘_×;FäÚdR6l¿g´Ú0ÔçÇz%íÒPèÿ{8´5à&:%ßtè”qRâõG~ùIýÑA-ñiñY‘æó3ùöc›J:¤¡0÷q(kA;ïØ¡kD´ñÐ1>õçwþmXµñ¿|~&j?CÙ! p¥ÓPà›; U«ß~©sÜôKëøÔ_ðí¹ÆGܤu|â—øEc;>øÓ i( Æ}ÊZøV±D™øVÜ%×ÅOýÄ/ŸŸù³*㵓ØÓß¿¤¡Ð¿÷nèKîÛl‚NË7¨®æ–§ TžÔ8ÑêW&õ?Ÿ ©Ï†áHõ+3HÏO¬Súû4úÿu èlë—0N*@†¥Ê® ãÔáÔïþR¤ §.>X&þƒùüŶ“þþF …þ¾C]ú8`;»y€g”‰ÆAê/¼Öžøåó3Ýö3ÔÔU> …º™ÃV| {qˆñòÁÙâOýÑ7ÚÄoÔXâ™Àåó³ðÌÜTÚÏ(Šù;¤¡0wqHë`§«_ó¢å"ê/x6Eâ7߈ŠÏJ>?ó—Ÿ".uû‰qéï_îÞ¿EÏ’;vÖP:(.üòÁÇ8ýb唩õ÷»ß5;î¸cóÇ?þ±¨ÕéVÿ³Ÿýl‘ç/°uÆV^¿aeêü•ƒ¯¿xF~ÐQ§vjŽ?þøž×ß<'ÊQÊÿÁ~°y×»ÞUª³(ú±þý ðÁ7o~ó›½} Ü¿~(¿Ï‚˜,þÊ'íorF¡¿ïßP—>vV5ÄEgXj\ŽüË.»¬ùÍo~Ó\uÕUc3 µ| ŸsÎ9Ež¿ØupéáòmáZ¾·éÿú׿n¶Új«Òn“kË/ÊÝvÛmÍO~ò“æáx³æškšu¡ÊI¬Ã]|å¤ýë_›ÿüç? á4Yý.¹.¾ùJ»äºøêIÛäî¼óÎæ‡?üa³É&›4ë®»®"…ž~úéÍ?þñ…ê[§§RÍ7,í’ëâ«'í’ëâ«'í’“Ÿt°HCa°îçPÕ†N‹ËM‰Ñ?Q®Ë>qºÚß–§2PýêGJ\—¾ü(_ûk}âáaœ,о:×]w]³çž{6GqDóüç?¿Îv,\ç¯~ä ·xÓÅ2OE¿-ÏÅ­Ë-·üÞ÷¾÷5묳ŽU,t·Ývkn¸á†rŸb9»ü (W.ȯTF¹.ÿ U K'ò+• ö9i(ôù æâÓ1á¤Ñ;­6›N­OÇ`¦¼i&>ú w €é›–r¦WŒÊ3i­£|åäAuÄÍfùÛÊoQÊoZ‹K É»Æo›m¶)ðÊ·œÊ—È»tåõcýc½¬Ótè 7ÞØœtÒšm¶Þj:ɤî4HCaš¦úâC vJúí\)•2~ãõ޲ÆGú:ã'Ò7Ú•ÿM7ÝÔ\rÉ%Íj«­ÖÜóž÷Dt¬|uþ†ÉŸ%‹/¾¸Yk­µš¥–Zj¡òÇüHÓ0K ÿú׿š[o½µY}õÕ›W\±ägÚæo}­«úÆCqijlÀ S줣NLs<}ÓQOõy§ÜóæÍk–Xb~W…,W”Uzá…6«®ºj©§2ÆÇ|ƒÇ²Á?ÿùO¼c³ã•¿-ñ+‰Œü,Š>e_i¥•šûÞ÷¾ é³÷E<({,¿õ‹ö±cú1Ÿ3Ï<³¡ÜþóŸ #äóž÷¼‚i(Oþ{ï½w¹,³|á _h>õ©O5W\qEÑ[n¹åšG>ò‘Í{Þóž’FWùM¥W¼âÍYgUôÁìcûX³Ùf›5GydÉ÷À,ƒü§?ýé±ò¿á oh–^zéòlp?~þóŸ77޼Aãô 5úЇš 6Ø`äú¤æ°ÃkÎ8ãŒrС^lõ™)Jwýœ|òÉ ›'Áˆú’Î;ßùÎæ1yÌXþ±üQ¿æO¦þãéǸ‰üµ0‘|ÆÏi(ÌÎ™Ë `fÒ„#/†è0qú£,ü(oŠS'úký"~ˆ¿ýöÛ6E^tÑEÍÛßþöfã7.ƒÁßÿþ÷æ{ßû^sÔQG5úÓŸš£>º ¼–ýýèGÍ›Þô¦fýõ×/ ¯¼òÊæg?ûYóªW½ª9üðÃÇrŒågã_lðfý‘|¤äË[9.1vÝu×ò¥† n=ö(ÖsŸûÜbLÄ·ZÞfÙ¿ÀÆÉ×¾öµÍžð„òÆÎÀŒ1òŒg<£ùÒ—¾Ô¬·Þzc8ÇòÔø:xÔ0ø‚ãÅ/~q³ÿþû7óFfÎ>ûìæÛßþv³Ë.»4o}ë[ÖûÁˆô¡`ˆÞCòæ½ï}o1È.¿üò2À~üãoN9唂ñòË/_r£,`H~Ô÷ÄOlÞøÆ76xÄ#Ê}>õÔSË ý¬g=«ùÌg>SŒ†ºü1Ý}÷ÝòÄ Œ§•W^yì¹aC¬†ˆiQFÆ +¬Ð|ô£-øq0,©'ؾò•¯l^úÒ—–žÙ î†Ù½îu¯Rï’ÈÈx|ùË_n0JØÜJÝ7ÜpÃòìaÜí¼óÎ%]°­ËOñ~ÕaË _¿øÃÃÕú£ÜÉý¦09œ—T ‹ ùÌwÚØ1™ŽŽ,:ätúkJ|­¯ ééEÞ2(ÏÛ!ÙÝï>úU2o¼¼!3Ó€ñÕ¯~µ †êòvÉÀÈì–K Ì `4¼þõ¯/Y›ùóF ï‹_übPàS?¾f`¹#âÇ?þqÉ8ÊÁìŽw»í¶+~Òàâ­û—¿üesì±Ç–³DŽüPÖß_ô¢5|òH¾–_™X¶Úe;î¸b$€ÑöÛo¯zY ØvÛm v¼­?ñ‰O,*”™Ážò3ÛÁÛ6yÌ10Àh‹-¶h˜-ùŸÿùŸbèÄüùì#ƒÉûG~Ìô0`÷»ß+‹ú5Ý|óͦúqè×øÁGÇúªÏlueöÂç‚{„qÉ€¿Ã;”Í¥O{ÚÓJùУn¿ýío›o~ó›e&Êr_z饥¼/yÉKšw¼ãdYφËûßÿþæCižúÔ§6÷¾÷½Kœå `:–±ŒüDý5­õ­‹itÑÉvDWÉï@`ÿýöꈙ:;ÏQ˜:f©1G ³ŠWäé§È]qÊÔúu5'Ò'œé†GÇÉ Ogãñ3È>êQj˜–fiÁxÞÐY§Çˆà³ÎŸÁÌMrèÄò³ŒÀÌFq8õ10Øñ·¿ým,/õ‘3){„€xë–/¥lœ€áqî¹ç.ÎüÕƒ§Ÿ·{¦é1RÀC¾YfV–]vÙòæ-ŸYf;—\rÉ…òWY䮿þúÒeφû6H/âw¿ûݯÙwß}Ëroð¸ºü–AJ¼Nž´‹ÏóÀl.æáƒÃè``ÇÅü·ÜrË2CqÍ5׌Չef1˜Õ0_)úÌaHa4É4æùøq1ÿ:žpÔ/ ù30äŒÂÀÜÊ᫈5Çï ì›QÍW¦ )ã¤êJí$cÚ1ôtø £‡£³gê[¾²R}Þöجærg8<à(ƒEWþL#Ÿp tü”ñ+_ùJI=q!oüäqíµ×–Öò@»ü,‹0»Á^ e,·”7w²Ì2è¯ó7jz,•°™ixyÆ«‘ðä'?¹á ,eðc °Áò:ÂÏyÎsšïÿûeÐgïŽõ}fy¢^ÔgV€åf¸cœiHMƒpí·üÆ©eï›ã}BÞs,¨›éÅüÇPÐüÅ/~Q–=Ø7‚,N(F³WÜ#ã‹P%WãgùMKH“Ƹñü+Œ´ 6*n¾ù£Ê× n^¬uzùv\§=hᙘ}ICaО’!ªO[gGõ»ømq.õjÊÛnÍ‹zú‘Ã!«¼qóF¦‹q5¿0G~îÿû/ƒ%o¸8¾p`_Ô‰~dØ 3N ŸôXsg†=ìªg ¯ZŸpLÃM…Ì`”t9^¦¿£nVWuÅS— ñ¬õ3À—è=å)O!jL¯ÖwPå fDt¤Å¾ åkŠaÇ:Öq¦i”ÑO|—Ÿ8ö©þUVYe,>¦e<{`ð3ëƒñìAér,i0£~”“'5.†£ßx©qRù“¡“5&“VÊô4zi¦8KøfvvP¾u½^-#´xÓÃ10™ü.}6¬1XòFåIƒgèvéûù½r|‚ÈZ²aó•š.òÄÏ@¾8í´ÓJ™E܇¬²o¥]úî€G_ÖÉI“°<©ù“®~)ƒ»ð12Ø\ȲƋõƒ²gÂtcš%±»~Œg?Ž}|‰>ŽxÓ$¬ßôÔ—¯T§ŒX3#Á—!8ã¢>÷‚™ xA€KÄÈú,µà\ž(‘g?ÃÅ|ÃÇøcFB©ñ‘âÇ)å"]q†¡>#uþÄ™†zRâtèó… îéOzùZÂ8äM7RâMKj|ÔúQ'ú»ôMgQhm0,J©Ó;r3cï°Ì”f:(;Yü^ð¼(þ(k\ä©+H:O¾—ozuš¬ásnžéCu|FhØø˜&ñ8%ãY2 e‡Ç&èsýô§?-"ù…€_ ‡ƒj`ÈS×xó ìÔ=³1õ9DŠýþŸAÔÇe ›tÞÈ’Ž –êBqÊCÿò—¿YËË~ˆz)¥Öçüœy˜.F†Îô,'2Ô—©}¾¬éGžú¦¥ŒòP]ŒC§¾i"£Ã/^ÔWŽefNØLj¼qPõÁ‚Y¦È#ͶüÛôcþ¦Ù¦¯Nƒ¡ie‹Ž@ ‹Ž]jÎÚ:=ŠfGf'OYü:yvŒÈã˜öe"á`à”-»~àñ©ƒ%;ìÕ7Ä~ÿûß—pÚô12Ðg£‡ý¨Ï2û 83A^­ÿ¹Ï}®”"æÅ÷ü88å£>F Óé:e Ñ™&꘦ç $e£<>ÿd#"Kæ¥>T^—>ÓáäÃ9ì?ÀÕú Ül,ä­Y·õÖ[—ƒ™ØøiùÍ Ê¾>eS(§HÖùóÙ©¼Z=–¸¦©¬ùCåÕúuù£ìdô‘! ¯‰ôÙ«Áa^Þÿ:ìâŸFÙØÝL–?æ“þþE …þ½wC_r:8;9Àˆ£|;Ù§2úÄÃþýöÛ¯ H¦§.”7x·yà8öe@ÌŸ²1e¿×^{•ïöcþ|²Ç ‹  ¤”ïø™bç{fŒCŸ7]ÝqPõç“:ÿiyÍ“ >3dé34-d¸þð‡?”þq{\ùBÃxh¼bšäåó…û ]Q—™ ÊÍ,Ÿiš7Ÿ€‚;{.êÙ>5åÓÒ‹FÎJàþÅô𳂃ˆ¸p±< ßúÖ·Êî‰å7yè‹÷D¾yš¾aãåKåCåÕ:†‰W?†a>·dÉD9(÷š“1È8W9/âqPÓ“Æ4"O]yµ~I0Ü£00·rø*bGÍ£<$êuXe»ô˜8Hˆõù¼àåÄ;¦°ÙHÇÛ>ÓÞ|UÀ× ›‹‹iéçœTÐáx7¾&`¦·{vªo´ÑF èb `€0@28òöŒû8¨‡Îÿ“Ÿüdù§Gò1/ÒgЦÌ, CéËùPN#$ >Éd?»ïÙ(ÈàÉ¡JìŒgvÑ$ÞT9=È·ö ðI³-|æGZ–A\kZã¯<”e0Ä0âˆbŽfù…¥êA9©·|õHÓ)÷ÙgŸrˆ'F²Ç%Ž2f¤ç?Äü‘cÐÄ€ãtG>äøg0b‰ƒÏAÁÞ¼¨KÔuC†ûÅ^ÎbÅÀòਘFí'y¤k¸Ž3ÿ:ž0Ï*{R8ÿŠç€g•úp¯1d˜ù‰û`¬ƒéî¢æ_ÇOV¿ÖËp p‘Îä þ(j–2}ƒâ7ñ©8;2éTt™²¦ãe›µ} Žýå Î2`ðez¾v¼3eϲGñ²ÀÚ8oç¤ÇQ»¼í2ð¶9 ¾õgÐÆ@`Š|™ç-š ìüçptæÄ£Ë2åeä0#ÞÖ‘åsL~ÊÇàÊ›&ŽÙ¾nà!¾&`°Öq–§D’)8õ¡þ Æl˜ìrâ.eÖ\)St Ð*RW¼Ñ³¤CW…±P;Œ ðÇ0À¨`Æ…zru0_)Óïø9„ˆ{@y8_€5~ «—¿üåå~y zÒº †Ág„ûË=ãDDé³e“M6Q´ð¸ä׿xÆ©ƒB!cþ<; ülTõÞÏý+Œfa0¸/ԃʢÈNÅ™¯t"]Œ$êQ'†éd|oøÕo~Wzü–óÛîtS¾ÛÈwšnJ©ŸÌ ¼»Ç—ýã%Êuù{¥Ï0ƒ6Ëtฮ<#¿Wù·¥óéò·éÉëÒ‰|eÛh”ëò·éÉëÒ‰|eÛ(r¼õ3#3—ŸŸ®ò·•y*õŸi}Œ7–Í0b\’i«Kòz€.õòª%z_ÌL1˜èèéð¤äªßNªC6òõ«3“úäA~æý³‘?u[œõŸkùSî.ñïþÃ41§©M-0è˜M€Ò)1›POá YÑD` @»ÔXÀ_j©¥J8gæÀÍéAÒP舙Äì!@g„£#â% „ÙÃ>sJ&B€ö‰q á†ÂDˆõG| ýqŸ²”…h(¤ÁJo"°Ð(.†"d–3„@ 3l&;;d§4;8g.‰ÀDd[œ¡þOC¡ï]–< T#½‰@"ôÑß&˜I%‰@"$‰Àà †ÂàÜˬI"$‰@"ÐsÒPè9¤™`"$‰@"08¤¡08÷2k’$‰@"ô4zi&˜$‰@" i( ν̚$‰@"$=G …žCš &‰@"$ƒƒ@ ƒs/³&‰@"$‰@ÏÈ—zi&˜$“A ëØí<£Œ<匃råÌ‚È$Mf4¢!@ÇEX; 8àã'ŽNH§<¦RqvTPtbºD` ­pa$Ü|óÍ_7ÀÓÅö…ßp¤úÕiÓ§ÝÁOcA”’&3‹ÀÀ v=ùCÓh­¤ƒˆ@m$øuu¥MÐlG†cœí5òjù:\Ëb,/.¶ûÂÈŸD ˜6}i(ÐqpÑÉÄ?¡“p€&žN §|ZÆ!Kz8;·©ê+Oü± aO”Ã?Þ¬:é~B@#g½Þ“@»ÂÙ#µŽ5/¶ŸÉêÓ¦(G ¢š4è=}e(Ðyp1寠q4t4Êè²:\óÑS&úk9ÃÒ. Ò¡œPÂ1i0ˆ^Ò~E 6–Zj©òœ·Õ‡çŸ ¥ÍèHǰ2ÆI'£L "–4è-Ý ÷½ÍgZ©Ñ С0èÒpáxí`"E'°þHñǰ:½Ò§¤œ7”›:à7ýRÈüIúž].fظˆ‘€«ÛR [½hXË“FyýÐèºôåÓÆh_\éD 7Ìé; :%X.ÞÆ}[;dè,äÙq.#?µ|V¾×ú¤ÇEØôµä’K‚úÀO—ômF‚mÈòw…ásù¼Ûf»äëô&Ò']d0<ä žù™^ÒD ˜sÖP ¡Ñ;°R­®;ä£_(à‡‹þÈ#n6ô1 Èc·—$r9‚;n.#P »8ÛQ]öØÖ¢?¶³™Ð§œì™àMú ®t‰@"°è̹¥:;$Þ ¸hè¤TÙ ª?Æ+Ó¯NWüLêSÊJý4,ù¦Kæ¶I—0pq±íÔåÏs-Gz3¥¯Q‚±À‹F.CÔw&ÉÀÔ˜S3 t&t 4n:$\Û2|;!iäuùÛdÛx³¥O‡Æ¥¡ÀZ/„FåH—,nÚŒc(Îvd¸æ¯qú•ïµ>éRnŒ…e—]–,sf¡ ?‰ÀÔ˜33 4j,M7 “ÄN$Òè·Ú5°21>ú·¾³ ¾EºD`. Ðf$P.ÛOý¬¶Í)SÓÙÒ76\Ò·ä̈¤K¦ŽÀb7èD쌘†g°dÁ7 «d‡d§¼äEŠ7×õ©/W.EŒÞ¯ü]üØ.ãrƒíÒÕm±.1Ïs”WG=©ü™Ð'Mê‘ÆBn†É#°X—ìD°ô YrˆkŸmÕˆ ñvFÑyus]Ÿ²c,±k›ÍbÌ6ÀK—Ì&µ‘À>¡ØvÚüò¤±¼5/†õ×´Wú´…\†ˆ¨¦?˜‹mFN ãkŸ%÷#Шۜ|;dô›T¹: ùêÌU}Œ 'Þä0¢,w]Ÿ '3ÏÏàM7Ý4¶gÆvc[3ï6þdy¤1YÙ6¹Éêc,ЖrfÁ»–4˜<‹eFÏ…‘ÀÛ3 X#Á¢Û)–ʗʇF^ô·É´ÅG^ô/}Êá6ðÒ%3‰€FF*FB=ÃÇóÈÅÀ[û-|œ4úk¦U”‚^¯õ£±3 ¢4˜Yyì(ꙋj¼D<ýƒ¨Ït¯3 vàÖ3i"ÐkhK£@@‡¤ÅÔ·cyÎpc"/Þ(ùæ~lnä-HÜ".éO&B€6S èÀ¯Û•á˜fäÕ~ÃÐØŽçº¾Æ/3ãÙ¶âKÿ°#0£3 46.÷%`­Û‘¼oÆ5Ÿ0qm|u¡Ã¨±€á¥þ_—ô'mØ&Y›g&g³½V¿Gè}7t.·Ür¥]eÛò)H:ÌÌØŒ — } Zé±ãiãÙùW‡S[ 0;þa~ˆ³î“CÀg…٨믿~%Ú”í ¿mLªpŽüAÑf˜uáJ— ;3j(ÐÈØbŒqŲZŸA ?þñ›£Ž:ª9çœs&U‹.º¨Èÿío›”ü  ñ\p1èi$ðÌ×—8D¾<¨ü6q:å"8ùÑ//ʶñ¢Nô·É¶ñ¢Nô·ÉÖ¼™0N=õÔòŒž~úégBÇÌá§>õ©æ˜cŽ™P6™@ ç† ŽÉÙÿÐ~›“_ÓZÖø.¾ñÒ.¹.¾zÒ.¹.¾zÒ.¹.¾zÒ.¹šÏf+—wºtk~ ò“Ÿl^÷º×5Ûo¿ýØá8ã•ÿOúS‘ÿío;žØPÄE#!.7´UÙ.㺞±(S§ãúQŸöÅKO¯fV[mµfß}÷m^ô¢®Æ«¿ï}ïköÜsÏæŠ+®¨£2œÌ 3b(0-IãbjœN¢î( GZw ÄÁƒ*"òðËWžNT9âMßY76Ö8ŠG¿Ó¿þõ¯ÍÁÜïÕ˜µòûÜc°sâ"υφþH)X G?Ϙa+`Xõ/¾øâæ¸ãŽk¾ño4çž{nQi““½öÚk›_þò—Í¿øÅæ”SN)› ¯óÿç?ÿ9V'êyÒI'•·íýèGÍ¥—^:VÖ.}ù‘ÆòG>~ò×X`™oº{Ö\sÍæ½ï}osÁ4‡v˜¶Ò³Î:«9üðÛG<âÍßøÆV™d&3@O?¤QÑpýÒOŒtĵ¹š_‡Õ™,²r]éö£¾³ ìÁ8£c4G'‰¡ð¼ç=¯ÙtÓM­z=­O4˜I <žã™w0n{vºÚ„iªÏrÏ+_ùÊæÂ /,ΗN)+¯¼rÃÌÐcûXUÆ(oê¼]ûÛß.¼ûÜç>ÍþóŸRîù^{íµÀáG Ø~ô£Ë³°É&›”Á“½«¯¾º <ŸùÌgš5ÖX£¤9Ùò[±ÂÝåQŸ¼qökÓùt’Y2–9äæ%/yIsÿûßÿ®ÜæòÝc= ƒúL'¿ù©¦/˜:=QàÁfzÎÙÂñ¢x†í¼ C#/Ê*yQÖøÈ‹²ÆG^”5>ò¢¬ñ‘e¼(k|äEYã#/ÊyQ–Îãl÷*¼ë]ïjÖ[o½æå/yyÆÀ"ÝÂð\pñ,`$ðöëóÅÅpä™ZäµÉÖiþÝï~×<ýéO/'üñeO oÃ?ÿùÏ›G>ò‘Í;ìÐ|ó›ß,Y˜&Ÿ >ó™Ïl¾ÿýï7Gydó—¿ü¥ùóŸÿܰ|tà6þð‡›W¼â ”·$0òÞ•¼àÍSŸúÔæøCÃzÿÙgŸÝ|ìckا²ÝvÛ5—\rɺ]õ"Mã¢ßrFJß?ŒzèNÖaÐúÓŸ.Ïòë_ÿúVµÏ}îs Khûì³OÇ­%s¶èÙŒ †Š‹·„ø¥ƒ•©òõŒ¼Z–4jž²¦•WËWó”%N'¯–%¾æ)«.T^-K\ÍS–8¼Z–øš§,q¼m°ü0¨³ ÖEǹÕV[•éÚ8€jOÙ]uÕUÍÏ~ö³2½ý÷¿ÿ½tÀzÔ£š'>ñ‰åèÞ)'8‡x¸0ظˆ¿vòêvdzÏg ¹Z†´Ô¯Ó=è ƒ>›ÄXa…J:èó¦|ôÑG7»ï¾{óž÷¼§ ìÜKâ>ÿùÏ—ÁÙŒ ógb·Ývkî}ï{—îדžô¤’¥ù£Ëú†7¼¡ð)7é>ç9Ïi6ÞxãfÛm·-FC=µ¯~]·©ÔC}ëAêôJ¡&øyøÃ^ÊAn>ºË/¿¼Ì´l°ÁÍ;ÞñÙcô²Ë.kN<ñIJì² iñ ?ìa“©=b_ûÚךóÏ?¿ÌÒÌ›7¯ìýaf&]"0=›Q ¡ñöÂ`µÑÃ…1ý‘gåEu¢_uÛâ‰üèïw}ð{ 5;ÃRÙúaêš)Ûw¿ûÝ {¦êXÈCÒì¸ãŽÍ÷¾÷½æºë®k>þñ—ÁëÉO~rCçÛ¯Ž{Îg¨‹Ïµ^[ÛŒ¹øÙ‚!ö¥/})ª¤?Xž 4:+Þfi8ñ“ÈØðÈ9†õ[¢®päë4õGpùÁŽK\‰²‘ŒSùýƒüफöÖ·¾µ¼¹1í&7•÷¸Ç5t¶tÖ¬•÷“ë2¨mDZ·—®°ò5풇Ϟ6.³Ì2cùµéóæŒ,Ž 8 7œéë—¢ÃT?£Ì:묳@8Æá_ýõI¢$ÆIM»-l\M•…‡Ÿ%flsÆ¡Iþ<ëYÏ*K&ùÈGÊ’Øk^óšfõÕW/oü1 úW–[6ß|óòEÉJ+­4Í,ƒ>³úÐ‡ÊÆN#úÓŸ/û>îyÏ{Ên˜•aƒ030&é.zj(ø‰™Åƒ¿+ãj¿…Ž|õ¤1®ö›>o•¼Q2€ ªcŸ»Áéø&s°³ üãËz7ëçmŽ)XÞR8∾Á®ÍH°n´œT¾¼Èo{VŒ—FýÚÏ3Ç_3G§ž”8dœí`ÐÃÅÿ€)Œ»~Ô3]å•ñe„p[ùé‹päW;Ò6}âÚô—Æ4j}–°ÜàXÇE½ñü ZÌ `D}âŸh¢!€.ƒ9†ŸKÒÖÛÜ~ûíW–EØÃ¡Ó8`§Í±©r×]wm‹J^"P虡@ƒ¤qòVkã¢ƆƒßFù”DÈOý©ãftªb7¨Ï9›Ôîw¿û•%Ÿ©®º²“ÇF·ñàèôùN®;êÌår÷ܶc[²‘¯Ÿ¦Í/O]¨<©q†7ÜpÆÍw”Ež2Q\ùr6éáXˆe©õÜØ4¸êª«.6zʶé³Çå":ѯLQ¾ëG^¤Q?3 Ó1<[Y–˜e¨ûV\qņe•.ÇÌ3fñ$SŸ{öpNEm<1£ö¾°+Éä'Í´ –†olPà‹¿nTðtãɦþÔñ†åž fØèÅZëDËçw^yæöÙ«)ÓÙ8¾ËŸËN#ã€Ê·íØ–(?adÛ\Ý•¯ù]ú1M}².}.ÖÇ1*pì3a¶€Ã•ÔêGÿ¯~õ«1£žî7¿ùM™î'¬NÔg‰‰¶à=UOªN—¾ü®ú·éOwfÁý]ç„°‘{ͦ^Œ…®‹e> Õaœ}ë[ß*3 ̬²Ê*Åa#o?ÅÖ#éâC`ÁùÂE( †ÆÄŒ± QÅÙ  ð•¯\lʦþÔñ£sä^¸f †ƒê؜ȹ oûÛ˘ƒP]_ÞtùnlÆsNg#?W]lo LÜkÛmI?å×/5^ŠL—<}ãH}–‚˜ÝaS^|Û5_(.aÜù zœ­À— ¬„~, y0Øc``š—i² •“ICžú$Ä‘oàu¼räÑå'N=©²Ò6}î Ž½4>oÈ÷‘6ËÏ}îsÇMŽxö8DÇ,0ŸTþä'?)ùÒìwÚi§òõO½ÔõÓ?ÜLÛP>y:W¨Já•'%.úc¸æwÅÕr†¥èéäIáG ×ü®¸Zΰ=<)üèášßWËÖhã~ êIàcC#G÷ò>‡û´9¾«ÇpâxßñfXÿÅm´ÑF…εî-õàþ2hDƒ&>Üw'øÑO¢¬~)ñé#£C¥ö‹¼öµ¯-Ÿõ±ûÞ”•ÏðØ­AÇ—æÅÆ<[âsUf‡<üù”•M}}èCËÛ/ù©‡ŸO*9KƒY‰ç?ÿùcq †»ì²Kyî):½®,‡~)eã\\¯…yóæ•3ؘ»(Ce—"XžÁ¸cë«ý,J^©3XLÛP ÐyÑiaAÛ`b㌼‰ü›úógd& ¬”?:Zfw ƒîx âŸõxc¢Ók›jæ›sËã Ls3«Ð–ÆâÆ‘û7ëyïc{‘G™õ×ÔúD><ò‘GX¤ðqQ–O#98c€ÏN9ćþ€SyùlïÅ/~ñ˜î qL3³C ,Ip0ƒŸNrı.>ã¼5ï:2Î[1;÷ÉM€ì]àmÄûËËkš1^-ãë8äc|ÔŸ c|8‡‚åö4´9ž‹c=¶`ù„'<¡ˆpP_8`PEÇÄAT¾öáK"¾ú©g"¢|ú‡i 4.;0w('üÚE^ôÓ‘Ðࢋñò#/úéà'ëèˆÜà¤ÎtóoÓçÏpè,xóÑÅ2G›~ŒŸª>X:%m:5¾¦9”£ƒ9/ÿý÷o8ê¹vüãËÔ6»ÅëÎRYÞDù##¾¦˜kXqmcÌ$h$Pvï¯4ò¢ßx)q8ÃÒÈ‹~ã¡ìÈ×øŠ|6à±~Îlg`¬ò‰,G8°)OÚ¸õFÖÏ18ËA{À ƒmm'êcHpª& û#ô •„ø|Я[”¯éhî‹Vu¡méÊ뵱𲗽¬¼ýóc”µ9 2Œ«ø—Ô?øÁ¾üá¸l—×¢îcó˜òÉ1³ i(DdÒ/Ó2H„AމÆi#1)oW2ãÅ?žþÎ;ï<¡>iàØùË©gµ›Nþ¤Uë3•úûßÿ¾¬³?^ùÛôáE7}d¹' .”‹ð ;Ö±ù^œ7¤Úñ\òÙ#ÆGþâF-¿tkÓ¯Ó›Í0÷/ ìŠ÷YRžè¯ËWÇ–NUŸÿWðy—š»îyÛëèÆY.ÑòY GGW§Mœ<é}ï{ß2b¤È‹røÍ?ΰ4òŠ@õå¢läGT辰ÀyìÉ8ꨣš?øÁå@¦˜ÿ¢‰Áé£ñ+žûï|ç; ŸN²TÇr¤Ž3 Ø?ÂÁO|"œ.hC`Z† “‹ŽŒ G˜FS; œqÊI•¯ÃòÇÓG†“ÊX'íÒ‡ó›bå¤%rä§Ë/ë„ì\ÐgÄpÓP°ƒLYû¦Ãs³\]W:Xfyø¿6t10± Á›(o[LƒóæÅtì\qã›MZl¤c­š ŒµóëÞÈ0èYÛæßû8ÑŽuܹâ¸gÑHàÍ/bà½÷ù¤Üú¥ò õ30úÖ©®Ë\«?廿šk¸ ãnpä¬þ¦›å”.‡A˧Ž |ÂF^Òf.3ìÙ /¬ûHØ‹À¾f;é/·ß~ûbtx’e­—áDzb(Ä7רh…˜†‹‹ ÛÆlœ²ƒ¢o} Öq6ë‘ïK,O?ù_ýêWO©¸L¯ŽçØEÏÌÃ\v<'µ‘@ymÒÈ‹þA§®º¶º¶ñ—/¼èŸ©ø‰ŒöOMöÙäË®©8–gÚršJ);œLËP AqÅe`´¡Õ”“¬¦èÀ«åëp­g}\-_‡•—žvÚiås#Öó8¤„)iþ@Çf-¦ìX5õ¤l€cãé°IˆÍWlœ‹·ÐíÒ7òï\U¾¦múq6øtý÷‹¥#¦¬Ù“àó@ |N¤50òÆKáã KkṬO;cç?ƒª¸Xè\.?åÈX(ÈŸD`Ž!0WË"Œ‡?v,6ÞÈ‹ ˜lbá¿(ú¤Cw*úüÐûßÿþ2Ç÷W¾ò•²¡Núè£.²Ø½Ëg>ìÔf·=»ýÇAÎLÊSžRN“‹ulÓ‡gYc¼¼éê3ØðV:wÃÈ¿àø¿˜ŒhÊÌ ÑH`@a¹ÁçÁl Káë‡FŒ}êÁ+¯¼²UZ Îs½þÜ㫯¾ºœ’茟e«Pz9†À´f¨‹’”ƒžqÖׯàI¸Í¿(ú1©è£Ç[SxøÀÊ·ÜêÃgÍM@Ìȇò8‡ž` Ç±Õð©g©£Ã¬‚˜ÏLÖ?bi9Í[Jj‡pÒIhN=íô2+´ÍÖ[Õ"ž%48Ä™²ö¹±ñþÂó¹“ÊS>õG÷ñˆÇ\À{‚±åK›^Ÿàh]“&½B`Ú†‰Qô[ÈÈ‹~ãcmñ‘ýQŸ|Ë[ÞY ù9€„ƒy¢Ãªg1¾àLŸMCð9â”Í?~:D‡Î?½ñÍ6´îx^úÒ—–3íYkôàÓŒé—ÌÂ2Ò5V¦©ê·¥EµóJÿì#À}âb s˜Ièrõ=5,E/úëtê8ÃÒÔŸ=ü˜5¢ÿÀXôTëç0Ãý…@Ï P:›øfSCQÇÙ9E~ôOV9>âÀñ°y"§?ó÷HÙ«®ºj¬n|«Ì®zŽ=5¨ƒ·Ývk8 Íøâù‰r1.ò£_=igù#_?÷#æ? „Éœûá>r¿8H #?÷çýŒ…®yux<Ù¶4Sþ2`Ä® «6Þ¢âÇ}g ‘½„I+]"0ט¶¡ÀÃ/+ØöÐë]äÕþºÑÄxÓ‘Ç÷Ĥ£|ýʶQÎcw½Ó´Ã¥cÏFŽÓÌpµb\Ô‰þ(£¿ßõ9šÃˆ˜Q¤]ò/£mÿ*i}kÚëú3‹À”ñEUºD ˜¶¡@'Ã¥UL¥iX\ðu1ýÊÇÎjªú1ÓëÊÃxËf¾RãÑzs°Ü@IDATÎôâÆEãSzýõ×]¨2¢?†£~—L”ÇS6êÇ·¤FÞZب¸ùæZ`óâ¨öüß|ØÅlú¼WK.¹d9,‡AŒççŒ3Î(GõºÙ-–É{ O¿Ïr„k^Œ«ýµìTõùø³&ú ÄŸ ±8:âtú¡¶Kâ×¼ZG9iÔg0~ç;ßY¾BC¦÷YÚá@"ö±D¦òo+?ËK|VÍ‹³™”‰2XîÙhƒ³9káýJÚßLÛP ú<ä~êCØÆm„‡‹a;Çј§ÿEÓŸ¬¾ò”!–g<ý5ÖX£äÿÔm°Á!}gbÑó›Jþf8‘¾rv@„'k0¨›tvà1sÀ ÁrKa,C\vÙeå’8»ßÍnõ³‰®Ï•~ï¹|iŒ¯yÔ4ÆVFãkò ‚.Ó©ÏÛ³gAL¤ãÕ4Æ·åã1´8ΛA˜O9²#£…0ÿy€ÑÀÔi‘NÌ·-¾æ!óoÓ ŽçPþƒ2QFõ‹'9†@Ï . †pÝèbñ48e㢌qm YùøuSÑW'RõcÚúý×<þ±C¾e4 ¦9ykð«øê›¶²múQÆ´§ªOúêš—4 ‘˜”û„!À™ý¼er¯iOPÎáç_5(±ÏBôG^4"áû(# }þ[£§+/Ë"E®åÇà«f2Öù‡Jó_mµÕšw¼ãe!_&ñ 4ƒv¯ó˜ãLj:ï¼óÊͰä@žìOÀ8Ô,…ÌŸD`"0í—xȾ£±ÑȹtøáÛ ¯œñ‹ªo^SÕ·LãåOÚÆãgݘ·“üãå/Æ#G‡ÀÙ vÖ×¼ £×«ú[>(i2»Cþñ"¿Úi0¼öÕ»7›o6ÿï°k¹ Ï<Ü+ÚË $ (÷»ßýJæ ÜW\¼ß†}ވïŒ~夯î•>é™'yp‚â¼yó`õæ •ß«üI“´8au›m¶)FBÌÇüøL>¸ªc\,¿~ã¤èÄtÇ+?3* ÜOî-3GÎ& «>é§KæÓžQð! ‡JÚˆˆ×/¼(Ái“mã©ÃT?–¢Œü:/v“sžB”‹~õàɯé^{íUÖ79âù€(_@ð&H§ÃIìZço‹ÙÌó7È#?ùæyQV¹È‹²ê3ýˠ㔦ü.ªÁПüÙA€ûê=ÃXˆŽ™N åï…1Îu>Røm~yÒÉêó•+¯¸âв$Bþm3e1Ýè§-`àøeÑå—_^êÈ`Ëu0¶9Ru|Ó(Ç   ¼!œgÂ?ÂF}üœ–ÊìŸüš’.ë…1ò£,aý5­e:øÉçüóÏ/eL#AÔ’öÓ2èØ¸˜2¥ƒs£ÆÁÌdjã,eñÃrÄMF]iþp"÷ˆG<¢ÙrË-[ÅÚò‚–•i`ΛßgŸ}Ê… åÆq4ÆÂ‘GYÊn]c½ä!ošøÛòŸLýÍ[}ÖBÙ°ß8ÒO7÷à~g,ðœóüyoë磭†È*G¼aiä©a°ÿþû—7óe–Y¦ tW^yeô·ÝvÛæðÃ/ƒ¸é’ް<ÂtPÃWü1Ž#Óýë_7¿øÅ/Ê쉲±,œAÂ_"óïˆöÆ}þóŸ/Ÿ@cx`h`L·çž{6¯yÍkJúþ°4ˆ#}õ#Ly ôm2ÊBÛôkZ= – 1dÒH‘týŠÀ´ *íÒS¦4 :œ@ „pͯe—NFŸ“'ëhÐ:fø{ᘗ~(o|úé§—:F>ú|fEgÛËYgUŒ$Þ`èØpì¶V‡°~)<]äé—Ö25ŸøÈÃOGªñëkZIç6ܳ‰Œ…®™…¶šÕχ2]|Úñ{ìQÖøœ7Ûl³¢‚üñÇß¼ímo+›¡º˜–¼6ÊáfìÀP`i@õ¿ýío—Y?ÛqßøÆ7ÊæÃvØ¡ ¾´=þ*œÃÏøÂým.¦Ÿ¿h>ᄚ½÷Þ{쬔(S§ã&ãG?„Å ÷3óç0± J ¼ÉÚ õEãñŒ—Ž'k²”Aƒ%RùR:_-ôícZøcþè–*e­‘ÿç_#éØÔ'mt£l›~äé—F]Ó§ž†ùS®tý…€ÏfÛžâ˜~ç>ã|&ôK}f CuµŽ²Ð“O>¹,70kòåoŠù—TÞö£Žþ¶ôáOz|9„1 ªŸ£ØYFä‹yëÌàxàåsK—Xža3âûÞ÷¾²ìÈÛ»:1͘ÿ—¾ô¥2²ãŽ;6/ùËKq£ìDúEá®ú´ÉÂK#A”’ Ó2è8ìÐØ½ËÚxlt5H6¬È—§ž4ÊèWÖ0TžzÒ(£_YÃPyêI£Œ~e Cå©'2ú•5 •§ž4ÊèWÖ0TžzPî Œ†Q”Oÿ `Ûê2Î<óÌ1cZÅgÁZú\Œeñß8r’'Óòuºìña9Áö®¾TyÃRøÔ‰½=Ì(°teñ³ÏˆeòÀÁã?UøÂãA^ñÜÏ~ ö+0û«Ó4LÚ‡rHù8—)‹z5ÏpM£Ž~^–r¹4Ò Ó2‚·Vf0hH¬“C§z‘Vlˆ©?5 Å·îG.=€Hÿ»É ¶9kۼؖ KkYøÛm·]PñãÔgãœsÎiø{v\Ì×tàë—Ê3üœç<§è²Œ!ʧüà ñ<¿Æ1£°ÕV[‘Lqò¡\`IJq1Þ0§2²DÁ"ÿ)ã,Þôö!¶3ŠÚŸN²¡vã7.÷YmɰqòcÛ”GzlôåiÎr`ÿ _ qXÑCúÐæÄO,û”‡š®ùH‰ó‚§ÆÀ¾ûîÛhäÀgßç>oÞ<ÕË‹>ƒÜtÓMÇôÍ;–Ÿç½.‹r|æÉÞ ±“õ#ÏÈ3lùåƸ!ý4D)é !0mC@h  þ%3|•þظàé"_?q©?¿Ã ±‰¸€“|¦‚¹ÑP¨e‘Oןp/ã×Þwj£±PÏ,Ô5:Ä–ÂÛo¿ýŽ(gãß&›lkÇs¦SO ?ú•“·õÖ[—™ ŒÊÌl3ï}ï{ÐgöÇ_¾3û0gQ–™¶¸ÙØ8e¥ð£_9i—F‚È$d¦½G΋Á‰©nf üûÎ5L—Kô/Àu#4>êD¿ñ©?ŠçÛs~F[ndô©,ª±@;c €C‰xëç"Ž™…ø5µ§ÍÄK^M‘áâ˃vÚ©œ× LÔgŸ‚¾2ñL9ÊÏ&D>•dÚþ;ßùNyvÙÓäYf&Ãbq1ßcŽ9¦|yQ–sM>øàÒ®e£|[ñQ†rçLH¥tzf(0Õ¡À …œ±nƒ¢óÒ%Œ‹<ümr©?yüx»ÁPˆGÂaºÁB€6¡qޱÀW¬‹k,ð_#µ±mm¾m¿ÿËÀs„‹qèÓ¶ùb!ÆE™QéÉ«óçëö4±”¡€áPŸÃBÚÛo¿}ó›ßü¦üUt[¾ßÿþ÷ËANœ©³LRøuþÆIՅʓ‹úÑHwî÷"¶=åÑM—ô3Ó6¨< CF‚¡@#¢Å 9Âq 6Býê(_‡Sô«ñâ0¸tð¼­1dG5ŠÍ þr'2h+8ÛP¤b/ʰÎ>odçpcŒcÏ1ù\õ£lQ ?1ouXrà³Gþ…¥ å‚jÙ į~õ«WScˆ3=ôÐf­µÖ*rmúðø[iÿ)R}Ë+U7Æ·ÅÑÖ.ºè¢²'#ã©ÓHˆw,ýƒ†@Oö(ÐqÐii(0Xñ4ÛF'@ÃRøm~yÒÔE@<¤Lóµ od¹‘ѧd°)mç2D¬-ÿ©ÀÌb¦œÏ rÑõàóáî»ï^>%ä01–±øª€³Ø€¸ÑF•Ê0Ø”èÁEu:u>1OýëÌN›”/% ^>Ž=öØr’â.»ìRNL]ýõ‹ÑÀ™ ÖêI-ÿWNº:¾æ·ÅËF{r&Aä’2=5hˆ 4XÞ¢¡ˆulã xW‡»Ò6}Þ¬¸ØÑ§>Å!éà" P ´Œöl¸á†c3L´¿ØŽð3óÕa\ð9âqÇWÎ&ÀødY€˜\Þàoœù³#>sTŸ™íèvÝuײg)æóçÌÒäHô.‡.K+Ÿ9P‰ þ;û(øÒãIOzÒØ&϶4ÐçTG žXdÛê_§Ž/Š˜IÀ ×Hà ¯Øæ"Žu:Nú»4‚ÑV0ÍÐYÐx³ÅHà „‹ãVq6Ð:›.~­Ó%×Å&}Öf鬘~Å8sV¡Æ:ËíÏ6Ⱥ?ÏgÐi# q‹ƒõdP©åëðDiÔòux®ëG#ÁåŒÛõáêwðaG”bî¿ß^ýPÜ,㘉ûÛ“êA#ÁbgÀÂ@ ñ©$Ö·Ž«Íuñ‘qÑÓéâƒ>ƒÓ¡«¬²Êû">é|ê™.(3 œZÈt=mÇsƒ#žöÅé—Ê“*7Lú´/þ‚ýq&¡îcºD`ªôd3#™ÒÐY1Êš"Òµ×^Û9Ø;ÀC£Ÿô OÆ?Ìú¼9²ÔSo¦·tÃ…íÏ6ˆ±ÎìSö|^H[d©€%ªØ¶D¨« )©~u¡ƒªf0Èã^ ú=§ˆGúAB g† Ð`üL’‹efpt$¾…Ôþ"0òc|¤vJµŽ2Æ“†¼HD}>e£#cöãŒoÎ(²ãò‰>ÊýÇ(À`ÇXðœŒx ´ÛEôƒ|ã¤òÛè ë×F_7¸'Á ÃÙÖx*Ò :=7|£ÑP`)‚©ÏØéDPå×´–1>òñ˯i”#ÎøÈïw}—vê7œºŽ.¼40 2gvAc¡nãµ:Ž0yD~ôG´á×q„çº>Ÿx»Ü÷$Пi$Äz¦?dzj(ëwXßtRüÿ›ptñ_^[gÏ«(§þ~œ~ 6ÌÚðæH–³ >%Ii‡< j <'L›³Æ= ,Càl{±­uÍ(ãå Š>F›±5°˜•±a€kºD`˜èÙfFA³ƒbÜYva_zé¥Í:묣ص“ý ȓʗF~ô×ñmqÈD~ôÏe}:iΩ Óg6ORéüÁ>]" < l8ºè˜å»à‚ ÊG¾ñžÒ2^y¤-?æ#/ʶñæŠ>Fÿ;‘ÀLûI'B€ö4‘±°Þzëž·ÚiÀ¯mß/úi$p·Ò%ã#0c†Ùú¦Ë€Æ† Þˆ1ØØÈѲ¼ãì€â`¿­³‰<ýàfìù`ç:o>n`´ã¯t‰ÀDÐV|fÚ68^xá… Æm×öh;3Lã¶;ó4¾–¯ÃsEŸsHr&Á»—4èF`F ²µcrc#<oÇÌ6¸ÑÑ"ÆÎ]œM ÇNÊxe‹òÄŰ2ê@qs1Œ*:nŒfâÆÑRço"0yxö'2æÍ›·±`›éjGò)‰m²nO†•1M³©ÏK Æw.7€|ºD`|fÅP`c×5KXò\|¢Eç@c.v2ðí\äË‹:ѯ\¤±Cê'}¾p S[}õÕ‹¡àÉptôÎØÄº§?˜ ´‡ñŒ…‹Fþ%1 ±-ÅôY€§LŒ—oœT™Å¡ŸF‚è'M&‡ÀŒ ƒN‰Aͯ è8ìÊÛ2ñlx¤©t«ac¼ÔxÃRùÒ~Ôgã"@9~7ž™F‚w5ét ­Œg,Äeó‰í tu3.Ê-n}^Pr&Á;“4˜³b(Pß~ݯ€‘àÅ2†ƒË mU@‡ÎFªŒatAŸ¿æKŒ¾ygÖ…ffìÜ­{ÒD`Q -ñü ³ l^¤óö¼ê.è5»œ#à'”VÙNCZó KíH «'­ù†¥½Ô§»úê«‹!„qÀaJtjþ¥-Æ“Y†¤‰Àl `[$/—!ÌWceˆèlGÒ¶8yÊHáë—*ãä)#2Ì$0+I»¢Myä9} ýKÎΉbÒD`r,VC"Ò!9úß ’ 4lö1`,ðæMã_sÍ5‹„Ô´ì8ä›6ñq¶!Æ×:1­^ëßtÓMe:”Î ã€ÎŒŽŒ¥ö'` i$PŽt‰ÀâB€gß™…6cÁ= ”Ïöý“á!ßÕŽEŸ™f#iWÌÒ­´ÒJcÆw  .˜:‹ÝP°È¾=Ó9p1Xb8`,ÐIqñ~Á?_0¨ÒÉÔ i:øKÍ' Ê͆>g"ð&ÆÛFo:^Î"PpÈ7ïVÒÅm±ËXà“fŒ…øo¶©H£Ÿ¶6^{«e ãlÇãéc$P&Œö$оxÑð$ÛÕ(–ù›L9c(Pp:%3³ tN\ ž ¼m³_M×^{msî¹ç–0o ¾íØ™Ô nŒ‹~ó…Ö|Ó™Žþ 7ÜPÖJ10(/3,£ð¶CÙéÈœE ¯t‰À\B€g²ÍX€ÏÀÌ+±È8¶£úyŽqÔ‘02RyÖ²ú´/–ó¢‘3t¢˜4˜sÊP *t v¾ `8ðfÀ Ê`Ë…±pýõ×73‹o¼©ÛY‘Vì”bGdœù(×&ƒ,®-®KŸMŠÌ~`Ôà0p004èÄ0€0è„c¹‹Rþ$sžõh,æ™åÂXàœfùlݶeŠLäë—FÙ6^­‘Àò¤Ë ô´9ûl[Ñô'SG`Î VÆM'á씆ϋ¡€Q ±€ÁÀþ:+Œ c;;©yÔaøò vz‘§n”Åq@y®»îºòWÚ”•rPV×Iñk X/Êh>1íô's žSŒŸW(Ï0Ëj´?NµíR~ec]âòñu[“7}N\Ä(g¿Æ8F‚³ti€GÔÓŸ,:sÖP Jt^t>4|–"˜]à#é}/6 ò†ÃæGd‘ã¢ó¨;°¶Š|åk ØqI‘¡³»ñÆÇ.ÖG1(K ä‰aÅ8°ó¢Lv¶”']"ÐOÐxnyŽm›PÆÆ‚<ÛP]Gù5EN^íi C›cÖ.Î$ÐÖh‡”1ÛWD,ý‰À¢#0§ «;$Y¦ëé¨|Œù‡Em üðØ@H˜Î„77HÒ‘ðFOððÓ©”NyŒ(''2ÅéEœéQ .:*/Â,/˜_ÞѤýŒ€Fí&:øÌ*`,°™Ð¶¤|”¥É~eäIåK£‘àÆEqòåJ—$½A / «JÇâÅ ë`¯Á€aÀ€Ž‘ ¡ u€wÐǘ`°gÉ€Î?ÎŽ)æC§ƒQ@ž úø1¸(ƒ~ „.#ĺ$MúùÚX N ìYÀѦj‡~äG-[ÇцIÐHÀ8§Í¥‘P£—áD`úô•¡`uÄ¡t t$t мiБhÔ3ð•AC#¡ÍP°ÓÁHpæAã„ü¸0ôÇ…AgìT-ÒD`ð¹î20œYˆõ?~Ó‘O «ŸF‚H$Mf¾4„‡ÅN†AÝYg  t,Ðh$(G‡¤¡P§Mš¤íŒB4äi Gy¤¦•4Tl]Æû…0”Âú‘ÁÏ¥?ÆÓ~Ù0Üö $mŽ+]"ô¾6"t,vFt Þ8 :h¼äÙ1!‹?:;(iCëË|¥Q?ý‰À0 `»›Œ±@S>bc;$.¶CåÓHˆh¥?˜]ÆPˆ°ÅA›ÝŽ'RýèELGLiâÚ:¼‘?‰À!`[ÏXàóÅØ#DèÓ¹ôŸY@fø2÷$DÔÒŸÌi(ÔÐÙ‰Iëø '‰Àô°}u üƒ½†v̱ÍH€çLB ­ô'³‹ÀP ³ iæ– /“1˜¨z:Œ0K#AD’&‹4î™k"0°8èwÍ,°Á‘eå‚ýC1œFÂÀ>Y±>D …>¼iYäD`®#à ße,Äeg¤ œ¸š3 sý.gù†4†åNg=YF ËXÀ àôFŒ…8³ŸsMÒH˜å•Ù% †Âet",:]Æ)bðgnœ‹€3 œ˜š3 ‹Žwj&3@ 3j¦™$ct  Ì p:§¨b$ø/y,ó„éI+i(,Vø3óD`8¨Œ{0ØÌÈ¿Áò÷ñ\i$ Çs‘µìÒPèû”¥LúÚX BƒÎŸ¬a(ðŸ)Ì,ø§jœ·ÐvæBß1Ë8ñÿ~ÑœtÊ© åzðaGŒñ6ßì‘Í6[o5NO"HC!¢‘þD ˜Q400 ˜Q`o3 þW qi$ôî6l¾ù£šSO;½àÜ–*x#“.èB ÿE¥ ™ä'‰ÀŒ €±€!ÀÅ¿¯b0°ÔÀß´c8øGl3’ù&ºÂ¶|øC;kN2é.ÒPèB&ù‰@"0ch,``0xvÖaÆ2„™1ãÚÁËÙ„• פ¡P#’áD H ®Y…œM°=CÕICa†€ÍdD`b˜=ˆ×Ä)±¨Ô³ 9›°¨HŸ^ ÃwϳƉ@"0„Ô³ 9›0„Á"V9 …E.ÕD è7œUÈÙ„~»s‹·¼ ïnY¼åÉÜD Hf8«_:ÌȘl xS³J‰@"t!_9t!“ü.ÒPèB&ù‰@" 9“0€7u†«”{fàL>HD ègÒPèç»—eOD Hf4fàL>HD ègrB?ß½!-»Q<¤ÕÏj'}ƒ@ÇÝ7·jÜ‚¦¡0.<9Wào‰1¼æj9³\‰À° à ›Ô—?ýJ#apî| ƒs/‡¢&wÞyg¹èŒttJĵuN‘ýêʓʗF~ô×ñmqÈD~ô§þ(b"iäG߇LäGê" &Rq‘F~ô×ñÄéh£þUx[›T.i †Bܧ,å]ÐÑ Ý|óÍåï‰í¸ì¤˜iÀi8D”þ(›ú‰_|f¢?>3ÑŸÏϨ‘V¶ŸÛo¿½üm¸8—®HC¡ïÝP–œŽ‡Nè†n(´€ÄN›0òvVP]ä§þ¨q6‰ßüA<âs’ÏÏäÛÏ­·ÞZþÖz©¥–Æt}Ž@ }~‡­ø êwÜqG™QhëÄíÌ¥âcXê€HX?²ÆKSñŠaý‰_>?> Ë.»ìX{²%íOÒPèÏû6Ô¥ÆX¸í¶ÛÆ:!;'A‰<ÃRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú£<~œzRxQ'ú•ǘ¯ùÄ¥ëOÒPèÏû6Ô¥¦ÂXèêˆj¾aéDàÕr†¥©?>5N†¥ãk/8!«ž4õÇG ÆÉ°t|íùx+§žT~En¼öÙ¥—ü¹‹@ s÷ÞdÉÆA€Îh¢Ž‹xÞ‚ÚÜxqÊ'3^\ê"0FãÅ%~ƒŸ÷1iÿ#†Bÿßá­o-]|]-“ú‰_>?£†tÝ6b›‰~ñ‚7™ö£nÒþF …þ¾C_úÚˆ^ô ¼Èǯk‹‹#rm2©?Š@6‰ß‚3Zm êóc½’ö?i(ôÿ=ÚðFƒ’o:tÊ8)ñú#¿ü¤þè –øÎ´ø¬Hóù™|û±M% ÒPŒû8”µ wìÐ5"ÚxèŸúó;ÿ6¬Úx‰_>?µŸ¡ì¸Òi( ð͆ªÕo¿Ô9nú¥u|ê/øö\ã#nÒ:>ñKü¢±Ÿüé4ã>e-|«‰ƒX¢‹L|+î’ëâ§~â—ÏÏüY•ñÚIléï_ÒPèß{7ô%÷m6A§åTWó ËS*OjœáHõ+“ú‰ŸÏ„ÔgÃp¤ú•¤ç'Ö)ýý@ ý‡ºt¶u‡K' ÃRe×F…qêÆpêw)Ò…S,ÿÁ|þbÛI#†Bß¿¡.}°]ˆ<À‰³ HÊDã õ^kOüòù™nûêj€*Ÿ†ÂÝÌa«Š¾€ƒ½8ÄxyÈàìñ§þèmâ7j,ñLàòùYxfn*ígÅüÒP„»8¤u°ÓŠÕ¯yшr‘‡:úüc^[ºw¿ûÝ›%—\r¬Ú䦛ÿléƒõÍ_ÇY™ÙÊŸ|?îÏ=îqò÷Ç‹¢O¾ºÔŸ¿ü$&кýĸô÷/i(ôï½ú’ÓY;3PwÜ`ð£\ä`¯ô¯¹æšf“M6é¼'Ë,³L³úê«7}èC›Ýwß½Ð^æ?›õÿÙÏ~Öìºë® tƒ 6(øÎfþàf~“½7ÝtS³ñÆ7¯~õ«›8`Êúæ3SÏõñŠù×où[¤ƒ@ ƒq‡²t u+5ß°´K®‹¯ž´–“ÿ¸Ç=®yÁ ^`t¡Ä]{íµÍyç×üñÍw¾ó2X½êU¯š3å_ À#ë#ß04¾5F¿²Påå–Ö|ÃÒ.¹.¾z§œrJsÌ1Ç4‡rH³üòËË+3ú±Ìuz*Ô|ÃÒ.¹.¾zÒ.¹.¾zÒ.¹.¾zÒ.¹.¾zÒ.9ùI 4ë~Umè´¸âÛ—þñ€èÒ‰ü©ê£‹»ÿýïß<ÿùÏïTë[ßÚl¿ýöÍÁÜ<á Oh6Úh£9Q~ <•ú+Ï +æSÑoÓé…þ%—\Ò|÷»ßm<ðÀf¹å–»Ë.»ló»ßý®Ya…Š¡0Sù›îXÆ-žXÏ.‹Ú«K'òÇ„[»È¬´ÒJÍþóŸæ¤“Nj(ç:ë¬Ó<ùÉO« ²çŸ~‰§¬`Ëžñ"Ô§­>Èr)K}Á˜=ðÈ#òÏxƆ ÷šûñïÿ»Ôƒüò‡”|ëüaÖøÁ‘Ÿ:ø3¡o~Iû4úÿm èÛœžq„é€åë7¬œ´æOEÙº\µ>"ŽN^Y”—¾ô¥ÍqÇWIËU=ö(› ßÿþ÷uö;í´Só¾°yìcÛ¼îu¯+_W`4üýïoØåÿ¶·½­Ùm·Ý¦Tÿë®»®yÃÞÐüêW¿*_ ¬½öÚÍa‡Vüþð‡Ç¾à ì–ÿÌ3Ï,K*ßüæ7Ç6jZË¿çž{6n¸asä‘GŽ•™+®¸¢!îücÀÍÀŽÅƒ#Ž8¢Ùf›m&,?í3ŸùL³lÀ÷îw¿»yñ‹_\ô‰ßk¯½š×¼æ5%ÿ믿¾ ÆìgÀÐyÏ{ÞÓ¬²Ê*eÉüÀñ«_ýjáí¼óÎeÆð¨»òÊ+›ç=ïyÍ¡‡ZpËxÄc}N=õÔfÅWlî}ï{—ú°òÁ~°Ùn»í¨ÿ×¾öµæø@sòÉ'—M¢ýë_KrO|âKYî¼óΆ%«o}ë[¥1™Ü÷O~ò“cŠàøËŸÉç¿-ÿX–ô÷'i(ôç}ËR `(„#/†Ðè qú£,ü(_‡Õ¯¿ÖWŠ‹é©ýÌg>Sâ7ß|óBã:ºZ_¾i)ûÓŸþ´ùÆ7¾Q!U—£Ž:ªì…à-ÞÁ’4¢¾˜À'½[n¹¥ D Ò jÌpÜ|óÍ FÀë_ÿúÂSië&S~Üg=ëYe c ô-AœAãècûXó”§øÁ.ù0{𢽨 Ð|Ê€Ï@~Ÿûܧàô½ï}¯yó›ßÜ0˜ó棾,Ï~ö³Ë^Ì<€1ÆF Æ:ÈGüÙ·B½?ô¡c‘¼(ë§?ýéRÆ}öÙ§@”9 ¹ýöÛ¯\`ñ¶<æaáë7®×ú£©æï †Â ÜÅ!­ƒ›Õ·Ó¥#Œ9þš?ý˜gô“.y1½Ì@vôÑG—A앯|eyÓTÖò /?.Æá÷mÊ”ÿ±ÇÛl¶Ùf……>uaP:ᄚ¯|å+coئUSÑá šAòóŸÿ|™¥€Oz/yÉKÊfÀ·¼å-°‹³¬R˜ÑOؼôÇò3hbœ0ð²$€CŸÙÞðo¸á†ò¶Í2ƒ¾iÕ½%–X¢áÌ ui3Ì[ŠìgœÑœxâ‰Í}ï{_‚%ÿõF–PØlJ¹þð‡7_þò—KzÖþ]ïzWó£ý¨yÚÓžVôÈ“£Š¯[â{S˜Ý`€wVÁúXfT0ø0ptÄq™ÕyÅ+^QêôÈçðÃ/_Õ0ƒ³Œ1ÚO8)~Êë…¾÷¡$˜?}@ } ‡·±“…:‘¡¬;À?]}óþâ¿Øpu9‡|ä#å Y˜7eŒ|Ó¡üò¥Æ±„ñÈG>²µ~ì-àsLÜdê!ƒÎcó˜±üÐ?¦ï?õ©O5ì –%Rýèé„ÏÛ7†ÉÞ{`Ѥc‡ |¥ÂÀWÇo±Åe 6–0ʘipæÁòŠßk_ûÚæéOzóË_þ²yâÈlDtbìÉ0=ã˜ÑÁ`b) ƒ-:f/0ª0N0ºœùwÅïó²ÓÕi¥¿ÿHC¡ÿîY–ø.bdžŸÎL*H†¡ú‹Ô8©q†¡ú‹ÔA„·z§¢‰GǺö_þò—æÇ?þqYSf f Y§éè'ÎÔ[hÄ¡DŒü ƒ!óûßÿ¾ìãxãß8¶f-0d,4–Ѱñ1Î< Q.ÊD¾þ¨§ß8©ü¤ƒ@ ƒq‡²tJÑ–ÃÑo¼Ô8iÍ'\Ç)#å\„vØÁàB”)i>äÍ7Ï6WçÃøc}Ï /%ÎN_ž”¸Ú±/Ç&¾(Wûã—1Îôj^ ã7ì¦Nö=XNÓˆ”Á—)vœº1^Œ‹ùD~[lÊIM—)}yRãËØÁ1˜O¦>êIÁg¸F~vÜqÇb°¬ÁÌ rlbÜzë­›Ç?þñ |™Ñ¦Ó‹~Ó—'­ùmi+ãjý(“þþD …þ¼oYê|  ;(:iü±³6)zµŒ<åbÚ1]â•…†zÕifÚ™Mztøq@™Œ>ÍKy–Kža)2b…Läã×1µÃðPÞ¸¨g>Èè?WL›0å7Êt9Ž ¦Ôáá,_Ôg^]ã•-J#?ÆŽ~ÃRã(?Îôà·…á‰2Ê[õ˜¹Á½ìe/+@cù£üµÖZk,MtàýöÎN“¢èÿórA”(Š ˜3ÄœbfÌYÄ€¢¯"ŠL1‹L(*`DÌŠDD”è¾ÿýöÞw¯¶ofoïnŸyvwª?Ÿg«»ºª«û7=ÝÕ==³`PÛ!Çêä@ê 'œP^Ñä<–‰9à€Ê›!ÖÃúÍd?ÊbƒyÖw2g2/–e£ ñh×¼¤ töõtí¬¤d‚Ÿ_ä+‹Œqi”3¶úN:È[žñº\&=VŸQn6ú<°Lë' ¼ÙÖŸä L–„[Üâå‹–Ú•O\]òK•‹ºäE>iå#íÂO;QÖò¥¶ëJ༯ÐÓ~¤æEÚúì|ðöÇî»ïŽhùnN';2GuTùʧõ´¬¨/JPVjý&s»¯ÌåÔúÊ%]øL^øíÈ 8iâþàùâQÖ¼ÈSWž2k£ï%PÚ¦Ï5Î,h ·¿q Úô™¼]ñ›¾a¦ú#mE}ëH>úXÕžvÚiSu@™¨üñÇÃ.Aý5ÕŸGÈ#hç‰ó¾7ÐUÿ3Î8£¬˜y5Q[êÇ:E}ÊTÆ8ùó"/ê×ù¤É‡Zž<Ë$ßöœtÒI­öÑáƒPìpæ –I9Ö9`Æk‘'žxâjöù8Ÿª&ðŠl›>yÖjºæ©k´¯¼|ÓkÒ/†òÏ¢A …Es)‡Û¶A 4Üá)KÜ J@^jž<ÓE`埚§,ÔU'ó­ieá™/?ò¬ºPyÈó<ü˜cŽi-Ͷ8:|BZ>”‰“µÕŸòx¤ò„‰[Í®ƒz¬¼ùÆŸTæË’8"æYÒò¬?õ ð!'ë.U&êá•äKÍS_[æC ‘Ò^ûGÚ£.qÚä¿÷Þ{OµÇ2-Ç´}äqÐ8ÌxÖYgM]vÜQàUKdÕ“j?æGF¹™ì[†²³Ñ§¼ ‹<£°x®åàZ€eˆqym´ë9êúê3ˆf* ûþ¯¾Ûïʶ˜÷ÙgŸò)g>ÓË«|ߟLJvXùÊ"6ÚÊö­G¤ê¬©ý¼nÇ·8hÉ;ÿÔºðH„U?udÒ>ú裧&AëÄç‘ys‚IV»ÔŸ!½ýío/_zTÖºíºë® »%|Kgïì0ÙcC||ÖšOS϶þü^§äƒV< àÕBvIb°¬HÛð‹ùÆküàûÃç-Ž8âˆò©hÚVì ÄöàLX^[½"8à8ñý ~œ…àñÿK‚¶òEGúT[™uYuýÍŸ.²ë«¯½¤ ÿ™è «FÛ…U÷¬íX¾|yyUŒ“Ak¶n¾6òu¹kÒ_±bEYIóu?&É:D}&\v ˜„=ô¦<ícUÎÄŠ‘ÉŽï0yò8€IÇgáèð€É݃–#eÊj– lmÚÏÖ9_’Ä&úLN|Ι:_pÁå; |èÉ`¥=p°þ|c€º¢Gý)ë¯ÿkïL sþùç ù&…#~êtQœ¾fÈ[8  ä,8ñ_$ ìÖà¬í´ÓNå|F]ÿ$ŠW8ù ó†n¸~œø'X\#ÿ1SÔ¯ÛC;vÛm·©öDYvT8‹ÓÔh?}‚·h¯èg|{L×Ö¿¶²ÖVŸ2μP7œ™ ý!pàAcûï·ïœMGaΠ̂ú@ : Ø‹XŒÏT—(×Oýnº0‹üníîk–ú³sf#N]ñqã#“ŽÂLWaty£pòÑÃè®W–é(,ük8ØÄj¡m‚²ÆÕ©Ó©¿ºƒ FPã‰ß$5Ù&ûý#éÂG …… Û‚zÒb€®y€ã@.€E^ê'~ÙºÁx¯xE^×ý£lÒ…‹@: ÷ÚeÍ'ˆUŒ;hÍR-“ú«Þx¨±iñ–Iü¿¶~’¼…@: ÿ¶>;o€I‹“YWˆ[-“ú‰_öŸu¿êû)Ó töõdí™üùy° œôkÇ ÊD°jù:­lêOþã-ñÖxÕiå¿aâç=j?Hº°HGaa_¿AÖ~ƒ 6h6ÜpÃÒv'( Í*ÒÎüHײméÇņÿ©Òú%-é(ŒßÁ–ÎM}饗6›nºéÔ ÄDð†×q€gÜA ãæ§~â—ýç¿ÜS÷LŒÇ{&ÆËýsùå——v§£Pº@oÒQè êáb€b7áâ‹/n–-[VnlwPˆƒiäã ù©?99€Kâ7¹3„ØOˆ"?ûÏâè?Ë—/o–.]:5^x­“ŽtF‹ï Kg€ÆQ¸ì²ËZqs© ™–:!’6ެùÒÔŸD@<¤bFÚxâ—ýÇþ!]H÷Ž‹ ý"ŽB¿xƃ7µƒ‘TâÄÏ´^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô‰ñ(Oœ ž^Ô1ÎÎq~ÈfètúÁypV¸‘½©Ûïoži©ü.ZË™–véɯåLK•뢵œii—žüZδT¹.ZË™–véɯåLK•뢵œii—žüZδT¹.ZË™–véɯåLK•뢵œii—žüZδT¹.ZË™–véɯåLK•뢵œii—žüZδT¹š®)¿–ÏôÜ ŽÂÜà˜¥t °¦›ü®•ÁLyš›If¦¼ÔŸD`&ŒfÊKü?˜©Ì”7WýÇr’ŽtF‹ïàKgWAG kà€o¨eR?ñËþ3¹Å^ßñž‰qñ‚·ØîÛ™´_ÒQèïAZ«8àŸàÀ‹|↶¼80"×&“ú“´a“øMÖ݆QöŸùѼIûE …~ñœ5V418)¹ÒaP&HÉ7ùEhâOêONj‰ßäN‹}Ešýgqß?ŽIûE …~ñœ5ð8xÇ]'¢‡Žù©¿jðoê—øeÿYŒ÷ÏàÐyÒàtæÉ…XÌÕ¨W¿´5NnÆ¥u~êO_=×øˆ›´ÎOü¿èl×ýÃ~#­óçcÿ¡ŽúC …þ°¤%B„"]|d⪸K®‹Ÿú‰_öŸU»*]÷I¡Ü?Ô3ÃèHGaôÚ‚«‘ƒ“+¨¡æ“–§ TžÔ<Ó‘W&õ?û„Ô¾a:RãÊdÿÿ‰×"ãý ŽB?8Ú ƒm=à’&HÈ´TÒµSažº1úÝoŠtáÔÅËÄ?ûß|ºÿâ=ŸñÑ#ŽÂè1´…8a»»y€wœ”‰ƒSê¯þ¬=ñËþ3´ûgÐꘟŽÂ˜€ŠY'|'{Ûóå!Cp$žú“+ÚÄoÒY¢O²ÿ¬¾3·˜ïŸÉ«žûF …¾˜=­Øìš€(ç$yüëêoûÛÍï~÷»æôÓOoþõ¯5;î¸csÝë^·yÀÐlºé¦SâmúdÎÖþßþö·æW¿úUsûÛß¾ük[u¿óï{W¹ÊUŠ­µ©¿eÅ•Šþ¹çžÛüüç?onu«[5›l²I©ýþóŸæ{ßû^sÍk^³¹úÕ¯›55‰OcN$f‹ÿú^¿¾õÿþ÷¿|ns›Û4o¼ñTûé¯×ºÖµ¦ð¡ý§vZå¦7½é4'8bÕwýëëòË_þ²¹è¢‹š[Þò–±Zc½~q‡qZ¥21R6iéYøàp°ƒ2ñ#.€Ì3.hQŽø×¿þõæÎw¾só”§<¥9äCš3Ï<³ùç?ÿÙ|éK_j^ô¢5 Ðÿïÿý?Õ§ÙÑÆÚØg€WŸï‡@IDATÌcÓüûßÿžªã%—\RxßøÆ7¦ÙqÅŽ¡®ÿú¶Üú?úÑšG?úÑÍÙgŸ=uýÀŒ>ýéO—f/æö¯ ÿïÿû‹óÎ;o ðŸ£>zZÿýë_ß¼á o˜’›ýç°Ãk^úÒ—N«#õŒýšLÒ}Õ¿T&ÿôŽ@î(ôù° ÖƒJl=y1˜–šGúU¯zUó| Ùe—]š÷¿ÿýÍ npƒfÉ’%Š4'Ÿ|rsÀ”mƒ 6hùÈGNåÕå™QóM×ÔÁ½˜çàX—§LÍ7-í’ëâ«'í’ëâ«'í’ëâG=dø±ÂÛa‡š+^ñŠ­“:uy±ãQ®–¯ÓêÔ|ÓÒ.¹.¾zÒ.¹.¾ýj<ÊÖå’åÌ—F]ã‘vÉuñ£.ñ.¹È'ëˈr±¼.~ÔòòÕ“Ö|ÓIûG …þ1”Enz~nÆøL@D¹“N:©8 ì&¼ë]ïšz¼€Œá·¸EÙMxøÃ^œ…]wݵl÷’ËŠquÛh,›¸é8hÊëÒok3:òÛôäE¹®¸²m´K'òÛôäE9ãPÔøV[mÕœp SüY)c;Õ'/Æ•m£Q®+Þ¦'¯K'ò•m£Q®+Þ¦'~bûåQN, >é¶åºâmzòºt"_Ù6Š?BlËÚèÛþ¨ãmvåE¹7?i¿䣇~ñœ5nr´Ž3ɯãê¬X±¢yùË_^œƒw¼ãåÙx—βeËŠ“@Y_øÂ¦Ê¶¬u±.A›“©Ét]geà×:æE~ê¯ùú××l¾ãGýf{ýíк/ÄvvÅkË›­ý5éc×`Ù¤¯I_¹¨ãëªOúE wúÅ{pÖ, Æ]iÀg°0m>|™O<±(|âŸXœ…(ߦë[ߺ¹ç=ïÙp𮖥̟þô§Íç>÷¹æ/ùKsÙe—5W½êU›{ßûÞÍ]îrŠ› Ú‡aJ™1DäÔÁÆÇ?þñæNwºS³óÎ;—ÃnŸùÌgÊaLCÞèF7jîv·»5W»ÚÕŠZl–/_Þ|ík_kN9唢G9<‚¹ÿýïßð˜%âÇùcŽ9¦ìÜl³Íšo}ë[eÅÏy×Üã÷hn~ó›kfFÔùÿøGóÍo~³<Ê9çœsvjÀ”muû(Gî#ùH9rýë_ªÜ}ìc͵¯}í†îQSO=µ<¦ Ì?øÁ¥ÞmøÙ^ô~ýë_—Ç`tŸûܧÙpà ËÎÑÍnv³æ&7¹Éjõ·â/6ð¹öì~Pò9û‡<¤±ÞuûHs ï³Ÿýlé/œOÙ~ûí›{Ýë^ÍÝï~÷Îúc«Í¾}'Ö 8s@–3 œù m·»Ýí:FYëïòË/o¾ò•¯4ßýîw›¿þõ¯åð$ý‚5po³û‚kñãÿ¸œñ¡ßak=ö(}‰ºÔ7)öÿüç?—~‚MvúÌçpë'?ùÉÒWé‹Ûm·]¹NÔ‹þHˆmj»þ–E¢,é ãA wƃû`¬2øsðÖ<Òm|Þn 0ÐÌFO¼æ5¯™Vå¿ä%/iô •Al›m¶)§Ðÿûß7OzÒ“šg=ëYÓäµ…íº®m¼®úóVuùÉO~ÒtÐAe‚tÂd€ç@Ûî»ï^¶öóæÅ#ñˆæùÏ~ó³Ÿý¬86L^ÞÜk¯½NÚ«/ì!ËÁCÎm\zé¥ÍÖ[o]ƒ>ìak˜Äë6‘æ& °ýæ7¿i¶ÝvÛR/ìSwÊ'h&uìýà?˜ÆãßXì½å-o)õ§ÎœeøÓŸþÔ¼ð…/lžñŒg”õ”eyP&Η<ç9ÏiŽ?þø2Ñpòž3*LêguV±ÇÄ*æQ¿­]ðØzàXœÞØ¸à‚ šÃ?¼´—ºZVÔÇæýîw¿†CŠ[n¹esk\£LO}êS›'?ùÉÅIŠõ/àLü±,ë%fÊBåá¼pý>øàr˜©ŽÔ¡‡:ub™8sèì³Ï>ÅÉ`²Þb‹-ʵ‰a¢Ö–íâhâlq½piÓ¿øÅæ¹Ï}ni'NŠò±Ž‘ÿ·¿ým³çž{6Gydq>á!ƒ>õzÅ+^Q,œ½×½îuÍïxdž{­®WL[eE~´_€Ë?½#; ½C>,ƒÜðõª òa@PÖøþð‡ƒ4!Ê×iuà×Ö‡?üáæSŸúTy[â¾÷½ï”ò˜™°Y‰3Щ_"ÕäcˆõÑ&ùÆ•gr¦-¼pãßxÊ>6þÓŸþô’ÇjR}&a$m~ùË_.g.,ÁúiO{Zqp>ñ‰O”ò°i`"ÆQxÁ ^PVá–É$ñ²—½¬¬VÙa°þ¬júЇ6W¾ò•›c=¶Lê\ òq:p¦à[Žv¬|¯iÞ@a;î¸ãŠÓyœ ÞàT=õƒ‡«äÇ?þñÍgœQ&v®…y8;8K8t1¯Œ˜“oœ¼·¿ýíeÒÅbgŠ€=&\°x÷»ß]vb¿SvJèàb <&ÈW¾ò•åñÎG´¯\´/Š,?NÎm‚˜¿öµ¯mÞö¶·•×r¹–tŸ÷¼ç5çŸ~qÄ|%=vwhmb—ì W¸ÂTÝè/8`ì ½÷½ïm6ß|óR$;GuTÑ¡ï{ßû ?ö%mCy]ø±}lÙYឺҕ®4…5NáÿøÇ²ƒ†ÛBߢÔûóŸÿüT(O<3øÆÉ'/ÃxÈ…ñâ¿è­s£sÓû³Á¦(H×qx <¬†—.]ZÊX[}í3Ѳ…Îd@ˆö™Œ7Úh£©-éX—( ß`¹u#ßrÐá@æ;ßùÎâ$Ö>< ÉÄõ™hq$ÐcÂöÙ^f%Ì*‘íôh‹òqF^üâ'C[ð™ x}]Ïú3Yâ˜`“Ç1±<!ŸïV,9‚å¨Iˆ¶qý”‡ÏuàQ uP|^9e'ƒVÆð,ëî;48ò£~GŸW™qšöÞ{oÌ—@“Ü«_ýêòH G.êS7ï°‹¬?”áñ½¶ï£ÎdÉ“×>:PBÔ' ŸÝ"Ú¹ï¾ûN•cyœËá1u¿ð §ôi?ãp}\¥-C1‰ƒ;8Ú‡2‰sðôˆ#Ž(¬÷»LØâ‘;TêÕug÷ƒ ç„~›.ÖÞ<¢¯ðhÉ:AÙ½{æ3ŸÙüâ¿(;B¨_Ç­‡u…fé(Œ÷ÁXõæ—zÓ›ŽP䳩¤ZFÙ6}óžð„'Lt¬õyvʳT¶µë<Ê´ (ù†È'NhÓ‡Ï ‹Ýòk¶€Ya3P³%n¹üàËÊ0>sŽú È|hŠgèÑ>öxÄb9‘2ÁÑV&Pù”É šmiväGʤyÛÛÞ–¢W«?"[èÊIÑÇiÁ™¢¿È‡"¯æk_Y&På£}xìð vº”Áùzó›ß\Χȓ¢¿ÓN;Aʹù8›8a8Kœñ¨1Bîÿ÷Ë#ˆØÿJAÈçqúô7ú%;–/Å™åQCì[æÑ·8SÁ#’6ûȺò,§åŸÞÈG½C>,ƒ´š¸Û‘q;1ò‹ÏÉãÊmmõ-‡Ž”í•yÀá=¶»9<Æ@ëf½ÕƒFžqëE~ÔWž„–Ý&s½ë]¯”Kx$ÀÁ9Î008³Í\ÛÑÏý©;eúC–/%j»(OüÑ.ƒ<»æ3áqè’•¾uT'R&òFsò,*ߺÕuÐ>çÌ:ȧí×¹Îu¦úH´­-b¢ÃO~þìP°kÃêÛ¶iÏòïp‡;”gè±þV´l(ý…|œ±à|»+¬¬­öÑWǺÆÄÒÑ>iœTÖ|ñÃä±(´ƒSÉ9’Ø^v&ÀŽÇ ñÃWÖ>ëk9Ú€±vZÔç%g2p¸(ƒ3æ©Oy®Å©âä°[îœ+ÚŠœí-(+¶'ÖMh´ù=é(ŒãA[¨onÓRÁ‰égg`fŠŸÅ2”Ó1nùPV­l‘:ù2a±òeÐV¯ÎÄ£ló»âLè1/ÊÃgåM`Òæ¾g3Þô¦75üf `T—ÇÀ\ó(CÔ8“ ­i‚ü’|e¢¬qi[Ìk£´ÝsÁì´(m5Xé®8®|”å¢|äÇ8o0ñÒ_üÚ"“$;+ìÊDÙ™Ê+‚+ÿD9XNÇ1Ð4]…~ô£eŠC²¤ ´GŠÇØÑ–}© ‡¢8ñGYÒ1Ž³Ê¤3…3Á#(ۨ׻޵ùЇ>ÔðÕI‹ñÃ&o¬à<ø¹êÚFŽö-?éxHGa¼ø/zëm«í "® "Ÿ4 ‘ÿ1à åŠÀÄõ9-ÎÁ@ÅŠ Yž{ómð‚WÂ(›˜à5ʰmÉCŽöÚÚë…žòœÜåD9ÊcË—Àj&Yç x~l°NQŸgÓ–m>òÚFÖ œùäá€̃Z>|õyVNˆrÄ則<øòŠÐÄójJ>‡ïÀAe´ ÿëƒ@žr…±’g½¥|[ƒÝË’šË&O>‡>yÃã" Ñ_Xs®ÀYä-õ‘Öy¦£¼Ÿ/JÈÓ¾”¼è ófo¡ðHŽ7 x<ÂΓ8måqçqÖÇ닳-Ïò¡†6ûÔ‘s=êdˆó0 å‘N|5—2Ðçåõ_+Þa7GœiàÐ&o¼¨§½™ì“ë¨lÒ~HG¡_¼gÁ€ u€øÊH‘a’|ë[ßZíx’ºKŸNnón7Ne±2ÄIÀYp€wð!ŸŸ“‰iˇÂs€•Ï<â±]æ™eUGQÎ|äY¹< æqËTßúÇ2Q®‹F=u]¥SÇX†ùR¶Ý×åË4Æ•·þä´Ÿ¶³« ¬ù‘âÆõÕ“"G™œýðúµÙgëžGL¸8jlµã$ð–o{´éÐ_xÞí[/y¤­ ´¾þœh«—:8E|÷‡V9Þà#&cÎyhÃ:FGÊ.F°|tÀ•²©Ãq¯ÊÂ3_ûPùµ¾2ägé(Œ÷ÁY­oz¨ÀøVídefy¬Ø˜8ùï˜ò¢>«4&ŽxHº¬ËdjÍõçqÌøÃâiK](«Að3X~¤Æ­£²PË4OY¨y¼iÀ69¯òùÜÝ2áƒP¬¤ múò,9>\Äã%G±Ú®íãD²’¦ÏðFÁ³¬æ – å- _ÑŒõo³¯>yÊÊc ž>Á$k>yØÀ©äÑ+zeíÓ—©—¶,Šãøž÷¼§¼'Ç™~†„¨Ï#êÁn 3´¥>T”a±3Á+œà³>8¼fÊÁXË· ê†,‡“ æC-[žiu¡m¼˜ŸñÑ"ŽÂhñ|éÜàñ&ƒ|xþ"O]>ÕË@ÏóYœTñѶåüì÷Ûo¿òcõÅÇp´C<_æµ@=0ñ2`18³Êd¥Ã$͉lVS<`’RŸ hÝŒ{Qc]•‰<ë8´Ûn»Wp Â<'æƒ<´C‡ƒfÑ~¬Ÿu Ÿ %ëÊ+‰¼q@]°Å65u/§Áã£PQ}C´¯ h›}õÔ‘²•Ï65‡WùÈׇ “kÂ3qV²< 0Äú[Fäg»œ2™ Ñ;œ6ú»5´—É‹gç֗휗àÃE\+vS¨ßÂà+†Ô‹m®-Ø@×ëÛJ¾6ˆó<§„¾³B½xtÆ£¾|È7 ¨ÁòyÍÜ¡ð›8pìH±»ÄaPí7ìóãµRÚ †ô{p}y#‚okp •/(zÂ6X_íCq¨øâ'Øpö@Ypæm>Š…SBýÀÜžýìg—ó±\õkžuW¾4,ÿŒ<£0؇c”›ßãòÚh|Þi>+v ø@“+ƒG”ã ƒ=«R¶:£-¶ôY¢ËA0õÐá#g 8E~È!‡”•%ÛÛñ9-eÅu2mý"µ|å |ˆ†;á¬0 ˜Èà3!Xoõ¡´• ±¢÷«y袇“ã÷,Ïv·ÕϼZ–4Xð%BžAóQžh ç‹ gã„Xv,Ó8õ6ÈS¯æÇ|ò˜ y£€‰Ðo&ÀgW€ñ8€ÇK~[ƒ¼:ˆŸ|&WÎa°Ž_9$Ÿ³,8™ž7€ÇªÇ‡“keyL¢8f<³§pÀ7øR#8b[bœ2 ôYù”KŸã‡‚kÀq¥¿Óo, J[øÌ5Î2¾uà `Âǹä:ÑŸq„Ø­"pØ‘s´ '3Þ?`ÃýÖ íR†iâ<þ` žvpÈyCÇrÿý÷Gl*àðÒ·ü®ÆTFKÄ6ÕYÑ~—éÑ"ð?à¯ÉGk+K®ÀXm±­9Û@WdXS`Uͧdù1¨ó¼–-ZßpèÒg fÈ@Ë@¼ÓN;M³Ç û¶:µñºd9ýÍ*Š»¬NÙÅà=«xêMè*×<»ð.?ƒ>õg«7õ¥1/ÆÉ'ÔX«Çõã»üàÚiêÒSŸ²»lgˆòðê4+R>àƒ}&"_÷cÎ…óC­óŒ³+E¿Á)£ßø˜üZŸÉ”7¯‡üx\` Ó§¡ õ µ,;\´ ]vp\f ô!êEžûÀúSoú ¼¶r¸'Ñ¥orPÚ¥¾vë:Ê[b¢>åÓOùaì|4êÖqõk~LÓ÷qÙÕÐnÌÏxÓxÐÁ†ý÷ÛwÎàHGaΠ̂D : nã;xÎf0 œ(××^íÒ‰ü6=yQ®+®lU‡Á˜=á(°”ߦyQ®+åëx—Nä×:1åºâQ¾ŽwéD~­Ãã$¶³Ùg"oë3ì®|pâË€¬”}Þ]—C:Ú銷éÉëÒ‰|eÛh”늷éÉëÒ‰|eÛh”늷éÉëÒ‰|eÛh”늷éÉëÒaG"Qj§£pòÑC;ÖÉ#Üâ”R¬q¨É!ò«³õ­³í´-¶M>r‹±ý´É6‹EÝNøœàÿZp0Ž`.b„>>âÛý¬–-3ñ[Ü÷OÝè+úE …~ñ¤5rvB¼ñìá+© ù QŸzbýûÄŸgäü[gžsóÈG œM`Þja«œS÷ö)Ç~cºÏú§ýI‡%â0 ü½Ÿ’ö‡@: ýa=HKNŽuãLPÈ3.•Ó± ø1ϸt>ésgª3ÕÍ<é|ªÄÝ8õ¬ëj»dä+צϗy‹ƒÃxü[kv8‹Á[Tå•Q^ŽÊ~]§˜žMý£|]ÇÔ_…@¸IÛúÈ*íŒõ@: }#>0{ñÆ·éò\m˜6ÚÆ3ß¼… “ÀÇ¢b›RýÅ<ÒQןÿÀ€£À£ˆt>Âõõ6>jü°£ mFjÞBÅ/¶%ãý ŽB?8ÖŠƒR`¦*ÊuÅSòG¶]˜EþBÂï_Ôí\Hõ¸Ïú¯_ÿǤý!ŽBXÒR=ÈB¯ äTëú«¯ÕØÄtâ—ýg1Þ?±g¼ÒQèçÁZa²rŠ@ÄäËqÓò"%/õ'(q/q1m~¤‰_öû‰ýÂþ"ß´ù‘Ž«ÿ`7Cÿ¤£Ð?惲Èàâ¯nxê€Õ&§ŒòEi¥žy©¿Ê‘¨q£šošø%~]ý¤‹ßgÿ¡úA …~p¬•øú xM@œŒä“V'ò”—g:õ''3qIü²ÿ,æûÇû>i¿¤£Ð/Þƒ³W±ñm|”5®NNýÕ1‚Oü&¨ñÈþ³°ûý:i?¤£Ð΃µROZ Ð5pÈ¥°ÈKýÄ/ûO·#ïï¡È[è÷mJÚ/é(ô‹÷ ­Å*Æ´f¥–IýUo<ÔØ´áXË$~‰Ÿý¤îò#­eÆÝbÝ2Þé(ô‡õ -ùì¼­ñ :üŒºB˜j™ÔOü²ÿ ÷þ©ÇƒLtF‡í KfòççÁ*ÀpÒ¯ƒ(A«åë´²©ÿßVg«Æ«N'~“dÿYXý‡«V!ö夣A …Ñà:èRuøWÁ'(A!͹Hc<ðc ]˶ñÔIýÄϾmë+mÍ&‰@"$ tÂUÊ:&‰@"$cB …1ŸfD H…€@: á*eD H1!ŽÂ˜€O³‰@"$‰ÀB@ ……p•²Ž‰@"$‰À˜È. øÅn¶í_ó.ö6gûD`tøEFéè,eÉ5é(ÔˆdzNÀQà÷ßÿþwŠÎIÁYH" ?Ÿ_|Ï¥OGa<¸/j«8üø‘þÿxÿ™ ÎCÛŠ òc\ äIåK#?Æëü¶cŠñ$C¤£ÐÖƒ²ÄM}饗–1íÀ%xÃã0È3ecÜüÔOü²ÿLN˜ñž0ï™7¡ß?—_~ùÔ“¤-úA …~p”(v.¾øâ†1Í åàqÐ"|Ôà"?õW­¦¿UfÝOè3†ì?«î«Årÿ,_¾¼ü7ZÇ ¯uÒÑ"ŽÂhñdéÜÄ8 —]vÙ´ÉÞA¼¦‚TóáG¶–KýIj\Ä,ñËþc_Xè÷Ž‹ ý"ŽB¿xÆ“7u=y @¸à™–ÂS·Ž“Žr1ù©?}u N†ˆ<ÓRx‰_âG? ľ@:ö“˜Žü¨ãQž8A=)¼¨cœâüÍÐé(ôƒóà¬p#{S·5Þß<ÓRù]´–3-íÒ“_Ë™–*×Ek9ÓÒ.=ùµœi©r]´–3-íÒ“_Ë™–*×Ek9ÓÒ.=ùµœi©r]´–3-íÒ“_Ë™–*×Ek9ÓÒ.=ùµœi©r]´–3-íÒ“_Ë™–*×Ek9ÓÒ.=ùµœi©r5]S~-Ÿé¹A …¹Á1Ké@`M76ù]+ƒ™ò47“ÌLy©?‰ÀLÍ”—ø%~ 0S™)o®úå$-é(ŒßÁ—ή‚Ž@×ÀßPˤ~â—ýgr‹½¾7â=ãâo±Ý?¶3i¿¤£Ð/Þƒ´V;qÀ‹qÁùÄ myq`D®M&õ'hÃ&ñ›þ¬» £ì?ó£ÿx’ö‹@: ýâ=8k¬hbpRr¥Ã L’o<ò‹ÐÄŸÔŸœÔ¿ÉûŠ4ûÏâ¾’ö‹@: ýâ=8k àqðŽºNDóSÕà߆U/ñËþ³ïŸÁ  ó¤Áé(Ì“ ±˜«Q¯~ikœÜŒKëüÔŸ¾z®ñ7iŸø%~ÑÙ®û‡ýFZçÏÇþC3ô‡@: ýa=HK 2„8E ºøÈÄUq—\?õ¿ì?«vUºî“.þB¹¨g†Ñ#ŽÂè1´W#'W8PCÍ'-O¨<©y¦#5®Lê'~ö ©}Ãt¤Æ•Éþ3þþ¯EÆûA …~p´ÛzÀ%M i©2¤k§Âã£G …Ñc…1?³Nø:Nö¶?æËC†àH<õ'W´‰ß¤³DŸ dÿY}gn1ß?“W=ÿö@: }#>0{Z±Ù5/:QÎI òˆCÿ'?ùIsþùç—ªÔõÚ|óÍ›«\å*ÍvÛm×l´ÑFSÕ­åÌGý±}æ™g6¿ùÍošÝvÛ­ÙtÓM­Î4'lŠ9‰õÿå/Yþmø®»î:…ÿÙgŸÝüâ¿hnûÛ7o¼ñß2¢¾<èÚ´ÿ‚ .hN9唿–·¼esÅ+^±³6úÑ®ñqèƒû?ÿùÏæÖ·¾õTûÏ=÷Üæ§?ýis›Ûܦ\¶zYçHÛäpªÛøQÏx›ÜBѧžúG …þ1”E& wê‰Ã›~”‹|Àšúp@ó½ï}oÆk·á†6yÈCšg?ûÙÍN;í45Ñ·úƒïW¿úÕæ¯xEóo|£¹îu¯[p¥A³Áÿï|góë_ÿº”!'œpBó¼ç=¯LäÛl³ÍÔušËëÇû¸Ç=®ùüç?ßÜüæ7×t¡ÑÎ|ï?ïÿûKÿùÎw¾3Õ†ýèGÍSŸúÔ¯~õ«?ŒÍ—þÇ5Ša]®ßl‹ÈxO¤£ÐÐC5ã$ÔÖþzà0-U§Nwñ•“vÉuñÕ“F9x[n¹esôÑGËž¢—^zió׿þµL¢ýèG›o}ë[Í1ÇÓ0yêòT¬ù¦¥]r]|õ¤µÜ®p…2!-]ºtÊ9PªžÔ<ÓPãµ|Ì‹2QÎò¤]r5ß2j~Wº‹¯]i—\_=i—ÜLü˜gê²åwÙéâ«'í’ëâ«'í’ëâ«'í’ëâ«'í’“Ÿ´?ÒQèëAZâ¦çWÆg¤K'òûÔÇÖ’%Kší·ß~ª-ÑþÎ;ï\¶àÙF~æ3ŸÙ|ðÁ »„Xçúu<ÊuÅk˜nÓyðƒÜ<èAšZaFù:^ë“&°míõ“5n9¤£\[\Ù6ª¾åBýYV›ž<õIwÅ•m£]:‘ߦ'/ÊçGè?lÖuYˆøÍ¦Î´5ÃhHGa4¸f©+p€”Â6Þ5€ÉW.êĸròLäÏ¥>6 –«øÆïsŸû4[o½uó³ŸýlªæÏF_YÚ¢yãÔ×v¬‹õƒÖà\Õ_]vëk®Ü\Ù·Ý]õ˜­}˱~5~Ú]ßúÏ'}Û”´?ÒQèëAZj`\¤  =~QÖ²"¯oýh¯«þ;ì°Cóïÿ{ZÛŽ<òÈr.€Cymõ?õÔS‹sñ˜Ç<¦@@[9Áć>ô¡ 9cG7¼á ›‡=ìaÅ)±<ñ¡âü̃÷»ßý®ùö·¿Ýìµ×^Í&›lkZþóŸ7ßýîw›ÿøÇ%ŸºÞå.wi®vµ«ÙZ^¦v¥ð‰Ÿ|òÉ͉'žØÐ6{PçûÝï~ÍU¯zUU§Ù¯õI˃^vÙeå|œqÆÍõ®w½æ÷¸GÃKmZ°º¶üìg?ÛüùÏ.‡1±Î=ïyφçÝñzþð‡?,=ò‘,xýë_/õ§LêÎuàÀjÄ4ês†|Áó*âwk\cªQ>Ö•¸m5ÎÚã?¾àÇõºÑnÔì±Çåñ‘º±¼³Î:«ùð‡?\ÚpÑE5ôûßýÔÙò»êo¾öIGYó#/Ú7Ôú¶=iäÉþ°¤% $þjiòÚø5¯K®‹?ú”M€vÙÿŸÿü§á [ÝêVÓäÞøÆ76ßüæ7;õÉ{ýë_?­ýœ‡xÛÛÞV&«{Ýë^Í—¾ô¥fÛm·-õxï{ßÛ<à(¶¬T,c»¯{Ýëšýë_Óì ÷| ¹ÿýïßPîå—_^œ‘Ã?¼Á.“2ñ§ 11 ]±bEC{qd¾üå/—³Lòï{ßûÊDÇäÔ±žÒȇG8ï¼óœ¨<°8 W¾ò•›ãŽ;®yÄ#Ñ|èCš*+–ûªW½ª´‰Cƒœ¹Öµ®UÎ’<ãÏhöÞ{ïROÛ„ŽÁ›ßüæùÝwß½9ꨣŠ#†CqÄG”²N;í´i×Uý}ìc¥mú¤ðÈ?øÁ2Ism ÊÛFøðLCÁŸëΣ¢Ï}îsål <êÀŽÕ×¾öµÕðãäît§†C“—\rI>8}OúÓ nÔIÛÚÓ¦iiÍ'y]r]ü¹ÔǤý"; ýâ=8k qB:òbšEYãQð¢|V¾ñ¾õ_óš×4Ë—/onw»ÛQim5ëd{ŠpøCý ûÛßš§=íiÍa‡ÖÜáw(åÁçµA&I&=&"p³Íä¶ààˆâŸh^ûÚ×–‰ gÅÃŽ”Éäô¤'=©L<›m¶ÙjøSŽuÕ&NŽÇÞð†fÏ=÷œº¦ú|ÙË^Ö<å)OiŽ=öز2¶ý3ÕÏyÎsVúùÈGJýG—ú¾úÕ¯nnzÓ›–|Â'?ùÉ"KØ 0ØÞ—¿üåef2†gyàŠñÖ·¾µ¬ÆÍùzô£]®0çUäá _(íbµ£Á+²ê±“ÄdÍN†6Ì‹u".~8 8´ëQzÔ~8[ð(Ý%Êâ÷‚¼ 8‘8;Ë–-›²ÏoVàrvFyqŠiíǺ¯,ü(_§ûÐÇf†þÈ…þ1”E6Þ´é:.OY¨A^­£½š*¿®úèá°=Íï?øAùgÒsEÎÄÀ„ÆŠ›Ö}âëÏŸ2êÁg%ù¾°8ð [l±E™´þò—¿”oDã‘çg0M›ÞñŽw”mòƒ:¨L€Qï OxBy=‘­þ”G=Mó¨,p`xUÔ<ò™@™¸Ù?ôÐC§t”Ƹebã7¸A³ÿþû'´y¼žÉ¤ÍîKÔç­“›Üä&¥ÈúC—|û‚GQ‡<ðæõÖ»Þõ®S6ÐEž6ýýï/,yÚÂcœ 9g;è 8z<ú€gPŸ´²PÊgçå‰O|byDdò”Cwík_»9äC¦ìpmØqá‘’ß³PïŽw¼csç;ß¹ùÊW¾RäkûÈ)[Çc;b})Ãt­Ë¥¾íHÚ¹£Ð΃µÂÀCŽy¬\\f ãÒÇ®«Ê™êǤ°ï¾û‘¶º®©}mù<°,)XQ˜$àÏ?äÀ‰³:æÙ6“0¡Í>; l£×ù±.ÚÇQ"°kó sâÛøì„0©ò!¾ßVË`r'nÚòX=³ZÿÇ?þQXÖŸI“óµE»ë| yàØÊ¯ñF‡ñücó¦7½©v(x$@°~ĵ åGûÙÝá1»æ#Îpìp x¬œ¡ÿÕ]vJ´Sç›nÃß`%6µ Dرԟ²¾ŠÈªþOúSqލ'F´IL©ŸzEyåŸoØøÃJ._»ŒöWªÂõãà%uˆö”Q<êÅŽ×0òi›ßçÀÑÙqÇË.Ë}ï{ßæ3ŸùLyÌ‚cÇ£/vô[~]øYn[ÝÚì+ožé>ôµ™´_ÒQèïÁYcðˆÁ´Ô¼˜Žqó¥æIk>é:O™˜WËÄtŒG]žÝ3aµ…ë_ÿúerâ‘«eV}>ÇŽò–-]S+Æ(kjœ2ºâ±üWžGÔ“·äI£<_DÖ<©2¦qýéO—·/Üq`²¿ímo[¾‡m¡Ã¯ÆÛòkª œã’':à§£™(gÇga6øñ˜‡7*<’à[ìüì³Ï>…wã߸¦d‡‡Œ ia~”1/Rõ¤æÅtŒ›/5OZóI×yÊ$é(ŒûAXvccX«WÓ‘¢WËÈS.–Ë%_Ù(#o]ôiO—>¶qØfæUDV†ÊB±×¥ÏA5e¬—õ—šÅ«ryÈD=qP¶®üC”gËš@Yè¨'%8¯{bý[”‰–×9‹@š€¾!òØ©0M>qíJµaZyÓRô‘5Í¡R¶ñùì3Ÿ€æÿQðš§«ìÇ?þñ¨´Úå C™ë¥üÄ^Ô³è¿ð ‰N•ó- ~LðœA MÐ>ñȻҕ®4•&Gœmà³×'tRq8?ÁAF®¯JF}âuÙÖKJ¹µŒ¼qèc;Cÿ¤£Ð?惲èÀ$@ÀwÀQFj~¤ãÔ·^RëEÚz¹rã»8 Q6NìèÈçÇj=¦KbåeHj§-_[RdŒCèˆËgûz±:åaÔ‰qVÎN²êá‰?qâdåÌŠ˜3êÇ:‡šOyòå•̉?Úª'â:9eù~N+ë'?ùÉÓʶü‹/¾¸éz‹Ãr”•ŠŸi(øx¤á†6ýx˜1æ£KÚÎ ¯g®~ô»ë\ç:åpã9çœSaò¶ ¯OúF v Ú]þÖ9ÊC¿T:ÿôŽ@¾õÐ;äÃ2Èãë $ÏÁDˆË7]óÆ­O½¬ƒu‡Z_òØÂ'ø­ÛÄsåú”½eð|ß: xÔrÔg÷†#)l”1 /Ê'È#6øñ!+Ï2 õK´~8™èȃÔõ ü7SòxÃ7pö”…òã¼»'ôGþS¥e˜å­¶ÌouðÙcmEò,“ÉŸòxí’m^Äib‡gå/yÉKÊÁº¿øÅ«µ•2bÙÖßzkK©ùêó“(Ûí|™¶±¢fKŸ7ñ h&xžåóæíC×`[´_Û1-厓<ÿüpŠ83ž|Q‘`µ!Ï4göÛo¿ò­ÎPWð£Ïð¥L°e—€×YµÏ›ìÐðq,^…äKš õsPeÇ­?›6ì4ñV“Ÿ)ævÚBÀà@‡ì8…nàY4ÎÂ)§œRžíÓÆØ~Ò¶[ª®é(C^ÔWÚ%¿Ë.»”] &q~&?þ7ïí,#ÆkûLZ¬xù„2ÎB ¼¶ø¢½¨ì¼Ä²¢L¬¿2P&¦™‚²’ä#R¯|å+Ëç‹-IìqÌø42ßq¸÷½ïÝð¯Áù`’ú؈qmF^Œó¸€]¡—¾ô¥ _|4€‡[Á”] BÔ35ŽŒÿ§’¯*ÆÀ×9¹ìD/{ñ9k¿eo‹ð ¾í±&ü´#^¦¥Ñž¼6:ný¶:%oýøŸ‰‹¿Ê•^¿²R;(°ZfĪšÕÜl]‘Af]ÃBОáój ÿ·mc·¥çCýù?¿úկʶ7Ïß}”2›kÒV^ ¤‡…qÄùh–÷Ílê6$™:¸4wÿý&?ü6mOGa.PÌ2¦!?ä=ÛÁ$Êuŧ­]:‘_©LKF¹®ø4…*Ñ¥ù•Ê´d”ëŠOS¨]:‘_©LKF¹®ø4…*Ñ¥ù•Ê´d”ëŠOS¨]:‘_©LKF¹®ø4…*Ñ¥ù•Ê´d”ëŠOS¨]:‘_©LKF¹®ø4…*Ñ¥ù•Ê´d”‹ñí·ß>…iH­ž…£VÇ99sˆÛ8 RŠ6î5 ùÆÕIýÄϾ`ßÈþ3¬ûDZ"i¤£ÐÖƒµä@ÎOˆŽƒƒ>|å"Õq ?õ?úAöŸUŽ÷ïú@†~HG¡_¼gÍɽn8΀yÆ¥òb:–?æ—¦þ$¦Äoà±1.Íþ3¿ûϪ+™±>HG¡”l#¼Â ÏÝÓæCÛxæ›—ú“iÄC|¿ì?m}ÂþaÞB½lGÒþHG¡?¬iÉA)6~¦*ÊuÅS¿ÛAèÂ,ò¿Äû²íÞŒý¤+>îþÓU¯ätF‡m–<@Û`ÔÆk 9¥:¤þªÃk561øeÿYŒ÷OìãïtúÁy°V˜¬œ°"1ùðbÜ´¼HÉKýI'J\ÄK\L›iâ—ýÇ~b¿°¿È7m~¤ãê?ØÍÐ?é(ôù ,2¸ø«ÞƇG€:`µÉ)£|QZ©g^ê¯r$jœÄ¨æ›†&~‰_W?éâ÷Ù¨C†~HG¡œk%¾¾õ[NFòI«y(ÏtêONfâ’øeÿYÌ÷÷}Ò~HG¡_¼g-®0bãÛ&ø(k\:ú«;b5žøM"Pã‘ýga÷ûuÒ~HG¡œk¥ž´ kà8K#`‘—ú‰_öŸnG0Þ+ÞC‘·ÐïÛ”´_ÒQèïAZ‹UŒ;hÍJ-“ú«Þx¨±iñ–Iü?ûIÝ7äGZËŒ»ÿĺe¼?ÒQèëAZòÙy[ãtø1u…80Õ2©ŸøeÿîýS™é(ŒÛA—ÌäÏσU€á¤_;Q&‚VË×ieSòo‰‡´Æ«N+—ø%~õ=IߨûKWÿÁn[}­OÒ¹G …¹Çtð%ró[ºt²{9À i~ÈDãq €éZ¶§Nê'~öh[_iã©“ýgþôŸ%K–xY’öˆ@: =‚=$Sl°A³ñÆ7›o¾ysÎ9ç4^xa³|ùò!AmMõD`à 7l6ÝtÓf«­¶j¶Ûn»G!."Ö³øTŸ%é(̨[;ØMØd“Mš-·Ü²ì,\rÉ%Íå—_¾v…¤t" ,:pX„¤³Ðo·HG¡_¼a›˜G8tÅŠ«}li`d#D`À)ÐYÀaÐQXçSqHGa`K¥™ÐQ€r£/[¶lê¹ðLz™—$‰@D€1Äq‡!w":ýÅÓQèëÁXâÆ&pSo´ÑFÅIL㳡‰@"0t_Fb$ mE …VX’¹¾xS¯o9©Ÿ$‰@"0^6¯ù´ž$‰@"$ótæóÕɺ%‰@"$cF …1_€4Ÿ$‰@"ÌgÒQ˜ÏW'ë–$‰@"ŒtÆ|Ò|"$‰@"0ŸHGa>_¬["$‰@"0fÒQóHó‰@"$‰À|F …ù|u²n‰@"$‰À˜HGaÌ Í'‰@"$ótæóÕɺ%‰@"$cF ?á<æ °XÍÿßÿýßÔ?‚2¾XÛšíJÑ"Àÿ!ä?…-Î]¥çŽB2É_gp þûßÿ6Ë—//4: ÄÛBäǸ²ò¤ò¥‘ãu~[2‘ã©?‰€˜HÅEù1^ç·å!ù1žú“ˆ‰T\¤‘ãu~[2‘ãóEÿòË//c‰Ôz%íÜQèçAYa á†¾ôÒK›M6Ù¤ Bü“( œBäG¦-.½ÔOü²ÿ óþY±bEù´\ÿ ý!ŽBXÆ“=7ôE]Ôl¼ñÆeâwr„8é“F>:ð‘Ÿú“θ$~«œÎºŸÐg ÙVÝW‹åþa—réÒ¥ùÂNÞMG¡' ‡d†Gá’K.™6Ù;ˆ×Tlj¾"|ãÈÖr©?‰@‹˜%~Ùì ýþÁQ`ñ‘¡_ÒQèïÁXcƒ³PO^.x¦¥ðԭ㤣\LG~êO_]ƒ“!âÏ´^â—øÑ±/Žý$¦#?êÄx”'NPO /ê瑦yÈfètúÁyV¸¹½Ákj¾ii-_§k9ÓÒZ¾N×r¦¥µ|®åLKkù:]Ë™–Öòuº–3-­åët-gZZË×éZδ´–¯Óµœii-_§k9ÓÒZ¾N×r¦¥µ|®åLKkù:]Ë™–Öòuº–3-­åët-gZZË×éZδ´–¯Óµœii-Ÿéñ"ŽÂxñ_ôÖ×tã“ßµ2˜)Oàf’™)/õ'˜ £™ò¿Äfê#3åÍUÿ±œ¤£E …Ñâ;øÒy¡#Ð5pÀ7Ô2©Ÿøeÿ™Üb¯ïxÏĸxÁ[l÷íLÚ/é(ô‹÷ ­ÕŽ@ðb\pàE>qC[^‘k“IýIÚ°Iü¦?ënÃ(ûÏüè?^‡¤ý"ŽB¿xÎ+šœ”\é0(¤äü"4ñ'õ''µÄor§Å¾"Íþ³¸ïǤý"ŽB¿xÎx¼ã€®ÑÆCÇüÔ_5ø·aÕÆKü²ÿ,Æûgpè2qUÜ%×ÅOýÄ/ûϪ]•®û¤‹¿Pîê™aô¤£0zŒmÁÕHÁÉÔPóIËS*OjžéH+“ú‰Ÿ}Bjß0©qe²ÿŒ¿ÿÄk‘ñ~HG¡œm…Á¶pI¤dZª éÚ©0OݘNýî7EºpêâƒeâŸýo>ÝñžÏøèHGaôÚBœ°Ý]ˆ<À‰» NHÊÄÁ)õWÖžøeÿÚý3èuLOGaLÀŬ¾€“½íùò!8OýÉmâ7é,Ñ'ÙVß™[Ì÷ÏäUÏ¿}#ŽB߈ÌžƒVlvÍ‹N@”sˆ<â©?ýÛ‰ß*'*ö•ì?«?E\òýwc›2>ZÒQ-¾ƒ/ÝI ZÜÞô湃ù(Mú‡rHsÜqÇMePýeË–5W¹ÊUš«]íjÍž{îÙì¸ãŽÓäÕκÚOýÉï=,ü~ðƒ4oxÚ÷¾÷½Í¶Ûn»`¯ÿØ\xá… Ô~ü•¯|¥y×»ÞÕ|ò“Ÿ,ÿ–¾÷ƒƒR¼NêI‘QÞ~mzœúl°æ“öˆ@: =‚=DS .õ#5ß´´K®‹úé§7§œrJóà?X‘)zÙe—5øÃš£Ž:ªÁ¡Øk¯½Ê$1%0ѮԼ:ÝÅWNÚ%×ÅWOÚ%×ÅWOÚ%×ÅWOÚ%×ÅWOÚ%×ÅWOÚ%×ÅWOÚ%'ÿ¼óÎkN>ù䆾ŽzRåêt_9i—\_=i—\ÍÿÍo~Óüë_ÿšÚiCÿì³Ï.÷ÿ–¹ÞA¨õëôÚÚ—¾v“ŽtFñ -0èð‹«ã3Ó¥ù]úo}ë[;mþãÿh^üâ7ûØÇšk_ûÚÍ“žô¤Öb¢®x«âJf—Nä§~7§®x·öª3-ÈtéÃ7ßxa¬AgÔý×:i§«þÖUÛ sx[YêµÑ.›‘ߦ'/ÊuÅ•m£ë¢ÓVNòæÜÇ™³”¸á Ð:Î&¿ŽwéD~­cùð£\Œo¹å–Ía‡Öl±ÅÍ¿øÅ9·Of²ëÒVÿÔï?û‹˜CÇëÔŸ/×/Ö/Ö_¾”¼Ÿ/õ·ÎP㱞u¼4"ÿôŠ@î(ô ÷ðŒ98Ñrã®nà1X™6_YÒæÉƒF^Ô'Ï€n—þ†nØÜìf7k~ô£Í©}ëÿç?ÿ¹Y¾|y³ÓN;5K–,±JëÜ~¶‘Ï:ë¬fçw.NWûµAâl;ÿõ¯m®~õ«—:˜>y¿ýío›Í7ß¼œÛP§®ÔG>Ú"M»x„ÿZ׺VÃ3ce,ß²¢þßÿþ÷RΊpN»„xýÚôÉÿÛßþÖì°Ã«áG]~ýë_—óW¾ò•§òÛì˃Z_âíBÏ9çœæÜsÏ-»MK—.&«\Ôÿç?ÿYÚE]®zÕ«6Ûl³ÍT™ÈGÙZü7Þxãæ׸ƔN‰¬¬S­Ï5ûÝï~WúÀöÛo_DÁÇr¥–…'_jV¬XQðÛj«­Êù󣞲ð.¾øâƾÍ5Äé^Óõ‹ú–yë¢O]2ô‹@: ýâ=8k mÁAÃ<Ò;ƒsÓ@IDAT ò›VNZóIËsð‰<õ¤<Óe°SúˆG<¢¹ÑnԼ⯘ª‹ùè}æ3Ÿ)ÆN<ñÄ2ÀÃ;üðÛ|àÍñÇß¼ï}ïk>ô¡•‰<’'>ñ‰Í _øÂiy±\Ó´ùÛßþvóüç?¿ùüç?ßð ý5¯yMó“Ÿü‘˜0Ÿò”§4yÌcdJyÏ|æ3&·W¿úÕÍþûïßœp ¥G}ô”,NÇK_úÒæûßÿ~óŸÿü§ð™´÷¸Ç5ûì³O™øaŠÿÓŸþôÒÖ·¼å-åpÜGQž‡#Cûnq‹[”³8#êDý/|á ÍÛßþöæ÷¿ÿ=ìp.î{ßûœ™lÔý‡?üáåÐÆ—¼ä%ÍI'Ôìºë®×"8ñçüciç ˜< WºÒ•êúä'?¹¤­KsÉœøß<(õ<ôÐC§ê‰ƒ·Ç{4¯ýëËAXõ¤§vZ&\÷nyË[6/ùË››Þô¦ÓlЧ8Cóá¸yãßXÎÊœþùEu³Í6köÛo¿æÑ~ôTbýy\æõ¼ä’KŠŽÂøÀæ/xÁ”ùºMdÀ«ïÁ3Î8£à÷Ãþ°ÁY °ÃvÏxÆ3Êuˆö/¸à‚‚ý_ÌÐáºÐ—pºá«Cžñ(ßPó×Vßr’öƒ@: ýචƬ:)Ÿ‰þ/ùËæ€˜†Î“÷³žõ¬æOúSó°‡=¬Ùm·ÝŠ]þÐf—+^ñŠ¥^LfØb²ã\Çüã2!3‘‹e²ê}îsŸ[&Aœ&h&š7½éMÍýîw¿R/øLô™X˜ì©íÇÉù÷¿ÿ]œêŽÓòÑ~tª? Ã5ÀæÞ{ï]°`ò¼ãïXÊäN»+ïxÇ;šßøÆÿo}ë[efg·þ^[ ¨ñ‡<0éÞæ6·)“'mÃIxä#YÚáÎúìbP¯ë_ÿú¥Ý×»ÞõJ»õ«_0þò—¿Ül·ÝvSm£_yæ™åzâÌá<]ç:×)uÿÜç>Wœ&v2À™`ýq°ÿøÇÜ^ô¢•ÉyÓM7-Ô›ßüæruøÔAŸzFZØE{êSŸZvh7øáˆ|ç;ßiÞö¶·5§žzjy IJ(çyÏ{^¹ÖÐ;ÝéN ö¿÷½ï5ÿøÇKݨÿN»gê`Ë8úö ø¤#/¦Õ™IŸ¼ ý#ŽBÿ˜Ê¢vÐ`Pˆ9ƒñš’?“¾ò–mZŠ>%«3ÊyÀÐ: véÇr”¡L·ñ?ñ‰O4¬‘Ûzë­ËAIq&ág?ûÙe0©þ”¥ ^w‹op°­}ûÛß¾8#ùÈGÊŠ’Uzè²ÊÆ©àí·Á©+yLÚ¼"ÊAÎM6Ù¤è‘fÂá`BÿÒ—¾T&~Ë„2)°­þÙÏ~¶ló›Çd}׻޵ȳ‹Á„aö¨?;8Vþì>°+Àk‰¬nãcä¾öµ¯• ìÝï~÷´G`ÉAÔ]vÙ¥ìÞl´ÑF¥X;0ááø°Á®Äínw»),Åሿ×ðØc-;8¬ÒÉGÜÙiÁéÂá»ûÝï^l‘ÏK;pÚ˜4 w¸Ãšÿýßÿ-»3èPåñÃQ¸îu¯ÛÐ.ëÁŽ mÂIVõ<žQg…]^säð­z\cúŽ å²“a;µg¶“~ÊÎ ;_8€Ú}ÃÞ°8€ìT}ãßhîv·»•ò¸>8Q8¬ìXiÿš×¼fsÿûß¿\úâË^ö²Rb=bš¸úÖ A—'-‚ùg,äaƱÀ>£ÜäñÇÁ/òŒƒJWž2kÒ§ V`õIɃ• $+YVþ– %Ät/ê:ÂgÛžI£ÎcÀ%üâ¿(e¯©þÖã7¸Aó =hµú ¿ï¾ûGä=ïyÏ´|ì°ÃC€£ëÀJ˜ ‰(æ vX¥×yìr°š¤Ìºþ|€‰Žö±Ú·ýœc`;Ücyêc‹À*Ü|ÒÄi[õ:]æyä‘e‚vNäKï|ç;—kÌaUy5Õ>|o¾àl¬?ù”GøùÏ>Uùì=ô¡-ÎV,Y.œˆØ®h‹kCˆzÄé'ìX›y”ÁN …8?ÖŸ v²b°þò, úéOºœ1 àdÅ<âÔzÄ>àãd¢ý+\á ewÇþ„Mí×e›Žúò¤³Ñ·]IûE wúÅ{pÖ ÄYQHÛøuž2Pó¤æÕi°:à°2cåÆÖº“rêCýÕú¤ä¤ÈÅp«[ÝjjtÕD>ƒ9­gôgÓ~䙈j¤Ñg`Æéáñ„õÕ&“Ô­o}ëÕt9¯À®õÀÁr™(xœ\Õ’O|÷ÝwŸÒSž<‚ÎÛÖØ¦.;MlE³2% /µýì|˜­r¬œù™.‚XÙ²sÀj:æ·\ÚÀ‡†b¾úQNyò¸väù#À#Vü\»˜ÇÎQÔåòxˆÇ+´ ¾8Žú²½1Ï~‡“Ôã !:[ÚµŽœ£`ƒ@¹±.ðH[øµauÀ3ì>pŸà°Ò§Øí Ï#P>N–6¤Öü¢(ùÆ£žqò2Œtƃû`¬Ö7·i©@ÄtŒ›/5OùòxÖÚ8ø„'<¡ÎÁ´zœ–'¼öµ¯•µå [Ù¬ T$m¹Rxœy`÷=BÌãqç8ÿÀ¹‰¿üå/åm WªÊJѧ 1 Àózv^÷º×M2ZþÒN> ÄYêUË…g"4Ž|Œsm£¬yLʼµ€ÃƒMνüqâq í3(k:Ú©ób?12±Ï#$y5¥ÿî4á”Á¯ó°ùàÇõ˜ ?®mãüˆbx Æã:sà¨ñȃÇ,œI‰õ¶ÖÃt¤æIÍ‹é7?éxHGa¼ø/zëm«'ÍÇ€àD Ït¤ÊB "mú““++óáE¬¨ò‡4lcs V¬s´eÈ'Ïü8™hWÊÊŒ ¼:æÇº)ƒ<“vµ Óõ£LÈgç„Ç8 œõ`G‚sìò0‰r¹xýHc§æY7ùêÁÇ™ lÈ'X(N‡(C¾rðŒƒõ ?ì…uºÇ=îQÎ…sÌ1e‹77xìEåL‡7µ[SëZ*=ñǺD¹˜ùQV™¤ãA …ñà>«ÞìR€Ï/ò•EƸ4Ê™¿¶úÜ"0Ðûì—r ”¥-ÓRÞn0®L¤1^'þD^Èc>2¶KyV¦|3-UŽW'qêwÙÍåguˆ£À¶²ö¢ŒzRí!C]œ4̺ä1©¹€îW¿úÕæ•¯|eù¿>cGG}¾«`¨qQ†|ëåà%;tP)G}òÔ‰´Ö'm¾ºPìSF´e¾<ÛÏ® &qt>øÁ67¿ùÍ‹`¹P~õMC#xLÇ|œ+&uœCíXºìäà@YN,Ó8”>@YüxlÂAG5Ò8ïÂ9Þfa§‚]Šh?Ö/¶©­þèE¾åD½È³ì¤ý!‡ûÃz–¸Ád‰ûƒç`ˆGYó"O]yʨ6OYòÔg°$°ÒEŽe ŸU—ixQŸ­e‚<óᇚ–W´õ£¼ùȳjU_ó¡låóxÂ<©¶HóÓЙtä)ƒqò9­ï¹x¶¡™Ø£}u¡?ûÙÏJžÏßÑa7ïTà,ø#ê³ÅMÐÔ|ùò”¡<ÎtÕ¾]a+K™–/j¨m‘Ö®rP [âpñ¦[ïê³ç°c´a9±–o^ÅñbRæ€cÔµltpq^àÉWVjÙôvÑHÇr¤Ñ_PÚ8ÈÉ7&, &uv†xŒuï{ß»¼ ÊN´où‘GÜŸùP‚öcºæ¡›a<¤£0Ügµë¦w qe#Hò ¨¯¼²¦¡ò lÕÜ*7™ÿ(è W„VþÁðp,í+3õeò #ŽŒÁ:B¼ù&¯ðÅö«¯¬ºP½Q^|…¾ú`Á62 oO@†I)+OÊV4[Ú¾Bˆ}&0ðdR!X'(‡Ä`žõ‡2´Ý >Je>T}lò¶ uuúÊÂSŸ¸úòL“gG? M>´L(¿ø!+u¡æSŽi©e—Œ‰?¦9$ÊNÂûßÿþ)^­ö5Ï´åAáÎõ!@Ƀ²{Á÷+xý“>@Àqà£J¾ùaÙêóØçgRžå•Vþ‘WëGû³Ñef¼?ÒQèëAZb`p€80ȇç/òÔ•7}e´c¤Í㓵¶Ëµ åÃ>¬Dq¢>“(º#X)<Ë‘õÉ7ÈT]yÈò|wøùŽeÂgEøœç<§<»öÍõÉ7nYèòãm¾?ÀGzø.‚ùPz¾2È$»ò–£]ðb‡€ìD=òù&Ϯٖæ»êpè]vaäQ.âñ#ð†eú+̉?ÚAWýûÜç>å­Î°‹!YVÀls­hC›>eË—F{ò ÆÕ!M ]Äù7ÎÑ>ÂÃùÎ%ðj!»O{ÚÓ¦^½‹zµ½Xå  |³ ¼¹ÁäÍG¡n{ÛÛ–˜oðIcf“Å·êrµù”Ç×ýh+A>WíuØEáÙ;“1!êóZߟà[ìH°åΤÁ¿ôæÄ?§áùZ¢:´ŸOwÜq%•,˜ó?øÖNNz<çæt?eÇ`Y‘Güï|gùvÏÊy•ó&Ôrqòø\6xµé×<ÓPãØˆ×´ùP&[¾ÞˆãÈ®_eÄáÄqáÎ N}†oAðÍ ýY¾”rg ÊñµHv‚ø&8Aßåí¾ÎÉ |¢[‡‹2cý)Dz |’2Ù9°àÌQ_œ¾ ÉG´ÔÁYá» |ÿ\±Ï{8ÔÔW'•¯íÇ6F™È¯ã±þ1o¶úQ'ãsƒÀ’ ïüUsST–’L"À„ȠêÊUøl°q ÎF'Ê`—ÕàLmi@¶Ëùš_<(ÆÄÌDÆsfVÄL>ðøt1++V×LPnmSWñ…Dë-µ¤ÉçãD3äxvÏj•-tÞ @‡-u&eâÔG†ƒiuk@òk ¾ÕÀ¡@&z&®xñ.~›“Àª•7p.8ýN`‚â¯Çá\<êQZmrÂo7pMpp8ü†ƒƒ &âœ]`ƒ¶øeA0`òßyâõ϶Àµôù¾+c&&ož™ó‰áÿ¶rà!Gy´ŸÉW=)2`ÊÛ<ß'`‹çò\s¶åyõ]ìs]p¾pØ B–]*òÁa§v*;¥ ê6‘£où³û{Þóž+dÄž~K{¹”S˹rü諴;JeóEEúΡgaØqâ< ×ݸN8{ü_ú"×\pšØðZ©'eÌ&®ž´M‡úó]îYðͰ:ß=á{…yÇ;ÜvõÌuäüÏÄE™Þ+Ö± TKD€'$]Ì›:Æ•o£Q®+Þ¦'¯K'ò•m£Q®+Þ¦'¯K'ò•Ô ÅÊÊ„¨ãQ¯ŽG¹®x­Óêà°sÁ×úò£l[<ÊuÅÛôäuéD¾²m4ÊuÅÛôäuéD¾²m4ÊuÅÛôäuéD¾²m4ÊuÅÛôäuéD¾²m4ÊuÅÛôäuéàT²CÊ詗´iz˜3(³ 6Xíà$H‘1î`5 ùÆÕYìúâ¥íãn¿õ þCï ¡ýöɤý!ŽBXÖ“Ɇ‡8)©zCÐmyãh?¸Æah׬½ÞÐlÿäÂ\ìÄ3ô‹@: ýâ=8k]77ƒ " —Ê‹éü˜g\ºPõÅËöÅöŒ³ýÖË:X¿˜óÈ›/õ·NÒ¬ÿ¾¼ŽIûA …~p¬•¶‰Bž«%Ó¤6žùæ-F}¾øÇ› ñ¤¼í–öÙþ½öÚ«< Ö&u0¾ñ¯16i¶r‡p\×?^‹Œ÷ƒ@: ýà¼7-/RòRÒ‰ñÓæGšøeÿ±ŸØ/ì/òM›é¸úv3ô@: ýc>(‹ .þꆷñá XmrÊ(_”Vê™—ú«‰'1ªù¦¡‰_â×ÕOºø}öê¡ÒQèçÁZá´¼ Ô§çÍ“OZÈ@y¦Sr2—Ä/ûÏb¾¼ï“ö‹@: ýâ=8kq…ß6ÁGYãêÔéÔ_ÝA#¨ñÄoì? »ÿد“öƒ@: ýàx’ŽtF‡í`Kæ&æ†Þd“MÊÿ,8ï¼óš /¼°Y±bE¤ L6<Hfã‹M7Ý´ÙrË-›m¶Ù¦Ùpà Ëÿ™u!)8'¤£0'0f!5Þà[o½u³lÙ²æ²Ë.k.¿üòtj 2$0Žàl¶ÙfÍæ›o^â8¹£Ð ÙH2ÒQ ¬Ã.Ô•; Üäé$ »OdëuA€±dƒ 6(Cî(¬ Šë¯“ŽÂúc˜%Tpcs@n£6*[‡o¼q‘¨ŸõVj™LD`5ÜA`\á—» «A4rF: #‡x˜¸¡ PŠ ‰lu"¬: ëSFê®é(¬~©= r0 R$HZÈñ£–^™é(ô ÷påÍ>ÜkŸ-O…ÀäþðÂnCÖ>HD HF„@: #6‹MD Hé(,†«˜mHD HF„@: #6‹MD Hé(,†«˜mHD HF„@: #6‹MD Hé(,†«˜mHD HF„@: #6‹MD Hé(,†«˜mHD HF„@~™qDÀ½Øøÿb|è¸dûD`íðÇäÿ}X{ìæB#…¹@1˘†Žÿ=’-í§›áŸ&Ü’h“m㵨V›l/õÛhê׮ݔV_ëÔÏþ_÷‰µé?+V¬(ã‡ÿ=RÇ¡«ŒäÏ-é(Ì-žYÚL 8 —]vYÿ˜v’€¤ 1nžü¨'Ohä7O~êONN1‚Š“qóäG=yʨƒŒqó”MýÄß¾ µØgÖ¶ÿ,_¾¼Ùpà QÏÐ#é(ôöPLq󳏸â‹ËMÍ ã`ˆƒ<ä㤢\ä§~âg¿Èþ³ÊÁÚýƒ£°téÒ©ñÂ>‘t´¤£0Z|[:ŽÂ%—\Òl±ÅSè ÄI_^í0à”MýUNƒ˜$~«œMúGöŸÅyÿà(l´ÑFÍ’%K’ö€@: =€<4LZ ÖÿùϦv Ä€<¹~œìÈsÒ#NP'ÆS?ñËþ3é0éþáÜS†þHG¡Ìa‘Á‹n„8ÁE¾y‘ç y©¿j‚Œ¸$~«QÔì?«Î­ˆÉB½èßúG …þ1”E$%i @ä;¨GžqiêOG â’ø­¾RétôVwZ‘‹²Æ¥©?ˆË8úßôÚdj¤£0 T³Ì)â 2Ål‰ ç c¶<Ó3Qe£=y3é™§lê¯Ú©1š‰*›ø%~öû„陨²ëÚf*;óÖtÖÃ,a¼ñfZÅEÙÔŸœx"&]¶aÕÆKývÚ°jãµk¯Ú™@§—úsÛŵë$4¤£0\³Ô•0P:pÆA“lwâÍ_Ë"Wó,'õW={'BU/ñ›œ¼²ÿ,¼þÇŠÒáóO/¤£Ð ÌÃ5Âá)nnQ„´¨(CÚI,ÆS~_ü⛳Ï>[è¦èÒ¥K›vØ¡ÙqÇ›wÞ¹ü+^±\ü¾þõ¯7ükß=öØcÊÖé§ŸÞwÜqÍcûØfÙ²eåÚbƒ Í'9~衇6'Ÿ|r³ýöÛ7‡rH‘çOŸ×ÿâ‹/nŽ<òÈf—]vivÛm·R‡6ûïz×»šc=¶ùÔ§>µZÿ=óÌ3›ã?¾9õÔSËyüÿÛ;xߦòÿ¯pÝ‹kÈQ×hD(B†T¦”2”L‘LQÈÜ€&B"³$¢!TD“øQ‰ %C!Ã¥ÿÿ¼×¹Ÿï}κ{Ÿ{ιçìï÷ÜýY¯×÷Tù9Ò÷ÇúÓÏÓf°£Ð έµÂà¦ÁRƒ `ĸ@ÉEdÅ:1Þ&}ðXzé¥Ó 7ÜÐÁí?ÿùÏô‹_ü"¯Ü÷Úk/Ø žxÄ,Æg†ºZukBO׊òtÄC†@šøæ›ož…~n™ÊŸ™>r±Î1NùÃÕ§<µ¥Ôä‘GÒo~ó›´ï¾û溫=‡zh:ûì³Ó†n˜Ž?þø´ÐB QLØòÉ'Ó!‡’>õ©O¥_þò—é _øBíÎάֿ­úÂÛ´Y¼Ó,Þ­³Æ K€ÆYƒoÌO:ʵ~ÿ篅‡p‚2q,±ÄiË-·Lçw^ZtÑEÓç?ÿù“÷HðÃQ_4]—½ìe9.åAg¦/ ˜UýX†âÑþu×]—w xŒ :^zé¥ÙIØi§Ò7¾ñì$(Ou›gžyò#vØ‘øö·¿ÝÑ—Œì‘.õÅ_²¢ÉÆ<ñfw}ÚìÐ,ÞQhïÖYÓॆk+©ò¡u:Ê«¢ðfg}ÚHû⤡v‹.¼ðÂi£6Jçž{nú÷¿ÿX`e ˜œ`ê:t¦ñÄ–eZºªG¾äx4³|ÉÇò¢®ä•¯´dÄ/©ò%¯|¥•/>T?å‰^}õÕ 'aî¹çÎ2ÔýØcMSú5à”«yé‰î¼óÎ Ç‚G-ï~÷»Ó|óͧ¬Þ±Ìi‘²^’%[ñ’Æ2fgýØNÇ›CÀŽBsX·Ò+Lñ:0¢|©cý«Ð* …ß"‹,’³{ì±4ÿüóç8øq˜ïÌ3ÏÌ[ë·ß~{>XøêW¿:m±ÅiÕUWÍyÕ5ÒäóÄ‹õ}ñ8ÀÈ#øW^yeúÛßþ–pdöÛo?‰dzÅWä’¿ýíoÓsÏ=×9øÎw¾3é›®ÿ5×\“®¿þúÏ Ù?ýéOi=öÈ÷ú믟XùòçØ&?øàƒó!<ÉËT›³™ÄˆóSÏ<óL:ì°ÃÒÅ_œÖ^{íô–·¼%¯ä9#ð‰O|"ýð‡?Ìç´+‚ÎNÁ›Þô¦´ë®»fçà•¯|凢®>² U<Êâ<=úè£i½õÖëäßrË-y7d«­¶êð¢N§\Þ¨à ºÑNŒ—zJ—21ã’/i)Ó1^ê)]ÊÄtŒK¾¤¥LLÇx©§t)S¦%gÚvšÃº•–´ÂÑÍ®)iâ‘Pä‘®Ê/ùÒ¯8´”S~É—Žòe³”S~ÉoRÛ„ˆkiŸÕõµ×^›2JŽÉ™“øÈ~ï{ßK/yÉK:XQÞqÇ—Ž8âˆìXpX9Xð£B´%~ä).ý}öÙ'ë|÷»ßM›nºivT(GõÂî%—\’Ž>úèôŽw¼£S>ú80»í¶[â¡^§T¹¬ü?ýéO§øÃiï½÷Îu¤\ÕWr¤‰C•/e•ÏnoeLé{Ì ü{î¹'óxt"9¨Ê¥\Å¡`Œ®ÊQ¾ìGY•y¥œõAÀ¡ØQèê-³©AfWÅëxð5p ²:Ù2¹ÙQŸv2éßyçjrnçO<‘~øá¼}Ùe—%VØœ¾'€Ãù矟î¿ÿþÄ+|L`âçHߟý÷ß?¿™p '¤7¿ùÍ3äKn4ñg7ƒŒí·ß>; ØPùP^_Ä8æ˜còëŒ/ùËs>yìTð-„|ä#R¹áö;°S®ô™ì_ñŠWdà)(.ZÚgv(¨+NFÌñ:}øÃ­¿Ê‚ÎŽúDÿi; CÞ.ƒå€>â„r@“Œh̽6êƒÅC=”Ï€AVZi¥üZ‡è&OžÜ™ðØE`¢]mµÕì /|y¦Îêýî»ïN+¬°B_ÉHN» ¤õ+¯‹d•Ë€GàÌ“(nŠr* J;Øuà-ÞšPúäI/òE&ÆÑ•žâäsð“oDì¾ûîäüñŒ¥vAàÐ!ÄòIËgCØùà\ˆ®…ò$­Ó—l̯­ú´Û¡yì(4y«,2È駆Çx J‹’G¼LkÀŒ|ÉFªx”#>žõyõñä“O¦iV«œG€?qâÄÚF{ï½÷ÞĹâuí×ë‹È.¿üòò‘—s™ÓþTñáD«âä?v¨/_“”|I™`yíYåe}p|ÊzIFTö•-ù¤ù6'×\sͶØàkŒÒ…¥ÿ Ã9XÆzUŸ:—m¥‡b?+φúj—isØQhëVZŠ«07 ˜qà‹|ÅE¸×¶ëƒ¯íñ¦‚‚ðQZ˜ +^ï〮xUø/¶Øb¹Q$K<â/]ò#9]7Qñ •‰o@ðÉÈ—ž(yÈ<ðÀ9tqŽâ*]åJO%âe=I—:œëàK‹8/åãÈÜzë­xè+”¶Ðƒ÷׿þ5Mé;ë@¨²Ÿ3úþÔéË~]ýÛ¨¯6›6‹€?¸Ô,Þ­³Æ©ŸâP´ä•×V}µ[tføñ‰a¶Áùâà`ø“O`g"–YÚÉBÓþ ÷ZEû8.80Ñ–ò#œñ0Íÿ¶ Õ~”ËŠÓþD>¯\®»îº3”¹ÜrËåÇ<’Qý „¨óplØAW|Õ_éÁôKÙ*;mÔ§ÍÍ#`G¡yÌ[e±j€Ó@9”ÁÐú)už:\ê0]¶ïEÝwß}I«JÿÏþs.žU°®Q´'”ÓŠ×Ù¯’LJ0ùÖCþÓO?·ýcd¿Î–Êr¹âÓþD>‡C9 *GAºÐm¶Ù&?’8å”S:õ„õ%/Þé§Ÿžó9÷!ždD«øCåÍ̾lÔÉÕñ{Ý~¼~Ž7‡€…æ°n¥¥8`9>}we¤X¨ WŸ)ñº!ÛýuºüÃ#>†Ä3yÉ`OñHëøQ&Æ«äykÀ¢lŒó…CòH@ü¬Ô÷GéáRôKÞv`‡#îH†×%ùð*ïºë®t%'ŠCÆ[&|"¾©¡|ӑߺö¦Í"`G¡Y¼[g­nPÔÊETreZü’JNTùeZü’JNTùeZü’JNTùeZü’JNTùeZ|Qu ɉ*¿L‹Ï‡‰x¦Ï×ùÈ‘äD™ùGF|“€G҃ʴxÒW~™?ÊAŽW87Ùd“tÚi§u¾7õ™pùwÏ.äcL*+Ò(¿LGYÅU÷(Ïc‡uÖY§VŸU-¸à‚i‡vȇeGTeóo´·Ûn»Œ¡^ÝT^¤ÒU^™¿¤’U~™¿¤’U~™¿¤’U~™¿¤’U~™_TýÈ´Y|˜±Y¼[gŸÃX ÜðJ'ˆF™È—¼xJKO´-úuí¬ãƒ“ÿ§€¯/ò¶ÝvÛ´òÊ+çmýo¼1¯€™´ù§RÂST¸‹Š_ÒÁìK7öôùÔ1‚bråãJì|P_^Sdûž7øBc•­*žìDªþû ÒçñöxM“ ¾(úœÛ¸à‚ ò§§ùÕ`E]9TŠcÅ—$ùñÊ'¯–òŸ#—Zj©l/Ú§L¥U¾hY/ñ%¯º)­|Ñ6諦Í"`G¡Y¼[i­È4X3à‘' 8Šk0„gý~‡ ,˜|&MšÔ™€†ƒßÆoœV\qÅtÔQG¥#<2ñüœ9¿Àg”·Þz뜎“9ÛñüS£x H/³Ì2d•_wý¦ôGÀY!ÄëÏÿ¤à‘ÇI'”Î:ë¬Î™˜7Ø`ƒü!¨Ò>åP6‡Ó~ló¶uçµEéßtÓMdå<‰WÕÿ¨»œUàßf_uÕUù±º¼V ¶;î¸cþú¤Þœ 2cˆíný)§íúKÇ›Aà}u`/nÆ®­ÌÆðVi>ø`ç;ÿ4W“HU^9h‹ÁúýŽ˜”XÀ~Èó$gø÷È„áèϪý:}>zDÿÑ?µÊ›ö§ÔÑП0Òúö³ŸÍo(œzê©pf¶CJû¼vúÇ?þ1Û弉e:ŠÓ"1¯Œ#2ÒúSV[ôq\qÙÅÑ? Ë÷ŸG}BŽràÀ¼ÖAÄ; #Í*CG jðÓ¯<­Tªø¤—Žx¢ ’ÖŸ¾q‰ñ?p[rÉ%óÄÖKø1 TÕµäŶÍjýÙàQŒl@›|%Çî_ÂT:Ò¡èËάֿmú\{‡f°£Ð,Þ­´Æ@VNèqP-A!OùÒ•¬òEŇZßø©_¨ßˆªŸ(Ê¿©V¿U¾ôD«ôÅE×úýÕÂM4bD\8‰/žøÒrŽ7‡€…æ°n¥%­vtãÏ „RNiQëŽ@‰“Ò¢ƒkÏ8pKOÔúƒ#P⤴èàÚÆ¿ÄIiÑ™áçü±AÀŽÂØàêR§!àÜ]Á#0¾°£0¾¯_Ï×^¨(N[ˆ1Džâ¢¥N䫌ÈS\Ôú1¸¿~"&Š‹ºÿô^ÿQ¿5m; ÍâÝJk ¼ 1^ÅS>”Ž…xÈǸõûˆ˜(ågüÜÔ'f‡ûG÷¼i³ØQhïÖY+'¬8qiwAàĸÒâEJžõ¾'¼„‹Ò7ã?ÝqNÂGx‰¯´ò#%OrâK^|¥•©õG†¸94€…æ1o•EGýʆWñá p«ä$#ù¬4MOyÖŸîH”8 £’¯4Ôø¿º~RÇo²ÿP‡f°£Ð έµÏ(‚Þ‚ šŒÄ'-È“¼xJ[¿2.ÆÏýgv¾tß›6‹€…fñnµ¸Âˆ/'ø˜‡ŽôÄ/ÓÖè '¨ñsÿ)ï—2=ÞïŸØß{ì(Œ=Æ­¶PNZ Pu<€"O2.rÊ«âYßø¹ÿÌÞ÷ÆÓf°£Ð,Þ­´'õ¯šô¨JFÀUåEžõ_ìêcî?ýTay½~ÿè:š6‹€…fñn5=;/Îà¤AZÊALrÖ7~î?ý»sm¼4˜6ƒ€…fpn­•r¢× Ê HÖïwŒŸûîÑ6Ü?Ci£eF; £©Kœ†€V|% lšð#EN:3[%E=éXßø©/¸ÿ ¾K7žïŸrÿËiÚáÐvšÃº5– ØMxê©§Ò¤I“² Áâ Eù8¨Á#D¾õ§?º1~ý;Sý½d`?¡Ï(¸ÿL¿¯f—ûgêÔ©i®¹æÊÎ÷C3ØQhçVYa€ÆQ`G!ÖÄK*pJ¾&DøŠ#[ÊY¿afüÜÔÆûýƒ£ÀâáYì(4‹wk¬19qS—“—ˆ<¥EáI·Œ“Žr1ùÖ¸º'…ˆ<¥Eá?ãG? ľ@:ö“˜Žü¨ãQž8Az¢ð¢ŽâìŒ燬C3ØQhçÖYáFÖM]ÕxÝøÊSZTü:ZÊ)-Z§'~)§´¨äêh)§´hžø¥œÒ¢’«£¥œÒ¢uzâ—rJ‹J®Ž–rJ‹Öé‰_Ê)-*¹:ZÊ)-Z§'~)§´¨äêh)§´hžø¥œÒ¢’«£¥œÒ¢uzâ—rJ‹J®Ž–rJ‹Öé‰_Ê)-*¹’Î,¿”wzt°£0:8º”fvc“_·2,Oæ“,Ïúý †Ñ`yÆÏøÀ`}d°¼Ñê?*Çtl°£0¶ø¶¾tväÔ ðJë?÷Ÿþ-öòÞˆ÷LŒ /x³Ûý£vš6‹€…fñn¥µÒˆ^Œ x‘O\¡*/ŒÈUÉX¿*lŒßÀgÝU¹ÿôFÿÑu0m; ÍâÝ:k¬hbФ¤•ƒ2A”|Å#? õý±~ÿ¤füúwZÔWDÝfïûGã€i³ØQhïÖYcƒwÐåDTñÐQ¾õ§þUXUñŒŸûÏìxÿ´ní‘ÛQè‘ 1;W£\ýÒÖ8¹).Zæ[àê¹ÄG¸‰–ùÆÏøEg»ìê7¢e~/öêèÐvšÃº•–dqŠ@Ôñ‘‰«â:¹:¾õŸûÏô]•ºû¤Ž?^îêé0öØQ{Œ[mA«‘ƒ“V8P…’OZ<É@ÅUžÒ‘*.ë?õ Qõ ¥#U\2î?Ýï?ñZ8Þ všÁ¹ÕVlË—4AT)-*Ò¥S¡<鯴õëß©Ã©Ž–Æßý¯—î¿xÏ;>öØQ{Œ[m!NØÚ]ˆ<À‰» š$'ëÏø¬Ýø¹ÿ´íþiõ€Ú¥ÆÛQèðm1« _€&{µ?拇 A që÷¯h_¿³DŸ ¸ÿ̸37;ß?ýWÝ›FÀŽBÓˆ·Ìž­Øì’€(§I òˆÏŠþ3Ï<“~úÓŸ–Evk,²È"éE/zQþÍ1Ç3ÈÁ˜ûÝÔ¿óÎ;ÓC=”ÖYgíjÿÁÚÿ›ßü&=ùä“i­µÖÊõ›•ëýõ×§Å[,­´ÒJÚ:˜ýªë:ƒr£J§¶Š?+ú<òHºùæ›3 ,°@§¨ÿøÇiÙe—MË-·\æõÊõíöW]ÿ¸ÃØÄ‘1GÀŽÂ˜CÜnĠ寛^yÚAˆ|Ð4ô}ôÑô|`¦e‰%–H;í´SÚu×]Ó<óÌ“ë>ö£áØNÊV;#4Ûÿ­o}+]sÍ5éÆoÌÕˆvš°?3ü¾þõ¯§»ï¾;ýð‡?Ìõ“¼pQZVÿ}ìcé-oyKúÌg>ÓÁu8úØüHì†þ]wÝ•ûêe—]–VYe•N}vÛm·ôá8í»ï¾ êÉOõŒ¸ ¾Ú“•¦ñ‰'ý:ç]m2ì(Œ ®.u„ª).¥E¥S¦ëø’­’SÞûÞ÷¾ôÑ~T"™’÷ïÿ;1@ŸuÖYé˜cŽÉñ/}éKä”PYeºŽ/9Ñ:¹:¾ôDëäêø¥^\_ú¢uru|é‰ÖÉ ueZ§ùÄcZ¶¡%_iQÉ–é:¾äDëäêøÒ+)xˆ']hN¥l™V%_iÑ:¹:¾ôDëäêøÒ­“ß´9ì(4‡u+-qÓó‹«Å¤N'òG¢¯Á•]3”aÑEMË/¿|^²j»ä’KÒ;ìÖXc,:«ö»­O#¨ÃÌB¬g]|°2êt"¿N™(W¯Ó_åŒD¿N'òe§ŠF¹ºx•žxèð#DGA¼˜/HÉ×}Vòe¼N'òK˜Žruñ(_ÆG¢S–áôè!PývôÊwI-G€ž-ãá—ñ:È/ud~”+ãJ¦Ï ‹ƒ@¸ýöÛ{ªþ±uqµ‘üºø`í¯Ó‰ü±Ð§ü™]¿º6G>åÆ[û©ol+Þ?âþ¥ý^ÄOí7mï(4‡u+-i ¡ñŠk¥ÁNiåK–´òăFÞpõ5Sa0}5žx≎£ð׿þ5]qÅiÛm·M -´P¥þ¹çž›–^zéôÆ7¾±S×ÓO?=½úÕ¯N¯{ÝëÒ/ùË|Và·¿ým–ƒ÷îw¿;ÛÒÚ>”öÿíoKW]uUºí¶ÛÒƒ>˜Ë[wÝuÓæ›ožmG¬T&ôïÿ{> Ày…¹æš+­¼òÊiûí·O‹/¾x®‚d£þ/~ñ‹ô³Ÿý,Qïùæ›/½êU¯J›m¶YzÉK^ÒÑ)ëÿÏþ3ýèG?J·ÞzkzàÒ‹_üâô†7¼!mµÕViÎ9瀟t¡¥ý?ýéO¹+®¸bÚ`ƒ :¢u×/–í«¯¾:×a©¥–J«®ºjnki›„‡~8}ç;ßIøÃòáÏ…^8_;ða*bò¯ý+]xá…εp¾â†nH÷Þ{ozÙË^–6ÜpÃÄõ ¨ü¨ÏEt¨#ׄº½þõ¯Oë­·^G^ºÒWZ¶ÿÿøGºòÊ+Ó¯ýëö¯xÅ+2Þ`&ýhÿé§ŸNçœsNºå–[rÿaG늓Lÿ޲Uú¥}êD@–ßXè÷[ðß&ðŽB“h·Ð‰~< %t¿”­“«ãG}]ÉBc<Ê2!xì ú1a}ôÑy¯ÔÿÊW¾’kñ‘;þøã³sÀá:H2©393)rÈ!i÷ÝwÏ'þ£ý¨m‰Ýu×¥·¾õ­‰3 øË,³LžL9äÆþŸÿü§ƒ3ú èmºé¦yò|éK_šæwÞtæ™gfçâw¿û]§­²3uêÔtä‘GæÉ•ÃØÁ¹àÇÛÞö¶ì¨~±þ?ÿùϳN8!· =ô?þñçzs°²SgÂÞf›mÒ¥—^š^óš×täe3êË>m%îï}ï{óÄͤ &‡~x>¨úØcÍ`ŸúñÖmãMœ¸É“'§SO=5­¿þúéüãûLÌô5ìuÔQ9ŸÇW¼ÅÁØ/ùË0U}y …ëôÉO~2ýå/ÉŽ<‡Áè¹çžË—Lm>0U†xÈÜtÓM×O<1=ûì³ùÚ¯~õ«| ò ƒÊ}$Ês‡þCŸ¼ï¾û²SãóÅ/~1¿ÃNšlC¥+Û‘§¸ä%«´òK~Lו«2ÈwèÞQèî­±ÊÍ]®*"¸Ò ’U\y,ÊËiéÀW¼JŸ|…:}MœeàÄy]¨Ó‡Oˆö¿ùÍoæÕ¯g¾ð…/ìä³ÃÀ î«_ýjÚo¿ý2°úS&“Ð.»ì’'/&†I“&e[Lè]tQv>˜N:餦Œƒò¡}(}ãßHk®¹fÖÿøãç]’½öÚ+¿>ªzC9ÔyÆg¤ãŽ;.m¹å–ˆç2yÕ”IwÏ=÷L¼²‡Ó¡ëÇ$ÃQv¾öµ¯åú¡Çä÷ýï?O„¼™pÊ)§ À‚ÚãB9¼ HæŸþNrÔOu•ŽøçŸ~ÖcòçUIñ©ÛÖ[o¾ð…/äIZú¬ÀÁ†Õ7˜N˜0¡S6N ;´§JíD—°ÿþûç]!Þ,‰zàÏÄûÚ×¾6ï0©¾8,8? .¸`Þ¡Z¶ïuGÕãž{îIïÿûó*?þÈžX*·EpT6Ùd“|½pþ¨#ùô·½÷Þ;÷9ê);808(gŸ}v§/ CÝØ=ùÈG>’Oµ›²'^LGü—­²¾#ÕW9¦Í"à…fñn5  ý€ÒhH—qñ$ U¯Ô‘½’J^úlÙó®=[éüˆó»øâ‹ó k£6Ê&»Ú¢ª}l”öe÷ä“Oî<² <䨱à1[Æ¥žÒeý=öØü˜òæž{îŒ/²¼>ö®w½+;lù3ÁI—üçŸ>xàvIà³jf%Ëö·Îd Gš b‹-¶P3r™Lˆ¬FqØÕ ~èáTðƒWU?ø`Éc^]dcr–”€qVÃ8P| ˜:* #¹¨¯8r´•ëÇãÉÃå+_™íó yépýÙ™ùÄ'>ѹæÊcBçq!–Gz…VÈN;-ªôƒü`Þ±Ái…ÓN;-ï²ðH ü¤ƒ=Ò8•¬ò äé'}Õ Ê] w±{£×yU&1p€Àþ 2Ùaç#î˜Q8s—Ç'ì È6TA<Ù—-ÒŠG*ùÑÒW9¦Í à…fpn­ŽÊtÌc•Á€2X˜U}•Ϥ̯.0 žwÞyyR‰6¥/ò)§¬™Ï‡ŽxÞ­2¢mVÌÚêü2N™ ÞœЄ&;Ñþ§>õ©tùå—ç&¹x\ È×|xn®|ž_x\O|éá˜p^ƒ]~¤9ÇÁã V¯LœQGñC=4?÷çüÏÅc@† asµÕVË;-Ú1‘~”W<¶«xÎDDÅi+Ž”ÒÈã@àØpŽ!òÉ#ðèä¿ÿýo>³ÂŠ 9œBymi?g8„©ä9Çò¦7½)M™2¥SF¬?Î׉kHžhäáÌ]{íµé³Ÿýì xgå¾?Ûm·]vÞh3;œcôis´ÿæ7¿9?&¢¿VÙÌ¢~‘ÕIƲ:Ìi‘¡è—:N7ƒ€…fpn­•80g0(JCW^¤ÊUžÒPÅ•©òá1Xr.€ (ÛÝlK³še›œ•šärdšòâ«]цò¥Ãà¯|äàq8my&š˜'(räñ‡Þby1¾ä’Kæ‰9ø¢¬®±%žø”«É3 ÊÇ)aE¯çùÈ‘ëȳ|x<ÖàhY¿l¼ïô < À Ä6“Ça@® õàèĉ³nÔö#_qÊ&aÒʃ‚;ÄÅguAšÀW"qzXÙÿþ÷¿ÏçàS_ɈbKüX7ä±E[ÔNúgSV_}õö)‹Ÿô9£ ~Ìò…7uàÀ¨ôÉ‹ë„S zàÜà(°SÄY vypÐgç‡>DÀ–(y±%¿ÌËŠÓþ(OTyJCW^¤ä9t; ÝÁ½5VË›[iQÓ1® § ”/ÅIDAT|Q剖|ÒeždbÛ«¬6«#§ëY…±Âd{]AeC'/Æ•.yšð”Uˆ²1®|QòØ&Ä•oÔ‰qé‰RB)CZ¼çyùŸÿüç| _eÔQ&!…ªúI'Ú*›<b»žgíì4p–‚8%iföýQ¹1/â]ÊI¾¤8\ä܈ÚÁ¤É!JÞHÐW-K=¯”¼Ò¦êNœ¶*ñØÁ /RÅ9g@à,ÇÌÂý÷ߟEÐÅÑd×ìóŸÿ|âç)8;Ãn‡,õ)íX¦lŠ*/¦c\ù¢Ê-ù¤Ë<ɘv; Ýþ–µzQc5Ìle¢|ôˆ+̪>õQ¨ª›ìr€‘×ÝxŽ+›èI^>‡ü¢¬ê•¾ì(O6 ü”O9’!NÛðV¦¬V¢^•>ùÕ[òÒg…M€¯“-+_ÞPTåǺigAõcEÎÄeT‡*}Ê¥M4Ä9cÎ#Œƒ>8¿‚cTé«=²Ayj+q‚òJJ¶x–ÆdÉ£—¿üå6p8G2Ñ×]‚lÁWýàG[Ä…ÊA†õÐç­ñc™Ù÷Göäü]pÁù\H,YÊRà‘šôãq oxp˜•ÇY¼uÁã Ärx#'HAõPûbÙÑ®òÑ+eÄ“|,[z¢’•Œiw°£ÐÜ[cU‹h¾ Ɉ*?ÒYÕ§,‚l@ùÅr•‡£ÀªR2è!GЫkÊ“>¯¥ñŠ™ÊEGqQñf––;zÂꛃè˾d™d9,ÈV:[ê¥ äð¥ßÏ™Î#ͪöŽ;îè|ÅRv  ÒWYªÛöÚµ! }œ¾m°lßiê'þ”)S²“@š ŠÕ.€x;‚Ç’‹¶£}ø²ãâI_i(?øœ›à•UÞjÐä+9&WÎ'¨LñEÅ4ƑӭoU°[ŸŸêut˜Qºä!eÈÆ8fì¨<ÉŲc\ùȳÆsÄwø´9;iì2À+¿Á€¼qÙ_TåGZg?òÓ—]Ófð[ÍâÝ:kÜô âúÁÓ<âQVy‘']ñ$3\}ä 3ÓçU[Í*“|ÕCå+ª|ÕßaÂç98ùúE}&s^›V¬ÂÙ®§~Ȉt¡|›úiÛ\2š U>gx ”·ô •)ÕW|µQöT¶Ò¢Òƒò:,9â[±LVÛñ(—8AqÙ‚Š—úþÈ.;#œàm9œ’•>Žß ȆôÅ“ áÍ+ªÒW:Äé¯oûÛó™xO=õT~Ý“Ç,d$ËÔwÞ9;K’T™²/9Ù(õ•Že }Êqh; ÍcÞJ‹Uƒ@hÐÑ O²ÄăUžxJgiÄŽ>_¦cÀf—@úlK3 ².í#Çû÷ƒ…ÁìKO¶”†Še§ƒƒhLÄ|ŒHyj?¯øñlŸgà<‡–~ŽLû#Yh©Où|1’Õ&¯c ŠP>Uâ=|&+†7¶­ðƒä¯8"/P&G¾­ÀÛ|gAyÈÊ4ØÙà-M¬²•¼x¤Ë åIVúÔ…ëÊLÉÆ2Ø–ÿÉO~’YèD}˜‘W¥¯|ÙÇùÁùâ ’W™¤9;€ƒ¦ é‹wÞñŽwd½Î¨²ãºvØaù #¯áp†8¬Èãv"T?ò°Á·x„¦¥}•UžxJS–‚xP‚d‡«¯òL›EÀŽB³x·Îƒ ñáéyÒo4ôãP¹²ëFœ ™Àªœ4É×ù ïÂ3±°%Í;ÿ|$‡g½L”„XÿÌèûmDûäÇ<ÅU†ì‹Ïw p8­Î`Ï#êÁ{þ¼ÿÐCå¯2ùÉŽê ´(eê§zÈïäpÀ ‡€É7x‚ÇlMóM&d¤å› lD‡ÉmvÞàC>`ÊÇ¡˜°dZÚ§Ž¬À‘Å)â±€ê-õÅS9¤«xÙPßébƒ¯UòÚ"x2Q2òõDœ$¾”È·5\{ðå§,ñWš|‚ø|‘³|ÿ€×Á“U>¯Èb]>’Dˆe OP9P~<–¡¿ò¡$œ ú;$¼Õ@éÏ}îsùk“*kÆuàð(;P8&ì áí±ÇÙ‘É—vÅWÊ:‘¯y£¡Ÿ ñŸÆð…Æ!o—A ´:ÆC!>¯Œr£¡Ol­ò«+OöÈÏèûØÐOûžõs¢\òûì³OÞiàJ~ L$|ínÇwœ¡|‘©\ÉGJ}ÁFœì£Ç$Ì„ðéO:O*:ˆHÏýÙRÖëwð”ösþ¥¥}^Ÿãܶø c o¼qâ ‹¬ÈU?ôyýQõcâÓNº|W€gàñËðqj¨AeåDßÞzøÀ>w"xn®sÊTí,¯q,“<ìEgGqDžT‰#Ç·øXEp”øD6_Aä;’ª¬?Ú$‡-+ôý¡\0àCUü¯&j“3ä”­òé'ð•&?âóñæ _‡\ýõèð&ÎŽ ¿Ö^{íŒCÝ›5Q¶Œ—íW~¬¯xUtVõ«Ê4oÖxAßÅëwõf­k R¬LXms¨n¨®È 1Òд>+xVʬ<™œ9¿Ðúƒ7¯0òÕ=ê¡ÃrÃÅq(øq]Ye3iNé;xÈ9…:}œpâÛèh§Fz¢uúÊŸ-}êI}y;G*LÌ ìŠ°Rg…É?†Y±ÏÁT/âéŸlŲ‡—ýˆ7eáTÖ/Ñã•Mìs=q,øÐÒpƒìWOòCѧïà”ÊY’®étŽ<ú„œ8äÀþÏÁOÏyÌŽÂȱ³f ÑQàùhb¼F=³£\]ÜúõÔaùõÚý+XM.Q'Æ­_@Ä©.^¯müë0Ãé±£0XÏIi,?zsçÎ"<£dÂ¥8Å5@|Å¥c}ã§¾ ¾áþÓ®ûGc…isØQhëÖZÒ@ÎOˆŽƒ}ø’‹TŽùÖ7~ô÷ŸéŽwïú€C³ØQhïÖYÓä^6g@yŠ‹ŠÓ± ø1OqQë÷cñ0~Ó—ˆâ¢î?½Ý¦_IÇš@ÀŽB(·ØFxƒxÚ-PZùÐ*žò•gýþÇ4ÂCø?÷Ÿª>¡þ¡¼ñzÿ¨¦Í!`G¡9¬[iIƒRlü`T”«‹[¿ÞA¨Ã,òŸñ㾬º7c?©‹w»ÿÔÕËü±CÀŽÂØaë’û¨ŒªxU`!Ç TëO?¼VbÓÆÏýgv¼bw¼ì(4ƒsk­0YiŠ@4ˆ‰/Æ•/Rò¬ßïD á%\”V~¤ÆÏýGýDýBýE|¥•i·úvšGÀŽBó˜·Ê"ƒ‹~eëøðP XUr’‘|Vš¦§<ëOw$Jœ„QÉWjüŒ_]?©ã7Ù¨ƒC3ØQhçÖZ‰¯oBù„&#ñIK'ò xJ[¿2.ÆÏýgv¾tß›6‹€…fñnµ¸Âˆ¯šà£¬âÒ)ÓÖŸÑAFPÅ_?%î?ã»ÿ¨_›6ƒ€…fpn­•rÒb€.y€£\4yÖ7~î?õŽ`¼WtEÞx¿Ô&Óf°£Ð,Þ­´ª× 5(¥Œõ§¿ñPbS…c)cüŒŸúIÙ7Ä´”évÿ‰us¼9ì(4‡u+-éÙyUãtø1Õ…80•2Ö7~î?í½ÊñÀé±CÀŽÂØaÛê’™üùé``hÒ/ƒ(A+åË´d­ßÿ·„‡h‰W™–œñ3~å=Iß(ûK™îVÿÁnU}UÓÑGÀŽÂècÚú¹‰ùÍ5W÷Ò#`HóC&ÒüH—²U<éXßø©/@«úJO:î?½ÓæœsN]Ó°£Ð Øm25Çs¤‰'¦ùæ›/ýë_ÿJ?þxzî¹çò Ý&ÜV#`F†€Œ! /¼pZ|ñÅŽB\DŒ¬dk ; ÃEÌòCB€Ý„yæ™'ßàÄZh¡ì( IÙBFÀ´-8&Ožœ&L˜X„ØYh¶{ØQhïVXÓ Ž£@:uêTï&´â껑F`ô`ü`¡1÷Üs§I“&u…Ñ³à’†‚€…¡ d™a! GŠ÷Ï ®gÀÃ*ÈÂFÀ´'ì.x7¡;ÝÁŽBwpŸ­­rc¸©Y ”‡ÁfëÆ»qFÀŒ:S ŠºX‹€…Zhœ1+ø†žô¬kŒ€èæèª¸&FÀ#`Œ@¯!`G¡×®ˆëcŒ€0F ‡°£ÐCÃU1FÀ#ÐkØQèµ+âú#`Œ€è!ì(ôÐÅpUŒ€0FÀôvz트>FÀ#`z; =t1\#`Œ€0½†€…^»"®0FÀBÀŽB] WÅ#`Œ@¯!`G¡×®ˆëcŒ€0F ‡ð'œ{èbÌNUÑ?Úæ¶#Ð,úÿþ§PÍâ.kv„„é¨!€sð¿ÿý/=ÿüóà›]´4ù1.9ñDÅü/ó«ò‰ü·~?ÂDT¸ˆF~Œ—ùUyÈD~Œ[¿a"*\D#?ÆËüª2qU\'WÇ·¾ñsÿ™¾«RwŸÔñÇËýC=Æ; cq«-h5A`pÒ ªPòI‹'¨x¢ÊS:RÅ%c}ã§>!ª¾¡t¤ŠKÆý§ûý'^ Ç›AÀŽB38·Ú ƒm9à’&ˆ ¥E%Cºt*”'ݘ¶~ý›"u8ÕñÁÒø»ÿõÒýïyÇÇ; cq«-Ä [» ‘8qwA’dâàdýŸµ?÷Ÿ¶Ý?­P»Ôx; ]¾-f5áËÐd¯öÇ|ñ!h$nýþ­ñëw–è÷Ÿwæfçû§ÿªûoÓØQhñ–ÙÓ ›]ò¢å4 DñÑÔçŸÌðokqJªÊ-m¶}Êëfûmßø§þwé»Í 0G3fl¥­h²‡2ó#.>¸(Oqaå$3«ú7ÝtSÚ{ï½ÓÛßþöôò—¿<-»ì²i­µÖJï}ï{Óu×]7C½TÏ‘ØÿÕ¯~•<ðÀôßÿþ·ÓƧŸ~:ó~ñ‹_¨™¼Ñlÿ·¾õ­ôo|£Óž‘ÔYiÿxÓÿýÍc=–¯êÐAå¾ûïi§–N=õÔŽy£yýTÖ¬àþùç§/~ñ‹zÅú«\ÙéÅú ÿ²Ž¹AþÓ(v…»}ƸÙ„tÓGZ\’«ãG]•+¥EKþ#<’>ö±¥m¶Ù&ýüç?ÏÀ'?ùÉô–·¼%ýáH;ì°Cþ1±—ú¥í:;‘ÿÇ?þ1}ç;ßIO=õT§ýÏ=÷\æýßÿýß Ž“lBWyõÿ“Ÿü$ýèG?ÊvcY±œ:;uü¨«zŲ¯úùË_òµyüñÇàöÙgçþÛ¾W]uÕ¹^kÿÏ~ö³tÙe— ¨clCÝuªãGÝn]ÿö ½Ñb?zèë0ÛÖBƒ‹¶ I+>X££\]|¨ú<^Ø~ûíÓwÜ‘wöÛo¿T9äô•¯|%p ١8ñÄ;õ©}AŸAXA<¥#­³ùQ¾*ެ~Â|¨úQ®.^eS¼:È—lruñ*=ñêt"_²%E†ë$Ìȇ§|ââçHñ‡|é×Å •É:È P$#@c[†£ßíúWÙ/šédCØQhè¶š‰–0ˆ¼ªÁ@ƒ™äЫŠKNùeYÒ9묳²“pØa‡¥÷¿ÿý²¢þsÌ‘>ò‘¤|0¯*ßýîw§u×]WUîèÈ–hi3òe_<¨yu¸êU§/¾ä(³ŒG;ʯâ¤þC±O¹’/öU_9sJ«þJGã%–Ê“~ÓøË^·ìUûc»o?zhçÖZa°Ð˜ŸÒ€¢4ñÈ'®<ñG¢Ï#‡c=6M™2%í´ÓNʬ²¿Ûn»ÁN—_~ùYÕGuš:ujâ¼Ò訞uqÕŸ|…Áô•§r¥ÿÌ3Ï$a$C\rŠ‹Š/}¥É×ù‰(«¸Ê–u~òÉ';uR=UGÕ?Ú÷'Ö_<Ù—.üRŸ¶¢>q¥%¯2HóhJ˜Š/y¨~Ñ>¼‘ö?•G=UÕ™<Åy#Yhi¹Áô•§2FC?WÎGÀ; CÞ.ƒ UA’òHÇU¨â¥\”WZ§Ï¡Á'žx"}üãÏâ*OTeH饗Ύ; ð¢ÜÃ?œ8Äö½ï}/ýãÿÈy ,°@Úd“MÒ‡?üá´Ì2ËtäUÊ×I\åEžøQGqÉ3ñ8ä†nÈÏËÑñ‹_œØùØyçÓ¼óÎ;?•Y…?Ï×yîþÛßþ6=úè£é%/yIZe•Uòc™å–[ÕNYØ衇ò¡8Î< OÝÐyÏ{Þ“Þ÷¾÷¥‰'æv©ÎèS_ÒQß;ï¼3ˬ¼òÊY~‹-¶èà€,;Q_qµÇàä“O· o¿ýöŒéRK-•ÞùÎwæ]¢É“'Ï Ï¡ÄÓO?=]|ñÅéÈ6Ûh£òõÂyTÀŽl™Òâ)å‰ÃÿÁ~mpxg„v¾ñoÌx‚MU  _ýêW3>ÿùÏrÝ—\rÉ´ÝvÛ¥|àiÒ¤I:DýÿøÇé¼óÎK·Ýv[ú÷¿ÿZh¡|—ºÎU}ÁO¡ª\rÉ%éÜsÏÍgvÀ=t~ó›ß¤ãŽ;.Ýzë­Ù™{î¹Ó«_ýê´ûî»§7¿ùÍ*²cG éGûÄ•–œhÉ'­kŽŒâ¥œôM›EÀŽB³x·Îš5œtäÅ4š8Å£,eDù2-øŠÿùÏ&™6ÞxãL‡¢ÿŽw¼£3ÀÉ>ƒ2“2+j&f&^«¼ë®»Ò׿þõÄÛ8 ÜìWÊ‹!ÖGu&_qò™¨¨ï¹çž\‡½öÚ+ýýïOW\qE>SÁÄÎ9ç¤ &tð“ Õ_i&¯}íki½õÖKûì³Ožð™È9ôÆNþ¦›nÚ±O{qp6Ûl³<þóŸÿL7Þxc:æ˜co p®ƒë¦:3)³3sß}÷e¬öÝwßÄdÈá:â·ÜrKúô§?«4”öã í¹çž‰ Ûn»mÆ‚:0Aãô¡Nžt¡ŠãPà$ ‡“ °Î:ëä•>“8¿ÕV[--ºè¢Yïûßÿ~vPp p$„?“0“3õ`RQ ¾<òa"f—EaóÍ7O믿~¶ÍªžU·‚êHZqQÞLÁác„ÉU2`}Æg¤#<2; :¤ŠíäÚSí’ ÇõzÅ+^‘Wîì4ìºë®òdª_ÎìûCšë¥öÃgbÿõ¯¾ýío§ÕW_=‹’Ï«·¼I³Ç{¤#Ž8"}á _Èyü!ÿ€Èx¡‡s§°ÁdG>oè°cBÀ6»98 ûï¿v”àp€ï¿ÿþL?úѦŸþô§3àûâ¤íÜçìr€— ¶²cCÓÅ[,Ç9§ƒcJŸùÌg>“EvÛb™ª>1.ž(yÂo¤ú”áÐ<>£Ð<æ­²¨AH”‚ŸÒ‘L]žä†«Ï+olé(c¸ú²{ýõ×'rﲎoxÃòÄÊʼ̓]•C¾‚x¢ðK}¶€YÑ1¯¸âŠ3ÔŸÕò²}ß‚`w!êçDß•M¹8Ë/¿|Þ_”Õ8rl‰‹ÿ׿þ5Eᑯ:â8°ÝÍÛ$äØYa瀃£r¨T”Ý &¯È—¾ÊV;L’<Úa‚ö‘áûàR¶Ÿë…6* Š>«nê¦z+?7 ïÒ¢ðöy›†•÷ë^÷ºœœêC™v=pX¤Ï. ˜âhÍ5×\>ù„­·Þ:ÓX7ì°kÁã¡~ðƒ*“þ >ì2± ¾ÊTú›ßüfvp`pæÄÅK9‰âCi Î6›Úó‰êò$ñOt(úÙˆÿ4Ž€…Æ!o—A P "¢ÊSz°Ad¤ú|#ŒT_udeÊV{,GyœÀÛÝj y ’SžêSò«ÚÏDÃój&eé‹¢ÏdÃ[8Q¿´Á$¶;TÔ§ ¥^xá¼â¿æšk:“Èšk®™›Áj“sQžÕ0[ø6…øLØ .¸`>/þd‡‹gáÆ“ž¨d¤GûÙbUž(2¬n9‡Àj¾òØ^‡§rT>”s´…ëùÄKÜă¯²¡Vǜш|ÅÑk(;9Pòp4i;qà‰/ÊN AuƒÏ£&h•mH·yè£Ñ9ËõýAçïè£Î;(ì&ÁÓOå½þõ¯ÏÎr”'ÊŽ »i8^’WžÒPÅ•©òD•§4TqåEJžCwð£‡îàÞ«Üè1(-ª¼˜Žqå‹*O´ä“Žy¬¶Xé‹WÒ™é+Ÿ ™ÀÃA4&]V†¬y欙ÒéÁxQ§Œ3AppP‡âÊrg‚çóbvVì(”Ÿ!=¥ï€Û׬b™„™ Ø`Ëš ‡ça5ÖÈgJ}êK]˜¨ëŸþô§œÅY†—¾ô¥9ëãàËã k”' ¯ªýº^8pñzg$4!«hUœò 1¯Ÿ“ò¤_Ö+Ê.±ÄÙÉ£ŸHŸ|voœ{áÑub§>Eݤ¦Vûâ‰J–ö®°Â 9Yæ±{ãú#”2¤9ÿÁY3ð(‰Cº|µ”鉖|Òeždb^)Ó1uïvº‡}+,³ ÐsI¬Añ2/ò£¬Àм¡èã(pÀŒð¬t‡«]êÄùVí¬ª˜D™xë€Iœg½ ÄÊW½dK<ò㪨 ›²ýL¦/zÑ‹:õV™QŽr ¥]x²Áá?“ªx’Ï}Hs@Žöqx‘8ÎçX­^yå•ùyü)§œ’'@Dr.@çÐgç‚IÇb°À¤ÇD‰Ž‚ê)Ïßy^.9Ñ™µŸú3A²ãÁõ§ VÛÔ•çüœ ¨¼øe^É‹õ’~¬òl×ë ÉàðÊ.ù)}Îטó'ïz×»ò:èR°'^´“3ûþ ù¤q>Ø‘à\ÂüóÏŸ¯×E]”wh$/}œ6ð>gιd8ŒÉù9¬ÑŽôU^¤ä!«@a¤ú*Ç´Yì(4‹wë¬i`Õ! àó‹|É"£¸h”Sþ`ú ¶9á=}N¯3¸s6€‰’é< ‡rÚœ¶Ê¥lìs ª|xà#¸äc½à)09pê_úQn(ú*Kãp´«P¥CÄ#½½!}èñ£¼éÁ9&”-·Ü2;ì< Ëómœ¨3Ï<37^¬³âÐ*ûâå̾?´ŸùpÚÏ®‡õh Ûì84l™dŸƒŒêWÖQ<å‹Ré#Ãǹ$+¾d¡œ!¤%Í™ rÞ€GYèÄ•~ü?ÈS>heÁS˜™}ÊÅÎ[ßúÖ¬Â.Áç?ÿù|~ƒrK}vH8wÁ[6|ßWhyœDÿæâÍ ^1U(õá—õ‹<µs¤úÒ3mŸQhïÖYcÐÐ ¯AE<øÊƒŠHÊ‹¼‘è3@Î3Ï<‰3}^ÁãQzÔXI3Y±ÂÂa`AõSýÄUoQì)•}ÅU†dÈWyÊc×âÞ{ïÍg ¤/9É𨀷˜”¤_Êêä?Ûþ¥~´Oûq‚$ƒS@ÛUg'0ò–o5 Ç«™Ø%Ϊ­tÕMåHŸ4ò¡L&tÕWú1Mœò8d‡“†®~äé‡ÓBûåP+iÞ†àí‰ö)‡ íe¡iT62 ²-Î$œÈ—åýë_ÿÊßð“F> ™hÙ¥¡ñލO™••>ׂ´òTGäq0=ôÐtõÕW“ìÔ‡ëÎRz2å1Åá‡ÞÁ<΋àİC lvxÄÄ['ìÎp]u~E¶¡’W½”&/òˆë7RýlÌGÀŽBã·Ó`Õ H4€À“,qñ äE•'žÒäÏ7ß|ùÙ++#Þ9LŸ-j¶h9<Ç=&*‚NÝ—-(Ï™¢ý’7˜}•õY ³²Ó¤\êó þsŸû\âc?l-$#ÛPV­<ÃŽ“:|lÊÿ0 ›ª §íY]JFe“Ï$Ç3ìxÒþMozSž°5aaƒ }0æM >,DѾlJ=ê‚’,|ÉòEC^Aä›<*!ȱѫ”ðT&”ɘ3• U™’ÍÓþ(Ÿ<‚ÒüÓ/É—ú:§Á®dèKìèp@Uå(}ð?GúþðH‚VóѾäàñßBÁˆë¬ò¤|œœ)ŠbSy¼nÊ#4¥£>»h8Ä$¨­Q_¼*}ñ ³¢Ÿ•ý§qì(4y» 20h åq`ž~‘']ñFªÏ.Ûá<6`0Uy¢ØfeÈYBÞsg%&û:$ƇtÊú³ãÕE‚Vȱ-ª3<Ås¤ïO´ubœ‰’çù¬èXí“'=(Ï›Ù×÷”mˆÇª›Ý Ê‚'>e²"å¿iòÈÝÙYýõ³g3âCYÁƒi~¼×ϳnNØãxD;è󸂶ߙx¤'ëDG„ Ÿ78ˆ‡œd 8P8\cåézñª&2’Ç>×™ÿéAàzÉ®hÎèû£²ÐA|xœ÷`K'Mú²Å¡DÎrðZiübâË^ö²|é7’•._[äƒKõ%dÀ‰ï=€5ÿÚZz¢\õð0i¨<(ArÄáñ…E¾ó€ƒÅyx8GAÛä8K|¯€çÞ^xa~E‘8õåÇdPé‹*œi?}Šö³êe·€2øj `œ\8GÁukΗ Ï™Í Ë¤Ë$Ëk“üå1 Î+lÒz4@À §L;ëö3Éã$€)ç$˜LéW¼þf88´9®%«x“„>ÈŽN+|vO˜ôÙ‘Àqcmâûôvj¸\;yÁçb‚ðãÚ…3Sl°»AŸe—‡€kÌ_0àºÑ×égô;vÎЫ ²+Z'WÇ—žh•ç;¸6Ü“U}¨J§m¼ëo¸)7yÝuÖµ¦¿ ï¢ôï Z‘.¨í°EÉdÌ–8ƒ;]L7uŒ†S”«‹Ïª>4$nêlF~©ÓQ®.åËxNä—:1åêâQ¾Œ×éD~©ÓQ®.åËxNä—:1åêâQ¾Œ×éD~©ÓQ®.åËxNä—:1åêâQ¾Œ£CÖ+÷/9÷,Ž7ΓÌyô ™yÈû͘9BÎŒ#ä ²š¨B€UƒŒ(2ŠkÓ D^˜àKF:£©ÏêNu£\B“öÕ¶nµßö¾ºéë?°ÿƒ‡î;ÑÈëVÿ¡Í"`G¡Y¼[iM!ƒ A“s¤ð%©&nò­oüè±ßÄ ,öäH»ÿôØ <TV•œd$Ÿ•¦é)ÏúÓ‰'aTò•†?ãW×OêøMöêàÐ všÁ¹µVâëk€P¾¡ÉH|ÒÒ‰<(žÒÖïŸÌ„‹ñsÿ™ïÝ÷¦Í"`G¡Y¼[g-®0bã«&ø(«¸tÊ´õgt„Tqã×@‰‡ûÏøî?ê×¦Í `G¡œ[k¥œ´ Kàh €EžõŸûO½#ïÝC‘7ÞïµÉ´Yì(4‹w+­Å*Æ5h J)cýéo<”ØTáXÊ?ã§~Rö ñ#-eºÝbÝo; ÍaÝJKzv^Õx~ Fu!L¥ŒõŸûO{ïŸr™¦NšéÖã†#0d4ŽÌ;) ¿è¢‹æqÅNÂ!5A; £¥ ŠÌ9çœi¾ùæKÏ?ÿ|š{î¹Ó3Ï<“C”«³¨ã¸0F@à°ƒ0qâÄ„³0yòä<–À·³ ”š¡všÁ¹UV¸¹qØQ ÎMŽÃ íÝVáÆ#0b4–°CÉ‚c„ yLqVvF›•C@+njVÞI 1ç#P‡€vpô«“5l°£06¸¶¾TnhÔNB뻃0#F@DG\GŒ€…CgÅ¡  ÕÀPd-ÓNŽ<ú„ÜðCܯ¸ÕF Çè_öõx%]=#`Œ€0F ;ØQèî¶jŒ€0F`\ `Ga\\&WÒ#`Œ@w°£ÐÜmÕ#`ŒÀ¸@ÀŽÂ¸¸L®¤0FÀî `G¡;¸Ûª0FÀq€…qq™\I#`Œ€0ÝAÀŽBwp·U#`Œ€0ã; ãâ2¹’FÀ#`ºƒ€…îàn«FÀ#`ÆvÆÅer%€0FÀt; ÝÁÝV€0FÀŒ ì(Œ‹ËäJ#`Œ€èvºƒ»­#`Œ€ØQ—É•4FÀ#Ðì(tw[5FÀ#0.°£0..“+iŒ€0F ;ØQèî¶jŒ€0F`\ `Ga\\&WÒ#`Œ@w°£ÐÜmÕ#`ŒÀ¸@ÀŽÂ¸¸L®¤0FÀî `G¡;¸Ûª0FÀq€…qq™\I#`Œ€0ÝAÀŽBwp·U#`Œ€0ã; ãâ2¹’FÀ#`ºƒ€…îàn«FÀ#`ÆvÆÅer%€0FÀt; ÝÁÝV€0FÀŒ ì(Œ‹ËäJ#`Œ€èvºƒ»­#`Œ€ØQ—É•4FÀ#Ðì(tw[5FÀ#0.°£0..“+iŒ€0F ;ØQèî¶jŒ€0F`\ `Ga\\&WÒ#`Œ@w˜«;fmÕ#0#>a Ã)#`zï(ôÄep%Œ€0FÀô&/ø}¡7«æZ#`Œ€0ÝFÀ; ݾ¶oŒ€0F ‡°£ÐÃÇU3FÀ#Ðmì(tû ؾ0FÀFÀŽB_WÍ#`Œ@·°£Ðí+`ûFÀ#`z; =|q\5#`Œ€0ÝFÀŽB·¯€í#`Œ€èaì(ôðÅqÕŒ€0FÀt; ݾ¶oŒ€0F ‡øÿOÑad–ydIEND®B`‚MoarVM-2015.11/3rdparty/libuv/docs/src/stream.rst0000644000175000017500000001671012502366750020520 0ustar jnthnjnthn .. _stream: :c:type:`uv_stream_t` --- Stream handle ======================================= Stream handles provide an abstraction of a duplex communication channel. :c:type:`uv_stream_t` is an abstract type, libuv provides 3 stream implementations in the for of :c:type:`uv_tcp_t`, :c:type:`uv_pipe_t` and :c:type:`uv_tty_t`. Data types ---------- .. c:type:: uv_stream_t Stream handle type. .. c:type:: uv_connect_t Connect request type. .. c:type:: uv_shutdown_t Shutdown request type. .. c:type:: uv_write_t Write request type. .. c:type:: void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) Callback called when data was read on a stream. `nread` is > 0 if there is data available, 0 if libuv is done reading for now, or < 0 on error. The callee is responsible for stopping closing the stream when an error happens by calling :c:func:`uv_read_stop` or :c:func:`uv_close`. Trying to read from the stream again is undefined. The callee is responsible for freeing the buffer, libuv does not reuse it. The buffer may be a null buffer (where buf->base=NULL and buf->len=0) on error. .. c:type:: void (*uv_write_cb)(uv_write_t* req, int status) Callback called after data was written on a stream. `status` will be 0 in case of success, < 0 otherwise. .. c:type:: void (*uv_connect_cb)(uv_connect_t* req, int status) Callback called after a connection started by :c:func:`uv_connect` is done. `status` will be 0 in case of success, < 0 otherwise. .. c:type:: void (*uv_shutdown_cb)(uv_shutdown_t* req, int status) Callback called after s shutdown request has been completed. `status` will be 0 in case of success, < 0 otherwise. .. c:type:: void (*uv_connection_cb)(uv_stream_t* server, int status) Callback called when a stream server has received an incoming connection. The user can accept the connection by calling :c:func:`uv_accept`. `status` will de 0 in case of success, < 0 otherwise. Public members ^^^^^^^^^^^^^^ .. c:member:: size_t uv_stream_t.write_queue_size Contains the amount of queued bytes waiting to be sent. Readonly. .. c:member:: uv_stream_t* uv_connect_t.handle Pointer to the stream where this connection request is running. .. c:member:: uv_stream_t* uv_shutdown_t.handle Pointer to the stream where this shutdown request is running. .. c:member:: uv_stream_t* uv_write_t.handle Pointer to the stream where this write request is running. .. c:member:: uv_stream_t* uv_write_t.send_handle Pointer to the stream being sent using this write request.. .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb) Shutdown the outgoing (write) side of a duplex stream. It waits for pending write requests to complete. The `handle` should refer to a initialized stream. `req` should be an uninitialized shutdown request struct. The `cb` is called after shutdown is complete. .. c:function:: int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) Start listening for incoming connections. `backlog` indicates the number of connections the kernel might queue, same as ``listen(2)``. When a new incoming connection is received the :c:type:`uv_connection_cb` callback is called. .. c:function:: int uv_accept(uv_stream_t* server, uv_stream_t* client) This call is used in conjunction with :c:func:`uv_listen` to accept incoming connections. Call this function after receiving a :c:type:`uv_connection_cb` to accept the connection. Before calling this function the client handle must be initialized. < 0 return value indicates an error. When the :c:type:`uv_connection_cb` callback is called it is guaranteed that this function will complete successfully the first time. If you attempt to use it more than once, it may fail. It is suggested to only call this function once per :c:type:`uv_connection_cb` call. .. note:: `server` and `client` must be handles running on the same loop. .. c:function:: int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb) Read data from an incoming stream. The callback will be made several times until there is no more data to read or :c:func:`uv_read_stop` is called. When we've reached EOF `nread` will be set to ``UV_EOF``. When `nread` < 0, the `buf` parameter might not point to a valid buffer; in that case `buf.len` and `buf.base` are both set to 0. .. note:: `nread` might also be 0, which does *not* indicate an error or EOF, it happens when libuv requested a buffer through the alloc callback but then decided that it didn't need that buffer. .. c:function:: int uv_read_stop(uv_stream_t*) Stop reading data from the stream. The :c:type:`uv_read_cb` callback will no longer be called. .. c:function:: int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) Write data to stream. Buffers are written in order. Example: :: uv_buf_t a[] = { { .base = "1", .len = 1 }, { .base = "2", .len = 1 } }; uv_buf_t b[] = { { .base = "3", .len = 1 }, { .base = "4", .len = 1 } }; uv_write_t req1; uv_write_t req2; /* writes "1234" */ uv_write(&req1, stream, a, 2); uv_write(&req2, stream, b, 2); .. c:function:: int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) Extended write function for sending handles over a pipe. The pipe must be initialized with `ipc` == 1. .. note:: `send_handle` must be a TCP socket or pipe, which is a server or a connection (listening or connected state). Bound sockets or pipes will be assumed to be servers. .. c:function:: int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs) Same as :c:func:`uv_write`, but won't queue a write request if it can't be completed immediately. Will return either: * > 0: number of bytes written (can be less than the supplied buffer size). * < 0: negative error code (``UV_EAGAIN`` is returned if no data can be sent immediately). .. c:function:: int uv_is_readable(const uv_stream_t* handle) Returns 1 if the stream is readable, 0 otherwise. .. c:function:: int uv_is_writable(const uv_stream_t* handle) Returns 1 if the stream is writable, 0 otherwise. .. c:function:: int uv_stream_set_blocking(uv_stream_t* handle, int blocking) Enable or disable blocking mode for a stream. When blocking mode is enabled all writes complete synchronously. The interface remains unchanged otherwise, e.g. completion or failure of the operation will still be reported through a callback which is made asychronously. .. warning:: Relying too much on this API is not recommended. It is likely to change significantly in the future. Currently this only works on Windows and only for :c:type:`uv_pipe_t` handles. Also libuv currently makes no ordering guarantee when the blocking mode is changed after write requests have already been submitted. Therefore it is recommended to set the blocking mode immediately after opening or creating the stream. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/tcp.rst0000644000175000017500000000641412502366750020013 0ustar jnthnjnthn .. _tcp: :c:type:`uv_tcp_t` --- TCP handle ================================= TCP handles are used to represent both TCP streams and servers. :c:type:`uv_tcp_t` is a 'subclass' of :c:type:`uv_stream_t`. Data types ---------- .. c:type:: uv_tcp_t TCP handle type. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_stream_t` members also apply. API --- .. c:function:: int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle) Initialize the handle. .. c:function:: int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) Open an existing file descriptor or SOCKET as a TCP handle. .. note:: The user is responsible for setting the file descriptor in non-blocking mode. .. c:function:: int uv_tcp_nodelay(uv_tcp_t* handle, int enable) Enable / disable Nagle's algorithm. .. c:function:: int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) Enable / disable TCP keep-alive. `delay` is the initial delay in seconds, ignored when `enable` is zero. .. c:function:: int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) Enable / disable simultaneous asynchronous accept requests that are queued by the operating system when listening for new TCP connections. This setting is used to tune a TCP server for the desired performance. Having simultaneous accepts can significantly improve the rate of accepting connections (which is why it is enabled by default) but may lead to uneven load distribution in multi-process setups. .. c:function:: int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags) Bind the handle to an address and port. `addr` should point to an initialized ``struct sockaddr_in`` or ``struct sockaddr_in6``. When the port is already taken, you can expect to see an ``UV_EADDRINUSE`` error from either :c:func:`uv_tcp_bind`, :c:func:`uv_listen` or :c:func:`uv_tcp_connect`. That is, a successful call to this function does not guarantee that the call to :c:func:`uv_listen` or :c:func:`uv_tcp_connect` will succeed as well. `flags` con contain ``UV_TCP_IPV6ONLY``, in which case dual-stack support is disabled and only IPv6 is used. .. c:function:: int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) Get the current address to which the handle is bound. `addr` must point to a valid and big enough chunk of memory, ``struct sockaddr_storage`` is recommended for IPv4 and IPv6 support. .. c:function:: int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) Get the address of the peer connected to the handle. `addr` must point to a valid and big enough chunk of memory, ``struct sockaddr_storage`` is recommended for IPv4 and IPv6 support. .. c:function:: int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb) Establish an IPv4 or IPv6 TCP connection. Provide an initialized TCP handle and an uninitialized :c:type:`uv_connect_t`. `addr` should point to an initialized ``struct sockaddr_in`` or ``struct sockaddr_in6``. The callback is made when the connection has been established or when a connection error happened. .. seealso:: The :c:type:`uv_stream_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/threading.rst0000644000175000017500000001057112502366750021171 0ustar jnthnjnthn .. _threading: Threading and synchronization utilities ======================================= libuv provides cross-platform implementations for multiple threading and synchronization primitives. The API largely follows the pthreads API. Data types ---------- .. c:type:: uv_thread_t Thread data type. .. c:type:: void (*uv_thread_cb)(void* arg) Callback that is invoked to initialize thread execution. `arg` is the same value that was passed to :c:func:`uv_thread_create`. .. c:type:: uv_key_t Thread-local key data type. .. c:type:: uv_once_t Once-only initializer data type. .. c:type:: uv_mutex_t Mutex data type. .. c:type:: uv_rwlock_t Read-write lock data type. .. c:type:: uv_sem_t Semaphore data type. .. c:type:: uv_cond_t Condition data type. .. c:type:: uv_barrier_t Barrier data type. API --- Threads ^^^^^^^ .. c:function:: int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg) .. c:function:: uv_thread_t uv_thread_self(void) .. c:function:: int uv_thread_join(uv_thread_t *tid) .. c:function:: int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) Thread-local storage ^^^^^^^^^^^^^^^^^^^^ .. note:: The total thread-local storage size may be limited. That is, it may not be possible to create many TLS keys. .. c:function:: int uv_key_create(uv_key_t* key) .. c:function:: void uv_key_delete(uv_key_t* key) .. c:function:: void* uv_key_get(uv_key_t* key) .. c:function:: void uv_key_set(uv_key_t* key, void* value) Once-only initialization ^^^^^^^^^^^^^^^^^^^^^^^^ Runs a function once and only once. Concurrent calls to :c:func:`uv_once` with the same guard will block all callers except one (it's unspecified which one). The guard should be initialized statically with the UV_ONCE_INIT macro. .. c:function:: void uv_once(uv_once_t* guard, void (*callback)(void)) Mutex locks ^^^^^^^^^^^ Functions return 0 on success or an error code < 0 (unless the return type is void, of course). .. c:function:: int uv_mutex_init(uv_mutex_t* handle) .. c:function:: void uv_mutex_destroy(uv_mutex_t* handle) .. c:function:: void uv_mutex_lock(uv_mutex_t* handle) .. c:function:: int uv_mutex_trylock(uv_mutex_t* handle) .. c:function:: void uv_mutex_unlock(uv_mutex_t* handle) Read-write locks ^^^^^^^^^^^^^^^^ Functions return 0 on success or an error code < 0 (unless the return type is void, of course). .. c:function:: int uv_rwlock_init(uv_rwlock_t* rwlock) .. c:function:: void uv_rwlock_destroy(uv_rwlock_t* rwlock) .. c:function:: void uv_rwlock_rdlock(uv_rwlock_t* rwlock) .. c:function:: int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) .. c:function:: void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) .. c:function:: void uv_rwlock_wrlock(uv_rwlock_t* rwlock) .. c:function:: int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) .. c:function:: void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) Semaphores ^^^^^^^^^^ Functions return 0 on success or an error code < 0 (unless the return type is void, of course). .. c:function:: int uv_sem_init(uv_sem_t* sem, unsigned int value) .. c:function:: void uv_sem_destroy(uv_sem_t* sem) .. c:function:: void uv_sem_post(uv_sem_t* sem) .. c:function:: void uv_sem_wait(uv_sem_t* sem) .. c:function:: int uv_sem_trywait(uv_sem_t* sem) Conditions ^^^^^^^^^^ Functions return 0 on success or an error code < 0 (unless the return type is void, of course). .. note:: Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait` and :c:func:`uv_cond_timedwait`. .. c:function:: int uv_cond_init(uv_cond_t* cond) .. c:function:: void uv_cond_destroy(uv_cond_t* cond) .. c:function:: void uv_cond_signal(uv_cond_t* cond) .. c:function:: void uv_cond_broadcast(uv_cond_t* cond) .. c:function:: void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) .. c:function:: int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) Barriers ^^^^^^^^ Functions return 0 on success or an error code < 0 (unless the return type is void, of course). .. note:: :c:func:`uv_barrier_wait` returns a value > 0 to an arbitrarily chosen "serializer" thread to facilitate cleanup, i.e. :: if (uv_barrier_wait(&barrier) > 0) uv_barrier_destroy(&barrier); .. c:function:: int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) .. c:function:: void uv_barrier_destroy(uv_barrier_t* barrier) .. c:function:: int uv_barrier_wait(uv_barrier_t* barrier) MoarVM-2015.11/3rdparty/libuv/docs/src/threadpool.rst0000644000175000017500000000323312502366750021362 0ustar jnthnjnthn .. _threadpool: Thread pool work scheduling =========================== libuv provides a threadpool which can be used to run user code and get notified in the loop thread. This thread pool is internally used to run al filesystem operations, as well as getaddrinfo and getnameinfo requests. Its default size is 4, but it can be changed at startup time by setting the ``UV_THREADPOOL_SIZE`` environment variable to any value (the absolute maximum is 128). The threadpool is global and shared across all event loops. Data types ---------- .. c:type:: uv_work_t Work request type. .. c:type:: void (*uv_work_cb)(uv_work_t* req) Callback passed to :c:func:`uv_queue_work` which will be run on the thread pool. .. c:type:: void (*uv_after_work_cb)(uv_work_t* req, int status) Callback passed to :c:func:`uv_queue_work` which will be called on the loop thread after the work on the threadpool has been completed. If the work was cancelled using :c:func:`uv_cancel` `status` will be ``UV_ECANCELED``. Public members ^^^^^^^^^^^^^^ .. c:member:: uv_loop_t* uv_work_t.loop Loop that started this request and where completion will be reported. Readonly. .. seealso:: The :c:type:`uv_req_t` members also apply. API --- .. c:function:: int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) Initializes a work request which will run the given `work_cb` in a thread from the threadpool. Once `work_cb` is completed, `after_work_cb` will be called on the loop thread. This request can be cancelled with :c:func:`uv_cancel`. .. seealso:: The :c:type:`uv_req_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/timer.rst0000644000175000017500000000352312502366750020343 0ustar jnthnjnthn .. _timer: :c:type:`uv_timer_t` --- Timer handle ===================================== Timer handles are used to schedule callbacks to be called in the future. Data types ---------- .. c:type:: uv_timer_t Timer handle type. .. c:type:: void (*uv_timer_cb)(uv_timer_t* handle) Type definition for callback passed to :c:func:`uv_timer_start`. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) Initialize the handle. .. c:function:: int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat) Start the timer. `timeout` and `repeat` are in milliseconds. If `timeout` is zero, the callback fires on the next event loop iteration. If `repeat` is non-zero, the callback fires first after `timeout` milliseconds and then repeatedly after `repeat` milliseconds. .. c:function:: int uv_timer_stop(uv_timer_t* handle) Stop the timer, the callback will not be called anymore. .. c:function:: int uv_timer_again(uv_timer_t* handle) Stop the timer, and if it is repeating restart it using the repeat value as the timeout. If the timer has never been started before it returns UV_EINVAL. .. c:function:: void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) Set the repeat value in milliseconds. .. note:: If the repeat value is set from a timer callback it does not immediately take effect. If the timer was non-repeating before, it will have been stopped. If it was repeating, then the old repeat value will have been used to schedule the next timeout. .. c:function:: uint64_t uv_timer_get_repeat(const uv_timer_t* handle) Get the timer repeat value. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/tty.rst0000644000175000017500000000266512502366750020051 0ustar jnthnjnthn .. _tty: :c:type:`uv_tty_t` --- TTY handle ================================= TTY handles represent a stream for the console. :c:type:`uv_tty_t` is a 'subclass' of :c:type:`uv_stream_t`. Data types ---------- .. c:type:: uv_tty_t TTY handle type. Public members ^^^^^^^^^^^^^^ N/A .. seealso:: The :c:type:`uv_stream_t` members also apply. API --- .. c:function:: int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable) Initialize a new TTY stream with the given file descriptor. Usually the file descriptor will be: * 0 = stdin * 1 = stdout * 2 = stderr `readable`, specifies if you plan on calling :c:func:`uv_read_start` with this stream. stdin is readable, stdout is not. .. note:: TTY streams which are not readable have blocking writes. .. c:function:: int uv_tty_set_mode(uv_tty_t*, int mode) Set the TTY mode. 0 for normal, 1 for raw. .. c:function:: int uv_tty_reset_mode(void) To be called when the program exits. Resets TTY settings to default values for the next process to take over. This function is async signal-safe on Unix platforms but can fail with error code ``UV_EBUSY`` if you call it when execution is inside :c:func:`uv_tty_set_mode`. .. c:function:: int uv_tty_get_winsize(uv_tty_t*, int* width, int* height) Gets the current Window size. On success it returns 0. .. seealso:: The :c:type:`uv_stream_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/docs/src/udp.rst0000644000175000017500000002227412502366750020017 0ustar jnthnjnthn .. _udp: :c:type:`uv_udp_t` --- UDP handle ================================= UDP handles encapsulate UDP communication for both clients and servers. Data types ---------- .. c:type:: uv_udp_t UDP handle type. .. c:type:: uv_udp_send_t UDP send request type. .. c:type:: uv_udp_flags Flags used in :c:func:`uv_udp_bind` and :c:type:`uv_udp_recv_cb`.. :: enum uv_udp_flags { /* Disables dual stack mode. */ UV_UDP_IPV6ONLY = 1, /* * Indicates message was truncated because read buffer was too small. The * remainder was discarded by the OS. Used in uv_udp_recv_cb. */ UV_UDP_PARTIAL = 2, /* * Indicates if SO_REUSEADDR will be set when binding the handle in * uv_udp_bind. * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that * multiple threads or processes can bind to the same address without error * (provided they all set the flag) but only the last one to bind will receive * any traffic, in effect "stealing" the port from the previous listener. */ UV_UDP_REUSEADDR = 4 }; .. c:type:: void (*uv_udp_send_cb)(uv_udp_send_t* req, int status) Type definition for callback passed to :c:func:`uv_udp_send`, which is called after the data was sent. .. c:type:: void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) Type definition for callback passed to :c:func:`uv_udp_recv_start`, which is called when the endpoint receives data. * `handle`: UDP handle * `nread`: Number of bytes that have been received. 0 if there is no more data to read. You may discard or repurpose the read buffer. Note that 0 may also mean that an empty datagram was received (in this case `addr` is not NULL). < 0 if a transmission error was detected. * `buf`: :c:type:`uv_buf_t` with the received data. * `addr`: ``struct sockaddr*`` containing the address of the sender. Can be NULL. Valid for the duration of the callback only. * `flags`: One or more or'ed UV_UDP_* constants. Right now only ``UV_UDP_PARTIAL`` is used. .. note:: The receive callback will be called with `nread` == 0 and `addr` == NULL when there is nothing to read, and with `nread` == 0 and `addr` != NULL when an empty UDP packet is received. .. c:type:: uv_membership Membership type for a multicast address. :: typedef enum { UV_LEAVE_GROUP = 0, UV_JOIN_GROUP } uv_membership; Public members ^^^^^^^^^^^^^^ .. c:member:: size_t uv_udp_t.send_queue_size Number of bytes queued for sending. This field strictly shows how much information is currently queued. .. c:member:: size_t uv_udp_t.send_queue_count Number of send requests currently in the queue awaiting to be processed. .. c:member:: uv_udp_t* uv_udp_send_t.handle UDP handle where this send request is taking place. .. seealso:: The :c:type:`uv_handle_t` members also apply. API --- .. c:function:: int uv_udp_init(uv_loop_t*, uv_udp_t* handle) Initialize a new UDP handle. The actual socket is created lazily. Returns 0 on success. .. c:function:: int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) Opens an existing file descriptor or Windows SOCKET as a UDP handle. Unix only: The only requirement of the `sock` argument is that it follows the datagram contract (works in unconnected mode, supports sendmsg()/recvmsg(), etc). In other words, other datagram-type sockets like raw sockets or netlink sockets can also be passed to this function. .. c:function:: int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags) Bind the UDP handle to an IP address and port. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param addr: `struct sockaddr_in` or `struct sockaddr_in6` with the address and port to bind to. :param flags: Indicate how the socket will be bound, ``UV_UDP_IPV6ONLY`` and ``UV_UDP_REUSEADDR`` are supported. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) Get the local IP and port of the UDP handle. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init` and bound. :param name: Pointer to the structure to be filled with the address data. In order to support IPv4 and IPv6 `struct sockaddr_storage` should be used. :param namelen: On input it indicates the data of the `name` field. On output it indicates how much of it was filled. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) Set membership for a multicast address :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param multicast_addr: Multicast address to set membership for. :param interface_addr: Interface address. :param membership: Should be ``UV_JOIN_GROUP`` or ``UV_LEAVE_GROUP``. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) Set IP multicast loop flag. Makes multicast packets loop back to local sockets. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param on: 1 for on, 0 for off. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) Set the multicast ttl. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param ttl: 1 through 255. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) Set the multicast interface to send or receive data on. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param interface_addr: interface address. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_broadcast(uv_udp_t* handle, int on) Set broadcast on or off. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param on: 1 for on, 0 for off. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_set_ttl(uv_udp_t* handle, int ttl) Set the time to live. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param ttl: 1 through 255. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb) Send data over the UDP socket. If the socket has not previously been bound with :c:func:`uv_udp_bind` it will be bound to 0.0.0.0 (the "all interfaces" IPv4 address) and a random port number. :param req: UDP request handle. Need not be initialized. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param bufs: List of buffers to send. :param nbufs: Number of buffers in `bufs`. :param addr: `struct sockaddr_in` or `struct sockaddr_in6` with the address and port of the remote peer. :param send_cb: Callback to invoke when the data has been sent out. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr) Same as :c:func:`uv_udp_send`, but won't queue a send request if it can't be completed immediately. :returns: >= 0: number of bytes sent (it matches the given buffer size). < 0: negative error code (``UV_EAGAIN`` is returned when the message can't be sent immediately). .. c:function:: int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) Prepare for receiving data. If the socket has not previously been bound with :c:func:`uv_udp_bind` it is bound to 0.0.0.0 (the "all interfaces" IPv4 address) and a random port number. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :param alloc_cb: Callback to invoke when temporary storage is needed. :param recv_cb: Callback to invoke with received data. :returns: 0 on success, or an error code < 0 on failure. .. c:function:: int uv_udp_recv_stop(uv_udp_t* handle) Stop listening for incoming datagrams. :param handle: UDP handle. Should have been initialized with :c:func:`uv_udp_init`. :returns: 0 on success, or an error code < 0 on failure. .. seealso:: The :c:type:`uv_handle_t` API functions also apply. MoarVM-2015.11/3rdparty/libuv/gyp_uv.py0000755000175000017500000000654012456307253016643 0ustar jnthnjnthn#!/usr/bin/env python import glob import platform import os import subprocess import sys try: import multiprocessing.synchronize gyp_parallel_support = True except ImportError: gyp_parallel_support = False CC = os.environ.get('CC', 'cc') script_dir = os.path.dirname(__file__) uv_root = os.path.normpath(script_dir) output_dir = os.path.join(os.path.abspath(uv_root), 'out') sys.path.insert(0, os.path.join(uv_root, 'build', 'gyp', 'pylib')) try: import gyp except ImportError: print('You need to install gyp in build/gyp first. See the README.') sys.exit(42) def host_arch(): machine = platform.machine() if machine == 'i386': return 'ia32' if machine == 'x86_64': return 'x64' if machine.startswith('arm'): return 'arm' if machine.startswith('mips'): return 'mips' return machine # Return as-is and hope for the best. def compiler_version(): proc = subprocess.Popen(CC.split() + ['--version'], stdout=subprocess.PIPE) is_clang = 'clang' in proc.communicate()[0].split('\n')[0] proc = subprocess.Popen(CC.split() + ['-dumpversion'], stdout=subprocess.PIPE) version = proc.communicate()[0].split('.') version = map(int, version[:2]) version = tuple(version) return (version, is_clang) def run_gyp(args): rc = gyp.main(args) if rc != 0: print 'Error running GYP' sys.exit(rc) if __name__ == '__main__': args = sys.argv[1:] # GYP bug. # On msvs it will crash if it gets an absolute path. # On Mac/make it will crash if it doesn't get an absolute path. if sys.platform == 'win32': args.append(os.path.join(uv_root, 'uv.gyp')) common_fn = os.path.join(uv_root, 'common.gypi') options_fn = os.path.join(uv_root, 'options.gypi') # we force vs 2010 over 2008 which would otherwise be the default for gyp if not os.environ.get('GYP_MSVS_VERSION'): os.environ['GYP_MSVS_VERSION'] = '2010' else: args.append(os.path.join(os.path.abspath(uv_root), 'uv.gyp')) common_fn = os.path.join(os.path.abspath(uv_root), 'common.gypi') options_fn = os.path.join(os.path.abspath(uv_root), 'options.gypi') if os.path.exists(common_fn): args.extend(['-I', common_fn]) if os.path.exists(options_fn): args.extend(['-I', options_fn]) args.append('--depth=' + uv_root) # There's a bug with windows which doesn't allow this feature. if sys.platform != 'win32': if '-f' not in args: args.extend('-f make'.split()) if 'eclipse' not in args and 'ninja' not in args: args.extend(['-Goutput_dir=' + output_dir]) args.extend(['--generator-output', output_dir]) (major, minor), is_clang = compiler_version() args.append('-Dgcc_version=%d' % (10 * major + minor)) args.append('-Dclang=%d' % int(is_clang)) if not any(a.startswith('-Dhost_arch=') for a in args): args.append('-Dhost_arch=%s' % host_arch()) if not any(a.startswith('-Dtarget_arch=') for a in args): args.append('-Dtarget_arch=%s' % host_arch()) if not any(a.startswith('-Duv_library=') for a in args): args.append('-Duv_library=static_library') if not any(a.startswith('-Dcomponent=') for a in args): args.append('-Dcomponent=static_library') # Some platforms (OpenBSD for example) don't have multiprocessing.synchronize # so gyp must be run with --no-parallel if not gyp_parallel_support: args.append('--no-parallel') gyp_args = list(args) print gyp_args run_gyp(gyp_args) MoarVM-2015.11/3rdparty/libuv/img/banner.png0000644000175000017500000012610612456307253017505 0ustar jnthnjnthn‰PNG  IHDR€3•ü pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF¡qIDATxÚìýmP[w¾'ú~Í“„eŒ‘cL”–ïØ˜nໜ8Ê9' ƒ÷úÖ!Û™“©àͽu÷…îê¤3v¿ÈÌ1®Ú¹5±'teýo¼«Reïð"Ð5fÀžª(Ž3Îv=|Ø— 8tè0ªª`;ûž„ŒB`…g5DDDDDLP¸$À%ƒÝÝ]aog³ÙÐÕÕ µZ-L€J¥Bgg'ê£>ÏÒÒææîáÎÌÍÝÃÌÌ w>€òòrTU@UUU2’ƒÞdÀ “LLPp C­V_–Œ¤½ýMÔÔÔ ½½½½½¾Õ:;;ñòËÇn;7çÕþlÙO¶ªª*>|xþOpú“LLP@ ÀÙ¾¾^hµÚˆ· |‡Ãžžs°X,€_ÿú×XZZÂ;3¾9ü”åååhh¨Ç¡C‡qøð¡D*\®¨Ø7ȽÉ1À@î& ¾:q¢Â’€á´·¿ øB’”‡F}}=>°BA V¼É€?° DDDDÄ9»dßol6[Ç™3¿+U«Õ–Œ5xzœ>}Æ×€ÒË¿: –^ ~&\ÐÏ)LQvÉã. oàßaµ.~àïjµÚÒªª*8 ‡½ßÔÔ4@§Ó\®ÕjqâD wl†,--áúõøì³ÏÐÝý+\¼xccã±ÜµÀ'~°Z/Y­‹uÜ›DDDDDLüƒþR«u±Çj]üÀ%ÿë[[[_|1¶œßlþÞðkia@ œN'nÝú6 077ín¥:Œ[­‹_Y­‹Ü“DDDDDòÆ)¹øëœõx]¼x·n} µZžž³!#ý]]ݰÙlèèèñ?þÌf3wº•——ãå—áØ±c±®(`gzÀ§œ œ@DDDDLP¸Àßà ü Ñn»´´„o¿ý·n}ë[ªO­V££ã ž»[,œ>}nµ€|ñÅ´Z­oy@’žÃ‡ãرc!Ë6†±àðô °pï1@DDDDL0 ÃÀfænܸq¾xMM NœhÁ÷ß›a2™ ÓépáÂyÑÛšÍfœ?ÝÝ]¨©©Áµk×`2}Íæ€¥R©ðòËÇðúë¯ÇZÐàLÜÃ2üN'ÆÆÆ144äíG¸òÀÓ$°§§þË ¯]f"@ÂêñúëM8|øLQ(à.ÈÝÀii 7nÜÀ­[ßÂét&ô\jµëQog±ü9à>íííhiiÁÀÀ®]æA“ ±±qŒ£¼¼­­­Ñ¦tè°Z™ """"b€¤ø áÖ­o·ýœP«Õa¯w:“hl| ½½½ì QKKK¸xñ"®\¹‚¦¦×ñúë¯C¥REK|êM¬pI§dG௃gíö¶H·›™¹ƒ¡¡!ÌÌÌ$í¹{zzPSSöz¡  çç/ÂÞÎáp §ç\ØåI:T*U,‰àY³@®"œ@DDDDñÈã.uà_jµ.~à‡HÁÿÌÌ|ôÑy|ôÑGI þ@­Žâþ}[Œ£Æ… çÑØØÈ+qN§ƒƒC8}ú †††"M)…§"eÜj]ìàž#""""b€ þßõþïf"ðD±ŸššŠëñº»» Óéx€³+ pÉj]üÊ;M…ˆˆˆˆˆ2€Säøà)÷¯ w›¥¥%\¹r%âR~ÉRSSƒžž³¢×Ùl6tuuû~4 ø~§OŸá 2ÇÔ€~ïqZÀöq Ńò üK­ÖÅ/|.øšµ>}&-Á?à៚š{ žQ}­VvYA’.ÿŠ€( &;üà­b!"""""&È/øæù;N áìÙž¤töW¿èå&Ó×¾Ÿ#­ ¦¥… 9'„DÔÌÌp7+ð‰Õº8nµ.Öq¯1ëÕºø<%ÿ¥b·¹uë[œ=ÛƒÁÁˆs°SÊb± ··/à2›Í÷üjµš enii }ô>úè<–––Âݬž&ŸX­‹¥ÜkDDDDDLäbðß`€Aìú¹¹9|ôÑy\¼x1Rp•6&“ &“)àw‘– çÅu€7ßl‡Á`€V«å‰!C3338}ú ®\¹)Iõ®7`à#""""JîÉþu.!Ì<¡Üÿúõ’ÛöÞÞ>X,tttàÚµá€ëT*uÜW]]`ííí¾Ë¦¦¦Ñßßuõ’žë×oàÖ­oÑÙÙ‰††z±›è|eµ.~ à›%+¤ü÷À3ê/üãôé3’ þ×® ££ãTHÿd-íWSS ÎÃ`0ð„‘!§Ó‰Ï>û,Ú´€wÁj"""""&²4ð×Y­‹ãD×Ó[ZZÂgŸ}†Ï>û,cóüã!¶|ŸN÷BRŸ£»»‹I›™™ÁÙ³= w<ÕŸpo1-Áÿ»ˆ0êýú œ=Û“¶eýR%ÞU`zz*j ¦¦†'‘L Ëž=Ûƒ¹¹¹p7{—+1 ÷À¿Ôj]üa:ü{:¨ŸÖ8M6Ī¢¹ßõ6ÝÝ] %H:æææ¢UÔÁS ð.÷r þëàõo»^XÚoff&k^³ÙlŽû>±,#¨ÕjqâD Oª,¥ À'Vëâ—\.ˆˆˆˆˆ ¹ÿïzƒ]ðuBƒ´‹/fŨ¿¿àU¢±X,°Ùl1ݶ¥¥…UYBXÞ2B£Ë6xÖqo1 ÕÀß¿ä?ÄÌÌœ>}Fösý#ôñ,ÝOÂ@­V£±±‘'Y–p:¸rå >úè|¸D˜Î›èàÞ"""""b@jÁ€¯¦ähh}ôQÖúû⋘nçp8|S´ZmL÷yé%&²ÍÌÌ NŸ>ƒ™™;ánrÉj]¼Ä)DDDDDLH%øoóÿuÁ×---áìÙ åľ0›Í˜ššŽz»ááa_Ó@NÓc³ ;9N|ôÑG‘vÀÓ PǽEDDDDÄ@&ƒÿ_B¤ËÿØØx´åϲ҅ "Îíw8åÿñŒì Kêt:ôõõ¢»»‹‰,188iJ@Ø€ˆˆˆˆˆ € þ¥Vëâ%gÅ®ÂgŸ}–õ%ÿáüóç/„]°¿ÿrÀuñð:Ý ¾ŸµZ- Μ9¾¾^&²@”)¥`_"""""&ÒüÃSòˆ]þs¥ä?‹Å‚Ó§Ï„4œšš†Édòýn0âêî/Ü6øqµZ-Μ9îî.® s”€«\²Z?áž"""""b ÕÁ€ 2ß_XÞ,[»üÇËf³áôé3ð4t8èíí ¸Í›o¶Çõ˜ÕÕ5¯7 èé9Ë$@¸råJ¤å2ßes@"""""&Rüàù :ÆÆÆñÑGçsn¾,¾øb]]Ýèíí è ðæ›í1¯N‡ŽŽw¸ã³À­[ßFê ÐOs@&ˆˆˆˆˆ˜Hjðß.ø¿~ýFÎÎ÷•Ífó-ûxšùµ··§ìù ƒ¯a ÉÛÜÜNŸ>.¹VçMÔqO1¬àÿ’Øu/^Ä•+W¸“â Óépúô¿M0‘p?æÛ² {xúœÇ­[ß2 @DDDDÄ@Ê‚ÿKbÁ”€„"·:@l [Ì·ÕétÐétÜáY”¸xñb¸÷\)“DDDDDLl7øïüÏÌÌp'%Ä'tß~°@̽^z‰Kf›‹/ââÅ‹‘’ÜKDDDDÄm;øŸ››ÃÙ³=lö·M_|1×h¾`zz°wïÞ˜nï_ÐØØˆ7ßlç YàÖ­o#%.1 @DDDDLжƒÿ>:¥¥%î¤$¸t©?®ÛOMMû¦èt/Ät•J¿ŽJýZÀu¶…BØ—óqo¶³“Ű/çóñ*D’¥¾²Ze• """"Š+Bƒÿ—‚/Ÿ™¹ƒ>úˆgŒ„ƒÿööØÁ#ù===§øÀ_ däu*”[h8îDõ¿pBS¶óýl …»©Æ´YÉ“Å+*X@DDDDñ`€‚ÿ¹¹9|öÙgÜA¥ÕjÑÒÒ{0l³ÿZ­6æà@\Ï•LúÚUt~`ѦÇqÿ Ý¿Žæ“+èüà>ª]KKK þ³ÌÔÔtÈè"ÁüK/5¦e{µû×ñöo—’¬kÊ6“–TȆ$@˜Þu©"""""b@¾Á©÷K~@ðït:ñÙgËà_z{ûbjÊçp8ÐÛØé¿»»;¡çllL}@_»Šö®å¸Ëýã}ŽÎl9_ ¡Ág›wE"""""&²À—ðŒôÿ}tsssÜ;2àp800½)_ÿeØl6ßï'N´Ä5÷?XðÊjµ:®©‘T7ºÒ6:/L1h>¹’ÓÕ·n}‹ë×oˆ]ÕáíBDDDDÄ€\yGö Á—_¹r…Á¿Ì\»6Œk׆Ã^ßÛÛ“Éäû]§Ó¡£c{1]pò@§ÓáÂ…óÛ®0´ÚÑ|r%íû°ºÑ…ö®eh÷¯çìytåÊܺõ­ØU—¬ÖEßiDDDDÄ€<ƒÿq$qýýýèé9³Ù ‡Ã‡Ã³ÙŒÓ§Ï„ÿ==g·0Wׄ\¦ÕjqæÌé„“ Í'WPÜ‘±}¨Ý¿Žö®åœ^) BðK«uQÇwÉUAŽÿuidbjj SSSa¯‚ÿd”ê«Õª°×8ѵZ…ÞÞ¾¸‚)Þ åšO®`ïþu˜†49w S€ÎëAyy¹ÿU¥Þ$ÀkûVøn#""""¹É¹ oÓ¿¯‚/Ð œ²„Á`HZð/$ü©Tªçëîî’Uðï¯þ¸í]r²/@„& uY.”ˆˆˆˆˆ i »Üe'µZ3gN£»»+iÁ¿˜_|–°Ùl°X,0 Q{H1øTê×R¾TÍÍÍáÊ•+bWuX­‹ïòEDDDDLH˜Õºø D:þs¹¿ìuâD z{ÿ6-ËöùÓjµ8þ,KØÄƒÐ}_êóíµû×ñöo—rr©À[·¾ÅÐÐØUŸ°) 1 Ýà¿ À»Á—³ãvÓét)õúýíÝ»==çàt:C¦(”[hïZ–MP-$+Òµ4¡” all\ìª/½SŠˆˆˆˆˆ˜Pð¯C˜¦ìøŸÝL¦¯Óö\ZíÞ€ßkjªáp8ÐÕÕ ›ÍüËq¹=}í*:?°et¥‚L¸xñ"–––‚/.ð%ßeDDDDÄ€´|‰ yÿlú—<«L§è±wïÞÀ ‡#4HÖ”mÊ6ø(”[0´ÚÑÞõ gzS…D¬Öžӈˆˆˆˆ ˆ4ïŸrÃÀÀ@J×f»ïûY­VL0™L¸vm8àöÂ\úTÿó³E0 i0зÇ÷ï»ë;1;Y ·+5oóJý:?¸£ÍOrâ<ŠÐð¬wiQ"""""I+Èòàß‘yÿaÊy)K U55ÕI}\‹ÅâûÙIÀk׆ÑßßpÛêF ­ö¤ÏŸŸŸ-ÂíјŸ-B¥~ ǨԯA¡Ü‚Û•ÛBêßâGš£þÆ¿Qcʬ„}9?kÏ¥ë×oàСÃhh¨¾êK«u±¾¢bß ßqDDDD$UY[àmÎõ¥Øø0 ½(‹õööŠ–äo/±ðl €\0™L!Á¿¡ÕŽæ“+I þÝ®<߈ÿülª]hïz}íªïyÊ-_2 ÕÊ-izŒÎîãS³zÅ€0 D€OøN#"""")ÛñôéÓÔ=øŽ™L|  Íÿ²¹¹9|ôÑy.ù—£qæÌé¤<–ÍfCWW·ï÷žž˜L&˜L&ßeš²M¼qêaÒKþm …½² ¶…BßeÕ.mz,©9ùöå|Lÿƒ*+«ªªªpî\ØU¿¬¨Ø7Èw[ò-:Ý<ÓÈȰIÆû¶ž$–õŒ [’ô: <‡H Rùý›ˆ(’¬œà]ò¯-øò‹ÿ.ëƒMÙ&4»ÅƒÀùÙ¢˜£R¿†×|¿ßÿ±³“Ųß7f³½½}èîîÚöc}ÿ½9à÷ .Tm~‚úWI}·-b ¯,d^ÿ´Y‰i³Ò7 @ #ðš²MizŒ#M1;YŒ»“Ř6+³â}677‡¡¡!´¶¶_uÉj]4q*@J蜕ðöÉ9x{GÊ1K’ËÀsˆˆˆ˜È¾à¿"Kþ]¹rsssYõZ…@½Rï†f÷fL£¿öå|ÌÏáîdqHP_©_CóÉÑDZ/çãöõ²à„úD“‹f³9¤ÁŸü§r$>\ðïo~¶ó³EДmâhÓcT7º$±ßõµ«Ð×®âhÓ㬩 B}}=ªªªü/>~É?/DDDDÄ@ê]BÐ’33wpýú Ù¿0…r Õ.Я%<«)ÛDu™ Õ® ^S>‰ )ÛDóɬ]ÅèÕ]AhpÐëvåavRÛ×wF ò´ûסP>õÞoG@Y{*“‡ÝÝ]P«Õ1ý&“ ßo†Íf=.úZwJKðc þýÙ—ó1zµ·¯ï„¡Õ.™9ùþUÓf%ÆnªÓrÌSå³ÏþçÎõ@¥Rù_Üfµ.¶q*1Bb¥ÿN§/^”õëJUY·Ôл1zµÓfeÔ V_»Šæ“À/íö]VÓè ¸¨¨ntaÚ¬„iH¸*”[xãÔCTê×"nŸ0eÁöc!Ü«y¸ÿcÜ®¼˜§2Db6›ÑÝý+tt¼ƒÁ6Q`2}©©)Ñ}W©_ýúZwJí¹]y!Á¿V«Å›o¶£±±jµ‹×® ô ¼´•ú5Úì)Y‚0QÂ9â¿’Ü,--ahho½õVðUœ @DDDDL¤0ø/…HéÿÐÐl—üKWc·êFì p{´Óÿ Â‘¦Ço¯¯]õ÷±<¶¾ÖÛ×K0~SíÐî¦l5®°så…A¸Dm¡n×ßcú$k÷¯Gsîp8ÐÛÛ‡þþË0^EcãKp:øþ{3¦¦¦BFûõµ«8X»ŠJýZÚší‰ÿ5558}úßT/èt:twwÁ`0 ¿¿?`‰B!™òùÇå¨?îÀѦ'iY V•ú5´w=ÀülF¯–ÊnjÀõë7P_߀Çù_,|q*1Ÿ KJÿ31Z{¤é1ÆnªpïnŽ4E¿ýQo w,Ê-Zí8X»0Òk_ÎÇíÑŒÝT¡½k9î×|{ÿ ‰ùÙ"Ô4:aû± j‰¹ÃáÀµkÃ!óú…ç¨ñŽT§;h‚ÿí¯©©AOOøV55Õ¸p῎bosAEñVH’A˜2°êÚÛ…¾e+õnIŒŒ =jµ:榅Á‰èíí ¹îöh îþ£í]Ë’šxLí]ðÝõ¸=Z"‹÷ðõë7pìØ±àUtÞÐÃ?7DDDDÄÀ6Y­‹=Þ/Ù>sss’Åö+”[h>ùH]Úm?Æ5·] Må„®ò‰JgühÁ?tt¼N×ãX,ôööô4ÎN{+& qñCmLM3áHÓchvo`ôj©,ÞÏ/þÎ ‰õÏZ­‹ýû,ü“CDDDD™”'ç·Zu~|ù•+We±ýÚýëhïZ–D *t×? wǵý”úà_(ç7øïé9Ò ÐíÊÃÞýëèüà>šO®@S¶ékÊkO‡XØ aÒ`Ú¬Üö”ŒêFšO®ÈâøÍÍÍ…ë;r‰g71°=!ÿ®_¿™™Éo¸g>ü²d‚èñoÔ¾¹ï”~nWžhðÿæ›íèîîŠë±zzÎÁápˆ^?eVùëÎëª]0 i`Ò$åõh÷¯ÃÐj‡Û•‡‹jñÇK»1~Sµ!c¤$ÀÑæ'²8–aV1x—)%""""ÊÙNð6þ øBít:14$ýÒ©hÚ q{´í]$7<Ø—óñÇK»‚cµZžž³q—ý@ÿå°Á?àY!Á¾œï›îQ©_ó•ÿ' ‡SÜêFÆ¿ñvöÊó='€€Þ ÚýÏ¿#Mqïn‘ä:N\¹r¿þõ¯ƒ¯úÀ Ïx""""b ~Ÿ_044§ÓÉà?Îà ¯L’ËÂe;·+ãߨ1vSR&Ÿxðß“ÉõvÓÿ íà_‘âvåÁíÚW_1 åŽ4=Fý+Œ£Æ”Yé âŸóžFúÚU¬]Eu£Kô±šO®àóß—K~‰À±±qÌÌÜÁáÇü/ÖY­‹=ûzxö1²Z;Ôù_aî-ƒÿ0„ë†V{Ø€‹’ov²w'‹1;© dß|³:6› ÷ïÛB®×é^Y Àl6ãÚµaLMMÅ ÞT¡þGÄ÷i³¦!MÒV¨GšöPˆù»E¸7[„ÙÉâ€}3;YŒÛ×wâSC¦ÈhÊ6ÑpÜ)‹•®\¹"Öð7Vëâ§\ˆˆˆˆ˜ˆ-ø/p6ô˶´ÿm7øw»ò0;©À½Y…o½{ÍîMhÊ6#Ž˜Š±/çcàÿ³Šâ-m~‚úã¾Ò`Ú¬Äíë;a_Îx»©©i\»v*b¿' ƒÃá€ÍfKè|úã¥Ýhïzö6Âyqûz f'µI]­BX RxŽÙÉbÜ›-ò5 ´/çãóËñÆ©‡!Ïy¤é1¦Ìʨû1ÓæææpëÖ·xùåcþ Ÿ_ïñADDDDLD÷.‚–ýó”ÛJ·ñŸ¾vu[ÁÿøMïüé Ñb›w-ûÙÉbL™UxãÔØFi5e›èüà~Ò_§ÿÜlN'$Öà/| ¶Qüàÿ‰¯¾=¾ÕÂ%*®a ¯ ¼´õÇ0´ÚSòÑ×®âhÓßêžý¶ ¬…œ×G›ËbiÀ+W® ¡¡*•*à3Ìj]ü—$""""&"ðŽþÿFìKvº)”[ÐîßÀƒkx´œ6¸ʧS8ÎÏaôê.¼qêaZ÷ÃülÆnªʸã¥)Û„f÷fØý¼÷ù€Ë*ý–*ŒÖ8N*f'’Ü®ùÙ"|þûrm _ ",W9ÐWæéäÿcaÌɦDÞWÍ'W Pnaü¦Ú·¹’´¥ôæg‹Â–Íž*ƒHK÷LÒ2mb¦½#ó¨uÿ}yÒKÜ^qlC¤f å ­ömO¶êFWÜ£éB²IèÔŸLöå|_÷ÿhUÿ¹r¡  ŽŽˆˆˆˆ(§á:ÿ§jôÿhó“°£‰öåü€Ñêæ“+I/?I­nt…ŠV ¤b{ŸK%ÚÉ>†V»ï5¹]y¸}}gB „i³2®.ðB?ÿý9mVâ;¿çÊïÛ»@S¶ ûr>>ÿ¸<©Ýæ…i‚Ñ«¥QèJý:?°¥¤7@¥~-¡ª…rË·/“=eBH„ÅR• §i@Ø*€ßðÏåtžÑÿRÿ R5ú¯Pn¡þ•ð¥ÖþAjýqGRËþ÷fAÿÜ÷`Â|üà 8UšO>ò5~Kƾö¯´˜6+#ö=ˆ”0 iBª&"ñL LªÜ- …’Bù½iHWÅA´×ßp<ð½²+¦¾bÓ¶£þ¸c[ÕBCÆdWÜõÓX‚{ÿiÂkŠÖ2“ÂTtx›ål m£ÿúZwØ€Á¾œï ….õ© Áš²ÍˆÁ¶ÐˆPS¶PŸJ²uɢݿßÝ×ýýçì^Ý×\}a);ÿ$€iHÄ å÷Í'W|‰Š¾=Ié p¤éqÀh¾°¤^¬÷*%ôFØî¹©CÿvØ âšÛß”¼;ÒôØ$›`/""""bÀպؠÑÿ±±ñ”ÍýÔ=ìµ/ |ãÔÔ<¿Û•ç+£>Úô8bÐ2zµõÇ!åìrs¤é±/ˆ¶ú¡Yc,+ DK¸]y½"ÞX°ºÑåKÌÏÅ´ A¬I ÿã<~Só>*â­P(·p´ùIØÕN(DèÔŸèûAl¹Çpü“`BEˆ°„aªÚ¼Óžˆˆˆˆˆr+‘Ѱ0£fÛæéž> Œþ7w¦lY6ÛB'*ÛŒ8¢o_Îǧn»ŸT5€B¹å«”˜Ÿ-Š{ž~pÀ¶PÐ \ Ö¥£Í"•£WKc~Ügî}ÔwD<4e›8ÚüØp$J‚)¾¥úÒ¸\a¸}!¼oìËù‰©&¾ýöÛà‹J!Òô”ˆˆˆˆ(«Þu±uþ—…1KŠH÷ülÜ®]Ü®ýª„Fÿ¹ù‰ÎõÇÐî_)xÔî_÷-åg[(L¨ ¡¿à©öåü¤¬6,nWF¯–bv²8-½1ü§vŒßTãâ‡{cªŠð¯¸ûŠ„Ÿ¿R¿†æ“+èüà~J_«Ø’€lHDDDDY›kþ73s'eKÿ@åÁ5žâ?Õ"Ñ MXQÀíÊÃìd⟡ÍÓ0Z€g»WQï}Þñ›êm÷ª ÉZm`»¦ÍJ|þûr_9þ§¦ü9ý«OBd oOÔÒþà^Û¥)Ûô%R1å!L¥›QRHh[Ú‚/øöÛ[)}Â]»7yHˆB¹íþuØ }Óâí̮ݿMÙ&ìËù˜2«µ­Ô¯A_»ŠÙÉbŒ£Æ‘(¥îG›ž`v²öå|Œ^Ý…ÎÖž:"¬Hàô AwóÉ•´¡ b*¨¯B:›åizŒGËù}„DËÑÓfj¾jÛBaR¶WS¶‰7N=ô%eí5lii ccãhh¨÷¿Ø`µ.ê**öYøé@)6!ám[áá!""ÊÎ@@Ó«T7ÿíóë<$æà?wûFlçg‹P]ßðЦ! æg‹J"ø¢¯V;f'‹1vSPŠ.yñÆ©‡øüãr¸]y¸}½Ä·¬`"ª]¸7«z…Ÿ…æx©4;YŒ»“Å!Í÷„‘ðt5ÈóO8ìÝ¿ÐÀ“l)Åíë;q´é1ôµý:ª]¸}}gÒ‚t•ú5¼ýÛ%Œ^ݵíŠ_Rc|,8xzôð“Riddø=î""¢Ü ‰)Vëb‚šÿ§üyÓÄP,ÇäÙ4€{³‰•ðû—ho'8:ÜÇ:@»=`*Àv;ø7Ÿ\ Ýž6+1ÐW–’å"m …0 ipñýøã¥ÝÁ¿ |¦Þ7õÇhïz’Ð?ÔÂ4¤ øk¼û/Õ BÒg;‰·n} §Ó|1§Qv%ľäŠ4Åb🠀gÇ%ÑZS¶é øîm3z ŒÝŒ­“üѦ'¾Õ4¨Ùöþm·-âóËñÝõÛ^!`~¶Èôþq9ÆoªhÿÀ_ 1…‘w±mq»ò|?ÿØÓ«@_»šòj‰úãßò‘Û%’øÔy¤DDDDDÛ&•)mþ¿,--aff&¥O˜®¥ý(~B€í”nW\ƒm¡³“Åp»ò>Þ•úµ€¾ÑF’Ê-Zíøã¥Ý°-bü¦ÚW¨ö®½ZRŽ{´c7UÐ׺q°v5¦æt¶…BÌß-½Ù"ÌÏ…M èkWÑpÜ!ÉD™B¹…æ“+¨itÂ4¨­†°-úz(h÷¯cÚ¬Li£ºÑíóè+ÛVRæÆxùåcÁ¿iÏÑ&""""&b“©òÿ½ÏoðèK5ðüF@€D‚Ѓµ«÷ŽÚÏÏm«s{ÃqF¯–bì¦:¦&|úÚUTê×0?[„Û×KPÝèÚv©ùä v•mâöhà2ƒnW¦ÍJ_r R¿MÙ&vù•Éßÿ±nW^ÔŠ MÙ&^q@_»špß„tªÔ¯áí÷—0mVFœë/$LCèkÝhð.ó˜ôóvÿ:Ú»–·•˜››ÃÒÒÊËËý/nÀ9ÚDDDD$ÿ2PþšÝLHÕÞý똆Òà&*”[p»òpo› ¡¹\<Ë m~Œ¾=¾.úÑVˆÅ‘¦ÇÐ×®bôÊ®°=æg‹€Ù8ÞÞ>5®´uõO¶êFª]QþÉíþu4w$½*@HŒÝT‡TlÄjllMM¯û_¤³Zë**öMðÓˆˆˆˆ¶C =ÚüYZZÂÜÜ\êe\PªüWgØN³;¡r`þîöú(”[Ð׺}d¬Ï-—c7UÛž«ï`¾ýþÒ¶–áÓî_ÇÑæ'xûý%t~p†V»lƒÿàD@ç÷ÑÞõ jÂG¨ èûwÏ%¥—BðþmØÆ´0 P6$"""¢mËh@¦Êÿ=AÝS}©&ö'§:cïó˜DR:æ¬]Å´Y‰»“Å1mzŒi³2©UþÁnu£ öå|ÌNãžwÉÃàתݿ…ò)ôô2*#²Y¥~ •ú5_Âfʬ {¸]y¾^ ÇI;FÚýëh>¹âëCN """¢¬L CåÿÂt’¦d¨ž%=sæí% ºÉÇÓTPS¶é+M»©Bý+ޤßš²MÔwl»Ñ`¶žG¾%cߨE§‰€)³Rtå…DT7ºpßÛ2^œ@DDDD©é)mþ¿¤«üŸ¤/Xà’‚Šm?ž¾Ö qõ¨itúÌñoÔ<°"$J:?¸·ß_ ۘѾœ¾=0 i’ò¼†V{Bçr˜Dh$É2`µ.ê±ò.˜+„JGÛXRPp@ïIÜ‹#™ ”£ÀT‚Má(ùçDóÉt~`ÃÑæ'¢Ÿã7Õøüãò¤ôxãÔø?sæææàt:ƒ/nåÑ#""""Y& 2šuçÎLš® u&gýy­w¹GÛÛŸí’Hð¬ À¾œŸpgxJ>…r Gšãíß.‰ŽÒÛ ·µ¤Ÿÿó¼qêaÜ÷IˆÖy§DDDDD²KŒf9δUô #÷ÛíÕ°×{ÿd4T(· Ý¿·+/®Çó/7Ÿ2«xpãàvåy–6L!MÙ&Ú»ˆöQ°-&eêF¥~-î> ããcbxVQ¢2Ù0à‹ìÌÌ òÑ×®¢½ëÁ¶{/)¸Ý„BåÁ5Ø 1·(®Çªntaü¦óÞný\†Rœ}9cߨ1·($É¢Pn¡R¿†ƒµ«1¯Ä×R«{÷¯‡tîOVÇ£MO0;Y,Ú„PL˜ÏÄVýìóqw²³Þ·¯ï„¡Õ}íjR·¡ºÑûÃÜ-ñ;oò0;©ØvÒA¡ÜBóÉ ôí‰éöN§33wpøð¡€<Ï""""JT¦¦¼|A:+’’<(”[¾@Òöãö§I‰x§h÷¯ûFýÙ Pœ¾võǨԯŒ¶kÊ6Q©_ƒ¡ÕŽÎî£ùä Ü®øã¥ÝIëÖïïHÓã ûI˜B"œ?ñ$-D£¥VëbÏ""""JD¦¦üYZZÂÒÒRڞܖ¤/ó$Úý˜Ÿ-‚{uûù.MÙ&Ê-Ø—óávåÅU®¯]ÅøMÏ:ôœ¸êF*õkøã¥Ý¿©†Û•‡æ“+I}ŽšFW@@2’G¾¿V»ç|Œ¡¹`˜Äh€ ž D/£±ÅÏ L:¿Pê÷{¬&¬xÿý €€eddØÄ=LDÄ@«u±@ÿelþG)M<¿ŽùÙ"Üÿ19§»P°-Ä5MÁÀìdqÜMáèMÙ&Þ8õŸÿ¾Óf%v•m&uZŽ»E)Ýö†ã΀C8Âr€*U@óÈWyP’ƒÂ:o (9 *·u\KáI¾êýÞU—¤‡öœ6¿çƒ7`ò&L##ÃY¶Ouˆ/YÖÿö¿HöæMŒŒ ¯ðóH:ŸGÉ<_ø›ôÏÆ:‰o¦å?ÿçk–¬I@dkº–ÿó7?[””9æ$}»v{FÚ“±¦»B!ÞǦؗ=óÙ™Ø~ mhµcôj)n–@_»ºí&|̓y2Õ¿âÀØMUÌU õ?C‰¶é ŸWœ³ÀÑà }ÁÕèðÛ!!0422<˜»¸ÀY‰nÛkÞ}ÍÏ#é|ÕøR⟿̒÷f¼ïãO$¾õ©|ðLôÈèüA2KzIÚ*&7Ñ#$™J"$R½´]®¨ntù¦R˜·ß`Ú¬í+p0ÉÍÊ-mzÓmŤVë"“Däÿ%¾Ãhlù ÀÞ/¶uÙ4!!ð¥ÑØòÐhl¹äá%ÊzÞÀÚ"ñÍlÍÁC#õJʉTWOe"ðÅU(qM·{ Àr†vÿ:*õk8¤DÀvFƒèݾŸ™H¡©ž°Äâv‚ÿà%…$C*ª…êǶ´`˜)¿@1è/5[zŒÆ–‡.AúÕA¥ÞdÀ¸ÑØò•ÑØÒÁ£H9`PâÛ×–kŸ›2xÍ—SýiMˆÍÿÏÄè?ƒ¯ÜÓÞõ isÄ…`P³{#áûzÎALðÛ§cߨzŒÙÉâ°Á² úk8=ù&IÊ>D9øÃ3Ú/…À%£±å&(Ë]–øö•-¹”Ãk̪DF­îÝ›ËÈžu»ò¸%¬ºÑ}­;îûiÊ6}%ëÉjJ˜ëüGÑ™Úãvåaôê®´ÿ€§@,ææî‰}y&¢Ü þ;døÓù%ø¹FYÇ[Ê=!ñÍÌ¥iR­ƒ##ÖlK„|¸gªæï² €Ó|r%®%ý UÛ)W§0ïé*{Æ¿Q‡4ãKGðx’Õ®¨·éPjµ.êxĉr&ð×yçø_Ê’À_,ð•ÑØò¥·D—(›H½  -G>GKeðZ‡Òñ$éNüÂÿ§Ó‰¥¥¥Œíaö LØëíTÏ ”Ìs»ò0eVf$øÄÒ`0L¢ÔÀ#H”_Zß0ž#ïù6?äXI2e¿~‰o_®Lúk\N˹’Ñ ‘²Ö´bÊÿU ’µ4a. ®¤ˆç}}ûzIÀý…¥ÓI_»µšdnNtªÔ/xô‰²:ð/5[¾„§«i½ôRxV ¸ÄjÊ##Ã+~3À\˜ ùòÿt=QÚ¢o¹jÀ¹ØòVéÄ>” Úý뾀϶À>Ûu?è=¬ñ.Óí½ÿÝõ¿Ø4°R¿–ðÔŽí%"÷“S-UÇ£O”µÁ€¯cºƒtÀ3-@Ç3‚²ÀÄ·/«?kØý?C xæw3ª•V³“Å’= Ü®<ÌϱR! ¥bY¹\åÿV(·|MƒÍÏáóËñÉûèûwÏáöhIÈm¦ÍJ|w}gÚ_CMc,«° QŽÿuܨƒgÙ@î ’5oi÷Š„71Û§HýµYFF†MÙ˜0Äð…6íîe¸ }9ó³E¾Àcôj)¾»¾ß]ß ÛB´û7,f¡Xæ}Stó³E%ü‘FÒ+õkxûý%t~p†V;´Þ^ Án–àâ‡{1mV¦mŠF¥~-lâÂ÷Y%²b emð_ʽñ,0§ ƒ»‚dnPâÛ—ÍÓXþï'õÇ’jè@¤šgªAl?½š‡{w‹àví€m¡š²MTê×p@ïFõ¿pF (;èkÝ)5Ï6·GGëcI×”m¢þ¸õǘŸ-”Y…é F€öå|Œ^-…B¹…†ãNizœò×ÒðЦ!MØëgfî 5ôÏW Ï¢¬þÛ|É=6 pÉhlAºšd¥Àà™Ú"UmNeé¾o“Á¹‘• ÿ/RýÌNCŸ„Yÿ@ÿþB!ìËù°-Œ"j÷¯£òàöî_iÔ²“B¹…·»…ò)wÆ6Þ·þ ¼JýZÜÕ2Â}Ž6=ÆØ7êQ·+·GKp÷xãÔÔ¾_«]¸}½$lÕA˜)SuþˆE÷ ¿ánˆŠI’­‘‘á £±Å‘iÑQj4¶´Œ gÕ÷ Lm˜¶dk .†/³qo¶(¡€g~¾÷,€ÍðÓî_Ge£ ¼G}IÀäOâÜ®<Œ^ÝpÙÑæÇÛ:†V;Ž6=iHR`[(Äç¿/G{×rØ©Û%Tˆõ&¹‚šFgÈs¸]yè+ÃÛ¿]JYò¦ú_„OžÊ©Ã‡ù_¤ãÙ@D9¦žžõé5#J‚~‰'Ú}ÓÚdpNd_¢+Hg €m¡nW^H°îvåavR»ÞRc±Ò\üDé5zµ4$w4Ésô+õkèüÀ†¾²€¥BÝ®<üñÒn¼ý~j˜š²MT7º|Õ.(”[¾å çææ‚u<#ˆ(G“_¨ç® 9¶-&Hw%Ÿ¬šà-ÿ/•ð&ŽŒ ¯dk .40'©½o[(ð ÎNcʬ]"P¡ÜB¥~ kW9‡Ÿ(Ápy¾B¹…êFWÒŸK¡ÜB{×2>ÿ}yÀôÛB!¦ÍÊ”<§Ì^ãì¤ذwÿ:F¯–ŠVNY­‹ºŠŠ}žD”cêŒÆ–OFF†ßã® ™¹ i/å›MÓXþŸÁÀ Á8NIíýùYæg˜2+EçòW7ºp°v5)͉(9Á¿ðÞL…r oœzˆÏ?.¸üöõ){^ÿ*·+ãߨ}«üyB´rJ®@D¹é]£±e(ëg%Á €KÞ>Cíë6 oÛJ¦*-òÒô<:ÿ_ffîHîÜ-ÁíÑ’€à_h Öõ7?¡ùä ƒ¢ ÊîÅ‚8˜â÷¥vÿ:Ž6? ¸Ì³ÂGaÊžÓJÃØMÜ®¿‘²õΉ"q»ò0zuWØQÓ8-çÀÁµ€ÕîÝ-‘¦Ô¾/6=iH·+·¯—ÀÐjÇúÖO(Ê{Ž' Q Oü’»ddÀ»Ý6ÑØR—É u;dPþ9“OžŽ&€!;_JK _´Û»–SðÚ }ó…-{‚üà%̤p Ûä¿mþ+èkÝœ A)7~SÛ×KD—Ü{ßf{¥Nýq‡oÒñ›jÔ4ºp@ýÔŸÜž9DDh3[ lH2rY À3 `B¦ûVêÕ‘ýÙžÐ_ µ C«}ÛÁ¿äÛ qïnÜ®)m–®ÄÀìd±o$V_»Šƒµ«¬ ¤›Ÿ-ÂíÑq%ÇšO>Êè6kŸOÏ{ ùä >ÿ}9Ü®<˜5¨}ÿ>O""qg0@²022wþëW?á•—BnRÊ³Šˆ€§ àwÉD?<ý+¤JŽÓ¤¾‚Á`.$æ`Hiôˆ­ŒWhÀ5~SÍ©8¥z„}9´yⳄij$DåAO/&2˾œ±oÔ˜6+㪚Q(· ¯uãhÓchÊ63’°NH 3Ó¥ùä úöð$""ЬÍhlyÏ»Ö:‘¤Œ ¯-ƒnÉzä7  MÂÛÖ/…Ϧ´W8òjÚ%¬C.§Nµ:0Ya±Xàp8r6 a[(ÄøMµ¯q\M£‹ÓÒøÇ[ê/ýž&”™-÷ŸTü®¯]M{SÌJýôµ«˜û'Ñ$ªœ÷JDx*¢Úá&[Dq’pÐ*«i2(ÿ’ÂFdd€\ þu:^z©ÕÕ5!×MOOá‹/ÂÞ·±±'Nœ€N÷Ôj5,–?Ãétà‹/`±Xn¯Õjqî\´Z­øë±Ùpöll6[Î~º]y¿©ÆøM5´û×ÑpÜÁRh~¶c7Õ1-éxª5þs7ôµ«’JÐܾ¾3à÷ƒJH4Ÿ|„‹ñÄ""Šì7L\ŒŒ ÷-ŸH8f’Ó4)—ÿ¯ŒŒ æJ Îÿ©M¸;Y,Zîvåá—vo;ø¿pá|Øëkjªáp8píÚ°èõ§Nuójµ55Õ¾ßÏŸ¿ôx5aƒ!AðÚk†°I‡ššš€Ç÷çp8`2}UU¶…BŒ^-õU4¼âÈHyy¶q»ò0mVbìuÔ^Â(ÿ½[²‰˜ùÙ¢€×!ls&K–QäïžlH23 C¢ÛÖùLh“ð¶õKeCÒ>Àå’Ö€Óf%Ž6= ‹Dî§REÁŸžž êkb~N±|­V5ø<íííazN‡ŽŽŽˆSúû/‹&>R™¨Ô¯áhóc®àž/bþnîÍEœÛ¯¯]õ6ð‹\ÚÿÝõÐìÞäk5 j~¯?.i"ÅìYAD1|Uðþ~þ³÷ç_àÙ\cC¿þ:£±¥”«Œ\†gK)jƒô§´IxÛþ ¥Iu@H`fæŽ$ÊèÕRÜ_(ôMxãÔÃ0AôT„ 5pdÐétF âÿ5ÈÕ—4p:#—Øow4]¬z`ïÞ½1ß?Ò…7ßl»_…BGÇ;iKæg‹0зš²M4¼â€¾vU²Ó„ÀüþB¡gyćù¢ÓXü“ åö>¿t½g~»ç1<«®°ýXÛBAÄòþXƒ~ÀS=0zu4e›8Ò$½ÕA¦ƒªÊ-mz¯'D$Uðt˜6Œ ÇüÇÒhlÑÁÓ¯éUïh]í“6° ÉG¿„’ž ƒòÿÁ\JÈÊøMÏúäÂÒcš²MhÊ6‚¨xæ±':º-œhð¿}ccc ‡h® ë[ ˆV½KB𬜠6õbjj÷ïßOxûr>LC˜†4Ðî_GåÁ5ìÝ¿’ °ýXè Àîï Æµûס}~#iMïæg‹0eV…4ª‹v³“Á·(‰{;âí0mVÂ4¤¾Ö2ýF*‚;ÿgzî´?Ìü'ÊIxF ûmx罟Åûõ=ïéß@ºó‘ãñ*$##ã±ÅéVæHy€A‡vPj I™"Ìi·^yl„övÏÿ==ç¶] a[( ;ß=ÖûN›•P(·Ð|òQÜsßíËù˜þ¦ÌʘƒþTÑ×®ÂÐj9ðŸŸ-ÂíјŸ-BóÉ•€i7R2´o5e›¨E:M,~šÆÿåùŸ3@”»Vœþ4AÈ€SFcË9xF#åœ0ðT!™¹,áóVÊï')Ïÿ’Úåñ}Ï(òv‚Íxï-9!V½pÿþý4&¶W 6A Õj£6AŒ5Ñ.ÂR“ß4‡»í´Y‰Ï?.ÇÅ÷âöhIFƒašÌ§F þ…m¿øá^ ôíýa>Ú»H6øBGÿ ­vIþs• ¢œ6àÅTÿA‰ËÈÈð)¯áY/¹Ñy§8Ééý-UuR|?ùMc’¢)SV$Àd2¡]Rö£V«B.ûþ{s£ø6› f³9bY¬z¸ëbMf$c ¿HÛçp8¢.C)!k/‚h3lŽ–àÞÝ"Ô4:¡}~šÝ›¾¹ö¶…BÜýGE©PÝ芻]y˜Tàîdq@£ÀúãÑe7¥dv²8 ¹R©_“ä D”“ÞKuà/’0-õ.AÚM¶Â-2N`PŽ^1[ú!ÝÊ›6Hou ). J±) øê+ñ€Ø´ÙlŽ)¸ô\±&„Uâé æÑFÏÃÞÇ“ˆt[‹åÏGç·[} <´*‚×^3@«ÕB«ÝðÜ6Û}\»6œ²sJl¹9)Q(·Ñ*bIDªBˆåXˆ­BðÒK1OÑ466†œ7f³çÏ_ˆx?¡i`¢ÝóÊ­g£Ùúí¿l …½²+¤º@»†6»,GÎnþQ¦¿@¦{ÎŒ~ àHs„2X©ÑØR*Åy¸D\–p@JÓ¤\þÿ©nWسÙ2/¼±±Qt¾ÿ_ „©Z­6æÞýýýúK/…:ã«îp8âZÞ0‘à;–$Çv :Žmß?Úõñ¬þàÙ/â}^|Q÷óû½Zv™ÊtùîúN|þqyHð´ù Þ~I¶³íÇg¯G¡Üb·}"ʤ§¤¸aÞ`ú”ŒöeO'’ïrœR}?Ia5‰—ÿOHeš)Ðßß0â¯V«ÃŽ÷öö…zÕÕ±/K×ÛÛç{®'N„½Éd V#Mî“xð>”}¹ýJ„?GM2$zßd4AŒxÆ™\0 i2²2€Û•‡¾=¸=Zp¹vÿ:Þ~I6sýc¡Ý¿Á8"ʤsRµöÎm5Éd_2@rtYÂÛÖÆmí±K ¼¼<ëÞ½½}ðýÞÑñŽèȾÅbAàùi$_,ØžK«ÕFœëßÛÛð»Z­ŽXm ¬VXàm‰;€#Vb_áû„ï{ÿþýˆ×‡›‚HòCl)Âx—'t»ò0zeWZÏsÛB!úÊBV+¨nt¡½kÚýë²/Ky%"Ê)‰–þ“K@)O)’¡A o›Jï[%¼ús9°’ ÀSâßÓs6› jµ: iŸ?“Éœ †˜V~®®®îˆ³Ð7 P‹Pm ô)G¬^2ƒw! ±DÂv*l6[”e -a/w›ÅV#p:ão6g[(Äw×w¦5ø®:0´ÚÑ|rEVþˆˆdàœ6Ò[âÚ/ƒMåJ$;Þ÷—T“`4¶”BºH¥Þs$Õ €‰\z£NMM¡««çÏ_€Åb Ø›L&œ>}Æ8vww'°F <ƒ§'D«6¸vm8l­Éßv¦nõ„ï»ÝJ„D§ „K~„k,¸Ýž þĺï§*ø~žæ“+¨?îȪ÷°ïVQ†X¤Ôõ?—yȈRfHÂÛÖ–£Ï-çc––@N2›Íèí틌Z,œ>}Ðé^ˆ» Výý—}m´jƒhU‘i&Ó×¢ë*ÛI $”‡{ÎHû+ø>Ñz4„ãvåÁ4¤Ikð¯Pn¡½ëAB+ÈÍìd1?Ј(Ýå´±##Ã&HÀ§Ž§É‘7¸"ÑÍËä4©–ÿ¯È!Ë@9|ñÅ::N%%x÷çÏ_ðõ(ˆ¥ ܶD ·|ûoï¥KýqÓÁ „D{˜L¦„îk³ÙÂV@„Ûgf³9 áëjb¦ÍJØ—óÓü/gíòxÁ]ÿï2@Dé'Çu©x•ò´"”èved€·ü¿ÇŠ Š"–¾BÜ@PPSS“pð]Sûjf³9$ Žµ RC,A¶Éôµèå*Uäûö÷_}í‘¶»¿¿ßwŸêêšmß±oÔI=_•ýZíYÑì/œ]A €i³2åS,ˆˆüX¼Ë1@IMÐ@$G\ óÏ™ ÇŠ €\KßÀÓË ¿¿?äòhÕѦÄ£¿ÿrHã½pË+ ×Ë –$B¸*†h÷u8!+<‘þ«BÔÔTo» Yª°Â€Øœÿl/û¯Ô»C.›THn;•ù? ¾h…ŸpDYÁ$Çö&-¤þ9TÇÓ‹dúþ2°Htó21 @ªåÿï±b€äéÚµáQx­Vµ R#Áh÷ ¨{zÎ$Nœ8ó}Ūb™go³Ù–tD[ðL!ÞgÑ’&“ çÏ_€Ãá@{{û¶‚öi³2)Ç~ôê®nÿõÇ91ç_»#ä²{³ÒKäç…$‹&ø©E”¾–ñ¶›xøˆRFª#Ëi ñòÙLßJuÀ|AUÕ¾…e¢··/d)ÁhAªÃá  c À#%jjªcN"˜Íæmõ¾b}b‚ÐÛÛ2·ß`0DÝÖîî_ÁéÜ^GýdLøîúÎÆw•ú5Zí9qÎ+”[!S¤X@DYkBÆÛþ'‰o_)O/’±~ o[[–>W6£ô%**ö…$T*ßÂrú´éïGooŸoT¿¦¦:j@{íÚ°hGýXƒèà$€°Z‚ÃáÀ‰-qm»ÿˆ|ccc@™}E»¸EŸS¬‚ ÖBOOOÀó¾ùf{Ôò~¡!ävØ—ó·Õµ~~¶·GKBâ7N=Ì©s¾ò``ƒC·+/¤"‚ˆ(d:ÿ_`’øöÕñ #6X Ýak–>W<&¼Çˆ Ê&“ §OŸñõÑÐÛÛ2 Ö9üb¾øbÝÝ¿]! òvôãÁ „ÒÊUh†–¶OMM…$ †WÅßDOQ¬Ù@^ÁÓ€çšüiµZtt¤gŠÔØÍĪܮ<Œ^- ¹¼ùä#(”[9u¾YáÀöc´>¸w”ðƒ‰( ÿÜÊ|û-<„D)õ‰n—!M6%^þÿ9HLPLl6zzzpúôÑb·¿pá?\¦V«·•p8 -—茷·?ßp{NÿíšhÀd2$‚+{t«¨¨qà…F;´](Pxæk׆ÑÝý+ @§Ó%T¯ùÙ¢„–½º+ä~õÇÐ×®æÜ¹.öš¥Ö@¤ à×ü”"’=YÐrý"’©A o[:s|þ¿:t˜o_9;±XBºó‡#6Šk#¿d‚qÿä…ˆ–šô©ÕjÑ‘|!àç@Ãc_"@(í?}úLÌû-{UEø‹Ÿiñ—‡ö¡¶à¨ˆ…º0¿úÏ𗇞 ¸ü³ñ{p¬oõ±v®ÿFØVê×r²ôߟöùõËâ­¬He^ìâ ~Ò1 âa$J‘‘áAH7Ñ–²Ýhliƒ4WòXñ&"}1=|øß½¹ø­Æbñõ¸ß&‰mZsä‹ïŠ-TÔ8æóGË¿Ð(PøWZ¹Šç{‰ý‹»”øøÕ†w)C‚ÿï…Ü~Ê}µ ·+c7Co×|r%çÏ×J‘F€ÓfeÌ•™øÄO"&ˆ('ôKt»ZeúØÙx,2žxÄ÷)ÏJðci"˜.«öðs»…2þçþ»¸¡*[Hä<…ö  EêÍ„žÛù0¶¥åþòÐ>|üê?Ã^U‘ï²ûÎ5üŸÿu_Ý[Hbi8þ:$ ­ntAS¶É“€vÿºè>Ë´Â¼ç˜ ÊBYÒDo‚G’(å¤ZržÊim<É“ŽÎV!_L«ªª077Ç·/eÜc[!TeëoS¤ÞL8ȳáÎÃÃ{ <±E¼]my NÕìõÿOÿdÃßßùÉWö_[^‚_Õ€º0ÿæ?Oún7;YŒúãÑÇ7ú´é1O /…òiÈeSf%Ždx‰$**öñK7IÁ wQjŒ O-f_‹6$yT\Âåÿ–‘‘aY~ÿJG dǨT*¾{IœË…Xsä'5Àô;— á²çùyä_]˜¿ªÝ×”Ÿžàï&ðÃ#—/ðÿËCÏ¡fϳU^Ú·Ë7%`ʬ ›+gçè MÙ&0x™}9Óf%ª]Û.6$ÊJÜ)WÇ]@Yä²DÏéV$¿,^ªåÿëÉ“‘µ­ÊË÷ðmK’aV£¢Ú‘Ô$Àª½kŽ|¸yXµˆ6 üÿâgZüÅÏʺúO=x‚¿¿ó&—ž„ üÿ²BãKØ ávå‰vó)eçè ]a’!SfUFÊ‚Ÿ_dâÑ"’½•lx##Ã&£±Eª›WÊÓŒ²È €O$¸]mFcKi’—Åk“ð1`@LEÅ>“Õº”(çÛ–b¦.Ì(ƒ¯ÙS‚©ÏèÝw®á¾s-áÇßÚØÿ[ TeëP¨·—ÿ4ædÀÖÆ¬9=ÁºëQ>¶6w`Í‘÷ëÛnà/xiß.÷|¿ÏN*B‚Õi³2¤?Gÿc'ôWÈÔþÊÛQƒ@DD”ÃFF†-FcË Dƒã6$© @Âåÿ&9÷mIWÀŠÿÁÛ³‡ ïÅ]J¼´ojËÕÐi”Añ3¡ó ï;×`s­arɹ`±»âJ 8— á\NßëÜ«*Â_ü¬¯(ÛvàïŸL¨-/ñÝ÷Þlh@l…ŽþÇgúTë Ì©˜à!""Ê9CM$s€TËÿ/ËùÄIW`€Aø…$¸þÅÏ´xíÀî€n÷ñÔ{UEò}ç,v&—˜zðÄ7>“¯ó¥}»ð?Wí èýua>^;P†¿<ô\Üû£fϳÀülà}íËù!—qô?~™jX$¾WZ!’¿ î"ŠÇÈÈp¿ÑØò ¤7BžÌimÝýƒLDpTUà»–ÿàò÷d’žÒøg¶åTž¿¶\°‚¯î-ã«{1¹ô/îRú&º?jËÕøû;Ï~ÿ>Óÿ:ú_Óèä‰'!‘R©_Këóå‹&L<"D²—M‰¼ °áQ:Ñ nW¶Y`4¶ÔAšåÿýIîqµ €?Á/ƒÃUðÌWÿuý”þ‘Ôì)ñ޾{‚)aºÀV½ÿ»|Kì%šp¨ÙS‚wC§QŠŽàßw®á«{ñÕ½eß¾[ò/Ñ×ç϶Pà T§Ì¯Ý¿žö 6[Ü,Nû¾+-ÿ¸ìI ?“ˆÒç²DɘðŽD÷ùÜOštNpøðaÌÌÌðm›£þâgZüUí~IlË‹»”xq—¯¦ø7ô$¶‚‚ýB_p¯UE-Õ¿ï\Ã÷‹ðÕ½‡Þ©ü®Q—” _ì5 Óæg¨Ô¯Á¶PÒü¯!Ì2Ýìd1 ­ö´>çÆêN (ZQ±o‚Gƒˆˆ(÷xWÞ°ÐIlÓ’1  M‚»Ü222<È@lB>—dð/uþ#é±4à çûÅG¾f„5{Jð?Ó¦|Û_Ú·Ë—xä úƒGÿÊ-èkÝSh€sQmy‰,‚ÿdãž>Ú”Œö‹?§& P<#Öþôµn_o𣙿[”ÖmÚrW_´Â#EDD”Óú%º]Ûéà/ÕòÿËÙpÂä¥ñ¹,þ¿:t˜o×ô—‡žãNHÿDƒm¡€åÿ)ro6} €üjìT‡T|Í£@DD”»¼ëÑOHpÓ Û¸o›_ÏÄÈÈðD6œ3éÜið+åà€Ü Jã)¥w¬oú–ð»ï\ƒÍå)£¿ï\óÍ·WäãÅ]JÔ–«·U¦ŸÍÜ®¼‘jMÙfZK×åȶýãq> e>Üç*å¶?¸$±m*5[Úâ3/áòÿËÙr²¤3°@yy9T*œN.A–+~xäÂÔƒ'¢ú}皯¿Ð•_˜7/ÆÿºïáïïÀÛXoþâgåi+µ—‹±oÔ¿7¼ÂÑÿhÜ®¼˜n“®>aV°ðHå¼A &Ï4€Á8ïóŽ„÷1qš¾ ªªŠ+ä˜ÿí,^Ü¥ Xúo;Ëîùs¬oâ«{ËøêÞ2^Ü¥Ä_ü¬¯(ËÉý,,/(.ÿ××®òdŒ ž‘}ÛiI(E\€ˆˆˆFF†WŒÆ–~HoIÀ6§¸ä‚ïT‹¬Î!_T>Äwlúá‘ “KO|ÿ’ü‹=Çgã÷ð×ÿ忇ÃÙîûÅGølü^Øëõµ«Ð”mòDŒ –€¾Û>LOµ8t €‰GŠˆˆˆ¼¤¸>}©ÑØs@/áòÿ¡l:QÒ–¨¨ØgAPÇêªøV¥”ºï\Ãgã÷ðþ×ÿSždýkýß[ð¾·D¼ÝAŽþ'5¨¿—¦•D*&x¤ˆˆˆ¼síW$¸iñ¬Ð&Áí_îg q_X«ªðÝJiñÃ#þý·³ø?ÿëlÄÞräXßÄßßù ý_þ;¾_|ñ¶ åôµnžI êíóS¾=%…?»øO;@ÈVVP&ü§²É¶?À÷‹ð¾·ø¶?žDÆÑ¦Ç<øQØ ÓrŸxìÙY|Ñ ‘?ï:õRü~ËÈ~›·Û222lʶó¤ Íϲ:Œ±±q¾c)íë›ølüþþÎOøuýÑå ¥â‡G.|uï!¾_|”ð†Jý›ÿÅ`>9ýn׎”n“:t ƒ"""sÒIoCôÕ¤¸üß`6ž i­¨¨Ø·üÅ•+P¦Ýw®ùúH¥Q c}ß/>ÂßM.à¯ÿËÇû_ÿü§²m«ÁÑfŽþÇâÞlü Û©«xêÞ‡üêà‹¿æ‘""""™­§H¸üÿÙx‚dà9'üpUUT*œN'ß®”Q²„µå%øËCÏ¥¥"@H8L.9xFúm®5üðÈ%zûw)¡.ÌGÍž¨ óðâ.%Oã?ýÓRØûUê×P©_ãAŽÁ| ÷jêr©eš.v±‰GŠˆˆˆ‚Œ [ŒÆ–AH¯¤¾á“mÜ•##Ã&’ãkþ>|ˆÓ('ß/>ÂÿÏjÇÔƒ'aGóÕ…ù¨-/N£Ä^U!^Ü¥„VY„½ªÀÀT˜K€æ“+<°1°-ÂíÊ“Ô6•„&**ö1@DDDá I0¨nCøiR,ÿ¿œ­'G&!_\Ù€¤œØ«*Â_z/íÛuabßï;×B– TæãÅ]Ê€@_§QF|ŽDzm~¹ÿ±&~Lì#ñÞÝ"iJчôF ˆüJD$!uÜD7à¥Ú¦R£±¥mddxÐÿB —ÿ÷3$û,V뢀N¸Œ}HÊ„åöÔ… xiß.üÅÏÊ}¥÷±Ræã×õÏV¼ˆ§ªàûÅG˜\r$Ô°R¿†#ìü{ ?«Ôö õ|‹RFí>àIìÑ­âùŸ?Á vúŸŠäHðpþ?Q¶Òñu¤œ…§å )®cß” à>Ë…€×ÿ/*• UUU|›RF©7#öyO¡*[Giå**jx¡ÑíA—$“G›³ô?÷%Vþ_¸^'vñ ÄQ,¼ëØOHl³JÆ–:où›Ô>'FF†'²ý¼Èd ä‹ì±cÇøN¥ŒØ©]ïSð%Ú5TÔ8 =è’ÌëP(·PÝèâM€ôþË?Jûø–ˆ¤LÇ]@$9RÑ~Ò,ÿ¿œ 'DÆû&”år€”)ÛÉ/Ñ®I¦@»ƒ3Ñ€„*”ù?CQÞsÁò(e/£±ÅÀ¥€¿?´AšåÿýL¤ù„¬ªªByy9ߦ”VŠ-©7¾ÿ†;kÎ|I¼–Ùø/Rk¨Ø­†ºÌ#ED·‹»€HZ¼ëÙK-  ƒô*LÞ)L¤XHC+6¤tS•­'|ß5G>~üo%ØÚØÁ)cw'‹%µ=" W¼USD”½êøhJ¹ ("pI#PQ±oÀŠÿeì@é¦Ô$6úÿÄVë´ZRÁ¿¢˜Íÿ1»Í€¦l3iÛòÔ½¥%/_<È£DÄŽ¯a[&²üü©Ë’סãGAòy×µ_ឈ(g¾kåImgs¥Sb+î €­°ÝUÂvW)¹‘íóë<¨q²-¾¼½)šÝÉK„)ÿâ‘"Êz¯2M©G<ŘÈqýÜá÷wªiòÅ–Ó(]â þ…’ÿ'¶øçŒo§Ï@Ì 6ŒÛ”Y)©íùÙþ|ÑŠ·ZŠˆøH–ÑØRÇC˜Q¿û ð. G©ÃiqÄ£L¤Ø4€×_§!¥Å®ŠØ›æ %ÿîØß6yO¡=è‹GáùŸ?Á‹G¡¢Æ±­¾áƒÿu(”œ¯i %ØýŸˆ n?åðþ¯ãaLïúöî‰+Þ)L¤YÀN///GUUOGJ©bÍ ±Ì,Åq—ük*Ü8Pÿ%Úµç}î5Ž˜Ÿ?5.Ô‚·+O2Û³[!šüdÆž(GÈ|)@©Oa˜Èòӧޝbðî‚ý¹ö‚¥òÍ7ä .›RªíÜÛ(¼í®v«"æÇ-Ro¢¢Æ=ºUä<ÅÖÆX§Ôøáö.ÜÛé{¬bÍžÿùh*ÜIy=úÚUÔ8ݾ¾SRÛ#2ÿßRQ±ÏÄ#E”3ê¸í)³’í'ÌH@vôÁºAî‚èq(iàý‚kñ¿ìå—™ Ô)Pl…ŒÌÛÚØ×|ÿ¼‚§Ø£[Åó?‚bͳ¹øÖi5Ví€ wXŠaò¬ Üç…F;´](Ñ®%T Ý¿žÔNô¹`Ú¬Üvó?ßþOBóEMÑQìTkù‡š(·É92ððñð’6ï:÷ünñŒÅ;5‚ € 8U*›RÊì>}ÔÝ:­Æš#¶QU¶.:šï\.}ŒU{AÀ‚yOQ¢]ƒö  £¢Æ¼‚§1¿ž†ãÔ8¸]yIý/V>Ýþclˆ&=YªGÄNòŒÆ–6læ„D#•Zåzâ{›H–ò# -¸²PŽÏÊ“ò8vìež–”ü“¾à)T»#ØÚî*c þ [¨¨qà¹CNÑ‘{—ýÙcèt:466ú~_sä$‚AÍFÌ Ê-èkÝ<°q¸}½$i£ÿÉ¿C}¥ÿKÈÍŠŠ}-¢œR*“`Zvg’–øZ‘øË¬3[t2=÷ßáÛ?m‘SbâØLdŠ÷‹®Éÿ²††z”——óÔ¤¤ÚU±qtý¥8jÙ^ÁSì>àÆ†ÇåþÁü“o¾ÙŽ3gNÃ`0\ÿã+M6lƸ¢_Ãq'»ÿÇa~¶ã7ÕI}LEñöö˜æý'ÊMrÅm“øöåR°ÓÆí¦H¼É°Aî z§D0a!MØ €’©@±;ð£åÎå¨ ÿJ´kxþçOPZ_Ó=•ÊtvwwTl¸ó`V<諾 ¦Æƒ åê_aù¬Ü®<üñÒî¤?îv{”‹~ïág¢ÜÔ!§õÐÆ–H¿t{"I#‡`á7r;á½U/:¾õ3så œ !©@Ež~ei¹%Óîî°£ÿî<Øfï _¬Ù@EÚƒ®„õ9Ïõîî.ÔÔÔø~ßÚØákè\.ÄKqLÉÑÿø‚ÿ¾2I-û%…?GQÞsÁ÷WTì[áQ#ÊYïÊh[åp&åóT&£…:oR<‡(¹l‚<Z©üLd@:úý)//g3@JŠhÿmw•¢óñ [Ðt¡¢Æb͞؊ðÓ¬SžQ{±ûŠÔÏ:óOMMù~V«Õèé9‹7ßl¸ýª½?ÝQÅÔ@S¶ÉÑÿ8˜†4°-¦ä±Ûh¨Úl»˜™y¢Üö9Tx—«“Áþü“Ô’ )vV.'ºwôßÀ·|F æòkOR_&’$dÞëë¯7ñ-JÛ¦=è {Ý[‘o©¾àÀÿ@Ãc”h×°µ±Ö)5lw•p.bÕ^àµÓÈ”šg €ï¿7‡\ßÞÞŽ ÎTĪùä Gÿc4zµÓfeêέý‰M(Ê{.\ó?š¬ü‚»€’¬ò¨¸$“ý™Ì/ú2x½:£±¥GÁ)€Oøv—NÌ•Crz%É%Äš>|ˆÍi[Teë›õ=²>kúW¤Þ üç!IÀÓÈ/\ɾªlÝ7åÀf³áÚµáпÒ:zz΢»» Z­6¦×SÜJýlnW^ʃÿm—[Müƒœ=ÁQ²õ.&Õà­ò™·Ì }E&¯ù7R>„sœûŸ1Þ)-9øÒ-##ÃLHOÈàÖÖV¾S)±“¼à)öè"7ìÛU±†=ºUhxŒçþDtª€ÿÊ555P«Õ×Ùî*Ã>¶```‹Eôvƒ}}½èîî xì`•ú5Zí<°1ÿ}e)þýÏß¡Æó»[žXòèÉŽ»€RD’#ìÞÀò¬Œöc2ƒœ?Éä5—¸$Õ©$ÞÒÿwù—^Ì•rþ{–$ûÔ˜âå—A¥RñmJqÛ]éŽÚ´¯D»MEøÛ­Ú |eþˆ}OÏÙ˜’š}Ï×áp §ç\Ø$€ÐétaƒÍ7N=äA¶Pˆ‹jS6çß_¢óÿ›Ç¿#$Ñó6ÿ“'Œ´‘<Õ-—$v®—B>¥ÿ°’ä¹¾r:¤x¬¼Ÿ——øöf0œ!9_i™'§ƒÓÔô:ߦ—bÍ4î¤>æK/5úï\'–È+xŠç9}¿ I³Ù,úø&“) a ðßÞµÌyÿQŒßTãóËÓÖí_S¶™ÐýªÊþµØÅý<‚aY$¾}ïðQŠt-ïJh{¾‚<ÿ¥*`ŸÙùÓ&¥$’7øÿ œ:% ÞäX.%&d²šGÎ&ú4Ïêõ×_gÅ~r<Øø/ CH'±$€ÐWÀ? pþüœ?6›Íwyooz{ûBžG¡ÜBó[üG`_ÎÇ@ߘ†4i}Þ] $v+^·ôŸ…G2ì—©ïY­ÝN²óI¦—v3[JÆ–/eüÀ×)ø,Z‘Ù>è0[¾ÌôgƒɺÌ×Ê€$xË`ªT*«(fZ½+bé¿ÐÕÿ‡Û»`RÇ´ôÜ¿o ø½½½ƒ!$ ` \ D»†ç9}MÀl6ãôé3èïïGWW7L&“hðßÞµœð\ó\0~SÏ_ŽùÙ¢´?·f÷FÜ÷Éw4‹]ÌæòV Îg¥Ôº”©‘\oàø€6î· ™lLä0êV O™í»<\”âóì,€ŒÆ–O’Y`4¶¼S ²!pKÉgëÈÈp6|f¼ŸU_%³¿„7qô‰÷ü9 –üËÂÈÈð¤ßlw;VFF†ûy¤= ¤¾û,Vëb?߇“PpëÖ·<‚@«w¡H9 [µ`Ãý,÷e0àp8|]ùÞS X³PöªÝëÈ+(ÆÖÆ\»6Œ–––€eý }z{ûD;ú3øŸm¡£Wv¥ei¿˜Ï·8§f<§ü?Ä.æèìäò夞¶ßx/Ë)•çÚ»Þ5[&àá2ÁÓé:¦sΛ<0xÕû¿.‹öO*“†ƒÈŽ‘mƒ7h7yÏ¡ o@ËùStþÔñm)[@öNÕäá•QÀï r‡ÿ­­­LP€=ºÕˆóþýµZîî.ßÒ|ÂüþŸî¨PQíH&ä<Å®Š5<¼§€Ãá@ÿetww…µZôôœÅÔÔ4úûûE{0øÍw×wJfÄß_<£ÿ¿àèÿöÉm_éàYëú’ÑØb‚g.ò#o"c;É —1"uÞg½Ù ç¿[¼ ƒR¿äA¶k©üÒ?„ì*m/õ¾ž6ïùïù³â½~ÅûO”< ìz¿dk€Ýÿå–WÐÖÖŠÁANç OÓ?M…;þoç:]@" §ç‡gîþ¬ÕŽ€éš}n<²zšú™L&ÔÔT‡¬¬¦¦.œG?®]fð)ŽúûÛû|ì+”â߈]ÌÑÿ8ŒŒ [¼AM© 7ßÄ/ËçôðŒ º\Ð&R\y3O‚/›Õñm”sc‘}=,Y2m'iòd´­!_”_ýu¨T*ŧ*[‡öàöƒfN‡öögs÷×ù°N.å'ôôöö…íÌáp†½N¡ÜÂÛï/1ø÷3~S¾2ÉÿP©-館<®ó?ÿ ÅûŒˆb‘Ò?ora»™²Ì? ˜ ±T*šš^çQÌaEêÍ€€<Š­°×8Ñ0¢/–P•­£D»èïﱘLaÚýëhïZæR^nWþxiwF—ö‹=Û /îùˆ]ÌÑ~9!¢ÔIGpÎÏ#ÊÆ÷ÍJ–½¦~V™&Â}a~ýõ×Q^^Î#™£Áp‰¾`Ãë”6k°2¸ô^‘êÙ¼m±}ï ±±1b@{иvm§OŸ]Ðd2¡··/lÉàÿ™ùÙ"|þûrÌNK~[õµ«1Ý.ßaDQÞs!§GÿÆýFDQ?'ÒÔ'#ƒ%ÊaYXÙ2Áž92Ox«’*•ŠË2ø°µ±Ö)5VíØÚ؇÷I€"õf@@ps>µZ3gN‡TüøßJðÄV„U{ç±7wÜÏb± ««p8p8èíí ü×w ½ëÊ­œ?žnWLC ôí}9_Û|0†@þ5WþßÅ®âèâ_N,llFD,-%¿œ@|ÿHÞx8CÈp›?ðø5zùåc¸qãæææxDs<øë´:`™?xd-Biå³€MU¶»U0›Í¾f€þº»»PSSþþËp8ØpçÁvWuû¾øb_}e‚Óé„Ãá¹^¡ÜBóÉG1 g»i³RåþÁÇP_}þÿΧÿ7äïY*²Ÿ£ÿIùƒ~‰»ˆD¤;(Y©ŠHÎFF†MFc‹Ù±$è h(¹M@EžˆdsÞzë-MÿX™/Æš#tykcžØŠ|¿ïªxV¾ÿÕWác1ƒÁ€žž³¢ ‚Hl6›hð_©_ÃÛ¿]ÊùàßíÊôY‰‹îÅèÕRYÿ ¯uG­Ü(Ê{Ueÿ:Ü—Eât"JÑçCŠ»ÿKpjñïlÎ0ú$@‚ÖP>|øêyDs8øßÚØGVO¯V«qâDKÀõï)|óø [(Ölø‚õHüu:.\8òxñ:Úüí]âZ;^îl …øîúN ôíAß¿{Ÿ\îûyôj©lÊýCŽeÓ㨷ٓ÷×¢Á¿w*mï ÷ ØÔ‡ˆÄË‘ç$J¥l(g÷ÿlJx½|Á[o½Åe³”ªl=bð·…¾¿£ãttt4óÛpçÁ¾¨ðý¾ûÀ³îþþË¢ üüutt §§Z­6®m×î_ÇÛï/áH Ac¶ý¦! .~¸Ÿ\ŽÛ£%˜Ÿ-‚Û•ÛB!æg‹dýúª]Q“8¿€Vs$øâx¦0¿pQjôg¢á—wqw?e‹,è·³222<È#™e €ŠŠ}ƒÁ¶ååå\0 •h×ðÜ!gÄàËÏZZÔÔxÖ\ïîî‚ZýlöÃ{ ßb͆¯“¿ÃáÀùóDËöýÕÔT£¯¯7æ)G›Ÿàí÷—²¾Ë¿}9? è¿©–íè~$ å ­öˆ·q»òp°ü=±«ÞóNa¢ä}9án"ò—ÉÄà{Üý”eä<‚ÞÏ×… ¯SÁ´¶¶rYÀ,²G· íAWL·õŸû/ŒÒ‹M°Í*_H,X,ôôœ‹š°ÙlQ«*õkY?ê??[ÓŸ\Ž‹îÍڠߟ¡ÕuîUÙ¿·ìÿñ 7¥ð &—ûž`ÐAÙöž’ñ¶³ü?[Þ¹´Ÿ_ÞÙÙÉ#+÷³à)ž;䄦Âó}‚;ÿ ZZZÊö×ùx`)ö=ÏîÊgÏ- ­R@!nïz ëQ·+ó³E¾ß]߉ï®ïÄèÕR ôíÁ'ïW` oÆoªa[(̉sR_»ŠêÆÈɨ§î}Øùô—bW±\_¸‰(µ¤ð9û<Ó½ˆ²áoì äÙ Ðâý~@adÁk8  ~KU>|/¿| ·n}Ë#,CEêMhõ.©7CüGÖ"¬9òQ¤ÞÄ®Š5(¶ÂêBé¿Z­Fww7zzz|×Û­ (5›P•­CSá†Ëžçr¡/ púôœ9s: Ôßf³áüù °X,¢ÏYÝèŠi„X*ìËù˜Ÿ-‚ýaîÝ-‚Ûµ#g‚ùxi÷¯£ù䣨·;¨}ª‚>$ŸrÙ¿´ü (å® ÊÝÏLŽþûLFcË9ŸðP–¸ìý+'àa‹LîS„eÙ0KÍþ‚ƒÿ'¶"ÜÛ »UU{ìV~üo%eÿþ÷±Xþpÿššjtww\f›Uúîœp°Ùl8}ú ×® ãôé3¢Á¥~ í]Ð|rEòÁ¿}9ã7Õ¸øá^ß|B“>ÿâÊ-4¿õ(ú±}ò2Ô?¾týOõn ÷1QN³@B VGF†?û“Pöü„üªZyä²<àM تT*N™=ºUÑfÎåBØî*Cn¿µ±#`>‘Ê?¨ †€$ÀÖÆX§ÕXµ ¯àiÀý_|1€öö7Ñßß/Zö/,íW©_“ô¾,Æ/íÆÅ÷Â4¤Éú¹úÉ þÛ»–£NçØX݉šïŠ]uŠÿø…›ˆRê”×ú>N ì!§€Ú$…j &2øaÛÐP††ze‰+RoâùŸ? ;ß_˜¯/:üžùüOlžeå”»žðf³Yô±D“SjüÙ¬ñ=N,ä°´ŸÛ•çíÿã¥Ý˜,æÉ–‚à”üù;Ô!„¼ÉIân"JsÞ%ø$Å€œâá¡,!§’z6ÿË¥€·!`Hhgg'§H˜¦Â-Zòïàû7÷3 èé9 ƒÁà»ìñ}Oéºj÷º¯z`jj*l§~Ïcô,¸µ±#æmö”ü/K¶ÉŸ}9£WKqñC-GûÓüãÉËÐjŽ_ºÂ/üÂMD)5122Ü#áϤAHhjÑ6Îå x¦ÚÈÁ X%¼I€OÁ©²P ØBE#`>1«öÀ>•Â’~þKû­Ú °æÈG^ÁS¨v? ؾøb ìãÖÔT£§çlÀ걨nt¡½ë$çúÏÏyÿ½˜6+ávåñDK€vÿ::?°ÅüG(ý?çMJRú¿p³Qö[ðš >“Þc@BYBUýœÄ@šp*€Äi*ÜxþçOP¬Ù¸|kcžØŠðÄVä‘ßÚ ™ºòëtº€àý‘ÕS¾¿û€Û—P0™La;ö qáÂù€NÿÑ‚ÿæ“Òû\™Ÿ-Â@ß ôíÁ´YÉlê;ðöûK1'x"”þʽ™±/Ü=àÒ€$/Üñÿ2ú¢ŠÇ˜ï‰,0(ƒmâaÊÑ@¤©ååå<â$Ìõõb+½ñ°ÝUÂvW‰{ã;±æÈ‡ÛñìõŸû'Nœ¸ÿª½Š-ìªxÖïüù ¢Íûjµ.œGcccÄm÷,'­ïþÿülO°mДm¢½ë ­ö˜ïS^ÜÆÒé&NMI>^cÀwð/›ýåMTðÇî9IžÇ‰ÿ]µx«)Þ$À§àTIÙ}À3ê/6×ÿ‰­¶»Ê€yø[;ðÓUĹù/½´?¼§”V®úžÇf³áÂ…ÿ¸­mæƒK=ðW(·$¿Õwàíß.ŵï”ù?C)þØU,ý—Ž_ò 71@dðÏc,¯àdd¸Ÿ»A²¤Ü`Á®'„M8|øÚÚZyÔÓ¨@±…çþ¥•«¢×¯9òE—ø€ w^HZ­6 ઽÎeOC@­Þå»|jj ½½}aÇd2…]5Ú»–%1çß¾œ/øWê×ðÆ©‡8Úô„•q¨Ô¯áí÷—`hµÇu|Ý®Ì#ŸÆà?\‡ p‰?­V‹þþKq5æ{óÍö€nþ,ÅØÚØ"õ&´]A~oo_Èt€þþþˆÉC«=ãÝþÝ®<˜†4¸øáÞ€¿ºÑ…Îîãhóc˜†40 ixÒÅø·w=@{׃„Ží~ÕÿÊüŸ‰}9eé¿¿pŒ ÿ’AÉè|=Åó5û‚&¢ßzÿ²9%¸iÙðùÀ@ò’ƒbH;;ÿŠK¦ÁÖ¦§Œß:¥ÆOwT¾ÑyAð¿ÌûÏí÷'6—_«Õ¢½½=à1Î{¦”h×P¢] HôôœƒÃáÀÔÔ4NŸ>ƒk׆Ãn¿¾võÇ݇ã7Õ¸ø¡ã7=I…r G›Ÿ ëo~‚¡ÕÓ}{¸Ô_ ôµ«¾À?Ñ©ŠÍcx~÷bWª¨Ø·Â½,Ù/-§À ñ|•£ /fÓ—{o¢§LôÇ·žÁ›¬H±?GÿãT¯ñ=:á‚òòrüú׿ÆG}Ä3 • €¾s¹š 7öèV}¿ Ôjµ¯œ?\WþpýOœhÁÔÔ”¯ŒßnU@]¶bÍvU¬á‰­(à1::¢¯Ò”m¢ù䣌í;aI?!°×”mâhÓcèkÝP(·`[(Ä/ífà-`Wn¡ºÑ…†WДmn뱞º÷áà¾÷Ä®úÔ›l$iéî7[&|éÿ÷€ˆç«d}ê]F/[ñ)£±åO>áñ%·ƒFc‹EbŸKü§¬_(Ü;*÷ËàËÙ 3ìV6ÜžÓοÃuuµïçššê°÷—èîî ˜:ðÓìV¬Óê„¶³ùäJFæýûÏó·/ç£R¿†æ“+èüà>ª]P(·0mVb ¯ŒÁúÚU¼qꡯRb»Áþ5þÙÞ/¶äßDEÅ>~‘Ï— õ>åÞ ž¯’e§äÿ½8ÆŸzñ/Ɉ”îAï Ä@H`žJ€ì¬žy!/¾¨ ¸Mð’“É$z¹Z­Æ™3§}ý¶6vøúÄëhó“´wÓžç_Ýèò•«W7>ëeðÝõ½Z ·+'’HÐß|r]óÞ8õúÚÕm=žm¡ó³E˜,Æžÿ¯póþÉ=/»/Ü+Þ/žõàR$Ÿóõ5oà”í>…§$Ü”CÇxÂ;%à/ÉÄ$´-\22¹òB+*ö}jµ.¾  Íÿò_ÿúW8{¶KKK<RÀ`0À`0 §§Çw™0-`Íùl;¸ì¿¦¦SSS" €¯ÑÑÑ!ú\:ïDlêKy¤éqZ÷Ñìd1F¯î‚BùG›Ÿ ú_8EG¬G¯–bÚ¬äIå¥)ÛD¥~ kW·ì»]y°-`~Vû?À¾œÛ³é)/¿| ûŽÿ/bw=Å%ÿäý¥ÀkFc‹ÀYx¦ŠIõ|5-õÞð¥YöMÎår`822Üc4¶ô¸”…ŸG&ïq®Öœ«ï¥º oÊ ›G2‹SðÌYñ°*• ¿þõ¯ðÑGçát:yF$‘Z­FGÇ;P«ÕÐjµ°ÙlžÀßá üýGçU*uHâà‹/BÓápÀd2,ÿ|?‡Ã‰þþø?´û×32ïß¶Pˆö®å°éÝ®< ô•¥¹H¡ÜB¥~ ôkÐ×®n«¬ß¶PˆÙÉbÜýGEÄýZUU…ÎÎN±«8ï?‹+&o"à7JIè\] ‰gt0ðϾÀ Ù•˜œðþ<¾Ùç²üÆ@tûV¬ÖÅS¾‚_ö¼ªª o½õ.^¼È3"‰ª««}%ù/½ÔÐq_H„ ƵZÔÔÔˆVô÷_FcccÀòþNœhÅb ;] \pÙÞµœ‘yÿ‘*l …½²+'ƒMÙ&´û×q@¿†ÊƒkÛ^ŽÑ¾œÙÉbŒ}£Ž©Byy9~÷»3¢_X9ï?«:oà |¹! $ž2[ÎÁ“´ê€ü*øÇöy$×DoöëGæX²û?1'&¬ÖÅ÷à)±òyùåcxð` ƒƒœJ’,þóøkjj·ÑÚöövÑ€ÃáÀÀÀ@Ø©€§) Åb Û4P*Á$Óf%LCšœ™ï¯Ý¿íó8 w£R¿¶íÆ}‚ÙÉbL™•˜,Žù>ÿü¥<üÿ{·Ør¡+à¼ÿ\®>ð©_2àUïðRî!’عúž7ÐæMÔIx“-ðŒØýM»âNèð¬BI'ÑÍ]ñ…<¾¹qn®-ƒÈ\Õœ… &&âMô[­‹¿€g.Okk+–––pëÖ·<3¼„Qv‡Ã!z½N§ƒZ­ Ôýçõûwù€‡÷¿Ûl÷T%ªÃV\»6ŒÆÆ—®kð¯Ý¿Žæ·m{t9™æg‹p{t'æg‹²>à¯<è)é¯Ô¯%5ãvåaÚ¬Œy´ßwž6ºp´é1~^õ4E/ˆ}¹yÍ»²åX2¼_Âë¼ÿ^õÞÌÀ=E™þ"î ¼ú%XÁ2ÏhðeÎÿÞögÑ{ð$|Ú¼Ÿ?RH¬À“Ôä‘Ê9—3˜àùÆ@BI€÷¬ÖE]ð‰ÛÙÙ‰¹¹{˜››ãÙ £ãˆsê;:: V«púth©ôÞ½Ú€D‚N§ ”‡»¼£ãÑÇ€ . ·÷oC¦LMMãÂ… Q_[¥~ oœz(™‘ÿlüÊ-èkÝ8 wC_ëNÉ~·/çãöõ˜TÄU9!þš²MPÿš¢£b7{Ï»¢åö—p‹Øoà•®/ã–$?Þ{Èê†~dùÊA,¥xVÁR—¦„€ðÿ €‰#Á)9ƃÞÏ ÷ŒÆ–:x’¿ðþŸêÏ ïñýÚ{|'ø^ÍísÑhly-COÏïcÛ°ãéÓ§©{ð;$ýâ­ÖÅRxúüQt:øè£óLèï¿›Í&„kµZôõõzõS!U_ü~íÚpØD‚N§Ã… çE¯ëíí ;Ÿ_§Ó¡§ç,Ôj5l6¾øb ¦¹ÿG›Ÿ¤½Û®þ•ú5Ô4:–3L¶ÙÉbŒÝTǽýØ­xÔ¿»é§œ÷ODrçS®óþû<‰ŸÒ8’+~_¼'<òþoῤ1{µ’Ï’Œ_ûó oµ ¥A*cô‚\Þ±Þ¦€¿0î÷ •J…ÎοÊù•jjj V«}ÿ‚üà³Ùññ †W100 :Àb±Àf³A«Õ†\×ÑñÌfsØû ËþE{~@Z%ÿöå|Œ^-Íêÿæ“¶µD_´ý7ý*L™•q•ù+”[h8îDý+Ž€*„Á¿TƒÿTþq ¢¬dâ.à1&¢Ü–—ë;À»Ž÷kðd8}ªªªð»ßk–“‚çðÀ‹/>K¼ôRcÈõÁ»Z­Æ‰-aŸãÚµk¢—«Õj´··‡½ŸÙlŽ)ø?Úüo¿¿”ñà_ü/~¸7«çù§"øæöÿñÒn\üp/n–Äü+”[8ÚüØp¤éq@ð¯Ìÿöìøk±»MÀSMDDDD${ÜáW’gÏöää~Ñéž5A{í5CÄ Û¿ã¿ÀbùsH“¾––\»6,:šo2}öövÑåýNœhÙlmTFýÝ®<ܾ^‚ñ›êœ8n–ø–òKtÙ `û±æcþnQBË!jÊ6q´éqØ)ÊüŸágšóÈß’ì³€Mÿˆˆˆˆˆ €¬Lô[­‹KtvvââÅ‹9·O,–?û~nll„V«…Íf²µZ †€ù÷bý…*€/¾y ‡Ãááá°£ýÝÝ]èêêŽyû…Ro)ÌõÿîúNŒÝTåÌ’~`[(Äç—û’{Ÿßð]W©w{ügýªkl?z~OFe„vÿ:Ž;"öxü‡$eVü’Á?1ÝI€å_~ùädÀß©S8>|wý7ßlHLMMÃ`0„Ü®½½_}eM&\»6Œ––Ñ*€ï¿7Ǽ­•ú54Ÿ\IÚZò‰š,†iH×õlc_·}9³“þ—–¤ìù*õk8Úü•úµˆ·s¬ìÂs;Ï„ þ_cÇ""""Ê6yÜ!I€÷àY~ÁI€ÎÎΜÚÁåö¥þSSÓ× U‚HSº»ÅGò«l6z{û® àÏÓxní]2üÛ—ó1з¼´;§ƒÿtªnt¡½ëÚ»D þów¨Q÷ÂÿÏi_»úƒ""""ÊF¬OœòNèN¹U `6›ÑØø¬Á_GÇ;¾%Åæãûwìw80™L¢U55ÕhllM\»6Œšš8|ÿ}l þÂuvÏ„ùÙ"üñÒîœ*÷Ïtàï¿”_4ù;Ôø™æ<”ù? ür¯Q6Ú‘Êe¤vìØ!ëcµ.ŽCdmÜ[·¾Í™$@MM zzÎ\600à›ÃæÌé€À £õb÷8twÿJ´!`<Ž6?‘Dào[(ÄØM5¦ÍJ~²¤˜B¹…êF^qÄUéCðß/§ýÀe‰ˆˆˆ(¬ˆì5_'r©`jj SSÓÝü[ZZ|sø¯]Iøw컿@­V£»»+b_HâùM6ûr>ƾQÃöcaV/ç'%š²MÔ4ºJød[ðODDDD/Ö(Gàíþ¹µÁ[:‚ÿÑ«¥|s¤H¥~ š²Mл¡}~Úýëq?Æìd1îNcvRü%øÝïÎ@™_%vÓOüQ®`€Y­‹¥bI »zm~‚U׌ßTÇu?ÿ^6› çÏ_€Åbñ]¯V«ÑÛû·P«Õp8ƵkÃ1Íÿ×”mâhÓãˆë¹§ËøM5LC~r$HS¶ ÍnOÕ†öùu+ŸB³{Ãwùv*:ìËù˜þ¦ÌJßÊ UUUèìü+TU… þß“óþd""""b CI€+W®ÀétÊú5¾÷±0zµ4®fvZ­¯½fÀ?XÂví–[=@ê¿Û•‡Ñ«»0;YÌO)”[Ð׺q°vÚýë)›®1?[„±›êcSUU…ßýî T*•ØÝ²¢ìŸ """"b CI€¹¹9|ôÑyY'„˜†4qW$C¥~ 5NIþ€§äß4¤á²~qþ†V{Êß´Y‰Û×wúFûs-øg€ˆˆˆˆ˜H_à€¶lKø'ÏèêíÑ)ot§)Û„¾v5îeÝRÅíÊÃø7ê€rrŠÍÛï/%4o?žã2vS6!óòËÇðÖ[oe}ðÏ1ÞDÀ%Á—;N|ôÑyÌÍÍÉî55Ÿ\¹µ/çû«Ù ’2^©_ÃkÐ{Kĥ¶Pˆ¾2Žø'@S¶‰Îî§ä˜ŒÝTG–euެëöÏ1 ‘$ÀgŸý-fffdõzÊ-´w-G ÈíËù°?̇íÇB¸W=òýÅ åö>¿¾¹àR øü'Wu£ Í'W¶ý8nWf'»©†m¡0êí;;;}+sYñÿƒÙ¶¯™ """"&ÒŸèpV캋/âÖ­oe÷šŽ6?Aý+ޏÖ[—;·+Ÿÿ¾œ%ÿI )ÛDÃ+èkWãšÒávåa~¶È·„_,‰•J…ÎÎN44Ô‡ þ_«¨Ø7‘û™ """"b 3I€xú„ó2Õ.¬]E¥~-듟\ÓH3ÅG¡Ü‚v¿g©¿]"É€U×O%‰kGÜû¿¼¼¿þõ¯Â-ó7ÏÈÿD¶î[&ˆˆˆˆˆ €Ì% ¾P|ÝÌÌ|öÙg²^! R¿æI\“l ¢â]ö2ïðáÃøõ¯®Ùß<#ÿ+Ù¼˜ """"&2›¨ó&tÁ×---á³ÏþV–̓iÊ6QÓèÊŠi þå§©éu¼õÖ[á®îð^¶ÿLÒH”ø @]ðuN§W®\‘e_AýqŠ•OqÿÇhÊ6ahµ3ø§´P©Txë­·Â5û€sûzre0@DDDDLH' ºB ï¾ÚýëhïZ–õÈÿülnîÄül?d¢ªª n¾ÿ <£þý¹´O˜ """"&¤•xÀ'b×ÍÍÍá³ÏþKKK²{]ÉZê-]l …°/çãÞlf'‹Ùé_fêÑÙÙn¾¿À/³¹ÙDDDDÄ€|’„ièt:qñâEŒËîuZí¨?îÔ6Ù—óa[(„m¡÷,ðýNò¤R©ÐÚÚŠ¦¦×ÃÝÄä þWrqÿ0@DDDDLH3  ó&êÄ®¿uë[\¹rEv«4Ÿ\Au£+£Û0;YŒ»“ŘŸ-âÈ~‰RòŸVTì{/—÷DDDDÄ€´ŸxWì:¹®‰$€}9cߨ1mVÂíÊ㉕ešš^Gkkk¸’ÿ§**ö æú~b€ˆˆˆˆ˜~  À%ˆL €¡¡! Éê5ÕwàhÓ_cÀÑ«¥˜T R¿†ƒµ«Ð׺·Ý4жPèíÿGËú³Tyy9:;;qøð¡p7™€§äß½Å1 —$€¦ÌÍÍáâÅ¿“U5€¦l ¯8 ¯]…¦l3d‰½Jý\C¥Þ …ò)´û×CÃíʃm¡ÀðÿXˆGóaû±Ýús@”FKþ™ """"&džèp6Üõr¬…r Úý Ü)*•J…ÎÎN44Ô‡»É <£þ&î-&ˆˆˆˆˆ ¹' ðL Љ]/Çj¢XD™ëƒðÌ÷_áÞb€ˆˆˆˆ˜È–$@)€Ot„»ÍÐЮ_¿!»•ˆ‚Å0×À¹ŠŠ}Ÿro1@DDDDLdk"  .--áÊ•+çÎ"ÙQ©T¾QÿLðŒú[¸Ç˜ """"&²= PêM´…»ÍØØ8®\¹‚¥¥%î0’…††z¼õÖ[(//w“pÔŸ """"b GDè pZI_ åþ€g®ÿ{õg€ˆˆˆˆ˜Èå$@)<«¼î6KKK­[ßr‡‘d¨T*´¶¶¢©éõH7[§Ü{Œ """"b€<‰€:xšÂÝfnnW®\ÅÌÌ weT[[+^ýõHÝýàSxJþW¸Ç˜ """"&(4ÐáM”†»ÍÌÌ\¹r…ËRÚ½üò1´¶¶Fšçxšü½WQ±o‚{Œ """"b€"'JeZܺõ-†††Ø(¤ø[àñïçc€ˆˆˆˆ˜ ø:xš˜ þ+þàS–û3@DDDDLÐöx*˜ )þÐϨ¿…{ """"b€’—èð&t‘n766Ž7n°Y ¥2ð7ÁÓÝŸ?DDDDÄe:03s7n\ÇØØ8w…¥R©ÐÔô:Ž;k஢bŸ‰{Ž """"b€$–XZZÂ7pëÖ·p:Üq(//Gkk+ê£-çÇÀŸ """"b€ 9%œN§oz—Ì]/¿| ÇŽ½ŒÃ‡ÅrsþLLÈ5sss¸qãÆÆÆYÊË˽Leþ€§¹ßeþLLH;Ðà7ˆ²jÀª€l¦R©ÐÐPÏhÿ €A°«?DDDDIJKÔy±Ü~ii ß~û-nÝú–K ÊXCC=êëbÛ—|ZQ±o…{ """"b€ ù&J¼ àÄ0=ðLøöÛo166Îd€ >|ÇŽ‹'è<óû/WTìëçd€ˆˆˆˆ˜` û’mÞD@[¬÷’33w8M@B鄪ªªxï>ÏÜþAŽö3@DDDDL0@ÁÉ€6­‰$œN'ffî0! •J…ªª*>|Èô'ÀÏhÿ劊}Ü«LLPJ“!!077‡¹¹{l(觪ª UUpèÐaTUHd„_0g ýô3@DDDDL0@ÛJü’ºDÇétbnîž/)°´ô '*öù{ö”ûFù·É`,ïg€ˆˆˆˆˆ Ja2@çM¼ À€«üÍÍÍÁétáÎ,--aié÷ùT TUUA¥RáðáCP*=åüåå{P^^žŒ‡·øý¦ŠŠ}+<™ """"b€Ò0xBB ©„„€ÓéĽ{s—BUAêª>ìä€J¥òøþ—%™ðí ø-<Ó˜ """"b€¤˜¨ó&ê°)‰* â•¢`>Þ ø‰ """"b€d›ÐyBR@—‰¤€„ÁþŸLTTì3ñ,!&ˆˆˆˆˆ ÊÖ¤@©_R࿟K³,Ð_gTßÀÂ`Ÿ˜ """"&ˆž% Þ…ÿ_õþ/µÅûožÑüoÐoa ?1ø'"""¢¬JeÊââO¿_ AW¿€íM1˜ðH$Ѐ•}ûž›à """""&ˆˆˆˆˆˆˆˆ """""""b€ˆˆˆˆˆˆˆ˜ """""""&ˆˆˆˆˆˆˆ˜ """""""&ˆˆˆˆˆˆˆˆ """""""b€ˆˆˆˆˆˆˆ˜ """""""&ˆˆˆˆˆˆˆˆ """""""b€ˆˆˆˆˆˆˆ &ˆˆˆˆˆˆˆ˜ """""""&ˆˆˆˆˆˆˆˆ """""""’„ÿÿ¹âÌ–/ÌIEND®B`‚MoarVM-2015.11/3rdparty/libuv/img/logos.svg0000644000175000017500000017722412456307253017405 0ustar jnthnjnthn image/svg+xml MoarVM-2015.11/3rdparty/libuv/include/android-ifaddrs.h0000644000175000017500000000347512456307253021607 0ustar jnthnjnthn/* * Copyright (c) 1995, 1999 * Berkeley Software Design, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp */ #ifndef _IFADDRS_H_ #define _IFADDRS_H_ struct ifaddrs { struct ifaddrs *ifa_next; char *ifa_name; unsigned int ifa_flags; struct sockaddr *ifa_addr; struct sockaddr *ifa_netmask; struct sockaddr *ifa_dstaddr; void *ifa_data; }; /* * This may have been defined in . Note that if is * to be included it must be included before this header file. */ #ifndef ifa_broadaddr #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ #endif #include __BEGIN_DECLS extern int getifaddrs(struct ifaddrs **ifap); extern void freeifaddrs(struct ifaddrs *ifa); __END_DECLS #endif MoarVM-2015.11/3rdparty/libuv/include/pthread-fixes.h0000644000175000017500000000556112456307253021316 0ustar jnthnjnthn/* Copyright (c) 2013, Sony Mobile Communications AB * Copyright (c) 2012, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H #define GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H #include /*Android doesn't provide pthread_barrier_t for now.*/ #ifndef PTHREAD_BARRIER_SERIAL_THREAD /* Anything except 0 will do here.*/ #define PTHREAD_BARRIER_SERIAL_THREAD 0x12345 typedef struct { pthread_mutex_t mutex; pthread_cond_t cond; unsigned count; } pthread_barrier_t; int pthread_barrier_init(pthread_barrier_t* barrier, const void* barrier_attr, unsigned count); int pthread_barrier_wait(pthread_barrier_t* barrier); int pthread_barrier_destroy(pthread_barrier_t *barrier); #endif /* defined(PTHREAD_BARRIER_SERIAL_THREAD) */ int pthread_yield(void); /* Workaround pthread_sigmask() returning EINVAL on versions < 4.1 by * replacing all calls to pthread_sigmask with sigprocmask. See: * https://android.googlesource.com/platform/bionic/+/9bf330b5 * https://code.google.com/p/android/issues/detail?id=15337 */ int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset); #ifdef pthread_sigmask #undef pthread_sigmask #endif #define pthread_sigmask(how, set, oldset) uv__pthread_sigmask(how, set, oldset) #endif /* GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H */ MoarVM-2015.11/3rdparty/libuv/include/stdint-msvc2008.h0000644000175000017500000001706012456307253021335 0ustar jnthnjnthn// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2008 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_STDINT_H_ ] MoarVM-2015.11/3rdparty/libuv/include/tree.h0000644000175000017500000014723112456307253017513 0ustar jnthnjnthn/*- * Copyright 2002 Niels Provos * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UV_TREE_H_ #define UV_TREE_H_ #ifndef UV__UNUSED # if __GNUC__ # define UV__UNUSED __attribute__((unused)) # else # define UV__UNUSED # endif #endif /* * This file defines data structures for different types of trees: * splay trees and red-black trees. * * A splay tree is a self-organizing data structure. Every operation * on the tree causes a splay to happen. The splay moves the requested * node to the root of the tree and partly rebalances it. * * This has the benefit that request locality causes faster lookups as * the requested nodes move to the top of the tree. On the other hand, * every lookup causes memory writes. * * The Balance Theorem bounds the total access time for m operations * and n inserts on an initially empty tree as O((m + n)lg n). The * amortized cost for a sequence of m accesses to a splay tree is O(lg n); * * A red-black tree is a binary search tree with the node color as an * extra attribute. It fulfills a set of conditions: * - every search path from the root to a leaf consists of the * same number of black nodes, * - each red node (except for the root) has a black parent, * - each leaf node is black. * * Every operation on a red-black tree is bounded as O(lg n). * The maximum height of a red-black tree is 2lg (n+1). */ #define SPLAY_HEAD(name, type) \ struct name { \ struct type *sph_root; /* root of the tree */ \ } #define SPLAY_INITIALIZER(root) \ { NULL } #define SPLAY_INIT(root) do { \ (root)->sph_root = NULL; \ } while (/*CONSTCOND*/ 0) #define SPLAY_ENTRY(type) \ struct { \ struct type *spe_left; /* left element */ \ struct type *spe_right; /* right element */ \ } #define SPLAY_LEFT(elm, field) (elm)->field.spe_left #define SPLAY_RIGHT(elm, field) (elm)->field.spe_right #define SPLAY_ROOT(head) (head)->sph_root #define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) /* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ #define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ } while (/*CONSTCOND*/ 0) #define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ } while (/*CONSTCOND*/ 0) #define SPLAY_LINKLEFT(head, tmp, field) do { \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ } while (/*CONSTCOND*/ 0) #define SPLAY_LINKRIGHT(head, tmp, field) do { \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ } while (/*CONSTCOND*/ 0) #define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field); \ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ } while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ #define SPLAY_PROTOTYPE(name, type, field, cmp) \ void name##_SPLAY(struct name *, struct type *); \ void name##_SPLAY_MINMAX(struct name *, int); \ struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ \ /* Finds the node with the same key as elm */ \ static __inline struct type * \ name##_SPLAY_FIND(struct name *head, struct type *elm) \ { \ if (SPLAY_EMPTY(head)) \ return(NULL); \ name##_SPLAY(head, elm); \ if ((cmp)(elm, (head)->sph_root) == 0) \ return (head->sph_root); \ return (NULL); \ } \ \ static __inline struct type * \ name##_SPLAY_NEXT(struct name *head, struct type *elm) \ { \ name##_SPLAY(head, elm); \ if (SPLAY_RIGHT(elm, field) != NULL) { \ elm = SPLAY_RIGHT(elm, field); \ while (SPLAY_LEFT(elm, field) != NULL) { \ elm = SPLAY_LEFT(elm, field); \ } \ } else \ elm = NULL; \ return (elm); \ } \ \ static __inline struct type * \ name##_SPLAY_MIN_MAX(struct name *head, int val) \ { \ name##_SPLAY_MINMAX(head, val); \ return (SPLAY_ROOT(head)); \ } /* Main splay operation. * Moves node close to the key of elm to top */ #define SPLAY_GENERATE(name, type, field, cmp) \ struct type * \ name##_SPLAY_INSERT(struct name *head, struct type *elm) \ { \ if (SPLAY_EMPTY(head)) { \ SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ } else { \ int __comp; \ name##_SPLAY(head, elm); \ __comp = (cmp)(elm, (head)->sph_root); \ if(__comp < 0) { \ SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field); \ SPLAY_RIGHT(elm, field) = (head)->sph_root; \ SPLAY_LEFT((head)->sph_root, field) = NULL; \ } else if (__comp > 0) { \ SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field); \ SPLAY_LEFT(elm, field) = (head)->sph_root; \ SPLAY_RIGHT((head)->sph_root, field) = NULL; \ } else \ return ((head)->sph_root); \ } \ (head)->sph_root = (elm); \ return (NULL); \ } \ \ struct type * \ name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ { \ struct type *__tmp; \ if (SPLAY_EMPTY(head)) \ return (NULL); \ name##_SPLAY(head, elm); \ if ((cmp)(elm, (head)->sph_root) == 0) { \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ } else { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ name##_SPLAY(head, elm); \ SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ } \ return (elm); \ } \ return (NULL); \ } \ \ void \ name##_SPLAY(struct name *head, struct type *elm) \ { \ struct type __node, *__left, *__right, *__tmp; \ int __comp; \ \ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ __left = __right = &__node; \ \ while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ if (__comp < 0) { \ __tmp = SPLAY_LEFT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if ((cmp)(elm, __tmp) < 0){ \ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKLEFT(head, __right, field); \ } else if (__comp > 0) { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if ((cmp)(elm, __tmp) > 0){ \ SPLAY_ROTATE_LEFT(head, __tmp, field); \ if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKRIGHT(head, __left, field); \ } \ } \ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ } \ \ /* Splay with either the minimum or the maximum element \ * Used to find minimum or maximum element in tree. \ */ \ void name##_SPLAY_MINMAX(struct name *head, int __comp) \ { \ struct type __node, *__left, *__right, *__tmp; \ \ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ __left = __right = &__node; \ \ while (1) { \ if (__comp < 0) { \ __tmp = SPLAY_LEFT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if (__comp < 0){ \ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKLEFT(head, __right, field); \ } else if (__comp > 0) { \ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ if (__tmp == NULL) \ break; \ if (__comp > 0) { \ SPLAY_ROTATE_LEFT(head, __tmp, field); \ if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ break; \ } \ SPLAY_LINKRIGHT(head, __left, field); \ } \ } \ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ } #define SPLAY_NEGINF -1 #define SPLAY_INF 1 #define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) #define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) #define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) #define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) #define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) #define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) #define SPLAY_FOREACH(x, name, head) \ for ((x) = SPLAY_MIN(name, head); \ (x) != NULL; \ (x) = SPLAY_NEXT(name, head, x)) /* Macros that define a red-black tree */ #define RB_HEAD(name, type) \ struct name { \ struct type *rbh_root; /* root of the tree */ \ } #define RB_INITIALIZER(root) \ { NULL } #define RB_INIT(root) do { \ (root)->rbh_root = NULL; \ } while (/*CONSTCOND*/ 0) #define RB_BLACK 0 #define RB_RED 1 #define RB_ENTRY(type) \ struct { \ struct type *rbe_left; /* left element */ \ struct type *rbe_right; /* right element */ \ struct type *rbe_parent; /* parent element */ \ int rbe_color; /* node color */ \ } #define RB_LEFT(elm, field) (elm)->field.rbe_left #define RB_RIGHT(elm, field) (elm)->field.rbe_right #define RB_PARENT(elm, field) (elm)->field.rbe_parent #define RB_COLOR(elm, field) (elm)->field.rbe_color #define RB_ROOT(head) (head)->rbh_root #define RB_EMPTY(head) (RB_ROOT(head) == NULL) #define RB_SET(elm, parent, field) do { \ RB_PARENT(elm, field) = parent; \ RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ RB_COLOR(elm, field) = RB_RED; \ } while (/*CONSTCOND*/ 0) #define RB_SET_BLACKRED(black, red, field) do { \ RB_COLOR(black, field) = RB_BLACK; \ RB_COLOR(red, field) = RB_RED; \ } while (/*CONSTCOND*/ 0) #ifndef RB_AUGMENT #define RB_AUGMENT(x) do {} while (0) #endif #define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ (tmp) = RB_RIGHT(elm, field); \ if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ } else \ (head)->rbh_root = (tmp); \ RB_LEFT(tmp, field) = (elm); \ RB_PARENT(elm, field) = (tmp); \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ } while (/*CONSTCOND*/ 0) #define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ (tmp) = RB_LEFT(elm, field); \ if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ } else \ (head)->rbh_root = (tmp); \ RB_RIGHT(tmp, field) = (elm); \ RB_PARENT(elm, field) = (tmp); \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ } while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ #define RB_PROTOTYPE(name, type, field, cmp) \ RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) #define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static) #define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ attr struct type *name##_RB_INSERT(struct name *, struct type *); \ attr struct type *name##_RB_FIND(struct name *, struct type *); \ attr struct type *name##_RB_NFIND(struct name *, struct type *); \ attr struct type *name##_RB_NEXT(struct type *); \ attr struct type *name##_RB_PREV(struct type *); \ attr struct type *name##_RB_MINMAX(struct name *, int); \ \ /* Main rb operation. * Moves node close to the key of elm to top */ #define RB_GENERATE(name, type, field, cmp) \ RB_GENERATE_INTERNAL(name, type, field, cmp,) #define RB_GENERATE_STATIC(name, type, field, cmp) \ RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static) #define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ attr void \ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ { \ struct type *parent, *gparent, *tmp; \ while ((parent = RB_PARENT(elm, field)) != NULL && \ RB_COLOR(parent, field) == RB_RED) { \ gparent = RB_PARENT(parent, field); \ if (parent == RB_LEFT(gparent, field)) { \ tmp = RB_RIGHT(gparent, field); \ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ RB_COLOR(tmp, field) = RB_BLACK; \ RB_SET_BLACKRED(parent, gparent, field); \ elm = gparent; \ continue; \ } \ if (RB_RIGHT(parent, field) == elm) { \ RB_ROTATE_LEFT(head, parent, tmp, field); \ tmp = parent; \ parent = elm; \ elm = tmp; \ } \ RB_SET_BLACKRED(parent, gparent, field); \ RB_ROTATE_RIGHT(head, gparent, tmp, field); \ } else { \ tmp = RB_LEFT(gparent, field); \ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ RB_COLOR(tmp, field) = RB_BLACK; \ RB_SET_BLACKRED(parent, gparent, field); \ elm = gparent; \ continue; \ } \ if (RB_LEFT(parent, field) == elm) { \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ tmp = parent; \ parent = elm; \ elm = tmp; \ } \ RB_SET_BLACKRED(parent, gparent, field); \ RB_ROTATE_LEFT(head, gparent, tmp, field); \ } \ } \ RB_COLOR(head->rbh_root, field) = RB_BLACK; \ } \ \ attr void \ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \ struct type *elm) \ { \ struct type *tmp; \ while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ elm != RB_ROOT(head)) { \ if (RB_LEFT(parent, field) == elm) { \ tmp = RB_RIGHT(parent, field); \ if (RB_COLOR(tmp, field) == RB_RED) { \ RB_SET_BLACKRED(tmp, parent, field); \ RB_ROTATE_LEFT(head, parent, tmp, field); \ tmp = RB_RIGHT(parent, field); \ } \ if ((RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ RB_COLOR(tmp, field) = RB_RED; \ elm = parent; \ parent = RB_PARENT(elm, field); \ } else { \ if (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \ struct type *oleft; \ if ((oleft = RB_LEFT(tmp, field)) \ != NULL) \ RB_COLOR(oleft, field) = RB_BLACK; \ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_RIGHT(head, tmp, oleft, field); \ tmp = RB_RIGHT(parent, field); \ } \ RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ RB_COLOR(parent, field) = RB_BLACK; \ if (RB_RIGHT(tmp, field)) \ RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ RB_ROTATE_LEFT(head, parent, tmp, field); \ elm = RB_ROOT(head); \ break; \ } \ } else { \ tmp = RB_LEFT(parent, field); \ if (RB_COLOR(tmp, field) == RB_RED) { \ RB_SET_BLACKRED(tmp, parent, field); \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ tmp = RB_LEFT(parent, field); \ } \ if ((RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ RB_COLOR(tmp, field) = RB_RED; \ elm = parent; \ parent = RB_PARENT(elm, field); \ } else { \ if (RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \ struct type *oright; \ if ((oright = RB_RIGHT(tmp, field)) \ != NULL) \ RB_COLOR(oright, field) = RB_BLACK; \ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_LEFT(head, tmp, oright, field); \ tmp = RB_LEFT(parent, field); \ } \ RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ RB_COLOR(parent, field) = RB_BLACK; \ if (RB_LEFT(tmp, field)) \ RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ RB_ROTATE_RIGHT(head, parent, tmp, field); \ elm = RB_ROOT(head); \ break; \ } \ } \ } \ if (elm) \ RB_COLOR(elm, field) = RB_BLACK; \ } \ \ attr struct type * \ name##_RB_REMOVE(struct name *head, struct type *elm) \ { \ struct type *child, *parent, *old = elm; \ int color; \ if (RB_LEFT(elm, field) == NULL) \ child = RB_RIGHT(elm, field); \ else if (RB_RIGHT(elm, field) == NULL) \ child = RB_LEFT(elm, field); \ else { \ struct type *left; \ elm = RB_RIGHT(elm, field); \ while ((left = RB_LEFT(elm, field)) != NULL) \ elm = left; \ child = RB_RIGHT(elm, field); \ parent = RB_PARENT(elm, field); \ color = RB_COLOR(elm, field); \ if (child) \ RB_PARENT(child, field) = parent; \ if (parent) { \ if (RB_LEFT(parent, field) == elm) \ RB_LEFT(parent, field) = child; \ else \ RB_RIGHT(parent, field) = child; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = child; \ if (RB_PARENT(elm, field) == old) \ parent = elm; \ (elm)->field = (old)->field; \ if (RB_PARENT(old, field)) { \ if (RB_LEFT(RB_PARENT(old, field), field) == old) \ RB_LEFT(RB_PARENT(old, field), field) = elm; \ else \ RB_RIGHT(RB_PARENT(old, field), field) = elm; \ RB_AUGMENT(RB_PARENT(old, field)); \ } else \ RB_ROOT(head) = elm; \ RB_PARENT(RB_LEFT(old, field), field) = elm; \ if (RB_RIGHT(old, field)) \ RB_PARENT(RB_RIGHT(old, field), field) = elm; \ if (parent) { \ left = parent; \ do { \ RB_AUGMENT(left); \ } while ((left = RB_PARENT(left, field)) != NULL); \ } \ goto color; \ } \ parent = RB_PARENT(elm, field); \ color = RB_COLOR(elm, field); \ if (child) \ RB_PARENT(child, field) = parent; \ if (parent) { \ if (RB_LEFT(parent, field) == elm) \ RB_LEFT(parent, field) = child; \ else \ RB_RIGHT(parent, field) = child; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = child; \ color: \ if (color == RB_BLACK) \ name##_RB_REMOVE_COLOR(head, parent, child); \ return (old); \ } \ \ /* Inserts a node into the RB tree */ \ attr struct type * \ name##_RB_INSERT(struct name *head, struct type *elm) \ { \ struct type *tmp; \ struct type *parent = NULL; \ int comp = 0; \ tmp = RB_ROOT(head); \ while (tmp) { \ parent = tmp; \ comp = (cmp)(elm, parent); \ if (comp < 0) \ tmp = RB_LEFT(tmp, field); \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ RB_SET(elm, parent, field); \ if (parent != NULL) { \ if (comp < 0) \ RB_LEFT(parent, field) = elm; \ else \ RB_RIGHT(parent, field) = elm; \ RB_AUGMENT(parent); \ } else \ RB_ROOT(head) = elm; \ name##_RB_INSERT_COLOR(head, elm); \ return (NULL); \ } \ \ /* Finds the node with the same key as elm */ \ attr struct type * \ name##_RB_FIND(struct name *head, struct type *elm) \ { \ struct type *tmp = RB_ROOT(head); \ int comp; \ while (tmp) { \ comp = cmp(elm, tmp); \ if (comp < 0) \ tmp = RB_LEFT(tmp, field); \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ return (NULL); \ } \ \ /* Finds the first node greater than or equal to the search key */ \ attr struct type * \ name##_RB_NFIND(struct name *head, struct type *elm) \ { \ struct type *tmp = RB_ROOT(head); \ struct type *res = NULL; \ int comp; \ while (tmp) { \ comp = cmp(elm, tmp); \ if (comp < 0) { \ res = tmp; \ tmp = RB_LEFT(tmp, field); \ } \ else if (comp > 0) \ tmp = RB_RIGHT(tmp, field); \ else \ return (tmp); \ } \ return (res); \ } \ \ /* ARGSUSED */ \ attr struct type * \ name##_RB_NEXT(struct type *elm) \ { \ if (RB_RIGHT(elm, field)) { \ elm = RB_RIGHT(elm, field); \ while (RB_LEFT(elm, field)) \ elm = RB_LEFT(elm, field); \ } else { \ if (RB_PARENT(elm, field) && \ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ else { \ while (RB_PARENT(elm, field) && \ (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ elm = RB_PARENT(elm, field); \ } \ } \ return (elm); \ } \ \ /* ARGSUSED */ \ attr struct type * \ name##_RB_PREV(struct type *elm) \ { \ if (RB_LEFT(elm, field)) { \ elm = RB_LEFT(elm, field); \ while (RB_RIGHT(elm, field)) \ elm = RB_RIGHT(elm, field); \ } else { \ if (RB_PARENT(elm, field) && \ (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ else { \ while (RB_PARENT(elm, field) && \ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ elm = RB_PARENT(elm, field); \ } \ } \ return (elm); \ } \ \ attr struct type * \ name##_RB_MINMAX(struct name *head, int val) \ { \ struct type *tmp = RB_ROOT(head); \ struct type *parent = NULL; \ while (tmp) { \ parent = tmp; \ if (val < 0) \ tmp = RB_LEFT(tmp, field); \ else \ tmp = RB_RIGHT(tmp, field); \ } \ return (parent); \ } #define RB_NEGINF -1 #define RB_INF 1 #define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) #define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) #define RB_FIND(name, x, y) name##_RB_FIND(x, y) #define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) #define RB_NEXT(name, x, y) name##_RB_NEXT(y) #define RB_PREV(name, x, y) name##_RB_PREV(y) #define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) #define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) #define RB_FOREACH(x, name, head) \ for ((x) = RB_MIN(name, head); \ (x) != NULL; \ (x) = name##_RB_NEXT(x)) #define RB_FOREACH_FROM(x, name, y) \ for ((x) = (y); \ ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_SAFE(x, name, head, y) \ for ((x) = RB_MIN(name, head); \ ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_REVERSE(x, name, head) \ for ((x) = RB_MAX(name, head); \ (x) != NULL; \ (x) = name##_RB_PREV(x)) #define RB_FOREACH_REVERSE_FROM(x, name, y) \ for ((x) = (y); \ ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ (x) = (y)) #define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ for ((x) = RB_MAX(name, head); \ ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ (x) = (y)) #endif /* UV_TREE_H_ */ MoarVM-2015.11/3rdparty/libuv/include/uv-aix.h0000644000175000017500000000311712456307253017757 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_AIX_H #define UV_AIX_H #define UV_PLATFORM_LOOP_FIELDS \ int fs_fd; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ char *dir_filename; \ #endif /* UV_AIX_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-bsd.h0000644000175000017500000000315112456307253017744 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_BSD_H #define UV_BSD_H #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ #define UV_IO_PRIVATE_PLATFORM_FIELDS \ int rcount; \ int wcount; \ #define UV_HAVE_KQUEUE 1 #endif /* UV_BSD_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-darwin.h0000644000175000017500000000621512456307253020464 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_DARWIN_H #define UV_DARWIN_H #if defined(__APPLE__) && defined(__MACH__) # include # include # include # include # define UV_PLATFORM_SEM_T semaphore_t #endif #define UV_IO_PRIVATE_PLATFORM_FIELDS \ int rcount; \ int wcount; \ #define UV_PLATFORM_LOOP_FIELDS \ uv_thread_t cf_thread; \ void* _cf_reserved; \ void* cf_state; \ uv_mutex_t cf_mutex; \ uv_sem_t cf_sem; \ void* cf_signals[2]; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ uv__io_t event_watcher; \ char* realpath; \ int realpath_len; \ int cf_flags; \ uv_async_t* cf_cb; \ void* cf_events[2]; \ void* cf_member[2]; \ int cf_error; \ uv_mutex_t cf_mutex; \ #define UV_STREAM_PRIVATE_PLATFORM_FIELDS \ void* select; \ #define UV_HAVE_KQUEUE 1 #endif /* UV_DARWIN_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-errno.h0000644000175000017500000002132712456307253020326 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_ERRNO_H_ #define UV_ERRNO_H_ #include #define UV__EOF (-4095) #define UV__UNKNOWN (-4094) #define UV__EAI_ADDRFAMILY (-3000) #define UV__EAI_AGAIN (-3001) #define UV__EAI_BADFLAGS (-3002) #define UV__EAI_CANCELED (-3003) #define UV__EAI_FAIL (-3004) #define UV__EAI_FAMILY (-3005) #define UV__EAI_MEMORY (-3006) #define UV__EAI_NODATA (-3007) #define UV__EAI_NONAME (-3008) #define UV__EAI_OVERFLOW (-3009) #define UV__EAI_SERVICE (-3010) #define UV__EAI_SOCKTYPE (-3011) #define UV__EAI_BADHINTS (-3013) #define UV__EAI_PROTOCOL (-3014) /* Only map to the system errno on non-Windows platforms. It's apparently * a fairly common practice for Windows programmers to redefine errno codes. */ #if defined(E2BIG) && !defined(_WIN32) # define UV__E2BIG (-E2BIG) #else # define UV__E2BIG (-4093) #endif #if defined(EACCES) && !defined(_WIN32) # define UV__EACCES (-EACCES) #else # define UV__EACCES (-4092) #endif #if defined(EADDRINUSE) && !defined(_WIN32) # define UV__EADDRINUSE (-EADDRINUSE) #else # define UV__EADDRINUSE (-4091) #endif #if defined(EADDRNOTAVAIL) && !defined(_WIN32) # define UV__EADDRNOTAVAIL (-EADDRNOTAVAIL) #else # define UV__EADDRNOTAVAIL (-4090) #endif #if defined(EAFNOSUPPORT) && !defined(_WIN32) # define UV__EAFNOSUPPORT (-EAFNOSUPPORT) #else # define UV__EAFNOSUPPORT (-4089) #endif #if defined(EAGAIN) && !defined(_WIN32) # define UV__EAGAIN (-EAGAIN) #else # define UV__EAGAIN (-4088) #endif #if defined(EALREADY) && !defined(_WIN32) # define UV__EALREADY (-EALREADY) #else # define UV__EALREADY (-4084) #endif #if defined(EBADF) && !defined(_WIN32) # define UV__EBADF (-EBADF) #else # define UV__EBADF (-4083) #endif #if defined(EBUSY) && !defined(_WIN32) # define UV__EBUSY (-EBUSY) #else # define UV__EBUSY (-4082) #endif #if defined(ECANCELED) && !defined(_WIN32) # define UV__ECANCELED (-ECANCELED) #else # define UV__ECANCELED (-4081) #endif #if defined(ECHARSET) && !defined(_WIN32) # define UV__ECHARSET (-ECHARSET) #else # define UV__ECHARSET (-4080) #endif #if defined(ECONNABORTED) && !defined(_WIN32) # define UV__ECONNABORTED (-ECONNABORTED) #else # define UV__ECONNABORTED (-4079) #endif #if defined(ECONNREFUSED) && !defined(_WIN32) # define UV__ECONNREFUSED (-ECONNREFUSED) #else # define UV__ECONNREFUSED (-4078) #endif #if defined(ECONNRESET) && !defined(_WIN32) # define UV__ECONNRESET (-ECONNRESET) #else # define UV__ECONNRESET (-4077) #endif #if defined(EDESTADDRREQ) && !defined(_WIN32) # define UV__EDESTADDRREQ (-EDESTADDRREQ) #else # define UV__EDESTADDRREQ (-4076) #endif #if defined(EEXIST) && !defined(_WIN32) # define UV__EEXIST (-EEXIST) #else # define UV__EEXIST (-4075) #endif #if defined(EFAULT) && !defined(_WIN32) # define UV__EFAULT (-EFAULT) #else # define UV__EFAULT (-4074) #endif #if defined(EHOSTUNREACH) && !defined(_WIN32) # define UV__EHOSTUNREACH (-EHOSTUNREACH) #else # define UV__EHOSTUNREACH (-4073) #endif #if defined(EINTR) && !defined(_WIN32) # define UV__EINTR (-EINTR) #else # define UV__EINTR (-4072) #endif #if defined(EINVAL) && !defined(_WIN32) # define UV__EINVAL (-EINVAL) #else # define UV__EINVAL (-4071) #endif #if defined(EIO) && !defined(_WIN32) # define UV__EIO (-EIO) #else # define UV__EIO (-4070) #endif #if defined(EISCONN) && !defined(_WIN32) # define UV__EISCONN (-EISCONN) #else # define UV__EISCONN (-4069) #endif #if defined(EISDIR) && !defined(_WIN32) # define UV__EISDIR (-EISDIR) #else # define UV__EISDIR (-4068) #endif #if defined(ELOOP) && !defined(_WIN32) # define UV__ELOOP (-ELOOP) #else # define UV__ELOOP (-4067) #endif #if defined(EMFILE) && !defined(_WIN32) # define UV__EMFILE (-EMFILE) #else # define UV__EMFILE (-4066) #endif #if defined(EMSGSIZE) && !defined(_WIN32) # define UV__EMSGSIZE (-EMSGSIZE) #else # define UV__EMSGSIZE (-4065) #endif #if defined(ENAMETOOLONG) && !defined(_WIN32) # define UV__ENAMETOOLONG (-ENAMETOOLONG) #else # define UV__ENAMETOOLONG (-4064) #endif #if defined(ENETDOWN) && !defined(_WIN32) # define UV__ENETDOWN (-ENETDOWN) #else # define UV__ENETDOWN (-4063) #endif #if defined(ENETUNREACH) && !defined(_WIN32) # define UV__ENETUNREACH (-ENETUNREACH) #else # define UV__ENETUNREACH (-4062) #endif #if defined(ENFILE) && !defined(_WIN32) # define UV__ENFILE (-ENFILE) #else # define UV__ENFILE (-4061) #endif #if defined(ENOBUFS) && !defined(_WIN32) # define UV__ENOBUFS (-ENOBUFS) #else # define UV__ENOBUFS (-4060) #endif #if defined(ENODEV) && !defined(_WIN32) # define UV__ENODEV (-ENODEV) #else # define UV__ENODEV (-4059) #endif #if defined(ENOENT) && !defined(_WIN32) # define UV__ENOENT (-ENOENT) #else # define UV__ENOENT (-4058) #endif #if defined(ENOMEM) && !defined(_WIN32) # define UV__ENOMEM (-ENOMEM) #else # define UV__ENOMEM (-4057) #endif #if defined(ENONET) && !defined(_WIN32) # define UV__ENONET (-ENONET) #else # define UV__ENONET (-4056) #endif #if defined(ENOSPC) && !defined(_WIN32) # define UV__ENOSPC (-ENOSPC) #else # define UV__ENOSPC (-4055) #endif #if defined(ENOSYS) && !defined(_WIN32) # define UV__ENOSYS (-ENOSYS) #else # define UV__ENOSYS (-4054) #endif #if defined(ENOTCONN) && !defined(_WIN32) # define UV__ENOTCONN (-ENOTCONN) #else # define UV__ENOTCONN (-4053) #endif #if defined(ENOTDIR) && !defined(_WIN32) # define UV__ENOTDIR (-ENOTDIR) #else # define UV__ENOTDIR (-4052) #endif #if defined(ENOTEMPTY) && !defined(_WIN32) # define UV__ENOTEMPTY (-ENOTEMPTY) #else # define UV__ENOTEMPTY (-4051) #endif #if defined(ENOTSOCK) && !defined(_WIN32) # define UV__ENOTSOCK (-ENOTSOCK) #else # define UV__ENOTSOCK (-4050) #endif #if defined(ENOTSUP) && !defined(_WIN32) # define UV__ENOTSUP (-ENOTSUP) #else # define UV__ENOTSUP (-4049) #endif #if defined(EPERM) && !defined(_WIN32) # define UV__EPERM (-EPERM) #else # define UV__EPERM (-4048) #endif #if defined(EPIPE) && !defined(_WIN32) # define UV__EPIPE (-EPIPE) #else # define UV__EPIPE (-4047) #endif #if defined(EPROTO) && !defined(_WIN32) # define UV__EPROTO (-EPROTO) #else # define UV__EPROTO (-4046) #endif #if defined(EPROTONOSUPPORT) && !defined(_WIN32) # define UV__EPROTONOSUPPORT (-EPROTONOSUPPORT) #else # define UV__EPROTONOSUPPORT (-4045) #endif #if defined(EPROTOTYPE) && !defined(_WIN32) # define UV__EPROTOTYPE (-EPROTOTYPE) #else # define UV__EPROTOTYPE (-4044) #endif #if defined(EROFS) && !defined(_WIN32) # define UV__EROFS (-EROFS) #else # define UV__EROFS (-4043) #endif #if defined(ESHUTDOWN) && !defined(_WIN32) # define UV__ESHUTDOWN (-ESHUTDOWN) #else # define UV__ESHUTDOWN (-4042) #endif #if defined(ESPIPE) && !defined(_WIN32) # define UV__ESPIPE (-ESPIPE) #else # define UV__ESPIPE (-4041) #endif #if defined(ESRCH) && !defined(_WIN32) # define UV__ESRCH (-ESRCH) #else # define UV__ESRCH (-4040) #endif #if defined(ETIMEDOUT) && !defined(_WIN32) # define UV__ETIMEDOUT (-ETIMEDOUT) #else # define UV__ETIMEDOUT (-4039) #endif #if defined(ETXTBSY) && !defined(_WIN32) # define UV__ETXTBSY (-ETXTBSY) #else # define UV__ETXTBSY (-4038) #endif #if defined(EXDEV) && !defined(_WIN32) # define UV__EXDEV (-EXDEV) #else # define UV__EXDEV (-4037) #endif #if defined(EFBIG) && !defined(_WIN32) # define UV__EFBIG (-EFBIG) #else # define UV__EFBIG (-4036) #endif #if defined(ENOPROTOOPT) && !defined(_WIN32) # define UV__ENOPROTOOPT (-ENOPROTOOPT) #else # define UV__ENOPROTOOPT (-4035) #endif #if defined(ERANGE) && !defined(_WIN32) # define UV__ERANGE (-ERANGE) #else # define UV__ERANGE (-4034) #endif #if defined(ENXIO) && !defined(_WIN32) # define UV__ENXIO (-ENXIO) #else # define UV__ENXIO (-4033) #endif #if defined(EMLINK) && !defined(_WIN32) # define UV__EMLINK (-EMLINK) #else # define UV__EMLINK (-4032) #endif #endif /* UV_ERRNO_H_ */ MoarVM-2015.11/3rdparty/libuv/include/uv-linux.h0000644000175000017500000000336512456307253020342 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_LINUX_H #define UV_LINUX_H #define UV_PLATFORM_LOOP_FIELDS \ uv__io_t inotify_read_watcher; \ void* inotify_watchers; \ int inotify_fd; \ #define UV_PLATFORM_FS_EVENT_FIELDS \ void* watchers[2]; \ int wd; \ #endif /* UV_LINUX_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-sunos.h0000644000175000017500000000370112456307253020344 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_SUNOS_H #define UV_SUNOS_H #include #include /* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c, * add the fs_event fields even when this version of SunOS doesn't support * file watching. */ #define UV_PLATFORM_LOOP_FIELDS \ uv__io_t fs_event_watcher; \ int fs_fd; \ #if defined(PORT_SOURCE_FILE) # define UV_PLATFORM_FS_EVENT_FIELDS \ file_obj_t fo; \ int fd; \ #endif /* defined(PORT_SOURCE_FILE) */ #endif /* UV_SUNOS_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-threadpool.h0000644000175000017500000000273112456307253021340 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* * This file is private to libuv. It provides common functionality to both * Windows and Unix backends. */ #ifndef UV_THREADPOOL_H_ #define UV_THREADPOOL_H_ struct uv__work { void (*work)(struct uv__work *w); void (*done)(struct uv__work *w, int status); struct uv_loop_s* loop; void* wq[2]; }; #endif /* UV_THREADPOOL_H_ */ MoarVM-2015.11/3rdparty/libuv/include/uv-unix.h0000644000175000017500000003744612502366750020174 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_UNIX_H #define UV_UNIX_H #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __ANDROID__ #include "pthread-fixes.h" #endif #include #include "uv-threadpool.h" #if defined(__linux__) # include "uv-linux.h" #elif defined(_AIX) # include "uv-aix.h" #elif defined(__sun) # include "uv-sunos.h" #elif defined(__APPLE__) # include "uv-darwin.h" #elif defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # include "uv-bsd.h" #endif #ifndef NI_MAXHOST # define NI_MAXHOST 1025 #endif #ifndef NI_MAXSERV # define NI_MAXSERV 32 #endif #ifndef UV_IO_PRIVATE_PLATFORM_FIELDS # define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */ #endif struct uv__io_s; struct uv__async; struct uv_loop_s; typedef void (*uv__io_cb)(struct uv_loop_s* loop, struct uv__io_s* w, unsigned int events); typedef struct uv__io_s uv__io_t; struct uv__io_s { uv__io_cb cb; void* pending_queue[2]; void* watcher_queue[2]; unsigned int pevents; /* Pending event mask i.e. mask at next tick. */ unsigned int events; /* Current event mask. */ int fd; UV_IO_PRIVATE_PLATFORM_FIELDS }; typedef void (*uv__async_cb)(struct uv_loop_s* loop, struct uv__async* w, unsigned int nevents); struct uv__async { uv__async_cb cb; uv__io_t io_watcher; int wfd; }; #ifndef UV_PLATFORM_SEM_T # define UV_PLATFORM_SEM_T sem_t #endif #ifndef UV_PLATFORM_LOOP_FIELDS # define UV_PLATFORM_LOOP_FIELDS /* empty */ #endif #ifndef UV_PLATFORM_FS_EVENT_FIELDS # define UV_PLATFORM_FS_EVENT_FIELDS /* empty */ #endif #ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS # define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */ #endif /* Note: May be cast to struct iovec. See writev(2). */ typedef struct uv_buf_t { char* base; size_t len; } uv_buf_t; typedef int uv_file; typedef int uv_os_sock_t; typedef int uv_os_fd_t; #define UV_ONCE_INIT PTHREAD_ONCE_INIT typedef pthread_once_t uv_once_t; typedef pthread_t uv_thread_t; typedef pthread_mutex_t uv_mutex_t; typedef pthread_rwlock_t uv_rwlock_t; typedef UV_PLATFORM_SEM_T uv_sem_t; typedef pthread_cond_t uv_cond_t; typedef pthread_key_t uv_key_t; #if defined(__APPLE__) && defined(__MACH__) typedef struct { unsigned int n; unsigned int count; uv_mutex_t mutex; uv_sem_t turnstile1; uv_sem_t turnstile2; } uv_barrier_t; #else /* defined(__APPLE__) && defined(__MACH__) */ typedef pthread_barrier_t uv_barrier_t; #endif /* defined(__APPLE__) && defined(__MACH__) */ /* Platform-specific definitions for uv_spawn support. */ typedef gid_t uv_gid_t; typedef uid_t uv_uid_t; typedef struct dirent uv__dirent_t; #if defined(DT_UNKNOWN) # define HAVE_DIRENT_TYPES # if defined(DT_REG) # define UV__DT_FILE DT_REG # else # define UV__DT_FILE -1 # endif # if defined(DT_DIR) # define UV__DT_DIR DT_DIR # else # define UV__DT_DIR -2 # endif # if defined(DT_LNK) # define UV__DT_LINK DT_LNK # else # define UV__DT_LINK -3 # endif # if defined(DT_FIFO) # define UV__DT_FIFO DT_FIFO # else # define UV__DT_FIFO -4 # endif # if defined(DT_SOCK) # define UV__DT_SOCKET DT_SOCK # else # define UV__DT_SOCKET -5 # endif # if defined(DT_CHR) # define UV__DT_CHAR DT_CHR # else # define UV__DT_CHAR -6 # endif # if defined(DT_BLK) # define UV__DT_BLOCK DT_BLK # else # define UV__DT_BLOCK -7 # endif #endif /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC /* empty */ typedef struct { void* handle; char* errmsg; } uv_lib_t; #define UV_LOOP_PRIVATE_FIELDS \ unsigned long flags; \ int backend_fd; \ void* pending_queue[2]; \ void* watcher_queue[2]; \ uv__io_t** watchers; \ unsigned int nwatchers; \ unsigned int nfds; \ void* wq[2]; \ uv_mutex_t wq_mutex; \ uv_async_t wq_async; \ uv_rwlock_t cloexec_lock; \ uv_handle_t* closing_handles; \ void* process_handles[2]; \ void* prepare_handles[2]; \ void* check_handles[2]; \ void* idle_handles[2]; \ void* async_handles[2]; \ struct uv__async async_watcher; \ struct { \ void* min; \ unsigned int nelts; \ } timer_heap; \ uint64_t timer_counter; \ uint64_t time; \ int signal_pipefd[2]; \ uv__io_t signal_io_watcher; \ uv_signal_t child_watcher; \ int emfile_fd; \ UV_PLATFORM_LOOP_FIELDS \ #define UV_REQ_TYPE_PRIVATE /* empty */ #define UV_REQ_PRIVATE_FIELDS /* empty */ #define UV_PRIVATE_REQ_TYPES /* empty */ #define UV_WRITE_PRIVATE_FIELDS \ void* queue[2]; \ unsigned int write_index; \ uv_buf_t* bufs; \ unsigned int nbufs; \ int error; \ uv_buf_t bufsml[4]; \ #define UV_CONNECT_PRIVATE_FIELDS \ void* queue[2]; \ #define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */ #define UV_UDP_SEND_PRIVATE_FIELDS \ void* queue[2]; \ struct sockaddr_storage addr; \ unsigned int nbufs; \ uv_buf_t* bufs; \ ssize_t status; \ uv_udp_send_cb send_cb; \ uv_buf_t bufsml[4]; \ #define UV_HANDLE_PRIVATE_FIELDS \ uv_handle_t* next_closing; \ unsigned int flags; \ #define UV_STREAM_PRIVATE_FIELDS \ uv_connect_t *connect_req; \ uv_shutdown_t *shutdown_req; \ uv__io_t io_watcher; \ void* write_queue[2]; \ void* write_completed_queue[2]; \ uv_connection_cb connection_cb; \ int delayed_error; \ int accepted_fd; \ void* queued_fds; \ UV_STREAM_PRIVATE_PLATFORM_FIELDS \ #define UV_TCP_PRIVATE_FIELDS /* empty */ #define UV_UDP_PRIVATE_FIELDS \ uv_alloc_cb alloc_cb; \ uv_udp_recv_cb recv_cb; \ uv__io_t io_watcher; \ void* write_queue[2]; \ void* write_completed_queue[2]; \ #define UV_PIPE_PRIVATE_FIELDS \ const char* pipe_fname; /* strdup'ed */ #define UV_POLL_PRIVATE_FIELDS \ uv__io_t io_watcher; #define UV_PREPARE_PRIVATE_FIELDS \ uv_prepare_cb prepare_cb; \ void* queue[2]; \ #define UV_CHECK_PRIVATE_FIELDS \ uv_check_cb check_cb; \ void* queue[2]; \ #define UV_IDLE_PRIVATE_FIELDS \ uv_idle_cb idle_cb; \ void* queue[2]; \ #define UV_ASYNC_PRIVATE_FIELDS \ uv_async_cb async_cb; \ void* queue[2]; \ int pending; \ #define UV_TIMER_PRIVATE_FIELDS \ uv_timer_cb timer_cb; \ void* heap_node[3]; \ uint64_t timeout; \ uint64_t repeat; \ uint64_t start_id; #define UV_GETADDRINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getaddrinfo_cb cb; \ struct addrinfo* hints; \ char* hostname; \ char* service; \ struct addrinfo* res; \ int retcode; #define UV_GETNAMEINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getnameinfo_cb getnameinfo_cb; \ struct sockaddr_storage storage; \ int flags; \ char host[NI_MAXHOST]; \ char service[NI_MAXSERV]; \ int retcode; #define UV_PROCESS_PRIVATE_FIELDS \ void* queue[2]; \ int status; \ #define UV_FS_PRIVATE_FIELDS \ const char *new_path; \ uv_file file; \ int flags; \ mode_t mode; \ unsigned int nbufs; \ uv_buf_t* bufs; \ off_t off; \ uv_uid_t uid; \ uv_gid_t gid; \ double atime; \ double mtime; \ struct uv__work work_req; \ uv_buf_t bufsml[4]; \ #define UV_WORK_PRIVATE_FIELDS \ struct uv__work work_req; #define UV_TTY_PRIVATE_FIELDS \ struct termios orig_termios; \ int mode; #define UV_SIGNAL_PRIVATE_FIELDS \ /* RB_ENTRY(uv_signal_s) tree_entry; */ \ struct { \ struct uv_signal_s* rbe_left; \ struct uv_signal_s* rbe_right; \ struct uv_signal_s* rbe_parent; \ int rbe_color; \ } tree_entry; \ /* Use two counters here so we don have to fiddle with atomics. */ \ unsigned int caught_signals; \ unsigned int dispatched_signals; #define UV_FS_EVENT_PRIVATE_FIELDS \ uv_fs_event_cb cb; \ UV_PLATFORM_FS_EVENT_FIELDS \ #endif /* UV_UNIX_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-version.h0000644000175000017500000000322712502366750020664 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_VERSION_H #define UV_VERSION_H /* * Versions with the same major number are ABI stable. API is allowed to * evolve between minor releases, but only in a backwards compatible way. * Make sure you update the -soname directives in configure.ac * and uv.gyp whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but * not UV_VERSION_PATCH.) */ #define UV_VERSION_MAJOR 1 #define UV_VERSION_MINOR 0 #define UV_VERSION_PATCH 0 #define UV_VERSION_IS_RELEASE 1 #define UV_VERSION_SUFFIX "" #endif /* UV_VERSION_H */ MoarVM-2015.11/3rdparty/libuv/include/uv-win.h0000644000175000017500000007450712502366750020005 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0502 #endif #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) typedef intptr_t ssize_t; # define _SSIZE_T_ # define _SSIZE_T_DEFINED #endif #include #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct pollfd { SOCKET fd; short events; short revents; } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; #endif #ifndef LOCALE_INVARIANT # define LOCALE_INVARIANT 0x007f #endif #ifndef _malloca # if defined(_DEBUG) # define _malloca(size) malloc(size) # define _freea(ptr) free(ptr) # else # define _malloca(size) alloca(size) # define _freea(ptr) # endif #endif #include #include #include #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #include "tree.h" #include "uv-threadpool.h" #define MAX_PIPENAME_LEN 256 #ifndef S_IFLNK # define S_IFLNK 0xA000 #endif /* Additional signals supported by uv_signal and or uv_kill. The CRT defines * the following signals already: * * #define SIGINT 2 * #define SIGILL 4 * #define SIGABRT_COMPAT 6 * #define SIGFPE 8 * #define SIGSEGV 11 * #define SIGTERM 15 * #define SIGBREAK 21 * #define SIGABRT 22 * * The additional signals have values that are common on other Unix * variants (Linux and Darwin) */ #define SIGHUP 1 #define SIGKILL 9 #define SIGWINCH 28 /* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many */ /* unix-like platforms. However MinGW doesn't define it, so we do. */ #ifndef SIGABRT_COMPAT # define SIGABRT_COMPAT 6 #endif /* * Guids and typedefs for winsock extension functions * Mingw32 doesn't have these :-( */ #ifndef WSAID_ACCEPTEX # define WSAID_ACCEPTEX \ {0xb5367df1, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} # define WSAID_CONNECTEX \ {0x25a207b9, 0xddf3, 0x4660, \ {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} # define WSAID_GETACCEPTEXSOCKADDRS \ {0xb5367df2, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} # define WSAID_DISCONNECTEX \ {0x7fda2e11, 0x8630, 0x436f, \ {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}} # define WSAID_TRANSMITFILE \ {0xb5367df0, 0xcbac, 0x11cf, \ {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} typedef BOOL PASCAL (*LPFN_ACCEPTEX) (SOCKET sListenSocket, SOCKET sAcceptSocket, PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPDWORD lpdwBytesReceived, LPOVERLAPPED lpOverlapped); typedef BOOL PASCAL (*LPFN_CONNECTEX) (SOCKET s, const struct sockaddr* name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength, LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped); typedef void PASCAL (*LPFN_GETACCEPTEXSOCKADDRS) (PVOID lpOutputBuffer, DWORD dwReceiveDataLength, DWORD dwLocalAddressLength, DWORD dwRemoteAddressLength, LPSOCKADDR* LocalSockaddr, LPINT LocalSockaddrLength, LPSOCKADDR* RemoteSockaddr, LPINT RemoteSockaddrLength); typedef BOOL PASCAL (*LPFN_DISCONNECTEX) (SOCKET hSocket, LPOVERLAPPED lpOverlapped, DWORD dwFlags, DWORD reserved); typedef BOOL PASCAL (*LPFN_TRANSMITFILE) (SOCKET hSocket, HANDLE hFile, DWORD nNumberOfBytesToWrite, DWORD nNumberOfBytesPerSend, LPOVERLAPPED lpOverlapped, LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, DWORD dwFlags); typedef PVOID RTL_SRWLOCK; typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; #endif typedef int (WSAAPI* LPFN_WSARECV) (SOCKET socket, LPWSABUF buffers, DWORD buffer_count, LPDWORD bytes, LPDWORD flags, LPWSAOVERLAPPED overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); typedef int (WSAAPI* LPFN_WSARECVFROM) (SOCKET socket, LPWSABUF buffers, DWORD buffer_count, LPDWORD bytes, LPDWORD flags, struct sockaddr* addr, LPINT addr_len, LPWSAOVERLAPPED overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); #ifndef _NTDEF_ typedef LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS; #endif #ifndef RTL_CONDITION_VARIABLE_INIT typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE; #endif typedef struct _AFD_POLL_HANDLE_INFO { HANDLE Handle; ULONG Events; NTSTATUS Status; } AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; typedef struct _AFD_POLL_INFO { LARGE_INTEGER Timeout; ULONG NumberOfHandles; ULONG Exclusive; AFD_POLL_HANDLE_INFO Handles[1]; } AFD_POLL_INFO, *PAFD_POLL_INFO; #define UV_MSAFD_PROVIDER_COUNT 3 /** * It should be possible to cast uv_buf_t[] to WSABUF[] * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx */ typedef struct uv_buf_t { ULONG len; char* base; } uv_buf_t; typedef int uv_file; typedef SOCKET uv_os_sock_t; typedef HANDLE uv_os_fd_t; typedef HANDLE uv_thread_t; typedef HANDLE uv_sem_t; typedef CRITICAL_SECTION uv_mutex_t; /* This condition variable implementation is based on the SetEvent solution * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html * We could not use the SignalObjectAndWait solution (section 3.4) because * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. */ typedef union { CONDITION_VARIABLE cond_var; struct { unsigned int waiters_count; CRITICAL_SECTION waiters_count_lock; HANDLE signal_event; HANDLE broadcast_event; } fallback; } uv_cond_t; typedef union { /* srwlock_ has type SRWLOCK, but not all toolchains define this type in */ /* windows.h. */ SRWLOCK srwlock_; struct { uv_mutex_t read_mutex_; uv_mutex_t write_mutex_; unsigned int num_readers_; } fallback_; } uv_rwlock_t; typedef struct { unsigned int n; unsigned int count; uv_mutex_t mutex; uv_sem_t turnstile1; uv_sem_t turnstile2; } uv_barrier_t; typedef struct { DWORD tls_index; } uv_key_t; #define UV_ONCE_INIT { 0, NULL } typedef struct uv_once_s { unsigned char ran; HANDLE event; } uv_once_t; /* Platform-specific definitions for uv_spawn support. */ typedef unsigned char uv_uid_t; typedef unsigned char uv_gid_t; typedef struct uv__dirent_s { int d_type; char d_name[1]; } uv__dirent_t; #define UV__DT_DIR UV_DIRENT_DIR #define UV__DT_FILE UV_DIRENT_FILE #define UV__DT_LINK UV_DIRENT_LINK #define UV__DT_FIFO UV_DIRENT_FIFO #define UV__DT_SOCKET UV_DIRENT_SOCKET #define UV__DT_CHAR UV_DIRENT_CHAR #define UV__DT_BLOCK UV_DIRENT_BLOCK /* Platform-specific definitions for uv_dlopen support. */ #define UV_DYNAMIC FAR WINAPI typedef struct { HMODULE handle; char* errmsg; } uv_lib_t; RB_HEAD(uv_timer_tree_s, uv_timer_s); #define UV_LOOP_PRIVATE_FIELDS \ /* The loop's I/O completion port */ \ HANDLE iocp; \ /* The current time according to the event loop. in msecs. */ \ uint64_t time; \ /* Tail of a single-linked circular queue of pending reqs. If the queue */ \ /* is empty, tail_ is NULL. If there is only one item, */ \ /* tail_->next_req == tail_ */ \ uv_req_t* pending_reqs_tail; \ /* Head of a single-linked list of closed handles */ \ uv_handle_t* endgame_handles; \ /* The head of the timers tree */ \ struct uv_timer_tree_s timers; \ /* Lists of active loop (prepare / check / idle) watchers */ \ uv_prepare_t* prepare_handles; \ uv_check_t* check_handles; \ uv_idle_t* idle_handles; \ /* This pointer will refer to the prepare/check/idle handle whose */ \ /* callback is scheduled to be called next. This is needed to allow */ \ /* safe removal from one of the lists above while that list being */ \ /* iterated over. */ \ uv_prepare_t* next_prepare_handle; \ uv_check_t* next_check_handle; \ uv_idle_t* next_idle_handle; \ /* This handle holds the peer sockets for the fast variant of uv_poll_t */ \ SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \ /* Counter to keep track of active tcp streams */ \ unsigned int active_tcp_streams; \ /* Counter to keep track of active udp streams */ \ unsigned int active_udp_streams; \ /* Counter to started timer */ \ uint64_t timer_counter; \ /* Threadpool */ \ void* wq[2]; \ uv_mutex_t wq_mutex; \ uv_async_t wq_async; #define UV_REQ_TYPE_PRIVATE \ /* TODO: remove the req suffix */ \ UV_ACCEPT, \ UV_FS_EVENT_REQ, \ UV_POLL_REQ, \ UV_PROCESS_EXIT, \ UV_READ, \ UV_UDP_RECV, \ UV_WAKEUP, \ UV_SIGNAL_REQ, #define UV_REQ_PRIVATE_FIELDS \ union { \ /* Used by I/O operations */ \ struct { \ OVERLAPPED overlapped; \ size_t queued_bytes; \ }; \ }; \ struct uv_req_s* next_req; #define UV_WRITE_PRIVATE_FIELDS \ int ipc_header; \ uv_buf_t write_buffer; \ HANDLE event_handle; \ HANDLE wait_handle; #define UV_CONNECT_PRIVATE_FIELDS \ /* empty */ #define UV_SHUTDOWN_PRIVATE_FIELDS \ /* empty */ #define UV_UDP_SEND_PRIVATE_FIELDS \ /* empty */ #define UV_PRIVATE_REQ_TYPES \ typedef struct uv_pipe_accept_s { \ UV_REQ_FIELDS \ HANDLE pipeHandle; \ struct uv_pipe_accept_s* next_pending; \ } uv_pipe_accept_t; \ \ typedef struct uv_tcp_accept_s { \ UV_REQ_FIELDS \ SOCKET accept_socket; \ char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \ HANDLE event_handle; \ HANDLE wait_handle; \ struct uv_tcp_accept_s* next_pending; \ } uv_tcp_accept_t; \ \ typedef struct uv_read_s { \ UV_REQ_FIELDS \ HANDLE event_handle; \ HANDLE wait_handle; \ } uv_read_t; #define uv_stream_connection_fields \ unsigned int write_reqs_pending; \ uv_shutdown_t* shutdown_req; #define uv_stream_server_fields \ uv_connection_cb connection_cb; #define UV_STREAM_PRIVATE_FIELDS \ unsigned int reqs_pending; \ int activecnt; \ uv_read_t read_req; \ union { \ struct { uv_stream_connection_fields }; \ struct { uv_stream_server_fields }; \ }; #define uv_tcp_server_fields \ uv_tcp_accept_t* accept_reqs; \ unsigned int processed_accepts; \ uv_tcp_accept_t* pending_accepts; \ LPFN_ACCEPTEX func_acceptex; #define uv_tcp_connection_fields \ uv_buf_t read_buffer; \ LPFN_CONNECTEX func_connectex; #define UV_TCP_PRIVATE_FIELDS \ SOCKET socket; \ int delayed_error; \ union { \ struct { uv_tcp_server_fields }; \ struct { uv_tcp_connection_fields }; \ }; #define UV_UDP_PRIVATE_FIELDS \ SOCKET socket; \ unsigned int reqs_pending; \ int activecnt; \ uv_req_t recv_req; \ uv_buf_t recv_buffer; \ struct sockaddr_storage recv_from; \ int recv_from_len; \ uv_udp_recv_cb recv_cb; \ uv_alloc_cb alloc_cb; \ LPFN_WSARECV func_wsarecv; \ LPFN_WSARECVFROM func_wsarecvfrom; #define uv_pipe_server_fields \ int pending_instances; \ uv_pipe_accept_t* accept_reqs; \ uv_pipe_accept_t* pending_accepts; #define uv_pipe_connection_fields \ uv_timer_t* eof_timer; \ uv_write_t ipc_header_write_req; \ int ipc_pid; \ uint64_t remaining_ipc_rawdata_bytes; \ struct { \ void* queue[2]; \ int queue_len; \ } pending_ipc_info; \ uv_write_t* non_overlapped_writes_tail; \ uv_mutex_t readfile_mutex; \ volatile HANDLE readfile_thread; #define UV_PIPE_PRIVATE_FIELDS \ HANDLE handle; \ WCHAR* name; \ union { \ struct { uv_pipe_server_fields }; \ struct { uv_pipe_connection_fields }; \ }; /* TODO: put the parser states in an union - TTY handles are always */ /* half-duplex so read-state can safely overlap write-state. */ #define UV_TTY_PRIVATE_FIELDS \ HANDLE handle; \ union { \ struct { \ /* Used for readable TTY handles */ \ HANDLE read_line_handle; \ uv_buf_t read_line_buffer; \ HANDLE read_raw_wait; \ /* Fields used for translating win keystrokes into vt100 characters */ \ char last_key[8]; \ unsigned char last_key_offset; \ unsigned char last_key_len; \ WCHAR last_utf16_high_surrogate; \ INPUT_RECORD last_input_record; \ }; \ struct { \ /* Used for writable TTY handles */ \ /* utf8-to-utf16 conversion state */ \ unsigned int utf8_codepoint; \ unsigned char utf8_bytes_left; \ /* eol conversion state */ \ unsigned char previous_eol; \ /* ansi parser state */ \ unsigned char ansi_parser_state; \ unsigned char ansi_csi_argc; \ unsigned short ansi_csi_argv[4]; \ COORD saved_position; \ WORD saved_attributes; \ }; \ }; #define UV_POLL_PRIVATE_FIELDS \ SOCKET socket; \ /* Used in fast mode */ \ SOCKET peer_socket; \ AFD_POLL_INFO afd_poll_info_1; \ AFD_POLL_INFO afd_poll_info_2; \ /* Used in fast and slow mode. */ \ uv_req_t poll_req_1; \ uv_req_t poll_req_2; \ unsigned char submitted_events_1; \ unsigned char submitted_events_2; \ unsigned char mask_events_1; \ unsigned char mask_events_2; \ unsigned char events; #define UV_TIMER_PRIVATE_FIELDS \ RB_ENTRY(uv_timer_s) tree_entry; \ uint64_t due; \ uint64_t repeat; \ uint64_t start_id; \ uv_timer_cb timer_cb; #define UV_ASYNC_PRIVATE_FIELDS \ struct uv_req_s async_req; \ uv_async_cb async_cb; \ /* char to avoid alignment issues */ \ char volatile async_sent; #define UV_PREPARE_PRIVATE_FIELDS \ uv_prepare_t* prepare_prev; \ uv_prepare_t* prepare_next; \ uv_prepare_cb prepare_cb; #define UV_CHECK_PRIVATE_FIELDS \ uv_check_t* check_prev; \ uv_check_t* check_next; \ uv_check_cb check_cb; #define UV_IDLE_PRIVATE_FIELDS \ uv_idle_t* idle_prev; \ uv_idle_t* idle_next; \ uv_idle_cb idle_cb; #define UV_HANDLE_PRIVATE_FIELDS \ uv_handle_t* endgame_next; \ unsigned int flags; #define UV_GETADDRINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getaddrinfo_cb getaddrinfo_cb; \ void* alloc; \ WCHAR* node; \ WCHAR* service; \ struct addrinfoW* hints; \ struct addrinfoW* res; \ int retcode; #define UV_GETNAMEINFO_PRIVATE_FIELDS \ struct uv__work work_req; \ uv_getnameinfo_cb getnameinfo_cb; \ struct sockaddr_storage storage; \ int flags; \ char host[NI_MAXHOST]; \ char service[NI_MAXSERV]; \ int retcode; #define UV_PROCESS_PRIVATE_FIELDS \ struct uv_process_exit_s { \ UV_REQ_FIELDS \ } exit_req; \ BYTE* child_stdio_buffer; \ int exit_signal; \ HANDLE wait_handle; \ HANDLE process_handle; \ volatile char exit_cb_pending; #define UV_FS_PRIVATE_FIELDS \ struct uv__work work_req; \ int flags; \ DWORD sys_errno_; \ union { \ /* TODO: remove me in 0.9. */ \ WCHAR* pathw; \ int fd; \ }; \ union { \ struct { \ int mode; \ WCHAR* new_pathw; \ int file_flags; \ int fd_out; \ unsigned int nbufs; \ uv_buf_t* bufs; \ int64_t offset; \ uv_buf_t bufsml[4]; \ }; \ struct { \ double atime; \ double mtime; \ }; \ }; #define UV_WORK_PRIVATE_FIELDS \ struct uv__work work_req; #define UV_FS_EVENT_PRIVATE_FIELDS \ struct uv_fs_event_req_s { \ UV_REQ_FIELDS \ } req; \ HANDLE dir_handle; \ int req_pending; \ uv_fs_event_cb cb; \ WCHAR* filew; \ WCHAR* short_filew; \ WCHAR* dirw; \ char* buffer; #define UV_SIGNAL_PRIVATE_FIELDS \ RB_ENTRY(uv_signal_s) tree_entry; \ struct uv_req_s signal_req; \ unsigned long pending_signum; int uv_utf16_to_utf8(const WCHAR* utf16Buffer, size_t utf16Size, char* utf8Buffer, size_t utf8Size); int uv_utf8_to_utf16(const char* utf8Buffer, WCHAR* utf16Buffer, size_t utf16Size); #ifndef F_OK #define F_OK 0 #endif #ifndef R_OK #define R_OK 4 #endif #ifndef W_OK #define W_OK 2 #endif #ifndef X_OK #define X_OK 1 #endif MoarVM-2015.11/3rdparty/libuv/include/uv.h0000644000175000017500000014421212502366750017201 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* See https://github.com/joyent/libuv#documentation for documentation. */ #ifndef UV_H #define UV_H #ifdef __cplusplus extern "C" { #endif #ifdef _WIN32 /* Windows - set up dll import/export decorators. */ # if defined(BUILDING_UV_SHARED) /* Building shared library. */ # define UV_EXTERN __declspec(dllexport) # elif defined(USING_UV_SHARED) /* Using shared library. */ # define UV_EXTERN __declspec(dllimport) # else /* Building static library. */ # define UV_EXTERN /* nothing */ # endif #elif __GNUC__ >= 4 # define UV_EXTERN __attribute__((visibility("default"))) #else # define UV_EXTERN /* nothing */ #endif #include "uv-errno.h" #include "uv-version.h" #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #if defined(_WIN32) # include "uv-win.h" #else # include "uv-unix.h" #endif /* Expand this list if necessary. */ #define UV_ERRNO_MAP(XX) \ XX(E2BIG, "argument list too long") \ XX(EACCES, "permission denied") \ XX(EADDRINUSE, "address already in use") \ XX(EADDRNOTAVAIL, "address not available") \ XX(EAFNOSUPPORT, "address family not supported") \ XX(EAGAIN, "resource temporarily unavailable") \ XX(EAI_ADDRFAMILY, "address family not supported") \ XX(EAI_AGAIN, "temporary failure") \ XX(EAI_BADFLAGS, "bad ai_flags value") \ XX(EAI_BADHINTS, "invalid value for hints") \ XX(EAI_CANCELED, "request canceled") \ XX(EAI_FAIL, "permanent failure") \ XX(EAI_FAMILY, "ai_family not supported") \ XX(EAI_MEMORY, "out of memory") \ XX(EAI_NODATA, "no address") \ XX(EAI_NONAME, "unknown node or service") \ XX(EAI_OVERFLOW, "argument buffer overflow") \ XX(EAI_PROTOCOL, "resolved protocol is unknown") \ XX(EAI_SERVICE, "service not available for socket type") \ XX(EAI_SOCKTYPE, "socket type not supported") \ XX(EALREADY, "connection already in progress") \ XX(EBADF, "bad file descriptor") \ XX(EBUSY, "resource busy or locked") \ XX(ECANCELED, "operation canceled") \ XX(ECHARSET, "invalid Unicode character") \ XX(ECONNABORTED, "software caused connection abort") \ XX(ECONNREFUSED, "connection refused") \ XX(ECONNRESET, "connection reset by peer") \ XX(EDESTADDRREQ, "destination address required") \ XX(EEXIST, "file already exists") \ XX(EFAULT, "bad address in system call argument") \ XX(EFBIG, "file too large") \ XX(EHOSTUNREACH, "host is unreachable") \ XX(EINTR, "interrupted system call") \ XX(EINVAL, "invalid argument") \ XX(EIO, "i/o error") \ XX(EISCONN, "socket is already connected") \ XX(EISDIR, "illegal operation on a directory") \ XX(ELOOP, "too many symbolic links encountered") \ XX(EMFILE, "too many open files") \ XX(EMSGSIZE, "message too long") \ XX(ENAMETOOLONG, "name too long") \ XX(ENETDOWN, "network is down") \ XX(ENETUNREACH, "network is unreachable") \ XX(ENFILE, "file table overflow") \ XX(ENOBUFS, "no buffer space available") \ XX(ENODEV, "no such device") \ XX(ENOENT, "no such file or directory") \ XX(ENOMEM, "not enough memory") \ XX(ENONET, "machine is not on the network") \ XX(ENOPROTOOPT, "protocol not available") \ XX(ENOSPC, "no space left on device") \ XX(ENOSYS, "function not implemented") \ XX(ENOTCONN, "socket is not connected") \ XX(ENOTDIR, "not a directory") \ XX(ENOTEMPTY, "directory not empty") \ XX(ENOTSOCK, "socket operation on non-socket") \ XX(ENOTSUP, "operation not supported on socket") \ XX(EPERM, "operation not permitted") \ XX(EPIPE, "broken pipe") \ XX(EPROTO, "protocol error") \ XX(EPROTONOSUPPORT, "protocol not supported") \ XX(EPROTOTYPE, "protocol wrong type for socket") \ XX(ERANGE, "result too large") \ XX(EROFS, "read-only file system") \ XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \ XX(ESPIPE, "invalid seek") \ XX(ESRCH, "no such process") \ XX(ETIMEDOUT, "connection timed out") \ XX(ETXTBSY, "text file is busy") \ XX(EXDEV, "cross-device link not permitted") \ XX(UNKNOWN, "unknown error") \ XX(EOF, "end of file") \ XX(ENXIO, "no such device or address") \ XX(EMLINK, "too many links") \ #define UV_HANDLE_TYPE_MAP(XX) \ XX(ASYNC, async) \ XX(CHECK, check) \ XX(FS_EVENT, fs_event) \ XX(FS_POLL, fs_poll) \ XX(HANDLE, handle) \ XX(IDLE, idle) \ XX(NAMED_PIPE, pipe) \ XX(POLL, poll) \ XX(PREPARE, prepare) \ XX(PROCESS, process) \ XX(STREAM, stream) \ XX(TCP, tcp) \ XX(TIMER, timer) \ XX(TTY, tty) \ XX(UDP, udp) \ XX(SIGNAL, signal) \ #define UV_REQ_TYPE_MAP(XX) \ XX(REQ, req) \ XX(CONNECT, connect) \ XX(WRITE, write) \ XX(SHUTDOWN, shutdown) \ XX(UDP_SEND, udp_send) \ XX(FS, fs) \ XX(WORK, work) \ XX(GETADDRINFO, getaddrinfo) \ XX(GETNAMEINFO, getnameinfo) \ typedef enum { #define XX(code, _) UV_ ## code = UV__ ## code, UV_ERRNO_MAP(XX) #undef XX UV_ERRNO_MAX = UV__EOF - 1 } uv_errno_t; typedef enum { UV_UNKNOWN_HANDLE = 0, #define XX(uc, lc) UV_##uc, UV_HANDLE_TYPE_MAP(XX) #undef XX UV_FILE, UV_HANDLE_TYPE_MAX } uv_handle_type; typedef enum { UV_UNKNOWN_REQ = 0, #define XX(uc, lc) UV_##uc, UV_REQ_TYPE_MAP(XX) #undef XX UV_REQ_TYPE_PRIVATE UV_REQ_TYPE_MAX } uv_req_type; /* Handle types. */ typedef struct uv_loop_s uv_loop_t; typedef struct uv_handle_s uv_handle_t; typedef struct uv_stream_s uv_stream_t; typedef struct uv_tcp_s uv_tcp_t; typedef struct uv_udp_s uv_udp_t; typedef struct uv_pipe_s uv_pipe_t; typedef struct uv_tty_s uv_tty_t; typedef struct uv_poll_s uv_poll_t; typedef struct uv_timer_s uv_timer_t; typedef struct uv_prepare_s uv_prepare_t; typedef struct uv_check_s uv_check_t; typedef struct uv_idle_s uv_idle_t; typedef struct uv_async_s uv_async_t; typedef struct uv_process_s uv_process_t; typedef struct uv_fs_event_s uv_fs_event_t; typedef struct uv_fs_poll_s uv_fs_poll_t; typedef struct uv_signal_s uv_signal_t; /* Request types. */ typedef struct uv_req_s uv_req_t; typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; typedef struct uv_getnameinfo_s uv_getnameinfo_t; typedef struct uv_shutdown_s uv_shutdown_t; typedef struct uv_write_s uv_write_t; typedef struct uv_connect_s uv_connect_t; typedef struct uv_udp_send_s uv_udp_send_t; typedef struct uv_fs_s uv_fs_t; typedef struct uv_work_s uv_work_t; /* None of the above. */ typedef struct uv_cpu_info_s uv_cpu_info_t; typedef struct uv_interface_address_s uv_interface_address_t; typedef struct uv_dirent_s uv_dirent_t; typedef enum { UV_RUN_DEFAULT = 0, UV_RUN_ONCE, UV_RUN_NOWAIT } uv_run_mode; UV_EXTERN unsigned int uv_version(void); UV_EXTERN const char* uv_version_string(void); UV_EXTERN uv_loop_t* uv_default_loop(void); UV_EXTERN int uv_loop_init(uv_loop_t* loop); UV_EXTERN int uv_loop_close(uv_loop_t* loop); /* * NOTE: * This function is DEPRECATED (to be removed after 0.12), users should * allocate the loop manually and use uv_loop_init instead. */ UV_EXTERN uv_loop_t* uv_loop_new(void); /* * NOTE: * This function is DEPRECATED (to be removed after 0.12). Users should use * uv_loop_close and free the memory manually instead. */ UV_EXTERN void uv_loop_delete(uv_loop_t*); UV_EXTERN size_t uv_loop_size(void); UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); UV_EXTERN void uv_stop(uv_loop_t*); UV_EXTERN void uv_ref(uv_handle_t*); UV_EXTERN void uv_unref(uv_handle_t*); UV_EXTERN int uv_has_ref(const uv_handle_t*); UV_EXTERN void uv_update_time(uv_loop_t*); UV_EXTERN uint64_t uv_now(const uv_loop_t*); UV_EXTERN int uv_backend_fd(const uv_loop_t*); UV_EXTERN int uv_backend_timeout(const uv_loop_t*); typedef void (*uv_alloc_cb)(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); typedef void (*uv_write_cb)(uv_write_t* req, int status); typedef void (*uv_connect_cb)(uv_connect_t* req, int status); typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status); typedef void (*uv_connection_cb)(uv_stream_t* server, int status); typedef void (*uv_close_cb)(uv_handle_t* handle); typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events); typedef void (*uv_timer_cb)(uv_timer_t* handle); typedef void (*uv_async_cb)(uv_async_t* handle); typedef void (*uv_prepare_cb)(uv_prepare_t* handle); typedef void (*uv_check_cb)(uv_check_t* handle); typedef void (*uv_idle_cb)(uv_idle_t* handle); typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal); typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg); typedef void (*uv_fs_cb)(uv_fs_t* req); typedef void (*uv_work_cb)(uv_work_t* req); typedef void (*uv_after_work_cb)(uv_work_t* req, int status); typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, int status, struct addrinfo* res); typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, int status, const char* hostname, const char* service); typedef struct { long tv_sec; long tv_nsec; } uv_timespec_t; typedef struct { uint64_t st_dev; uint64_t st_mode; uint64_t st_nlink; uint64_t st_uid; uint64_t st_gid; uint64_t st_rdev; uint64_t st_ino; uint64_t st_size; uint64_t st_blksize; uint64_t st_blocks; uint64_t st_flags; uint64_t st_gen; uv_timespec_t st_atim; uv_timespec_t st_mtim; uv_timespec_t st_ctim; uv_timespec_t st_birthtim; } uv_stat_t; typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, int status); typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr); typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum); typedef enum { UV_LEAVE_GROUP = 0, UV_JOIN_GROUP } uv_membership; UV_EXTERN const char* uv_strerror(int err); UV_EXTERN const char* uv_err_name(int err); #define UV_REQ_FIELDS \ /* public */ \ void* data; \ /* read-only */ \ uv_req_type type; \ /* private */ \ void* active_queue[2]; \ void* reserved[4]; \ UV_REQ_PRIVATE_FIELDS \ /* Abstract base class of all requests. */ struct uv_req_s { UV_REQ_FIELDS }; /* Platform-specific request types. */ UV_PRIVATE_REQ_TYPES UV_EXTERN int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb); struct uv_shutdown_s { UV_REQ_FIELDS uv_stream_t* handle; uv_shutdown_cb cb; UV_SHUTDOWN_PRIVATE_FIELDS }; #define UV_HANDLE_FIELDS \ /* public */ \ void* data; \ /* read-only */ \ uv_loop_t* loop; \ uv_handle_type type; \ /* private */ \ uv_close_cb close_cb; \ void* handle_queue[2]; \ void* reserved[4]; \ UV_HANDLE_PRIVATE_FIELDS \ /* The abstract base class of all handles. */ struct uv_handle_s { UV_HANDLE_FIELDS }; UV_EXTERN size_t uv_handle_size(uv_handle_type type); UV_EXTERN size_t uv_req_size(uv_req_type type); UV_EXTERN int uv_is_active(const uv_handle_t* handle); UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); #define UV_STREAM_FIELDS \ /* number of bytes queued for writing */ \ size_t write_queue_size; \ uv_alloc_cb alloc_cb; \ uv_read_cb read_cb; \ /* private */ \ UV_STREAM_PRIVATE_FIELDS /* * uv_stream_t is a subclass of uv_handle_t. * * uv_stream is an abstract class. * * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. */ struct uv_stream_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS }; UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb); UV_EXTERN int uv_read_stop(uv_stream_t*); UV_EXTERN int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); UV_EXTERN int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb); UV_EXTERN int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs); /* uv_write_t is a subclass of uv_req_t. */ struct uv_write_s { UV_REQ_FIELDS uv_write_cb cb; uv_stream_t* send_handle; uv_stream_t* handle; UV_WRITE_PRIVATE_FIELDS }; UV_EXTERN int uv_is_readable(const uv_stream_t* handle); UV_EXTERN int uv_is_writable(const uv_stream_t* handle); UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); UV_EXTERN int uv_is_closing(const uv_handle_t* handle); /* * uv_tcp_t is a subclass of uv_stream_t. * * Represents a TCP stream or TCP server. */ struct uv_tcp_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS UV_TCP_PRIVATE_FIELDS }; UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay); UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); enum uv_tcp_flags { /* Used with uv_tcp_bind, when an IPv6 address is used. */ UV_TCP_IPV6ONLY = 1 }; UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags); UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb); /* uv_connect_t is a subclass of uv_req_t. */ struct uv_connect_s { UV_REQ_FIELDS uv_connect_cb cb; uv_stream_t* handle; UV_CONNECT_PRIVATE_FIELDS }; /* * UDP support. */ enum uv_udp_flags { /* Disables dual stack mode. */ UV_UDP_IPV6ONLY = 1, /* * Indicates message was truncated because read buffer was too small. The * remainder was discarded by the OS. Used in uv_udp_recv_cb. */ UV_UDP_PARTIAL = 2, /* * Indicates if SO_REUSEADDR will be set when binding the handle. * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that * multiple threads or processes can bind to the same address without error * (provided they all set the flag) but only the last one to bind will receive * any traffic, in effect "stealing" the port from the previous listener. */ UV_UDP_REUSEADDR = 4 }; typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags); /* uv_udp_t is a subclass of uv_handle_t. */ struct uv_udp_s { UV_HANDLE_FIELDS /* read-only */ /* * Number of bytes queued for sending. This field strictly shows how much * information is currently queued. */ size_t send_queue_size; /* * Number of send requests currently in the queue awaiting to be processed. */ size_t send_queue_count; UV_UDP_PRIVATE_FIELDS }; /* uv_udp_send_t is a subclass of uv_req_t. */ struct uv_udp_send_s { UV_REQ_FIELDS uv_udp_t* handle; uv_udp_send_cb cb; UV_UDP_SEND_PRIVATE_FIELDS }; UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); UV_EXTERN int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags); UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership); UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr); UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); UV_EXTERN int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb); UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr); UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb); UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); /* * uv_tty_t is a subclass of uv_stream_t. * * Representing a stream for the console. */ struct uv_tty_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS UV_TTY_PRIVATE_FIELDS }; UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); UV_EXTERN int uv_tty_set_mode(uv_tty_t*, int mode); UV_EXTERN int uv_tty_reset_mode(void); UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); /* * uv_pipe_t is a subclass of uv_stream_t. * * Representing a pipe stream or pipe server. On Windows this is a Named * Pipe. On Unix this is a Unix domain socket. */ struct uv_pipe_s { UV_HANDLE_FIELDS UV_STREAM_FIELDS int ipc; /* non-zero if this pipe is used for passing handles */ UV_PIPE_PRIVATE_FIELDS }; UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); UV_EXTERN void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb); UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len); UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); struct uv_poll_s { UV_HANDLE_FIELDS uv_poll_cb poll_cb; UV_POLL_PRIVATE_FIELDS }; enum uv_poll_event { UV_READABLE = 1, UV_WRITABLE = 2 }; UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket); UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); UV_EXTERN int uv_poll_stop(uv_poll_t* handle); struct uv_prepare_s { UV_HANDLE_FIELDS UV_PREPARE_PRIVATE_FIELDS }; UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); struct uv_check_s { UV_HANDLE_FIELDS UV_CHECK_PRIVATE_FIELDS }; UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); UV_EXTERN int uv_check_stop(uv_check_t* check); struct uv_idle_s { UV_HANDLE_FIELDS UV_IDLE_PRIVATE_FIELDS }; UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); UV_EXTERN int uv_idle_stop(uv_idle_t* idle); struct uv_async_s { UV_HANDLE_FIELDS UV_ASYNC_PRIVATE_FIELDS }; UV_EXTERN int uv_async_init(uv_loop_t*, uv_async_t* async, uv_async_cb async_cb); UV_EXTERN int uv_async_send(uv_async_t* async); /* * uv_timer_t is a subclass of uv_handle_t. * * Used to get woken up at a specified time in the future. */ struct uv_timer_s { UV_HANDLE_FIELDS UV_TIMER_PRIVATE_FIELDS }; UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); UV_EXTERN int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat); UV_EXTERN int uv_timer_stop(uv_timer_t* handle); UV_EXTERN int uv_timer_again(uv_timer_t* handle); UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); /* * uv_getaddrinfo_t is a subclass of uv_req_t. * * Request object for uv_getaddrinfo. */ struct uv_getaddrinfo_s { UV_REQ_FIELDS /* read-only */ uv_loop_t* loop; UV_GETADDRINFO_PRIVATE_FIELDS }; UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints); UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); /* * uv_getnameinfo_t is a subclass of uv_req_t. * * Request object for uv_getnameinfo. */ struct uv_getnameinfo_s { UV_REQ_FIELDS /* read-only */ uv_loop_t* loop; UV_GETNAMEINFO_PRIVATE_FIELDS }; UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags); /* uv_spawn() options. */ typedef enum { UV_IGNORE = 0x00, UV_CREATE_PIPE = 0x01, UV_INHERIT_FD = 0x02, UV_INHERIT_STREAM = 0x04, /* * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE * determine the direction of flow, from the child process' perspective. Both * flags may be specified to create a duplex data stream. */ UV_READABLE_PIPE = 0x10, UV_WRITABLE_PIPE = 0x20 } uv_stdio_flags; typedef struct uv_stdio_container_s { uv_stdio_flags flags; union { uv_stream_t* stream; int fd; } data; } uv_stdio_container_t; typedef struct uv_process_options_s { uv_exit_cb exit_cb; /* Called after the process exits. */ const char* file; /* Path to program to execute. */ /* * Command line arguments. args[0] should be the path to the program. On * Windows this uses CreateProcess which concatenates the arguments into a * string this can cause some strange errors. See the note at * windows_verbatim_arguments. */ char** args; /* * This will be set as the environ variable in the subprocess. If this is * NULL then the parents environ will be used. */ char** env; /* * If non-null this represents a directory the subprocess should execute * in. Stands for current working directory. */ const char* cwd; /* * Various flags that control how uv_spawn() behaves. See the definition of * `enum uv_process_flags` below. */ unsigned int flags; /* * The `stdio` field points to an array of uv_stdio_container_t structs that * describe the file descriptors that will be made available to the child * process. The convention is that stdio[0] points to stdin, fd 1 is used for * stdout, and fd 2 is stderr. * * Note that on windows file descriptors greater than 2 are available to the * child process only if the child processes uses the MSVCRT runtime. */ int stdio_count; uv_stdio_container_t* stdio; /* * Libuv can change the child process' user/group id. This happens only when * the appropriate bits are set in the flags fields. This is not supported on * windows; uv_spawn() will fail and set the error to UV_ENOTSUP. */ uv_uid_t uid; uv_gid_t gid; } uv_process_options_t; /* * These are the flags that can be used for the uv_process_options.flags field. */ enum uv_process_flags { /* * Set the child process' user id. The user id is supplied in the `uid` field * of the options struct. This does not work on windows; setting this flag * will cause uv_spawn() to fail. */ UV_PROCESS_SETUID = (1 << 0), /* * Set the child process' group id. The user id is supplied in the `gid` * field of the options struct. This does not work on windows; setting this * flag will cause uv_spawn() to fail. */ UV_PROCESS_SETGID = (1 << 1), /* * Do not wrap any arguments in quotes, or perform any other escaping, when * converting the argument list into a command line string. This option is * only meaningful on Windows systems. On Unix it is silently ignored. */ UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), /* * Spawn the child process in a detached state - this will make it a process * group leader, and will effectively enable the child to keep running after * the parent exits. Note that the child process will still keep the * parent's event loop alive unless the parent process calls uv_unref() on * the child's process handle. */ UV_PROCESS_DETACHED = (1 << 3), /* * Hide the subprocess console window that would normally be created. This * option is only meaningful on Windows systems. On Unix it is silently * ignored. */ UV_PROCESS_WINDOWS_HIDE = (1 << 4) }; /* * uv_process_t is a subclass of uv_handle_t. */ struct uv_process_s { UV_HANDLE_FIELDS uv_exit_cb exit_cb; int pid; UV_PROCESS_PRIVATE_FIELDS }; UV_EXTERN int uv_spawn(uv_loop_t* loop, uv_process_t* handle, const uv_process_options_t* options); UV_EXTERN int uv_process_kill(uv_process_t*, int signum); UV_EXTERN int uv_kill(int pid, int signum); /* * uv_work_t is a subclass of uv_req_t. */ struct uv_work_s { UV_REQ_FIELDS uv_loop_t* loop; uv_work_cb work_cb; uv_after_work_cb after_work_cb; UV_WORK_PRIVATE_FIELDS }; UV_EXTERN int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb); UV_EXTERN int uv_cancel(uv_req_t* req); struct uv_cpu_info_s { char* model; int speed; struct uv_cpu_times_s { uint64_t user; uint64_t nice; uint64_t sys; uint64_t idle; uint64_t irq; } cpu_times; }; struct uv_interface_address_s { char* name; char phys_addr[6]; int is_internal; union { struct sockaddr_in address4; struct sockaddr_in6 address6; } address; union { struct sockaddr_in netmask4; struct sockaddr_in6 netmask6; } netmask; }; typedef enum { UV_DIRENT_UNKNOWN, UV_DIRENT_FILE, UV_DIRENT_DIR, UV_DIRENT_LINK, UV_DIRENT_FIFO, UV_DIRENT_SOCKET, UV_DIRENT_CHAR, UV_DIRENT_BLOCK } uv_dirent_type_t; struct uv_dirent_s { const char* name; uv_dirent_type_t type; }; UV_EXTERN char** uv_setup_args(int argc, char** argv); UV_EXTERN int uv_get_process_title(char* buffer, size_t size); UV_EXTERN int uv_set_process_title(const char* title); UV_EXTERN int uv_resident_set_memory(size_t* rss); UV_EXTERN int uv_uptime(double* uptime); typedef struct { long tv_sec; long tv_usec; } uv_timeval_t; typedef struct { uv_timeval_t ru_utime; /* user CPU time used */ uv_timeval_t ru_stime; /* system CPU time used */ uint64_t ru_maxrss; /* maximum resident set size */ uint64_t ru_ixrss; /* integral shared memory size */ uint64_t ru_idrss; /* integral unshared data size */ uint64_t ru_isrss; /* integral unshared stack size */ uint64_t ru_minflt; /* page reclaims (soft page faults) */ uint64_t ru_majflt; /* page faults (hard page faults) */ uint64_t ru_nswap; /* swaps */ uint64_t ru_inblock; /* block input operations */ uint64_t ru_oublock; /* block output operations */ uint64_t ru_msgsnd; /* IPC messages sent */ uint64_t ru_msgrcv; /* IPC messages received */ uint64_t ru_nsignals; /* signals received */ uint64_t ru_nvcsw; /* voluntary context switches */ uint64_t ru_nivcsw; /* involuntary context switches */ } uv_rusage_t; UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, int* count); UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, int count); typedef enum { UV_FS_UNKNOWN = -1, UV_FS_CUSTOM, UV_FS_OPEN, UV_FS_CLOSE, UV_FS_READ, UV_FS_WRITE, UV_FS_SENDFILE, UV_FS_STAT, UV_FS_LSTAT, UV_FS_FSTAT, UV_FS_FTRUNCATE, UV_FS_UTIME, UV_FS_FUTIME, UV_FS_ACCESS, UV_FS_CHMOD, UV_FS_FCHMOD, UV_FS_FSYNC, UV_FS_FDATASYNC, UV_FS_UNLINK, UV_FS_RMDIR, UV_FS_MKDIR, UV_FS_MKDTEMP, UV_FS_RENAME, UV_FS_SCANDIR, UV_FS_LINK, UV_FS_SYMLINK, UV_FS_READLINK, UV_FS_CHOWN, UV_FS_FCHOWN } uv_fs_type; /* uv_fs_t is a subclass of uv_req_t. */ struct uv_fs_s { UV_REQ_FIELDS uv_fs_type fs_type; uv_loop_t* loop; uv_fs_cb cb; ssize_t result; void* ptr; const char* path; uv_stat_t statbuf; /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */ UV_FS_PRIVATE_FIELDS }; UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); UV_EXTERN int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb); UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb); UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb); UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent); UV_EXTERN int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb); UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb); UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset, uv_fs_cb cb); UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb); UV_EXTERN int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb); UV_EXTERN int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb); UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb); /* * This flag can be used with uv_fs_symlink() on Windows to specify whether * path argument points to a directory. */ #define UV_FS_SYMLINK_DIR 0x0001 /* * This flag can be used with uv_fs_symlink() on Windows to specify whether * the symlink is to be created using junction points. */ #define UV_FS_SYMLINK_JUNCTION 0x0002 UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb); UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb); UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb); UV_EXTERN int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb); enum uv_fs_event { UV_RENAME = 1, UV_CHANGE = 2 }; struct uv_fs_event_s { UV_HANDLE_FIELDS /* private */ char* path; UV_FS_EVENT_PRIVATE_FIELDS }; /* * uv_fs_stat() based polling file watcher. */ struct uv_fs_poll_s { UV_HANDLE_FIELDS /* Private, don't touch. */ void* poll_ctx; }; UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb poll_cb, const char* path, unsigned int interval); UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len); struct uv_signal_s { UV_HANDLE_FIELDS uv_signal_cb signal_cb; int signum; UV_SIGNAL_PRIVATE_FIELDS }; UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); UV_EXTERN int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum); UV_EXTERN int uv_signal_stop(uv_signal_t* handle); UV_EXTERN void uv_loadavg(double avg[3]); /* * Flags to be passed to uv_fs_event_start(). */ enum uv_fs_event_flags { /* * By default, if the fs event watcher is given a directory name, we will * watch for all events in that directory. This flags overrides this behavior * and makes fs_event report only changes to the directory entry itself. This * flag does not affect individual files watched. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_WATCH_ENTRY = 1, /* * By default uv_fs_event will try to use a kernel interface such as inotify * or kqueue to detect events. This may not work on remote filesystems such * as NFS mounts. This flag makes fs_event fall back to calling stat() on a * regular interval. * This flag is currently not implemented yet on any backend. */ UV_FS_EVENT_STAT = 2, /* * By default, event watcher, when watching directory, is not registering * (is ignoring) changes in it's subdirectories. * This flag will override this behaviour on platforms that support it. */ UV_FS_EVENT_RECURSIVE = 4 }; UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags); UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len); UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); UV_EXTERN int uv_exepath(char* buffer, size_t* size); UV_EXTERN int uv_cwd(char* buffer, size_t* size); UV_EXTERN int uv_chdir(const char* dir); UV_EXTERN uint64_t uv_get_free_memory(void); UV_EXTERN uint64_t uv_get_total_memory(void); UV_EXTERN extern uint64_t uv_hrtime(void); UV_EXTERN void uv_disable_stdio_inheritance(void); UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); UV_EXTERN void uv_dlclose(uv_lib_t* lib); UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); UV_EXTERN void uv_sem_post(uv_sem_t* sem); UV_EXTERN void uv_sem_wait(uv_sem_t* sem); UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); UV_EXTERN int uv_cond_init(uv_cond_t* cond); UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); UV_EXTERN void uv_cond_signal(uv_cond_t* cond); UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout); UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); UV_EXTERN int uv_key_create(uv_key_t* key); UV_EXTERN void uv_key_delete(uv_key_t* key); UV_EXTERN void* uv_key_get(uv_key_t* key); UV_EXTERN void uv_key_set(uv_key_t* key, void* value); typedef void (*uv_thread_cb)(void* arg); UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); UV_EXTERN uv_thread_t uv_thread_self(void); UV_EXTERN int uv_thread_join(uv_thread_t *tid); UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2); /* The presence of these unions force similar struct layout. */ #define XX(_, name) uv_ ## name ## _t name; union uv_any_handle { UV_HANDLE_TYPE_MAP(XX) }; union uv_any_req { UV_REQ_TYPE_MAP(XX) }; #undef XX struct uv_loop_s { /* User data - use this for whatever. */ void* data; /* Loop reference counting. */ unsigned int active_handles; void* handle_queue[2]; void* active_reqs[2]; /* Internal flag to signal loop stop. */ unsigned int stop_flag; UV_LOOP_PRIVATE_FIELDS }; /* Don't export the private CPP symbols. */ #undef UV_HANDLE_TYPE_PRIVATE #undef UV_REQ_TYPE_PRIVATE #undef UV_REQ_PRIVATE_FIELDS #undef UV_STREAM_PRIVATE_FIELDS #undef UV_TCP_PRIVATE_FIELDS #undef UV_PREPARE_PRIVATE_FIELDS #undef UV_CHECK_PRIVATE_FIELDS #undef UV_IDLE_PRIVATE_FIELDS #undef UV_ASYNC_PRIVATE_FIELDS #undef UV_TIMER_PRIVATE_FIELDS #undef UV_GETADDRINFO_PRIVATE_FIELDS #undef UV_GETNAMEINFO_PRIVATE_FIELDS #undef UV_FS_REQ_PRIVATE_FIELDS #undef UV_WORK_PRIVATE_FIELDS #undef UV_FS_EVENT_PRIVATE_FIELDS #undef UV_SIGNAL_PRIVATE_FIELDS #undef UV_LOOP_PRIVATE_FIELDS #undef UV_LOOP_PRIVATE_PLATFORM_FIELDS #ifdef __cplusplus } #endif #endif /* UV_H */ MoarVM-2015.11/3rdparty/libuv/libuv.pc.in0000644000175000017500000000040312456307253017017 0ustar jnthnjnthnprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: @PACKAGE_NAME@ Version: @PACKAGE_VERSION@ Description: multi-platform support library with a focus on asynchronous I/O. Libs: -L${libdir} -luv @LIBS@ Cflags: -I${includedir} MoarVM-2015.11/3rdparty/libuv/m4/.gitignore0000644000175000017500000000011412502366750017253 0ustar jnthnjnthn# Ignore libtoolize-generated files. *.m4 !as_case.m4 !libuv-check-flags.m4 MoarVM-2015.11/3rdparty/libuv/m4/as_case.m40000644000175000017500000000100312456307253017122 0ustar jnthnjnthn# AS_CASE(WORD, [PATTERN1], [IF-MATCHED1]...[DEFAULT]) # ---------------------------------------------------- # Expand into # | case WORD in # | PATTERN1) IF-MATCHED1 ;; # | ... # | *) DEFAULT ;; # | esac m4_define([_AS_CASE], [m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], [$#], 1, [ *) $1 ;;], [$#], 2, [ $1) m4_default([$2], [:]) ;;], [ $1) m4_default([$2], [:]) ;; $0(m4_shiftn(2, $@))])dnl ]) m4_defun([AS_CASE], [m4_ifval([$2$3], [case $1 in _AS_CASE(m4_shift($@)) esac])]) MoarVM-2015.11/3rdparty/libuv/m4/libuv-check-flags.m40000644000175000017500000002455712502366750021034 0ustar jnthnjnthndnl Macros to check the presence of generic (non-typed) symbols. dnl Copyright (c) 2006-2008 Diego Pettenà dnl Copyright (c) 2006-2008 xine project dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3, or (at your option) dnl any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA dnl 02110-1301, USA. dnl dnl As a special exception, the copyright owners of the dnl macro gives unlimited permission to copy, distribute and modify the dnl configure scripts that are the output of Autoconf when processing the dnl Macro. You need not follow the terms of the GNU General Public dnl License when using or distributing such scripts, even though portions dnl of the text of the Macro appear in them. The GNU General Public dnl License (GPL) does govern all other use of the material that dnl constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the dnl Autoconf Macro released by this project. When you make and dnl distribute a modified version of the Autoconf Macro, you may extend dnl this special exception to the GPL to apply to your modified version as dnl well. dnl Check if the flag is supported by compiler dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [ AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]), [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a;])], [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"], [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [$2], [$3]) ]) dnl Check if the flag is supported by compiler (cacheable) dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_CFLAGS], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_cflags_$1]), CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! ) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [$2], [$3]) ]) dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) dnl Check for CFLAG and appends them to CFLAGS if supported AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_cflags_$1]), CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! ) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3]) ]) dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [ for flag in $1; do CC_CHECK_CFLAG_APPEND($flag, [$2], [$3]) done ]) dnl Check if the flag is supported by linker (cacheable) dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_LDFLAGS], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_ldflags_$1]), [ac_save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $1" AC_LANG_PUSH([C]) AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])], [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) AC_LANG_POP([C]) LDFLAGS="$ac_save_LDFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], [$2], [$3]) ]) dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for dnl the current linker to avoid undefined references in a shared object. AC_DEFUN([CC_NOUNDEFINED], [ dnl We check $host for which systems to enable this for. AC_REQUIRE([AC_CANONICAL_HOST]) case $host in dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads dnl are requested, as different implementations are present; to avoid problems dnl use -Wl,-z,defs only for those platform not behaving this way. *-freebsd* | *-openbsd*) ;; *) dnl First of all check for the --no-undefined variant of GNU ld. This allows dnl for a much more readable commandline, so that people can understand what dnl it does without going to look for what the heck -z defs does. for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) break done ;; esac AC_SUBST([LDFLAGS_NOUNDEFINED]) ]) dnl Check for a -Werror flag or equivalent. -Werror is the GCC dnl and ICC flag that tells the compiler to treat all the warnings dnl as fatal. We usually need this option to make sure that some dnl constructs (like attributes) are not simply ignored. dnl dnl Other compilers don't support -Werror per se, but they support dnl an equivalent flag: dnl - Sun Studio compiler supports -errwarn=%all AC_DEFUN([CC_CHECK_WERROR], [ AC_CACHE_CHECK( [for $CC way to treat warnings as errors], [cc_cv_werror], [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) ]) ]) AC_DEFUN([CC_CHECK_ATTRIBUTE], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], AS_TR_SH([cc_cv_attribute_$1]), [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" AC_LANG_PUSH([C]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) AC_LANG_POP([C]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], [AC_DEFINE( AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] ) $4], [$5]) ]) AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ CC_CHECK_ATTRIBUTE( [constructor],, [void __attribute__((constructor)) ctor() { int a; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ CC_CHECK_ATTRIBUTE( [format], [format(printf, n, n)], [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ CC_CHECK_ATTRIBUTE( [format_arg], [format_arg(printf)], [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ CC_CHECK_ATTRIBUTE( [visibility_$1], [visibility("$1")], [void __attribute__((visibility("$1"))) $1_function() { }], [$2], [$3]) ]) AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ CC_CHECK_ATTRIBUTE( [nonnull], [nonnull()], [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ CC_CHECK_ATTRIBUTE( [unused], , [void some_function(void *foo, __attribute__((unused)) void *bar);], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ CC_CHECK_ATTRIBUTE( [sentinel], , [void some_function(void *foo, ...) __attribute__((sentinel));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ CC_CHECK_ATTRIBUTE( [deprecated], , [void some_function(void *foo, ...) __attribute__((deprecated));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ CC_CHECK_ATTRIBUTE( [alias], [weak, alias], [void other_function(void *foo) { } void some_function(void *foo) __attribute__((weak, alias("other_function")));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ CC_CHECK_ATTRIBUTE( [malloc], , [void * __attribute__((malloc)) my_alloc(int n);], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_PACKED], [ CC_CHECK_ATTRIBUTE( [packed], , [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_CONST], [ CC_CHECK_ATTRIBUTE( [const], , [int __attribute__((const)) twopow(int n) { return 1 << n; } ], [$1], [$2]) ]) AC_DEFUN([CC_FLAG_VISIBILITY], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], [cc_cv_flag_visibility], [cc_flag_visibility_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], cc_cv_flag_visibility='yes', cc_cv_flag_visibility='no') CFLAGS="$cc_flag_visibility_save_CFLAGS"]) AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, [Define this if the compiler supports the -fvisibility flag]) $1], [$2]) ]) AC_DEFUN([CC_FUNC_EXPECT], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if compiler has __builtin_expect function], [cc_cv_func_expect], [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" AC_LANG_PUSH([C]) AC_COMPILE_IFELSE([AC_LANG_SOURCE( [int some_function() { int a = 3; return (int)__builtin_expect(a, 3); }])], [cc_cv_func_expect=yes], [cc_cv_func_expect=no]) AC_LANG_POP([C]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([test "x$cc_cv_func_expect" = "xyes"], [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, [Define this if the compiler supports __builtin_expect() function]) $1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], [cc_cv_attribute_aligned], [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" AC_LANG_PUSH([C]) for cc_attribute_align_try in 64 32 16 8 4 2; do AC_COMPILE_IFELSE([AC_LANG_SOURCE([ int main() { static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; return c; }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) done AC_LANG_POP([C]) CFLAGS="$ac_save_CFLAGS" ]) if test "x$cc_cv_attribute_aligned" != "x"; then AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], [Define the highest alignment supported]) fi ])MoarVM-2015.11/3rdparty/libuv/samples/.gitignore0000644000175000017500000000214412456307253020405 0ustar jnthnjnthn# Copyright StrongLoop, Inc. All rights reserved. # # 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. *.mk *.Makefile MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/.gitignore0000644000175000017500000000213412456307253022772 0ustar jnthnjnthn# Copyright StrongLoop, Inc. All rights reserved. # # 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. /build/ MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/LICENSE0000644000175000017500000000512312456307253022010 0ustar jnthnjnthnFiles: * ======== Copyright StrongLoop, Inc. All rights reserved. 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. Files: getopt.c =============== Copyright (c) 1987, 1993, 1994 The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/Makefile0000644000175000017500000000313112456307253022440 0ustar jnthnjnthn# Copyright StrongLoop, Inc. All rights reserved. # # 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. BUILDTYPE ?= Debug BUILDDIR ?= build GYP ?= gyp V ?= SOURCES := client.c defs.h getopt.c main.c s5.c s5.h server.c util.c .PHONY: all clean all: $(BUILDDIR)/$(BUILDTYPE)/s5-proxy clean: $(RM) $(BUILDDIR) $(BUILDDIR)/$(BUILDTYPE)/s5-proxy: $(BUILDDIR)/Makefile $(SOURCES) $(MAKE) -C $(BUILDDIR) V=$(V) $(BUILDDIR)/Makefile: ../../common.gypi build.gyp $(GYP) \ -Duv_library=static_library \ -Goutput_dir=. \ -I../../common.gypi \ -f make \ --depth=. \ --generator-output=$(BUILDDIR) \ build.gyp MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/build.gyp0000644000175000017500000000307712456307253022631 0ustar jnthnjnthn# Copyright StrongLoop, Inc. All rights reserved. # # 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. { 'targets': [ { 'dependencies': ['../../uv.gyp:libuv'], 'target_name': 's5-proxy', 'type': 'executable', 'sources': [ 'client.c', 'defs.h', 'main.c', 's5.c', 's5.h', 'server.c', 'util.c', ], 'conditions': [ ['OS=="win"', { 'defines': ['HAVE_UNISTD_H=0'], 'sources': ['getopt.c'] }, { 'defines': ['HAVE_UNISTD_H=1'] }] ] } ] } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/client.c0000644000175000017500000005273512456307253022440 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "defs.h" #include #include #include /* A connection is modeled as an abstraction on top of two simple state * machines, one for reading and one for writing. Either state machine * is, when active, in one of three states: busy, done or stop; the fourth * and final state, dead, is an end state and only relevant when shutting * down the connection. A short overview: * * busy done stop * ----------|---------------------------|--------------------|------| * readable | waiting for incoming data | have incoming data | idle | * writable | busy writing out data | completed write | idle | * * We could remove the done state from the writable state machine. For our * purposes, it's functionally equivalent to the stop state. * * When the connection with upstream has been established, the client_ctx * moves into a state where incoming data from the client is sent upstream * and vice versa, incoming data from upstream is sent to the client. In * other words, we're just piping data back and forth. See conn_cycle() * for details. * * An interesting deviation from libuv's I/O model is that reads are discrete * rather than continuous events. In layman's terms, when a read operation * completes, the connection stops reading until further notice. * * The rationale for this approach is that we have to wait until the data * has been sent out again before we can reuse the read buffer. * * It also pleasingly unifies with the request model that libuv uses for * writes and everything else; libuv may switch to a request model for * reads in the future. */ enum conn_state { c_busy, /* Busy; waiting for incoming data or for a write to complete. */ c_done, /* Done; read incoming data or write finished. */ c_stop, /* Stopped. */ c_dead }; /* Session states. */ enum sess_state { s_handshake, /* Wait for client handshake. */ s_handshake_auth, /* Wait for client authentication data. */ s_req_start, /* Start waiting for request data. */ s_req_parse, /* Wait for request data. */ s_req_lookup, /* Wait for upstream hostname DNS lookup to complete. */ s_req_connect, /* Wait for uv_tcp_connect() to complete. */ s_proxy_start, /* Connected. Start piping data. */ s_proxy, /* Connected. Pipe data back and forth. */ s_kill, /* Tear down session. */ s_almost_dead_0, /* Waiting for finalizers to complete. */ s_almost_dead_1, /* Waiting for finalizers to complete. */ s_almost_dead_2, /* Waiting for finalizers to complete. */ s_almost_dead_3, /* Waiting for finalizers to complete. */ s_almost_dead_4, /* Waiting for finalizers to complete. */ s_dead /* Dead. Safe to free now. */ }; static void do_next(client_ctx *cx); static int do_handshake(client_ctx *cx); static int do_handshake_auth(client_ctx *cx); static int do_req_start(client_ctx *cx); static int do_req_parse(client_ctx *cx); static int do_req_lookup(client_ctx *cx); static int do_req_connect_start(client_ctx *cx); static int do_req_connect(client_ctx *cx); static int do_proxy_start(client_ctx *cx); static int do_proxy(client_ctx *cx); static int do_kill(client_ctx *cx); static int do_almost_dead(client_ctx *cx); static int conn_cycle(const char *who, conn *a, conn *b); static void conn_timer_reset(conn *c); static void conn_timer_expire(uv_timer_t *handle, int status); static void conn_getaddrinfo(conn *c, const char *hostname); static void conn_getaddrinfo_done(uv_getaddrinfo_t *req, int status, struct addrinfo *ai); static int conn_connect(conn *c); static void conn_connect_done(uv_connect_t *req, int status); static void conn_read(conn *c); static void conn_read_done(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf); static void conn_alloc(uv_handle_t *handle, size_t size, uv_buf_t *buf); static void conn_write(conn *c, const void *data, unsigned int len); static void conn_write_done(uv_write_t *req, int status); static void conn_close(conn *c); static void conn_close_done(uv_handle_t *handle); /* |incoming| has been initialized by server.c when this is called. */ void client_finish_init(server_ctx *sx, client_ctx *cx) { conn *incoming; conn *outgoing; cx->sx = sx; cx->state = s_handshake; s5_init(&cx->parser); incoming = &cx->incoming; incoming->client = cx; incoming->result = 0; incoming->rdstate = c_stop; incoming->wrstate = c_stop; incoming->idle_timeout = sx->idle_timeout; CHECK(0 == uv_timer_init(sx->loop, &incoming->timer_handle)); outgoing = &cx->outgoing; outgoing->client = cx; outgoing->result = 0; outgoing->rdstate = c_stop; outgoing->wrstate = c_stop; outgoing->idle_timeout = sx->idle_timeout; CHECK(0 == uv_tcp_init(cx->sx->loop, &outgoing->handle.tcp)); CHECK(0 == uv_timer_init(cx->sx->loop, &outgoing->timer_handle)); /* Wait for the initial packet. */ conn_read(incoming); } /* This is the core state machine that drives the client <-> upstream proxy. * We move through the initial handshake and authentication steps first and * end up (if all goes well) in the proxy state where we're just proxying * data between the client and upstream. */ static void do_next(client_ctx *cx) { int new_state; ASSERT(cx->state != s_dead); switch (cx->state) { case s_handshake: new_state = do_handshake(cx); break; case s_handshake_auth: new_state = do_handshake_auth(cx); break; case s_req_start: new_state = do_req_start(cx); break; case s_req_parse: new_state = do_req_parse(cx); break; case s_req_lookup: new_state = do_req_lookup(cx); break; case s_req_connect: new_state = do_req_connect(cx); break; case s_proxy_start: new_state = do_proxy_start(cx); break; case s_proxy: new_state = do_proxy(cx); break; case s_kill: new_state = do_kill(cx); break; case s_almost_dead_0: case s_almost_dead_1: case s_almost_dead_2: case s_almost_dead_3: case s_almost_dead_4: new_state = do_almost_dead(cx); break; default: UNREACHABLE(); } cx->state = new_state; if (cx->state == s_dead) { if (DEBUG_CHECKS) { memset(cx, -1, sizeof(*cx)); } free(cx); } } static int do_handshake(client_ctx *cx) { unsigned int methods; conn *incoming; s5_ctx *parser; uint8_t *data; size_t size; int err; parser = &cx->parser; incoming = &cx->incoming; ASSERT(incoming->rdstate == c_done); ASSERT(incoming->wrstate == c_stop); incoming->rdstate = c_stop; if (incoming->result < 0) { pr_err("read error: %s", uv_strerror(incoming->result)); return do_kill(cx); } data = (uint8_t *) incoming->t.buf; size = (size_t) incoming->result; err = s5_parse(parser, &data, &size); if (err == s5_ok) { conn_read(incoming); return s_handshake; /* Need more data. */ } if (size != 0) { /* Could allow a round-trip saving shortcut here if the requested auth * method is S5_AUTH_NONE (provided unauthenticated traffic is allowed.) * Requires client support however. */ pr_err("junk in handshake"); return do_kill(cx); } if (err != s5_auth_select) { pr_err("handshake error: %s", s5_strerror(err)); return do_kill(cx); } methods = s5_auth_methods(parser); if ((methods & S5_AUTH_NONE) && can_auth_none(cx->sx, cx)) { s5_select_auth(parser, S5_AUTH_NONE); conn_write(incoming, "\5\0", 2); /* No auth required. */ return s_req_start; } if ((methods & S5_AUTH_PASSWD) && can_auth_passwd(cx->sx, cx)) { /* TODO(bnoordhuis) Implement username/password auth. */ } conn_write(incoming, "\5\377", 2); /* No acceptable auth. */ return s_kill; } /* TODO(bnoordhuis) Implement username/password auth. */ static int do_handshake_auth(client_ctx *cx) { UNREACHABLE(); return do_kill(cx); } static int do_req_start(client_ctx *cx) { conn *incoming; incoming = &cx->incoming; ASSERT(incoming->rdstate == c_stop); ASSERT(incoming->wrstate == c_done); incoming->wrstate = c_stop; if (incoming->result < 0) { pr_err("write error: %s", uv_strerror(incoming->result)); return do_kill(cx); } conn_read(incoming); return s_req_parse; } static int do_req_parse(client_ctx *cx) { conn *incoming; conn *outgoing; s5_ctx *parser; uint8_t *data; size_t size; int err; parser = &cx->parser; incoming = &cx->incoming; outgoing = &cx->outgoing; ASSERT(incoming->rdstate == c_done); ASSERT(incoming->wrstate == c_stop); ASSERT(outgoing->rdstate == c_stop); ASSERT(outgoing->wrstate == c_stop); incoming->rdstate = c_stop; if (incoming->result < 0) { pr_err("read error: %s", uv_strerror(incoming->result)); return do_kill(cx); } data = (uint8_t *) incoming->t.buf; size = (size_t) incoming->result; err = s5_parse(parser, &data, &size); if (err == s5_ok) { conn_read(incoming); return s_req_parse; /* Need more data. */ } if (size != 0) { pr_err("junk in request %u", (unsigned) size); return do_kill(cx); } if (err != s5_exec_cmd) { pr_err("request error: %s", s5_strerror(err)); return do_kill(cx); } if (parser->cmd == s5_cmd_tcp_bind) { /* Not supported but relatively straightforward to implement. */ pr_warn("BIND requests are not supported."); return do_kill(cx); } if (parser->cmd == s5_cmd_udp_assoc) { /* Not supported. Might be hard to implement because libuv has no * functionality for detecting the MTU size which the RFC mandates. */ pr_warn("UDP ASSOC requests are not supported."); return do_kill(cx); } ASSERT(parser->cmd == s5_cmd_tcp_connect); if (parser->atyp == s5_atyp_host) { conn_getaddrinfo(outgoing, (const char *) parser->daddr); return s_req_lookup; } if (parser->atyp == s5_atyp_ipv4) { memset(&outgoing->t.addr4, 0, sizeof(outgoing->t.addr4)); outgoing->t.addr4.sin_family = AF_INET; outgoing->t.addr4.sin_port = htons(parser->dport); memcpy(&outgoing->t.addr4.sin_addr, parser->daddr, sizeof(outgoing->t.addr4.sin_addr)); } else if (parser->atyp == s5_atyp_ipv6) { memset(&outgoing->t.addr6, 0, sizeof(outgoing->t.addr6)); outgoing->t.addr6.sin6_family = AF_INET6; outgoing->t.addr6.sin6_port = htons(parser->dport); memcpy(&outgoing->t.addr6.sin6_addr, parser->daddr, sizeof(outgoing->t.addr6.sin6_addr)); } else { UNREACHABLE(); } return do_req_connect_start(cx); } static int do_req_lookup(client_ctx *cx) { s5_ctx *parser; conn *incoming; conn *outgoing; parser = &cx->parser; incoming = &cx->incoming; outgoing = &cx->outgoing; ASSERT(incoming->rdstate == c_stop); ASSERT(incoming->wrstate == c_stop); ASSERT(outgoing->rdstate == c_stop); ASSERT(outgoing->wrstate == c_stop); if (outgoing->result < 0) { /* TODO(bnoordhuis) Escape control characters in parser->daddr. */ pr_err("lookup error for \"%s\": %s", parser->daddr, uv_strerror(outgoing->result)); /* Send back a 'Host unreachable' reply. */ conn_write(incoming, "\5\4\0\1\0\0\0\0\0\0", 10); return s_kill; } /* Don't make assumptions about the offset of sin_port/sin6_port. */ switch (outgoing->t.addr.sa_family) { case AF_INET: outgoing->t.addr4.sin_port = htons(parser->dport); break; case AF_INET6: outgoing->t.addr6.sin6_port = htons(parser->dport); break; default: UNREACHABLE(); } return do_req_connect_start(cx); } /* Assumes that cx->outgoing.t.sa contains a valid AF_INET/AF_INET6 address. */ static int do_req_connect_start(client_ctx *cx) { conn *incoming; conn *outgoing; int err; incoming = &cx->incoming; outgoing = &cx->outgoing; ASSERT(incoming->rdstate == c_stop); ASSERT(incoming->wrstate == c_stop); ASSERT(outgoing->rdstate == c_stop); ASSERT(outgoing->wrstate == c_stop); if (!can_access(cx->sx, cx, &outgoing->t.addr)) { pr_warn("connection not allowed by ruleset"); /* Send a 'Connection not allowed by ruleset' reply. */ conn_write(incoming, "\5\2\0\1\0\0\0\0\0\0", 10); return s_kill; } err = conn_connect(outgoing); if (err != 0) { pr_err("connect error: %s\n", uv_strerror(err)); return do_kill(cx); } return s_req_connect; } static int do_req_connect(client_ctx *cx) { const struct sockaddr_in6 *in6; const struct sockaddr_in *in; char addr_storage[sizeof(*in6)]; conn *incoming; conn *outgoing; uint8_t *buf; int addrlen; incoming = &cx->incoming; outgoing = &cx->outgoing; ASSERT(incoming->rdstate == c_stop); ASSERT(incoming->wrstate == c_stop); ASSERT(outgoing->rdstate == c_stop); ASSERT(outgoing->wrstate == c_stop); /* Build and send the reply. Not very pretty but gets the job done. */ buf = (uint8_t *) incoming->t.buf; if (outgoing->result == 0) { /* The RFC mandates that the SOCKS server must include the local port * and address in the reply. So that's what we do. */ addrlen = sizeof(addr_storage); CHECK(0 == uv_tcp_getsockname(&outgoing->handle.tcp, (struct sockaddr *) addr_storage, &addrlen)); buf[0] = 5; /* Version. */ buf[1] = 0; /* Success. */ buf[2] = 0; /* Reserved. */ if (addrlen == sizeof(*in)) { buf[3] = 1; /* IPv4. */ in = (const struct sockaddr_in *) &addr_storage; memcpy(buf + 4, &in->sin_addr, 4); memcpy(buf + 8, &in->sin_port, 2); conn_write(incoming, buf, 10); } else if (addrlen == sizeof(*in6)) { buf[3] = 4; /* IPv6. */ in6 = (const struct sockaddr_in6 *) &addr_storage; memcpy(buf + 4, &in6->sin6_addr, 16); memcpy(buf + 20, &in6->sin6_port, 2); conn_write(incoming, buf, 22); } else { UNREACHABLE(); } return s_proxy_start; } else { pr_err("upstream connection error: %s\n", uv_strerror(outgoing->result)); /* Send a 'Connection refused' reply. */ conn_write(incoming, "\5\5\0\1\0\0\0\0\0\0", 10); return s_kill; } UNREACHABLE(); return s_kill; } static int do_proxy_start(client_ctx *cx) { conn *incoming; conn *outgoing; incoming = &cx->incoming; outgoing = &cx->outgoing; ASSERT(incoming->rdstate == c_stop); ASSERT(incoming->wrstate == c_done); ASSERT(outgoing->rdstate == c_stop); ASSERT(outgoing->wrstate == c_stop); incoming->wrstate = c_stop; if (incoming->result < 0) { pr_err("write error: %s", uv_strerror(incoming->result)); return do_kill(cx); } conn_read(incoming); conn_read(outgoing); return s_proxy; } /* Proxy incoming data back and forth. */ static int do_proxy(client_ctx *cx) { if (conn_cycle("client", &cx->incoming, &cx->outgoing)) { return do_kill(cx); } if (conn_cycle("upstream", &cx->outgoing, &cx->incoming)) { return do_kill(cx); } return s_proxy; } static int do_kill(client_ctx *cx) { int new_state; if (cx->state >= s_almost_dead_0) { return cx->state; } /* Try to cancel the request. The callback still runs but if the * cancellation succeeded, it gets called with status=UV_ECANCELED. */ new_state = s_almost_dead_1; if (cx->state == s_req_lookup) { new_state = s_almost_dead_0; uv_cancel(&cx->outgoing.t.req); } conn_close(&cx->incoming); conn_close(&cx->outgoing); return new_state; } static int do_almost_dead(client_ctx *cx) { ASSERT(cx->state >= s_almost_dead_0); return cx->state + 1; /* Another finalizer completed. */ } static int conn_cycle(const char *who, conn *a, conn *b) { if (a->result < 0) { if (a->result != UV_EOF) { pr_err("%s error: %s", who, uv_strerror(a->result)); } return -1; } if (b->result < 0) { return -1; } if (a->wrstate == c_done) { a->wrstate = c_stop; } /* The logic is as follows: read when we don't write and write when we don't * read. That gives us back-pressure handling for free because if the peer * sends data faster than we consume it, TCP congestion control kicks in. */ if (a->wrstate == c_stop) { if (b->rdstate == c_stop) { conn_read(b); } else if (b->rdstate == c_done) { conn_write(a, b->t.buf, b->result); b->rdstate = c_stop; /* Triggers the call to conn_read() above. */ } } return 0; } static void conn_timer_reset(conn *c) { CHECK(0 == uv_timer_start(&c->timer_handle, conn_timer_expire, c->idle_timeout, 0)); } static void conn_timer_expire(uv_timer_t *handle, int status) { conn *c; CHECK(0 == status); c = CONTAINER_OF(handle, conn, timer_handle); c->result = UV_ETIMEDOUT; do_next(c->client); } static void conn_getaddrinfo(conn *c, const char *hostname) { struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; CHECK(0 == uv_getaddrinfo(c->client->sx->loop, &c->t.addrinfo_req, conn_getaddrinfo_done, hostname, NULL, &hints)); conn_timer_reset(c); } static void conn_getaddrinfo_done(uv_getaddrinfo_t *req, int status, struct addrinfo *ai) { conn *c; c = CONTAINER_OF(req, conn, t.addrinfo_req); c->result = status; if (status == 0) { /* FIXME(bnoordhuis) Should try all addresses. */ if (ai->ai_family == AF_INET) { c->t.addr4 = *(const struct sockaddr_in *) ai->ai_addr; } else if (ai->ai_family == AF_INET6) { c->t.addr6 = *(const struct sockaddr_in6 *) ai->ai_addr; } else { UNREACHABLE(); } } uv_freeaddrinfo(ai); do_next(c->client); } /* Assumes that c->t.sa contains a valid AF_INET or AF_INET6 address. */ static int conn_connect(conn *c) { ASSERT(c->t.addr.sa_family == AF_INET || c->t.addr.sa_family == AF_INET6); conn_timer_reset(c); return uv_tcp_connect(&c->t.connect_req, &c->handle.tcp, &c->t.addr, conn_connect_done); } static void conn_connect_done(uv_connect_t *req, int status) { conn *c; if (status == UV_ECANCELED) { return; /* Handle has been closed. */ } c = CONTAINER_OF(req, conn, t.connect_req); c->result = status; do_next(c->client); } static void conn_read(conn *c) { ASSERT(c->rdstate == c_stop); CHECK(0 == uv_read_start(&c->handle.stream, conn_alloc, conn_read_done)); c->rdstate = c_busy; conn_timer_reset(c); } static void conn_read_done(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { conn *c; c = CONTAINER_OF(handle, conn, handle); ASSERT(c->t.buf == buf->base); ASSERT(c->rdstate == c_busy); c->rdstate = c_done; c->result = nread; uv_read_stop(&c->handle.stream); do_next(c->client); } static void conn_alloc(uv_handle_t *handle, size_t size, uv_buf_t *buf) { conn *c; c = CONTAINER_OF(handle, conn, handle); ASSERT(c->rdstate == c_busy); buf->base = c->t.buf; buf->len = sizeof(c->t.buf); } static void conn_write(conn *c, const void *data, unsigned int len) { uv_buf_t buf; ASSERT(c->wrstate == c_stop || c->wrstate == c_done); c->wrstate = c_busy; /* It's okay to cast away constness here, uv_write() won't modify the * memory. */ buf.base = (char *) data; buf.len = len; CHECK(0 == uv_write(&c->write_req, &c->handle.stream, &buf, 1, conn_write_done)); conn_timer_reset(c); } static void conn_write_done(uv_write_t *req, int status) { conn *c; if (status == UV_ECANCELED) { return; /* Handle has been closed. */ } c = CONTAINER_OF(req, conn, write_req); ASSERT(c->wrstate == c_busy); c->wrstate = c_done; c->result = status; do_next(c->client); } static void conn_close(conn *c) { ASSERT(c->rdstate != c_dead); ASSERT(c->wrstate != c_dead); c->rdstate = c_dead; c->wrstate = c_dead; c->timer_handle.data = c; c->handle.handle.data = c; uv_close(&c->handle.handle, conn_close_done); uv_close((uv_handle_t *) &c->timer_handle, conn_close_done); } static void conn_close_done(uv_handle_t *handle) { conn *c; c = handle->data; do_next(c->client); } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/defs.h0000644000175000017500000001077012456307253022101 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * 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. */ #ifndef DEFS_H_ #define DEFS_H_ #include "s5.h" #include "uv.h" #include #include /* sockaddr_in, sockaddr_in6 */ #include /* size_t, ssize_t */ #include #include /* sockaddr */ struct client_ctx; typedef struct { const char *bind_host; unsigned short bind_port; unsigned int idle_timeout; } server_config; typedef struct { unsigned int idle_timeout; /* Connection idle timeout in ms. */ uv_tcp_t tcp_handle; uv_loop_t *loop; } server_ctx; typedef struct { unsigned char rdstate; unsigned char wrstate; unsigned int idle_timeout; struct client_ctx *client; /* Backlink to owning client context. */ ssize_t result; union { uv_handle_t handle; uv_stream_t stream; uv_tcp_t tcp; uv_udp_t udp; } handle; uv_timer_t timer_handle; /* For detecting timeouts. */ uv_write_t write_req; /* We only need one of these at a time so make them share memory. */ union { uv_getaddrinfo_t addrinfo_req; uv_connect_t connect_req; uv_req_t req; struct sockaddr_in6 addr6; struct sockaddr_in addr4; struct sockaddr addr; char buf[2048]; /* Scratch space. Used to read data into. */ } t; } conn; typedef struct client_ctx { unsigned int state; server_ctx *sx; /* Backlink to owning server context. */ s5_ctx parser; /* The SOCKS protocol parser. */ conn incoming; /* Connection with the SOCKS client. */ conn outgoing; /* Connection with upstream. */ } client_ctx; /* server.c */ int server_run(const server_config *cf, uv_loop_t *loop); int can_auth_none(const server_ctx *sx, const client_ctx *cx); int can_auth_passwd(const server_ctx *sx, const client_ctx *cx); int can_access(const server_ctx *sx, const client_ctx *cx, const struct sockaddr *addr); /* client.c */ void client_finish_init(server_ctx *sx, client_ctx *cx); /* util.c */ #if defined(__GNUC__) # define ATTRIBUTE_FORMAT_PRINTF(a, b) __attribute__((format(printf, a, b))) #else # define ATTRIBUTE_FORMAT_PRINTF(a, b) #endif void pr_info(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2); void pr_warn(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2); void pr_err(const char *fmt, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2); void *xmalloc(size_t size); /* main.c */ const char *_getprogname(void); /* getopt.c */ #if !HAVE_UNISTD_H extern char *optarg; int getopt(int argc, char **argv, const char *options); #endif /* ASSERT() is for debug checks, CHECK() for run-time sanity checks. * DEBUG_CHECKS is for expensive debug checks that we only want to * enable in debug builds but still want type-checked by the compiler * in release builds. */ #if defined(NDEBUG) # define ASSERT(exp) # define CHECK(exp) do { if (!(exp)) abort(); } while (0) # define DEBUG_CHECKS (0) #else # define ASSERT(exp) assert(exp) # define CHECK(exp) assert(exp) # define DEBUG_CHECKS (1) #endif #define UNREACHABLE() CHECK(!"Unreachable code reached.") /* This macro looks complicated but it's not: it calculates the address * of the embedding struct through the address of the embedded struct. * In other words, if struct A embeds struct B, then we can obtain * the address of A by taking the address of B and subtracting the * field offset of B in A. */ #define CONTAINER_OF(ptr, type, field) \ ((type *) ((char *) (ptr) - ((char *) &((type *) 0)->field))) #endif /* DEFS_H_ */ MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/getopt.c0000644000175000017500000000771312456307253022460 0ustar jnthnjnthn/* $NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $ */ /* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; #endif /* LIBC_SCCS and not lint */ #include #include #include #include extern const char *_getprogname(void); int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const char *ostr; { static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (optreset || *place == 0) { /* update scanning pointer */ optreset = 0; place = nargv[optind]; if (optind >= nargc || *place++ != '-') { /* Argument is absent or is not an option */ place = EMSG; return (-1); } optopt = *place++; if (optopt == '-' && *place == 0) { /* "--" => end of options */ ++optind; place = EMSG; return (-1); } if (optopt == 0) { /* Solitary '-', treat as a '-' option if the program (eg su) is looking for it. */ place = EMSG; if (strchr(ostr, '-') == NULL) return (-1); optopt = '-'; } } else optopt = *place++; /* See if option letter is one the caller wanted... */ if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { if (*place == 0) ++optind; if (opterr && *ostr != ':') (void)fprintf(stderr, "%s: illegal option -- %c\n", _getprogname(), optopt); return (BADCH); } /* Does this option need an argument? */ if (oli[1] != ':') { /* don't need argument */ optarg = NULL; if (*place == 0) ++optind; } else { /* Option-argument is either the rest of this argument or the entire next argument. */ if (*place) optarg = place; else if (nargc > ++optind) optarg = nargv[optind]; else { /* option-argument absent */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", _getprogname(), optopt); return (BADCH); } place = EMSG; ++optind; } return (optopt); /* return option letter */ } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/main.c0000644000175000017500000000551712456307253022102 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "defs.h" #include #include #include #if HAVE_UNISTD_H #include /* getopt */ #endif #define DEFAULT_BIND_HOST "127.0.0.1" #define DEFAULT_BIND_PORT 1080 #define DEFAULT_IDLE_TIMEOUT (60 * 1000) static void parse_opts(server_config *cf, int argc, char **argv); static void usage(void); static const char *progname = __FILE__; /* Reset in main(). */ int main(int argc, char **argv) { server_config config; int err; progname = argv[0]; memset(&config, 0, sizeof(config)); config.bind_host = DEFAULT_BIND_HOST; config.bind_port = DEFAULT_BIND_PORT; config.idle_timeout = DEFAULT_IDLE_TIMEOUT; parse_opts(&config, argc, argv); err = server_run(&config, uv_default_loop()); if (err) { exit(1); } return 0; } const char *_getprogname(void) { return progname; } static void parse_opts(server_config *cf, int argc, char **argv) { int opt; while (-1 != (opt = getopt(argc, argv, "H:hp:"))) { switch (opt) { case 'H': cf->bind_host = optarg; break; case 'p': if (1 != sscanf(optarg, "%hu", &cf->bind_port)) { pr_err("bad port number: %s", optarg); usage(); } break; default: usage(); } } } static void usage(void) { printf("Usage:\n" "\n" " %s [-b
[-h] [-p ]\n" "\n" "Options:\n" "\n" " -b Bind to this address or hostname.\n" " Default: \"127.0.0.1\"\n" " -h Show this help message.\n" " -p Bind to this port number. Default: 1080\n" "", progname); exit(1); } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/s5.c0000644000175000017500000001454312456307253021504 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "s5.h" #include #include #include /* abort() */ #include /* memset() */ enum { s5_version, s5_nmethods, s5_methods, s5_auth_pw_version, s5_auth_pw_userlen, s5_auth_pw_username, s5_auth_pw_passlen, s5_auth_pw_password, s5_req_version, s5_req_cmd, s5_req_reserved, s5_req_atyp, s5_req_atyp_host, s5_req_daddr, s5_req_dport0, s5_req_dport1, s5_dead }; void s5_init(s5_ctx *cx) { memset(cx, 0, sizeof(*cx)); cx->state = s5_version; } s5_err s5_parse(s5_ctx *cx, uint8_t **data, size_t *size) { s5_err err; uint8_t *p; uint8_t c; size_t i; size_t n; p = *data; n = *size; i = 0; while (i < n) { c = p[i]; i += 1; switch (cx->state) { case s5_version: if (c != 5) { err = s5_bad_version; goto out; } cx->state = s5_nmethods; break; case s5_nmethods: cx->arg0 = 0; cx->arg1 = c; /* Number of bytes to read. */ cx->state = s5_methods; break; case s5_methods: if (cx->arg0 < cx->arg1) { switch (c) { case 0: cx->methods |= S5_AUTH_NONE; break; case 1: cx->methods |= S5_AUTH_GSSAPI; break; case 2: cx->methods |= S5_AUTH_PASSWD; break; /* Ignore everything we don't understand. */ } cx->arg0 += 1; } if (cx->arg0 == cx->arg1) { err = s5_auth_select; goto out; } break; case s5_auth_pw_version: if (c != 1) { err = s5_bad_version; goto out; } cx->state = s5_auth_pw_userlen; break; case s5_auth_pw_userlen: cx->arg0 = 0; cx->userlen = c; cx->state = s5_auth_pw_username; break; case s5_auth_pw_username: if (cx->arg0 < cx->userlen) { cx->username[cx->arg0] = c; cx->arg0 += 1; } if (cx->arg0 == cx->userlen) { cx->username[cx->userlen] = '\0'; cx->state = s5_auth_pw_passlen; } break; case s5_auth_pw_passlen: cx->arg0 = 0; cx->passlen = c; cx->state = s5_auth_pw_password; break; case s5_auth_pw_password: if (cx->arg0 < cx->passlen) { cx->password[cx->arg0] = c; cx->arg0 += 1; } if (cx->arg0 == cx->passlen) { cx->password[cx->passlen] = '\0'; cx->state = s5_req_version; err = s5_auth_verify; goto out; } break; case s5_req_version: if (c != 5) { err = s5_bad_version; goto out; } cx->state = s5_req_cmd; break; case s5_req_cmd: switch (c) { case 1: /* TCP connect */ cx->cmd = s5_cmd_tcp_connect; break; case 3: /* UDP associate */ cx->cmd = s5_cmd_udp_assoc; break; default: err = s5_bad_cmd; goto out; } cx->state = s5_req_reserved; break; case s5_req_reserved: cx->state = s5_req_atyp; break; case s5_req_atyp: cx->arg0 = 0; switch (c) { case 1: /* IPv4, four octets. */ cx->state = s5_req_daddr; cx->atyp = s5_atyp_ipv4; cx->arg1 = 4; break; case 3: /* Hostname. First byte is length. */ cx->state = s5_req_atyp_host; cx->atyp = s5_atyp_host; cx->arg1 = 0; break; case 4: /* IPv6, sixteen octets. */ cx->state = s5_req_daddr; cx->atyp = s5_atyp_ipv6; cx->arg1 = 16; break; default: err = s5_bad_atyp; goto out; } break; case s5_req_atyp_host: cx->arg1 = c; cx->state = s5_req_daddr; break; case s5_req_daddr: if (cx->arg0 < cx->arg1) { cx->daddr[cx->arg0] = c; cx->arg0 += 1; } if (cx->arg0 == cx->arg1) { cx->daddr[cx->arg1] = '\0'; cx->state = s5_req_dport0; } break; case s5_req_dport0: cx->dport = c << 8; cx->state = s5_req_dport1; break; case s5_req_dport1: cx->dport |= c; cx->state = s5_dead; err = s5_exec_cmd; goto out; case s5_dead: break; default: abort(); } } err = s5_ok; out: *data = p + i; *size = n - i; return err; } unsigned int s5_auth_methods(const s5_ctx *cx) { return cx->methods; } int s5_select_auth(s5_ctx *cx, s5_auth_method method) { int err; err = 0; switch (method) { case S5_AUTH_NONE: cx->state = s5_req_version; break; case S5_AUTH_PASSWD: cx->state = s5_auth_pw_version; break; default: err = -EINVAL; } return err; } const char *s5_strerror(s5_err err) { #define S5_ERR_GEN(_, name, errmsg) case s5_ ## name: return errmsg; switch (err) { S5_ERR_MAP(S5_ERR_GEN) default: ; /* Silence s5_max_errors -Wswitch warning. */ } #undef S5_ERR_GEN return "Unknown error."; } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/s5.h0000644000175000017500000000603212456307253021503 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * 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. */ #ifndef S5_H_ #define S5_H_ #include #include #define S5_ERR_MAP(V) \ V(-1, bad_version, "Bad protocol version.") \ V(-2, bad_cmd, "Bad protocol command.") \ V(-3, bad_atyp, "Bad address type.") \ V(0, ok, "No error.") \ V(1, auth_select, "Select authentication method.") \ V(2, auth_verify, "Verify authentication.") \ V(3, exec_cmd, "Execute command.") \ typedef enum { #define S5_ERR_GEN(code, name, _) s5_ ## name = code, S5_ERR_MAP(S5_ERR_GEN) #undef S5_ERR_GEN s5_max_errors } s5_err; typedef enum { S5_AUTH_NONE = 1 << 0, S5_AUTH_GSSAPI = 1 << 1, S5_AUTH_PASSWD = 1 << 2 } s5_auth_method; typedef enum { s5_auth_allow, s5_auth_deny } s5_auth_result; typedef enum { s5_atyp_ipv4, s5_atyp_ipv6, s5_atyp_host } s5_atyp; typedef enum { s5_cmd_tcp_connect, s5_cmd_tcp_bind, s5_cmd_udp_assoc } s5_cmd; typedef struct { uint32_t arg0; /* Scratch space for the state machine. */ uint32_t arg1; /* Scratch space for the state machine. */ uint8_t state; uint8_t methods; uint8_t cmd; uint8_t atyp; uint8_t userlen; uint8_t passlen; uint16_t dport; uint8_t username[257]; uint8_t password[257]; uint8_t daddr[257]; /* TODO(bnoordhuis) Merge with username/password. */ } s5_ctx; void s5_init(s5_ctx *ctx); s5_err s5_parse(s5_ctx *cx, uint8_t **data, size_t *size); /* Only call after s5_parse() has returned s5_want_auth_method. */ unsigned int s5_auth_methods(const s5_ctx *cx); /* Call after s5_parse() has returned s5_want_auth_method. */ int s5_select_auth(s5_ctx *cx, s5_auth_method method); const char *s5_strerror(s5_err err); #endif /* S5_H_ */ MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/server.c0000644000175000017500000001513512456307253022461 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "defs.h" #include /* INET6_ADDRSTRLEN */ #include #include #ifndef INET6_ADDRSTRLEN # define INET6_ADDRSTRLEN 63 #endif typedef struct { uv_getaddrinfo_t getaddrinfo_req; server_config config; server_ctx *servers; uv_loop_t *loop; } server_state; static void do_bind(uv_getaddrinfo_t *req, int status, struct addrinfo *ai); static void on_connection(uv_stream_t *server, int status); int server_run(const server_config *cf, uv_loop_t *loop) { struct addrinfo hints; server_state state; int err; memset(&state, 0, sizeof(state)); state.servers = NULL; state.config = *cf; state.loop = loop; /* Resolve the address of the interface that we should bind to. * The getaddrinfo callback starts the server and everything else. */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; err = uv_getaddrinfo(loop, &state.getaddrinfo_req, do_bind, cf->bind_host, NULL, &hints); if (err != 0) { pr_err("getaddrinfo: %s", uv_strerror(err)); return err; } /* Start the event loop. Control continues in do_bind(). */ if (uv_run(loop, UV_RUN_DEFAULT)) { abort(); } /* Please Valgrind. */ uv_loop_delete(loop); free(state.servers); return 0; } /* Bind a server to each address that getaddrinfo() reported. */ static void do_bind(uv_getaddrinfo_t *req, int status, struct addrinfo *addrs) { char addrbuf[INET6_ADDRSTRLEN + 1]; unsigned int ipv4_naddrs; unsigned int ipv6_naddrs; server_state *state; server_config *cf; struct addrinfo *ai; const void *addrv; const char *what; uv_loop_t *loop; server_ctx *sx; unsigned int n; int err; union { struct sockaddr addr; struct sockaddr_in addr4; struct sockaddr_in6 addr6; } s; state = CONTAINER_OF(req, server_state, getaddrinfo_req); loop = state->loop; cf = &state->config; if (status < 0) { pr_err("getaddrinfo(\"%s\"): %s", cf->bind_host, uv_strerror(status)); uv_freeaddrinfo(addrs); return; } ipv4_naddrs = 0; ipv6_naddrs = 0; for (ai = addrs; ai != NULL; ai = ai->ai_next) { if (ai->ai_family == AF_INET) { ipv4_naddrs += 1; } else if (ai->ai_family == AF_INET6) { ipv6_naddrs += 1; } } if (ipv4_naddrs == 0 && ipv6_naddrs == 0) { pr_err("%s has no IPv4/6 addresses", cf->bind_host); uv_freeaddrinfo(addrs); return; } state->servers = xmalloc((ipv4_naddrs + ipv6_naddrs) * sizeof(state->servers[0])); n = 0; for (ai = addrs; ai != NULL; ai = ai->ai_next) { if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) { continue; } if (ai->ai_family == AF_INET) { s.addr4 = *(const struct sockaddr_in *) ai->ai_addr; s.addr4.sin_port = htons(cf->bind_port); addrv = &s.addr4.sin_addr; } else if (ai->ai_family == AF_INET6) { s.addr6 = *(const struct sockaddr_in6 *) ai->ai_addr; s.addr6.sin6_port = htons(cf->bind_port); addrv = &s.addr6.sin6_addr; } else { UNREACHABLE(); } if (uv_inet_ntop(s.addr.sa_family, addrv, addrbuf, sizeof(addrbuf))) { UNREACHABLE(); } sx = state->servers + n; sx->loop = loop; sx->idle_timeout = state->config.idle_timeout; CHECK(0 == uv_tcp_init(loop, &sx->tcp_handle)); what = "uv_tcp_bind"; err = uv_tcp_bind(&sx->tcp_handle, &s.addr, 0); if (err == 0) { what = "uv_listen"; err = uv_listen((uv_stream_t *) &sx->tcp_handle, 128, on_connection); } if (err != 0) { pr_err("%s(\"%s:%hu\"): %s", what, addrbuf, cf->bind_port, uv_strerror(err)); while (n > 0) { n -= 1; uv_close((uv_handle_t *) (state->servers + n), NULL); } break; } pr_info("listening on %s:%hu", addrbuf, cf->bind_port); n += 1; } uv_freeaddrinfo(addrs); } static void on_connection(uv_stream_t *server, int status) { server_ctx *sx; client_ctx *cx; CHECK(status == 0); sx = CONTAINER_OF(server, server_ctx, tcp_handle); cx = xmalloc(sizeof(*cx)); CHECK(0 == uv_tcp_init(sx->loop, &cx->incoming.handle.tcp)); CHECK(0 == uv_accept(server, &cx->incoming.handle.stream)); client_finish_init(sx, cx); } int can_auth_none(const server_ctx *sx, const client_ctx *cx) { return 1; } int can_auth_passwd(const server_ctx *sx, const client_ctx *cx) { return 0; } int can_access(const server_ctx *sx, const client_ctx *cx, const struct sockaddr *addr) { const struct sockaddr_in6 *addr6; const struct sockaddr_in *addr4; const uint32_t *p; uint32_t a; uint32_t b; uint32_t c; uint32_t d; /* TODO(bnoordhuis) Implement proper access checks. For now, just reject * traffic to localhost. */ if (addr->sa_family == AF_INET) { addr4 = (const struct sockaddr_in *) addr; d = ntohl(addr4->sin_addr.s_addr); return (d >> 24) != 0x7F; } if (addr->sa_family == AF_INET6) { addr6 = (const struct sockaddr_in6 *) addr; p = (const uint32_t *) &addr6->sin6_addr.s6_addr; a = ntohl(p[0]); b = ntohl(p[1]); c = ntohl(p[2]); d = ntohl(p[3]); if (a == 0 && b == 0 && c == 0 && d == 1) { return 0; /* "::1" style address. */ } if (a == 0 && b == 0 && c == 0xFFFF && (d >> 24) == 0x7F) { return 0; /* "::ffff:127.x.x.x" style address. */ } return 1; } return 0; } MoarVM-2015.11/3rdparty/libuv/samples/socks5-proxy/util.c0000644000175000017500000000417412456307253022131 0ustar jnthnjnthn/* Copyright StrongLoop, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "defs.h" #include #include #include static void pr_do(FILE *stream, const char *label, const char *fmt, va_list ap); void *xmalloc(size_t size) { void *ptr; ptr = malloc(size); if (ptr == NULL) { pr_err("out of memory, need %lu bytes", (unsigned long) size); exit(1); } return ptr; } void pr_info(const char *fmt, ...) { va_list ap; va_start(ap, fmt); pr_do(stdout, "info", fmt, ap); va_end(ap); } void pr_warn(const char *fmt, ...) { va_list ap; va_start(ap, fmt); pr_do(stderr, "warn", fmt, ap); va_end(ap); } void pr_err(const char *fmt, ...) { va_list ap; va_start(ap, fmt); pr_do(stderr, "error", fmt, ap); va_end(ap); } static void pr_do(FILE *stream, const char *label, const char *fmt, va_list ap) { char fmtbuf[1024]; vsnprintf(fmtbuf, sizeof(fmtbuf), fmt, ap); fprintf(stream, "%s:%s: %s\n", _getprogname(), label, fmtbuf); } MoarVM-2015.11/3rdparty/libuv/src/fs-poll.c0000644000175000017500000001504012456307253017257 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #include #include #include struct poll_ctx { uv_fs_poll_t* parent_handle; /* NULL if parent has been stopped or closed */ int busy_polling; unsigned int interval; uint64_t start_time; uv_loop_t* loop; uv_fs_poll_cb poll_cb; uv_timer_t timer_handle; uv_fs_t fs_req; /* TODO(bnoordhuis) mark fs_req internal */ uv_stat_t statbuf; char path[1]; /* variable length */ }; static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b); static void poll_cb(uv_fs_t* req); static void timer_cb(uv_timer_t* timer); static void timer_close_cb(uv_handle_t* handle); static uv_stat_t zero_statbuf; int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_POLL); return 0; } int uv_fs_poll_start(uv_fs_poll_t* handle, uv_fs_poll_cb cb, const char* path, unsigned int interval) { struct poll_ctx* ctx; uv_loop_t* loop; size_t len; int err; if (uv__is_active(handle)) return 0; loop = handle->loop; len = strlen(path); ctx = calloc(1, sizeof(*ctx) + len); if (ctx == NULL) return UV_ENOMEM; ctx->loop = loop; ctx->poll_cb = cb; ctx->interval = interval ? interval : 1; ctx->start_time = uv_now(loop); ctx->parent_handle = handle; memcpy(ctx->path, path, len + 1); err = uv_timer_init(loop, &ctx->timer_handle); if (err < 0) goto error; ctx->timer_handle.flags |= UV__HANDLE_INTERNAL; uv__handle_unref(&ctx->timer_handle); err = uv_fs_stat(loop, &ctx->fs_req, ctx->path, poll_cb); if (err < 0) goto error; handle->poll_ctx = ctx; uv__handle_start(handle); return 0; error: free(ctx); return err; } int uv_fs_poll_stop(uv_fs_poll_t* handle) { struct poll_ctx* ctx; if (!uv__is_active(handle)) return 0; ctx = handle->poll_ctx; assert(ctx != NULL); assert(ctx->parent_handle != NULL); ctx->parent_handle = NULL; handle->poll_ctx = NULL; /* Close the timer if it's active. If it's inactive, there's a stat request * in progress and poll_cb will take care of the cleanup. */ if (uv__is_active(&ctx->timer_handle)) uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); uv__handle_stop(handle); return 0; } int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buf, size_t* len) { struct poll_ctx* ctx; size_t required_len; if (!uv__is_active(handle)) { *len = 0; return UV_EINVAL; } ctx = handle->poll_ctx; assert(ctx != NULL); required_len = strlen(ctx->path) + 1; if (required_len > *len) { *len = required_len; return UV_ENOBUFS; } memcpy(buf, ctx->path, required_len); *len = required_len; return 0; } void uv__fs_poll_close(uv_fs_poll_t* handle) { uv_fs_poll_stop(handle); } static void timer_cb(uv_timer_t* timer) { struct poll_ctx* ctx; ctx = container_of(timer, struct poll_ctx, timer_handle); assert(ctx->parent_handle != NULL); assert(ctx->parent_handle->poll_ctx == ctx); ctx->start_time = uv_now(ctx->loop); if (uv_fs_stat(ctx->loop, &ctx->fs_req, ctx->path, poll_cb)) abort(); } static void poll_cb(uv_fs_t* req) { uv_stat_t* statbuf; struct poll_ctx* ctx; uint64_t interval; ctx = container_of(req, struct poll_ctx, fs_req); if (ctx->parent_handle == NULL) { /* handle has been stopped or closed */ uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); uv_fs_req_cleanup(req); return; } if (req->result != 0) { if (ctx->busy_polling != req->result) { ctx->poll_cb(ctx->parent_handle, req->result, &ctx->statbuf, &zero_statbuf); ctx->busy_polling = req->result; } goto out; } statbuf = &req->statbuf; if (ctx->busy_polling != 0) if (ctx->busy_polling < 0 || !statbuf_eq(&ctx->statbuf, statbuf)) ctx->poll_cb(ctx->parent_handle, 0, &ctx->statbuf, statbuf); ctx->statbuf = *statbuf; ctx->busy_polling = 1; out: uv_fs_req_cleanup(req); if (ctx->parent_handle == NULL) { /* handle has been stopped by callback */ uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); return; } /* Reschedule timer, subtract the delay from doing the stat(). */ interval = ctx->interval; interval -= (uv_now(ctx->loop) - ctx->start_time) % interval; if (uv_timer_start(&ctx->timer_handle, timer_cb, interval, 0)) abort(); } static void timer_close_cb(uv_handle_t* handle) { free(container_of(handle, struct poll_ctx, timer_handle)); } static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b) { return a->st_ctim.tv_nsec == b->st_ctim.tv_nsec && a->st_mtim.tv_nsec == b->st_mtim.tv_nsec && a->st_birthtim.tv_nsec == b->st_birthtim.tv_nsec && a->st_ctim.tv_sec == b->st_ctim.tv_sec && a->st_mtim.tv_sec == b->st_mtim.tv_sec && a->st_birthtim.tv_sec == b->st_birthtim.tv_sec && a->st_size == b->st_size && a->st_mode == b->st_mode && a->st_uid == b->st_uid && a->st_gid == b->st_gid && a->st_ino == b->st_ino && a->st_dev == b->st_dev && a->st_flags == b->st_flags && a->st_gen == b->st_gen; } #if defined(_WIN32) #include "win/internal.h" #include "win/handle-inl.h" void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle) { assert(handle->flags & UV__HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } #endif /* _WIN32 */ MoarVM-2015.11/3rdparty/libuv/src/heap-inl.h0000644000175000017500000001561512456307253017415 0ustar jnthnjnthn/* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_SRC_HEAP_H_ #define UV_SRC_HEAP_H_ #include /* NULL */ #if defined(__GNUC__) # define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration #else # define HEAP_EXPORT(declaration) static declaration #endif struct heap_node { struct heap_node* left; struct heap_node* right; struct heap_node* parent; }; /* A binary min heap. The usual properties hold: the root is the lowest * element in the set, the height of the tree is at most log2(nodes) and * it's always a complete binary tree. * * The heap function try hard to detect corrupted tree nodes at the cost * of a minor reduction in performance. Compile with -DNDEBUG to disable. */ struct heap { struct heap_node* min; unsigned int nelts; }; /* Return non-zero if a < b. */ typedef int (*heap_compare_fn)(const struct heap_node* a, const struct heap_node* b); /* Public functions. */ HEAP_EXPORT(void heap_init(struct heap* heap)); HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)); HEAP_EXPORT(void heap_insert(struct heap* heap, struct heap_node* newnode, heap_compare_fn less_than)); HEAP_EXPORT(void heap_remove(struct heap* heap, struct heap_node* node, heap_compare_fn less_than)); HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)); /* Implementation follows. */ HEAP_EXPORT(void heap_init(struct heap* heap)) { heap->min = NULL; heap->nelts = 0; } HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)) { return heap->min; } /* Swap parent with child. Child moves closer to the root, parent moves away. */ static void heap_node_swap(struct heap* heap, struct heap_node* parent, struct heap_node* child) { struct heap_node* sibling; struct heap_node t; t = *parent; *parent = *child; *child = t; parent->parent = child; if (child->left == child) { child->left = parent; sibling = child->right; } else { child->right = parent; sibling = child->left; } if (sibling != NULL) sibling->parent = child; if (parent->left != NULL) parent->left->parent = parent; if (parent->right != NULL) parent->right->parent = parent; if (child->parent == NULL) heap->min = child; else if (child->parent->left == parent) child->parent->left = child; else child->parent->right = child; } HEAP_EXPORT(void heap_insert(struct heap* heap, struct heap_node* newnode, heap_compare_fn less_than)) { struct heap_node** parent; struct heap_node** child; unsigned int path; unsigned int n; unsigned int k; newnode->left = NULL; newnode->right = NULL; newnode->parent = NULL; /* Calculate the path from the root to the insertion point. This is a min * heap so we always insert at the left-most free node of the bottom row. */ path = 0; for (k = 0, n = 1 + heap->nelts; n >= 2; k += 1, n /= 2) path = (path << 1) | (n & 1); /* Now traverse the heap using the path we calculated in the previous step. */ parent = child = &heap->min; while (k > 0) { parent = child; if (path & 1) child = &(*child)->right; else child = &(*child)->left; path >>= 1; k -= 1; } /* Insert the new node. */ newnode->parent = *parent; *child = newnode; heap->nelts += 1; /* Walk up the tree and check at each node if the heap property holds. * It's a min heap so parent < child must be true. */ while (newnode->parent != NULL && less_than(newnode, newnode->parent)) heap_node_swap(heap, newnode->parent, newnode); } HEAP_EXPORT(void heap_remove(struct heap* heap, struct heap_node* node, heap_compare_fn less_than)) { struct heap_node* smallest; struct heap_node** max; struct heap_node* child; unsigned int path; unsigned int k; unsigned int n; if (heap->nelts == 0) return; /* Calculate the path from the min (the root) to the max, the left-most node * of the bottom row. */ path = 0; for (k = 0, n = heap->nelts; n >= 2; k += 1, n /= 2) path = (path << 1) | (n & 1); /* Now traverse the heap using the path we calculated in the previous step. */ max = &heap->min; while (k > 0) { if (path & 1) max = &(*max)->right; else max = &(*max)->left; path >>= 1; k -= 1; } heap->nelts -= 1; /* Unlink the max node. */ child = *max; *max = NULL; if (child == node) { /* We're removing either the max or the last node in the tree. */ if (child == heap->min) { heap->min = NULL; } return; } /* Replace the to be deleted node with the max node. */ child->left = node->left; child->right = node->right; child->parent = node->parent; if (child->left != NULL) { child->left->parent = child; } if (child->right != NULL) { child->right->parent = child; } if (node->parent == NULL) { heap->min = child; } else if (node->parent->left == node) { node->parent->left = child; } else { node->parent->right = child; } /* Walk down the subtree and check at each node if the heap property holds. * It's a min heap so parent < child must be true. If the parent is bigger, * swap it with the smallest child. */ for (;;) { smallest = child; if (child->left != NULL && less_than(child->left, smallest)) smallest = child->left; if (child->right != NULL && less_than(child->right, smallest)) smallest = child->right; if (smallest == child) break; heap_node_swap(heap, child, smallest); } /* Walk up the subtree and check that each parent is less than the node * this is required, because `max` node is not guaranteed to be the * actual maximum in tree */ while (child->parent != NULL && less_than(child, child->parent)) heap_node_swap(heap, child->parent, child); } HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)) { heap_remove(heap, heap->min, less_than); } #undef HEAP_EXPORT #endif /* UV_SRC_HEAP_H_ */ MoarVM-2015.11/3rdparty/libuv/src/inet.c0000644000175000017500000002015512456307253016645 0ustar jnthnjnthn/* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #include "uv.h" #include "uv-common.h" #define UV__INET_ADDRSTRLEN 16 #define UV__INET6_ADDRSTRLEN 46 static int inet_ntop4(const unsigned char *src, char *dst, size_t size); static int inet_ntop6(const unsigned char *src, char *dst, size_t size); static int inet_pton4(const char *src, unsigned char *dst); static int inet_pton6(const char *src, unsigned char *dst); int uv_inet_ntop(int af, const void* src, char* dst, size_t size) { switch (af) { case AF_INET: return (inet_ntop4(src, dst, size)); case AF_INET6: return (inet_ntop6(src, dst, size)); default: return UV_EAFNOSUPPORT; } /* NOTREACHED */ } static int inet_ntop4(const unsigned char *src, char *dst, size_t size) { static const char fmt[] = "%u.%u.%u.%u"; char tmp[UV__INET_ADDRSTRLEN]; int l; #ifndef _WIN32 l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); #else l = _snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); #endif if (l <= 0 || (size_t) l >= size) { return UV_ENOSPC; } strncpy(dst, tmp, size); dst[size - 1] = '\0'; return 0; } static int inet_ntop6(const unsigned char *src, char *dst, size_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough * to contain a value of the specified size. On some systems, like * Crays, there is no such thing as an integer variable with 16 bits. * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ char tmp[UV__INET6_ADDRSTRLEN], *tp; struct { int base, len; } best, cur; unsigned int words[sizeof(struct in6_addr) / sizeof(uint16_t)]; int i; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < (int) sizeof(struct in6_addr); i++) words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); best.base = -1; best.len = 0; cur.base = -1; cur.len = 0; for (i = 0; i < (int) ARRAY_SIZE(words); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < (int) ARRAY_SIZE(words); i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 7 && words[7] != 0x0001) || (best.len == 5 && words[5] == 0xffff))) { int err = inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)); if (err) return err; tp += strlen(tp); break; } tp += sprintf(tp, "%x", words[i]); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == ARRAY_SIZE(words)) *tp++ = ':'; *tp++ = '\0'; /* * Check for overflow, copy, and we're done. */ if ((size_t)(tp - tmp) > size) { return UV_ENOSPC; } strcpy(dst, tmp); return 0; } int uv_inet_pton(int af, const char* src, void* dst) { if (src == NULL || dst == NULL) return UV_EINVAL; switch (af) { case AF_INET: return (inet_pton4(src, dst)); case AF_INET6: { int len; char tmp[UV__INET6_ADDRSTRLEN], *s, *p; s = (char*) src; p = strchr(src, '%'); if (p != NULL) { s = tmp; len = p - src; if (len > UV__INET6_ADDRSTRLEN-1) return UV_EINVAL; memcpy(s, src, len); s[len] = '\0'; } return inet_pton6(s, dst); } default: return UV_EAFNOSUPPORT; } /* NOTREACHED */ } static int inet_pton4(const char *src, unsigned char *dst) { static const char digits[] = "0123456789"; int saw_digit, octets, ch; unsigned char tmp[sizeof(struct in_addr)], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr(digits, ch)) != NULL) { unsigned int nw = *tp * 10 + (pch - digits); if (saw_digit && *tp == 0) return UV_EINVAL; if (nw > 255) return UV_EINVAL; *tp = nw; if (!saw_digit) { if (++octets > 4) return UV_EINVAL; saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return UV_EINVAL; *++tp = 0; saw_digit = 0; } else return UV_EINVAL; } if (octets < 4) return UV_EINVAL; memcpy(dst, tmp, sizeof(struct in_addr)); return 0; } static int inet_pton6(const char *src, unsigned char *dst) { static const char xdigits_l[] = "0123456789abcdef", xdigits_u[] = "0123456789ABCDEF"; unsigned char tmp[sizeof(struct in6_addr)], *tp, *endp, *colonp; const char *xdigits, *curtok; int ch, seen_xdigits; unsigned int val; memset((tp = tmp), '\0', sizeof tmp); endp = tp + sizeof tmp; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return UV_EINVAL; curtok = src; seen_xdigits = 0; val = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) pch = strchr((xdigits = xdigits_u), ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (++seen_xdigits > 4) return UV_EINVAL; continue; } if (ch == ':') { curtok = src; if (!seen_xdigits) { if (colonp) return UV_EINVAL; colonp = tp; continue; } else if (*src == '\0') { return UV_EINVAL; } if (tp + sizeof(uint16_t) > endp) return UV_EINVAL; *tp++ = (unsigned char) (val >> 8) & 0xff; *tp++ = (unsigned char) val & 0xff; seen_xdigits = 0; val = 0; continue; } if (ch == '.' && ((tp + sizeof(struct in_addr)) <= endp)) { int err = inet_pton4(curtok, tp); if (err == 0) { tp += sizeof(struct in_addr); seen_xdigits = 0; break; /*%< '\\0' was seen by inet_pton4(). */ } } return UV_EINVAL; } if (seen_xdigits) { if (tp + sizeof(uint16_t) > endp) return UV_EINVAL; *tp++ = (unsigned char) (val >> 8) & 0xff; *tp++ = (unsigned char) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return UV_EINVAL; for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return UV_EINVAL; memcpy(dst, tmp, sizeof tmp); return 0; } MoarVM-2015.11/3rdparty/libuv/src/queue.h0000644000175000017500000001152112456307253017034 0ustar jnthnjnthn/* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef QUEUE_H_ #define QUEUE_H_ typedef void *QUEUE[2]; /* Private macros. */ #define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0])) #define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1])) #define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q))) #define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q))) /* Public macros. */ #define QUEUE_DATA(ptr, type, field) \ ((type *) ((char *) (ptr) - ((char *) &((type *) 0)->field))) #define QUEUE_FOREACH(q, h) \ for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q)) #define QUEUE_EMPTY(q) \ ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q)) #define QUEUE_HEAD(q) \ (QUEUE_NEXT(q)) #define QUEUE_INIT(q) \ do { \ QUEUE_NEXT(q) = (q); \ QUEUE_PREV(q) = (q); \ } \ while (0) #define QUEUE_ADD(h, n) \ do { \ QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n); \ QUEUE_NEXT_PREV(n) = QUEUE_PREV(h); \ QUEUE_PREV(h) = QUEUE_PREV(n); \ QUEUE_PREV_NEXT(h) = (h); \ } \ while (0) #define QUEUE_SPLIT(h, q, n) \ do { \ QUEUE_PREV(n) = QUEUE_PREV(h); \ QUEUE_PREV_NEXT(n) = (n); \ QUEUE_NEXT(n) = (q); \ QUEUE_PREV(h) = QUEUE_PREV(q); \ QUEUE_PREV_NEXT(h) = (h); \ QUEUE_PREV(q) = (n); \ } \ while (0) #define QUEUE_INSERT_HEAD(h, q) \ do { \ QUEUE_NEXT(q) = QUEUE_NEXT(h); \ QUEUE_PREV(q) = (h); \ QUEUE_NEXT_PREV(q) = (q); \ QUEUE_NEXT(h) = (q); \ } \ while (0) #define QUEUE_INSERT_TAIL(h, q) \ do { \ QUEUE_NEXT(q) = (h); \ QUEUE_PREV(q) = QUEUE_PREV(h); \ QUEUE_PREV_NEXT(q) = (q); \ QUEUE_PREV(h) = (q); \ } \ while (0) #define QUEUE_REMOVE(q) \ do { \ QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q); \ QUEUE_NEXT_PREV(q) = QUEUE_PREV(q); \ } \ while (0) #endif /* QUEUE_H_ */ MoarVM-2015.11/3rdparty/libuv/src/threadpool.c0000644000175000017500000001577512456307253020063 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv-common.h" #if !defined(_WIN32) # include "unix/internal.h" #else # include "win/req-inl.h" /* TODO(saghul): unify internal req functions */ static void uv__req_init(uv_loop_t* loop, uv_req_t* req, uv_req_type type) { uv_req_init(loop, req); req->type = type; uv__req_register(loop, req); } # define uv__req_init(loop, req, type) \ uv__req_init((loop), (uv_req_t*)(req), (type)) #endif #include #define MAX_THREADPOOL_SIZE 128 static uv_once_t once = UV_ONCE_INIT; static uv_cond_t cond; static uv_mutex_t mutex; static unsigned int nthreads; static uv_thread_t* threads; static uv_thread_t default_threads[4]; static QUEUE exit_message; static QUEUE wq; static volatile int initialized; static void uv__cancelled(struct uv__work* w) { abort(); } /* To avoid deadlock with uv_cancel() it's crucial that the worker * never holds the global mutex and the loop-local mutex at the same time. */ static void worker(void* arg) { struct uv__work* w; QUEUE* q; (void) arg; for (;;) { uv_mutex_lock(&mutex); while (QUEUE_EMPTY(&wq)) uv_cond_wait(&cond, &mutex); q = QUEUE_HEAD(&wq); if (q == &exit_message) uv_cond_signal(&cond); else { QUEUE_REMOVE(q); QUEUE_INIT(q); /* Signal uv_cancel() that the work req is executing. */ } uv_mutex_unlock(&mutex); if (q == &exit_message) break; w = QUEUE_DATA(q, struct uv__work, wq); w->work(w); uv_mutex_lock(&w->loop->wq_mutex); w->work = NULL; /* Signal uv_cancel() that the work req is done executing. */ QUEUE_INSERT_TAIL(&w->loop->wq, &w->wq); uv_async_send(&w->loop->wq_async); uv_mutex_unlock(&w->loop->wq_mutex); } } static void post(QUEUE* q) { uv_mutex_lock(&mutex); QUEUE_INSERT_TAIL(&wq, q); uv_cond_signal(&cond); uv_mutex_unlock(&mutex); } #ifndef _WIN32 UV_DESTRUCTOR(static void cleanup(void)) { unsigned int i; if (initialized == 0) return; post(&exit_message); for (i = 0; i < nthreads; i++) if (uv_thread_join(threads + i)) abort(); if (threads != default_threads) free(threads); uv_mutex_destroy(&mutex); uv_cond_destroy(&cond); threads = NULL; nthreads = 0; initialized = 0; } #endif static void init_once(void) { unsigned int i; const char* val; nthreads = ARRAY_SIZE(default_threads); val = getenv("UV_THREADPOOL_SIZE"); if (val != NULL) nthreads = atoi(val); if (nthreads == 0) nthreads = 1; if (nthreads > MAX_THREADPOOL_SIZE) nthreads = MAX_THREADPOOL_SIZE; threads = default_threads; if (nthreads > ARRAY_SIZE(default_threads)) { threads = malloc(nthreads * sizeof(threads[0])); if (threads == NULL) { nthreads = ARRAY_SIZE(default_threads); threads = default_threads; } } if (uv_cond_init(&cond)) abort(); if (uv_mutex_init(&mutex)) abort(); QUEUE_INIT(&wq); for (i = 0; i < nthreads; i++) if (uv_thread_create(threads + i, worker, NULL)) abort(); initialized = 1; } void uv__work_submit(uv_loop_t* loop, struct uv__work* w, void (*work)(struct uv__work* w), void (*done)(struct uv__work* w, int status)) { uv_once(&once, init_once); w->loop = loop; w->work = work; w->done = done; post(&w->wq); } static int uv__work_cancel(uv_loop_t* loop, uv_req_t* req, struct uv__work* w) { int cancelled; uv_mutex_lock(&mutex); uv_mutex_lock(&w->loop->wq_mutex); cancelled = !QUEUE_EMPTY(&w->wq) && w->work != NULL; if (cancelled) QUEUE_REMOVE(&w->wq); uv_mutex_unlock(&w->loop->wq_mutex); uv_mutex_unlock(&mutex); if (!cancelled) return UV_EBUSY; w->work = uv__cancelled; uv_mutex_lock(&loop->wq_mutex); QUEUE_INSERT_TAIL(&loop->wq, &w->wq); uv_async_send(&loop->wq_async); uv_mutex_unlock(&loop->wq_mutex); return 0; } void uv__work_done(uv_async_t* handle) { struct uv__work* w; uv_loop_t* loop; QUEUE* q; QUEUE wq; int err; loop = container_of(handle, uv_loop_t, wq_async); QUEUE_INIT(&wq); uv_mutex_lock(&loop->wq_mutex); if (!QUEUE_EMPTY(&loop->wq)) { q = QUEUE_HEAD(&loop->wq); QUEUE_SPLIT(&loop->wq, q, &wq); } uv_mutex_unlock(&loop->wq_mutex); while (!QUEUE_EMPTY(&wq)) { q = QUEUE_HEAD(&wq); QUEUE_REMOVE(q); w = container_of(q, struct uv__work, wq); err = (w->work == uv__cancelled) ? UV_ECANCELED : 0; w->done(w, err); } } static void uv__queue_work(struct uv__work* w) { uv_work_t* req = container_of(w, uv_work_t, work_req); req->work_cb(req); } static void uv__queue_done(struct uv__work* w, int err) { uv_work_t* req; req = container_of(w, uv_work_t, work_req); uv__req_unregister(req->loop, req); if (req->after_work_cb == NULL) return; req->after_work_cb(req, err); } int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) { if (work_cb == NULL) return UV_EINVAL; uv__req_init(loop, req, UV_WORK); req->loop = loop; req->work_cb = work_cb; req->after_work_cb = after_work_cb; uv__work_submit(loop, &req->work_req, uv__queue_work, uv__queue_done); return 0; } int uv_cancel(uv_req_t* req) { struct uv__work* wreq; uv_loop_t* loop; switch (req->type) { case UV_FS: loop = ((uv_fs_t*) req)->loop; wreq = &((uv_fs_t*) req)->work_req; break; case UV_GETADDRINFO: loop = ((uv_getaddrinfo_t*) req)->loop; wreq = &((uv_getaddrinfo_t*) req)->work_req; break; case UV_GETNAMEINFO: loop = ((uv_getnameinfo_t*) req)->loop; wreq = &((uv_getnameinfo_t*) req)->work_req; break; case UV_WORK: loop = ((uv_work_t*) req)->loop; wreq = &((uv_work_t*) req)->work_req; break; default: return UV_EINVAL; } return uv__work_cancel(loop, req, wreq); } MoarVM-2015.11/3rdparty/libuv/src/unix/aix.c0000644000175000017500000007665112456307253017466 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define RDWR_BUF_SIZE 4096 #define EQ(a,b) (strcmp(a,b) == 0) int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { loop->fs_fd = -1; /* Passing maxfd of -1 should mean the limit is determined * by the user's ulimit or the global limit as per the doc */ loop->backend_fd = pollset_create(-1); if (loop->backend_fd == -1) return -1; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->fs_fd != -1) { uv__close(loop->fs_fd); loop->fs_fd = -1; } if (loop->backend_fd != -1) { pollset_destroy(loop->backend_fd); loop->backend_fd = -1; } } void uv__io_poll(uv_loop_t* loop, int timeout) { struct pollfd events[1024]; struct pollfd pqry; struct pollfd* pe; struct poll_ctl pc; QUEUE* q; uv__io_t* w; uint64_t base; uint64_t diff; int nevents; int count; int nfds; int i; int rc; int add_failed; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); pc.events = w->pevents; pc.fd = w->fd; add_failed = 0; if (w->events == 0) { pc.cmd = PS_ADD; if (pollset_ctl(loop->backend_fd, &pc, 1)) { if (errno != EINVAL) { assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); abort(); } /* Check if the fd is already in the pollset */ pqry.fd = pc.fd; rc = pollset_query(loop->backend_fd, &pqry); switch (rc) { case -1: assert(0 && "Failed to query pollset for file descriptor"); abort(); case 0: assert(0 && "Pollset does not contain file descriptor"); abort(); } /* If we got here then the pollset already contained the file descriptor even though * we didn't think it should. This probably shouldn't happen, but we can continue. */ add_failed = 1; } } if (w->events != 0 || add_failed) { /* Modify, potentially removing events -- need to delete then add. * Could maybe mod if we knew for sure no events are removed, but * content of w->events is handled above as not reliable (falls back) * so may require a pollset_query() which would have to be pretty cheap * compared to a PS_DELETE to be worth optimising. Alternatively, could * lazily remove events, squelching them in the mean time. */ pc.cmd = PS_DELETE; if (pollset_ctl(loop->backend_fd, &pc, 1)) { assert(0 && "Failed to delete file descriptor (pc.fd) from pollset"); abort(); } pc.cmd = PS_ADD; if (pollset_ctl(loop->backend_fd, &pc, 1)) { assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); abort(); } } w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { nfds = pollset_poll(loop->backend_fd, events, ARRAY_SIZE(events), timeout); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) { abort(); } if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; pc.cmd = PS_DELETE; pc.fd = pe->fd; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (pc.fd == -1) continue; assert(pc.fd >= 0); assert((unsigned) pc.fd < loop->nwatchers); w = loop->watchers[pc.fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * * Ignore all errors because we may be racing with another thread * when the file descriptor is closed. */ pollset_ctl(loop->backend_fd, &pc, 1); continue; } w->cb(loop, w, pe->revents); nevents++; } loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } uint64_t uv__hrtime(uv_clocktype_t type) { uint64_t G = 1000000000; timebasestruct_t t; read_wall_time(&t, TIMEBASE_SZ); time_base_to_time(&t, TIMEBASE_SZ); return (uint64_t) t.tb_high * G + t.tb_low; } /* * We could use a static buffer for the path manipulations that we need outside * of the function, but this function could be called by multiple consumers and * we don't want to potentially create a race condition in the use of snprintf. * There is no direct way of getting the exe path in AIX - either through /procfs * or through some libc APIs. The below approach is to parse the argv[0]'s pattern * and use it in conjunction with PATH environment variable to craft one. */ int uv_exepath(char* buffer, size_t* size) { ssize_t res; char cwd[PATH_MAX], cwdl[PATH_MAX]; char symlink[PATH_MAX], temp_buffer[PATH_MAX]; char pp[64]; struct psinfo ps; int fd; char **argv; if ((buffer == NULL) || (size == NULL)) return -EINVAL; snprintf(pp, sizeof(pp), "/proc/%lu/psinfo", (unsigned long) getpid()); fd = open(pp, O_RDONLY); if (fd < 0) return fd; res = read(fd, &ps, sizeof(ps)); uv__close(fd); if (res < 0) return res; if (ps.pr_argv == 0) return -EINVAL; argv = (char **) *((char ***) (intptr_t) ps.pr_argv); if ((argv == NULL) || (argv[0] == NULL)) return -EINVAL; /* * Three possibilities for argv[0]: * i) an absolute path such as: /home/user/myprojects/nodejs/node * ii) a relative path such as: ./node or ./myprojects/nodejs/node * iii) a bare filename such as "node", after exporting PATH variable * to its location. */ /* case #1, absolute path. */ if (argv[0][0] == '/') { snprintf(symlink, PATH_MAX-1, "%s", argv[0]); /* This could or could not be a symlink. */ res = readlink(symlink, temp_buffer, PATH_MAX-1); /* if readlink fails, it is a normal file just copy symlink to the * outbut buffer. */ if (res < 0) { assert(*size > strlen(symlink)); strcpy(buffer, symlink); /* If it is a link, the resolved filename is again a relative path, * make it absolute. */ } else { assert(*size > (strlen(symlink) + 1 + strlen(temp_buffer))); snprintf(buffer, *size-1, "%s/%s", dirname(symlink), temp_buffer); } *size = strlen(buffer); return 0; /* case #2, relative path with usage of '.' */ } else if (argv[0][0] == '.') { char *relative = strchr(argv[0], '/'); if (relative == NULL) return -EINVAL; /* Get the current working directory to resolve the relative path. */ snprintf(cwd, PATH_MAX-1, "/proc/%lu/cwd", (unsigned long) getpid()); /* This is always a symlink, resolve it. */ res = readlink(cwd, cwdl, sizeof(cwdl) - 1); if (res < 0) return -errno; snprintf(symlink, PATH_MAX-1, "%s%s", cwdl, relative + 1); res = readlink(symlink, temp_buffer, PATH_MAX-1); if (res < 0) { assert(*size > strlen(symlink)); strcpy(buffer, symlink); } else { assert(*size > (strlen(symlink) + 1 + strlen(temp_buffer))); snprintf(buffer, *size-1, "%s/%s", dirname(symlink), temp_buffer); } *size = strlen(buffer); return 0; /* case #3, relative path without usage of '.', such as invocations in Node test suite. */ } else if (strchr(argv[0], '/') != NULL) { /* Get the current working directory to resolve the relative path. */ snprintf(cwd, PATH_MAX-1, "/proc/%lu/cwd", (unsigned long) getpid()); /* This is always a symlink, resolve it. */ res = readlink(cwd, cwdl, sizeof(cwdl) - 1); if (res < 0) return -errno; snprintf(symlink, PATH_MAX-1, "%s%s", cwdl, argv[0]); res = readlink(symlink, temp_buffer, PATH_MAX-1); if (res < 0) { assert(*size > strlen(symlink)); strcpy(buffer, symlink); } else { assert(*size > (strlen(symlink) + 1 + strlen(temp_buffer))); snprintf(buffer, *size-1, "%s/%s", dirname(symlink), temp_buffer); } *size = strlen(buffer); return 0; /* Usage of absolute filename with location exported in PATH */ } else { char clonedpath[8192]; /* assume 8k buffer will fit PATH */ char *token = NULL; struct stat statstruct; /* Get the paths. */ char *path = getenv("PATH"); if(sizeof(clonedpath) <= strlen(path)) return -EINVAL; /* Get a local copy. */ strcpy(clonedpath, path); /* Tokenize. */ token = strtok(clonedpath, ":"); /* Get current working directory. (may be required in the loop). */ snprintf(cwd, PATH_MAX-1, "/proc/%lu/cwd", (unsigned long) getpid()); res = readlink(cwd, cwdl, sizeof(cwdl) - 1); if (res < 0) return -errno; /* Run through the tokens, append our executable file name with each, * and see which one succeeds. Exit on first match. */ while(token != NULL) { if (token[0] == '.') { /* Path contains a token relative to current directory. */ char *relative = strchr(token, '/'); if (relative != NULL) /* A path which is not current directory. */ snprintf(symlink, PATH_MAX-1, "%s%s/%s", cwdl, relative+1, ps.pr_fname); else snprintf(symlink, PATH_MAX-1, "%s%s", cwdl, ps.pr_fname); if (stat(symlink, &statstruct) != -1) { /* File exists. Resolve if it is a link. */ res = readlink(symlink, temp_buffer, PATH_MAX-1); if (res < 0) { assert(*size > strlen(symlink)); strcpy(buffer, symlink); } else { assert(*size > (strlen(symlink) + 1 + strlen(temp_buffer))); snprintf(buffer, *size-1, "%s/%s", dirname(symlink), temp_buffer); } *size = strlen(buffer); return 0; } /* Absolute path names. */ } else { snprintf(symlink, PATH_MAX-1, "%s/%s", token, ps.pr_fname); if (stat(symlink, &statstruct) != -1) { res = readlink(symlink, temp_buffer, PATH_MAX-1); if (res < 0) { assert(*size > strlen(symlink)); strcpy(buffer, symlink); } else { assert(*size > (strlen(symlink) + 1 + strlen(temp_buffer))); snprintf(buffer, *size-1, "%s/%s", dirname(symlink), temp_buffer); } *size = strlen(buffer); return 0; } } token = strtok(NULL, ":"); } /* Out of tokens (path entries), and no match found */ return -EINVAL; } } uint64_t uv_get_free_memory(void) { perfstat_memory_total_t mem_total; int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); if (result == -1) { return 0; } return mem_total.real_free * 4096; } uint64_t uv_get_total_memory(void) { perfstat_memory_total_t mem_total; int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); if (result == -1) { return 0; } return mem_total.real_total * 4096; } void uv_loadavg(double avg[3]) { perfstat_cpu_total_t ps_total; int result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); if (result == -1) { avg[0] = 0.; avg[1] = 0.; avg[2] = 0.; return; } avg[0] = ps_total.loadavg[0] / (double)(1 << SBITS); avg[1] = ps_total.loadavg[1] / (double)(1 << SBITS); avg[2] = ps_total.loadavg[2] / (double)(1 << SBITS); } static char *uv__rawname(char *cp) { static char rawbuf[FILENAME_MAX+1]; char *dp = rindex(cp, '/'); if (dp == 0) return 0; *dp = 0; strcpy(rawbuf, cp); *dp = '/'; strcat(rawbuf, "/r"); strcat(rawbuf, dp+1); return rawbuf; } /* * Determine whether given pathname is a directory * Returns 0 if the path is a directory, -1 if not * * Note: Opportunity here for more detailed error information but * that requires changing callers of this function as well */ static int uv__path_is_a_directory(char* filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return -1; /* failed: not a directory, assume it is a file */ if (statbuf.st_type == VDIR) return 0; return -1; } /* * Check whether AHAFS is mounted. * Returns 0 if AHAFS is mounted, or an error code < 0 on failure */ static int uv__is_ahafs_mounted(void){ int rv, i = 2; struct vmount *p; int size_multiplier = 10; size_t siz = sizeof(struct vmount)*size_multiplier; struct vmount *vmt; const char *dev = "/aha"; char *obj, *stub; p = malloc(siz); if (p == NULL) return -errno; /* Retrieve all mounted filesystems */ rv = mntctl(MCTL_QUERY, siz, (char*)p); if (rv < 0) return -errno; if (rv == 0) { /* buffer was not large enough, reallocate to correct size */ siz = *(int*)p; free(p); p = malloc(siz); if (p == NULL) return -errno; rv = mntctl(MCTL_QUERY, siz, (char*)p); if (rv < 0) return -errno; } /* Look for dev in filesystems mount info */ for(vmt = p, i = 0; i < rv; i++) { obj = vmt2dataptr(vmt, VMT_OBJECT); /* device */ stub = vmt2dataptr(vmt, VMT_STUB); /* mount point */ if (EQ(obj, dev) || EQ(uv__rawname(obj), dev) || EQ(stub, dev)) { free(p); /* Found a match */ return 0; } vmt = (struct vmount *) ((char *) vmt + vmt->vmt_length); } /* /aha is required for monitoring filesystem changes */ return -1; } /* * Recursive call to mkdir() to create intermediate folders, if any * Returns code from mkdir call */ static int uv__makedir_p(const char *dir) { char tmp[256]; char *p = NULL; size_t len; int err; snprintf(tmp, sizeof(tmp),"%s",dir); len = strlen(tmp); if (tmp[len - 1] == '/') tmp[len - 1] = 0; for (p = tmp + 1; *p; p++) { if (*p == '/') { *p = 0; err = mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); if(err != 0) return err; *p = '/'; } } return mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } /* * Creates necessary subdirectories in the AIX Event Infrastructure * file system for monitoring the object specified. * Returns code from mkdir call */ static int uv__make_subdirs_p(const char *filename) { char cmd[2048]; char *p; int rc = 0; /* Strip off the monitor file name */ p = strrchr(filename, '/'); if (p == NULL) return 0; if (uv__path_is_a_directory((char*)filename) == 0) { sprintf(cmd, "/aha/fs/modDir.monFactory"); } else { sprintf(cmd, "/aha/fs/modFile.monFactory"); } strncat(cmd, filename, (p - filename)); rc = uv__makedir_p(cmd); if (rc == -1 && errno != EEXIST){ return -errno; } return rc; } /* * Checks if /aha is mounted, then proceeds to set up the monitoring * objects for the specified file. * Returns 0 on success, or an error code < 0 on failure */ static int uv__setup_ahafs(const char* filename, int *fd) { int rc = 0; char mon_file_write_string[RDWR_BUF_SIZE]; char mon_file[PATH_MAX]; int file_is_directory = 0; /* -1 == NO, 0 == YES */ /* Create monitor file name for object */ file_is_directory = uv__path_is_a_directory((char*)filename); if (file_is_directory == 0) sprintf(mon_file, "/aha/fs/modDir.monFactory"); else sprintf(mon_file, "/aha/fs/modFile.monFactory"); if ((strlen(mon_file) + strlen(filename) + 5) > PATH_MAX) return -ENAMETOOLONG; /* Make the necessary subdirectories for the monitor file */ rc = uv__make_subdirs_p(filename); if (rc == -1 && errno != EEXIST) return rc; strcat(mon_file, filename); strcat(mon_file, ".mon"); *fd = 0; errno = 0; /* Open the monitor file, creating it if necessary */ *fd = open(mon_file, O_CREAT|O_RDWR); if (*fd < 0) return -errno; /* Write out the monitoring specifications. * In this case, we are monitoring for a state change event type * CHANGED=YES * We will be waiting in select call, rather than a read: * WAIT_TYPE=WAIT_IN_SELECT * We only want minimal information for files: * INFO_LVL=1 * For directories, we want more information to track what file * caused the change * INFO_LVL=2 */ if (file_is_directory == 0) sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=2"); else sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=1"); rc = write(*fd, mon_file_write_string, strlen(mon_file_write_string)+1); if (rc < 0) return -errno; return 0; } /* * Skips a specified number of lines in the buffer passed in. * Walks the buffer pointed to by p and attempts to skip n lines. * Returns the total number of lines skipped */ static int uv__skip_lines(char **p, int n) { int lines = 0; while(n > 0) { *p = strchr(*p, '\n'); if (!p) return lines; (*p)++; n--; lines++; } return lines; } /* * Parse the event occurrence data to figure out what event just occurred * and take proper action. * * The buf is a pointer to the buffer containing the event occurrence data * Returns 0 on success, -1 if unrecoverable error in parsing * */ static int uv__parse_data(char *buf, int *events, uv_fs_event_t* handle) { int evp_rc, i; char *p; char filename[PATH_MAX]; /* To be used when handling directories */ p = buf; *events = 0; /* Clean the filename buffer*/ for(i = 0; i < PATH_MAX; i++) { filename[i] = 0; } i = 0; /* Check for BUF_WRAP */ if (strncmp(buf, "BUF_WRAP", strlen("BUF_WRAP")) == 0) { assert(0 && "Buffer wrap detected, Some event occurrences lost!"); return 0; } /* Since we are using the default buffer size (4K), and have specified * INFO_LVL=1, we won't see any EVENT_OVERFLOW conditions. Applications * should check for this keyword if they are using an INFO_LVL of 2 or * higher, and have a buffer size of <= 4K */ /* Skip to RC_FROM_EVPROD */ if (uv__skip_lines(&p, 9) != 9) return -1; if (sscanf(p, "RC_FROM_EVPROD=%d\nEND_EVENT_DATA", &evp_rc) == 1) { if (uv__path_is_a_directory(handle->path) == 0) { /* Directory */ if (evp_rc == AHAFS_MODDIR_UNMOUNT || evp_rc == AHAFS_MODDIR_REMOVE_SELF) { /* The directory is no longer available for monitoring */ *events = UV_RENAME; handle->dir_filename = NULL; } else { /* A file was added/removed inside the directory */ *events = UV_CHANGE; /* Get the EVPROD_INFO */ if (uv__skip_lines(&p, 1) != 1) return -1; /* Scan out the name of the file that triggered the event*/ if (sscanf(p, "BEGIN_EVPROD_INFO\n%sEND_EVPROD_INFO", filename) == 1) { handle->dir_filename = strdup((const char*)&filename); } else return -1; } } else { /* Regular File */ if (evp_rc == AHAFS_MODFILE_RENAME) *events = UV_RENAME; else *events = UV_CHANGE; } } else return -1; return 0; } /* This is the internal callback */ static void uv__ahafs_event(uv_loop_t* loop, uv__io_t* event_watch, unsigned int fflags) { char result_data[RDWR_BUF_SIZE]; int bytes, rc = 0; uv_fs_event_t* handle; int events = 0; int i = 0; char fname[PATH_MAX]; char *p; handle = container_of(event_watch, uv_fs_event_t, event_watcher); /* Clean all the buffers*/ for(i = 0; i < PATH_MAX; i++) { fname[i] = 0; } i = 0; /* At this point, we assume that polling has been done on the * file descriptor, so we can just read the AHAFS event occurrence * data and parse its results without having to block anything */ bytes = pread(event_watch->fd, result_data, RDWR_BUF_SIZE, 0); assert((bytes <= 0) && "uv__ahafs_event - Error reading monitor file"); /* Parse the data */ if(bytes > 0) rc = uv__parse_data(result_data, &events, handle); /* For directory changes, the name of the files that triggered the change * are never absolute pathnames */ if (uv__path_is_a_directory(handle->path) == 0) { p = handle->dir_filename; while(*p != NULL){ fname[i]= *p; i++; p++; } } else { /* For file changes, figure out whether filename is absolute or not */ if (handle->path[0] == '/') { p = strrchr(handle->path, '/'); p++; while(*p != NULL) { fname[i]= *p; i++; p++; } } } /* Unrecoverable error */ if (rc == -1) return; else /* Call the actual JavaScript callback function */ handle->cb(handle, (const char*)&fname, events, 0); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { int fd, rc, i = 0, res = 0; char cwd[PATH_MAX]; char absolute_path[PATH_MAX]; char fname[PATH_MAX]; char *p; /* Clean all the buffers*/ for(i = 0; i < PATH_MAX; i++) { cwd[i] = 0; absolute_path[i] = 0; fname[i] = 0; } i = 0; /* Figure out whether filename is absolute or not */ if (filename[0] == '/') { /* We have absolute pathname, create the relative pathname*/ sprintf(absolute_path, filename); p = strrchr(filename, '/'); p++; } else { if (filename[0] == '.' && filename[1] == '/') { /* We have a relative pathname, compose the absolute pathname */ sprintf(fname, filename); snprintf(cwd, PATH_MAX-1, "/proc/%lu/cwd", (unsigned long) getpid()); res = readlink(cwd, absolute_path, sizeof(absolute_path) - 1); if (res < 0) return res; p = strrchr(absolute_path, '/'); p++; p++; } else { /* We have a relative pathname, compose the absolute pathname */ sprintf(fname, filename); snprintf(cwd, PATH_MAX-1, "/proc/%lu/cwd", (unsigned long) getpid()); res = readlink(cwd, absolute_path, sizeof(absolute_path) - 1); if (res < 0) return res; p = strrchr(absolute_path, '/'); p++; } /* Copy to filename buffer */ while(filename[i] != NULL) { *p = filename[i]; i++; p++; } } if (uv__is_ahafs_mounted() < 0) /* /aha checks failed */ return UV_ENOSYS; /* Setup ahafs */ rc = uv__setup_ahafs((const char *)absolute_path, &fd); if (rc != 0) return rc; /* Setup/Initialize all the libuv routines */ uv__handle_start(handle); uv__io_init(&handle->event_watcher, uv__ahafs_event, fd); handle->path = strdup((const char*)&absolute_path); handle->cb = cb; uv__io_start(handle->loop, &handle->event_watcher, UV__POLLIN); return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; uv__io_close(handle->loop, &handle->event_watcher); uv__handle_stop(handle); if (uv__path_is_a_directory(handle->path) == 0) { free(handle->dir_filename); handle->dir_filename = NULL; } free(handle->path); handle->path = NULL; uv__close(handle->event_watcher.fd); handle->event_watcher.fd = -1; return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } char** uv_setup_args(int argc, char** argv) { return argv; } int uv_set_process_title(const char* title) { return 0; } int uv_get_process_title(char* buffer, size_t size) { if (size > 0) { buffer[0] = '\0'; } return 0; } int uv_resident_set_memory(size_t* rss) { char pp[64]; psinfo_t psinfo; int err; int fd; snprintf(pp, sizeof(pp), "/proc/%lu/psinfo", (unsigned long) getpid()); fd = open(pp, O_RDONLY); if (fd == -1) return -errno; /* FIXME(bnoordhuis) Handle EINTR. */ err = -EINVAL; if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { *rss = (size_t)psinfo.pr_rssize * 1024; err = 0; } uv__close(fd); return err; } int uv_uptime(double* uptime) { struct utmp *utmp_buf; size_t entries = 0; time_t boot_time; utmpname(UTMP_FILE); setutent(); while ((utmp_buf = getutent()) != NULL) { if (utmp_buf->ut_user[0] && utmp_buf->ut_type == USER_PROCESS) ++entries; if (utmp_buf->ut_type == BOOT_TIME) boot_time = utmp_buf->ut_time; } endutent(); if (boot_time == 0) return -ENOSYS; *uptime = time(NULL) - boot_time; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { uv_cpu_info_t* cpu_info; perfstat_cpu_total_t ps_total; perfstat_cpu_t* ps_cpus; perfstat_id_t cpu_id; int result, ncpus, idx = 0; result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); if (result == -1) { return -ENOSYS; } ncpus = result = perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0); if (result == -1) { return -ENOSYS; } ps_cpus = (perfstat_cpu_t*) malloc(ncpus * sizeof(perfstat_cpu_t)); if (!ps_cpus) { return -ENOMEM; } strcpy(cpu_id.name, FIRST_CPU); result = perfstat_cpu(&cpu_id, ps_cpus, sizeof(perfstat_cpu_t), ncpus); if (result == -1) { free(ps_cpus); return -ENOSYS; } *cpu_infos = (uv_cpu_info_t*) malloc(ncpus * sizeof(uv_cpu_info_t)); if (!*cpu_infos) { free(ps_cpus); return -ENOMEM; } *count = ncpus; cpu_info = *cpu_infos; while (idx < ncpus) { cpu_info->speed = (int)(ps_total.processorHZ / 1000000); cpu_info->model = strdup(ps_total.description); cpu_info->cpu_times.user = ps_cpus[idx].user; cpu_info->cpu_times.sys = ps_cpus[idx].sys; cpu_info->cpu_times.idle = ps_cpus[idx].idle; cpu_info->cpu_times.irq = ps_cpus[idx].wait; cpu_info->cpu_times.nice = 0; cpu_info++; idx++; } free(ps_cpus); return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; ++i) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { uv_interface_address_t* address; int sockfd, size = 1; struct ifconf ifc; struct ifreq *ifr, *p, flg; *count = 0; if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) { return -ENOSYS; } if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) { uv__close(sockfd); return -ENOSYS; } ifc.ifc_req = (struct ifreq*)malloc(size); ifc.ifc_len = size; if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) { uv__close(sockfd); return -ENOSYS; } #define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p)) /* Count all up and running ipv4/ipv6 addresses */ ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { uv__close(sockfd); return -ENOSYS; } if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; (*count)++; } /* Alloc the return interface structs */ *addresses = (uv_interface_address_t*) malloc(*count * sizeof(uv_interface_address_t)); if (!(*addresses)) { uv__close(sockfd); return -ENOMEM; } address = *addresses; ifr = ifc.ifc_req; while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { p = ifr; ifr = (struct ifreq*) ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); if (!(p->ifr_addr.sa_family == AF_INET6 || p->ifr_addr.sa_family == AF_INET)) continue; memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { uv__close(sockfd); return -ENOSYS; } if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) continue; /* All conditions above must match count loop */ address->name = strdup(p->ifr_name); if (p->ifr_addr.sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr); } else { address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr); } /* TODO: Retrieve netmask using SIOCGIFNETMASK ioctl */ address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0; address++; } #undef ADDR_SIZE uv__close(sockfd); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; ++i) { free(addresses[i].name); } free(addresses); } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct pollfd* events; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); events = (struct pollfd*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events == NULL) return; /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].fd == fd) events[i].fd = -1; } MoarVM-2015.11/3rdparty/libuv/src/unix/android-ifaddrs.c0000644000175000017500000004660012456307253021726 0ustar jnthnjnthn/* Copyright (c) 2013, Kenneth MacKay Copyright (c) 2014, Emergya (Cloud4all, FP7/2007-2013 grant agreement n° 289016) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "android-ifaddrs.h" #include #include #include #include #include #include #include #include #include typedef struct NetlinkList { struct NetlinkList *m_next; struct nlmsghdr *m_data; unsigned int m_size; } NetlinkList; static int netlink_socket(void) { struct sockaddr_nl l_addr; int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if(l_socket < 0) { return -1; } memset(&l_addr, 0, sizeof(l_addr)); l_addr.nl_family = AF_NETLINK; if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) { close(l_socket); return -1; } return l_socket; } static int netlink_send(int p_socket, int p_request) { char l_buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))]; struct nlmsghdr *l_hdr; struct rtgenmsg *l_msg; struct sockaddr_nl l_addr; memset(l_buffer, 0, sizeof(l_buffer)); l_hdr = (struct nlmsghdr *)l_buffer; l_msg = (struct rtgenmsg *)NLMSG_DATA(l_hdr); l_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*l_msg)); l_hdr->nlmsg_type = p_request; l_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; l_hdr->nlmsg_pid = 0; l_hdr->nlmsg_seq = p_socket; l_msg->rtgen_family = AF_UNSPEC; memset(&l_addr, 0, sizeof(l_addr)); l_addr.nl_family = AF_NETLINK; return (sendto(p_socket, l_hdr, l_hdr->nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr))); } static int netlink_recv(int p_socket, void *p_buffer, size_t p_len) { struct sockaddr_nl l_addr; struct msghdr l_msg; struct iovec l_iov; l_iov.iov_base = p_buffer; l_iov.iov_len = p_len; for(;;) { int l_result; l_msg.msg_name = (void *)&l_addr; l_msg.msg_namelen = sizeof(l_addr); l_msg.msg_iov = &l_iov; l_msg.msg_iovlen = 1; l_msg.msg_control = NULL; l_msg.msg_controllen = 0; l_msg.msg_flags = 0; l_result = recvmsg(p_socket, &l_msg, 0); if(l_result < 0) { if(errno == EINTR) { continue; } return -2; } /* Buffer was too small */ if(l_msg.msg_flags & MSG_TRUNC) { return -1; } return l_result; } } static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done) { size_t l_size = 4096; void *l_buffer = NULL; for(;;) { int l_read; free(l_buffer); l_buffer = malloc(l_size); if (l_buffer == NULL) { return NULL; } l_read = netlink_recv(p_socket, l_buffer, l_size); *p_size = l_read; if(l_read == -2) { free(l_buffer); return NULL; } if(l_read >= 0) { pid_t l_pid = getpid(); struct nlmsghdr *l_hdr; for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) { if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { *p_done = 1; break; } if(l_hdr->nlmsg_type == NLMSG_ERROR) { free(l_buffer); return NULL; } } return l_buffer; } l_size *= 2; } } static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) { NetlinkList *l_item = malloc(sizeof(NetlinkList)); if (l_item == NULL) { return NULL; } l_item->m_next = NULL; l_item->m_data = p_data; l_item->m_size = p_size; return l_item; } static void freeResultList(NetlinkList *p_list) { NetlinkList *l_cur; while(p_list) { l_cur = p_list; p_list = p_list->m_next; free(l_cur->m_data); free(l_cur); } } static NetlinkList *getResultList(int p_socket, int p_request) { int l_size; int l_done; NetlinkList *l_list; NetlinkList *l_end; if(netlink_send(p_socket, p_request) < 0) { return NULL; } l_list = NULL; l_end = NULL; l_done = 0; while(!l_done) { NetlinkList *l_item; struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done); /* Error */ if(!l_hdr) { freeResultList(l_list); return NULL; } l_item = newListItem(l_hdr, l_size); if (!l_item) { freeResultList(l_list); return NULL; } if(!l_list) { l_list = l_item; } else { l_end->m_next = l_item; } l_end = l_item; } return l_list; } static size_t maxSize(size_t a, size_t b) { return (a > b ? a : b); } static size_t calcAddrLen(sa_family_t p_family, int p_dataSize) { switch(p_family) { case AF_INET: return sizeof(struct sockaddr_in); case AF_INET6: return sizeof(struct sockaddr_in6); case AF_PACKET: return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize); default: return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize); } } static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size) { switch(p_family) { case AF_INET: memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size); break; case AF_INET6: memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size); break; case AF_PACKET: memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size); ((struct sockaddr_ll*)p_dest)->sll_halen = p_size; break; default: memcpy(p_dest->sa_data, p_data, p_size); break; } p_dest->sa_family = p_family; } static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) { if(!*p_resultList) { *p_resultList = p_entry; } else { struct ifaddrs *l_cur = *p_resultList; while(l_cur->ifa_next) { l_cur = l_cur->ifa_next; } l_cur->ifa_next = p_entry; } } static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList) { struct ifaddrs *l_entry; char *l_index; char *l_name; char *l_addr; char *l_data; struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr); size_t l_nameSize = 0; size_t l_addrSize = 0; size_t l_dataSize = 0; size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); struct rtattr *l_rta; for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFLA_ADDRESS: case IFLA_BROADCAST: l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize)); break; case IFLA_IFNAME: l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); break; case IFLA_STATS: l_dataSize += NLMSG_ALIGN(l_rtaSize); break; default: break; } } l_entry = malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); if (l_entry == NULL) { return -1; } memset(l_entry, 0, sizeof(struct ifaddrs)); l_entry->ifa_name = ""; l_index = ((char *)l_entry) + sizeof(struct ifaddrs); l_name = l_index + sizeof(int); l_addr = l_name + l_nameSize; l_data = l_addr + l_addrSize; /* Save the interface index so we can look it up when handling the * addresses. */ memcpy(l_index, &l_info->ifi_index, sizeof(int)); l_entry->ifa_flags = l_info->ifi_flags; l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFLA_ADDRESS: case IFLA_BROADCAST: { size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize); makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); ((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; ((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; if(l_rta->rta_type == IFLA_ADDRESS) { l_entry->ifa_addr = (struct sockaddr *)l_addr; } else { l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; } l_addr += NLMSG_ALIGN(l_addrLen); break; } case IFLA_IFNAME: strncpy(l_name, l_rtaData, l_rtaDataSize); l_name[l_rtaDataSize] = '\0'; l_entry->ifa_name = l_name; break; case IFLA_STATS: memcpy(l_data, l_rtaData, l_rtaDataSize); l_entry->ifa_data = l_data; break; default: break; } } addToEnd(p_resultList, l_entry); return 0; } static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) { int l_num = 0; struct ifaddrs *l_cur = *p_links; while(l_cur && l_num < p_numLinks) { char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); int l_index; memcpy(&l_index, l_indexPtr, sizeof(int)); if(l_index == p_index) { return l_cur; } l_cur = l_cur->ifa_next; ++l_num; } return NULL; } static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) { struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); size_t l_nameSize = 0; size_t l_addrSize = 0; int l_addedNetmask = 0; size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); struct rtattr *l_rta; struct ifaddrs *l_entry; char *l_name; char *l_addr; for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); if(l_info->ifa_family == AF_PACKET) { continue; } switch(l_rta->rta_type) { case IFA_ADDRESS: case IFA_LOCAL: if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) { /* Make room for netmask */ l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); l_addedNetmask = 1; } case IFA_BROADCAST: l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); break; case IFA_LABEL: l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); break; default: break; } } l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); if (l_entry == NULL) { return -1; } memset(l_entry, 0, sizeof(struct ifaddrs)); l_entry->ifa_name = (l_interface ? l_interface->ifa_name : ""); l_name = ((char *)l_entry) + sizeof(struct ifaddrs); l_addr = l_name + l_nameSize; l_entry->ifa_flags = l_info->ifa_flags; if(l_interface) { l_entry->ifa_flags |= l_interface->ifa_flags; } l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) { case IFA_ADDRESS: case IFA_BROADCAST: case IFA_LOCAL: { size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); if(l_info->ifa_family == AF_INET6) { if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) { ((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; } } /* Apparently in a point-to-point network IFA_ADDRESS contains * the dest address and IFA_LOCAL contains the local address */ if(l_rta->rta_type == IFA_ADDRESS) { if(l_entry->ifa_addr) { l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; } else { l_entry->ifa_addr = (struct sockaddr *)l_addr; } } else if(l_rta->rta_type == IFA_LOCAL) { if(l_entry->ifa_addr) { l_entry->ifa_dstaddr = l_entry->ifa_addr; } l_entry->ifa_addr = (struct sockaddr *)l_addr; } else { l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; } l_addr += NLMSG_ALIGN(l_addrLen); break; } case IFA_LABEL: strncpy(l_name, l_rtaData, l_rtaDataSize); l_name[l_rtaDataSize] = '\0'; l_entry->ifa_name = l_name; break; default: break; } } if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) { unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128); unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen); char l_mask[16] = {0}; unsigned i; for(i=0; i<(l_prefix/8); ++i) { l_mask[i] = 0xff; } if(l_prefix % 8) { l_mask[i] = 0xff << (8 - (l_prefix % 8)); } makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8); l_entry->ifa_netmask = (struct sockaddr *)l_addr; } addToEnd(p_resultList, l_entry); return 0; } static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList) { int l_numLinks = 0; pid_t l_pid = getpid(); for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { unsigned int l_nlsize = p_netlinkList->m_size; struct nlmsghdr *l_hdr; for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { break; } if(l_hdr->nlmsg_type == RTM_NEWLINK) { if(interpretLink(l_hdr, p_resultList) == -1) { return -1; } ++l_numLinks; } } } return l_numLinks; } static int interpretAddrs(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks) { pid_t l_pid = getpid(); for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { unsigned int l_nlsize = p_netlinkList->m_size; struct nlmsghdr *l_hdr; for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) { continue; } if(l_hdr->nlmsg_type == NLMSG_DONE) { break; } if(l_hdr->nlmsg_type == RTM_NEWADDR) { if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) { return -1; } } } } return 0; } int getifaddrs(struct ifaddrs **ifap) { int l_socket; int l_result; int l_numLinks; NetlinkList *l_linkResults; NetlinkList *l_addrResults; if(!ifap) { return -1; } *ifap = NULL; l_socket = netlink_socket(); if(l_socket < 0) { return -1; } l_linkResults = getResultList(l_socket, RTM_GETLINK); if(!l_linkResults) { close(l_socket); return -1; } l_addrResults = getResultList(l_socket, RTM_GETADDR); if(!l_addrResults) { close(l_socket); freeResultList(l_linkResults); return -1; } l_result = 0; l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); if(l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) { l_result = -1; } freeResultList(l_linkResults); freeResultList(l_addrResults); close(l_socket); return l_result; } void freeifaddrs(struct ifaddrs *ifa) { struct ifaddrs *l_cur; while(ifa) { l_cur = ifa; ifa = ifa->ifa_next; free(l_cur); } } MoarVM-2015.11/3rdparty/libuv/src/unix/async.c0000644000175000017500000001570612456307253020014 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * 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. */ /* This file contains both the uv__async internal infrastructure and the * user-facing uv_async_t functions. */ #include "uv.h" #include "internal.h" #include #include /* snprintf() */ #include #include #include #include static void uv__async_event(uv_loop_t* loop, struct uv__async* w, unsigned int nevents); static int uv__async_make_pending(int* pending); static int uv__async_eventfd(void); int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { int err; err = uv__async_start(loop, &loop->async_watcher, uv__async_event); if (err) return err; uv__handle_init(loop, (uv_handle_t*)handle, UV_ASYNC); handle->async_cb = async_cb; handle->pending = 0; QUEUE_INSERT_TAIL(&loop->async_handles, &handle->queue); uv__handle_start(handle); return 0; } int uv_async_send(uv_async_t* handle) { if (uv__async_make_pending(&handle->pending) == 0) uv__async_send(&handle->loop->async_watcher); return 0; } void uv__async_close(uv_async_t* handle) { QUEUE_REMOVE(&handle->queue); uv__handle_stop(handle); } static void uv__async_event(uv_loop_t* loop, struct uv__async* w, unsigned int nevents) { QUEUE* q; uv_async_t* h; QUEUE_FOREACH(q, &loop->async_handles) { h = QUEUE_DATA(q, uv_async_t, queue); if (h->pending == 0) continue; h->pending = 0; if (h->async_cb == NULL) continue; h->async_cb(h); } } static int uv__async_make_pending(int* pending) { /* Do a cheap read first. */ if (ACCESS_ONCE(int, *pending) != 0) return 1; /* Micro-optimization: use atomic memory operations to detect if we've been * preempted by another thread and don't have to make an expensive syscall. * This speeds up the heavily contended case by about 1-2% and has little * if any impact on the non-contended case. * * Use XCHG instead of the CMPXCHG that __sync_val_compare_and_swap() emits * on x86, it's about 4x faster. It probably makes zero difference in the * grand scheme of things but I'm OCD enough not to let this one pass. */ #if defined(__i386__) || defined(__x86_64__) { unsigned int val = 1; __asm__ __volatile__ ("xchgl %0, %1" : "+r" (val) : "m" (*pending)); return val != 0; } #elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 0) return __sync_val_compare_and_swap(pending, 0, 1) != 0; #else ACCESS_ONCE(int, *pending) = 1; return 0; #endif } static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { struct uv__async* wa; char buf[1024]; unsigned n; ssize_t r; n = 0; for (;;) { r = read(w->fd, buf, sizeof(buf)); if (r > 0) n += r; if (r == sizeof(buf)) continue; if (r != -1) break; if (errno == EAGAIN || errno == EWOULDBLOCK) break; if (errno == EINTR) continue; abort(); } wa = container_of(w, struct uv__async, io_watcher); #if defined(__linux__) if (wa->wfd == -1) { uint64_t val; assert(n == sizeof(val)); memcpy(&val, buf, sizeof(val)); /* Avoid alignment issues. */ wa->cb(loop, wa, val); return; } #endif wa->cb(loop, wa, n); } void uv__async_send(struct uv__async* wa) { const void* buf; ssize_t len; int fd; int r; buf = ""; len = 1; fd = wa->wfd; #if defined(__linux__) if (fd == -1) { static const uint64_t val = 1; buf = &val; len = sizeof(val); fd = wa->io_watcher.fd; /* eventfd */ } #endif do r = write(fd, buf, len); while (r == -1 && errno == EINTR); if (r == len) return; if (r == -1) if (errno == EAGAIN || errno == EWOULDBLOCK) return; abort(); } void uv__async_init(struct uv__async* wa) { wa->io_watcher.fd = -1; wa->wfd = -1; } int uv__async_start(uv_loop_t* loop, struct uv__async* wa, uv__async_cb cb) { int pipefd[2]; int err; if (wa->io_watcher.fd != -1) return 0; err = uv__async_eventfd(); if (err >= 0) { pipefd[0] = err; pipefd[1] = -1; } else if (err == -ENOSYS) { err = uv__make_pipe(pipefd, UV__F_NONBLOCK); #if defined(__linux__) /* Save a file descriptor by opening one of the pipe descriptors as * read/write through the procfs. That file descriptor can then * function as both ends of the pipe. */ if (err == 0) { char buf[32]; int fd; snprintf(buf, sizeof(buf), "/proc/self/fd/%d", pipefd[0]); fd = uv__open_cloexec(buf, O_RDWR); if (fd >= 0) { uv__close(pipefd[0]); uv__close(pipefd[1]); pipefd[0] = fd; pipefd[1] = fd; } } #endif } if (err < 0) return err; uv__io_init(&wa->io_watcher, uv__async_io, pipefd[0]); uv__io_start(loop, &wa->io_watcher, UV__POLLIN); wa->wfd = pipefd[1]; wa->cb = cb; return 0; } void uv__async_stop(uv_loop_t* loop, struct uv__async* wa) { if (wa->io_watcher.fd == -1) return; if (wa->wfd != -1) { if (wa->wfd != wa->io_watcher.fd) uv__close(wa->wfd); wa->wfd = -1; } uv__io_stop(loop, &wa->io_watcher, UV__POLLIN); uv__close(wa->io_watcher.fd); wa->io_watcher.fd = -1; } static int uv__async_eventfd() { #if defined(__linux__) static int no_eventfd2; static int no_eventfd; int fd; if (no_eventfd2) goto skip_eventfd2; fd = uv__eventfd2(0, UV__EFD_CLOEXEC | UV__EFD_NONBLOCK); if (fd != -1) return fd; if (errno != ENOSYS) return -errno; no_eventfd2 = 1; skip_eventfd2: if (no_eventfd) goto skip_eventfd; fd = uv__eventfd(0); if (fd != -1) { uv__cloexec(fd, 1); uv__nonblock(fd, 1); return fd; } if (errno != ENOSYS) return -errno; no_eventfd = 1; skip_eventfd: #endif return -ENOSYS; } MoarVM-2015.11/3rdparty/libuv/src/unix/atomic-ops.h0000644000175000017500000000422512456307253020751 0ustar jnthnjnthn/* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_ATOMIC_OPS_H_ #define UV_ATOMIC_OPS_H_ #include "internal.h" /* UV_UNUSED */ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)); UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)); UV_UNUSED(static void cpu_relax(void)); /* Prefer hand-rolled assembly over the gcc builtins because the latter also * issue full memory barriers. */ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { #if defined(__i386__) || defined(__x86_64__) int out; __asm__ __volatile__ ("lock; cmpxchg %2, %1;" : "=a" (out), "+m" (*(volatile int*) ptr) : "r" (newval), "0" (oldval) : "memory"); return out; #else return __sync_val_compare_and_swap(ptr, oldval, newval); #endif } UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)) { #if defined(__i386__) || defined(__x86_64__) long out; __asm__ __volatile__ ("lock; cmpxchg %2, %1;" : "=a" (out), "+m" (*(volatile long*) ptr) : "r" (newval), "0" (oldval) : "memory"); return out; #else return __sync_val_compare_and_swap(ptr, oldval, newval); #endif } UV_UNUSED(static void cpu_relax(void)) { #if defined(__i386__) || defined(__x86_64__) __asm__ __volatile__ ("rep; nop"); /* a.k.a. PAUSE */ #endif } #endif /* UV_ATOMIC_OPS_H_ */ MoarVM-2015.11/3rdparty/libuv/src/unix/core.c0000644000175000017500000005123212502366750017620 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include /* NULL */ #include /* printf */ #include #include /* strerror */ #include #include #include #include #include #include #include #include #include #include #include /* INT_MAX, PATH_MAX */ #include /* writev */ #include /* getrusage */ #ifdef __linux__ # include #endif #ifdef __sun # include # include #endif #ifdef __APPLE__ # include /* _NSGetExecutablePath */ # include # include #endif #ifdef __FreeBSD__ # include # include # include # include # define UV__O_CLOEXEC O_CLOEXEC # if __FreeBSD__ >= 10 # define uv__accept4 accept4 # define UV__SOCK_NONBLOCK SOCK_NONBLOCK # define UV__SOCK_CLOEXEC SOCK_CLOEXEC # endif # if !defined(F_DUP2FD_CLOEXEC) && defined(_F_DUP2FD_CLOEXEC) # define F_DUP2FD_CLOEXEC _F_DUP2FD_CLOEXEC # endif #endif #ifdef _AIX #include #endif static void uv__run_pending(uv_loop_t* loop); /* Verify that uv_buf_t is ABI-compatible with struct iovec. */ STATIC_ASSERT(sizeof(uv_buf_t) == sizeof(struct iovec)); STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->base) == sizeof(((struct iovec*) 0)->iov_base)); STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->len) == sizeof(((struct iovec*) 0)->iov_len)); STATIC_ASSERT(offsetof(uv_buf_t, base) == offsetof(struct iovec, iov_base)); STATIC_ASSERT(offsetof(uv_buf_t, len) == offsetof(struct iovec, iov_len)); uint64_t uv_hrtime(void) { return uv__hrtime(UV_CLOCK_PRECISE); } void uv_close(uv_handle_t* handle, uv_close_cb close_cb) { assert(!(handle->flags & (UV_CLOSING | UV_CLOSED))); handle->flags |= UV_CLOSING; handle->close_cb = close_cb; switch (handle->type) { case UV_NAMED_PIPE: uv__pipe_close((uv_pipe_t*)handle); break; case UV_TTY: uv__stream_close((uv_stream_t*)handle); break; case UV_TCP: uv__tcp_close((uv_tcp_t*)handle); break; case UV_UDP: uv__udp_close((uv_udp_t*)handle); break; case UV_PREPARE: uv__prepare_close((uv_prepare_t*)handle); break; case UV_CHECK: uv__check_close((uv_check_t*)handle); break; case UV_IDLE: uv__idle_close((uv_idle_t*)handle); break; case UV_ASYNC: uv__async_close((uv_async_t*)handle); break; case UV_TIMER: uv__timer_close((uv_timer_t*)handle); break; case UV_PROCESS: uv__process_close((uv_process_t*)handle); break; case UV_FS_EVENT: uv__fs_event_close((uv_fs_event_t*)handle); break; case UV_POLL: uv__poll_close((uv_poll_t*)handle); break; case UV_FS_POLL: uv__fs_poll_close((uv_fs_poll_t*)handle); break; case UV_SIGNAL: uv__signal_close((uv_signal_t*) handle); /* Signal handles may not be closed immediately. The signal code will */ /* itself close uv__make_close_pending whenever appropriate. */ return; default: assert(0); } uv__make_close_pending(handle); } int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { int r; int fd; socklen_t len; if (handle == NULL || value == NULL) return -EINVAL; if (handle->type == UV_TCP || handle->type == UV_NAMED_PIPE) fd = uv__stream_fd((uv_stream_t*) handle); else if (handle->type == UV_UDP) fd = ((uv_udp_t *) handle)->io_watcher.fd; else return -ENOTSUP; len = sizeof(*value); if (*value == 0) r = getsockopt(fd, SOL_SOCKET, optname, value, &len); else r = setsockopt(fd, SOL_SOCKET, optname, (const void*) value, len); if (r < 0) return -errno; return 0; } void uv__make_close_pending(uv_handle_t* handle) { assert(handle->flags & UV_CLOSING); assert(!(handle->flags & UV_CLOSED)); handle->next_closing = handle->loop->closing_handles; handle->loop->closing_handles = handle; } static void uv__finish_close(uv_handle_t* handle) { /* Note: while the handle is in the UV_CLOSING state now, it's still possible * for it to be active in the sense that uv__is_active() returns true. * A good example is when the user calls uv_shutdown(), immediately followed * by uv_close(). The handle is considered active at this point because the * completion of the shutdown req is still pending. */ assert(handle->flags & UV_CLOSING); assert(!(handle->flags & UV_CLOSED)); handle->flags |= UV_CLOSED; switch (handle->type) { case UV_PREPARE: case UV_CHECK: case UV_IDLE: case UV_ASYNC: case UV_TIMER: case UV_PROCESS: case UV_FS_EVENT: case UV_FS_POLL: case UV_POLL: case UV_SIGNAL: break; case UV_NAMED_PIPE: case UV_TCP: case UV_TTY: uv__stream_destroy((uv_stream_t*)handle); break; case UV_UDP: uv__udp_finish_close((uv_udp_t*)handle); break; default: assert(0); break; } uv__handle_unref(handle); QUEUE_REMOVE(&handle->handle_queue); if (handle->close_cb) { handle->close_cb(handle); } } static void uv__run_closing_handles(uv_loop_t* loop) { uv_handle_t* p; uv_handle_t* q; p = loop->closing_handles; loop->closing_handles = NULL; while (p) { q = p->next_closing; uv__finish_close(p); p = q; } } int uv_is_closing(const uv_handle_t* handle) { return uv__is_closing(handle); } int uv_backend_fd(const uv_loop_t* loop) { return loop->backend_fd; } int uv_backend_timeout(const uv_loop_t* loop) { if (loop->stop_flag != 0) return 0; if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) return 0; if (!QUEUE_EMPTY(&loop->idle_handles)) return 0; if (loop->closing_handles) return 0; return uv__next_timeout(loop); } static int uv__loop_alive(const uv_loop_t* loop) { return uv__has_active_handles(loop) || uv__has_active_reqs(loop) || loop->closing_handles != NULL; } int uv_loop_alive(const uv_loop_t* loop) { return uv__loop_alive(loop); } int uv_run(uv_loop_t* loop, uv_run_mode mode) { int timeout; int r; r = uv__loop_alive(loop); if (!r) uv__update_time(loop); while (r != 0 && loop->stop_flag == 0) { uv__update_time(loop); uv__run_timers(loop); uv__run_pending(loop); uv__run_idle(loop); uv__run_prepare(loop); timeout = 0; if ((mode & UV_RUN_NOWAIT) == 0) timeout = uv_backend_timeout(loop); uv__io_poll(loop, timeout); uv__run_check(loop); uv__run_closing_handles(loop); if (mode == UV_RUN_ONCE) { /* UV_RUN_ONCE implies forward progess: at least one callback must have * been invoked when it returns. uv__io_poll() can return without doing * I/O (meaning: no callbacks) when its timeout expires - which means we * have pending timers that satisfy the forward progress constraint. * * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from * the check. */ uv__update_time(loop); uv__run_timers(loop); } r = uv__loop_alive(loop); if (mode & (UV_RUN_ONCE | UV_RUN_NOWAIT)) break; } /* The if statement lets gcc compile it to a conditional store. Avoids * dirtying a cache line. */ if (loop->stop_flag != 0) loop->stop_flag = 0; return r; } void uv_update_time(uv_loop_t* loop) { uv__update_time(loop); } int uv_is_active(const uv_handle_t* handle) { return uv__is_active(handle); } /* Open a socket in non-blocking close-on-exec mode, atomically if possible. */ int uv__socket(int domain, int type, int protocol) { int sockfd; int err; #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) sockfd = socket(domain, type | SOCK_NONBLOCK | SOCK_CLOEXEC, protocol); if (sockfd != -1) return sockfd; if (errno != EINVAL) return -errno; #endif sockfd = socket(domain, type, protocol); if (sockfd == -1) return -errno; err = uv__nonblock(sockfd, 1); if (err == 0) err = uv__cloexec(sockfd, 1); if (err) { uv__close(sockfd); return err; } #if defined(SO_NOSIGPIPE) { int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); } #endif return sockfd; } int uv__accept(int sockfd) { int peerfd; int err; assert(sockfd >= 0); while (1) { #if defined(__linux__) || __FreeBSD__ >= 10 static int no_accept4; if (no_accept4) goto skip; peerfd = uv__accept4(sockfd, NULL, NULL, UV__SOCK_NONBLOCK|UV__SOCK_CLOEXEC); if (peerfd != -1) return peerfd; if (errno == EINTR) continue; if (errno != ENOSYS) return -errno; no_accept4 = 1; skip: #endif peerfd = accept(sockfd, NULL, NULL); if (peerfd == -1) { if (errno == EINTR) continue; return -errno; } err = uv__cloexec(peerfd, 1); if (err == 0) err = uv__nonblock(peerfd, 1); if (err) { uv__close(peerfd); return err; } return peerfd; } } int uv__close(int fd) { int saved_errno; int rc; assert(fd > -1); /* Catch uninitialized io_watcher.fd bugs. */ assert(fd > STDERR_FILENO); /* Catch stdio close bugs. */ saved_errno = errno; rc = close(fd); if (rc == -1) { rc = -errno; if (rc == -EINTR) rc = -EINPROGRESS; /* For platform/libc consistency. */ errno = saved_errno; } return rc; } #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || \ defined(_AIX) int uv__nonblock(int fd, int set) { int r; do r = ioctl(fd, FIONBIO, &set); while (r == -1 && errno == EINTR); if (r) return -errno; return 0; } int uv__cloexec(int fd, int set) { int r; do r = ioctl(fd, set ? FIOCLEX : FIONCLEX); while (r == -1 && errno == EINTR); if (r) return -errno; return 0; } #else /* !(defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) */ int uv__nonblock(int fd, int set) { int flags; int r; do r = fcntl(fd, F_GETFL); while (r == -1 && errno == EINTR); if (r == -1) return -errno; /* Bail out now if already set/clear. */ if (!!(r & O_NONBLOCK) == !!set) return 0; if (set) flags = r | O_NONBLOCK; else flags = r & ~O_NONBLOCK; do r = fcntl(fd, F_SETFL, flags); while (r == -1 && errno == EINTR); if (r) return -errno; return 0; } int uv__cloexec(int fd, int set) { int flags; int r; do r = fcntl(fd, F_GETFD); while (r == -1 && errno == EINTR); if (r == -1) return -errno; /* Bail out now if already set/clear. */ if (!!(r & FD_CLOEXEC) == !!set) return 0; if (set) flags = r | FD_CLOEXEC; else flags = r & ~FD_CLOEXEC; do r = fcntl(fd, F_SETFD, flags); while (r == -1 && errno == EINTR); if (r) return -errno; return 0; } #endif /* defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) */ /* This function is not execve-safe, there is a race window * between the call to dup() and fcntl(FD_CLOEXEC). */ int uv__dup(int fd) { int err; fd = dup(fd); if (fd == -1) return -errno; err = uv__cloexec(fd, 1); if (err) { uv__close(fd); return err; } return fd; } ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) { struct cmsghdr* cmsg; ssize_t rc; int* pfd; int* end; #if defined(__linux__) static int no_msg_cmsg_cloexec; if (no_msg_cmsg_cloexec == 0) { rc = recvmsg(fd, msg, flags | 0x40000000); /* MSG_CMSG_CLOEXEC */ if (rc != -1) return rc; if (errno != EINVAL) return -errno; rc = recvmsg(fd, msg, flags); if (rc == -1) return -errno; no_msg_cmsg_cloexec = 1; } else { rc = recvmsg(fd, msg, flags); } #else rc = recvmsg(fd, msg, flags); #endif if (rc == -1) return -errno; if (msg->msg_controllen == 0) return rc; for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) if (cmsg->cmsg_type == SCM_RIGHTS) for (pfd = (int*) CMSG_DATA(cmsg), end = (int*) ((char*) cmsg + cmsg->cmsg_len); pfd < end; pfd += 1) uv__cloexec(*pfd, 1); return rc; } int uv_cwd(char* buffer, size_t* size) { if (buffer == NULL || size == NULL) return -EINVAL; if (getcwd(buffer, *size) == NULL) return -errno; *size = strlen(buffer); return 0; } int uv_chdir(const char* dir) { if (chdir(dir)) return -errno; return 0; } void uv_disable_stdio_inheritance(void) { int fd; /* Set the CLOEXEC flag on all open descriptors. Unconditionally try the * first 16 file descriptors. After that, bail out after the first error. */ for (fd = 0; ; fd++) if (uv__cloexec(fd, 1) && fd > 15) break; } int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { int fd_out; switch (handle->type) { case UV_TCP: case UV_NAMED_PIPE: case UV_TTY: fd_out = uv__stream_fd((uv_stream_t*) handle); break; case UV_UDP: fd_out = ((uv_udp_t *) handle)->io_watcher.fd; break; case UV_POLL: fd_out = ((uv_poll_t *) handle)->io_watcher.fd; break; default: return -EINVAL; } if (uv__is_closing(handle) || fd_out == -1) return -EBADF; *fd = fd_out; return 0; } static void uv__run_pending(uv_loop_t* loop) { QUEUE* q; uv__io_t* w; while (!QUEUE_EMPTY(&loop->pending_queue)) { q = QUEUE_HEAD(&loop->pending_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, pending_queue); w->cb(loop, w, UV__POLLOUT); } } static unsigned int next_power_of_two(unsigned int val) { val -= 1; val |= val >> 1; val |= val >> 2; val |= val >> 4; val |= val >> 8; val |= val >> 16; val += 1; return val; } static void maybe_resize(uv_loop_t* loop, unsigned int len) { uv__io_t** watchers; void* fake_watcher_list; void* fake_watcher_count; unsigned int nwatchers; unsigned int i; if (len <= loop->nwatchers) return; /* Preserve fake watcher list and count at the end of the watchers */ if (loop->watchers != NULL) { fake_watcher_list = loop->watchers[loop->nwatchers]; fake_watcher_count = loop->watchers[loop->nwatchers + 1]; } else { fake_watcher_list = NULL; fake_watcher_count = NULL; } nwatchers = next_power_of_two(len + 2) - 2; watchers = realloc(loop->watchers, (nwatchers + 2) * sizeof(loop->watchers[0])); if (watchers == NULL) abort(); for (i = loop->nwatchers; i < nwatchers; i++) watchers[i] = NULL; watchers[nwatchers] = fake_watcher_list; watchers[nwatchers + 1] = fake_watcher_count; loop->watchers = watchers; loop->nwatchers = nwatchers; } void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) { assert(cb != NULL); assert(fd >= -1); QUEUE_INIT(&w->pending_queue); QUEUE_INIT(&w->watcher_queue); w->cb = cb; w->fd = fd; w->events = 0; w->pevents = 0; #if defined(UV_HAVE_KQUEUE) w->rcount = 0; w->wcount = 0; #endif /* defined(UV_HAVE_KQUEUE) */ } void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(0 == (events & ~(UV__POLLIN | UV__POLLOUT))); assert(0 != events); assert(w->fd >= 0); assert(w->fd < INT_MAX); w->pevents |= events; maybe_resize(loop, w->fd + 1); #if !defined(__sun) /* The event ports backend needs to rearm all file descriptors on each and * every tick of the event loop but the other backends allow us to * short-circuit here if the event mask is unchanged. */ if (w->events == w->pevents) { if (w->events == 0 && !QUEUE_EMPTY(&w->watcher_queue)) { QUEUE_REMOVE(&w->watcher_queue); QUEUE_INIT(&w->watcher_queue); } return; } #endif if (QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); if (loop->watchers[w->fd] == NULL) { loop->watchers[w->fd] = w; loop->nfds++; } } void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(0 == (events & ~(UV__POLLIN | UV__POLLOUT))); assert(0 != events); if (w->fd == -1) return; assert(w->fd >= 0); /* Happens when uv__io_stop() is called on a handle that was never started. */ if ((unsigned) w->fd >= loop->nwatchers) return; w->pevents &= ~events; if (w->pevents == 0) { QUEUE_REMOVE(&w->watcher_queue); QUEUE_INIT(&w->watcher_queue); if (loop->watchers[w->fd] != NULL) { assert(loop->watchers[w->fd] == w); assert(loop->nfds > 0); loop->watchers[w->fd] = NULL; loop->nfds--; w->events = 0; } } else if (QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); } void uv__io_close(uv_loop_t* loop, uv__io_t* w) { uv__io_stop(loop, w, UV__POLLIN | UV__POLLOUT); QUEUE_REMOVE(&w->pending_queue); /* Remove stale events for this file descriptor */ uv__platform_invalidate_fd(loop, w->fd); } void uv__io_feed(uv_loop_t* loop, uv__io_t* w) { if (QUEUE_EMPTY(&w->pending_queue)) QUEUE_INSERT_TAIL(&loop->pending_queue, &w->pending_queue); } int uv__io_active(const uv__io_t* w, unsigned int events) { assert(0 == (events & ~(UV__POLLIN | UV__POLLOUT))); assert(0 != events); return 0 != (w->pevents & events); } int uv_getrusage(uv_rusage_t* rusage) { struct rusage usage; if (getrusage(RUSAGE_SELF, &usage)) return -errno; rusage->ru_utime.tv_sec = usage.ru_utime.tv_sec; rusage->ru_utime.tv_usec = usage.ru_utime.tv_usec; rusage->ru_stime.tv_sec = usage.ru_stime.tv_sec; rusage->ru_stime.tv_usec = usage.ru_stime.tv_usec; rusage->ru_maxrss = usage.ru_maxrss; rusage->ru_ixrss = usage.ru_ixrss; rusage->ru_idrss = usage.ru_idrss; rusage->ru_isrss = usage.ru_isrss; rusage->ru_minflt = usage.ru_minflt; rusage->ru_majflt = usage.ru_majflt; rusage->ru_nswap = usage.ru_nswap; rusage->ru_inblock = usage.ru_inblock; rusage->ru_oublock = usage.ru_oublock; rusage->ru_msgsnd = usage.ru_msgsnd; rusage->ru_msgrcv = usage.ru_msgrcv; rusage->ru_nsignals = usage.ru_nsignals; rusage->ru_nvcsw = usage.ru_nvcsw; rusage->ru_nivcsw = usage.ru_nivcsw; return 0; } int uv__open_cloexec(const char* path, int flags) { int err; int fd; #if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 9) static int no_cloexec; if (!no_cloexec) { fd = open(path, flags | UV__O_CLOEXEC); if (fd != -1) return fd; if (errno != EINVAL) return -errno; /* O_CLOEXEC not supported. */ no_cloexec = 1; } #endif fd = open(path, flags); if (fd == -1) return -errno; err = uv__cloexec(fd, 1); if (err) { uv__close(fd); return err; } return fd; } int uv__dup2_cloexec(int oldfd, int newfd) { int r; #if defined(__FreeBSD__) && __FreeBSD__ >= 10 do r = dup3(oldfd, newfd, O_CLOEXEC); while (r == -1 && errno == EINTR); if (r == -1) return -errno; return r; #elif defined(__FreeBSD__) && defined(F_DUP2FD_CLOEXEC) do r = fcntl(oldfd, F_DUP2FD_CLOEXEC, newfd); while (r == -1 && errno == EINTR); if (r != -1) return r; if (errno != EINVAL) return -errno; /* Fall through. */ #elif defined(__linux__) static int no_dup3; if (!no_dup3) { do r = uv__dup3(oldfd, newfd, UV__O_CLOEXEC); while (r == -1 && (errno == EINTR || errno == EBUSY)); if (r != -1) return r; if (errno != ENOSYS) return -errno; /* Fall through. */ no_dup3 = 1; } #endif { int err; do r = dup2(oldfd, newfd); #if defined(__linux__) while (r == -1 && (errno == EINTR || errno == EBUSY)); #else while (r == -1 && errno == EINTR); #endif if (r == -1) return -errno; err = uv__cloexec(newfd, 1); if (err) { uv__close(newfd); return err; } return r; } } MoarVM-2015.11/3rdparty/libuv/src/unix/darwin-proctitle.c0000644000175000017500000001720212502366750022156 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #if !TARGET_OS_IPHONE # include # include #endif static int uv__pthread_setname_np(const char* name) { int (*dynamic_pthread_setname_np)(const char* name); char namebuf[64]; /* MAXTHREADNAMESIZE */ int err; /* pthread_setname_np() first appeared in OS X 10.6 and iOS 3.2. */ *(void **)(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np"); if (dynamic_pthread_setname_np == NULL) return -ENOSYS; strncpy(namebuf, name, sizeof(namebuf) - 1); namebuf[sizeof(namebuf) - 1] = '\0'; err = dynamic_pthread_setname_np(namebuf); if (err) return -err; return 0; } int uv__set_process_title(const char* title) { #if TARGET_OS_IPHONE return uv__pthread_setname_np(title); #else CFStringRef (*pCFStringCreateWithCString)(CFAllocatorRef, const char*, CFStringEncoding); CFBundleRef (*pCFBundleGetBundleWithIdentifier)(CFStringRef); void *(*pCFBundleGetDataPointerForName)(CFBundleRef, CFStringRef); void *(*pCFBundleGetFunctionPointerForName)(CFBundleRef, CFStringRef); CFTypeRef (*pLSGetCurrentApplicationASN)(void); OSStatus (*pLSSetApplicationInformationItem)(int, CFTypeRef, CFStringRef, CFStringRef, CFDictionaryRef*); void* application_services_handle; void* core_foundation_handle; CFBundleRef launch_services_bundle; CFStringRef* display_name_key; CFDictionaryRef (*pCFBundleGetInfoDictionary)(CFBundleRef); CFBundleRef (*pCFBundleGetMainBundle)(void); CFBundleRef hi_services_bundle; OSStatus (*pSetApplicationIsDaemon)(int); CFDictionaryRef (*pLSApplicationCheckIn)(int, CFDictionaryRef); void (*pLSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t, void*); CFTypeRef asn; int err; err = -ENOENT; application_services_handle = dlopen("/System/Library/Frameworks/" "ApplicationServices.framework/" "Versions/A/ApplicationServices", RTLD_LAZY | RTLD_LOCAL); core_foundation_handle = dlopen("/System/Library/Frameworks/" "CoreFoundation.framework/" "Versions/A/CoreFoundation", RTLD_LAZY | RTLD_LOCAL); if (application_services_handle == NULL || core_foundation_handle == NULL) goto out; *(void **)(&pCFStringCreateWithCString) = dlsym(core_foundation_handle, "CFStringCreateWithCString"); *(void **)(&pCFBundleGetBundleWithIdentifier) = dlsym(core_foundation_handle, "CFBundleGetBundleWithIdentifier"); *(void **)(&pCFBundleGetDataPointerForName) = dlsym(core_foundation_handle, "CFBundleGetDataPointerForName"); *(void **)(&pCFBundleGetFunctionPointerForName) = dlsym(core_foundation_handle, "CFBundleGetFunctionPointerForName"); if (pCFStringCreateWithCString == NULL || pCFBundleGetBundleWithIdentifier == NULL || pCFBundleGetDataPointerForName == NULL || pCFBundleGetFunctionPointerForName == NULL) { goto out; } #define S(s) pCFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8) launch_services_bundle = pCFBundleGetBundleWithIdentifier(S("com.apple.LaunchServices")); if (launch_services_bundle == NULL) goto out; *(void **)(&pLSGetCurrentApplicationASN) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSGetCurrentApplicationASN")); if (pLSGetCurrentApplicationASN == NULL) goto out; *(void **)(&pLSSetApplicationInformationItem) = pCFBundleGetFunctionPointerForName(launch_services_bundle, S("_LSSetApplicationInformationItem")); if (pLSSetApplicationInformationItem == NULL) goto out; display_name_key = pCFBundleGetDataPointerForName(launch_services_bundle, S("_kLSDisplayNameKey")); if (display_name_key == NULL || *display_name_key == NULL) goto out; *(void **)(&pCFBundleGetInfoDictionary) = dlsym(core_foundation_handle, "CFBundleGetInfoDictionary"); *(void **)(&pCFBundleGetMainBundle) = dlsym(core_foundation_handle, "CFBundleGetMainBundle"); if (pCFBundleGetInfoDictionary == NULL || pCFBundleGetMainBundle == NULL) goto out; /* Black 10.9 magic, to remove (Not responding) mark in Activity Monitor */ hi_services_bundle = pCFBundleGetBundleWithIdentifier(S("com.apple.HIServices")); err = -ENOENT; if (hi_services_bundle == NULL) goto out; *(void **)(&pSetApplicationIsDaemon) = pCFBundleGetFunctionPointerForName( hi_services_bundle, S("SetApplicationIsDaemon")); *(void **)(&pLSApplicationCheckIn) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSApplicationCheckIn")); *(void **)(&pLSSetApplicationLaunchServicesServerConnectionStatus) = pCFBundleGetFunctionPointerForName( launch_services_bundle, S("_LSSetApplicationLaunchServicesServerConnectionStatus")); if (pSetApplicationIsDaemon == NULL || pLSApplicationCheckIn == NULL || pLSSetApplicationLaunchServicesServerConnectionStatus == NULL) { goto out; } if (pSetApplicationIsDaemon(1) != noErr) goto out; pLSSetApplicationLaunchServicesServerConnectionStatus(0, NULL); /* Check into process manager?! */ pLSApplicationCheckIn(-2, pCFBundleGetInfoDictionary(pCFBundleGetMainBundle())); asn = pLSGetCurrentApplicationASN(); err = -EINVAL; if (pLSSetApplicationInformationItem(-2, /* Magic value. */ asn, *display_name_key, S(title), NULL) != noErr) { goto out; } uv__pthread_setname_np(title); /* Don't care if it fails. */ err = 0; out: if (core_foundation_handle != NULL) dlclose(core_foundation_handle); if (application_services_handle != NULL) dlclose(application_services_handle); return err; #endif /* !TARGET_OS_IPHONE */ } MoarVM-2015.11/3rdparty/libuv/src/unix/darwin.c0000644000175000017500000002057612456307253020164 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include /* _NSGetExecutablePath */ #include #include #include /* sysconf */ int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { loop->cf_state = NULL; if (uv__kqueue_init(loop)) return -errno; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { uv__fsevents_loop_delete(loop); } uint64_t uv__hrtime(uv_clocktype_t type) { static mach_timebase_info_data_t info; if ((ACCESS_ONCE(uint32_t, info.numer) == 0 || ACCESS_ONCE(uint32_t, info.denom) == 0) && mach_timebase_info(&info) != KERN_SUCCESS) abort(); return mach_absolute_time() * info.numer / info.denom; } int uv_exepath(char* buffer, size_t* size) { uint32_t usize; int result; char* path; char* fullpath; if (buffer == NULL || size == NULL) return -EINVAL; usize = *size; result = _NSGetExecutablePath(buffer, &usize); if (result) return result; path = malloc(2 * PATH_MAX); fullpath = realpath(buffer, path); if (fullpath == NULL) { SAVE_ERRNO(free(path)); return -errno; } strncpy(buffer, fullpath, *size); free(fullpath); *size = strlen(buffer); return 0; } uint64_t uv_get_free_memory(void) { vm_statistics_data_t info; mach_msg_type_number_t count = sizeof(info) / sizeof(integer_t); if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&info, &count) != KERN_SUCCESS) { return -EINVAL; /* FIXME(bnoordhuis) Translate error. */ } return (uint64_t) info.free_count * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { uint64_t info; int which[] = {CTL_HW, HW_MEMSIZE}; size_t size = sizeof(info); if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info; } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_resident_set_memory(size_t* rss) { mach_msg_type_number_t count; task_basic_info_data_t info; kern_return_t err; count = TASK_BASIC_INFO_COUNT; err = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &info, &count); (void) &err; /* task_info(TASK_BASIC_INFO) cannot really fail. Anything other than * KERN_SUCCESS implies a libuv bug. */ assert(err == KERN_SUCCESS); *rss = info.resident_size; return 0; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; now = time(NULL); *uptime = now - info.tv_sec; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks); char model[512]; uint64_t cpuspeed; size_t size; unsigned int i; natural_t numcpus; mach_msg_type_number_t msg_type; processor_cpu_load_info_data_t *info; uv_cpu_info_t* cpu_info; size = sizeof(model); if (sysctlbyname("machdep.cpu.brand_string", &model, &size, NULL, 0) && sysctlbyname("hw.model", &model, &size, NULL, 0)) { return -errno; } size = sizeof(cpuspeed); if (sysctlbyname("hw.cpufrequency", &cpuspeed, &size, NULL, 0)) return -errno; if (host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numcpus, (processor_info_array_t*)&info, &msg_type) != KERN_SUCCESS) { return -EINVAL; /* FIXME(bnoordhuis) Translate error. */ } *cpu_infos = malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) return -ENOMEM; /* FIXME(bnoordhuis) Deallocate info? */ *count = numcpus; for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(info[i].cpu_ticks[0]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(info[i].cpu_ticks[3]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(info[i].cpu_ticks[1]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(info[i].cpu_ticks[2]) * multiplier; cpu_info->cpu_times.irq = 0; cpu_info->model = strdup(model); cpu_info->speed = cpuspeed/1000000; } vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_dl *sa_addr; if (getifaddrs(&addrs)) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family == AF_LINK)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; /* * On Mac OS X getifaddrs returns information related to Mac Addresses for * various devices, such as firewire, etc. These are not relevant here. */ if (ent->ifa_addr->sa_family == AF_LINK) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != AF_LINK)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } MoarVM-2015.11/3rdparty/libuv/src/unix/dl.c0000644000175000017500000000437312456307253017274 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include static int uv__dlerror(uv_lib_t* lib); int uv_dlopen(const char* filename, uv_lib_t* lib) { dlerror(); /* Reset error status. */ lib->errmsg = NULL; lib->handle = dlopen(filename, RTLD_LAZY); return lib->handle ? 0 : uv__dlerror(lib); } void uv_dlclose(uv_lib_t* lib) { if (lib->errmsg) { free(lib->errmsg); lib->errmsg = NULL; } if (lib->handle) { /* Ignore errors. No good way to signal them without leaking memory. */ dlclose(lib->handle); lib->handle = NULL; } } int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { dlerror(); /* Reset error status. */ *ptr = dlsym(lib->handle, name); return uv__dlerror(lib); } const char* uv_dlerror(const uv_lib_t* lib) { return lib->errmsg ? lib->errmsg : "no error"; } static int uv__dlerror(uv_lib_t* lib) { const char* errmsg; if (lib->errmsg) free(lib->errmsg); errmsg = dlerror(); if (errmsg) { lib->errmsg = strdup(errmsg); return -1; } else { lib->errmsg = NULL; return 0; } } MoarVM-2015.11/3rdparty/libuv/src/unix/freebsd.c0000644000175000017500000002334512456307253020307 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /* VM_LOADAVG */ #include #include #include /* sysconf */ #include #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) #ifndef CPUSTATES # define CPUSTATES 5U #endif #ifndef CP_USER # define CP_USER 0 # define CP_NICE 1 # define CP_SYS 2 # define CP_IDLE 3 # define CP_INTR 4 #endif static char *process_title; int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } uint64_t uv__hrtime(uv_clocktype_t type) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec); } int uv_exepath(char* buffer, size_t* size) { int mib[4]; size_t cb; if (buffer == NULL || size == NULL) return -EINVAL; #ifdef __DragonFly__ mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_ARGS; mib[3] = getpid(); #else mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PATHNAME; mib[3] = -1; #endif cb = *size; if (sysctl(mib, 4, buffer, &cb, NULL, 0)) return -errno; *size = strlen(buffer); return 0; } uint64_t uv_get_free_memory(void) { int freecount; size_t size = sizeof(freecount); if (sysctlbyname("vm.stats.vm.v_free_count", &freecount, &size, NULL, 0)) return -errno; return (uint64_t) freecount * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { unsigned long info; int which[] = {CTL_HW, HW_PHYSMEM}; size_t size = sizeof(info); if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info; } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } char** uv_setup_args(int argc, char** argv) { process_title = argc ? strdup(argv[0]) : NULL; return argv; } int uv_set_process_title(const char* title) { int oid[4]; if (process_title) free(process_title); process_title = strdup(title); oid[0] = CTL_KERN; oid[1] = KERN_PROC; oid[2] = KERN_PROC_ARGS; oid[3] = getpid(); sysctl(oid, ARRAY_SIZE(oid), NULL, NULL, process_title, strlen(process_title) + 1); return 0; } int uv_get_process_title(char* buffer, size_t size) { if (process_title) { strncpy(buffer, process_title, size); } else { if (size > 0) { buffer[0] = '\0'; } } return 0; } int uv_resident_set_memory(size_t* rss) { kvm_t *kd = NULL; struct kinfo_proc *kinfo = NULL; pid_t pid; int nprocs; size_t page_size = getpagesize(); pid = getpid(); kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open"); if (kd == NULL) goto error; kinfo = kvm_getprocs(kd, KERN_PROC_PID, pid, &nprocs); if (kinfo == NULL) goto error; #ifdef __DragonFly__ *rss = kinfo->kp_vm_rssize * page_size; #else *rss = kinfo->ki_rssize * page_size; #endif kvm_close(kd); return 0; error: if (kd) kvm_close(kd); return -EPERM; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; now = time(NULL); *uptime = (double)(now - info.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks), cpuspeed, maxcpus, cur = 0; uv_cpu_info_t* cpu_info; const char* maxcpus_key; const char* cptimes_key; char model[512]; long* cp_times; int numcpus; size_t size; int i; #if defined(__DragonFly__) /* This is not quite correct but DragonFlyBSD doesn't seem to have anything * comparable to kern.smp.maxcpus or kern.cp_times (kern.cp_time is a total, * not per CPU). At least this stops uv_cpu_info() from failing completely. */ maxcpus_key = "hw.ncpu"; cptimes_key = "kern.cp_time"; #else maxcpus_key = "kern.smp.maxcpus"; cptimes_key = "kern.cp_times"; #endif size = sizeof(model); if (sysctlbyname("hw.model", &model, &size, NULL, 0)) return -errno; size = sizeof(numcpus); if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) return -errno; *cpu_infos = malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) return -ENOMEM; *count = numcpus; size = sizeof(cpuspeed); if (sysctlbyname("hw.clockrate", &cpuspeed, &size, NULL, 0)) { SAVE_ERRNO(free(*cpu_infos)); return -errno; } /* kern.cp_times on FreeBSD i386 gives an array up to maxcpus instead of * ncpu. */ size = sizeof(maxcpus); if (sysctlbyname(maxcpus_key, &maxcpus, &size, NULL, 0)) { SAVE_ERRNO(free(*cpu_infos)); return -errno; } size = maxcpus * CPUSTATES * sizeof(long); cp_times = malloc(size); if (cp_times == NULL) { free(*cpu_infos); return -ENOMEM; } if (sysctlbyname(cptimes_key, cp_times, &size, NULL, 0)) { SAVE_ERRNO(free(cp_times)); SAVE_ERRNO(free(*cpu_infos)); return -errno; } for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; cpu_info->model = strdup(model); cpu_info->speed = cpuspeed; cur+=CPUSTATES; } free(cp_times); return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_dl *sa_addr; if (getifaddrs(&addrs)) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family == AF_LINK)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; /* * On FreeBSD getifaddrs returns information related to the raw underlying * devices. We're not interested in this information yet. */ if (ent->ifa_addr->sa_family == AF_LINK) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != AF_LINK)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } MoarVM-2015.11/3rdparty/libuv/src/unix/fs.c0000644000175000017500000007301312502366750017301 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* Caveat emptor: this file deviates from the libuv convention of returning * negated errno codes. Most uv_fs_*() functions map directly to the system * call of the same name. For more complex wrappers, it's easier to just * return -1 with errno set. The dispatcher in uv__fs_work() takes care of * getting the errno to the right place (req->result or as the return value.) */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # define HAVE_PREADV 1 #elif defined(__linux__) # include # if defined(__GLIBC_PREREQ) # if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) && \ __GLIBC_PREREQ(2,10) # define HAVE_PREADV 1 # else # define HAVE_PREADV 0 # endif # else # define HAVE_PREADV 0 # endif #else # define HAVE_PREADV 0 #endif #if defined(__linux__) || defined(__sun) # include #elif defined(__APPLE__) || defined(__FreeBSD__) # include #endif #if HAVE_PREADV || defined(__APPLE__) # include #endif #define INIT(type) \ do { \ uv__req_init((loop), (req), UV_FS); \ (req)->fs_type = UV_FS_ ## type; \ (req)->result = 0; \ (req)->ptr = NULL; \ (req)->loop = loop; \ (req)->path = NULL; \ (req)->new_path = NULL; \ (req)->cb = (cb); \ } \ while (0) #define PATH \ do { \ (req)->path = strdup(path); \ if ((req)->path == NULL) \ return -ENOMEM; \ } \ while (0) #define PATH2 \ do { \ size_t path_len; \ size_t new_path_len; \ path_len = strlen((path)) + 1; \ new_path_len = strlen((new_path)) + 1; \ (req)->path = malloc(path_len + new_path_len); \ if ((req)->path == NULL) \ return -ENOMEM; \ (req)->new_path = (req)->path + path_len; \ memcpy((void*) (req)->path, (path), path_len); \ memcpy((void*) (req)->new_path, (new_path), new_path_len); \ } \ while (0) #define POST \ do { \ if ((cb) != NULL) { \ uv__work_submit((loop), &(req)->work_req, uv__fs_work, uv__fs_done); \ return 0; \ } \ else { \ uv__fs_work(&(req)->work_req); \ uv__fs_done(&(req)->work_req, 0); \ return (req)->result; \ } \ } \ while (0) static ssize_t uv__fs_fdatasync(uv_fs_t* req) { #if defined(__linux__) || defined(__sun) || defined(__NetBSD__) return fdatasync(req->file); #elif defined(__APPLE__) && defined(F_FULLFSYNC) return fcntl(req->file, F_FULLFSYNC); #else return fsync(req->file); #endif } static ssize_t uv__fs_futime(uv_fs_t* req) { #if defined(__linux__) /* utimesat() has nanosecond resolution but we stick to microseconds * for the sake of consistency with other platforms. */ static int no_utimesat; struct timespec ts[2]; struct timeval tv[2]; char path[sizeof("/proc/self/fd/") + 3 * sizeof(int)]; int r; if (no_utimesat) goto skip; ts[0].tv_sec = req->atime; ts[0].tv_nsec = (unsigned long)(req->atime * 1000000) % 1000000 * 1000; ts[1].tv_sec = req->mtime; ts[1].tv_nsec = (unsigned long)(req->mtime * 1000000) % 1000000 * 1000; r = uv__utimesat(req->file, NULL, ts, 0); if (r == 0) return r; if (errno != ENOSYS) return r; no_utimesat = 1; skip: tv[0].tv_sec = req->atime; tv[0].tv_usec = (unsigned long)(req->atime * 1000000) % 1000000; tv[1].tv_sec = req->mtime; tv[1].tv_usec = (unsigned long)(req->mtime * 1000000) % 1000000; snprintf(path, sizeof(path), "/proc/self/fd/%d", (int) req->file); r = utimes(path, tv); if (r == 0) return r; switch (errno) { case ENOENT: if (fcntl(req->file, F_GETFL) == -1 && errno == EBADF) break; /* Fall through. */ case EACCES: case ENOTDIR: errno = ENOSYS; break; } return r; #elif defined(__APPLE__) \ || defined(__DragonFly__) \ || defined(__FreeBSD__) \ || defined(__NetBSD__) \ || defined(__OpenBSD__) \ || defined(__sun) struct timeval tv[2]; tv[0].tv_sec = req->atime; tv[0].tv_usec = (unsigned long)(req->atime * 1000000) % 1000000; tv[1].tv_sec = req->mtime; tv[1].tv_usec = (unsigned long)(req->mtime * 1000000) % 1000000; # if defined(__sun) return futimesat(req->file, NULL, tv); # else return futimes(req->file, tv); # endif #else errno = ENOSYS; return -1; #endif } static ssize_t uv__fs_mkdtemp(uv_fs_t* req) { return mkdtemp((char*) req->path) ? 0 : -1; } static ssize_t uv__fs_read(uv_fs_t* req) { ssize_t result; #if defined(_AIX) struct stat buf; if(fstat(req->file, &buf)) return -1; if(S_ISDIR(buf.st_mode)) { errno = EISDIR; return -1; } #endif /* defined(_AIX) */ if (req->off < 0) { if (req->nbufs == 1) result = read(req->file, req->bufs[0].base, req->bufs[0].len); else result = readv(req->file, (struct iovec*) req->bufs, req->nbufs); } else { if (req->nbufs == 1) { result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off); goto done; } #if HAVE_PREADV result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else # if defined(__linux__) static int no_preadv; if (no_preadv) # endif { off_t nread; size_t index; # if defined(__linux__) retry: # endif nread = 0; index = 0; result = 1; do { if (req->bufs[index].len > 0) { result = pread(req->file, req->bufs[index].base, req->bufs[index].len, req->off + nread); if (result > 0) nread += result; } index++; } while (index < req->nbufs && result > 0); if (nread > 0) result = nread; } # if defined(__linux__) else { result = uv__preadv(req->file, (struct iovec*)req->bufs, req->nbufs, req->off); if (result == -1 && errno == ENOSYS) { no_preadv = 1; goto retry; } } # endif #endif } done: if (req->bufs != req->bufsml) free(req->bufs); return result; } #if defined(__OpenBSD__) || (defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_8)) static int uv__fs_scandir_filter(uv__dirent_t* dent) { #else static int uv__fs_scandir_filter(const uv__dirent_t* dent) { #endif return strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0; } static ssize_t uv__fs_scandir(uv_fs_t* req) { uv__dirent_t **dents; int saved_errno; int n; dents = NULL; n = scandir(req->path, &dents, uv__fs_scandir_filter, alphasort); /* NOTE: We will use nbufs as an index field */ req->nbufs = 0; if (n == 0) goto out; /* osx still needs to deallocate some memory */ else if (n == -1) return n; req->ptr = dents; return n; out: saved_errno = errno; if (dents != NULL) { int i; for (i = 0; i < n; i++) free(dents[i]); free(dents); } errno = saved_errno; req->ptr = NULL; return n; } static ssize_t uv__fs_readlink(uv_fs_t* req) { ssize_t len; char* buf; len = pathconf(req->path, _PC_PATH_MAX); if (len == -1) { #if defined(PATH_MAX) len = PATH_MAX; #else len = 4096; #endif } buf = malloc(len + 1); if (buf == NULL) { errno = ENOMEM; return -1; } len = readlink(req->path, buf, len); if (len == -1) { free(buf); return -1; } buf[len] = '\0'; req->ptr = buf; return 0; } static ssize_t uv__fs_sendfile_emul(uv_fs_t* req) { struct pollfd pfd; int use_pread; off_t offset; ssize_t nsent; ssize_t nread; ssize_t nwritten; size_t buflen; size_t len; ssize_t n; int in_fd; int out_fd; char buf[8192]; len = req->bufsml[0].len; in_fd = req->flags; out_fd = req->file; offset = req->off; use_pread = 1; /* Here are the rules regarding errors: * * 1. Read errors are reported only if nsent==0, otherwise we return nsent. * The user needs to know that some data has already been sent, to stop * them from sending it twice. * * 2. Write errors are always reported. Write errors are bad because they * mean data loss: we've read data but now we can't write it out. * * We try to use pread() and fall back to regular read() if the source fd * doesn't support positional reads, for example when it's a pipe fd. * * If we get EAGAIN when writing to the target fd, we poll() on it until * it becomes writable again. * * FIXME: If we get a write error when use_pread==1, it should be safe to * return the number of sent bytes instead of an error because pread() * is, in theory, idempotent. However, special files in /dev or /proc * may support pread() but not necessarily return the same data on * successive reads. * * FIXME: There is no way now to signal that we managed to send *some* data * before a write error. */ for (nsent = 0; (size_t) nsent < len; ) { buflen = len - nsent; if (buflen > sizeof(buf)) buflen = sizeof(buf); do if (use_pread) nread = pread(in_fd, buf, buflen, offset); else nread = read(in_fd, buf, buflen); while (nread == -1 && errno == EINTR); if (nread == 0) goto out; if (nread == -1) { if (use_pread && nsent == 0 && (errno == EIO || errno == ESPIPE)) { use_pread = 0; continue; } if (nsent == 0) nsent = -1; goto out; } for (nwritten = 0; nwritten < nread; ) { do n = write(out_fd, buf + nwritten, nread - nwritten); while (n == -1 && errno == EINTR); if (n != -1) { nwritten += n; continue; } if (errno != EAGAIN && errno != EWOULDBLOCK) { nsent = -1; goto out; } pfd.fd = out_fd; pfd.events = POLLOUT; pfd.revents = 0; do n = poll(&pfd, 1, -1); while (n == -1 && errno == EINTR); if (n == -1 || (pfd.revents & ~POLLOUT) != 0) { errno = EIO; nsent = -1; goto out; } } offset += nread; nsent += nread; } out: if (nsent != -1) req->off = offset; return nsent; } static ssize_t uv__fs_sendfile(uv_fs_t* req) { int in_fd; int out_fd; in_fd = req->flags; out_fd = req->file; #if defined(__linux__) || defined(__sun) { off_t off; ssize_t r; off = req->off; r = sendfile(out_fd, in_fd, &off, req->bufsml[0].len); /* sendfile() on SunOS returns EINVAL if the target fd is not a socket but * it still writes out data. Fortunately, we can detect it by checking if * the offset has been updated. */ if (r != -1 || off > req->off) { r = off - req->off; req->off = off; return r; } if (errno == EINVAL || errno == EIO || errno == ENOTSOCK || errno == EXDEV) { errno = 0; return uv__fs_sendfile_emul(req); } return -1; } #elif defined(__FreeBSD__) || defined(__APPLE__) { off_t len; ssize_t r; /* sendfile() on FreeBSD and Darwin returns EAGAIN if the target fd is in * non-blocking mode and not all data could be written. If a non-zero * number of bytes have been sent, we don't consider it an error. */ #if defined(__FreeBSD__) len = 0; r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0); #else /* The darwin sendfile takes len as an input for the length to send, * so make sure to initialize it with the caller's value. */ len = req->bufsml[0].len; r = sendfile(in_fd, out_fd, req->off, &len, NULL, 0); #endif if (r != -1 || len != 0) { req->off += len; return (ssize_t) len; } if (errno == EINVAL || errno == EIO || errno == ENOTSOCK || errno == EXDEV) { errno = 0; return uv__fs_sendfile_emul(req); } return -1; } #else /* Squelch compiler warnings. */ (void) &in_fd; (void) &out_fd; return uv__fs_sendfile_emul(req); #endif } static ssize_t uv__fs_utime(uv_fs_t* req) { struct utimbuf buf; buf.actime = req->atime; buf.modtime = req->mtime; return utime(req->path, &buf); /* TODO use utimes() where available */ } static ssize_t uv__fs_write(uv_fs_t* req) { ssize_t r; /* Serialize writes on OS X, concurrent write() and pwrite() calls result in * data loss. We can't use a per-file descriptor lock, the descriptor may be * a dup(). */ #if defined(__APPLE__) static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&lock); #endif if (req->off < 0) { if (req->nbufs == 1) r = write(req->file, req->bufs[0].base, req->bufs[0].len); else r = writev(req->file, (struct iovec*) req->bufs, req->nbufs); } else { if (req->nbufs == 1) { r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off); goto done; } #if HAVE_PREADV r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); #else # if defined(__linux__) static int no_pwritev; if (no_pwritev) # endif { off_t written; size_t index; # if defined(__linux__) retry: # endif written = 0; index = 0; r = 0; do { if (req->bufs[index].len > 0) { r = pwrite(req->file, req->bufs[index].base, req->bufs[index].len, req->off + written); if (r > 0) written += r; } index++; } while (index < req->nbufs && r >= 0); if (written > 0) r = written; } # if defined(__linux__) else { r = uv__pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); if (r == -1 && errno == ENOSYS) { no_pwritev = 1; goto retry; } } # endif #endif } done: #if defined(__APPLE__) pthread_mutex_unlock(&lock); #endif if (req->bufs != req->bufsml) free(req->bufs); return r; } static void uv__to_stat(struct stat* src, uv_stat_t* dst) { dst->st_dev = src->st_dev; dst->st_mode = src->st_mode; dst->st_nlink = src->st_nlink; dst->st_uid = src->st_uid; dst->st_gid = src->st_gid; dst->st_rdev = src->st_rdev; dst->st_ino = src->st_ino; dst->st_size = src->st_size; dst->st_blksize = src->st_blksize; dst->st_blocks = src->st_blocks; #if defined(__APPLE__) dst->st_atim.tv_sec = src->st_atimespec.tv_sec; dst->st_atim.tv_nsec = src->st_atimespec.tv_nsec; dst->st_mtim.tv_sec = src->st_mtimespec.tv_sec; dst->st_mtim.tv_nsec = src->st_mtimespec.tv_nsec; dst->st_ctim.tv_sec = src->st_ctimespec.tv_sec; dst->st_ctim.tv_nsec = src->st_ctimespec.tv_nsec; dst->st_birthtim.tv_sec = src->st_birthtimespec.tv_sec; dst->st_birthtim.tv_nsec = src->st_birthtimespec.tv_nsec; dst->st_flags = src->st_flags; dst->st_gen = src->st_gen; #elif !defined(_AIX) && \ (defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || defined(_XOPEN_SOURCE)) dst->st_atim.tv_sec = src->st_atim.tv_sec; dst->st_atim.tv_nsec = src->st_atim.tv_nsec; dst->st_mtim.tv_sec = src->st_mtim.tv_sec; dst->st_mtim.tv_nsec = src->st_mtim.tv_nsec; dst->st_ctim.tv_sec = src->st_ctim.tv_sec; dst->st_ctim.tv_nsec = src->st_ctim.tv_nsec; # if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) dst->st_birthtim.tv_sec = src->st_birthtim.tv_sec; dst->st_birthtim.tv_nsec = src->st_birthtim.tv_nsec; dst->st_flags = src->st_flags; dst->st_gen = src->st_gen; # else dst->st_birthtim.tv_sec = src->st_ctim.tv_sec; dst->st_birthtim.tv_nsec = src->st_ctim.tv_nsec; dst->st_flags = 0; dst->st_gen = 0; # endif #else dst->st_atim.tv_sec = src->st_atime; dst->st_atim.tv_nsec = 0; dst->st_mtim.tv_sec = src->st_mtime; dst->st_mtim.tv_nsec = 0; dst->st_ctim.tv_sec = src->st_ctime; dst->st_ctim.tv_nsec = 0; dst->st_birthtim.tv_sec = src->st_ctime; dst->st_birthtim.tv_nsec = 0; dst->st_flags = 0; dst->st_gen = 0; #endif } static int uv__fs_stat(const char *path, uv_stat_t *buf) { struct stat pbuf; int ret; ret = stat(path, &pbuf); uv__to_stat(&pbuf, buf); return ret; } static int uv__fs_lstat(const char *path, uv_stat_t *buf) { struct stat pbuf; int ret; ret = lstat(path, &pbuf); uv__to_stat(&pbuf, buf); return ret; } static int uv__fs_fstat(int fd, uv_stat_t *buf) { struct stat pbuf; int ret; ret = fstat(fd, &pbuf); uv__to_stat(&pbuf, buf); return ret; } static void uv__fs_work(struct uv__work* w) { int retry_on_eintr; uv_fs_t* req; ssize_t r; #ifdef O_CLOEXEC static int no_cloexec_support; #endif /* O_CLOEXEC */ req = container_of(w, uv_fs_t, work_req); retry_on_eintr = !(req->fs_type == UV_FS_CLOSE); do { errno = 0; #define X(type, action) \ case UV_FS_ ## type: \ r = action; \ break; switch (req->fs_type) { X(ACCESS, access(req->path, req->flags)); X(CHMOD, chmod(req->path, req->mode)); X(CHOWN, chown(req->path, req->uid, req->gid)); X(CLOSE, close(req->file)); X(FCHMOD, fchmod(req->file, req->mode)); X(FCHOWN, fchown(req->file, req->uid, req->gid)); X(FDATASYNC, uv__fs_fdatasync(req)); X(FSTAT, uv__fs_fstat(req->file, &req->statbuf)); X(FSYNC, fsync(req->file)); X(FTRUNCATE, ftruncate(req->file, req->off)); X(FUTIME, uv__fs_futime(req)); X(LSTAT, uv__fs_lstat(req->path, &req->statbuf)); X(LINK, link(req->path, req->new_path)); X(MKDIR, mkdir(req->path, req->mode)); X(MKDTEMP, uv__fs_mkdtemp(req)); X(READ, uv__fs_read(req)); X(SCANDIR, uv__fs_scandir(req)); X(READLINK, uv__fs_readlink(req)); X(RENAME, rename(req->path, req->new_path)); X(RMDIR, rmdir(req->path)); X(SENDFILE, uv__fs_sendfile(req)); X(STAT, uv__fs_stat(req->path, &req->statbuf)); X(SYMLINK, symlink(req->path, req->new_path)); X(UNLINK, unlink(req->path)); X(UTIME, uv__fs_utime(req)); X(WRITE, uv__fs_write(req)); case UV_FS_OPEN: #ifdef O_CLOEXEC /* Try O_CLOEXEC before entering locks */ if (!no_cloexec_support) { r = open(req->path, req->flags | O_CLOEXEC, req->mode); if (r >= 0) break; if (errno != EINVAL) break; no_cloexec_support = 1; } #endif /* O_CLOEXEC */ if (req->cb != NULL) uv_rwlock_rdlock(&req->loop->cloexec_lock); r = open(req->path, req->flags, req->mode); /* * In case of failure `uv__cloexec` will leave error in `errno`, * so it is enough to just set `r` to `-1`. */ if (r >= 0 && uv__cloexec(r, 1) != 0) { r = uv__close(r); if (r != 0 && r != -EINPROGRESS) abort(); r = -1; } if (req->cb != NULL) uv_rwlock_rdunlock(&req->loop->cloexec_lock); break; default: abort(); } #undef X } while (r == -1 && errno == EINTR && retry_on_eintr); if (r == -1) req->result = -errno; else req->result = r; if (r == 0 && (req->fs_type == UV_FS_STAT || req->fs_type == UV_FS_FSTAT || req->fs_type == UV_FS_LSTAT)) { req->ptr = &req->statbuf; } } static void uv__fs_done(struct uv__work* w, int status) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); uv__req_unregister(req->loop, req); if (status == -ECANCELED) { assert(req->result == 0); req->result = -ECANCELED; } if (req->cb != NULL) req->cb(req); } int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { INIT(ACCESS); PATH; req->flags = flags; POST; } int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { INIT(CHMOD); PATH; req->mode = mode; POST; } int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(CHOWN); PATH; req->uid = uid; req->gid = gid; POST; } int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(CLOSE); req->file = file; POST; } int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb) { INIT(FCHMOD); req->file = file; req->mode = mode; POST; } int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { INIT(FCHOWN); req->file = file; req->uid = uid; req->gid = gid; POST; } int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FDATASYNC); req->file = file; POST; } int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FSTAT); req->file = file; POST; } int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { INIT(FSYNC); req->file = file; POST; } int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t off, uv_fs_cb cb) { INIT(FTRUNCATE); req->file = file; req->off = off; POST; } int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb) { INIT(FUTIME); req->file = file; req->atime = atime; req->mtime = mtime; POST; } int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(LSTAT); PATH; POST; } int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { INIT(LINK); PATH2; POST; } int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { INIT(MKDIR); PATH; req->mode = mode; POST; } int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { INIT(MKDTEMP); req->path = strdup(tpl); if (req->path == NULL) return -ENOMEM; POST; } int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) { INIT(OPEN); PATH; req->flags = flags; req->mode = mode; POST; } int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t off, uv_fs_cb cb) { INIT(READ); req->file = file; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return -ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->off = off; POST; } int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { INIT(SCANDIR); PATH; req->flags = flags; POST; } int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(READLINK); PATH; POST; } int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { INIT(RENAME); PATH2; POST; } int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(RMDIR); PATH; POST; } int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, int64_t off, size_t len, uv_fs_cb cb) { INIT(SENDFILE); req->flags = in_fd; /* hack */ req->file = out_fd; req->off = off; req->bufsml[0].len = len; POST; } int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(STAT); PATH; POST; } int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { INIT(SYMLINK); PATH2; req->flags = flags; POST; } int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { INIT(UNLINK); PATH; POST; } int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { INIT(UTIME); PATH; req->atime = atime; req->mtime = mtime; POST; } int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t off, uv_fs_cb cb) { INIT(WRITE); req->file = file; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return -ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->off = off; POST; } void uv_fs_req_cleanup(uv_fs_t* req) { free((void*) req->path); req->path = NULL; req->new_path = NULL; if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL) uv__fs_scandir_cleanup(req); if (req->ptr != &req->statbuf) free(req->ptr); req->ptr = NULL; } MoarVM-2015.11/3rdparty/libuv/src/unix/fsevents.c0000644000175000017500000006654012502366750020535 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #if TARGET_OS_IPHONE /* iOS (currently) doesn't provide the FSEvents-API (nor CoreServices) */ int uv__fsevents_init(uv_fs_event_t* handle) { return 0; } int uv__fsevents_close(uv_fs_event_t* handle) { return 0; } void uv__fsevents_loop_delete(uv_loop_t* loop) { } #else /* TARGET_OS_IPHONE */ #include #include #include #include #include #include /* These are macros to avoid "initializer element is not constant" errors * with old versions of gcc. */ #define kFSEventsModified (kFSEventStreamEventFlagItemFinderInfoMod | \ kFSEventStreamEventFlagItemModified | \ kFSEventStreamEventFlagItemInodeMetaMod | \ kFSEventStreamEventFlagItemChangeOwner | \ kFSEventStreamEventFlagItemXattrMod) #define kFSEventsRenamed (kFSEventStreamEventFlagItemCreated | \ kFSEventStreamEventFlagItemRemoved | \ kFSEventStreamEventFlagItemRenamed) #define kFSEventsSystem (kFSEventStreamEventFlagUserDropped | \ kFSEventStreamEventFlagKernelDropped | \ kFSEventStreamEventFlagEventIdsWrapped | \ kFSEventStreamEventFlagHistoryDone | \ kFSEventStreamEventFlagMount | \ kFSEventStreamEventFlagUnmount | \ kFSEventStreamEventFlagRootChanged) typedef struct uv__fsevents_event_s uv__fsevents_event_t; typedef struct uv__cf_loop_signal_s uv__cf_loop_signal_t; typedef struct uv__cf_loop_state_s uv__cf_loop_state_t; struct uv__cf_loop_signal_s { QUEUE member; uv_fs_event_t* handle; }; struct uv__fsevents_event_s { QUEUE member; int events; char path[1]; }; struct uv__cf_loop_state_s { CFRunLoopRef loop; CFRunLoopSourceRef signal_source; int fsevent_need_reschedule; FSEventStreamRef fsevent_stream; uv_sem_t fsevent_sem; uv_mutex_t fsevent_mutex; void* fsevent_handles[2]; unsigned int fsevent_handle_count; }; /* Forward declarations */ static void uv__cf_loop_cb(void* arg); static void* uv__cf_loop_runner(void* arg); static int uv__cf_loop_signal(uv_loop_t* loop, uv_fs_event_t* handle); /* Lazy-loaded by uv__fsevents_global_init(). */ static CFArrayRef (*pCFArrayCreate)(CFAllocatorRef, const void**, CFIndex, const CFArrayCallBacks*); static void (*pCFRelease)(CFTypeRef); static void (*pCFRunLoopAddSource)(CFRunLoopRef, CFRunLoopSourceRef, CFStringRef); static CFRunLoopRef (*pCFRunLoopGetCurrent)(void); static void (*pCFRunLoopRemoveSource)(CFRunLoopRef, CFRunLoopSourceRef, CFStringRef); static void (*pCFRunLoopRun)(void); static CFRunLoopSourceRef (*pCFRunLoopSourceCreate)(CFAllocatorRef, CFIndex, CFRunLoopSourceContext*); static void (*pCFRunLoopSourceSignal)(CFRunLoopSourceRef); static void (*pCFRunLoopStop)(CFRunLoopRef); static void (*pCFRunLoopWakeUp)(CFRunLoopRef); static CFStringRef (*pCFStringCreateWithFileSystemRepresentation)( CFAllocatorRef, const char*); static CFStringEncoding (*pCFStringGetSystemEncoding)(void); static CFStringRef (*pkCFRunLoopDefaultMode); static FSEventStreamRef (*pFSEventStreamCreate)(CFAllocatorRef, FSEventStreamCallback, FSEventStreamContext*, CFArrayRef, FSEventStreamEventId, CFTimeInterval, FSEventStreamCreateFlags); static void (*pFSEventStreamFlushSync)(FSEventStreamRef); static void (*pFSEventStreamInvalidate)(FSEventStreamRef); static void (*pFSEventStreamRelease)(FSEventStreamRef); static void (*pFSEventStreamScheduleWithRunLoop)(FSEventStreamRef, CFRunLoopRef, CFStringRef); static Boolean (*pFSEventStreamStart)(FSEventStreamRef); static void (*pFSEventStreamStop)(FSEventStreamRef); #define UV__FSEVENTS_PROCESS(handle, block) \ do { \ QUEUE events; \ QUEUE* q; \ uv__fsevents_event_t* event; \ int err; \ uv_mutex_lock(&(handle)->cf_mutex); \ /* Split-off all events and empty original queue */ \ QUEUE_INIT(&events); \ if (!QUEUE_EMPTY(&(handle)->cf_events)) { \ q = QUEUE_HEAD(&(handle)->cf_events); \ QUEUE_SPLIT(&(handle)->cf_events, q, &events); \ } \ /* Get error (if any) and zero original one */ \ err = (handle)->cf_error; \ (handle)->cf_error = 0; \ uv_mutex_unlock(&(handle)->cf_mutex); \ /* Loop through events, deallocating each after processing */ \ while (!QUEUE_EMPTY(&events)) { \ q = QUEUE_HEAD(&events); \ event = QUEUE_DATA(q, uv__fsevents_event_t, member); \ QUEUE_REMOVE(q); \ /* NOTE: Checking uv__is_active() is required here, because handle \ * callback may close handle and invoking it after it will lead to \ * incorrect behaviour */ \ if (!uv__is_closing((handle)) && uv__is_active((handle))) \ block \ /* Free allocated data */ \ free(event); \ } \ if (err != 0 && !uv__is_closing((handle)) && uv__is_active((handle))) \ (handle)->cb((handle), NULL, 0, err); \ } while (0) /* Runs in UV loop's thread, when there're events to report to handle */ static void uv__fsevents_cb(uv_async_t* cb) { uv_fs_event_t* handle; handle = cb->data; UV__FSEVENTS_PROCESS(handle, { handle->cb(handle, event->path[0] ? event->path : NULL, event->events, 0); }); } /* Runs in CF thread, pushed event into handle's event list */ static void uv__fsevents_push_event(uv_fs_event_t* handle, QUEUE* events, int err) { assert(events != NULL || err != 0); uv_mutex_lock(&handle->cf_mutex); /* Concatenate two queues */ if (events != NULL) QUEUE_ADD(&handle->cf_events, events); /* Propagate error */ if (err != 0) handle->cf_error = err; uv_mutex_unlock(&handle->cf_mutex); uv_async_send(handle->cf_cb); } /* Runs in CF thread, when there're events in FSEventStream */ static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef, void* info, size_t numEvents, void* eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) { size_t i; int len; char** paths; char* path; char* pos; uv_fs_event_t* handle; QUEUE* q; uv_loop_t* loop; uv__cf_loop_state_t* state; uv__fsevents_event_t* event; QUEUE head; loop = info; state = loop->cf_state; assert(state != NULL); paths = eventPaths; /* For each handle */ uv_mutex_lock(&state->fsevent_mutex); QUEUE_FOREACH(q, &state->fsevent_handles) { handle = QUEUE_DATA(q, uv_fs_event_t, cf_member); QUEUE_INIT(&head); /* Process and filter out events */ for (i = 0; i < numEvents; i++) { /* Ignore system events */ if (eventFlags[i] & kFSEventsSystem) continue; path = paths[i]; len = strlen(path); /* Filter out paths that are outside handle's request */ if (strncmp(path, handle->realpath, handle->realpath_len) != 0) continue; if (handle->realpath_len > 1 || *handle->realpath != '/') { path += handle->realpath_len; len -= handle->realpath_len; /* Skip forward slash */ if (*path != '\0') { path++; len--; } } #ifdef MAC_OS_X_VERSION_10_7 /* Ignore events with path equal to directory itself */ if (len == 0) continue; #endif /* MAC_OS_X_VERSION_10_7 */ /* Do not emit events from subdirectories (without option set) */ if ((handle->cf_flags & UV_FS_EVENT_RECURSIVE) == 0 && *path != 0) { pos = strchr(path + 1, '/'); if (pos != NULL) continue; } #ifndef MAC_OS_X_VERSION_10_7 path = ""; len = 0; #endif /* MAC_OS_X_VERSION_10_7 */ event = malloc(sizeof(*event) + len); if (event == NULL) break; memset(event, 0, sizeof(*event)); memcpy(event->path, path, len + 1); if ((eventFlags[i] & kFSEventsModified) != 0 && (eventFlags[i] & kFSEventsRenamed) == 0) event->events = UV_CHANGE; else event->events = UV_RENAME; QUEUE_INSERT_TAIL(&head, &event->member); } if (!QUEUE_EMPTY(&head)) uv__fsevents_push_event(handle, &head, 0); } uv_mutex_unlock(&state->fsevent_mutex); } /* Runs in CF thread */ static int uv__fsevents_create_stream(uv_loop_t* loop, CFArrayRef paths) { uv__cf_loop_state_t* state; FSEventStreamContext ctx; FSEventStreamRef ref; CFAbsoluteTime latency; FSEventStreamCreateFlags flags; /* Initialize context */ ctx.version = 0; ctx.info = loop; ctx.retain = NULL; ctx.release = NULL; ctx.copyDescription = NULL; latency = 0.05; /* Explanation of selected flags: * 1. NoDefer - without this flag, events that are happening continuously * (i.e. each event is happening after time interval less than `latency`, * counted from previous event), will be deferred and passed to callback * once they'll either fill whole OS buffer, or when this continuous stream * will stop (i.e. there'll be delay between events, bigger than * `latency`). * Specifying this flag will invoke callback after `latency` time passed * since event. * 2. FileEvents - fire callback for file changes too (by default it is firing * it only for directory changes). */ flags = kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents; /* * NOTE: It might sound like a good idea to remember last seen StreamEventId, * but in reality one dir might have last StreamEventId less than, the other, * that is being watched now. Which will cause FSEventStream API to report * changes to files from the past. */ ref = pFSEventStreamCreate(NULL, &uv__fsevents_event_cb, &ctx, paths, kFSEventStreamEventIdSinceNow, latency, flags); assert(ref != NULL); state = loop->cf_state; pFSEventStreamScheduleWithRunLoop(ref, state->loop, *pkCFRunLoopDefaultMode); if (!pFSEventStreamStart(ref)) { pFSEventStreamInvalidate(ref); pFSEventStreamRelease(ref); return -EMFILE; } state->fsevent_stream = ref; return 0; } /* Runs in CF thread */ static void uv__fsevents_destroy_stream(uv_loop_t* loop) { uv__cf_loop_state_t* state; state = loop->cf_state; if (state->fsevent_stream == NULL) return; /* Flush all accumulated events */ pFSEventStreamFlushSync(state->fsevent_stream); /* Stop emitting events */ pFSEventStreamStop(state->fsevent_stream); /* Release stream */ pFSEventStreamInvalidate(state->fsevent_stream); pFSEventStreamRelease(state->fsevent_stream); state->fsevent_stream = NULL; } /* Runs in CF thread, when there're new fsevent handles to add to stream */ static void uv__fsevents_reschedule(uv_fs_event_t* handle) { uv__cf_loop_state_t* state; QUEUE* q; uv_fs_event_t* curr; CFArrayRef cf_paths; CFStringRef* paths; unsigned int i; int err; unsigned int path_count; state = handle->loop->cf_state; paths = NULL; cf_paths = NULL; err = 0; /* NOTE: `i` is used in deallocation loop below */ i = 0; /* Optimization to prevent O(n^2) time spent when starting to watch * many files simultaneously */ uv_mutex_lock(&state->fsevent_mutex); if (state->fsevent_need_reschedule == 0) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } state->fsevent_need_reschedule = 0; uv_mutex_unlock(&state->fsevent_mutex); /* Destroy previous FSEventStream */ uv__fsevents_destroy_stream(handle->loop); /* Any failure below will be a memory failure */ err = -ENOMEM; /* Create list of all watched paths */ uv_mutex_lock(&state->fsevent_mutex); path_count = state->fsevent_handle_count; if (path_count != 0) { paths = malloc(sizeof(*paths) * path_count); if (paths == NULL) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } q = &state->fsevent_handles; for (; i < path_count; i++) { q = QUEUE_NEXT(q); assert(q != &state->fsevent_handles); curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); assert(curr->realpath != NULL); paths[i] = pCFStringCreateWithFileSystemRepresentation(NULL, curr->realpath); if (paths[i] == NULL) { uv_mutex_unlock(&state->fsevent_mutex); goto final; } } } uv_mutex_unlock(&state->fsevent_mutex); err = 0; if (path_count != 0) { /* Create new FSEventStream */ cf_paths = pCFArrayCreate(NULL, (const void**) paths, path_count, NULL); if (cf_paths == NULL) { err = -ENOMEM; goto final; } err = uv__fsevents_create_stream(handle->loop, cf_paths); } final: /* Deallocate all paths in case of failure */ if (err != 0) { if (cf_paths == NULL) { while (i != 0) pCFRelease(paths[--i]); free(paths); } else { /* CFArray takes ownership of both strings and original C-array */ pCFRelease(cf_paths); } /* Broadcast error to all handles */ uv_mutex_lock(&state->fsevent_mutex); QUEUE_FOREACH(q, &state->fsevent_handles) { curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); uv__fsevents_push_event(curr, NULL, err); } uv_mutex_unlock(&state->fsevent_mutex); } /* * Main thread will block until the removal of handle from the list, * we must tell it when we're ready. * * NOTE: This is coupled with `uv_sem_wait()` in `uv__fsevents_close` */ if (!uv__is_active(handle)) uv_sem_post(&state->fsevent_sem); } static int uv__fsevents_global_init(void) { static pthread_mutex_t global_init_mutex = PTHREAD_MUTEX_INITIALIZER; static void* core_foundation_handle; static void* core_services_handle; int err; err = 0; pthread_mutex_lock(&global_init_mutex); if (core_foundation_handle != NULL) goto out; /* The libraries are never unloaded because we currently don't have a good * mechanism for keeping a reference count. It's unlikely to be an issue * but if it ever becomes one, we can turn the dynamic library handles into * per-event loop properties and have the dynamic linker keep track for us. */ err = -ENOSYS; core_foundation_handle = dlopen("/System/Library/Frameworks/" "CoreFoundation.framework/" "Versions/A/CoreFoundation", RTLD_LAZY | RTLD_LOCAL); if (core_foundation_handle == NULL) goto out; core_services_handle = dlopen("/System/Library/Frameworks/" "CoreServices.framework/" "Versions/A/CoreServices", RTLD_LAZY | RTLD_LOCAL); if (core_services_handle == NULL) goto out; err = -ENOENT; #define V(handle, symbol) \ do { \ *(void **)(&p ## symbol) = dlsym((handle), #symbol); \ if (p ## symbol == NULL) \ goto out; \ } \ while (0) V(core_foundation_handle, CFArrayCreate); V(core_foundation_handle, CFRelease); V(core_foundation_handle, CFRunLoopAddSource); V(core_foundation_handle, CFRunLoopGetCurrent); V(core_foundation_handle, CFRunLoopRemoveSource); V(core_foundation_handle, CFRunLoopRun); V(core_foundation_handle, CFRunLoopSourceCreate); V(core_foundation_handle, CFRunLoopSourceSignal); V(core_foundation_handle, CFRunLoopStop); V(core_foundation_handle, CFRunLoopWakeUp); V(core_foundation_handle, CFStringCreateWithFileSystemRepresentation); V(core_foundation_handle, CFStringGetSystemEncoding); V(core_foundation_handle, kCFRunLoopDefaultMode); V(core_services_handle, FSEventStreamCreate); V(core_services_handle, FSEventStreamFlushSync); V(core_services_handle, FSEventStreamInvalidate); V(core_services_handle, FSEventStreamRelease); V(core_services_handle, FSEventStreamScheduleWithRunLoop); V(core_services_handle, FSEventStreamStart); V(core_services_handle, FSEventStreamStop); #undef V err = 0; out: if (err && core_services_handle != NULL) { dlclose(core_services_handle); core_services_handle = NULL; } if (err && core_foundation_handle != NULL) { dlclose(core_foundation_handle); core_foundation_handle = NULL; } pthread_mutex_unlock(&global_init_mutex); return err; } /* Runs in UV loop */ static int uv__fsevents_loop_init(uv_loop_t* loop) { CFRunLoopSourceContext ctx; uv__cf_loop_state_t* state; pthread_attr_t attr_storage; pthread_attr_t* attr; int err; if (loop->cf_state != NULL) return 0; err = uv__fsevents_global_init(); if (err) return err; state = calloc(1, sizeof(*state)); if (state == NULL) return -ENOMEM; err = uv_mutex_init(&loop->cf_mutex); if (err) goto fail_mutex_init; err = uv_sem_init(&loop->cf_sem, 0); if (err) goto fail_sem_init; QUEUE_INIT(&loop->cf_signals); err = uv_sem_init(&state->fsevent_sem, 0); if (err) goto fail_fsevent_sem_init; err = uv_mutex_init(&state->fsevent_mutex); if (err) goto fail_fsevent_mutex_init; QUEUE_INIT(&state->fsevent_handles); state->fsevent_need_reschedule = 0; state->fsevent_handle_count = 0; memset(&ctx, 0, sizeof(ctx)); ctx.info = loop; ctx.perform = uv__cf_loop_cb; state->signal_source = pCFRunLoopSourceCreate(NULL, 0, &ctx); if (state->signal_source == NULL) { err = -ENOMEM; goto fail_signal_source_create; } /* In the unlikely event that pthread_attr_init() fails, create the thread * with the default stack size. We'll use a little more address space but * that in itself is not a fatal error. */ attr = &attr_storage; if (pthread_attr_init(attr)) attr = NULL; if (attr != NULL) if (pthread_attr_setstacksize(attr, 4 * PTHREAD_STACK_MIN)) abort(); loop->cf_state = state; /* uv_thread_t is an alias for pthread_t. */ err = -pthread_create(&loop->cf_thread, attr, uv__cf_loop_runner, loop); if (attr != NULL) pthread_attr_destroy(attr); if (err) goto fail_thread_create; /* Synchronize threads */ uv_sem_wait(&loop->cf_sem); return 0; fail_thread_create: loop->cf_state = NULL; fail_signal_source_create: uv_mutex_destroy(&state->fsevent_mutex); fail_fsevent_mutex_init: uv_sem_destroy(&state->fsevent_sem); fail_fsevent_sem_init: uv_sem_destroy(&loop->cf_sem); fail_sem_init: uv_mutex_destroy(&loop->cf_mutex); fail_mutex_init: free(state); return err; } /* Runs in UV loop */ void uv__fsevents_loop_delete(uv_loop_t* loop) { uv__cf_loop_signal_t* s; uv__cf_loop_state_t* state; QUEUE* q; if (loop->cf_state == NULL) return; if (uv__cf_loop_signal(loop, NULL) != 0) abort(); uv_thread_join(&loop->cf_thread); uv_sem_destroy(&loop->cf_sem); uv_mutex_destroy(&loop->cf_mutex); /* Free any remaining data */ while (!QUEUE_EMPTY(&loop->cf_signals)) { q = QUEUE_HEAD(&loop->cf_signals); s = QUEUE_DATA(q, uv__cf_loop_signal_t, member); QUEUE_REMOVE(q); free(s); } /* Destroy state */ state = loop->cf_state; uv_sem_destroy(&state->fsevent_sem); uv_mutex_destroy(&state->fsevent_mutex); pCFRelease(state->signal_source); free(state); loop->cf_state = NULL; } /* Runs in CF thread. This is the CF loop's body */ static void* uv__cf_loop_runner(void* arg) { uv_loop_t* loop; uv__cf_loop_state_t* state; loop = arg; state = loop->cf_state; state->loop = pCFRunLoopGetCurrent(); pCFRunLoopAddSource(state->loop, state->signal_source, *pkCFRunLoopDefaultMode); uv_sem_post(&loop->cf_sem); pCFRunLoopRun(); pCFRunLoopRemoveSource(state->loop, state->signal_source, *pkCFRunLoopDefaultMode); return NULL; } /* Runs in CF thread, executed after `uv__cf_loop_signal()` */ static void uv__cf_loop_cb(void* arg) { uv_loop_t* loop; uv__cf_loop_state_t* state; QUEUE* item; QUEUE split_head; uv__cf_loop_signal_t* s; loop = arg; state = loop->cf_state; QUEUE_INIT(&split_head); uv_mutex_lock(&loop->cf_mutex); if (!QUEUE_EMPTY(&loop->cf_signals)) { QUEUE* split_pos = QUEUE_HEAD(&loop->cf_signals); QUEUE_SPLIT(&loop->cf_signals, split_pos, &split_head); } uv_mutex_unlock(&loop->cf_mutex); while (!QUEUE_EMPTY(&split_head)) { item = QUEUE_HEAD(&split_head); s = QUEUE_DATA(item, uv__cf_loop_signal_t, member); /* This was a termination signal */ if (s->handle == NULL) pCFRunLoopStop(state->loop); else uv__fsevents_reschedule(s->handle); QUEUE_REMOVE(item); free(s); } } /* Runs in UV loop to notify CF thread */ int uv__cf_loop_signal(uv_loop_t* loop, uv_fs_event_t* handle) { uv__cf_loop_signal_t* item; uv__cf_loop_state_t* state; item = malloc(sizeof(*item)); if (item == NULL) return -ENOMEM; item->handle = handle; uv_mutex_lock(&loop->cf_mutex); QUEUE_INSERT_TAIL(&loop->cf_signals, &item->member); uv_mutex_unlock(&loop->cf_mutex); state = loop->cf_state; assert(state != NULL); pCFRunLoopSourceSignal(state->signal_source); pCFRunLoopWakeUp(state->loop); return 0; } /* Runs in UV loop to initialize handle */ int uv__fsevents_init(uv_fs_event_t* handle) { int err; uv__cf_loop_state_t* state; err = uv__fsevents_loop_init(handle->loop); if (err) return err; /* Get absolute path to file */ handle->realpath = realpath(handle->path, NULL); if (handle->realpath == NULL) return -errno; handle->realpath_len = strlen(handle->realpath); /* Initialize event queue */ QUEUE_INIT(&handle->cf_events); handle->cf_error = 0; /* * Events will occur in other thread. * Initialize callback for getting them back into event loop's thread */ handle->cf_cb = malloc(sizeof(*handle->cf_cb)); if (handle->cf_cb == NULL) { err = -ENOMEM; goto fail_cf_cb_malloc; } handle->cf_cb->data = handle; uv_async_init(handle->loop, handle->cf_cb, uv__fsevents_cb); handle->cf_cb->flags |= UV__HANDLE_INTERNAL; uv_unref((uv_handle_t*) handle->cf_cb); err = uv_mutex_init(&handle->cf_mutex); if (err) goto fail_cf_mutex_init; /* Insert handle into the list */ state = handle->loop->cf_state; uv_mutex_lock(&state->fsevent_mutex); QUEUE_INSERT_TAIL(&state->fsevent_handles, &handle->cf_member); state->fsevent_handle_count++; state->fsevent_need_reschedule = 1; uv_mutex_unlock(&state->fsevent_mutex); /* Reschedule FSEventStream */ assert(handle != NULL); err = uv__cf_loop_signal(handle->loop, handle); if (err) goto fail_loop_signal; return 0; fail_loop_signal: uv_mutex_destroy(&handle->cf_mutex); fail_cf_mutex_init: free(handle->cf_cb); handle->cf_cb = NULL; fail_cf_cb_malloc: free(handle->realpath); handle->realpath = NULL; handle->realpath_len = 0; return err; } /* Runs in UV loop to de-initialize handle */ int uv__fsevents_close(uv_fs_event_t* handle) { int err; uv__cf_loop_state_t* state; if (handle->cf_cb == NULL) return -EINVAL; /* Remove handle from the list */ state = handle->loop->cf_state; uv_mutex_lock(&state->fsevent_mutex); QUEUE_REMOVE(&handle->cf_member); state->fsevent_handle_count--; state->fsevent_need_reschedule = 1; uv_mutex_unlock(&state->fsevent_mutex); /* Reschedule FSEventStream */ assert(handle != NULL); err = uv__cf_loop_signal(handle->loop, handle); if (err) return -err; /* Wait for deinitialization */ uv_sem_wait(&state->fsevent_sem); uv_close((uv_handle_t*) handle->cf_cb, (uv_close_cb) free); handle->cf_cb = NULL; /* Free data in queue */ UV__FSEVENTS_PROCESS(handle, { /* NOP */ }); uv_mutex_destroy(&handle->cf_mutex); free(handle->realpath); handle->realpath = NULL; handle->realpath_len = 0; return 0; } #endif /* TARGET_OS_IPHONE */ MoarVM-2015.11/3rdparty/libuv/src/unix/getaddrinfo.c0000644000175000017500000001223212456307253021154 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * 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. */ /* Expose glibc-specific EAI_* error codes. Needs to be defined before we * include any headers. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #include "uv.h" #include "internal.h" #include #include /* NULL */ #include #include /* EAI_* constants. */ #include int uv__getaddrinfo_translate_error(int sys_err) { switch (sys_err) { case 0: return 0; #if defined(EAI_ADDRFAMILY) case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; #endif #if defined(EAI_AGAIN) case EAI_AGAIN: return UV_EAI_AGAIN; #endif #if defined(EAI_BADFLAGS) case EAI_BADFLAGS: return UV_EAI_BADFLAGS; #endif #if defined(EAI_BADHINTS) case EAI_BADHINTS: return UV_EAI_BADHINTS; #endif #if defined(EAI_CANCELED) case EAI_CANCELED: return UV_EAI_CANCELED; #endif #if defined(EAI_FAIL) case EAI_FAIL: return UV_EAI_FAIL; #endif #if defined(EAI_FAMILY) case EAI_FAMILY: return UV_EAI_FAMILY; #endif #if defined(EAI_MEMORY) case EAI_MEMORY: return UV_EAI_MEMORY; #endif #if defined(EAI_NODATA) case EAI_NODATA: return UV_EAI_NODATA; #endif #if defined(EAI_NONAME) # if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME case EAI_NONAME: return UV_EAI_NONAME; # endif #endif #if defined(EAI_OVERFLOW) case EAI_OVERFLOW: return UV_EAI_OVERFLOW; #endif #if defined(EAI_PROTOCOL) case EAI_PROTOCOL: return UV_EAI_PROTOCOL; #endif #if defined(EAI_SERVICE) case EAI_SERVICE: return UV_EAI_SERVICE; #endif #if defined(EAI_SOCKTYPE) case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; #endif #if defined(EAI_SYSTEM) case EAI_SYSTEM: return -errno; #endif } assert(!"unknown EAI_* error code"); abort(); return 0; /* Pacify compiler. */ } static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; int err; req = container_of(w, uv_getaddrinfo_t, work_req); err = getaddrinfo(req->hostname, req->service, req->hints, &req->res); req->retcode = uv__getaddrinfo_translate_error(err); } static void uv__getaddrinfo_done(struct uv__work* w, int status) { uv_getaddrinfo_t* req; struct addrinfo *res; req = container_of(w, uv_getaddrinfo_t, work_req); uv__req_unregister(req->loop, req); res = req->res; req->res = NULL; /* See initialization in uv_getaddrinfo(). */ if (req->hints) free(req->hints); else if (req->service) free(req->service); else if (req->hostname) free(req->hostname); else assert(0); req->hints = NULL; req->service = NULL; req->hostname = NULL; if (status == -ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } req->cb(req, req->retcode, res); } int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb cb, const char* hostname, const char* service, const struct addrinfo* hints) { size_t hostname_len; size_t service_len; size_t hints_len; size_t len; char* buf; if (req == NULL || cb == NULL || (hostname == NULL && service == NULL)) return -EINVAL; hostname_len = hostname ? strlen(hostname) + 1 : 0; service_len = service ? strlen(service) + 1 : 0; hints_len = hints ? sizeof(*hints) : 0; buf = malloc(hostname_len + service_len + hints_len); if (buf == NULL) return -ENOMEM; uv__req_init(loop, req, UV_GETADDRINFO); req->loop = loop; req->cb = cb; req->res = NULL; req->hints = NULL; req->service = NULL; req->hostname = NULL; req->retcode = 0; /* order matters, see uv_getaddrinfo_done() */ len = 0; if (hints) { req->hints = memcpy(buf + len, hints, sizeof(*hints)); len += sizeof(*hints); } if (service) { req->service = memcpy(buf + len, service, service_len); len += service_len; } if (hostname) { req->hostname = memcpy(buf + len, hostname, hostname_len); len += hostname_len; } uv__work_submit(loop, &req->work_req, uv__getaddrinfo_work, uv__getaddrinfo_done); return 0; } void uv_freeaddrinfo(struct addrinfo* ai) { if (ai) freeaddrinfo(ai); } MoarVM-2015.11/3rdparty/libuv/src/unix/getnameinfo.c0000644000175000017500000000657512456307253021177 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include "uv.h" #include "internal.h" static void uv__getnameinfo_work(struct uv__work* w) { uv_getnameinfo_t* req; int err; socklen_t salen; req = container_of(w, uv_getnameinfo_t, work_req); if (req->storage.ss_family == AF_INET) salen = sizeof(struct sockaddr_in); else if (req->storage.ss_family == AF_INET6) salen = sizeof(struct sockaddr_in6); else abort(); err = getnameinfo((struct sockaddr*) &req->storage, salen, req->host, sizeof(req->host), req->service, sizeof(req->service), req->flags); req->retcode = uv__getaddrinfo_translate_error(err); } static void uv__getnameinfo_done(struct uv__work* w, int status) { uv_getnameinfo_t* req; char* host; char* service; req = container_of(w, uv_getnameinfo_t, work_req); uv__req_unregister(req->loop, req); host = service = NULL; if (status == -ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } else if (req->retcode == 0) { host = req->host; service = req->service; } req->getnameinfo_cb(req, req->retcode, host, service); } /* * Entry point for getnameinfo * return 0 if a callback will be made * return error code if validation fails */ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { if (req == NULL || getnameinfo_cb == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in)); } else if (addr->sa_family == AF_INET6) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in6)); } else { return UV_EINVAL; } uv__req_init(loop, (uv_req_t*)req, UV_GETNAMEINFO); req->getnameinfo_cb = getnameinfo_cb; req->flags = flags; req->type = UV_GETNAMEINFO; req->loop = loop; req->retcode = 0; uv__work_submit(loop, &req->work_req, uv__getnameinfo_work, uv__getnameinfo_done); return 0; } MoarVM-2015.11/3rdparty/libuv/src/unix/internal.h0000644000175000017500000002537512502366750020522 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_UNIX_INTERNAL_H_ #define UV_UNIX_INTERNAL_H_ #include "uv-common.h" #include #include /* abort */ #include /* strrchr */ #include /* O_CLOEXEC, may be */ #if defined(__STRICT_ANSI__) # define inline __inline #endif #if defined(__linux__) # include "linux-syscalls.h" #endif /* __linux__ */ #if defined(__sun) # include # include #endif /* __sun */ #if defined(_AIX) #define reqevents events #define rtnevents revents #include #endif /* _AIX */ #if defined(__APPLE__) && !TARGET_OS_IPHONE # include #endif #define STATIC_ASSERT(expr) \ void uv__static_assert(int static_assert_failed[1 - 2 * !(expr)]) #define ACCESS_ONCE(type, var) \ (*(volatile type*) &(var)) #define UNREACHABLE() \ do { \ assert(0 && "unreachable code"); \ abort(); \ } \ while (0) #define SAVE_ERRNO(block) \ do { \ int _saved_errno = errno; \ do { block; } while (0); \ errno = _saved_errno; \ } \ while (0) /* The __clang__ and __INTEL_COMPILER checks are superfluous because they * define __GNUC__. They are here to convey to you, dear reader, that these * macros are enabled when compiling with clang or icc. */ #if defined(__clang__) || \ defined(__GNUC__) || \ defined(__INTEL_COMPILER) || \ defined(__SUNPRO_C) # define UV_DESTRUCTOR(declaration) __attribute__((destructor)) declaration # define UV_UNUSED(declaration) __attribute__((unused)) declaration #else # define UV_DESTRUCTOR(declaration) declaration # define UV_UNUSED(declaration) declaration #endif #if defined(__linux__) # define UV__POLLIN UV__EPOLLIN # define UV__POLLOUT UV__EPOLLOUT # define UV__POLLERR UV__EPOLLERR # define UV__POLLHUP UV__EPOLLHUP #endif #if defined(__sun) || defined(_AIX) # define UV__POLLIN POLLIN # define UV__POLLOUT POLLOUT # define UV__POLLERR POLLERR # define UV__POLLHUP POLLHUP #endif #ifndef UV__POLLIN # define UV__POLLIN 1 #endif #ifndef UV__POLLOUT # define UV__POLLOUT 2 #endif #ifndef UV__POLLERR # define UV__POLLERR 4 #endif #ifndef UV__POLLHUP # define UV__POLLHUP 8 #endif #if !defined(O_CLOEXEC) && defined(__FreeBSD__) /* * It may be that we are just missing `__POSIX_VISIBLE >= 200809`. * Try using fixed value const and give up, if it doesn't work */ # define O_CLOEXEC 0x00100000 #endif typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t; /* handle flags */ enum { UV_CLOSING = 0x01, /* uv_close() called but not finished. */ UV_CLOSED = 0x02, /* close(2) finished. */ UV_STREAM_READING = 0x04, /* uv_read_start() called. */ UV_STREAM_SHUTTING = 0x08, /* uv_shutdown() called but not complete. */ UV_STREAM_SHUT = 0x10, /* Write side closed. */ UV_STREAM_READABLE = 0x20, /* The stream is readable */ UV_STREAM_WRITABLE = 0x40, /* The stream is writable */ UV_STREAM_BLOCKING = 0x80, /* Synchronous writes. */ UV_STREAM_READ_PARTIAL = 0x100, /* read(2) read less than requested. */ UV_STREAM_READ_EOF = 0x200, /* read(2) read EOF. */ UV_TCP_NODELAY = 0x400, /* Disable Nagle. */ UV_TCP_KEEPALIVE = 0x800, /* Turn on keep-alive. */ UV_TCP_SINGLE_ACCEPT = 0x1000, /* Only accept() when idle. */ UV_HANDLE_IPV6 = 0x10000 /* Handle is bound to a IPv6 socket. */ }; typedef enum { UV_CLOCK_PRECISE = 0, /* Use the highest resolution clock available. */ UV_CLOCK_FAST = 1 /* Use the fastest clock with <= 1ms granularity. */ } uv_clocktype_t; struct uv__stream_queued_fds_s { unsigned int size; unsigned int offset; int fds[1]; }; /* core */ int uv__nonblock(int fd, int set); int uv__close(int fd); int uv__cloexec(int fd, int set); int uv__socket(int domain, int type, int protocol); int uv__dup(int fd); ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags); void uv__make_close_pending(uv_handle_t* handle); void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd); void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events); void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events); void uv__io_close(uv_loop_t* loop, uv__io_t* w); void uv__io_feed(uv_loop_t* loop, uv__io_t* w); int uv__io_active(const uv__io_t* w, unsigned int events); void uv__io_poll(uv_loop_t* loop, int timeout); /* in milliseconds or -1 */ /* async */ void uv__async_send(struct uv__async* wa); void uv__async_init(struct uv__async* wa); int uv__async_start(uv_loop_t* loop, struct uv__async* wa, uv__async_cb cb); void uv__async_stop(uv_loop_t* loop, struct uv__async* wa); /* loop */ void uv__run_idle(uv_loop_t* loop); void uv__run_check(uv_loop_t* loop); void uv__run_prepare(uv_loop_t* loop); /* stream */ void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream, uv_handle_type type); int uv__stream_open(uv_stream_t*, int fd, int flags); void uv__stream_destroy(uv_stream_t* stream); #if defined(__APPLE__) int uv__stream_try_select(uv_stream_t* stream, int* fd); #endif /* defined(__APPLE__) */ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); int uv__accept(int sockfd); int uv__dup2_cloexec(int oldfd, int newfd); int uv__open_cloexec(const char* path, int flags); /* tcp */ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb); int uv__tcp_nodelay(int fd, int on); int uv__tcp_keepalive(int fd, int on, unsigned int delay); /* pipe */ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); /* timer */ void uv__run_timers(uv_loop_t* loop); int uv__next_timeout(const uv_loop_t* loop); /* signal */ void uv__signal_close(uv_signal_t* handle); void uv__signal_global_once_init(void); void uv__signal_loop_cleanup(uv_loop_t* loop); /* platform specific */ uint64_t uv__hrtime(uv_clocktype_t type); int uv__kqueue_init(uv_loop_t* loop); int uv__platform_loop_init(uv_loop_t* loop, int default_loop); void uv__platform_loop_delete(uv_loop_t* loop); void uv__platform_invalidate_fd(uv_loop_t* loop, int fd); /* various */ void uv__async_close(uv_async_t* handle); void uv__check_close(uv_check_t* handle); void uv__fs_event_close(uv_fs_event_t* handle); void uv__idle_close(uv_idle_t* handle); void uv__pipe_close(uv_pipe_t* handle); void uv__poll_close(uv_poll_t* handle); void uv__prepare_close(uv_prepare_t* handle); void uv__process_close(uv_process_t* handle); void uv__stream_close(uv_stream_t* handle); void uv__tcp_close(uv_tcp_t* handle); void uv__timer_close(uv_timer_t* handle); void uv__udp_close(uv_udp_t* handle); void uv__udp_finish_close(uv_udp_t* handle); uv_handle_type uv__handle_type(int fd); #if defined(__APPLE__) int uv___stream_fd(const uv_stream_t* handle); #define uv__stream_fd(handle) (uv___stream_fd((const uv_stream_t*) (handle))) #else #define uv__stream_fd(handle) ((handle)->io_watcher.fd) #endif /* defined(__APPLE__) */ #ifdef UV__O_NONBLOCK # define UV__F_NONBLOCK UV__O_NONBLOCK #else # define UV__F_NONBLOCK 1 #endif int uv__make_socketpair(int fds[2], int flags); int uv__make_pipe(int fds[2], int flags); #if defined(__APPLE__) int uv__fsevents_init(uv_fs_event_t* handle); int uv__fsevents_close(uv_fs_event_t* handle); void uv__fsevents_loop_delete(uv_loop_t* loop); /* OSX < 10.7 has no file events, polyfill them */ #ifndef MAC_OS_X_VERSION_10_7 static const int kFSEventStreamCreateFlagFileEvents = 0x00000010; static const int kFSEventStreamEventFlagItemCreated = 0x00000100; static const int kFSEventStreamEventFlagItemRemoved = 0x00000200; static const int kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400; static const int kFSEventStreamEventFlagItemRenamed = 0x00000800; static const int kFSEventStreamEventFlagItemModified = 0x00001000; static const int kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000; static const int kFSEventStreamEventFlagItemChangeOwner = 0x00004000; static const int kFSEventStreamEventFlagItemXattrMod = 0x00008000; static const int kFSEventStreamEventFlagItemIsFile = 0x00010000; static const int kFSEventStreamEventFlagItemIsDir = 0x00020000; static const int kFSEventStreamEventFlagItemIsSymlink = 0x00040000; #endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070 */ #endif /* defined(__APPLE__) */ UV_UNUSED(static void uv__req_init(uv_loop_t* loop, uv_req_t* req, uv_req_type type)) { req->type = type; uv__req_register(loop, req); } #define uv__req_init(loop, req, type) \ uv__req_init((loop), (uv_req_t*)(req), (type)) UV_UNUSED(static void uv__update_time(uv_loop_t* loop)) { /* Use a fast time source if available. We only need millisecond precision. */ loop->time = uv__hrtime(UV_CLOCK_FAST) / 1000000; } UV_UNUSED(static char* uv__basename_r(const char* path)) { char* s; s = strrchr(path, '/'); if (s == NULL) return (char*) path; return s + 1; } #endif /* UV_UNIX_INTERNAL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/unix/kqueue.c0000644000175000017500000002422712456307253020174 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags); int uv__kqueue_init(uv_loop_t* loop) { loop->backend_fd = kqueue(); if (loop->backend_fd == -1) return -errno; uv__cloexec(loop->backend_fd, 1); return 0; } void uv__io_poll(uv_loop_t* loop, int timeout) { struct kevent events[1024]; struct kevent* ev; struct timespec spec; unsigned int nevents; unsigned int revents; QUEUE* q; uint64_t base; uint64_t diff; uv__io_t* w; int filter; int fflags; int count; int nfds; int fd; int op; int i; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } nevents = 0; while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); if ((w->events & UV__POLLIN) == 0 && (w->pevents & UV__POLLIN) != 0) { filter = EVFILT_READ; fflags = 0; op = EV_ADD; if (w->cb == uv__fs_event) { filter = EVFILT_VNODE; fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; op = EV_ADD | EV_ONESHOT; /* Stop the event from firing repeatedly. */ } EV_SET(events + nevents, w->fd, filter, op, fflags, 0, 0); if (++nevents == ARRAY_SIZE(events)) { if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) abort(); nevents = 0; } } if ((w->events & UV__POLLOUT) == 0 && (w->pevents & UV__POLLOUT) != 0) { EV_SET(events + nevents, w->fd, EVFILT_WRITE, EV_ADD, 0, 0, 0); if (++nevents == ARRAY_SIZE(events)) { if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) abort(); nevents = 0; } } w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;; nevents = 0) { if (timeout != -1) { spec.tv_sec = timeout / 1000; spec.tv_nsec = (timeout % 1000) * 1000000; } nfds = kevent(loop->backend_fd, events, nevents, events, ARRAY_SIZE(events), timeout == -1 ? NULL : &spec); /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) abort(); if (timeout == 0) return; if (timeout == -1) continue; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { ev = events + i; fd = ev->ident; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. */ /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != EBADF && errno != ENOENT) abort(); continue; } if (ev->filter == EVFILT_VNODE) { assert(w->events == UV__POLLIN); assert(w->pevents == UV__POLLIN); w->cb(loop, w, ev->fflags); /* XXX always uv__fs_event() */ nevents++; continue; } revents = 0; if (ev->filter == EVFILT_READ) { if (w->pevents & UV__POLLIN) { revents |= UV__POLLIN; w->rcount = ev->data; } else { /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != ENOENT) abort(); } } if (ev->filter == EVFILT_WRITE) { if (w->pevents & UV__POLLOUT) { revents |= UV__POLLOUT; w->wcount = ev->data; } else { /* TODO batch up */ struct kevent events[1]; EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) if (errno != ENOENT) abort(); } } if (ev->flags & EV_ERROR) revents |= UV__POLLERR; if (revents == 0) continue; w->cb(loop, w, revents); nevents++; } loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct kevent* events; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); events = (struct kevent*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events == NULL) return; /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].ident == fd) events[i].ident = -1; } static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags) { uv_fs_event_t* handle; struct kevent ev; int events; const char* path; #if defined(F_GETPATH) /* MAXPATHLEN == PATH_MAX but the former is what XNU calls it internally. */ char pathbuf[MAXPATHLEN]; #endif handle = container_of(w, uv_fs_event_t, event_watcher); if (fflags & (NOTE_ATTRIB | NOTE_EXTEND)) events = UV_CHANGE; else events = UV_RENAME; path = NULL; #if defined(F_GETPATH) /* Also works when the file has been unlinked from the file system. Passing * in the path when the file has been deleted is arguably a little strange * but it's consistent with what the inotify backend does. */ if (fcntl(handle->event_watcher.fd, F_GETPATH, pathbuf) == 0) path = uv__basename_r(pathbuf); #endif handle->cb(handle, path, events, 0); if (handle->event_watcher.fd == -1) return; /* Watcher operates in one-shot mode, re-arm it. */ fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; EV_SET(&ev, w->fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, fflags, 0, 0); if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) abort(); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { #if defined(__APPLE__) struct stat statbuf; #endif /* defined(__APPLE__) */ int fd; if (uv__is_active(handle)) return -EINVAL; /* TODO open asynchronously - but how do we report back errors? */ fd = open(path, O_RDONLY); if (fd == -1) return -errno; uv__handle_start(handle); uv__io_init(&handle->event_watcher, uv__fs_event, fd); handle->path = strdup(path); handle->cb = cb; #if defined(__APPLE__) /* Nullify field to perform checks later */ handle->cf_cb = NULL; handle->realpath = NULL; handle->realpath_len = 0; handle->cf_flags = flags; if (fstat(fd, &statbuf)) goto fallback; /* FSEvents works only with directories */ if (!(statbuf.st_mode & S_IFDIR)) goto fallback; return uv__fsevents_init(handle); fallback: #endif /* defined(__APPLE__) */ uv__io_start(handle->loop, &handle->event_watcher, UV__POLLIN); return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; uv__handle_stop(handle); #if defined(__APPLE__) if (uv__fsevents_close(handle)) #endif /* defined(__APPLE__) */ { uv__io_close(handle->loop, &handle->event_watcher); } free(handle->path); handle->path = NULL; uv__close(handle->event_watcher.fd); handle->event_watcher.fd = -1; return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/linux-core.c0000644000175000017500000005140112502366750020753 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAVE_IFADDRS_H 1 #ifdef __UCLIBC__ # if __UCLIBC_MAJOR__ < 0 || __UCLIBC_MINOR__ < 9 || __UCLIBC_SUBLEVEL__ < 32 # undef HAVE_IFADDRS_H # endif #endif #ifdef HAVE_IFADDRS_H # if defined(__ANDROID__) # include "android-ifaddrs.h" # else # include # endif # include # include # include #endif /* HAVE_IFADDRS_H */ /* Available from 2.6.32 onwards. */ #ifndef CLOCK_MONOTONIC_COARSE # define CLOCK_MONOTONIC_COARSE 6 #endif /* This is rather annoying: CLOCK_BOOTTIME lives in but we can't * include that file because it conflicts with . We'll just have to * define it ourselves. */ #ifndef CLOCK_BOOTTIME # define CLOCK_BOOTTIME 7 #endif static int read_models(unsigned int numcpus, uv_cpu_info_t* ci); static int read_times(unsigned int numcpus, uv_cpu_info_t* ci); static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); static unsigned long read_cpufreq(unsigned int cpunum); int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { int fd; fd = uv__epoll_create1(UV__EPOLL_CLOEXEC); /* epoll_create1() can fail either because it's not implemented (old kernel) * or because it doesn't understand the EPOLL_CLOEXEC flag. */ if (fd == -1 && (errno == ENOSYS || errno == EINVAL)) { fd = uv__epoll_create(256); if (fd != -1) uv__cloexec(fd, 1); } loop->backend_fd = fd; loop->inotify_fd = -1; loop->inotify_watchers = NULL; if (fd == -1) return -errno; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->inotify_fd == -1) return; uv__io_stop(loop, &loop->inotify_read_watcher, UV__POLLIN); uv__close(loop->inotify_fd); loop->inotify_fd = -1; } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct uv__epoll_event* events; struct uv__epoll_event dummy; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); events = (struct uv__epoll_event*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events != NULL) /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].data == fd) events[i].data = -1; /* Remove the file descriptor from the epoll. * This avoids a problem where the same file description remains open * in another process, causing repeated junk epoll events. * * We pass in a dummy epoll_event, to work around a bug in old kernels. */ if (loop->backend_fd >= 0) uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, &dummy); } void uv__io_poll(uv_loop_t* loop, int timeout) { struct uv__epoll_event events[1024]; struct uv__epoll_event* pe; struct uv__epoll_event e; QUEUE* q; uv__io_t* w; uint64_t base; uint64_t diff; int nevents; int count; int nfds; int fd; int op; int i; static int no_epoll_wait; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); assert(w->fd >= 0); assert(w->fd < (int) loop->nwatchers); e.events = w->pevents; e.data = w->fd; if (w->events == 0) op = UV__EPOLL_CTL_ADD; else op = UV__EPOLL_CTL_MOD; /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching * events, skip the syscall and squelch the events after epoll_wait(). */ if (uv__epoll_ctl(loop->backend_fd, op, w->fd, &e)) { if (errno != EEXIST) abort(); assert(op == UV__EPOLL_CTL_ADD); /* We've reactivated a file descriptor that's been watched before. */ if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_MOD, w->fd, &e)) abort(); } w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { if (!no_epoll_wait) { nfds = uv__epoll_wait(loop->backend_fd, events, ARRAY_SIZE(events), timeout); if (nfds == -1 && errno == ENOSYS) { no_epoll_wait = 1; continue; } } else { nfds = uv__epoll_pwait(loop->backend_fd, events, ARRAY_SIZE(events), timeout, NULL); } /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (nfds == 0) { assert(timeout != -1); return; } if (nfds == -1) { if (errno != EINTR) abort(); if (timeout == -1) continue; if (timeout == 0) return; /* Interrupted by a signal. Update timeout and poll again. */ goto update_timeout; } nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; fd = pe->data; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; if (w == NULL) { /* File descriptor that we've stopped watching, disarm it. * * Ignore all errors because we may be racing with another thread * when the file descriptor is closed. */ uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, pe); continue; } /* Give users only events they're interested in. Prevents spurious * callbacks when previous callback invocation in this loop has stopped * the current watcher. Also, filters out events that users has not * requested us to watch. */ pe->events &= w->pevents | UV__POLLERR | UV__POLLHUP; /* Work around an epoll quirk where it sometimes reports just the * EPOLLERR or EPOLLHUP event. In order to force the event loop to * move forward, we merge in the read/write events that the watcher * is interested in; uv__read() and uv__write() will then deal with * the error or hangup in the usual fashion. * * Note to self: happens when epoll reports EPOLLIN|EPOLLHUP, the user * reads the available data, calls uv_read_stop(), then sometime later * calls uv_read_start() again. By then, libuv has forgotten about the * hangup and the kernel won't report EPOLLIN again because there's * nothing left to read. If anything, libuv is to blame here. The * current hack is just a quick bandaid; to properly fix it, libuv * needs to remember the error/hangup event. We should get that for * free when we switch over to edge-triggered I/O. */ if (pe->events == UV__EPOLLERR || pe->events == UV__EPOLLHUP) pe->events |= w->pevents & (UV__EPOLLIN | UV__EPOLLOUT); if (pe->events != 0) { w->cb(loop, w, pe->events); nevents++; } } loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } uint64_t uv__hrtime(uv_clocktype_t type) { static clock_t fast_clock_id = -1; struct timespec t; clock_t clock_id; /* Prefer CLOCK_MONOTONIC_COARSE if available but only when it has * millisecond granularity or better. CLOCK_MONOTONIC_COARSE is * serviced entirely from the vDSO, whereas CLOCK_MONOTONIC may * decide to make a costly system call. */ /* TODO(bnoordhuis) Use CLOCK_MONOTONIC_COARSE for UV_CLOCK_PRECISE * when it has microsecond granularity or better (unlikely). */ if (type == UV_CLOCK_FAST && fast_clock_id == -1) { if (clock_getres(CLOCK_MONOTONIC_COARSE, &t) == 0 && t.tv_nsec <= 1 * 1000 * 1000) { fast_clock_id = CLOCK_MONOTONIC_COARSE; } else { fast_clock_id = CLOCK_MONOTONIC; } } clock_id = CLOCK_MONOTONIC; if (type == UV_CLOCK_FAST) clock_id = fast_clock_id; if (clock_gettime(clock_id, &t)) return 0; /* Not really possible. */ return t.tv_sec * (uint64_t) 1e9 + t.tv_nsec; } void uv_loadavg(double avg[3]) { struct sysinfo info; if (sysinfo(&info) < 0) return; avg[0] = (double) info.loads[0] / 65536.0; avg[1] = (double) info.loads[1] / 65536.0; avg[2] = (double) info.loads[2] / 65536.0; } int uv_exepath(char* buffer, size_t* size) { ssize_t n; if (buffer == NULL || size == NULL) return -EINVAL; n = readlink("/proc/self/exe", buffer, *size - 1); if (n == -1) return -errno; buffer[n] = '\0'; *size = n; return 0; } uint64_t uv_get_free_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); } uint64_t uv_get_total_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); } int uv_resident_set_memory(size_t* rss) { char buf[1024]; const char* s; ssize_t n; long val; int fd; int i; do fd = open("/proc/self/stat", O_RDONLY); while (fd == -1 && errno == EINTR); if (fd == -1) return -errno; do n = read(fd, buf, sizeof(buf) - 1); while (n == -1 && errno == EINTR); uv__close(fd); if (n == -1) return -errno; buf[n] = '\0'; s = strchr(buf, ' '); if (s == NULL) goto err; s += 1; if (*s != '(') goto err; s = strchr(s, ')'); if (s == NULL) goto err; for (i = 1; i <= 22; i++) { s = strchr(s + 1, ' '); if (s == NULL) goto err; } errno = 0; val = strtol(s, NULL, 10); if (errno != 0) goto err; if (val < 0) goto err; *rss = val * getpagesize(); return 0; err: return -EINVAL; } int uv_uptime(double* uptime) { static volatile int no_clock_boottime; struct timespec now; int r; /* Try CLOCK_BOOTTIME first, fall back to CLOCK_MONOTONIC if not available * (pre-2.6.39 kernels). CLOCK_MONOTONIC doesn't increase when the system * is suspended. */ if (no_clock_boottime) { retry: r = clock_gettime(CLOCK_MONOTONIC, &now); } else if ((r = clock_gettime(CLOCK_BOOTTIME, &now)) && errno == EINVAL) { no_clock_boottime = 1; goto retry; } if (r) return -errno; *uptime = now.tv_sec; return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int numcpus; uv_cpu_info_t* ci; int err; *cpu_infos = NULL; *count = 0; numcpus = sysconf(_SC_NPROCESSORS_ONLN); assert(numcpus != (unsigned int) -1); assert(numcpus != 0); ci = calloc(numcpus, sizeof(*ci)); if (ci == NULL) return -ENOMEM; err = read_models(numcpus, ci); if (err == 0) err = read_times(numcpus, ci); if (err) { uv_free_cpu_info(ci, numcpus); return err; } /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo. * We don't check for errors here. Worst case, the field is left zero. */ if (ci[0].speed == 0) read_speeds(numcpus, ci); *cpu_infos = ci; *count = numcpus; return 0; } static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci) { unsigned int num; for (num = 0; num < numcpus; num++) ci[num].speed = read_cpufreq(num) / 1000; } /* Also reads the CPU frequency on x86. The other architectures only have * a BogoMIPS field, which may not be very accurate. * * Note: Simply returns on error, uv_cpu_info() takes care of the cleanup. */ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { static const char model_marker[] = "model name\t: "; static const char speed_marker[] = "cpu MHz\t\t: "; const char* inferred_model; unsigned int model_idx; unsigned int speed_idx; char buf[1024]; char* model; FILE* fp; /* Most are unused on non-ARM, non-MIPS and non-x86 architectures. */ (void) &model_marker; (void) &speed_marker; (void) &speed_idx; (void) &model; (void) &buf; (void) &fp; model_idx = 0; speed_idx = 0; #if defined(__arm__) || \ defined(__i386__) || \ defined(__mips__) || \ defined(__x86_64__) fp = fopen("/proc/cpuinfo", "r"); if (fp == NULL) return -errno; while (fgets(buf, sizeof(buf), fp)) { if (model_idx < numcpus) { if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { model = buf + sizeof(model_marker) - 1; model = strndup(model, strlen(model) - 1); /* Strip newline. */ if (model == NULL) { fclose(fp); return -ENOMEM; } ci[model_idx++].model = model; continue; } } #if defined(__arm__) || defined(__mips__) if (model_idx < numcpus) { #if defined(__arm__) /* Fallback for pre-3.8 kernels. */ static const char model_marker[] = "Processor\t: "; #else /* defined(__mips__) */ static const char model_marker[] = "cpu model\t\t: "; #endif if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { model = buf + sizeof(model_marker) - 1; model = strndup(model, strlen(model) - 1); /* Strip newline. */ if (model == NULL) { fclose(fp); return -ENOMEM; } ci[model_idx++].model = model; continue; } } #else /* !__arm__ && !__mips__ */ if (speed_idx < numcpus) { if (strncmp(buf, speed_marker, sizeof(speed_marker) - 1) == 0) { ci[speed_idx++].speed = atoi(buf + sizeof(speed_marker) - 1); continue; } } #endif /* __arm__ || __mips__ */ } fclose(fp); #endif /* __arm__ || __i386__ || __mips__ || __x86_64__ */ /* Now we want to make sure that all the models contain *something* because * it's not safe to leave them as null. Copy the last entry unless there * isn't one, in that case we simply put "unknown" into everything. */ inferred_model = "unknown"; if (model_idx > 0) inferred_model = ci[model_idx - 1].model; while (model_idx < numcpus) { model = strndup(inferred_model, strlen(inferred_model)); if (model == NULL) return -ENOMEM; ci[model_idx++].model = model; } return 0; } static int read_times(unsigned int numcpus, uv_cpu_info_t* ci) { unsigned long clock_ticks; struct uv_cpu_times_s ts; unsigned long user; unsigned long nice; unsigned long sys; unsigned long idle; unsigned long dummy; unsigned long irq; unsigned int num; unsigned int len; char buf[1024]; FILE* fp; clock_ticks = sysconf(_SC_CLK_TCK); assert(clock_ticks != (unsigned long) -1); assert(clock_ticks != 0); fp = fopen("/proc/stat", "r"); if (fp == NULL) return -errno; if (!fgets(buf, sizeof(buf), fp)) abort(); num = 0; while (fgets(buf, sizeof(buf), fp)) { if (num >= numcpus) break; if (strncmp(buf, "cpu", 3)) break; /* skip "cpu " marker */ { unsigned int n; int r = sscanf(buf, "cpu%u ", &n); assert(r == 1); (void) r; /* silence build warning */ for (len = sizeof("cpu0"); n /= 10; len++); } /* Line contains user, nice, system, idle, iowait, irq, softirq, steal, * guest, guest_nice but we're only interested in the first four + irq. * * Don't use %*s to skip fields or %ll to read straight into the uint64_t * fields, they're not allowed in C89 mode. */ if (6 != sscanf(buf + len, "%lu %lu %lu %lu %lu %lu", &user, &nice, &sys, &idle, &dummy, &irq)) abort(); ts.user = clock_ticks * user; ts.nice = clock_ticks * nice; ts.sys = clock_ticks * sys; ts.idle = clock_ticks * idle; ts.irq = clock_ticks * irq; ci[num++].cpu_times = ts; } fclose(fp); assert(num == numcpus); return 0; } static unsigned long read_cpufreq(unsigned int cpunum) { unsigned long val; char buf[1024]; FILE* fp; snprintf(buf, sizeof(buf), "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq", cpunum); fp = fopen(buf, "r"); if (fp == NULL) return 0; if (fscanf(fp, "%lu", &val) != 1) val = 0; fclose(fp); return val; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { #ifndef HAVE_IFADDRS_H return -ENOSYS; #else struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_ll *sll; if (getifaddrs(&addrs)) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family == PF_PACKET)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; /* * On Linux getifaddrs returns information related to the raw underlying * devices. We're not interested in this information yet. */ if (ent->ifa_addr->sa_family == PF_PACKET) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != PF_PACKET)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sll = (struct sockaddr_ll*)ent->ifa_addr; memcpy(address->phys_addr, sll->sll_addr, sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; #endif } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } void uv__set_process_title(const char* title) { #if defined(PR_SET_NAME) prctl(PR_SET_NAME, title); /* Only copies first 16 characters. */ #endif } MoarVM-2015.11/3rdparty/libuv/src/unix/linux-inotify.c0000644000175000017500000001440712456307253021512 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "tree.h" #include "internal.h" #include #include #include #include #include #include #include #include struct watcher_list { RB_ENTRY(watcher_list) entry; QUEUE watchers; char* path; int wd; }; struct watcher_root { struct watcher_list* rbh_root; }; #define CAST(p) ((struct watcher_root*)(p)) static int compare_watchers(const struct watcher_list* a, const struct watcher_list* b) { if (a->wd < b->wd) return -1; if (a->wd > b->wd) return 1; return 0; } RB_GENERATE_STATIC(watcher_root, watcher_list, entry, compare_watchers) static void uv__inotify_read(uv_loop_t* loop, uv__io_t* w, unsigned int revents); static int new_inotify_fd(void) { int err; int fd; fd = uv__inotify_init1(UV__IN_NONBLOCK | UV__IN_CLOEXEC); if (fd != -1) return fd; if (errno != ENOSYS) return -errno; fd = uv__inotify_init(); if (fd == -1) return -errno; err = uv__cloexec(fd, 1); if (err == 0) err = uv__nonblock(fd, 1); if (err) { uv__close(fd); return err; } return fd; } static int init_inotify(uv_loop_t* loop) { int err; if (loop->inotify_fd != -1) return 0; err = new_inotify_fd(); if (err < 0) return err; loop->inotify_fd = err; uv__io_init(&loop->inotify_read_watcher, uv__inotify_read, loop->inotify_fd); uv__io_start(loop, &loop->inotify_read_watcher, UV__POLLIN); return 0; } static struct watcher_list* find_watcher(uv_loop_t* loop, int wd) { struct watcher_list w; w.wd = wd; return RB_FIND(watcher_root, CAST(&loop->inotify_watchers), &w); } static void uv__inotify_read(uv_loop_t* loop, uv__io_t* dummy, unsigned int events) { const struct uv__inotify_event* e; struct watcher_list* w; uv_fs_event_t* h; QUEUE* q; const char* path; ssize_t size; const char *p; /* needs to be large enough for sizeof(inotify_event) + strlen(path) */ char buf[4096]; while (1) { do size = read(loop->inotify_fd, buf, sizeof(buf)); while (size == -1 && errno == EINTR); if (size == -1) { assert(errno == EAGAIN || errno == EWOULDBLOCK); break; } assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */ /* Now we have one or more inotify_event structs. */ for (p = buf; p < buf + size; p += sizeof(*e) + e->len) { e = (const struct uv__inotify_event*)p; events = 0; if (e->mask & (UV__IN_ATTRIB|UV__IN_MODIFY)) events |= UV_CHANGE; if (e->mask & ~(UV__IN_ATTRIB|UV__IN_MODIFY)) events |= UV_RENAME; w = find_watcher(loop, e->wd); if (w == NULL) continue; /* Stale event, no watchers left. */ /* inotify does not return the filename when monitoring a single file * for modifications. Repurpose the filename for API compatibility. * I'm not convinced this is a good thing, maybe it should go. */ path = e->len ? (const char*) (e + 1) : uv__basename_r(w->path); QUEUE_FOREACH(q, &w->watchers) { h = QUEUE_DATA(q, uv_fs_event_t, watchers); h->cb(h, path, events, 0); } } } } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { struct watcher_list* w; int events; int err; int wd; if (uv__is_active(handle)) return -EINVAL; err = init_inotify(handle->loop); if (err) return err; events = UV__IN_ATTRIB | UV__IN_CREATE | UV__IN_MODIFY | UV__IN_DELETE | UV__IN_DELETE_SELF | UV__IN_MOVE_SELF | UV__IN_MOVED_FROM | UV__IN_MOVED_TO; wd = uv__inotify_add_watch(handle->loop->inotify_fd, path, events); if (wd == -1) return -errno; w = find_watcher(handle->loop, wd); if (w) goto no_insert; w = malloc(sizeof(*w) + strlen(path) + 1); if (w == NULL) return -ENOMEM; w->wd = wd; w->path = strcpy((char*)(w + 1), path); QUEUE_INIT(&w->watchers); RB_INSERT(watcher_root, CAST(&handle->loop->inotify_watchers), w); no_insert: uv__handle_start(handle); QUEUE_INSERT_TAIL(&w->watchers, &handle->watchers); handle->path = w->path; handle->cb = cb; handle->wd = wd; return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { struct watcher_list* w; if (!uv__is_active(handle)) return 0; w = find_watcher(handle->loop, handle->wd); assert(w != NULL); handle->wd = -1; handle->path = NULL; uv__handle_stop(handle); QUEUE_REMOVE(&handle->watchers); if (QUEUE_EMPTY(&w->watchers)) { /* No watchers left for this path. Clean up. */ RB_REMOVE(watcher_root, CAST(&handle->loop->inotify_watchers), w); uv__inotify_rm_watch(handle->loop->inotify_fd, w->wd); free(w); } return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/linux-syscalls.c0000644000175000017500000002521312456307253021663 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "linux-syscalls.h" #include #include #include #include #if defined(__i386__) # ifndef __NR_socketcall # define __NR_socketcall 102 # endif #endif #if defined(__arm__) # if defined(__thumb__) || defined(__ARM_EABI__) # define UV_SYSCALL_BASE 0 # else # define UV_SYSCALL_BASE 0x900000 # endif #endif /* __arm__ */ #ifndef __NR_accept4 # if defined(__x86_64__) # define __NR_accept4 288 # elif defined(__i386__) /* Nothing. Handled through socketcall(). */ # elif defined(__arm__) # define __NR_accept4 (UV_SYSCALL_BASE + 366) # endif #endif /* __NR_accept4 */ #ifndef __NR_eventfd # if defined(__x86_64__) # define __NR_eventfd 284 # elif defined(__i386__) # define __NR_eventfd 323 # elif defined(__arm__) # define __NR_eventfd (UV_SYSCALL_BASE + 351) # endif #endif /* __NR_eventfd */ #ifndef __NR_eventfd2 # if defined(__x86_64__) # define __NR_eventfd2 290 # elif defined(__i386__) # define __NR_eventfd2 328 # elif defined(__arm__) # define __NR_eventfd2 (UV_SYSCALL_BASE + 356) # endif #endif /* __NR_eventfd2 */ #ifndef __NR_epoll_create # if defined(__x86_64__) # define __NR_epoll_create 213 # elif defined(__i386__) # define __NR_epoll_create 254 # elif defined(__arm__) # define __NR_epoll_create (UV_SYSCALL_BASE + 250) # endif #endif /* __NR_epoll_create */ #ifndef __NR_epoll_create1 # if defined(__x86_64__) # define __NR_epoll_create1 291 # elif defined(__i386__) # define __NR_epoll_create1 329 # elif defined(__arm__) # define __NR_epoll_create1 (UV_SYSCALL_BASE + 357) # endif #endif /* __NR_epoll_create1 */ #ifndef __NR_epoll_ctl # if defined(__x86_64__) # define __NR_epoll_ctl 233 /* used to be 214 */ # elif defined(__i386__) # define __NR_epoll_ctl 255 # elif defined(__arm__) # define __NR_epoll_ctl (UV_SYSCALL_BASE + 251) # endif #endif /* __NR_epoll_ctl */ #ifndef __NR_epoll_wait # if defined(__x86_64__) # define __NR_epoll_wait 232 /* used to be 215 */ # elif defined(__i386__) # define __NR_epoll_wait 256 # elif defined(__arm__) # define __NR_epoll_wait (UV_SYSCALL_BASE + 252) # endif #endif /* __NR_epoll_wait */ #ifndef __NR_epoll_pwait # if defined(__x86_64__) # define __NR_epoll_pwait 281 # elif defined(__i386__) # define __NR_epoll_pwait 319 # elif defined(__arm__) # define __NR_epoll_pwait (UV_SYSCALL_BASE + 346) # endif #endif /* __NR_epoll_pwait */ #ifndef __NR_inotify_init # if defined(__x86_64__) # define __NR_inotify_init 253 # elif defined(__i386__) # define __NR_inotify_init 291 # elif defined(__arm__) # define __NR_inotify_init (UV_SYSCALL_BASE + 316) # endif #endif /* __NR_inotify_init */ #ifndef __NR_inotify_init1 # if defined(__x86_64__) # define __NR_inotify_init1 294 # elif defined(__i386__) # define __NR_inotify_init1 332 # elif defined(__arm__) # define __NR_inotify_init1 (UV_SYSCALL_BASE + 360) # endif #endif /* __NR_inotify_init1 */ #ifndef __NR_inotify_add_watch # if defined(__x86_64__) # define __NR_inotify_add_watch 254 # elif defined(__i386__) # define __NR_inotify_add_watch 292 # elif defined(__arm__) # define __NR_inotify_add_watch (UV_SYSCALL_BASE + 317) # endif #endif /* __NR_inotify_add_watch */ #ifndef __NR_inotify_rm_watch # if defined(__x86_64__) # define __NR_inotify_rm_watch 255 # elif defined(__i386__) # define __NR_inotify_rm_watch 293 # elif defined(__arm__) # define __NR_inotify_rm_watch (UV_SYSCALL_BASE + 318) # endif #endif /* __NR_inotify_rm_watch */ #ifndef __NR_pipe2 # if defined(__x86_64__) # define __NR_pipe2 293 # elif defined(__i386__) # define __NR_pipe2 331 # elif defined(__arm__) # define __NR_pipe2 (UV_SYSCALL_BASE + 359) # endif #endif /* __NR_pipe2 */ #ifndef __NR_recvmmsg # if defined(__x86_64__) # define __NR_recvmmsg 299 # elif defined(__i386__) # define __NR_recvmmsg 337 # elif defined(__arm__) # define __NR_recvmmsg (UV_SYSCALL_BASE + 365) # endif #endif /* __NR_recvmsg */ #ifndef __NR_sendmmsg # if defined(__x86_64__) # define __NR_sendmmsg 307 # elif defined(__i386__) # define __NR_sendmmsg 345 # elif defined(__arm__) # define __NR_sendmmsg (UV_SYSCALL_BASE + 374) # endif #endif /* __NR_sendmmsg */ #ifndef __NR_utimensat # if defined(__x86_64__) # define __NR_utimensat 280 # elif defined(__i386__) # define __NR_utimensat 320 # elif defined(__arm__) # define __NR_utimensat (UV_SYSCALL_BASE + 348) # endif #endif /* __NR_utimensat */ #ifndef __NR_preadv # if defined(__x86_64__) # define __NR_preadv 295 # elif defined(__i386__) # define __NR_preadv 333 # elif defined(__arm__) # define __NR_preadv (UV_SYSCALL_BASE + 361) # endif #endif /* __NR_preadv */ #ifndef __NR_pwritev # if defined(__x86_64__) # define __NR_pwritev 296 # elif defined(__i386__) # define __NR_pwritev 334 # elif defined(__arm__) # define __NR_pwritev (UV_SYSCALL_BASE + 362) # endif #endif /* __NR_pwritev */ #ifndef __NR_dup3 # if defined(__x86_64__) # define __NR_dup3 292 # elif defined(__i386__) # define __NR_dup3 330 # elif defined(__arm__) # define __NR_dup3 (UV_SYSCALL_BASE + 358) # endif #endif /* __NR_pwritev */ int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) { #if defined(__i386__) unsigned long args[4]; int r; args[0] = (unsigned long) fd; args[1] = (unsigned long) addr; args[2] = (unsigned long) addrlen; args[3] = (unsigned long) flags; r = syscall(__NR_socketcall, 18 /* SYS_ACCEPT4 */, args); /* socketcall() raises EINVAL when SYS_ACCEPT4 is not supported but so does * a bad flags argument. Try to distinguish between the two cases. */ if (r == -1) if (errno == EINVAL) if ((flags & ~(UV__SOCK_CLOEXEC|UV__SOCK_NONBLOCK)) == 0) errno = ENOSYS; return r; #elif defined(__NR_accept4) return syscall(__NR_accept4, fd, addr, addrlen, flags); #else return errno = ENOSYS, -1; #endif } int uv__eventfd(unsigned int count) { #if defined(__NR_eventfd) return syscall(__NR_eventfd, count); #else return errno = ENOSYS, -1; #endif } int uv__eventfd2(unsigned int count, int flags) { #if defined(__NR_eventfd2) return syscall(__NR_eventfd2, count, flags); #else return errno = ENOSYS, -1; #endif } int uv__epoll_create(int size) { #if defined(__NR_epoll_create) return syscall(__NR_epoll_create, size); #else return errno = ENOSYS, -1; #endif } int uv__epoll_create1(int flags) { #if defined(__NR_epoll_create1) return syscall(__NR_epoll_create1, flags); #else return errno = ENOSYS, -1; #endif } int uv__epoll_ctl(int epfd, int op, int fd, struct uv__epoll_event* events) { #if defined(__NR_epoll_ctl) return syscall(__NR_epoll_ctl, epfd, op, fd, events); #else return errno = ENOSYS, -1; #endif } int uv__epoll_wait(int epfd, struct uv__epoll_event* events, int nevents, int timeout) { #if defined(__NR_epoll_wait) return syscall(__NR_epoll_wait, epfd, events, nevents, timeout); #else return errno = ENOSYS, -1; #endif } int uv__epoll_pwait(int epfd, struct uv__epoll_event* events, int nevents, int timeout, const sigset_t* sigmask) { #if defined(__NR_epoll_pwait) return syscall(__NR_epoll_pwait, epfd, events, nevents, timeout, sigmask, sizeof(*sigmask)); #else return errno = ENOSYS, -1; #endif } int uv__inotify_init(void) { #if defined(__NR_inotify_init) return syscall(__NR_inotify_init); #else return errno = ENOSYS, -1; #endif } int uv__inotify_init1(int flags) { #if defined(__NR_inotify_init1) return syscall(__NR_inotify_init1, flags); #else return errno = ENOSYS, -1; #endif } int uv__inotify_add_watch(int fd, const char* path, uint32_t mask) { #if defined(__NR_inotify_add_watch) return syscall(__NR_inotify_add_watch, fd, path, mask); #else return errno = ENOSYS, -1; #endif } int uv__inotify_rm_watch(int fd, int32_t wd) { #if defined(__NR_inotify_rm_watch) return syscall(__NR_inotify_rm_watch, fd, wd); #else return errno = ENOSYS, -1; #endif } int uv__pipe2(int pipefd[2], int flags) { #if defined(__NR_pipe2) return syscall(__NR_pipe2, pipefd, flags); #else return errno = ENOSYS, -1; #endif } int uv__sendmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags) { #if defined(__NR_sendmmsg) return syscall(__NR_sendmmsg, fd, mmsg, vlen, flags); #else return errno = ENOSYS, -1; #endif } int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags, struct timespec* timeout) { #if defined(__NR_recvmmsg) return syscall(__NR_recvmmsg, fd, mmsg, vlen, flags, timeout); #else return errno = ENOSYS, -1; #endif } int uv__utimesat(int dirfd, const char* path, const struct timespec times[2], int flags) { #if defined(__NR_utimensat) return syscall(__NR_utimensat, dirfd, path, times, flags); #else return errno = ENOSYS, -1; #endif } ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset) { #if defined(__NR_preadv) return syscall(__NR_preadv, fd, iov, iovcnt, offset); #else return errno = ENOSYS, -1; #endif } ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset) { #if defined(__NR_pwritev) return syscall(__NR_pwritev, fd, iov, iovcnt, offset); #else return errno = ENOSYS, -1; #endif } int uv__dup3(int oldfd, int newfd, int flags) { #if defined(__NR_dup3) return syscall(__NR_dup3, oldfd, newfd, flags); #else return errno = ENOSYS, -1; #endif } MoarVM-2015.11/3rdparty/libuv/src/unix/linux-syscalls.h0000644000175000017500000001151412456307253021667 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_LINUX_SYSCALL_H_ #define UV_LINUX_SYSCALL_H_ #undef _GNU_SOURCE #define _GNU_SOURCE #include #include #include #include #include #if defined(__alpha__) # define UV__O_CLOEXEC 0x200000 #elif defined(__hppa__) # define UV__O_CLOEXEC 0x200000 #elif defined(__sparc__) # define UV__O_CLOEXEC 0x400000 #else # define UV__O_CLOEXEC 0x80000 #endif #if defined(__alpha__) # define UV__O_NONBLOCK 0x4 #elif defined(__hppa__) # define UV__O_NONBLOCK 0x10004 #elif defined(__mips__) # define UV__O_NONBLOCK 0x80 #elif defined(__sparc__) # define UV__O_NONBLOCK 0x4000 #else # define UV__O_NONBLOCK 0x800 #endif #define UV__EFD_CLOEXEC UV__O_CLOEXEC #define UV__EFD_NONBLOCK UV__O_NONBLOCK #define UV__IN_CLOEXEC UV__O_CLOEXEC #define UV__IN_NONBLOCK UV__O_NONBLOCK #define UV__SOCK_CLOEXEC UV__O_CLOEXEC #define UV__SOCK_NONBLOCK UV__O_NONBLOCK /* epoll flags */ #define UV__EPOLL_CLOEXEC UV__O_CLOEXEC #define UV__EPOLL_CTL_ADD 1 #define UV__EPOLL_CTL_DEL 2 #define UV__EPOLL_CTL_MOD 3 #define UV__EPOLLIN 1 #define UV__EPOLLOUT 4 #define UV__EPOLLERR 8 #define UV__EPOLLHUP 16 #define UV__EPOLLONESHOT 0x40000000 #define UV__EPOLLET 0x80000000 /* inotify flags */ #define UV__IN_ACCESS 0x001 #define UV__IN_MODIFY 0x002 #define UV__IN_ATTRIB 0x004 #define UV__IN_CLOSE_WRITE 0x008 #define UV__IN_CLOSE_NOWRITE 0x010 #define UV__IN_OPEN 0x020 #define UV__IN_MOVED_FROM 0x040 #define UV__IN_MOVED_TO 0x080 #define UV__IN_CREATE 0x100 #define UV__IN_DELETE 0x200 #define UV__IN_DELETE_SELF 0x400 #define UV__IN_MOVE_SELF 0x800 #if defined(__x86_64__) struct uv__epoll_event { uint32_t events; uint64_t data; } __attribute__((packed)); #else struct uv__epoll_event { uint32_t events; uint64_t data; }; #endif struct uv__inotify_event { int32_t wd; uint32_t mask; uint32_t cookie; uint32_t len; /* char name[0]; */ }; struct uv__mmsghdr { struct msghdr msg_hdr; unsigned int msg_len; }; int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags); int uv__eventfd(unsigned int count); int uv__epoll_create(int size); int uv__epoll_create1(int flags); int uv__epoll_ctl(int epfd, int op, int fd, struct uv__epoll_event *ev); int uv__epoll_wait(int epfd, struct uv__epoll_event* events, int nevents, int timeout); int uv__epoll_pwait(int epfd, struct uv__epoll_event* events, int nevents, int timeout, const sigset_t* sigmask); int uv__eventfd2(unsigned int count, int flags); int uv__inotify_init(void); int uv__inotify_init1(int flags); int uv__inotify_add_watch(int fd, const char* path, uint32_t mask); int uv__inotify_rm_watch(int fd, int32_t wd); int uv__pipe2(int pipefd[2], int flags); int uv__recvmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags, struct timespec* timeout); int uv__sendmmsg(int fd, struct uv__mmsghdr* mmsg, unsigned int vlen, unsigned int flags); int uv__utimesat(int dirfd, const char* path, const struct timespec times[2], int flags); ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset); int uv__dup3(int oldfd, int newfd, int flags); #endif /* UV_LINUX_SYSCALL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/unix/loop-watcher.c0000644000175000017500000000770112456307253021277 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #define UV_LOOP_WATCHER_DEFINE(name, type) \ int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ uv__handle_init(loop, (uv_handle_t*)handle, UV_##type); \ handle->name##_cb = NULL; \ return 0; \ } \ \ int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ if (uv__is_active(handle)) return 0; \ if (cb == NULL) return -EINVAL; \ QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue); \ handle->name##_cb = cb; \ uv__handle_start(handle); \ return 0; \ } \ \ int uv_##name##_stop(uv_##name##_t* handle) { \ if (!uv__is_active(handle)) return 0; \ QUEUE_REMOVE(&handle->queue); \ uv__handle_stop(handle); \ return 0; \ } \ \ void uv__run_##name(uv_loop_t* loop) { \ uv_##name##_t* h; \ QUEUE* q; \ QUEUE_FOREACH(q, &loop->name##_handles) { \ h = QUEUE_DATA(q, uv_##name##_t, queue); \ h->name##_cb(h); \ } \ } \ \ void uv__##name##_close(uv_##name##_t* handle) { \ uv_##name##_stop(handle); \ } UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) UV_LOOP_WATCHER_DEFINE(check, CHECK) UV_LOOP_WATCHER_DEFINE(idle, IDLE) MoarVM-2015.11/3rdparty/libuv/src/unix/loop.c0000644000175000017500000001160112502366750017635 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "tree.h" #include "internal.h" #include "heap-inl.h" #include #include #include static int uv__loop_init(uv_loop_t* loop, int default_loop); static void uv__loop_close(uv_loop_t* loop); static uv_loop_t default_loop_struct; static uv_loop_t* default_loop_ptr; uv_loop_t* uv_default_loop(void) { if (default_loop_ptr != NULL) return default_loop_ptr; if (uv__loop_init(&default_loop_struct, /* default_loop? */ 1)) return NULL; default_loop_ptr = &default_loop_struct; return default_loop_ptr; } int uv_loop_init(uv_loop_t* loop) { return uv__loop_init(loop, /* default_loop? */ 0); } int uv_loop_close(uv_loop_t* loop) { QUEUE* q; uv_handle_t* h; if (!QUEUE_EMPTY(&(loop)->active_reqs)) return -EBUSY; QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (!(h->flags & UV__HANDLE_INTERNAL)) return -EBUSY; } uv__loop_close(loop); #ifndef NDEBUG memset(loop, -1, sizeof(*loop)); #endif if (loop == default_loop_ptr) default_loop_ptr = NULL; return 0; } uv_loop_t* uv_loop_new(void) { uv_loop_t* loop; loop = malloc(sizeof(*loop)); if (loop == NULL) return NULL; if (uv_loop_init(loop)) { free(loop); return NULL; } return loop; } void uv_loop_delete(uv_loop_t* loop) { uv_loop_t* default_loop; int err; default_loop = default_loop_ptr; err = uv_loop_close(loop); assert(err == 0); if (loop != default_loop) free(loop); } static int uv__loop_init(uv_loop_t* loop, int default_loop) { int err; uv__signal_global_once_init(); memset(loop, 0, sizeof(*loop)); heap_init((struct heap*) &loop->timer_heap); QUEUE_INIT(&loop->wq); QUEUE_INIT(&loop->active_reqs); QUEUE_INIT(&loop->idle_handles); QUEUE_INIT(&loop->async_handles); QUEUE_INIT(&loop->check_handles); QUEUE_INIT(&loop->prepare_handles); QUEUE_INIT(&loop->handle_queue); loop->nfds = 0; loop->watchers = NULL; loop->nwatchers = 0; QUEUE_INIT(&loop->pending_queue); QUEUE_INIT(&loop->watcher_queue); loop->closing_handles = NULL; uv__update_time(loop); uv__async_init(&loop->async_watcher); loop->signal_pipefd[0] = -1; loop->signal_pipefd[1] = -1; loop->backend_fd = -1; loop->emfile_fd = -1; loop->timer_counter = 0; loop->stop_flag = 0; err = uv__platform_loop_init(loop, default_loop); if (err) return err; uv_signal_init(loop, &loop->child_watcher); uv__handle_unref(&loop->child_watcher); loop->child_watcher.flags |= UV__HANDLE_INTERNAL; QUEUE_INIT(&loop->process_handles); if (uv_rwlock_init(&loop->cloexec_lock)) abort(); if (uv_mutex_init(&loop->wq_mutex)) abort(); if (uv_async_init(loop, &loop->wq_async, uv__work_done)) abort(); uv__handle_unref(&loop->wq_async); loop->wq_async.flags |= UV__HANDLE_INTERNAL; return 0; } static void uv__loop_close(uv_loop_t* loop) { uv__signal_loop_cleanup(loop); uv__platform_loop_delete(loop); uv__async_stop(loop, &loop->async_watcher); if (loop->emfile_fd != -1) { uv__close(loop->emfile_fd); loop->emfile_fd = -1; } if (loop->backend_fd != -1) { uv__close(loop->backend_fd); loop->backend_fd = -1; } uv_mutex_lock(&loop->wq_mutex); assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); assert(!uv__has_active_reqs(loop)); uv_mutex_unlock(&loop->wq_mutex); uv_mutex_destroy(&loop->wq_mutex); /* * Note that all thread pool stuff is finished at this point and * it is safe to just destroy rw lock */ uv_rwlock_destroy(&loop->cloexec_lock); #if 0 assert(QUEUE_EMPTY(&loop->pending_queue)); assert(QUEUE_EMPTY(&loop->watcher_queue)); assert(loop->nfds == 0); #endif free(loop->watchers); loop->watchers = NULL; loop->nwatchers = 0; } MoarVM-2015.11/3rdparty/libuv/src/unix/netbsd.c0000644000175000017500000002112112456307253020142 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) static char *process_title; int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } uint64_t uv__hrtime(uv_clocktype_t type) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec); } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, 2, &info, &size, NULL, 0) == -1) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_exepath(char* buffer, size_t* size) { int mib[4]; size_t cb; pid_t mypid; if (buffer == NULL || size == NULL) return -EINVAL; mypid = getpid(); mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = mypid; mib[3] = KERN_PROC_ARGV; cb = *size; if (sysctl(mib, 4, buffer, &cb, NULL, 0)) return -errno; *size = strlen(buffer); return 0; } uint64_t uv_get_free_memory(void) { struct uvmexp info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_UVMEXP}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info.free * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { #if defined(HW_PHYSMEM64) uint64_t info; int which[] = {CTL_HW, HW_PHYSMEM64}; #else unsigned int info; int which[] = {CTL_HW, HW_PHYSMEM}; #endif size_t size = sizeof(info); if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info; } char** uv_setup_args(int argc, char** argv) { process_title = argc ? strdup(argv[0]) : NULL; return argv; } int uv_set_process_title(const char* title) { if (process_title) free(process_title); process_title = strdup(title); setproctitle("%s", title); return 0; } int uv_get_process_title(char* buffer, size_t size) { if (process_title) { strncpy(buffer, process_title, size); } else { if (size > 0) { buffer[0] = '\0'; } } return 0; } int uv_resident_set_memory(size_t* rss) { kvm_t *kd = NULL; struct kinfo_proc2 *kinfo = NULL; pid_t pid; int nprocs; int max_size = sizeof(struct kinfo_proc2); int page_size; page_size = getpagesize(); pid = getpid(); kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, "kvm_open"); if (kd == NULL) goto error; kinfo = kvm_getproc2(kd, KERN_PROC_PID, pid, max_size, &nprocs); if (kinfo == NULL) goto error; *rss = kinfo->p_vm_rssize * page_size; kvm_close(kd); return 0; error: if (kd) kvm_close(kd); return -EPERM; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; now = time(NULL); *uptime = (double)(now - info.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK); unsigned int multiplier = ((uint64_t)1000L / ticks); unsigned int cur = 0; uv_cpu_info_t* cpu_info; u_int64_t* cp_times; char model[512]; u_int64_t cpuspeed; int numcpus; size_t size; int i; size = sizeof(model); if (sysctlbyname("machdep.cpu_brand", &model, &size, NULL, 0) && sysctlbyname("hw.model", &model, &size, NULL, 0)) { return -errno; } size = sizeof(numcpus); if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) return -errno; *count = numcpus; /* Only i386 and amd64 have machdep.tsc_freq */ size = sizeof(cpuspeed); if (sysctlbyname("machdep.tsc_freq", &cpuspeed, &size, NULL, 0)) cpuspeed = 0; size = numcpus * CPUSTATES * sizeof(*cp_times); cp_times = malloc(size); if (cp_times == NULL) return -ENOMEM; if (sysctlbyname("kern.cp_time", cp_times, &size, NULL, 0)) return -errno; *cpu_infos = malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) { free(cp_times); free(*cpu_infos); return -ENOMEM; } for (i = 0; i < numcpus; i++) { cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; cpu_info->model = strdup(model); cpu_info->speed = (int)(cpuspeed/(uint64_t) 1e6); cur += CPUSTATES; } free(cp_times); return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_dl *sa_addr; if (getifaddrs(&addrs)) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != PF_INET)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; if (ent->ifa_addr->sa_family != PF_INET) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != AF_LINK)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } MoarVM-2015.11/3rdparty/libuv/src/unix/openbsd.c0000644000175000017500000002147112456307253020325 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) static char *process_title; int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { return uv__kqueue_init(loop); } void uv__platform_loop_delete(uv_loop_t* loop) { } uint64_t uv__hrtime(uv_clocktype_t type) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec); } void uv_loadavg(double avg[3]) { struct loadavg info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_LOADAVG}; if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; avg[0] = (double) info.ldavg[0] / info.fscale; avg[1] = (double) info.ldavg[1] / info.fscale; avg[2] = (double) info.ldavg[2] / info.fscale; } int uv_exepath(char* buffer, size_t* size) { int mib[4]; char **argsbuf = NULL; char **argsbuf_tmp; size_t argsbuf_size = 100U; size_t exepath_size; pid_t mypid; int err; if (buffer == NULL || size == NULL) return -EINVAL; mypid = getpid(); for (;;) { err = -ENOMEM; argsbuf_tmp = realloc(argsbuf, argsbuf_size); if (argsbuf_tmp == NULL) goto out; argsbuf = argsbuf_tmp; mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = mypid; mib[3] = KERN_PROC_ARGV; if (sysctl(mib, 4, argsbuf, &argsbuf_size, NULL, 0) == 0) { break; } if (errno != ENOMEM) { err = -errno; goto out; } argsbuf_size *= 2U; } if (argsbuf[0] == NULL) { err = -EINVAL; /* FIXME(bnoordhuis) More appropriate error. */ goto out; } exepath_size = strlen(argsbuf[0]); if (exepath_size >= *size) { err = -EINVAL; goto out; } memcpy(buffer, argsbuf[0], exepath_size + 1U); *size = exepath_size; err = 0; out: free(argsbuf); return err; } uint64_t uv_get_free_memory(void) { struct uvmexp info; size_t size = sizeof(info); int which[] = {CTL_VM, VM_UVMEXP}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info.free * sysconf(_SC_PAGESIZE); } uint64_t uv_get_total_memory(void) { uint64_t info; int which[] = {CTL_HW, HW_PHYSMEM64}; size_t size = sizeof(info); if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; return (uint64_t) info; } char** uv_setup_args(int argc, char** argv) { process_title = argc ? strdup(argv[0]) : NULL; return argv; } int uv_set_process_title(const char* title) { if (process_title) free(process_title); process_title = strdup(title); setproctitle(title); return 0; } int uv_get_process_title(char* buffer, size_t size) { if (process_title) { strncpy(buffer, process_title, size); } else { if (size > 0) { buffer[0] = '\0'; } } return 0; } int uv_resident_set_memory(size_t* rss) { struct kinfo_proc kinfo; size_t page_size = getpagesize(); size_t size = sizeof(struct kinfo_proc); int mib[6]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); mib[4] = sizeof(struct kinfo_proc); mib[5] = 1; if (sysctl(mib, 6, &kinfo, &size, NULL, 0) < 0) return -errno; *rss = kinfo.p_vm_rssize * page_size; return 0; } int uv_uptime(double* uptime) { time_t now; struct timeval info; size_t size = sizeof(info); static int which[] = {CTL_KERN, KERN_BOOTTIME}; if (sysctl(which, 2, &info, &size, NULL, 0)) return -errno; now = time(NULL); *uptime = (double)(now - info.tv_sec); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), multiplier = ((uint64_t)1000L / ticks), cpuspeed; uint64_t info[CPUSTATES]; char model[512]; int numcpus = 1; int which[] = {CTL_HW,HW_MODEL,0}; size_t size; int i; uv_cpu_info_t* cpu_info; size = sizeof(model); if (sysctl(which, 2, &model, &size, NULL, 0)) return -errno; which[1] = HW_NCPU; size = sizeof(numcpus); if (sysctl(which, 2, &numcpus, &size, NULL, 0)) return -errno; *cpu_infos = malloc(numcpus * sizeof(**cpu_infos)); if (!(*cpu_infos)) return -ENOMEM; *count = numcpus; which[1] = HW_CPUSPEED; size = sizeof(cpuspeed); if (sysctl(which, 2, &cpuspeed, &size, NULL, 0)) { SAVE_ERRNO(free(*cpu_infos)); return -errno; } size = sizeof(info); which[0] = CTL_KERN; which[1] = KERN_CPTIME2; for (i = 0; i < numcpus; i++) { which[2] = i; size = sizeof(info); if (sysctl(which, 3, &info, &size, NULL, 0)) { SAVE_ERRNO(free(*cpu_infos)); return -errno; } cpu_info = &(*cpu_infos)[i]; cpu_info->cpu_times.user = (uint64_t)(info[CP_USER]) * multiplier; cpu_info->cpu_times.nice = (uint64_t)(info[CP_NICE]) * multiplier; cpu_info->cpu_times.sys = (uint64_t)(info[CP_SYS]) * multiplier; cpu_info->cpu_times.idle = (uint64_t)(info[CP_IDLE]) * multiplier; cpu_info->cpu_times.irq = (uint64_t)(info[CP_INTR]) * multiplier; cpu_info->model = strdup(model); cpu_info->speed = cpuspeed; } return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { struct ifaddrs *addrs, *ent; uv_interface_address_t* address; int i; struct sockaddr_dl *sa_addr; if (getifaddrs(&addrs) != 0) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != PF_INET)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; if (ent->ifa_addr->sa_family != PF_INET) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != AF_LINK)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } MoarVM-2015.11/3rdparty/libuv/src/unix/pipe.c0000644000175000017500000001534012456307253017626 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { uv__stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); handle->shutdown_req = NULL; handle->connect_req = NULL; handle->pipe_fname = NULL; handle->ipc = ipc; return 0; } int uv_pipe_bind(uv_pipe_t* handle, const char* name) { struct sockaddr_un saddr; const char* pipe_fname; int sockfd; int bound; int err; pipe_fname = NULL; sockfd = -1; bound = 0; err = -EINVAL; /* Already bound? */ if (uv__stream_fd(handle) >= 0) return -EINVAL; /* Make a copy of the file name, it outlives this function's scope. */ pipe_fname = strdup(name); if (pipe_fname == NULL) { err = -ENOMEM; goto out; } /* We've got a copy, don't touch the original any more. */ name = NULL; err = uv__socket(AF_UNIX, SOCK_STREAM, 0); if (err < 0) goto out; sockfd = err; memset(&saddr, 0, sizeof saddr); strncpy(saddr.sun_path, pipe_fname, sizeof(saddr.sun_path) - 1); saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0'; saddr.sun_family = AF_UNIX; if (bind(sockfd, (struct sockaddr*)&saddr, sizeof saddr)) { err = -errno; /* Convert ENOENT to EACCES for compatibility with Windows. */ if (err == -ENOENT) err = -EACCES; goto out; } bound = 1; /* Success. */ handle->pipe_fname = pipe_fname; /* Is a strdup'ed copy. */ handle->io_watcher.fd = sockfd; return 0; out: if (bound) { /* unlink() before uv__close() to avoid races. */ assert(pipe_fname != NULL); unlink(pipe_fname); } uv__close(sockfd); free((void*)pipe_fname); return err; } int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { if (uv__stream_fd(handle) == -1) return -EINVAL; if (listen(uv__stream_fd(handle), backlog)) return -errno; handle->connection_cb = cb; handle->io_watcher.cb = uv__server_io; uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN); return 0; } void uv__pipe_close(uv_pipe_t* handle) { if (handle->pipe_fname) { /* * Unlink the file system entity before closing the file descriptor. * Doing it the other way around introduces a race where our process * unlinks a socket with the same name that's just been created by * another thread or process. */ unlink(handle->pipe_fname); free((void*)handle->pipe_fname); handle->pipe_fname = NULL; } uv__stream_close((uv_stream_t*)handle); } int uv_pipe_open(uv_pipe_t* handle, uv_file fd) { #if defined(__APPLE__) int err; err = uv__stream_try_select((uv_stream_t*) handle, &fd); if (err) return err; #endif /* defined(__APPLE__) */ return uv__stream_open((uv_stream_t*)handle, fd, UV_STREAM_READABLE | UV_STREAM_WRITABLE); } void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) { struct sockaddr_un saddr; int new_sock; int err; int r; new_sock = (uv__stream_fd(handle) == -1); err = -EINVAL; if (new_sock) { err = uv__socket(AF_UNIX, SOCK_STREAM, 0); if (err < 0) goto out; handle->io_watcher.fd = err; } memset(&saddr, 0, sizeof saddr); strncpy(saddr.sun_path, name, sizeof(saddr.sun_path) - 1); saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0'; saddr.sun_family = AF_UNIX; do { r = connect(uv__stream_fd(handle), (struct sockaddr*)&saddr, sizeof saddr); } while (r == -1 && errno == EINTR); if (r == -1 && errno != EINPROGRESS) { err = -errno; goto out; } err = 0; if (new_sock) { err = uv__stream_open((uv_stream_t*)handle, uv__stream_fd(handle), UV_STREAM_READABLE | UV_STREAM_WRITABLE); } if (err == 0) uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN | UV__POLLOUT); out: handle->delayed_error = err; handle->connect_req = req; uv__req_init(handle->loop, req, UV_CONNECT); req->handle = (uv_stream_t*)handle; req->cb = cb; QUEUE_INIT(&req->queue); /* Force callback to run on next tick in case of error. */ if (err) uv__io_feed(handle->loop, &handle->io_watcher); /* Mimic the Windows pipe implementation, always * return 0 and let the callback handle errors. */ } int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { struct sockaddr_un sa; socklen_t addrlen; int err; addrlen = sizeof(sa); memset(&sa, 0, addrlen); err = getsockname(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen); if (err < 0) { *len = 0; return -errno; } if (sa.sun_path[0] == 0) /* Linux abstract namespace */ addrlen -= offsetof(struct sockaddr_un, sun_path); else addrlen = strlen(sa.sun_path) + 1; if (addrlen > *len) { *len = addrlen; return UV_ENOBUFS; } memcpy(buf, sa.sun_path, addrlen); *len = addrlen; return 0; } void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { } int uv_pipe_pending_count(uv_pipe_t* handle) { uv__stream_queued_fds_t* queued_fds; if (!handle->ipc) return 0; if (handle->accepted_fd == -1) return 0; if (handle->queued_fds == NULL) return 1; queued_fds = handle->queued_fds; return queued_fds->offset + 1; } uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { if (!handle->ipc) return UV_UNKNOWN_HANDLE; if (handle->accepted_fd == -1) return UV_UNKNOWN_HANDLE; else return uv__handle_type(handle->accepted_fd); } MoarVM-2015.11/3rdparty/libuv/src/unix/poll.c0000644000175000017500000000565312456307253017645 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_poll_t* handle; int pevents; handle = container_of(w, uv_poll_t, io_watcher); if (events & UV__POLLERR) { uv__io_stop(loop, w, UV__POLLIN | UV__POLLOUT); uv__handle_stop(handle); handle->poll_cb(handle, -EBADF, 0); return; } pevents = 0; if (events & UV__POLLIN) pevents |= UV_READABLE; if (events & UV__POLLOUT) pevents |= UV_WRITABLE; handle->poll_cb(handle, 0, pevents); } int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); uv__io_init(&handle->io_watcher, uv__poll_io, fd); handle->poll_cb = NULL; return 0; } int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) { return uv_poll_init(loop, handle, socket); } static void uv__poll_stop(uv_poll_t* handle) { uv__io_stop(handle->loop, &handle->io_watcher, UV__POLLIN | UV__POLLOUT); uv__handle_stop(handle); } int uv_poll_stop(uv_poll_t* handle) { assert(!(handle->flags & (UV_CLOSING | UV_CLOSED))); uv__poll_stop(handle); return 0; } int uv_poll_start(uv_poll_t* handle, int pevents, uv_poll_cb poll_cb) { int events; assert((pevents & ~(UV_READABLE | UV_WRITABLE)) == 0); assert(!(handle->flags & (UV_CLOSING | UV_CLOSED))); uv__poll_stop(handle); if (pevents == 0) return 0; events = 0; if (pevents & UV_READABLE) events |= UV__POLLIN; if (pevents & UV_WRITABLE) events |= UV__POLLOUT; uv__io_start(handle->loop, &handle->io_watcher, events); uv__handle_start(handle); handle->poll_cb = poll_cb; return 0; } void uv__poll_close(uv_poll_t* handle) { uv__poll_stop(handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/process.c0000644000175000017500000003005212502366750020343 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #if defined(__APPLE__) && !TARGET_OS_IPHONE # include # define environ (*_NSGetEnviron()) #else extern char **environ; #endif #ifdef __linux__ # include #endif static void uv__chld(uv_signal_t* handle, int signum) { uv_process_t* process; uv_loop_t* loop; int exit_status; int term_signal; int status; pid_t pid; QUEUE pending; QUEUE* q; QUEUE* h; assert(signum == SIGCHLD); QUEUE_INIT(&pending); loop = handle->loop; h = &loop->process_handles; q = QUEUE_HEAD(h); while (q != h) { process = QUEUE_DATA(q, uv_process_t, queue); q = QUEUE_NEXT(q); do pid = waitpid(process->pid, &status, WNOHANG); while (pid == -1 && errno == EINTR); if (pid == 0) continue; if (pid == -1) { if (errno != ECHILD) abort(); continue; } process->status = status; QUEUE_REMOVE(&process->queue); QUEUE_INSERT_TAIL(&pending, &process->queue); } QUEUE_FOREACH(q, &pending) { process = QUEUE_DATA(q, uv_process_t, queue); QUEUE_REMOVE(q); uv__handle_stop(process); if (process->exit_cb == NULL) continue; exit_status = 0; if (WIFEXITED(process->status)) exit_status = WEXITSTATUS(process->status); term_signal = 0; if (WIFSIGNALED(process->status)) term_signal = WTERMSIG(process->status); process->exit_cb(process, exit_status, term_signal); } assert(QUEUE_EMPTY(&pending)); } int uv__make_socketpair(int fds[2], int flags) { #if defined(__linux__) static int no_cloexec; if (no_cloexec) goto skip; if (socketpair(AF_UNIX, SOCK_STREAM | UV__SOCK_CLOEXEC | flags, 0, fds) == 0) return 0; /* Retry on EINVAL, it means SOCK_CLOEXEC is not supported. * Anything else is a genuine error. */ if (errno != EINVAL) return -errno; no_cloexec = 1; skip: #endif if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) return -errno; uv__cloexec(fds[0], 1); uv__cloexec(fds[1], 1); if (flags & UV__F_NONBLOCK) { uv__nonblock(fds[0], 1); uv__nonblock(fds[1], 1); } return 0; } int uv__make_pipe(int fds[2], int flags) { #if defined(__linux__) static int no_pipe2; if (no_pipe2) goto skip; if (uv__pipe2(fds, flags | UV__O_CLOEXEC) == 0) return 0; if (errno != ENOSYS) return -errno; no_pipe2 = 1; skip: #endif if (pipe(fds)) return -errno; uv__cloexec(fds[0], 1); uv__cloexec(fds[1], 1); if (flags & UV__F_NONBLOCK) { uv__nonblock(fds[0], 1); uv__nonblock(fds[1], 1); } return 0; } /* * Used for initializing stdio streams like options.stdin_stream. Returns * zero on success. See also the cleanup section in uv_spawn(). */ static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2]) { int mask; int fd; mask = UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM; switch (container->flags & mask) { case UV_IGNORE: return 0; case UV_CREATE_PIPE: assert(container->data.stream != NULL); if (container->data.stream->type != UV_NAMED_PIPE) return -EINVAL; else return uv__make_socketpair(fds, 0); case UV_INHERIT_FD: case UV_INHERIT_STREAM: if (container->flags & UV_INHERIT_FD) fd = container->data.fd; else fd = uv__stream_fd(container->data.stream); if (fd == -1) return -EINVAL; fds[1] = fd; return 0; default: assert(0 && "Unexpected flags"); return -EINVAL; } } static int uv__process_open_stream(uv_stdio_container_t* container, int pipefds[2], int writable) { int flags; if (!(container->flags & UV_CREATE_PIPE) || pipefds[0] < 0) return 0; if (uv__close(pipefds[1])) if (errno != EINTR && errno != EINPROGRESS) abort(); pipefds[1] = -1; uv__nonblock(pipefds[0], 1); if (container->data.stream->type == UV_NAMED_PIPE && ((uv_pipe_t*)container->data.stream)->ipc) flags = UV_STREAM_READABLE | UV_STREAM_WRITABLE; else if (writable) flags = UV_STREAM_WRITABLE; else flags = UV_STREAM_READABLE; return uv__stream_open(container->data.stream, pipefds[0], flags); } static void uv__process_close_stream(uv_stdio_container_t* container) { if (!(container->flags & UV_CREATE_PIPE)) return; uv__stream_close((uv_stream_t*)container->data.stream); } static void uv__write_int(int fd, int val) { ssize_t n; do n = write(fd, &val, sizeof(val)); while (n == -1 && errno == EINTR); if (n == -1 && errno == EPIPE) return; /* parent process has quit */ assert(n == sizeof(val)); } static void uv__process_child_init(const uv_process_options_t* options, int stdio_count, int (*pipes)[2], int error_fd) { int close_fd; int use_fd; int fd; if (options->flags & UV_PROCESS_DETACHED) setsid(); for (fd = 0; fd < stdio_count; fd++) { close_fd = pipes[fd][0]; use_fd = pipes[fd][1]; if (use_fd < 0) { if (fd >= 3) continue; else { /* redirect stdin, stdout and stderr to /dev/null even if UV_IGNORE is * set */ use_fd = open("/dev/null", fd == 0 ? O_RDONLY : O_RDWR); close_fd = use_fd; if (use_fd == -1) { uv__write_int(error_fd, -errno); _exit(127); } } } if (fd == use_fd) uv__cloexec(use_fd, 0); else dup2(use_fd, fd); if (fd <= 2) uv__nonblock(fd, 0); if (close_fd >= stdio_count) uv__close(close_fd); } for (fd = 0; fd < stdio_count; fd++) { use_fd = pipes[fd][1]; if (use_fd >= 0 && fd != use_fd) close(use_fd); } if (options->cwd != NULL && chdir(options->cwd)) { uv__write_int(error_fd, -errno); _exit(127); } if (options->flags & (UV_PROCESS_SETUID | UV_PROCESS_SETGID)) { /* When dropping privileges from root, the `setgroups` call will * remove any extraneous groups. If we don't call this, then * even though our uid has dropped, we may still have groups * that enable us to do super-user things. This will fail if we * aren't root, so don't bother checking the return value, this * is just done as an optimistic privilege dropping function. */ SAVE_ERRNO(setgroups(0, NULL)); } if ((options->flags & UV_PROCESS_SETGID) && setgid(options->gid)) { uv__write_int(error_fd, -errno); _exit(127); } if ((options->flags & UV_PROCESS_SETUID) && setuid(options->uid)) { uv__write_int(error_fd, -errno); _exit(127); } if (options->env != NULL) { environ = options->env; } execvp(options->file, options->args); uv__write_int(error_fd, -errno); _exit(127); } int uv_spawn(uv_loop_t* loop, uv_process_t* process, const uv_process_options_t* options) { int signal_pipe[2] = { -1, -1 }; int (*pipes)[2]; int stdio_count; ssize_t r; pid_t pid; int err; int exec_errorno; int i; assert(options->file != NULL); assert(!(options->flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | UV_PROCESS_SETUID | UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); QUEUE_INIT(&process->queue); stdio_count = options->stdio_count; if (stdio_count < 3) stdio_count = 3; err = -ENOMEM; pipes = malloc(stdio_count * sizeof(*pipes)); if (pipes == NULL) goto error; for (i = 0; i < stdio_count; i++) { pipes[i][0] = -1; pipes[i][1] = -1; } for (i = 0; i < options->stdio_count; i++) { err = uv__process_init_stdio(options->stdio + i, pipes[i]); if (err) goto error; } /* This pipe is used by the parent to wait until * the child has called `execve()`. We need this * to avoid the following race condition: * * if ((pid = fork()) > 0) { * kill(pid, SIGTERM); * } * else if (pid == 0) { * execve("/bin/cat", argp, envp); * } * * The parent sends a signal immediately after forking. * Since the child may not have called `execve()` yet, * there is no telling what process receives the signal, * our fork or /bin/cat. * * To avoid ambiguity, we create a pipe with both ends * marked close-on-exec. Then, after the call to `fork()`, * the parent polls the read end until it EOFs or errors with EPIPE. */ err = uv__make_pipe(signal_pipe, 0); if (err) goto error; uv_signal_start(&loop->child_watcher, uv__chld, SIGCHLD); /* Acquire write lock to prevent opening new fds in worker threads */ uv_rwlock_wrlock(&loop->cloexec_lock); pid = fork(); if (pid == -1) { err = -errno; uv_rwlock_wrunlock(&loop->cloexec_lock); uv__close(signal_pipe[0]); uv__close(signal_pipe[1]); goto error; } if (pid == 0) { uv__process_child_init(options, stdio_count, pipes, signal_pipe[1]); abort(); } /* Release lock in parent process */ uv_rwlock_wrunlock(&loop->cloexec_lock); uv__close(signal_pipe[1]); process->status = 0; exec_errorno = 0; do r = read(signal_pipe[0], &exec_errorno, sizeof(exec_errorno)); while (r == -1 && errno == EINTR); if (r == 0) ; /* okay, EOF */ else if (r == sizeof(exec_errorno)) ; /* okay, read errorno */ else if (r == -1 && errno == EPIPE) ; /* okay, got EPIPE */ else abort(); uv__close(signal_pipe[0]); for (i = 0; i < options->stdio_count; i++) { err = uv__process_open_stream(options->stdio + i, pipes[i], i == 0); if (err == 0) continue; while (i--) uv__process_close_stream(options->stdio + i); goto error; } /* Only activate this handle if exec() happened successfully */ if (exec_errorno == 0) { QUEUE_INSERT_TAIL(&loop->process_handles, &process->queue); uv__handle_start(process); } process->pid = pid; process->exit_cb = options->exit_cb; free(pipes); return exec_errorno; error: if (pipes != NULL) { for (i = 0; i < stdio_count; i++) { if (i < options->stdio_count) if (options->stdio[i].flags & (UV_INHERIT_FD | UV_INHERIT_STREAM)) continue; if (pipes[i][0] != -1) close(pipes[i][0]); if (pipes[i][1] != -1) close(pipes[i][1]); } free(pipes); } return err; } int uv_process_kill(uv_process_t* process, int signum) { return uv_kill(process->pid, signum); } int uv_kill(int pid, int signum) { if (kill(pid, signum)) return -errno; else return 0; } void uv__process_close(uv_process_t* handle) { QUEUE_REMOVE(&handle->queue); uv__handle_stop(handle); if (QUEUE_EMPTY(&handle->loop->process_handles)) uv_signal_stop(&handle->loop->child_watcher); } MoarVM-2015.11/3rdparty/libuv/src/unix/proctitle.c0000644000175000017500000000542612456307253020702 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include extern void uv__set_process_title(const char* title); static void* args_mem; static struct { char* str; size_t len; } process_title; char** uv_setup_args(int argc, char** argv) { char** new_argv; size_t size; char* s; int i; if (argc <= 0) return argv; /* Calculate how much memory we need for the argv strings. */ size = 0; for (i = 0; i < argc; i++) size += strlen(argv[i]) + 1; process_title.str = argv[0]; process_title.len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[0]; assert(process_title.len + 1 == size); /* argv memory should be adjacent. */ /* Add space for the argv pointers. */ size += (argc + 1) * sizeof(char*); new_argv = malloc(size); if (new_argv == NULL) return argv; args_mem = new_argv; /* Copy over the strings and set up the pointer table. */ s = (char*) &new_argv[argc + 1]; for (i = 0; i < argc; i++) { size = strlen(argv[i]) + 1; memcpy(s, argv[i], size); new_argv[i] = s; s += size; } new_argv[i] = NULL; return new_argv; } int uv_set_process_title(const char* title) { if (process_title.len == 0) return 0; /* No need to terminate, byte after is always '\0'. */ strncpy(process_title.str, title, process_title.len); uv__set_process_title(title); return 0; } int uv_get_process_title(char* buffer, size_t size) { if (process_title.len > 0) strncpy(buffer, process_title.str, size); else if (size > 0) buffer[0] = '\0'; return 0; } UV_DESTRUCTOR(static void free_args_mem(void)) { free(args_mem); /* Keep valgrind happy. */ args_mem = NULL; } MoarVM-2015.11/3rdparty/libuv/src/unix/pthread-fixes.c0000644000175000017500000000712312456307253021434 0ustar jnthnjnthn/* Copyright (c) 2013, Sony Mobile Communications AB * Copyright (c) 2012, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Android versions < 4.1 have a broken pthread_sigmask. * Note that this block of code must come before any inclusion of * pthread-fixes.h so that the real pthread_sigmask can be referenced. * */ #include #include int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset) { static int workaround; if (workaround) { return sigprocmask(how, set, oset); } else if (pthread_sigmask(how, set, oset)) { if (errno == EINVAL && sigprocmask(how, set, oset) == 0) { workaround = 1; return 0; } else { return -1; } } else { return 0; } } /*Android doesn't provide pthread_barrier_t for now.*/ #ifndef PTHREAD_BARRIER_SERIAL_THREAD #include "pthread-fixes.h" int pthread_barrier_init(pthread_barrier_t* barrier, const void* barrier_attr, unsigned count) { barrier->count = count; pthread_mutex_init(&barrier->mutex, NULL); pthread_cond_init(&barrier->cond, NULL); return 0; } int pthread_barrier_wait(pthread_barrier_t* barrier) { /* Lock the mutex*/ pthread_mutex_lock(&barrier->mutex); /* Decrement the count. If this is the first thread to reach 0, wake up waiters, unlock the mutex, then return PTHREAD_BARRIER_SERIAL_THREAD.*/ if (--barrier->count == 0) { /* First thread to reach the barrier */ pthread_cond_broadcast(&barrier->cond); pthread_mutex_unlock(&barrier->mutex); return PTHREAD_BARRIER_SERIAL_THREAD; } /* Otherwise, wait for other threads until the count reaches 0, then return 0 to indicate this is not the first thread.*/ do { pthread_cond_wait(&barrier->cond, &barrier->mutex); } while (barrier->count > 0); pthread_mutex_unlock(&barrier->mutex); return 0; } int pthread_barrier_destroy(pthread_barrier_t *barrier) { barrier->count = 0; pthread_cond_destroy(&barrier->cond); pthread_mutex_destroy(&barrier->mutex); return 0; } #endif /* defined(PTHREAD_BARRIER_SERIAL_THREAD) */ int pthread_yield(void) { sched_yield(); return 0; } MoarVM-2015.11/3rdparty/libuv/src/unix/signal.c0000644000175000017500000002752312456307253020154 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include typedef struct { uv_signal_t* handle; int signum; } uv__signal_msg_t; RB_HEAD(uv__signal_tree_s, uv_signal_s); static int uv__signal_unlock(void); static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events); static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2); static void uv__signal_stop(uv_signal_t* handle); static pthread_once_t uv__signal_global_init_guard = PTHREAD_ONCE_INIT; static struct uv__signal_tree_s uv__signal_tree = RB_INITIALIZER(uv__signal_tree); static int uv__signal_lock_pipefd[2]; RB_GENERATE_STATIC(uv__signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare) static void uv__signal_global_init(void) { if (uv__make_pipe(uv__signal_lock_pipefd, 0)) abort(); if (uv__signal_unlock()) abort(); } void uv__signal_global_once_init(void) { pthread_once(&uv__signal_global_init_guard, uv__signal_global_init); } static int uv__signal_lock(void) { int r; char data; do { r = read(uv__signal_lock_pipefd[0], &data, sizeof data); } while (r < 0 && errno == EINTR); return (r < 0) ? -1 : 0; } static int uv__signal_unlock(void) { int r; char data = 42; do { r = write(uv__signal_lock_pipefd[1], &data, sizeof data); } while (r < 0 && errno == EINTR); return (r < 0) ? -1 : 0; } static void uv__signal_block_and_lock(sigset_t* saved_sigmask) { sigset_t new_mask; if (sigfillset(&new_mask)) abort(); if (pthread_sigmask(SIG_SETMASK, &new_mask, saved_sigmask)) abort(); if (uv__signal_lock()) abort(); } static void uv__signal_unlock_and_unblock(sigset_t* saved_sigmask) { if (uv__signal_unlock()) abort(); if (pthread_sigmask(SIG_SETMASK, saved_sigmask, NULL)) abort(); } static uv_signal_t* uv__signal_first_handle(int signum) { /* This function must be called with the signal lock held. */ uv_signal_t lookup; uv_signal_t* handle; lookup.signum = signum; lookup.loop = NULL; handle = RB_NFIND(uv__signal_tree_s, &uv__signal_tree, &lookup); if (handle != NULL && handle->signum == signum) return handle; return NULL; } static void uv__signal_handler(int signum) { uv__signal_msg_t msg; uv_signal_t* handle; int saved_errno; saved_errno = errno; memset(&msg, 0, sizeof msg); if (uv__signal_lock()) { errno = saved_errno; return; } for (handle = uv__signal_first_handle(signum); handle != NULL && handle->signum == signum; handle = RB_NEXT(uv__signal_tree_s, &uv__signal_tree, handle)) { int r; msg.signum = signum; msg.handle = handle; /* write() should be atomic for small data chunks, so the entire message * should be written at once. In theory the pipe could become full, in * which case the user is out of luck. */ do { r = write(handle->loop->signal_pipefd[1], &msg, sizeof msg); } while (r == -1 && errno == EINTR); assert(r == sizeof msg || (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))); if (r != -1) handle->caught_signals++; } uv__signal_unlock(); errno = saved_errno; } static int uv__signal_register_handler(int signum) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; /* XXX use a separate signal stack? */ memset(&sa, 0, sizeof(sa)); if (sigfillset(&sa.sa_mask)) abort(); sa.sa_handler = uv__signal_handler; /* XXX save old action so we can restore it later on? */ if (sigaction(signum, &sa, NULL)) return -errno; return 0; } static void uv__signal_unregister_handler(int signum) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; /* sigaction can only fail with EINVAL or EFAULT; an attempt to deregister a * signal implies that it was successfully registered earlier, so EINVAL * should never happen. */ if (sigaction(signum, &sa, NULL)) abort(); } static int uv__signal_loop_once_init(uv_loop_t* loop) { int err; /* Return if already initialized. */ if (loop->signal_pipefd[0] != -1) return 0; err = uv__make_pipe(loop->signal_pipefd, UV__F_NONBLOCK); if (err) return err; uv__io_init(&loop->signal_io_watcher, uv__signal_event, loop->signal_pipefd[0]); uv__io_start(loop, &loop->signal_io_watcher, UV__POLLIN); return 0; } void uv__signal_loop_cleanup(uv_loop_t* loop) { QUEUE* q; /* Stop all the signal watchers that are still attached to this loop. This * ensures that the (shared) signal tree doesn't contain any invalid entries * entries, and that signal handlers are removed when appropriate. */ QUEUE_FOREACH(q, &loop->handle_queue) { uv_handle_t* handle = QUEUE_DATA(q, uv_handle_t, handle_queue); if (handle->type == UV_SIGNAL) uv__signal_stop((uv_signal_t*) handle); } if (loop->signal_pipefd[0] != -1) { uv__close(loop->signal_pipefd[0]); loop->signal_pipefd[0] = -1; } if (loop->signal_pipefd[1] != -1) { uv__close(loop->signal_pipefd[1]); loop->signal_pipefd[1] = -1; } } int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { int err; err = uv__signal_loop_once_init(loop); if (err) return err; uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); handle->signum = 0; handle->caught_signals = 0; handle->dispatched_signals = 0; return 0; } void uv__signal_close(uv_signal_t* handle) { uv__signal_stop(handle); /* If there are any caught signals "trapped" in the signal pipe, we can't * call the close callback yet. Otherwise, add the handle to the finish_close * queue. */ if (handle->caught_signals == handle->dispatched_signals) { uv__make_close_pending((uv_handle_t*) handle); } } int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { sigset_t saved_sigmask; int err; assert(!(handle->flags & (UV_CLOSING | UV_CLOSED))); /* If the user supplies signum == 0, then return an error already. If the * signum is otherwise invalid then uv__signal_register will find out * eventually. */ if (signum == 0) return -EINVAL; /* Short circuit: if the signal watcher is already watching {signum} don't * go through the process of deregistering and registering the handler. * Additionally, this avoids pending signals getting lost in the small time * time frame that handle->signum == 0. */ if (signum == handle->signum) { handle->signal_cb = signal_cb; return 0; } /* If the signal handler was already active, stop it first. */ if (handle->signum != 0) { uv__signal_stop(handle); } uv__signal_block_and_lock(&saved_sigmask); /* If at this point there are no active signal watchers for this signum (in * any of the loops), it's time to try and register a handler for it here. */ if (uv__signal_first_handle(signum) == NULL) { err = uv__signal_register_handler(signum); if (err) { /* Registering the signal handler failed. Must be an invalid signal. */ uv__signal_unlock_and_unblock(&saved_sigmask); return err; } } handle->signum = signum; RB_INSERT(uv__signal_tree_s, &uv__signal_tree, handle); uv__signal_unlock_and_unblock(&saved_sigmask); handle->signal_cb = signal_cb; uv__handle_start(handle); return 0; } static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv__signal_msg_t* msg; uv_signal_t* handle; char buf[sizeof(uv__signal_msg_t) * 32]; size_t bytes, end, i; int r; bytes = 0; end = 0; do { r = read(loop->signal_pipefd[0], buf + bytes, sizeof(buf) - bytes); if (r == -1 && errno == EINTR) continue; if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { /* If there are bytes in the buffer already (which really is extremely * unlikely if possible at all) we can't exit the function here. We'll * spin until more bytes are read instead. */ if (bytes > 0) continue; /* Otherwise, there was nothing there. */ return; } /* Other errors really should never happen. */ if (r == -1) abort(); bytes += r; /* `end` is rounded down to a multiple of sizeof(uv__signal_msg_t). */ end = (bytes / sizeof(uv__signal_msg_t)) * sizeof(uv__signal_msg_t); for (i = 0; i < end; i += sizeof(uv__signal_msg_t)) { msg = (uv__signal_msg_t*) (buf + i); handle = msg->handle; if (msg->signum == handle->signum) { assert(!(handle->flags & UV_CLOSING)); handle->signal_cb(handle, handle->signum); } handle->dispatched_signals++; /* If uv_close was called while there were caught signals that were not * yet dispatched, the uv__finish_close was deferred. Make close pending * now if this has happened. */ if ((handle->flags & UV_CLOSING) && (handle->caught_signals == handle->dispatched_signals)) { uv__make_close_pending((uv_handle_t*) handle); } } bytes -= end; /* If there are any "partial" messages left, move them to the start of the * the buffer, and spin. This should not happen. */ if (bytes) { memmove(buf, buf + end, bytes); continue; } } while (end == sizeof buf); } static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { /* Compare signums first so all watchers with the same signnum end up * adjacent. */ if (w1->signum < w2->signum) return -1; if (w1->signum > w2->signum) return 1; /* Sort by loop pointer, so we can easily look up the first item after * { .signum = x, .loop = NULL }. */ if (w1->loop < w2->loop) return -1; if (w1->loop > w2->loop) return 1; if (w1 < w2) return -1; if (w1 > w2) return 1; return 0; } int uv_signal_stop(uv_signal_t* handle) { assert(!(handle->flags & (UV_CLOSING | UV_CLOSED))); uv__signal_stop(handle); return 0; } static void uv__signal_stop(uv_signal_t* handle) { uv_signal_t* removed_handle; sigset_t saved_sigmask; /* If the watcher wasn't started, this is a no-op. */ if (handle->signum == 0) return; uv__signal_block_and_lock(&saved_sigmask); removed_handle = RB_REMOVE(uv__signal_tree_s, &uv__signal_tree, handle); assert(removed_handle == handle); (void) removed_handle; /* Check if there are other active signal watchers observing this signal. If * not, unregister the signal handler. */ if (uv__signal_first_handle(handle->signum) == NULL) uv__signal_unregister_handler(handle->signum); uv__signal_unlock_and_unblock(&saved_sigmask); handle->signum = 0; uv__handle_stop(handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/spinlock.h0000644000175000017500000000365012456307253020521 0ustar jnthnjnthn/* Copyright (c) 2013, Ben Noordhuis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef UV_SPINLOCK_H_ #define UV_SPINLOCK_H_ #include "internal.h" /* ACCESS_ONCE, UV_UNUSED */ #include "atomic-ops.h" #define UV_SPINLOCK_INITIALIZER { 0 } typedef struct { int lock; } uv_spinlock_t; UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)); UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)); UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)) { ACCESS_ONCE(int, spinlock->lock) = 0; } UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)) { while (!uv_spinlock_trylock(spinlock)) cpu_relax(); } UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)) { ACCESS_ONCE(int, spinlock->lock) = 0; } UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)) { /* TODO(bnoordhuis) Maybe change to a ticket lock to guarantee fair queueing. * Not really critical until we have locks that are (frequently) contended * for by several threads. */ return 0 == cmpxchgi(&spinlock->lock, 0, 1); } #endif /* UV_SPINLOCK_H_ */ MoarVM-2015.11/3rdparty/libuv/src/unix/stream.c0000644000175000017500000011764512502366750020176 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #include #include #include #include /* IOV_MAX */ #if defined(__APPLE__) # include # include # include /* Forward declaration */ typedef struct uv__stream_select_s uv__stream_select_t; struct uv__stream_select_s { uv_stream_t* stream; uv_thread_t thread; uv_sem_t close_sem; uv_sem_t async_sem; uv_async_t async; int events; int fake_fd; int int_fd; int fd; fd_set* sread; size_t sread_sz; fd_set* swrite; size_t swrite_sz; }; #endif /* defined(__APPLE__) */ static void uv__stream_connect(uv_stream_t*); static void uv__write(uv_stream_t* stream); static void uv__read(uv_stream_t* stream); static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); static void uv__write_callbacks(uv_stream_t* stream); static size_t uv__write_req_size(uv_write_t* req); void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream, uv_handle_type type) { int err; uv__handle_init(loop, (uv_handle_t*)stream, type); stream->read_cb = NULL; stream->alloc_cb = NULL; stream->close_cb = NULL; stream->connection_cb = NULL; stream->connect_req = NULL; stream->shutdown_req = NULL; stream->accepted_fd = -1; stream->queued_fds = NULL; stream->delayed_error = 0; QUEUE_INIT(&stream->write_queue); QUEUE_INIT(&stream->write_completed_queue); stream->write_queue_size = 0; if (loop->emfile_fd == -1) { err = uv__open_cloexec("/", O_RDONLY); if (err >= 0) loop->emfile_fd = err; } #if defined(__APPLE__) stream->select = NULL; #endif /* defined(__APPLE_) */ uv__io_init(&stream->io_watcher, uv__stream_io, -1); } static void uv__stream_osx_interrupt_select(uv_stream_t* stream) { #if defined(__APPLE__) /* Notify select() thread about state change */ uv__stream_select_t* s; int r; s = stream->select; if (s == NULL) return; /* Interrupt select() loop * NOTE: fake_fd and int_fd are socketpair(), thus writing to one will * emit read event on other side */ do r = write(s->fake_fd, "x", 1); while (r == -1 && errno == EINTR); assert(r == 1); #else /* !defined(__APPLE__) */ /* No-op on any other platform */ #endif /* !defined(__APPLE__) */ } #if defined(__APPLE__) static void uv__stream_osx_select(void* arg) { uv_stream_t* stream; uv__stream_select_t* s; char buf[1024]; int events; int fd; int r; int max_fd; stream = arg; s = stream->select; fd = s->fd; if (fd > s->int_fd) max_fd = fd; else max_fd = s->int_fd; while (1) { /* Terminate on semaphore */ if (uv_sem_trywait(&s->close_sem) == 0) break; /* Watch fd using select(2) */ memset(s->sread, 0, s->sread_sz); memset(s->swrite, 0, s->swrite_sz); if (uv__io_active(&stream->io_watcher, UV__POLLIN)) FD_SET(fd, s->sread); if (uv__io_active(&stream->io_watcher, UV__POLLOUT)) FD_SET(fd, s->swrite); FD_SET(s->int_fd, s->sread); /* Wait indefinitely for fd events */ r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL); if (r == -1) { if (errno == EINTR) continue; /* XXX: Possible?! */ abort(); } /* Ignore timeouts */ if (r == 0) continue; /* Empty socketpair's buffer in case of interruption */ if (FD_ISSET(s->int_fd, s->sread)) while (1) { r = read(s->int_fd, buf, sizeof(buf)); if (r == sizeof(buf)) continue; if (r != -1) break; if (errno == EAGAIN || errno == EWOULDBLOCK) break; if (errno == EINTR) continue; abort(); } /* Handle events */ events = 0; if (FD_ISSET(fd, s->sread)) events |= UV__POLLIN; if (FD_ISSET(fd, s->swrite)) events |= UV__POLLOUT; assert(events != 0 || FD_ISSET(s->int_fd, s->sread)); if (events != 0) { ACCESS_ONCE(int, s->events) = events; uv_async_send(&s->async); uv_sem_wait(&s->async_sem); /* Should be processed at this stage */ assert((s->events == 0) || (stream->flags & UV_CLOSING)); } } } static void uv__stream_osx_select_cb(uv_async_t* handle) { uv__stream_select_t* s; uv_stream_t* stream; int events; s = container_of(handle, uv__stream_select_t, async); stream = s->stream; /* Get and reset stream's events */ events = s->events; ACCESS_ONCE(int, s->events) = 0; uv_sem_post(&s->async_sem); assert(events != 0); assert(events == (events & (UV__POLLIN | UV__POLLOUT))); /* Invoke callback on event-loop */ if ((events & UV__POLLIN) && uv__io_active(&stream->io_watcher, UV__POLLIN)) uv__stream_io(stream->loop, &stream->io_watcher, UV__POLLIN); if ((events & UV__POLLOUT) && uv__io_active(&stream->io_watcher, UV__POLLOUT)) uv__stream_io(stream->loop, &stream->io_watcher, UV__POLLOUT); } static void uv__stream_osx_cb_close(uv_handle_t* async) { uv__stream_select_t* s; s = container_of(async, uv__stream_select_t, async); free(s); } int uv__stream_try_select(uv_stream_t* stream, int* fd) { /* * kqueue doesn't work with some files from /dev mount on osx. * select(2) in separate thread for those fds */ struct kevent filter[1]; struct kevent events[1]; struct timespec timeout; uv__stream_select_t* s; int fds[2]; int err; int ret; int kq; int old_fd; int max_fd; size_t sread_sz; size_t swrite_sz; kq = kqueue(); if (kq == -1) { perror("(libuv) kqueue()"); return -errno; } EV_SET(&filter[0], *fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); /* Use small timeout, because we only want to capture EINVALs */ timeout.tv_sec = 0; timeout.tv_nsec = 1; ret = kevent(kq, filter, 1, events, 1, &timeout); uv__close(kq); if (ret == -1) return -errno; if (ret == 0 || (events[0].flags & EV_ERROR) == 0 || events[0].data != EINVAL) return 0; /* At this point we definitely know that this fd won't work with kqueue */ /* * Create fds for io watcher and to interrupt the select() loop. * NOTE: do it ahead of malloc below to allocate enough space for fd_sets */ if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) return -errno; max_fd = *fd; if (fds[1] > max_fd) max_fd = fds[1]; sread_sz = (max_fd + NBBY) / NBBY; swrite_sz = sread_sz; s = malloc(sizeof(*s) + sread_sz + swrite_sz); if (s == NULL) { err = -ENOMEM; goto failed_malloc; } s->events = 0; s->fd = *fd; s->sread = (fd_set*) ((char*) s + sizeof(*s)); s->sread_sz = sread_sz; s->swrite = (fd_set*) ((char*) s->sread + sread_sz); s->swrite_sz = swrite_sz; err = uv_async_init(stream->loop, &s->async, uv__stream_osx_select_cb); if (err) goto failed_async_init; s->async.flags |= UV__HANDLE_INTERNAL; uv__handle_unref(&s->async); err = uv_sem_init(&s->close_sem, 0); if (err != 0) goto failed_close_sem_init; err = uv_sem_init(&s->async_sem, 0); if (err != 0) goto failed_async_sem_init; s->fake_fd = fds[0]; s->int_fd = fds[1]; old_fd = *fd; s->stream = stream; stream->select = s; *fd = s->fake_fd; err = uv_thread_create(&s->thread, uv__stream_osx_select, stream); if (err != 0) goto failed_thread_create; return 0; failed_thread_create: s->stream = NULL; stream->select = NULL; *fd = old_fd; uv_sem_destroy(&s->async_sem); failed_async_sem_init: uv_sem_destroy(&s->close_sem); failed_close_sem_init: uv__close(fds[0]); uv__close(fds[1]); uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); return err; failed_async_init: free(s); failed_malloc: uv__close(fds[0]); uv__close(fds[1]); return err; } #endif /* defined(__APPLE__) */ int uv__stream_open(uv_stream_t* stream, int fd, int flags) { assert(fd >= 0); stream->flags |= flags; if (stream->type == UV_TCP) { if ((stream->flags & UV_TCP_NODELAY) && uv__tcp_nodelay(fd, 1)) return -errno; /* TODO Use delay the user passed in. */ if ((stream->flags & UV_TCP_KEEPALIVE) && uv__tcp_keepalive(fd, 1, 60)) return -errno; } stream->io_watcher.fd = fd; return 0; } void uv__stream_flush_write_queue(uv_stream_t* stream, int error) { uv_write_t* req; QUEUE* q; while (!QUEUE_EMPTY(&stream->write_queue)) { q = QUEUE_HEAD(&stream->write_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_write_t, queue); req->error = error; QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); } } void uv__stream_destroy(uv_stream_t* stream) { assert(!uv__io_active(&stream->io_watcher, UV__POLLIN | UV__POLLOUT)); assert(stream->flags & UV_CLOSED); if (stream->connect_req) { uv__req_unregister(stream->loop, stream->connect_req); stream->connect_req->cb(stream->connect_req, -ECANCELED); stream->connect_req = NULL; } uv__stream_flush_write_queue(stream, -ECANCELED); uv__write_callbacks(stream); if (stream->shutdown_req) { /* The ECANCELED error code is a lie, the shutdown(2) syscall is a * fait accompli at this point. Maybe we should revisit this in v0.11. * A possible reason for leaving it unchanged is that it informs the * callee that the handle has been destroyed. */ uv__req_unregister(stream->loop, stream->shutdown_req); stream->shutdown_req->cb(stream->shutdown_req, -ECANCELED); stream->shutdown_req = NULL; } assert(stream->write_queue_size == 0); } /* Implements a best effort approach to mitigating accept() EMFILE errors. * We have a spare file descriptor stashed away that we close to get below * the EMFILE limit. Next, we accept all pending connections and close them * immediately to signal the clients that we're overloaded - and we are, but * we still keep on trucking. * * There is one caveat: it's not reliable in a multi-threaded environment. * The file descriptor limit is per process. Our party trick fails if another * thread opens a file or creates a socket in the time window between us * calling close() and accept(). */ static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) { int err; int emfile_fd; if (loop->emfile_fd == -1) return -EMFILE; uv__close(loop->emfile_fd); loop->emfile_fd = -1; do { err = uv__accept(accept_fd); if (err >= 0) uv__close(err); } while (err >= 0 || err == -EINTR); emfile_fd = uv__open_cloexec("/", O_RDONLY); if (emfile_fd >= 0) loop->emfile_fd = emfile_fd; return err; } #if defined(UV_HAVE_KQUEUE) # define UV_DEC_BACKLOG(w) w->rcount--; #else # define UV_DEC_BACKLOG(w) /* no-op */ #endif /* defined(UV_HAVE_KQUEUE) */ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_stream_t* stream; int err; stream = container_of(w, uv_stream_t, io_watcher); assert(events == UV__POLLIN); assert(stream->accepted_fd == -1); assert(!(stream->flags & UV_CLOSING)); uv__io_start(stream->loop, &stream->io_watcher, UV__POLLIN); /* connection_cb can close the server socket while we're * in the loop so check it on each iteration. */ while (uv__stream_fd(stream) != -1) { assert(stream->accepted_fd == -1); #if defined(UV_HAVE_KQUEUE) if (w->rcount <= 0) return; #endif /* defined(UV_HAVE_KQUEUE) */ err = uv__accept(uv__stream_fd(stream)); if (err < 0) { if (err == -EAGAIN || err == -EWOULDBLOCK) return; /* Not an error. */ if (err == -ECONNABORTED) continue; /* Ignore. Nothing we can do about that. */ if (err == -EMFILE || err == -ENFILE) { err = uv__emfile_trick(loop, uv__stream_fd(stream)); if (err == -EAGAIN || err == -EWOULDBLOCK) break; } stream->connection_cb(stream, err); continue; } UV_DEC_BACKLOG(w) stream->accepted_fd = err; stream->connection_cb(stream, 0); if (stream->accepted_fd != -1) { /* The user hasn't yet accepted called uv_accept() */ uv__io_stop(loop, &stream->io_watcher, UV__POLLIN); return; } if (stream->type == UV_TCP && (stream->flags & UV_TCP_SINGLE_ACCEPT)) { /* Give other processes a chance to accept connections. */ struct timespec timeout = { 0, 1 }; nanosleep(&timeout, NULL); } } } #undef UV_DEC_BACKLOG int uv_accept(uv_stream_t* server, uv_stream_t* client) { int err; /* TODO document this */ assert(server->loop == client->loop); if (server->accepted_fd == -1) return -EAGAIN; err = 0; switch (client->type) { case UV_NAMED_PIPE: case UV_TCP: err = uv__stream_open(client, server->accepted_fd, UV_STREAM_READABLE | UV_STREAM_WRITABLE); if (err) { /* TODO handle error */ uv__close(server->accepted_fd); goto done; } break; case UV_UDP: err = uv_udp_open((uv_udp_t*) client, server->accepted_fd); if (err) { uv__close(server->accepted_fd); goto done; } break; default: return -EINVAL; } done: /* Process queued fds */ if (server->queued_fds != NULL) { uv__stream_queued_fds_t* queued_fds; queued_fds = server->queued_fds; /* Read first */ server->accepted_fd = queued_fds->fds[0]; /* All read, free */ assert(queued_fds->offset > 0); if (--queued_fds->offset == 0) { free(queued_fds); server->queued_fds = NULL; } else { /* Shift rest */ memmove(queued_fds->fds, queued_fds->fds + 1, queued_fds->offset * sizeof(*queued_fds->fds)); } } else { server->accepted_fd = -1; if (err == 0) uv__io_start(server->loop, &server->io_watcher, UV__POLLIN); } return err; } int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { int err; switch (stream->type) { case UV_TCP: err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); break; case UV_NAMED_PIPE: err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); break; default: err = -EINVAL; } if (err == 0) uv__handle_start(stream); return err; } static void uv__drain(uv_stream_t* stream) { uv_shutdown_t* req; int err; assert(QUEUE_EMPTY(&stream->write_queue)); uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); uv__stream_osx_interrupt_select(stream); /* Shutdown? */ if ((stream->flags & UV_STREAM_SHUTTING) && !(stream->flags & UV_CLOSING) && !(stream->flags & UV_STREAM_SHUT)) { assert(stream->shutdown_req); req = stream->shutdown_req; stream->shutdown_req = NULL; stream->flags &= ~UV_STREAM_SHUTTING; uv__req_unregister(stream->loop, req); err = 0; if (shutdown(uv__stream_fd(stream), SHUT_WR)) err = -errno; if (err == 0) stream->flags |= UV_STREAM_SHUT; if (req->cb != NULL) req->cb(req, err); } } static size_t uv__write_req_size(uv_write_t* req) { size_t size; assert(req->bufs != NULL); size = uv__count_bufs(req->bufs + req->write_index, req->nbufs - req->write_index); assert(req->handle->write_queue_size >= size); return size; } static void uv__write_req_finish(uv_write_t* req) { uv_stream_t* stream = req->handle; /* Pop the req off tcp->write_queue. */ QUEUE_REMOVE(&req->queue); /* Only free when there was no error. On error, we touch up write_queue_size * right before making the callback. The reason we don't do that right away * is that a write_queue_size > 0 is our only way to signal to the user that * they should stop writing - which they should if we got an error. Something * to revisit in future revisions of the libuv API. */ if (req->error == 0) { if (req->bufs != req->bufsml) free(req->bufs); req->bufs = NULL; } /* Add it to the write_completed_queue where it will have its * callback called in the near future. */ QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); uv__io_feed(stream->loop, &stream->io_watcher); } static int uv__handle_fd(uv_handle_t* handle) { switch (handle->type) { case UV_NAMED_PIPE: case UV_TCP: return ((uv_stream_t*) handle)->io_watcher.fd; case UV_UDP: return ((uv_udp_t*) handle)->io_watcher.fd; default: return -1; } } static int uv__getiovmax() { #if defined(IOV_MAX) return IOV_MAX; #elif defined(_SC_IOV_MAX) static int iovmax = -1; if (iovmax == -1) iovmax = sysconf(_SC_IOV_MAX); return iovmax; #else return 1024; #endif } static void uv__write(uv_stream_t* stream) { struct iovec* iov; QUEUE* q; uv_write_t* req; int iovmax; int iovcnt; ssize_t n; start: assert(uv__stream_fd(stream) >= 0); if (QUEUE_EMPTY(&stream->write_queue)) return; q = QUEUE_HEAD(&stream->write_queue); req = QUEUE_DATA(q, uv_write_t, queue); assert(req->handle == stream); /* * Cast to iovec. We had to have our own uv_buf_t instead of iovec * because Windows's WSABUF is not an iovec. */ assert(sizeof(uv_buf_t) == sizeof(struct iovec)); iov = (struct iovec*) &(req->bufs[req->write_index]); iovcnt = req->nbufs - req->write_index; iovmax = uv__getiovmax(); /* Limit iov count to avoid EINVALs from writev() */ if (iovcnt > iovmax) iovcnt = iovmax; /* * Now do the actual writev. Note that we've been updating the pointers * inside the iov each time we write. So there is no need to offset it. */ if (req->send_handle) { struct msghdr msg; char scratch[64]; struct cmsghdr *cmsg; int fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle); assert(fd_to_send >= 0); msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = iov; msg.msg_iovlen = iovcnt; msg.msg_flags = 0; msg.msg_control = (void*) scratch; msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send)); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send)); /* silence aliasing warning */ { void* pv = CMSG_DATA(cmsg); int* pi = pv; *pi = fd_to_send; } do { n = sendmsg(uv__stream_fd(stream), &msg, 0); } while (n == -1 && errno == EINTR); } else { do { if (iovcnt == 1) { n = write(uv__stream_fd(stream), iov[0].iov_base, iov[0].iov_len); } else { n = writev(uv__stream_fd(stream), iov, iovcnt); } } while (n == -1 && errno == EINTR); } if (n < 0) { if (errno != EAGAIN && errno != EWOULDBLOCK) { /* Error */ req->error = -errno; uv__write_req_finish(req); uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); if (!uv__io_active(&stream->io_watcher, UV__POLLIN)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); return; } else if (stream->flags & UV_STREAM_BLOCKING) { /* If this is a blocking stream, try again. */ goto start; } } else { /* Successful write */ while (n >= 0) { uv_buf_t* buf = &(req->bufs[req->write_index]); size_t len = buf->len; assert(req->write_index < req->nbufs); if ((size_t)n < len) { buf->base += n; buf->len -= n; stream->write_queue_size -= n; n = 0; /* There is more to write. */ if (stream->flags & UV_STREAM_BLOCKING) { /* * If we're blocking then we should not be enabling the write * watcher - instead we need to try again. */ goto start; } else { /* Break loop and ensure the watcher is pending. */ break; } } else { /* Finished writing the buf at index req->write_index. */ req->write_index++; assert((size_t)n >= len); n -= len; assert(stream->write_queue_size >= len); stream->write_queue_size -= len; if (req->write_index == req->nbufs) { /* Then we're done! */ assert(n == 0); uv__write_req_finish(req); /* TODO: start trying to write the next request. */ return; } } } } /* Either we've counted n down to zero or we've got EAGAIN. */ assert(n == 0 || n == -1); /* Only non-blocking streams should use the write_watcher. */ assert(!(stream->flags & UV_STREAM_BLOCKING)); /* We're not done. */ uv__io_start(stream->loop, &stream->io_watcher, UV__POLLOUT); /* Notify select() thread about state change */ uv__stream_osx_interrupt_select(stream); } static void uv__write_callbacks(uv_stream_t* stream) { uv_write_t* req; QUEUE* q; while (!QUEUE_EMPTY(&stream->write_completed_queue)) { /* Pop a req off write_completed_queue. */ q = QUEUE_HEAD(&stream->write_completed_queue); req = QUEUE_DATA(q, uv_write_t, queue); QUEUE_REMOVE(q); uv__req_unregister(stream->loop, req); if (req->bufs != NULL) { stream->write_queue_size -= uv__write_req_size(req); if (req->bufs != req->bufsml) free(req->bufs); req->bufs = NULL; } /* NOTE: call callback AFTER freeing the request data. */ if (req->cb) req->cb(req, req->error); } assert(QUEUE_EMPTY(&stream->write_completed_queue)); } uv_handle_type uv__handle_type(int fd) { struct sockaddr_storage ss; socklen_t len; int type; memset(&ss, 0, sizeof(ss)); len = sizeof(ss); if (getsockname(fd, (struct sockaddr*)&ss, &len)) return UV_UNKNOWN_HANDLE; len = sizeof type; if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &len)) return UV_UNKNOWN_HANDLE; if (type == SOCK_STREAM) { switch (ss.ss_family) { case AF_UNIX: return UV_NAMED_PIPE; case AF_INET: case AF_INET6: return UV_TCP; } } if (type == SOCK_DGRAM && (ss.ss_family == AF_INET || ss.ss_family == AF_INET6)) return UV_UDP; return UV_UNKNOWN_HANDLE; } static void uv__stream_eof(uv_stream_t* stream, const uv_buf_t* buf) { stream->flags |= UV_STREAM_READ_EOF; uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLIN); if (!uv__io_active(&stream->io_watcher, UV__POLLOUT)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); stream->read_cb(stream, UV_EOF, buf); } static int uv__stream_queue_fd(uv_stream_t* stream, int fd) { uv__stream_queued_fds_t* queued_fds; unsigned int queue_size; queued_fds = stream->queued_fds; if (queued_fds == NULL) { queue_size = 8; queued_fds = malloc((queue_size - 1) * sizeof(*queued_fds->fds) + sizeof(*queued_fds)); if (queued_fds == NULL) return -ENOMEM; queued_fds->size = queue_size; queued_fds->offset = 0; stream->queued_fds = queued_fds; /* Grow */ } else if (queued_fds->size == queued_fds->offset) { queue_size = queued_fds->size + 8; queued_fds = realloc(queued_fds, (queue_size - 1) * sizeof(*queued_fds->fds) + sizeof(*queued_fds)); /* * Allocation failure, report back. * NOTE: if it is fatal - sockets will be closed in uv__stream_close */ if (queued_fds == NULL) return -ENOMEM; queued_fds->size = queue_size; stream->queued_fds = queued_fds; } /* Put fd in a queue */ queued_fds->fds[queued_fds->offset++] = fd; return 0; } #define UV__CMSG_FD_COUNT 64 #define UV__CMSG_FD_SIZE (UV__CMSG_FD_COUNT * sizeof(int)) static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) { struct cmsghdr* cmsg; for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) { char* start; char* end; int err; void* pv; int* pi; unsigned int i; unsigned int count; if (cmsg->cmsg_type != SCM_RIGHTS) { fprintf(stderr, "ignoring non-SCM_RIGHTS ancillary data: %d\n", cmsg->cmsg_type); continue; } /* silence aliasing warning */ pv = CMSG_DATA(cmsg); pi = pv; /* Count available fds */ start = (char*) cmsg; end = (char*) cmsg + cmsg->cmsg_len; count = 0; while (start + CMSG_LEN(count * sizeof(*pi)) < end) count++; assert(start + CMSG_LEN(count * sizeof(*pi)) == end); for (i = 0; i < count; i++) { /* Already has accepted fd, queue now */ if (stream->accepted_fd != -1) { err = uv__stream_queue_fd(stream, pi[i]); if (err != 0) { /* Close rest */ for (; i < count; i++) uv__close(pi[i]); return err; } } else { stream->accepted_fd = pi[i]; } } } return 0; } static void uv__read(uv_stream_t* stream) { uv_buf_t buf; ssize_t nread; struct msghdr msg; char cmsg_space[CMSG_SPACE(UV__CMSG_FD_SIZE)]; int count; int err; int is_ipc; stream->flags &= ~UV_STREAM_READ_PARTIAL; /* Prevent loop starvation when the data comes in as fast as (or faster than) * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. */ count = 32; is_ipc = stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) stream)->ipc; /* XXX: Maybe instead of having UV_STREAM_READING we just test if * tcp->read_cb is NULL or not? */ while (stream->read_cb && (stream->flags & UV_STREAM_READING) && (count-- > 0)) { assert(stream->alloc_cb != NULL); stream->alloc_cb((uv_handle_t*)stream, 64 * 1024, &buf); if (buf.len == 0) { /* User indicates it can't or won't handle the read. */ stream->read_cb(stream, UV_ENOBUFS, &buf); return; } assert(buf.base != NULL); assert(uv__stream_fd(stream) >= 0); if (!is_ipc) { do { nread = read(uv__stream_fd(stream), buf.base, buf.len); } while (nread < 0 && errno == EINTR); } else { /* ipc uses recvmsg */ msg.msg_flags = 0; msg.msg_iov = (struct iovec*) &buf; msg.msg_iovlen = 1; msg.msg_name = NULL; msg.msg_namelen = 0; /* Set up to receive a descriptor even if one isn't in the message */ msg.msg_controllen = sizeof(cmsg_space); msg.msg_control = cmsg_space; do { nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0); } while (nread < 0 && errno == EINTR); } if (nread < 0) { /* Error */ if (errno == EAGAIN || errno == EWOULDBLOCK) { /* Wait for the next one. */ if (stream->flags & UV_STREAM_READING) { uv__io_start(stream->loop, &stream->io_watcher, UV__POLLIN); uv__stream_osx_interrupt_select(stream); } stream->read_cb(stream, 0, &buf); } else { /* Error. User should call uv_close(). */ stream->read_cb(stream, -errno, &buf); assert(!uv__io_active(&stream->io_watcher, UV__POLLIN) && "stream->read_cb(status=-1) did not call uv_close()"); } return; } else if (nread == 0) { uv__stream_eof(stream, &buf); return; } else { /* Successful read */ ssize_t buflen = buf.len; if (is_ipc) { err = uv__stream_recv_cmsg(stream, &msg); if (err != 0) { stream->read_cb(stream, err, &buf); return; } } stream->read_cb(stream, nread, &buf); /* Return if we didn't fill the buffer, there is no more data to read. */ if (nread < buflen) { stream->flags |= UV_STREAM_READ_PARTIAL; return; } } } } #undef UV__CMSG_FD_COUNT #undef UV__CMSG_FD_SIZE int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) { assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE) && "uv_shutdown (unix) only supports uv_handle_t right now"); if (!(stream->flags & UV_STREAM_WRITABLE) || stream->flags & UV_STREAM_SHUT || stream->flags & UV_STREAM_SHUTTING || stream->flags & UV_CLOSED || stream->flags & UV_CLOSING) { return -ENOTCONN; } assert(uv__stream_fd(stream) >= 0); /* Initialize request */ uv__req_init(stream->loop, req, UV_SHUTDOWN); req->handle = stream; req->cb = cb; stream->shutdown_req = req; stream->flags |= UV_STREAM_SHUTTING; uv__io_start(stream->loop, &stream->io_watcher, UV__POLLOUT); uv__stream_osx_interrupt_select(stream); return 0; } static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { uv_stream_t* stream; stream = container_of(w, uv_stream_t, io_watcher); assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY); assert(!(stream->flags & UV_CLOSING)); if (stream->connect_req) { uv__stream_connect(stream); return; } assert(uv__stream_fd(stream) >= 0); /* Ignore POLLHUP here. Even it it's set, there may still be data to read. */ if (events & (UV__POLLIN | UV__POLLERR | UV__POLLHUP)) uv__read(stream); if (uv__stream_fd(stream) == -1) return; /* read_cb closed stream. */ /* Short-circuit iff POLLHUP is set, the user is still interested in read * events and uv__read() reported a partial read but not EOF. If the EOF * flag is set, uv__read() called read_cb with err=UV_EOF and we don't * have to do anything. If the partial read flag is not set, we can't * report the EOF yet because there is still data to read. */ if ((events & UV__POLLHUP) && (stream->flags & UV_STREAM_READING) && (stream->flags & UV_STREAM_READ_PARTIAL) && !(stream->flags & UV_STREAM_READ_EOF)) { uv_buf_t buf = { NULL, 0 }; uv__stream_eof(stream, &buf); } if (uv__stream_fd(stream) == -1) return; /* read_cb closed stream. */ if (events & (UV__POLLOUT | UV__POLLERR | UV__POLLHUP)) { uv__write(stream); uv__write_callbacks(stream); /* Write queue drained. */ if (QUEUE_EMPTY(&stream->write_queue)) uv__drain(stream); } } /** * We get called here from directly following a call to connect(2). * In order to determine if we've errored out or succeeded must call * getsockopt. */ static void uv__stream_connect(uv_stream_t* stream) { int error; uv_connect_t* req = stream->connect_req; socklen_t errorsize = sizeof(int); assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE); assert(req); if (stream->delayed_error) { /* To smooth over the differences between unixes errors that * were reported synchronously on the first connect can be delayed * until the next tick--which is now. */ error = stream->delayed_error; stream->delayed_error = 0; } else { /* Normal situation: we need to get the socket error from the kernel. */ assert(uv__stream_fd(stream) >= 0); getsockopt(uv__stream_fd(stream), SOL_SOCKET, SO_ERROR, &error, &errorsize); error = -error; } if (error == -EINPROGRESS) return; stream->connect_req = NULL; uv__req_unregister(stream->loop, req); if (error < 0 || QUEUE_EMPTY(&stream->write_queue)) { uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); } if (req->cb) req->cb(req, error); if (uv__stream_fd(stream) == -1) return; if (error < 0) { uv__stream_flush_write_queue(stream, -ECANCELED); uv__write_callbacks(stream); } } int uv_write2(uv_write_t* req, uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { int empty_queue; assert(nbufs > 0); assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY) && "uv_write (unix) does not yet support other types of streams"); if (uv__stream_fd(stream) < 0) return -EBADF; if (send_handle) { if (stream->type != UV_NAMED_PIPE || !((uv_pipe_t*)stream)->ipc) return -EINVAL; /* XXX We abuse uv_write2() to send over UDP handles to child processes. * Don't call uv__stream_fd() on those handles, it's a macro that on OS X * evaluates to a function that operates on a uv_stream_t with a couple of * OS X specific fields. On other Unices it does (handle)->io_watcher.fd, * which works but only by accident. */ if (uv__handle_fd((uv_handle_t*) send_handle) < 0) return -EBADF; } /* It's legal for write_queue_size > 0 even when the write_queue is empty; * it means there are error-state requests in the write_completed_queue that * will touch up write_queue_size later, see also uv__write_req_finish(). * We chould check that write_queue is empty instead but that implies making * a write() syscall when we know that the handle is in error mode. */ empty_queue = (stream->write_queue_size == 0); /* Initialize the req */ uv__req_init(stream->loop, req, UV_WRITE); req->cb = cb; req->handle = stream; req->error = 0; req->send_handle = send_handle; QUEUE_INIT(&req->queue); req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(bufs[0])); if (req->bufs == NULL) return -ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); req->nbufs = nbufs; req->write_index = 0; stream->write_queue_size += uv__count_bufs(bufs, nbufs); /* Append the request to write_queue. */ QUEUE_INSERT_TAIL(&stream->write_queue, &req->queue); /* If the queue was empty when this function began, we should attempt to * do the write immediately. Otherwise start the write_watcher and wait * for the fd to become writable. */ if (stream->connect_req) { /* Still connecting, do nothing. */ } else if (empty_queue) { uv__write(stream); } else { /* * blocking streams should never have anything in the queue. * if this assert fires then somehow the blocking stream isn't being * sufficiently flushed in uv__write. */ assert(!(stream->flags & UV_STREAM_BLOCKING)); uv__io_start(stream->loop, &stream->io_watcher, UV__POLLOUT); uv__stream_osx_interrupt_select(stream); } return 0; } /* The buffers to be written must remain valid until the callback is called. * This is not required for the uv_buf_t array. */ int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { return uv_write2(req, handle, bufs, nbufs, NULL, cb); } void uv_try_write_cb(uv_write_t* req, int status) { /* Should not be called */ abort(); } int uv_try_write(uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs) { int r; int has_pollout; size_t written; size_t req_size; uv_write_t req; /* Connecting or already writing some data */ if (stream->connect_req != NULL || stream->write_queue_size != 0) return -EAGAIN; has_pollout = uv__io_active(&stream->io_watcher, UV__POLLOUT); r = uv_write(&req, stream, bufs, nbufs, uv_try_write_cb); if (r != 0) return r; /* Remove not written bytes from write queue size */ written = uv__count_bufs(bufs, nbufs); if (req.bufs != NULL) req_size = uv__write_req_size(&req); else req_size = 0; written -= req_size; stream->write_queue_size -= req_size; /* Unqueue request, regardless of immediateness */ QUEUE_REMOVE(&req.queue); uv__req_unregister(stream->loop, &req); if (req.bufs != req.bufsml) free(req.bufs); req.bufs = NULL; /* Do not poll for writable, if we wasn't before calling this */ if (!has_pollout) { uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLOUT); uv__stream_osx_interrupt_select(stream); } if (written == 0) return -EAGAIN; else return written; } int uv_read_start(uv_stream_t* stream, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || stream->type == UV_TTY); if (stream->flags & UV_CLOSING) return -EINVAL; /* The UV_STREAM_READING flag is irrelevant of the state of the tcp - it just * expresses the desired state of the user. */ stream->flags |= UV_STREAM_READING; /* TODO: try to do the read inline? */ /* TODO: keep track of tcp state. If we've gotten a EOF then we should * not start the IO watcher. */ assert(uv__stream_fd(stream) >= 0); assert(alloc_cb); stream->read_cb = read_cb; stream->alloc_cb = alloc_cb; uv__io_start(stream->loop, &stream->io_watcher, UV__POLLIN); uv__handle_start(stream); uv__stream_osx_interrupt_select(stream); return 0; } int uv_read_stop(uv_stream_t* stream) { /* Sanity check. We're going to stop the handle unless it's primed for * writing but that means there should be some kind of write action in * progress. */ assert(!uv__io_active(&stream->io_watcher, UV__POLLOUT) || !QUEUE_EMPTY(&stream->write_completed_queue) || !QUEUE_EMPTY(&stream->write_queue) || stream->shutdown_req != NULL || stream->connect_req != NULL); stream->flags &= ~UV_STREAM_READING; uv__io_stop(stream->loop, &stream->io_watcher, UV__POLLIN); if (!uv__io_active(&stream->io_watcher, UV__POLLOUT)) uv__handle_stop(stream); uv__stream_osx_interrupt_select(stream); stream->read_cb = NULL; stream->alloc_cb = NULL; return 0; } int uv_is_readable(const uv_stream_t* stream) { return !!(stream->flags & UV_STREAM_READABLE); } int uv_is_writable(const uv_stream_t* stream) { return !!(stream->flags & UV_STREAM_WRITABLE); } #if defined(__APPLE__) int uv___stream_fd(const uv_stream_t* handle) { const uv__stream_select_t* s; assert(handle->type == UV_TCP || handle->type == UV_TTY || handle->type == UV_NAMED_PIPE); s = handle->select; if (s != NULL) return s->fd; return handle->io_watcher.fd; } #endif /* defined(__APPLE__) */ void uv__stream_close(uv_stream_t* handle) { unsigned int i; uv__stream_queued_fds_t* queued_fds; #if defined(__APPLE__) /* Terminate select loop first */ if (handle->select != NULL) { uv__stream_select_t* s; s = handle->select; uv_sem_post(&s->close_sem); uv_sem_post(&s->async_sem); uv__stream_osx_interrupt_select(handle); uv_thread_join(&s->thread); uv_sem_destroy(&s->close_sem); uv_sem_destroy(&s->async_sem); uv__close(s->fake_fd); uv__close(s->int_fd); uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); handle->select = NULL; } #endif /* defined(__APPLE__) */ uv__io_close(handle->loop, &handle->io_watcher); uv_read_stop(handle); uv__handle_stop(handle); if (handle->io_watcher.fd != -1) { /* Don't close stdio file descriptors. Nothing good comes from it. */ if (handle->io_watcher.fd > STDERR_FILENO) uv__close(handle->io_watcher.fd); handle->io_watcher.fd = -1; } if (handle->accepted_fd != -1) { uv__close(handle->accepted_fd); handle->accepted_fd = -1; } /* Close all queued fds */ if (handle->queued_fds != NULL) { queued_fds = handle->queued_fds; for (i = 0; i < queued_fds->offset; i++) uv__close(queued_fds->fds[i]); free(handle->queued_fds); handle->queued_fds = NULL; } assert(!uv__io_active(&handle->io_watcher, UV__POLLIN | UV__POLLOUT)); } int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { return UV_ENOSYS; } MoarVM-2015.11/3rdparty/libuv/src/unix/sunos.c0000644000175000017500000004226312456307253020044 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #ifndef SUNOS_NO_IFADDRS # include #endif #include #include #include #include #include #include #include #include #include #define PORT_FIRED 0x69 #define PORT_UNUSED 0x0 #define PORT_LOADED 0x99 #define PORT_DELETED -1 #if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64) #define PROCFS_FILE_OFFSET_BITS_HACK 1 #undef _FILE_OFFSET_BITS #else #define PROCFS_FILE_OFFSET_BITS_HACK 0 #endif #include #if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1) #define _FILE_OFFSET_BITS 64 #endif int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { int err; int fd; loop->fs_fd = -1; loop->backend_fd = -1; fd = port_create(); if (fd == -1) return -errno; err = uv__cloexec(fd, 1); if (err) { uv__close(fd); return err; } loop->backend_fd = fd; return 0; } void uv__platform_loop_delete(uv_loop_t* loop) { if (loop->fs_fd != -1) { uv__close(loop->fs_fd); loop->fs_fd = -1; } if (loop->backend_fd != -1) { uv__close(loop->backend_fd); loop->backend_fd = -1; } } void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { struct port_event* events; uintptr_t i; uintptr_t nfds; assert(loop->watchers != NULL); events = (struct port_event*) loop->watchers[loop->nwatchers]; nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; if (events == NULL) return; /* Invalidate events with same file descriptor */ for (i = 0; i < nfds; i++) if ((int) events[i].portev_object == fd) events[i].portev_object = -1; } void uv__io_poll(uv_loop_t* loop, int timeout) { struct port_event events[1024]; struct port_event* pe; struct timespec spec; QUEUE* q; uv__io_t* w; uint64_t base; uint64_t diff; unsigned int nfds; unsigned int i; int saved_errno; int nevents; int count; int fd; if (loop->nfds == 0) { assert(QUEUE_EMPTY(&loop->watcher_queue)); return; } while (!QUEUE_EMPTY(&loop->watcher_queue)) { q = QUEUE_HEAD(&loop->watcher_queue); QUEUE_REMOVE(q); QUEUE_INIT(q); w = QUEUE_DATA(q, uv__io_t, watcher_queue); assert(w->pevents != 0); if (port_associate(loop->backend_fd, PORT_SOURCE_FD, w->fd, w->pevents, 0)) abort(); w->events = w->pevents; } assert(timeout >= -1); base = loop->time; count = 48; /* Benchmarks suggest this gives the best throughput. */ for (;;) { if (timeout != -1) { spec.tv_sec = timeout / 1000; spec.tv_nsec = (timeout % 1000) * 1000000; } /* Work around a kernel bug where nfds is not updated. */ events[0].portev_source = 0; nfds = 1; saved_errno = 0; if (port_getn(loop->backend_fd, events, ARRAY_SIZE(events), &nfds, timeout == -1 ? NULL : &spec)) { /* Work around another kernel bug: port_getn() may return events even * on error. */ if (errno == EINTR || errno == ETIME) saved_errno = errno; else abort(); } /* Update loop->time unconditionally. It's tempting to skip the update when * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the * operating system didn't reschedule our process while in the syscall. */ SAVE_ERRNO(uv__update_time(loop)); if (events[0].portev_source == 0) { if (timeout == 0) return; if (timeout == -1) continue; goto update_timeout; } if (nfds == 0) { assert(timeout != -1); return; } nevents = 0; assert(loop->watchers != NULL); loop->watchers[loop->nwatchers] = (void*) events; loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; for (i = 0; i < nfds; i++) { pe = events + i; fd = pe->portev_object; /* Skip invalidated events, see uv__platform_invalidate_fd */ if (fd == -1) continue; assert(fd >= 0); assert((unsigned) fd < loop->nwatchers); w = loop->watchers[fd]; /* File descriptor that we've stopped watching, ignore. */ if (w == NULL) continue; w->cb(loop, w, pe->portev_events); nevents++; if (w != loop->watchers[fd]) continue; /* Disabled by callback. */ /* Events Ports operates in oneshot mode, rearm timer on next run. */ if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); } loop->watchers[loop->nwatchers] = NULL; loop->watchers[loop->nwatchers + 1] = NULL; if (nevents != 0) { if (nfds == ARRAY_SIZE(events) && --count != 0) { /* Poll for more events but don't block this time. */ timeout = 0; continue; } return; } if (saved_errno == ETIME) { assert(timeout != -1); return; } if (timeout == 0) return; if (timeout == -1) continue; update_timeout: assert(timeout > 0); diff = loop->time - base; if (diff >= (uint64_t) timeout) return; timeout -= diff; } } uint64_t uv__hrtime(uv_clocktype_t type) { return gethrtime(); } /* * We could use a static buffer for the path manipulations that we need outside * of the function, but this function could be called by multiple consumers and * we don't want to potentially create a race condition in the use of snprintf. */ int uv_exepath(char* buffer, size_t* size) { ssize_t res; char buf[128]; if (buffer == NULL || size == NULL) return -EINVAL; snprintf(buf, sizeof(buf), "/proc/%lu/path/a.out", (unsigned long) getpid()); res = readlink(buf, buffer, *size - 1); if (res == -1) return -errno; buffer[res] = '\0'; *size = res; return 0; } uint64_t uv_get_free_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); } uint64_t uv_get_total_memory(void) { return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); } void uv_loadavg(double avg[3]) { (void) getloadavg(avg, 3); } #if defined(PORT_SOURCE_FILE) static int uv__fs_event_rearm(uv_fs_event_t *handle) { if (handle->fd == -1) return -EBADF; if (port_associate(handle->loop->fs_fd, PORT_SOURCE_FILE, (uintptr_t) &handle->fo, FILE_ATTRIB | FILE_MODIFIED, handle) == -1) { return -errno; } handle->fd = PORT_LOADED; return 0; } static void uv__fs_event_read(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { uv_fs_event_t *handle = NULL; timespec_t timeout; port_event_t pe; int events; int r; (void) w; (void) revents; do { uint_t n = 1; /* * Note that our use of port_getn() here (and not port_get()) is deliberate: * there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout * causes port_get() to return success instead of ETIME when there aren't * actually any events (!); by using port_getn() in lieu of port_get(), * we can at least workaround the bug by checking for zero returned events * and treating it as we would ETIME. */ do { memset(&timeout, 0, sizeof timeout); r = port_getn(loop->fs_fd, &pe, 1, &n, &timeout); } while (r == -1 && errno == EINTR); if ((r == -1 && errno == ETIME) || n == 0) break; handle = (uv_fs_event_t*) pe.portev_user; assert((r == 0) && "unexpected port_get() error"); events = 0; if (pe.portev_events & (FILE_ATTRIB | FILE_MODIFIED)) events |= UV_CHANGE; if (pe.portev_events & ~(FILE_ATTRIB | FILE_MODIFIED)) events |= UV_RENAME; assert(events != 0); handle->fd = PORT_FIRED; handle->cb(handle, NULL, events, 0); if (handle->fd != PORT_DELETED) { r = uv__fs_event_rearm(handle); if (r != 0) handle->cb(handle, NULL, 0, r); } } while (handle->fd != PORT_DELETED); } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { int portfd; int first_run; int err; if (uv__is_active(handle)) return -EINVAL; first_run = 0; if (handle->loop->fs_fd == -1) { portfd = port_create(); if (portfd == -1) return -errno; handle->loop->fs_fd = portfd; first_run = 1; } uv__handle_start(handle); handle->path = strdup(path); handle->fd = PORT_UNUSED; handle->cb = cb; memset(&handle->fo, 0, sizeof handle->fo); handle->fo.fo_name = handle->path; err = uv__fs_event_rearm(handle); if (err != 0) return err; if (first_run) { uv__io_init(&handle->loop->fs_event_watcher, uv__fs_event_read, portfd); uv__io_start(handle->loop, &handle->loop->fs_event_watcher, UV__POLLIN); } return 0; } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; if (handle->fd == PORT_FIRED || handle->fd == PORT_LOADED) { port_dissociate(handle->loop->fs_fd, PORT_SOURCE_FILE, (uintptr_t) &handle->fo); } handle->fd = PORT_DELETED; free(handle->path); handle->path = NULL; handle->fo.fo_name = NULL; uv__handle_stop(handle); return 0; } void uv__fs_event_close(uv_fs_event_t* handle) { uv_fs_event_stop(handle); } #else /* !defined(PORT_SOURCE_FILE) */ int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { return -ENOSYS; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* filename, unsigned int flags) { return -ENOSYS; } int uv_fs_event_stop(uv_fs_event_t* handle) { return -ENOSYS; } void uv__fs_event_close(uv_fs_event_t* handle) { UNREACHABLE(); } #endif /* defined(PORT_SOURCE_FILE) */ char** uv_setup_args(int argc, char** argv) { return argv; } int uv_set_process_title(const char* title) { return 0; } int uv_get_process_title(char* buffer, size_t size) { if (size > 0) { buffer[0] = '\0'; } return 0; } int uv_resident_set_memory(size_t* rss) { psinfo_t psinfo; int err; int fd; fd = open("/proc/self/psinfo", O_RDONLY); if (fd == -1) return -errno; /* FIXME(bnoordhuis) Handle EINTR. */ err = -EINVAL; if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { *rss = (size_t)psinfo.pr_rssize * 1024; err = 0; } uv__close(fd); return err; } int uv_uptime(double* uptime) { kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; long hz = sysconf(_SC_CLK_TCK); kc = kstat_open(); if (kc == NULL) return -EPERM; ksp = kstat_lookup(kc, (char*) "unix", 0, (char*) "system_misc"); if (kstat_read(kc, ksp, NULL) == -1) { *uptime = -1; } else { knp = (kstat_named_t*) kstat_data_lookup(ksp, (char*) "clk_intr"); *uptime = knp->value.ul / hz; } kstat_close(kc); return 0; } int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { int lookup_instance; kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; uv_cpu_info_t* cpu_info; kc = kstat_open(); if (kc == NULL) return -EPERM; /* Get count of cpus */ lookup_instance = 0; while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { lookup_instance++; } *cpu_infos = malloc(lookup_instance * sizeof(**cpu_infos)); if (!(*cpu_infos)) { kstat_close(kc); return -ENOMEM; } *count = lookup_instance; cpu_info = *cpu_infos; lookup_instance = 0; while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { if (kstat_read(kc, ksp, NULL) == -1) { cpu_info->speed = 0; cpu_info->model = NULL; } else { knp = kstat_data_lookup(ksp, (char*) "clock_MHz"); assert(knp->data_type == KSTAT_DATA_INT32 || knp->data_type == KSTAT_DATA_INT64); cpu_info->speed = (knp->data_type == KSTAT_DATA_INT32) ? knp->value.i32 : knp->value.i64; knp = kstat_data_lookup(ksp, (char*) "brand"); assert(knp->data_type == KSTAT_DATA_STRING); cpu_info->model = strdup(KSTAT_NAMED_STR_PTR(knp)); } lookup_instance++; cpu_info++; } cpu_info = *cpu_infos; lookup_instance = 0; for (;;) { ksp = kstat_lookup(kc, (char*) "cpu", lookup_instance, (char*) "sys"); if (ksp == NULL) break; if (kstat_read(kc, ksp, NULL) == -1) { cpu_info->cpu_times.user = 0; cpu_info->cpu_times.nice = 0; cpu_info->cpu_times.sys = 0; cpu_info->cpu_times.idle = 0; cpu_info->cpu_times.irq = 0; } else { knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_user"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.user = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_kernel"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.sys = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_idle"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.idle = knp->value.ui64; knp = kstat_data_lookup(ksp, (char*) "intr"); assert(knp->data_type == KSTAT_DATA_UINT64); cpu_info->cpu_times.irq = knp->value.ui64; cpu_info->cpu_times.nice = 0; } lookup_instance++; cpu_info++; } kstat_close(kc); return 0; } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { #ifdef SUNOS_NO_IFADDRS return -ENOSYS; #else uv_interface_address_t* address; struct sockaddr_dl* sa_addr; struct ifaddrs* addrs; struct ifaddrs* ent; int i; if (getifaddrs(&addrs)) return -errno; *count = 0; /* Count the number of interfaces */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family == PF_PACKET)) { continue; } (*count)++; } *addresses = malloc(*count * sizeof(**addresses)); if (!(*addresses)) return -ENOMEM; address = *addresses; for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) continue; if (ent->ifa_addr == NULL) continue; address->name = strdup(ent->ifa_name); if (ent->ifa_addr->sa_family == AF_INET6) { address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); } else { address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); } if (ent->ifa_netmask->sa_family == AF_INET6) { address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); } else { address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); } address->is_internal = !!((ent->ifa_flags & IFF_PRIVATE) || (ent->ifa_flags & IFF_LOOPBACK)); address++; } /* Fill in physical addresses for each interface */ for (ent = addrs; ent != NULL; ent = ent->ifa_next) { if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING)) || (ent->ifa_addr == NULL) || (ent->ifa_addr->sa_family != AF_LINK)) { continue; } address = *addresses; for (i = 0; i < (*count); i++) { if (strcmp(address->name, ent->ifa_name) == 0) { sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); } address++; } } freeifaddrs(addrs); return 0; #endif /* SUNOS_NO_IFADDRS */ } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { int i; for (i = 0; i < count; i++) { free(addresses[i].name); } free(addresses); } MoarVM-2015.11/3rdparty/libuv/src/unix/tcp.c0000644000175000017500000001750712456307253017466 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* tcp) { uv__stream_init(loop, (uv_stream_t*)tcp, UV_TCP); return 0; } static int maybe_new_socket(uv_tcp_t* handle, int domain, int flags) { int sockfd; int err; if (uv__stream_fd(handle) != -1) return 0; err = uv__socket(domain, SOCK_STREAM, 0); if (err < 0) return err; sockfd = err; err = uv__stream_open((uv_stream_t*) handle, sockfd, flags); if (err) { uv__close(sockfd); return err; } return 0; } int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; int on; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) return -EINVAL; err = maybe_new_socket(tcp, addr->sa_family, UV_STREAM_READABLE | UV_STREAM_WRITABLE); if (err) return err; on = 1; if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) return -errno; #ifdef IPV6_V6ONLY if (addr->sa_family == AF_INET6) { on = (flags & UV_TCP_IPV6ONLY) != 0; if (setsockopt(tcp->io_watcher.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof on) == -1) { return -errno; } } #endif errno = 0; if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) return -errno; tcp->delayed_error = -errno; if (addr->sa_family == AF_INET6) tcp->flags |= UV_HANDLE_IPV6; return 0; } int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { int err; int r; assert(handle->type == UV_TCP); if (handle->connect_req != NULL) return -EALREADY; /* FIXME(bnoordhuis) -EINVAL or maybe -EBUSY. */ err = maybe_new_socket(handle, addr->sa_family, UV_STREAM_READABLE | UV_STREAM_WRITABLE); if (err) return err; handle->delayed_error = 0; do r = connect(uv__stream_fd(handle), addr, addrlen); while (r == -1 && errno == EINTR); if (r == -1) { if (errno == EINPROGRESS) ; /* not an error */ else if (errno == ECONNREFUSED) /* If we get a ECONNREFUSED wait until the next tick to report the * error. Solaris wants to report immediately--other unixes want to * wait. */ handle->delayed_error = -errno; else return -errno; } uv__req_init(handle->loop, req, UV_CONNECT); req->cb = cb; req->handle = (uv_stream_t*) handle; QUEUE_INIT(&req->queue); handle->connect_req = req; uv__io_start(handle->loop, &handle->io_watcher, UV__POLLOUT); if (handle->delayed_error) uv__io_feed(handle->loop, &handle->io_watcher); return 0; } int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { return uv__stream_open((uv_stream_t*)handle, sock, UV_STREAM_READABLE | UV_STREAM_WRITABLE); } int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { socklen_t socklen; if (handle->delayed_error) return handle->delayed_error; if (uv__stream_fd(handle) < 0) return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ /* sizeof(socklen_t) != sizeof(int) on some systems. */ socklen = (socklen_t) *namelen; if (getsockname(uv__stream_fd(handle), name, &socklen)) return -errno; *namelen = (int) socklen; return 0; } int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { socklen_t socklen; if (handle->delayed_error) return handle->delayed_error; if (uv__stream_fd(handle) < 0) return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ /* sizeof(socklen_t) != sizeof(int) on some systems. */ socklen = (socklen_t) *namelen; if (getpeername(uv__stream_fd(handle), name, &socklen)) return -errno; *namelen = (int) socklen; return 0; } int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { static int single_accept = -1; int err; if (tcp->delayed_error) return tcp->delayed_error; if (single_accept == -1) { const char* val = getenv("UV_TCP_SINGLE_ACCEPT"); single_accept = (val != NULL && atoi(val) != 0); /* Off by default. */ } if (single_accept) tcp->flags |= UV_TCP_SINGLE_ACCEPT; err = maybe_new_socket(tcp, AF_INET, UV_STREAM_READABLE); if (err) return err; if (listen(tcp->io_watcher.fd, backlog)) return -errno; tcp->connection_cb = cb; /* Start listening for connections. */ tcp->io_watcher.cb = uv__server_io; uv__io_start(tcp->loop, &tcp->io_watcher, UV__POLLIN); return 0; } int uv__tcp_nodelay(int fd, int on) { if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on))) return -errno; return 0; } int uv__tcp_keepalive(int fd, int on, unsigned int delay) { if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on))) return -errno; #ifdef TCP_KEEPIDLE if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay))) return -errno; #endif /* Solaris/SmartOS, if you don't support keep-alive, * then don't advertise it in your system headers... */ /* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */ #if defined(TCP_KEEPALIVE) && !defined(__sun) if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay))) return -errno; #endif return 0; } int uv_tcp_nodelay(uv_tcp_t* handle, int on) { int err; if (uv__stream_fd(handle) != -1) { err = uv__tcp_nodelay(uv__stream_fd(handle), on); if (err) return err; } if (on) handle->flags |= UV_TCP_NODELAY; else handle->flags &= ~UV_TCP_NODELAY; return 0; } int uv_tcp_keepalive(uv_tcp_t* handle, int on, unsigned int delay) { int err; if (uv__stream_fd(handle) != -1) { err =uv__tcp_keepalive(uv__stream_fd(handle), on, delay); if (err) return err; } if (on) handle->flags |= UV_TCP_KEEPALIVE; else handle->flags &= ~UV_TCP_KEEPALIVE; /* TODO Store delay if uv__stream_fd(handle) == -1 but don't want to enlarge * uv_tcp_t with an int that's almost never used... */ return 0; } int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { if (enable) handle->flags &= ~UV_TCP_SINGLE_ACCEPT; else handle->flags |= UV_TCP_SINGLE_ACCEPT; return 0; } void uv__tcp_close(uv_tcp_t* handle) { uv__stream_close((uv_stream_t*)handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/thread.c0000644000175000017500000002400312502366750020133 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) struct thread_ctx { void (*entry)(void* arg); void* arg; }; static void* uv__thread_start(void *arg) { struct thread_ctx *ctx_p; struct thread_ctx ctx; ctx_p = arg; ctx = *ctx_p; free(ctx_p); ctx.entry(ctx.arg); return 0; } int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { struct thread_ctx* ctx; int err; ctx = malloc(sizeof(*ctx)); if (ctx == NULL) return UV_ENOMEM; ctx->entry = entry; ctx->arg = arg; err = pthread_create(tid, NULL, uv__thread_start, ctx); if (err) free(ctx); return err ? -1 : 0; } uv_thread_t uv_thread_self(void) { return pthread_self(); } int uv_thread_join(uv_thread_t *tid) { return -pthread_join(*tid, NULL); } int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { return pthread_equal(*t1, *t2); } int uv_mutex_init(uv_mutex_t* mutex) { #if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK) return -pthread_mutex_init(mutex, NULL); #else pthread_mutexattr_t attr; int err; if (pthread_mutexattr_init(&attr)) abort(); if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)) abort(); err = pthread_mutex_init(mutex, &attr); if (pthread_mutexattr_destroy(&attr)) abort(); return -err; #endif } void uv_mutex_destroy(uv_mutex_t* mutex) { if (pthread_mutex_destroy(mutex)) abort(); } void uv_mutex_lock(uv_mutex_t* mutex) { if (pthread_mutex_lock(mutex)) abort(); } int uv_mutex_trylock(uv_mutex_t* mutex) { int err; /* FIXME(bnoordhuis) EAGAIN means recursive lock limit reached. Arguably * a bug, should probably abort rather than return -EAGAIN. */ err = pthread_mutex_trylock(mutex); if (err && err != EBUSY && err != EAGAIN) abort(); return -err; } void uv_mutex_unlock(uv_mutex_t* mutex) { if (pthread_mutex_unlock(mutex)) abort(); } int uv_rwlock_init(uv_rwlock_t* rwlock) { return -pthread_rwlock_init(rwlock, NULL); } void uv_rwlock_destroy(uv_rwlock_t* rwlock) { if (pthread_rwlock_destroy(rwlock)) abort(); } void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_rdlock(rwlock)) abort(); } int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_tryrdlock(rwlock); if (err && err != EBUSY && err != EAGAIN) abort(); return -err; } void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_unlock(rwlock)) abort(); } void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_wrlock(rwlock)) abort(); } int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_trywrlock(rwlock); if (err && err != EBUSY && err != EAGAIN) abort(); return -err; } void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { if (pthread_rwlock_unlock(rwlock)) abort(); } void uv_once(uv_once_t* guard, void (*callback)(void)) { if (pthread_once(guard, callback)) abort(); } #if defined(__APPLE__) && defined(__MACH__) int uv_sem_init(uv_sem_t* sem, unsigned int value) { kern_return_t err; err = semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, value); if (err == KERN_SUCCESS) return 0; if (err == KERN_INVALID_ARGUMENT) return -EINVAL; if (err == KERN_RESOURCE_SHORTAGE) return -ENOMEM; abort(); return -EINVAL; /* Satisfy the compiler. */ } void uv_sem_destroy(uv_sem_t* sem) { if (semaphore_destroy(mach_task_self(), *sem)) abort(); } void uv_sem_post(uv_sem_t* sem) { if (semaphore_signal(*sem)) abort(); } void uv_sem_wait(uv_sem_t* sem) { int r; do r = semaphore_wait(*sem); while (r == KERN_ABORTED); if (r != KERN_SUCCESS) abort(); } int uv_sem_trywait(uv_sem_t* sem) { mach_timespec_t interval; kern_return_t err; interval.tv_sec = 0; interval.tv_nsec = 0; err = semaphore_timedwait(*sem, interval); if (err == KERN_SUCCESS) return 0; if (err == KERN_OPERATION_TIMED_OUT) return -EAGAIN; abort(); return -EINVAL; /* Satisfy the compiler. */ } #else /* !(defined(__APPLE__) && defined(__MACH__)) */ int uv_sem_init(uv_sem_t* sem, unsigned int value) { if (sem_init(sem, 0, value)) return -errno; return 0; } void uv_sem_destroy(uv_sem_t* sem) { if (sem_destroy(sem)) abort(); } void uv_sem_post(uv_sem_t* sem) { if (sem_post(sem)) abort(); } void uv_sem_wait(uv_sem_t* sem) { int r; do r = sem_wait(sem); while (r == -1 && errno == EINTR); if (r) abort(); } int uv_sem_trywait(uv_sem_t* sem) { int r; do r = sem_trywait(sem); while (r == -1 && errno == EINTR); if (r) { if (errno == EAGAIN) return -EAGAIN; abort(); } return 0; } #endif /* defined(__APPLE__) && defined(__MACH__) */ #if defined(__APPLE__) && defined(__MACH__) int uv_cond_init(uv_cond_t* cond) { return -pthread_cond_init(cond, NULL); } #else /* !(defined(__APPLE__) && defined(__MACH__)) */ int uv_cond_init(uv_cond_t* cond) { pthread_condattr_t attr; int err; err = pthread_condattr_init(&attr); if (err) return -err; #if !defined(__ANDROID__) err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); if (err) goto error2; #endif err = pthread_cond_init(cond, &attr); if (err) goto error2; err = pthread_condattr_destroy(&attr); if (err) goto error; return 0; error: pthread_cond_destroy(cond); error2: pthread_condattr_destroy(&attr); return -err; } #endif /* defined(__APPLE__) && defined(__MACH__) */ void uv_cond_destroy(uv_cond_t* cond) { if (pthread_cond_destroy(cond)) abort(); } void uv_cond_signal(uv_cond_t* cond) { if (pthread_cond_signal(cond)) abort(); } void uv_cond_broadcast(uv_cond_t* cond) { if (pthread_cond_broadcast(cond)) abort(); } void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (pthread_cond_wait(cond, mutex)) abort(); } int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { int r; struct timespec ts; #if defined(__APPLE__) && defined(__MACH__) ts.tv_sec = timeout / NANOSEC; ts.tv_nsec = timeout % NANOSEC; r = pthread_cond_timedwait_relative_np(cond, mutex, &ts); #else timeout += uv__hrtime(UV_CLOCK_PRECISE); ts.tv_sec = timeout / NANOSEC; ts.tv_nsec = timeout % NANOSEC; #if defined(__ANDROID__) /* * The bionic pthread implementation doesn't support CLOCK_MONOTONIC, * but has this alternative function instead. */ r = pthread_cond_timedwait_monotonic_np(cond, mutex, &ts); #else r = pthread_cond_timedwait(cond, mutex, &ts); #endif /* __ANDROID__ */ #endif if (r == 0) return 0; if (r == ETIMEDOUT) return -ETIMEDOUT; abort(); return -EINVAL; /* Satisfy the compiler. */ } #if defined(__APPLE__) && defined(__MACH__) int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { int err; barrier->n = count; barrier->count = 0; err = uv_mutex_init(&barrier->mutex); if (err) return -err; err = uv_sem_init(&barrier->turnstile1, 0); if (err) goto error2; err = uv_sem_init(&barrier->turnstile2, 1); if (err) goto error; return 0; error: uv_sem_destroy(&barrier->turnstile1); error2: uv_mutex_destroy(&barrier->mutex); return -err; } void uv_barrier_destroy(uv_barrier_t* barrier) { uv_sem_destroy(&barrier->turnstile2); uv_sem_destroy(&barrier->turnstile1); uv_mutex_destroy(&barrier->mutex); } int uv_barrier_wait(uv_barrier_t* barrier) { int serial_thread; uv_mutex_lock(&barrier->mutex); if (++barrier->count == barrier->n) { uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile1); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile1); uv_mutex_lock(&barrier->mutex); serial_thread = (--barrier->count == 0); if (serial_thread) { uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile2); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile2); return serial_thread; } #else /* !(defined(__APPLE__) && defined(__MACH__)) */ int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { return -pthread_barrier_init(barrier, NULL, count); } void uv_barrier_destroy(uv_barrier_t* barrier) { if (pthread_barrier_destroy(barrier)) abort(); } int uv_barrier_wait(uv_barrier_t* barrier) { int r = pthread_barrier_wait(barrier); if (r && r != PTHREAD_BARRIER_SERIAL_THREAD) abort(); return r == PTHREAD_BARRIER_SERIAL_THREAD; } #endif /* defined(__APPLE__) && defined(__MACH__) */ int uv_key_create(uv_key_t* key) { return -pthread_key_create(key, NULL); } void uv_key_delete(uv_key_t* key) { if (pthread_key_delete(*key)) abort(); } void* uv_key_get(uv_key_t* key) { return pthread_getspecific(*key); } void uv_key_set(uv_key_t* key, void* value) { if (pthread_setspecific(*key, value)) abort(); } MoarVM-2015.11/3rdparty/libuv/src/unix/timer.c0000644000175000017500000001061012502366750020003 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include "heap-inl.h" #include #include static int timer_less_than(const struct heap_node* ha, const struct heap_node* hb) { const uv_timer_t* a; const uv_timer_t* b; a = container_of(ha, const uv_timer_t, heap_node); b = container_of(hb, const uv_timer_t, heap_node); if (a->timeout < b->timeout) return 1; if (b->timeout < a->timeout) return 0; /* Compare start_id when both have the same timeout. start_id is * allocated with loop->timer_counter in uv_timer_start(). */ if (a->start_id < b->start_id) return 1; if (b->start_id < a->start_id) return 0; return 0; } int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_TIMER); handle->timer_cb = NULL; handle->repeat = 0; return 0; } int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat) { uint64_t clamped_timeout; if (cb == NULL) return -EINVAL; if (uv__is_active(handle)) uv_timer_stop(handle); clamped_timeout = handle->loop->time + timeout; if (clamped_timeout < timeout) clamped_timeout = (uint64_t) -1; handle->timer_cb = cb; handle->timeout = clamped_timeout; handle->repeat = repeat; /* start_id is the second index to be compared in uv__timer_cmp() */ handle->start_id = handle->loop->timer_counter++; heap_insert((struct heap*) &handle->loop->timer_heap, (struct heap_node*) &handle->heap_node, timer_less_than); uv__handle_start(handle); return 0; } int uv_timer_stop(uv_timer_t* handle) { if (!uv__is_active(handle)) return 0; heap_remove((struct heap*) &handle->loop->timer_heap, (struct heap_node*) &handle->heap_node, timer_less_than); uv__handle_stop(handle); return 0; } int uv_timer_again(uv_timer_t* handle) { if (handle->timer_cb == NULL) return -EINVAL; if (handle->repeat) { uv_timer_stop(handle); uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); } return 0; } void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) { handle->repeat = repeat; } uint64_t uv_timer_get_repeat(const uv_timer_t* handle) { return handle->repeat; } int uv__next_timeout(const uv_loop_t* loop) { const struct heap_node* heap_node; const uv_timer_t* handle; uint64_t diff; heap_node = heap_min((const struct heap*) &loop->timer_heap); if (heap_node == NULL) return -1; /* block indefinitely */ handle = container_of(heap_node, const uv_timer_t, heap_node); if (handle->timeout <= loop->time) return 0; diff = handle->timeout - loop->time; if (diff > INT_MAX) diff = INT_MAX; return diff; } void uv__run_timers(uv_loop_t* loop) { struct heap_node* heap_node; uv_timer_t* handle; for (;;) { heap_node = heap_min((struct heap*) &loop->timer_heap); if (heap_node == NULL) break; handle = container_of(heap_node, uv_timer_t, heap_node); if (handle->timeout > loop->time) break; uv_timer_stop(handle); uv_timer_again(handle); handle->timer_cb(handle); } } void uv__timer_close(uv_timer_t* handle) { uv_timer_stop(handle); } MoarVM-2015.11/3rdparty/libuv/src/unix/tty.c0000644000175000017500000001316212502366750017510 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include "spinlock.h" #include #include #include #include #include static int orig_termios_fd = -1; static struct termios orig_termios; static uv_spinlock_t termios_spinlock = UV_SPINLOCK_INITIALIZER; int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) { int flags; int newfd; int r; flags = 0; newfd = -1; uv__stream_init(loop, (uv_stream_t*) tty, UV_TTY); /* Reopen the file descriptor when it refers to a tty. This lets us put the * tty in non-blocking mode without affecting other processes that share it * with us. * * Example: `node | cat` - if we put our fd 0 in non-blocking mode, it also * affects fd 1 of `cat` because both file descriptors refer to the same * struct file in the kernel. When we reopen our fd 0, it points to a * different struct file, hence changing its properties doesn't affect * other processes. */ if (isatty(fd)) { r = uv__open_cloexec("/dev/tty", O_RDWR); if (r < 0) { /* fallback to using blocking writes */ if (!readable) flags |= UV_STREAM_BLOCKING; goto skip; } newfd = r; r = uv__dup2_cloexec(newfd, fd); if (r < 0 && r != -EINVAL) { /* EINVAL means newfd == fd which could conceivably happen if another * thread called close(fd) between our calls to isatty() and open(). * That's a rather unlikely event but let's handle it anyway. */ uv__close(newfd); return r; } fd = newfd; } skip: #if defined(__APPLE__) r = uv__stream_try_select((uv_stream_t*) tty, &fd); if (r) { if (newfd != -1) uv__close(newfd); return r; } #endif if (readable) flags |= UV_STREAM_READABLE; else flags |= UV_STREAM_WRITABLE; if (!(flags & UV_STREAM_BLOCKING)) uv__nonblock(fd, 1); uv__stream_open((uv_stream_t*) tty, fd, flags); tty->mode = 0; return 0; } int uv_tty_set_mode(uv_tty_t* tty, int mode) { struct termios raw; int fd; fd = uv__stream_fd(tty); if (mode && tty->mode == 0) { /* on */ if (tcgetattr(fd, &tty->orig_termios)) return -errno; /* This is used for uv_tty_reset_mode() */ uv_spinlock_lock(&termios_spinlock); if (orig_termios_fd == -1) { orig_termios = tty->orig_termios; orig_termios_fd = fd; } uv_spinlock_unlock(&termios_spinlock); raw = tty->orig_termios; cfmakeraw(&raw); /* Put terminal in raw mode after draining */ if (tcsetattr(fd, TCSADRAIN, &raw)) return -errno; tty->mode = 1; } else if (mode == 0 && tty->mode) { /* off */ /* Put terminal in original mode after flushing */ if (tcsetattr(fd, TCSAFLUSH, &tty->orig_termios)) return -errno; tty->mode = 0; } return 0; } int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { struct winsize ws; if (ioctl(uv__stream_fd(tty), TIOCGWINSZ, &ws)) return -errno; *width = ws.ws_col; *height = ws.ws_row; return 0; } uv_handle_type uv_guess_handle(uv_file file) { struct sockaddr sa; struct stat s; socklen_t len; int type; if (file < 0) return UV_UNKNOWN_HANDLE; if (isatty(file)) return UV_TTY; if (fstat(file, &s)) return UV_UNKNOWN_HANDLE; if (S_ISREG(s.st_mode)) return UV_FILE; if (S_ISCHR(s.st_mode)) return UV_FILE; /* XXX UV_NAMED_PIPE? */ if (S_ISFIFO(s.st_mode)) return UV_NAMED_PIPE; if (!S_ISSOCK(s.st_mode)) return UV_UNKNOWN_HANDLE; len = sizeof(type); if (getsockopt(file, SOL_SOCKET, SO_TYPE, &type, &len)) return UV_UNKNOWN_HANDLE; len = sizeof(sa); if (getsockname(file, &sa, &len)) return UV_UNKNOWN_HANDLE; if (type == SOCK_DGRAM) if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) return UV_UDP; if (type == SOCK_STREAM) { if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) return UV_TCP; if (sa.sa_family == AF_UNIX) return UV_NAMED_PIPE; } return UV_UNKNOWN_HANDLE; } /* This function is async signal-safe, meaning that it's safe to call from * inside a signal handler _unless_ execution was inside uv_tty_set_mode()'s * critical section when the signal was raised. */ int uv_tty_reset_mode(void) { int err; if (!uv_spinlock_trylock(&termios_spinlock)) return -EBUSY; /* In uv_tty_set_mode(). */ err = 0; if (orig_termios_fd != -1) if (tcsetattr(orig_termios_fd, TCSANOW, &orig_termios)) err = -errno; uv_spinlock_unlock(&termios_spinlock); return err; } MoarVM-2015.11/3rdparty/libuv/src/unix/udp.c0000644000175000017500000004563312456307253017471 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP) # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP #endif #if defined(IPV6_LEAVE_GROUP) && !defined(IPV6_DROP_MEMBERSHIP) # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP #endif static void uv__udp_run_completed(uv_udp_t* handle); static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents); static void uv__udp_recvmsg(uv_udp_t* handle); static void uv__udp_sendmsg(uv_udp_t* handle); static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain, unsigned int flags); void uv__udp_close(uv_udp_t* handle) { uv__io_close(handle->loop, &handle->io_watcher); uv__handle_stop(handle); if (handle->io_watcher.fd != -1) { uv__close(handle->io_watcher.fd); handle->io_watcher.fd = -1; } } void uv__udp_finish_close(uv_udp_t* handle) { uv_udp_send_t* req; QUEUE* q; assert(!uv__io_active(&handle->io_watcher, UV__POLLIN | UV__POLLOUT)); assert(handle->io_watcher.fd == -1); while (!QUEUE_EMPTY(&handle->write_queue)) { q = QUEUE_HEAD(&handle->write_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_udp_send_t, queue); req->status = -ECANCELED; QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); } uv__udp_run_completed(handle); assert(handle->send_queue_size == 0); assert(handle->send_queue_count == 0); /* Now tear down the handle. */ handle->recv_cb = NULL; handle->alloc_cb = NULL; /* but _do not_ touch close_cb */ } static void uv__udp_run_completed(uv_udp_t* handle) { uv_udp_send_t* req; QUEUE* q; while (!QUEUE_EMPTY(&handle->write_completed_queue)) { q = QUEUE_HEAD(&handle->write_completed_queue); QUEUE_REMOVE(q); req = QUEUE_DATA(q, uv_udp_send_t, queue); uv__req_unregister(handle->loop, req); handle->send_queue_size -= uv__count_bufs(req->bufs, req->nbufs); handle->send_queue_count--; if (req->bufs != req->bufsml) free(req->bufs); req->bufs = NULL; if (req->send_cb == NULL) continue; /* req->status >= 0 == bytes written * req->status < 0 == errno */ if (req->status >= 0) req->send_cb(req, 0); else req->send_cb(req, req->status); } if (QUEUE_EMPTY(&handle->write_queue)) { /* Pending queue and completion queue empty, stop watcher. */ uv__io_stop(handle->loop, &handle->io_watcher, UV__POLLOUT); if (!uv__io_active(&handle->io_watcher, UV__POLLIN)) uv__handle_stop(handle); } } static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { uv_udp_t* handle; handle = container_of(w, uv_udp_t, io_watcher); assert(handle->type == UV_UDP); if (revents & UV__POLLIN) uv__udp_recvmsg(handle); if (revents & UV__POLLOUT) { uv__udp_sendmsg(handle); uv__udp_run_completed(handle); } } static void uv__udp_recvmsg(uv_udp_t* handle) { struct sockaddr_storage peer; struct msghdr h; ssize_t nread; uv_buf_t buf; int flags; int count; assert(handle->recv_cb != NULL); assert(handle->alloc_cb != NULL); /* Prevent loop starvation when the data comes in as fast as (or faster than) * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. */ count = 32; memset(&h, 0, sizeof(h)); h.msg_name = &peer; do { handle->alloc_cb((uv_handle_t*) handle, 64 * 1024, &buf); if (buf.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); return; } assert(buf.base != NULL); h.msg_namelen = sizeof(peer); h.msg_iov = (void*) &buf; h.msg_iovlen = 1; do { nread = recvmsg(handle->io_watcher.fd, &h, 0); } while (nread == -1 && errno == EINTR); if (nread == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) handle->recv_cb(handle, 0, &buf, NULL, 0); else handle->recv_cb(handle, -errno, &buf, NULL, 0); } else { const struct sockaddr *addr; if (h.msg_namelen == 0) addr = NULL; else addr = (const struct sockaddr*) &peer; flags = 0; if (h.msg_flags & MSG_TRUNC) flags |= UV_UDP_PARTIAL; handle->recv_cb(handle, nread, &buf, addr, flags); } } /* recv_cb callback may decide to pause or close the handle */ while (nread != -1 && count-- > 0 && handle->io_watcher.fd != -1 && handle->recv_cb != NULL); } static void uv__udp_sendmsg(uv_udp_t* handle) { uv_udp_send_t* req; QUEUE* q; struct msghdr h; ssize_t size; while (!QUEUE_EMPTY(&handle->write_queue)) { q = QUEUE_HEAD(&handle->write_queue); assert(q != NULL); req = QUEUE_DATA(q, uv_udp_send_t, queue); assert(req != NULL); memset(&h, 0, sizeof h); h.msg_name = &req->addr; h.msg_namelen = (req->addr.ss_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); h.msg_iov = (struct iovec*) req->bufs; h.msg_iovlen = req->nbufs; do { size = sendmsg(handle->io_watcher.fd, &h, 0); } while (size == -1 && errno == EINTR); if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) break; req->status = (size == -1 ? -errno : size); /* Sending a datagram is an atomic operation: either all data * is written or nothing is (and EMSGSIZE is raised). That is * why we don't handle partial writes. Just pop the request * off the write queue and onto the completed queue, done. */ QUEUE_REMOVE(&req->queue); QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); uv__io_feed(handle->loop, &handle->io_watcher); } } /* On the BSDs, SO_REUSEPORT implies SO_REUSEADDR but with some additional * refinements for programs that use multicast. * * Linux as of 3.9 has a SO_REUSEPORT socket option but with semantics that * are different from the BSDs: it _shares_ the port rather than steal it * from the current listener. While useful, it's not something we can emulate * on other platforms so we don't enable it. */ static int uv__set_reuse(int fd) { int yes; #if defined(SO_REUSEPORT) && !defined(__linux__) yes = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) return -errno; #else yes = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) return -errno; #endif return 0; } int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; int yes; int fd; err = -EINVAL; fd = -1; /* Check for bad flags. */ if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR)) return -EINVAL; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) return -EINVAL; fd = handle->io_watcher.fd; if (fd == -1) { err = uv__socket(addr->sa_family, SOCK_DGRAM, 0); if (err < 0) return err; fd = err; handle->io_watcher.fd = fd; } if (flags & UV_UDP_REUSEADDR) { err = uv__set_reuse(fd); if (err) goto out; } if (flags & UV_UDP_IPV6ONLY) { #ifdef IPV6_V6ONLY yes = 1; if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) { err = -errno; goto out; } #else err = -ENOTSUP; goto out; #endif } if (bind(fd, addr, addrlen)) { err = -errno; goto out; } if (addr->sa_family == AF_INET6) handle->flags |= UV_HANDLE_IPV6; return 0; out: uv__close(handle->io_watcher.fd); handle->io_watcher.fd = -1; return err; } static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain, unsigned int flags) { unsigned char taddr[sizeof(struct sockaddr_in6)]; socklen_t addrlen; if (handle->io_watcher.fd != -1) return 0; switch (domain) { case AF_INET: { struct sockaddr_in* addr = (void*)&taddr; memset(addr, 0, sizeof *addr); addr->sin_family = AF_INET; addr->sin_addr.s_addr = INADDR_ANY; addrlen = sizeof *addr; break; } case AF_INET6: { struct sockaddr_in6* addr = (void*)&taddr; memset(addr, 0, sizeof *addr); addr->sin6_family = AF_INET6; addr->sin6_addr = in6addr_any; addrlen = sizeof *addr; break; } default: assert(0 && "unsupported address family"); abort(); } return uv__udp_bind(handle, (const struct sockaddr*) &taddr, addrlen, flags); } int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb) { int err; int empty_queue; assert(nbufs > 0); err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; /* It's legal for send_queue_count > 0 even when the write_queue is empty; * it means there are error-state requests in the write_completed_queue that * will touch up send_queue_size/count later. */ empty_queue = (handle->send_queue_count == 0); uv__req_init(handle->loop, req, UV_UDP_SEND); assert(addrlen <= sizeof(req->addr)); memcpy(&req->addr, addr, addrlen); req->send_cb = send_cb; req->handle = handle; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(bufs[0])); if (req->bufs == NULL) return -ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs); handle->send_queue_count++; QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue); uv__handle_start(handle); if (empty_queue) uv__udp_sendmsg(handle); else uv__io_start(handle->loop, &handle->io_watcher, UV__POLLOUT); return 0; } int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen) { int err; struct msghdr h; ssize_t size; assert(nbufs > 0); /* already sending a message */ if (handle->send_queue_count != 0) return -EAGAIN; err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; memset(&h, 0, sizeof h); h.msg_name = (struct sockaddr*) addr; h.msg_namelen = addrlen; h.msg_iov = (struct iovec*) bufs; h.msg_iovlen = nbufs; do { size = sendmsg(handle->io_watcher.fd, &h, 0); } while (size == -1 && errno == EINTR); if (size == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) return -EAGAIN; else return -errno; } return size; } static int uv__udp_set_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, uv_membership membership) { struct ip_mreq mreq; int optname; int err; memset(&mreq, 0, sizeof mreq); if (interface_addr) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; switch (membership) { case UV_JOIN_GROUP: optname = IP_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IP_DROP_MEMBERSHIP; break; default: return -EINVAL; } if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, optname, &mreq, sizeof(mreq))) { return -errno; } return 0; } static int uv__udp_set_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, uv_membership membership) { int optname; struct ipv6_mreq mreq; struct sockaddr_in6 addr6; memset(&mreq, 0, sizeof mreq); if (interface_addr) { if (uv_ip6_addr(interface_addr, 0, &addr6)) return -EINVAL; mreq.ipv6mr_interface = addr6.sin6_scope_id; } else { mreq.ipv6mr_interface = 0; } mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; switch (membership) { case UV_JOIN_GROUP: optname = IPV6_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IPV6_DROP_MEMBERSHIP; break; default: return -EINVAL; } if (setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, optname, &mreq, sizeof(mreq))) { return -errno; } return 0; } int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP); handle->alloc_cb = NULL; handle->recv_cb = NULL; handle->send_queue_size = 0; handle->send_queue_count = 0; uv__io_init(&handle->io_watcher, uv__udp_io, -1); QUEUE_INIT(&handle->write_queue); QUEUE_INIT(&handle->write_completed_queue); return 0; } int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { int err; /* Check for already active socket. */ if (handle->io_watcher.fd != -1) return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */ err = uv__set_reuse(sock); if (err) return err; handle->io_watcher.fd = sock; return 0; } int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) { int err; struct sockaddr_in addr4; struct sockaddr_in6 addr6; if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) { err = uv__udp_maybe_deferred_bind(handle, AF_INET, UV_UDP_REUSEADDR); if (err) return err; return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); } else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) { err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR); if (err) return err; return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); } else { return -EINVAL; } } static int uv__setsockopt_maybe_char(uv_udp_t* handle, int option, int val) { #if defined(__sun) || defined(_AIX) char arg = val; #else int arg = val; #endif if (val < 0 || val > 255) return -EINVAL; if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, option, &arg, sizeof(arg))) return -errno; return 0; } int uv_udp_set_broadcast(uv_udp_t* handle, int on) { if (setsockopt(handle->io_watcher.fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))) { return -errno; } return 0; } int uv_udp_set_ttl(uv_udp_t* handle, int ttl) { if (ttl < 1 || ttl > 255) return -EINVAL; if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl))) return -errno; return 0; } int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) { return uv__setsockopt_maybe_char(handle, IP_MULTICAST_TTL, ttl); } int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) { return uv__setsockopt_maybe_char(handle, IP_MULTICAST_LOOP, on); } int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { struct sockaddr_storage addr_st; struct sockaddr_in* addr4; struct sockaddr_in6* addr6; addr4 = (struct sockaddr_in*) &addr_st; addr6 = (struct sockaddr_in6*) &addr_st; if (!interface_addr) { memset(&addr_st, 0, sizeof addr_st); if (handle->flags & UV_HANDLE_IPV6) { addr_st.ss_family = AF_INET6; addr6->sin6_scope_id = 0; } else { addr_st.ss_family = AF_INET; addr4->sin_addr.s_addr = htonl(INADDR_ANY); } } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { /* nothing, address was parsed */ } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { /* nothing, address was parsed */ } else { return -EINVAL; } if (addr_st.ss_family == AF_INET) { if (setsockopt(handle->io_watcher.fd, IPPROTO_IP, IP_MULTICAST_IF, (void*) &addr4->sin_addr, sizeof(addr4->sin_addr)) == -1) { return -errno; } } else if (addr_st.ss_family == AF_INET6) { if (setsockopt(handle->io_watcher.fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &addr6->sin6_scope_id, sizeof(addr6->sin6_scope_id)) == -1) { return -errno; } } else { assert(0 && "unexpected address family"); abort(); } return 0; } int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { socklen_t socklen; if (handle->io_watcher.fd == -1) return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ /* sizeof(socklen_t) != sizeof(int) on some systems. */ socklen = (socklen_t) *namelen; if (getsockname(handle->io_watcher.fd, name, &socklen)) return -errno; *namelen = (int) socklen; return 0; } int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { int err; if (alloc_cb == NULL || recv_cb == NULL) return -EINVAL; if (uv__io_active(&handle->io_watcher, UV__POLLIN)) return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */ err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0); if (err) return err; handle->alloc_cb = alloc_cb; handle->recv_cb = recv_cb; uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN); uv__handle_start(handle); return 0; } int uv__udp_recv_stop(uv_udp_t* handle) { uv__io_stop(handle->loop, &handle->io_watcher, UV__POLLIN); if (!uv__io_active(&handle->io_watcher, UV__POLLOUT)) uv__handle_stop(handle); handle->alloc_cb = NULL; handle->recv_cb = NULL; return 0; } MoarVM-2015.11/3rdparty/libuv/src/unix/uv-dtrace.d0000644000175000017500000000235212456307253020563 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ provider uv { probe tick__start(void* loop, int mode); probe tick__stop(void* loop, int mode); }; MoarVM-2015.11/3rdparty/libuv/src/uv-common.c0000644000175000017500000002405212502366750017625 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "uv-common.h" #include #include #include /* NULL */ #include /* malloc */ #include /* memset */ #if !defined(_WIN32) # include /* if_nametoindex */ #endif #define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t); size_t uv_handle_size(uv_handle_type type) { switch (type) { UV_HANDLE_TYPE_MAP(XX) default: return -1; } } size_t uv_req_size(uv_req_type type) { switch(type) { UV_REQ_TYPE_MAP(XX) default: return -1; } } #undef XX size_t uv_loop_size(void) { return sizeof(uv_loop_t); } uv_buf_t uv_buf_init(char* base, unsigned int len) { uv_buf_t buf; buf.base = base; buf.len = len; return buf; } #define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name; const char* uv_err_name(int err) { switch (err) { UV_ERRNO_MAP(UV_ERR_NAME_GEN) default: assert(0); return NULL; } } #undef UV_ERR_NAME_GEN #define UV_STRERROR_GEN(name, msg) case UV_ ## name: return msg; const char* uv_strerror(int err) { switch (err) { UV_ERRNO_MAP(UV_STRERROR_GEN) default: return "Unknown system error"; } } #undef UV_STRERROR_GEN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) { memset(addr, 0, sizeof(*addr)); addr->sin_family = AF_INET; addr->sin_port = htons(port); return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr)); } int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) { char address_part[40]; size_t address_part_size; const char* zone_index; memset(addr, 0, sizeof(*addr)); addr->sin6_family = AF_INET6; addr->sin6_port = htons(port); zone_index = strchr(ip, '%'); if (zone_index != NULL) { address_part_size = zone_index - ip; if (address_part_size >= sizeof(address_part)) address_part_size = sizeof(address_part) - 1; memcpy(address_part, ip, address_part_size); address_part[address_part_size] = '\0'; ip = address_part; zone_index++; /* skip '%' */ /* NOTE: unknown interface (id=0) is silently ignored */ #ifdef _WIN32 addr->sin6_scope_id = atoi(zone_index); #else addr->sin6_scope_id = if_nametoindex(zone_index); #endif } return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr); } int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) { return uv_inet_ntop(AF_INET, &src->sin_addr, dst, size); } int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) { return uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size); } int uv_tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int flags) { unsigned int addrlen; if (handle->type != UV_TCP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__tcp_bind(handle, addr, addrlen, flags); } int uv_udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int flags) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__udp_bind(handle, addr, addrlen, flags); } int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, uv_connect_cb cb) { unsigned int addrlen; if (handle->type != UV_TCP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__tcp_connect(req, handle, addr, addrlen, cb); } int uv_udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, uv_udp_send_cb send_cb) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__udp_send(req, handle, bufs, nbufs, addr, addrlen, send_cb); } int uv_udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr) { unsigned int addrlen; if (handle->type != UV_UDP) return UV_EINVAL; if (addr->sa_family == AF_INET) addrlen = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else return UV_EINVAL; return uv__udp_try_send(handle, bufs, nbufs, addr, addrlen); } int uv_udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { if (handle->type != UV_UDP || alloc_cb == NULL || recv_cb == NULL) return UV_EINVAL; else return uv__udp_recv_start(handle, alloc_cb, recv_cb); } int uv_udp_recv_stop(uv_udp_t* handle) { if (handle->type != UV_UDP) return UV_EINVAL; else return uv__udp_recv_stop(handle); } void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) { QUEUE* q; uv_handle_t* h; QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (h->flags & UV__HANDLE_INTERNAL) continue; walk_cb(h, arg); } } #ifndef NDEBUG static void uv__print_handles(uv_loop_t* loop, int only_active) { const char* type; QUEUE* q; uv_handle_t* h; if (loop == NULL) loop = uv_default_loop(); QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (only_active && !uv__is_active(h)) continue; switch (h->type) { #define X(uc, lc) case UV_##uc: type = #lc; break; UV_HANDLE_TYPE_MAP(X) #undef X default: type = ""; } fprintf(stderr, "[%c%c%c] %-8s %p\n", "R-"[!(h->flags & UV__HANDLE_REF)], "A-"[!(h->flags & UV__HANDLE_ACTIVE)], "I-"[!(h->flags & UV__HANDLE_INTERNAL)], type, (void*)h); } } void uv_print_all_handles(uv_loop_t* loop) { uv__print_handles(loop, 0); } void uv_print_active_handles(uv_loop_t* loop) { uv__print_handles(loop, 1); } #endif void uv_ref(uv_handle_t* handle) { uv__handle_ref(handle); } void uv_unref(uv_handle_t* handle) { uv__handle_unref(handle); } int uv_has_ref(const uv_handle_t* handle) { return uv__has_ref(handle); } void uv_stop(uv_loop_t* loop) { loop->stop_flag = 1; } uint64_t uv_now(const uv_loop_t* loop) { return loop->time; } size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { unsigned int i; size_t bytes; bytes = 0; for (i = 0; i < nbufs; i++) bytes += (size_t) bufs[i].len; return bytes; } int uv_recv_buffer_size(uv_handle_t* handle, int* value) { return uv__socket_sockopt(handle, SO_RCVBUF, value); } int uv_send_buffer_size(uv_handle_t* handle, int *value) { return uv__socket_sockopt(handle, SO_SNDBUF, value); } int uv_fs_event_getpath(uv_fs_event_t* handle, char* buf, size_t* len) { size_t required_len; if (!uv__is_active(handle)) { *len = 0; return UV_EINVAL; } required_len = strlen(handle->path) + 1; if (required_len > *len) { *len = required_len; return UV_ENOBUFS; } memcpy(buf, handle->path, required_len); *len = required_len; return 0; } void uv__fs_scandir_cleanup(uv_fs_t* req) { uv__dirent_t** dents; dents = req->ptr; if (req->nbufs > 0 && req->nbufs != (unsigned int) req->result) req->nbufs--; for (; req->nbufs < (unsigned int) req->result; req->nbufs++) free(dents[req->nbufs]); } int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent) { uv__dirent_t** dents; uv__dirent_t* dent; dents = req->ptr; /* Free previous entity */ if (req->nbufs > 0) free(dents[req->nbufs - 1]); /* End was already reached */ if (req->nbufs == (unsigned int) req->result) { free(dents); req->ptr = NULL; return UV_EOF; } dent = dents[req->nbufs++]; ent->name = dent->d_name; #ifdef HAVE_DIRENT_TYPES switch (dent->d_type) { case UV__DT_DIR: ent->type = UV_DIRENT_DIR; break; case UV__DT_FILE: ent->type = UV_DIRENT_FILE; break; case UV__DT_LINK: ent->type = UV_DIRENT_LINK; break; case UV__DT_FIFO: ent->type = UV_DIRENT_FIFO; break; case UV__DT_SOCKET: ent->type = UV_DIRENT_SOCKET; break; case UV__DT_CHAR: ent->type = UV_DIRENT_CHAR; break; case UV__DT_BLOCK: ent->type = UV_DIRENT_BLOCK; break; default: ent->type = UV_DIRENT_UNKNOWN; } #else ent->type = UV_DIRENT_UNKNOWN; #endif return 0; } MoarVM-2015.11/3rdparty/libuv/src/uv-common.h0000644000175000017500000002117312502366750017633 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* * This file is private to libuv. It provides common functionality to both * Windows and Unix backends. */ #ifndef UV_COMMON_H_ #define UV_COMMON_H_ #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #include "uv.h" #include "tree.h" #include "queue.h" #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define container_of(ptr, type, member) \ ((type *) ((char *) (ptr) - offsetof(type, member))) #ifndef _WIN32 enum { UV__HANDLE_INTERNAL = 0x8000, UV__HANDLE_ACTIVE = 0x4000, UV__HANDLE_REF = 0x2000, UV__HANDLE_CLOSING = 0 /* no-op on unix */ }; #else # define UV__HANDLE_INTERNAL 0x80 # define UV__HANDLE_ACTIVE 0x40 # define UV__HANDLE_REF 0x20 # define UV__HANDLE_CLOSING 0x01 #endif int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags); int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb); int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags); int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb); int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen); int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloccb, uv_udp_recv_cb recv_cb); int uv__udp_recv_stop(uv_udp_t* handle); void uv__fs_poll_close(uv_fs_poll_t* handle); int uv__getaddrinfo_translate_error(int sys_err); /* EAI_* error. */ void uv__work_submit(uv_loop_t* loop, struct uv__work *w, void (*work)(struct uv__work *w), void (*done)(struct uv__work *w, int status)); void uv__work_done(uv_async_t* handle); size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs); int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value); void uv__fs_scandir_cleanup(uv_fs_t* req); #define uv__has_active_reqs(loop) \ (QUEUE_EMPTY(&(loop)->active_reqs) == 0) #define uv__req_register(loop, req) \ do { \ QUEUE_INSERT_TAIL(&(loop)->active_reqs, &(req)->active_queue); \ } \ while (0) #define uv__req_unregister(loop, req) \ do { \ assert(uv__has_active_reqs(loop)); \ QUEUE_REMOVE(&(req)->active_queue); \ } \ while (0) #define uv__has_active_handles(loop) \ ((loop)->active_handles > 0) #define uv__active_handle_add(h) \ do { \ (h)->loop->active_handles++; \ } \ while (0) #define uv__active_handle_rm(h) \ do { \ (h)->loop->active_handles--; \ } \ while (0) #define uv__is_active(h) \ (((h)->flags & UV__HANDLE_ACTIVE) != 0) #define uv__is_closing(h) \ (((h)->flags & (UV_CLOSING | UV_CLOSED)) != 0) #define uv__handle_start(h) \ do { \ assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) break; \ (h)->flags |= UV__HANDLE_ACTIVE; \ if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_add(h); \ } \ while (0) #define uv__handle_stop(h) \ do { \ assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \ if (((h)->flags & UV__HANDLE_ACTIVE) == 0) break; \ (h)->flags &= ~UV__HANDLE_ACTIVE; \ if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_rm(h); \ } \ while (0) #define uv__handle_ref(h) \ do { \ if (((h)->flags & UV__HANDLE_REF) != 0) break; \ (h)->flags |= UV__HANDLE_REF; \ if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \ } \ while (0) #define uv__handle_unref(h) \ do { \ if (((h)->flags & UV__HANDLE_REF) == 0) break; \ (h)->flags &= ~UV__HANDLE_REF; \ if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \ } \ while (0) #define uv__has_ref(h) \ (((h)->flags & UV__HANDLE_REF) != 0) #if defined(_WIN32) # define uv__handle_platform_init(h) #else # define uv__handle_platform_init(h) ((h)->next_closing = NULL) #endif #define uv__handle_init(loop_, h, type_) \ do { \ (h)->loop = (loop_); \ (h)->type = (type_); \ (h)->flags = UV__HANDLE_REF; /* Ref the loop when active. */ \ QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); \ uv__handle_platform_init(h); \ } \ while (0) #endif /* UV_COMMON_H_ */ MoarVM-2015.11/3rdparty/libuv/src/version.c0000644000175000017500000000354112502366750017372 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #define UV_VERSION ((UV_VERSION_MAJOR << 16) | \ (UV_VERSION_MINOR << 8) | \ (UV_VERSION_PATCH)) #define UV_STRINGIFY(v) UV_STRINGIFY_HELPER(v) #define UV_STRINGIFY_HELPER(v) #v #define UV_VERSION_STRING_BASE UV_STRINGIFY(UV_VERSION_MAJOR) "." \ UV_STRINGIFY(UV_VERSION_MINOR) "." \ UV_STRINGIFY(UV_VERSION_PATCH) #if UV_VERSION_IS_RELEASE # define UV_VERSION_STRING UV_VERSION_STRING_BASE #else # define UV_VERSION_STRING UV_VERSION_STRING_BASE "-" UV_VERSION_SUFFIX #endif unsigned int uv_version(void) { return UV_VERSION; } const char* uv_version_string(void) { return UV_VERSION_STRING; } MoarVM-2015.11/3rdparty/libuv/src/win/async.c0000644000175000017500000000551212456307253017620 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "atomicops-inl.h" #include "handle-inl.h" #include "req-inl.h" void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle) { if (handle->flags & UV__HANDLE_CLOSING && !handle->async_sent) { assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { uv_req_t* req; uv__handle_init(loop, (uv_handle_t*) handle, UV_ASYNC); handle->async_sent = 0; handle->async_cb = async_cb; req = &handle->async_req; uv_req_init(loop, req); req->type = UV_WAKEUP; req->data = handle; uv__handle_start(handle); return 0; } void uv_async_close(uv_loop_t* loop, uv_async_t* handle) { if (!((uv_async_t*)handle)->async_sent) { uv_want_endgame(loop, (uv_handle_t*) handle); } uv__handle_closing(handle); } int uv_async_send(uv_async_t* handle) { uv_loop_t* loop = handle->loop; if (handle->type != UV_ASYNC) { /* Can't set errno because that's not thread-safe. */ return -1; } /* The user should make sure never to call uv_async_send to a closing */ /* or closed handle. */ assert(!(handle->flags & UV__HANDLE_CLOSING)); if (!uv__atomic_exchange_set(&handle->async_sent)) { POST_COMPLETION_FOR_REQ(loop, &handle->async_req); } return 0; } void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, uv_req_t* req) { assert(handle->type == UV_ASYNC); assert(req->type == UV_WAKEUP); handle->async_sent = 0; if (handle->flags & UV__HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*)handle); } else if (handle->async_cb != NULL) { handle->async_cb(handle); } } MoarVM-2015.11/3rdparty/libuv/src/win/atomicops-inl.h0000644000175000017500000000417312456307253021270 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_ATOMICOPS_INL_H_ #define UV_WIN_ATOMICOPS_INL_H_ #include "uv.h" /* Atomic set operation on char */ #ifdef _MSC_VER /* MSVC */ /* _InterlockedOr8 is supported by MSVC on x32 and x64. It is slightly less */ /* efficient than InterlockedExchange, but InterlockedExchange8 does not */ /* exist, and interlocked operations on larger targets might require the */ /* target to be aligned. */ #pragma intrinsic(_InterlockedOr8) static char __declspec(inline) uv__atomic_exchange_set(char volatile* target) { return _InterlockedOr8(target, 1); } #else /* GCC */ /* Mingw-32 version, hopefully this works for 64-bit gcc as well. */ static inline char uv__atomic_exchange_set(char volatile* target) { const char one = 1; char old_value; __asm__ __volatile__ ("lock xchgb %0, %1\n\t" : "=r"(old_value), "=m"(*target) : "0"(one), "m"(*target) : "memory"); return old_value; } #endif #endif /* UV_WIN_ATOMICOPS_INL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/core.c0000644000175000017500000003041712502366750017434 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) #include #endif #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" static uv_loop_t default_loop_struct; static uv_loop_t* default_loop_ptr; /* uv_once intialization guards */ static uv_once_t uv_init_guard_ = UV_ONCE_INIT; #if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) /* Our crt debug report handler allows us to temporarily disable asserts * just for the current thread. */ UV_THREAD_LOCAL int uv__crt_assert_enabled = TRUE; static int uv__crt_dbg_report_handler(int report_type, char *message, int *ret_val) { if (uv__crt_assert_enabled || report_type != _CRT_ASSERT) return FALSE; if (ret_val) { /* Set ret_val to 0 to continue with normal execution. * Set ret_val to 1 to trigger a breakpoint. */ if(IsDebuggerPresent()) *ret_val = 1; else *ret_val = 0; } /* Don't call _CrtDbgReport. */ return TRUE; } #else UV_THREAD_LOCAL int uv__crt_assert_enabled = FALSE; #endif #if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 static void uv__crt_invalid_parameter_handler(const wchar_t* expression, const wchar_t* function, const wchar_t * file, unsigned int line, uintptr_t reserved) { /* No-op. */ } #endif static void uv_init(void) { /* Tell Windows that we will handle critical errors. */ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); /* Tell the CRT to not exit the application when an invalid parameter is * passed. The main issue is that invalid FDs will trigger this behavior. */ #if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 _set_invalid_parameter_handler(uv__crt_invalid_parameter_handler); #endif /* We also need to setup our debug report handler because some CRT * functions (eg _get_osfhandle) raise an assert when called with invalid * FDs even though they return the proper error code in the release build. */ #if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) _CrtSetReportHook(uv__crt_dbg_report_handler); #endif /* Fetch winapi function pointers. This must be done first because other * intialization code might need these function pointers to be loaded. */ uv_winapi_init(); /* Initialize winsock */ uv_winsock_init(); /* Initialize FS */ uv_fs_init(); /* Initialize signal stuff */ uv_signals_init(); /* Initialize console */ uv_console_init(); /* Initialize utilities */ uv__util_init(); } int uv_loop_init(uv_loop_t* loop) { /* Initialize libuv itself first */ uv__once_init(); /* Create an I/O completion port */ loop->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1); if (loop->iocp == NULL) return uv_translate_sys_error(GetLastError()); /* To prevent uninitialized memory access, loop->time must be intialized * to zero before calling uv_update_time for the first time. */ loop->time = 0; uv_update_time(loop); QUEUE_INIT(&loop->wq); QUEUE_INIT(&loop->handle_queue); QUEUE_INIT(&loop->active_reqs); loop->active_handles = 0; loop->pending_reqs_tail = NULL; loop->endgame_handles = NULL; RB_INIT(&loop->timers); loop->check_handles = NULL; loop->prepare_handles = NULL; loop->idle_handles = NULL; loop->next_prepare_handle = NULL; loop->next_check_handle = NULL; loop->next_idle_handle = NULL; memset(&loop->poll_peer_sockets, 0, sizeof loop->poll_peer_sockets); loop->active_tcp_streams = 0; loop->active_udp_streams = 0; loop->timer_counter = 0; loop->stop_flag = 0; if (uv_mutex_init(&loop->wq_mutex)) abort(); if (uv_async_init(loop, &loop->wq_async, uv__work_done)) abort(); uv__handle_unref(&loop->wq_async); loop->wq_async.flags |= UV__HANDLE_INTERNAL; return 0; } void uv__once_init(void) { uv_once(&uv_init_guard_, uv_init); } uv_loop_t* uv_default_loop(void) { if (default_loop_ptr != NULL) return default_loop_ptr; if (uv_loop_init(&default_loop_struct)) return NULL; default_loop_ptr = &default_loop_struct; return default_loop_ptr; } static void uv__loop_close(uv_loop_t* loop) { size_t i; /* close the async handle without needeing an extra loop iteration */ assert(!loop->wq_async.async_sent); loop->wq_async.close_cb = NULL; uv__handle_closing(&loop->wq_async); uv__handle_close(&loop->wq_async); for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) { SOCKET sock = loop->poll_peer_sockets[i]; if (sock != 0 && sock != INVALID_SOCKET) closesocket(sock); } uv_mutex_lock(&loop->wq_mutex); assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); assert(!uv__has_active_reqs(loop)); uv_mutex_unlock(&loop->wq_mutex); uv_mutex_destroy(&loop->wq_mutex); CloseHandle(loop->iocp); } int uv_loop_close(uv_loop_t* loop) { QUEUE* q; uv_handle_t* h; if (!QUEUE_EMPTY(&(loop)->active_reqs)) return UV_EBUSY; QUEUE_FOREACH(q, &loop->handle_queue) { h = QUEUE_DATA(q, uv_handle_t, handle_queue); if (!(h->flags & UV__HANDLE_INTERNAL)) return UV_EBUSY; } uv__loop_close(loop); #ifndef NDEBUG memset(loop, -1, sizeof(*loop)); #endif if (loop == default_loop_ptr) default_loop_ptr = NULL; return 0; } uv_loop_t* uv_loop_new(void) { uv_loop_t* loop; loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); if (loop == NULL) { return NULL; } if (uv_loop_init(loop)) { free(loop); return NULL; } return loop; } void uv_loop_delete(uv_loop_t* loop) { uv_loop_t* default_loop; int err; default_loop = default_loop_ptr; err = uv_loop_close(loop); assert(err == 0); if (loop != default_loop) free(loop); } int uv_backend_fd(const uv_loop_t* loop) { return -1; } int uv_backend_timeout(const uv_loop_t* loop) { if (loop->stop_flag != 0) return 0; if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) return 0; if (loop->pending_reqs_tail) return 0; if (loop->endgame_handles) return 0; if (loop->idle_handles) return 0; return uv__next_timeout(loop); } static void uv_poll(uv_loop_t* loop, DWORD timeout) { DWORD bytes; ULONG_PTR key; OVERLAPPED* overlapped; uv_req_t* req; GetQueuedCompletionStatus(loop->iocp, &bytes, &key, &overlapped, timeout); if (overlapped) { /* Package was dequeued */ req = uv_overlapped_to_req(overlapped); uv_insert_pending_req(loop, req); /* Some time might have passed waiting for I/O, * so update the loop time here. */ uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatus"); } else if (timeout > 0) { /* GetQueuedCompletionStatus can occasionally return a little early. * Make sure that the desired timeout is reflected in the loop time. */ uv__time_forward(loop, timeout); } } static void uv_poll_ex(uv_loop_t* loop, DWORD timeout) { BOOL success; uv_req_t* req; OVERLAPPED_ENTRY overlappeds[128]; ULONG count; ULONG i; success = pGetQueuedCompletionStatusEx(loop->iocp, overlappeds, ARRAY_SIZE(overlappeds), &count, timeout, FALSE); if (success) { for (i = 0; i < count; i++) { /* Package was dequeued */ req = uv_overlapped_to_req(overlappeds[i].lpOverlapped); uv_insert_pending_req(loop, req); } /* Some time might have passed waiting for I/O, * so update the loop time here. */ uv_update_time(loop); } else if (GetLastError() != WAIT_TIMEOUT) { /* Serious error */ uv_fatal_error(GetLastError(), "GetQueuedCompletionStatusEx"); } else if (timeout > 0) { /* GetQueuedCompletionStatus can occasionally return a little early. * Make sure that the desired timeout is reflected in the loop time. */ uv__time_forward(loop, timeout); } } static int uv__loop_alive(const uv_loop_t* loop) { return loop->active_handles > 0 || !QUEUE_EMPTY(&loop->active_reqs) || loop->endgame_handles != NULL; } int uv_loop_alive(const uv_loop_t* loop) { return uv__loop_alive(loop); } int uv_run(uv_loop_t *loop, uv_run_mode mode) { DWORD timeout; int r; void (*poll)(uv_loop_t* loop, DWORD timeout); if (pGetQueuedCompletionStatusEx) poll = &uv_poll_ex; else poll = &uv_poll; r = uv__loop_alive(loop); if (!r) uv_update_time(loop); while (r != 0 && loop->stop_flag == 0) { uv_update_time(loop); uv_process_timers(loop); uv_process_reqs(loop); uv_idle_invoke(loop); uv_prepare_invoke(loop); timeout = 0; if ((mode & UV_RUN_NOWAIT) == 0) timeout = uv_backend_timeout(loop); (*poll)(loop, timeout); uv_check_invoke(loop); uv_process_endgames(loop); if (mode == UV_RUN_ONCE) { /* UV_RUN_ONCE implies forward progess: at least one callback must have * been invoked when it returns. uv__io_poll() can return without doing * I/O (meaning: no callbacks) when its timeout expires - which means we * have pending timers that satisfy the forward progress constraint. * * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from * the check. */ uv_process_timers(loop); } r = uv__loop_alive(loop); if (mode & (UV_RUN_ONCE | UV_RUN_NOWAIT)) break; } /* The if statement lets the compiler compile it to a conditional store. * Avoids dirtying a cache line. */ if (loop->stop_flag != 0) loop->stop_flag = 0; return r; } int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { uv_os_fd_t fd_out; switch (handle->type) { case UV_TCP: fd_out = (uv_os_fd_t)((uv_tcp_t*) handle)->socket; break; case UV_NAMED_PIPE: fd_out = ((uv_pipe_t*) handle)->handle; break; case UV_TTY: fd_out = ((uv_tty_t*) handle)->handle; break; case UV_UDP: fd_out = (uv_os_fd_t)((uv_udp_t*) handle)->socket; break; case UV_POLL: fd_out = (uv_os_fd_t)((uv_poll_t*) handle)->socket; break; default: return UV_EINVAL; } if (uv_is_closing(handle) || fd_out == INVALID_HANDLE_VALUE) return UV_EBADF; *fd = fd_out; return 0; } int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { int r; int len; SOCKET socket; if (handle == NULL || value == NULL) return UV_EINVAL; if (handle->type == UV_TCP) socket = ((uv_tcp_t*) handle)->socket; else if (handle->type == UV_UDP) socket = ((uv_udp_t*) handle)->socket; else return UV_ENOTSUP; len = sizeof(*value); if (*value == 0) r = getsockopt(socket, SOL_SOCKET, optname, (char*) value, &len); else r = setsockopt(socket, SOL_SOCKET, optname, (const char*) value, len); if (r == SOCKET_ERROR) return uv_translate_sys_error(WSAGetLastError()); return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/dl.c0000644000175000017500000000515612456307253017106 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" static int uv__dlerror(uv_lib_t* lib, int errorno); int uv_dlopen(const char* filename, uv_lib_t* lib) { WCHAR filename_w[32768]; lib->handle = NULL; lib->errmsg = NULL; if (!uv_utf8_to_utf16(filename, filename_w, ARRAY_SIZE(filename_w))) { return uv__dlerror(lib, GetLastError()); } lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (lib->handle == NULL) { return uv__dlerror(lib, GetLastError()); } return 0; } void uv_dlclose(uv_lib_t* lib) { if (lib->errmsg) { LocalFree((void*)lib->errmsg); lib->errmsg = NULL; } if (lib->handle) { /* Ignore errors. No good way to signal them without leaking memory. */ FreeLibrary(lib->handle); lib->handle = NULL; } } int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { *ptr = (void*) GetProcAddress(lib->handle, name); return uv__dlerror(lib, *ptr ? 0 : GetLastError()); } const char* uv_dlerror(const uv_lib_t* lib) { return lib->errmsg ? lib->errmsg : "no error"; } static int uv__dlerror(uv_lib_t* lib, int errorno) { if (lib->errmsg) { LocalFree((void*)lib->errmsg); lib->errmsg = NULL; } if (errorno) { FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&lib->errmsg, 0, NULL); } return errorno ? -1 : 0; } MoarVM-2015.11/3rdparty/libuv/src/win/error.c0000644000175000017500000002013412456307253017631 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include "uv.h" #include "internal.h" /* * Display an error message and abort the event loop. */ void uv_fatal_error(const int errorno, const char* syscall) { char* buf = NULL; const char* errmsg; FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); if (buf) { errmsg = buf; } else { errmsg = "Unknown error"; } /* FormatMessage messages include a newline character already, */ /* so don't add another. */ if (syscall) { fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg); } else { fprintf(stderr, "(%d) %s", errorno, errmsg); } if (buf) { LocalFree(buf); } *((char*)NULL) = 0xff; /* Force debug break */ abort(); } int uv_translate_sys_error(int sys_errno) { if (sys_errno <= 0) { return sys_errno; /* If < 0 then it's already a libuv error. */ } switch (sys_errno) { case ERROR_NOACCESS: return UV_EACCES; case WSAEACCES: return UV_EACCES; case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; case WSAEADDRINUSE: return UV_EADDRINUSE; case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL; case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; case WSAEWOULDBLOCK: return UV_EAGAIN; case WSAEALREADY: return UV_EALREADY; case ERROR_INVALID_FLAGS: return UV_EBADF; case ERROR_INVALID_HANDLE: return UV_EBADF; case ERROR_LOCK_VIOLATION: return UV_EBUSY; case ERROR_PIPE_BUSY: return UV_EBUSY; case ERROR_SHARING_VIOLATION: return UV_EBUSY; case ERROR_OPERATION_ABORTED: return UV_ECANCELED; case WSAEINTR: return UV_ECANCELED; case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; case WSAECONNABORTED: return UV_ECONNABORTED; case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; case WSAECONNREFUSED: return UV_ECONNREFUSED; case ERROR_NETNAME_DELETED: return UV_ECONNRESET; case WSAECONNRESET: return UV_ECONNRESET; case ERROR_ALREADY_EXISTS: return UV_EEXIST; case ERROR_FILE_EXISTS: return UV_EEXIST; case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; case WSAEFAULT: return UV_EFAULT; case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; case ERROR_INVALID_DATA: return UV_EINVAL; case ERROR_INVALID_PARAMETER: return UV_EINVAL; case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; case WSAEINVAL: return UV_EINVAL; case WSAEPFNOSUPPORT: return UV_EINVAL; case WSAESOCKTNOSUPPORT: return UV_EINVAL; case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; case ERROR_BUS_RESET: return UV_EIO; case ERROR_CRC: return UV_EIO; case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; case ERROR_DISK_CORRUPT: return UV_EIO; case ERROR_EOM_OVERFLOW: return UV_EIO; case ERROR_FILEMARK_DETECTED: return UV_EIO; case ERROR_GEN_FAILURE: return UV_EIO; case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; case ERROR_IO_DEVICE: return UV_EIO; case ERROR_NO_DATA_DETECTED: return UV_EIO; case ERROR_NO_SIGNAL_SENT: return UV_EIO; case ERROR_OPEN_FAILED: return UV_EIO; case ERROR_SETMARK_DETECTED: return UV_EIO; case ERROR_SIGNAL_REFUSED: return UV_EIO; case WSAEISCONN: return UV_EISCONN; case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; case WSAEMFILE: return UV_EMFILE; case WSAEMSGSIZE: return UV_EMSGSIZE; case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; case WSAENETUNREACH: return UV_ENETUNREACH; case WSAENOBUFS: return UV_ENOBUFS; case ERROR_DIRECTORY: return UV_ENOENT; case ERROR_FILE_NOT_FOUND: return UV_ENOENT; case ERROR_INVALID_NAME: return UV_ENOENT; case ERROR_INVALID_DRIVE: return UV_ENOENT; case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; case ERROR_MOD_NOT_FOUND: return UV_ENOENT; case ERROR_PATH_NOT_FOUND: return UV_ENOENT; case WSAHOST_NOT_FOUND: return UV_ENOENT; case WSANO_DATA: return UV_ENOENT; case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; case ERROR_OUTOFMEMORY: return UV_ENOMEM; case ERROR_CANNOT_MAKE: return UV_ENOSPC; case ERROR_DISK_FULL: return UV_ENOSPC; case ERROR_EA_TABLE_FULL: return UV_ENOSPC; case ERROR_END_OF_MEDIA: return UV_ENOSPC; case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; case ERROR_NOT_CONNECTED: return UV_ENOTCONN; case WSAENOTCONN: return UV_ENOTCONN; case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; case WSAENOTSOCK: return UV_ENOTSOCK; case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; case ERROR_BROKEN_PIPE: return UV_EOF; case ERROR_ACCESS_DENIED: return UV_EPERM; case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; case ERROR_BAD_PIPE: return UV_EPIPE; case ERROR_NO_DATA: return UV_EPIPE; case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; case WSAESHUTDOWN: return UV_EPIPE; case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; case ERROR_WRITE_PROTECT: return UV_EROFS; case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; case WSAETIMEDOUT: return UV_ETIMEDOUT; case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; case ERROR_INVALID_FUNCTION: return UV_EISDIR; case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG; default: return UV_UNKNOWN; } } MoarVM-2015.11/3rdparty/libuv/src/win/fs-event.c0000644000175000017500000003635312456307253020241 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" const unsigned int uv_directory_watcher_buffer_size = 4096; static void uv_fs_event_queue_readdirchanges(uv_loop_t* loop, uv_fs_event_t* handle) { assert(handle->dir_handle != INVALID_HANDLE_VALUE); assert(!handle->req_pending); memset(&(handle->req.overlapped), 0, sizeof(handle->req.overlapped)); if (!ReadDirectoryChangesW(handle->dir_handle, handle->buffer, uv_directory_watcher_buffer_size, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY, NULL, &handle->req.overlapped, NULL)) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(&handle->req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)&handle->req); } handle->req_pending = 1; } static int uv_split_path(const WCHAR* filename, WCHAR** dir, WCHAR** file) { int len = wcslen(filename); int i = len; while (i > 0 && filename[--i] != '\\' && filename[i] != '/'); if (i == 0) { if (dir) { *dir = (WCHAR*)malloc((MAX_PATH + 1) * sizeof(WCHAR)); if (!*dir) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } if (!GetCurrentDirectoryW(MAX_PATH, *dir)) { free(*dir); *dir = NULL; return -1; } } *file = wcsdup(filename); } else { if (dir) { *dir = (WCHAR*)malloc((i + 1) * sizeof(WCHAR)); if (!*dir) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } wcsncpy(*dir, filename, i); (*dir)[i] = L'\0'; } *file = (WCHAR*)malloc((len - i) * sizeof(WCHAR)); if (!*file) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } wcsncpy(*file, filename + i + 1, len - i - 1); (*file)[len - i - 1] = L'\0'; } return 0; } int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_FS_EVENT); handle->dir_handle = INVALID_HANDLE_VALUE; handle->buffer = NULL; handle->req_pending = 0; handle->filew = NULL; handle->short_filew = NULL; handle->dirw = NULL; uv_req_init(loop, (uv_req_t*)&handle->req); handle->req.type = UV_FS_EVENT_REQ; handle->req.data = handle; return 0; } int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, const char* path, unsigned int flags) { int name_size, is_path_dir; DWORD attr, last_error; WCHAR* dir = NULL, *dir_to_watch, *pathw = NULL; WCHAR short_path[MAX_PATH]; if (uv__is_active(handle)) return UV_EINVAL; handle->cb = cb; handle->path = strdup(path); if (!handle->path) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } uv__handle_start(handle); /* Convert name to UTF16. */ name_size = uv_utf8_to_utf16(path, NULL, 0) * sizeof(WCHAR); pathw = (WCHAR*)malloc(name_size); if (!pathw) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } if (!uv_utf8_to_utf16(path, pathw, name_size / sizeof(WCHAR))) { return uv_translate_sys_error(GetLastError()); } /* Determine whether path is a file or a directory. */ attr = GetFileAttributesW(pathw); if (attr == INVALID_FILE_ATTRIBUTES) { last_error = GetLastError(); goto error; } is_path_dir = (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; if (is_path_dir) { /* path is a directory, so that's the directory that we will watch. */ handle->dirw = pathw; dir_to_watch = pathw; } else { /* * path is a file. So we split path into dir & file parts, and * watch the dir directory. */ /* Convert to short path. */ if (!GetShortPathNameW(pathw, short_path, ARRAY_SIZE(short_path))) { last_error = GetLastError(); goto error; } if (uv_split_path(pathw, &dir, &handle->filew) != 0) { last_error = GetLastError(); goto error; } if (uv_split_path(short_path, NULL, &handle->short_filew) != 0) { last_error = GetLastError(); goto error; } dir_to_watch = dir; free(pathw); pathw = NULL; } handle->dir_handle = CreateFileW(dir_to_watch, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); if (dir) { free(dir); dir = NULL; } if (handle->dir_handle == INVALID_HANDLE_VALUE) { last_error = GetLastError(); goto error; } if (CreateIoCompletionPort(handle->dir_handle, handle->loop->iocp, (ULONG_PTR)handle, 0) == NULL) { last_error = GetLastError(); goto error; } if (!handle->buffer) { handle->buffer = (char*)_aligned_malloc(uv_directory_watcher_buffer_size, sizeof(DWORD)); } if (!handle->buffer) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } memset(&(handle->req.overlapped), 0, sizeof(handle->req.overlapped)); if (!ReadDirectoryChangesW(handle->dir_handle, handle->buffer, uv_directory_watcher_buffer_size, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY, NULL, &handle->req.overlapped, NULL)) { last_error = GetLastError(); goto error; } handle->req_pending = 1; return 0; error: if (handle->path) { free(handle->path); handle->path = NULL; } if (handle->filew) { free(handle->filew); handle->filew = NULL; } if (handle->short_filew) { free(handle->short_filew); handle->short_filew = NULL; } free(pathw); if (handle->dir_handle != INVALID_HANDLE_VALUE) { CloseHandle(handle->dir_handle); handle->dir_handle = INVALID_HANDLE_VALUE; } if (handle->buffer) { _aligned_free(handle->buffer); handle->buffer = NULL; } return uv_translate_sys_error(last_error); } int uv_fs_event_stop(uv_fs_event_t* handle) { if (!uv__is_active(handle)) return 0; if (handle->dir_handle != INVALID_HANDLE_VALUE) { CloseHandle(handle->dir_handle); handle->dir_handle = INVALID_HANDLE_VALUE; } uv__handle_stop(handle); if (handle->filew) { free(handle->filew); handle->filew = NULL; } if (handle->short_filew) { free(handle->short_filew); handle->short_filew = NULL; } if (handle->path) { free(handle->path); handle->path = NULL; } if (handle->dirw) { free(handle->dirw); handle->dirw = NULL; } return 0; } void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, uv_fs_event_t* handle) { FILE_NOTIFY_INFORMATION* file_info; int err, sizew, size, result; char* filename = NULL; WCHAR* filenamew, *long_filenamew = NULL; DWORD offset = 0; assert(req->type == UV_FS_EVENT_REQ); assert(handle->req_pending); handle->req_pending = 0; /* Don't report any callbacks if: * - We're closing, just push the handle onto the endgame queue * - We are not active, just ignore the callback */ if (!uv__is_active(handle)) { if (handle->flags & UV__HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*) handle); } return; } file_info = (FILE_NOTIFY_INFORMATION*)(handle->buffer + offset); if (REQ_SUCCESS(req)) { if (req->overlapped.InternalHigh > 0) { do { file_info = (FILE_NOTIFY_INFORMATION*)((char*)file_info + offset); assert(!filename); assert(!long_filenamew); /* * Fire the event only if we were asked to watch a directory, * or if the filename filter matches. */ if (handle->dirw || _wcsnicmp(handle->filew, file_info->FileName, file_info->FileNameLength / sizeof(WCHAR)) == 0 || _wcsnicmp(handle->short_filew, file_info->FileName, file_info->FileNameLength / sizeof(WCHAR)) == 0) { if (handle->dirw) { /* * We attempt to convert the file name to its long form for * events that still point to valid files on disk. * For removed and renamed events, we do not provide the file name. */ if (file_info->Action != FILE_ACTION_REMOVED && file_info->Action != FILE_ACTION_RENAMED_OLD_NAME) { /* Construct a full path to the file. */ size = wcslen(handle->dirw) + file_info->FileNameLength / sizeof(WCHAR) + 2; filenamew = (WCHAR*)malloc(size * sizeof(WCHAR)); if (!filenamew) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } _snwprintf(filenamew, size, L"%s\\%.*s", handle->dirw, file_info->FileNameLength / sizeof(WCHAR), file_info->FileName); filenamew[size - 1] = L'\0'; /* Convert to long name. */ size = GetLongPathNameW(filenamew, NULL, 0); if (size) { long_filenamew = (WCHAR*)malloc(size * sizeof(WCHAR)); if (!long_filenamew) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } size = GetLongPathNameW(filenamew, long_filenamew, size); if (size) { long_filenamew[size] = '\0'; } else { free(long_filenamew); long_filenamew = NULL; } } free(filenamew); if (long_filenamew) { /* Get the file name out of the long path. */ result = uv_split_path(long_filenamew, NULL, &filenamew); free(long_filenamew); if (result == 0) { long_filenamew = filenamew; sizew = -1; } else { long_filenamew = NULL; } } /* * If we couldn't get the long name - just use the name * provided by ReadDirectoryChangesW. */ if (!long_filenamew) { filenamew = file_info->FileName; sizew = file_info->FileNameLength / sizeof(WCHAR); } } else { /* Removed or renamed callbacks don't provide filename. */ filenamew = NULL; } } else { /* We already have the long name of the file, so just use it. */ filenamew = handle->filew; sizew = -1; } if (filenamew) { /* Convert the filename to utf8. */ size = uv_utf16_to_utf8(filenamew, sizew, NULL, 0); if (size) { filename = (char*)malloc(size + 1); if (!filename) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } size = uv_utf16_to_utf8(filenamew, sizew, filename, size); if (size) { filename[size] = '\0'; } else { free(filename); filename = NULL; } } } switch (file_info->Action) { case FILE_ACTION_ADDED: case FILE_ACTION_REMOVED: case FILE_ACTION_RENAMED_OLD_NAME: case FILE_ACTION_RENAMED_NEW_NAME: handle->cb(handle, filename, UV_RENAME, 0); break; case FILE_ACTION_MODIFIED: handle->cb(handle, filename, UV_CHANGE, 0); break; } free(filename); filename = NULL; free(long_filenamew); long_filenamew = NULL; } offset = file_info->NextEntryOffset; } while (offset && !(handle->flags & UV__HANDLE_CLOSING)); } else { handle->cb(handle, NULL, UV_CHANGE, 0); } } else { err = GET_REQ_ERROR(req); handle->cb(handle, NULL, 0, uv_translate_sys_error(err)); } if (!(handle->flags & UV__HANDLE_CLOSING)) { uv_fs_event_queue_readdirchanges(loop, handle); } else { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle) { uv_fs_event_stop(handle); uv__handle_closing(handle); if (!handle->req_pending) { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle) { if ((handle->flags & UV__HANDLE_CLOSING) && !handle->req_pending) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (handle->buffer) { _aligned_free(handle->buffer); handle->buffer = NULL; } uv__handle_close(handle); } } MoarVM-2015.11/3rdparty/libuv/src/win/fs.c0000644000175000017500000015541012502366750017115 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include #include #include "uv.h" #include "internal.h" #include "req-inl.h" #include "handle-inl.h" #include #define UV_FS_FREE_PATHS 0x0002 #define UV_FS_FREE_PTR 0x0008 #define UV_FS_CLEANEDUP 0x0010 static const int uv__fs_dirent_slide = 0x20; #define QUEUE_FS_TP_JOB(loop, req) \ do { \ uv__req_register(loop, req); \ uv__work_submit((loop), &(req)->work_req, uv__fs_work, uv__fs_done); \ } while (0) #define SET_REQ_RESULT(req, result_value) \ do { \ req->result = (result_value); \ if (req->result == -1) { \ req->sys_errno_ = _doserrno; \ req->result = uv_translate_sys_error(req->sys_errno_); \ } \ } while (0) #define SET_REQ_WIN32_ERROR(req, sys_errno) \ do { \ req->sys_errno_ = (sys_errno); \ req->result = uv_translate_sys_error(req->sys_errno_); \ } while (0) #define SET_REQ_UV_ERROR(req, uv_errno, sys_errno) \ do { \ req->result = (uv_errno); \ req->sys_errno_ = (sys_errno); \ } while (0) #define VERIFY_FD(fd, req) \ if (fd == -1) { \ req->result = UV_EBADF; \ req->sys_errno_ = ERROR_INVALID_HANDLE; \ return; \ } #define FILETIME_TO_UINT(filetime) \ (*((uint64_t*) &(filetime)) - 116444736000000000ULL) #define FILETIME_TO_TIME_T(filetime) \ (FILETIME_TO_UINT(filetime) / 10000000ULL) #define FILETIME_TO_TIME_NS(filetime, secs) \ ((FILETIME_TO_UINT(filetime) - (secs * 10000000ULL)) * 100) #define FILETIME_TO_TIMESPEC(ts, filetime) \ do { \ (ts).tv_sec = (long) FILETIME_TO_TIME_T(filetime); \ (ts).tv_nsec = (long) FILETIME_TO_TIME_NS(filetime, (ts).tv_sec); \ } while(0) #define TIME_T_TO_FILETIME(time, filetime_ptr) \ do { \ uint64_t bigtime = ((int64_t) (time) * 10000000LL) + \ 116444736000000000ULL; \ (filetime_ptr)->dwLowDateTime = bigtime & 0xFFFFFFFF; \ (filetime_ptr)->dwHighDateTime = bigtime >> 32; \ } while(0) #define IS_SLASH(c) ((c) == L'\\' || (c) == L'/') #define IS_LETTER(c) (((c) >= L'a' && (c) <= L'z') || \ ((c) >= L'A' && (c) <= L'Z')) const WCHAR JUNCTION_PREFIX[] = L"\\??\\"; const WCHAR JUNCTION_PREFIX_LEN = 4; const WCHAR LONG_PATH_PREFIX[] = L"\\\\?\\"; const WCHAR LONG_PATH_PREFIX_LEN = 4; void uv_fs_init() { _fmode = _O_BINARY; } INLINE static int fs__capture_path(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, const int copy_path) { char* buf; char* pos; ssize_t buf_sz = 0, path_len, pathw_len = 0, new_pathw_len = 0; /* new_path can only be set if path is also set. */ assert(new_path == NULL || path != NULL); if (path != NULL) { pathw_len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); if (pathw_len == 0) { return GetLastError(); } buf_sz += pathw_len * sizeof(WCHAR); } if (path != NULL && copy_path) { path_len = 1 + strlen(path); buf_sz += path_len; } if (new_path != NULL) { new_pathw_len = MultiByteToWideChar(CP_UTF8, 0, new_path, -1, NULL, 0); if (new_pathw_len == 0) { return GetLastError(); } buf_sz += new_pathw_len * sizeof(WCHAR); } if (buf_sz == 0) { req->pathw = NULL; req->new_pathw = NULL; req->path = NULL; return 0; } buf = (char*) malloc(buf_sz); if (buf == NULL) { return ERROR_OUTOFMEMORY; } pos = buf; if (path != NULL) { DWORD r = MultiByteToWideChar(CP_UTF8, 0, path, -1, (WCHAR*) pos, pathw_len); assert(r == (DWORD) pathw_len); req->pathw = (WCHAR*) pos; pos += r * sizeof(WCHAR); } else { req->pathw = NULL; } if (new_path != NULL) { DWORD r = MultiByteToWideChar(CP_UTF8, 0, new_path, -1, (WCHAR*) pos, new_pathw_len); assert(r == (DWORD) new_pathw_len); req->new_pathw = (WCHAR*) pos; pos += r * sizeof(WCHAR); } else { req->new_pathw = NULL; } if (!copy_path) { req->path = path; } else if (path) { memcpy(pos, path, path_len); assert(path_len == buf_sz - (pos - buf)); req->path = pos; } else { req->path = NULL; } req->flags |= UV_FS_FREE_PATHS; return 0; } INLINE static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type, const uv_fs_cb cb) { uv_req_init(loop, (uv_req_t*) req); req->type = UV_FS; req->loop = loop; req->flags = 0; req->fs_type = fs_type; req->result = 0; req->ptr = NULL; req->path = NULL; req->cb = cb; } INLINE static int fs__readlink_handle(HANDLE handle, char** target_ptr, uint64_t* target_len_ptr) { char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; REPARSE_DATA_BUFFER* reparse_data = (REPARSE_DATA_BUFFER*) buffer; WCHAR *w_target; DWORD w_target_len; char* target; int target_len; DWORD bytes; if (!DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, NULL, 0, buffer, sizeof buffer, &bytes, NULL)) { return -1; } if (reparse_data->ReparseTag == IO_REPARSE_TAG_SYMLINK) { /* Real symlink */ w_target = reparse_data->SymbolicLinkReparseBuffer.PathBuffer + (reparse_data->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); w_target_len = reparse_data->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(WCHAR); /* Real symlinks can contain pretty much everything, but the only thing */ /* we really care about is undoing the implicit conversion to an NT */ /* namespaced path that CreateSymbolicLink will perform on absolute */ /* paths. If the path is win32-namespaced then the user must have */ /* explicitly made it so, and we better just return the unmodified */ /* reparse data. */ if (w_target_len >= 4 && w_target[0] == L'\\' && w_target[1] == L'?' && w_target[2] == L'?' && w_target[3] == L'\\') { /* Starts with \??\ */ if (w_target_len >= 6 && ((w_target[4] >= L'A' && w_target[4] <= L'Z') || (w_target[4] >= L'a' && w_target[4] <= L'z')) && w_target[5] == L':' && (w_target_len == 6 || w_target[6] == L'\\')) { /* \??\«drive»:\ */ w_target += 4; w_target_len -= 4; } else if (w_target_len >= 8 && (w_target[4] == L'U' || w_target[4] == L'u') && (w_target[5] == L'N' || w_target[5] == L'n') && (w_target[6] == L'C' || w_target[6] == L'c') && w_target[7] == L'\\') { /* \??\UNC\«server»\«share»\ - make sure the final path looks like */ /* \\«server»\«share»\ */ w_target += 6; w_target[0] = L'\\'; w_target_len -= 6; } } } else if (reparse_data->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { /* Junction. */ w_target = reparse_data->MountPointReparseBuffer.PathBuffer + (reparse_data->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR)); w_target_len = reparse_data->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR); /* Only treat junctions that look like \??\«drive»:\ as symlink. */ /* Junctions can also be used as mount points, like \??\Volume{«guid»}, */ /* but that's confusing for programs since they wouldn't be able to */ /* actually understand such a path when returned by uv_readlink(). */ /* UNC paths are never valid for junctions so we don't care about them. */ if (!(w_target_len >= 6 && w_target[0] == L'\\' && w_target[1] == L'?' && w_target[2] == L'?' && w_target[3] == L'\\' && ((w_target[4] >= L'A' && w_target[4] <= L'Z') || (w_target[4] >= L'a' && w_target[4] <= L'z')) && w_target[5] == L':' && (w_target_len == 6 || w_target[6] == L'\\'))) { SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } /* Remove leading \??\ */ w_target += 4; w_target_len -= 4; } else { /* Reparse tag does not indicate a symlink. */ SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); return -1; } /* If needed, compute the length of the target. */ if (target_ptr != NULL || target_len_ptr != NULL) { /* Compute the length of the target. */ target_len = WideCharToMultiByte(CP_UTF8, 0, w_target, w_target_len, NULL, 0, NULL, NULL); if (target_len == 0) { return -1; } } /* If requested, allocate memory and convert to UTF8. */ if (target_ptr != NULL) { int r; target = (char*) malloc(target_len + 1); if (target == NULL) { SetLastError(ERROR_OUTOFMEMORY); return -1; } r = WideCharToMultiByte(CP_UTF8, 0, w_target, w_target_len, target, target_len, NULL, NULL); assert(r == target_len); target[target_len] = '\0'; *target_ptr = target; } if (target_len_ptr != NULL) { *target_len_ptr = target_len; } return 0; } void fs__open(uv_fs_t* req) { DWORD access; DWORD share; DWORD disposition; DWORD attributes = 0; HANDLE file; int fd, current_umask; int flags = req->file_flags; /* Obtain the active umask. umask() never fails and returns the previous */ /* umask. */ current_umask = umask(0); umask(current_umask); /* convert flags and mode to CreateFile parameters */ switch (flags & (_O_RDONLY | _O_WRONLY | _O_RDWR)) { case _O_RDONLY: access = FILE_GENERIC_READ; attributes |= FILE_FLAG_BACKUP_SEMANTICS; break; case _O_WRONLY: access = FILE_GENERIC_WRITE; break; case _O_RDWR: access = FILE_GENERIC_READ | FILE_GENERIC_WRITE; break; default: goto einval; } if (flags & _O_APPEND) { access &= ~FILE_WRITE_DATA; access |= FILE_APPEND_DATA; attributes &= ~FILE_FLAG_BACKUP_SEMANTICS; } /* * Here is where we deviate significantly from what CRT's _open() * does. We indiscriminately use all the sharing modes, to match * UNIX semantics. In particular, this ensures that the file can * be deleted even whilst it's open, fixing issue #1449. */ share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; switch (flags & (_O_CREAT | _O_EXCL | _O_TRUNC)) { case 0: case _O_EXCL: disposition = OPEN_EXISTING; break; case _O_CREAT: disposition = OPEN_ALWAYS; break; case _O_CREAT | _O_EXCL: case _O_CREAT | _O_TRUNC | _O_EXCL: disposition = CREATE_NEW; break; case _O_TRUNC: case _O_TRUNC | _O_EXCL: disposition = TRUNCATE_EXISTING; break; case _O_CREAT | _O_TRUNC: disposition = CREATE_ALWAYS; break; default: goto einval; } attributes |= FILE_ATTRIBUTE_NORMAL; if (flags & _O_CREAT) { if (!((req->mode & ~current_umask) & _S_IWRITE)) { attributes |= FILE_ATTRIBUTE_READONLY; } } if (flags & _O_TEMPORARY ) { attributes |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY; access |= DELETE; } if (flags & _O_SHORT_LIVED) { attributes |= FILE_ATTRIBUTE_TEMPORARY; } switch (flags & (_O_SEQUENTIAL | _O_RANDOM)) { case 0: break; case _O_SEQUENTIAL: attributes |= FILE_FLAG_SEQUENTIAL_SCAN; break; case _O_RANDOM: attributes |= FILE_FLAG_RANDOM_ACCESS; break; default: goto einval; } /* Setting this flag makes it possible to open a directory. */ attributes |= FILE_FLAG_BACKUP_SEMANTICS; file = CreateFileW(req->pathw, access, share, NULL, disposition, attributes, NULL); if (file == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if (error == ERROR_FILE_EXISTS && (flags & _O_CREAT) && !(flags & _O_EXCL)) { /* Special case: when ERROR_FILE_EXISTS happens and O_CREAT was */ /* specified, it means the path referred to a directory. */ SET_REQ_UV_ERROR(req, UV_EISDIR, error); } else { SET_REQ_WIN32_ERROR(req, GetLastError()); } return; } fd = _open_osfhandle((intptr_t) file, flags); if (fd < 0) { /* The only known failure mode for _open_osfhandle() is EMFILE, in which * case GetLastError() will return zero. However we'll try to handle other * errors as well, should they ever occur. */ if (errno == EMFILE) SET_REQ_UV_ERROR(req, UV_EMFILE, ERROR_TOO_MANY_OPEN_FILES); else if (GetLastError() != ERROR_SUCCESS) SET_REQ_WIN32_ERROR(req, GetLastError()); else SET_REQ_WIN32_ERROR(req, UV_UNKNOWN); return; } SET_REQ_RESULT(req, fd); return; einval: SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); } void fs__close(uv_fs_t* req) { int fd = req->fd; int result; VERIFY_FD(fd, req); result = _close(fd); SET_REQ_RESULT(req, result); } void fs__read(uv_fs_t* req) { int fd = req->fd; int64_t offset = req->offset; HANDLE handle; OVERLAPPED overlapped, *overlapped_ptr; LARGE_INTEGER offset_; DWORD bytes; DWORD error; int result; unsigned int index; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (offset != -1) { memset(&overlapped, 0, sizeof overlapped); overlapped_ptr = &overlapped; } else { overlapped_ptr = NULL; } index = 0; bytes = 0; do { DWORD incremental_bytes; if (offset != -1) { offset_.QuadPart = offset + bytes; overlapped.Offset = offset_.LowPart; overlapped.OffsetHigh = offset_.HighPart; } result = ReadFile(handle, req->bufs[index].base, req->bufs[index].len, &incremental_bytes, overlapped_ptr); bytes += incremental_bytes; ++index; } while (result && index < req->nbufs); if (result || bytes > 0) { SET_REQ_RESULT(req, bytes); } else { error = GetLastError(); if (error == ERROR_HANDLE_EOF) { SET_REQ_RESULT(req, bytes); } else { SET_REQ_WIN32_ERROR(req, error); } } } void fs__write(uv_fs_t* req) { int fd = req->fd; int64_t offset = req->offset; HANDLE handle; OVERLAPPED overlapped, *overlapped_ptr; LARGE_INTEGER offset_; DWORD bytes; int result; unsigned int index; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (offset != -1) { memset(&overlapped, 0, sizeof overlapped); overlapped_ptr = &overlapped; } else { overlapped_ptr = NULL; } index = 0; bytes = 0; do { DWORD incremental_bytes; if (offset != -1) { offset_.QuadPart = offset + bytes; overlapped.Offset = offset_.LowPart; overlapped.OffsetHigh = offset_.HighPart; } result = WriteFile(handle, req->bufs[index].base, req->bufs[index].len, &incremental_bytes, overlapped_ptr); bytes += incremental_bytes; ++index; } while (result && index < req->nbufs); if (result || bytes > 0) { SET_REQ_RESULT(req, bytes); } else { SET_REQ_WIN32_ERROR(req, GetLastError()); } } void fs__rmdir(uv_fs_t* req) { int result = _wrmdir(req->pathw); SET_REQ_RESULT(req, result); } void fs__unlink(uv_fs_t* req) { const WCHAR* pathw = req->pathw; HANDLE handle; BY_HANDLE_FILE_INFORMATION info; FILE_DISPOSITION_INFORMATION disposition; IO_STATUS_BLOCK iosb; NTSTATUS status; handle = CreateFileW(pathw, FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (!GetFileInformationByHandle(handle, &info)) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); return; } if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { /* Do not allow deletion of directories, unless it is a symlink. When */ /* the path refers to a non-symlink directory, report EPERM as mandated */ /* by POSIX.1. */ /* Check if it is a reparse point. If it's not, it's a normal directory. */ if (!(info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); CloseHandle(handle); return; } /* Read the reparse point and check if it is a valid symlink. */ /* If not, don't unlink. */ if (fs__readlink_handle(handle, NULL, NULL) < 0) { DWORD error = GetLastError(); if (error == ERROR_SYMLINK_NOT_SUPPORTED) error = ERROR_ACCESS_DENIED; SET_REQ_WIN32_ERROR(req, error); CloseHandle(handle); return; } } /* Try to set the delete flag. */ disposition.DeleteFile = TRUE; status = pNtSetInformationFile(handle, &iosb, &disposition, sizeof disposition, FileDispositionInformation); if (NT_SUCCESS(status)) { SET_REQ_SUCCESS(req); } else { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); } CloseHandle(handle); } void fs__mkdir(uv_fs_t* req) { /* TODO: use req->mode. */ int result = _wmkdir(req->pathw); SET_REQ_RESULT(req, result); } /* OpenBSD original: lib/libc/stdio/mktemp.c */ void fs__mkdtemp(uv_fs_t* req) { static const WCHAR *tempchars = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static const size_t num_chars = 62; static const size_t num_x = 6; WCHAR *cp, *ep; unsigned int tries, i; size_t len; HCRYPTPROV h_crypt_prov; uint64_t v; BOOL released; len = wcslen(req->pathw); ep = req->pathw + len; if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) { SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); return; } if (!CryptAcquireContext(&h_crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } tries = TMP_MAX; do { if (!CryptGenRandom(h_crypt_prov, sizeof(v), (BYTE*) &v)) { SET_REQ_WIN32_ERROR(req, GetLastError()); break; } cp = ep - num_x; for (i = 0; i < num_x; i++) { *cp++ = tempchars[v % num_chars]; v /= num_chars; } if (_wmkdir(req->pathw) == 0) { len = strlen(req->path); wcstombs((char*) req->path + len - num_x, ep - num_x, num_x); SET_REQ_RESULT(req, 0); break; } else if (errno != EEXIST) { SET_REQ_RESULT(req, -1); break; } } while (--tries); released = CryptReleaseContext(h_crypt_prov, 0); assert(released); if (tries == 0) { SET_REQ_RESULT(req, -1); } } void fs__scandir(uv_fs_t* req) { WCHAR* pathw = req->pathw; size_t len = wcslen(pathw); int result; WCHAR* name; HANDLE dir; WIN32_FIND_DATAW ent = { 0 }; WCHAR* path2; const WCHAR* fmt; uv__dirent_t** dents; int dent_size; if (len == 0) { fmt = L"./*"; } else if (pathw[len - 1] == L'/' || pathw[len - 1] == L'\\') { fmt = L"%s*"; } else { fmt = L"%s\\*"; } /* Figure out whether path is a file or a directory. */ if (!(GetFileAttributesW(pathw) & FILE_ATTRIBUTE_DIRECTORY)) { req->result = UV_ENOTDIR; req->sys_errno_ = ERROR_SUCCESS; return; } path2 = (WCHAR*)malloc(sizeof(WCHAR) * (len + 4)); if (!path2) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); return; } _snwprintf(path2, len + 3, fmt, pathw); dir = FindFirstFileW(path2, &ent); free(path2); if(dir == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } result = 0; dents = NULL; dent_size = 0; do { uv__dirent_t* dent; int utf8_len; name = ent.cFileName; if (!(name[0] != L'.' || (name[1] && (name[1] != L'.' || name[2])))) continue; /* Grow dents buffer, if needed */ if (result >= dent_size) { uv__dirent_t** tmp; dent_size += uv__fs_dirent_slide; tmp = realloc(dents, dent_size * sizeof(*dents)); if (tmp == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); goto fatal; } dents = tmp; } /* Allocate enough space to fit utf8 encoding of file name */ len = wcslen(name); utf8_len = uv_utf16_to_utf8(name, len, NULL, 0); if (!utf8_len) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto fatal; } dent = malloc(sizeof(*dent) + utf8_len + 1); if (dent == NULL) { SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); goto fatal; } /* Copy file name */ utf8_len = uv_utf16_to_utf8(name, len, dent->d_name, utf8_len); if (!utf8_len) { free(dent); SET_REQ_WIN32_ERROR(req, GetLastError()); goto fatal; } dent->d_name[utf8_len] = '\0'; /* Copy file type */ if ((ent.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) dent->d_type = UV__DT_DIR; else if ((ent.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) dent->d_type = UV__DT_LINK; else dent->d_type = UV__DT_FILE; dents[result++] = dent; } while(FindNextFileW(dir, &ent)); FindClose(dir); if (dents != NULL) req->flags |= UV_FS_FREE_PTR; /* NOTE: nbufs will be used as index */ req->nbufs = 0; req->ptr = dents; SET_REQ_RESULT(req, result); return; fatal: /* Deallocate dents */ for (result--; result >= 0; result--) free(dents[result]); free(dents); } INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf) { FILE_ALL_INFORMATION file_info; FILE_FS_VOLUME_INFORMATION volume_info; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; nt_status = pNtQueryInformationFile(handle, &io_status, &file_info, sizeof file_info, FileAllInformation); /* Buffer overflow (a warning status code) is expected here. */ if (NT_ERROR(nt_status)) { SetLastError(pRtlNtStatusToDosError(nt_status)); return -1; } nt_status = pNtQueryVolumeInformationFile(handle, &io_status, &volume_info, sizeof volume_info, FileFsVolumeInformation); /* Buffer overflow (a warning status code) is expected here. */ if (io_status.Status == STATUS_NOT_IMPLEMENTED) { statbuf->st_dev = 0; } else if (NT_ERROR(nt_status)) { SetLastError(pRtlNtStatusToDosError(nt_status)); return -1; } else { statbuf->st_dev = volume_info.VolumeSerialNumber; } /* Todo: st_mode should probably always be 0666 for everyone. We might also * want to report 0777 if the file is a .exe or a directory. * * Currently it's based on whether the 'readonly' attribute is set, which * makes little sense because the semantics are so different: the 'read-only' * flag is just a way for a user to protect against accidental deleteion, and * serves no security purpose. Windows uses ACLs for that. * * Also people now use uv_fs_chmod() to take away the writable bit for good * reasons. Windows however just makes the file read-only, which makes it * impossible to delete the file afterwards, since read-only files can't be * deleted. * * IOW it's all just a clusterfuck and we should think of something that * makes slighty more sense. * * And uv_fs_chmod should probably just fail on windows or be a total no-op. * There's nothing sensible it can do anyway. */ statbuf->st_mode = 0; if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { statbuf->st_mode |= S_IFLNK; if (fs__readlink_handle(handle, NULL, &statbuf->st_size) != 0) return -1; } else if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) { statbuf->st_mode |= _S_IFDIR; statbuf->st_size = 0; } else { statbuf->st_mode |= _S_IFREG; statbuf->st_size = file_info.StandardInformation.EndOfFile.QuadPart; } if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_READONLY) statbuf->st_mode |= _S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6); else statbuf->st_mode |= (_S_IREAD | _S_IWRITE) | ((_S_IREAD | _S_IWRITE) >> 3) | ((_S_IREAD | _S_IWRITE) >> 6); FILETIME_TO_TIMESPEC(statbuf->st_atim, file_info.BasicInformation.LastAccessTime); FILETIME_TO_TIMESPEC(statbuf->st_ctim, file_info.BasicInformation.ChangeTime); FILETIME_TO_TIMESPEC(statbuf->st_mtim, file_info.BasicInformation.LastWriteTime); FILETIME_TO_TIMESPEC(statbuf->st_birthtim, file_info.BasicInformation.CreationTime); statbuf->st_ino = file_info.InternalInformation.IndexNumber.QuadPart; /* st_blocks contains the on-disk allocation size in 512-byte units. */ statbuf->st_blocks = file_info.StandardInformation.AllocationSize.QuadPart >> 9ULL; statbuf->st_nlink = file_info.StandardInformation.NumberOfLinks; /* The st_blksize is supposed to be the 'optimal' number of bytes for reading * and writing to the disk. That is, for any definition of 'optimal' - it's * supposed to at least avoid read-update-write behavior when writing to the * disk. * * However nobody knows this and even fewer people actually use this value, * and in order to fill it out we'd have to make another syscall to query the * volume for FILE_FS_SECTOR_SIZE_INFORMATION. * * Therefore we'll just report a sensible value that's quite commonly okay * on modern hardware. */ statbuf->st_blksize = 2048; /* Todo: set st_flags to something meaningful. Also provide a wrapper for * chattr(2). */ statbuf->st_flags = 0; /* Windows has nothing sensible to say about these values, so they'll just * remain empty. */ statbuf->st_gid = 0; statbuf->st_uid = 0; statbuf->st_rdev = 0; statbuf->st_gen = 0; return 0; } INLINE static void fs__stat_prepare_path(WCHAR* pathw) { size_t len = wcslen(pathw); /* TODO: ignore namespaced paths. */ if (len > 1 && pathw[len - 2] != L':' && (pathw[len - 1] == L'\\' || pathw[len - 1] == L'/')) { pathw[len - 1] = '\0'; } } INLINE static void fs__stat_impl(uv_fs_t* req, int do_lstat) { HANDLE handle; DWORD flags; flags = FILE_FLAG_BACKUP_SEMANTICS; if (do_lstat) { flags |= FILE_FLAG_OPEN_REPARSE_POINT; } handle = CreateFileW(req->pathw, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, flags, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (fs__stat_handle(handle, &req->statbuf) != 0) { DWORD error = GetLastError(); if (do_lstat && error == ERROR_SYMLINK_NOT_SUPPORTED) { /* We opened a reparse point but it was not a symlink. Try again. */ fs__stat_impl(req, 0); } else { /* Stat failed. */ SET_REQ_WIN32_ERROR(req, GetLastError()); } CloseHandle(handle); return; } req->ptr = &req->statbuf; req->result = 0; CloseHandle(handle); } static void fs__stat(uv_fs_t* req) { fs__stat_prepare_path(req->pathw); fs__stat_impl(req, 0); } static void fs__lstat(uv_fs_t* req) { fs__stat_prepare_path(req->pathw); fs__stat_impl(req, 1); } static void fs__fstat(uv_fs_t* req) { int fd = req->fd; HANDLE handle; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (fs__stat_handle(handle, &req->statbuf) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } req->ptr = &req->statbuf; req->result = 0; } static void fs__rename(uv_fs_t* req) { if (!MoveFileExW(req->pathw, req->new_pathw, MOVEFILE_REPLACE_EXISTING)) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } SET_REQ_RESULT(req, 0); } INLINE static void fs__sync_impl(uv_fs_t* req) { int fd = req->fd; int result; VERIFY_FD(fd, req); result = FlushFileBuffers(uv__get_osfhandle(fd)) ? 0 : -1; if (result == -1) { SET_REQ_WIN32_ERROR(req, GetLastError()); } else { SET_REQ_RESULT(req, result); } } static void fs__fsync(uv_fs_t* req) { fs__sync_impl(req); } static void fs__fdatasync(uv_fs_t* req) { fs__sync_impl(req); } static void fs__ftruncate(uv_fs_t* req) { int fd = req->fd; HANDLE handle; NTSTATUS status; IO_STATUS_BLOCK io_status; FILE_END_OF_FILE_INFORMATION eof_info; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); eof_info.EndOfFile.QuadPart = req->offset; status = pNtSetInformationFile(handle, &io_status, &eof_info, sizeof eof_info, FileEndOfFileInformation); if (NT_SUCCESS(status)) { SET_REQ_RESULT(req, 0); } else { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); } } static void fs__sendfile(uv_fs_t* req) { int fd_in = req->fd, fd_out = req->fd_out; size_t length = req->bufsml[0].len; int64_t offset = req->offset; const size_t max_buf_size = 65536; size_t buf_size = length < max_buf_size ? length : max_buf_size; int n, result = 0; int64_t result_offset = 0; char* buf = (char*) malloc(buf_size); if (!buf) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } if (offset != -1) { result_offset = _lseeki64(fd_in, offset, SEEK_SET); } if (result_offset == -1) { result = -1; } else { while (length > 0) { n = _read(fd_in, buf, length < buf_size ? length : buf_size); if (n == 0) { break; } else if (n == -1) { result = -1; break; } length -= n; n = _write(fd_out, buf, n); if (n == -1) { result = -1; break; } result += n; } } free(buf); SET_REQ_RESULT(req, result); } static void fs__access(uv_fs_t* req) { DWORD attr = GetFileAttributesW(req->pathw); if (attr == INVALID_FILE_ATTRIBUTES) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if ((req->flags & W_OK) && ((attr & FILE_ATTRIBUTE_READONLY) || (attr & FILE_ATTRIBUTE_DIRECTORY))) { SET_REQ_WIN32_ERROR(req, UV_EPERM); return; } SET_REQ_RESULT(req, 0); } static void fs__chmod(uv_fs_t* req) { int result = _wchmod(req->pathw, req->mode); SET_REQ_RESULT(req, result); } static void fs__fchmod(uv_fs_t* req) { int fd = req->fd; HANDLE handle; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_BASIC_INFORMATION file_info; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); nt_status = pNtQueryInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); return; } if (req->mode & _S_IWRITE) { file_info.FileAttributes &= ~FILE_ATTRIBUTE_READONLY; } else { file_info.FileAttributes |= FILE_ATTRIBUTE_READONLY; } nt_status = pNtSetInformationFile(handle, &io_status, &file_info, sizeof file_info, FileBasicInformation); if (!NT_SUCCESS(nt_status)) { SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); return; } SET_REQ_SUCCESS(req); } INLINE static int fs__utime_handle(HANDLE handle, double atime, double mtime) { FILETIME filetime_a, filetime_m; TIME_T_TO_FILETIME((time_t) atime, &filetime_a); TIME_T_TO_FILETIME((time_t) mtime, &filetime_m); if (!SetFileTime(handle, NULL, &filetime_a, &filetime_m)) { return -1; } return 0; } static void fs__utime(uv_fs_t* req) { HANDLE handle; handle = CreateFileW(req->pathw, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (fs__utime_handle(handle, req->atime, req->mtime) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); return; } CloseHandle(handle); req->result = 0; } static void fs__futime(uv_fs_t* req) { int fd = req->fd; HANDLE handle; VERIFY_FD(fd, req); handle = uv__get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); return; } if (fs__utime_handle(handle, req->atime, req->mtime) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } req->result = 0; } static void fs__link(uv_fs_t* req) { DWORD r = CreateHardLinkW(req->new_pathw, req->pathw, NULL); if (r == 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); } else { req->result = 0; } } static void fs__create_junction(uv_fs_t* req, const WCHAR* path, const WCHAR* new_path) { HANDLE handle = INVALID_HANDLE_VALUE; REPARSE_DATA_BUFFER *buffer = NULL; int created = 0; int target_len; int is_absolute, is_long_path; int needed_buf_size, used_buf_size, used_data_size, path_buf_len; int start, len, i; int add_slash; DWORD bytes; WCHAR* path_buf; target_len = wcslen(path); is_long_path = wcsncmp(path, LONG_PATH_PREFIX, LONG_PATH_PREFIX_LEN) == 0; if (is_long_path) { is_absolute = 1; } else { is_absolute = target_len >= 3 && IS_LETTER(path[0]) && path[1] == L':' && IS_SLASH(path[2]); } if (!is_absolute) { /* Not supporting relative paths */ SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_NOT_SUPPORTED); return; } /* Do a pessimistic calculation of the required buffer size */ needed_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + JUNCTION_PREFIX_LEN * sizeof(WCHAR) + 2 * (target_len + 2) * sizeof(WCHAR); /* Allocate the buffer */ buffer = (REPARSE_DATA_BUFFER*)malloc(needed_buf_size); if (!buffer) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } /* Grab a pointer to the part of the buffer where filenames go */ path_buf = (WCHAR*)&(buffer->MountPointReparseBuffer.PathBuffer); path_buf_len = 0; /* Copy the substitute (internal) target path */ start = path_buf_len; wcsncpy((WCHAR*)&path_buf[path_buf_len], JUNCTION_PREFIX, JUNCTION_PREFIX_LEN); path_buf_len += JUNCTION_PREFIX_LEN; add_slash = 0; for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { if (IS_SLASH(path[i])) { add_slash = 1; continue; } if (add_slash) { path_buf[path_buf_len++] = L'\\'; add_slash = 0; } path_buf[path_buf_len++] = path[i]; } path_buf[path_buf_len++] = L'\\'; len = path_buf_len - start; /* Set the info about the substitute name */ buffer->MountPointReparseBuffer.SubstituteNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.SubstituteNameLength = len * sizeof(WCHAR); /* Insert null terminator */ path_buf[path_buf_len++] = L'\0'; /* Copy the print name of the target path */ start = path_buf_len; add_slash = 0; for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { if (IS_SLASH(path[i])) { add_slash = 1; continue; } if (add_slash) { path_buf[path_buf_len++] = L'\\'; add_slash = 0; } path_buf[path_buf_len++] = path[i]; } len = path_buf_len - start; if (len == 2) { path_buf[path_buf_len++] = L'\\'; len++; } /* Set the info about the print name */ buffer->MountPointReparseBuffer.PrintNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.PrintNameLength = len * sizeof(WCHAR); /* Insert another null terminator */ path_buf[path_buf_len++] = L'\0'; /* Calculate how much buffer space was actually used */ used_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + path_buf_len * sizeof(WCHAR); used_data_size = used_buf_size - FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer); /* Put general info in the data buffer */ buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; buffer->ReparseDataLength = used_data_size; buffer->Reserved = 0; /* Create a new directory */ if (!CreateDirectoryW(new_path, NULL)) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } created = 1; /* Open the directory */ handle = CreateFileW(new_path, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } /* Create the actual reparse point */ if (!DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, buffer, used_buf_size, NULL, 0, &bytes, NULL)) { SET_REQ_WIN32_ERROR(req, GetLastError()); goto error; } /* Clean up */ CloseHandle(handle); free(buffer); SET_REQ_RESULT(req, 0); return; error: free(buffer); if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } if (created) { RemoveDirectoryW(new_path); } } static void fs__symlink(uv_fs_t* req) { WCHAR* pathw = req->pathw; WCHAR* new_pathw = req->new_pathw; int flags = req->file_flags; int result; if (flags & UV_FS_SYMLINK_JUNCTION) { fs__create_junction(req, pathw, new_pathw); } else if (pCreateSymbolicLinkW) { result = pCreateSymbolicLinkW(new_pathw, pathw, flags & UV_FS_SYMLINK_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) ? 0 : -1; if (result == -1) { SET_REQ_WIN32_ERROR(req, GetLastError()); } else { SET_REQ_RESULT(req, result); } } else { SET_REQ_UV_ERROR(req, UV_ENOSYS, ERROR_NOT_SUPPORTED); } } static void fs__readlink(uv_fs_t* req) { HANDLE handle; handle = CreateFileW(req->pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) { SET_REQ_WIN32_ERROR(req, GetLastError()); return; } if (fs__readlink_handle(handle, (char**) &req->ptr, NULL) != 0) { SET_REQ_WIN32_ERROR(req, GetLastError()); CloseHandle(handle); return; } req->flags |= UV_FS_FREE_PTR; SET_REQ_RESULT(req, 0); CloseHandle(handle); } static void fs__chown(uv_fs_t* req) { req->result = 0; } static void fs__fchown(uv_fs_t* req) { req->result = 0; } static void uv__fs_work(struct uv__work* w) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); assert(req->type == UV_FS); #define XX(uc, lc) case UV_FS_##uc: fs__##lc(req); break; switch (req->fs_type) { XX(OPEN, open) XX(CLOSE, close) XX(READ, read) XX(WRITE, write) XX(SENDFILE, sendfile) XX(STAT, stat) XX(LSTAT, lstat) XX(FSTAT, fstat) XX(FTRUNCATE, ftruncate) XX(UTIME, utime) XX(FUTIME, futime) XX(ACCESS, access) XX(CHMOD, chmod) XX(FCHMOD, fchmod) XX(FSYNC, fsync) XX(FDATASYNC, fdatasync) XX(UNLINK, unlink) XX(RMDIR, rmdir) XX(MKDIR, mkdir) XX(MKDTEMP, mkdtemp) XX(RENAME, rename) XX(SCANDIR, scandir) XX(LINK, link) XX(SYMLINK, symlink) XX(READLINK, readlink) XX(CHOWN, chown) XX(FCHOWN, fchown); default: assert(!"bad uv_fs_type"); } } static void uv__fs_done(struct uv__work* w, int status) { uv_fs_t* req; req = container_of(w, uv_fs_t, work_req); uv__req_unregister(req->loop, req); if (status == UV_ECANCELED) { assert(req->result == 0); req->result = UV_ECANCELED; } if (req->cb != NULL) req->cb(req); } void uv_fs_req_cleanup(uv_fs_t* req) { if (req->flags & UV_FS_CLEANEDUP) return; if (req->flags & UV_FS_FREE_PATHS) free(req->pathw); if (req->flags & UV_FS_FREE_PTR) free(req->ptr); req->path = NULL; req->pathw = NULL; req->new_pathw = NULL; req->ptr = NULL; req->flags |= UV_FS_CLEANEDUP; } int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_OPEN, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->file_flags = flags; req->mode = mode; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__open(req); return req->result; } } int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_CLOSE, cb); req->fd = fd; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__close(req); return req->result; } } int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file fd, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_READ, cb); req->fd = fd; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return UV_ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->offset = offset; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__read(req); return req->result; } } int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file fd, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_WRITE, cb); req->fd = fd; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = malloc(nbufs * sizeof(*bufs)); if (req->bufs == NULL) return UV_ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); req->offset = offset; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__write(req); return req->result; } } int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_UNLINK, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__unlink(req); return req->result; } } int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_MKDIR, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->mode = mode; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__mkdir(req); return req->result; } } int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_MKDTEMP, cb); err = fs__capture_path(loop, req, tpl, NULL, TRUE); if (err) return uv_translate_sys_error(err); if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__mkdtemp(req); return req->result; } } int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_RMDIR, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__rmdir(req); return req->result; } } int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_SCANDIR, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->file_flags = flags; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__scandir(req); return req->result; } } int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_LINK, cb); err = fs__capture_path(loop, req, path, new_path, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__link(req); return req->result; } } int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_SYMLINK, cb); err = fs__capture_path(loop, req, path, new_path, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->file_flags = flags; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__symlink(req); return req->result; } } int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_READLINK, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__readlink(req); return req->result; } } int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_CHOWN, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__chown(req); return req->result; } } int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FCHOWN, cb); if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__fchown(req); return req->result; } } int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_STAT, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__stat(req); return req->result; } } int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_LSTAT, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__lstat(req); return req->result; } } int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FSTAT, cb); req->fd = fd; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__fstat(req); return req->result; } } int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_RENAME, cb); err = fs__capture_path(loop, req, path, new_path, cb != NULL); if (err) { return uv_translate_sys_error(err); } if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__rename(req); return req->result; } } int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FSYNC, cb); req->fd = fd; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__fsync(req); return req->result; } } int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FDATASYNC, cb); req->fd = fd; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__fdatasync(req); return req->result; } } int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int64_t offset, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FTRUNCATE, cb); req->fd = fd; req->offset = offset; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__ftruncate(req); return req->result; } } int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file fd_out, uv_file fd_in, int64_t in_offset, size_t length, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_SENDFILE, cb); req->fd = fd_in; req->fd_out = fd_out; req->offset = in_offset; req->bufsml[0].len = length; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__sendfile(req); return req->result; } } int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_ACCESS, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) return uv_translate_sys_error(err); req->flags = flags; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } fs__access(req); return req->result; } int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_CHMOD, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->mode = mode; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__chmod(req); return req->result; } } int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int mode, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FCHMOD, cb); req->fd = fd; req->mode = mode; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__fchmod(req); return req->result; } } int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { int err; uv_fs_req_init(loop, req, UV_FS_UTIME, cb); err = fs__capture_path(loop, req, path, NULL, cb != NULL); if (err) { return uv_translate_sys_error(err); } req->atime = atime; req->mtime = mtime; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__utime(req); return req->result; } } int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file fd, double atime, double mtime, uv_fs_cb cb) { uv_fs_req_init(loop, req, UV_FS_FUTIME, cb); req->fd = fd; req->atime = atime; req->mtime = mtime; if (cb) { QUEUE_FS_TP_JOB(loop, req); return 0; } else { fs__futime(req); return req->result; } } MoarVM-2015.11/3rdparty/libuv/src/win/getaddrinfo.c0000644000175000017500000002564312456307253021000 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "req-inl.h" /* EAI_* constants. */ #include int uv__getaddrinfo_translate_error(int sys_err) { switch (sys_err) { case 0: return 0; case WSATRY_AGAIN: return UV_EAI_AGAIN; case WSAEINVAL: return UV_EAI_BADFLAGS; case WSANO_RECOVERY: return UV_EAI_FAIL; case WSAEAFNOSUPPORT: return UV_EAI_FAMILY; case WSA_NOT_ENOUGH_MEMORY: return UV_EAI_MEMORY; case WSAHOST_NOT_FOUND: return UV_EAI_NONAME; case WSATYPE_NOT_FOUND: return UV_EAI_SERVICE; case WSAESOCKTNOSUPPORT: return UV_EAI_SOCKTYPE; default: return uv_translate_sys_error(sys_err); } } /* * MinGW is missing this */ #if !defined(_MSC_VER) && !defined(__MINGW64_VERSION_MAJOR) typedef struct addrinfoW { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; WCHAR* ai_canonname; struct sockaddr* ai_addr; struct addrinfoW* ai_next; } ADDRINFOW, *PADDRINFOW; DECLSPEC_IMPORT int WSAAPI GetAddrInfoW(const WCHAR* node, const WCHAR* service, const ADDRINFOW* hints, PADDRINFOW* result); DECLSPEC_IMPORT void WSAAPI FreeAddrInfoW(PADDRINFOW pAddrInfo); #endif /* adjust size value to be multiple of 4. Use to keep pointer aligned */ /* Do we need different versions of this for different architectures? */ #define ALIGNED_SIZE(X) ((((X) + 3) >> 2) << 2) static void uv__getaddrinfo_work(struct uv__work* w) { uv_getaddrinfo_t* req; int err; req = container_of(w, uv_getaddrinfo_t, work_req); err = GetAddrInfoW(req->node, req->service, req->hints, &req->res); req->retcode = uv__getaddrinfo_translate_error(err); } /* * Called from uv_run when complete. Call user specified callback * then free returned addrinfo * Returned addrinfo strings are converted from UTF-16 to UTF-8. * * To minimize allocation we calculate total size required, * and copy all structs and referenced strings into the one block. * Each size calculation is adjusted to avoid unaligned pointers. */ static void uv__getaddrinfo_done(struct uv__work* w, int status) { uv_getaddrinfo_t* req; int addrinfo_len = 0; int name_len = 0; size_t addrinfo_struct_len = ALIGNED_SIZE(sizeof(struct addrinfo)); struct addrinfoW* addrinfow_ptr; struct addrinfo* addrinfo_ptr; char* alloc_ptr = NULL; char* cur_ptr = NULL; req = container_of(w, uv_getaddrinfo_t, work_req); /* release input parameter memory */ if (req->alloc != NULL) { free(req->alloc); req->alloc = NULL; } if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; if (req->res != NULL) { FreeAddrInfoW(req->res); req->res = NULL; } goto complete; } if (req->retcode == 0) { /* convert addrinfoW to addrinfo */ /* first calculate required length */ addrinfow_ptr = req->res; while (addrinfow_ptr != NULL) { addrinfo_len += addrinfo_struct_len + ALIGNED_SIZE(addrinfow_ptr->ai_addrlen); if (addrinfow_ptr->ai_canonname != NULL) { name_len = uv_utf16_to_utf8(addrinfow_ptr->ai_canonname, -1, NULL, 0); if (name_len == 0) { req->retcode = uv_translate_sys_error(GetLastError()); goto complete; } addrinfo_len += ALIGNED_SIZE(name_len); } addrinfow_ptr = addrinfow_ptr->ai_next; } /* allocate memory for addrinfo results */ alloc_ptr = (char*)malloc(addrinfo_len); /* do conversions */ if (alloc_ptr != NULL) { cur_ptr = alloc_ptr; addrinfow_ptr = req->res; while (addrinfow_ptr != NULL) { /* copy addrinfo struct data */ assert(cur_ptr + addrinfo_struct_len <= alloc_ptr + addrinfo_len); addrinfo_ptr = (struct addrinfo*)cur_ptr; addrinfo_ptr->ai_family = addrinfow_ptr->ai_family; addrinfo_ptr->ai_socktype = addrinfow_ptr->ai_socktype; addrinfo_ptr->ai_protocol = addrinfow_ptr->ai_protocol; addrinfo_ptr->ai_flags = addrinfow_ptr->ai_flags; addrinfo_ptr->ai_addrlen = addrinfow_ptr->ai_addrlen; addrinfo_ptr->ai_canonname = NULL; addrinfo_ptr->ai_addr = NULL; addrinfo_ptr->ai_next = NULL; cur_ptr += addrinfo_struct_len; /* copy sockaddr */ if (addrinfo_ptr->ai_addrlen > 0) { assert(cur_ptr + addrinfo_ptr->ai_addrlen <= alloc_ptr + addrinfo_len); memcpy(cur_ptr, addrinfow_ptr->ai_addr, addrinfo_ptr->ai_addrlen); addrinfo_ptr->ai_addr = (struct sockaddr*)cur_ptr; cur_ptr += ALIGNED_SIZE(addrinfo_ptr->ai_addrlen); } /* convert canonical name to UTF-8 */ if (addrinfow_ptr->ai_canonname != NULL) { name_len = uv_utf16_to_utf8(addrinfow_ptr->ai_canonname, -1, NULL, 0); assert(name_len > 0); assert(cur_ptr + name_len <= alloc_ptr + addrinfo_len); name_len = uv_utf16_to_utf8(addrinfow_ptr->ai_canonname, -1, cur_ptr, name_len); assert(name_len > 0); addrinfo_ptr->ai_canonname = cur_ptr; cur_ptr += ALIGNED_SIZE(name_len); } assert(cur_ptr <= alloc_ptr + addrinfo_len); /* set next ptr */ addrinfow_ptr = addrinfow_ptr->ai_next; if (addrinfow_ptr != NULL) { addrinfo_ptr->ai_next = (struct addrinfo*)cur_ptr; } } } else { req->retcode = UV_EAI_MEMORY; } } /* return memory to system */ if (req->res != NULL) { FreeAddrInfoW(req->res); req->res = NULL; } complete: uv__req_unregister(req->loop, req); /* finally do callback with converted result */ req->getaddrinfo_cb(req, req->retcode, (struct addrinfo*)alloc_ptr); } void uv_freeaddrinfo(struct addrinfo* ai) { char* alloc_ptr = (char*)ai; /* release copied result memory */ if (alloc_ptr != NULL) { free(alloc_ptr); } } /* * Entry point for getaddrinfo * we convert the UTF-8 strings to UNICODE * and save the UNICODE string pointers in the req * We also copy hints so that caller does not need to keep memory until the * callback. * return 0 if a callback will be made * return error code if validation fails * * To minimize allocation we calculate total size required, * and copy all structs and referenced strings into the one block. * Each size calculation is adjusted to avoid unaligned pointers. */ int uv_getaddrinfo(uv_loop_t* loop, uv_getaddrinfo_t* req, uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service, const struct addrinfo* hints) { int nodesize = 0; int servicesize = 0; int hintssize = 0; char* alloc_ptr = NULL; int err; if (req == NULL || getaddrinfo_cb == NULL || (node == NULL && service == NULL)) { err = WSAEINVAL; goto error; } uv_req_init(loop, (uv_req_t*)req); req->getaddrinfo_cb = getaddrinfo_cb; req->res = NULL; req->type = UV_GETADDRINFO; req->loop = loop; req->retcode = 0; /* calculate required memory size for all input values */ if (node != NULL) { nodesize = ALIGNED_SIZE(uv_utf8_to_utf16(node, NULL, 0) * sizeof(WCHAR)); if (nodesize == 0) { err = GetLastError(); goto error; } } if (service != NULL) { servicesize = ALIGNED_SIZE(uv_utf8_to_utf16(service, NULL, 0) * sizeof(WCHAR)); if (servicesize == 0) { err = GetLastError(); goto error; } } if (hints != NULL) { hintssize = ALIGNED_SIZE(sizeof(struct addrinfoW)); } /* allocate memory for inputs, and partition it as needed */ alloc_ptr = (char*)malloc(nodesize + servicesize + hintssize); if (!alloc_ptr) { err = WSAENOBUFS; goto error; } /* save alloc_ptr now so we can free if error */ req->alloc = (void*)alloc_ptr; /* convert node string to UTF16 into allocated memory and save pointer in */ /* the reques. */ if (node != NULL) { req->node = (WCHAR*)alloc_ptr; if (uv_utf8_to_utf16(node, (WCHAR*) alloc_ptr, nodesize / sizeof(WCHAR)) == 0) { err = GetLastError(); goto error; } alloc_ptr += nodesize; } else { req->node = NULL; } /* convert service string to UTF16 into allocated memory and save pointer */ /* in the req. */ if (service != NULL) { req->service = (WCHAR*)alloc_ptr; if (uv_utf8_to_utf16(service, (WCHAR*) alloc_ptr, servicesize / sizeof(WCHAR)) == 0) { err = GetLastError(); goto error; } alloc_ptr += servicesize; } else { req->service = NULL; } /* copy hints to allocated memory and save pointer in req */ if (hints != NULL) { req->hints = (struct addrinfoW*)alloc_ptr; req->hints->ai_family = hints->ai_family; req->hints->ai_socktype = hints->ai_socktype; req->hints->ai_protocol = hints->ai_protocol; req->hints->ai_flags = hints->ai_flags; req->hints->ai_addrlen = 0; req->hints->ai_canonname = NULL; req->hints->ai_addr = NULL; req->hints->ai_next = NULL; } else { req->hints = NULL; } uv__work_submit(loop, &req->work_req, uv__getaddrinfo_work, uv__getaddrinfo_done); uv__req_register(loop, req); return 0; error: if (req != NULL && req->alloc != NULL) { free(req->alloc); } return uv_translate_sys_error(err); } MoarVM-2015.11/3rdparty/libuv/src/win/getnameinfo.c0000644000175000017500000001005512456307253020775 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include "uv.h" #include "internal.h" #include "req-inl.h" #ifndef GetNameInfo int WSAAPI GetNameInfoW( const SOCKADDR *pSockaddr, socklen_t SockaddrLength, PWCHAR pNodeBuffer, DWORD NodeBufferSize, PWCHAR pServiceBuffer, DWORD ServiceBufferSize, INT Flags ); #endif static void uv__getnameinfo_work(struct uv__work* w) { uv_getnameinfo_t* req; WCHAR host[NI_MAXHOST]; WCHAR service[NI_MAXSERV]; int ret = 0; req = container_of(w, uv_getnameinfo_t, work_req); if (GetNameInfoW((struct sockaddr*)&req->storage, sizeof(req->storage), host, ARRAY_SIZE(host), service, ARRAY_SIZE(service), req->flags)) { ret = WSAGetLastError(); } req->retcode = uv__getaddrinfo_translate_error(ret); /* convert results to UTF-8 */ WideCharToMultiByte(CP_UTF8, 0, host, -1, req->host, sizeof(req->host), NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, service, -1, req->service, sizeof(req->service), NULL, NULL); } /* * Called from uv_run when complete. */ static void uv__getnameinfo_done(struct uv__work* w, int status) { uv_getnameinfo_t* req; char* host; char* service; req = container_of(w, uv_getnameinfo_t, work_req); uv__req_unregister(req->loop, req); host = service = NULL; if (status == UV_ECANCELED) { assert(req->retcode == 0); req->retcode = UV_EAI_CANCELED; } else if (req->retcode == 0) { host = req->host; service = req->service; } req->getnameinfo_cb(req, req->retcode, host, service); } /* * Entry point for getnameinfo * return 0 if a callback will be made * return error code if validation fails */ int uv_getnameinfo(uv_loop_t* loop, uv_getnameinfo_t* req, uv_getnameinfo_cb getnameinfo_cb, const struct sockaddr* addr, int flags) { if (req == NULL || getnameinfo_cb == NULL || addr == NULL) return UV_EINVAL; if (addr->sa_family == AF_INET) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in)); } else if (addr->sa_family == AF_INET6) { memcpy(&req->storage, addr, sizeof(struct sockaddr_in6)); } else { return UV_EINVAL; } uv_req_init(loop, (uv_req_t*)req); uv__req_register(loop, req); req->getnameinfo_cb = getnameinfo_cb; req->flags = flags; req->type = UV_GETNAMEINFO; req->loop = loop; req->retcode = 0; uv__work_submit(loop, &req->work_req, uv__getnameinfo_work, uv__getnameinfo_done); return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/handle-inl.h0000644000175000017500000001504712456307253020527 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_HANDLE_INL_H_ #define UV_WIN_HANDLE_INL_H_ #include #include #include "uv.h" #include "internal.h" #define DECREASE_ACTIVE_COUNT(loop, handle) \ do { \ if (--(handle)->activecnt == 0 && \ !((handle)->flags & UV__HANDLE_CLOSING)) { \ uv__handle_stop((handle)); \ } \ assert((handle)->activecnt >= 0); \ } while (0) #define INCREASE_ACTIVE_COUNT(loop, handle) \ do { \ if ((handle)->activecnt++ == 0) { \ uv__handle_start((handle)); \ } \ assert((handle)->activecnt > 0); \ } while (0) #define DECREASE_PENDING_REQ_COUNT(handle) \ do { \ assert(handle->reqs_pending > 0); \ handle->reqs_pending--; \ \ if (handle->flags & UV__HANDLE_CLOSING && \ handle->reqs_pending == 0) { \ uv_want_endgame(loop, (uv_handle_t*)handle); \ } \ } while (0) #define uv__handle_closing(handle) \ do { \ assert(!((handle)->flags & UV__HANDLE_CLOSING)); \ \ if (!(((handle)->flags & UV__HANDLE_ACTIVE) && \ ((handle)->flags & UV__HANDLE_REF))) \ uv__active_handle_add((uv_handle_t*) (handle)); \ \ (handle)->flags |= UV__HANDLE_CLOSING; \ (handle)->flags &= ~UV__HANDLE_ACTIVE; \ } while (0) #define uv__handle_close(handle) \ do { \ QUEUE_REMOVE(&(handle)->handle_queue); \ uv__active_handle_rm((uv_handle_t*) (handle)); \ \ (handle)->flags |= UV_HANDLE_CLOSED; \ \ if ((handle)->close_cb) \ (handle)->close_cb((uv_handle_t*) (handle)); \ } while (0) INLINE static void uv_want_endgame(uv_loop_t* loop, uv_handle_t* handle) { if (!(handle->flags & UV_HANDLE_ENDGAME_QUEUED)) { handle->flags |= UV_HANDLE_ENDGAME_QUEUED; handle->endgame_next = loop->endgame_handles; loop->endgame_handles = handle; } } INLINE static void uv_process_endgames(uv_loop_t* loop) { uv_handle_t* handle; while (loop->endgame_handles) { handle = loop->endgame_handles; loop->endgame_handles = handle->endgame_next; handle->flags &= ~UV_HANDLE_ENDGAME_QUEUED; switch (handle->type) { case UV_TCP: uv_tcp_endgame(loop, (uv_tcp_t*) handle); break; case UV_NAMED_PIPE: uv_pipe_endgame(loop, (uv_pipe_t*) handle); break; case UV_TTY: uv_tty_endgame(loop, (uv_tty_t*) handle); break; case UV_UDP: uv_udp_endgame(loop, (uv_udp_t*) handle); break; case UV_POLL: uv_poll_endgame(loop, (uv_poll_t*) handle); break; case UV_TIMER: uv_timer_endgame(loop, (uv_timer_t*) handle); break; case UV_PREPARE: case UV_CHECK: case UV_IDLE: uv_loop_watcher_endgame(loop, handle); break; case UV_ASYNC: uv_async_endgame(loop, (uv_async_t*) handle); break; case UV_SIGNAL: uv_signal_endgame(loop, (uv_signal_t*) handle); break; case UV_PROCESS: uv_process_endgame(loop, (uv_process_t*) handle); break; case UV_FS_EVENT: uv_fs_event_endgame(loop, (uv_fs_event_t*) handle); break; case UV_FS_POLL: uv__fs_poll_endgame(loop, (uv_fs_poll_t*) handle); break; default: assert(0); break; } } } INLINE static HANDLE uv__get_osfhandle(int fd) { /* _get_osfhandle() raises an assert in debug builds if the FD is invalid. */ /* But it also correctly checks the FD and returns INVALID_HANDLE_VALUE */ /* for invalid FDs in release builds (or if you let the assert continue). */ /* So this wrapper function disables asserts when calling _get_osfhandle. */ HANDLE handle; UV_BEGIN_DISABLE_CRT_ASSERT(); handle = (HANDLE) _get_osfhandle(fd); UV_END_DISABLE_CRT_ASSERT(); return handle; } #endif /* UV_WIN_HANDLE_INL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/handle.c0000644000175000017500000000741112456307253017736 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" uv_handle_type uv_guess_handle(uv_file file) { HANDLE handle; DWORD mode; if (file < 0) { return UV_UNKNOWN_HANDLE; } handle = uv__get_osfhandle(file); switch (GetFileType(handle)) { case FILE_TYPE_CHAR: if (GetConsoleMode(handle, &mode)) { return UV_TTY; } else { return UV_FILE; } case FILE_TYPE_PIPE: return UV_NAMED_PIPE; case FILE_TYPE_DISK: return UV_FILE; default: return UV_UNKNOWN_HANDLE; } } int uv_is_active(const uv_handle_t* handle) { return (handle->flags & UV__HANDLE_ACTIVE) && !(handle->flags & UV__HANDLE_CLOSING); } void uv_close(uv_handle_t* handle, uv_close_cb cb) { uv_loop_t* loop = handle->loop; if (handle->flags & UV__HANDLE_CLOSING) { assert(0); return; } handle->close_cb = cb; /* Handle-specific close actions */ switch (handle->type) { case UV_TCP: uv_tcp_close(loop, (uv_tcp_t*)handle); return; case UV_NAMED_PIPE: uv_pipe_close(loop, (uv_pipe_t*) handle); return; case UV_TTY: uv_tty_close((uv_tty_t*) handle); return; case UV_UDP: uv_udp_close(loop, (uv_udp_t*) handle); return; case UV_POLL: uv_poll_close(loop, (uv_poll_t*) handle); return; case UV_TIMER: uv_timer_stop((uv_timer_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_PREPARE: uv_prepare_stop((uv_prepare_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_CHECK: uv_check_stop((uv_check_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_IDLE: uv_idle_stop((uv_idle_t*)handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; case UV_ASYNC: uv_async_close(loop, (uv_async_t*) handle); return; case UV_SIGNAL: uv_signal_close(loop, (uv_signal_t*) handle); return; case UV_PROCESS: uv_process_close(loop, (uv_process_t*) handle); return; case UV_FS_EVENT: uv_fs_event_close(loop, (uv_fs_event_t*) handle); return; case UV_FS_POLL: uv__fs_poll_close((uv_fs_poll_t*) handle); uv__handle_closing(handle); uv_want_endgame(loop, handle); return; default: /* Not supported */ abort(); } } int uv_is_closing(const uv_handle_t* handle) { return !!(handle->flags & (UV__HANDLE_CLOSING | UV_HANDLE_CLOSED)); } MoarVM-2015.11/3rdparty/libuv/src/win/internal.h0000644000175000017500000002644112502366750020327 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_INTERNAL_H_ #define UV_WIN_INTERNAL_H_ #include "uv.h" #include "../uv-common.h" #include "tree.h" #include "winapi.h" #include "winsock.h" #ifdef _MSC_VER # define INLINE __inline # define UV_THREAD_LOCAL __declspec( thread ) #else # define INLINE inline # define UV_THREAD_LOCAL __thread #endif #ifdef _DEBUG extern UV_THREAD_LOCAL int uv__crt_assert_enabled; #define UV_BEGIN_DISABLE_CRT_ASSERT() \ { \ int uv__saved_crt_assert_enabled = uv__crt_assert_enabled; \ uv__crt_assert_enabled = FALSE; #define UV_END_DISABLE_CRT_ASSERT() \ uv__crt_assert_enabled = uv__saved_crt_assert_enabled; \ } #else #define UV_BEGIN_DISABLE_CRT_ASSERT() #define UV_END_DISABLE_CRT_ASSERT() #endif /* * Handles * (also see handle-inl.h) */ /* Used by all handles. */ #define UV_HANDLE_CLOSED 0x00000002 #define UV_HANDLE_ENDGAME_QUEUED 0x00000004 /* uv-common.h: #define UV__HANDLE_CLOSING 0x00000001 */ /* uv-common.h: #define UV__HANDLE_ACTIVE 0x00000040 */ /* uv-common.h: #define UV__HANDLE_REF 0x00000020 */ /* uv-common.h: #define UV_HANDLE_INTERNAL 0x00000080 */ /* Used by streams and UDP handles. */ #define UV_HANDLE_READING 0x00000100 #define UV_HANDLE_BOUND 0x00000200 #define UV_HANDLE_LISTENING 0x00000800 #define UV_HANDLE_CONNECTION 0x00001000 #define UV_HANDLE_CONNECTED 0x00002000 #define UV_HANDLE_READABLE 0x00008000 #define UV_HANDLE_WRITABLE 0x00010000 #define UV_HANDLE_READ_PENDING 0x00020000 #define UV_HANDLE_SYNC_BYPASS_IOCP 0x00040000 #define UV_HANDLE_ZERO_READ 0x00080000 #define UV_HANDLE_EMULATE_IOCP 0x00100000 #define UV_HANDLE_BLOCKING_WRITES 0x00200000 /* Used by uv_tcp_t and uv_udp_t handles */ #define UV_HANDLE_IPV6 0x01000000 /* Only used by uv_tcp_t handles. */ #define UV_HANDLE_TCP_NODELAY 0x02000000 #define UV_HANDLE_TCP_KEEPALIVE 0x04000000 #define UV_HANDLE_TCP_SINGLE_ACCEPT 0x08000000 #define UV_HANDLE_TCP_ACCEPT_STATE_CHANGING 0x10000000 #define UV_HANDLE_TCP_SOCKET_CLOSED 0x20000000 #define UV_HANDLE_SHARED_TCP_SOCKET 0x40000000 /* Only used by uv_pipe_t handles. */ #define UV_HANDLE_NON_OVERLAPPED_PIPE 0x01000000 #define UV_HANDLE_PIPESERVER 0x02000000 #define UV_HANDLE_PIPE_READ_CANCELABLE 0x04000000 /* Only used by uv_tty_t handles. */ #define UV_HANDLE_TTY_READABLE 0x01000000 #define UV_HANDLE_TTY_RAW 0x02000000 #define UV_HANDLE_TTY_SAVED_POSITION 0x04000000 #define UV_HANDLE_TTY_SAVED_ATTRIBUTES 0x08000000 /* Only used by uv_poll_t handles. */ #define UV_HANDLE_POLL_SLOW 0x02000000 /* * Requests: see req-inl.h */ /* * Streams: see stream-inl.h */ /* * TCP */ typedef struct { WSAPROTOCOL_INFOW socket_info; int delayed_error; } uv__ipc_socket_info_ex; int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb); int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client); int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req); void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, uv_write_t* req); void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req); void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, uv_connect_t* req); void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp); void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle); int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex, int tcp_connection); int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid, LPWSAPROTOCOL_INFOW protocol_info); /* * UDP */ void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req); void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, uv_udp_send_t* req); void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle); void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle); /* * Pipes */ int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, char* name, size_t nameSize); int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client); int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb); void uv__pipe_pause_read(uv_pipe_t* handle); void uv__pipe_unpause_read(uv_pipe_t* handle); void uv__pipe_stop_read(uv_pipe_t* handle); void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* req); void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, uv_write_t* req); void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* raw_req); void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, uv_connect_t* req); void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, uv_shutdown_t* req); void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle); void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle); void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle); /* * TTY */ void uv_console_init(); int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_tty_read_stop(uv_tty_t* handle); int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); void uv_tty_close(uv_tty_t* handle); void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req); void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, uv_write_t* req); /* TODO: remove me */ void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* raw_req); /* TODO: remove me */ void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, uv_connect_t* req); void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle); /* * Poll watchers */ void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req); int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle); void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle); /* * Timers */ void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle); DWORD uv__next_timeout(const uv_loop_t* loop); void uv__time_forward(uv_loop_t* loop, uint64_t msecs); void uv_process_timers(uv_loop_t* loop); /* * Loop watchers */ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle); void uv_prepare_invoke(uv_loop_t* loop); void uv_check_invoke(uv_loop_t* loop); void uv_idle_invoke(uv_loop_t* loop); void uv__once_init(); /* * Async watcher */ void uv_async_close(uv_loop_t* loop, uv_async_t* handle); void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle); void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, uv_req_t* req); /* * Signal watcher */ void uv_signals_init(); int uv__signal_dispatch(int signum); void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle); void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle); void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, uv_req_t* req); /* * Spawn */ void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle); void uv_process_close(uv_loop_t* loop, uv_process_t* handle); void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle); /* * Error */ int uv_translate_sys_error(int sys_errno); /* * FS */ void uv_fs_init(); /* * FS Event */ void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, uv_fs_event_t* handle); void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle); void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle); /* * Stat poller. */ void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle); /* * Utilities. */ void uv__util_init(); uint64_t uv__hrtime(double scale); int uv_parent_pid(); __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall); /* * Process stdio handles. */ int uv__stdio_create(uv_loop_t* loop, const uv_process_options_t* options, BYTE** buffer_ptr); void uv__stdio_destroy(BYTE* buffer); void uv__stdio_noinherit(BYTE* buffer); int uv__stdio_verify(BYTE* buffer, WORD size); WORD uv__stdio_size(BYTE* buffer); HANDLE uv__stdio_handle(BYTE* buffer, int fd); /* * Winapi and ntapi utility functions */ void uv_winapi_init(); /* * Winsock utility functions */ void uv_winsock_init(); int uv_ntstatus_to_winsock_error(NTSTATUS status); BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target); BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target); int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, int* addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, OVERLAPPED* overlapped); /* Whether there are any non-IFS LSPs stacked on TCP */ extern int uv_tcp_non_ifs_lsp_ipv4; extern int uv_tcp_non_ifs_lsp_ipv6; /* Ip address used to bind to any port at any interface */ extern struct sockaddr_in uv_addr_ip4_any_; extern struct sockaddr_in6 uv_addr_ip6_any_; #endif /* UV_WIN_INTERNAL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/loop-watcher.c0000644000175000017500000001747612502366750021122 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { if (handle->flags & UV__HANDLE_CLOSING) { assert(!(handle->flags & UV_HANDLE_CLOSED)); handle->flags |= UV_HANDLE_CLOSED; uv__handle_close(handle); } } #define UV_LOOP_WATCHER_DEFINE(name, NAME) \ int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ uv__handle_init(loop, (uv_handle_t*) handle, UV_##NAME); \ \ return 0; \ } \ \ \ int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ uv_loop_t* loop = handle->loop; \ uv_##name##_t* old_head; \ \ assert(handle->type == UV_##NAME); \ \ if (uv__is_active(handle)) \ return 0; \ \ if (cb == NULL) \ return UV_EINVAL; \ \ old_head = loop->name##_handles; \ \ handle->name##_next = old_head; \ handle->name##_prev = NULL; \ \ if (old_head) { \ old_head->name##_prev = handle; \ } \ \ loop->name##_handles = handle; \ \ handle->name##_cb = cb; \ uv__handle_start(handle); \ \ return 0; \ } \ \ \ int uv_##name##_stop(uv_##name##_t* handle) { \ uv_loop_t* loop = handle->loop; \ \ assert(handle->type == UV_##NAME); \ \ if (!uv__is_active(handle)) \ return 0; \ \ /* Update loop head if needed */ \ if (loop->name##_handles == handle) { \ loop->name##_handles = handle->name##_next; \ } \ \ /* Update the iterator-next pointer of needed */ \ if (loop->next_##name##_handle == handle) { \ loop->next_##name##_handle = handle->name##_next; \ } \ \ if (handle->name##_prev) { \ handle->name##_prev->name##_next = handle->name##_next; \ } \ if (handle->name##_next) { \ handle->name##_next->name##_prev = handle->name##_prev; \ } \ \ uv__handle_stop(handle); \ \ return 0; \ } \ \ \ void uv_##name##_invoke(uv_loop_t* loop) { \ uv_##name##_t* handle; \ \ (loop)->next_##name##_handle = (loop)->name##_handles; \ \ while ((loop)->next_##name##_handle != NULL) { \ handle = (loop)->next_##name##_handle; \ (loop)->next_##name##_handle = handle->name##_next; \ \ handle->name##_cb(handle); \ } \ } UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) UV_LOOP_WATCHER_DEFINE(check, CHECK) UV_LOOP_WATCHER_DEFINE(idle, IDLE) MoarVM-2015.11/3rdparty/libuv/src/win/pipe.c0000644000175000017500000016206412456307253017446 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" typedef struct uv__ipc_queue_item_s uv__ipc_queue_item_t; struct uv__ipc_queue_item_s { /* * NOTE: It is important for socket_info_ex to be the first field, * because we will we assigning it to the pending_ipc_info.socket_info */ uv__ipc_socket_info_ex socket_info_ex; QUEUE member; int tcp_connection; }; /* A zero-size buffer for use by uv_pipe_read */ static char uv_zero_[] = ""; /* Null uv_buf_t */ static const uv_buf_t uv_null_buf_ = { 0, NULL }; /* The timeout that the pipe will wait for the remote end to write data */ /* when the local ends wants to shut it down. */ static const int64_t eof_timeout = 50; /* ms */ static const int default_pending_pipe_instances = 4; /* Pipe prefix */ static char pipe_prefix[] = "\\\\?\\pipe"; static const int pipe_prefix_len = sizeof(pipe_prefix) - 1; /* IPC protocol flags. */ #define UV_IPC_RAW_DATA 0x0001 #define UV_IPC_TCP_SERVER 0x0002 #define UV_IPC_TCP_CONNECTION 0x0004 /* IPC frame header. */ typedef struct { int flags; uint64_t raw_data_length; } uv_ipc_frame_header_t; /* IPC frame, which contains an imported TCP socket stream. */ typedef struct { uv_ipc_frame_header_t header; uv__ipc_socket_info_ex socket_info_ex; } uv_ipc_frame_uv_stream; static void eof_timer_init(uv_pipe_t* pipe); static void eof_timer_start(uv_pipe_t* pipe); static void eof_timer_stop(uv_pipe_t* pipe); static void eof_timer_cb(uv_timer_t* timer); static void eof_timer_destroy(uv_pipe_t* pipe); static void eof_timer_close_cb(uv_handle_t* handle); static void uv_unique_pipe_name(char* ptr, char* name, size_t size) { _snprintf(name, size, "\\\\?\\pipe\\uv\\%p-%u", ptr, GetCurrentProcessId()); } int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { uv_stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); handle->reqs_pending = 0; handle->handle = INVALID_HANDLE_VALUE; handle->name = NULL; handle->ipc_pid = 0; handle->remaining_ipc_rawdata_bytes = 0; QUEUE_INIT(&handle->pending_ipc_info.queue); handle->pending_ipc_info.queue_len = 0; handle->ipc = ipc; handle->non_overlapped_writes_tail = NULL; handle->readfile_thread = NULL; uv_req_init(loop, (uv_req_t*) &handle->ipc_header_write_req); return 0; } static void uv_pipe_connection_init(uv_pipe_t* handle) { uv_connection_init((uv_stream_t*) handle); handle->read_req.data = handle; handle->eof_timer = NULL; assert(!(handle->flags & UV_HANDLE_PIPESERVER)); if (pCancelSynchronousIo && handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { uv_mutex_init(&handle->readfile_mutex); handle->flags |= UV_HANDLE_PIPE_READ_CANCELABLE; } } static HANDLE open_named_pipe(const WCHAR* name, DWORD* duplex_flags) { HANDLE pipeHandle; /* * Assume that we have a duplex pipe first, so attempt to * connect with GENERIC_READ | GENERIC_WRITE. */ pipeHandle = CreateFileW(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; return pipeHandle; } /* * If the pipe is not duplex CreateFileW fails with * ERROR_ACCESS_DENIED. In that case try to connect * as a read-only or write-only. */ if (GetLastError() == ERROR_ACCESS_DENIED) { pipeHandle = CreateFileW(name, GENERIC_READ | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_READABLE; return pipeHandle; } } if (GetLastError() == ERROR_ACCESS_DENIED) { pipeHandle = CreateFileW(name, GENERIC_WRITE | FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { *duplex_flags = UV_HANDLE_WRITABLE; return pipeHandle; } } return INVALID_HANDLE_VALUE; } int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, char* name, size_t nameSize) { HANDLE pipeHandle; int err; char* ptr = (char*)handle; for (;;) { uv_unique_pipe_name(ptr, name, nameSize); pipeHandle = CreateNamedPipeA(name, access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { /* No name collisions. We're done. */ break; } err = GetLastError(); if (err != ERROR_PIPE_BUSY && err != ERROR_ACCESS_DENIED) { goto error; } /* Pipe name collision. Increment the pointer and try again. */ ptr++; } if (CreateIoCompletionPort(pipeHandle, loop->iocp, (ULONG_PTR)handle, 0) == NULL) { err = GetLastError(); goto error; } uv_pipe_connection_init(handle); handle->handle = pipeHandle; return 0; error: if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } return err; } static int uv_set_pipe_handle(uv_loop_t* loop, uv_pipe_t* handle, HANDLE pipeHandle, DWORD duplex_flags) { NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_MODE_INFORMATION mode_info; DWORD mode = PIPE_READMODE_BYTE | PIPE_WAIT; DWORD current_mode = 0; DWORD err = 0; if (!SetNamedPipeHandleState(pipeHandle, &mode, NULL, NULL)) { err = GetLastError(); if (err == ERROR_ACCESS_DENIED) { /* * SetNamedPipeHandleState can fail if the handle doesn't have either * GENERIC_WRITE or FILE_WRITE_ATTRIBUTES. * But if the handle already has the desired wait and blocking modes * we can continue. */ if (!GetNamedPipeHandleState(pipeHandle, ¤t_mode, NULL, NULL, NULL, NULL, 0)) { return -1; } else if (current_mode & PIPE_NOWAIT) { SetLastError(ERROR_ACCESS_DENIED); return -1; } } else { /* If this returns ERROR_INVALID_PARAMETER we probably opened * something that is not a pipe. */ if (err == ERROR_INVALID_PARAMETER) { SetLastError(WSAENOTSOCK); } return -1; } } /* Check if the pipe was created with FILE_FLAG_OVERLAPPED. */ nt_status = pNtQueryInformationFile(pipeHandle, &io_status, &mode_info, sizeof(mode_info), FileModeInformation); if (nt_status != STATUS_SUCCESS) { return -1; } if (mode_info.Mode & FILE_SYNCHRONOUS_IO_ALERT || mode_info.Mode & FILE_SYNCHRONOUS_IO_NONALERT) { /* Non-overlapped pipe. */ handle->flags |= UV_HANDLE_NON_OVERLAPPED_PIPE; } else { /* Overlapped pipe. Try to associate with IOCP. */ if (CreateIoCompletionPort(pipeHandle, loop->iocp, (ULONG_PTR)handle, 0) == NULL) { handle->flags |= UV_HANDLE_EMULATE_IOCP; } } handle->handle = pipeHandle; handle->flags |= duplex_flags; return 0; } static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) { uv_loop_t* loop; uv_pipe_t* handle; uv_shutdown_t* req; req = (uv_shutdown_t*) parameter; assert(req); handle = (uv_pipe_t*) req->handle; assert(handle); loop = handle->loop; assert(loop); FlushFileBuffers(handle->handle); /* Post completed */ POST_COMPLETION_FOR_REQ(loop, req); return 0; } void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) { int err; DWORD result; uv_shutdown_t* req; NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_PIPE_LOCAL_INFORMATION pipe_info; uv__ipc_queue_item_t* item; if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { handle->flags &= ~UV_HANDLE_PIPE_READ_CANCELABLE; uv_mutex_destroy(&handle->readfile_mutex); } if ((handle->flags & UV_HANDLE_CONNECTION) && handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { req = handle->shutdown_req; /* Clear the shutdown_req field so we don't go here again. */ handle->shutdown_req = NULL; if (handle->flags & UV__HANDLE_CLOSING) { UNREGISTER_HANDLE_REQ(loop, handle, req); /* Already closing. Cancel the shutdown. */ if (req->cb) { req->cb(req, UV_ECANCELED); } DECREASE_PENDING_REQ_COUNT(handle); return; } /* Try to avoid flushing the pipe buffer in the thread pool. */ nt_status = pNtQueryInformationFile(handle->handle, &io_status, &pipe_info, sizeof pipe_info, FilePipeLocalInformation); if (nt_status != STATUS_SUCCESS) { /* Failure */ UNREGISTER_HANDLE_REQ(loop, handle, req); handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ if (req->cb) { err = pRtlNtStatusToDosError(nt_status); req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); return; } if (pipe_info.OutboundQuota == pipe_info.WriteQuotaAvailable) { /* Short-circuit, no need to call FlushFileBuffers. */ uv_insert_pending_req(loop, (uv_req_t*) req); return; } /* Run FlushFileBuffers in the thread pool. */ result = QueueUserWorkItem(pipe_shutdown_thread_proc, req, WT_EXECUTELONGFUNCTION); if (result) { return; } else { /* Failure. */ UNREGISTER_HANDLE_REQ(loop, handle, req); handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ if (req->cb) { err = GetLastError(); req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); return; } } if (handle->flags & UV__HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (handle->flags & UV_HANDLE_CONNECTION) { /* Free pending sockets */ while (!QUEUE_EMPTY(&handle->pending_ipc_info.queue)) { QUEUE* q; SOCKET socket; q = QUEUE_HEAD(&handle->pending_ipc_info.queue); QUEUE_REMOVE(q); item = QUEUE_DATA(q, uv__ipc_queue_item_t, member); /* Materialize socket and close it */ socket = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &item->socket_info_ex.socket_info, 0, WSA_FLAG_OVERLAPPED); free(item); if (socket != INVALID_SOCKET) closesocket(socket); } handle->pending_ipc_info.queue_len = 0; if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->read_req.wait_handle); handle->read_req.wait_handle = INVALID_HANDLE_VALUE; } if (handle->read_req.event_handle) { CloseHandle(handle->read_req.event_handle); handle->read_req.event_handle = NULL; } } } if (handle->flags & UV_HANDLE_PIPESERVER) { assert(handle->accept_reqs); free(handle->accept_reqs); handle->accept_reqs = NULL; } uv__handle_close(handle); } } void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { handle->pending_instances = count; handle->flags |= UV_HANDLE_PIPESERVER; } /* Creates a pipe server. */ int uv_pipe_bind(uv_pipe_t* handle, const char* name) { uv_loop_t* loop = handle->loop; int i, err, nameSize; uv_pipe_accept_t* req; if (handle->flags & UV_HANDLE_BOUND) { return UV_EINVAL; } if (!name) { return UV_EINVAL; } if (!(handle->flags & UV_HANDLE_PIPESERVER)) { handle->pending_instances = default_pending_pipe_instances; } handle->accept_reqs = (uv_pipe_accept_t*) malloc(sizeof(uv_pipe_accept_t) * handle->pending_instances); if (!handle->accept_reqs) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } for (i = 0; i < handle->pending_instances; i++) { req = &handle->accept_reqs[i]; uv_req_init(loop, (uv_req_t*) req); req->type = UV_ACCEPT; req->data = handle; req->pipeHandle = INVALID_HANDLE_VALUE; req->next_pending = NULL; } /* Convert name to UTF16. */ nameSize = uv_utf8_to_utf16(name, NULL, 0) * sizeof(WCHAR); handle->name = (WCHAR*)malloc(nameSize); if (!handle->name) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } if (!uv_utf8_to_utf16(name, handle->name, nameSize / sizeof(WCHAR))) { err = GetLastError(); goto error; } /* * Attempt to create the first pipe with FILE_FLAG_FIRST_PIPE_INSTANCE. * If this fails then there's already a pipe server for the given pipe name. */ handle->accept_reqs[0].pipeHandle = CreateNamedPipeW(handle->name, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL); if (handle->accept_reqs[0].pipeHandle == INVALID_HANDLE_VALUE) { err = GetLastError(); if (err == ERROR_ACCESS_DENIED) { err = WSAEADDRINUSE; /* Translates to UV_EADDRINUSE. */ } else if (err == ERROR_PATH_NOT_FOUND || err == ERROR_INVALID_NAME) { err = WSAEACCES; /* Translates to UV_EACCES. */ } goto error; } if (uv_set_pipe_handle(loop, handle, handle->accept_reqs[0].pipeHandle, 0)) { err = GetLastError(); goto error; } handle->pending_accepts = NULL; handle->flags |= UV_HANDLE_PIPESERVER; handle->flags |= UV_HANDLE_BOUND; return 0; error: if (handle->name) { free(handle->name); handle->name = NULL; } if (handle->accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(handle->accept_reqs[0].pipeHandle); handle->accept_reqs[0].pipeHandle = INVALID_HANDLE_VALUE; } return uv_translate_sys_error(err); } static DWORD WINAPI pipe_connect_thread_proc(void* parameter) { uv_loop_t* loop; uv_pipe_t* handle; uv_connect_t* req; HANDLE pipeHandle = INVALID_HANDLE_VALUE; DWORD duplex_flags; req = (uv_connect_t*) parameter; assert(req); handle = (uv_pipe_t*) req->handle; assert(handle); loop = handle->loop; assert(loop); /* We're here because CreateFile on a pipe returned ERROR_PIPE_BUSY. */ /* We wait for the pipe to become available with WaitNamedPipe. */ while (WaitNamedPipeW(handle->name, 30000)) { /* The pipe is now available, try to connect. */ pipeHandle = open_named_pipe(handle->name, &duplex_flags); if (pipeHandle != INVALID_HANDLE_VALUE) { break; } SwitchToThread(); } if (pipeHandle != INVALID_HANDLE_VALUE && !uv_set_pipe_handle(loop, handle, pipeHandle, duplex_flags)) { SET_REQ_SUCCESS(req); } else { SET_REQ_ERROR(req, GetLastError()); } /* Post completed */ POST_COMPLETION_FOR_REQ(loop, req); return 0; } void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb) { uv_loop_t* loop = handle->loop; int err, nameSize; HANDLE pipeHandle = INVALID_HANDLE_VALUE; DWORD duplex_flags; uv_req_init(loop, (uv_req_t*) req); req->type = UV_CONNECT; req->handle = (uv_stream_t*) handle; req->cb = cb; /* Convert name to UTF16. */ nameSize = uv_utf8_to_utf16(name, NULL, 0) * sizeof(WCHAR); handle->name = (WCHAR*)malloc(nameSize); if (!handle->name) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } if (!uv_utf8_to_utf16(name, handle->name, nameSize / sizeof(WCHAR))) { err = GetLastError(); goto error; } pipeHandle = open_named_pipe(handle->name, &duplex_flags); if (pipeHandle == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_PIPE_BUSY) { /* Wait for the server to make a pipe instance available. */ if (!QueueUserWorkItem(&pipe_connect_thread_proc, req, WT_EXECUTELONGFUNCTION)) { err = GetLastError(); goto error; } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; return; } err = GetLastError(); goto error; } assert(pipeHandle != INVALID_HANDLE_VALUE); if (uv_set_pipe_handle(loop, (uv_pipe_t*) req->handle, pipeHandle, duplex_flags)) { err = GetLastError(); goto error; } SET_REQ_SUCCESS(req); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); return; error: if (handle->name) { free(handle->name); handle->name = NULL; } if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, err); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); return; } void uv__pipe_pause_read(uv_pipe_t* handle) { if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { /* Pause the ReadFile task briefly, to work around the Windows kernel bug that causes any access to a NamedPipe to deadlock if any process has called ReadFile */ HANDLE h; uv_mutex_lock(&handle->readfile_mutex); h = handle->readfile_thread; while (h) { /* spinlock: we expect this to finish quickly, or we are probably about to deadlock anyways (in the kernel), so it doesn't matter */ pCancelSynchronousIo(h); SwitchToThread(); /* yield thread control briefly */ h = handle->readfile_thread; } } } void uv__pipe_unpause_read(uv_pipe_t* handle) { if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { uv_mutex_unlock(&handle->readfile_mutex); } } void uv__pipe_stop_read(uv_pipe_t* handle) { handle->flags &= ~UV_HANDLE_READING; uv__pipe_pause_read((uv_pipe_t*)handle); uv__pipe_unpause_read((uv_pipe_t*)handle); } /* Cleans up uv_pipe_t (server or connection) and all resources associated */ /* with it. */ void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) { int i; HANDLE pipeHandle; uv__pipe_stop_read(handle); if (handle->name) { free(handle->name); handle->name = NULL; } if (handle->flags & UV_HANDLE_PIPESERVER) { for (i = 0; i < handle->pending_instances; i++) { pipeHandle = handle->accept_reqs[i].pipeHandle; if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); handle->accept_reqs[i].pipeHandle = INVALID_HANDLE_VALUE; } } } if (handle->flags & UV_HANDLE_CONNECTION) { handle->flags &= ~UV_HANDLE_WRITABLE; eof_timer_destroy(handle); } if ((handle->flags & UV_HANDLE_CONNECTION) && handle->handle != INVALID_HANDLE_VALUE) { CloseHandle(handle->handle); handle->handle = INVALID_HANDLE_VALUE; } } void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle) { if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); } if (handle->flags & UV_HANDLE_LISTENING) { handle->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, handle); } uv_pipe_cleanup(loop, handle); if (handle->reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(handle); } static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL firstInstance) { assert(handle->flags & UV_HANDLE_LISTENING); if (!firstInstance) { assert(req->pipeHandle == INVALID_HANDLE_VALUE); req->pipeHandle = CreateNamedPipeW(handle->name, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL); if (req->pipeHandle == INVALID_HANDLE_VALUE) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; return; } if (uv_set_pipe_handle(loop, handle, req->pipeHandle, 0)) { CloseHandle(req->pipeHandle); req->pipeHandle = INVALID_HANDLE_VALUE; SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; return; } } assert(req->pipeHandle != INVALID_HANDLE_VALUE); /* Prepare the overlapped structure. */ memset(&(req->overlapped), 0, sizeof(req->overlapped)); if (!ConnectNamedPipe(req->pipeHandle, &req->overlapped) && GetLastError() != ERROR_IO_PENDING) { if (GetLastError() == ERROR_PIPE_CONNECTED) { SET_REQ_SUCCESS(req); } else { CloseHandle(req->pipeHandle); req->pipeHandle = INVALID_HANDLE_VALUE; /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); } uv_insert_pending_req(loop, (uv_req_t*) req); handle->reqs_pending++; return; } handle->reqs_pending++; } int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client) { uv_loop_t* loop = server->loop; uv_pipe_t* pipe_client; uv_pipe_accept_t* req; QUEUE* q; uv__ipc_queue_item_t* item; int err; if (server->ipc) { if (QUEUE_EMPTY(&server->pending_ipc_info.queue)) { /* No valid pending sockets. */ return WSAEWOULDBLOCK; } q = QUEUE_HEAD(&server->pending_ipc_info.queue); QUEUE_REMOVE(q); server->pending_ipc_info.queue_len--; item = QUEUE_DATA(q, uv__ipc_queue_item_t, member); err = uv_tcp_import((uv_tcp_t*)client, &item->socket_info_ex, item->tcp_connection); if (err != 0) return err; free(item); } else { pipe_client = (uv_pipe_t*)client; /* Find a connection instance that has been connected, but not yet */ /* accepted. */ req = server->pending_accepts; if (!req) { /* No valid connections found, so we error out. */ return WSAEWOULDBLOCK; } /* Initialize the client handle and copy the pipeHandle to the client */ uv_pipe_connection_init(pipe_client); pipe_client->handle = req->pipeHandle; pipe_client->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; /* Prepare the req to pick up a new connection */ server->pending_accepts = req->next_pending; req->next_pending = NULL; req->pipeHandle = INVALID_HANDLE_VALUE; if (!(server->flags & UV__HANDLE_CLOSING)) { uv_pipe_queue_accept(loop, server, req, FALSE); } } return 0; } /* Starts listening for connections for the given pipe. */ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { uv_loop_t* loop = handle->loop; int i; if (handle->flags & UV_HANDLE_LISTENING) { handle->connection_cb = cb; } if (!(handle->flags & UV_HANDLE_BOUND)) { return WSAEINVAL; } if (handle->flags & UV_HANDLE_READING) { return WSAEISCONN; } if (!(handle->flags & UV_HANDLE_PIPESERVER)) { return ERROR_NOT_SUPPORTED; } handle->flags |= UV_HANDLE_LISTENING; INCREASE_ACTIVE_COUNT(loop, handle); handle->connection_cb = cb; /* First pipe handle should have already been created in uv_pipe_bind */ assert(handle->accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE); for (i = 0; i < handle->pending_instances; i++) { uv_pipe_queue_accept(loop, handle, &handle->accept_reqs[i], i == 0); } return 0; } static DWORD WINAPI uv_pipe_zero_readfile_thread_proc(void* parameter) { int result; DWORD bytes; uv_read_t* req = (uv_read_t*) parameter; uv_pipe_t* handle = (uv_pipe_t*) req->data; uv_loop_t* loop = handle->loop; HANDLE hThread = NULL; DWORD err; uv_mutex_t *m = &handle->readfile_mutex; assert(req != NULL); assert(req->type == UV_READ); assert(handle->type == UV_NAMED_PIPE); if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { uv_mutex_lock(m); /* mutex controls *setting* of readfile_thread */ if (DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hThread, 0, TRUE, DUPLICATE_SAME_ACCESS)) { handle->readfile_thread = hThread; } else { hThread = NULL; } uv_mutex_unlock(m); } restart_readfile: result = ReadFile(handle->handle, &uv_zero_, 0, &bytes, NULL); if (!result) { err = GetLastError(); if (err == ERROR_OPERATION_ABORTED && handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { if (handle->flags & UV_HANDLE_READING) { /* just a brief break to do something else */ handle->readfile_thread = NULL; /* resume after it is finished */ uv_mutex_lock(m); handle->readfile_thread = hThread; uv_mutex_unlock(m); goto restart_readfile; } else { result = 1; /* successfully stopped reading */ } } } if (hThread) { assert(hThread == handle->readfile_thread); /* mutex does not control clearing readfile_thread */ handle->readfile_thread = NULL; uv_mutex_lock(m); /* only when we hold the mutex lock is it safe to open or close the handle */ CloseHandle(hThread); uv_mutex_unlock(m); } if (!result) { SET_REQ_ERROR(req, err); } POST_COMPLETION_FOR_REQ(loop, req); return 0; } static DWORD WINAPI uv_pipe_writefile_thread_proc(void* parameter) { int result; DWORD bytes; uv_write_t* req = (uv_write_t*) parameter; uv_pipe_t* handle = (uv_pipe_t*) req->handle; uv_loop_t* loop = handle->loop; assert(req != NULL); assert(req->type == UV_WRITE); assert(handle->type == UV_NAMED_PIPE); assert(req->write_buffer.base); result = WriteFile(handle->handle, req->write_buffer.base, req->write_buffer.len, &bytes, NULL); if (!result) { SET_REQ_ERROR(req, GetLastError()); } POST_COMPLETION_FOR_REQ(loop, req); return 0; } static void CALLBACK post_completion_read_wait(void* context, BOOLEAN timed_out) { uv_read_t* req; uv_tcp_t* handle; req = (uv_read_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->data; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->overlapped.InternalHigh, 0, &req->overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void CALLBACK post_completion_write_wait(void* context, BOOLEAN timed_out) { uv_write_t* req; uv_tcp_t* handle; req = (uv_write_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->handle; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->overlapped.InternalHigh, 0, &req->overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void uv_pipe_queue_read(uv_loop_t* loop, uv_pipe_t* handle) { uv_read_t* req; int result; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle != INVALID_HANDLE_VALUE); req = &handle->read_req; if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { if (!QueueUserWorkItem(&uv_pipe_zero_readfile_thread_proc, req, WT_EXECUTELONGFUNCTION)) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); goto error; } } else { memset(&req->overlapped, 0, sizeof(req->overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->overlapped.hEvent = (HANDLE) ((uintptr_t) req->event_handle | 1); } /* Do 0-read */ result = ReadFile(handle->handle, &uv_zero_, 0, NULL, &req->overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, GetLastError()); goto error; } if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (!req->event_handle) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (!req->event_handle) { uv_fatal_error(GetLastError(), "CreateEvent"); } } if (req->wait_handle == INVALID_HANDLE_VALUE) { if (!RegisterWaitForSingleObject(&req->wait_handle, req->overlapped.hEvent, post_completion_read_wait, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); goto error; } } } } /* Start the eof timer if there is one */ eof_timer_start(handle); handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; return; error: uv_insert_pending_req(loop, (uv_req_t*)req); handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a */ /* read request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) uv_pipe_queue_read(loop, handle); return 0; } static void uv_insert_non_overlapped_write_req(uv_pipe_t* handle, uv_write_t* req) { req->next_req = NULL; if (handle->non_overlapped_writes_tail) { req->next_req = handle->non_overlapped_writes_tail->next_req; handle->non_overlapped_writes_tail->next_req = (uv_req_t*)req; handle->non_overlapped_writes_tail = req; } else { req->next_req = (uv_req_t*)req; handle->non_overlapped_writes_tail = req; } } static uv_write_t* uv_remove_non_overlapped_write_req(uv_pipe_t* handle) { uv_write_t* req; if (handle->non_overlapped_writes_tail) { req = (uv_write_t*)handle->non_overlapped_writes_tail->next_req; if (req == handle->non_overlapped_writes_tail) { handle->non_overlapped_writes_tail = NULL; } else { handle->non_overlapped_writes_tail->next_req = req->next_req; } return req; } else { /* queue empty */ return NULL; } } static void uv_queue_non_overlapped_write(uv_pipe_t* handle) { uv_write_t* req = uv_remove_non_overlapped_write_req(handle); if (req) { if (!QueueUserWorkItem(&uv_pipe_writefile_thread_proc, req, WT_EXECUTELONGFUNCTION)) { uv_fatal_error(GetLastError(), "QueueUserWorkItem"); } } } static int uv_pipe_write_impl(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { int err; int result; uv_tcp_t* tcp_send_handle; uv_write_t* ipc_header_req = NULL; uv_ipc_frame_uv_stream ipc_frame; if (nbufs != 1 && (nbufs != 0 || !send_handle)) { return ERROR_NOT_SUPPORTED; } /* Only TCP handles are supported for sharing. */ if (send_handle && ((send_handle->type != UV_TCP) || (!(send_handle->flags & UV_HANDLE_BOUND) && !(send_handle->flags & UV_HANDLE_CONNECTION)))) { return ERROR_NOT_SUPPORTED; } assert(handle->handle != INVALID_HANDLE_VALUE); uv_req_init(loop, (uv_req_t*) req); req->type = UV_WRITE; req->handle = (uv_stream_t*) handle; req->cb = cb; req->ipc_header = 0; req->event_handle = NULL; req->wait_handle = INVALID_HANDLE_VALUE; memset(&req->overlapped, 0, sizeof(req->overlapped)); if (handle->ipc) { assert(!(handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)); ipc_frame.header.flags = 0; /* Use the IPC framing protocol. */ if (send_handle) { tcp_send_handle = (uv_tcp_t*)send_handle; err = uv_tcp_duplicate_socket(tcp_send_handle, handle->ipc_pid, &ipc_frame.socket_info_ex.socket_info); if (err) { return err; } ipc_frame.socket_info_ex.delayed_error = tcp_send_handle->delayed_error; ipc_frame.header.flags |= UV_IPC_TCP_SERVER; if (tcp_send_handle->flags & UV_HANDLE_CONNECTION) { ipc_frame.header.flags |= UV_IPC_TCP_CONNECTION; } } if (nbufs == 1) { ipc_frame.header.flags |= UV_IPC_RAW_DATA; ipc_frame.header.raw_data_length = bufs[0].len; } /* * Use the provided req if we're only doing a single write. * If we're doing multiple writes, use ipc_header_write_req to do * the first write, and then use the provided req for the second write. */ if (!(ipc_frame.header.flags & UV_IPC_RAW_DATA)) { ipc_header_req = req; } else { /* * Try to use the preallocated write req if it's available. * Otherwise allocate a new one. */ if (handle->ipc_header_write_req.type != UV_WRITE) { ipc_header_req = (uv_write_t*)&handle->ipc_header_write_req; } else { ipc_header_req = (uv_write_t*)malloc(sizeof(uv_write_t)); if (!ipc_header_req) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } } uv_req_init(loop, (uv_req_t*) ipc_header_req); ipc_header_req->type = UV_WRITE; ipc_header_req->handle = (uv_stream_t*) handle; ipc_header_req->cb = NULL; ipc_header_req->ipc_header = 1; } /* Write the header or the whole frame. */ memset(&ipc_header_req->overlapped, 0, sizeof(ipc_header_req->overlapped)); /* Using overlapped IO, but wait for completion before returning. This write is blocking because ipc_frame is on stack. */ ipc_header_req->overlapped.hEvent = CreateEvent(NULL, 1, 0, NULL); if (!ipc_header_req->overlapped.hEvent) { uv_fatal_error(GetLastError(), "CreateEvent"); } result = WriteFile(handle->handle, &ipc_frame, ipc_frame.header.flags & UV_IPC_TCP_SERVER ? sizeof(ipc_frame) : sizeof(ipc_frame.header), NULL, &ipc_header_req->overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { err = GetLastError(); CloseHandle(ipc_header_req->overlapped.hEvent); return err; } if (!result) { /* Request not completed immediately. Wait for it.*/ if (WaitForSingleObject(ipc_header_req->overlapped.hEvent, INFINITE) != WAIT_OBJECT_0) { err = GetLastError(); CloseHandle(ipc_header_req->overlapped.hEvent); return err; } } ipc_header_req->queued_bytes = 0; CloseHandle(ipc_header_req->overlapped.hEvent); ipc_header_req->overlapped.hEvent = NULL; REGISTER_HANDLE_REQ(loop, handle, ipc_header_req); handle->reqs_pending++; handle->write_reqs_pending++; /* If we don't have any raw data to write - we're done. */ if (!(ipc_frame.header.flags & UV_IPC_RAW_DATA)) { return 0; } } if ((handle->flags & (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) == (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) { DWORD bytes; result = WriteFile(handle->handle, bufs[0].base, bufs[0].len, &bytes, NULL); if (!result) { err = GetLastError(); return err; } else { /* Request completed immediately. */ req->queued_bytes = 0; } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->write_reqs_pending++; POST_COMPLETION_FOR_REQ(loop, req); return 0; } else if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { req->write_buffer = bufs[0]; uv_insert_non_overlapped_write_req(handle, req); if (handle->write_reqs_pending == 0) { uv_queue_non_overlapped_write(handle); } /* Request queued by the kernel. */ req->queued_bytes = uv__count_bufs(bufs, nbufs); handle->write_queue_size += req->queued_bytes; } else if (handle->flags & UV_HANDLE_BLOCKING_WRITES) { /* Using overlapped IO, but wait for completion before returning */ req->overlapped.hEvent = CreateEvent(NULL, 1, 0, NULL); if (!req->overlapped.hEvent) { uv_fatal_error(GetLastError(), "CreateEvent"); } result = WriteFile(handle->handle, bufs[0].base, bufs[0].len, NULL, &req->overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { err = GetLastError(); CloseHandle(req->overlapped.hEvent); return err; } if (result) { /* Request completed immediately. */ req->queued_bytes = 0; } else { assert(ipc_header_req != NULL); /* Request queued by the kernel. */ if (WaitForSingleObject(ipc_header_req->overlapped.hEvent, INFINITE) != WAIT_OBJECT_0) { err = GetLastError(); CloseHandle(ipc_header_req->overlapped.hEvent); return uv_translate_sys_error(err); } } CloseHandle(req->overlapped.hEvent); REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->write_reqs_pending++; POST_COMPLETION_FOR_REQ(loop, req); return 0; } else { result = WriteFile(handle->handle, bufs[0].base, bufs[0].len, NULL, &req->overlapped); if (!result && GetLastError() != ERROR_IO_PENDING) { return GetLastError(); } if (result) { /* Request completed immediately. */ req->queued_bytes = 0; } else { /* Request queued by the kernel. */ req->queued_bytes = uv__count_bufs(bufs, nbufs); handle->write_queue_size += req->queued_bytes; } if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (!req->event_handle) { uv_fatal_error(GetLastError(), "CreateEvent"); } if (!RegisterWaitForSingleObject(&req->wait_handle, req->overlapped.hEvent, post_completion_write_wait, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { return GetLastError(); } } } REGISTER_HANDLE_REQ(loop, handle, req); handle->reqs_pending++; handle->write_reqs_pending++; return 0; } int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { return uv_pipe_write_impl(loop, req, handle, bufs, nbufs, NULL, cb); } int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { if (!handle->ipc) { return WSAEINVAL; } return uv_pipe_write_impl(loop, req, handle, bufs, nbufs, send_handle, cb); } static void uv_pipe_read_eof(uv_loop_t* loop, uv_pipe_t* handle, uv_buf_t buf) { /* If there is an eof timer running, we don't need it any more, */ /* so discard it. */ eof_timer_destroy(handle); handle->flags &= ~UV_HANDLE_READABLE; uv_read_stop((uv_stream_t*) handle); handle->read_cb((uv_stream_t*) handle, UV_EOF, &buf); } static void uv_pipe_read_error(uv_loop_t* loop, uv_pipe_t* handle, int error, uv_buf_t buf) { /* If there is an eof timer running, we don't need it any more, */ /* so discard it. */ eof_timer_destroy(handle); uv_read_stop((uv_stream_t*) handle); handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(error), &buf); } static void uv_pipe_read_error_or_eof(uv_loop_t* loop, uv_pipe_t* handle, int error, uv_buf_t buf) { if (error == ERROR_BROKEN_PIPE) { uv_pipe_read_eof(loop, handle, buf); } else { uv_pipe_read_error(loop, handle, error, buf); } } void uv__pipe_insert_pending_socket(uv_pipe_t* handle, uv__ipc_socket_info_ex* info, int tcp_connection) { uv__ipc_queue_item_t* item; item = (uv__ipc_queue_item_t*) malloc(sizeof(*item)); if (item == NULL) uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); memcpy(&item->socket_info_ex, info, sizeof(item->socket_info_ex)); item->tcp_connection = tcp_connection; QUEUE_INSERT_TAIL(&handle->pending_ipc_info.queue, &item->member); handle->pending_ipc_info.queue_len++; } void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* req) { DWORD bytes, avail; uv_buf_t buf; uv_ipc_frame_uv_stream ipc_frame; assert(handle->type == UV_NAMED_PIPE); handle->flags &= ~UV_HANDLE_READ_PENDING; eof_timer_stop(handle); if (!REQ_SUCCESS(req)) { /* An error occurred doing the 0-read. */ if (handle->flags & UV_HANDLE_READING) { uv_pipe_read_error_or_eof(loop, handle, GET_REQ_ERROR(req), uv_null_buf_); } } else { /* Do non-blocking reads until the buffer is empty */ while (handle->flags & UV_HANDLE_READING) { if (!PeekNamedPipe(handle->handle, NULL, 0, NULL, &avail, NULL)) { uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_); break; } if (avail == 0) { /* There is nothing to read after all. */ break; } if (handle->ipc) { /* Use the IPC framing protocol to read the incoming data. */ if (handle->remaining_ipc_rawdata_bytes == 0) { /* We're reading a new frame. First, read the header. */ assert(avail >= sizeof(ipc_frame.header)); if (!ReadFile(handle->handle, &ipc_frame.header, sizeof(ipc_frame.header), &bytes, NULL)) { uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_); break; } assert(bytes == sizeof(ipc_frame.header)); assert(ipc_frame.header.flags <= (UV_IPC_TCP_SERVER | UV_IPC_RAW_DATA | UV_IPC_TCP_CONNECTION)); if (ipc_frame.header.flags & UV_IPC_TCP_SERVER) { assert(avail - sizeof(ipc_frame.header) >= sizeof(ipc_frame.socket_info_ex)); /* Read the TCP socket info. */ if (!ReadFile(handle->handle, &ipc_frame.socket_info_ex, sizeof(ipc_frame) - sizeof(ipc_frame.header), &bytes, NULL)) { uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_); break; } assert(bytes == sizeof(ipc_frame) - sizeof(ipc_frame.header)); /* Store the pending socket info. */ uv__pipe_insert_pending_socket( handle, &ipc_frame.socket_info_ex, ipc_frame.header.flags & UV_IPC_TCP_CONNECTION); } if (ipc_frame.header.flags & UV_IPC_RAW_DATA) { handle->remaining_ipc_rawdata_bytes = ipc_frame.header.raw_data_length; continue; } } else { avail = min(avail, (DWORD)handle->remaining_ipc_rawdata_bytes); } } handle->alloc_cb((uv_handle_t*) handle, avail, &buf); if (buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); break; } assert(buf.base != NULL); if (ReadFile(handle->handle, buf.base, buf.len, &bytes, NULL)) { /* Successful read */ if (handle->ipc) { assert(handle->remaining_ipc_rawdata_bytes >= bytes); handle->remaining_ipc_rawdata_bytes = handle->remaining_ipc_rawdata_bytes - bytes; } handle->read_cb((uv_stream_t*)handle, bytes, &buf); /* Read again only if bytes == buf.len */ if (bytes <= buf.len) { break; } } else { uv_pipe_read_error_or_eof(loop, handle, GetLastError(), buf); break; } } /* Post another 0-read if still reading and not closing. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_pipe_queue_read(loop, handle); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, uv_write_t* req) { int err; assert(handle->type == UV_NAMED_PIPE); assert(handle->write_queue_size >= req->queued_bytes); handle->write_queue_size -= req->queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle) { CloseHandle(req->event_handle); req->event_handle = NULL; } } if (req->ipc_header) { if (req == &handle->ipc_header_write_req) { req->type = UV_UNKNOWN_REQ; } else { free(req); } } else { if (req->cb) { err = GET_REQ_ERROR(req); req->cb(req, uv_translate_sys_error(err)); } } handle->write_reqs_pending--; if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE && handle->non_overlapped_writes_tail) { assert(handle->write_reqs_pending > 0); uv_queue_non_overlapped_write(handle); } if (handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, uv_req_t* raw_req) { uv_pipe_accept_t* req = (uv_pipe_accept_t*) raw_req; assert(handle->type == UV_NAMED_PIPE); if (handle->flags & UV__HANDLE_CLOSING) { /* The req->pipeHandle should be freed already in uv_pipe_cleanup(). */ assert(req->pipeHandle == INVALID_HANDLE_VALUE); DECREASE_PENDING_REQ_COUNT(handle); return; } if (REQ_SUCCESS(req)) { assert(req->pipeHandle != INVALID_HANDLE_VALUE); req->next_pending = handle->pending_accepts; handle->pending_accepts = req; if (handle->connection_cb) { handle->connection_cb((uv_stream_t*)handle, 0); } } else { if (req->pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(req->pipeHandle); req->pipeHandle = INVALID_HANDLE_VALUE; } if (!(handle->flags & UV__HANDLE_CLOSING)) { uv_pipe_queue_accept(loop, handle, req, FALSE); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, uv_connect_t* req) { int err; assert(handle->type == UV_NAMED_PIPE); UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = 0; if (REQ_SUCCESS(req)) { uv_pipe_connection_init(handle); } else { err = GET_REQ_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, uv_shutdown_t* req) { assert(handle->type == UV_NAMED_PIPE); UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_READABLE) { /* Initialize and optionally start the eof timer. Only do this if the */ /* pipe is readable and we haven't seen EOF come in ourselves. */ eof_timer_init(handle); /* If reading start the timer right now. */ /* Otherwise uv_pipe_queue_read will start it. */ if (handle->flags & UV_HANDLE_READ_PENDING) { eof_timer_start(handle); } } else { /* This pipe is not readable. We can just close it to let the other end */ /* know that we're done writing. */ CloseHandle(handle->handle); handle->handle = INVALID_HANDLE_VALUE; } if (req->cb) { req->cb(req, 0); } DECREASE_PENDING_REQ_COUNT(handle); } static void eof_timer_init(uv_pipe_t* pipe) { int r; assert(pipe->eof_timer == NULL); assert(pipe->flags & UV_HANDLE_CONNECTION); pipe->eof_timer = (uv_timer_t*) malloc(sizeof *pipe->eof_timer); r = uv_timer_init(pipe->loop, pipe->eof_timer); assert(r == 0); /* timers can't fail */ pipe->eof_timer->data = pipe; uv_unref((uv_handle_t*) pipe->eof_timer); } static void eof_timer_start(uv_pipe_t* pipe) { assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->eof_timer != NULL) { uv_timer_start(pipe->eof_timer, eof_timer_cb, eof_timeout, 0); } } static void eof_timer_stop(uv_pipe_t* pipe) { assert(pipe->flags & UV_HANDLE_CONNECTION); if (pipe->eof_timer != NULL) { uv_timer_stop(pipe->eof_timer); } } static void eof_timer_cb(uv_timer_t* timer) { uv_pipe_t* pipe = (uv_pipe_t*) timer->data; uv_loop_t* loop = timer->loop; assert(pipe->type == UV_NAMED_PIPE); /* This should always be true, since we start the timer only */ /* in uv_pipe_queue_read after successfully calling ReadFile, */ /* or in uv_process_pipe_shutdown_req if a read is pending, */ /* and we always immediately stop the timer in */ /* uv_process_pipe_read_req. */ assert(pipe->flags & UV_HANDLE_READ_PENDING); /* If there are many packets coming off the iocp then the timer callback */ /* may be called before the read request is coming off the queue. */ /* Therefore we check here if the read request has completed but will */ /* be processed later. */ if ((pipe->flags & UV_HANDLE_READ_PENDING) && HasOverlappedIoCompleted(&pipe->read_req.overlapped)) { return; } /* Force both ends off the pipe. */ CloseHandle(pipe->handle); pipe->handle = INVALID_HANDLE_VALUE; /* Stop reading, so the pending read that is going to fail will */ /* not be reported to the user. */ uv_read_stop((uv_stream_t*) pipe); /* Report the eof and update flags. This will get reported even if the */ /* user stopped reading in the meantime. TODO: is that okay? */ uv_pipe_read_eof(loop, pipe, uv_null_buf_); } static void eof_timer_destroy(uv_pipe_t* pipe) { assert(pipe->flags && UV_HANDLE_CONNECTION); if (pipe->eof_timer) { uv_close((uv_handle_t*) pipe->eof_timer, eof_timer_close_cb); pipe->eof_timer = NULL; } } static void eof_timer_close_cb(uv_handle_t* handle) { assert(handle->type == UV_TIMER); free(handle); } int uv_pipe_open(uv_pipe_t* pipe, uv_file file) { HANDLE os_handle = uv__get_osfhandle(file); NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_ACCESS_INFORMATION access; DWORD duplex_flags = 0; /* Determine what kind of permissions we have on this handle. * Cygwin opens the pipe in message mode, but we can support it, * just query the access flags and set the stream flags accordingly. */ nt_status = pNtQueryInformationFile(os_handle, &io_status, &access, sizeof(access), FileAccessInformation); if (nt_status != STATUS_SUCCESS) return UV_EINVAL; if (pipe->ipc) { if (!(access.AccessFlags & FILE_WRITE_DATA) || !(access.AccessFlags & FILE_READ_DATA)) { return UV_EINVAL; } } if (access.AccessFlags & FILE_WRITE_DATA) duplex_flags |= UV_HANDLE_WRITABLE; if (access.AccessFlags & FILE_READ_DATA) duplex_flags |= UV_HANDLE_READABLE; if (os_handle == INVALID_HANDLE_VALUE || uv_set_pipe_handle(pipe->loop, pipe, os_handle, duplex_flags) == -1) { return UV_EINVAL; } uv_pipe_connection_init(pipe); if (pipe->ipc) { assert(!(pipe->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)); pipe->ipc_pid = uv_parent_pid(); assert(pipe->ipc_pid != -1); } return 0; } int uv_pipe_getsockname(const uv_pipe_t* handle, char* buf, size_t* len) { NTSTATUS nt_status; IO_STATUS_BLOCK io_status; FILE_NAME_INFORMATION tmp_name_info; FILE_NAME_INFORMATION* name_info; WCHAR* name_buf; unsigned int addrlen; unsigned int name_size; unsigned int name_len; int err; name_info = NULL; if (handle->handle == INVALID_HANDLE_VALUE) { *len = 0; return UV_EINVAL; } uv__pipe_pause_read((uv_pipe_t*)handle); /* cast away const warning */ nt_status = pNtQueryInformationFile(handle->handle, &io_status, &tmp_name_info, sizeof tmp_name_info, FileNameInformation); if (nt_status == STATUS_BUFFER_OVERFLOW) { name_size = sizeof(*name_info) + tmp_name_info.FileNameLength; name_info = malloc(name_size); if (!name_info) { *len = 0; err = UV_ENOMEM; goto cleanup; } nt_status = pNtQueryInformationFile(handle->handle, &io_status, name_info, name_size, FileNameInformation); } if (nt_status != STATUS_SUCCESS) { *len = 0; err = uv_translate_sys_error(pRtlNtStatusToDosError(nt_status)); goto error; } if (!name_info) { /* the struct on stack was used */ name_buf = tmp_name_info.FileName; name_len = tmp_name_info.FileNameLength; } else { name_buf = name_info->FileName; name_len = name_info->FileNameLength; } if (name_len == 0) { *len = 0; err = 0; goto error; } name_len /= sizeof(WCHAR); /* check how much space we need */ addrlen = WideCharToMultiByte(CP_UTF8, 0, name_buf, name_len, NULL, 0, NULL, NULL); if (!addrlen) { *len = 0; err = uv_translate_sys_error(GetLastError()); goto error; } else if (pipe_prefix_len + addrlen + 1 > *len) { /* "\\\\.\\pipe" + name + '\0' */ *len = pipe_prefix_len + addrlen + 1; err = UV_ENOBUFS; goto error; } memcpy(buf, pipe_prefix, pipe_prefix_len); addrlen = WideCharToMultiByte(CP_UTF8, 0, name_buf, name_len, buf+pipe_prefix_len, *len-pipe_prefix_len, NULL, NULL); if (!addrlen) { *len = 0; err = uv_translate_sys_error(GetLastError()); goto error; } addrlen += pipe_prefix_len; buf[addrlen++] = '\0'; *len = addrlen; err = 0; goto cleanup; error: free(name_info); cleanup: uv__pipe_unpause_read((uv_pipe_t*)handle); /* cast away const warning */ return err; } int uv_pipe_pending_count(uv_pipe_t* handle) { if (!handle->ipc) return 0; return handle->pending_ipc_info.queue_len; } uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { if (!handle->ipc) return UV_UNKNOWN_HANDLE; if (handle->pending_ipc_info.queue_len == 0) return UV_UNKNOWN_HANDLE; else return UV_TCP; } MoarVM-2015.11/3rdparty/libuv/src/win/poll.c0000644000175000017500000004236412502366750017456 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" static const GUID uv_msafd_provider_ids[UV_MSAFD_PROVIDER_COUNT] = { {0xe70f1aa0, 0xab8b, 0x11cf, {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}, {0xf9eab0c0, 0x26d4, 0x11d0, {0xbb, 0xbf, 0x00, 0xaa, 0x00, 0x6c, 0x34, 0xe4}}, {0x9fc48064, 0x7298, 0x43e4, {0xb7, 0xbd, 0x18, 0x1f, 0x20, 0x89, 0x79, 0x2a}} }; typedef struct uv_single_fd_set_s { unsigned int fd_count; SOCKET fd_array[1]; } uv_single_fd_set_t; static OVERLAPPED overlapped_dummy_; static uv_once_t overlapped_dummy_init_guard_ = UV_ONCE_INIT; static void uv__init_overlapped_dummy(void) { HANDLE event; event = CreateEvent(NULL, TRUE, TRUE, NULL); if (event == NULL) uv_fatal_error(GetLastError(), "CreateEvent"); memset(&overlapped_dummy_, 0, sizeof overlapped_dummy_); overlapped_dummy_.hEvent = (HANDLE) ((uintptr_t) event | 1); } static OVERLAPPED* uv__get_overlapped_dummy() { uv_once(&overlapped_dummy_init_guard_, uv__init_overlapped_dummy); return &overlapped_dummy_; } static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { uv_req_t* req; AFD_POLL_INFO* afd_poll_info; DWORD result; /* Find a yet unsubmitted req to submit. */ if (handle->submitted_events_1 == 0) { req = &handle->poll_req_1; afd_poll_info = &handle->afd_poll_info_1; handle->submitted_events_1 = handle->events; handle->mask_events_1 = 0; handle->mask_events_2 = handle->events; } else if (handle->submitted_events_2 == 0) { req = &handle->poll_req_2; afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = handle->events; handle->mask_events_1 = handle->events; handle->mask_events_2 = 0; } else { assert(0); return; } /* Setting Exclusive to TRUE makes the other poll request return if there */ /* is any. */ afd_poll_info->Exclusive = TRUE; afd_poll_info->NumberOfHandles = 1; afd_poll_info->Timeout.QuadPart = INT64_MAX; afd_poll_info->Handles[0].Handle = (HANDLE) handle->socket; afd_poll_info->Handles[0].Status = 0; afd_poll_info->Handles[0].Events = 0; if (handle->events & UV_READABLE) { afd_poll_info->Handles[0].Events |= AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT; } if (handle->events & UV_WRITABLE) { afd_poll_info->Handles[0].Events |= AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL; } memset(&req->overlapped, 0, sizeof req->overlapped); result = uv_msafd_poll((SOCKET) handle->peer_socket, afd_poll_info, &req->overlapped); if (result != 0 && WSAGetLastError() != WSA_IO_PENDING) { /* Queue this req, reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); } } static int uv__fast_poll_cancel_poll_req(uv_loop_t* loop, uv_poll_t* handle) { AFD_POLL_INFO afd_poll_info; int result; afd_poll_info.Exclusive = TRUE; afd_poll_info.NumberOfHandles = 1; afd_poll_info.Timeout.QuadPart = INT64_MAX; afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket; afd_poll_info.Handles[0].Status = 0; afd_poll_info.Handles[0].Events = AFD_POLL_ALL; result = uv_msafd_poll(handle->socket, &afd_poll_info, uv__get_overlapped_dummy()); if (result == SOCKET_ERROR) { DWORD error = WSAGetLastError(); if (error != WSA_IO_PENDING) { return WSAGetLastError(); } } return 0; } static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { unsigned char mask_events; AFD_POLL_INFO* afd_poll_info; if (req == &handle->poll_req_1) { afd_poll_info = &handle->afd_poll_info_1; handle->submitted_events_1 = 0; mask_events = handle->mask_events_1; } else if (req == &handle->poll_req_2) { afd_poll_info = &handle->afd_poll_info_2; handle->submitted_events_2 = 0; mask_events = handle->mask_events_2; } else { assert(0); return; } /* Report an error unless the select was just interrupted. */ if (!REQ_SUCCESS(req)) { DWORD error = GET_REQ_SOCK_ERROR(req); if (error != WSAEINTR && handle->events != 0) { handle->events = 0; /* Stop the watcher */ handle->poll_cb(handle, uv_translate_sys_error(error), 0); } } else if (afd_poll_info->NumberOfHandles >= 1) { unsigned char events = 0; if ((afd_poll_info->Handles[0].Events & (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT)) != 0) { events |= UV_READABLE; } if ((afd_poll_info->Handles[0].Events & (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) != 0) { events |= UV_WRITABLE; } events &= handle->events & ~mask_events; if (afd_poll_info->Handles[0].Events & AFD_POLL_LOCAL_CLOSE) { /* Stop polling. */ handle->events = 0; if (uv__is_active(handle)) uv__handle_stop(handle); } if (events != 0) { handle->poll_cb(handle, 0, events); } } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__fast_poll_submit_poll_req(loop, handle); } else if ((handle->flags & UV__HANDLE_CLOSING) && handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } static int uv__fast_poll_set(uv_loop_t* loop, uv_poll_t* handle, int events) { assert(handle->type == UV_POLL); assert(!(handle->flags & UV__HANDLE_CLOSING)); assert((events & ~(UV_READABLE | UV_WRITABLE)) == 0); handle->events = events; if (handle->events != 0) { uv__handle_start(handle); } else { uv__handle_stop(handle); } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__fast_poll_submit_poll_req(handle->loop, handle); } return 0; } static int uv__fast_poll_close(uv_loop_t* loop, uv_poll_t* handle) { handle->events = 0; uv__handle_closing(handle); if (handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); return 0; } else { /* Cancel outstanding poll requests by executing another, unique poll */ /* request that forces the outstanding ones to return. */ return uv__fast_poll_cancel_poll_req(loop, handle); } } static SOCKET uv__fast_poll_create_peer_socket(HANDLE iocp, WSAPROTOCOL_INFOW* protocol_info) { SOCKET sock = 0; sock = WSASocketW(protocol_info->iAddressFamily, protocol_info->iSocketType, protocol_info->iProtocol, protocol_info, 0, WSA_FLAG_OVERLAPPED); if (sock == INVALID_SOCKET) { return INVALID_SOCKET; } if (!SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)) { goto error; }; if (CreateIoCompletionPort((HANDLE) sock, iocp, (ULONG_PTR) sock, 0) == NULL) { goto error; } return sock; error: closesocket(sock); return INVALID_SOCKET; } static SOCKET uv__fast_poll_get_peer_socket(uv_loop_t* loop, WSAPROTOCOL_INFOW* protocol_info) { int index, i; SOCKET peer_socket; index = -1; for (i = 0; (size_t) i < ARRAY_SIZE(uv_msafd_provider_ids); i++) { if (memcmp((void*) &protocol_info->ProviderId, (void*) &uv_msafd_provider_ids[i], sizeof protocol_info->ProviderId) == 0) { index = i; } } /* Check if the protocol uses an msafd socket. */ if (index < 0) { return INVALID_SOCKET; } /* If we didn't (try) to create a peer socket yet, try to make one. Don't */ /* try again if the peer socket creation failed earlier for the same */ /* protocol. */ peer_socket = loop->poll_peer_sockets[index]; if (peer_socket == 0) { peer_socket = uv__fast_poll_create_peer_socket(loop->iocp, protocol_info); loop->poll_peer_sockets[index] = peer_socket; } return peer_socket; } static DWORD WINAPI uv__slow_poll_thread_proc(void* arg) { uv_req_t* req = (uv_req_t*) arg; uv_poll_t* handle = (uv_poll_t*) req->data; unsigned char reported_events; int r; uv_single_fd_set_t rfds, wfds, efds; struct timeval timeout; assert(handle->type == UV_POLL); assert(req->type == UV_POLL_REQ); if (handle->events & UV_READABLE) { rfds.fd_count = 1; rfds.fd_array[0] = handle->socket; } else { rfds.fd_count = 0; } if (handle->events & UV_WRITABLE) { wfds.fd_count = 1; wfds.fd_array[0] = handle->socket; efds.fd_count = 1; efds.fd_array[0] = handle->socket; } else { wfds.fd_count = 0; efds.fd_count = 0; } /* Make the select() time out after 3 minutes. If select() hangs because */ /* the user closed the socket, we will at least not hang indefinitely. */ timeout.tv_sec = 3 * 60; timeout.tv_usec = 0; r = select(1, (fd_set*) &rfds, (fd_set*) &wfds, (fd_set*) &efds, &timeout); if (r == SOCKET_ERROR) { /* Queue this req, reporting an error. */ SET_REQ_ERROR(&handle->poll_req_1, WSAGetLastError()); POST_COMPLETION_FOR_REQ(handle->loop, req); return 0; } reported_events = 0; if (r > 0) { if (rfds.fd_count > 0) { assert(rfds.fd_count == 1); assert(rfds.fd_array[0] == handle->socket); reported_events |= UV_READABLE; } if (wfds.fd_count > 0) { assert(wfds.fd_count == 1); assert(wfds.fd_array[0] == handle->socket); reported_events |= UV_WRITABLE; } else if (efds.fd_count > 0) { assert(efds.fd_count == 1); assert(efds.fd_array[0] == handle->socket); reported_events |= UV_WRITABLE; } } SET_REQ_SUCCESS(req); req->overlapped.InternalHigh = (DWORD) reported_events; POST_COMPLETION_FOR_REQ(handle->loop, req); return 0; } static void uv__slow_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { uv_req_t* req; /* Find a yet unsubmitted req to submit. */ if (handle->submitted_events_1 == 0) { req = &handle->poll_req_1; handle->submitted_events_1 = handle->events; handle->mask_events_1 = 0; handle->mask_events_2 = handle->events; } else if (handle->submitted_events_2 == 0) { req = &handle->poll_req_2; handle->submitted_events_2 = handle->events; handle->mask_events_1 = handle->events; handle->mask_events_2 = 0; } else { assert(0); return; } if (!QueueUserWorkItem(uv__slow_poll_thread_proc, (void*) req, WT_EXECUTELONGFUNCTION)) { /* Make this req pending, reporting an error. */ SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, req); } } static void uv__slow_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { unsigned char mask_events; int err; if (req == &handle->poll_req_1) { handle->submitted_events_1 = 0; mask_events = handle->mask_events_1; } else if (req == &handle->poll_req_2) { handle->submitted_events_2 = 0; mask_events = handle->mask_events_2; } else { assert(0); return; } if (!REQ_SUCCESS(req)) { /* Error. */ if (handle->events != 0) { err = GET_REQ_ERROR(req); handle->events = 0; /* Stop the watcher */ handle->poll_cb(handle, uv_translate_sys_error(err), 0); } } else { /* Got some events. */ int events = req->overlapped.InternalHigh & handle->events & ~mask_events; if (events != 0) { handle->poll_cb(handle, 0, events); } } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__slow_poll_submit_poll_req(loop, handle); } else if ((handle->flags & UV__HANDLE_CLOSING) && handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } static int uv__slow_poll_set(uv_loop_t* loop, uv_poll_t* handle, int events) { assert(handle->type == UV_POLL); assert(!(handle->flags & UV__HANDLE_CLOSING)); assert((events & ~(UV_READABLE | UV_WRITABLE)) == 0); handle->events = events; if (handle->events != 0) { uv__handle_start(handle); } else { uv__handle_stop(handle); } if ((handle->events & ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { uv__slow_poll_submit_poll_req(handle->loop, handle); } return 0; } static int uv__slow_poll_close(uv_loop_t* loop, uv_poll_t* handle) { handle->events = 0; uv__handle_closing(handle); if (handle->submitted_events_1 == 0 && handle->submitted_events_2 == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } return 0; } int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { return uv_poll_init_socket(loop, handle, (SOCKET) uv__get_osfhandle(fd)); } int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, uv_os_sock_t socket) { WSAPROTOCOL_INFOW protocol_info; int len; SOCKET peer_socket, base_socket; DWORD bytes; /* Try to obtain a base handle for the socket. This increases this chances */ /* that we find an AFD handle and are able to use the fast poll mechanism. */ /* This will always fail on windows XP/2k3, since they don't support the */ /* SIO_BASE_HANDLE ioctl. */ #ifndef NDEBUG base_socket = INVALID_SOCKET; #endif if (WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket, sizeof base_socket, &bytes, NULL, NULL) == 0) { assert(base_socket != 0 && base_socket != INVALID_SOCKET); socket = base_socket; } uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); handle->socket = socket; handle->events = 0; /* Obtain protocol information about the socket. */ len = sizeof protocol_info; if (getsockopt(socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &len) != 0) { return uv_translate_sys_error(WSAGetLastError()); } /* Get the peer socket that is needed to enable fast poll. If the returned */ /* value is NULL, the protocol is not implemented by MSAFD and we'll have */ /* to use slow mode. */ peer_socket = uv__fast_poll_get_peer_socket(loop, &protocol_info); if (peer_socket != INVALID_SOCKET) { /* Initialize fast poll specific fields. */ handle->peer_socket = peer_socket; } else { /* Initialize slow poll specific fields. */ handle->flags |= UV_HANDLE_POLL_SLOW; } /* Intialize 2 poll reqs. */ handle->submitted_events_1 = 0; uv_req_init(loop, (uv_req_t*) &(handle->poll_req_1)); handle->poll_req_1.type = UV_POLL_REQ; handle->poll_req_1.data = handle; handle->submitted_events_2 = 0; uv_req_init(loop, (uv_req_t*) &(handle->poll_req_2)); handle->poll_req_2.type = UV_POLL_REQ; handle->poll_req_2.data = handle; return 0; } int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb) { int err; if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { err = uv__fast_poll_set(handle->loop, handle, events); } else { err = uv__slow_poll_set(handle->loop, handle, events); } if (err) { return uv_translate_sys_error(err); } handle->poll_cb = cb; return 0; } int uv_poll_stop(uv_poll_t* handle) { int err; if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { err = uv__fast_poll_set(handle->loop, handle, 0); } else { err = uv__slow_poll_set(handle->loop, handle, 0); } return uv_translate_sys_error(err); } void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { uv__fast_poll_process_poll_req(loop, handle, req); } else { uv__slow_poll_process_poll_req(loop, handle, req); } } int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle) { if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { return uv__fast_poll_close(loop, handle); } else { return uv__slow_poll_close(loop, handle); } } void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle) { assert(handle->flags & UV__HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); assert(handle->submitted_events_1 == 0); assert(handle->submitted_events_2 == 0); uv__handle_close(handle); } MoarVM-2015.11/3rdparty/libuv/src/win/process-stdio.c0000644000175000017500000003602012456307253021277 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" /* * The `child_stdio_buffer` buffer has the following layout: * int number_of_fds * unsigned char crt_flags[number_of_fds] * HANDLE os_handle[number_of_fds] */ #define CHILD_STDIO_SIZE(count) \ (sizeof(int) + \ sizeof(unsigned char) * (count) + \ sizeof(uintptr_t) * (count)) #define CHILD_STDIO_COUNT(buffer) \ *((unsigned int*) (buffer)) #define CHILD_STDIO_CRT_FLAGS(buffer, fd) \ *((unsigned char*) (buffer) + sizeof(int) + fd) #define CHILD_STDIO_HANDLE(buffer, fd) \ *((HANDLE*) ((unsigned char*) (buffer) + \ sizeof(int) + \ sizeof(unsigned char) * \ CHILD_STDIO_COUNT((buffer)) + \ sizeof(HANDLE) * (fd))) /* CRT file descriptor mode flags */ #define FOPEN 0x01 #define FEOFLAG 0x02 #define FCRLF 0x04 #define FPIPE 0x08 #define FNOINHERIT 0x10 #define FAPPEND 0x20 #define FDEV 0x40 #define FTEXT 0x80 /* * Clear the HANDLE_FLAG_INHERIT flag from all HANDLEs that were inherited * the parent process. Don't check for errors - the stdio handles may not be * valid, or may be closed already. There is no guarantee that this function * does a perfect job. */ void uv_disable_stdio_inheritance(void) { HANDLE handle; STARTUPINFOW si; /* Make the windows stdio handles non-inheritable. */ handle = GetStdHandle(STD_INPUT_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); handle = GetStdHandle(STD_OUTPUT_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); handle = GetStdHandle(STD_ERROR_HANDLE); if (handle != NULL && handle != INVALID_HANDLE_VALUE) SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); /* Make inherited CRT FDs non-inheritable. */ GetStartupInfoW(&si); if (uv__stdio_verify(si.lpReserved2, si.cbReserved2)) uv__stdio_noinherit(si.lpReserved2); } static int uv__create_stdio_pipe_pair(uv_loop_t* loop, uv_pipe_t* server_pipe, HANDLE* child_pipe_ptr, unsigned int flags) { char pipe_name[64]; SECURITY_ATTRIBUTES sa; DWORD server_access = 0; DWORD client_access = 0; HANDLE child_pipe = INVALID_HANDLE_VALUE; int err; if (flags & UV_READABLE_PIPE) { /* The server needs inbound access too, otherwise CreateNamedPipe() */ /* won't give us the FILE_READ_ATTRIBUTES permission. We need that to */ /* probe the state of the write buffer when we're trying to shutdown */ /* the pipe. */ server_access |= PIPE_ACCESS_OUTBOUND | PIPE_ACCESS_INBOUND; client_access |= GENERIC_READ | FILE_WRITE_ATTRIBUTES; } if (flags & UV_WRITABLE_PIPE) { server_access |= PIPE_ACCESS_INBOUND; client_access |= GENERIC_WRITE | FILE_READ_ATTRIBUTES; } /* Create server pipe handle. */ err = uv_stdio_pipe_server(loop, server_pipe, server_access, pipe_name, sizeof(pipe_name)); if (err) goto error; /* Create child pipe handle. */ sa.nLength = sizeof sa; sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; child_pipe = CreateFileA(pipe_name, client_access, 0, &sa, OPEN_EXISTING, server_pipe->ipc ? FILE_FLAG_OVERLAPPED : 0, NULL); if (child_pipe == INVALID_HANDLE_VALUE) { err = GetLastError(); goto error; } #ifndef NDEBUG /* Validate that the pipe was opened in the right mode. */ { DWORD mode; BOOL r = GetNamedPipeHandleState(child_pipe, &mode, NULL, NULL, NULL, NULL, 0); assert(r == TRUE); assert(mode == (PIPE_READMODE_BYTE | PIPE_WAIT)); } #endif /* Do a blocking ConnectNamedPipe. This should not block because we have */ /* both ends of the pipe created. */ if (!ConnectNamedPipe(server_pipe->handle, NULL)) { if (GetLastError() != ERROR_PIPE_CONNECTED) { err = GetLastError(); goto error; } } /* The server end is now readable and/or writable. */ if (flags & UV_READABLE_PIPE) server_pipe->flags |= UV_HANDLE_WRITABLE; if (flags & UV_WRITABLE_PIPE) server_pipe->flags |= UV_HANDLE_READABLE; *child_pipe_ptr = child_pipe; return 0; error: if (server_pipe->handle != INVALID_HANDLE_VALUE) { uv_pipe_cleanup(loop, server_pipe); } if (child_pipe != INVALID_HANDLE_VALUE) { CloseHandle(child_pipe); } return err; } static int uv__duplicate_handle(uv_loop_t* loop, HANDLE handle, HANDLE* dup) { HANDLE current_process; /* _get_osfhandle will sometimes return -2 in case of an error. This seems */ /* to happen when fd <= 2 and the process' corresponding stdio handle is */ /* set to NULL. Unfortunately DuplicateHandle will happily duplicate */ /* (HANDLE) -2, so this situation goes unnoticed until someone tries to */ /* use the duplicate. Therefore we filter out known-invalid handles here. */ if (handle == INVALID_HANDLE_VALUE || handle == NULL || handle == (HANDLE) -2) { *dup = INVALID_HANDLE_VALUE; return ERROR_INVALID_HANDLE; } current_process = GetCurrentProcess(); if (!DuplicateHandle(current_process, handle, current_process, dup, 0, TRUE, DUPLICATE_SAME_ACCESS)) { *dup = INVALID_HANDLE_VALUE; return GetLastError(); } return 0; } static int uv__duplicate_fd(uv_loop_t* loop, int fd, HANDLE* dup) { HANDLE handle; if (fd == -1) { *dup = INVALID_HANDLE_VALUE; return ERROR_INVALID_HANDLE; } handle = uv__get_osfhandle(fd); return uv__duplicate_handle(loop, handle, dup); } int uv__create_nul_handle(HANDLE* handle_ptr, DWORD access) { HANDLE handle; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof sa; sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; handle = CreateFileW(L"NUL", access, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { return GetLastError(); } *handle_ptr = handle; return 0; } int uv__stdio_create(uv_loop_t* loop, const uv_process_options_t* options, BYTE** buffer_ptr) { BYTE* buffer; int count, i; int err; count = options->stdio_count; if (count < 0 || count > 255) { /* Only support FDs 0-255 */ return ERROR_NOT_SUPPORTED; } else if (count < 3) { /* There should always be at least 3 stdio handles. */ count = 3; } /* Allocate the child stdio buffer */ buffer = (BYTE*) malloc(CHILD_STDIO_SIZE(count)); if (buffer == NULL) { return ERROR_OUTOFMEMORY; } /* Prepopulate the buffer with INVALID_HANDLE_VALUE handles so we can */ /* clean up on failure. */ CHILD_STDIO_COUNT(buffer) = count; for (i = 0; i < count; i++) { CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; } for (i = 0; i < count; i++) { uv_stdio_container_t fdopt; if (i < options->stdio_count) { fdopt = options->stdio[i]; } else { fdopt.flags = UV_IGNORE; } switch (fdopt.flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM)) { case UV_IGNORE: /* Starting a process with no stdin/stout/stderr can confuse it. */ /* So no matter what the user specified, we make sure the first */ /* three FDs are always open in their typical modes, e.g. stdin */ /* be readable and stdout/err should be writable. For FDs > 2, don't */ /* do anything - all handles in the stdio buffer are initialized with */ /* INVALID_HANDLE_VALUE, which should be okay. */ if (i <= 2) { DWORD access = (i == 0) ? FILE_GENERIC_READ : FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES; err = uv__create_nul_handle(&CHILD_STDIO_HANDLE(buffer, i), access); if (err) goto error; CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; } break; case UV_CREATE_PIPE: { /* Create a pair of two connected pipe ends; one end is turned into */ /* an uv_pipe_t for use by the parent. The other one is given to */ /* the child. */ uv_pipe_t* parent_pipe = (uv_pipe_t*) fdopt.data.stream; HANDLE child_pipe = INVALID_HANDLE_VALUE; /* Create a new, connected pipe pair. stdio[i].stream should point */ /* to an uninitialized, but not connected pipe handle. */ assert(fdopt.data.stream->type == UV_NAMED_PIPE); assert(!(fdopt.data.stream->flags & UV_HANDLE_CONNECTION)); assert(!(fdopt.data.stream->flags & UV_HANDLE_PIPESERVER)); err = uv__create_stdio_pipe_pair(loop, parent_pipe, &child_pipe, fdopt.flags); if (err) goto error; CHILD_STDIO_HANDLE(buffer, i) = child_pipe; CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; break; } case UV_INHERIT_FD: { /* Inherit a raw FD. */ HANDLE child_handle; /* Make an inheritable duplicate of the handle. */ err = uv__duplicate_fd(loop, fdopt.data.fd, &child_handle); if (err) { /* If fdopt.data.fd is not valid and fd fd <= 2, then ignore the */ /* error. */ if (fdopt.data.fd <= 2 && err == ERROR_INVALID_HANDLE) { CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; break; } goto error; } /* Figure out what the type is. */ switch (GetFileType(child_handle)) { case FILE_TYPE_DISK: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN; break; case FILE_TYPE_PIPE: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; case FILE_TYPE_CHAR: case FILE_TYPE_REMOTE: CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; break; case FILE_TYPE_UNKNOWN: if (GetLastError() != 0) { err = GetLastError(); CloseHandle(child_handle); goto error; } CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; break; default: assert(0); return -1; } CHILD_STDIO_HANDLE(buffer, i) = child_handle; break; } case UV_INHERIT_STREAM: { /* Use an existing stream as the stdio handle for the child. */ HANDLE stream_handle, child_handle; unsigned char crt_flags; uv_stream_t* stream = fdopt.data.stream; /* Leech the handle out of the stream. */ if (stream->type == UV_TTY) { stream_handle = ((uv_tty_t*) stream)->handle; crt_flags = FOPEN | FDEV; } else if (stream->type == UV_NAMED_PIPE && stream->flags & UV_HANDLE_CONNECTED) { stream_handle = ((uv_pipe_t*) stream)->handle; crt_flags = FOPEN | FPIPE; } else { stream_handle = INVALID_HANDLE_VALUE; crt_flags = 0; } if (stream_handle == NULL || stream_handle == INVALID_HANDLE_VALUE) { /* The handle is already closed, or not yet created, or the */ /* stream type is not supported. */ err = ERROR_NOT_SUPPORTED; goto error; } /* Make an inheritable copy of the handle. */ err = uv__duplicate_handle(loop, stream_handle, &child_handle); if (err) goto error; CHILD_STDIO_HANDLE(buffer, i) = child_handle; CHILD_STDIO_CRT_FLAGS(buffer, i) = crt_flags; break; } default: assert(0); return -1; } } *buffer_ptr = buffer; return 0; error: uv__stdio_destroy(buffer); return err; } void uv__stdio_destroy(BYTE* buffer) { int i, count; count = CHILD_STDIO_COUNT(buffer); for (i = 0; i < count; i++) { HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } } free(buffer); } void uv__stdio_noinherit(BYTE* buffer) { int i, count; count = CHILD_STDIO_COUNT(buffer); for (i = 0; i < count; i++) { HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); if (handle != INVALID_HANDLE_VALUE) { SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); } } } int uv__stdio_verify(BYTE* buffer, WORD size) { unsigned int count; /* Check the buffer pointer. */ if (buffer == NULL) return 0; /* Verify that the buffer is at least big enough to hold the count. */ if (size < CHILD_STDIO_SIZE(0)) return 0; /* Verify if the count is within range. */ count = CHILD_STDIO_COUNT(buffer); if (count > 256) return 0; /* Verify that the buffer size is big enough to hold info for N FDs. */ if (size < CHILD_STDIO_SIZE(count)) return 0; return 1; } WORD uv__stdio_size(BYTE* buffer) { return (WORD) CHILD_STDIO_SIZE(CHILD_STDIO_COUNT((buffer))); } HANDLE uv__stdio_handle(BYTE* buffer, int fd) { return CHILD_STDIO_HANDLE(buffer, fd); } MoarVM-2015.11/3rdparty/libuv/src/win/process.c0000644000175000017500000010400412456307253020155 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" #define SIGKILL 9 typedef struct env_var { const WCHAR* const wide; const WCHAR* const wide_eq; const size_t len; /* including null or '=' */ } env_var_t; #define E_V(str) { L##str, L##str L"=", sizeof(str) } static const env_var_t required_vars[] = { /* keep me sorted */ E_V("HOMEDRIVE"), E_V("HOMEPATH"), E_V("LOGONSERVER"), E_V("PATH"), E_V("SYSTEMDRIVE"), E_V("SYSTEMROOT"), E_V("TEMP"), E_V("USERDOMAIN"), E_V("USERNAME"), E_V("USERPROFILE"), E_V("WINDIR"), }; static size_t n_required_vars = ARRAY_SIZE(required_vars); static HANDLE uv_global_job_handle_; static uv_once_t uv_global_job_handle_init_guard_ = UV_ONCE_INIT; static void uv__init_global_job_handle(void) { /* Create a job object and set it up to kill all contained processes when * it's closed. Since this handle is made non-inheritable and we're not * giving it to anyone, we're the only process holding a reference to it. * That means that if this process exits it is closed and all the processes * it contains are killed. All processes created with uv_spawn that are not * spawned with the UV_PROCESS_DETACHED flag are assigned to this job. * * We're setting the JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag so only the * processes that we explicitly add are affected, and *their* subprocesses * are not. This ensures that our child processes are not limited in their * ability to use job control on Windows versions that don't deal with * nested jobs (prior to Windows 8 / Server 2012). It also lets our child * processes created detached processes without explicitly breaking away * from job control (which uv_spawn doesn't, either). */ SECURITY_ATTRIBUTES attr; JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; memset(&attr, 0, sizeof attr); attr.bInheritHandle = FALSE; memset(&info, 0, sizeof info); info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; uv_global_job_handle_ = CreateJobObjectW(&attr, NULL); if (uv_global_job_handle_ == NULL) uv_fatal_error(GetLastError(), "CreateJobObjectW"); if (!SetInformationJobObject(uv_global_job_handle_, JobObjectExtendedLimitInformation, &info, sizeof info)) uv_fatal_error(GetLastError(), "SetInformationJobObject"); } static int uv_utf8_to_utf16_alloc(const char* s, WCHAR** ws_ptr) { int ws_len, r; WCHAR* ws; ws_len = MultiByteToWideChar(CP_UTF8, 0, s, -1, NULL, 0); if (ws_len <= 0) { return GetLastError(); } ws = (WCHAR*) malloc(ws_len * sizeof(WCHAR)); if (ws == NULL) { return ERROR_OUTOFMEMORY; } r = MultiByteToWideChar(CP_UTF8, 0, s, -1, ws, ws_len); assert(r == ws_len); *ws_ptr = ws; return 0; } static void uv_process_init(uv_loop_t* loop, uv_process_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_PROCESS); handle->exit_cb = NULL; handle->pid = 0; handle->exit_signal = 0; handle->wait_handle = INVALID_HANDLE_VALUE; handle->process_handle = INVALID_HANDLE_VALUE; handle->child_stdio_buffer = NULL; handle->exit_cb_pending = 0; uv_req_init(loop, (uv_req_t*)&handle->exit_req); handle->exit_req.type = UV_PROCESS_EXIT; handle->exit_req.data = handle; } /* * Path search functions */ /* * Helper function for search_path */ static WCHAR* search_path_join_test(const WCHAR* dir, size_t dir_len, const WCHAR* name, size_t name_len, const WCHAR* ext, size_t ext_len, const WCHAR* cwd, size_t cwd_len) { WCHAR *result, *result_pos; DWORD attrs; if (dir_len > 2 && dir[0] == L'\\' && dir[1] == L'\\') { /* It's a UNC path so ignore cwd */ cwd_len = 0; } else if (dir_len >= 1 && (dir[0] == L'/' || dir[0] == L'\\')) { /* It's a full path without drive letter, use cwd's drive letter only */ cwd_len = 2; } else if (dir_len >= 2 && dir[1] == L':' && (dir_len < 3 || (dir[2] != L'/' && dir[2] != L'\\'))) { /* It's a relative path with drive letter (ext.g. D:../some/file) * Replace drive letter in dir by full cwd if it points to the same drive, * otherwise use the dir only. */ if (cwd_len < 2 || _wcsnicmp(cwd, dir, 2) != 0) { cwd_len = 0; } else { dir += 2; dir_len -= 2; } } else if (dir_len > 2 && dir[1] == L':') { /* It's an absolute path with drive letter * Don't use the cwd at all */ cwd_len = 0; } /* Allocate buffer for output */ result = result_pos = (WCHAR*)malloc(sizeof(WCHAR) * (cwd_len + 1 + dir_len + 1 + name_len + 1 + ext_len + 1)); /* Copy cwd */ wcsncpy(result_pos, cwd, cwd_len); result_pos += cwd_len; /* Add a path separator if cwd didn't end with one */ if (cwd_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { result_pos[0] = L'\\'; result_pos++; } /* Copy dir */ wcsncpy(result_pos, dir, dir_len); result_pos += dir_len; /* Add a separator if the dir didn't end with one */ if (dir_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { result_pos[0] = L'\\'; result_pos++; } /* Copy filename */ wcsncpy(result_pos, name, name_len); result_pos += name_len; if (ext_len) { /* Add a dot if the filename didn't end with one */ if (name_len && result_pos[-1] != '.') { result_pos[0] = L'.'; result_pos++; } /* Copy extension */ wcsncpy(result_pos, ext, ext_len); result_pos += ext_len; } /* Null terminator */ result_pos[0] = L'\0'; attrs = GetFileAttributesW(result); if (attrs != INVALID_FILE_ATTRIBUTES && !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { return result; } free(result); return NULL; } /* * Helper function for search_path */ static WCHAR* path_search_walk_ext(const WCHAR *dir, size_t dir_len, const WCHAR *name, size_t name_len, WCHAR *cwd, size_t cwd_len, int name_has_ext) { WCHAR* result; /* If the name itself has a nonempty extension, try this extension first */ if (name_has_ext) { result = search_path_join_test(dir, dir_len, name, name_len, L"", 0, cwd, cwd_len); if (result != NULL) { return result; } } /* Try .com extension */ result = search_path_join_test(dir, dir_len, name, name_len, L"com", 3, cwd, cwd_len); if (result != NULL) { return result; } /* Try .exe extension */ result = search_path_join_test(dir, dir_len, name, name_len, L"exe", 3, cwd, cwd_len); if (result != NULL) { return result; } return NULL; } /* * search_path searches the system path for an executable filename - * the windows API doesn't provide this as a standalone function nor as an * option to CreateProcess. * * It tries to return an absolute filename. * * Furthermore, it tries to follow the semantics that cmd.exe, with this * exception that PATHEXT environment variable isn't used. Since CreateProcess * can start only .com and .exe files, only those extensions are tried. This * behavior equals that of msvcrt's spawn functions. * * - Do not search the path if the filename already contains a path (either * relative or absolute). * * - If there's really only a filename, check the current directory for file, * then search all path directories. * * - If filename specified has *any* extension, search for the file with the * specified extension first. * * - If the literal filename is not found in a directory, try *appending* * (not replacing) .com first and then .exe. * * - The path variable may contain relative paths; relative paths are relative * to the cwd. * * - Directories in path may or may not end with a trailing backslash. * * - CMD does not trim leading/trailing whitespace from path/pathex entries * nor from the environment variables as a whole. * * - When cmd.exe cannot read a directory, it will just skip it and go on * searching. However, unlike posix-y systems, it will happily try to run a * file that is not readable/executable; if the spawn fails it will not * continue searching. * * UNC path support: we are dealing with UNC paths in both the path and the * filename. This is a deviation from what cmd.exe does (it does not let you * start a program by specifying an UNC path on the command line) but this is * really a pointless restriction. * */ static WCHAR* search_path(const WCHAR *file, WCHAR *cwd, const WCHAR *path) { int file_has_dir; WCHAR* result = NULL; WCHAR *file_name_start; WCHAR *dot; const WCHAR *dir_start, *dir_end, *dir_path; size_t dir_len; int name_has_ext; size_t file_len = wcslen(file); size_t cwd_len = wcslen(cwd); /* If the caller supplies an empty filename, * we're not gonna return c:\windows\.exe -- GFY! */ if (file_len == 0 || (file_len == 1 && file[0] == L'.')) { return NULL; } /* Find the start of the filename so we can split the directory from the */ /* name. */ for (file_name_start = (WCHAR*)file + file_len; file_name_start > file && file_name_start[-1] != L'\\' && file_name_start[-1] != L'/' && file_name_start[-1] != L':'; file_name_start--); file_has_dir = file_name_start != file; /* Check if the filename includes an extension */ dot = wcschr(file_name_start, L'.'); name_has_ext = (dot != NULL && dot[1] != L'\0'); if (file_has_dir) { /* The file has a path inside, don't use path */ result = path_search_walk_ext( file, file_name_start - file, file_name_start, file_len - (file_name_start - file), cwd, cwd_len, name_has_ext); } else { dir_end = path; /* The file is really only a name; look in cwd first, then scan path */ result = path_search_walk_ext(L"", 0, file, file_len, cwd, cwd_len, name_has_ext); while (result == NULL) { if (*dir_end == L'\0') { break; } /* Skip the separator that dir_end now points to */ if (dir_end != path || *path == L';') { dir_end++; } /* Next slice starts just after where the previous one ended */ dir_start = dir_end; /* Slice until the next ; or \0 is found */ dir_end = wcschr(dir_start, L';'); if (dir_end == NULL) { dir_end = wcschr(dir_start, L'\0'); } /* If the slice is zero-length, don't bother */ if (dir_end - dir_start == 0) { continue; } dir_path = dir_start; dir_len = dir_end - dir_start; /* Adjust if the path is quoted. */ if (dir_path[0] == '"' || dir_path[0] == '\'') { ++dir_path; --dir_len; } if (dir_path[dir_len - 1] == '"' || dir_path[dir_len - 1] == '\'') { --dir_len; } result = path_search_walk_ext(dir_path, dir_len, file, file_len, cwd, cwd_len, name_has_ext); } } return result; } /* * Quotes command line arguments * Returns a pointer to the end (next char to be written) of the buffer */ WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target) { size_t len = wcslen(source); size_t i; int quote_hit; WCHAR* start; if (len == 0) { /* Need double quotation for empty argument */ *(target++) = L'"'; *(target++) = L'"'; return target; } if (NULL == wcspbrk(source, L" \t\"")) { /* No quotation needed */ wcsncpy(target, source, len); target += len; return target; } if (NULL == wcspbrk(source, L"\"\\")) { /* * No embedded double quotes or backlashes, so I can just wrap * quote marks around the whole thing. */ *(target++) = L'"'; wcsncpy(target, source, len); target += len; *(target++) = L'"'; return target; } /* * Expected input/output: * input : hello"world * output: "hello\"world" * input : hello""world * output: "hello\"\"world" * input : hello\world * output: hello\world * input : hello\\world * output: hello\\world * input : hello\"world * output: "hello\\\"world" * input : hello\\"world * output: "hello\\\\\"world" * input : hello world\ * output: "hello world\" */ *(target++) = L'"'; start = target; quote_hit = 1; for (i = len; i > 0; --i) { *(target++) = source[i - 1]; if (quote_hit && source[i - 1] == L'\\') { *(target++) = L'\\'; } else if(source[i - 1] == L'"') { quote_hit = 1; *(target++) = L'\\'; } else { quote_hit = 0; } } target[0] = L'\0'; wcsrev(start); *(target++) = L'"'; return target; } int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) { char** arg; WCHAR* dst = NULL; WCHAR* temp_buffer = NULL; size_t dst_len = 0; size_t temp_buffer_len = 0; WCHAR* pos; int arg_count = 0; int err = 0; /* Count the required size. */ for (arg = args; *arg; arg++) { DWORD arg_len; arg_len = MultiByteToWideChar(CP_UTF8, 0, *arg, -1, NULL, 0); if (arg_len == 0) { return GetLastError(); } dst_len += arg_len; if (arg_len > temp_buffer_len) temp_buffer_len = arg_len; arg_count++; } /* Adjust for potential quotes. Also assume the worst-case scenario */ /* that every character needs escaping, so we need twice as much space. */ dst_len = dst_len * 2 + arg_count * 2; /* Allocate buffer for the final command line. */ dst = (WCHAR*) malloc(dst_len * sizeof(WCHAR)); if (dst == NULL) { err = ERROR_OUTOFMEMORY; goto error; } /* Allocate temporary working buffer. */ temp_buffer = (WCHAR*) malloc(temp_buffer_len * sizeof(WCHAR)); if (temp_buffer == NULL) { err = ERROR_OUTOFMEMORY; goto error; } pos = dst; for (arg = args; *arg; arg++) { DWORD arg_len; /* Convert argument to wide char. */ arg_len = MultiByteToWideChar(CP_UTF8, 0, *arg, -1, temp_buffer, (int) (dst + dst_len - pos)); if (arg_len == 0) { err = GetLastError(); goto error; } if (verbatim_arguments) { /* Copy verbatim. */ wcscpy(pos, temp_buffer); pos += arg_len - 1; } else { /* Quote/escape, if needed. */ pos = quote_cmd_arg(temp_buffer, pos); } *pos++ = *(arg + 1) ? L' ' : L'\0'; } free(temp_buffer); *dst_ptr = dst; return 0; error: free(dst); free(temp_buffer); return err; } int env_strncmp(const wchar_t* a, int na, const wchar_t* b) { wchar_t* a_eq; wchar_t* b_eq; wchar_t* A; wchar_t* B; int nb; int r; if (na < 0) { a_eq = wcschr(a, L'='); assert(a_eq); na = (int)(long)(a_eq - a); } else { na--; } b_eq = wcschr(b, L'='); assert(b_eq); nb = b_eq - b; A = alloca((na+1) * sizeof(wchar_t)); B = alloca((nb+1) * sizeof(wchar_t)); r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, a, na, A, na); assert(r==na); A[na] = L'\0'; r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, b, nb, B, nb); assert(r==nb); B[nb] = L'\0'; while (1) { wchar_t AA = *A++; wchar_t BB = *B++; if (AA < BB) { return -1; } else if (AA > BB) { return 1; } else if (!AA && !BB) { return 0; } } } static int qsort_wcscmp(const void *a, const void *b) { wchar_t* astr = *(wchar_t* const*)a; wchar_t* bstr = *(wchar_t* const*)b; return env_strncmp(astr, -1, bstr); } /* * The way windows takes environment variables is different than what C does; * Windows wants a contiguous block of null-terminated strings, terminated * with an additional null. * * Windows has a few "essential" environment variables. winsock will fail * to initialize if SYSTEMROOT is not defined; some APIs make reference to * TEMP. SYSTEMDRIVE is probably also important. We therefore ensure that * these get defined if the input environment block does not contain any * values for them. * * Also add variables known to Cygwin to be required for correct * subprocess operation in many cases: * https://github.com/Alexpux/Cygwin/blob/b266b04fbbd3a595f02ea149e4306d3ab9b1fe3d/winsup/cygwin/environ.cc#L955 * */ int make_program_env(char* env_block[], WCHAR** dst_ptr) { WCHAR* dst; WCHAR* ptr; char** env; size_t env_len = 0; int len; size_t i; DWORD var_size; size_t env_block_count = 1; /* 1 for null-terminator */ WCHAR* dst_copy; WCHAR** ptr_copy; WCHAR** env_copy; DWORD* required_vars_value_len = alloca(n_required_vars * sizeof(DWORD*)); /* first pass: determine size in UTF-16 */ for (env = env_block; *env; env++) { int len; if (strchr(*env, '=')) { len = MultiByteToWideChar(CP_UTF8, 0, *env, -1, NULL, 0); if (len <= 0) { return GetLastError(); } env_len += len; env_block_count++; } } /* second pass: copy to UTF-16 environment block */ dst_copy = _malloca(env_len * sizeof(WCHAR)); if (!dst_copy) { return ERROR_OUTOFMEMORY; } env_copy = alloca(env_block_count * sizeof(WCHAR*)); ptr = dst_copy; ptr_copy = env_copy; for (env = env_block; *env; env++) { if (strchr(*env, '=')) { len = MultiByteToWideChar(CP_UTF8, 0, *env, -1, ptr, (int) (env_len - (ptr - dst_copy))); if (len <= 0) { DWORD err = GetLastError(); _freea(dst_copy); return err; } *ptr_copy++ = ptr; ptr += len; } } *ptr_copy = NULL; assert(env_len == ptr - dst_copy); /* sort our (UTF-16) copy */ qsort(env_copy, env_block_count-1, sizeof(wchar_t*), qsort_wcscmp); /* third pass: check for required variables */ for (ptr_copy = env_copy, i = 0; i < n_required_vars; ) { int cmp; if (!*ptr_copy) { cmp = -1; } else { cmp = env_strncmp(required_vars[i].wide_eq, required_vars[i].len, *ptr_copy); } if (cmp < 0) { /* missing required var */ var_size = GetEnvironmentVariableW(required_vars[i].wide, NULL, 0); required_vars_value_len[i] = var_size; if (var_size != 0) { env_len += required_vars[i].len; env_len += var_size; } i++; } else { ptr_copy++; if (cmp == 0) i++; } } /* final pass: copy, in sort order, and inserting required variables */ dst = malloc((1+env_len) * sizeof(WCHAR)); if (!dst) { _freea(dst_copy); return ERROR_OUTOFMEMORY; } for (ptr = dst, ptr_copy = env_copy, i = 0; *ptr_copy || i < n_required_vars; ptr += len) { int cmp; if (i >= n_required_vars) { cmp = 1; } else if (!*ptr_copy) { cmp = -1; } else { cmp = env_strncmp(required_vars[i].wide_eq, required_vars[i].len, *ptr_copy); } if (cmp < 0) { /* missing required var */ len = required_vars_value_len[i]; if (len) { wcscpy(ptr, required_vars[i].wide_eq); ptr += required_vars[i].len; var_size = GetEnvironmentVariableW(required_vars[i].wide, ptr, (int) (env_len - (ptr - dst))); if (var_size != len-1) { /* race condition? */ uv_fatal_error(GetLastError(), "GetEnvironmentVariableW"); } } i++; } else { /* copy var from env_block */ len = wcslen(*ptr_copy) + 1; wmemcpy(ptr, *ptr_copy, len); ptr_copy++; if (cmp == 0) i++; } } /* Terminate with an extra NULL. */ assert(env_len == (ptr - dst)); *ptr = L'\0'; _freea(dst_copy); *dst_ptr = dst; return 0; } /* * Attempt to find the value of the PATH environment variable in the child's * preprocessed environment. * * If found, a pointer into `env` is returned. If not found, NULL is returned. */ static WCHAR* find_path(WCHAR *env) { for (; env != NULL && *env != 0; env += wcslen(env) + 1) { if (wcsncmp(env, L"PATH=", 5) == 0) return &env[5]; } return NULL; } /* * Called on Windows thread-pool thread to indicate that * a child process has exited. */ static void CALLBACK exit_wait_callback(void* data, BOOLEAN didTimeout) { uv_process_t* process = (uv_process_t*) data; uv_loop_t* loop = process->loop; assert(didTimeout == FALSE); assert(process); assert(!process->exit_cb_pending); process->exit_cb_pending = 1; /* Post completed */ POST_COMPLETION_FOR_REQ(loop, &process->exit_req); } /* Called on main thread after a child process has exited. */ void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle) { int64_t exit_code; DWORD status; assert(handle->exit_cb_pending); handle->exit_cb_pending = 0; /* If we're closing, don't call the exit callback. Just schedule a close */ /* callback now. */ if (handle->flags & UV__HANDLE_CLOSING) { uv_want_endgame(loop, (uv_handle_t*) handle); return; } /* Unregister from process notification. */ if (handle->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->wait_handle); handle->wait_handle = INVALID_HANDLE_VALUE; } /* Set the handle to inactive: no callbacks will be made after the exit */ /* callback.*/ uv__handle_stop(handle); if (GetExitCodeProcess(handle->process_handle, &status)) { exit_code = status; } else { /* Unable to to obtain the exit code. This should never happen. */ exit_code = uv_translate_sys_error(GetLastError()); } /* Fire the exit callback. */ if (handle->exit_cb) { handle->exit_cb(handle, exit_code, handle->exit_signal); } } void uv_process_close(uv_loop_t* loop, uv_process_t* handle) { uv__handle_closing(handle); if (handle->wait_handle != INVALID_HANDLE_VALUE) { /* This blocks until either the wait was cancelled, or the callback has */ /* completed. */ BOOL r = UnregisterWaitEx(handle->wait_handle, INVALID_HANDLE_VALUE); if (!r) { /* This should never happen, and if it happens, we can't recover... */ uv_fatal_error(GetLastError(), "UnregisterWaitEx"); } handle->wait_handle = INVALID_HANDLE_VALUE; } if (!handle->exit_cb_pending) { uv_want_endgame(loop, (uv_handle_t*)handle); } } void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle) { assert(!handle->exit_cb_pending); assert(handle->flags & UV__HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); /* Clean-up the process handle. */ CloseHandle(handle->process_handle); uv__handle_close(handle); } int uv_spawn(uv_loop_t* loop, uv_process_t* process, const uv_process_options_t* options) { int i; int err = 0; WCHAR* path = NULL, *alloc_path = NULL; BOOL result; WCHAR* application_path = NULL, *application = NULL, *arguments = NULL, *env = NULL, *cwd = NULL; STARTUPINFOW startup; PROCESS_INFORMATION info; DWORD process_flags; uv_process_init(loop, process); process->exit_cb = options->exit_cb; if (options->flags & (UV_PROCESS_SETGID | UV_PROCESS_SETUID)) { return UV_ENOTSUP; } if (options->file == NULL || options->args == NULL) { return UV_EINVAL; } assert(options->file != NULL); assert(!(options->flags & ~(UV_PROCESS_DETACHED | UV_PROCESS_SETGID | UV_PROCESS_SETUID | UV_PROCESS_WINDOWS_HIDE | UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); err = uv_utf8_to_utf16_alloc(options->file, &application); if (err) goto done; err = make_program_args( options->args, options->flags & UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS, &arguments); if (err) goto done; if (options->env) { err = make_program_env(options->env, &env); if (err) goto done; } if (options->cwd) { /* Explicit cwd */ err = uv_utf8_to_utf16_alloc(options->cwd, &cwd); if (err) goto done; } else { /* Inherit cwd */ DWORD cwd_len, r; cwd_len = GetCurrentDirectoryW(0, NULL); if (!cwd_len) { err = GetLastError(); goto done; } cwd = (WCHAR*) malloc(cwd_len * sizeof(WCHAR)); if (cwd == NULL) { err = ERROR_OUTOFMEMORY; goto done; } r = GetCurrentDirectoryW(cwd_len, cwd); if (r == 0 || r >= cwd_len) { err = GetLastError(); goto done; } } /* Get PATH environment variable. */ path = find_path(env); if (path == NULL) { DWORD path_len, r; path_len = GetEnvironmentVariableW(L"PATH", NULL, 0); if (path_len == 0) { err = GetLastError(); goto done; } alloc_path = (WCHAR*) malloc(path_len * sizeof(WCHAR)); if (alloc_path == NULL) { err = ERROR_OUTOFMEMORY; goto done; } path = alloc_path; r = GetEnvironmentVariableW(L"PATH", path, path_len); if (r == 0 || r >= path_len) { err = GetLastError(); goto done; } } err = uv__stdio_create(loop, options, &process->child_stdio_buffer); if (err) goto done; application_path = search_path(application, cwd, path); if (application_path == NULL) { /* Not found. */ err = ERROR_FILE_NOT_FOUND; goto done; } startup.cb = sizeof(startup); startup.lpReserved = NULL; startup.lpDesktop = NULL; startup.lpTitle = NULL; startup.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; startup.cbReserved2 = uv__stdio_size(process->child_stdio_buffer); startup.lpReserved2 = (BYTE*) process->child_stdio_buffer; startup.hStdInput = uv__stdio_handle(process->child_stdio_buffer, 0); startup.hStdOutput = uv__stdio_handle(process->child_stdio_buffer, 1); startup.hStdError = uv__stdio_handle(process->child_stdio_buffer, 2); if (options->flags & UV_PROCESS_WINDOWS_HIDE) { /* Use SW_HIDE to avoid any potential process window. */ startup.wShowWindow = SW_HIDE; } else { startup.wShowWindow = SW_SHOWDEFAULT; } process_flags = CREATE_UNICODE_ENVIRONMENT; if (options->flags & UV_PROCESS_DETACHED) { /* Note that we're not setting the CREATE_BREAKAWAY_FROM_JOB flag. That * means that libuv might not let you create a fully deamonized process * when run under job control. However the type of job control that libuv * itself creates doesn't trickle down to subprocesses so they can still * daemonize. * * A reason to not do this is that CREATE_BREAKAWAY_FROM_JOB makes the * CreateProcess call fail if we're under job control that doesn't allow * breakaway. */ process_flags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP; } if (!CreateProcessW(application_path, arguments, NULL, NULL, 1, process_flags, env, cwd, &startup, &info)) { /* CreateProcessW failed. */ err = GetLastError(); goto done; } /* Spawn succeeded */ /* Beyond this point, failure is reported asynchronously. */ process->process_handle = info.hProcess; process->pid = info.dwProcessId; /* If the process isn't spawned as detached, assign to the global job */ /* object so windows will kill it when the parent process dies. */ if (!(options->flags & UV_PROCESS_DETACHED)) { uv_once(&uv_global_job_handle_init_guard_, uv__init_global_job_handle); if (!AssignProcessToJobObject(uv_global_job_handle_, info.hProcess)) { /* AssignProcessToJobObject might fail if this process is under job * control and the job doesn't have the * JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag set, on a Windows version * that doesn't support nested jobs. * * When that happens we just swallow the error and continue without * establishing a kill-child-on-parent-exit relationship, otherwise * there would be no way for libuv applications run under job control * to spawn processes at all. */ DWORD err = GetLastError(); if (err != ERROR_ACCESS_DENIED) uv_fatal_error(err, "AssignProcessToJobObject"); } } /* Set IPC pid to all IPC pipes. */ for (i = 0; i < options->stdio_count; i++) { const uv_stdio_container_t* fdopt = &options->stdio[i]; if (fdopt->flags & UV_CREATE_PIPE && fdopt->data.stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) fdopt->data.stream)->ipc) { ((uv_pipe_t*) fdopt->data.stream)->ipc_pid = info.dwProcessId; } } /* Setup notifications for when the child process exits. */ result = RegisterWaitForSingleObject(&process->wait_handle, process->process_handle, exit_wait_callback, (void*)process, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); if (!result) { uv_fatal_error(GetLastError(), "RegisterWaitForSingleObject"); } CloseHandle(info.hThread); assert(!err); /* Make the handle active. It will remain active until the exit callback */ /* iis made or the handle is closed, whichever happens first. */ uv__handle_start(process); /* Cleanup, whether we succeeded or failed. */ done: free(application); free(application_path); free(arguments); free(cwd); free(env); free(alloc_path); if (process->child_stdio_buffer != NULL) { /* Clean up child stdio handles. */ uv__stdio_destroy(process->child_stdio_buffer); process->child_stdio_buffer = NULL; } return uv_translate_sys_error(err); } static int uv__kill(HANDLE process_handle, int signum) { switch (signum) { case SIGTERM: case SIGKILL: case SIGINT: { /* Unconditionally terminate the process. On Windows, killed processes */ /* normally return 1. */ DWORD status; int err; if (TerminateProcess(process_handle, 1)) return 0; /* If the process already exited before TerminateProcess was called, */ /* TerminateProcess will fail with ERROR_ACESS_DENIED. */ err = GetLastError(); if (err == ERROR_ACCESS_DENIED && GetExitCodeProcess(process_handle, &status) && status != STILL_ACTIVE) { return UV_ESRCH; } return uv_translate_sys_error(err); } case 0: { /* Health check: is the process still alive? */ DWORD status; if (!GetExitCodeProcess(process_handle, &status)) return uv_translate_sys_error(GetLastError()); if (status != STILL_ACTIVE) return UV_ESRCH; return 0; } default: /* Unsupported signal. */ return UV_ENOSYS; } } int uv_process_kill(uv_process_t* process, int signum) { int err; if (process->process_handle == INVALID_HANDLE_VALUE) { return UV_EINVAL; } err = uv__kill(process->process_handle, signum); if (err) { return err; /* err is already translated. */ } process->exit_signal = signum; return 0; } int uv_kill(int pid, int signum) { int err; HANDLE process_handle = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, FALSE, pid); if (process_handle == NULL) { err = GetLastError(); if (err == ERROR_INVALID_PARAMETER) { return UV_ESRCH; } else { return uv_translate_sys_error(err); } } err = uv__kill(process_handle, signum); CloseHandle(process_handle); return err; /* err is already translated. */ } MoarVM-2015.11/3rdparty/libuv/src/win/req-inl.h0000644000175000017500000001754512456307253020070 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_REQ_INL_H_ #define UV_WIN_REQ_INL_H_ #include #include "uv.h" #include "internal.h" #define SET_REQ_STATUS(req, status) \ (req)->overlapped.Internal = (ULONG_PTR) (status) #define SET_REQ_ERROR(req, error) \ SET_REQ_STATUS((req), NTSTATUS_FROM_WIN32((error))) #define SET_REQ_SUCCESS(req) \ SET_REQ_STATUS((req), STATUS_SUCCESS) #define GET_REQ_STATUS(req) \ ((NTSTATUS) (req)->overlapped.Internal) #define REQ_SUCCESS(req) \ (NT_SUCCESS(GET_REQ_STATUS((req)))) #define GET_REQ_ERROR(req) \ (pRtlNtStatusToDosError(GET_REQ_STATUS((req)))) #define GET_REQ_SOCK_ERROR(req) \ (uv_ntstatus_to_winsock_error(GET_REQ_STATUS((req)))) #define REGISTER_HANDLE_REQ(loop, handle, req) \ do { \ INCREASE_ACTIVE_COUNT((loop), (handle)); \ uv__req_register((loop), (req)); \ } while (0) #define UNREGISTER_HANDLE_REQ(loop, handle, req) \ do { \ DECREASE_ACTIVE_COUNT((loop), (handle)); \ uv__req_unregister((loop), (req)); \ } while (0) #define UV_SUCCEEDED_WITHOUT_IOCP(result) \ ((result) && (handle->flags & UV_HANDLE_SYNC_BYPASS_IOCP)) #define UV_SUCCEEDED_WITH_IOCP(result) \ ((result) || (GetLastError() == ERROR_IO_PENDING)) #define POST_COMPLETION_FOR_REQ(loop, req) \ if (!PostQueuedCompletionStatus((loop)->iocp, \ 0, \ 0, \ &((req)->overlapped))) { \ uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); \ } INLINE static void uv_req_init(uv_loop_t* loop, uv_req_t* req) { req->type = UV_UNKNOWN_REQ; SET_REQ_SUCCESS(req); } INLINE static uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped) { return CONTAINING_RECORD(overlapped, uv_req_t, overlapped); } INLINE static void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) { req->next_req = NULL; if (loop->pending_reqs_tail) { req->next_req = loop->pending_reqs_tail->next_req; loop->pending_reqs_tail->next_req = req; loop->pending_reqs_tail = req; } else { req->next_req = req; loop->pending_reqs_tail = req; } } #define DELEGATE_STREAM_REQ(loop, req, method, handle_at) \ do { \ switch (((uv_handle_t*) (req)->handle_at)->type) { \ case UV_TCP: \ uv_process_tcp_##method##_req(loop, \ (uv_tcp_t*) ((req)->handle_at), \ req); \ break; \ \ case UV_NAMED_PIPE: \ uv_process_pipe_##method##_req(loop, \ (uv_pipe_t*) ((req)->handle_at), \ req); \ break; \ \ case UV_TTY: \ uv_process_tty_##method##_req(loop, \ (uv_tty_t*) ((req)->handle_at), \ req); \ break; \ \ default: \ assert(0); \ } \ } while (0) INLINE static void uv_process_reqs(uv_loop_t* loop) { uv_req_t* req; uv_req_t* first; uv_req_t* next; if (loop->pending_reqs_tail == NULL) { return; } first = loop->pending_reqs_tail->next_req; next = first; loop->pending_reqs_tail = NULL; while (next != NULL) { req = next; next = req->next_req != first ? req->next_req : NULL; switch (req->type) { case UV_READ: DELEGATE_STREAM_REQ(loop, req, read, data); break; case UV_WRITE: DELEGATE_STREAM_REQ(loop, (uv_write_t*) req, write, handle); break; case UV_ACCEPT: DELEGATE_STREAM_REQ(loop, req, accept, data); break; case UV_CONNECT: DELEGATE_STREAM_REQ(loop, (uv_connect_t*) req, connect, handle); break; case UV_SHUTDOWN: /* Tcp shutdown requests don't come here. */ assert(((uv_shutdown_t*) req)->handle->type == UV_NAMED_PIPE); uv_process_pipe_shutdown_req( loop, (uv_pipe_t*) ((uv_shutdown_t*) req)->handle, (uv_shutdown_t*) req); break; case UV_UDP_RECV: uv_process_udp_recv_req(loop, (uv_udp_t*) req->data, req); break; case UV_UDP_SEND: uv_process_udp_send_req(loop, ((uv_udp_send_t*) req)->handle, (uv_udp_send_t*) req); break; case UV_WAKEUP: uv_process_async_wakeup_req(loop, (uv_async_t*) req->data, req); break; case UV_SIGNAL_REQ: uv_process_signal_req(loop, (uv_signal_t*) req->data, req); break; case UV_POLL_REQ: uv_process_poll_req(loop, (uv_poll_t*) req->data, req); break; case UV_PROCESS_EXIT: uv_process_proc_exit(loop, (uv_process_t*) req->data); break; case UV_FS_EVENT_REQ: uv_process_fs_event_req(loop, req, (uv_fs_event_t*) req->data); break; default: assert(0); } } } #endif /* UV_WIN_REQ_INL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/req.c0000644000175000017500000000227712456307253017277 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" MoarVM-2015.11/3rdparty/libuv/src/win/signal.c0000644000175000017500000002277112456307253017766 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" RB_HEAD(uv_signal_tree_s, uv_signal_s); static struct uv_signal_tree_s uv__signal_tree = RB_INITIALIZER(uv__signal_tree); static ssize_t volatile uv__signal_control_handler_refs = 0; static CRITICAL_SECTION uv__signal_lock; void uv_signals_init() { InitializeCriticalSection(&uv__signal_lock); } static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { /* Compare signums first so all watchers with the same signnum end up */ /* adjacent. */ if (w1->signum < w2->signum) return -1; if (w1->signum > w2->signum) return 1; /* Sort by loop pointer, so we can easily look up the first item after */ /* { .signum = x, .loop = NULL } */ if ((uintptr_t) w1->loop < (uintptr_t) w2->loop) return -1; if ((uintptr_t) w1->loop > (uintptr_t) w2->loop) return 1; if ((uintptr_t) w1 < (uintptr_t) w2) return -1; if ((uintptr_t) w1 > (uintptr_t) w2) return 1; return 0; } RB_GENERATE_STATIC(uv_signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare); /* * Dispatches signal {signum} to all active uv_signal_t watchers in all loops. * Returns 1 if the signal was dispatched to any watcher, or 0 if there were * no active signal watchers observing this signal. */ int uv__signal_dispatch(int signum) { uv_signal_t lookup; uv_signal_t* handle; int dispatched = 0; EnterCriticalSection(&uv__signal_lock); lookup.signum = signum; lookup.loop = NULL; for (handle = RB_NFIND(uv_signal_tree_s, &uv__signal_tree, &lookup); handle != NULL && handle->signum == signum; handle = RB_NEXT(uv_signal_tree_s, &uv__signal_tree, handle)) { unsigned long previous = InterlockedExchange( (volatile LONG*) &handle->pending_signum, signum); if (!previous) { POST_COMPLETION_FOR_REQ(handle->loop, &handle->signal_req); } dispatched = 1; } LeaveCriticalSection(&uv__signal_lock); return dispatched; } static BOOL WINAPI uv__signal_control_handler(DWORD type) { switch (type) { case CTRL_C_EVENT: return uv__signal_dispatch(SIGINT); case CTRL_BREAK_EVENT: return uv__signal_dispatch(SIGBREAK); case CTRL_CLOSE_EVENT: if (uv__signal_dispatch(SIGHUP)) { /* Windows will terminate the process after the control handler */ /* returns. After that it will just terminate our process. Therefore */ /* block the signal handler so the main loop has some time to pick */ /* up the signal and do something for a few seconds. */ Sleep(INFINITE); return TRUE; } return FALSE; case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: /* These signals are only sent to services. Services have their own */ /* notification mechanism, so there's no point in handling these. */ default: /* We don't handle these. */ return FALSE; } } static int uv__signal_register_control_handler() { /* When this function is called, the uv__signal_lock must be held. */ /* If the console control handler has already been hooked, just add a */ /* reference. */ if (uv__signal_control_handler_refs > 0) { uv__signal_control_handler_refs++; return 0; } if (!SetConsoleCtrlHandler(uv__signal_control_handler, TRUE)) return GetLastError(); uv__signal_control_handler_refs++; return 0; } static void uv__signal_unregister_control_handler() { /* When this function is called, the uv__signal_lock must be held. */ BOOL r; /* Don't unregister if the number of console control handlers exceeds one. */ /* Just remove a reference in that case. */ if (uv__signal_control_handler_refs > 1) { uv__signal_control_handler_refs--; return; } assert(uv__signal_control_handler_refs == 1); r = SetConsoleCtrlHandler(uv__signal_control_handler, FALSE); /* This should never fail; if it does it is probably a bug in libuv. */ assert(r); uv__signal_control_handler_refs--; } static int uv__signal_register(int signum) { switch (signum) { case SIGINT: case SIGBREAK: case SIGHUP: return uv__signal_register_control_handler(); case SIGWINCH: /* SIGWINCH is generated in tty.c. No need to register anything. */ return 0; case SIGILL: case SIGABRT_COMPAT: case SIGFPE: case SIGSEGV: case SIGTERM: case SIGABRT: /* Signal is never raised. */ return 0; default: /* Invalid signal. */ return ERROR_INVALID_PARAMETER; } } static void uv__signal_unregister(int signum) { switch (signum) { case SIGINT: case SIGBREAK: case SIGHUP: uv__signal_unregister_control_handler(); return; case SIGWINCH: /* SIGWINCH is generated in tty.c. No need to unregister anything. */ return; case SIGILL: case SIGABRT_COMPAT: case SIGFPE: case SIGSEGV: case SIGTERM: case SIGABRT: /* Nothing is registered for this signal. */ return; default: /* Libuv bug. */ assert(0 && "Invalid signum"); return; } } int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { uv_req_t* req; uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); handle->pending_signum = 0; handle->signum = 0; handle->signal_cb = NULL; req = &handle->signal_req; uv_req_init(loop, req); req->type = UV_SIGNAL_REQ; req->data = handle; return 0; } int uv_signal_stop(uv_signal_t* handle) { uv_signal_t* removed_handle; /* If the watcher wasn't started, this is a no-op. */ if (handle->signum == 0) return 0; EnterCriticalSection(&uv__signal_lock); uv__signal_unregister(handle->signum); removed_handle = RB_REMOVE(uv_signal_tree_s, &uv__signal_tree, handle); assert(removed_handle == handle); LeaveCriticalSection(&uv__signal_lock); handle->signum = 0; uv__handle_stop(handle); return 0; } int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { int err; /* If the user supplies signum == 0, then return an error already. If the */ /* signum is otherwise invalid then uv__signal_register will find out */ /* eventually. */ if (signum == 0) { return UV_EINVAL; } /* Short circuit: if the signal watcher is already watching {signum} don't */ /* go through the process of deregistering and registering the handler. */ /* Additionally, this avoids pending signals getting lost in the (small) */ /* time frame that handle->signum == 0. */ if (signum == handle->signum) { handle->signal_cb = signal_cb; return 0; } /* If the signal handler was already active, stop it first. */ if (handle->signum != 0) { int r = uv_signal_stop(handle); /* uv_signal_stop is infallible. */ assert(r == 0); } EnterCriticalSection(&uv__signal_lock); err = uv__signal_register(signum); if (err) { /* Uh-oh, didn't work. */ LeaveCriticalSection(&uv__signal_lock); return uv_translate_sys_error(err); } handle->signum = signum; RB_INSERT(uv_signal_tree_s, &uv__signal_tree, handle); LeaveCriticalSection(&uv__signal_lock); handle->signal_cb = signal_cb; uv__handle_start(handle); return 0; } void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, uv_req_t* req) { long dispatched_signum; assert(handle->type == UV_SIGNAL); assert(req->type == UV_SIGNAL_REQ); dispatched_signum = InterlockedExchange( (volatile LONG*) &handle->pending_signum, 0); assert(dispatched_signum != 0); /* Check if the pending signal equals the signum that we are watching for. */ /* These can get out of sync when the handler is stopped and restarted */ /* while the signal_req is pending. */ if (dispatched_signum == handle->signum) handle->signal_cb(handle, dispatched_signum); if (handle->flags & UV__HANDLE_CLOSING) { /* When it is closing, it must be stopped at this point. */ assert(handle->signum == 0); uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle) { uv_signal_stop(handle); uv__handle_closing(handle); if (handle->pending_signum == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle) { assert(handle->flags & UV__HANDLE_CLOSING); assert(!(handle->flags & UV_HANDLE_CLOSED)); assert(handle->signum == 0); assert(handle->pending_signum == 0); handle->flags |= UV_HANDLE_CLOSED; uv__handle_close(handle); } MoarVM-2015.11/3rdparty/libuv/src/win/stream-inl.h0000644000175000017500000000376012456307253020566 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_STREAM_INL_H_ #define UV_WIN_STREAM_INL_H_ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" INLINE static void uv_stream_init(uv_loop_t* loop, uv_stream_t* handle, uv_handle_type type) { uv__handle_init(loop, (uv_handle_t*) handle, type); handle->write_queue_size = 0; handle->activecnt = 0; } INLINE static void uv_connection_init(uv_stream_t* handle) { handle->flags |= UV_HANDLE_CONNECTION; handle->write_reqs_pending = 0; uv_req_init(handle->loop, (uv_req_t*) &(handle->read_req)); handle->read_req.event_handle = NULL; handle->read_req.wait_handle = INVALID_HANDLE_VALUE; handle->read_req.type = UV_READ; handle->read_req.data = handle; handle->shutdown_req = NULL; } #endif /* UV_WIN_STREAM_INL_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/stream.c0000644000175000017500000001333612456307253020001 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "req-inl.h" int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { int err; err = ERROR_INVALID_PARAMETER; switch (stream->type) { case UV_TCP: err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); break; case UV_NAMED_PIPE: err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_accept(uv_stream_t* server, uv_stream_t* client) { int err; err = ERROR_INVALID_PARAMETER; switch (server->type) { case UV_TCP: err = uv_tcp_accept((uv_tcp_t*)server, (uv_tcp_t*)client); break; case UV_NAMED_PIPE: err = uv_pipe_accept((uv_pipe_t*)server, client); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_read_start(uv_stream_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { int err; if (handle->flags & UV_HANDLE_READING) { return UV_EALREADY; } if (!(handle->flags & UV_HANDLE_READABLE)) { return UV_ENOTCONN; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_TCP: err = uv_tcp_read_start((uv_tcp_t*)handle, alloc_cb, read_cb); break; case UV_NAMED_PIPE: err = uv_pipe_read_start((uv_pipe_t*)handle, alloc_cb, read_cb); break; case UV_TTY: err = uv_tty_read_start((uv_tty_t*) handle, alloc_cb, read_cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_read_stop(uv_stream_t* handle) { int err; if (!(handle->flags & UV_HANDLE_READING)) return 0; err = 0; if (handle->type == UV_TTY) { err = uv_tty_read_stop((uv_tty_t*) handle); } else { if (handle->type == UV_NAMED_PIPE) { uv__pipe_stop_read((uv_pipe_t*) handle); } else { handle->flags &= ~UV_HANDLE_READING; } DECREASE_ACTIVE_COUNT(handle->loop, handle); } return uv_translate_sys_error(err); } int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { uv_loop_t* loop = handle->loop; int err; if (!(handle->flags & UV_HANDLE_WRITABLE)) { return UV_EPIPE; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_TCP: err = uv_tcp_write(loop, req, (uv_tcp_t*) handle, bufs, nbufs, cb); break; case UV_NAMED_PIPE: err = uv_pipe_write(loop, req, (uv_pipe_t*) handle, bufs, nbufs, cb); break; case UV_TTY: err = uv_tty_write(loop, req, (uv_tty_t*) handle, bufs, nbufs, cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_write2(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, uv_write_cb cb) { uv_loop_t* loop = handle->loop; int err; if (!(handle->flags & UV_HANDLE_WRITABLE)) { return UV_EPIPE; } err = ERROR_INVALID_PARAMETER; switch (handle->type) { case UV_NAMED_PIPE: err = uv_pipe_write2(loop, req, (uv_pipe_t*) handle, bufs, nbufs, send_handle, cb); break; default: assert(0); } return uv_translate_sys_error(err); } int uv_try_write(uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs) { /* NOTE: Won't work with overlapped writes */ return UV_ENOSYS; } int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb) { uv_loop_t* loop = handle->loop; if (!(handle->flags & UV_HANDLE_WRITABLE)) { return UV_EPIPE; } uv_req_init(loop, (uv_req_t*) req); req->type = UV_SHUTDOWN; req->handle = handle; req->cb = cb; handle->flags &= ~UV_HANDLE_WRITABLE; handle->shutdown_req = req; handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_want_endgame(loop, (uv_handle_t*)handle); return 0; } int uv_is_readable(const uv_stream_t* handle) { return !!(handle->flags & UV_HANDLE_READABLE); } int uv_is_writable(const uv_stream_t* handle) { return !!(handle->flags & UV_HANDLE_WRITABLE); } int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { if (handle->type != UV_NAMED_PIPE) return UV_EINVAL; if (blocking != 0) handle->flags |= UV_HANDLE_BLOCKING_WRITES; else handle->flags &= ~UV_HANDLE_BLOCKING_WRITES; return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/tcp.c0000644000175000017500000012250512456307253017273 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" /* * Threshold of active tcp streams for which to preallocate tcp read buffers. * (Due to node slab allocator performing poorly under this pattern, * the optimization is temporarily disabled (threshold=0). This will be * revisited once node allocator is improved.) */ const unsigned int uv_active_tcp_streams_threshold = 0; /* * Number of simultaneous pending AcceptEx calls. */ const unsigned int uv_simultaneous_server_accepts = 32; /* A zero-size buffer for use by uv_tcp_read */ static char uv_zero_[] = ""; static int uv__tcp_nodelay(uv_tcp_t* handle, SOCKET socket, int enable) { if (setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&enable, sizeof enable) == -1) { return WSAGetLastError(); } return 0; } static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay) { if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (const char*)&enable, sizeof enable) == -1) { return WSAGetLastError(); } if (enable && setsockopt(socket, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof delay) == -1) { return WSAGetLastError(); } return 0; } static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle, SOCKET socket, int family, int imported) { DWORD yes = 1; int non_ifs_lsp; int err; assert(handle->socket == INVALID_SOCKET); /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { return WSAGetLastError(); } /* Associate it with the I/O completion port. */ /* Use uv_handle_t pointer as completion key. */ if (CreateIoCompletionPort((HANDLE)socket, loop->iocp, (ULONG_PTR)socket, 0) == NULL) { if (imported) { handle->flags |= UV_HANDLE_EMULATE_IOCP; } else { return GetLastError(); } } if (family == AF_INET6) { non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv6; } else { non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv4; } if (pSetFileCompletionNotificationModes && !(handle->flags & UV_HANDLE_EMULATE_IOCP) && !non_ifs_lsp) { if (pSetFileCompletionNotificationModes((HANDLE) socket, FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; } else if (GetLastError() != ERROR_INVALID_FUNCTION) { return GetLastError(); } } if (handle->flags & UV_HANDLE_TCP_NODELAY) { err = uv__tcp_nodelay(handle, socket, 1); if (err) return err; } /* TODO: Use stored delay. */ if (handle->flags & UV_HANDLE_TCP_KEEPALIVE) { err = uv__tcp_keepalive(handle, socket, 1, 60); if (err) return err; } handle->socket = socket; if (family == AF_INET6) { handle->flags |= UV_HANDLE_IPV6; } else { assert(!(handle->flags & UV_HANDLE_IPV6)); } return 0; } int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* handle) { uv_stream_init(loop, (uv_stream_t*) handle, UV_TCP); handle->accept_reqs = NULL; handle->pending_accepts = NULL; handle->socket = INVALID_SOCKET; handle->reqs_pending = 0; handle->func_acceptex = NULL; handle->func_connectex = NULL; handle->processed_accepts = 0; handle->delayed_error = 0; return 0; } void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { int err; unsigned int i; uv_tcp_accept_t* req; if (handle->flags & UV_HANDLE_CONNECTION && handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { UNREGISTER_HANDLE_REQ(loop, handle, handle->shutdown_req); err = 0; if (handle->flags & UV__HANDLE_CLOSING) { err = ERROR_OPERATION_ABORTED; } else if (shutdown(handle->socket, SD_SEND) == SOCKET_ERROR) { err = WSAGetLastError(); } if (handle->shutdown_req->cb) { handle->shutdown_req->cb(handle->shutdown_req, uv_translate_sys_error(err)); } handle->shutdown_req = NULL; DECREASE_PENDING_REQ_COUNT(handle); return; } if (handle->flags & UV__HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); if (!(handle->flags & UV_HANDLE_TCP_SOCKET_CLOSED)) { closesocket(handle->socket); handle->socket = INVALID_SOCKET; handle->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } if (!(handle->flags & UV_HANDLE_CONNECTION) && handle->accept_reqs) { if (handle->flags & UV_HANDLE_EMULATE_IOCP) { for (i = 0; i < uv_simultaneous_server_accepts; i++) { req = &handle->accept_reqs[i]; if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle) { CloseHandle(req->event_handle); req->event_handle = NULL; } } } free(handle->accept_reqs); handle->accept_reqs = NULL; } if (handle->flags & UV_HANDLE_CONNECTION && handle->flags & UV_HANDLE_EMULATE_IOCP) { if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(handle->read_req.wait_handle); handle->read_req.wait_handle = INVALID_HANDLE_VALUE; } if (handle->read_req.event_handle) { CloseHandle(handle->read_req.event_handle); handle->read_req.event_handle = NULL; } } uv__handle_close(handle); loop->active_tcp_streams--; } } /* Unlike on Unix, here we don't set SO_REUSEADDR, because it doesn't just * allow binding to addresses that are in use by sockets in TIME_WAIT, it * effectively allows 'stealing' a port which is in use by another application. * * SO_EXCLUSIVEADDRUSE is also not good here because it does cehck all sockets, * regardless of state, so we'd get an error even if the port is in use by a * socket in TIME_WAIT state. * * See issue #1360. * */ static int uv_tcp_try_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { DWORD err; int r; if (handle->socket == INVALID_SOCKET) { SOCKET sock; /* Cannot set IPv6-only mode on non-IPv6 socket. */ if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) return ERROR_INVALID_PARAMETER; sock = socket(addr->sa_family, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { return WSAGetLastError(); } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)) { err = GetLastError(); closesocket(sock); return err; } err = uv_tcp_set_socket(handle->loop, handle, sock, addr->sa_family, 0); if (err) { closesocket(sock); return err; } } #ifdef IPV6_V6ONLY if (addr->sa_family == AF_INET6) { int on; on = (flags & UV_TCP_IPV6ONLY) != 0; /* TODO: how to handle errors? This may fail if there is no ipv4 stack */ /* available, or when run on XP/2003 which have no support for dualstack */ /* sockets. For now we're silently ignoring the error. */ setsockopt(handle->socket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof on); } #endif r = bind(handle->socket, addr, addrlen); if (r == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { /* Some errors are not to be reported until connect() or listen() */ handle->delayed_error = err; } else { return err; } } handle->flags |= UV_HANDLE_BOUND; return 0; } static void CALLBACK post_completion(void* context, BOOLEAN timed_out) { uv_req_t* req; uv_tcp_t* handle; req = (uv_req_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->data; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->overlapped.InternalHigh, 0, &req->overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void CALLBACK post_write_completion(void* context, BOOLEAN timed_out) { uv_write_t* req; uv_tcp_t* handle; req = (uv_write_t*) context; assert(req != NULL); handle = (uv_tcp_t*)req->handle; assert(handle != NULL); assert(!timed_out); if (!PostQueuedCompletionStatus(handle->loop->iocp, req->overlapped.InternalHigh, 0, &req->overlapped)) { uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); } } static void uv_tcp_queue_accept(uv_tcp_t* handle, uv_tcp_accept_t* req) { uv_loop_t* loop = handle->loop; BOOL success; DWORD bytes; SOCKET accept_socket; short family; assert(handle->flags & UV_HANDLE_LISTENING); assert(req->accept_socket == INVALID_SOCKET); /* choose family and extension function */ if (handle->flags & UV_HANDLE_IPV6) { family = AF_INET6; } else { family = AF_INET; } /* Open a socket for the accepted connection. */ accept_socket = socket(family, SOCK_STREAM, 0); if (accept_socket == INVALID_SOCKET) { SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; return; } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE) accept_socket, HANDLE_FLAG_INHERIT, 0)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; closesocket(accept_socket); return; } /* Prepare the overlapped structure. */ memset(&(req->overlapped), 0, sizeof(req->overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); } success = handle->func_acceptex(handle->socket, accept_socket, (void*)req->accept_buffer, 0, sizeof(struct sockaddr_storage), sizeof(struct sockaddr_storage), &bytes, &req->overlapped); if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { /* Process the req without IOCP. */ req->accept_socket = accept_socket; handle->reqs_pending++; uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(success)) { /* The req will be processed with IOCP. */ req->accept_socket = accept_socket; handle->reqs_pending++; if (handle->flags & UV_HANDLE_EMULATE_IOCP && req->wait_handle == INVALID_HANDLE_VALUE && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; return; } } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; /* Destroy the preallocated client socket. */ closesocket(accept_socket); /* Destroy the event handle */ if (handle->flags & UV_HANDLE_EMULATE_IOCP) { CloseHandle(req->overlapped.hEvent); req->event_handle = NULL; } } } static void uv_tcp_queue_read(uv_loop_t* loop, uv_tcp_t* handle) { uv_read_t* req; uv_buf_t buf; int result; DWORD bytes, flags; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); req = &handle->read_req; memset(&req->overlapped, 0, sizeof(req->overlapped)); /* * Preallocate a read buffer if the number of active streams is below * the threshold. */ if (loop->active_tcp_streams < uv_active_tcp_streams_threshold) { handle->flags &= ~UV_HANDLE_ZERO_READ; handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->read_buffer); if (handle->read_buffer.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &handle->read_buffer); return; } assert(handle->read_buffer.base != NULL); buf = handle->read_buffer; } else { handle->flags |= UV_HANDLE_ZERO_READ; buf.base = (char*) &uv_zero_; buf.len = 0; } /* Prepare the overlapped structure. */ memset(&(req->overlapped), 0, sizeof(req->overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { assert(req->event_handle); req->overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); } flags = 0; result = WSARecv(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, &req->overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; if (handle->flags & UV_HANDLE_EMULATE_IOCP && req->wait_handle == INVALID_HANDLE_VALUE && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); handle->reqs_pending++; } } int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { uv_loop_t* loop = handle->loop; unsigned int i, simultaneous_accepts; uv_tcp_accept_t* req; int err; assert(backlog > 0); if (handle->flags & UV_HANDLE_LISTENING) { handle->connection_cb = cb; } if (handle->flags & UV_HANDLE_READING) { return WSAEISCONN; } if (handle->delayed_error) { return handle->delayed_error; } if (!(handle->flags & UV_HANDLE_BOUND)) { err = uv_tcp_try_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), 0); if (err) return err; if (handle->delayed_error) return handle->delayed_error; } if (!handle->func_acceptex) { if (!uv_get_acceptex_function(handle->socket, &handle->func_acceptex)) { return WSAEAFNOSUPPORT; } } if (!(handle->flags & UV_HANDLE_SHARED_TCP_SOCKET) && listen(handle->socket, backlog) == SOCKET_ERROR) { return WSAGetLastError(); } handle->flags |= UV_HANDLE_LISTENING; handle->connection_cb = cb; INCREASE_ACTIVE_COUNT(loop, handle); simultaneous_accepts = handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT ? 1 : uv_simultaneous_server_accepts; if(!handle->accept_reqs) { handle->accept_reqs = (uv_tcp_accept_t*) malloc(uv_simultaneous_server_accepts * sizeof(uv_tcp_accept_t)); if (!handle->accept_reqs) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } for (i = 0; i < simultaneous_accepts; i++) { req = &handle->accept_reqs[i]; uv_req_init(loop, (uv_req_t*)req); req->type = UV_ACCEPT; req->accept_socket = INVALID_SOCKET; req->data = handle; req->wait_handle = INVALID_HANDLE_VALUE; if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (!req->event_handle) { uv_fatal_error(GetLastError(), "CreateEvent"); } } else { req->event_handle = NULL; } uv_tcp_queue_accept(handle, req); } /* Initialize other unused requests too, because uv_tcp_endgame */ /* doesn't know how how many requests were intialized, so it will */ /* try to clean up {uv_simultaneous_server_accepts} requests. */ for (i = simultaneous_accepts; i < uv_simultaneous_server_accepts; i++) { req = &handle->accept_reqs[i]; uv_req_init(loop, (uv_req_t*) req); req->type = UV_ACCEPT; req->accept_socket = INVALID_SOCKET; req->data = handle; req->wait_handle = INVALID_HANDLE_VALUE; req->event_handle = NULL; } } return 0; } int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { uv_loop_t* loop = server->loop; int err = 0; int family; uv_tcp_accept_t* req = server->pending_accepts; if (!req) { /* No valid connections found, so we error out. */ return WSAEWOULDBLOCK; } if (req->accept_socket == INVALID_SOCKET) { return WSAENOTCONN; } if (server->flags & UV_HANDLE_IPV6) { family = AF_INET6; } else { family = AF_INET; } err = uv_tcp_set_socket(client->loop, client, req->accept_socket, family, 0); if (err) { closesocket(req->accept_socket); } else { uv_connection_init((uv_stream_t*) client); /* AcceptEx() implicitly binds the accepted socket. */ client->flags |= UV_HANDLE_BOUND | UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; } /* Prepare the req to pick up a new connection */ server->pending_accepts = req->next_pending; req->next_pending = NULL; req->accept_socket = INVALID_SOCKET; if (!(server->flags & UV__HANDLE_CLOSING)) { /* Check if we're in a middle of changing the number of pending accepts. */ if (!(server->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING)) { uv_tcp_queue_accept(server, req); } else { /* We better be switching to a single pending accept. */ assert(server->flags & UV_HANDLE_TCP_SINGLE_ACCEPT); server->processed_accepts++; if (server->processed_accepts >= uv_simultaneous_server_accepts) { server->processed_accepts = 0; /* * All previously queued accept requests are now processed. * We now switch to queueing just a single accept. */ uv_tcp_queue_accept(server, &server->accept_reqs[0]); server->flags &= ~UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; server->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; } } } loop->active_tcp_streams++; return err; } int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; handle->flags |= UV_HANDLE_READING; handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; INCREASE_ACTIVE_COUNT(loop, handle); /* If reading was stopped and then started again, there could still be a */ /* read request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) { if (handle->flags & UV_HANDLE_EMULATE_IOCP && !handle->read_req.event_handle) { handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL); if (!handle->read_req.event_handle) { uv_fatal_error(GetLastError(), "CreateEvent"); } } uv_tcp_queue_read(loop, handle); } return 0; } static int uv_tcp_try_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { uv_loop_t* loop = handle->loop; const struct sockaddr* bind_addr; BOOL success; DWORD bytes; int err; if (handle->delayed_error) { return handle->delayed_error; } if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; } else if (addrlen == sizeof(uv_addr_ip6_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; } else { abort(); } err = uv_tcp_try_bind(handle, bind_addr, addrlen, 0); if (err) return err; if (handle->delayed_error) return handle->delayed_error; } if (!handle->func_connectex) { if (!uv_get_connectex_function(handle->socket, &handle->func_connectex)) { return WSAEAFNOSUPPORT; } } uv_req_init(loop, (uv_req_t*) req); req->type = UV_CONNECT; req->handle = (uv_stream_t*) handle; req->cb = cb; memset(&req->overlapped, 0, sizeof(req->overlapped)); success = handle->func_connectex(handle->socket, addr, addrlen, NULL, 0, &bytes, &req->overlapped); if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { /* Process the req without IOCP. */ handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(success)) { /* The req will be processed with IOCP. */ handle->reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); } else { return WSAGetLastError(); } return 0; } int uv_tcp_getsockname(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { int result; if (!(handle->flags & UV_HANDLE_BOUND)) { return UV_EINVAL; } if (handle->delayed_error) { return uv_translate_sys_error(handle->delayed_error); } result = getsockname(handle->socket, name, namelen); if (result != 0) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv_tcp_getpeername(const uv_tcp_t* handle, struct sockaddr* name, int* namelen) { int result; if (!(handle->flags & UV_HANDLE_BOUND)) { return UV_EINVAL; } if (handle->delayed_error) { return uv_translate_sys_error(handle->delayed_error); } result = getpeername(handle->socket, name, namelen); if (result != 0) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { int result; DWORD bytes; uv_req_init(loop, (uv_req_t*) req); req->type = UV_WRITE; req->handle = (uv_stream_t*) handle; req->cb = cb; /* Prepare the overlapped structure. */ memset(&(req->overlapped), 0, sizeof(req->overlapped)); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { req->event_handle = CreateEvent(NULL, 0, 0, NULL); if (!req->event_handle) { uv_fatal_error(GetLastError(), "CreateEvent"); } req->overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); req->wait_handle = INVALID_HANDLE_VALUE; } result = WSASend(handle->socket, (WSABUF*) bufs, nbufs, &bytes, 0, &req->overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Request completed immediately. */ req->queued_bytes = 0; handle->reqs_pending++; handle->write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*) req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* Request queued by the kernel. */ req->queued_bytes = uv__count_bufs(bufs, nbufs); handle->reqs_pending++; handle->write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); handle->write_queue_size += req->queued_bytes; if (handle->flags & UV_HANDLE_EMULATE_IOCP && !RegisterWaitForSingleObject(&req->wait_handle, req->event_handle, post_write_completion, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } } else { /* Send failed due to an error. */ return WSAGetLastError(); } return 0; } void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req) { DWORD bytes, flags, err; uv_buf_t buf; assert(handle->type == UV_TCP); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!REQ_SUCCESS(req)) { /* An error occurred doing the read. */ if ((handle->flags & UV_HANDLE_READING) || !(handle->flags & UV_HANDLE_ZERO_READ)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); buf = (handle->flags & UV_HANDLE_ZERO_READ) ? uv_buf_init(NULL, 0) : handle->read_buffer; err = GET_REQ_SOCK_ERROR(req); if (err == WSAECONNABORTED) { /* * Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with Unix. */ err = WSAECONNRESET; } handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(err), &buf); } } else { if (!(handle->flags & UV_HANDLE_ZERO_READ)) { /* The read was done with a non-zero buffer length. */ if (req->overlapped.InternalHigh > 0) { /* Successful read */ handle->read_cb((uv_stream_t*)handle, req->overlapped.InternalHigh, &handle->read_buffer); /* Read again only if bytes == buf.len */ if (req->overlapped.InternalHigh < handle->read_buffer.len) { goto done; } } else { /* Connection closed */ if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); } handle->flags &= ~UV_HANDLE_READABLE; buf.base = 0; buf.len = 0; handle->read_cb((uv_stream_t*)handle, UV_EOF, &handle->read_buffer); goto done; } } /* Do nonblocking reads until the buffer is empty */ while (handle->flags & UV_HANDLE_READING) { handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); if (buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); break; } assert(buf.base != NULL); flags = 0; if (WSARecv(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, NULL, NULL) != SOCKET_ERROR) { if (bytes > 0) { /* Successful read */ handle->read_cb((uv_stream_t*)handle, bytes, &buf); /* Read again only if bytes == buf.len */ if (bytes < buf.len) { break; } } else { /* Connection closed */ handle->flags &= ~(UV_HANDLE_READING | UV_HANDLE_READABLE); DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*)handle, UV_EOF, &buf); break; } } else { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) { /* Read buffer was completely empty, report a 0-byte read. */ handle->read_cb((uv_stream_t*)handle, 0, &buf); } else { /* Ouch! serious error. */ handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); if (err == WSAECONNABORTED) { /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with */ /* Unix. */ err = WSAECONNRESET; } handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(err), &buf); } break; } } done: /* Post another read if still reading and not closing. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tcp_queue_read(loop, handle); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, uv_write_t* req) { int err; assert(handle->type == UV_TCP); assert(handle->write_queue_size >= req->queued_bytes); handle->write_queue_size -= req->queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle) { CloseHandle(req->event_handle); req->event_handle = NULL; } } if (req->cb) { err = uv_translate_sys_error(GET_REQ_SOCK_ERROR(req)); if (err == UV_ECONNABORTED) { /* use UV_ECANCELED for consistency with Unix */ err = UV_ECANCELED; } req->cb(req, err); } handle->write_reqs_pending--; if (handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* raw_req) { uv_tcp_accept_t* req = (uv_tcp_accept_t*) raw_req; int err; assert(handle->type == UV_TCP); /* If handle->accepted_socket is not a valid socket, then */ /* uv_queue_accept must have failed. This is a serious error. We stop */ /* accepting connections and report this error to the connection */ /* callback. */ if (req->accept_socket == INVALID_SOCKET) { if (handle->flags & UV_HANDLE_LISTENING) { handle->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, handle); if (handle->connection_cb) { err = GET_REQ_SOCK_ERROR(req); handle->connection_cb((uv_stream_t*)handle, uv_translate_sys_error(err)); } } } else if (REQ_SUCCESS(req) && setsockopt(req->accept_socket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&handle->socket, sizeof(handle->socket)) == 0) { req->next_pending = handle->pending_accepts; handle->pending_accepts = req; /* Accept and SO_UPDATE_ACCEPT_CONTEXT were successful. */ if (handle->connection_cb) { handle->connection_cb((uv_stream_t*)handle, 0); } } else { /* Error related to accepted socket is ignored because the server */ /* socket may still be healthy. If the server socket is broken */ /* uv_queue_accept will detect it. */ closesocket(req->accept_socket); req->accept_socket = INVALID_SOCKET; if (handle->flags & UV_HANDLE_LISTENING) { uv_tcp_queue_accept(handle, req); } } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, uv_connect_t* req) { int err; assert(handle->type == UV_TCP); UNREGISTER_HANDLE_REQ(loop, handle, req); err = 0; if (REQ_SUCCESS(req)) { if (setsockopt(handle->socket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0) == 0) { uv_connection_init((uv_stream_t*)handle); handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; loop->active_tcp_streams++; } else { err = WSAGetLastError(); } } else { err = GET_REQ_SOCK_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); DECREASE_PENDING_REQ_COUNT(handle); } int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex, int tcp_connection) { int err; SOCKET socket = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &socket_info_ex->socket_info, 0, WSA_FLAG_OVERLAPPED); if (socket == INVALID_SOCKET) { return WSAGetLastError(); } if (!SetHandleInformation((HANDLE) socket, HANDLE_FLAG_INHERIT, 0)) { err = GetLastError(); closesocket(socket); return err; } err = uv_tcp_set_socket(tcp->loop, tcp, socket, socket_info_ex->socket_info.iAddressFamily, 1); if (err) { closesocket(socket); return err; } if (tcp_connection) { uv_connection_init((uv_stream_t*)tcp); tcp->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; } tcp->flags |= UV_HANDLE_BOUND; tcp->flags |= UV_HANDLE_SHARED_TCP_SOCKET; tcp->delayed_error = socket_info_ex->delayed_error; tcp->loop->active_tcp_streams++; return 0; } int uv_tcp_nodelay(uv_tcp_t* handle, int enable) { int err; if (handle->socket != INVALID_SOCKET) { err = uv__tcp_nodelay(handle, handle->socket, enable); if (err) return err; } if (enable) { handle->flags |= UV_HANDLE_TCP_NODELAY; } else { handle->flags &= ~UV_HANDLE_TCP_NODELAY; } return 0; } int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) { int err; if (handle->socket != INVALID_SOCKET) { err = uv__tcp_keepalive(handle, handle->socket, enable, delay); if (err) return err; } if (enable) { handle->flags |= UV_HANDLE_TCP_KEEPALIVE; } else { handle->flags &= ~UV_HANDLE_TCP_KEEPALIVE; } /* TODO: Store delay if handle->socket isn't created yet. */ return 0; } int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid, LPWSAPROTOCOL_INFOW protocol_info) { if (!(handle->flags & UV_HANDLE_CONNECTION)) { /* * We're about to share the socket with another process. Because * this is a listening socket, we assume that the other process will * be accepting connections on it. So, before sharing the socket * with another process, we call listen here in the parent process. */ if (!(handle->flags & UV_HANDLE_LISTENING)) { if (!(handle->flags & UV_HANDLE_BOUND)) { return ERROR_INVALID_PARAMETER; } if (!(handle->delayed_error)) { if (listen(handle->socket, SOMAXCONN) == SOCKET_ERROR) { handle->delayed_error = WSAGetLastError(); } } } } if (WSADuplicateSocketW(handle->socket, pid, protocol_info)) { return WSAGetLastError(); } handle->flags |= UV_HANDLE_SHARED_TCP_SOCKET; return 0; } int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { if (handle->flags & UV_HANDLE_CONNECTION) { return UV_EINVAL; } /* Check if we're already in the desired mode. */ if ((enable && !(handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) || (!enable && handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) { return 0; } /* Don't allow switching from single pending accept to many. */ if (enable) { return UV_ENOTSUP; } /* Check if we're in a middle of changing the number of pending accepts. */ if (handle->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING) { return 0; } handle->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; /* Flip the changing flag if we have already queued multiple accepts. */ if (handle->flags & UV_HANDLE_LISTENING) { handle->flags |= UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; } return 0; } static int uv_tcp_try_cancel_io(uv_tcp_t* tcp) { SOCKET socket = tcp->socket; int non_ifs_lsp; /* Check if we have any non-IFS LSPs stacked on top of TCP */ non_ifs_lsp = (tcp->flags & UV_HANDLE_IPV6) ? uv_tcp_non_ifs_lsp_ipv6 : uv_tcp_non_ifs_lsp_ipv4; /* If there are non-ifs LSPs then try to obtain a base handle for the */ /* socket. This will always fail on Windows XP/3k. */ if (non_ifs_lsp) { DWORD bytes; if (WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &socket, sizeof socket, &bytes, NULL, NULL) != 0) { /* Failed. We can't do CancelIo. */ return -1; } } assert(socket != 0 && socket != INVALID_SOCKET); if (!CancelIo((HANDLE) socket)) { return GetLastError(); } /* It worked. */ return 0; } void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp) { int close_socket = 1; if (tcp->flags & UV_HANDLE_READ_PENDING) { /* In order for winsock to do a graceful close there must not be any */ /* any pending reads, or the socket must be shut down for writing */ if (!(tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET)) { /* Just do shutdown on non-shared sockets, which ensures graceful close. */ shutdown(tcp->socket, SD_SEND); } else if (uv_tcp_try_cancel_io(tcp) == 0) { /* In case of a shared socket, we try to cancel all outstanding I/O, */ /* If that works, don't close the socket yet - wait for the read req to */ /* return and close the socket in uv_tcp_endgame. */ close_socket = 0; } else { /* When cancelling isn't possible - which could happen when an LSP is */ /* present on an old Windows version, we will have to close the socket */ /* with a read pending. That is not nice because trailing sent bytes */ /* may not make it to the other side. */ } } else if ((tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET) && tcp->accept_reqs != NULL) { /* Under normal circumstances closesocket() will ensure that all pending */ /* accept reqs are canceled. However, when the socket is shared the */ /* presence of another reference to the socket in another process will */ /* keep the accept reqs going, so we have to ensure that these are */ /* canceled. */ if (uv_tcp_try_cancel_io(tcp) != 0) { /* When cancellation is not possible, there is another option: we can */ /* close the incoming sockets, which will also cancel the accept */ /* operations. However this is not cool because we might inadvertedly */ /* close a socket that just accepted a new connection, which will */ /* cause the connection to be aborted. */ unsigned int i; for (i = 0; i < uv_simultaneous_server_accepts; i++) { uv_tcp_accept_t* req = &tcp->accept_reqs[i]; if (req->accept_socket != INVALID_SOCKET && !HasOverlappedIoCompleted(&req->overlapped)) { closesocket(req->accept_socket); req->accept_socket = INVALID_SOCKET; } } } } if (tcp->flags & UV_HANDLE_READING) { tcp->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, tcp); } if (tcp->flags & UV_HANDLE_LISTENING) { tcp->flags &= ~UV_HANDLE_LISTENING; DECREASE_ACTIVE_COUNT(loop, tcp); } if (close_socket) { closesocket(tcp->socket); tcp->socket = INVALID_SOCKET; tcp->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; } tcp->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(tcp); if (tcp->reqs_pending == 0) { uv_want_endgame(tcp->loop, (uv_handle_t*)tcp); } } int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { WSAPROTOCOL_INFOW protocol_info; int opt_len; int err; /* Detect the address family of the socket. */ opt_len = (int) sizeof protocol_info; if (getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) { return uv_translate_sys_error(GetLastError()); } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)) { return uv_translate_sys_error(GetLastError()); } err = uv_tcp_set_socket(handle->loop, handle, sock, protocol_info.iAddressFamily, 1); if (err) { return uv_translate_sys_error(err); } return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__tcp_bind(uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; err = uv_tcp_try_bind(handle, addr, addrlen, flags); if (err) return uv_translate_sys_error(err); return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__tcp_connect(uv_connect_t* req, uv_tcp_t* handle, const struct sockaddr* addr, unsigned int addrlen, uv_connect_cb cb) { int err; err = uv_tcp_try_connect(req, handle, addr, addrlen, cb); if (err) return uv_translate_sys_error(err); return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/thread.c0000644000175000017500000004666612502366750017770 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include "uv.h" #include "internal.h" #define HAVE_SRWLOCK_API() (pTryAcquireSRWLockShared != NULL) #define HAVE_CONDVAR_API() (pInitializeConditionVariable != NULL) #ifdef _MSC_VER /* msvc */ # define inline __inline # define NOINLINE __declspec (noinline) #else /* gcc */ # define inline inline # define NOINLINE __attribute__ ((noinline)) #endif inline static int uv__rwlock_srwlock_init(uv_rwlock_t* rwlock); inline static void uv__rwlock_srwlock_destroy(uv_rwlock_t* rwlock); inline static void uv__rwlock_srwlock_rdlock(uv_rwlock_t* rwlock); inline static int uv__rwlock_srwlock_tryrdlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_srwlock_rdunlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_srwlock_wrlock(uv_rwlock_t* rwlock); inline static int uv__rwlock_srwlock_trywrlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_srwlock_wrunlock(uv_rwlock_t* rwlock); inline static int uv__rwlock_fallback_init(uv_rwlock_t* rwlock); inline static void uv__rwlock_fallback_destroy(uv_rwlock_t* rwlock); inline static void uv__rwlock_fallback_rdlock(uv_rwlock_t* rwlock); inline static int uv__rwlock_fallback_tryrdlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_fallback_rdunlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_fallback_wrlock(uv_rwlock_t* rwlock); inline static int uv__rwlock_fallback_trywrlock(uv_rwlock_t* rwlock); inline static void uv__rwlock_fallback_wrunlock(uv_rwlock_t* rwlock); inline static int uv_cond_fallback_init(uv_cond_t* cond); inline static void uv_cond_fallback_destroy(uv_cond_t* cond); inline static void uv_cond_fallback_signal(uv_cond_t* cond); inline static void uv_cond_fallback_broadcast(uv_cond_t* cond); inline static void uv_cond_fallback_wait(uv_cond_t* cond, uv_mutex_t* mutex); inline static int uv_cond_fallback_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout); inline static int uv_cond_condvar_init(uv_cond_t* cond); inline static void uv_cond_condvar_destroy(uv_cond_t* cond); inline static void uv_cond_condvar_signal(uv_cond_t* cond); inline static void uv_cond_condvar_broadcast(uv_cond_t* cond); inline static void uv_cond_condvar_wait(uv_cond_t* cond, uv_mutex_t* mutex); inline static int uv_cond_condvar_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout); static NOINLINE void uv__once_inner(uv_once_t* guard, void (*callback)(void)) { DWORD result; HANDLE existing_event, created_event; created_event = CreateEvent(NULL, 1, 0, NULL); if (created_event == 0) { /* Could fail in a low-memory situation? */ uv_fatal_error(GetLastError(), "CreateEvent"); } existing_event = InterlockedCompareExchangePointer(&guard->event, created_event, NULL); if (existing_event == NULL) { /* We won the race */ callback(); result = SetEvent(created_event); assert(result); guard->ran = 1; } else { /* We lost the race. Destroy the event we created and wait for the */ /* existing one todv become signaled. */ CloseHandle(created_event); result = WaitForSingleObject(existing_event, INFINITE); assert(result == WAIT_OBJECT_0); } } void uv_once(uv_once_t* guard, void (*callback)(void)) { /* Fast case - avoid WaitForSingleObject. */ if (guard->ran) { return; } uv__once_inner(guard, callback); } static UV_THREAD_LOCAL uv_thread_t uv__current_thread = NULL; struct thread_ctx { void (*entry)(void* arg); void* arg; uv_thread_t self; }; static UINT __stdcall uv__thread_start(void* arg) { struct thread_ctx *ctx_p; struct thread_ctx ctx; ctx_p = arg; ctx = *ctx_p; free(ctx_p); uv__current_thread = ctx.self; ctx.entry(ctx.arg); return 0; } int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { struct thread_ctx* ctx; int err; HANDLE thread; ctx = malloc(sizeof(*ctx)); if (ctx == NULL) return UV_ENOMEM; ctx->entry = entry; ctx->arg = arg; /* Create the thread in suspended state so we have a chance to pass * its own creation handle to it */ thread = (HANDLE) _beginthreadex(NULL, 0, uv__thread_start, ctx, CREATE_SUSPENDED, NULL); if (thread == NULL) { err = errno; free(ctx); } else { err = 0; *tid = thread; ctx->self = thread; ResumeThread(thread); } return err; } uv_thread_t uv_thread_self(void) { return uv__current_thread; } int uv_thread_join(uv_thread_t *tid) { if (WaitForSingleObject(*tid, INFINITE)) return uv_translate_sys_error(GetLastError()); else { CloseHandle(*tid); *tid = 0; return 0; } } int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { return *t1 == *t2; } int uv_mutex_init(uv_mutex_t* mutex) { InitializeCriticalSection(mutex); return 0; } void uv_mutex_destroy(uv_mutex_t* mutex) { DeleteCriticalSection(mutex); } void uv_mutex_lock(uv_mutex_t* mutex) { EnterCriticalSection(mutex); } int uv_mutex_trylock(uv_mutex_t* mutex) { if (TryEnterCriticalSection(mutex)) return 0; else return UV_EAGAIN; } void uv_mutex_unlock(uv_mutex_t* mutex) { LeaveCriticalSection(mutex); } int uv_rwlock_init(uv_rwlock_t* rwlock) { uv__once_init(); if (HAVE_SRWLOCK_API()) return uv__rwlock_srwlock_init(rwlock); else return uv__rwlock_fallback_init(rwlock); } void uv_rwlock_destroy(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) uv__rwlock_srwlock_destroy(rwlock); else uv__rwlock_fallback_destroy(rwlock); } void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) uv__rwlock_srwlock_rdlock(rwlock); else uv__rwlock_fallback_rdlock(rwlock); } int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) return uv__rwlock_srwlock_tryrdlock(rwlock); else return uv__rwlock_fallback_tryrdlock(rwlock); } void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) uv__rwlock_srwlock_rdunlock(rwlock); else uv__rwlock_fallback_rdunlock(rwlock); } void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) uv__rwlock_srwlock_wrlock(rwlock); else uv__rwlock_fallback_wrlock(rwlock); } int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) return uv__rwlock_srwlock_trywrlock(rwlock); else return uv__rwlock_fallback_trywrlock(rwlock); } void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { if (HAVE_SRWLOCK_API()) uv__rwlock_srwlock_wrunlock(rwlock); else uv__rwlock_fallback_wrunlock(rwlock); } int uv_sem_init(uv_sem_t* sem, unsigned int value) { *sem = CreateSemaphore(NULL, value, INT_MAX, NULL); if (*sem == NULL) return uv_translate_sys_error(GetLastError()); else return 0; } void uv_sem_destroy(uv_sem_t* sem) { if (!CloseHandle(*sem)) abort(); } void uv_sem_post(uv_sem_t* sem) { if (!ReleaseSemaphore(*sem, 1, NULL)) abort(); } void uv_sem_wait(uv_sem_t* sem) { if (WaitForSingleObject(*sem, INFINITE) != WAIT_OBJECT_0) abort(); } int uv_sem_trywait(uv_sem_t* sem) { DWORD r = WaitForSingleObject(*sem, 0); if (r == WAIT_OBJECT_0) return 0; if (r == WAIT_TIMEOUT) return UV_EAGAIN; abort(); return -1; /* Satisfy the compiler. */ } inline static int uv__rwlock_srwlock_init(uv_rwlock_t* rwlock) { pInitializeSRWLock(&rwlock->srwlock_); return 0; } inline static void uv__rwlock_srwlock_destroy(uv_rwlock_t* rwlock) { (void) rwlock; } inline static void uv__rwlock_srwlock_rdlock(uv_rwlock_t* rwlock) { pAcquireSRWLockShared(&rwlock->srwlock_); } inline static int uv__rwlock_srwlock_tryrdlock(uv_rwlock_t* rwlock) { if (pTryAcquireSRWLockShared(&rwlock->srwlock_)) return 0; else return UV_EBUSY; /* TODO(bnoordhuis) EAGAIN when owned by this thread. */ } inline static void uv__rwlock_srwlock_rdunlock(uv_rwlock_t* rwlock) { pReleaseSRWLockShared(&rwlock->srwlock_); } inline static void uv__rwlock_srwlock_wrlock(uv_rwlock_t* rwlock) { pAcquireSRWLockExclusive(&rwlock->srwlock_); } inline static int uv__rwlock_srwlock_trywrlock(uv_rwlock_t* rwlock) { if (pTryAcquireSRWLockExclusive(&rwlock->srwlock_)) return 0; else return UV_EBUSY; /* TODO(bnoordhuis) EAGAIN when owned by this thread. */ } inline static void uv__rwlock_srwlock_wrunlock(uv_rwlock_t* rwlock) { pReleaseSRWLockExclusive(&rwlock->srwlock_); } inline static int uv__rwlock_fallback_init(uv_rwlock_t* rwlock) { int err; err = uv_mutex_init(&rwlock->fallback_.read_mutex_); if (err) return err; err = uv_mutex_init(&rwlock->fallback_.write_mutex_); if (err) { uv_mutex_destroy(&rwlock->fallback_.read_mutex_); return err; } rwlock->fallback_.num_readers_ = 0; return 0; } inline static void uv__rwlock_fallback_destroy(uv_rwlock_t* rwlock) { uv_mutex_destroy(&rwlock->fallback_.read_mutex_); uv_mutex_destroy(&rwlock->fallback_.write_mutex_); } inline static void uv__rwlock_fallback_rdlock(uv_rwlock_t* rwlock) { uv_mutex_lock(&rwlock->fallback_.read_mutex_); if (++rwlock->fallback_.num_readers_ == 1) uv_mutex_lock(&rwlock->fallback_.write_mutex_); uv_mutex_unlock(&rwlock->fallback_.read_mutex_); } inline static int uv__rwlock_fallback_tryrdlock(uv_rwlock_t* rwlock) { int err; err = uv_mutex_trylock(&rwlock->fallback_.read_mutex_); if (err) goto out; err = 0; if (rwlock->fallback_.num_readers_ == 0) err = uv_mutex_trylock(&rwlock->fallback_.write_mutex_); if (err == 0) rwlock->fallback_.num_readers_++; uv_mutex_unlock(&rwlock->fallback_.read_mutex_); out: return err; } inline static void uv__rwlock_fallback_rdunlock(uv_rwlock_t* rwlock) { uv_mutex_lock(&rwlock->fallback_.read_mutex_); if (--rwlock->fallback_.num_readers_ == 0) uv_mutex_unlock(&rwlock->fallback_.write_mutex_); uv_mutex_unlock(&rwlock->fallback_.read_mutex_); } inline static void uv__rwlock_fallback_wrlock(uv_rwlock_t* rwlock) { uv_mutex_lock(&rwlock->fallback_.write_mutex_); } inline static int uv__rwlock_fallback_trywrlock(uv_rwlock_t* rwlock) { return uv_mutex_trylock(&rwlock->fallback_.write_mutex_); } inline static void uv__rwlock_fallback_wrunlock(uv_rwlock_t* rwlock) { uv_mutex_unlock(&rwlock->fallback_.write_mutex_); } /* This condition variable implementation is based on the SetEvent solution * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html * We could not use the SignalObjectAndWait solution (section 3.4) because * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. */ inline static int uv_cond_fallback_init(uv_cond_t* cond) { int err; /* Initialize the count to 0. */ cond->fallback.waiters_count = 0; InitializeCriticalSection(&cond->fallback.waiters_count_lock); /* Create an auto-reset event. */ cond->fallback.signal_event = CreateEvent(NULL, /* no security */ FALSE, /* auto-reset event */ FALSE, /* non-signaled initially */ NULL); /* unnamed */ if (!cond->fallback.signal_event) { err = GetLastError(); goto error2; } /* Create a manual-reset event. */ cond->fallback.broadcast_event = CreateEvent(NULL, /* no security */ TRUE, /* manual-reset */ FALSE, /* non-signaled */ NULL); /* unnamed */ if (!cond->fallback.broadcast_event) { err = GetLastError(); goto error; } return 0; error: CloseHandle(cond->fallback.signal_event); error2: DeleteCriticalSection(&cond->fallback.waiters_count_lock); return uv_translate_sys_error(err); } inline static int uv_cond_condvar_init(uv_cond_t* cond) { pInitializeConditionVariable(&cond->cond_var); return 0; } int uv_cond_init(uv_cond_t* cond) { uv__once_init(); if (HAVE_CONDVAR_API()) return uv_cond_condvar_init(cond); else return uv_cond_fallback_init(cond); } inline static void uv_cond_fallback_destroy(uv_cond_t* cond) { if (!CloseHandle(cond->fallback.broadcast_event)) abort(); if (!CloseHandle(cond->fallback.signal_event)) abort(); DeleteCriticalSection(&cond->fallback.waiters_count_lock); } inline static void uv_cond_condvar_destroy(uv_cond_t* cond) { /* nothing to do */ } void uv_cond_destroy(uv_cond_t* cond) { if (HAVE_CONDVAR_API()) uv_cond_condvar_destroy(cond); else uv_cond_fallback_destroy(cond); } inline static void uv_cond_fallback_signal(uv_cond_t* cond) { int have_waiters; /* Avoid race conditions. */ EnterCriticalSection(&cond->fallback.waiters_count_lock); have_waiters = cond->fallback.waiters_count > 0; LeaveCriticalSection(&cond->fallback.waiters_count_lock); if (have_waiters) SetEvent(cond->fallback.signal_event); } inline static void uv_cond_condvar_signal(uv_cond_t* cond) { pWakeConditionVariable(&cond->cond_var); } void uv_cond_signal(uv_cond_t* cond) { if (HAVE_CONDVAR_API()) uv_cond_condvar_signal(cond); else uv_cond_fallback_signal(cond); } inline static void uv_cond_fallback_broadcast(uv_cond_t* cond) { int have_waiters; /* Avoid race conditions. */ EnterCriticalSection(&cond->fallback.waiters_count_lock); have_waiters = cond->fallback.waiters_count > 0; LeaveCriticalSection(&cond->fallback.waiters_count_lock); if (have_waiters) SetEvent(cond->fallback.broadcast_event); } inline static void uv_cond_condvar_broadcast(uv_cond_t* cond) { pWakeAllConditionVariable(&cond->cond_var); } void uv_cond_broadcast(uv_cond_t* cond) { if (HAVE_CONDVAR_API()) uv_cond_condvar_broadcast(cond); else uv_cond_fallback_broadcast(cond); } inline int uv_cond_wait_helper(uv_cond_t* cond, uv_mutex_t* mutex, DWORD dwMilliseconds) { DWORD result; int last_waiter; HANDLE handles[2] = { cond->fallback.signal_event, cond->fallback.broadcast_event }; /* Avoid race conditions. */ EnterCriticalSection(&cond->fallback.waiters_count_lock); cond->fallback.waiters_count++; LeaveCriticalSection(&cond->fallback.waiters_count_lock); /* It's ok to release the here since Win32 manual-reset events */ /* maintain state when used with . This avoids the "lost wakeup" */ /* bug. */ uv_mutex_unlock(mutex); /* Wait for either event to become signaled due to being */ /* called or being called. */ result = WaitForMultipleObjects(2, handles, FALSE, dwMilliseconds); EnterCriticalSection(&cond->fallback.waiters_count_lock); cond->fallback.waiters_count--; last_waiter = result == WAIT_OBJECT_0 + 1 && cond->fallback.waiters_count == 0; LeaveCriticalSection(&cond->fallback.waiters_count_lock); /* Some thread called . */ if (last_waiter) { /* We're the last waiter to be notified or to stop waiting, so reset the */ /* the manual-reset event. */ ResetEvent(cond->fallback.broadcast_event); } /* Reacquire the . */ uv_mutex_lock(mutex); if (result == WAIT_OBJECT_0 || result == WAIT_OBJECT_0 + 1) return 0; if (result == WAIT_TIMEOUT) return UV_ETIMEDOUT; abort(); return -1; /* Satisfy the compiler. */ } inline static void uv_cond_fallback_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (uv_cond_wait_helper(cond, mutex, INFINITE)) abort(); } inline static void uv_cond_condvar_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (!pSleepConditionVariableCS(&cond->cond_var, mutex, INFINITE)) abort(); } void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { if (HAVE_CONDVAR_API()) uv_cond_condvar_wait(cond, mutex); else uv_cond_fallback_wait(cond, mutex); } inline static int uv_cond_fallback_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { return uv_cond_wait_helper(cond, mutex, (DWORD)(timeout / 1e6)); } inline static int uv_cond_condvar_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { if (pSleepConditionVariableCS(&cond->cond_var, mutex, (DWORD)(timeout / 1e6))) return 0; if (GetLastError() != ERROR_TIMEOUT) abort(); return UV_ETIMEDOUT; } int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { if (HAVE_CONDVAR_API()) return uv_cond_condvar_timedwait(cond, mutex, timeout); else return uv_cond_fallback_timedwait(cond, mutex, timeout); } int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { int err; barrier->n = count; barrier->count = 0; err = uv_mutex_init(&barrier->mutex); if (err) return err; err = uv_sem_init(&barrier->turnstile1, 0); if (err) goto error2; err = uv_sem_init(&barrier->turnstile2, 1); if (err) goto error; return 0; error: uv_sem_destroy(&barrier->turnstile1); error2: uv_mutex_destroy(&barrier->mutex); return err; } void uv_barrier_destroy(uv_barrier_t* barrier) { uv_sem_destroy(&barrier->turnstile2); uv_sem_destroy(&barrier->turnstile1); uv_mutex_destroy(&barrier->mutex); } int uv_barrier_wait(uv_barrier_t* barrier) { int serial_thread; uv_mutex_lock(&barrier->mutex); if (++barrier->count == barrier->n) { uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile1); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile1); uv_mutex_lock(&barrier->mutex); serial_thread = (--barrier->count == 0); if (serial_thread) { uv_sem_wait(&barrier->turnstile1); uv_sem_post(&barrier->turnstile2); } uv_mutex_unlock(&barrier->mutex); uv_sem_wait(&barrier->turnstile2); uv_sem_post(&barrier->turnstile2); return serial_thread; } int uv_key_create(uv_key_t* key) { key->tls_index = TlsAlloc(); if (key->tls_index == TLS_OUT_OF_INDEXES) return UV_ENOMEM; return 0; } void uv_key_delete(uv_key_t* key) { if (TlsFree(key->tls_index) == FALSE) abort(); key->tls_index = TLS_OUT_OF_INDEXES; } void* uv_key_get(uv_key_t* key) { void* value; value = TlsGetValue(key->tls_index); if (value == NULL) if (GetLastError() != ERROR_SUCCESS) abort(); return value; } void uv_key_set(uv_key_t* key, void* value) { if (TlsSetValue(key->tls_index, value) == FALSE) abort(); } MoarVM-2015.11/3rdparty/libuv/src/win/timer.c0000644000175000017500000001207212502366750017621 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "tree.h" #include "handle-inl.h" /* The number of milliseconds in one second. */ #define UV__MILLISEC 1000 void uv_update_time(uv_loop_t* loop) { uint64_t new_time = uv__hrtime(UV__MILLISEC); if (new_time > loop->time) { loop->time = new_time; } } void uv__time_forward(uv_loop_t* loop, uint64_t msecs) { loop->time += msecs; } static int uv_timer_compare(uv_timer_t* a, uv_timer_t* b) { if (a->due < b->due) return -1; if (a->due > b->due) return 1; /* * compare start_id when both has the same due. start_id is * allocated with loop->timer_counter in uv_timer_start(). */ if (a->start_id < b->start_id) return -1; if (a->start_id > b->start_id) return 1; return 0; } RB_GENERATE_STATIC(uv_timer_tree_s, uv_timer_s, tree_entry, uv_timer_compare); int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_TIMER); handle->timer_cb = NULL; handle->repeat = 0; return 0; } void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle) { if (handle->flags & UV__HANDLE_CLOSING) { assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } static uint64_t get_clamped_due_time(uint64_t loop_time, uint64_t timeout) { uint64_t clamped_timeout; clamped_timeout = loop_time + timeout; if (clamped_timeout < timeout) clamped_timeout = (uint64_t) -1; return clamped_timeout; } int uv_timer_start(uv_timer_t* handle, uv_timer_cb timer_cb, uint64_t timeout, uint64_t repeat) { uv_loop_t* loop = handle->loop; uv_timer_t* old; if (timer_cb == NULL) return UV_EINVAL; if (uv__is_active(handle)) uv_timer_stop(handle); handle->timer_cb = timer_cb; handle->due = get_clamped_due_time(loop->time, timeout); handle->repeat = repeat; uv__handle_start(handle); /* start_id is the second index to be compared in uv__timer_cmp() */ handle->start_id = handle->loop->timer_counter++; old = RB_INSERT(uv_timer_tree_s, &loop->timers, handle); assert(old == NULL); return 0; } int uv_timer_stop(uv_timer_t* handle) { uv_loop_t* loop = handle->loop; if (!uv__is_active(handle)) return 0; RB_REMOVE(uv_timer_tree_s, &loop->timers, handle); uv__handle_stop(handle); return 0; } int uv_timer_again(uv_timer_t* handle) { /* If timer_cb is NULL that means that the timer was never started. */ if (!handle->timer_cb) { return UV_EINVAL; } if (handle->repeat) { uv_timer_stop(handle); uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); } return 0; } void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) { assert(handle->type == UV_TIMER); handle->repeat = repeat; } uint64_t uv_timer_get_repeat(const uv_timer_t* handle) { assert(handle->type == UV_TIMER); return handle->repeat; } DWORD uv__next_timeout(const uv_loop_t* loop) { uv_timer_t* timer; int64_t delta; /* Check if there are any running timers * Need to cast away const first, since RB_MIN doesn't know what we are * going to do with this return value, it can't be marked const */ timer = RB_MIN(uv_timer_tree_s, &((uv_loop_t*)loop)->timers); if (timer) { delta = timer->due - loop->time; if (delta >= UINT_MAX - 1) { /* A timeout value of UINT_MAX means infinite, so that's no good. */ return UINT_MAX - 1; } else if (delta < 0) { /* Negative timeout values are not allowed */ return 0; } else { return (DWORD)delta; } } else { /* No timers */ return INFINITE; } } void uv_process_timers(uv_loop_t* loop) { uv_timer_t* timer; /* Call timer callbacks */ for (timer = RB_MIN(uv_timer_tree_s, &loop->timers); timer != NULL && timer->due <= loop->time; timer = RB_MIN(uv_timer_tree_s, &loop->timers)) { uv_timer_stop(timer); uv_timer_again(timer); timer->timer_cb((uv_timer_t*) timer); } } MoarVM-2015.11/3rdparty/libuv/src/win/tty.c0000644000175000017500000016624512456307253017336 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #ifndef COMMON_LVB_REVERSE_VIDEO # define COMMON_LVB_REVERSE_VIDEO 0x4000 #endif #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" #define UNICODE_REPLACEMENT_CHARACTER (0xfffd) #define ANSI_NORMAL 0x00 #define ANSI_ESCAPE_SEEN 0x02 #define ANSI_CSI 0x04 #define ANSI_ST_CONTROL 0x08 #define ANSI_IGNORE 0x10 #define ANSI_IN_ARG 0x20 #define ANSI_IN_STRING 0x40 #define ANSI_BACKSLASH_SEEN 0x80 #define MAX_INPUT_BUFFER_LENGTH 8192 static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info); /* Null uv_buf_t */ static const uv_buf_t uv_null_buf_ = { 0, NULL }; /* * The console virtual window. * * Normally cursor movement in windows is relative to the console screen buffer, * e.g. the application is allowed to overwrite the 'history'. This is very * inconvenient, it makes absolute cursor movement pretty useless. There is * also the concept of 'client rect' which is defined by the actual size of * the console window and the scroll position of the screen buffer, but it's * very volatile because it changes when the user scrolls. * * To make cursor movement behave sensibly we define a virtual window to which * cursor movement is confined. The virtual window is always as wide as the * console screen buffer, but it's height is defined by the size of the * console window. The top of the virtual window aligns with the position * of the caret when the first stdout/err handle is created, unless that would * mean that it would extend beyond the bottom of the screen buffer - in that * that case it's located as far down as possible. * * When the user writes a long text or many newlines, such that the output * reaches beyond the bottom of the virtual window, the virtual window is * shifted downwards, but not resized. * * Since all tty i/o happens on the same console, this window is shared * between all stdout/stderr handles. */ static int uv_tty_virtual_offset = -1; static int uv_tty_virtual_height = -1; static int uv_tty_virtual_width = -1; static CRITICAL_SECTION uv_tty_output_lock; static HANDLE uv_tty_output_handle = INVALID_HANDLE_VALUE; void uv_console_init() { InitializeCriticalSection(&uv_tty_output_lock); } int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int readable) { HANDLE handle; CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info; handle = (HANDLE) _get_osfhandle(fd); if (handle == INVALID_HANDLE_VALUE) { return UV_EBADF; } if (!readable) { /* Obtain the screen buffer info with the output handle. */ if (!GetConsoleScreenBufferInfo(handle, &screen_buffer_info)) { return uv_translate_sys_error(GetLastError()); } /* Obtain the the tty_output_lock because the virtual window state is */ /* shared between all uv_tty_t handles. */ EnterCriticalSection(&uv_tty_output_lock); /* Store the global tty output handle. This handle is used by TTY read */ /* streams to update the virtual window when a CONSOLE_BUFFER_SIZE_EVENT */ /* is received. */ uv_tty_output_handle = handle; uv_tty_update_virtual_window(&screen_buffer_info); LeaveCriticalSection(&uv_tty_output_lock); } uv_stream_init(loop, (uv_stream_t*) tty, UV_TTY); uv_connection_init((uv_stream_t*) tty); tty->handle = handle; tty->reqs_pending = 0; tty->flags |= UV_HANDLE_BOUND; if (readable) { /* Initialize TTY input specific fields. */ tty->flags |= UV_HANDLE_TTY_READABLE | UV_HANDLE_READABLE; tty->read_line_handle = NULL; tty->read_line_buffer = uv_null_buf_; tty->read_raw_wait = NULL; /* Init keycode-to-vt100 mapper state. */ tty->last_key_len = 0; tty->last_key_offset = 0; tty->last_utf16_high_surrogate = 0; memset(&tty->last_input_record, 0, sizeof tty->last_input_record); } else { /* TTY output specific fields. */ tty->flags |= UV_HANDLE_WRITABLE; /* Init utf8-to-utf16 conversion state. */ tty->utf8_bytes_left = 0; tty->utf8_codepoint = 0; /* Initialize eol conversion state */ tty->previous_eol = 0; /* Init ANSI parser state. */ tty->ansi_parser_state = ANSI_NORMAL; } return 0; } int uv_tty_set_mode(uv_tty_t* tty, int mode) { DWORD flags; unsigned char was_reading; uv_alloc_cb alloc_cb; uv_read_cb read_cb; int err; if (!(tty->flags & UV_HANDLE_TTY_READABLE)) { return UV_EINVAL; } if (!!mode == !!(tty->flags & UV_HANDLE_TTY_RAW)) { return 0; } if (mode) { /* Raw input */ flags = ENABLE_WINDOW_INPUT; } else { /* Line-buffered mode. */ flags = ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT; } if (!SetConsoleMode(tty->handle, flags)) { return uv_translate_sys_error(GetLastError()); } /* If currently reading, stop, and restart reading. */ if (tty->flags & UV_HANDLE_READING) { was_reading = 1; alloc_cb = tty->alloc_cb; read_cb = tty->read_cb; if (was_reading) { err = uv_tty_read_stop(tty); if (err) { return uv_translate_sys_error(err); } } } else { was_reading = 0; } /* Update flag. */ tty->flags &= ~UV_HANDLE_TTY_RAW; tty->flags |= mode ? UV_HANDLE_TTY_RAW : 0; /* If we just stopped reading, restart. */ if (was_reading) { err = uv_tty_read_start(tty, alloc_cb, read_cb); if (err) { return uv_translate_sys_error(err); } } return 0; } int uv_is_tty(uv_file file) { DWORD result; return GetConsoleMode((HANDLE) _get_osfhandle(file), &result) != 0; } int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { CONSOLE_SCREEN_BUFFER_INFO info; if (!GetConsoleScreenBufferInfo(tty->handle, &info)) { return uv_translate_sys_error(GetLastError()); } EnterCriticalSection(&uv_tty_output_lock); uv_tty_update_virtual_window(&info); LeaveCriticalSection(&uv_tty_output_lock); *width = uv_tty_virtual_width; *height = uv_tty_virtual_height; return 0; } static void CALLBACK uv_tty_post_raw_read(void* data, BOOLEAN didTimeout) { uv_loop_t* loop; uv_tty_t* handle; uv_req_t* req; assert(data); assert(!didTimeout); req = (uv_req_t*) data; handle = (uv_tty_t*) req->data; loop = handle->loop; UnregisterWait(handle->read_raw_wait); handle->read_raw_wait = NULL; SET_REQ_SUCCESS(req); POST_COMPLETION_FOR_REQ(loop, req); } static void uv_tty_queue_read_raw(uv_loop_t* loop, uv_tty_t* handle) { uv_read_t* req; BOOL r; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); handle->read_line_buffer = uv_null_buf_; req = &handle->read_req; memset(&req->overlapped, 0, sizeof(req->overlapped)); r = RegisterWaitForSingleObject(&handle->read_raw_wait, handle->handle, uv_tty_post_raw_read, (void*) req, INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); if (!r) { handle->read_raw_wait = NULL; SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } static DWORD CALLBACK uv_tty_line_read_thread(void* data) { uv_loop_t* loop; uv_tty_t* handle; uv_req_t* req; DWORD bytes, read_bytes; WCHAR utf16[MAX_INPUT_BUFFER_LENGTH / 3]; DWORD chars, read_chars; assert(data); req = (uv_req_t*) data; handle = (uv_tty_t*) req->data; loop = handle->loop; assert(handle->read_line_buffer.base != NULL); assert(handle->read_line_buffer.len > 0); /* ReadConsole can't handle big buffers. */ if (handle->read_line_buffer.len < MAX_INPUT_BUFFER_LENGTH) { bytes = handle->read_line_buffer.len; } else { bytes = MAX_INPUT_BUFFER_LENGTH; } /* At last, unicode! */ /* One utf-16 codeunit never takes more than 3 utf-8 codeunits to encode */ chars = bytes / 3; if (ReadConsoleW(handle->read_line_handle, (void*) utf16, chars, &read_chars, NULL)) { read_bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, read_chars, handle->read_line_buffer.base, bytes, NULL, NULL); SET_REQ_SUCCESS(req); req->overlapped.InternalHigh = read_bytes; } else { SET_REQ_ERROR(req, GetLastError()); } POST_COMPLETION_FOR_REQ(loop, req); return 0; } static void uv_tty_queue_read_line(uv_loop_t* loop, uv_tty_t* handle) { uv_read_t* req; BOOL r; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); req = &handle->read_req; memset(&req->overlapped, 0, sizeof(req->overlapped)); handle->alloc_cb((uv_handle_t*) handle, 8192, &handle->read_line_buffer); if (handle->read_line_buffer.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &handle->read_line_buffer); return; } assert(handle->read_line_buffer.base != NULL); /* Duplicate the console handle, so if we want to cancel the read, we can */ /* just close this handle duplicate. */ if (handle->read_line_handle == NULL) { HANDLE this_process = GetCurrentProcess(); r = DuplicateHandle(this_process, handle->handle, this_process, &handle->read_line_handle, 0, 0, DUPLICATE_SAME_ACCESS); if (!r) { handle->read_line_handle = NULL; SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); goto out; } } r = QueueUserWorkItem(uv_tty_line_read_thread, (void*) req, WT_EXECUTELONGFUNCTION); if (!r) { SET_REQ_ERROR(req, GetLastError()); uv_insert_pending_req(loop, (uv_req_t*)req); } out: handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } static void uv_tty_queue_read(uv_loop_t* loop, uv_tty_t* handle) { if (handle->flags & UV_HANDLE_TTY_RAW) { uv_tty_queue_read_raw(loop, handle); } else { uv_tty_queue_read_line(loop, handle); } } static const char* get_vt100_fn_key(DWORD code, char shift, char ctrl, size_t* len) { #define VK_CASE(vk, normal_str, shift_str, ctrl_str, shift_ctrl_str) \ case (vk): \ if (shift && ctrl) { \ *len = sizeof shift_ctrl_str; \ return "\033" shift_ctrl_str; \ } else if (shift) { \ *len = sizeof shift_str ; \ return "\033" shift_str; \ } else if (ctrl) { \ *len = sizeof ctrl_str; \ return "\033" ctrl_str; \ } else { \ *len = sizeof normal_str; \ return "\033" normal_str; \ } switch (code) { /* These mappings are the same as Cygwin's. Unmodified and alt-modified */ /* keypad keys comply with linux console, modifiers comply with xterm */ /* modifier usage. F1..f12 and shift-f1..f10 comply with linux console, */ /* f6..f12 with and without modifiers comply with rxvt. */ VK_CASE(VK_INSERT, "[2~", "[2;2~", "[2;5~", "[2;6~") VK_CASE(VK_END, "[4~", "[4;2~", "[4;5~", "[4;6~") VK_CASE(VK_DOWN, "[B", "[1;2B", "[1;5B", "[1;6B") VK_CASE(VK_NEXT, "[6~", "[6;2~", "[6;5~", "[6;6~") VK_CASE(VK_LEFT, "[D", "[1;2D", "[1;5D", "[1;6D") VK_CASE(VK_CLEAR, "[G", "[1;2G", "[1;5G", "[1;6G") VK_CASE(VK_RIGHT, "[C", "[1;2C", "[1;5C", "[1;6C") VK_CASE(VK_UP, "[A", "[1;2A", "[1;5A", "[1;6A") VK_CASE(VK_HOME, "[1~", "[1;2~", "[1;5~", "[1;6~") VK_CASE(VK_PRIOR, "[5~", "[5;2~", "[5;5~", "[5;6~") VK_CASE(VK_DELETE, "[3~", "[3;2~", "[3;5~", "[3;6~") VK_CASE(VK_NUMPAD0, "[2~", "[2;2~", "[2;5~", "[2;6~") VK_CASE(VK_NUMPAD1, "[4~", "[4;2~", "[4;5~", "[4;6~") VK_CASE(VK_NUMPAD2, "[B", "[1;2B", "[1;5B", "[1;6B") VK_CASE(VK_NUMPAD3, "[6~", "[6;2~", "[6;5~", "[6;6~") VK_CASE(VK_NUMPAD4, "[D", "[1;2D", "[1;5D", "[1;6D") VK_CASE(VK_NUMPAD5, "[G", "[1;2G", "[1;5G", "[1;6G") VK_CASE(VK_NUMPAD6, "[C", "[1;2C", "[1;5C", "[1;6C") VK_CASE(VK_NUMPAD7, "[A", "[1;2A", "[1;5A", "[1;6A") VK_CASE(VK_NUMPAD8, "[1~", "[1;2~", "[1;5~", "[1;6~") VK_CASE(VK_NUMPAD9, "[5~", "[5;2~", "[5;5~", "[5;6~") VK_CASE(VK_DECIMAL, "[3~", "[3;2~", "[3;5~", "[3;6~") VK_CASE(VK_F1, "[[A", "[23~", "[11^", "[23^" ) VK_CASE(VK_F2, "[[B", "[24~", "[12^", "[24^" ) VK_CASE(VK_F3, "[[C", "[25~", "[13^", "[25^" ) VK_CASE(VK_F4, "[[D", "[26~", "[14^", "[26^" ) VK_CASE(VK_F5, "[[E", "[28~", "[15^", "[28^" ) VK_CASE(VK_F6, "[17~", "[29~", "[17^", "[29^" ) VK_CASE(VK_F7, "[18~", "[31~", "[18^", "[31^" ) VK_CASE(VK_F8, "[19~", "[32~", "[19^", "[32^" ) VK_CASE(VK_F9, "[20~", "[33~", "[20^", "[33^" ) VK_CASE(VK_F10, "[21~", "[34~", "[21^", "[34^" ) VK_CASE(VK_F11, "[23~", "[23$", "[23^", "[23@" ) VK_CASE(VK_F12, "[24~", "[24$", "[24^", "[24@" ) default: *len = 0; return NULL; } #undef VK_CASE } void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { /* Shortcut for handle->last_input_record.Event.KeyEvent. */ #define KEV handle->last_input_record.Event.KeyEvent DWORD records_left, records_read; uv_buf_t buf; off_t buf_used; assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!(handle->flags & UV_HANDLE_READING) || !(handle->flags & UV_HANDLE_TTY_RAW)) { goto out; } if (!REQ_SUCCESS(req)) { /* An error occurred while waiting for the event. */ if ((handle->flags & UV_HANDLE_READING)) { handle->flags &= ~UV_HANDLE_READING; handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(GET_REQ_ERROR(req)), &uv_null_buf_); } goto out; } /* Fetch the number of events */ if (!GetNumberOfConsoleInputEvents(handle->handle, &records_left)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(GetLastError()), &uv_null_buf_); goto out; } /* Windows sends a lot of events that we're not interested in, so buf */ /* will be allocated on demand, when there's actually something to emit. */ buf = uv_null_buf_; buf_used = 0; while ((records_left > 0 || handle->last_key_len > 0) && (handle->flags & UV_HANDLE_READING)) { if (handle->last_key_len == 0) { /* Read the next input record */ if (!ReadConsoleInputW(handle->handle, &handle->last_input_record, 1, &records_read)) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GetLastError()), &buf); goto out; } records_left--; /* If the window was resized, recompute the virtual window size. This */ /* will trigger a SIGWINCH signal if the window size changed in an */ /* way that matters to libuv. */ if (handle->last_input_record.EventType == WINDOW_BUFFER_SIZE_EVENT) { CONSOLE_SCREEN_BUFFER_INFO info; EnterCriticalSection(&uv_tty_output_lock); if (uv_tty_output_handle != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(uv_tty_output_handle, &info)) { uv_tty_update_virtual_window(&info); } LeaveCriticalSection(&uv_tty_output_lock); continue; } /* Ignore other events that are not key or resize events. */ if (handle->last_input_record.EventType != KEY_EVENT) { continue; } /* Ignore keyup events, unless the left alt key was held and a valid */ /* unicode character was emitted. */ if (!KEV.bKeyDown && !(((KEV.dwControlKeyState & LEFT_ALT_PRESSED) || KEV.wVirtualKeyCode==VK_MENU) && KEV.uChar.UnicodeChar != 0)) { continue; } /* Ignore keypresses to numpad number keys if the left alt is held */ /* because the user is composing a character, or windows simulating */ /* this. */ if ((KEV.dwControlKeyState & LEFT_ALT_PRESSED) && !(KEV.dwControlKeyState & ENHANCED_KEY) && (KEV.wVirtualKeyCode == VK_INSERT || KEV.wVirtualKeyCode == VK_END || KEV.wVirtualKeyCode == VK_DOWN || KEV.wVirtualKeyCode == VK_NEXT || KEV.wVirtualKeyCode == VK_LEFT || KEV.wVirtualKeyCode == VK_CLEAR || KEV.wVirtualKeyCode == VK_RIGHT || KEV.wVirtualKeyCode == VK_HOME || KEV.wVirtualKeyCode == VK_UP || KEV.wVirtualKeyCode == VK_PRIOR || KEV.wVirtualKeyCode == VK_NUMPAD0 || KEV.wVirtualKeyCode == VK_NUMPAD1 || KEV.wVirtualKeyCode == VK_NUMPAD2 || KEV.wVirtualKeyCode == VK_NUMPAD3 || KEV.wVirtualKeyCode == VK_NUMPAD4 || KEV.wVirtualKeyCode == VK_NUMPAD5 || KEV.wVirtualKeyCode == VK_NUMPAD6 || KEV.wVirtualKeyCode == VK_NUMPAD7 || KEV.wVirtualKeyCode == VK_NUMPAD8 || KEV.wVirtualKeyCode == VK_NUMPAD9)) { continue; } if (KEV.uChar.UnicodeChar != 0) { int prefix_len, char_len; /* Character key pressed */ if (KEV.uChar.UnicodeChar >= 0xD800 && KEV.uChar.UnicodeChar < 0xDC00) { /* UTF-16 high surrogate */ handle->last_utf16_high_surrogate = KEV.uChar.UnicodeChar; continue; } /* Prefix with \u033 if alt was held, but alt was not used as part */ /* a compose sequence. */ if ((KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) && !(KEV.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && KEV.bKeyDown) { handle->last_key[0] = '\033'; prefix_len = 1; } else { prefix_len = 0; } if (KEV.uChar.UnicodeChar >= 0xDC00 && KEV.uChar.UnicodeChar < 0xE000) { /* UTF-16 surrogate pair */ WCHAR utf16_buffer[2] = { handle->last_utf16_high_surrogate, KEV.uChar.UnicodeChar}; char_len = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, 2, &handle->last_key[prefix_len], sizeof handle->last_key, NULL, NULL); } else { /* Single UTF-16 character */ char_len = WideCharToMultiByte(CP_UTF8, 0, &KEV.uChar.UnicodeChar, 1, &handle->last_key[prefix_len], sizeof handle->last_key, NULL, NULL); } /* Whatever happened, the last character wasn't a high surrogate. */ handle->last_utf16_high_surrogate = 0; /* If the utf16 character(s) couldn't be converted something must */ /* be wrong. */ if (!char_len) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GetLastError()), &buf); goto out; } handle->last_key_len = (unsigned char) (prefix_len + char_len); handle->last_key_offset = 0; continue; } else { /* Function key pressed */ const char* vt100; size_t prefix_len, vt100_len; vt100 = get_vt100_fn_key(KEV.wVirtualKeyCode, !!(KEV.dwControlKeyState & SHIFT_PRESSED), !!(KEV.dwControlKeyState & ( LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)), &vt100_len); /* If we were unable to map to a vt100 sequence, just ignore. */ if (!vt100) { continue; } /* Prefix with \x033 when the alt key was held. */ if (KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) { handle->last_key[0] = '\033'; prefix_len = 1; } else { prefix_len = 0; } /* Copy the vt100 sequence to the handle buffer. */ assert(prefix_len + vt100_len < sizeof handle->last_key); memcpy(&handle->last_key[prefix_len], vt100, vt100_len); handle->last_key_len = (unsigned char) (prefix_len + vt100_len); handle->last_key_offset = 0; continue; } } else { /* Copy any bytes left from the last keypress to the user buffer. */ if (handle->last_key_offset < handle->last_key_len) { /* Allocate a buffer if needed */ if (buf_used == 0) { handle->alloc_cb((uv_handle_t*) handle, 1024, &buf); if (buf.len == 0) { handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); goto out; } assert(buf.base != NULL); } buf.base[buf_used++] = handle->last_key[handle->last_key_offset++]; /* If the buffer is full, emit it */ if ((size_t) buf_used == buf.len) { handle->read_cb((uv_stream_t*) handle, buf_used, &buf); buf = uv_null_buf_; buf_used = 0; } continue; } /* Apply dwRepeat from the last input record. */ if (--KEV.wRepeatCount > 0) { handle->last_key_offset = 0; continue; } handle->last_key_len = 0; continue; } } /* Send the buffer back to the user */ if (buf_used > 0) { handle->read_cb((uv_stream_t*) handle, buf_used, &buf); } out: /* Wait for more input events. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tty_queue_read(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); #undef KEV } void uv_process_tty_read_line_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { uv_buf_t buf; assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); buf = handle->read_line_buffer; handle->flags &= ~UV_HANDLE_READ_PENDING; handle->read_line_buffer = uv_null_buf_; if (!REQ_SUCCESS(req)) { /* Read was not successful */ if ((handle->flags & UV_HANDLE_READING) && handle->read_line_handle != NULL) { /* Real error */ handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(loop, handle); handle->read_cb((uv_stream_t*) handle, uv_translate_sys_error(GET_REQ_ERROR(req)), &buf); } else { /* The read was cancelled, or whatever we don't care */ handle->read_cb((uv_stream_t*) handle, 0, &buf); } } else { /* Read successful */ /* TODO: read unicode, convert to utf-8 */ DWORD bytes = req->overlapped.InternalHigh; handle->read_cb((uv_stream_t*) handle, bytes, &buf); } /* Wait for more input events. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_tty_queue_read(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* req) { assert(handle->type == UV_TTY); assert(handle->flags & UV_HANDLE_TTY_READABLE); /* If the read_line_buffer member is zero, it must have been an raw read. */ /* Otherwise it was a line-buffered read. */ /* FIXME: This is quite obscure. Use a flag or something. */ if (handle->read_line_buffer.len == 0) { uv_process_tty_read_raw_req(loop, handle, req); } else { uv_process_tty_read_line_req(loop, handle, req); } } int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) { uv_loop_t* loop = handle->loop; if (!(handle->flags & UV_HANDLE_TTY_READABLE)) { return ERROR_INVALID_PARAMETER; } handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); handle->read_cb = read_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a */ /* read request pending. */ if (handle->flags & UV_HANDLE_READ_PENDING) { return 0; } /* Maybe the user stopped reading half-way while processing key events. */ /* Short-circuit if this could be the case. */ if (handle->last_key_len > 0) { SET_REQ_SUCCESS(&handle->read_req); uv_insert_pending_req(handle->loop, (uv_req_t*) &handle->read_req); return 0; } uv_tty_queue_read(loop, handle); return 0; } int uv_tty_read_stop(uv_tty_t* handle) { handle->flags &= ~UV_HANDLE_READING; DECREASE_ACTIVE_COUNT(handle->loop, handle); /* Cancel raw read */ if ((handle->flags & UV_HANDLE_READ_PENDING) && (handle->flags & UV_HANDLE_TTY_RAW)) { /* Write some bullshit event to force the console wait to return. */ INPUT_RECORD record; DWORD written; memset(&record, 0, sizeof record); if (!WriteConsoleInputW(handle->handle, &record, 1, &written)) { return GetLastError(); } } /* Cancel line-buffered read */ if (handle->read_line_handle != NULL) { /* Closing this handle will cancel the ReadConsole operation */ CloseHandle(handle->read_line_handle); handle->read_line_handle = NULL; } return 0; } static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info) { int old_virtual_width = uv_tty_virtual_width; int old_virtual_height = uv_tty_virtual_height; uv_tty_virtual_width = info->dwSize.X; uv_tty_virtual_height = info->srWindow.Bottom - info->srWindow.Top + 1; /* Recompute virtual window offset row. */ if (uv_tty_virtual_offset == -1) { uv_tty_virtual_offset = info->dwCursorPosition.Y; } else if (uv_tty_virtual_offset < info->dwCursorPosition.Y - uv_tty_virtual_height + 1) { /* If suddenly find the cursor outside of the virtual window, it must */ /* have somehow scrolled. Update the virtual window offset. */ uv_tty_virtual_offset = info->dwCursorPosition.Y - uv_tty_virtual_height + 1; } if (uv_tty_virtual_offset + uv_tty_virtual_height > info->dwSize.Y) { uv_tty_virtual_offset = info->dwSize.Y - uv_tty_virtual_height; } if (uv_tty_virtual_offset < 0) { uv_tty_virtual_offset = 0; } /* If the virtual window size changed, emit a SIGWINCH signal. Don't emit */ /* if this was the first time the virtual window size was computed. */ if (old_virtual_width != -1 && old_virtual_height != -1 && (uv_tty_virtual_width != old_virtual_width || uv_tty_virtual_height != old_virtual_height)) { uv__signal_dispatch(SIGWINCH); } } static COORD uv_tty_make_real_coord(uv_tty_t* handle, CONSOLE_SCREEN_BUFFER_INFO* info, int x, unsigned char x_relative, int y, unsigned char y_relative) { COORD result; uv_tty_update_virtual_window(info); /* Adjust y position */ if (y_relative) { y = info->dwCursorPosition.Y + y; } else { y = uv_tty_virtual_offset + y; } /* Clip y to virtual client rectangle */ if (y < uv_tty_virtual_offset) { y = uv_tty_virtual_offset; } else if (y >= uv_tty_virtual_offset + uv_tty_virtual_height) { y = uv_tty_virtual_offset + uv_tty_virtual_height - 1; } /* Adjust x */ if (x_relative) { x = info->dwCursorPosition.X + x; } /* Clip x */ if (x < 0) { x = 0; } else if (x >= uv_tty_virtual_width) { x = uv_tty_virtual_width - 1; } result.X = (unsigned short) x; result.Y = (unsigned short) y; return result; } static int uv_tty_emit_text(uv_tty_t* handle, WCHAR buffer[], DWORD length, DWORD* error) { DWORD written; if (*error != ERROR_SUCCESS) { return -1; } if (!WriteConsoleW(handle->handle, (void*) buffer, length, &written, NULL)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_move_caret(uv_tty_t* handle, int x, unsigned char x_relative, int y, unsigned char y_relative, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; COORD pos; if (*error != ERROR_SUCCESS) { return -1; } retry: if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); } pos = uv_tty_make_real_coord(handle, &info, x, x_relative, y, y_relative); if (!SetConsoleCursorPosition(handle->handle, pos)) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } return 0; } static int uv_tty_reset(uv_tty_t* handle, DWORD* error) { const COORD origin = {0, 0}; const WORD char_attrs = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; CONSOLE_SCREEN_BUFFER_INFO info; DWORD count, written; if (*error != ERROR_SUCCESS) { return -1; } /* Reset original text attributes. */ if (!SetConsoleTextAttribute(handle->handle, char_attrs)) { *error = GetLastError(); return -1; } /* Move the cursor position to (0, 0). */ if (!SetConsoleCursorPosition(handle->handle, origin)) { *error = GetLastError(); return -1; } /* Clear the screen buffer. */ retry: if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } count = info.dwSize.X * info.dwSize.Y; if (!(FillConsoleOutputCharacterW(handle->handle, L'\x20', count, origin, &written) && FillConsoleOutputAttribute(handle->handle, char_attrs, written, origin, &written))) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } /* Move the virtual window up to the top. */ uv_tty_virtual_offset = 0; uv_tty_update_virtual_window(&info); return 0; } static int uv_tty_clear(uv_tty_t* handle, int dir, char entire_screen, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; COORD start, end; DWORD count, written; int x1, x2, y1, y2; int x1r, x2r, y1r, y2r; if (*error != ERROR_SUCCESS) { return -1; } if (dir == 0) { /* Clear from current position */ x1 = 0; x1r = 1; } else { /* Clear from column 0 */ x1 = 0; x1r = 0; } if (dir == 1) { /* Clear to current position */ x2 = 0; x2r = 1; } else { /* Clear to end of row. We pretend the console is 65536 characters wide, */ /* uv_tty_make_real_coord will clip it to the actual console width. */ x2 = 0xffff; x2r = 0; } if (!entire_screen) { /* Stay on our own row */ y1 = y2 = 0; y1r = y2r = 1; } else { /* Apply columns direction to row */ y1 = x1; y1r = x1r; y2 = x2; y2r = x2r; } retry: if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } start = uv_tty_make_real_coord(handle, &info, x1, x1r, y1, y1r); end = uv_tty_make_real_coord(handle, &info, x2, x2r, y2, y2r); count = (end.Y * info.dwSize.X + end.X) - (start.Y * info.dwSize.X + start.X) + 1; if (!(FillConsoleOutputCharacterW(handle->handle, L'\x20', count, start, &written) && FillConsoleOutputAttribute(handle->handle, info.wAttributes, written, start, &written))) { if (GetLastError() == ERROR_INVALID_PARAMETER) { /* The console may be resized - retry */ goto retry; } else { *error = GetLastError(); return -1; } } return 0; } #define FLIP_FGBG \ do { \ WORD fg = info.wAttributes & 0xF; \ WORD bg = info.wAttributes & 0xF0; \ info.wAttributes &= 0xFF00; \ info.wAttributes |= fg << 4; \ info.wAttributes |= bg >> 4; \ } while (0) static int uv_tty_set_style(uv_tty_t* handle, DWORD* error) { unsigned short argc = handle->ansi_csi_argc; unsigned short* argv = handle->ansi_csi_argv; int i; CONSOLE_SCREEN_BUFFER_INFO info; char fg_color = -1, bg_color = -1; char fg_bright = -1, bg_bright = -1; char inverse = -1; if (argc == 0) { /* Reset mode */ fg_color = 7; bg_color = 0; fg_bright = 0; bg_bright = 0; inverse = 0; } for (i = 0; i < argc; i++) { short arg = argv[i]; if (arg == 0) { /* Reset mode */ fg_color = 7; bg_color = 0; fg_bright = 0; bg_bright = 0; inverse = 0; } else if (arg == 1) { /* Foreground bright on */ fg_bright = 1; } else if (arg == 2) { /* Both bright off */ fg_bright = 0; bg_bright = 0; } else if (arg == 5) { /* Background bright on */ bg_bright = 1; } else if (arg == 7) { /* Inverse: on */ inverse = 1; } else if (arg == 21 || arg == 22) { /* Foreground bright off */ fg_bright = 0; } else if (arg == 25) { /* Background bright off */ bg_bright = 0; } else if (arg == 27) { /* Inverse: off */ inverse = 0; } else if (arg >= 30 && arg <= 37) { /* Set foreground color */ fg_color = arg - 30; } else if (arg == 39) { /* Default text color */ fg_color = 7; fg_bright = 0; } else if (arg >= 40 && arg <= 47) { /* Set background color */ bg_color = arg - 40; } else if (arg == 49) { /* Default background color */ bg_color = 0; bg_bright = 0; } else if (arg >= 90 && arg <= 97) { /* Set bold foreground color */ fg_bright = 1; fg_color = arg - 90; } else if (arg >= 100 && arg <= 107) { /* Set bold background color */ bg_bright = 1; bg_color = arg - 100; } } if (fg_color == -1 && bg_color == -1 && fg_bright == -1 && bg_bright == -1 && inverse == -1) { /* Nothing changed */ return 0; } if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { FLIP_FGBG; } if (fg_color != -1) { info.wAttributes &= ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if (fg_color & 1) info.wAttributes |= FOREGROUND_RED; if (fg_color & 2) info.wAttributes |= FOREGROUND_GREEN; if (fg_color & 4) info.wAttributes |= FOREGROUND_BLUE; } if (fg_bright != -1) { if (fg_bright) { info.wAttributes |= FOREGROUND_INTENSITY; } else { info.wAttributes &= ~FOREGROUND_INTENSITY; } } if (bg_color != -1) { info.wAttributes &= ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); if (bg_color & 1) info.wAttributes |= BACKGROUND_RED; if (bg_color & 2) info.wAttributes |= BACKGROUND_GREEN; if (bg_color & 4) info.wAttributes |= BACKGROUND_BLUE; } if (bg_bright != -1) { if (bg_bright) { info.wAttributes |= BACKGROUND_INTENSITY; } else { info.wAttributes &= ~BACKGROUND_INTENSITY; } } if (inverse != -1) { if (inverse) { info.wAttributes |= COMMON_LVB_REVERSE_VIDEO; } else { info.wAttributes &= ~COMMON_LVB_REVERSE_VIDEO; } } if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { FLIP_FGBG; } if (!SetConsoleTextAttribute(handle->handle, info.wAttributes)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_save_state(uv_tty_t* handle, unsigned char save_attributes, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; if (*error != ERROR_SUCCESS) { return -1; } if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } uv_tty_update_virtual_window(&info); handle->saved_position.X = info.dwCursorPosition.X; handle->saved_position.Y = info.dwCursorPosition.Y - uv_tty_virtual_offset; handle->flags |= UV_HANDLE_TTY_SAVED_POSITION; if (save_attributes) { handle->saved_attributes = info.wAttributes & (FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); handle->flags |= UV_HANDLE_TTY_SAVED_ATTRIBUTES; } return 0; } static int uv_tty_restore_state(uv_tty_t* handle, unsigned char restore_attributes, DWORD* error) { CONSOLE_SCREEN_BUFFER_INFO info; WORD new_attributes; if (*error != ERROR_SUCCESS) { return -1; } if (handle->flags & UV_HANDLE_TTY_SAVED_POSITION) { if (uv_tty_move_caret(handle, handle->saved_position.X, 0, handle->saved_position.Y, 0, error) != 0) { return -1; } } if (restore_attributes && (handle->flags & UV_HANDLE_TTY_SAVED_ATTRIBUTES)) { if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { *error = GetLastError(); return -1; } new_attributes = info.wAttributes; new_attributes &= ~(FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); new_attributes |= handle->saved_attributes; if (!SetConsoleTextAttribute(handle->handle, new_attributes)) { *error = GetLastError(); return -1; } } return 0; } static int uv_tty_set_cursor_visibility(uv_tty_t* handle, BOOL visible, DWORD* error) { CONSOLE_CURSOR_INFO cursor_info; if (!GetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } cursor_info.bVisible = visible; if (!SetConsoleCursorInfo(handle->handle, &cursor_info)) { *error = GetLastError(); return -1; } return 0; } static int uv_tty_write_bufs(uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, DWORD* error) { /* We can only write 8k characters at a time. Windows can't handle */ /* much more characters in a single console write anyway. */ WCHAR utf16_buf[8192]; DWORD utf16_buf_used = 0; unsigned int i; #define FLUSH_TEXT() \ do { \ if (utf16_buf_used > 0) { \ uv_tty_emit_text(handle, utf16_buf, utf16_buf_used, error); \ utf16_buf_used = 0; \ } \ } while (0) /* Cache for fast access */ unsigned char utf8_bytes_left = handle->utf8_bytes_left; unsigned int utf8_codepoint = handle->utf8_codepoint; unsigned char previous_eol = handle->previous_eol; unsigned char ansi_parser_state = handle->ansi_parser_state; /* Store the error here. If we encounter an error, stop trying to do i/o */ /* but keep parsing the buffer so we leave the parser in a consistent */ /* state. */ *error = ERROR_SUCCESS; EnterCriticalSection(&uv_tty_output_lock); for (i = 0; i < nbufs; i++) { uv_buf_t buf = bufs[i]; unsigned int j; for (j = 0; j < buf.len; j++) { unsigned char c = buf.base[j]; /* Run the character through the utf8 decoder We happily accept non */ /* shortest form encodings and invalid code points - there's no real */ /* harm that can be done. */ if (utf8_bytes_left == 0) { /* Read utf-8 start byte */ DWORD first_zero_bit; unsigned char not_c = ~c; #ifdef _MSC_VER /* msvc */ if (_BitScanReverse(&first_zero_bit, not_c)) { #else /* assume gcc */ if (c != 0) { first_zero_bit = (sizeof(int) * 8) - 1 - __builtin_clz(not_c); #endif if (first_zero_bit == 7) { /* Ascii - pass right through */ utf8_codepoint = (unsigned int) c; } else if (first_zero_bit <= 5) { /* Multibyte sequence */ utf8_codepoint = (0xff >> (8 - first_zero_bit)) & c; utf8_bytes_left = (char) (6 - first_zero_bit); } else { /* Invalid continuation */ utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } } else { /* 0xff -- invalid */ utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } } else if ((c & 0xc0) == 0x80) { /* Valid continuation of utf-8 multibyte sequence */ utf8_bytes_left--; utf8_codepoint <<= 6; utf8_codepoint |= ((unsigned int) c & 0x3f); } else { /* Start byte where continuation was expected. */ utf8_bytes_left = 0; utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; /* Patch buf offset so this character will be parsed again as a */ /* start byte. */ j--; } /* Maybe we need to parse more bytes to find a character. */ if (utf8_bytes_left != 0) { continue; } /* Parse vt100/ansi escape codes */ if (ansi_parser_state == ANSI_NORMAL) { switch (utf8_codepoint) { case '\033': ansi_parser_state = ANSI_ESCAPE_SEEN; continue; case 0233: ansi_parser_state = ANSI_CSI; handle->ansi_csi_argc = 0; continue; } } else if (ansi_parser_state == ANSI_ESCAPE_SEEN) { switch (utf8_codepoint) { case '[': ansi_parser_state = ANSI_CSI; handle->ansi_csi_argc = 0; continue; case '^': case '_': case 'P': case ']': /* Not supported, but we'll have to parse until we see a stop */ /* code, e.g. ESC \ or BEL. */ ansi_parser_state = ANSI_ST_CONTROL; continue; case '\033': /* Ignore double escape. */ continue; case 'c': /* Full console reset. */ FLUSH_TEXT(); uv_tty_reset(handle, error); ansi_parser_state = ANSI_NORMAL; continue; case '7': /* Save the cursor position and text attributes. */ FLUSH_TEXT(); uv_tty_save_state(handle, 1, error); ansi_parser_state = ANSI_NORMAL; continue; case '8': /* Restore the cursor position and text attributes */ FLUSH_TEXT(); uv_tty_restore_state(handle, 1, error); ansi_parser_state = ANSI_NORMAL; continue; default: if (utf8_codepoint >= '@' && utf8_codepoint <= '_') { /* Single-char control. */ ansi_parser_state = ANSI_NORMAL; continue; } else { /* Invalid - proceed as normal, */ ansi_parser_state = ANSI_NORMAL; } } } else if (ansi_parser_state & ANSI_CSI) { if (!(ansi_parser_state & ANSI_IGNORE)) { if (utf8_codepoint >= '0' && utf8_codepoint <= '9') { /* Parsing a numerical argument */ if (!(ansi_parser_state & ANSI_IN_ARG)) { /* We were not currently parsing a number */ /* Check for too many arguments */ if (handle->ansi_csi_argc >= ARRAY_SIZE(handle->ansi_csi_argv)) { ansi_parser_state |= ANSI_IGNORE; continue; } ansi_parser_state |= ANSI_IN_ARG; handle->ansi_csi_argc++; handle->ansi_csi_argv[handle->ansi_csi_argc - 1] = (unsigned short) utf8_codepoint - '0'; continue; } else { /* We were already parsing a number. Parse next digit. */ uint32_t value = 10 * handle->ansi_csi_argv[handle->ansi_csi_argc - 1]; /* Check for overflow. */ if (value > UINT16_MAX) { ansi_parser_state |= ANSI_IGNORE; continue; } handle->ansi_csi_argv[handle->ansi_csi_argc - 1] = (unsigned short) value + (utf8_codepoint - '0'); continue; } } else if (utf8_codepoint == ';') { /* Denotes the end of an argument. */ if (ansi_parser_state & ANSI_IN_ARG) { ansi_parser_state &= ~ANSI_IN_ARG; continue; } else { /* If ANSI_IN_ARG is not set, add another argument and */ /* default it to 0. */ /* Check for too many arguments */ if (handle->ansi_csi_argc >= ARRAY_SIZE(handle->ansi_csi_argv)) { ansi_parser_state |= ANSI_IGNORE; continue; } handle->ansi_csi_argc++; handle->ansi_csi_argv[handle->ansi_csi_argc - 1] = 0; continue; } } else if (utf8_codepoint == '?' && !(ansi_parser_state & ANSI_IN_ARG) && handle->ansi_csi_argc == 0) { /* Ignores '?' if it is the first character after CSI[ */ /* This is an extension character from the VT100 codeset */ /* that is supported and used by most ANSI terminals today. */ continue; } else if (utf8_codepoint >= '@' && utf8_codepoint <= '~' && (handle->ansi_csi_argc > 0 || utf8_codepoint != '[')) { int x, y, d; /* Command byte */ switch (utf8_codepoint) { case 'A': /* cursor up */ FLUSH_TEXT(); y = -(handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, 0, 1, y, 1, error); break; case 'B': /* cursor down */ FLUSH_TEXT(); y = handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, 0, 1, y, 1, error); break; case 'C': /* cursor forward */ FLUSH_TEXT(); x = handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, x, 1, 0, 1, error); break; case 'D': /* cursor back */ FLUSH_TEXT(); x = -(handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, x, 1, 0, 1, error); break; case 'E': /* cursor next line */ FLUSH_TEXT(); y = handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1; uv_tty_move_caret(handle, 0, 0, y, 1, error); break; case 'F': /* cursor previous line */ FLUSH_TEXT(); y = -(handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 1); uv_tty_move_caret(handle, 0, 0, y, 1, error); break; case 'G': /* cursor horizontal move absolute */ FLUSH_TEXT(); x = (handle->ansi_csi_argc >= 1 && handle->ansi_csi_argv[0]) ? handle->ansi_csi_argv[0] - 1 : 0; uv_tty_move_caret(handle, x, 0, 0, 1, error); break; case 'H': case 'f': /* cursor move absolute */ FLUSH_TEXT(); y = (handle->ansi_csi_argc >= 1 && handle->ansi_csi_argv[0]) ? handle->ansi_csi_argv[0] - 1 : 0; x = (handle->ansi_csi_argc >= 2 && handle->ansi_csi_argv[1]) ? handle->ansi_csi_argv[1] - 1 : 0; uv_tty_move_caret(handle, x, 0, y, 0, error); break; case 'J': /* Erase screen */ FLUSH_TEXT(); d = handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 0; if (d >= 0 && d <= 2) { uv_tty_clear(handle, d, 1, error); } break; case 'K': /* Erase line */ FLUSH_TEXT(); d = handle->ansi_csi_argc ? handle->ansi_csi_argv[0] : 0; if (d >= 0 && d <= 2) { uv_tty_clear(handle, d, 0, error); } break; case 'm': /* Set style */ FLUSH_TEXT(); uv_tty_set_style(handle, error); break; case 's': /* Save the cursor position. */ FLUSH_TEXT(); uv_tty_save_state(handle, 0, error); break; case 'u': /* Restore the cursor position */ FLUSH_TEXT(); uv_tty_restore_state(handle, 0, error); break; case 'l': /* Hide the cursor */ if (handle->ansi_csi_argc == 1 && handle->ansi_csi_argv[0] == 25) { FLUSH_TEXT(); uv_tty_set_cursor_visibility(handle, 0, error); } break; case 'h': /* Show the cursor */ if (handle->ansi_csi_argc == 1 && handle->ansi_csi_argv[0] == 25) { FLUSH_TEXT(); uv_tty_set_cursor_visibility(handle, 1, error); } break; } /* Sequence ended - go back to normal state. */ ansi_parser_state = ANSI_NORMAL; continue; } else { /* We don't support commands that use private mode characters or */ /* intermediaries. Ignore the rest of the sequence. */ ansi_parser_state |= ANSI_IGNORE; continue; } } else { /* We're ignoring this command. Stop only on command character. */ if (utf8_codepoint >= '@' && utf8_codepoint <= '~') { ansi_parser_state = ANSI_NORMAL; } continue; } } else if (ansi_parser_state & ANSI_ST_CONTROL) { /* Unsupported control code */ /* Ignore everything until we see BEL or ESC \ */ if (ansi_parser_state & ANSI_IN_STRING) { if (!(ansi_parser_state & ANSI_BACKSLASH_SEEN)) { if (utf8_codepoint == '"') { ansi_parser_state &= ~ANSI_IN_STRING; } else if (utf8_codepoint == '\\') { ansi_parser_state |= ANSI_BACKSLASH_SEEN; } } else { ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; } } else { if (utf8_codepoint == '\007' || (utf8_codepoint == '\\' && (ansi_parser_state & ANSI_ESCAPE_SEEN))) { /* End of sequence */ ansi_parser_state = ANSI_NORMAL; } else if (utf8_codepoint == '\033') { /* Escape character */ ansi_parser_state |= ANSI_ESCAPE_SEEN; } else if (utf8_codepoint == '"') { /* String starting */ ansi_parser_state |= ANSI_IN_STRING; ansi_parser_state &= ~ANSI_ESCAPE_SEEN; ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; } else { ansi_parser_state &= ~ANSI_ESCAPE_SEEN; } } continue; } else { /* Inconsistent state */ abort(); } /* We wouldn't mind emitting utf-16 surrogate pairs. Too bad, the */ /* windows console doesn't really support UTF-16, so just emit the */ /* replacement character. */ if (utf8_codepoint > 0xffff) { utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; } if (utf8_codepoint == 0x0a || utf8_codepoint == 0x0d) { /* EOL conversion - emit \r\n, when we see either \r or \n. */ /* If a \n immediately follows a \r or vice versa, ignore it. */ if (previous_eol == 0 || utf8_codepoint == previous_eol) { /* If there's no room in the utf16 buf, flush it first. */ if (2 > ARRAY_SIZE(utf16_buf) - utf16_buf_used) { uv_tty_emit_text(handle, utf16_buf, utf16_buf_used, error); utf16_buf_used = 0; } utf16_buf[utf16_buf_used++] = L'\r'; utf16_buf[utf16_buf_used++] = L'\n'; previous_eol = (char) utf8_codepoint; } else { /* Ignore this newline, but don't ignore later ones. */ previous_eol = 0; } } else if (utf8_codepoint <= 0xffff) { /* Encode character into utf-16 buffer. */ /* If there's no room in the utf16 buf, flush it first. */ if (1 > ARRAY_SIZE(utf16_buf) - utf16_buf_used) { uv_tty_emit_text(handle, utf16_buf, utf16_buf_used, error); utf16_buf_used = 0; } utf16_buf[utf16_buf_used++] = (WCHAR) utf8_codepoint; previous_eol = 0; } } } /* Flush remaining characters */ FLUSH_TEXT(); /* Copy cached values back to struct. */ handle->utf8_bytes_left = utf8_bytes_left; handle->utf8_codepoint = utf8_codepoint; handle->previous_eol = previous_eol; handle->ansi_parser_state = ansi_parser_state; LeaveCriticalSection(&uv_tty_output_lock); if (*error == STATUS_SUCCESS) { return 0; } else { return -1; } #undef FLUSH_TEXT } int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb) { DWORD error; uv_req_init(loop, (uv_req_t*) req); req->type = UV_WRITE; req->handle = (uv_stream_t*) handle; req->cb = cb; handle->reqs_pending++; handle->write_reqs_pending++; REGISTER_HANDLE_REQ(loop, handle, req); req->queued_bytes = 0; if (!uv_tty_write_bufs(handle, bufs, nbufs, &error)) { SET_REQ_SUCCESS(req); } else { SET_REQ_ERROR(req, error); } uv_insert_pending_req(loop, (uv_req_t*) req); return 0; } void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, uv_write_t* req) { int err; handle->write_queue_size -= req->queued_bytes; UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = GET_REQ_ERROR(req); req->cb(req, uv_translate_sys_error(err)); } handle->write_reqs_pending--; if (handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*)handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_tty_close(uv_tty_t* handle) { CloseHandle(handle->handle); if (handle->flags & UV_HANDLE_READING) uv_tty_read_stop(handle); handle->handle = INVALID_HANDLE_VALUE; handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); uv__handle_closing(handle); if (handle->reqs_pending == 0) { uv_want_endgame(handle->loop, (uv_handle_t*) handle); } } void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle) { if (!(handle->flags & UV_HANDLE_TTY_READABLE) && handle->shutdown_req != NULL && handle->write_reqs_pending == 0) { UNREGISTER_HANDLE_REQ(loop, handle, handle->shutdown_req); /* TTY shutdown is really just a no-op */ if (handle->shutdown_req->cb) { if (handle->flags & UV__HANDLE_CLOSING) { handle->shutdown_req->cb(handle->shutdown_req, UV_ECANCELED); } else { handle->shutdown_req->cb(handle->shutdown_req, 0); } } handle->shutdown_req = NULL; DECREASE_PENDING_REQ_COUNT(handle); return; } if (handle->flags & UV__HANDLE_CLOSING && handle->reqs_pending == 0) { /* The console handle duplicate used for line reading should be destroyed */ /* by uv_tty_read_stop. */ assert(!(handle->flags & UV_HANDLE_TTY_READABLE) || handle->read_line_handle == NULL); /* The wait handle used for raw reading should be unregistered when the */ /* wait callback runs. */ assert(!(handle->flags & UV_HANDLE_TTY_READABLE) || handle->read_raw_wait == NULL); assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } /* TODO: remove me */ void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, uv_req_t* raw_req) { abort(); } /* TODO: remove me */ void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, uv_connect_t* req) { abort(); } int uv_tty_reset_mode(void) { /* Not necessary to do anything. */ return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/udp.c0000644000175000017500000006564612456307253017311 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" #include "handle-inl.h" #include "stream-inl.h" #include "req-inl.h" /* * Threshold of active udp streams for which to preallocate udp read buffers. */ const unsigned int uv_active_udp_streams_threshold = 0; /* A zero-size buffer for use by uv_udp_read */ static char uv_zero_[] = ""; int uv_udp_getsockname(const uv_udp_t* handle, struct sockaddr* name, int* namelen) { int result; if (!(handle->flags & UV_HANDLE_BOUND)) { return UV_EINVAL; } result = getsockname(handle->socket, name, namelen); if (result != 0) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket, int family) { DWORD yes = 1; WSAPROTOCOL_INFOW info; int opt_len; assert(handle->socket == INVALID_SOCKET); /* Set the socket to nonblocking mode */ if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { return WSAGetLastError(); } /* Make the socket non-inheritable */ if (!SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0)) { return GetLastError(); } /* Associate it with the I/O completion port. */ /* Use uv_handle_t pointer as completion key. */ if (CreateIoCompletionPort((HANDLE)socket, loop->iocp, (ULONG_PTR)socket, 0) == NULL) { return GetLastError(); } if (pSetFileCompletionNotificationModes) { /* All know windowses that support SetFileCompletionNotificationModes */ /* have a bug that makes it impossible to use this function in */ /* conjunction with datagram sockets. We can work around that but only */ /* if the user is using the default UDP driver (AFD) and has no other */ /* LSPs stacked on top. Here we check whether that is the case. */ opt_len = (int) sizeof info; if (getsockopt(socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &info, &opt_len) == SOCKET_ERROR) { return GetLastError(); } if (info.ProtocolChain.ChainLen == 1) { if (pSetFileCompletionNotificationModes((HANDLE)socket, FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; handle->func_wsarecv = uv_wsarecv_workaround; handle->func_wsarecvfrom = uv_wsarecvfrom_workaround; } else if (GetLastError() != ERROR_INVALID_FUNCTION) { return GetLastError(); } } } handle->socket = socket; if (family == AF_INET6) { handle->flags |= UV_HANDLE_IPV6; } else { assert(!(handle->flags & UV_HANDLE_IPV6)); } return 0; } int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP); handle->socket = INVALID_SOCKET; handle->reqs_pending = 0; handle->activecnt = 0; handle->func_wsarecv = WSARecv; handle->func_wsarecvfrom = WSARecvFrom; handle->send_queue_size = 0; handle->send_queue_count = 0; uv_req_init(loop, (uv_req_t*) &(handle->recv_req)); handle->recv_req.type = UV_UDP_RECV; handle->recv_req.data = handle; return 0; } void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) { uv_udp_recv_stop(handle); closesocket(handle->socket); handle->socket = INVALID_SOCKET; uv__handle_closing(handle); if (handle->reqs_pending == 0) { uv_want_endgame(loop, (uv_handle_t*) handle); } } void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) { if (handle->flags & UV__HANDLE_CLOSING && handle->reqs_pending == 0) { assert(!(handle->flags & UV_HANDLE_CLOSED)); uv__handle_close(handle); } } static int uv_udp_maybe_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int r; int err; DWORD no = 0; if (handle->flags & UV_HANDLE_BOUND) return 0; if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) { /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */ return ERROR_INVALID_PARAMETER; } if (handle->socket == INVALID_SOCKET) { SOCKET sock = socket(addr->sa_family, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { return WSAGetLastError(); } err = uv_udp_set_socket(handle->loop, handle, sock, addr->sa_family); if (err) { closesocket(sock); return err; } if (flags & UV_UDP_REUSEADDR) { DWORD yes = 1; /* Set SO_REUSEADDR on the socket. */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &yes, sizeof yes) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sock); return err; } } if (addr->sa_family == AF_INET6) handle->flags |= UV_HANDLE_IPV6; } if (addr->sa_family == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) { /* On windows IPV6ONLY is on by default. */ /* If the user doesn't specify it libuv turns it off. */ /* TODO: how to handle errors? This may fail if there is no ipv4 stack */ /* available, or when run on XP/2003 which have no support for dualstack */ /* sockets. For now we're silently ignoring the error. */ setsockopt(handle->socket, IPPROTO_IPV6, IPV6_V6ONLY, (char*) &no, sizeof no); } r = bind(handle->socket, addr, addrlen); if (r == SOCKET_ERROR) { return WSAGetLastError(); } handle->flags |= UV_HANDLE_BOUND; return 0; } static void uv_udp_queue_recv(uv_loop_t* loop, uv_udp_t* handle) { uv_req_t* req; uv_buf_t buf; DWORD bytes, flags; int result; assert(handle->flags & UV_HANDLE_READING); assert(!(handle->flags & UV_HANDLE_READ_PENDING)); req = &handle->recv_req; memset(&req->overlapped, 0, sizeof(req->overlapped)); /* * Preallocate a read buffer if the number of active streams is below * the threshold. */ if (loop->active_udp_streams < uv_active_udp_streams_threshold) { handle->flags &= ~UV_HANDLE_ZERO_READ; handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->recv_buffer); if (handle->recv_buffer.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &handle->recv_buffer, NULL, 0); return; } assert(handle->recv_buffer.base != NULL); buf = handle->recv_buffer; memset(&handle->recv_from, 0, sizeof handle->recv_from); handle->recv_from_len = sizeof handle->recv_from; flags = 0; result = handle->func_wsarecvfrom(handle->socket, (WSABUF*) &buf, 1, &bytes, &flags, (struct sockaddr*) &handle->recv_from, &handle->recv_from_len, &req->overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); handle->reqs_pending++; } } else { handle->flags |= UV_HANDLE_ZERO_READ; buf.base = (char*) uv_zero_; buf.len = 0; flags = MSG_PEEK; result = handle->func_wsarecv(handle->socket, (WSABUF*) &buf, 1, &bytes, &flags, &req->overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Process the req without IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; req->overlapped.InternalHigh = bytes; handle->reqs_pending++; uv_insert_pending_req(loop, req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* The req will be processed with IOCP. */ handle->flags |= UV_HANDLE_READ_PENDING; handle->reqs_pending++; } else { /* Make this req pending reporting an error. */ SET_REQ_ERROR(req, WSAGetLastError()); uv_insert_pending_req(loop, req); handle->reqs_pending++; } } } int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb) { uv_loop_t* loop = handle->loop; int err; if (handle->flags & UV_HANDLE_READING) { return WSAEALREADY; } err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), 0); if (err) return err; handle->flags |= UV_HANDLE_READING; INCREASE_ACTIVE_COUNT(loop, handle); loop->active_udp_streams++; handle->recv_cb = recv_cb; handle->alloc_cb = alloc_cb; /* If reading was stopped and then started again, there could still be a */ /* recv request pending. */ if (!(handle->flags & UV_HANDLE_READ_PENDING)) uv_udp_queue_recv(loop, handle); return 0; } int uv__udp_recv_stop(uv_udp_t* handle) { if (handle->flags & UV_HANDLE_READING) { handle->flags &= ~UV_HANDLE_READING; handle->loop->active_udp_streams--; DECREASE_ACTIVE_COUNT(loop, handle); } return 0; } static int uv__send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb cb) { uv_loop_t* loop = handle->loop; DWORD result, bytes; uv_req_init(loop, (uv_req_t*) req); req->type = UV_UDP_SEND; req->handle = handle; req->cb = cb; memset(&req->overlapped, 0, sizeof(req->overlapped)); result = WSASendTo(handle->socket, (WSABUF*)bufs, nbufs, &bytes, 0, addr, addrlen, &req->overlapped, NULL); if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { /* Request completed immediately. */ req->queued_bytes = 0; handle->reqs_pending++; handle->send_queue_size += req->queued_bytes; handle->send_queue_count++; REGISTER_HANDLE_REQ(loop, handle, req); uv_insert_pending_req(loop, (uv_req_t*)req); } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { /* Request queued by the kernel. */ req->queued_bytes = uv__count_bufs(bufs, nbufs); handle->reqs_pending++; handle->send_queue_size += req->queued_bytes; handle->send_queue_count++; REGISTER_HANDLE_REQ(loop, handle, req); } else { /* Send failed due to an error. */ return WSAGetLastError(); } return 0; } void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req) { uv_buf_t buf; int partial; assert(handle->type == UV_UDP); handle->flags &= ~UV_HANDLE_READ_PENDING; if (!REQ_SUCCESS(req)) { DWORD err = GET_REQ_SOCK_ERROR(req); if (err == WSAEMSGSIZE) { /* Not a real error, it just indicates that the received packet */ /* was bigger than the receive buffer. */ } else if (err == WSAECONNRESET || err == WSAENETRESET) { /* A previous sendto operation failed; ignore this error. If */ /* zero-reading we need to call WSARecv/WSARecvFrom _without_ the */ /* MSG_PEEK flag to clear out the error queue. For nonzero reads, */ /* immediately queue a new receive. */ if (!(handle->flags & UV_HANDLE_ZERO_READ)) { goto done; } } else { /* A real error occurred. Report the error to the user only if we're */ /* currently reading. */ if (handle->flags & UV_HANDLE_READING) { uv_udp_recv_stop(handle); buf = (handle->flags & UV_HANDLE_ZERO_READ) ? uv_buf_init(NULL, 0) : handle->recv_buffer; handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); } goto done; } } if (!(handle->flags & UV_HANDLE_ZERO_READ)) { /* Successful read */ partial = !REQ_SUCCESS(req); handle->recv_cb(handle, req->overlapped.InternalHigh, &handle->recv_buffer, (const struct sockaddr*) &handle->recv_from, partial ? UV_UDP_PARTIAL : 0); } else if (handle->flags & UV_HANDLE_READING) { DWORD bytes, err, flags; struct sockaddr_storage from; int from_len; /* Do a nonblocking receive */ /* TODO: try to read multiple datagrams at once. FIONREAD maybe? */ handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); if (buf.len == 0) { handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); goto done; } assert(buf.base != NULL); memset(&from, 0, sizeof from); from_len = sizeof from; flags = 0; if (WSARecvFrom(handle->socket, (WSABUF*)&buf, 1, &bytes, &flags, (struct sockaddr*) &from, &from_len, NULL, NULL) != SOCKET_ERROR) { /* Message received */ handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, 0); } else { err = WSAGetLastError(); if (err == WSAEMSGSIZE) { /* Message truncated */ handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, UV_UDP_PARTIAL); } else if (err == WSAEWOULDBLOCK) { /* Kernel buffer empty */ handle->recv_cb(handle, 0, &buf, NULL, 0); } else if (err == WSAECONNRESET || err == WSAENETRESET) { /* WSAECONNRESET/WSANETRESET is ignored because this just indicates * that a previous sendto operation failed. */ handle->recv_cb(handle, 0, &buf, NULL, 0); } else { /* Any other error that we want to report back to the user. */ uv_udp_recv_stop(handle); handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); } } } done: /* Post another read if still reading and not closing. */ if ((handle->flags & UV_HANDLE_READING) && !(handle->flags & UV_HANDLE_READ_PENDING)) { uv_udp_queue_recv(loop, handle); } DECREASE_PENDING_REQ_COUNT(handle); } void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, uv_udp_send_t* req) { int err; assert(handle->type == UV_UDP); assert(handle->send_queue_size >= req->queued_bytes); assert(handle->send_queue_count >= 1); handle->send_queue_size -= req->queued_bytes; handle->send_queue_count--; UNREGISTER_HANDLE_REQ(loop, handle, req); if (req->cb) { err = 0; if (!REQ_SUCCESS(req)) { err = GET_REQ_SOCK_ERROR(req); } req->cb(req, uv_translate_sys_error(err)); } DECREASE_PENDING_REQ_COUNT(handle); } static int uv__udp_set_membership4(uv_udp_t* handle, const struct sockaddr_in* multicast_addr, const char* interface_addr, uv_membership membership) { int err; int optname; struct ip_mreq mreq; if (handle->flags & UV_HANDLE_IPV6) return UV_EINVAL; /* If the socket is unbound, bind to inaddr_any. */ err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip4_any_, sizeof(uv_addr_ip4_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof mreq); if (interface_addr) { err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); if (err) return err; } else { mreq.imr_interface.s_addr = htonl(INADDR_ANY); } mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; switch (membership) { case UV_JOIN_GROUP: optname = IP_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IP_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->socket, IPPROTO_IP, optname, (char*) &mreq, sizeof mreq) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv__udp_set_membership6(uv_udp_t* handle, const struct sockaddr_in6* multicast_addr, const char* interface_addr, uv_membership membership) { int optname; int err; struct ipv6_mreq mreq; struct sockaddr_in6 addr6; if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6)) return UV_EINVAL; err = uv_udp_maybe_bind(handle, (const struct sockaddr*) &uv_addr_ip6_any_, sizeof(uv_addr_ip6_any_), UV_UDP_REUSEADDR); if (err) return uv_translate_sys_error(err); memset(&mreq, 0, sizeof(mreq)); if (interface_addr) { if (uv_ip6_addr(interface_addr, 0, &addr6)) return UV_EINVAL; mreq.ipv6mr_interface = addr6.sin6_scope_id; } else { mreq.ipv6mr_interface = 0; } mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; switch (membership) { case UV_JOIN_GROUP: optname = IPV6_ADD_MEMBERSHIP; break; case UV_LEAVE_GROUP: optname = IPV6_DROP_MEMBERSHIP; break; default: return UV_EINVAL; } if (setsockopt(handle->socket, IPPROTO_IPV6, optname, (char*) &mreq, sizeof mreq) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv_udp_set_membership(uv_udp_t* handle, const char* multicast_addr, const char* interface_addr, uv_membership membership) { struct sockaddr_in addr4; struct sockaddr_in6 addr6; if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); else return UV_EINVAL; } int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { struct sockaddr_storage addr_st; struct sockaddr_in* addr4; struct sockaddr_in6* addr6; addr4 = (struct sockaddr_in*) &addr_st; addr6 = (struct sockaddr_in6*) &addr_st; if (!interface_addr) { memset(&addr_st, 0, sizeof addr_st); if (handle->flags & UV_HANDLE_IPV6) { addr_st.ss_family = AF_INET6; addr6->sin6_scope_id = 0; } else { addr_st.ss_family = AF_INET; addr4->sin_addr.s_addr = htonl(INADDR_ANY); } } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { /* nothing, address was parsed */ } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { /* nothing, address was parsed */ } else { return UV_EINVAL; } if (!(handle->flags & UV_HANDLE_BOUND)) return UV_EBADF; if (addr_st.ss_family == AF_INET) { if (setsockopt(handle->socket, IPPROTO_IP, IP_MULTICAST_IF, (char*) &addr4->sin_addr, sizeof(addr4->sin_addr)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } } else if (addr_st.ss_family == AF_INET6) { if (setsockopt(handle->socket, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char*) &addr6->sin6_scope_id, sizeof(addr6->sin6_scope_id)) == SOCKET_ERROR) { return uv_translate_sys_error(WSAGetLastError()); } } else { assert(0 && "unexpected address family"); abort(); } return 0; } int uv_udp_set_broadcast(uv_udp_t* handle, int value) { BOOL optval = (BOOL) value; if (!(handle->flags & UV_HANDLE_BOUND)) return UV_EBADF; if (setsockopt(handle->socket, SOL_SOCKET, SO_BROADCAST, (char*) &optval, sizeof optval)) { return uv_translate_sys_error(WSAGetLastError()); } return 0; } int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { WSAPROTOCOL_INFOW protocol_info; int opt_len; int err; /* Detect the address family of the socket. */ opt_len = (int) sizeof protocol_info; if (getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) { return uv_translate_sys_error(GetLastError()); } err = uv_udp_set_socket(handle->loop, handle, sock, protocol_info.iAddressFamily); return uv_translate_sys_error(err); } #define SOCKOPT_SETTER(name, option4, option6, validate) \ int uv_udp_set_##name(uv_udp_t* handle, int value) { \ DWORD optval = (DWORD) value; \ \ if (!(validate(value))) { \ return UV_EINVAL; \ } \ \ if (!(handle->flags & UV_HANDLE_BOUND)) \ return UV_EBADF; \ \ if (!(handle->flags & UV_HANDLE_IPV6)) { \ /* Set IPv4 socket option */ \ if (setsockopt(handle->socket, \ IPPROTO_IP, \ option4, \ (char*) &optval, \ sizeof optval)) { \ return uv_translate_sys_error(WSAGetLastError()); \ } \ } else { \ /* Set IPv6 socket option */ \ if (setsockopt(handle->socket, \ IPPROTO_IPV6, \ option6, \ (char*) &optval, \ sizeof optval)) { \ return uv_translate_sys_error(WSAGetLastError()); \ } \ } \ return 0; \ } #define VALIDATE_TTL(value) ((value) >= 1 && (value) <= 255) #define VALIDATE_MULTICAST_TTL(value) ((value) >= -1 && (value) <= 255) #define VALIDATE_MULTICAST_LOOP(value) (1) SOCKOPT_SETTER(ttl, IP_TTL, IPV6_HOPLIMIT, VALIDATE_TTL) SOCKOPT_SETTER(multicast_ttl, IP_MULTICAST_TTL, IPV6_MULTICAST_HOPS, VALIDATE_MULTICAST_TTL) SOCKOPT_SETTER(multicast_loop, IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP, VALIDATE_MULTICAST_LOOP) #undef SOCKOPT_SETTER #undef VALIDATE_TTL #undef VALIDATE_MULTICAST_TTL #undef VALIDATE_MULTICAST_LOOP /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__udp_bind(uv_udp_t* handle, const struct sockaddr* addr, unsigned int addrlen, unsigned int flags) { int err; err = uv_udp_maybe_bind(handle, addr, addrlen, flags); if (err) return uv_translate_sys_error(err); return 0; } /* This function is an egress point, i.e. it returns libuv errors rather than * system errors. */ int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb) { const struct sockaddr* bind_addr; int err; if (!(handle->flags & UV_HANDLE_BOUND)) { if (addrlen == sizeof(uv_addr_ip4_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; } else if (addrlen == sizeof(uv_addr_ip6_any_)) { bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; } else { abort(); } err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0); if (err) return uv_translate_sys_error(err); } err = uv__send(req, handle, bufs, nbufs, addr, addrlen, send_cb); if (err) return uv_translate_sys_error(err); return 0; } int uv__udp_try_send(uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen) { return UV_ENOSYS; } MoarVM-2015.11/3rdparty/libuv/src/win/util.c0000644000175000017500000010034512502366750017457 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include "uv.h" #include "internal.h" #include #include #include #include #include #include /* * Max title length; the only thing MSDN tells us about the maximum length * of the console title is that it is smaller than 64K. However in practice * it is much smaller, and there is no way to figure out what the exact length * of the title is or can be, at least not on XP. To make it even more * annoying, GetConsoleTitle failes when the buffer to be read into is bigger * than the actual maximum length. So we make a conservative guess here; * just don't put the novel you're writing in the title, unless the plot * survives truncation. */ #define MAX_TITLE_LENGTH 8192 /* The number of nanoseconds in one second. */ #define UV__NANOSEC 1000000000 /* Cached copy of the process title, plus a mutex guarding it. */ static char *process_title; static CRITICAL_SECTION process_title_lock; /* Interval (in seconds) of the high-resolution clock. */ static double hrtime_interval_ = 0; /* * One-time intialization code for functionality defined in util.c. */ void uv__util_init() { LARGE_INTEGER perf_frequency; /* Initialize process title access mutex. */ InitializeCriticalSection(&process_title_lock); /* Retrieve high-resolution timer frequency * and precompute its reciprocal. */ if (QueryPerformanceFrequency(&perf_frequency)) { hrtime_interval_ = 1.0 / perf_frequency.QuadPart; } else { hrtime_interval_= 0; } } int uv_utf16_to_utf8(const WCHAR* utf16Buffer, size_t utf16Size, char* utf8Buffer, size_t utf8Size) { return WideCharToMultiByte(CP_UTF8, 0, utf16Buffer, utf16Size, utf8Buffer, utf8Size, NULL, NULL); } int uv_utf8_to_utf16(const char* utf8Buffer, WCHAR* utf16Buffer, size_t utf16Size) { return MultiByteToWideChar(CP_UTF8, 0, utf8Buffer, -1, utf16Buffer, utf16Size); } int uv_exepath(char* buffer, size_t* size_ptr) { int utf8_len, utf16_buffer_len, utf16_len; WCHAR* utf16_buffer; int err; if (buffer == NULL || size_ptr == NULL || *size_ptr == 0) { return UV_EINVAL; } if (*size_ptr > 32768) { /* Windows paths can never be longer than this. */ utf16_buffer_len = 32768; } else { utf16_buffer_len = (int) *size_ptr; } utf16_buffer = (WCHAR*) malloc(sizeof(WCHAR) * utf16_buffer_len); if (!utf16_buffer) { return UV_ENOMEM; } /* Get the path as UTF-16. */ utf16_len = GetModuleFileNameW(NULL, utf16_buffer, utf16_buffer_len); if (utf16_len <= 0) { err = GetLastError(); goto error; } /* utf16_len contains the length, *not* including the terminating null. */ utf16_buffer[utf16_len] = L'\0'; /* Convert to UTF-8 */ utf8_len = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, buffer, *size_ptr > INT_MAX ? INT_MAX : (int) *size_ptr, NULL, NULL); if (utf8_len == 0) { err = GetLastError(); goto error; } free(utf16_buffer); /* utf8_len *does* include the terminating null at this point, but the */ /* returned size shouldn't. */ *size_ptr = utf8_len - 1; return 0; error: free(utf16_buffer); return uv_translate_sys_error(err); } int uv_cwd(char* buffer, size_t* size) { DWORD utf16_len; WCHAR utf16_buffer[MAX_PATH]; int r; if (buffer == NULL || size == NULL) { return UV_EINVAL; } utf16_len = GetCurrentDirectoryW(MAX_PATH, utf16_buffer); if (utf16_len == 0) { return uv_translate_sys_error(GetLastError()); } else if (utf16_len > MAX_PATH) { /* This should be impossible; however the CRT has a code path to deal */ /* with this scenario, so I added a check anyway. */ return UV_EIO; } /* utf16_len contains the length, *not* including the terminating null. */ utf16_buffer[utf16_len] = L'\0'; /* The returned directory should not have a trailing slash, unless it */ /* points at a drive root, like c:\. Remove it if needed.*/ if (utf16_buffer[utf16_len - 1] == L'\\' && !(utf16_len == 3 && utf16_buffer[1] == L':')) { utf16_len--; utf16_buffer[utf16_len] = L'\0'; } /* Check how much space we need */ r = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, NULL, 0, NULL, NULL); if (r == 0) { return uv_translate_sys_error(GetLastError()); } else if (r > (int) *size) { *size = r -1; return UV_ENOBUFS; } /* Convert to UTF-8 */ r = WideCharToMultiByte(CP_UTF8, 0, utf16_buffer, -1, buffer, *size > INT_MAX ? INT_MAX : (int) *size, NULL, NULL); if (r == 0) { return uv_translate_sys_error(GetLastError()); } *size = r - 1; return 0; } int uv_chdir(const char* dir) { WCHAR utf16_buffer[MAX_PATH]; size_t utf16_len; WCHAR drive_letter, env_var[4]; if (dir == NULL) { return UV_EINVAL; } if (MultiByteToWideChar(CP_UTF8, 0, dir, -1, utf16_buffer, MAX_PATH) == 0) { DWORD error = GetLastError(); /* The maximum length of the current working directory is 260 chars, */ /* including terminating null. If it doesn't fit, the path name must be */ /* too long. */ if (error == ERROR_INSUFFICIENT_BUFFER) { return UV_ENAMETOOLONG; } else { return uv_translate_sys_error(error); } } if (!SetCurrentDirectoryW(utf16_buffer)) { return uv_translate_sys_error(GetLastError()); } /* Windows stores the drive-local path in an "hidden" environment variable, */ /* which has the form "=C:=C:\Windows". SetCurrentDirectory does not */ /* update this, so we'll have to do it. */ utf16_len = GetCurrentDirectoryW(MAX_PATH, utf16_buffer); if (utf16_len == 0) { return uv_translate_sys_error(GetLastError()); } else if (utf16_len > MAX_PATH) { return UV_EIO; } /* The returned directory should not have a trailing slash, unless it */ /* points at a drive root, like c:\. Remove it if needed. */ if (utf16_buffer[utf16_len - 1] == L'\\' && !(utf16_len == 3 && utf16_buffer[1] == L':')) { utf16_len--; utf16_buffer[utf16_len] = L'\0'; } if (utf16_len < 2 || utf16_buffer[1] != L':') { /* Doesn't look like a drive letter could be there - probably an UNC */ /* path. TODO: Need to handle win32 namespaces like \\?\C:\ ? */ drive_letter = 0; } else if (utf16_buffer[0] >= L'A' && utf16_buffer[0] <= L'Z') { drive_letter = utf16_buffer[0]; } else if (utf16_buffer[0] >= L'a' && utf16_buffer[0] <= L'z') { /* Convert to uppercase. */ drive_letter = utf16_buffer[0] - L'a' + L'A'; } else { /* Not valid. */ drive_letter = 0; } if (drive_letter != 0) { /* Construct the environment variable name and set it. */ env_var[0] = L'='; env_var[1] = drive_letter; env_var[2] = L':'; env_var[3] = L'\0'; if (!SetEnvironmentVariableW(env_var, utf16_buffer)) { return uv_translate_sys_error(GetLastError()); } } return 0; } void uv_loadavg(double avg[3]) { /* Can't be implemented */ avg[0] = avg[1] = avg[2] = 0; } uint64_t uv_get_free_memory(void) { MEMORYSTATUSEX memory_status; memory_status.dwLength = sizeof(memory_status); if (!GlobalMemoryStatusEx(&memory_status)) { return -1; } return (uint64_t)memory_status.ullAvailPhys; } uint64_t uv_get_total_memory(void) { MEMORYSTATUSEX memory_status; memory_status.dwLength = sizeof(memory_status); if (!GlobalMemoryStatusEx(&memory_status)) { return -1; } return (uint64_t)memory_status.ullTotalPhys; } int uv_parent_pid() { int parent_pid = -1; HANDLE handle; PROCESSENTRY32 pe; DWORD current_pid = GetCurrentProcessId(); pe.dwSize = sizeof(PROCESSENTRY32); handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(handle, &pe)) { do { if (pe.th32ProcessID == current_pid) { parent_pid = pe.th32ParentProcessID; break; } } while( Process32Next(handle, &pe)); } CloseHandle(handle); return parent_pid; } char** uv_setup_args(int argc, char** argv) { return argv; } int uv_set_process_title(const char* title) { int err; int length; WCHAR* title_w = NULL; uv__once_init(); /* Find out how big the buffer for the wide-char title must be */ length = uv_utf8_to_utf16(title, NULL, 0); if (!length) { err = GetLastError(); goto done; } /* Convert to wide-char string */ title_w = (WCHAR*)malloc(sizeof(WCHAR) * length); if (!title_w) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } length = uv_utf8_to_utf16(title, title_w, length); if (!length) { err = GetLastError(); goto done; } /* If the title must be truncated insert a \0 terminator there */ if (length > MAX_TITLE_LENGTH) { title_w[MAX_TITLE_LENGTH - 1] = L'\0'; } if (!SetConsoleTitleW(title_w)) { err = GetLastError(); goto done; } EnterCriticalSection(&process_title_lock); free(process_title); process_title = strdup(title); LeaveCriticalSection(&process_title_lock); err = 0; done: free(title_w); return uv_translate_sys_error(err); } static int uv__get_process_title() { WCHAR title_w[MAX_TITLE_LENGTH]; int length; if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) { return -1; } /* Find out what the size of the buffer is that we need */ length = uv_utf16_to_utf8(title_w, -1, NULL, 0); if (!length) { return -1; } assert(!process_title); process_title = (char*)malloc(length); if (!process_title) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } /* Do utf16 -> utf8 conversion here */ if (!uv_utf16_to_utf8(title_w, -1, process_title, length)) { free(process_title); return -1; } return 0; } int uv_get_process_title(char* buffer, size_t size) { uv__once_init(); EnterCriticalSection(&process_title_lock); /* * If the process_title was never read before nor explicitly set, * we must query it with getConsoleTitleW */ if (!process_title && uv__get_process_title() == -1) { LeaveCriticalSection(&process_title_lock); return uv_translate_sys_error(GetLastError()); } assert(process_title); strncpy(buffer, process_title, size); LeaveCriticalSection(&process_title_lock); return 0; } uint64_t uv_hrtime(void) { uv__once_init(); return uv__hrtime(UV__NANOSEC); } uint64_t uv__hrtime(double scale) { LARGE_INTEGER counter; /* If the performance interval is zero, there's no support. */ if (hrtime_interval_ == 0) { return 0; } if (!QueryPerformanceCounter(&counter)) { return 0; } /* Because we have no guarantee about the order of magnitude of the * performance counter interval, integer math could cause this computation * to overflow. Therefore we resort to floating point math. */ return (uint64_t) ((double) counter.QuadPart * hrtime_interval_ * scale); } int uv_resident_set_memory(size_t* rss) { HANDLE current_process; PROCESS_MEMORY_COUNTERS pmc; current_process = GetCurrentProcess(); if (!GetProcessMemoryInfo(current_process, &pmc, sizeof(pmc))) { return uv_translate_sys_error(GetLastError()); } *rss = pmc.WorkingSetSize; return 0; } int uv_uptime(double* uptime) { BYTE stack_buffer[4096]; BYTE* malloced_buffer = NULL; BYTE* buffer = (BYTE*) stack_buffer; size_t buffer_size = sizeof(stack_buffer); DWORD data_size; PERF_DATA_BLOCK* data_block; PERF_OBJECT_TYPE* object_type; PERF_COUNTER_DEFINITION* counter_definition; DWORD i; for (;;) { LONG result; data_size = (DWORD) buffer_size; result = RegQueryValueExW(HKEY_PERFORMANCE_DATA, L"2", NULL, NULL, buffer, &data_size); if (result == ERROR_SUCCESS) { break; } else if (result != ERROR_MORE_DATA) { *uptime = 0; return uv_translate_sys_error(result); } free(malloced_buffer); buffer_size *= 2; /* Don't let the buffer grow infinitely. */ if (buffer_size > 1 << 20) { goto internalError; } buffer = malloced_buffer = (BYTE*) malloc(buffer_size); if (malloced_buffer == NULL) { *uptime = 0; return UV_ENOMEM; } } if (data_size < sizeof(*data_block)) goto internalError; data_block = (PERF_DATA_BLOCK*) buffer; if (wmemcmp(data_block->Signature, L"PERF", 4) != 0) goto internalError; if (data_size < data_block->HeaderLength + sizeof(*object_type)) goto internalError; object_type = (PERF_OBJECT_TYPE*) (buffer + data_block->HeaderLength); if (object_type->NumInstances != PERF_NO_INSTANCES) goto internalError; counter_definition = (PERF_COUNTER_DEFINITION*) (buffer + data_block->HeaderLength + object_type->HeaderLength); for (i = 0; i < object_type->NumCounters; i++) { if ((BYTE*) counter_definition + sizeof(*counter_definition) > buffer + data_size) { break; } if (counter_definition->CounterNameTitleIndex == 674 && counter_definition->CounterSize == sizeof(uint64_t)) { if (counter_definition->CounterOffset + sizeof(uint64_t) > data_size || !(counter_definition->CounterType & PERF_OBJECT_TIMER)) { goto internalError; } else { BYTE* address = (BYTE*) object_type + object_type->DefinitionLength + counter_definition->CounterOffset; uint64_t value = *((uint64_t*) address); *uptime = (double) (object_type->PerfTime.QuadPart - value) / (double) object_type->PerfFreq.QuadPart; free(malloced_buffer); return 0; } } counter_definition = (PERF_COUNTER_DEFINITION*) ((BYTE*) counter_definition + counter_definition->ByteLength); } /* If we get here, the uptime value was not found. */ free(malloced_buffer); *uptime = 0; return UV_ENOSYS; internalError: free(malloced_buffer); *uptime = 0; return UV_EIO; } int uv_cpu_info(uv_cpu_info_t** cpu_infos_ptr, int* cpu_count_ptr) { uv_cpu_info_t* cpu_infos; SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* sppi; DWORD sppi_size; SYSTEM_INFO system_info; DWORD cpu_count, r, i; NTSTATUS status; ULONG result_size; int err; uv_cpu_info_t* cpu_info; cpu_infos = NULL; cpu_count = 0; sppi = NULL; uv__once_init(); GetSystemInfo(&system_info); cpu_count = system_info.dwNumberOfProcessors; cpu_infos = calloc(cpu_count, sizeof *cpu_infos); if (cpu_infos == NULL) { err = ERROR_OUTOFMEMORY; goto error; } sppi_size = cpu_count * sizeof(*sppi); sppi = malloc(sppi_size); if (sppi == NULL) { err = ERROR_OUTOFMEMORY; goto error; } status = pNtQuerySystemInformation(SystemProcessorPerformanceInformation, sppi, sppi_size, &result_size); if (!NT_SUCCESS(status)) { err = pRtlNtStatusToDosError(status); goto error; } assert(result_size == sppi_size); for (i = 0; i < cpu_count; i++) { WCHAR key_name[128]; HKEY processor_key; DWORD cpu_speed; DWORD cpu_speed_size = sizeof(cpu_speed); WCHAR cpu_brand[256]; DWORD cpu_brand_size = sizeof(cpu_brand); size_t len; len = _snwprintf(key_name, ARRAY_SIZE(key_name), L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d", i); assert(len > 0 && len < ARRAY_SIZE(key_name)); r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, KEY_QUERY_VALUE, &processor_key); if (r != ERROR_SUCCESS) { err = GetLastError(); goto error; } if (RegQueryValueExW(processor_key, L"~MHz", NULL, NULL, (BYTE*) &cpu_speed, &cpu_speed_size) != ERROR_SUCCESS) { err = GetLastError(); RegCloseKey(processor_key); goto error; } if (RegQueryValueExW(processor_key, L"ProcessorNameString", NULL, NULL, (BYTE*) &cpu_brand, &cpu_brand_size) != ERROR_SUCCESS) { err = GetLastError(); RegCloseKey(processor_key); goto error; } RegCloseKey(processor_key); cpu_info = &cpu_infos[i]; cpu_info->speed = cpu_speed; cpu_info->cpu_times.user = sppi[i].UserTime.QuadPart / 10000; cpu_info->cpu_times.sys = (sppi[i].KernelTime.QuadPart - sppi[i].IdleTime.QuadPart) / 10000; cpu_info->cpu_times.idle = sppi[i].IdleTime.QuadPart / 10000; cpu_info->cpu_times.irq = sppi[i].InterruptTime.QuadPart / 10000; cpu_info->cpu_times.nice = 0; len = WideCharToMultiByte(CP_UTF8, 0, cpu_brand, cpu_brand_size / sizeof(WCHAR), NULL, 0, NULL, NULL); if (len == 0) { err = GetLastError(); goto error; } assert(len > 0); /* Allocate 1 extra byte for the null terminator. */ cpu_info->model = malloc(len + 1); if (cpu_info->model == NULL) { err = ERROR_OUTOFMEMORY; goto error; } if (WideCharToMultiByte(CP_UTF8, 0, cpu_brand, cpu_brand_size / sizeof(WCHAR), cpu_info->model, len, NULL, NULL) == 0) { err = GetLastError(); goto error; } /* Ensure that cpu_info->model is null terminated. */ cpu_info->model[len] = '\0'; } free(sppi); *cpu_count_ptr = cpu_count; *cpu_infos_ptr = cpu_infos; return 0; error: /* This is safe because the cpu_infos array is zeroed on allocation. */ for (i = 0; i < cpu_count; i++) free(cpu_infos[i].model); free(cpu_infos); free(sppi); return uv_translate_sys_error(err); } void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { int i; for (i = 0; i < count; i++) { free(cpu_infos[i].model); } free(cpu_infos); } static int is_windows_version_or_greater(DWORD os_major, DWORD os_minor, WORD service_pack_major, WORD service_pack_minor) { OSVERSIONINFOEX osvi; DWORDLONG condition_mask = 0; int op = VER_GREATER_EQUAL; /* Initialize the OSVERSIONINFOEX structure. */ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osvi.dwMajorVersion = os_major; osvi.dwMinorVersion = os_minor; osvi.wServicePackMajor = service_pack_major; osvi.wServicePackMinor = service_pack_minor; /* Initialize the condition mask. */ VER_SET_CONDITION(condition_mask, VER_MAJORVERSION, op); VER_SET_CONDITION(condition_mask, VER_MINORVERSION, op); VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMAJOR, op); VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMINOR, op); /* Perform the test. */ return (int) VerifyVersionInfo( &osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, condition_mask); } static int address_prefix_match(int family, struct sockaddr* address, struct sockaddr* prefix_address, int prefix_len) { uint8_t* address_data; uint8_t* prefix_address_data; int i; assert(address->sa_family == family); assert(prefix_address->sa_family == family); if (family == AF_INET6) { address_data = (uint8_t*) &(((struct sockaddr_in6 *) address)->sin6_addr); prefix_address_data = (uint8_t*) &(((struct sockaddr_in6 *) prefix_address)->sin6_addr); } else { address_data = (uint8_t*) &(((struct sockaddr_in *) address)->sin_addr); prefix_address_data = (uint8_t*) &(((struct sockaddr_in *) prefix_address)->sin_addr); } for (i = 0; i < prefix_len >> 3; i++) { if (address_data[i] != prefix_address_data[i]) return 0; } if (prefix_len % 8) return prefix_address_data[i] == (address_data[i] & (0xff << (8 - prefix_len % 8))); return 1; } int uv_interface_addresses(uv_interface_address_t** addresses_ptr, int* count_ptr) { IP_ADAPTER_ADDRESSES* win_address_buf; ULONG win_address_buf_size; IP_ADAPTER_ADDRESSES* adapter; uv_interface_address_t* uv_address_buf; char* name_buf; size_t uv_address_buf_size; uv_interface_address_t* uv_address; int count; int is_vista_or_greater; ULONG flags; is_vista_or_greater = is_windows_version_or_greater(6, 0, 0, 0); if (is_vista_or_greater) { flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; } else { /* We need at least XP SP1. */ if (!is_windows_version_or_greater(5, 1, 1, 0)) return UV_ENOTSUP; flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX; } /* Fetch the size of the adapters reported by windows, and then get the */ /* list itself. */ win_address_buf_size = 0; win_address_buf = NULL; for (;;) { ULONG r; /* If win_address_buf is 0, then GetAdaptersAddresses will fail with */ /* ERROR_BUFFER_OVERFLOW, and the required buffer size will be stored in */ /* win_address_buf_size. */ r = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, win_address_buf, &win_address_buf_size); if (r == ERROR_SUCCESS) break; free(win_address_buf); switch (r) { case ERROR_BUFFER_OVERFLOW: /* This happens when win_address_buf is NULL or too small to hold */ /* all adapters. */ win_address_buf = malloc(win_address_buf_size); if (win_address_buf == NULL) return UV_ENOMEM; continue; case ERROR_NO_DATA: { /* No adapters were found. */ uv_address_buf = malloc(1); if (uv_address_buf == NULL) return UV_ENOMEM; *count_ptr = 0; *addresses_ptr = uv_address_buf; return 0; } case ERROR_ADDRESS_NOT_ASSOCIATED: return UV_EAGAIN; case ERROR_INVALID_PARAMETER: /* MSDN says: * "This error is returned for any of the following conditions: the * SizePointer parameter is NULL, the Address parameter is not * AF_INET, AF_INET6, or AF_UNSPEC, or the address information for * the parameters requested is greater than ULONG_MAX." * Since the first two conditions are not met, it must be that the * adapter data is too big. */ return UV_ENOBUFS; default: /* Other (unspecified) errors can happen, but we don't have any */ /* special meaning for them. */ assert(r != ERROR_SUCCESS); return uv_translate_sys_error(r); } } /* Count the number of enabled interfaces and compute how much space is */ /* needed to store their info. */ count = 0; uv_address_buf_size = 0; for (adapter = win_address_buf; adapter != NULL; adapter = adapter->Next) { IP_ADAPTER_UNICAST_ADDRESS* unicast_address; int name_size; /* Interfaces that are not 'up' should not be reported. Also skip */ /* interfaces that have no associated unicast address, as to avoid */ /* allocating space for the name for this interface. */ if (adapter->OperStatus != IfOperStatusUp || adapter->FirstUnicastAddress == NULL) continue; /* Compute the size of the interface name. */ name_size = WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, NULL, 0, NULL, FALSE); if (name_size <= 0) { free(win_address_buf); return uv_translate_sys_error(GetLastError()); } uv_address_buf_size += name_size; /* Count the number of addresses associated with this interface, and */ /* compute the size. */ for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) adapter->FirstUnicastAddress; unicast_address != NULL; unicast_address = unicast_address->Next) { count++; uv_address_buf_size += sizeof(uv_interface_address_t); } } /* Allocate space to store interface data plus adapter names. */ uv_address_buf = malloc(uv_address_buf_size); if (uv_address_buf == NULL) { free(win_address_buf); return UV_ENOMEM; } /* Compute the start of the uv_interface_address_t array, and the place in */ /* the buffer where the interface names will be stored. */ uv_address = uv_address_buf; name_buf = (char*) (uv_address_buf + count); /* Fill out the output buffer. */ for (adapter = win_address_buf; adapter != NULL; adapter = adapter->Next) { IP_ADAPTER_UNICAST_ADDRESS* unicast_address; int name_size; size_t max_name_size; if (adapter->OperStatus != IfOperStatusUp || adapter->FirstUnicastAddress == NULL) continue; /* Convert the interface name to UTF8. */ max_name_size = (char*) uv_address_buf + uv_address_buf_size - name_buf; if (max_name_size > (size_t) INT_MAX) max_name_size = INT_MAX; name_size = WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, name_buf, (int) max_name_size, NULL, FALSE); if (name_size <= 0) { free(win_address_buf); free(uv_address_buf); return uv_translate_sys_error(GetLastError()); } /* Add an uv_interface_address_t element for every unicast address. */ for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) adapter->FirstUnicastAddress; unicast_address != NULL; unicast_address = unicast_address->Next) { struct sockaddr* sa; ULONG prefix_len; sa = unicast_address->Address.lpSockaddr; /* XP has no OnLinkPrefixLength field. */ if (is_vista_or_greater) { prefix_len = ((IP_ADAPTER_UNICAST_ADDRESS_LH*) unicast_address)->OnLinkPrefixLength; } else { /* Prior to Windows Vista the FirstPrefix pointed to the list with * single prefix for each IP address assigned to the adapter. * Order of FirstPrefix does not match order of FirstUnicastAddress, * so we need to find corresponding prefix. */ IP_ADAPTER_PREFIX* prefix; prefix_len = 0; for (prefix = adapter->FirstPrefix; prefix; prefix = prefix->Next) { /* We want the longest matching prefix. */ if (prefix->Address.lpSockaddr->sa_family != sa->sa_family || prefix->PrefixLength <= prefix_len) continue; if (address_prefix_match(sa->sa_family, sa, prefix->Address.lpSockaddr, prefix->PrefixLength)) { prefix_len = prefix->PrefixLength; } } /* If there is no matching prefix information, return a single-host * subnet mask (e.g. 255.255.255.255 for IPv4). */ if (!prefix_len) prefix_len = (sa->sa_family == AF_INET6) ? 128 : 32; } memset(uv_address, 0, sizeof *uv_address); uv_address->name = name_buf; if (adapter->PhysicalAddressLength == sizeof(uv_address->phys_addr)) { memcpy(uv_address->phys_addr, adapter->PhysicalAddress, sizeof(uv_address->phys_addr)); } uv_address->is_internal = (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK); if (sa->sa_family == AF_INET6) { uv_address->address.address6 = *((struct sockaddr_in6 *) sa); uv_address->netmask.netmask6.sin6_family = AF_INET6; memset(uv_address->netmask.netmask6.sin6_addr.s6_addr, 0xff, prefix_len >> 3); /* This check ensures that we don't write past the size of the data. */ if (prefix_len % 8) { uv_address->netmask.netmask6.sin6_addr.s6_addr[prefix_len >> 3] = 0xff << (8 - prefix_len % 8); } } else { uv_address->address.address4 = *((struct sockaddr_in *) sa); uv_address->netmask.netmask4.sin_family = AF_INET; uv_address->netmask.netmask4.sin_addr.s_addr = (prefix_len > 0) ? htonl(0xffffffff << (32 - prefix_len)) : 0; } uv_address++; } name_buf += name_size; } free(win_address_buf); *addresses_ptr = uv_address_buf; *count_ptr = count; return 0; } void uv_free_interface_addresses(uv_interface_address_t* addresses, int count) { free(addresses); } int uv_getrusage(uv_rusage_t *uv_rusage) { FILETIME createTime, exitTime, kernelTime, userTime; SYSTEMTIME kernelSystemTime, userSystemTime; int ret; ret = GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = FileTimeToSystemTime(&kernelTime, &kernelSystemTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } ret = FileTimeToSystemTime(&userTime, &userSystemTime); if (ret == 0) { return uv_translate_sys_error(GetLastError()); } memset(uv_rusage, 0, sizeof(*uv_rusage)); uv_rusage->ru_utime.tv_sec = userSystemTime.wHour * 3600 + userSystemTime.wMinute * 60 + userSystemTime.wSecond; uv_rusage->ru_utime.tv_usec = userSystemTime.wMilliseconds * 1000; uv_rusage->ru_stime.tv_sec = kernelSystemTime.wHour * 3600 + kernelSystemTime.wMinute * 60 + kernelSystemTime.wSecond; uv_rusage->ru_stime.tv_usec = kernelSystemTime.wMilliseconds * 1000; return 0; } MoarVM-2015.11/3rdparty/libuv/src/win/winapi.c0000644000175000017500000001405112456307253017770 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include "uv.h" #include "internal.h" /* Ntdll function pointers */ sRtlNtStatusToDosError pRtlNtStatusToDosError; sNtDeviceIoControlFile pNtDeviceIoControlFile; sNtQueryInformationFile pNtQueryInformationFile; sNtSetInformationFile pNtSetInformationFile; sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; sNtQuerySystemInformation pNtQuerySystemInformation; /* Kernel32 function pointers */ sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; sSetFileCompletionNotificationModes pSetFileCompletionNotificationModes; sCreateSymbolicLinkW pCreateSymbolicLinkW; sCancelIoEx pCancelIoEx; sInitializeSRWLock pInitializeSRWLock; sAcquireSRWLockShared pAcquireSRWLockShared; sAcquireSRWLockExclusive pAcquireSRWLockExclusive; sTryAcquireSRWLockShared pTryAcquireSRWLockShared; sTryAcquireSRWLockExclusive pTryAcquireSRWLockExclusive; sReleaseSRWLockShared pReleaseSRWLockShared; sReleaseSRWLockExclusive pReleaseSRWLockExclusive; sInitializeConditionVariable pInitializeConditionVariable; sSleepConditionVariableCS pSleepConditionVariableCS; sSleepConditionVariableSRW pSleepConditionVariableSRW; sWakeAllConditionVariable pWakeAllConditionVariable; sWakeConditionVariable pWakeConditionVariable; sCancelSynchronousIo pCancelSynchronousIo; void uv_winapi_init() { HMODULE ntdll_module; HMODULE kernel32_module; ntdll_module = GetModuleHandleA("ntdll.dll"); if (ntdll_module == NULL) { uv_fatal_error(GetLastError(), "GetModuleHandleA"); } pRtlNtStatusToDosError = (sRtlNtStatusToDosError) GetProcAddress( ntdll_module, "RtlNtStatusToDosError"); if (pRtlNtStatusToDosError == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtDeviceIoControlFile = (sNtDeviceIoControlFile) GetProcAddress( ntdll_module, "NtDeviceIoControlFile"); if (pNtDeviceIoControlFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryInformationFile = (sNtQueryInformationFile) GetProcAddress( ntdll_module, "NtQueryInformationFile"); if (pNtQueryInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtSetInformationFile = (sNtSetInformationFile) GetProcAddress( ntdll_module, "NtSetInformationFile"); if (pNtSetInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQueryVolumeInformationFile = (sNtQueryVolumeInformationFile) GetProcAddress(ntdll_module, "NtQueryVolumeInformationFile"); if (pNtQueryVolumeInformationFile == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } pNtQuerySystemInformation = (sNtQuerySystemInformation) GetProcAddress( ntdll_module, "NtQuerySystemInformation"); if (pNtQuerySystemInformation == NULL) { uv_fatal_error(GetLastError(), "GetProcAddress"); } kernel32_module = GetModuleHandleA("kernel32.dll"); if (kernel32_module == NULL) { uv_fatal_error(GetLastError(), "GetModuleHandleA"); } pGetQueuedCompletionStatusEx = (sGetQueuedCompletionStatusEx) GetProcAddress( kernel32_module, "GetQueuedCompletionStatusEx"); pSetFileCompletionNotificationModes = (sSetFileCompletionNotificationModes) GetProcAddress(kernel32_module, "SetFileCompletionNotificationModes"); pCreateSymbolicLinkW = (sCreateSymbolicLinkW) GetProcAddress(kernel32_module, "CreateSymbolicLinkW"); pCancelIoEx = (sCancelIoEx) GetProcAddress(kernel32_module, "CancelIoEx"); pInitializeSRWLock = (sInitializeSRWLock) GetProcAddress(kernel32_module, "InitializeSRWLock"); pAcquireSRWLockShared = (sAcquireSRWLockShared) GetProcAddress(kernel32_module, "AcquireSRWLockShared"); pAcquireSRWLockExclusive = (sAcquireSRWLockExclusive) GetProcAddress(kernel32_module, "AcquireSRWLockExclusive"); pTryAcquireSRWLockShared = (sTryAcquireSRWLockShared) GetProcAddress(kernel32_module, "TryAcquireSRWLockShared"); pTryAcquireSRWLockExclusive = (sTryAcquireSRWLockExclusive) GetProcAddress(kernel32_module, "TryAcquireSRWLockExclusive"); pReleaseSRWLockShared = (sReleaseSRWLockShared) GetProcAddress(kernel32_module, "ReleaseSRWLockShared"); pReleaseSRWLockExclusive = (sReleaseSRWLockExclusive) GetProcAddress(kernel32_module, "ReleaseSRWLockExclusive"); pInitializeConditionVariable = (sInitializeConditionVariable) GetProcAddress(kernel32_module, "InitializeConditionVariable"); pSleepConditionVariableCS = (sSleepConditionVariableCS) GetProcAddress(kernel32_module, "SleepConditionVariableCS"); pSleepConditionVariableSRW = (sSleepConditionVariableSRW) GetProcAddress(kernel32_module, "SleepConditionVariableSRW"); pWakeAllConditionVariable = (sWakeAllConditionVariable) GetProcAddress(kernel32_module, "WakeAllConditionVariable"); pWakeConditionVariable = (sWakeConditionVariable) GetProcAddress(kernel32_module, "WakeConditionVariable"); pCancelSynchronousIo = (sCancelSynchronousIo) GetProcAddress(kernel32_module, "CancelSynchronousIo"); } MoarVM-2015.11/3rdparty/libuv/src/win/winapi.h0000644000175000017500000036465712456307253020021 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_WINAPI_H_ #define UV_WIN_WINAPI_H_ #include /* * Ntdll headers */ #ifndef STATUS_SEVERITY_SUCCESS # define STATUS_SEVERITY_SUCCESS 0x0 #endif #ifndef STATUS_SEVERITY_INFORMATIONAL # define STATUS_SEVERITY_INFORMATIONAL 0x1 #endif #ifndef STATUS_SEVERITY_WARNING # define STATUS_SEVERITY_WARNING 0x2 #endif #ifndef STATUS_SEVERITY_ERROR # define STATUS_SEVERITY_ERROR 0x3 #endif #ifndef FACILITY_NTWIN32 # define FACILITY_NTWIN32 0x7 #endif #ifndef NT_SUCCESS # define NT_SUCCESS(status) (((NTSTATUS) (status)) >= 0) #endif #ifndef NT_INFORMATION # define NT_INFORMATION(status) ((((ULONG) (status)) >> 30) == 1) #endif #ifndef NT_WARNING # define NT_WARNING(status) ((((ULONG) (status)) >> 30) == 2) #endif #ifndef NT_ERROR # define NT_ERROR(status) ((((ULONG) (status)) >> 30) == 3) #endif #ifndef STATUS_SUCCESS # define STATUS_SUCCESS ((NTSTATUS) 0x00000000L) #endif #ifndef STATUS_WAIT_0 # define STATUS_WAIT_0 ((NTSTATUS) 0x00000000L) #endif #ifndef STATUS_WAIT_1 # define STATUS_WAIT_1 ((NTSTATUS) 0x00000001L) #endif #ifndef STATUS_WAIT_2 # define STATUS_WAIT_2 ((NTSTATUS) 0x00000002L) #endif #ifndef STATUS_WAIT_3 # define STATUS_WAIT_3 ((NTSTATUS) 0x00000003L) #endif #ifndef STATUS_WAIT_63 # define STATUS_WAIT_63 ((NTSTATUS) 0x0000003FL) #endif #ifndef STATUS_ABANDONED # define STATUS_ABANDONED ((NTSTATUS) 0x00000080L) #endif #ifndef STATUS_ABANDONED_WAIT_0 # define STATUS_ABANDONED_WAIT_0 ((NTSTATUS) 0x00000080L) #endif #ifndef STATUS_ABANDONED_WAIT_63 # define STATUS_ABANDONED_WAIT_63 ((NTSTATUS) 0x000000BFL) #endif #ifndef STATUS_USER_APC # define STATUS_USER_APC ((NTSTATUS) 0x000000C0L) #endif #ifndef STATUS_KERNEL_APC # define STATUS_KERNEL_APC ((NTSTATUS) 0x00000100L) #endif #ifndef STATUS_ALERTED # define STATUS_ALERTED ((NTSTATUS) 0x00000101L) #endif #ifndef STATUS_TIMEOUT # define STATUS_TIMEOUT ((NTSTATUS) 0x00000102L) #endif #ifndef STATUS_PENDING # define STATUS_PENDING ((NTSTATUS) 0x00000103L) #endif #ifndef STATUS_REPARSE # define STATUS_REPARSE ((NTSTATUS) 0x00000104L) #endif #ifndef STATUS_MORE_ENTRIES # define STATUS_MORE_ENTRIES ((NTSTATUS) 0x00000105L) #endif #ifndef STATUS_NOT_ALL_ASSIGNED # define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106L) #endif #ifndef STATUS_SOME_NOT_MAPPED # define STATUS_SOME_NOT_MAPPED ((NTSTATUS) 0x00000107L) #endif #ifndef STATUS_OPLOCK_BREAK_IN_PROGRESS # define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS) 0x00000108L) #endif #ifndef STATUS_VOLUME_MOUNTED # define STATUS_VOLUME_MOUNTED ((NTSTATUS) 0x00000109L) #endif #ifndef STATUS_RXACT_COMMITTED # define STATUS_RXACT_COMMITTED ((NTSTATUS) 0x0000010AL) #endif #ifndef STATUS_NOTIFY_CLEANUP # define STATUS_NOTIFY_CLEANUP ((NTSTATUS) 0x0000010BL) #endif #ifndef STATUS_NOTIFY_ENUM_DIR # define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS) 0x0000010CL) #endif #ifndef STATUS_NO_QUOTAS_FOR_ACCOUNT # define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS) 0x0000010DL) #endif #ifndef STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED # define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS) 0x0000010EL) #endif #ifndef STATUS_PAGE_FAULT_TRANSITION # define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS) 0x00000110L) #endif #ifndef STATUS_PAGE_FAULT_DEMAND_ZERO # define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS) 0x00000111L) #endif #ifndef STATUS_PAGE_FAULT_COPY_ON_WRITE # define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS) 0x00000112L) #endif #ifndef STATUS_PAGE_FAULT_GUARD_PAGE # define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS) 0x00000113L) #endif #ifndef STATUS_PAGE_FAULT_PAGING_FILE # define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS) 0x00000114L) #endif #ifndef STATUS_CACHE_PAGE_LOCKED # define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS) 0x00000115L) #endif #ifndef STATUS_CRASH_DUMP # define STATUS_CRASH_DUMP ((NTSTATUS) 0x00000116L) #endif #ifndef STATUS_BUFFER_ALL_ZEROS # define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS) 0x00000117L) #endif #ifndef STATUS_REPARSE_OBJECT # define STATUS_REPARSE_OBJECT ((NTSTATUS) 0x00000118L) #endif #ifndef STATUS_RESOURCE_REQUIREMENTS_CHANGED # define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS) 0x00000119L) #endif #ifndef STATUS_TRANSLATION_COMPLETE # define STATUS_TRANSLATION_COMPLETE ((NTSTATUS) 0x00000120L) #endif #ifndef STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY # define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS) 0x00000121L) #endif #ifndef STATUS_NOTHING_TO_TERMINATE # define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS) 0x00000122L) #endif #ifndef STATUS_PROCESS_NOT_IN_JOB # define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS) 0x00000123L) #endif #ifndef STATUS_PROCESS_IN_JOB # define STATUS_PROCESS_IN_JOB ((NTSTATUS) 0x00000124L) #endif #ifndef STATUS_VOLSNAP_HIBERNATE_READY # define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS) 0x00000125L) #endif #ifndef STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY # define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS) 0x00000126L) #endif #ifndef STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED # define STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED ((NTSTATUS) 0x00000127L) #endif #ifndef STATUS_INTERRUPT_STILL_CONNECTED # define STATUS_INTERRUPT_STILL_CONNECTED ((NTSTATUS) 0x00000128L) #endif #ifndef STATUS_PROCESS_CLONED # define STATUS_PROCESS_CLONED ((NTSTATUS) 0x00000129L) #endif #ifndef STATUS_FILE_LOCKED_WITH_ONLY_READERS # define STATUS_FILE_LOCKED_WITH_ONLY_READERS ((NTSTATUS) 0x0000012AL) #endif #ifndef STATUS_FILE_LOCKED_WITH_WRITERS # define STATUS_FILE_LOCKED_WITH_WRITERS ((NTSTATUS) 0x0000012BL) #endif #ifndef STATUS_RESOURCEMANAGER_READ_ONLY # define STATUS_RESOURCEMANAGER_READ_ONLY ((NTSTATUS) 0x00000202L) #endif #ifndef STATUS_RING_PREVIOUSLY_EMPTY # define STATUS_RING_PREVIOUSLY_EMPTY ((NTSTATUS) 0x00000210L) #endif #ifndef STATUS_RING_PREVIOUSLY_FULL # define STATUS_RING_PREVIOUSLY_FULL ((NTSTATUS) 0x00000211L) #endif #ifndef STATUS_RING_PREVIOUSLY_ABOVE_QUOTA # define STATUS_RING_PREVIOUSLY_ABOVE_QUOTA ((NTSTATUS) 0x00000212L) #endif #ifndef STATUS_RING_NEWLY_EMPTY # define STATUS_RING_NEWLY_EMPTY ((NTSTATUS) 0x00000213L) #endif #ifndef STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT # define STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT ((NTSTATUS) 0x00000214L) #endif #ifndef STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE # define STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE ((NTSTATUS) 0x00000215L) #endif #ifndef STATUS_OPLOCK_HANDLE_CLOSED # define STATUS_OPLOCK_HANDLE_CLOSED ((NTSTATUS) 0x00000216L) #endif #ifndef STATUS_WAIT_FOR_OPLOCK # define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS) 0x00000367L) #endif #ifndef STATUS_OBJECT_NAME_EXISTS # define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000L) #endif #ifndef STATUS_THREAD_WAS_SUSPENDED # define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS) 0x40000001L) #endif #ifndef STATUS_WORKING_SET_LIMIT_RANGE # define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS) 0x40000002L) #endif #ifndef STATUS_IMAGE_NOT_AT_BASE # define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS) 0x40000003L) #endif #ifndef STATUS_RXACT_STATE_CREATED # define STATUS_RXACT_STATE_CREATED ((NTSTATUS) 0x40000004L) #endif #ifndef STATUS_SEGMENT_NOTIFICATION # define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS) 0x40000005L) #endif #ifndef STATUS_LOCAL_USER_SESSION_KEY # define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS) 0x40000006L) #endif #ifndef STATUS_BAD_CURRENT_DIRECTORY # define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS) 0x40000007L) #endif #ifndef STATUS_SERIAL_MORE_WRITES # define STATUS_SERIAL_MORE_WRITES ((NTSTATUS) 0x40000008L) #endif #ifndef STATUS_REGISTRY_RECOVERED # define STATUS_REGISTRY_RECOVERED ((NTSTATUS) 0x40000009L) #endif #ifndef STATUS_FT_READ_RECOVERY_FROM_BACKUP # define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS) 0x4000000AL) #endif #ifndef STATUS_FT_WRITE_RECOVERY # define STATUS_FT_WRITE_RECOVERY ((NTSTATUS) 0x4000000BL) #endif #ifndef STATUS_SERIAL_COUNTER_TIMEOUT # define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS) 0x4000000CL) #endif #ifndef STATUS_NULL_LM_PASSWORD # define STATUS_NULL_LM_PASSWORD ((NTSTATUS) 0x4000000DL) #endif #ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH # define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS) 0x4000000EL) #endif #ifndef STATUS_RECEIVE_PARTIAL # define STATUS_RECEIVE_PARTIAL ((NTSTATUS) 0x4000000FL) #endif #ifndef STATUS_RECEIVE_EXPEDITED # define STATUS_RECEIVE_EXPEDITED ((NTSTATUS) 0x40000010L) #endif #ifndef STATUS_RECEIVE_PARTIAL_EXPEDITED # define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS) 0x40000011L) #endif #ifndef STATUS_EVENT_DONE # define STATUS_EVENT_DONE ((NTSTATUS) 0x40000012L) #endif #ifndef STATUS_EVENT_PENDING # define STATUS_EVENT_PENDING ((NTSTATUS) 0x40000013L) #endif #ifndef STATUS_CHECKING_FILE_SYSTEM # define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS) 0x40000014L) #endif #ifndef STATUS_FATAL_APP_EXIT # define STATUS_FATAL_APP_EXIT ((NTSTATUS) 0x40000015L) #endif #ifndef STATUS_PREDEFINED_HANDLE # define STATUS_PREDEFINED_HANDLE ((NTSTATUS) 0x40000016L) #endif #ifndef STATUS_WAS_UNLOCKED # define STATUS_WAS_UNLOCKED ((NTSTATUS) 0x40000017L) #endif #ifndef STATUS_SERVICE_NOTIFICATION # define STATUS_SERVICE_NOTIFICATION ((NTSTATUS) 0x40000018L) #endif #ifndef STATUS_WAS_LOCKED # define STATUS_WAS_LOCKED ((NTSTATUS) 0x40000019L) #endif #ifndef STATUS_LOG_HARD_ERROR # define STATUS_LOG_HARD_ERROR ((NTSTATUS) 0x4000001AL) #endif #ifndef STATUS_ALREADY_WIN32 # define STATUS_ALREADY_WIN32 ((NTSTATUS) 0x4000001BL) #endif #ifndef STATUS_WX86_UNSIMULATE # define STATUS_WX86_UNSIMULATE ((NTSTATUS) 0x4000001CL) #endif #ifndef STATUS_WX86_CONTINUE # define STATUS_WX86_CONTINUE ((NTSTATUS) 0x4000001DL) #endif #ifndef STATUS_WX86_SINGLE_STEP # define STATUS_WX86_SINGLE_STEP ((NTSTATUS) 0x4000001EL) #endif #ifndef STATUS_WX86_BREAKPOINT # define STATUS_WX86_BREAKPOINT ((NTSTATUS) 0x4000001FL) #endif #ifndef STATUS_WX86_EXCEPTION_CONTINUE # define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS) 0x40000020L) #endif #ifndef STATUS_WX86_EXCEPTION_LASTCHANCE # define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS) 0x40000021L) #endif #ifndef STATUS_WX86_EXCEPTION_CHAIN # define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS) 0x40000022L) #endif #ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE # define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS) 0x40000023L) #endif #ifndef STATUS_NO_YIELD_PERFORMED # define STATUS_NO_YIELD_PERFORMED ((NTSTATUS) 0x40000024L) #endif #ifndef STATUS_TIMER_RESUME_IGNORED # define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS) 0x40000025L) #endif #ifndef STATUS_ARBITRATION_UNHANDLED # define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS) 0x40000026L) #endif #ifndef STATUS_CARDBUS_NOT_SUPPORTED # define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS) 0x40000027L) #endif #ifndef STATUS_WX86_CREATEWX86TIB # define STATUS_WX86_CREATEWX86TIB ((NTSTATUS) 0x40000028L) #endif #ifndef STATUS_MP_PROCESSOR_MISMATCH # define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS) 0x40000029L) #endif #ifndef STATUS_HIBERNATED # define STATUS_HIBERNATED ((NTSTATUS) 0x4000002AL) #endif #ifndef STATUS_RESUME_HIBERNATION # define STATUS_RESUME_HIBERNATION ((NTSTATUS) 0x4000002BL) #endif #ifndef STATUS_FIRMWARE_UPDATED # define STATUS_FIRMWARE_UPDATED ((NTSTATUS) 0x4000002CL) #endif #ifndef STATUS_DRIVERS_LEAKING_LOCKED_PAGES # define STATUS_DRIVERS_LEAKING_LOCKED_PAGES ((NTSTATUS) 0x4000002DL) #endif #ifndef STATUS_MESSAGE_RETRIEVED # define STATUS_MESSAGE_RETRIEVED ((NTSTATUS) 0x4000002EL) #endif #ifndef STATUS_SYSTEM_POWERSTATE_TRANSITION # define STATUS_SYSTEM_POWERSTATE_TRANSITION ((NTSTATUS) 0x4000002FL) #endif #ifndef STATUS_ALPC_CHECK_COMPLETION_LIST # define STATUS_ALPC_CHECK_COMPLETION_LIST ((NTSTATUS) 0x40000030L) #endif #ifndef STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION # define STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION ((NTSTATUS) 0x40000031L) #endif #ifndef STATUS_ACCESS_AUDIT_BY_POLICY # define STATUS_ACCESS_AUDIT_BY_POLICY ((NTSTATUS) 0x40000032L) #endif #ifndef STATUS_ABANDON_HIBERFILE # define STATUS_ABANDON_HIBERFILE ((NTSTATUS) 0x40000033L) #endif #ifndef STATUS_BIZRULES_NOT_ENABLED # define STATUS_BIZRULES_NOT_ENABLED ((NTSTATUS) 0x40000034L) #endif #ifndef STATUS_GUARD_PAGE_VIOLATION # define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS) 0x80000001L) #endif #ifndef STATUS_DATATYPE_MISALIGNMENT # define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS) 0x80000002L) #endif #ifndef STATUS_BREAKPOINT # define STATUS_BREAKPOINT ((NTSTATUS) 0x80000003L) #endif #ifndef STATUS_SINGLE_STEP # define STATUS_SINGLE_STEP ((NTSTATUS) 0x80000004L) #endif #ifndef STATUS_BUFFER_OVERFLOW # define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005L) #endif #ifndef STATUS_NO_MORE_FILES # define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006L) #endif #ifndef STATUS_WAKE_SYSTEM_DEBUGGER # define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS) 0x80000007L) #endif #ifndef STATUS_HANDLES_CLOSED # define STATUS_HANDLES_CLOSED ((NTSTATUS) 0x8000000AL) #endif #ifndef STATUS_NO_INHERITANCE # define STATUS_NO_INHERITANCE ((NTSTATUS) 0x8000000BL) #endif #ifndef STATUS_GUID_SUBSTITUTION_MADE # define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS) 0x8000000CL) #endif #ifndef STATUS_PARTIAL_COPY # define STATUS_PARTIAL_COPY ((NTSTATUS) 0x8000000DL) #endif #ifndef STATUS_DEVICE_PAPER_EMPTY # define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS) 0x8000000EL) #endif #ifndef STATUS_DEVICE_POWERED_OFF # define STATUS_DEVICE_POWERED_OFF ((NTSTATUS) 0x8000000FL) #endif #ifndef STATUS_DEVICE_OFF_LINE # define STATUS_DEVICE_OFF_LINE ((NTSTATUS) 0x80000010L) #endif #ifndef STATUS_DEVICE_BUSY # define STATUS_DEVICE_BUSY ((NTSTATUS) 0x80000011L) #endif #ifndef STATUS_NO_MORE_EAS # define STATUS_NO_MORE_EAS ((NTSTATUS) 0x80000012L) #endif #ifndef STATUS_INVALID_EA_NAME # define STATUS_INVALID_EA_NAME ((NTSTATUS) 0x80000013L) #endif #ifndef STATUS_EA_LIST_INCONSISTENT # define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS) 0x80000014L) #endif #ifndef STATUS_INVALID_EA_FLAG # define STATUS_INVALID_EA_FLAG ((NTSTATUS) 0x80000015L) #endif #ifndef STATUS_VERIFY_REQUIRED # define STATUS_VERIFY_REQUIRED ((NTSTATUS) 0x80000016L) #endif #ifndef STATUS_EXTRANEOUS_INFORMATION # define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS) 0x80000017L) #endif #ifndef STATUS_RXACT_COMMIT_NECESSARY # define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS) 0x80000018L) #endif #ifndef STATUS_NO_MORE_ENTRIES # define STATUS_NO_MORE_ENTRIES ((NTSTATUS) 0x8000001AL) #endif #ifndef STATUS_FILEMARK_DETECTED # define STATUS_FILEMARK_DETECTED ((NTSTATUS) 0x8000001BL) #endif #ifndef STATUS_MEDIA_CHANGED # define STATUS_MEDIA_CHANGED ((NTSTATUS) 0x8000001CL) #endif #ifndef STATUS_BUS_RESET # define STATUS_BUS_RESET ((NTSTATUS) 0x8000001DL) #endif #ifndef STATUS_END_OF_MEDIA # define STATUS_END_OF_MEDIA ((NTSTATUS) 0x8000001EL) #endif #ifndef STATUS_BEGINNING_OF_MEDIA # define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS) 0x8000001FL) #endif #ifndef STATUS_MEDIA_CHECK # define STATUS_MEDIA_CHECK ((NTSTATUS) 0x80000020L) #endif #ifndef STATUS_SETMARK_DETECTED # define STATUS_SETMARK_DETECTED ((NTSTATUS) 0x80000021L) #endif #ifndef STATUS_NO_DATA_DETECTED # define STATUS_NO_DATA_DETECTED ((NTSTATUS) 0x80000022L) #endif #ifndef STATUS_REDIRECTOR_HAS_OPEN_HANDLES # define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000023L) #endif #ifndef STATUS_SERVER_HAS_OPEN_HANDLES # define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000024L) #endif #ifndef STATUS_ALREADY_DISCONNECTED # define STATUS_ALREADY_DISCONNECTED ((NTSTATUS) 0x80000025L) #endif #ifndef STATUS_LONGJUMP # define STATUS_LONGJUMP ((NTSTATUS) 0x80000026L) #endif #ifndef STATUS_CLEANER_CARTRIDGE_INSTALLED # define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS) 0x80000027L) #endif #ifndef STATUS_PLUGPLAY_QUERY_VETOED # define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS) 0x80000028L) #endif #ifndef STATUS_UNWIND_CONSOLIDATE # define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS) 0x80000029L) #endif #ifndef STATUS_REGISTRY_HIVE_RECOVERED # define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS) 0x8000002AL) #endif #ifndef STATUS_DLL_MIGHT_BE_INSECURE # define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS) 0x8000002BL) #endif #ifndef STATUS_DLL_MIGHT_BE_INCOMPATIBLE # define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS) 0x8000002CL) #endif #ifndef STATUS_STOPPED_ON_SYMLINK # define STATUS_STOPPED_ON_SYMLINK ((NTSTATUS) 0x8000002DL) #endif #ifndef STATUS_CANNOT_GRANT_REQUESTED_OPLOCK # define STATUS_CANNOT_GRANT_REQUESTED_OPLOCK ((NTSTATUS) 0x8000002EL) #endif #ifndef STATUS_NO_ACE_CONDITION # define STATUS_NO_ACE_CONDITION ((NTSTATUS) 0x8000002FL) #endif #ifndef STATUS_UNSUCCESSFUL # define STATUS_UNSUCCESSFUL ((NTSTATUS) 0xC0000001L) #endif #ifndef STATUS_NOT_IMPLEMENTED # define STATUS_NOT_IMPLEMENTED ((NTSTATUS) 0xC0000002L) #endif #ifndef STATUS_INVALID_INFO_CLASS # define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xC0000003L) #endif #ifndef STATUS_INFO_LENGTH_MISMATCH # define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004L) #endif #ifndef STATUS_ACCESS_VIOLATION # define STATUS_ACCESS_VIOLATION ((NTSTATUS) 0xC0000005L) #endif #ifndef STATUS_IN_PAGE_ERROR # define STATUS_IN_PAGE_ERROR ((NTSTATUS) 0xC0000006L) #endif #ifndef STATUS_PAGEFILE_QUOTA # define STATUS_PAGEFILE_QUOTA ((NTSTATUS) 0xC0000007L) #endif #ifndef STATUS_INVALID_HANDLE # define STATUS_INVALID_HANDLE ((NTSTATUS) 0xC0000008L) #endif #ifndef STATUS_BAD_INITIAL_STACK # define STATUS_BAD_INITIAL_STACK ((NTSTATUS) 0xC0000009L) #endif #ifndef STATUS_BAD_INITIAL_PC # define STATUS_BAD_INITIAL_PC ((NTSTATUS) 0xC000000AL) #endif #ifndef STATUS_INVALID_CID # define STATUS_INVALID_CID ((NTSTATUS) 0xC000000BL) #endif #ifndef STATUS_TIMER_NOT_CANCELED # define STATUS_TIMER_NOT_CANCELED ((NTSTATUS) 0xC000000CL) #endif #ifndef STATUS_INVALID_PARAMETER # define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xC000000DL) #endif #ifndef STATUS_NO_SUCH_DEVICE # define STATUS_NO_SUCH_DEVICE ((NTSTATUS) 0xC000000EL) #endif #ifndef STATUS_NO_SUCH_FILE # define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xC000000FL) #endif #ifndef STATUS_INVALID_DEVICE_REQUEST # define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xC0000010L) #endif #ifndef STATUS_END_OF_FILE # define STATUS_END_OF_FILE ((NTSTATUS) 0xC0000011L) #endif #ifndef STATUS_WRONG_VOLUME # define STATUS_WRONG_VOLUME ((NTSTATUS) 0xC0000012L) #endif #ifndef STATUS_NO_MEDIA_IN_DEVICE # define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xC0000013L) #endif #ifndef STATUS_UNRECOGNIZED_MEDIA # define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS) 0xC0000014L) #endif #ifndef STATUS_NONEXISTENT_SECTOR # define STATUS_NONEXISTENT_SECTOR ((NTSTATUS) 0xC0000015L) #endif #ifndef STATUS_MORE_PROCESSING_REQUIRED # define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS) 0xC0000016L) #endif #ifndef STATUS_NO_MEMORY # define STATUS_NO_MEMORY ((NTSTATUS) 0xC0000017L) #endif #ifndef STATUS_CONFLICTING_ADDRESSES # define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS) 0xC0000018L) #endif #ifndef STATUS_NOT_MAPPED_VIEW # define STATUS_NOT_MAPPED_VIEW ((NTSTATUS) 0xC0000019L) #endif #ifndef STATUS_UNABLE_TO_FREE_VM # define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS) 0xC000001AL) #endif #ifndef STATUS_UNABLE_TO_DELETE_SECTION # define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS) 0xC000001BL) #endif #ifndef STATUS_INVALID_SYSTEM_SERVICE # define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS) 0xC000001CL) #endif #ifndef STATUS_ILLEGAL_INSTRUCTION # define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS) 0xC000001DL) #endif #ifndef STATUS_INVALID_LOCK_SEQUENCE # define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS) 0xC000001EL) #endif #ifndef STATUS_INVALID_VIEW_SIZE # define STATUS_INVALID_VIEW_SIZE ((NTSTATUS) 0xC000001FL) #endif #ifndef STATUS_INVALID_FILE_FOR_SECTION # define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS) 0xC0000020L) #endif #ifndef STATUS_ALREADY_COMMITTED # define STATUS_ALREADY_COMMITTED ((NTSTATUS) 0xC0000021L) #endif #ifndef STATUS_ACCESS_DENIED # define STATUS_ACCESS_DENIED ((NTSTATUS) 0xC0000022L) #endif #ifndef STATUS_BUFFER_TOO_SMALL # define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xC0000023L) #endif #ifndef STATUS_OBJECT_TYPE_MISMATCH # define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS) 0xC0000024L) #endif #ifndef STATUS_NONCONTINUABLE_EXCEPTION # define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS) 0xC0000025L) #endif #ifndef STATUS_INVALID_DISPOSITION # define STATUS_INVALID_DISPOSITION ((NTSTATUS) 0xC0000026L) #endif #ifndef STATUS_UNWIND # define STATUS_UNWIND ((NTSTATUS) 0xC0000027L) #endif #ifndef STATUS_BAD_STACK # define STATUS_BAD_STACK ((NTSTATUS) 0xC0000028L) #endif #ifndef STATUS_INVALID_UNWIND_TARGET # define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS) 0xC0000029L) #endif #ifndef STATUS_NOT_LOCKED # define STATUS_NOT_LOCKED ((NTSTATUS) 0xC000002AL) #endif #ifndef STATUS_PARITY_ERROR # define STATUS_PARITY_ERROR ((NTSTATUS) 0xC000002BL) #endif #ifndef STATUS_UNABLE_TO_DECOMMIT_VM # define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS) 0xC000002CL) #endif #ifndef STATUS_NOT_COMMITTED # define STATUS_NOT_COMMITTED ((NTSTATUS) 0xC000002DL) #endif #ifndef STATUS_INVALID_PORT_ATTRIBUTES # define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS) 0xC000002EL) #endif #ifndef STATUS_PORT_MESSAGE_TOO_LONG # define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS) 0xC000002FL) #endif #ifndef STATUS_INVALID_PARAMETER_MIX # define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS) 0xC0000030L) #endif #ifndef STATUS_INVALID_QUOTA_LOWER # define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS) 0xC0000031L) #endif #ifndef STATUS_DISK_CORRUPT_ERROR # define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS) 0xC0000032L) #endif #ifndef STATUS_OBJECT_NAME_INVALID # define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xC0000033L) #endif #ifndef STATUS_OBJECT_NAME_NOT_FOUND # define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xC0000034L) #endif #ifndef STATUS_OBJECT_NAME_COLLISION # define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS) 0xC0000035L) #endif #ifndef STATUS_PORT_DISCONNECTED # define STATUS_PORT_DISCONNECTED ((NTSTATUS) 0xC0000037L) #endif #ifndef STATUS_DEVICE_ALREADY_ATTACHED # define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS) 0xC0000038L) #endif #ifndef STATUS_OBJECT_PATH_INVALID # define STATUS_OBJECT_PATH_INVALID ((NTSTATUS) 0xC0000039L) #endif #ifndef STATUS_OBJECT_PATH_NOT_FOUND # define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xC000003AL) #endif #ifndef STATUS_OBJECT_PATH_SYNTAX_BAD # define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS) 0xC000003BL) #endif #ifndef STATUS_DATA_OVERRUN # define STATUS_DATA_OVERRUN ((NTSTATUS) 0xC000003CL) #endif #ifndef STATUS_DATA_LATE_ERROR # define STATUS_DATA_LATE_ERROR ((NTSTATUS) 0xC000003DL) #endif #ifndef STATUS_DATA_ERROR # define STATUS_DATA_ERROR ((NTSTATUS) 0xC000003EL) #endif #ifndef STATUS_CRC_ERROR # define STATUS_CRC_ERROR ((NTSTATUS) 0xC000003FL) #endif #ifndef STATUS_SECTION_TOO_BIG # define STATUS_SECTION_TOO_BIG ((NTSTATUS) 0xC0000040L) #endif #ifndef STATUS_PORT_CONNECTION_REFUSED # define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS) 0xC0000041L) #endif #ifndef STATUS_INVALID_PORT_HANDLE # define STATUS_INVALID_PORT_HANDLE ((NTSTATUS) 0xC0000042L) #endif #ifndef STATUS_SHARING_VIOLATION # define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xC0000043L) #endif #ifndef STATUS_QUOTA_EXCEEDED # define STATUS_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000044L) #endif #ifndef STATUS_INVALID_PAGE_PROTECTION # define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS) 0xC0000045L) #endif #ifndef STATUS_MUTANT_NOT_OWNED # define STATUS_MUTANT_NOT_OWNED ((NTSTATUS) 0xC0000046L) #endif #ifndef STATUS_SEMAPHORE_LIMIT_EXCEEDED # define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000047L) #endif #ifndef STATUS_PORT_ALREADY_SET # define STATUS_PORT_ALREADY_SET ((NTSTATUS) 0xC0000048L) #endif #ifndef STATUS_SECTION_NOT_IMAGE # define STATUS_SECTION_NOT_IMAGE ((NTSTATUS) 0xC0000049L) #endif #ifndef STATUS_SUSPEND_COUNT_EXCEEDED # define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS) 0xC000004AL) #endif #ifndef STATUS_THREAD_IS_TERMINATING # define STATUS_THREAD_IS_TERMINATING ((NTSTATUS) 0xC000004BL) #endif #ifndef STATUS_BAD_WORKING_SET_LIMIT # define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS) 0xC000004CL) #endif #ifndef STATUS_INCOMPATIBLE_FILE_MAP # define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS) 0xC000004DL) #endif #ifndef STATUS_SECTION_PROTECTION # define STATUS_SECTION_PROTECTION ((NTSTATUS) 0xC000004EL) #endif #ifndef STATUS_EAS_NOT_SUPPORTED # define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS) 0xC000004FL) #endif #ifndef STATUS_EA_TOO_LARGE # define STATUS_EA_TOO_LARGE ((NTSTATUS) 0xC0000050L) #endif #ifndef STATUS_NONEXISTENT_EA_ENTRY # define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS) 0xC0000051L) #endif #ifndef STATUS_NO_EAS_ON_FILE # define STATUS_NO_EAS_ON_FILE ((NTSTATUS) 0xC0000052L) #endif #ifndef STATUS_EA_CORRUPT_ERROR # define STATUS_EA_CORRUPT_ERROR ((NTSTATUS) 0xC0000053L) #endif #ifndef STATUS_FILE_LOCK_CONFLICT # define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS) 0xC0000054L) #endif #ifndef STATUS_LOCK_NOT_GRANTED # define STATUS_LOCK_NOT_GRANTED ((NTSTATUS) 0xC0000055L) #endif #ifndef STATUS_DELETE_PENDING # define STATUS_DELETE_PENDING ((NTSTATUS) 0xC0000056L) #endif #ifndef STATUS_CTL_FILE_NOT_SUPPORTED # define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS) 0xC0000057L) #endif #ifndef STATUS_UNKNOWN_REVISION # define STATUS_UNKNOWN_REVISION ((NTSTATUS) 0xC0000058L) #endif #ifndef STATUS_REVISION_MISMATCH # define STATUS_REVISION_MISMATCH ((NTSTATUS) 0xC0000059L) #endif #ifndef STATUS_INVALID_OWNER # define STATUS_INVALID_OWNER ((NTSTATUS) 0xC000005AL) #endif #ifndef STATUS_INVALID_PRIMARY_GROUP # define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS) 0xC000005BL) #endif #ifndef STATUS_NO_IMPERSONATION_TOKEN # define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS) 0xC000005CL) #endif #ifndef STATUS_CANT_DISABLE_MANDATORY # define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS) 0xC000005DL) #endif #ifndef STATUS_NO_LOGON_SERVERS # define STATUS_NO_LOGON_SERVERS ((NTSTATUS) 0xC000005EL) #endif #ifndef STATUS_NO_SUCH_LOGON_SESSION # define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS) 0xC000005FL) #endif #ifndef STATUS_NO_SUCH_PRIVILEGE # define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS) 0xC0000060L) #endif #ifndef STATUS_PRIVILEGE_NOT_HELD # define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS) 0xC0000061L) #endif #ifndef STATUS_INVALID_ACCOUNT_NAME # define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS) 0xC0000062L) #endif #ifndef STATUS_USER_EXISTS # define STATUS_USER_EXISTS ((NTSTATUS) 0xC0000063L) #endif #ifndef STATUS_NO_SUCH_USER # define STATUS_NO_SUCH_USER ((NTSTATUS) 0xC0000064L) #endif #ifndef STATUS_GROUP_EXISTS # define STATUS_GROUP_EXISTS ((NTSTATUS) 0xC0000065L) #endif #ifndef STATUS_NO_SUCH_GROUP # define STATUS_NO_SUCH_GROUP ((NTSTATUS) 0xC0000066L) #endif #ifndef STATUS_MEMBER_IN_GROUP # define STATUS_MEMBER_IN_GROUP ((NTSTATUS) 0xC0000067L) #endif #ifndef STATUS_MEMBER_NOT_IN_GROUP # define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS) 0xC0000068L) #endif #ifndef STATUS_LAST_ADMIN # define STATUS_LAST_ADMIN ((NTSTATUS) 0xC0000069L) #endif #ifndef STATUS_WRONG_PASSWORD # define STATUS_WRONG_PASSWORD ((NTSTATUS) 0xC000006AL) #endif #ifndef STATUS_ILL_FORMED_PASSWORD # define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS) 0xC000006BL) #endif #ifndef STATUS_PASSWORD_RESTRICTION # define STATUS_PASSWORD_RESTRICTION ((NTSTATUS) 0xC000006CL) #endif #ifndef STATUS_LOGON_FAILURE # define STATUS_LOGON_FAILURE ((NTSTATUS) 0xC000006DL) #endif #ifndef STATUS_ACCOUNT_RESTRICTION # define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS) 0xC000006EL) #endif #ifndef STATUS_INVALID_LOGON_HOURS # define STATUS_INVALID_LOGON_HOURS ((NTSTATUS) 0xC000006FL) #endif #ifndef STATUS_INVALID_WORKSTATION # define STATUS_INVALID_WORKSTATION ((NTSTATUS) 0xC0000070L) #endif #ifndef STATUS_PASSWORD_EXPIRED # define STATUS_PASSWORD_EXPIRED ((NTSTATUS) 0xC0000071L) #endif #ifndef STATUS_ACCOUNT_DISABLED # define STATUS_ACCOUNT_DISABLED ((NTSTATUS) 0xC0000072L) #endif #ifndef STATUS_NONE_MAPPED # define STATUS_NONE_MAPPED ((NTSTATUS) 0xC0000073L) #endif #ifndef STATUS_TOO_MANY_LUIDS_REQUESTED # define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS) 0xC0000074L) #endif #ifndef STATUS_LUIDS_EXHAUSTED # define STATUS_LUIDS_EXHAUSTED ((NTSTATUS) 0xC0000075L) #endif #ifndef STATUS_INVALID_SUB_AUTHORITY # define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS) 0xC0000076L) #endif #ifndef STATUS_INVALID_ACL # define STATUS_INVALID_ACL ((NTSTATUS) 0xC0000077L) #endif #ifndef STATUS_INVALID_SID # define STATUS_INVALID_SID ((NTSTATUS) 0xC0000078L) #endif #ifndef STATUS_INVALID_SECURITY_DESCR # define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS) 0xC0000079L) #endif #ifndef STATUS_PROCEDURE_NOT_FOUND # define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS) 0xC000007AL) #endif #ifndef STATUS_INVALID_IMAGE_FORMAT # define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS) 0xC000007BL) #endif #ifndef STATUS_NO_TOKEN # define STATUS_NO_TOKEN ((NTSTATUS) 0xC000007CL) #endif #ifndef STATUS_BAD_INHERITANCE_ACL # define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS) 0xC000007DL) #endif #ifndef STATUS_RANGE_NOT_LOCKED # define STATUS_RANGE_NOT_LOCKED ((NTSTATUS) 0xC000007EL) #endif #ifndef STATUS_DISK_FULL # define STATUS_DISK_FULL ((NTSTATUS) 0xC000007FL) #endif #ifndef STATUS_SERVER_DISABLED # define STATUS_SERVER_DISABLED ((NTSTATUS) 0xC0000080L) #endif #ifndef STATUS_SERVER_NOT_DISABLED # define STATUS_SERVER_NOT_DISABLED ((NTSTATUS) 0xC0000081L) #endif #ifndef STATUS_TOO_MANY_GUIDS_REQUESTED # define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS) 0xC0000082L) #endif #ifndef STATUS_GUIDS_EXHAUSTED # define STATUS_GUIDS_EXHAUSTED ((NTSTATUS) 0xC0000083L) #endif #ifndef STATUS_INVALID_ID_AUTHORITY # define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS) 0xC0000084L) #endif #ifndef STATUS_AGENTS_EXHAUSTED # define STATUS_AGENTS_EXHAUSTED ((NTSTATUS) 0xC0000085L) #endif #ifndef STATUS_INVALID_VOLUME_LABEL # define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS) 0xC0000086L) #endif #ifndef STATUS_SECTION_NOT_EXTENDED # define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS) 0xC0000087L) #endif #ifndef STATUS_NOT_MAPPED_DATA # define STATUS_NOT_MAPPED_DATA ((NTSTATUS) 0xC0000088L) #endif #ifndef STATUS_RESOURCE_DATA_NOT_FOUND # define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS) 0xC0000089L) #endif #ifndef STATUS_RESOURCE_TYPE_NOT_FOUND # define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS) 0xC000008AL) #endif #ifndef STATUS_RESOURCE_NAME_NOT_FOUND # define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS) 0xC000008BL) #endif #ifndef STATUS_ARRAY_BOUNDS_EXCEEDED # define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS) 0xC000008CL) #endif #ifndef STATUS_FLOAT_DENORMAL_OPERAND # define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS) 0xC000008DL) #endif #ifndef STATUS_FLOAT_DIVIDE_BY_ZERO # define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS) 0xC000008EL) #endif #ifndef STATUS_FLOAT_INEXACT_RESULT # define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS) 0xC000008FL) #endif #ifndef STATUS_FLOAT_INVALID_OPERATION # define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS) 0xC0000090L) #endif #ifndef STATUS_FLOAT_OVERFLOW # define STATUS_FLOAT_OVERFLOW ((NTSTATUS) 0xC0000091L) #endif #ifndef STATUS_FLOAT_STACK_CHECK # define STATUS_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000092L) #endif #ifndef STATUS_FLOAT_UNDERFLOW # define STATUS_FLOAT_UNDERFLOW ((NTSTATUS) 0xC0000093L) #endif #ifndef STATUS_INTEGER_DIVIDE_BY_ZERO # define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS) 0xC0000094L) #endif #ifndef STATUS_INTEGER_OVERFLOW # define STATUS_INTEGER_OVERFLOW ((NTSTATUS) 0xC0000095L) #endif #ifndef STATUS_PRIVILEGED_INSTRUCTION # define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS) 0xC0000096L) #endif #ifndef STATUS_TOO_MANY_PAGING_FILES # define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS) 0xC0000097L) #endif #ifndef STATUS_FILE_INVALID # define STATUS_FILE_INVALID ((NTSTATUS) 0xC0000098L) #endif #ifndef STATUS_ALLOTTED_SPACE_EXCEEDED # define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS) 0xC0000099L) #endif #ifndef STATUS_INSUFFICIENT_RESOURCES # define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS) 0xC000009AL) #endif #ifndef STATUS_DFS_EXIT_PATH_FOUND # define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS) 0xC000009BL) #endif #ifndef STATUS_DEVICE_DATA_ERROR # define STATUS_DEVICE_DATA_ERROR ((NTSTATUS) 0xC000009CL) #endif #ifndef STATUS_DEVICE_NOT_CONNECTED # define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS) 0xC000009DL) #endif #ifndef STATUS_DEVICE_POWER_FAILURE # define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS) 0xC000009EL) #endif #ifndef STATUS_FREE_VM_NOT_AT_BASE # define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS) 0xC000009FL) #endif #ifndef STATUS_MEMORY_NOT_ALLOCATED # define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS) 0xC00000A0L) #endif #ifndef STATUS_WORKING_SET_QUOTA # define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xC00000A1L) #endif #ifndef STATUS_MEDIA_WRITE_PROTECTED # define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS) 0xC00000A2L) #endif #ifndef STATUS_DEVICE_NOT_READY # define STATUS_DEVICE_NOT_READY ((NTSTATUS) 0xC00000A3L) #endif #ifndef STATUS_INVALID_GROUP_ATTRIBUTES # define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS) 0xC00000A4L) #endif #ifndef STATUS_BAD_IMPERSONATION_LEVEL # define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS) 0xC00000A5L) #endif #ifndef STATUS_CANT_OPEN_ANONYMOUS # define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS) 0xC00000A6L) #endif #ifndef STATUS_BAD_VALIDATION_CLASS # define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS) 0xC00000A7L) #endif #ifndef STATUS_BAD_TOKEN_TYPE # define STATUS_BAD_TOKEN_TYPE ((NTSTATUS) 0xC00000A8L) #endif #ifndef STATUS_BAD_MASTER_BOOT_RECORD # define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS) 0xC00000A9L) #endif #ifndef STATUS_INSTRUCTION_MISALIGNMENT # define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS) 0xC00000AAL) #endif #ifndef STATUS_INSTANCE_NOT_AVAILABLE # define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ABL) #endif #ifndef STATUS_PIPE_NOT_AVAILABLE # define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ACL) #endif #ifndef STATUS_INVALID_PIPE_STATE # define STATUS_INVALID_PIPE_STATE ((NTSTATUS) 0xC00000ADL) #endif #ifndef STATUS_PIPE_BUSY # define STATUS_PIPE_BUSY ((NTSTATUS) 0xC00000AEL) #endif #ifndef STATUS_ILLEGAL_FUNCTION # define STATUS_ILLEGAL_FUNCTION ((NTSTATUS) 0xC00000AFL) #endif #ifndef STATUS_PIPE_DISCONNECTED # define STATUS_PIPE_DISCONNECTED ((NTSTATUS) 0xC00000B0L) #endif #ifndef STATUS_PIPE_CLOSING # define STATUS_PIPE_CLOSING ((NTSTATUS) 0xC00000B1L) #endif #ifndef STATUS_PIPE_CONNECTED # define STATUS_PIPE_CONNECTED ((NTSTATUS) 0xC00000B2L) #endif #ifndef STATUS_PIPE_LISTENING # define STATUS_PIPE_LISTENING ((NTSTATUS) 0xC00000B3L) #endif #ifndef STATUS_INVALID_READ_MODE # define STATUS_INVALID_READ_MODE ((NTSTATUS) 0xC00000B4L) #endif #ifndef STATUS_IO_TIMEOUT # define STATUS_IO_TIMEOUT ((NTSTATUS) 0xC00000B5L) #endif #ifndef STATUS_FILE_FORCED_CLOSED # define STATUS_FILE_FORCED_CLOSED ((NTSTATUS) 0xC00000B6L) #endif #ifndef STATUS_PROFILING_NOT_STARTED # define STATUS_PROFILING_NOT_STARTED ((NTSTATUS) 0xC00000B7L) #endif #ifndef STATUS_PROFILING_NOT_STOPPED # define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS) 0xC00000B8L) #endif #ifndef STATUS_COULD_NOT_INTERPRET # define STATUS_COULD_NOT_INTERPRET ((NTSTATUS) 0xC00000B9L) #endif #ifndef STATUS_FILE_IS_A_DIRECTORY # define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS) 0xC00000BAL) #endif #ifndef STATUS_NOT_SUPPORTED # define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xC00000BBL) #endif #ifndef STATUS_REMOTE_NOT_LISTENING # define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS) 0xC00000BCL) #endif #ifndef STATUS_DUPLICATE_NAME # define STATUS_DUPLICATE_NAME ((NTSTATUS) 0xC00000BDL) #endif #ifndef STATUS_BAD_NETWORK_PATH # define STATUS_BAD_NETWORK_PATH ((NTSTATUS) 0xC00000BEL) #endif #ifndef STATUS_NETWORK_BUSY # define STATUS_NETWORK_BUSY ((NTSTATUS) 0xC00000BFL) #endif #ifndef STATUS_DEVICE_DOES_NOT_EXIST # define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS) 0xC00000C0L) #endif #ifndef STATUS_TOO_MANY_COMMANDS # define STATUS_TOO_MANY_COMMANDS ((NTSTATUS) 0xC00000C1L) #endif #ifndef STATUS_ADAPTER_HARDWARE_ERROR # define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS) 0xC00000C2L) #endif #ifndef STATUS_INVALID_NETWORK_RESPONSE # define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS) 0xC00000C3L) #endif #ifndef STATUS_UNEXPECTED_NETWORK_ERROR # define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS) 0xC00000C4L) #endif #ifndef STATUS_BAD_REMOTE_ADAPTER # define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS) 0xC00000C5L) #endif #ifndef STATUS_PRINT_QUEUE_FULL # define STATUS_PRINT_QUEUE_FULL ((NTSTATUS) 0xC00000C6L) #endif #ifndef STATUS_NO_SPOOL_SPACE # define STATUS_NO_SPOOL_SPACE ((NTSTATUS) 0xC00000C7L) #endif #ifndef STATUS_PRINT_CANCELLED # define STATUS_PRINT_CANCELLED ((NTSTATUS) 0xC00000C8L) #endif #ifndef STATUS_NETWORK_NAME_DELETED # define STATUS_NETWORK_NAME_DELETED ((NTSTATUS) 0xC00000C9L) #endif #ifndef STATUS_NETWORK_ACCESS_DENIED # define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS) 0xC00000CAL) #endif #ifndef STATUS_BAD_DEVICE_TYPE # define STATUS_BAD_DEVICE_TYPE ((NTSTATUS) 0xC00000CBL) #endif #ifndef STATUS_BAD_NETWORK_NAME # define STATUS_BAD_NETWORK_NAME ((NTSTATUS) 0xC00000CCL) #endif #ifndef STATUS_TOO_MANY_NAMES # define STATUS_TOO_MANY_NAMES ((NTSTATUS) 0xC00000CDL) #endif #ifndef STATUS_TOO_MANY_SESSIONS # define STATUS_TOO_MANY_SESSIONS ((NTSTATUS) 0xC00000CEL) #endif #ifndef STATUS_SHARING_PAUSED # define STATUS_SHARING_PAUSED ((NTSTATUS) 0xC00000CFL) #endif #ifndef STATUS_REQUEST_NOT_ACCEPTED # define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS) 0xC00000D0L) #endif #ifndef STATUS_REDIRECTOR_PAUSED # define STATUS_REDIRECTOR_PAUSED ((NTSTATUS) 0xC00000D1L) #endif #ifndef STATUS_NET_WRITE_FAULT # define STATUS_NET_WRITE_FAULT ((NTSTATUS) 0xC00000D2L) #endif #ifndef STATUS_PROFILING_AT_LIMIT # define STATUS_PROFILING_AT_LIMIT ((NTSTATUS) 0xC00000D3L) #endif #ifndef STATUS_NOT_SAME_DEVICE # define STATUS_NOT_SAME_DEVICE ((NTSTATUS) 0xC00000D4L) #endif #ifndef STATUS_FILE_RENAMED # define STATUS_FILE_RENAMED ((NTSTATUS) 0xC00000D5L) #endif #ifndef STATUS_VIRTUAL_CIRCUIT_CLOSED # define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS) 0xC00000D6L) #endif #ifndef STATUS_NO_SECURITY_ON_OBJECT # define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS) 0xC00000D7L) #endif #ifndef STATUS_CANT_WAIT # define STATUS_CANT_WAIT ((NTSTATUS) 0xC00000D8L) #endif #ifndef STATUS_PIPE_EMPTY # define STATUS_PIPE_EMPTY ((NTSTATUS) 0xC00000D9L) #endif #ifndef STATUS_CANT_ACCESS_DOMAIN_INFO # define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS) 0xC00000DAL) #endif #ifndef STATUS_CANT_TERMINATE_SELF # define STATUS_CANT_TERMINATE_SELF ((NTSTATUS) 0xC00000DBL) #endif #ifndef STATUS_INVALID_SERVER_STATE # define STATUS_INVALID_SERVER_STATE ((NTSTATUS) 0xC00000DCL) #endif #ifndef STATUS_INVALID_DOMAIN_STATE # define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS) 0xC00000DDL) #endif #ifndef STATUS_INVALID_DOMAIN_ROLE # define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS) 0xC00000DEL) #endif #ifndef STATUS_NO_SUCH_DOMAIN # define STATUS_NO_SUCH_DOMAIN ((NTSTATUS) 0xC00000DFL) #endif #ifndef STATUS_DOMAIN_EXISTS # define STATUS_DOMAIN_EXISTS ((NTSTATUS) 0xC00000E0L) #endif #ifndef STATUS_DOMAIN_LIMIT_EXCEEDED # define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00000E1L) #endif #ifndef STATUS_OPLOCK_NOT_GRANTED # define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS) 0xC00000E2L) #endif #ifndef STATUS_INVALID_OPLOCK_PROTOCOL # define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS) 0xC00000E3L) #endif #ifndef STATUS_INTERNAL_DB_CORRUPTION # define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS) 0xC00000E4L) #endif #ifndef STATUS_INTERNAL_ERROR # define STATUS_INTERNAL_ERROR ((NTSTATUS) 0xC00000E5L) #endif #ifndef STATUS_GENERIC_NOT_MAPPED # define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS) 0xC00000E6L) #endif #ifndef STATUS_BAD_DESCRIPTOR_FORMAT # define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS) 0xC00000E7L) #endif #ifndef STATUS_INVALID_USER_BUFFER # define STATUS_INVALID_USER_BUFFER ((NTSTATUS) 0xC00000E8L) #endif #ifndef STATUS_UNEXPECTED_IO_ERROR # define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS) 0xC00000E9L) #endif #ifndef STATUS_UNEXPECTED_MM_CREATE_ERR # define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS) 0xC00000EAL) #endif #ifndef STATUS_UNEXPECTED_MM_MAP_ERROR # define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS) 0xC00000EBL) #endif #ifndef STATUS_UNEXPECTED_MM_EXTEND_ERR # define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS) 0xC00000ECL) #endif #ifndef STATUS_NOT_LOGON_PROCESS # define STATUS_NOT_LOGON_PROCESS ((NTSTATUS) 0xC00000EDL) #endif #ifndef STATUS_LOGON_SESSION_EXISTS # define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS) 0xC00000EEL) #endif #ifndef STATUS_INVALID_PARAMETER_1 # define STATUS_INVALID_PARAMETER_1 ((NTSTATUS) 0xC00000EFL) #endif #ifndef STATUS_INVALID_PARAMETER_2 # define STATUS_INVALID_PARAMETER_2 ((NTSTATUS) 0xC00000F0L) #endif #ifndef STATUS_INVALID_PARAMETER_3 # define STATUS_INVALID_PARAMETER_3 ((NTSTATUS) 0xC00000F1L) #endif #ifndef STATUS_INVALID_PARAMETER_4 # define STATUS_INVALID_PARAMETER_4 ((NTSTATUS) 0xC00000F2L) #endif #ifndef STATUS_INVALID_PARAMETER_5 # define STATUS_INVALID_PARAMETER_5 ((NTSTATUS) 0xC00000F3L) #endif #ifndef STATUS_INVALID_PARAMETER_6 # define STATUS_INVALID_PARAMETER_6 ((NTSTATUS) 0xC00000F4L) #endif #ifndef STATUS_INVALID_PARAMETER_7 # define STATUS_INVALID_PARAMETER_7 ((NTSTATUS) 0xC00000F5L) #endif #ifndef STATUS_INVALID_PARAMETER_8 # define STATUS_INVALID_PARAMETER_8 ((NTSTATUS) 0xC00000F6L) #endif #ifndef STATUS_INVALID_PARAMETER_9 # define STATUS_INVALID_PARAMETER_9 ((NTSTATUS) 0xC00000F7L) #endif #ifndef STATUS_INVALID_PARAMETER_10 # define STATUS_INVALID_PARAMETER_10 ((NTSTATUS) 0xC00000F8L) #endif #ifndef STATUS_INVALID_PARAMETER_11 # define STATUS_INVALID_PARAMETER_11 ((NTSTATUS) 0xC00000F9L) #endif #ifndef STATUS_INVALID_PARAMETER_12 # define STATUS_INVALID_PARAMETER_12 ((NTSTATUS) 0xC00000FAL) #endif #ifndef STATUS_REDIRECTOR_NOT_STARTED # define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS) 0xC00000FBL) #endif #ifndef STATUS_REDIRECTOR_STARTED # define STATUS_REDIRECTOR_STARTED ((NTSTATUS) 0xC00000FCL) #endif #ifndef STATUS_STACK_OVERFLOW # define STATUS_STACK_OVERFLOW ((NTSTATUS) 0xC00000FDL) #endif #ifndef STATUS_NO_SUCH_PACKAGE # define STATUS_NO_SUCH_PACKAGE ((NTSTATUS) 0xC00000FEL) #endif #ifndef STATUS_BAD_FUNCTION_TABLE # define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS) 0xC00000FFL) #endif #ifndef STATUS_VARIABLE_NOT_FOUND # define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS) 0xC0000100L) #endif #ifndef STATUS_DIRECTORY_NOT_EMPTY # define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xC0000101L) #endif #ifndef STATUS_FILE_CORRUPT_ERROR # define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS) 0xC0000102L) #endif #ifndef STATUS_NOT_A_DIRECTORY # define STATUS_NOT_A_DIRECTORY ((NTSTATUS) 0xC0000103L) #endif #ifndef STATUS_BAD_LOGON_SESSION_STATE # define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS) 0xC0000104L) #endif #ifndef STATUS_LOGON_SESSION_COLLISION # define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS) 0xC0000105L) #endif #ifndef STATUS_NAME_TOO_LONG # define STATUS_NAME_TOO_LONG ((NTSTATUS) 0xC0000106L) #endif #ifndef STATUS_FILES_OPEN # define STATUS_FILES_OPEN ((NTSTATUS) 0xC0000107L) #endif #ifndef STATUS_CONNECTION_IN_USE # define STATUS_CONNECTION_IN_USE ((NTSTATUS) 0xC0000108L) #endif #ifndef STATUS_MESSAGE_NOT_FOUND # define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS) 0xC0000109L) #endif #ifndef STATUS_PROCESS_IS_TERMINATING # define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS) 0xC000010AL) #endif #ifndef STATUS_INVALID_LOGON_TYPE # define STATUS_INVALID_LOGON_TYPE ((NTSTATUS) 0xC000010BL) #endif #ifndef STATUS_NO_GUID_TRANSLATION # define STATUS_NO_GUID_TRANSLATION ((NTSTATUS) 0xC000010CL) #endif #ifndef STATUS_CANNOT_IMPERSONATE # define STATUS_CANNOT_IMPERSONATE ((NTSTATUS) 0xC000010DL) #endif #ifndef STATUS_IMAGE_ALREADY_LOADED # define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS) 0xC000010EL) #endif #ifndef STATUS_ABIOS_NOT_PRESENT # define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS) 0xC000010FL) #endif #ifndef STATUS_ABIOS_LID_NOT_EXIST # define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS) 0xC0000110L) #endif #ifndef STATUS_ABIOS_LID_ALREADY_OWNED # define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS) 0xC0000111L) #endif #ifndef STATUS_ABIOS_NOT_LID_OWNER # define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS) 0xC0000112L) #endif #ifndef STATUS_ABIOS_INVALID_COMMAND # define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS) 0xC0000113L) #endif #ifndef STATUS_ABIOS_INVALID_LID # define STATUS_ABIOS_INVALID_LID ((NTSTATUS) 0xC0000114L) #endif #ifndef STATUS_ABIOS_SELECTOR_NOT_AVAILABLE # define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS) 0xC0000115L) #endif #ifndef STATUS_ABIOS_INVALID_SELECTOR # define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS) 0xC0000116L) #endif #ifndef STATUS_NO_LDT # define STATUS_NO_LDT ((NTSTATUS) 0xC0000117L) #endif #ifndef STATUS_INVALID_LDT_SIZE # define STATUS_INVALID_LDT_SIZE ((NTSTATUS) 0xC0000118L) #endif #ifndef STATUS_INVALID_LDT_OFFSET # define STATUS_INVALID_LDT_OFFSET ((NTSTATUS) 0xC0000119L) #endif #ifndef STATUS_INVALID_LDT_DESCRIPTOR # define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS) 0xC000011AL) #endif #ifndef STATUS_INVALID_IMAGE_NE_FORMAT # define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS) 0xC000011BL) #endif #ifndef STATUS_RXACT_INVALID_STATE # define STATUS_RXACT_INVALID_STATE ((NTSTATUS) 0xC000011CL) #endif #ifndef STATUS_RXACT_COMMIT_FAILURE # define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS) 0xC000011DL) #endif #ifndef STATUS_MAPPED_FILE_SIZE_ZERO # define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS) 0xC000011EL) #endif #ifndef STATUS_TOO_MANY_OPENED_FILES # define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS) 0xC000011FL) #endif #ifndef STATUS_CANCELLED # define STATUS_CANCELLED ((NTSTATUS) 0xC0000120L) #endif #ifndef STATUS_CANNOT_DELETE # define STATUS_CANNOT_DELETE ((NTSTATUS) 0xC0000121L) #endif #ifndef STATUS_INVALID_COMPUTER_NAME # define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS) 0xC0000122L) #endif #ifndef STATUS_FILE_DELETED # define STATUS_FILE_DELETED ((NTSTATUS) 0xC0000123L) #endif #ifndef STATUS_SPECIAL_ACCOUNT # define STATUS_SPECIAL_ACCOUNT ((NTSTATUS) 0xC0000124L) #endif #ifndef STATUS_SPECIAL_GROUP # define STATUS_SPECIAL_GROUP ((NTSTATUS) 0xC0000125L) #endif #ifndef STATUS_SPECIAL_USER # define STATUS_SPECIAL_USER ((NTSTATUS) 0xC0000126L) #endif #ifndef STATUS_MEMBERS_PRIMARY_GROUP # define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS) 0xC0000127L) #endif #ifndef STATUS_FILE_CLOSED # define STATUS_FILE_CLOSED ((NTSTATUS) 0xC0000128L) #endif #ifndef STATUS_TOO_MANY_THREADS # define STATUS_TOO_MANY_THREADS ((NTSTATUS) 0xC0000129L) #endif #ifndef STATUS_THREAD_NOT_IN_PROCESS # define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS) 0xC000012AL) #endif #ifndef STATUS_TOKEN_ALREADY_IN_USE # define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS) 0xC000012BL) #endif #ifndef STATUS_PAGEFILE_QUOTA_EXCEEDED # define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS) 0xC000012CL) #endif #ifndef STATUS_COMMITMENT_LIMIT # define STATUS_COMMITMENT_LIMIT ((NTSTATUS) 0xC000012DL) #endif #ifndef STATUS_INVALID_IMAGE_LE_FORMAT # define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS) 0xC000012EL) #endif #ifndef STATUS_INVALID_IMAGE_NOT_MZ # define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS) 0xC000012FL) #endif #ifndef STATUS_INVALID_IMAGE_PROTECT # define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS) 0xC0000130L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_16 # define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS) 0xC0000131L) #endif #ifndef STATUS_LOGON_SERVER_CONFLICT # define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS) 0xC0000132L) #endif #ifndef STATUS_TIME_DIFFERENCE_AT_DC # define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS) 0xC0000133L) #endif #ifndef STATUS_SYNCHRONIZATION_REQUIRED # define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS) 0xC0000134L) #endif #ifndef STATUS_DLL_NOT_FOUND # define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xC0000135L) #endif #ifndef STATUS_OPEN_FAILED # define STATUS_OPEN_FAILED ((NTSTATUS) 0xC0000136L) #endif #ifndef STATUS_IO_PRIVILEGE_FAILED # define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS) 0xC0000137L) #endif #ifndef STATUS_ORDINAL_NOT_FOUND # define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000138L) #endif #ifndef STATUS_ENTRYPOINT_NOT_FOUND # define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000139L) #endif #ifndef STATUS_CONTROL_C_EXIT # define STATUS_CONTROL_C_EXIT ((NTSTATUS) 0xC000013AL) #endif #ifndef STATUS_LOCAL_DISCONNECT # define STATUS_LOCAL_DISCONNECT ((NTSTATUS) 0xC000013BL) #endif #ifndef STATUS_REMOTE_DISCONNECT # define STATUS_REMOTE_DISCONNECT ((NTSTATUS) 0xC000013CL) #endif #ifndef STATUS_REMOTE_RESOURCES # define STATUS_REMOTE_RESOURCES ((NTSTATUS) 0xC000013DL) #endif #ifndef STATUS_LINK_FAILED # define STATUS_LINK_FAILED ((NTSTATUS) 0xC000013EL) #endif #ifndef STATUS_LINK_TIMEOUT # define STATUS_LINK_TIMEOUT ((NTSTATUS) 0xC000013FL) #endif #ifndef STATUS_INVALID_CONNECTION # define STATUS_INVALID_CONNECTION ((NTSTATUS) 0xC0000140L) #endif #ifndef STATUS_INVALID_ADDRESS # define STATUS_INVALID_ADDRESS ((NTSTATUS) 0xC0000141L) #endif #ifndef STATUS_DLL_INIT_FAILED # define STATUS_DLL_INIT_FAILED ((NTSTATUS) 0xC0000142L) #endif #ifndef STATUS_MISSING_SYSTEMFILE # define STATUS_MISSING_SYSTEMFILE ((NTSTATUS) 0xC0000143L) #endif #ifndef STATUS_UNHANDLED_EXCEPTION # define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS) 0xC0000144L) #endif #ifndef STATUS_APP_INIT_FAILURE # define STATUS_APP_INIT_FAILURE ((NTSTATUS) 0xC0000145L) #endif #ifndef STATUS_PAGEFILE_CREATE_FAILED # define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS) 0xC0000146L) #endif #ifndef STATUS_NO_PAGEFILE # define STATUS_NO_PAGEFILE ((NTSTATUS) 0xC0000147L) #endif #ifndef STATUS_INVALID_LEVEL # define STATUS_INVALID_LEVEL ((NTSTATUS) 0xC0000148L) #endif #ifndef STATUS_WRONG_PASSWORD_CORE # define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS) 0xC0000149L) #endif #ifndef STATUS_ILLEGAL_FLOAT_CONTEXT # define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS) 0xC000014AL) #endif #ifndef STATUS_PIPE_BROKEN # define STATUS_PIPE_BROKEN ((NTSTATUS) 0xC000014BL) #endif #ifndef STATUS_REGISTRY_CORRUPT # define STATUS_REGISTRY_CORRUPT ((NTSTATUS) 0xC000014CL) #endif #ifndef STATUS_REGISTRY_IO_FAILED # define STATUS_REGISTRY_IO_FAILED ((NTSTATUS) 0xC000014DL) #endif #ifndef STATUS_NO_EVENT_PAIR # define STATUS_NO_EVENT_PAIR ((NTSTATUS) 0xC000014EL) #endif #ifndef STATUS_UNRECOGNIZED_VOLUME # define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS) 0xC000014FL) #endif #ifndef STATUS_SERIAL_NO_DEVICE_INITED # define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS) 0xC0000150L) #endif #ifndef STATUS_NO_SUCH_ALIAS # define STATUS_NO_SUCH_ALIAS ((NTSTATUS) 0xC0000151L) #endif #ifndef STATUS_MEMBER_NOT_IN_ALIAS # define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS) 0xC0000152L) #endif #ifndef STATUS_MEMBER_IN_ALIAS # define STATUS_MEMBER_IN_ALIAS ((NTSTATUS) 0xC0000153L) #endif #ifndef STATUS_ALIAS_EXISTS # define STATUS_ALIAS_EXISTS ((NTSTATUS) 0xC0000154L) #endif #ifndef STATUS_LOGON_NOT_GRANTED # define STATUS_LOGON_NOT_GRANTED ((NTSTATUS) 0xC0000155L) #endif #ifndef STATUS_TOO_MANY_SECRETS # define STATUS_TOO_MANY_SECRETS ((NTSTATUS) 0xC0000156L) #endif #ifndef STATUS_SECRET_TOO_LONG # define STATUS_SECRET_TOO_LONG ((NTSTATUS) 0xC0000157L) #endif #ifndef STATUS_INTERNAL_DB_ERROR # define STATUS_INTERNAL_DB_ERROR ((NTSTATUS) 0xC0000158L) #endif #ifndef STATUS_FULLSCREEN_MODE # define STATUS_FULLSCREEN_MODE ((NTSTATUS) 0xC0000159L) #endif #ifndef STATUS_TOO_MANY_CONTEXT_IDS # define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS) 0xC000015AL) #endif #ifndef STATUS_LOGON_TYPE_NOT_GRANTED # define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS) 0xC000015BL) #endif #ifndef STATUS_NOT_REGISTRY_FILE # define STATUS_NOT_REGISTRY_FILE ((NTSTATUS) 0xC000015CL) #endif #ifndef STATUS_NT_CROSS_ENCRYPTION_REQUIRED # define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000015DL) #endif #ifndef STATUS_DOMAIN_CTRLR_CONFIG_ERROR # define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS) 0xC000015EL) #endif #ifndef STATUS_FT_MISSING_MEMBER # define STATUS_FT_MISSING_MEMBER ((NTSTATUS) 0xC000015FL) #endif #ifndef STATUS_ILL_FORMED_SERVICE_ENTRY # define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS) 0xC0000160L) #endif #ifndef STATUS_ILLEGAL_CHARACTER # define STATUS_ILLEGAL_CHARACTER ((NTSTATUS) 0xC0000161L) #endif #ifndef STATUS_UNMAPPABLE_CHARACTER # define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS) 0xC0000162L) #endif #ifndef STATUS_UNDEFINED_CHARACTER # define STATUS_UNDEFINED_CHARACTER ((NTSTATUS) 0xC0000163L) #endif #ifndef STATUS_FLOPPY_VOLUME # define STATUS_FLOPPY_VOLUME ((NTSTATUS) 0xC0000164L) #endif #ifndef STATUS_FLOPPY_ID_MARK_NOT_FOUND # define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS) 0xC0000165L) #endif #ifndef STATUS_FLOPPY_WRONG_CYLINDER # define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS) 0xC0000166L) #endif #ifndef STATUS_FLOPPY_UNKNOWN_ERROR # define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS) 0xC0000167L) #endif #ifndef STATUS_FLOPPY_BAD_REGISTERS # define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS) 0xC0000168L) #endif #ifndef STATUS_DISK_RECALIBRATE_FAILED # define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS) 0xC0000169L) #endif #ifndef STATUS_DISK_OPERATION_FAILED # define STATUS_DISK_OPERATION_FAILED ((NTSTATUS) 0xC000016AL) #endif #ifndef STATUS_DISK_RESET_FAILED # define STATUS_DISK_RESET_FAILED ((NTSTATUS) 0xC000016BL) #endif #ifndef STATUS_SHARED_IRQ_BUSY # define STATUS_SHARED_IRQ_BUSY ((NTSTATUS) 0xC000016CL) #endif #ifndef STATUS_FT_ORPHANING # define STATUS_FT_ORPHANING ((NTSTATUS) 0xC000016DL) #endif #ifndef STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT # define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS) 0xC000016EL) #endif #ifndef STATUS_PARTITION_FAILURE # define STATUS_PARTITION_FAILURE ((NTSTATUS) 0xC0000172L) #endif #ifndef STATUS_INVALID_BLOCK_LENGTH # define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS) 0xC0000173L) #endif #ifndef STATUS_DEVICE_NOT_PARTITIONED # define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS) 0xC0000174L) #endif #ifndef STATUS_UNABLE_TO_LOCK_MEDIA # define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS) 0xC0000175L) #endif #ifndef STATUS_UNABLE_TO_UNLOAD_MEDIA # define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS) 0xC0000176L) #endif #ifndef STATUS_EOM_OVERFLOW # define STATUS_EOM_OVERFLOW ((NTSTATUS) 0xC0000177L) #endif #ifndef STATUS_NO_MEDIA # define STATUS_NO_MEDIA ((NTSTATUS) 0xC0000178L) #endif #ifndef STATUS_NO_SUCH_MEMBER # define STATUS_NO_SUCH_MEMBER ((NTSTATUS) 0xC000017AL) #endif #ifndef STATUS_INVALID_MEMBER # define STATUS_INVALID_MEMBER ((NTSTATUS) 0xC000017BL) #endif #ifndef STATUS_KEY_DELETED # define STATUS_KEY_DELETED ((NTSTATUS) 0xC000017CL) #endif #ifndef STATUS_NO_LOG_SPACE # define STATUS_NO_LOG_SPACE ((NTSTATUS) 0xC000017DL) #endif #ifndef STATUS_TOO_MANY_SIDS # define STATUS_TOO_MANY_SIDS ((NTSTATUS) 0xC000017EL) #endif #ifndef STATUS_LM_CROSS_ENCRYPTION_REQUIRED # define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000017FL) #endif #ifndef STATUS_KEY_HAS_CHILDREN # define STATUS_KEY_HAS_CHILDREN ((NTSTATUS) 0xC0000180L) #endif #ifndef STATUS_CHILD_MUST_BE_VOLATILE # define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS) 0xC0000181L) #endif #ifndef STATUS_DEVICE_CONFIGURATION_ERROR # define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS) 0xC0000182L) #endif #ifndef STATUS_DRIVER_INTERNAL_ERROR # define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS) 0xC0000183L) #endif #ifndef STATUS_INVALID_DEVICE_STATE # define STATUS_INVALID_DEVICE_STATE ((NTSTATUS) 0xC0000184L) #endif #ifndef STATUS_IO_DEVICE_ERROR # define STATUS_IO_DEVICE_ERROR ((NTSTATUS) 0xC0000185L) #endif #ifndef STATUS_DEVICE_PROTOCOL_ERROR # define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS) 0xC0000186L) #endif #ifndef STATUS_BACKUP_CONTROLLER # define STATUS_BACKUP_CONTROLLER ((NTSTATUS) 0xC0000187L) #endif #ifndef STATUS_LOG_FILE_FULL # define STATUS_LOG_FILE_FULL ((NTSTATUS) 0xC0000188L) #endif #ifndef STATUS_TOO_LATE # define STATUS_TOO_LATE ((NTSTATUS) 0xC0000189L) #endif #ifndef STATUS_NO_TRUST_LSA_SECRET # define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS) 0xC000018AL) #endif #ifndef STATUS_NO_TRUST_SAM_ACCOUNT # define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS) 0xC000018BL) #endif #ifndef STATUS_TRUSTED_DOMAIN_FAILURE # define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS) 0xC000018CL) #endif #ifndef STATUS_TRUSTED_RELATIONSHIP_FAILURE # define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS) 0xC000018DL) #endif #ifndef STATUS_EVENTLOG_FILE_CORRUPT # define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS) 0xC000018EL) #endif #ifndef STATUS_EVENTLOG_CANT_START # define STATUS_EVENTLOG_CANT_START ((NTSTATUS) 0xC000018FL) #endif #ifndef STATUS_TRUST_FAILURE # define STATUS_TRUST_FAILURE ((NTSTATUS) 0xC0000190L) #endif #ifndef STATUS_MUTANT_LIMIT_EXCEEDED # define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000191L) #endif #ifndef STATUS_NETLOGON_NOT_STARTED # define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS) 0xC0000192L) #endif #ifndef STATUS_ACCOUNT_EXPIRED # define STATUS_ACCOUNT_EXPIRED ((NTSTATUS) 0xC0000193L) #endif #ifndef STATUS_POSSIBLE_DEADLOCK # define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS) 0xC0000194L) #endif #ifndef STATUS_NETWORK_CREDENTIAL_CONFLICT # define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS) 0xC0000195L) #endif #ifndef STATUS_REMOTE_SESSION_LIMIT # define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS) 0xC0000196L) #endif #ifndef STATUS_EVENTLOG_FILE_CHANGED # define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS) 0xC0000197L) #endif #ifndef STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT # define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS) 0xC0000198L) #endif #ifndef STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT # define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS) 0xC0000199L) #endif #ifndef STATUS_NOLOGON_SERVER_TRUST_ACCOUNT # define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS) 0xC000019AL) #endif #ifndef STATUS_DOMAIN_TRUST_INCONSISTENT # define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS) 0xC000019BL) #endif #ifndef STATUS_FS_DRIVER_REQUIRED # define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS) 0xC000019CL) #endif #ifndef STATUS_IMAGE_ALREADY_LOADED_AS_DLL # define STATUS_IMAGE_ALREADY_LOADED_AS_DLL ((NTSTATUS) 0xC000019DL) #endif #ifndef STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING # define STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING ((NTSTATUS) 0xC000019EL) #endif #ifndef STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME # define STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME ((NTSTATUS) 0xC000019FL) #endif #ifndef STATUS_SECURITY_STREAM_IS_INCONSISTENT # define STATUS_SECURITY_STREAM_IS_INCONSISTENT ((NTSTATUS) 0xC00001A0L) #endif #ifndef STATUS_INVALID_LOCK_RANGE # define STATUS_INVALID_LOCK_RANGE ((NTSTATUS) 0xC00001A1L) #endif #ifndef STATUS_INVALID_ACE_CONDITION # define STATUS_INVALID_ACE_CONDITION ((NTSTATUS) 0xC00001A2L) #endif #ifndef STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT # define STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT ((NTSTATUS) 0xC00001A3L) #endif #ifndef STATUS_NOTIFICATION_GUID_ALREADY_DEFINED # define STATUS_NOTIFICATION_GUID_ALREADY_DEFINED ((NTSTATUS) 0xC00001A4L) #endif #ifndef STATUS_NETWORK_OPEN_RESTRICTION # define STATUS_NETWORK_OPEN_RESTRICTION ((NTSTATUS) 0xC0000201L) #endif #ifndef STATUS_NO_USER_SESSION_KEY # define STATUS_NO_USER_SESSION_KEY ((NTSTATUS) 0xC0000202L) #endif #ifndef STATUS_USER_SESSION_DELETED # define STATUS_USER_SESSION_DELETED ((NTSTATUS) 0xC0000203L) #endif #ifndef STATUS_RESOURCE_LANG_NOT_FOUND # define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS) 0xC0000204L) #endif #ifndef STATUS_INSUFF_SERVER_RESOURCES # define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS) 0xC0000205L) #endif #ifndef STATUS_INVALID_BUFFER_SIZE # define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS) 0xC0000206L) #endif #ifndef STATUS_INVALID_ADDRESS_COMPONENT # define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS) 0xC0000207L) #endif #ifndef STATUS_INVALID_ADDRESS_WILDCARD # define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS) 0xC0000208L) #endif #ifndef STATUS_TOO_MANY_ADDRESSES # define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS) 0xC0000209L) #endif #ifndef STATUS_ADDRESS_ALREADY_EXISTS # define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS) 0xC000020AL) #endif #ifndef STATUS_ADDRESS_CLOSED # define STATUS_ADDRESS_CLOSED ((NTSTATUS) 0xC000020BL) #endif #ifndef STATUS_CONNECTION_DISCONNECTED # define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS) 0xC000020CL) #endif #ifndef STATUS_CONNECTION_RESET # define STATUS_CONNECTION_RESET ((NTSTATUS) 0xC000020DL) #endif #ifndef STATUS_TOO_MANY_NODES # define STATUS_TOO_MANY_NODES ((NTSTATUS) 0xC000020EL) #endif #ifndef STATUS_TRANSACTION_ABORTED # define STATUS_TRANSACTION_ABORTED ((NTSTATUS) 0xC000020FL) #endif #ifndef STATUS_TRANSACTION_TIMED_OUT # define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS) 0xC0000210L) #endif #ifndef STATUS_TRANSACTION_NO_RELEASE # define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS) 0xC0000211L) #endif #ifndef STATUS_TRANSACTION_NO_MATCH # define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS) 0xC0000212L) #endif #ifndef STATUS_TRANSACTION_RESPONDED # define STATUS_TRANSACTION_RESPONDED ((NTSTATUS) 0xC0000213L) #endif #ifndef STATUS_TRANSACTION_INVALID_ID # define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS) 0xC0000214L) #endif #ifndef STATUS_TRANSACTION_INVALID_TYPE # define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS) 0xC0000215L) #endif #ifndef STATUS_NOT_SERVER_SESSION # define STATUS_NOT_SERVER_SESSION ((NTSTATUS) 0xC0000216L) #endif #ifndef STATUS_NOT_CLIENT_SESSION # define STATUS_NOT_CLIENT_SESSION ((NTSTATUS) 0xC0000217L) #endif #ifndef STATUS_CANNOT_LOAD_REGISTRY_FILE # define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS) 0xC0000218L) #endif #ifndef STATUS_DEBUG_ATTACH_FAILED # define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS) 0xC0000219L) #endif #ifndef STATUS_SYSTEM_PROCESS_TERMINATED # define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS) 0xC000021AL) #endif #ifndef STATUS_DATA_NOT_ACCEPTED # define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS) 0xC000021BL) #endif #ifndef STATUS_NO_BROWSER_SERVERS_FOUND # define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS) 0xC000021CL) #endif #ifndef STATUS_VDM_HARD_ERROR # define STATUS_VDM_HARD_ERROR ((NTSTATUS) 0xC000021DL) #endif #ifndef STATUS_DRIVER_CANCEL_TIMEOUT # define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS) 0xC000021EL) #endif #ifndef STATUS_REPLY_MESSAGE_MISMATCH # define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS) 0xC000021FL) #endif #ifndef STATUS_MAPPED_ALIGNMENT # define STATUS_MAPPED_ALIGNMENT ((NTSTATUS) 0xC0000220L) #endif #ifndef STATUS_IMAGE_CHECKSUM_MISMATCH # define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS) 0xC0000221L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA # define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS) 0xC0000222L) #endif #ifndef STATUS_CLIENT_SERVER_PARAMETERS_INVALID # define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS) 0xC0000223L) #endif #ifndef STATUS_PASSWORD_MUST_CHANGE # define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS) 0xC0000224L) #endif #ifndef STATUS_NOT_FOUND # define STATUS_NOT_FOUND ((NTSTATUS) 0xC0000225L) #endif #ifndef STATUS_NOT_TINY_STREAM # define STATUS_NOT_TINY_STREAM ((NTSTATUS) 0xC0000226L) #endif #ifndef STATUS_RECOVERY_FAILURE # define STATUS_RECOVERY_FAILURE ((NTSTATUS) 0xC0000227L) #endif #ifndef STATUS_STACK_OVERFLOW_READ # define STATUS_STACK_OVERFLOW_READ ((NTSTATUS) 0xC0000228L) #endif #ifndef STATUS_FAIL_CHECK # define STATUS_FAIL_CHECK ((NTSTATUS) 0xC0000229L) #endif #ifndef STATUS_DUPLICATE_OBJECTID # define STATUS_DUPLICATE_OBJECTID ((NTSTATUS) 0xC000022AL) #endif #ifndef STATUS_OBJECTID_EXISTS # define STATUS_OBJECTID_EXISTS ((NTSTATUS) 0xC000022BL) #endif #ifndef STATUS_CONVERT_TO_LARGE # define STATUS_CONVERT_TO_LARGE ((NTSTATUS) 0xC000022CL) #endif #ifndef STATUS_RETRY # define STATUS_RETRY ((NTSTATUS) 0xC000022DL) #endif #ifndef STATUS_FOUND_OUT_OF_SCOPE # define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS) 0xC000022EL) #endif #ifndef STATUS_ALLOCATE_BUCKET # define STATUS_ALLOCATE_BUCKET ((NTSTATUS) 0xC000022FL) #endif #ifndef STATUS_PROPSET_NOT_FOUND # define STATUS_PROPSET_NOT_FOUND ((NTSTATUS) 0xC0000230L) #endif #ifndef STATUS_MARSHALL_OVERFLOW # define STATUS_MARSHALL_OVERFLOW ((NTSTATUS) 0xC0000231L) #endif #ifndef STATUS_INVALID_VARIANT # define STATUS_INVALID_VARIANT ((NTSTATUS) 0xC0000232L) #endif #ifndef STATUS_DOMAIN_CONTROLLER_NOT_FOUND # define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS) 0xC0000233L) #endif #ifndef STATUS_ACCOUNT_LOCKED_OUT # define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS) 0xC0000234L) #endif #ifndef STATUS_HANDLE_NOT_CLOSABLE # define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS) 0xC0000235L) #endif #ifndef STATUS_CONNECTION_REFUSED # define STATUS_CONNECTION_REFUSED ((NTSTATUS) 0xC0000236L) #endif #ifndef STATUS_GRACEFUL_DISCONNECT # define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS) 0xC0000237L) #endif #ifndef STATUS_ADDRESS_ALREADY_ASSOCIATED # define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS) 0xC0000238L) #endif #ifndef STATUS_ADDRESS_NOT_ASSOCIATED # define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS) 0xC0000239L) #endif #ifndef STATUS_CONNECTION_INVALID # define STATUS_CONNECTION_INVALID ((NTSTATUS) 0xC000023AL) #endif #ifndef STATUS_CONNECTION_ACTIVE # define STATUS_CONNECTION_ACTIVE ((NTSTATUS) 0xC000023BL) #endif #ifndef STATUS_NETWORK_UNREACHABLE # define STATUS_NETWORK_UNREACHABLE ((NTSTATUS) 0xC000023CL) #endif #ifndef STATUS_HOST_UNREACHABLE # define STATUS_HOST_UNREACHABLE ((NTSTATUS) 0xC000023DL) #endif #ifndef STATUS_PROTOCOL_UNREACHABLE # define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS) 0xC000023EL) #endif #ifndef STATUS_PORT_UNREACHABLE # define STATUS_PORT_UNREACHABLE ((NTSTATUS) 0xC000023FL) #endif #ifndef STATUS_REQUEST_ABORTED # define STATUS_REQUEST_ABORTED ((NTSTATUS) 0xC0000240L) #endif #ifndef STATUS_CONNECTION_ABORTED # define STATUS_CONNECTION_ABORTED ((NTSTATUS) 0xC0000241L) #endif #ifndef STATUS_BAD_COMPRESSION_BUFFER # define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS) 0xC0000242L) #endif #ifndef STATUS_USER_MAPPED_FILE # define STATUS_USER_MAPPED_FILE ((NTSTATUS) 0xC0000243L) #endif #ifndef STATUS_AUDIT_FAILED # define STATUS_AUDIT_FAILED ((NTSTATUS) 0xC0000244L) #endif #ifndef STATUS_TIMER_RESOLUTION_NOT_SET # define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS) 0xC0000245L) #endif #ifndef STATUS_CONNECTION_COUNT_LIMIT # define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS) 0xC0000246L) #endif #ifndef STATUS_LOGIN_TIME_RESTRICTION # define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS) 0xC0000247L) #endif #ifndef STATUS_LOGIN_WKSTA_RESTRICTION # define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS) 0xC0000248L) #endif #ifndef STATUS_IMAGE_MP_UP_MISMATCH # define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS) 0xC0000249L) #endif #ifndef STATUS_INSUFFICIENT_LOGON_INFO # define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS) 0xC0000250L) #endif #ifndef STATUS_BAD_DLL_ENTRYPOINT # define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xC0000251L) #endif #ifndef STATUS_BAD_SERVICE_ENTRYPOINT # define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS) 0xC0000252L) #endif #ifndef STATUS_LPC_REPLY_LOST # define STATUS_LPC_REPLY_LOST ((NTSTATUS) 0xC0000253L) #endif #ifndef STATUS_IP_ADDRESS_CONFLICT1 # define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS) 0xC0000254L) #endif #ifndef STATUS_IP_ADDRESS_CONFLICT2 # define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS) 0xC0000255L) #endif #ifndef STATUS_REGISTRY_QUOTA_LIMIT # define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS) 0xC0000256L) #endif #ifndef STATUS_PATH_NOT_COVERED # define STATUS_PATH_NOT_COVERED ((NTSTATUS) 0xC0000257L) #endif #ifndef STATUS_NO_CALLBACK_ACTIVE # define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS) 0xC0000258L) #endif #ifndef STATUS_LICENSE_QUOTA_EXCEEDED # define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000259L) #endif #ifndef STATUS_PWD_TOO_SHORT # define STATUS_PWD_TOO_SHORT ((NTSTATUS) 0xC000025AL) #endif #ifndef STATUS_PWD_TOO_RECENT # define STATUS_PWD_TOO_RECENT ((NTSTATUS) 0xC000025BL) #endif #ifndef STATUS_PWD_HISTORY_CONFLICT # define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS) 0xC000025CL) #endif #ifndef STATUS_PLUGPLAY_NO_DEVICE # define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS) 0xC000025EL) #endif #ifndef STATUS_UNSUPPORTED_COMPRESSION # define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS) 0xC000025FL) #endif #ifndef STATUS_INVALID_HW_PROFILE # define STATUS_INVALID_HW_PROFILE ((NTSTATUS) 0xC0000260L) #endif #ifndef STATUS_INVALID_PLUGPLAY_DEVICE_PATH # define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS) 0xC0000261L) #endif #ifndef STATUS_DRIVER_ORDINAL_NOT_FOUND # define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000262L) #endif #ifndef STATUS_DRIVER_ENTRYPOINT_NOT_FOUND # define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000263L) #endif #ifndef STATUS_RESOURCE_NOT_OWNED # define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS) 0xC0000264L) #endif #ifndef STATUS_TOO_MANY_LINKS # define STATUS_TOO_MANY_LINKS ((NTSTATUS) 0xC0000265L) #endif #ifndef STATUS_QUOTA_LIST_INCONSISTENT # define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS) 0xC0000266L) #endif #ifndef STATUS_FILE_IS_OFFLINE # define STATUS_FILE_IS_OFFLINE ((NTSTATUS) 0xC0000267L) #endif #ifndef STATUS_EVALUATION_EXPIRATION # define STATUS_EVALUATION_EXPIRATION ((NTSTATUS) 0xC0000268L) #endif #ifndef STATUS_ILLEGAL_DLL_RELOCATION # define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xC0000269L) #endif #ifndef STATUS_LICENSE_VIOLATION # define STATUS_LICENSE_VIOLATION ((NTSTATUS) 0xC000026AL) #endif #ifndef STATUS_DLL_INIT_FAILED_LOGOFF # define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS) 0xC000026BL) #endif #ifndef STATUS_DRIVER_UNABLE_TO_LOAD # define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS) 0xC000026CL) #endif #ifndef STATUS_DFS_UNAVAILABLE # define STATUS_DFS_UNAVAILABLE ((NTSTATUS) 0xC000026DL) #endif #ifndef STATUS_VOLUME_DISMOUNTED # define STATUS_VOLUME_DISMOUNTED ((NTSTATUS) 0xC000026EL) #endif #ifndef STATUS_WX86_INTERNAL_ERROR # define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS) 0xC000026FL) #endif #ifndef STATUS_WX86_FLOAT_STACK_CHECK # define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000270L) #endif #ifndef STATUS_VALIDATE_CONTINUE # define STATUS_VALIDATE_CONTINUE ((NTSTATUS) 0xC0000271L) #endif #ifndef STATUS_NO_MATCH # define STATUS_NO_MATCH ((NTSTATUS) 0xC0000272L) #endif #ifndef STATUS_NO_MORE_MATCHES # define STATUS_NO_MORE_MATCHES ((NTSTATUS) 0xC0000273L) #endif #ifndef STATUS_NOT_A_REPARSE_POINT # define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS) 0xC0000275L) #endif #ifndef STATUS_IO_REPARSE_TAG_INVALID # define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS) 0xC0000276L) #endif #ifndef STATUS_IO_REPARSE_TAG_MISMATCH # define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS) 0xC0000277L) #endif #ifndef STATUS_IO_REPARSE_DATA_INVALID # define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS) 0xC0000278L) #endif #ifndef STATUS_IO_REPARSE_TAG_NOT_HANDLED # define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS) 0xC0000279L) #endif #ifndef STATUS_REPARSE_POINT_NOT_RESOLVED # define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000280L) #endif #ifndef STATUS_DIRECTORY_IS_A_REPARSE_POINT # define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS) 0xC0000281L) #endif #ifndef STATUS_RANGE_LIST_CONFLICT # define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS) 0xC0000282L) #endif #ifndef STATUS_SOURCE_ELEMENT_EMPTY # define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS) 0xC0000283L) #endif #ifndef STATUS_DESTINATION_ELEMENT_FULL # define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS) 0xC0000284L) #endif #ifndef STATUS_ILLEGAL_ELEMENT_ADDRESS # define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS) 0xC0000285L) #endif #ifndef STATUS_MAGAZINE_NOT_PRESENT # define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS) 0xC0000286L) #endif #ifndef STATUS_REINITIALIZATION_NEEDED # define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS) 0xC0000287L) #endif #ifndef STATUS_DEVICE_REQUIRES_CLEANING # define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS) 0x80000288L) #endif #ifndef STATUS_DEVICE_DOOR_OPEN # define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS) 0x80000289L) #endif #ifndef STATUS_ENCRYPTION_FAILED # define STATUS_ENCRYPTION_FAILED ((NTSTATUS) 0xC000028AL) #endif #ifndef STATUS_DECRYPTION_FAILED # define STATUS_DECRYPTION_FAILED ((NTSTATUS) 0xC000028BL) #endif #ifndef STATUS_RANGE_NOT_FOUND # define STATUS_RANGE_NOT_FOUND ((NTSTATUS) 0xC000028CL) #endif #ifndef STATUS_NO_RECOVERY_POLICY # define STATUS_NO_RECOVERY_POLICY ((NTSTATUS) 0xC000028DL) #endif #ifndef STATUS_NO_EFS # define STATUS_NO_EFS ((NTSTATUS) 0xC000028EL) #endif #ifndef STATUS_WRONG_EFS # define STATUS_WRONG_EFS ((NTSTATUS) 0xC000028FL) #endif #ifndef STATUS_NO_USER_KEYS # define STATUS_NO_USER_KEYS ((NTSTATUS) 0xC0000290L) #endif #ifndef STATUS_FILE_NOT_ENCRYPTED # define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS) 0xC0000291L) #endif #ifndef STATUS_NOT_EXPORT_FORMAT # define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS) 0xC0000292L) #endif #ifndef STATUS_FILE_ENCRYPTED # define STATUS_FILE_ENCRYPTED ((NTSTATUS) 0xC0000293L) #endif #ifndef STATUS_WAKE_SYSTEM # define STATUS_WAKE_SYSTEM ((NTSTATUS) 0x40000294L) #endif #ifndef STATUS_WMI_GUID_NOT_FOUND # define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS) 0xC0000295L) #endif #ifndef STATUS_WMI_INSTANCE_NOT_FOUND # define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS) 0xC0000296L) #endif #ifndef STATUS_WMI_ITEMID_NOT_FOUND # define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS) 0xC0000297L) #endif #ifndef STATUS_WMI_TRY_AGAIN # define STATUS_WMI_TRY_AGAIN ((NTSTATUS) 0xC0000298L) #endif #ifndef STATUS_SHARED_POLICY # define STATUS_SHARED_POLICY ((NTSTATUS) 0xC0000299L) #endif #ifndef STATUS_POLICY_OBJECT_NOT_FOUND # define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS) 0xC000029AL) #endif #ifndef STATUS_POLICY_ONLY_IN_DS # define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS) 0xC000029BL) #endif #ifndef STATUS_VOLUME_NOT_UPGRADED # define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS) 0xC000029CL) #endif #ifndef STATUS_REMOTE_STORAGE_NOT_ACTIVE # define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS) 0xC000029DL) #endif #ifndef STATUS_REMOTE_STORAGE_MEDIA_ERROR # define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS) 0xC000029EL) #endif #ifndef STATUS_NO_TRACKING_SERVICE # define STATUS_NO_TRACKING_SERVICE ((NTSTATUS) 0xC000029FL) #endif #ifndef STATUS_SERVER_SID_MISMATCH # define STATUS_SERVER_SID_MISMATCH ((NTSTATUS) 0xC00002A0L) #endif #ifndef STATUS_DS_NO_ATTRIBUTE_OR_VALUE # define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS) 0xC00002A1L) #endif #ifndef STATUS_DS_INVALID_ATTRIBUTE_SYNTAX # define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS) 0xC00002A2L) #endif #ifndef STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED # define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS) 0xC00002A3L) #endif #ifndef STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS # define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS) 0xC00002A4L) #endif #ifndef STATUS_DS_BUSY # define STATUS_DS_BUSY ((NTSTATUS) 0xC00002A5L) #endif #ifndef STATUS_DS_UNAVAILABLE # define STATUS_DS_UNAVAILABLE ((NTSTATUS) 0xC00002A6L) #endif #ifndef STATUS_DS_NO_RIDS_ALLOCATED # define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS) 0xC00002A7L) #endif #ifndef STATUS_DS_NO_MORE_RIDS # define STATUS_DS_NO_MORE_RIDS ((NTSTATUS) 0xC00002A8L) #endif #ifndef STATUS_DS_INCORRECT_ROLE_OWNER # define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS) 0xC00002A9L) #endif #ifndef STATUS_DS_RIDMGR_INIT_ERROR # define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS) 0xC00002AAL) #endif #ifndef STATUS_DS_OBJ_CLASS_VIOLATION # define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS) 0xC00002ABL) #endif #ifndef STATUS_DS_CANT_ON_NON_LEAF # define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS) 0xC00002ACL) #endif #ifndef STATUS_DS_CANT_ON_RDN # define STATUS_DS_CANT_ON_RDN ((NTSTATUS) 0xC00002ADL) #endif #ifndef STATUS_DS_CANT_MOD_OBJ_CLASS # define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS) 0xC00002AEL) #endif #ifndef STATUS_DS_CROSS_DOM_MOVE_FAILED # define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS) 0xC00002AFL) #endif #ifndef STATUS_DS_GC_NOT_AVAILABLE # define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS) 0xC00002B0L) #endif #ifndef STATUS_DIRECTORY_SERVICE_REQUIRED # define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS) 0xC00002B1L) #endif #ifndef STATUS_REPARSE_ATTRIBUTE_CONFLICT # define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS) 0xC00002B2L) #endif #ifndef STATUS_CANT_ENABLE_DENY_ONLY # define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS) 0xC00002B3L) #endif #ifndef STATUS_FLOAT_MULTIPLE_FAULTS # define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS) 0xC00002B4L) #endif #ifndef STATUS_FLOAT_MULTIPLE_TRAPS # define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS) 0xC00002B5L) #endif #ifndef STATUS_DEVICE_REMOVED # define STATUS_DEVICE_REMOVED ((NTSTATUS) 0xC00002B6L) #endif #ifndef STATUS_JOURNAL_DELETE_IN_PROGRESS # define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS) 0xC00002B7L) #endif #ifndef STATUS_JOURNAL_NOT_ACTIVE # define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS) 0xC00002B8L) #endif #ifndef STATUS_NOINTERFACE # define STATUS_NOINTERFACE ((NTSTATUS) 0xC00002B9L) #endif #ifndef STATUS_DS_ADMIN_LIMIT_EXCEEDED # define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00002C1L) #endif #ifndef STATUS_DRIVER_FAILED_SLEEP # define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS) 0xC00002C2L) #endif #ifndef STATUS_MUTUAL_AUTHENTICATION_FAILED # define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS) 0xC00002C3L) #endif #ifndef STATUS_CORRUPT_SYSTEM_FILE # define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS) 0xC00002C4L) #endif #ifndef STATUS_DATATYPE_MISALIGNMENT_ERROR # define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS) 0xC00002C5L) #endif #ifndef STATUS_WMI_READ_ONLY # define STATUS_WMI_READ_ONLY ((NTSTATUS) 0xC00002C6L) #endif #ifndef STATUS_WMI_SET_FAILURE # define STATUS_WMI_SET_FAILURE ((NTSTATUS) 0xC00002C7L) #endif #ifndef STATUS_COMMITMENT_MINIMUM # define STATUS_COMMITMENT_MINIMUM ((NTSTATUS) 0xC00002C8L) #endif #ifndef STATUS_REG_NAT_CONSUMPTION # define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS) 0xC00002C9L) #endif #ifndef STATUS_TRANSPORT_FULL # define STATUS_TRANSPORT_FULL ((NTSTATUS) 0xC00002CAL) #endif #ifndef STATUS_DS_SAM_INIT_FAILURE # define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002CBL) #endif #ifndef STATUS_ONLY_IF_CONNECTED # define STATUS_ONLY_IF_CONNECTED ((NTSTATUS) 0xC00002CCL) #endif #ifndef STATUS_DS_SENSITIVE_GROUP_VIOLATION # define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS) 0xC00002CDL) #endif #ifndef STATUS_PNP_RESTART_ENUMERATION # define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS) 0xC00002CEL) #endif #ifndef STATUS_JOURNAL_ENTRY_DELETED # define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS) 0xC00002CFL) #endif #ifndef STATUS_DS_CANT_MOD_PRIMARYGROUPID # define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS) 0xC00002D0L) #endif #ifndef STATUS_SYSTEM_IMAGE_BAD_SIGNATURE # define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS) 0xC00002D1L) #endif #ifndef STATUS_PNP_REBOOT_REQUIRED # define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS) 0xC00002D2L) #endif #ifndef STATUS_POWER_STATE_INVALID # define STATUS_POWER_STATE_INVALID ((NTSTATUS) 0xC00002D3L) #endif #ifndef STATUS_DS_INVALID_GROUP_TYPE # define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS) 0xC00002D4L) #endif #ifndef STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN # define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D5L) #endif #ifndef STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN # define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D6L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D7L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC00002D8L) #endif #ifndef STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER # define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D9L) #endif #ifndef STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER # define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS) 0xC00002DAL) #endif #ifndef STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER # define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS) 0xC00002DBL) #endif #ifndef STATUS_DS_HAVE_PRIMARY_MEMBERS # define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS) 0xC00002DCL) #endif #ifndef STATUS_WMI_NOT_SUPPORTED # define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS) 0xC00002DDL) #endif #ifndef STATUS_INSUFFICIENT_POWER # define STATUS_INSUFFICIENT_POWER ((NTSTATUS) 0xC00002DEL) #endif #ifndef STATUS_SAM_NEED_BOOTKEY_PASSWORD # define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS) 0xC00002DFL) #endif #ifndef STATUS_SAM_NEED_BOOTKEY_FLOPPY # define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS) 0xC00002E0L) #endif #ifndef STATUS_DS_CANT_START # define STATUS_DS_CANT_START ((NTSTATUS) 0xC00002E1L) #endif #ifndef STATUS_DS_INIT_FAILURE # define STATUS_DS_INIT_FAILURE ((NTSTATUS) 0xC00002E2L) #endif #ifndef STATUS_SAM_INIT_FAILURE # define STATUS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002E3L) #endif #ifndef STATUS_DS_GC_REQUIRED # define STATUS_DS_GC_REQUIRED ((NTSTATUS) 0xC00002E4L) #endif #ifndef STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY # define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS) 0xC00002E5L) #endif #ifndef STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS # define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS) 0xC00002E6L) #endif #ifndef STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED # define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS) 0xC00002E7L) #endif #ifndef STATUS_MULTIPLE_FAULT_VIOLATION # define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS) 0xC00002E8L) #endif #ifndef STATUS_CURRENT_DOMAIN_NOT_ALLOWED # define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS) 0xC00002E9L) #endif #ifndef STATUS_CANNOT_MAKE # define STATUS_CANNOT_MAKE ((NTSTATUS) 0xC00002EAL) #endif #ifndef STATUS_SYSTEM_SHUTDOWN # define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS) 0xC00002EBL) #endif #ifndef STATUS_DS_INIT_FAILURE_CONSOLE # define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002ECL) #endif #ifndef STATUS_DS_SAM_INIT_FAILURE_CONSOLE # define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002EDL) #endif #ifndef STATUS_UNFINISHED_CONTEXT_DELETED # define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS) 0xC00002EEL) #endif #ifndef STATUS_NO_TGT_REPLY # define STATUS_NO_TGT_REPLY ((NTSTATUS) 0xC00002EFL) #endif #ifndef STATUS_OBJECTID_NOT_FOUND # define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS) 0xC00002F0L) #endif #ifndef STATUS_NO_IP_ADDRESSES # define STATUS_NO_IP_ADDRESSES ((NTSTATUS) 0xC00002F1L) #endif #ifndef STATUS_WRONG_CREDENTIAL_HANDLE # define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS) 0xC00002F2L) #endif #ifndef STATUS_CRYPTO_SYSTEM_INVALID # define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS) 0xC00002F3L) #endif #ifndef STATUS_MAX_REFERRALS_EXCEEDED # define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS) 0xC00002F4L) #endif #ifndef STATUS_MUST_BE_KDC # define STATUS_MUST_BE_KDC ((NTSTATUS) 0xC00002F5L) #endif #ifndef STATUS_STRONG_CRYPTO_NOT_SUPPORTED # define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS) 0xC00002F6L) #endif #ifndef STATUS_TOO_MANY_PRINCIPALS # define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS) 0xC00002F7L) #endif #ifndef STATUS_NO_PA_DATA # define STATUS_NO_PA_DATA ((NTSTATUS) 0xC00002F8L) #endif #ifndef STATUS_PKINIT_NAME_MISMATCH # define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS) 0xC00002F9L) #endif #ifndef STATUS_SMARTCARD_LOGON_REQUIRED # define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS) 0xC00002FAL) #endif #ifndef STATUS_KDC_INVALID_REQUEST # define STATUS_KDC_INVALID_REQUEST ((NTSTATUS) 0xC00002FBL) #endif #ifndef STATUS_KDC_UNABLE_TO_REFER # define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS) 0xC00002FCL) #endif #ifndef STATUS_KDC_UNKNOWN_ETYPE # define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS) 0xC00002FDL) #endif #ifndef STATUS_SHUTDOWN_IN_PROGRESS # define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FEL) #endif #ifndef STATUS_SERVER_SHUTDOWN_IN_PROGRESS # define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FFL) #endif #ifndef STATUS_NOT_SUPPORTED_ON_SBS # define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS) 0xC0000300L) #endif #ifndef STATUS_WMI_GUID_DISCONNECTED # define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS) 0xC0000301L) #endif #ifndef STATUS_WMI_ALREADY_DISABLED # define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS) 0xC0000302L) #endif #ifndef STATUS_WMI_ALREADY_ENABLED # define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS) 0xC0000303L) #endif #ifndef STATUS_MFT_TOO_FRAGMENTED # define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS) 0xC0000304L) #endif #ifndef STATUS_COPY_PROTECTION_FAILURE # define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS) 0xC0000305L) #endif #ifndef STATUS_CSS_AUTHENTICATION_FAILURE # define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS) 0xC0000306L) #endif #ifndef STATUS_CSS_KEY_NOT_PRESENT # define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS) 0xC0000307L) #endif #ifndef STATUS_CSS_KEY_NOT_ESTABLISHED # define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS) 0xC0000308L) #endif #ifndef STATUS_CSS_SCRAMBLED_SECTOR # define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS) 0xC0000309L) #endif #ifndef STATUS_CSS_REGION_MISMATCH # define STATUS_CSS_REGION_MISMATCH ((NTSTATUS) 0xC000030AL) #endif #ifndef STATUS_CSS_RESETS_EXHAUSTED # define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS) 0xC000030BL) #endif #ifndef STATUS_PKINIT_FAILURE # define STATUS_PKINIT_FAILURE ((NTSTATUS) 0xC0000320L) #endif #ifndef STATUS_SMARTCARD_SUBSYSTEM_FAILURE # define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS) 0xC0000321L) #endif #ifndef STATUS_NO_KERB_KEY # define STATUS_NO_KERB_KEY ((NTSTATUS) 0xC0000322L) #endif #ifndef STATUS_HOST_DOWN # define STATUS_HOST_DOWN ((NTSTATUS) 0xC0000350L) #endif #ifndef STATUS_UNSUPPORTED_PREAUTH # define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS) 0xC0000351L) #endif #ifndef STATUS_EFS_ALG_BLOB_TOO_BIG # define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS) 0xC0000352L) #endif #ifndef STATUS_PORT_NOT_SET # define STATUS_PORT_NOT_SET ((NTSTATUS) 0xC0000353L) #endif #ifndef STATUS_DEBUGGER_INACTIVE # define STATUS_DEBUGGER_INACTIVE ((NTSTATUS) 0xC0000354L) #endif #ifndef STATUS_DS_VERSION_CHECK_FAILURE # define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS) 0xC0000355L) #endif #ifndef STATUS_AUDITING_DISABLED # define STATUS_AUDITING_DISABLED ((NTSTATUS) 0xC0000356L) #endif #ifndef STATUS_PRENT4_MACHINE_ACCOUNT # define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS) 0xC0000357L) #endif #ifndef STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER # define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC0000358L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_32 # define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS) 0xC0000359L) #endif #ifndef STATUS_INVALID_IMAGE_WIN_64 # define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS) 0xC000035AL) #endif #ifndef STATUS_BAD_BINDINGS # define STATUS_BAD_BINDINGS ((NTSTATUS) 0xC000035BL) #endif #ifndef STATUS_NETWORK_SESSION_EXPIRED # define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS) 0xC000035CL) #endif #ifndef STATUS_APPHELP_BLOCK # define STATUS_APPHELP_BLOCK ((NTSTATUS) 0xC000035DL) #endif #ifndef STATUS_ALL_SIDS_FILTERED # define STATUS_ALL_SIDS_FILTERED ((NTSTATUS) 0xC000035EL) #endif #ifndef STATUS_NOT_SAFE_MODE_DRIVER # define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS) 0xC000035FL) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT # define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS) 0xC0000361L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PATH # define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS) 0xC0000362L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER # define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS) 0xC0000363L) #endif #ifndef STATUS_ACCESS_DISABLED_BY_POLICY_OTHER # define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS) 0xC0000364L) #endif #ifndef STATUS_FAILED_DRIVER_ENTRY # define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS) 0xC0000365L) #endif #ifndef STATUS_DEVICE_ENUMERATION_ERROR # define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS) 0xC0000366L) #endif #ifndef STATUS_MOUNT_POINT_NOT_RESOLVED # define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000368L) #endif #ifndef STATUS_INVALID_DEVICE_OBJECT_PARAMETER # define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS) 0xC0000369L) #endif #ifndef STATUS_MCA_OCCURED # define STATUS_MCA_OCCURED ((NTSTATUS) 0xC000036AL) #endif #ifndef STATUS_DRIVER_BLOCKED_CRITICAL # define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS) 0xC000036BL) #endif #ifndef STATUS_DRIVER_BLOCKED # define STATUS_DRIVER_BLOCKED ((NTSTATUS) 0xC000036CL) #endif #ifndef STATUS_DRIVER_DATABASE_ERROR # define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS) 0xC000036DL) #endif #ifndef STATUS_SYSTEM_HIVE_TOO_LARGE # define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS) 0xC000036EL) #endif #ifndef STATUS_INVALID_IMPORT_OF_NON_DLL # define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS) 0xC000036FL) #endif #ifndef STATUS_DS_SHUTTING_DOWN # define STATUS_DS_SHUTTING_DOWN ((NTSTATUS) 0x40000370L) #endif #ifndef STATUS_NO_SECRETS # define STATUS_NO_SECRETS ((NTSTATUS) 0xC0000371L) #endif #ifndef STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY # define STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY ((NTSTATUS) 0xC0000372L) #endif #ifndef STATUS_FAILED_STACK_SWITCH # define STATUS_FAILED_STACK_SWITCH ((NTSTATUS) 0xC0000373L) #endif #ifndef STATUS_HEAP_CORRUPTION # define STATUS_HEAP_CORRUPTION ((NTSTATUS) 0xC0000374L) #endif #ifndef STATUS_SMARTCARD_WRONG_PIN # define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS) 0xC0000380L) #endif #ifndef STATUS_SMARTCARD_CARD_BLOCKED # define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS) 0xC0000381L) #endif #ifndef STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED # define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS) 0xC0000382L) #endif #ifndef STATUS_SMARTCARD_NO_CARD # define STATUS_SMARTCARD_NO_CARD ((NTSTATUS) 0xC0000383L) #endif #ifndef STATUS_SMARTCARD_NO_KEY_CONTAINER # define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS) 0xC0000384L) #endif #ifndef STATUS_SMARTCARD_NO_CERTIFICATE # define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS) 0xC0000385L) #endif #ifndef STATUS_SMARTCARD_NO_KEYSET # define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS) 0xC0000386L) #endif #ifndef STATUS_SMARTCARD_IO_ERROR # define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS) 0xC0000387L) #endif #ifndef STATUS_DOWNGRADE_DETECTED # define STATUS_DOWNGRADE_DETECTED ((NTSTATUS) 0xC0000388L) #endif #ifndef STATUS_SMARTCARD_CERT_REVOKED # define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS) 0xC0000389L) #endif #ifndef STATUS_ISSUING_CA_UNTRUSTED # define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS) 0xC000038AL) #endif #ifndef STATUS_REVOCATION_OFFLINE_C # define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS) 0xC000038BL) #endif #ifndef STATUS_PKINIT_CLIENT_FAILURE # define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS) 0xC000038CL) #endif #ifndef STATUS_SMARTCARD_CERT_EXPIRED # define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS) 0xC000038DL) #endif #ifndef STATUS_DRIVER_FAILED_PRIOR_UNLOAD # define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS) 0xC000038EL) #endif #ifndef STATUS_SMARTCARD_SILENT_CONTEXT # define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS) 0xC000038FL) #endif #ifndef STATUS_PER_USER_TRUST_QUOTA_EXCEEDED # define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000401L) #endif #ifndef STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED # define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000402L) #endif #ifndef STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED # define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000403L) #endif #ifndef STATUS_DS_NAME_NOT_UNIQUE # define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS) 0xC0000404L) #endif #ifndef STATUS_DS_DUPLICATE_ID_FOUND # define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS) 0xC0000405L) #endif #ifndef STATUS_DS_GROUP_CONVERSION_ERROR # define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS) 0xC0000406L) #endif #ifndef STATUS_VOLSNAP_PREPARE_HIBERNATE # define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS) 0xC0000407L) #endif #ifndef STATUS_USER2USER_REQUIRED # define STATUS_USER2USER_REQUIRED ((NTSTATUS) 0xC0000408L) #endif #ifndef STATUS_STACK_BUFFER_OVERRUN # define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS) 0xC0000409L) #endif #ifndef STATUS_NO_S4U_PROT_SUPPORT # define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS) 0xC000040AL) #endif #ifndef STATUS_CROSSREALM_DELEGATION_FAILURE # define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS) 0xC000040BL) #endif #ifndef STATUS_REVOCATION_OFFLINE_KDC # define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS) 0xC000040CL) #endif #ifndef STATUS_ISSUING_CA_UNTRUSTED_KDC # define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS) 0xC000040DL) #endif #ifndef STATUS_KDC_CERT_EXPIRED # define STATUS_KDC_CERT_EXPIRED ((NTSTATUS) 0xC000040EL) #endif #ifndef STATUS_KDC_CERT_REVOKED # define STATUS_KDC_CERT_REVOKED ((NTSTATUS) 0xC000040FL) #endif #ifndef STATUS_PARAMETER_QUOTA_EXCEEDED # define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000410L) #endif #ifndef STATUS_HIBERNATION_FAILURE # define STATUS_HIBERNATION_FAILURE ((NTSTATUS) 0xC0000411L) #endif #ifndef STATUS_DELAY_LOAD_FAILED # define STATUS_DELAY_LOAD_FAILED ((NTSTATUS) 0xC0000412L) #endif #ifndef STATUS_AUTHENTICATION_FIREWALL_FAILED # define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS) 0xC0000413L) #endif #ifndef STATUS_VDM_DISALLOWED # define STATUS_VDM_DISALLOWED ((NTSTATUS) 0xC0000414L) #endif #ifndef STATUS_HUNG_DISPLAY_DRIVER_THREAD # define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS) 0xC0000415L) #endif #ifndef STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE # define STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE ((NTSTATUS) 0xC0000416L) #endif #ifndef STATUS_INVALID_CRUNTIME_PARAMETER # define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS) 0xC0000417L) #endif #ifndef STATUS_NTLM_BLOCKED # define STATUS_NTLM_BLOCKED ((NTSTATUS) 0xC0000418L) #endif #ifndef STATUS_DS_SRC_SID_EXISTS_IN_FOREST # define STATUS_DS_SRC_SID_EXISTS_IN_FOREST ((NTSTATUS) 0xC0000419L) #endif #ifndef STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST # define STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041AL) #endif #ifndef STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST # define STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041BL) #endif #ifndef STATUS_INVALID_USER_PRINCIPAL_NAME # define STATUS_INVALID_USER_PRINCIPAL_NAME ((NTSTATUS) 0xC000041CL) #endif #ifndef STATUS_FATAL_USER_CALLBACK_EXCEPTION # define STATUS_FATAL_USER_CALLBACK_EXCEPTION ((NTSTATUS) 0xC000041DL) #endif #ifndef STATUS_ASSERTION_FAILURE # define STATUS_ASSERTION_FAILURE ((NTSTATUS) 0xC0000420L) #endif #ifndef STATUS_VERIFIER_STOP # define STATUS_VERIFIER_STOP ((NTSTATUS) 0xC0000421L) #endif #ifndef STATUS_CALLBACK_POP_STACK # define STATUS_CALLBACK_POP_STACK ((NTSTATUS) 0xC0000423L) #endif #ifndef STATUS_INCOMPATIBLE_DRIVER_BLOCKED # define STATUS_INCOMPATIBLE_DRIVER_BLOCKED ((NTSTATUS) 0xC0000424L) #endif #ifndef STATUS_HIVE_UNLOADED # define STATUS_HIVE_UNLOADED ((NTSTATUS) 0xC0000425L) #endif #ifndef STATUS_COMPRESSION_DISABLED # define STATUS_COMPRESSION_DISABLED ((NTSTATUS) 0xC0000426L) #endif #ifndef STATUS_FILE_SYSTEM_LIMITATION # define STATUS_FILE_SYSTEM_LIMITATION ((NTSTATUS) 0xC0000427L) #endif #ifndef STATUS_INVALID_IMAGE_HASH # define STATUS_INVALID_IMAGE_HASH ((NTSTATUS) 0xC0000428L) #endif #ifndef STATUS_NOT_CAPABLE # define STATUS_NOT_CAPABLE ((NTSTATUS) 0xC0000429L) #endif #ifndef STATUS_REQUEST_OUT_OF_SEQUENCE # define STATUS_REQUEST_OUT_OF_SEQUENCE ((NTSTATUS) 0xC000042AL) #endif #ifndef STATUS_IMPLEMENTATION_LIMIT # define STATUS_IMPLEMENTATION_LIMIT ((NTSTATUS) 0xC000042BL) #endif #ifndef STATUS_ELEVATION_REQUIRED # define STATUS_ELEVATION_REQUIRED ((NTSTATUS) 0xC000042CL) #endif #ifndef STATUS_NO_SECURITY_CONTEXT # define STATUS_NO_SECURITY_CONTEXT ((NTSTATUS) 0xC000042DL) #endif #ifndef STATUS_PKU2U_CERT_FAILURE # define STATUS_PKU2U_CERT_FAILURE ((NTSTATUS) 0xC000042FL) #endif #ifndef STATUS_BEYOND_VDL # define STATUS_BEYOND_VDL ((NTSTATUS) 0xC0000432L) #endif #ifndef STATUS_ENCOUNTERED_WRITE_IN_PROGRESS # define STATUS_ENCOUNTERED_WRITE_IN_PROGRESS ((NTSTATUS) 0xC0000433L) #endif #ifndef STATUS_PTE_CHANGED # define STATUS_PTE_CHANGED ((NTSTATUS) 0xC0000434L) #endif #ifndef STATUS_PURGE_FAILED # define STATUS_PURGE_FAILED ((NTSTATUS) 0xC0000435L) #endif #ifndef STATUS_CRED_REQUIRES_CONFIRMATION # define STATUS_CRED_REQUIRES_CONFIRMATION ((NTSTATUS) 0xC0000440L) #endif #ifndef STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE # define STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE ((NTSTATUS) 0xC0000441L) #endif #ifndef STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER # define STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER ((NTSTATUS) 0xC0000442L) #endif #ifndef STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE # define STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE ((NTSTATUS) 0xC0000443L) #endif #ifndef STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE # define STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE ((NTSTATUS) 0xC0000444L) #endif #ifndef STATUS_CS_ENCRYPTION_FILE_NOT_CSE # define STATUS_CS_ENCRYPTION_FILE_NOT_CSE ((NTSTATUS) 0xC0000445L) #endif #ifndef STATUS_INVALID_LABEL # define STATUS_INVALID_LABEL ((NTSTATUS) 0xC0000446L) #endif #ifndef STATUS_DRIVER_PROCESS_TERMINATED # define STATUS_DRIVER_PROCESS_TERMINATED ((NTSTATUS) 0xC0000450L) #endif #ifndef STATUS_AMBIGUOUS_SYSTEM_DEVICE # define STATUS_AMBIGUOUS_SYSTEM_DEVICE ((NTSTATUS) 0xC0000451L) #endif #ifndef STATUS_SYSTEM_DEVICE_NOT_FOUND # define STATUS_SYSTEM_DEVICE_NOT_FOUND ((NTSTATUS) 0xC0000452L) #endif #ifndef STATUS_RESTART_BOOT_APPLICATION # define STATUS_RESTART_BOOT_APPLICATION ((NTSTATUS) 0xC0000453L) #endif #ifndef STATUS_INSUFFICIENT_NVRAM_RESOURCES # define STATUS_INSUFFICIENT_NVRAM_RESOURCES ((NTSTATUS) 0xC0000454L) #endif #ifndef STATUS_INVALID_TASK_NAME # define STATUS_INVALID_TASK_NAME ((NTSTATUS) 0xC0000500L) #endif #ifndef STATUS_INVALID_TASK_INDEX # define STATUS_INVALID_TASK_INDEX ((NTSTATUS) 0xC0000501L) #endif #ifndef STATUS_THREAD_ALREADY_IN_TASK # define STATUS_THREAD_ALREADY_IN_TASK ((NTSTATUS) 0xC0000502L) #endif #ifndef STATUS_CALLBACK_BYPASS # define STATUS_CALLBACK_BYPASS ((NTSTATUS) 0xC0000503L) #endif #ifndef STATUS_FAIL_FAST_EXCEPTION # define STATUS_FAIL_FAST_EXCEPTION ((NTSTATUS) 0xC0000602L) #endif #ifndef STATUS_IMAGE_CERT_REVOKED # define STATUS_IMAGE_CERT_REVOKED ((NTSTATUS) 0xC0000603L) #endif #ifndef STATUS_PORT_CLOSED # define STATUS_PORT_CLOSED ((NTSTATUS) 0xC0000700L) #endif #ifndef STATUS_MESSAGE_LOST # define STATUS_MESSAGE_LOST ((NTSTATUS) 0xC0000701L) #endif #ifndef STATUS_INVALID_MESSAGE # define STATUS_INVALID_MESSAGE ((NTSTATUS) 0xC0000702L) #endif #ifndef STATUS_REQUEST_CANCELED # define STATUS_REQUEST_CANCELED ((NTSTATUS) 0xC0000703L) #endif #ifndef STATUS_RECURSIVE_DISPATCH # define STATUS_RECURSIVE_DISPATCH ((NTSTATUS) 0xC0000704L) #endif #ifndef STATUS_LPC_RECEIVE_BUFFER_EXPECTED # define STATUS_LPC_RECEIVE_BUFFER_EXPECTED ((NTSTATUS) 0xC0000705L) #endif #ifndef STATUS_LPC_INVALID_CONNECTION_USAGE # define STATUS_LPC_INVALID_CONNECTION_USAGE ((NTSTATUS) 0xC0000706L) #endif #ifndef STATUS_LPC_REQUESTS_NOT_ALLOWED # define STATUS_LPC_REQUESTS_NOT_ALLOWED ((NTSTATUS) 0xC0000707L) #endif #ifndef STATUS_RESOURCE_IN_USE # define STATUS_RESOURCE_IN_USE ((NTSTATUS) 0xC0000708L) #endif #ifndef STATUS_HARDWARE_MEMORY_ERROR # define STATUS_HARDWARE_MEMORY_ERROR ((NTSTATUS) 0xC0000709L) #endif #ifndef STATUS_THREADPOOL_HANDLE_EXCEPTION # define STATUS_THREADPOOL_HANDLE_EXCEPTION ((NTSTATUS) 0xC000070AL) #endif #ifndef STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070BL) #endif #ifndef STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070CL) #endif #ifndef STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070DL) #endif #ifndef STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED # define STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070EL) #endif #ifndef STATUS_THREADPOOL_RELEASED_DURING_OPERATION # define STATUS_THREADPOOL_RELEASED_DURING_OPERATION ((NTSTATUS) 0xC000070FL) #endif #ifndef STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING # define STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000710L) #endif #ifndef STATUS_APC_RETURNED_WHILE_IMPERSONATING # define STATUS_APC_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000711L) #endif #ifndef STATUS_PROCESS_IS_PROTECTED # define STATUS_PROCESS_IS_PROTECTED ((NTSTATUS) 0xC0000712L) #endif #ifndef STATUS_MCA_EXCEPTION # define STATUS_MCA_EXCEPTION ((NTSTATUS) 0xC0000713L) #endif #ifndef STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE # define STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE ((NTSTATUS) 0xC0000714L) #endif #ifndef STATUS_SYMLINK_CLASS_DISABLED # define STATUS_SYMLINK_CLASS_DISABLED ((NTSTATUS) 0xC0000715L) #endif #ifndef STATUS_INVALID_IDN_NORMALIZATION # define STATUS_INVALID_IDN_NORMALIZATION ((NTSTATUS) 0xC0000716L) #endif #ifndef STATUS_NO_UNICODE_TRANSLATION # define STATUS_NO_UNICODE_TRANSLATION ((NTSTATUS) 0xC0000717L) #endif #ifndef STATUS_ALREADY_REGISTERED # define STATUS_ALREADY_REGISTERED ((NTSTATUS) 0xC0000718L) #endif #ifndef STATUS_CONTEXT_MISMATCH # define STATUS_CONTEXT_MISMATCH ((NTSTATUS) 0xC0000719L) #endif #ifndef STATUS_PORT_ALREADY_HAS_COMPLETION_LIST # define STATUS_PORT_ALREADY_HAS_COMPLETION_LIST ((NTSTATUS) 0xC000071AL) #endif #ifndef STATUS_CALLBACK_RETURNED_THREAD_PRIORITY # define STATUS_CALLBACK_RETURNED_THREAD_PRIORITY ((NTSTATUS) 0xC000071BL) #endif #ifndef STATUS_INVALID_THREAD # define STATUS_INVALID_THREAD ((NTSTATUS) 0xC000071CL) #endif #ifndef STATUS_CALLBACK_RETURNED_TRANSACTION # define STATUS_CALLBACK_RETURNED_TRANSACTION ((NTSTATUS) 0xC000071DL) #endif #ifndef STATUS_CALLBACK_RETURNED_LDR_LOCK # define STATUS_CALLBACK_RETURNED_LDR_LOCK ((NTSTATUS) 0xC000071EL) #endif #ifndef STATUS_CALLBACK_RETURNED_LANG # define STATUS_CALLBACK_RETURNED_LANG ((NTSTATUS) 0xC000071FL) #endif #ifndef STATUS_CALLBACK_RETURNED_PRI_BACK # define STATUS_CALLBACK_RETURNED_PRI_BACK ((NTSTATUS) 0xC0000720L) #endif #ifndef STATUS_CALLBACK_RETURNED_THREAD_AFFINITY # define STATUS_CALLBACK_RETURNED_THREAD_AFFINITY ((NTSTATUS) 0xC0000721L) #endif #ifndef STATUS_DISK_REPAIR_DISABLED # define STATUS_DISK_REPAIR_DISABLED ((NTSTATUS) 0xC0000800L) #endif #ifndef STATUS_DS_DOMAIN_RENAME_IN_PROGRESS # define STATUS_DS_DOMAIN_RENAME_IN_PROGRESS ((NTSTATUS) 0xC0000801L) #endif #ifndef STATUS_DISK_QUOTA_EXCEEDED # define STATUS_DISK_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000802L) #endif #ifndef STATUS_DATA_LOST_REPAIR # define STATUS_DATA_LOST_REPAIR ((NTSTATUS) 0x80000803L) #endif #ifndef STATUS_CONTENT_BLOCKED # define STATUS_CONTENT_BLOCKED ((NTSTATUS) 0xC0000804L) #endif #ifndef STATUS_BAD_CLUSTERS # define STATUS_BAD_CLUSTERS ((NTSTATUS) 0xC0000805L) #endif #ifndef STATUS_VOLUME_DIRTY # define STATUS_VOLUME_DIRTY ((NTSTATUS) 0xC0000806L) #endif #ifndef STATUS_FILE_CHECKED_OUT # define STATUS_FILE_CHECKED_OUT ((NTSTATUS) 0xC0000901L) #endif #ifndef STATUS_CHECKOUT_REQUIRED # define STATUS_CHECKOUT_REQUIRED ((NTSTATUS) 0xC0000902L) #endif #ifndef STATUS_BAD_FILE_TYPE # define STATUS_BAD_FILE_TYPE ((NTSTATUS) 0xC0000903L) #endif #ifndef STATUS_FILE_TOO_LARGE # define STATUS_FILE_TOO_LARGE ((NTSTATUS) 0xC0000904L) #endif #ifndef STATUS_FORMS_AUTH_REQUIRED # define STATUS_FORMS_AUTH_REQUIRED ((NTSTATUS) 0xC0000905L) #endif #ifndef STATUS_VIRUS_INFECTED # define STATUS_VIRUS_INFECTED ((NTSTATUS) 0xC0000906L) #endif #ifndef STATUS_VIRUS_DELETED # define STATUS_VIRUS_DELETED ((NTSTATUS) 0xC0000907L) #endif #ifndef STATUS_BAD_MCFG_TABLE # define STATUS_BAD_MCFG_TABLE ((NTSTATUS) 0xC0000908L) #endif #ifndef STATUS_CANNOT_BREAK_OPLOCK # define STATUS_CANNOT_BREAK_OPLOCK ((NTSTATUS) 0xC0000909L) #endif #ifndef STATUS_WOW_ASSERTION # define STATUS_WOW_ASSERTION ((NTSTATUS) 0xC0009898L) #endif #ifndef STATUS_INVALID_SIGNATURE # define STATUS_INVALID_SIGNATURE ((NTSTATUS) 0xC000A000L) #endif #ifndef STATUS_HMAC_NOT_SUPPORTED # define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS) 0xC000A001L) #endif #ifndef STATUS_AUTH_TAG_MISMATCH # define STATUS_AUTH_TAG_MISMATCH ((NTSTATUS) 0xC000A002L) #endif #ifndef STATUS_IPSEC_QUEUE_OVERFLOW # define STATUS_IPSEC_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A010L) #endif #ifndef STATUS_ND_QUEUE_OVERFLOW # define STATUS_ND_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A011L) #endif #ifndef STATUS_HOPLIMIT_EXCEEDED # define STATUS_HOPLIMIT_EXCEEDED ((NTSTATUS) 0xC000A012L) #endif #ifndef STATUS_PROTOCOL_NOT_SUPPORTED # define STATUS_PROTOCOL_NOT_SUPPORTED ((NTSTATUS) 0xC000A013L) #endif #ifndef STATUS_FASTPATH_REJECTED # define STATUS_FASTPATH_REJECTED ((NTSTATUS) 0xC000A014L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED # define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED ((NTSTATUS) 0xC000A080L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR # define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR ((NTSTATUS) 0xC000A081L) #endif #ifndef STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR # define STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR ((NTSTATUS) 0xC000A082L) #endif #ifndef STATUS_XML_PARSE_ERROR # define STATUS_XML_PARSE_ERROR ((NTSTATUS) 0xC000A083L) #endif #ifndef STATUS_XMLDSIG_ERROR # define STATUS_XMLDSIG_ERROR ((NTSTATUS) 0xC000A084L) #endif #ifndef STATUS_WRONG_COMPARTMENT # define STATUS_WRONG_COMPARTMENT ((NTSTATUS) 0xC000A085L) #endif #ifndef STATUS_AUTHIP_FAILURE # define STATUS_AUTHIP_FAILURE ((NTSTATUS) 0xC000A086L) #endif #ifndef STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS # define STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS ((NTSTATUS) 0xC000A087L) #endif #ifndef STATUS_DS_OID_NOT_FOUND # define STATUS_DS_OID_NOT_FOUND ((NTSTATUS) 0xC000A088L) #endif #ifndef STATUS_HASH_NOT_SUPPORTED # define STATUS_HASH_NOT_SUPPORTED ((NTSTATUS) 0xC000A100L) #endif #ifndef STATUS_HASH_NOT_PRESENT # define STATUS_HASH_NOT_PRESENT ((NTSTATUS) 0xC000A101L) #endif /* This is not the NTSTATUS_FROM_WIN32 that the DDK provides, because the */ /* DDK got it wrong! */ #ifdef NTSTATUS_FROM_WIN32 # undef NTSTATUS_FROM_WIN32 #endif #define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \ ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \ (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_WARNING))) #ifndef JOB_OBJECT_LIMIT_PROCESS_MEMORY # define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100 #endif #ifndef JOB_OBJECT_LIMIT_JOB_MEMORY # define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200 #endif #ifndef JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION # define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400 #endif #ifndef JOB_OBJECT_LIMIT_BREAKAWAY_OK # define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800 #endif #ifndef JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK # define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000 #endif #ifndef JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE # define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 #endif #ifndef DEVICE_TYPE # define DEVICE_TYPE DWORD #endif /* from ntifs.h */ /* MinGW already has it, mingw-w64 does not. */ #if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; USHORT ReparseDataLength; USHORT Reserved; union { struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { USHORT SubstituteNameOffset; USHORT SubstituteNameLength; USHORT PrintNameOffset; USHORT PrintNameLength; WCHAR PathBuffer[1]; } MountPointReparseBuffer; struct { UCHAR DataBuffer[1]; } GenericReparseBuffer; } DUMMYUNIONNAME; } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; #endif typedef struct _IO_STATUS_BLOCK { union { NTSTATUS Status; PVOID Pointer; } DUMMYUNIONNAME; ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; typedef enum _FILE_INFORMATION_CLASS { FileDirectoryInformation = 1, FileFullDirectoryInformation, FileBothDirectoryInformation, FileBasicInformation, FileStandardInformation, FileInternalInformation, FileEaInformation, FileAccessInformation, FileNameInformation, FileRenameInformation, FileLinkInformation, FileNamesInformation, FileDispositionInformation, FilePositionInformation, FileFullEaInformation, FileModeInformation, FileAlignmentInformation, FileAllInformation, FileAllocationInformation, FileEndOfFileInformation, FileAlternateNameInformation, FileStreamInformation, FilePipeInformation, FilePipeLocalInformation, FilePipeRemoteInformation, FileMailslotQueryInformation, FileMailslotSetInformation, FileCompressionInformation, FileObjectIdInformation, FileCompletionInformation, FileMoveClusterInformation, FileQuotaInformation, FileReparsePointInformation, FileNetworkOpenInformation, FileAttributeTagInformation, FileTrackingInformation, FileIdBothDirectoryInformation, FileIdFullDirectoryInformation, FileValidDataLengthInformation, FileShortNameInformation, FileIoCompletionNotificationInformation, FileIoStatusBlockRangeInformation, FileIoPriorityHintInformation, FileSfioReserveInformation, FileSfioVolumeInformation, FileHardLinkInformation, FileProcessIdsUsingFileInformation, FileNormalizedNameInformation, FileNetworkPhysicalNameInformation, FileIdGlobalTxDirectoryInformation, FileIsRemoteDeviceInformation, FileAttributeCacheInformation, FileNumaNodeInformation, FileStandardLinkInformation, FileRemoteProtocolInformation, FileMaximumInformation } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; DWORD FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG NumberOfLinks; BOOLEAN DeletePending; BOOLEAN Directory; } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; typedef struct _FILE_INTERNAL_INFORMATION { LARGE_INTEGER IndexNumber; } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; typedef struct _FILE_EA_INFORMATION { ULONG EaSize; } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; typedef struct _FILE_ACCESS_INFORMATION { ACCESS_MASK AccessFlags; } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; typedef struct _FILE_MODE_INFORMATION { ULONG Mode; } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; typedef struct _FILE_ALIGNMENT_INFORMATION { ULONG AlignmentRequirement; } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; typedef struct _FILE_NAME_INFORMATION { ULONG FileNameLength; WCHAR FileName[1]; } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; typedef struct _FILE_END_OF_FILE_INFORMATION { LARGE_INTEGER EndOfFile; } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; typedef struct _FILE_ALL_INFORMATION { FILE_BASIC_INFORMATION BasicInformation; FILE_STANDARD_INFORMATION StandardInformation; FILE_INTERNAL_INFORMATION InternalInformation; FILE_EA_INFORMATION EaInformation; FILE_ACCESS_INFORMATION AccessInformation; FILE_POSITION_INFORMATION PositionInformation; FILE_MODE_INFORMATION ModeInformation; FILE_ALIGNMENT_INFORMATION AlignmentInformation; FILE_NAME_INFORMATION NameInformation; } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; typedef struct _FILE_DISPOSITION_INFORMATION { BOOLEAN DeleteFile; } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; typedef struct _FILE_PIPE_LOCAL_INFORMATION { ULONG NamedPipeType; ULONG NamedPipeConfiguration; ULONG MaximumInstances; ULONG CurrentInstances; ULONG InboundQuota; ULONG ReadDataAvailable; ULONG OutboundQuota; ULONG WriteQuotaAvailable; ULONG NamedPipeState; ULONG NamedPipeEnd; } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 typedef enum _FS_INFORMATION_CLASS { FileFsVolumeInformation = 1, FileFsLabelInformation = 2, FileFsSizeInformation = 3, FileFsDeviceInformation = 4, FileFsAttributeInformation = 5, FileFsControlInformation = 6, FileFsFullSizeInformation = 7, FileFsObjectIdInformation = 8, FileFsDriverPathInformation = 9, FileFsVolumeFlagsInformation = 10, FileFsSectorSizeInformation = 11 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; typedef struct _FILE_FS_VOLUME_INFORMATION { LARGE_INTEGER VolumeCreationTime; ULONG VolumeSerialNumber; ULONG VolumeLabelLength; BOOLEAN SupportsObjects; WCHAR VolumeLabel[1]; } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; typedef struct _FILE_FS_LABEL_INFORMATION { ULONG VolumeLabelLength; WCHAR VolumeLabel[1]; } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; typedef struct _FILE_FS_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER AvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; typedef struct _FILE_FS_DEVICE_INFORMATION { DEVICE_TYPE DeviceType; ULONG Characteristics; } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { ULONG FileSystemAttributes; LONG MaximumComponentNameLength; ULONG FileSystemNameLength; WCHAR FileSystemName[1]; } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; typedef struct _FILE_FS_CONTROL_INFORMATION { LARGE_INTEGER FreeSpaceStartFiltering; LARGE_INTEGER FreeSpaceThreshold; LARGE_INTEGER FreeSpaceStopFiltering; LARGE_INTEGER DefaultQuotaThreshold; LARGE_INTEGER DefaultQuotaLimit; ULONG FileSystemControlFlags; } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; typedef struct _FILE_FS_FULL_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER CallerAvailableAllocationUnits; LARGE_INTEGER ActualAvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; typedef struct _FILE_FS_OBJECTID_INFORMATION { UCHAR ObjectId[16]; UCHAR ExtendedInfo[48]; } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; typedef struct _FILE_FS_DRIVER_PATH_INFORMATION { BOOLEAN DriverInPath; ULONG DriverNameLength; WCHAR DriverName[1]; } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION; typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION { ULONG Flags; } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION; typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION { ULONG LogicalBytesPerSector; ULONG PhysicalBytesPerSectorForAtomicity; ULONG PhysicalBytesPerSectorForPerformance; ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity; ULONG Flags; ULONG ByteOffsetForSectorAlignment; ULONG ByteOffsetForPartitionAlignment; } FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION; typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION { LARGE_INTEGER IdleTime; LARGE_INTEGER KernelTime; LARGE_INTEGER UserTime; LARGE_INTEGER DpcTime; LARGE_INTEGER InterruptTime; ULONG InterruptCount; } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION; #ifndef SystemProcessorPerformanceInformation # define SystemProcessorPerformanceInformation 8 #endif #ifndef FILE_DEVICE_FILE_SYSTEM # define FILE_DEVICE_FILE_SYSTEM 0x00000009 #endif #ifndef FILE_DEVICE_NETWORK # define FILE_DEVICE_NETWORK 0x00000012 #endif #ifndef METHOD_BUFFERED # define METHOD_BUFFERED 0 #endif #ifndef METHOD_IN_DIRECT # define METHOD_IN_DIRECT 1 #endif #ifndef METHOD_OUT_DIRECT # define METHOD_OUT_DIRECT 2 #endif #ifndef METHOD_NEITHER #define METHOD_NEITHER 3 #endif #ifndef METHOD_DIRECT_TO_HARDWARE # define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #endif #ifndef METHOD_DIRECT_FROM_HARDWARE # define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT #endif #ifndef FILE_ANY_ACCESS # define FILE_ANY_ACCESS 0 #endif #ifndef FILE_SPECIAL_ACCESS # define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) #endif #ifndef FILE_READ_ACCESS # define FILE_READ_ACCESS 0x0001 #endif #ifndef FILE_WRITE_ACCESS # define FILE_WRITE_ACCESS 0x0002 #endif #ifndef CTL_CODE # define CTL_CODE(device_type, function, method, access) \ (((device_type) << 16) | ((access) << 14) | ((function) << 2) | (method)) #endif #ifndef FSCTL_SET_REPARSE_POINT # define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 41, \ METHOD_BUFFERED, \ FILE_SPECIAL_ACCESS) #endif #ifndef FSCTL_GET_REPARSE_POINT # define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 42, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #endif #ifndef FSCTL_DELETE_REPARSE_POINT # define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ 43, \ METHOD_BUFFERED, \ FILE_SPECIAL_ACCESS) #endif #ifndef IO_REPARSE_TAG_SYMLINK # define IO_REPARSE_TAG_SYMLINK (0xA000000CL) #endif typedef VOID (NTAPI *PIO_APC_ROUTINE) (PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved); typedef ULONG (NTAPI *sRtlNtStatusToDosError) (NTSTATUS Status); typedef NTSTATUS (NTAPI *sNtDeviceIoControlFile) (HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength); typedef NTSTATUS (NTAPI *sNtQueryInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); typedef NTSTATUS (NTAPI *sNtSetInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); typedef NTSTATUS (NTAPI *sNtQueryVolumeInformationFile) (HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass); typedef NTSTATUS (NTAPI *sNtQuerySystemInformation) (UINT SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength); /* * Kernel32 headers */ #ifndef FILE_SKIP_COMPLETION_PORT_ON_SUCCESS # define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 #endif #ifndef FILE_SKIP_SET_EVENT_ON_HANDLE # define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 #endif #ifndef SYMBOLIC_LINK_FLAG_DIRECTORY # define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1 #endif #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct _OVERLAPPED_ENTRY { ULONG_PTR lpCompletionKey; LPOVERLAPPED lpOverlapped; ULONG_PTR Internal; DWORD dwNumberOfBytesTransferred; } OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY; #endif /* from wincon.h */ #ifndef ENABLE_INSERT_MODE # define ENABLE_INSERT_MODE 0x20 #endif #ifndef ENABLE_QUICK_EDIT_MODE # define ENABLE_QUICK_EDIT_MODE 0x40 #endif #ifndef ENABLE_EXTENDED_FLAGS # define ENABLE_EXTENDED_FLAGS 0x80 #endif /* from winerror.h */ #ifndef ERROR_SYMLINK_NOT_SUPPORTED # define ERROR_SYMLINK_NOT_SUPPORTED 1464 #endif typedef BOOL (WINAPI *sGetQueuedCompletionStatusEx) (HANDLE CompletionPort, LPOVERLAPPED_ENTRY lpCompletionPortEntries, ULONG ulCount, PULONG ulNumEntriesRemoved, DWORD dwMilliseconds, BOOL fAlertable); typedef BOOL (WINAPI* sSetFileCompletionNotificationModes) (HANDLE FileHandle, UCHAR Flags); typedef BOOLEAN (WINAPI* sCreateSymbolicLinkW) (LPCWSTR lpSymlinkFileName, LPCWSTR lpTargetFileName, DWORD dwFlags); typedef BOOL (WINAPI* sCancelIoEx) (HANDLE hFile, LPOVERLAPPED lpOverlapped); typedef VOID (WINAPI* sInitializeSRWLock) (PSRWLOCK SRWLock); typedef VOID (WINAPI* sAcquireSRWLockShared) (PSRWLOCK SRWLock); typedef VOID (WINAPI* sAcquireSRWLockExclusive) (PSRWLOCK SRWLock); typedef BOOL (WINAPI* sTryAcquireSRWLockShared) (PSRWLOCK SRWLock); typedef BOOL (WINAPI* sTryAcquireSRWLockExclusive) (PSRWLOCK SRWLock); typedef VOID (WINAPI* sReleaseSRWLockShared) (PSRWLOCK SRWLock); typedef VOID (WINAPI* sReleaseSRWLockExclusive) (PSRWLOCK SRWLock); typedef VOID (WINAPI* sInitializeConditionVariable) (PCONDITION_VARIABLE ConditionVariable); typedef BOOL (WINAPI* sSleepConditionVariableCS) (PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD dwMilliseconds); typedef BOOL (WINAPI* sSleepConditionVariableSRW) (PCONDITION_VARIABLE ConditionVariable, PSRWLOCK SRWLock, DWORD dwMilliseconds, ULONG Flags); typedef VOID (WINAPI* sWakeAllConditionVariable) (PCONDITION_VARIABLE ConditionVariable); typedef VOID (WINAPI* sWakeConditionVariable) (PCONDITION_VARIABLE ConditionVariable); typedef BOOL (WINAPI* sCancelSynchronousIo) (HANDLE hThread); /* Ntdll function pointers */ extern sRtlNtStatusToDosError pRtlNtStatusToDosError; extern sNtDeviceIoControlFile pNtDeviceIoControlFile; extern sNtQueryInformationFile pNtQueryInformationFile; extern sNtSetInformationFile pNtSetInformationFile; extern sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; extern sNtQuerySystemInformation pNtQuerySystemInformation; /* Kernel32 function pointers */ extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; extern sSetFileCompletionNotificationModes pSetFileCompletionNotificationModes; extern sCreateSymbolicLinkW pCreateSymbolicLinkW; extern sCancelIoEx pCancelIoEx; extern sInitializeSRWLock pInitializeSRWLock; extern sAcquireSRWLockShared pAcquireSRWLockShared; extern sAcquireSRWLockExclusive pAcquireSRWLockExclusive; extern sTryAcquireSRWLockShared pTryAcquireSRWLockShared; extern sTryAcquireSRWLockExclusive pTryAcquireSRWLockExclusive; extern sReleaseSRWLockShared pReleaseSRWLockShared; extern sReleaseSRWLockExclusive pReleaseSRWLockExclusive; extern sInitializeConditionVariable pInitializeConditionVariable; extern sSleepConditionVariableCS pSleepConditionVariableCS; extern sSleepConditionVariableSRW pSleepConditionVariableSRW; extern sWakeAllConditionVariable pWakeAllConditionVariable; extern sWakeConditionVariable pWakeConditionVariable; extern sCancelSynchronousIo pCancelSynchronousIo; #endif /* UV_WIN_WINAPI_H_ */ MoarVM-2015.11/3rdparty/libuv/src/win/winsock.c0000644000175000017500000003605012456307253020161 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "uv.h" #include "internal.h" /* Whether there are any non-IFS LSPs stacked on TCP */ int uv_tcp_non_ifs_lsp_ipv4; int uv_tcp_non_ifs_lsp_ipv6; /* Ip address used to bind to any port at any interface */ struct sockaddr_in uv_addr_ip4_any_; struct sockaddr_in6 uv_addr_ip6_any_; /* * Retrieves the pointer to a winsock extension function. */ static BOOL uv_get_extension_function(SOCKET socket, GUID guid, void **target) { int result; DWORD bytes; result = WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), (void*)target, sizeof(*target), &bytes, NULL, NULL); if (result == SOCKET_ERROR) { *target = NULL; return FALSE; } else { return TRUE; } } BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target) { const GUID wsaid_acceptex = WSAID_ACCEPTEX; return uv_get_extension_function(socket, wsaid_acceptex, (void**)target); } BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target) { const GUID wsaid_connectex = WSAID_CONNECTEX; return uv_get_extension_function(socket, wsaid_connectex, (void**)target); } static int error_means_no_support(DWORD error) { return error == WSAEPROTONOSUPPORT || error == WSAESOCKTNOSUPPORT || error == WSAEPFNOSUPPORT || error == WSAEAFNOSUPPORT; } void uv_winsock_init() { WSADATA wsa_data; int errorno; SOCKET dummy; WSAPROTOCOL_INFOW protocol_info; int opt_len; /* Initialize winsock */ errorno = WSAStartup(MAKEWORD(2, 2), &wsa_data); if (errorno != 0) { uv_fatal_error(errorno, "WSAStartup"); } /* Set implicit binding address used by connectEx */ if (uv_ip4_addr("0.0.0.0", 0, &uv_addr_ip4_any_)) { abort(); } if (uv_ip6_addr("::", 0, &uv_addr_ip6_any_)) { abort(); } /* Detect non-IFS LSPs */ dummy = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (dummy != INVALID_SOCKET) { opt_len = (int) sizeof protocol_info; if (getsockopt(dummy, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) uv_fatal_error(WSAGetLastError(), "getsockopt"); if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) uv_tcp_non_ifs_lsp_ipv4 = 1; if (closesocket(dummy) == SOCKET_ERROR) uv_fatal_error(WSAGetLastError(), "closesocket"); } else if (!error_means_no_support(WSAGetLastError())) { /* Any error other than "socket type not supported" is fatal. */ uv_fatal_error(WSAGetLastError(), "socket"); } /* Detect IPV6 support and non-IFS LSPs */ dummy = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP); if (dummy != INVALID_SOCKET) { opt_len = (int) sizeof protocol_info; if (getsockopt(dummy, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &protocol_info, &opt_len) == SOCKET_ERROR) uv_fatal_error(WSAGetLastError(), "getsockopt"); if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) uv_tcp_non_ifs_lsp_ipv6 = 1; if (closesocket(dummy) == SOCKET_ERROR) uv_fatal_error(WSAGetLastError(), "closesocket"); } else if (!error_means_no_support(WSAGetLastError())) { /* Any error other than "socket type not supported" is fatal. */ uv_fatal_error(WSAGetLastError(), "socket"); } } int uv_ntstatus_to_winsock_error(NTSTATUS status) { switch (status) { case STATUS_SUCCESS: return ERROR_SUCCESS; case STATUS_PENDING: return ERROR_IO_PENDING; case STATUS_INVALID_HANDLE: case STATUS_OBJECT_TYPE_MISMATCH: return WSAENOTSOCK; case STATUS_INSUFFICIENT_RESOURCES: case STATUS_PAGEFILE_QUOTA: case STATUS_COMMITMENT_LIMIT: case STATUS_WORKING_SET_QUOTA: case STATUS_NO_MEMORY: case STATUS_QUOTA_EXCEEDED: case STATUS_TOO_MANY_PAGING_FILES: case STATUS_REMOTE_RESOURCES: return WSAENOBUFS; case STATUS_TOO_MANY_ADDRESSES: case STATUS_SHARING_VIOLATION: case STATUS_ADDRESS_ALREADY_EXISTS: return WSAEADDRINUSE; case STATUS_LINK_TIMEOUT: case STATUS_IO_TIMEOUT: case STATUS_TIMEOUT: return WSAETIMEDOUT; case STATUS_GRACEFUL_DISCONNECT: return WSAEDISCON; case STATUS_REMOTE_DISCONNECT: case STATUS_CONNECTION_RESET: case STATUS_LINK_FAILED: case STATUS_CONNECTION_DISCONNECTED: case STATUS_PORT_UNREACHABLE: case STATUS_HOPLIMIT_EXCEEDED: return WSAECONNRESET; case STATUS_LOCAL_DISCONNECT: case STATUS_TRANSACTION_ABORTED: case STATUS_CONNECTION_ABORTED: return WSAECONNABORTED; case STATUS_BAD_NETWORK_PATH: case STATUS_NETWORK_UNREACHABLE: case STATUS_PROTOCOL_UNREACHABLE: return WSAENETUNREACH; case STATUS_HOST_UNREACHABLE: return WSAEHOSTUNREACH; case STATUS_CANCELLED: case STATUS_REQUEST_ABORTED: return WSAEINTR; case STATUS_BUFFER_OVERFLOW: case STATUS_INVALID_BUFFER_SIZE: return WSAEMSGSIZE; case STATUS_BUFFER_TOO_SMALL: case STATUS_ACCESS_VIOLATION: return WSAEFAULT; case STATUS_DEVICE_NOT_READY: case STATUS_REQUEST_NOT_ACCEPTED: return WSAEWOULDBLOCK; case STATUS_INVALID_NETWORK_RESPONSE: case STATUS_NETWORK_BUSY: case STATUS_NO_SUCH_DEVICE: case STATUS_NO_SUCH_FILE: case STATUS_OBJECT_PATH_NOT_FOUND: case STATUS_OBJECT_NAME_NOT_FOUND: case STATUS_UNEXPECTED_NETWORK_ERROR: return WSAENETDOWN; case STATUS_INVALID_CONNECTION: return WSAENOTCONN; case STATUS_REMOTE_NOT_LISTENING: case STATUS_CONNECTION_REFUSED: return WSAECONNREFUSED; case STATUS_PIPE_DISCONNECTED: return WSAESHUTDOWN; case STATUS_CONFLICTING_ADDRESSES: case STATUS_INVALID_ADDRESS: case STATUS_INVALID_ADDRESS_COMPONENT: return WSAEADDRNOTAVAIL; case STATUS_NOT_SUPPORTED: case STATUS_NOT_IMPLEMENTED: return WSAEOPNOTSUPP; case STATUS_ACCESS_DENIED: return WSAEACCES; default: if ((status & (FACILITY_NTWIN32 << 16)) == (FACILITY_NTWIN32 << 16) && (status & (ERROR_SEVERITY_ERROR | ERROR_SEVERITY_WARNING))) { /* It's a windows error that has been previously mapped to an */ /* ntstatus code. */ return (DWORD) (status & 0xffff); } else { /* The default fallback for unmappable ntstatus codes. */ return WSAEINVAL; } } } /* * This function provides a workaround for a bug in the winsock implementation * of WSARecv. The problem is that when SetFileCompletionNotificationModes is * used to avoid IOCP notifications of completed reads, WSARecv does not * reliably indicate whether we can expect a completion package to be posted * when the receive buffer is smaller than the received datagram. * * However it is desirable to use SetFileCompletionNotificationModes because * it yields a massive performance increase. * * This function provides a workaround for that bug, but it only works for the * specific case that we need it for. E.g. it assumes that the "avoid iocp" * bit has been set, and supports only overlapped operation. It also requires * the user to use the default msafd driver, doesn't work when other LSPs are * stacked on top of it. */ int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { NTSTATUS status; void* apc_context; IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; AFD_RECV_INFO info; DWORD error; if (overlapped == NULL || completion_routine != NULL) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } info.BufferArray = buffers; info.BufferCount = buffer_count; info.AfdFlags = AFD_OVERLAPPED; info.TdiFlags = TDI_RECEIVE_NORMAL; if (*flags & MSG_PEEK) { info.TdiFlags |= TDI_RECEIVE_PEEK; } if (*flags & MSG_PARTIAL) { info.TdiFlags |= TDI_RECEIVE_PARTIAL; } if (!((intptr_t) overlapped->hEvent & 1)) { apc_context = (void*) overlapped; } else { apc_context = NULL; } iosb->Status = STATUS_PENDING; iosb->Pointer = 0; status = pNtDeviceIoControlFile((HANDLE) socket, overlapped->hEvent, NULL, apc_context, iosb, IOCTL_AFD_RECEIVE, &info, sizeof(info), NULL, 0); *flags = 0; *bytes = (DWORD) iosb->Information; switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; case STATUS_BUFFER_OVERFLOW: error = WSAEMSGSIZE; break; case STATUS_RECEIVE_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_OOB; break; case STATUS_RECEIVE_PARTIAL_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_PARTIAL | MSG_OOB; break; case STATUS_RECEIVE_PARTIAL: error = ERROR_SUCCESS; *flags = MSG_PARTIAL; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } /* See description of uv_wsarecv_workaround. */ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, int* addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { NTSTATUS status; void* apc_context; IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; AFD_RECV_DATAGRAM_INFO info; DWORD error; if (overlapped == NULL || addr == NULL || addr_len == NULL || completion_routine != NULL) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } info.BufferArray = buffers; info.BufferCount = buffer_count; info.AfdFlags = AFD_OVERLAPPED; info.TdiFlags = TDI_RECEIVE_NORMAL; info.Address = addr; info.AddressLength = addr_len; if (*flags & MSG_PEEK) { info.TdiFlags |= TDI_RECEIVE_PEEK; } if (*flags & MSG_PARTIAL) { info.TdiFlags |= TDI_RECEIVE_PARTIAL; } if (!((intptr_t) overlapped->hEvent & 1)) { apc_context = (void*) overlapped; } else { apc_context = NULL; } iosb->Status = STATUS_PENDING; iosb->Pointer = 0; status = pNtDeviceIoControlFile((HANDLE) socket, overlapped->hEvent, NULL, apc_context, iosb, IOCTL_AFD_RECEIVE_DATAGRAM, &info, sizeof(info), NULL, 0); *flags = 0; *bytes = (DWORD) iosb->Information; switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; case STATUS_BUFFER_OVERFLOW: error = WSAEMSGSIZE; break; case STATUS_RECEIVE_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_OOB; break; case STATUS_RECEIVE_PARTIAL_EXPEDITED: error = ERROR_SUCCESS; *flags = MSG_PARTIAL | MSG_OOB; break; case STATUS_RECEIVE_PARTIAL: error = ERROR_SUCCESS; *flags = MSG_PARTIAL; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info, OVERLAPPED* overlapped) { IO_STATUS_BLOCK iosb; IO_STATUS_BLOCK* iosb_ptr; HANDLE event = NULL; void* apc_context; NTSTATUS status; DWORD error; if (overlapped != NULL) { /* Overlapped operation. */ iosb_ptr = (IO_STATUS_BLOCK*) &overlapped->Internal; event = overlapped->hEvent; /* Do not report iocp completion if hEvent is tagged. */ if ((uintptr_t) event & 1) { event = (HANDLE)((uintptr_t) event & ~(uintptr_t) 1); apc_context = NULL; } else { apc_context = overlapped; } } else { /* Blocking operation. */ iosb_ptr = &iosb; event = CreateEvent(NULL, FALSE, FALSE, NULL); if (event == NULL) { return SOCKET_ERROR; } apc_context = NULL; } iosb_ptr->Status = STATUS_PENDING; status = pNtDeviceIoControlFile((HANDLE) socket, event, NULL, apc_context, iosb_ptr, IOCTL_AFD_POLL, info, sizeof *info, info, sizeof *info); if (overlapped == NULL) { /* If this is a blocking operation, wait for the event to become */ /* signaled, and then grab the real status from the io status block. */ if (status == STATUS_PENDING) { DWORD r = WaitForSingleObject(event, INFINITE); if (r == WAIT_FAILED) { DWORD saved_error = GetLastError(); CloseHandle(event); WSASetLastError(saved_error); return SOCKET_ERROR; } status = iosb.Status; } CloseHandle(event); } switch (status) { case STATUS_SUCCESS: error = ERROR_SUCCESS; break; case STATUS_PENDING: error = WSA_IO_PENDING; break; default: error = uv_ntstatus_to_winsock_error(status); break; } WSASetLastError(error); if (error == ERROR_SUCCESS) { return 0; } else { return SOCKET_ERROR; } } MoarVM-2015.11/3rdparty/libuv/src/win/winsock.h0000644000175000017500000001420012502366750020156 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef UV_WIN_WINSOCK_H_ #define UV_WIN_WINSOCK_H_ #include #include #include #include #include #include "winapi.h" /* * MinGW is missing these too */ #ifndef SO_UPDATE_CONNECT_CONTEXT # define SO_UPDATE_CONNECT_CONTEXT 0x7010 #endif #ifndef TCP_KEEPALIVE # define TCP_KEEPALIVE 3 #endif #ifndef IPV6_V6ONLY # define IPV6_V6ONLY 27 #endif #ifndef IPV6_HOPLIMIT # define IPV6_HOPLIMIT 21 #endif #ifndef SIO_BASE_HANDLE # define SIO_BASE_HANDLE 0x48000022 #endif /* * TDI defines that are only in the DDK. * We only need receive flags so far. */ #ifndef TDI_RECEIVE_NORMAL #define TDI_RECEIVE_BROADCAST 0x00000004 #define TDI_RECEIVE_MULTICAST 0x00000008 #define TDI_RECEIVE_PARTIAL 0x00000010 #define TDI_RECEIVE_NORMAL 0x00000020 #define TDI_RECEIVE_EXPEDITED 0x00000040 #define TDI_RECEIVE_PEEK 0x00000080 #define TDI_RECEIVE_NO_RESPONSE_EXP 0x00000100 #define TDI_RECEIVE_COPY_LOOKAHEAD 0x00000200 #define TDI_RECEIVE_ENTIRE_MESSAGE 0x00000400 #define TDI_RECEIVE_AT_DISPATCH_LEVEL 0x00000800 #define TDI_RECEIVE_CONTROL_INFO 0x00001000 #define TDI_RECEIVE_FORCE_INDICATION 0x00002000 #define TDI_RECEIVE_NO_PUSH 0x00004000 #endif /* * The "Auxiliary Function Driver" is the windows kernel-mode driver that does * TCP, UDP etc. Winsock is just a layer that dispatches requests to it. * Having these definitions allows us to bypass winsock and make an AFD kernel * call directly, avoiding a bug in winsock's recvfrom implementation. */ #define AFD_NO_FAST_IO 0x00000001 #define AFD_OVERLAPPED 0x00000002 #define AFD_IMMEDIATE 0x00000004 #define AFD_POLL_RECEIVE_BIT 0 #define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) #define AFD_POLL_RECEIVE_EXPEDITED_BIT 1 #define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) #define AFD_POLL_SEND_BIT 2 #define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) #define AFD_POLL_DISCONNECT_BIT 3 #define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) #define AFD_POLL_ABORT_BIT 4 #define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) #define AFD_POLL_LOCAL_CLOSE_BIT 5 #define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) #define AFD_POLL_CONNECT_BIT 6 #define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) #define AFD_POLL_ACCEPT_BIT 7 #define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) #define AFD_POLL_CONNECT_FAIL_BIT 8 #define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) #define AFD_POLL_QOS_BIT 9 #define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) #define AFD_POLL_GROUP_QOS_BIT 10 #define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) #define AFD_NUM_POLL_EVENTS 11 #define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) typedef struct _AFD_RECV_DATAGRAM_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; struct sockaddr* Address; int* AddressLength; } AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO; typedef struct _AFD_RECV_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; } AFD_RECV_INFO, *PAFD_RECV_INFO; #define _AFD_CONTROL_CODE(operation, method) \ ((FSCTL_AFD_BASE) << 12 | (operation << 2) | method) #define FSCTL_AFD_BASE FILE_DEVICE_NETWORK #define AFD_RECEIVE 5 #define AFD_RECEIVE_DATAGRAM 6 #define AFD_POLL 9 #define IOCTL_AFD_RECEIVE \ _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER) #define IOCTL_AFD_RECEIVE_DATAGRAM \ _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER) #define IOCTL_AFD_POLL \ _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED) #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP { /* FIXME: __C89_NAMELESS was removed */ /* __C89_NAMELESS */ union { ULONGLONG Alignment; /* __C89_NAMELESS */ struct { ULONG Length; DWORD Flags; }; }; struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next; SOCKET_ADDRESS Address; IP_PREFIX_ORIGIN PrefixOrigin; IP_SUFFIX_ORIGIN SuffixOrigin; IP_DAD_STATE DadState; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG LeaseLifetime; } IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP; typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Flags; }; }; struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next; SOCKET_ADDRESS Address; IP_PREFIX_ORIGIN PrefixOrigin; IP_SUFFIX_ORIGIN SuffixOrigin; IP_DAD_STATE DadState; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG LeaseLifetime; UINT8 OnLinkPrefixLength; } IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH; #endif #endif /* UV_WIN_WINSOCK_H_ */ MoarVM-2015.11/3rdparty/libuv/test/benchmark-async-pummel.c0000644000175000017500000000631512456307253022442 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include #define NUM_PINGS (1000 * 1000) #define ACCESS_ONCE(type, var) (*(volatile type*) &(var)) static unsigned int callbacks; static volatile int done; static const char running[] = "running"; static const char stop[] = "stop"; static const char stopped[] = "stopped"; static void async_cb(uv_async_t* handle) { if (++callbacks == NUM_PINGS) { /* Tell the pummel thread to stop. */ ACCESS_ONCE(const char*, handle->data) = stop; /* Wait for for the pummel thread to acknowledge that it has stoppped. */ while (ACCESS_ONCE(const char*, handle->data) != stopped) uv_sleep(0); uv_close((uv_handle_t*) handle, NULL); } } static void pummel(void* arg) { uv_async_t* handle = (uv_async_t*) arg; while (ACCESS_ONCE(const char*, handle->data) == running) uv_async_send(handle); /* Acknowledge that we've seen handle->data change. */ ACCESS_ONCE(const char*, handle->data) = stopped; } static int test_async_pummel(int nthreads) { uv_thread_t* tids; uv_async_t handle; uint64_t time; int i; tids = calloc(nthreads, sizeof(tids[0])); ASSERT(tids != NULL); ASSERT(0 == uv_async_init(uv_default_loop(), &handle, async_cb)); ACCESS_ONCE(const char*, handle.data) = running; for (i = 0; i < nthreads; i++) ASSERT(0 == uv_thread_create(tids + i, pummel, &handle)); time = uv_hrtime(); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); time = uv_hrtime() - time; done = 1; for (i = 0; i < nthreads; i++) ASSERT(0 == uv_thread_join(tids + i)); printf("async_pummel_%d: %s callbacks in %.2f seconds (%s/sec)\n", nthreads, fmt(callbacks), time / 1e9, fmt(callbacks / (time / 1e9))); free(tids); MAKE_VALGRIND_HAPPY(); return 0; } BENCHMARK_IMPL(async_pummel_1) { return test_async_pummel(1); } BENCHMARK_IMPL(async_pummel_2) { return test_async_pummel(2); } BENCHMARK_IMPL(async_pummel_4) { return test_async_pummel(4); } BENCHMARK_IMPL(async_pummel_8) { return test_async_pummel(8); } MoarVM-2015.11/3rdparty/libuv/test/benchmark-async.c0000644000175000017500000000734512456307253021151 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include #define NUM_PINGS (1000 * 1000) struct ctx { uv_loop_t loop; uv_thread_t thread; uv_async_t main_async; /* wake up main thread */ uv_async_t worker_async; /* wake up worker */ unsigned int nthreads; unsigned int main_sent; unsigned int main_seen; unsigned int worker_sent; unsigned int worker_seen; }; static void worker_async_cb(uv_async_t* handle) { struct ctx* ctx = container_of(handle, struct ctx, worker_async); ASSERT(0 == uv_async_send(&ctx->main_async)); ctx->worker_sent++; ctx->worker_seen++; if (ctx->worker_sent >= NUM_PINGS) uv_close((uv_handle_t*) &ctx->worker_async, NULL); } static void main_async_cb(uv_async_t* handle) { struct ctx* ctx = container_of(handle, struct ctx, main_async); ASSERT(0 == uv_async_send(&ctx->worker_async)); ctx->main_sent++; ctx->main_seen++; if (ctx->main_sent >= NUM_PINGS) uv_close((uv_handle_t*) &ctx->main_async, NULL); } static void worker(void* arg) { struct ctx* ctx = arg; ASSERT(0 == uv_async_send(&ctx->main_async)); ASSERT(0 == uv_run(&ctx->loop, UV_RUN_DEFAULT)); uv_loop_close(&ctx->loop); } static int test_async(int nthreads) { struct ctx* threads; struct ctx* ctx; uint64_t time; int i; threads = calloc(nthreads, sizeof(threads[0])); ASSERT(threads != NULL); for (i = 0; i < nthreads; i++) { ctx = threads + i; ctx->nthreads = nthreads; ASSERT(0 == uv_loop_init(&ctx->loop)); ASSERT(0 == uv_async_init(&ctx->loop, &ctx->worker_async, worker_async_cb)); ASSERT(0 == uv_async_init(uv_default_loop(), &ctx->main_async, main_async_cb)); ASSERT(0 == uv_thread_create(&ctx->thread, worker, ctx)); } time = uv_hrtime(); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); for (i = 0; i < nthreads; i++) ASSERT(0 == uv_thread_join(&threads[i].thread)); time = uv_hrtime() - time; for (i = 0; i < nthreads; i++) { ctx = threads + i; ASSERT(ctx->worker_sent == NUM_PINGS); ASSERT(ctx->worker_seen == NUM_PINGS); ASSERT(ctx->main_sent == (unsigned int) NUM_PINGS); ASSERT(ctx->main_seen == (unsigned int) NUM_PINGS); } printf("async%d: %.2f sec (%s/sec)\n", nthreads, time / 1e9, fmt(NUM_PINGS / (time / 1e9))); free(threads); MAKE_VALGRIND_HAPPY(); return 0; } BENCHMARK_IMPL(async1) { return test_async(1); } BENCHMARK_IMPL(async2) { return test_async(2); } BENCHMARK_IMPL(async4) { return test_async(4); } BENCHMARK_IMPL(async8) { return test_async(8); } MoarVM-2015.11/3rdparty/libuv/test/benchmark-fs-stat.c0000644000175000017500000001001112456307253021375 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include #define NUM_SYNC_REQS (10 * 1e5) #define NUM_ASYNC_REQS (1 * (int) 1e5) #define MAX_CONCURRENT_REQS 32 #define sync_stat(req, path) \ do { \ uv_fs_stat(uv_default_loop(), (req), (path), NULL); \ uv_fs_req_cleanup((req)); \ } \ while (0) struct async_req { const char* path; uv_fs_t fs_req; int* count; }; static void warmup(const char* path) { uv_fs_t reqs[MAX_CONCURRENT_REQS]; unsigned int i; /* warm up the thread pool */ for (i = 0; i < ARRAY_SIZE(reqs); i++) uv_fs_stat(uv_default_loop(), reqs + i, path, uv_fs_req_cleanup); uv_run(uv_default_loop(), UV_RUN_DEFAULT); /* warm up the OS dirent cache */ for (i = 0; i < 16; i++) sync_stat(reqs + 0, path); } static void sync_bench(const char* path) { uint64_t before; uint64_t after; uv_fs_t req; int i; /* do the sync benchmark */ before = uv_hrtime(); for (i = 0; i < NUM_SYNC_REQS; i++) sync_stat(&req, path); after = uv_hrtime(); printf("%s stats (sync): %.2fs (%s/s)\n", fmt(1.0 * NUM_SYNC_REQS), (after - before) / 1e9, fmt((1.0 * NUM_SYNC_REQS) / ((after - before) / 1e9))); fflush(stdout); } static void stat_cb(uv_fs_t* fs_req) { struct async_req* req = container_of(fs_req, struct async_req, fs_req); uv_fs_req_cleanup(&req->fs_req); if (*req->count == 0) return; uv_fs_stat(uv_default_loop(), &req->fs_req, req->path, stat_cb); (*req->count)--; } static void async_bench(const char* path) { struct async_req reqs[MAX_CONCURRENT_REQS]; struct async_req* req; uint64_t before; uint64_t after; int count; int i; for (i = 1; i <= MAX_CONCURRENT_REQS; i++) { count = NUM_ASYNC_REQS; for (req = reqs; req < reqs + i; req++) { req->path = path; req->count = &count; uv_fs_stat(uv_default_loop(), &req->fs_req, req->path, stat_cb); } before = uv_hrtime(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); after = uv_hrtime(); printf("%s stats (%d concurrent): %.2fs (%s/s)\n", fmt(1.0 * NUM_ASYNC_REQS), i, (after - before) / 1e9, fmt((1.0 * NUM_ASYNC_REQS) / ((after - before) / 1e9))); fflush(stdout); } } /* This benchmark aims to measure the overhead of doing I/O syscalls from * the thread pool. The stat() syscall was chosen because its results are * easy for the operating system to cache, taking the actual I/O overhead * out of the equation. */ BENCHMARK_IMPL(fs_stat) { const char path[] = "."; warmup(path); sync_bench(path); async_bench(path); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-getaddrinfo.c0000644000175000017500000000473612456307253022323 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #define CONCURRENT_CALLS 10 #define TOTAL_CALLS 10000 static const char* name = "localhost"; static uv_loop_t* loop; static uv_getaddrinfo_t handles[CONCURRENT_CALLS]; static int calls_initiated = 0; static int calls_completed = 0; static int64_t start_time; static int64_t end_time; static void getaddrinfo_initiate(uv_getaddrinfo_t* handle); static void getaddrinfo_cb(uv_getaddrinfo_t* handle, int status, struct addrinfo* res) { ASSERT(status == 0); calls_completed++; if (calls_initiated < TOTAL_CALLS) { getaddrinfo_initiate(handle); } uv_freeaddrinfo(res); } static void getaddrinfo_initiate(uv_getaddrinfo_t* handle) { int r; calls_initiated++; r = uv_getaddrinfo(loop, handle, &getaddrinfo_cb, name, NULL, NULL); ASSERT(r == 0); } BENCHMARK_IMPL(getaddrinfo) { int i; loop = uv_default_loop(); uv_update_time(loop); start_time = uv_now(loop); for (i = 0; i < CONCURRENT_CALLS; i++) { getaddrinfo_initiate(&handles[i]); } uv_run(loop, UV_RUN_DEFAULT); uv_update_time(loop); end_time = uv_now(loop); ASSERT(calls_initiated == TOTAL_CALLS); ASSERT(calls_completed == TOTAL_CALLS); LOGF("getaddrinfo: %.0f req/s\n", (double) calls_completed / (double) (end_time - start_time) * 1000.0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-list.h0000644000175000017500000001322512456307253021006 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ BENCHMARK_DECLARE (sizes) BENCHMARK_DECLARE (loop_count) BENCHMARK_DECLARE (loop_count_timed) BENCHMARK_DECLARE (ping_pongs) BENCHMARK_DECLARE (tcp_write_batch) BENCHMARK_DECLARE (tcp4_pound_100) BENCHMARK_DECLARE (tcp4_pound_1000) BENCHMARK_DECLARE (pipe_pound_100) BENCHMARK_DECLARE (pipe_pound_1000) BENCHMARK_DECLARE (tcp_pump100_client) BENCHMARK_DECLARE (tcp_pump1_client) BENCHMARK_DECLARE (pipe_pump100_client) BENCHMARK_DECLARE (pipe_pump1_client) BENCHMARK_DECLARE (tcp_multi_accept2) BENCHMARK_DECLARE (tcp_multi_accept4) BENCHMARK_DECLARE (tcp_multi_accept8) /* Run until X packets have been sent/received. */ BENCHMARK_DECLARE (udp_pummel_1v1) BENCHMARK_DECLARE (udp_pummel_1v10) BENCHMARK_DECLARE (udp_pummel_1v100) BENCHMARK_DECLARE (udp_pummel_1v1000) BENCHMARK_DECLARE (udp_pummel_10v10) BENCHMARK_DECLARE (udp_pummel_10v100) BENCHMARK_DECLARE (udp_pummel_10v1000) BENCHMARK_DECLARE (udp_pummel_100v100) BENCHMARK_DECLARE (udp_pummel_100v1000) BENCHMARK_DECLARE (udp_pummel_1000v1000) /* Run until X seconds have elapsed. */ BENCHMARK_DECLARE (udp_timed_pummel_1v1) BENCHMARK_DECLARE (udp_timed_pummel_1v10) BENCHMARK_DECLARE (udp_timed_pummel_1v100) BENCHMARK_DECLARE (udp_timed_pummel_1v1000) BENCHMARK_DECLARE (udp_timed_pummel_10v10) BENCHMARK_DECLARE (udp_timed_pummel_10v100) BENCHMARK_DECLARE (udp_timed_pummel_10v1000) BENCHMARK_DECLARE (udp_timed_pummel_100v100) BENCHMARK_DECLARE (udp_timed_pummel_100v1000) BENCHMARK_DECLARE (udp_timed_pummel_1000v1000) BENCHMARK_DECLARE (getaddrinfo) BENCHMARK_DECLARE (fs_stat) BENCHMARK_DECLARE (async1) BENCHMARK_DECLARE (async2) BENCHMARK_DECLARE (async4) BENCHMARK_DECLARE (async8) BENCHMARK_DECLARE (async_pummel_1) BENCHMARK_DECLARE (async_pummel_2) BENCHMARK_DECLARE (async_pummel_4) BENCHMARK_DECLARE (async_pummel_8) BENCHMARK_DECLARE (spawn) BENCHMARK_DECLARE (thread_create) BENCHMARK_DECLARE (million_async) BENCHMARK_DECLARE (million_timers) HELPER_DECLARE (tcp4_blackhole_server) HELPER_DECLARE (tcp_pump_server) HELPER_DECLARE (pipe_pump_server) HELPER_DECLARE (tcp4_echo_server) HELPER_DECLARE (pipe_echo_server) HELPER_DECLARE (dns_server) TASK_LIST_START BENCHMARK_ENTRY (sizes) BENCHMARK_ENTRY (loop_count) BENCHMARK_ENTRY (loop_count_timed) BENCHMARK_ENTRY (ping_pongs) BENCHMARK_HELPER (ping_pongs, tcp4_echo_server) BENCHMARK_ENTRY (tcp_write_batch) BENCHMARK_HELPER (tcp_write_batch, tcp4_blackhole_server) BENCHMARK_ENTRY (tcp_pump100_client) BENCHMARK_HELPER (tcp_pump100_client, tcp_pump_server) BENCHMARK_ENTRY (tcp_pump1_client) BENCHMARK_HELPER (tcp_pump1_client, tcp_pump_server) BENCHMARK_ENTRY (tcp4_pound_100) BENCHMARK_HELPER (tcp4_pound_100, tcp4_echo_server) BENCHMARK_ENTRY (tcp4_pound_1000) BENCHMARK_HELPER (tcp4_pound_1000, tcp4_echo_server) BENCHMARK_ENTRY (pipe_pump100_client) BENCHMARK_HELPER (pipe_pump100_client, pipe_pump_server) BENCHMARK_ENTRY (pipe_pump1_client) BENCHMARK_HELPER (pipe_pump1_client, pipe_pump_server) BENCHMARK_ENTRY (pipe_pound_100) BENCHMARK_HELPER (pipe_pound_100, pipe_echo_server) BENCHMARK_ENTRY (pipe_pound_1000) BENCHMARK_HELPER (pipe_pound_1000, pipe_echo_server) BENCHMARK_ENTRY (tcp_multi_accept2) BENCHMARK_ENTRY (tcp_multi_accept4) BENCHMARK_ENTRY (tcp_multi_accept8) BENCHMARK_ENTRY (udp_pummel_1v1) BENCHMARK_ENTRY (udp_pummel_1v10) BENCHMARK_ENTRY (udp_pummel_1v100) BENCHMARK_ENTRY (udp_pummel_1v1000) BENCHMARK_ENTRY (udp_pummel_10v10) BENCHMARK_ENTRY (udp_pummel_10v100) BENCHMARK_ENTRY (udp_pummel_10v1000) BENCHMARK_ENTRY (udp_pummel_100v100) BENCHMARK_ENTRY (udp_pummel_100v1000) BENCHMARK_ENTRY (udp_pummel_1000v1000) BENCHMARK_ENTRY (udp_timed_pummel_1v1) BENCHMARK_ENTRY (udp_timed_pummel_1v10) BENCHMARK_ENTRY (udp_timed_pummel_1v100) BENCHMARK_ENTRY (udp_timed_pummel_1v1000) BENCHMARK_ENTRY (udp_timed_pummel_10v10) BENCHMARK_ENTRY (udp_timed_pummel_10v100) BENCHMARK_ENTRY (udp_timed_pummel_10v1000) BENCHMARK_ENTRY (udp_timed_pummel_100v100) BENCHMARK_ENTRY (udp_timed_pummel_100v1000) BENCHMARK_ENTRY (udp_timed_pummel_1000v1000) BENCHMARK_ENTRY (getaddrinfo) BENCHMARK_ENTRY (fs_stat) BENCHMARK_ENTRY (async1) BENCHMARK_ENTRY (async2) BENCHMARK_ENTRY (async4) BENCHMARK_ENTRY (async8) BENCHMARK_ENTRY (async_pummel_1) BENCHMARK_ENTRY (async_pummel_2) BENCHMARK_ENTRY (async_pummel_4) BENCHMARK_ENTRY (async_pummel_8) BENCHMARK_ENTRY (spawn) BENCHMARK_ENTRY (thread_create) BENCHMARK_ENTRY (million_async) BENCHMARK_ENTRY (million_timers) TASK_LIST_END MoarVM-2015.11/3rdparty/libuv/test/benchmark-loop-count.c0000644000175000017500000000461212456307253022125 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include #define NUM_TICKS (2 * 1000 * 1000) static unsigned long ticks; static uv_idle_t idle_handle; static uv_timer_t timer_handle; static void idle_cb(uv_idle_t* handle) { if (++ticks == NUM_TICKS) uv_idle_stop(handle); } static void idle2_cb(uv_idle_t* handle) { ticks++; } static void timer_cb(uv_timer_t* handle) { uv_idle_stop(&idle_handle); uv_timer_stop(&timer_handle); } BENCHMARK_IMPL(loop_count) { uv_loop_t* loop = uv_default_loop(); uint64_t ns; uv_idle_init(loop, &idle_handle); uv_idle_start(&idle_handle, idle_cb); ns = uv_hrtime(); uv_run(loop, UV_RUN_DEFAULT); ns = uv_hrtime() - ns; ASSERT(ticks == NUM_TICKS); LOGF("loop_count: %d ticks in %.2fs (%.0f/s)\n", NUM_TICKS, ns / 1e9, NUM_TICKS / (ns / 1e9)); MAKE_VALGRIND_HAPPY(); return 0; } BENCHMARK_IMPL(loop_count_timed) { uv_loop_t* loop = uv_default_loop(); uv_idle_init(loop, &idle_handle); uv_idle_start(&idle_handle, idle2_cb); uv_timer_init(loop, &timer_handle); uv_timer_start(&timer_handle, timer_cb, 5000, 0); uv_run(loop, UV_RUN_DEFAULT); LOGF("loop_count: %lu ticks (%.0f ticks/s)\n", ticks, ticks / 5.0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-million-async.c0000644000175000017500000000623112456307253022603 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" struct async_container { unsigned async_events; unsigned handles_seen; uv_async_t async_handles[1024 * 1024]; }; static volatile int done; static uv_thread_t thread_id; static struct async_container* container; static unsigned fastrand(void) { static unsigned g = 0; g = g * 214013 + 2531011; return g; } static void thread_cb(void* arg) { unsigned i; while (done == 0) { i = fastrand() % ARRAY_SIZE(container->async_handles); uv_async_send(container->async_handles + i); } } static void async_cb(uv_async_t* handle) { container->async_events++; handle->data = handle; } static void timer_cb(uv_timer_t* handle) { unsigned i; done = 1; ASSERT(0 == uv_thread_join(&thread_id)); for (i = 0; i < ARRAY_SIZE(container->async_handles); i++) { uv_async_t* handle = container->async_handles + i; if (handle->data != NULL) container->handles_seen++; uv_close((uv_handle_t*) handle, NULL); } uv_close((uv_handle_t*) handle, NULL); } BENCHMARK_IMPL(million_async) { uv_timer_t timer_handle; uv_async_t* handle; uv_loop_t* loop; int timeout; unsigned i; loop = uv_default_loop(); timeout = 5000; container = malloc(sizeof(*container)); ASSERT(container != NULL); container->async_events = 0; container->handles_seen = 0; for (i = 0; i < ARRAY_SIZE(container->async_handles); i++) { handle = container->async_handles + i; ASSERT(0 == uv_async_init(loop, handle, async_cb)); handle->data = NULL; } ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, timeout, 0)); ASSERT(0 == uv_thread_create(&thread_id, thread_cb, NULL)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); printf("%s async events in %.1f seconds (%s/s, %s unique handles seen)\n", fmt(container->async_events), timeout / 1000., fmt(container->async_events / (timeout / 1000.)), fmt(container->handles_seen)); free(container); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-million-timers.c0000644000175000017500000000507312456307253022774 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #define NUM_TIMERS (10 * 1000 * 1000) static int timer_cb_called; static int close_cb_called; static void timer_cb(uv_timer_t* handle) { timer_cb_called++; } static void close_cb(uv_handle_t* handle) { close_cb_called++; } BENCHMARK_IMPL(million_timers) { uv_timer_t* timers; uv_loop_t* loop; uint64_t before_all; uint64_t before_run; uint64_t after_run; uint64_t after_all; int timeout; int i; timers = malloc(NUM_TIMERS * sizeof(timers[0])); ASSERT(timers != NULL); loop = uv_default_loop(); timeout = 0; before_all = uv_hrtime(); for (i = 0; i < NUM_TIMERS; i++) { if (i % 1000 == 0) timeout++; ASSERT(0 == uv_timer_init(loop, timers + i)); ASSERT(0 == uv_timer_start(timers + i, timer_cb, timeout, 0)); } before_run = uv_hrtime(); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); after_run = uv_hrtime(); for (i = 0; i < NUM_TIMERS; i++) uv_close((uv_handle_t*) (timers + i), close_cb); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); after_all = uv_hrtime(); ASSERT(timer_cb_called == NUM_TIMERS); ASSERT(close_cb_called == NUM_TIMERS); free(timers); LOGF("%.2f seconds total\n", (after_all - before_all) / 1e9); LOGF("%.2f seconds init\n", (before_run - before_all) / 1e9); LOGF("%.2f seconds dispatch\n", (after_run - before_run) / 1e9); LOGF("%.2f seconds cleanup\n", (after_all - after_run) / 1e9); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-multi-accept.c0000644000175000017500000003240712456307253022420 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #define IPC_PIPE_NAME TEST_PIPENAME #define NUM_CONNECTS (250 * 1000) union stream_handle { uv_pipe_t pipe; uv_tcp_t tcp; }; /* Use as (uv_stream_t *) &handle_storage -- it's kind of clunky but it * avoids aliasing warnings. */ typedef unsigned char handle_storage_t[sizeof(union stream_handle)]; /* Used for passing around the listen handle, not part of the benchmark proper. * We have an overabundance of server types here. It works like this: * * 1. The main thread starts an IPC pipe server. * 2. The worker threads connect to the IPC server and obtain a listen handle. * 3. The worker threads start accepting requests on the listen handle. * 4. The main thread starts connecting repeatedly. * * Step #4 should perhaps be farmed out over several threads. */ struct ipc_server_ctx { handle_storage_t server_handle; unsigned int num_connects; uv_pipe_t ipc_pipe; }; struct ipc_peer_ctx { handle_storage_t peer_handle; uv_write_t write_req; }; struct ipc_client_ctx { uv_connect_t connect_req; uv_stream_t* server_handle; uv_pipe_t ipc_pipe; char scratch[16]; }; /* Used in the actual benchmark. */ struct server_ctx { handle_storage_t server_handle; unsigned int num_connects; uv_async_t async_handle; uv_thread_t thread_id; uv_sem_t semaphore; }; struct client_ctx { handle_storage_t client_handle; unsigned int num_connects; uv_connect_t connect_req; uv_idle_t idle_handle; }; static void ipc_connection_cb(uv_stream_t* ipc_pipe, int status); static void ipc_write_cb(uv_write_t* req, int status); static void ipc_close_cb(uv_handle_t* handle); static void ipc_connect_cb(uv_connect_t* req, int status); static void ipc_read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf); static void ipc_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); static void sv_async_cb(uv_async_t* handle); static void sv_connection_cb(uv_stream_t* server_handle, int status); static void sv_read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf); static void sv_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); static void cl_connect_cb(uv_connect_t* req, int status); static void cl_idle_cb(uv_idle_t* handle); static void cl_close_cb(uv_handle_t* handle); static struct sockaddr_in listen_addr; static void ipc_connection_cb(uv_stream_t* ipc_pipe, int status) { struct ipc_server_ctx* sc; struct ipc_peer_ctx* pc; uv_loop_t* loop; uv_buf_t buf; loop = ipc_pipe->loop; buf = uv_buf_init("PING", 4); sc = container_of(ipc_pipe, struct ipc_server_ctx, ipc_pipe); pc = calloc(1, sizeof(*pc)); ASSERT(pc != NULL); if (ipc_pipe->type == UV_TCP) ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) &pc->peer_handle)); else if (ipc_pipe->type == UV_NAMED_PIPE) ASSERT(0 == uv_pipe_init(loop, (uv_pipe_t*) &pc->peer_handle, 1)); else ASSERT(0); ASSERT(0 == uv_accept(ipc_pipe, (uv_stream_t*) &pc->peer_handle)); ASSERT(0 == uv_write2(&pc->write_req, (uv_stream_t*) &pc->peer_handle, &buf, 1, (uv_stream_t*) &sc->server_handle, ipc_write_cb)); if (--sc->num_connects == 0) uv_close((uv_handle_t*) ipc_pipe, NULL); } static void ipc_write_cb(uv_write_t* req, int status) { struct ipc_peer_ctx* ctx; ctx = container_of(req, struct ipc_peer_ctx, write_req); uv_close((uv_handle_t*) &ctx->peer_handle, ipc_close_cb); } static void ipc_close_cb(uv_handle_t* handle) { struct ipc_peer_ctx* ctx; ctx = container_of(handle, struct ipc_peer_ctx, peer_handle); free(ctx); } static void ipc_connect_cb(uv_connect_t* req, int status) { struct ipc_client_ctx* ctx; ctx = container_of(req, struct ipc_client_ctx, connect_req); ASSERT(0 == status); ASSERT(0 == uv_read_start((uv_stream_t*) &ctx->ipc_pipe, ipc_alloc_cb, ipc_read_cb)); } static void ipc_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { struct ipc_client_ctx* ctx; ctx = container_of(handle, struct ipc_client_ctx, ipc_pipe); buf->base = ctx->scratch; buf->len = sizeof(ctx->scratch); } static void ipc_read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { struct ipc_client_ctx* ctx; uv_loop_t* loop; uv_handle_type type; uv_pipe_t* ipc_pipe; ipc_pipe = (uv_pipe_t*) handle; ctx = container_of(ipc_pipe, struct ipc_client_ctx, ipc_pipe); loop = ipc_pipe->loop; ASSERT(1 == uv_pipe_pending_count(ipc_pipe)); type = uv_pipe_pending_type(ipc_pipe); if (type == UV_TCP) ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) ctx->server_handle)); else if (type == UV_NAMED_PIPE) ASSERT(0 == uv_pipe_init(loop, (uv_pipe_t*) ctx->server_handle, 0)); else ASSERT(0); ASSERT(0 == uv_accept(handle, ctx->server_handle)); uv_close((uv_handle_t*) &ctx->ipc_pipe, NULL); } /* Set up an IPC pipe server that hands out listen sockets to the worker * threads. It's kind of cumbersome for such a simple operation, maybe we * should revive uv_import() and uv_export(). */ static void send_listen_handles(uv_handle_type type, unsigned int num_servers, struct server_ctx* servers) { struct ipc_server_ctx ctx; uv_loop_t* loop; unsigned int i; loop = uv_default_loop(); ctx.num_connects = num_servers; if (type == UV_TCP) { ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) &ctx.server_handle)); ASSERT(0 == uv_tcp_bind((uv_tcp_t*) &ctx.server_handle, (const struct sockaddr*) &listen_addr, 0)); } else ASSERT(0); ASSERT(0 == uv_pipe_init(loop, &ctx.ipc_pipe, 1)); ASSERT(0 == uv_pipe_bind(&ctx.ipc_pipe, IPC_PIPE_NAME)); ASSERT(0 == uv_listen((uv_stream_t*) &ctx.ipc_pipe, 128, ipc_connection_cb)); for (i = 0; i < num_servers; i++) uv_sem_post(&servers[i].semaphore); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); uv_close((uv_handle_t*) &ctx.server_handle, NULL); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); for (i = 0; i < num_servers; i++) uv_sem_wait(&servers[i].semaphore); } static void get_listen_handle(uv_loop_t* loop, uv_stream_t* server_handle) { struct ipc_client_ctx ctx; ctx.server_handle = server_handle; ctx.server_handle->data = "server handle"; ASSERT(0 == uv_pipe_init(loop, &ctx.ipc_pipe, 1)); uv_pipe_connect(&ctx.connect_req, &ctx.ipc_pipe, IPC_PIPE_NAME, ipc_connect_cb); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); } static void server_cb(void *arg) { struct server_ctx *ctx; uv_loop_t loop; ctx = arg; ASSERT(0 == uv_loop_init(&loop)); ASSERT(0 == uv_async_init(&loop, &ctx->async_handle, sv_async_cb)); uv_unref((uv_handle_t*) &ctx->async_handle); /* Wait until the main thread is ready. */ uv_sem_wait(&ctx->semaphore); get_listen_handle(&loop, (uv_stream_t*) &ctx->server_handle); uv_sem_post(&ctx->semaphore); /* Now start the actual benchmark. */ ASSERT(0 == uv_listen((uv_stream_t*) &ctx->server_handle, 128, sv_connection_cb)); ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT)); uv_loop_close(&loop); } static void sv_async_cb(uv_async_t* handle) { struct server_ctx* ctx; ctx = container_of(handle, struct server_ctx, async_handle); uv_close((uv_handle_t*) &ctx->server_handle, NULL); uv_close((uv_handle_t*) &ctx->async_handle, NULL); } static void sv_connection_cb(uv_stream_t* server_handle, int status) { handle_storage_t* storage; struct server_ctx* ctx; ctx = container_of(server_handle, struct server_ctx, server_handle); ASSERT(status == 0); storage = malloc(sizeof(*storage)); ASSERT(storage != NULL); if (server_handle->type == UV_TCP) ASSERT(0 == uv_tcp_init(server_handle->loop, (uv_tcp_t*) storage)); else if (server_handle->type == UV_NAMED_PIPE) ASSERT(0 == uv_pipe_init(server_handle->loop, (uv_pipe_t*) storage, 0)); else ASSERT(0); ASSERT(0 == uv_accept(server_handle, (uv_stream_t*) storage)); ASSERT(0 == uv_read_start((uv_stream_t*) storage, sv_alloc_cb, sv_read_cb)); ctx->num_connects++; } static void sv_alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[32]; buf->base = slab; buf->len = sizeof(slab); } static void sv_read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { ASSERT(nread == UV_EOF); uv_close((uv_handle_t*) handle, (uv_close_cb) free); } static void cl_connect_cb(uv_connect_t* req, int status) { struct client_ctx* ctx = container_of(req, struct client_ctx, connect_req); uv_idle_start(&ctx->idle_handle, cl_idle_cb); ASSERT(0 == status); } static void cl_idle_cb(uv_idle_t* handle) { struct client_ctx* ctx = container_of(handle, struct client_ctx, idle_handle); uv_close((uv_handle_t*) &ctx->client_handle, cl_close_cb); uv_idle_stop(&ctx->idle_handle); } static void cl_close_cb(uv_handle_t* handle) { struct client_ctx* ctx; ctx = container_of(handle, struct client_ctx, client_handle); if (--ctx->num_connects == 0) { uv_close((uv_handle_t*) &ctx->idle_handle, NULL); return; } ASSERT(0 == uv_tcp_init(handle->loop, (uv_tcp_t*) &ctx->client_handle)); ASSERT(0 == uv_tcp_connect(&ctx->connect_req, (uv_tcp_t*) &ctx->client_handle, (const struct sockaddr*) &listen_addr, cl_connect_cb)); } static int test_tcp(unsigned int num_servers, unsigned int num_clients) { struct server_ctx* servers; struct client_ctx* clients; uv_loop_t* loop; uv_tcp_t* handle; unsigned int i; double time; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &listen_addr)); loop = uv_default_loop(); servers = calloc(num_servers, sizeof(servers[0])); clients = calloc(num_clients, sizeof(clients[0])); ASSERT(servers != NULL); ASSERT(clients != NULL); /* We're making the assumption here that from the perspective of the * OS scheduler, threads are functionally equivalent to and interchangeable * with full-blown processes. */ for (i = 0; i < num_servers; i++) { struct server_ctx* ctx = servers + i; ASSERT(0 == uv_sem_init(&ctx->semaphore, 0)); ASSERT(0 == uv_thread_create(&ctx->thread_id, server_cb, ctx)); } send_listen_handles(UV_TCP, num_servers, servers); for (i = 0; i < num_clients; i++) { struct client_ctx* ctx = clients + i; ctx->num_connects = NUM_CONNECTS / num_clients; handle = (uv_tcp_t*) &ctx->client_handle; handle->data = "client handle"; ASSERT(0 == uv_tcp_init(loop, handle)); ASSERT(0 == uv_tcp_connect(&ctx->connect_req, handle, (const struct sockaddr*) &listen_addr, cl_connect_cb)); ASSERT(0 == uv_idle_init(loop, &ctx->idle_handle)); } { uint64_t t = uv_hrtime(); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); t = uv_hrtime() - t; time = t / 1e9; } for (i = 0; i < num_servers; i++) { struct server_ctx* ctx = servers + i; uv_async_send(&ctx->async_handle); ASSERT(0 == uv_thread_join(&ctx->thread_id)); uv_sem_destroy(&ctx->semaphore); } printf("accept%u: %.0f accepts/sec (%u total)\n", num_servers, NUM_CONNECTS / time, NUM_CONNECTS); for (i = 0; i < num_servers; i++) { struct server_ctx* ctx = servers + i; printf(" thread #%u: %.0f accepts/sec (%u total, %.1f%%)\n", i, ctx->num_connects / time, ctx->num_connects, ctx->num_connects * 100.0 / NUM_CONNECTS); } free(clients); free(servers); MAKE_VALGRIND_HAPPY(); return 0; } BENCHMARK_IMPL(tcp_multi_accept2) { return test_tcp(2, 40); } BENCHMARK_IMPL(tcp_multi_accept4) { return test_tcp(4, 40); } BENCHMARK_IMPL(tcp_multi_accept8) { return test_tcp(8, 40); } MoarVM-2015.11/3rdparty/libuv/test/benchmark-ping-pongs.c0000644000175000017500000001215012456307253022103 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* Run the benchmark for this many ms */ #define TIME 5000 typedef struct { int pongs; int state; uv_tcp_t tcp; uv_connect_t connect_req; uv_shutdown_t shutdown_req; } pinger_t; typedef struct buf_s { uv_buf_t uv_buf_t; struct buf_s* next; } buf_t; static char PING[] = "PING\n"; static uv_loop_t* loop; static buf_t* buf_freelist = NULL; static int pinger_shutdown_cb_called; static int completed_pingers = 0; static int64_t start_time; static void buf_alloc(uv_handle_t* tcp, size_t size, uv_buf_t* buf) { buf_t* ab; ab = buf_freelist; if (ab != NULL) buf_freelist = ab->next; else { ab = malloc(size + sizeof(*ab)); ab->uv_buf_t.len = size; ab->uv_buf_t.base = (char*) (ab + 1); } *buf = ab->uv_buf_t; } static void buf_free(const uv_buf_t* buf) { buf_t* ab = (buf_t*) buf->base - 1; ab->next = buf_freelist; buf_freelist = ab; } static void pinger_close_cb(uv_handle_t* handle) { pinger_t* pinger; pinger = (pinger_t*)handle->data; LOGF("ping_pongs: %d roundtrips/s\n", (1000 * pinger->pongs) / TIME); free(pinger); completed_pingers++; } static void pinger_write_cb(uv_write_t* req, int status) { ASSERT(status == 0); free(req); } static void pinger_write_ping(pinger_t* pinger) { uv_write_t* req; uv_buf_t buf; buf = uv_buf_init(PING, sizeof(PING) - 1); req = malloc(sizeof *req); if (uv_write(req, (uv_stream_t*) &pinger->tcp, &buf, 1, pinger_write_cb)) { FATAL("uv_write failed"); } } static void pinger_shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(status == 0); pinger_shutdown_cb_called++; /* * The close callback has not been triggered yet. We must wait for EOF * until we close the connection. */ ASSERT(completed_pingers == 0); } static void pinger_read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ssize_t i; pinger_t* pinger; pinger = (pinger_t*)tcp->data; if (nread < 0) { ASSERT(nread == UV_EOF); if (buf->base) { buf_free(buf); } ASSERT(pinger_shutdown_cb_called == 1); uv_close((uv_handle_t*)tcp, pinger_close_cb); return; } /* Now we count the pings */ for (i = 0; i < nread; i++) { ASSERT(buf->base[i] == PING[pinger->state]); pinger->state = (pinger->state + 1) % (sizeof(PING) - 1); if (pinger->state == 0) { pinger->pongs++; if (uv_now(loop) - start_time > TIME) { uv_shutdown(&pinger->shutdown_req, (uv_stream_t*) tcp, pinger_shutdown_cb); break; } else { pinger_write_ping(pinger); } } } buf_free(buf); } static void pinger_connect_cb(uv_connect_t* req, int status) { pinger_t *pinger = (pinger_t*)req->handle->data; ASSERT(status == 0); pinger_write_ping(pinger); if (uv_read_start(req->handle, buf_alloc, pinger_read_cb)) { FATAL("uv_read_start failed"); } } static void pinger_new(void) { struct sockaddr_in client_addr; struct sockaddr_in server_addr; pinger_t *pinger; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &client_addr)); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); pinger = malloc(sizeof(*pinger)); pinger->state = 0; pinger->pongs = 0; /* Try to connect to the server and do NUM_PINGS ping-pongs. */ r = uv_tcp_init(loop, &pinger->tcp); ASSERT(!r); pinger->tcp.data = pinger; ASSERT(0 == uv_tcp_bind(&pinger->tcp, (const struct sockaddr*) &client_addr, 0)); r = uv_tcp_connect(&pinger->connect_req, &pinger->tcp, (const struct sockaddr*) &server_addr, pinger_connect_cb); ASSERT(!r); } BENCHMARK_IMPL(ping_pongs) { loop = uv_default_loop(); start_time = uv_now(loop); pinger_new(); uv_run(loop, UV_RUN_DEFAULT); ASSERT(completed_pingers == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-pound.c0000644000175000017500000001740512456307253021157 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" /* Update this is you're going to run > 1000 concurrent requests. */ #define MAX_CONNS 1000 #undef NANOSEC #define NANOSEC ((uint64_t) 1e9) #undef DEBUG #define DEBUG 0 struct conn_rec_s; typedef void (*setup_fn)(int num, void* arg); typedef void (*make_connect_fn)(struct conn_rec_s* conn); typedef int (*connect_fn)(int num, make_connect_fn make_connect, void* arg); /* Base class for tcp_conn_rec and pipe_conn_rec. * The ordering of fields matters! */ typedef struct conn_rec_s { int i; uv_connect_t conn_req; uv_write_t write_req; make_connect_fn make_connect; uv_stream_t stream; } conn_rec; typedef struct { int i; uv_connect_t conn_req; uv_write_t write_req; make_connect_fn make_connect; uv_tcp_t stream; } tcp_conn_rec; typedef struct { int i; uv_connect_t conn_req; uv_write_t write_req; make_connect_fn make_connect; uv_pipe_t stream; } pipe_conn_rec; static char buffer[] = "QS"; static uv_loop_t* loop; static tcp_conn_rec tcp_conns[MAX_CONNS]; static pipe_conn_rec pipe_conns[MAX_CONNS]; static uint64_t start; /* in ms */ static int closed_streams; static int conns_failed; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); static void connect_cb(uv_connect_t* conn_req, int status); static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); static void close_cb(uv_handle_t* handle); static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; buf->base = slab; buf->len = sizeof(slab); } static void after_write(uv_write_t* req, int status) { if (status != 0) { fprintf(stderr, "write error %s\n", uv_err_name(status)); uv_close((uv_handle_t*)req->handle, close_cb); conns_failed++; return; } } static void connect_cb(uv_connect_t* req, int status) { conn_rec* conn; uv_buf_t buf; int r; if (status != 0) { #if DEBUG fprintf(stderr, "connect error %s\n", uv_err_name(status)); #endif uv_close((uv_handle_t*)req->handle, close_cb); conns_failed++; return; } ASSERT(req != NULL); ASSERT(status == 0); conn = (conn_rec*)req->data; ASSERT(conn != NULL); #if DEBUG printf("connect_cb %d\n", conn->i); #endif r = uv_read_start(&conn->stream, alloc_cb, read_cb); ASSERT(r == 0); buf.base = buffer; buf.len = sizeof(buffer) - 1; r = uv_write(&conn->write_req, &conn->stream, &buf, 1, after_write); ASSERT(r == 0); } static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ASSERT(stream != NULL); #if DEBUG printf("read_cb %d\n", p->i); #endif uv_close((uv_handle_t*)stream, close_cb); if (nread < 0) { if (nread == UV_EOF) { ; } else if (nread == UV_ECONNRESET) { conns_failed++; } else { fprintf(stderr, "read error %s\n", uv_err_name(nread)); ASSERT(0); } } } static void close_cb(uv_handle_t* handle) { conn_rec* p = (conn_rec*)handle->data; ASSERT(handle != NULL); closed_streams++; #if DEBUG printf("close_cb %d\n", p->i); #endif if (uv_now(loop) - start < 10000) { p->make_connect(p); } } static void tcp_do_setup(int num, void* arg) { int i; for (i = 0; i < num; i++) { tcp_conns[i].i = i; } } static void pipe_do_setup(int num, void* arg) { int i; for (i = 0; i < num; i++) { pipe_conns[i].i = i; } } static void tcp_make_connect(conn_rec* p) { struct sockaddr_in addr; tcp_conn_rec* tp; int r; tp = (tcp_conn_rec*) p; r = uv_tcp_init(loop, (uv_tcp_t*)&p->stream); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_connect(&tp->conn_req, (uv_tcp_t*) &p->stream, (const struct sockaddr*) &addr, connect_cb); if (r) { fprintf(stderr, "uv_tcp_connect error %s\n", uv_err_name(r)); ASSERT(0); } #if DEBUG printf("make connect %d\n", p->i); #endif p->conn_req.data = p; p->write_req.data = p; p->stream.data = p; } static void pipe_make_connect(conn_rec* p) { int r; r = uv_pipe_init(loop, (uv_pipe_t*)&p->stream, 0); ASSERT(r == 0); uv_pipe_connect(&((pipe_conn_rec*) p)->conn_req, (uv_pipe_t*) &p->stream, TEST_PIPENAME, connect_cb); #if DEBUG printf("make connect %d\n", p->i); #endif p->conn_req.data = p; p->write_req.data = p; p->stream.data = p; } static int tcp_do_connect(int num, make_connect_fn make_connect, void* arg) { int i; for (i = 0; i < num; i++) { tcp_make_connect((conn_rec*)&tcp_conns[i]); tcp_conns[i].make_connect = make_connect; } return 0; } static int pipe_do_connect(int num, make_connect_fn make_connect, void* arg) { int i; for (i = 0; i < num; i++) { pipe_make_connect((conn_rec*)&pipe_conns[i]); pipe_conns[i].make_connect = make_connect; } return 0; } static int pound_it(int concurrency, const char* type, setup_fn do_setup, connect_fn do_connect, make_connect_fn make_connect, void* arg) { double secs; int r; uint64_t start_time; /* in ns */ uint64_t end_time; loop = uv_default_loop(); uv_update_time(loop); start = uv_now(loop); /* Run benchmark for at least five seconds. */ start_time = uv_hrtime(); do_setup(concurrency, arg); r = do_connect(concurrency, make_connect, arg); ASSERT(!r); uv_run(loop, UV_RUN_DEFAULT); end_time = uv_hrtime(); /* Number of fractional seconds it took to run the benchmark. */ secs = (double)(end_time - start_time) / NANOSEC; LOGF("%s-conn-pound-%d: %.0f accepts/s (%d failed)\n", type, concurrency, closed_streams / secs, conns_failed); MAKE_VALGRIND_HAPPY(); return 0; } BENCHMARK_IMPL(tcp4_pound_100) { return pound_it(100, "tcp", tcp_do_setup, tcp_do_connect, tcp_make_connect, NULL); } BENCHMARK_IMPL(tcp4_pound_1000) { return pound_it(1000, "tcp", tcp_do_setup, tcp_do_connect, tcp_make_connect, NULL); } BENCHMARK_IMPL(pipe_pound_100) { return pound_it(100, "pipe", pipe_do_setup, pipe_do_connect, pipe_make_connect, NULL); } BENCHMARK_IMPL(pipe_pound_1000) { return pound_it(1000, "pipe", pipe_do_setup, pipe_do_connect, pipe_make_connect, NULL); } MoarVM-2015.11/3rdparty/libuv/test/benchmark-pump.c0000644000175000017500000002350412456307253021010 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include static int TARGET_CONNECTIONS; #define WRITE_BUFFER_SIZE 8192 #define MAX_SIMULTANEOUS_CONNECTS 100 #define PRINT_STATS 0 #define STATS_INTERVAL 1000 /* msec */ #define STATS_COUNT 5 static void do_write(uv_stream_t*); static void maybe_connect_some(); static uv_req_t* req_alloc(); static void req_free(uv_req_t* uv_req); static void buf_alloc(uv_handle_t* handle, size_t size, uv_buf_t* buf); static void buf_free(const uv_buf_t* buf); static uv_loop_t* loop; static uv_tcp_t tcpServer; static uv_pipe_t pipeServer; static uv_stream_t* server; static struct sockaddr_in listen_addr; static struct sockaddr_in connect_addr; static int64_t start_time; static int max_connect_socket = 0; static int max_read_sockets = 0; static int read_sockets = 0; static int write_sockets = 0; static int64_t nrecv = 0; static int64_t nrecv_total = 0; static int64_t nsent = 0; static int64_t nsent_total = 0; static int stats_left = 0; static char write_buffer[WRITE_BUFFER_SIZE]; /* Make this as large as you need. */ #define MAX_WRITE_HANDLES 1000 static stream_type type; static uv_tcp_t tcp_write_handles[MAX_WRITE_HANDLES]; static uv_pipe_t pipe_write_handles[MAX_WRITE_HANDLES]; static uv_timer_t timer_handle; static double gbit(int64_t bytes, int64_t passed_ms) { double gbits = ((double)bytes / (1024 * 1024 * 1024)) * 8; return gbits / ((double)passed_ms / 1000); } static void show_stats(uv_timer_t* handle) { int64_t diff; int i; #if PRINT_STATS LOGF("connections: %d, write: %.1f gbit/s\n", write_sockets, gbit(nsent, STATS_INTERVAL)); #endif /* Exit if the show is over */ if (!--stats_left) { uv_update_time(loop); diff = uv_now(loop) - start_time; LOGF("%s_pump%d_client: %.1f gbit/s\n", type == TCP ? "tcp" : "pipe", write_sockets, gbit(nsent_total, diff)); for (i = 0; i < write_sockets; i++) { if (type == TCP) uv_close((uv_handle_t*) &tcp_write_handles[i], NULL); else uv_close((uv_handle_t*) &pipe_write_handles[i], NULL); } exit(0); } /* Reset read and write counters */ nrecv = 0; nsent = 0; } static void read_show_stats(void) { int64_t diff; uv_update_time(loop); diff = uv_now(loop) - start_time; LOGF("%s_pump%d_server: %.1f gbit/s\n", type == TCP ? "tcp" : "pipe", max_read_sockets, gbit(nrecv_total, diff)); } static void read_sockets_close_cb(uv_handle_t* handle) { free(handle); read_sockets--; /* If it's past the first second and everyone has closed their connection * Then print stats. */ if (uv_now(loop) - start_time > 1000 && read_sockets == 0) { read_show_stats(); uv_close((uv_handle_t*)server, NULL); } } static void start_stats_collection(void) { int r; /* Show-stats timer */ stats_left = STATS_COUNT; r = uv_timer_init(loop, &timer_handle); ASSERT(r == 0); r = uv_timer_start(&timer_handle, show_stats, STATS_INTERVAL, STATS_INTERVAL); ASSERT(r == 0); uv_update_time(loop); start_time = uv_now(loop); } static void read_cb(uv_stream_t* stream, ssize_t bytes, const uv_buf_t* buf) { if (nrecv_total == 0) { ASSERT(start_time == 0); uv_update_time(loop); start_time = uv_now(loop); } if (bytes < 0) { uv_close((uv_handle_t*)stream, read_sockets_close_cb); return; } buf_free(buf); nrecv += bytes; nrecv_total += bytes; } static void write_cb(uv_write_t* req, int status) { ASSERT(status == 0); req_free((uv_req_t*) req); nsent += sizeof write_buffer; nsent_total += sizeof write_buffer; do_write((uv_stream_t*) req->handle); } static void do_write(uv_stream_t* stream) { uv_write_t* req; uv_buf_t buf; int r; buf.base = (char*) &write_buffer; buf.len = sizeof write_buffer; req = (uv_write_t*) req_alloc(); r = uv_write(req, stream, &buf, 1, write_cb); ASSERT(r == 0); } static void connect_cb(uv_connect_t* req, int status) { int i; if (status) LOG(uv_strerror(status)); ASSERT(status == 0); write_sockets++; req_free((uv_req_t*) req); maybe_connect_some(); if (write_sockets == TARGET_CONNECTIONS) { start_stats_collection(); /* Yay! start writing */ for (i = 0; i < write_sockets; i++) { if (type == TCP) do_write((uv_stream_t*) &tcp_write_handles[i]); else do_write((uv_stream_t*) &pipe_write_handles[i]); } } } static void maybe_connect_some(void) { uv_connect_t* req; uv_tcp_t* tcp; uv_pipe_t* pipe; int r; while (max_connect_socket < TARGET_CONNECTIONS && max_connect_socket < write_sockets + MAX_SIMULTANEOUS_CONNECTS) { if (type == TCP) { tcp = &tcp_write_handles[max_connect_socket++]; r = uv_tcp_init(loop, tcp); ASSERT(r == 0); req = (uv_connect_t*) req_alloc(); r = uv_tcp_connect(req, tcp, (const struct sockaddr*) &connect_addr, connect_cb); ASSERT(r == 0); } else { pipe = &pipe_write_handles[max_connect_socket++]; r = uv_pipe_init(loop, pipe, 0); ASSERT(r == 0); req = (uv_connect_t*) req_alloc(); uv_pipe_connect(req, pipe, TEST_PIPENAME, connect_cb); } } } static void connection_cb(uv_stream_t* s, int status) { uv_stream_t* stream; int r; ASSERT(server == s); ASSERT(status == 0); if (type == TCP) { stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t)); r = uv_tcp_init(loop, (uv_tcp_t*)stream); ASSERT(r == 0); } else { stream = (uv_stream_t*)malloc(sizeof(uv_pipe_t)); r = uv_pipe_init(loop, (uv_pipe_t*)stream, 0); ASSERT(r == 0); } r = uv_accept(s, stream); ASSERT(r == 0); r = uv_read_start(stream, buf_alloc, read_cb); ASSERT(r == 0); read_sockets++; max_read_sockets++; } /* * Request allocator */ typedef struct req_list_s { union uv_any_req uv_req; struct req_list_s* next; } req_list_t; static req_list_t* req_freelist = NULL; static uv_req_t* req_alloc(void) { req_list_t* req; req = req_freelist; if (req != NULL) { req_freelist = req->next; return (uv_req_t*) req; } req = (req_list_t*) malloc(sizeof *req); return (uv_req_t*) req; } static void req_free(uv_req_t* uv_req) { req_list_t* req = (req_list_t*) uv_req; req->next = req_freelist; req_freelist = req; } /* * Buffer allocator */ typedef struct buf_list_s { uv_buf_t uv_buf_t; struct buf_list_s* next; } buf_list_t; static buf_list_t* buf_freelist = NULL; static void buf_alloc(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf_list_t* ab; ab = buf_freelist; if (ab != NULL) buf_freelist = ab->next; else { ab = malloc(size + sizeof(*ab)); ab->uv_buf_t.len = size; ab->uv_buf_t.base = (char*) (ab + 1); } *buf = ab->uv_buf_t; } static void buf_free(const uv_buf_t* buf) { buf_list_t* ab = (buf_list_t*) buf->base - 1; ab->next = buf_freelist; buf_freelist = ab; } HELPER_IMPL(tcp_pump_server) { int r; type = TCP; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &listen_addr)); /* Server */ server = (uv_stream_t*)&tcpServer; r = uv_tcp_init(loop, &tcpServer); ASSERT(r == 0); r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &listen_addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcpServer, MAX_WRITE_HANDLES, connection_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); return 0; } HELPER_IMPL(pipe_pump_server) { int r; type = PIPE; loop = uv_default_loop(); /* Server */ server = (uv_stream_t*)&pipeServer; r = uv_pipe_init(loop, &pipeServer, 0); ASSERT(r == 0); r = uv_pipe_bind(&pipeServer, TEST_PIPENAME); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&pipeServer, MAX_WRITE_HANDLES, connection_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } static void tcp_pump(int n) { ASSERT(n <= MAX_WRITE_HANDLES); TARGET_CONNECTIONS = n; type = TCP; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &connect_addr)); /* Start making connections */ maybe_connect_some(); uv_run(loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); } static void pipe_pump(int n) { ASSERT(n <= MAX_WRITE_HANDLES); TARGET_CONNECTIONS = n; type = PIPE; loop = uv_default_loop(); /* Start making connections */ maybe_connect_some(); uv_run(loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); } BENCHMARK_IMPL(tcp_pump100_client) { tcp_pump(100); return 0; } BENCHMARK_IMPL(tcp_pump1_client) { tcp_pump(1); return 0; } BENCHMARK_IMPL(pipe_pump100_client) { pipe_pump(100); return 0; } BENCHMARK_IMPL(pipe_pump1_client) { pipe_pump(1); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-sizes.c0000644000175000017500000000456512456307253021172 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" BENCHMARK_IMPL(sizes) { LOGF("uv_shutdown_t: %u bytes\n", (unsigned int) sizeof(uv_shutdown_t)); LOGF("uv_write_t: %u bytes\n", (unsigned int) sizeof(uv_write_t)); LOGF("uv_connect_t: %u bytes\n", (unsigned int) sizeof(uv_connect_t)); LOGF("uv_udp_send_t: %u bytes\n", (unsigned int) sizeof(uv_udp_send_t)); LOGF("uv_tcp_t: %u bytes\n", (unsigned int) sizeof(uv_tcp_t)); LOGF("uv_pipe_t: %u bytes\n", (unsigned int) sizeof(uv_pipe_t)); LOGF("uv_tty_t: %u bytes\n", (unsigned int) sizeof(uv_tty_t)); LOGF("uv_prepare_t: %u bytes\n", (unsigned int) sizeof(uv_prepare_t)); LOGF("uv_check_t: %u bytes\n", (unsigned int) sizeof(uv_check_t)); LOGF("uv_idle_t: %u bytes\n", (unsigned int) sizeof(uv_idle_t)); LOGF("uv_async_t: %u bytes\n", (unsigned int) sizeof(uv_async_t)); LOGF("uv_timer_t: %u bytes\n", (unsigned int) sizeof(uv_timer_t)); LOGF("uv_fs_poll_t: %u bytes\n", (unsigned int) sizeof(uv_fs_poll_t)); LOGF("uv_fs_event_t: %u bytes\n", (unsigned int) sizeof(uv_fs_event_t)); LOGF("uv_process_t: %u bytes\n", (unsigned int) sizeof(uv_process_t)); LOGF("uv_poll_t: %u bytes\n", (unsigned int) sizeof(uv_poll_t)); LOGF("uv_loop_t: %u bytes\n", (unsigned int) sizeof(uv_loop_t)); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-spawn.c0000644000175000017500000000753212456307253021162 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* This benchmark spawns itself 1000 times. */ #include "task.h" #include "uv.h" static uv_loop_t* loop; static int N = 1000; static int done; static uv_process_t process; static uv_process_options_t options; static char exepath[1024]; static size_t exepath_size = 1024; static char* args[3]; static uv_pipe_t out; #define OUTPUT_SIZE 1024 static char output[OUTPUT_SIZE]; static int output_used; static int process_open; static int pipe_open; static void spawn(void); static void maybe_spawn(void) { if (process_open == 0 && pipe_open == 0) { done++; if (done < N) { spawn(); } } } static void process_close_cb(uv_handle_t* handle) { ASSERT(process_open == 1); process_open = 0; maybe_spawn(); } static void exit_cb(uv_process_t* process, int64_t exit_status, int term_signal) { ASSERT(exit_status == 42); ASSERT(term_signal == 0); uv_close((uv_handle_t*)process, process_close_cb); } static void on_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = output + output_used; buf->len = OUTPUT_SIZE - output_used; } static void pipe_close_cb(uv_handle_t* pipe) { ASSERT(pipe_open == 1); pipe_open = 0; maybe_spawn(); } static void on_read(uv_stream_t* pipe, ssize_t nread, const uv_buf_t* buf) { if (nread > 0) { ASSERT(pipe_open == 1); output_used += nread; } else if (nread < 0) { if (nread == UV_EOF) { uv_close((uv_handle_t*)pipe, pipe_close_cb); } } } static void spawn(void) { uv_stdio_container_t stdio[2]; int r; ASSERT(process_open == 0); ASSERT(pipe_open == 0); args[0] = exepath; args[1] = "spawn_helper"; args[2] = NULL; options.file = exepath; options.args = args; options.exit_cb = exit_cb; uv_pipe_init(loop, &out, 0); options.stdio = stdio; options.stdio_count = 2; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; r = uv_spawn(loop, &process, &options); ASSERT(r == 0); process_open = 1; pipe_open = 1; output_used = 0; r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); } BENCHMARK_IMPL(spawn) { int r; static int64_t start_time, end_time; loop = uv_default_loop(); r = uv_exepath(exepath, &exepath_size); ASSERT(r == 0); exepath[exepath_size] = '\0'; uv_update_time(loop); start_time = uv_now(loop); spawn(); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); uv_update_time(loop); end_time = uv_now(loop); LOGF("spawn: %.0f spawns/s\n", (double) N / (double) (end_time - start_time) * 1000.0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-tcp-write-batch.c0000644000175000017500000000745412456307253023032 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #define WRITE_REQ_DATA "Hello, world." #define NUM_WRITE_REQS (1000 * 1000) typedef struct { uv_write_t req; uv_buf_t buf; } write_req; static write_req* write_reqs; static uv_tcp_t tcp_client; static uv_connect_t connect_req; static uv_shutdown_t shutdown_req; static int shutdown_cb_called = 0; static int connect_cb_called = 0; static int write_cb_called = 0; static int close_cb_called = 0; static void connect_cb(uv_connect_t* req, int status); static void write_cb(uv_write_t* req, int status); static void shutdown_cb(uv_shutdown_t* req, int status); static void close_cb(uv_handle_t* handle); static void connect_cb(uv_connect_t* req, int status) { write_req* w; int i; int r; ASSERT(req->handle == (uv_stream_t*)&tcp_client); for (i = 0; i < NUM_WRITE_REQS; i++) { w = &write_reqs[i]; r = uv_write(&w->req, req->handle, &w->buf, 1, write_cb); ASSERT(r == 0); } r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb); ASSERT(r == 0); connect_cb_called++; } static void write_cb(uv_write_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); write_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(req->handle == (uv_stream_t*)&tcp_client); ASSERT(req->handle->write_queue_size == 0); uv_close((uv_handle_t*)req->handle, close_cb); free(write_reqs); shutdown_cb_called++; } static void close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*)&tcp_client); close_cb_called++; } BENCHMARK_IMPL(tcp_write_batch) { struct sockaddr_in addr; uv_loop_t* loop; uint64_t start; uint64_t stop; int i; int r; write_reqs = malloc(sizeof(*write_reqs) * NUM_WRITE_REQS); ASSERT(write_reqs != NULL); /* Prepare the data to write out. */ for (i = 0; i < NUM_WRITE_REQS; i++) { write_reqs[i].buf = uv_buf_init(WRITE_REQ_DATA, sizeof(WRITE_REQ_DATA) - 1); } loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(loop, &tcp_client); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &tcp_client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); start = uv_hrtime(); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); stop = uv_hrtime(); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == NUM_WRITE_REQS); ASSERT(shutdown_cb_called == 1); ASSERT(close_cb_called == 1); printf("%ld write requests in %.2fs.\n", (long)NUM_WRITE_REQS, (stop - start) / 1e9); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-thread.c0000644000175000017500000000362312456307253021276 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #define NUM_THREADS (20 * 1000) static volatile int num_threads; static void thread_entry(void* arg) { ASSERT(arg == (void *) 42); num_threads++; /* FIXME write barrier? */ } BENCHMARK_IMPL(thread_create) { uint64_t start_time; double duration; uv_thread_t tid; int i, r; start_time = uv_hrtime(); for (i = 0; i < NUM_THREADS; i++) { r = uv_thread_create(&tid, thread_entry, (void *) 42); ASSERT(r == 0); r = uv_thread_join(&tid); ASSERT(r == 0); } duration = (uv_hrtime() - start_time) / 1e9; ASSERT(num_threads == NUM_THREADS); printf("%d threads created in %.2f seconds (%.0f/s)\n", NUM_THREADS, duration, NUM_THREADS / duration); return 0; } MoarVM-2015.11/3rdparty/libuv/test/benchmark-udp-pummel.c0000644000175000017500000001512112456307253022110 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" #include "uv.h" #include #include #include #define EXPECTED "RANG TANG DING DONG I AM THE JAPANESE SANDMAN" #define TEST_DURATION 5000 /* ms */ #define BASE_PORT 12345 struct sender_state { struct sockaddr_in addr; uv_udp_send_t send_req; uv_udp_t udp_handle; }; struct receiver_state { struct sockaddr_in addr; uv_udp_t udp_handle; }; /* not used in timed mode */ static unsigned int packet_counter = (unsigned int) 1e6; static int n_senders_; static int n_receivers_; static uv_buf_t bufs[5]; static struct sender_state senders[1024]; static struct receiver_state receivers[1024]; static unsigned int send_cb_called; static unsigned int recv_cb_called; static unsigned int close_cb_called; static int timed; static int exiting; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void send_cb(uv_udp_send_t* req, int status) { struct sender_state* s; ASSERT(req != NULL); if (status != 0) { ASSERT(status == UV_ECANCELED); return; } if (exiting) return; s = container_of(req, struct sender_state, send_req); ASSERT(req->handle == &s->udp_handle); if (timed) goto send; if (packet_counter == 0) { uv_close((uv_handle_t*)&s->udp_handle, NULL); return; } packet_counter--; send: ASSERT(0 == uv_udp_send(&s->send_req, &s->udp_handle, bufs, ARRAY_SIZE(bufs), (const struct sockaddr*) &s->addr, send_cb)); send_cb_called++; } static void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { if (nread == 0) return; if (nread < 0) { ASSERT(nread == UV_ECANCELED); return; } ASSERT(addr->sa_family == AF_INET); ASSERT(!memcmp(buf->base, EXPECTED, nread)); recv_cb_called++; } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void timeout_cb(uv_timer_t* timer) { int i; exiting = 1; for (i = 0; i < n_senders_; i++) uv_close((uv_handle_t*)&senders[i].udp_handle, close_cb); for (i = 0; i < n_receivers_; i++) uv_close((uv_handle_t*)&receivers[i].udp_handle, close_cb); } static int pummel(unsigned int n_senders, unsigned int n_receivers, unsigned long timeout) { uv_timer_t timer_handle; uint64_t duration; uv_loop_t* loop; unsigned int i; ASSERT(n_senders <= ARRAY_SIZE(senders)); ASSERT(n_receivers <= ARRAY_SIZE(receivers)); loop = uv_default_loop(); n_senders_ = n_senders; n_receivers_ = n_receivers; if (timeout) { ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timeout_cb, timeout, 0)); /* Timer should not keep loop alive. */ uv_unref((uv_handle_t*)&timer_handle); timed = 1; } for (i = 0; i < n_receivers; i++) { struct receiver_state* s = receivers + i; struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("0.0.0.0", BASE_PORT + i, &addr)); ASSERT(0 == uv_udp_init(loop, &s->udp_handle)); ASSERT(0 == uv_udp_bind(&s->udp_handle, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_udp_recv_start(&s->udp_handle, alloc_cb, recv_cb)); uv_unref((uv_handle_t*)&s->udp_handle); } bufs[0] = uv_buf_init(EXPECTED + 0, 10); bufs[1] = uv_buf_init(EXPECTED + 10, 10); bufs[2] = uv_buf_init(EXPECTED + 20, 10); bufs[3] = uv_buf_init(EXPECTED + 30, 10); bufs[4] = uv_buf_init(EXPECTED + 40, 5); for (i = 0; i < n_senders; i++) { struct sender_state* s = senders + i; ASSERT(0 == uv_ip4_addr("127.0.0.1", BASE_PORT + (i % n_receivers), &s->addr)); ASSERT(0 == uv_udp_init(loop, &s->udp_handle)); ASSERT(0 == uv_udp_send(&s->send_req, &s->udp_handle, bufs, ARRAY_SIZE(bufs), (const struct sockaddr*) &s->addr, send_cb)); } duration = uv_hrtime(); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); duration = uv_hrtime() - duration; /* convert from nanoseconds to milliseconds */ duration = duration / (uint64_t) 1e6; printf("udp_pummel_%dv%d: %.0f/s received, %.0f/s sent. " "%u received, %u sent in %.1f seconds.\n", n_receivers, n_senders, recv_cb_called / (duration / 1000.0), send_cb_called / (duration / 1000.0), recv_cb_called, send_cb_called, duration / 1000.0); MAKE_VALGRIND_HAPPY(); return 0; } #define X(a, b) \ BENCHMARK_IMPL(udp_pummel_##a##v##b) { \ return pummel(a, b, 0); \ } \ BENCHMARK_IMPL(udp_timed_pummel_##a##v##b) { \ return pummel(a, b, TEST_DURATION); \ } X(1, 1) X(1, 10) X(1, 100) X(1, 1000) X(10, 10) X(10, 100) X(10, 1000) X(100, 10) X(100, 100) X(100, 1000) X(1000, 1000) #undef X MoarVM-2015.11/3rdparty/libuv/test/blackhole-server.c0000644000175000017500000000654012456307253021330 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include typedef struct { uv_tcp_t handle; uv_shutdown_t shutdown_req; } conn_rec; static uv_tcp_t tcp_server; static void connection_cb(uv_stream_t* stream, int status); static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); static void shutdown_cb(uv_shutdown_t* req, int status); static void close_cb(uv_handle_t* handle); static void connection_cb(uv_stream_t* stream, int status) { conn_rec* conn; int r; ASSERT(status == 0); ASSERT(stream == (uv_stream_t*)&tcp_server); conn = malloc(sizeof *conn); ASSERT(conn != NULL); r = uv_tcp_init(stream->loop, &conn->handle); ASSERT(r == 0); r = uv_accept(stream, (uv_stream_t*)&conn->handle); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&conn->handle, alloc_cb, read_cb); ASSERT(r == 0); } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; buf->base = slab; buf->len = sizeof(slab); } static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { conn_rec* conn; int r; if (nread >= 0) return; ASSERT(nread == UV_EOF); conn = container_of(stream, conn_rec, handle); r = uv_shutdown(&conn->shutdown_req, stream, shutdown_cb); ASSERT(r == 0); } static void shutdown_cb(uv_shutdown_t* req, int status) { conn_rec* conn = container_of(req, conn_rec, shutdown_req); uv_close((uv_handle_t*)&conn->handle, close_cb); } static void close_cb(uv_handle_t* handle) { conn_rec* conn = container_of(handle, conn_rec, handle); free(conn); } HELPER_IMPL(tcp4_blackhole_server) { struct sockaddr_in addr; uv_loop_t* loop; int r; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(loop, &tcp_server); ASSERT(r == 0); r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 128, connection_cb); ASSERT(r == 0); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(0 && "Blackhole server dropped out of event loop."); return 0; } MoarVM-2015.11/3rdparty/libuv/test/dns-server.c0000644000175000017500000002057612456307253020175 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include typedef struct { uv_write_t req; uv_buf_t buf; } write_req_t; /* used to track multiple DNS requests received */ typedef struct { char* prevbuf_ptr; int prevbuf_pos; int prevbuf_rem; } dnsstate; /* modify handle to append dnsstate */ typedef struct { uv_tcp_t handle; dnsstate state; } dnshandle; static uv_loop_t* loop; static uv_tcp_t server; static void after_write(uv_write_t* req, int status); static void after_read(uv_stream_t*, ssize_t nread, const uv_buf_t* buf); static void on_close(uv_handle_t* peer); static void on_connection(uv_stream_t*, int status); #define WRITE_BUF_LEN (64*1024) #define DNSREC_LEN (4) #define LEN_OFFSET 0 #define QUERYID_OFFSET 2 static unsigned char DNSRsp[] = { 0, 43, 0, 0, 0x81, 0x80, 0, 1, 0, 1, 0, 0, 0, 0 }; static unsigned char qrecord[] = { 5, 'e', 'c', 'h', 'o', 's', 3, 's', 'r', 'v', 0, 0, 1, 0, 1 }; static unsigned char arecord[] = { 0xc0, 0x0c, 0, 1, 0, 1, 0, 0, 5, 0xbd, 0, 4, 10, 0, 1, 1 }; static void after_write(uv_write_t* req, int status) { write_req_t* wr; if (status) { fprintf(stderr, "uv_write error: %s\n", uv_strerror(status)); ASSERT(0); } wr = (write_req_t*) req; /* Free the read/write buffer and the request */ free(wr->buf.base); free(wr); } static void after_shutdown(uv_shutdown_t* req, int status) { uv_close((uv_handle_t*) req->handle, on_close); free(req); } static void addrsp(write_req_t* wr, char* hdr) { char * dnsrsp; short int rsplen; short int* reclen; rsplen = sizeof(DNSRsp) + sizeof(qrecord) + sizeof(arecord); ASSERT (rsplen + wr->buf.len < WRITE_BUF_LEN); dnsrsp = wr->buf.base + wr->buf.len; /* copy stock response */ memcpy(dnsrsp, DNSRsp, sizeof(DNSRsp)); memcpy(dnsrsp + sizeof(DNSRsp), qrecord, sizeof(qrecord)); memcpy(dnsrsp + sizeof(DNSRsp) + sizeof(qrecord), arecord, sizeof(arecord)); /* overwrite with network order length and id from request header */ reclen = (short int*)dnsrsp; *reclen = htons(rsplen-2); dnsrsp[QUERYID_OFFSET] = hdr[QUERYID_OFFSET]; dnsrsp[QUERYID_OFFSET+1] = hdr[QUERYID_OFFSET+1]; wr->buf.len += rsplen; } static void process_req(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { write_req_t* wr; dnshandle* dns = (dnshandle*)handle; char hdrbuf[DNSREC_LEN]; int hdrbuf_remaining = DNSREC_LEN; int rec_remaining = 0; int readbuf_remaining; char* dnsreq; char* hdrstart; int usingprev = 0; wr = (write_req_t*) malloc(sizeof *wr); wr->buf.base = (char*)malloc(WRITE_BUF_LEN); wr->buf.len = 0; if (dns->state.prevbuf_ptr != NULL) { dnsreq = dns->state.prevbuf_ptr + dns->state.prevbuf_pos; readbuf_remaining = dns->state.prevbuf_rem; usingprev = 1; } else { dnsreq = buf->base; readbuf_remaining = nread; } hdrstart = dnsreq; while (dnsreq != NULL) { /* something to process */ while (readbuf_remaining > 0) { /* something to process in current buffer */ if (hdrbuf_remaining > 0) { /* process len and id */ if (readbuf_remaining < hdrbuf_remaining) { /* too little to get request header. save for next buffer */ memcpy(&hdrbuf[DNSREC_LEN - hdrbuf_remaining], dnsreq, readbuf_remaining); hdrbuf_remaining = DNSREC_LEN - readbuf_remaining; break; } else { /* save header */ memcpy(&hdrbuf[DNSREC_LEN - hdrbuf_remaining], dnsreq, hdrbuf_remaining); dnsreq += hdrbuf_remaining; readbuf_remaining -= hdrbuf_remaining; hdrbuf_remaining = 0; /* get record length */ rec_remaining = (unsigned) hdrbuf[0] * 256 + (unsigned) hdrbuf[1]; rec_remaining -= (DNSREC_LEN - 2); } } if (rec_remaining <= readbuf_remaining) { /* prepare reply */ addrsp(wr, hdrbuf); /* move to next record */ dnsreq += rec_remaining; hdrstart = dnsreq; readbuf_remaining -= rec_remaining; rec_remaining = 0; hdrbuf_remaining = DNSREC_LEN; } else { /* otherwise this buffer is done. */ rec_remaining -= readbuf_remaining; break; } } /* If we had to use bytes from prev buffer, start processing the current * one. */ if (usingprev == 1) { /* free previous buffer */ free(dns->state.prevbuf_ptr); dnsreq = buf->base; readbuf_remaining = nread; usingprev = 0; } else { dnsreq = NULL; } } /* send write buffer */ if (wr->buf.len > 0) { if (uv_write((uv_write_t*) &wr->req, handle, &wr->buf, 1, after_write)) { FATAL("uv_write failed"); } } if (readbuf_remaining > 0) { /* save start of record position, so we can continue on next read */ dns->state.prevbuf_ptr = buf->base; dns->state.prevbuf_pos = hdrstart - buf->base; dns->state.prevbuf_rem = nread - dns->state.prevbuf_pos; } else { /* nothing left in this buffer */ dns->state.prevbuf_ptr = NULL; dns->state.prevbuf_pos = 0; dns->state.prevbuf_rem = 0; free(buf->base); } } static void after_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { uv_shutdown_t* req; if (nread < 0) { /* Error or EOF */ ASSERT(nread == UV_EOF); if (buf->base) { free(buf->base); } req = malloc(sizeof *req); uv_shutdown(req, handle, after_shutdown); return; } if (nread == 0) { /* Everything OK, but nothing read. */ free(buf->base); return; } /* process requests and send responses */ process_req(handle, nread, buf); } static void on_close(uv_handle_t* peer) { free(peer); } static void buf_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } static void on_connection(uv_stream_t* server, int status) { dnshandle* handle; int r; ASSERT(status == 0); handle = (dnshandle*) malloc(sizeof *handle); ASSERT(handle != NULL); /* initialize read buffer state */ handle->state.prevbuf_ptr = 0; handle->state.prevbuf_pos = 0; handle->state.prevbuf_rem = 0; r = uv_tcp_init(loop, (uv_tcp_t*)handle); ASSERT(r == 0); r = uv_accept(server, (uv_stream_t*)handle); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)handle, buf_alloc, after_read); ASSERT(r == 0); } static int dns_start(int port) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", port, &addr)); r = uv_tcp_init(loop, &server); if (r) { /* TODO: Error codes */ fprintf(stderr, "Socket creation error\n"); return 1; } r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); return 1; } r = uv_listen((uv_stream_t*)&server, 128, on_connection); if (r) { /* TODO: Error codes */ fprintf(stderr, "Listen error\n"); return 1; } return 0; } HELPER_IMPL(dns_server) { loop = uv_default_loop(); if (dns_start(TEST_PORT_2)) return 1; uv_run(loop, UV_RUN_DEFAULT); return 0; } MoarVM-2015.11/3rdparty/libuv/test/echo-server.c0000644000175000017500000002022112502366750020311 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include typedef struct { uv_write_t req; uv_buf_t buf; } write_req_t; static uv_loop_t* loop; static int server_closed; static stream_type serverType; static uv_tcp_t tcpServer; static uv_udp_t udpServer; static uv_pipe_t pipeServer; static uv_handle_t* server; static void after_write(uv_write_t* req, int status); static void after_read(uv_stream_t*, ssize_t nread, const uv_buf_t* buf); static void on_close(uv_handle_t* peer); static void on_server_close(uv_handle_t* handle); static void on_connection(uv_stream_t*, int status); static void after_write(uv_write_t* req, int status) { write_req_t* wr; /* Free the read/write buffer and the request */ wr = (write_req_t*) req; free(wr->buf.base); free(wr); if (status == 0) return; fprintf(stderr, "uv_write error: %s - %s\n", uv_err_name(status), uv_strerror(status)); } static void after_shutdown(uv_shutdown_t* req, int status) { uv_close((uv_handle_t*) req->handle, on_close); free(req); } static void after_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { int i; write_req_t *wr; uv_shutdown_t* sreq; if (nread < 0) { /* Error or EOF */ ASSERT(nread == UV_EOF); free(buf->base); sreq = malloc(sizeof* sreq); ASSERT(0 == uv_shutdown(sreq, handle, after_shutdown)); return; } if (nread == 0) { /* Everything OK, but nothing read. */ free(buf->base); return; } /* * Scan for the letter Q which signals that we should quit the server. * If we get QS it means close the stream. */ if (!server_closed) { for (i = 0; i < nread; i++) { if (buf->base[i] == 'Q') { if (i + 1 < nread && buf->base[i + 1] == 'S') { free(buf->base); uv_close((uv_handle_t*)handle, on_close); return; } else { uv_close(server, on_server_close); server_closed = 1; } } } } wr = (write_req_t*) malloc(sizeof *wr); ASSERT(wr != NULL); wr->buf = uv_buf_init(buf->base, nread); if (uv_write(&wr->req, handle, &wr->buf, 1, after_write)) { FATAL("uv_write failed"); } } static void on_close(uv_handle_t* peer) { free(peer); } static void echo_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } static void on_connection(uv_stream_t* server, int status) { uv_stream_t* stream; int r; if (status != 0) { fprintf(stderr, "Connect error %s\n", uv_err_name(status)); } ASSERT(status == 0); switch (serverType) { case TCP: stream = malloc(sizeof(uv_tcp_t)); ASSERT(stream != NULL); r = uv_tcp_init(loop, (uv_tcp_t*)stream); ASSERT(r == 0); break; case PIPE: stream = malloc(sizeof(uv_pipe_t)); ASSERT(stream != NULL); r = uv_pipe_init(loop, (uv_pipe_t*)stream, 0); ASSERT(r == 0); break; default: ASSERT(0 && "Bad serverType"); abort(); } /* associate server with stream */ stream->data = server; r = uv_accept(server, stream); ASSERT(r == 0); r = uv_read_start(stream, echo_alloc, after_read); ASSERT(r == 0); } static void on_server_close(uv_handle_t* handle) { ASSERT(handle == server); } static void on_send(uv_udp_send_t* req, int status); static void on_recv(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { uv_udp_send_t* req; uv_buf_t sndbuf; ASSERT(nread > 0); ASSERT(addr->sa_family == AF_INET); req = malloc(sizeof(*req)); ASSERT(req != NULL); sndbuf = *rcvbuf; ASSERT(0 == uv_udp_send(req, handle, &sndbuf, 1, addr, on_send)); } static void on_send(uv_udp_send_t* req, int status) { ASSERT(status == 0); free(req); } static int tcp4_echo_start(int port) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", port, &addr)); server = (uv_handle_t*)&tcpServer; serverType = TCP; r = uv_tcp_init(loop, &tcpServer); if (r) { /* TODO: Error codes */ fprintf(stderr, "Socket creation error\n"); return 1; } r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr, 0); if (r) { /* TODO: Error codes */ fprintf(stderr, "Bind error\n"); return 1; } r = uv_listen((uv_stream_t*)&tcpServer, SOMAXCONN, on_connection); if (r) { /* TODO: Error codes */ fprintf(stderr, "Listen error %s\n", uv_err_name(r)); return 1; } return 0; } static int tcp6_echo_start(int port) { struct sockaddr_in6 addr6; int r; ASSERT(0 == uv_ip6_addr("::1", port, &addr6)); server = (uv_handle_t*)&tcpServer; serverType = TCP; r = uv_tcp_init(loop, &tcpServer); if (r) { /* TODO: Error codes */ fprintf(stderr, "Socket creation error\n"); return 1; } /* IPv6 is optional as not all platforms support it */ r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr6, 0); if (r) { /* show message but return OK */ fprintf(stderr, "IPv6 not supported\n"); return 0; } r = uv_listen((uv_stream_t*)&tcpServer, SOMAXCONN, on_connection); if (r) { /* TODO: Error codes */ fprintf(stderr, "Listen error\n"); return 1; } return 0; } static int udp4_echo_start(int port) { int r; server = (uv_handle_t*)&udpServer; serverType = UDP; r = uv_udp_init(loop, &udpServer); if (r) { fprintf(stderr, "uv_udp_init: %s\n", uv_strerror(r)); return 1; } r = uv_udp_recv_start(&udpServer, echo_alloc, on_recv); if (r) { fprintf(stderr, "uv_udp_recv_start: %s\n", uv_strerror(r)); return 1; } return 0; } static int pipe_echo_start(char* pipeName) { int r; #ifndef _WIN32 { uv_fs_t req; uv_fs_unlink(uv_default_loop(), &req, pipeName, NULL); uv_fs_req_cleanup(&req); } #endif server = (uv_handle_t*)&pipeServer; serverType = PIPE; r = uv_pipe_init(loop, &pipeServer, 0); if (r) { fprintf(stderr, "uv_pipe_init: %s\n", uv_strerror(r)); return 1; } r = uv_pipe_bind(&pipeServer, pipeName); if (r) { fprintf(stderr, "uv_pipe_bind: %s\n", uv_strerror(r)); return 1; } r = uv_listen((uv_stream_t*)&pipeServer, SOMAXCONN, on_connection); if (r) { fprintf(stderr, "uv_pipe_listen: %s\n", uv_strerror(r)); return 1; } return 0; } HELPER_IMPL(tcp4_echo_server) { loop = uv_default_loop(); if (tcp4_echo_start(TEST_PORT)) return 1; uv_run(loop, UV_RUN_DEFAULT); return 0; } HELPER_IMPL(tcp6_echo_server) { loop = uv_default_loop(); if (tcp6_echo_start(TEST_PORT)) return 1; uv_run(loop, UV_RUN_DEFAULT); return 0; } HELPER_IMPL(pipe_echo_server) { loop = uv_default_loop(); if (pipe_echo_start(TEST_PIPENAME)) return 1; uv_run(loop, UV_RUN_DEFAULT); return 0; } HELPER_IMPL(udp4_echo_server) { loop = uv_default_loop(); if (udp4_echo_start(TEST_PORT)) return 1; uv_run(loop, UV_RUN_DEFAULT); return 0; } MoarVM-2015.11/3rdparty/libuv/test/fixtures/empty_file0000644000175000017500000000000012456307253021646 0ustar jnthnjnthnMoarVM-2015.11/3rdparty/libuv/test/fixtures/load_error.node0000644000175000017500000000000712456307253022574 0ustar jnthnjnthnfoobar MoarVM-2015.11/3rdparty/libuv/test/run-benchmarks.c0000644000175000017500000000360712456307253021020 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "runner.h" #include "task.h" /* Actual benchmarks and helpers are defined in benchmark-list.h */ #include "benchmark-list.h" static int maybe_run_test(int argc, char **argv); int main(int argc, char **argv) { platform_init(argc, argv); switch (argc) { case 1: return run_tests(1); case 2: return maybe_run_test(argc, argv); case 3: return run_test_part(argv[1], argv[2]); default: LOGF("Too many arguments.\n"); return 1; } } static int maybe_run_test(int argc, char **argv) { if (strcmp(argv[1], "--list") == 0) { print_tests(stdout); return 0; } if (strcmp(argv[1], "spawn_helper") == 0) { printf("hello world\n"); return 42; } return run_test(argv[1], 1, 1); } MoarVM-2015.11/3rdparty/libuv/test/run-tests.c0000644000175000017500000001030212456307253020033 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #ifdef _WIN32 # include #else # include #endif #include "uv.h" #include "runner.h" #include "task.h" /* Actual tests and helpers are defined in test-list.h */ #include "test-list.h" int ipc_helper(int listen_after_write); int ipc_helper_tcp_connection(void); int ipc_send_recv_helper(void); int ipc_helper_bind_twice(void); int stdio_over_pipes_helper(void); static int maybe_run_test(int argc, char **argv); int main(int argc, char **argv) { platform_init(argc, argv); argv = uv_setup_args(argc, argv); switch (argc) { case 1: return run_tests(0); case 2: return maybe_run_test(argc, argv); case 3: return run_test_part(argv[1], argv[2]); default: LOGF("Too many arguments.\n"); return 1; } } static int maybe_run_test(int argc, char **argv) { if (strcmp(argv[1], "--list") == 0) { print_tests(stdout); return 0; } if (strcmp(argv[1], "ipc_helper_listen_before_write") == 0) { return ipc_helper(0); } if (strcmp(argv[1], "ipc_helper_listen_after_write") == 0) { return ipc_helper(1); } if (strcmp(argv[1], "ipc_send_recv_helper") == 0) { return ipc_send_recv_helper(); } if (strcmp(argv[1], "ipc_helper_tcp_connection") == 0) { return ipc_helper_tcp_connection(); } if (strcmp(argv[1], "ipc_helper_bind_twice") == 0) { return ipc_helper_bind_twice(); } if (strcmp(argv[1], "stdio_over_pipes_helper") == 0) { return stdio_over_pipes_helper(); } if (strcmp(argv[1], "spawn_helper1") == 0) { return 1; } if (strcmp(argv[1], "spawn_helper2") == 0) { printf("hello world\n"); return 1; } if (strcmp(argv[1], "spawn_helper3") == 0) { char buffer[256]; ASSERT(buffer == fgets(buffer, sizeof(buffer) - 1, stdin)); buffer[sizeof(buffer) - 1] = '\0'; fputs(buffer, stdout); return 1; } if (strcmp(argv[1], "spawn_helper4") == 0) { /* Never surrender, never return! */ while (1) uv_sleep(10000); } if (strcmp(argv[1], "spawn_helper5") == 0) { const char out[] = "fourth stdio!\n"; #ifdef _WIN32 DWORD bytes; WriteFile((HANDLE) _get_osfhandle(3), out, sizeof(out) - 1, &bytes, NULL); #else { ssize_t r; do r = write(3, out, sizeof(out) - 1); while (r == -1 && errno == EINTR); fsync(3); } #endif return 1; } if (strcmp(argv[1], "spawn_helper6") == 0) { int r; r = fprintf(stdout, "hello world\n"); ASSERT(r > 0); r = fprintf(stderr, "hello errworld\n"); ASSERT(r > 0); return 1; } if (strcmp(argv[1], "spawn_helper7") == 0) { int r; char *test; /* Test if the test value from the parent is still set */ test = getenv("ENV_TEST"); ASSERT(test != NULL); r = fprintf(stdout, "%s", test); ASSERT(r > 0); return 1; } #ifndef _WIN32 if (strcmp(argv[1], "spawn_helper8") == 0) { int fd; ASSERT(sizeof(fd) == read(0, &fd, sizeof(fd))); ASSERT(fd > 2); ASSERT(-1 == write(fd, "x", 1)); return 1; } #endif /* !_WIN32 */ return run_test(argv[1], 0, 1); } MoarVM-2015.11/3rdparty/libuv/test/runner-unix.c0000644000175000017500000002001612456307253020364 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "runner-unix.h" #include "runner.h" #include /* uintptr_t */ #include #include /* usleep */ #include /* strdup */ #include #include #include #include #include #include #include #include #include /* Do platform-specific initialization. */ void platform_init(int argc, char **argv) { const char* tap; tap = getenv("UV_TAP_OUTPUT"); tap_output = (tap != NULL && atoi(tap) > 0); /* Disable stdio output buffering. */ setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); strncpy(executable_path, argv[0], sizeof(executable_path) - 1); signal(SIGPIPE, SIG_IGN); } /* Invoke "argv[0] test-name [test-part]". Store process info in *p. */ /* Make sure that all stdio output of the processes is buffered up. */ int process_start(char* name, char* part, process_info_t* p, int is_helper) { FILE* stdout_file; const char* arg; char* args[16]; int n; stdout_file = tmpfile(); if (!stdout_file) { perror("tmpfile"); return -1; } p->terminated = 0; p->status = 0; pid_t pid = fork(); if (pid < 0) { perror("fork"); return -1; } if (pid == 0) { /* child */ arg = getenv("UV_USE_VALGRIND"); n = 0; /* Disable valgrind for helpers, it complains about helpers leaking memory. * They're killed after the test and as such never get a chance to clean up. */ if (is_helper == 0 && arg != NULL && atoi(arg) != 0) { args[n++] = "valgrind"; args[n++] = "--quiet"; args[n++] = "--leak-check=full"; args[n++] = "--show-reachable=yes"; args[n++] = "--error-exitcode=125"; } args[n++] = executable_path; args[n++] = name; args[n++] = part; args[n++] = NULL; dup2(fileno(stdout_file), STDOUT_FILENO); dup2(fileno(stdout_file), STDERR_FILENO); execvp(args[0], args); perror("execvp()"); _exit(127); } /* parent */ p->pid = pid; p->name = strdup(name); p->stdout_file = stdout_file; return 0; } typedef struct { int pipe[2]; process_info_t* vec; int n; } dowait_args; /* This function is run inside a pthread. We do this so that we can possibly * timeout. */ static void* dowait(void* data) { dowait_args* args = data; int i, r; process_info_t* p; for (i = 0; i < args->n; i++) { p = (process_info_t*)(args->vec + i * sizeof(process_info_t)); if (p->terminated) continue; r = waitpid(p->pid, &p->status, 0); if (r < 0) { perror("waitpid"); return NULL; } p->terminated = 1; } if (args->pipe[1] >= 0) { /* Write a character to the main thread to notify it about this. */ ssize_t r; do r = write(args->pipe[1], "", 1); while (r == -1 && errno == EINTR); } return NULL; } /* Wait for all `n` processes in `vec` to terminate. */ /* Time out after `timeout` msec, or never if timeout == -1 */ /* Return 0 if all processes are terminated, -1 on error, -2 on timeout. */ int process_wait(process_info_t* vec, int n, int timeout) { int i; process_info_t* p; dowait_args args; args.vec = vec; args.n = n; args.pipe[0] = -1; args.pipe[1] = -1; /* The simple case is where there is no timeout */ if (timeout == -1) { dowait(&args); return 0; } /* Hard case. Do the wait with a timeout. * * Assumption: we are the only ones making this call right now. Otherwise * we'd need to lock vec. */ pthread_t tid; int retval; int r = pipe((int*)&(args.pipe)); if (r) { perror("pipe()"); return -1; } r = pthread_create(&tid, NULL, dowait, &args); if (r) { perror("pthread_create()"); retval = -1; goto terminate; } struct timeval tv; tv.tv_sec = timeout / 1000; tv.tv_usec = 0; fd_set fds; FD_ZERO(&fds); FD_SET(args.pipe[0], &fds); r = select(args.pipe[0] + 1, &fds, NULL, NULL, &tv); if (r == -1) { perror("select()"); retval = -1; } else if (r) { /* The thread completed successfully. */ retval = 0; } else { /* Timeout. Kill all the children. */ for (i = 0; i < n; i++) { p = (process_info_t*)(vec + i * sizeof(process_info_t)); kill(p->pid, SIGTERM); } retval = -2; /* Wait for thread to finish. */ r = pthread_join(tid, NULL); if (r) { perror("pthread_join"); retval = -1; } } terminate: close(args.pipe[0]); close(args.pipe[1]); return retval; } /* Returns the number of bytes in the stdio output buffer for process `p`. */ long int process_output_size(process_info_t *p) { /* Size of the p->stdout_file */ struct stat buf; int r = fstat(fileno(p->stdout_file), &buf); if (r < 0) { return -1; } return (long)buf.st_size; } /* Copy the contents of the stdio output buffer to `fd`. */ int process_copy_output(process_info_t *p, int fd) { int r = fseek(p->stdout_file, 0, SEEK_SET); if (r < 0) { perror("fseek"); return -1; } ssize_t nwritten; char buf[1024]; /* TODO: what if the line is longer than buf */ while (fgets(buf, sizeof(buf), p->stdout_file) != NULL) { /* TODO: what if write doesn't write the whole buffer... */ nwritten = 0; if (tap_output) nwritten += write(fd, "#", 1); nwritten += write(fd, buf, strlen(buf)); if (nwritten < 0) { perror("write"); return -1; } } if (ferror(p->stdout_file)) { perror("read"); return -1; } return 0; } /* Copy the last line of the stdio output buffer to `buffer` */ int process_read_last_line(process_info_t *p, char* buffer, size_t buffer_len) { char* ptr; int r = fseek(p->stdout_file, 0, SEEK_SET); if (r < 0) { perror("fseek"); return -1; } buffer[0] = '\0'; while (fgets(buffer, buffer_len, p->stdout_file) != NULL) { for (ptr = buffer; *ptr && *ptr != '\r' && *ptr != '\n'; ptr++); *ptr = '\0'; } if (ferror(p->stdout_file)) { perror("read"); buffer[0] = '\0'; return -1; } return 0; } /* Return the name that was specified when `p` was started by process_start */ char* process_get_name(process_info_t *p) { return p->name; } /* Terminate process `p`. */ int process_terminate(process_info_t *p) { return kill(p->pid, SIGTERM); } /* Return the exit code of process p. */ /* On error, return -1. */ int process_reap(process_info_t *p) { if (WIFEXITED(p->status)) { return WEXITSTATUS(p->status); } else { return p->status; /* ? */ } } /* Clean up after terminating process `p` (e.g. free the output buffer etc.). */ void process_cleanup(process_info_t *p) { fclose(p->stdout_file); free(p->name); } /* Move the console cursor one line up and back to the first column. */ void rewind_cursor(void) { fprintf(stderr, "\033[2K\r"); } /* Pause the calling thread for a number of milliseconds. */ void uv_sleep(int msec) { usleep(msec * 1000); } MoarVM-2015.11/3rdparty/libuv/test/runner-unix.h0000644000175000017500000000260612456307253020376 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef TEST_RUNNER_UNIX_H #define TEST_RUNNER_UNIX_H #include #include /* FILE */ typedef struct { FILE* stdout_file; pid_t pid; char* name; int status; int terminated; } process_info_t; #endif /* TEST_RUNNER_UNIX_H */ MoarVM-2015.11/3rdparty/libuv/test/runner-win.c0000644000175000017500000002141512456307253020202 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include #include #if !defined(__MINGW32__) # include #endif #include "task.h" #include "runner.h" /* * Define the stuff that MinGW doesn't have */ #ifndef GetFileSizeEx WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize); #endif /* Do platform-specific initialization. */ void platform_init(int argc, char **argv) { const char* tap; tap = getenv("UV_TAP_OUTPUT"); tap_output = (tap != NULL && atoi(tap) > 0); /* Disable the "application crashed" popup. */ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); #if !defined(__MINGW32__) _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); #endif _setmode(0, _O_BINARY); _setmode(1, _O_BINARY); _setmode(2, _O_BINARY); /* Disable stdio output buffering. */ setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); strcpy(executable_path, argv[0]); } int process_start(char *name, char *part, process_info_t *p, int is_helper) { HANDLE file = INVALID_HANDLE_VALUE; HANDLE nul = INVALID_HANDLE_VALUE; WCHAR path[MAX_PATH], filename[MAX_PATH]; WCHAR image[MAX_PATH + 1]; WCHAR args[MAX_PATH * 2]; STARTUPINFOW si; PROCESS_INFORMATION pi; DWORD result; if (GetTempPathW(sizeof(path) / sizeof(WCHAR), (WCHAR*)&path) == 0) goto error; if (GetTempFileNameW((WCHAR*)&path, L"uv", 0, (WCHAR*)&filename) == 0) goto error; file = CreateFileW((WCHAR*)filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (file == INVALID_HANDLE_VALUE) goto error; if (!SetHandleInformation(file, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) goto error; nul = CreateFileA("nul", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (nul == INVALID_HANDLE_VALUE) goto error; if (!SetHandleInformation(nul, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) goto error; result = GetModuleFileNameW(NULL, (WCHAR*) &image, sizeof(image) / sizeof(WCHAR)); if (result == 0 || result == sizeof(image)) goto error; if (part) { if (_snwprintf((WCHAR*)args, sizeof(args) / sizeof(WCHAR), L"\"%s\" %S %S", image, name, part) < 0) { goto error; } } else { if (_snwprintf((WCHAR*)args, sizeof(args) / sizeof(WCHAR), L"\"%s\" %S", image, name) < 0) { goto error; } } memset((void*)&si, 0, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = nul; si.hStdOutput = file; si.hStdError = file; if (!CreateProcessW(image, args, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) goto error; CloseHandle(pi.hThread); SetHandleInformation(nul, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(file, HANDLE_FLAG_INHERIT, 0); p->stdio_in = nul; p->stdio_out = file; p->process = pi.hProcess; p->name = part; return 0; error: if (file != INVALID_HANDLE_VALUE) CloseHandle(file); if (nul != INVALID_HANDLE_VALUE) CloseHandle(nul); return -1; } /* Timeout is is msecs. Set timeout < 0 to never time out. */ /* Returns 0 when all processes are terminated, -2 on timeout. */ int process_wait(process_info_t *vec, int n, int timeout) { int i; HANDLE handles[MAXIMUM_WAIT_OBJECTS]; DWORD timeout_api, result; /* If there's nothing to wait for, return immediately. */ if (n == 0) return 0; ASSERT(n <= MAXIMUM_WAIT_OBJECTS); for (i = 0; i < n; i++) handles[i] = vec[i].process; if (timeout >= 0) { timeout_api = (DWORD)timeout; } else { timeout_api = INFINITE; } result = WaitForMultipleObjects(n, handles, TRUE, timeout_api); if (result >= WAIT_OBJECT_0 && result < WAIT_OBJECT_0 + n) { /* All processes are terminated. */ return 0; } if (result == WAIT_TIMEOUT) { return -2; } return -1; } long int process_output_size(process_info_t *p) { LARGE_INTEGER size; if (!GetFileSizeEx(p->stdio_out, &size)) return -1; return (long int)size.QuadPart; } int process_copy_output(process_info_t *p, int fd) { DWORD read; char buf[1024]; char *line, *start; if (SetFilePointer(p->stdio_out, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { return -1; } if (tap_output) write(fd, "#", 1); while (ReadFile(p->stdio_out, (void*)&buf, sizeof(buf), &read, NULL) && read > 0) { if (tap_output) { start = buf; while ((line = strchr(start, '\n')) != NULL) { write(fd, start, line - start + 1); write(fd, "#", 1); start = line + 1; } if (start < buf + read) write(fd, start, buf + read - start); } else { write(fd, buf, read); } } if (tap_output) write(fd, "\n", 1); if (GetLastError() != ERROR_HANDLE_EOF) return -1; return 0; } int process_read_last_line(process_info_t *p, char * buffer, size_t buffer_len) { DWORD size; DWORD read; DWORD start; OVERLAPPED overlapped; ASSERT(buffer_len > 0); size = GetFileSize(p->stdio_out, NULL); if (size == INVALID_FILE_SIZE) return -1; if (size == 0) { buffer[0] = '\0'; return 1; } memset(&overlapped, 0, sizeof overlapped); if (size >= buffer_len) overlapped.Offset = size - buffer_len - 1; if (!ReadFile(p->stdio_out, buffer, buffer_len - 1, &read, &overlapped)) return -1; for (start = read - 1; start >= 0; start--) { if (buffer[start] == '\n' || buffer[start] == '\r') break; } if (start > 0) memmove(buffer, buffer + start, read - start); buffer[read - start] = '\0'; return 0; } char* process_get_name(process_info_t *p) { return p->name; } int process_terminate(process_info_t *p) { if (!TerminateProcess(p->process, 1)) return -1; return 0; } int process_reap(process_info_t *p) { DWORD exitCode; if (!GetExitCodeProcess(p->process, &exitCode)) return -1; return (int)exitCode; } void process_cleanup(process_info_t *p) { CloseHandle(p->process); CloseHandle(p->stdio_in); CloseHandle(p->stdio_out); } static int clear_line() { HANDLE handle; CONSOLE_SCREEN_BUFFER_INFO info; COORD coord; DWORD written; handle = (HANDLE)_get_osfhandle(fileno(stderr)); if (handle == INVALID_HANDLE_VALUE) return -1; if (!GetConsoleScreenBufferInfo(handle, &info)) return -1; coord = info.dwCursorPosition; if (coord.Y <= 0) return -1; coord.X = 0; if (!SetConsoleCursorPosition(handle, coord)) return -1; if (!FillConsoleOutputCharacterW(handle, 0x20, info.dwSize.X, coord, &written)) { return -1; } return 0; } void rewind_cursor() { if (clear_line() == -1) { /* If clear_line fails (stdout is not a console), print a newline. */ fprintf(stderr, "\n"); } } /* Pause the calling thread for a number of milliseconds. */ void uv_sleep(int msec) { Sleep(msec); } MoarVM-2015.11/3rdparty/libuv/test/runner-win.h0000644000175000017500000000306612456307253020211 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* Don't complain about _snprintf being insecure. */ #define _CRT_SECURE_NO_WARNINGS /* Don't complain about write(), fileno() etc. being deprecated. */ #pragma warning(disable : 4996) #include #include #include /* Windows has no snprintf, only _snprintf. */ #define snprintf _snprintf typedef struct { HANDLE process; HANDLE stdio_in; HANDLE stdio_out; char *name; } process_info_t; MoarVM-2015.11/3rdparty/libuv/test/runner.c0000644000175000017500000002475512456307253017421 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include "runner.h" #include "task.h" #include "uv.h" char executable_path[PATHMAX] = { '\0' }; int tap_output = 0; static void log_progress(int total, int passed, int failed, int todos, int skipped, const char* name) { int progress; if (total == 0) total = 1; progress = 100 * (passed + failed + skipped + todos) / total; LOGF("[%% %3d|+ %3d|- %3d|T %3d|S %3d]: %s", progress, passed, failed, todos, skipped, name); } const char* fmt(double d) { static char buf[1024]; static char* p; uint64_t v; if (p == NULL) p = buf; p += 31; if (p >= buf + sizeof(buf)) return ""; v = (uint64_t) d; #if 0 /* works but we don't care about fractional precision */ if (d - v >= 0.01) { *--p = '0' + (uint64_t) (d * 100) % 10; *--p = '0' + (uint64_t) (d * 10) % 10; *--p = '.'; } #endif if (v == 0) *--p = '0'; while (v) { if (v) *--p = '0' + (v % 10), v /= 10; if (v) *--p = '0' + (v % 10), v /= 10; if (v) *--p = '0' + (v % 10), v /= 10; if (v) *--p = ','; } return p; } int run_tests(int benchmark_output) { int total; int passed; int failed; int todos; int skipped; int current; int test_result; task_entry_t* task; /* Count the number of tests. */ total = 0; for (task = TASKS; task->main; task++) { if (!task->is_helper) { total++; } } if (tap_output) { LOGF("1..%d\n", total); } /* Run all tests. */ passed = 0; failed = 0; todos = 0; skipped = 0; current = 1; for (task = TASKS; task->main; task++) { if (task->is_helper) { continue; } if (!tap_output) rewind_cursor(); if (!benchmark_output && !tap_output) { log_progress(total, passed, failed, todos, skipped, task->task_name); } test_result = run_test(task->task_name, benchmark_output, current); switch (test_result) { case TEST_OK: passed++; break; case TEST_TODO: todos++; break; case TEST_SKIP: skipped++; break; default: failed++; } current++; } if (!tap_output) rewind_cursor(); if (!benchmark_output && !tap_output) { log_progress(total, passed, failed, todos, skipped, "Done.\n"); } return failed; } void log_tap_result(int test_count, const char* test, int status, process_info_t* process) { const char* result; const char* directive; char reason[1024]; switch (status) { case TEST_OK: result = "ok"; directive = ""; break; case TEST_TODO: result = "not ok"; directive = " # TODO "; break; case TEST_SKIP: result = "ok"; directive = " # SKIP "; break; default: result = "not ok"; directive = ""; } if ((status == TEST_SKIP || status == TEST_TODO) && process_output_size(process) > 0) { process_read_last_line(process, reason, sizeof reason); } else { reason[0] = '\0'; } LOGF("%s %d - %s%s%s\n", result, test_count, test, directive, reason); } int run_test(const char* test, int benchmark_output, int test_count) { char errmsg[1024] = "no error"; process_info_t processes[1024]; process_info_t *main_proc; task_entry_t* task; int process_count; int result; int status; int i; status = 255; main_proc = NULL; process_count = 0; #ifndef _WIN32 /* Clean up stale socket from previous run. */ remove(TEST_PIPENAME); #endif /* If it's a helper the user asks for, start it directly. */ for (task = TASKS; task->main; task++) { if (task->is_helper && strcmp(test, task->process_name) == 0) { return task->main(); } } /* Start the helpers first. */ for (task = TASKS; task->main; task++) { if (strcmp(test, task->task_name) != 0) { continue; } /* Skip the test itself. */ if (!task->is_helper) { continue; } if (process_start(task->task_name, task->process_name, &processes[process_count], 1 /* is_helper */) == -1) { snprintf(errmsg, sizeof errmsg, "Process `%s` failed to start.", task->process_name); goto out; } process_count++; } /* Give the helpers time to settle. Race-y, fix this. */ uv_sleep(250); /* Now start the test itself. */ for (task = TASKS; task->main; task++) { if (strcmp(test, task->task_name) != 0) { continue; } if (task->is_helper) { continue; } if (process_start(task->task_name, task->process_name, &processes[process_count], 0 /* !is_helper */) == -1) { snprintf(errmsg, sizeof errmsg, "Process `%s` failed to start.", task->process_name); goto out; } main_proc = &processes[process_count]; process_count++; break; } if (main_proc == NULL) { snprintf(errmsg, sizeof errmsg, "No test with that name: %s", test); goto out; } result = process_wait(main_proc, 1, task->timeout); if (result == -1) { FATAL("process_wait failed"); } else if (result == -2) { /* Don't have to clean up the process, process_wait() has killed it. */ snprintf(errmsg, sizeof errmsg, "timeout"); goto out; } status = process_reap(main_proc); if (status != TEST_OK) { snprintf(errmsg, sizeof errmsg, "exit code %d", status); goto out; } if (benchmark_output) { /* Give the helpers time to clean up their act. */ uv_sleep(1000); } out: /* Reap running processes except the main process, it's already dead. */ for (i = 0; i < process_count - 1; i++) { process_terminate(&processes[i]); } if (process_count > 0 && process_wait(processes, process_count - 1, -1) < 0) { FATAL("process_wait failed"); } if (tap_output) log_tap_result(test_count, test, status, &processes[i]); /* Show error and output from processes if the test failed. */ if (status != 0 || task->show_output) { if (tap_output) { LOGF("#"); } else if (status == TEST_TODO) { LOGF("\n`%s` todo\n", test); } else if (status == TEST_SKIP) { LOGF("\n`%s` skipped\n", test); } else if (status != 0) { LOGF("\n`%s` failed: %s\n", test, errmsg); } else { LOGF("\n"); } for (i = 0; i < process_count; i++) { switch (process_output_size(&processes[i])) { case -1: LOGF("Output from process `%s`: (unavailable)\n", process_get_name(&processes[i])); break; case 0: LOGF("Output from process `%s`: (no output)\n", process_get_name(&processes[i])); break; default: LOGF("Output from process `%s`:\n", process_get_name(&processes[i])); process_copy_output(&processes[i], fileno(stderr)); break; } } if (!tap_output) { LOG("=============================================================\n"); } /* In benchmark mode show concise output from the main process. */ } else if (benchmark_output) { switch (process_output_size(main_proc)) { case -1: LOGF("%s: (unavailable)\n", test); break; case 0: LOGF("%s: (no output)\n", test); break; default: for (i = 0; i < process_count; i++) { process_copy_output(&processes[i], fileno(stderr)); } break; } } /* Clean up all process handles. */ for (i = 0; i < process_count; i++) { process_cleanup(&processes[i]); } return status; } /* Returns the status code of the task part * or 255 if no matching task was not found. */ int run_test_part(const char* test, const char* part) { task_entry_t* task; int r; for (task = TASKS; task->main; task++) { if (strcmp(test, task->task_name) == 0 && strcmp(part, task->process_name) == 0) { r = task->main(); return r; } } LOGF("No test part with that name: %s:%s\n", test, part); return 255; } static int compare_task(const void* va, const void* vb) { const task_entry_t* a = va; const task_entry_t* b = vb; return strcmp(a->task_name, b->task_name); } static int find_helpers(const task_entry_t* task, const task_entry_t** helpers) { const task_entry_t* helper; int n_helpers; for (n_helpers = 0, helper = TASKS; helper->main; helper++) { if (helper->is_helper && strcmp(helper->task_name, task->task_name) == 0) { *helpers++ = helper; n_helpers++; } } return n_helpers; } void print_tests(FILE* stream) { const task_entry_t* helpers[1024]; const task_entry_t* task; int n_helpers; int n_tasks; int i; for (n_tasks = 0, task = TASKS; task->main; n_tasks++, task++); qsort(TASKS, n_tasks, sizeof(TASKS[0]), compare_task); for (task = TASKS; task->main; task++) { if (task->is_helper) { continue; } n_helpers = find_helpers(task, helpers); if (n_helpers) { printf("%-25s (helpers:", task->task_name); for (i = 0; i < n_helpers; i++) { printf(" %s", helpers[i]->process_name); } printf(")\n"); } else { printf("%s\n", task->task_name); } } } MoarVM-2015.11/3rdparty/libuv/test/runner.h0000644000175000017500000001217012456307253017412 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef RUNNER_H_ #define RUNNER_H_ #include /* FILE */ /* * The maximum number of processes (main + helpers) that a test / benchmark * can have. */ #define MAX_PROCESSES 8 /* * Struct to store both tests and to define helper processes for tasks. */ typedef struct { char *task_name; char *process_name; int (*main)(void); int is_helper; int show_output; /* * The time in milliseconds after which a single test or benchmark times out. */ int timeout; } task_entry_t, bench_entry_t; /* * Macros used by test-list.h and benchmark-list.h. */ #define TASK_LIST_START \ task_entry_t TASKS[] = { #define TASK_LIST_END \ { 0, 0, 0, 0, 0, 0 } \ }; #define TEST_DECLARE(name) \ int run_test_##name(void); #define TEST_ENTRY(name) \ { #name, #name, &run_test_##name, 0, 0, 5000 }, #define TEST_ENTRY_CUSTOM(name, is_helper, show_output, timeout) \ { #name, #name, &run_test_##name, is_helper, show_output, timeout }, #define BENCHMARK_DECLARE(name) \ int run_benchmark_##name(void); #define BENCHMARK_ENTRY(name) \ { #name, #name, &run_benchmark_##name, 0, 0, 60000 }, #define HELPER_DECLARE(name) \ int run_helper_##name(void); #define HELPER_ENTRY(task_name, name) \ { #task_name, #name, &run_helper_##name, 1, 0, 0 }, #define TEST_HELPER HELPER_ENTRY #define BENCHMARK_HELPER HELPER_ENTRY #define PATHMAX 1024 extern char executable_path[PATHMAX]; /* * Include platform-dependent definitions */ #ifdef _WIN32 # include "runner-win.h" #else # include "runner-unix.h" #endif /* The array that is filled by test-list.h or benchmark-list.h */ extern task_entry_t TASKS[]; /* * Run all tests. */ int run_tests(int benchmark_output); /* * Run a single test. Starts up any helpers. */ int run_test(const char* test, int benchmark_output, int test_count); /* * Run a test part, i.e. the test or one of its helpers. */ int run_test_part(const char* test, const char* part); /* * Print tests in sorted order to `stream`. Used by `./run-tests --list`. */ void print_tests(FILE* stream); /* * Stuff that should be implemented by test-runner-.h * All functions return 0 on success, -1 on failure, unless specified * otherwise. */ /* Do platform-specific initialization. */ void platform_init(int argc, char** argv); /* Invoke "argv[0] test-name [test-part]". Store process info in *p. */ /* Make sure that all stdio output of the processes is buffered up. */ int process_start(char *name, char* part, process_info_t *p, int is_helper); /* Wait for all `n` processes in `vec` to terminate. */ /* Time out after `timeout` msec, or never if timeout == -1 */ /* Return 0 if all processes are terminated, -1 on error, -2 on timeout. */ int process_wait(process_info_t *vec, int n, int timeout); /* Returns the number of bytes in the stdio output buffer for process `p`. */ long int process_output_size(process_info_t *p); /* Copy the contents of the stdio output buffer to `fd`. */ int process_copy_output(process_info_t *p, int fd); /* Copy the last line of the stdio output buffer to `buffer` */ int process_read_last_line(process_info_t *p, char * buffer, size_t buffer_len); /* Return the name that was specified when `p` was started by process_start */ char* process_get_name(process_info_t *p); /* Terminate process `p`. */ int process_terminate(process_info_t *p); /* Return the exit code of process p. */ /* On error, return -1. */ int process_reap(process_info_t *p); /* Clean up after terminating process `p` (e.g. free the output buffer etc.). */ void process_cleanup(process_info_t *p); /* Move the console cursor one line up and back to the first column. */ void rewind_cursor(void); /* trigger output as tap */ extern int tap_output; #endif /* RUNNER_H_ */ MoarVM-2015.11/3rdparty/libuv/test/task.h0000644000175000017500000001707712456307253017056 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef TASK_H_ #define TASK_H_ #include "uv.h" #include #include #include #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" #else # include #endif #if !defined(_WIN32) # include # include /* setrlimit() */ #endif #define TEST_PORT 9123 #define TEST_PORT_2 9124 #ifdef _WIN32 # define TEST_PIPENAME "\\\\?\\pipe\\uv-test" # define TEST_PIPENAME_2 "\\\\?\\pipe\\uv-test2" #else # define TEST_PIPENAME "/tmp/uv-test-sock" # define TEST_PIPENAME_2 "/tmp/uv-test-sock2" #endif #ifdef _WIN32 # include # ifndef S_IRUSR # define S_IRUSR _S_IREAD # endif # ifndef S_IWUSR # define S_IWUSR _S_IWRITE # endif #endif #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define container_of(ptr, type, member) \ ((type *) ((char *) (ptr) - offsetof(type, member))) typedef enum { TCP = 0, UDP, PIPE } stream_type; /* Log to stderr. */ #define LOG(...) \ do { \ fprintf(stderr, "%s", __VA_ARGS__); \ fflush(stderr); \ } while (0) #define LOGF(...) \ do { \ fprintf(stderr, __VA_ARGS__); \ fflush(stderr); \ } while (0) /* Die with fatal error. */ #define FATAL(msg) \ do { \ fprintf(stderr, \ "Fatal error in %s on line %d: %s\n", \ __FILE__, \ __LINE__, \ msg); \ fflush(stderr); \ abort(); \ } while (0) /* Have our own assert, so we are sure it does not get optimized away in * a release build. */ #define ASSERT(expr) \ do { \ if (!(expr)) { \ fprintf(stderr, \ "Assertion failed in %s on line %d: %s\n", \ __FILE__, \ __LINE__, \ #expr); \ abort(); \ } \ } while (0) /* This macro cleans up the main loop. This is used to avoid valgrind * warnings about memory being "leaked" by the main event loop. */ #define MAKE_VALGRIND_HAPPY() \ do { \ close_loop(uv_default_loop()); \ uv_loop_delete(uv_default_loop()); \ } while (0) /* Just sugar for wrapping the main() for a task or helper. */ #define TEST_IMPL(name) \ int run_test_##name(void); \ int run_test_##name(void) #define BENCHMARK_IMPL(name) \ int run_benchmark_##name(void); \ int run_benchmark_##name(void) #define HELPER_IMPL(name) \ int run_helper_##name(void); \ int run_helper_##name(void) /* Pause the calling thread for a number of milliseconds. */ void uv_sleep(int msec); /* Format big numbers nicely. WARNING: leaks memory. */ const char* fmt(double d); /* Reserved test exit codes. */ enum test_status { TEST_OK = 0, TEST_TODO, TEST_SKIP }; #define RETURN_OK() \ do { \ return TEST_OK; \ } while (0) #define RETURN_TODO(explanation) \ do { \ LOGF("%s\n", explanation); \ return TEST_TODO; \ } while (0) #define RETURN_SKIP(explanation) \ do { \ LOGF("%s\n", explanation); \ return TEST_SKIP; \ } while (0) #if !defined(_WIN32) # define TEST_FILE_LIMIT(num) \ do { \ struct rlimit lim; \ lim.rlim_cur = (num); \ lim.rlim_max = lim.rlim_cur; \ if (setrlimit(RLIMIT_NOFILE, &lim)) \ RETURN_SKIP("File descriptor limit too low."); \ } while (0) #else /* defined(_WIN32) */ # define TEST_FILE_LIMIT(num) do {} while (0) #endif #if defined _WIN32 && ! defined __GNUC__ #include /* Emulate snprintf() on Windows, _snprintf() doesn't zero-terminate the buffer * on overflow... */ static int snprintf(char* buf, size_t len, const char* fmt, ...) { va_list ap; int n; va_start(ap, fmt); n = _vsprintf_p(buf, len, fmt, ap); va_end(ap); /* It's a sad fact of life that no one ever checks the return value of * snprintf(). Zero-terminating the buffer hopefully reduces the risk * of gaping security holes. */ if (n < 0) if (len > 0) buf[0] = '\0'; return n; } #endif #if defined(__clang__) || \ defined(__GNUC__) || \ defined(__INTEL_COMPILER) || \ defined(__SUNPRO_C) # define UNUSED __attribute__((unused)) #else # define UNUSED #endif /* Fully close a loop */ static void close_walk_cb(uv_handle_t* handle, void* arg) { if (!uv_is_closing(handle)) uv_close(handle, NULL); } UNUSED static void close_loop(uv_loop_t* loop) { uv_walk(loop, close_walk_cb, NULL); uv_run(loop, UV_RUN_DEFAULT); } #endif /* TASK_H_ */ MoarVM-2015.11/3rdparty/libuv/test/test-active.c0000644000175000017500000000477712456307253020342 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void timer_cb(uv_timer_t* handle) { ASSERT(0 && "timer_cb should not have been called"); } TEST_IMPL(active) { int r; uv_timer_t timer; r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); /* uv_is_active() and uv_is_closing() should always return either 0 or 1. */ ASSERT(0 == uv_is_active((uv_handle_t*) &timer)); ASSERT(0 == uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_start(&timer, timer_cb, 1000, 0); ASSERT(r == 0); ASSERT(1 == uv_is_active((uv_handle_t*) &timer)); ASSERT(0 == uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_stop(&timer); ASSERT(r == 0); ASSERT(0 == uv_is_active((uv_handle_t*) &timer)); ASSERT(0 == uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_start(&timer, timer_cb, 1000, 0); ASSERT(r == 0); ASSERT(1 == uv_is_active((uv_handle_t*) &timer)); ASSERT(0 == uv_is_closing((uv_handle_t*) &timer)); uv_close((uv_handle_t*) &timer, close_cb); ASSERT(0 == uv_is_active((uv_handle_t*) &timer)); ASSERT(1 == uv_is_closing((uv_handle_t*) &timer)); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-async-null-cb.c0000644000175000017500000000377312456307253021531 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_async_t async_handle; static uv_check_t check_handle; static int check_cb_called; static uv_thread_t thread; static void thread_cb(void* dummy) { (void) &dummy; uv_async_send(&async_handle); } static void check_cb(uv_check_t* handle) { ASSERT(check_cb_called == 0); uv_close((uv_handle_t*) &async_handle, NULL); uv_close((uv_handle_t*) &check_handle, NULL); check_cb_called++; } TEST_IMPL(async_null_cb) { ASSERT(0 == uv_async_init(uv_default_loop(), &async_handle, NULL)); ASSERT(0 == uv_check_init(uv_default_loop(), &check_handle)); ASSERT(0 == uv_check_start(&check_handle, check_cb)); ASSERT(0 == uv_thread_create(&thread, thread_cb, NULL)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(0 == uv_thread_join(&thread)); ASSERT(1 == check_cb_called); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-async.c0000644000175000017500000000660712456307253020176 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_thread_t thread; static uv_mutex_t mutex; static uv_prepare_t prepare; static uv_async_t async; static volatile int async_cb_called; static int prepare_cb_called; static int close_cb_called; static void thread_cb(void *arg) { int n; int r; for (;;) { uv_mutex_lock(&mutex); n = async_cb_called; uv_mutex_unlock(&mutex); if (n == 3) { break; } r = uv_async_send(&async); ASSERT(r == 0); /* Work around a bug in Valgrind. * * Valgrind runs threads not in parallel but sequentially, i.e. one after * the other. It also doesn't preempt them, instead it depends on threads * yielding voluntarily by making a syscall. * * That never happens here: the pipe that is associated with the async * handle is written to once but that's too early for Valgrind's scheduler * to kick in. Afterwards, the thread busy-loops, starving the main thread. * Therefore, we yield. * * This behavior has been observed with Valgrind 3.7.0 and 3.9.0. */ uv_sleep(0); } } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void async_cb(uv_async_t* handle) { int n; ASSERT(handle == &async); uv_mutex_lock(&mutex); n = ++async_cb_called; uv_mutex_unlock(&mutex); if (n == 3) { uv_close((uv_handle_t*)&async, close_cb); uv_close((uv_handle_t*)&prepare, close_cb); } } static void prepare_cb(uv_prepare_t* handle) { int r; ASSERT(handle == &prepare); if (prepare_cb_called++) return; r = uv_thread_create(&thread, thread_cb, NULL); ASSERT(r == 0); uv_mutex_unlock(&mutex); } TEST_IMPL(async) { int r; r = uv_mutex_init(&mutex); ASSERT(r == 0); uv_mutex_lock(&mutex); r = uv_prepare_init(uv_default_loop(), &prepare); ASSERT(r == 0); r = uv_prepare_start(&prepare, prepare_cb); ASSERT(r == 0); r = uv_async_init(uv_default_loop(), &async, async_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(prepare_cb_called > 0); ASSERT(async_cb_called == 3); ASSERT(close_cb_called == 2); ASSERT(0 == uv_thread_join(&thread)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-barrier.c0000644000175000017500000000547312456307253020507 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include typedef struct { uv_barrier_t barrier; int delay; volatile int posted; int main_barrier_wait_rval; int worker_barrier_wait_rval; } worker_config; static void worker(void* arg) { worker_config* c = arg; if (c->delay) uv_sleep(c->delay); c->worker_barrier_wait_rval = uv_barrier_wait(&c->barrier); } TEST_IMPL(barrier_1) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); ASSERT(0 == uv_barrier_init(&wc.barrier, 2)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_sleep(100); wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier); ASSERT(0 == uv_thread_join(&thread)); uv_barrier_destroy(&wc.barrier); ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval)); return 0; } TEST_IMPL(barrier_2) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); wc.delay = 100; ASSERT(0 == uv_barrier_init(&wc.barrier, 2)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier); ASSERT(0 == uv_thread_join(&thread)); uv_barrier_destroy(&wc.barrier); ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval)); return 0; } TEST_IMPL(barrier_3) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); ASSERT(0 == uv_barrier_init(&wc.barrier, 2)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier); ASSERT(0 == uv_thread_join(&thread)); uv_barrier_destroy(&wc.barrier); ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval)); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-callback-order.c0000644000175000017500000000435712456307253021726 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int idle_cb_called; static int timer_cb_called; static uv_idle_t idle_handle; static uv_timer_t timer_handle; /* idle_cb should run before timer_cb */ static void idle_cb(uv_idle_t* handle) { ASSERT(idle_cb_called == 0); ASSERT(timer_cb_called == 0); uv_idle_stop(handle); idle_cb_called++; } static void timer_cb(uv_timer_t* handle) { ASSERT(idle_cb_called == 1); ASSERT(timer_cb_called == 0); uv_timer_stop(handle); timer_cb_called++; } static void next_tick(uv_idle_t* handle) { uv_loop_t* loop = handle->loop; uv_idle_stop(handle); uv_idle_init(loop, &idle_handle); uv_idle_start(&idle_handle, idle_cb); uv_timer_init(loop, &timer_handle); uv_timer_start(&timer_handle, timer_cb, 0, 0); } TEST_IMPL(callback_order) { uv_loop_t* loop; uv_idle_t idle; loop = uv_default_loop(); uv_idle_init(loop, &idle); uv_idle_start(&idle, next_tick); ASSERT(idle_cb_called == 0); ASSERT(timer_cb_called == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(idle_cb_called == 1); ASSERT(timer_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-callback-stack.c0000644000175000017500000001274412456307253021717 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* * TODO: Add explanation of why we want on_close to be called from fresh * stack. */ #include "uv.h" #include "task.h" static const char MESSAGE[] = "Failure is for the weak. Everyone dies alone."; static uv_tcp_t client; static uv_timer_t timer; static uv_connect_t connect_req; static uv_write_t write_req; static uv_shutdown_t shutdown_req; static int nested = 0; static int close_cb_called = 0; static int connect_cb_called = 0; static int write_cb_called = 0; static int timer_cb_called = 0; static int bytes_received = 0; static int shutdown_cb_called = 0; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->len = size; buf->base = malloc(size); ASSERT(buf->base != NULL); } static void close_cb(uv_handle_t* handle) { ASSERT(nested == 0 && "close_cb must be called from a fresh stack"); close_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(status == 0); ASSERT(nested == 0 && "shutdown_cb must be called from a fresh stack"); shutdown_cb_called++; } static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ASSERT(nested == 0 && "read_cb must be called from a fresh stack"); printf("Read. nread == %d\n", (int)nread); free(buf->base); if (nread == 0) { return; } else if (nread < 0) { ASSERT(nread == UV_EOF); nested++; uv_close((uv_handle_t*)tcp, close_cb); nested--; return; } bytes_received += nread; /* We call shutdown here because when bytes_received == sizeof MESSAGE */ /* there will be no more data sent nor received, so here it would be */ /* possible for a backend to to call shutdown_cb immediately and *not* */ /* from a fresh stack. */ if (bytes_received == sizeof MESSAGE) { nested++; puts("Shutdown"); if (uv_shutdown(&shutdown_req, (uv_stream_t*)tcp, shutdown_cb)) { FATAL("uv_shutdown failed"); } nested--; } } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer); ASSERT(nested == 0 && "timer_cb must be called from a fresh stack"); puts("Timeout complete. Now read data..."); nested++; if (uv_read_start((uv_stream_t*)&client, alloc_cb, read_cb)) { FATAL("uv_read_start failed"); } nested--; timer_cb_called++; uv_close((uv_handle_t*)handle, close_cb); } static void write_cb(uv_write_t* req, int status) { int r; ASSERT(status == 0); ASSERT(nested == 0 && "write_cb must be called from a fresh stack"); puts("Data written. 500ms timeout..."); /* After the data has been sent, we're going to wait for a while, then */ /* start reading. This makes us certain that the message has been echoed */ /* back to our receive buffer when we start reading. This maximizes the */ /* temptation for the backend to use dirty stack for calling read_cb. */ nested++; r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 500, 0); ASSERT(r == 0); nested--; write_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { uv_buf_t buf; puts("Connected. Write some data to echo server..."); ASSERT(status == 0); ASSERT(nested == 0 && "connect_cb must be called from a fresh stack"); nested++; buf.base = (char*) &MESSAGE; buf.len = sizeof MESSAGE; if (uv_write(&write_req, (uv_stream_t*)req->handle, &buf, 1, write_cb)) { FATAL("uv_write failed"); } nested--; connect_cb_called++; } TEST_IMPL(callback_stack) { struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); if (uv_tcp_init(uv_default_loop(), &client)) { FATAL("uv_tcp_init failed"); } puts("Connecting..."); nested++; if (uv_tcp_connect(&connect_req, &client, (const struct sockaddr*) &addr, connect_cb)) { FATAL("uv_tcp_connect failed"); } nested--; uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(nested == 0); ASSERT(connect_cb_called == 1 && "connect_cb must be called exactly once"); ASSERT(write_cb_called == 1 && "write_cb must be called exactly once"); ASSERT(timer_cb_called == 1 && "timer_cb must be called exactly once"); ASSERT(bytes_received == sizeof MESSAGE); ASSERT(shutdown_cb_called == 1 && "shutdown_cb must be called exactly once"); ASSERT(close_cb_called == 2 && "close_cb must be called exactly twice"); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-close-fd.c0000644000175000017500000000522212456307253020545 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #if !defined(_WIN32) #include "uv.h" #include "task.h" #include #include static unsigned int read_cb_called; static void alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf) { static char slab[1]; buf->base = slab; buf->len = sizeof(slab); } static void read_cb(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { switch (++read_cb_called) { case 1: ASSERT(nread == 1); uv_read_stop(handle); break; case 2: ASSERT(nread == UV_EOF); uv_close((uv_handle_t *) handle, NULL); break; default: ASSERT(!"read_cb_called > 2"); } } TEST_IMPL(close_fd) { uv_pipe_t pipe_handle; int fd[2]; ASSERT(0 == pipe(fd)); ASSERT(0 == fcntl(fd[0], F_SETFL, O_NONBLOCK)); ASSERT(0 == uv_pipe_init(uv_default_loop(), &pipe_handle, 0)); ASSERT(0 == uv_pipe_open(&pipe_handle, fd[0])); fd[0] = -1; /* uv_pipe_open() takes ownership of the file descriptor. */ ASSERT(1 == write(fd[1], "", 1)); ASSERT(0 == close(fd[1])); fd[1] = -1; ASSERT(0 == uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(1 == read_cb_called); ASSERT(0 == uv_is_active((const uv_handle_t *) &pipe_handle)); ASSERT(0 == uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(2 == read_cb_called); ASSERT(0 != uv_is_closing((const uv_handle_t *) &pipe_handle)); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !defined(_WIN32) */ MoarVM-2015.11/3rdparty/libuv/test/test-close-order.c0000644000175000017500000000470012456307253021267 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int check_cb_called; static int timer_cb_called; static int close_cb_called; static uv_check_t check_handle; static uv_timer_t timer_handle1; static uv_timer_t timer_handle2; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } /* check_cb should run before any close_cb */ static void check_cb(uv_check_t* handle) { ASSERT(check_cb_called == 0); ASSERT(timer_cb_called == 1); ASSERT(close_cb_called == 0); uv_close((uv_handle_t*) handle, close_cb); uv_close((uv_handle_t*) &timer_handle2, close_cb); check_cb_called++; } static void timer_cb(uv_timer_t* handle) { uv_close((uv_handle_t*) handle, close_cb); timer_cb_called++; } TEST_IMPL(close_order) { uv_loop_t* loop; loop = uv_default_loop(); uv_check_init(loop, &check_handle); uv_check_start(&check_handle, check_cb); uv_timer_init(loop, &timer_handle1); uv_timer_start(&timer_handle1, timer_cb, 0, 0); uv_timer_init(loop, &timer_handle2); uv_timer_start(&timer_handle2, timer_cb, 100000, 0); ASSERT(check_cb_called == 0); ASSERT(close_cb_called == 0); ASSERT(timer_cb_called == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(check_cb_called == 1); ASSERT(close_cb_called == 3); ASSERT(timer_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-condvar.c0000644000175000017500000001012512456307253020503 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include typedef struct { uv_mutex_t mutex; uv_cond_t cond; int delay; int use_broadcast; volatile int posted; } worker_config; static void worker(void* arg) { worker_config* c = arg; if (c->delay) uv_sleep(c->delay); uv_mutex_lock(&c->mutex); ASSERT(c->posted == 0); c->posted = 1; if (c->use_broadcast) uv_cond_broadcast(&c->cond); else uv_cond_signal(&c->cond); uv_mutex_unlock(&c->mutex); } TEST_IMPL(condvar_1) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); ASSERT(0 == uv_cond_init(&wc.cond)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_mutex_lock(&wc.mutex); uv_sleep(100); uv_cond_wait(&wc.cond, &wc.mutex); ASSERT(wc.posted == 1); uv_mutex_unlock(&wc.mutex); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_cond_destroy(&wc.cond); return 0; } TEST_IMPL(condvar_2) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); wc.delay = 100; ASSERT(0 == uv_cond_init(&wc.cond)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_mutex_lock(&wc.mutex); uv_cond_wait(&wc.cond, &wc.mutex); uv_mutex_unlock(&wc.mutex); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_cond_destroy(&wc.cond); return 0; } TEST_IMPL(condvar_3) { uv_thread_t thread; worker_config wc; int r; memset(&wc, 0, sizeof(wc)); wc.delay = 100; ASSERT(0 == uv_cond_init(&wc.cond)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_mutex_lock(&wc.mutex); r = uv_cond_timedwait(&wc.cond, &wc.mutex, (uint64_t)(50 * 1e6)); ASSERT(r == UV_ETIMEDOUT); uv_mutex_unlock(&wc.mutex); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_cond_destroy(&wc.cond); return 0; } TEST_IMPL(condvar_4) { uv_thread_t thread; worker_config wc; int r; memset(&wc, 0, sizeof(wc)); wc.delay = 100; ASSERT(0 == uv_cond_init(&wc.cond)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_mutex_lock(&wc.mutex); r = uv_cond_timedwait(&wc.cond, &wc.mutex, (uint64_t)(150 * 1e6)); ASSERT(r == 0); uv_mutex_unlock(&wc.mutex); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_cond_destroy(&wc.cond); return 0; } TEST_IMPL(condvar_5) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); wc.use_broadcast = 1; ASSERT(0 == uv_cond_init(&wc.cond)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_mutex_lock(&wc.mutex); uv_sleep(100); uv_cond_wait(&wc.cond, &wc.mutex); ASSERT(wc.posted == 1); uv_mutex_unlock(&wc.mutex); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_cond_destroy(&wc.cond); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-connection-fail.c0000644000175000017500000001003712456307253022121 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_tcp_t tcp; static uv_connect_t req; static int connect_cb_calls; static int close_cb_calls; static uv_timer_t timer; static int timer_close_cb_calls; static int timer_cb_calls; static void on_close(uv_handle_t* handle) { close_cb_calls++; } static void timer_close_cb(uv_handle_t* handle) { timer_close_cb_calls++; } static void timer_cb(uv_timer_t* handle) { timer_cb_calls++; /* * These are the important asserts. The connection callback has been made, * but libuv hasn't automatically closed the socket. The user must * uv_close the handle manually. */ ASSERT(close_cb_calls == 0); ASSERT(connect_cb_calls == 1); /* Close the tcp handle. */ uv_close((uv_handle_t*)&tcp, on_close); /* Close the timer. */ uv_close((uv_handle_t*)handle, timer_close_cb); } static void on_connect_with_close(uv_connect_t *req, int status) { ASSERT((uv_stream_t*) &tcp == req->handle); ASSERT(status == UV_ECONNREFUSED); connect_cb_calls++; ASSERT(close_cb_calls == 0); uv_close((uv_handle_t*)req->handle, on_close); } static void on_connect_without_close(uv_connect_t *req, int status) { ASSERT(status == UV_ECONNREFUSED); connect_cb_calls++; uv_timer_start(&timer, timer_cb, 100, 0); ASSERT(close_cb_calls == 0); } static void connection_fail(uv_connect_cb connect_cb) { struct sockaddr_in client_addr, server_addr; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &client_addr)); /* There should be no servers listening on this port. */ ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); /* Try to connect to the server and do NUM_PINGS ping-pongs. */ r = uv_tcp_init(uv_default_loop(), &tcp); ASSERT(!r); /* We are never doing multiple reads/connects at a time anyway. */ /* so these handles can be pre-initialized. */ ASSERT(0 == uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr, 0)); r = uv_tcp_connect(&req, &tcp, (const struct sockaddr*) &server_addr, connect_cb); ASSERT(!r); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_calls == 1); ASSERT(close_cb_calls == 1); } /* * This test attempts to connect to a port where no server is running. We * expect an error. */ TEST_IMPL(connection_fail) { connection_fail(on_connect_with_close); ASSERT(timer_close_cb_calls == 0); ASSERT(timer_cb_calls == 0); MAKE_VALGRIND_HAPPY(); return 0; } /* * This test is the same as the first except it check that the close * callback of the tcp handle hasn't been made after the failed connection * attempt. */ TEST_IMPL(connection_fail_doesnt_auto_close) { int r; r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); connection_fail(on_connect_without_close); ASSERT(timer_close_cb_calls == 1); ASSERT(timer_cb_calls == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-cwd-and-chdir.c0000644000175000017500000000376012456307253021462 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #define PATHMAX 1024 extern char executable_path[]; TEST_IMPL(cwd_and_chdir) { char buffer_orig[PATHMAX]; char buffer_new[PATHMAX]; size_t size; char* last_slash; int err; size = sizeof(buffer_orig); err = uv_cwd(buffer_orig, &size); ASSERT(err == 0); /* Remove trailing slash unless at a root directory. */ #ifdef _WIN32 last_slash = strrchr(buffer_orig, '\\'); ASSERT(last_slash); if (last_slash > buffer_orig && *(last_slash - 1) != ':') { *last_slash = '\0'; } #else /* Unix */ last_slash = strrchr(buffer_orig, '/'); ASSERT(last_slash); if (last_slash != buffer_orig) { *last_slash = '\0'; } #endif err = uv_chdir(buffer_orig); ASSERT(err == 0); err = uv_cwd(buffer_new, &size); ASSERT(err == 0); ASSERT(strcmp(buffer_orig, buffer_new) == 0); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-default-loop-close.c0000644000175000017500000000372712502366750022556 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int timer_cb_called; static void timer_cb(uv_timer_t* timer) { timer_cb_called++; uv_close((uv_handle_t*) timer, NULL); } TEST_IMPL(default_loop_close) { uv_loop_t* loop; uv_timer_t timer_handle; loop = uv_default_loop(); ASSERT(loop != NULL); ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(1 == timer_cb_called); ASSERT(0 == uv_loop_close(loop)); loop = uv_default_loop(); ASSERT(loop != NULL); ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(2 == timer_cb_called); ASSERT(0 == uv_loop_close(loop)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-delayed-accept.c0000644000175000017500000001136412456307253021721 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int connection_cb_called = 0; static int do_accept_called = 0; static int close_cb_called = 0; static int connect_cb_called = 0; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = malloc(size); buf->len = size; } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); free(handle); close_cb_called++; } static void do_accept(uv_timer_t* timer_handle) { uv_tcp_t* server; uv_tcp_t* accepted_handle = (uv_tcp_t*)malloc(sizeof *accepted_handle); int r; ASSERT(timer_handle != NULL); ASSERT(accepted_handle != NULL); r = uv_tcp_init(uv_default_loop(), accepted_handle); ASSERT(r == 0); server = (uv_tcp_t*)timer_handle->data; r = uv_accept((uv_stream_t*)server, (uv_stream_t*)accepted_handle); ASSERT(r == 0); do_accept_called++; /* Immediately close the accepted handle. */ uv_close((uv_handle_t*)accepted_handle, close_cb); /* After accepting the two clients close the server handle */ if (do_accept_called == 2) { uv_close((uv_handle_t*)server, close_cb); } /* Dispose the timer. */ uv_close((uv_handle_t*)timer_handle, close_cb); } static void connection_cb(uv_stream_t* tcp, int status) { int r; uv_timer_t* timer_handle; ASSERT(status == 0); timer_handle = (uv_timer_t*)malloc(sizeof *timer_handle); ASSERT(timer_handle != NULL); /* Accept the client after 1 second */ r = uv_timer_init(uv_default_loop(), timer_handle); ASSERT(r == 0); timer_handle->data = tcp; r = uv_timer_start(timer_handle, do_accept, 1000, 0); ASSERT(r == 0); connection_cb_called++; } static void start_server(void) { struct sockaddr_in addr; uv_tcp_t* server = (uv_tcp_t*)malloc(sizeof *server); int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); ASSERT(server != NULL); r = uv_tcp_init(uv_default_loop(), server); ASSERT(r == 0); r = uv_tcp_bind(server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)server, 128, connection_cb); ASSERT(r == 0); } static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { /* The server will not send anything, it should close gracefully. */ if (buf->base) { free(buf->base); } if (nread >= 0) { ASSERT(nread == 0); } else { ASSERT(tcp != NULL); ASSERT(nread == UV_EOF); uv_close((uv_handle_t*)tcp, close_cb); } } static void connect_cb(uv_connect_t* req, int status) { int r; ASSERT(req != NULL); ASSERT(status == 0); /* Not that the server will send anything, but otherwise we'll never know */ /* when the server closes the connection. */ r = uv_read_start((uv_stream_t*)(req->handle), alloc_cb, read_cb); ASSERT(r == 0); connect_cb_called++; free(req); } static void client_connect(void) { struct sockaddr_in addr; uv_tcp_t* client = (uv_tcp_t*)malloc(sizeof *client); uv_connect_t* connect_req = malloc(sizeof *connect_req); int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(client != NULL); ASSERT(connect_req != NULL); r = uv_tcp_init(uv_default_loop(), client); ASSERT(r == 0); r = uv_tcp_connect(connect_req, client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); } TEST_IMPL(delayed_accept) { start_server(); client_connect(); client_connect(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connection_cb_called == 2); ASSERT(do_accept_called == 2); ASSERT(connect_cb_called == 2); ASSERT(close_cb_called == 7); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-dlerror.c0000644000175000017500000000361712456307253020530 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include TEST_IMPL(dlerror) { const char* path = "test/fixtures/load_error.node"; const char* msg; uv_lib_t lib; int r; #ifdef __linux__ const char* dlerror_desc = "file too short"; #elif defined (__sun__) const char* dlerror_desc = "unknown file type"; #elif defined (_WIN32) const char* dlerror_desc = "%1 is not a valid Win32 application"; #else const char* dlerror_desc = ""; #endif r = uv_dlopen(path, &lib); ASSERT(r == -1); msg = uv_dlerror(&lib); ASSERT(msg != NULL); ASSERT(strstr(msg, dlerror_desc) != NULL); /* Should return the same error twice in a row. */ msg = uv_dlerror(&lib); ASSERT(msg != NULL); ASSERT(strstr(msg, dlerror_desc) != NULL); uv_dlclose(&lib); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-embed.c0000644000175000017500000000723012456307253020126 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #ifndef HAVE_KQUEUE # if defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # define HAVE_KQUEUE 1 # endif #endif #ifndef HAVE_EPOLL # if defined(__linux__) # define HAVE_EPOLL 1 # endif #endif #if defined(HAVE_KQUEUE) || defined(HAVE_EPOLL) #if defined(HAVE_KQUEUE) # include # include # include #endif #if defined(HAVE_EPOLL) # include #endif static uv_thread_t embed_thread; static uv_sem_t embed_sem; static uv_timer_t embed_timer; static uv_async_t embed_async; static volatile int embed_closed; static int embed_timer_called; static void embed_thread_runner(void* arg) { int r; int fd; int timeout; while (!embed_closed) { fd = uv_backend_fd(uv_default_loop()); timeout = uv_backend_timeout(uv_default_loop()); do { #if defined(HAVE_KQUEUE) struct timespec ts; ts.tv_sec = timeout / 1000; ts.tv_nsec = (timeout % 1000) * 1000000; r = kevent(fd, NULL, 0, NULL, 0, &ts); #elif defined(HAVE_EPOLL) { struct epoll_event ev; r = epoll_wait(fd, &ev, 1, timeout); } #endif } while (r == -1 && errno == EINTR); uv_async_send(&embed_async); uv_sem_wait(&embed_sem); } } static void embed_cb(uv_async_t* async) { uv_run(uv_default_loop(), UV_RUN_ONCE); uv_sem_post(&embed_sem); } static void embed_timer_cb(uv_timer_t* timer) { embed_timer_called++; embed_closed = 1; uv_close((uv_handle_t*) &embed_async, NULL); } #endif TEST_IMPL(embed) { #if defined(HAVE_KQUEUE) || defined(HAVE_EPOLL) uv_loop_t external; ASSERT(0 == uv_loop_init(&external)); embed_timer_called = 0; embed_closed = 0; uv_async_init(&external, &embed_async, embed_cb); /* Start timer in default loop */ uv_timer_init(uv_default_loop(), &embed_timer); uv_timer_start(&embed_timer, embed_timer_cb, 250, 0); /* Start worker that will interrupt external loop */ uv_sem_init(&embed_sem, 0); uv_thread_create(&embed_thread, embed_thread_runner, NULL); /* But run external loop */ uv_run(&external, UV_RUN_DEFAULT); uv_thread_join(&embed_thread); uv_loop_close(&external); ASSERT(embed_timer_called == 1); #endif return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-emfile.c0000644000175000017500000000720312456307253020313 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #if !defined(_WIN32) #include "uv.h" #include "task.h" #include #include #include #include static void connection_cb(uv_stream_t* server_handle, int status); static void connect_cb(uv_connect_t* req, int status); static const int maxfd = 31; static unsigned connect_cb_called; static uv_tcp_t server_handle; static uv_tcp_t client_handle; TEST_IMPL(emfile) { struct sockaddr_in addr; struct rlimit limits; uv_connect_t connect_req; uv_loop_t* loop; int first_fd; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(loop, &server_handle)); ASSERT(0 == uv_tcp_init(loop, &client_handle)); ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 8, connection_cb)); /* Lower the file descriptor limit and use up all fds save one. */ limits.rlim_cur = limits.rlim_max = maxfd + 1; if (setrlimit(RLIMIT_NOFILE, &limits)) { perror("setrlimit(RLIMIT_NOFILE)"); ASSERT(0); } /* Remember the first one so we can clean up afterwards. */ do first_fd = dup(0); while (first_fd == -1 && errno == EINTR); ASSERT(first_fd > 0); while (dup(0) != -1 || errno == EINTR); ASSERT(errno == EMFILE); close(maxfd); /* Now connect and use up the last available file descriptor. The EMFILE * handling logic in src/unix/stream.c should ensure that connect_cb() runs * whereas connection_cb() should *not* run. */ ASSERT(0 == uv_tcp_connect(&connect_req, &client_handle, (const struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(1 == connect_cb_called); /* Close the dups again. Ignore errors in the unlikely event that the * file descriptors were not contiguous. */ while (first_fd < maxfd) { close(first_fd); first_fd += 1; } MAKE_VALGRIND_HAPPY(); return 0; } static void connection_cb(uv_stream_t* server_handle, int status) { ASSERT(0 && "connection_cb should not be called."); } static void connect_cb(uv_connect_t* req, int status) { /* |status| should equal 0 because the connection should have been accepted, * it's just that the server immediately closes it again. */ ASSERT(0 == status); connect_cb_called += 1; uv_close((uv_handle_t*) &server_handle, NULL); uv_close((uv_handle_t*) &client_handle, NULL); } #endif /* !defined(_WIN32) */ MoarVM-2015.11/3rdparty/libuv/test/test-error.c0000644000175000017500000000356312456307253020210 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include /* * Synthetic errors (errors that originate from within libuv, not the system) * should produce sensible error messages when run through uv_strerror(). * * See https://github.com/joyent/libuv/issues/210 */ TEST_IMPL(error_message) { /* Cop out. Can't do proper checks on systems with * i18n-ized error messages... */ if (strcmp(uv_strerror(0), "Success") != 0) { printf("i18n error messages detected, skipping test.\n"); return 0; } ASSERT(strstr(uv_strerror(UV_EINVAL), "Success") == NULL); ASSERT(strcmp(uv_strerror(1337), "Unknown error") == 0); ASSERT(strcmp(uv_strerror(-1337), "Unknown error") == 0); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-fail-always.c0000644000175000017500000000244412456307253021265 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" TEST_IMPL(fail_always) { /* This test always fails. It is used to test the test runner. */ FATAL("Yes, it always fails"); return 2; } MoarVM-2015.11/3rdparty/libuv/test/test-fs-event.c0000644000175000017500000004536312456307253020612 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #ifndef HAVE_KQUEUE # if defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) # define HAVE_KQUEUE 1 # endif #endif static uv_fs_event_t fs_event; static const char file_prefix[] = "fsevent-"; static uv_timer_t timer; static int timer_cb_called; static int close_cb_called; static const int fs_event_file_count = 128; static int fs_event_created; static int fs_event_cb_called; #if defined(PATH_MAX) static char fs_event_filename[PATH_MAX]; #else static char fs_event_filename[1024]; #endif /* defined(PATH_MAX) */ static int timer_cb_touch_called; static void fs_event_unlink_files(uv_timer_t* handle); static void create_dir(uv_loop_t* loop, const char* name) { int r; uv_fs_t req; r = uv_fs_mkdir(loop, &req, name, 0755, NULL); ASSERT(r == 0 || r == UV_EEXIST); uv_fs_req_cleanup(&req); } static void create_file(uv_loop_t* loop, const char* name) { int r; uv_file file; uv_fs_t req; r = uv_fs_open(loop, &req, name, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); file = r; uv_fs_req_cleanup(&req); r = uv_fs_close(loop, &req, file, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&req); } static void touch_file(uv_loop_t* loop, const char* name) { int r; uv_file file; uv_fs_t req; uv_buf_t buf; r = uv_fs_open(loop, &req, name, O_RDWR, 0, NULL); ASSERT(r >= 0); file = r; uv_fs_req_cleanup(&req); buf = uv_buf_init("foo", 4); r = uv_fs_write(loop, &req, file, &buf, 1, -1, NULL); ASSERT(r >= 0); uv_fs_req_cleanup(&req); r = uv_fs_close(loop, &req, file, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&req); } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void fail_cb(uv_fs_event_t* handle, const char* path, int events, int status) { ASSERT(0 && "fail_cb called"); } static void fs_event_cb_dir(uv_fs_event_t* handle, const char* filename, int events, int status) { ++fs_event_cb_called; ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_RENAME); ASSERT(filename == NULL || strcmp(filename, "file1") == 0); ASSERT(0 == uv_fs_event_stop(handle)); uv_close((uv_handle_t*)handle, close_cb); } static void fs_event_cb_dir_multi_file(uv_fs_event_t* handle, const char* filename, int events, int status) { fs_event_cb_called++; ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_RENAME); ASSERT(filename == NULL || strncmp(filename, file_prefix, sizeof(file_prefix) - 1) == 0); /* Stop watching dir when received events about all files: * both create and close events */ if (fs_event_cb_called == 2 * fs_event_file_count) { ASSERT(0 == uv_fs_event_stop(handle)); uv_close((uv_handle_t*) handle, close_cb); } } static const char* fs_event_get_filename(int i) { snprintf(fs_event_filename, sizeof(fs_event_filename), "watch_dir/%s%d", file_prefix, i); return fs_event_filename; } static void fs_event_create_files(uv_timer_t* handle) { int i; /* Already created all files */ if (fs_event_created == fs_event_file_count) { uv_close((uv_handle_t*) &timer, close_cb); return; } /* Create all files */ for (i = 0; i < 16; i++, fs_event_created++) create_file(handle->loop, fs_event_get_filename(i)); /* And unlink them */ ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files, 50, 0)); } void fs_event_unlink_files(uv_timer_t* handle) { int r; int i; /* NOTE: handle might be NULL if invoked not as timer callback */ /* Unlink all files */ for (i = 0; i < 16; i++) { r = remove(fs_event_get_filename(i)); if (handle != NULL) ASSERT(r == 0); } /* And create them again */ if (handle != NULL) ASSERT(0 == uv_timer_start(&timer, fs_event_create_files, 50, 0)); } static void fs_event_cb_file(uv_fs_event_t* handle, const char* filename, int events, int status) { ++fs_event_cb_called; ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_CHANGE); ASSERT(filename == NULL || strcmp(filename, "file2") == 0); ASSERT(0 == uv_fs_event_stop(handle)); uv_close((uv_handle_t*)handle, close_cb); } static void timer_cb_close_handle(uv_timer_t* timer) { uv_handle_t* handle; ASSERT(timer != NULL); handle = timer->data; uv_close((uv_handle_t*)timer, NULL); uv_close((uv_handle_t*)handle, close_cb); } static void fs_event_cb_file_current_dir(uv_fs_event_t* handle, const char* filename, int events, int status) { ASSERT(fs_event_cb_called == 0); ++fs_event_cb_called; ASSERT(handle == &fs_event); ASSERT(status == 0); ASSERT(events == UV_CHANGE); ASSERT(filename == NULL || strcmp(filename, "watch_file") == 0); /* Regression test for SunOS: touch should generate just one event. */ { static uv_timer_t timer; uv_timer_init(handle->loop, &timer); timer.data = handle; uv_timer_start(&timer, timer_cb_close_handle, 250, 0); } } static void timer_cb_file(uv_timer_t* handle) { ++timer_cb_called; if (timer_cb_called == 1) { touch_file(handle->loop, "watch_dir/file1"); } else { touch_file(handle->loop, "watch_dir/file2"); uv_close((uv_handle_t*)handle, close_cb); } } static void timer_cb_touch(uv_timer_t* timer) { uv_close((uv_handle_t*)timer, NULL); touch_file(timer->loop, "watch_file"); timer_cb_touch_called++; } static void timer_cb_watch_twice(uv_timer_t* handle) { uv_fs_event_t* handles = handle->data; uv_close((uv_handle_t*) (handles + 0), NULL); uv_close((uv_handle_t*) (handles + 1), NULL); uv_close((uv_handle_t*) handle, NULL); } TEST_IMPL(fs_event_watch_dir) { uv_loop_t* loop = uv_default_loop(); int r; /* Setup */ fs_event_unlink_files(NULL); remove("watch_dir/file2"); remove("watch_dir/file1"); remove("watch_dir/"); create_dir(loop, "watch_dir"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_dir_multi_file, "watch_dir", 0); ASSERT(r == 0); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, fs_event_create_files, 100, 0); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fs_event_cb_called == 2 * fs_event_file_count); ASSERT(fs_event_created == fs_event_file_count); ASSERT(close_cb_called == 2); /* Cleanup */ fs_event_unlink_files(NULL); remove("watch_dir/file2"); remove("watch_dir/file1"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_watch_file) { uv_loop_t* loop = uv_default_loop(); int r; /* Setup */ remove("watch_dir/file2"); remove("watch_dir/file1"); remove("watch_dir/"); create_dir(loop, "watch_dir"); create_file(loop, "watch_dir/file1"); create_file(loop, "watch_dir/file2"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_file, "watch_dir/file2", 0); ASSERT(r == 0); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb_file, 100, 100); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fs_event_cb_called == 1); ASSERT(timer_cb_called == 2); ASSERT(close_cb_called == 2); /* Cleanup */ remove("watch_dir/file2"); remove("watch_dir/file1"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_watch_file_twice) { const char path[] = "test/fixtures/empty_file"; uv_fs_event_t watchers[2]; uv_timer_t timer; uv_loop_t* loop; loop = uv_default_loop(); timer.data = watchers; ASSERT(0 == uv_fs_event_init(loop, watchers + 0)); ASSERT(0 == uv_fs_event_start(watchers + 0, fail_cb, path, 0)); ASSERT(0 == uv_fs_event_init(loop, watchers + 1)); ASSERT(0 == uv_fs_event_start(watchers + 1, fail_cb, path, 0)); ASSERT(0 == uv_timer_init(loop, &timer)); ASSERT(0 == uv_timer_start(&timer, timer_cb_watch_twice, 10, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_watch_file_current_dir) { uv_timer_t timer; uv_loop_t* loop; int r; loop = uv_default_loop(); /* Setup */ remove("watch_file"); create_file(loop, "watch_file"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_file_current_dir, "watch_file", 0); ASSERT(r == 0); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb_touch, 1, 0); ASSERT(r == 0); ASSERT(timer_cb_touch_called == 0); ASSERT(fs_event_cb_called == 0); ASSERT(close_cb_called == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(timer_cb_touch_called == 1); ASSERT(fs_event_cb_called == 1); ASSERT(close_cb_called == 1); /* Cleanup */ remove("watch_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_no_callback_after_close) { uv_loop_t* loop = uv_default_loop(); int r; /* Setup */ remove("watch_dir/file1"); remove("watch_dir/"); create_dir(loop, "watch_dir"); create_file(loop, "watch_dir/file1"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_file, "watch_dir/file1", 0); ASSERT(r == 0); uv_close((uv_handle_t*)&fs_event, close_cb); touch_file(loop, "watch_dir/file1"); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fs_event_cb_called == 0); ASSERT(close_cb_called == 1); /* Cleanup */ remove("watch_dir/file1"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_no_callback_on_close) { uv_loop_t* loop = uv_default_loop(); int r; /* Setup */ remove("watch_dir/file1"); remove("watch_dir/"); create_dir(loop, "watch_dir"); create_file(loop, "watch_dir/file1"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_file, "watch_dir/file1", 0); ASSERT(r == 0); uv_close((uv_handle_t*)&fs_event, close_cb); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fs_event_cb_called == 0); ASSERT(close_cb_called == 1); /* Cleanup */ remove("watch_dir/file1"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } static void fs_event_fail(uv_fs_event_t* handle, const char* filename, int events, int status) { ASSERT(0 && "should never be called"); } static void timer_cb(uv_timer_t* handle) { int r; r = uv_fs_event_init(handle->loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_fail, ".", 0); ASSERT(r == 0); uv_close((uv_handle_t*)&fs_event, close_cb); uv_close((uv_handle_t*)handle, close_cb); } TEST_IMPL(fs_event_immediate_close) { uv_timer_t timer; uv_loop_t* loop; int r; loop = uv_default_loop(); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 1, 0); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_close_with_pending_event) { uv_loop_t* loop; int r; loop = uv_default_loop(); create_dir(loop, "watch_dir"); create_file(loop, "watch_dir/file"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_fail, "watch_dir", 0); ASSERT(r == 0); /* Generate an fs event. */ touch_file(loop, "watch_dir/file"); uv_close((uv_handle_t*)&fs_event, close_cb); uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); /* Clean up */ remove("watch_dir/file"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } #if defined(HAVE_KQUEUE) /* kqueue doesn't register fs events if you don't have an active watcher. * The file descriptor needs to be part of the kqueue set of interest and * that's not the case until we actually enter the event loop. */ TEST_IMPL(fs_event_close_in_callback) { fprintf(stderr, "Skipping test, doesn't work with kqueue.\n"); return 0; } #else /* !HAVE_KQUEUE */ static void fs_event_cb_close(uv_fs_event_t* handle, const char* filename, int events, int status) { ASSERT(status == 0); ASSERT(fs_event_cb_called < 3); ++fs_event_cb_called; if (fs_event_cb_called == 3) { uv_close((uv_handle_t*) handle, close_cb); } } TEST_IMPL(fs_event_close_in_callback) { uv_loop_t* loop; int r; loop = uv_default_loop(); create_dir(loop, "watch_dir"); create_file(loop, "watch_dir/file1"); create_file(loop, "watch_dir/file2"); create_file(loop, "watch_dir/file3"); create_file(loop, "watch_dir/file4"); create_file(loop, "watch_dir/file5"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_close, "watch_dir", 0); ASSERT(r == 0); /* Generate a couple of fs events. */ touch_file(loop, "watch_dir/file1"); touch_file(loop, "watch_dir/file2"); touch_file(loop, "watch_dir/file3"); touch_file(loop, "watch_dir/file4"); touch_file(loop, "watch_dir/file5"); uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); ASSERT(fs_event_cb_called == 3); /* Clean up */ remove("watch_dir/file1"); remove("watch_dir/file2"); remove("watch_dir/file3"); remove("watch_dir/file4"); remove("watch_dir/file5"); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* HAVE_KQUEUE */ TEST_IMPL(fs_event_start_and_close) { uv_loop_t* loop; uv_fs_event_t fs_event1; uv_fs_event_t fs_event2; int r; loop = uv_default_loop(); create_dir(loop, "watch_dir"); r = uv_fs_event_init(loop, &fs_event1); ASSERT(r == 0); r = uv_fs_event_start(&fs_event1, fs_event_cb_dir, "watch_dir", 0); ASSERT(r == 0); r = uv_fs_event_init(loop, &fs_event2); ASSERT(r == 0); r = uv_fs_event_start(&fs_event2, fs_event_cb_dir, "watch_dir", 0); ASSERT(r == 0); uv_close((uv_handle_t*) &fs_event2, close_cb); uv_close((uv_handle_t*) &fs_event1, close_cb); uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_getpath) { uv_loop_t* loop = uv_default_loop(); int r; char buf[1024]; size_t len; create_dir(loop, "watch_dir"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); len = sizeof buf; r = uv_fs_event_getpath(&fs_event, buf, &len); ASSERT(r == UV_EINVAL); r = uv_fs_event_start(&fs_event, fail_cb, "watch_dir", 0); ASSERT(r == 0); len = sizeof buf; r = uv_fs_event_getpath(&fs_event, buf, &len); ASSERT(r == 0); ASSERT(memcmp(buf, "watch_dir", len) == 0); r = uv_fs_event_stop(&fs_event); ASSERT(r == 0); uv_close((uv_handle_t*) &fs_event, close_cb); uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } #if defined(__APPLE__) static int fs_event_error_reported; static void fs_event_error_report_cb(uv_fs_event_t* handle, const char* filename, int events, int status) { if (status != 0) fs_event_error_reported = status; } static void timer_cb_nop(uv_timer_t* handle) { ++timer_cb_called; uv_close((uv_handle_t*) handle, close_cb); } static void fs_event_error_report_close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; /* handle is allocated on-stack, no need to free it */ } TEST_IMPL(fs_event_error_reporting) { unsigned int i; uv_loop_t loops[1024]; uv_fs_event_t events[ARRAY_SIZE(loops)]; uv_loop_t* loop; uv_fs_event_t* event; TEST_FILE_LIMIT(ARRAY_SIZE(loops) * 3); remove("watch_dir/"); create_dir(uv_default_loop(), "watch_dir"); /* Create a lot of loops, and start FSEventStream in each of them. * Eventually, this should create enough streams to make FSEventStreamStart() * fail. */ for (i = 0; i < ARRAY_SIZE(loops); i++) { loop = &loops[i]; ASSERT(0 == uv_loop_init(loop)); event = &events[i]; timer_cb_called = 0; close_cb_called = 0; ASSERT(0 == uv_fs_event_init(loop, event)); ASSERT(0 == uv_fs_event_start(event, fs_event_error_report_cb, "watch_dir", 0)); uv_unref((uv_handle_t*) event); /* Let loop run for some time */ ASSERT(0 == uv_timer_init(loop, &timer)); ASSERT(0 == uv_timer_start(&timer, timer_cb_nop, 2, 0)); uv_run(loop, UV_RUN_DEFAULT); ASSERT(1 == timer_cb_called); ASSERT(1 == close_cb_called); if (fs_event_error_reported != 0) break; } /* At least one loop should fail */ ASSERT(fs_event_error_reported == UV_EMFILE); /* Stop and close all events, and destroy loops */ do { loop = &loops[i]; event = &events[i]; ASSERT(0 == uv_fs_event_stop(event)); uv_ref((uv_handle_t*) event); uv_close((uv_handle_t*) event, fs_event_error_report_close_cb); close_cb_called = 0; uv_run(loop, UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); uv_loop_close(loop); } while (i-- != 0); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } #else /* !defined(__APPLE__) */ TEST_IMPL(fs_event_error_reporting) { /* No-op, needed only for FSEvents backend */ MAKE_VALGRIND_HAPPY(); return 0; } #endif /* defined(__APPLE__) */ MoarVM-2015.11/3rdparty/libuv/test/test-fs-poll.c0000644000175000017500000001205012456307253020422 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #define FIXTURE "testfile" static void timer_cb(uv_timer_t* handle); static void close_cb(uv_handle_t* handle); static void poll_cb(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr); static void poll_cb_fail(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr); static uv_fs_poll_t poll_handle; static uv_timer_t timer_handle; static uv_loop_t* loop; static int poll_cb_called; static int timer_cb_called; static int close_cb_called; static void touch_file(const char* path) { static int count; FILE* fp; int i; ASSERT((fp = fopen(FIXTURE, "w+"))); /* Need to change the file size because the poller may not pick up * sub-second mtime changes. */ i = ++count; while (i--) fputc('*', fp); fclose(fp); } static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void timer_cb(uv_timer_t* handle) { touch_file(FIXTURE); timer_cb_called++; } static void poll_cb_fail(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr) { ASSERT(0 && "fail_cb called"); } static void poll_cb(uv_fs_poll_t* handle, int status, const uv_stat_t* prev, const uv_stat_t* curr) { uv_stat_t zero_statbuf; memset(&zero_statbuf, 0, sizeof(zero_statbuf)); ASSERT(handle == &poll_handle); ASSERT(1 == uv_is_active((uv_handle_t*) handle)); ASSERT(prev != NULL); ASSERT(curr != NULL); switch (poll_cb_called++) { case 0: ASSERT(status == UV_ENOENT); ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf))); touch_file(FIXTURE); break; case 1: ASSERT(status == 0); ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 20, 0)); break; case 2: ASSERT(status == 0); ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 200, 0)); break; case 3: ASSERT(status == 0); ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf))); remove(FIXTURE); break; case 4: ASSERT(status == UV_ENOENT); ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf))); ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf))); uv_close((uv_handle_t*)handle, close_cb); break; default: ASSERT(0); } } TEST_IMPL(fs_poll) { loop = uv_default_loop(); remove(FIXTURE); ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_fs_poll_init(loop, &poll_handle)); ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb, FIXTURE, 100)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(poll_cb_called == 5); ASSERT(timer_cb_called == 2); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_poll_getpath) { char buf[1024]; size_t len; loop = uv_default_loop(); remove(FIXTURE); ASSERT(0 == uv_fs_poll_init(loop, &poll_handle)); len = sizeof buf; ASSERT(UV_EINVAL == uv_fs_poll_getpath(&poll_handle, buf, &len)); ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100)); len = sizeof buf; ASSERT(0 == uv_fs_poll_getpath(&poll_handle, buf, &len)); ASSERT(0 == memcmp(buf, FIXTURE, len)); uv_close((uv_handle_t*) &poll_handle, close_cb); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-fs.c0000644000175000017500000015317612502366750017474 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* memset */ #include #include /* FIXME we shouldn't need to branch in this file */ #if defined(__unix__) || defined(__POSIX__) || \ defined(__APPLE__) || defined(_AIX) #include /* unlink, rmdir, etc. */ #else # include # include # define unlink _unlink # define rmdir _rmdir # define open _open # define write _write # define close _close # ifndef stat # define stat _stati64 # endif # ifndef lseek # define lseek _lseek # endif #endif #define TOO_LONG_NAME_LENGTH 65536 #define PATHMAX 1024 typedef struct { const char* path; double atime; double mtime; } utime_check_t; static int dummy_cb_count; static int close_cb_count; static int create_cb_count; static int open_cb_count; static int read_cb_count; static int write_cb_count; static int unlink_cb_count; static int mkdir_cb_count; static int mkdtemp_cb_count; static int rmdir_cb_count; static int scandir_cb_count; static int stat_cb_count; static int rename_cb_count; static int fsync_cb_count; static int fdatasync_cb_count; static int ftruncate_cb_count; static int sendfile_cb_count; static int fstat_cb_count; static int access_cb_count; static int chmod_cb_count; static int fchmod_cb_count; static int chown_cb_count; static int fchown_cb_count; static int link_cb_count; static int symlink_cb_count; static int readlink_cb_count; static int utime_cb_count; static int futime_cb_count; static uv_loop_t* loop; static uv_fs_t open_req1; static uv_fs_t open_req2; static uv_fs_t read_req; static uv_fs_t write_req; static uv_fs_t unlink_req; static uv_fs_t close_req; static uv_fs_t mkdir_req; static uv_fs_t mkdtemp_req1; static uv_fs_t mkdtemp_req2; static uv_fs_t rmdir_req; static uv_fs_t scandir_req; static uv_fs_t stat_req; static uv_fs_t rename_req; static uv_fs_t fsync_req; static uv_fs_t fdatasync_req; static uv_fs_t ftruncate_req; static uv_fs_t sendfile_req; static uv_fs_t utime_req; static uv_fs_t futime_req; static char buf[32]; static char buf2[32]; static char test_buf[] = "test-buffer\n"; static char test_buf2[] = "second-buffer\n"; static uv_buf_t iov; static void check_permission(const char* filename, unsigned int mode) { int r; uv_fs_t req; uv_stat_t* s; r = uv_fs_stat(uv_default_loop(), &req, filename, NULL); ASSERT(r == 0); ASSERT(req.result == 0); s = &req.statbuf; #ifdef _WIN32 /* * On Windows, chmod can only modify S_IWUSR (_S_IWRITE) bit, * so only testing for the specified flags. */ ASSERT((s->st_mode & 0777) & mode); #else ASSERT((s->st_mode & 0777) == mode); #endif uv_fs_req_cleanup(&req); } static void dummy_cb(uv_fs_t* req) { (void) req; dummy_cb_count++; } static void link_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_LINK); ASSERT(req->result == 0); link_cb_count++; uv_fs_req_cleanup(req); } static void symlink_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_SYMLINK); ASSERT(req->result == 0); symlink_cb_count++; uv_fs_req_cleanup(req); } static void readlink_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_READLINK); ASSERT(req->result == 0); ASSERT(strcmp(req->ptr, "test_file_symlink2") == 0); readlink_cb_count++; uv_fs_req_cleanup(req); } static void access_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_ACCESS); access_cb_count++; uv_fs_req_cleanup(req); } static void fchmod_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_FCHMOD); ASSERT(req->result == 0); fchmod_cb_count++; uv_fs_req_cleanup(req); check_permission("test_file", *(int*)req->data); } static void chmod_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_CHMOD); ASSERT(req->result == 0); chmod_cb_count++; uv_fs_req_cleanup(req); check_permission("test_file", *(int*)req->data); } static void fchown_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_FCHOWN); ASSERT(req->result == 0); fchown_cb_count++; uv_fs_req_cleanup(req); } static void chown_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_CHOWN); ASSERT(req->result == 0); chown_cb_count++; uv_fs_req_cleanup(req); } static void chown_root_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_CHOWN); #ifdef _WIN32 /* On windows, chown is a no-op and always succeeds. */ ASSERT(req->result == 0); #else /* On unix, chown'ing the root directory is not allowed - * unless you're root, of course. */ if (geteuid() == 0) ASSERT(req->result == 0); else ASSERT(req->result == UV_EPERM); #endif chown_cb_count++; uv_fs_req_cleanup(req); } static void unlink_cb(uv_fs_t* req) { ASSERT(req == &unlink_req); ASSERT(req->fs_type == UV_FS_UNLINK); ASSERT(req->result == 0); unlink_cb_count++; uv_fs_req_cleanup(req); } static void fstat_cb(uv_fs_t* req) { uv_stat_t* s = req->ptr; ASSERT(req->fs_type == UV_FS_FSTAT); ASSERT(req->result == 0); ASSERT(s->st_size == sizeof(test_buf)); uv_fs_req_cleanup(req); fstat_cb_count++; } static void close_cb(uv_fs_t* req) { int r; ASSERT(req == &close_req); ASSERT(req->fs_type == UV_FS_CLOSE); ASSERT(req->result == 0); close_cb_count++; uv_fs_req_cleanup(req); if (close_cb_count == 3) { r = uv_fs_unlink(loop, &unlink_req, "test_file2", unlink_cb); ASSERT(r == 0); } } static void ftruncate_cb(uv_fs_t* req) { int r; ASSERT(req == &ftruncate_req); ASSERT(req->fs_type == UV_FS_FTRUNCATE); ASSERT(req->result == 0); ftruncate_cb_count++; uv_fs_req_cleanup(req); r = uv_fs_close(loop, &close_req, open_req1.result, close_cb); ASSERT(r == 0); } static void read_cb(uv_fs_t* req) { int r; ASSERT(req == &read_req); ASSERT(req->fs_type == UV_FS_READ); ASSERT(req->result >= 0); /* FIXME(bnoordhuis) Check if requested size? */ read_cb_count++; uv_fs_req_cleanup(req); if (read_cb_count == 1) { ASSERT(strcmp(buf, test_buf) == 0); r = uv_fs_ftruncate(loop, &ftruncate_req, open_req1.result, 7, ftruncate_cb); } else { ASSERT(strcmp(buf, "test-bu") == 0); r = uv_fs_close(loop, &close_req, open_req1.result, close_cb); } ASSERT(r == 0); } static void open_cb(uv_fs_t* req) { int r; ASSERT(req == &open_req1); ASSERT(req->fs_type == UV_FS_OPEN); if (req->result < 0) { fprintf(stderr, "async open error: %d\n", (int) req->result); ASSERT(0); } open_cb_count++; ASSERT(req->path); ASSERT(memcmp(req->path, "test_file2\0", 11) == 0); uv_fs_req_cleanup(req); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, read_cb); ASSERT(r == 0); } static void open_cb_simple(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_OPEN); if (req->result < 0) { fprintf(stderr, "async open error: %d\n", (int) req->result); ASSERT(0); } open_cb_count++; ASSERT(req->path); uv_fs_req_cleanup(req); } static void fsync_cb(uv_fs_t* req) { int r; ASSERT(req == &fsync_req); ASSERT(req->fs_type == UV_FS_FSYNC); ASSERT(req->result == 0); fsync_cb_count++; uv_fs_req_cleanup(req); r = uv_fs_close(loop, &close_req, open_req1.result, close_cb); ASSERT(r == 0); } static void fdatasync_cb(uv_fs_t* req) { int r; ASSERT(req == &fdatasync_req); ASSERT(req->fs_type == UV_FS_FDATASYNC); ASSERT(req->result == 0); fdatasync_cb_count++; uv_fs_req_cleanup(req); r = uv_fs_fsync(loop, &fsync_req, open_req1.result, fsync_cb); ASSERT(r == 0); } static void write_cb(uv_fs_t* req) { int r; ASSERT(req == &write_req); ASSERT(req->fs_type == UV_FS_WRITE); ASSERT(req->result >= 0); /* FIXME(bnoordhuis) Check if requested size? */ write_cb_count++; uv_fs_req_cleanup(req); r = uv_fs_fdatasync(loop, &fdatasync_req, open_req1.result, fdatasync_cb); ASSERT(r == 0); } static void create_cb(uv_fs_t* req) { int r; ASSERT(req == &open_req1); ASSERT(req->fs_type == UV_FS_OPEN); ASSERT(req->result >= 0); create_cb_count++; uv_fs_req_cleanup(req); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, req->result, &iov, 1, -1, write_cb); ASSERT(r == 0); } static void rename_cb(uv_fs_t* req) { ASSERT(req == &rename_req); ASSERT(req->fs_type == UV_FS_RENAME); ASSERT(req->result == 0); rename_cb_count++; uv_fs_req_cleanup(req); } static void mkdir_cb(uv_fs_t* req) { ASSERT(req == &mkdir_req); ASSERT(req->fs_type == UV_FS_MKDIR); ASSERT(req->result == 0); mkdir_cb_count++; ASSERT(req->path); ASSERT(memcmp(req->path, "test_dir\0", 9) == 0); uv_fs_req_cleanup(req); } static void check_mkdtemp_result(uv_fs_t* req) { int r; ASSERT(req->fs_type == UV_FS_MKDTEMP); ASSERT(req->result == 0); ASSERT(req->path); ASSERT(strlen(req->path) == 15); ASSERT(memcmp(req->path, "test_dir_", 9) == 0); ASSERT(memcmp(req->path + 9, "XXXXXX", 6) != 0); check_permission(req->path, 0700); /* Check if req->path is actually a directory */ r = uv_fs_stat(uv_default_loop(), &stat_req, req->path, NULL); ASSERT(r == 0); ASSERT(((uv_stat_t*)stat_req.ptr)->st_mode & S_IFDIR); uv_fs_req_cleanup(&stat_req); } static void mkdtemp_cb(uv_fs_t* req) { ASSERT(req == &mkdtemp_req1); check_mkdtemp_result(req); mkdtemp_cb_count++; } static void rmdir_cb(uv_fs_t* req) { ASSERT(req == &rmdir_req); ASSERT(req->fs_type == UV_FS_RMDIR); ASSERT(req->result == 0); rmdir_cb_count++; ASSERT(req->path); ASSERT(memcmp(req->path, "test_dir\0", 9) == 0); uv_fs_req_cleanup(req); } static void scandir_cb(uv_fs_t* req) { uv_dirent_t dent; ASSERT(req == &scandir_req); ASSERT(req->fs_type == UV_FS_SCANDIR); ASSERT(req->result == 2); ASSERT(req->ptr); while (UV_EOF != uv_fs_scandir_next(req, &dent)) { ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); } scandir_cb_count++; ASSERT(req->path); ASSERT(memcmp(req->path, "test_dir\0", 9) == 0); uv_fs_req_cleanup(req); ASSERT(!req->ptr); } static void empty_scandir_cb(uv_fs_t* req) { uv_dirent_t dent; ASSERT(req == &scandir_req); ASSERT(req->fs_type == UV_FS_SCANDIR); ASSERT(req->result == 0); ASSERT(req->ptr == NULL); ASSERT(UV_EOF == uv_fs_scandir_next(req, &dent)); uv_fs_req_cleanup(req); scandir_cb_count++; } static void file_scandir_cb(uv_fs_t* req) { ASSERT(req == &scandir_req); ASSERT(req->fs_type == UV_FS_SCANDIR); ASSERT(req->result == UV_ENOTDIR); ASSERT(req->ptr == NULL); uv_fs_req_cleanup(req); scandir_cb_count++; } static void stat_cb(uv_fs_t* req) { ASSERT(req == &stat_req); ASSERT(req->fs_type == UV_FS_STAT || req->fs_type == UV_FS_LSTAT); ASSERT(req->result == 0); ASSERT(req->ptr); stat_cb_count++; uv_fs_req_cleanup(req); ASSERT(!req->ptr); } static void sendfile_cb(uv_fs_t* req) { ASSERT(req == &sendfile_req); ASSERT(req->fs_type == UV_FS_SENDFILE); ASSERT(req->result == 65546); sendfile_cb_count++; uv_fs_req_cleanup(req); } static void open_noent_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_OPEN); ASSERT(req->result == UV_ENOENT); open_cb_count++; uv_fs_req_cleanup(req); } static void open_nametoolong_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_OPEN); ASSERT(req->result == UV_ENAMETOOLONG); open_cb_count++; uv_fs_req_cleanup(req); } static void open_loop_cb(uv_fs_t* req) { ASSERT(req->fs_type == UV_FS_OPEN); ASSERT(req->result == UV_ELOOP); open_cb_count++; uv_fs_req_cleanup(req); } TEST_IMPL(fs_file_noent) { uv_fs_t req; int r; loop = uv_default_loop(); r = uv_fs_open(loop, &req, "does_not_exist", O_RDONLY, 0, NULL); ASSERT(r == UV_ENOENT); ASSERT(req.result == UV_ENOENT); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, "does_not_exist", O_RDONLY, 0, open_noent_cb); ASSERT(r == 0); ASSERT(open_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 1); /* TODO add EACCES test */ MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_file_nametoolong) { uv_fs_t req; int r; char name[TOO_LONG_NAME_LENGTH + 1]; loop = uv_default_loop(); memset(name, 'a', TOO_LONG_NAME_LENGTH); name[TOO_LONG_NAME_LENGTH] = 0; r = uv_fs_open(loop, &req, name, O_RDONLY, 0, NULL); ASSERT(r == UV_ENAMETOOLONG); ASSERT(req.result == UV_ENAMETOOLONG); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, name, O_RDONLY, 0, open_nametoolong_cb); ASSERT(r == 0); ASSERT(open_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_file_loop) { uv_fs_t req; int r; loop = uv_default_loop(); unlink("test_symlink"); uv_fs_symlink(loop, &req, "test_symlink", "test_symlink", 0, NULL); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, "test_symlink", O_RDONLY, 0, NULL); ASSERT(r == UV_ELOOP); ASSERT(req.result == UV_ELOOP); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, "test_symlink", O_RDONLY, 0, open_loop_cb); ASSERT(r == 0); ASSERT(open_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 1); unlink("test_symlink"); MAKE_VALGRIND_HAPPY(); return 0; } static void check_utime(const char* path, double atime, double mtime) { uv_stat_t* s; uv_fs_t req; int r; r = uv_fs_stat(loop, &req, path, NULL); ASSERT(r == 0); ASSERT(req.result == 0); s = &req.statbuf; ASSERT(s->st_atim.tv_sec == atime); ASSERT(s->st_mtim.tv_sec == mtime); uv_fs_req_cleanup(&req); } static void utime_cb(uv_fs_t* req) { utime_check_t* c; ASSERT(req == &utime_req); ASSERT(req->result == 0); ASSERT(req->fs_type == UV_FS_UTIME); c = req->data; check_utime(c->path, c->atime, c->mtime); uv_fs_req_cleanup(req); utime_cb_count++; } static void futime_cb(uv_fs_t* req) { utime_check_t* c; ASSERT(req == &futime_req); ASSERT(req->result == 0); ASSERT(req->fs_type == UV_FS_FUTIME); c = req->data; check_utime(c->path, c->atime, c->mtime); uv_fs_req_cleanup(req); futime_cb_count++; } TEST_IMPL(fs_file_async) { int r; /* Setup. */ unlink("test_file"); unlink("test_file2"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR, create_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(create_cb_count == 1); ASSERT(write_cb_count == 1); ASSERT(fsync_cb_count == 1); ASSERT(fdatasync_cb_count == 1); ASSERT(close_cb_count == 1); r = uv_fs_rename(loop, &rename_req, "test_file", "test_file2", rename_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(create_cb_count == 1); ASSERT(write_cb_count == 1); ASSERT(close_cb_count == 1); ASSERT(rename_cb_count == 1); r = uv_fs_open(loop, &open_req1, "test_file2", O_RDWR, 0, open_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 1); ASSERT(read_cb_count == 1); ASSERT(close_cb_count == 2); ASSERT(rename_cb_count == 1); ASSERT(create_cb_count == 1); ASSERT(write_cb_count == 1); ASSERT(ftruncate_cb_count == 1); r = uv_fs_open(loop, &open_req1, "test_file2", O_RDONLY, 0, open_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 2); ASSERT(read_cb_count == 2); ASSERT(close_cb_count == 3); ASSERT(rename_cb_count == 1); ASSERT(unlink_cb_count == 1); ASSERT(create_cb_count == 1); ASSERT(write_cb_count == 1); ASSERT(ftruncate_cb_count == 1); /* Cleanup. */ unlink("test_file"); unlink("test_file2"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_file_sync) { int r; /* Setup. */ unlink("test_file"); unlink("test_file2"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(read_req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_ftruncate(loop, &ftruncate_req, open_req1.result, 7, NULL); ASSERT(r == 0); ASSERT(ftruncate_req.result == 0); uv_fs_req_cleanup(&ftruncate_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_rename(loop, &rename_req, "test_file", "test_file2", NULL); ASSERT(r == 0); ASSERT(rename_req.result == 0); uv_fs_req_cleanup(&rename_req); r = uv_fs_open(loop, &open_req1, "test_file2", O_RDONLY, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(read_req.result >= 0); ASSERT(strcmp(buf, "test-bu") == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_unlink(loop, &unlink_req, "test_file2", NULL); ASSERT(r == 0); ASSERT(unlink_req.result == 0); uv_fs_req_cleanup(&unlink_req); /* Cleanup */ unlink("test_file"); unlink("test_file2"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_file_write_null_buffer) { int r; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(NULL, 0); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r == 0); ASSERT(write_req.result == 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_async_dir) { int r; uv_dirent_t dent; /* Setup */ unlink("test_dir/file1"); unlink("test_dir/file2"); rmdir("test_dir"); loop = uv_default_loop(); r = uv_fs_mkdir(loop, &mkdir_req, "test_dir", 0755, mkdir_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(mkdir_cb_count == 1); /* Create 2 files synchronously. */ r = uv_fs_open(loop, &open_req1, "test_dir/file1", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_dir/file2", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_scandir(loop, &scandir_req, "test_dir", 0, scandir_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(scandir_cb_count == 1); /* sync uv_fs_scandir */ r = uv_fs_scandir(loop, &scandir_req, "test_dir", 0, NULL); ASSERT(r == 2); ASSERT(scandir_req.result == 2); ASSERT(scandir_req.ptr); while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) { ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); } uv_fs_req_cleanup(&scandir_req); ASSERT(!scandir_req.ptr); r = uv_fs_stat(loop, &stat_req, "test_dir", stat_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); r = uv_fs_stat(loop, &stat_req, "test_dir/", stat_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); r = uv_fs_lstat(loop, &stat_req, "test_dir", stat_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); r = uv_fs_lstat(loop, &stat_req, "test_dir/", stat_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(stat_cb_count == 4); r = uv_fs_unlink(loop, &unlink_req, "test_dir/file1", unlink_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(unlink_cb_count == 1); r = uv_fs_unlink(loop, &unlink_req, "test_dir/file2", unlink_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(unlink_cb_count == 2); r = uv_fs_rmdir(loop, &rmdir_req, "test_dir", rmdir_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(rmdir_cb_count == 1); /* Cleanup */ unlink("test_dir/file1"); unlink("test_dir/file2"); rmdir("test_dir"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_async_sendfile) { int f, r; struct stat s1, s2; loop = uv_default_loop(); /* Setup. */ unlink("test_file"); unlink("test_file2"); f = open("test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR); ASSERT(f != -1); r = write(f, "begin\n", 6); ASSERT(r == 6); r = lseek(f, 65536, SEEK_CUR); ASSERT(r == 65542); r = write(f, "end\n", 4); ASSERT(r != -1); r = close(f); ASSERT(r == 0); /* Test starts here. */ r = uv_fs_open(loop, &open_req1, "test_file", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_open(loop, &open_req2, "test_file2", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req2.result >= 0); uv_fs_req_cleanup(&open_req2); r = uv_fs_sendfile(loop, &sendfile_req, open_req2.result, open_req1.result, 0, 131072, sendfile_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(sendfile_cb_count == 1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_close(loop, &close_req, open_req2.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); stat("test_file", &s1); stat("test_file2", &s2); ASSERT(65546 == s2.st_size && s1.st_size == s2.st_size); /* Cleanup. */ unlink("test_file"); unlink("test_file2"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_mkdtemp) { int r; const char* path_template = "test_dir_XXXXXX"; loop = uv_default_loop(); r = uv_fs_mkdtemp(loop, &mkdtemp_req1, path_template, mkdtemp_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(mkdtemp_cb_count == 1); /* sync mkdtemp */ r = uv_fs_mkdtemp(loop, &mkdtemp_req2, path_template, NULL); ASSERT(r == 0); check_mkdtemp_result(&mkdtemp_req2); /* mkdtemp return different values on subsequent calls */ ASSERT(strcmp(mkdtemp_req1.path, mkdtemp_req2.path) != 0); /* Cleanup */ rmdir(mkdtemp_req1.path); rmdir(mkdtemp_req2.path); uv_fs_req_cleanup(&mkdtemp_req1); uv_fs_req_cleanup(&mkdtemp_req2); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_fstat) { int r; uv_fs_t req; uv_file file; uv_stat_t* s; #ifndef _WIN32 struct stat t; #endif /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &req, file, &iov, 1, -1, NULL); ASSERT(r == sizeof(test_buf)); ASSERT(req.result == sizeof(test_buf)); uv_fs_req_cleanup(&req); r = uv_fs_fstat(loop, &req, file, NULL); ASSERT(r == 0); ASSERT(req.result == 0); s = req.ptr; ASSERT(s->st_size == sizeof(test_buf)); #ifndef _WIN32 r = fstat(file, &t); ASSERT(r == 0); ASSERT(s->st_dev == (uint64_t) t.st_dev); ASSERT(s->st_mode == (uint64_t) t.st_mode); ASSERT(s->st_nlink == (uint64_t) t.st_nlink); ASSERT(s->st_uid == (uint64_t) t.st_uid); ASSERT(s->st_gid == (uint64_t) t.st_gid); ASSERT(s->st_rdev == (uint64_t) t.st_rdev); ASSERT(s->st_ino == (uint64_t) t.st_ino); ASSERT(s->st_size == (uint64_t) t.st_size); ASSERT(s->st_blksize == (uint64_t) t.st_blksize); ASSERT(s->st_blocks == (uint64_t) t.st_blocks); #if defined(__APPLE__) ASSERT(s->st_atim.tv_sec == t.st_atimespec.tv_sec); ASSERT(s->st_atim.tv_nsec == t.st_atimespec.tv_nsec); ASSERT(s->st_mtim.tv_sec == t.st_mtimespec.tv_sec); ASSERT(s->st_mtim.tv_nsec == t.st_mtimespec.tv_nsec); ASSERT(s->st_ctim.tv_sec == t.st_ctimespec.tv_sec); ASSERT(s->st_ctim.tv_nsec == t.st_ctimespec.tv_nsec); ASSERT(s->st_birthtim.tv_sec == t.st_birthtimespec.tv_sec); ASSERT(s->st_birthtim.tv_nsec == t.st_birthtimespec.tv_nsec); ASSERT(s->st_flags == t.st_flags); ASSERT(s->st_gen == t.st_gen); #elif defined(_AIX) ASSERT(s->st_atim.tv_sec == t.st_atime); ASSERT(s->st_atim.tv_nsec == 0); ASSERT(s->st_mtim.tv_sec == t.st_mtime); ASSERT(s->st_mtim.tv_nsec == 0); ASSERT(s->st_ctim.tv_sec == t.st_ctime); ASSERT(s->st_ctim.tv_nsec == 0); #elif defined(__sun) || \ defined(_BSD_SOURCE) || \ defined(_SVID_SOURCE) || \ defined(_XOPEN_SOURCE) ASSERT(s->st_atim.tv_sec == t.st_atim.tv_sec); ASSERT(s->st_atim.tv_nsec == t.st_atim.tv_nsec); ASSERT(s->st_mtim.tv_sec == t.st_mtim.tv_sec); ASSERT(s->st_mtim.tv_nsec == t.st_mtim.tv_nsec); ASSERT(s->st_ctim.tv_sec == t.st_ctim.tv_sec); ASSERT(s->st_ctim.tv_nsec == t.st_ctim.tv_nsec); # if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) ASSERT(s->st_birthtim.tv_sec == t.st_birthtim.tv_sec); ASSERT(s->st_birthtim.tv_nsec == t.st_birthtim.tv_nsec); ASSERT(s->st_flags == t.st_flags); ASSERT(s->st_gen == t.st_gen); # endif #else ASSERT(s->st_atim.tv_sec == t.st_atime); ASSERT(s->st_atim.tv_nsec == 0); ASSERT(s->st_mtim.tv_sec == t.st_mtime); ASSERT(s->st_mtim.tv_nsec == 0); ASSERT(s->st_ctim.tv_sec == t.st_ctime); ASSERT(s->st_ctim.tv_nsec == 0); #endif #endif uv_fs_req_cleanup(&req); /* Now do the uv_fs_fstat call asynchronously */ r = uv_fs_fstat(loop, &req, file, fstat_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fstat_cb_count == 1); r = uv_fs_close(loop, &req, file, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_access) { int r; uv_fs_t req; uv_file file; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); /* File should not exist */ r = uv_fs_access(loop, &req, "test_file", F_OK, NULL); ASSERT(r < 0); ASSERT(req.result < 0); uv_fs_req_cleanup(&req); /* File should not exist */ r = uv_fs_access(loop, &req, "test_file", F_OK, access_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(access_cb_count == 1); access_cb_count = 0; /* reset for the next test */ /* Create file */ r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); /* File should exist */ r = uv_fs_access(loop, &req, "test_file", F_OK, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); /* File should exist */ r = uv_fs_access(loop, &req, "test_file", F_OK, access_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(access_cb_count == 1); access_cb_count = 0; /* reset for the next test */ /* Close file */ r = uv_fs_close(loop, &req, file, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_chmod) { int r; uv_fs_t req; uv_file file; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &req, file, &iov, 1, -1, NULL); ASSERT(r == sizeof(test_buf)); ASSERT(req.result == sizeof(test_buf)); uv_fs_req_cleanup(&req); #ifndef _WIN32 /* Make the file write-only */ r = uv_fs_chmod(loop, &req, "test_file", 0200, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); check_permission("test_file", 0200); #endif /* Make the file read-only */ r = uv_fs_chmod(loop, &req, "test_file", 0400, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); check_permission("test_file", 0400); /* Make the file read+write with sync uv_fs_fchmod */ r = uv_fs_fchmod(loop, &req, file, 0600, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); check_permission("test_file", 0600); #ifndef _WIN32 /* async chmod */ { static int mode = 0200; req.data = &mode; } r = uv_fs_chmod(loop, &req, "test_file", 0200, chmod_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(chmod_cb_count == 1); chmod_cb_count = 0; /* reset for the next test */ #endif /* async chmod */ { static int mode = 0400; req.data = &mode; } r = uv_fs_chmod(loop, &req, "test_file", 0400, chmod_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(chmod_cb_count == 1); /* async fchmod */ { static int mode = 0600; req.data = &mode; } r = uv_fs_fchmod(loop, &req, file, 0600, fchmod_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fchmod_cb_count == 1); close(file); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_chown) { int r; uv_fs_t req; uv_file file; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); /* sync chown */ r = uv_fs_chown(loop, &req, "test_file", -1, -1, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); /* sync fchown */ r = uv_fs_fchown(loop, &req, file, -1, -1, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); /* async chown */ r = uv_fs_chown(loop, &req, "test_file", -1, -1, chown_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(chown_cb_count == 1); /* chown to root (fail) */ chown_cb_count = 0; r = uv_fs_chown(loop, &req, "test_file", 0, 0, chown_root_cb); uv_run(loop, UV_RUN_DEFAULT); ASSERT(chown_cb_count == 1); /* async fchown */ r = uv_fs_fchown(loop, &req, file, -1, -1, fchown_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(fchown_cb_count == 1); close(file); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_link) { int r; uv_fs_t req; uv_file file; uv_file link; /* Setup. */ unlink("test_file"); unlink("test_file_link"); unlink("test_file_link2"); loop = uv_default_loop(); r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &req, file, &iov, 1, -1, NULL); ASSERT(r == sizeof(test_buf)); ASSERT(req.result == sizeof(test_buf)); uv_fs_req_cleanup(&req); close(file); /* sync link */ r = uv_fs_link(loop, &req, "test_file", "test_file_link", NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, "test_file_link", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); link = req.result; uv_fs_req_cleanup(&req); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &req, link, &iov, 1, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); close(link); /* async link */ r = uv_fs_link(loop, &req, "test_file", "test_file_link2", link_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(link_cb_count == 1); r = uv_fs_open(loop, &req, "test_file_link2", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); link = req.result; uv_fs_req_cleanup(&req); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &req, link, &iov, 1, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); close(link); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); unlink("test_file_link"); unlink("test_file_link2"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_readlink) { uv_fs_t req; loop = uv_default_loop(); ASSERT(0 == uv_fs_readlink(loop, &req, "no_such_file", dummy_cb)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(dummy_cb_count == 1); ASSERT(req.ptr == NULL); ASSERT(req.result == UV_ENOENT); uv_fs_req_cleanup(&req); ASSERT(UV_ENOENT == uv_fs_readlink(loop, &req, "no_such_file", NULL)); ASSERT(req.ptr == NULL); ASSERT(req.result == UV_ENOENT); uv_fs_req_cleanup(&req); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_symlink) { int r; uv_fs_t req; uv_file file; uv_file link; /* Setup. */ unlink("test_file"); unlink("test_file_symlink"); unlink("test_file_symlink2"); unlink("test_file_symlink_symlink"); unlink("test_file_symlink2_symlink"); loop = uv_default_loop(); r = uv_fs_open(loop, &req, "test_file", O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; uv_fs_req_cleanup(&req); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &req, file, &iov, 1, -1, NULL); ASSERT(r == sizeof(test_buf)); ASSERT(req.result == sizeof(test_buf)); uv_fs_req_cleanup(&req); close(file); /* sync symlink */ r = uv_fs_symlink(loop, &req, "test_file", "test_file_symlink", 0, NULL); #ifdef _WIN32 if (r < 0) { if (r == UV_ENOTSUP) { /* * Windows doesn't support symlinks on older versions. * We just pass the test and bail out early if we get ENOTSUP. */ return 0; } else if (r == UV_EPERM) { /* * Creating a symlink is only allowed when running elevated. * We pass the test and bail out early if we get UV_EPERM. */ return 0; } } #endif ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &req, "test_file_symlink", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); link = req.result; uv_fs_req_cleanup(&req); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &req, link, &iov, 1, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); close(link); r = uv_fs_symlink(loop, &req, "test_file_symlink", "test_file_symlink_symlink", 0, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&req); r = uv_fs_readlink(loop, &req, "test_file_symlink_symlink", NULL); ASSERT(r == 0); ASSERT(strcmp(req.ptr, "test_file_symlink") == 0); uv_fs_req_cleanup(&req); /* async link */ r = uv_fs_symlink(loop, &req, "test_file", "test_file_symlink2", 0, symlink_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(symlink_cb_count == 1); r = uv_fs_open(loop, &req, "test_file_symlink2", O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); link = req.result; uv_fs_req_cleanup(&req); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &req, link, &iov, 1, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); close(link); r = uv_fs_symlink(loop, &req, "test_file_symlink2", "test_file_symlink2_symlink", 0, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&req); r = uv_fs_readlink(loop, &req, "test_file_symlink2_symlink", readlink_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(readlink_cb_count == 1); /* * Run the loop just to check we don't have make any extraneous uv_ref() * calls. This should drop out immediately. */ uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ unlink("test_file"); unlink("test_file_symlink"); unlink("test_file_symlink_symlink"); unlink("test_file_symlink2"); unlink("test_file_symlink2_symlink"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_symlink_dir) { uv_fs_t req; int r; char* test_dir; uv_dirent_t dent; /* set-up */ unlink("test_dir/file1"); unlink("test_dir/file2"); rmdir("test_dir"); rmdir("test_dir_symlink"); loop = uv_default_loop(); uv_fs_mkdir(loop, &req, "test_dir", 0777, NULL); uv_fs_req_cleanup(&req); #ifdef _WIN32 { static char src_path_buf[PATHMAX]; size_t size; size = sizeof(src_path_buf); strcpy(src_path_buf, "\\\\?\\"); uv_cwd(src_path_buf + 4, &size); strcat(src_path_buf, "\\test_dir\\"); test_dir = src_path_buf; } #else test_dir = "test_dir"; #endif r = uv_fs_symlink(loop, &req, test_dir, "test_dir_symlink", UV_FS_SYMLINK_JUNCTION, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); r = uv_fs_stat(loop, &req, "test_dir_symlink", NULL); ASSERT(r == 0); ASSERT(((uv_stat_t*)req.ptr)->st_mode & S_IFDIR); uv_fs_req_cleanup(&req); r = uv_fs_lstat(loop, &req, "test_dir_symlink", NULL); ASSERT(r == 0); ASSERT(((uv_stat_t*)req.ptr)->st_mode & S_IFLNK); #ifdef _WIN32 ASSERT(((uv_stat_t*)req.ptr)->st_size == strlen(test_dir + 4)); #else ASSERT(((uv_stat_t*)req.ptr)->st_size == strlen(test_dir)); #endif uv_fs_req_cleanup(&req); r = uv_fs_readlink(loop, &req, "test_dir_symlink", NULL); ASSERT(r == 0); #ifdef _WIN32 ASSERT(strcmp(req.ptr, test_dir + 4) == 0); #else ASSERT(strcmp(req.ptr, test_dir) == 0); #endif uv_fs_req_cleanup(&req); r = uv_fs_open(loop, &open_req1, "test_dir/file1", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_dir/file2", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_scandir(loop, &scandir_req, "test_dir_symlink", 0, NULL); ASSERT(r == 2); ASSERT(scandir_req.result == 2); ASSERT(scandir_req.ptr); while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) { ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); } uv_fs_req_cleanup(&scandir_req); ASSERT(!scandir_req.ptr); /* unlink will remove the directory symlink */ r = uv_fs_unlink(loop, &req, "test_dir_symlink", NULL); ASSERT(r == 0); uv_fs_req_cleanup(&req); r = uv_fs_scandir(loop, &scandir_req, "test_dir_symlink", 0, NULL); ASSERT(r == UV_ENOENT); uv_fs_req_cleanup(&scandir_req); r = uv_fs_scandir(loop, &scandir_req, "test_dir", 0, NULL); ASSERT(r == 2); ASSERT(scandir_req.result == 2); ASSERT(scandir_req.ptr); while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) { ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0); ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN); } uv_fs_req_cleanup(&scandir_req); ASSERT(!scandir_req.ptr); /* clean-up */ unlink("test_dir/file1"); unlink("test_dir/file2"); rmdir("test_dir"); rmdir("test_dir_symlink"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_utime) { utime_check_t checkme; const char* path = "test_file"; double atime; double mtime; uv_fs_t req; int r; /* Setup. */ loop = uv_default_loop(); unlink(path); r = uv_fs_open(loop, &req, path, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); uv_fs_req_cleanup(&req); close(r); atime = mtime = 400497753; /* 1982-09-10 11:22:33 */ r = uv_fs_utime(loop, &req, path, atime, mtime, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); r = uv_fs_stat(loop, &req, path, NULL); ASSERT(r == 0); ASSERT(req.result == 0); check_utime(path, atime, mtime); uv_fs_req_cleanup(&req); atime = mtime = 1291404900; /* 2010-12-03 20:35:00 - mees <3 */ checkme.path = path; checkme.atime = atime; checkme.mtime = mtime; /* async utime */ utime_req.data = &checkme; r = uv_fs_utime(loop, &utime_req, path, atime, mtime, utime_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(utime_cb_count == 1); /* Cleanup. */ unlink(path); MAKE_VALGRIND_HAPPY(); return 0; } #ifdef _WIN32 TEST_IMPL(fs_stat_root) { int r; uv_loop_t* loop = uv_default_loop(); r = uv_fs_stat(loop, &stat_req, "\\", NULL); ASSERT(r == 0); r = uv_fs_stat(loop, &stat_req, "..\\..\\..\\..\\..\\..\\..", NULL); ASSERT(r == 0); r = uv_fs_stat(loop, &stat_req, "..", NULL); ASSERT(r == 0); r = uv_fs_stat(loop, &stat_req, "..\\", NULL); ASSERT(r == 0); /* stats the current directory on c: */ r = uv_fs_stat(loop, &stat_req, "c:", NULL); ASSERT(r == 0); r = uv_fs_stat(loop, &stat_req, "c:\\", NULL); ASSERT(r == 0); r = uv_fs_stat(loop, &stat_req, "\\\\?\\C:\\", NULL); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } #endif TEST_IMPL(fs_futime) { utime_check_t checkme; const char* path = "test_file"; double atime; double mtime; uv_file file; uv_fs_t req; int r; /* Setup. */ loop = uv_default_loop(); unlink(path); r = uv_fs_open(loop, &req, path, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); uv_fs_req_cleanup(&req); close(r); atime = mtime = 400497753; /* 1982-09-10 11:22:33 */ r = uv_fs_open(loop, &req, path, O_RDWR, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); file = req.result; /* FIXME probably not how it's supposed to be used */ uv_fs_req_cleanup(&req); r = uv_fs_futime(loop, &req, file, atime, mtime, NULL); ASSERT(r == 0); ASSERT(req.result == 0); uv_fs_req_cleanup(&req); r = uv_fs_stat(loop, &req, path, NULL); ASSERT(r == 0); ASSERT(req.result == 0); check_utime(path, atime, mtime); uv_fs_req_cleanup(&req); atime = mtime = 1291404900; /* 2010-12-03 20:35:00 - mees <3 */ checkme.atime = atime; checkme.mtime = mtime; checkme.path = path; /* async futime */ futime_req.data = &checkme; r = uv_fs_futime(loop, &futime_req, file, atime, mtime, futime_cb); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(futime_cb_count == 1); /* Cleanup. */ unlink(path); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_stat_missing_path) { uv_fs_t req; int r; loop = uv_default_loop(); r = uv_fs_stat(loop, &req, "non_existent_file", NULL); ASSERT(r == UV_ENOENT); ASSERT(req.result == UV_ENOENT); uv_fs_req_cleanup(&req); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_scandir_empty_dir) { const char* path; uv_fs_t req; uv_dirent_t dent; int r; path = "./empty_dir/"; loop = uv_default_loop(); uv_fs_mkdir(loop, &req, path, 0777, NULL); uv_fs_req_cleanup(&req); /* Fill the req to ensure that required fields are cleaned up */ memset(&req, 0xdb, sizeof(req)); r = uv_fs_scandir(loop, &req, path, 0, NULL); ASSERT(r == 0); ASSERT(req.result == 0); ASSERT(req.ptr == NULL); ASSERT(UV_EOF == uv_fs_scandir_next(&req, &dent)); uv_fs_req_cleanup(&req); r = uv_fs_scandir(loop, &scandir_req, path, 0, empty_scandir_cb); ASSERT(r == 0); ASSERT(scandir_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(scandir_cb_count == 1); uv_fs_rmdir(loop, &req, path, NULL); uv_fs_req_cleanup(&req); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_scandir_file) { const char* path; int r; path = "test/fixtures/empty_file"; loop = uv_default_loop(); r = uv_fs_scandir(loop, &scandir_req, path, 0, NULL); ASSERT(r == UV_ENOTDIR); uv_fs_req_cleanup(&scandir_req); r = uv_fs_scandir(loop, &scandir_req, path, 0, file_scandir_cb); ASSERT(r == 0); ASSERT(scandir_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(scandir_cb_count == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_open_dir) { const char* path; uv_fs_t req; int r, file; path = "."; loop = uv_default_loop(); r = uv_fs_open(loop, &req, path, O_RDONLY, 0, NULL); ASSERT(r >= 0); ASSERT(req.result >= 0); ASSERT(req.ptr == NULL); file = r; uv_fs_req_cleanup(&req); r = uv_fs_close(loop, &req, file, NULL); ASSERT(r == 0); r = uv_fs_open(loop, &req, path, O_RDONLY, 0, open_cb_simple); ASSERT(r == 0); ASSERT(open_cb_count == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(open_cb_count == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_file_open_append) { int r; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file", O_RDWR | O_APPEND, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file", O_RDONLY, S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, NULL); printf("read = %d\n", r); ASSERT(r == 26); ASSERT(read_req.result == 26); ASSERT(memcmp(buf, "test-buffer\n\0test-buffer\n\0", sizeof("test-buffer\n\0test-buffer\n\0") - 1) == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); /* Cleanup */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_rename_to_existing_file) { int r; /* Setup. */ unlink("test_file"); unlink("test_file2"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file2", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_rename(loop, &rename_req, "test_file", "test_file2", NULL); ASSERT(r == 0); ASSERT(rename_req.result == 0); uv_fs_req_cleanup(&rename_req); r = uv_fs_open(loop, &open_req1, "test_file2", O_RDONLY, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(read_req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); /* Cleanup */ unlink("test_file"); unlink("test_file2"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_read_file_eof) { int r; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iov = uv_buf_init(test_buf, sizeof(test_buf)); r = uv_fs_write(loop, &write_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file", O_RDONLY, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); memset(buf, 0, sizeof(buf)); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1, NULL); ASSERT(r >= 0); ASSERT(read_req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); uv_fs_req_cleanup(&read_req); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, read_req.result, NULL); ASSERT(r == 0); ASSERT(read_req.result == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); /* Cleanup */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_write_multiple_bufs) { uv_buf_t iovs[2]; int r; /* Setup. */ unlink("test_file"); loop = uv_default_loop(); r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); iovs[0] = uv_buf_init(test_buf, sizeof(test_buf)); iovs[1] = uv_buf_init(test_buf2, sizeof(test_buf2)); r = uv_fs_write(loop, &write_req, open_req1.result, iovs, 2, 0, NULL); ASSERT(r >= 0); ASSERT(write_req.result >= 0); uv_fs_req_cleanup(&write_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); r = uv_fs_open(loop, &open_req1, "test_file", O_RDONLY, 0, NULL); ASSERT(r >= 0); ASSERT(open_req1.result >= 0); uv_fs_req_cleanup(&open_req1); memset(buf, 0, sizeof(buf)); memset(buf2, 0, sizeof(buf2)); /* Read the strings back to separate buffers. */ iovs[0] = uv_buf_init(buf, sizeof(test_buf)); iovs[1] = uv_buf_init(buf2, sizeof(test_buf2)); r = uv_fs_read(loop, &read_req, open_req1.result, iovs, 2, 0, NULL); ASSERT(r >= 0); ASSERT(read_req.result >= 0); ASSERT(strcmp(buf, test_buf) == 0); ASSERT(strcmp(buf2, test_buf2) == 0); uv_fs_req_cleanup(&read_req); iov = uv_buf_init(buf, sizeof(buf)); r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, read_req.result, NULL); ASSERT(r == 0); ASSERT(read_req.result == 0); uv_fs_req_cleanup(&read_req); r = uv_fs_close(loop, &close_req, open_req1.result, NULL); ASSERT(r == 0); ASSERT(close_req.result == 0); uv_fs_req_cleanup(&close_req); /* Cleanup */ unlink("test_file"); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-get-currentexe.c0000644000175000017500000000423412456307253022014 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #define PATHMAX 1024 extern char executable_path[]; TEST_IMPL(get_currentexe) { char buffer[PATHMAX]; size_t size; char* match; char* path; int r; size = sizeof(buffer) / sizeof(buffer[0]); r = uv_exepath(buffer, &size); ASSERT(!r); /* uv_exepath can return an absolute path on darwin, so if the test runner * was run with a relative prefix of "./", we need to strip that prefix off * executable_path or we'll fail. */ if (executable_path[0] == '.' && executable_path[1] == '/') { path = executable_path + 2; } else { path = executable_path; } match = strstr(buffer, path); /* Verify that the path returned from uv_exepath is a subdirectory of * executable_path. */ ASSERT(match && !strcmp(match, path)); ASSERT(size == strlen(buffer)); /* Negative tests */ size = sizeof(buffer) / sizeof(buffer[0]); r = uv_exepath(NULL, &size); ASSERT(r == UV_EINVAL); r = uv_exepath(buffer, NULL); ASSERT(r == UV_EINVAL); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-get-loadavg.c0000644000175000017500000000252112456307253021242 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" TEST_IMPL(get_loadavg) { double avg[3]; uv_loadavg(avg); ASSERT(avg != NULL); ASSERT(avg[0] >= 0); ASSERT(avg[1] >= 0); ASSERT(avg[2] >= 0); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-get-memory.c0000644000175000017500000000277112456307253021144 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" TEST_IMPL(get_memory) { uint64_t free_mem = uv_get_free_memory(); uint64_t total_mem = uv_get_total_memory(); printf("free_mem=%llu, total_mem=%llu\n", (unsigned long long) free_mem, (unsigned long long) total_mem); ASSERT(free_mem > 0); ASSERT(total_mem > 0); ASSERT(total_mem > free_mem); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-getaddrinfo.c0000644000175000017500000001013712456307253021340 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #define CONCURRENT_COUNT 10 static const char* name = "localhost"; static int getaddrinfo_cbs = 0; /* data used for running multiple calls concurrently */ static uv_getaddrinfo_t* getaddrinfo_handle; static uv_getaddrinfo_t getaddrinfo_handles[CONCURRENT_COUNT]; static int callback_counts[CONCURRENT_COUNT]; static int fail_cb_called; static void getaddrinfo_fail_cb(uv_getaddrinfo_t* req, int status, struct addrinfo* res) { ASSERT(fail_cb_called == 0); ASSERT(status < 0); ASSERT(res == NULL); uv_freeaddrinfo(res); /* Should not crash. */ fail_cb_called++; } static void getaddrinfo_basic_cb(uv_getaddrinfo_t* handle, int status, struct addrinfo* res) { ASSERT(handle == getaddrinfo_handle); getaddrinfo_cbs++; free(handle); uv_freeaddrinfo(res); } static void getaddrinfo_cuncurrent_cb(uv_getaddrinfo_t* handle, int status, struct addrinfo* res) { int i; int* data = (int*)handle->data; for (i = 0; i < CONCURRENT_COUNT; i++) { if (&getaddrinfo_handles[i] == handle) { ASSERT(i == *data); callback_counts[i]++; break; } } ASSERT (i < CONCURRENT_COUNT); free(data); uv_freeaddrinfo(res); getaddrinfo_cbs++; } TEST_IMPL(getaddrinfo_fail) { uv_getaddrinfo_t req; ASSERT(0 == uv_getaddrinfo(uv_default_loop(), &req, getaddrinfo_fail_cb, "xyzzy.xyzzy.xyzzy", NULL, NULL)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(fail_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(getaddrinfo_basic) { int r; getaddrinfo_handle = (uv_getaddrinfo_t*)malloc(sizeof(uv_getaddrinfo_t)); r = uv_getaddrinfo(uv_default_loop(), getaddrinfo_handle, &getaddrinfo_basic_cb, name, NULL, NULL); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(getaddrinfo_cbs == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(getaddrinfo_concurrent) { int i, r; int* data; for (i = 0; i < CONCURRENT_COUNT; i++) { callback_counts[i] = 0; data = (int*)malloc(sizeof(int)); ASSERT(data != NULL); *data = i; getaddrinfo_handles[i].data = data; r = uv_getaddrinfo(uv_default_loop(), &getaddrinfo_handles[i], &getaddrinfo_cuncurrent_cb, name, NULL, NULL); ASSERT(r == 0); } uv_run(uv_default_loop(), UV_RUN_DEFAULT); for (i = 0; i < CONCURRENT_COUNT; i++) { ASSERT(callback_counts[i] == 1); } MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-getnameinfo.c0000644000175000017500000000475712456307253021361 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include static const char* address_ip4 = "127.0.0.1"; static const char* address_ip6 = "::1"; static const int port = 80; static struct sockaddr_in addr4; static struct sockaddr_in6 addr6; static uv_getnameinfo_t req; static void getnameinfo_req(uv_getnameinfo_t* handle, int status, const char* hostname, const char* service) { ASSERT(handle != NULL); ASSERT(status == 0); ASSERT(hostname != NULL); ASSERT(service != NULL); } TEST_IMPL(getnameinfo_basic_ip4) { int r; r = uv_ip4_addr(address_ip4, port, &addr4); ASSERT(r == 0); r = uv_getnameinfo(uv_default_loop(), &req, &getnameinfo_req, (const struct sockaddr*)&addr4, 0); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(getnameinfo_basic_ip6) { int r; r = uv_ip6_addr(address_ip6, port, &addr6); ASSERT(r == 0); r = uv_getnameinfo(uv_default_loop(), &req, &getnameinfo_req, (const struct sockaddr*)&addr6, 0); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-getsockname.c0000644000175000017500000002143112456307253021351 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include static const int server_port = TEST_PORT; /* Will be updated right after making the uv_connect_call */ static int connect_port = -1; static int getsocknamecount = 0; static int getpeernamecount = 0; static uv_loop_t* loop; static uv_tcp_t tcp; static uv_udp_t udp; static uv_connect_t connect_req; static uv_tcp_t tcpServer; static uv_udp_t udpServer; static uv_udp_send_t send_req; static void alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } static void on_close(uv_handle_t* peer) { free(peer); uv_close((uv_handle_t*)&tcpServer, NULL); } static void after_shutdown(uv_shutdown_t* req, int status) { uv_close((uv_handle_t*) req->handle, on_close); free(req); } static void after_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { uv_shutdown_t* req; int r; if (buf->base) { free(buf->base); } req = (uv_shutdown_t*) malloc(sizeof *req); r = uv_shutdown(req, handle, after_shutdown); ASSERT(r == 0); } static void check_sockname(struct sockaddr* addr, const char* compare_ip, int compare_port, const char* context) { struct sockaddr_in check_addr = *(struct sockaddr_in*) addr; struct sockaddr_in compare_addr; char check_ip[17]; int r; ASSERT(0 == uv_ip4_addr(compare_ip, compare_port, &compare_addr)); /* Both addresses should be ipv4 */ ASSERT(check_addr.sin_family == AF_INET); ASSERT(compare_addr.sin_family == AF_INET); /* Check if the ip matches */ ASSERT(memcmp(&check_addr.sin_addr, &compare_addr.sin_addr, sizeof compare_addr.sin_addr) == 0); /* Check if the port matches. If port == 0 anything goes. */ ASSERT(compare_port == 0 || check_addr.sin_port == compare_addr.sin_port); r = uv_ip4_name(&check_addr, (char*) check_ip, sizeof check_ip); ASSERT(r == 0); printf("%s: %s:%d\n", context, check_ip, ntohs(check_addr.sin_port)); } static void on_connection(uv_stream_t* server, int status) { struct sockaddr sockname, peername; int namelen; uv_tcp_t* handle; int r; if (status != 0) { fprintf(stderr, "Connect error %s\n", uv_err_name(status)); } ASSERT(status == 0); handle = malloc(sizeof(*handle)); ASSERT(handle != NULL); r = uv_tcp_init(loop, handle); ASSERT(r == 0); /* associate server with stream */ handle->data = server; r = uv_accept(server, (uv_stream_t*)handle); ASSERT(r == 0); namelen = sizeof sockname; r = uv_tcp_getsockname(handle, &sockname, &namelen); ASSERT(r == 0); check_sockname(&sockname, "127.0.0.1", server_port, "accepted socket"); getsocknamecount++; namelen = sizeof peername; r = uv_tcp_getpeername(handle, &peername, &namelen); ASSERT(r == 0); check_sockname(&peername, "127.0.0.1", connect_port, "accepted socket peer"); getpeernamecount++; r = uv_read_start((uv_stream_t*)handle, alloc, after_read); ASSERT(r == 0); } static void on_connect(uv_connect_t* req, int status) { struct sockaddr sockname, peername; int r, namelen; ASSERT(status == 0); namelen = sizeof sockname; r = uv_tcp_getsockname((uv_tcp_t*) req->handle, &sockname, &namelen); ASSERT(r == 0); check_sockname(&sockname, "127.0.0.1", 0, "connected socket"); getsocknamecount++; namelen = sizeof peername; r = uv_tcp_getpeername((uv_tcp_t*) req->handle, &peername, &namelen); ASSERT(r == 0); check_sockname(&peername, "127.0.0.1", server_port, "connected socket peer"); getpeernamecount++; uv_close((uv_handle_t*)&tcp, NULL); } static int tcp_listener(void) { struct sockaddr_in addr; struct sockaddr sockname, peername; int namelen; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", server_port, &addr)); r = uv_tcp_init(loop, &tcpServer); if (r) { fprintf(stderr, "Socket creation error\n"); return 1; } r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &addr, 0); if (r) { fprintf(stderr, "Bind error\n"); return 1; } r = uv_listen((uv_stream_t*)&tcpServer, 128, on_connection); if (r) { fprintf(stderr, "Listen error\n"); return 1; } memset(&sockname, -1, sizeof sockname); namelen = sizeof sockname; r = uv_tcp_getsockname(&tcpServer, &sockname, &namelen); ASSERT(r == 0); check_sockname(&sockname, "0.0.0.0", server_port, "server socket"); getsocknamecount++; namelen = sizeof sockname; r = uv_tcp_getpeername(&tcpServer, &peername, &namelen); ASSERT(r == UV_ENOTCONN); getpeernamecount++; return 0; } static void tcp_connector(void) { struct sockaddr_in server_addr; struct sockaddr sockname; int r, namelen; ASSERT(0 == uv_ip4_addr("127.0.0.1", server_port, &server_addr)); r = uv_tcp_init(loop, &tcp); tcp.data = &connect_req; ASSERT(!r); r = uv_tcp_connect(&connect_req, &tcp, (const struct sockaddr*) &server_addr, on_connect); ASSERT(!r); /* Fetch the actual port used by the connecting socket. */ namelen = sizeof sockname; r = uv_tcp_getsockname(&tcp, &sockname, &namelen); ASSERT(!r); ASSERT(sockname.sa_family == AF_INET); connect_port = ntohs(((struct sockaddr_in*) &sockname)->sin_port); ASSERT(connect_port > 0); } static void udp_recv(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { struct sockaddr sockname; int namelen; int r; ASSERT(nread >= 0); free(buf->base); if (nread == 0) { return; } memset(&sockname, -1, sizeof sockname); namelen = sizeof(sockname); r = uv_udp_getsockname(&udp, &sockname, &namelen); ASSERT(r == 0); check_sockname(&sockname, "0.0.0.0", 0, "udp receiving socket"); getsocknamecount++; uv_close((uv_handle_t*) &udp, NULL); uv_close((uv_handle_t*) handle, NULL); } static void udp_send(uv_udp_send_t* req, int status) { } static int udp_listener(void) { struct sockaddr_in addr; struct sockaddr sockname; int namelen; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", server_port, &addr)); r = uv_udp_init(loop, &udpServer); if (r) { fprintf(stderr, "Socket creation error\n"); return 1; } r = uv_udp_bind(&udpServer, (const struct sockaddr*) &addr, 0); if (r) { fprintf(stderr, "Bind error\n"); return 1; } memset(&sockname, -1, sizeof sockname); namelen = sizeof sockname; r = uv_udp_getsockname(&udpServer, &sockname, &namelen); ASSERT(r == 0); check_sockname(&sockname, "0.0.0.0", server_port, "udp listener socket"); getsocknamecount++; r = uv_udp_recv_start(&udpServer, alloc, udp_recv); ASSERT(r == 0); return 0; } static void udp_sender(void) { struct sockaddr_in server_addr; uv_buf_t buf; int r; r = uv_udp_init(loop, &udp); ASSERT(!r); buf = uv_buf_init("PING", 4); ASSERT(0 == uv_ip4_addr("127.0.0.1", server_port, &server_addr)); r = uv_udp_send(&send_req, &udp, &buf, 1, (const struct sockaddr*) &server_addr, udp_send); ASSERT(!r); } TEST_IMPL(getsockname_tcp) { loop = uv_default_loop(); if (tcp_listener()) return 1; tcp_connector(); uv_run(loop, UV_RUN_DEFAULT); ASSERT(getsocknamecount == 3); ASSERT(getpeernamecount == 3); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(getsockname_udp) { loop = uv_default_loop(); if (udp_listener()) return 1; udp_sender(); uv_run(loop, UV_RUN_DEFAULT); ASSERT(getsocknamecount == 2); ASSERT(udp.send_queue_size == 0); ASSERT(udpServer.send_queue_size == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-handle-fileno.c0000644000175000017500000000717012456307253021562 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int get_tty_fd(void) { /* Make sure we have an FD that refers to a tty */ #ifdef _WIN32 HANDLE handle; handle = CreateFileA("conout$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (handle == INVALID_HANDLE_VALUE) return -1; return _open_osfhandle((intptr_t) handle, 0); #else /* unix */ return open("/dev/tty", O_RDONLY, 0); #endif } TEST_IMPL(handle_fileno) { int r; int tty_fd; struct sockaddr_in addr; uv_os_fd_t fd; uv_tcp_t tcp; uv_udp_t udp; uv_pipe_t pipe; uv_tty_t tty; uv_idle_t idle; uv_loop_t* loop; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_idle_init(loop, &idle); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &idle, &fd); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*) &idle, NULL); r = uv_tcp_init(loop, &tcp); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &tcp, &fd); ASSERT(r == UV_EBADF); r = uv_tcp_bind(&tcp, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &tcp, &fd); ASSERT(r == 0); uv_close((uv_handle_t*) &tcp, NULL); r = uv_fileno((uv_handle_t*) &tcp, &fd); ASSERT(r == UV_EBADF); r = uv_udp_init(loop, &udp); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &udp, &fd); ASSERT(r == UV_EBADF); r = uv_udp_bind(&udp, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &udp, &fd); ASSERT(r == 0); uv_close((uv_handle_t*) &udp, NULL); r = uv_fileno((uv_handle_t*) &udp, &fd); ASSERT(r == UV_EBADF); r = uv_pipe_init(loop, &pipe, 0); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &pipe, &fd); ASSERT(r == UV_EBADF); r = uv_pipe_bind(&pipe, TEST_PIPENAME); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &pipe, &fd); ASSERT(r == 0); uv_close((uv_handle_t*) &pipe, NULL); r = uv_fileno((uv_handle_t*) &pipe, &fd); ASSERT(r == UV_EBADF); tty_fd = get_tty_fd(); if (tty_fd < 0) { LOGF("Cannot open a TTY fd"); } else { r = uv_tty_init(loop, &tty, tty_fd, 0); ASSERT(r == 0); r = uv_fileno((uv_handle_t*) &tty, &fd); ASSERT(r == 0); uv_close((uv_handle_t*) &tty, NULL); r = uv_fileno((uv_handle_t*) &tty, &fd); ASSERT(r == UV_EBADF); } uv_run(loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-hrtime.c0000644000175000017500000000350612456307253020344 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #ifndef MILLISEC # define MILLISEC 1000 #endif #ifndef NANOSEC # define NANOSEC ((uint64_t) 1e9) #endif TEST_IMPL(hrtime) { uint64_t a, b, diff; int i = 75; while (i > 0) { a = uv_hrtime(); uv_sleep(45); b = uv_hrtime(); diff = b - a; /* printf("i= %d diff = %llu\n", i, (unsigned long long int) diff); */ /* The windows Sleep() function has only a resolution of 10-20 ms. */ /* Check that the difference between the two hrtime values is somewhat in */ /* the range we expect it to be. */ ASSERT(diff > (uint64_t) 25 * NANOSEC / MILLISEC); ASSERT(diff < (uint64_t) 80 * NANOSEC / MILLISEC); --i; } return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-idle.c0000644000175000017500000000525512456307253017774 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_idle_t idle_handle; static uv_check_t check_handle; static uv_timer_t timer_handle; static int idle_cb_called = 0; static int check_cb_called = 0; static int timer_cb_called = 0; static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer_handle); uv_close((uv_handle_t*) &idle_handle, close_cb); uv_close((uv_handle_t*) &check_handle, close_cb); uv_close((uv_handle_t*) &timer_handle, close_cb); timer_cb_called++; LOGF("timer_cb %d\n", timer_cb_called); } static void idle_cb(uv_idle_t* handle) { ASSERT(handle == &idle_handle); idle_cb_called++; LOGF("idle_cb %d\n", idle_cb_called); } static void check_cb(uv_check_t* handle) { ASSERT(handle == &check_handle); check_cb_called++; LOGF("check_cb %d\n", check_cb_called); } TEST_IMPL(idle_starvation) { int r; r = uv_idle_init(uv_default_loop(), &idle_handle); ASSERT(r == 0); r = uv_idle_start(&idle_handle, idle_cb); ASSERT(r == 0); r = uv_check_init(uv_default_loop(), &check_handle); ASSERT(r == 0); r = uv_check_start(&check_handle, check_cb); ASSERT(r == 0); r = uv_timer_init(uv_default_loop(), &timer_handle); ASSERT(r == 0); r = uv_timer_start(&timer_handle, timer_cb, 50, 0); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(idle_cb_called > 0); ASSERT(timer_cb_called == 1); ASSERT(close_cb_called == 3); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-ip4-addr.c0000644000175000017500000000346412456307253020463 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include TEST_IMPL(ip4_addr) { struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_ip4_addr("255.255.255.255", TEST_PORT, &addr)); ASSERT(UV_EINVAL == uv_ip4_addr("255.255.255*000", TEST_PORT, &addr)); ASSERT(UV_EINVAL == uv_ip4_addr("255.255.255.256", TEST_PORT, &addr)); ASSERT(UV_EINVAL == uv_ip4_addr("2555.0.0.0", TEST_PORT, &addr)); ASSERT(UV_EINVAL == uv_ip4_addr("255", TEST_PORT, &addr)); /* for broken address family */ ASSERT(UV_EAFNOSUPPORT == uv_inet_pton(42, "127.0.0.1", &addr.sin_addr.s_addr)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-ip6-addr.c0000644000175000017500000001221412456307253020456 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #ifdef __linux__ # include # include #endif TEST_IMPL(ip6_addr_link_local) { char string_address[INET6_ADDRSTRLEN]; uv_interface_address_t* addresses; uv_interface_address_t* address; struct sockaddr_in6 addr; unsigned int iface_index; const char* device_name; /* 40 bytes address, 16 bytes device name, plus reserve. */ char scoped_addr[128]; int count; int ix; ASSERT(0 == uv_interface_addresses(&addresses, &count)); for (ix = 0; ix < count; ix++) { address = addresses + ix; if (address->address.address6.sin6_family != AF_INET6) continue; ASSERT(0 == uv_inet_ntop(AF_INET6, &address->address.address6.sin6_addr, string_address, sizeof(string_address))); /* Skip addresses that are not link-local. */ if (strncmp(string_address, "fe80::", 6) != 0) continue; iface_index = address->address.address6.sin6_scope_id; device_name = address->name; #ifdef _WIN32 snprintf(scoped_addr, sizeof(scoped_addr), "%s%%%d", string_address, iface_index); #else snprintf(scoped_addr, sizeof(scoped_addr), "%s%%%s", string_address, device_name); #endif LOGF("Testing link-local address %s " "(iface_index: 0x%02x, device_name: %s)\n", scoped_addr, iface_index, device_name); ASSERT(0 == uv_ip6_addr(scoped_addr, TEST_PORT, &addr)); LOGF("Got scope_id 0x%02x\n", addr.sin6_scope_id); ASSERT(iface_index == addr.sin6_scope_id); } uv_free_interface_addresses(addresses, count); MAKE_VALGRIND_HAPPY(); return 0; } #define GOOD_ADDR_LIST(X) \ X("::") \ X("::1") \ X("fe80::1") \ X("fe80::") \ X("fe80::2acf:daff:fedd:342a") \ X("fe80:0:0:0:2acf:daff:fedd:342a") \ X("fe80:0:0:0:2acf:daff:1.2.3.4") \ X("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") \ #define BAD_ADDR_LIST(X) \ X(":::1") \ X("abcde::1") \ X("fe80:0:0:0:2acf:daff:fedd:342a:5678") \ X("fe80:0:0:0:2acf:daff:abcd:1.2.3.4") \ X("fe80:0:0:2acf:daff:1.2.3.4.5") \ X("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255.255") \ #define TEST_GOOD(ADDR) \ ASSERT(0 == uv_inet_pton(AF_INET6, ADDR, &addr)); \ ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%en1", &addr)); \ ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%%%%", &addr)); \ ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr)); \ #define TEST_BAD(ADDR) \ ASSERT(0 != uv_inet_pton(AF_INET6, ADDR, &addr)); \ ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%en1", &addr)); \ ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%%%%", &addr)); \ ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr)); \ TEST_IMPL(ip6_pton) { struct in6_addr addr; GOOD_ADDR_LIST(TEST_GOOD) BAD_ADDR_LIST(TEST_BAD) MAKE_VALGRIND_HAPPY(); return 0; } #undef GOOD_ADDR_LIST #undef BAD_ADDR_LIST MoarVM-2015.11/3rdparty/libuv/test/test-ipc-send-recv.c0000644000175000017500000001330612456307253021512 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* See test-ipc.ctx */ void spawn_helper(uv_pipe_t* channel, uv_process_t* process, const char* helper); union handles { uv_handle_t handle; uv_stream_t stream; uv_pipe_t pipe; uv_tcp_t tcp; uv_tty_t tty; }; struct echo_ctx { uv_pipe_t channel; uv_write_t write_req; uv_handle_type expected_type; union handles send; union handles recv; }; static struct echo_ctx ctx; static int num_recv_handles; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { /* we're not actually reading anything so a small buffer is okay */ static char slab[8]; buf->base = slab; buf->len = sizeof(slab); } static void recv_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { uv_handle_type pending; uv_pipe_t* pipe; int r; pipe = (uv_pipe_t*) handle; ASSERT(pipe == &ctx.channel); ASSERT(nread >= 0); ASSERT(1 == uv_pipe_pending_count(pipe)); pending = uv_pipe_pending_type(pipe); ASSERT(pending == ctx.expected_type); if (pending == UV_NAMED_PIPE) r = uv_pipe_init(ctx.channel.loop, &ctx.recv.pipe, 0); else if (pending == UV_TCP) r = uv_tcp_init(ctx.channel.loop, &ctx.recv.tcp); else abort(); ASSERT(r == 0); r = uv_accept(handle, &ctx.recv.stream); ASSERT(r == 0); uv_close((uv_handle_t*)&ctx.channel, NULL); uv_close(&ctx.send.handle, NULL); uv_close(&ctx.recv.handle, NULL); num_recv_handles++; } static int run_test(void) { uv_process_t process; uv_buf_t buf; int r; spawn_helper(&ctx.channel, &process, "ipc_send_recv_helper"); buf = uv_buf_init(".", 1); r = uv_write2(&ctx.write_req, (uv_stream_t*)&ctx.channel, &buf, 1, &ctx.send.stream, NULL); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&ctx.channel, alloc_cb, recv_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(num_recv_handles == 1); return 0; } TEST_IMPL(ipc_send_recv_pipe) { int r; ctx.expected_type = UV_NAMED_PIPE; r = uv_pipe_init(uv_default_loop(), &ctx.send.pipe, 1); ASSERT(r == 0); r = uv_pipe_bind(&ctx.send.pipe, TEST_PIPENAME); ASSERT(r == 0); r = run_test(); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(ipc_send_recv_tcp) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ctx.expected_type = UV_TCP; r = uv_tcp_init(uv_default_loop(), &ctx.send.tcp); ASSERT(r == 0); r = uv_tcp_bind(&ctx.send.tcp, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = run_test(); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } /* Everything here runs in a child process. */ static void write2_cb(uv_write_t* req, int status) { ASSERT(status == 0); uv_close(&ctx.recv.handle, NULL); uv_close((uv_handle_t*)&ctx.channel, NULL); } static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* rdbuf) { uv_buf_t wrbuf; uv_pipe_t* pipe; uv_handle_type pending; int r; pipe = (uv_pipe_t*) handle; ASSERT(pipe == &ctx.channel); ASSERT(nread >= 0); ASSERT(1 == uv_pipe_pending_count(pipe)); pending = uv_pipe_pending_type(pipe); ASSERT(pending == UV_NAMED_PIPE || pending == UV_TCP); wrbuf = uv_buf_init(".", 1); if (pending == UV_NAMED_PIPE) r = uv_pipe_init(ctx.channel.loop, &ctx.recv.pipe, 0); else if (pending == UV_TCP) r = uv_tcp_init(ctx.channel.loop, &ctx.recv.tcp); else abort(); ASSERT(r == 0); r = uv_accept(handle, &ctx.recv.stream); ASSERT(r == 0); r = uv_write2(&ctx.write_req, (uv_stream_t*)&ctx.channel, &wrbuf, 1, &ctx.recv.stream, write2_cb); ASSERT(r == 0); } /* stdin is a duplex channel over which a handle is sent. * We receive it and send it back where it came from. */ int ipc_send_recv_helper(void) { int r; memset(&ctx, 0, sizeof(ctx)); r = uv_pipe_init(uv_default_loop(), &ctx.channel, 1); ASSERT(r == 0); uv_pipe_open(&ctx.channel, 0); ASSERT(1 == uv_is_readable((uv_stream_t*)&ctx.channel)); ASSERT(1 == uv_is_writable((uv_stream_t*)&ctx.channel)); ASSERT(0 == uv_is_closing((uv_handle_t*)&ctx.channel)); r = uv_read_start((uv_stream_t*)&ctx.channel, alloc_cb, read_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-ipc.c0000644000175000017500000004647512456307253017643 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_pipe_t channel; static uv_tcp_t tcp_server; static uv_tcp_t tcp_server2; static uv_tcp_t tcp_connection; static int exit_cb_called; static int read_cb_called; static int tcp_write_cb_called; static int tcp_read_cb_called; static int on_pipe_read_called; static int local_conn_accepted; static int remote_conn_accepted; static int tcp_server_listening; static uv_write_t write_req; static uv_write_t conn_notify_req; static int close_cb_called; static int connection_accepted; static int tcp_conn_read_cb_called; static int tcp_conn_write_cb_called; typedef struct { uv_connect_t conn_req; uv_write_t tcp_write_req; uv_tcp_t conn; } tcp_conn; #define CONN_COUNT 100 static void close_server_conn_cb(uv_handle_t* handle) { free(handle); } static void on_connection(uv_stream_t* server, int status) { uv_tcp_t* conn; int r; if (!local_conn_accepted) { /* Accept the connection and close it. Also and close the server. */ ASSERT(status == 0); ASSERT((uv_stream_t*)&tcp_server == server); conn = malloc(sizeof(*conn)); ASSERT(conn); r = uv_tcp_init(server->loop, conn); ASSERT(r == 0); r = uv_accept(server, (uv_stream_t*)conn); ASSERT(r == 0); uv_close((uv_handle_t*)conn, close_server_conn_cb); uv_close((uv_handle_t*)server, NULL); local_conn_accepted = 1; } } static void exit_cb(uv_process_t* process, int64_t exit_status, int term_signal) { printf("exit_cb\n"); exit_cb_called++; ASSERT(exit_status == 0); uv_close((uv_handle_t*)process, NULL); } static void on_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } static void close_client_conn_cb(uv_handle_t* handle) { tcp_conn* p = (tcp_conn*)handle->data; free(p); } static void connect_cb(uv_connect_t* req, int status) { uv_close((uv_handle_t*)req->handle, close_client_conn_cb); } static void make_many_connections(void) { tcp_conn* conn; struct sockaddr_in addr; int r, i; for (i = 0; i < CONN_COUNT; i++) { conn = malloc(sizeof(*conn)); ASSERT(conn); r = uv_tcp_init(uv_default_loop(), &conn->conn); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_connect(&conn->conn_req, (uv_tcp_t*) &conn->conn, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); conn->conn.data = conn; } } static void on_read(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { int r; uv_pipe_t* pipe; uv_handle_type pending; uv_buf_t outbuf; pipe = (uv_pipe_t*) handle; if (nread == 0) { /* Everything OK, but nothing read. */ free(buf->base); return; } if (nread < 0) { if (nread == UV_EOF) { free(buf->base); return; } printf("error recving on channel: %s\n", uv_strerror(nread)); abort(); } fprintf(stderr, "got %d bytes\n", (int)nread); pending = uv_pipe_pending_type(pipe); if (!tcp_server_listening) { ASSERT(1 == uv_pipe_pending_count(pipe)); ASSERT(nread > 0 && buf->base && pending != UV_UNKNOWN_HANDLE); read_cb_called++; /* Accept the pending TCP server, and start listening on it. */ ASSERT(pending == UV_TCP); r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 12, on_connection); ASSERT(r == 0); tcp_server_listening = 1; /* Make sure that the expected data is correctly multiplexed. */ ASSERT(memcmp("hello\n", buf->base, nread) == 0); outbuf = uv_buf_init("world\n", 6); r = uv_write(&write_req, (uv_stream_t*)pipe, &outbuf, 1, NULL); ASSERT(r == 0); /* Create a bunch of connections to get both servers to accept. */ make_many_connections(); } else if (memcmp("accepted_connection\n", buf->base, nread) == 0) { /* Remote server has accepted a connection. Close the channel. */ ASSERT(0 == uv_pipe_pending_count(pipe)); ASSERT(pending == UV_UNKNOWN_HANDLE); remote_conn_accepted = 1; uv_close((uv_handle_t*)&channel, NULL); } free(buf->base); } #ifdef _WIN32 static void on_read_listen_after_bound_twice(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { int r; uv_pipe_t* pipe; uv_handle_type pending; pipe = (uv_pipe_t*) handle; if (nread == 0) { /* Everything OK, but nothing read. */ free(buf->base); return; } if (nread < 0) { if (nread == UV_EOF) { free(buf->base); return; } printf("error recving on channel: %s\n", uv_strerror(nread)); abort(); } fprintf(stderr, "got %d bytes\n", (int)nread); ASSERT(uv_pipe_pending_count(pipe) > 0); pending = uv_pipe_pending_type(pipe); ASSERT(nread > 0 && buf->base && pending != UV_UNKNOWN_HANDLE); read_cb_called++; if (read_cb_called == 1) { /* Accept the first TCP server, and start listening on it. */ ASSERT(pending == UV_TCP); r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 12, on_connection); ASSERT(r == 0); } else if (read_cb_called == 2) { /* Accept the second TCP server, and start listening on it. */ ASSERT(pending == UV_TCP); r = uv_tcp_init(uv_default_loop(), &tcp_server2); ASSERT(r == 0); r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server2); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server2, 12, on_connection); ASSERT(r == UV_EADDRINUSE); uv_close((uv_handle_t*)&tcp_server, NULL); uv_close((uv_handle_t*)&tcp_server2, NULL); ASSERT(0 == uv_pipe_pending_count(pipe)); uv_close((uv_handle_t*)&channel, NULL); } free(buf->base); } #endif void spawn_helper(uv_pipe_t* channel, uv_process_t* process, const char* helper) { uv_process_options_t options; size_t exepath_size; char exepath[1024]; char* args[3]; int r; uv_stdio_container_t stdio[1]; r = uv_pipe_init(uv_default_loop(), channel, 1); ASSERT(r == 0); ASSERT(channel->ipc); exepath_size = sizeof(exepath); r = uv_exepath(exepath, &exepath_size); ASSERT(r == 0); exepath[exepath_size] = '\0'; args[0] = exepath; args[1] = (char*)helper; args[2] = NULL; memset(&options, 0, sizeof(options)); options.file = exepath; options.args = args; options.exit_cb = exit_cb; options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE | UV_WRITABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)channel; options.stdio_count = 1; r = uv_spawn(uv_default_loop(), process, &options); ASSERT(r == 0); } static void on_tcp_write(uv_write_t* req, int status) { ASSERT(status == 0); ASSERT(req->handle == (uv_stream_t*)&tcp_connection); tcp_write_cb_called++; } static void on_read_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } static void on_tcp_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ASSERT(nread > 0); ASSERT(memcmp("hello again\n", buf->base, nread) == 0); ASSERT(tcp == (uv_stream_t*)&tcp_connection); free(buf->base); tcp_read_cb_called++; uv_close((uv_handle_t*)tcp, NULL); uv_close((uv_handle_t*)&channel, NULL); } static void on_read_connection(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { int r; uv_buf_t outbuf; uv_pipe_t* pipe; uv_handle_type pending; pipe = (uv_pipe_t*) handle; if (nread == 0) { /* Everything OK, but nothing read. */ free(buf->base); return; } if (nread < 0) { if (nread == UV_EOF) { free(buf->base); return; } printf("error recving on channel: %s\n", uv_strerror(nread)); abort(); } fprintf(stderr, "got %d bytes\n", (int)nread); ASSERT(1 == uv_pipe_pending_count(pipe)); pending = uv_pipe_pending_type(pipe); ASSERT(nread > 0 && buf->base && pending != UV_UNKNOWN_HANDLE); read_cb_called++; /* Accept the pending TCP connection */ ASSERT(pending == UV_TCP); r = uv_tcp_init(uv_default_loop(), &tcp_connection); ASSERT(r == 0); r = uv_accept(handle, (uv_stream_t*)&tcp_connection); ASSERT(r == 0); /* Make sure that the expected data is correctly multiplexed. */ ASSERT(memcmp("hello\n", buf->base, nread) == 0); /* Write/read to/from the connection */ outbuf = uv_buf_init("world\n", 6); r = uv_write(&write_req, (uv_stream_t*)&tcp_connection, &outbuf, 1, on_tcp_write); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&tcp_connection, on_read_alloc, on_tcp_read); ASSERT(r == 0); free(buf->base); } static int run_ipc_test(const char* helper, uv_read_cb read_cb) { uv_process_t process; int r; spawn_helper(&channel, &process, helper); uv_read_start((uv_stream_t*)&channel, on_alloc, read_cb); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(ipc_listen_before_write) { int r = run_ipc_test("ipc_helper_listen_before_write", on_read); ASSERT(local_conn_accepted == 1); ASSERT(remote_conn_accepted == 1); ASSERT(read_cb_called == 1); ASSERT(exit_cb_called == 1); return r; } TEST_IMPL(ipc_listen_after_write) { int r = run_ipc_test("ipc_helper_listen_after_write", on_read); ASSERT(local_conn_accepted == 1); ASSERT(remote_conn_accepted == 1); ASSERT(read_cb_called == 1); ASSERT(exit_cb_called == 1); return r; } TEST_IMPL(ipc_tcp_connection) { int r = run_ipc_test("ipc_helper_tcp_connection", on_read_connection); ASSERT(read_cb_called == 1); ASSERT(tcp_write_cb_called == 1); ASSERT(tcp_read_cb_called == 1); ASSERT(exit_cb_called == 1); return r; } #ifdef _WIN32 TEST_IMPL(listen_with_simultaneous_accepts) { uv_tcp_t server; int r; struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_simultaneous_accepts(&server, 1); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL); ASSERT(r == 0); ASSERT(server.reqs_pending == 32); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(listen_no_simultaneous_accepts) { uv_tcp_t server; int r; struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_simultaneous_accepts(&server, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL); ASSERT(r == 0); ASSERT(server.reqs_pending == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(ipc_listen_after_bind_twice) { int r = run_ipc_test("ipc_helper_bind_twice", on_read_listen_after_bound_twice); ASSERT(read_cb_called == 2); ASSERT(exit_cb_called == 1); return r; } #endif /* Everything here runs in a child process. */ static tcp_conn conn; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void conn_notify_write_cb(uv_write_t* req, int status) { uv_close((uv_handle_t*)&tcp_server, close_cb); uv_close((uv_handle_t*)&channel, close_cb); } static void tcp_connection_write_cb(uv_write_t* req, int status) { ASSERT((uv_handle_t*)&conn.conn == (uv_handle_t*)req->handle); uv_close((uv_handle_t*)req->handle, close_cb); uv_close((uv_handle_t*)&channel, close_cb); uv_close((uv_handle_t*)&tcp_server, close_cb); tcp_conn_write_cb_called++; } static void on_tcp_child_process_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { uv_buf_t outbuf; int r; if (nread < 0) { if (nread == UV_EOF) { free(buf->base); return; } printf("error recving on tcp connection: %s\n", uv_strerror(nread)); abort(); } ASSERT(nread > 0); ASSERT(memcmp("world\n", buf->base, nread) == 0); on_pipe_read_called++; free(buf->base); /* Write to the socket */ outbuf = uv_buf_init("hello again\n", 12); r = uv_write(&conn.tcp_write_req, tcp, &outbuf, 1, tcp_connection_write_cb); ASSERT(r == 0); tcp_conn_read_cb_called++; } static void connect_child_process_cb(uv_connect_t* req, int status) { int r; ASSERT(status == 0); r = uv_read_start(req->handle, on_read_alloc, on_tcp_child_process_read); ASSERT(r == 0); } static void ipc_on_connection(uv_stream_t* server, int status) { int r; uv_buf_t buf; if (!connection_accepted) { /* * Accept the connection and close it. Also let the other * side know. */ ASSERT(status == 0); ASSERT((uv_stream_t*)&tcp_server == server); r = uv_tcp_init(server->loop, &conn.conn); ASSERT(r == 0); r = uv_accept(server, (uv_stream_t*)&conn.conn); ASSERT(r == 0); uv_close((uv_handle_t*)&conn.conn, close_cb); buf = uv_buf_init("accepted_connection\n", 20); r = uv_write2(&conn_notify_req, (uv_stream_t*)&channel, &buf, 1, NULL, conn_notify_write_cb); ASSERT(r == 0); connection_accepted = 1; } } static void ipc_on_connection_tcp_conn(uv_stream_t* server, int status) { int r; uv_buf_t buf; uv_tcp_t* conn; ASSERT(status == 0); ASSERT((uv_stream_t*)&tcp_server == server); conn = malloc(sizeof(*conn)); ASSERT(conn); r = uv_tcp_init(server->loop, conn); ASSERT(r == 0); r = uv_accept(server, (uv_stream_t*)conn); ASSERT(r == 0); /* Send the accepted connection to the other process */ buf = uv_buf_init("hello\n", 6); r = uv_write2(&conn_notify_req, (uv_stream_t*)&channel, &buf, 1, (uv_stream_t*)conn, NULL); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) conn, on_read_alloc, on_tcp_child_process_read); ASSERT(r == 0); uv_close((uv_handle_t*)conn, close_cb); } int ipc_helper(int listen_after_write) { /* * This is launched from test-ipc.c. stdin is a duplex channel that we * over which a handle will be transmitted. */ struct sockaddr_in addr; uv_write_t write_req; int r; uv_buf_t buf; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_pipe_init(uv_default_loop(), &channel, 1); ASSERT(r == 0); uv_pipe_open(&channel, 0); ASSERT(1 == uv_is_readable((uv_stream_t*) &channel)); ASSERT(1 == uv_is_writable((uv_stream_t*) &channel)); ASSERT(0 == uv_is_closing((uv_handle_t*) &channel)); r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); if (!listen_after_write) { r = uv_listen((uv_stream_t*)&tcp_server, 12, ipc_on_connection); ASSERT(r == 0); } buf = uv_buf_init("hello\n", 6); r = uv_write2(&write_req, (uv_stream_t*)&channel, &buf, 1, (uv_stream_t*)&tcp_server, NULL); ASSERT(r == 0); if (listen_after_write) { r = uv_listen((uv_stream_t*)&tcp_server, 12, ipc_on_connection); ASSERT(r == 0); } r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(connection_accepted == 1); ASSERT(close_cb_called == 3); MAKE_VALGRIND_HAPPY(); return 0; } int ipc_helper_tcp_connection(void) { /* * This is launched from test-ipc.c. stdin is a duplex channel * over which a handle will be transmitted. */ int r; struct sockaddr_in addr; r = uv_pipe_init(uv_default_loop(), &channel, 1); ASSERT(r == 0); uv_pipe_open(&channel, 0); ASSERT(1 == uv_is_readable((uv_stream_t*) &channel)); ASSERT(1 == uv_is_writable((uv_stream_t*) &channel)); ASSERT(0 == uv_is_closing((uv_handle_t*) &channel)); r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 12, ipc_on_connection_tcp_conn); ASSERT(r == 0); /* Make a connection to the server */ r = uv_tcp_init(uv_default_loop(), &conn.conn); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_connect(&conn.conn_req, (uv_tcp_t*) &conn.conn, (const struct sockaddr*) &addr, connect_child_process_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(tcp_conn_read_cb_called == 1); ASSERT(tcp_conn_write_cb_called == 1); ASSERT(close_cb_called == 4); MAKE_VALGRIND_HAPPY(); return 0; } int ipc_helper_bind_twice(void) { /* * This is launched from test-ipc.c. stdin is a duplex channel * over which two handles will be transmitted. */ struct sockaddr_in addr; uv_write_t write_req; uv_write_t write_req2; int r; uv_buf_t buf; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_pipe_init(uv_default_loop(), &channel, 1); ASSERT(r == 0); uv_pipe_open(&channel, 0); ASSERT(1 == uv_is_readable((uv_stream_t*) &channel)); ASSERT(1 == uv_is_writable((uv_stream_t*) &channel)); ASSERT(0 == uv_is_closing((uv_handle_t*) &channel)); buf = uv_buf_init("hello\n", 6); r = uv_tcp_init(uv_default_loop(), &tcp_server); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &tcp_server2); ASSERT(r == 0); r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_bind(&tcp_server2, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_write2(&write_req, (uv_stream_t*)&channel, &buf, 1, (uv_stream_t*)&tcp_server, NULL); ASSERT(r == 0); r = uv_write2(&write_req2, (uv_stream_t*)&channel, &buf, 1, (uv_stream_t*)&tcp_server2, NULL); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-list.h0000644000175000017500000004671612502366750020045 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ TEST_DECLARE (platform_output) TEST_DECLARE (callback_order) TEST_DECLARE (close_order) TEST_DECLARE (run_once) TEST_DECLARE (run_nowait) TEST_DECLARE (loop_alive) TEST_DECLARE (loop_close) TEST_DECLARE (loop_stop) TEST_DECLARE (loop_update_time) TEST_DECLARE (loop_backend_timeout) TEST_DECLARE (default_loop_close) TEST_DECLARE (barrier_1) TEST_DECLARE (barrier_2) TEST_DECLARE (barrier_3) TEST_DECLARE (condvar_1) TEST_DECLARE (condvar_2) TEST_DECLARE (condvar_3) TEST_DECLARE (condvar_4) TEST_DECLARE (condvar_5) TEST_DECLARE (semaphore_1) TEST_DECLARE (semaphore_2) TEST_DECLARE (semaphore_3) TEST_DECLARE (tty) TEST_DECLARE (stdio_over_pipes) TEST_DECLARE (ip6_pton) TEST_DECLARE (ipc_listen_before_write) TEST_DECLARE (ipc_listen_after_write) #ifndef _WIN32 TEST_DECLARE (ipc_send_recv_pipe) #endif TEST_DECLARE (ipc_send_recv_tcp) TEST_DECLARE (ipc_tcp_connection) TEST_DECLARE (tcp_ping_pong) TEST_DECLARE (tcp_ping_pong_v6) TEST_DECLARE (pipe_ping_pong) TEST_DECLARE (delayed_accept) TEST_DECLARE (multiple_listen) #ifndef _WIN32 TEST_DECLARE (tcp_write_after_connect) #endif TEST_DECLARE (tcp_writealot) TEST_DECLARE (tcp_try_write) TEST_DECLARE (tcp_write_queue_order) TEST_DECLARE (tcp_open) TEST_DECLARE (tcp_connect_error_after_write) TEST_DECLARE (tcp_shutdown_after_write) TEST_DECLARE (tcp_bind_error_addrinuse) TEST_DECLARE (tcp_bind_error_addrnotavail_1) TEST_DECLARE (tcp_bind_error_addrnotavail_2) TEST_DECLARE (tcp_bind_error_fault) TEST_DECLARE (tcp_bind_error_inval) TEST_DECLARE (tcp_bind_localhost_ok) TEST_DECLARE (tcp_bind_invalid_flags) TEST_DECLARE (tcp_listen_without_bind) TEST_DECLARE (tcp_connect_error_fault) TEST_DECLARE (tcp_connect_timeout) TEST_DECLARE (tcp_close_while_connecting) TEST_DECLARE (tcp_close) #ifndef _WIN32 TEST_DECLARE (tcp_close_accept) #endif TEST_DECLARE (tcp_flags) TEST_DECLARE (tcp_write_to_half_open_connection) TEST_DECLARE (tcp_unexpected_read) TEST_DECLARE (tcp_read_stop) TEST_DECLARE (tcp_bind6_error_addrinuse) TEST_DECLARE (tcp_bind6_error_addrnotavail) TEST_DECLARE (tcp_bind6_error_fault) TEST_DECLARE (tcp_bind6_error_inval) TEST_DECLARE (tcp_bind6_localhost_ok) TEST_DECLARE (udp_bind) TEST_DECLARE (udp_bind_reuseaddr) TEST_DECLARE (udp_send_and_recv) TEST_DECLARE (udp_send_immediate) TEST_DECLARE (udp_send_unreachable) TEST_DECLARE (udp_multicast_join) TEST_DECLARE (udp_multicast_join6) TEST_DECLARE (udp_multicast_ttl) TEST_DECLARE (udp_multicast_interface) TEST_DECLARE (udp_multicast_interface6) TEST_DECLARE (udp_dgram_too_big) TEST_DECLARE (udp_dual_stack) TEST_DECLARE (udp_ipv6_only) TEST_DECLARE (udp_options) TEST_DECLARE (udp_no_autobind) TEST_DECLARE (udp_open) TEST_DECLARE (udp_try_send) TEST_DECLARE (pipe_bind_error_addrinuse) TEST_DECLARE (pipe_bind_error_addrnotavail) TEST_DECLARE (pipe_bind_error_inval) TEST_DECLARE (pipe_listen_without_bind) TEST_DECLARE (pipe_connect_bad_name) TEST_DECLARE (pipe_connect_to_file) TEST_DECLARE (pipe_getsockname) TEST_DECLARE (pipe_getsockname_abstract) TEST_DECLARE (pipe_getsockname_blocking) TEST_DECLARE (pipe_sendmsg) TEST_DECLARE (pipe_server_close) TEST_DECLARE (connection_fail) TEST_DECLARE (connection_fail_doesnt_auto_close) TEST_DECLARE (shutdown_close_tcp) TEST_DECLARE (shutdown_close_pipe) TEST_DECLARE (shutdown_eof) TEST_DECLARE (shutdown_twice) TEST_DECLARE (callback_stack) TEST_DECLARE (error_message) TEST_DECLARE (timer) TEST_DECLARE (timer_init) TEST_DECLARE (timer_again) TEST_DECLARE (timer_start_twice) TEST_DECLARE (timer_order) TEST_DECLARE (timer_huge_timeout) TEST_DECLARE (timer_huge_repeat) TEST_DECLARE (timer_run_once) TEST_DECLARE (timer_from_check) TEST_DECLARE (timer_null_callback) TEST_DECLARE (idle_starvation) TEST_DECLARE (loop_handles) TEST_DECLARE (get_loadavg) TEST_DECLARE (walk_handles) TEST_DECLARE (watcher_cross_stop) TEST_DECLARE (ref) TEST_DECLARE (idle_ref) TEST_DECLARE (async_ref) TEST_DECLARE (prepare_ref) TEST_DECLARE (check_ref) TEST_DECLARE (unref_in_prepare_cb) TEST_DECLARE (timer_ref) TEST_DECLARE (timer_ref2) TEST_DECLARE (fs_event_ref) TEST_DECLARE (fs_poll_ref) TEST_DECLARE (tcp_ref) TEST_DECLARE (tcp_ref2) TEST_DECLARE (tcp_ref2b) TEST_DECLARE (tcp_ref3) TEST_DECLARE (tcp_ref4) TEST_DECLARE (udp_ref) TEST_DECLARE (udp_ref2) TEST_DECLARE (udp_ref3) TEST_DECLARE (pipe_ref) TEST_DECLARE (pipe_ref2) TEST_DECLARE (pipe_ref3) TEST_DECLARE (pipe_ref4) #ifndef _WIN32 TEST_DECLARE (pipe_close_stdout_read_stdin) #endif TEST_DECLARE (process_ref) TEST_DECLARE (has_ref) TEST_DECLARE (active) TEST_DECLARE (embed) TEST_DECLARE (async) TEST_DECLARE (async_null_cb) TEST_DECLARE (get_currentexe) TEST_DECLARE (process_title) TEST_DECLARE (cwd_and_chdir) TEST_DECLARE (get_memory) TEST_DECLARE (handle_fileno) TEST_DECLARE (hrtime) TEST_DECLARE (getaddrinfo_fail) TEST_DECLARE (getaddrinfo_basic) TEST_DECLARE (getaddrinfo_concurrent) TEST_DECLARE (getnameinfo_basic_ip4) TEST_DECLARE (getnameinfo_basic_ip6) TEST_DECLARE (getsockname_tcp) TEST_DECLARE (getsockname_udp) TEST_DECLARE (fail_always) TEST_DECLARE (pass_always) TEST_DECLARE (socket_buffer_size) TEST_DECLARE (spawn_fails) TEST_DECLARE (spawn_exit_code) TEST_DECLARE (spawn_stdout) TEST_DECLARE (spawn_stdin) TEST_DECLARE (spawn_stdio_greater_than_3) TEST_DECLARE (spawn_ignored_stdio) TEST_DECLARE (spawn_and_kill) TEST_DECLARE (spawn_detached) TEST_DECLARE (spawn_and_kill_with_std) TEST_DECLARE (spawn_and_ping) TEST_DECLARE (spawn_preserve_env) TEST_DECLARE (spawn_setuid_fails) TEST_DECLARE (spawn_setgid_fails) TEST_DECLARE (spawn_stdout_to_file) TEST_DECLARE (spawn_stdout_and_stderr_to_file) TEST_DECLARE (spawn_auto_unref) TEST_DECLARE (spawn_closed_process_io) TEST_DECLARE (spawn_reads_child_path) TEST_DECLARE (fs_poll) TEST_DECLARE (fs_poll_getpath) TEST_DECLARE (kill) TEST_DECLARE (fs_file_noent) TEST_DECLARE (fs_file_nametoolong) TEST_DECLARE (fs_file_loop) TEST_DECLARE (fs_file_async) TEST_DECLARE (fs_file_sync) TEST_DECLARE (fs_file_write_null_buffer) TEST_DECLARE (fs_async_dir) TEST_DECLARE (fs_async_sendfile) TEST_DECLARE (fs_mkdtemp) TEST_DECLARE (fs_fstat) TEST_DECLARE (fs_access) TEST_DECLARE (fs_chmod) TEST_DECLARE (fs_chown) TEST_DECLARE (fs_link) TEST_DECLARE (fs_readlink) TEST_DECLARE (fs_symlink) TEST_DECLARE (fs_symlink_dir) TEST_DECLARE (fs_utime) TEST_DECLARE (fs_futime) TEST_DECLARE (fs_file_open_append) TEST_DECLARE (fs_stat_missing_path) TEST_DECLARE (fs_read_file_eof) TEST_DECLARE (fs_event_watch_dir) TEST_DECLARE (fs_event_watch_file) TEST_DECLARE (fs_event_watch_file_twice) TEST_DECLARE (fs_event_watch_file_current_dir) TEST_DECLARE (fs_event_no_callback_after_close) TEST_DECLARE (fs_event_no_callback_on_close) TEST_DECLARE (fs_event_immediate_close) TEST_DECLARE (fs_event_close_with_pending_event) TEST_DECLARE (fs_event_close_in_callback) TEST_DECLARE (fs_event_start_and_close) TEST_DECLARE (fs_event_error_reporting) TEST_DECLARE (fs_event_getpath) TEST_DECLARE (fs_scandir_empty_dir) TEST_DECLARE (fs_scandir_file) TEST_DECLARE (fs_open_dir) TEST_DECLARE (fs_rename_to_existing_file) TEST_DECLARE (fs_write_multiple_bufs) TEST_DECLARE (threadpool_queue_work_simple) TEST_DECLARE (threadpool_queue_work_einval) TEST_DECLARE (threadpool_multiple_event_loops) TEST_DECLARE (threadpool_cancel_getaddrinfo) TEST_DECLARE (threadpool_cancel_getnameinfo) TEST_DECLARE (threadpool_cancel_work) TEST_DECLARE (threadpool_cancel_fs) TEST_DECLARE (threadpool_cancel_single) TEST_DECLARE (thread_local_storage) TEST_DECLARE (thread_mutex) TEST_DECLARE (thread_rwlock) TEST_DECLARE (thread_create) TEST_DECLARE (thread_equal) TEST_DECLARE (dlerror) TEST_DECLARE (poll_duplex) TEST_DECLARE (poll_unidirectional) TEST_DECLARE (poll_close) TEST_DECLARE (ip4_addr) TEST_DECLARE (ip6_addr_link_local) #ifdef _WIN32 TEST_DECLARE (poll_closesocket) TEST_DECLARE (spawn_detect_pipe_name_collisions_on_windows) TEST_DECLARE (argument_escaping) TEST_DECLARE (environment_creation) TEST_DECLARE (listen_with_simultaneous_accepts) TEST_DECLARE (listen_no_simultaneous_accepts) TEST_DECLARE (fs_stat_root) TEST_DECLARE (spawn_with_an_odd_path) TEST_DECLARE (ipc_listen_after_bind_twice) #else TEST_DECLARE (emfile) TEST_DECLARE (close_fd) TEST_DECLARE (spawn_fs_open) TEST_DECLARE (spawn_setuid_setgid) TEST_DECLARE (we_get_signal) TEST_DECLARE (we_get_signals) TEST_DECLARE (signal_multiple_loops) TEST_DECLARE (closed_fd_events) #endif #ifdef __APPLE__ TEST_DECLARE (osx_select) TEST_DECLARE (osx_select_many_fds) #endif HELPER_DECLARE (tcp4_echo_server) HELPER_DECLARE (tcp6_echo_server) HELPER_DECLARE (udp4_echo_server) HELPER_DECLARE (pipe_echo_server) TASK_LIST_START TEST_ENTRY_CUSTOM (platform_output, 0, 1, 5000) #if 0 TEST_ENTRY (callback_order) #endif TEST_ENTRY (close_order) TEST_ENTRY (run_once) TEST_ENTRY (run_nowait) TEST_ENTRY (loop_alive) TEST_ENTRY (loop_close) TEST_ENTRY (loop_stop) TEST_ENTRY (loop_update_time) TEST_ENTRY (loop_backend_timeout) TEST_ENTRY (default_loop_close) TEST_ENTRY (barrier_1) TEST_ENTRY (barrier_2) TEST_ENTRY (barrier_3) TEST_ENTRY (condvar_1) TEST_ENTRY (condvar_2) TEST_ENTRY (condvar_3) TEST_ENTRY (condvar_4) TEST_ENTRY (condvar_5) TEST_ENTRY (semaphore_1) TEST_ENTRY (semaphore_2) TEST_ENTRY (semaphore_3) TEST_ENTRY (pipe_connect_bad_name) TEST_ENTRY (pipe_connect_to_file) TEST_ENTRY (pipe_server_close) #ifndef _WIN32 TEST_ENTRY (pipe_close_stdout_read_stdin) #endif TEST_ENTRY (tty) TEST_ENTRY (stdio_over_pipes) TEST_ENTRY (ip6_pton) TEST_ENTRY (ipc_listen_before_write) TEST_ENTRY (ipc_listen_after_write) #ifndef _WIN32 TEST_ENTRY (ipc_send_recv_pipe) #endif TEST_ENTRY (ipc_send_recv_tcp) TEST_ENTRY (ipc_tcp_connection) TEST_ENTRY (tcp_ping_pong) TEST_HELPER (tcp_ping_pong, tcp4_echo_server) TEST_ENTRY (tcp_ping_pong_v6) TEST_HELPER (tcp_ping_pong_v6, tcp6_echo_server) TEST_ENTRY (pipe_ping_pong) TEST_HELPER (pipe_ping_pong, pipe_echo_server) TEST_ENTRY (delayed_accept) TEST_ENTRY (multiple_listen) #ifndef _WIN32 TEST_ENTRY (tcp_write_after_connect) #endif TEST_ENTRY (tcp_writealot) TEST_HELPER (tcp_writealot, tcp4_echo_server) TEST_ENTRY (tcp_try_write) TEST_ENTRY (tcp_write_queue_order) TEST_ENTRY (tcp_open) TEST_HELPER (tcp_open, tcp4_echo_server) TEST_ENTRY (tcp_shutdown_after_write) TEST_HELPER (tcp_shutdown_after_write, tcp4_echo_server) TEST_ENTRY (tcp_connect_error_after_write) TEST_ENTRY (tcp_bind_error_addrinuse) TEST_ENTRY (tcp_bind_error_addrnotavail_1) TEST_ENTRY (tcp_bind_error_addrnotavail_2) TEST_ENTRY (tcp_bind_error_fault) TEST_ENTRY (tcp_bind_error_inval) TEST_ENTRY (tcp_bind_localhost_ok) TEST_ENTRY (tcp_bind_invalid_flags) TEST_ENTRY (tcp_listen_without_bind) TEST_ENTRY (tcp_connect_error_fault) TEST_ENTRY (tcp_connect_timeout) TEST_ENTRY (tcp_close_while_connecting) TEST_ENTRY (tcp_close) #ifndef _WIN32 TEST_ENTRY (tcp_close_accept) #endif TEST_ENTRY (tcp_flags) TEST_ENTRY (tcp_write_to_half_open_connection) TEST_ENTRY (tcp_unexpected_read) TEST_ENTRY (tcp_read_stop) TEST_HELPER (tcp_read_stop, tcp4_echo_server) TEST_ENTRY (tcp_bind6_error_addrinuse) TEST_ENTRY (tcp_bind6_error_addrnotavail) TEST_ENTRY (tcp_bind6_error_fault) TEST_ENTRY (tcp_bind6_error_inval) TEST_ENTRY (tcp_bind6_localhost_ok) TEST_ENTRY (udp_bind) TEST_ENTRY (udp_bind_reuseaddr) TEST_ENTRY (udp_send_and_recv) TEST_ENTRY (udp_send_immediate) TEST_ENTRY (udp_send_unreachable) TEST_ENTRY (udp_dgram_too_big) TEST_ENTRY (udp_dual_stack) TEST_ENTRY (udp_ipv6_only) TEST_ENTRY (udp_options) TEST_ENTRY (udp_no_autobind) TEST_ENTRY (udp_multicast_interface) TEST_ENTRY (udp_multicast_interface6) TEST_ENTRY (udp_multicast_join) TEST_ENTRY (udp_multicast_join6) TEST_ENTRY (udp_multicast_ttl) TEST_ENTRY (udp_try_send) TEST_ENTRY (udp_open) TEST_HELPER (udp_open, udp4_echo_server) TEST_ENTRY (pipe_bind_error_addrinuse) TEST_ENTRY (pipe_bind_error_addrnotavail) TEST_ENTRY (pipe_bind_error_inval) TEST_ENTRY (pipe_listen_without_bind) TEST_ENTRY (pipe_getsockname) TEST_ENTRY (pipe_getsockname_abstract) TEST_ENTRY (pipe_getsockname_blocking) TEST_ENTRY (pipe_sendmsg) TEST_ENTRY (connection_fail) TEST_ENTRY (connection_fail_doesnt_auto_close) TEST_ENTRY (shutdown_close_tcp) TEST_HELPER (shutdown_close_tcp, tcp4_echo_server) TEST_ENTRY (shutdown_close_pipe) TEST_HELPER (shutdown_close_pipe, pipe_echo_server) TEST_ENTRY (shutdown_eof) TEST_HELPER (shutdown_eof, tcp4_echo_server) TEST_ENTRY (shutdown_twice) TEST_HELPER (shutdown_twice, tcp4_echo_server) TEST_ENTRY (callback_stack) TEST_HELPER (callback_stack, tcp4_echo_server) TEST_ENTRY (error_message) TEST_ENTRY (timer) TEST_ENTRY (timer_init) TEST_ENTRY (timer_again) TEST_ENTRY (timer_start_twice) TEST_ENTRY (timer_order) TEST_ENTRY (timer_huge_timeout) TEST_ENTRY (timer_huge_repeat) TEST_ENTRY (timer_run_once) TEST_ENTRY (timer_from_check) TEST_ENTRY (timer_null_callback) TEST_ENTRY (idle_starvation) TEST_ENTRY (ref) TEST_ENTRY (idle_ref) TEST_ENTRY (fs_poll_ref) TEST_ENTRY (async_ref) TEST_ENTRY (prepare_ref) TEST_ENTRY (check_ref) TEST_ENTRY (unref_in_prepare_cb) TEST_ENTRY (timer_ref) TEST_ENTRY (timer_ref2) TEST_ENTRY (fs_event_ref) TEST_ENTRY (tcp_ref) TEST_ENTRY (tcp_ref2) TEST_ENTRY (tcp_ref2b) TEST_ENTRY (tcp_ref3) TEST_HELPER (tcp_ref3, tcp4_echo_server) TEST_ENTRY (tcp_ref4) TEST_HELPER (tcp_ref4, tcp4_echo_server) TEST_ENTRY (udp_ref) TEST_ENTRY (udp_ref2) TEST_ENTRY (udp_ref3) TEST_HELPER (udp_ref3, udp4_echo_server) TEST_ENTRY (pipe_ref) TEST_ENTRY (pipe_ref2) TEST_ENTRY (pipe_ref3) TEST_HELPER (pipe_ref3, pipe_echo_server) TEST_ENTRY (pipe_ref4) TEST_HELPER (pipe_ref4, pipe_echo_server) TEST_ENTRY (process_ref) TEST_ENTRY (has_ref) TEST_ENTRY (loop_handles) TEST_ENTRY (walk_handles) TEST_ENTRY (watcher_cross_stop) TEST_ENTRY (active) TEST_ENTRY (embed) TEST_ENTRY (async) TEST_ENTRY (async_null_cb) TEST_ENTRY (get_currentexe) TEST_ENTRY (process_title) TEST_ENTRY (cwd_and_chdir) TEST_ENTRY (get_memory) TEST_ENTRY (get_loadavg) TEST_ENTRY (handle_fileno) TEST_ENTRY (hrtime) TEST_ENTRY_CUSTOM (getaddrinfo_fail, 0, 0, 10000) TEST_ENTRY (getaddrinfo_basic) TEST_ENTRY (getaddrinfo_concurrent) TEST_ENTRY (getnameinfo_basic_ip4) TEST_ENTRY (getnameinfo_basic_ip6) TEST_ENTRY (getsockname_tcp) TEST_ENTRY (getsockname_udp) TEST_ENTRY (poll_duplex) TEST_ENTRY (poll_unidirectional) TEST_ENTRY (poll_close) TEST_ENTRY (socket_buffer_size) TEST_ENTRY (spawn_fails) TEST_ENTRY (spawn_exit_code) TEST_ENTRY (spawn_stdout) TEST_ENTRY (spawn_stdin) TEST_ENTRY (spawn_stdio_greater_than_3) TEST_ENTRY (spawn_ignored_stdio) TEST_ENTRY (spawn_and_kill) TEST_ENTRY (spawn_detached) TEST_ENTRY (spawn_and_kill_with_std) TEST_ENTRY (spawn_and_ping) TEST_ENTRY (spawn_preserve_env) TEST_ENTRY (spawn_setuid_fails) TEST_ENTRY (spawn_setgid_fails) TEST_ENTRY (spawn_stdout_to_file) TEST_ENTRY (spawn_stdout_and_stderr_to_file) TEST_ENTRY (spawn_auto_unref) TEST_ENTRY (spawn_closed_process_io) TEST_ENTRY (spawn_reads_child_path) TEST_ENTRY (fs_poll) TEST_ENTRY (fs_poll_getpath) TEST_ENTRY (kill) #ifdef _WIN32 TEST_ENTRY (poll_closesocket) TEST_ENTRY (spawn_detect_pipe_name_collisions_on_windows) TEST_ENTRY (argument_escaping) TEST_ENTRY (environment_creation) TEST_ENTRY (listen_with_simultaneous_accepts) TEST_ENTRY (listen_no_simultaneous_accepts) TEST_ENTRY (fs_stat_root) TEST_ENTRY (spawn_with_an_odd_path) TEST_ENTRY (ipc_listen_after_bind_twice) #else TEST_ENTRY (emfile) TEST_ENTRY (close_fd) TEST_ENTRY (spawn_fs_open) TEST_ENTRY (spawn_setuid_setgid) TEST_ENTRY (we_get_signal) TEST_ENTRY (we_get_signals) TEST_ENTRY (signal_multiple_loops) TEST_ENTRY (closed_fd_events) #endif #ifdef __APPLE__ TEST_ENTRY (osx_select) TEST_ENTRY (osx_select_many_fds) #endif TEST_ENTRY (fs_file_noent) TEST_ENTRY (fs_file_nametoolong) TEST_ENTRY (fs_file_loop) TEST_ENTRY (fs_file_async) TEST_ENTRY (fs_file_sync) TEST_ENTRY (fs_file_write_null_buffer) TEST_ENTRY (fs_async_dir) TEST_ENTRY (fs_async_sendfile) TEST_ENTRY (fs_mkdtemp) TEST_ENTRY (fs_fstat) TEST_ENTRY (fs_access) TEST_ENTRY (fs_chmod) TEST_ENTRY (fs_chown) TEST_ENTRY (fs_utime) TEST_ENTRY (fs_futime) TEST_ENTRY (fs_readlink) TEST_ENTRY (fs_symlink) TEST_ENTRY (fs_symlink_dir) TEST_ENTRY (fs_stat_missing_path) TEST_ENTRY (fs_read_file_eof) TEST_ENTRY (fs_file_open_append) TEST_ENTRY (fs_event_watch_dir) TEST_ENTRY (fs_event_watch_file) TEST_ENTRY (fs_event_watch_file_twice) TEST_ENTRY (fs_event_watch_file_current_dir) TEST_ENTRY (fs_event_no_callback_after_close) TEST_ENTRY (fs_event_no_callback_on_close) TEST_ENTRY (fs_event_immediate_close) TEST_ENTRY (fs_event_close_with_pending_event) TEST_ENTRY (fs_event_close_in_callback) TEST_ENTRY (fs_event_start_and_close) TEST_ENTRY (fs_event_error_reporting) TEST_ENTRY (fs_event_getpath) TEST_ENTRY (fs_scandir_empty_dir) TEST_ENTRY (fs_scandir_file) TEST_ENTRY (fs_open_dir) TEST_ENTRY (fs_rename_to_existing_file) TEST_ENTRY (fs_write_multiple_bufs) TEST_ENTRY (threadpool_queue_work_simple) TEST_ENTRY (threadpool_queue_work_einval) TEST_ENTRY (threadpool_multiple_event_loops) TEST_ENTRY (threadpool_cancel_getaddrinfo) TEST_ENTRY (threadpool_cancel_getnameinfo) TEST_ENTRY (threadpool_cancel_work) TEST_ENTRY (threadpool_cancel_fs) TEST_ENTRY (threadpool_cancel_single) TEST_ENTRY (thread_local_storage) TEST_ENTRY (thread_mutex) TEST_ENTRY (thread_rwlock) TEST_ENTRY (thread_create) TEST_ENTRY (thread_equal) TEST_ENTRY (dlerror) TEST_ENTRY (ip4_addr) TEST_ENTRY (ip6_addr_link_local) #if 0 /* These are for testing the test runner. */ TEST_ENTRY (fail_always) TEST_ENTRY (pass_always) #endif TASK_LIST_END MoarVM-2015.11/3rdparty/libuv/test/test-loop-alive.c0000644000175000017500000000414612456307253021124 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_timer_t timer_handle; static void timer_cb(uv_timer_t* handle) { ASSERT(handle); } static uv_work_t work_req; static void work_cb(uv_work_t* req) { ASSERT(req); } static void after_work_cb(uv_work_t* req, int status) { ASSERT(req); ASSERT(status == 0); } TEST_IMPL(loop_alive) { int r; ASSERT(!uv_loop_alive(uv_default_loop())); /* loops with handles are alive */ uv_timer_init(uv_default_loop(), &timer_handle); uv_timer_start(&timer_handle, timer_cb, 100, 0); ASSERT(uv_loop_alive(uv_default_loop())); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(!uv_loop_alive(uv_default_loop())); /* loops with requests are alive */ r = uv_queue_work(uv_default_loop(), &work_req, work_cb, after_work_cb); ASSERT(r == 0); ASSERT(uv_loop_alive(uv_default_loop())); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(!uv_loop_alive(uv_default_loop())); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-loop-close.c0000644000175000017500000000330312456307253021123 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_timer_t timer_handle; static void timer_cb(uv_timer_t* handle) { ASSERT(handle); uv_stop(handle->loop); } TEST_IMPL(loop_close) { int r; uv_loop_t loop; ASSERT(0 == uv_loop_init(&loop)); uv_timer_init(&loop, &timer_handle); uv_timer_start(&timer_handle, timer_cb, 100, 100); ASSERT(UV_EBUSY == uv_loop_close(&loop)); uv_run(&loop, UV_RUN_DEFAULT); uv_close((uv_handle_t*) &timer_handle, NULL); r = uv_run(&loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(0 == uv_loop_close(&loop)); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-loop-handles.c0000644000175000017500000002261212456307253021440 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* Tests commented out with XXX are ones that are failing on Linux */ /* * Purpose of this test is to check semantics of starting and stopping * prepare, check and idle watchers. * * - A watcher must be able to safely stop or close itself; * - Once a watcher is stopped or closed its callback should never be called. * - If a watcher is closed, it is implicitly stopped and its close_cb should * be called exactly once. * - A watcher can safely start and stop other watchers of the same type. * - Prepare and check watchers are called once per event loop iterations. * - All active idle watchers are queued when the event loop has no more work * to do. This is done repeatedly until all idle watchers are inactive. * - If a watcher starts another watcher of the same type its callback is not * immediately queued. For check and prepare watchers, that means that if * a watcher makes another of the same type active, it'll not be called until * the next event loop iteration. For idle. watchers this means that the * newly activated idle watcher might not be queued immediately. * - Prepare, check, idle watchers keep the event loop alive even when they're * not active. * * This is what the test globally does: * * - prepare_1 is always active and counts event loop iterations. It also * creates and starts prepare_2 every other iteration. Finally it verifies * that no idle watchers are active before polling. * - prepare_2 is started by prepare_1 every other iteration. It immediately * stops itself. It verifies that a watcher is not queued immediately * if created by another watcher of the same type. * - There's a check watcher that stops the event loop after a certain number * of iterations. It starts a varying number of idle_1 watchers. * - Idle_1 watchers stop themselves after being called a few times. All idle_1 * watchers try to start the idle_2 watcher if it is not already started or * awaiting its close callback. * - The idle_2 watcher always exists but immediately closes itself after * being started by a check_1 watcher. It verifies that a watcher is * implicitly stopped when closed, and that a watcher can close itself * safely. * - There is a repeating timer. It does not keep the event loop alive * (ev_unref) but makes sure that the loop keeps polling the system for * events. */ #include "uv.h" #include "task.h" #include #define IDLE_COUNT 7 #define ITERATIONS 21 #define TIMEOUT 100 static uv_prepare_t prepare_1_handle; static uv_prepare_t prepare_2_handle; static uv_check_t check_handle; static uv_idle_t idle_1_handles[IDLE_COUNT]; static uv_idle_t idle_2_handle; static uv_timer_t timer_handle; static int loop_iteration = 0; static int prepare_1_cb_called = 0; static int prepare_1_close_cb_called = 0; static int prepare_2_cb_called = 0; static int prepare_2_close_cb_called = 0; static int check_cb_called = 0; static int check_close_cb_called = 0; static int idle_1_cb_called = 0; static int idle_1_close_cb_called = 0; static int idles_1_active = 0; static int idle_2_cb_called = 0; static int idle_2_close_cb_called = 0; static int idle_2_cb_started = 0; static int idle_2_is_active = 0; static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer_handle); } static void idle_2_close_cb(uv_handle_t* handle) { LOG("IDLE_2_CLOSE_CB\n"); ASSERT(handle == (uv_handle_t*)&idle_2_handle); ASSERT(idle_2_is_active); idle_2_close_cb_called++; idle_2_is_active = 0; } static void idle_2_cb(uv_idle_t* handle) { LOG("IDLE_2_CB\n"); ASSERT(handle == &idle_2_handle); idle_2_cb_called++; uv_close((uv_handle_t*)handle, idle_2_close_cb); } static void idle_1_cb(uv_idle_t* handle) { int r; LOG("IDLE_1_CB\n"); ASSERT(handle != NULL); ASSERT(idles_1_active > 0); /* Init idle_2 and make it active */ if (!idle_2_is_active && !uv_is_closing((uv_handle_t*)&idle_2_handle)) { r = uv_idle_init(uv_default_loop(), &idle_2_handle); ASSERT(r == 0); r = uv_idle_start(&idle_2_handle, idle_2_cb); ASSERT(r == 0); idle_2_is_active = 1; idle_2_cb_started++; } idle_1_cb_called++; if (idle_1_cb_called % 5 == 0) { r = uv_idle_stop((uv_idle_t*)handle); ASSERT(r == 0); idles_1_active--; } } static void idle_1_close_cb(uv_handle_t* handle) { LOG("IDLE_1_CLOSE_CB\n"); ASSERT(handle != NULL); idle_1_close_cb_called++; } static void prepare_1_close_cb(uv_handle_t* handle) { LOG("PREPARE_1_CLOSE_CB"); ASSERT(handle == (uv_handle_t*)&prepare_1_handle); prepare_1_close_cb_called++; } static void check_close_cb(uv_handle_t* handle) { LOG("CHECK_CLOSE_CB\n"); ASSERT(handle == (uv_handle_t*)&check_handle); check_close_cb_called++; } static void prepare_2_close_cb(uv_handle_t* handle) { LOG("PREPARE_2_CLOSE_CB\n"); ASSERT(handle == (uv_handle_t*)&prepare_2_handle); prepare_2_close_cb_called++; } static void check_cb(uv_check_t* handle) { int i, r; LOG("CHECK_CB\n"); ASSERT(handle == &check_handle); if (loop_iteration < ITERATIONS) { /* Make some idle watchers active */ for (i = 0; i < 1 + (loop_iteration % IDLE_COUNT); i++) { r = uv_idle_start(&idle_1_handles[i], idle_1_cb); ASSERT(r == 0); idles_1_active++; } } else { /* End of the test - close all handles */ uv_close((uv_handle_t*)&prepare_1_handle, prepare_1_close_cb); uv_close((uv_handle_t*)&check_handle, check_close_cb); uv_close((uv_handle_t*)&prepare_2_handle, prepare_2_close_cb); for (i = 0; i < IDLE_COUNT; i++) { uv_close((uv_handle_t*)&idle_1_handles[i], idle_1_close_cb); } /* This handle is closed/recreated every time, close it only if it is */ /* active.*/ if (idle_2_is_active) { uv_close((uv_handle_t*)&idle_2_handle, idle_2_close_cb); } } check_cb_called++; } static void prepare_2_cb(uv_prepare_t* handle) { int r; LOG("PREPARE_2_CB\n"); ASSERT(handle == &prepare_2_handle); /* prepare_2 gets started by prepare_1 when (loop_iteration % 2 == 0), */ /* and it stops itself immediately. A started watcher is not queued */ /* until the next round, so when this callback is made */ /* (loop_iteration % 2 == 0) cannot be true. */ ASSERT(loop_iteration % 2 != 0); r = uv_prepare_stop((uv_prepare_t*)handle); ASSERT(r == 0); prepare_2_cb_called++; } static void prepare_1_cb(uv_prepare_t* handle) { int r; LOG("PREPARE_1_CB\n"); ASSERT(handle == &prepare_1_handle); if (loop_iteration % 2 == 0) { r = uv_prepare_start(&prepare_2_handle, prepare_2_cb); ASSERT(r == 0); } prepare_1_cb_called++; loop_iteration++; printf("Loop iteration %d of %d.\n", loop_iteration, ITERATIONS); } TEST_IMPL(loop_handles) { int i; int r; r = uv_prepare_init(uv_default_loop(), &prepare_1_handle); ASSERT(r == 0); r = uv_prepare_start(&prepare_1_handle, prepare_1_cb); ASSERT(r == 0); r = uv_check_init(uv_default_loop(), &check_handle); ASSERT(r == 0); r = uv_check_start(&check_handle, check_cb); ASSERT(r == 0); /* initialize only, prepare_2 is started by prepare_1_cb */ r = uv_prepare_init(uv_default_loop(), &prepare_2_handle); ASSERT(r == 0); for (i = 0; i < IDLE_COUNT; i++) { /* initialize only, idle_1 handles are started by check_cb */ r = uv_idle_init(uv_default_loop(), &idle_1_handles[i]); ASSERT(r == 0); } /* don't init or start idle_2, both is done by idle_1_cb */ /* the timer callback is there to keep the event loop polling */ /* unref it as it is not supposed to keep the loop alive */ r = uv_timer_init(uv_default_loop(), &timer_handle); ASSERT(r == 0); r = uv_timer_start(&timer_handle, timer_cb, TIMEOUT, TIMEOUT); ASSERT(r == 0); uv_unref((uv_handle_t*)&timer_handle); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(loop_iteration == ITERATIONS); ASSERT(prepare_1_cb_called == ITERATIONS); ASSERT(prepare_1_close_cb_called == 1); ASSERT(prepare_2_cb_called == floor(ITERATIONS / 2.0)); ASSERT(prepare_2_close_cb_called == 1); ASSERT(check_cb_called == ITERATIONS); ASSERT(check_close_cb_called == 1); /* idle_1_cb should be called a lot */ ASSERT(idle_1_close_cb_called == IDLE_COUNT); ASSERT(idle_2_close_cb_called == idle_2_cb_started); ASSERT(idle_2_is_active == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-loop-stop.c0000644000175000017500000000442112456307253021005 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_prepare_t prepare_handle; static uv_timer_t timer_handle; static int prepare_called = 0; static int timer_called = 0; static int num_ticks = 10; static void prepare_cb(uv_prepare_t* handle) { ASSERT(handle == &prepare_handle); prepare_called++; if (prepare_called == num_ticks) uv_prepare_stop(handle); } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer_handle); timer_called++; if (timer_called == 1) uv_stop(uv_default_loop()); else if (timer_called == num_ticks) uv_timer_stop(handle); } TEST_IMPL(loop_stop) { int r; uv_prepare_init(uv_default_loop(), &prepare_handle); uv_prepare_start(&prepare_handle, prepare_cb); uv_timer_init(uv_default_loop(), &timer_handle); uv_timer_start(&timer_handle, timer_cb, 100, 100); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r != 0); ASSERT(timer_called == 1); r = uv_run(uv_default_loop(), UV_RUN_NOWAIT); ASSERT(r != 0); ASSERT(prepare_called > 1); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(timer_called == 10); ASSERT(prepare_called == 10); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-loop-time.c0000644000175000017500000000401312456307253020753 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" TEST_IMPL(loop_update_time) { uint64_t start; start = uv_now(uv_default_loop()); while (uv_now(uv_default_loop()) - start < 1000) ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_NOWAIT)); MAKE_VALGRIND_HAPPY(); return 0; } static void cb(uv_timer_t* timer) { uv_close((uv_handle_t*)timer, NULL); } TEST_IMPL(loop_backend_timeout) { uv_loop_t *loop = uv_default_loop(); uv_timer_t timer; int r; r = uv_timer_init(loop, &timer); ASSERT(r == 0); ASSERT(!uv_loop_alive(loop)); ASSERT(uv_backend_timeout(loop) == 0); r = uv_timer_start(&timer, cb, 1000, 0); /* 1 sec */ ASSERT(r == 0); ASSERT(uv_backend_timeout(loop) > 100); /* 0.1 sec */ ASSERT(uv_backend_timeout(loop) <= 1000); /* 1 sec */ r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(uv_backend_timeout(loop) == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-multiple-listen.c0000644000175000017500000000564212456307253022206 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int connection_cb_called = 0; static int close_cb_called = 0; static int connect_cb_called = 0; static uv_tcp_t server; static uv_tcp_t client; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void connection_cb(uv_stream_t* tcp, int status) { ASSERT(status == 0); uv_close((uv_handle_t*)&server, close_cb); connection_cb_called++; } static void start_server(void) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, 128, connection_cb); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, 128, connection_cb); ASSERT(r == 0); } static void connect_cb(uv_connect_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); free(req); uv_close((uv_handle_t*)&client, close_cb); connect_cb_called++; } static void client_connect(void) { struct sockaddr_in addr; uv_connect_t* connect_req = malloc(sizeof *connect_req); int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(connect_req != NULL); r = uv_tcp_init(uv_default_loop(), &client); ASSERT(r == 0); r = uv_tcp_connect(connect_req, &client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); } TEST_IMPL(multiple_listen) { start_server(); client_connect(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connection_cb_called == 1); ASSERT(connect_cb_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-mutexes.c0000644000175000017500000000346212456307253020547 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* The mutex and rwlock tests are really poor. * They're very basic sanity checks and nothing more. * Apologies if that rhymes. */ TEST_IMPL(thread_mutex) { uv_mutex_t mutex; int r; r = uv_mutex_init(&mutex); ASSERT(r == 0); uv_mutex_lock(&mutex); uv_mutex_unlock(&mutex); uv_mutex_destroy(&mutex); return 0; } TEST_IMPL(thread_rwlock) { uv_rwlock_t rwlock; int r; r = uv_rwlock_init(&rwlock); ASSERT(r == 0); uv_rwlock_rdlock(&rwlock); uv_rwlock_rdunlock(&rwlock); uv_rwlock_wrlock(&rwlock); uv_rwlock_wrunlock(&rwlock); uv_rwlock_destroy(&rwlock); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-osx-select.c0000644000175000017500000000635012502366750021141 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #ifdef __APPLE__ #include #include static int read_count; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { static char slab[1024]; buf->base = slab; buf->len = sizeof(slab); } static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { fprintf(stdout, "got data %d\n", ++read_count); if (read_count == 3) uv_close((uv_handle_t*) stream, NULL); } TEST_IMPL(osx_select) { int r; int fd; size_t i; size_t len; const char* str; uv_tty_t tty; fd = open("/dev/tty", O_RDONLY); ASSERT(fd >= 0); r = uv_tty_init(uv_default_loop(), &tty, fd, 1); ASSERT(r == 0); uv_read_start((uv_stream_t*) &tty, alloc_cb, read_cb); /* Emulate user-input */ str = "got some input\n" "with a couple of lines\n" "feel pretty happy\n"; for (i = 0, len = strlen(str); i < len; i++) { r = ioctl(fd, TIOCSTI, str + i); ASSERT(r == 0); } uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(read_count == 3); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(osx_select_many_fds) { int r; int fd; size_t i; size_t len; const char* str; struct sockaddr_in addr; uv_tty_t tty; uv_tcp_t tcps[1500]; r = uv_ip4_addr("127.0.0.1", 0, &addr); ASSERT(r == 0); for (i = 0; i < ARRAY_SIZE(tcps); i++) { r = uv_tcp_init(uv_default_loop(), &tcps[i]); ASSERT(r == 0); r = uv_tcp_bind(&tcps[i], (const struct sockaddr *) &addr, 0); ASSERT(r == 0); uv_unref((uv_handle_t*) &tcps[i]); } fd = open("/dev/tty", O_RDONLY); ASSERT(fd >= 0); r = uv_tty_init(uv_default_loop(), &tty, fd, 1); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &tty, alloc_cb, read_cb); ASSERT(r == 0); /* Emulate user-input */ str = "got some input\n" "with a couple of lines\n" "feel pretty happy\n"; for (i = 0, len = strlen(str); i < len; i++) { r = ioctl(fd, TIOCSTI, str + i); ASSERT(r == 0); } uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(read_count == 3); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* __APPLE__ */ MoarVM-2015.11/3rdparty/libuv/test/test-pass-always.c0000644000175000017500000000240412456307253021314 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "task.h" TEST_IMPL(pass_always) { /* This test always passes. It is used to test the test runner. */ return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-ping-pong.c0000644000175000017500000001475512456307253020762 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int completed_pingers = 0; #define NUM_PINGS 1000 /* 64 bytes is enough for a pinger */ #define BUFSIZE 10240 static char PING[] = "PING\n"; static int pinger_on_connect_count; typedef struct { int pongs; int state; union { uv_tcp_t tcp; uv_pipe_t pipe; } stream; uv_connect_t connect_req; char read_buffer[BUFSIZE]; } pinger_t; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = malloc(size); buf->len = size; } static void pinger_on_close(uv_handle_t* handle) { pinger_t* pinger = (pinger_t*)handle->data; ASSERT(NUM_PINGS == pinger->pongs); free(pinger); completed_pingers++; } static void pinger_after_write(uv_write_t *req, int status) { ASSERT(status == 0); free(req); } static void pinger_write_ping(pinger_t* pinger) { uv_write_t *req; uv_buf_t buf; buf = uv_buf_init(PING, sizeof(PING) - 1); req = malloc(sizeof(*req)); if (uv_write(req, (uv_stream_t*) &pinger->stream.tcp, &buf, 1, pinger_after_write)) { FATAL("uv_write failed"); } puts("PING"); } static void pinger_read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ssize_t i; pinger_t* pinger; pinger = (pinger_t*)stream->data; if (nread < 0) { ASSERT(nread == UV_EOF); puts("got EOF"); free(buf->base); uv_close((uv_handle_t*)(&pinger->stream.tcp), pinger_on_close); return; } /* Now we count the pings */ for (i = 0; i < nread; i++) { ASSERT(buf->base[i] == PING[pinger->state]); pinger->state = (pinger->state + 1) % (sizeof(PING) - 1); if (pinger->state != 0) continue; printf("PONG %d\n", pinger->pongs); pinger->pongs++; if (pinger->pongs < NUM_PINGS) { pinger_write_ping(pinger); } else { uv_close((uv_handle_t*)(&pinger->stream.tcp), pinger_on_close); break; } } free(buf->base); } static void pinger_on_connect(uv_connect_t *req, int status) { pinger_t *pinger = (pinger_t*)req->handle->data; pinger_on_connect_count++; ASSERT(status == 0); ASSERT(1 == uv_is_readable(req->handle)); ASSERT(1 == uv_is_writable(req->handle)); ASSERT(0 == uv_is_closing((uv_handle_t *) req->handle)); pinger_write_ping(pinger); uv_read_start((uv_stream_t*)(req->handle), alloc_cb, pinger_read_cb); } /* same ping-pong test, but using IPv6 connection */ static void tcp_pinger_v6_new(void) { int r; struct sockaddr_in6 server_addr; pinger_t *pinger; ASSERT(0 ==uv_ip6_addr("::1", TEST_PORT, &server_addr)); pinger = malloc(sizeof(*pinger)); ASSERT(pinger != NULL); pinger->state = 0; pinger->pongs = 0; /* Try to connect to the server and do NUM_PINGS ping-pongs. */ r = uv_tcp_init(uv_default_loop(), &pinger->stream.tcp); pinger->stream.tcp.data = pinger; ASSERT(!r); /* We are never doing multiple reads/connects at a time anyway. */ /* so these handles can be pre-initialized. */ r = uv_tcp_connect(&pinger->connect_req, &pinger->stream.tcp, (const struct sockaddr*) &server_addr, pinger_on_connect); ASSERT(!r); /* Synchronous connect callbacks are not allowed. */ ASSERT(pinger_on_connect_count == 0); } static void tcp_pinger_new(void) { int r; struct sockaddr_in server_addr; pinger_t *pinger; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); pinger = malloc(sizeof(*pinger)); ASSERT(pinger != NULL); pinger->state = 0; pinger->pongs = 0; /* Try to connect to the server and do NUM_PINGS ping-pongs. */ r = uv_tcp_init(uv_default_loop(), &pinger->stream.tcp); pinger->stream.tcp.data = pinger; ASSERT(!r); /* We are never doing multiple reads/connects at a time anyway. */ /* so these handles can be pre-initialized. */ r = uv_tcp_connect(&pinger->connect_req, &pinger->stream.tcp, (const struct sockaddr*) &server_addr, pinger_on_connect); ASSERT(!r); /* Synchronous connect callbacks are not allowed. */ ASSERT(pinger_on_connect_count == 0); } static void pipe_pinger_new(void) { int r; pinger_t *pinger; pinger = (pinger_t*)malloc(sizeof(*pinger)); ASSERT(pinger != NULL); pinger->state = 0; pinger->pongs = 0; /* Try to connect to the server and do NUM_PINGS ping-pongs. */ r = uv_pipe_init(uv_default_loop(), &pinger->stream.pipe, 0); pinger->stream.pipe.data = pinger; ASSERT(!r); /* We are never doing multiple reads/connects at a time anyway. */ /* so these handles can be pre-initialized. */ uv_pipe_connect(&pinger->connect_req, &pinger->stream.pipe, TEST_PIPENAME, pinger_on_connect); /* Synchronous connect callbacks are not allowed. */ ASSERT(pinger_on_connect_count == 0); } TEST_IMPL(tcp_ping_pong) { tcp_pinger_new(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(completed_pingers == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ping_pong_v6) { tcp_pinger_v6_new(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(completed_pingers == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_ping_pong) { pipe_pinger_new(); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(completed_pingers == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-pipe-bind-error.c0000644000175000017500000000654712456307253022062 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #ifdef _WIN32 # define BAD_PIPENAME "bad-pipe" #else # define BAD_PIPENAME "/path/to/unix/socket/that/really/should/not/be/there" #endif static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(pipe_bind_error_addrinuse) { uv_pipe_t server1, server2; int r; r = uv_pipe_init(uv_default_loop(), &server1, 0); ASSERT(r == 0); r = uv_pipe_bind(&server1, TEST_PIPENAME); ASSERT(r == 0); r = uv_pipe_init(uv_default_loop(), &server2, 0); ASSERT(r == 0); r = uv_pipe_bind(&server2, TEST_PIPENAME); ASSERT(r == UV_EADDRINUSE); r = uv_listen((uv_stream_t*)&server1, SOMAXCONN, NULL); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server2, SOMAXCONN, NULL); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server1, close_cb); uv_close((uv_handle_t*)&server2, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_bind_error_addrnotavail) { uv_pipe_t server; int r; r = uv_pipe_init(uv_default_loop(), &server, 0); ASSERT(r == 0); r = uv_pipe_bind(&server, BAD_PIPENAME); ASSERT(r == UV_EACCES); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_bind_error_inval) { uv_pipe_t server; int r; r = uv_pipe_init(uv_default_loop(), &server, 0); ASSERT(r == 0); r = uv_pipe_bind(&server, TEST_PIPENAME); ASSERT(r == 0); r = uv_pipe_bind(&server, TEST_PIPENAME_2); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_listen_without_bind) { uv_pipe_t server; int r; r = uv_pipe_init(uv_default_loop(), &server, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-pipe-close-stdout-read-stdin.c0000644000175000017500000000561012456307253024462 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef _WIN32 #include #include #include #include #include "uv.h" #include "task.h" void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t* buf) { static char buffer[1024]; buf->base = buffer; buf->len = sizeof(buffer); } void read_stdin(uv_stream_t *stream, ssize_t nread, const uv_buf_t* buf) { if (nread < 0) { uv_close((uv_handle_t*)stream, NULL); return; } } /* * This test is a reproduction of joyent/libuv#1419 . */ TEST_IMPL(pipe_close_stdout_read_stdin) { int r = -1; int pid; int fd[2]; int status; pipe(fd); if ((pid = fork()) == 0) { /* * Make the read side of the pipe our stdin. * The write side will be closed by the parent process. */ close(fd[1]); close(0); dup(fd[0]); /* Create a stream that reads from the pipe. */ uv_pipe_t stdin_pipe; r = uv_pipe_init(uv_default_loop(), (uv_pipe_t *)&stdin_pipe, 0); ASSERT(r == 0); r = uv_pipe_open((uv_pipe_t *)&stdin_pipe, 0); ASSERT(r == 0); r = uv_read_start((uv_stream_t *)&stdin_pipe, alloc_buffer, read_stdin); ASSERT(r == 0); /* * Because the other end of the pipe was closed, there should * be no event left to process after one run of the event loop. * Otherwise, it means that events were not processed correctly. */ ASSERT(uv_run(uv_default_loop(), UV_RUN_NOWAIT) == 0); } else { /* * Close both ends of the pipe so that the child * get a POLLHUP event when it tries to read from * the other end. */ close(fd[1]); close(fd[0]); waitpid(pid, &status, 0); ASSERT(WIFEXITED(status) && WEXITSTATUS(status) == 0); } MAKE_VALGRIND_HAPPY(); return 0; } #endif /* ifndef _WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-pipe-connect-error.c0000644000175000017500000000522412456307253022566 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #ifdef _WIN32 # define BAD_PIPENAME "bad-pipe" #else # define BAD_PIPENAME "/path/to/unix/socket/that/really/should/not/be/there" #endif static int close_cb_called = 0; static int connect_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void connect_cb(uv_connect_t* connect_req, int status) { ASSERT(status == UV_ENOENT); uv_close((uv_handle_t*)connect_req->handle, close_cb); connect_cb_called++; } static void connect_cb_file(uv_connect_t* connect_req, int status) { ASSERT(status == UV_ENOTSOCK || status == UV_ECONNREFUSED); uv_close((uv_handle_t*)connect_req->handle, close_cb); connect_cb_called++; } TEST_IMPL(pipe_connect_bad_name) { uv_pipe_t client; uv_connect_t req; int r; r = uv_pipe_init(uv_default_loop(), &client, 0); ASSERT(r == 0); uv_pipe_connect(&req, &client, BAD_PIPENAME, connect_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); ASSERT(connect_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_connect_to_file) { const char* path = "test/fixtures/empty_file"; uv_pipe_t client; uv_connect_t req; int r; r = uv_pipe_init(uv_default_loop(), &client, 0); ASSERT(r == 0); uv_pipe_connect(&req, &client, path, connect_cb_file); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); ASSERT(connect_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-pipe-getsockname.c0000644000175000017500000001030712456307253022304 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #if defined(__linux__) #include #include #endif #ifndef _WIN32 # include /* close */ #else # include #endif static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(pipe_getsockname) { uv_pipe_t server; char buf[1024]; size_t len; int r; r = uv_pipe_init(uv_default_loop(), &server, 0); ASSERT(r == 0); r = uv_pipe_bind(&server, TEST_PIPENAME); ASSERT(r == 0); len = sizeof buf; r = uv_pipe_getsockname(&server, buf, &len); ASSERT(r == 0); ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_getsockname_abstract) { #if defined(__linux__) uv_pipe_t server; char buf[1024]; size_t len; int r; int sock; struct sockaddr_un sun; socklen_t sun_len; char abstract_pipe[] = "\0test-pipe"; sock = socket(AF_LOCAL, SOCK_STREAM, 0); ASSERT(sock != -1); sun_len = sizeof sun; memset(&sun, 0, sun_len); sun.sun_family = AF_UNIX; memcpy(sun.sun_path, abstract_pipe, sizeof abstract_pipe); r = bind(sock, (struct sockaddr*)&sun, sun_len); ASSERT(r == 0); r = uv_pipe_init(uv_default_loop(), &server, 0); ASSERT(r == 0); r = uv_pipe_open(&server, sock); ASSERT(r == 0); len = sizeof buf; r = uv_pipe_getsockname(&server, buf, &len); ASSERT(r == 0); ASSERT(memcmp(buf, abstract_pipe, sizeof abstract_pipe) == 0); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); close(sock); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; #else MAKE_VALGRIND_HAPPY(); return 0; #endif } TEST_IMPL(pipe_getsockname_blocking) { #ifdef _WIN32 uv_pipe_t reader; HANDLE readh, writeh; int readfd; char buf1[1024], buf2[1024]; size_t len1, len2; int r; r = CreatePipe(&readh, &writeh, NULL, 65536); ASSERT(r != 0); r = uv_pipe_init(uv_default_loop(), &reader, 0); ASSERT(r == 0); readfd = _open_osfhandle((intptr_t)readh, _O_RDONLY); ASSERT(r != -1); r = uv_pipe_open(&reader, readfd); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&reader, NULL, NULL); ASSERT(r == 0); Sleep(100); r = uv_read_stop((uv_stream_t*)&reader); ASSERT(r == 0); len1 = sizeof buf1; r = uv_pipe_getsockname(&reader, buf1, &len1); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&reader, NULL, NULL); ASSERT(r == 0); Sleep(100); len2 = sizeof buf2; r = uv_pipe_getsockname(&reader, buf2, &len2); ASSERT(r == 0); r = uv_read_stop((uv_stream_t*)&reader); ASSERT(r == 0); ASSERT(len1 == len2); ASSERT(memcmp(buf1, buf2, len1) == 0); close_cb_called = 0; uv_close((uv_handle_t*)&reader, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); _close(readfd); CloseHandle(writeh); #endif MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-pipe-sendmsg.c0000644000175000017500000001050212456307253021441 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #ifndef _WIN32 #include #include #include #include #include #include #include /* NOTE: size should be divisible by 2 */ static uv_pipe_t incoming[4]; static unsigned int incoming_count; static unsigned int close_called; static void set_nonblocking(uv_os_sock_t sock) { int r; #ifdef _WIN32 unsigned long on = 1; r = ioctlsocket(sock, FIONBIO, &on); ASSERT(r == 0); #else int flags = fcntl(sock, F_GETFL, 0); ASSERT(flags >= 0); r = fcntl(sock, F_SETFL, flags | O_NONBLOCK); ASSERT(r >= 0); #endif } static void close_cb(uv_handle_t* handle) { close_called++; } static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { static char base[1]; buf->base = base; buf->len = sizeof(base); } static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { uv_pipe_t* p; uv_pipe_t* inc; uv_handle_type pending; unsigned int i; p = (uv_pipe_t*) handle; ASSERT(nread >= 0); while (uv_pipe_pending_count(p) != 0) { pending = uv_pipe_pending_type(p); ASSERT(pending == UV_NAMED_PIPE); ASSERT(incoming_count < ARRAY_SIZE(incoming)); inc = &incoming[incoming_count++]; ASSERT(0 == uv_pipe_init(p->loop, inc, 0)); ASSERT(0 == uv_accept(handle, (uv_stream_t*) inc)); } if (incoming_count != ARRAY_SIZE(incoming)) return; ASSERT(0 == uv_read_stop((uv_stream_t*) p)); uv_close((uv_handle_t*) p, close_cb); for (i = 0; i < ARRAY_SIZE(incoming); i++) uv_close((uv_handle_t*) &incoming[i], close_cb); } TEST_IMPL(pipe_sendmsg) { uv_pipe_t p; int r; int fds[2]; int send_fds[ARRAY_SIZE(incoming)]; struct msghdr msg; char scratch[64]; struct cmsghdr *cmsg; unsigned int i; uv_buf_t buf; ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, fds)); for (i = 0; i < ARRAY_SIZE(send_fds); i += 2) ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, send_fds + i)); ASSERT(i == ARRAY_SIZE(send_fds)); ASSERT(0 == uv_pipe_init(uv_default_loop(), &p, 1)); ASSERT(0 == uv_pipe_open(&p, fds[1])); buf = uv_buf_init("X", 1); memset(&msg, 0, sizeof(msg)); msg.msg_iov = (struct iovec*) &buf; msg.msg_iovlen = 1; msg.msg_flags = 0; msg.msg_control = (void*) scratch; msg.msg_controllen = CMSG_LEN(sizeof(send_fds)); ASSERT(sizeof(scratch) >= msg.msg_controllen); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = msg.msg_controllen; /* silence aliasing warning */ { void* pv = CMSG_DATA(cmsg); int* pi = pv; for (i = 0; i < ARRAY_SIZE(send_fds); i++) pi[i] = send_fds[i]; } set_nonblocking(fds[1]); ASSERT(0 == uv_read_start((uv_stream_t*) &p, alloc_cb, read_cb)); do r = sendmsg(fds[0], &msg, 0); while (r == -1 && errno == EINTR); ASSERT(r == 1); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(ARRAY_SIZE(incoming) == incoming_count); ASSERT(ARRAY_SIZE(incoming) + 1 == close_called); close(fds[0]); MAKE_VALGRIND_HAPPY(); return 0; } #else /* !_WIN32 */ TEST_IMPL(pipe_sendmsg) { MAKE_VALGRIND_HAPPY(); return 0; } #endif /* _WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-pipe-server-close.c0000644000175000017500000000527312456307253022423 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_pipe_t pipe_client; static uv_pipe_t pipe_server; static uv_connect_t connect_req; static int pipe_close_cb_called = 0; static int pipe_client_connect_cb_called = 0; static void pipe_close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*) &pipe_client || handle == (uv_handle_t*) &pipe_server); pipe_close_cb_called++; } static void pipe_client_connect_cb(uv_connect_t* req, int status) { ASSERT(req == &connect_req); ASSERT(status == 0); pipe_client_connect_cb_called++; uv_close((uv_handle_t*) &pipe_client, pipe_close_cb); uv_close((uv_handle_t*) &pipe_server, pipe_close_cb); } static void pipe_server_connection_cb(uv_stream_t* handle, int status) { /* This function *may* be called, depending on whether accept or the * connection callback is called first. */ ASSERT(status == 0); } TEST_IMPL(pipe_server_close) { uv_loop_t* loop; int r; loop = uv_default_loop(); ASSERT(loop != NULL); r = uv_pipe_init(loop, &pipe_server, 0); ASSERT(r == 0); r = uv_pipe_bind(&pipe_server, TEST_PIPENAME); ASSERT(r == 0); r = uv_listen((uv_stream_t*) &pipe_server, 0, pipe_server_connection_cb); ASSERT(r == 0); r = uv_pipe_init(loop, &pipe_client, 0); ASSERT(r == 0); uv_pipe_connect(&connect_req, &pipe_client, TEST_PIPENAME, pipe_client_connect_cb); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(pipe_client_connect_cb_called == 1); ASSERT(pipe_close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-platform-output.c0000644000175000017500000001045412456307253022236 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include TEST_IMPL(platform_output) { char buffer[512]; size_t rss; double uptime; uv_rusage_t rusage; uv_cpu_info_t* cpus; uv_interface_address_t* interfaces; int count; int i; int err; err = uv_get_process_title(buffer, sizeof(buffer)); ASSERT(err == 0); printf("uv_get_process_title: %s\n", buffer); err = uv_resident_set_memory(&rss); ASSERT(err == 0); printf("uv_resident_set_memory: %llu\n", (unsigned long long) rss); err = uv_uptime(&uptime); ASSERT(err == 0); ASSERT(uptime > 0); printf("uv_uptime: %f\n", uptime); err = uv_getrusage(&rusage); ASSERT(err == 0); ASSERT(rusage.ru_utime.tv_sec >= 0); ASSERT(rusage.ru_utime.tv_usec >= 0); ASSERT(rusage.ru_stime.tv_sec >= 0); ASSERT(rusage.ru_stime.tv_usec >= 0); printf("uv_getrusage:\n"); printf(" user: %llu sec %llu microsec\n", (unsigned long long) rusage.ru_utime.tv_sec, (unsigned long long) rusage.ru_utime.tv_usec); printf(" system: %llu sec %llu microsec\n", (unsigned long long) rusage.ru_stime.tv_sec, (unsigned long long) rusage.ru_stime.tv_usec); err = uv_cpu_info(&cpus, &count); ASSERT(err == 0); printf("uv_cpu_info:\n"); for (i = 0; i < count; i++) { printf(" model: %s\n", cpus[i].model); printf(" speed: %d\n", cpus[i].speed); printf(" times.sys: %llu\n", (unsigned long long) cpus[i].cpu_times.sys); printf(" times.user: %llu\n", (unsigned long long) cpus[i].cpu_times.user); printf(" times.idle: %llu\n", (unsigned long long) cpus[i].cpu_times.idle); printf(" times.irq: %llu\n", (unsigned long long) cpus[i].cpu_times.irq); printf(" times.nice: %llu\n", (unsigned long long) cpus[i].cpu_times.nice); } uv_free_cpu_info(cpus, count); err = uv_interface_addresses(&interfaces, &count); ASSERT(err == 0); printf("uv_interface_addresses:\n"); for (i = 0; i < count; i++) { printf(" name: %s\n", interfaces[i].name); printf(" internal: %d\n", interfaces[i].is_internal); printf(" physical address: "); printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)interfaces[i].phys_addr[0], (unsigned char)interfaces[i].phys_addr[1], (unsigned char)interfaces[i].phys_addr[2], (unsigned char)interfaces[i].phys_addr[3], (unsigned char)interfaces[i].phys_addr[4], (unsigned char)interfaces[i].phys_addr[5]); if (interfaces[i].address.address4.sin_family == AF_INET) { uv_ip4_name(&interfaces[i].address.address4, buffer, sizeof(buffer)); } else if (interfaces[i].address.address4.sin_family == AF_INET6) { uv_ip6_name(&interfaces[i].address.address6, buffer, sizeof(buffer)); } printf(" address: %s\n", buffer); if (interfaces[i].netmask.netmask4.sin_family == AF_INET) { uv_ip4_name(&interfaces[i].netmask.netmask4, buffer, sizeof(buffer)); } else if (interfaces[i].netmask.netmask4.sin_family == AF_INET6) { uv_ip6_name(&interfaces[i].netmask.netmask6, buffer, sizeof(buffer)); } printf(" netmask: %s\n", buffer); } uv_free_interface_addresses(interfaces, count); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-poll-close.c0000644000175000017500000000412512456307253021123 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #ifndef _WIN32 # include # include # include #endif #include "uv.h" #include "task.h" #define NUM_SOCKETS 64 static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { close_cb_called++; } TEST_IMPL(poll_close) { uv_os_sock_t sockets[NUM_SOCKETS]; uv_poll_t poll_handles[NUM_SOCKETS]; int i; #ifdef _WIN32 { struct WSAData wsa_data; int r = WSAStartup(MAKEWORD(2, 2), &wsa_data); ASSERT(r == 0); } #endif for (i = 0; i < NUM_SOCKETS; i++) { sockets[i] = socket(AF_INET, SOCK_STREAM, 0); uv_poll_init_socket(uv_default_loop(), &poll_handles[i], sockets[i]); uv_poll_start(&poll_handles[i], UV_READABLE | UV_WRITABLE, NULL); } for (i = 0; i < NUM_SOCKETS; i++) { uv_close((uv_handle_t*) &poll_handles[i], close_cb); } uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == NUM_SOCKETS); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-poll-closesocket.c0000644000175000017500000000456512456307253022344 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifdef _WIN32 #include #include "uv.h" #include "task.h" uv_os_sock_t sock; uv_poll_t handle; static int close_cb_called = 0; static void close_cb(uv_handle_t* h) { close_cb_called++; } static void poll_cb(uv_poll_t* h, int status, int events) { int r; ASSERT(status == 0); ASSERT(h == &handle); r = uv_poll_start(&handle, UV_READABLE, poll_cb); ASSERT(r == 0); closesocket(sock); uv_close((uv_handle_t*) &handle, close_cb); } TEST_IMPL(poll_closesocket) { struct WSAData wsa_data; int r; unsigned long on; struct sockaddr_in addr; r = WSAStartup(MAKEWORD(2, 2), &wsa_data); ASSERT(r == 0); sock = socket(AF_INET, SOCK_STREAM, 0); ASSERT(sock != INVALID_SOCKET); on = 1; r = ioctlsocket(sock, FIONBIO, &on); ASSERT(r == 0); r = uv_ip4_addr("127.0.0.1", TEST_PORT, &addr); ASSERT(r == 0); r = connect(sock, (const struct sockaddr*) &addr, sizeof addr); ASSERT(r != 0); ASSERT(WSAGetLastError() == WSAEWOULDBLOCK); r = uv_poll_init_socket(uv_default_loop(), &handle, sock); ASSERT(r == 0); r = uv_poll_start(&handle, UV_WRITABLE, poll_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } #endif MoarVM-2015.11/3rdparty/libuv/test/test-poll.c0000644000175000017500000003417612456307253020031 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #ifndef _WIN32 # include # include # include #endif #include "uv.h" #include "task.h" #define NUM_CLIENTS 5 #define TRANSFER_BYTES (1 << 16) #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)); typedef enum { UNIDIRECTIONAL, DUPLEX } test_mode_t; typedef struct connection_context_s { uv_poll_t poll_handle; uv_timer_t timer_handle; uv_os_sock_t sock; size_t read, sent; int is_server_connection; int open_handles; int got_fin, sent_fin; unsigned int events, delayed_events; } connection_context_t; typedef struct server_context_s { uv_poll_t poll_handle; uv_os_sock_t sock; int connections; } server_context_t; static void delay_timer_cb(uv_timer_t* timer); static test_mode_t test_mode = DUPLEX; static int closed_connections = 0; static int valid_writable_wakeups = 0; static int spurious_writable_wakeups = 0; static int got_eagain(void) { #ifdef _WIN32 return WSAGetLastError() == WSAEWOULDBLOCK; #else return errno == EAGAIN || errno == EINPROGRESS #ifdef EWOULDBLOCK || errno == EWOULDBLOCK; #endif ; #endif } static void set_nonblocking(uv_os_sock_t sock) { int r; #ifdef _WIN32 unsigned long on = 1; r = ioctlsocket(sock, FIONBIO, &on); ASSERT(r == 0); #else int flags = fcntl(sock, F_GETFL, 0); ASSERT(flags >= 0); r = fcntl(sock, F_SETFL, flags | O_NONBLOCK); ASSERT(r >= 0); #endif } static uv_os_sock_t create_nonblocking_bound_socket( struct sockaddr_in bind_addr) { uv_os_sock_t sock; int r; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); #ifdef _WIN32 ASSERT(sock != INVALID_SOCKET); #else ASSERT(sock >= 0); #endif set_nonblocking(sock); #ifndef _WIN32 { /* Allow reuse of the port. */ int yes = 1; r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes); ASSERT(r == 0); } #endif r = bind(sock, (const struct sockaddr*) &bind_addr, sizeof bind_addr); ASSERT(r == 0); return sock; } static void close_socket(uv_os_sock_t sock) { int r; #ifdef _WIN32 r = closesocket(sock); #else r = close(sock); #endif ASSERT(r == 0); } static connection_context_t* create_connection_context( uv_os_sock_t sock, int is_server_connection) { int r; connection_context_t* context; context = (connection_context_t*) malloc(sizeof *context); ASSERT(context != NULL); context->sock = sock; context->is_server_connection = is_server_connection; context->read = 0; context->sent = 0; context->open_handles = 0; context->events = 0; context->delayed_events = 0; context->got_fin = 0; context->sent_fin = 0; r = uv_poll_init_socket(uv_default_loop(), &context->poll_handle, sock); context->open_handles++; context->poll_handle.data = context; ASSERT(r == 0); r = uv_timer_init(uv_default_loop(), &context->timer_handle); context->open_handles++; context->timer_handle.data = context; ASSERT(r == 0); return context; } static void connection_close_cb(uv_handle_t* handle) { connection_context_t* context = (connection_context_t*) handle->data; if (--context->open_handles == 0) { if (test_mode == DUPLEX || context->is_server_connection) { ASSERT(context->read == TRANSFER_BYTES); } else { ASSERT(context->read == 0); } if (test_mode == DUPLEX || !context->is_server_connection) { ASSERT(context->sent == TRANSFER_BYTES); } else { ASSERT(context->sent == 0); } closed_connections++; free(context); } } static void destroy_connection_context(connection_context_t* context) { uv_close((uv_handle_t*) &context->poll_handle, connection_close_cb); uv_close((uv_handle_t*) &context->timer_handle, connection_close_cb); } static void connection_poll_cb(uv_poll_t* handle, int status, int events) { connection_context_t* context = (connection_context_t*) handle->data; unsigned int new_events; int r; ASSERT(status == 0); ASSERT(events & context->events); ASSERT(!(events & ~context->events)); new_events = context->events; if (events & UV_READABLE) { int action = rand() % 7; switch (action) { case 0: case 1: { /* Read a couple of bytes. */ static char buffer[74]; r = recv(context->sock, buffer, sizeof buffer, 0); ASSERT(r >= 0); if (r > 0) { context->read += r; } else { /* Got FIN. */ context->got_fin = 1; new_events &= ~UV_READABLE; } break; } case 2: case 3: { /* Read until EAGAIN. */ static char buffer[931]; r = recv(context->sock, buffer, sizeof buffer, 0); ASSERT(r >= 0); while (r > 0) { context->read += r; r = recv(context->sock, buffer, sizeof buffer, 0); } if (r == 0) { /* Got FIN. */ context->got_fin = 1; new_events &= ~UV_READABLE; } else { ASSERT(got_eagain()); } break; } case 4: /* Ignore. */ break; case 5: /* Stop reading for a while. Restart in timer callback. */ new_events &= ~UV_READABLE; if (!uv_is_active((uv_handle_t*) &context->timer_handle)) { context->delayed_events = UV_READABLE; uv_timer_start(&context->timer_handle, delay_timer_cb, 10, 0); } else { context->delayed_events |= UV_READABLE; } break; case 6: /* Fudge with the event mask. */ uv_poll_start(&context->poll_handle, UV_WRITABLE, connection_poll_cb); uv_poll_start(&context->poll_handle, UV_READABLE, connection_poll_cb); context->events = UV_READABLE; break; default: ASSERT(0); } } if (events & UV_WRITABLE) { if (context->sent < TRANSFER_BYTES && !(test_mode == UNIDIRECTIONAL && context->is_server_connection)) { /* We have to send more bytes. */ int action = rand() % 7; switch (action) { case 0: case 1: { /* Send a couple of bytes. */ static char buffer[103]; int send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer); ASSERT(send_bytes > 0); r = send(context->sock, buffer, send_bytes, 0); if (r < 0) { ASSERT(got_eagain()); spurious_writable_wakeups++; break; } ASSERT(r > 0); context->sent += r; valid_writable_wakeups++; break; } case 2: case 3: { /* Send until EAGAIN. */ static char buffer[1234]; int send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer); ASSERT(send_bytes > 0); r = send(context->sock, buffer, send_bytes, 0); if (r < 0) { ASSERT(got_eagain()); spurious_writable_wakeups++; break; } ASSERT(r > 0); valid_writable_wakeups++; context->sent += r; while (context->sent < TRANSFER_BYTES) { send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer); ASSERT(send_bytes > 0); r = send(context->sock, buffer, send_bytes, 0); if (r <= 0) break; context->sent += r; } ASSERT(r > 0 || got_eagain()); break; } case 4: /* Ignore. */ break; case 5: /* Stop sending for a while. Restart in timer callback. */ new_events &= ~UV_WRITABLE; if (!uv_is_active((uv_handle_t*) &context->timer_handle)) { context->delayed_events = UV_WRITABLE; uv_timer_start(&context->timer_handle, delay_timer_cb, 100, 0); } else { context->delayed_events |= UV_WRITABLE; } break; case 6: /* Fudge with the event mask. */ uv_poll_start(&context->poll_handle, UV_READABLE, connection_poll_cb); uv_poll_start(&context->poll_handle, UV_WRITABLE, connection_poll_cb); context->events = UV_WRITABLE; break; default: ASSERT(0); } } else { /* Nothing more to write. Send FIN. */ int r; #ifdef _WIN32 r = shutdown(context->sock, SD_SEND); #else r = shutdown(context->sock, SHUT_WR); #endif ASSERT(r == 0); context->sent_fin = 1; new_events &= ~UV_WRITABLE; } } if (context->got_fin && context->sent_fin) { /* Sent and received FIN. Close and destroy context. */ close_socket(context->sock); destroy_connection_context(context); context->events = 0; } else if (new_events != context->events) { /* Poll mask changed. Call uv_poll_start again. */ context->events = new_events; uv_poll_start(handle, new_events, connection_poll_cb); } /* Assert that uv_is_active works correctly for poll handles. */ if (context->events != 0) { ASSERT(1 == uv_is_active((uv_handle_t*) handle)); } else { ASSERT(0 == uv_is_active((uv_handle_t*) handle)); } } static void delay_timer_cb(uv_timer_t* timer) { connection_context_t* context = (connection_context_t*) timer->data; int r; /* Timer should auto stop. */ ASSERT(0 == uv_is_active((uv_handle_t*) timer)); /* Add the requested events to the poll mask. */ ASSERT(context->delayed_events != 0); context->events |= context->delayed_events; context->delayed_events = 0; r = uv_poll_start(&context->poll_handle, context->events, connection_poll_cb); ASSERT(r == 0); } static server_context_t* create_server_context( uv_os_sock_t sock) { int r; server_context_t* context; context = (server_context_t*) malloc(sizeof *context); ASSERT(context != NULL); context->sock = sock; context->connections = 0; r = uv_poll_init_socket(uv_default_loop(), &context->poll_handle, sock); context->poll_handle.data = context; ASSERT(r == 0); return context; } static void server_close_cb(uv_handle_t* handle) { server_context_t* context = (server_context_t*) handle->data; free(context); } static void destroy_server_context(server_context_t* context) { uv_close((uv_handle_t*) &context->poll_handle, server_close_cb); } static void server_poll_cb(uv_poll_t* handle, int status, int events) { server_context_t* server_context = (server_context_t*) handle->data; connection_context_t* connection_context; struct sockaddr_in addr; socklen_t addr_len; uv_os_sock_t sock; int r; addr_len = sizeof addr; sock = accept(server_context->sock, (struct sockaddr*) &addr, &addr_len); #ifdef _WIN32 ASSERT(sock != INVALID_SOCKET); #else ASSERT(sock >= 0); #endif set_nonblocking(sock); connection_context = create_connection_context(sock, 1); connection_context->events = UV_READABLE | UV_WRITABLE; r = uv_poll_start(&connection_context->poll_handle, UV_READABLE | UV_WRITABLE, connection_poll_cb); ASSERT(r == 0); if (++server_context->connections == NUM_CLIENTS) { close_socket(server_context->sock); destroy_server_context(server_context); } } static void start_server(void) { server_context_t* context; struct sockaddr_in addr; uv_os_sock_t sock; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); sock = create_nonblocking_bound_socket(addr); context = create_server_context(sock); r = listen(sock, 100); ASSERT(r == 0); r = uv_poll_start(&context->poll_handle, UV_READABLE, server_poll_cb); ASSERT(r == 0); } static void start_client(void) { uv_os_sock_t sock; connection_context_t* context; struct sockaddr_in server_addr; struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &addr)); sock = create_nonblocking_bound_socket(addr); context = create_connection_context(sock, 0); context->events = UV_READABLE | UV_WRITABLE; r = uv_poll_start(&context->poll_handle, UV_READABLE | UV_WRITABLE, connection_poll_cb); ASSERT(r == 0); r = connect(sock, (struct sockaddr*) &server_addr, sizeof server_addr); ASSERT(r == 0 || got_eagain()); } static void start_poll_test(void) { int i, r; #ifdef _WIN32 { struct WSAData wsa_data; int r = WSAStartup(MAKEWORD(2, 2), &wsa_data); ASSERT(r == 0); } #endif start_server(); for (i = 0; i < NUM_CLIENTS; i++) start_client(); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); /* Assert that at most five percent of the writable wakeups was spurious. */ ASSERT(spurious_writable_wakeups == 0 || (valid_writable_wakeups + spurious_writable_wakeups) / spurious_writable_wakeups > 20); ASSERT(closed_connections == NUM_CLIENTS * 2); MAKE_VALGRIND_HAPPY(); } TEST_IMPL(poll_duplex) { test_mode = DUPLEX; start_poll_test(); return 0; } TEST_IMPL(poll_unidirectional) { test_mode = UNIDIRECTIONAL; start_poll_test(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-process-title.c0000644000175000017500000000341512456307253021650 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include static void set_title(const char* title) { char buffer[512]; int err; err = uv_get_process_title(buffer, sizeof(buffer)); ASSERT(err == 0); err = uv_set_process_title(title); ASSERT(err == 0); err = uv_get_process_title(buffer, sizeof(buffer)); ASSERT(err == 0); ASSERT(strcmp(buffer, title) == 0); } TEST_IMPL(process_title) { #if defined(__sun) RETURN_SKIP("uv_(get|set)_process_title is not implemented."); #else /* Check for format string vulnerabilities. */ set_title("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"); set_title("new title"); return 0; #endif } MoarVM-2015.11/3rdparty/libuv/test/test-ref.c0000644000175000017500000002425512456307253017634 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_write_t write_req; static uv_shutdown_t shutdown_req; static uv_connect_t connect_req; static char buffer[32767]; static int req_cb_called; static int connect_cb_called; static int write_cb_called; static int shutdown_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void do_close(void* handle) { close_cb_called = 0; uv_close((uv_handle_t*)handle, close_cb); ASSERT(close_cb_called == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); } static void fail_cb(void) { FATAL("fail_cb should not have been called"); } static void fail_cb2(void) { ASSERT(0 && "fail_cb2 should not have been called"); } static void req_cb(uv_handle_t* req, int status) { req_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(req == &shutdown_req); shutdown_cb_called++; } static void write_cb(uv_write_t* req, int status) { ASSERT(req == &write_req); uv_shutdown(&shutdown_req, req->handle, shutdown_cb); write_cb_called++; } static void connect_and_write(uv_connect_t* req, int status) { uv_buf_t buf = uv_buf_init(buffer, sizeof buffer); ASSERT(req == &connect_req); ASSERT(status == 0); uv_write(&write_req, req->handle, &buf, 1, write_cb); connect_cb_called++; } static void connect_and_shutdown(uv_connect_t* req, int status) { ASSERT(req == &connect_req); ASSERT(status == 0); uv_shutdown(&shutdown_req, req->handle, shutdown_cb); connect_cb_called++; } TEST_IMPL(ref) { uv_run(uv_default_loop(), UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(idle_ref) { uv_idle_t h; uv_idle_init(uv_default_loop(), &h); uv_idle_start(&h, (uv_idle_cb) fail_cb2); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(async_ref) { uv_async_t h; uv_async_init(uv_default_loop(), &h, NULL); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(prepare_ref) { uv_prepare_t h; uv_prepare_init(uv_default_loop(), &h); uv_prepare_start(&h, (uv_prepare_cb) fail_cb2); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(check_ref) { uv_check_t h; uv_check_init(uv_default_loop(), &h); uv_check_start(&h, (uv_check_cb) fail_cb2); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } static void prepare_cb(uv_prepare_t* h) { ASSERT(h != NULL); uv_unref((uv_handle_t*)h); } TEST_IMPL(unref_in_prepare_cb) { uv_prepare_t h; uv_prepare_init(uv_default_loop(), &h); uv_prepare_start(&h, prepare_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(timer_ref) { uv_timer_t h; uv_timer_init(uv_default_loop(), &h); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(timer_ref2) { uv_timer_t h; uv_timer_init(uv_default_loop(), &h); uv_timer_start(&h, (uv_timer_cb)fail_cb, 42, 42); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_event_ref) { uv_fs_event_t h; uv_fs_event_init(uv_default_loop(), &h); uv_fs_event_start(&h, (uv_fs_event_cb)fail_cb, ".", 0); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(fs_poll_ref) { uv_fs_poll_t h; uv_fs_poll_init(uv_default_loop(), &h); uv_fs_poll_start(&h, NULL, ".", 999); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ref) { uv_tcp_t h; uv_tcp_init(uv_default_loop(), &h); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ref2) { uv_tcp_t h; uv_tcp_init(uv_default_loop(), &h); uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ref2b) { uv_tcp_t h; uv_tcp_init(uv_default_loop(), &h); uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb); uv_unref((uv_handle_t*)&h); uv_close((uv_handle_t*)&h, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ref3) { struct sockaddr_in addr; uv_tcp_t h; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); uv_tcp_init(uv_default_loop(), &h); uv_tcp_connect(&connect_req, &h, (const struct sockaddr*) &addr, connect_and_shutdown); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 1); ASSERT(shutdown_cb_called == 1); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_ref4) { struct sockaddr_in addr; uv_tcp_t h; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); uv_tcp_init(uv_default_loop(), &h); uv_tcp_connect(&connect_req, &h, (const struct sockaddr*) &addr, connect_and_write); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == 1); ASSERT(shutdown_cb_called == 1); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(udp_ref) { uv_udp_t h; uv_udp_init(uv_default_loop(), &h); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(udp_ref2) { struct sockaddr_in addr; uv_udp_t h; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); uv_udp_init(uv_default_loop(), &h); uv_udp_bind(&h, (const struct sockaddr*) &addr, 0); uv_udp_recv_start(&h, (uv_alloc_cb)fail_cb, (uv_udp_recv_cb)fail_cb); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(udp_ref3) { struct sockaddr_in addr; uv_buf_t buf = uv_buf_init("PING", 4); uv_udp_send_t req; uv_udp_t h; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); uv_udp_init(uv_default_loop(), &h); uv_udp_send(&req, &h, &buf, 1, (const struct sockaddr*) &addr, (uv_udp_send_cb) req_cb); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(req_cb_called == 1); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_ref) { uv_pipe_t h; uv_pipe_init(uv_default_loop(), &h, 0); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_ref2) { uv_pipe_t h; uv_pipe_init(uv_default_loop(), &h, 0); uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_ref3) { uv_pipe_t h; uv_pipe_init(uv_default_loop(), &h, 0); uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_shutdown); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 1); ASSERT(shutdown_cb_called == 1); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(pipe_ref4) { uv_pipe_t h; uv_pipe_init(uv_default_loop(), &h, 0); uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_write); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == 1); ASSERT(shutdown_cb_called == 1); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(process_ref) { /* spawn_helper4 blocks indefinitely. */ char *argv[] = { NULL, "spawn_helper4", NULL }; uv_process_options_t options; size_t exepath_size; char exepath[256]; uv_process_t h; int r; memset(&options, 0, sizeof(options)); exepath_size = sizeof(exepath); r = uv_exepath(exepath, &exepath_size); ASSERT(r == 0); argv[0] = exepath; options.file = exepath; options.args = argv; options.exit_cb = NULL; r = uv_spawn(uv_default_loop(), &h, &options); ASSERT(r == 0); uv_unref((uv_handle_t*)&h); uv_run(uv_default_loop(), UV_RUN_DEFAULT); r = uv_process_kill(&h, /* SIGTERM */ 15); ASSERT(r == 0); do_close(&h); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(has_ref) { uv_idle_t h; uv_idle_init(uv_default_loop(), &h); uv_ref((uv_handle_t*)&h); ASSERT(uv_has_ref((uv_handle_t*)&h) == 1); uv_unref((uv_handle_t*)&h); ASSERT(uv_has_ref((uv_handle_t*)&h) == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-run-nowait.c0000644000175000017500000000310412456307253021151 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_timer_t timer_handle; static int timer_called = 0; static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer_handle); timer_called = 1; } TEST_IMPL(run_nowait) { int r; uv_timer_init(uv_default_loop(), &timer_handle); uv_timer_start(&timer_handle, timer_cb, 100, 100); r = uv_run(uv_default_loop(), UV_RUN_NOWAIT); ASSERT(r != 0); ASSERT(timer_called == 0); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-run-once.c0000644000175000017500000000316212456307253020600 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #define NUM_TICKS 64 static uv_idle_t idle_handle; static int idle_counter; static void idle_cb(uv_idle_t* handle) { ASSERT(handle == &idle_handle); if (++idle_counter == NUM_TICKS) uv_idle_stop(handle); } TEST_IMPL(run_once) { uv_idle_init(uv_default_loop(), &idle_handle); uv_idle_start(&idle_handle, idle_cb); while (uv_run(uv_default_loop(), UV_RUN_ONCE)); ASSERT(idle_counter == NUM_TICKS); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-semaphore.c0000644000175000017500000000553112456307253021037 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include typedef struct { uv_mutex_t mutex; uv_sem_t sem; int delay; volatile int posted; } worker_config; static void worker(void* arg) { worker_config* c = arg; if (c->delay) uv_sleep(c->delay); uv_mutex_lock(&c->mutex); ASSERT(c->posted == 0); uv_sem_post(&c->sem); c->posted = 1; uv_mutex_unlock(&c->mutex); } TEST_IMPL(semaphore_1) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); ASSERT(0 == uv_sem_init(&wc.sem, 0)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_sleep(100); uv_mutex_lock(&wc.mutex); ASSERT(wc.posted == 1); uv_sem_wait(&wc.sem); /* should not block */ uv_mutex_unlock(&wc.mutex); /* ergo, it should be ok to unlock after wait */ ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_sem_destroy(&wc.sem); return 0; } TEST_IMPL(semaphore_2) { uv_thread_t thread; worker_config wc; memset(&wc, 0, sizeof(wc)); wc.delay = 100; ASSERT(0 == uv_sem_init(&wc.sem, 0)); ASSERT(0 == uv_mutex_init(&wc.mutex)); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); uv_sem_wait(&wc.sem); ASSERT(0 == uv_thread_join(&thread)); uv_mutex_destroy(&wc.mutex); uv_sem_destroy(&wc.sem); return 0; } TEST_IMPL(semaphore_3) { uv_sem_t sem; ASSERT(0 == uv_sem_init(&sem, 3)); uv_sem_wait(&sem); /* should not block */ uv_sem_wait(&sem); /* should not block */ ASSERT(0 == uv_sem_trywait(&sem)); ASSERT(UV_EAGAIN == uv_sem_trywait(&sem)); uv_sem_post(&sem); ASSERT(0 == uv_sem_trywait(&sem)); ASSERT(UV_EAGAIN == uv_sem_trywait(&sem)); uv_sem_destroy(&sem); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-shutdown-close.c0000644000175000017500000000603712456307253022034 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* * These tests verify that the uv_shutdown callback is always made, even when * it is immediately followed by an uv_close call. */ #include "uv.h" #include "task.h" static uv_shutdown_t shutdown_req; static uv_connect_t connect_req; static int connect_cb_called = 0; static int shutdown_cb_called = 0; static int close_cb_called = 0; static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(req == &shutdown_req); ASSERT(status == 0 || status == UV_ECANCELED); shutdown_cb_called++; } static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { int r; ASSERT(req == &connect_req); ASSERT(status == 0); r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb); ASSERT(r == 0); ASSERT(0 == uv_is_closing((uv_handle_t*) req->handle)); uv_close((uv_handle_t*) req->handle, close_cb); ASSERT(1 == uv_is_closing((uv_handle_t*) req->handle)); connect_cb_called++; } TEST_IMPL(shutdown_close_tcp) { struct sockaddr_in addr; uv_tcp_t h; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &h); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &h, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(connect_cb_called == 1); ASSERT(shutdown_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(shutdown_close_pipe) { uv_pipe_t h; int r; r = uv_pipe_init(uv_default_loop(), &h, 0); ASSERT(r == 0); uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_cb); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(connect_cb_called == 1); ASSERT(shutdown_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-shutdown-eof.c0000644000175000017500000001132612456307253021475 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static uv_timer_t timer; static uv_tcp_t tcp; static uv_connect_t connect_req; static uv_write_t write_req; static uv_shutdown_t shutdown_req; static uv_buf_t qbuf; static int got_q; static int got_eof; static int called_connect_cb; static int called_shutdown_cb; static int called_tcp_close_cb; static int called_timer_close_cb; static int called_timer_cb; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = malloc(size); buf->len = size; } static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) { ASSERT((uv_tcp_t*)t == &tcp); if (nread == 0) { free(buf->base); return; } if (!got_q) { ASSERT(nread == 1); ASSERT(!got_eof); ASSERT(buf->base[0] == 'Q'); free(buf->base); got_q = 1; puts("got Q"); } else { ASSERT(nread == UV_EOF); if (buf->base) { free(buf->base); } got_eof = 1; puts("got EOF"); } } static void shutdown_cb(uv_shutdown_t *req, int status) { ASSERT(req == &shutdown_req); ASSERT(called_connect_cb == 1); ASSERT(!got_eof); ASSERT(called_tcp_close_cb == 0); ASSERT(called_timer_close_cb == 0); ASSERT(called_timer_cb == 0); called_shutdown_cb++; } static void connect_cb(uv_connect_t *req, int status) { ASSERT(status == 0); ASSERT(req == &connect_req); /* Start reading from our connection so we can receive the EOF. */ uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb); /* * Write the letter 'Q' to gracefully kill the echo-server. This will not * effect our connection. */ uv_write(&write_req, (uv_stream_t*) &tcp, &qbuf, 1, NULL); /* Shutdown our end of the connection. */ uv_shutdown(&shutdown_req, (uv_stream_t*) &tcp, shutdown_cb); called_connect_cb++; ASSERT(called_shutdown_cb == 0); } static void tcp_close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*) &tcp); ASSERT(called_connect_cb == 1); ASSERT(got_q); ASSERT(got_eof); ASSERT(called_timer_cb == 1); called_tcp_close_cb++; } static void timer_close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*) &timer); called_timer_close_cb++; } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer); uv_close((uv_handle_t*) handle, timer_close_cb); /* * The most important assert of the test: we have not received * tcp_close_cb yet. */ ASSERT(called_tcp_close_cb == 0); uv_close((uv_handle_t*) &tcp, tcp_close_cb); called_timer_cb++; } /* * This test has a client which connects to the echo_server and immediately * issues a shutdown. The echo-server, in response, will also shutdown their * connection. We check, with a timer, that libuv is not automatically * calling uv_close when the client receives the EOF from echo-server. */ TEST_IMPL(shutdown_eof) { struct sockaddr_in server_addr; int r; qbuf.base = "Q"; qbuf.len = 1; r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); uv_timer_start(&timer, timer_cb, 100, 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr)); r = uv_tcp_init(uv_default_loop(), &tcp); ASSERT(!r); r = uv_tcp_connect(&connect_req, &tcp, (const struct sockaddr*) &server_addr, connect_cb); ASSERT(!r); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(called_connect_cb == 1); ASSERT(called_shutdown_cb == 1); ASSERT(got_eof); ASSERT(got_q); ASSERT(called_tcp_close_cb == 1); ASSERT(called_timer_close_cb == 1); ASSERT(called_timer_cb == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-shutdown-twice.c0000644000175000017500000000457112456307253022043 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* * This is a regression test for issue #1113 (calling uv_shutdown twice will * leave a ghost request in the system) */ #include "uv.h" #include "task.h" static uv_shutdown_t req1; static uv_shutdown_t req2; static int shutdown_cb_called = 0; static void close_cb(uv_handle_t* handle) { } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(req == &req1); ASSERT(status == 0); shutdown_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } static void connect_cb(uv_connect_t* req, int status) { int r; ASSERT(status == 0); r = uv_shutdown(&req1, req->handle, shutdown_cb); ASSERT(r == 0); r = uv_shutdown(&req2, req->handle, shutdown_cb); ASSERT(r != 0); } TEST_IMPL(shutdown_twice) { struct sockaddr_in addr; uv_loop_t* loop; int r; uv_tcp_t h; uv_connect_t connect_req; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); loop = uv_default_loop(); r = uv_tcp_init(loop, &h); r = uv_tcp_connect(&connect_req, &h, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(shutdown_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-signal-multiple-loops.c0000644000175000017500000002031212456307253023306 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* This test does not pretend to be cross-platform. */ #ifndef _WIN32 #include "uv.h" #include "task.h" #include #include #include #include #include #include #include /* The value of NUM_SIGNAL_HANDLING_THREADS is not arbitrary; it needs to be a * multiple of three for reasons that will become clear when you scroll down. * We're basically creating three different thread groups. The total needs * to be divisible by three in order for the numbers in the final check to * match up. */ #define NUM_SIGNAL_HANDLING_THREADS 24 #define NUM_LOOP_CREATING_THREADS 10 enum signal_action { ONLY_SIGUSR1, ONLY_SIGUSR2, SIGUSR1_AND_SIGUSR2 }; static uv_sem_t sem; static uv_mutex_t counter_lock; static volatile int stop = 0; static volatile int signal1_cb_counter = 0; static volatile int signal2_cb_counter = 0; static volatile int loop_creation_counter = 0; static void increment_counter(volatile int* counter) { uv_mutex_lock(&counter_lock); ++(*counter); uv_mutex_unlock(&counter_lock); } static void signal1_cb(uv_signal_t* handle, int signum) { ASSERT(signum == SIGUSR1); increment_counter(&signal1_cb_counter); uv_signal_stop(handle); } static void signal2_cb(uv_signal_t* handle, int signum) { ASSERT(signum == SIGUSR2); increment_counter(&signal2_cb_counter); uv_signal_stop(handle); } static void signal_handling_worker(void* context) { enum signal_action action; uv_signal_t signal1a; uv_signal_t signal1b; uv_signal_t signal2; uv_loop_t loop; int r; action = (enum signal_action) (uintptr_t) context; ASSERT(0 == uv_loop_init(&loop)); /* Setup the signal watchers and start them. */ if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) { r = uv_signal_init(&loop, &signal1a); ASSERT(r == 0); r = uv_signal_start(&signal1a, signal1_cb, SIGUSR1); ASSERT(r == 0); r = uv_signal_init(&loop, &signal1b); ASSERT(r == 0); r = uv_signal_start(&signal1b, signal1_cb, SIGUSR1); ASSERT(r == 0); } if (action == ONLY_SIGUSR2 || action == SIGUSR1_AND_SIGUSR2) { r = uv_signal_init(&loop, &signal2); ASSERT(r == 0); r = uv_signal_start(&signal2, signal2_cb, SIGUSR2); ASSERT(r == 0); } /* Signal watchers are now set up. */ uv_sem_post(&sem); /* Wait for all signals. The signal callbacks stop the watcher, so uv_run * will return when all signal watchers caught a signal. */ r = uv_run(&loop, UV_RUN_DEFAULT); ASSERT(r == 0); /* Restart the signal watchers. */ if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) { r = uv_signal_start(&signal1a, signal1_cb, SIGUSR1); ASSERT(r == 0); r = uv_signal_start(&signal1b, signal1_cb, SIGUSR1); ASSERT(r == 0); } if (action == ONLY_SIGUSR2 || action == SIGUSR1_AND_SIGUSR2) { r = uv_signal_start(&signal2, signal2_cb, SIGUSR2); ASSERT(r == 0); } /* Wait for signals once more. */ uv_sem_post(&sem); r = uv_run(&loop, UV_RUN_DEFAULT); ASSERT(r == 0); /* Close the watchers. */ if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) { uv_close((uv_handle_t*) &signal1a, NULL); uv_close((uv_handle_t*) &signal1b, NULL); } if (action == ONLY_SIGUSR2 || action == SIGUSR1_AND_SIGUSR2) { uv_close((uv_handle_t*) &signal2, NULL); } /* Wait for the signal watchers to close. */ r = uv_run(&loop, UV_RUN_DEFAULT); ASSERT(r == 0); uv_loop_close(&loop); } static void signal_unexpected_cb(uv_signal_t* handle, int signum) { ASSERT(0 && "signal_unexpected_cb should never be called"); } static void loop_creating_worker(void* context) { (void) context; do { uv_loop_t *loop; uv_signal_t signal; int r; loop = malloc(sizeof(*loop)); ASSERT(loop != NULL); ASSERT(0 == uv_loop_init(loop)); r = uv_signal_init(loop, &signal); ASSERT(r == 0); r = uv_signal_start(&signal, signal_unexpected_cb, SIGTERM); ASSERT(r == 0); uv_close((uv_handle_t*) &signal, NULL); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); uv_loop_close(loop); increment_counter(&loop_creation_counter); } while (!stop); } TEST_IMPL(signal_multiple_loops) { uv_thread_t loop_creating_threads[NUM_LOOP_CREATING_THREADS]; uv_thread_t signal_handling_threads[NUM_SIGNAL_HANDLING_THREADS]; enum signal_action action; sigset_t sigset; int i; int r; r = uv_sem_init(&sem, 0); ASSERT(r == 0); r = uv_mutex_init(&counter_lock); ASSERT(r == 0); /* Create a couple of threads that create a destroy loops continuously. */ for (i = 0; i < NUM_LOOP_CREATING_THREADS; i++) { r = uv_thread_create(&loop_creating_threads[i], loop_creating_worker, NULL); ASSERT(r == 0); } /* Create a couple of threads that actually handle signals. */ for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++) { switch (i % 3) { case 0: action = ONLY_SIGUSR1; break; case 1: action = ONLY_SIGUSR2; break; case 2: action = SIGUSR1_AND_SIGUSR2; break; } r = uv_thread_create(&signal_handling_threads[i], signal_handling_worker, (void*) (uintptr_t) action); ASSERT(r == 0); } /* Wait until all threads have started and set up their signal watchers. */ for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++) uv_sem_wait(&sem); r = kill(getpid(), SIGUSR1); ASSERT(r == 0); r = kill(getpid(), SIGUSR2); ASSERT(r == 0); /* Wait for all threads to handle these signals. */ for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++) uv_sem_wait(&sem); /* Block all signals to this thread, so we are sure that from here the signal * handler runs in another thread. This is is more likely to catch thread and * signal safety issues if there are any. */ sigfillset(&sigset); pthread_sigmask(SIG_SETMASK, &sigset, NULL); r = kill(getpid(), SIGUSR1); ASSERT(r == 0); r = kill(getpid(), SIGUSR2); ASSERT(r == 0); /* Wait for all signal handling threads to exit. */ for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++) { r = uv_thread_join(&signal_handling_threads[i]); ASSERT(r == 0); } /* Tell all loop creating threads to stop. */ stop = 1; /* Wait for all loop creating threads to exit. */ for (i = 0; i < NUM_LOOP_CREATING_THREADS; i++) { r = uv_thread_join(&loop_creating_threads[i]); ASSERT(r == 0); } printf("signal1_cb calls: %d\n", signal1_cb_counter); printf("signal2_cb calls: %d\n", signal2_cb_counter); printf("loops created and destroyed: %d\n", loop_creation_counter); /* The division by three reflects the fact that we spawn three different * thread groups of (NUM_SIGNAL_HANDLING_THREADS / 3) threads each. */ ASSERT(signal1_cb_counter == 8 * (NUM_SIGNAL_HANDLING_THREADS / 3)); ASSERT(signal2_cb_counter == 4 * (NUM_SIGNAL_HANDLING_THREADS / 3)); /* We don't know exactly how much loops will be created and destroyed, but at * least there should be 1 for every loop creating thread. */ ASSERT(loop_creation_counter >= NUM_LOOP_CREATING_THREADS); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-signal.c0000644000175000017500000001020712456307253020325 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* This test does not pretend to be cross-platform. */ #ifndef _WIN32 #include "uv.h" #include "task.h" #include #include #include #include #include #include #include #define NSIGNALS 10 struct timer_ctx { unsigned int ncalls; uv_timer_t handle; int signum; }; struct signal_ctx { enum { CLOSE, STOP } stop_or_close; unsigned int ncalls; uv_signal_t handle; int signum; }; static void signal_cb(uv_signal_t* handle, int signum) { struct signal_ctx* ctx = container_of(handle, struct signal_ctx, handle); ASSERT(signum == ctx->signum); if (++ctx->ncalls == NSIGNALS) { if (ctx->stop_or_close == STOP) uv_signal_stop(handle); else if (ctx->stop_or_close == CLOSE) uv_close((uv_handle_t*)handle, NULL); else ASSERT(0); } } static void timer_cb(uv_timer_t* handle) { struct timer_ctx* ctx = container_of(handle, struct timer_ctx, handle); raise(ctx->signum); if (++ctx->ncalls == NSIGNALS) uv_close((uv_handle_t*)handle, NULL); } static void start_watcher(uv_loop_t* loop, int signum, struct signal_ctx* ctx) { ctx->ncalls = 0; ctx->signum = signum; ctx->stop_or_close = CLOSE; ASSERT(0 == uv_signal_init(loop, &ctx->handle)); ASSERT(0 == uv_signal_start(&ctx->handle, signal_cb, signum)); } static void start_timer(uv_loop_t* loop, int signum, struct timer_ctx* ctx) { ctx->ncalls = 0; ctx->signum = signum; ASSERT(0 == uv_timer_init(loop, &ctx->handle)); ASSERT(0 == uv_timer_start(&ctx->handle, timer_cb, 5, 5)); } TEST_IMPL(we_get_signal) { struct signal_ctx sc; struct timer_ctx tc; uv_loop_t* loop; loop = uv_default_loop(); start_timer(loop, SIGCHLD, &tc); start_watcher(loop, SIGCHLD, &sc); sc.stop_or_close = STOP; /* stop, don't close the signal handle */ ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(tc.ncalls == NSIGNALS); ASSERT(sc.ncalls == NSIGNALS); start_timer(loop, SIGCHLD, &tc); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(tc.ncalls == NSIGNALS); ASSERT(sc.ncalls == NSIGNALS); sc.ncalls = 0; sc.stop_or_close = CLOSE; /* now close it when it's done */ uv_signal_start(&sc.handle, signal_cb, SIGCHLD); start_timer(loop, SIGCHLD, &tc); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(tc.ncalls == NSIGNALS); ASSERT(sc.ncalls == NSIGNALS); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(we_get_signals) { struct signal_ctx sc[4]; struct timer_ctx tc[2]; uv_loop_t* loop; unsigned int i; loop = uv_default_loop(); start_watcher(loop, SIGUSR1, sc + 0); start_watcher(loop, SIGUSR1, sc + 1); start_watcher(loop, SIGUSR2, sc + 2); start_watcher(loop, SIGUSR2, sc + 3); start_timer(loop, SIGUSR1, tc + 0); start_timer(loop, SIGUSR2, tc + 1); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); for (i = 0; i < ARRAY_SIZE(sc); i++) ASSERT(sc[i].ncalls == NSIGNALS); for (i = 0; i < ARRAY_SIZE(tc); i++) ASSERT(tc[i].ncalls == NSIGNALS); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* _WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-socket-buffer-size.c0000644000175000017500000000456412456307253022570 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include static uv_udp_t udp; static uv_tcp_t tcp; static int close_cb_called; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void check_buffer_size(uv_handle_t* handle) { int value; value = 0; ASSERT(0 == uv_recv_buffer_size(handle, &value)); ASSERT(value > 0); value = 10000; ASSERT(0 == uv_recv_buffer_size(handle, &value)); value = 0; ASSERT(0 == uv_recv_buffer_size(handle, &value)); /* linux sets double the value */ ASSERT(value == 10000 || value == 20000); } TEST_IMPL(socket_buffer_size) { struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &tcp)); ASSERT(0 == uv_tcp_bind(&tcp, (struct sockaddr*) &addr, 0)); check_buffer_size((uv_handle_t*) &tcp); uv_close((uv_handle_t*) &tcp, close_cb); ASSERT(0 == uv_udp_init(uv_default_loop(), &udp)); ASSERT(0 == uv_udp_bind(&udp, (struct sockaddr*) &addr, 0)); check_buffer_size((uv_handle_t*) &udp); uv_close((uv_handle_t*) &udp, close_cb); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-spawn.c0000644000175000017500000010113512456307253020201 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #include #ifdef _WIN32 # if defined(__MINGW32__) # include # endif # include # include #else # include #endif static int close_cb_called; static int exit_cb_called; static uv_process_t process; static uv_timer_t timer; static uv_process_options_t options; static char exepath[1024]; static size_t exepath_size = 1024; static char* args[3]; static int no_term_signal; static int timer_counter; #define OUTPUT_SIZE 1024 static char output[OUTPUT_SIZE]; static int output_used; static void close_cb(uv_handle_t* handle) { printf("close_cb\n"); close_cb_called++; } static void exit_cb(uv_process_t* process, int64_t exit_status, int term_signal) { printf("exit_cb\n"); exit_cb_called++; ASSERT(exit_status == 1); ASSERT(term_signal == 0); uv_close((uv_handle_t*)process, close_cb); } static void fail_cb(uv_process_t* process, int64_t exit_status, int term_signal) { ASSERT(0 && "fail_cb called"); } static void kill_cb(uv_process_t* process, int64_t exit_status, int term_signal) { int err; printf("exit_cb\n"); exit_cb_called++; #ifdef _WIN32 ASSERT(exit_status == 1); #else ASSERT(exit_status == 0); #endif ASSERT(no_term_signal || term_signal == 15); uv_close((uv_handle_t*)process, close_cb); /* * Sending signum == 0 should check if the * child process is still alive, not kill it. * This process should be dead. */ err = uv_kill(process->pid, 0); ASSERT(err == UV_ESRCH); } static void detach_failure_cb(uv_process_t* process, int64_t exit_status, int term_signal) { printf("detach_cb\n"); exit_cb_called++; } static void on_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = output + output_used; buf->len = OUTPUT_SIZE - output_used; } static void on_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { if (nread > 0) { output_used += nread; } else if (nread < 0) { ASSERT(nread == UV_EOF); uv_close((uv_handle_t*)tcp, close_cb); } } static void on_read_once(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { uv_read_stop(tcp); on_read(tcp, nread, buf); } static void write_cb(uv_write_t* req, int status) { ASSERT(status == 0); uv_close((uv_handle_t*)req->handle, close_cb); } static void init_process_options(char* test, uv_exit_cb exit_cb) { /* Note spawn_helper1 defined in test/run-tests.c */ int r = uv_exepath(exepath, &exepath_size); ASSERT(r == 0); exepath[exepath_size] = '\0'; args[0] = exepath; args[1] = test; args[2] = NULL; options.file = exepath; options.args = args; options.exit_cb = exit_cb; options.flags = 0; } static void timer_cb(uv_timer_t* handle) { uv_process_kill(&process, /* SIGTERM */ 15); uv_close((uv_handle_t*)handle, close_cb); } static void timer_counter_cb(uv_timer_t* handle) { ++timer_counter; } TEST_IMPL(spawn_fails) { int r; init_process_options("", fail_cb); options.file = options.args[0] = "program-that-had-better-not-exist"; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_ENOENT || r == UV_EACCES); ASSERT(0 == uv_is_active((uv_handle_t*) &process)); uv_close((uv_handle_t*) &process, NULL); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_exit_code) { int r; init_process_options("spawn_helper1", exit_cb); r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_stdout) { int r; uv_pipe_t out; uv_stdio_container_t stdio[2]; init_process_options("spawn_helper2", exit_cb); uv_pipe_init(uv_default_loop(), &out, 0); options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */ printf("output is: %s", output); ASSERT(strcmp("hello world\n", output) == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_stdout_to_file) { int r; uv_file file; uv_fs_t fs_req; uv_stdio_container_t stdio[2]; uv_buf_t buf; /* Setup. */ unlink("stdout_file"); init_process_options("spawn_helper2", exit_cb); r = uv_fs_open(uv_default_loop(), &fs_req, "stdout_file", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, NULL); ASSERT(r != -1); uv_fs_req_cleanup(&fs_req); file = r; options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_INHERIT_FD; options.stdio[1].data.fd = file; options.stdio_count = 2; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); buf = uv_buf_init(output, sizeof(output)); r = uv_fs_read(uv_default_loop(), &fs_req, file, &buf, 1, 0, NULL); ASSERT(r == 12); uv_fs_req_cleanup(&fs_req); r = uv_fs_close(uv_default_loop(), &fs_req, file, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&fs_req); printf("output is: %s", output); ASSERT(strcmp("hello world\n", output) == 0); /* Cleanup. */ unlink("stdout_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_stdout_and_stderr_to_file) { int r; uv_file file; uv_fs_t fs_req; uv_stdio_container_t stdio[3]; uv_buf_t buf; /* Setup. */ unlink("stdout_file"); init_process_options("spawn_helper6", exit_cb); r = uv_fs_open(uv_default_loop(), &fs_req, "stdout_file", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, NULL); ASSERT(r != -1); uv_fs_req_cleanup(&fs_req); file = r; options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_INHERIT_FD; options.stdio[1].data.fd = file; options.stdio[2].flags = UV_INHERIT_FD; options.stdio[2].data.fd = file; options.stdio_count = 3; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); buf = uv_buf_init(output, sizeof(output)); r = uv_fs_read(uv_default_loop(), &fs_req, file, &buf, 1, 0, NULL); ASSERT(r == 27); uv_fs_req_cleanup(&fs_req); r = uv_fs_close(uv_default_loop(), &fs_req, file, NULL); ASSERT(r == 0); uv_fs_req_cleanup(&fs_req); printf("output is: %s", output); ASSERT(strcmp("hello world\nhello errworld\n", output) == 0); /* Cleanup. */ unlink("stdout_file"); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_stdin) { int r; uv_pipe_t out; uv_pipe_t in; uv_write_t write_req; uv_buf_t buf; uv_stdio_container_t stdio[2]; char buffer[] = "hello-from-spawn_stdin"; init_process_options("spawn_helper3", exit_cb); uv_pipe_init(uv_default_loop(), &out, 0); uv_pipe_init(uv_default_loop(), &in, 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)∈ options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); buf.base = buffer; buf.len = sizeof(buffer); r = uv_write(&write_req, (uv_stream_t*)&in, &buf, 1, write_cb); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 3); /* Once for process twice for the pipe. */ ASSERT(strcmp(buffer, output) == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_stdio_greater_than_3) { int r; uv_pipe_t pipe; uv_stdio_container_t stdio[4]; init_process_options("spawn_helper5", exit_cb); uv_pipe_init(uv_default_loop(), &pipe, 0); options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_IGNORE; options.stdio[2].flags = UV_IGNORE; options.stdio[3].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[3].data.stream = (uv_stream_t*)&pipe; options.stdio_count = 4; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &pipe, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */ printf("output from stdio[3] is: %s", output); ASSERT(strcmp("fourth stdio!\n", output) == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_ignored_stdio) { int r; init_process_options("spawn_helper6", exit_cb); options.stdio = NULL; options.stdio_count = 0; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_and_kill) { int r; init_process_options("spawn_helper4", kill_cb); r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 500, 0); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* Once for process and once for timer. */ MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_preserve_env) { int r; uv_pipe_t out; uv_stdio_container_t stdio[2]; init_process_options("spawn_helper7", exit_cb); uv_pipe_init(uv_default_loop(), &out, 0); options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*) &out; options.stdio_count = 2; r = putenv("ENV_TEST=testval"); ASSERT(r == 0); /* Explicitly set options.env to NULL to test for env clobbering. */ options.env = NULL; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); printf("output is: %s", output); ASSERT(strcmp("testval", output) == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_detached) { int r; init_process_options("spawn_helper4", detach_failure_cb); options.flags |= UV_PROCESS_DETACHED; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); uv_unref((uv_handle_t*)&process); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 0); r = uv_kill(process.pid, 0); ASSERT(r == 0); r = uv_kill(process.pid, 15); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_and_kill_with_std) { int r; uv_pipe_t in, out, err; uv_write_t write; char message[] = "Nancy's joining me because the message this evening is " "not my message but ours."; uv_buf_t buf; uv_stdio_container_t stdio[3]; init_process_options("spawn_helper4", kill_cb); r = uv_pipe_init(uv_default_loop(), &in, 0); ASSERT(r == 0); r = uv_pipe_init(uv_default_loop(), &out, 0); ASSERT(r == 0); r = uv_pipe_init(uv_default_loop(), &err, 0); ASSERT(r == 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)∈ options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[2].data.stream = (uv_stream_t*)&err; options.stdio_count = 3; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); buf = uv_buf_init(message, sizeof message); r = uv_write(&write, (uv_stream_t*) &in, &buf, 1, write_cb); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &err, on_alloc, on_read); ASSERT(r == 0); r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 500, 0); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 5); /* process x 1, timer x 1, stdio x 3. */ MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_and_ping) { uv_write_t write_req; uv_pipe_t in, out; uv_buf_t buf; uv_stdio_container_t stdio[2]; int r; init_process_options("spawn_helper3", exit_cb); buf = uv_buf_init("TEST", 4); uv_pipe_init(uv_default_loop(), &out, 0); uv_pipe_init(uv_default_loop(), &in, 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)∈ options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); /* Sending signum == 0 should check if the * child process is still alive, not kill it. */ r = uv_process_kill(&process, 0); ASSERT(r == 0); r = uv_write(&write_req, (uv_stream_t*)&in, &buf, 1, write_cb); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&out, on_alloc, on_read); ASSERT(r == 0); ASSERT(exit_cb_called == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(strcmp(output, "TEST") == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_same_stdout_stderr) { uv_write_t write_req; uv_pipe_t in, out; uv_buf_t buf; uv_stdio_container_t stdio[3]; int r; init_process_options("spawn_helper3", exit_cb); buf = uv_buf_init("TEST", 4); uv_pipe_init(uv_default_loop(), &out, 0); uv_pipe_init(uv_default_loop(), &in, 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)∈ options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); /* Sending signum == 0 should check if the * child process is still alive, not kill it. */ r = uv_process_kill(&process, 0); ASSERT(r == 0); r = uv_write(&write_req, (uv_stream_t*)&in, &buf, 1, write_cb); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&out, on_alloc, on_read); ASSERT(r == 0); ASSERT(exit_cb_called == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(strcmp(output, "TEST") == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_closed_process_io) { uv_pipe_t in; uv_write_t write_req; uv_buf_t buf; uv_stdio_container_t stdio[2]; static char buffer[] = "hello-from-spawn_stdin\n"; init_process_options("spawn_helper3", exit_cb); uv_pipe_init(uv_default_loop(), &in, 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*) ∈ options.stdio_count = 1; close(0); /* Close process stdin. */ ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options)); buf = uv_buf_init(buffer, sizeof(buffer)); ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* process, child stdin */ MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(kill) { int r; #ifdef _WIN32 no_term_signal = 1; #endif init_process_options("spawn_helper4", kill_cb); r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); /* Sending signum == 0 should check if the * child process is still alive, not kill it. */ r = uv_kill(process.pid, 0); ASSERT(r == 0); /* Kill the process. */ r = uv_kill(process.pid, /* SIGTERM */ 15); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } #ifdef _WIN32 TEST_IMPL(spawn_detect_pipe_name_collisions_on_windows) { int r; uv_pipe_t out; char name[64]; HANDLE pipe_handle; uv_stdio_container_t stdio[2]; init_process_options("spawn_helper2", exit_cb); uv_pipe_init(uv_default_loop(), &out, 0); options.stdio = stdio; options.stdio[0].flags = UV_IGNORE; options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; /* Create a pipe that'll cause a collision. */ _snprintf(name, sizeof(name), "\\\\.\\pipe\\uv\\%p-%d", &out, GetCurrentProcessId()); pipe_handle = CreateNamedPipeA(name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 10, 65536, 65536, 0, NULL); ASSERT(pipe_handle != INVALID_HANDLE_VALUE); r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */ printf("output is: %s", output); ASSERT(strcmp("hello world\n", output) == 0); MAKE_VALGRIND_HAPPY(); return 0; } int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr); WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target); TEST_IMPL(argument_escaping) { const WCHAR* test_str[] = { L"", L"HelloWorld", L"Hello World", L"Hello\"World", L"Hello World\\", L"Hello\\\"World", L"Hello\\World", L"Hello\\\\World", L"Hello World\\", L"c:\\path\\to\\node.exe --eval \"require('c:\\\\path\\\\to\\\\test.js')\"" }; const int count = sizeof(test_str) / sizeof(*test_str); WCHAR** test_output; WCHAR* command_line; WCHAR** cracked; size_t total_size = 0; int i; int num_args; int result; char* verbatim[] = { "cmd.exe", "/c", "c:\\path\\to\\node.exe --eval \"require('c:\\\\path\\\\to\\\\test.js')\"", NULL }; WCHAR* verbatim_output; WCHAR* non_verbatim_output; test_output = calloc(count, sizeof(WCHAR*)); ASSERT(test_output != NULL); for (i = 0; i < count; ++i) { test_output[i] = calloc(2 * (wcslen(test_str[i]) + 2), sizeof(WCHAR)); quote_cmd_arg(test_str[i], test_output[i]); wprintf(L"input : %s\n", test_str[i]); wprintf(L"output: %s\n", test_output[i]); total_size += wcslen(test_output[i]) + 1; } command_line = calloc(total_size + 1, sizeof(WCHAR)); ASSERT(command_line != NULL); for (i = 0; i < count; ++i) { wcscat(command_line, test_output[i]); wcscat(command_line, L" "); } command_line[total_size - 1] = L'\0'; wprintf(L"command_line: %s\n", command_line); cracked = CommandLineToArgvW(command_line, &num_args); for (i = 0; i < num_args; ++i) { wprintf(L"%d: %s\t%s\n", i, test_str[i], cracked[i]); ASSERT(wcscmp(test_str[i], cracked[i]) == 0); } LocalFree(cracked); for (i = 0; i < count; ++i) { free(test_output[i]); } result = make_program_args(verbatim, 1, &verbatim_output); ASSERT(result == 0); result = make_program_args(verbatim, 0, &non_verbatim_output); ASSERT(result == 0); wprintf(L" verbatim_output: %s\n", verbatim_output); wprintf(L"non_verbatim_output: %s\n", non_verbatim_output); ASSERT(wcscmp(verbatim_output, L"cmd.exe /c c:\\path\\to\\node.exe --eval " L"\"require('c:\\\\path\\\\to\\\\test.js')\"") == 0); ASSERT(wcscmp(non_verbatim_output, L"cmd.exe /c \"c:\\path\\to\\node.exe --eval " L"\\\"require('c:\\\\path\\\\to\\\\test.js')\\\"\"") == 0); free(verbatim_output); free(non_verbatim_output); return 0; } int make_program_env(char** env_block, WCHAR** dst_ptr); TEST_IMPL(environment_creation) { int i; char* environment[] = { "FOO=BAR", "SYSTEM=ROOT", /* substring of a supplied var name */ "SYSTEMROOTED=OMG", /* supplied var name is a substring */ "TEMP=C:\\Temp", "INVALID", "BAZ=QUX", "B_Z=QUX", "B\xe2\x82\xacZ=QUX", "B\xf0\x90\x80\x82Z=QUX", "B\xef\xbd\xa1Z=QUX", "B\xf0\xa3\x91\x96Z=QUX", "BAZ", /* repeat, invalid variable */ NULL }; WCHAR* wenvironment[] = { L"BAZ=QUX", L"B_Z=QUX", L"B\x20acZ=QUX", L"B\xd800\xdc02Z=QUX", L"B\xd84d\xdc56Z=QUX", L"B\xff61Z=QUX", L"FOO=BAR", L"SYSTEM=ROOT", /* substring of a supplied var name */ L"SYSTEMROOTED=OMG", /* supplied var name is a substring */ L"TEMP=C:\\Temp", }; WCHAR* from_env[] = { /* list should be kept in sync with list * in process.c, minus variables in wenvironment */ L"HOMEDRIVE", L"HOMEPATH", L"LOGONSERVER", L"PATH", L"USERDOMAIN", L"USERNAME", L"USERPROFILE", L"SYSTEMDRIVE", L"SYSTEMROOT", L"WINDIR", /* test for behavior in the absence of a * required-environment variable: */ L"ZTHIS_ENV_VARIABLE_DOES_NOT_EXIST", }; int found_in_loc_env[ARRAY_SIZE(wenvironment)] = {0}; int found_in_usr_env[ARRAY_SIZE(from_env)] = {0}; WCHAR *expected[ARRAY_SIZE(from_env)]; int result; WCHAR* str; WCHAR* prev; WCHAR* env; for (i = 0; i < ARRAY_SIZE(from_env); i++) { /* copy expected additions to environment locally */ size_t len = GetEnvironmentVariableW(from_env[i], NULL, 0); if (len == 0) { found_in_usr_env[i] = 1; str = malloc(1 * sizeof(WCHAR)); *str = 0; expected[i] = str; } else { size_t name_len = wcslen(from_env[i]); str = malloc((name_len+1+len) * sizeof(WCHAR)); wmemcpy(str, from_env[i], name_len); expected[i] = str; str += name_len; *str++ = L'='; GetEnvironmentVariableW(from_env[i], str, len); } } result = make_program_env(environment, &env); ASSERT(result == 0); for (str = env, prev = NULL; *str; prev = str, str += wcslen(str) + 1) { int found = 0; #if 0 _cputws(str); putchar('\n'); #endif for (i = 0; i < ARRAY_SIZE(wenvironment) && !found; i++) { if (!wcscmp(str, wenvironment[i])) { ASSERT(!found_in_loc_env[i]); found_in_loc_env[i] = 1; found = 1; } } for (i = 0; i < ARRAY_SIZE(expected) && !found; i++) { if (!wcscmp(str, expected[i])) { ASSERT(!found_in_usr_env[i]); found_in_usr_env[i] = 1; found = 1; } } if (prev) { /* verify sort order -- requires Vista */ #if _WIN32_WINNT >= 0x0600 ASSERT(CompareStringOrdinal(prev, -1, str, -1, TRUE) == 1); #endif } ASSERT(found); /* verify that we expected this variable */ } /* verify that we found all expected variables */ for (i = 0; i < ARRAY_SIZE(wenvironment); i++) { ASSERT(found_in_loc_env[i]); } for (i = 0; i < ARRAY_SIZE(expected); i++) { ASSERT(found_in_usr_env[i]); } return 0; } // Regression test for issue #909 TEST_IMPL(spawn_with_an_odd_path) { int r; char newpath[2048]; char *path = getenv("PATH"); ASSERT(path != NULL); snprintf(newpath, 2048, ";.;%s", path); SetEnvironmentVariable("PATH", path); init_process_options("", exit_cb); options.file = options.args[0] = "program-that-had-better-not-exist"; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_ENOENT || r == UV_EACCES); ASSERT(0 == uv_is_active((uv_handle_t*) &process)); uv_close((uv_handle_t*) &process, NULL); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } #endif #ifndef _WIN32 TEST_IMPL(spawn_setuid_setgid) { int r; /* if not root, then this will fail. */ uv_uid_t uid = getuid(); if (uid != 0) { fprintf(stderr, "spawn_setuid_setgid skipped: not root\n"); return 0; } init_process_options("spawn_helper1", exit_cb); /* become the "nobody" user. */ struct passwd* pw; pw = getpwnam("nobody"); ASSERT(pw != NULL); options.uid = pw->pw_uid; options.gid = pw->pw_gid; options.flags = UV_PROCESS_SETUID | UV_PROCESS_SETGID; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } #endif #ifndef _WIN32 TEST_IMPL(spawn_setuid_fails) { int r; /* if root, become nobody. */ uv_uid_t uid = getuid(); if (uid == 0) { struct passwd* pw; pw = getpwnam("nobody"); ASSERT(pw != NULL); ASSERT(0 == setgid(pw->pw_gid)); ASSERT(0 == setuid(pw->pw_uid)); } init_process_options("spawn_helper1", fail_cb); options.flags |= UV_PROCESS_SETUID; options.uid = 0; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_EPERM); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_setgid_fails) { int r; /* if root, become nobody. */ uv_uid_t uid = getuid(); if (uid == 0) { struct passwd* pw; pw = getpwnam("nobody"); ASSERT(pw != NULL); ASSERT(0 == setgid(pw->pw_gid)); ASSERT(0 == setuid(pw->pw_uid)); } init_process_options("spawn_helper1", fail_cb); options.flags |= UV_PROCESS_SETGID; options.gid = 0; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_EPERM); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 0); MAKE_VALGRIND_HAPPY(); return 0; } #endif #ifdef _WIN32 static void exit_cb_unexpected(uv_process_t* process, int64_t exit_status, int term_signal) { ASSERT(0 && "should not have been called"); } TEST_IMPL(spawn_setuid_fails) { int r; init_process_options("spawn_helper1", exit_cb_unexpected); options.flags |= UV_PROCESS_SETUID; options.uid = (uv_uid_t) -42424242; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_ENOTSUP); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(spawn_setgid_fails) { int r; init_process_options("spawn_helper1", exit_cb_unexpected); options.flags |= UV_PROCESS_SETGID; options.gid = (uv_gid_t) -42424242; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == UV_ENOTSUP); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 0); MAKE_VALGRIND_HAPPY(); return 0; } #endif TEST_IMPL(spawn_auto_unref) { init_process_options("spawn_helper1", NULL); ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(0 == uv_is_closing((uv_handle_t*) &process)); uv_close((uv_handle_t*) &process, NULL); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(1 == uv_is_closing((uv_handle_t*) &process)); MAKE_VALGRIND_HAPPY(); return 0; } #ifndef _WIN32 TEST_IMPL(spawn_fs_open) { int fd; uv_fs_t fs_req; uv_pipe_t in; uv_write_t write_req; uv_buf_t buf; uv_stdio_container_t stdio[1]; fd = uv_fs_open(uv_default_loop(), &fs_req, "/dev/null", O_RDWR, 0, NULL); ASSERT(fd >= 0); init_process_options("spawn_helper8", exit_cb); ASSERT(0 == uv_pipe_init(uv_default_loop(), &in, 0)); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*) ∈ options.stdio_count = 1; ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options)); buf = uv_buf_init((char*) &fd, sizeof(fd)); ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(0 == uv_fs_close(uv_default_loop(), &fs_req, fd, NULL)); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 2); /* One for `in`, one for process */ MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ #ifndef _WIN32 TEST_IMPL(closed_fd_events) { uv_stdio_container_t stdio[3]; uv_pipe_t pipe_handle; int fd[2]; /* create a pipe and share it with a child process */ ASSERT(0 == pipe(fd)); ASSERT(0 == fcntl(fd[0], F_SETFL, O_NONBLOCK)); /* spawn_helper4 blocks indefinitely. */ init_process_options("spawn_helper4", exit_cb); options.stdio_count = 3; options.stdio = stdio; options.stdio[0].flags = UV_INHERIT_FD; options.stdio[0].data.fd = fd[0]; options.stdio[1].flags = UV_IGNORE; options.stdio[2].flags = UV_IGNORE; ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options)); uv_unref((uv_handle_t*) &process); /* read from the pipe with uv */ ASSERT(0 == uv_pipe_init(uv_default_loop(), &pipe_handle, 0)); ASSERT(0 == uv_pipe_open(&pipe_handle, fd[0])); fd[0] = -1; ASSERT(0 == uv_read_start((uv_stream_t*) &pipe_handle, on_alloc, on_read_once)); ASSERT(1 == write(fd[1], "", 1)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); /* should have received just one byte */ ASSERT(output_used == 1); /* close the pipe and see if we still get events */ uv_close((uv_handle_t*) &pipe_handle, close_cb); ASSERT(1 == write(fd[1], "", 1)); ASSERT(0 == uv_timer_init(uv_default_loop(), &timer)); ASSERT(0 == uv_timer_start(&timer, timer_counter_cb, 10, 0)); /* see if any spurious events interrupt the timer */ if (1 == uv_run(uv_default_loop(), UV_RUN_ONCE)) /* have to run again to really trigger the timer */ ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); ASSERT(timer_counter == 1); /* cleanup */ ASSERT(0 == uv_process_kill(&process, /* SIGTERM */ 15)); ASSERT(0 == close(fd[1])); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ TEST_IMPL(spawn_reads_child_path) { int r; int len; char file[64]; char path[1024]; char *env[2] = {path, NULL}; /* Set up the process, but make sure that the file to run is relative and */ /* requires a lookup into PATH */ init_process_options("spawn_helper1", exit_cb); /* Set up the PATH env variable */ for (len = strlen(exepath); exepath[len - 1] != '/' && exepath[len - 1] != '\\'; len--); strcpy(file, exepath + len); exepath[len] = 0; strcpy(path, "PATH="); strcpy(path + 5, exepath); options.file = file; options.args[0] = file; options.env = env; r = uv_spawn(uv_default_loop(), &process, &options); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-stdio-over-pipes.c0000644000175000017500000001501412456307253022262 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static char exepath[1024]; static size_t exepath_size = 1024; static char* args[3]; static uv_process_options_t options; static int close_cb_called; static int exit_cb_called; static int on_read_cb_called; static int after_write_cb_called; static uv_pipe_t in; static uv_pipe_t out; static uv_loop_t* loop; #define OUTPUT_SIZE 1024 static char output[OUTPUT_SIZE]; static int output_used; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void exit_cb(uv_process_t* process, int64_t exit_status, int term_signal) { printf("exit_cb\n"); exit_cb_called++; ASSERT(exit_status == 0); ASSERT(term_signal == 0); uv_close((uv_handle_t*)process, close_cb); uv_close((uv_handle_t*)&in, close_cb); uv_close((uv_handle_t*)&out, close_cb); } static void init_process_options(char* test, uv_exit_cb exit_cb) { int r = uv_exepath(exepath, &exepath_size); ASSERT(r == 0); exepath[exepath_size] = '\0'; args[0] = exepath; args[1] = test; args[2] = NULL; options.file = exepath; options.args = args; options.exit_cb = exit_cb; } static void on_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = output + output_used; buf->len = OUTPUT_SIZE - output_used; } static void after_write(uv_write_t* req, int status) { if (status) { fprintf(stderr, "uv_write error: %s\n", uv_strerror(status)); ASSERT(0); } /* Free the read/write buffer and the request */ free(req); after_write_cb_called++; } static void on_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* rdbuf) { uv_write_t* req; uv_buf_t wrbuf; int r; ASSERT(nread > 0 || nread == UV_EOF); if (nread > 0) { output_used += nread; if (output_used == 12) { ASSERT(memcmp("hello world\n", output, 12) == 0); wrbuf = uv_buf_init(output, output_used); req = malloc(sizeof(*req)); r = uv_write(req, (uv_stream_t*)&in, &wrbuf, 1, after_write); ASSERT(r == 0); } } on_read_cb_called++; } TEST_IMPL(stdio_over_pipes) { int r; uv_process_t process; uv_stdio_container_t stdio[2]; loop = uv_default_loop(); init_process_options("stdio_over_pipes_helper", exit_cb); uv_pipe_init(loop, &out, 0); uv_pipe_init(loop, &in, 0); options.stdio = stdio; options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; options.stdio[0].data.stream = (uv_stream_t*)∈ options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; options.stdio[1].data.stream = (uv_stream_t*)&out; options.stdio_count = 2; r = uv_spawn(loop, &process, &options); ASSERT(r == 0); r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(on_read_cb_called > 1); ASSERT(after_write_cb_called == 1); ASSERT(exit_cb_called == 1); ASSERT(close_cb_called == 3); ASSERT(memcmp("hello world\n", output, 12) == 0); ASSERT(output_used == 12); MAKE_VALGRIND_HAPPY(); return 0; } /* Everything here runs in a child process. */ static int on_pipe_read_called; static int after_write_called; static uv_pipe_t stdin_pipe; static uv_pipe_t stdout_pipe; static void on_pipe_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ASSERT(nread > 0); ASSERT(memcmp("hello world\n", buf->base, nread) == 0); on_pipe_read_called++; free(buf->base); uv_close((uv_handle_t*)&stdin_pipe, close_cb); uv_close((uv_handle_t*)&stdout_pipe, close_cb); } static void after_pipe_write(uv_write_t* req, int status) { ASSERT(status == 0); after_write_called++; } static void on_read_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = malloc(suggested_size); buf->len = suggested_size; } int stdio_over_pipes_helper(void) { /* Write several buffers to test that the write order is preserved. */ char* buffers[] = { "he", "ll", "o ", "wo", "rl", "d", "\n" }; uv_write_t write_req[ARRAY_SIZE(buffers)]; uv_buf_t buf[ARRAY_SIZE(buffers)]; unsigned int i; int r; uv_loop_t* loop = uv_default_loop(); ASSERT(UV_NAMED_PIPE == uv_guess_handle(0)); ASSERT(UV_NAMED_PIPE == uv_guess_handle(1)); r = uv_pipe_init(loop, &stdin_pipe, 0); ASSERT(r == 0); r = uv_pipe_init(loop, &stdout_pipe, 0); ASSERT(r == 0); uv_pipe_open(&stdin_pipe, 0); uv_pipe_open(&stdout_pipe, 1); /* Unref both stdio handles to make sure that all writes complete. */ uv_unref((uv_handle_t*)&stdin_pipe); uv_unref((uv_handle_t*)&stdout_pipe); for (i = 0; i < ARRAY_SIZE(buffers); i++) { buf[i] = uv_buf_init((char*)buffers[i], strlen(buffers[i])); } for (i = 0; i < ARRAY_SIZE(buffers); i++) { r = uv_write(&write_req[i], (uv_stream_t*)&stdout_pipe, &buf[i], 1, after_pipe_write); ASSERT(r == 0); } uv_run(loop, UV_RUN_DEFAULT); ASSERT(after_write_called == 7); ASSERT(on_pipe_read_called == 0); ASSERT(close_cb_called == 0); uv_ref((uv_handle_t*)&stdout_pipe); uv_ref((uv_handle_t*)&stdin_pipe); r = uv_read_start((uv_stream_t*)&stdin_pipe, on_read_alloc, on_pipe_read); ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(after_write_called == 7); ASSERT(on_pipe_read_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-bind-error.c0000644000175000017500000001251612456307253021704 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(tcp_bind_error_addrinuse) { struct sockaddr_in addr; uv_tcp_t server1, server2; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server1); ASSERT(r == 0); r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server1, 128, NULL); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server2, 128, NULL); ASSERT(r == UV_EADDRINUSE); uv_close((uv_handle_t*)&server1, close_cb); uv_close((uv_handle_t*)&server2, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind_error_addrnotavail_1) { struct sockaddr_in addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip4_addr("127.255.255.255", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); /* It seems that Linux is broken here - bind succeeds. */ r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0 || r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind_error_addrnotavail_2) { struct sockaddr_in addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip4_addr("4.4.4.4", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind_error_fault) { char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; struct sockaddr_in* garbage_addr; uv_tcp_t server; int r; garbage_addr = (struct sockaddr_in*) &garbage; r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } /* Notes: On Linux uv_bind(server, NULL) will segfault the program. */ TEST_IMPL(tcp_bind_error_inval) { struct sockaddr_in addr1; struct sockaddr_in addr2; uv_tcp_t server; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr1)); ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT_2, &addr2)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind_localhost_ok) { struct sockaddr_in addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind_invalid_flags) { struct sockaddr_in addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, UV_TCP_IPV6ONLY); ASSERT(r == UV_EINVAL); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_listen_without_bind) { int r; uv_tcp_t server; r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server, 128, NULL); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-bind6-error.c0000644000175000017500000001027512456307253021772 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(tcp_bind6_error_addrinuse) { struct sockaddr_in6 addr; uv_tcp_t server1, server2; int r; ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server1); ASSERT(r == 0); r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &server2); ASSERT(r == 0); r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server1, 128, NULL); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&server2, 128, NULL); ASSERT(r == UV_EADDRINUSE); uv_close((uv_handle_t*)&server1, close_cb); uv_close((uv_handle_t*)&server2, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind6_error_addrnotavail) { struct sockaddr_in6 addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip6_addr("4:4:4:4:4:4:4:4", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == UV_EADDRNOTAVAIL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind6_error_fault) { char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; struct sockaddr_in6* garbage_addr; uv_tcp_t server; int r; garbage_addr = (struct sockaddr_in6*) &garbage; r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } /* Notes: On Linux uv_bind6(server, NULL) will segfault the program. */ TEST_IMPL(tcp_bind6_error_inval) { struct sockaddr_in6 addr1; struct sockaddr_in6 addr2; uv_tcp_t server; int r; ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr1)); ASSERT(0 == uv_ip6_addr("::", TEST_PORT_2, &addr2)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(tcp_bind6_localhost_ok) { struct sockaddr_in6 addr; uv_tcp_t server; int r; ASSERT(0 == uv_ip6_addr("::1", TEST_PORT, &addr)); r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-close-accept.c0000644000175000017500000001404312456307253022200 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ /* this test is Unix only */ #ifndef _WIN32 #include "uv.h" #include "task.h" #include #include static struct sockaddr_in addr; static uv_tcp_t tcp_server; static uv_tcp_t tcp_outgoing[2]; static uv_tcp_t tcp_incoming[ARRAY_SIZE(tcp_outgoing)]; static uv_connect_t connect_reqs[ARRAY_SIZE(tcp_outgoing)]; static uv_tcp_t tcp_check; static uv_connect_t tcp_check_req; static uv_write_t write_reqs[ARRAY_SIZE(tcp_outgoing)]; static unsigned int got_connections; static unsigned int close_cb_called; static unsigned int write_cb_called; static unsigned int read_cb_called; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void write_cb(uv_write_t* req, int status) { ASSERT(status == 0); write_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { unsigned int i; uv_buf_t buf; uv_stream_t* outgoing; if (req == &tcp_check_req) { ASSERT(status != 0); /* Close check and incoming[0], time to finish test */ uv_close((uv_handle_t*) &tcp_incoming[0], close_cb); uv_close((uv_handle_t*) &tcp_check, close_cb); return; } ASSERT(status == 0); ASSERT(connect_reqs <= req); ASSERT(req <= connect_reqs + ARRAY_SIZE(connect_reqs)); i = req - connect_reqs; buf = uv_buf_init("x", 1); outgoing = (uv_stream_t*) &tcp_outgoing[i]; ASSERT(0 == uv_write(&write_reqs[i], outgoing, &buf, 1, write_cb)); } static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { static char slab[1]; buf->base = slab; buf->len = sizeof(slab); } static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { uv_loop_t* loop; unsigned int i; /* Only first stream should receive read events */ ASSERT(stream == (uv_stream_t*) &tcp_incoming[0]); ASSERT(0 == uv_read_stop(stream)); ASSERT(1 == nread); loop = stream->loop; read_cb_called++; /* Close all active incomings, except current one */ for (i = 1; i < got_connections; i++) uv_close((uv_handle_t*) &tcp_incoming[i], close_cb); /* Create new fd that should be one of the closed incomings */ ASSERT(0 == uv_tcp_init(loop, &tcp_check)); ASSERT(0 == uv_tcp_connect(&tcp_check_req, &tcp_check, (const struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_read_start((uv_stream_t*) &tcp_check, alloc_cb, read_cb)); /* Close server, so no one will connect to it */ uv_close((uv_handle_t*) &tcp_server, close_cb); } static void connection_cb(uv_stream_t* server, int status) { unsigned int i; uv_tcp_t* incoming; ASSERT(server == (uv_stream_t*) &tcp_server); /* Ignore tcp_check connection */ if (got_connections == ARRAY_SIZE(tcp_incoming)) return; /* Accept everyone */ incoming = &tcp_incoming[got_connections++]; ASSERT(0 == uv_tcp_init(server->loop, incoming)); ASSERT(0 == uv_accept(server, (uv_stream_t*) incoming)); if (got_connections != ARRAY_SIZE(tcp_incoming)) return; /* Once all clients are accepted - start reading */ for (i = 0; i < ARRAY_SIZE(tcp_incoming); i++) { incoming = &tcp_incoming[i]; ASSERT(0 == uv_read_start((uv_stream_t*) incoming, alloc_cb, read_cb)); } } TEST_IMPL(tcp_close_accept) { unsigned int i; uv_loop_t* loop; uv_tcp_t* client; /* * A little explanation of what goes on below: * * We'll create server and connect to it using two clients, each writing one * byte once connected. * * When all clients will be accepted by server - we'll start reading from them * and, on first client's first byte, will close second client and server. * After that, we'll immediately initiate new connection to server using * tcp_check handle (thus, reusing fd from second client). * * In this situation uv__io_poll()'s event list should still contain read * event for second client, and, if not cleaned up properly, `tcp_check` will * receive stale event of second incoming and invoke `connect_cb` with zero * status. */ loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(loop, &tcp_server)); ASSERT(0 == uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &tcp_server, ARRAY_SIZE(tcp_outgoing), connection_cb)); for (i = 0; i < ARRAY_SIZE(tcp_outgoing); i++) { client = tcp_outgoing + i; ASSERT(0 == uv_tcp_init(loop, client)); ASSERT(0 == uv_tcp_connect(&connect_reqs[i], client, (const struct sockaddr*) &addr, connect_cb)); } uv_run(loop, UV_RUN_DEFAULT); ASSERT(ARRAY_SIZE(tcp_outgoing) == got_connections); ASSERT((ARRAY_SIZE(tcp_outgoing) + 2) == close_cb_called); ASSERT(ARRAY_SIZE(tcp_outgoing) == write_cb_called); ASSERT(1 == read_cb_called); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-tcp-close-while-connecting.c0000644000175000017500000000522512456307253024200 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_timer_t timer1_handle; static uv_timer_t timer2_handle; static uv_tcp_t tcp_handle; static int connect_cb_called; static int timer1_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { ASSERT(status == UV_ECANCELED); uv_timer_stop(&timer2_handle); connect_cb_called++; } static void timer1_cb(uv_timer_t* handle) { uv_close((uv_handle_t*)handle, close_cb); uv_close((uv_handle_t*)&tcp_handle, close_cb); timer1_cb_called++; } static void timer2_cb(uv_timer_t* handle) { ASSERT(0 && "should not be called"); } TEST_IMPL(tcp_close_while_connecting) { uv_connect_t connect_req; struct sockaddr_in addr; uv_loop_t* loop; loop = uv_default_loop(); ASSERT(0 == uv_ip4_addr("1.2.3.4", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(loop, &tcp_handle)); ASSERT(0 == uv_tcp_connect(&connect_req, &tcp_handle, (const struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_timer_init(loop, &timer1_handle)); ASSERT(0 == uv_timer_start(&timer1_handle, timer1_cb, 50, 0)); ASSERT(0 == uv_timer_init(loop, &timer2_handle)); ASSERT(0 == uv_timer_start(&timer2_handle, timer2_cb, 86400 * 1000, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(connect_cb_called == 1); ASSERT(timer1_cb_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-close.c0000644000175000017500000000720012456307253020740 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* memset */ #define NUM_WRITE_REQS 32 static uv_tcp_t tcp_handle; static uv_connect_t connect_req; static int write_cb_called; static int close_cb_called; static void connect_cb(uv_connect_t* req, int status); static void write_cb(uv_write_t* req, int status); static void close_cb(uv_handle_t* handle); static void connect_cb(uv_connect_t* conn_req, int status) { uv_write_t* req; uv_buf_t buf; int i, r; buf = uv_buf_init("PING", 4); for (i = 0; i < NUM_WRITE_REQS; i++) { req = malloc(sizeof *req); ASSERT(req != NULL); r = uv_write(req, (uv_stream_t*)&tcp_handle, &buf, 1, write_cb); ASSERT(r == 0); } uv_close((uv_handle_t*)&tcp_handle, close_cb); } static void write_cb(uv_write_t* req, int status) { /* write callbacks should run before the close callback */ ASSERT(close_cb_called == 0); ASSERT(req->handle == (uv_stream_t*)&tcp_handle); write_cb_called++; free(req); } static void close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*)&tcp_handle); close_cb_called++; } static void connection_cb(uv_stream_t* server, int status) { ASSERT(status == 0); } static void start_server(uv_loop_t* loop, uv_tcp_t* handle) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_tcp_init(loop, handle); ASSERT(r == 0); r = uv_tcp_bind(handle, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)handle, 128, connection_cb); ASSERT(r == 0); uv_unref((uv_handle_t*)handle); } /* Check that pending write requests have their callbacks * invoked when the handle is closed. */ TEST_IMPL(tcp_close) { struct sockaddr_in addr; uv_tcp_t tcp_server; uv_loop_t* loop; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); loop = uv_default_loop(); /* We can't use the echo server, it doesn't handle ECONNRESET. */ start_server(loop, &tcp_server); r = uv_tcp_init(loop, &tcp_handle); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &tcp_handle, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); ASSERT(write_cb_called == 0); ASSERT(close_cb_called == 0); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); printf("%d of %d write reqs seen\n", write_cb_called, NUM_WRITE_REQS); ASSERT(write_cb_called == NUM_WRITE_REQS); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-connect-error-after-write.c0000644000175000017500000000560212456307253024646 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include static int connect_cb_called; static int write_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { ASSERT(status < 0); connect_cb_called++; uv_close((uv_handle_t*)req->handle, close_cb); } static void write_cb(uv_write_t* req, int status) { ASSERT(status < 0); write_cb_called++; } /* * Try to connect to an address on which nothing listens, get ECONNREFUSED * (uv errno 12) and get connect_cb() called once with status != 0. * Related issue: https://github.com/joyent/libuv/issues/443 */ TEST_IMPL(tcp_connect_error_after_write) { uv_connect_t connect_req; struct sockaddr_in addr; uv_write_t write_req; uv_tcp_t conn; uv_buf_t buf; int r; #ifdef _WIN32 fprintf(stderr, "This test is disabled on Windows for now.\n"); fprintf(stderr, "See https://github.com/joyent/libuv/issues/444\n"); return 0; /* windows slackers... */ #endif ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); buf = uv_buf_init("TEST", 4); r = uv_tcp_init(uv_default_loop(), &conn); ASSERT(r == 0); r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb); ASSERT(r == UV_EBADF); r = uv_tcp_connect(&connect_req, &conn, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-connect-error.c0000644000175000017500000000426312456307253022421 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int connect_cb_called = 0; static int close_cb_called = 0; static void connect_cb(uv_connect_t* handle, int status) { ASSERT(handle != NULL); connect_cb_called++; } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(tcp_connect_error_fault) { const char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; const struct sockaddr_in* garbage_addr; uv_tcp_t server; int r; uv_connect_t req; garbage_addr = (const struct sockaddr_in*) &garbage; r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_connect(&req, &server, (const struct sockaddr*) garbage_addr, connect_cb); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 0); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-connect-timeout.c0000644000175000017500000000514312456307253022754 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int connect_cb_called; static int close_cb_called; static uv_connect_t connect_req; static uv_timer_t timer; static uv_tcp_t conn; static void connect_cb(uv_connect_t* req, int status); static void timer_cb(uv_timer_t* handle); static void close_cb(uv_handle_t* handle); static void connect_cb(uv_connect_t* req, int status) { ASSERT(req == &connect_req); ASSERT(status == UV_ECANCELED); connect_cb_called++; } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer); uv_close((uv_handle_t*)&conn, close_cb); uv_close((uv_handle_t*)&timer, close_cb); } static void close_cb(uv_handle_t* handle) { ASSERT(handle == (uv_handle_t*)&conn || handle == (uv_handle_t*)&timer); close_cb_called++; } /* Verify that connecting to an unreachable address or port doesn't hang * the event loop. */ TEST_IMPL(tcp_connect_timeout) { struct sockaddr_in addr; int r; ASSERT(0 == uv_ip4_addr("8.8.8.8", 9999, &addr)); r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 50, 0); ASSERT(r == 0); r = uv_tcp_init(uv_default_loop(), &conn); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &conn, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-connect6-error.c0000644000175000017500000000426412456307253022510 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static int connect_cb_called = 0; static int close_cb_called = 0; static void connect_cb(uv_connect_t* handle, int status) { ASSERT(handle != NULL); connect_cb_called++; } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } TEST_IMPL(tcp_connect6_error_fault) { const char garbage[] = "blah blah blah blah blah blah blah blah blah blah blah blah"; const struct sockaddr_in6* garbage_addr; uv_tcp_t server; int r; uv_connect_t req; garbage_addr = (const struct sockaddr_in6*) &garbage; r = uv_tcp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_tcp_connect(&req, &server, (const struct sockaddr*) garbage_addr, connect_cb); ASSERT(r == UV_EINVAL); uv_close((uv_handle_t*)&server, close_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(connect_cb_called == 0); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-flags.c0000644000175000017500000000314112456307253020727 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include TEST_IMPL(tcp_flags) { uv_loop_t* loop; uv_tcp_t handle; int r; loop = uv_default_loop(); r = uv_tcp_init(loop, &handle); ASSERT(r == 0); r = uv_tcp_nodelay(&handle, 1); ASSERT(r == 0); r = uv_tcp_keepalive(&handle, 1, 60); ASSERT(r == 0); uv_close((uv_handle_t*)&handle, NULL); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-open.c0000644000175000017500000001033712456307253020601 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #ifndef _WIN32 # include #endif static int shutdown_cb_called = 0; static int connect_cb_called = 0; static int write_cb_called = 0; static int close_cb_called = 0; static uv_connect_t connect_req; static uv_shutdown_t shutdown_req; static uv_write_t write_req; static void startup(void) { #ifdef _WIN32 struct WSAData wsa_data; int r = WSAStartup(MAKEWORD(2, 2), &wsa_data); ASSERT(r == 0); #endif } static uv_os_sock_t create_tcp_socket(void) { uv_os_sock_t sock; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); #ifdef _WIN32 ASSERT(sock != INVALID_SOCKET); #else ASSERT(sock >= 0); #endif #ifndef _WIN32 { /* Allow reuse of the port. */ int yes = 1; int r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes); ASSERT(r == 0); } #endif return sock; } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(req == &shutdown_req); ASSERT(status == 0); /* Now we wait for the EOF */ shutdown_cb_called++; } static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ASSERT(tcp != NULL); if (nread >= 0) { ASSERT(nread == 4); ASSERT(memcmp("PING", buf->base, nread) == 0); } else { ASSERT(nread == UV_EOF); printf("GOT EOF\n"); uv_close((uv_handle_t*)tcp, close_cb); } } static void write_cb(uv_write_t* req, int status) { ASSERT(req != NULL); if (status) { fprintf(stderr, "uv_write error: %s\n", uv_strerror(status)); ASSERT(0); } write_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { uv_buf_t buf = uv_buf_init("PING", 4); uv_stream_t* stream; int r; ASSERT(req == &connect_req); ASSERT(status == 0); stream = req->handle; connect_cb_called++; r = uv_write(&write_req, stream, &buf, 1, write_cb); ASSERT(r == 0); /* Shutdown on drain. */ r = uv_shutdown(&shutdown_req, stream, shutdown_cb); ASSERT(r == 0); /* Start reading */ r = uv_read_start(stream, alloc_cb, read_cb); ASSERT(r == 0); } TEST_IMPL(tcp_open) { struct sockaddr_in addr; uv_tcp_t client; uv_os_sock_t sock; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); startup(); sock = create_tcp_socket(); r = uv_tcp_init(uv_default_loop(), &client); ASSERT(r == 0); r = uv_tcp_open(&client, sock); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(shutdown_cb_called == 1); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-read-stop.c0000644000175000017500000000516412456307253021540 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_timer_t timer_handle; static uv_tcp_t tcp_handle; static uv_write_t write_req; static void fail_cb(void) { ASSERT(0 && "fail_cb called"); } static void write_cb(uv_write_t* req, int status) { uv_close((uv_handle_t*) &timer_handle, NULL); uv_close((uv_handle_t*) &tcp_handle, NULL); } static void timer_cb(uv_timer_t* handle) { uv_buf_t buf = uv_buf_init("PING", 4); ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &tcp_handle, &buf, 1, write_cb)); ASSERT(0 == uv_read_stop((uv_stream_t*) &tcp_handle)); } static void connect_cb(uv_connect_t* req, int status) { ASSERT(0 == status); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0)); ASSERT(0 == uv_read_start((uv_stream_t*) &tcp_handle, (uv_alloc_cb) fail_cb, (uv_read_cb) fail_cb)); } TEST_IMPL(tcp_read_stop) { uv_connect_t connect_req; struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &tcp_handle)); ASSERT(0 == uv_tcp_connect(&connect_req, &tcp_handle, (const struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-shutdown-after-write.c0000644000175000017500000000714612456307253023746 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static void write_cb(uv_write_t* req, int status); static void shutdown_cb(uv_shutdown_t* req, int status); static uv_tcp_t conn; static uv_timer_t timer; static uv_connect_t connect_req; static uv_write_t write_req; static uv_shutdown_t shutdown_req; static int connect_cb_called; static int write_cb_called; static int shutdown_cb_called; static int conn_close_cb_called; static int timer_close_cb_called; static void close_cb(uv_handle_t* handle) { if (handle == (uv_handle_t*)&conn) conn_close_cb_called++; else if (handle == (uv_handle_t*)&timer) timer_close_cb_called++; else ASSERT(0 && "bad handle in close_cb"); } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[64]; buf->base = slab; buf->len = sizeof(slab); } static void timer_cb(uv_timer_t* handle) { uv_buf_t buf; int r; uv_close((uv_handle_t*)handle, close_cb); buf = uv_buf_init("TEST", 4); r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb); ASSERT(r == 0); r = uv_shutdown(&shutdown_req, (uv_stream_t*)&conn, shutdown_cb); ASSERT(r == 0); } static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { } static void connect_cb(uv_connect_t* req, int status) { int r; ASSERT(status == 0); connect_cb_called++; r = uv_read_start((uv_stream_t*)&conn, alloc_cb, read_cb); ASSERT(r == 0); } static void write_cb(uv_write_t* req, int status) { ASSERT(status == 0); write_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { ASSERT(status == 0); shutdown_cb_called++; uv_close((uv_handle_t*)&conn, close_cb); } TEST_IMPL(tcp_shutdown_after_write) { struct sockaddr_in addr; uv_loop_t* loop; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); loop = uv_default_loop(); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 125, 0); ASSERT(r == 0); r = uv_tcp_init(loop, &conn); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &conn, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == 1); ASSERT(shutdown_cb_called == 1); ASSERT(conn_close_cb_called == 1); ASSERT(timer_close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-try-write.c0000644000175000017500000000723612456307253021612 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define MAX_BYTES 1024 * 1024 #ifdef _WIN32 TEST_IMPL(tcp_try_write) { MAKE_VALGRIND_HAPPY(); return 0; } #else /* !_WIN32 */ static uv_tcp_t server; static uv_tcp_t client; static uv_tcp_t incoming; static int connect_cb_called; static int close_cb_called; static int connection_cb_called; static int bytes_read; static int bytes_written; static void close_cb(uv_handle_t* handle) { close_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { int r; uv_buf_t buf; ASSERT(status == 0); connect_cb_called++; do { buf = uv_buf_init("PING", 4); r = uv_try_write((uv_stream_t*) &client, &buf, 1); ASSERT(r > 0 || r == UV_EAGAIN); if (r > 0) { bytes_written += r; break; } } while (1); uv_close((uv_handle_t*) &client, close_cb); } static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { static char base[1024]; buf->base = base; buf->len = sizeof(base); } static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { if (nread < 0) { uv_close((uv_handle_t*) tcp, close_cb); uv_close((uv_handle_t*) &server, close_cb); return; } bytes_read += nread; } static void connection_cb(uv_stream_t* tcp, int status) { ASSERT(status == 0); ASSERT(0 == uv_tcp_init(tcp->loop, &incoming)); ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming)); connection_cb_called++; ASSERT(0 == uv_read_start((uv_stream_t*) &incoming, alloc_cb, read_cb)); } static void start_server(void) { struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &server)); ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb)); } TEST_IMPL(tcp_try_write) { uv_connect_t connect_req; struct sockaddr_in addr; start_server(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &client)); ASSERT(0 == uv_tcp_connect(&connect_req, &client, (struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(connect_cb_called == 1); ASSERT(close_cb_called == 3); ASSERT(connection_cb_called == 1); ASSERT(bytes_read == bytes_written); ASSERT(bytes_written > 0); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-tcp-unexpected-read.c0000644000175000017500000000756312456307253022724 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_check_t check_handle; static uv_timer_t timer_handle; static uv_tcp_t server_handle; static uv_tcp_t client_handle; static uv_tcp_t peer_handle; static uv_write_t write_req; static uv_connect_t connect_req; static unsigned long ticks; /* event loop ticks */ static void check_cb(uv_check_t* handle) { ticks++; } static void timer_cb(uv_timer_t* handle) { uv_close((uv_handle_t*) &check_handle, NULL); uv_close((uv_handle_t*) &timer_handle, NULL); uv_close((uv_handle_t*) &server_handle, NULL); uv_close((uv_handle_t*) &client_handle, NULL); uv_close((uv_handle_t*) &peer_handle, NULL); } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { ASSERT(0 && "alloc_cb should not have been called"); } static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { ASSERT(0 && "read_cb should not have been called"); } static void connect_cb(uv_connect_t* req, int status) { ASSERT(req->handle == (uv_stream_t*) &client_handle); ASSERT(0 == status); } static void write_cb(uv_write_t* req, int status) { ASSERT(req->handle == (uv_stream_t*) &peer_handle); ASSERT(0 == status); } static void connection_cb(uv_stream_t* handle, int status) { uv_buf_t buf; buf = uv_buf_init("PING", 4); ASSERT(0 == status); ASSERT(0 == uv_accept(handle, (uv_stream_t*) &peer_handle)); ASSERT(0 == uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb)); ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &peer_handle, &buf, 1, write_cb)); } TEST_IMPL(tcp_unexpected_read) { struct sockaddr_in addr; uv_loop_t* loop; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); loop = uv_default_loop(); ASSERT(0 == uv_timer_init(loop, &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1000, 0)); ASSERT(0 == uv_check_init(loop, &check_handle)); ASSERT(0 == uv_check_start(&check_handle, check_cb)); ASSERT(0 == uv_tcp_init(loop, &server_handle)); ASSERT(0 == uv_tcp_init(loop, &client_handle)); ASSERT(0 == uv_tcp_init(loop, &peer_handle)); ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb)); ASSERT(0 == uv_tcp_connect(&connect_req, &client_handle, (const struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); /* This is somewhat inexact but the idea is that the event loop should not * start busy looping when the server sends a message and the client isn't * reading. */ ASSERT(ticks <= 20); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-write-after-connect.c0000644000175000017500000000427512456307253023524 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * 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. */ #ifndef _WIN32 #include "uv.h" #include "task.h" uv_loop_t loop; uv_tcp_t tcp_client; uv_connect_t connection_request; uv_write_t write_request; uv_buf_t buf = { "HELLO", 4 }; static void write_cb(uv_write_t *req, int status) { ASSERT(status == UV_ECANCELED); uv_close((uv_handle_t*) req->handle, NULL); } static void connect_cb(uv_connect_t *req, int status) { ASSERT(status == UV_ECONNREFUSED); } TEST_IMPL(tcp_write_after_connect) { struct sockaddr_in sa; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &sa)); ASSERT(0 == uv_loop_init(&loop)); ASSERT(0 == uv_tcp_init(&loop, &tcp_client)); ASSERT(0 == uv_tcp_connect(&connection_request, &tcp_client, (const struct sockaddr *) &sa, connect_cb)); ASSERT(0 == uv_write(&write_request, (uv_stream_t *)&tcp_client, &buf, 1, write_cb)); uv_run(&loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } #endif MoarVM-2015.11/3rdparty/libuv/test/test-tcp-write-queue-order.c0000644000175000017500000000747712502366750023237 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include #include #include #include "uv.h" #include "task.h" #define REQ_COUNT 10000 static uv_timer_t timer; static uv_tcp_t server; static uv_tcp_t client; static uv_tcp_t incoming; static int connect_cb_called; static int close_cb_called; static int connection_cb_called; static int write_callbacks; static int write_cancelled_callbacks; static int write_error_callbacks; static uv_write_t write_requests[REQ_COUNT]; static void close_cb(uv_handle_t* handle) { close_cb_called++; } void timer_cb(uv_timer_t* handle) { uv_close((uv_handle_t*) &client, close_cb); uv_close((uv_handle_t*) &server, close_cb); uv_close((uv_handle_t*) &incoming, close_cb); } void write_cb(uv_write_t* req, int status) { if (status == 0) write_callbacks++; else if (status == UV_ECANCELED) write_cancelled_callbacks++; else write_error_callbacks++; } static void connect_cb(uv_connect_t* req, int status) { static char base[1024]; int r; int i; uv_buf_t buf; ASSERT(status == 0); connect_cb_called++; buf = uv_buf_init(base, sizeof(base)); for (i = 0; i < REQ_COUNT; i++) { r = uv_write(&write_requests[i], req->handle, &buf, 1, write_cb); ASSERT(r == 0); } } static void connection_cb(uv_stream_t* tcp, int status) { ASSERT(status == 0); ASSERT(0 == uv_tcp_init(tcp->loop, &incoming)); ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming)); connection_cb_called++; } static void start_server(void) { struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &server)); ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0)); ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb)); } TEST_IMPL(tcp_write_queue_order) { uv_connect_t connect_req; struct sockaddr_in addr; start_server(); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_tcp_init(uv_default_loop(), &client)); ASSERT(0 == uv_tcp_connect(&connect_req, &client, (struct sockaddr*) &addr, connect_cb)); ASSERT(0 == uv_timer_init(uv_default_loop(), &timer)); ASSERT(0 == uv_timer_start(&timer, timer_cb, 100, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(connect_cb_called == 1); ASSERT(connection_cb_called == 1); ASSERT(write_callbacks > 0); ASSERT(write_cancelled_callbacks > 0); ASSERT(write_callbacks + write_error_callbacks + write_cancelled_callbacks == REQ_COUNT); ASSERT(close_cb_called == 3); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-write-to-half-open-connection.c0000644000175000017500000000762112456307253025420 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include static void connection_cb(uv_stream_t* server, int status); static void connect_cb(uv_connect_t* req, int status); static void write_cb(uv_write_t* req, int status); static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf); static uv_tcp_t tcp_server; static uv_tcp_t tcp_client; static uv_tcp_t tcp_peer; /* client socket as accept()-ed by server */ static uv_connect_t connect_req; static uv_write_t write_req; static int write_cb_called; static int read_cb_called; static void connection_cb(uv_stream_t* server, int status) { int r; uv_buf_t buf; ASSERT(server == (uv_stream_t*)&tcp_server); ASSERT(status == 0); r = uv_tcp_init(server->loop, &tcp_peer); ASSERT(r == 0); r = uv_accept(server, (uv_stream_t*)&tcp_peer); ASSERT(r == 0); r = uv_read_start((uv_stream_t*)&tcp_peer, alloc_cb, read_cb); ASSERT(r == 0); buf.base = "hello\n"; buf.len = 6; r = uv_write(&write_req, (uv_stream_t*)&tcp_peer, &buf, 1, write_cb); ASSERT(r == 0); } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[1024]; buf->base = slab; buf->len = sizeof(slab); } static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { if (nread < 0) { fprintf(stderr, "read_cb error: %s\n", uv_err_name(nread)); ASSERT(nread == UV_ECONNRESET || nread == UV_EOF); uv_close((uv_handle_t*)&tcp_server, NULL); uv_close((uv_handle_t*)&tcp_peer, NULL); } read_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { ASSERT(req == &connect_req); ASSERT(status == 0); /* Close the client. */ uv_close((uv_handle_t*)&tcp_client, NULL); } static void write_cb(uv_write_t* req, int status) { ASSERT(status == 0); write_cb_called++; } TEST_IMPL(tcp_write_to_half_open_connection) { struct sockaddr_in addr; uv_loop_t* loop; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); loop = uv_default_loop(); ASSERT(loop != NULL); r = uv_tcp_init(loop, &tcp_server); ASSERT(r == 0); r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_listen((uv_stream_t*)&tcp_server, 1, connection_cb); ASSERT(r == 0); r = uv_tcp_init(loop, &tcp_client); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &tcp_client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(write_cb_called > 0); ASSERT(read_cb_called > 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tcp-writealot.c0000644000175000017500000001073112456307253021650 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #define WRITES 3 #define CHUNKS_PER_WRITE 4096 #define CHUNK_SIZE 10024 /* 10 kb */ #define TOTAL_BYTES (WRITES * CHUNKS_PER_WRITE * CHUNK_SIZE) static char* send_buffer; static int shutdown_cb_called = 0; static int connect_cb_called = 0; static int write_cb_called = 0; static int close_cb_called = 0; static size_t bytes_sent = 0; static size_t bytes_sent_done = 0; static size_t bytes_received_done = 0; static uv_connect_t connect_req; static uv_shutdown_t shutdown_req; static uv_write_t write_reqs[WRITES]; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = malloc(size); buf->len = size; } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void shutdown_cb(uv_shutdown_t* req, int status) { uv_tcp_t* tcp; ASSERT(req == &shutdown_req); ASSERT(status == 0); tcp = (uv_tcp_t*)(req->handle); /* The write buffer should be empty by now. */ ASSERT(tcp->write_queue_size == 0); /* Now we wait for the EOF */ shutdown_cb_called++; /* We should have had all the writes called already. */ ASSERT(write_cb_called == WRITES); } static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) { ASSERT(tcp != NULL); if (nread >= 0) { bytes_received_done += nread; } else { ASSERT(nread == UV_EOF); printf("GOT EOF\n"); uv_close((uv_handle_t*)tcp, close_cb); } free(buf->base); } static void write_cb(uv_write_t* req, int status) { ASSERT(req != NULL); if (status) { fprintf(stderr, "uv_write error: %s\n", uv_strerror(status)); ASSERT(0); } bytes_sent_done += CHUNKS_PER_WRITE * CHUNK_SIZE; write_cb_called++; } static void connect_cb(uv_connect_t* req, int status) { uv_buf_t send_bufs[CHUNKS_PER_WRITE]; uv_stream_t* stream; int i, j, r; ASSERT(req == &connect_req); ASSERT(status == 0); stream = req->handle; connect_cb_called++; /* Write a lot of data */ for (i = 0; i < WRITES; i++) { uv_write_t* write_req = write_reqs + i; for (j = 0; j < CHUNKS_PER_WRITE; j++) { send_bufs[j] = uv_buf_init(send_buffer + bytes_sent, CHUNK_SIZE); bytes_sent += CHUNK_SIZE; } r = uv_write(write_req, stream, send_bufs, CHUNKS_PER_WRITE, write_cb); ASSERT(r == 0); } /* Shutdown on drain. */ r = uv_shutdown(&shutdown_req, stream, shutdown_cb); ASSERT(r == 0); /* Start reading */ r = uv_read_start(stream, alloc_cb, read_cb); ASSERT(r == 0); } TEST_IMPL(tcp_writealot) { struct sockaddr_in addr; uv_tcp_t client; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); send_buffer = calloc(1, TOTAL_BYTES); ASSERT(send_buffer != NULL); r = uv_tcp_init(uv_default_loop(), &client); ASSERT(r == 0); r = uv_tcp_connect(&connect_req, &client, (const struct sockaddr*) &addr, connect_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(shutdown_cb_called == 1); ASSERT(connect_cb_called == 1); ASSERT(write_cb_called == WRITES); ASSERT(close_cb_called == 1); ASSERT(bytes_sent == TOTAL_BYTES); ASSERT(bytes_sent_done == TOTAL_BYTES); ASSERT(bytes_received_done == TOTAL_BYTES); free(send_buffer); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-thread-equal.c0000644000175000017500000000360712502366750021431 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" uv_thread_t main_thread_id; uv_thread_t subthreads[2]; static void check_thread(void* arg) { uv_thread_t *thread_id = arg; uv_thread_t self_id = uv_thread_self(); ASSERT(uv_thread_equal(&main_thread_id, &self_id) == 0); *thread_id = uv_thread_self(); } TEST_IMPL(thread_equal) { uv_thread_t threads[2]; main_thread_id = uv_thread_self(); ASSERT(0 != uv_thread_equal(&main_thread_id, &main_thread_id)); ASSERT(0 == uv_thread_create(threads + 0, check_thread, subthreads + 0)); ASSERT(0 == uv_thread_create(threads + 1, check_thread, subthreads + 1)); ASSERT(0 == uv_thread_join(threads + 0)); ASSERT(0 == uv_thread_join(threads + 1)); ASSERT(0 == uv_thread_equal(subthreads + 0, subthreads + 1)); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-thread.c0000644000175000017500000001216112456307253020320 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include /* memset */ struct getaddrinfo_req { uv_thread_t thread_id; unsigned int counter; uv_loop_t* loop; uv_getaddrinfo_t handle; }; struct fs_req { uv_thread_t thread_id; unsigned int counter; uv_loop_t* loop; uv_fs_t handle; }; struct test_thread { uv_thread_t thread_id; volatile int thread_called; }; static void getaddrinfo_do(struct getaddrinfo_req* req); static void getaddrinfo_cb(uv_getaddrinfo_t* handle, int status, struct addrinfo* res); static void fs_do(struct fs_req* req); static void fs_cb(uv_fs_t* handle); static volatile int thread_called; static uv_key_t tls_key; static void getaddrinfo_do(struct getaddrinfo_req* req) { int r; r = uv_getaddrinfo(req->loop, &req->handle, getaddrinfo_cb, "localhost", NULL, NULL); ASSERT(r == 0); } static void getaddrinfo_cb(uv_getaddrinfo_t* handle, int status, struct addrinfo* res) { struct getaddrinfo_req* req; ASSERT(status == 0); req = container_of(handle, struct getaddrinfo_req, handle); uv_freeaddrinfo(res); if (--req->counter) getaddrinfo_do(req); } static void fs_do(struct fs_req* req) { int r; r = uv_fs_stat(req->loop, &req->handle, ".", fs_cb); ASSERT(r == 0); } static void fs_cb(uv_fs_t* handle) { struct fs_req* req = container_of(handle, struct fs_req, handle); uv_fs_req_cleanup(handle); if (--req->counter) fs_do(req); } static void do_work(void* arg) { struct getaddrinfo_req getaddrinfo_reqs[16]; struct fs_req fs_reqs[16]; uv_loop_t* loop; size_t i; int r; struct test_thread* thread = arg; loop = malloc(sizeof *loop); ASSERT(loop != NULL); ASSERT(0 == uv_loop_init(loop)); for (i = 0; i < ARRAY_SIZE(getaddrinfo_reqs); i++) { struct getaddrinfo_req* req = getaddrinfo_reqs + i; req->counter = 16; req->loop = loop; getaddrinfo_do(req); } for (i = 0; i < ARRAY_SIZE(fs_reqs); i++) { struct fs_req* req = fs_reqs + i; req->counter = 16; req->loop = loop; fs_do(req); } r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(0 == uv_loop_close(loop)); free(loop); thread->thread_called = 1; } static void thread_entry(void* arg) { ASSERT(arg == (void *) 42); thread_called++; } TEST_IMPL(thread_create) { uv_thread_t tid; int r; r = uv_thread_create(&tid, thread_entry, (void *) 42); ASSERT(r == 0); r = uv_thread_join(&tid); ASSERT(r == 0); ASSERT(thread_called == 1); return 0; } /* Hilariously bad test name. Run a lot of tasks in the thread pool and verify * that each "finished" callback is run in its originating thread. */ TEST_IMPL(threadpool_multiple_event_loops) { struct test_thread threads[8]; size_t i; int r; memset(threads, 0, sizeof(threads)); for (i = 0; i < ARRAY_SIZE(threads); i++) { r = uv_thread_create(&threads[i].thread_id, do_work, &threads[i]); ASSERT(r == 0); } for (i = 0; i < ARRAY_SIZE(threads); i++) { r = uv_thread_join(&threads[i].thread_id); ASSERT(r == 0); ASSERT(threads[i].thread_called); } return 0; } static void tls_thread(void* arg) { ASSERT(NULL == uv_key_get(&tls_key)); uv_key_set(&tls_key, arg); ASSERT(arg == uv_key_get(&tls_key)); uv_key_set(&tls_key, NULL); ASSERT(NULL == uv_key_get(&tls_key)); } TEST_IMPL(thread_local_storage) { char name[] = "main"; uv_thread_t threads[2]; ASSERT(0 == uv_key_create(&tls_key)); ASSERT(NULL == uv_key_get(&tls_key)); uv_key_set(&tls_key, name); ASSERT(name == uv_key_get(&tls_key)); ASSERT(0 == uv_thread_create(threads + 0, tls_thread, threads + 0)); ASSERT(0 == uv_thread_create(threads + 1, tls_thread, threads + 1)); ASSERT(0 == uv_thread_join(threads + 0)); ASSERT(0 == uv_thread_join(threads + 1)); uv_key_delete(&tls_key); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-threadpool-cancel.c0000644000175000017500000002406312502366750022440 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #define INIT_CANCEL_INFO(ci, what) \ do { \ (ci)->reqs = (what); \ (ci)->nreqs = ARRAY_SIZE(what); \ (ci)->stride = sizeof((what)[0]); \ } \ while (0) struct cancel_info { void* reqs; unsigned nreqs; unsigned stride; uv_timer_t timer_handle; }; static uv_cond_t signal_cond; static uv_mutex_t signal_mutex; static uv_mutex_t wait_mutex; static unsigned num_threads; static unsigned fs_cb_called; static unsigned work_cb_called; static unsigned done_cb_called; static unsigned done2_cb_called; static unsigned timer_cb_called; static void work_cb(uv_work_t* req) { uv_mutex_lock(&signal_mutex); uv_cond_signal(&signal_cond); uv_mutex_unlock(&signal_mutex); uv_mutex_lock(&wait_mutex); uv_mutex_unlock(&wait_mutex); work_cb_called++; } static void done_cb(uv_work_t* req, int status) { done_cb_called++; free(req); } static void saturate_threadpool(void) { uv_work_t* req; ASSERT(0 == uv_cond_init(&signal_cond)); ASSERT(0 == uv_mutex_init(&signal_mutex)); ASSERT(0 == uv_mutex_init(&wait_mutex)); uv_mutex_lock(&signal_mutex); uv_mutex_lock(&wait_mutex); for (num_threads = 0; /* empty */; num_threads++) { req = malloc(sizeof(*req)); ASSERT(req != NULL); ASSERT(0 == uv_queue_work(uv_default_loop(), req, work_cb, done_cb)); /* Expect to get signalled within 350 ms, otherwise assume that * the thread pool is saturated. As with any timing dependent test, * this is obviously not ideal. */ if (uv_cond_timedwait(&signal_cond, &signal_mutex, (uint64_t) (350 * 1e6))) { ASSERT(0 == uv_cancel((uv_req_t*) req)); break; } } } static void unblock_threadpool(void) { uv_mutex_unlock(&signal_mutex); uv_mutex_unlock(&wait_mutex); } static void cleanup_threadpool(void) { ASSERT(done_cb_called == num_threads + 1); /* +1 == cancelled work req. */ ASSERT(work_cb_called == num_threads); uv_cond_destroy(&signal_cond); uv_mutex_destroy(&signal_mutex); uv_mutex_destroy(&wait_mutex); } static void fs_cb(uv_fs_t* req) { ASSERT(req->result == UV_ECANCELED); uv_fs_req_cleanup(req); fs_cb_called++; } static void getaddrinfo_cb(uv_getaddrinfo_t* req, int status, struct addrinfo* res) { ASSERT(status == UV_EAI_CANCELED); ASSERT(res == NULL); uv_freeaddrinfo(res); /* Should not crash. */ } static void getnameinfo_cb(uv_getnameinfo_t* handle, int status, const char* hostname, const char* service) { ASSERT(status == UV_EAI_CANCELED); ASSERT(hostname == NULL); ASSERT(service == NULL); } static void work2_cb(uv_work_t* req) { ASSERT(0 && "work2_cb called"); } static void done2_cb(uv_work_t* req, int status) { ASSERT(status == UV_ECANCELED); done2_cb_called++; } static void timer_cb(uv_timer_t* handle) { struct cancel_info* ci; uv_req_t* req; unsigned i; ci = container_of(handle, struct cancel_info, timer_handle); for (i = 0; i < ci->nreqs; i++) { req = (uv_req_t*) ((char*) ci->reqs + i * ci->stride); ASSERT(0 == uv_cancel(req)); } uv_close((uv_handle_t*) &ci->timer_handle, NULL); unblock_threadpool(); timer_cb_called++; } static void nop_work_cb(uv_work_t* req) { } static void nop_done_cb(uv_work_t* req, int status) { req->data = "OK"; } TEST_IMPL(threadpool_cancel_getaddrinfo) { uv_getaddrinfo_t reqs[4]; struct cancel_info ci; struct addrinfo hints; uv_loop_t* loop; int r; INIT_CANCEL_INFO(&ci, reqs); loop = uv_default_loop(); saturate_threadpool(); r = uv_getaddrinfo(loop, reqs + 0, getaddrinfo_cb, "fail", NULL, NULL); ASSERT(r == 0); r = uv_getaddrinfo(loop, reqs + 1, getaddrinfo_cb, NULL, "fail", NULL); ASSERT(r == 0); r = uv_getaddrinfo(loop, reqs + 2, getaddrinfo_cb, "fail", "fail", NULL); ASSERT(r == 0); r = uv_getaddrinfo(loop, reqs + 3, getaddrinfo_cb, "fail", NULL, &hints); ASSERT(r == 0); ASSERT(0 == uv_timer_init(loop, &ci.timer_handle)); ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(1 == timer_cb_called); cleanup_threadpool(); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(threadpool_cancel_getnameinfo) { uv_getnameinfo_t reqs[4]; struct sockaddr_in addr4; struct cancel_info ci; uv_loop_t* loop; int r; r = uv_ip4_addr("127.0.0.1", 80, &addr4); ASSERT(r == 0); INIT_CANCEL_INFO(&ci, reqs); loop = uv_default_loop(); saturate_threadpool(); r = uv_getnameinfo(loop, reqs + 0, getnameinfo_cb, (const struct sockaddr*)&addr4, 0); ASSERT(r == 0); r = uv_getnameinfo(loop, reqs + 1, getnameinfo_cb, (const struct sockaddr*)&addr4, 0); ASSERT(r == 0); r = uv_getnameinfo(loop, reqs + 2, getnameinfo_cb, (const struct sockaddr*)&addr4, 0); ASSERT(r == 0); r = uv_getnameinfo(loop, reqs + 3, getnameinfo_cb, (const struct sockaddr*)&addr4, 0); ASSERT(r == 0); ASSERT(0 == uv_timer_init(loop, &ci.timer_handle)); ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(1 == timer_cb_called); cleanup_threadpool(); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(threadpool_cancel_work) { struct cancel_info ci; uv_work_t reqs[16]; uv_loop_t* loop; unsigned i; INIT_CANCEL_INFO(&ci, reqs); loop = uv_default_loop(); saturate_threadpool(); for (i = 0; i < ARRAY_SIZE(reqs); i++) ASSERT(0 == uv_queue_work(loop, reqs + i, work2_cb, done2_cb)); ASSERT(0 == uv_timer_init(loop, &ci.timer_handle)); ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(1 == timer_cb_called); ASSERT(ARRAY_SIZE(reqs) == done2_cb_called); cleanup_threadpool(); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(threadpool_cancel_fs) { struct cancel_info ci; uv_fs_t reqs[25]; uv_loop_t* loop; unsigned n; INIT_CANCEL_INFO(&ci, reqs); loop = uv_default_loop(); saturate_threadpool(); /* Needs to match ARRAY_SIZE(fs_reqs). */ n = 0; ASSERT(0 == uv_fs_chmod(loop, reqs + n++, "/", 0, fs_cb)); ASSERT(0 == uv_fs_chown(loop, reqs + n++, "/", 0, 0, fs_cb)); ASSERT(0 == uv_fs_close(loop, reqs + n++, 0, fs_cb)); ASSERT(0 == uv_fs_fchmod(loop, reqs + n++, 0, 0, fs_cb)); ASSERT(0 == uv_fs_fchown(loop, reqs + n++, 0, 0, 0, fs_cb)); ASSERT(0 == uv_fs_fdatasync(loop, reqs + n++, 0, fs_cb)); ASSERT(0 == uv_fs_fstat(loop, reqs + n++, 0, fs_cb)); ASSERT(0 == uv_fs_fsync(loop, reqs + n++, 0, fs_cb)); ASSERT(0 == uv_fs_ftruncate(loop, reqs + n++, 0, 0, fs_cb)); ASSERT(0 == uv_fs_futime(loop, reqs + n++, 0, 0, 0, fs_cb)); ASSERT(0 == uv_fs_link(loop, reqs + n++, "/", "/", fs_cb)); ASSERT(0 == uv_fs_lstat(loop, reqs + n++, "/", fs_cb)); ASSERT(0 == uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb)); ASSERT(0 == uv_fs_open(loop, reqs + n++, "/", 0, 0, fs_cb)); ASSERT(0 == uv_fs_read(loop, reqs + n++, 0, NULL, 0, 0, fs_cb)); ASSERT(0 == uv_fs_scandir(loop, reqs + n++, "/", 0, fs_cb)); ASSERT(0 == uv_fs_readlink(loop, reqs + n++, "/", fs_cb)); ASSERT(0 == uv_fs_rename(loop, reqs + n++, "/", "/", fs_cb)); ASSERT(0 == uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb)); ASSERT(0 == uv_fs_sendfile(loop, reqs + n++, 0, 0, 0, 0, fs_cb)); ASSERT(0 == uv_fs_stat(loop, reqs + n++, "/", fs_cb)); ASSERT(0 == uv_fs_symlink(loop, reqs + n++, "/", "/", 0, fs_cb)); ASSERT(0 == uv_fs_unlink(loop, reqs + n++, "/", fs_cb)); ASSERT(0 == uv_fs_utime(loop, reqs + n++, "/", 0, 0, fs_cb)); ASSERT(0 == uv_fs_write(loop, reqs + n++, 0, NULL, 0, 0, fs_cb)); ASSERT(n == ARRAY_SIZE(reqs)); ASSERT(0 == uv_timer_init(loop, &ci.timer_handle)); ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0)); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(n == fs_cb_called); ASSERT(1 == timer_cb_called); cleanup_threadpool(); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(threadpool_cancel_single) { uv_loop_t* loop; uv_work_t req; int cancelled; int i; loop = uv_default_loop(); for (i = 0; i < 5000; i++) { req.data = NULL; ASSERT(0 == uv_queue_work(loop, &req, nop_work_cb, nop_done_cb)); cancelled = uv_cancel((uv_req_t*) &req); if (cancelled == 0) break; ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); } if (cancelled != 0) { fputs("Failed to cancel a work req in 5,000 iterations, giving up.\n", stderr); return 1; } ASSERT(req.data == NULL); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); ASSERT(req.data != NULL); /* Should have been updated by nop_done_cb(). */ MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-threadpool.c0000644000175000017500000000427112456307253021215 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int work_cb_count; static int after_work_cb_count; static uv_work_t work_req; static char data; static void work_cb(uv_work_t* req) { ASSERT(req == &work_req); ASSERT(req->data == &data); work_cb_count++; } static void after_work_cb(uv_work_t* req, int status) { ASSERT(status == 0); ASSERT(req == &work_req); ASSERT(req->data == &data); after_work_cb_count++; } TEST_IMPL(threadpool_queue_work_simple) { int r; work_req.data = &data; r = uv_queue_work(uv_default_loop(), &work_req, work_cb, after_work_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(work_cb_count == 1); ASSERT(after_work_cb_count == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(threadpool_queue_work_einval) { int r; work_req.data = &data; r = uv_queue_work(uv_default_loop(), &work_req, NULL, after_work_cb); ASSERT(r == UV_EINVAL); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(work_cb_count == 0); ASSERT(after_work_cb_count == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-timer-again.c0000644000175000017500000000765612456307253021263 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int close_cb_called = 0; static int repeat_1_cb_called = 0; static int repeat_2_cb_called = 0; static int repeat_2_cb_allowed = 0; static uv_timer_t dummy, repeat_1, repeat_2; static uint64_t start_time; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void repeat_1_cb(uv_timer_t* handle) { int r; ASSERT(handle == &repeat_1); ASSERT(uv_timer_get_repeat((uv_timer_t*)handle) == 50); LOGF("repeat_1_cb called after %ld ms\n", (long int)(uv_now(uv_default_loop()) - start_time)); repeat_1_cb_called++; r = uv_timer_again(&repeat_2); ASSERT(r == 0); if (repeat_1_cb_called == 10) { uv_close((uv_handle_t*)handle, close_cb); /* We're not calling uv_timer_again on repeat_2 any more, so after this */ /* timer_2_cb is expected. */ repeat_2_cb_allowed = 1; return; } } static void repeat_2_cb(uv_timer_t* handle) { ASSERT(handle == &repeat_2); ASSERT(repeat_2_cb_allowed); LOGF("repeat_2_cb called after %ld ms\n", (long int)(uv_now(uv_default_loop()) - start_time)); repeat_2_cb_called++; if (uv_timer_get_repeat(&repeat_2) == 0) { ASSERT(0 == uv_is_active((uv_handle_t*) handle)); uv_close((uv_handle_t*)handle, close_cb); return; } LOGF("uv_timer_get_repeat %ld ms\n", (long int)uv_timer_get_repeat(&repeat_2)); ASSERT(uv_timer_get_repeat(&repeat_2) == 100); /* This shouldn't take effect immediately. */ uv_timer_set_repeat(&repeat_2, 0); } TEST_IMPL(timer_again) { int r; start_time = uv_now(uv_default_loop()); ASSERT(0 < start_time); /* Verify that it is not possible to uv_timer_again a never-started timer. */ r = uv_timer_init(uv_default_loop(), &dummy); ASSERT(r == 0); r = uv_timer_again(&dummy); ASSERT(r == UV_EINVAL); uv_unref((uv_handle_t*)&dummy); /* Start timer repeat_1. */ r = uv_timer_init(uv_default_loop(), &repeat_1); ASSERT(r == 0); r = uv_timer_start(&repeat_1, repeat_1_cb, 50, 0); ASSERT(r == 0); ASSERT(uv_timer_get_repeat(&repeat_1) == 0); /* Actually make repeat_1 repeating. */ uv_timer_set_repeat(&repeat_1, 50); ASSERT(uv_timer_get_repeat(&repeat_1) == 50); /* * Start another repeating timer. It'll be again()ed by the repeat_1 so * it should not time out until repeat_1 stops. */ r = uv_timer_init(uv_default_loop(), &repeat_2); ASSERT(r == 0); r = uv_timer_start(&repeat_2, repeat_2_cb, 100, 100); ASSERT(r == 0); ASSERT(uv_timer_get_repeat(&repeat_2) == 100); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(repeat_1_cb_called == 10); ASSERT(repeat_2_cb_called == 2); ASSERT(close_cb_called == 2); LOGF("Test took %ld ms (expected ~700 ms)\n", (long int)(uv_now(uv_default_loop()) - start_time)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-timer-from-check.c0000644000175000017500000000562312456307253022212 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static uv_prepare_t prepare_handle; static uv_check_t check_handle; static uv_timer_t timer_handle; static int prepare_cb_called; static int check_cb_called; static int timer_cb_called; static void prepare_cb(uv_prepare_t* handle) { ASSERT(0 == uv_prepare_stop(&prepare_handle)); ASSERT(0 == prepare_cb_called); ASSERT(1 == check_cb_called); ASSERT(0 == timer_cb_called); prepare_cb_called++; } static void timer_cb(uv_timer_t* handle) { ASSERT(0 == uv_timer_stop(&timer_handle)); ASSERT(1 == prepare_cb_called); ASSERT(1 == check_cb_called); ASSERT(0 == timer_cb_called); timer_cb_called++; } static void check_cb(uv_check_t* handle) { ASSERT(0 == uv_check_stop(&check_handle)); ASSERT(0 == uv_timer_stop(&timer_handle)); /* Runs before timer_cb. */ ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0)); ASSERT(0 == uv_prepare_start(&prepare_handle, prepare_cb)); ASSERT(0 == prepare_cb_called); ASSERT(0 == check_cb_called); ASSERT(0 == timer_cb_called); check_cb_called++; } TEST_IMPL(timer_from_check) { ASSERT(0 == uv_prepare_init(uv_default_loop(), &prepare_handle)); ASSERT(0 == uv_check_init(uv_default_loop(), &check_handle)); ASSERT(0 == uv_check_start(&check_handle, check_cb)); ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(1 == prepare_cb_called); ASSERT(1 == check_cb_called); ASSERT(1 == timer_cb_called); uv_close((uv_handle_t*) &prepare_handle, NULL); uv_close((uv_handle_t*) &check_handle, NULL); uv_close((uv_handle_t*) &timer_handle, NULL); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-timer.c0000644000175000017500000001762612502366750020203 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" static int once_cb_called = 0; static int once_close_cb_called = 0; static int repeat_cb_called = 0; static int repeat_close_cb_called = 0; static int order_cb_called = 0; static uint64_t start_time; static uv_timer_t tiny_timer; static uv_timer_t huge_timer1; static uv_timer_t huge_timer2; static void once_close_cb(uv_handle_t* handle) { printf("ONCE_CLOSE_CB\n"); ASSERT(handle != NULL); ASSERT(0 == uv_is_active(handle)); once_close_cb_called++; } static void once_cb(uv_timer_t* handle) { printf("ONCE_CB %d\n", once_cb_called); ASSERT(handle != NULL); ASSERT(0 == uv_is_active((uv_handle_t*) handle)); once_cb_called++; uv_close((uv_handle_t*)handle, once_close_cb); /* Just call this randomly for the code coverage. */ uv_update_time(uv_default_loop()); } static void repeat_close_cb(uv_handle_t* handle) { printf("REPEAT_CLOSE_CB\n"); ASSERT(handle != NULL); repeat_close_cb_called++; } static void repeat_cb(uv_timer_t* handle) { printf("REPEAT_CB\n"); ASSERT(handle != NULL); ASSERT(1 == uv_is_active((uv_handle_t*) handle)); repeat_cb_called++; if (repeat_cb_called == 5) { uv_close((uv_handle_t*)handle, repeat_close_cb); } } static void never_cb(uv_timer_t* handle) { FATAL("never_cb should never be called"); } TEST_IMPL(timer) { uv_timer_t once_timers[10]; uv_timer_t *once; uv_timer_t repeat, never; unsigned int i; int r; start_time = uv_now(uv_default_loop()); ASSERT(0 < start_time); /* Let 10 timers time out in 500 ms total. */ for (i = 0; i < ARRAY_SIZE(once_timers); i++) { once = once_timers + i; r = uv_timer_init(uv_default_loop(), once); ASSERT(r == 0); r = uv_timer_start(once, once_cb, i * 50, 0); ASSERT(r == 0); } /* The 11th timer is a repeating timer that runs 4 times */ r = uv_timer_init(uv_default_loop(), &repeat); ASSERT(r == 0); r = uv_timer_start(&repeat, repeat_cb, 100, 100); ASSERT(r == 0); /* The 12th timer should not do anything. */ r = uv_timer_init(uv_default_loop(), &never); ASSERT(r == 0); r = uv_timer_start(&never, never_cb, 100, 100); ASSERT(r == 0); r = uv_timer_stop(&never); ASSERT(r == 0); uv_unref((uv_handle_t*)&never); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(once_cb_called == 10); ASSERT(once_close_cb_called == 10); printf("repeat_cb_called %d\n", repeat_cb_called); ASSERT(repeat_cb_called == 5); ASSERT(repeat_close_cb_called == 1); ASSERT(500 <= uv_now(uv_default_loop()) - start_time); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(timer_start_twice) { uv_timer_t once; int r; r = uv_timer_init(uv_default_loop(), &once); ASSERT(r == 0); r = uv_timer_start(&once, never_cb, 86400 * 1000, 0); ASSERT(r == 0); r = uv_timer_start(&once, once_cb, 10, 0); ASSERT(r == 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(once_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(timer_init) { uv_timer_t handle; ASSERT(0 == uv_timer_init(uv_default_loop(), &handle)); ASSERT(0 == uv_timer_get_repeat(&handle)); ASSERT(0 == uv_is_active((uv_handle_t*) &handle)); MAKE_VALGRIND_HAPPY(); return 0; } static void order_cb_a(uv_timer_t *handle) { ASSERT(order_cb_called++ == *(int*)handle->data); } static void order_cb_b(uv_timer_t *handle) { ASSERT(order_cb_called++ == *(int*)handle->data); } TEST_IMPL(timer_order) { int first; int second; uv_timer_t handle_a; uv_timer_t handle_b; first = 0; second = 1; ASSERT(0 == uv_timer_init(uv_default_loop(), &handle_a)); ASSERT(0 == uv_timer_init(uv_default_loop(), &handle_b)); /* Test for starting handle_a then handle_b */ handle_a.data = &first; ASSERT(0 == uv_timer_start(&handle_a, order_cb_a, 0, 0)); handle_b.data = &second; ASSERT(0 == uv_timer_start(&handle_b, order_cb_b, 0, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(order_cb_called == 2); ASSERT(0 == uv_timer_stop(&handle_a)); ASSERT(0 == uv_timer_stop(&handle_b)); /* Test for starting handle_b then handle_a */ order_cb_called = 0; handle_b.data = &first; ASSERT(0 == uv_timer_start(&handle_b, order_cb_b, 0, 0)); handle_a.data = &second; ASSERT(0 == uv_timer_start(&handle_a, order_cb_a, 0, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); ASSERT(order_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } static void tiny_timer_cb(uv_timer_t* handle) { ASSERT(handle == &tiny_timer); uv_close((uv_handle_t*) &tiny_timer, NULL); uv_close((uv_handle_t*) &huge_timer1, NULL); uv_close((uv_handle_t*) &huge_timer2, NULL); } TEST_IMPL(timer_huge_timeout) { ASSERT(0 == uv_timer_init(uv_default_loop(), &tiny_timer)); ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer1)); ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer2)); ASSERT(0 == uv_timer_start(&tiny_timer, tiny_timer_cb, 1, 0)); ASSERT(0 == uv_timer_start(&huge_timer1, tiny_timer_cb, 0xffffffffffffLL, 0)); ASSERT(0 == uv_timer_start(&huge_timer2, tiny_timer_cb, (uint64_t) -1, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } static void huge_repeat_cb(uv_timer_t* handle) { static int ncalls; if (ncalls == 0) ASSERT(handle == &huge_timer1); else ASSERT(handle == &tiny_timer); if (++ncalls == 10) { uv_close((uv_handle_t*) &tiny_timer, NULL); uv_close((uv_handle_t*) &huge_timer1, NULL); } } TEST_IMPL(timer_huge_repeat) { ASSERT(0 == uv_timer_init(uv_default_loop(), &tiny_timer)); ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer1)); ASSERT(0 == uv_timer_start(&tiny_timer, huge_repeat_cb, 2, 2)); ASSERT(0 == uv_timer_start(&huge_timer1, huge_repeat_cb, 1, (uint64_t) -1)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } static unsigned int timer_run_once_timer_cb_called; static void timer_run_once_timer_cb(uv_timer_t* handle) { timer_run_once_timer_cb_called++; } TEST_IMPL(timer_run_once) { uv_timer_t timer_handle; ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle)); ASSERT(0 == uv_timer_start(&timer_handle, timer_run_once_timer_cb, 0, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); ASSERT(1 == timer_run_once_timer_cb_called); ASSERT(0 == uv_timer_start(&timer_handle, timer_run_once_timer_cb, 1, 0)); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); ASSERT(2 == timer_run_once_timer_cb_called); uv_close((uv_handle_t*) &timer_handle, NULL); ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE)); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(timer_null_callback) { uv_timer_t handle; ASSERT(0 == uv_timer_init(uv_default_loop(), &handle)); ASSERT(UV_EINVAL == uv_timer_start(&handle, NULL, 100, 100)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-tty.c0000644000175000017500000000717412456307253017701 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #ifdef _WIN32 # include # include #else /* Unix */ # include # include #endif #include #include TEST_IMPL(tty) { int r, width, height; int ttyin_fd, ttyout_fd; uv_tty_t tty_in, tty_out; uv_loop_t* loop = uv_default_loop(); /* Make sure we have an FD that refers to a tty */ #ifdef _WIN32 HANDLE handle; handle = CreateFileA("conin$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT(handle != INVALID_HANDLE_VALUE); ttyin_fd = _open_osfhandle((intptr_t) handle, 0); handle = CreateFileA("conout$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ASSERT(handle != INVALID_HANDLE_VALUE); ttyout_fd = _open_osfhandle((intptr_t) handle, 0); #else /* unix */ ttyin_fd = open("/dev/tty", O_RDONLY, 0); if (ttyin_fd < 0) { LOGF("Cannot open /dev/tty as read-only: %s\n", strerror(errno)); return TEST_SKIP; } ttyout_fd = open("/dev/tty", O_WRONLY, 0); if (ttyout_fd < 0) { LOGF("Cannot open /dev/tty as write-only: %s\n", strerror(errno)); return TEST_SKIP; } #endif ASSERT(ttyin_fd >= 0); ASSERT(ttyout_fd >= 0); ASSERT(UV_UNKNOWN_HANDLE == uv_guess_handle(-1)); ASSERT(UV_TTY == uv_guess_handle(ttyin_fd)); ASSERT(UV_TTY == uv_guess_handle(ttyout_fd)); r = uv_tty_init(uv_default_loop(), &tty_in, ttyin_fd, 1); /* Readable. */ ASSERT(r == 0); r = uv_tty_init(uv_default_loop(), &tty_out, ttyout_fd, 0); /* Writable. */ ASSERT(r == 0); r = uv_tty_get_winsize(&tty_out, &width, &height); ASSERT(r == 0); printf("width=%d height=%d\n", width, height); /* * Is it a safe assumption that most people have terminals larger than * 10x10? */ ASSERT(width > 10); ASSERT(height > 10); /* Turn on raw mode. */ r = uv_tty_set_mode(&tty_in, 1); ASSERT(r == 0); /* Turn off raw mode. */ r = uv_tty_set_mode(&tty_in, 0); ASSERT(r == 0); /* TODO check the actual mode! */ uv_close((uv_handle_t*) &tty_in, NULL); uv_close((uv_handle_t*) &tty_out, NULL); uv_run(loop, UV_RUN_DEFAULT); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-bind.c0000644000175000017500000000473412456307253020562 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include TEST_IMPL(udp_bind) { struct sockaddr_in addr; uv_loop_t* loop; uv_udp_t h1, h2; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); loop = uv_default_loop(); r = uv_udp_init(loop, &h1); ASSERT(r == 0); r = uv_udp_init(loop, &h2); ASSERT(r == 0); r = uv_udp_bind(&h1, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_bind(&h2, (const struct sockaddr*) &addr, 0); ASSERT(r == UV_EADDRINUSE); uv_close((uv_handle_t*) &h1, NULL); uv_close((uv_handle_t*) &h2, NULL); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(udp_bind_reuseaddr) { struct sockaddr_in addr; uv_loop_t* loop; uv_udp_t h1, h2; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); loop = uv_default_loop(); r = uv_udp_init(loop, &h1); ASSERT(r == 0); r = uv_udp_init(loop, &h2); ASSERT(r == 0); r = uv_udp_bind(&h1, (const struct sockaddr*) &addr, UV_UDP_REUSEADDR); ASSERT(r == 0); r = uv_udp_bind(&h2, (const struct sockaddr*) &addr, UV_UDP_REUSEADDR); ASSERT(r == 0); uv_close((uv_handle_t*) &h1, NULL); uv_close((uv_handle_t*) &h2, NULL); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-dgram-too-big.c0000644000175000017500000000501712456307253022271 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &handle_) #define CHECK_REQ(req) \ ASSERT((req) == &req_); static uv_udp_t handle_; static uv_udp_send_t req_; static int send_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void send_cb(uv_udp_send_t* req, int status) { CHECK_REQ(req); CHECK_HANDLE(req->handle); ASSERT(status == UV_EMSGSIZE); uv_close((uv_handle_t*)req->handle, close_cb); send_cb_called++; } TEST_IMPL(udp_dgram_too_big) { char dgram[65536]; /* 64K MTU is unlikely, even on localhost */ struct sockaddr_in addr; uv_buf_t buf; int r; memset(dgram, 42, sizeof dgram); /* silence valgrind */ r = uv_udp_init(uv_default_loop(), &handle_); ASSERT(r == 0); buf = uv_buf_init(dgram, sizeof dgram); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_send(&req_, &handle_, &buf, 1, (const struct sockaddr*) &addr, send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(send_cb_called == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(send_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-ipv6.c0000644000175000017500000001070112456307253020521 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server \ || (uv_udp_t*)(handle) == &client \ || (uv_timer_t*)(handle) == &timeout) #define CHECK_REQ(req) \ ASSERT((req) == &req_); static uv_udp_t client; static uv_udp_t server; static uv_udp_send_t req_; static uv_timer_t timeout; static int send_cb_called; static int recv_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void send_cb(uv_udp_send_t* req, int status) { CHECK_REQ(req); CHECK_HANDLE(req->handle); ASSERT(status == 0); send_cb_called++; } static void ipv6_recv_fail(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { ASSERT(0 && "this function should not have been called"); } static void ipv6_recv_ok(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { CHECK_HANDLE(handle); ASSERT(nread >= 0); if (nread) recv_cb_called++; } static void timeout_cb(uv_timer_t* timer) { uv_close((uv_handle_t*)&server, close_cb); uv_close((uv_handle_t*)&client, close_cb); uv_close((uv_handle_t*)&timeout, close_cb); } static void do_test(uv_udp_recv_cb recv_cb, int bind_flags) { struct sockaddr_in6 addr6; struct sockaddr_in addr; uv_buf_t buf; int r; ASSERT(0 == uv_ip6_addr("::0", TEST_PORT, &addr6)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_bind(&server, (const struct sockaddr*) &addr6, bind_flags); ASSERT(r == 0); r = uv_udp_recv_start(&server, alloc_cb, recv_cb); ASSERT(r == 0); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); buf = uv_buf_init("PING", 4); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_send(&req_, &client, &buf, 1, (const struct sockaddr*) &addr, send_cb); ASSERT(r == 0); r = uv_timer_init(uv_default_loop(), &timeout); ASSERT(r == 0); r = uv_timer_start(&timeout, timeout_cb, 500, 0); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(send_cb_called == 0); ASSERT(recv_cb_called == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 3); MAKE_VALGRIND_HAPPY(); } TEST_IMPL(udp_dual_stack) { #if defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NetBSD__) RETURN_SKIP("dual stack not enabled by default in this OS."); #else do_test(ipv6_recv_ok, 0); ASSERT(recv_cb_called == 1); ASSERT(send_cb_called == 1); return 0; #endif } TEST_IMPL(udp_ipv6_only) { do_test(ipv6_recv_fail, UV_UDP_IPV6ONLY); ASSERT(recv_cb_called == 0); ASSERT(send_cb_called == 1); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-multicast-interface.c0000644000175000017500000000544312456307253023607 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int sv_send_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); sv_send_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } TEST_IMPL(udp_multicast_interface) { int r; uv_udp_send_t req; uv_buf_t buf; struct sockaddr_in addr; struct sockaddr_in baddr; ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &baddr)); r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0); ASSERT(r == 0); r = uv_udp_set_multicast_interface(&server, "0.0.0.0"); ASSERT(r == 0); /* server sends "PING" */ buf = uv_buf_init("PING", 4); r = uv_udp_send(&req, &server, &buf, 1, (const struct sockaddr*)&addr, sv_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(sv_send_cb_called == 0); /* run the loop till all events are processed */ uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(sv_send_cb_called == 1); ASSERT(close_cb_called == 1); ASSERT(client.send_queue_size == 0); ASSERT(server.send_queue_size == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-multicast-interface6.c0000644000175000017500000000547312456307253023700 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int sv_send_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); sv_send_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } TEST_IMPL(udp_multicast_interface6) { int r; uv_udp_send_t req; uv_buf_t buf; struct sockaddr_in6 addr; struct sockaddr_in6 baddr; ASSERT(0 == uv_ip6_addr("::1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); ASSERT(0 == uv_ip6_addr("::", 0, &baddr)); r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0); ASSERT(r == 0); #if defined(__APPLE__) || defined(__FreeBSD__) r = uv_udp_set_multicast_interface(&server, "::1%lo0"); #else r = uv_udp_set_multicast_interface(&server, NULL); #endif ASSERT(r == 0); /* server sends "PING" */ buf = uv_buf_init("PING", 4); r = uv_udp_send(&req, &server, &buf, 1, (const struct sockaddr*)&addr, sv_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(sv_send_cb_called == 0); /* run the loop till all events are processed */ uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(sv_send_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-multicast-join.c0000644000175000017500000000761012456307253022604 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int cl_recv_cb_called; static int sv_send_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); sv_send_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } static void cl_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { CHECK_HANDLE(handle); ASSERT(flags == 0); cl_recv_cb_called++; if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards cl_recv_cb_called */ ASSERT(addr == NULL); return; } ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(!memcmp("PING", buf->base, nread)); /* we are done with the client handle, we can close it */ uv_close((uv_handle_t*) &client, close_cb); } TEST_IMPL(udp_multicast_join) { int r; uv_udp_send_t req; uv_buf_t buf; struct sockaddr_in addr; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); /* bind to the desired port */ r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); /* join the multicast channel */ r = uv_udp_set_membership(&client, "239.255.0.1", NULL, UV_JOIN_GROUP); ASSERT(r == 0); r = uv_udp_recv_start(&client, alloc_cb, cl_recv_cb); ASSERT(r == 0); buf = uv_buf_init("PING", 4); /* server sends "PING" */ r = uv_udp_send(&req, &server, &buf, 1, (const struct sockaddr*) &addr, sv_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(cl_recv_cb_called == 0); ASSERT(sv_send_cb_called == 0); /* run the loop till all events are processed */ uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(cl_recv_cb_called == 1); ASSERT(sv_send_cb_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-multicast-join6.c0000644000175000017500000000776012456307253022700 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int cl_recv_cb_called; static int sv_send_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); sv_send_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } static void cl_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { CHECK_HANDLE(handle); ASSERT(flags == 0); cl_recv_cb_called++; if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards cl_recv_cb_called */ ASSERT(addr == NULL); return; } ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(!memcmp("PING", buf->base, nread)); /* we are done with the client handle, we can close it */ uv_close((uv_handle_t*) &client, close_cb); } TEST_IMPL(udp_multicast_join6) { int r; uv_udp_send_t req; uv_buf_t buf; struct sockaddr_in6 addr; ASSERT(0 == uv_ip6_addr("::1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); /* bind to the desired port */ r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); /* join the multicast channel */ #if defined(__APPLE__) r = uv_udp_set_membership(&client, "ff02::1", "::1%lo0", UV_JOIN_GROUP); #else r = uv_udp_set_membership(&client, "ff02::1", NULL, UV_JOIN_GROUP); #endif ASSERT(r == 0); r = uv_udp_recv_start(&client, alloc_cb, cl_recv_cb); ASSERT(r == 0); buf = uv_buf_init("PING", 4); /* server sends "PING" */ r = uv_udp_send(&req, &server, &buf, 1, (const struct sockaddr*) &addr, sv_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(cl_recv_cb_called == 0); ASSERT(sv_send_cb_called == 0); /* run the loop till all events are processed */ uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(cl_recv_cb_called == 1); ASSERT(sv_send_cb_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-multicast-ttl.c0000644000175000017500000000524412456307253022451 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int sv_send_cb_called; static int close_cb_called; static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); close_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); sv_send_cb_called++; uv_close((uv_handle_t*) req->handle, close_cb); } TEST_IMPL(udp_multicast_ttl) { int r; uv_udp_send_t req; uv_buf_t buf; struct sockaddr_in addr; r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &addr)); r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_set_multicast_ttl(&server, 32); ASSERT(r == 0); /* server sends "PING" */ buf = uv_buf_init("PING", 4); ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr)); r = uv_udp_send(&req, &server, &buf, 1, (const struct sockaddr*) &addr, sv_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(sv_send_cb_called == 0); /* run the loop till all events are processed */ uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(sv_send_cb_called == 1); ASSERT(close_cb_called == 1); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-open.c0000644000175000017500000000756512456307253020614 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #ifndef _WIN32 # include #endif static int send_cb_called = 0; static int close_cb_called = 0; static uv_udp_send_t send_req; static void startup(void) { #ifdef _WIN32 struct WSAData wsa_data; int r = WSAStartup(MAKEWORD(2, 2), &wsa_data); ASSERT(r == 0); #endif } static uv_os_sock_t create_udp_socket(void) { uv_os_sock_t sock; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); #ifdef _WIN32 ASSERT(sock != INVALID_SOCKET); #else ASSERT(sock >= 0); #endif #ifndef _WIN32 { /* Allow reuse of the port. */ int yes = 1; int r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes); ASSERT(r == 0); } #endif return sock; } static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { int r; if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards sv_recv_cb_called */ ASSERT(addr == NULL); return; } ASSERT(flags == 0); ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(memcmp("PING", buf->base, nread) == 0); r = uv_udp_recv_stop(handle); ASSERT(r == 0); uv_close((uv_handle_t*) handle, close_cb); } static void send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); send_cb_called++; } TEST_IMPL(udp_open) { struct sockaddr_in addr; uv_buf_t buf = uv_buf_init("PING", 4); uv_udp_t client; uv_os_sock_t sock; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); startup(); sock = create_udp_socket(); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); r = uv_udp_open(&client, sock); ASSERT(r == 0); r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_recv_start(&client, alloc_cb, recv_cb); ASSERT(r == 0); r = uv_udp_send(&send_req, &client, &buf, 1, (const struct sockaddr*) &addr, send_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(send_cb_called == 1); ASSERT(close_cb_called == 1); ASSERT(client.send_queue_size == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-options.c0000644000175000017500000000617112456307253021336 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include TEST_IMPL(udp_options) { static int invalid_ttls[] = { -1, 0, 256 }; struct sockaddr_in addr; uv_loop_t* loop; uv_udp_t h; int i, r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); loop = uv_default_loop(); r = uv_udp_init(loop, &h); ASSERT(r == 0); uv_unref((uv_handle_t*)&h); /* don't keep the loop alive */ r = uv_udp_bind(&h, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_set_broadcast(&h, 1); r |= uv_udp_set_broadcast(&h, 1); r |= uv_udp_set_broadcast(&h, 0); r |= uv_udp_set_broadcast(&h, 0); ASSERT(r == 0); /* values 1-255 should work */ for (i = 1; i <= 255; i++) { r = uv_udp_set_ttl(&h, i); ASSERT(r == 0); } for (i = 0; i < (int) ARRAY_SIZE(invalid_ttls); i++) { r = uv_udp_set_ttl(&h, invalid_ttls[i]); ASSERT(r == UV_EINVAL); } r = uv_udp_set_multicast_loop(&h, 1); r |= uv_udp_set_multicast_loop(&h, 1); r |= uv_udp_set_multicast_loop(&h, 0); r |= uv_udp_set_multicast_loop(&h, 0); ASSERT(r == 0); /* values 0-255 should work */ for (i = 0; i <= 255; i++) { r = uv_udp_set_multicast_ttl(&h, i); ASSERT(r == 0); } /* anything >255 should fail */ r = uv_udp_set_multicast_ttl(&h, 256); ASSERT(r == UV_EINVAL); /* don't test ttl=-1, it's a valid value on some platforms */ r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); MAKE_VALGRIND_HAPPY(); return 0; } TEST_IMPL(udp_no_autobind) { uv_loop_t* loop; uv_udp_t h; loop = uv_default_loop(); ASSERT(0 == uv_udp_init(loop, &h)); ASSERT(UV_EBADF == uv_udp_set_multicast_ttl(&h, 32)); ASSERT(UV_EBADF == uv_udp_set_broadcast(&h, 1)); ASSERT(UV_EBADF == uv_udp_set_ttl(&h, 1)); ASSERT(UV_EBADF == uv_udp_set_multicast_loop(&h, 1)); ASSERT(UV_EBADF == uv_udp_set_multicast_interface(&h, "0.0.0.0")); uv_close((uv_handle_t*) &h, NULL); ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT)); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-send-and-recv.c0000644000175000017500000001251212456307253022265 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int cl_send_cb_called; static int cl_recv_cb_called; static int sv_send_cb_called; static int sv_recv_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); ASSERT(1 == uv_is_closing(handle)); close_cb_called++; } static void cl_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { CHECK_HANDLE(handle); ASSERT(flags == 0); if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards cl_recv_cb_called */ ASSERT(addr == NULL); return; } ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(!memcmp("PONG", buf->base, nread)); cl_recv_cb_called++; uv_close((uv_handle_t*) handle, close_cb); } static void cl_send_cb(uv_udp_send_t* req, int status) { int r; ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); r = uv_udp_recv_start(req->handle, alloc_cb, cl_recv_cb); ASSERT(r == 0); cl_send_cb_called++; } static void sv_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); uv_close((uv_handle_t*) req->handle, close_cb); free(req); sv_send_cb_called++; } static void sv_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { uv_udp_send_t* req; uv_buf_t sndbuf; int r; if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards sv_recv_cb_called */ ASSERT(addr == NULL); return; } CHECK_HANDLE(handle); ASSERT(flags == 0); ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(!memcmp("PING", rcvbuf->base, nread)); /* FIXME? `uv_udp_recv_stop` does what it says: recv_cb is not called * anymore. That's problematic because the read buffer won't be returned * either... Not sure I like that but it's consistent with `uv_read_stop`. */ r = uv_udp_recv_stop(handle); ASSERT(r == 0); req = malloc(sizeof *req); ASSERT(req != NULL); sndbuf = uv_buf_init("PONG", 4); r = uv_udp_send(req, handle, &sndbuf, 1, addr, sv_send_cb); ASSERT(r == 0); sv_recv_cb_called++; } TEST_IMPL(udp_send_and_recv) { struct sockaddr_in addr; uv_udp_send_t req; uv_buf_t buf; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); /* client sends "PING", expects "PONG" */ buf = uv_buf_init("PING", 4); r = uv_udp_send(&req, &client, &buf, 1, (const struct sockaddr*) &addr, cl_send_cb); ASSERT(r == 0); ASSERT(close_cb_called == 0); ASSERT(cl_send_cb_called == 0); ASSERT(cl_recv_cb_called == 0); ASSERT(sv_send_cb_called == 0); ASSERT(sv_recv_cb_called == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(cl_send_cb_called == 1); ASSERT(cl_recv_cb_called == 1); ASSERT(sv_send_cb_called == 1); ASSERT(sv_recv_cb_called == 1); ASSERT(close_cb_called == 2); ASSERT(client.send_queue_size == 0); ASSERT(server.send_queue_size == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-send-immediate.c0000644000175000017500000000764712456307253022541 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int cl_send_cb_called; static int sv_recv_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); ASSERT(1 == uv_is_closing(handle)); close_cb_called++; } static void cl_send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); cl_send_cb_called++; } static void sv_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { if (nread < 0) { ASSERT(0 && "unexpected error"); } if (nread == 0) { /* Returning unused buffer */ /* Don't count towards sv_recv_cb_called */ ASSERT(addr == NULL); return; } CHECK_HANDLE(handle); ASSERT(flags == 0); ASSERT(addr != NULL); ASSERT(nread == 4); ASSERT(memcmp("PING", rcvbuf->base, nread) == 0 || memcmp("PANG", rcvbuf->base, nread) == 0); if (++sv_recv_cb_called == 2) { uv_close((uv_handle_t*) &server, close_cb); uv_close((uv_handle_t*) &client, close_cb); } } TEST_IMPL(udp_send_immediate) { struct sockaddr_in addr; uv_udp_send_t req1, req2; uv_buf_t buf; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); /* client sends "PING", then "PANG" */ buf = uv_buf_init("PING", 4); r = uv_udp_send(&req1, &client, &buf, 1, (const struct sockaddr*) &addr, cl_send_cb); ASSERT(r == 0); buf = uv_buf_init("PANG", 4); r = uv_udp_send(&req2, &client, &buf, 1, (const struct sockaddr*) &addr, cl_send_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(cl_send_cb_called == 2); ASSERT(sv_recv_cb_called == 2); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-send-unreachable.c0000644000175000017500000000767612456307253023056 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &client) static uv_udp_t client; static uv_timer_t timer; static int send_cb_called; static int recv_cb_called; static int close_cb_called; static int alloc_cb_called; static int timer_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); alloc_cb_called++; } static void close_cb(uv_handle_t* handle) { ASSERT(1 == uv_is_closing(handle)); close_cb_called++; } static void send_cb(uv_udp_send_t* req, int status) { ASSERT(req != NULL); ASSERT(status == 0); CHECK_HANDLE(req->handle); send_cb_called++; } static void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { CHECK_HANDLE(handle); recv_cb_called++; if (nread < 0) { ASSERT(0 && "unexpected error"); } else if (nread == 0) { /* Returning unused buffer */ ASSERT(addr == NULL); } else { ASSERT(addr != NULL); } } static void timer_cb(uv_timer_t* h) { ASSERT(h == &timer); timer_cb_called++; uv_close((uv_handle_t*) &client, close_cb); uv_close((uv_handle_t*) h, close_cb); } TEST_IMPL(udp_send_unreachable) { struct sockaddr_in addr; struct sockaddr_in addr2; uv_udp_send_t req1, req2; uv_buf_t buf; int r; ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT_2, &addr2)); r = uv_timer_init( uv_default_loop(), &timer ); ASSERT(r == 0); r = uv_timer_start( &timer, timer_cb, 1000, 0 ); ASSERT(r == 0); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); r = uv_udp_bind(&client, (const struct sockaddr*) &addr2, 0); ASSERT(r == 0); r = uv_udp_recv_start(&client, alloc_cb, recv_cb); ASSERT(r == 0); /* client sends "PING", then "PANG" */ buf = uv_buf_init("PING", 4); r = uv_udp_send(&req1, &client, &buf, 1, (const struct sockaddr*) &addr, send_cb); ASSERT(r == 0); buf = uv_buf_init("PANG", 4); r = uv_udp_send(&req2, &client, &buf, 1, (const struct sockaddr*) &addr, send_cb); ASSERT(r == 0); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(send_cb_called == 2); ASSERT(recv_cb_called == alloc_cb_called); ASSERT(timer_cb_called == 1); ASSERT(close_cb_called == 2); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-udp-try-send.c0000644000175000017500000000671412456307253021413 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include #include #ifdef _WIN32 TEST_IMPL(udp_try_send) { MAKE_VALGRIND_HAPPY(); return 0; } #else /* !_WIN32 */ #define CHECK_HANDLE(handle) \ ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) static uv_udp_t server; static uv_udp_t client; static int sv_recv_cb_called; static int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static char slab[65536]; CHECK_HANDLE(handle); ASSERT(suggested_size <= sizeof(slab)); buf->base = slab; buf->len = sizeof(slab); } static void close_cb(uv_handle_t* handle) { CHECK_HANDLE(handle); ASSERT(uv_is_closing(handle)); close_cb_called++; } static void sv_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { ASSERT(nread > 0); if (nread == 0) { ASSERT(addr == NULL); return; } ASSERT(nread == 4); ASSERT(addr != NULL); ASSERT(memcmp("EXIT", rcvbuf->base, nread) == 0); uv_close((uv_handle_t*) handle, close_cb); uv_close((uv_handle_t*) &client, close_cb); sv_recv_cb_called++; } TEST_IMPL(udp_try_send) { struct sockaddr_in addr; static char buffer[64 * 1024]; uv_buf_t buf; int r; ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &server); ASSERT(r == 0); r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0); ASSERT(r == 0); r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb); ASSERT(r == 0); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); r = uv_udp_init(uv_default_loop(), &client); ASSERT(r == 0); buf = uv_buf_init(buffer, sizeof(buffer)); r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &addr); ASSERT(r == UV_EMSGSIZE); buf = uv_buf_init("EXIT", 4); r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &addr); ASSERT(r == 4); uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(close_cb_called == 2); ASSERT(sv_recv_cb_called == 1); ASSERT(client.send_queue_size == 0); ASSERT(server.send_queue_size == 0); MAKE_VALGRIND_HAPPY(); return 0; } #endif /* !_WIN32 */ MoarVM-2015.11/3rdparty/libuv/test/test-walk-handles.c0000644000175000017500000000441112456307253021422 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include static char magic_cookie[] = "magic cookie"; static int seen_timer_handle; static uv_timer_t timer; static void walk_cb(uv_handle_t* handle, void* arg) { ASSERT(arg == (void*)magic_cookie); if (handle == (uv_handle_t*)&timer) { seen_timer_handle++; } else { ASSERT(0 && "unexpected handle"); } } static void timer_cb(uv_timer_t* handle) { ASSERT(handle == &timer); uv_walk(handle->loop, walk_cb, magic_cookie); uv_close((uv_handle_t*)handle, NULL); } TEST_IMPL(walk_handles) { uv_loop_t* loop; int r; loop = uv_default_loop(); r = uv_timer_init(loop, &timer); ASSERT(r == 0); r = uv_timer_start(&timer, timer_cb, 1, 0); ASSERT(r == 0); /* Start event loop, expect to see the timer handle in walk_cb. */ ASSERT(seen_timer_handle == 0); r = uv_run(loop, UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(seen_timer_handle == 1); /* Loop is finished, walk_cb should not see our timer handle. */ seen_timer_handle = 0; uv_walk(loop, walk_cb, magic_cookie); ASSERT(seen_timer_handle == 0); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/test/test-watcher-cross-stop.c0000644000175000017500000000632612456307253022626 0ustar jnthnjnthn/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "task.h" #include #include /* NOTE: Number should be big enough to trigger this problem */ static uv_udp_t sockets[2500]; static uv_udp_send_t reqs[ARRAY_SIZE(sockets)]; static char slab[1]; static unsigned int recv_cb_called; static unsigned int send_cb_called; static unsigned int close_cb_called; static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) { buf->base = slab; buf->len = sizeof(slab); } static void recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { recv_cb_called++; } static void send_cb(uv_udp_send_t* req, int status) { send_cb_called++; } static void close_cb(uv_handle_t* handle) { close_cb_called++; } TEST_IMPL(watcher_cross_stop) { uv_loop_t* loop = uv_default_loop(); unsigned int i; struct sockaddr_in addr; uv_buf_t buf; char big_string[1024]; TEST_FILE_LIMIT(ARRAY_SIZE(sockets) + 32); ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); memset(big_string, 'A', sizeof(big_string)); buf = uv_buf_init(big_string, sizeof(big_string)); for (i = 0; i < ARRAY_SIZE(sockets); i++) { ASSERT(0 == uv_udp_init(loop, &sockets[i])); ASSERT(0 == uv_udp_bind(&sockets[i], (const struct sockaddr*) &addr, UV_UDP_REUSEADDR)); ASSERT(0 == uv_udp_recv_start(&sockets[i], alloc_cb, recv_cb)); ASSERT(0 == uv_udp_send(&reqs[i], &sockets[i], &buf, 1, (const struct sockaddr*) &addr, send_cb)); } while (recv_cb_called == 0) uv_run(loop, UV_RUN_ONCE); for (i = 0; i < ARRAY_SIZE(sockets); i++) uv_close((uv_handle_t*) &sockets[i], close_cb); ASSERT(recv_cb_called > 0); uv_run(loop, UV_RUN_DEFAULT); ASSERT(ARRAY_SIZE(sockets) == send_cb_called); ASSERT(ARRAY_SIZE(sockets) == close_cb_called); MAKE_VALGRIND_HAPPY(); return 0; } MoarVM-2015.11/3rdparty/libuv/uv.gyp0000644000175000017500000003477612502366750016143 0ustar jnthnjnthn{ 'target_defaults': { 'conditions': [ ['OS != "win"', { 'defines': [ '_LARGEFILE_SOURCE', '_FILE_OFFSET_BITS=64', ], 'conditions': [ ['OS=="solaris"', { 'cflags': [ '-pthreads' ], }], ['OS not in "solaris android"', { 'cflags': [ '-pthread' ], }], ], }], ], 'xcode_settings': { 'conditions': [ [ 'clang==1', { 'WARNING_CFLAGS': [ '-Wall', '-Wextra', '-Wno-unused-parameter', '-Wno-dollar-in-identifier-extension' ]}, { 'WARNING_CFLAGS': [ '-Wall', '-Wextra', '-Wno-unused-parameter' ]} ] ], 'OTHER_LDFLAGS': [ ], 'OTHER_CFLAGS': [ '-g', '--std=gnu89', '-pedantic' ], } }, 'targets': [ { 'target_name': 'libuv', 'type': '<(uv_library)', 'include_dirs': [ 'include', 'src/', ], 'direct_dependent_settings': { 'include_dirs': [ 'include' ], 'conditions': [ ['OS != "win"', { 'defines': [ '_LARGEFILE_SOURCE', '_FILE_OFFSET_BITS=64', ], }], ['OS == "mac"', { 'defines': [ '_DARWIN_USE_64_BIT_INODE=1' ], }], ['OS == "linux"', { 'defines': [ '_POSIX_C_SOURCE=200112' ], }], ], }, 'sources': [ 'common.gypi', 'include/uv.h', 'include/tree.h', 'include/uv-errno.h', 'include/uv-threadpool.h', 'include/uv-version.h', 'src/fs-poll.c', 'src/heap-inl.h', 'src/inet.c', 'src/queue.h', 'src/threadpool.c', 'src/uv-common.c', 'src/uv-common.h', 'src/version.c' ], 'conditions': [ [ 'OS=="win"', { 'defines': [ '_WIN32_WINNT=0x0600', '_GNU_SOURCE', ], 'sources': [ 'include/uv-win.h', 'src/win/async.c', 'src/win/atomicops-inl.h', 'src/win/core.c', 'src/win/dl.c', 'src/win/error.c', 'src/win/fs.c', 'src/win/fs-event.c', 'src/win/getaddrinfo.c', 'src/win/getnameinfo.c', 'src/win/handle.c', 'src/win/handle-inl.h', 'src/win/internal.h', 'src/win/loop-watcher.c', 'src/win/pipe.c', 'src/win/thread.c', 'src/win/poll.c', 'src/win/process.c', 'src/win/process-stdio.c', 'src/win/req.c', 'src/win/req-inl.h', 'src/win/signal.c', 'src/win/stream.c', 'src/win/stream-inl.h', 'src/win/tcp.c', 'src/win/tty.c', 'src/win/timer.c', 'src/win/udp.c', 'src/win/util.c', 'src/win/winapi.c', 'src/win/winapi.h', 'src/win/winsock.c', 'src/win/winsock.h', ], 'link_settings': { 'libraries': [ '-ladvapi32', '-liphlpapi', '-lpsapi', '-lshell32', '-lws2_32' ], }, }, { # Not Windows i.e. POSIX 'cflags': [ '-g', '--std=gnu89', '-pedantic', '-Wall', '-Wextra', '-Wno-unused-parameter', ], 'sources': [ 'include/uv-unix.h', 'include/uv-linux.h', 'include/uv-sunos.h', 'include/uv-darwin.h', 'include/uv-bsd.h', 'include/uv-aix.h', 'src/unix/async.c', 'src/unix/atomic-ops.h', 'src/unix/core.c', 'src/unix/dl.c', 'src/unix/fs.c', 'src/unix/getaddrinfo.c', 'src/unix/getnameinfo.c', 'src/unix/internal.h', 'src/unix/loop.c', 'src/unix/loop-watcher.c', 'src/unix/pipe.c', 'src/unix/poll.c', 'src/unix/process.c', 'src/unix/signal.c', 'src/unix/spinlock.h', 'src/unix/stream.c', 'src/unix/tcp.c', 'src/unix/thread.c', 'src/unix/timer.c', 'src/unix/tty.c', 'src/unix/udp.c', ], 'link_settings': { 'libraries': [ '-lm' ], 'conditions': [ ['OS=="solaris"', { 'ldflags': [ '-pthreads' ], }], ['OS != "solaris" and OS != "android"', { 'ldflags': [ '-pthread' ], }], ], }, 'conditions': [ ['uv_library=="shared_library"', { 'cflags': [ '-fPIC' ], }], ['uv_library=="shared_library" and OS!="mac"', { 'link_settings': { # Must correspond with UV_VERSION_MAJOR and UV_VERSION_MINOR # in include/uv-version.h 'libraries': [ '-Wl,-soname,libuv.so.1.0' ], }, }], ], }], [ 'OS in "linux mac android"', { 'sources': [ 'src/unix/proctitle.c' ], }], [ 'OS=="mac"', { 'sources': [ 'src/unix/darwin.c', 'src/unix/fsevents.c', 'src/unix/darwin-proctitle.c', ], 'defines': [ '_DARWIN_USE_64_BIT_INODE=1', '_DARWIN_UNLIMITED_SELECT=1', ] }], [ 'OS!="mac"', { # Enable on all platforms except OS X. The antique gcc/clang that # ships with Xcode emits waaaay too many false positives. 'cflags': [ '-Wstrict-aliasing' ], }], [ 'OS=="linux"', { 'sources': [ 'src/unix/linux-core.c', 'src/unix/linux-inotify.c', 'src/unix/linux-syscalls.c', 'src/unix/linux-syscalls.h', ], 'link_settings': { 'libraries': [ '-ldl', '-lrt' ], }, }], [ 'OS=="android"', { 'sources': [ 'src/unix/linux-core.c', 'src/unix/linux-inotify.c', 'src/unix/linux-syscalls.c', 'src/unix/linux-syscalls.h', 'src/unix/pthread-fixes.c', 'src/unix/android-ifaddrs.c' ], 'link_settings': { 'libraries': [ '-ldl' ], }, }], [ 'OS=="solaris"', { 'sources': [ 'src/unix/sunos.c' ], 'defines': [ '__EXTENSIONS__', '_XOPEN_SOURCE=500', ], 'link_settings': { 'libraries': [ '-lkstat', '-lnsl', '-lsendfile', '-lsocket', ], }, }], [ 'OS=="aix"', { 'sources': [ 'src/unix/aix.c' ], 'defines': [ '_ALL_SOURCE', '_XOPEN_SOURCE=500', '_LINUX_SOURCE_COMPAT', ], 'link_settings': { 'libraries': [ '-lperfstat', ], }, }], [ 'OS=="freebsd" or OS=="dragonflybsd"', { 'sources': [ 'src/unix/freebsd.c' ], }], [ 'OS=="openbsd"', { 'sources': [ 'src/unix/openbsd.c' ], }], [ 'OS=="netbsd"', { 'sources': [ 'src/unix/netbsd.c' ], }], [ 'OS in "freebsd dragonflybsd openbsd netbsd".split()', { 'link_settings': { 'libraries': [ '-lkvm' ], }, }], [ 'OS in "mac freebsd dragonflybsd openbsd netbsd".split()', { 'sources': [ 'src/unix/kqueue.c' ], }], ['uv_library=="shared_library"', { 'defines': [ 'BUILDING_UV_SHARED=1' ] }], ] }, { 'target_name': 'run-tests', 'type': 'executable', 'dependencies': [ 'libuv' ], 'sources': [ 'test/blackhole-server.c', 'test/echo-server.c', 'test/run-tests.c', 'test/runner.c', 'test/runner.h', 'test/test-get-loadavg.c', 'test/task.h', 'test/test-active.c', 'test/test-async.c', 'test/test-async-null-cb.c', 'test/test-callback-stack.c', 'test/test-callback-order.c', 'test/test-close-fd.c', 'test/test-close-order.c', 'test/test-connection-fail.c', 'test/test-cwd-and-chdir.c', 'test/test-default-loop-close.c', 'test/test-delayed-accept.c', 'test/test-error.c', 'test/test-embed.c', 'test/test-emfile.c', 'test/test-fail-always.c', 'test/test-fs.c', 'test/test-fs-event.c', 'test/test-get-currentexe.c', 'test/test-get-memory.c', 'test/test-getaddrinfo.c', 'test/test-getnameinfo.c', 'test/test-getsockname.c', 'test/test-handle-fileno.c', 'test/test-hrtime.c', 'test/test-idle.c', 'test/test-ip6-addr.c', 'test/test-ipc.c', 'test/test-ipc-send-recv.c', 'test/test-list.h', 'test/test-loop-handles.c', 'test/test-loop-alive.c', 'test/test-loop-close.c', 'test/test-loop-stop.c', 'test/test-loop-time.c', 'test/test-walk-handles.c', 'test/test-watcher-cross-stop.c', 'test/test-multiple-listen.c', 'test/test-osx-select.c', 'test/test-pass-always.c', 'test/test-ping-pong.c', 'test/test-pipe-bind-error.c', 'test/test-pipe-connect-error.c', 'test/test-pipe-getsockname.c', 'test/test-pipe-sendmsg.c', 'test/test-pipe-server-close.c', 'test/test-pipe-close-stdout-read-stdin.c', 'test/test-platform-output.c', 'test/test-poll.c', 'test/test-poll-close.c', 'test/test-poll-closesocket.c', 'test/test-process-title.c', 'test/test-ref.c', 'test/test-run-nowait.c', 'test/test-run-once.c', 'test/test-semaphore.c', 'test/test-shutdown-close.c', 'test/test-shutdown-eof.c', 'test/test-shutdown-twice.c', 'test/test-signal.c', 'test/test-signal-multiple-loops.c', 'test/test-socket-buffer-size.c', 'test/test-spawn.c', 'test/test-fs-poll.c', 'test/test-stdio-over-pipes.c', 'test/test-tcp-bind-error.c', 'test/test-tcp-bind6-error.c', 'test/test-tcp-close.c', 'test/test-tcp-close-accept.c', 'test/test-tcp-close-while-connecting.c', 'test/test-tcp-connect-error-after-write.c', 'test/test-tcp-shutdown-after-write.c', 'test/test-tcp-flags.c', 'test/test-tcp-connect-error.c', 'test/test-tcp-connect-timeout.c', 'test/test-tcp-connect6-error.c', 'test/test-tcp-open.c', 'test/test-tcp-write-to-half-open-connection.c', 'test/test-tcp-write-after-connect.c', 'test/test-tcp-writealot.c', 'test/test-tcp-try-write.c', 'test/test-tcp-unexpected-read.c', 'test/test-tcp-read-stop.c', 'test/test-tcp-write-queue-order.c', 'test/test-threadpool.c', 'test/test-threadpool-cancel.c', 'test/test-thread-equal.c', 'test/test-mutexes.c', 'test/test-thread.c', 'test/test-barrier.c', 'test/test-condvar.c', 'test/test-timer-again.c', 'test/test-timer-from-check.c', 'test/test-timer.c', 'test/test-tty.c', 'test/test-udp-bind.c', 'test/test-udp-dgram-too-big.c', 'test/test-udp-ipv6.c', 'test/test-udp-open.c', 'test/test-udp-options.c', 'test/test-udp-send-and-recv.c', 'test/test-udp-send-immediate.c', 'test/test-udp-send-unreachable.c', 'test/test-udp-multicast-join.c', 'test/test-udp-multicast-join6.c', 'test/test-dlerror.c', 'test/test-udp-multicast-ttl.c', 'test/test-ip4-addr.c', 'test/test-ip6-addr.c', 'test/test-udp-multicast-interface.c', 'test/test-udp-multicast-interface6.c', 'test/test-udp-try-send.c', ], 'conditions': [ [ 'OS=="win"', { 'sources': [ 'test/runner-win.c', 'test/runner-win.h' ], 'libraries': [ '-lws2_32' ] }, { # POSIX 'defines': [ '_GNU_SOURCE' ], 'sources': [ 'test/runner-unix.c', 'test/runner-unix.h', ], }], [ 'OS=="solaris"', { # make test-fs.c compile, needs _POSIX_C_SOURCE 'defines': [ '__EXTENSIONS__', '_XOPEN_SOURCE=500', ], }], [ 'OS=="aix"', { # make test-fs.c compile, needs _POSIX_C_SOURCE 'defines': [ '_ALL_SOURCE', '_XOPEN_SOURCE=500', ], }], ], 'msvs-settings': { 'VCLinkerTool': { 'SubSystem': 1, # /subsystem:console }, }, }, { 'target_name': 'run-benchmarks', 'type': 'executable', 'dependencies': [ 'libuv' ], 'sources': [ 'test/benchmark-async.c', 'test/benchmark-async-pummel.c', 'test/benchmark-fs-stat.c', 'test/benchmark-getaddrinfo.c', 'test/benchmark-list.h', 'test/benchmark-loop-count.c', 'test/benchmark-million-async.c', 'test/benchmark-million-timers.c', 'test/benchmark-multi-accept.c', 'test/benchmark-ping-pongs.c', 'test/benchmark-pound.c', 'test/benchmark-pump.c', 'test/benchmark-sizes.c', 'test/benchmark-spawn.c', 'test/benchmark-thread.c', 'test/benchmark-tcp-write-batch.c', 'test/benchmark-udp-pummel.c', 'test/dns-server.c', 'test/echo-server.c', 'test/blackhole-server.c', 'test/run-benchmarks.c', 'test/runner.c', 'test/runner.h', 'test/task.h', ], 'conditions': [ [ 'OS=="win"', { 'sources': [ 'test/runner-win.c', 'test/runner-win.h', ], 'libraries': [ '-lws2_32' ] }, { # POSIX 'defines': [ '_GNU_SOURCE' ], 'sources': [ 'test/runner-unix.c', 'test/runner-unix.h', ] }] ], 'msvs-settings': { 'VCLinkerTool': { 'SubSystem': 1, # /subsystem:console }, }, }, ] } MoarVM-2015.11/3rdparty/libuv/vcbuild.bat0000644000175000017500000001072112456307253017071 0ustar jnthnjnthn@echo off cd %~dp0 if /i "%1"=="help" goto help if /i "%1"=="--help" goto help if /i "%1"=="-help" goto help if /i "%1"=="/help" goto help if /i "%1"=="?" goto help if /i "%1"=="-?" goto help if /i "%1"=="--?" goto help if /i "%1"=="/?" goto help @rem Process arguments. set config= set target=Build set noprojgen= set nobuild= set run= set target_arch=ia32 set vs_toolset=x86 set platform=WIN32 set library=static_library :next-arg if "%1"=="" goto args-done if /i "%1"=="debug" set config=Debug&goto arg-ok if /i "%1"=="release" set config=Release&goto arg-ok if /i "%1"=="test" set run=run-tests.exe&goto arg-ok if /i "%1"=="bench" set run=run-benchmarks.exe&goto arg-ok if /i "%1"=="clean" set target=Clean&goto arg-ok if /i "%1"=="noprojgen" set noprojgen=1&goto arg-ok if /i "%1"=="nobuild" set nobuild=1&goto arg-ok if /i "%1"=="x86" set target_arch=ia32&set platform=WIN32&set vs_toolset=x86&goto arg-ok if /i "%1"=="ia32" set target_arch=ia32&set platform=WIN32&set vs_toolset=x86&goto arg-ok if /i "%1"=="x64" set target_arch=x64&set platform=x64&set vs_toolset=x64&goto arg-ok if /i "%1"=="shared" set library=shared_library&goto arg-ok if /i "%1"=="static" set library=static_library&goto arg-ok :arg-ok shift goto next-arg :args-done if defined WindowsSDKDir goto select-target if defined VCINSTALLDIR goto select-target @rem Look for Visual Studio 2013 if not defined VS120COMNTOOLS goto vc-set-2012 if not exist "%VS120COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-2012 call "%VS120COMNTOOLS%\..\..\vc\vcvarsall.bat" %vs_toolset% set GYP_MSVS_VERSION=2013 goto select-target :vc-set-2012 @rem Look for Visual Studio 2012 if not defined VS110COMNTOOLS goto vc-set-2010 if not exist "%VS110COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-2010 call "%VS110COMNTOOLS%\..\..\vc\vcvarsall.bat" %vs_toolset% set GYP_MSVS_VERSION=2012 goto select-target :vc-set-2010 @rem Look for Visual Studio 2010 if not defined VS100COMNTOOLS goto vc-set-2008 if not exist "%VS100COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-2008 call "%VS100COMNTOOLS%\..\..\vc\vcvarsall.bat" %vs_toolset% set GYP_MSVS_VERSION=2010 goto select-target :vc-set-2008 @rem Look for Visual Studio 2008 if not defined VS90COMNTOOLS goto vc-set-notfound if not exist "%VS90COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-notfound call "%VS90COMNTOOLS%\..\..\vc\vcvarsall.bat" %vs_toolset% set GYP_MSVS_VERSION=2008 goto select-target :vc-set-notfound echo Warning: Visual Studio not found :select-target if not "%config%"=="" goto project-gen if "%run%"=="run-tests.exe" set config=Debug& goto project-gen if "%run%"=="run-benchmarks.exe" set config=Release& goto project-gen set config=Debug :project-gen @rem Skip project generation if requested. if defined noprojgen goto msbuild @rem Generate the VS project. if exist build\gyp goto have_gyp echo git clone https://git.chromium.org/external/gyp.git build/gyp git clone https://git.chromium.org/external/gyp.git build/gyp if errorlevel 1 goto gyp_install_failed goto have_gyp :gyp_install_failed echo Failed to download gyp. Make sure you have git installed, or echo manually install gyp into %~dp0build\gyp. exit /b 1 :have_gyp if not defined PYTHON set PYTHON=python "%PYTHON%" gyp_uv.py -Dtarget_arch=%target_arch% -Duv_library=%library% if errorlevel 1 goto create-msvs-files-failed if not exist uv.sln goto create-msvs-files-failed echo Project files generated. :msbuild @rem Skip project generation if requested. if defined nobuild goto run @rem Check if VS build env is available if defined VCINSTALLDIR goto msbuild-found if defined WindowsSDKDir goto msbuild-found echo Build skipped. To build, this file needs to run from VS cmd prompt. goto run @rem Build the sln with msbuild. :msbuild-found msbuild uv.sln /t:%target% /p:Configuration=%config% /p:Platform="%platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo if errorlevel 1 exit /b 1 :run @rem Run tests if requested. if "%run%"=="" goto exit if not exist %config%\%run% goto exit echo running '%config%\%run%' %config%\%run% goto exit :create-msvs-files-failed echo Failed to create vc project files. exit /b 1 :help echo vcbuild.bat [debug/release] [test/bench] [clean] [noprojgen] [nobuild] [x86/x64] [static/shared] echo Examples: echo vcbuild.bat : builds debug build echo vcbuild.bat test : builds debug build and runs tests echo vcbuild.bat release bench: builds release build and runs benchmarks goto exit :exit MoarVM-2015.11/3rdparty/dynasm/.gitignore0000644000175000017500000000002412456307242017104 0ustar jnthnjnthnminilua minilua.exe MoarVM-2015.11/3rdparty/dynasm/COPYRIGHT0000644000175000017500000000232412456307242016414 0ustar jnthnjnthnDynASM. A dynamic assembler for code generation engines. http://luajit.org/dynasm.html Copyright (C) 2005-2014 Mike Pall. All rights reserved. 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. [ MIT license: http://www.opensource.org/licenses/mit-license.php ]MoarVM-2015.11/3rdparty/dynasm/dasm_arm.h0000644000175000017500000003215712456307242017064 0ustar jnthnjnthn/* ** DynASM ARM encoding engine. ** Copyright (C) 2005-2014 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "arm" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMM12, DASM_IMM16, DASM_IMML8, DASM_IMML12, DASM_IMMV8, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif static int dasm_imm12(unsigned int n) { int i; for (i = 0; i < 16; i++, n = (n << 2) | (n >> 30)) if (n <= 255) return (int)(n + (i << 8)); return -1; } /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: case DASM_IMM16: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); if ((ins & 0x8000)) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; case DASM_IMMV8: CK((n & 3) == 0, RANGE_I); n >>= 2; case DASM_IMML8: case DASM_IMML12: CK(n >= 0 ? ((n>>((ins>>5)&31)) == 0) : (((-n)>>((ins>>5)&31)) == 0), RANGE_I); b[pos++] = n; break; case DASM_IMM12: CK(dasm_imm12((unsigned int)n) != -1, RANGE_I); b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: case DASM_IMM12: case DASM_IMM16: case DASM_IMML8: case DASM_IMML12: case DASM_IMMV8: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048)); goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) - 4; patchrel: if ((ins & 0x800) == 0) { CK((n & 3) == 0 && ((n+0x02000000) >> 26) == 0, RANGE_REL); cp[-1] |= ((n >> 2) & 0x00ffffff); } else if ((ins & 0x1000)) { CK((n & 3) == 0 && -256 <= n && n <= 256, RANGE_REL); goto patchimml8; } else if ((ins & 0x2000) == 0) { CK((n & 3) == 0 && -4096 <= n && n <= 4096, RANGE_REL); goto patchimml; } else { CK((n & 3) == 0 && -1020 <= n && n <= 1020, RANGE_REL); n >>= 2; goto patchimml; } break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31); break; case DASM_IMM12: cp[-1] |= dasm_imm12((unsigned int)n); break; case DASM_IMM16: cp[-1] |= ((n & 0xf000) << 4) | (n & 0x0fff); break; case DASM_IMML8: patchimml8: cp[-1] |= n >= 0 ? (0x00800000 | (n & 0x0f) | ((n & 0xf0) << 4)) : ((-n & 0x0f) | ((-n & 0xf0) << 4)); break; case DASM_IMML12: case DASM_IMMV8: patchimml: cp[-1] |= n >= 0 ? (0x00800000 | n) : (-n); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2015.11/3rdparty/dynasm/dasm_arm.lua0000644000175000017500000010326312456307242017413 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM ARM module. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "arm", description = "DynASM ARM module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable, rawget = assert, setmetatable, rawget local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub local concat, sort, insert = table.concat, table.sort, table.insert local bit = bit or require("bit") local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift local ror, tohex = bit.ror, bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", "IMM12", "IMM16", "IMML8", "IMML12", "IMMV8", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n <= 0x000fffff then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") if n <= 0x000fffff then insert(actlist, pos+1, n) n = map_action.ESC * 0x10000 end actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. -- Ext. register name -> int. name. local map_archdef = { sp = "r13", lr = "r14", pc = "r15", } -- Int. register name -> ext. name. local map_reg_rev = { r13 = "sp", r14 = "lr", r15 = "pc", } local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) return map_reg_rev[s] or s end local map_shift = { lsl = 0, lsr = 1, asr = 2, ror = 3, } local map_cond = { eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7, hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14, hs = 2, lo = 3, } ------------------------------------------------------------------------------ -- Template strings for ARM instructions. local map_op = { -- Basic data processing instructions. and_3 = "e0000000DNPs", eor_3 = "e0200000DNPs", sub_3 = "e0400000DNPs", rsb_3 = "e0600000DNPs", add_3 = "e0800000DNPs", adc_3 = "e0a00000DNPs", sbc_3 = "e0c00000DNPs", rsc_3 = "e0e00000DNPs", tst_2 = "e1100000NP", teq_2 = "e1300000NP", cmp_2 = "e1500000NP", cmn_2 = "e1700000NP", orr_3 = "e1800000DNPs", mov_2 = "e1a00000DPs", bic_3 = "e1c00000DNPs", mvn_2 = "e1e00000DPs", and_4 = "e0000000DNMps", eor_4 = "e0200000DNMps", sub_4 = "e0400000DNMps", rsb_4 = "e0600000DNMps", add_4 = "e0800000DNMps", adc_4 = "e0a00000DNMps", sbc_4 = "e0c00000DNMps", rsc_4 = "e0e00000DNMps", tst_3 = "e1100000NMp", teq_3 = "e1300000NMp", cmp_3 = "e1500000NMp", cmn_3 = "e1700000NMp", orr_4 = "e1800000DNMps", mov_3 = "e1a00000DMps", bic_4 = "e1c00000DNMps", mvn_3 = "e1e00000DMps", lsl_3 = "e1a00000DMws", lsr_3 = "e1a00020DMws", asr_3 = "e1a00040DMws", ror_3 = "e1a00060DMws", rrx_2 = "e1a00060DMs", -- Multiply and multiply-accumulate. mul_3 = "e0000090NMSs", mla_4 = "e0200090NMSDs", umaal_4 = "e0400090DNMSs", -- v6 mls_4 = "e0600090DNMSs", -- v6T2 umull_4 = "e0800090DNMSs", umlal_4 = "e0a00090DNMSs", smull_4 = "e0c00090DNMSs", smlal_4 = "e0e00090DNMSs", -- Halfword multiply and multiply-accumulate. smlabb_4 = "e1000080NMSD", -- v5TE smlatb_4 = "e10000a0NMSD", -- v5TE smlabt_4 = "e10000c0NMSD", -- v5TE smlatt_4 = "e10000e0NMSD", -- v5TE smlawb_4 = "e1200080NMSD", -- v5TE smulwb_3 = "e12000a0NMS", -- v5TE smlawt_4 = "e12000c0NMSD", -- v5TE smulwt_3 = "e12000e0NMS", -- v5TE smlalbb_4 = "e1400080NMSD", -- v5TE smlaltb_4 = "e14000a0NMSD", -- v5TE smlalbt_4 = "e14000c0NMSD", -- v5TE smlaltt_4 = "e14000e0NMSD", -- v5TE smulbb_3 = "e1600080NMS", -- v5TE smultb_3 = "e16000a0NMS", -- v5TE smulbt_3 = "e16000c0NMS", -- v5TE smultt_3 = "e16000e0NMS", -- v5TE -- Miscellaneous data processing instructions. clz_2 = "e16f0f10DM", -- v5T rev_2 = "e6bf0f30DM", -- v6 rev16_2 = "e6bf0fb0DM", -- v6 revsh_2 = "e6ff0fb0DM", -- v6 sel_3 = "e6800fb0DNM", -- v6 usad8_3 = "e780f010NMS", -- v6 usada8_4 = "e7800010NMSD", -- v6 rbit_2 = "e6ff0f30DM", -- v6T2 movw_2 = "e3000000DW", -- v6T2 movt_2 = "e3400000DW", -- v6T2 -- Note: the X encodes width-1, not width. sbfx_4 = "e7a00050DMvX", -- v6T2 ubfx_4 = "e7e00050DMvX", -- v6T2 -- Note: the X encodes the msb field, not the width. bfc_3 = "e7c0001fDvX", -- v6T2 bfi_4 = "e7c00010DMvX", -- v6T2 -- Packing and unpacking instructions. pkhbt_3 = "e6800010DNM", pkhbt_4 = "e6800010DNMv", -- v6 pkhtb_3 = "e6800050DNM", pkhtb_4 = "e6800050DNMv", -- v6 sxtab_3 = "e6a00070DNM", sxtab_4 = "e6a00070DNMv", -- v6 sxtab16_3 = "e6800070DNM", sxtab16_4 = "e6800070DNMv", -- v6 sxtah_3 = "e6b00070DNM", sxtah_4 = "e6b00070DNMv", -- v6 sxtb_2 = "e6af0070DM", sxtb_3 = "e6af0070DMv", -- v6 sxtb16_2 = "e68f0070DM", sxtb16_3 = "e68f0070DMv", -- v6 sxth_2 = "e6bf0070DM", sxth_3 = "e6bf0070DMv", -- v6 uxtab_3 = "e6e00070DNM", uxtab_4 = "e6e00070DNMv", -- v6 uxtab16_3 = "e6c00070DNM", uxtab16_4 = "e6c00070DNMv", -- v6 uxtah_3 = "e6f00070DNM", uxtah_4 = "e6f00070DNMv", -- v6 uxtb_2 = "e6ef0070DM", uxtb_3 = "e6ef0070DMv", -- v6 uxtb16_2 = "e6cf0070DM", uxtb16_3 = "e6cf0070DMv", -- v6 uxth_2 = "e6ff0070DM", uxth_3 = "e6ff0070DMv", -- v6 -- Saturating instructions. qadd_3 = "e1000050DMN", -- v5TE qsub_3 = "e1200050DMN", -- v5TE qdadd_3 = "e1400050DMN", -- v5TE qdsub_3 = "e1600050DMN", -- v5TE -- Note: the X for ssat* encodes sat_imm-1, not sat_imm. ssat_3 = "e6a00010DXM", ssat_4 = "e6a00010DXMp", -- v6 usat_3 = "e6e00010DXM", usat_4 = "e6e00010DXMp", -- v6 ssat16_3 = "e6a00f30DXM", -- v6 usat16_3 = "e6e00f30DXM", -- v6 -- Parallel addition and subtraction. sadd16_3 = "e6100f10DNM", -- v6 sasx_3 = "e6100f30DNM", -- v6 ssax_3 = "e6100f50DNM", -- v6 ssub16_3 = "e6100f70DNM", -- v6 sadd8_3 = "e6100f90DNM", -- v6 ssub8_3 = "e6100ff0DNM", -- v6 qadd16_3 = "e6200f10DNM", -- v6 qasx_3 = "e6200f30DNM", -- v6 qsax_3 = "e6200f50DNM", -- v6 qsub16_3 = "e6200f70DNM", -- v6 qadd8_3 = "e6200f90DNM", -- v6 qsub8_3 = "e6200ff0DNM", -- v6 shadd16_3 = "e6300f10DNM", -- v6 shasx_3 = "e6300f30DNM", -- v6 shsax_3 = "e6300f50DNM", -- v6 shsub16_3 = "e6300f70DNM", -- v6 shadd8_3 = "e6300f90DNM", -- v6 shsub8_3 = "e6300ff0DNM", -- v6 uadd16_3 = "e6500f10DNM", -- v6 uasx_3 = "e6500f30DNM", -- v6 usax_3 = "e6500f50DNM", -- v6 usub16_3 = "e6500f70DNM", -- v6 uadd8_3 = "e6500f90DNM", -- v6 usub8_3 = "e6500ff0DNM", -- v6 uqadd16_3 = "e6600f10DNM", -- v6 uqasx_3 = "e6600f30DNM", -- v6 uqsax_3 = "e6600f50DNM", -- v6 uqsub16_3 = "e6600f70DNM", -- v6 uqadd8_3 = "e6600f90DNM", -- v6 uqsub8_3 = "e6600ff0DNM", -- v6 uhadd16_3 = "e6700f10DNM", -- v6 uhasx_3 = "e6700f30DNM", -- v6 uhsax_3 = "e6700f50DNM", -- v6 uhsub16_3 = "e6700f70DNM", -- v6 uhadd8_3 = "e6700f90DNM", -- v6 uhsub8_3 = "e6700ff0DNM", -- v6 -- Load/store instructions. str_2 = "e4000000DL", str_3 = "e4000000DL", str_4 = "e4000000DL", strb_2 = "e4400000DL", strb_3 = "e4400000DL", strb_4 = "e4400000DL", ldr_2 = "e4100000DL", ldr_3 = "e4100000DL", ldr_4 = "e4100000DL", ldrb_2 = "e4500000DL", ldrb_3 = "e4500000DL", ldrb_4 = "e4500000DL", strh_2 = "e00000b0DL", strh_3 = "e00000b0DL", ldrh_2 = "e01000b0DL", ldrh_3 = "e01000b0DL", ldrd_2 = "e00000d0DL", ldrd_3 = "e00000d0DL", -- v5TE ldrsb_2 = "e01000d0DL", ldrsb_3 = "e01000d0DL", strd_2 = "e00000f0DL", strd_3 = "e00000f0DL", -- v5TE ldrsh_2 = "e01000f0DL", ldrsh_3 = "e01000f0DL", ldm_2 = "e8900000oR", ldmia_2 = "e8900000oR", ldmfd_2 = "e8900000oR", ldmda_2 = "e8100000oR", ldmfa_2 = "e8100000oR", ldmdb_2 = "e9100000oR", ldmea_2 = "e9100000oR", ldmib_2 = "e9900000oR", ldmed_2 = "e9900000oR", stm_2 = "e8800000oR", stmia_2 = "e8800000oR", stmfd_2 = "e8800000oR", stmda_2 = "e8000000oR", stmfa_2 = "e8000000oR", stmdb_2 = "e9000000oR", stmea_2 = "e9000000oR", stmib_2 = "e9800000oR", stmed_2 = "e9800000oR", pop_1 = "e8bd0000R", push_1 = "e92d0000R", -- Branch instructions. b_1 = "ea000000B", bl_1 = "eb000000B", blx_1 = "e12fff30C", bx_1 = "e12fff10M", -- Miscellaneous instructions. nop_0 = "e1a00000", mrs_1 = "e10f0000D", bkpt_1 = "e1200070K", -- v5T svc_1 = "ef000000T", swi_1 = "ef000000T", ud_0 = "e7f001f0", -- VFP instructions. ["vadd.f32_3"] = "ee300a00dnm", ["vadd.f64_3"] = "ee300b00Gdnm", ["vsub.f32_3"] = "ee300a40dnm", ["vsub.f64_3"] = "ee300b40Gdnm", ["vmul.f32_3"] = "ee200a00dnm", ["vmul.f64_3"] = "ee200b00Gdnm", ["vnmul.f32_3"] = "ee200a40dnm", ["vnmul.f64_3"] = "ee200b40Gdnm", ["vmla.f32_3"] = "ee000a00dnm", ["vmla.f64_3"] = "ee000b00Gdnm", ["vmls.f32_3"] = "ee000a40dnm", ["vmls.f64_3"] = "ee000b40Gdnm", ["vnmla.f32_3"] = "ee100a40dnm", ["vnmla.f64_3"] = "ee100b40Gdnm", ["vnmls.f32_3"] = "ee100a00dnm", ["vnmls.f64_3"] = "ee100b00Gdnm", ["vdiv.f32_3"] = "ee800a00dnm", ["vdiv.f64_3"] = "ee800b00Gdnm", ["vabs.f32_2"] = "eeb00ac0dm", ["vabs.f64_2"] = "eeb00bc0Gdm", ["vneg.f32_2"] = "eeb10a40dm", ["vneg.f64_2"] = "eeb10b40Gdm", ["vsqrt.f32_2"] = "eeb10ac0dm", ["vsqrt.f64_2"] = "eeb10bc0Gdm", ["vcmp.f32_2"] = "eeb40a40dm", ["vcmp.f64_2"] = "eeb40b40Gdm", ["vcmpe.f32_2"] = "eeb40ac0dm", ["vcmpe.f64_2"] = "eeb40bc0Gdm", ["vcmpz.f32_1"] = "eeb50a40d", ["vcmpz.f64_1"] = "eeb50b40Gd", ["vcmpze.f32_1"] = "eeb50ac0d", ["vcmpze.f64_1"] = "eeb50bc0Gd", vldr_2 = "ed100a00dl|ed100b00Gdl", vstr_2 = "ed000a00dl|ed000b00Gdl", vldm_2 = "ec900a00or", vldmia_2 = "ec900a00or", vldmdb_2 = "ed100a00or", vpop_1 = "ecbd0a00r", vstm_2 = "ec800a00or", vstmia_2 = "ec800a00or", vstmdb_2 = "ed000a00or", vpush_1 = "ed2d0a00r", ["vmov.f32_2"] = "eeb00a40dm|eeb00a00dY", -- #imm is VFPv3 only ["vmov.f64_2"] = "eeb00b40Gdm|eeb00b00GdY", -- #imm is VFPv3 only vmov_2 = "ee100a10Dn|ee000a10nD", vmov_3 = "ec500a10DNm|ec400a10mDN|ec500b10GDNm|ec400b10GmDN", vmrs_0 = "eef1fa10", vmrs_1 = "eef10a10D", vmsr_1 = "eee10a10D", ["vcvt.s32.f32_2"] = "eebd0ac0dm", ["vcvt.s32.f64_2"] = "eebd0bc0dGm", ["vcvt.u32.f32_2"] = "eebc0ac0dm", ["vcvt.u32.f64_2"] = "eebc0bc0dGm", ["vcvtr.s32.f32_2"] = "eebd0a40dm", ["vcvtr.s32.f64_2"] = "eebd0b40dGm", ["vcvtr.u32.f32_2"] = "eebc0a40dm", ["vcvtr.u32.f64_2"] = "eebc0b40dGm", ["vcvt.f32.s32_2"] = "eeb80ac0dm", ["vcvt.f64.s32_2"] = "eeb80bc0GdFm", ["vcvt.f32.u32_2"] = "eeb80a40dm", ["vcvt.f64.u32_2"] = "eeb80b40GdFm", ["vcvt.f32.f64_2"] = "eeb70bc0dGm", ["vcvt.f64.f32_2"] = "eeb70ac0GdFm", -- VFPv4 only: ["vfma.f32_3"] = "eea00a00dnm", ["vfma.f64_3"] = "eea00b00Gdnm", ["vfms.f32_3"] = "eea00a40dnm", ["vfms.f64_3"] = "eea00b40Gdnm", ["vfnma.f32_3"] = "ee900a40dnm", ["vfnma.f64_3"] = "ee900b40Gdnm", ["vfnms.f32_3"] = "ee900a00dnm", ["vfnms.f64_3"] = "ee900b00Gdnm", -- NYI: Advanced SIMD instructions. -- NYI: I have no need for these instructions right now: -- swp, swpb, strex, ldrex, strexd, ldrexd, strexb, ldrexb, strexh, ldrexh -- msr, nopv6, yield, wfe, wfi, sev, dbg, bxj, smc, srs, rfe -- cps, setend, pli, pld, pldw, clrex, dsb, dmb, isb -- stc, ldc, mcr, mcr2, mrc, mrc2, mcrr, mcrr2, mrrc, mrrc2, cdp, cdp2 } -- Add mnemonics for "s" variants. do local t = {} for k,v in pairs(map_op) do if sub(v, -1) == "s" then local v2 = sub(v, 1, 2)..char(byte(v, 3)+1)..sub(v, 4, -2) t[sub(k, 1, -3).."s"..sub(k, -2)] = v2 end end for k,v in pairs(t) do map_op[k] = v end end ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r1?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r(1?[0-9])$") if r then r = tonumber(r) if r <= 15 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_gpr_pm(expr) local pm, expr2 = match(expr, "^([+-]?)(.*)$") return parse_gpr(expr2), (pm == "-") end local function parse_vr(expr, tp) local t, r = match(expr, "^([sd])([0-9]+)$") if t == tp then r = tonumber(r) if r <= 31 then if t == "s" then return shr(r, 1), band(r, 1) end return band(r, 15), shr(r, 4) end end werror("bad register name `"..expr.."'") end local function parse_reglist(reglist) reglist = match(reglist, "^{%s*([^}]*)}$") if not reglist then werror("register list expected") end local rr = 0 for p in gmatch(reglist..",", "%s*([^,]*),") do local rbit = shl(1, parse_gpr(gsub(p, "%s+$", ""))) if band(rr, rbit) ~= 0 then werror("duplicate register `"..p.."'") end rr = rr + rbit end return rr end local function parse_vrlist(reglist) local ta, ra, tb, rb = match(reglist, "^{%s*([sd])([0-9]+)%s*%-%s*([sd])([0-9]+)%s*}$") ra, rb = tonumber(ra), tonumber(rb) if ta and ta == tb and ra and rb and ra <= 31 and rb <= 31 and ra <= rb then local nr = rb+1 - ra if ta == "s" then return shl(shr(ra,1),12)+shl(band(ra,1),22) + nr else return shl(band(ra,15),12)+shl(shr(ra,4),22) + nr*2 + 0x100 end end werror("register list expected") end local function parse_imm(imm, bits, shift, scale, signed) imm = match(imm, "^#(.*)$") if not imm then werror("expected immediate operand") end local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_imm12(imm) local n = tonumber(imm) if n then local m = band(n) for i=0,-15,-1 do if shr(m, 8) == 0 then return m + shl(band(i, 15), 8) end m = ror(m, 2) end werror("out of range immediate `"..imm.."'") else waction("IMM12", 0, imm) return 0 end end local function parse_imm16(imm) imm = match(imm, "^#(.*)$") if not imm then werror("expected immediate operand") end local n = tonumber(imm) if n then if shr(n, 16) == 0 then return band(n, 0x0fff) + shl(band(n, 0xf000), 4) end werror("out of range immediate `"..imm.."'") else waction("IMM16", 32*16, imm) return 0 end end local function parse_imm_load(imm, ext) local n = tonumber(imm) if n then if ext then if n >= -255 and n <= 255 then local up = 0x00800000 if n < 0 then n = -n; up = 0 end return shl(band(n, 0xf0), 4) + band(n, 0x0f) + up end else if n >= -4095 and n <= 4095 then if n >= 0 then return n+0x00800000 end return -n end end werror("out of range immediate `"..imm.."'") else waction(ext and "IMML8" or "IMML12", 32768 + shl(ext and 8 or 12, 5), imm) return 0 end end local function parse_shift(shift, gprok) if shift == "rrx" then return 3 * 32 else local s, s2 = match(shift, "^(%S+)%s*(.*)$") s = map_shift[s] if not s then werror("expected shift operand") end if sub(s2, 1, 1) == "#" then return parse_imm(s2, 5, 7, 0, false) + shl(s, 5) else if not gprok then werror("expected immediate shift operand") end return shl(parse_gpr(s2), 8) + shl(s, 5) + 16 end end end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end local function parse_load(params, nparams, n, op) local oplo = band(op, 255) local ext, ldrd = (oplo ~= 0), (oplo == 208) local d if (ldrd or oplo == 240) then d = band(shr(op, 12), 15) if band(d, 1) ~= 0 then werror("odd destination register") end end local pn = params[n] local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$") local p2 = params[n+1] if not p1 then if not p2 then if match(pn, "^[<>=%-]") or match(pn, "^extern%s+") then local mode, n, s = parse_label(pn, false) waction("REL_"..mode, n + (ext and 0x1800 or 0x0800), s, 1) return op + 15 * 65536 + 0x01000000 + (ext and 0x00400000 or 0) end local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local d, tp = parse_gpr(reg) if tp then waction(ext and "IMML8" or "IMML12", 32768 + 32*(ext and 8 or 12), format(tp.ctypefmt, tailr)) return op + shl(d, 16) + 0x01000000 + (ext and 0x00400000 or 0) end end end werror("expected address operand") end if wb == "!" then op = op + 0x00200000 end if p2 then if wb == "!" then werror("bad use of '!'") end local p3 = params[n+2] op = op + shl(parse_gpr(p1), 16) local imm = match(p2, "^#(.*)$") if imm then local m = parse_imm_load(imm, ext) if p3 then werror("too many parameters") end op = op + m + (ext and 0x00400000 or 0) else local m, neg = parse_gpr_pm(p2) if ldrd and (m == d or m-1 == d) then werror("register conflict") end op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) if p3 then op = op + parse_shift(p3) end end else local p1a, p2 = match(p1, "^([^,%s]*)%s*(.*)$") op = op + shl(parse_gpr(p1a), 16) + 0x01000000 if p2 ~= "" then local imm = match(p2, "^,%s*#(.*)$") if imm then local m = parse_imm_load(imm, ext) op = op + m + (ext and 0x00400000 or 0) else local p2a, p3 = match(p2, "^,%s*([^,%s]*)%s*,?%s*(.*)$") local m, neg = parse_gpr_pm(p2a) if ldrd and (m == d or m-1 == d) then werror("register conflict") end op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) if p3 ~= "" then if ext then werror("too many parameters") end op = op + parse_shift(p3) end end else if wb == "!" then werror("bad use of '!'") end op = op + (ext and 0x00c00000 or 0x00800000) end end return op end local function parse_vload(q) local reg, imm = match(q, "^%[%s*([^,%s]*)%s*(.*)%]$") if reg then local d = shl(parse_gpr(reg), 16) if imm == "" then return d end imm = match(imm, "^,%s*#(.*)$") if imm then local n = tonumber(imm) if n then if n >= -1020 and n <= 1020 and n%4 == 0 then return d + (n >= 0 and n/4+0x00800000 or -n/4) end werror("out of range immediate `"..imm.."'") else waction("IMMV8", 32768 + 32*8, imm) return d end end else if match(q, "^[<>=%-]") or match(q, "^extern%s+") then local mode, n, s = parse_label(q, false) waction("REL_"..mode, n + 0x2800, s, 1) return 15 * 65536 end local reg, tailr = match(q, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local d, tp = parse_gpr(reg) if tp then waction("IMMV8", 32768 + 32*8, format(tp.ctypefmt, tailr)) return shl(d, 16) end end end werror("expected address operand") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. local function parse_template(params, template, nparams, pos) local op = tonumber(sub(template, 1, 8), 16) local n = 1 local vr = "s" -- Process each character. for p in gmatch(sub(template, 9), ".") do local q = params[n] if p == "D" then op = op + shl(parse_gpr(q), 12); n = n + 1 elseif p == "N" then op = op + shl(parse_gpr(q), 16); n = n + 1 elseif p == "S" then op = op + shl(parse_gpr(q), 8); n = n + 1 elseif p == "M" then op = op + parse_gpr(q); n = n + 1 elseif p == "d" then local r,h = parse_vr(q, vr); op = op+shl(r,12)+shl(h,22); n = n + 1 elseif p == "n" then local r,h = parse_vr(q, vr); op = op+shl(r,16)+shl(h,7); n = n + 1 elseif p == "m" then local r,h = parse_vr(q, vr); op = op+r+shl(h,5); n = n + 1 elseif p == "P" then local imm = match(q, "^#(.*)$") if imm then op = op + parse_imm12(imm) + 0x02000000 else op = op + parse_gpr(q) end n = n + 1 elseif p == "p" then op = op + parse_shift(q, true); n = n + 1 elseif p == "L" then op = parse_load(params, nparams, n, op) elseif p == "l" then op = op + parse_vload(q) elseif p == "B" then local mode, n, s = parse_label(q, false) waction("REL_"..mode, n, s, 1) elseif p == "C" then -- blx gpr vs. blx label. if match(q, "^([%w_]+):(r1?[0-9])$") or match(q, "^r(1?[0-9])$") then op = op + parse_gpr(q) else if op < 0xe0000000 then werror("unconditional instruction") end local mode, n, s = parse_label(q, false) waction("REL_"..mode, n, s, 1) op = 0xfa000000 end elseif p == "F" then vr = "s" elseif p == "G" then vr = "d" elseif p == "o" then local r, wb = match(q, "^([^!]*)(!?)$") op = op + shl(parse_gpr(r), 16) + (wb == "!" and 0x00200000 or 0) n = n + 1 elseif p == "R" then op = op + parse_reglist(q); n = n + 1 elseif p == "r" then op = op + parse_vrlist(q); n = n + 1 elseif p == "W" then op = op + parse_imm16(q); n = n + 1 elseif p == "v" then op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 elseif p == "w" then local imm = match(q, "^#(.*)$") if imm then op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 else op = op + shl(parse_gpr(q), 8) + 16 end elseif p == "X" then op = op + parse_imm(q, 5, 16, 0, false); n = n + 1 elseif p == "Y" then local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 if not imm or shr(imm, 8) ~= 0 then werror("bad immediate operand") end op = op + shl(band(imm, 0xf0), 12) + band(imm, 0x0f) elseif p == "K" then local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 if not imm or shr(imm, 16) ~= 0 then werror("bad immediate operand") end op = op + shl(band(imm, 0xfff0), 4) + band(imm, 0x000f) elseif p == "T" then op = op + parse_imm(q, 24, 0, 0, false); n = n + 1 elseif p == "s" then -- Ignored. else assert(false) end end wputpos(pos, op) end map_op[".template__"] = function(params, template, nparams) if not params then return sub(template, 9) end -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 3 positions. if secpos+3 > maxsecpos then wflush() end local pos = wpos() local apos, spos = #actargs, secpos local ok, err for t in gmatch(template, "[^|]+") do ok, err = pcall(parse_template, params, t, nparams, pos) if ok then return end secpos = spos actargs[apos+1] = nil actargs[apos+2] = nil actargs[apos+3] = nil end error(err, 0) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = function(t, k) local v = map_coreop[k] if v then return v end local k1, cc, k2 = match(k, "^(.-)(..)([._].*)$") local cv = map_cond[cc] if cv then local v = rawget(t, k1..k2) if type(v) == "string" then local scv = format("%x", cv) return gsub(scv..sub(v, 2), "|e", "|"..scv) end end end }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2015.11/3rdparty/dynasm/dasm_mips.h0000644000175000017500000002765012456307242017257 0ustar jnthnjnthn/* ** DynASM MIPS encoding engine. ** Copyright (C) 2005-2014 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "mips" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); #endif n >>= ((ins>>10)&31); #ifdef DASM_CHECKS if (ins & 0x8000) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1); goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n); if (ins & 2048) n = n - (int)((char *)cp - base); else n = (n + (int)base) & 0x0fffffff; patchrel: CK((n & 3) == 0 && ((n + ((ins & 2048) ? 0x00020000 : 0)) >> ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL); cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff)); break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2015.11/3rdparty/dynasm/dasm_mips.lua0000644000175000017500000006666012456307242017615 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM MIPS module. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "mips", description = "DynASM MIPS module", version = "1.3.0", vernum = 10300, release = "2012-01-23", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable = assert, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch = _s.match, _s.gmatch local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(0xff000000 + w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n >= 0xff000000 then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = { sp="r29", ra="r31" } -- Ext. register name -> int. name. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) if s == "r29" then return "sp" elseif s == "r31" then return "ra" end return s end ------------------------------------------------------------------------------ -- Template strings for MIPS instructions. local map_op = { -- First-level opcodes. j_1 = "08000000J", jal_1 = "0c000000J", b_1 = "10000000B", beqz_2 = "10000000SB", beq_3 = "10000000STB", bnez_2 = "14000000SB", bne_3 = "14000000STB", blez_2 = "18000000SB", bgtz_2 = "1c000000SB", addi_3 = "20000000TSI", li_2 = "24000000TI", addiu_3 = "24000000TSI", slti_3 = "28000000TSI", sltiu_3 = "2c000000TSI", andi_3 = "30000000TSU", lu_2 = "34000000TU", ori_3 = "34000000TSU", xori_3 = "38000000TSU", lui_2 = "3c000000TU", beqzl_2 = "50000000SB", beql_3 = "50000000STB", bnezl_2 = "54000000SB", bnel_3 = "54000000STB", blezl_2 = "58000000SB", bgtzl_2 = "5c000000SB", lb_2 = "80000000TO", lh_2 = "84000000TO", lwl_2 = "88000000TO", lw_2 = "8c000000TO", lbu_2 = "90000000TO", lhu_2 = "94000000TO", lwr_2 = "98000000TO", sb_2 = "a0000000TO", sh_2 = "a4000000TO", swl_2 = "a8000000TO", sw_2 = "ac000000TO", swr_2 = "b8000000TO", cache_2 = "bc000000NO", ll_2 = "c0000000TO", lwc1_2 = "c4000000HO", pref_2 = "cc000000NO", ldc1_2 = "d4000000HO", sc_2 = "e0000000TO", swc1_2 = "e4000000HO", sdc1_2 = "f4000000HO", -- Opcode SPECIAL. nop_0 = "00000000", sll_3 = "00000000DTA", movf_2 = "00000001DS", movf_3 = "00000001DSC", movt_2 = "00010001DS", movt_3 = "00010001DSC", srl_3 = "00000002DTA", rotr_3 = "00200002DTA", sra_3 = "00000003DTA", sllv_3 = "00000004DTS", srlv_3 = "00000006DTS", rotrv_3 = "00000046DTS", srav_3 = "00000007DTS", jr_1 = "00000008S", jalr_1 = "0000f809S", jalr_2 = "00000009DS", movz_3 = "0000000aDST", movn_3 = "0000000bDST", syscall_0 = "0000000c", syscall_1 = "0000000cY", break_0 = "0000000d", break_1 = "0000000dY", sync_0 = "0000000f", mfhi_1 = "00000010D", mthi_1 = "00000011S", mflo_1 = "00000012D", mtlo_1 = "00000013S", mult_2 = "00000018ST", multu_2 = "00000019ST", div_2 = "0000001aST", divu_2 = "0000001bST", add_3 = "00000020DST", move_2 = "00000021DS", addu_3 = "00000021DST", sub_3 = "00000022DST", negu_2 = "00000023DT", subu_3 = "00000023DST", and_3 = "00000024DST", or_3 = "00000025DST", xor_3 = "00000026DST", not_2 = "00000027DS", nor_3 = "00000027DST", slt_3 = "0000002aDST", sltu_3 = "0000002bDST", tge_2 = "00000030ST", tge_3 = "00000030STZ", tgeu_2 = "00000031ST", tgeu_3 = "00000031STZ", tlt_2 = "00000032ST", tlt_3 = "00000032STZ", tltu_2 = "00000033ST", tltu_3 = "00000033STZ", teq_2 = "00000034ST", teq_3 = "00000034STZ", tne_2 = "00000036ST", tne_3 = "00000036STZ", -- Opcode REGIMM. bltz_2 = "04000000SB", bgez_2 = "04010000SB", bltzl_2 = "04020000SB", bgezl_2 = "04030000SB", tgei_2 = "04080000SI", tgeiu_2 = "04090000SI", tlti_2 = "040a0000SI", tltiu_2 = "040b0000SI", teqi_2 = "040c0000SI", tnei_2 = "040e0000SI", bltzal_2 = "04100000SB", bal_1 = "04110000B", bgezal_2 = "04110000SB", bltzall_2 = "04120000SB", bgezall_2 = "04130000SB", synci_1 = "041f0000O", -- Opcode SPECIAL2. madd_2 = "70000000ST", maddu_2 = "70000001ST", mul_3 = "70000002DST", msub_2 = "70000004ST", msubu_2 = "70000005ST", clz_2 = "70000020DS=", clo_2 = "70000021DS=", sdbbp_0 = "7000003f", sdbbp_1 = "7000003fY", -- Opcode SPECIAL3. ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 wsbh_2 = "7c0000a0DT", seb_2 = "7c000420DT", seh_2 = "7c000620DT", rdhwr_2 = "7c00003bTD", -- Opcode COP0. mfc0_2 = "40000000TD", mfc0_3 = "40000000TDW", mtc0_2 = "40800000TD", mtc0_3 = "40800000TDW", rdpgpr_2 = "41400000DT", di_0 = "41606000", di_1 = "41606000T", ei_0 = "41606020", ei_1 = "41606020T", wrpgpr_2 = "41c00000DT", tlbr_0 = "42000001", tlbwi_0 = "42000002", tlbwr_0 = "42000006", tlbp_0 = "42000008", eret_0 = "42000018", deret_0 = "4200001f", wait_0 = "42000020", -- Opcode COP1. mfc1_2 = "44000000TG", cfc1_2 = "44400000TG", mfhc1_2 = "44600000TG", mtc1_2 = "44800000TG", ctc1_2 = "44c00000TG", mthc1_2 = "44e00000TG", bc1f_1 = "45000000B", bc1f_2 = "45000000CB", bc1t_1 = "45010000B", bc1t_2 = "45010000CB", bc1fl_1 = "45020000B", bc1fl_2 = "45020000CB", bc1tl_1 = "45030000B", bc1tl_2 = "45030000CB", ["add.s_3"] = "46000000FGH", ["sub.s_3"] = "46000001FGH", ["mul.s_3"] = "46000002FGH", ["div.s_3"] = "46000003FGH", ["sqrt.s_2"] = "46000004FG", ["abs.s_2"] = "46000005FG", ["mov.s_2"] = "46000006FG", ["neg.s_2"] = "46000007FG", ["round.l.s_2"] = "46000008FG", ["trunc.l.s_2"] = "46000009FG", ["ceil.l.s_2"] = "4600000aFG", ["floor.l.s_2"] = "4600000bFG", ["round.w.s_2"] = "4600000cFG", ["trunc.w.s_2"] = "4600000dFG", ["ceil.w.s_2"] = "4600000eFG", ["floor.w.s_2"] = "4600000fFG", ["movf.s_2"] = "46000011FG", ["movf.s_3"] = "46000011FGC", ["movt.s_2"] = "46010011FG", ["movt.s_3"] = "46010011FGC", ["movz.s_3"] = "46000012FGT", ["movn.s_3"] = "46000013FGT", ["recip.s_2"] = "46000015FG", ["rsqrt.s_2"] = "46000016FG", ["cvt.d.s_2"] = "46000021FG", ["cvt.w.s_2"] = "46000024FG", ["cvt.l.s_2"] = "46000025FG", ["cvt.ps.s_3"] = "46000026FGH", ["c.f.s_2"] = "46000030GH", ["c.f.s_3"] = "46000030VGH", ["c.un.s_2"] = "46000031GH", ["c.un.s_3"] = "46000031VGH", ["c.eq.s_2"] = "46000032GH", ["c.eq.s_3"] = "46000032VGH", ["c.ueq.s_2"] = "46000033GH", ["c.ueq.s_3"] = "46000033VGH", ["c.olt.s_2"] = "46000034GH", ["c.olt.s_3"] = "46000034VGH", ["c.ult.s_2"] = "46000035GH", ["c.ult.s_3"] = "46000035VGH", ["c.ole.s_2"] = "46000036GH", ["c.ole.s_3"] = "46000036VGH", ["c.ule.s_2"] = "46000037GH", ["c.ule.s_3"] = "46000037VGH", ["c.sf.s_2"] = "46000038GH", ["c.sf.s_3"] = "46000038VGH", ["c.ngle.s_2"] = "46000039GH", ["c.ngle.s_3"] = "46000039VGH", ["c.seq.s_2"] = "4600003aGH", ["c.seq.s_3"] = "4600003aVGH", ["c.ngl.s_2"] = "4600003bGH", ["c.ngl.s_3"] = "4600003bVGH", ["c.lt.s_2"] = "4600003cGH", ["c.lt.s_3"] = "4600003cVGH", ["c.nge.s_2"] = "4600003dGH", ["c.nge.s_3"] = "4600003dVGH", ["c.le.s_2"] = "4600003eGH", ["c.le.s_3"] = "4600003eVGH", ["c.ngt.s_2"] = "4600003fGH", ["c.ngt.s_3"] = "4600003fVGH", ["add.d_3"] = "46200000FGH", ["sub.d_3"] = "46200001FGH", ["mul.d_3"] = "46200002FGH", ["div.d_3"] = "46200003FGH", ["sqrt.d_2"] = "46200004FG", ["abs.d_2"] = "46200005FG", ["mov.d_2"] = "46200006FG", ["neg.d_2"] = "46200007FG", ["round.l.d_2"] = "46200008FG", ["trunc.l.d_2"] = "46200009FG", ["ceil.l.d_2"] = "4620000aFG", ["floor.l.d_2"] = "4620000bFG", ["round.w.d_2"] = "4620000cFG", ["trunc.w.d_2"] = "4620000dFG", ["ceil.w.d_2"] = "4620000eFG", ["floor.w.d_2"] = "4620000fFG", ["movf.d_2"] = "46200011FG", ["movf.d_3"] = "46200011FGC", ["movt.d_2"] = "46210011FG", ["movt.d_3"] = "46210011FGC", ["movz.d_3"] = "46200012FGT", ["movn.d_3"] = "46200013FGT", ["recip.d_2"] = "46200015FG", ["rsqrt.d_2"] = "46200016FG", ["cvt.s.d_2"] = "46200020FG", ["cvt.w.d_2"] = "46200024FG", ["cvt.l.d_2"] = "46200025FG", ["c.f.d_2"] = "46200030GH", ["c.f.d_3"] = "46200030VGH", ["c.un.d_2"] = "46200031GH", ["c.un.d_3"] = "46200031VGH", ["c.eq.d_2"] = "46200032GH", ["c.eq.d_3"] = "46200032VGH", ["c.ueq.d_2"] = "46200033GH", ["c.ueq.d_3"] = "46200033VGH", ["c.olt.d_2"] = "46200034GH", ["c.olt.d_3"] = "46200034VGH", ["c.ult.d_2"] = "46200035GH", ["c.ult.d_3"] = "46200035VGH", ["c.ole.d_2"] = "46200036GH", ["c.ole.d_3"] = "46200036VGH", ["c.ule.d_2"] = "46200037GH", ["c.ule.d_3"] = "46200037VGH", ["c.sf.d_2"] = "46200038GH", ["c.sf.d_3"] = "46200038VGH", ["c.ngle.d_2"] = "46200039GH", ["c.ngle.d_3"] = "46200039VGH", ["c.seq.d_2"] = "4620003aGH", ["c.seq.d_3"] = "4620003aVGH", ["c.ngl.d_2"] = "4620003bGH", ["c.ngl.d_3"] = "4620003bVGH", ["c.lt.d_2"] = "4620003cGH", ["c.lt.d_3"] = "4620003cVGH", ["c.nge.d_2"] = "4620003dGH", ["c.nge.d_3"] = "4620003dVGH", ["c.le.d_2"] = "4620003eGH", ["c.le.d_3"] = "4620003eVGH", ["c.ngt.d_2"] = "4620003fGH", ["c.ngt.d_3"] = "4620003fVGH", ["add.ps_3"] = "46c00000FGH", ["sub.ps_3"] = "46c00001FGH", ["mul.ps_3"] = "46c00002FGH", ["abs.ps_2"] = "46c00005FG", ["mov.ps_2"] = "46c00006FG", ["neg.ps_2"] = "46c00007FG", ["movf.ps_2"] = "46c00011FG", ["movf.ps_3"] = "46c00011FGC", ["movt.ps_2"] = "46c10011FG", ["movt.ps_3"] = "46c10011FGC", ["movz.ps_3"] = "46c00012FGT", ["movn.ps_3"] = "46c00013FGT", ["cvt.s.pu_2"] = "46c00020FG", ["cvt.s.pl_2"] = "46c00028FG", ["pll.ps_3"] = "46c0002cFGH", ["plu.ps_3"] = "46c0002dFGH", ["pul.ps_3"] = "46c0002eFGH", ["puu.ps_3"] = "46c0002fFGH", ["c.f.ps_2"] = "46c00030GH", ["c.f.ps_3"] = "46c00030VGH", ["c.un.ps_2"] = "46c00031GH", ["c.un.ps_3"] = "46c00031VGH", ["c.eq.ps_2"] = "46c00032GH", ["c.eq.ps_3"] = "46c00032VGH", ["c.ueq.ps_2"] = "46c00033GH", ["c.ueq.ps_3"] = "46c00033VGH", ["c.olt.ps_2"] = "46c00034GH", ["c.olt.ps_3"] = "46c00034VGH", ["c.ult.ps_2"] = "46c00035GH", ["c.ult.ps_3"] = "46c00035VGH", ["c.ole.ps_2"] = "46c00036GH", ["c.ole.ps_3"] = "46c00036VGH", ["c.ule.ps_2"] = "46c00037GH", ["c.ule.ps_3"] = "46c00037VGH", ["c.sf.ps_2"] = "46c00038GH", ["c.sf.ps_3"] = "46c00038VGH", ["c.ngle.ps_2"] = "46c00039GH", ["c.ngle.ps_3"] = "46c00039VGH", ["c.seq.ps_2"] = "46c0003aGH", ["c.seq.ps_3"] = "46c0003aVGH", ["c.ngl.ps_2"] = "46c0003bGH", ["c.ngl.ps_3"] = "46c0003bVGH", ["c.lt.ps_2"] = "46c0003cGH", ["c.lt.ps_3"] = "46c0003cVGH", ["c.nge.ps_2"] = "46c0003dGH", ["c.nge.ps_3"] = "46c0003dVGH", ["c.le.ps_2"] = "46c0003eGH", ["c.le.ps_3"] = "46c0003eVGH", ["c.ngt.ps_2"] = "46c0003fGH", ["c.ngt.ps_3"] = "46c0003fVGH", ["cvt.s.w_2"] = "46800020FG", ["cvt.d.w_2"] = "46800021FG", ["cvt.s.l_2"] = "46a00020FG", ["cvt.d.l_2"] = "46a00021FG", -- Opcode COP1X. lwxc1_2 = "4c000000FX", ldxc1_2 = "4c000001FX", luxc1_2 = "4c000005FX", swxc1_2 = "4c000008FX", sdxc1_2 = "4c000009FX", suxc1_2 = "4c00000dFX", prefx_2 = "4c00000fMX", ["alnv.ps_4"] = "4c00001eFGHS", ["madd.s_4"] = "4c000020FRGH", ["madd.d_4"] = "4c000021FRGH", ["madd.ps_4"] = "4c000026FRGH", ["msub.s_4"] = "4c000028FRGH", ["msub.d_4"] = "4c000029FRGH", ["msub.ps_4"] = "4c00002eFRGH", ["nmadd.s_4"] = "4c000030FRGH", ["nmadd.d_4"] = "4c000031FRGH", ["nmadd.ps_4"] = "4c000036FRGH", ["nmsub.s_4"] = "4c000038FRGH", ["nmsub.d_4"] = "4c000039FRGH", ["nmsub.ps_4"] = "4c00003eFRGH", } ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_fpr(expr) local r = match(expr, "^f([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r end end werror("bad register name `"..expr.."'") end local function parse_imm(imm, bits, shift, scale, signed) local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") elseif match(imm, "^[rf]([1-3]?[0-9])$") or match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then werror("expected immediate operand, got register") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_disp(disp) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = shl(parse_gpr(reg), 21) local extname = match(imm, "^extern%s+(%S+)$") if extname then waction("REL_EXT", map_extern[extname], nil, 1) return r else return r + parse_imm(imm, 16, 0, 0, true) end end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if tp then waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) return shl(r, 21) end end werror("bad displacement `"..disp.."'") end local function parse_index(idx) local rt, rs = match(idx, "^(.*)%(([%w_:]+)%)$") if rt then rt = parse_gpr(rt) rs = parse_gpr(rs) return shl(rt, 16) + shl(rs, 21) end werror("bad index `"..idx.."'") end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return sub(template, 9) end local op = tonumber(sub(template, 1, 8), 16) local n = 1 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 2 positions (ins/ext). if secpos+2 > maxsecpos then wflush() end local pos = wpos() -- Process each character. for p in gmatch(sub(template, 9), ".") do if p == "D" then op = op + shl(parse_gpr(params[n]), 11); n = n + 1 elseif p == "T" then op = op + shl(parse_gpr(params[n]), 16); n = n + 1 elseif p == "S" then op = op + shl(parse_gpr(params[n]), 21); n = n + 1 elseif p == "F" then op = op + shl(parse_fpr(params[n]), 6); n = n + 1 elseif p == "G" then op = op + shl(parse_fpr(params[n]), 11); n = n + 1 elseif p == "H" then op = op + shl(parse_fpr(params[n]), 16); n = n + 1 elseif p == "R" then op = op + shl(parse_fpr(params[n]), 21); n = n + 1 elseif p == "I" then op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 elseif p == "U" then op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 elseif p == "O" then op = op + parse_disp(params[n]); n = n + 1 elseif p == "X" then op = op + parse_index(params[n]); n = n + 1 elseif p == "B" or p == "J" then local mode, n, s = parse_label(params[n], false) if p == "B" then n = n + 2048 end waction("REL_"..mode, n, s, 1) n = n + 1 elseif p == "A" then op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 elseif p == "M" then op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1 elseif p == "N" then op = op + parse_imm(params[n], 5, 16, 0, false); n = n + 1 elseif p == "C" then op = op + parse_imm(params[n], 3, 18, 0, false); n = n + 1 elseif p == "V" then op = op + parse_imm(params[n], 3, 8, 0, false); n = n + 1 elseif p == "W" then op = op + parse_imm(params[n], 3, 0, 0, false); n = n + 1 elseif p == "Y" then op = op + parse_imm(params[n], 20, 6, 0, false); n = n + 1 elseif p == "Z" then op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 elseif p == "=" then op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. else assert(false) end end wputpos(pos, op) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2015.11/3rdparty/dynasm/dasm_ppc.h0000644000175000017500000002751612456307242017072 0ustar jnthnjnthn/* ** DynASM PPC encoding engine. ** Copyright (C) 2005-2014 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "ppc" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); #endif n >>= ((ins>>10)&31); #ifdef DASM_CHECKS if (ins & 0x8000) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1) - 4; goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base); patchrel: CK((n & 3) == 0 && (((n+4) + ((ins & 2048) ? 0x00008000 : 0x02000000)) >> ((ins & 2048) ? 16 : 26)) == 0, RANGE_REL); cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc)); break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2015.11/3rdparty/dynasm/dasm_ppc.lua0000644000175000017500000011031012456307242017405 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM PPC module. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "ppc", description = "DynASM PPC module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable = assert, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch = _s.match, _s.gmatch local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift local tohex = bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n <= 0xffffff then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = { sp = "r1" } -- Ext. register name -> int. name. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) if s == "r1" then return "sp" end return s end local map_cond = { lt = 0, gt = 1, eq = 2, so = 3, ge = 4, le = 5, ne = 6, ns = 7, } ------------------------------------------------------------------------------ -- Template strings for PPC instructions. local map_op = { tdi_3 = "08000000ARI", twi_3 = "0c000000ARI", mulli_3 = "1c000000RRI", subfic_3 = "20000000RRI", cmplwi_3 = "28000000XRU", cmplwi_2 = "28000000-RU", cmpldi_3 = "28200000XRU", cmpldi_2 = "28200000-RU", cmpwi_3 = "2c000000XRI", cmpwi_2 = "2c000000-RI", cmpdi_3 = "2c200000XRI", cmpdi_2 = "2c200000-RI", addic_3 = "30000000RRI", ["addic._3"] = "34000000RRI", addi_3 = "38000000RR0I", li_2 = "38000000RI", la_2 = "38000000RD", addis_3 = "3c000000RR0I", lis_2 = "3c000000RI", lus_2 = "3c000000RU", bc_3 = "40000000AAK", bcl_3 = "40000001AAK", bdnz_1 = "42000000K", bdz_1 = "42400000K", sc_0 = "44000000", b_1 = "48000000J", bl_1 = "48000001J", rlwimi_5 = "50000000RR~AAA.", rlwinm_5 = "54000000RR~AAA.", rlwnm_5 = "5c000000RR~RAA.", ori_3 = "60000000RR~U", nop_0 = "60000000", oris_3 = "64000000RR~U", xori_3 = "68000000RR~U", xoris_3 = "6c000000RR~U", ["andi._3"] = "70000000RR~U", ["andis._3"] = "74000000RR~U", lwz_2 = "80000000RD", lwzu_2 = "84000000RD", lbz_2 = "88000000RD", lbzu_2 = "8c000000RD", stw_2 = "90000000RD", stwu_2 = "94000000RD", stb_2 = "98000000RD", stbu_2 = "9c000000RD", lhz_2 = "a0000000RD", lhzu_2 = "a4000000RD", lha_2 = "a8000000RD", lhau_2 = "ac000000RD", sth_2 = "b0000000RD", sthu_2 = "b4000000RD", lmw_2 = "b8000000RD", stmw_2 = "bc000000RD", lfs_2 = "c0000000FD", lfsu_2 = "c4000000FD", lfd_2 = "c8000000FD", lfdu_2 = "cc000000FD", stfs_2 = "d0000000FD", stfsu_2 = "d4000000FD", stfd_2 = "d8000000FD", stfdu_2 = "dc000000FD", ld_2 = "e8000000RD", -- NYI: displacement must be divisible by 4. ldu_2 = "e8000001RD", lwa_2 = "e8000002RD", std_2 = "f8000000RD", stdu_2 = "f8000001RD", -- Primary opcode 19: mcrf_2 = "4c000000XX", isync_0 = "4c00012c", crnor_3 = "4c000042CCC", crnot_2 = "4c000042CC=", crandc_3 = "4c000102CCC", crxor_3 = "4c000182CCC", crclr_1 = "4c000182C==", crnand_3 = "4c0001c2CCC", crand_3 = "4c000202CCC", creqv_3 = "4c000242CCC", crset_1 = "4c000242C==", crorc_3 = "4c000342CCC", cror_3 = "4c000382CCC", crmove_2 = "4c000382CC=", bclr_2 = "4c000020AA", bclrl_2 = "4c000021AA", bcctr_2 = "4c000420AA", bcctrl_2 = "4c000421AA", blr_0 = "4e800020", blrl_0 = "4e800021", bctr_0 = "4e800420", bctrl_0 = "4e800421", -- Primary opcode 31: cmpw_3 = "7c000000XRR", cmpw_2 = "7c000000-RR", cmpd_3 = "7c200000XRR", cmpd_2 = "7c200000-RR", tw_3 = "7c000008ARR", subfc_3 = "7c000010RRR.", subc_3 = "7c000010RRR~.", mulhdu_3 = "7c000012RRR.", addc_3 = "7c000014RRR.", mulhwu_3 = "7c000016RRR.", isel_4 = "7c00001eRRRC", isellt_3 = "7c00001eRRR", iselgt_3 = "7c00005eRRR", iseleq_3 = "7c00009eRRR", mfcr_1 = "7c000026R", mfocrf_2 = "7c100026RG", mtcrf_2 = "7c000120GR", mtocrf_2 = "7c100120GR", lwarx_3 = "7c000028RR0R", ldx_3 = "7c00002aRR0R", lwzx_3 = "7c00002eRR0R", slw_3 = "7c000030RR~R.", cntlzw_2 = "7c000034RR~", sld_3 = "7c000036RR~R.", and_3 = "7c000038RR~R.", cmplw_3 = "7c000040XRR", cmplw_2 = "7c000040-RR", cmpld_3 = "7c200040XRR", cmpld_2 = "7c200040-RR", subf_3 = "7c000050RRR.", sub_3 = "7c000050RRR~.", ldux_3 = "7c00006aRR0R", dcbst_2 = "7c00006c-RR", lwzux_3 = "7c00006eRR0R", cntlzd_2 = "7c000074RR~", andc_3 = "7c000078RR~R.", td_3 = "7c000088ARR", mulhd_3 = "7c000092RRR.", mulhw_3 = "7c000096RRR.", ldarx_3 = "7c0000a8RR0R", dcbf_2 = "7c0000ac-RR", lbzx_3 = "7c0000aeRR0R", neg_2 = "7c0000d0RR.", lbzux_3 = "7c0000eeRR0R", popcntb_2 = "7c0000f4RR~", not_2 = "7c0000f8RR~%.", nor_3 = "7c0000f8RR~R.", subfe_3 = "7c000110RRR.", sube_3 = "7c000110RRR~.", adde_3 = "7c000114RRR.", stdx_3 = "7c00012aRR0R", stwcx_3 = "7c00012cRR0R.", stwx_3 = "7c00012eRR0R", prtyw_2 = "7c000134RR~", stdux_3 = "7c00016aRR0R", stwux_3 = "7c00016eRR0R", prtyd_2 = "7c000174RR~", subfze_2 = "7c000190RR.", addze_2 = "7c000194RR.", stdcx_3 = "7c0001acRR0R.", stbx_3 = "7c0001aeRR0R", subfme_2 = "7c0001d0RR.", mulld_3 = "7c0001d2RRR.", addme_2 = "7c0001d4RR.", mullw_3 = "7c0001d6RRR.", dcbtst_2 = "7c0001ec-RR", stbux_3 = "7c0001eeRR0R", add_3 = "7c000214RRR.", dcbt_2 = "7c00022c-RR", lhzx_3 = "7c00022eRR0R", eqv_3 = "7c000238RR~R.", eciwx_3 = "7c00026cRR0R", lhzux_3 = "7c00026eRR0R", xor_3 = "7c000278RR~R.", mfspefscr_1 = "7c0082a6R", mfxer_1 = "7c0102a6R", mflr_1 = "7c0802a6R", mfctr_1 = "7c0902a6R", lwax_3 = "7c0002aaRR0R", lhax_3 = "7c0002aeRR0R", mftb_1 = "7c0c42e6R", mftbu_1 = "7c0d42e6R", lwaux_3 = "7c0002eaRR0R", lhaux_3 = "7c0002eeRR0R", sthx_3 = "7c00032eRR0R", orc_3 = "7c000338RR~R.", ecowx_3 = "7c00036cRR0R", sthux_3 = "7c00036eRR0R", or_3 = "7c000378RR~R.", mr_2 = "7c000378RR~%.", divdu_3 = "7c000392RRR.", divwu_3 = "7c000396RRR.", mtspefscr_1 = "7c0083a6R", mtxer_1 = "7c0103a6R", mtlr_1 = "7c0803a6R", mtctr_1 = "7c0903a6R", dcbi_2 = "7c0003ac-RR", nand_3 = "7c0003b8RR~R.", divd_3 = "7c0003d2RRR.", divw_3 = "7c0003d6RRR.", cmpb_3 = "7c0003f8RR~R.", mcrxr_1 = "7c000400X", subfco_3 = "7c000410RRR.", subco_3 = "7c000410RRR~.", addco_3 = "7c000414RRR.", ldbrx_3 = "7c000428RR0R", lswx_3 = "7c00042aRR0R", lwbrx_3 = "7c00042cRR0R", lfsx_3 = "7c00042eFR0R", srw_3 = "7c000430RR~R.", srd_3 = "7c000436RR~R.", subfo_3 = "7c000450RRR.", subo_3 = "7c000450RRR~.", lfsux_3 = "7c00046eFR0R", lswi_3 = "7c0004aaRR0A", sync_0 = "7c0004ac", lwsync_0 = "7c2004ac", ptesync_0 = "7c4004ac", lfdx_3 = "7c0004aeFR0R", nego_2 = "7c0004d0RR.", lfdux_3 = "7c0004eeFR0R", subfeo_3 = "7c000510RRR.", subeo_3 = "7c000510RRR~.", addeo_3 = "7c000514RRR.", stdbrx_3 = "7c000528RR0R", stswx_3 = "7c00052aRR0R", stwbrx_3 = "7c00052cRR0R", stfsx_3 = "7c00052eFR0R", stfsux_3 = "7c00056eFR0R", subfzeo_2 = "7c000590RR.", addzeo_2 = "7c000594RR.", stswi_3 = "7c0005aaRR0A", stfdx_3 = "7c0005aeFR0R", subfmeo_2 = "7c0005d0RR.", mulldo_3 = "7c0005d2RRR.", addmeo_2 = "7c0005d4RR.", mullwo_3 = "7c0005d6RRR.", dcba_2 = "7c0005ec-RR", stfdux_3 = "7c0005eeFR0R", addo_3 = "7c000614RRR.", lhbrx_3 = "7c00062cRR0R", sraw_3 = "7c000630RR~R.", srad_3 = "7c000634RR~R.", srawi_3 = "7c000670RR~A.", sradi_3 = "7c000674RR~H.", eieio_0 = "7c0006ac", lfiwax_3 = "7c0006aeFR0R", sthbrx_3 = "7c00072cRR0R", extsh_2 = "7c000734RR~.", extsb_2 = "7c000774RR~.", divduo_3 = "7c000792RRR.", divwou_3 = "7c000796RRR.", icbi_2 = "7c0007ac-RR", stfiwx_3 = "7c0007aeFR0R", extsw_2 = "7c0007b4RR~.", divdo_3 = "7c0007d2RRR.", divwo_3 = "7c0007d6RRR.", dcbz_2 = "7c0007ec-RR", -- Primary opcode 30: rldicl_4 = "78000000RR~HM.", rldicr_4 = "78000004RR~HM.", rldic_4 = "78000008RR~HM.", rldimi_4 = "7800000cRR~HM.", rldcl_4 = "78000010RR~RM.", rldcr_4 = "78000012RR~RM.", -- Primary opcode 59: fdivs_3 = "ec000024FFF.", fsubs_3 = "ec000028FFF.", fadds_3 = "ec00002aFFF.", fsqrts_2 = "ec00002cF-F.", fres_2 = "ec000030F-F.", fmuls_3 = "ec000032FF-F.", frsqrtes_2 = "ec000034F-F.", fmsubs_4 = "ec000038FFFF~.", fmadds_4 = "ec00003aFFFF~.", fnmsubs_4 = "ec00003cFFFF~.", fnmadds_4 = "ec00003eFFFF~.", -- Primary opcode 63: fdiv_3 = "fc000024FFF.", fsub_3 = "fc000028FFF.", fadd_3 = "fc00002aFFF.", fsqrt_2 = "fc00002cF-F.", fsel_4 = "fc00002eFFFF~.", fre_2 = "fc000030F-F.", fmul_3 = "fc000032FF-F.", frsqrte_2 = "fc000034F-F.", fmsub_4 = "fc000038FFFF~.", fmadd_4 = "fc00003aFFFF~.", fnmsub_4 = "fc00003cFFFF~.", fnmadd_4 = "fc00003eFFFF~.", fcmpu_3 = "fc000000XFF", fcpsgn_3 = "fc000010FFF.", fcmpo_3 = "fc000040XFF", mtfsb1_1 = "fc00004cA", fneg_2 = "fc000050F-F.", mcrfs_2 = "fc000080XX", mtfsb0_1 = "fc00008cA", fmr_2 = "fc000090F-F.", frsp_2 = "fc000018F-F.", fctiw_2 = "fc00001cF-F.", fctiwz_2 = "fc00001eF-F.", mtfsfi_2 = "fc00010cAA", -- NYI: upshift. fnabs_2 = "fc000110F-F.", fabs_2 = "fc000210F-F.", frin_2 = "fc000310F-F.", friz_2 = "fc000350F-F.", frip_2 = "fc000390F-F.", frim_2 = "fc0003d0F-F.", mffs_1 = "fc00048eF.", -- NYI: mtfsf, mtfsb0, mtfsb1. fctid_2 = "fc00065cF-F.", fctidz_2 = "fc00065eF-F.", fcfid_2 = "fc00069cF-F.", -- Primary opcode 4, SPE APU extension: evaddw_3 = "10000200RRR", evaddiw_3 = "10000202RAR~", evsubw_3 = "10000204RRR~", evsubiw_3 = "10000206RAR~", evabs_2 = "10000208RR", evneg_2 = "10000209RR", evextsb_2 = "1000020aRR", evextsh_2 = "1000020bRR", evrndw_2 = "1000020cRR", evcntlzw_2 = "1000020dRR", evcntlsw_2 = "1000020eRR", brinc_3 = "1000020fRRR", evand_3 = "10000211RRR", evandc_3 = "10000212RRR", evxor_3 = "10000216RRR", evor_3 = "10000217RRR", evmr_2 = "10000217RR=", evnor_3 = "10000218RRR", evnot_2 = "10000218RR=", eveqv_3 = "10000219RRR", evorc_3 = "1000021bRRR", evnand_3 = "1000021eRRR", evsrwu_3 = "10000220RRR", evsrws_3 = "10000221RRR", evsrwiu_3 = "10000222RRA", evsrwis_3 = "10000223RRA", evslw_3 = "10000224RRR", evslwi_3 = "10000226RRA", evrlw_3 = "10000228RRR", evsplati_2 = "10000229RS", evrlwi_3 = "1000022aRRA", evsplatfi_2 = "1000022bRS", evmergehi_3 = "1000022cRRR", evmergelo_3 = "1000022dRRR", evcmpgtu_3 = "10000230XRR", evcmpgtu_2 = "10000230-RR", evcmpgts_3 = "10000231XRR", evcmpgts_2 = "10000231-RR", evcmpltu_3 = "10000232XRR", evcmpltu_2 = "10000232-RR", evcmplts_3 = "10000233XRR", evcmplts_2 = "10000233-RR", evcmpeq_3 = "10000234XRR", evcmpeq_2 = "10000234-RR", evsel_4 = "10000278RRRW", evsel_3 = "10000278RRR", evfsadd_3 = "10000280RRR", evfssub_3 = "10000281RRR", evfsabs_2 = "10000284RR", evfsnabs_2 = "10000285RR", evfsneg_2 = "10000286RR", evfsmul_3 = "10000288RRR", evfsdiv_3 = "10000289RRR", evfscmpgt_3 = "1000028cXRR", evfscmpgt_2 = "1000028c-RR", evfscmplt_3 = "1000028dXRR", evfscmplt_2 = "1000028d-RR", evfscmpeq_3 = "1000028eXRR", evfscmpeq_2 = "1000028e-RR", evfscfui_2 = "10000290R-R", evfscfsi_2 = "10000291R-R", evfscfuf_2 = "10000292R-R", evfscfsf_2 = "10000293R-R", evfsctui_2 = "10000294R-R", evfsctsi_2 = "10000295R-R", evfsctuf_2 = "10000296R-R", evfsctsf_2 = "10000297R-R", evfsctuiz_2 = "10000298R-R", evfsctsiz_2 = "1000029aR-R", evfststgt_3 = "1000029cXRR", evfststgt_2 = "1000029c-RR", evfststlt_3 = "1000029dXRR", evfststlt_2 = "1000029d-RR", evfststeq_3 = "1000029eXRR", evfststeq_2 = "1000029e-RR", efsadd_3 = "100002c0RRR", efssub_3 = "100002c1RRR", efsabs_2 = "100002c4RR", efsnabs_2 = "100002c5RR", efsneg_2 = "100002c6RR", efsmul_3 = "100002c8RRR", efsdiv_3 = "100002c9RRR", efscmpgt_3 = "100002ccXRR", efscmpgt_2 = "100002cc-RR", efscmplt_3 = "100002cdXRR", efscmplt_2 = "100002cd-RR", efscmpeq_3 = "100002ceXRR", efscmpeq_2 = "100002ce-RR", efscfd_2 = "100002cfR-R", efscfui_2 = "100002d0R-R", efscfsi_2 = "100002d1R-R", efscfuf_2 = "100002d2R-R", efscfsf_2 = "100002d3R-R", efsctui_2 = "100002d4R-R", efsctsi_2 = "100002d5R-R", efsctuf_2 = "100002d6R-R", efsctsf_2 = "100002d7R-R", efsctuiz_2 = "100002d8R-R", efsctsiz_2 = "100002daR-R", efststgt_3 = "100002dcXRR", efststgt_2 = "100002dc-RR", efststlt_3 = "100002ddXRR", efststlt_2 = "100002dd-RR", efststeq_3 = "100002deXRR", efststeq_2 = "100002de-RR", efdadd_3 = "100002e0RRR", efdsub_3 = "100002e1RRR", efdcfuid_2 = "100002e2R-R", efdcfsid_2 = "100002e3R-R", efdabs_2 = "100002e4RR", efdnabs_2 = "100002e5RR", efdneg_2 = "100002e6RR", efdmul_3 = "100002e8RRR", efddiv_3 = "100002e9RRR", efdctuidz_2 = "100002eaR-R", efdctsidz_2 = "100002ebR-R", efdcmpgt_3 = "100002ecXRR", efdcmpgt_2 = "100002ec-RR", efdcmplt_3 = "100002edXRR", efdcmplt_2 = "100002ed-RR", efdcmpeq_3 = "100002eeXRR", efdcmpeq_2 = "100002ee-RR", efdcfs_2 = "100002efR-R", efdcfui_2 = "100002f0R-R", efdcfsi_2 = "100002f1R-R", efdcfuf_2 = "100002f2R-R", efdcfsf_2 = "100002f3R-R", efdctui_2 = "100002f4R-R", efdctsi_2 = "100002f5R-R", efdctuf_2 = "100002f6R-R", efdctsf_2 = "100002f7R-R", efdctuiz_2 = "100002f8R-R", efdctsiz_2 = "100002faR-R", efdtstgt_3 = "100002fcXRR", efdtstgt_2 = "100002fc-RR", efdtstlt_3 = "100002fdXRR", efdtstlt_2 = "100002fd-RR", efdtsteq_3 = "100002feXRR", efdtsteq_2 = "100002fe-RR", evlddx_3 = "10000300RR0R", evldd_2 = "10000301R8", evldwx_3 = "10000302RR0R", evldw_2 = "10000303R8", evldhx_3 = "10000304RR0R", evldh_2 = "10000305R8", evlwhex_3 = "10000310RR0R", evlwhe_2 = "10000311R4", evlwhoux_3 = "10000314RR0R", evlwhou_2 = "10000315R4", evlwhosx_3 = "10000316RR0R", evlwhos_2 = "10000317R4", evstddx_3 = "10000320RR0R", evstdd_2 = "10000321R8", evstdwx_3 = "10000322RR0R", evstdw_2 = "10000323R8", evstdhx_3 = "10000324RR0R", evstdh_2 = "10000325R8", evstwhex_3 = "10000330RR0R", evstwhe_2 = "10000331R4", evstwhox_3 = "10000334RR0R", evstwho_2 = "10000335R4", evstwwex_3 = "10000338RR0R", evstwwe_2 = "10000339R4", evstwwox_3 = "1000033cRR0R", evstwwo_2 = "1000033dR4", evmhessf_3 = "10000403RRR", evmhossf_3 = "10000407RRR", evmheumi_3 = "10000408RRR", evmhesmi_3 = "10000409RRR", evmhesmf_3 = "1000040bRRR", evmhoumi_3 = "1000040cRRR", evmhosmi_3 = "1000040dRRR", evmhosmf_3 = "1000040fRRR", evmhessfa_3 = "10000423RRR", evmhossfa_3 = "10000427RRR", evmheumia_3 = "10000428RRR", evmhesmia_3 = "10000429RRR", evmhesmfa_3 = "1000042bRRR", evmhoumia_3 = "1000042cRRR", evmhosmia_3 = "1000042dRRR", evmhosmfa_3 = "1000042fRRR", evmwhssf_3 = "10000447RRR", evmwlumi_3 = "10000448RRR", evmwhumi_3 = "1000044cRRR", evmwhsmi_3 = "1000044dRRR", evmwhsmf_3 = "1000044fRRR", evmwssf_3 = "10000453RRR", evmwumi_3 = "10000458RRR", evmwsmi_3 = "10000459RRR", evmwsmf_3 = "1000045bRRR", evmwhssfa_3 = "10000467RRR", evmwlumia_3 = "10000468RRR", evmwhumia_3 = "1000046cRRR", evmwhsmia_3 = "1000046dRRR", evmwhsmfa_3 = "1000046fRRR", evmwssfa_3 = "10000473RRR", evmwumia_3 = "10000478RRR", evmwsmia_3 = "10000479RRR", evmwsmfa_3 = "1000047bRRR", evmra_2 = "100004c4RR", evdivws_3 = "100004c6RRR", evdivwu_3 = "100004c7RRR", evmwssfaa_3 = "10000553RRR", evmwumiaa_3 = "10000558RRR", evmwsmiaa_3 = "10000559RRR", evmwsmfaa_3 = "1000055bRRR", evmwssfan_3 = "100005d3RRR", evmwumian_3 = "100005d8RRR", evmwsmian_3 = "100005d9RRR", evmwsmfan_3 = "100005dbRRR", evmergehilo_3 = "1000022eRRR", evmergelohi_3 = "1000022fRRR", evlhhesplatx_3 = "10000308RR0R", evlhhesplat_2 = "10000309R2", evlhhousplatx_3 = "1000030cRR0R", evlhhousplat_2 = "1000030dR2", evlhhossplatx_3 = "1000030eRR0R", evlhhossplat_2 = "1000030fR2", evlwwsplatx_3 = "10000318RR0R", evlwwsplat_2 = "10000319R4", evlwhsplatx_3 = "1000031cRR0R", evlwhsplat_2 = "1000031dR4", evaddusiaaw_2 = "100004c0RR", evaddssiaaw_2 = "100004c1RR", evsubfusiaaw_2 = "100004c2RR", evsubfssiaaw_2 = "100004c3RR", evaddumiaaw_2 = "100004c8RR", evaddsmiaaw_2 = "100004c9RR", evsubfumiaaw_2 = "100004caRR", evsubfsmiaaw_2 = "100004cbRR", evmheusiaaw_3 = "10000500RRR", evmhessiaaw_3 = "10000501RRR", evmhessfaaw_3 = "10000503RRR", evmhousiaaw_3 = "10000504RRR", evmhossiaaw_3 = "10000505RRR", evmhossfaaw_3 = "10000507RRR", evmheumiaaw_3 = "10000508RRR", evmhesmiaaw_3 = "10000509RRR", evmhesmfaaw_3 = "1000050bRRR", evmhoumiaaw_3 = "1000050cRRR", evmhosmiaaw_3 = "1000050dRRR", evmhosmfaaw_3 = "1000050fRRR", evmhegumiaa_3 = "10000528RRR", evmhegsmiaa_3 = "10000529RRR", evmhegsmfaa_3 = "1000052bRRR", evmhogumiaa_3 = "1000052cRRR", evmhogsmiaa_3 = "1000052dRRR", evmhogsmfaa_3 = "1000052fRRR", evmwlusiaaw_3 = "10000540RRR", evmwlssiaaw_3 = "10000541RRR", evmwlumiaaw_3 = "10000548RRR", evmwlsmiaaw_3 = "10000549RRR", evmheusianw_3 = "10000580RRR", evmhessianw_3 = "10000581RRR", evmhessfanw_3 = "10000583RRR", evmhousianw_3 = "10000584RRR", evmhossianw_3 = "10000585RRR", evmhossfanw_3 = "10000587RRR", evmheumianw_3 = "10000588RRR", evmhesmianw_3 = "10000589RRR", evmhesmfanw_3 = "1000058bRRR", evmhoumianw_3 = "1000058cRRR", evmhosmianw_3 = "1000058dRRR", evmhosmfanw_3 = "1000058fRRR", evmhegumian_3 = "100005a8RRR", evmhegsmian_3 = "100005a9RRR", evmhegsmfan_3 = "100005abRRR", evmhogumian_3 = "100005acRRR", evmhogsmian_3 = "100005adRRR", evmhogsmfan_3 = "100005afRRR", evmwlusianw_3 = "100005c0RRR", evmwlssianw_3 = "100005c1RRR", evmwlumianw_3 = "100005c8RRR", evmwlsmianw_3 = "100005c9RRR", -- NYI: Book E instructions. } -- Add mnemonics for "." variants. do local t = {} for k,v in pairs(map_op) do if sub(v, -1) == "." then local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2) t[sub(k, 1, -3).."."..sub(k, -2)] = v2 end end for k,v in pairs(t) do map_op[k] = v end end -- Add more branch mnemonics. for cond,c in pairs(map_cond) do local b1 = "b"..cond local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0) -- bX[l] map_op[b1.."_1"] = tohex(0x40800000 + c1).."K" map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K" map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K" map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK" map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK" map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK" -- bXlr[l] map_op[b1.."lr_0"] = tohex(0x4c800020 + c1) map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1) map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1) map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1) -- bXctr[l] map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X" map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X" map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X" map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X" end ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_fpr(expr) local r = match(expr, "^f([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r end end werror("bad register name `"..expr.."'") end local function parse_cr(expr) local r = match(expr, "^cr([0-7])$") if r then return tonumber(r) end werror("bad condition register name `"..expr.."'") end local function parse_cond(expr) local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$") if r then r = tonumber(r) local c = map_cond[cond] if c and c < 4 then return r*4+c end end werror("bad condition bit name `"..expr.."'") end local function parse_imm(imm, bits, shift, scale, signed) local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") elseif match(imm, "^r([1-3]?[0-9])$") or match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then werror("expected immediate operand, got register") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_shiftmask(imm, isshift) local n = tonumber(imm) if n then if shr(n, 6) == 0 then local lsb = band(imm, 31) local msb = imm - lsb return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb) end werror("out of range immediate `"..imm.."'") elseif match(imm, "^r([1-3]?[0-9])$") or match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then werror("expected immediate operand, got register") else werror("NYI: parameterized 64 bit shift/mask") end end local function parse_disp(disp) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end return shl(r, 16) + parse_imm(imm, 16, 0, 0, true) end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end if tp then waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) return shl(r, 16) end end werror("bad displacement `"..disp.."'") end local function parse_u5disp(disp, scale) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end return shl(r, 16) + parse_imm(imm, 5, 11, scale, false) end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end if tp then waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr)) return shl(r, 16) end end werror("bad displacement `"..disp.."'") end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return sub(template, 9) end local op = tonumber(sub(template, 1, 8), 16) local n, rs = 1, 26 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 3 positions (rlwinm). if secpos+3 > maxsecpos then wflush() end local pos = wpos() -- Process each character. for p in gmatch(sub(template, 9), ".") do if p == "R" then rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1 elseif p == "F" then rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1 elseif p == "A" then rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 elseif p == "S" then rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1 elseif p == "I" then op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 elseif p == "U" then op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 elseif p == "D" then op = op + parse_disp(params[n]); n = n + 1 elseif p == "2" then op = op + parse_u5disp(params[n], 1); n = n + 1 elseif p == "4" then op = op + parse_u5disp(params[n], 2); n = n + 1 elseif p == "8" then op = op + parse_u5disp(params[n], 3); n = n + 1 elseif p == "C" then rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1 elseif p == "X" then rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1 elseif p == "W" then op = op + parse_cr(params[n]); n = n + 1 elseif p == "G" then op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1 elseif p == "H" then op = op + parse_shiftmask(params[n], true); n = n + 1 elseif p == "M" then op = op + parse_shiftmask(params[n], false); n = n + 1 elseif p == "J" or p == "K" then local mode, n, s = parse_label(params[n], false) if p == "K" then n = n + 2048 end waction("REL_"..mode, n, s, 1) n = n + 1 elseif p == "0" then if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end elseif p == "=" or p == "%" then local t = band(shr(op, p == "%" and rs+5 or rs), 31) rs = rs - 5 op = op + shl(t, rs) elseif p == "~" then local mm = shl(31, rs) local lo = band(op, mm) local hi = band(op, shl(mm, 5)) op = op - lo - hi + shl(lo, 5) + shr(hi, 5) elseif p == "-" then rs = rs - 5 elseif p == "." then -- Ignored. else assert(false) end end wputpos(pos, op) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2015.11/3rdparty/dynasm/dasm_proto.h0000644000175000017500000000401612456307242017441 0ustar jnthnjnthn/* ** DynASM encoding engine prototypes. ** Copyright (C) 2005-2014 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #ifndef _DASM_PROTO_H #define _DASM_PROTO_H #include #include #define DASM_IDENT "DynASM 1.3.0" #define DASM_VERSION 10300 /* 1.3.0 */ #ifndef Dst_DECL #define Dst_DECL dasm_State **Dst #endif #ifndef Dst_REF #define Dst_REF (*Dst) #endif #ifndef DASM_FDEF #define DASM_FDEF extern #endif #ifndef DASM_M_GROW #define DASM_M_GROW(ctx, t, p, sz, need) \ do { \ size_t _sz = (sz), _need = (need); \ if (_sz < _need) { \ if (_sz < 16) _sz = 16; \ while (_sz < _need) _sz += _sz; \ (p) = (t *)realloc((p), _sz); \ if ((p) == NULL) exit(1); \ (sz) = _sz; \ } \ } while(0) #endif #ifndef DASM_M_FREE #define DASM_M_FREE(ctx, p, sz) free(p) #endif /* Internal DynASM encoder state. */ typedef struct dasm_State dasm_State; /* Initialize and free DynASM state. */ DASM_FDEF void dasm_init(Dst_DECL, int maxsection); DASM_FDEF void dasm_free(Dst_DECL); /* Setup global array. Must be called before dasm_setup(). */ DASM_FDEF void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl); /* Grow PC label array. Can be called after dasm_setup(), too. */ DASM_FDEF void dasm_growpc(Dst_DECL, unsigned int maxpc); /* Setup encoder. */ DASM_FDEF void dasm_setup(Dst_DECL, const void *actionlist); /* Feed encoder with actions. Calls are generated by pre-processor. */ DASM_FDEF void dasm_put(Dst_DECL, int start, ...); /* Link sections and return the resulting size. */ DASM_FDEF int dasm_link(Dst_DECL, size_t *szp); /* Encode sections into buffer. */ DASM_FDEF int dasm_encode(Dst_DECL, void *buffer); /* Get PC label offset. */ DASM_FDEF int dasm_getpclabel(Dst_DECL, unsigned int pc); #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ DASM_FDEF int dasm_checkstep(Dst_DECL, int secmatch); #else #define dasm_checkstep(a, b) 0 #endif #endif /* _DASM_PROTO_H */ MoarVM-2015.11/3rdparty/dynasm/dasm_x64.lua0000644000175000017500000000107012456307242017246 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM x64 module. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- This module just sets 64 bit mode for the combined x86/x64 module. -- All the interesting stuff is there. ------------------------------------------------------------------------------ x64 = true -- Using a global is an ugly, but effective solution. return require("dasm_x86") MoarVM-2015.11/3rdparty/dynasm/dasm_x86.h0000644000175000017500000003571512456307242016735 0ustar jnthnjnthn/* ** DynASM x86 encoding engine. ** Copyright (C) 2005-2014 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "x86" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. DASM_STOP must be 255. */ enum { DASM_DISP = 233, DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB, DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC, DASM_IMM_LG, DASM_IMM_PC, DASM_LABEL_LG, DASM_LABEL_PC, DASM_ALIGN, DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_SECTION, DASM_STOP }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_VREG 0x15000000 #define DASM_S_UNDEF_L 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned char *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(int)(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status=DASM_S_RANGE_##st|(int)(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs, mrm = 4; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { int action = *p++; if (action < DASM_DISP) { ofs++; } else if (action <= DASM_REL_A) { int n = va_arg(ap, int); b[pos++] = n; switch (action) { case DASM_DISP: if (n == 0) { if ((mrm&7) == 4) mrm = p[-2]; if ((mrm&7) != 5) break; } case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob; case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */ case DASM_IMM_D: ofs += 4; break; case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob; case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break; case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob; case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break; case DASM_SPACE: p++; ofs += n; break; case DASM_SETLABEL: b[pos-2] = -0x40000000; break; /* Neg. label ofs. */ case DASM_VREG: CK((n&-8) == 0 && (n != 4 || (*p&1) == 0), RANGE_VREG); if (*p++ == 1 && *p == DASM_DISP) mrm = n; continue; } mrm = 4; } else { int *pl, n; switch (action) { case DASM_REL_LG: case DASM_IMM_LG: n = *p++; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n <= 246) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl -= 246; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: case DASM_IMM_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; ofs += 4; /* Maximum offset needed. */ if (action == DASM_REL_LG || action == DASM_REL_PC) b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_LABEL_LG: pl = D->lglabels + *p++; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_ALIGN: ofs += *p++; /* Maximum alignment needed (arg is 2**n-1). */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_EXTERN: p += 2; ofs += 4; break; case DASM_ESC: p++; ofs++; break; case DASM_MARK: mrm = p[-2]; break; case DASM_SECTION: n = *p; CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; case DASM_STOP: goto stop; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink branches/aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { int op, action = *p++; switch (action) { case DASM_REL_LG: p++; op = p[-3]; goto rel_pc; case DASM_REL_PC: op = p[-2]; rel_pc: { int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0); if (shrink) { /* Shrinkable branch opcode? */ int lofs, lpos = b[pos]; if (lpos < 0) goto noshrink; /* Ext global? */ lofs = *DASM_POS2PTR(D, lpos); if (lpos > pos) { /* Fwd label: add cumulative section offsets. */ int i; for (i = secnum; i < DASM_POS2SEC(lpos); i++) lofs += D->sections[i].ofs; } else { lofs -= ofs; /* Bkwd label: unfix offset. */ } lofs -= b[pos+1]; /* Short branch ok? */ if (lofs >= -128-shrink && lofs <= 127) ofs -= shrink; /* Yes. */ else { noshrink: shrink = 0; } /* No, cannot shrink op. */ } b[pos+1] = shrink; pos += 2; break; } case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++; case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W: case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB: case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break; case DASM_LABEL_LG: p++; case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ case DASM_EXTERN: p += 2; break; case DASM_ESC: p++; break; case DASM_MARK: break; case DASM_SECTION: case DASM_STOP: goto stop; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #define dasmb(x) *cp++ = (unsigned char)(x) #ifndef DASM_ALIGNED_WRITES #define dasmw(x) \ do { *((unsigned short *)cp) = (unsigned short)(x); cp+=2; } while (0) #define dasmd(x) \ do { *((unsigned int *)cp) = (unsigned int)(x); cp+=4; } while (0) #else #define dasmw(x) do { dasmb(x); dasmb((x)>>8); } while (0) #define dasmd(x) do { dasmw(x); dasmw((x)>>16); } while (0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; unsigned char *base = (unsigned char *)buffer; unsigned char *cp = base; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; unsigned char *mark = NULL; while (1) { int action = *p++; int n = (action >= DASM_DISP && action <= DASM_ALIGN) ? *b++ : 0; switch (action) { case DASM_DISP: if (!mark) mark = cp; { unsigned char *mm = mark; if (*p != DASM_IMM_DB && *p != DASM_IMM_WB) mark = NULL; if (n == 0) { int mrm = mm[-1]&7; if (mrm == 4) mrm = mm[0]&7; if (mrm != 5) { mm[-1] -= 0x80; break; } } if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40; } case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break; case DASM_IMM_DB: if (((n+128)&-256) == 0) { db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb; } else mark = NULL; case DASM_IMM_D: wd: dasmd(n); break; case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL; case DASM_IMM_W: dasmw(n); break; case DASM_VREG: { int t = *p++; if (t >= 2) n<<=3; cp[-1] |= n; break; } case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; b++; n = (int)(ptrdiff_t)D->globals[-n]; case DASM_REL_A: rel_a: n -= (int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */ case DASM_REL_PC: rel_pc: { int shrink = *b++; int *pb = DASM_POS2PTR(D, n); if (*pb < 0) { n = pb[1]; goto rel_a; } n = *pb - ((int)(cp-base) + 4-shrink); if (shrink == 0) goto wd; if (shrink == 4) { cp--; cp[-1] = *cp-0x10; } else cp[-1] = 0xeb; goto wb; } case DASM_IMM_LG: p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; } case DASM_IMM_PC: { int *pb = DASM_POS2PTR(D, n); n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base); goto wd; } case DASM_LABEL_LG: { int idx = *p++; if (idx >= 10) D->globals[idx] = (void *)(base + (*p == DASM_SETLABEL ? *b : n)); break; } case DASM_LABEL_PC: case DASM_SETLABEL: break; case DASM_SPACE: { int fill = *p++; while (n--) *cp++ = fill; break; } case DASM_ALIGN: n = *p++; while (((cp-base) & n)) *cp++ = 0x90; /* nop */ break; case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd; case DASM_MARK: mark = cp; break; case DASM_ESC: action = *p++; default: *cp++ = action; break; case DASM_SECTION: case DASM_STOP: goto stop; } } stop: (void)0; } } if (base + D->codesize != cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_L|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(int)(D->section-D->sections); return D->status; } #endif MoarVM-2015.11/3rdparty/dynasm/dasm_x86.lua0000644000175000017500000016273212456307242017267 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM x86/x64 module. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ local x64 = x64 -- Module information: local _info = { arch = x64 and "x64" or "x86", description = "DynASM x86/x64 module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, unpack, setmetatable = assert, unpack or table.unpack, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local find, match, gmatch, gsub = _s.find, _s.match, _s.gmatch, _s.gsub local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, shr = bit.band, bit.lshift, bit.rshift -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { -- int arg, 1 buffer pos: "DISP", "IMM_S", "IMM_B", "IMM_W", "IMM_D", "IMM_WB", "IMM_DB", -- action arg (1 byte), int arg, 1 buffer pos (reg/num): "VREG", "SPACE", -- !x64: VREG support NYI. -- ptrdiff_t arg, 1 buffer pos (address): !x64 "SETLABEL", "REL_A", -- action arg (1 byte) or int arg, 2 buffer pos (link, offset): "REL_LG", "REL_PC", -- action arg (1 byte) or int arg, 1 buffer pos (link): "IMM_LG", "IMM_PC", -- action arg (1 byte) or int arg, 1 buffer pos (offset): "LABEL_LG", "LABEL_PC", -- action arg (1 byte), 1 buffer pos (offset): "ALIGN", -- action args (2 bytes), no buffer pos. "EXTERN", -- action arg (1 byte), no buffer pos. "ESC", -- no action arg, no buffer pos. "MARK", -- action arg (1 byte), no buffer pos, terminal action: "SECTION", -- no args, no buffer pos, terminal action: "STOP" } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number (dynamically generated below). local map_action = {} -- First action number. Everything below does not need to be escaped. local actfirst = 256-#action_names -- Action list buffer and string (only used to remove dupes). local actlist = {} local actstr = "" -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Compute action numbers for action names. for n,name in ipairs(action_names) do local num = actfirst + n - 1 map_action[name] = num end -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist local last = actlist[nn] or 255 actlist[nn] = nil -- Remove last byte. if nn == 0 then nn = 1 end out:write("static const unsigned char ", name, "[", nn, "] = {\n") local s = " " for n,b in ipairs(actlist) do s = s..b.."," if #s >= 75 then assert(out:write(s, "\n")) s = " " end end out:write(s, last, "\n};\n\n") -- Add last byte back. end ------------------------------------------------------------------------------ -- Add byte to action list. local function wputxb(n) assert(n >= 0 and n <= 255 and n % 1 == 0, "byte out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, a, num) wputxb(assert(map_action[action], "bad action name `"..action.."'")) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Add call to embedded DynASM C code. local function wcall(func, args) wline(format("dasm_%s(Dst, %s);", func, concat(args, ", ")), true) end -- Delete duplicate action list chunks. A tad slow, but so what. local function dedupechunk(offset) local al, as = actlist, actstr local chunk = char(unpack(al, offset+1, #al)) local orig = find(as, chunk, 1, true) if orig then actargs[1] = orig-1 -- Replace with original offset. for i=offset+1,#al do al[i] = nil end -- Kill dupe. else actstr = as..chunk end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) local offset = actargs[1] if #actlist == offset then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. dedupechunk(offset) wcall("put", actargs) -- Add call to dasm_put(). actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped byte. local function wputb(n) if n >= actfirst then waction("ESC") end -- Need to escape byte. wputxb(n) end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 10 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_@]*$") then werror("bad global label") end local n = next_global if n > 246 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=10,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=10,next_global-1 do out:write(" ", prefix, gsub(t[i], "@.*", ""), ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=10,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = -1 local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n < -256 then werror("too many extern labels") end next_extern = n - 1 t[name] = n return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) local t = {} for name, n in pairs(map_extern) do t[-n] = name end out:write("Extern labels:\n") for i=1,-next_extern-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) local t = {} for name, n in pairs(map_extern) do t[-n] = name end out:write("static const char *const ", name, "[] = {\n") for i=1,-next_extern-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = {} -- Ext. register name -> int. name. local map_reg_rev = {} -- Int. register name -> ext. name. local map_reg_num = {} -- Int. register name -> register number. local map_reg_opsize = {} -- Int. register name -> operand size. local map_reg_valid_base = {} -- Int. register name -> valid base register? local map_reg_valid_index = {} -- Int. register name -> valid index register? local map_reg_needrex = {} -- Int. register name -> need rex vs. no rex. local reg_list = {} -- Canonical list of int. register names. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for _PTx macros). local addrsize = x64 and "q" or "d" -- Size for address operands. -- Helper functions to fill register maps. local function mkrmap(sz, cl, names) local cname = format("@%s", sz) reg_list[#reg_list+1] = cname map_archdef[cl] = cname map_reg_rev[cname] = cl map_reg_num[cname] = -1 map_reg_opsize[cname] = sz if sz == addrsize or sz == "d" then map_reg_valid_base[cname] = true map_reg_valid_index[cname] = true end if names then for n,name in ipairs(names) do local iname = format("@%s%x", sz, n-1) reg_list[#reg_list+1] = iname map_archdef[name] = iname map_reg_rev[iname] = name map_reg_num[iname] = n-1 map_reg_opsize[iname] = sz if sz == "b" and n > 4 then map_reg_needrex[iname] = false end if sz == addrsize or sz == "d" then map_reg_valid_base[iname] = true map_reg_valid_index[iname] = true end end end for i=0,(x64 and sz ~= "f") and 15 or 7 do local needrex = sz == "b" and i > 3 local iname = format("@%s%x%s", sz, i, needrex and "R" or "") if needrex then map_reg_needrex[iname] = true end local name if sz == "o" then name = format("xmm%d", i) elseif sz == "f" then name = format("st%d", i) else name = format("r%d%s", i, sz == addrsize and "" or sz) end map_archdef[name] = iname if not map_reg_rev[iname] then reg_list[#reg_list+1] = iname map_reg_rev[iname] = name map_reg_num[iname] = i map_reg_opsize[iname] = sz if sz == addrsize or sz == "d" then map_reg_valid_base[iname] = true map_reg_valid_index[iname] = true end end end reg_list[#reg_list+1] = "" end -- Integer registers (qword, dword, word and byte sized). if x64 then mkrmap("q", "Rq", {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"}) end mkrmap("d", "Rd", {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"}) mkrmap("w", "Rw", {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di"}) mkrmap("b", "Rb", {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"}) map_reg_valid_index[map_archdef.esp] = false if x64 then map_reg_valid_index[map_archdef.rsp] = false end map_archdef["Ra"] = "@"..addrsize -- FP registers (internally tword sized, but use "f" as operand size). mkrmap("f", "Rf") -- SSE registers (oword sized, but qword and dword accessible). mkrmap("o", "xmm") -- Operand size prefixes to codes. local map_opsize = { byte = "b", word = "w", dword = "d", qword = "q", oword = "o", tword = "t", aword = addrsize, } -- Operand size code to number. local map_opsizenum = { b = 1, w = 2, d = 4, q = 8, o = 16, t = 10, } -- Operand size code to name. local map_opsizename = { b = "byte", w = "word", d = "dword", q = "qword", o = "oword", t = "tword", f = "fpword", } -- Valid index register scale factors. local map_xsc = { ["1"] = 0, ["2"] = 1, ["4"] = 2, ["8"] = 3, } -- Condition codes. local map_cc = { o = 0, no = 1, b = 2, nb = 3, e = 4, ne = 5, be = 6, nbe = 7, s = 8, ns = 9, p = 10, np = 11, l = 12, nl = 13, le = 14, nle = 15, c = 2, nae = 2, nc = 3, ae = 3, z = 4, nz = 5, na = 6, a = 7, pe = 10, po = 11, nge = 12, ge = 13, ng = 14, g = 15, } -- Reverse defines for registers. function _M.revdef(s) return gsub(s, "@%w+", map_reg_rev) end -- Dump register names and numbers local function dumpregs(out) out:write("Register names, sizes and internal numbers:\n") for _,reg in ipairs(reg_list) do if reg == "" then out:write("\n") else local name = map_reg_rev[reg] local num = map_reg_num[reg] local opsize = map_opsizename[map_reg_opsize[reg]] out:write(format(" %-5s %-8s %s\n", name, opsize, num < 0 and "(variable)" or num)) end end end ------------------------------------------------------------------------------ -- Put action for label arg (IMM_LG, IMM_PC, REL_LG, REL_PC). local function wputlabel(aprefix, imm, num) if type(imm) == "number" then if imm < 0 then waction("EXTERN") wputxb(aprefix == "IMM_" and 0 or 1) imm = -imm-1 else waction(aprefix.."LG", nil, num); end wputxb(imm) else waction(aprefix.."PC", imm, num) end end -- Put signed byte or arg. local function wputsbarg(n) if type(n) == "number" then if n < -128 or n > 127 then werror("signed immediate byte out of range") end if n < 0 then n = n + 256 end wputb(n) else waction("IMM_S", n) end end -- Put unsigned byte or arg. local function wputbarg(n) if type(n) == "number" then if n < 0 or n > 255 then werror("unsigned immediate byte out of range") end wputb(n) else waction("IMM_B", n) end end -- Put unsigned word or arg. local function wputwarg(n) if type(n) == "number" then if shr(n, 16) ~= 0 then werror("unsigned immediate word out of range") end wputb(band(n, 255)); wputb(shr(n, 8)); else waction("IMM_W", n) end end -- Put signed or unsigned dword or arg. local function wputdarg(n) local tn = type(n) if tn == "number" then wputb(band(n, 255)) wputb(band(shr(n, 8), 255)) wputb(band(shr(n, 16), 255)) wputb(shr(n, 24)) elseif tn == "table" then wputlabel("IMM_", n[1], 1) else waction("IMM_D", n) end end -- Put operand-size dependent number or arg (defaults to dword). local function wputszarg(sz, n) if not sz or sz == "d" or sz == "q" then wputdarg(n) elseif sz == "w" then wputwarg(n) elseif sz == "b" then wputbarg(n) elseif sz == "s" then wputsbarg(n) else werror("bad operand size") end end -- Put multi-byte opcode with operand-size dependent modifications. local function wputop(sz, op, rex) local r if rex ~= 0 and not x64 then werror("bad operand size") end if sz == "w" then wputb(102) end -- Needs >32 bit numbers, but only for crc32 eax, word [ebx] if op >= 4294967296 then r = op%4294967296 wputb((op-r)/4294967296) op = r end if op >= 16777216 then wputb(shr(op, 24)); op = band(op, 0xffffff) end if op >= 65536 then if rex ~= 0 then local opc3 = band(op, 0xffff00) if opc3 == 0x0f3a00 or opc3 == 0x0f3800 then wputb(64 + band(rex, 15)); rex = 0 end end wputb(shr(op, 16)); op = band(op, 0xffff) end if op >= 256 then local b = shr(op, 8) if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0 end wputb(b) op = band(op, 255) end if rex ~= 0 then wputb(64 + band(rex, 15)) end if sz == "b" then op = op - 1 end wputb(op) end -- Put ModRM or SIB formatted byte. local function wputmodrm(m, s, rm, vs, vrm) assert(m < 4 and s < 16 and rm < 16, "bad modrm operands") wputb(shl(m, 6) + shl(band(s, 7), 3) + band(rm, 7)) end -- Put ModRM/SIB plus optional displacement. local function wputmrmsib(t, imark, s, vsreg) local vreg, vxreg local reg, xreg = t.reg, t.xreg if reg and reg < 0 then reg = 0; vreg = t.vreg end if xreg and xreg < 0 then xreg = 0; vxreg = t.vxreg end if s < 0 then s = 0 end -- Register mode. if sub(t.mode, 1, 1) == "r" then wputmodrm(3, s, reg) if vsreg then waction("VREG", vsreg); wputxb(2) end if vreg then waction("VREG", vreg); wputxb(0) end return end local disp = t.disp local tdisp = type(disp) -- No base register? if not reg then local riprel = false if xreg then -- Indexed mode with index register only. -- [xreg*xsc+disp] -> (0, s, esp) (xsc, xreg, ebp) wputmodrm(0, s, 4) if imark == "I" then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(2) end wputmodrm(t.xsc, xreg, 5) if vxreg then waction("VREG", vxreg); wputxb(3) end else -- Pure 32 bit displacement. if x64 and tdisp ~= "table" then wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp) if imark == "I" then waction("MARK") end wputmodrm(0, 4, 5) else riprel = x64 wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp) if imark == "I" then waction("MARK") end end if vsreg then waction("VREG", vsreg); wputxb(2) end end if riprel then -- Emit rip-relative displacement. if match("UWSiI", imark) then werror("NYI: rip-relative displacement followed by immediate") end -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f. wputlabel("REL_", disp[1], 2) else wputdarg(disp) end return end local m if tdisp == "number" then -- Check displacement size at assembly time. if disp == 0 and band(reg, 7) ~= 5 then -- [ebp] -> [ebp+0] (in SIB, too) if not vreg then m = 0 end -- Force DISP to allow [Rd(5)] -> [ebp+0] elseif disp >= -128 and disp <= 127 then m = 1 else m = 2 end elseif tdisp == "table" then m = 2 end -- Index register present or esp as base register: need SIB encoding. if xreg or band(reg, 7) == 4 then wputmodrm(m or 2, s, 4) -- ModRM. if m == nil or imark == "I" then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(2) end wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB. if vxreg then waction("VREG", vxreg); wputxb(3) end if vreg then waction("VREG", vreg); wputxb(1) end else wputmodrm(m or 2, s, reg) -- ModRM. if (imark == "I" and (m == 1 or m == 2)) or (m == nil and (vsreg or vreg)) then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(2) end if vreg then waction("VREG", vreg); wputxb(1) end end -- Put displacement. if m == 1 then wputsbarg(disp) elseif m == 2 then wputdarg(disp) elseif m == nil then waction("DISP", disp) end end ------------------------------------------------------------------------------ -- Return human-readable operand mode string. local function opmodestr(op, args) local m = {} for i=1,#args do local a = args[i] m[#m+1] = sub(a.mode, 1, 1)..(a.opsize or "?") end return op.." "..concat(m, ",") end -- Convert number to valid integer or nil. local function toint(expr) local n = tonumber(expr) if n then if n % 1 ~= 0 or n < -2147483648 or n > 4294967295 then werror("bad integer number `"..expr.."'") end return n end end -- Parse immediate expression. local function immexpr(expr) -- &expr (pointer) if sub(expr, 1, 1) == "&" then return "iPJ", format("(ptrdiff_t)(%s)", sub(expr,2)) end local prefix = sub(expr, 1, 2) -- =>expr (pc label reference) if prefix == "=>" then return "iJ", sub(expr, 3) end -- ->name (global label reference) if prefix == "->" then return "iJ", map_global[sub(expr, 3)] end -- [<>][1-9] (local label reference) local dir, lnum = match(expr, "^([<>])([1-9])$") if dir then -- Fwd: 247-255, Bkwd: 1-9. return "iJ", lnum + (dir == ">" and 246 or 0) end local extname = match(expr, "^extern%s+(%S+)$") if extname then return "iJ", map_extern[extname] end -- expr (interpreted as immediate) return "iI", expr end -- Parse displacement expression: +-num, +-expr, +-opsize*num local function dispexpr(expr) local disp = expr == "" and 0 or toint(expr) if disp then return disp end local c, dispt = match(expr, "^([+-])%s*(.+)$") if c == "+" then expr = dispt elseif not c then werror("bad displacement expression `"..expr.."'") end local opsize, tailops = match(dispt, "^(%w+)%s*%*%s*(.+)$") local ops, imm = map_opsize[opsize], toint(tailops) if ops and imm then if c == "-" then imm = -imm end return imm*map_opsizenum[ops] end local mode, iexpr = immexpr(dispt) if mode == "iJ" then if c == "-" then werror("cannot invert label reference") end return { iexpr } end return expr -- Need to return original signed expression. end -- Parse register or type expression. local function rtexpr(expr) if not expr then return end local tname, ovreg = match(expr, "^([%w_]+):(@[%w_]+)$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg local rnum = map_reg_num[reg] if not rnum then werror("type `"..(tname or expr).."' needs a register override") end if not map_reg_valid_base[reg] then werror("bad base register override `"..(map_reg_rev[reg] or reg).."'") end return reg, rnum, tp end return expr, map_reg_num[expr] end -- Parse operand and return { mode, opsize, reg, xreg, xsc, disp, imm }. local function parseoperand(param) local t = {} local expr = param local opsize, tailops = match(param, "^(%w+)%s*(.+)$") if opsize then t.opsize = map_opsize[opsize] if t.opsize then expr = tailops end end local br = match(expr, "^%[%s*(.-)%s*%]$") repeat if br then t.mode = "xm" -- [disp] t.disp = toint(br) if t.disp then t.mode = x64 and "xm" or "xmO" break end -- [reg...] local tp local reg, tailr = match(br, "^([@%w_:]+)%s*(.*)$") reg, t.reg, tp = rtexpr(reg) if not t.reg then -- [expr] t.mode = x64 and "xm" or "xmO" t.disp = dispexpr("+"..br) break end if t.reg == -1 then t.vreg, tailr = match(tailr, "^(%b())(.*)$") if not t.vreg then werror("bad variable register expression") end end -- [xreg*xsc] or [xreg*xsc+-disp] or [xreg*xsc+-expr] local xsc, tailsc = match(tailr, "^%*%s*([1248])%s*(.*)$") if xsc then if not map_reg_valid_index[reg] then werror("bad index register `"..map_reg_rev[reg].."'") end t.xsc = map_xsc[xsc] t.xreg = t.reg t.vxreg = t.vreg t.reg = nil t.vreg = nil t.disp = dispexpr(tailsc) break end if not map_reg_valid_base[reg] then werror("bad base register `"..map_reg_rev[reg].."'") end -- [reg] or [reg+-disp] t.disp = toint(tailr) or (tailr == "" and 0) if t.disp then break end -- [reg+xreg...] local xreg, tailx = match(tailr, "^+%s*([@%w_:]+)%s*(.*)$") xreg, t.xreg, tp = rtexpr(xreg) if not t.xreg then -- [reg+-expr] t.disp = dispexpr(tailr) break end if not map_reg_valid_index[xreg] then werror("bad index register `"..map_reg_rev[xreg].."'") end if t.xreg == -1 then t.vxreg, tailx = match(tailx, "^(%b())(.*)$") if not t.vxreg then werror("bad variable register expression") end end -- [reg+xreg*xsc...] local xsc, tailsc = match(tailx, "^%*%s*([1248])%s*(.*)$") if xsc then t.xsc = map_xsc[xsc] tailx = tailsc end -- [...] or [...+-disp] or [...+-expr] t.disp = dispexpr(tailx) else -- imm or opsize*imm local imm = toint(expr) if not imm and sub(expr, 1, 1) == "*" and t.opsize then imm = toint(sub(expr, 2)) if imm then imm = imm * map_opsizenum[t.opsize] t.opsize = nil end end if imm then if t.opsize then werror("bad operand size override") end local m = "i" if imm == 1 then m = m.."1" end if imm >= 4294967168 and imm <= 4294967295 then imm = imm-4294967296 end if imm >= -128 and imm <= 127 then m = m.."S" end t.imm = imm t.mode = m break end local tp local reg, tailr = match(expr, "^([@%w_:]+)%s*(.*)$") reg, t.reg, tp = rtexpr(reg) if t.reg then if t.reg == -1 then t.vreg, tailr = match(tailr, "^(%b())(.*)$") if not t.vreg then werror("bad variable register expression") end end -- reg if tailr == "" then if t.opsize then werror("bad operand size override") end t.opsize = map_reg_opsize[reg] if t.opsize == "f" then t.mode = t.reg == 0 and "fF" or "f" else if reg == "@w4" or (x64 and reg == "@d4") then wwarn("bad idea, try again with `"..(x64 and "rsp'" or "esp'")) end t.mode = t.reg == 0 and "rmR" or (reg == "@b1" and "rmC" or "rm") end t.needrex = map_reg_needrex[reg] break end -- type[idx], type[idx].field, type->field -> [reg+offset_expr] if not tp then werror("bad operand `"..param.."'") end t.mode = "xm" t.disp = format(tp.ctypefmt, tailr) else t.mode, t.imm = immexpr(expr) if sub(t.mode, -1) == "J" then if t.opsize and t.opsize ~= addrsize then werror("bad operand size override") end t.opsize = addrsize end end end until true return t end ------------------------------------------------------------------------------ -- x86 Template String Description -- =============================== -- -- Each template string is a list of [match:]pattern pairs, -- separated by "|". The first match wins. No match means a -- bad or unsupported combination of operand modes or sizes. -- -- The match part and the ":" is omitted if the operation has -- no operands. Otherwise the first N characters are matched -- against the mode strings of each of the N operands. -- -- The mode string for each operand type is (see parseoperand()): -- Integer register: "rm", +"R" for eax, ax, al, +"C" for cl -- FP register: "f", +"F" for st0 -- Index operand: "xm", +"O" for [disp] (pure offset) -- Immediate: "i", +"S" for signed 8 bit, +"1" for 1, -- +"I" for arg, +"P" for pointer -- Any: +"J" for valid jump targets -- -- So a match character "m" (mixed) matches both an integer register -- and an index operand (to be encoded with the ModRM/SIB scheme). -- But "r" matches only a register and "x" only an index operand -- (e.g. for FP memory access operations). -- -- The operand size match string starts right after the mode match -- characters and ends before the ":". "dwb" or "qdwb" is assumed, if empty. -- The effective data size of the operation is matched against this list. -- -- If only the regular "b", "w", "d", "q", "t" operand sizes are -- present, then all operands must be the same size. Unspecified sizes -- are ignored, but at least one operand must have a size or the pattern -- won't match (use the "byte", "word", "dword", "qword", "tword" -- operand size overrides. E.g.: mov dword [eax], 1). -- -- If the list has a "1" or "2" prefix, the operand size is taken -- from the respective operand and any other operand sizes are ignored. -- If the list contains only ".", all operand sizes are ignored. -- If the list has a "/" prefix, the concatenated (mixed) operand sizes -- are compared to the match. -- -- E.g. "rrdw" matches for either two dword registers or two word -- registers. "Fx2dq" matches an st0 operand plus an index operand -- pointing to a dword (float) or qword (double). -- -- Every character after the ":" is part of the pattern string: -- Hex chars are accumulated to form the opcode (left to right). -- "n" disables the standard opcode mods -- (otherwise: -1 for "b", o16 prefix for "w", rex.w for "q") -- "X" Force REX.W. -- "r"/"R" adds the reg. number from the 1st/2nd operand to the opcode. -- "m"/"M" generates ModRM/SIB from the 1st/2nd operand. -- The spare 3 bits are either filled with the last hex digit or -- the result from a previous "r"/"R". The opcode is restored. -- -- All of the following characters force a flush of the opcode: -- "o"/"O" stores a pure 32 bit disp (offset) from the 1st/2nd operand. -- "S" stores a signed 8 bit immediate from the last operand. -- "U" stores an unsigned 8 bit immediate from the last operand. -- "W" stores an unsigned 16 bit immediate from the last operand. -- "i" stores an operand sized immediate from the last operand. -- "I" dito, but generates an action code to optionally modify -- the opcode (+2) for a signed 8 bit immediate. -- "J" generates one of the REL action codes from the last operand. -- ------------------------------------------------------------------------------ -- Template strings for x86 instructions. Ordered by first opcode byte. -- Unimplemented opcodes (deliberate omissions) are marked with *. local map_op = { -- 00-05: add... -- 06: *push es -- 07: *pop es -- 08-0D: or... -- 0E: *push cs -- 0F: two byte opcode prefix -- 10-15: adc... -- 16: *push ss -- 17: *pop ss -- 18-1D: sbb... -- 1E: *push ds -- 1F: *pop ds -- 20-25: and... es_0 = "26", -- 27: *daa -- 28-2D: sub... cs_0 = "2E", -- 2F: *das -- 30-35: xor... ss_0 = "36", -- 37: *aaa -- 38-3D: cmp... ds_0 = "3E", -- 3F: *aas inc_1 = x64 and "m:FF0m" or "rdw:40r|m:FF0m", dec_1 = x64 and "m:FF1m" or "rdw:48r|m:FF1m", push_1 = (x64 and "rq:n50r|rw:50r|mq:nFF6m|mw:FF6m" or "rdw:50r|mdw:FF6m").."|S.:6AS|ib:n6Ai|i.:68i", pop_1 = x64 and "rq:n58r|rw:58r|mq:n8F0m|mw:8F0m" or "rdw:58r|mdw:8F0m", -- 60: *pusha, *pushad, *pushaw -- 61: *popa, *popad, *popaw -- 62: *bound rdw,x -- 63: x86: *arpl mw,rw movsxd_2 = x64 and "rm/qd:63rM", fs_0 = "64", gs_0 = "65", o16_0 = "66", a16_0 = not x64 and "67" or nil, a32_0 = x64 and "67", -- 68: push idw -- 69: imul rdw,mdw,idw -- 6A: push ib -- 6B: imul rdw,mdw,S -- 6C: *insb -- 6D: *insd, *insw -- 6E: *outsb -- 6F: *outsd, *outsw -- 70-7F: jcc lb -- 80: add... mb,i -- 81: add... mdw,i -- 82: *undefined -- 83: add... mdw,S test_2 = "mr:85Rm|rm:85rM|Ri:A9ri|mi:F70mi", -- 86: xchg rb,mb -- 87: xchg rdw,mdw -- 88: mov mb,r -- 89: mov mdw,r -- 8A: mov r,mb -- 8B: mov r,mdw -- 8C: *mov mdw,seg lea_2 = "rx1dq:8DrM", -- 8E: *mov seg,mdw -- 8F: pop mdw nop_0 = "90", xchg_2 = "Rrqdw:90R|rRqdw:90r|rm:87rM|mr:87Rm", cbw_0 = "6698", cwde_0 = "98", cdqe_0 = "4898", cwd_0 = "6699", cdq_0 = "99", cqo_0 = "4899", -- 9A: *call iw:idw wait_0 = "9B", fwait_0 = "9B", pushf_0 = "9C", pushfd_0 = not x64 and "9C", pushfq_0 = x64 and "9C", popf_0 = "9D", popfd_0 = not x64 and "9D", popfq_0 = x64 and "9D", sahf_0 = "9E", lahf_0 = "9F", mov_2 = "OR:A3o|RO:A1O|mr:89Rm|rm:8BrM|rib:nB0ri|ridw:B8ri|mi:C70mi", movsb_0 = "A4", movsw_0 = "66A5", movsd_0 = "A5", cmpsb_0 = "A6", cmpsw_0 = "66A7", cmpsd_0 = "A7", -- A8: test Rb,i -- A9: test Rdw,i stosb_0 = "AA", stosw_0 = "66AB", stosd_0 = "AB", lodsb_0 = "AC", lodsw_0 = "66AD", lodsd_0 = "AD", scasb_0 = "AE", scasw_0 = "66AF", scasd_0 = "AF", -- B0-B7: mov rb,i -- B8-BF: mov rdw,i -- C0: rol... mb,i -- C1: rol... mdw,i ret_1 = "i.:nC2W", ret_0 = "C3", -- C4: *les rdw,mq -- C5: *lds rdw,mq -- C6: mov mb,i -- C7: mov mdw,i -- C8: *enter iw,ib leave_0 = "C9", -- CA: *retf iw -- CB: *retf int3_0 = "CC", int_1 = "i.:nCDU", into_0 = "CE", -- CF: *iret -- D0: rol... mb,1 -- D1: rol... mdw,1 -- D2: rol... mb,cl -- D3: rol... mb,cl -- D4: *aam ib -- D5: *aad ib -- D6: *salc -- D7: *xlat -- D8-DF: floating point ops -- E0: *loopne -- E1: *loope -- E2: *loop -- E3: *jcxz, *jecxz -- E4: *in Rb,ib -- E5: *in Rdw,ib -- E6: *out ib,Rb -- E7: *out ib,Rdw call_1 = x64 and "mq:nFF2m|J.:E8nJ" or "md:FF2m|J.:E8J", jmp_1 = x64 and "mq:nFF4m|J.:E9nJ" or "md:FF4m|J.:E9J", -- short: EB -- EA: *jmp iw:idw -- EB: jmp ib -- EC: *in Rb,dx -- ED: *in Rdw,dx -- EE: *out dx,Rb -- EF: *out dx,Rdw lock_0 = "F0", int1_0 = "F1", repne_0 = "F2", repnz_0 = "F2", rep_0 = "F3", repe_0 = "F3", repz_0 = "F3", -- F4: *hlt cmc_0 = "F5", -- F6: test... mb,i; div... mb -- F7: test... mdw,i; div... mdw clc_0 = "F8", stc_0 = "F9", -- FA: *cli cld_0 = "FC", std_0 = "FD", -- FE: inc... mb -- FF: inc... mdw -- misc ops not_1 = "m:F72m", neg_1 = "m:F73m", mul_1 = "m:F74m", imul_1 = "m:F75m", div_1 = "m:F76m", idiv_1 = "m:F77m", imul_2 = "rmqdw:0FAFrM|rIqdw:69rmI|rSqdw:6BrmS|riqdw:69rmi", imul_3 = "rmIqdw:69rMI|rmSqdw:6BrMS|rmiqdw:69rMi", movzx_2 = "rm/db:0FB6rM|rm/qb:|rm/wb:0FB6rM|rm/dw:0FB7rM|rm/qw:", movsx_2 = "rm/db:0FBErM|rm/qb:|rm/wb:0FBErM|rm/dw:0FBFrM|rm/qw:", bswap_1 = "rqd:0FC8r", bsf_2 = "rmqdw:0FBCrM", bsr_2 = "rmqdw:0FBDrM", bt_2 = "mrqdw:0FA3Rm|miqdw:0FBA4mU", btc_2 = "mrqdw:0FBBRm|miqdw:0FBA7mU", btr_2 = "mrqdw:0FB3Rm|miqdw:0FBA6mU", bts_2 = "mrqdw:0FABRm|miqdw:0FBA5mU", shld_3 = "mriqdw:0FA4RmU|mrCqdw:0FA5Rm", shrd_3 = "mriqdw:0FACRmU|mrCqdw:0FADRm", rdtsc_0 = "0F31", -- P1+ cpuid_0 = "0FA2", -- P1+ -- floating point ops fst_1 = "ff:DDD0r|xd:D92m|xq:nDD2m", fstp_1 = "ff:DDD8r|xd:D93m|xq:nDD3m|xt:DB7m", fld_1 = "ff:D9C0r|xd:D90m|xq:nDD0m|xt:DB5m", fpop_0 = "DDD8", -- Alias for fstp st0. fist_1 = "xw:nDF2m|xd:DB2m", fistp_1 = "xw:nDF3m|xd:DB3m|xq:nDF7m", fild_1 = "xw:nDF0m|xd:DB0m|xq:nDF5m", fxch_0 = "D9C9", fxch_1 = "ff:D9C8r", fxch_2 = "fFf:D9C8r|Fff:D9C8R", fucom_1 = "ff:DDE0r", fucom_2 = "Fff:DDE0R", fucomp_1 = "ff:DDE8r", fucomp_2 = "Fff:DDE8R", fucomi_1 = "ff:DBE8r", -- P6+ fucomi_2 = "Fff:DBE8R", -- P6+ fucomip_1 = "ff:DFE8r", -- P6+ fucomip_2 = "Fff:DFE8R", -- P6+ fcomi_1 = "ff:DBF0r", -- P6+ fcomi_2 = "Fff:DBF0R", -- P6+ fcomip_1 = "ff:DFF0r", -- P6+ fcomip_2 = "Fff:DFF0R", -- P6+ fucompp_0 = "DAE9", fcompp_0 = "DED9", fldcw_1 = "xw:nD95m", fstcw_1 = "xw:n9BD97m", fnstcw_1 = "xw:nD97m", fstsw_1 = "Rw:n9BDFE0|xw:n9BDD7m", fnstsw_1 = "Rw:nDFE0|xw:nDD7m", fclex_0 = "9BDBE2", fnclex_0 = "DBE2", fnop_0 = "D9D0", -- D9D1-D9DF: unassigned fchs_0 = "D9E0", fabs_0 = "D9E1", -- D9E2: unassigned -- D9E3: unassigned ftst_0 = "D9E4", fxam_0 = "D9E5", -- D9E6: unassigned -- D9E7: unassigned fld1_0 = "D9E8", fldl2t_0 = "D9E9", fldl2e_0 = "D9EA", fldpi_0 = "D9EB", fldlg2_0 = "D9EC", fldln2_0 = "D9ED", fldz_0 = "D9EE", -- D9EF: unassigned f2xm1_0 = "D9F0", fyl2x_0 = "D9F1", fptan_0 = "D9F2", fpatan_0 = "D9F3", fxtract_0 = "D9F4", fprem1_0 = "D9F5", fdecstp_0 = "D9F6", fincstp_0 = "D9F7", fprem_0 = "D9F8", fyl2xp1_0 = "D9F9", fsqrt_0 = "D9FA", fsincos_0 = "D9FB", frndint_0 = "D9FC", fscale_0 = "D9FD", fsin_0 = "D9FE", fcos_0 = "D9FF", -- SSE, SSE2 andnpd_2 = "rmo:660F55rM", andnps_2 = "rmo:0F55rM", andpd_2 = "rmo:660F54rM", andps_2 = "rmo:0F54rM", clflush_1 = "x.:0FAE7m", cmppd_3 = "rmio:660FC2rMU", cmpps_3 = "rmio:0FC2rMU", cmpsd_3 = "rrio:F20FC2rMU|rxi/oq:", cmpss_3 = "rrio:F30FC2rMU|rxi/od:", comisd_2 = "rro:660F2FrM|rx/oq:", comiss_2 = "rro:0F2FrM|rx/od:", cvtdq2pd_2 = "rro:F30FE6rM|rx/oq:", cvtdq2ps_2 = "rmo:0F5BrM", cvtpd2dq_2 = "rmo:F20FE6rM", cvtpd2ps_2 = "rmo:660F5ArM", cvtpi2pd_2 = "rx/oq:660F2ArM", cvtpi2ps_2 = "rx/oq:0F2ArM", cvtps2dq_2 = "rmo:660F5BrM", cvtps2pd_2 = "rro:0F5ArM|rx/oq:", cvtsd2si_2 = "rr/do:F20F2DrM|rr/qo:|rx/dq:|rxq:", cvtsd2ss_2 = "rro:F20F5ArM|rx/oq:", cvtsi2sd_2 = "rm/od:F20F2ArM|rm/oq:F20F2ArXM", cvtsi2ss_2 = "rm/od:F30F2ArM|rm/oq:F30F2ArXM", cvtss2sd_2 = "rro:F30F5ArM|rx/od:", cvtss2si_2 = "rr/do:F20F2CrM|rr/qo:|rxd:|rx/qd:", cvttpd2dq_2 = "rmo:660FE6rM", cvttps2dq_2 = "rmo:F30F5BrM", cvttsd2si_2 = "rr/do:F20F2CrM|rr/qo:|rx/dq:|rxq:", cvttss2si_2 = "rr/do:F30F2CrM|rr/qo:|rxd:|rx/qd:", ldmxcsr_1 = "xd:0FAE2m", lfence_0 = "0FAEE8", maskmovdqu_2 = "rro:660FF7rM", mfence_0 = "0FAEF0", movapd_2 = "rmo:660F28rM|mro:660F29Rm", movaps_2 = "rmo:0F28rM|mro:0F29Rm", movd_2 = "rm/od:660F6ErM|rm/oq:660F6ErXM|mr/do:660F7ERm|mr/qo:", movdqa_2 = "rmo:660F6FrM|mro:660F7FRm", movdqu_2 = "rmo:F30F6FrM|mro:F30F7FRm", movhlps_2 = "rro:0F12rM", movhpd_2 = "rx/oq:660F16rM|xr/qo:n660F17Rm", movhps_2 = "rx/oq:0F16rM|xr/qo:n0F17Rm", movlhps_2 = "rro:0F16rM", movlpd_2 = "rx/oq:660F12rM|xr/qo:n660F13Rm", movlps_2 = "rx/oq:0F12rM|xr/qo:n0F13Rm", movmskpd_2 = "rr/do:660F50rM", movmskps_2 = "rr/do:0F50rM", movntdq_2 = "xro:660FE7Rm", movnti_2 = "xrqd:0FC3Rm", movntpd_2 = "xro:660F2BRm", movntps_2 = "xro:0F2BRm", movq_2 = "rro:F30F7ErM|rx/oq:|xr/qo:n660FD6Rm", movsd_2 = "rro:F20F10rM|rx/oq:|xr/qo:nF20F11Rm", movss_2 = "rro:F30F10rM|rx/od:|xr/do:F30F11Rm", movupd_2 = "rmo:660F10rM|mro:660F11Rm", movups_2 = "rmo:0F10rM|mro:0F11Rm", orpd_2 = "rmo:660F56rM", orps_2 = "rmo:0F56rM", packssdw_2 = "rmo:660F6BrM", packsswb_2 = "rmo:660F63rM", packuswb_2 = "rmo:660F67rM", paddb_2 = "rmo:660FFCrM", paddd_2 = "rmo:660FFErM", paddq_2 = "rmo:660FD4rM", paddsb_2 = "rmo:660FECrM", paddsw_2 = "rmo:660FEDrM", paddusb_2 = "rmo:660FDCrM", paddusw_2 = "rmo:660FDDrM", paddw_2 = "rmo:660FFDrM", pand_2 = "rmo:660FDBrM", pandn_2 = "rmo:660FDFrM", pause_0 = "F390", pavgb_2 = "rmo:660FE0rM", pavgw_2 = "rmo:660FE3rM", pcmpeqb_2 = "rmo:660F74rM", pcmpeqd_2 = "rmo:660F76rM", pcmpeqw_2 = "rmo:660F75rM", pcmpgtb_2 = "rmo:660F64rM", pcmpgtd_2 = "rmo:660F66rM", pcmpgtw_2 = "rmo:660F65rM", pextrw_3 = "rri/do:660FC5rMU|xri/wo:660F3A15nrMU", -- Mem op: SSE4.1 only. pinsrw_3 = "rri/od:660FC4rMU|rxi/ow:", pmaddwd_2 = "rmo:660FF5rM", pmaxsw_2 = "rmo:660FEErM", pmaxub_2 = "rmo:660FDErM", pminsw_2 = "rmo:660FEArM", pminub_2 = "rmo:660FDArM", pmovmskb_2 = "rr/do:660FD7rM", pmulhuw_2 = "rmo:660FE4rM", pmulhw_2 = "rmo:660FE5rM", pmullw_2 = "rmo:660FD5rM", pmuludq_2 = "rmo:660FF4rM", por_2 = "rmo:660FEBrM", prefetchnta_1 = "xb:n0F180m", prefetcht0_1 = "xb:n0F181m", prefetcht1_1 = "xb:n0F182m", prefetcht2_1 = "xb:n0F183m", psadbw_2 = "rmo:660FF6rM", pshufd_3 = "rmio:660F70rMU", pshufhw_3 = "rmio:F30F70rMU", pshuflw_3 = "rmio:F20F70rMU", pslld_2 = "rmo:660FF2rM|rio:660F726mU", pslldq_2 = "rio:660F737mU", psllq_2 = "rmo:660FF3rM|rio:660F736mU", psllw_2 = "rmo:660FF1rM|rio:660F716mU", psrad_2 = "rmo:660FE2rM|rio:660F724mU", psraw_2 = "rmo:660FE1rM|rio:660F714mU", psrld_2 = "rmo:660FD2rM|rio:660F722mU", psrldq_2 = "rio:660F733mU", psrlq_2 = "rmo:660FD3rM|rio:660F732mU", psrlw_2 = "rmo:660FD1rM|rio:660F712mU", psubb_2 = "rmo:660FF8rM", psubd_2 = "rmo:660FFArM", psubq_2 = "rmo:660FFBrM", psubsb_2 = "rmo:660FE8rM", psubsw_2 = "rmo:660FE9rM", psubusb_2 = "rmo:660FD8rM", psubusw_2 = "rmo:660FD9rM", psubw_2 = "rmo:660FF9rM", punpckhbw_2 = "rmo:660F68rM", punpckhdq_2 = "rmo:660F6ArM", punpckhqdq_2 = "rmo:660F6DrM", punpckhwd_2 = "rmo:660F69rM", punpcklbw_2 = "rmo:660F60rM", punpckldq_2 = "rmo:660F62rM", punpcklqdq_2 = "rmo:660F6CrM", punpcklwd_2 = "rmo:660F61rM", pxor_2 = "rmo:660FEFrM", rcpps_2 = "rmo:0F53rM", rcpss_2 = "rro:F30F53rM|rx/od:", rsqrtps_2 = "rmo:0F52rM", rsqrtss_2 = "rmo:F30F52rM", sfence_0 = "0FAEF8", shufpd_3 = "rmio:660FC6rMU", shufps_3 = "rmio:0FC6rMU", stmxcsr_1 = "xd:0FAE3m", ucomisd_2 = "rro:660F2ErM|rx/oq:", ucomiss_2 = "rro:0F2ErM|rx/od:", unpckhpd_2 = "rmo:660F15rM", unpckhps_2 = "rmo:0F15rM", unpcklpd_2 = "rmo:660F14rM", unpcklps_2 = "rmo:0F14rM", xorpd_2 = "rmo:660F57rM", xorps_2 = "rmo:0F57rM", -- SSE3 ops fisttp_1 = "xw:nDF1m|xd:DB1m|xq:nDD1m", addsubpd_2 = "rmo:660FD0rM", addsubps_2 = "rmo:F20FD0rM", haddpd_2 = "rmo:660F7CrM", haddps_2 = "rmo:F20F7CrM", hsubpd_2 = "rmo:660F7DrM", hsubps_2 = "rmo:F20F7DrM", lddqu_2 = "rxo:F20FF0rM", movddup_2 = "rmo:F20F12rM", movshdup_2 = "rmo:F30F16rM", movsldup_2 = "rmo:F30F12rM", -- SSSE3 ops pabsb_2 = "rmo:660F381CrM", pabsd_2 = "rmo:660F381ErM", pabsw_2 = "rmo:660F381DrM", palignr_3 = "rmio:660F3A0FrMU", phaddd_2 = "rmo:660F3802rM", phaddsw_2 = "rmo:660F3803rM", phaddw_2 = "rmo:660F3801rM", phsubd_2 = "rmo:660F3806rM", phsubsw_2 = "rmo:660F3807rM", phsubw_2 = "rmo:660F3805rM", pmaddubsw_2 = "rmo:660F3804rM", pmulhrsw_2 = "rmo:660F380BrM", pshufb_2 = "rmo:660F3800rM", psignb_2 = "rmo:660F3808rM", psignd_2 = "rmo:660F380ArM", psignw_2 = "rmo:660F3809rM", -- SSE4.1 ops blendpd_3 = "rmio:660F3A0DrMU", blendps_3 = "rmio:660F3A0CrMU", blendvpd_3 = "rmRo:660F3815rM", blendvps_3 = "rmRo:660F3814rM", dppd_3 = "rmio:660F3A41rMU", dpps_3 = "rmio:660F3A40rMU", extractps_3 = "mri/do:660F3A17RmU|rri/qo:660F3A17RXmU", insertps_3 = "rrio:660F3A41rMU|rxi/od:", movntdqa_2 = "rmo:660F382ArM", mpsadbw_3 = "rmio:660F3A42rMU", packusdw_2 = "rmo:660F382BrM", pblendvb_3 = "rmRo:660F3810rM", pblendw_3 = "rmio:660F3A0ErMU", pcmpeqq_2 = "rmo:660F3829rM", pextrb_3 = "rri/do:660F3A14nRmU|rri/qo:|xri/bo:", pextrd_3 = "mri/do:660F3A16RmU", pextrq_3 = "mri/qo:660F3A16RmU", -- pextrw is SSE2, mem operand is SSE4.1 only phminposuw_2 = "rmo:660F3841rM", pinsrb_3 = "rri/od:660F3A20nrMU|rxi/ob:", pinsrd_3 = "rmi/od:660F3A22rMU", pinsrq_3 = "rmi/oq:660F3A22rXMU", pmaxsb_2 = "rmo:660F383CrM", pmaxsd_2 = "rmo:660F383DrM", pmaxud_2 = "rmo:660F383FrM", pmaxuw_2 = "rmo:660F383ErM", pminsb_2 = "rmo:660F3838rM", pminsd_2 = "rmo:660F3839rM", pminud_2 = "rmo:660F383BrM", pminuw_2 = "rmo:660F383ArM", pmovsxbd_2 = "rro:660F3821rM|rx/od:", pmovsxbq_2 = "rro:660F3822rM|rx/ow:", pmovsxbw_2 = "rro:660F3820rM|rx/oq:", pmovsxdq_2 = "rro:660F3825rM|rx/oq:", pmovsxwd_2 = "rro:660F3823rM|rx/oq:", pmovsxwq_2 = "rro:660F3824rM|rx/od:", pmovzxbd_2 = "rro:660F3831rM|rx/od:", pmovzxbq_2 = "rro:660F3832rM|rx/ow:", pmovzxbw_2 = "rro:660F3830rM|rx/oq:", pmovzxdq_2 = "rro:660F3835rM|rx/oq:", pmovzxwd_2 = "rro:660F3833rM|rx/oq:", pmovzxwq_2 = "rro:660F3834rM|rx/od:", pmuldq_2 = "rmo:660F3828rM", pmulld_2 = "rmo:660F3840rM", ptest_2 = "rmo:660F3817rM", roundpd_3 = "rmio:660F3A09rMU", roundps_3 = "rmio:660F3A08rMU", roundsd_3 = "rrio:660F3A0BrMU|rxi/oq:", roundss_3 = "rrio:660F3A0ArMU|rxi/od:", -- SSE4.2 ops crc32_2 = "rmqd:F20F38F1rM|rm/dw:66F20F38F1rM|rm/db:F20F38F0rM|rm/qb:", pcmpestri_3 = "rmio:660F3A61rMU", pcmpestrm_3 = "rmio:660F3A60rMU", pcmpgtq_2 = "rmo:660F3837rM", pcmpistri_3 = "rmio:660F3A63rMU", pcmpistrm_3 = "rmio:660F3A62rMU", popcnt_2 = "rmqdw:F30FB8rM", -- SSE4a extrq_2 = "rro:660F79rM", extrq_3 = "riio:660F780mUU", insertq_2 = "rro:F20F79rM", insertq_4 = "rriio:F20F78rMUU", lzcnt_2 = "rmqdw:F30FBDrM", movntsd_2 = "xr/qo:nF20F2BRm", movntss_2 = "xr/do:F30F2BRm", -- popcnt is also in SSE4.2 } ------------------------------------------------------------------------------ -- Arithmetic ops. for name,n in pairs{ add = 0, ["or"] = 1, adc = 2, sbb = 3, ["and"] = 4, sub = 5, xor = 6, cmp = 7 } do local n8 = shl(n, 3) map_op[name.."_2"] = format( "mr:%02XRm|rm:%02XrM|mI1qdw:81%XmI|mS1qdw:83%XmS|Ri1qdwb:%02Xri|mi1qdwb:81%Xmi", 1+n8, 3+n8, n, n, 5+n8, n) end -- Shift ops. for name,n in pairs{ rol = 0, ror = 1, rcl = 2, rcr = 3, shl = 4, shr = 5, sar = 7, sal = 4 } do map_op[name.."_2"] = format("m1:D1%Xm|mC1qdwb:D3%Xm|mi:C1%XmU", n, n, n) end -- Conditional ops. for cc,n in pairs(map_cc) do map_op["j"..cc.."_1"] = format("J.:n0F8%XJ", n) -- short: 7%X map_op["set"..cc.."_1"] = format("mb:n0F9%X2m", n) map_op["cmov"..cc.."_2"] = format("rmqdw:0F4%XrM", n) -- P6+ end -- FP arithmetic ops. for name,n in pairs{ add = 0, mul = 1, com = 2, comp = 3, sub = 4, subr = 5, div = 6, divr = 7 } do local nc = 0xc0 + shl(n, 3) local nr = nc + (n < 4 and 0 or (n % 2 == 0 and 8 or -8)) local fn = "f"..name map_op[fn.."_1"] = format("ff:D8%02Xr|xd:D8%Xm|xq:nDC%Xm", nc, n, n) if n == 2 or n == 3 then map_op[fn.."_2"] = format("Fff:D8%02XR|Fx2d:D8%XM|Fx2q:nDC%XM", nc, n, n) else map_op[fn.."_2"] = format("Fff:D8%02XR|fFf:DC%02Xr|Fx2d:D8%XM|Fx2q:nDC%XM", nc, nr, n, n) map_op[fn.."p_1"] = format("ff:DE%02Xr", nr) map_op[fn.."p_2"] = format("fFf:DE%02Xr", nr) end map_op["fi"..name.."_1"] = format("xd:DA%Xm|xw:nDE%Xm", n, n) end -- FP conditional moves. for cc,n in pairs{ b=0, e=1, be=2, u=3, nb=4, ne=5, nbe=6, nu=7 } do local nc = 0xdac0 + shl(band(n, 3), 3) + shl(band(n, 4), 6) map_op["fcmov"..cc.."_1"] = format("ff:%04Xr", nc) -- P6+ map_op["fcmov"..cc.."_2"] = format("Fff:%04XR", nc) -- P6+ end -- SSE FP arithmetic ops. for name,n in pairs{ sqrt = 1, add = 8, mul = 9, sub = 12, min = 13, div = 14, max = 15 } do map_op[name.."ps_2"] = format("rmo:0F5%XrM", n) map_op[name.."ss_2"] = format("rro:F30F5%XrM|rx/od:", n) map_op[name.."pd_2"] = format("rmo:660F5%XrM", n) map_op[name.."sd_2"] = format("rro:F20F5%XrM|rx/oq:", n) end ------------------------------------------------------------------------------ -- Process pattern string. local function dopattern(pat, args, sz, op, needrex) local digit, addin local opcode = 0 local szov = sz local narg = 1 local rex = 0 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 5 positions. if secpos+5 > maxsecpos then wflush() end -- Process each character. for c in gmatch(pat.."|", ".") do if match(c, "%x") then -- Hex digit. digit = byte(c) - 48 if digit > 48 then digit = digit - 39 elseif digit > 16 then digit = digit - 7 end opcode = opcode*16 + digit addin = nil elseif c == "n" then -- Disable operand size mods for opcode. szov = nil elseif c == "X" then -- Force REX.W. rex = 8 elseif c == "r" then -- Merge 1st operand regno. into opcode. addin = args[1]; opcode = opcode + (addin.reg % 8) if narg < 2 then narg = 2 end elseif c == "R" then -- Merge 2nd operand regno. into opcode. addin = args[2]; opcode = opcode + (addin.reg % 8) narg = 3 elseif c == "m" or c == "M" then -- Encode ModRM/SIB. local s if addin then s = addin.reg opcode = opcode - band(s, 7) -- Undo regno opcode merge. else s = band(opcode, 15) -- Undo last digit. opcode = shr(opcode, 4) end local nn = c == "m" and 1 or 2 local t = args[nn] if narg <= nn then narg = nn + 1 end if szov == "q" and rex == 0 then rex = rex + 8 end if t.reg and t.reg > 7 then rex = rex + 1 end if t.xreg and t.xreg > 7 then rex = rex + 2 end if s > 7 then rex = rex + 4 end if needrex then rex = rex + 16 end wputop(szov, opcode, rex); opcode = nil local imark = sub(pat, -1) -- Force a mark (ugly). -- Put ModRM/SIB with regno/last digit as spare. wputmrmsib(t, imark, s, addin and addin.vreg) addin = nil else if opcode then -- Flush opcode. if szov == "q" and rex == 0 then rex = rex + 8 end if needrex then rex = rex + 16 end if addin and addin.reg == -1 then wputop(szov, opcode - 7, rex) waction("VREG", addin.vreg); wputxb(0) else if addin and addin.reg > 7 then rex = rex + 1 end wputop(szov, opcode, rex) end opcode = nil end if c == "|" then break end if c == "o" then -- Offset (pure 32 bit displacement). wputdarg(args[1].disp); if narg < 2 then narg = 2 end elseif c == "O" then wputdarg(args[2].disp); narg = 3 else -- Anything else is an immediate operand. local a = args[narg] narg = narg + 1 local mode, imm = a.mode, a.imm if mode == "iJ" and not match("iIJ", c) then werror("bad operand size for label") end if c == "S" then wputsbarg(imm) elseif c == "U" then wputbarg(imm) elseif c == "W" then wputwarg(imm) elseif c == "i" or c == "I" then if mode == "iJ" then wputlabel("IMM_", imm, 1) elseif mode == "iI" and c == "I" then waction(sz == "w" and "IMM_WB" or "IMM_DB", imm) else wputszarg(sz, imm) end elseif c == "J" then if mode == "iPJ" then waction("REL_A", imm) -- !x64 (secpos) else wputlabel("REL_", imm, 2) end else werror("bad char `"..c.."' in pattern `"..pat.."' for `"..op.."'") end end end end end ------------------------------------------------------------------------------ -- Mapping of operand modes to short names. Suppress output with '#'. local map_modename = { r = "reg", R = "eax", C = "cl", x = "mem", m = "mrm", i = "imm", f = "stx", F = "st0", J = "lbl", ["1"] = "1", I = "#", S = "#", O = "#", } -- Return a table/string showing all possible operand modes. local function templatehelp(template, nparams) if nparams == 0 then return "" end local t = {} for tm in gmatch(template, "[^%|]+") do local s = map_modename[sub(tm, 1, 1)] s = s..gsub(sub(tm, 2, nparams), ".", function(c) return ", "..map_modename[c] end) if not match(s, "#") then t[#t+1] = s end end return t end -- Match operand modes against mode match part of template. local function matchtm(tm, args) for i=1,#args do if not match(args[i].mode, sub(tm, i, i)) then return end end return true end -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return templatehelp(template, nparams) end local args = {} -- Zero-operand opcodes have no match part. if #params == 0 then dopattern(template, args, "d", params.op, nil) return end -- Determine common operand size (coerce undefined size) or flag as mixed. local sz, szmix, needrex for i,p in ipairs(params) do args[i] = parseoperand(p) local nsz = args[i].opsize if nsz then if sz and sz ~= nsz then szmix = true else sz = nsz end end local nrex = args[i].needrex if nrex ~= nil then if needrex == nil then needrex = nrex elseif needrex ~= nrex then werror("bad mix of byte-addressable registers") end end end -- Try all match:pattern pairs (separated by '|'). local gotmatch, lastpat for tm in gmatch(template, "[^%|]+") do -- Split off size match (starts after mode match) and pattern string. local szm, pat = match(tm, "^(.-):(.*)$", #args+1) if pat == "" then pat = lastpat else lastpat = pat end if matchtm(tm, args) then local prefix = sub(szm, 1, 1) if prefix == "/" then -- Match both operand sizes. if args[1].opsize == sub(szm, 2, 2) and args[2].opsize == sub(szm, 3, 3) then dopattern(pat, args, sz, params.op, needrex) -- Process pattern. return end else -- Match common operand size. local szp = sz if szm == "" then szm = x64 and "qdwb" or "dwb" end -- Default sizes. if prefix == "1" then szp = args[1].opsize; szmix = nil elseif prefix == "2" then szp = args[2].opsize; szmix = nil end if not szmix and (prefix == "." or match(szm, szp or "#")) then dopattern(pat, args, szp, params.op, needrex) -- Process pattern. return end end gotmatch = true end end local msg = "bad operand mode" if gotmatch then if szmix then msg = "mixed operand size" else msg = sz and "bad operand size" or "missing operand size" end end werror(msg.." in `"..opmodestr(params.op, args).."'") end ------------------------------------------------------------------------------ -- x64-specific opcode for 64 bit immediates and displacements. if x64 then function map_op.mov64_2(params) if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end if secpos+2 > maxsecpos then wflush() end local opcode, op64, sz, rex, vreg local op64 = match(params[1], "^%[%s*(.-)%s*%]$") if op64 then local a = parseoperand(params[2]) if a.mode ~= "rmR" then werror("bad operand mode") end sz = a.opsize rex = sz == "q" and 8 or 0 opcode = 0xa3 else op64 = match(params[2], "^%[%s*(.-)%s*%]$") local a = parseoperand(params[1]) if op64 then if a.mode ~= "rmR" then werror("bad operand mode") end sz = a.opsize rex = sz == "q" and 8 or 0 opcode = 0xa1 else if sub(a.mode, 1, 1) ~= "r" or a.opsize ~= "q" then werror("bad operand mode") end op64 = params[2] if a.reg == -1 then vreg = a.vreg opcode = 0xb8 else opcode = 0xb8 + band(a.reg, 7) end rex = a.reg > 7 and 9 or 8 end end wputop(sz, opcode, rex) if vreg then waction("VREG", vreg); wputxb(0) end waction("IMM_D", format("(unsigned int)(%s)", op64)) waction("IMM_D", format("(unsigned int)((%s)>>32)", op64)) end end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. local function op_data(params) if not params then return "imm..." end local sz = sub(params.op, 2, 2) if sz == "a" then sz = addrsize end for _,p in ipairs(params) do local a = parseoperand(p) if sub(a.mode, 1, 1) ~= "i" or (a.opsize and a.opsize ~= sz) then werror("bad mode or size in `"..p.."'") end if a.mode == "iJ" then wputlabel("IMM_", a.imm, 1) else wputszarg(sz, a.imm) end if secpos+2 > maxsecpos then wflush() end end end map_op[".byte_*"] = op_data map_op[".sbyte_*"] = op_data map_op[".word_*"] = op_data map_op[".dword_*"] = op_data map_op[".aword_*"] = op_data ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_2"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr [, addr]" end if secpos+2 > maxsecpos then wflush() end local a = parseoperand(params[1]) local mode, imm = a.mode, a.imm if type(imm) == "number" and (mode == "iJ" or (imm >= 1 and imm <= 9)) then -- Local label (1: ... 9:) or global label (->global:). waction("LABEL_LG", nil, 1) wputxb(imm) elseif mode == "iJ" then -- PC label (=>pcexpr:). waction("LABEL_PC", imm) else werror("bad label definition") end -- SETLABEL must immediately follow LABEL_LG/LABEL_PC. local addr = params[2] if addr then local a = parseoperand(addr) if a.mode == "iPJ" then waction("SETLABEL", a.imm) else werror("bad label assignment") end end end map_op[".label_1"] = map_op[".label_2"] ------------------------------------------------------------------------------ -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) or map_opsizenum[map_opsize[params[1]]] if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", nil, 1) wputxb(align-1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end -- Spacing pseudo-opcode. map_op[".space_2"] = function(params) if not params then return "num [, filler]" end if secpos+1 > maxsecpos then wflush() end waction("SPACE", params[1]) local fill = params[2] if fill then fill = tonumber(fill) if not fill or fill < 0 or fill > 255 then werror("bad filler") end end wputxb(fill or 0) end map_op[".space_1"] = map_op[".space_2"] ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end if reg and not map_reg_valid_base[reg] then werror("bad base register `"..(map_reg_rev[reg] or reg).."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg and map_reg_rev[tp.reg] or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION") wputxb(num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpregs(out) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2015.11/3rdparty/dynasm/dynasm.lua0000644000175000017500000007441512456307242017131 0ustar jnthnjnthn------------------------------------------------------------------------------ -- DynASM. A dynamic assembler for code generation engines. -- Originally designed and implemented for LuaJIT. -- -- Copyright (C) 2005-2014 Mike Pall. All rights reserved. -- See below for full copyright notice. ------------------------------------------------------------------------------ -- Application information. local _info = { name = "DynASM", description = "A dynamic assembler for code generation engines", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", url = "http://luajit.org/dynasm.html", license = "MIT", copyright = [[ Copyright (C) 2005-2014 Mike Pall. All rights reserved. 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. [ MIT license: http://www.opensource.org/licenses/mit-license.php ] ]], } -- Cache library functions. local type, pairs, ipairs = type, pairs, ipairs local pcall, error, assert = pcall, error, assert local _s = string local sub, match, gmatch, gsub = _s.sub, _s.match, _s.gmatch, _s.gsub local format, rep, upper = _s.format, _s.rep, _s.upper local _t = table local insert, remove, concat, sort = _t.insert, _t.remove, _t.concat, _t.sort local exit = os.exit local io = io local stdin, stdout, stderr = io.stdin, io.stdout, io.stderr ------------------------------------------------------------------------------ -- Program options. local g_opt = {} -- Global state for current file. local g_fname, g_curline, g_indent, g_lineno, g_synclineno, g_arch local g_errcount = 0 -- Write buffer for output file. local g_wbuffer, g_capbuffer ------------------------------------------------------------------------------ -- Write an output line (or callback function) to the buffer. local function wline(line, needindent) local buf = g_capbuffer or g_wbuffer buf[#buf+1] = needindent and g_indent..line or line g_synclineno = g_synclineno + 1 end -- Write assembler line as a comment, if requestd. local function wcomment(aline) if g_opt.comment then wline(g_opt.comment..aline..g_opt.endcomment, true) end end -- Resync CPP line numbers. local function wsync() if g_synclineno ~= g_lineno and g_opt.cpp then wline("#line "..g_lineno..' "'..g_fname..'"') g_synclineno = g_lineno end end -- Dummy action flush function. Replaced with arch-specific function later. local function wflush(term) end -- Dump all buffered output lines. local function wdumplines(out, buf) for _,line in ipairs(buf) do if type(line) == "string" then assert(out:write(line, "\n")) else -- Special callback to dynamically insert lines after end of processing. line(out) end end end ------------------------------------------------------------------------------ -- Emit an error. Processing continues with next statement. local function werror(msg) error(format("%s:%s: error: %s:\n%s", g_fname, g_lineno, msg, g_curline), 0) end -- Emit a fatal error. Processing stops. local function wfatal(msg) g_errcount = "fatal" werror(msg) end -- Print a warning. Processing continues. local function wwarn(msg) stderr:write(format("%s:%s: warning: %s:\n%s\n", g_fname, g_lineno, msg, g_curline)) end -- Print caught error message. But suppress excessive errors. local function wprinterr(...) if type(g_errcount) == "number" then -- Regular error. g_errcount = g_errcount + 1 if g_errcount < 21 then -- Seems to be a reasonable limit. stderr:write(...) elseif g_errcount == 21 then stderr:write(g_fname, ":*: warning: too many errors (suppressed further messages).\n") end else -- Fatal error. stderr:write(...) return true -- Stop processing. end end ------------------------------------------------------------------------------ -- Map holding all option handlers. local opt_map = {} local opt_current -- Print error and exit with error status. local function opterror(...) stderr:write("dynasm.lua: ERROR: ", ...) stderr:write("\n") exit(1) end -- Get option parameter. local function optparam(args) local argn = args.argn local p = args[argn] if not p then opterror("missing parameter for option `", opt_current, "'.") end args.argn = argn + 1 return p end ------------------------------------------------------------------------------ -- Core pseudo-opcodes. local map_coreop = {} -- Dummy opcode map. Replaced by arch-specific map. local map_op = {} -- Forward declarations. local dostmt local readfile ------------------------------------------------------------------------------ -- Map for defines (initially empty, chains to arch-specific map). local map_def = {} -- Pseudo-opcode to define a substitution. map_coreop[".define_2"] = function(params, nparams) if not params then return nparams == 1 and "name" or "name, subst" end local name, def = params[1], params[2] or "1" if not match(name, "^[%a_][%w_]*$") then werror("bad or duplicate define") end map_def[name] = def end map_coreop[".define_1"] = map_coreop[".define_2"] -- Define a substitution on the command line. function opt_map.D(args) local namesubst = optparam(args) local name, subst = match(namesubst, "^([%a_][%w_]*)=(.*)$") if name then map_def[name] = subst elseif match(namesubst, "^[%a_][%w_]*$") then map_def[namesubst] = "1" else opterror("bad define") end end -- Undefine a substitution on the command line. function opt_map.U(args) local name = optparam(args) if match(name, "^[%a_][%w_]*$") then map_def[name] = nil else opterror("bad define") end end -- Helper for definesubst. local gotsubst local function definesubst_one(word) local subst = map_def[word] if subst then gotsubst = word; return subst else return word end end -- Iteratively substitute defines. local function definesubst(stmt) -- Limit number of iterations. for i=1,100 do gotsubst = false stmt = gsub(stmt, "#?[%w_]+", definesubst_one) if not gotsubst then break end end if gotsubst then wfatal("recursive define involving `"..gotsubst.."'") end return stmt end -- Dump all defines. local function dumpdefines(out, lvl) local t = {} for name in pairs(map_def) do t[#t+1] = name end sort(t) out:write("Defines:\n") for _,name in ipairs(t) do local subst = map_def[name] if g_arch then subst = g_arch.revdef(subst) end out:write(format(" %-20s %s\n", name, subst)) end out:write("\n") end ------------------------------------------------------------------------------ -- Support variables for conditional assembly. local condlevel = 0 local condstack = {} -- Evaluate condition with a Lua expression. Substitutions already performed. local function cond_eval(cond) local func, err if setfenv then func, err = loadstring("return "..cond, "=expr") else -- No globals. All unknown identifiers evaluate to nil. func, err = load("return "..cond, "=expr", "t", {}) end if func then if setfenv then setfenv(func, {}) -- No globals. All unknown identifiers evaluate to nil. end local ok, res = pcall(func) if ok then if res == 0 then return false end -- Oh well. return not not res end err = res end wfatal("bad condition: "..err) end -- Skip statements until next conditional pseudo-opcode at the same level. local function stmtskip() local dostmt_save = dostmt local lvl = 0 dostmt = function(stmt) local op = match(stmt, "^%s*(%S+)") if op == ".if" then lvl = lvl + 1 elseif lvl ~= 0 then if op == ".endif" then lvl = lvl - 1 end elseif op == ".elif" or op == ".else" or op == ".endif" then dostmt = dostmt_save dostmt(stmt) end end end -- Pseudo-opcodes for conditional assembly. map_coreop[".if_1"] = function(params) if not params then return "condition" end local lvl = condlevel + 1 local res = cond_eval(params[1]) condlevel = lvl condstack[lvl] = res if not res then stmtskip() end end map_coreop[".elif_1"] = function(params) if not params then return "condition" end if condlevel == 0 then wfatal(".elif without .if") end local lvl = condlevel local res = condstack[lvl] if res then if res == "else" then wfatal(".elif after .else") end else res = cond_eval(params[1]) if res then condstack[lvl] = res return end end stmtskip() end map_coreop[".else_0"] = function(params) if condlevel == 0 then wfatal(".else without .if") end local lvl = condlevel local res = condstack[lvl] condstack[lvl] = "else" if res then if res == "else" then wfatal(".else after .else") end stmtskip() end end map_coreop[".endif_0"] = function(params) local lvl = condlevel if lvl == 0 then wfatal(".endif without .if") end condlevel = lvl - 1 end -- Check for unfinished conditionals. local function checkconds() if g_errcount ~= "fatal" and condlevel ~= 0 then wprinterr(g_fname, ":*: error: unbalanced conditional\n") end end ------------------------------------------------------------------------------ -- Search for a file in the given path and open it for reading. local function pathopen(path, name) local dirsep = package and match(package.path, "\\") and "\\" or "/" for _,p in ipairs(path) do local fullname = p == "" and name or p..dirsep..name local fin = io.open(fullname, "r") if fin then g_fname = fullname return fin end end end -- Include a file. map_coreop[".include_1"] = function(params) if not params then return "filename" end local name = params[1] -- Save state. Ugly, I know. but upvalues are fast. local gf, gl, gcl, gi = g_fname, g_lineno, g_curline, g_indent -- Read the included file. local fatal = readfile(pathopen(g_opt.include, name) or wfatal("include file `"..name.."' not found")) -- Restore state. g_synclineno = -1 g_fname, g_lineno, g_curline, g_indent = gf, gl, gcl, gi if fatal then wfatal("in include file") end end -- Make .include and conditionals initially available, too. map_op[".include_1"] = map_coreop[".include_1"] map_op[".if_1"] = map_coreop[".if_1"] map_op[".elif_1"] = map_coreop[".elif_1"] map_op[".else_0"] = map_coreop[".else_0"] map_op[".endif_0"] = map_coreop[".endif_0"] ------------------------------------------------------------------------------ -- Support variables for macros. local mac_capture, mac_lineno, mac_name local mac_active = {} local mac_list = {} -- Pseudo-opcode to define a macro. map_coreop[".macro_*"] = function(mparams) if not mparams then return "name [, params...]" end -- Split off and validate macro name. local name = remove(mparams, 1) if not name then werror("missing macro name") end if not (match(name, "^[%a_][%w_%.]*$") or match(name, "^%.[%w_%.]*$")) then wfatal("bad macro name `"..name.."'") end -- Validate macro parameter names. local mdup = {} for _,mp in ipairs(mparams) do if not match(mp, "^[%a_][%w_]*$") then wfatal("bad macro parameter name `"..mp.."'") end if mdup[mp] then wfatal("duplicate macro parameter name `"..mp.."'") end mdup[mp] = true end -- Check for duplicate or recursive macro definitions. local opname = name.."_"..#mparams if map_op[opname] or map_op[name.."_*"] then wfatal("duplicate macro `"..name.."' ("..#mparams.." parameters)") end if mac_capture then wfatal("recursive macro definition") end -- Enable statement capture. local lines = {} mac_lineno = g_lineno mac_name = name mac_capture = function(stmt) -- Statement capture function. -- Stop macro definition with .endmacro pseudo-opcode. if not match(stmt, "^%s*.endmacro%s*$") then lines[#lines+1] = stmt return end mac_capture = nil mac_lineno = nil mac_name = nil mac_list[#mac_list+1] = opname -- Add macro-op definition. map_op[opname] = function(params) if not params then return mparams, lines end -- Protect against recursive macro invocation. if mac_active[opname] then wfatal("recursive macro invocation") end mac_active[opname] = true -- Setup substitution map. local subst = {} for i,mp in ipairs(mparams) do subst[mp] = params[i] end local mcom if g_opt.maccomment and g_opt.comment then mcom = " MACRO "..name.." ("..#mparams..")" wcomment("{"..mcom) end -- Loop through all captured statements for _,stmt in ipairs(lines) do -- Substitute macro parameters. local st = gsub(stmt, "[%w_]+", subst) st = definesubst(st) st = gsub(st, "%s*%.%.%s*", "") -- Token paste a..b. if mcom and sub(st, 1, 1) ~= "|" then wcomment(st) end -- Emit statement. Use a protected call for better diagnostics. local ok, err = pcall(dostmt, st) if not ok then -- Add the captured statement to the error. wprinterr(err, "\n", g_indent, "| ", stmt, "\t[MACRO ", name, " (", #mparams, ")]\n") end end if mcom then wcomment("}"..mcom) end mac_active[opname] = nil end end end -- An .endmacro pseudo-opcode outside of a macro definition is an error. map_coreop[".endmacro_0"] = function(params) wfatal(".endmacro without .macro") end -- Dump all macros and their contents (with -PP only). local function dumpmacros(out, lvl) sort(mac_list) out:write("Macros:\n") for _,opname in ipairs(mac_list) do local name = sub(opname, 1, -3) local params, lines = map_op[opname]() out:write(format(" %-20s %s\n", name, concat(params, ", "))) if lvl > 1 then for _,line in ipairs(lines) do out:write(" |", line, "\n") end out:write("\n") end end out:write("\n") end -- Check for unfinished macro definitions. local function checkmacros() if mac_capture then wprinterr(g_fname, ":", mac_lineno, ": error: unfinished .macro `", mac_name ,"'\n") end end ------------------------------------------------------------------------------ -- Support variables for captures. local cap_lineno, cap_name local cap_buffers = {} local cap_used = {} -- Start a capture. map_coreop[".capture_1"] = function(params) if not params then return "name" end wflush() local name = params[1] if not match(name, "^[%a_][%w_]*$") then wfatal("bad capture name `"..name.."'") end if cap_name then wfatal("already capturing to `"..cap_name.."' since line "..cap_lineno) end cap_name = name cap_lineno = g_lineno -- Create or continue a capture buffer and start the output line capture. local buf = cap_buffers[name] if not buf then buf = {}; cap_buffers[name] = buf end g_capbuffer = buf g_synclineno = 0 end -- Stop a capture. map_coreop[".endcapture_0"] = function(params) wflush() if not cap_name then wfatal(".endcapture without a valid .capture") end cap_name = nil cap_lineno = nil g_capbuffer = nil g_synclineno = 0 end -- Dump a capture buffer. map_coreop[".dumpcapture_1"] = function(params) if not params then return "name" end wflush() local name = params[1] if not match(name, "^[%a_][%w_]*$") then wfatal("bad capture name `"..name.."'") end cap_used[name] = true wline(function(out) local buf = cap_buffers[name] if buf then wdumplines(out, buf) end end) g_synclineno = 0 end -- Dump all captures and their buffers (with -PP only). local function dumpcaptures(out, lvl) out:write("Captures:\n") for name,buf in pairs(cap_buffers) do out:write(format(" %-20s %4s)\n", name, "("..#buf)) if lvl > 1 then local bar = rep("=", 76) out:write(" ", bar, "\n") for _,line in ipairs(buf) do out:write(" ", line, "\n") end out:write(" ", bar, "\n\n") end end out:write("\n") end -- Check for unfinished or unused captures. local function checkcaptures() if cap_name then wprinterr(g_fname, ":", cap_lineno, ": error: unfinished .capture `", cap_name,"'\n") return end for name in pairs(cap_buffers) do if not cap_used[name] then wprinterr(g_fname, ":*: error: missing .dumpcapture ", name ,"\n") end end end ------------------------------------------------------------------------------ -- Sections names. local map_sections = {} -- Pseudo-opcode to define code sections. -- TODO: Data sections, BSS sections. Needs extra C code and API. map_coreop[".section_*"] = function(params) if not params then return "name..." end if #map_sections > 0 then werror("duplicate section definition") end wflush() for sn,name in ipairs(params) do local opname = "."..name.."_0" if not match(name, "^[%a][%w_]*$") or map_op[opname] or map_op["."..name.."_*"] then werror("bad section name `"..name.."'") end map_sections[#map_sections+1] = name wline(format("#define DASM_SECTION_%s\t%d", upper(name), sn-1)) map_op[opname] = function(params) g_arch.section(sn-1) end end wline(format("#define DASM_MAXSECTION\t\t%d", #map_sections)) end -- Dump all sections. local function dumpsections(out, lvl) out:write("Sections:\n") for _,name in ipairs(map_sections) do out:write(format(" %s\n", name)) end out:write("\n") end ------------------------------------------------------------------------------ -- Replacement for customized Lua, which lacks the package library. local prefix = "" if not require then function require(name) local fp = assert(io.open(prefix..name..".lua")) local s = fp:read("*a") assert(fp:close()) return assert(loadstring(s, "@"..name..".lua"))() end end -- Load architecture-specific module. local function loadarch(arch) if not match(arch, "^[%w_]+$") then return "bad arch name" end local ok, m_arch = pcall(require, "dasm_"..arch) if not ok then return "cannot load module: "..m_arch end g_arch = m_arch wflush = m_arch.passcb(wline, werror, wfatal, wwarn) m_arch.setup(arch, g_opt) map_op, map_def = m_arch.mergemaps(map_coreop, map_def) end -- Dump architecture description. function opt_map.dumparch(args) local name = optparam(args) if not g_arch then local err = loadarch(name) if err then opterror(err) end end local t = {} for name in pairs(map_coreop) do t[#t+1] = name end for name in pairs(map_op) do t[#t+1] = name end sort(t) local out = stdout local _arch = g_arch._info out:write(format("%s version %s, released %s, %s\n", _info.name, _info.version, _info.release, _info.url)) g_arch.dumparch(out) local pseudo = true out:write("Pseudo-Opcodes:\n") for _,sname in ipairs(t) do local name, nparam = match(sname, "^(.+)_([0-9%*])$") if name then if pseudo and sub(name, 1, 1) ~= "." then out:write("\nOpcodes:\n") pseudo = false end local f = map_op[sname] local s if nparam ~= "*" then nparam = nparam + 0 end if nparam == 0 then s = "" elseif type(f) == "string" then s = map_op[".template__"](nil, f, nparam) else s = f(nil, nparam) end if type(s) == "table" then for _,s2 in ipairs(s) do out:write(format(" %-12s %s\n", name, s2)) end else out:write(format(" %-12s %s\n", name, s)) end end end out:write("\n") exit(0) end -- Pseudo-opcode to set the architecture. -- Only initially available (map_op is replaced when called). map_op[".arch_1"] = function(params) if not params then return "name" end local err = loadarch(params[1]) if err then wfatal(err) end wline(format("#if DASM_VERSION != %d", _info.vernum)) wline('#error "Version mismatch between DynASM and included encoding engine"') wline("#endif") end -- Dummy .arch pseudo-opcode to improve the error report. map_coreop[".arch_1"] = function(params) if not params then return "name" end wfatal("duplicate .arch statement") end ------------------------------------------------------------------------------ -- Dummy pseudo-opcode. Don't confuse '.nop' with 'nop'. map_coreop[".nop_*"] = function(params) if not params then return "[ignored...]" end end -- Pseudo-opcodes to raise errors. map_coreop[".error_1"] = function(params) if not params then return "message" end werror(params[1]) end map_coreop[".fatal_1"] = function(params) if not params then return "message" end wfatal(params[1]) end -- Dump all user defined elements. local function dumpdef(out) local lvl = g_opt.dumpdef if lvl == 0 then return end dumpsections(out, lvl) dumpdefines(out, lvl) if g_arch then g_arch.dumpdef(out, lvl) end dumpmacros(out, lvl) dumpcaptures(out, lvl) end ------------------------------------------------------------------------------ -- Helper for splitstmt. local splitlvl local function splitstmt_one(c) if c == "(" then splitlvl = ")"..splitlvl elseif c == "[" then splitlvl = "]"..splitlvl elseif c == "{" then splitlvl = "}"..splitlvl elseif c == ")" or c == "]" or c == "}" then if sub(splitlvl, 1, 1) ~= c then werror("unbalanced (), [] or {}") end splitlvl = sub(splitlvl, 2) elseif splitlvl == "" then return " \0 " end return c end -- Split statement into (pseudo-)opcode and params. local function splitstmt(stmt) -- Convert label with trailing-colon into .label statement. local label = match(stmt, "^%s*(.+):%s*$") if label then return ".label", {label} end -- Split at commas and equal signs, but obey parentheses and brackets. splitlvl = "" stmt = gsub(stmt, "[,%(%)%[%]{}]", splitstmt_one) if splitlvl ~= "" then werror("unbalanced () or []") end -- Split off opcode. local op, other = match(stmt, "^%s*([^%s%z]+)%s*(.*)$") if not op then werror("bad statement syntax") end -- Split parameters. local params = {} for p in gmatch(other, "%s*(%Z+)%z?") do params[#params+1] = gsub(p, "%s+$", "") end if #params > 16 then werror("too many parameters") end params.op = op return op, params end -- Process a single statement. dostmt = function(stmt) -- Ignore empty statements. if match(stmt, "^%s*$") then return end -- Capture macro defs before substitution. if mac_capture then return mac_capture(stmt) end stmt = definesubst(stmt) -- Emit C code without parsing the line. if sub(stmt, 1, 1) == "|" then local tail = sub(stmt, 2) wflush() if sub(tail, 1, 2) == "//" then wcomment(tail) else wline(tail, true) end return end -- Split into (pseudo-)opcode and params. local op, params = splitstmt(stmt) -- Get opcode handler (matching # of parameters or generic handler). local f = map_op[op.."_"..#params] or map_op[op.."_*"] if not f then if not g_arch then wfatal("first statement must be .arch") end -- Improve error report. for i=0,9 do if map_op[op.."_"..i] then werror("wrong number of parameters for `"..op.."'") end end werror("unknown statement `"..op.."'") end -- Call opcode handler or special handler for template strings. if type(f) == "string" then map_op[".template__"](params, f) else f(params) end end -- Process a single line. local function doline(line) if g_opt.flushline then wflush() end -- Assembler line? local indent, aline = match(line, "^(%s*)%|(.*)$") if not aline then -- No, plain C code line, need to flush first. wflush() wsync() wline(line, false) return end g_indent = indent -- Remember current line indentation. -- Emit C code (even from macros). Avoids echo and line parsing. if sub(aline, 1, 1) == "|" then if not mac_capture then wsync() elseif g_opt.comment then wsync() wcomment(aline) end dostmt(aline) return end -- Echo assembler line as a comment. if g_opt.comment then wsync() wcomment(aline) end -- Strip assembler comments. aline = gsub(aline, "//.*$", "") -- Split line into statements at semicolons. if match(aline, ";") then for stmt in gmatch(aline, "[^;]+") do dostmt(stmt) end else dostmt(aline) end end ------------------------------------------------------------------------------ -- Write DynASM header. local function dasmhead(out) out:write(format([[ /* ** This file has been pre-processed with DynASM. ** %s ** DynASM version %s, DynASM %s version %s ** DO NOT EDIT! The original file is in "%s". */ ]], _info.url, _info.version, g_arch._info.arch, g_arch._info.version, g_fname)) end -- Read input file. readfile = function(fin) g_indent = "" g_lineno = 0 g_synclineno = -1 -- Process all lines. for line in fin:lines() do g_lineno = g_lineno + 1 g_curline = line local ok, err = pcall(doline, line) if not ok and wprinterr(err, "\n") then return true end end wflush() -- Close input file. assert(fin == stdin or fin:close()) end -- Write output file. local function writefile(outfile) local fout -- Open output file. if outfile == nil or outfile == "-" then fout = stdout else fout = assert(io.open(outfile, "w")) end -- Write all buffered lines wdumplines(fout, g_wbuffer) -- Close output file. assert(fout == stdout or fout:close()) -- Optionally dump definitions. dumpdef(fout == stdout and stderr or stdout) end -- Translate an input file to an output file. local function translate(infile, outfile) g_wbuffer = {} g_indent = "" g_lineno = 0 g_synclineno = -1 -- Put header. wline(dasmhead) -- Read input file. local fin if infile == "-" then g_fname = "(stdin)" fin = stdin else g_fname = infile fin = assert(io.open(infile, "r")) end readfile(fin) -- Check for errors. if not g_arch then wprinterr(g_fname, ":*: error: missing .arch directive\n") end checkconds() checkmacros() checkcaptures() if g_errcount ~= 0 then stderr:write(g_fname, ":*: info: ", g_errcount, " error", (type(g_errcount) == "number" and g_errcount > 1) and "s" or "", " in input file -- no output file generated.\n") dumpdef(stderr) exit(1) end -- Write output file. writefile(outfile) end ------------------------------------------------------------------------------ -- Print help text. function opt_map.help() stdout:write("DynASM -- ", _info.description, ".\n") stdout:write("DynASM ", _info.version, " ", _info.release, " ", _info.url, "\n") stdout:write[[ Usage: dynasm [OPTION]... INFILE.dasc|- -h, --help Display this help text. -V, --version Display version and copyright information. -o, --outfile FILE Output file name (default is stdout). -I, --include DIR Add directory to the include search path. -c, --ccomment Use /* */ comments for assembler lines. -C, --cppcomment Use // comments for assembler lines (default). -N, --nocomment Suppress assembler lines in output. -M, --maccomment Show macro expansions as comments (default off). -L, --nolineno Suppress CPP line number information in output. -F, --flushline Flush action list for every line. -D NAME[=SUBST] Define a substitution. -U NAME Undefine a substitution. -P, --dumpdef Dump defines, macros, etc. Repeat for more output. -A, --dumparch ARCH Load architecture ARCH and dump description. ]] exit(0) end -- Print version information. function opt_map.version() stdout:write(format("%s version %s, released %s\n%s\n\n%s", _info.name, _info.version, _info.release, _info.url, _info.copyright)) exit(0) end -- Misc. options. function opt_map.outfile(args) g_opt.outfile = optparam(args) end function opt_map.include(args) insert(g_opt.include, 1, optparam(args)) end function opt_map.ccomment() g_opt.comment = "/*|"; g_opt.endcomment = " */" end function opt_map.cppcomment() g_opt.comment = "//|"; g_opt.endcomment = "" end function opt_map.nocomment() g_opt.comment = false end function opt_map.maccomment() g_opt.maccomment = true end function opt_map.nolineno() g_opt.cpp = false end function opt_map.flushline() g_opt.flushline = true end function opt_map.dumpdef() g_opt.dumpdef = g_opt.dumpdef + 1 end ------------------------------------------------------------------------------ -- Short aliases for long options. local opt_alias = { h = "help", ["?"] = "help", V = "version", o = "outfile", I = "include", c = "ccomment", C = "cppcomment", N = "nocomment", M = "maccomment", L = "nolineno", F = "flushline", P = "dumpdef", A = "dumparch", } -- Parse single option. local function parseopt(opt, args) opt_current = #opt == 1 and "-"..opt or "--"..opt local f = opt_map[opt] or opt_map[opt_alias[opt]] if not f then opterror("unrecognized option `", opt_current, "'. Try `--help'.\n") end f(args) end -- Parse arguments. local function parseargs(args) -- Default options. g_opt.comment = "//|" g_opt.endcomment = "" g_opt.cpp = true g_opt.dumpdef = 0 g_opt.include = { "" } -- Process all option arguments. args.argn = 1 repeat local a = args[args.argn] if not a then break end local lopt, opt = match(a, "^%-(%-?)(.+)") if not opt then break end args.argn = args.argn + 1 if lopt == "" then -- Loop through short options. for o in gmatch(opt, ".") do parseopt(o, args) end else -- Long option. parseopt(opt, args) end until false -- Check for proper number of arguments. local nargs = #args - args.argn + 1 if nargs ~= 1 then if nargs == 0 then if g_opt.dumpdef > 0 then return dumpdef(stdout) end end opt_map.help() end -- Translate a single input file to a single output file -- TODO: Handle multiple files? translate(args[args.argn], g_opt.outfile) end ------------------------------------------------------------------------------ -- Add the directory dynasm.lua resides in to the Lua module search path. local arg = arg if arg and arg[0] then prefix = match(arg[0], "^(.*[/\\])") if package and prefix then package.path = prefix.."?.lua;"..package.path end end -- Start DynASM. parseargs{...} ------------------------------------------------------------------------------ MoarVM-2015.11/3rdparty/dynasm/minilua.c0000644000175000017500000052443412456307242016736 0ustar jnthnjnthn/* This is a heavily customized and minimized copy of Lua 5.1.5. */ /* It's only used to build LuaJIT. It does NOT have all standard functions! */ /****************************************************************************** * Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved. * * 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. ******************************************************************************/ #ifdef _MSC_VER typedef unsigned __int64 U64; #else typedef unsigned long long U64; #endif int _CRT_glob = 0; #include #include #include #include #include #include #include #include #include #include #include typedef enum{ TM_INDEX, TM_NEWINDEX, TM_GC, TM_MODE, TM_EQ, TM_ADD, TM_SUB, TM_MUL, TM_DIV, TM_MOD, TM_POW, TM_UNM, TM_LEN, TM_LT, TM_LE, TM_CONCAT, TM_CALL, TM_N }TMS; enum OpMode{iABC,iABx,iAsBx}; typedef enum{ OP_MOVE, OP_LOADK, OP_LOADBOOL, OP_LOADNIL, OP_GETUPVAL, OP_GETGLOBAL, OP_GETTABLE, OP_SETGLOBAL, OP_SETUPVAL, OP_SETTABLE, OP_NEWTABLE, OP_SELF, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_POW, OP_UNM, OP_NOT, OP_LEN, OP_CONCAT, OP_JMP, OP_EQ, OP_LT, OP_LE, OP_TEST, OP_TESTSET, OP_CALL, OP_TAILCALL, OP_RETURN, OP_FORLOOP, OP_FORPREP, OP_TFORLOOP, OP_SETLIST, OP_CLOSE, OP_CLOSURE, OP_VARARG }OpCode; enum OpArgMask{ OpArgN, OpArgU, OpArgR, OpArgK }; typedef enum{ VVOID, VNIL, VTRUE, VFALSE, VK, VKNUM, VLOCAL, VUPVAL, VGLOBAL, VINDEXED, VJMP, VRELOCABLE, VNONRELOC, VCALL, VVARARG }expkind; enum RESERVED{ TK_AND=257,TK_BREAK, TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION, TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT, TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE, TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER, TK_NAME,TK_STRING,TK_EOS }; typedef enum BinOpr{ OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW, OPR_CONCAT, OPR_NE,OPR_EQ, OPR_LT,OPR_LE,OPR_GT,OPR_GE, OPR_AND,OPR_OR, OPR_NOBINOPR }BinOpr; typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr; #define LUA_QL(x)"'"x"'" #define luai_apicheck(L,o){(void)L;} #define lua_number2str(s,n)sprintf((s),"%.14g",(n)) #define lua_str2number(s,p)strtod((s),(p)) #define luai_numadd(a,b)((a)+(b)) #define luai_numsub(a,b)((a)-(b)) #define luai_nummul(a,b)((a)*(b)) #define luai_numdiv(a,b)((a)/(b)) #define luai_nummod(a,b)((a)-floor((a)/(b))*(b)) #define luai_numpow(a,b)(pow(a,b)) #define luai_numunm(a)(-(a)) #define luai_numeq(a,b)((a)==(b)) #define luai_numlt(a,b)((a)<(b)) #define luai_numle(a,b)((a)<=(b)) #define luai_numisnan(a)(!luai_numeq((a),(a))) #define lua_number2int(i,d)((i)=(int)(d)) #define lua_number2integer(i,d)((i)=(lua_Integer)(d)) #define LUAI_THROW(L,c)longjmp((c)->b,1) #define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a} #define lua_pclose(L,file)((void)((void)L,file),0) #define lua_upvalueindex(i)((-10002)-(i)) typedef struct lua_State lua_State; typedef int(*lua_CFunction)(lua_State*L); typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz); typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize); typedef double lua_Number; typedef ptrdiff_t lua_Integer; static void lua_settop(lua_State*L,int idx); static int lua_type(lua_State*L,int idx); static const char* lua_tolstring(lua_State*L,int idx,size_t*len); static size_t lua_objlen(lua_State*L,int idx); static void lua_pushlstring(lua_State*L,const char*s,size_t l); static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n); static void lua_createtable(lua_State*L,int narr,int nrec); static void lua_setfield(lua_State*L,int idx,const char*k); #define lua_pop(L,n)lua_settop(L,-(n)-1) #define lua_newtable(L)lua_createtable(L,0,0) #define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0) #define lua_strlen(L,i)lua_objlen(L,(i)) #define lua_isfunction(L,n)(lua_type(L,(n))==6) #define lua_istable(L,n)(lua_type(L,(n))==5) #define lua_isnil(L,n)(lua_type(L,(n))==0) #define lua_isboolean(L,n)(lua_type(L,(n))==1) #define lua_isnone(L,n)(lua_type(L,(n))==(-1)) #define lua_isnoneornil(L,n)(lua_type(L,(n))<=0) #define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1) #define lua_setglobal(L,s)lua_setfield(L,(-10002),(s)) #define lua_tostring(L,i)lua_tolstring(L,(i),NULL) typedef struct lua_Debug lua_Debug; typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar); struct lua_Debug{ int event; const char*name; const char*namewhat; const char*what; const char*source; int currentline; int nups; int linedefined; int lastlinedefined; char short_src[60]; int i_ci; }; typedef unsigned int lu_int32; typedef size_t lu_mem; typedef ptrdiff_t l_mem; typedef unsigned char lu_byte; #define IntPoint(p)((unsigned int)(lu_mem)(p)) typedef union{double u;void*s;long l;}L_Umaxalign; typedef double l_uacNumber; #define check_exp(c,e)(e) #define UNUSED(x)((void)(x)) #define cast(t,exp)((t)(exp)) #define cast_byte(i)cast(lu_byte,(i)) #define cast_num(i)cast(lua_Number,(i)) #define cast_int(i)cast(int,(i)) typedef lu_int32 Instruction; #define condhardstacktests(x)((void)0) typedef union GCObject GCObject; typedef struct GCheader{ GCObject*next;lu_byte tt;lu_byte marked; }GCheader; typedef union{ GCObject*gc; void*p; lua_Number n; int b; }Value; typedef struct lua_TValue{ Value value;int tt; }TValue; #define ttisnil(o)(ttype(o)==0) #define ttisnumber(o)(ttype(o)==3) #define ttisstring(o)(ttype(o)==4) #define ttistable(o)(ttype(o)==5) #define ttisfunction(o)(ttype(o)==6) #define ttisboolean(o)(ttype(o)==1) #define ttisuserdata(o)(ttype(o)==7) #define ttisthread(o)(ttype(o)==8) #define ttislightuserdata(o)(ttype(o)==2) #define ttype(o)((o)->tt) #define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc) #define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p) #define nvalue(o)check_exp(ttisnumber(o),(o)->value.n) #define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts) #define tsvalue(o)(&rawtsvalue(o)->tsv) #define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u) #define uvalue(o)(&rawuvalue(o)->uv) #define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl) #define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h) #define bvalue(o)check_exp(ttisboolean(o),(o)->value.b) #define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th) #define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0)) #define checkconsistency(obj) #define checkliveness(g,obj) #define setnilvalue(obj)((obj)->tt=0) #define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;} #define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;} #define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);} #define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);} #define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);} #define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);} #define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);} #define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);} #define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);} #define setttype(obj,tt)(ttype(obj)=(tt)) #define iscollectable(o)(ttype(o)>=4) typedef TValue*StkId; typedef union TString{ L_Umaxalign dummy; struct{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte reserved; unsigned int hash; size_t len; }tsv; }TString; #define getstr(ts)cast(const char*,(ts)+1) #define svalue(o)getstr(rawtsvalue(o)) typedef union Udata{ L_Umaxalign dummy; struct{ GCObject*next;lu_byte tt;lu_byte marked; struct Table*metatable; struct Table*env; size_t len; }uv; }Udata; typedef struct Proto{ GCObject*next;lu_byte tt;lu_byte marked; TValue*k; Instruction*code; struct Proto**p; int*lineinfo; struct LocVar*locvars; TString**upvalues; TString*source; int sizeupvalues; int sizek; int sizecode; int sizelineinfo; int sizep; int sizelocvars; int linedefined; int lastlinedefined; GCObject*gclist; lu_byte nups; lu_byte numparams; lu_byte is_vararg; lu_byte maxstacksize; }Proto; typedef struct LocVar{ TString*varname; int startpc; int endpc; }LocVar; typedef struct UpVal{ GCObject*next;lu_byte tt;lu_byte marked; TValue*v; union{ TValue value; struct{ struct UpVal*prev; struct UpVal*next; }l; }u; }UpVal; typedef struct CClosure{ GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; lua_CFunction f; TValue upvalue[1]; }CClosure; typedef struct LClosure{ GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; struct Proto*p; UpVal*upvals[1]; }LClosure; typedef union Closure{ CClosure c; LClosure l; }Closure; #define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC) typedef union TKey{ struct{ Value value;int tt; struct Node*next; }nk; TValue tvk; }TKey; typedef struct Node{ TValue i_val; TKey i_key; }Node; typedef struct Table{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte flags; lu_byte lsizenode; struct Table*metatable; TValue*array; Node*node; Node*lastfree; GCObject*gclist; int sizearray; }Table; #define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1))))) #define twoto(x)((size_t)1<<(x)) #define sizenode(t)(twoto((t)->lsizenode)) static const TValue luaO_nilobject_; #define ceillog2(x)(luaO_log2((x)-1)+1) static int luaO_log2(unsigned int x); #define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e])) #define fasttm(l,et,e)gfasttm(G(l),et,e) static const TValue*luaT_gettm(Table*events,TMS event,TString*ename); #define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L)) #define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0) #define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0) #define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t)) #define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t)) #define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t))) #define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t))) #define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) #define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t)))) static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize, size_t size); static void*luaM_toobig(lua_State*L); static void*luaM_growaux_(lua_State*L,void*block,int*size, size_t size_elem,int limit, const char*errormsg); typedef struct Zio ZIO; #define char2int(c)cast(int,cast(unsigned char,(c))) #define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z)) typedef struct Mbuffer{ char*buffer; size_t n; size_t buffsize; }Mbuffer; #define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0) #define luaZ_buffer(buff)((buff)->buffer) #define luaZ_sizebuffer(buff)((buff)->buffsize) #define luaZ_bufflen(buff)((buff)->n) #define luaZ_resetbuffer(buff)((buff)->n=0) #define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size) #define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0) struct Zio{ size_t n; const char*p; lua_Reader reader; void*data; lua_State*L; }; static int luaZ_fill(ZIO*z); struct lua_longjmp; #define gt(L)(&L->l_gt) #define registry(L)(&G(L)->l_registry) typedef struct stringtable{ GCObject**hash; lu_int32 nuse; int size; }stringtable; typedef struct CallInfo{ StkId base; StkId func; StkId top; const Instruction*savedpc; int nresults; int tailcalls; }CallInfo; #define curr_func(L)(clvalue(L->ci->func)) #define ci_func(ci)(clvalue((ci)->func)) #define f_isLua(ci)(!ci_func(ci)->c.isC) #define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci)) typedef struct global_State{ stringtable strt; lua_Alloc frealloc; void*ud; lu_byte currentwhite; lu_byte gcstate; int sweepstrgc; GCObject*rootgc; GCObject**sweepgc; GCObject*gray; GCObject*grayagain; GCObject*weak; GCObject*tmudata; Mbuffer buff; lu_mem GCthreshold; lu_mem totalbytes; lu_mem estimate; lu_mem gcdept; int gcpause; int gcstepmul; lua_CFunction panic; TValue l_registry; struct lua_State*mainthread; UpVal uvhead; struct Table*mt[(8+1)]; TString*tmname[TM_N]; }global_State; struct lua_State{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte status; StkId top; StkId base; global_State*l_G; CallInfo*ci; const Instruction*savedpc; StkId stack_last; StkId stack; CallInfo*end_ci; CallInfo*base_ci; int stacksize; int size_ci; unsigned short nCcalls; unsigned short baseCcalls; lu_byte hookmask; lu_byte allowhook; int basehookcount; int hookcount; lua_Hook hook; TValue l_gt; TValue env; GCObject*openupval; GCObject*gclist; struct lua_longjmp*errorJmp; ptrdiff_t errfunc; }; #define G(L)(L->l_G) union GCObject{ GCheader gch; union TString ts; union Udata u; union Closure cl; struct Table h; struct Proto p; struct UpVal uv; struct lua_State th; }; #define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts)) #define gco2ts(o)(&rawgco2ts(o)->tsv) #define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u)) #define gco2u(o)(&rawgco2u(o)->uv) #define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl)) #define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h)) #define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p)) #define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv)) #define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv)) #define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th)) #define obj2gco(v)(cast(GCObject*,(v))) static void luaE_freethread(lua_State*L,lua_State*L1); #define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1) #define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0) #define resethookcount(L)(L->hookcount=L->basehookcount) static void luaG_typeerror(lua_State*L,const TValue*o, const char*opname); static void luaG_runerror(lua_State*L,const char*fmt,...); #define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1)); #define incr_top(L){luaD_checkstack(L,1);L->top++;} #define savestack(L,p)((char*)(p)-(char*)L->stack) #define restorestack(L,n)((TValue*)((char*)L->stack+(n))) #define saveci(L,p)((char*)(p)-(char*)L->base_ci) #define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n))) typedef void(*Pfunc)(lua_State*L,void*ud); static int luaD_poscall(lua_State*L,StkId firstResult); static void luaD_reallocCI(lua_State*L,int newsize); static void luaD_reallocstack(lua_State*L,int newsize); static void luaD_growstack(lua_State*L,int n); static void luaD_throw(lua_State*L,int errcode); static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems, int limit,const char*errormsg){ void*newblock; int newsize; if(*size>=limit/2){ if(*size>=limit) luaG_runerror(L,errormsg); newsize=limit; } else{ newsize=(*size)*2; if(newsize<4) newsize=4; } newblock=luaM_reallocv(L,block,*size,newsize,size_elems); *size=newsize; return newblock; } static void*luaM_toobig(lua_State*L){ luaG_runerror(L,"memory allocation error: block too big"); return NULL; } static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){ global_State*g=G(L); block=(*g->frealloc)(g->ud,block,osize,nsize); if(block==NULL&&nsize>0) luaD_throw(L,4); g->totalbytes=(g->totalbytes-osize)+nsize; return block; } #define resetbits(x,m)((x)&=cast(lu_byte,~(m))) #define setbits(x,m)((x)|=(m)) #define testbits(x,m)((x)&(m)) #define bitmask(b)(1<<(b)) #define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2)) #define l_setbit(x,b)setbits(x,bitmask(b)) #define resetbit(x,b)resetbits(x,bitmask(b)) #define testbit(x,b)testbits(x,bitmask(b)) #define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2))) #define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2))) #define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2))) #define iswhite(x)test2bits((x)->gch.marked,0,1) #define isblack(x)testbit((x)->gch.marked,2) #define isgray(x)(!isblack(x)&&!iswhite(x)) #define otherwhite(g)(g->currentwhite^bit2mask(0,1)) #define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1)) #define changewhite(x)((x)->gch.marked^=bit2mask(0,1)) #define gray2black(x)l_setbit((x)->gch.marked,2) #define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x))) #define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1)) #define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);} #define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));} #define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);} #define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));} #define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);} static void luaC_step(lua_State*L); static void luaC_link(lua_State*L,GCObject*o,lu_byte tt); static void luaC_linkupval(lua_State*L,UpVal*uv); static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v); static void luaC_barrierback(lua_State*L,Table*t); #define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char)) #define sizeudata(u)(sizeof(union Udata)+(u)->len) #define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s))) #define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1)) #define luaS_fix(s)l_setbit((s)->tsv.marked,5) static TString*luaS_newlstr(lua_State*L,const char*str,size_t l); #define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o))) #define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL)) #define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2)) static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2); static const TValue*luaV_tonumber(const TValue*obj,TValue*n); static int luaV_tostring(lua_State*L,StkId obj); static void luaV_execute(lua_State*L,int nexeccalls); static void luaV_concat(lua_State*L,int total,int last); static const TValue luaO_nilobject_={{NULL},0}; static int luaO_int2fb(unsigned int x){ int e=0; while(x>=16){ x=(x+1)>>1; e++; } if(x<8)return x; else return((e+1)<<3)|(cast_int(x)-8); } static int luaO_fb2int(int x){ int e=(x>>3)&31; if(e==0)return x; else return((x&7)+8)<<(e-1); } static int luaO_log2(unsigned int x){ static const lu_byte log_2[256]={ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 }; int l=-1; while(x>=256){l+=8;x>>=8;} return l+log_2[x]; } static int luaO_rawequalObj(const TValue*t1,const TValue*t2){ if(ttype(t1)!=ttype(t2))return 0; else switch(ttype(t1)){ case 0: return 1; case 3: return luai_numeq(nvalue(t1),nvalue(t2)); case 1: return bvalue(t1)==bvalue(t2); case 2: return pvalue(t1)==pvalue(t2); default: return gcvalue(t1)==gcvalue(t2); } } static int luaO_str2d(const char*s,lua_Number*result){ char*endptr; *result=lua_str2number(s,&endptr); if(endptr==s)return 0; if(*endptr=='x'||*endptr=='X') *result=cast_num(strtoul(s,&endptr,16)); if(*endptr=='\0')return 1; while(isspace(cast(unsigned char,*endptr)))endptr++; if(*endptr!='\0')return 0; return 1; } static void pushstr(lua_State*L,const char*str){ setsvalue(L,L->top,luaS_new(L,str)); incr_top(L); } static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){ int n=1; pushstr(L,""); for(;;){ const char*e=strchr(fmt,'%'); if(e==NULL)break; setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt)); incr_top(L); switch(*(e+1)){ case's':{ const char*s=va_arg(argp,char*); if(s==NULL)s="(null)"; pushstr(L,s); break; } case'c':{ char buff[2]; buff[0]=cast(char,va_arg(argp,int)); buff[1]='\0'; pushstr(L,buff); break; } case'd':{ setnvalue(L->top,cast_num(va_arg(argp,int))); incr_top(L); break; } case'f':{ setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber))); incr_top(L); break; } case'p':{ char buff[4*sizeof(void*)+8]; sprintf(buff,"%p",va_arg(argp,void*)); pushstr(L,buff); break; } case'%':{ pushstr(L,"%"); break; } default:{ char buff[3]; buff[0]='%'; buff[1]=*(e+1); buff[2]='\0'; pushstr(L,buff); break; } } n+=2; fmt=e+2; } pushstr(L,fmt); luaV_concat(L,n+1,cast_int(L->top-L->base)-1); L->top-=n; return svalue(L->top-1); } static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){ const char*msg; va_list argp; va_start(argp,fmt); msg=luaO_pushvfstring(L,fmt,argp); va_end(argp); return msg; } static void luaO_chunkid(char*out,const char*source,size_t bufflen){ if(*source=='='){ strncpy(out,source+1,bufflen); out[bufflen-1]='\0'; } else{ if(*source=='@'){ size_t l; source++; bufflen-=sizeof(" '...' "); l=strlen(source); strcpy(out,""); if(l>bufflen){ source+=(l-bufflen); strcat(out,"..."); } strcat(out,source); } else{ size_t len=strcspn(source,"\n\r"); bufflen-=sizeof(" [string \"...\"] "); if(len>bufflen)len=bufflen; strcpy(out,"[string \""); if(source[len]!='\0'){ strncat(out,source,len); strcat(out,"..."); } else strcat(out,source); strcat(out,"\"]"); } } } #define gnode(t,i)(&(t)->node[i]) #define gkey(n)(&(n)->i_key.nk) #define gval(n)(&(n)->i_val) #define gnext(n)((n)->i_key.nk.next) #define key2tval(n)(&(n)->i_key.tvk) static TValue*luaH_setnum(lua_State*L,Table*t,int key); static const TValue*luaH_getstr(Table*t,TString*key); static TValue*luaH_set(lua_State*L,Table*t,const TValue*key); static const char*const luaT_typenames[]={ "nil","boolean","userdata","number", "string","table","function","userdata","thread", "proto","upval" }; static void luaT_init(lua_State*L){ static const char*const luaT_eventname[]={ "__index","__newindex", "__gc","__mode","__eq", "__add","__sub","__mul","__div","__mod", "__pow","__unm","__len","__lt","__le", "__concat","__call" }; int i; for(i=0;itmname[i]=luaS_new(L,luaT_eventname[i]); luaS_fix(G(L)->tmname[i]); } } static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){ const TValue*tm=luaH_getstr(events,ename); if(ttisnil(tm)){ events->flags|=cast_byte(1u<metatable; break; case 7: mt=uvalue(o)->metatable; break; default: mt=G(L)->mt[ttype(o)]; } return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_)); } #define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1))) #define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1))) static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){ Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems))); luaC_link(L,obj2gco(c),6); c->c.isC=1; c->c.env=e; c->c.nupvalues=cast_byte(nelems); return c; } static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){ Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems))); luaC_link(L,obj2gco(c),6); c->l.isC=0; c->l.env=e; c->l.nupvalues=cast_byte(nelems); while(nelems--)c->l.upvals[nelems]=NULL; return c; } static UpVal*luaF_newupval(lua_State*L){ UpVal*uv=luaM_new(L,UpVal); luaC_link(L,obj2gco(uv),(8+2)); uv->v=&uv->u.value; setnilvalue(uv->v); return uv; } static UpVal*luaF_findupval(lua_State*L,StkId level){ global_State*g=G(L); GCObject**pp=&L->openupval; UpVal*p; UpVal*uv; while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){ if(p->v==level){ if(isdead(g,obj2gco(p))) changewhite(obj2gco(p)); return p; } pp=&p->next; } uv=luaM_new(L,UpVal); uv->tt=(8+2); uv->marked=luaC_white(g); uv->v=level; uv->next=*pp; *pp=obj2gco(uv); uv->u.l.prev=&g->uvhead; uv->u.l.next=g->uvhead.u.l.next; uv->u.l.next->u.l.prev=uv; g->uvhead.u.l.next=uv; return uv; } static void unlinkupval(UpVal*uv){ uv->u.l.next->u.l.prev=uv->u.l.prev; uv->u.l.prev->u.l.next=uv->u.l.next; } static void luaF_freeupval(lua_State*L,UpVal*uv){ if(uv->v!=&uv->u.value) unlinkupval(uv); luaM_free(L,uv); } static void luaF_close(lua_State*L,StkId level){ UpVal*uv; global_State*g=G(L); while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){ GCObject*o=obj2gco(uv); L->openupval=uv->next; if(isdead(g,o)) luaF_freeupval(L,uv); else{ unlinkupval(uv); setobj(L,&uv->u.value,uv->v); uv->v=&uv->u.value; luaC_linkupval(L,uv); } } } static Proto*luaF_newproto(lua_State*L){ Proto*f=luaM_new(L,Proto); luaC_link(L,obj2gco(f),(8+1)); f->k=NULL; f->sizek=0; f->p=NULL; f->sizep=0; f->code=NULL; f->sizecode=0; f->sizelineinfo=0; f->sizeupvalues=0; f->nups=0; f->upvalues=NULL; f->numparams=0; f->is_vararg=0; f->maxstacksize=0; f->lineinfo=NULL; f->sizelocvars=0; f->locvars=NULL; f->linedefined=0; f->lastlinedefined=0; f->source=NULL; return f; } static void luaF_freeproto(lua_State*L,Proto*f){ luaM_freearray(L,f->code,f->sizecode,Instruction); luaM_freearray(L,f->p,f->sizep,Proto*); luaM_freearray(L,f->k,f->sizek,TValue); luaM_freearray(L,f->lineinfo,f->sizelineinfo,int); luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar); luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*); luaM_free(L,f); } static void luaF_freeclosure(lua_State*L,Closure*c){ int size=(c->c.isC)?sizeCclosure(c->c.nupvalues): sizeLclosure(c->l.nupvalues); luaM_freemem(L,c,size); } #define MASK1(n,p)((~((~(Instruction)0)<>0)&MASK1(6,0))) #define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0)))) #define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0))) #define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6))))) #define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0))) #define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9))))) #define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0))) #define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8))))) #define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0))) #define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8))))) #define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1)) #define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1))) #define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8))) #define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8))) #define ISK(x)((x)&(1<<(9-1))) #define INDEXK(r)((int)(r)&~(1<<(9-1))) #define RKASK(x)((x)|(1<<(9-1))) static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]; #define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3)) #define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3)) #define testTMode(m)(luaP_opmodes[m]&(1<<7)) typedef struct expdesc{ expkind k; union{ struct{int info,aux;}s; lua_Number nval; }u; int t; int f; }expdesc; typedef struct upvaldesc{ lu_byte k; lu_byte info; }upvaldesc; struct BlockCnt; typedef struct FuncState{ Proto*f; Table*h; struct FuncState*prev; struct LexState*ls; struct lua_State*L; struct BlockCnt*bl; int pc; int lasttarget; int jpc; int freereg; int nk; int np; short nlocvars; lu_byte nactvar; upvaldesc upvalues[60]; unsigned short actvar[200]; }FuncState; static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff, const char*name); struct lua_longjmp{ struct lua_longjmp*previous; jmp_buf b; volatile int status; }; static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){ switch(errcode){ case 4:{ setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory")); break; } case 5:{ setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling")); break; } case 3: case 2:{ setobj(L,oldtop,L->top-1); break; } } L->top=oldtop+1; } static void restore_stack_limit(lua_State*L){ if(L->size_ci>20000){ int inuse=cast_int(L->ci-L->base_ci); if(inuse+1<20000) luaD_reallocCI(L,20000); } } static void resetstack(lua_State*L,int status){ L->ci=L->base_ci; L->base=L->ci->base; luaF_close(L,L->base); luaD_seterrorobj(L,status,L->base); L->nCcalls=L->baseCcalls; L->allowhook=1; restore_stack_limit(L); L->errfunc=0; L->errorJmp=NULL; } static void luaD_throw(lua_State*L,int errcode){ if(L->errorJmp){ L->errorJmp->status=errcode; LUAI_THROW(L,L->errorJmp); } else{ L->status=cast_byte(errcode); if(G(L)->panic){ resetstack(L,errcode); G(L)->panic(L); } exit(EXIT_FAILURE); } } static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){ struct lua_longjmp lj; lj.status=0; lj.previous=L->errorJmp; L->errorJmp=&lj; LUAI_TRY(L,&lj, (*f)(L,ud); ); L->errorJmp=lj.previous; return lj.status; } static void correctstack(lua_State*L,TValue*oldstack){ CallInfo*ci; GCObject*up; L->top=(L->top-oldstack)+L->stack; for(up=L->openupval;up!=NULL;up=up->gch.next) gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack; for(ci=L->base_ci;ci<=L->ci;ci++){ ci->top=(ci->top-oldstack)+L->stack; ci->base=(ci->base-oldstack)+L->stack; ci->func=(ci->func-oldstack)+L->stack; } L->base=(L->base-oldstack)+L->stack; } static void luaD_reallocstack(lua_State*L,int newsize){ TValue*oldstack=L->stack; int realsize=newsize+1+5; luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue); L->stacksize=realsize; L->stack_last=L->stack+newsize; correctstack(L,oldstack); } static void luaD_reallocCI(lua_State*L,int newsize){ CallInfo*oldci=L->base_ci; luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo); L->size_ci=newsize; L->ci=(L->ci-oldci)+L->base_ci; L->end_ci=L->base_ci+L->size_ci-1; } static void luaD_growstack(lua_State*L,int n){ if(n<=L->stacksize) luaD_reallocstack(L,2*L->stacksize); else luaD_reallocstack(L,L->stacksize+n); } static CallInfo*growCI(lua_State*L){ if(L->size_ci>20000) luaD_throw(L,5); else{ luaD_reallocCI(L,2*L->size_ci); if(L->size_ci>20000) luaG_runerror(L,"stack overflow"); } return++L->ci; } static StkId adjust_varargs(lua_State*L,Proto*p,int actual){ int i; int nfixargs=p->numparams; Table*htab=NULL; StkId base,fixed; for(;actualtop++); fixed=L->top-actual; base=L->top; for(i=0;itop++,fixed+i); setnilvalue(fixed+i); } if(htab){ sethvalue(L,L->top++,htab); } return base; } static StkId tryfuncTM(lua_State*L,StkId func){ const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL); StkId p; ptrdiff_t funcr=savestack(L,func); if(!ttisfunction(tm)) luaG_typeerror(L,func,"call"); for(p=L->top;p>func;p--)setobj(L,p,p-1); incr_top(L); func=restorestack(L,funcr); setobj(L,func,tm); return func; } #define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci)) static int luaD_precall(lua_State*L,StkId func,int nresults){ LClosure*cl; ptrdiff_t funcr; if(!ttisfunction(func)) func=tryfuncTM(L,func); funcr=savestack(L,func); cl=&clvalue(func)->l; L->ci->savedpc=L->savedpc; if(!cl->isC){ CallInfo*ci; StkId st,base; Proto*p=cl->p; luaD_checkstack(L,p->maxstacksize); func=restorestack(L,funcr); if(!p->is_vararg){ base=func+1; if(L->top>base+p->numparams) L->top=base+p->numparams; } else{ int nargs=cast_int(L->top-func)-1; base=adjust_varargs(L,p,nargs); func=restorestack(L,funcr); } ci=inc_ci(L); ci->func=func; L->base=ci->base=base; ci->top=L->base+p->maxstacksize; L->savedpc=p->code; ci->tailcalls=0; ci->nresults=nresults; for(st=L->top;sttop;st++) setnilvalue(st); L->top=ci->top; return 0; } else{ CallInfo*ci; int n; luaD_checkstack(L,20); ci=inc_ci(L); ci->func=restorestack(L,funcr); L->base=ci->base=ci->func+1; ci->top=L->top+20; ci->nresults=nresults; n=(*curr_func(L)->c.f)(L); if(n<0) return 2; else{ luaD_poscall(L,L->top-n); return 1; } } } static int luaD_poscall(lua_State*L,StkId firstResult){ StkId res; int wanted,i; CallInfo*ci; ci=L->ci--; res=ci->func; wanted=ci->nresults; L->base=(ci-1)->base; L->savedpc=(ci-1)->savedpc; for(i=wanted;i!=0&&firstResulttop;i--) setobj(L,res++,firstResult++); while(i-->0) setnilvalue(res++); L->top=res; return(wanted-(-1)); } static void luaD_call(lua_State*L,StkId func,int nResults){ if(++L->nCcalls>=200){ if(L->nCcalls==200) luaG_runerror(L,"C stack overflow"); else if(L->nCcalls>=(200+(200>>3))) luaD_throw(L,5); } if(luaD_precall(L,func,nResults)==0) luaV_execute(L,1); L->nCcalls--; luaC_checkGC(L); } static int luaD_pcall(lua_State*L,Pfunc func,void*u, ptrdiff_t old_top,ptrdiff_t ef){ int status; unsigned short oldnCcalls=L->nCcalls; ptrdiff_t old_ci=saveci(L,L->ci); lu_byte old_allowhooks=L->allowhook; ptrdiff_t old_errfunc=L->errfunc; L->errfunc=ef; status=luaD_rawrunprotected(L,func,u); if(status!=0){ StkId oldtop=restorestack(L,old_top); luaF_close(L,oldtop); luaD_seterrorobj(L,status,oldtop); L->nCcalls=oldnCcalls; L->ci=restoreci(L,old_ci); L->base=L->ci->base; L->savedpc=L->ci->savedpc; L->allowhook=old_allowhooks; restore_stack_limit(L); } L->errfunc=old_errfunc; return status; } struct SParser{ ZIO*z; Mbuffer buff; const char*name; }; static void f_parser(lua_State*L,void*ud){ int i; Proto*tf; Closure*cl; struct SParser*p=cast(struct SParser*,ud); luaC_checkGC(L); tf=luaY_parser(L,p->z, &p->buff,p->name); cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L))); cl->l.p=tf; for(i=0;inups;i++) cl->l.upvals[i]=luaF_newupval(L); setclvalue(L,L->top,cl); incr_top(L); } static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){ struct SParser p; int status; p.z=z;p.name=name; luaZ_initbuffer(L,&p.buff); status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc); luaZ_freebuffer(L,&p.buff); return status; } static void luaS_resize(lua_State*L,int newsize){ GCObject**newhash; stringtable*tb; int i; if(G(L)->gcstate==2) return; newhash=luaM_newvector(L,newsize,GCObject*); tb=&G(L)->strt; for(i=0;isize;i++){ GCObject*p=tb->hash[i]; while(p){ GCObject*next=p->gch.next; unsigned int h=gco2ts(p)->hash; int h1=lmod(h,newsize); p->gch.next=newhash[h1]; newhash[h1]=p; p=next; } } luaM_freearray(L,tb->hash,tb->size,TString*); tb->size=newsize; tb->hash=newhash; } static TString*newlstr(lua_State*L,const char*str,size_t l, unsigned int h){ TString*ts; stringtable*tb; if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char)) luaM_toobig(L); ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString))); ts->tsv.len=l; ts->tsv.hash=h; ts->tsv.marked=luaC_white(G(L)); ts->tsv.tt=4; ts->tsv.reserved=0; memcpy(ts+1,str,l*sizeof(char)); ((char*)(ts+1))[l]='\0'; tb=&G(L)->strt; h=lmod(h,tb->size); ts->tsv.next=tb->hash[h]; tb->hash[h]=obj2gco(ts); tb->nuse++; if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2) luaS_resize(L,tb->size*2); return ts; } static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){ GCObject*o; unsigned int h=cast(unsigned int,l); size_t step=(l>>5)+1; size_t l1; for(l1=l;l1>=step;l1-=step) h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1])); for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)]; o!=NULL; o=o->gch.next){ TString*ts=rawgco2ts(o); if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){ if(isdead(G(L),o))changewhite(o); return ts; } } return newlstr(L,str,l,h); } static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){ Udata*u; if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata)) luaM_toobig(L); u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata))); u->uv.marked=luaC_white(G(L)); u->uv.tt=7; u->uv.len=s; u->uv.metatable=NULL; u->uv.env=e; u->uv.next=G(L)->mainthread->next; G(L)->mainthread->next=obj2gco(u); return u; } #define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t)))) #define hashstr(t,str)hashpow2(t,(str)->tsv.hash) #define hashboolean(t,p)hashpow2(t,p) #define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1)))) #define hashpointer(t,p)hashmod(t,IntPoint(p)) static const Node dummynode_={ {{NULL},0}, {{{NULL},0,NULL}} }; static Node*hashnum(const Table*t,lua_Number n){ unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))]; int i; if(luai_numeq(n,0)) return gnode(t,0); memcpy(a,&n,sizeof(a)); for(i=1;isizearray) return i-1; else{ Node*n=mainposition(t,key); do{ if(luaO_rawequalObj(key2tval(n),key)|| (ttype(gkey(n))==(8+3)&&iscollectable(key)&& gcvalue(gkey(n))==gcvalue(key))){ i=cast_int(n-gnode(t,0)); return i+t->sizearray; } else n=gnext(n); }while(n); luaG_runerror(L,"invalid key to "LUA_QL("next")); return 0; } } static int luaH_next(lua_State*L,Table*t,StkId key){ int i=findindex(L,t,key); for(i++;isizearray;i++){ if(!ttisnil(&t->array[i])){ setnvalue(key,cast_num(i+1)); setobj(L,key+1,&t->array[i]); return 1; } } for(i-=t->sizearray;i<(int)sizenode(t);i++){ if(!ttisnil(gval(gnode(t,i)))){ setobj(L,key,key2tval(gnode(t,i))); setobj(L,key+1,gval(gnode(t,i))); return 1; } } return 0; } static int computesizes(int nums[],int*narray){ int i; int twotoi; int a=0; int na=0; int n=0; for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){ if(nums[i]>0){ a+=nums[i]; if(a>twotoi/2){ n=twotoi; na=a; } } if(a==*narray)break; } *narray=n; return na; } static int countint(const TValue*key,int*nums){ int k=arrayindex(key); if(0t->sizearray){ lim=t->sizearray; if(i>lim) break; } for(;i<=lim;i++){ if(!ttisnil(&t->array[i-1])) lc++; } nums[lg]+=lc; ause+=lc; } return ause; } static int numusehash(const Table*t,int*nums,int*pnasize){ int totaluse=0; int ause=0; int i=sizenode(t); while(i--){ Node*n=&t->node[i]; if(!ttisnil(gval(n))){ ause+=countint(key2tval(n),nums); totaluse++; } } *pnasize+=ause; return totaluse; } static void setarrayvector(lua_State*L,Table*t,int size){ int i; luaM_reallocvector(L,t->array,t->sizearray,size,TValue); for(i=t->sizearray;iarray[i]); t->sizearray=size; } static void setnodevector(lua_State*L,Table*t,int size){ int lsize; if(size==0){ t->node=cast(Node*,(&dummynode_)); lsize=0; } else{ int i; lsize=ceillog2(size); if(lsize>(32-2)) luaG_runerror(L,"table overflow"); size=twoto(lsize); t->node=luaM_newvector(L,size,Node); for(i=0;ilsizenode=cast_byte(lsize); t->lastfree=gnode(t,size); } static void resize(lua_State*L,Table*t,int nasize,int nhsize){ int i; int oldasize=t->sizearray; int oldhsize=t->lsizenode; Node*nold=t->node; if(nasize>oldasize) setarrayvector(L,t,nasize); setnodevector(L,t,nhsize); if(nasizesizearray=nasize; for(i=nasize;iarray[i])) setobj(L,luaH_setnum(L,t,i+1),&t->array[i]); } luaM_reallocvector(L,t->array,oldasize,nasize,TValue); } for(i=twoto(oldhsize)-1;i>=0;i--){ Node*old=nold+i; if(!ttisnil(gval(old))) setobj(L,luaH_set(L,t,key2tval(old)),gval(old)); } if(nold!=(&dummynode_)) luaM_freearray(L,nold,twoto(oldhsize),Node); } static void luaH_resizearray(lua_State*L,Table*t,int nasize){ int nsize=(t->node==(&dummynode_))?0:sizenode(t); resize(L,t,nasize,nsize); } static void rehash(lua_State*L,Table*t,const TValue*ek){ int nasize,na; int nums[(32-2)+1]; int i; int totaluse; for(i=0;i<=(32-2);i++)nums[i]=0; nasize=numusearray(t,nums); totaluse=nasize; totaluse+=numusehash(t,nums,&nasize); nasize+=countint(ek,nums); totaluse++; na=computesizes(nums,&nasize); resize(L,t,nasize,totaluse-na); } static Table*luaH_new(lua_State*L,int narray,int nhash){ Table*t=luaM_new(L,Table); luaC_link(L,obj2gco(t),5); t->metatable=NULL; t->flags=cast_byte(~0); t->array=NULL; t->sizearray=0; t->lsizenode=0; t->node=cast(Node*,(&dummynode_)); setarrayvector(L,t,narray); setnodevector(L,t,nhash); return t; } static void luaH_free(lua_State*L,Table*t){ if(t->node!=(&dummynode_)) luaM_freearray(L,t->node,sizenode(t),Node); luaM_freearray(L,t->array,t->sizearray,TValue); luaM_free(L,t); } static Node*getfreepos(Table*t){ while(t->lastfree-->t->node){ if(ttisnil(gkey(t->lastfree))) return t->lastfree; } return NULL; } static TValue*newkey(lua_State*L,Table*t,const TValue*key){ Node*mp=mainposition(t,key); if(!ttisnil(gval(mp))||mp==(&dummynode_)){ Node*othern; Node*n=getfreepos(t); if(n==NULL){ rehash(L,t,key); return luaH_set(L,t,key); } othern=mainposition(t,key2tval(mp)); if(othern!=mp){ while(gnext(othern)!=mp)othern=gnext(othern); gnext(othern)=n; *n=*mp; gnext(mp)=NULL; setnilvalue(gval(mp)); } else{ gnext(n)=gnext(mp); gnext(mp)=n; mp=n; } } gkey(mp)->value=key->value;gkey(mp)->tt=key->tt; luaC_barriert(L,t,key); return gval(mp); } static const TValue*luaH_getnum(Table*t,int key){ if(cast(unsigned int,key-1)sizearray)) return&t->array[key-1]; else{ lua_Number nk=cast_num(key); Node*n=hashnum(t,nk); do{ if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk)) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } } static const TValue*luaH_getstr(Table*t,TString*key){ Node*n=hashstr(t,key); do{ if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } static const TValue*luaH_get(Table*t,const TValue*key){ switch(ttype(key)){ case 0:return(&luaO_nilobject_); case 4:return luaH_getstr(t,rawtsvalue(key)); case 3:{ int k; lua_Number n=nvalue(key); lua_number2int(k,n); if(luai_numeq(cast_num(k),nvalue(key))) return luaH_getnum(t,k); } default:{ Node*n=mainposition(t,key); do{ if(luaO_rawequalObj(key2tval(n),key)) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } } } static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){ const TValue*p=luaH_get(t,key); t->flags=0; if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ if(ttisnil(key))luaG_runerror(L,"table index is nil"); else if(ttisnumber(key)&&luai_numisnan(nvalue(key))) luaG_runerror(L,"table index is NaN"); return newkey(L,t,key); } } static TValue*luaH_setnum(lua_State*L,Table*t,int key){ const TValue*p=luaH_getnum(t,key); if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ TValue k; setnvalue(&k,cast_num(key)); return newkey(L,t,&k); } } static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){ const TValue*p=luaH_getstr(t,key); if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ TValue k; setsvalue(L,&k,key); return newkey(L,t,&k); } } static int unbound_search(Table*t,unsigned int j){ unsigned int i=j; j++; while(!ttisnil(luaH_getnum(t,j))){ i=j; j*=2; if(j>cast(unsigned int,(INT_MAX-2))){ i=1; while(!ttisnil(luaH_getnum(t,i)))i++; return i-1; } } while(j-i>1){ unsigned int m=(i+j)/2; if(ttisnil(luaH_getnum(t,m)))j=m; else i=m; } return i; } static int luaH_getn(Table*t){ unsigned int j=t->sizearray; if(j>0&&ttisnil(&t->array[j-1])){ unsigned int i=0; while(j-i>1){ unsigned int m=(i+j)/2; if(ttisnil(&t->array[m-1]))j=m; else i=m; } return i; } else if(t->node==(&dummynode_)) return j; else return unbound_search(t,j); } #define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g))) #define white2gray(x)reset2bits((x)->gch.marked,0,1) #define black2gray(x)resetbit((x)->gch.marked,2) #define stringmark(s)reset2bits((s)->tsv.marked,0,1) #define isfinalized(u)testbit((u)->marked,3) #define markfinalized(u)l_setbit((u)->marked,3) #define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));} #define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));} #define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause) static void removeentry(Node*n){ if(iscollectable(gkey(n))) setttype(gkey(n),(8+3)); } static void reallymarkobject(global_State*g,GCObject*o){ white2gray(o); switch(o->gch.tt){ case 4:{ return; } case 7:{ Table*mt=gco2u(o)->metatable; gray2black(o); if(mt)markobject(g,mt); markobject(g,gco2u(o)->env); return; } case(8+2):{ UpVal*uv=gco2uv(o); markvalue(g,uv->v); if(uv->v==&uv->u.value) gray2black(o); return; } case 6:{ gco2cl(o)->c.gclist=g->gray; g->gray=o; break; } case 5:{ gco2h(o)->gclist=g->gray; g->gray=o; break; } case 8:{ gco2th(o)->gclist=g->gray; g->gray=o; break; } case(8+1):{ gco2p(o)->gclist=g->gray; g->gray=o; break; } default:; } } static void marktmu(global_State*g){ GCObject*u=g->tmudata; if(u){ do{ u=u->gch.next; makewhite(g,u); reallymarkobject(g,u); }while(u!=g->tmudata); } } static size_t luaC_separateudata(lua_State*L,int all){ global_State*g=G(L); size_t deadmem=0; GCObject**p=&g->mainthread->next; GCObject*curr; while((curr=*p)!=NULL){ if(!(iswhite(curr)||all)||isfinalized(gco2u(curr))) p=&curr->gch.next; else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){ markfinalized(gco2u(curr)); p=&curr->gch.next; } else{ deadmem+=sizeudata(gco2u(curr)); markfinalized(gco2u(curr)); *p=curr->gch.next; if(g->tmudata==NULL) g->tmudata=curr->gch.next=curr; else{ curr->gch.next=g->tmudata->gch.next; g->tmudata->gch.next=curr; g->tmudata=curr; } } } return deadmem; } static int traversetable(global_State*g,Table*h){ int i; int weakkey=0; int weakvalue=0; const TValue*mode; if(h->metatable) markobject(g,h->metatable); mode=gfasttm(g,h->metatable,TM_MODE); if(mode&&ttisstring(mode)){ weakkey=(strchr(svalue(mode),'k')!=NULL); weakvalue=(strchr(svalue(mode),'v')!=NULL); if(weakkey||weakvalue){ h->marked&=~(bitmask(3)|bitmask(4)); h->marked|=cast_byte((weakkey<<3)| (weakvalue<<4)); h->gclist=g->weak; g->weak=obj2gco(h); } } if(weakkey&&weakvalue)return 1; if(!weakvalue){ i=h->sizearray; while(i--) markvalue(g,&h->array[i]); } i=sizenode(h); while(i--){ Node*n=gnode(h,i); if(ttisnil(gval(n))) removeentry(n); else{ if(!weakkey)markvalue(g,gkey(n)); if(!weakvalue)markvalue(g,gval(n)); } } return weakkey||weakvalue; } static void traverseproto(global_State*g,Proto*f){ int i; if(f->source)stringmark(f->source); for(i=0;isizek;i++) markvalue(g,&f->k[i]); for(i=0;isizeupvalues;i++){ if(f->upvalues[i]) stringmark(f->upvalues[i]); } for(i=0;isizep;i++){ if(f->p[i]) markobject(g,f->p[i]); } for(i=0;isizelocvars;i++){ if(f->locvars[i].varname) stringmark(f->locvars[i].varname); } } static void traverseclosure(global_State*g,Closure*cl){ markobject(g,cl->c.env); if(cl->c.isC){ int i; for(i=0;ic.nupvalues;i++) markvalue(g,&cl->c.upvalue[i]); } else{ int i; markobject(g,cl->l.p); for(i=0;il.nupvalues;i++) markobject(g,cl->l.upvals[i]); } } static void checkstacksizes(lua_State*L,StkId max){ int ci_used=cast_int(L->ci-L->base_ci); int s_used=cast_int(max-L->stack); if(L->size_ci>20000) return; if(4*ci_usedsize_ci&&2*8size_ci) luaD_reallocCI(L,L->size_ci/2); condhardstacktests(luaD_reallocCI(L,ci_used+1)); if(4*s_usedstacksize&& 2*((2*20)+5)stacksize) luaD_reallocstack(L,L->stacksize/2); condhardstacktests(luaD_reallocstack(L,s_used)); } static void traversestack(global_State*g,lua_State*l){ StkId o,lim; CallInfo*ci; markvalue(g,gt(l)); lim=l->top; for(ci=l->base_ci;ci<=l->ci;ci++){ if(limtop)lim=ci->top; } for(o=l->stack;otop;o++) markvalue(g,o); for(;o<=lim;o++) setnilvalue(o); checkstacksizes(l,lim); } static l_mem propagatemark(global_State*g){ GCObject*o=g->gray; gray2black(o); switch(o->gch.tt){ case 5:{ Table*h=gco2h(o); g->gray=h->gclist; if(traversetable(g,h)) black2gray(o); return sizeof(Table)+sizeof(TValue)*h->sizearray+ sizeof(Node)*sizenode(h); } case 6:{ Closure*cl=gco2cl(o); g->gray=cl->c.gclist; traverseclosure(g,cl); return(cl->c.isC)?sizeCclosure(cl->c.nupvalues): sizeLclosure(cl->l.nupvalues); } case 8:{ lua_State*th=gco2th(o); g->gray=th->gclist; th->gclist=g->grayagain; g->grayagain=o; black2gray(o); traversestack(g,th); return sizeof(lua_State)+sizeof(TValue)*th->stacksize+ sizeof(CallInfo)*th->size_ci; } case(8+1):{ Proto*p=gco2p(o); g->gray=p->gclist; traverseproto(g,p); return sizeof(Proto)+sizeof(Instruction)*p->sizecode+ sizeof(Proto*)*p->sizep+ sizeof(TValue)*p->sizek+ sizeof(int)*p->sizelineinfo+ sizeof(LocVar)*p->sizelocvars+ sizeof(TString*)*p->sizeupvalues; } default:return 0; } } static size_t propagateall(global_State*g){ size_t m=0; while(g->gray)m+=propagatemark(g); return m; } static int iscleared(const TValue*o,int iskey){ if(!iscollectable(o))return 0; if(ttisstring(o)){ stringmark(rawtsvalue(o)); return 0; } return iswhite(gcvalue(o))|| (ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o)))); } static void cleartable(GCObject*l){ while(l){ Table*h=gco2h(l); int i=h->sizearray; if(testbit(h->marked,4)){ while(i--){ TValue*o=&h->array[i]; if(iscleared(o,0)) setnilvalue(o); } } i=sizenode(h); while(i--){ Node*n=gnode(h,i); if(!ttisnil(gval(n))&& (iscleared(key2tval(n),1)||iscleared(gval(n),0))){ setnilvalue(gval(n)); removeentry(n); } } l=h->gclist; } } static void freeobj(lua_State*L,GCObject*o){ switch(o->gch.tt){ case(8+1):luaF_freeproto(L,gco2p(o));break; case 6:luaF_freeclosure(L,gco2cl(o));break; case(8+2):luaF_freeupval(L,gco2uv(o));break; case 5:luaH_free(L,gco2h(o));break; case 8:{ luaE_freethread(L,gco2th(o)); break; } case 4:{ G(L)->strt.nuse--; luaM_freemem(L,o,sizestring(gco2ts(o))); break; } case 7:{ luaM_freemem(L,o,sizeudata(gco2u(o))); break; } default:; } } #define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2)) static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){ GCObject*curr; global_State*g=G(L); int deadmask=otherwhite(g); while((curr=*p)!=NULL&&count-->0){ if(curr->gch.tt==8) sweepwholelist(L,&gco2th(curr)->openupval); if((curr->gch.marked^bit2mask(0,1))&deadmask){ makewhite(g,curr); p=&curr->gch.next; } else{ *p=curr->gch.next; if(curr==g->rootgc) g->rootgc=curr->gch.next; freeobj(L,curr); } } return p; } static void checkSizes(lua_State*L){ global_State*g=G(L); if(g->strt.nusestrt.size/4)&& g->strt.size>32*2) luaS_resize(L,g->strt.size/2); if(luaZ_sizebuffer(&g->buff)>32*2){ size_t newsize=luaZ_sizebuffer(&g->buff)/2; luaZ_resizebuffer(L,&g->buff,newsize); } } static void GCTM(lua_State*L){ global_State*g=G(L); GCObject*o=g->tmudata->gch.next; Udata*udata=rawgco2u(o); const TValue*tm; if(o==g->tmudata) g->tmudata=NULL; else g->tmudata->gch.next=udata->uv.next; udata->uv.next=g->mainthread->next; g->mainthread->next=o; makewhite(g,o); tm=fasttm(L,udata->uv.metatable,TM_GC); if(tm!=NULL){ lu_byte oldah=L->allowhook; lu_mem oldt=g->GCthreshold; L->allowhook=0; g->GCthreshold=2*g->totalbytes; setobj(L,L->top,tm); setuvalue(L,L->top+1,udata); L->top+=2; luaD_call(L,L->top-2,0); L->allowhook=oldah; g->GCthreshold=oldt; } } static void luaC_callGCTM(lua_State*L){ while(G(L)->tmudata) GCTM(L); } static void luaC_freeall(lua_State*L){ global_State*g=G(L); int i; g->currentwhite=bit2mask(0,1)|bitmask(6); sweepwholelist(L,&g->rootgc); for(i=0;istrt.size;i++) sweepwholelist(L,&g->strt.hash[i]); } static void markmt(global_State*g){ int i; for(i=0;i<(8+1);i++) if(g->mt[i])markobject(g,g->mt[i]); } static void markroot(lua_State*L){ global_State*g=G(L); g->gray=NULL; g->grayagain=NULL; g->weak=NULL; markobject(g,g->mainthread); markvalue(g,gt(g->mainthread)); markvalue(g,registry(L)); markmt(g); g->gcstate=1; } static void remarkupvals(global_State*g){ UpVal*uv; for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){ if(isgray(obj2gco(uv))) markvalue(g,uv->v); } } static void atomic(lua_State*L){ global_State*g=G(L); size_t udsize; remarkupvals(g); propagateall(g); g->gray=g->weak; g->weak=NULL; markobject(g,L); markmt(g); propagateall(g); g->gray=g->grayagain; g->grayagain=NULL; propagateall(g); udsize=luaC_separateudata(L,0); marktmu(g); udsize+=propagateall(g); cleartable(g->weak); g->currentwhite=cast_byte(otherwhite(g)); g->sweepstrgc=0; g->sweepgc=&g->rootgc; g->gcstate=2; g->estimate=g->totalbytes-udsize; } static l_mem singlestep(lua_State*L){ global_State*g=G(L); switch(g->gcstate){ case 0:{ markroot(L); return 0; } case 1:{ if(g->gray) return propagatemark(g); else{ atomic(L); return 0; } } case 2:{ lu_mem old=g->totalbytes; sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]); if(g->sweepstrgc>=g->strt.size) g->gcstate=3; g->estimate-=old-g->totalbytes; return 10; } case 3:{ lu_mem old=g->totalbytes; g->sweepgc=sweeplist(L,g->sweepgc,40); if(*g->sweepgc==NULL){ checkSizes(L); g->gcstate=4; } g->estimate-=old-g->totalbytes; return 40*10; } case 4:{ if(g->tmudata){ GCTM(L); if(g->estimate>100) g->estimate-=100; return 100; } else{ g->gcstate=0; g->gcdept=0; return 0; } } default:return 0; } } static void luaC_step(lua_State*L){ global_State*g=G(L); l_mem lim=(1024u/100)*g->gcstepmul; if(lim==0) lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2; g->gcdept+=g->totalbytes-g->GCthreshold; do{ lim-=singlestep(L); if(g->gcstate==0) break; }while(lim>0); if(g->gcstate!=0){ if(g->gcdept<1024u) g->GCthreshold=g->totalbytes+1024u; else{ g->gcdept-=1024u; g->GCthreshold=g->totalbytes; } } else{ setthreshold(g); } } static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){ global_State*g=G(L); if(g->gcstate==1) reallymarkobject(g,v); else makewhite(g,o); } static void luaC_barrierback(lua_State*L,Table*t){ global_State*g=G(L); GCObject*o=obj2gco(t); black2gray(o); t->gclist=g->grayagain; g->grayagain=o; } static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){ global_State*g=G(L); o->gch.next=g->rootgc; g->rootgc=o; o->gch.marked=luaC_white(g); o->gch.tt=tt; } static void luaC_linkupval(lua_State*L,UpVal*uv){ global_State*g=G(L); GCObject*o=obj2gco(uv); o->gch.next=g->rootgc; g->rootgc=o; if(isgray(o)){ if(g->gcstate==1){ gray2black(o); luaC_barrier(L,uv,uv->v); } else{ makewhite(g,o); } } } typedef union{ lua_Number r; TString*ts; }SemInfo; typedef struct Token{ int token; SemInfo seminfo; }Token; typedef struct LexState{ int current; int linenumber; int lastline; Token t; Token lookahead; struct FuncState*fs; struct lua_State*L; ZIO*z; Mbuffer*buff; TString*source; char decpoint; }LexState; static void luaX_init(lua_State*L); static void luaX_lexerror(LexState*ls,const char*msg,int token); #define state_size(x)(sizeof(x)+0) #define fromstate(l)(cast(lu_byte*,(l))-0) #define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0)) typedef struct LG{ lua_State l; global_State g; }LG; static void stack_init(lua_State*L1,lua_State*L){ L1->base_ci=luaM_newvector(L,8,CallInfo); L1->ci=L1->base_ci; L1->size_ci=8; L1->end_ci=L1->base_ci+L1->size_ci-1; L1->stack=luaM_newvector(L,(2*20)+5,TValue); L1->stacksize=(2*20)+5; L1->top=L1->stack; L1->stack_last=L1->stack+(L1->stacksize-5)-1; L1->ci->func=L1->top; setnilvalue(L1->top++); L1->base=L1->ci->base=L1->top; L1->ci->top=L1->top+20; } static void freestack(lua_State*L,lua_State*L1){ luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo); luaM_freearray(L,L1->stack,L1->stacksize,TValue); } static void f_luaopen(lua_State*L,void*ud){ global_State*g=G(L); UNUSED(ud); stack_init(L,L); sethvalue(L,gt(L),luaH_new(L,0,2)); sethvalue(L,registry(L),luaH_new(L,0,2)); luaS_resize(L,32); luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L,"not enough memory")); g->GCthreshold=4*g->totalbytes; } static void preinit_state(lua_State*L,global_State*g){ G(L)=g; L->stack=NULL; L->stacksize=0; L->errorJmp=NULL; L->hook=NULL; L->hookmask=0; L->basehookcount=0; L->allowhook=1; resethookcount(L); L->openupval=NULL; L->size_ci=0; L->nCcalls=L->baseCcalls=0; L->status=0; L->base_ci=L->ci=NULL; L->savedpc=NULL; L->errfunc=0; setnilvalue(gt(L)); } static void close_state(lua_State*L){ global_State*g=G(L); luaF_close(L,L->stack); luaC_freeall(L); luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*); luaZ_freebuffer(L,&g->buff); freestack(L,L); (*g->frealloc)(g->ud,fromstate(L),state_size(LG),0); } static void luaE_freethread(lua_State*L,lua_State*L1){ luaF_close(L1,L1->stack); freestack(L,L1); luaM_freemem(L,fromstate(L1),state_size(lua_State)); } static lua_State*lua_newstate(lua_Alloc f,void*ud){ int i; lua_State*L; global_State*g; void*l=(*f)(ud,NULL,0,state_size(LG)); if(l==NULL)return NULL; L=tostate(l); g=&((LG*)L)->g; L->next=NULL; L->tt=8; g->currentwhite=bit2mask(0,5); L->marked=luaC_white(g); set2bits(L->marked,5,6); preinit_state(L,g); g->frealloc=f; g->ud=ud; g->mainthread=L; g->uvhead.u.l.prev=&g->uvhead; g->uvhead.u.l.next=&g->uvhead; g->GCthreshold=0; g->strt.size=0; g->strt.nuse=0; g->strt.hash=NULL; setnilvalue(registry(L)); luaZ_initbuffer(L,&g->buff); g->panic=NULL; g->gcstate=0; g->rootgc=obj2gco(L); g->sweepstrgc=0; g->sweepgc=&g->rootgc; g->gray=NULL; g->grayagain=NULL; g->weak=NULL; g->tmudata=NULL; g->totalbytes=sizeof(LG); g->gcpause=200; g->gcstepmul=200; g->gcdept=0; for(i=0;i<(8+1);i++)g->mt[i]=NULL; if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){ close_state(L); L=NULL; } else {} return L; } static void callallgcTM(lua_State*L,void*ud){ UNUSED(ud); luaC_callGCTM(L); } static void lua_close(lua_State*L){ L=G(L)->mainthread; luaF_close(L,L->stack); luaC_separateudata(L,1); L->errfunc=0; do{ L->ci=L->base_ci; L->base=L->top=L->ci->base; L->nCcalls=L->baseCcalls=0; }while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0); close_state(L); } #define getcode(fs,e)((fs)->f->code[(e)->u.s.info]) #define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1)) #define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1)) static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx); static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C); static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults); static void luaK_patchtohere(FuncState*fs,int list); static void luaK_concat(FuncState*fs,int*l1,int l2); static int currentpc(lua_State*L,CallInfo*ci){ if(!isLua(ci))return-1; if(ci==L->ci) ci->savedpc=L->savedpc; return pcRel(ci->savedpc,ci_func(ci)->l.p); } static int currentline(lua_State*L,CallInfo*ci){ int pc=currentpc(L,ci); if(pc<0) return-1; else return getline_(ci_func(ci)->l.p,pc); } static int lua_getstack(lua_State*L,int level,lua_Debug*ar){ int status; CallInfo*ci; for(ci=L->ci;level>0&&ci>L->base_ci;ci--){ level--; if(f_isLua(ci)) level-=ci->tailcalls; } if(level==0&&ci>L->base_ci){ status=1; ar->i_ci=cast_int(ci-L->base_ci); } else if(level<0){ status=1; ar->i_ci=0; } else status=0; return status; } static Proto*getluaproto(CallInfo*ci){ return(isLua(ci)?ci_func(ci)->l.p:NULL); } static void funcinfo(lua_Debug*ar,Closure*cl){ if(cl->c.isC){ ar->source="=[C]"; ar->linedefined=-1; ar->lastlinedefined=-1; ar->what="C"; } else{ ar->source=getstr(cl->l.p->source); ar->linedefined=cl->l.p->linedefined; ar->lastlinedefined=cl->l.p->lastlinedefined; ar->what=(ar->linedefined==0)?"main":"Lua"; } luaO_chunkid(ar->short_src,ar->source,60); } static void info_tailcall(lua_Debug*ar){ ar->name=ar->namewhat=""; ar->what="tail"; ar->lastlinedefined=ar->linedefined=ar->currentline=-1; ar->source="=(tail call)"; luaO_chunkid(ar->short_src,ar->source,60); ar->nups=0; } static void collectvalidlines(lua_State*L,Closure*f){ if(f==NULL||f->c.isC){ setnilvalue(L->top); } else{ Table*t=luaH_new(L,0,0); int*lineinfo=f->l.p->lineinfo; int i; for(i=0;il.p->sizelineinfo;i++) setbvalue(luaH_setnum(L,t,lineinfo[i]),1); sethvalue(L,L->top,t); } incr_top(L); } static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar, Closure*f,CallInfo*ci){ int status=1; if(f==NULL){ info_tailcall(ar); return status; } for(;*what;what++){ switch(*what){ case'S':{ funcinfo(ar,f); break; } case'l':{ ar->currentline=(ci)?currentline(L,ci):-1; break; } case'u':{ ar->nups=f->c.nupvalues; break; } case'n':{ ar->namewhat=(ci)?NULL:NULL; if(ar->namewhat==NULL){ ar->namewhat=""; ar->name=NULL; } break; } case'L': case'f': break; default:status=0; } } return status; } static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){ int status; Closure*f=NULL; CallInfo*ci=NULL; if(*what=='>'){ StkId func=L->top-1; luai_apicheck(L,ttisfunction(func)); what++; f=clvalue(func); L->top--; } else if(ar->i_ci!=0){ ci=L->base_ci+ar->i_ci; f=clvalue(ci->func); } status=auxgetinfo(L,what,ar,f,ci); if(strchr(what,'f')){ if(f==NULL)setnilvalue(L->top); else setclvalue(L,L->top,f); incr_top(L); } if(strchr(what,'L')) collectvalidlines(L,f); return status; } static int isinstack(CallInfo*ci,const TValue*o){ StkId p; for(p=ci->base;ptop;p++) if(o==p)return 1; return 0; } static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){ const char*name=NULL; const char*t=luaT_typenames[ttype(o)]; const char*kind=(isinstack(L->ci,o))? NULL: NULL; if(kind) luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)", op,kind,name,t); else luaG_runerror(L,"attempt to %s a %s value",op,t); } static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){ if(ttisstring(p1)||ttisnumber(p1))p1=p2; luaG_typeerror(L,p1,"concatenate"); } static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){ TValue temp; if(luaV_tonumber(p1,&temp)==NULL) p2=p1; luaG_typeerror(L,p2,"perform arithmetic on"); } static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){ const char*t1=luaT_typenames[ttype(p1)]; const char*t2=luaT_typenames[ttype(p2)]; if(t1[2]==t2[2]) luaG_runerror(L,"attempt to compare two %s values",t1); else luaG_runerror(L,"attempt to compare %s with %s",t1,t2); return 0; } static void addinfo(lua_State*L,const char*msg){ CallInfo*ci=L->ci; if(isLua(ci)){ char buff[60]; int line=currentline(L,ci); luaO_chunkid(buff,getstr(getluaproto(ci)->source),60); luaO_pushfstring(L,"%s:%d: %s",buff,line,msg); } } static void luaG_errormsg(lua_State*L){ if(L->errfunc!=0){ StkId errfunc=restorestack(L,L->errfunc); if(!ttisfunction(errfunc))luaD_throw(L,5); setobj(L,L->top,L->top-1); setobj(L,L->top-1,errfunc); incr_top(L); luaD_call(L,L->top-2,1); } luaD_throw(L,2); } static void luaG_runerror(lua_State*L,const char*fmt,...){ va_list argp; va_start(argp,fmt); addinfo(L,luaO_pushvfstring(L,fmt,argp)); va_end(argp); luaG_errormsg(L); } static int luaZ_fill(ZIO*z){ size_t size; lua_State*L=z->L; const char*buff; buff=z->reader(L,z->data,&size); if(buff==NULL||size==0)return(-1); z->n=size-1; z->p=buff; return char2int(*(z->p++)); } static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){ z->L=L; z->reader=reader; z->data=data; z->n=0; z->p=NULL; } static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){ if(n>buff->buffsize){ if(n<32)n=32; luaZ_resizebuffer(L,buff,n); } return buff->buffer; } #define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m)) static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={ opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgK,OpArgN,iABx) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgU,OpArgN,iABC) ,opmode(0,1,OpArgK,OpArgN,iABx) ,opmode(0,1,OpArgR,OpArgK,iABC) ,opmode(0,0,OpArgK,OpArgN,iABx) ,opmode(0,0,OpArgU,OpArgN,iABC) ,opmode(0,0,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgR,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgR,iABC) ,opmode(0,0,OpArgR,OpArgN,iAsBx) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,1,OpArgR,OpArgU,iABC) ,opmode(1,1,OpArgR,OpArgU,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,0,OpArgU,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iAsBx) ,opmode(0,1,OpArgR,OpArgN,iAsBx) ,opmode(1,0,OpArgN,OpArgU,iABC) ,opmode(0,0,OpArgU,OpArgU,iABC) ,opmode(0,0,OpArgN,OpArgN,iABC) ,opmode(0,1,OpArgU,OpArgN,iABx) ,opmode(0,1,OpArgU,OpArgN,iABC) }; #define next(ls)(ls->current=zgetc(ls->z)) #define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r') static const char*const luaX_tokens[]={ "and","break","do","else","elseif", "end","false","for","function","if", "in","local","nil","not","or","repeat", "return","then","true","until","while", "..","...","==",">=","<=","~=", "","","","", NULL }; #define save_and_next(ls)(save(ls,ls->current),next(ls)) static void save(LexState*ls,int c){ Mbuffer*b=ls->buff; if(b->n+1>b->buffsize){ size_t newsize; if(b->buffsize>=((size_t)(~(size_t)0)-2)/2) luaX_lexerror(ls,"lexical element too long",0); newsize=b->buffsize*2; luaZ_resizebuffer(ls->L,b,newsize); } b->buffer[b->n++]=cast(char,c); } static void luaX_init(lua_State*L){ int i; for(i=0;i<(cast(int,TK_WHILE-257+1));i++){ TString*ts=luaS_new(L,luaX_tokens[i]); luaS_fix(ts); ts->tsv.reserved=cast_byte(i+1); } } static const char*luaX_token2str(LexState*ls,int token){ if(token<257){ return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token): luaO_pushfstring(ls->L,"%c",token); } else return luaX_tokens[token-257]; } static const char*txtToken(LexState*ls,int token){ switch(token){ case TK_NAME: case TK_STRING: case TK_NUMBER: save(ls,'\0'); return luaZ_buffer(ls->buff); default: return luaX_token2str(ls,token); } } static void luaX_lexerror(LexState*ls,const char*msg,int token){ char buff[80]; luaO_chunkid(buff,getstr(ls->source),80); msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg); if(token) luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token)); luaD_throw(ls->L,3); } static void luaX_syntaxerror(LexState*ls,const char*msg){ luaX_lexerror(ls,msg,ls->t.token); } static TString*luaX_newstring(LexState*ls,const char*str,size_t l){ lua_State*L=ls->L; TString*ts=luaS_newlstr(L,str,l); TValue*o=luaH_setstr(L,ls->fs->h,ts); if(ttisnil(o)){ setbvalue(o,1); luaC_checkGC(L); } return ts; } static void inclinenumber(LexState*ls){ int old=ls->current; next(ls); if(currIsNewline(ls)&&ls->current!=old) next(ls); if(++ls->linenumber>=(INT_MAX-2)) luaX_syntaxerror(ls,"chunk has too many lines"); } static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){ ls->decpoint='.'; ls->L=L; ls->lookahead.token=TK_EOS; ls->z=z; ls->fs=NULL; ls->linenumber=1; ls->lastline=1; ls->source=source; luaZ_resizebuffer(ls->L,ls->buff,32); next(ls); } static int check_next(LexState*ls,const char*set){ if(!strchr(set,ls->current)) return 0; save_and_next(ls); return 1; } static void buffreplace(LexState*ls,char from,char to){ size_t n=luaZ_bufflen(ls->buff); char*p=luaZ_buffer(ls->buff); while(n--) if(p[n]==from)p[n]=to; } static void read_numeral(LexState*ls,SemInfo*seminfo){ do{ save_and_next(ls); }while(isdigit(ls->current)||ls->current=='.'); if(check_next(ls,"Ee")) check_next(ls,"+-"); while(isalnum(ls->current)||ls->current=='_') save_and_next(ls); save(ls,'\0'); buffreplace(ls,'.',ls->decpoint); if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r)) luaX_lexerror(ls,"malformed number",TK_NUMBER); } static int skip_sep(LexState*ls){ int count=0; int s=ls->current; save_and_next(ls); while(ls->current=='='){ save_and_next(ls); count++; } return(ls->current==s)?count:(-count)-1; } static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){ int cont=0; (void)(cont); save_and_next(ls); if(currIsNewline(ls)) inclinenumber(ls); for(;;){ switch(ls->current){ case(-1): luaX_lexerror(ls,(seminfo)?"unfinished long string": "unfinished long comment",TK_EOS); break; case']':{ if(skip_sep(ls)==sep){ save_and_next(ls); goto endloop; } break; } case'\n': case'\r':{ save(ls,'\n'); inclinenumber(ls); if(!seminfo)luaZ_resetbuffer(ls->buff); break; } default:{ if(seminfo)save_and_next(ls); else next(ls); } } }endloop: if(seminfo) seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep), luaZ_bufflen(ls->buff)-2*(2+sep)); } static void read_string(LexState*ls,int del,SemInfo*seminfo){ save_and_next(ls); while(ls->current!=del){ switch(ls->current){ case(-1): luaX_lexerror(ls,"unfinished string",TK_EOS); continue; case'\n': case'\r': luaX_lexerror(ls,"unfinished string",TK_STRING); continue; case'\\':{ int c; next(ls); switch(ls->current){ case'a':c='\a';break; case'b':c='\b';break; case'f':c='\f';break; case'n':c='\n';break; case'r':c='\r';break; case't':c='\t';break; case'v':c='\v';break; case'\n': case'\r':save(ls,'\n');inclinenumber(ls);continue; case(-1):continue; default:{ if(!isdigit(ls->current)) save_and_next(ls); else{ int i=0; c=0; do{ c=10*c+(ls->current-'0'); next(ls); }while(++i<3&&isdigit(ls->current)); if(c>UCHAR_MAX) luaX_lexerror(ls,"escape sequence too large",TK_STRING); save(ls,c); } continue; } } save(ls,c); next(ls); continue; } default: save_and_next(ls); } } save_and_next(ls); seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1, luaZ_bufflen(ls->buff)-2); } static int llex(LexState*ls,SemInfo*seminfo){ luaZ_resetbuffer(ls->buff); for(;;){ switch(ls->current){ case'\n': case'\r':{ inclinenumber(ls); continue; } case'-':{ next(ls); if(ls->current!='-')return'-'; next(ls); if(ls->current=='['){ int sep=skip_sep(ls); luaZ_resetbuffer(ls->buff); if(sep>=0){ read_long_string(ls,NULL,sep); luaZ_resetbuffer(ls->buff); continue; } } while(!currIsNewline(ls)&&ls->current!=(-1)) next(ls); continue; } case'[':{ int sep=skip_sep(ls); if(sep>=0){ read_long_string(ls,seminfo,sep); return TK_STRING; } else if(sep==-1)return'['; else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING); } case'=':{ next(ls); if(ls->current!='=')return'='; else{next(ls);return TK_EQ;} } case'<':{ next(ls); if(ls->current!='=')return'<'; else{next(ls);return TK_LE;} } case'>':{ next(ls); if(ls->current!='=')return'>'; else{next(ls);return TK_GE;} } case'~':{ next(ls); if(ls->current!='=')return'~'; else{next(ls);return TK_NE;} } case'"': case'\'':{ read_string(ls,ls->current,seminfo); return TK_STRING; } case'.':{ save_and_next(ls); if(check_next(ls,".")){ if(check_next(ls,".")) return TK_DOTS; else return TK_CONCAT; } else if(!isdigit(ls->current))return'.'; else{ read_numeral(ls,seminfo); return TK_NUMBER; } } case(-1):{ return TK_EOS; } default:{ if(isspace(ls->current)){ next(ls); continue; } else if(isdigit(ls->current)){ read_numeral(ls,seminfo); return TK_NUMBER; } else if(isalpha(ls->current)||ls->current=='_'){ TString*ts; do{ save_and_next(ls); }while(isalnum(ls->current)||ls->current=='_'); ts=luaX_newstring(ls,luaZ_buffer(ls->buff), luaZ_bufflen(ls->buff)); if(ts->tsv.reserved>0) return ts->tsv.reserved-1+257; else{ seminfo->ts=ts; return TK_NAME; } } else{ int c=ls->current; next(ls); return c; } } } } } static void luaX_next(LexState*ls){ ls->lastline=ls->linenumber; if(ls->lookahead.token!=TK_EOS){ ls->t=ls->lookahead; ls->lookahead.token=TK_EOS; } else ls->t.token=llex(ls,&ls->t.seminfo); } static void luaX_lookahead(LexState*ls){ ls->lookahead.token=llex(ls,&ls->lookahead.seminfo); } #define hasjumps(e)((e)->t!=(e)->f) static int isnumeral(expdesc*e){ return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1)); } static void luaK_nil(FuncState*fs,int from,int n){ Instruction*previous; if(fs->pc>fs->lasttarget){ if(fs->pc==0){ if(from>=fs->nactvar) return; } else{ previous=&fs->f->code[fs->pc-1]; if(GET_OPCODE(*previous)==OP_LOADNIL){ int pfrom=GETARG_A(*previous); int pto=GETARG_B(*previous); if(pfrom<=from&&from<=pto+1){ if(from+n-1>pto) SETARG_B(*previous,from+n-1); return; } } } } luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0); } static int luaK_jump(FuncState*fs){ int jpc=fs->jpc; int j; fs->jpc=(-1); j=luaK_codeAsBx(fs,OP_JMP,0,(-1)); luaK_concat(fs,&j,jpc); return j; } static void luaK_ret(FuncState*fs,int first,int nret){ luaK_codeABC(fs,OP_RETURN,first,nret+1,0); } static int condjump(FuncState*fs,OpCode op,int A,int B,int C){ luaK_codeABC(fs,op,A,B,C); return luaK_jump(fs); } static void fixjump(FuncState*fs,int pc,int dest){ Instruction*jmp=&fs->f->code[pc]; int offset=dest-(pc+1); if(abs(offset)>(((1<<(9+9))-1)>>1)) luaX_syntaxerror(fs->ls,"control structure too long"); SETARG_sBx(*jmp,offset); } static int luaK_getlabel(FuncState*fs){ fs->lasttarget=fs->pc; return fs->pc; } static int getjump(FuncState*fs,int pc){ int offset=GETARG_sBx(fs->f->code[pc]); if(offset==(-1)) return(-1); else return(pc+1)+offset; } static Instruction*getjumpcontrol(FuncState*fs,int pc){ Instruction*pi=&fs->f->code[pc]; if(pc>=1&&testTMode(GET_OPCODE(*(pi-1)))) return pi-1; else return pi; } static int need_value(FuncState*fs,int list){ for(;list!=(-1);list=getjump(fs,list)){ Instruction i=*getjumpcontrol(fs,list); if(GET_OPCODE(i)!=OP_TESTSET)return 1; } return 0; } static int patchtestreg(FuncState*fs,int node,int reg){ Instruction*i=getjumpcontrol(fs,node); if(GET_OPCODE(*i)!=OP_TESTSET) return 0; if(reg!=((1<<8)-1)&®!=GETARG_B(*i)) SETARG_A(*i,reg); else *i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i)); return 1; } static void removevalues(FuncState*fs,int list){ for(;list!=(-1);list=getjump(fs,list)) patchtestreg(fs,list,((1<<8)-1)); } static void patchlistaux(FuncState*fs,int list,int vtarget,int reg, int dtarget){ while(list!=(-1)){ int next=getjump(fs,list); if(patchtestreg(fs,list,reg)) fixjump(fs,list,vtarget); else fixjump(fs,list,dtarget); list=next; } } static void dischargejpc(FuncState*fs){ patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc); fs->jpc=(-1); } static void luaK_patchlist(FuncState*fs,int list,int target){ if(target==fs->pc) luaK_patchtohere(fs,list); else{ patchlistaux(fs,list,target,((1<<8)-1),target); } } static void luaK_patchtohere(FuncState*fs,int list){ luaK_getlabel(fs); luaK_concat(fs,&fs->jpc,list); } static void luaK_concat(FuncState*fs,int*l1,int l2){ if(l2==(-1))return; else if(*l1==(-1)) *l1=l2; else{ int list=*l1; int next; while((next=getjump(fs,list))!=(-1)) list=next; fixjump(fs,list,l2); } } static void luaK_checkstack(FuncState*fs,int n){ int newstack=fs->freereg+n; if(newstack>fs->f->maxstacksize){ if(newstack>=250) luaX_syntaxerror(fs->ls,"function or expression too complex"); fs->f->maxstacksize=cast_byte(newstack); } } static void luaK_reserveregs(FuncState*fs,int n){ luaK_checkstack(fs,n); fs->freereg+=n; } static void freereg(FuncState*fs,int reg){ if(!ISK(reg)&®>=fs->nactvar){ fs->freereg--; } } static void freeexp(FuncState*fs,expdesc*e){ if(e->k==VNONRELOC) freereg(fs,e->u.s.info); } static int addk(FuncState*fs,TValue*k,TValue*v){ lua_State*L=fs->L; TValue*idx=luaH_set(L,fs->h,k); Proto*f=fs->f; int oldsize=f->sizek; if(ttisnumber(idx)){ return cast_int(nvalue(idx)); } else{ setnvalue(idx,cast_num(fs->nk)); luaM_growvector(L,f->k,fs->nk,f->sizek,TValue, ((1<<(9+9))-1),"constant table overflow"); while(oldsizesizek)setnilvalue(&f->k[oldsize++]); setobj(L,&f->k[fs->nk],v); luaC_barrier(L,f,v); return fs->nk++; } } static int luaK_stringK(FuncState*fs,TString*s){ TValue o; setsvalue(fs->L,&o,s); return addk(fs,&o,&o); } static int luaK_numberK(FuncState*fs,lua_Number r){ TValue o; setnvalue(&o,r); return addk(fs,&o,&o); } static int boolK(FuncState*fs,int b){ TValue o; setbvalue(&o,b); return addk(fs,&o,&o); } static int nilK(FuncState*fs){ TValue k,v; setnilvalue(&v); sethvalue(fs->L,&k,fs->h); return addk(fs,&k,&v); } static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){ if(e->k==VCALL){ SETARG_C(getcode(fs,e),nresults+1); } else if(e->k==VVARARG){ SETARG_B(getcode(fs,e),nresults+1); SETARG_A(getcode(fs,e),fs->freereg); luaK_reserveregs(fs,1); } } static void luaK_setoneret(FuncState*fs,expdesc*e){ if(e->k==VCALL){ e->k=VNONRELOC; e->u.s.info=GETARG_A(getcode(fs,e)); } else if(e->k==VVARARG){ SETARG_B(getcode(fs,e),2); e->k=VRELOCABLE; } } static void luaK_dischargevars(FuncState*fs,expdesc*e){ switch(e->k){ case VLOCAL:{ e->k=VNONRELOC; break; } case VUPVAL:{ e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0); e->k=VRELOCABLE; break; } case VGLOBAL:{ e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info); e->k=VRELOCABLE; break; } case VINDEXED:{ freereg(fs,e->u.s.aux); freereg(fs,e->u.s.info); e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux); e->k=VRELOCABLE; break; } case VVARARG: case VCALL:{ luaK_setoneret(fs,e); break; } default:break; } } static int code_label(FuncState*fs,int A,int b,int jump){ luaK_getlabel(fs); return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump); } static void discharge2reg(FuncState*fs,expdesc*e,int reg){ luaK_dischargevars(fs,e); switch(e->k){ case VNIL:{ luaK_nil(fs,reg,1); break; } case VFALSE:case VTRUE:{ luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0); break; } case VK:{ luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info); break; } case VKNUM:{ luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval)); break; } case VRELOCABLE:{ Instruction*pc=&getcode(fs,e); SETARG_A(*pc,reg); break; } case VNONRELOC:{ if(reg!=e->u.s.info) luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0); break; } default:{ return; } } e->u.s.info=reg; e->k=VNONRELOC; } static void discharge2anyreg(FuncState*fs,expdesc*e){ if(e->k!=VNONRELOC){ luaK_reserveregs(fs,1); discharge2reg(fs,e,fs->freereg-1); } } static void exp2reg(FuncState*fs,expdesc*e,int reg){ discharge2reg(fs,e,reg); if(e->k==VJMP) luaK_concat(fs,&e->t,e->u.s.info); if(hasjumps(e)){ int final; int p_f=(-1); int p_t=(-1); if(need_value(fs,e->t)||need_value(fs,e->f)){ int fj=(e->k==VJMP)?(-1):luaK_jump(fs); p_f=code_label(fs,reg,0,1); p_t=code_label(fs,reg,1,0); luaK_patchtohere(fs,fj); } final=luaK_getlabel(fs); patchlistaux(fs,e->f,final,reg,p_f); patchlistaux(fs,e->t,final,reg,p_t); } e->f=e->t=(-1); e->u.s.info=reg; e->k=VNONRELOC; } static void luaK_exp2nextreg(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); freeexp(fs,e); luaK_reserveregs(fs,1); exp2reg(fs,e,fs->freereg-1); } static int luaK_exp2anyreg(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); if(e->k==VNONRELOC){ if(!hasjumps(e))return e->u.s.info; if(e->u.s.info>=fs->nactvar){ exp2reg(fs,e,e->u.s.info); return e->u.s.info; } } luaK_exp2nextreg(fs,e); return e->u.s.info; } static void luaK_exp2val(FuncState*fs,expdesc*e){ if(hasjumps(e)) luaK_exp2anyreg(fs,e); else luaK_dischargevars(fs,e); } static int luaK_exp2RK(FuncState*fs,expdesc*e){ luaK_exp2val(fs,e); switch(e->k){ case VKNUM: case VTRUE: case VFALSE: case VNIL:{ if(fs->nk<=((1<<(9-1))-1)){ e->u.s.info=(e->k==VNIL)?nilK(fs): (e->k==VKNUM)?luaK_numberK(fs,e->u.nval): boolK(fs,(e->k==VTRUE)); e->k=VK; return RKASK(e->u.s.info); } else break; } case VK:{ if(e->u.s.info<=((1<<(9-1))-1)) return RKASK(e->u.s.info); else break; } default:break; } return luaK_exp2anyreg(fs,e); } static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){ switch(var->k){ case VLOCAL:{ freeexp(fs,ex); exp2reg(fs,ex,var->u.s.info); return; } case VUPVAL:{ int e=luaK_exp2anyreg(fs,ex); luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0); break; } case VGLOBAL:{ int e=luaK_exp2anyreg(fs,ex); luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info); break; } case VINDEXED:{ int e=luaK_exp2RK(fs,ex); luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e); break; } default:{ break; } } freeexp(fs,ex); } static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){ int func; luaK_exp2anyreg(fs,e); freeexp(fs,e); func=fs->freereg; luaK_reserveregs(fs,2); luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key)); freeexp(fs,key); e->u.s.info=func; e->k=VNONRELOC; } static void invertjump(FuncState*fs,expdesc*e){ Instruction*pc=getjumpcontrol(fs,e->u.s.info); SETARG_A(*pc,!(GETARG_A(*pc))); } static int jumponcond(FuncState*fs,expdesc*e,int cond){ if(e->k==VRELOCABLE){ Instruction ie=getcode(fs,e); if(GET_OPCODE(ie)==OP_NOT){ fs->pc--; return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond); } } discharge2anyreg(fs,e); freeexp(fs,e); return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond); } static void luaK_goiftrue(FuncState*fs,expdesc*e){ int pc; luaK_dischargevars(fs,e); switch(e->k){ case VK:case VKNUM:case VTRUE:{ pc=(-1); break; } case VJMP:{ invertjump(fs,e); pc=e->u.s.info; break; } default:{ pc=jumponcond(fs,e,0); break; } } luaK_concat(fs,&e->f,pc); luaK_patchtohere(fs,e->t); e->t=(-1); } static void luaK_goiffalse(FuncState*fs,expdesc*e){ int pc; luaK_dischargevars(fs,e); switch(e->k){ case VNIL:case VFALSE:{ pc=(-1); break; } case VJMP:{ pc=e->u.s.info; break; } default:{ pc=jumponcond(fs,e,1); break; } } luaK_concat(fs,&e->t,pc); luaK_patchtohere(fs,e->f); e->f=(-1); } static void codenot(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); switch(e->k){ case VNIL:case VFALSE:{ e->k=VTRUE; break; } case VK:case VKNUM:case VTRUE:{ e->k=VFALSE; break; } case VJMP:{ invertjump(fs,e); break; } case VRELOCABLE: case VNONRELOC:{ discharge2anyreg(fs,e); freeexp(fs,e); e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0); e->k=VRELOCABLE; break; } default:{ break; } } {int temp=e->f;e->f=e->t;e->t=temp;} removevalues(fs,e->f); removevalues(fs,e->t); } static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){ t->u.s.aux=luaK_exp2RK(fs,k); t->k=VINDEXED; } static int constfolding(OpCode op,expdesc*e1,expdesc*e2){ lua_Number v1,v2,r; if(!isnumeral(e1)||!isnumeral(e2))return 0; v1=e1->u.nval; v2=e2->u.nval; switch(op){ case OP_ADD:r=luai_numadd(v1,v2);break; case OP_SUB:r=luai_numsub(v1,v2);break; case OP_MUL:r=luai_nummul(v1,v2);break; case OP_DIV: if(v2==0)return 0; r=luai_numdiv(v1,v2);break; case OP_MOD: if(v2==0)return 0; r=luai_nummod(v1,v2);break; case OP_POW:r=luai_numpow(v1,v2);break; case OP_UNM:r=luai_numunm(v1);break; case OP_LEN:return 0; default:r=0;break; } if(luai_numisnan(r))return 0; e1->u.nval=r; return 1; } static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){ if(constfolding(op,e1,e2)) return; else{ int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0; int o1=luaK_exp2RK(fs,e1); if(o1>o2){ freeexp(fs,e1); freeexp(fs,e2); } else{ freeexp(fs,e2); freeexp(fs,e1); } e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2); e1->k=VRELOCABLE; } } static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1, expdesc*e2){ int o1=luaK_exp2RK(fs,e1); int o2=luaK_exp2RK(fs,e2); freeexp(fs,e2); freeexp(fs,e1); if(cond==0&&op!=OP_EQ){ int temp; temp=o1;o1=o2;o2=temp; cond=1; } e1->u.s.info=condjump(fs,op,cond,o1,o2); e1->k=VJMP; } static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){ expdesc e2; e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0; switch(op){ case OPR_MINUS:{ if(!isnumeral(e)) luaK_exp2anyreg(fs,e); codearith(fs,OP_UNM,e,&e2); break; } case OPR_NOT:codenot(fs,e);break; case OPR_LEN:{ luaK_exp2anyreg(fs,e); codearith(fs,OP_LEN,e,&e2); break; } default:; } } static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){ switch(op){ case OPR_AND:{ luaK_goiftrue(fs,v); break; } case OPR_OR:{ luaK_goiffalse(fs,v); break; } case OPR_CONCAT:{ luaK_exp2nextreg(fs,v); break; } case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV: case OPR_MOD:case OPR_POW:{ if(!isnumeral(v))luaK_exp2RK(fs,v); break; } default:{ luaK_exp2RK(fs,v); break; } } } static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){ switch(op){ case OPR_AND:{ luaK_dischargevars(fs,e2); luaK_concat(fs,&e2->f,e1->f); *e1=*e2; break; } case OPR_OR:{ luaK_dischargevars(fs,e2); luaK_concat(fs,&e2->t,e1->t); *e1=*e2; break; } case OPR_CONCAT:{ luaK_exp2val(fs,e2); if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){ freeexp(fs,e1); SETARG_B(getcode(fs,e2),e1->u.s.info); e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info; } else{ luaK_exp2nextreg(fs,e2); codearith(fs,OP_CONCAT,e1,e2); } break; } case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break; case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break; case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break; case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break; case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break; case OPR_POW:codearith(fs,OP_POW,e1,e2);break; case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break; case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break; case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break; case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break; case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break; case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break; default:; } } static void luaK_fixline(FuncState*fs,int line){ fs->f->lineinfo[fs->pc-1]=line; } static int luaK_code(FuncState*fs,Instruction i,int line){ Proto*f=fs->f; dischargejpc(fs); luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction, (INT_MAX-2),"code size overflow"); f->code[fs->pc]=i; luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int, (INT_MAX-2),"code size overflow"); f->lineinfo[fs->pc]=line; return fs->pc++; } static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){ return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline); } static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){ return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline); } static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){ int c=(nelems-1)/50+1; int b=(tostore==(-1))?0:tostore; if(c<=((1<<9)-1)) luaK_codeABC(fs,OP_SETLIST,base,b,c); else{ luaK_codeABC(fs,OP_SETLIST,base,b,0); luaK_code(fs,cast(Instruction,c),fs->ls->lastline); } fs->freereg=base+1; } #define hasmultret(k)((k)==VCALL||(k)==VVARARG) #define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]]) #define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m) typedef struct BlockCnt{ struct BlockCnt*previous; int breaklist; lu_byte nactvar; lu_byte upval; lu_byte isbreakable; }BlockCnt; static void chunk(LexState*ls); static void expr(LexState*ls,expdesc*v); static void anchor_token(LexState*ls){ if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){ TString*ts=ls->t.seminfo.ts; luaX_newstring(ls,getstr(ts),ts->tsv.len); } } static void error_expected(LexState*ls,int token){ luaX_syntaxerror(ls, luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token))); } static void errorlimit(FuncState*fs,int limit,const char*what){ const char*msg=(fs->f->linedefined==0)? luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what): luaO_pushfstring(fs->L,"function at line %d has more than %d %s", fs->f->linedefined,limit,what); luaX_lexerror(fs->ls,msg,0); } static int testnext(LexState*ls,int c){ if(ls->t.token==c){ luaX_next(ls); return 1; } else return 0; } static void check(LexState*ls,int c){ if(ls->t.token!=c) error_expected(ls,c); } static void checknext(LexState*ls,int c){ check(ls,c); luaX_next(ls); } #define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);} static void check_match(LexState*ls,int what,int who,int where){ if(!testnext(ls,what)){ if(where==ls->linenumber) error_expected(ls,what); else{ luaX_syntaxerror(ls,luaO_pushfstring(ls->L, LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)", luaX_token2str(ls,what),luaX_token2str(ls,who),where)); } } } static TString*str_checkname(LexState*ls){ TString*ts; check(ls,TK_NAME); ts=ls->t.seminfo.ts; luaX_next(ls); return ts; } static void init_exp(expdesc*e,expkind k,int i){ e->f=e->t=(-1); e->k=k; e->u.s.info=i; } static void codestring(LexState*ls,expdesc*e,TString*s){ init_exp(e,VK,luaK_stringK(ls->fs,s)); } static void checkname(LexState*ls,expdesc*e){ codestring(ls,e,str_checkname(ls)); } static int registerlocalvar(LexState*ls,TString*varname){ FuncState*fs=ls->fs; Proto*f=fs->f; int oldsize=f->sizelocvars; luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars, LocVar,SHRT_MAX,"too many local variables"); while(oldsizesizelocvars)f->locvars[oldsize++].varname=NULL; f->locvars[fs->nlocvars].varname=varname; luaC_objbarrier(ls->L,f,varname); return fs->nlocvars++; } #define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n) static void new_localvar(LexState*ls,TString*name,int n){ FuncState*fs=ls->fs; luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables"); fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name)); } static void adjustlocalvars(LexState*ls,int nvars){ FuncState*fs=ls->fs; fs->nactvar=cast_byte(fs->nactvar+nvars); for(;nvars;nvars--){ getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc; } } static void removevars(LexState*ls,int tolevel){ FuncState*fs=ls->fs; while(fs->nactvar>tolevel) getlocvar(fs,--fs->nactvar).endpc=fs->pc; } static int indexupvalue(FuncState*fs,TString*name,expdesc*v){ int i; Proto*f=fs->f; int oldsize=f->sizeupvalues; for(i=0;inups;i++){ if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){ return i; } } luaY_checklimit(fs,f->nups+1,60,"upvalues"); luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues, TString*,(INT_MAX-2),""); while(oldsizesizeupvalues)f->upvalues[oldsize++]=NULL; f->upvalues[f->nups]=name; luaC_objbarrier(fs->L,f,name); fs->upvalues[f->nups].k=cast_byte(v->k); fs->upvalues[f->nups].info=cast_byte(v->u.s.info); return f->nups++; } static int searchvar(FuncState*fs,TString*n){ int i; for(i=fs->nactvar-1;i>=0;i--){ if(n==getlocvar(fs,i).varname) return i; } return-1; } static void markupval(FuncState*fs,int level){ BlockCnt*bl=fs->bl; while(bl&&bl->nactvar>level)bl=bl->previous; if(bl)bl->upval=1; } static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){ if(fs==NULL){ init_exp(var,VGLOBAL,((1<<8)-1)); return VGLOBAL; } else{ int v=searchvar(fs,n); if(v>=0){ init_exp(var,VLOCAL,v); if(!base) markupval(fs,v); return VLOCAL; } else{ if(singlevaraux(fs->prev,n,var,0)==VGLOBAL) return VGLOBAL; var->u.s.info=indexupvalue(fs,n,var); var->k=VUPVAL; return VUPVAL; } } } static void singlevar(LexState*ls,expdesc*var){ TString*varname=str_checkname(ls); FuncState*fs=ls->fs; if(singlevaraux(fs,varname,var,1)==VGLOBAL) var->u.s.info=luaK_stringK(fs,varname); } static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){ FuncState*fs=ls->fs; int extra=nvars-nexps; if(hasmultret(e->k)){ extra++; if(extra<0)extra=0; luaK_setreturns(fs,e,extra); if(extra>1)luaK_reserveregs(fs,extra-1); } else{ if(e->k!=VVOID)luaK_exp2nextreg(fs,e); if(extra>0){ int reg=fs->freereg; luaK_reserveregs(fs,extra); luaK_nil(fs,reg,extra); } } } static void enterlevel(LexState*ls){ if(++ls->L->nCcalls>200) luaX_lexerror(ls,"chunk has too many syntax levels",0); } #define leavelevel(ls)((ls)->L->nCcalls--) static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){ bl->breaklist=(-1); bl->isbreakable=isbreakable; bl->nactvar=fs->nactvar; bl->upval=0; bl->previous=fs->bl; fs->bl=bl; } static void leaveblock(FuncState*fs){ BlockCnt*bl=fs->bl; fs->bl=bl->previous; removevars(fs->ls,bl->nactvar); if(bl->upval) luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); fs->freereg=fs->nactvar; luaK_patchtohere(fs,bl->breaklist); } static void pushclosure(LexState*ls,FuncState*func,expdesc*v){ FuncState*fs=ls->fs; Proto*f=fs->f; int oldsize=f->sizep; int i; luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*, ((1<<(9+9))-1),"constant table overflow"); while(oldsizesizep)f->p[oldsize++]=NULL; f->p[fs->np++]=func->f; luaC_objbarrier(ls->L,f,func->f); init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1)); for(i=0;if->nups;i++){ OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL; luaK_codeABC(fs,o,0,func->upvalues[i].info,0); } } static void open_func(LexState*ls,FuncState*fs){ lua_State*L=ls->L; Proto*f=luaF_newproto(L); fs->f=f; fs->prev=ls->fs; fs->ls=ls; fs->L=L; ls->fs=fs; fs->pc=0; fs->lasttarget=-1; fs->jpc=(-1); fs->freereg=0; fs->nk=0; fs->np=0; fs->nlocvars=0; fs->nactvar=0; fs->bl=NULL; f->source=ls->source; f->maxstacksize=2; fs->h=luaH_new(L,0,0); sethvalue(L,L->top,fs->h); incr_top(L); setptvalue(L,L->top,f); incr_top(L); } static void close_func(LexState*ls){ lua_State*L=ls->L; FuncState*fs=ls->fs; Proto*f=fs->f; removevars(ls,0); luaK_ret(fs,0,0); luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction); f->sizecode=fs->pc; luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int); f->sizelineinfo=fs->pc; luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue); f->sizek=fs->nk; luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*); f->sizep=fs->np; luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar); f->sizelocvars=fs->nlocvars; luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*); f->sizeupvalues=f->nups; ls->fs=fs->prev; if(fs)anchor_token(ls); L->top-=2; } static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){ struct LexState lexstate; struct FuncState funcstate; lexstate.buff=buff; luaX_setinput(L,&lexstate,z,luaS_new(L,name)); open_func(&lexstate,&funcstate); funcstate.f->is_vararg=2; luaX_next(&lexstate); chunk(&lexstate); check(&lexstate,TK_EOS); close_func(&lexstate); return funcstate.f; } static void field(LexState*ls,expdesc*v){ FuncState*fs=ls->fs; expdesc key; luaK_exp2anyreg(fs,v); luaX_next(ls); checkname(ls,&key); luaK_indexed(fs,v,&key); } static void yindex(LexState*ls,expdesc*v){ luaX_next(ls); expr(ls,v); luaK_exp2val(ls->fs,v); checknext(ls,']'); } struct ConsControl{ expdesc v; expdesc*t; int nh; int na; int tostore; }; static void recfield(LexState*ls,struct ConsControl*cc){ FuncState*fs=ls->fs; int reg=ls->fs->freereg; expdesc key,val; int rkkey; if(ls->t.token==TK_NAME){ luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor"); checkname(ls,&key); } else yindex(ls,&key); cc->nh++; checknext(ls,'='); rkkey=luaK_exp2RK(fs,&key); expr(ls,&val); luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val)); fs->freereg=reg; } static void closelistfield(FuncState*fs,struct ConsControl*cc){ if(cc->v.k==VVOID)return; luaK_exp2nextreg(fs,&cc->v); cc->v.k=VVOID; if(cc->tostore==50){ luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); cc->tostore=0; } } static void lastlistfield(FuncState*fs,struct ConsControl*cc){ if(cc->tostore==0)return; if(hasmultret(cc->v.k)){ luaK_setmultret(fs,&cc->v); luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1)); cc->na--; } else{ if(cc->v.k!=VVOID) luaK_exp2nextreg(fs,&cc->v); luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); } } static void listfield(LexState*ls,struct ConsControl*cc){ expr(ls,&cc->v); luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor"); cc->na++; cc->tostore++; } static void constructor(LexState*ls,expdesc*t){ FuncState*fs=ls->fs; int line=ls->linenumber; int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0); struct ConsControl cc; cc.na=cc.nh=cc.tostore=0; cc.t=t; init_exp(t,VRELOCABLE,pc); init_exp(&cc.v,VVOID,0); luaK_exp2nextreg(ls->fs,t); checknext(ls,'{'); do{ if(ls->t.token=='}')break; closelistfield(fs,&cc); switch(ls->t.token){ case TK_NAME:{ luaX_lookahead(ls); if(ls->lookahead.token!='=') listfield(ls,&cc); else recfield(ls,&cc); break; } case'[':{ recfield(ls,&cc); break; } default:{ listfield(ls,&cc); break; } } }while(testnext(ls,',')||testnext(ls,';')); check_match(ls,'}','{',line); lastlistfield(fs,&cc); SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na)); SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh)); } static void parlist(LexState*ls){ FuncState*fs=ls->fs; Proto*f=fs->f; int nparams=0; f->is_vararg=0; if(ls->t.token!=')'){ do{ switch(ls->t.token){ case TK_NAME:{ new_localvar(ls,str_checkname(ls),nparams++); break; } case TK_DOTS:{ luaX_next(ls); f->is_vararg|=2; break; } default:luaX_syntaxerror(ls," or "LUA_QL("...")" expected"); } }while(!f->is_vararg&&testnext(ls,',')); } adjustlocalvars(ls,nparams); f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1)); luaK_reserveregs(fs,fs->nactvar); } static void body(LexState*ls,expdesc*e,int needself,int line){ FuncState new_fs; open_func(ls,&new_fs); new_fs.f->linedefined=line; checknext(ls,'('); if(needself){ new_localvarliteral(ls,"self",0); adjustlocalvars(ls,1); } parlist(ls); checknext(ls,')'); chunk(ls); new_fs.f->lastlinedefined=ls->linenumber; check_match(ls,TK_END,TK_FUNCTION,line); close_func(ls); pushclosure(ls,&new_fs,e); } static int explist1(LexState*ls,expdesc*v){ int n=1; expr(ls,v); while(testnext(ls,',')){ luaK_exp2nextreg(ls->fs,v); expr(ls,v); n++; } return n; } static void funcargs(LexState*ls,expdesc*f){ FuncState*fs=ls->fs; expdesc args; int base,nparams; int line=ls->linenumber; switch(ls->t.token){ case'(':{ if(line!=ls->lastline) luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); luaX_next(ls); if(ls->t.token==')') args.k=VVOID; else{ explist1(ls,&args); luaK_setmultret(fs,&args); } check_match(ls,')','(',line); break; } case'{':{ constructor(ls,&args); break; } case TK_STRING:{ codestring(ls,&args,ls->t.seminfo.ts); luaX_next(ls); break; } default:{ luaX_syntaxerror(ls,"function arguments expected"); return; } } base=f->u.s.info; if(hasmultret(args.k)) nparams=(-1); else{ if(args.k!=VVOID) luaK_exp2nextreg(fs,&args); nparams=fs->freereg-(base+1); } init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2)); luaK_fixline(fs,line); fs->freereg=base+1; } static void prefixexp(LexState*ls,expdesc*v){ switch(ls->t.token){ case'(':{ int line=ls->linenumber; luaX_next(ls); expr(ls,v); check_match(ls,')','(',line); luaK_dischargevars(ls->fs,v); return; } case TK_NAME:{ singlevar(ls,v); return; } default:{ luaX_syntaxerror(ls,"unexpected symbol"); return; } } } static void primaryexp(LexState*ls,expdesc*v){ FuncState*fs=ls->fs; prefixexp(ls,v); for(;;){ switch(ls->t.token){ case'.':{ field(ls,v); break; } case'[':{ expdesc key; luaK_exp2anyreg(fs,v); yindex(ls,&key); luaK_indexed(fs,v,&key); break; } case':':{ expdesc key; luaX_next(ls); checkname(ls,&key); luaK_self(fs,v,&key); funcargs(ls,v); break; } case'(':case TK_STRING:case'{':{ luaK_exp2nextreg(fs,v); funcargs(ls,v); break; } default:return; } } } static void simpleexp(LexState*ls,expdesc*v){ switch(ls->t.token){ case TK_NUMBER:{ init_exp(v,VKNUM,0); v->u.nval=ls->t.seminfo.r; break; } case TK_STRING:{ codestring(ls,v,ls->t.seminfo.ts); break; } case TK_NIL:{ init_exp(v,VNIL,0); break; } case TK_TRUE:{ init_exp(v,VTRUE,0); break; } case TK_FALSE:{ init_exp(v,VFALSE,0); break; } case TK_DOTS:{ FuncState*fs=ls->fs; check_condition(ls,fs->f->is_vararg, "cannot use "LUA_QL("...")" outside a vararg function"); fs->f->is_vararg&=~4; init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0)); break; } case'{':{ constructor(ls,v); return; } case TK_FUNCTION:{ luaX_next(ls); body(ls,v,0,ls->linenumber); return; } default:{ primaryexp(ls,v); return; } } luaX_next(ls); } static UnOpr getunopr(int op){ switch(op){ case TK_NOT:return OPR_NOT; case'-':return OPR_MINUS; case'#':return OPR_LEN; default:return OPR_NOUNOPR; } } static BinOpr getbinopr(int op){ switch(op){ case'+':return OPR_ADD; case'-':return OPR_SUB; case'*':return OPR_MUL; case'/':return OPR_DIV; case'%':return OPR_MOD; case'^':return OPR_POW; case TK_CONCAT:return OPR_CONCAT; case TK_NE:return OPR_NE; case TK_EQ:return OPR_EQ; case'<':return OPR_LT; case TK_LE:return OPR_LE; case'>':return OPR_GT; case TK_GE:return OPR_GE; case TK_AND:return OPR_AND; case TK_OR:return OPR_OR; default:return OPR_NOBINOPR; } } static const struct{ lu_byte left; lu_byte right; }priority[]={ {6,6},{6,6},{7,7},{7,7},{7,7}, {10,9},{5,4}, {3,3},{3,3}, {3,3},{3,3},{3,3},{3,3}, {2,2},{1,1} }; static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){ BinOpr op; UnOpr uop; enterlevel(ls); uop=getunopr(ls->t.token); if(uop!=OPR_NOUNOPR){ luaX_next(ls); subexpr(ls,v,8); luaK_prefix(ls->fs,uop,v); } else simpleexp(ls,v); op=getbinopr(ls->t.token); while(op!=OPR_NOBINOPR&&priority[op].left>limit){ expdesc v2; BinOpr nextop; luaX_next(ls); luaK_infix(ls->fs,op,v); nextop=subexpr(ls,&v2,priority[op].right); luaK_posfix(ls->fs,op,v,&v2); op=nextop; } leavelevel(ls); return op; } static void expr(LexState*ls,expdesc*v){ subexpr(ls,v,0); } static int block_follow(int token){ switch(token){ case TK_ELSE:case TK_ELSEIF:case TK_END: case TK_UNTIL:case TK_EOS: return 1; default:return 0; } } static void block(LexState*ls){ FuncState*fs=ls->fs; BlockCnt bl; enterblock(fs,&bl,0); chunk(ls); leaveblock(fs); } struct LHS_assign{ struct LHS_assign*prev; expdesc v; }; static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){ FuncState*fs=ls->fs; int extra=fs->freereg; int conflict=0; for(;lh;lh=lh->prev){ if(lh->v.k==VINDEXED){ if(lh->v.u.s.info==v->u.s.info){ conflict=1; lh->v.u.s.info=extra; } if(lh->v.u.s.aux==v->u.s.info){ conflict=1; lh->v.u.s.aux=extra; } } } if(conflict){ luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0); luaK_reserveregs(fs,1); } } static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){ expdesc e; check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED, "syntax error"); if(testnext(ls,',')){ struct LHS_assign nv; nv.prev=lh; primaryexp(ls,&nv.v); if(nv.v.k==VLOCAL) check_conflict(ls,lh,&nv.v); luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls, "variables in assignment"); assignment(ls,&nv,nvars+1); } else{ int nexps; checknext(ls,'='); nexps=explist1(ls,&e); if(nexps!=nvars){ adjust_assign(ls,nvars,nexps,&e); if(nexps>nvars) ls->fs->freereg-=nexps-nvars; } else{ luaK_setoneret(ls->fs,&e); luaK_storevar(ls->fs,&lh->v,&e); return; } } init_exp(&e,VNONRELOC,ls->fs->freereg-1); luaK_storevar(ls->fs,&lh->v,&e); } static int cond(LexState*ls){ expdesc v; expr(ls,&v); if(v.k==VNIL)v.k=VFALSE; luaK_goiftrue(ls->fs,&v); return v.f; } static void breakstat(LexState*ls){ FuncState*fs=ls->fs; BlockCnt*bl=fs->bl; int upval=0; while(bl&&!bl->isbreakable){ upval|=bl->upval; bl=bl->previous; } if(!bl) luaX_syntaxerror(ls,"no loop to break"); if(upval) luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); luaK_concat(fs,&bl->breaklist,luaK_jump(fs)); } static void whilestat(LexState*ls,int line){ FuncState*fs=ls->fs; int whileinit; int condexit; BlockCnt bl; luaX_next(ls); whileinit=luaK_getlabel(fs); condexit=cond(ls); enterblock(fs,&bl,1); checknext(ls,TK_DO); block(ls); luaK_patchlist(fs,luaK_jump(fs),whileinit); check_match(ls,TK_END,TK_WHILE,line); leaveblock(fs); luaK_patchtohere(fs,condexit); } static void repeatstat(LexState*ls,int line){ int condexit; FuncState*fs=ls->fs; int repeat_init=luaK_getlabel(fs); BlockCnt bl1,bl2; enterblock(fs,&bl1,1); enterblock(fs,&bl2,0); luaX_next(ls); chunk(ls); check_match(ls,TK_UNTIL,TK_REPEAT,line); condexit=cond(ls); if(!bl2.upval){ leaveblock(fs); luaK_patchlist(ls->fs,condexit,repeat_init); } else{ breakstat(ls); luaK_patchtohere(ls->fs,condexit); leaveblock(fs); luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init); } leaveblock(fs); } static int exp1(LexState*ls){ expdesc e; int k; expr(ls,&e); k=e.k; luaK_exp2nextreg(ls->fs,&e); return k; } static void forbody(LexState*ls,int base,int line,int nvars,int isnum){ BlockCnt bl; FuncState*fs=ls->fs; int prep,endfor; adjustlocalvars(ls,3); checknext(ls,TK_DO); prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs); enterblock(fs,&bl,0); adjustlocalvars(ls,nvars); luaK_reserveregs(fs,nvars); block(ls); leaveblock(fs); luaK_patchtohere(fs,prep); endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)): luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars); luaK_fixline(fs,line); luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1); } static void fornum(LexState*ls,TString*varname,int line){ FuncState*fs=ls->fs; int base=fs->freereg; new_localvarliteral(ls,"(for index)",0); new_localvarliteral(ls,"(for limit)",1); new_localvarliteral(ls,"(for step)",2); new_localvar(ls,varname,3); checknext(ls,'='); exp1(ls); checknext(ls,','); exp1(ls); if(testnext(ls,',')) exp1(ls); else{ luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1)); luaK_reserveregs(fs,1); } forbody(ls,base,line,1,1); } static void forlist(LexState*ls,TString*indexname){ FuncState*fs=ls->fs; expdesc e; int nvars=0; int line; int base=fs->freereg; new_localvarliteral(ls,"(for generator)",nvars++); new_localvarliteral(ls,"(for state)",nvars++); new_localvarliteral(ls,"(for control)",nvars++); new_localvar(ls,indexname,nvars++); while(testnext(ls,',')) new_localvar(ls,str_checkname(ls),nvars++); checknext(ls,TK_IN); line=ls->linenumber; adjust_assign(ls,3,explist1(ls,&e),&e); luaK_checkstack(fs,3); forbody(ls,base,line,nvars-3,0); } static void forstat(LexState*ls,int line){ FuncState*fs=ls->fs; TString*varname; BlockCnt bl; enterblock(fs,&bl,1); luaX_next(ls); varname=str_checkname(ls); switch(ls->t.token){ case'=':fornum(ls,varname,line);break; case',':case TK_IN:forlist(ls,varname);break; default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected"); } check_match(ls,TK_END,TK_FOR,line); leaveblock(fs); } static int test_then_block(LexState*ls){ int condexit; luaX_next(ls); condexit=cond(ls); checknext(ls,TK_THEN); block(ls); return condexit; } static void ifstat(LexState*ls,int line){ FuncState*fs=ls->fs; int flist; int escapelist=(-1); flist=test_then_block(ls); while(ls->t.token==TK_ELSEIF){ luaK_concat(fs,&escapelist,luaK_jump(fs)); luaK_patchtohere(fs,flist); flist=test_then_block(ls); } if(ls->t.token==TK_ELSE){ luaK_concat(fs,&escapelist,luaK_jump(fs)); luaK_patchtohere(fs,flist); luaX_next(ls); block(ls); } else luaK_concat(fs,&escapelist,flist); luaK_patchtohere(fs,escapelist); check_match(ls,TK_END,TK_IF,line); } static void localfunc(LexState*ls){ expdesc v,b; FuncState*fs=ls->fs; new_localvar(ls,str_checkname(ls),0); init_exp(&v,VLOCAL,fs->freereg); luaK_reserveregs(fs,1); adjustlocalvars(ls,1); body(ls,&b,0,ls->linenumber); luaK_storevar(fs,&v,&b); getlocvar(fs,fs->nactvar-1).startpc=fs->pc; } static void localstat(LexState*ls){ int nvars=0; int nexps; expdesc e; do{ new_localvar(ls,str_checkname(ls),nvars++); }while(testnext(ls,',')); if(testnext(ls,'=')) nexps=explist1(ls,&e); else{ e.k=VVOID; nexps=0; } adjust_assign(ls,nvars,nexps,&e); adjustlocalvars(ls,nvars); } static int funcname(LexState*ls,expdesc*v){ int needself=0; singlevar(ls,v); while(ls->t.token=='.') field(ls,v); if(ls->t.token==':'){ needself=1; field(ls,v); } return needself; } static void funcstat(LexState*ls,int line){ int needself; expdesc v,b; luaX_next(ls); needself=funcname(ls,&v); body(ls,&b,needself,line); luaK_storevar(ls->fs,&v,&b); luaK_fixline(ls->fs,line); } static void exprstat(LexState*ls){ FuncState*fs=ls->fs; struct LHS_assign v; primaryexp(ls,&v.v); if(v.v.k==VCALL) SETARG_C(getcode(fs,&v.v),1); else{ v.prev=NULL; assignment(ls,&v,1); } } static void retstat(LexState*ls){ FuncState*fs=ls->fs; expdesc e; int first,nret; luaX_next(ls); if(block_follow(ls->t.token)||ls->t.token==';') first=nret=0; else{ nret=explist1(ls,&e); if(hasmultret(e.k)){ luaK_setmultret(fs,&e); if(e.k==VCALL&&nret==1){ SET_OPCODE(getcode(fs,&e),OP_TAILCALL); } first=fs->nactvar; nret=(-1); } else{ if(nret==1) first=luaK_exp2anyreg(fs,&e); else{ luaK_exp2nextreg(fs,&e); first=fs->nactvar; } } } luaK_ret(fs,first,nret); } static int statement(LexState*ls){ int line=ls->linenumber; switch(ls->t.token){ case TK_IF:{ ifstat(ls,line); return 0; } case TK_WHILE:{ whilestat(ls,line); return 0; } case TK_DO:{ luaX_next(ls); block(ls); check_match(ls,TK_END,TK_DO,line); return 0; } case TK_FOR:{ forstat(ls,line); return 0; } case TK_REPEAT:{ repeatstat(ls,line); return 0; } case TK_FUNCTION:{ funcstat(ls,line); return 0; } case TK_LOCAL:{ luaX_next(ls); if(testnext(ls,TK_FUNCTION)) localfunc(ls); else localstat(ls); return 0; } case TK_RETURN:{ retstat(ls); return 1; } case TK_BREAK:{ luaX_next(ls); breakstat(ls); return 1; } default:{ exprstat(ls); return 0; } } } static void chunk(LexState*ls){ int islast=0; enterlevel(ls); while(!islast&&!block_follow(ls->t.token)){ islast=statement(ls); testnext(ls,';'); ls->fs->freereg=ls->fs->nactvar; } leavelevel(ls); } static const TValue*luaV_tonumber(const TValue*obj,TValue*n){ lua_Number num; if(ttisnumber(obj))return obj; if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){ setnvalue(n,num); return n; } else return NULL; } static int luaV_tostring(lua_State*L,StkId obj){ if(!ttisnumber(obj)) return 0; else{ char s[32]; lua_Number n=nvalue(obj); lua_number2str(s,n); setsvalue(L,obj,luaS_new(L,s)); return 1; } } static void callTMres(lua_State*L,StkId res,const TValue*f, const TValue*p1,const TValue*p2){ ptrdiff_t result=savestack(L,res); setobj(L,L->top,f); setobj(L,L->top+1,p1); setobj(L,L->top+2,p2); luaD_checkstack(L,3); L->top+=3; luaD_call(L,L->top-3,1); res=restorestack(L,result); L->top--; setobj(L,res,L->top); } static void callTM(lua_State*L,const TValue*f,const TValue*p1, const TValue*p2,const TValue*p3){ setobj(L,L->top,f); setobj(L,L->top+1,p1); setobj(L,L->top+2,p2); setobj(L,L->top+3,p3); luaD_checkstack(L,4); L->top+=4; luaD_call(L,L->top-4,0); } static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){ int loop; for(loop=0;loop<100;loop++){ const TValue*tm; if(ttistable(t)){ Table*h=hvalue(t); const TValue*res=luaH_get(h,key); if(!ttisnil(res)|| (tm=fasttm(L,h->metatable,TM_INDEX))==NULL){ setobj(L,val,res); return; } } else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX))) luaG_typeerror(L,t,"index"); if(ttisfunction(tm)){ callTMres(L,val,tm,t,key); return; } t=tm; } luaG_runerror(L,"loop in gettable"); } static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){ int loop; TValue temp; for(loop=0;loop<100;loop++){ const TValue*tm; if(ttistable(t)){ Table*h=hvalue(t); TValue*oldval=luaH_set(L,h,key); if(!ttisnil(oldval)|| (tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){ setobj(L,oldval,val); h->flags=0; luaC_barriert(L,h,val); return; } } else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX))) luaG_typeerror(L,t,"index"); if(ttisfunction(tm)){ callTM(L,tm,t,key,val); return; } setobj(L,&temp,tm); t=&temp; } luaG_runerror(L,"loop in settable"); } static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2, StkId res,TMS event){ const TValue*tm=luaT_gettmbyobj(L,p1,event); if(ttisnil(tm)) tm=luaT_gettmbyobj(L,p2,event); if(ttisnil(tm))return 0; callTMres(L,res,tm,p1,p2); return 1; } static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2, TMS event){ const TValue*tm1=fasttm(L,mt1,event); const TValue*tm2; if(tm1==NULL)return NULL; if(mt1==mt2)return tm1; tm2=fasttm(L,mt2,event); if(tm2==NULL)return NULL; if(luaO_rawequalObj(tm1,tm2)) return tm1; return NULL; } static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2, TMS event){ const TValue*tm1=luaT_gettmbyobj(L,p1,event); const TValue*tm2; if(ttisnil(tm1))return-1; tm2=luaT_gettmbyobj(L,p2,event); if(!luaO_rawequalObj(tm1,tm2)) return-1; callTMres(L,L->top,tm1,p1,p2); return!l_isfalse(L->top); } static int l_strcmp(const TString*ls,const TString*rs){ const char*l=getstr(ls); size_t ll=ls->tsv.len; const char*r=getstr(rs); size_t lr=rs->tsv.len; for(;;){ int temp=strcoll(l,r); if(temp!=0)return temp; else{ size_t len=strlen(l); if(len==lr) return(len==ll)?0:1; else if(len==ll) return-1; len++; l+=len;ll-=len;r+=len;lr-=len; } } } static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){ int res; if(ttype(l)!=ttype(r)) return luaG_ordererror(L,l,r); else if(ttisnumber(l)) return luai_numlt(nvalue(l),nvalue(r)); else if(ttisstring(l)) return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0; else if((res=call_orderTM(L,l,r,TM_LT))!=-1) return res; return luaG_ordererror(L,l,r); } static int lessequal(lua_State*L,const TValue*l,const TValue*r){ int res; if(ttype(l)!=ttype(r)) return luaG_ordererror(L,l,r); else if(ttisnumber(l)) return luai_numle(nvalue(l),nvalue(r)); else if(ttisstring(l)) return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0; else if((res=call_orderTM(L,l,r,TM_LE))!=-1) return res; else if((res=call_orderTM(L,r,l,TM_LT))!=-1) return!res; return luaG_ordererror(L,l,r); } static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){ const TValue*tm; switch(ttype(t1)){ case 0:return 1; case 3:return luai_numeq(nvalue(t1),nvalue(t2)); case 1:return bvalue(t1)==bvalue(t2); case 2:return pvalue(t1)==pvalue(t2); case 7:{ if(uvalue(t1)==uvalue(t2))return 1; tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable, TM_EQ); break; } case 5:{ if(hvalue(t1)==hvalue(t2))return 1; tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ); break; } default:return gcvalue(t1)==gcvalue(t2); } if(tm==NULL)return 0; callTMres(L,L->top,tm,t1,t2); return!l_isfalse(L->top); } static void luaV_concat(lua_State*L,int total,int last){ do{ StkId top=L->base+last+1; int n=2; if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){ if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT)) luaG_concaterror(L,top-2,top-1); }else if(tsvalue(top-1)->len==0) (void)tostring(L,top-2); else{ size_t tl=tsvalue(top-1)->len; char*buffer; int i; for(n=1;nlen; if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow"); tl+=l; } buffer=luaZ_openspace(L,&G(L)->buff,tl); tl=0; for(i=n;i>0;i--){ size_t l=tsvalue(top-i)->len; memcpy(buffer+tl,svalue(top-i),l); tl+=l; } setsvalue(L,top-n,luaS_newlstr(L,buffer,tl)); } total-=n-1; last-=n-1; }while(total>1); } static void Arith(lua_State*L,StkId ra,const TValue*rb, const TValue*rc,TMS op){ TValue tempb,tempc; const TValue*b,*c; if((b=luaV_tonumber(rb,&tempb))!=NULL&& (c=luaV_tonumber(rc,&tempc))!=NULL){ lua_Number nb=nvalue(b),nc=nvalue(c); switch(op){ case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break; case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break; case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break; case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break; case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break; case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break; case TM_UNM:setnvalue(ra,luai_numunm(nb));break; default:break; } } else if(!call_binTM(L,rb,rc,ra,op)) luaG_aritherror(L,rb,rc); } #define runtime_check(L,c){if(!(c))break;} #define RA(i)(base+GETARG_A(i)) #define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i)) #define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i)) #define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i)) #define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i)) #define dojump(L,pc,i){(pc)+=(i);} #define Protect(x){L->savedpc=pc;{x;};base=L->base;} #define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));} static void luaV_execute(lua_State*L,int nexeccalls){ LClosure*cl; StkId base; TValue*k; const Instruction*pc; reentry: pc=L->savedpc; cl=&clvalue(L->ci->func)->l; base=L->base; k=cl->p->k; for(;;){ const Instruction i=*pc++; StkId ra; ra=RA(i); switch(GET_OPCODE(i)){ case OP_MOVE:{ setobj(L,ra,RB(i)); continue; } case OP_LOADK:{ setobj(L,ra,KBx(i)); continue; } case OP_LOADBOOL:{ setbvalue(ra,GETARG_B(i)); if(GETARG_C(i))pc++; continue; } case OP_LOADNIL:{ TValue*rb=RB(i); do{ setnilvalue(rb--); }while(rb>=ra); continue; } case OP_GETUPVAL:{ int b=GETARG_B(i); setobj(L,ra,cl->upvals[b]->v); continue; } case OP_GETGLOBAL:{ TValue g; TValue*rb=KBx(i); sethvalue(L,&g,cl->env); Protect(luaV_gettable(L,&g,rb,ra)); continue; } case OP_GETTABLE:{ Protect(luaV_gettable(L,RB(i),RKC(i),ra)); continue; } case OP_SETGLOBAL:{ TValue g; sethvalue(L,&g,cl->env); Protect(luaV_settable(L,&g,KBx(i),ra)); continue; } case OP_SETUPVAL:{ UpVal*uv=cl->upvals[GETARG_B(i)]; setobj(L,uv->v,ra); luaC_barrier(L,uv,ra); continue; } case OP_SETTABLE:{ Protect(luaV_settable(L,ra,RKB(i),RKC(i))); continue; } case OP_NEWTABLE:{ int b=GETARG_B(i); int c=GETARG_C(i); sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c))); Protect(luaC_checkGC(L)); continue; } case OP_SELF:{ StkId rb=RB(i); setobj(L,ra+1,rb); Protect(luaV_gettable(L,rb,RKC(i),ra)); continue; } case OP_ADD:{ arith_op(luai_numadd,TM_ADD); continue; } case OP_SUB:{ arith_op(luai_numsub,TM_SUB); continue; } case OP_MUL:{ arith_op(luai_nummul,TM_MUL); continue; } case OP_DIV:{ arith_op(luai_numdiv,TM_DIV); continue; } case OP_MOD:{ arith_op(luai_nummod,TM_MOD); continue; } case OP_POW:{ arith_op(luai_numpow,TM_POW); continue; } case OP_UNM:{ TValue*rb=RB(i); if(ttisnumber(rb)){ lua_Number nb=nvalue(rb); setnvalue(ra,luai_numunm(nb)); } else{ Protect(Arith(L,ra,rb,rb,TM_UNM)); } continue; } case OP_NOT:{ int res=l_isfalse(RB(i)); setbvalue(ra,res); continue; } case OP_LEN:{ const TValue*rb=RB(i); switch(ttype(rb)){ case 5:{ setnvalue(ra,cast_num(luaH_getn(hvalue(rb)))); break; } case 4:{ setnvalue(ra,cast_num(tsvalue(rb)->len)); break; } default:{ Protect( if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN)) luaG_typeerror(L,rb,"get length of"); ) } } continue; } case OP_CONCAT:{ int b=GETARG_B(i); int c=GETARG_C(i); Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L)); setobj(L,RA(i),base+b); continue; } case OP_JMP:{ dojump(L,pc,GETARG_sBx(i)); continue; } case OP_EQ:{ TValue*rb=RKB(i); TValue*rc=RKC(i); Protect( if(equalobj(L,rb,rc)==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_LT:{ Protect( if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_LE:{ Protect( if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_TEST:{ if(l_isfalse(ra)!=GETARG_C(i)) dojump(L,pc,GETARG_sBx(*pc)); pc++; continue; } case OP_TESTSET:{ TValue*rb=RB(i); if(l_isfalse(rb)!=GETARG_C(i)){ setobj(L,ra,rb); dojump(L,pc,GETARG_sBx(*pc)); } pc++; continue; } case OP_CALL:{ int b=GETARG_B(i); int nresults=GETARG_C(i)-1; if(b!=0)L->top=ra+b; L->savedpc=pc; switch(luaD_precall(L,ra,nresults)){ case 0:{ nexeccalls++; goto reentry; } case 1:{ if(nresults>=0)L->top=L->ci->top; base=L->base; continue; } default:{ return; } } } case OP_TAILCALL:{ int b=GETARG_B(i); if(b!=0)L->top=ra+b; L->savedpc=pc; switch(luaD_precall(L,ra,(-1))){ case 0:{ CallInfo*ci=L->ci-1; int aux; StkId func=ci->func; StkId pfunc=(ci+1)->func; if(L->openupval)luaF_close(L,ci->base); L->base=ci->base=ci->func+((ci+1)->base-pfunc); for(aux=0;pfunc+auxtop;aux++) setobj(L,func+aux,pfunc+aux); ci->top=L->top=func+aux; ci->savedpc=L->savedpc; ci->tailcalls++; L->ci--; goto reentry; } case 1:{ base=L->base; continue; } default:{ return; } } } case OP_RETURN:{ int b=GETARG_B(i); if(b!=0)L->top=ra+b-1; if(L->openupval)luaF_close(L,base); L->savedpc=pc; b=luaD_poscall(L,ra); if(--nexeccalls==0) return; else{ if(b)L->top=L->ci->top; goto reentry; } } case OP_FORLOOP:{ lua_Number step=nvalue(ra+2); lua_Number idx=luai_numadd(nvalue(ra),step); lua_Number limit=nvalue(ra+1); if(luai_numlt(0,step)?luai_numle(idx,limit) :luai_numle(limit,idx)){ dojump(L,pc,GETARG_sBx(i)); setnvalue(ra,idx); setnvalue(ra+3,idx); } continue; } case OP_FORPREP:{ const TValue*init=ra; const TValue*plimit=ra+1; const TValue*pstep=ra+2; L->savedpc=pc; if(!tonumber(init,ra)) luaG_runerror(L,LUA_QL("for")" initial value must be a number"); else if(!tonumber(plimit,ra+1)) luaG_runerror(L,LUA_QL("for")" limit must be a number"); else if(!tonumber(pstep,ra+2)) luaG_runerror(L,LUA_QL("for")" step must be a number"); setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep))); dojump(L,pc,GETARG_sBx(i)); continue; } case OP_TFORLOOP:{ StkId cb=ra+3; setobj(L,cb+2,ra+2); setobj(L,cb+1,ra+1); setobj(L,cb,ra); L->top=cb+3; Protect(luaD_call(L,cb,GETARG_C(i))); L->top=L->ci->top; cb=RA(i)+3; if(!ttisnil(cb)){ setobj(L,cb-1,cb); dojump(L,pc,GETARG_sBx(*pc)); } pc++; continue; } case OP_SETLIST:{ int n=GETARG_B(i); int c=GETARG_C(i); int last; Table*h; if(n==0){ n=cast_int(L->top-ra)-1; L->top=L->ci->top; } if(c==0)c=cast_int(*pc++); runtime_check(L,ttistable(ra)); h=hvalue(ra); last=((c-1)*50)+n; if(last>h->sizearray) luaH_resizearray(L,h,last); for(;n>0;n--){ TValue*val=ra+n; setobj(L,luaH_setnum(L,h,last--),val); luaC_barriert(L,h,val); } continue; } case OP_CLOSE:{ luaF_close(L,ra); continue; } case OP_CLOSURE:{ Proto*p; Closure*ncl; int nup,j; p=cl->p->p[GETARG_Bx(i)]; nup=p->nups; ncl=luaF_newLclosure(L,nup,cl->env); ncl->l.p=p; for(j=0;jl.upvals[j]=cl->upvals[GETARG_B(*pc)]; else{ ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc)); } } setclvalue(L,ra,ncl); Protect(luaC_checkGC(L)); continue; } case OP_VARARG:{ int b=GETARG_B(i)-1; int j; CallInfo*ci=L->ci; int n=cast_int(ci->base-ci->func)-cl->p->numparams-1; if(b==(-1)){ Protect(luaD_checkstack(L,n)); ra=RA(i); b=n; L->top=ra+n; } for(j=0;jbase-n+j); } else{ setnilvalue(ra+j); } } continue; } } } } #define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base)) #define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_)) #define api_incr_top(L){luai_apicheck(L,L->topci->top);L->top++;} static TValue*index2adr(lua_State*L,int idx){ if(idx>0){ TValue*o=L->base+(idx-1); luai_apicheck(L,idx<=L->ci->top-L->base); if(o>=L->top)return cast(TValue*,(&luaO_nilobject_)); else return o; } else if(idx>(-10000)){ luai_apicheck(L,idx!=0&&-idx<=L->top-L->base); return L->top+idx; } else switch(idx){ case(-10000):return registry(L); case(-10001):{ Closure*func=curr_func(L); sethvalue(L,&L->env,func->c.env); return&L->env; } case(-10002):return gt(L); default:{ Closure*func=curr_func(L); idx=(-10002)-idx; return(idx<=func->c.nupvalues) ?&func->c.upvalue[idx-1] :cast(TValue*,(&luaO_nilobject_)); } } } static Table*getcurrenv(lua_State*L){ if(L->ci==L->base_ci) return hvalue(gt(L)); else{ Closure*func=curr_func(L); return func->c.env; } } static int lua_checkstack(lua_State*L,int size){ int res=1; if(size>8000||(L->top-L->base+size)>8000) res=0; else if(size>0){ luaD_checkstack(L,size); if(L->ci->toptop+size) L->ci->top=L->top+size; } return res; } static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){ lua_CFunction old; old=G(L)->panic; G(L)->panic=panicf; return old; } static int lua_gettop(lua_State*L){ return cast_int(L->top-L->base); } static void lua_settop(lua_State*L,int idx){ if(idx>=0){ luai_apicheck(L,idx<=L->stack_last-L->base); while(L->topbase+idx) setnilvalue(L->top++); L->top=L->base+idx; } else{ luai_apicheck(L,-(idx+1)<=(L->top-L->base)); L->top+=idx+1; } } static void lua_remove(lua_State*L,int idx){ StkId p; p=index2adr(L,idx); api_checkvalidindex(L,p); while(++ptop)setobj(L,p-1,p); L->top--; } static void lua_insert(lua_State*L,int idx){ StkId p; StkId q; p=index2adr(L,idx); api_checkvalidindex(L,p); for(q=L->top;q>p;q--)setobj(L,q,q-1); setobj(L,p,L->top); } static void lua_replace(lua_State*L,int idx){ StkId o; if(idx==(-10001)&&L->ci==L->base_ci) luaG_runerror(L,"no calling environment"); api_checknelems(L,1); o=index2adr(L,idx); api_checkvalidindex(L,o); if(idx==(-10001)){ Closure*func=curr_func(L); luai_apicheck(L,ttistable(L->top-1)); func->c.env=hvalue(L->top-1); luaC_barrier(L,func,L->top-1); } else{ setobj(L,o,L->top-1); if(idx<(-10002)) luaC_barrier(L,curr_func(L),L->top-1); } L->top--; } static void lua_pushvalue(lua_State*L,int idx){ setobj(L,L->top,index2adr(L,idx)); api_incr_top(L); } static int lua_type(lua_State*L,int idx){ StkId o=index2adr(L,idx); return(o==(&luaO_nilobject_))?(-1):ttype(o); } static const char*lua_typename(lua_State*L,int t){ UNUSED(L); return(t==(-1))?"no value":luaT_typenames[t]; } static int lua_iscfunction(lua_State*L,int idx){ StkId o=index2adr(L,idx); return iscfunction(o); } static int lua_isnumber(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); return tonumber(o,&n); } static int lua_isstring(lua_State*L,int idx){ int t=lua_type(L,idx); return(t==4||t==3); } static int lua_rawequal(lua_State*L,int index1,int index2){ StkId o1=index2adr(L,index1); StkId o2=index2adr(L,index2); return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 :luaO_rawequalObj(o1,o2); } static int lua_lessthan(lua_State*L,int index1,int index2){ StkId o1,o2; int i; o1=index2adr(L,index1); o2=index2adr(L,index2); i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 :luaV_lessthan(L,o1,o2); return i; } static lua_Number lua_tonumber(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); if(tonumber(o,&n)) return nvalue(o); else return 0; } static lua_Integer lua_tointeger(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); if(tonumber(o,&n)){ lua_Integer res; lua_Number num=nvalue(o); lua_number2integer(res,num); return res; } else return 0; } static int lua_toboolean(lua_State*L,int idx){ const TValue*o=index2adr(L,idx); return!l_isfalse(o); } static const char*lua_tolstring(lua_State*L,int idx,size_t*len){ StkId o=index2adr(L,idx); if(!ttisstring(o)){ if(!luaV_tostring(L,o)){ if(len!=NULL)*len=0; return NULL; } luaC_checkGC(L); o=index2adr(L,idx); } if(len!=NULL)*len=tsvalue(o)->len; return svalue(o); } static size_t lua_objlen(lua_State*L,int idx){ StkId o=index2adr(L,idx); switch(ttype(o)){ case 4:return tsvalue(o)->len; case 7:return uvalue(o)->len; case 5:return luaH_getn(hvalue(o)); case 3:{ size_t l; l=(luaV_tostring(L,o)?tsvalue(o)->len:0); return l; } default:return 0; } } static lua_CFunction lua_tocfunction(lua_State*L,int idx){ StkId o=index2adr(L,idx); return(!iscfunction(o))?NULL:clvalue(o)->c.f; } static void*lua_touserdata(lua_State*L,int idx){ StkId o=index2adr(L,idx); switch(ttype(o)){ case 7:return(rawuvalue(o)+1); case 2:return pvalue(o); default:return NULL; } } static void lua_pushnil(lua_State*L){ setnilvalue(L->top); api_incr_top(L); } static void lua_pushnumber(lua_State*L,lua_Number n){ setnvalue(L->top,n); api_incr_top(L); } static void lua_pushinteger(lua_State*L,lua_Integer n){ setnvalue(L->top,cast_num(n)); api_incr_top(L); } static void lua_pushlstring(lua_State*L,const char*s,size_t len){ luaC_checkGC(L); setsvalue(L,L->top,luaS_newlstr(L,s,len)); api_incr_top(L); } static void lua_pushstring(lua_State*L,const char*s){ if(s==NULL) lua_pushnil(L); else lua_pushlstring(L,s,strlen(s)); } static const char*lua_pushvfstring(lua_State*L,const char*fmt, va_list argp){ const char*ret; luaC_checkGC(L); ret=luaO_pushvfstring(L,fmt,argp); return ret; } static const char*lua_pushfstring(lua_State*L,const char*fmt,...){ const char*ret; va_list argp; luaC_checkGC(L); va_start(argp,fmt); ret=luaO_pushvfstring(L,fmt,argp); va_end(argp); return ret; } static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){ Closure*cl; luaC_checkGC(L); api_checknelems(L,n); cl=luaF_newCclosure(L,n,getcurrenv(L)); cl->c.f=fn; L->top-=n; while(n--) setobj(L,&cl->c.upvalue[n],L->top+n); setclvalue(L,L->top,cl); api_incr_top(L); } static void lua_pushboolean(lua_State*L,int b){ setbvalue(L->top,(b!=0)); api_incr_top(L); } static int lua_pushthread(lua_State*L){ setthvalue(L,L->top,L); api_incr_top(L); return(G(L)->mainthread==L); } static void lua_gettable(lua_State*L,int idx){ StkId t; t=index2adr(L,idx); api_checkvalidindex(L,t); luaV_gettable(L,t,L->top-1,L->top-1); } static void lua_getfield(lua_State*L,int idx,const char*k){ StkId t; TValue key; t=index2adr(L,idx); api_checkvalidindex(L,t); setsvalue(L,&key,luaS_new(L,k)); luaV_gettable(L,t,&key,L->top); api_incr_top(L); } static void lua_rawget(lua_State*L,int idx){ StkId t; t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1)); } static void lua_rawgeti(lua_State*L,int idx,int n){ StkId o; o=index2adr(L,idx); luai_apicheck(L,ttistable(o)); setobj(L,L->top,luaH_getnum(hvalue(o),n)); api_incr_top(L); } static void lua_createtable(lua_State*L,int narray,int nrec){ luaC_checkGC(L); sethvalue(L,L->top,luaH_new(L,narray,nrec)); api_incr_top(L); } static int lua_getmetatable(lua_State*L,int objindex){ const TValue*obj; Table*mt=NULL; int res; obj=index2adr(L,objindex); switch(ttype(obj)){ case 5: mt=hvalue(obj)->metatable; break; case 7: mt=uvalue(obj)->metatable; break; default: mt=G(L)->mt[ttype(obj)]; break; } if(mt==NULL) res=0; else{ sethvalue(L,L->top,mt); api_incr_top(L); res=1; } return res; } static void lua_getfenv(lua_State*L,int idx){ StkId o; o=index2adr(L,idx); api_checkvalidindex(L,o); switch(ttype(o)){ case 6: sethvalue(L,L->top,clvalue(o)->c.env); break; case 7: sethvalue(L,L->top,uvalue(o)->env); break; case 8: setobj(L,L->top,gt(thvalue(o))); break; default: setnilvalue(L->top); break; } api_incr_top(L); } static void lua_settable(lua_State*L,int idx){ StkId t; api_checknelems(L,2); t=index2adr(L,idx); api_checkvalidindex(L,t); luaV_settable(L,t,L->top-2,L->top-1); L->top-=2; } static void lua_setfield(lua_State*L,int idx,const char*k){ StkId t; TValue key; api_checknelems(L,1); t=index2adr(L,idx); api_checkvalidindex(L,t); setsvalue(L,&key,luaS_new(L,k)); luaV_settable(L,t,&key,L->top-1); L->top--; } static void lua_rawset(lua_State*L,int idx){ StkId t; api_checknelems(L,2); t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1); luaC_barriert(L,hvalue(t),L->top-1); L->top-=2; } static void lua_rawseti(lua_State*L,int idx,int n){ StkId o; api_checknelems(L,1); o=index2adr(L,idx); luai_apicheck(L,ttistable(o)); setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1); luaC_barriert(L,hvalue(o),L->top-1); L->top--; } static int lua_setmetatable(lua_State*L,int objindex){ TValue*obj; Table*mt; api_checknelems(L,1); obj=index2adr(L,objindex); api_checkvalidindex(L,obj); if(ttisnil(L->top-1)) mt=NULL; else{ luai_apicheck(L,ttistable(L->top-1)); mt=hvalue(L->top-1); } switch(ttype(obj)){ case 5:{ hvalue(obj)->metatable=mt; if(mt) luaC_objbarriert(L,hvalue(obj),mt); break; } case 7:{ uvalue(obj)->metatable=mt; if(mt) luaC_objbarrier(L,rawuvalue(obj),mt); break; } default:{ G(L)->mt[ttype(obj)]=mt; break; } } L->top--; return 1; } static int lua_setfenv(lua_State*L,int idx){ StkId o; int res=1; api_checknelems(L,1); o=index2adr(L,idx); api_checkvalidindex(L,o); luai_apicheck(L,ttistable(L->top-1)); switch(ttype(o)){ case 6: clvalue(o)->c.env=hvalue(L->top-1); break; case 7: uvalue(o)->env=hvalue(L->top-1); break; case 8: sethvalue(L,gt(thvalue(o)),hvalue(L->top-1)); break; default: res=0; break; } if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1)); L->top--; return res; } #define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;} #define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na))) static void lua_call(lua_State*L,int nargs,int nresults){ StkId func; api_checknelems(L,nargs+1); checkresults(L,nargs,nresults); func=L->top-(nargs+1); luaD_call(L,func,nresults); adjustresults(L,nresults); } struct CallS{ StkId func; int nresults; }; static void f_call(lua_State*L,void*ud){ struct CallS*c=cast(struct CallS*,ud); luaD_call(L,c->func,c->nresults); } static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){ struct CallS c; int status; ptrdiff_t func; api_checknelems(L,nargs+1); checkresults(L,nargs,nresults); if(errfunc==0) func=0; else{ StkId o=index2adr(L,errfunc); api_checkvalidindex(L,o); func=savestack(L,o); } c.func=L->top-(nargs+1); c.nresults=nresults; status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func); adjustresults(L,nresults); return status; } static int lua_load(lua_State*L,lua_Reader reader,void*data, const char*chunkname){ ZIO z; int status; if(!chunkname)chunkname="?"; luaZ_init(L,&z,reader,data); status=luaD_protectedparser(L,&z,chunkname); return status; } static int lua_error(lua_State*L){ api_checknelems(L,1); luaG_errormsg(L); return 0; } static int lua_next(lua_State*L,int idx){ StkId t; int more; t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); more=luaH_next(L,hvalue(t),L->top-1); if(more){ api_incr_top(L); } else L->top-=1; return more; } static void lua_concat(lua_State*L,int n){ api_checknelems(L,n); if(n>=2){ luaC_checkGC(L); luaV_concat(L,n,cast_int(L->top-L->base)-1); L->top-=(n-1); } else if(n==0){ setsvalue(L,L->top,luaS_newlstr(L,"",0)); api_incr_top(L); } } static void*lua_newuserdata(lua_State*L,size_t size){ Udata*u; luaC_checkGC(L); u=luaS_newudata(L,size,getcurrenv(L)); setuvalue(L,L->top,u); api_incr_top(L); return u+1; } #define luaL_getn(L,i)((int)lua_objlen(L,i)) #define luaL_setn(L,i,j)((void)0) typedef struct luaL_Reg{ const char*name; lua_CFunction func; }luaL_Reg; static void luaI_openlib(lua_State*L,const char*libname, const luaL_Reg*l,int nup); static int luaL_argerror(lua_State*L,int numarg,const char*extramsg); static const char* luaL_checklstring(lua_State*L,int numArg, size_t*l); static const char* luaL_optlstring(lua_State*L,int numArg, const char*def,size_t*l); static lua_Integer luaL_checkinteger(lua_State*L,int numArg); static lua_Integer luaL_optinteger(lua_State*L,int nArg, lua_Integer def); static int luaL_error(lua_State*L,const char*fmt,...); static const char* luaL_findtable(lua_State*L,int idx, const char*fname,int szhint); #define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg)))) #define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL)) #define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL)) #define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n))) #define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d))) #define luaL_typename(L,i)lua_typename(L,lua_type(L,(i))) #define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n))) #define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n))) typedef struct luaL_Buffer{ char*p; int lvl; lua_State*L; char buffer[BUFSIZ]; }luaL_Buffer; #define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c))) #define luaL_addsize(B,n)((B)->p+=(n)) static char* luaL_prepbuffer(luaL_Buffer*B); static int luaL_argerror(lua_State*L,int narg,const char*extramsg){ lua_Debug ar; if(!lua_getstack(L,0,&ar)) return luaL_error(L,"bad argument #%d (%s)",narg,extramsg); lua_getinfo(L,"n",&ar); if(strcmp(ar.namewhat,"method")==0){ narg--; if(narg==0) return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)", ar.name,extramsg); } if(ar.name==NULL) ar.name="?"; return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)", narg,ar.name,extramsg); } static int luaL_typerror(lua_State*L,int narg,const char*tname){ const char*msg=lua_pushfstring(L,"%s expected, got %s", tname,luaL_typename(L,narg)); return luaL_argerror(L,narg,msg); } static void tag_error(lua_State*L,int narg,int tag){ luaL_typerror(L,narg,lua_typename(L,tag)); } static void luaL_where(lua_State*L,int level){ lua_Debug ar; if(lua_getstack(L,level,&ar)){ lua_getinfo(L,"Sl",&ar); if(ar.currentline>0){ lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline); return; } } lua_pushliteral(L,""); } static int luaL_error(lua_State*L,const char*fmt,...){ va_list argp; va_start(argp,fmt); luaL_where(L,1); lua_pushvfstring(L,fmt,argp); va_end(argp); lua_concat(L,2); return lua_error(L); } static int luaL_newmetatable(lua_State*L,const char*tname){ lua_getfield(L,(-10000),tname); if(!lua_isnil(L,-1)) return 0; lua_pop(L,1); lua_newtable(L); lua_pushvalue(L,-1); lua_setfield(L,(-10000),tname); return 1; } static void*luaL_checkudata(lua_State*L,int ud,const char*tname){ void*p=lua_touserdata(L,ud); if(p!=NULL){ if(lua_getmetatable(L,ud)){ lua_getfield(L,(-10000),tname); if(lua_rawequal(L,-1,-2)){ lua_pop(L,2); return p; } } } luaL_typerror(L,ud,tname); return NULL; } static void luaL_checkstack(lua_State*L,int space,const char*mes){ if(!lua_checkstack(L,space)) luaL_error(L,"stack overflow (%s)",mes); } static void luaL_checktype(lua_State*L,int narg,int t){ if(lua_type(L,narg)!=t) tag_error(L,narg,t); } static void luaL_checkany(lua_State*L,int narg){ if(lua_type(L,narg)==(-1)) luaL_argerror(L,narg,"value expected"); } static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){ const char*s=lua_tolstring(L,narg,len); if(!s)tag_error(L,narg,4); return s; } static const char*luaL_optlstring(lua_State*L,int narg, const char*def,size_t*len){ if(lua_isnoneornil(L,narg)){ if(len) *len=(def?strlen(def):0); return def; } else return luaL_checklstring(L,narg,len); } static lua_Number luaL_checknumber(lua_State*L,int narg){ lua_Number d=lua_tonumber(L,narg); if(d==0&&!lua_isnumber(L,narg)) tag_error(L,narg,3); return d; } static lua_Integer luaL_checkinteger(lua_State*L,int narg){ lua_Integer d=lua_tointeger(L,narg); if(d==0&&!lua_isnumber(L,narg)) tag_error(L,narg,3); return d; } static lua_Integer luaL_optinteger(lua_State*L,int narg, lua_Integer def){ return luaL_opt(L,luaL_checkinteger,narg,def); } static int luaL_getmetafield(lua_State*L,int obj,const char*event){ if(!lua_getmetatable(L,obj)) return 0; lua_pushstring(L,event); lua_rawget(L,-2); if(lua_isnil(L,-1)){ lua_pop(L,2); return 0; } else{ lua_remove(L,-2); return 1; } } static void luaL_register(lua_State*L,const char*libname, const luaL_Reg*l){ luaI_openlib(L,libname,l,0); } static int libsize(const luaL_Reg*l){ int size=0; for(;l->name;l++)size++; return size; } static void luaI_openlib(lua_State*L,const char*libname, const luaL_Reg*l,int nup){ if(libname){ int size=libsize(l); luaL_findtable(L,(-10000),"_LOADED",1); lua_getfield(L,-1,libname); if(!lua_istable(L,-1)){ lua_pop(L,1); if(luaL_findtable(L,(-10002),libname,size)!=NULL) luaL_error(L,"name conflict for module "LUA_QL("%s"),libname); lua_pushvalue(L,-1); lua_setfield(L,-3,libname); } lua_remove(L,-2); lua_insert(L,-(nup+1)); } for(;l->name;l++){ int i; for(i=0;ifunc,nup); lua_setfield(L,-(nup+2),l->name); } lua_pop(L,nup); } static const char*luaL_findtable(lua_State*L,int idx, const char*fname,int szhint){ const char*e; lua_pushvalue(L,idx); do{ e=strchr(fname,'.'); if(e==NULL)e=fname+strlen(fname); lua_pushlstring(L,fname,e-fname); lua_rawget(L,-2); if(lua_isnil(L,-1)){ lua_pop(L,1); lua_createtable(L,0,(*e=='.'?1:szhint)); lua_pushlstring(L,fname,e-fname); lua_pushvalue(L,-2); lua_settable(L,-4); } else if(!lua_istable(L,-1)){ lua_pop(L,2); return fname; } lua_remove(L,-2); fname=e+1; }while(*e=='.'); return NULL; } #define bufflen(B)((B)->p-(B)->buffer) #define bufffree(B)((size_t)(BUFSIZ-bufflen(B))) static int emptybuffer(luaL_Buffer*B){ size_t l=bufflen(B); if(l==0)return 0; else{ lua_pushlstring(B->L,B->buffer,l); B->p=B->buffer; B->lvl++; return 1; } } static void adjuststack(luaL_Buffer*B){ if(B->lvl>1){ lua_State*L=B->L; int toget=1; size_t toplen=lua_strlen(L,-1); do{ size_t l=lua_strlen(L,-(toget+1)); if(B->lvl-toget+1>=(20/2)||toplen>l){ toplen+=l; toget++; } else break; }while(togetlvl); lua_concat(L,toget); B->lvl=B->lvl-toget+1; } } static char*luaL_prepbuffer(luaL_Buffer*B){ if(emptybuffer(B)) adjuststack(B); return B->buffer; } static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){ while(l--) luaL_addchar(B,*s++); } static void luaL_pushresult(luaL_Buffer*B){ emptybuffer(B); lua_concat(B->L,B->lvl); B->lvl=1; } static void luaL_addvalue(luaL_Buffer*B){ lua_State*L=B->L; size_t vl; const char*s=lua_tolstring(L,-1,&vl); if(vl<=bufffree(B)){ memcpy(B->p,s,vl); B->p+=vl; lua_pop(L,1); } else{ if(emptybuffer(B)) lua_insert(L,-2); B->lvl++; adjuststack(B); } } static void luaL_buffinit(lua_State*L,luaL_Buffer*B){ B->L=L; B->p=B->buffer; B->lvl=0; } typedef struct LoadF{ int extraline; FILE*f; char buff[BUFSIZ]; }LoadF; static const char*getF(lua_State*L,void*ud,size_t*size){ LoadF*lf=(LoadF*)ud; (void)L; if(lf->extraline){ lf->extraline=0; *size=1; return"\n"; } if(feof(lf->f))return NULL; *size=fread(lf->buff,1,sizeof(lf->buff),lf->f); return(*size>0)?lf->buff:NULL; } static int errfile(lua_State*L,const char*what,int fnameindex){ const char*serr=strerror(errno); const char*filename=lua_tostring(L,fnameindex)+1; lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr); lua_remove(L,fnameindex); return(5+1); } static int luaL_loadfile(lua_State*L,const char*filename){ LoadF lf; int status,readstatus; int c; int fnameindex=lua_gettop(L)+1; lf.extraline=0; if(filename==NULL){ lua_pushliteral(L,"=stdin"); lf.f=stdin; } else{ lua_pushfstring(L,"@%s",filename); lf.f=fopen(filename,"r"); if(lf.f==NULL)return errfile(L,"open",fnameindex); } c=getc(lf.f); if(c=='#'){ lf.extraline=1; while((c=getc(lf.f))!=EOF&&c!='\n'); if(c=='\n')c=getc(lf.f); } if(c=="\033Lua"[0]&&filename){ lf.f=freopen(filename,"rb",lf.f); if(lf.f==NULL)return errfile(L,"reopen",fnameindex); while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]); lf.extraline=0; } ungetc(c,lf.f); status=lua_load(L,getF,&lf,lua_tostring(L,-1)); readstatus=ferror(lf.f); if(filename)fclose(lf.f); if(readstatus){ lua_settop(L,fnameindex); return errfile(L,"read",fnameindex); } lua_remove(L,fnameindex); return status; } typedef struct LoadS{ const char*s; size_t size; }LoadS; static const char*getS(lua_State*L,void*ud,size_t*size){ LoadS*ls=(LoadS*)ud; (void)L; if(ls->size==0)return NULL; *size=ls->size; ls->size=0; return ls->s; } static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size, const char*name){ LoadS ls; ls.s=buff; ls.size=size; return lua_load(L,getS,&ls,name); } static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){ (void)ud; (void)osize; if(nsize==0){ free(ptr); return NULL; } else return realloc(ptr,nsize); } static int panic(lua_State*L){ (void)L; fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n", lua_tostring(L,-1)); return 0; } static lua_State*luaL_newstate(void){ lua_State*L=lua_newstate(l_alloc,NULL); if(L)lua_atpanic(L,&panic); return L; } static int luaB_tonumber(lua_State*L){ int base=luaL_optint(L,2,10); if(base==10){ luaL_checkany(L,1); if(lua_isnumber(L,1)){ lua_pushnumber(L,lua_tonumber(L,1)); return 1; } } else{ const char*s1=luaL_checkstring(L,1); char*s2; unsigned long n; luaL_argcheck(L,2<=base&&base<=36,2,"base out of range"); n=strtoul(s1,&s2,base); if(s1!=s2){ while(isspace((unsigned char)(*s2)))s2++; if(*s2=='\0'){ lua_pushnumber(L,(lua_Number)n); return 1; } } } lua_pushnil(L); return 1; } static int luaB_error(lua_State*L){ int level=luaL_optint(L,2,1); lua_settop(L,1); if(lua_isstring(L,1)&&level>0){ luaL_where(L,level); lua_pushvalue(L,1); lua_concat(L,2); } return lua_error(L); } static int luaB_setmetatable(lua_State*L){ int t=lua_type(L,2); luaL_checktype(L,1,5); luaL_argcheck(L,t==0||t==5,2, "nil or table expected"); if(luaL_getmetafield(L,1,"__metatable")) luaL_error(L,"cannot change a protected metatable"); lua_settop(L,2); lua_setmetatable(L,1); return 1; } static void getfunc(lua_State*L,int opt){ if(lua_isfunction(L,1))lua_pushvalue(L,1); else{ lua_Debug ar; int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1); luaL_argcheck(L,level>=0,1,"level must be non-negative"); if(lua_getstack(L,level,&ar)==0) luaL_argerror(L,1,"invalid level"); lua_getinfo(L,"f",&ar); if(lua_isnil(L,-1)) luaL_error(L,"no function environment for tail call at level %d", level); } } static int luaB_setfenv(lua_State*L){ luaL_checktype(L,2,5); getfunc(L,0); lua_pushvalue(L,2); if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){ lua_pushthread(L); lua_insert(L,-2); lua_setfenv(L,-2); return 0; } else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0) luaL_error(L, LUA_QL("setfenv")" cannot change environment of given object"); return 1; } static int luaB_rawget(lua_State*L){ luaL_checktype(L,1,5); luaL_checkany(L,2); lua_settop(L,2); lua_rawget(L,1); return 1; } static int luaB_type(lua_State*L){ luaL_checkany(L,1); lua_pushstring(L,luaL_typename(L,1)); return 1; } static int luaB_next(lua_State*L){ luaL_checktype(L,1,5); lua_settop(L,2); if(lua_next(L,1)) return 2; else{ lua_pushnil(L); return 1; } } static int luaB_pairs(lua_State*L){ luaL_checktype(L,1,5); lua_pushvalue(L,lua_upvalueindex(1)); lua_pushvalue(L,1); lua_pushnil(L); return 3; } static int ipairsaux(lua_State*L){ int i=luaL_checkint(L,2); luaL_checktype(L,1,5); i++; lua_pushinteger(L,i); lua_rawgeti(L,1,i); return(lua_isnil(L,-1))?0:2; } static int luaB_ipairs(lua_State*L){ luaL_checktype(L,1,5); lua_pushvalue(L,lua_upvalueindex(1)); lua_pushvalue(L,1); lua_pushinteger(L,0); return 3; } static int load_aux(lua_State*L,int status){ if(status==0) return 1; else{ lua_pushnil(L); lua_insert(L,-2); return 2; } } static int luaB_loadstring(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); const char*chunkname=luaL_optstring(L,2,s); return load_aux(L,luaL_loadbuffer(L,s,l,chunkname)); } static int luaB_loadfile(lua_State*L){ const char*fname=luaL_optstring(L,1,NULL); return load_aux(L,luaL_loadfile(L,fname)); } static int luaB_assert(lua_State*L){ luaL_checkany(L,1); if(!lua_toboolean(L,1)) return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!")); return lua_gettop(L); } static int luaB_unpack(lua_State*L){ int i,e,n; luaL_checktype(L,1,5); i=luaL_optint(L,2,1); e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1)); if(i>e)return 0; n=e-i+1; if(n<=0||!lua_checkstack(L,n)) return luaL_error(L,"too many results to unpack"); lua_rawgeti(L,1,i); while(i++e)e=pos; for(i=e;i>pos;i--){ lua_rawgeti(L,1,i-1); lua_rawseti(L,1,i); } break; } default:{ return luaL_error(L,"wrong number of arguments to "LUA_QL("insert")); } } luaL_setn(L,1,e); lua_rawseti(L,1,pos); return 0; } static int tremove(lua_State*L){ int e=aux_getn(L,1); int pos=luaL_optint(L,2,e); if(!(1<=pos&&pos<=e)) return 0; luaL_setn(L,1,e-1); lua_rawgeti(L,1,pos); for(;posu)luaL_error(L,"invalid order function for sorting"); lua_pop(L,1); } while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){ if(j0); } l=strlen(p); if(l==0||p[l-1]!='\n') luaL_addsize(&b,l); else{ luaL_addsize(&b,l-1); luaL_pushresult(&b); return 1; } } } static int read_chars(lua_State*L,FILE*f,size_t n){ size_t rlen; size_t nr; luaL_Buffer b; luaL_buffinit(L,&b); rlen=BUFSIZ; do{ char*p=luaL_prepbuffer(&b); if(rlen>n)rlen=n; nr=fread(p,sizeof(char),rlen,f); luaL_addsize(&b,nr); n-=nr; }while(n>0&&nr==rlen); luaL_pushresult(&b); return(n==0||lua_objlen(L,-1)>0); } static int g_read(lua_State*L,FILE*f,int first){ int nargs=lua_gettop(L)-1; int success; int n; clearerr(f); if(nargs==0){ success=read_line(L,f); n=first+1; } else{ luaL_checkstack(L,nargs+20,"too many arguments"); success=1; for(n=first;nargs--&&success;n++){ if(lua_type(L,n)==3){ size_t l=(size_t)lua_tointeger(L,n); success=(l==0)?test_eof(L,f):read_chars(L,f,l); } else{ const char*p=lua_tostring(L,n); luaL_argcheck(L,p&&p[0]=='*',n,"invalid option"); switch(p[1]){ case'n': success=read_number(L,f); break; case'l': success=read_line(L,f); break; case'a': read_chars(L,f,~((size_t)0)); success=1; break; default: return luaL_argerror(L,n,"invalid format"); } } } } if(ferror(f)) return pushresult(L,0,NULL); if(!success){ lua_pop(L,1); lua_pushnil(L); } return n-first; } static int io_read(lua_State*L){ return g_read(L,getiofile(L,1),1); } static int f_read(lua_State*L){ return g_read(L,tofile(L),2); } static int io_readline(lua_State*L){ FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1)); int sucess; if(f==NULL) luaL_error(L,"file is already closed"); sucess=read_line(L,f); if(ferror(f)) return luaL_error(L,"%s",strerror(errno)); if(sucess)return 1; else{ if(lua_toboolean(L,lua_upvalueindex(2))){ lua_settop(L,0); lua_pushvalue(L,lua_upvalueindex(1)); aux_close(L); } return 0; } } static int g_write(lua_State*L,FILE*f,int arg){ int nargs=lua_gettop(L)-1; int status=1; for(;nargs--;arg++){ if(lua_type(L,arg)==3){ status=status&& fprintf(f,"%.14g",lua_tonumber(L,arg))>0; } else{ size_t l; const char*s=luaL_checklstring(L,arg,&l); status=status&&(fwrite(s,sizeof(char),l,f)==l); } } return pushresult(L,status,NULL); } static int io_write(lua_State*L){ return g_write(L,getiofile(L,2),1); } static int f_write(lua_State*L){ return g_write(L,tofile(L),2); } static int io_flush(lua_State*L){ return pushresult(L,fflush(getiofile(L,2))==0,NULL); } static int f_flush(lua_State*L){ return pushresult(L,fflush(tofile(L))==0,NULL); } static const luaL_Reg iolib[]={ {"close",io_close}, {"flush",io_flush}, {"input",io_input}, {"lines",io_lines}, {"open",io_open}, {"output",io_output}, {"read",io_read}, {"type",io_type}, {"write",io_write}, {NULL,NULL} }; static const luaL_Reg flib[]={ {"close",io_close}, {"flush",f_flush}, {"lines",f_lines}, {"read",f_read}, {"write",f_write}, {"__gc",io_gc}, {NULL,NULL} }; static void createmeta(lua_State*L){ luaL_newmetatable(L,"FILE*"); lua_pushvalue(L,-1); lua_setfield(L,-2,"__index"); luaL_register(L,NULL,flib); } static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){ *newfile(L)=f; if(k>0){ lua_pushvalue(L,-1); lua_rawseti(L,(-10001),k); } lua_pushvalue(L,-2); lua_setfenv(L,-2); lua_setfield(L,-3,fname); } static void newfenv(lua_State*L,lua_CFunction cls){ lua_createtable(L,0,1); lua_pushcfunction(L,cls); lua_setfield(L,-2,"__close"); } static int luaopen_io(lua_State*L){ createmeta(L); newfenv(L,io_fclose); lua_replace(L,(-10001)); luaL_register(L,"io",iolib); newfenv(L,io_noclose); createstdfile(L,stdin,1,"stdin"); createstdfile(L,stdout,2,"stdout"); createstdfile(L,stderr,0,"stderr"); lua_pop(L,1); lua_getfield(L,-1,"popen"); newfenv(L,io_pclose); lua_setfenv(L,-2); lua_pop(L,1); return 1; } static int os_pushresult(lua_State*L,int i,const char*filename){ int en=errno; if(i){ lua_pushboolean(L,1); return 1; } else{ lua_pushnil(L); lua_pushfstring(L,"%s: %s",filename,strerror(en)); lua_pushinteger(L,en); return 3; } } static int os_remove(lua_State*L){ const char*filename=luaL_checkstring(L,1); return os_pushresult(L,remove(filename)==0,filename); } static int os_exit(lua_State*L){ exit(luaL_optint(L,1,EXIT_SUCCESS)); } static const luaL_Reg syslib[]={ {"exit",os_exit}, {"remove",os_remove}, {NULL,NULL} }; static int luaopen_os(lua_State*L){ luaL_register(L,"os",syslib); return 1; } #define uchar(c)((unsigned char)(c)) static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){ if(pos<0)pos+=(ptrdiff_t)len+1; return(pos>=0)?pos:0; } static int str_sub(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l); ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l); if(start<1)start=1; if(end>(ptrdiff_t)l)end=(ptrdiff_t)l; if(start<=end) lua_pushlstring(L,s+start-1,end-start+1); else lua_pushliteral(L,""); return 1; } static int str_lower(lua_State*L){ size_t l; size_t i; luaL_Buffer b; const char*s=luaL_checklstring(L,1,&l); luaL_buffinit(L,&b); for(i=0;i0) luaL_addlstring(&b,s,l); luaL_pushresult(&b); return 1; } static int str_byte(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l); ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l); int n,i; if(posi<=0)posi=1; if((size_t)pose>l)pose=l; if(posi>pose)return 0; n=(int)(pose-posi+1); if(posi+n<=pose) luaL_error(L,"string slice too long"); luaL_checkstack(L,n,"string slice too long"); for(i=0;i=ms->level||ms->capture[l].len==(-1)) return luaL_error(ms->L,"invalid capture index"); return l; } static int capture_to_close(MatchState*ms){ int level=ms->level; for(level--;level>=0;level--) if(ms->capture[level].len==(-1))return level; return luaL_error(ms->L,"invalid pattern capture"); } static const char*classend(MatchState*ms,const char*p){ switch(*p++){ case'%':{ if(*p=='\0') luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")"); return p+1; } case'[':{ if(*p=='^')p++; do{ if(*p=='\0') luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")"); if(*(p++)=='%'&&*p!='\0') p++; }while(*p!=']'); return p+1; } default:{ return p; } } } static int match_class(int c,int cl){ int res; switch(tolower(cl)){ case'a':res=isalpha(c);break; case'c':res=iscntrl(c);break; case'd':res=isdigit(c);break; case'l':res=islower(c);break; case'p':res=ispunct(c);break; case's':res=isspace(c);break; case'u':res=isupper(c);break; case'w':res=isalnum(c);break; case'x':res=isxdigit(c);break; case'z':res=(c==0);break; default:return(cl==c); } return(islower(cl)?res:!res); } static int matchbracketclass(int c,const char*p,const char*ec){ int sig=1; if(*(p+1)=='^'){ sig=0; p++; } while(++pL,"unbalanced pattern"); if(*s!=*p)return NULL; else{ int b=*p; int e=*(p+1); int cont=1; while(++ssrc_end){ if(*s==e){ if(--cont==0)return s+1; } else if(*s==b)cont++; } } return NULL; } static const char*max_expand(MatchState*ms,const char*s, const char*p,const char*ep){ ptrdiff_t i=0; while((s+i)src_end&&singlematch(uchar(*(s+i)),p,ep)) i++; while(i>=0){ const char*res=match(ms,(s+i),ep+1); if(res)return res; i--; } return NULL; } static const char*min_expand(MatchState*ms,const char*s, const char*p,const char*ep){ for(;;){ const char*res=match(ms,s,ep+1); if(res!=NULL) return res; else if(ssrc_end&&singlematch(uchar(*s),p,ep)) s++; else return NULL; } } static const char*start_capture(MatchState*ms,const char*s, const char*p,int what){ const char*res; int level=ms->level; if(level>=32)luaL_error(ms->L,"too many captures"); ms->capture[level].init=s; ms->capture[level].len=what; ms->level=level+1; if((res=match(ms,s,p))==NULL) ms->level--; return res; } static const char*end_capture(MatchState*ms,const char*s, const char*p){ int l=capture_to_close(ms); const char*res; ms->capture[l].len=s-ms->capture[l].init; if((res=match(ms,s,p))==NULL) ms->capture[l].len=(-1); return res; } static const char*match_capture(MatchState*ms,const char*s,int l){ size_t len; l=check_capture(ms,l); len=ms->capture[l].len; if((size_t)(ms->src_end-s)>=len&& memcmp(ms->capture[l].init,s,len)==0) return s+len; else return NULL; } static const char*match(MatchState*ms,const char*s,const char*p){ init: switch(*p){ case'(':{ if(*(p+1)==')') return start_capture(ms,s,p+2,(-2)); else return start_capture(ms,s,p+1,(-1)); } case')':{ return end_capture(ms,s,p+1); } case'%':{ switch(*(p+1)){ case'b':{ s=matchbalance(ms,s,p+2); if(s==NULL)return NULL; p+=4;goto init; } case'f':{ const char*ep;char previous; p+=2; if(*p!='[') luaL_error(ms->L,"missing "LUA_QL("[")" after " LUA_QL("%%f")" in pattern"); ep=classend(ms,p); previous=(s==ms->src_init)?'\0':*(s-1); if(matchbracketclass(uchar(previous),p,ep-1)|| !matchbracketclass(uchar(*s),p,ep-1))return NULL; p=ep;goto init; } default:{ if(isdigit(uchar(*(p+1)))){ s=match_capture(ms,s,uchar(*(p+1))); if(s==NULL)return NULL; p+=2;goto init; } goto dflt; } } } case'\0':{ return s; } case'$':{ if(*(p+1)=='\0') return(s==ms->src_end)?s:NULL; else goto dflt; } default:dflt:{ const char*ep=classend(ms,p); int m=ssrc_end&&singlematch(uchar(*s),p,ep); switch(*ep){ case'?':{ const char*res; if(m&&((res=match(ms,s+1,ep+1))!=NULL)) return res; p=ep+1;goto init; } case'*':{ return max_expand(ms,s,p,ep); } case'+':{ return(m?max_expand(ms,s+1,p,ep):NULL); } case'-':{ return min_expand(ms,s,p,ep); } default:{ if(!m)return NULL; s++;p=ep;goto init; } } } } } static const char*lmemfind(const char*s1,size_t l1, const char*s2,size_t l2){ if(l2==0)return s1; else if(l2>l1)return NULL; else{ const char*init; l2--; l1=l1-l2; while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){ init++; if(memcmp(init,s2+1,l2)==0) return init-1; else{ l1-=init-s1; s1=init; } } return NULL; } } static void push_onecapture(MatchState*ms,int i,const char*s, const char*e){ if(i>=ms->level){ if(i==0) lua_pushlstring(ms->L,s,e-s); else luaL_error(ms->L,"invalid capture index"); } else{ ptrdiff_t l=ms->capture[i].len; if(l==(-1))luaL_error(ms->L,"unfinished capture"); if(l==(-2)) lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1); else lua_pushlstring(ms->L,ms->capture[i].init,l); } } static int push_captures(MatchState*ms,const char*s,const char*e){ int i; int nlevels=(ms->level==0&&s)?1:ms->level; luaL_checkstack(ms->L,nlevels,"too many captures"); for(i=0;il1)init=(ptrdiff_t)l1; if(find&&(lua_toboolean(L,4)|| strpbrk(p,"^$*+?.([%-")==NULL)){ const char*s2=lmemfind(s+init,l1-init,p,l2); if(s2){ lua_pushinteger(L,s2-s+1); lua_pushinteger(L,s2-s+l2); return 2; } } else{ MatchState ms; int anchor=(*p=='^')?(p++,1):0; const char*s1=s+init; ms.L=L; ms.src_init=s; ms.src_end=s+l1; do{ const char*res; ms.level=0; if((res=match(&ms,s1,p))!=NULL){ if(find){ lua_pushinteger(L,s1-s+1); lua_pushinteger(L,res-s); return push_captures(&ms,NULL,0)+2; } else return push_captures(&ms,s1,res); } }while(s1++L,3,&l); for(i=0;iL; switch(lua_type(L,3)){ case 3: case 4:{ add_s(ms,b,s,e); return; } case 6:{ int n; lua_pushvalue(L,3); n=push_captures(ms,s,e); lua_call(L,n,1); break; } case 5:{ push_onecapture(ms,0,s,e); lua_gettable(L,3); break; } } if(!lua_toboolean(L,-1)){ lua_pop(L,1); lua_pushlstring(L,s,e-s); } else if(!lua_isstring(L,-1)) luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1)); luaL_addvalue(b); } static int str_gsub(lua_State*L){ size_t srcl; const char*src=luaL_checklstring(L,1,&srcl); const char*p=luaL_checkstring(L,2); int tr=lua_type(L,3); int max_s=luaL_optint(L,4,srcl+1); int anchor=(*p=='^')?(p++,1):0; int n=0; MatchState ms; luaL_Buffer b; luaL_argcheck(L,tr==3||tr==4|| tr==6||tr==5,3, "string/function/table expected"); luaL_buffinit(L,&b); ms.L=L; ms.src_init=src; ms.src_end=src+srcl; while(nsrc) src=e; else if(src=sizeof("-+ #0")) luaL_error(L,"invalid format (repeated flags)"); if(isdigit(uchar(*p)))p++; if(isdigit(uchar(*p)))p++; if(*p=='.'){ p++; if(isdigit(uchar(*p)))p++; if(isdigit(uchar(*p)))p++; } if(isdigit(uchar(*p))) luaL_error(L,"invalid format (width or precision too long)"); *(form++)='%'; strncpy(form,strfrmt,p-strfrmt+1); form+=p-strfrmt+1; *form='\0'; return p; } static void addintlen(char*form){ size_t l=strlen(form); char spec=form[l-1]; strcpy(form+l-1,"l"); form[l+sizeof("l")-2]=spec; form[l+sizeof("l")-1]='\0'; } static int str_format(lua_State*L){ int top=lua_gettop(L); int arg=1; size_t sfl; const char*strfrmt=luaL_checklstring(L,arg,&sfl); const char*strfrmt_end=strfrmt+sfl; luaL_Buffer b; luaL_buffinit(L,&b); while(strfrmttop) luaL_argerror(L,arg,"no value"); strfrmt=scanformat(L,strfrmt,form); switch(*strfrmt++){ case'c':{ sprintf(buff,form,(int)luaL_checknumber(L,arg)); break; } case'd':case'i':{ addintlen(form); sprintf(buff,form,(long)luaL_checknumber(L,arg)); break; } case'o':case'u':case'x':case'X':{ addintlen(form); sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg)); break; } case'e':case'E':case'f': case'g':case'G':{ sprintf(buff,form,(double)luaL_checknumber(L,arg)); break; } case'q':{ addquoted(L,&b,arg); continue; } case's':{ size_t l; const char*s=luaL_checklstring(L,arg,&l); if(!strchr(form,'.')&&l>=100){ lua_pushvalue(L,arg); luaL_addvalue(&b); continue; } else{ sprintf(buff,form,s); break; } } default:{ return luaL_error(L,"invalid option "LUA_QL("%%%c")" to " LUA_QL("format"),*(strfrmt-1)); } } luaL_addlstring(&b,buff,strlen(buff)); } } luaL_pushresult(&b); return 1; } static const luaL_Reg strlib[]={ {"byte",str_byte}, {"char",str_char}, {"find",str_find}, {"format",str_format}, {"gmatch",gmatch}, {"gsub",str_gsub}, {"lower",str_lower}, {"match",str_match}, {"rep",str_rep}, {"sub",str_sub}, {"upper",str_upper}, {NULL,NULL} }; static void createmetatable(lua_State*L){ lua_createtable(L,0,1); lua_pushliteral(L,""); lua_pushvalue(L,-2); lua_setmetatable(L,-2); lua_pop(L,1); lua_pushvalue(L,-2); lua_setfield(L,-2,"__index"); lua_pop(L,1); } static int luaopen_string(lua_State*L){ luaL_register(L,"string",strlib); createmetatable(L); return 1; } static const luaL_Reg lualibs[]={ {"",luaopen_base}, {"table",luaopen_table}, {"io",luaopen_io}, {"os",luaopen_os}, {"string",luaopen_string}, {NULL,NULL} }; static void luaL_openlibs(lua_State*L){ const luaL_Reg*lib=lualibs; for(;lib->func;lib++){ lua_pushcfunction(L,lib->func); lua_pushstring(L,lib->name); lua_call(L,1,0); } } typedef unsigned int UB; static UB barg(lua_State*L,int idx){ union{lua_Number n;U64 b;}bn; bn.n=lua_tonumber(L,idx)+6755399441055744.0; if(bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number"); return(UB)bn.b; } #define BRET(b)lua_pushnumber(L,(lua_Number)(int)(b));return 1; static int tobit(lua_State*L){ BRET(barg(L,1))} static int bnot(lua_State*L){ BRET(~barg(L,1))} static int band(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)} static int bor(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)} static int bxor(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)} static int lshift(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET(b<>n)} static int arshift(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)} static int rol(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((b<>(32-n)))} static int ror(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))} static int bswap(lua_State*L){ UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)} static int tohex(lua_State*L){ UB b=barg(L,1); int n=lua_isnone(L,2)?8:(int)barg(L,2); const char*hexdigits="0123456789abcdef"; char buf[8]; int i; if(n<0){n=-n;hexdigits="0123456789ABCDEF";} if(n>8)n=8; for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;} lua_pushlstring(L,buf,(size_t)n); return 1; } static const struct luaL_Reg bitlib[]={ {"tobit",tobit}, {"bnot",bnot}, {"band",band}, {"bor",bor}, {"bxor",bxor}, {"lshift",lshift}, {"rshift",rshift}, {"arshift",arshift}, {"rol",rol}, {"ror",ror}, {"bswap",bswap}, {"tohex",tohex}, {NULL,NULL} }; int main(int argc,char**argv){ lua_State*L=luaL_newstate(); int i; luaL_openlibs(L); luaL_register(L,"bit",bitlib); if(argc<2)return sizeof(void*); lua_createtable(L,0,1); lua_pushstring(L,argv[1]); lua_rawseti(L,-2,0); lua_setglobal(L,"arg"); if(luaL_loadfile(L,argv[1])) goto err; for(i=2;i